logback_1.0.13/0000755000175000017500000000000012203357067013161 5ustar drazzibdrazziblogback_1.0.13/src/0000755000175000017500000000000011506604177013752 5ustar drazzibdrazziblogback_1.0.13/src/main/0000755000175000017500000000000012203357067014674 5ustar drazzibdrazziblogback_1.0.13/src/main/javadocHeaders.xml0000644000175000017500000000063512136042273020320 0ustar drazzibdrazzib /** * */ true false (\s|\t)*/\*.*$ .*\*/(\s|\t)*$ logback_1.0.13/src/main/assembly/0000755000175000017500000000000012203357067016513 5ustar drazzibdrazziblogback_1.0.13/src/main/assembly/dist.xml0000644000175000017500000001340111640310174020167 0ustar drazzibdrazzib dist zip tar.gz logback-core/ logback-core/ pom.xml *.bak logback-classic/ logback-classic/ pom.xml osgi-build.xml integration.xml *.bak logback-access/ logback-access/ pom.xml *.bak logback-examples/ logback-examples/ pom.xml *.bak logback-site/ logback-site/ pom.xml *.bak logback-core/src/ logback-core/src/ test/output/ logback-classic/src/ logback-classic/src/ logback-access/src/ logback-access/src/ logback-examples/src/ logback-examples/src/ main/resources/ logback-site/src/ logback-site/src/ logback-examples/target/ logback-examples/ logback-examples-${project.version}.jar logback-examples/lib/ logback-examples/lib logback-examples/target/classes logback-examples/ setClasspath.sh setClasspath.cmd logback-core/target/ / logback-core-${project.version}.jar logback-classic/target/ / logback-classic-${project.version}.jar logback-access/target/ / logback-access-${project.version}.jar logback-core/target/ / logback-core-${project.version}-sources.jar logback-classic/target/ / logback-classic-${project.version}-sources.jar logback-access/target/ / logback-access-${project.version}-sources.jar target/site docs/ dist/* **/apidocs/** **/testapidocs/** **/xref/** **/xref-test/** src/ README* LICENSE* pom.xml *.bak logback_1.0.13/src/main/licenseHeader.txt0000644000175000017500000000070012136042273020160 0ustar drazzibdrazzibLogback: the reliable, generic, fast and flexible logging framework. Copyright (C) 1999-2013, QOS.ch. All rights reserved. This program and the accompanying materials are dual-licensed under either the terms of the Eclipse Public License v1.0 as published by the Eclipse Foundation or (per the licensee's choosing) under the terms of the GNU Lesser General Public License version 2.1 as published by the Free Software Foundation. logback_1.0.13/src/main/clas/0000755000175000017500000000000012203357067015616 5ustar drazzibdrazziblogback_1.0.13/src/main/clas/signed-clas.txt0000644000175000017500000000621312142476313020550 0ustar drazzibdrazzib Here is a list of persons who have signed a CLA [1]. Name Location Date ---- -------- ---- Maarten Bosteels Heverlee, Belgium 2007-01-15 John E. Conlon WI, USA 2007-02-08 Ralph W. Goers Jr. CA, USA 2008-07-24 Matt Humphreys London, UK 2008-08-16 Thorbjorn Ravn Andersen Hammel, Denmark 2008-08-16 Chad LaVigne MN, USA 2009-03-25 Joern Huxhorn Pfungstadt, Germany 2009-04-29 Thorsten Moeller Basel, Switzerland 2009-11-16 Robert Elliot Twickenham, UK 2010-03-08 Tomasz Nurkiewicz Wegrow, Poland 2010-03-19 Aleksey Didik S.Putilovskay, Russia 2010-03-26 Heiko Seeberger Schondorf , Germany 2010-09-06 Ryan Cogswell MN, USA 2011-07-07 Pierre Queinnec Paris, France 2011-07-20 Anthony Trinh MA, USA 2012-05-10 Torsten Juergeleit Liederbach, Germany 2012-05-13 Cedric Lime Levallois-Perret, FR 2012-06-08 Christian Trutz Mark, Germany 2012-06-14 Les Hazlewood CA, USA 2012-09-10 Libor Jelinek Czech Republic 2012-09-17 Matthew Bishop Vancouver, Canada 2012-09-18 Joris Kuipers Amstelveen, NL 2013-02-11 Andrey Korzhevskiy Skryabina Akademika, Russia 2013-03-26 Carl E. Harris Jr. VA, USA 2013-03-27 Matthew R. Bertolini NJ, USA 2013-04-23 Gregory A. Denton WA, USA 2013-05-02 Justification for CLAs ---------------------- The CLA requirement adds a bureaucratic step before contributions can be accepted. However, the CLA offers several advantages: 1) having a CLA on file for all contributors provides reassurance to downstream users. For example, IP officers from Eclipse foundation contact QOS.ch at regular intervals asking whether QOS.ch has CLA for SLF4J and logback contributions. 2) allows QOS.ch to change the software license as long as the change is not contrary to public interest. This allowed QOS.ch to add Eclipse Public License 1.0 (in addition to LGPL) in logback version 0.9.18. This was undoubtedly a net gain for those wishing to use logback and it was a fairly painless process. Without the CLA on file, dual-licensing logback would have been near impossible. 3) by virtue of clause 3 of the CLA, the contributor vouches for his/her contributions as his/her own. Thus, QOS.ch takes a lesser risk when distributing software because QOS.ch can claim that some vetting has been performed (due diligence). A more detailed discussion of CLAs can be found at [2]. BTW, the CLA can be sent to Ceki directly by email. A scanned copy on two separate pages is fine but please make sure that the images render reasonably well when printed on a laser printer. Images taken by cellphone cameras often render as a large gray smudge when printed. [1] http://logback.qos.ch/cla.txt [2] http://www.oss-watch.ac.uk/resources/cla.xml logback_1.0.13/logback-access/0000755000175000017500000000000012203357067016022 5ustar drazzibdrazziblogback_1.0.13/logback-access/src/0000755000175000017500000000000011506604153016605 5ustar drazzibdrazziblogback_1.0.13/logback-access/src/main/0000755000175000017500000000000011506604152017530 5ustar drazzibdrazziblogback_1.0.13/logback-access/src/main/java/0000755000175000017500000000000011506604152020451 5ustar drazzibdrazziblogback_1.0.13/logback-access/src/main/java/ch/0000755000175000017500000000000011506604152021043 5ustar drazzibdrazziblogback_1.0.13/logback-access/src/main/java/ch/qos/0000755000175000017500000000000011506604152021645 5ustar drazzibdrazziblogback_1.0.13/logback-access/src/main/java/ch/qos/logback/0000755000175000017500000000000011506604152023247 5ustar drazzibdrazziblogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/0000755000175000017500000000000012203357067024515 5ustar drazzibdrazziblogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/tomcat/0000755000175000017500000000000012203357067026004 5ustar drazzibdrazziblogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/tomcat/package.html0000644000175000017500000000031511377016712030264 0ustar drazzibdrazzib

This is logback access' implementation for Tomcat.

logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/tomcat/LogbackValve.java0000644000175000017500000002271412140214537031207 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.tomcat; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.concurrent.ExecutorService; import javax.servlet.ServletContext; import javax.servlet.ServletException; import org.apache.catalina.Lifecycle; import org.apache.catalina.LifecycleException; import org.apache.catalina.LifecycleListener; import org.apache.catalina.LifecycleState; import org.apache.catalina.connector.Request; import org.apache.catalina.connector.Response; import org.apache.catalina.valves.ValveBase; import ch.qos.logback.access.AccessConstants; import ch.qos.logback.access.joran.JoranConfigurator; import ch.qos.logback.access.spi.AccessEvent; import ch.qos.logback.access.spi.IAccessEvent; import ch.qos.logback.core.Appender; import ch.qos.logback.core.BasicStatusManager; import ch.qos.logback.core.Context; import ch.qos.logback.core.CoreConstants; import ch.qos.logback.core.LifeCycleManager; import ch.qos.logback.core.filter.Filter; import ch.qos.logback.core.joran.spi.JoranException; import ch.qos.logback.core.spi.AppenderAttachable; import ch.qos.logback.core.spi.AppenderAttachableImpl; import ch.qos.logback.core.spi.FilterAttachable; import ch.qos.logback.core.spi.FilterAttachableImpl; import ch.qos.logback.core.spi.FilterReply; import ch.qos.logback.core.spi.LifeCycle; import ch.qos.logback.core.spi.LogbackLock; import ch.qos.logback.core.status.InfoStatus; import ch.qos.logback.core.status.StatusManager; import ch.qos.logback.core.status.WarnStatus; import ch.qos.logback.core.util.ExecutorServiceUtil; import ch.qos.logback.core.util.OptionHelper; import ch.qos.logback.core.util.StatusPrinter; //import org.apache.catalina.Lifecycle; /** * This class is an implementation of tomcat's Valve interface, by extending * ValveBase. * *

* For more information on using LogbackValve please refer to the online * documentation on logback-acces and tomcat. * * @author Ceki Gülcü * @author Sébastien Pennec */ public class LogbackValve extends ValveBase implements Lifecycle, Context, AppenderAttachable, FilterAttachable { public final static String DEFAULT_CONFIG_FILE = "conf" + File.separatorChar + "logback-access.xml"; private final LifeCycleManager lifeCycleManager = new LifeCycleManager(); private long birthTime = System.currentTimeMillis(); LogbackLock configurationLock = new LogbackLock(); // Attributes from ContextBase: private String name; StatusManager sm = new BasicStatusManager(); // TODO propertyMap should be observable so that we can be notified // when it changes so that a new instance of propertyMap can be // serialized. For the time being, we ignore this shortcoming. Map propertyMap = new HashMap(); Map objectMap = new HashMap(); private FilterAttachableImpl fai = new FilterAttachableImpl(); AppenderAttachableImpl aai = new AppenderAttachableImpl(); String filename; boolean quiet; boolean started; boolean alreadySetLogbackStatusManager = false; private ExecutorService executorService; public LogbackValve() { putObject(CoreConstants.EVALUATOR_MAP, new HashMap()); } public boolean isStarted() { return started; } public void startInternal() throws LifecycleException { executorService = ExecutorServiceUtil.newExecutorService(); if (filename == null) { String tomcatHomeProperty = OptionHelper .getSystemProperty("catalina.home"); filename = tomcatHomeProperty + File.separatorChar + DEFAULT_CONFIG_FILE; getStatusManager().add( new InfoStatus("filename property not set. Assuming [" + filename + "]", this)); } File configFile = new File(filename); if (configFile.exists()) { try { JoranConfigurator jc = new JoranConfigurator(); jc.setContext(this); jc.doConfigure(filename); } catch (JoranException e) { // TODO can we do better than printing a stack trace on syserr? e.printStackTrace(); } } else { getStatusManager().add( new WarnStatus("[" + filename + "] does not exist", this)); } if (!quiet) { StatusPrinter.print(getStatusManager()); } started = true; setState(LifecycleState.STARTING); } public String getFilename() { return filename; } public void setFilename(String filename) { this.filename = filename; } public boolean isQuiet() { return quiet; } public void setQuiet(boolean quiet) { this.quiet = quiet; } public void invoke(Request request, Response response) throws IOException, ServletException { try { if (!alreadySetLogbackStatusManager) { alreadySetLogbackStatusManager = true; org.apache.catalina.Context tomcatContext = request.getContext(); if (tomcatContext != null) { ServletContext sc = tomcatContext.getServletContext(); if (sc != null) { sc.setAttribute(AccessConstants.LOGBACK_STATUS_MANAGER_KEY, getStatusManager()); } } } getNext().invoke(request, response); TomcatServerAdapter adapter = new TomcatServerAdapter(request, response); IAccessEvent accessEvent = new AccessEvent(request, response, adapter); if (getFilterChainDecision(accessEvent) == FilterReply.DENY) { return; } // TODO better exception handling aai.appendLoopOnAppenders(accessEvent); } finally { request.removeAttribute(AccessConstants.LOGBACK_STATUS_MANAGER_KEY); } } protected void stopInternal() throws LifecycleException { started = false; setState(LifecycleState.STOPPING); lifeCycleManager.reset(); if (executorService != null) { ExecutorServiceUtil.shutdown(executorService); executorService = null; } } public void addAppender(Appender newAppender) { aai.addAppender(newAppender); } public Iterator> iteratorForAppenders() { return aai.iteratorForAppenders(); } public Appender getAppender(String name) { return aai.getAppender(name); } public boolean isAttached(Appender appender) { return aai.isAttached(appender); } public void detachAndStopAllAppenders() { aai.detachAndStopAllAppenders(); } public boolean detachAppender(Appender appender) { return aai.detachAppender(appender); } public boolean detachAppender(String name) { return aai.detachAppender(name); } public String getInfo() { return "Logback's implementation of ValveBase"; } // Methods from ContextBase: public StatusManager getStatusManager() { return sm; } public Map getPropertyMap() { return propertyMap; } public void putProperty(String key, String val) { this.propertyMap.put(key, val); } public String getProperty(String key) { return (String) this.propertyMap.get(key); } public Map getCopyOfPropertyMap() { return new HashMap(this.propertyMap); } public Object getObject(String key) { return objectMap.get(key); } public void putObject(String key, Object value) { objectMap.put(key, value); } public void addFilter(Filter newFilter) { fai.addFilter(newFilter); } public void clearAllFilters() { fai.clearAllFilters(); } public List> getCopyOfAttachedFiltersList() { return fai.getCopyOfAttachedFiltersList(); } public FilterReply getFilterChainDecision(IAccessEvent event) { return fai.getFilterChainDecision(event); } public ExecutorService getExecutorService() { return executorService; } public String getName() { return name; } public void setName(String name) { if (this.name != null) { throw new IllegalStateException( "LogbackValve has been already given a name"); } this.name = name; } public long getBirthTime() { return birthTime; } public Object getConfigurationLock() { return configurationLock; } public void register(LifeCycle component) { lifeCycleManager.register(component); } // ====== Methods from catalina Lifecycle ===== public void addLifecycleListener(LifecycleListener arg0) { // dummy NOP implementation } public LifecycleListener[] findLifecycleListeners() { return new LifecycleListener[0]; } public void removeLifecycleListener(LifecycleListener arg0) { // dummy NOP implementation } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/tomcat/TomcatServerAdapter.java0000644000175000017500000000310412136042270032554 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.tomcat; import java.util.HashMap; import java.util.Map; import org.apache.catalina.connector.Request; import org.apache.catalina.connector.Response; import ch.qos.logback.access.spi.ServerAdapter; /** * A tomcat specific implementation of the {@link ServerAdapter} interface. * * @author Sébastien Pennec */ public class TomcatServerAdapter implements ServerAdapter { Request request; Response response; public TomcatServerAdapter(Request tomcatRequest, Response tomcatResponse) { this.request = tomcatRequest; this.response = tomcatResponse; } public long getContentLength() { return response.getContentLength(); } public int getStatusCode() { return response.getStatus(); } public Map buildResponseHeaderMap() { Map responseHeaderMap = new HashMap(); for (String key : response.getHeaderNames()) { String value = response.getHeader(key); responseHeaderMap.put(key, value); } return responseHeaderMap; } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/jetty/0000755000175000017500000000000012203357067025654 5ustar drazzibdrazziblogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/jetty/package.html0000644000175000017500000000031611640310174030125 0ustar drazzibdrazzib

This is logback access' implementation for Jetty 8.

logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/jetty/RequestLogImpl.java0000644000175000017500000002370612136042270031433 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.jetty; import java.io.File; import java.net.MalformedURLException; import java.net.URI; import java.net.URL; import java.util.HashMap; import java.util.Iterator; import java.util.List; import ch.qos.logback.core.status.InfoStatus; import ch.qos.logback.core.util.FileUtil; import ch.qos.logback.core.util.StatusPrinter; import org.eclipse.jetty.server.Request; import org.eclipse.jetty.server.RequestLog; import org.eclipse.jetty.server.Response; import ch.qos.logback.access.joran.JoranConfigurator; import ch.qos.logback.access.spi.AccessEvent; import ch.qos.logback.access.spi.IAccessEvent; import ch.qos.logback.core.Appender; import ch.qos.logback.core.ContextBase; import ch.qos.logback.core.CoreConstants; import ch.qos.logback.core.filter.Filter; import ch.qos.logback.core.joran.spi.JoranException; import ch.qos.logback.core.spi.AppenderAttachable; import ch.qos.logback.core.spi.AppenderAttachableImpl; import ch.qos.logback.core.spi.FilterAttachable; import ch.qos.logback.core.spi.FilterAttachableImpl; import ch.qos.logback.core.spi.FilterReply; import ch.qos.logback.core.status.ErrorStatus; import ch.qos.logback.core.status.WarnStatus; import ch.qos.logback.core.util.OptionHelper; /** * This class is logback's implementation of jetty's RequestLog interface.

* It can be seen as logback classic's LoggerContext. Appenders can be attached * directly to RequestLogImpl and RequestLogImpl uses the same StatusManager as * LoggerContext does. It also provides containers for properties.

To * configure jetty in order to use RequestLogImpl, the following lines must be * added to the jetty configuration file, namely etc/jetty.xml: *

*

 *    <Ref id="requestLog">
 *      <Set name="requestLog">
 *        <New id="requestLogImpl" class="ch.qos.logback.access.jetty.RequestLogImpl"></New>
 *      </Set>
 *    </Ref>
 * 
*

* By default, RequestLogImpl looks for a logback configuration file called * logback-access.xml, in the same folder where jetty.xml is located, that is * etc/logback-access.xml. The logback-access.xml file is slightly * different than the usual logback classic configuration file. Most of it is * the same: Appenders and Layouts are declared the exact same way. However, * loggers elements are not allowed.

It is possible to put the logback * configuration file anywhere, as long as it's path is specified. Here is * another example, with a path to the logback-access.xml file. *

*

 *    <Ref id="requestLog">
 *      <Set name="requestLog">
 *        <New id="requestLogImpl" class="ch.qos.logback.access.jetty.RequestLogImpl"></New>
 *          <Set name="fileName">path/to/logback.xml</Set>
 *      </Set>
 *    </Ref>
 * 
*

*

Here is a sample logback-access.xml file that can be used right away: *

*

 *    <configuration>
 *      <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
 *        <layout class="ch.qos.logback.access.PatternLayout">
 *          <param name="Pattern" value="%date %server %remoteIP %clientHost %user %requestURL" />
 *        </layout>
 *      </appender>
 *
 *      <appender-ref ref="STDOUT" />
 *    </configuration>
 * 
*

*

Another configuration file, using SMTPAppender, could be: *

*

 *    <configuration>
 *      <appender name="SMTP" class="ch.qos.logback.access.net.SMTPAppender">
 *        <layout class="ch.qos.logback.access.PatternLayout">
 *          <param name="pattern" value="%remoteIP [%date] %requestURL %statusCode %bytesSent" />
 *        </layout>
 *        <param name="From" value="sender@domaine.org" />
 *        <param name="SMTPHost" value="mail.domain.org" />
 *         <param name="Subject" value="Last Event: %statusCode %requestURL" />
 *         <param name="To" value="server_admin@domain.org" />
 *      </appender>
 *      <appender-ref ref="SMTP" />
 *    </configuration>
 * 
* * @author Ceki Gülcü * @author Sébastien Pennec */ public class RequestLogImpl extends ContextBase implements RequestLog, AppenderAttachable, FilterAttachable { public final static String DEFAULT_CONFIG_FILE = "etc" + File.separatorChar + "logback-access.xml"; AppenderAttachableImpl aai = new AppenderAttachableImpl(); FilterAttachableImpl fai = new FilterAttachableImpl(); String fileName; String resource; boolean started = false; boolean quiet = false; public RequestLogImpl() { putObject(CoreConstants.EVALUATOR_MAP, new HashMap()); } public void log(Request jettyRequest, Response jettyResponse) { JettyServerAdapter adapter = new JettyServerAdapter(jettyRequest, jettyResponse); IAccessEvent accessEvent = new AccessEvent(jettyRequest, jettyResponse, adapter); if (getFilterChainDecision(accessEvent) == FilterReply.DENY) { return; } aai.appendLoopOnAppenders(accessEvent); } private void addInfo(String msg) { getStatusManager().add(new InfoStatus(msg, this)); } private void addError(String msg) { getStatusManager().add(new ErrorStatus(msg, this)); } public void start() { URL configURL = getConfigurationFileURL(); if (configURL != null) { runJoranOnFile(configURL); } else { addError("Could not find configuration file for logback-access"); } if (!isQuiet()) { StatusPrinter.print(getStatusManager()); } started = true; } URL getConfigurationFileURL() { if (fileName != null) { addInfo("Will use configuration file [" + fileName + "]"); File file = new File(fileName); if (!file.exists()) return null; return FileUtil.fileToURL(file); } if (resource != null) { addInfo("Will use configuration resource [" + resource + "]"); return this.getClass().getResource(resource); } String jettyHomeProperty = OptionHelper.getSystemProperty("jetty.home"); String defaultConfigFile = DEFAULT_CONFIG_FILE; if (!OptionHelper.isEmpty(jettyHomeProperty)) { defaultConfigFile = jettyHomeProperty + File.separatorChar + DEFAULT_CONFIG_FILE; } else { addInfo("[jetty.home] system property not set."); } File file = new File(defaultConfigFile); addInfo("Assuming default configuration file ["+defaultConfigFile+"]"); if (!file.exists()) return null; return FileUtil.fileToURL(file); } private void runJoranOnFile(URL configURL) { try { JoranConfigurator jc = new JoranConfigurator(); jc.setContext(this); jc.doConfigure(configURL); if (getName() == null) { setName("LogbackRequestLog"); } } catch (JoranException e) { // errors have been registered as status messages } } public void stop() { aai.detachAndStopAllAppenders(); started = false; } public boolean isRunning() { return started; } public void setFileName(String fileName) { this.fileName = fileName; } public void setResource(String resource) { this.resource = resource; } public boolean isStarted() { return started; } public boolean isStarting() { return false; } public boolean isStopping() { return false; } public boolean isStopped() { return !started; } public boolean isFailed() { return false; } public boolean isQuiet() { return quiet; } public void setQuiet(boolean quiet) { this.quiet = quiet; } public void addAppender(Appender newAppender) { aai.addAppender(newAppender); } public Iterator> iteratorForAppenders() { return aai.iteratorForAppenders(); } public Appender getAppender(String name) { return aai.getAppender(name); } public boolean isAttached(Appender appender) { return aai.isAttached(appender); } public void detachAndStopAllAppenders() { aai.detachAndStopAllAppenders(); } public boolean detachAppender(Appender appender) { return aai.detachAppender(appender); } public boolean detachAppender(String name) { return aai.detachAppender(name); } public void addFilter(Filter newFilter) { fai.addFilter(newFilter); } public void clearAllFilters() { fai.clearAllFilters(); } public List> getCopyOfAttachedFiltersList() { return fai.getCopyOfAttachedFiltersList(); } public FilterReply getFilterChainDecision(IAccessEvent event) { return fai.getFilterChainDecision(event); } public void addLifeCycleListener(Listener listener) { // we'll implement this when asked } public void removeLifeCycleListener(Listener listener) { // we'll implement this when asked } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/jetty/JettyServerAdapter.java0000644000175000017500000000342712136042270032304 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.jetty; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import org.eclipse.jetty.http.HttpFields; import org.eclipse.jetty.server.Request; import org.eclipse.jetty.server.Response; import ch.qos.logback.access.spi.ServerAdapter; /** * A jetty specific implementation of the {@link ServerAdapter} interface. * * @author Sébastien Pennec * @author Ceki Gulcu */ public class JettyServerAdapter implements ServerAdapter { Request request; Response response; public JettyServerAdapter(Request jettyRequest, Response jettyResponse) { this.request = jettyRequest; this.response = jettyResponse; } public long getContentLength() { return response.getContentCount(); } public int getStatusCode() { return response.getStatus(); } public Map buildResponseHeaderMap() { Map responseHeaderMap = new HashMap(); HttpFields httpFields = response.getHttpFields(); Enumeration e = httpFields.getFieldNames(); while (e.hasMoreElements()) { String key = (String) e.nextElement(); String value = response.getHeader(key); responseHeaderMap.put(key, value); } return responseHeaderMap; } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/jetty/RequestLogRegistry.java0000644000175000017500000000176112136042270032337 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.jetty; import java.util.HashMap; import java.util.Map; // this class is currently not used public class RequestLogRegistry { private static Map requestLogRegistry = new HashMap(); public static void register(RequestLogImpl requestLogImpl) { requestLogRegistry.put(requestLogImpl.getName(), requestLogImpl); } public static RequestLogImpl get(String key) { return requestLogRegistry.get(key); } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/PatternLayoutEncoder.java0000644000175000017500000000174212136042270031467 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access; import ch.qos.logback.access.spi.IAccessEvent; import ch.qos.logback.core.pattern.PatternLayoutEncoderBase; public class PatternLayoutEncoder extends PatternLayoutEncoderBase { @Override public void start() { PatternLayout patternLayout = new PatternLayout(); patternLayout.setContext(context); patternLayout.setPattern(getPattern()); patternLayout.start(); this.layout = patternLayout; super.start(); } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/package.html0000644000175000017500000000030011377016711026766 0ustar drazzibdrazzib

This is logback access' main package.

logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/ViewStatusMessagesServlet.java0000644000175000017500000000330512136042270032524 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import ch.qos.logback.core.status.StatusManager; import ch.qos.logback.core.status.ViewStatusMessagesServletBase; public class ViewStatusMessagesServlet extends ViewStatusMessagesServletBase { private static final long serialVersionUID = 443878494348593337L; @Override protected StatusManager getStatusManager(HttpServletRequest req, HttpServletResponse resp) { ServletContext sc = getServletContext(); return (StatusManager) sc .getAttribute(AccessConstants.LOGBACK_STATUS_MANAGER_KEY); // if (result != null) { // System.out.println("from ServletContext"); // return result; // } else { // HttpSession httpSession = req.getSession(true); // // System.out.println("from httpSession"); // return (StatusManager) httpSession // .getAttribute(AccessConstants.LOGBACK_STATUS_MANAGER_KEY); // } } @Override protected String getPageTitle(HttpServletRequest req, HttpServletResponse resp) { return "

Status messages for logback-access

\r\n"; } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/pattern/0000755000175000017500000000000012203357067026172 5ustar drazzibdrazziblogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/pattern/FullRequestConverter.java0000644000175000017500000000315212136042270033171 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.pattern; import java.util.Enumeration; import ch.qos.logback.access.spi.IAccessEvent; import ch.qos.logback.core.CoreConstants; /** * This class is tied to the fullRequest conversion word. *

* It has been removed from the {@link ch.qos.logback.access.PatternLayout} since * it needs further testing before wide use. *

* @author Ceki Gülcü * @author Sébastien Pennec */ public class FullRequestConverter extends AccessConverter { @Override public String convert(IAccessEvent ae) { StringBuffer buf = new StringBuffer(); buf.append(ae.getRequestURL()); buf.append(CoreConstants.LINE_SEPARATOR); Enumeration headerNames = ae.getRequestHeaderNames(); while(headerNames.hasMoreElements()) { String name = (String) headerNames.nextElement(); buf.append(name); buf.append(": "); buf.append(ae.getRequestHeader(name)); buf.append(CoreConstants.LINE_SEPARATOR); } buf.append(CoreConstants.LINE_SEPARATOR); buf.append(ae.getRequestContent()); return buf.toString(); } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/pattern/AccessConverter.java0000644000175000017500000000334412136042270032122 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.pattern; import ch.qos.logback.access.spi.IAccessEvent; import ch.qos.logback.core.Context; import ch.qos.logback.core.pattern.DynamicConverter; import ch.qos.logback.core.spi.ContextAware; import ch.qos.logback.core.spi.ContextAwareBase; import ch.qos.logback.core.status.Status; abstract public class AccessConverter extends DynamicConverter implements ContextAware { public final static char SPACE_CHAR = ' '; public final static char QUESTION_CHAR = '?'; ContextAwareBase cab = new ContextAwareBase(); public void setContext(Context context) { cab.setContext(context); } public Context getContext() { return cab.getContext(); } public void addStatus(Status status) { cab.addStatus(status); } public void addInfo(String msg) { cab.addInfo(msg); } public void addInfo(String msg, Throwable ex) { cab.addInfo(msg, ex); } public void addWarn(String msg) { cab.addWarn(msg); } public void addWarn(String msg, Throwable ex) { cab.addWarn(msg, ex); } public void addError(String msg) { cab.addError(msg); } public void addError(String msg, Throwable ex) { cab.addError(msg, ex); } } ././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootlogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/pattern/RequestProtocolConverter.javalogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/pattern/RequestProtocolConverter.j0000644000175000017500000000135512136042270033403 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.pattern; import ch.qos.logback.access.spi.IAccessEvent; public class RequestProtocolConverter extends AccessConverter { public String convert(IAccessEvent accessEvent) { return accessEvent.getProtocol(); } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/pattern/package.html0000644000175000017500000000034211377016712030452 0ustar drazzibdrazzib

Provides classes implementing format specifiers in conversion patterns.

././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootlogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/pattern/ResponseHeaderConverter.javalogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/pattern/ResponseHeaderConverter.ja0000644000175000017500000000254512136042270033303 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.pattern; import ch.qos.logback.access.spi.IAccessEvent; import ch.qos.logback.core.util.OptionHelper; public class ResponseHeaderConverter extends AccessConverter { String key; public void start() { key = getFirstOption(); if (OptionHelper.isEmpty(key)) { addWarn("Missing key for the response header"); } else { super.start(); } } public String convert(IAccessEvent accessEvent) { if(!isStarted()) { return "INACTIVE_REPONSE_HEADER_CONV"; } return accessEvent.getResponseHeader(key); //return null; // HttpServletResponse response = accessEvent.getHttpResponse(); // // Object value = null; // = response.getHeader(key); // if (value == null) { // return AccessConverter.NA; // } else { // return value.toString(); // } } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/pattern/FullResponseConverter.java0000644000175000017500000000616312136042270033344 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.pattern; import java.util.List; import ch.qos.logback.access.spi.IAccessEvent; import ch.qos.logback.core.CoreConstants; public class FullResponseConverter extends AccessConverter { @Override public String convert(IAccessEvent ae) { StringBuffer buf = new StringBuffer(); buf.append("HTTP/1.1 "); int statusCode = ae.getStatusCode(); buf.append(statusCode); buf.append(" "); buf.append(getStatusCodeDescription(statusCode)); buf.append(CoreConstants.LINE_SEPARATOR); List hnList = ae.getResponseHeaderNameList(); for(String headerName: hnList) { buf.append(headerName); buf.append(": "); buf.append(ae.getResponseHeader(headerName)); buf.append(CoreConstants.LINE_SEPARATOR); } buf.append(CoreConstants.LINE_SEPARATOR); buf.append(ae.getResponseContent()); buf.append(CoreConstants.LINE_SEPARATOR); return buf.toString(); } static String getStatusCodeDescription(int sc) { switch(sc) { case 200: return "OK"; case 201: return "Created"; case 202: return "Accepted"; case 203: return "Non-Authoritative Information"; case 204: return "No Content"; case 205: return "Reset Content"; case 206: return "Partial Content"; case 300: return "Multiple Choices"; case 301: return "Moved Permanently"; case 302: return "Found"; case 303: return "See Other"; case 304: return "Not Modified"; case 305: return "Use Proxy"; case 306: return "(Unused)"; case 307: return "Temporary Redirect"; case 400: return "Bad Request"; case 401: return "Unauthorized"; case 402: return "Payment Required"; case 403: return "Forbidden"; case 404: return "Not Found"; case 405: return "Method Not Allowed"; case 406: return "Not Acceptable"; case 407: return "Proxy Authentication Required"; case 408: return "Request Timeout"; case 409: return "Conflict"; case 410: return "Gone"; case 411: return "Length Required"; case 412: return "Precondition Failed"; case 413: return "Request Entity Too Large"; case 414: return "Request-URI Too Long"; case 415: return "Unsupported Media Type"; case 416: return "Requested Range Not Satisfiable"; case 417: return "Expectation Failed"; case 500: return "Internal Server Error"; case 501: return "Not Implemented"; case 502: return "Bad Gateway"; case 503: return "Service Unavailable"; case 504: return "Gateway Timeout"; case 505: return "HTTP Version Not Supported"; default: return "NA"; } } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/pattern/RemoteUserConverter.java0000644000175000017500000000153112136042270033007 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.pattern; import ch.qos.logback.access.spi.IAccessEvent; public class RemoteUserConverter extends AccessConverter { public String convert(IAccessEvent accessEvent) { String user = accessEvent.getRemoteUser(); if(user == null) { return IAccessEvent.NA; } else { return user; } } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/pattern/RequestURIConverter.java0000644000175000017500000000145512136042270032732 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.pattern; import ch.qos.logback.access.spi.IAccessEvent; /** * The request URI. * * @author Ceki Gülcü */ public class RequestURIConverter extends AccessConverter { public String convert(IAccessEvent accessEvent) { return accessEvent.getRequestURI(); } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/pattern/RemoteHostConverter.java0000644000175000017500000000135412136042270033011 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.pattern; import ch.qos.logback.access.spi.IAccessEvent; public class RemoteHostConverter extends AccessConverter { public String convert(IAccessEvent accessEvent) { return accessEvent.getRemoteHost(); } } ././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootlogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/pattern/RequestAttributeConverter.javalogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/pattern/RequestAttributeConverter.0000644000175000017500000000211112136042270033362 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.pattern; import ch.qos.logback.access.spi.IAccessEvent; import ch.qos.logback.core.util.OptionHelper; public class RequestAttributeConverter extends AccessConverter { String key; public void start() { key = getFirstOption(); if (OptionHelper.isEmpty(key)) { addWarn("Missing key for the request attribute"); } else { super.start(); } } public String convert(IAccessEvent accessEvent) { if (!isStarted()) { return "INACTIVE_REQUEST_ATTRIB_CONV"; } return accessEvent.getAttribute(key); } } ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootlogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/pattern/RequestCookieConverter.javalogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/pattern/RequestCookieConverter.jav0000644000175000017500000000207512136042270033342 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.pattern; import ch.qos.logback.access.spi.IAccessEvent; import ch.qos.logback.core.util.OptionHelper; public class RequestCookieConverter extends AccessConverter { String key; public void start() { key = getFirstOption(); if (OptionHelper.isEmpty(key)) { addWarn("Missing key for the requested header"); } else { super.start(); } } public String convert(IAccessEvent accessEvent) { if (!isStarted()) { return "INACTIVE_COOKIE_CONVERTER"; } return accessEvent.getCookie(key); } } ././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootlogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/pattern/RemoteIPAddressConverter.javalogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/pattern/RemoteIPAddressConverter.j0000644000175000017500000000135512136042270033223 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.pattern; import ch.qos.logback.access.spi.IAccessEvent; public class RemoteIPAddressConverter extends AccessConverter { public String convert(IAccessEvent accessEvent) { return accessEvent.getRemoteAddr(); } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/pattern/RequestURLConverter.java0000644000175000017500000000147112136042270032733 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.pattern; import ch.qos.logback.access.spi.IAccessEvent; /** * The first line of the request. * * @author Ceki Gülcü */ public class RequestURLConverter extends AccessConverter { public String convert(IAccessEvent accessEvent) { return accessEvent.getRequestURL(); } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/pattern/ServerNameConverter.java0000644000175000017500000000134612136042270032770 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.pattern; import ch.qos.logback.access.spi.IAccessEvent; public class ServerNameConverter extends AccessConverter { public String convert(IAccessEvent accessEvent) { return accessEvent.getServerName(); } } ././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootlogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/pattern/ResponseContentConverter.javalogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/pattern/ResponseContentConverter.j0000644000175000017500000000205212136042270033355 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.pattern; import ch.qos.logback.access.spi.IAccessEvent; /** * This class is tied to the requestContent conversion word. *

* It has been removed from the {@link ch.qos.logback.access.PatternLayout} since * it needs further testing before wide use. *

* @author Ceki Gülcü * @author Sébastien Pennec */ public class ResponseContentConverter extends AccessConverter { @Override public String convert(IAccessEvent accessEvent) { return accessEvent.getResponseContent(); } } ././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootlogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/pattern/RequestParameterConverter.javalogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/pattern/RequestParameterConverter.0000644000175000017500000000255012136042270033346 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.pattern; import java.util.Arrays; import ch.qos.logback.access.spi.IAccessEvent; import ch.qos.logback.core.util.OptionHelper; public class RequestParameterConverter extends AccessConverter { String key; public void start() { key = getFirstOption(); if (OptionHelper.isEmpty(key)) { addWarn("Missing key for the request parameter"); } else { super.start(); } } public String convert(IAccessEvent accessEvent) { if (!isStarted()) { return "INACTIVE_REQUEST_PARAM_CONV"; } String[] paramArray = accessEvent.getRequestParameter(key); if (paramArray.length == 1) { return paramArray[0]; } else { // for an array string {"a", "b"} named 'sa', Array.toString(sa) returns the string // "[a, b]". return Arrays.toString(paramArray); } } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/pattern/NAConverter.java0000644000175000017500000000155512136042270031221 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.pattern; import ch.qos.logback.access.spi.IAccessEvent; /** * Always returns the NA (not available) string which is "-" in the case * of access conversions. * * @author Ceki Gülcü */ public class NAConverter extends AccessConverter { public String convert(IAccessEvent accessEvent) { return IAccessEvent.NA; } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/pattern/EnsureLineSeparation.java0000644000175000017500000000254112136042270033126 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.pattern; import ch.qos.logback.access.spi.IAccessEvent; import ch.qos.logback.core.pattern.Converter; import ch.qos.logback.core.pattern.ConverterUtil; import ch.qos.logback.core.pattern.PostCompileProcessor; public class EnsureLineSeparation implements PostCompileProcessor { /** * Add a line separator converter so that access event appears on a separate * line. */ public void process(Converter head) { if(head == null) throw new IllegalArgumentException("Empty converter chain"); // if head != null, then tail != null as well Converter tail = ConverterUtil.findTail(head); Converter newLineConverter = new LineSeparatorConverter(); if (!(tail instanceof LineSeparatorConverter)) { tail.setNext(newLineConverter); } } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/pattern/LocalPortConverter.java0000644000175000017500000000137212136042270032617 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.pattern; import ch.qos.logback.access.spi.IAccessEvent; public class LocalPortConverter extends AccessConverter { public String convert(IAccessEvent accessEvent) { return Integer.toString(accessEvent.getLocalPort()); } } ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootlogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/pattern/RequestContentConverter.javalogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/pattern/RequestContentConverter.ja0000644000175000017500000000205012136042270033346 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.pattern; import ch.qos.logback.access.spi.IAccessEvent; /** * This class is tied to the requestContent conversion word. *

* It has been removed from the {@link ch.qos.logback.access.PatternLayout} since * it needs further testing before wide use. *

* @author Ceki Gülcü * @author Sébastien Pennec */ public class RequestContentConverter extends AccessConverter { @Override public String convert(IAccessEvent accessEvent) { return accessEvent.getRequestContent(); } } ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootlogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/pattern/LocalIPAddressConverter.javalogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/pattern/LocalIPAddressConverter.ja0000644000175000017500000000204112136042270033154 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.pattern; import java.net.InetAddress; import java.net.UnknownHostException; import ch.qos.logback.access.spi.IAccessEvent; public class LocalIPAddressConverter extends AccessConverter { String localIPAddressStr; public LocalIPAddressConverter() { try { localIPAddressStr = InetAddress.getLocalHost().getHostAddress(); } catch (UnknownHostException uhe) { localIPAddressStr = "127.0.0.1"; } } public String convert(IAccessEvent accessEvent) { return localIPAddressStr; } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/pattern/StatusCodeConverter.java0000644000175000017500000000137212136042270032776 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.pattern; import ch.qos.logback.access.spi.IAccessEvent; public class StatusCodeConverter extends AccessConverter { public String convert(IAccessEvent accessEvent) { return Integer.toString(accessEvent.getStatusCode()); } } ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootlogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/pattern/RequestMethodConverter.javalogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/pattern/RequestMethodConverter.jav0000644000175000017500000000135212136042270033346 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.pattern; import ch.qos.logback.access.spi.IAccessEvent; public class RequestMethodConverter extends AccessConverter { public String convert(IAccessEvent accessEvent) { return accessEvent.getMethod(); } } ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootlogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/pattern/RequestHeaderConverter.javalogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/pattern/RequestHeaderConverter.jav0000644000175000017500000000231312136042270033314 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.pattern; import ch.qos.logback.access.spi.IAccessEvent; import ch.qos.logback.core.util.OptionHelper; public class RequestHeaderConverter extends AccessConverter { String key; public void start() { key = getFirstOption(); if (OptionHelper.isEmpty(key)) { addWarn("Missing key for the requested header. Defaulting to all keys."); key = null; } super.start(); } public String convert(IAccessEvent accessEvent) { if(!isStarted()) { return "INACTIVE_HEADER_CONV"; } if(key != null) { return accessEvent.getRequestHeader(key); } else { return accessEvent.getRequestHeaderMap().toString(); } } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/pattern/DateConverter.java0000644000175000017500000000400312136042270031567 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.pattern; import java.util.List; import java.util.TimeZone; import ch.qos.logback.access.spi.IAccessEvent; import ch.qos.logback.core.CoreConstants; import ch.qos.logback.core.util.CachingDateFormatter; public class DateConverter extends AccessConverter { CachingDateFormatter cachingDateFormatter = null; public void start() { String datePattern = getFirstOption(); if(datePattern == null) { datePattern = CoreConstants.CLF_DATE_PATTERN; } if (datePattern.equals(CoreConstants.ISO8601_STR)) { datePattern = CoreConstants.ISO8601_PATTERN; } try { cachingDateFormatter = new CachingDateFormatter(datePattern); //maximumCacheValidity = CachedDateFormat.getMaximumCacheValidity(pattern); } catch (IllegalArgumentException e) { addWarn( "Could not instantiate SimpleDateFormat with pattern " + datePattern, e); // default to the ISO8601 format cachingDateFormatter = new CachingDateFormatter(CoreConstants.CLF_DATE_PATTERN); } List optionList = getOptionList(); // if the option list contains a TZ option, then set it. if (optionList != null && optionList.size() > 1) { TimeZone tz = TimeZone.getTimeZone((String) optionList.get(1)); cachingDateFormatter.setTimeZone(tz); } } public String convert(IAccessEvent accessEvent) { long timestamp = accessEvent.getTimeStamp(); return cachingDateFormatter.format(timestamp); } } ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootlogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/pattern/ContentLengthConverter.javalogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/pattern/ContentLengthConverter.jav0000644000175000017500000000155712136042270033340 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.pattern; import ch.qos.logback.access.spi.IAccessEvent; public class ContentLengthConverter extends AccessConverter { public String convert(IAccessEvent accessEvent) { long len = accessEvent.getContentLength(); if(len == IAccessEvent.SENTINEL) { return IAccessEvent.NA; } else { return Long.toString(len); } } } ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootlogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/pattern/LineSeparatorConverter.javalogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/pattern/LineSeparatorConverter.jav0000644000175000017500000000142112136042270033322 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.pattern; import ch.qos.logback.access.spi.IAccessEvent; import ch.qos.logback.core.CoreConstants; public class LineSeparatorConverter extends AccessConverter { public String convert(IAccessEvent event) { return CoreConstants.LINE_SEPARATOR; } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/AccessConstants.java0000644000175000017500000000234212136042270030447 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access; public class AccessConstants { public static final String LOGBACK_STATUS_MANAGER_KEY = "LOGBACK_STATUS_MANAGER"; public static final String LB_INPUT_BUFFER = "LB_INPUT_BUFFER"; public static final String LB_OUTPUT_BUFFER = "LB_OUTPUT_BUFFER"; public static final String X_WWW_FORM_URLECODED = "application/x-www-form-urlencoded"; public static final String IMAGE_CONTENT_TYPE = "image/"; public static final String IMAGE_JPEG = "image/jpeg"; public static final String IMAGE_GIF = "image/gif"; public static final String IMAGE_PNG = "image/png"; public static final String TEE_FILTER_INCLUDES_PARAM = "includes"; public static final String TEE_FILTER_EXCLUDES_PARAM = "excludes"; } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/html/0000755000175000017500000000000012203357067025461 5ustar drazzibdrazziblogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/html/UrlCssBuilder.java0000644000175000017500000000226612136042270031044 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.html; import ch.qos.logback.core.html.CssBuilder; /** * This class helps the HTMLLayout build the CSS link. * It either provides the HTMLLayout with a default css file, * or builds the link to an external, user-specified, file. * * @author Sébastien Pennec */ public class UrlCssBuilder implements CssBuilder { String url = "http://logback.qos.ch/css/access.css"; public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public void addCss(StringBuilder sbuf) { sbuf.append(""); } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/html/package.html0000644000175000017500000000031111377016711027734 0ustar drazzibdrazzib

Contains classes to format log output in HTML.

logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/html/DefaultCssBuilder.java0000644000175000017500000000553112136042270031664 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.html; import static ch.qos.logback.core.CoreConstants.LINE_SEPARATOR; import ch.qos.logback.core.html.CssBuilder; /** * This class helps the HTMLLayout build the CSS link. It either provides the * HTMLLayout with a default css file, or builds the link to an external, * user-specified, file. * * @author Sébastien Pennec */ public class DefaultCssBuilder implements CssBuilder { public void addCss(StringBuilder sbuf) { sbuf.append(""); } }logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/html/HTMLLayout.java0000644000175000017500000000534212136042270030262 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.html; import static ch.qos.logback.core.CoreConstants.LINE_SEPARATOR; import java.util.Map; import ch.qos.logback.access.PatternLayout; import ch.qos.logback.access.spi.IAccessEvent; import ch.qos.logback.core.html.HTMLLayoutBase; import ch.qos.logback.core.pattern.Converter; /** * * HTMLLayout outputs events in an HTML table. *

* The content of the table columns are specified using a conversion pattern. * See {@link ch.qos.logback.access.PatternLayout} for documentation on the * available patterns. *

* For more information about this layout, please refer to the online manual at * http://logback.qos.ch/manual/layouts.html#AccessHTMLLayout * * * @author Ceki Gülcü * @author Sébastien Pennec */ public class HTMLLayout extends HTMLLayoutBase { /** * Default pattern string for log output. */ static final String DEFAULT_CONVERSION_PATTERN = "%h%l%u%t%r%s%b"; /** * Constructs a PatternLayout using the DEFAULT_LAYOUT_PATTERN. * */ public HTMLLayout() { pattern = DEFAULT_CONVERSION_PATTERN; cssBuilder = new DefaultCssBuilder(); } @Override protected Map getDefaultConverterMap() { return PatternLayout.defaultConverterMap; } public String doLayout(IAccessEvent event) { StringBuilder buf = new StringBuilder(); startNewTableIfLimitReached(buf); boolean odd = true; if (((counter++) & 1) == 0) { odd = false; } buf.append(LINE_SEPARATOR); buf.append(""); } else { buf.append(" even\">"); } buf.append(LINE_SEPARATOR); Converter c = head; while (c != null) { appendEventToBuffer(buf, c, event); c = c.getNext(); } buf.append(""); buf.append(LINE_SEPARATOR); return buf.toString(); } private void appendEventToBuffer(StringBuilder buf, Converter c, IAccessEvent event) { buf.append(""); c.write(buf, event); buf.append(""); buf.append(LINE_SEPARATOR); } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/servlet/0000755000175000017500000000000012203357067026201 5ustar drazzibdrazziblogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/servlet/Util.java0000644000175000017500000000253012136042270027751 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.servlet; import ch.qos.logback.access.AccessConstants; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Util { public static boolean isFormUrlEncoded(HttpServletRequest request) { String contentTypeStr = request.getContentType(); if ("POST".equalsIgnoreCase(request.getMethod()) && contentTypeStr != null && contentTypeStr.startsWith(AccessConstants.X_WWW_FORM_URLECODED)) { return true; } else { return false; } } public static boolean isImageResponse(HttpServletResponse response) { String responseType = response.getContentType(); if (responseType != null && responseType.startsWith(AccessConstants.IMAGE_CONTENT_TYPE)) { return true; } else { return false; } } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/servlet/TeeFilter.java0000644000175000017500000001165612136042270030730 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.servlet; import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.List; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import static ch.qos.logback.access.AccessConstants.LB_OUTPUT_BUFFER; import static ch.qos.logback.access.AccessConstants.TEE_FILTER_INCLUDES_PARAM; import static ch.qos.logback.access.AccessConstants.TEE_FILTER_EXCLUDES_PARAM; public class TeeFilter implements Filter { boolean active; public void destroy() { // NOP } public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { if (active && request instanceof HttpServletRequest) { try { TeeHttpServletRequest teeRequest = new TeeHttpServletRequest( (HttpServletRequest) request); TeeHttpServletResponse teeResponse = new TeeHttpServletResponse( (HttpServletResponse) response); //System.out.println("BEFORE TeeFilter. filterChain.doFilter()"); filterChain.doFilter(teeRequest, teeResponse); //System.out.println("AFTER TeeFilter. filterChain.doFilter()"); teeResponse.finish(); // let the output contents be available for later use by // logback-access-logging teeRequest.setAttribute(LB_OUTPUT_BUFFER, teeResponse .getOutputBuffer()); } catch (IOException e) { e.printStackTrace(); throw e; } catch (ServletException e) { e.printStackTrace(); throw e; } } else { filterChain.doFilter(request, response); } } public void init(FilterConfig filterConfig) throws ServletException { String includeListAsStr = filterConfig.getInitParameter(TEE_FILTER_INCLUDES_PARAM); String excludeListAsStr = filterConfig.getInitParameter(TEE_FILTER_EXCLUDES_PARAM); String localhostName = getLocalhostName(); active = computeActivation(localhostName, includeListAsStr, excludeListAsStr); if (active) System.out.println("TeeFilter will be ACTIVE on this host [" + localhostName + "]"); else System.out.println("TeeFilter will be DISABLED on this host [" + localhostName + "]"); } static List extractNameList(String nameListAsStr) { List nameList = new ArrayList(); if (nameListAsStr == null) { return nameList; } nameListAsStr = nameListAsStr.trim(); if (nameListAsStr.length() == 0) { return nameList; } String[] nameArray = nameListAsStr.split("[,;]"); for (String n : nameArray) { n = n.trim(); nameList.add(n); } return nameList; } static String getLocalhostName() { String hostname = "127.0.0.1"; try { hostname = InetAddress.getLocalHost().getHostName(); } catch (UnknownHostException uhe) { uhe.printStackTrace(); } return hostname; } static boolean computeActivation(String hostname, String includeListAsStr, String excludeListAsStr) { List includeList = extractNameList(includeListAsStr); List excludeList = extractNameList(excludeListAsStr); boolean inIncludesList = mathesIncludesList(hostname, includeList); boolean inExcludesList = mathesExcludesList(hostname, excludeList); return inIncludesList && (!inExcludesList); } static boolean mathesIncludesList(String hostname, List includeList) { if (includeList.isEmpty()) return true; return includeList.contains(hostname); } static boolean mathesExcludesList(String hostname, List excludesList) { if (excludesList.isEmpty()) return false; return excludesList.contains(hostname); } } ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootlogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/servlet/TeeServletOutputStream.javalogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/servlet/TeeServletOutputStream.jav0000644000175000017500000000532112136042270033353 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.servlet; import java.io.ByteArrayOutputStream; import java.io.IOException; import javax.servlet.ServletOutputStream; import javax.servlet.ServletResponse; public class TeeServletOutputStream extends ServletOutputStream { final ServletOutputStream underlyingStream; final ByteArrayOutputStream baosCopy; TeeServletOutputStream(ServletResponse httpServletResponse) throws IOException { // System.out.println("TeeServletOutputStream.constructor() called"); this.underlyingStream = httpServletResponse.getOutputStream(); baosCopy = new ByteArrayOutputStream(); } byte[] getOutputStreamAsByteArray() { return baosCopy.toByteArray(); } @Override public void write(int val) throws IOException { if (underlyingStream != null) { underlyingStream.write(val); baosCopy.write(val); } } @Override public void write(byte[] byteArray) throws IOException { if (underlyingStream == null) { return; } // System.out.println("WRITE TeeServletOutputStream.write(byte[]) called"); write(byteArray, 0, byteArray.length); } @Override public void write(byte byteArray[], int offset, int length) throws IOException { if (underlyingStream == null) { return; } // System.out.println("WRITE TeeServletOutputStream.write(byte[], int, int) // called"); // System.out.println(new String(byteArray, offset, length)); underlyingStream.write(byteArray, offset, length); baosCopy.write(byteArray, offset, length); } @Override public void close() throws IOException { // System.out.println("CLOSE TeeServletOutputStream.close() called"); // If the servlet accessing the stream is using a writer instead of // an OutputStream, it will probably call os.close() before calling // writer.close. Thus, the underlying output stream will be called // before the data sent to the writer could be flushed. } @Override public void flush() throws IOException { if (underlyingStream == null) { return; } // System.out.println("FLUSH TeeServletOutputStream.flush() called"); underlyingStream.flush(); baosCopy.flush(); } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/servlet/TeeServletInputStream.java0000644000175000017500000000375012136042270033317 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.servlet; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServletRequest; class TeeServletInputStream extends ServletInputStream { InputStream in; byte[] inputBuffer; TeeServletInputStream(HttpServletRequest request) { duplicateInputStream(request); } @Override public int read() throws IOException { return in.read(); } private void duplicateInputStream(HttpServletRequest request) { ServletInputStream originalSIS = null; try { originalSIS = request.getInputStream(); inputBuffer = consumeBufferAndReturnAsByteArray(originalSIS); this.in = new ByteArrayInputStream(inputBuffer); } catch (IOException e) { e.printStackTrace(); } finally { closeStrean(originalSIS); } } byte[] consumeBufferAndReturnAsByteArray(InputStream is) throws IOException { int len = 1024; byte[] temp = new byte[len]; int c = -1; ByteArrayOutputStream baos = new ByteArrayOutputStream(); while ((c = is.read(temp, 0, len)) != -1) { baos.write(temp, 0, c); } return baos.toByteArray(); } void closeStrean(ServletInputStream is) { if (is != null) { try { is.close(); } catch (IOException e) { } } } byte[] getInputBuffer() { return inputBuffer; } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/servlet/TeeHttpServletRequest.java0000644000175000017500000000453112136042270033332 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.servlet; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import static ch.qos.logback.access.AccessConstants.LB_INPUT_BUFFER; /** * As the "tee" program on Unix, duplicate the request's input stream. * * @author Ceki Gülcü */ class TeeHttpServletRequest extends HttpServletRequestWrapper { private TeeServletInputStream inStream; private BufferedReader reader; boolean postedParametersMode = false; TeeHttpServletRequest(HttpServletRequest request) { super(request); // we can't access the input stream and access the request parameters // at the same time if (Util.isFormUrlEncoded(request)) { postedParametersMode = true; } else { inStream = new TeeServletInputStream(request); // add the contents of the input buffer as an attribute of the request request.setAttribute(LB_INPUT_BUFFER, inStream.getInputBuffer()); reader = new BufferedReader(new InputStreamReader(inStream)); } } byte[] getInputBuffer() { if (postedParametersMode) { throw new IllegalStateException("Call disallowed in postedParametersMode"); } return inStream.getInputBuffer(); } @Override public ServletInputStream getInputStream() throws IOException { if (!postedParametersMode) { return inStream; } else { return super.getInputStream(); } } // @Override public BufferedReader getReader() throws IOException { if (!postedParametersMode) { return reader; } else { return super.getReader(); } } public boolean isPostedParametersMode() { return postedParametersMode; } } ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootlogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/servlet/TeeHttpServletResponse.javalogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/servlet/TeeHttpServletResponse.jav0000644000175000017500000000417312136042270033341 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.servlet; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.PrintWriter; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; public class TeeHttpServletResponse extends HttpServletResponseWrapper { TeeServletOutputStream teeServletOutputStream; PrintWriter teeWriter; public TeeHttpServletResponse(HttpServletResponse httpServletResponse) { super(httpServletResponse); } @Override public ServletOutputStream getOutputStream() throws IOException { if (teeServletOutputStream == null) { teeServletOutputStream = new TeeServletOutputStream(this.getResponse()); } return teeServletOutputStream; } @Override public PrintWriter getWriter() throws IOException { if (this.teeWriter == null) { this.teeWriter = new PrintWriter(new OutputStreamWriter(getOutputStream()), true); } return this.teeWriter; } @Override public void flushBuffer() { if (this.teeWriter != null) { this.teeWriter.flush(); } } byte[] getOutputBuffer() { // teeServletOutputStream can be null if the getOutputStream method is never // called. if (teeServletOutputStream != null) { return teeServletOutputStream.getOutputStreamAsByteArray(); } else { return null; } } void finish() throws IOException { if (this.teeWriter != null) { this.teeWriter.close(); } if (this.teeServletOutputStream != null) { this.teeServletOutputStream.close(); } } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/sift/0000755000175000017500000000000012203357067025462 5ustar drazzibdrazziblogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/sift/SiftingAppender.java0000644000175000017500000000301112136042270031372 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.sift; import ch.qos.logback.access.spi.IAccessEvent; import ch.qos.logback.core.joran.spi.DefaultClass; import ch.qos.logback.core.sift.Discriminator; import ch.qos.logback.core.sift.SiftingAppenderBase; /** * This appender can contains other appenders which it can build dynamically * depending on MDC values. The built appender is specified as part of a * configuration file. * *

See the logback manual for further details. * * * @author Ceki Gulcu */ public class SiftingAppender extends SiftingAppenderBase { @Override public void start() { super.start(); } @Override protected long getTimestamp(IAccessEvent event) { return event.getTimeStamp(); } @Override protected boolean eventMarksEndOfLife(IAccessEvent event) { return false; } @Override @DefaultClass(AccessEventDiscriminator.class) public void setDiscriminator(Discriminator discriminator) { super.setDiscriminator(discriminator); } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/sift/AccessEventDiscriminator.java0000644000175000017500000001175512136563562033275 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.sift; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import ch.qos.logback.access.spi.IAccessEvent; import ch.qos.logback.core.sift.AbstractDiscriminator; /** * * AccessEventDiscriminator's job is to return the value of a designated field * in an {@link IAccessEvent} instance. * *

The field is specified via the {@link FieldName} property. * * @author Ceki Gülcü * */ public class AccessEventDiscriminator extends AbstractDiscriminator { /** * At present time the followed fields can be designated: COOKIE, * REQUEST_ATTRIBUTE, SESSION_ATTRIBUTE, REMOTE_ADDRESS, * LOCAL_PORT,REQUEST_URI * *

The first three fields require an additional key. For the * SESSION_ATTRIBUTE field, the additional key named "id" has special meaning * as it is mapped to the session id of the current http request. */ public enum FieldName { COOKIE, REQUEST_ATTRIBUTE, SESSION_ATTRIBUTE, REMOTE_ADDRESS, LOCAL_PORT, REQUEST_URI } String defaultValue; String key; FieldName fieldName; String additionalKey; public String getDiscriminatingValue(IAccessEvent acccessEvent) { String rawValue = getRawDiscriminatingValue(acccessEvent); if (rawValue == null || rawValue.length() == 0) { return defaultValue; } else { return rawValue; } } public String getRawDiscriminatingValue(IAccessEvent acccessEvent) { switch (fieldName) { case COOKIE: // tested return acccessEvent.getCookie(additionalKey); case LOCAL_PORT: return String.valueOf(acccessEvent.getLocalPort()); case REQUEST_ATTRIBUTE: // tested return getRequestAttribute(acccessEvent); case SESSION_ATTRIBUTE: return getSessionAttribute(acccessEvent); case REMOTE_ADDRESS: return acccessEvent.getRemoteAddr(); case REQUEST_URI: // tested return getRequestURI(acccessEvent); default: return null; } } private String getRequestAttribute(IAccessEvent acccessEvent) { String attr = acccessEvent.getAttribute(additionalKey); if (IAccessEvent.NA.equals(attr)) { return null; } else { return attr; } } private String getRequestURI(IAccessEvent acccessEvent) { String uri = acccessEvent.getRequestURI(); if (uri != null && uri.length() >= 1 && uri.charAt(0) == '/') { return uri.substring(1); } else { return uri; } } private String getSessionAttribute(IAccessEvent acccessEvent) { HttpServletRequest req = acccessEvent.getRequest(); if (req != null) { HttpSession session = req.getSession(false); if (session != null) { if ("id".equalsIgnoreCase(additionalKey)) { return session.getId(); } else { Object v = session.getAttribute(additionalKey); if (v != null) { return v.toString(); } } } } return null; } @Override public void start() { int errorCount = 0; if (defaultValue == null) { addError("\"DefaultValue\" property must be set."); } if (fieldName == null) { addError("\"FieldName\" property must be set."); errorCount++; } switch (fieldName) { case SESSION_ATTRIBUTE: case REQUEST_ATTRIBUTE: case COOKIE: if (additionalKey == null) { addError("\"OptionalKey\" property is mandatory for field name " + fieldName.toString()); errorCount++; } } if (errorCount == 0) { started = true; } } public void setFieldName(FieldName fieldName) { this.fieldName = fieldName; } public FieldName getFieldName() { return fieldName; } public String getAdditionalKey() { return additionalKey; } public void setAdditionalKey(String additionalKey) { this.additionalKey = additionalKey; } /** * @see #setDefaultValue(String) * @return */ public String getDefaultValue() { return defaultValue; } /** * The default value returned by this discriminator in case it cannot compute * the discriminating value from the access event. * * @param defaultValue */ public void setDefaultValue(String defaultValue) { this.defaultValue = defaultValue; } public String getKey() { return key; } public void setKey(String key) { this.key = key; } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/sift/SiftAction.java0000644000175000017500000000360012136260254030363 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.sift; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.xml.sax.Attributes; import ch.qos.logback.core.joran.action.Action; import ch.qos.logback.core.joran.event.InPlayListener; import ch.qos.logback.core.joran.event.SaxEvent; import ch.qos.logback.core.joran.spi.ActionException; import ch.qos.logback.core.joran.spi.InterpretationContext; public class SiftAction extends Action implements InPlayListener { List seList; @Override public void begin(InterpretationContext ic, String name, Attributes attributes) throws ActionException { seList = new ArrayList(); ic.addInPlayListener(this); } @Override public void end(InterpretationContext ic, String name) throws ActionException { ic.removeInPlayListener(this); Object o = ic.peekObject(); if (o instanceof SiftingAppender) { SiftingAppender siftingAppender = (SiftingAppender) o; Map propertyMap = ic.getCopyOfPropertyMap(); AppenderFactoryUsingJoran appenderFactory = new AppenderFactoryUsingJoran(seList, siftingAppender.getDiscriminatorKey(), propertyMap); siftingAppender.setAppenderFactory(appenderFactory); } } public void inPlay(SaxEvent event) { seList.add(event); } public List getSeList() { return seList; } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/sift/SiftingJoranConfigurator.java0000644000175000017500000000475112140150756033310 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.sift; import java.util.Collection; import java.util.HashMap; import java.util.Map; import ch.qos.logback.access.spi.IAccessEvent; import ch.qos.logback.core.Appender; import ch.qos.logback.core.joran.action.ActionConst; import ch.qos.logback.core.joran.action.AppenderAction; import ch.qos.logback.core.joran.spi.ElementPath; import ch.qos.logback.core.joran.spi.ElementSelector; import ch.qos.logback.core.joran.spi.RuleStore; import ch.qos.logback.core.sift.SiftingJoranConfiguratorBase; public class SiftingJoranConfigurator extends SiftingJoranConfiguratorBase { SiftingJoranConfigurator(String key, String value, Map parentPropertyMap) { super(key, value, parentPropertyMap); } @Override protected ElementPath initialElementPath() { return new ElementPath("configuration"); } @Override protected void addInstanceRules(RuleStore rs) { rs.addRule(new ElementSelector("configuration/appender"), new AppenderAction()); } @Override protected void buildInterpreter() { super.buildInterpreter(); Map omap = interpreter.getInterpretationContext() .getObjectMap(); omap.put(ActionConst.APPENDER_BAG, new HashMap()); omap.put(ActionConst.FILTER_CHAIN_BAG, new HashMap()); Map propertiesMap = new HashMap(); propertiesMap.putAll(parentPropertyMap); propertiesMap.put(key, value); interpreter.setInterpretationContextPropertiesMap(propertiesMap); } @SuppressWarnings("unchecked") public Appender getAppender() { Map omap = interpreter.getInterpretationContext() .getObjectMap(); HashMap appenderMap = (HashMap) omap.get(ActionConst.APPENDER_BAG); oneAndOnlyOneCheck(appenderMap); Collection values = appenderMap.values(); if(values.size() == 0) { return null; } return (Appender) values.iterator().next(); } } ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootlogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/sift/AppenderFactoryUsingJoran.javalogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/sift/AppenderFactoryUsingJoran.jav0000644000175000017500000000235512136260254033253 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.sift; import java.util.List; import java.util.Map; import ch.qos.logback.access.spi.IAccessEvent; import ch.qos.logback.core.joran.event.SaxEvent; import ch.qos.logback.core.sift.AbstractAppenderFactoryUsingJoran; import ch.qos.logback.core.sift.SiftingJoranConfiguratorBase; public class AppenderFactoryUsingJoran extends AbstractAppenderFactoryUsingJoran { AppenderFactoryUsingJoran(List eventList, String key, Map parentPropertyMap) { super(eventList, key, parentPropertyMap); } public SiftingJoranConfiguratorBase getSiftingJoranConfigurator( String keyValue) { return new SiftingJoranConfigurator(key, keyValue, parentPropertyMap); } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/joran/0000755000175000017500000000000012203357067025626 5ustar drazzibdrazziblogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/joran/action/0000755000175000017500000000000012203357067027103 5ustar drazzibdrazzib././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootlogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/joran/action/ConfigurationAction.javalogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/joran/action/ConfigurationAction.j0000644000175000017500000000413612136042270033217 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.joran.action; import ch.qos.logback.core.status.OnConsoleStatusListener; import ch.qos.logback.core.util.OptionHelper; import org.xml.sax.Attributes; import ch.qos.logback.core.joran.action.Action; import ch.qos.logback.core.joran.spi.InterpretationContext; import ch.qos.logback.core.util.ContextUtil; import ch.qos.logback.core.util.StatusPrinter; public class ConfigurationAction extends Action { static final String INTERNAL_DEBUG_ATTR = "debug"; static final String DEBUG_SYSTEM_PROPERTY_KEY = "logback-access.debug"; public void begin(InterpretationContext ec, String name, Attributes attributes) { // See LBCLASSIC-225 (the system property is looked up first. Thus, it overrides // the equivalent property in the config file. This reversal of scope priority is justified // by the use case: the admin trying to chase rogue config file String debugAttrib = System.getProperty(DEBUG_SYSTEM_PROPERTY_KEY); if (debugAttrib == null) { debugAttrib = attributes.getValue(INTERNAL_DEBUG_ATTR); } if (OptionHelper.isEmpty(debugAttrib) || debugAttrib.equals("false") || debugAttrib.equals("null")) { addInfo(INTERNAL_DEBUG_ATTR + " attribute not set"); } else { OnConsoleStatusListener.addNewInstanceToContext(context); } new ContextUtil(context).addHostNameAsProperty(); // the context is appender attachable, so it is pushed on top of the stack ec.pushObject(getContext()); } public void end(InterpretationContext ec, String name) { addInfo("End of configuration."); ec.popObject(); } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/joran/action/EvaluatorAction.java0000644000175000017500000000150512136042270033037 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.joran.action; import ch.qos.logback.access.boolex.JaninoEventEvaluator; import ch.qos.logback.core.joran.action.AbstractEventEvaluatorAction; public class EvaluatorAction extends AbstractEventEvaluatorAction { protected String defaultClassName() { return JaninoEventEvaluator.class.getName(); } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/joran/package.html0000644000175000017500000000030211377016711030101 0ustar drazzibdrazzib

Contains the Joran configration classes

logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/joran/JoranConfigurator.java0000644000175000017500000000652412140150756032130 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.joran; import ch.qos.logback.access.PatternLayout; import ch.qos.logback.access.PatternLayoutEncoder; import ch.qos.logback.access.boolex.JaninoEventEvaluator; import ch.qos.logback.access.joran.action.ConfigurationAction; import ch.qos.logback.access.joran.action.EvaluatorAction; import ch.qos.logback.access.sift.SiftAction; import ch.qos.logback.core.AppenderBase; import ch.qos.logback.core.UnsynchronizedAppenderBase; import ch.qos.logback.core.filter.EvaluatorFilter; import ch.qos.logback.core.joran.JoranConfiguratorBase; import ch.qos.logback.core.joran.action.AppenderRefAction; import ch.qos.logback.core.joran.action.IncludeAction; import ch.qos.logback.core.joran.action.NOPAction; import ch.qos.logback.core.joran.conditional.ElseAction; import ch.qos.logback.core.joran.conditional.IfAction; import ch.qos.logback.core.joran.conditional.ThenAction; import ch.qos.logback.core.joran.spi.DefaultNestedComponentRegistry; import ch.qos.logback.core.joran.spi.ElementSelector; import ch.qos.logback.core.joran.spi.RuleStore; import ch.qos.logback.core.net.ssl.SSLNestedComponentRegistryRules; /** * This JoranConfiguratorclass adds rules specific to logback-access. * * @author Ceki Gülcü */ public class JoranConfigurator extends JoranConfiguratorBase { @Override public void addInstanceRules(RuleStore rs) { super.addInstanceRules(rs); rs.addRule(new ElementSelector("configuration"), new ConfigurationAction()); rs.addRule(new ElementSelector("configuration/appender-ref"), new AppenderRefAction()); rs.addRule(new ElementSelector("configuration/appender/sift"), new SiftAction()); rs.addRule(new ElementSelector("configuration/appender/sift/*"), new NOPAction()); rs.addRule(new ElementSelector("configuration/evaluator"), new EvaluatorAction()); // add if-then-else support rs.addRule(new ElementSelector("*/if"), new IfAction()); rs.addRule(new ElementSelector("*/if/then"), new ThenAction()); rs.addRule(new ElementSelector("*/if/then/*"), new NOPAction()); rs.addRule(new ElementSelector("*/if/else"), new ElseAction()); rs.addRule(new ElementSelector("*/if/else/*"), new NOPAction()); rs.addRule(new ElementSelector("configuration/include"), new IncludeAction()); } @Override protected void addDefaultNestedComponentRegistryRules( DefaultNestedComponentRegistry registry) { registry.add(AppenderBase.class, "layout", PatternLayout.class); registry .add(EvaluatorFilter.class, "evaluator", JaninoEventEvaluator.class); registry.add(AppenderBase.class, "encoder", PatternLayoutEncoder.class); registry.add(UnsynchronizedAppenderBase.class, "encoder", PatternLayoutEncoder.class); SSLNestedComponentRegistryRules.addDefaultNestedComponentRegistryRules(registry); } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/boolex/0000755000175000017500000000000012203357067026005 5ustar drazzibdrazziblogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/boolex/JaninoEventEvaluator.java0000644000175000017500000000514612136042270032751 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.boolex; import java.util.ArrayList; import java.util.List; import ch.qos.logback.access.spi.IAccessEvent; import ch.qos.logback.core.CoreConstants; import ch.qos.logback.core.boolex.JaninoEventEvaluatorBase; import ch.qos.logback.core.boolex.Matcher; public class JaninoEventEvaluator extends JaninoEventEvaluatorBase { public final static List DEFAULT_PARAM_NAME_LIST = new ArrayList(); public final static List DEFAULT_PARAM_TYPE_LIST = new ArrayList(); static { DEFAULT_PARAM_NAME_LIST.add("event"); DEFAULT_PARAM_TYPE_LIST.add(IAccessEvent.class); } protected String getDecoratedExpression() { String expression = getExpression(); if (!expression.contains("return")) { expression = "return " + expression + ";"; addInfo("Adding [return] prefix and a semicolon suffix. Expression becomes [" + expression + "]"); addInfo("See also " + CoreConstants.CODES_URL + "#block"); } return expression; } protected String[] getParameterNames() { List fullNameList = new ArrayList(); fullNameList.addAll(DEFAULT_PARAM_NAME_LIST); for (int i = 0; i < matcherList.size(); i++) { Matcher m = (Matcher) matcherList.get(i); fullNameList.add(m.getName()); } return (String[]) fullNameList.toArray(CoreConstants.EMPTY_STRING_ARRAY); } protected Class[] getParameterTypes() { List fullTypeList = new ArrayList(); fullTypeList.addAll(DEFAULT_PARAM_TYPE_LIST); for (int i = 0; i < matcherList.size(); i++) { fullTypeList.add(Matcher.class); } return (Class[]) fullTypeList.toArray(CoreConstants.EMPTY_CLASS_ARRAY); } protected Object[] getParameterValues(IAccessEvent accessEvent) { final int matcherListSize = matcherList.size(); int i = 0; Object[] values = new Object[DEFAULT_PARAM_NAME_LIST.size() + matcherListSize]; values[i++] = accessEvent; for (int j = 0; j < matcherListSize; j++) { values[i++] = matcherList.get(j); } return values; } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/filter/0000755000175000017500000000000012203357067026002 5ustar drazzibdrazziblogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/filter/StatisticalView.java0000644000175000017500000000163312136042270031757 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.filter; public interface StatisticalView { long getTotal(); long getLastMinuteCount(); double getMinuteAverage(); long getLastHoursCount(); double getHourlyAverage(); long getLastDaysCount(); double getDailyAverage(); long getLastWeeksCount(); double getWeeklyAverage(); long getLastMonthsCount(); double getMonthlyAverage(); } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/filter/PeriodicStats.java0000644000175000017500000000303012136042270031406 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.filter; abstract public class PeriodicStats { private long nextPeriodBegins = 0; private long lastTotal = 0; private long lastCount = 0; private double average; private int n; PeriodicStats() { this(System.currentTimeMillis()); } PeriodicStats(long now) { nextPeriodBegins = computeStartOfNextPeriod(now); } void update(long now, long total) { if (now > nextPeriodBegins) { lastCount = total - lastTotal; lastTotal = total; average = (average * n + lastCount) / (++n); nextPeriodBegins = computeStartOfNextPeriod(now); } } public double getAverage() { return average; } public long getLastCount() { return lastCount; } void reset(long now) { nextPeriodBegins = computeStartOfNextPeriod(now); lastTotal = 0; lastCount = 0; average = 0.0; n = 0; } void reset() { reset(System.currentTimeMillis()); } abstract long computeStartOfNextPeriod(long now); } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/filter/StatsByHour.java0000644000175000017500000000150112136042270031061 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.filter; import ch.qos.logback.core.util.TimeUtil; public class StatsByHour extends PeriodicStats { StatsByHour() { super(); } StatsByHour(long now) { super(now); } @Override long computeStartOfNextPeriod(long now) { return TimeUtil.computeStartOfNextHour(now); } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/filter/CountingFilter.java0000644000175000017500000000422612136042270031575 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.filter; import ch.qos.logback.core.filter.Filter; import ch.qos.logback.core.spi.FilterReply; import javax.management.MBeanServer; import javax.management.ObjectName; import javax.management.StandardMBean; import java.lang.management.ManagementFactory; public class CountingFilter extends Filter { long total = 0; final StatisticalViewImpl accessStatsImpl; String domain = "ch.qos.logback.access"; public CountingFilter() { accessStatsImpl = new StatisticalViewImpl(this); } @Override public FilterReply decide(Object event) { total++; accessStatsImpl.update(); return FilterReply.NEUTRAL; } public long getTotal() { return total; } @Override public void start() { MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); try { ObjectName on = new ObjectName(domain+":Name="+getName()); StandardMBean mbean = new StandardMBean(accessStatsImpl, StatisticalView.class); if (mbs.isRegistered(on)) { mbs.unregisterMBean(on); } mbs.registerMBean(mbean, on); super.start(); } catch (Exception e) { addError("Failed to create mbean", e); } } @Override public void stop() { super.stop(); try { MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); ObjectName on = new ObjectName("totp:Filter=1"); mbs.unregisterMBean(on); } catch(Exception e) { addError("Failed to unregister mbean", e); } } public String getDomain() { return domain; } public void setDomain(String domain) { this.domain = domain; } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/filter/StatisticalViewImpl.java0000644000175000017500000000557612136042270032613 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.filter; import ch.qos.logback.core.spi.LifeCycle; public class StatisticalViewImpl implements StatisticalView, LifeCycle { final CountingFilter countingFilter; boolean started; StatsByMinute statsByMinute = new StatsByMinute(); StatsByHour statsByHour = new StatsByHour(); StatsByDay statsByDay = new StatsByDay(); StatsByWeek statsByWeek = new StatsByWeek(); StatsByMonth statsByMonth = new StatsByMonth(); StatisticalViewImpl(CountingFilter countingFilter) { this.countingFilter = countingFilter; } public double getDailyAverage() { return statsByDay.getAverage(); } public long getLastDaysCount() { return statsByDay.getLastCount(); } public double getMonthlyAverage() { return statsByMonth.getAverage(); } public long getLastMonthsCount() { return statsByMonth.getLastCount(); } public long getTotal() { return countingFilter.getTotal(); } public double getWeeklyAverage() { return statsByWeek.getAverage(); } public long getLastWeeksCount() { return statsByWeek.getLastCount(); } void update(long now) { long total = getTotal(); statsByMinute.update(now, total); statsByHour.update(now, total); statsByDay.update(now, total); statsByWeek.update(now, total); statsByMonth.update(now, total); } void update() { long now = System.currentTimeMillis(); update(now); } public void start() { System.out.println("StatisticalViewImpl start called"); started = true; long now = System.currentTimeMillis(); statsByMinute = new StatsByMinute(now); statsByHour = new StatsByHour(now); statsByDay = new StatsByDay(now); statsByWeek = new StatsByWeek(now); statsByMonth = new StatsByMonth(now); } public boolean isStarted() { return started; } public void stop() { started = false; statsByMinute.reset(); statsByHour.reset(); statsByDay.reset(); statsByWeek.reset(); statsByMonth.reset(); } public long getLastMinuteCount() { return statsByMinute.getLastCount(); } public double getMinuteAverage() { return statsByMinute.getAverage(); } public double getHourlyAverage() { return statsByHour.getAverage(); } public long getLastHoursCount() { return statsByHour.getLastCount(); } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/filter/StatsByMinute.java0000644000175000017500000000151112136042270031406 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.filter; import ch.qos.logback.core.util.TimeUtil; public class StatsByMinute extends PeriodicStats { StatsByMinute() { super(); } StatsByMinute(long now) { super(now); } @Override long computeStartOfNextPeriod(long now) { return TimeUtil.computeStartOfNextMinute(now); } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/filter/StatsByMonth.java0000644000175000017500000000151312136042270031234 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.filter; import ch.qos.logback.core.util.TimeUtil; public class StatsByMonth extends PeriodicStats { StatsByMonth() { super(); } StatsByMonth(long now) { super(now); } @Override long computeStartOfNextPeriod(long now) { return TimeUtil.computeStartOfNextMonth(now); } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/filter/StatsByWeek.java0000644000175000017500000000150312136042270031041 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.filter; import ch.qos.logback.core.util.TimeUtil; public class StatsByWeek extends PeriodicStats { StatsByWeek() { super(); } StatsByWeek(long now) { super(now); } @Override long computeStartOfNextPeriod(long now) { return TimeUtil.computeStartOfNextWeek(now); } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/filter/StatsByDay.java0000644000175000017500000000147512136042270030673 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.filter; import ch.qos.logback.core.util.TimeUtil; public class StatsByDay extends PeriodicStats { StatsByDay() { super(); } StatsByDay(long now) { super(now); } @Override long computeStartOfNextPeriod(long now) { return TimeUtil.computeStartOfNextDay(now); } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/db/0000755000175000017500000000000012203357067025102 5ustar drazzibdrazziblogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/db/package.html0000644000175000017500000000116111377016711027361 0ustar drazzibdrazzib

The ch.qos.logback.access.db package provides means to append access events into various databases.

Most popular database systems, such as PostgreSQL, MySQL, Oracle, DB2 and MsSQL are supported.

Just as importantly, the way for obtaining JDBC connections is pluggable. Connections can be obtained through the tradinal way of DriverManager, or alternatively as a DataSource. A DataSource can be instantiated directly or it can obtained through JNDI.

logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/db/script/0000755000175000017500000000000012203357067026406 5ustar drazzibdrazziblogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/db/script/db2.sql0000644000175000017500000000254211377016711027600 0ustar drazzibdrazzib# Logback: the reliable, generic, fast and flexible logging framework. # Copyright (C) 1999-2010, QOS.ch. All rights reserved. # # See http://logback.qos.ch/license.html for the applicable licensing # conditions. # This SQL script creates the required tables by ch.qos.logback.access.db.DBAppender # # It is intended for IBM DB2 databases. # # WARNING WARNING WARNING WARNING # ================================= # This SQL script has not been tested on an actual DB2 # instance. It may contain errors or even invalid SQL # statements. DROP TABLE access_event_header; DROP TABLE access_event; CREATE TABLE access_event ( timestmp BIGINT NOT NULL, requestURI VARCHAR(254), requestURL VARCHAR(254), remoteHost VARCHAR(254), remoteUser VARCHAR(254), remoteAddr VARCHAR(254), protocol VARCHAR(254), method VARCHAR(254), serverName VARCHAR(254), postContent VARCHAR(254), event_id INTEGER GENERATED ALWAYS AS IDENTITY (START WITH 1) ); CREATE TABLE access_event_header ( event_id INTEGER NOT NULL, header_key VARCHAR(254) NOT NULL, header_value VARCHAR(1024), PRIMARY KEY(event_id, header_key), FOREIGN KEY (event_id) REFERENCES access_event(event_id) ); logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/db/script/hsqldb.sql0000644000175000017500000000176311377016711030412 0ustar drazzibdrazzib# Logback: the reliable, generic, fast and flexible logging framework. # Copyright (C) 1999-2010, QOS.ch. All rights reserved. # # See http://logback.qos.ch/license.html for the applicable licensing # conditions. # This SQL script creates the required tables by ch.qos.logback.access.db.DBAppender # # It is intended for HSQL databases. DROP TABLE access_event_header IF EXISTS; DROP TABLE access_event IF EXISTS; CREATE TABLE access_event ( timestmp BIGINT NOT NULL, requestURI VARCHAR(254), requestURL VARCHAR(254), remoteHost VARCHAR(254), remoteUser VARCHAR(254), remoteAddr VARCHAR(254), protocol VARCHAR(254), method VARCHAR(254), serverName VARCHAR(254), postContent VARCHAR(254), event_id BIGINT NOT NULL IDENTITY); CREATE TABLE access_event_header ( event_id BIGINT NOT NULL, header_key VARCHAR(254) NOT NULL, header_value LONGVARCHAR, PRIMARY KEY(event_id, header_key), FOREIGN KEY (event_id) REFERENCES access_event(event_id));logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/db/script/msSQLServer.sql0000644000175000017500000000217111377016711031315 0ustar drazzibdrazzib-- Logback: the reliable, generic, fast and flexible logging framework. -- Copyright (C) 1999-2010, QOS.ch. All rights reserved. -- -- See http://logback.qos.ch/license.html for the applicable licensing -- conditions. -- This SQL script creates the required tables by ch.qos.logback.access.db.DBAppender -- DROP TABLE access_event_header DROP TABLE access_event CREATE TABLE access_event ( timestmp BIGINT NOT NULL, requestURI VARCHAR(254), requestURL VARCHAR(254), remoteHost VARCHAR(254), remoteUser VARCHAR(254), remoteAddr VARCHAR(254), protocol VARCHAR(254), method VARCHAR(254), serverName VARCHAR(254), postContent VARCHAR(254), event_id INT NOT NULL identity, PRIMARY KEY(event_id) ) CREATE TABLE access_event_header ( event_id INT NOT NULL, header_key VARCHAR(254) NOT NULL, header_value VARCHAR(1024), PRIMARY KEY(event_id, header_key), FOREIGN KEY (event_id) REFERENCES access_event(event_id) ) logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/db/script/mysql.sql0000644000175000017500000000241311377016711030273 0ustar drazzibdrazzib# Logback: the reliable, generic, fast and flexible logging framework. # Copyright (C) 1999-2010, QOS.ch. All rights reserved. # # See http://logback.qos.ch/license.html for the applicable licensing # conditions. # This SQL script creates the required tables by ch.qos.logback.access.db.DBAppender. # # It is intended for MySQL databases. It has been tested on MySQL 5.0.22 with # INNODB tables. BEGIN; DROP TABLE IF EXISTS access_event_header; DROP TABLE IF EXISTS access_event; COMMIT; BEGIN; CREATE TABLE ACCESS_EVENT ( timestmp BIGINT NOT NULL, requestURI VARCHAR(254), requestURL VARCHAR(254), remoteHost VARCHAR(254), remoteUser VARCHAR(254), remoteAddr VARCHAR(254), protocol VARCHAR(254), method VARCHAR(254), serverName VARCHAR(254), postContent VARCHAR(254), event_id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY ); COMMIT; BEGIN; CREATE TABLE access_event_header ( event_id BIGINT NOT NULL, header_key VARCHAR(254) NOT NULL, header_value VARCHAR(1024), PRIMARY KEY(event_id, header_key), FOREIGN KEY (event_id) REFERENCES access_event(event_id) ); COMMIT;logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/db/script/db2l.sql0000644000175000017500000000175111377016711027755 0ustar drazzibdrazzib# This SQL script creates the required tables by ch.qos.logback.access.db.DBAppender # # It is intended for PostgreSQL databases. DROP TABLE access_event_header; DROP TABLE access_event; CREATE SEQUENCE access_event_id_seq MINVALUE 1 START 1; CREATE TABLE access_event ( timestmp BIGINT NOT NULL, requestURI VARCHAR(254), requestURL VARCHAR(254), remoteHost VARCHAR(254), remoteUser VARCHAR(254), remoteAddr VARCHAR(254), protocol VARCHAR(254), method VARCHAR(254), serverName VARCHAR(254), postContent VARCHAR(254), event_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY ); CREATE TABLE access_event_header ( event_id INT NOT NULL, header_key VARCHAR(254) NOT NULL, header_value VARCHAR(1024), PRIMARY KEY(event_id, header_key), FOREIGN KEY (event_id) REFERENCES access_event(event_id) );logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/db/script/oracle.sql0000644000175000017500000000317711377016711030403 0ustar drazzibdrazzib-- Logback: the reliable, generic, fast and flexible logging framework. -- Copyright (C) 1999-2010, QOS.ch. All rights reserved. -- -- See http://logback.qos.ch/license.html for the applicable licensing -- conditions. -- This SQL script creates the required tables by ch.qos.logback.access.db.DBAppender -- -- It is intended for Oracle databases. CREATE SEQUENCE access_event_id_seq MINVALUE 1 START WITH 1; CREATE TABLE access_event ( timestmp NUMBER(20) NOT NULL, requestURI VARCHAR(254), requestURL VARCHAR(254), remoteHost VARCHAR(254), remoteUser VARCHAR(254), remoteAddr VARCHAR(254), protocol VARCHAR(254), method VARCHAR(254), serverName VARCHAR(254), postContent VARCHAR(254), event_id NUMBER(20) PRIMARY KEY ); -- the / suffix may or may not be needed depending on your SQL Client -- Some SQL Clients, e.g. SQuirrel SQL has trouble with the following -- trigger creation command, while SQLPlus (the basic SQL Client which -- ships with Oracle) has no trouble at all. CREATE TRIGGER access_event_id_seq_trig BEFORE INSERT ON access_event FOR EACH ROW BEGIN SELECT access_event_id_seq.NEXTVAL INTO :NEW.event_id FROM DUAL; END access_event_id_seq_trig; / CREATE TABLE access_event_header ( event_id NUMBER(20) NOT NULL, header_key VARCHAR2(254) NOT NULL, header_value VARCHAR2(1024), PRIMARY KEY(event_id, header_key), FOREIGN KEY (event_id) REFERENCES access_event(event_id) ); logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/db/script/postgresql.sql0000644000175000017500000000240311377016711031330 0ustar drazzibdrazzib# Logback: the reliable, generic, fast and flexible logging framework. # Copyright (C) 1999-2010, QOS.ch. All rights reserved. # # See http://logback.qos.ch/license.html for the applicable licensing # conditions. # This SQL script creates the required tables by ch.qos.logback.classic.db.DBAppender # # It is intended for PostgreSQL databases. DROP TABLE access_event_exception; DROP SEQUENCE access_event_id_seq; DROP TABLE access_event; CREATE SEQUENCE access_event_id_seq MINVALUE 1 START 1; CREATE TABLE access_event ( timestmp BIGINT NOT NULL, requestURI VARCHAR(254), requestURL VARCHAR(254), remoteHost VARCHAR(254), remoteUser VARCHAR(254), remoteAddr VARCHAR(254), protocol VARCHAR(254), method VARCHAR(254), serverName VARCHAR(254), postContent VARCHAR(254), event_id BIGINT DEFAULT nextval('access_event_id_seq') PRIMARY KEY ); CREATE TABLE access_event_header ( event_id BIGINT NOT NULL, header_key VARCHAR(254) NOT NULL, header_value VARCHAR(1024), PRIMARY KEY(event_id, header_key), FOREIGN KEY (event_id) REFERENCES access_event(event_id) );logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/db/DBAppender.java0000644000175000017500000001117212136042270027703 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.db; import java.lang.reflect.Method; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.Enumeration; import ch.qos.logback.access.spi.IAccessEvent; import ch.qos.logback.core.db.DBAppenderBase; /** * The DBAppender inserts access events into three database tables in a format * independent of the Java programming language. * * For more information about this appender, please refer to the online manual at * http://logback.qos.ch/manual/appenders.html#AccessDBAppender * * @author Ceki Gülcü * @author Ray DeCampo * @author Sébastien Pennec */ public class DBAppender extends DBAppenderBase { protected static final String insertSQL; protected final String insertHeaderSQL = "INSERT INTO access_event_header (event_id, header_key, header_value) VALUES (?, ?, ?)"; protected static final Method GET_GENERATED_KEYS_METHOD; private boolean insertHeaders = false; static { StringBuffer sql = new StringBuffer(); sql.append("INSERT INTO access_event ("); sql.append("timestmp, "); sql.append("requestURI, "); sql.append("requestURL, "); sql.append("remoteHost, "); sql.append("remoteUser, "); sql.append("remoteAddr, "); sql.append("protocol, "); sql.append("method, "); sql.append("serverName, "); sql.append("postContent) "); sql.append(" VALUES (?, ?, ? ,?, ?, ?, ?, ?, ?, ?)"); insertSQL = sql.toString(); Method getGeneratedKeysMethod; try { getGeneratedKeysMethod = PreparedStatement.class.getMethod( "getGeneratedKeys", (Class[]) null); } catch (Exception ex) { getGeneratedKeysMethod = null; } GET_GENERATED_KEYS_METHOD = getGeneratedKeysMethod; } @Override protected void subAppend(IAccessEvent event, Connection connection, PreparedStatement insertStatement) throws Throwable { addAccessEvent(insertStatement, event); int updateCount = insertStatement.executeUpdate(); if (updateCount != 1) { addWarn("Failed to insert access event"); } } protected void secondarySubAppend(IAccessEvent event, Connection connection, long eventId) throws Throwable { if (insertHeaders) { addRequestHeaders(event, connection, eventId); } } void addAccessEvent(PreparedStatement stmt, IAccessEvent event) throws SQLException { stmt.setLong(1, event.getTimeStamp()); stmt.setString(2, event.getRequestURI()); stmt.setString(3, event.getRequestURL()); stmt.setString(4, event.getRemoteHost()); stmt.setString(5, event.getRemoteUser()); stmt.setString(6, event.getRemoteAddr()); stmt.setString(7, event.getProtocol()); stmt.setString(8, event.getMethod()); stmt.setString(9, event.getServerName()); stmt.setString(10, event.getRequestContent()); } void addRequestHeaders(IAccessEvent event, Connection connection, long eventId) throws SQLException { Enumeration names = event.getRequestHeaderNames(); if (names.hasMoreElements()) { PreparedStatement insertHeaderStatement = connection .prepareStatement(insertHeaderSQL); while (names.hasMoreElements()) { String key = (String) names.nextElement(); String value = (String) event.getRequestHeader(key); insertHeaderStatement.setLong(1, eventId); insertHeaderStatement.setString(2, key); insertHeaderStatement.setString(3, value); if (cnxSupportsBatchUpdates) { insertHeaderStatement.addBatch(); } else { insertHeaderStatement.execute(); } } if (cnxSupportsBatchUpdates) { insertHeaderStatement.executeBatch(); } insertHeaderStatement.close(); } } @Override protected Method getGeneratedKeysMethod() { return GET_GENERATED_KEYS_METHOD; } @Override protected String getInsertSQL() { return insertSQL; } public void setInsertHeaders(boolean insertHeaders) { this.insertHeaders = insertHeaders; } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/spi/0000755000175000017500000000000012203357067025310 5ustar drazzibdrazziblogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/spi/AccessContext.java0000644000175000017500000000515612136042270030720 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.spi; import java.util.Iterator; import java.util.List; import ch.qos.logback.core.Appender; import ch.qos.logback.core.ContextBase; import ch.qos.logback.core.filter.Filter; import ch.qos.logback.core.spi.AppenderAttachable; import ch.qos.logback.core.spi.AppenderAttachableImpl; import ch.qos.logback.core.spi.FilterAttachable; import ch.qos.logback.core.spi.FilterAttachableImpl; import ch.qos.logback.core.spi.FilterReply; /** * A minimal context implementation used by certain logback-access components, * mainly SocketServer. * * @author Sébastien Pennec */ public class AccessContext extends ContextBase implements AppenderAttachable, FilterAttachable { AppenderAttachableImpl aai = new AppenderAttachableImpl(); FilterAttachableImpl fai = new FilterAttachableImpl(); public void callAppenders(IAccessEvent event) { aai.appendLoopOnAppenders(event); } public void addAppender(Appender newAppender) { aai.addAppender(newAppender); } public void detachAndStopAllAppenders() { aai.detachAndStopAllAppenders(); } public boolean detachAppender(Appender appender) { return aai.detachAppender(appender); } public boolean detachAppender(String name) { return aai.detachAppender(name); } public Appender getAppender(String name) { return aai.getAppender(name); } public boolean isAttached(Appender appender) { return aai.isAttached(appender); } public Iterator> iteratorForAppenders() { return aai.iteratorForAppenders(); } public void addFilter(Filter newFilter) { fai.addFilter(newFilter); } public void clearAllFilters() { fai.clearAllFilters(); } public List> getCopyOfAttachedFiltersList() { return fai.getCopyOfAttachedFiltersList(); } public FilterReply getFilterChainDecision(IAccessEvent event) { return fai.getFilterChainDecision(event); } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/spi/package.html0000644000175000017500000000030711377016712027571 0ustar drazzibdrazzib

Contains the core classes of logback access.

logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/spi/ServerAdapter.java0000644000175000017500000000154412136042270030716 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.spi; import java.util.Map; /** * An interface to access server-specific methods from * the server-independent AccessEvent. * * @author Ceki Gülcü * @author Sébastien Pennec */ public interface ServerAdapter { long getContentLength(); int getStatusCode(); Map buildResponseHeaderMap(); } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/spi/Util.java0000644000175000017500000000203212136042270027055 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.spi; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; public class Util { static final int BUF_SIZE= 128; public static String readToString(InputStream in) throws IOException { if(in == null) { return null; } ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buf = new byte[BUF_SIZE]; int n = 0; while( (n = in.read(buf, 0, BUF_SIZE)) != -1) { baos.write(buf, 0, n); } return baos.toString(); } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/spi/AccessEvent.java0000644000175000017500000003067312136042270030357 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.spi; import java.io.Serializable; import java.util.ArrayList; import java.util.Enumeration; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.TreeMap; import java.util.Vector; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import ch.qos.logback.access.AccessConstants; import ch.qos.logback.access.pattern.AccessConverter; import ch.qos.logback.access.servlet.Util; // Contributors: Joern Huxhorn (see also bug #110) /** * The Access module's internal representation of logging events. When the * logging component instance is called in the container to log then a * AccessEvent instance is created. This instance is passed * around to the different logback components. * * @author Ceki Gülcü * @author Sébastien Pennec */ public class AccessEvent implements Serializable, IAccessEvent { private static final long serialVersionUID = 866718993618836343L; private static final String EMPTY = ""; private transient final HttpServletRequest httpRequest; private transient final HttpServletResponse httpResponse; String requestURI; String requestURL; String remoteHost; String remoteUser; String remoteAddr; String protocol; String method; String serverName; String requestContent; String responseContent; Map requestHeaderMap; Map requestParameterMap; Map responseHeaderMap; long contentLength = SENTINEL; int statusCode = SENTINEL; int localPort = SENTINEL; transient ServerAdapter serverAdapter; /** * The number of milliseconds elapsed from 1/1/1970 until logging event was * created. */ private long timeStamp = 0; public AccessEvent(HttpServletRequest httpRequest, HttpServletResponse httpResponse, ServerAdapter adapter) { this.httpRequest = httpRequest; this.httpResponse = httpResponse; this.timeStamp = System.currentTimeMillis(); this.serverAdapter = adapter; } /** * Returns the underlying HttpServletRequest. After serialization the returned * value will be null. * * @return */ public HttpServletRequest getRequest() { return httpRequest; } /** * Returns the underlying HttpServletResponse. After serialization the returned * value will be null. * * @return */ public HttpServletResponse getResponse() { return httpResponse; } public long getTimeStamp() { return timeStamp; } public void setTimeStamp(long timeStamp) { if (this.timeStamp != 0) { throw new IllegalStateException( "timeStamp has been already set for this event."); } else { this.timeStamp = timeStamp; } } public String getRequestURI() { if (requestURI == null) { if (httpRequest != null) { requestURI = httpRequest.getRequestURI(); } else { requestURI = NA; } } return requestURI; } /** * The first line of the request. */ public String getRequestURL() { if (requestURL == null) { if (httpRequest != null) { StringBuffer buf = new StringBuffer(); buf.append(httpRequest.getMethod()); buf.append(AccessConverter.SPACE_CHAR); buf.append(httpRequest.getRequestURI()); final String qStr = httpRequest.getQueryString(); if (qStr != null) { buf.append(AccessConverter.QUESTION_CHAR); buf.append(qStr); } buf.append(AccessConverter.SPACE_CHAR); buf.append(httpRequest.getProtocol()); requestURL = buf.toString(); } else { requestURL = NA; } } return requestURL; } public String getRemoteHost() { if (remoteHost == null) { if (httpRequest != null) { // the underlying implementation of HttpServletRequest will // determine if remote lookup will be performed remoteHost = httpRequest.getRemoteHost(); } else { remoteHost = NA; } } return remoteHost; } public String getRemoteUser() { if (remoteUser == null) { if (httpRequest != null) { remoteUser = httpRequest.getRemoteUser(); } else { remoteUser = NA; } } return remoteUser; } public String getProtocol() { if (protocol == null) { if (httpRequest != null) { protocol = httpRequest.getProtocol(); } else { protocol = NA; } } return protocol; } public String getMethod() { if (method == null) { if (httpRequest != null) { method = httpRequest.getMethod(); } else { method = NA; } } return method; } public String getServerName() { if (serverName == null) { if (httpRequest != null) { serverName = httpRequest.getServerName(); } else { serverName = NA; } } return serverName; } public String getRemoteAddr() { if (remoteAddr == null) { if (httpRequest != null) { remoteAddr = httpRequest.getRemoteAddr(); } else { remoteAddr = NA; } } return remoteAddr; } public String getRequestHeader(String key) { String result = null; key = key.toLowerCase(); if (requestHeaderMap == null) { if (httpRequest != null) { buildRequestHeaderMap(); result = requestHeaderMap.get(key); } } else { result = requestHeaderMap.get(key); } if (result != null) { return result; } else { return NA; } } public Enumeration getRequestHeaderNames() { // post-serialization if (httpRequest == null) { Vector list = new Vector(getRequestHeaderMap().keySet()); return list.elements(); } return httpRequest.getHeaderNames(); } public Map getRequestHeaderMap() { if (requestHeaderMap == null) { buildRequestHeaderMap(); } return requestHeaderMap; } public void buildRequestHeaderMap() { // according to RFC 2616 header names are case insensitive // latest versions of Tomcat return header names in lower-case requestHeaderMap = new TreeMap(String.CASE_INSENSITIVE_ORDER); Enumeration e = httpRequest.getHeaderNames(); if (e == null) { return; } while (e.hasMoreElements()) { String key = (String) e.nextElement(); requestHeaderMap.put(key, httpRequest.getHeader(key)); } } public void buildRequestParameterMap() { requestParameterMap = new HashMap(); Enumeration e = httpRequest.getParameterNames(); if (e == null) { return; } while (e.hasMoreElements()) { String key = (String) e.nextElement(); requestParameterMap.put(key, httpRequest.getParameterValues(key)); } } public Map getRequestParameterMap() { if (requestParameterMap == null) { buildRequestParameterMap(); } return requestParameterMap; } /** * Attributes are not serialized * * @param key */ public String getAttribute(String key) { if (httpRequest != null) { Object value = httpRequest.getAttribute(key); if (value == null) { return NA; } else { return value.toString(); } } else { return NA; } } public String[] getRequestParameter(String key) { if (httpRequest != null) { String[] value = httpRequest.getParameterValues(key); if (value == null) { return new String[] { NA }; } else { return value; } } else { return new String[] { NA }; } } public String getCookie(String key) { if (httpRequest != null) { Cookie[] cookieArray = httpRequest.getCookies(); if (cookieArray == null) { return NA; } for (Cookie cookie : cookieArray) { if (key.equals(cookie.getName())) { return cookie.getValue(); } } } return NA; } public long getContentLength() { if (contentLength == SENTINEL) { if (httpResponse != null) { contentLength = serverAdapter.getContentLength(); return contentLength; } } return contentLength; } public int getStatusCode() { if (statusCode == SENTINEL) { if (httpResponse != null) { statusCode = serverAdapter.getStatusCode(); } } return statusCode; } public String getRequestContent() { if (requestContent != null) { return requestContent; } if (Util.isFormUrlEncoded(httpRequest)) { StringBuffer buf = new StringBuffer(); Enumeration pramEnumeration = httpRequest.getParameterNames(); // example: id=1234&user=cgu // number=1233&x=1 int count = 0; try { while (pramEnumeration.hasMoreElements()) { String key = (String) pramEnumeration.nextElement(); if (count++ != 0) { buf.append("&"); } buf.append(key); buf.append("="); String val = httpRequest.getParameter(key); if (val != null) { buf.append(val); } else { buf.append(""); } } } catch (Exception e) { // FIXME Why is try/catch required? e.printStackTrace(); } requestContent = buf.toString(); } else { // retrieve the byte array placed by TeeFilter byte[] inputBuffer = (byte[]) httpRequest .getAttribute(AccessConstants.LB_INPUT_BUFFER); if (inputBuffer != null) { requestContent = new String(inputBuffer); } if (requestContent == null || requestContent.length() == 0) { requestContent = EMPTY; } } return requestContent; } public String getResponseContent() { if (responseContent != null) { return responseContent; } if (Util.isImageResponse(httpResponse)) { responseContent = "[IMAGE CONTENTS SUPPRESSED]"; } else { // retreive the byte array previously placed by TeeFilter byte[] outputBuffer = (byte[]) httpRequest .getAttribute(AccessConstants.LB_OUTPUT_BUFFER); if (outputBuffer != null) { responseContent = new String(outputBuffer); } if (responseContent == null || responseContent.length() == 0) { responseContent = EMPTY; } } return responseContent; } public int getLocalPort() { if (localPort == SENTINEL) { if (httpRequest != null) { localPort = httpRequest.getLocalPort(); } } return localPort; } public ServerAdapter getServerAdapter() { return serverAdapter; } public String getResponseHeader(String key) { buildResponseHeaderMap(); return responseHeaderMap.get(key); } void buildResponseHeaderMap() { if (responseHeaderMap == null) { responseHeaderMap = serverAdapter.buildResponseHeaderMap(); } } public Map getResponseHeaderMap() { buildResponseHeaderMap(); return responseHeaderMap; } public List getResponseHeaderNameList() { buildResponseHeaderMap(); return new ArrayList(responseHeaderMap.keySet()); } public void prepareForDeferredProcessing() { buildRequestHeaderMap(); buildRequestParameterMap(); buildResponseHeaderMap(); getLocalPort(); getMethod(); getProtocol(); getRemoteAddr(); getRemoteHost(); getRemoteUser(); getRequestURI(); getRequestURL(); getServerName(); getTimeStamp(); getStatusCode(); getContentLength(); getRequestContent(); getResponseContent(); } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/spi/IAccessEvent.java0000644000175000017500000000534212136042270030463 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.spi; import java.util.Enumeration; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import ch.qos.logback.core.spi.DeferredProcessingAware; // Contributors: Joern Huxhorn (see also bug #110) /** * The Access module's internal representation of logging events. When the * logging component instance is called in the container to log then a * AccessEvent instance is created. This instance is passed * around to the different logback components. * * @author Ceki Gülcü * @author Sébastien Pennec * @author Jörn Huxhorn */ public interface IAccessEvent extends DeferredProcessingAware { String NA = "-"; int SENTINEL = -1; /** * Returns the underlying HttpServletRequest. After serialization the returned * value will be null. * * @return */ HttpServletRequest getRequest(); /** * Returns the underlying HttpServletResponse. After serialization the returned * value will be null. * * @return */ HttpServletResponse getResponse(); /** * The number of milliseconds elapsed from 1/1/1970 until logging event was * created. */ long getTimeStamp(); String getRequestURI(); /** * The first line of the request. */ String getRequestURL(); String getRemoteHost(); String getRemoteUser(); String getProtocol(); String getMethod(); String getServerName(); String getRemoteAddr(); String getRequestHeader(String key); Enumeration getRequestHeaderNames(); Map getRequestHeaderMap(); Map getRequestParameterMap(); /** * Attributes are not serialized * * @param key */ String getAttribute(String key); String[] getRequestParameter(String key); String getCookie(String key); long getContentLength(); int getStatusCode(); String getRequestContent(); String getResponseContent(); int getLocalPort(); ServerAdapter getServerAdapter(); String getResponseHeader(String key); Map getResponseHeaderMap(); List getResponseHeaderNameList(); } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/net/0000755000175000017500000000000012203357067025303 5ustar drazzibdrazziblogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/net/URLEvaluator.java0000644000175000017500000000342612136042270030470 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.net; import java.util.ArrayList; import java.util.List; import ch.qos.logback.access.spi.IAccessEvent; import ch.qos.logback.core.boolex.EvaluationException; import ch.qos.logback.core.boolex.EventEvaluator; import ch.qos.logback.core.spi.ContextAwareBase; import ch.qos.logback.core.spi.LifeCycle; public class URLEvaluator extends ContextAwareBase implements EventEvaluator, LifeCycle { boolean started; String name; private List URLList = new ArrayList(); public void addURL(String url) { URLList.add(url); } public void start() { if (URLList.size() == 0) { addWarn("No URL was given to URLEvaluator"); } else { started = true; } } public boolean evaluate(Object eventObject) throws NullPointerException, EvaluationException { IAccessEvent event = (IAccessEvent)eventObject; String url = event.getRequestURL(); for(String expected:URLList) { if (url.contains(expected)) { return true; } } return false; } public String getName() { return name; } public void setName(String name) { this.name = name; } public boolean isStarted() { return started; } public void stop() { started = false; } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/net/SocketNode.java0000644000175000017500000000537412136042270030205 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.net; import java.io.BufferedInputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.net.Socket; import ch.qos.logback.access.spi.AccessContext; import ch.qos.logback.access.spi.IAccessEvent; import ch.qos.logback.core.spi.FilterReply; // Contributors: Moses Hohman /** * Read {@link IAccessEvent} objects sent from a remote client using Sockets * (TCP). These logging events are logged according to local policy, as if they * were generated locally. * *

* For example, the socket node might decide to log events to a local file and * also resent them to a second socket node. * * @author Ceki Gülcü * @author Sébastien Pennec * * @since 0.8.4 */ public class SocketNode implements Runnable { Socket socket; AccessContext context; ObjectInputStream ois; public SocketNode(Socket socket, AccessContext context) { this.socket = socket; this.context = context; try { ois = new ObjectInputStream(new BufferedInputStream(socket .getInputStream())); } catch (Exception e) { System.out.println("Could not open ObjectInputStream to " + socket + e); } } public void run() { IAccessEvent event; try { while (true) { // read an event from the wire event = (IAccessEvent) ois.readObject(); //check that the event should be logged if (context.getFilterChainDecision(event) == FilterReply.DENY) { break; } //send it to the appenders context.callAppenders(event); } } catch (java.io.EOFException e) { System.out.println("Caught java.io.EOFException closing connection."); } catch (java.net.SocketException e) { System.out.println("Caught java.net.SocketException closing connection."); } catch (IOException e) { System.out.println("Caught java.io.IOException: " + e); System.out.println("Closing connection."); } catch (Exception e) { System.out.println("Unexpected exception. Closing connection." + e); } try { ois.close(); } catch (Exception e) { System.out.println("Could not close connection." + e); } } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/net/server/0000755000175000017500000000000012203357067026611 5ustar drazzibdrazziblogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/net/server/package.html0000644000175000017500000000077612136042142031072 0ustar drazzibdrazzib

Provides a robust appender that serves logging events to remote clients

The ServerSocketAppender listens on a configurable TCP port for connections from remote loggers. Events that are delivered to the appender are serialized and sent to each connected remote logger.

././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootlogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/net/server/SSLServerSocketAppender.javalogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/net/server/SSLServerSocketAppender0000644000175000017500000000264612136042270033214 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.net.server; import ch.qos.logback.access.net.AccessEventPreSerializationTransformer; import ch.qos.logback.access.spi.IAccessEvent; import ch.qos.logback.core.net.server.SSLServerSocketAppenderBase; import ch.qos.logback.core.spi.PreSerializationTransformer; /** * An appender that listens on a TCP port for connections from remote * loggers. Each event delivered to this appender is delivered to all * connected remote loggers. * * @author Carl Harris */ public class SSLServerSocketAppender extends SSLServerSocketAppenderBase { private static final PreSerializationTransformer pst = new AccessEventPreSerializationTransformer(); @Override protected void postProcessEvent(IAccessEvent event) { event.prepareForDeferredProcessing(); } @Override protected PreSerializationTransformer getPST() { return pst; } } ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootlogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/net/server/ServerSocketAppender.javalogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/net/server/ServerSocketAppender.ja0000644000175000017500000000264512140555240033223 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.net.server; import ch.qos.logback.access.net.AccessEventPreSerializationTransformer; import ch.qos.logback.access.spi.IAccessEvent; import ch.qos.logback.core.net.server.AbstractServerSocketAppender; import ch.qos.logback.core.spi.PreSerializationTransformer; /** * An appender that listens on a TCP port for connections from remote * loggers. Each event delivered to this appender is delivered to all * connected remote loggers. * * @author Carl Harris */ public class ServerSocketAppender extends AbstractServerSocketAppender { private static final PreSerializationTransformer pst = new AccessEventPreSerializationTransformer(); @Override protected void postProcessEvent(IAccessEvent event) { event.prepareForDeferredProcessing(); } @Override protected PreSerializationTransformer getPST() { return pst; } } ././@LongLink0000000000000000000000000000016200000000000011564 Lustar rootrootlogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/net/AccessEventPreSerializationTransformer.javalogback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/net/AccessEventPreSerializationTra0000644000175000017500000000207112136042270033275 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.net; import java.io.Serializable; import ch.qos.logback.access.spi.AccessEvent; import ch.qos.logback.access.spi.IAccessEvent; import ch.qos.logback.core.spi.PreSerializationTransformer; public class AccessEventPreSerializationTransformer implements PreSerializationTransformer { public Serializable transform(IAccessEvent event) { if (event instanceof AccessEvent) { return (AccessEvent)event; } else { throw new IllegalArgumentException("Unsupported type "+event.getClass().getName()); } } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/net/SMTPAppender.java0000644000175000017500000000544512136042270030410 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.net; import ch.qos.logback.access.PatternLayout; import ch.qos.logback.access.spi.IAccessEvent; import ch.qos.logback.core.Layout; import ch.qos.logback.core.boolex.EventEvaluator; import ch.qos.logback.core.helpers.CyclicBuffer; import ch.qos.logback.core.net.SMTPAppenderBase; /** * Send an e-mail when a specific access event occurs, typically when * certain pages are accessed. * * For more information about this appender, please refer to the online manual at * http://logback.qos.ch/manual/appenders.html#AccessSMTPAppender *

* @author Ceki Gülcü * @author Sébastien Pennec * */ public class SMTPAppender extends SMTPAppenderBase { static final String DEFAULT_SUBJECT_PATTERN = "%m"; /** * The default constructor will instantiate the appender with a * {@link EventEvaluator} that will trigger on events with level * ERROR or higher. */ public SMTPAppender() { } /** * Use evaluator passed as parameter as the {@link * EventEvaluator} for this SMTPAppender. */ public SMTPAppender(EventEvaluator evaluator) { this.eventEvaluator = evaluator; } /** * Perform SMTPAppender specific appending actions, mainly adding the event to * the appropriate cyclic buffer. */ protected void subAppend(CyclicBuffer cb, IAccessEvent event) { cb.add(event); } @Override protected void fillBuffer(CyclicBuffer cb, StringBuffer sbuf) { int len = cb.length(); for (int i = 0; i < len; i++) { // sbuf.append(MimeUtility.encodeText(layout.format(cb.getOrCreate()))); IAccessEvent event = cb.get(); sbuf.append(layout.doLayout(event)); } } @Override protected Layout makeSubjectLayout(String subjectStr) { if(subjectStr == null) { subjectStr = DEFAULT_SUBJECT_PATTERN; } PatternLayout pl = new PatternLayout(); pl.setPattern(subjectStr); pl.start(); return pl; } protected PatternLayout makeNewToPatternLayout(String toPattern) { PatternLayout pl = new PatternLayout(); pl.setPattern(toPattern); return pl; } protected boolean eventMarksEndOfLife(IAccessEvent eventObject) { return false; } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/net/SimpleSocketServer.java0000644000175000017500000000561512136042270031736 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.net; import java.net.ServerSocket; import java.net.Socket; import ch.qos.logback.access.joran.JoranConfigurator; import ch.qos.logback.access.spi.AccessContext; import ch.qos.logback.core.joran.spi.JoranException; import ch.qos.logback.core.util.StatusPrinter; /** * A simple {@link SocketNode} based server. * *

 *     <b>Usage:</b> java ch.qos.logback.access.net.SimpleSocketServer port configFile
 *    
 *     where
 * 
 * port
 * 
 *     is a part number where the server listens and
 * 
 * configFile
 * 
 *     is an xml configuration file fed to {@link JoranConfigurator}.
 * 
* * @author Ceki Gülcü * @author Sébastien Pennec * * @since 0.8.4 */ public class SimpleSocketServer { static int port; private static AccessContext basicContext; public static void main(String argv[]) throws Exception { if (argv.length == 2) { init(argv[0], argv[1]); } else { usage("Wrong number of arguments."); } runServer(); } static void runServer() { try { System.out.println("Listening on port " + port); ServerSocket serverSocket = new ServerSocket(port); while (true) { System.out.println("Waiting to accept a new client."); Socket socket = serverSocket.accept(); System.out.println("Connected to client at " + socket.getInetAddress()); System.out.println("Starting new socket node."); new Thread(new SocketNode(socket, basicContext)).start(); } } catch (Exception e) { e.printStackTrace(); } } static void usage(String msg) { System.err.println(msg); System.err.println("Usage: java " + SimpleSocketServer.class.getName() + " port configFile"); System.exit(1); } static void init(String portStr, String configFile) throws JoranException { try { port = Integer.parseInt(portStr); } catch (java.lang.NumberFormatException e) { e.printStackTrace(); usage("Could not interpret port number [" + portStr + "]."); } basicContext = new AccessContext(); if (configFile.endsWith(".xml")) { JoranConfigurator configurator = new JoranConfigurator(); configurator.setContext(basicContext); configurator.doConfigure(configFile); StatusPrinter.print(basicContext); } } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/net/SocketAppender.java0000644000175000017500000000363712143151241031053 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ // Contributors: Dan MacDonald package ch.qos.logback.access.net; import java.net.InetAddress; import ch.qos.logback.access.spi.IAccessEvent; import ch.qos.logback.core.net.AbstractSocketAppender; import ch.qos.logback.core.spi.PreSerializationTransformer; /** * Sends {@link IAccessEvent} objects to a remote a log server, usually a * {@link SocketNode}. * * For more information about this appender, please refer to the online manual at * http://logback.qos.ch/manual/appenders.html#AccessSocketAppender * * @author Ceki Gülcü * @author Sébastien Pennec * */ public class SocketAppender extends AbstractSocketAppender { PreSerializationTransformer pst = new AccessEventPreSerializationTransformer(); public SocketAppender() { } /** * Connects to remote server at address and port. */ @Deprecated public SocketAppender(InetAddress address, int port) { super(address.getHostAddress(), port); } /** * Connects to remote server at host and port. */ @Deprecated public SocketAppender(String host, int port) { super(host, port); } @Override protected void postProcessEvent(IAccessEvent event) { event.prepareForDeferredProcessing(); } public PreSerializationTransformer getPST() { return pst; } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/net/SSLSocketAppender.java0000644000175000017500000000345412143151241031432 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.net; import java.net.InetAddress; import ch.qos.logback.access.spi.IAccessEvent; import ch.qos.logback.core.net.AbstractSSLSocketAppender; import ch.qos.logback.core.spi.PreSerializationTransformer; /** * A {@link SocketAppender} that supports SSL. *

* For more information on this appender, please refer to the online manual * at http://logback.qos.ch/manual/appenders.html#SSLSocketAppender * * @author Carl Harris */ public class SSLSocketAppender extends AbstractSSLSocketAppender { private final PreSerializationTransformer pst = new AccessEventPreSerializationTransformer(); public SSLSocketAppender() { } /** * Connects to remote server at address and port. */ @Deprecated public SSLSocketAppender(String host, int port) { super(host, port); } /** * Connects to remote server at address and port. */ @Deprecated public SSLSocketAppender(InetAddress address, int port) { super(address.getHostAddress(), port); } @Override protected void postProcessEvent(IAccessEvent event) { event.prepareForDeferredProcessing(); } public PreSerializationTransformer getPST() { return pst; } } logback_1.0.13/logback-access/src/main/java/ch/qos/logback/access/PatternLayout.java0000644000175000017500000002223112136042270030163 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access; import java.util.HashMap; import java.util.Map; import ch.qos.logback.access.pattern.ContentLengthConverter; import ch.qos.logback.access.pattern.DateConverter; import ch.qos.logback.access.pattern.EnsureLineSeparation; import ch.qos.logback.access.pattern.FullRequestConverter; import ch.qos.logback.access.pattern.FullResponseConverter; import ch.qos.logback.access.pattern.LineSeparatorConverter; import ch.qos.logback.access.pattern.LocalIPAddressConverter; import ch.qos.logback.access.pattern.LocalPortConverter; import ch.qos.logback.access.pattern.NAConverter; import ch.qos.logback.access.pattern.RemoteHostConverter; import ch.qos.logback.access.pattern.RemoteIPAddressConverter; import ch.qos.logback.access.pattern.RemoteUserConverter; import ch.qos.logback.access.pattern.RequestAttributeConverter; import ch.qos.logback.access.pattern.RequestContentConverter; import ch.qos.logback.access.pattern.RequestCookieConverter; import ch.qos.logback.access.pattern.RequestHeaderConverter; import ch.qos.logback.access.pattern.RequestMethodConverter; import ch.qos.logback.access.pattern.RequestParameterConverter; import ch.qos.logback.access.pattern.RequestProtocolConverter; import ch.qos.logback.access.pattern.RequestURIConverter; import ch.qos.logback.access.pattern.RequestURLConverter; import ch.qos.logback.access.pattern.ResponseContentConverter; import ch.qos.logback.access.pattern.ResponseHeaderConverter; import ch.qos.logback.access.pattern.ServerNameConverter; import ch.qos.logback.access.pattern.StatusCodeConverter; import ch.qos.logback.access.spi.IAccessEvent; import ch.qos.logback.core.pattern.PatternLayoutBase; import ch.qos.logback.core.pattern.color.*; import ch.qos.logback.core.pattern.parser.Parser; /** *

* This class is a module-specific implementation of * {@link ch.qos.logback.access.PatternLayout} to allow http-specific patterns * to be used. The ch.qos.logback.access.PatternLayout provides a * way to format the logging output that is just as easy and flexible as the * usual PatternLayout. *

*

* For more information about this layout, please refer to the online manual at * http://logback.qos.ch/manual/layouts.html#AccessPatternLayout * * @author Ceki Gülcü * @author Sébastien Pennec */ public class PatternLayout extends PatternLayoutBase { public static final Map defaultConverterMap = new HashMap(); public static final String HEADER_PREFIX = "#logback.access pattern: "; public static final String CLF_PATTERN = "%h %l %u [%t] \"%r\" %s %b"; public static final String CLF_PATTERN_NAME = "common"; public static final String CLF_PATTERN_NAME_2 = "clf"; public static final String COMBINED_PATTERN = "%h %l %u [%t] \"%r\" %s %b \"%i{Referer}\" \"%i{User-Agent}\""; public static final String COMBINED_PATTERN_NAME = "combined"; static { defaultConverterMap.putAll(Parser.DEFAULT_COMPOSITE_CONVERTER_MAP); defaultConverterMap.put("a", RemoteIPAddressConverter.class.getName()); defaultConverterMap.put("remoteIP", RemoteIPAddressConverter.class .getName()); defaultConverterMap.put("A", LocalIPAddressConverter.class.getName()); defaultConverterMap.put("localIP", LocalIPAddressConverter.class.getName()); defaultConverterMap.put("b", ContentLengthConverter.class.getName()); defaultConverterMap.put("B", ContentLengthConverter.class.getName()); defaultConverterMap .put("bytesSent", ContentLengthConverter.class.getName()); defaultConverterMap.put("h", RemoteHostConverter.class.getName()); defaultConverterMap.put("clientHost", RemoteHostConverter.class.getName()); defaultConverterMap.put("H", RequestProtocolConverter.class.getName()); defaultConverterMap.put("protocol", RequestProtocolConverter.class .getName()); defaultConverterMap.put("i", RequestHeaderConverter.class.getName()); defaultConverterMap.put("header", RequestHeaderConverter.class.getName()); defaultConverterMap.put("l", NAConverter.class.getName()); defaultConverterMap.put("m", RequestMethodConverter.class.getName()); defaultConverterMap.put("requestMethod", RequestMethodConverter.class .getName()); defaultConverterMap.put("r", RequestURLConverter.class.getName()); defaultConverterMap.put("requestURL", RequestURLConverter.class.getName()); defaultConverterMap.put("s", StatusCodeConverter.class.getName()); defaultConverterMap.put("statusCode", StatusCodeConverter.class.getName()); defaultConverterMap.put("t", DateConverter.class.getName()); defaultConverterMap.put("date", DateConverter.class.getName()); defaultConverterMap.put("u", RemoteUserConverter.class.getName()); defaultConverterMap.put("user", RemoteUserConverter.class.getName()); defaultConverterMap.put("U", RequestURIConverter.class.getName()); defaultConverterMap.put("requestURI", RequestURIConverter.class.getName()); defaultConverterMap.put("v", ServerNameConverter.class.getName()); defaultConverterMap.put("server", ServerNameConverter.class.getName()); defaultConverterMap.put("localPort", LocalPortConverter.class.getName()); defaultConverterMap.put("requestAttribute", RequestAttributeConverter.class .getName()); defaultConverterMap.put("reqAttribute", RequestAttributeConverter.class .getName()); defaultConverterMap .put("reqCookie", RequestCookieConverter.class.getName()); defaultConverterMap .put("requestCookie", RequestCookieConverter.class.getName()); defaultConverterMap.put("responseHeader", ResponseHeaderConverter.class .getName()); defaultConverterMap.put("requestParameter", RequestParameterConverter.class .getName()); defaultConverterMap.put("reqParameter", RequestParameterConverter.class .getName()); defaultConverterMap.put("requestContent", RequestContentConverter.class.getName()); defaultConverterMap.put("responseContent", ResponseContentConverter.class.getName()); defaultConverterMap.put("fullRequest", FullRequestConverter.class.getName()); defaultConverterMap.put("fullResponse", FullResponseConverter.class.getName()); defaultConverterMap.put("n", LineSeparatorConverter.class.getName()); defaultConverterMap.put("black", BlackCompositeConverter.class.getName()); defaultConverterMap.put("red", RedCompositeConverter.class.getName()); defaultConverterMap.put("green", GreenCompositeConverter.class.getName()); defaultConverterMap.put("yellow", YellowCompositeConverter.class.getName()); defaultConverterMap.put("blue", BlueCompositeConverter.class.getName()); defaultConverterMap.put("magenta", MagentaCompositeConverter.class.getName()); defaultConverterMap.put("cyan", CyanCompositeConverter.class.getName()); defaultConverterMap.put("white", WhiteCompositeConverter.class.getName()); defaultConverterMap.put("gray", GrayCompositeConverter.class.getName()); defaultConverterMap.put("boldRed", BoldRedCompositeConverter.class.getName()); defaultConverterMap.put("boldGreen", BoldGreenCompositeConverter.class.getName()); defaultConverterMap.put("boldYellow", BoldYellowCompositeConverter.class.getName()); defaultConverterMap.put("boldBlue", BoldBlueCompositeConverter.class.getName()); defaultConverterMap.put("boldMagenta", BoldMagentaCompositeConverter.class.getName()); defaultConverterMap.put("boldCyan", BoldCyanCompositeConverter.class.getName()); defaultConverterMap.put("boldWhite", BoldWhiteCompositeConverter.class.getName()); } public PatternLayout() { // set a default value for pattern setPattern(CLF_PATTERN); // by default postCompileProcessor the is an EnsureLineSeparation instance this.postCompileProcessor = new EnsureLineSeparation(); } /** * Returns the default converter map for this instance. */ public Map getDefaultConverterMap() { return defaultConverterMap; } public String doLayout(IAccessEvent event) { if (!isStarted()) { return null; } return writeLoopOnConverters(event); } @Override public void start() { if (getPattern().equalsIgnoreCase(CLF_PATTERN_NAME) || getPattern().equalsIgnoreCase(CLF_PATTERN_NAME_2)) { setPattern(CLF_PATTERN); } else if (getPattern().equalsIgnoreCase(COMBINED_PATTERN_NAME)) { setPattern(COMBINED_PATTERN); } super.start(); } @Override protected String getPresentationHeaderPrefix() { return HEADER_PREFIX; } } logback_1.0.13/logback-access/src/test/0000755000175000017500000000000011506604153017564 5ustar drazzibdrazziblogback_1.0.13/logback-access/src/test/input/0000755000175000017500000000000011506604153020723 5ustar drazzibdrazziblogback_1.0.13/logback-access/src/test/input/jetty/0000755000175000017500000000000012203357067022066 5ustar drazzibdrazziblogback_1.0.13/logback-access/src/test/input/jetty/sifting.xml0000644000175000017500000000065011377016712024254 0ustar drazzibdrazzib uri REQUEST_URI NA logback_1.0.13/logback-access/src/test/input/integration/0000755000175000017500000000000011506604153023246 5ustar drazzibdrazziblogback_1.0.13/logback-access/src/test/input/integration/db/0000755000175000017500000000000012203357067023637 5ustar drazzibdrazziblogback_1.0.13/logback-access/src/test/input/integration/db/oracle11g-with-driver.xml0000644000175000017500000000072311377016712030403 0ustar drazzibdrazzib oracle.jdbc.OracleDriver jdbc:oracle:thin:@localhost:1521:orcl SCOTT SCOTT logback_1.0.13/logback-access/src/test/input/integration/db/oracle10g-with-driver.xml0000644000175000017500000000071211377016712030400 0ustar drazzibdrazzib oracle.jdbc.OracleDriver jdbc:oracle:thin:@localhost:1522:xe hr hr logback_1.0.13/logback-access/src/test/input/integration/db/postgresql-with-driver.xml0000644000175000017500000000074611377016712031035 0ustar drazzibdrazzib org.postgresql.Driver jdbc:postgresql://192.168.1.5:5432/test logback logback logback_1.0.13/logback-access/src/test/input/integration/db/mysql-with-driver.xml0000644000175000017500000000070711377016712027774 0ustar drazzibdrazzib com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/logback root logback_1.0.13/logback-access/src/test/input/integration/db/sqlserver-with-driver.xml0000644000175000017500000000077211377016712030657 0ustar drazzibdrazzib com.microsoft.sqlserver.jdbc.SQLServerDriver jdbc:sqlserver://localhost:1987;databaseName=logback; logback logback logback_1.0.13/logback-access/src/test/input/joran/0000755000175000017500000000000012203357067022040 5ustar drazzibdrazziblogback_1.0.13/logback-access/src/test/input/joran/smoke.xml0000644000175000017500000000021411377016712023675 0ustar drazzibdrazzib logback_1.0.13/logback-access/src/test/input/joran/conditional/0000755000175000017500000000000012203357067024343 5ustar drazzibdrazziblogback_1.0.13/logback-access/src/test/input/joran/conditional/conditionalConsole_ELSE.xml0000644000175000017500000000076211652525101031521 0ustar drazzibdrazzib %h %l %u %user %date "%r" %s %b logback_1.0.13/logback-access/src/test/input/joran/conditional/conditionalConsole.xml0000644000175000017500000000055611652525101030712 0ustar drazzibdrazzib %h %l %u %user %date "%r" %s %b logback_1.0.13/logback-access/src/test/input/joran/defaultLayout.xml0000644000175000017500000000055211377016712025406 0ustar drazzibdrazzib %requestMethod logback_1.0.13/logback-access/src/test/java/0000755000175000017500000000000011506604153020505 5ustar drazzibdrazziblogback_1.0.13/logback-access/src/test/java/ch/0000755000175000017500000000000011506604153021077 5ustar drazzibdrazziblogback_1.0.13/logback-access/src/test/java/ch/qos/0000755000175000017500000000000011506604153021701 5ustar drazzibdrazziblogback_1.0.13/logback-access/src/test/java/ch/qos/logback/0000755000175000017500000000000011506604153023303 5ustar drazzibdrazziblogback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/0000755000175000017500000000000012203357067024550 5ustar drazzibdrazziblogback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/testUtil/0000755000175000017500000000000012203357067026365 5ustar drazzibdrazzib././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootlogback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/testUtil/NotifyingListAppender.javalogback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/testUtil/NotifyingListAppender.jav0000644000175000017500000000166312136042271033347 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.testUtil; import java.util.ArrayList; import java.util.List; import ch.qos.logback.access.spi.IAccessEvent; import ch.qos.logback.core.AppenderBase; public class NotifyingListAppender extends AppenderBase { public List list = new ArrayList(); protected void append(IAccessEvent e) { list.add(e); synchronized (this) { this.notify(); } } } logback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/jetty/0000755000175000017500000000000012203357067025707 5ustar drazzibdrazziblogback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/jetty/JettyFixtureBase.java0000644000175000017500000000572612136042270032015 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.jetty; import org.eclipse.jetty.server.Connector; import org.eclipse.jetty.server.Request; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.handler.AbstractHandler; import org.eclipse.jetty.server.handler.HandlerList; import org.eclipse.jetty.server.handler.RequestLogHandler; import org.eclipse.jetty.server.nio.SelectChannelConnector; import org.eclipse.jetty.util.ByteArrayISO8859Writer; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.OutputStream; public class JettyFixtureBase { final protected RequestLogImpl requestLogImpl; protected Handler handler = new BasicHandler(); private final int port; Server server; protected String url; public JettyFixtureBase(RequestLogImpl impl, int port) { requestLogImpl = impl; this.port = port; url = "http://localhost:" + port + "/"; } public String getName() { return "Jetty Test Setup"; } public String getUrl() { return url; } public void start() throws Exception { server = new Server(); Connector connector = new SelectChannelConnector(); connector.setPort(port); server.setConnectors(new Connector[]{connector}); RequestLogHandler requestLogHandler = new RequestLogHandler(); configureRequestLogImpl(); requestLogHandler.setRequestLog(requestLogImpl); HandlerList handlers = new HandlerList(); handlers.addHandler(requestLogHandler); handlers.addHandler(getRequestHandler()); server.setHandler(handlers); server.start(); } public void stop() throws Exception { server.stop(); server = null; } protected void configureRequestLogImpl() { requestLogImpl.start(); } protected Handler getRequestHandler() { return handler; } class BasicHandler extends AbstractHandler { public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { OutputStream out = response.getOutputStream(); ByteArrayISO8859Writer writer = new ByteArrayISO8859Writer(); writer.write("hello world"); writer.flush(); response.setContentLength(writer.size()); writer.writeTo(out); out.flush(); baseRequest.setHandled(true); } } } logback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/jetty/JettyBasicTest.java0000644000175000017500000001014712136042270031446 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.jetty; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.HttpURLConnection; import java.net.URL; import ch.qos.logback.access.spi.IAccessEvent; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import ch.qos.logback.access.spi.Util; import ch.qos.logback.access.testUtil.NotifyingListAppender; import ch.qos.logback.core.testUtil.RandomUtil; public class JettyBasicTest { static RequestLogImpl REQYEST_LOG_IMPL; static JettyFixtureWithListAndConsoleAppenders JETTY_FIXTURE; static int RANDOM_SERVER_PORT = RandomUtil.getRandomServerPort(); @BeforeClass static public void startServer() throws Exception { REQYEST_LOG_IMPL = new RequestLogImpl(); JETTY_FIXTURE = new JettyFixtureWithListAndConsoleAppenders(REQYEST_LOG_IMPL, RANDOM_SERVER_PORT); JETTY_FIXTURE.start(); } @AfterClass static public void stopServer() throws Exception { if (JETTY_FIXTURE != null) { JETTY_FIXTURE.stop(); } } @Test public void getRequest() throws Exception { URL url = new URL("http://localhost:" + RANDOM_SERVER_PORT + "/"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setDoInput(true); String result = Util.readToString(connection.getInputStream()); assertEquals("hello world", result); NotifyingListAppender listAppender = (NotifyingListAppender) REQYEST_LOG_IMPL .getAppender("list"); listAppender.list.clear(); } @Test public void eventGoesToAppenders() throws Exception { URL url = new URL(JETTY_FIXTURE.getUrl()); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setDoInput(true); String result = Util.readToString(connection.getInputStream()); assertEquals("hello world", result); NotifyingListAppender listAppender = (NotifyingListAppender) REQYEST_LOG_IMPL .getAppender("list"); synchronized (listAppender) { listAppender.wait(100); } assertTrue(listAppender.list.size() > 0); IAccessEvent event = listAppender.list.get(0); assertEquals("127.0.0.1", event.getRemoteHost()); assertEquals("localhost", event.getServerName()); listAppender.list.clear(); } @Test public void postContentConverter() throws Exception { URL url = new URL(JETTY_FIXTURE.getUrl()); String msg = "test message"; HttpURLConnection connection = (HttpURLConnection) url.openConnection(); // this line is necessary to make the stream aware of when the message is // over. connection.setFixedLengthStreamingMode(msg.getBytes().length); ((HttpURLConnection) connection).setRequestMethod("POST"); connection.setDoOutput(true); connection.setDoInput(true); connection.setUseCaches(false); connection.setRequestProperty("Content-Type", "text/plain"); PrintWriter output = new PrintWriter(new OutputStreamWriter(connection .getOutputStream())); output.print(msg); output.flush(); output.close(); // StatusPrinter.print(requestLogImpl.getStatusManager()); NotifyingListAppender listAppender = (NotifyingListAppender) REQYEST_LOG_IMPL .getAppender("list"); synchronized (listAppender) { listAppender.wait(100); } @SuppressWarnings("unused") IAccessEvent event = listAppender.list.get(0); // we should test the contents of the requests // assertEquals(msg, event.getRequestContent()); } } ././@LongLink0000000000000000000000000000016500000000000011567 Lustar rootrootlogback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/jetty/JettyFixtureWithListAndConsoleAppenders.javalogback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/jetty/JettyFixtureWithListAndConso0000644000175000017500000000351312136042270033407 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.jetty; import ch.qos.logback.access.spi.IAccessEvent; import ch.qos.logback.access.PatternLayoutEncoder; import ch.qos.logback.access.testUtil.NotifyingListAppender; import ch.qos.logback.core.ConsoleAppender; public class JettyFixtureWithListAndConsoleAppenders extends JettyFixtureBase { public JettyFixtureWithListAndConsoleAppenders(RequestLogImpl impl, int port) { super(impl, port); url = "http://localhost:" + port + "/"; } public void start() throws Exception { super.start(); Thread.yield(); } public void stop() throws Exception { super.stop(); Thread.sleep(500); } @Override protected void configureRequestLogImpl() { NotifyingListAppender appender = new NotifyingListAppender(); appender.setContext(requestLogImpl); appender.setName("list"); appender.start(); ConsoleAppender console = new ConsoleAppender(); console.setContext(requestLogImpl); console.setName("console"); PatternLayoutEncoder layout = new PatternLayoutEncoder(); layout.setContext(requestLogImpl); layout.setPattern("%date %server %clientHost"); console.setEncoder(layout); layout.start(); console.start(); requestLogImpl.addAppender(appender); requestLogImpl.addAppender(console); } } logback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/jetty/PackageTest.java0000644000175000017500000000133712136042270030741 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.jetty; import org.junit.runner.RunWith; import org.junit.runners.Suite; import org.junit.runners.Suite.SuiteClasses; @RunWith(Suite.class) @SuiteClasses({JettyBasicTest.class}) public class PackageTest { }logback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/pattern/0000755000175000017500000000000012203357067026225 5ustar drazzibdrazziblogback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/pattern/ConverterTest.java0000644000175000017500000001441612136042270031675 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.pattern; import static org.junit.Assert.assertEquals; import java.util.ArrayList; import java.util.List; import javax.servlet.http.Cookie; import ch.qos.logback.access.spi.IAccessEvent; import org.junit.After; import org.junit.Before; import org.junit.Test; import ch.qos.logback.access.dummy.DummyRequest; import ch.qos.logback.access.dummy.DummyResponse; import ch.qos.logback.access.dummy.DummyServerAdapter; import ch.qos.logback.access.spi.AccessEvent; public class ConverterTest { IAccessEvent event; DummyRequest request; DummyResponse response; @Before public void setUp() throws Exception { request = new DummyRequest(); response = new DummyResponse(); event = createEvent(); } @After public void tearDown() throws Exception { event = null; request = null; response = null; } @Test public void testContentLengthConverter() { ContentLengthConverter converter = new ContentLengthConverter(); converter.start(); String result = converter.convert(event); assertEquals(Long.toString(event.getServerAdapter().getContentLength()), result); } @Test public void testDateConverter() { DateConverter converter = new DateConverter(); converter.start(); String result = converter.convert(event); assertEquals(converter.cachingDateFormatter.format(event.getTimeStamp()), result); } public void testLineLocalPortConverter() { LocalPortConverter converter = new LocalPortConverter(); converter.start(); String result = converter.convert(event); assertEquals(Integer.toString(request.getLocalPort()), result); } @Test public void testRemoteHostConverter() { RemoteHostConverter converter = new RemoteHostConverter(); converter.start(); String result = converter.convert(event); assertEquals(request.getRemoteHost(), result); } @Test public void testRemoteIPAddressConverter() { RemoteIPAddressConverter converter = new RemoteIPAddressConverter(); converter.start(); String result = converter.convert(event); assertEquals(request.getRemoteAddr(), result); } @Test public void testRemoteUserConverter() { RemoteUserConverter converter = new RemoteUserConverter(); converter.start(); String result = converter.convert(event); assertEquals(request.getRemoteUser(), result); } @Test public void testRequestAttributeConverter() { RequestAttributeConverter converter = new RequestAttributeConverter(); List optionList = new ArrayList(); optionList.add("testKey"); converter.setOptionList(optionList); converter.start(); String result = converter.convert(event); assertEquals(request.getAttribute("testKey"), result); } @Test public void testRequestCookieConverter() { RequestCookieConverter converter = new RequestCookieConverter(); List optionList = new ArrayList(); optionList.add("testName"); converter.setOptionList(optionList); converter.start(); String result = converter.convert(event); Cookie cookie = request.getCookies()[0]; assertEquals(cookie.getValue(), result); } @Test public void testRequestHeaderConverter() { RequestHeaderConverter converter = new RequestHeaderConverter(); List optionList = new ArrayList(); optionList.add("headerName1"); converter.setOptionList(optionList); converter.start(); String result = converter.convert(event); assertEquals(request.getHeader("headerName1"), result); } @Test public void testRequestMethodConverter() { RequestMethodConverter converter = new RequestMethodConverter(); converter.start(); String result = converter.convert(event); assertEquals(request.getMethod(), result); } @Test public void testRequestProtocolConverter() { RequestProtocolConverter converter = new RequestProtocolConverter(); converter.start(); String result = converter.convert(event); assertEquals(request.getProtocol(), result); } @Test public void testRequestURIConverter() { RequestURIConverter converter = new RequestURIConverter(); converter.start(); String result = converter.convert(event); assertEquals(request.getRequestURI(), result); } @Test public void testRequestURLConverter() { RequestURLConverter converter = new RequestURLConverter(); converter.start(); String result = converter.convert(event); String expected = request.getMethod() + " " + request.getRequestURI() + " " + request.getProtocol(); assertEquals(expected, result); } @Test public void testResponseHeaderConverter() { ResponseHeaderConverter converter = new ResponseHeaderConverter(); List optionList = new ArrayList(); optionList.add("headerName1"); converter.setOptionList(optionList); converter.start(); String result = converter.convert(event); assertEquals(request.getHeader("headerName1"), result); } @Test public void testServerNameConverter() { ServerNameConverter converter = new ServerNameConverter(); converter.start(); String result = converter.convert(event); assertEquals(request.getServerName(), result); } @Test public void testStatusCodeConverter() { StatusCodeConverter converter = new StatusCodeConverter(); converter.start(); String result = converter.convert(event); assertEquals(Integer.toString(event.getServerAdapter().getStatusCode()), result); } private IAccessEvent createEvent() { DummyServerAdapter dummyAdapter = new DummyServerAdapter(request, response); return new AccessEvent(request, response, dummyAdapter); } } logback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/pattern/PackageTest.java0000644000175000017500000000134212136042270031253 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.pattern; import org.junit.runner.RunWith; import org.junit.runners.Suite; import org.junit.runners.Suite.SuiteClasses; @RunWith(Suite.class) @SuiteClasses({ConverterTest.class}) public class PackageTest { }logback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/AllAccessTest.java0000644000175000017500000000235312136042270030100 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access; import org.junit.runner.RunWith; import org.junit.runners.Suite; import org.junit.runners.Suite.SuiteClasses; @RunWith(Suite.class) @SuiteClasses({ch.qos.logback.access.spi.PackageTest.class, ch.qos.logback.access.boolex.PackageTest.class, ch.qos.logback.access.net.PackageTest.class, ch.qos.logback.access.db.PackageTest.class, ch.qos.logback.access.pattern.PackageTest.class, ch.qos.logback.access.joran.PackageTest.class, ch.qos.logback.access.jetty.PackageTest.class, ch.qos.logback.access.filter.PackageTest.class, ch.qos.logback.access.servlet.PackageTest.class, ch.qos.logback.access.sift.PackageTest.class}) public class AllAccessTest { } logback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/servlet/0000755000175000017500000000000012203357067026234 5ustar drazzibdrazziblogback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/servlet/PackageTest.java0000644000175000017500000000142012136042270031257 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.servlet; import junit.framework.TestCase; import org.junit.runner.RunWith; import org.junit.runners.Suite; import org.junit.runners.Suite.SuiteClasses; @RunWith(Suite.class) @SuiteClasses({TeeFilterTest.class}) public class PackageTest extends TestCase { }logback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/servlet/TeeFilterTest.java0000644000175000017500000000453012136042270031614 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.servlet; import org.junit.Test; import java.util.Arrays; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertEquals; public class TeeFilterTest { @Test public void extractNameList() { assertEquals(Arrays.asList(new String[]{"a"}), TeeFilter.extractNameList("a")); assertEquals(Arrays.asList(new String[]{"a", "b"}), TeeFilter.extractNameList("a, b")); assertEquals(Arrays.asList(new String[]{"a", "b"}), TeeFilter.extractNameList("a; b")); assertEquals(Arrays.asList(new String[]{"a", "b", "c"}), TeeFilter.extractNameList("a; b, c")); } @Test public void defaultCase() { assertTrue(TeeFilter.computeActivation("somehost", "", "")); assertTrue(TeeFilter.computeActivation("somehost", null, null)); } @Test public void withIncludesOnly() { assertTrue(TeeFilter.computeActivation("a", "a", null)); assertTrue(TeeFilter.computeActivation("a", "a, b", null)); assertFalse(TeeFilter.computeActivation("a", "b", null)); assertFalse(TeeFilter.computeActivation("a", "b, c", null)); } @Test public void withExcludesOnly() { assertFalse(TeeFilter.computeActivation("a", null, "a")); assertFalse(TeeFilter.computeActivation("a", null, "a, b")); assertTrue(TeeFilter.computeActivation("a", null, "b")); assertTrue(TeeFilter.computeActivation("a", null, "b, c")); } @Test public void withIncludesAndExcludes() { assertFalse(TeeFilter.computeActivation("a", "a", "a")); assertTrue(TeeFilter.computeActivation("a", "a", "b")); assertFalse(TeeFilter.computeActivation("a", "b", "a")); assertFalse(TeeFilter.computeActivation("a", "b", "b")); } } logback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/sift/0000755000175000017500000000000012203357067025515 5ustar drazzibdrazziblogback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/sift/PackageTest.java0000644000175000017500000000134312136042270030544 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.sift; import org.junit.runner.RunWith; import org.junit.runners.Suite; import org.junit.runners.Suite.SuiteClasses; @RunWith(Suite.class) @SuiteClasses({SiftingAppenderTest.class}) public class PackageTest { }logback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/sift/SiftingAppenderTest.java0000644000175000017500000000572312136246004032302 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.sift; import static org.junit.Assert.assertEquals; import java.net.HttpURLConnection; import java.net.URL; import java.util.LinkedHashSet; import java.util.Set; import ch.qos.logback.access.jetty.JettyFixtureBase; import org.junit.After; import org.junit.Before; import org.junit.Test; import ch.qos.logback.access.jetty.RequestLogImpl; import ch.qos.logback.access.spi.IAccessEvent; import ch.qos.logback.access.spi.Util; import ch.qos.logback.core.read.ListAppender; import ch.qos.logback.core.testUtil.RandomUtil; import ch.qos.logback.core.util.StatusPrinter; public class SiftingAppenderTest { static final String PREFIX = "src/test/input/jetty/"; static int RANDOM_SERVER_PORT = RandomUtil.getRandomServerPort(); JettyFixtureBase jettyFixture; RequestLogImpl rli = new RequestLogImpl(); @Before public void startServer() throws Exception { jettyFixture = new JettyFixtureBase(rli, RANDOM_SERVER_PORT); } @After public void stopServer() throws Exception { if (jettyFixture != null) { jettyFixture.stop(); } } @Test public void invokingDifferentPathShouldBeSiftedAccordingly() throws Exception { rli.setFileName(PREFIX + "sifting.xml"); jettyFixture.start(); invokeServer("/"); invokeServer("/x"); invokeServer("/x"); invokeServer("/y"); StatusPrinter.print(rli); SiftingAppender siftingAppender = (SiftingAppender) rli .getAppender("SIFTING"); Set keySet = siftingAppender.getAppenderTracker().allKeys(); assertEquals(3, keySet.size()); Set witnessSet = new LinkedHashSet(); witnessSet.add("NA"); witnessSet.add("x"); witnessSet.add("y"); assertEquals(witnessSet, keySet); check(siftingAppender, "NA", 1); check(siftingAppender, "x", 2); check(siftingAppender, "y", 1); } private void check(SiftingAppender siftingAppender, String key, int expectedCount) { ListAppender listAppender = (ListAppender) siftingAppender .getAppenderTracker().find(key); assertEquals(expectedCount, listAppender.list.size()); } void invokeServer(String uri) throws Exception { URL url = new URL("http://localhost:" + RANDOM_SERVER_PORT + uri); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setDoInput(true); Util.readToString(connection.getInputStream()); Thread.sleep(10); } } logback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/dummy/0000755000175000017500000000000012203357067025703 5ustar drazzibdrazziblogback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/dummy/DummyRequest.java0000644000175000017500000001660012136042270031205 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.dummy; import java.io.BufferedReader; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.security.Principal; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; import ch.qos.logback.access.AccessConstants; public class DummyRequest implements HttpServletRequest { public final static String DUMMY_CONTENT_STRING = "request contents"; public final static byte[] DUMMY_CONTENT_BYTES = DUMMY_CONTENT_STRING.getBytes(); public static final String DUMMY_RESPONSE_CONTENT_STRING = "response contents"; public static final byte[] DUMMY_RESPONSE_CONTENT_BYTES =DUMMY_RESPONSE_CONTENT_STRING.getBytes(); Hashtable headerNames; String uri; public DummyRequest() { headerNames = new Hashtable(); headerNames.put("headerName1", "headerValue1"); headerNames.put("headerName2", "headerValue2"); } public String getAuthType() { return null; } public String getContextPath() { return null; } public Cookie[] getCookies() { Cookie cookie = new Cookie("testName", "testCookie"); return new Cookie[] { cookie }; } public long getDateHeader(String arg0) { return 0; } public String getHeader(String key) { return headerNames.get(key); } public Enumeration getHeaderNames() { return headerNames.keys(); } public Enumeration getHeaders(String arg0) { return null; } public int getIntHeader(String arg0) { return 0; } public String getMethod() { return "testMethod"; } public String getPathInfo() { return null; } public String getPathTranslated() { return null; } public String getQueryString() { return null; } public String getRemoteUser() { return "testUser"; } public String getRequestURI() { return uri; } public StringBuffer getRequestURL() { return new StringBuffer(uri); } public String getRequestedSessionId() { return null; } public String getServletPath() { return null; } public HttpSession getSession() { return null; } public HttpSession getSession(boolean arg0) { return null; } public Principal getUserPrincipal() { return null; } public boolean isRequestedSessionIdFromCookie() { return false; } public boolean isRequestedSessionIdFromURL() { return false; } public boolean isRequestedSessionIdFromUrl() { return false; } public boolean authenticate(HttpServletResponse response) throws IOException, ServletException { return false; //To change body of implemented methods use File | Settings | File Templates. } public void login(String username, String password) throws ServletException { //To change body of implemented methods use File | Settings | File Templates. } public void logout() throws ServletException { //To change body of implemented methods use File | Settings | File Templates. } public Collection getParts() throws IOException, IllegalStateException, ServletException { return null; //To change body of implemented methods use File | Settings | File Templates. } public Part getPart(String name) throws IOException, IllegalStateException, ServletException { return null; //To change body of implemented methods use File | Settings | File Templates. } public boolean isRequestedSessionIdValid() { return false; } public boolean isUserInRole(String arg0) { return false; } public Object getAttribute(String key) { if (key.equals("testKey")) { return "testKey"; } else if (AccessConstants.LB_INPUT_BUFFER.equals(key)) { return DUMMY_CONTENT_BYTES; } else if (AccessConstants.LB_OUTPUT_BUFFER.equals(key)) { return DUMMY_RESPONSE_CONTENT_BYTES; } else { return null; } } public Enumeration getAttributeNames() { return null; } public String getCharacterEncoding() { return null; } public int getContentLength() { return 0; } public String getContentType() { return null; } public ServletInputStream getInputStream() throws IOException { return null; } public String getLocalAddr() { return null; } public String getLocalName() { return null; } public int getLocalPort() { return 11; } public ServletContext getServletContext() { return null; //To change body of implemented methods use File | Settings | File Templates. } public AsyncContext startAsync() { return null; //To change body of implemented methods use File | Settings | File Templates. } public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse) { return null; //To change body of implemented methods use File | Settings | File Templates. } public boolean isAsyncStarted() { return false; //To change body of implemented methods use File | Settings | File Templates. } public boolean isAsyncSupported() { return false; //To change body of implemented methods use File | Settings | File Templates. } public AsyncContext getAsyncContext() { return null; //To change body of implemented methods use File | Settings | File Templates. } public DispatcherType getDispatcherType() { return null; //To change body of implemented methods use File | Settings | File Templates. } public Locale getLocale() { return null; } public Enumeration getLocales() { return null; } public String getParameter(String arg0) { return null; } public Map getParameterMap() { return null; } public Enumeration getParameterNames() { return null; } public String[] getParameterValues(String arg0) { return null; } public String getProtocol() { return "testProtocol"; } public BufferedReader getReader() throws IOException { return null; } public String getRealPath(String arg0) { return null; } public String getRemoteAddr() { return "testRemoteAddress"; } public String getRemoteHost() { return "testHost"; } public int getRemotePort() { return 0; } public RequestDispatcher getRequestDispatcher(String arg0) { return null; } public String getScheme() { return null; } public String getServerName() { return "testServerName"; } public int getServerPort() { return 0; } public boolean isSecure() { return false; } public void removeAttribute(String arg0) { } public void setAttribute(String arg0, Object arg1) { } public void setCharacterEncoding(String arg0) throws UnsupportedEncodingException { } public void setRequestUri(String uri) { this.uri = uri; } } logback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/dummy/DummyServerAdapter.java0000644000175000017500000000216712136042270032327 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.dummy; import java.util.Map; import ch.qos.logback.access.spi.ServerAdapter; public class DummyServerAdapter implements ServerAdapter { DummyRequest request; DummyResponse response; public DummyServerAdapter(DummyRequest dummyRequest, DummyResponse dummyResponse) { this.request = dummyRequest; this.response = dummyResponse; } public long getContentLength() { return response.getContentCount(); } public int getStatusCode() { return response.getStatus(); } public Map buildResponseHeaderMap() { return response.headerMap; } } logback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/dummy/DummyResponse.java0000644000175000017500000000733512136042270031360 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.dummy; import java.io.IOException; import java.io.PrintWriter; import java.util.*; import javax.servlet.ServletOutputStream; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletResponse; public class DummyResponse implements HttpServletResponse { public static final int DUMMY_DEFAULT_STATUS = 200; public static final int DUMMY_DEFAULT_CONTENT_COUNT = 1000; public static final Map DUMMY_DEFAULT_HDEADER_MAP = new HashMap(); ; static { DUMMY_DEFAULT_HDEADER_MAP.put("headerName1", "headerValue1"); DUMMY_DEFAULT_HDEADER_MAP.put("headerName2", "headerValue2"); } int status = DUMMY_DEFAULT_STATUS; public Map headerMap; public DummyResponse() { headerMap = DUMMY_DEFAULT_HDEADER_MAP; } public void addCookie(Cookie arg0) { } public void addDateHeader(String arg0, long arg1) { } public void addHeader(String arg0, String arg1) { } public void addIntHeader(String arg0, int arg1) { } public boolean containsHeader(String arg0) { return false; } public String encodeRedirectURL(String arg0) { return null; } public String encodeRedirectUrl(String arg0) { return null; } public String encodeURL(String arg0) { return null; } public String encodeUrl(String arg0) { return null; } public void sendError(int arg0) throws IOException { } public void sendError(int arg0, String arg1) throws IOException { } public void sendRedirect(String arg0) throws IOException { } public void setDateHeader(String arg0, long arg1) { } public void setHeader(String arg0, String arg1) { } public void setIntHeader(String arg0, int arg1) { } public void setStatus(int arg0, String arg1) { } public void flushBuffer() throws IOException { } public int getBufferSize() { return 0; } public String getCharacterEncoding() { return null; } public String getContentType() { return null; } public Locale getLocale() { return null; } public ServletOutputStream getOutputStream() throws IOException { return null; } public PrintWriter getWriter() throws IOException { return null; } public boolean isCommitted() { return false; } public void reset() { } public void resetBuffer() { } public void setBufferSize(int arg0) { } public void setCharacterEncoding(String arg0) { } public void setContentLength(int arg0) { } public void setContentType(String arg0) { } public void setLocale(Locale arg0) { } public String getHeader(String key) { return headerMap.get(key); } public Collection getHeaders(String name) { String val = headerMap.get(name); List list = new ArrayList(); if (val != null) list.add(val); return list; } public Collection getHeaderNames() { return headerMap.keySet(); } public long getContentCount() { return DUMMY_DEFAULT_CONTENT_COUNT; } public int getStatus() { return status; } public void setStatus(int status) { this.status = status; } } logback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/dummy/DummyAccessEventBuilder.java0000644000175000017500000000171612136042270033271 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.dummy; import ch.qos.logback.access.spi.AccessEvent; import ch.qos.logback.access.spi.IAccessEvent; public class DummyAccessEventBuilder { static public IAccessEvent buildNewAccessEvent() { DummyRequest request = new DummyRequest(); DummyResponse response = new DummyResponse(); DummyServerAdapter adapter = new DummyServerAdapter(request, response); return new AccessEvent(request, response, adapter); } } logback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/joran/0000755000175000017500000000000012203357067025661 5ustar drazzibdrazziblogback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/joran/ConditionalTest.java0000644000175000017500000000640712136042270031626 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.joran; import ch.qos.logback.access.TeztConstants; import ch.qos.logback.access.spi.AccessContext; import ch.qos.logback.core.ConsoleAppender; import ch.qos.logback.core.joran.spi.JoranException; import ch.qos.logback.core.read.ListAppender; import ch.qos.logback.core.status.StatusChecker; import ch.qos.logback.core.testUtil.RandomUtil; import ch.qos.logback.core.util.CoreTestConstants; import org.junit.Before; import org.junit.Test; import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; /** * @author Ceki Gücü */ public class ConditionalTest { AccessContext context = new AccessContext(); StatusChecker checker = new StatusChecker(context); int diff = RandomUtil.getPositiveInt(); String randomOutputDir = CoreTestConstants.OUTPUT_DIR_PREFIX + diff + "/"; @Before public void setUp() { InetAddress localhost = null; try { localhost = InetAddress.getLocalHost(); context.putProperty("aHost", localhost.getHostName()); } catch (UnknownHostException e) { e.printStackTrace(); } } void configure(String file) throws JoranException { JoranConfigurator jc = new JoranConfigurator(); jc.setContext(context); jc.doConfigure(file); } @Test public void conditionalConsoleApp_IF_THEN_True() throws JoranException, UnknownHostException { configure(TeztConstants.TEST_DIR_PREFIX + "input/joran/conditional/conditionalConsole.xml"); ConsoleAppender consoleAppender = (ConsoleAppender) context.getAppender("CON"); assertNotNull(consoleAppender); assertTrue(checker.isErrorFree(0)); } @Test public void conditionalConsoleApp_IF_THEN_False() throws JoranException, IOException, InterruptedException { context.putProperty("aHost", null); configure(TeztConstants.TEST_DIR_PREFIX + "input/joran/conditional/conditionalConsole.xml"); ConsoleAppender consoleAppender = (ConsoleAppender) context.getAppender("CON"); assertNull(consoleAppender); StatusChecker checker = new StatusChecker(context); assertTrue(checker.isErrorFree(0)); } @Test public void conditionalConsoleApp_ELSE() throws JoranException, IOException, InterruptedException { configure(TeztConstants.TEST_DIR_PREFIX + "input/joran/conditional/conditionalConsole_ELSE.xml"); ConsoleAppender consoleAppender = (ConsoleAppender) context.getAppender("CON"); assertNull(consoleAppender); ListAppender listAppender = (ListAppender) context.getAppender("LIST"); assertNotNull(listAppender); assertTrue(checker.isErrorFree(0)); } } logback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/joran/PackageTest.java0000644000175000017500000000137612136042270030716 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.joran; import org.junit.runner.RunWith; import org.junit.runners.Suite; /** * @author Ceki Gücü */ @RunWith(Suite.class) @Suite.SuiteClasses({JoranConfiguratorTest.class, ConditionalTest.class}) public class PackageTest { } logback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/joran/JoranConfiguratorTest.java0000644000175000017500000000502612136042270033013 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.joran; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import ch.qos.logback.access.spi.IAccessEvent; import org.junit.After; import org.junit.Before; import org.junit.Test; import ch.qos.logback.access.TeztConstants; import ch.qos.logback.access.dummy.DummyAccessEventBuilder; import ch.qos.logback.access.spi.AccessContext; import ch.qos.logback.core.joran.spi.JoranException; import ch.qos.logback.core.read.ListAppender; import ch.qos.logback.core.testUtil.StringListAppender; public class JoranConfiguratorTest { AccessContext context = new AccessContext(); @Before public void setUp() throws Exception { } @After public void tearDown() throws Exception { } void configure(String file) throws JoranException { JoranConfigurator jc = new JoranConfigurator(); jc.setContext(context); jc.doConfigure(file); } @Test public void smoke() throws Exception { configure(TeztConstants.TEST_DIR_PREFIX + "input/joran/smoke.xml"); ListAppender listAppender = (ListAppender) context .getAppender("LIST"); IAccessEvent event = DummyAccessEventBuilder.buildNewAccessEvent(); listAppender.doAppend(event); assertEquals(1, listAppender.list.size()); assertEquals(1, listAppender.list.size()); IAccessEvent ae = listAppender.list.get(0); assertNotNull(ae); } @Test public void defaultLayout() throws Exception { configure(TeztConstants.TEST_DIR_PREFIX + "input/joran/defaultLayout.xml"); StringListAppender listAppender = (StringListAppender) context .getAppender("STR_LIST"); IAccessEvent event = DummyAccessEventBuilder.buildNewAccessEvent(); listAppender.doAppend(event); assertEquals(1, listAppender.strList.size()); // the result contains a line separator at the end assertTrue(listAppender.strList.get(0).startsWith("testMethod")); } } logback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/boolex/0000755000175000017500000000000012203357067026040 5ustar drazzibdrazziblogback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/boolex/PackageTest.java0000644000175000017500000000143212136042270031066 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.boolex; import junit.framework.TestCase; import org.junit.runner.RunWith; import org.junit.runners.Suite; import org.junit.runners.Suite.SuiteClasses; @RunWith(Suite.class) @SuiteClasses({JaninoEventEvaluatorTest.class}) public class PackageTest extends TestCase { }././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootlogback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/boolex/JaninoEventEvaluatorTest.javalogback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/boolex/JaninoEventEvaluatorTest.ja0000644000175000017500000000505112136042270033310 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.boolex; import ch.qos.logback.access.dummy.DummyRequest; import ch.qos.logback.access.dummy.DummyResponse; import ch.qos.logback.access.dummy.DummyServerAdapter; import ch.qos.logback.access.spi.AccessEvent; import ch.qos.logback.access.spi.IAccessEvent; import ch.qos.logback.core.Context; import ch.qos.logback.core.ContextBase; import ch.qos.logback.core.boolex.EvaluationException; import org.junit.Before; import org.junit.Test; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; public class JaninoEventEvaluatorTest { final String expectedURL1 = "testUrl1"; final String expectedURL2 = "testUrl2"; Context context = new ContextBase(); JaninoEventEvaluator evaluator; DummyRequest request; DummyResponse response; DummyServerAdapter serverAdapter; @Before public void setUp() throws Exception { evaluator = new JaninoEventEvaluator(); evaluator.setContext(context); request = new DummyRequest(); response = new DummyResponse(); serverAdapter = new DummyServerAdapter(request, response); } @Test public void smoke() throws EvaluationException { evaluator.setExpression("event.getProtocol().equals(\"testProtocol\")"); evaluator.start(); IAccessEvent ae = new AccessEvent(request, response, serverAdapter); assertTrue( evaluator.evaluate(ae)); } @Test public void block() throws EvaluationException { evaluator.setExpression("String protocol = event.getProtocol();" + "return protocol.equals(\"testProtocol\");"); evaluator.start(); IAccessEvent ae = new AccessEvent(request, response, serverAdapter); assertTrue(evaluator.evaluate(ae)); } @Test public void invalidExpression() throws EvaluationException { evaluator.setExpression("return true"); evaluator.start(); IAccessEvent ae = new AccessEvent(request, response, serverAdapter); try { evaluator.evaluate(ae); fail("Was expecting an exception"); } catch (IllegalStateException e) { } } } logback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/filter/0000755000175000017500000000000012203357067026035 5ustar drazzibdrazziblogback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/filter/StatsByDayTest.java0000644000175000017500000000447212136042270031566 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.filter; import static org.junit.Assert.assertEquals; import org.junit.Test; import ch.qos.logback.core.util.TimeUtil; public class StatsByDayTest { @Test public void testBasic() { // Tue Nov 21 18:05:36 CET 2006 long now = 1164128736369L; StatsByDay statsByDay = new StatsByDay(now); int total = 0; // test fresh start statsByDay.update(now, 0); assertEquals(0, statsByDay.getLastCount()); assertEquals(0, statsByDay.getAverage(), 0.01); total++; statsByDay.update(now, total); assertEquals(0, statsByDay.getLastCount()); assertEquals(0.0, statsByDay.getAverage(), 0.01); long nextDay0 = TimeUtil.computeStartOfNextDay(now); nextDay0 += 99; // there should be one event the next day, avg should also be 1 statsByDay.update(nextDay0, total); assertEquals(1.0, statsByDay.getLastCount(), 0.01); assertEquals(1.0, statsByDay.getAverage(), 0.01); total += 2; statsByDay.update(nextDay0, total); assertEquals(1, statsByDay.getLastCount()); assertEquals(1.0, statsByDay.getAverage(), 0.01); long nextDay1 = TimeUtil.computeStartOfNextDay(nextDay0) + 6747; statsByDay.update(nextDay1, total); assertEquals(2, statsByDay.getLastCount()); assertEquals(1.5, statsByDay.getAverage(), 0.01); nextDay1 += 4444; total += 4; statsByDay.update(nextDay1, total); // values should remain unchanged assertEquals(2, statsByDay.getLastCount()); assertEquals(1.5, statsByDay.getAverage(), 0.01); long nextDay2 = TimeUtil.computeStartOfNextDay(nextDay1) + 11177; statsByDay.update(nextDay2, total); // values should remain unchanged assertEquals(4, statsByDay.getLastCount()); assertEquals(7.0 / 3, statsByDay.getAverage(), 0.01); } } logback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/filter/PackageTest.java0000644000175000017500000000142212136042270031062 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.filter; import junit.framework.TestCase; import org.junit.runner.RunWith; import org.junit.runners.Suite; import org.junit.runners.Suite.SuiteClasses; @RunWith(Suite.class) @SuiteClasses({StatsByDayTest.class}) public class PackageTest extends TestCase { }logback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/db/0000755000175000017500000000000012203357067025135 5ustar drazzibdrazziblogback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/db/DBAppenderHSQLTestFixture.java0000644000175000017500000000732012136042270032635 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.db; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; import org.hsqldb.Server; public class DBAppenderHSQLTestFixture { public static final String DRIVER_CLASS = "org.hsqldb.jdbcDriver"; String serverProps; String url; String user = "sa"; String password = ""; Server server; boolean isNetwork = true; void setUp() throws SQLException { if (isNetwork) { if (url == null) { url = "jdbc:hsqldb:hsql://localhost/test"; } server = new Server(); server.setDatabaseName(0, "test"); server.setDatabasePath(0, "mem:test;sql.enforce_strict_size=true"); server.setLogWriter(null); server.setErrWriter(null); server.setTrace(false); server.setSilent(true); server.start(); } else { if (url == null) { url = "jdbc:hsqldb:file:test;sql.enforce_strict_size=true"; } } try { Class.forName(DRIVER_CLASS); } catch (Exception e) { e.printStackTrace(); System.out.println(this + ".setUp() error: " + e.getMessage()); } Thread.yield(); createTables(); } void tearDown() throws SQLException { dropTables(); if (isNetwork) { server.stop(); server = null; } } Connection newConnection() throws SQLException { return DriverManager.getConnection(url, user, password); } private void createTables() throws SQLException { Connection conn = newConnection(); StringBuffer buf = new StringBuffer(); buf.append("CREATE TABLE access_event ("); buf.append("timestmp BIGINT NOT NULL,"); buf.append("requestURI VARCHAR(254),"); buf.append("requestURL VARCHAR(254),"); buf.append("remoteHost VARCHAR(254),"); buf.append("remoteUser VARCHAR(254),"); buf.append("remoteAddr VARCHAR(254),"); buf.append("protocol VARCHAR(254),"); buf.append("method VARCHAR(254),"); buf.append("serverName VARCHAR(254),"); buf.append("postContent VARCHAR(254),"); buf.append("event_id INT NOT NULL IDENTITY);"); query(conn, buf.toString()); buf = new StringBuffer(); buf.append("CREATE TABLE access_event_header ("); buf.append("event_id INT NOT NULL,"); buf.append("header_key VARCHAR(254) NOT NULL,"); buf.append("header_value LONGVARCHAR,"); buf.append("PRIMARY KEY(event_id, header_key),"); buf.append("FOREIGN KEY (event_id) REFERENCES access_event(event_id));"); query(conn, buf.toString()); } private void dropTables() throws SQLException { Connection conn = newConnection(); StringBuffer buf = new StringBuffer(); buf.append("DROP TABLE access_event_header IF EXISTS;"); query(conn, buf.toString()); buf = new StringBuffer(); buf.append("DROP TABLE access_event IF EXISTS;"); query(conn, buf.toString()); } private void query(Connection conn, String expression) throws SQLException { Statement st = null; st = conn.createStatement(); int i = st.executeUpdate(expression); if (i == -1) { System.out.println("db error : " + expression); } st.close(); } } logback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/db/DBAppenderHSQLTest.java0000644000175000017500000001567712136042270031304 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.db; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.fail; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import ch.qos.logback.access.spi.IAccessEvent; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import ch.qos.logback.access.dummy.DummyRequest; import ch.qos.logback.access.dummy.DummyResponse; import ch.qos.logback.access.dummy.DummyServerAdapter; import ch.qos.logback.access.spi.AccessContext; import ch.qos.logback.access.spi.AccessEvent; import ch.qos.logback.core.db.DriverManagerConnectionSource; import ch.qos.logback.core.util.StatusPrinter; public class DBAppenderHSQLTest { static DBAppenderHSQLTestFixture DB_APPENDER_HSQL_TEST_FIXTURE; AccessContext context; DBAppender appender; DriverManagerConnectionSource connectionSource; int existingEventTableRowCount; Statement stmt; @BeforeClass static public void fixtureSetUp() throws SQLException { DB_APPENDER_HSQL_TEST_FIXTURE = new DBAppenderHSQLTestFixture(); DB_APPENDER_HSQL_TEST_FIXTURE.setUp(); } @AfterClass static public void fixtureTearDown() throws SQLException { DB_APPENDER_HSQL_TEST_FIXTURE.tearDown(); } @Before public void setUp() throws SQLException { context = new AccessContext(); context.setName("default"); appender = new DBAppender(); appender.setName("DB"); appender.setContext(context); connectionSource = new DriverManagerConnectionSource(); connectionSource.setContext(context); connectionSource.setDriverClass(DBAppenderHSQLTestFixture.DRIVER_CLASS); connectionSource.setUrl(DB_APPENDER_HSQL_TEST_FIXTURE.url); connectionSource.setUser(DB_APPENDER_HSQL_TEST_FIXTURE.user); connectionSource.setPassword(DB_APPENDER_HSQL_TEST_FIXTURE.password); connectionSource.start(); appender.setConnectionSource(connectionSource); stmt = connectionSource.getConnection().createStatement(); existingEventTableRowCount = existingEventTableRowCount(stmt); } @After public void tearDown() throws SQLException { context = null; appender = null; connectionSource = null; stmt.close(); } int existingEventTableRowCount(Statement stmt) throws SQLException { ResultSet rs = stmt.executeQuery("SELECT count(*) FROM access_event"); int result = -1; if (rs.next()) { result = rs.getInt(1); } rs.close(); return result; } private void setInsertHeadersAndStart(boolean insert) { appender.setInsertHeaders(insert); appender.start(); } @Test public void testAppendAccessEvent() throws SQLException { setInsertHeadersAndStart(false); IAccessEvent event = createAccessEvent(); appender.append(event); Statement stmt = connectionSource.getConnection().createStatement(); ResultSet rs = null; rs = stmt.executeQuery("SELECT * FROM access_event where EVENT_ID = " + existingEventTableRowCount); if (rs.next()) { assertEquals(event.getTimeStamp(), rs.getLong(1)); assertEquals(event.getRequestURI(), rs.getString(2)); assertEquals(event.getRequestURL(), rs.getString(3)); assertEquals(event.getRemoteHost(), rs.getString(4)); assertEquals(event.getRemoteUser(), rs.getString(5)); assertEquals(event.getRemoteAddr(), rs.getString(6)); assertEquals(event.getProtocol(), rs.getString(7)); assertEquals(event.getMethod(), rs.getString(8)); assertEquals(event.getServerName(), rs.getString(9)); assertEquals(event.getRequestContent(), rs.getString(10)); } else { fail("No row was inserted in the database"); } rs.close(); stmt.close(); } @Test public void testCheckNoHeadersAreInserted() throws Exception { setInsertHeadersAndStart(false); IAccessEvent event = createAccessEvent(); appender.append(event); StatusPrinter.print(context.getStatusManager()); //Check that no headers were inserted Statement stmt = connectionSource.getConnection().createStatement(); ResultSet rs = null; rs = stmt.executeQuery("SELECT * FROM access_event_header where EVENT_ID = " + existingEventTableRowCount); assertFalse(rs.next()); rs.close(); stmt.close(); } @Test public void testAppendHeaders() throws SQLException { setInsertHeadersAndStart(true); IAccessEvent event = createAccessEvent(); appender.append(event); Statement stmt = connectionSource.getConnection().createStatement(); ResultSet rs = null; rs = stmt.executeQuery("SELECT * FROM access_event_header"); String key; String value; if (!rs.next()) { fail("There should be results to this query"); } else { key = rs.getString(2); value = rs.getString(3); assertNotNull(key); assertNotNull(value); assertEquals(event.getRequestHeader(key), value); rs.next(); key = rs.getString(2); value = rs.getString(3); assertNotNull(key); assertNotNull(value); assertEquals(event.getRequestHeader(key), value); } if (rs.next()) { fail("There should be no more rows available"); } rs.close(); stmt.close(); } @Test public void testAppendMultipleEvents() throws SQLException { setInsertHeadersAndStart(false); String uri = "testAppendMultipleEvents"; for (int i = 0; i < 10; i++) { IAccessEvent event = createAccessEvent(uri); appender.append(event); } StatusPrinter.print(context); Statement stmt = connectionSource.getConnection().createStatement(); ResultSet rs = null; rs = stmt.executeQuery("SELECT * FROM access_event where requestURI='" + uri + "'"); int count = 0; while (rs.next()) { count++; } assertEquals(10, count); rs.close(); stmt.close(); } private IAccessEvent createAccessEvent() { return createAccessEvent(""); } private IAccessEvent createAccessEvent(String uri) { DummyRequest request = new DummyRequest(); request.setRequestUri(uri); DummyResponse response = new DummyResponse(); DummyServerAdapter adapter = new DummyServerAdapter(request, response); return new AccessEvent(request, response, adapter); } } logback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/db/PackageTest.java0000644000175000017500000000133112136042270030161 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.db; import org.junit.runner.RunWith; import org.junit.runners.Suite; @RunWith(Suite.class) @Suite.SuiteClasses({DBAppenderHSQLTest.class, DBAppenderIntegrationTest.class}) public class PackageTest { }logback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/db/DBAppenderIntegrationTest.java0000644000175000017500000000770112136042270033005 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.db; import static org.junit.Assert.assertEquals; import java.util.Random; import ch.qos.logback.access.spi.IAccessEvent; import ch.qos.logback.core.status.StatusChecker; import ch.qos.logback.core.testUtil.EnvUtilForTests; import ch.qos.logback.core.util.EnvUtil; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.Test; import ch.qos.logback.access.dummy.DummyAccessEventBuilder; import ch.qos.logback.access.joran.JoranConfigurator; import ch.qos.logback.access.spi.AccessContext; import ch.qos.logback.core.Appender; import ch.qos.logback.core.joran.spi.JoranException; import ch.qos.logback.core.status.Status; import ch.qos.logback.core.util.StatusPrinter; public class DBAppenderIntegrationTest { static String LOCAL_HOST_NAME = EnvUtilForTests.getLocalHostName(); static String[] CONFORMING_HOST_LIST = new String[] { "Orion" }; int diff = new Random(System.nanoTime()).nextInt(10000); AccessContext context = new AccessContext(); StatusChecker statusChecker = new StatusChecker(context); @BeforeClass public static void setUpBeforeClass() throws Exception { } @AfterClass public static void tearDownAfterClass() throws Exception { } @Before public void setUp() throws Exception { } @After public void tearDown() throws Exception { } public void doTest(String configFile) throws JoranException { JoranConfigurator configurator = new JoranConfigurator(); configurator.setContext(context); configurator.doConfigure(configFile); Appender appender = context.getAppender("DB"); for (int i = 0; i < 10; i++) { IAccessEvent event = DummyAccessEventBuilder.buildNewAccessEvent(); appender.doAppend(event); } StatusPrinter.print(context); // check that there were no errors assertEquals(Status.INFO, statusChecker.getHighestLevel(0)); } static boolean isConformingHostAndJDK16OrHigher() { if(!EnvUtil.isJDK6OrHigher()) { return false; } return EnvUtilForTests.isLocalHostNameInList(CONFORMING_HOST_LIST); } @Test public void sqlserver() throws Exception { // perform test only on conforming hosts if (!isConformingHostAndJDK16OrHigher()) { return; } doTest("src/test/input/integration/db/sqlserver-with-driver.xml"); } @Test @Ignore public void oracle10g() throws Exception { // perform test only on conforming hosts if (!isConformingHostAndJDK16OrHigher()) { return; } doTest("src/test/input/integration/db/oracle10g-with-driver.xml"); } @Test @Ignore public void oracle11g() throws Exception { // perform test only on conforming hosts if (!isConformingHostAndJDK16OrHigher()) { return; } doTest("src/test/input/integration/db/oracle11g-with-driver.xml"); } @Test public void mysql() throws Exception { // perform test only on conforming hosts if (!isConformingHostAndJDK16OrHigher()) { return; } doTest("src/test/input/integration/db/mysql-with-driver.xml"); } @Test public void postgres() throws Exception { // perform test only on conforming hosts if (!isConformingHostAndJDK16OrHigher()) { return; } doTest("src/test/input/integration/db/postgresql-with-driver.xml"); } } logback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/spi/0000755000175000017500000000000012203357067025343 5ustar drazzibdrazzib././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootlogback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/spi/AccessEventSerializationTest.javalogback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/spi/AccessEventSerializationTest.j0000644000175000017500000000522212136042270033310 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.spi; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import org.junit.Test; import ch.qos.logback.access.dummy.DummyAccessEventBuilder; import ch.qos.logback.access.dummy.DummyRequest; import ch.qos.logback.access.dummy.DummyResponse; public class AccessEventSerializationTest { private Object buildSerializedAccessEvent() throws IOException, ClassNotFoundException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); IAccessEvent ae = DummyAccessEventBuilder.buildNewAccessEvent(); // average time for the next method: 5000 nanos ae.prepareForDeferredProcessing(); oos.writeObject(ae); oos.flush(); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bais); return ois.readObject(); } @Test public void testSerialization() throws IOException, ClassNotFoundException { Object o = buildSerializedAccessEvent(); assertNotNull(o); IAccessEvent aeBack = (IAccessEvent) o; assertEquals(DummyResponse.DUMMY_DEFAULT_HDEADER_MAP, aeBack .getResponseHeaderMap()); assertEquals(DummyResponse.DUMMY_DEFAULT_HDEADER_MAP.get("x"), aeBack .getResponseHeader("x")); assertEquals(DummyResponse.DUMMY_DEFAULT_HDEADER_MAP.get("headerName1"), aeBack.getResponseHeader("headerName1")); assertEquals(DummyResponse.DUMMY_DEFAULT_HDEADER_MAP.size(), aeBack .getResponseHeaderNameList().size()); assertEquals(DummyResponse.DUMMY_DEFAULT_CONTENT_COUNT, aeBack .getContentLength()); assertEquals(DummyResponse.DUMMY_DEFAULT_STATUS, aeBack.getStatusCode()); assertEquals(DummyRequest.DUMMY_CONTENT_STRING, aeBack .getRequestContent()); assertEquals(DummyRequest.DUMMY_RESPONSE_CONTENT_STRING, aeBack .getResponseContent()); } } logback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/spi/PackageTest.java0000644000175000017500000000143512136042270030374 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.spi; import junit.framework.TestCase; import org.junit.runner.RunWith; import org.junit.runners.Suite; import org.junit.runners.Suite.SuiteClasses; @RunWith(Suite.class) @SuiteClasses({AccessEventSerializationTest.class}) public class PackageTest extends TestCase { }logback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/net/0000755000175000017500000000000012203357067025336 5ustar drazzibdrazziblogback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/net/NOPOutputStream.java0000644000175000017500000000133512136042270031224 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.net; import java.io.IOException; import java.io.OutputStream; public class NOPOutputStream extends OutputStream { @Override public void write(int b) throws IOException { // do nothing } } logback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/net/PackageTest.java0000644000175000017500000000142112140555240030363 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.net; import junit.framework.TestCase; import org.junit.runner.RunWith; import org.junit.runners.Suite; import org.junit.runners.Suite.SuiteClasses; @RunWith(Suite.class) @SuiteClasses({URLEvaluatorTest.class}) public class PackageTest extends TestCase { }logback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/net/SerializationPerfTest.java0000644000175000017500000000600312136042270032462 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.net; import java.io.IOException; import java.io.ObjectOutputStream; import ch.qos.logback.access.spi.IAccessEvent; import junit.framework.TestCase; import ch.qos.logback.access.dummy.DummyAccessEventBuilder; public class SerializationPerfTest extends TestCase { ObjectOutputStream oos; int loopNumber = 10000; int resetFrequency = 100; int pauseFrequency = 10; long pauseLengthInMillis = 20; public void setUp() throws Exception { super.setUp(); oos = new ObjectOutputStream(new NOPOutputStream()); } public void tearDown() throws Exception { super.tearDown(); oos.close(); oos = null; } public void test1() throws Exception { // first run for just in time compiler int resetCounter = 0; int pauseCounter = 0; for (int i = 0; i < loopNumber; i++) { try { IAccessEvent ae = DummyAccessEventBuilder.buildNewAccessEvent(); //average time for the next method: 5000 nanos ae.prepareForDeferredProcessing(); oos.writeObject(ae); oos.flush(); if (++resetCounter >= resetFrequency) { oos.reset(); resetCounter = 0; } if (++pauseCounter >= pauseFrequency) { Thread.sleep(pauseLengthInMillis); pauseCounter = 0; } } catch (IOException ex) { fail(ex.getMessage()); } } // second run Long t1; Long t2; Long total = 0L; resetCounter = 0; pauseCounter = 0; // System.out.println("Beginning mesured run"); for (int i = 0; i < loopNumber; i++) { try { IAccessEvent ae = DummyAccessEventBuilder.buildNewAccessEvent(); t1 = System.nanoTime(); //average length of the next method: 4000 nanos ae.prepareForDeferredProcessing(); oos.writeObject(ae); oos.flush(); t2 = System.nanoTime(); total += (t2 - t1); if (++resetCounter >= resetFrequency) { oos.reset(); resetCounter = 0; } if (++pauseCounter >= pauseFrequency) { Thread.sleep(pauseLengthInMillis); pauseCounter = 0; } } catch (IOException ex) { fail(ex.getMessage()); } } total /= (1000);//nanos -> micros System.out.println("Loop done : average time = " + total / loopNumber + " microsecs after " + loopNumber + " writes."); //average time: 26-30 microsec = 0.030 millis } } logback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/net/URLEvaluatorTest.java0000644000175000017500000000506012136042270031357 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access.net; import static org.junit.Assert.*; import ch.qos.logback.access.spi.IAccessEvent; import org.junit.After; import org.junit.Before; import org.junit.Test; import ch.qos.logback.access.dummy.DummyRequest; import ch.qos.logback.access.dummy.DummyResponse; import ch.qos.logback.access.dummy.DummyServerAdapter; import ch.qos.logback.access.spi.AccessEvent; import ch.qos.logback.core.Context; import ch.qos.logback.core.ContextBase; import ch.qos.logback.core.boolex.EvaluationException; public class URLEvaluatorTest { final String expectedURL1 = "testUrl1"; final String expectedURL2 = "testUrl2"; Context context = new ContextBase(); URLEvaluator evaluator; DummyRequest request; DummyResponse response; DummyServerAdapter serverAdapter; @Before public void setUp() throws Exception { evaluator = new URLEvaluator(); evaluator.setContext(context); evaluator.addURL(expectedURL1); evaluator.start(); request = new DummyRequest(); response = new DummyResponse(); serverAdapter = new DummyServerAdapter(request, response); } @After public void tearDown() throws Exception { evaluator.stop(); evaluator = null; request = null; response = null; serverAdapter = null; context = null; } @Test public void testExpectFalse() throws EvaluationException { request.setRequestUri("test"); IAccessEvent ae = new AccessEvent(request, response, serverAdapter); assertFalse(evaluator.evaluate(ae)); } @Test public void testExpectTrue() throws EvaluationException { request.setRequestUri(expectedURL1); IAccessEvent ae = new AccessEvent(request, response, serverAdapter); assertTrue(evaluator.evaluate(ae)); } @Test public void testExpectTrueMultiple() throws EvaluationException { evaluator.addURL(expectedURL2); request.setRequestUri(expectedURL2); IAccessEvent ae = new AccessEvent(request, response, serverAdapter); assertTrue(evaluator.evaluate(ae)); } } logback_1.0.13/logback-access/src/test/java/ch/qos/logback/access/TeztConstants.java0000644000175000017500000000115212136042270030225 0ustar drazzibdrazzib/** * Logback: the reliable, generic, fast and flexible logging framework. * Copyright (C) 1999-2013, QOS.ch. All rights reserved. * * This program and the accompanying materials are dual-licensed under * either the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation * * or (per the licensee's choosing) * * under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. */ package ch.qos.logback.access; public class TeztConstants { public static final String TEST_DIR_PREFIX = "src/test/"; } logback_1.0.13/logback-access/pom.xml0000644000175000017500000001371712143153470017343 0ustar drazzibdrazzib 4.0.0 ch.qos.logback logback-parent 1.0.13 logback-access jar Logback Access Module logback-access module http://logback.qos.ch Eclipse Public License - v 1.0 http://www.eclipse.org/legal/epl-v10.html GNU Lesser General Public License http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html ch.qos.logback logback-core compile ch.qos.logback logback-core test-jar test org.apache.tomcat tomcat-catalina compile true org.eclipse.jetty jetty-server compile true org.codehaus.janino janino compile true hsqldb hsqldb test javax.mail mail compile true org.apache.maven.plugins maven-surefire-plugin ${maven-surefire-plugin.version} once plain true **/AllAccessTest.java **/PackageTest.java **/SerializationPerfTest.java org.apache.maven.plugins maven-jar-plugin ${maven-jar-plugin.version} ${project.build.outputDirectory}/META-INF/MANIFEST.MF bundle-test-jar package jar test-jar org.apache.felix maven-bundle-plugin true bundle-manifest process-classes manifest ch.qos.logback.access.* ch.qos.logback.core.rolling, ch.qos.logback.core.rolling.helper, javax.servlet.*;version="2.5", javax.*;resolution:=optional, org.apache.catalina.*;version="${tomcat.version}";resolution:=optional, org.eclipse.jetty.*;version="${jetty.version}";resolution:=optional, * J2SE-1.5 host-orion mysql mysql-connector-java 5.0.8 test postgresql postgresql 8.2-507.jdbc3 com.microsoft.sqlserver sqljdbc4 2.0 test com.oracle ojdbc14 10.2.0.1 test logback_1.0.13/logback-site/0000755000175000017500000000000012203357067015525 5ustar drazzibdrazziblogback_1.0.13/logback-site/src/0000755000175000017500000000000011506604176016315 5ustar drazzibdrazziblogback_1.0.13/logback-site/src/site/0000755000175000017500000000000012136042273017253 5ustar drazzibdrazziblogback_1.0.13/logback-site/src/site/images.src/0000755000175000017500000000000012203357067021313 5ustar drazzibdrazziblogback_1.0.13/logback-site/src/site/images.src/serverSocketReceiver.odg0000644000175000017500000002562012137257021026152 0ustar drazzibdrazzibPKB.++mimetypeapplication/vnd.oasis.opendocument.graphicsPKBConfigurations2/statusbar/PKB'Configurations2/accelerator/current.xmlPKPKBConfigurations2/floater/PKBConfigurations2/popupmenu/PKBConfigurations2/progressbar/PKBConfigurations2/menubar/PKBConfigurations2/toolbar/PKBConfigurations2/images/Bitmaps/PKB content.xml[ms8~b}U3ApM2{W)u3[{u_[78d}w亅'&Rt c+}Y4tLX$ CSvǝ\Jbf'L2%f+:kM*V-hR D]Lqun1:`gRx;Ud|8I_7n6y%sT`h7>3.͵-5Zx|THS^{ JÂ҇y-¼R5N@US SK QLFL]H\FM=[niui,-?1rv|,l2ԧpQrCՁb\0[U҇ %+ܑAiYa+Pi,FoLgx)AShijڑ=5X[Wekm 5E#dFB] 57pڳv=B~@pb ,}Y#/C#gF(l۾?'vG)wD|I!\QM7dg>| d?,X1\o5ɜ3!N۝Hڸ Kyn7NRLO]uזOOԯ$IȐv_ZkQ\eZƼz3oߔ#߾cT8g{w},PRtw%x\1!'f{;=sp LvŚ75`M3C٫"Jت?P`,_=*7B],+H:N서T2NYz"%~7m<1Ew\bvjFudWM27g>M#sId#n¤ BۇDtmZ.πv,H~ wQrC09a"`rdm`% w$nx{ @T= L5D)mJj$S zpM;u,[yֽ_CŬx _Rm*P/I|@'a PmtOd~Lm qLC@fHKHS<υY,o5򈛎Sɤ`S=549EThp{.xҠ\4D&dMDZ6 _-NuCPQ KzKmp8{[׎ \V!rǛyN%d*E#b24X]AU~9m'{~ bi᮫2c,]9/?7~%k)Td3t{;cע"6ܘZQ~zk7NىAjC.qbڏn:@jhh!*sC.]+W)Ij+\ =v6q}#XmAM5] td8T}W+xRb츔1I9c[kC]RRΉD]#c/2i媿c4h1 F1"-Tt(NlѰYQkƕly Ɏ3Ljb1c.0(S}ȡڍQ9 M;Sb+_ !([_$B+"z-?[HnEz<BWDeiϽDWn^jFA`mS`(]BI.4"]Z݃d}3sݯ5U#G}tnjj"2ǨJ+iϕ$^nxrЪE.UKZOCn5_DBLER;%1XڣKn׈}#w&8ݏL,6 ]'Ic>maD=$5&m♗p~/xojEG=gpJFs]<5 F)n>3V׏}Ș= Gg#e쩥S; ( . Ceki Gulcu2013-04-18T20:50:12.232013-04-28T19:36:16.16Ceki GulcuPT01H27M59S5OpenOffice.org/3.2$Win32 OpenOffice.org_project/320m18$Build-9502PKBThumbnails/thumbnail.png?p=z(|KwKz;ӖWn0LcuJDHjfKb71#f&La/?yUOחWQ٣KKp|TEEM_,FA EeXHyq 7\G zNQmTYǥfM3 p>bbmF=''|YTBi/L('P쏥 i$^]|Ч}ɗʴNoIR`~ȈW|Hy !o"5ٖ!dda3Gi6Ld"PMcg\}m).s(`+g\#[#~M|6w)/S w/]]wG_oX:z}^!YT?¶sSFϫG!1s"37) ܥhF8#Â= n'YaJނf+u R_Y _hYz?-Ya Ć`]|@'RQϣr{-A,惘JT>KfSl,?ܰ)hX?Wͽ1]ZQMQ~fs|OD9} ϡDT_c(c,|\k@`m{M0b4&a8HD.L¦X I;$mПvjn m+fOT뢌*x>NȳN;w͊7mY>n5evfsǟ;q )tna-&Ppz}aNd>u)[[qb=(?sebi+Ь p`(iDiRJo*+Qk^aD& q#Vwx4RU V yS߮5>2LpV !b1p|MBiRU CpagZZKg[cOnǠG8_֣y]d,M(l=G*%o7Q=ŰEc^ztZţϪ48cӞH:0B\֍r6/xF˔jew xF9BCpMBnu*כPqsA:c>KEW10 Ř6COvJds_Ma_ȡسv0pj36 +X8zXda.Z Fk솎·$ѱp QP(7ɩ^~oI8$1Y5_LW3 *|{`?,'aw^\t7|j&0q~kH4s'ЄhH;r:>q_]S U\],x}sI36I3p@CuQ3[ܯEQ|AhV$Nf c Xqɲ,ו,Sj.n˰@H߮5Cxt ZbO5F - ɉ #,UߢR@т.H!H\(.<&wM^!XBAQw:VԒO5{B[VpJ0fx6X!9nM^* Z 97ޱD xɣJ*)abp*к(z/_Fg<_QqӅoPK`1<$ PKB settings.xmlZQS*7~pv> \pQ+sQmoR9;IV7 .bt:Asrk^@H!FOr|np1 aUERz<ӹl,^7TIedC L/5VG7,+LJl6;TkUv94 5QVnsViCc:e1zu>"6 hS+[ 1NVxW3vc U۵i6kEnкȌS b#ch ٛyJc2$XTD\J좺 !U.Z44R3g1}[#fd"ֺd2'o\3SNͭzjܰ1u&-G: K-B̃Vu石W0|})t{ M1e <4((q<7`:Ad ܕ0`,Nz W=0>U]G0ǗY%L #.!3`4=;wmuϴ!}6xy0ͯKIyl^w ]хqZY-.ma+4A Wіv,{/㛟ut- 57`uL ?S{9jסu A޳Z $ ~,˛S3`<8a[rUq/aT7''EoPKZd!PKBMETA-INF/manifest.xmlAn E9ަͪDj =$ őmT5ف=S0vՓ(*j7c^zˠHYN€TG:\]_;mL éɰPc#{p)ήj~aq)=Rȇrܧ9>s>ZJbH;yLS!O"Lp|)ߗgs&\#Wxx(hT ,^ O~_3%>ٱ2vlqYІ$_y 鮼v%\OPK]GePKB.++mimetypePKBQConfigurations2/statusbar/PKB'Configurations2/accelerator/current.xmlPKBConfigurations2/floater/PKBConfigurations2/popupmenu/PKBNConfigurations2/progressbar/PKBConfigurations2/menubar/PKBConfigurations2/toolbar/PKBConfigurations2/images/Bitmaps/PKB j :9 1content.xmlPKBvs1 styles.xmlPKBfY;meta.xmlPKB`1<$ }Thumbnails/thumbnail.pngPKBZd! settings.xmlPKB]Ge&META-INF/manifest.xmlPK'logback_1.0.13/logback-site/src/site/images.src/socketReceiver.odg0000644000175000017500000002555612137256575025010 0ustar drazzibdrazzibPK8B.++mimetypeapplication/vnd.oasis.opendocument.graphicsPK8BConfigurations2/statusbar/PK8B'Configurations2/accelerator/current.xmlPKPK8BConfigurations2/floater/PK8BConfigurations2/popupmenu/PK8BConfigurations2/progressbar/PK8BConfigurations2/menubar/PK8BConfigurations2/toolbar/PK8BConfigurations2/images/Bitmaps/PK8B content.xml[n6ߧT/0B?[$v^%E.P$$j)9N{'9%KęA3,|<|R펊B'SKh ~0˿|I"yh^+@;/u녾%+yrQE ^мZtrR]j2t#Kv,XeP |_F+Ȋ/UU l6Ӎ3bi LrZR*LR4ɔlFp}(5)_gT& b`먫Ӌ[9ZbtI~8PqnV=;7Q^q%clHbtWsޚ bږu#9(#4j.@ a; v!۬[2n­0;.l|Lt,잠 s6:Pvt^=SЂd&-F*K0lmD"w9 q+;Q`&zmC/a!id%L)/Eaiâa^b\ʩu/!˴2y"NP/͹^Vc!kyβ҅DWIU~e~ե.EXXT@ F"֛~QTT rȪ0%OYܩO98_%OvƊ 3”-2ph+1) qu˚19jVa,S5T<Ã8YKNז|c([ I&aZ) "{8(:{Jx_*iv)P|€BVh?d alXӚ:Q6.zܳG,ʾYS/D¨ٮ K䜩XK"cy[kᔩfUnYΜX?!? L@(nnkp?Y=wZG~Q_TM<5XJUxLGq9ɿ"Yٸ:ſOu鿷04XFŢ`5b']TL+wRzGSݮӔVZ݈п^& /_ֵN'[F{ l!7-O% jHIIUb]o\CΜ$Wk#&\Pd >]74`!l&rψM" !{I!I|frhΈ:D+Qw6R <~h Uy/꣐~c9wZ'F&K}Op47[L|駦:4|_=_3rN35ͶJ>ՇlX|E%]Bzf{vf֢foݳ٬jh·}yC7'\=V$H(h>CMO$1;(OLxC]PG <mܚuCPQ KzKmp8{[׎ \V!rǛyN%d*E#b24X]AU~9m'{~ bi᮫2c,]9/?7~%k)Td3t{;cע"6ܘZQ~zk7NىAjC.qbڏn:@jhh!*sC.]+W)Ij+\ =v6q}#XmAM5] td8T}W+xRb츔1I9c[kC]RRΉD]#c/2i媿c4h1 F1"-Tt(NlѰYQkƕly Ɏ3Ljb1c.0(S}ȡڍQ9 M;Sb+_ !([_$B+"z-?[HnEz<BWDeiϽDWn^jFA`mS`(]BI.4"]Z݃d}3sݯ5U#G}tnjj"2ǨJ+iϕ$^nxrЪE.UKZOCn5_DBLER;%1XڣKn׈}#w&8ݏL,6 ]'Ic>maD=$5&m♗p~/xojEG=gpJFs]<5 F)n>3V׏}Ș= Gg#e쩥S; ( . Ceki Gulcu2013-04-18T20:50:12.232013-04-28T19:33:48.63Ceki GulcuPT01H22M08S5OpenOffice.org/3.2$Win32 OpenOffice.org_project/320m18$Build-9502PK8BThumbnails/thumbnail.pngY8ۉu:SXFǖ2S5Tm1ZT-A"AiE1ba|N * D5(X n>{~OsRn9J+KKHHps$~۔8;zN쟼yV76E*#:d[_W᳴M/\Ζri|&z.5+ˋ(rJX^mKlk GED1%eן&Pr(axOx"k1!$<ݪt\[ e? O%'XOhjnfJ1Q)b`E-بQ˿(^EU|NU|G.G]ΉخCQ g'g0B_ >BrI:%%gZN~ sG=Wqc&9wM/SQE..;dG}=Q/[p>A CT7lwfJ:^fE Ҡnf_)o8L&tx$IԦWeKH[M\e?T_aLg|wpKbh2Q zɕp \Fݵ~_)^FM=@dAD򋕮hX;|'Xpu!Ju DžXcuy5{CMӗ=2Q0@V` ߪ;W2:N9GZԘ{\PVTN4| sɆj0nZGگn!\nx?2# *Ju >ChhRDyZ+@w39Am q WG?ϰ?/?׋MEdG7 | {;QUzM>"C\qftȱm6 |].(=o:imPcI^P ɔ#C> IaIK[[7cڸ4#bdp VXڠP9xp[`rR՞ƁHrf#0~2ݗffť%a~uAUPE'nq쏉ׄ~/lYBAyOK|RPN ά7|g]0ex>ƽ?sn9 8% zM"2ɏ*=iuvG'_;Ւhzxs3(غת+~>{q|tT@`eϝyg-_jZʄ}R[4'ߪK".Ab=D=]{aݷӈb(lٲw⸄%h@xE y  gߢl4DO{dD4M{o.Ү7OD}-:q:6vPx?ɝr2?SW~X'}Lf;:KaVE${xcs(Ԗ8i'$,~urUqX!UOӉ,Yָ=Yy` D(+ , Re#߄ MYj~p4r.qW/3as5_" F̜ :b&6nRk&ed=WO9@D:uJ@@ -\0-,6 Ukq74yYB6°N& 1X>` ܆X pΗ#q㚳]PK1X% PK8B settings.xmlZQs6~x> !$4̑rM IW&N:Yjw痘<y3C(6Qr|np aUERz<˹l,7TIedC L5g7,rQ fJ%ju>ΏQL}(+nkiC:e9{}=" m,׏>UWeLٮ\fn%82w"ƻ˜[Z/z[WٳZszZ Zq_ 6>r l:_;>=8$#xh eh]$y/S*=!hYWA?Fd@xR"2]|į¤#zO9IFhX/ }@pKĔrS{0/UWA,gȏ2#d"ֺd:'o\3SN -z@ ]nX:9:rfe' 6OZZ՝?gM7Y:B*_DR}J 2? |cb7 >:fLG4 ^{Һ-FLѓtI/ SFç2ZXΌ)<A!cib6xV6; 8qz!9|!Ž w-+.xWŅb"a2ЦBq B 8ʮe=ѣ'm5mh) oe2FPcsכE>F jr 6muNx "/+.Ҋ/<> *?j~2nDWiHSf3gȑ&$eJU~1Q8G%Q}JurmI s>ZJbH;yLS!O"Lp|)ߗgs&\#Wxx(hT ,^ O~_3%>ٱ2vlqYІ$_y 鮼v%\OPK]GePK8B.++mimetypePK8BQConfigurations2/statusbar/PK8B'Configurations2/accelerator/current.xmlPK8BConfigurations2/floater/PK8BConfigurations2/popupmenu/PK8BNConfigurations2/progressbar/PK8BConfigurations2/menubar/PK8BConfigurations2/toolbar/PK8BConfigurations2/images/Bitmaps/PK8B*:Dc f9 1content.xmlPK8Bvs1 styles.xmlPK8Br(nKmeta.xmlPK8B1X% vThumbnails/thumbnail.pngPK8BgU! settings.xmlPK8B]Ge%META-INF/manifest.xmlPKj'logback_1.0.13/logback-site/src/site/pages/0000755000175000017500000000000012203357067020357 5ustar drazzibdrazziblogback_1.0.13/logback-site/src/site/pages/index.html0000644000175000017500000001406512136042147022355 0ustar drazzibdrazzib Logback Home

Logback Project

Logback is intended as a successor to the popular log4j project, picking up where log4j leaves off.

Logback's architecture is sufficiently generic so as to apply under different circumstances. At present time, logback is divided into three modules, logback-core, logback-classic and logback-access.

The logback-core module lays the groundwork for the other two modules. The logback-classic module can be assimilated to a significantly improved version of log4j. Moreover, logback-classic natively implements the SLF4J API so that you can readily switch back and forth between logback and other logging frameworks such as log4j or java.util.logging (JUL).

The logback-access module integrates with Servlet containers, such as Tomcat and Jetty, to provide HTTP-access log functionality. Note that you could easily build your own module on top of logback-core.

Sister projects

The logback-audit project is designed for processing logging events having long-term business significance. Logback-audit is based on logback-core.

Projects known to rely on logback

Here is a non-exhaustive list of open-source projects known to depend on logback, in alphabetical order:

logback_1.0.13/logback-site/src/site/pages/dependencies.html0000644000175000017500000001245312143163075023675 0ustar drazzibdrazzib Logback Dependencies

Dependencies per module

As of version 1.0.12, logback requires JDK 1.6 to build, however, it is inteded to run under JDK 1.5 (with the exception of SSL related functionality).

Each logback module has a different set of dependencies. These are listed below in a separate table per module.

logback-core

Component dependencies
Overall
  • JDK 1.5
ch.qos.logback.core.net.ssl.*
  • JDK 1.6
JaninoEventEvaluatorBase and derived classes
  • Janino version ${janino.version}
SMTPAppenderBase and derived classes

logback-classic

Component dependencies
Overall
  • JDK 1.5
Overall
  • logback-core, and by transitivity logback-core's dependencies.
Overall
ch.qos.logback.classic.selector.*
  • servlet-api version 2.5
c.q.l.c.boolex.JaninoEventEvaluator
  • Depends on JaninoEventEvaluatorBase, and by transitivity on JaninoEventEvaluatorBase's dependencies.
SMTPAppender
  • Depends on SMTPAppenderBase, and by transitivity on SMTPAppenderBase's dependencies.

logback-access

Component dependencies
Overall
  • JDK 1.6
Overall
  • logback-core, and by transitivity logback-core's dependencies.
Overall
  • servlet-api version 2.5
ch.qos.logback.access.jetty.*
  • Jetty version ${jetty.version}
ch.qos.logback.access.tomcat.*
  • Tomcat version ${tomcat.version}
logback_1.0.13/logback-site/src/site/pages/beagle/0000755000175000017500000000000012203357067021576 5ustar drazzibdrazziblogback_1.0.13/logback-site/src/site/pages/beagle/index.html0000644000175000017500000001544712021755022023575 0ustar drazzibdrazzib Logback-beagle

Logback-beagle

Logback-beagle: an Eclipse plug-in for viewing logs

During the development process, it is common for developers to print logging events on the console. Typically, the developer will also customize the format of the log output by setting an appropriate layout pattern. Logback-beagle is intended as a replacement for viewing logs via the console. It offers several advantages over the plain-old console:

  • Events of level WARN and ERROR are marked by an orange flag and respectively a red flag.
  • Quickly jump to the class and line where a given logging request originated
  • Easly view and jump to the callers of any log statement upto eight levels deep
  • Change the output format on-the-fly
  • quickly filter-out events by setting the level of existing loggers
  • Measure the time elapsed between any two lines of log

Plug-in Installation

The logback-beagle plug-in requires the Nebula Grid plug-in which must be installed first.

Step 1: Nebula Grid

The Nebula Grid plug-in which can be installed from http://download.eclipse.org/technology/nebula/snapshot/. Only the "Nebula Grid Feature" needs to be installed.

Step 2: Logbak-beagle

The logback-beagle plug-in can be installed from http://logback.qos.ch/p2/. You need to select "Logback", "Logback Beagle" and "SLF4J" bundles for installation as shown below.

Restarting Eclipse should load the plugin. To access the Beagle View, either type A"lt-Shift-Q, Q" or select: Window > Show view > Other... . You should see the Beagle view nested in the Logback category. Selecting this view will add it to your workspace. It shouls looks as follows:

Configuring the client (logback.xml)

A single additional configuration line in logback.xml is sufficient to send log events from your application to logback-beagle.

<configuration debug="true">
  <!-- sends logs to logback-beagle -->
  <consolePlugin />
</configuration>

Under the hood, <consolePlugin> element creates a SocketAppender which will send logging events to a TCP socket on localhost port 4321. Logback-beagle launches the corresponding server listening on this port on localhost.

Using logback-beagle

Logback-beagle displays the events it receives in a table according to the layout format chosen by the user. Here is a screen shot of the Beagle View containing logging events.

Clicking on any log line will scroll-lock (freeze) the view. Double clicking on that same line will release the scroll lock (unfreeze) the view. You can also release the scroll lock by clicking on . This icon becomes active (clickable) when the view is frozen.

Jump to caller/Expand caller data

Right-clicking on any line will reveal the following menu:

Selecting "Jump to caller" will move the edit cursor to the file and line number whence the logging statement issued.

Selecting "Expand caller data" will reveal the stack trace of method calls upto eight levels deep. Here is a sample screen-shot:

Not only are the callers of the log statement revealed, it becomes possible to jump to any of the listed callers. Right-click on a caller line. A menu will appear. Select "Jump to caller" in the menu to jump to the caller of your choice.

Caller data can be collapsed by selecting "Collapse caller data" from the said menu.

Preferences

Logback-beagle preferences can be found under the "Beagle" label nested under "Run/Debug" category. You can customize the output pattern to best suit your preferences. Changes take effect immediately.

You may also change the font type and size used for displaying the log events via the Eclipse's preferences dialog as shown below:

logback_1.0.13/logback-site/src/site/pages/js/0000755000175000017500000000000012203357067020773 5ustar drazzibdrazziblogback_1.0.13/logback-site/src/site/pages/js/jquery.cookies.2.2.0.js0000644000175000017500000002622011377016712024743 0ustar drazzibdrazzib/** * Copyright (c) 2005 - 2010, James Auldridge * All rights reserved. * * Licensed under the BSD, MIT, and GPL (your choice!) Licenses: * http://code.google.com/p/cookies/wiki/License * */ var jaaulde = window.jaaulde || {}; jaaulde.utils = jaaulde.utils || {}; jaaulde.utils.cookies = ( function() { var resolveOptions, assembleOptionsString, parseCookies, constructor, defaultOptions = { expiresAt: null, path: '/', domain: null, secure: false }; /** * resolveOptions - receive an options object and ensure all options are present and valid, replacing with defaults where necessary * * @access private * @static * @parameter Object options - optional options to start with * @return Object complete and valid options object */ resolveOptions = function( options ) { var returnValue, expireDate; if( typeof options !== 'object' || options === null ) { returnValue = defaultOptions; } else { returnValue = { expiresAt: defaultOptions.expiresAt, path: defaultOptions.path, domain: defaultOptions.domain, secure: defaultOptions.secure }; if( typeof options.expiresAt === 'object' && options.expiresAt instanceof Date ) { returnValue.expiresAt = options.expiresAt; } else if( typeof options.hoursToLive === 'number' && options.hoursToLive !== 0 ) { expireDate = new Date(); expireDate.setTime( expireDate.getTime() + ( options.hoursToLive * 60 * 60 * 1000 ) ); returnValue.expiresAt = expireDate; } if( typeof options.path === 'string' && options.path !== '' ) { returnValue.path = options.path; } if( typeof options.domain === 'string' && options.domain !== '' ) { returnValue.domain = options.domain; } if( options.secure === true ) { returnValue.secure = options.secure; } } return returnValue; }; /** * assembleOptionsString - analyze options and assemble appropriate string for setting a cookie with those options * * @access private * @static * @parameter options OBJECT - optional options to start with * @return STRING - complete and valid cookie setting options */ assembleOptionsString = function( options ) { options = resolveOptions( options ); return ( ( typeof options.expiresAt === 'object' && options.expiresAt instanceof Date ? '; expires=' + options.expiresAt.toGMTString() : '' ) + '; path=' + options.path + ( typeof options.domain === 'string' ? '; domain=' + options.domain : '' ) + ( options.secure === true ? '; secure' : '' ) ); }; /** * parseCookies - retrieve document.cookie string and break it into a hash with values decoded and unserialized * * @access private * @static * @return OBJECT - hash of cookies from document.cookie */ parseCookies = function() { var cookies = {}, i, pair, name, value, separated = document.cookie.split( ';' ), unparsedValue; for( i = 0; i < separated.length; i = i + 1 ) { pair = separated[i].split( '=' ); name = pair[0].replace( /^\s*/, '' ).replace( /\s*$/, '' ); try { value = decodeURIComponent( pair[1] ); } catch( e1 ) { value = pair[1]; } if( typeof JSON === 'object' && JSON !== null && typeof JSON.parse === 'function' ) { try { unparsedValue = value; value = JSON.parse( value ); } catch( e2 ) { value = unparsedValue; } } cookies[name] = value; } return cookies; }; constructor = function(){}; /** * get - get one, several, or all cookies * * @access public * @paramater Mixed cookieName - String:name of single cookie; Array:list of multiple cookie names; Void (no param):if you want all cookies * @return Mixed - Value of cookie as set; Null:if only one cookie is requested and is not found; Object:hash of multiple or all cookies (if multiple or all requested); */ constructor.prototype.get = function( cookieName ) { var returnValue, item, cookies = parseCookies(); if( typeof cookieName === 'string' ) { returnValue = ( typeof cookies[cookieName] !== 'undefined' ) ? cookies[cookieName] : null; } else if( typeof cookieName === 'object' && cookieName !== null ) { returnValue = {}; for( item in cookieName ) { if( typeof cookies[cookieName[item]] !== 'undefined' ) { returnValue[cookieName[item]] = cookies[cookieName[item]]; } else { returnValue[cookieName[item]] = null; } } } else { returnValue = cookies; } return returnValue; }; /** * filter - get array of cookies whose names match the provided RegExp * * @access public * @paramater Object RegExp - The regular expression to match against cookie names * @return Mixed - Object:hash of cookies whose names match the RegExp */ constructor.prototype.filter = function( cookieNameRegExp ) { var cookieName, returnValue = {}, cookies = parseCookies(); if( typeof cookieNameRegExp === 'string' ) { cookieNameRegExp = new RegExp( cookieNameRegExp ); } for( cookieName in cookies ) { if( cookieName.match( cookieNameRegExp ) ) { returnValue[cookieName] = cookies[cookieName]; } } return returnValue; }; /** * set - set or delete a cookie with desired options * * @access public * @paramater String cookieName - name of cookie to set * @paramater Mixed value - Any JS value. If not a string, will be JSON encoded; NULL to delete * @paramater Object options - optional list of cookie options to specify * @return void */ constructor.prototype.set = function( cookieName, value, options ) { if( typeof options !== 'object' || options === null ) { options = {}; } if( typeof value === 'undefined' || value === null ) { value = ''; options.hoursToLive = -8760; } else if( typeof value !== 'string' ) { if( typeof JSON === 'object' && JSON !== null && typeof JSON.stringify === 'function' ) { value = JSON.stringify( value ); } else { throw new Error( 'cookies.set() received non-string value and could not serialize.' ); } } var optionsString = assembleOptionsString( options ); document.cookie = cookieName + '=' + encodeURIComponent( value ) + optionsString; }; /** * del - delete a cookie (domain and path options must match those with which the cookie was set; this is really an alias for set() with parameters simplified for this use) * * @access public * @paramater MIxed cookieName - String name of cookie to delete, or Bool true to delete all * @paramater Object options - optional list of cookie options to specify ( path, domain ) * @return void */ constructor.prototype.del = function( cookieName, options ) { var allCookies = {}, name; if( typeof options !== 'object' || options === null ) { options = {}; } if( typeof cookieName === 'boolean' && cookieName === true ) { allCookies = this.get(); } else if( typeof cookieName === 'string' ) { allCookies[cookieName] = true; } for( name in allCookies ) { if( typeof name === 'string' && name !== '' ) { this.set( name, null, options ); } } }; /** * test - test whether the browser is accepting cookies * * @access public * @return Boolean */ constructor.prototype.test = function() { var returnValue = false, testName = 'cT', testValue = 'data'; this.set( testName, testValue ); if( this.get( testName ) === testValue ) { this.del( testName ); returnValue = true; } return returnValue; }; /** * setOptions - set default options for calls to cookie methods * * @access public * @param Object options - list of cookie options to specify * @return void */ constructor.prototype.setOptions = function( options ) { if( typeof options !== 'object' ) { options = null; } defaultOptions = resolveOptions( options ); }; return new constructor(); } )(); ( function() { if( window.jQuery ) { ( function( $ ) { $.cookies = jaaulde.utils.cookies; var extensions = { /** * $( 'selector' ).cookify - set the value of an input field, or the innerHTML of an element, to a cookie by the name or id of the field or element * (field or element MUST have name or id attribute) * * @access public * @param options OBJECT - list of cookie options to specify * @return jQuery */ cookify: function( options ) { return this.each( function() { var i, nameAttrs = ['name', 'id'], name, $this = $( this ), value; for( i in nameAttrs ) { if( ! isNaN( i ) ) { name = $this.attr( nameAttrs[ i ] ); if( typeof name === 'string' && name !== '' ) { if( $this.is( ':checkbox, :radio' ) ) { if( $this.attr( 'checked' ) ) { value = $this.val(); } } else if( $this.is( ':input' ) ) { value = $this.val(); } else { value = $this.html(); } if( typeof value !== 'string' || value === '' ) { value = null; } $.cookies.set( name, value, options ); break; } } } } ); }, /** * $( 'selector' ).cookieFill - set the value of an input field or the innerHTML of an element from a cookie by the name or id of the field or element * * @access public * @return jQuery */ cookieFill: function() { return this.each( function() { var n, getN, nameAttrs = ['name', 'id'], name, $this = $( this ), value; getN = function() { n = nameAttrs.pop(); return !! n; }; while( getN() ) { name = $this.attr( n ); if( typeof name === 'string' && name !== '' ) { value = $.cookies.get( name ); if( value !== null ) { if( $this.is( ':checkbox, :radio' ) ) { if( $this.val() === value ) { $this.attr( 'checked', 'checked' ); } else { $this.removeAttr( 'checked' ); } } else if( $this.is( ':input' ) ) { $this.val( value ); } else { $this.html( value ); } } break; } } } ); }, /** * $( 'selector' ).cookieBind - call cookie fill on matching elements, and bind their change events to cookify() * * @access public * @param options OBJECT - list of cookie options to specify * @return jQuery */ cookieBind: function( options ) { return this.each( function() { var $this = $( this ); $this.cookieFill().change( function() { $this.cookify( options ); } ); } ); } }; $.each( extensions, function( i ) { $.fn[i] = this; } ); } )( window.jQuery ); } } )();logback_1.0.13/logback-site/src/site/pages/js/decorator.js0000644000175000017500000000523611777571715023336 0ustar drazzibdrazzib //

Logger context

function decorate() { var anchor = findAnchorInURL(document.URL); decoratePropertiesInTables(anchor); decorateDoAnchor(anchor); decorateConversionWordInTables(anchor); } // ---------------------------------------------- function findAnchorInURL(url) { if(url == null) return null var index = url.lastIndexOf("#"); if(index != -1 && (index+1) < url.length) return url.substr(index+1); else return null; } // ---------------------------------------------- function decoratePropertiesInTables(anchor) { //if(1==1) return; var elems = $('tr td:first-child span.prop'); for(var i = 0; i < elems.length; i++) { var e = elems[i]; var p = e.parentNode; if(p == null) continue; var tmpHTML = p.innerHTML; var propName = e.innerHTML; var nameAttr = $(e).attr('name') if(nameAttr == null) { var containerAttr = $(e).attr('container') if(containerAttr != null) nameAttr = containerAttr+capitaliseFirstLetter(propName); else nameAttr = propName; } p.innerHTML = "" +tmpHTML +""; scrollIfMatch(p, nameAttr, anchor); } // for } function decorateConversionWordInTables(anchor) { var elems = $('tr td.word'); for(var i = 0; i < elems.length; i++) { var e = elems[i]; var tmpHTML = e.innerHTML; var nameAttr = $(e).attr('name') if(nameAttr == null) continue; e.innerHTML = "" +tmpHTML; scrollIfMatch(e, nameAttr, anchor); } } function decorateDoAnchor(anchor) { var elems = $('.doAnchor'); for(var i = 0; i < elems.length; i++) { var e = elems[i]; var tmpHTML = e.innerHTML; var nameAttr = $(e).attr('name') if(nameAttr == null) { nameAttr = camelCase($.trim(tmpHTML)) } e.innerHTML = "" +tmpHTML; scrollIfMatch(e, nameAttr, anchor); } } function scrollIfMatch(element, nameAttr, anchor) { if(anchor != null && nameAttr.toString() == anchor) element.scrollIntoView(true); } function capitaliseFirstLetter(str) { return str.charAt(0).toUpperCase() + str.slice(1); } function camelCase(str) { var res = str.trim().replace(/\s\w/g, function(match) { return match.trim().toUpperCase(); }); return res; } logback_1.0.13/logback-site/src/site/pages/js/jquery-min.js0000644000175000017500000027117011776326413023446 0ustar drazzibdrazzib/*! jQuery v1.7.2 jquery.com | jquery.org/license */ (function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cu(a){if(!cj[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ck||(ck=c.createElement("iframe"),ck.frameBorder=ck.width=ck.height=0),b.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write((f.support.boxModel?"":"")+""),cl.close();d=cl.createElement(a),cl.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ck)}cj[a]=e}return cj[a]}function ct(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function cs(){cq=b}function cr(){setTimeout(cs,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border")for(;e=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?+d:j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){if(typeof c!="string"||!c)return null;var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
a",d=p.getElementsByTagName("*"),e=p.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=p.getElementsByTagName("input")[0],b={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:p.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,pixelMargin:!0},f.boxModel=b.boxModel=c.compatMode==="CSS1Compat",i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete p.test}catch(r){b.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",function(){b.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),i.setAttribute("name","t"),p.appendChild(i),j=c.createDocumentFragment(),j.appendChild(p.lastChild),b.checkClone=j.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,j.removeChild(i),j.appendChild(p);if(p.attachEvent)for(n in{submit:1,change:1,focusin:1})m="on"+n,o=m in p,o||(p.setAttribute(m,"return;"),o=typeof p[m]=="function"),b[n+"Bubbles"]=o;j.removeChild(p),j=g=h=p=i=null,f(function(){var d,e,g,h,i,j,l,m,n,q,r,s,t,u=c.getElementsByTagName("body")[0];!u||(m=1,t="padding:0;margin:0;border:",r="position:absolute;top:0;left:0;width:1px;height:1px;",s=t+"0;visibility:hidden;",n="style='"+r+t+"5px solid #000;",q="
"+""+"
",d=c.createElement("div"),d.style.cssText=s+"width:0;height:0;position:static;top:0;margin-top:"+m+"px",u.insertBefore(d,u.firstChild),p=c.createElement("div"),d.appendChild(p),p.innerHTML="
t
",k=p.getElementsByTagName("td"),o=k[0].offsetHeight===0,k[0].style.display="",k[1].style.display="none",b.reliableHiddenOffsets=o&&k[0].offsetHeight===0,a.getComputedStyle&&(p.innerHTML="",l=c.createElement("div"),l.style.width="0",l.style.marginRight="0",p.style.width="2px",p.appendChild(l),b.reliableMarginRight=(parseInt((a.getComputedStyle(l,null)||{marginRight:0}).marginRight,10)||0)===0),typeof p.style.zoom!="undefined"&&(p.innerHTML="",p.style.width=p.style.padding="1px",p.style.border=0,p.style.overflow="hidden",p.style.display="inline",p.style.zoom=1,b.inlineBlockNeedsLayout=p.offsetWidth===3,p.style.display="block",p.style.overflow="visible",p.innerHTML="
",b.shrinkWrapBlocks=p.offsetWidth!==3),p.style.cssText=r+s,p.innerHTML=q,e=p.firstChild,g=e.firstChild,i=e.nextSibling.firstChild.firstChild,j={doesNotAddBorder:g.offsetTop!==5,doesAddBorderForTableAndCells:i.offsetTop===5},g.style.position="fixed",g.style.top="20px",j.fixedPosition=g.offsetTop===20||g.offsetTop===15,g.style.position=g.style.top="",e.style.overflow="hidden",e.style.position="relative",j.subtractsBorderForOverflowNotVisible=g.offsetTop===-5,j.doesNotIncludeMarginInBodyOffset=u.offsetTop!==m,a.getComputedStyle&&(p.style.marginTop="1%",b.pixelMargin=(a.getComputedStyle(p,null)||{marginTop:0}).marginTop!=="1%"),typeof d.style.zoom!="undefined"&&(d.style.zoom=1),u.removeChild(d),l=p=d=null,f.extend(b,j))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e1,null,!1)},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){var d=2;typeof a!="string"&&(c=a,a="fx",d--);if(arguments.length1)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,f.prop,a,b,arguments.length>1)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.type]||f.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.type]||f.valHooks[g.nodeName.toLowerCase()];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h,i=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;i=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/(?:^|\s)hover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function( a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler,g=p.selector),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&j.push({elem:this,matches:d.slice(e)});for(k=0;k0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));o.match.globalPOS=p;var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/]","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
","
"]),f.fn.extend({text:function(a){return f.access(this,function(a){return a===b?f.text(this):this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f .clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){return f.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(;d1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test("<"+a.nodeName+">")?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g,h,i,j=[];b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof l=="number"&&(l+="");if(!l)continue;if(typeof l=="string")if(!_.test(l))l=b.createTextNode(l);else{l=l.replace(Y,"<$1>");var m=(Z.exec(l)||["",""])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement("div"),q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+l+n[2];while(o--)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m==="table"&&!s?p.firstChild&&p.firstChild.childNodes:n[1]===""&&!s?p.childNodes:[];for(i=t.length-1;i>=0;--i)f.nodeName(t[i],"tbody")&&!t[i].childNodes.length&&t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&&X.test(l)&&p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p&&(p.parentNode.removeChild(p),q.length>0&&(r=q[q.length-1],r&&r.parentNode&&r.parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&&typeof (u=l.length)=="number")for(i=0;i1)},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=by(a,"opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bu.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(by)return by(a,c)},swap:function(a,b,c){var d={},e,f;for(f in b)d[f]=a.style[f],a.style[f]=b[f];e=c.call(a);for(f in b)a.style[f]=d[f];return e}}),f.curCSS=f.css,c.defaultView&&c.defaultView.getComputedStyle&&(bz=function(a,b){var c,d,e,g,h=a.style;b=b.replace(br,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b))),!f.support.pixelMargin&&e&&bv.test(b)&&bt.test(c)&&(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.documentElement.currentStyle&&(bA=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f==null&&g&&(e=g[b])&&(f=e),bt.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),by=bz||bA,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0?bB(a,b,d):f.swap(a,bw,function(){return bB(a,b,d)})},set:function(a,b){return bs.test(b)?b+"px":b}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bq.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bp,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bp.test(g)?g.replace(bp,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){return f.swap(a,{display:"inline-block"},function(){return b?by(a,"margin-right"):a.style.marginRight})}})}),f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)}),f.each({margin:"",padding:"",border:"Width"},function(a,b){f.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bx[d]+b]=e[d]||e[d-2]||e[0];return f}}});var bC=/%20/g,bD=/\[\]$/,bE=/\r?\n/g,bF=/#.*$/,bG=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bH=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bI=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bJ=/^(?:GET|HEAD)$/,bK=/^\/\//,bL=/\?/,bM=/)<[^<]*)*<\/script>/gi,bN=/^(?:select|textarea)/i,bO=/\s+/,bP=/([?&])_=[^&]*/,bQ=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV,bW=["*/"]+["*"];try{bU=e.href}catch(bX){bU=c.createElement("a"),bU.href="",bU=bU.href}bV=bQ.exec(bU.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bR)return bR.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bM,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bN.test(this.nodeName)||bH.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bE,"\r\n")}}):{name:b.name,value:c.replace(bE,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b$(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b$(a,b);return a},ajaxSettings:{url:bU,isLocal:bI.test(bV[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bW},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bY(bS),ajaxTransport:bY(bT),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?ca(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cb(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bF,"").replace(bK,bV[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bO),d.crossDomain==null&&(r=bQ.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bV[1]&&r[2]==bV[2]&&(r[3]||(r[1]==="http:"?80:443))==(bV[3]||(bV[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bZ(bS,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bJ.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bL.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bP,"$1_="+x);d.url=y+(y===d.url?(bL.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bW+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bZ(bT,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g,a[g],c,e);return d.join("&").replace(bC,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cc++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=typeof b.data=="string"&&/^application\/x\-www\-form\-urlencoded/.test(b.contentType);if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cd,l),b.url===j&&(e&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n);try{m.text=h.responseText}catch(a){}try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,co,cp=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cq;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(ct("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);f.fn[a]=function(e){return f.access(this,function(a,e,g){var h=cy(a);if(g===b)return h?c in h?h[c]:f.support.boxModel&&h.document.documentElement[e]||h.document.body[e]:a[e];h?h.scrollTo(d?f(h).scrollLeft():g,d?g:f(h).scrollTop()):a[e]=g},a,e,arguments.length,null)}}),f.each({Height:"height",Width:"width"},function(a,c){var d="client"+a,e="scroll"+a,g="offset"+a;f.fn["inner"+a]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,c,"padding")):this[c]():null},f.fn["outer"+a]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,c,a?"margin":"border")):this[c]():null},f.fn[c]=function(a){return f.access(this,function(a,c,h){var i,j,k,l;if(f.isWindow(a)){i=a.document,j=i.documentElement[d];return f.support.boxModel&&j||i.body&&i.body[d]||j}if(a.nodeType===9){i=a.documentElement;if(i[d]>=i[e])return i[d];return Math.max(a.body[e],i[e],a.body[g],i[g])}if(h===b){k=f.css(a,c),l=parseFloat(k);return f.isNumeric(l)?l:k}f(a).css(c,h)},c,a,arguments.length,null)}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window);logback_1.0.13/logback-site/src/site/pages/js/prettify.js0000644000175000017500000016343311377016712023211 0ustar drazzibdrazzib// Copyright (C) 2006 Google Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /** * @fileoverview * some functions for browser-side pretty printing of code contained in html. *

* * For a fairly comprehensive set of languages see the * README * file that came with this source. At a minimum, the lexer should work on a * number of languages including C and friends, Java, Python, Bash, SQL, HTML, * XML, CSS, Javascript, and Makefiles. It works passably on Ruby, PHP and Awk * and a subset of Perl, but, because of commenting conventions, doesn't work on * Smalltalk, Lisp-like, or CAML-like languages without an explicit lang class. *

* Usage:

    *
  1. include this source file in an html page via * {@code } *
  2. define style rules. See the example page for examples. *
  3. mark the {@code
    } and {@code } tags in your source with
     *    {@code class=prettyprint.}
     *    You can also use the (html deprecated) {@code } tag, but the pretty
     *    printer needs to do more substantial DOM manipulations to support that, so
     *    some css styles may not be preserved.
     * </ol>
     * That's it.  I wanted to keep the API as simple as possible, so there's no
     * need to specify which language the code is in, but if you wish, you can add
     * another class to the {@code <pre>} or {@code <code>} element to specify the
     * language, as in {@code <pre class="prettyprint lang-java">}.  Any class that
     * starts with "lang-" followed by a file extension, specifies the file type.
     * See the "lang-*.js" files in this directory for code that implements
     * per-language file handlers.
     * <p>
     * Change log:<br>
     * cbeust, 2006/08/22
     * <blockquote>
     *   Java annotations (start with "@") are now captured as literals ("lit")
     * </blockquote>
     * @requires console
     * @overrides window
     */
    
    // JSLint declarations
    /*global console, document, navigator, setTimeout, window */
    
    /**
     * Split {@code prettyPrint} into multiple timeouts so as not to interfere with
     * UI events.
     * If set to {@code false}, {@code prettyPrint()} is synchronous.
     */
    window['PR_SHOULD_USE_CONTINUATION'] = true;
    
    /** the number of characters between tab columns */
    window['PR_TAB_WIDTH'] = 8;
    
    /** Walks the DOM returning a properly escaped version of innerHTML.
      * @param {Node} node
      * @param {Array.<string>} out output buffer that receives chunks of HTML.
      */
    window['PR_normalizedHtml']
    
    /** Contains functions for creating and registering new language handlers.
      * @type {Object}
      */
      = window['PR']
    
    /** Pretty print a chunk of code.
      *
      * @param {string} sourceCodeHtml code as html
      * @return {string} code as html, but prettier
      */
      = window['prettyPrintOne']
    /** Find all the {@code <pre>} and {@code <code>} tags in the DOM with
      * {@code class=prettyprint} and prettify them.
      * @param {Function?} opt_whenDone if specified, called when the last entry
      *     has been finished.
      */
      = window['prettyPrint'] = void 0;
    
    /** browser detection. @extern @returns false if not IE, otherwise the major version. */
    window['_pr_isIE6'] = function () {
      var ieVersion = navigator && navigator.userAgent &&
          navigator.userAgent.match(/\bMSIE ([678])\./);
      ieVersion = ieVersion ? +ieVersion[1] : false;
      window['_pr_isIE6'] = function () { return ieVersion; };
      return ieVersion;
    };
    
    
    (function () {
      // Keyword lists for various languages.
      var FLOW_CONTROL_KEYWORDS =
          "break continue do else for if return while ";
      var C_KEYWORDS = FLOW_CONTROL_KEYWORDS + "auto case char const default " +
          "double enum extern float goto int long register short signed sizeof " +
          "static struct switch typedef union unsigned void volatile ";
      var COMMON_KEYWORDS = C_KEYWORDS + "catch class delete false import " +
          "new operator private protected public this throw true try typeof ";
      var CPP_KEYWORDS = COMMON_KEYWORDS + "alignof align_union asm axiom bool " +
          "concept concept_map const_cast constexpr decltype " +
          "dynamic_cast explicit export friend inline late_check " +
          "mutable namespace nullptr reinterpret_cast static_assert static_cast " +
          "template typeid typename using virtual wchar_t where ";
      var JAVA_KEYWORDS = COMMON_KEYWORDS +
          "abstract boolean byte extends final finally implements import " +
          "instanceof null native package strictfp super synchronized throws " +
          "transient ";
      var CSHARP_KEYWORDS = JAVA_KEYWORDS +
          "as base by checked decimal delegate descending event " +
          "fixed foreach from group implicit in interface internal into is lock " +
          "object out override orderby params partial readonly ref sbyte sealed " +
          "stackalloc string select uint ulong unchecked unsafe ushort var ";
      var JSCRIPT_KEYWORDS = COMMON_KEYWORDS +
          "debugger eval export function get null set undefined var with " +
          "Infinity NaN ";
      var PERL_KEYWORDS = "caller delete die do dump elsif eval exit foreach for " +
          "goto if import last local my next no our print package redo require " +
          "sub undef unless until use wantarray while BEGIN END ";
      var PYTHON_KEYWORDS = FLOW_CONTROL_KEYWORDS + "and as assert class def del " +
          "elif except exec finally from global import in is lambda " +
          "nonlocal not or pass print raise try with yield " +
          "False True None ";
      var RUBY_KEYWORDS = FLOW_CONTROL_KEYWORDS + "alias and begin case class def" +
          " defined elsif end ensure false in module next nil not or redo rescue " +
          "retry self super then true undef unless until when yield BEGIN END ";
      var SH_KEYWORDS = FLOW_CONTROL_KEYWORDS + "case done elif esac eval fi " +
          "function in local set then until ";
      var ALL_KEYWORDS = (
          CPP_KEYWORDS + CSHARP_KEYWORDS + JSCRIPT_KEYWORDS + PERL_KEYWORDS +
          PYTHON_KEYWORDS + RUBY_KEYWORDS + SH_KEYWORDS);
    
      // token style names.  correspond to css classes
      /** token style for a string literal */
      var PR_STRING = 'str';
      /** token style for a keyword */
      var PR_KEYWORD = 'kwd';
      /** token style for a comment */
      var PR_COMMENT = 'com';
      /** token style for a type */
      var PR_TYPE = 'typ';
      /** token style for a literal value.  e.g. 1, null, true. */
      var PR_LITERAL = 'lit';
      /** token style for a punctuation string. */
      var PR_PUNCTUATION = 'pun';
      /** token style for a punctuation string. */
      var PR_PLAIN = 'pln';
    
      /** token style for an sgml tag. */
      var PR_TAG = 'tag';
      /** token style for a markup declaration such as a DOCTYPE. */
      var PR_DECLARATION = 'dec';
      /** token style for embedded source. */
      var PR_SOURCE = 'src';
      /** token style for an sgml attribute name. */
      var PR_ATTRIB_NAME = 'atn';
      /** token style for an sgml attribute value. */
      var PR_ATTRIB_VALUE = 'atv';
    
      /**
       * A class that indicates a section of markup that is not code, e.g. to allow
       * embedding of line numbers within code listings.
       */
      var PR_NOCODE = 'nocode';
    
      /** A set of tokens that can precede a regular expression literal in
        * javascript.
        * http://www.mozilla.org/js/language/js20/rationale/syntax.html has the full
        * list, but I've removed ones that might be problematic when seen in
        * languages that don't support regular expression literals.
        *
        * <p>Specifically, I've removed any keywords that can't precede a regexp
        * literal in a syntactically legal javascript program, and I've removed the
        * "in" keyword since it's not a keyword in many languages, and might be used
        * as a count of inches.
        *
        * <p>The link a above does not accurately describe EcmaScript rules since
        * it fails to distinguish between (a=++/b/i) and (a++/b/i) but it works
        * very well in practice.
        *
        * @private
        */
      var REGEXP_PRECEDER_PATTERN = function () {
          var preceders = [
              "!", "!=", "!==", "#", "%", "%=", "&", "&&", "&&=",
              "&=", "(", "*", "*=", /* "+", */ "+=", ",", /* "-", */ "-=",
              "->", /*".", "..", "...", handled below */ "/", "/=", ":", "::", ";",
              "<", "<<", "<<=", "<=", "=", "==", "===", ">",
              ">=", ">>", ">>=", ">>>", ">>>=", "?", "@", "[",
              "^", "^=", "^^", "^^=", "{", "|", "|=", "||",
              "||=", "~" /* handles =~ and !~ */,
              "break", "case", "continue", "delete",
              "do", "else", "finally", "instanceof",
              "return", "throw", "try", "typeof"
              ];
          var pattern = '(?:^^|[+-]';
          for (var i = 0; i < preceders.length; ++i) {
            pattern += '|' + preceders[i].replace(/([^=<>:&a-z])/g, '\\$1');
          }
          pattern += ')\\s*';  // matches at end, and matches empty string
          return pattern;
          // CAVEAT: this does not properly handle the case where a regular
          // expression immediately follows another since a regular expression may
          // have flags for case-sensitivity and the like.  Having regexp tokens
          // adjacent is not valid in any language I'm aware of, so I'm punting.
          // TODO: maybe style special characters inside a regexp as punctuation.
        }();
    
      // Define regexps here so that the interpreter doesn't have to create an
      // object each time the function containing them is called.
      // The language spec requires a new object created even if you don't access
      // the $1 members.
      var pr_amp = /&/g;
      var pr_lt = /</g;
      var pr_gt = />/g;
      var pr_quot = /\"/g;
      /** like textToHtml but escapes double quotes to be attribute safe. */
      function attribToHtml(str) {
        return str.replace(pr_amp, '&amp;')
            .replace(pr_lt, '&lt;')
            .replace(pr_gt, '&gt;')
            .replace(pr_quot, '&quot;');
      }
    
      /** escapest html special characters to html. */
      function textToHtml(str) {
        return str.replace(pr_amp, '&amp;')
            .replace(pr_lt, '&lt;')
            .replace(pr_gt, '&gt;');
      }
    
    
      var pr_ltEnt = /&lt;/g;
      var pr_gtEnt = /&gt;/g;
      var pr_aposEnt = /&apos;/g;
      var pr_quotEnt = /&quot;/g;
      var pr_ampEnt = /&amp;/g;
      var pr_nbspEnt = /&nbsp;/g;
      /** unescapes html to plain text. */
      function htmlToText(html) {
        var pos = html.indexOf('&');
        if (pos < 0) { return html; }
        // Handle numeric entities specially.  We can't use functional substitution
        // since that doesn't work in older versions of Safari.
        // These should be rare since most browsers convert them to normal chars.
        for (--pos; (pos = html.indexOf('&#', pos + 1)) >= 0;) {
          var end = html.indexOf(';', pos);
          if (end >= 0) {
            var num = html.substring(pos + 3, end);
            var radix = 10;
            if (num && num.charAt(0) === 'x') {
              num = num.substring(1);
              radix = 16;
            }
            var codePoint = parseInt(num, radix);
            if (!isNaN(codePoint)) {
              html = (html.substring(0, pos) + String.fromCharCode(codePoint) +
                      html.substring(end + 1));
            }
          }
        }
    
        return html.replace(pr_ltEnt, '<')
            .replace(pr_gtEnt, '>')
            .replace(pr_aposEnt, "'")
            .replace(pr_quotEnt, '"')
            .replace(pr_nbspEnt, ' ')
            .replace(pr_ampEnt, '&');
      }
    
      /** is the given node's innerHTML normally unescaped? */
      function isRawContent(node) {
        return 'XMP' === node.tagName;
      }
    
      var newlineRe = /[\r\n]/g;
      /**
       * Are newlines and adjacent spaces significant in the given node's innerHTML?
       */
      function isPreformatted(node, content) {
        // PRE means preformatted, and is a very common case, so don't create
        // unnecessary computed style objects.
        if ('PRE' === node.tagName) { return true; }
        if (!newlineRe.test(content)) { return true; }  // Don't care
        var whitespace = '';
        // For disconnected nodes, IE has no currentStyle.
        if (node.currentStyle) {
          whitespace = node.currentStyle.whiteSpace;
        } else if (window.getComputedStyle) {
          // Firefox makes a best guess if node is disconnected whereas Safari
          // returns the empty string.
          whitespace = window.getComputedStyle(node, null).whiteSpace;
        }
        return !whitespace || whitespace === 'pre';
      }
    
      function normalizedHtml(node, out) {
        switch (node.nodeType) {
          case 1:  // an element
            var name = node.tagName.toLowerCase();
            out.push('<', name);
            for (var i = 0; i < node.attributes.length; ++i) {
              var attr = node.attributes[i];
              if (!attr.specified) { continue; }
              out.push(' ');
              normalizedHtml(attr, out);
            }
            out.push('>');
            for (var child = node.firstChild; child; child = child.nextSibling) {
              normalizedHtml(child, out);
            }
            if (node.firstChild || !/^(?:br|link|img)$/.test(name)) {
              out.push('<\/', name, '>');
            }
            break;
          case 2: // an attribute
            out.push(node.name.toLowerCase(), '="', attribToHtml(node.value), '"');
            break;
          case 3: case 4: // text
            out.push(textToHtml(node.nodeValue));
            break;
        }
      }
    
      /**
       * Given a group of {@link RegExp}s, returns a {@code RegExp} that globally
       * matches the union o the sets o strings matched d by the input RegExp.
       * Since it matches globally, if the input strings have a start-of-input
       * anchor (/^.../), it is ignored for the purposes of unioning.
       * @param {Array.<RegExp>} regexs non multiline, non-global regexs.
       * @return {RegExp} a global regex.
       */
      function combinePrefixPatterns(regexs) {
        var capturedGroupIndex = 0;
    
        var needToFoldCase = false;
        var ignoreCase = false;
        for (var i = 0, n = regexs.length; i < n; ++i) {
          var regex = regexs[i];
          if (regex.ignoreCase) {
            ignoreCase = true;
          } else if (/[a-z]/i.test(regex.source.replace(
                         /\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi, ''))) {
            needToFoldCase = true;
            ignoreCase = false;
            break;
          }
        }
    
        function decodeEscape(charsetPart) {
          if (charsetPart.charAt(0) !== '\\') { return charsetPart.charCodeAt(0); }
          switch (charsetPart.charAt(1)) {
            case 'b': return 8;
            case 't': return 9;
            case 'n': return 0xa;
            case 'v': return 0xb;
            case 'f': return 0xc;
            case 'r': return 0xd;
            case 'u': case 'x':
              return parseInt(charsetPart.substring(2), 16)
                  || charsetPart.charCodeAt(1);
            case '0': case '1': case '2': case '3': case '4':
            case '5': case '6': case '7':
              return parseInt(charsetPart.substring(1), 8);
            default: return charsetPart.charCodeAt(1);
          }
        }
    
        function encodeEscape(charCode) {
          if (charCode < 0x20) {
            return (charCode < 0x10 ? '\\x0' : '\\x') + charCode.toString(16);
          }
          var ch = String.fromCharCode(charCode);
          if (ch === '\\' || ch === '-' || ch === '[' || ch === ']') {
            ch = '\\' + ch;
          }
          return ch;
        }
    
        function caseFoldCharset(charSet) {
          var charsetParts = charSet.substring(1, charSet.length - 1).match(
              new RegExp(
                  '\\\\u[0-9A-Fa-f]{4}'
                  + '|\\\\x[0-9A-Fa-f]{2}'
                  + '|\\\\[0-3][0-7]{0,2}'
                  + '|\\\\[0-7]{1,2}'
                  + '|\\\\[\\s\\S]'
                  + '|-'
                  + '|[^-\\\\]',
                  'g'));
          var groups = [];
          var ranges = [];
          var inverse = charsetParts[0] === '^';
          for (var i = inverse ? 1 : 0, n = charsetParts.length; i < n; ++i) {
            var p = charsetParts[i];
            switch (p) {
              case '\\B': case '\\b':
              case '\\D': case '\\d':
              case '\\S': case '\\s':
              case '\\W': case '\\w':
                groups.push(p);
                continue;
            }
            var start = decodeEscape(p);
            var end;
            if (i + 2 < n && '-' === charsetParts[i + 1]) {
              end = decodeEscape(charsetParts[i + 2]);
              i += 2;
            } else {
              end = start;
            }
            ranges.push([start, end]);
            // If the range might intersect letters, then expand it.
            if (!(end < 65 || start > 122)) {
              if (!(end < 65 || start > 90)) {
                ranges.push([Math.max(65, start) | 32, Math.min(end, 90) | 32]);
              }
              if (!(end < 97 || start > 122)) {
                ranges.push([Math.max(97, start) & ~32, Math.min(end, 122) & ~32]);
              }
            }
          }
    
          // [[1, 10], [3, 4], [8, 12], [14, 14], [16, 16], [17, 17]]
          // -> [[1, 12], [14, 14], [16, 17]]
          ranges.sort(function (a, b) { return (a[0] - b[0]) || (b[1]  - a[1]); });
          var consolidatedRanges = [];
          var lastRange = [NaN, NaN];
          for (var i = 0; i < ranges.length; ++i) {
            var range = ranges[i];
            if (range[0] <= lastRange[1] + 1) {
              lastRange[1] = Math.max(lastRange[1], range[1]);
            } else {
              consolidatedRanges.push(lastRange = range);
            }
          }
    
          var out = ['['];
          if (inverse) { out.push('^'); }
          out.push.apply(out, groups);
          for (var i = 0; i < consolidatedRanges.length; ++i) {
            var range = consolidatedRanges[i];
            out.push(encodeEscape(range[0]));
            if (range[1] > range[0]) {
              if (range[1] + 1 > range[0]) { out.push('-'); }
              out.push(encodeEscape(range[1]));
            }
          }
          out.push(']');
          return out.join('');
        }
    
        function allowAnywhereFoldCaseAndRenumberGroups(regex) {
          // Split into character sets, escape sequences, punctuation strings
          // like ('(', '(?:', ')', '^'), and runs of characters that do not
          // include any of the above.
          var parts = regex.source.match(
              new RegExp(
                  '(?:'
                  + '\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]'  // a character set
                  + '|\\\\u[A-Fa-f0-9]{4}'  // a unicode escape
                  + '|\\\\x[A-Fa-f0-9]{2}'  // a hex escape
                  + '|\\\\[0-9]+'  // a back-reference or octal escape
                  + '|\\\\[^ux0-9]'  // other escape sequence
                  + '|\\(\\?[:!=]'  // start of a non-capturing group
                  + '|[\\(\\)\\^]'  // start/emd of a group, or line start
                  + '|[^\\x5B\\x5C\\(\\)\\^]+'  // run of other characters
                  + ')',
                  'g'));
          var n = parts.length;
    
          // Maps captured group numbers to the number they will occupy in
          // the output or to -1 if that has not been determined, or to
          // undefined if they need not be capturing in the output.
          var capturedGroups = [];
    
          // Walk over and identify back references to build the capturedGroups
          // mapping.
          for (var i = 0, groupIndex = 0; i < n; ++i) {
            var p = parts[i];
            if (p === '(') {
              // groups are 1-indexed, so max group index is count of '('
              ++groupIndex;
            } else if ('\\' === p.charAt(0)) {
              var decimalValue = +p.substring(1);
              if (decimalValue && decimalValue <= groupIndex) {
                capturedGroups[decimalValue] = -1;
              }
            }
          }
    
          // Renumber groups and reduce capturing groups to non-capturing groups
          // where possible.
          for (var i = 1; i < capturedGroups.length; ++i) {
            if (-1 === capturedGroups[i]) {
              capturedGroups[i] = ++capturedGroupIndex;
            }
          }
          for (var i = 0, groupIndex = 0; i < n; ++i) {
            var p = parts[i];
            if (p === '(') {
              ++groupIndex;
              if (capturedGroups[groupIndex] === undefined) {
                parts[i] = '(?:';
              }
            } else if ('\\' === p.charAt(0)) {
              var decimalValue = +p.substring(1);
              if (decimalValue && decimalValue <= groupIndex) {
                parts[i] = '\\' + capturedGroups[groupIndex];
              }
            }
          }
    
          // Remove any prefix anchors so that the output will match anywhere.
          // ^^ really does mean an anchored match though.
          for (var i = 0, groupIndex = 0; i < n; ++i) {
            if ('^' === parts[i] && '^' !== parts[i + 1]) { parts[i] = ''; }
          }
    
          // Expand letters to groupts to handle mixing of case-sensitive and
          // case-insensitive patterns if necessary.
          if (regex.ignoreCase && needToFoldCase) {
            for (var i = 0; i < n; ++i) {
              var p = parts[i];
              var ch0 = p.charAt(0);
              if (p.length >= 2 && ch0 === '[') {
                parts[i] = caseFoldCharset(p);
              } else if (ch0 !== '\\') {
                // TODO: handle letters in numeric escapes.
                parts[i] = p.replace(
                    /[a-zA-Z]/g,
                    function (ch) {
                      var cc = ch.charCodeAt(0);
                      return '[' + String.fromCharCode(cc & ~32, cc | 32) + ']';
                    });
              }
            }
          }
    
          return parts.join('');
        }
    
        var rewritten = [];
        for (var i = 0, n = regexs.length; i < n; ++i) {
          var regex = regexs[i];
          if (regex.global || regex.multiline) { throw new Error('' + regex); }
          rewritten.push(
              '(?:' + allowAnywhereFoldCaseAndRenumberGroups(regex) + ')');
        }
    
        return new RegExp(rewritten.join('|'), ignoreCase ? 'gi' : 'g');
      }
    
      var PR_innerHtmlWorks = null;
      function getInnerHtml(node) {
        // inner html is hopelessly broken in Safari 2.0.4 when the content is
        // an html description of well formed XML and the containing tag is a PRE
        // tag, so we detect that case and emulate innerHTML.
        if (null === PR_innerHtmlWorks) {
          var testNode = document.createElement('PRE');
          testNode.appendChild(
              document.createTextNode('<!DOCTYPE foo PUBLIC "foo bar">\n<foo />'));
          PR_innerHtmlWorks = !/</.test(testNode.innerHTML);
        }
    
        if (PR_innerHtmlWorks) {
          var content = node.innerHTML;
          // XMP tags contain unescaped entities so require special handling.
          if (isRawContent(node)) {
            content = textToHtml(content);
          } else if (!isPreformatted(node, content)) {
            content = content.replace(/(<br\s*\/?>)[\r\n]+/g, '$1')
                .replace(/(?:[\r\n]+[ \t]*)+/g, ' ');
          }
          return content;
        }
    
        var out = [];
        for (var child = node.firstChild; child; child = child.nextSibling) {
          normalizedHtml(child, out);
        }
        return out.join('');
      }
    
      /** returns a function that expand tabs to spaces.  This function can be fed
        * successive chunks of text, and will maintain its own internal state to
        * keep track of how tabs are expanded.
        * @return {function (string) : string} a function that takes
        *   plain text and return the text with tabs expanded.
        * @private
        */
      function makeTabExpander(tabWidth) {
        var SPACES = '                ';
        var charInLine = 0;
    
        return function (plainText) {
          // walk over each character looking for tabs and newlines.
          // On tabs, expand them.  On newlines, reset charInLine.
          // Otherwise increment charInLine
          var out = null;
          var pos = 0;
          for (var i = 0, n = plainText.length; i < n; ++i) {
            var ch = plainText.charAt(i);
    
            switch (ch) {
              case '\t':
                if (!out) { out = []; }
                out.push(plainText.substring(pos, i));
                // calculate how much space we need in front of this part
                // nSpaces is the amount of padding -- the number of spaces needed
                // to move us to the next column, where columns occur at factors of
                // tabWidth.
                var nSpaces = tabWidth - (charInLine % tabWidth);
                charInLine += nSpaces;
                for (; nSpaces >= 0; nSpaces -= SPACES.length) {
                  out.push(SPACES.substring(0, nSpaces));
                }
                pos = i + 1;
                break;
              case '\n':
                charInLine = 0;
                break;
              default:
                ++charInLine;
            }
          }
          if (!out) { return plainText; }
          out.push(plainText.substring(pos));
          return out.join('');
        };
      }
    
      var pr_chunkPattern = new RegExp(
          '[^<]+'  // A run of characters other than '<'
          + '|<\!--[\\s\\S]*?--\>'  // an HTML comment
          + '|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>'  // a CDATA section
          // a probable tag that should not be highlighted
          + '|<\/?[a-zA-Z](?:[^>\"\']|\'[^\']*\'|\"[^\"]*\")*>'
          + '|<',  // A '<' that does not begin a larger chunk
          'g');
      var pr_commentPrefix = /^<\!--/;
      var pr_cdataPrefix = /^<!\[CDATA\[/;
      var pr_brPrefix = /^<br\b/i;
      var pr_tagNameRe = /^<(\/?)([a-zA-Z][a-zA-Z0-9]*)/;
    
      /** split markup into chunks of html tags (style null) and
        * plain text (style {@link #PR_PLAIN}), converting tags which are
        * significant for tokenization (<br>) into their textual equivalent.
        *
        * @param {string} s html where whitespace is considered significant.
        * @return {Object} source code and extracted tags.
        * @private
        */
      function extractTags(s) {
        // since the pattern has the 'g' modifier and defines no capturing groups,
        // this will return a list of all chunks which we then classify and wrap as
        // PR_Tokens
        var matches = s.match(pr_chunkPattern);
        var sourceBuf = [];
        var sourceBufLen = 0;
        var extractedTags = [];
        if (matches) {
          for (var i = 0, n = matches.length; i < n; ++i) {
            var match = matches[i];
            if (match.length > 1 && match.charAt(0) === '<') {
              if (pr_commentPrefix.test(match)) { continue; }
              if (pr_cdataPrefix.test(match)) {
                // strip CDATA prefix and suffix.  Don't unescape since it's CDATA
                sourceBuf.push(match.substring(9, match.length - 3));
                sourceBufLen += match.length - 12;
              } else if (pr_brPrefix.test(match)) {
                // <br> tags are lexically significant so convert them to text.
                // This is undone later.
                sourceBuf.push('\n');
                ++sourceBufLen;
              } else {
                if (match.indexOf(PR_NOCODE) >= 0 && isNoCodeTag(match)) {
                  // A <span class="nocode"> will start a section that should be
                  // ignored.  Continue walking the list until we see a matching end
                  // tag.
                  var name = match.match(pr_tagNameRe)[2];
                  var depth = 1;
                  var j;
                  end_tag_loop:
                  for (j = i + 1; j < n; ++j) {
                    var name2 = matches[j].match(pr_tagNameRe);
                    if (name2 && name2[2] === name) {
                      if (name2[1] === '/') {
                        if (--depth === 0) { break end_tag_loop; }
                      } else {
                        ++depth;
                      }
                    }
                  }
                  if (j < n) {
                    extractedTags.push(
                        sourceBufLen, matches.slice(i, j + 1).join(''));
                    i = j;
                  } else {  // Ignore unclosed sections.
                    extractedTags.push(sourceBufLen, match);
                  }
                } else {
                  extractedTags.push(sourceBufLen, match);
                }
              }
            } else {
              var literalText = htmlToText(match);
              sourceBuf.push(literalText);
              sourceBufLen += literalText.length;
            }
          }
        }
        return { source: sourceBuf.join(''), tags: extractedTags };
      }
    
      /** True if the given tag contains a class attribute with the nocode class. */
      function isNoCodeTag(tag) {
        return !!tag
            // First canonicalize the representation of attributes
            .replace(/\s(\w+)\s*=\s*(?:\"([^\"]*)\"|'([^\']*)'|(\S+))/g,
                     ' $1="$2$3$4"')
            // Then look for the attribute we want.
            .match(/[cC][lL][aA][sS][sS]=\"[^\"]*\bnocode\b/);
      }
    
      /**
       * Apply the given language handler to sourceCode and add the resulting
       * decorations to out.
       * @param {number} basePos the index of sourceCode within the chunk of source
       *    whose decorations are already present on out.
       */
      function appendDecorations(basePos, sourceCode, langHandler, out) {
        if (!sourceCode) { return; }
        var job = {
          source: sourceCode,
          basePos: basePos
        };
        langHandler(job);
        out.push.apply(out, job.decorations);
      }
    
      /** Given triples of [style, pattern, context] returns a lexing function,
        * The lexing function interprets the patterns to find token boundaries and
        * returns a decoration list of the form
        * [index_0, style_0, index_1, style_1, ..., index_n, style_n]
        * where index_n is an index into the sourceCode, and style_n is a style
        * constant like PR_PLAIN.  index_n-1 <= index_n, and style_n-1 applies to
        * all characters in sourceCode[index_n-1:index_n].
        *
        * The stylePatterns is a list whose elements have the form
        * [style : string, pattern : RegExp, DEPRECATED, shortcut : string].
        *
        * Style is a style constant like PR_PLAIN, or can be a string of the
        * form 'lang-FOO', where FOO is a language extension describing the
        * language of the portion of the token in $1 after pattern executes.
        * E.g., if style is 'lang-lisp', and group 1 contains the text
        * '(hello (world))', then that portion of the token will be passed to the
        * registered lisp handler for formatting.
        * The text before and after group 1 will be restyled using this decorator
        * so decorators should take care that this doesn't result in infinite
        * recursion.  For example, the HTML lexer rule for SCRIPT elements looks
        * something like ['lang-js', /<[s]cript>(.+?)<\/script>/].  This may match
        * '<script>foo()<\/script>', which would cause the current decorator to
        * be called with '<script>' which would not match the same rule since
        * group 1 must not be empty, so it would be instead styled as PR_TAG by
        * the generic tag rule.  The handler registered for the 'js' extension would
        * then be called with 'foo()', and finally, the current decorator would
        * be called with '<\/script>' which would not match the original rule and
        * so the generic tag rule would identify it as a tag.
        *
        * Pattern must only match prefixes, and if it matches a prefix, then that
        * match is considered a token with the same style.
        *
        * Context is applied to the last non-whitespace, non-comment token
        * recognized.
        *
        * Shortcut is an optional string of characters, any of which, if the first
        * character, gurantee that this pattern and only this pattern matches.
        *
        * @param {Array} shortcutStylePatterns patterns that always start with
        *   a known character.  Must have a shortcut string.
        * @param {Array} fallthroughStylePatterns patterns that will be tried in
        *   order if the shortcut ones fail.  May have shortcuts.
        *
        * @return {function (Object)} a
        *   function that takes source code and returns a list of decorations.
        */
      function createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns) {
        var shortcuts = {};
        var tokenizer;
        (function () {
          var allPatterns = shortcutStylePatterns.concat(fallthroughStylePatterns);
          var allRegexs = [];
          var regexKeys = {};
          for (var i = 0, n = allPatterns.length; i < n; ++i) {
            var patternParts = allPatterns[i];
            var shortcutChars = patternParts[3];
            if (shortcutChars) {
              for (var c = shortcutChars.length; --c >= 0;) {
                shortcuts[shortcutChars.charAt(c)] = patternParts;
              }
            }
            var regex = patternParts[1];
            var k = '' + regex;
            if (!regexKeys.hasOwnProperty(k)) {
              allRegexs.push(regex);
              regexKeys[k] = null;
            }
          }
          allRegexs.push(/[\0-\uffff]/);
          tokenizer = combinePrefixPatterns(allRegexs);
        })();
    
        var nPatterns = fallthroughStylePatterns.length;
        var notWs = /\S/;
    
        /**
         * Lexes job.source and produces an output array job.decorations of style
         * classes preceded by the position at which they start in job.source in
         * order.
         *
         * @param {Object} job an object like {@code
         *    source: {string} sourceText plain text,
         *    basePos: {int} position of job.source in the larger chunk of
         *        sourceCode.
         * }
         */
        var decorate = function (job) {
          var sourceCode = job.source, basePos = job.basePos;
          /** Even entries are positions in source in ascending order.  Odd enties
            * are style markers (e.g., PR_COMMENT) that run from that position until
            * the end.
            * @type {Array.<number|string>}
            */
          var decorations = [basePos, PR_PLAIN];
          var pos = 0;  // index into sourceCode
          var tokens = sourceCode.match(tokenizer) || [];
          var styleCache = {};
    
          for (var ti = 0, nTokens = tokens.length; ti < nTokens; ++ti) {
            var token = tokens[ti];
            var style = styleCache[token];
            var match = void 0;
    
            var isEmbedded;
            if (typeof style === 'string') {
              isEmbedded = false;
            } else {
              var patternParts = shortcuts[token.charAt(0)];
              if (patternParts) {
                match = token.match(patternParts[1]);
                style = patternParts[0];
              } else {
                for (var i = 0; i < nPatterns; ++i) {
                  patternParts = fallthroughStylePatterns[i];
                  match = token.match(patternParts[1]);
                  if (match) {
                    style = patternParts[0];
                    break;
                  }
                }
    
                if (!match) {  // make sure that we make progress
                  style = PR_PLAIN;
                }
              }
    
              isEmbedded = style.length >= 5 && 'lang-' === style.substring(0, 5);
              if (isEmbedded && !(match && typeof match[1] === 'string')) {
                isEmbedded = false;
                style = PR_SOURCE;
              }
    
              if (!isEmbedded) { styleCache[token] = style; }
            }
    
            var tokenStart = pos;
            pos += token.length;
    
            if (!isEmbedded) {
              decorations.push(basePos + tokenStart, style);
            } else {  // Treat group 1 as an embedded block of source code.
              var embeddedSource = match[1];
              var embeddedSourceStart = token.indexOf(embeddedSource);
              var embeddedSourceEnd = embeddedSourceStart + embeddedSource.length;
              if (match[2]) {
                // If embeddedSource can be blank, then it would match at the
                // beginning which would cause us to infinitely recurse on the
                // entire token, so we catch the right context in match[2].
                embeddedSourceEnd = token.length - match[2].length;
                embeddedSourceStart = embeddedSourceEnd - embeddedSource.length;
              }
              var lang = style.substring(5);
              // Decorate the left of the embedded source
              appendDecorations(
                  basePos + tokenStart,
                  token.substring(0, embeddedSourceStart),
                  decorate, decorations);
              // Decorate the embedded source
              appendDecorations(
                  basePos + tokenStart + embeddedSourceStart,
                  embeddedSource,
                  langHandlerForExtension(lang, embeddedSource),
                  decorations);
              // Decorate the right of the embedded section
              appendDecorations(
                  basePos + tokenStart + embeddedSourceEnd,
                  token.substring(embeddedSourceEnd),
                  decorate, decorations);
            }
          }
          job.decorations = decorations;
        };
        return decorate;
      }
    
      /** returns a function that produces a list of decorations from source text.
        *
        * This code treats ", ', and ` as string delimiters, and \ as a string
        * escape.  It does not recognize perl's qq() style strings.
        * It has no special handling for double delimiter escapes as in basic, or
        * the tripled delimiters used in python, but should work on those regardless
        * although in those cases a single string literal may be broken up into
        * multiple adjacent string literals.
        *
        * It recognizes C, C++, and shell style comments.
        *
        * @param {Object} options a set of optional parameters.
        * @return {function (Object)} a function that examines the source code
        *     in the input job and builds the decoration list.
        */
      function sourceDecorator(options) {
        var shortcutStylePatterns = [], fallthroughStylePatterns = [];
        if (options['tripleQuotedStrings']) {
          // '''multi-line-string''', 'single-line-string', and double-quoted
          shortcutStylePatterns.push(
              [PR_STRING,  /^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,
               null, '\'"']);
        } else if (options['multiLineStrings']) {
          // 'multi-line-string', "multi-line-string"
          shortcutStylePatterns.push(
              [PR_STRING,  /^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,
               null, '\'"`']);
        } else {
          // 'single-line-string', "single-line-string"
          shortcutStylePatterns.push(
              [PR_STRING,
               /^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,
               null, '"\'']);
        }
        if (options['verbatimStrings']) {
          // verbatim-string-literal production from the C# grammar.  See issue 93.
          fallthroughStylePatterns.push(
              [PR_STRING, /^@\"(?:[^\"]|\"\")*(?:\"|$)/, null]);
        }
        if (options['hashComments']) {
          if (options['cStyleComments']) {
            // Stop C preprocessor declarations at an unclosed open comment
            shortcutStylePatterns.push(
                [PR_COMMENT, /^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,
                 null, '#']);
            fallthroughStylePatterns.push(
                [PR_STRING,
                 /^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,
                 null]);
          } else {
            shortcutStylePatterns.push([PR_COMMENT, /^#[^\r\n]*/, null, '#']);
          }
        }
        if (options['cStyleComments']) {
          fallthroughStylePatterns.push([PR_COMMENT, /^\/\/[^\r\n]*/, null]);
          fallthroughStylePatterns.push(
              [PR_COMMENT, /^\/\*[\s\S]*?(?:\*\/|$)/, null]);
        }
        if (options['regexLiterals']) {
          var REGEX_LITERAL = (
              // A regular expression literal starts with a slash that is
              // not followed by * or / so that it is not confused with
              // comments.
              '/(?=[^/*])'
              // and then contains any number of raw characters,
              + '(?:[^/\\x5B\\x5C]'
              // escape sequences (\x5C),
              +    '|\\x5C[\\s\\S]'
              // or non-nesting character sets (\x5B\x5D);
              +    '|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+'
              // finally closed by a /.
              + '/');
          fallthroughStylePatterns.push(
              ['lang-regex',
               new RegExp('^' + REGEXP_PRECEDER_PATTERN + '(' + REGEX_LITERAL + ')')
               ]);
        }
    
        var keywords = options['keywords'].replace(/^\s+|\s+$/g, '');
        if (keywords.length) {
          fallthroughStylePatterns.push(
              [PR_KEYWORD,
               new RegExp('^(?:' + keywords.replace(/\s+/g, '|') + ')\\b'), null]);
        }
    
        shortcutStylePatterns.push([PR_PLAIN,       /^\s+/, null, ' \r\n\t\xA0']);
        fallthroughStylePatterns.push(
            // TODO(mikesamuel): recognize non-latin letters and numerals in idents
            [PR_LITERAL,     /^@[a-z_$][a-z_$@0-9]*/i, null],
            [PR_TYPE,        /^@?[A-Z]+[a-z][A-Za-z_$@0-9]*/, null],
            [PR_PLAIN,       /^[a-z_$][a-z_$@0-9]*/i, null],
            [PR_LITERAL,
             new RegExp(
                 '^(?:'
                 // A hex number
                 + '0x[a-f0-9]+'
                 // or an octal or decimal number,
                 + '|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)'
                 // possibly in scientific notation
                 + '(?:e[+\\-]?\\d+)?'
                 + ')'
                 // with an optional modifier like UL for unsigned long
                 + '[a-z]*', 'i'),
             null, '0123456789'],
            [PR_PUNCTUATION, /^.[^\s\w\.$@\'\"\`\/\#]*/, null]);
    
        return createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns);
      }
    
      var decorateSource = sourceDecorator({
            'keywords': ALL_KEYWORDS,
            'hashComments': true,
            'cStyleComments': true,
            'multiLineStrings': true,
            'regexLiterals': true
          });
    
      /** Breaks {@code job.source} around style boundaries in
        * {@code job.decorations} while re-interleaving {@code job.extractedTags},
        * and leaves the result in {@code job.prettyPrintedHtml}.
        * @param {Object} job like {
        *    source: {string} source as plain text,
        *    extractedTags: {Array.<number|string>} extractedTags chunks of raw
        *                   html preceded by their position in {@code job.source}
        *                   in order
        *    decorations: {Array.<number|string} an array of style classes preceded
        *                 by the position at which they start in job.source in order
        * }
        * @private
        */
      function recombineTagsAndDecorations(job) {
        var sourceText = job.source;
        var extractedTags = job.extractedTags;
        var decorations = job.decorations;
    
        var html = [];
        // index past the last char in sourceText written to html
        var outputIdx = 0;
    
        var openDecoration = null;
        var currentDecoration = null;
        var tagPos = 0;  // index into extractedTags
        var decPos = 0;  // index into decorations
        var tabExpander = makeTabExpander(window['PR_TAB_WIDTH']);
    
        var adjacentSpaceRe = /([\r\n ]) /g;
        var startOrSpaceRe = /(^| ) /gm;
        var newlineRe = /\r\n?|\n/g;
        var trailingSpaceRe = /[ \r\n]$/;
        var lastWasSpace = true;  // the last text chunk emitted ended with a space.
    
        // A helper function that is responsible for opening sections of decoration
        // and outputing properly escaped chunks of source
        function emitTextUpTo(sourceIdx) {
          if (sourceIdx > outputIdx) {
            if (openDecoration && openDecoration !== currentDecoration) {
              // Close the current decoration
              html.push('</span>');
              openDecoration = null;
            }
            if (!openDecoration && currentDecoration) {
              openDecoration = currentDecoration;
              html.push('<span class="', openDecoration, '">');
            }
            // This interacts badly with some wikis which introduces paragraph tags
            // into pre blocks for some strange reason.
            // It's necessary for IE though which seems to lose the preformattedness
            // of <pre> tags when their innerHTML is assigned.
            // http://stud3.tuwien.ac.at/~e0226430/innerHtmlQuirk.html
            // and it serves to undo the conversion of <br>s to newlines done in
            // chunkify.
            var htmlChunk = textToHtml(
                tabExpander(sourceText.substring(outputIdx, sourceIdx)))
                .replace(lastWasSpace
                         ? startOrSpaceRe
                         : adjacentSpaceRe, '$1&nbsp;');
            // Keep track of whether we need to escape space at the beginning of the
            // next chunk.
            lastWasSpace = trailingSpaceRe.test(htmlChunk);
            // IE collapses multiple adjacient <br>s into 1 line break.
            // Prefix every <br> with '&nbsp;' can prevent such IE's behavior.
            var lineBreakHtml = window['_pr_isIE6']() ? '&nbsp;<br />' : '<br />';
            html.push(htmlChunk.replace(newlineRe, lineBreakHtml));
            outputIdx = sourceIdx;
          }
        }
    
        while (true) {
          // Determine if we're going to consume a tag this time around.  Otherwise
          // we consume a decoration or exit.
          var outputTag;
          if (tagPos < extractedTags.length) {
            if (decPos < decorations.length) {
              // Pick one giving preference to extractedTags since we shouldn't open
              // a new style that we're going to have to immediately close in order
              // to output a tag.
              outputTag = extractedTags[tagPos] <= decorations[decPos];
            } else {
              outputTag = true;
            }
          } else {
            outputTag = false;
          }
          // Consume either a decoration or a tag or exit.
          if (outputTag) {
            emitTextUpTo(extractedTags[tagPos]);
            if (openDecoration) {
              // Close the current decoration
              html.push('</span>');
              openDecoration = null;
            }
            html.push(extractedTags[tagPos + 1]);
            tagPos += 2;
          } else if (decPos < decorations.length) {
            emitTextUpTo(decorations[decPos]);
            currentDecoration = decorations[decPos + 1];
            decPos += 2;
          } else {
            break;
          }
        }
        emitTextUpTo(sourceText.length);
        if (openDecoration) {
          html.push('</span>');
        }
        job.prettyPrintedHtml = html.join('');
      }
    
      /** Maps language-specific file extensions to handlers. */
      var langHandlerRegistry = {};
      /** Register a language handler for the given file extensions.
        * @param {function (Object)} handler a function from source code to a list
        *      of decorations.  Takes a single argument job which describes the
        *      state of the computation.   The single parameter has the form
        *      {@code {
        *        source: {string} as plain text.
        *        decorations: {Array.<number|string>} an array of style classes
        *                     preceded by the position at which they start in
        *                     job.source in order.
        *                     The language handler should assigned this field.
        *        basePos: {int} the position of source in the larger source chunk.
        *                 All positions in the output decorations array are relative
        *                 to the larger source chunk.
        *      } }
        * @param {Array.<string>} fileExtensions
        */
      function registerLangHandler(handler, fileExtensions) {
        for (var i = fileExtensions.length; --i >= 0;) {
          var ext = fileExtensions[i];
          if (!langHandlerRegistry.hasOwnProperty(ext)) {
            langHandlerRegistry[ext] = handler;
          } else if ('console' in window) {
            console.warn('cannot override language handler %s', ext);
          }
        }
      }
      function langHandlerForExtension(extension, source) {
        if (!(extension && langHandlerRegistry.hasOwnProperty(extension))) {
          // Treat it as markup if the first non whitespace character is a < and
          // the last non-whitespace character is a >.
          extension = /^\s*</.test(source)
              ? 'default-markup'
              : 'default-code';
        }
        return langHandlerRegistry[extension];
      }
      registerLangHandler(decorateSource, ['default-code']);
      registerLangHandler(
          createSimpleLexer(
              [],
              [
               [PR_PLAIN,       /^[^<?]+/],
               [PR_DECLARATION, /^<!\w[^>]*(?:>|$)/],
               [PR_COMMENT,     /^<\!--[\s\S]*?(?:-\->|$)/],
               // Unescaped content in an unknown language
               ['lang-',        /^<\?([\s\S]+?)(?:\?>|$)/],
               ['lang-',        /^<%([\s\S]+?)(?:%>|$)/],
               [PR_PUNCTUATION, /^(?:<[%?]|[%?]>)/],
               ['lang-',        /^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],
               // Unescaped content in javascript.  (Or possibly vbscript).
               ['lang-js',      /^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],
               // Contains unescaped stylesheet content
               ['lang-css',     /^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],
               ['lang-in.tag',  /^(<\/?[a-z][^<>]*>)/i]
              ]),
          ['default-markup', 'htm', 'html', 'mxml', 'xhtml', 'xml', 'xsl']);
      registerLangHandler(
          createSimpleLexer(
              [
               [PR_PLAIN,        /^[\s]+/, null, ' \t\r\n'],
               [PR_ATTRIB_VALUE, /^(?:\"[^\"]*\"?|\'[^\']*\'?)/, null, '\"\'']
               ],
              [
               [PR_TAG,          /^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],
               [PR_ATTRIB_NAME,  /^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],
               ['lang-uq.val',   /^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],
               [PR_PUNCTUATION,  /^[=<>\/]+/],
               ['lang-js',       /^on\w+\s*=\s*\"([^\"]+)\"/i],
               ['lang-js',       /^on\w+\s*=\s*\'([^\']+)\'/i],
               ['lang-js',       /^on\w+\s*=\s*([^\"\'>\s]+)/i],
               ['lang-css',      /^style\s*=\s*\"([^\"]+)\"/i],
               ['lang-css',      /^style\s*=\s*\'([^\']+)\'/i],
               ['lang-css',      /^style\s*=\s*([^\"\'>\s]+)/i]
               ]),
          ['in.tag']);
      registerLangHandler(
          createSimpleLexer([], [[PR_ATTRIB_VALUE, /^[\s\S]+/]]), ['uq.val']);
      registerLangHandler(sourceDecorator({
              'keywords': CPP_KEYWORDS,
              'hashComments': true,
              'cStyleComments': true
            }), ['c', 'cc', 'cpp', 'cxx', 'cyc', 'm']);
      registerLangHandler(sourceDecorator({
              'keywords': 'null true false'
            }), ['json']);
      registerLangHandler(sourceDecorator({
              'keywords': CSHARP_KEYWORDS,
              'hashComments': true,
              'cStyleComments': true,
              'verbatimStrings': true
            }), ['cs']);
      registerLangHandler(sourceDecorator({
              'keywords': JAVA_KEYWORDS,
              'cStyleComments': true
            }), ['java']);
      registerLangHandler(sourceDecorator({
              'keywords': SH_KEYWORDS,
              'hashComments': true,
              'multiLineStrings': true
            }), ['bsh', 'csh', 'sh']);
      registerLangHandler(sourceDecorator({
              'keywords': PYTHON_KEYWORDS,
              'hashComments': true,
              'multiLineStrings': true,
              'tripleQuotedStrings': true
            }), ['cv', 'py']);
      registerLangHandler(sourceDecorator({
              'keywords': PERL_KEYWORDS,
              'hashComments': true,
              'multiLineStrings': true,
              'regexLiterals': true
            }), ['perl', 'pl', 'pm']);
      registerLangHandler(sourceDecorator({
              'keywords': RUBY_KEYWORDS,
              'hashComments': true,
              'multiLineStrings': true,
              'regexLiterals': true
            }), ['rb']);
      registerLangHandler(sourceDecorator({
              'keywords': JSCRIPT_KEYWORDS,
              'cStyleComments': true,
              'regexLiterals': true
            }), ['js']);
      registerLangHandler(
          createSimpleLexer([], [[PR_STRING, /^[\s\S]+/]]), ['regex']);
    
      function applyDecorator(job) {
        var sourceCodeHtml = job.sourceCodeHtml;
        var opt_langExtension = job.langExtension;
    
        // Prepopulate output in case processing fails with an exception.
        job.prettyPrintedHtml = sourceCodeHtml;
    
        try {
          // Extract tags, and convert the source code to plain text.
          var sourceAndExtractedTags = extractTags(sourceCodeHtml);
          /** Plain text. @type {string} */
          var source = sourceAndExtractedTags.source;
          job.source = source;
          job.basePos = 0;
    
          /** Even entries are positions in source in ascending order.  Odd entries
            * are tags that were extracted at that position.
            * @type {Array.<number|string>}
            */
          job.extractedTags = sourceAndExtractedTags.tags;
    
          // Apply the appropriate language handler
          langHandlerForExtension(opt_langExtension, source)(job);
          // Integrate the decorations and tags back into the source code to produce
          // a decorated html string which is left in job.prettyPrintedHtml.
          recombineTagsAndDecorations(job);
        } catch (e) {
          if ('console' in window) {
            console.log(e);
            console.trace();
          }
        }
      }
    
      function prettyPrintOne(sourceCodeHtml, opt_langExtension) {
        var job = {
          sourceCodeHtml: sourceCodeHtml,
          langExtension: opt_langExtension
        };
        applyDecorator(job);
        return job.prettyPrintedHtml;
      }
    
      function prettyPrint(opt_whenDone) {
        var isIE678 = window['_pr_isIE6']();
        var ieNewline = isIE678 === 6 ? '\r\n' : '\r';
        // See bug 71 and http://stackoverflow.com/questions/136443/why-doesnt-ie7-
    
        // fetch a list of nodes to rewrite
        var codeSegments = [
            document.getElementsByTagName('pre'),
            document.getElementsByTagName('code'),
            document.getElementsByTagName('xmp') ];
        var elements = [];
        for (var i = 0; i < codeSegments.length; ++i) {
          for (var j = 0, n = codeSegments[i].length; j < n; ++j) {
            elements.push(codeSegments[i][j]);
          }
        }
        codeSegments = null;
    
        var clock = Date;
        if (!clock['now']) {
          clock = { 'now': function () { return (new Date).getTime(); } };
        }
    
        // The loop is broken into a series of continuations to make sure that we
        // don't make the browser unresponsive when rewriting a large page.
        var k = 0;
        var prettyPrintingJob;
    
        function doWork() {
          var endTime = (window['PR_SHOULD_USE_CONTINUATION'] ?
                         clock.now() + 250 /* ms */ :
                         Infinity);
          for (; k < elements.length && clock.now() < endTime; k++) {
            var cs = elements[k];
            if (cs.className && cs.className.indexOf('prettyprint') >= 0) {
              // If the classes includes a language extensions, use it.
              // Language extensions can be specified like
              //     <pre class="prettyprint lang-cpp">
              // the language extension "cpp" is used to find a language handler as
              // passed to PR_registerLangHandler.
              var langExtension = cs.className.match(/\blang-(\w+)\b/);
              if (langExtension) { langExtension = langExtension[1]; }
    
              // make sure this is not nested in an already prettified element
              var nested = false;
              for (var p = cs.parentNode; p; p = p.parentNode) {
                if ((p.tagName === 'pre' || p.tagName === 'code' ||
                     p.tagName === 'xmp') &&
                    p.className && p.className.indexOf('prettyprint') >= 0) {
                  nested = true;
                  break;
                }
              }
              if (!nested) {
                // fetch the content as a snippet of properly escaped HTML.
                // Firefox adds newlines at the end.
                var content = getInnerHtml(cs);
                content = content.replace(/(?:\r\n?|\n)$/, '');
    
                // do the pretty printing
                prettyPrintingJob = {
                  sourceCodeHtml: content,
                  langExtension: langExtension,
                  sourceNode: cs
                };
                applyDecorator(prettyPrintingJob);
                replaceWithPrettyPrintedHtml();
              }
            }
          }
          if (k < elements.length) {
            // finish up in a continuation
            setTimeout(doWork, 250);
          } else if (opt_whenDone) {
            opt_whenDone();
          }
        }
    
        function replaceWithPrettyPrintedHtml() {
          var newContent = prettyPrintingJob.prettyPrintedHtml;
          if (!newContent) { return; }
          var cs = prettyPrintingJob.sourceNode;
    
          // push the prettified html back into the tag.
          if (!isRawContent(cs)) {
            // just replace the old html with the new
            cs.innerHTML = newContent;
          } else {
            // we need to change the tag to a <pre> since <xmp>s do not allow
            // embedded tags such as the span tags used to attach styles to
            // sections of source code.
            var pre = document.createElement('PRE');
            for (var i = 0; i < cs.attributes.length; ++i) {
              var a = cs.attributes[i];
              if (a.specified) {
                var aname = a.name.toLowerCase();
                if (aname === 'class') {
                  pre.className = a.value;  // For IE 6
                } else {
                  pre.setAttribute(a.name, a.value);
                }
              }
            }
            pre.innerHTML = newContent;
    
            // remove the old
            cs.parentNode.replaceChild(pre, cs);
            cs = pre;
          }
    
          // Replace <br>s with line-feeds so that copying and pasting works
          // on IE 6.
          // Doing this on other browsers breaks lots of stuff since \r\n is
          // treated as two newlines on Firefox, and doing this also slows
          // down rendering.
          if (isIE678 && cs.tagName === 'PRE') {
            var lineBreaks = cs.getElementsByTagName('br');
            for (var j = lineBreaks.length; --j >= 0;) {
              var lineBreak = lineBreaks[j];
              lineBreak.parentNode.replaceChild(
                  document.createTextNode(ieNewline), lineBreak);
            }
          }
        }
    
        doWork();
      }
    
      window['PR_normalizedHtml'] = normalizedHtml;
      window['prettyPrintOne'] = prettyPrintOne;
      window['prettyPrint'] = prettyPrint;
      window['PR'] = {
            'combinePrefixPatterns': combinePrefixPatterns,
            'createSimpleLexer': createSimpleLexer,
            'registerLangHandler': registerLangHandler,
            'sourceDecorator': sourceDecorator,
            'PR_ATTRIB_NAME': PR_ATTRIB_NAME,
            'PR_ATTRIB_VALUE': PR_ATTRIB_VALUE,
            'PR_COMMENT': PR_COMMENT,
            'PR_DECLARATION': PR_DECLARATION,
            'PR_KEYWORD': PR_KEYWORD,
            'PR_LITERAL': PR_LITERAL,
            'PR_NOCODE': PR_NOCODE,
            'PR_PLAIN': PR_PLAIN,
            'PR_PUNCTUATION': PR_PUNCTUATION,
            'PR_SOURCE': PR_SOURCE,
            'PR_STRING': PR_STRING,
            'PR_TAG': PR_TAG,
            'PR_TYPE': PR_TYPE
          };
    })();
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/js/popup.js����������������������������������������������0000644�0001750�0001750�00000004614�11460000224�022461� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************/
    //@Author: Adrian "yEnS" Mato Gondelle
    //@website: www.yensdesign.com
    //@email: yensamg@gmail.com
    //@license: Feel free to use it, but keep this credits please!					
    /***************************/
    
    //SETTING UP OUR POPUP
    //0 means disabled; 1 means enabled;
    var popupStatus = 0;
    
    //loading popup with jQuery magic!
    function loadPopup() {
      var surveyCookie = $.cookies.get("SURVEY");
      if(surveyCookie) {
      	popupStatus = 0;
        return;
      }
    	//loads popup only if it is disabled
    	if(popupStatus==0){
    		$("#backgroundPopup").css({
    			"opacity": "0.7"
    		});
    		$("#backgroundPopup").fadeIn("slow");
    		$("#popupContents").fadeIn("slow");
    		popupStatus = 1;
    	}
    }
    
    function getDateInSixMonths() {
      var date = new Date();
      date.setDate(date.getDate()+180);
      return date;
    }
    
    //disabling popup with jQuery magic!
    function disablePopup(){
    	//disables popup only if it is enabled
    	if(popupStatus==1){
    		$("#backgroundPopup").fadeOut("slow");
    		$("#popupContents").fadeOut("slow");
    		popupStatus = 0;
        $.cookies.set("SURVEY", "NO", {expiresAt: getDateInSixMonths()});
    	}
    }
    
    //centering popup
    function centerPopup(){
    	//request data for centering
    	var windowWidth = document.documentElement.clientWidth;
    	var windowHeight = document.documentElement.clientHeight;
    	var popupHeight = $("#popupContents").height();
    	var popupWidth = $("#popupContents").width();
    	//centering
    	$("#popupContents").css({
    		"position": "absolute",
    		"top": windowHeight/2-popupHeight/2,
    		"left": windowWidth/2-popupWidth/2
    	});
    	//only need force for IE6
    	
    	$("#backgroundPopup").css({
    		"height": windowHeight
    	});
    	
    }
    
    
    //CONTROLLING EVENTS IN jQuery
    $(document).ready(function(){
    	
    	//LOADING POPUP
    	//Click the button event!
    	$("#button").click(function(){
    		//centering with css
    		centerPopup();
    		//load popup
    		loadPopup();
    	});
    				
    	//CLOSING POPUP
    	//Click the x event!
    	$("#popupContentsClose").click(function(){
    		disablePopup();
    	});
    	//Click out event!
    	$("#backgroundPopup").click(function(){
    		//disablePopup();
    	});
    	//Press Escape event!
    	$(document).keypress(function(e){
    		if(e.keyCode==27 && popupStatus==1){
    			disablePopup();
    		}
    	});
    
    	$("#announce").click(function(){
        $.cookies.set("SURVEY", "YES", {expiresAt:  getDateInSixMonths()});
        window.location='http://www.qos.ch/mailman/listinfo/announce';
    	});
    });
    
    ��������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/js/dsl.js������������������������������������������������0000644�0001750�0001750�00000002103�11377016712�022107� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
    var asGroovyURL='http://logback.qos.ch/translator/dsl/asGroovy';
    
    function asGroovy(id) {
    
      var form = document.getElementById('aForm');
      if(form == null) {
        form = document.createElement("form");
        document.body.appendChild(form); 
      }
      var p = document.getElementById(id);
      
      var inner = p.innerHTML;
      //alert("==="+inner);  
      inner = inner.replace(/&lt;/gi, '<');
      inner = inner.replace(/&gt;/gi, '>');
    
      inner = inner.replace(/<span class="?\w{3,5}"?>/gi, '');
      inner = inner.replace(/<\/span>/gi, '');
      inner = inner.replace(/<br>/gi, '');
      inner = inner.replace(/&nbsp;/gi, '');
      inner = inner.replace(/<b>/gi, '');
      inner = inner.replace(/<\/b>/gi, '');
    
      form.setAttribute("method", "post");
      form.setAttribute("action", asGroovyURL);
      
      var hiddenField = document.createElement("input");
      hiddenField.setAttribute("type", "hidden");
      hiddenField.setAttribute("name", "val");
      hiddenField.setAttribute("value", inner);
      form.appendChild(hiddenField);
    
      //alert("==="+inner);  
      form.submit();
      return false;
    }
    
     
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/.htaccess������������������������������������������������0000644�0001750�0001750�00000000336�12021755022�022146� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Redirect permanent /jmxConfig.html http://logback.qos.ch/manual/jmxConfig.html
    Redirect permanent /joran.html http://logback.qos.ch/manual/onJoran.html
    Redirect permanent /consolePlugin.html http://logback.qos.ch/beagle/��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/deadlock.html��������������������������������������������0000644�0001750�0001750�00000010120�11377016712�023005� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
    
    logback-core/src/main/java/ch/qos/logback/core/AppenderBase.java:  
      public synchronized void doAppend(E eventObject)
    
    logback-core/src/main/java/ch/qos/logback/core/BasicStatusManager.java:  
      locks: 
         Object statusListLock
         Object statusListenerListLock     
      exposition: to derived classes
    
    logback-core/src/main/java/ch/qos/logback/core/status/StatusBase.java:
      locks: this
      lock exposition: this
    
    logback-classic/src/main/java/ch/qos/logback/classic/selector/ContextJNDISelector.java:        
      locks: synchronizedContextMap
      lock exposition: none
    
    
    logback-classic/src/main/java/ch/qos/logback/classic/Logger.java  
      locks: synchronizedContextMap
      lock exposition: none
    
    logback-classic/src/main/java/ch/qos/logback/classic/LoggerContext.java
      locks: logger, 
             loggerCache should be syncronzied but is not
      lock exposition:
    
    logback-classic/src/main/java/ch/qos/logback/classic/Logger.java:   
       * synchronized on 'this' (Logger) protecting against simultaneous  
       * only within addAppender which is synchronized <p> 3) all the other methods
      public synchronized void setLevel(Level newLevel) {
      private synchronized void handleParentLevelChange(int newParentLevelInt) {
      // this method MUST be synchronized. See comments on 'aai' field for further
      public synchronized void addAppender(Appender<LoggingEvent> newAppender) {
    
    
    logback-core/src/main/java/ch/qos/logback/core/joran/GenericConfigurator.java:    
      locks: context
      lock exposition: none
    
    
    
    
       * only within addAppender which is synchronized <p> 3) all the other methods
      public synchronized void setLevel(Level newLevel) {
      private synchronized void handleParentLevelChange(int newParentLevelInt) {
      // this method MUST be synchronized. See comments on 'aai' field for further
      public synchronized void addAppender(Appender<LoggingEvent> newAppender) {
    
    
    
    
    logback-core/src/main/java/ch/qos/logback/core/FileAppender.java:  public synchronized void openFile(String file_name) throws IOException {
    
    logback-core/src/main/java/ch/qos/logback/core/net/SMTPAppenderBase.java:  synchronized public void stop() {
    logback-core/src/main/java/ch/qos/logback/core/net/SocketAppenderBase.java:          synchronized (this) {
    
    logback-core/src/main/java/ch/qos/logback/core/WriterAppender.java:  public synchronized void stop() {
    logback-core/src/main/java/ch/qos/logback/core/WriterAppender.java:  public synchronized void setWriter(Writer writer) {
    
    logback-classic/src/main/java/ch/qos/logback/classic/net/JMSQueueAppender.java:  public synchronized void stop() {
    logback-classic/src/main/java/ch/qos/logback/classic/net/JMSQueueAppender.java:    // The synchronized modifier avoids concurrent append and close operations
    logback-classic/src/main/java/ch/qos/logback/classic/net/JMSTopicAppender.java:  public synchronized void stop() {
    logback-classic/src/main/java/ch/qos/logback/classic/net/JMSTopicAppender.java:    // The synchronized modifier avoids concurrent append and close operations
    
    
    logback-core/src/main/java/ch/qos/logback/core/status/StatusBase.java:  public synchronized void add(Status child) {
    logback-core/src/main/java/ch/qos/logback/core/status/StatusBase.java:  public synchronized boolean hasChildren() {
    logback-core/src/main/java/ch/qos/logback/core/status/StatusBase.java:  public synchronized Iterator<Status> iterator() {
    logback-core/src/main/java/ch/qos/logback/core/status/StatusBase.java:  public synchronized boolean remove(Status statusToRemove) {
    
    
    logback-classic/src/main/java/ch/qos/logback/classic/net/SimpleSocketServer.java:        synchronized (socketNodeList) {
    logback-classic/src/main/java/ch/qos/logback/classic/net/SimpleSocketServer.java:    synchronized(this) {
    logback-classic/src/main/java/ch/qos/logback/classic/net/SimpleSocketServer.java:    synchronized (socketNodeList) {
    logback-classic/src/main/java/ch/qos/logback/classic/net/SimpleSocketServer.java:    synchronized (socketNodeList) {
    logback-classic/src/main/java/ch/qos/logback/classic/pattern/DateConverter.java:      // the AppenderBase.doAppend is synchronized, we are should be
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/templates/�����������������������������������������������0000755�0001750�0001750�00000000000�12203357067�022355� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/templates/left.js����������������������������������������0000644�0001750�0001750�00000003526�12136042147�023646� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
    document.write('<div class="menuGroup">');
    document.write('<p class="menu_header">Logback project</p>');
    document.write('<p class="menu"><a href="' + prefix + 'index.html">Introduction</a></p>');
    document.write('<p class="menu"><a href="' + prefix + 'download.html">Download</a></p>');
    document.write('<p class="menu"><a href="' + prefix + 'documentation.html">Documentation</a></p>');
    document.write('<p class="menu"><a href="' + prefix + 'license.html">License</a></p>');
    document.write('<p class="menu"><a href="' + prefix + 'news.html">News</a></p>');
    
    document.write('<p class="menu_header">Support</p>');
    document.write('<p class="menu"><a href="' + prefix + 'mailinglist.html">Mailing Lists</a></p>');
    document.write('<p class="menu"><a href="' + prefix + 'bugreport.html">Bug Report</a></p>');
    document.write('<p class="menu"><a href="http://github.com/qos-ch/logback">Source Repository</a></p>');
    document.write('<p class="menu"><a href="' + prefix + 'volunteer.html">Call for volunteers</a>');
    document.write('<p class="menu"><a href="http://www.qos.ch/shop/products/professionalSupport">Support offerings</a>');
    
    //document.write('<p class="menu"><a href="http://www.qos.ch/shop/products/training">Training</a>');
    
    document.write('<p class="menu_header">Sister projects</p>');
    document.write('<p class="menu"><a href="http://audit.qos.ch/">Logback-audit</a>');
    
    document.write('<p class="menu_header">Online Tools</p>');
    document.write('<p class="menu"><a href="http://logback.qos.ch/translator/">log4j.properties Translator</a>');
    document.write('<p class="menu"><a href="http://logback.qos.ch/translator/asGroovy.html">logback.XML to Groovy</a>');
    
    document.write('</p>');
    document.write('</div>');
    
    document.write('<p/>');
    
    document.write('<div class="jobadd"><p><a href="'+prefix +'job.html">Your career<br/>@QOS.ch</a></p></div>');��������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/templates/right.js���������������������������������������0000644�0001750�0001750�00000002142�11377016712�024027� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������//document.write('<p class="menu"><a href="'+prefix+'10reasons.ppt">10 reasons for migrating</a>')
    
    document.write('<p class="menu_header">New and noteworthy</p>')
    
    document.write('<p class="menu"><a href="http://stubbisms.wordpress.com/2008/07/15/some-serious-logging-niceness-logback-with-eclipse-plugin/">Logging niceness</a>')
    
    document.write('<p class="menu"><a href="http://wimpi.coalevo.net/2008/04/logger-name-based-filtering-in-logback.html">Filtering by logger name</a>')
    
    document.write('<p class="menu"><a href="http://out-println.blogspot.com/2007/09/slf4j-and-logback.html">SLF4J and Logback</a>')
    
    
    document.write('<p class="menu"><a href="http://wizardforge.org/pc?action=showVersion&id=72">Configuration Wizard</a>')
    
    document.write('<p class="menu"><a href="http://xhab.blogspot.com/2007/03/new-logging-experience.html">A new logging experience!</a>')
    
    document.write('<p class="menu"><a href="http://javablog.smilehouse.com/blog/default/Java/2007/02/02/Writing-rotated-and-compressed-access-logs-with-logback">Writing rotated and compressed access logs</a>')
    
    
    document.write('</p>')
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/templates/footer.js��������������������������������������0000644�0001750�0001750�00000001740�12140676676�024225� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
    document.write('<table class="footer" border="0">')
    
    document.write('<tr>')
    
    document.write('<td valign="top">Copyright &copy; 2013  <a href="http://www.qos.ch/">QOS.ch</a></td>')
    
    document.write('  <td rowspan="2">');
    document.write('    <a href="http://twitter.com/qos_ch">');
    document.write('      <img alt="Follow @qos_ch" src="http://www.slf4j.org/images/follow_us.png" />');
    document.write('    </a>');
    document.write('  </td>');
    
    
    document.write('</tr>')
    
    AAT = '@'
    DOOTT = '.'
    document.write('<tr>') 
    
    document.write('<td align="left" colspan="1">') 
    document.write('We are actively looking for volunteers to proofread the documentation. Please send your corrections or suggestions for improvement to "corrections' + AAT +'qos'+DOOTT+'ch". See also the <a href="http://articles.qos.ch/contributing.html">instructions for contributors</a>.');
    document.write('</td>') 
    document.write('  <td>&nbsp;</td>')
    document.write('</tr>') 
    
    document.write('</table>')
    ��������������������������������logback_1.0.13/logback-site/src/site/pages/templates/creative.js������������������������������������0000644�0001750�0001750�00000003243�12136042273�024512� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������document.write('		<table style="margin-left: 0em; padding-top:0ex" cellpadding="0" ');
    document.write('           cellspacing="0" width="70%">');
    document.write('      <tr>');
    document.write('        <td>        ');
    document.write('          <p class="author">');
    document.write('            Authors: Ceki G&#252;lc&#252;, S&#233;bastien Pennec, Carl Harris');
    document.write('          <br/>');
    document.write('          Copyright &#169; 2000-2012, QOS.ch</p>');
    document.write('        </td>');
    document.write('        <td>');
    document.write('            <a rel="license"');
    document.write('               href="http://creativecommons.org/licenses/by-nc-sa/2.5/">');
    document.write('        <img alt="Creative Commons License"');
    document.write('             style="border-width: 0; margin-left: 1em"');
    document.write('             src="http://creativecommons.org/images/public/somerights20.png" />');
    document.write('          </a>');
    document.write('        </td>');
    document.write('      </tr>');
    document.write('      <tr>');
    document.write('        <td>');
    document.write('          <p>');
    document.write('            This document is licensed under a');
    document.write('            <a rel="license"');
    document.write('               href="http://creativecommons.org/licenses/by-nc-sa/2.5/">');
    document.write('              Creative Commons');
    document.write('              Attribution-NonCommercial-ShareAlike 2.5');
    document.write('              License');
    document.write('            </a>');
    document.write('          </p>');
    document.write('        </td>');
    document.write('        <td></td>');
    document.write('			</tr>');
    document.write('		</table>');
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/templates/setup.js���������������������������������������0000644�0001750�0001750�00000000624�11757736135�024067� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
    document.write('		<p class="highlight">');
    document.write('      In order to run the examples in this chapter, you need');
    document.write('      to make sure that certain jar files are present on the');
    document.write('      classpath.');
    document.write('    	Please refer to the <a href="../setup.html">setup page</a>');
    document.write('    	for further details.');
    document.write('    </p>');
    ������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/templates/header.js��������������������������������������0000644�0001750�0001750�00000000551�11752305525�024144� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������document.write('<table width="100%" border="0"><tr>');
    document.write('<td><a href="http://logback.qos.ch/">');
    document.write('<img src="' + prefix + 'images/logos/lblogo.jpg" alt="" border="0"/>');
    document.write('</a></td>')
    
    document.write('<td>&nbsp;</td>');
    
    document.write('</tr></table>')
    
    
    document.write('<div id="headerLine"></div>');
    
    
    �������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/access.html����������������������������������������������0000644�0001750�0001750�00000057537�11757737072�022542� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Logback-access</title>
        <link rel="stylesheet" type="text/css" href="css/common.css" />
        <link rel="stylesheet" type="text/css" href="css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="css/_print.css" media="print" />
        <link rel="stylesheet" type="text/css" href="css/prettify.css" media="screen" />
      </head>
      <body onload="prettyPrint()">
        <script type="text/javascript">prefix='';</script>
        <script type="text/javascript" src="js/prettify.js"></script>    
        <script src="templates/header.js" type="text/javascript"></script>
        <div id="left">
          <script src="templates/left.js" type="text/javascript"></script>
        </div>
        <div id="content">  
    	
        <h2>HTTP-access logs with logback-access, Jetty and Tomcat</h2>
    
        <div class="author">
    			Authors: Ceki G&#252;lc&#252;, S&#233;bastien Pennec
    		</div>
    
    
        <script src="../templates/creative.js" type="text/javascript"></script>
    
    		<h1>Introduction</h1>
    
        <p>The logback-access module, part of the standard logback
        distribution, integrates with Servlet containers such as Jetty or
        Tomcat to provide rich and powerful HTTP-access log functionality.
        </p>
    		
    		<p>Logback was designed as a modular framework from the
    		start. Making logback-core reusable under different circumstances
    		without much recoding was one of our main goals. In accordance
    		with this strategy, logback-access builds on top of logback-core
    		and can thus provide much of the functionality of logback-classic
    		but in the scope of HTTP-access logging. </p>
    
        <p>It should be noted that while logback-access requires
        logback-core, it is independent of logback-classic as well as
        slf4j. Just as importantly, logback-access artifact must be
        installed at the container level, not at web-application level. It
        does not make sense to bundle <em>logback-access.jar</em> at the
        level of a web-application.
        </p>
    
    		<h1><a name="tomcat" href="#tomcat">Logback-access under Tomcat</a></h1>
    		
    
    
       
    
    		<p>To use logback-access with Tomcat, after downloading the
    		logback distribution, place the files
    		<em>logback-core-${project.version}.jar</em> and
    		<em>logback-access-${project.version}.jar</em> under
    		$TOMCAT_HOME/lib/ directory, where $TOMCAT_HOME is the folder
    		where you have installed Tomcat.
        </p>
    
        <p class="highlight">Deploying recent versions of logback-access
        on Tomcat 6.x (instead of Tomcat 7.x) is likely to cause the
        server to crash.</p>
    
        <p><span class="label notice">Tomcat 7.x</span> This version of
        logback-access has been tested with Tomcat version 7.0.21. It will
        not work with Tomcat 6.x.
    		</p>
       
        <p><span class="label notice">Tomcat 6.x</span> Logback-access
        version 0.9.30 will deploy on Tomcat 6.x.</p>
    
    		<h2>LogbackValve</h2>
    
    		<p>The <a
    		href="xref/ch/qos/logback/access/tomcat/LogbackValve.html">
    		<code>ch.qos.logback.access.tomcat.LogbackValve</code></a> class
    		extends Tomcat's <code><a
    		href="http://tomcat.apache.org/tomcat-5.5-doc/catalina/docs/api/org/apache/catalina/valves/ValveBase.html">
    		ValveBase</a></code> class. Valves are usually associated together
    		to form a processing pipeline.
    		</p>
    	
    		<p>To configure Tomcat in order to use <code>LogbackValve</code>,
    		add the following lines to the tomcat server configuration file,
    		namely <em>$TOMCAT_HOME/conf/server.xml</em>:
    		</p>
    		<pre class="source">&lt;Valve className="ch.qos.logback.access.tomcat.LogbackValve"/></pre>
    
    		<p>This line is usually nested within an <code>&lt;Engine></code>
    		or <code>&lt;Host></code> element.
    		</p>
    
    		<p>By default, <code>LogbackValve</code> looks for a configuration
    		file called <em>logback-access.xml</em>, in the same folder where
    		<em>server.xml</em> is located, that is in
    		<em>$TOMCAT_HOME/conf/</em>. This configuration file contains
    		directives for configuring logback-access components. It is used
    		to specify appenders where the logging requests will be
    		sent. Please refer to the <a href="#configuration">logback-access
    		configuration section</a> further below.
        </p>
    		
        <p>In order to help with troubleshooting, by default, the
        <code>LogbackValve</code> will print its internal status at its
        initialization. Typical output would look as:
        </p>
        
        <p class="source">21:56:09,921 |-INFO in c.q.lb.access.j.a.ConfigurationAction - Ignoring debug attribute.
    21:56:09,921 |-INFO in c.q.lb.core.j.a.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
    21:56:09,921 |-INFO in c.q.lb.core.j.a.AppenderAction - Naming appender as [STDOUT]
    21:56:10,000 |-INFO in c.q.lb.core.j.a.NestedComponentIA - Pushing component [layout] on top of the object stack.
    21:56:10,015 |-INFO in c.q.lb.core.j.a.AppenderAction - Popping appender named [STDOUT] from the object stack
    21:56:10,015 |-INFO in c.q.lb.core.j.a.AppenderRefAction - Attaching appender named [STDOUT] to ch.qos.logback.access.tomcat.LogbackValve[Catalina]
    21:56:10,015 |-INFO in c.q.lb.access.j.a.ConfigurationAction - End of configuration.</p>
    
        <p>It is possible to override default status printing by specifying
        the "quiet" attribute in the <code>Valve</code>
        element. Similarly, it is also possible to set the filename for
        the logback-access configuration file. Here is an example.
        </p>
    
       <pre class="prettyprint source">&lt;Valve className="ch.qos.logback.access.tomcat.LogbackValve"
           quiet="true" filename="c:/my-logback-access.xml"/></pre>
    
        <h3><a name="viewingStatusMessages"
        href="#viewingStatusMessages">Viewing status messages</a></h3>
    
        <p>Logback-access ships with a servlet called
        <code>ViewStatusMessagesServlet</code>. This servlet prints the
        internal status messages of the <code>LogbackValve</code> as an
        HTML table. Here is sample output.
        </p>
    
    
        <a href="images/lbAccessStatus.jpg">
         <img src="images/lbAccessStatus.jpg" alt="click to enlarge" width="90%"/>
        </a>
    
        <p>To add this servlet to your web-application, add the following
        lines to its <em>WEB-INF/web.xml</em> file.</p>
    
        <pre class="prettyprint source">  &lt;servlet>
        &lt;servlet-name>AccessViewStatusMessages&lt;/servlet-name>
        &lt;servlet-class>ch.qos.logback.access.ViewStatusMessagesServlet&lt;/servlet-class>
      &lt;/servlet>
    
      &lt;servlet-mapping>
        &lt;servlet-name>AccessViewStatusMessages&lt;/servlet-name>
        &lt;url-pattern>/lbAccessStatus&lt;/url-pattern>
      &lt;/servlet-mapping></pre>
       
        <p>The <code>ViewStatusMessages</code> servlet will available
        under the URL <code>http://host/yourWebapp/lbAccessStatus</code>
        </p>
        
        
    		<h1><a name="jetty" href="#jetty">Logback-access under
    		Jetty</a></h1>
    
    		<p>After downloading the logback distribution, place the files
    		<em>logback-core-VERSION.jar</em> and
    		<em>logback-access-VERSION.jar</em> under $JETTY_HOME/lib
    		directory, where $JETTY_HOME is the folder where you have
    		installed Jetty. Versions of logback-access 0.9.31 and later
    		target Jetty versions 7.x and 8.x. Logback-access versions 0.9.30
    		and earlier target Jetty version 6.x.
    		</p>
    
    		<h3>Logback's implementation of
    		<code>org.eclipse.jetty.server.RequestLog</code> interface</h3>
    
    		<p>The <a
    		href="xref/ch/qos/logback/access/jetty/RequestLogImpl.html">
    		<code>ch.qos.logback.access.jetty.RequestLogImpl</code></a> class
    		implements Jetty's <code><a
    		href="http://download.eclipse.org/jetty/stable-7/apidocs/org/eclipse/jetty/server/RequestLog.html">RequestLog</a></code>
    		interface. Jetty delegates the management of access logging
    		functionality to implementations of this interface.
    		</p>
    
    		<p>In logback, a logging destination is called an "appender" which
    		can be directly attached to a
    		<code>ch.qos.logback.access.jetty.RequestLogImpl</code> instance.
    		</p>
    
    	
    		<p>In order to configure Jetty to use logback-access's
    		<code>RequestLogImpl</code>, please add the following lines to
    		Jetty's main configuration file, namely
    		<em>$JETTY_HOME/etc/jetty.xml</em>:
    		</p>
    		<pre class="prettyprint source">&lt;Ref id="RequestLogHandler"&gt;
      &lt;Set name="requestLog"&gt;
        &lt;New id="requestLogImpl" class="ch.qos.logback.access.jetty.RequestLogImpl"&gt;
        &lt;/New&gt;
      &lt;/Set&gt;
    &lt;/Ref&gt;</pre>
    
        <p>Please note that the above jetty configuration snippet makes
        reference to "RequestLogHandler". Check your jetty.xml
        configuration file and add a <code>RequestLogHandler</code> if it
        has not been already added. Here is a configuration snipped to set
        you on the right tract.</p>
    
        <pre class="prettyprint source">&lt;Set name="handler">
      &lt;New id="Handlers" class="org.eclipse.jetty.server.handler.HandlerCollection">
        &lt;Set name="handlers">
          &lt;Array type="org.eclipse.jetty.server.Handler">        
            &lt;Item>
              &lt;New id="Contexts" 
                   class="org.eclipse.jetty.server.handler.ContextHandlerCollection"/>
            &lt;/Item>
            &lt;Item>
              &lt;New id="DefaultHandler" 
                   class="org.eclipse.jetty.server.handler.DefaultHandler"/>
            &lt;/Item>
            <b>&lt;!-- add a RequestLogHandler --&gt;</b>
            <b>&lt;Item></b>
              <b>&lt;New id="RequestLogHandler"</b>
                   <b>class="org.eclipse.jetty.server.handler.RequestLogHandler"/></b>
            <b>&lt;/Item></b>
          &lt;/Array>
        &lt;/Set>
      &lt;/New>
    &lt;/Set></pre>
    
    
        <p>By default, <code>RequestLogImpl</code> looks
        for a logback configuration file called
        <em>logback-access.xml</em>, in the same folder where
        <em>jetty.xml</em> is located. This configuration file contains
        directives for configuring logback components such as appenders
        and layouts.
        </p>
    	
    		<p>As long the path is specified, you can place the logback
    		configuration file in any location. Here is another example of a
    		Jetty configuration file, including the path to the logback-access
    		configuration file here named <em>myaccess.xml</em>.
    		</p>
    		
        <pre class="prettyprint source">&lt;Ref id="RequestLogHandler"&gt;
      &lt;Set name="requestLog"&gt;
        &lt;New id="requestLogImpl" class="ch.qos.logback.access.jetty.RequestLogImpl"&gt;
           &lt;Set name="fileName"&gt;path/to/myaccess.xml&lt;/Set&gt;
        &lt;/New&gt;   
      &lt;/Set&gt;
    &lt;/Ref&gt;</pre>
    
       <p>For embedded Jetty, it is helpful to lookup for the
       logback-access configuration file as a class path resource. This
       can be accomplished by setting the <em>resource</em> property to
       the file name to look up on the class path.
       </p>
    
       <pre class="prettyprint source">&lt;Ref id="RequestLogHandler"&gt;
      &lt;Set name="requestLog"&gt;
        &lt;New id="requestLogImpl" class="ch.qos.logback.access.jetty.RequestLogImpl"&gt;
           &lt;Set name="<span class="bold">resource</span>"&gt;as/classpath/resource/myaccess.xml&lt;/Set&gt;
        &lt;/New&gt;   
      &lt;/Set&gt;
    &lt;/Ref&gt;</pre>
    
      <h1><a name="configuration" href="#configuration">Logback-access
      configuration</a></h1>
    	
    	
      <p>Although similar, the format of <em>logback-access.xml</em>
      configuration file is slightly different than the configuration file
      format logback-classic.  Appenders and Layouts are declared the
      exact same way. However, in the access module there is no notion of
      loggers and consequently logger elements are disallowed.
    	</p>
    
    
        <h3>Example 1: basic logback-access configuration</h3>
    		<p>
    			Here is a small but fully functional <em>logback-access.xml</em>
    			configuration file:
    		</p>
        <pre class="prettyprint source">&lt;configuration&gt;
      &lt;!-- always a good activate OnConsoleStatusListener -->
      &lt;statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />  
    
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"&gt;
        &lt;encoder&gt;
          &lt;pattern>%h %l %u %user %date "%r" %s %b&lt;/pattern&gt;
        &lt;/encoder&gt;
      &lt;/appender&gt;
    
      &lt;appender-ref ref="STDOUT" /&gt;
    &lt;/configuration&gt;</pre>
    		<p>
    		It declares a <code>ConsoleAppender</code> which prints its output
    		on the console.  The <code>ConsoleAppender</code> contains an
    		<code>Encoder</code> object responsible for formatting output. The
    		log format is specified by the "%h %l %u %user %date "%r" %s %b"
    		pattern which incidentally corresponds to the Common Log Format
    		(CLF). This format is recognized by log analyzers such as <a
    		href="http://www.analog.cx/">Analog</a> or <a
    		href="http://awstats.sourceforge.net/">AWStats</a>.
    		</p>
    
        <p>The words "common" or "clf" are interpreted as shorthands for
        the said pattern. Thus, the following are all equivalent:
        </p>
        
        <pre class="prettyprint source">&lt;pattern>%h %l %u %user %date "%r" %s %b&lt;/pattern&gt;
    &lt;pattern>common&lt;/pattern&gt;
    &lt;pattern>clf&lt;/pattern&gt;</pre>
    
      <p>The so called "combined" format is also widely recognized. It is
      defined as the '%h %l %u %t "%r" %s %b "%i{Referer}"
      "%i{User-Agent}"' pattern. As a facilitator, you can use the
      "combined" as a shorthand. Thus, the following directive
      </p>
    
      <pre class="prettyprint source">&lt;encoder&gt;
      &lt;pattern>%h %l %u %t "%r" %s %b "%i{Referer}" "%i{User-Agent}"&lt;/pattern&gt;
    &lt;/encoder&gt;</pre>
    
      <p>is equivalent to:</p>
    
      <pre class="prettyprint source">&lt;encoder&gt;
      &lt;pattern>combined&lt;/pattern&gt;
    &lt;/encoder&gt;</pre>
    
    
        <h3>Example 2: RollingFileAppender</h3>
    
    		<p>The configuration file below configures a daily rolling
    		<code>RollingFileAppender</code>. Note that due to the
    		<em>.zip</em> suffix included in the value for <span
    		class="option">fileNamePattern</span> option, the log files are not
    		only rolled daily, but they are also automatically compressed.</p>
    
    
     <pre class="prettyprint source">&lt;configuration&gt;
      &lt;!-- always a good activate OnConsoleStatusListener -->
      &lt;statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />  
    
      &lt;appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"&gt;
        &lt;file&gt;access.log&lt;/file&gt;
        &lt;rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"&gt;
          &lt;fileNamePattern&gt;access.%d{yyyy-MM-dd}.log.zip&lt;/fileNamePattern&gt;
        &lt;/rollingPolicy&gt;
    
        &lt;encoder&gt;
          &lt;pattern&gt;combined&lt;/pattern&gt;
        &lt;/encoder&gt;
      &lt;/appender&gt;
     
      &lt;appender-ref ref="FILE" /&gt;
    &lt;/configuration&gt;</pre>
    		
        <p>These two examples should give you an idea of the possibilities
        offered by logback-access. In principle, most if not all of the
        features available in logback-classic are also available in
        logback-access.
    		</p>
    
        <h3>PatternLayout</h3>
    
    		<p>Logback-access ships with an http-specific implementation of <a
    		href="xref/ch/qos/logback/access/PatternLayout.html">
    		<code>PatternLayout</code></a>. For detailed instructions on how
    		to use the <code>PatternLayout</code>, please refer to the <a
    		href="manual/layouts.html#AccessPatternLayout">corresponding
    		chapter</a> of the logback manual.
    		</p>
    		
    		<h2>JMX Components</h2>
    		
    		<p>Logback-access integrates with JMX servers to publish
    		information about its components.
    		</p>
    		
    		<p>Both <code>RequestLogImpl</code> and <code>LogbackValve</code>
    		expose data and can be updated via JMX. A special filter, covered
    		further down this document, publishes statistical data on access
    		logs.
    		</p>
    		
    		
    		<h3>Configuring Tomcat for JMX</h3>
    		
    		<p>In order to configure Tomcat for JMX, please add the following
    		lines to the <em>$TOMCAT_HOME/bin/catalina.sh</em> shell script
    		(or its MS Windows equivalent):
    		</p>
    		
    <div class="source"><pre>CATALINA_OPTS="-Dcom.sun.management.jmxremote"
    CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.ssl=false"
    CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.authenticate=false"</pre></div>
    
    		<p>After you launch Tomcat, you can access the MBeans exposed by
    		Tomcat via the JConsole application, which can be started with the
    		following command:
    		</p>
        <pre class="source">jconsole</pre>
    
    		<p>If you prefer MX4J to access your components via a web-based
    		interface, here is a short summary of the steps to follow. After
    		<a href="http://mx4j.sourceforge.net/">downloading MX4J</a>, place
    		the <em>mx4j-impl.jar</em> file in the <em>$TOMCAT_HOME/bin/</em>
    		directory, and the <em>mx4j-tools.jar</em> file in the
    		<em>$TOMCAT_HOME/common/lib/</em> directory. Once that is done,
    		add the following lines to the
    		<em>$TOMCAT_HOME/bin/catalina.sh</em> shell script:
    		</p>
    
    <div class="source"><pre>&lt;!-- at the beginning of the file -->
    CATALINA_OPTS="-Dcom.sun.management.jmxremote"
    CATALINA_OPTS="$CATALINA_OPTS -Djavax.management.builder.initial=mx4j.server.MX4JMBeanServerBuilder"
    
    &lt;!-- in the "Add on extra jar files to CLASSPATH" section -->
    CLASSPATH="$CLASSPATH":"$CATALINA_HOME"/bin/mx4j-impl.jar</pre></div>
    
    		<p>Finally, declare a new <code>Connector</code> in the
    			<em>$TOMCAT_HOME/conf/server.xml</em> file: </p>
    		
        <pre class="prettyprint source">&lt;Connector port="8050" 
      handler.list="mx"
      mx.enabled="true" 
      mx.httpHost="localhost" 
      mx.httpPort="8082" 
      protocol="AJP/1.3" /></pre>
      
      	<p> Once Tomcat is started, you should be able to reach your JMX
      		components by pointing your browser at the following URL:
      	</p>
    
        <pre class="source">http://localhost:8082/</pre>
    
    		<h3>Configuring Jetty</h3>
    		
    		<p>
    			Configuring Jetty to publish JMX components requires a few modifications to the
    			<em>$JETTY_HOME/etc/jetty.xml</em> configuration file. Here are the elements that need to be
    			added:
    		</p>
    
        <pre class="prettyprint source">&lt;Call id="MBeanServer" class="java.lang.management.ManagementFactory" name="getPlatformMBeanServer"/>
    &lt;!-- initialize the Jetty MBean container -->
    &lt;Get id="Container" name="container">
      &lt;Call name="addEventListener">
        &lt;Arg>
          &lt;New class="org.mortbay.management.MBeanContainer">
            &lt;Arg>&lt;Ref id="MBeanServer"/>&lt;/Arg>
            &lt;Set name="managementPort">8082&lt;/Set>
            &lt;Call name="start" />
          &lt;/New>
        &lt;/Arg>
      &lt;/Call>
    &lt;/Get></pre>
    
    		<p>Once Jetty is started with this configuration, all available
    		components can be reviewed at:
    		</p>
        <pre class="prettyprint source">http://localhost:8082/</pre>
    
    		<p>Logback-access' <code>RequestLogImpl</code> should be
    		available, including its <code>start()</code> and
    		<code>stop()</code> methods.
    		</p>
    
    
        <h2><a name="teeFilter"
        href="#teeFilter"><code>TeeFilter</code> <span class="small">(a servlet-filter)</span></a></h2>
    
        <p>In order to diagnose bugs in a web-application, it is often
        handy to capture the client's request as well as the server's
        response. The <code>TeeFilter</code> was designed precisely for
        this purpose. It should be noted that <code>TeeFilter</code> is a
        regular <a
        href="http://download.oracle.com/javaee/5/api/javax/servlet/Filter.html">servlet
        filter</a>. Like other servlet filters, it needs to be declared in
        your web-application's <em>web.xml</em> file:
        </p>
    
        <pre class="prettyprint source">&lt;filter&gt;
      &lt;filter-name&gt;TeeFilter&lt;/filter-name&gt;
      &lt;filter-class&gt;ch.qos.logback.access.servlet.TeeFilter&lt;/filter-class&gt;
    &lt;/filter&gt;
    
    &lt;filter-mapping&gt;
      &lt;filter-name&gt;TeeFilter&lt;/filter-name&gt;
      &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
    &lt;/filter-mapping&gt;</pre>
    
      <p>We have tested <code>TeeFilter</code> to the best of our
      ability. However, since it duplicates the input stream of the
      request and the output stream of the response, it may interfere with
      your application. Moreover, for large input or output sizes, it will
      add measurable latency. Although we have already fixed all currently
      known bugs, <code>TeeFilter</code> has broken otherwise correctly
      behaving applications in the past. Thus, in case of doubt, do not
      hesitate to disable <code>TeeFilter</code>.  
      </p>
    
      <p>Once <code>TeeFilter</code> is installed, the <a
      href="manual/layouts.html#AccessPatternLayout">PatternLayout </a>
      converters <code>fullRequest</code> and <code>fullResponse</code>
      will output the full contents of the request and respectively the
      response.
      </p>
    
      <p>Here is a sample logback-access.xml configuration file which will
      output the full contents of the request and response on the console.
      </p>
    
      <pre class="prettyprint source">&lt;configuration&gt;
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"&gt;
        &lt;encoder&gt;      
          &lt;pattern&gt;%fullRequest%n%n%fullResponse&lt;/pattern&gt;
        &lt;/encoder&gt;
      &lt;/appender&gt;
    	
      &lt;appender-ref ref="STDOUT" /&gt;
    &lt;/configuration&gt;</pre>
    
      <p>Here is the output generated when accessing the <a
      href="demo.html">logback-demo</a> application configured as shown
      above:</p>
    
      <p class="source"><b>GET /logback-demo/index.jsp HTTP/1.1</b>
    Host: localhost:8080
    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8) Gecko/20070312 Firefox/1.5.0
    Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8
    Accept-Language: en-us,en;q=0.5
    Accept-Encoding: gzip,deflate
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
    Keep-Alive: 300
    Connection: keep-alive
    Referer: http://localhost:8080/logback-demo/login.jsp
    Cookie: JSESSIONID=15c7tqi9ehlwk;  OID324nkzcmr=null; OID32862zgoa=null; 
    
    
    
    <b>HTTP/1.1 200 OK</b>
    Content-Type: text/html; charset=iso-8859-1
    Expires: Thu, 01 Jan 1970 00:00:00 GMT
    Set-Cookie: JSESSIONID=bgebt99ce9om;path=/logback-demo
    
    
    &lt;html&gt;
    &lt;head&gt;
            &lt;LINK REL=StyleSheet HREF="css/pk.css" /&gt;
    &lt;/head&gt;
    &lt;body&gt;
    
    &lt;h2&gt;Logback demo center&lt;/h2&gt;
    
    [snip, so that text is reasonably sized]</p>
    
      <p>&nbsp;</p>
    
    
      <p>As mentioned previously, while extremely useful during problem
      hunting, <code>TeeFilter</code> can introduce new problems.
      Consequently, we do not recommend having <code>TeeFilter</code>
      active in production systems. In order to avoid shipping different
      code for test and production environments, <code>TeeFilter</code>
      supports <code>includes</code> and <code>excludes</code> parameters.
      <code>TeeFilter</code> will be active if the current host is listed
      in the includes list and absent in the excludes list. By special
      convention, an empty includes list is interpreted as to contain all
      possible host names in the universe.
      </p>
    
      <p>To enable <code>TeeFilter</code> only on the hosts named "orion"
      and "gemini" and disabled elsewhere you would write:</p>
    
      <pre class="prettyprint source">&lt;filter>
      &lt;filter-name>TeeFilter&lt;/filter-name>
      &lt;filter-class>ch.qos.logback.access.servlet.TeeFilter&lt;/filter-class>
      &lt;init-param>
        <b>&lt;param-name>includes&lt;/param-name></b>
        <b>&lt;param-value>orion, gemini&lt;/param-value></b>
      &lt;/init-param>
    &lt;/filter>  </pre>
    
      <p>To enable <code>TeeFilter</code> on all hosts <em>except</em>
      hosts named "orion" and "gemini" you would write:</p>
    
      <pre class="prettyprint source">&lt;filter>
      &lt;filter-name>TeeFilter&lt;/filter-name>
      &lt;filter-class>ch.qos.logback.access.servlet.TeeFilter&lt;/filter-class>
      &lt;init-param>
        <b>&lt;param-name>excludes&lt;/param-name></b>
        <b>&lt;param-value>orion, gemini&lt;/param-value></b>
      &lt;/init-param>
    &lt;/filter>  </pre>
        
    
      <script src="templates/footer.js" type="text/javascript"></script>
    </div>
    
    </body>
    </html>
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/cla.txt��������������������������������������������������0000644�0001750�0001750�00000016023�11377016712�021661� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������                            QOS.ch
             Individual Contributor License Agreement ("Agreement") 
    
    This agreement is an adaptation  of the Apache Software Foundation ICL
    agreement where  references to  ASF have been  replaced by  QOS.ch. We
    thank the ASF for allowing QOS.ch to make use of their ICL agreement.
    
    Thank  you  for your  interest  in QOS.ch.  In  order  to clarify  the
    intellectual  property  license granted  with  Contributions from  any
    person  or entity, QOS.ch  must have  a Contributor  License Agreement
    ("CLA") on file  that has been signed by  each Contributor, indicating
    agreement  to  the license  terms  below.  This  license is  for  your
    protection as  a Contributor as well  as the protection  of QOS.ch and
    its  users;  it   does  not  change  your  rights   to  use  your  own
    Contributions for any other purpose.  If you have not already done so,
    please complete and  send an original signed Agreement  to QOS.ch, rue
    Enning  4,  1003  Lausanne,  Switzerland. Please  read  this  document
    carefully before signing and keep a copy for your records.
    
      Full name: ____________________________  E-Mail:    ___________________
    
      Mailing Address: ______________________  Telephone: ___________________
    
      _______________________________________________________________________  
    
      _______________________________________  Country:   ___________________
    
    
    You accept  and agree to the  following terms and  conditions for Your
    present and  future Contributions submitted QOS.ch.  In return, QOS.ch
    shall not  use Your  Contributions in  a way that  is contrary  to the
    public benefit.  Except for the  license granted herein to  QOS.ch and
    recipients of  software distributed by QOS.ch, You  reserve all right,
    title, and interest in and to Your Contributions.
    
    1. Definitions.
    
       "You" (or  "Your") shall mean  the copyright owner or  legal entity
       authorized  by the copyright  owner that  is making  this Agreement
       with QOS.ch.  For legal entities, the entity  making a Contribution
       and  all other  entities that  control, are  controlled by,  or are
       under common control with that entity are considered to be a single
       Contributor. For  the purposes of this  definition, "control" means
       (i)  the power,  direct  or  indirect, to  cause  the direction  or
       management  of such entity,  whether by  contract or  otherwise, or
       (ii) ownership  of fifty percent  (50%) or more of  the outstanding
       shares, or (iii) beneficial ownership of such entity.
    
       "Contribution"  shall   mean  any  original   work  of  authorship,
       including any modifications or  additions to an existing work, that
       is intentionally  submitted by You  to QOS.ch for inclusion  in, or
       documentation of,  any of the  products owned or managed  by QOS.ch
       (the  "Work"). For  the  purposes of  this definition,  "submitted"
       means any form of electronic, verbal, or written communication sent
       to  QOS.ch or  its representatives,  including but  not  limited to
       communication  on  electronic mailing  lists,  source code  control
       systems,  and issue  tracking systems  that are  managed by,  or on
       behalf of, QOS.ch  for the purpose of discussing  and improving the
       Work, but  excluding communication that is  conspicuously marked or
       otherwise designated in writing by You as "Not a Contribution."
    
    2. Grant of Copyright License. Subject  to the terms and conditions of
       this Agreement,  You hereby  grant to QOS.ch  and to  recipients of
       software   distributed   by    QOS.ch   a   perpetual,   worldwide,
       non-exclusive,   no-charge,  royalty-free,   irrevocable  copyright
       license  to  reproduce,   prepare  derivative  works  of,  publicly
       display,   publicly  perform,   sublicense,  and   distribute  Your
       Contributions and such derivative works.
    
    3. Grant of  Patent License.  Subject to the  terms and  conditions of
       this Agreement,  You hereby  grant to QOS.ch  and to  recipients of
       software   distributed   by    QOS.ch   a   perpetual,   worldwide,
       non-exclusive,  no-charge,  royalty-free,  irrevocable  (except  as
       stated in  this section)  patent license to  make, have  made, use,
       offer to sell, sell, import, and otherwise transfer the Work, where
       such license applies only to  those patent claims licensable by You
       that are necessarily infringed  by Your Contribution(s) alone or by
       combination  of Your Contribution(s)  with the  Work to  which such
       Contribution(s)  was  submitted. If  any  entity institutes  patent
       litigation against You or any other entity (including a cross-claim
       or counterclaim  in a lawsuit) alleging that  your Contribution, or
       the  Work to  which  you have  contributed,  constitutes direct  or
       contributory patent infringement,  then any patent licenses granted
       to that entity  under this Agreement for that  Contribution or Work
       shall terminate as of the date such litigation is filed.
    
    4. You  represent that  you are  legally entitled  to grant  the above
       license. If  your employer(s)  has rights to  intellectual property
       that  you create  that includes  your Contributions,  you represent
       that you  have received permission to make  Contributions on behalf
       of that  employer, that  your employer has  waived such  rights for
       your Contributions to QOS.ch.
    
    5. You  represent that  each of  Your Contributions  is  Your original
       creation (see section 7 for  submissions on behalf of others).  You
       represent  that  Your  Contribution  submissions  include  complete
       details of any third-party license or other restriction (including,
       but not  limited to, related  patents and trademarks) of  which you
       are personally aware and which are associated with any part of Your
       Contributions.
    
    6. You  are not expected  to provide  support for  Your Contributions,
       except to the extent You desire to provide support. You may provide
       support for  free, for  a fee,  or not at  all. Unless  required by
       applicable  law   or  agreed  to  in  writing,   You  provide  Your
       Contributions on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
       OF  ANY  KIND,  either   express  or  implied,  including,  without
       limitation,   any   warranties  or   conditions   of  TITLE,   NON-
       INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE.
    
    7. Should You wish to submit  work that is not Your original creation,
       You  may submit  it  to QOS.ch  separately  from any  Contribution,
       identifying the complete  details of its source and  of any license
       or  other  restriction  (including,  but not  limited  to,  related
       patents,  trademarks,  and license  agreements)  of  which you  are
       personally aware, and conspicuously  marking the work as "Submitted
       on behalf of a third-party: [named here]".
    
    8. You agree to  notify QOS.ch of any facts  or circumstances of which
       you become  aware that would make  these representations inaccurate
       in any respect.
    
    
    Please sign: __________________________________ Date: ________________
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/reasonsToSwitch.html�������������������������������������0000644�0001750�0001750�00000032365�11776030215�024412� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Reasons to prefer logback</title>
        <link rel="stylesheet" type="text/css" href="css/common.css" />
        <link rel="stylesheet" type="text/css" href="css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="css/_print.css" media="print" />
    
      </head>
      <body>
        <script type="text/javascript">prefix='';</script>
        <script src="templates/header.js" type="text/javascript"></script>
        <div id="left">
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="templates/left.js" type="text/javascript"></script>
        </div>
        <div id="content">
    		
    		<h2>Reasons to prefer logback over log4j</h2>
    
        <p>Logback brings a very large number of improvements over log4j,
        big and small. They are too many to enumerate exhaustively.
        Nevertheless, here is a non-exhaustive list of reasons for
        switching to logback from log4j. Keep in mind that logback is
        conceptually very similar to log4j as both projects were founded
        by the same developer. If you are already familiar with log4j, you
        will quickly feel at home using logback. If you like log4j, you
        will probably love logback.</p>
    
    
        <h3><a name="fasterImpl" href="#fasterImpl"><span
        class="anchor"/></a>Faster implementation</h3>
    
        <p>Based on our previous work on log4j, logback internals have
        been re-written to perform about ten times faster on certain
        critical execution paths. Not only are logback components faster,
        they have a smaller memory footprint as well.</p>
    
        <h3><a name="tdd" href="#tdd"><span class="anchor"/></a>Extensive
        battery of tests</h3>
    
        <p>Logback comes with a very extensive battery of tests developed
        over the course of several years and untold hours of work. While
        log4j is also tested, logback takes testing to a completely
        different level. In our opinion, this is the single most important
        reason to prefer logback over log4j.  You want your logging
        framework to be rock solid and dependable even under adverse
        conditions.
        </p>
        
        <h3><a name="slf4j" href="#slf4j"><span
        class="anchor"/></a>logback-classic speaks SLF4J natively</h3>
    
        <p>Since the <code>Logger</code> class in logback-classic
        implements the SLF4J API natively, you incur zero overhead when
        invoking an SLF4J logger with logback-classic as the underlying
        implementation. Moreover, since logback-classic strongly
        encourages the use of SLF4J as its client API, if you need to
        switch to log4j or to j.u.l., you can do so by replacing one jar
        file with another. You will not need to touch your code logging
        via the SLF4J API. This can drastically reduce the work involved
        in switching logging frameworks.
        </p>
        
        <h3><a name="docs" href="#docs"><span
        class="anchor"/></a>Extensive documentation</h3>
        
        <p>Logback ships with detailed and constantly updated
        documentation.</p>
    
        <h3><a name="DSL" href="#DSL"><span
        class="anchor"/></a>Configuration files in XML or Groovy</h3>
    
        <p>The traditional way of configuring logback is via an XML
        file. Most of the examples in the documentation use this XML
        syntax. However, as of logback version 0.9.22, <a
        href="manual/groovy.html">configuration files written in
        Groovy</a> are also supported. Compared to XML, Groovy-style
        configuration is more intuitive, consistent and has a shorter
        syntax.
        </p>
    
        <p>
        There is also a <a
        href="http://logback.qos.ch/translator/asGroovy.html">tool to
        automatically migrate your logback.xml files to
        logback.groovy</a>.
        </p>
    
        <h3><a name="autoScan" href="#autoScan"><span
        class="anchor"/></a>Automatic reloading of configuration
        files</h3>
    
        <p>Logback-classic can <a
        href="manual/configuration.html#autoScan">automatically reload its
        configuration file upon modification</a>. The scanning process is
        fast, contention-free, and dynamically scales to millions of
        invocations per second spread over hundreds of threads. It also
        plays well within application servers and more generally within
        the JEE environment as it does <em>not</em> involve the creation
        of a separate thread for scanning.
       </p>
    
        <h3><a name="grace" href="#grace"><span
        class="anchor"/></a>Graceful recovery from I/O failures</h3>
    
        <p>Logback's <code>FileAppender</code> and all its sub-classes,
        including <code>RollingFileAppender</code>, can gracefully recover
        from I/O failures. Thus, if a file server fails temporarily, you
        no longer need to restart your application just to get logging
        working again. As soon as the file server comes back up, the
        relevant logback appender will transparently and quickly recover
        from the previous error condition.
        </p>
        
        <h3><a name="maxHistory" href="#maxHistory"><span
        class="anchor"/></a>Automatic removal of old log archives</h3>
    
        <p>By setting the <span class="option">maxHistory</span> property
        of <a
        href="manual/appenders.html#TimeBasedRollingPolicy">TimeBasedRollingPolicy</a>
        or <a
        href="manual/appenders.html#SizeAndTimeBasedFNATP">SizeAndTimeBasedFNATP</a>,
        you can control the maximum number of archived files. If your
        rolling policy calls for monthly rollover and you wish to keep one
        year's worth of logs, simply set the <span
        class="option">maxHistory</span> property to 12. Archived log
        files older than 12 months will be automatically removed.
        </p>
    
        <h3><a name="compression" href="#compression"><span
        class="anchor"/></a>Automatic compression of archived log
        files</h3>
    
        <p><a
        href="manual/appenders.html#RollingFileAppender">RollingFileAppender</a>
        can automatically compress archived log files during
        rollover. Compression always occurs asynchronously so that even
        for large log files, your application is not blocked for the
        duration of the compression.
        </p>
    
        <h3><a name="prudent" href="#prudent"><span
        class="anchor"/></a>Prudent mode</h3>
    
        <p>In <a href="manual/appenders.html#prudent">prudent mode</a>,
        multiple <code>FileAppender</code> instances running on multiple
        JVMs can safely write to the same log file. With certain
        limitations, prudent mode extends to
        <code>RollingFileAppender</code>.
        </p>
    
        <h3><a name="lilith" href="#lilith"><span
        class="anchor"/></a>Lilith</h3>
    
        <p><a href="http://lilith.huxhorn.de/">Lilith</a> is a logging and
        access event viewer for logback. It is comparable to log4j's
        chainsaw, except that Lilith is designed to handle large amounts of
        logging data without flinching.</p>
      
        <h3><a name="conditional" href="#conditional"><span
        class="anchor"/></a>Conditional processing of configuration
        files</h3>
    
        <p>Developers often need to juggle between several logback
        configuration files targeting different environments such as
        development, testing and production. These configuration files
        have substantial parts in common, differing only in a few
        places. To avoid duplication, logback supports <a
        href="manual/configuration.html#conditional">conditional
        processing of configuration files</a> with the help of
        <code>&lt;if></code>, <code>&lt;then></code> and
        <code>&lt;else></code> elements so that a single configuration
        file can adequately target several environments.
        </p>
    
    
        <h3><a name="filters" href="#filters"><span
        class="anchor"/></a>Filters</h3>
    
        <p>Logback comes with a wide array of <a
        href="manual/filters.html">filtering capabilities</a> going much
        further than what log4j has to offer. For example, let's assume
        that you have a business-critical application deployed on a
        production server.  Given the large volume of transactions
        processed, logging level is set to WARN so that only warnings and
        errors are logged. Now imagine that you are confronted with a bug
        that can be reproduced on the production system but remains
        elusive on the test platform due to unspecified differences
        between those two environments (production/testing).
        </p>
    
        <p>With log4j, your only choice is to lower the logging level to
        DEBUG on the production system in an attempt to identify the
        problem. Unfortunately, this will generate large volume of logging
        data, making analysis difficult. More importantly, extensive
        logging can impact the performance of your application on the
        production system.</p>
    
        <p>With logback, you have the option of keeping logging at the
        WARN level for all users except for the one user, say Alice, who
        is responsible for identifying the problem. When Alice is logged
        on, she will be logging at level DEBUG while other users can
        continue to log at the WARN level. This feat can be accomplished
        by adding 4 lines of XML to your configuration file. Search for
        <code>MDCFilter</code> in the <a
        href="manual/filters.html#TurboFilter">relevant section</a> of the
        manual.
        </p>
        
    
        <h3><a name="sift" href="#sift"><span
        class="anchor"/></a>SiftingAppender</h3>
        
        <p><a
        href="manual/appenders.html#SiftingAppender">SiftingAppender</a>
        is an amazingly versatile appender. It can be used to separate (or
        sift) logging according to <b>any</b> given runtime attribute. For
        example, <code>SiftingAppender</code> can separate logging events
        according to user sessions, so that the logs generated by each
        user go into distinct log files, one log file per user.
        </p>
        
        <h3><a name="packagingData" href="#packagingData"><span
        class="anchor"/></a>Stack traces with packaging data
        </h3>
    
        <p>When logback prints an exception, the stack trace will include
        packaging data. Here is a sample stack trace generated by the <a
        href="demo.html">logback-demo</a> web-application.</p>
    
        <pre>14:28:48.835 [btpool0-7] INFO  c.q.l.demo.prime.PrimeAction - 99 is not a valid value
    java.lang.Exception: 99 is invalid
      at ch.qos.logback.demo.prime.PrimeAction.execute(PrimeAction.java:28) [classes/:na]
      at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431) [struts-1.2.9.jar:1.2.9]
      at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236) [struts-1.2.9.jar:1.2.9]
      at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432) [struts-1.2.9.jar:1.2.9]
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) [servlet-api-2.5-6.1.12.jar:6.1.12]
      at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:502) [jetty-6.1.12.jar:6.1.12]
      at ch.qos.logback.demo.UserServletFilter.doFilter(UserServletFilter.java:44) [classes/:na]
      at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1115) [jetty-6.1.12.jar:6.1.12]
      at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:361) [jetty-6.1.12.jar:6.1.12]
      at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:417) [jetty-6.1.12.jar:6.1.12]
      at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230) [jetty-6.1.12.jar:6.1.12]</pre>
    
        <p>From the above, you can recognize that the application is using
        Struts version 1.2.9 and was deployed under jetty version
        6.1.12. Thus, stack traces will quickly inform the reader about
        the classes intervening in the exception but also the package and
        package versions they belong to. When your customers send you a
        stack trace, as a developer you will no longer need to ask them
        to send you information about the versions of packages they are
        using. The information will be part of the stack trace. See <a
        href="manual/layouts.html#xThrowable">"%xThrowable" conversion
        word</a> for details.
        </p>
    
        <p>This feature can be quite helpful to the point that some users
        mistakenly consider it a <a
        href="http://www.jetbrains.net/devnet/message/5259058">feature of
        their IDE</a>.
        </p>
    
        <h3><a name="logbackAccess" href="#logbackAccess"><span
        class="anchor"/></a>Logback-access, i.e. HTTP-access logging with
        brains, is an integral part of logback</h3>
    
        <p>Last but not least, the logback-access module, part of the
        logback distribution, integrates with Servlet containers such as
        Jetty or Tomcat to provide rich and powerful HTTP-access log
        functionality. Since logback-access was part of the initial
        design, all the logback-classic features you love are
        available in logback-access as well.</p>
    
        <h3><a name="inSummary" href="#inSummary"><span
        class="anchor"/></a>In summary</h3>
    
        <p>We have listed a number of reasons for preferring logback over
        log4j. Given that logback builds upon on our previous work on
        log4j, simply put, logback is just a better log4j.</p>
    
        <script src="templates/footer.js" type="text/javascript"></script>	   
        </div>
    
      </body>
    </html>
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/faq.html�������������������������������������������������0000644�0001750�0001750�00000030753�11656204533�022024� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Logback FAQ</title>
        <link rel="stylesheet" type="text/css" href="css/common.css" />
        <link rel="stylesheet" type="text/css" href="css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="css/_print.css" media="print" />
    
      </head>
      <body>
        <script type="text/javascript">prefix='';</script>
    
        <script src="templates/header.js" type="text/javascript"></script>
        <div id="left">
          <script src="templates/left.js" type="text/javascript"></script>
        </div>
        <div id="content">
    	
        <h2>
          <a name="top">Frequently Asked Questions</a>
        </h2>
          
        <h3>Logback project</h3>
    
        <ol>
          <li><a href="#why_lgpl">Why is logback distributed under LGPL
          and not the Apache Software License?</a> </li>
    
          <li><a href="#dependecy">What are logback's dependencies, i.e.
          JDK version and third-party libraries?</a>
          </li>
        </ol>
      
                          
        <h3>Logback Classic</h3>
        
        
        <ol type="1">    
          <li>
            <a href="#logger_serialization">Are logback loggers
            serializable?</a>
          </li>  
          
          <li>
            <a href="#auto_config">How does the automatic configuration
            work?</a>
          </li>  
    
          <li>
            <a href="#configFileLocation">Where should the configuration
            files such as <em>logback.groovy</em>,
            <em>logback-test.xml</em> or <em>logback.xml</em> be located
            on the classpath?</a> </li>
    
          <li>
            <a href="#sharedConfiguration">Is it possible for multiple JEE
            applications to share the same configuration file but without
            stepping on each other's toes?
            </a>
          </li>
    
          <li>
            <a href="#overrideFromCL">
              How can I disable logging from the command line?            
            </a>
          </li>
    
          <li>
            <a href="#setup_jetty">How can Jetty be instructed to use
            logback-classic as its logging implementation?
            </a>
          </li>
        </ol>
        
        <!-- =============================================================== -->
        <!-- =============================================================== -->
        <!-- =============================================================== -->
        <!-- =============================================================== -->
      
            
        <div class="section">
          <h2>Logback project</h2>
          
          <dl>
            <dt>
              <a name="why_lgpl" href="#why_lgpl">Why is logback
              distributed under LGPL and not the Apache Software License
              (ASL)?</a> </dt>
            
            <dd>
              <p>The logback project is dual licensed under the LGPL and
              the EPL for two main reasons. For one, the different
              license emphasizes that the fact that logback is a related
              but <em>different</em> project than log4j. 
              </p>
    
              <p>Both the LGPL and EPL are reasonable and widely-accepted
              licenses. In contrast to the ASL, both the LGPL and he EPL
              require that derivate work be licensed under the same
              license. While there might be debate about the exact
              definition of derivative work, we find such reciprocity both
              justified and morally appealing -- that is the second
              reason for our choice of the LGPL &amp; EPL
              dual-license. The subtly more liberal approach embodied in
              the ASL is not necessarily wrong. It is the expression of a
              different balance.
              </p>
              
            </dd>
          </dl>
    
          <hr/>
    
          <dl>
            <dt><a name="dependecy" href="#dependecy">What are logback's
            dependencies, i.e.  JDK version and third-party libraries?</a>
            </dt>
    
            <dd><p>This question is answered on a <a
            href="dependencies.html">separate page</a> dedicated to the
            question of dependencies.</p>
            </dd>
          </dl>
    
    
        </div>
        
        <div class="section">
          <h2>Logback-classic</h2>
          <dl>
            
            <!-- ========================================================= -->
            
            <dt>
              <a name="auto_config" href="#auto_config">
                How does the automatic configuration work?
              </a>
            </dt>
            <dd>
              <p>This question is answered in the <a
              href="manual/configuration.html#auto_configuration">relevant
              section</a> of the logback manual.
              </p>        
              <hr/>
            </dd>
            
    
            <!-- ========================================================= -->
    
            <dt>
    
              <a name="configFileLocation"
              href="#configFileLocation">Where should the configuration
              files such as <em>logback.groovy</em>,
              <em>logback-test.xml</em> or <em>logback.xml</em> be located
              on the classpath?</a>
            </dt>
    
    
            <dd>
              <p>Configuration files such as <em>logback.groovy</em>,
              <em>logback-test.xml</em> or <em>logback.xml</em> can be
              located <b>directly</b> under any folder declared in the
              class path. For example, if the class path reads
              "c:/java/jdk15/lib/rt.jar;c:/mylibs/" then the
              <em>logback.xml</em> file should be located directly under
              "c:/mylibs/", that is as "c:/mylibs/logback.xml". Placing it
              under a sub-folder of c:/mylibs/, say, c:/mylibs/other/,
              will not work.</p>
            
              <p>For web-applications, configuration files can be placed
              <b>directly</b> under <em>WEB-INF/classes/</em>.</p>
    
              <hr/>
            
            </dd>
            
            <!-- ========================================================= -->
            
            <dt>
              <a name="logger_serialization" href="#logger_serialization">
              Are logback loggers serializable?</a>
            </dt>
            <dd>
              <p>Yes. A logback logger <em>is</em> an SLF4J logger and SLF4J
              loggers are serializable. This means that an object
              referencing a logger will be able to log after its
              deserialization.
              </p>
              
              <p>The deserialized logger instance will be generated by
              <code>org.slf4j.LoggerFactory</code>.  Thus, it is possible
              for a logback logger to be deserialized as a log4j or j.u.l.
              logger, depending on the deserialization environment.</p>
    
              <hr/>
            </dd>
            
    
            <!-- ========================================================= -->
       
            <dt>
              <a name="sharedConfiguration" href="#sharedConfiguration">
              Is it possible for multiple JEE applications to share the
              same configuration file but without stepping on each other's
              toes?</a>
            </dt>
            <dd>
              <p>Yes, it is. Using <a
              href="manual/configuration.html#variableSubstitution">variable
              substitution</a>, it is possible to have a single
              configuration file to output logs to different destinations
              for each JEE application. Here is a sample
              configuration file designed for this purpose.</p>
              
              <p class="source">&lt;configuration>
      &lt;appender name="FILE" class="ch.qos.logback.core.FileAppender">
        &lt;!-- "application-name" is a variable --&gt;
        &lt;File><b>c:/logs/${application-name}.log</b>&lt;/File>
        &lt;layout class="ch.qos.logback.classic.PatternLayout">
          &lt;Pattern>%d %p %t %c - %m%n&lt;/Pattern>
        &lt;/layout>
      &lt;/appender>
      &lt;root level="debug">
        &lt;appender-ref ref="FILE"/>
      &lt;/root>
    &lt;/configuration> </p>
    
              <p>Assuming each JEE application loads a different copy of
              logback classes into memory, if we can somehow inject a
              different value for <code><em>application-name</em></code>
              each time an application starts, logs will be output to
              different files. We just need to initialize logback with the
              above configuration file while injecting a different value
              for <code><em>application-name</em></code> variable. Here is
              sample code that programmatically configures logback. It
              should be invoked during the initialization of your JEE
              applications.
              </p>
    
              <p class="source">  LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
      JoranConfigurator jc = new JoranConfigurator();
      jc.setContext(context);
      context.reset(); // override default configuration
      // inject the name of the current application as "application-name"
      // property of the LoggerContext
      <b>context.putProperty("application-name", NAME_OF_CURRENT_APPLICATION);</b>
      jc.doConfigure("/path/to/the/above/configuration/file.xml"); </p>
    
              <hr/>
            </dd>
            
    
            <!-- ========================================================= -->
    
            <dt>
              <a name="overrideFromCL" href="#overrideFromCL">
                How can I disable logging from the command line?
              </a>
            </dt>
            <dd>
              <p>Logback does not allow logging to be disabled from the command
              line. However, if the configuration file allows it, you can
              set the level of loggers on the command line via a Java
              system property. Here is such a configuration file.</p>
    
              <p class="source">&lt;configuration>
      &lt;appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        &lt;layout class="ch.qos.logback.classic.PatternLayout">
          &lt;Pattern>%d [%thread] %level %logger - %m%n&lt;/Pattern>
        &lt;/layout>
      &lt;/appender>
      &lt;root level="<b>${root-level:-INFO}</b>">
        &lt;appender-ref ref="CONSOLE"/>
      &lt;/root>
    &lt;/configuration></p>
    
    
              <p>Making use of <a
              href="manual/configuration.html#variableSubstitution">variable
              substitution</a> as well as <a
              href="manual/configuration.html#defaultValuesForVariables">default
              values for variables</a>, if the <span
              class="variable">root-level</span> system property is set to
              <code>OFF</code>, then all logging will be turned
              off. However, if it is not set, it will assume the default
              value of <code>INFO</code>.  Note that you can set the <span
              class="variable">root-level</span> system property to any
              level value of your choice. The value <code>OFF</code> is
              just an example.
    
              </p>
              <hr/>
            </dd>
    
    
            <!-- ========================================================= -->
            
            <dt>
              <a name="setup_jetty"  href="#">
                How can Jetty be instructed to use logback-classic as its
                logging implementataion?
              </a>
            </dt>
            
            <dd>
              <p>The Jetty application server uses SLF4J for its internal
              logging.
              </p>
              
              <p>Logback jar files must be present on Jetty's class
              path. These files are
              <em>logback-core-${project.version}.jar</em> and
              <em>logback-classic-${project.version}.jar</em>. These files
              should be placed under the <em>$JETTY_HOME/lib</em>
              directory.
              </p>
    
              
              <p>Since Jetty uses an older version of SLF4J internally,
              we recommend that the old version be replaced by
              <em>slf4j-api-${slf4j.version}.jar</em>. This file can be
              downloaded from the <a
              href="http://www.slf4j.org/download.html">SLF4J</a> project.
              </p>
            
              
              <p>For automatically configuring logback-classic, you can
              place the file <em>logback.xml</em> under the
              <em>$JETTY_HOME/resources</em> directory. You can find
              sample configuration files in the
              <em>logback-examples/src/main/java/chapters/appenders/conf/</em>
              folder shipping within the logback distribution.
              </p>
    
              <hr/>                    
            </dd>
            
    
            
            
            <!-- end of definitions -->
          </dl>
          
          
        </div>
    
      <script src="templates/footer.js" type="text/javascript"></script>
      
    </div>
      
    
    	
    
    </body>
    </html>
    ���������������������logback_1.0.13/logback-site/src/site/pages/setup.html�����������������������������������������������0000644�0001750�0001750�00000026061�12136042273�022405� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Setup</title>
        <link rel="stylesheet" type="text/css" href="css/common.css" />
        <link rel="stylesheet" type="text/css" href="css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="css/_print.css" media="print" />
        <link rel="stylesheet" type="text/css" href="css/prettify.css" media="screen" />
      </head>
      <body onload="prettyPrint(); decorate();">
        <script type="text/javascript">prefix='';	</script>
    
        <script type="text/javascript" src="templates/header.js"></script>
        <script type="text/javascript" src="js/prettify.js"></script>
        <script type="text/javascript" src="js/jquery-min.js"></script>
        <script type="text/javascript" src="js/decorator.js"></script>
        
        <div id="left">
          <script type="text/javascript" src="templates/left.js"></script>
        </div>
      
        <div id="content">
    	
    	
        <h2 class="doAnchor">Classpath Setup</h2>
    
        <p>In order to run the examples provided in the documentation, you
        need to add the following jars to your class path:
        </p>
    
        <ul>
          <li>logback-core-${project.version}.jar</li>
          <li>logback-classic-${project.version}.jar</li>
          <li>logback-examples-${project.version}.jar</li>
          <li>slf4j-api-${slf4j.version}.jar</li>
        </ul>
        
        <p>The <em>logback-*.jar</em> files are part of the logback
        distribution whereas <em>slf4j-api-${slf4j.version}.jar</em> ships
        with <a href="http://www.slf4j.org">SLF4J</a>, a separate project.
        </p>
        
    
    
        <h3 class="doAnchor" name="commandLine">Running from the command
        line</h3>
        
        <p>Assuming your current directory is
        <em>$LOGBACK_HOME/logback-examples</em>, where
        <em>$LOGBACK_HOME</em> stands for the directory where you
        installed logback, you can launch the first sample application,
        <em>chapters.introduction.HelloWord1</em> with the following command:
        </p>
    
        <p class="source">java -cp lib/slf4j-api-${slf4j.version}.jar;../logback-core-${project.version}.jar;\
     ../logback-classic-${project.version}.jar;logback-examples-${project.version}.jar\
     chapters.introduction.HelloWorld1</p>
    
       <p>It is more convenient to set the CLASSPATH environment variable
       once and for all before running the examples.
       </p>
    
       <p>The <em>setClasspath.cmd</em> script located in the
       $LOGBACK_HOME/logback-examples folder will configure the class path
       for the MS Windows platform. For Unix, you can use
       <em>setClasspath.sh</em>.
       </p>
    
       <p>Please edit the script in order to adapt the <em>LB_HOME</em> variable 
       to match your local environment.</p>
       
       <p>Please be aware that many examples will launch Java classes
       along with configuration files. To access these files by using the
       same commands as written in the documentation, you will need to
       issue the commands from within the
       <em>$LOGBACK_HOME/logback-examples</em> directory.
       </p>
    
       <h3 class="doAnchor" name="SMTP"><code>SMTPAppender</code> requires
       JavaMail API</h3>
    
       <p><code>SMTPAppender</code> related examples require the JavaMail
       API version 1.4 or later. Once you <a
       href="http://java.sun.com/products/javamail/downloads/index.html">download
       JavaMail</a>, you need to place <em>mail.jar</em> on your class
       path.</p>
       
       <p>Here is the corresponding Maven dependency declaration for your
       convenience.</p>
    
    
    
       <pre class="prettyprint source">&lt;!-- The javax.activation:activation:1.1 dependency will be --&gt;
    &lt;!-- automatically pulled in by Maven's transitivity rules --&gt;
    &lt;dependency>
      &lt;groupId>javax.mail&lt;/groupId>
      &lt;artifactId>mail&lt;/artifactId>
      &lt;version>${javax.mail.version}&lt;/version>
    &lt;/dependency></pre>
    
       <h3 class="doAnchor" name="groovy"><code>GEventEvaluator</code> and
       <em>logback.groovy</em> configuration files require the Groovy
       runtime</h3>
       
       <p><code>GEventEvaluator</code> depends on the Groovy runtime. It
       was tested with Groovy version ${groovy.version}. Similarly, as the
       name indicates <a href="manual/groovy.html">groovy
       configuration</a> files require the groovy runtime to be present on
       your class path.
       </p>
       
       <p>Here is the corresponding Maven dependency declaration for your
       convenience.
       </p>
    
    
       <pre class="prettyprint source">&lt;dependency>
      &lt;groupId>org.codehaus.groovy&lt;/groupId>
      &lt;artifactId>groovy-all&lt;/artifactId>
      &lt;version>${groovy.version}&lt;/version>
    &lt;/dependency></pre>
    
    
       <h3 class="doAnchor" name="janino">Conditional processing and
       <code>JaninoEventEvaluator</code> require the Janino library</h3>
       
       <p><a href="manual/configuration.html#conditional">Conditional
       processing</a> in configuration files requires the <a
       href="http://docs.codehaus.org/display/JANINO/Home"><b>Janino
       library</b></a>. Moreover, the evaluator examples based on
       <code>JaninoEventEvaluator</code> require Janino as well.  Once you
       download Janino, simply place <em>commons-compiler.jar</em> and
       <em>janino.jar</em> on your application's class path.
       </p>
    
       <p><span class="label notice">Don't forget</span> As of Janino
       version 2.6.0, in addition to <em>janino.jar</em>,
       <em>commons-compiler.jar</em> needs to be on the class path as well.</p>
    
       <p>Here is the corresponding Maven dependency declaration for your
       convenience.
       </p>
    
       <pre class="prettyprint source">&lt;!-- The org.codehaus.janino:commons-compiler:${janino.version} dependency --&gt;
    &lt;!-- will be automatically pulled in by Maven's transitivity rules --&gt;
    &lt;dependency>
      &lt;groupId>org.codehaus.janino&lt;/groupId>
      &lt;artifactId>janino&lt;/artifactId>
      &lt;version>${janino.version}&lt;/version>
    &lt;/dependency></pre>
    
    
    
       
        
    
       <h3 class="doAnchor" name="ide">Building with an IDE</h3>
       
       <p>If you wish to contribute to the project or just hack for fun,
       you will probably want to import logback as a project into your
       favorite IDE. Logback uses Maven as its build tool. Logback offers
       a Groovy-based configurator so there is a dependency on the Groovy
       language. It follows that your IDE should have plugins for Maven
       and Groovy in order to <em>build</em> logback from your within
       IDE. The Groovy dependecy just mentioned is a <em>build-time</em>
       dependency. The only mandatory logback dependency at runrime is the
       JRE, unless of course you wish to use the Groovy configurator in
       which case Groovy runtime will be a required dependency as
       well. Also note that building from the command line is fairly
       trivial, the command 'mvn install' given from $LOGBACK_HOME folder
       should suffice. </p>
    
       <p><span class="label">ask for help</span> Notwithstanding the
       instructions below, if you have trouble building logback from the
       sources, just ask for help on the logback-dev mailing list.</p>
    
       <h3 class="doAnchor" name="idea">Building logback with IntelliJ
       IDEA</h3>
    
       <p>Assuming you have the latest version of IntelliJ IDEA installed,
       no additional plugin installation is necessary. IntelliJ IDEA
       supports Maven as well as Groovy out of the box. You can import
       logback into IDEA by selecting File&rarr; New Project &rarr; Import
       from external model&rarr; Maven, then select $LOGBACK_HOME as the
       Root directory. The import should finish successfully in a few
       seconds.</p>
    
       <h3 class="doAnchor" name="eclipse">Building with Eclipse</h3>
    
       <p>Building logback under Eclipse is a little trickier. Here are
       instructions for building logback under Eclipse in 61 easy steps.
       </p>
    
       <p>The author does not wish to unduly disparage
       <code>m2eclipse</code>. However, as of this writing, that is
       October 2011, it appears that the key to building logback under
       Eclipse is to avoid using <code>m2eclipse</code>. If you have
       <code>m2eclipse</code> installed, you can disable it by removing
       the Maven Nature for a given project. In later versions of Eclipse,
       m2eclipse is installed bu default. As of logback version 1.0.7, the
       <em>pom.xml</em> file for logback-core now deactivates m2eclipse as
       explained in <a
       href="http://wiki.eclipse.org/M2E_plugin_execution_not_covered#ignore_plugin_goal">M2E
       plugin wiki</a>.
       </p>
    
       <p>And without further ado here are the steps:
       </p>
       
    
       <ol>
         <li>Install Eclipse</li>
    
    <!--     <li>in <em>eclipse.ini</em> file modify the parameter "mx",
         i.e. change -Xmx384m to -Xmx1384m</li>
    -->
    
         <li>Install the Groovy plugin for Eclipse. 
    
           <ul>
             <li>
               <p>You first need to determine the update site appropriate
               for your version of Eclipse. The list of available update
               sites is available from <a
               href="http://groovy.codehaus.org/Eclipse+Plugin">Groovy
               project documentation</a>.
               </p>
               <p>For example, for Eclipse 4.2 (Juno) the URL of the
               update site is
               "http://dist.springsource.org/release/GRECLIPSE/e4.2/".
               </p>
             </li>
             
             <li>In Eclipse, select Help &rarr; Intall new Software &rarr;
             Work with the update site you chose in the previous step and
             then Select "Groovy-Eclipse Feature". Installation of other
             plugins in particular "m2e Configurator for Groovy-Eclipse"
             is <b>not</b> necessary
             </li>
           </ul>
        </li>
    
    
    
         <li><pre>cd $LOGBACK_HOME</pre>
    
         where $LOGBACK_HOME stands for the location where you cloned the
         logback project from github </li>
    
         <li>In case they exist, remove <em>.settings</em>,
         <em>.classpath</em>, <em>.project</em> folders (again if any)
         under $LOGBACK_HOME and its sub-folders. Somehow, this step seems
         to be crucial.</li>
         
         <li>From the command line, run <code>mvn eclipse:eclipse</code>
         in $LOGBACK_HOME</li>
    
         <li>In Eclipse, import the logback project: Import&rarr;
         General&rarr; Existing Prokects into Workspace, select
         $LOGBACK_HOME folder for the import
         </li>   
         
         <li>In Eclipse, remove the
         logback-classic/target/generated-sources/groovy-stubs/main
         directory from the list of source folders (logback-classic&rarr;
         project properties &rarr; Java Build Path)
         </li>   
    
         <li>In Eclipse, clean all projects in Eclipse (Project &rarr;
         Clean)
         </li>   
    
         <li>In Eclipse, select logback-classic project and convert it to
         "Groovy project" (right click on logback-classic project &rarr;
         Configure &rarr; Convert Groovy to Project)
         </li>   
         
       </ol>
    
    
       <p>The above listed procedure has been last tested by the author
       using Eclipse Juno on April 4th 2013.</p>
    
       <script src="templates/footer.js" type="text/javascript"></script>
    </div>
    </body>
    </html>
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/repos.html�����������������������������������������������0000644�0001750�0001750�00000003524�11752431123�022373� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Repository</title>
        <link rel="stylesheet" type="text/css" href="css/common.css" />
        <link rel="stylesheet" type="text/css" href="css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="css/_print.css" media="print" />
      </head>
      <body>
        <script  type="text/javascript">prefix='';</script>    
        <script src="templates/header.js"  type="text/javascript"></script>
        <div id="left">
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="templates/left.js"  type="text/javascript"></script>
        </div>
        <div id="content">
    	
    	
    		<div class="section">
    			<h2>Source Repository</h2>
    		</div>
    
    		<p>We store the project's source code in a revision control system
    		called Git. Developers have write access to the repository,
    		enabling them to make changes to the source code. Everyone else
    		has read-access to the repository. Thus, anyone can check out the
    		latest development version of the software. Note that the latest
    		version in the repository may not work as expected. It may not
    		even compile. If you are looking for a stable release, then
    		download an official distribution.
        </p>
    
        <p>The official logback source repository is located on github at
        <a href="http://github.com/qos-ch/logback">
        http://github.com/qos-ch/logback</a>.
        </p>
        
        <p>Anyone can clone logback's source repository. All you need is a
        <code>git</code> client. </p>
            
        <script src="templates/footer.js" type="text/javascript"></script>
        </div>
    </body>
    </html>
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/news.html������������������������������������������������0000644�0001750�0001750�00000276213�12143154074�022230� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>News</title>
        <link rel="stylesheet" type="text/css" href="css/common.css" />
        <link rel="stylesheet" type="text/css" href="css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="css/_print.css" media="print" />
        <link rel="stylesheet" type="text/css" href="css/prettify.css" media="screen" />    
      </head>
    
      <body onload="prettyPrint()">
        <script type="text/javascript">prefix='';</script>
        <script type="text/javascript" src="js/prettify.js"></script>
        <script src="templates/header.js" type="text/javascript"></script>
        <div id="left">
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="templates/left.js" type="text/javascript"></script>
        </div>
        <div id="content">
    	
        <h2>Logback News</h2>
      
        <p>You can receive logback-related announcements by subscribing to
        the <a href="http://www.qos.ch/mailman/listinfo/announce">QOS.ch
        announce</a> mailing list.</p>
    
    
        <hr width="80%" align="center" />
    
        <h3>May 10th, 2013 - Release of version 1.0.13</h3>
      
        <p>In logback-access MANIFEST file, imports of Jetty and Tomcat
        are now optional. This fixes <a
        href="http://jira.qos.ch/browse/LOGBACK-300">LOGBACK-300</a>
        reported by Christian Brensing who also provided the appropriate
        pull request.
        </p>
    
        <p>Logback will now correctly parses variables with a default
        separator string nested within accolades, e.g. "{a:-b}". Such
        strings resemble variable references but lack the $ prefix, e.g
        "${a:-b}". This fixes <a
        href="http://jira.qos.ch/browse/LOGBACK-859">LOGBACK-859</a>
        reported by Yoni Moses.</p>
    
        <p>In <code>InterpretationContext</code> class replaced code using
        JDK 1.6 API with code using JDK 1.5. This fixes <a
        href="http://jira.qos.ch/browse/LOGBACK-860">LOGBACK-860</a>
        reproted by Bas Stoker.
        </p>
    
        <p>Updated the "org.fusesource.jansi:jansi" dependency to version
        1.9.</p>
    
        <hr width="80%" align="center" />
    
        <h3>April 26th, 2013 - Release of version 1.0.12</h3>
        
        <p>A new <code>SSLSocketAppender</code> extends the basic 
        <code>SocketAppender</code> providing the ability to deliver 
        logging events over the Secure Socket Layer (SSL).  The 
        corresponding <code>SimpleSSLSocketServer</code> extends the classic 
        <code>SimpleSocketServer</code> as a basic logging server 
        application that receives logging events from a 
        <code>SSLSocketAppender</code>.</p>
          
        <p class="highlight">Receiver components are configured in
        logback.xml just like any other logback component.</p>
    
        <p>While <code>SimpleSocketServer</code> (and its new SSL-enabled
        counterpart, <code>SimpleSSLSocketServer</code>) provide an 
        easy-to-use standalone logging server application, a new component
        type known as a <em>receiver</em> allows <em>any</em> application 
        to receive logging events from remote appenders over a TCP/IP network 
        connection, using Logback Classic.  Receiver components are 
        configured in <em>logback.xml</em> just like any other logback 
        component.</p>
          
        <p>A receiver can either listen passively for connections from
        remote <code>SocketAppender</code> components acting as clients, 
        or it can assume the client role, initiating a connection to a 
        remote appender acting as a server.  The receiver components 
        shipped with Logback include full support for logging event 
        delivery over the Secure Sockets Layer (SSL).</p>
    
        <p>All of the new socket-based receiver and appender components were 
        contributed by Carl Harris.  See 
        <a href="manual/receivers.html">Receivers</a> in the Logback Manual 
        for more information on configuring receiver components.  See 
        <a href="manual/appenders.html#SocketAppender">SocketAppender</a> and
        <a href="manual/appenders.html#serverSocketAppender">ServerSocketAppender</a>
        for information on configuring appenders as event sources for
        receiver components.</p>
    
        <p><code>RollingFileAppender</code> will now detect when <span
        class="option">file</span> property collides with <span
        class="option">fileNamePattern</span>, emit <a
        href="codes.html#rfa_collision">an error message</a> and refuse to
        initialize. This was requested in <a
        href="http://jira.qos.ch/browse/LOGBACK-796">LOGBACK-796</a> by
        Karl Pietrzak who also provided a patch.
        </p>
    
        <p>In configuration files, the <code>&lt;include></code> element
        now admits the <span class="attr">optional</span> attribute. This
        fixes <a
        href="http://jira.qos.ch/browse/LOGBACK-230">LOGBACK-230</a>
        reported by Attila Kiraly. Many thanks to Tommy Becker who
        contributed a patch.</p>
    
        <p>In response to <a
        href="http://jira.qos.ch/browse/LOGBACK-829">LOGBACK-829</a>,
        serialization of <code>Logger</code> instances has been
        significantly simplified and much unnecessary bloat removed. As an
        added bonus, the new serialization of <code>Logger</code> objects
        is also compatible with serialization streams using older Logger
        instances. <code>Logger</code> instances serialized by logback
        1.0.11 and earlier can be read by logback version 1.0.12 and later
        and <em>vice-versa</em>.
        </p>
    
        <p>The code detecting whether Groovy is available on the class
        path deals with the case where logback binaries are installed as
        endorsed libraries. This fixes <a
        href="http://jira.qos.ch/browse/LOGBACK-831">LOGBACK-831</a>.
        </p>
    
        <p class="highlight">Groovy configurator no longer supports
        <code>SiftingAppender</code>.</p>
    
        <p>In response to <a
        href="http://jira.qos.ch/browse/LOGBACK-244">LOGBACK-244</a>, <a
        href="http://jira.qos.ch/browse/LOGBACK-724">LOGBACK-724</a> and
        in particular patches provided by Tommy Becker and David Roussel
        component tracking code has been simplified and completely
        re-written. <code>SiftingAppender</code> now supports the <a
        href="manual/appenders.html#siftTimeout">timeout</a> and <a
        href="manual/appenders.html#siftMaxAppenderCount">maxAppenderCount</a>
        parameters. As a direct consequence of modifications to component
        tracking code, the groovy configurator no longer supports
        <code>SiftingAppender</code>.</p>
    
        <p>SiftingAppender now propagates properties defined elsewhere in
        the configuration file into the configuration process of nested
        appenders. This fixes <a
        href="http://jira.qos.ch/browse/LOGBACK-833">LOGBACK-833</a> with
        David Roussel providing the appropriate patch.
        </p>
    
        <p>As all other actions affecting properties,
        <code>TimestampAction</code> now inserts the user-specified
        property into the local scope by default. The property was
        inserted into the context scope in earlier versions of logback.
        This fixes <a
        href="http://jira.qos.ch/browse/LOGBACK-835">LOGBACK-835</a> with
        David Roussel providing the appropriate patch.
        </p>
    
        <p>Logback is now able to retrieve the name of localhost when
        running under OS X and Java 7. This issue was reported by <a
        href="http://jira.qos.ch/browse/LOGBACK-749">LOGBACK-749</a> by
        Oliver Schrenk with patches provided by Ralph Goers and Pavel
        Valodzka.
        </p>
    
        <p>The <a href="manual/layouts.html#mdc">mdc</a> converter can now
        handle default values. This feature was requested in <a
        href="http://jira.qos.ch/browse/LOGBACK-246">LOGBACK-246</a> by
        Michael Osipov with Denis Bazhenov providing a patch.
        </p>
    
        <p><code>DBAppender</code> in logback-classic module no longer
        assumes that caller information is always available. This fixes <a
        href="http://jira.qos.ch/browse/LOGBACK-805">LOGBACK-805</a>
        reported by Daris Cooper who also provided a corrective patch.</p>
    
        <p>In order to simplify our build, several unit tests have been
        ported from Scala to Java. It follows that logback no longer
        depends on Scala, not even during the test phase of the build.</p>
    
        <h3>25th of March, 2013 - Release of version 1.0.11</h3>
    
    
        <p>Under Unix*, the basic/quick file rename method supplied by
        Java does not work if the source and target files are on different
        file systems. This problem was reported in <a
        href="http://jira.qos.ch/browse/LOGBACK-108">LOGBACK-108</a> by
        Daniel Potter. In order to deal with this issue, logback now will
        perform rename by copying if the source and target files are on
        different file systems and the host JDK is version 1.7 or
        later. See also the related <a
        href="codes.html#renamingError">error code</a>.</p>
    
    
        <p>The "cn" conversion word now correctly maps to
        <code>ContextNameConverter</code> class. This fixes <a
        href="http://jira.qos.ch/browse/LOGBACK-463">LOGBACK-463</a>
        reported by Michael Osipov with Mark A. Ziesemer providing the
        appropriate patch.
        </p>
    
        <p>Added gray to the list of <a
        href="manual/layouts.html#coloring">ANSI colors supported by
        logback</a>. The relevant pull request was kindly provided by
        Craig P. Motlin.</p>
    
        <p>The <code>discoverConnectionProperties()</code> method in class
        <code>ConnectionSourceBase</code> no longer leaks
        connections. This fixes <a
        href="http://jira.qos.ch/browse/LOGBACK-798">LOGBACK-798</a>
        reported by Sayevskiy Viacheslav. Many thanks to Ivan
        (Wee-Willie-Winkie) who contributed the appropriate fix.
        </p>
    
        <p>In logback-access, more correct determination of whether
        contents of an <code>HttpServletRequest</code> are URL encoded or
        not. The <a href="https://github.com/qos-ch/logback/pull/71">bug
        fix</a> was submitted by David Schneider. The same issue was later
        independently reported by Grzegorz Kuligowski in <a
        href="http://jira.qos.ch/browse/LOGBACK-814">LOGBACK-814</a>.</p>
    
        <p>Both <code>SocketAppenderBase</code> and
        <code>SimpleSocketServer</code> now use a socket factory to create
        sockets. These changes were asked in <a
        href="http://jira.qos.ch/browse/LOGBACK-815">LOGBACK-815</a> and
        <a href="http://jira.qos.ch/browse/LOGBACK-816">LOGBACK-816</a> by
        Carl Harris who also contributed the relevant patch.
        </p>
    
        <hr width="80%" align="center" />
    
        <h3>15th of March, 2013 - Release of version 1.0.10</h3>
    
        <p>Upgraded the (optional) groovy dependency to version 2.0.7
        (from 2.0.0).</p>
    
        <p>The logger cache field in <code>LoggerContext</code> now uses a
        <code>ConcurrentHashMap</code> instead of a regular
        <code>HashMap</code>. This dramatically improves the speed of
        logger retrieval and incidentally fixes <a
        href="http://jira.qos.ch/browse/LOGBACK-142">LOGBACK-142</a>.
        </p>
    
        <p>In <code>SyslogAppender</code> allow <a
        href="manual/appenders.html#syslogSuffixPattern">suffixPattern</a>
        to begin with literal text. This issue was reported Bruno Polaco
        in <a href="http://jira.qos.ch/browse/LOGBACK-782">LOGBACK-782</a>
        who also provided the relevant patch.
        </p>
        
        <p>In order to reduce unnecessary boilerplate several common types
        and packages are now <a
        href="manual/groovy.html#AutomaticImports">imported
        automatically</a>. This feature was contributed by Joris
        Kuipers.</p>
    
        <p>Computation of caller information now takes into account Groovy
        frames (if nunning under Groovy). This fixes <a
        href="http://jira.qos.ch/browse/LOGBACK-811">LOGBACK-811</a>.</p>
    
      
      
        <hr width="80%" align="center" />
    
        <h3>December 5th, 2012 - Release of version 1.0.9</h3>
    
        <p>Removed an erroneous compile-time dependency on Tomcat in the
        logback-classic module. This issue was reported by Arnaud
        Heritier.</p>
    
        <hr width="80%" align="center" />
    
        <h3>December 4th, 2012 - Release of version 1.0.8</h3>
    
        <div class="breaking">
          <h4>logback-classic updated to use SLF4J version 1.7.2 instead
          of version 1.6.6.</h4>
          <p>The logback-classic module now uses SLF4J version 1.7.2
          instead of version 1.6.6. This only impacts projects running
          under an OSGi platform as SLF4J versions 1.7.x and 1.6.x are
          100% binary compatible.</p>
        </div>
    
        <p>Fixed incorrect <code>BufferStream</code> assignment after
        recovery in <code>ResilientFileOutputStream</code>. This issue was
        reported in <a
        href="http://jira.qos.ch/browse/LOGBACK-765">LOGBACK-765</a> by
        David Markwick.
        </p>
    
        <p>Fixed incorrect parsing of variables in case of colon character
        followed by a dollar character. This issue was reported in <a
        href="http://jira.qos.ch/browse/LOGBACK-744">LOGBACK-744</a>.</p>
    
        <p><code>SyslogAppender</code> now sends out the header line of
        stack traces. This issue was reported <a
        href="http://jira.qos.ch/browse/LOGBACK-411">LOGBACK-411</a> and
        separately as <a
        href="http://jira.qos.ch/browse/LOGBACK-750">LOGBACK-750</a>.</p>
    
        <p>A <code>StatusListener</code> implementing
        <code>LifeCycle</code> interface was not started if specified via
        the <code>logback.statusListenerClass</code> system property. This
        issue was reported in <a
        href="http://jira.qos.ch/browse/LOGBACK-767">LOGBACK-767</a> by
        Adam Sokowicz.
        </p>
    
        <p>In order to avoid duplication, automatic status printing will
        be disabled if the user explicitly registers a status
        listerner.</p>
    
        <p>Added <code>OnErrorConsoleStatusListener</code> to print status
        messages on the error console, i.e. on System.err. This feature
        was requested in <a
        href="http://jira.qos.ch/browse/LOGBACK-292">LOGBACK-292</a> by
        Abraham Lin. </p>
    
        <p>Added <code>NopStatusListener</code> class which simply drops
        incoming status messages. By <a
        href="manual/configuration.html#logback.statusLC">explicitly
        registering</a> a <code>NopStatusListener</code> listener,
        automatic status printing can be turned off.
        </p>
    
    
        <hr width="80%" align="center" />
    
        <h3>24th of August, 2012 - Release of version 1.0.7</h3>
    
        <div class="breaking">
          <h4>Janino library upgraded to version 2.6.1.</h4>
    
          <p>As of Janino version 2.6.0, in addition to
          <em>janino.jar</em>, <em>commons-compiler.jar</em> needs to be
          on the class path as well. Please see the <a
          href="setup.html#janino">Janino setup</a> instructions.</p>
        </div>
        
        <p>
        </p>
    
        <div class="breaking">
          <h4>Groovy dependency upgraded to version 2.0.0.</h4>
    
          <p>Please see the <a href="setup.html#groovy">Groovy setup</a>
          instructions.</p>
        </div>
    
        <p>The code handling variable substitution has been completely
        re-written. As requested in <a
        href="http://jira.qos.ch/browse/LOGBACK-729">LOGBACK-729</a>,
        variables can be now be nested arbitrarily, even within the
        default value section. For example,
        <code>${a${b:-c}:-${d:-e}}</code> is now a valid logback variable
        expression yielding "e", assuming variables with the keys 'd', 'b'
        and 'ac' are undefined. The new variable substitution code is
        designed to be backward compatible with existing configuration
        files.
        </p>
        
    
        <p>Substitution properties are now correctly recognized by <span
        class="attr">scan</span> and <span class="attr">scanPeriod</span>
        attributes of <code>&lt;configuration></code> element in
        configuration files. This fixes <a
        href="http://jira.qos.ch/browse/LOGBACK-396">LOGBACK-396</a>
        reported by Oh Chin Boon</p>
    
        <p>The color-related conversion words now set the default color
        correctly. Xu Huisheng provided the relavant patch.
        </p>
        
        <p>Fixed a race-condition in <code>AsyncAppender</code> and its
        worker thread. This issue was reported in <a
        href="http://jira.qos.ch/browse/LOGBACK-720">LOGBACK-720</a> by
        Arnd Hannemann who also supplied the relevant patch.</p>
    
    
        <p>If a <code>PropertyDefiner</code> implements
        <code>LifeCycle</code>, then its <code>start()</code> method will
        now be invoked.</p>
    
        <p>Added the <span class="prop">includeCallerData</span> property
        in <code><a
        href="manual/appenders.html#smtpIncludeCallerData">SMTPAppender</a></code>
        to precompute caller data before storing events for future
        transmission. This property adresses <a
        href="http://jira.qos.ch/browse/LOGBACK-734">LOGBACK-734</a>
        reported by Patrick Hogarty.
        </p>
        
        <hr width="80%" align="center" />
    
        <h3>7th of June, 2012 - Release of version 1.0.6</h3>
    
        <p><a
        href="manual/appenders.html#SMTPAppender"><code>SMTPAppender</code></a>
        now supports the retreival of a <code>javax.mail.Session</code>
        resource from JNDI. This feature was requested in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-332">LBCLASSIC-332</a>
        by Hrotko Gabor.</p>
    
        <p>Listeners passed to <code>statusListener()</code> method in
        <code>GafferConfigurator</code> (the groovy configurator) are now
        correctly started.</p>
    
        <hr width="80%" align="center" />
    
        <h3>6th of June, 2012 - Release of version 1.0.5</h3>
    
        <p><a
        href="manual/appenders.html#ConsoleAppender"><code>ConsoleAppender</code></a>
        can now activate the <a href="http://jansi.fusesource.org">Jansi
        library</a> for ANSI color code support on Windows
        systems. Unix-based operating systems such as Linux and Mac OS X
        already support ANSI color codes by default.</p>
    
     
        <p><code>PatternLayout</code> now supports <a
        href="manual/layouts.html#coloring">composite conversion
        specifiers for coloring</a>.</p>
    
        <hr width="80%" align="center" />
    
        <h3>31st of May, 2012 - Release of version 1.0.4</h3>
    
        <p>Added <code>AsyncAppender</code> for asyncronous invocation of
        nested appenders. This was a long standing and popular request as
        attested by <a
        href="http://jira.qos.ch/browse/LBCLASSIC-177">LBCLASSIC-177</a>,
        <a href="http://jira.qos.ch/browse/LBCORE-92">LBCORE-92</a> and <a
        href="http://jira.qos.ch/browse/LBCLASSIC-242">LBCLASSIC-242</a>.</p>
    
        <p><code>SMTPAppender</code> now admits the <span
        class="prop">asynchronousSending</span> property, set to 'true' by
        default. However, it can be set to 'false' for syncronous email
        transmisison. This property was requested in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-323">LBCLASSIC-323</a>
        by Patrick Houk.</p>
    
        <p>It is now possible to set a system property called <a
        href="manual/configuration.html#automaticStatusPrinting">"logback.debug"</a>
        in order to force printing of internal status messages on the
        console regardless of the value of the <span
        class="attr">debug</span> attribute found within the
        <code>&lt;configuration></code> element. This behavior was
        requested in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-225">LBCLASSIC-225</a>
        by Aaron Digulla with the relevant patch kindly provided by Antony
        Stubbs.
        </p>
    
        <p><code>MarkerFilter</code> now correctly recognizes nested
        markers. This issue was reported in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-295">LBCLASSIC-295</a>
        by Paolo Mazzoncini who also provided the relevant patch.</p>
    
        <p>Fixed invalid multiple configuration warning when deployed
        under Weblogic. This issue was reported in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-159">LBCLASSIC-159</a>
        by Hontv&aacute;ri J&oacute;zsef and with the appropriate patch
        provided by Derek Mahar.
        </p>
    
        <p><a
        href="manual/appenders.html#SyslogAppender"><code>SyslogAppender</code></a>
        now admits the <span class="prop">throwableExcluded</span>
        property allowing the exclusion of throwable data if so
        desired. This solves <a
        href="http://jira.qos.ch/browse/LBCLASSIC-327">LBCLASSIC-327</a>
        reported by Don Faulkner.
        </p>
    
        <p><a
        href="manual/appenders.html#SyslogAppender"><code>SyslogAppender</code></a>
        now admits the <span class="prop">stackTracePattern</span>
        property allowing the customization of the string appearing just
        before each stack trace line.  This fixes <a
        href="http://jira.qos.ch/browse/LBCLASSIC-333">LBCLASSIC-333</a>
        reported by Ingebrigt Berg who also provided the relavant patch.
        </p>
    
        <p><code>DBAppender</code> now supports SQLite. This feature was
        requested in <a
        href="http://jira.qos.ch/browse/LBGENERAL-53">LBGENERAL-53</a> by
        Tony Trinh who also provided the relevant patch.</p>
       
    
        <h3>4th of May, 2012 - Release of version 1.0.3</h3>
    
        <p><code>PatternLayoutEncoder</code> class now admits the <span
        class="prop"><a
        href="manual/encoders.html#LayoutWrappingEncoder">immediateFlush</a></span>
        property (set to true by default). By setting this property to
        'false', logging throughput can be quintupled, although your
        mileage may vary. This enhancement was requested in <a
        href="http://jira.qos.ch/browse/LBCORE-243">LBCORE-243</a>.
        </p>
    
        <p>In order to facilitate parsing of log files, logback can now <a
        href="manual/encoders.html#outputPatternAsHeader">output the
        pattern</a> used for the log output at the top of log files as a
        header. This feature was requested by James Strachan in <a
        href="http://jira.qos.ch/browse/LBCORE-234">LBCORE-234</a>.
        </p>
    
        <p><code>SMTPAppender</code> failed to transmit messages under JDK
        1.5. After some investigation, Dave dicovered that this was due to
        setting the <code>corePoolSize</code> parameter of the relavant
        <code>ThreadPoolExecutor</code> to 0. Setting
        <code>corePoolSize</code> to a higher value, e.g. 1, under JDK 1.5
        solves the problem and fixes <a
        href="http://jira.qos.ch/browse/LBCLASSIC-323">LBCLASSIC-323</a>
        reported by Lutz Huehnken.
        </p>
    
        <p><code>LevelChangePropagator</code> now retains references to
        j.u.l. loggers whose level it sets. This fixes garbage collection
        issues reported in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-256">LBCLASSIC-256</a>
        by Samuel Stanojevic who also provided the appropriate patch.
        </p>
        
    
        <h3>26th of April, 2012 - Release of version 1.0.2</h3>
    
        <div class="breaking">
    
        <h4><span class="label">Breaking change partially reverted in
        1.0.3</span><br/>By default <code>PatternLayout</code> will now output
        its pattern at the top of log files</h4>
    
        <p>This feature, although still available, is no longer enabled by
        default. See release notes for version 1.0.3 for details.
        </p>
    
    
        </div>
        
        <p><code>ReconfigureOnChangeFilter</code> will avoid excessive
        syncronization in case of CPU intensive applications. This fixes
        <a
        href="http://jira.qos.ch/browse/LBCLASSIC-234">LBCLASSIC-234</a>,
        a recalcitrant bug reported by Uri Unger who also provided the key
        steps for reproducing it.
        </p>
    
        <p><code>RollingFileAppender</code> now creates missing
        directories for compressed archive files. This fixes <a
        href="http://jira.qos.ch/browse/LBCORE-169">LBCORE-169</a>
        reported by Tomasz Nurkiewicz with patches supplied by Paulo
        Andrade and Mats Henrikson.
        </p>
    
        <p><code>SizeAndTimeBasedFNATP</code> will now remove files with
        indexes higher than 99. It will also correctly compute the highest
        index value when an application is restarted. This fixes bug <a
        href="http://jira.qos.ch/browse/LBCORE-221">LBCORE-221</a>
        reported by Dieter Mueller and Dawid Chodura.</p>
      
    
        <hr width="80%" align="center" />
    
        <h3>7th of March, 2012 - Release of version 1.0.1</h3>
    
        <p>Setting the debug attribute to true in the
        <code>&lt;configuration></code> element now registers a
        <code>OnConsoleStatusListener</code> with the
        <code>StatusManager</code>.  Thus, problems occurring during the
        lifetime of your application, well after logback is initialized,
        can be reported when the <span class="attr">debug</span> attribute
        is set. This behavior is closer to what users expect.
        </p>
    
        <p>Added new property the <span
        class="prop">cleanHistoryOnStart</span> to <a
        href="manual/appenders.html#TimeBasedRollingPolicy">TimeBasedRollingPolicy</a>.
        By setting this property to <code>true</code>, history removal
        will work as expected even in the case of short lived
        applications. This fixes <a
        href="http://jira.qos.ch/browse/LBCORE-226">LBCORE-226</a>
        reported by Bruce E. Irving.
        </p>
    
        <p>It is now possible to specify multiple %d tokens in the file
        name pattern of <a
        href="manual/appenders.html#TimeBasedRollingPolicy">TimeBasedRollingPolicy</a>. Auxiliary
        %d tokens must be marked as such by passing the AUX
        paramater. This feature was requested in <a
        href="http://jira.qos.ch/browse/LBCORE-242">LBCORE-242</a> by
        Thomas Corte.</p>
    
        <p>Logback now supports suppressed exceptions introduced in Java
        7. This fixes <a
        href="http://jira.qos.ch/browse/LBCLASSIC-276">LBCLASSIC-276</a>.
        </p>
    
        <p><code>SMTPAppender</code> clears the relevant cyclic buffer
        before asynchronous transmission. This corrects <a
        href="http://jira.qos.ch/browse/LBCLASSIC-221">LBCLASSIC-221</a>
        as reported by Chris Cheshire.
        </p>
    
        <p><code>SiftingAppender</code> will consider stale and
        consequently remove nested appenders which are closed or
        improperly started. This caters for the use case described in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-316">LBCLASSIC-316</a>
        by Guus Bloemsma.</p>
    
        <p><code>RequestLogImpl</code> can now lookup for the
        logback-access configuration file as a class path resource. This
        feature was requested in <a
        href="http://jira.qos.ch/browse/LBACCESS-26">LBACCESS-26</a> by
        Marshall Pierce.
        </p>
    
        <p>Updated the Janino dependency to version 2.5.16. In addition,
        the code checking for the availability of Janino on the class path
        was updated to take Janino 2.6 into account, thus fixing <a
        href="http://jira.qos.ch/browse/LBCORE-210">LBCORE-210</a>.
        </p>
    
    
        <hr width="80%" align="center" />
    
        <h3>1st of November, 2011 - Release of version 1.0.0</h3>
    
        <p>The logback-access module now targets Tomcat 7.x and Jetty 7.x
        &amp; 8.x as its servlet container platforms. This fixes <a
        href="http://jira.qos.ch/browse/LBACCESS-17">LBACCESS-17</a>
        reported by Grzegorz Grzybek.</p>
    
        <div class="breaking">
    
        <h4>Breaking change: properties are no longer automatically
        inserted into the context</h4>
        
        <p>Properties now have a scope. Previously, the definition of a
        property added it to the context. As of version 1.0, properties
        are local, i.e. transient by default. For further details, please
        refer to the <a
        href="manual/configuration.html#variableSubstitution">documentation
        on properties</a>.</p>
        </div>
    
        <p>Environment variables are now looked up during property
        substitution. This feature was requested in <a
        href="http://jira.qos.ch/browse/LBCORE-212">LBCORE-212</a> by
        Alexandre Garnier.
        </p>
    
        <p><code>SMTPAppender</code> now sends emails asynchronously.</p>
    
        <p>Investigation of <a
        href="http://jira.qos.ch/browse/LBCORE-224">LBCORE-224</a>
        reported by Cesar Alvarez Nunez points to bug in the JVM rather
        than in logback. A workaround has been found by using
        <code>CopyOnWriteArrayList</code> instead of the apparently buggy
        <code>ReadWriteLock</code>.</p>
    
        <p>In STARTTLS mode, "mail.smtp.auth" property is no longer set
        automatically. This fixes <a
        href="http://jira.qos.ch/browse/LBCORE-225">LBCORE-225</a>
        reported by Mark Woon.</p>
    
        <p>Logback-access now supports conditional configuration. This
        fixes <a
        href="http://jira.qos.ch/browse/LBACCESS-27">LBACCESS-27</a>
        reported by Marshall Pierce.</p>
    
        <p>Logback-access now supports inclusion of configuration
        files. See the <a
        href="manual/configuration.html#fileInclusion">chapter about
        configuration</a> in the logback's online manual for more
        information. </p>
    
        <p>Added <code>ch.qos.logback.core.read</code> to "Import-Package"
        declaration in logback-classic's manifest file. This fixes <a
        href="http://jira.qos.ch/browse/LBCLASSIC-131">LBCLASSIC-131</a>
        reported by Michal Prihoda and Thomas Jaeckle.</p>
    
        <p>Fixed infinitely recursive calls in
        <code>AccessConverter#addError</code> methods as reported in <a
        href="http://jira.qos.ch/browse/LBACCESS-25">LBACCESS-25</a> by
        Pierre Queinnec.
        </p>
    
        <p>Fixed incorrect switch fallthrough while selecting between the
        H2 and HSQL dialects as reported in <a
        href="http://jira.qos.ch/browse/LBCORE-218">LBCORE-218</a> by
        Pierre Queinnec.
        </p>
    
        <h3>September 21st, 2011 - Release of version 0.9.30</h3>
    
        <p>Archive removal can now deal with prolonged periods of
        application inactivity and application stop and restarts. The
        issue is described in <a
        href="http://jira.qos.ch/browse/LBCORE-147">LBCORE-147</a>
        reported by Rafael Diaz Maurin.
        </p>
    
        <p>Logback-classic now supports printing stack traces "root cause
        first" instead of the standard "root cause last". See the
        documentaiton for <a
        href="manual/layouts.html#rootException">%rootException</a>
        converter for further details. The <code>%rootException</code>
        converter was contributed by Tomasz Nurkiewicz in relation with <a
        href="http://jira.qos.ch/browse/LBCLASSIC-217">LBCLASSIC-217</a>.
        </p>
    
        <p>In the <code>ILoggingEvent</code> interface the
        <code>getMDC</code> method is now deprecated and replaced by
        <code>getMDCPropertyMap</code>. The latter method was already part
        of the <code>ILoggingEvent</code> interface in prior versions of
        logback-classic. Furthermore, the value returned by
        <code>ILoggingEvent.getMDCPropertyMap</code> can now be an empty
        map but never null.</p>
       
    
        <p><code>LoggingEvent</code> no longer assumes that
        <code>LogbackMDCAdapter</code> is the only possible implementation
        of the <code>MDCAdapter</code> interface. This fixes <a
        href="http://jira.qos.ch/browse/LBCLASSIC-275">LBCLASSIC-275</a>
        reported by Chris Dolan.
        </p>
    
        <p><code>LogbackMDCAdapter</code> now synchronizes over its thread
        local map. This prevents
        <code>ConcurrentModificationException</code> from occuring while a
        child thread copies the map from the parent. This fixes <a
        href="http://jira.qos.ch/browse/LBCLASSIC-289">LBCLASSIC-289</a>
        reported by Josh Oddman.</p>
    
        <p>It is now possible to specify multiple destination addresses
        separated by commas in the the <span class="prop">to</span>
        property of <code>SMTPAppender</code>. This fixes <a
        href="http://jira.qos.ch/browse/LBCORE-213">LBCORE-213</a>
        reported by Alexandre Garnier who also provided the relevant
        patch. In previous versions of logback multiple destination
        addresses could only be specified by using multiple <span
        class="prop">to</span> properties. As of version 0.9.30 both
        comma separated addresses and multiple <span
        class="prop">to</span> properties are supported.
        </p>
    
        <p>When debug attribute is set to true within the
        <code>&lt;configuration></code> element, status messages are
        printed on the console after Joran (re)configures
        logback. Previously, all status messages were printed. With this
        release, only status messages created during (re)configuration are
        printed. This change fixes <a
        href="http://jira.qos.ch/browse/LBCLASSIC-273">LBCLASSIC-273</a>
        reported by Joern Huxhorn.
        </p>
    
        <p>Single quotes within a date conversion specifier in filename
        patterns are now handled correctly. This fixes <a
        href="http://jira.qos.ch/browse/LBCORE-214">LBCORE-214</a>
        reported by Derek Libby.
        </p>
    
        <hr width="80%" align="center" />
    
        <h3>June 9th, 2011 - Release of version 0.9.29</h3>
    
        <p>Fixed <a
        href="http://jira.qos.ch/browse/LBCLASSIC-254">LBCLASSIC-254</a>,
        a performance issue in <code>LogbackMDCAdapter</code> as reported
        by Michael Franz.</p>
    
        <p>Given that events reference a snapshot of the current MDC map,
        the snapshot should not be cleared upon invocation of the
        MDC.clear operation. This issue was reported in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-253">LBCLASSIC-253</a>
        by Tommy Becker and independently fixed by the changes designated
        to fix LBCLASSIC-254.</p>
    
        <p>As reported by Deepak Vadgama in <a
        href="http://jira.qos.ch/browse/LBCORE-199">LBCORE-199</a>, the
        entry in every zip file created by
        <code>FixedWindowRollingPolicy</code> had the same name. The issue
        was solved by adding a timestamp to the name of the entry in the
        zip files as suggested by a Benoit Xhenseval.</p> 
    
        <p><code>ConfigurationWatchList</code> no longer emits an error
        message when it encounters a configuration file placed in a jar
        file, fixing <a
        href="http://jira.qos.ch/browse/LBCLASSIC-246">LBCLASSIC-246</a>
        as reported by Joern Huxhorn. This release also fixes <a
        href="http://jira.qos.ch/browse/LBCLASSIC-247">LBCLASSIC-247</a>
        reported by Michael Franz.
        </p>
    
    
        <p>Logback now emits a clearer error message in case a conversion
        pattern misses a closing parenthesis or if an opening
        parenthesis is misplaced. This fixes <a
        href="http://jira.qos.ch/browse/LBCORE-193">LBCORE-193</a>
        reported by B. K. Oxley.</p>
    
        <p>Fixed thread safety issue in LRUMessageCache reported in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-255">LBCLASSIC-255</a>
        by C&eacute;sar &Aacute;lvarez N&uacute;&ntilde;ez.
        </p>
    
        <p>The AccessEvent class in logback-access module now implements
        the <code>IAccessEvent</code> interface. This fixes <a
        href="http://jira.qos.ch/browse/LBACCESS-12">LBACCESS-12</a>
        reported by Joern Huxhorn.</p>
        
        <hr width="80%" align="center" />
    
        <h3>January 25th, 2011 - Release of version 0.9.28</h3>
    
        <div class="breaking">
     
          <h4>Breaking change: In the Context interface, the previously
          misspelled property <code>bithTime</code> is now renamed as
          <code>birthTime</code>.</h4>
          
          <p>In the <a
          href="apidocs/ch/qos/logback/core/Context.html">Context</a>
          interface, the previously misspelled property
          <code>bithTime</code> is now renamed as
          <code>birthTime</code>. This is a backward-incompatible
          change. All pre-existing references to "bithTime" property now
          need to referenced as "birthTime".</p>
        </div>
    
        <p>Fixed <a href="http://jira.qos.ch/browse/LBCLASSIC-238">issue
        238</a> reported by Robert Elliot. <code>GEventEvaluator</code>'s
        start method now correctly sets the state of the instance.
        </p>
    
        <p><code>JaninoEventEvaluator</code> now expects Java blocks
        instead of boolean expressions. For even moderately complex
        logical statements, blocks can be more convenient to read or to
        write compared with boolean expressions. To ensure backward
        compatibility, existing boolean expressions are converted into
        blocks on the fly.
        </p>
    
        <p>Corrected handling of null valued arguments by DBAppender. This
        fixes <a
        href="http://jira.qos.ch/browse/LBCLASSIC-239">LBCLASSIC-239</a>
        reported by Artyom Kalita.</p>
    
        <p>It is now possible to use the context birth time as the time
        reference for the <a
        href="manual/appenders.html#uniquelyNamed"><code>&lt;timestamp></code></a>
        element in configuration files.</p>
    
        <p>Logback can now scan for included files as well. This solves <a
        href="http://jira.qos.ch/browse/LBCLASSIC-245">LBCLASSIC-245</a>.
        </p>
    
        <hr width="80%" align="center" />
    
        <h3>December 22nd, 2010 - Release of version 0.9.27</h3>
    
        <p>Added a new section in the documentation about <a
        href="recipes/index.html">real-world inspired recipes</a>.</p>
    
        <p><code>PatternLayout</code> now supports compound conversion
        words of which <a
        href="manual/layouts.html#replace">"%replace"</a> is one
        example. This change involved a significant re-write of the
        pattern tokenizer, the pattern parser and the pattern
        compiler. However, the changes should be backward compatible as far
        as users are concerned.
        </p>
    
        <p>The <a href="manual/appenders.html#smtpTo"><span
        class="prop">to</span></a> option of SMTPAppender now admits a
        pattern and is evaluated dynamically.</p>
    
        <p><code>TeeServletInputStream</code> no longer chokes on input
        over 8K in size. This fixes <a
        href="http://jira.qos.ch/browse/LBACCESS-10">LBACCESS-10</a> as
        reported by Augusto Rodriguez.
        </p>
    
        <p><code>TeeFilter</code> now takes include and exclude parameters
        so that it can be enabled or disabled by host. This solves <a
        href="http://jira.qos.ch/browse/LBACCESS-15">LBACCESS-15</a>.</p>
    
        <p>Fixed <a
        href="http://jira.qos.ch/browse/LBCLASSIC-231">LBCLASSIC-231</a>
        as reported by Jeff Skjonsby. When configuring
        <code>SizeAndTimeBasedFNATP</code>,
        <code>GaggerConfigurator</code> (Groovy) will no longer throw a
        <code>NullPointerException</code>.
        </p>
    
        <p>Every context now returns its own name when asked for the
        property <code>CONTEXT_NAME</code>. This fixes <a
        href="http://jira.qos.ch/browse/LBCORE-178">LBCORE-178</a> as
        requested by Michael Osipov.
        </p>
    
    
        <h3>20th of October, 2010 - Release of version 0.9.26</h3>
    
    
        <p>Fixed <a
        href="http://jira.qos.ch/browse/LBCLASSIC-183">LBCLASSIC-183</a>
        as reported by Anthony Whitford. Upon application restart, Tomcat
        should no longer complain about ThreadLocal variables created
        internally by logback.
        </p>
    
        <p><code>SMPTAppender</code> now lets users to set a custom buffer
        size for the outgoing messages. This fixes <a
        href="http://jira.qos.ch/browse/LBCORE-170">LBCORE-170</a> as
        requested by Peter Royal.
        </p>
    
        <p>When stopped, <code>RollingFileAppender</code> now calls
        <code>stop()</code> on its policy objects, fixing <a
        href="http://jira.qos.ch/browse/LBCORE-114">LBCORE-114</a>
        reported by Anders Wallgren.</p>
    
        <p>Added mapping for OFF and ALL levels in <code>JULHelper</code>
        as requested in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-226">LBCLASSIC-226</a>
        by Christian Brensing.
        </p>
    
        <h3>October 13th, 2010 - Release of version 0.9.25</h3>
    
        <p>Logback-classic now supports <a
        href="manual/configuration.html#LevelChangePropagator">propagation
        of level changes from logback-classic onto the
        j.u.l. framework</a>. This significantly reduces the performance
        impact of disabled log statements making it reasonable for
        real-world applications to use the <a
        href="http://slf4j.org/legacy.html#jul-to-slf4j">jul-to-slf4j
        bridge</a>.
        </p>
    
        <p>The <code>&lt;appender-ref></code> element now supports
        <a href="manual/configuration.html#variableSubstitution">variable substitution</a>, thus fixing <a
        href="http://jira.qos.ch/browse/LBCLASSIC-224">LBCLASSIC-224</a>
        as reported by David Harrigan.
        </p>
    
        <p>As reported in <a
        href="http://jira.qos.ch/browse/LBCORE-164">LBCORE-164</a>,
        <code>SizeAndTimeBasedFNATP</code> would cause previous logging
        files with indexes over nine to be overwritten on application
        restart. This complex bug was reported and precisely diagnosed by
        Dieter Mueller. He has also proposed a fix which was subsequently
        adopted as is.</p>
    
        <hr width="80%" align="center" />
    
        <h3>June 30th, 2010 - Release of version 0.9.24</h3>
    
        <p>Fixed NullPointerException thrown by
        <code>MDCBasedDiscriminator</code> in case the MDC map is
        null.</p>
    
        <p>Fixed issue with <code>SizeAndTimeBasedFNATP</code> in presence
        of application stop/restart and non-null file property. This issue
        was reported by Tom Liu in <a
        href="http://jira.qos.ch/browse/LBCORE-131">LBCORE-131</a>.</p>
    
        <hr width="80%" align="center" />
    
        <h3>June 29th, 2010 - Release of version 0.9.23</h3>
    
        <p>Fixed Groovy runtime dependency problem with
        ReconfigureOnChangeFilter, i.e. the auto-scan filter, when using
        non-groovy configuration files. This problem was reported in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-214">LBCLASSIC-214</a>
        by Alvin Chee.</p>
    
        <p>Fixed <code>MDCBasedDiscriminator</code> so that it supports deferred
        processing. This issue was reported in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-213">LBCLASSIC-213</a>
        by Torsten Juergeleit.</p>
    
        <hr width="80%" align="center" />
    
        <h3>June 21st, 2010 - Release of version 0.9.22</h3>
    
        <p>Logback now supports <a href="manual/groovy.html">configuration
        files written in Groovy</a> which are more convenient than
        configuration files written in XML. We have also developed a tool
        to <a
        href="http://logback.qos.ch/translator/asGroovy.html">automatically
        migrate your logback.xml files to logback.groovy</a>.
        </p>
    
        <p>Inspired by the functionality offered by
        <code>SiftingAppender</code>, <code>SMTPApppender</code> now can
        <a href="manual/appenders.html#smtpDiscriminator">track multiple
        buffers according to selection information returned by a
        discriminator</a>.
        </p>
    
        <p>Fixed synchronization issue in <code>ConsoleAppender</code> as
        reported in <a
        href="http://jira.qos.ch/browse/LBCORE-158">LBCORE-158</a> by
        David Roussel who also supplied a corrective patch.</p>
    
    
        <hr width="80%" align="center" />
    
        <h3>May 8th, 2010 - Release of version 0.9.21</h3>
    
        <p>SLF4J dependency upgraded to 1.6.0</p>
    
        <p>Fixed concurrency problem in <code>SiftingAppender</code> as
        reported in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-203">LBCLASSIC-203</a>
        by Ellen Strnod.
        </p>
    
        <p>Added <a
        href="manual/filters.html#GEventEvaluator">GEventEvaluator</a>
        which processes boolean expression written in the Groovy language.
        </p>
    
        <p>Fixed rollover problem occurring when the target directory was
        missing as reported in <a
        href="http://jira.qos.ch/browse/LBCORE-151">LBCORE-151</a> by
        Torsten Juergeleit. A closely related problem was reported in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-167">LBCLASSIC-167</a>
        by Rick Janda.
        </p>
        
    
        <hr width="80%" align="center" />
    
        <h3>April 2nd, 2010 - Release of version 0.9.20</h3>
    
        <p>Fixed issue related to charsets in
        <code>LayoutWrappingEncoder</code> not being recognized in config
        files.</p>
    
        <p>Logback now supports <a
        href="manual/configuration.html#conditional">conditional
        processing</a> of configuration files.</p>
    
        <p>A new extension point for <a
        href="manual/configuration.html#definingPropsOnTheFly">defining
        properties on the fly</a> has been added. The code for this
        enhancement was provided by Aleksey Didik in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-182">LBCLASSIC-182</a>.</p>
        
        <p>Logback now provides <a
        href="http://logback.qos.ch/manual/loggingSeparation.html">an
        answer</a> to the longstanding logging separation problem for
        static logger references in shared libraries. This fixes <a
        href="http://jira.qos.ch/browse/LBCLASSIC-166">LBCLASSIC-166</a>
        and <a
        href="http://jira.qos.ch/browse/LBCLASSIC-87">LBCLASSIC-87</a>.
        </p>
     
        <p>Removed the previously deprecated <code>getFirstFilter</code>
        method in <code>FilterAttachable</code> interface.</p>
    
        <!-- ============================================================== -->
    
        <hr width="80%" align="center" />
    
        <h3>March 24, 2010 - Release of version 0.9.19</h3>
    
    
        <div class="breaking">
    
        <h4>Breaking change: FileAppender now expects an Encoder</h4>
    
        <p>In response to <a
        href="http://jira.qos.ch/browse/LBCORE-128">LBCORE-128</a>,
        <code>WriterAppender</code> has been renamed as
        <code>OutputStreamAppender</code>, <code>FileAppender</code> now
        sub-classing the latter. <code>OutputStreamAppender</code> and
        sub-classes now take an <code>Encoder</code> instead of a
        <code>Layout</code>. 
        </p>
    
        <p>Contrary to layouts which simply transform a logging event into
        a String, an encoder is responsible for writing the actual event
        or more accurately the representation of the event onto the output
        stream. The role of the enclosing appender is now limited to
        managing the output stream (opening/closing) but not writing
        actual contents onto the stream. This change will require <a
        href="codes.html#layoutInsteadOfEncoder"> modifications to
        existing configuration files</a>. We hope to make up for this
        inconvenience with cool new features which are only possible using
        encoders. <b>During a transition period, layouts passed as
        parameter will be automatically wrapped by an encoder so that
        configuration files in the old format (using a layout instead of
        encoder) will continue to work unmodified.</b>
        </p>
    
        </div>
    
        <br/>
    
        <div class="breaking">
    
    
          <h4>Breaking change: DBAppender in logback-classic expects four
          additional columns
          </h4>
          
          <p>Instead of lumping log request arguments into a field,
          <code>DBAppender</code> (in logback-classic) now outputs up to
          four arguments in the logging request in separate columns, named
          <code>arg0</code>, <code>arg1</code>, <code>arg2</code> and
          <code>arg4</code>. This solves <a
          href="http://jira.qos.ch/browse/LBCLASSIC-187">LBCLASSIC-187</a>
          reported by Greg Thomas.</p>
    
          <p>Existing databases can be migrated to the new table structure
          by altering the existing tables. Here is how it would be done
          in PostgreSQL and MySQL.</p>
    
          <pre class="prettyprint">ALTER TABLE logging_event ADD COLUMN arg0 VARCHAR(254);
    ALTER TABLE logging_event ADD COLUMN arg1 VARCHAR(254);
    ALTER TABLE logging_event ADD COLUMN arg2 VARCHAR(254);
    ALTER TABLE logging_event ADD COLUMN arg3 VARCHAR(254);</pre>
    
        <p>In Oracle:</p>
    
        <pre class="prettyprint">ALTER TABLE logging_event ADD arg0 VARCHAR(254);
    ALTER TABLE logging_event ADD arg1 VARCHAR(254);
    ALTER TABLE logging_event ADD arg2 VARCHAR(254);
    ALTER TABLE logging_event ADD arg3 VARCHAR(254);</pre>
    
          
        </div>
        <p><code>FileAppender</code> and derived classes can now
        gracefully deal with IO failures and recover quickly after the
        original cause of the IO failure is corrected. For example, if the
        log file is located on a <a
        href="http://en.wikipedia.org/wiki/Network-attached_storage">network-attached
        storage (NAS)</a>, and the connection to the NAS server is lost,
        <code>FileAppender</code> and derived classes will recover quickly
        after the connection to the server is re-established.
        </p>
    
        <p>The packages under <code>ch.qos.logback.classic</code>
        namespace no longer depend on <code>org.slf4j.impl</code>. This
        fixes <a
        href="http://jira.qos.ch/browse/LBCLASSIC-184">LBCLASSIC-184</a>
        reported by Gunnar Wagenknecht.
        </p>
    
        <p>Fixed <a
        href="http://jira.qos.ch/browse/LBCLASSIC-193">LBCLASSIC-193</a>.
        <code>SyslogAppender</code> will no longer shutdown when messages
        over 256Kb cause an <code>IOException</code>.
        </p>
    
        <p>Added <a
        href="manual/appenders.html#OnMarkerEvaluator">OnMarkerEvaluator</a>
        which evaluates to true in the presence of user-specified
        markers. When used with <code>SMTPAppender</code>, it can trigger
        an outgoing email message when an event matches user-specified
        marker.</p>
    
        <p>Request header names in AccessEvent (logback-access) are now
        stored in a case insensitive way as specified in RFC 2616.  This
        prevents compatibility issues, in particular with recent versions
        of Tomcat which store request header names in lower-case.</p>
    
    
        <p>Fixed <a
        href="http://jira.qos.ch/browse/LBCORE-134">LBCORE-134</a>
        reported by Michael Franz. While reading configuration files (in
        XML), the event handler will correctly process body text, in
        particular spaces, even when delivered in multiple chunks. The
        previous behavior of trimming leading and trailing white space has
        been preserved. Moreover, body text consisting of white space
        surrounding child elements is ignored.
        </p>
        
        <p><code>SiftingAppender</code> now exposes its
        <code>AppenderTracker</code>. Moreover, the
        <code>stopAndRemoveNow(String key)</code> method was added to
        <code>AppenderTracker</code>, allowing immediate removal of a
        nested appender.
        </p>
    
        <p>Fixed <a
        href="http://jira.qos.ch/browse/LBCORE-130">LBCORE-130</a>.
        <code>FileNamePattern</code> no longer treats parenthesis as
        special.
        </p>
    
        <p>The <span class="prop">CharsetEncoder</span> property in
        <code>SMTPAppender</code> can now be accessed and set from
        configuration files. This fixes <a
        href="http://jira.qos.ch/browse/LBCLASSIC-194">LBCLASSIC-194</a>.
        </p>
    
        <p>Instead of sending its output to the System.out/err reference
        that was effective at initialization, <code>ConsoleAppender</code>
        will now seek the most current System.out/err reference and send
        its output there. This fixes <a
        href="http://jira.qos.ch/browse/LBCORE-143">LBCORE-143</a> as
        reported by Tom SH Liu.
        </p>
    
        <p>DBAppender now outputs exception class and message. It will
        also output root causes, fixing
        <a href="http://jira.qos.ch/browse/LBCLASSIC-170">LBCLASSIC-170</a>
        reported by Tomasz Nurkiewicz.
        </p>
    
        <p>You can now override table and column names in DBAppender. This
        feature was requested in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-188">LBCLASSIC-188</a>
        reported by Tomasz Nurkiewicz.
        </p>
    
        <p>Fixed missing EVENT_ID column problem on PostgreSQL as reported
        in <a href="http://jira.qos.ch/browse/LBCORE-126">LBCORE-126</a>
        by Brian Edwards.</p>
    
        <p>Event id values in DBAppender are now 64bit instead of 32. This
        change was requested in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-198">LBCLASSIC-198</a>
        by Michael Lynch.
        </p>
    
        <p>Added Sybase SQLAnywhere support in DBAppender. This feature
        was requested by Michael Lynch in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-197">LBCLASSIC-197</a>.
        </p>
    
        <p>Added H2 support in DBAppender.</p>
    
    
        <p>Fixed <a
        href="http://jira.qos.ch/browse/LBSITE-36">LBSITE-36</a> reported
        by John Jimenez.</p>
    
        <hr width="80%" align="center" />
    
        <!-- ======================================================================== -->
    
        <h3>3rd of December 2009 - Release of version 0.9.18</h3>
    
        <p>After a very long investigation resulting in somewhat a better
        understanding of licensing issues, logback is now <a
        href="license.html">dual-licensed</a> under the EPL 1.0 and LGPL
        2.1.
        </p>
    
        <p>Due to a clerical error <a
        href="http://jira.qos.ch/browse/LBCORE-26">LBCORE-26</a> has
        re-raised its ugly head. It has now been tamed for good.</p>
    
        <p>Fixed Private-Package and Export-Package sections in
        logback-classic.jar MANIFEST as reported in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-165">LBCLASSIC-165</a>
        and <a
        href="http://jira.qos.ch/browse/LBCLASSIC-121">LBCLASSIC-121</a>
        by applying the relevant patches supplied by Hugues Malphettes.
        </p>
    
        <p>Made the OSGi import declarations for Janino and javax optional
        as proposed by David Varnes in <a
        href="http://jira.qos.ch/browse/LBCORE-101">LBCORE-101</a>.</p>
    
        <p><code>ReconfigureOnChangeFilter</code> did not pick up changes
        for configuration files containing spaces. This issue was reported
        in <a href="http://jira.qos.ch/browse/LBCORE-119">LBCORE-119</a>
        by Anders Wallgren.
        </p>
    
        <p>Added tests cases which run logback artifacts as bundles within
        Felix. This should solve a series of problems related to OSGi.</p>
    
        <p>When ill-formed configuration files fragments were included in
        another configuration file, the included file was not closed
        correctly. This issue was reported in <a
        href="http://jira.qos.ch/browse/LBCORE-122">LBCORE-122</a> by
        Michael Franz.
        </p>
    
        <p>JaninoEventEvaluator now passes the throwable associated with
        an event as a <code>java.lang.Throwable</code> instead of an
        <code>IThrowableProxy</code>. This fixes <a
        href="http://jira.qos.ch/browse/LBCLASSIC-155">LBCLASSIC-155</a>
        as reported by Hontv&aacute;ri J&oacute;zsef. See <a
        href="manual/filters.html#evalutatorFilter">EvaluatorFilter
        documentation</a> for more details.</p>
    
        <p>The name of the log file nested within .zip archives was
        incorrectly set to be that of the tmp file logback creates during
        compression. Anders Wallgren reported and posted an appropriate
        patch for this problem in <a
        href="http://jira.qos.ch/browse/LBCORE-98">LBCORE-98</a>.  The
        nested file is now named after the zip archive file. Analysis
        showed that this was an appropriate strategy in all the cases we
        considered.</p>
    
        <p>Fixed <a
        href="http://jira.qos.ch/browse/LBCLASSIC-149">LBCLASSIC-149</a>. The
        ContextNameConverter now correctly uses the context name of the
        event instead of its own context name.
        </p>
    
        <p>When a logger is named after an inner class, the '$' is used as
        a separator, instead of the usual '.'. This fixes the level
        inheritance issue described in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-102">LBCLASSIC-102</a>
        and as reported by Joern Huxhorn.</p>
    
        <p>Fixed deadlock issue observed with appender which invoke
        loggers as reported in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-154">LBCLASSIC-154</a>
        by Andrew Perrine and debugged by Ralph Goers who also proposed
        the relevant patch.</p>
    
        <hr width="80%" align="center" />
    
        <h3>9th of August 2009 - Release of version 0.9.17</h3>
    
        <p><code>PackagingDataCalculator</code> now correctly deals with
        <code>NoClassDefFoundError</code> thrown by class loaders. This
        fixes <a
        href="http://jira.qos.ch/browse/LBCLASSIC-125">LBCLASSIC-125</a>
        reported by Roland Klein and independently by Didier Besset.
        </p>
    
        <p>In configuration files, all tags names associated with explicit
        actions are now case-insensitive. This should diminish
        case-related errors users may make when writing configuration
        files. Tag names associated with implicit actions which are
        closely linked to the actual Java class being configured, still
        need to follow the camelCase convention. If you are unsure which
        case to use for a given tag name, just follow the camelCase
        convention for tag names which should be correct in most
        cases. </p>
    
        <p>It is now possible to create <a
        href="manual/appenders.html#uniquelyNamed">uniquely named files by
        timestamp</a>. Such files are appropriate for log files associated
        with batch applications. This enhancement fulfills <a
        href="http://jira.qos.ch/browse/LBCORE-91">LBCORE-91</a> as
        requested by Rick Beton and Szel Zoltan.
        </p>
    
        <p>Append mode is now mandatory in
        <code>RollingFileAppender</code>. This was already the default and
        truncation mode is unreasonable in most cases. For example, in
        truncate mode when an application stops and is quickly re-started,
        any pre-existing log file for the current period will be lost.</p>
    
        <p>The <code>activeFile</code> field in
        <code>RollingFileAppender</code> is now properly updated, fixing
        <a href="http://jira.qos.ch/browse/LBCORE-90">LBCORE-90</a> as
        reported by Valery Shorin.</p>
    
    
        <p>The <code>TimeBasedTriggeringPolicy</code> has been heavily
        refactored. It is now possible to trigger rolling simultaneously
        by <a href="manual/appenders.html#SizeAndTimeBasedFNATP">time and
        by size</a>, fixing <a
        href="http://jira.qos.ch/browse/LBCORE-61">LBCORE-61</a>.
        </p>
    
        <p>Fixed <a
        href="http://jira.qos.ch/browse/LBCLASSIC-145">LBCLASSIC-145</a>
        reported by Joern Huxhorn. The <code>LoggingEventVO</code> class
        now correctly populates its callerData field if the original
        <code>ILoggingEvent</code> already has it.</p>
    
        <hr width="80%" align="center" />
    
        <h3>15th of July 2009 - Release of version 0.9.16</h3>
    
        <p>In addition to nifty new features, this release contains
        several important internal changes. Given the importance of some
        of those internal changes, <em>this release may be less stable
        than previous logback releases</em>.</p>
    
        <p>In logback-classic, <a
        href="xref/ch/qos/logback/classic/spi/LoggingEvent.html"><code>LoggingEvent</code></a>
        now implements the <a
        href="xref/ch/qos/logback/classic/spi/ILoggingEvent.html"><code>ILoggingEvent</code></a>
        interface. All logback-classic components expect to process
        <code>ILoggingEvent</code> instances. Moreover, events which sent
        to a remote host are now of type <a
        href="xref/ch/qos/logback/classic/spi/LoggingEventVO.html"><code>LoggingEventVO</code></a>.
        </p>
    
        <p>Logback-classic will now <a
        href="manual/configuration.html#autoScan">automatically
        re-configure itself</a> when its configuration file is
        modified. This enhancement was requested in <a
        href="http://jira.qos.ch/browse/LBCORE-59">LBCORE-59</a> by
        Michael Osipov.</p>
    
        <p>FileAppender and its derived class RolllingFileAppender are now
        based on a finer-grain synchronization model. This change is aimed
        at reducing various synchronization related bugs, namely <a
        href="http://jira.qos.ch/browse/LBCLASSIC-135">LBCLASSIC-135</a>
        and its various sub-tasks.
        </p>
    
        <p>Fixed a bug in the localLevelReset() method in the
        <code>Logger</code> class which inadvertently used the DEBUG_INT
        value in the org.slf4j.spi.LocationAwareLogger interface instead
        of the DEBUG_INT value in ch.qos.logback.classic.Level class. The
        issue was first identified by Andy Ruch <a
        href="http://qos.ch/pipermail/logback-user/2009-February/000955.html">in
        a message</a> to the logback-user list
        </p>
    
        <p>If the logger name had 12 or more segments, a the logger
        conversion specified would throw an
        <code>ArrayIndexOfBounds</code> exception. Lukas Zapletal has
        kindly reported this problem in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-110">LBCLASSIC-110</a>
        and provided a test case.
        </p>
    
        <p>A new discriminator class called "ContextBasedDiscriminator"
        allows SiftingAppender to separate logging based on the context
        name. This fits nicely with the requirements expressed in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-117">LBCLASSIC-117</a>
        by Rick Janda.
        </p>
        
        <p>When a context is reset, then its object and property maps are
        now cleared. This fixes <a
        href="http://jira.qos.ch/browse/LBCORE-104">LBCORE-104</a>
        reported by Johan Bos.
        </p>
    
        <p>Fixed <a
        href="http://jira.qos.ch/browse/LBCORE-105">LBCORE-105</a>. Configuration
        files placed in jar files will no longer lock the jar file. This
        issue was initially reported for log4j in <a
        href="https://issues.apache.org/bugzilla/show_bug.cgi?id=47465">bug
        47465</a> Mark Thomas.
        </p>
    
        <p>Fixed <a
        href="http://jira.qos.ch/browse/LBCORE-94">LBCORE-94</a>. While
        configuring a RollingFileAppender, if the File property is
        declared after any rolling or triggering policies, then logback will
        now generate an error status message.
        </p>
    
        <p>Fixed <a
        href="http://jira.qos.ch/browse/LBCLASSIC-134">LBCLASSIC-134</a>
        reported by Darryl Smith. <code>DuplicateMessageFilter</code> will
        now behave correctly when invoked via
        <code>Logger.isXXXEnabled</code> methods.
        </p>
    
        <p>Fixed <a
        href="http://jira.qos.ch/browse/LBCORE-107">LBCORE-107</a>,
        incorrectly set context information for the
        <code>NestedBasicPropertyIA</code> instance in Joran, reported by 
        L&oacute;r&aacute;nt Pint&eacute;r.
        </p>
    
        <p>Fixed <a
        href="http://jira.qos.ch/browse/LBCLASSIC-109">LBCLASSIC-109</a>,
        reported by Andrew Ruch when a logger context was reset, the trace
        level was erroneously enabled.
        </p>
    
        <hr width="80%" align="center" />
    
        <h3>12th of February 2009 - Release of version 0.9.15</h3>
    
        <p>When the reset() method in <code>LoggerContext</code> is
        called, registered turbo filters are first stopped before being
        unregistered. This fixes <a
        href="http://jira.qos.ch/browse/LBCLASSIC-89">LBCLASSIC-89</a>
        reported by Alexis Morillo.
        </p>
    
        <p>Added a servlet for viewing internal status messages as an HTML
        table. Two separate implementations are available; one for <a
        href="manual/configuration.html#viewingStatusMessages">logback-classic</a>
        and the other for <a
        href="access.html#viewingStatusMessages">logback-access</a>.</p>
    
        <p>Added the <code>clear()</code> method to the
        <code>StatusManager</code> interface. After reconfiguration, it
        may be desirable to clear the status list maintained by a
        <code>StatusManager</code>. This change was requested by Alexis
        Morillo in <a
        href="http://jira.qos.ch/browse/LBCORE-77">LBCORE-77</a>.
        </p>
    
        <p>Fixed problem <a
        href="http://jira.qos.ch/browse/LBCLASSIC-104">LBCLASSIC-104</a>
        related to loss of MDC information in deferred logging events.
        </p>
    
        <p>Fixed issue <a
        href="http://jira.qos.ch/browse/LBCLASSIC-101">LBCLASSIC-101</a>. Logback
        jar files now include full OSGi bundle information in their
        manifests. This information is automatically added by Apache
        Felix' Maven bundle plug-in. The generated manifest files contain
        an appropriate Bundle-RequiredExecutionEnvironment directive,
        fixing <a
        href="http://jira.qos.ch/browse/LBGENERAL-8">LBGENERAL-8</a>.
        </p>
    
        <p>The setter and getter methods for the layout property in
        <code>AppenderBase</code> class now have reasonable default
        implementations, instead of nop previously. This change was
        requested by Thilo Tanner in <a
        href="http://jira.qos.ch/browse/LBCORE-56">LBCORE-56</a>.
        </p>
        
    
        <p>Added <em>log4j.dtd</em> compatible <a
        href="manual/layouts.html#log4jXMLLayout"><code>XMLLayout</code></a>
        as requested in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-22">LBCLASSIC-22</a>.
        </p>
    
        <p>New chapter <a href="manual/onJoran.html">on Joran</a>.</p>
    
        <hr width="80%" align="center" />
    
        <h3>29th of December 2008 - Release of version 0.9.14</h3>
    
        <p>Corrected a serious dead-lock problem occuring during
        configuration. It was reported in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-81">LBCLASSIC-81</a> by
        Holger Mense.</p>
    
        <p>Corrected thread leakage observed with
        <code>TimeBasedRollingPolicy</code>'s
        <code>AsynchronousCompressor</code>. This bug was reported in <a
        href="http://jira.qos.ch/browse/LBCORE-78">LBCORE-78</a> by Szel
        Zoltan.</p>
    
        <p>Added <a
        href="manual/filters.html#DuplicateMessageFilter">DuplicateMessageFilter</a>,
        a turbo filter which detects duplicate messages, and beyond a
        certain number of repetitions, drops repeated messages.</p>
    
        <p>Added a new appender called <a
        href="manual/appenders.html#SiftingAppender"><code>SiftingAppender</code></a>. As
        its name intimates, a <code><code>SiftingAppender</code></code>
        can be used to separate (or sift) logging according to a given
        runtime attribute. For example, <code>SiftingAppender</code> can
        separate logging events according to user sessions, so that the
        logs generated by each user go into distinct log files, one log
        file per user.
        </p>
        
        <p><code>BasicStatusManager</code>'s internal buffer is now split
        into two parts, the header part and the tail part. The header part
        stores the fist H status messages whereas the tail part stores the
        last T messages. At present time H=T=150, although these values may
        change in future releases.</p>
    
        <p>Fixed <code>NullPointerException</code> thrown when calling
        <code>setContextMap</code> on a fresh MDC. <a
        href="http://jira.qos.ch/browse/LBCLASSIC-98">Issue was</a>
        reported by Francois Terrier.
        </p>
    
    
        <p>Evaluators are now wired into an appender automatically
        (implicit rules) without the help of
        <code>EvaluatorAction</code>. EvaluatorAction is now only needed
        for global evaluator elements.  It follows that name attribute is
        necessary only for global evaluators. Embedded evaluators no
        longer need a name. This change fixes <a
        href="http://jira.qos.ch/browse/LBCLASSIC-100">LBCLASSIC-100</a>. In
        addition, <code>EvaluatorAction</code> has been modified to accept
        evaluators of any type and not just instances of
        <code>JaninoEvaluator</code>.    
        </p>
    
        <p>Logback-classic default configuration process will now
        automatically print status data on the console in case of warnings
        as well as errors. Previously, status data was printed only in
        case of errors.</p>
    
        <p><code>ContextInitializer</code> will now print the url of the
        configuration it is using. This should help reduce confusion when
        multiple config files are found on the class path.  This change
        resolves <a
        href="http://jira.qos.ch/browse/LBCLASSIC-55">LBCLASSIC-55</a>
        reported by Anton Tagunov and Henric Larsson.
        </p>
    
        <p>In case multiple configuration files are found on the class
        path, <code>ContextInitializer</code> will now emit a
        warning. This fixes <a
        href="http://jira.qos.ch/browse/LBCLASSIC-85">LBCLASSIC-85</a>
        filed by Szel Zoltan.
        </p>
    
        <p><code>HTMLLayout</code> now honors custom conversion words,
        thus fixing <a
        href="http://jira.qos.ch/browse/LBCORE-74">LBCORE-74</a> as
        reported by Natan Cox.</p>
    
        <p>Fixed <a
        href="http://jira.qos.ch/browse/LBCORE-69">LBCORE-69</a> as
        reported by Andrey Rybin. <code>SMTPAppenderBase</code> now has
        support for charset encodings so that email messages can contain
        characters beyond US-ASCII.
        </p>
    
        <p><code>SMTPAppender</code> in logback-classic now defaults to
        <code>OnErrorEvaluator</code> instead of a janino-based
        evaluator. Thus, by default <code>SMTPAppender</code> no longer
        depends on Janino.</p>
    
        <p>Added UnsynchronizedAppenderBase class based on Ralph Goers'
        contribution in <a
        href="http://jira.qos.ch/browse/LBCORE-58">LBCORE-58</a>. Note
        that <code>AppenderBase</code> remains unchanged. Appenders which
        need to handle synchronization on their own can do so by deriving
        from <code>UnsynchronizedAppenderBase</code>.</p>
    
        <h3>5th of December 2008 - Release of version 0.9.13</h3>
    
        <p>A <code>NullPointerException</code> was being thrown when a the
        level of a logger was set to null. The logger in question had to
        have children. This problem was reported in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-91">LBCLASSIC-91</a>
        by Mateusz Jedruch.
        </p>
    
        <h3>4th of December 2008 - Release of version 0.9.12</h3>
        
        <p>Fixed <a href="http://jira.qos.ch/browse/LBCORE-26">bug
        LBCORE-26</a> reported by Tsutomu YANO and independently by
        Hontv&aacute;ri J&oacute;zsef and Gamaliel
        Amaudruz. <code>RollingFileAppender</code> when used in conjunction
        with <code>DateBasedRollingPolicy</code> will rollover existing log
        files at initialization if their timestamp warrants it.
        </p>
    
        <p>Added support for file appending in <a
        href="manual/appenders.html#prudent">prudent mode</a>. Thus,
        multiple <code>FileAppender</code> instances running on multiple
        JVMs can safely write to the same log file. With certain
        limitations, prudent mode extends to
        <code>RollingFileAppender</code>.
        </p>
    
    
        <p>Fixed <a
        href="http://jira.qos.ch/browse/LBCLASSIC-83">LBCLASSIC-83</a>.
        It is now possible to set the level of a logger to null, even if
        it was previously set to a non-null level. Previously, a
        <code>NullPointerException</code> would be thrown.
        </p>
    
        <p>In response to <a
        href="http://jira.qos.ch/browse/LBCLASSIC-61">LBCLASSIC-61</a>, <a
        href="http://jira.qos.ch/browse/LBCLASSIC-33">LBCLASSIC-33</a>, <a
        href="http://jira.qos.ch/browse/LBCLASSIC-14">LBCLASSIC-24</a> and
        <a href="http://jira.qos.ch/browse/LBCLASSIC-24">LBCLASSIC-14</a>
        <code>JMXConfigurator</code> has been redesigned.
        </p>
    
        <p>Fixed <a
        href="http://jira.qos.ch/browse/LBGENERAL-22">LBGENERAL-22</a>. The
        <a href="http://logback.qos.ch/translator/">log4j.properties
        translator</a> web-application has been significantly refactored.
        </p>
    
        <p>Fixed improvement request <a
        href="http://jira.qos.ch/browse/LBCLASSIC-59">LBCLASSIC-59</a>
        relation to StatusListeners, originally submitted by Anton Tagunov.
        </p>
    
        <p>The logger and class name converters now consider zero as
        having special meaning, and will return the simple class name,
        removing the package name prefix. This feature was asked by
        Silvano Maffeis.</p>
        
        <p>In response to <a
        href="http://jira.qos.ch/browse/LBCLASSIC-54"> LBCLASSIC-54</a>
        support for turbo filters has refactored. The present code is safe
        under concurrent access while still offering good performance.
        </p>
    
        <p>Fixed <a
        href="http://jira.qos.ch/browse/LBCORE-43">LBCORE-43</a> reported
        by Bruno Navert. Configuration files can now look up property
        files from classpath resources.
        </p>
    
        <p>Fixed <a
        href="http://jira.qos.ch/browse/LBCLASSIC-86">LBCLASSIC-86</a>
        related to <code>AccessControlException</code> thrown when run in
        a JVM with a <code>SecurityManager</code>.
        </p>
    
        <p>Invoking the <code>LoggerContext.reset()</code> method resets
        logger levels to their default value, that is <code>DEBUG</code>
        for the root logger and <code>null</code> for all other
        loggers. This was requested in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-90">LBCLASSIC-90</a> by
        Mateusz Jedruch.
        </p>
    
        <!-- ======================== minor ================== -->
    
        <p>Fixed <a href="http://jira.qos.ch/browse/LBCLASSIC-69">bug
        LBCLASSIC-69</a> reported by Anton Tagunov. The
        LevelToSyslogSeverity now correctly handles the TRACE level.
        </p>
    
        <p>Fixed <a href="http://jira.qos.ch/browse/LBCLASSIC-57">bug
        LBCLASSIC-57</a> reported by Anton Tagunov. SyslogAppender could
        overwhelm the Syslog server with very large messages. SyslogAppender
        now limits its message size to 256K.
        </p>
    
        <p>Logback now supports <a
        href="manual/configuration.html#contextName">setting the logger context
        name</a> as well as inserting variables <a
        href="manual/configuration.html#insertFromJNDI">stored in JNDI</a> as
        properties.
        </p>
    
        <p>Fixed issue <a
        href="http://jira.qos.ch/browse/LBCLASSIC-49">LBCLASSIC-49</a>
        reported by Oliver Lietz. The getLogger() method in
        <code>LoggerContext</code> class will now throw an
        <code>IllegalArgumentException</code> when invoked with a null
        argument.
        </p>
    
    
      <hr width="80%" align="center" />
    
      <h3>28th of October 2008 - Release of version 0.9.11</h3>
    
      <p>Fixed <a
      href="http://jira.qos.ch/browse/LBCLASSIC-77">LBCLASSIC-77</a>
      reported independently by Gianni Doe, Yannick Haudry and Yossi Shaul.
      The childValue() method of <code>CopyOnInheritThreadLocal</code>
      class part of MDC code no longer throws a
      <code>NullPointerException</code>.
      </p>
    
      <hr width="80%" align="center" />
    
      <h3>27th of October 2008 - Release of version 0.9.10</h3>
    
      <p>In case of errors during initialization, logback-classic now
      <em>automatically</em> prints out its internal status. This has been
      a frequently requested feature.
      </p>
    
      <p>The LogbackValve in logback-access (ensuring integration with
      Tomcat), will now systematically print its internal status upon
      initialization, unless told to be quiet. This greatly helps
      troubleshooting the configuration of logback-access under Tomcat.
      </p>
    
      <p>Fixed <a href="http://bugzilla.qos.ch/show_bug.cgi?id=147">bug
      147</a> which occurred when the user inadvertently attempted to set
      the layout of a <code>SyslogAppender</code>.  The code now actively
      prevents this. Documentation has been updated to reflect the change.
      </p>
    
      <p>Fixed <a href="http://jira.qos.ch/browse/LBCLASSIC-56">bug
      LBCLASSIC-56</a> originally reported by Michel Colette. Backslash
      characters are now correctly interpreted in filename patterns.
      </p>
    
      <p>The TurboFilterChain in a LoggerContext is <a
      href="http://svn.qos.ch/viewvc?view=rev&amp;revision=1678">now
      cleared</a> when the <code>reset</code>() method is called. This
      problem was reported on May 1st, 2008, by Julia Hu on the logback
      developers list.
      </p>
    
      <!-- ========================== LB CORE ================== -->
    
      <p>Fixed issue <a
      href="http://jira.qos.ch/browse/LBCORE-48">LBCORE-48</a>.  During
      rollover, compression of large files would bring all logging to a
      halt. In this latest release, the rolled over file is first renamed,
      which is a relatively fast operation, and only then is the renamed
      file compressed asynchronously (in a separate thread).
      </p>
    
      <p>Fixed issue <a
      href="http://jira.qos.ch/browse/LBCORE-11">LBCORE-11</a>.  It is now
      possible to instruct TimeBasedRollingPolicy to delete old files,
      thus controlling then number of archived log files.</p>
    
      <p>Fixed issue <a
      href="http://jira.qos.ch/browse/LBCORE-42">LBCORE-42</a>. If the
      parent directory of the log file does not exist, then FileAppender
      will create it, including any necessary but nonexistent parent
      directories.
      </p>
    
      <p>Fixed <a href="http://jira.qos.ch/browse/LBCORE-15">LBCORE-15</a>
      reported by Klaus Unger and others. DBAppender should now work with
      Oracle 9, 10g and 11g, regardless of the JDBC driver type used.
      </p>
    
      <p>Fixed issue <a
      href="http://jira.qos.ch/browse/LBCORE-17">LBCORE-17</a> reported by
      Thorbj&oslash;rn Ravn Andersen. Logback now relies on Geronimo JMS
      API specifications instead of Sun's JMS API specification, the
      latter requiring manual installation. With Geronimo JMS, logback can
      be built using Maven without needing to manually install any
      dependencies.
      </p>
    
      <p>Fixed issue <a
      href="http://jira.qos.ch/browse/LBCORE-23">LBCORE-23</a>. In
      PatternLayout, parenthesis can be used to group conversion
      patterns. It follows that the '(' and ')' carry special meaning and
      need to be escaped to be used as literals. This is now properly
      documented.
      </p>
    
      <p>The location of the default configuration file can be specified
      by a system property. This feature was requested in <a
      href="http://jira.qos.ch/browse/LBCORE-32">LBCORE-32</a> by Ted
      Graham, Matt Fowles, Ivan Biddles and Ralph Goers.
      </p>
    
      <p>Fixed issue <a
      href="http://jira.qos.ch/browse/LBCORE-55">LBCORE-55</a> reported by
      Natan Cox. <code>WriterAppender</code> now outputs its presentation
      footer and file footer in the the correct order.
      </p>
    
    
      <p>Fixed issue <a
      href="http://jira.qos.ch/browse/LBCORE-27">LBCORE-27</a> reported by
      Peter Royal. <code>SMTPAppender</code> now outputs its presentation
      footer and file footer in the the correct order.
      </p>
    
      <!-- ========================== LB CLASSIC ================== -->
    
      <p>Fixed issue <a
      href="http://jira.qos.ch/browse/LBCLASSIC-67">LBCLASSIC-67</a>
      reported by Alessandro Fustini. SMTPAppender now correctly
      configures the layout used to format the subject line of the
      outgoing email. It no longer appends a lengthy stack trace to the
      subject line.
      </p>
    
    
      <p>Fixed issue <a
      href="http://jira.qos.ch/browse/LBCLASSIC-68">LBCLASSIC-68</a>
      reported by Gili Tzabari. In environments where the TCCL (Thread
      Context Class Loader) was not set, logback was unable to located its
      default configuration files. Logback now uses the class loader that
      loaded logback itself to locate its resources instead of the
      TCCL. This approach is simpler and deemed to cover more
      environments, i.e. more widely applicable.
      </p>
    
    
      <p>Fixed issue <a
      href="http://jira.qos.ch/browse/LBGENERAL-24">LBGENERAL-24</a>
      reported by Hung Tang. SMTPAppender now supports plain
      username/password authentication as well as both the STARTTLS
      command and SSL connections.
      </p>
    
     
      <p>Fixed issue <a
      href="http://jira.qos.ch/browse/LBCLASSIC-48">LBCLASSIC-48</a>
      reported by Peter Royal. SyslogAppender now correctly outputs hours
      as 0-23 and not as 1-12 as previously.
      </p>
    
      <p>Added a new TurboFilter called DynamicThresholdFilter which can
      filter events depending on MDC values based on a variety of criteria
      such as company name, product or the end user. This filter was
      contributed by Ralph Goers in <a
      href="http://jira.qos.ch/browse/LBCLASSIC-53">LBCLASSIC-53</a>.  
      </p>
    
      
      <hr width="80%" align="center" />
     
    
    
      <h3>26th of March 2008 - Release of version 0.9.9</h3>
      
      <p>MDC data in now inherited by child threads. This behaviour was
      already specified in the javadocs. The issue was raised by Martin
      Benda in <a href="http://bugzilla.qos.ch/show_bug.cgi?id=64">bug
      64</a> and independently by Peter Huber.
      </p>
      
      <p>Logback no longer includes retro-weaver generated jars for JDK
      1.4. There seems to be little interest in JDK 1.4 builds. Calling
      retro-weaver increases logback's build time by a few seconds each
      time &ndash; seconds in which we can do more productive things.
      </p>
    
      <p>Fixed <a href="http://bugzilla.qos.ch/show_bug.cgi?id=104">bug
      104</a>, silly but but nonetheless serious copy-and-paste errors in
      the c.q.l.classic.Logger class, reported by Joern Huxhorn.
      </p>
    
      <p>Having been replaced by <code>SimpleSocketServer</code>, the
      <code>SocketServer</code> class has been removed.
      </p>
      
      <p>Fixed <a href="http://bugzilla.qos.ch/show_bug.cgi?id=105">bug
      105</a>, sockets created by <code>SocketAppenderBase</code> is now
      closed, reported by Joern Huxhorn. More generally,
      <code>SimpleSocketServer</code> is much more careful to track open
      client connections and to close them.
      </p>
    
      <p>Fixed <a href="http://bugzilla.qos.ch/show_bug.cgi?id=110">bug
      110</a> in relation with the <code>requestParameterMap</code> field
      in <code>AccessEvent</code> - reported by Joern Huxhorn.
      </p>
    
      <p>Fixed <a href="http://bugzilla.slf4j.org/show_bug.cgi?id=66">
      SLF4J bug 66</a> in relation with caller data when using
      log4j-over-slf4j - reported by Frnack Routier.
      </p>
    
      <p>Fixed <a href="http://bugzilla.qos.ch/show_bug.cgi?id=129">bug
      129</a> reported by Michael Franz. As a result, Joran now supports
      nested as well as multiple file inclusions.
      </p>
    
      <p>Fixed <a href="http://bugzilla.qos.ch/show_bug.cgi?id=100">bug
      100</a> reported by Joern Huxhorn. At serialization time, object
      array passed as parameter, when the LoggingEvent is are now
      serialized as strings.
      </p>
    
      <p>Fixed <a href="http://bugzilla.qos.ch/show_bug.cgi?id=109">bug
      109</a> reported by Joern Huxhorn. There should no longer be any
      NullPointerExceptions thrown by deserialized
      <code>AccessEvent</code> instances.
      </p>
    
      <p>Fixed <a href="http://bugzilla.qos.ch/show_bug.cgi?id=8">bug
      8</a> reported by Sebastien Pennec. The documentation has been
      updated to reflect the fact that that in the context of conversion
      patterns the percent sign carries special meaning, in order to
      include the percent sign as a literal, it must be escaped with a
      backslash.
      </p>
    
      <p>Fixed <a href="http://bugzilla.qos.ch/show_bug.cgi?id=52">bug
      52</a> reported by Kenichi Masuko. The bug has been fixed on March
      8th, 2007. Starting with this release, Joran will support the
      injection of any enum type, not just <code>FilterReply</code>.
      </p>
    
      <hr width="80%" align="center" />
    
    
      <h3>22th of August 2007 - Release of version 0.9.8</h3>
      
      <p>This version of logback synchronizes with SLF4J version 1.4.3. In
      particular, logback now natively supports SLF4J's MDC API introduced
      in SLF4J version 1.4.1. If you are using SLF4J version 1.4.1 or
      later please make sure upgrade to logback version 0.9.8 or later.
      </p>
    
      <p>Fixed a number of documentation related bugs, in particular <a
      href="http://bugzilla.qos.ch/show_bug.cgi?id=90">bug 90</a> reported
      by Luc Maisonobe and <a
      href="http://bugzilla.qos.ch/show_bug.cgi?id=90">bug 88</a> reported
      by Sebastian Davids.
      </p>
    
      <p>It is now possible to include configuration file fragments (in
      XML) as a resource. Previously, it was only possible to include a
      file by specifying a path to a file or a URL.  This feature was
      requested by Michael Newcomb in <a
      href="http://bugzilla.qos.ch/show_bug.cgi?id=89">bug 89</a>.
      </p>
    
      <p>Fixed caller data extraction problem as reported in <a
      href="http://bugzilla.qos.ch/show_bug.cgi?id=78">bug 78</a> by Hans
      van der Meer.
      </p>
    
      <p>The LoggingEvent class' constructor now correctly takes into
      account the argument array passed by the user. This problem was
      reported in <a href="http://bugzilla.qos.ch/show_bug.cgi?id=85">bug
      85</a> by Robert Christian.
      </p>
    
      <hr width="80%" align="center" />
    
    
      <h3>29th of May 2007 - Release of version 0.9.7</h3>
    
    
      <p>This release corrects packaging bugs <a
      href="http://bugzilla.qos.ch/show_bug.cgi?id=75">75</a> and <a
      href="http://bugzilla.qos.ch/show_bug.cgi?id=76">76</a> related to
      the migration of logback to SLF4J version 1.4.0. There are no other
      changes.
      </p>
    
    
      <hr width="80%" align="center" />
    
      <h3>23rd of May 2007 - Release of version 0.9.6</h3>
    
    
      <p>Logback is now aligned and compatible with SLF4J version 1.4.0,
      thus correcting <a
      href="http://bugzilla.qos.ch/show_bug.cgi?id=73">bug 73</a> as
      reported by Andy Gerweck.
      </p>
    
      <p>Fixed <code>NoClassDefFoundError</code> problem when running
      under JDK 1.4 <a
      href="http://www.qos.ch/pipermail/logback-user/2007-April/000206.html">as
      reported</a> by Brian Suksomwong.
      </p>
    
      <p>Fixed <a href="http://bugzilla.qos.ch/show_bug.cgi?id=63">bug
      63</a> as reported by La Canea Rosario. Calling log4j (bridge) with
      the trace level will no longer cause an IllegalStateException to be
      thrown.
      </p>
    
      <p>Fixed <a href="http://bugzilla.qos.ch/show_bug.cgi?id=70">bug
      70</a> as reported by Dirk Ooms. The %throwable conversion word is
      now recognized as documented in the logback manual. Moreover, the
      manual now mentions the %nopex word which can be used to force
      <code>PatternLayout</code> to ignore the exception contained in the
      logging request.
      </p>
    
      
      <p>As in most releases, the documentation has been improved.</p>
    
      <hr width="80%" align="center" />
    
    
      <h3>April 2nd, 2007 - Release of version 0.9.5</h3>
    
      <p>Fixed methods <code>isInfoEnabled</code>,
      <code>isWarnEnabled</code> and <code>isErrorEnabled</code> methods
      in <code>ch.qos.logback.classic.Logger</code> class which failed to
      work correctly. This bug was reported today by Pavel Kral on the
      slf4j-user list. 
      </p>
    
      <p>Contrary to previous versions of logback, the various
      Logger.isXYZEnabled(Marker) methods now take into account the marker
      information passed as parameter.
      </p>
    
    
      <p>As discussed in <a
      href="http://bugzilla.qos.ch/show_bug.cgi?id=54">bug 54</a>, during
      automatic initialization, it makes better sense to first check for
      <em>logback-test.xml</em> file and only if that fails, to check for
      <em>logback.xml</em>. Maven2 will guarantee that the
      logback-test.xml file, if places under test/resources will not be
      included in the artifact it produces.
      </p>
    
    
      <hr width="80%" align="center" />
      
      <h3>March 29th, 2007 - Release of version 0.9.4</h3>
        
      <p>Significant bug fixes made to <code>c.q.l.access.TeeFilter</code>
      and Co. Images and other binary files are now intercepted and
      replayed correctly. As for "x-www-form-urlencoded" post requests,
      their input buffer is left untouched. In a best-effort attempt, the
      input buffer for "x-www-form-urlencoded" post requests is later
      reconstructed through the request parameters. However, it may differ
      from the original buffer.
      </p>
        
      <p>The logback team released today the first version of a plugin for
      Eclipse that allows developers to visualize logs generated by a
      running application.  It offers several nice features. Please check
      the <a href="consolePlugin.html">console plugin-in guide</a> for
      more details.
      </p>
    
    
      <h3>March 20th, 2007 - Release of version 0.9.3</h3>
      
      <p>Includes in configuration files are now supported by Joran,
      logback's configuration framework. A file can contain an
      <em>include</em> element that has a <em>file</em> or <em>url</em>
      attribute pointing to a configuration file.  See the <a
      href="manual/configuration.html#fileInclusion">chapter about
      configuration</a> in the logback's online manual for more
      information.
      </p>
        
      <p>Corrected bug 53 reported by Wilkins Poe. There is now a <a
      href="dependencies.html">dependencies page</a> that shows the
      requirements of each of logback's modules.
      </p>
        
      <p>After a <a
      href="http://www.slf4j.org/pipermail/user/2007-March/000297.html">
      discussion on the SLF4J mailing list</a> started by Franck Routier,
      a correction has been made when logging using the
      <em>JCL104-over-slf4j</em> module. Logback now correctly shows the
      caller location information.
      </p>
        
      <p>As in most logback releases, the documentation has been improved.
      </p>
        
    
      <h3>March 5th, 2007 - Release of version 0.9.2</h3>
      
      <p>The documentation is now in the <em>docs/</em> directory to allow an
      easier access to the logback manual and website for offline viewing.
      </p>
      
      <h3>March 5th, 2007 - Release of version 0.9.1</h3>
      
      <p>Logback-class now depends on SLF4J version 1.3.0 instead of
      1.2.</p>
      
      <p>Numerous improvements to the documentation.</p>
      
      <p><a href="http://bugzilla.qos.ch/show_bug.cgi?id=46">Bug #46</a>
      reported by Mark Renyolds has been fixed. The
      <code>TimeUtilTest</code> should now run fine under any time
      zone.</p>
    		
      <p><a href="http://bugzilla.qos.ch/show_bug.cgi?id=45">Bug
      #45</a>, also reported by Mark Reynolds, has been fixed. There
      should be no <code>ClassCastException</code> thrown anymore when
      passing an <code>Object</code> to the printing methods using the
      log4j-bridge module. </p>
      
      <hr width="80%" align="center" />
      
      <h3>January 31st, 2007 - Release of version 0.9</h3>
      
      <p>This version contains a new component, namely the
      <code>ContextSelector</code>, that provides context separation and
      management when logback is used by several web-apps running under
      the same server. A <a href="manual/contextSelector.html">new
      chapter</a> was added to the logback manual to detail the use of the
      <code>ContextSelector</code>, along with its associated components.
      </p>
        
      <p>The <code>JMXConfigurator</code> has been improved. It now shows
      the context's Status objects, which lets users check the internal
      state of logback.
      </p>
        
      <p>The logback manual's chapter 2, about <a
      href="manual/architecture.html">logback's architecture</a>, has been
      updated with two sections: Under the hood and Performance.
      </p>
      
      <hr width="80%" align="center" />
      
      <h3>January 23th, 2007 - Release of version 0.8.1</h3>
      
      <p>This version contains new components in the Access module,
      allowing users to display the full HttpServletRequest or
      HttpServletResponse of an access event.
      </p>
        
      <p>The documentation section has been updated. The short
      introduction was split into the chapter 1 and chapter 2 of the
      logback manual. The chapters about Appenders and Layouts have been
      updated to document new components of logback.
      </p>
        
      <p>A demonstration webApp presenting logback's major components is
      available.  A document explains how to run it, and provides a
      step-by-step visit of the demo.
      </p>
      
      <p>A first translation of logback jars to JDK1.4 is present in
      this release.
      </p>
      
      
      <hr width="80%" align="center" />
      
      <h3>January 12th, 2007 - Release of version 0.8</h3>
      
      <p>This version contains a whole new chapter, namely Chapter 3,
      about logback configuration. Several other documentation pages
      have been improved.
      </p>
      
      <p>Logback now uses Generics in many components.
      </p>
      
      <p>Several new components have been added to logback. A JMX
      Configurator now allows users to see and modify loggers or reload
      configuration among other possibilities.  A <a
      href="jmxConfig.html">document</a> about this configurator is
      available in the <a href="documentation.html">corresponding
      section</a> of the site. We'd like to thank Sebastian Davids for his
      ideas and contributions to this component.
      </p>
    		
      <p>A JMSTopicAppender and JMSQueueAppender are now available, as
      well as two new filters: LevelFilter and ThresholdFilter. A
      refactoring was done in the filters objects to ease the
      implementation of custom filters.
      </p>
    		
      <hr width="80%" align="center" />
    
    		
      <h3>December 19th, 2006 - Release of version 0.7.1</h3>
      
      <p>Version 0.7.1 of logback has been released.
      </p>
      
      <p>This version contains more detailed information about logback
      access module, and its JMX components. A <a
      href="access.html">dedicated page</a> explains how to configure and
      use logback access in Tomcat and Jetty, and access some of its
      components via JMX.
      </p>
    		
      <hr width="80%" align="center" />
      
      <h3>December 18th, 2006 - Release of version 0.7</h3>
      
      <p>Version 0.7 of logback has been released.</p>
    		
      <p>Logback now ships with a new module: <em>log4j-bridge</em>. This
      new module can be used to intercept log4j calls and redirects them
      to logback components.  More information about this module can be
      found in the corresponding <a href="bridge.html">documentation
      page</a>.
      </p>
    		
      <p>The documentation has been vastly updated. Two new chapters,
      namely Filters and MDC, are available in the manual section.
      </p>
    
      <hr width="80%" align="center" />
      
      <h3>November 30th, 2006 - Release of version 0.6</h3>
      
      <p>Version 0.6 of logback has been released.
      </p>
      
      <p>Logback classic now supports automatic configuration, allowing
      test and production environment
      configuration. <code>TurboFilters</code> make their first appearance
      in a logback release. They provide ultra-fast filtering
      possibilities.  The logging context now supports listeners which
      will be contacted each time the context is reset or
      started. <code>SMTPAppender</code> allows for much more flexible
      configuration than before.
      </p>
    		
      <p>In logback access, new Appenders are available, namely
      <code>SocketAppender</code> and <code>DBAppender</code>.  Logback
      access now supports filtering and event evaluations. A
      <code>CountingFilter</code> has been added. It provides statistical
      views of server access, reachable via JMX.
      </p>
    		
      <p>The documentation has also been improved. A complete new chapter
      has been added about Appenders, the short introduction to logback
      classic has been updated and a new module, containing many
      configuration examples has been added.
      </p>
    		
      <p>Logback now uses continuous integration in its development.
      </p>
    		
      <p>Tests have been improved, many new have been added.  This release
      also provides some bug fixes.
      </p>
    
      <hr width="80%" align="center" />
      
      <h3>October 26th, 2006 - Release of version 0.5</h3>
      
      <p>Version 0.5 of logback has been released.
      </p>
    		
      <p>This release offers a important improvements in Joran. In
      particular, Joran can now replay configuration elements.
      </p>
    
      <p>As in the previous release, a major area of work is the
      documentation which is being continuously improved.
      </p>
    
      <hr width="80%" align="center" />
      
      <h3>October 9th, 2006 - Release of version 0.4</h3>
      
      <p>Version 0.3 of logback has been released.
      </p>
    		
      <p>This release includes an improved access module, with specific
      implementations for the Jetty and Tomcat servers. Documentation was
      also added to show how to integrate logback-access with Jetty.
      </p>
    
      <p>As for the classic module, several appenders and layouts have
      been added or improved.  The error reporting of logback has also
      been enhanced, presenting the user with a link to an online page
      explaining possible reasons for the error.
      </p>
    
      <p>Joran documentation was added, with examples in the core
      module.
      </p>
    	
      <hr width="80%" align="center" />
      
      <h3>September 8th, 2006 - Release of version 0.3</h3>
      <p>
        Version 0.3 of logback has been released.
      </p>
      
      <p>This release offers several new Appenders, support for Mapped
      Diagnostic Context, improved tests and documentation<br />
      </p>
    
      <p>In response to a bug report by Rickard Nilsson on the logback
      mailing list, a bug affecting parametrized logging was fixed.
      </p>
    
      <p>We also released a <a
      href="http://logback.qos.ch/translator/">PropertiesTranslator</a>
      webapp that converts <em>log4j.properties</em> files to joran
      configuration files (in XML format).<br />
      </p>
    	
      <hr width="80%" align="center" />
    		
      <h3>August 23th, 2006 - Release of version 0.2.5</h3>
      
      <p> Version 0.2.5 of logback has been released. </p>
    
      <p>This release offers better documentation, with a number of
      corrections made in the short introduction to logback-classic.
      </p>
      
      <hr width="80%" align="center" />
      
      
      <h3>August 15th, 2006 - Release of version 0.2</h3>
      
      <p>Version 0.2 of logback has been released.</p>
    
      <p>It offers better tests, some more functionality, and enhanced
      documentation.  We also improved the site design to make it simpler
      and more efficient.
      </p>
    
      <hr width="80%" align="center" />
      
      <h3>July 26th, 2006 - Release of version 0.1</h3>
      
      <p>Version 0.1 of logback has been released.</p>
      
      <hr width="80%" align="center" />
      
      <h3>February 9th, 2006 - Logback web-site goes live</h3>
      
      <p>The logback web-site goes live on the 9th of February. At its
      present state, it is pretty primitive but updates will follow.
      </p>
      
    	
      <script src="templates/footer.js" type="text/javascript"></script>
    </div>
    </body>
    </html>
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/volunteer.html�������������������������������������������0000644�0001750�0001750�00000013076�12136042273�023272� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Volunteers</title>
        <link rel="stylesheet" type="text/css" href="css/common.css" />
        <link rel="stylesheet" type="text/css" href="css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="css/_print.css" media="print" />
      </head>
      <body>
    	<script type="text/javascript">prefix='';</script>
    
      <script src="templates/header.js" type="text/javascript"></script>
      <div id="left">
        <noscript>Please turn on Javascript to view this menu</noscript>
        <script src="templates/left.js" type="text/javascript"></script>
      </div>
      
      <div id="content">
      
        <h2>Call for volunteers</h2>
    
        <p>We are looking for volunteers in the following areas.</p>
    
        <ol>
          <li><span class="label">top priority</span> <b>logback in 10 minutes</b> 
          
          <p>We are looking for a volunteer, preferably a native English
          speaker, to write a short document describing logback for
          beginners, entitled say "logback in 10 minutes". This document
          is likely to be the most widely read document of the
          project. Writing such a document is an excellent opportunity to
          learn logback. Obviously, there would be plenty of editorial
          help and guidance coming from the logback developers.
          </p>
          </li>
    
          <li><span class="label">high priority</span> <b>Proof reading the documentation</b>
          <p>We are always looking for volunteers to proof-read the
          documentation. Suggestions as to the design and look-and-feel of
          the site are also welcome.</p>
          </li>
    
          <li><span class="label">medium priority</span> <b>Decoder:
          parse log files and transform them into logging events</b>
          
          <p>This effort has been started under the <a
          href="https://github.com/qos-ch/logback-decoder">logback-decoder</a>
          project but has stalled. This problem is technically
          interesting, has a well-defined scope and mostly independent of
          the logback framework.
          </p>
          
          </li>
    
          <li><span class="label">medium priority</span> <b>Maintain the
          groovy configurator</b>
    
          <p>The Groovy configurator, aka Gaffer, although pretty cool, is
          not getting the attention it deserves. The amount of code
          involved, altough not completely trivial, is far from
          insurmountable. We are looking for a volunteer to take over
          Gaffer.
           </p>
          </li>
    
          <li><b>Improve OSGi support</b>
          
          <p>We are looking for an OSGi expert to review our current
          practices and improve OSGi support in logback.  </p></li>
          
          <li><b>Fixing bugs</b>
    
          <p>We are looking for volunteers for fixing logback
          bugs. Volunteering to solve bugs is a good way to learn about
          any project.
          </p> 
    
          <p>For those looking for highly technical challenges with
          limited scope, have a look at various build failures observable
          on <a href="http://logback.qos.ch/jenkins/">our Jenkins
          instance</a>.
          </p>
    
          <p>Our build is quite stable but failures occur from time to
          time on our Jenkins instance hosted on a relatively old
          computer.</p>
    
          <ul>
    
            <li><a
            href="http://logback.qos.ch/jenkins/job/logback/149/">build
            #149</a> with test faulure in <a
            href="http://logback.qos.ch/jenkins/job/logback/ch.qos.logback$logback-classic/149/testReport/junit/ch.qos.logback.classic.joran/JoranConfiguratorTest/levelChangePropagator1/">JoranConfiguratorTest.levelChangePropagator1</a>
            probable cause: parallel execution, j.u.l. shared-state
            overridden by levelChangePropagator0 while levelChangePropagator1 is running
            </li>
    
            <li><a
            href="http://logback.qos.ch/jenkins/job/logback/298/">build
            #298</a> with test faulure in <a
            href="http://logback.qos.ch/jenkins/job/logback/ch.qos.logback$logback-core/298/testReport/junit/ch.qos.logback.core/AsyncAppenderBaseTest/workerShouldStopEvenIfInterruptExceptionConsumedWithinSubappender/">AsyncAppenderBaseTest</a>
            probable cause: race condition
            </li>
    
    
            <li><a
            href="http://logback.qos.ch/jenkins/job/logback/91/">build
            #91</a> with test faulure in <a
            href="http://logback.qos.ch/jenkins/job/logback/ch.qos.logback$logback-classic/91/testReport/junit/ch.qos.logback.classic.net/SMTPAppender_GreenTest/testMultipleTo/">SMTPAppender_GreenTest</a>
            probable cause: race condition, GreenMail server not running
            at time of message transmission</li>
    
    
          </ul>
    
          <p>These build failures are quite hard to reproduce. If you
          intend to work on these problems, you will probably first need
          to make changes to logback code so that the problem becomes
          easily reproducible. One the problem is identified and
          reproducible, solving it should be much easier.
          </p>
    
        <h3>Setting up the project</h3>
        
        <p>If you wish to contribute to the project or just hack for fun,
        you will probably want to import logback as a project into your
        favorite IDE. See the instructions for <a
        href="setup.html#ide">building logback in Eclipse or IntelliJ
        IDEA</a> for details.</p>
    
        <script src="templates/footer.js" type="text/javascript"></script>
      </div>
      </body>
    </html>������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/bugreport.html�������������������������������������������0000644�0001750�0001750�00000006337�11504062125�023256� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Bug report</title>
        <link rel="stylesheet" type="text/css" href="css/common.css" />
        <link rel="stylesheet" type="text/css" href="css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="css/_print.css" media="print" />
      </head>
      <body>
        <script type="text/javascript">prefix='';</script>
    
        <script src="templates/header.js" type="text/javascript"></script>
        <div id="left">
          <script src="templates/left.js" type="text/javascript"></script>
        </div>
        <div id="content">
    	
    	
    	
    	
        <h2>Before you report a bug</h2>
    
        <p>The logback community consists of those who use logback and its
        modules, help answer questions on discussions lists, contribute
        documentation and patches, and those who develop and maintain its
        code. Those who assist on a day to day basis resolving
        bug reports do this for a wide variety of reasons, and almost all
        of them do this on their own time.</p>
    
        <p>Many bugs reported end up not being a bug in logback, but are
        due to misconfiguration, problems caused by installed
        applications, the operating system, etc.
        </p>
    
        <p>Before reporting a bug please make every effort to resolve the
        problem yourself.  Just reporting a bug will not fix it. A good
        bug report includes a detailed description of the problem and a
        succinct test case which can reproduce the problem.
        </p>
    
        <h3>Review the documentation</h3>
        
        <p>Review the documentation for the version of component you are
        using.  The problem you are having may already be addressed in the
        docs.
        </p>
    
        <h3>Search the mailing list archives</h3>
        
        <p>It is very likely you are not the first to run into a problem.
        Others may have already found a solution.  Our various mailing lists
        are likely to have discussed this problem before.
        </p>
        
        <h3>Search JIRA</h3>
        
        <p>Please search the bug database to see if the bug you are seeing
        has already been reported.  The bug may have already been fixed
        and is available in a later version.  If someone else has reported
        the same bug, you could add supporting information to help
        reproduce and resolve the bug.
        </p>
        
        <ul>
          <li><a href="http://jira.qos.ch/secure/IssueNavigator.jspa">Search
          for logback bugs</a></li>
        </ul>
        
        <h3>Reporting a bug</h3>
        
        <p>Only after you have exhausted the aforementioned steps, should
        you file a formal report in JIRA, our bug tracking system.
        </p>
    
        <p>Please make sure you provide as much information as possible.
        It is hard to fix a bug if the person looking into the problem
        cannot reproduce it.
        </p>
        
        <ul>
          <li><a
          href="http://jira.qos.ch/secure/CreateIssue!default.jspa">Report
          new logback bug</a></li>
        </ul>
        
        <script src="templates/footer.js" type="text/javascript"></script>
    </div>
    </body>
    </html>
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/codes.html�����������������������������������������������0000644�0001750�0001750�00000055775�12136042147�022360� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Logback Error Codes</title>
    
        <link rel="stylesheet" type="text/css" href="css/common.css" />
        <link rel="stylesheet" type="text/css" href="css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="css/_print.css" media="print" />
        <link rel="stylesheet" type="text/css" href="css/prettify.css" />
        <style type="text/css">
          h3.doAnchor {
            border-top: 2px solid #888888;
            /*color: #333;*/
            padding-bottom: 1ex;
            padding-top: 1ex;
          }
        </style>
      </head>
      
      <body  onload="prettyPrint(); decorate();">
        <script type="text/javascript" src="js/prettify.js"></script>
        <script type="text/javascript">prefix='';</script>
        <script type="text/javascript" src="templates/header.js"></script>
        <script type="text/javascript" src="js/jquery-min.js"></script>
        <script type="text/javascript" src="js/decorator.js"></script>
        
    
      <div id="left">
        <script src="templates/left.js" type="text/javascript"></script>
      </div>
      <div id="content">
        
      <h2><a name="top">Logback error messages and their meanings</a></h2>
      
    
      <h3 class="doAnchor" name="null_CS">The contextSelector cannot be
      null in <code>StaticLoggerBinder</code>.  
      </h3>
    
      <p>An <code>IllegalStateException</code> is thrown when no
      ContextSelector could be set for logback's
      <code>StaticLoggerBinder</code>. In principle, this error can only
      occur when the context selector is expressly specified by the user,
      and when that context selector cannot not be instantiated correctly.
      </p>
    
      <p>It should not happen when you are using the default or JNDI
      context selectors.
      </p>
      
    
      <!-- =========================================================== -->
      <h3 class="doAnchor" name="layoutInsteadOfEncoder">This appender no
      longer admits a layout as a sub-component, set an encoder instead.
      </h3>
    
      <p>As of logback version 0.9.19, the <code>WriterAppender</code>
      class has been renamed as <code>OutputStreamAppender</code>, with
      <code>FileAppender</code> now sub-classing the
      latter. <code>OutputStreamAppender</code> and sub-classes now take
      an <code>Encoder</code> as a sub-component instead of a
      <code>Layout</code>.
      </p>
    
      <p>In practical terms, this means that configuration files need to
      be changed</p>
      
      <p class="red bold">from (DEPRECATED)</p>
      
      <pre class="prettyprint source">&lt;appender name="FILE" class="ch.qos.logback.core.FileAppender">
      &lt;file>testFile.log&lt;/file>
      ...
      &lt;layout class="ch.qos.logback.classic.PatternLayout">
        &lt;pattern>%msg%n&lt;/pattern>
      &lt;/layout>
    &lt;/appender>   </pre>
    
      <p class="red bold">or the shorter equivalent (DEPRECATED)</p>
    
      <pre class="prettyprint source">&lt;appender name="FILE" class="ch.qos.logback.core.FileAppender">
      &lt;file>testFile.log&lt;/file>
      ...
      &lt;!-- layout are assigned the type ch.qos.logback.classic.PatternLayout by default -->
      &lt;layout>
        &lt;pattern>%msg%n&lt;/pattern>
      &lt;/layout>
    &lt;/appender>   </pre>
    
    
      <p class="green bold">to (GOOD)</p>
        <pre class="prettyprint source">&lt;appender name="FILE" class="ch.qos.logback.core.FileAppender">
      &lt;file>testFile.log&lt;/file>
      ...
      &lt;encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        &lt;pattern>%msg%n&lt;/pattern>
      &lt;/encoder>
    &lt;/appender>   </pre>
     
      <p class="green bold">or the shorter equivalent (GOOD)</p>
    
       <pre class="prettyprint source">&lt;appender name="FILE" class="ch.qos.logback.core.FileAppender">
      &lt;file>testFile.log&lt;/file>
      ...
      &lt;!-- encoders are assigned the type 
           ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
      &lt;encoder>
        &lt;pattern>%msg%n&lt;/pattern>
      &lt;/encoder>
    &lt;/appender>   </pre>
    
    
      <p>For layout type other than <code>PatternLayout</code>, for
      example <code>HTMLLayout</code>, your configuration files need to be
      changed
      </p>
    
      <p class="red bold">from (DEPRECATED)</p>
    
      <pre class="prettyprint source">&lt;appender name="FILE" class="ch.qos.logback.core.FileAppender">
      &lt;file>testFile.log&lt;/file>
      ...
      &lt;layout class="ch.qos.logback.classic.html.HTMLLayout">
        &lt;pattern>%msg%n&lt;/pattern>
      &lt;/layout>
    &lt;/appender> </pre>
    
    
      <p class="green bold">to (GOOD)</p>
        <pre class="prettyprint source">&lt;appender name="FILE" class="ch.qos.logback.core.FileAppender">
      &lt;file>testFile.log&lt;/file>
      ...
      &lt;encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
        &lt;layout class="ch.qos.logback.classic.html.HTMLLayout">
          &lt;pattern>%msg%n&lt;/pattern>
        &lt;/layout>
      &lt;/encoder>
    &lt;/appender> </pre>
      
      
    
      <p>We hope to make up for this inconvenience with cool new features
      which are only possible using encoders. <b>During a transition
      period, layouts passed as parameter will be automatically wrapped by
      an encoder so that configuration files in the old format (using a
      layout instead of encoder) will continue to work unmodified.</b>
      </p>
    
      
      
    
      <!-- =========================================================== -->
    
      <h3 class="doAnchor" name="socket_no_host">No remote host or address
      is set for <code>SocketAppender</code>
        
      </h3>
    
      <p>A remote host or address is mandatory for SocketAppender. </p>
      <p>You can specify the remote host in the configuration file
      as follows.
      </p>
      
      <pre class="prettyprint source">&lt;appender name="SOCKET"
      class="ch.qos.logback.classic.net.SocketAppender">
      ...
      &lt;remoteHost>127.0.0.1&lt;/remoteHost>
      ...
    &lt;/appender&gt;</pre>
    
    
      
    
      <!-- ============================================================= -->
    
      <h3 class="doAnchor" name="socket_no_port">No remote port is set for
      <code>SocketAppender</code>    
      </h3>
        
      <p>A remote port is mandatory for SocketAppender.</p>
          
      <p>You can specify the remote port in the configuration file
      like this:
      </p>
          
      <pre class="prettyprint source">&lt;appender name="SOCKET" class=&quot;ch.qos.logback.classic.net.SocketAppender&quot;&gt;
      ...
      &lt;port>4560&lt;/port>
      ...
    &lt;/appender&gt;</pre>
    				
    
    
      
    
      <!-- ============================================================= -->
    
      <h3 class="doAnchor" name="smtp_no_layout">No <code>Layout</code> is
      set for SMTPAppender
      </h3>
    
      <p>A <code>Layout</code> is mandatory for
      <code>SMTPAppender</code>. It allows SMTPAppender to format logging
      events before sending an email.
      </p>
          
      <p>You can specify the <code>Layout</code> in a configuration file
      as follows:
      </p>
          
      <pre class="prettyprint source">&lt;appender name=&quot;SMTP&quot; class=&quot;ch.qos.logback.classic.net.SMTPAppender&quot;&gt;
      ...
      &lt;layout class=&quot;ch.qos.logback.classic.PatternLayout&quot;&gt;
        &lt;pattern>%date [%thread] %-5level %logger - %msg%n&quot;&gt;&lt;/pattern>
      &lt;/layout&gt;
      ...
    &lt;/appender&gt;</pre>
          
      <p>SMTPAppender is known to work well with <a
      href="manual/layouts.html#ClassicPatternLayout">PatternLayout</a>
      and <a
      href="manual/layouts.html#ClassicHTMLLayout">HTMLLayout</a>.
      </p>
    
    
      
          
      <!-- ============================================================= -->
    
      <h3 class="doAnchor" name="sbtp_size_format">Specified number is not
      in proper int form, or not expected format.    
      </h3>
        
      <p>When you specify the MaxFileSize to be used by the
      SizeBasedRollingPolicy, logback expects a rather precise
      format:
      </p>
      
      <ul>
        <li>The number has to be an integer</li>
        <li>You can add 'KB', 'MB' or 'GB' after the number.
        </li>
      </ul>
          
      <p>Here are some correct values: 500KB, 15MB, 2GB.</p>
      
      
          
      <!-- ============================================================= -->
    
      <h3 class="doAnchor" name="rfa_no_tp">No
      <code>TriggeringPolicy</code> was set for the
      <code>RollingFileAppender</code>.
        
      </h3>
        
      <p>The <code>RollingFileAppender</code> must be set up with a
      <code>TriggeringPolicy</code>. It permits the Appender to know when
      the rollover must be activated.
      </p>
      
      <p>To find more information about <code>TriggeringPolicy</code>
      objects, please read the following javadocs:
      </p>
      
      <ul>
        <li>
          <a
           href="manual/appenders.html#SizeBasedTriggeringPolicy"><code>SizeBasedTriggeringPolicy</code>
          </a>
        </li>
        <li>
          <a
          href="manual/appenders.html#TimeBasedRollingPolicy"><code>TimeBasedRollingPolicy</code>
          </a>
        </li>
      </ul>
      
      <p>Please note that the <code>TimeBasedRollingPolicy</code>
      is a TriggeringPolicy <em>and</em> and
      <code>RollingPolicy</code> at the same time.
      </p>
          
      
          
      <!-- ============================================================= -->
    
      <h3 class="doAnchor" name="rfa_no_rp">No <code>RollingPolicy</code>
      was set for the <code>RollingFileAppender</code>.    
      </h3>
      
      <p>The <code>RollingFileAppender</code> must be set up with
      a <code>RollingPolicy</code>. It permits the Appender to
      know what to do when a rollover is requested.
      </p>
        
      <p>To find more information about <code>RollingPolicy</code>
      objects, please read the following javadocs:
      </p>
        
      <ul>
        <li>
          <a href="apidocs/ch/qos/logback/core/rolling/FixedWindowRollingPolicy.html">
            <code>FixedWindowRollingPolicy</code>
          </a>
        </li>
        <li>
          <a href="apidocs/ch/qos/logback/core/rolling/TimeBasedRollingPolicy.html">
            <code>TimeBasedRollingPolicy</code>
          </a>
        </li>
      </ul>
      
      <p>Please note that the <code>TimeBasedRollingPolicy</code> is a
      <code>TriggeringPolicy</code> <em>and</em> and RollingPolicy at
      the same time.
      </p>
      
      
      
    
      <!-- ============================================================= -->
      <h3 class="doAnchor" name="tbr_fnp_not_set">The <span
      class="option">FileNamePattern</span> property is mandatory for both
      <code>TimeBasedRollingPolicy</code> and
      <code>FixedWindowRollingPolicy</code>.    
      </h3>
    
      
      <p>The <span class="option">FileNamePattern</span> property for both
      <code>TimeBasedRollingPolicy</code> and
      <code>FixedWindowRollingPolicy</code> is mandatory.
      </p>
      
      <p>Please refer to the documentation of <a
      href="manual/appenders.html#TimeBasedRollingPolicy">TimeBasedRollingPolicy</a>
      and <a
      href="manual/appenders.html#FixedWindowRollingPolicy">FixedWindowRollingPolicy</a> for
      examples.
      </p>
    
    
      
    
      <!-- ============================================================= -->
      <h3 class="doAnchor" name="rfa_file_after">The <span
      class="option">File</span> property must be set before any rolling
      policy or triggering policy.
        
      </h3>
    
      <p>The <span class="option">File</span> property, if present, must
      be placed before any rolling policy or triggering policy. Thus, in a
      configuration file, the <span class="option">File</span> property,
      if present, must be declared declared before any rolling policy or
      triggering policy declarations.
      </p>
    
      <!-- ============================================================= -->  
    
      <h3 class="doAnchor" name="rfa_collision"><span
      class="option">File</span> property collides with <span
      class="option">fileNamePattern</span>. Aborting.
      </h3>
    
      <p>When the <span class="option">file</span> property matches the
      regular expression defined by <span
      class="option">fileNamePattern</span>, there is a risk of
      collison. A collision occurs when the active log file as defined by
      the <span class="option">file</span> property has the same path as
      an existing log archive. Such a collision will result in the log
      archive being overwritten.
      </p>
    
      <p>As such, in case <span class="option">file</span> property
      matches the regular expression defined by <span
      class="option">fileNamePattern</span>, in order to avoid data loss,
      <code>RollingFileAppender</code> will emit an error message and
      refuse to start.</p>
    
      <!-- ============================================================= -->
      <h3 class="doAnchor" name="renamingError">Failed to rename file [x]
      as [y].</h3>
    
      <b>On Windows</b>
    
      <p>On certain platforms, e.g. Windows, a log file cannot be renamed
      if there are handles referencing it. For example, when the file is
      read by another process such as <code>less</code>,
      <code>tail</code>, etc. During application hot-redeployment, the old
      instance of the application will have open references to log files
      until the old instance is completely shutdown or until the
      <code>stop()</code> method on its <a
      href="apidocs/ch/qos/logback/classic/LoggerContext.html"><code>LoggerContext</code></a>
      is invoked.
      </p>
    
      <p>On the Windows platform, <a
      href="http://technet.microsoft.com/en-us/sysinternals/bb896653">Process
      Explorer</a> can help you locate the processes which reference a
      given file (Find -&gt; Find Handle or DLL). On Linux, you can use
      the <code><a href="http://www.manpagez.com/man/8/lsof/">lsof </a>
      <em>pathToFile</em></code> command to find which process has the
      file given by <em>pathToFile</em> open. </p>
    
      <p>In practice, it can be hard to ensure that there are no file
      handle references to log files. It can be easier to avoid file
      renaming altogether. As a first step, let us note that for
      <code>TimeBasedRollingPolicy</code>, the <span
      class="option">file</span> option can be omitted. If omitted, no
      file renaming will be performed during roll over. Thus, in order to
      avoid file renaming errors just leave blank the <span
      class="option">file</span> option of
      <code>RollingFileAppender</code>, as shown in the next configuration
      snippet.
      </p>
    
      <pre class="prettyprint source">&lt;appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
      &lt;!-- <span class="option">file</span> option left unset/blank -->
      &lt;rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        &lt;fileNamePattern>mylog.%d{yyyy-MM-dd}.log&lt;/fileNamePattern>
      &lt;/rollingPolicy>
    
      &lt;encoder>
        &lt;pattern>%relative [%thread] %level %logger - %msg%n&lt;/pattern>
      &lt;/encoder>
    &lt;/appender></pre>
    
       <p>Note that for <code>FixedWindowRollingPolicy</code>, the <span
       class="option">file</span> property is mandatory.
       </p>
     
       <h4 class="doAnchor" name="renamingErrorOnUnix">On Unix-*</h4>
      
       <p>On the Unix flatform, the basic/quick rename method supplied by
       the JDK does not work if the source and target files are located on
       different file systems. In order to deal with this contingency,
       logback will resort to renaming by copying if all following three
       conditions are met:</p>
    
       <ol>
         <li>quick renaming fails, </li>
         <li>source and destination files for the rename are on different
         file systems,
         </li>
    
         <li>the host JVM platform runs Java 7 or later.</li>
       </ol>
    
       <p>The code for determining the file system of a file requires Java
       7. No rename by copying will be performed on Java 6 or earlier.</p>
       
    
      <!-- ============================================================= -->
      <h3 class="doAnchor" name="fwrp_parentFileName_not_set">The <span
      class="option">File</span> property must be set before
      <code>FixedWindowRollingPolicy</code>    
      </h3>
    
      <p>The <span class="option">File</span> property is mandatory with
      <code>FixedWindowRollingPolicy</code>. Moreover, the <span
      class="option">File</span> option must be set before the
      <code>FixedWindowRollingPolicy</code> element.
      </p>
          
      <p>Refer to the logback manual on
      <a href="manual/appenders.html#FixedWindowRollingPolicy">
        FixedWindowRollingPolicy </a> for more information.
      </p>
    			
      
      <!-- ============================================================= -->
      <h3 class="doAnchor" name="tbr_fnp_prudent_unsupported">Prudent mode
      is not supported with <code>FixedWindowRollingPolicy</code>.
      </h3>
    
      <p>Given that <code>FixedWindowRollingPolicy</code> performs
      multiple file rename operations during roll over, and that these
      operations cannot be guaranteed to be safe in a multi-JVM context,
      prudent mode is not allowed in conjunction with a
      <code>FixedWindowRollingPolicy</code>.
      </p>
    
      
      
      <!-- ============================================================= -->
      <h3 class="doAnchor" name="syslog_layout">SyslogAppender does not
      admit a layout.
      </h3>
    
    
      <p>Given that the format of a syslog request follows strict rules,
      you cannot freely specify the layout to be used with
      SyslogAppender. However, you can use <span
      class="option">SuffixPattern</span> option instead to influence the
      contents of the message sent to the syslog daemon.
      </p>
      
      <p>For more information on SyslogAppender please refer to the <a
      href="manual/appenders.html#SyslogAppender">its documentation.</a>
      </p>
    
      
    
      <!-- ============================================================= -->
      <h3 class="doAnchor" name="1andOnly1">Only and only one appender can
      be nested the &lt;sift> element in
      <code>SiftingAppender</code>.</h3>
      
      <p>SiftingAppender admits one and only one nested appender. 
      </p>
      
    
      <!-- ============================================================= -->
      <h3 class="doAnchor" name="ifJanino">Could not find Janino library
      on the class path. Skipping conditional processing.
      </h3>
      
      <p><a href="manual/configuration.html#conditional">Conditional
      processing</a> in configuration files requires the <a
      href="http://docs.codehaus.org/display/JANINO/Home">Janino
      library</a>.  See the <a href="setup.html#janino">setup
      instructions</a> for adding Janino to your class path.
      </p>
    
      <!-- ============================================================= -->
      <h3 class="doAnchor" name="block">As of logback version 0.9.28,
      JaninoEventEvaluator expects Java blocks.
      </h3>
    
      <p>As of logback version 0.9.28, JaninoEvaluator expects Java
      "block", i.e. the body of a method. In previous versions only
      boolean expressions were allowed. For backward compatibility
      reasons, whenever logback sees a boolean expression it will attempt
      to convert it to a block by prefixing the expression with "return"
      and suffixing it with a semicolon.
      </p>
    
      <p>Boolean expressions can quickly become hairy. For example, the
      following boolean expression is rather difficult to grok.
    </p>
    
      <pre class="prettyprint source"> !logger.startsWith("org.apache.http")
      ||
      ( logger.equals("org.apache.http.wire")  &amp;&amp;
           (mdc != null &amp;&amp; mdc.get("entity") != null
             &amp;&amp;
           ((String) mdc.get("entity")).contains("someSpecialValue"))
           &amp;&amp;
         !message.contains("someSecret")
      )</pre>
    
      <p>whereas as its Java block equivalent is considerably easier to
      follow.</p>
    
    <pre class="prettyprint source">if(logger.startsWith("org.apache.http"))
      return true;
    
    if(mdc == null || mdc.get("entity") == null)
      return false;
    
    String payee = (String) mdc.get("entity");
    
    if(logger.equals("org.apache.http.wire") &amp;&amp;
      payee.contains("someSpecialValue") &amp;&amp;
      !message.contains("someSecret")) {
      return true;
    }
    
    return false;</pre>
    
       <p>
       </p>
       
       <!-- ============================================================= -->
       <h3 class="doAnchor" name="missingRightParenthesis">In a conversion
       pattern, opened parenthesis must be closed.
       </h3>
       
       <p>In conversion patterns, <a
       href="manual/layouts.html#Parentheses">parentheses are special</a>
       because they are treated as grouping tokens. If a parenthesis
       character needs to be viewed as a literal, it needs to be escaped
       by preceding each parenthesis with a backslash. As in,
       <b>\(</b>%d{HH:mm:ss.SSS} [%thread]<b>\) </b>.
       </p>
      
    
       <!-- ============================================================= -->
       <h3 class="doAnchor" name="appender_order">Appenders must be
       definied before they are referenced.
       </h3>
       
       <p>In a configuration file, at the point where an appender is
       referenced by name, it must be defined earlier in the configuration
       file. Referencing an appender defined later in the file is not
       allowed. Below are examples of correct and incorrect order of
       definition and referece.
       </p>
    
    
      <p>Below is an example of a correct ordering, where appender
      definition precedes references made to it.
      </p>
    
      <p class="green bold">CORRECT ORDER</p>
      <pre class="prettyprint source">&lt;configuration>
      <b>&lt;!-- definition of appender STDOUT --></b>
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        &lt;encoder>
          &lt;pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;!-- appender referenced after it is defined -->
        <b class="big">&lt;appender-ref ref="STDOUT"/></b>
      &lt;/root> 
    &lt;/configuration></pre>
    
      <p>Below is an example of an incorrect ordering, where appender
      definition follows references made to it.
      </p>
    
       <p class="red bold">INCORRECT ORDER</p>
       <pre class="prettyprint source">&lt;configuration>
      &lt;root level="DEBUG">
        &lt;!-- appender INCORRECTLY referenced before it is defined -->
        <b class="big">&lt;appender-ref ref="STDOUT"/></b>
      &lt;/root>
    
      <b>&lt;!-- definition of appender STDOUT --></b>
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        &lt;encoder>
          &lt;pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    &lt;/configuration>
       </pre>
    
      <!-- =========================================================== -->
    
      <h3 class="doAnchor" name="remote_no_host">No remote host or address
      is set for <code>SocketRemote</code>
        
      </h3>
    
      <p>A remote host or address is mandatory for SocketRemote. </p>
      <p>You can specify the remote host in the configuration file
      as follows.
      </p>
      
      <pre class="prettyprint source">&lt;remote class="ch.qos.logback.classic.net.SocketRemote">
      ...
      &lt;host>127.0.0.1&lt;/host>
      ...
    &lt;/remote&gt;</pre>
    
    
      
    
      <!-- ============================================================= -->
    
      <h3 class="doAnchor" name="socket_no_port">No remote port is set for
      <code>SocketRemote</code>    
      </h3>
        
      <p>A remote port is mandatory for SocketRemote.</p>
          
      <p>You can specify the remote port in the configuration file
      like this:
      </p>
          
      <pre class="prettyprint source">&lt;remote class=&quot;ch.qos.logback.classic.net.SocketRemote&quot;&gt;
      ...
      &lt;port>4560&lt;/port>
      ...
    &lt;/remote&gt;</pre>
            
    
    
      <script src="templates/footer.js" type="text/javascript"></script>
      </div>
    </body>
    </html>
    ���logback_1.0.13/logback-site/src/site/pages/demo.html������������������������������������������������0000644�0001750�0001750�00000050505�12136042147�022171� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Logback Demo</title>
        <link rel="stylesheet" type="text/css" href="css/common.css" />
        <link rel="stylesheet" type="text/css" href="css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="css/_print.css" media="print" />
      </head>
      <body>
        <script type="text/javascript">prefix=''; </script>
    
        <script src="templates/header.js" type="text/javascript"></script>
        <div id="left">
          <script src="templates/left.js" type="text/javascript"></script>
        </div>
        <div id="content">
          
    	
        <h2>Logback Demo</h2>
    
        <p>Welcome to the logback demo! This document will take you through
        a tour of some of logback's major features.
        </p>
        
        <h3>Installation</h3>
    
        <p> First, please download the logback demo. You will need to
        install a <a href="http://git-scm.com/">git</a>
        client and issue the following command on a console:
        </p>
      
        <p class="source">git clone git://github.com/qos-ch/logback-demo.git logback-demo</p>
    
        <p>This will retrieve a copy of the logback demonstration
        web-application to a directory called <em>logback-demo</em>. The
        logback demo can be packaged as a <em>war</em> file and deployed
        to an application server. We strongly recommend the use of <a
        href="http://maven.apache.org/">Maven</a> to accomplish this task,
        since it takes a single command in order to compile, package and
        run this demo.
        </p>
    
        <p>	Using Maven, let's package the files and run the demo for the first
        time.  From the <em>logback-demo</em> directory, issue the following
        command:
        </p>
    
        <div class="source"><pre>mvn package jetty:run</pre></div>
        
        <p>Then, visit <a
        href="http://localhost:8080/">http://localhost:8080/</a>
        to view the main page of the logback demo.
        </p>
    
        <h3>Logback-classic</h3>
    
        <p>By default (or as packaged), logback-demo configures
        logback-classic with two appenders: a <code>ConsoleAppender</code>
        and a <code>RollingFileAppender</code>. The
        <code>RollingFileAppender</code> sends logging events to a file
        called <em>logFile.log</em> and will rollover the active file
        every minute. The old file will be renamed and compressed to a
        <em>zip</em> file. The <code>ConsoleAppender</code> will output
        the logging requests to the console, and shorten the logger names
        to gain space on the console window, without loss of
        legibility. For example,
        <code>ch.qos.logback.demo.prime.NumberCruncherImpl </code> will be
        abbreviated as <code>c.q.l.d.prime.NumberCruncherImpl</code>.
        </p>
    
      <p>We highly encourage you to study the <em>logback.xml</em>
      configuration file located under the <em>src/main/resources/</em>
      folder. You might want to keep this file open in an editor window,
      since we will modify its contents throughout the demo.
      </p>
    
      <p>Let us now visit the <em>ViewStatii</em> page, via the navigation
      menu on the left hand side of your browser's window. This page
      contains the content of the <code>Status</code> objects that were
      created up until now. <code>Status</code> objects are a part of
      logback's internal reporting framework. They allow you to see what
      is going on inside logback, and check that a configuration file has
      been parsed correctly, or that rollovers occur as expected.
      </p>
    
      <p>You should be seeing log messages printed on the console and the
      contents of "logFile.log" file rolled over every minute.
      </p>
    
      <p>If you visit the <em>View logs</em> page (by clicking on the link
      located in the menu on the left), you should see it has no content. Let
      us change that by uncommenting <strong>two</strong> parts in the
      config file.</p>
    
      <p>Remove the comments around </p>
    
      <p class="source">&lt;!-- Basic Cyclic buffer
    &lt;appender name="CYCLIC" class="ch.qos.logback.core.read.CyclicBufferAppender">
      &lt;MaxSize>512&lt;/MaxSize>
    &lt;/appender>
    --&gt;</p>
      <p>and around</p>
    
      <p class="source">&lt;!-- Part I: Basic Cyclic buffer
    &lt;appender-ref ref="CYCLIC" />
    --&gt;</p>
    
      <p>The <code>&lt;appender-ref></code> element found at the
      end of the configuration file links an appender to a given logger,
      in this particular case the root logger.
      </p>
    
      <p>A <code>CyclicBuffer</code> keeps track of the incoming logging event
      stream in a <a
      href="http://en.wikipedia.org/wiki/Circular_buffer">circular
      buffer</a> for later display. After having removed the comments
      around the two element/s shown above, reload the logback-demo
      web-application by exiting the previous "mvn" command with
      <em>CTRL-C</em> and issuing it again:
      </p>
    
      <p class="source">mvn package  jetty:run</p>
    
      <p>This time the <em>View logs</em> page should have contents.</p>
    
      <img src="images/cyclicView.png" alt="view logs"/>
    
    
      <p>By virtue of <code>CyclicBufferAppender</code>, this page can
      fetch the last events and present them through a servlet. We see
      that every ten seconds a line is added to the logs. The formatting
      of this page is made with a <code>HTMLLayout</code>. This component
      creates a table containing logging events, based on a pattern that
      describes the information you wish to see in the table.
      </p>
    
      <p>Having the logs cluttered with repetitive
      <em>Howdydy-diddly-ho</em> messages is wasteful. We can get rid of
      them with an appropriate filter. Uncomment the block entitled
      <em>Cyclic buffer with Evaluator</em>. You should then comment the
      block entitled "Basic Cyclic buffer" that we uncommented
      earlier.</p>
    
      <p>Let's take a look at the filter we've just added: </p>
    
    <p class="source">&lt;filter class="ch.qos.logback.core.filter.EvaluatorFilter">
      &lt;evaluator name="loggingTaskEval">
        &lt;expression>
          <b>logger.getName().contains("LoggingTask") &amp;amp;&amp;amp;
          message.contains("Howdydy-diddly-ho") &amp;amp;&amp;amp;
          (timeStamp - event.getStartTime()) >= 20000</b>
        &lt;/expression>
      &lt;/evaluator>
      &lt;OnMatch>DENY&lt;/OnMatch>
    &lt;/filter></p>
    
      <p>The <code>&lt;expression></code> element uses the familiar
      Java language syntax. It checks that the name of the logger contains
      the String <em>LoggingTask</em>, but also that its message contains
      the string <em>Howdydy-diddly-ho</em>.  Moreover, in order to be
      sure that the <em>Howdydy-diddly-ho</em> task actually works, we add
      a last condition which checks that that at least 20 seconds have
      elapsed after application launch. The variable references in the
      expression, namely (<code>logger</code>, <code>message</code> and
      <code>event</code>) are implicitly made available by logback.  The
      <code>&lt;OnMatch></code> element lets the user specify the filter's
      behaviour once the expression matched (evaluated to true).
      </p>
    
      <p>After a restart, the <em>View logs</em> page will shows the
      <em>Howdydy-diddly-ho</em> logs, but only for the first 20
      seconds. If you wish to see new logging events to be shown on the
      "View logs" page, then visit the "Prime number" page.
      </p>
    
      <h4>Turbo Filters</h4>
    
      <p>Logback supports a special category of filters called
      TurboFilters.  <code>TurboFilter</code> objects are ultra-fast,
      context-wide filters. They can be very useful by setting
      context-wide (i.e. global) conditions for enabling or disabling
      logging events.
      </p>
    
      <p>Remove the comments around the block entitled "TurboFilter: MDC
      value".</p>
    
      <p class="source">&lt;turboFilter class="ch.qos.logback.classic.turbo.MDCFilter">
      &lt;MDCKey>username&lt;/MDCKey>
      &lt;Value>sebastien&lt;/Value>
      &lt;OnMatch>ACCEPT&lt;/OnMatch>
    &lt;/turboFilter></p>
    
    
      <p>This <code>&lt;turboFilter></code> element adds a
      <code>TurboFilter</code> to the logging context which will enable
      events if the MDC contains a key named "username" set to the value
      "sebastien". The logback-demo application contains a <a
      href="http://java.sun.com/products/servlet/Filters.html">servlet
      filter</a> which will set the MDC key "username" with the name of
      the currently logged in user.</p>
    
    
      <p>For the purpose of this demo, let us disable all logging by
      setting the root logger's level to <code>OFF</code>.
      </p>
    
      <p class="source">&lt;root>
      &lt;level <b>value="OFF"</b>/>
      ...
    &lt;/root></p>
    
      <p>Now restart the server as before.</p>
    
      <p>Once on the main demo webpage again, perform a number of actions
      (e.g. calculate a few prime numbers) and visit the <em>View
      logs</em> page. The table should be empty.
      </p>
    
      <p>Now login to the logback-demo web-application with the
      username <em>sebastien</em> and perform a few prime
      computations. The <em>View logs</em> page should show the logging
      events that were generated. Moreover, each logging event will have
      an MDC field associated with the name of the logged in user, in this
      case, sebastien. Please log off before continuing the demo, using
      the <em>logout</em> button on the left.
      </p>
    
     <img src="images/turboFilterForMDC.png" alt="mdc filters"/>
    
     <h4>Parameterized logging</h4>
    
     <p><a
     href="http://www.slf4j.org/faq.html#logging_performance">Parameterized
     logging </a> is not a logback feature per se. It is part of
     SLF4J. Usually, a logging request is issued as follows:
     </p>
    
    <div class="source"><pre>logger.debug("Hello, my name is" + username + ", I am " + age + " years old.");</pre></div>
    
      <p>In the above call, the cost of constructing the message of type
      String is borne even if the log request is disabled. 
      </p>
    
      <p>SLF4J offers the following alternative:
      </p>
    
    <div class="source"><pre>logger.debug("Hello, my name is {}, I am {} years old", username, age);</pre></div>
    
      <p>In this alternative, the final log message will be formatted only
      if the log statement is enabled.
      </p>
    
      <p>At present, let us see what kind of gain we can expect from this
      alternative approach. First, go to the <em>Prime number</em> page
      and compute factors for integers of your choice. Check the time it
      takes to compute the results. To see a clearer difference between
      the two formatting methods, you might want to try the two big
      integers that are listed below the prime number textbox. Jot down
      the time it takes to compute the result.
      </p>
    
      <p>Now let us edit the <code>NumberCruncherImpl</code> class in
      order to use parameterized logging.  You will find this class in the
      <em>src/main/java/ch/qos/logback/demo/prime/</em> directory. Comment
      line 54 (doing unconditional message concatenation) and uncomment
      line 55 (parameterized logging). Restart the server with <em>mvn
      package jetty:run</em> and re-run the factorization you tried
      beforehand.
      </p>
    
      <p>The time required to complete the computation should be much lower
      this time. Remember that we have turned off all logging in the
      previous step of this demo. In the initial version, we were
      constructing the message (<em>"Trying "+i+" as a factor."</em>) each
      time a factor was tested.  With the parameterized logging, the
      construction of the message was postponed and, since logging was
      turned off, never done. Thus, parameterized logging can
      significantly reduce the cost of disabled log statements.
      </p>
    
      <h4>Markers</h4>
    
      <p>You can color log statements with <em>markers</em>. Markers are
      part of the SLF4J API. If you look at the LoggingTask class (part of
      logback-demo) which includes the <em>Howdydy-diddly-ho</em> log
      statement, you should see that it is bound to a marker named
      <code>HOWDY</code> marker.  If you wish to drop log statements
      bearing the <code>HOWDY</code> marker, you can use this
      <code>TurboFilter</code> to do so:
      </p>
    
      <p class="source">&lt;turboFilter class="ch.qos.logback.classic.turbo.MarkerFilter">
        &lt;Name>HOWDY_FILTER&lt;/Name>
        &lt;Marker>HOWDY&lt;/Marker>
        &lt;OnMatch>DENY&lt;/OnMatch>
    &lt;/turboFilter> </p>
      
      <p>After you have set the root logger's level back to <em>DEBUG</em>
      and uncommented the MarkerFilter block in <em>logback.xml</em>,
      restart the server.
      </p>
    
    
      <p>The logs bearing the <em>Howdydy-diddly-ho</em> message should no
      longer appear as they are associated with a HOWDY marker. You can check
      that by visiting the <em>View Logs</em> page.
      </p>
    
      <h2>Logback Access</h2>
    
      <p>Access logging is another important feature offered by
      logback. By default, the logback-demo web-application is configured
      so that each time you access it, an access log is printed on the
      console. The details of access logs are configured by the
      <em>logback-access.xml</em> file located under the <em>src/etc/</em>
      directory.
      </p>
    
      <p>Here is a rather minimal configuration for logback-access:</p>
    
    <div class="source"><pre>&lt;configuration>
     
      &lt;appender name="STDOUT"
        class="ch.qos.logback.core.ConsoleAppender">
        &lt;layout class="ch.qos.logback.access.PatternLayout">
          &lt;Pattern>%h %l %u %t \"%r\" %s %b&lt;/Pattern>
        &lt;/layout>
      &lt;/appender>
      
      &lt;appender-ref ref="STDOUT" />
      
    &lt;/configuration></pre></div>
    
      <p>Note that logback-classic and logback-access are configured via
      different files: <em>logback.xml</em> and
      <em>logback-access.xml</em> respectively. If you wanted to turn
      off logging for logback-classic by setting the level of the root
      logger to OFF, logback-access would be unaffected by this change.
      </p>
    
      <p>To see the logs produced by logback-access, just visit a few
      pages and look at your console. The information contained in each
      line has been specified in the configuration file. The
      <code>ConsoleAppender</code> named <em>STDOUT</em> contains a
      <code>PatternLayout</code> component.  This layout component is
      used in logback-classic to display either the message, logger name
      or level of the request, but in logback-access it is used to display the
      request method, requested page, status code and many other fields.
      </p>
    
    <p>Here is a sample output for this appender.</p>
    
    <div class="source"><pre>127.0.0.1 - - 22/01/2007:14:35:40 +0100 GET /logback-demo/ViewStatii.do HTTP/1.1 200 3660
    127.0.0.1 - - 22/01/2007:14:35:41 +0100 GET /logback-demo/index.jsp HTTP/1.1 200 2389
    127.0.0.1 - - 22/01/2007:14:35:42 +0100 GET /logback-demo/lastLog/ HTTP/1.1 200 948
    127.0.0.1 - - 22/01/2007:14:35:42 +0100 GET /logback-demo/index.jsp HTTP/1.1 200 2389
    127.0.0.1 - - 22/01/2007:14:35:43 +0100 GET /logback-demo/prime.jsp HTTP/1.1 200 1296
    127.0.0.1 - - 22/01/2007:14:35:44 +0100 GET /logback-demo/index.jsp HTTP/1.1 200 2389
    127.0.0.1 - - 22/01/2007:14:35:45 +0100 GET /logback-demo/lottery.jsp HTTP/1.1 200 1209
    127.0.0.1 - - 22/01/2007:14:35:46 +0100 GET /logback-demo/index.jsp HTTP/1.1 200 2389
    127.0.0.1 - - 22/01/2007:14:35:48 +0100 GET /logback-demo/reload.jsp HTTP/1.1 200 1335
    127.0.0.1 - - 22/01/2007:14:35:49 +0100 GET /logback-demo/index.jsp HTTP/1.1 200 2389
    127.0.0.1 - - 22/01/2007:14:35:54 +0100 GET /logback-demo/login.jsp HTTP/1.1 200 1214
    127.0.0.1 - - 22/01/2007:14:35:55 +0100 GET /logback-demo/Logout.do HTTP/1.1 200 1000</pre></div>
    
      <h4>Filtering</h4>
    
      <p>In this next part, we are going to add some information to the
      console.  Let us imagine that we want to log the numbers that are
      tried on the <em>Lottery</em> page. We will need a second
      <code>ConsoleAppender</code> that will only print a given information
      (e.g. the guessed number, along with some hints about the player). The
      appender will also have to print that information only when a certain
      page is accessed.
      </p>
    
      <p>The necessary configuration lines are listed below.
      </p>
    
      <p class="source">&lt;appender name="STDOUT_LOTTERY"
      class="ch.qos.logback.core.ConsoleAppender">
      &lt;filter class="ch.qos.logback.core.filter.EvaluatorFilter">
        &lt;evaluator name="lotto_eval">
          &lt;Expression>
            url.matches(event.getRequestURL().toString())
          &lt;/Expression>
          &lt;matcher name="url">
            &lt;regex>Lottery.do&lt;/regex>
            &lt;caseSensitive>false&lt;/caseSensitive>
          &lt;/matcher>
        &lt;/evaluator>
        &lt;OnMatch>ACCEPT&lt;/OnMatch>
        &lt;OnMismatch>DENY&lt;/OnMismatch>
      &lt;/filter>
      &lt;layout class="ch.qos.logback.access.PatternLayout">
        &lt;Pattern>
          LOTTERY: %A [%r] Guess=%reqParameter{guessed_number}
        &lt;/Pattern>
      &lt;/layout>
    &lt;/appender></p>
    
      <p>This appender will use a <code>PatternLayout</code> to format its
      output.  The <em>%reqParameter</em> conversion word is used to
      extract the guessed number from the request, and print it.
      </p>
    
      <p>It also uses an <code>EvaluatorFilter</code> that will prevent
      the appender to display anything when the access' request url does
      not match the given expression. You can see that it is easy to
      specify a RegExp, name it and use it in the expression that will be
      evaluated. In that case, we only entered the name of the
      <em>lottery.do</em> action.
      </p>
    
      <p>Let us uncomment the two elements with the <em>Lottery to
      Console</em> comments and restart the server. Now, try to play the
      lottery. You will see more lines in the Console that you've seen until
      now. At every try, logback will produce a log as shown below:
      </p>
    
      <p class="source">LOTTERY: 192.168.1.6 [POST /logback-demo/Lottery.do HTTP/1.1] Guess=321</p>
    
      <h4>Sending emails</h4>
    
      <p>Logback-access provides several components that are usually used
      by the classic module. For example, a <code>SMTPAppender</code> can
      be used to send an email when a specific event occurs. Here, we will
      contact the lottery administrator each time a winner is detected. To
      achieve this, we will add a <code>SMTPAppender</code> to the
      existing configuration. Please uncomment the part of
      <em>logback-access.xml</em> named <em>Lottery to Email</em>. Do not
      forget to uncomment the <em>appender-ref</em> element at the end of
      the configuration file that references the <em>SMTP</em> appender.
      In the appender element, notice the use of a
      <code>URLEvaluator</code>. This evaluator allows us to specify
      one or more URLs that are to be watched. When one of them is
      accessed, an email is sent.
      </p>
    
      <p>A reload of the configuration has to be done before we can test
      this new component. Once done, try to play the lottery with the
      number <em>99</em>.  You should see a "congratulation" message but,
      most importantly, the specified recipients should have a new mail in
      their mailbox. The content of the email is a nicely formatted HTML
      table with information about the accesses that occurred before
      the triggering event.
      </p>
    
      <h3>JMX</h3>
    
      <p>Logback publishes several components via JMX. This allows you to
      see the status of certain objects, and change several configuration
      parameters.  Publishing logback's components via JMX is possible
      with Jetty and Tomcat. For more information about the JMXConfigurator
      please refer to the <a href="manual/jmxConfig.html">relevant
      chapter</a> in the manual.
      </p>
    
      <p>Let us test setting levels using the configurator.
      The <em>Prime Number</em> page requests two types of logs. When the
      calculation checks if a number is a factor, a <em>DEBUG</em> log is
      displayed. When the calculation has found a factor, a <em>INFO</em>
      log is displayed.
      </p>
    
      <p>Let us first set the level of the logger named
      <em>ch.qos.logback.demo.prime</em> to <em>DEBUG</em>. Run a prime
      calculation directly, without restarting the server. The <em>View
      logs</em> page should show the <em>DEBUG</em> and <em>INFO</em> logs.
      </p>
      
      <p>Now, if you set the level of the <em>ch.qos.logback.demo.prime</em>
      logger to <em>INFO</em>, and run a prime calculation again, you should
      not see the <em>DEBUG</em> level logs anymore.
      </p>
      
      <p>This demo of logback is now over. Do not hesitate to play around
      with the configuration files.  You might want to check the <a
      href="http://logback.qos.ch/documentation.html"> logback documentation
      page</a> for more information about any component you'd like to test.
      </p>
    	
      <script src="templates/footer.js" type="text/javascript"></script>
    </div>
    </body>
    </html>
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/images/��������������������������������������������������0000755�0001750�0001750�00000000000�12203357067�021624� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/images/qoslogo.gif���������������������������������������0000644�0001750�0001750�00000003141�11377016712�023775� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89aj����̙̲3L̸lř0y̿<ε̟&?ƿY̅ױxR_̥$H,ž̳aӳۮl9зǺȻ̬߭a˸̒F߬`λý̹/زy#G1ʷְwʹ=ޫ_SGI٭jUT;ʷڭk»Ѳۯlݱnc0Ҳ=Ź$�f������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������!���,����j����'	8@
     X�a‚JHŋ3jx`
    #>`ႈ$˗0+& C䬰"JL8ѣ4p�EʏHPFM�Djݚ.VHUOX]+ANʅJ%�,-
    sQa0HAI#K*p A�ϟ� C? !ƾ"@L[rTH2D]{�#qIfC.y&:��سgY5O^�X�$!`R�V.)0PqIbwuA
    �\p}'"UdUx Q*W�֑`@@p!HEeB&V)'3TH@2
     hcr)* $-4$I tI刁_F$VD%e^h$|vt!0SEeBIfNtD$ߍ!~!/hm@}XTFʉ&;�Pѩx7Pd,0#6$_	fDP`j:ldĬ.$0mx
    t@HT"@<CVظf;J7ɕZuDgL	P$A.-K_>�gd:B
    xgE@Dcs8TOt�#H4YVP@PmqBaU-@DρAu!lf_-u+9\>Ptn$/E`B)D܂@$,@p�B4�;�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/recipes/�������������������������������������������������0000755�0001750�0001750�00000000000�12203357067�022011� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/recipes/index.html���������������������������������������0000644�0001750�0001750�00000003017�11674464354�024020� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Logback Recipes</title>
        <link rel="stylesheet" type="text/css" href="../css/common.css" />
        <link rel="stylesheet" type="text/css" href="../css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="../css/_print.css" media="print" />
    
      </head>
      <body>
        <script type="text/javascript">prefix='../';</script>
        <script src="../templates/header.js" type="text/javascript"></script>
        <div id="left">
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="../templates/left.js" type="text/javascript"></script>
        </div>
        <div id="content">
          
          <h2>Real-world inspired logback recipes</h2>
          
          <div>
            <p>Here is a list of logback-related recipes inspired by
            real-world use cases:</p>
    
            <ul>
              <li><p><a href="emailPerTransaction.html">Triggering an
            email containing the isolated logs of selected
            transactions</a></p></li> </ul>
    
    
            <ul>
              <li><p><a href="captureHttp.html">Capture incoming HTTP
              requests and outgoing responses</a></p></li>
            </ul> 
          </div>
    
          <script src="../templates/footer.js" type="text/javascript"></script>	
        </div>
      </body>
    </html>
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/recipes/captureHttp.html���������������������������������0000644�0001750�0001750�00000025154�11616526116�025211� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Capturing HTTP communications</title>
        <link rel="stylesheet" type="text/css" href="../css/common.css" />
        <link rel="stylesheet" type="text/css" href="../css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="../css/_print.css" media="print" />
        <link rel="stylesheet" type="text/css" href="../css/prettify.css" media="screen" />
    
      </head>
      <body onload="prettyPrint()">
        <script type="text/javascript">prefix='../';</script>
        <script type="text/javascript" src="../js/prettify.js"></script>
        <script src="../templates/header.js" type="text/javascript"></script>
        <div id="left">
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="../templates/left.js" type="text/javascript"></script>
        </div>
        <div id="content">
          
          <h2>Capturing incoming HTTP requests and outgoing responses</h2>
    
          <p>Logback ships with a module called logback-access which
          integrates with Servlet containers such as Jetty or Tomcat to
          provide rich and powerful HTTP-access log functionality.
          </p>
    
          <p>When diagnosing issues in a web-application, it is very
          helpful to be able to capture incoming HTTP requests and the
          outgoing response. This is particularly true for a
          web-applications offering web-services using <a
          href="http://en.wikipedia.org/wiki/SOAP">SOAP</a>. Having access
          to the "raw" SOAP message makes it much easier to diagnose
          errors caused by misspelled namespaces or missing fields.
          </p>
    
          <p>Certain Web-Service stacks can be easily configured to log
          SOAP traffic. For instance, with JBoss' Web-services stack, you
          can set the level of the
          <code>org.jboss.ws.core.MessageTrace</code> logger to
          <code>TRACE</code> in order to enable SOAP message tracing as <a
          href="http://community.jboss.org/wiki/JBossWS-Log4j">documented
          in the Jboss wiki</a>.
          </p>
    
          <p>If you are using a different Web-Services stack, e.g. Metro,
          it might not be very convenient to enable SOAP message
          tracing. In that case, and assuming your application is deployed
          on Tomcat, you might want to enable <a
          href="http://tomcat.apache.org/tomcat-7.0-doc/config/filter.html#Request_Dumper_Filter">RequestDumperFilter</a>.
          Unfortunately, not only is <code>RequestDumperFilter</code>
          rather hard to install, it does not dump the payload of the
          incoming request nor the outgoing response.
          </p>
    
          <p>With the help of <a href="../access.html#teeFilter">
          logback-access its TeeFilter</a> you can capture the full input
          and output for each request as explained below.
      
          </p>
    
          <h3><a name="capturing" href="#capturing">Capturing</a></h3>
    
          <p>The <code>TeeFilter</code>, as any other servlet filter,
          needs to be declared in your web-application's <em>web.xml</em>
          file. Here is the declaration to add to your web-application's
          <em>web.xml</em> file.
          </p>
    
        <pre class="prettyprint source">&lt;filter&gt;
      &lt;filter-name&gt;TeeFilter&lt;/filter-name&gt;
      &lt;filter-class&gt;ch.qos.logback.access.servlet.TeeFilter&lt;/filter-class&gt;
    &lt;/filter&gt;
    
    &lt;filter-mapping&gt;
      &lt;filter-name&gt;TeeFilter&lt;/filter-name&gt;
      &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
    &lt;/filter-mapping&gt;</pre>
    
          <p>The <code>TeeFilter</code> requires the logback-access module
          to be installed in your web-server. The installation of
          logback-access is explained <a
          href="../access.html">elsewhere</a>. Once you have installed
          logback-access into your Servlet container, e.g. Tomcat or
          Jetty, you can configure logback-access according to your wishes
          with the help of a configuration file named
          <em>logback-access.xml</em>.
          </p>
          
          <p>Here is a sample <em>logback-access.xml</em> configuration
          file which will output the full contents of the request and
          response on the console.
          </p>
    
      <pre class="prettyprint source">&lt;configuration&gt;
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"&gt;
        &lt;encoder&gt;      
          &lt;pattern&gt;<b>%fullRequest</b>%n%n<b>%fullResponse</b>&lt;/pattern&gt;
        &lt;/encoder&gt;
      &lt;/appender&gt;
    	
      &lt;appender-ref ref="STDOUT" /&gt;
    &lt;/configuration&gt;</pre>
          
         <p>For the list of conversion words supported by logback-access'
         <code>PatternLayout</code> please refer to <a
         href="manual/layouts.html#AccessPatternLayout">its documentation</a>.
         </p>
    
         <p>Here is the output generated when accessing the <a
         href="../demo.html">logback-demo</a> application configured as shown
         above, yields:</p>
    
         <p class="source"><b>GET /logback-demo/index.jsp HTTP/1.1</b>
    Host: localhost:8080
    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8) Gecko/20070312 Firefox/1.5.0
    Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8
    Accept-Language: en-us,en;q=0.5
    Accept-Encoding: gzip,deflate
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
    Keep-Alive: 300
    Connection: keep-alive
    Referer: http://localhost:8080/logback-demo/login.jsp
    Cookie: JSESSIONID=15c7tqi9ehlwk;  OID324nkzcmr=null; OID32862zgoa=null; 
    
    
    
    <b>HTTP/1.1 200 OK</b>
    Content-Type: text/html; charset=iso-8859-1
    Expires: Thu, 01 Jan 1970 00:00:00 GMT
    Set-Cookie: JSESSIONID=bgebt99ce9om;path=/logback-demo
    
    
    &lt;html&gt;
    &lt;head&gt;
            &lt;LINK REL=StyleSheet HREF="css/pk.css" /&gt;
    &lt;/head&gt;
    &lt;body&gt;
    
    &lt;h2&gt;Logback demo center&lt;/h2&gt;
    
    [snip, so that text is reasonably sized]</p>
    
    <p>&nbsp;</p>
    
          <h3><a name="disabling" href="#disabling">Disabling
          <code>TeeFilter</code> in the production environment</a></h3>
    
          <p>Due to its intrusive nature, <code>TeeFilter</code> can slow
          down performance. Moreover, although we have fixed all currently
          known bugs, <code>TeeFilter</code> has broken otherwise
          correctly behaving applications in the past. Thus, while
          extremely useful during problem hunting, we do not recommend
          having <code>TeeFilter</code> active in production systems. In
          order to avoid shipping different code for test and production
          environments, <code>TeeFilter</code> supports includes and
          excludes parameters. <code>TeeFilter</code> will be active if
          the current host is listed in the includes list and absent in
          the excludes list. By special convention, an empty
          <em>includes</em> list is interpreted as to contain all possible
          host names in the universe.
          </p>
          
          <p>Assume we wish to capture HTTP traffic on all hosts except on
          orion and gemini, the hostnames of the the production systems,
          we would write:</p>
    
            <pre class="prettyprint source">&lt;filter>
      &lt;filter-name>TeeFilter&lt;/filter-name>
      &lt;filter-class>ch.qos.logback.access.servlet.TeeFilter&lt;/filter-class>
      &lt;init-param>
        <b>&lt;!-- exclude captures on production systems --></b>
        &lt;param-name><b>excludes</b>&lt;/param-name>
        &lt;param-value>orion, gemini&lt;/param-value>
      &lt;/init-param>
    &lt;/filter>  </pre>
      
          <p>If it is easier to explicitly name the integration machines,
          you could list them in the includes list and omit the excludes
          list.
          </p>
    
          <h3><a name="filtering" href="#filtering">Filtering captured
          requests</a></h3>
    
          <p>Let assume that our web-application is deployed in a
          cluster. The cluster is located behind a load-balancer which
          probes each member of the cluster once or twice a second to
          check whether it is alive. Whenever a member becomes unavailable
          the load-balancer will immediately (well, after at most one
          second) divert traffic from that member.
          </p>
    
          <p>While such a load-balancing strategy will ensure
          high-availability of your web-application, it will also
          seriously pollute the access-logs with the contents of each
          probe made by the load-balancer.
          </p>
    
          <p>We need to a way to filter-out these probes so that they no
          longer contaminate the log output. In other words, we need to
          distinguish probes emanating from the load-balancer from other
          requests. The contents of the probes can give us clues about
          possible distinguishing criteria.</p>
    
          <p>Here is a sample probe as logged by logback-access:</p>
    
          <pre class="source"><b>HEAD</b> /myapp/<b>probe</b> HTTP/1.1
    connection: Close
    host: 192.168.1.1
    
    HTTP/1.1 200 OK
    Expires: Thu, 01 Jan 1970 01:00:00 CET
    X-Powered-By: Servlet 2.4;
    Cache-Control: no-cache
    Pragma: No-cache </pre>
    
          <p>From the above, we can see that the load-balancer probes
          employ the <a
          href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.4">HTTP
          HEAD method</a> instead of the usual GET or POST. We can also
          see that the request URI for the probes contains the string
          "probe".</p>
    
          <p>Here is a <em>logback-access.xml</em> configuration file
          which will deny any <code>AccessEvent</code> where the method is
          HEAD. Note that events are evaluated using
          <code>JaninoEventEvaluator</code> which requires Janino.</p>
    
          <pre class="prettyprint source">&lt;configuration>
      &lt;!-- always a good idea to install OnConsoleStatusListener -->
      &lt;statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />
    
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        &lt;filter class="ch.qos.logback.core.filter.EvaluatorFilter">
          &lt;!-- in the absence of a class attribute the &lt;evaluator> element 
               defaults to ch.qos.logback.access.boolex.JaninoEventEvaluator --&gt;
          &lt;evaluator>
            &lt;expression><b>event.getMethod().equals("HEAD")</b>&lt;/expression>
          &lt;/evaluator>
          &lt;onMismatch>NEUTRAL&lt;/onMismatch>
          &lt;onMatch>DENY&lt;/onMatch>
        &lt;/filter>
    
        &lt;encoder>
          &lt;pattern>%fullRequest%n%n%fullResponse&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;appender-ref ref="STDOUT" />
    &lt;/configuration> </pre>
          
          <script src="../templates/footer.js" type="text/javascript"></script>	
        </div>
      </body>
    </html>
     ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/recipes/emailPerTransaction.html�������������������������0000644�0001750�0001750�00000043704�12136177166�026660� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Email per transaction</title>
        <link rel="stylesheet" type="text/css" href="../css/common.css" />
        <link rel="stylesheet" type="text/css" href="../css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="../css/_print.css" media="print" />
        <link rel="stylesheet" type="text/css" href="../css/prettify.css" media="screen" />
    
      </head>
      <body onload="prettyPrint()">
        <script type="text/javascript">prefix='../';</script>
        <script type="text/javascript" src="../js/prettify.js"></script>
        <script src="../templates/header.js" type="text/javascript"></script>
        <div id="left">
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="../templates/left.js" type="text/javascript"></script>
        </div>
        <div id="content">
          
          <h2>Triggering an email containing the isolated logs of selected
          transactions</h2>
          
          <p>Let Dave and Carol be software QA engineers working at a
          company called Fooware.com. As you might have guessed,
          Fooware.com sells foos. Yes, foos... Let <em>Buscrit</em> be a
          business critical backend system running at Fooware.com. Buscrit
          is called by a number of applications to make business-critical
          transactions of various types.
          </p>
    
          <p>We would like to allow Carol to access the logging data
          generated by Buscrit as conveniently as possible. We could
          assume that Carol has access the log files directly on the
          server where Buscrit runs. However, let us assume that accessing
          the log files is somehow impractical because one or ore more of
          the following conditions holds true:
          </p>
    
          <ol>
            <li>Buscrit runs on multiple hosts and it is difficult to
            identify the host where a particular transaction was
            executed</li>
            <li>Carol does not (or does not wish to) have access to the
            hosts where Buscrit runs
            </li>
            <li>Buscrit is tested by multiple testers, e.g. Dave and Carol
            and others, simultaneously so that it is hard to identify and
            track an individual transaction in the log files
            </li>
          </ol>
    
          <p>Given the above circumstances, let us create a logback
          configuration so that Carol receives an email message at the end
          of every transaction. We will iteratively refine this
          configuration so that Carol will receive an email containing the
          logs of each transaction in isolation and only for the
          transactions she explicitly selects.
          </p>
    
          <h3>Triggering an email message at the end of each transaction</h3>
    
          <p>We will be using <code>SMTPAppender</code> to generate emails
          containing logging data. Please refer to the <a
          href="../manual/appenders.html#SMTPAppender">appropriate section
          of the manual</a> to familiarize yourself with
          <code>SMTPAppender</code> and its properties.
          </p> 
    
          <p>The <a href="demo.html">logback-demo</a> project contains a
          Struts action called <a
          href="http://logback-demo.qos.ch/xref/ch/qos/logback/demo/prime/PrimeAction.html"><code>PrimeAction</code></a>. It
          can factorize integers. Here is the pertinent structure of
          <code>PrimeAction</code>'s code:</p>
    
          <pre class="prettyprint source">package ch.qos.logback.demo.prime;
    
    import org.apache.struts.action.Action;
    ...
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class PrimeAction extends Action {
    
      Logger logger = LoggerFactory.getLogger(PrimeAction.class);
      static Marker SMTP_TRIGGER = MarkerFactory.getMarker("SMTP_TRIGGER");
    
      public ActionForward execute(ActionMapping actionMapping,
                                   ActionForm actionForm, HttpServletRequest request,
                                   HttpServletResponse response) throws Exception {
    
        PrimeForm form = (PrimeForm) actionForm;
    
        Long number = form.getNumber();
        try {
          NumberCruncher nc = new NumberCruncherImpl();
          Long start = System.currentTimeMillis();
          Long[] result = nc.factor(number);
          Long duration = System.currentTimeMillis() - start;
          logger.info("Results computed in {} ms", duration);
    
          ...
        } finally {
          <b>logger.info(SMTP_TRIGGER, "Prime computation ended");</b>
        }
      }
    } </pre>
    
          <p>In a real world application, a transaction would involve
          systems external to the application, e.g. a database or a
          messaging queue. For the sake of this example, let us consider
          each factorization request as a <em>transaction</em>.  At the
          end of each factorization request, i.e. each transaction, the
          logger of the <code>PrimeAction</code> instance is invoked with
          the SMTP_TRIGGER marker and the message "Prime computation
          ended".  We can capitalize on this logging request to clearly
          identify the end of every transaction in order to trigger an
          outgoing email message.
         </p>
    
         <p>Here is a configuration file which uses
         <code>JaninoEventEvaluator</code> to trigger an outgoing email
         for logging event marked with SMTP_TRIGGER.
         </p> 
    
        <pre class="prettyprint
         source">&lt;configuration scan="true" scanPeriod="3 seconds">
    
      &lt;!-- always a good idea to have an OnConsoleStatusListener -->
      &lt;statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />
    
      &lt;appender name="SMTP" class="ch.qos.logback.classic.net.SMTPAppender">
        &lt;smtpHost>NAME_OF_SMTP_HOST&lt;/smtpHost>
        &lt;to>...&lt;/to>                                         
        &lt;from>...&lt;/from>
        &lt;subject>Prime - %mdc{number} by %mdc{userid} &lt;/subject>
        &lt;layout class="ch.qos.logback.classic.html.HTMLLayout">
          &lt;pattern>%date%level%logger{24}%msg&lt;/pattern>
        &lt;/layout>
        
        <b>&lt;evaluator class="ch.qos.logback.classic.boolex.JaninoEventEvaluator"></b>
          <b>&lt;expression></b>
            <b>marker != null  &amp;&amp; marker.contains("SMTP_TRIGGER")</b>
          <b>&lt;/expression></b>
        <b>&lt;/evaluator></b>
      &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="SMTP" /> 
      &lt;/root>
    
    &lt;/configuration></pre>
    
          
    
       <h3>Transaction isolation</h3>
    
       <p>While the previous configuration file will trigger an outgoing
       email message whenever an event is marked with "SMTP_TRIGGER", the
       contents of the message will contain events generated by different
       transactions. With a little effort, we can actually separate events
       belonging to different transactions so that the outgoing email
       triggered at the end of the transaction contains logs from that
       transaction and only that transaction.
       </p>
    
      <p>To isolate a given transaction, there must first be a way to
      distinguish it from other transactions. Typically this would be
      accomplished by putting the unique identifier of the transaction
      into the MDC.
      </p>
    
      <pre class="prettyprint source">String transactionId = ...; // extract id from transaction 
    MDC.put("txId", transactionId); </pre>
    
      <p>In the <a
      href="http://logback-demo.qos.ch/xref/ch/qos/logback/demo/UserServletFilter.html"><code>UserServletFilter</code></a>
      class, this is done by retrieving the id of the session and putting
      it into the MDC under the key "txId".</p>
    
    
        <pre class="prettyprint source">public class UserServletFilter implements Filter {
    
       public void doFilter(ServletRequest request, ServletResponse response,
                           FilterChain chain) throws IOException, ServletException {
    
        HttpServletRequest req = (HttpServletRequest) request;
        HttpSession session = req.getSession();
        MDC.put("txId", session.getId());
        ...
        try {
          // invoke subsequent filters
          chain.doFilter(request, response);
        } finally {
          // always clear the MDC at the end of the request
          MDC.clear();
        }
      }
    }</pre>
    
    
      <p>By setting an appropriate discriminator in SMTPAppender, you can
      can scatter incoming events into different buffers according to the
      value returned by the discriminator. Given that each request session
      is placed under the MDC key "txId", we can use an MDC-based
      discriminator to isolate the logs generated by each transaction.
      </p>
    
      <pre class="prettyprint source">&lt;configuration scan="true" scanPeriod="3 seconds">
    
      &lt;statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />
    
      &lt;appender name="SMTP" class="ch.qos.logback.classic.net.SMTPAppender">
        &lt;smtpHost>NAME_OF_SMTP_HOST&lt;/smtpHost>
        &lt;to>...&lt;/to>                                         
        &lt;from>...&lt;/from>
    
        &lt;smtpHost>NAME_OF_SMTP_HOST&lt;/smtpHost>
        &lt;to>name@some.smtp.host&lt;/to>
        &lt;from>testing@...&lt;/from>
        &lt;subject>Prime - %mdc{number} by %mdc{userid} &lt;/subject>
        &lt;layout class="ch.qos.logback.classic.html.HTMLLayout">
           &lt;pattern>%date%level%logger{24}%msg&lt;/pattern>
        &lt;/layout>
    
        &lt;evaluator class="ch.qos.logback.classic.boolex.JaninoEventEvaluator">
          &lt;expression>
            marker != null &amp;&amp; marker.contains("SMTP_TRIGGER") 
          &lt;/expression>
        &lt;/evaluator>
    
        <b>&lt;discriminator class="ch.qos.logback.classic.sift.MDCBasedDiscriminator"></b>
          <b>&lt;key>txId&lt;/key></b>
          <b>&lt;defaultValue>default&lt;/defaultValue></b>
        <b>&lt;/discriminator></b>
      &lt;/appender>  
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="SMTP" /> 
      &lt;/root>
    &lt;/configuration> </pre>
    
       <p>After starting the logback-demo web-application with the above
       configuration file (with <span class="option">smtpHost</span> and
       <span class="option">to</span> options adapted for my environment)
       on localhost and then visiting the <a
       href="http://localhost:8070/logback-demo/prime.jsp">Prime
       number</a> page to factorize the number 123, I received the
       following email:
       </p>
    
       <img src="images/factorEmail0.png" alt="selective email0"/>
          
       <p>Note that the above email contains the logs generated by the
       factorization of the number 123, without log pollution from any
       other "transaction".
       </p>
    
      <h3>Selective triggering &amp; recipient addressing with transaction isolation</h3>
    
      <p>In a real world scenario, receiving isolated transactions is not
      enough. You would need to trigger outgoing emails only for certain
      users, typically QA engineers such as Dave and Carol. Moreover, you
      would want the emails generated by transaction made by Carol to
      Carol's mailbox and those generated by Dave to Dave's mailbox.</p>
    
      <p>Selective triggering and addressing are two distinct
      problems. Depending on the exact circumstances, there are many ways
      of tackling these two issues. However, for the sake of simplicity,
      let us assume that the SMTP server at Fooware.com accepts <a
      href="http://en.wikipedia.org/wiki/Email_address#Address_tags">address
      tags</a>. Such an SMTP server treats an incoming message sent to
      username+xyz@fooware.com as if it were addressed to
      username@fooware.com, effectively stripping the +xyz part.</p>
    
      <p>Let us further assume that we can somehow extract the email
      address of the user from the contents of her transaction, via a
      database lookup or perhaps some other means. The extracted email
      addressed is placed into the MDC under the key "txEmail".
      </p>
    
      <p>Upon a logging event marked as SMTP_TRIGGER, the following
      configuration file will trigger an email message addressed to the
      value of "%mdc{txEmail}" but only if it contains the string "+log".
      </p>
    
      <pre class="prettyprint source">&lt;configuration scan="true" scanPeriod="3 seconds">
    
      &lt;statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" /&gt;
    
      &lt;appender name="SMTP" class="ch.qos.logback.classic.net.SMTPAppender">
        &lt;SMTPHost>NAME_OF_SMTP_HOST&lt;/SMTPHost>
        <b>&lt;to>%mdc{txEmail}&lt;/to></b>
        &lt;from>&lt;/from>
        &lt;subject>Prime - %mdc{number}&lt;/subject>
    
        &lt;layout class="ch.qos.logback.classic.html.HTMLLayout">
           &lt;pattern>%date%level%logger{24}%msg&lt;/pattern>
        &lt;/layout>
    
        &lt;discriminator class="ch.qos.logback.classic.sift.MDCBasedDiscriminator">
          &lt;key>txId&lt;/key>
          &lt;defaultValue>default&lt;/defaultValue>
        &lt;/discriminator>
    
        &lt;evaluator class="ch.qos.logback.classic.boolex.JaninoEventEvaluator">
          &lt;expression>
            <b>(mdc != null &amp;amp;&amp;amp; mdc.get("txEmail") != null &amp;amp;&amp;amp; </b>
                <b>((String) mdc.get("txEmail")).contains("+log") )</b>
            &amp;amp;&amp;amp;
            (marker != null  &amp;&amp; marker.contains("SMTP_TRIGGER") )
          &lt;/expression>
        &lt;/evaluator>
      &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="SMTP" /> 
      &lt;/root>
    &lt;/configuration>  </pre>
    
         <p>If your particular SMTP server does not handle address tags,
         you can still use them within the evaluator but remove them in
         the recipient address with the help of the <a
         href="../manual/layouts.html#replace">%replace</a> conversion
         word. Here is the relevant configuration snippet:</p>
    
         <pre class="prettyprint source">&lt;appender name="SMTP" class="ch.qos.logback.classic.net.SMTPAppender">
      &lt;to>%replace(%mdc{txEmail}){'\+log', ''}&lt;/to>
      ...
    &lt;/appender></pre>
    
         <p>This replaces any occurrence of the string "+log" within the
         string returned by %mdc{txEmail} with the empty string,
         effectively erasing +log from the recipient address.</p>
    
         <h3>Buffer management in very busy systems</h3>
    
         <p>The solution described so far provides an amazingly flexible
         solution to the initial problem. Indeed, any QA-engineer at
         Fooware.com, say Carol, can have the logs generated by requests
         she makes to Buscrit sent to her automatically by email. All she
         has to do is to suffix the user part in her email address with
         "+log" when she registers with Buscrit.
         </p>
    
         <p>By default <code>SMTPAppender</code> will cap the number of
         buffers it maintains to the value of the <span
         class="option">maxNumberOfBuffers</span> option (64 by default)
         and automatically discards buffers untouched for at least 30
         minutes. While this approach will work nicely in a test
         environment with few transactions, in a very busy production
         system, these buffer management mechanisms will cause Carol to
         receive <a
         href="../manual/appenders.html#bufferManagement">truncated log
         buffers</a>.  </p>
    
         <p>To deal with this problem, we instruct SMTPAppender to discard
         apprioate buffer at the end of each transaction. This is done by
         logging an event marked as "FINALIZE_SESSION". Here is a modified
         version of <code>PrimeAction</code> which marks the end of a
         transaction with "FINALIZE_SESSION".
         </p>
    
         <pre class="prettyprint source">package ch.qos.logback.demo.prime;
    
    <b>import static ch.qos.logback.classic.ClassicConstants.FINALIZE_SESSION_MARKER;</b>
    
    public class PrimeAction extends Action {
    
      Logger logger = LoggerFactory.getLogger(PrimeAction.class);
      static Marker SMTP_TRIGGER = MarkerFactory.getMarker("SMTP_TRIGGER");
      static {
         // markers can hold references to other markers
         <b>SMTP_TRIGGER.add(FINALIZE_SESSION_MARKER);</b>
      }
    
      public ActionForward execute(ActionMapping actionMapping, ... ) throws Exception {
    
        Long number = form.getNumber();
        try {
          ...
        } finally {
          <b>logger.info(SMTP_TRIGGER, "Prime computation ended");</b>
          MDC.put("txId", null); // clear txId asap to avoid accidental rebirth
        }
      }
    } </pre>
    
    
       <p>Not that at the end of each transaction the appropriate buffer
       is discarded, we can increase the value of <span
       class="option">maxNumberOfBuffers</span> as shown in the next
       configuration file..
       </p>
    
       <pre class="prettyprint   source">&lt;configuration scan="true" scanPeriod="3 seconds">
    
      &lt;statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" /&gt;
    
      &lt;appender name="SMTP" class="ch.qos.logback.classic.net.SMTPAppender">
        &lt;SMTPHost>NAME_OF_SMTP_HOST&lt;/SMTPHost>
        &lt;to>%mdc{txEmail}&lt;/to>
        &lt;from>&lt;/from>
        &lt;subject>Prime - %mdc{number}&lt;/subject>
    
        &lt;layout class="ch.qos.logback.classic.html.HTMLLayout">
           &lt;pattern>%date%level%logger{24}%msg&lt;/pattern>
        &lt;/layout>
    
        &lt;discriminator class="ch.qos.logback.classic.sift.MDCBasedDiscriminator">
          &lt;key>txId&lt;/key>
          &lt;defaultValue>default&lt;/defaultValue>
        &lt;/discriminator>
    
        <b>&lt;cyclicBufferTracker class="ch.qos.logback.core.spi.CyclicBufferTracker"></b>
          <b>&lt;maxNumberOfBuffers>512&lt;/maxNumberOfBuffers></b>
        <b>&lt;/cyclicBufferTracker></b>
    
        &lt;evaluator class="ch.qos.logback.classic.boolex.JaninoEventEvaluator">
          &lt;expression>
            (mdc != null &amp;amp;&amp;amp; mdc.get("txEmail") != null &amp;amp;&amp;amp;
                ((String) mdc.get("txEmail")).contains("+log") )
            &amp;amp;&amp;amp;
            (marker != null  &amp;&amp; marker.contains("SMTP_TRIGGER") )
          &lt;/expression>
        &lt;/evaluator>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="SMTP" /> 
      &lt;/root>
    &lt;/configuration>  </pre>
    
        <p>With these latest changes, we can selectively send isolated
        logs for selected transactions to the concerned recipient, even in
        very busy production systems without excessive memory consumption.
        </p>
    
         <script src="../templates/footer.js" type="text/javascript"></script>	
        </div>
      </body>
    </html>
     ������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/support.html���������������������������������������������0000644�0001750�0001750�00000003677�11616526116�022776� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Professional support</title>
        <link rel="stylesheet" type="text/css" href="css/common.css" />
        <link rel="stylesheet" type="text/css" href="css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="css/_print.css" media="print" />
        
      </head>
      <body>
        <script type="text/javascript">prefix='';</script>
        
        <script src="templates/header.js"  type="text/javascript"></script>
        <div id="left">
          <script src="templates/left.js"  type="text/javascript"></script>
        </div>
        <div id="content">
          
        <h2>Professional Support</h2>
    
        <p>Although the quality of support in the various open source
        project mailing lists is quite good, these are operated on a
        best-effort basis. If you require authoritative responses and
        guaranteed response times, then you should consider our
        professional support package.
        </p>
    
        <p>As the founders and/or current maintainers of the slf4j, log4j,
        logback and <a href="http://cal10n.qos.ch/">cal10n</a> projects,
        we can offer you timely and competent support. Choosing our
        professional support service is a good way to leverage our
        expertise. Moreover, if you require custom development we are
        likely to be of help.
        </p>
    
        <p>For more information about Professional Support do not hesitate
        to contact us. We will be happy to discuss your needs.</p>
        
        <table>
          <tr>
            <td>email:</td>
            <td><img align="left" src="images/helpEMAIL.gif" alt=""/></td>
          </tr>
          <tr>
            <td>telephone:</td>
            <td> +41 21 312 32 26</td>
          </tr>
        </table> 
        
        </div>
    
      </body>
    </html>�����������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/job.html�������������������������������������������������0000644�0001750�0001750�00000005116�12136042147�022015� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=utf-8" />
        <title>Carrer at QOS.ch</title>
        <link rel="stylesheet" type="text/css" href="css/common.css" />
        <link rel="stylesheet" type="text/css" href="css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="css/_print.css" media="print" />
    
        <script type="text/javascript">
    
          var _gaq = _gaq || [];
          _gaq.push(['_setAccount', 'UA-9228687-3']);
          _gaq.push(['_trackPageview']);
    
          (function() {
          var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
          ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
          var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
          })();
        </script>
    
      </head>
      <body>
        <script type="text/javascript">prefix='';</script>
        <script src="templates/header.js" type="text/javascript"></script>
        <div id="left">
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="templates/left.js" type="text/javascript"></script>
        </div>
    
        <div id="content">
    		
    
    		<h2>Software developer</h2>
    
        <p>QOS.ch or Quality Open Software is a software development
        company based in Lausanne, Switzerland.</p>
        
        <p>We have extensive experience building mission-critical
        enterprise software in the Java language. We are also founding
        contributors of several open source projects, namely log4j, slf4j,
        mistletoe, cal10n and logback.
        </p>
    
        <p>We are looking for software engineers with superb software
        development skills.
        </p>
    
        <h3>Required qualifications</h3>
    
        <ul>
          <li>University graduate</li> 
          
          <li>Strong analytical skills</li> 
          
          <li>Good experience in object-oriented programming, preferably
          Java</li>
    
        </ul>
        
        <p>We offer excellent working conditions with many opportunities
        to improve your software development skills.
        </p>
    
        <script type="text/javascript">
    AAT = '@';
    DOOTT = '.';
    document.write('<p>Please send your application by email to <b>hr'+ AAT +'qos'+ DOOTT+'ch</b>. If applicable, ');
    document.write('do not forget to include a list of software projects to which you have contributed.</p>') 
        </script>
    
        </div>
      </body>
    </html>��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/mailinglist.html�����������������������������������������0000644�0001750�0001750�00000011207�12136551437�023564� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Mailing lists</title>
        
        <link rel="stylesheet" type="text/css" href="css/common.css" />
        <link rel="stylesheet" type="text/css" href="css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="css/_print.css" media="print" />
      </head>
      <body>
        <script  type="text/javascript">prefix='';</script>
    
        <script src="templates/header.js"  type="text/javascript"></script>
        <div id="left">
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="templates/left.js"  type="text/javascript"></script>
        </div>
        <div id="content">
    	
        <h2>Project Mailing Lists</h2>
    
    		<p>A mailing list is an electronic discussion forum that anyone
    		can subscribe to. When someone sends an email message to the
    		mailing list, a copy of that message is broadcast to everyone who
    		is subscribed to that mailing list. Mailing lists provide a simple
    		and effective communication mechanism. With potentially thousands
    		of subscribers, there is a common set of <a
    		href="http://www.shakthimaan.com/downloads/glv/presentations/mailing-list-etiquette.pdf">etiquette
    		guidelines</a> that you should observe.
    		</p>
    
        <h3>Respect the mailing list type</h3>
    		
        <p>The "User" lists are where you can send questions and comments
        about configuration, setup, usage and other "user" types of
        questions. The "Developer" lists are where you can send questions and
        comments about the actual software source code and other issues
        related to development.
    		</p>
    
        <p>Some questions are appropriate for posting on both the "user"
        and the "developer" lists. In this case, pick one and only one. Do
        not cross post.
    		</p>
    
        <p><span class="label notice">Note</span> <b>Only subscribers can
        post to the logback-user and logback-dev mailing lists.</b> If you
        are subscribed and your posts bounce, make sure that the address
        you post from matches your subscription address.</p>
    
    		<table class="bodyTable">
    			<tr class="a">
    				<th>Name</th>
    				<th>Volume</th>
    				<th>Subscribe</th>
    				<th>Unsubscribe</th>
    				<th>Archives</th>
    			</tr>
    			<tr class="b">
    				<td>QOS.ch announce List</td>
    				<td>Low</td>
    				<td>
    					<a
    						href="http://qos.ch/mailman/listinfo/announce">
    						Subscribe
    					</a>
    				</td>
    				<td>
    					<a
    						href="http://qos.ch/mailman/options/announce">
    						Unsubscribe
    					</a>
    				</td>
    				<td>
    					<a
    						href="http://www.qos.ch/pipermail/announce/">
    						qos.ch
    					</a> 
    				</td>
    			</tr>
    			<tr class="a">
    				<td>Logback User List</td>
    				<td>Medium</td>
    				<td>
    					<a
    						href="http://qos.ch/mailman/listinfo/logback-user">
    						Subscribe
    					</a>
    				</td>
    				<td>
    					<a
    						href="http://qos.ch/mailman/options/logback-user">
    						Unsubscribe
    					</a> 
    				</td>
    				<td>
    					<a
    						href="http://www.qos.ch/pipermail/logback-user/">
    						qos.ch
    					</a> |
    					<a
    						href="http://marc.theaimsgroup.com/?l=logback-user">
    						MARC
    					</a> |
    
    					<a
    						href="http://www.nabble.com/Logback-User-f16252.html">
    						Nabble
    					</a>
    				</td>
    			</tr>
    			<tr class="b">
    				<td>Logback Dev List</td>
    				<td>Medium</td>
    				<td>
    					<a
    						href="http://qos.ch/mailman/listinfo/logback-dev">
    						Subscribe
    					</a>
    				</td>
    				<td>
    					<a
    						href="http://qos.ch/mailman/options/logback-dev">
    						Unsubscribe
    					</a> 
    				</td>
    				<td>
    					<a
    						href="http://www.qos.ch/pipermail/logback-dev/">
    						qos.ch
    					</a> |
    					<a
    						href="http://marc.theaimsgroup.com/?l=logback-dev">
    						MARC
    					</a> |
    					<a
    						href="http://www.nabble.com/Logback-Dev-f16253.html">
    						Nabble
    					</a>
    				</td>
    			</tr>
    
          <tr>
            <td>Logback Notifications List</td>
            <td>High</td>
    				<td>
    					<a
    						href="http://qos.ch/mailman/listinfo/logback-notification">
    						Subscribe
    					</a>
    				</td>
            <td>
              <a
    						href="http://qos.ch/mailman/options/logback-notification">
    						Unsubscribe
    					</a> 
    				</td>
            <td>
              <a
    						href="http://www.qos.ch/pipermail/logback-notification/">
    						qos.ch
    					</a>
            </td>
          </tr>
    
    		</table>
    
       <p>&nbsp;</p>
    
    	
      <script src="templates/footer.js" type="text/javascript"></script>
    </div>
    </body>
    </html>
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/manual/��������������������������������������������������0000755�0001750�0001750�00000000000�12203357067�021634� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/manual/index.html����������������������������������������0000644�0001750�0001750�00000010227�12136042273�023626� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Logback Manual</title>
        
        <link rel="stylesheet" type="text/css" href="../css/common.css" />
        <link rel="stylesheet" type="text/css" href="../css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="../css/_print.css" media="print" />
        
      </head>
      <body>
        <script type="text/javascript">prefix='../';</script>
        <script src="../templates/header.js" type="text/javascript"></script>
        <div id="left">
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="../templates/left.js" type="text/javascript"></script>
        </div>
        <div id="right">
          <script src="menu.js" type="text/javascript"></script>
        </div>
        <div id="content">
          
        <h2>The logback manual</h2>
    
    
        <p>The complete logback manual documents the latest version of
        logback framework. In over 150 pages and dozens of concrete
        examples, it covers both basic and advanced logback features, including:
        </p>
    
    
        <div>
          <ul>
            <li><p>the overall logback architecture</p></li>
            <li><p>discussion of best logback practices and anti-patterns</p></li>
            <li><p>logback configuration scripts in XML format</p></li>
            <li><p>appenders</p></li>
            <li><p>encoders</p></li>
            <li><p>layouts</p></li>
            <li><p>filters</p></li>
            <li><p>mapped diagnostic contexts</p></li>
            <li><p>Joran, logback's configuration system</p></li>
          </ul>
        </div>
    
      
        <p>The logback manual describes the logback API in considerable
        detail, including its features and design rationale. Authored by
        Ceki G&#252;lc&#252; and S&#233;bastien Pennec, the main
        contributors to the logback project, the logback manual is
        intended for developers already familiar with the Java language
        but new to logback, as much as for experienced logback users. With
        the aid of introductory material and many examples, new users
        should quickly come up to speed.
        </p>
    
      
        
        <div>
          <p>Without further ado, here are the contents of the manual:</p>
          
          <ul>
            <li><p>
              <a href="introduction.html"><b>Chapter 1: Introduction to logback</b></a>
            </p></li>
            <li><p>
              <a href="architecture.html"><b>Chapter 2: Architecture</b></a>
            </p></li>
            <li><p>
              <a href="configuration.html"><b>Chapter 3: Configuration</b></a>
            </p></li>
            
            <li><p>
              <a href="appenders.html"><b>Chapter 4: Appenders</b></a>
            </p></li>
          
            <li><p><a href="encoders.html"><b>Chapter 5:
            Encoders</b></a></p>
            </li>
      
            <li><p>
              <a href="layouts.html"><b>Chapter 6: Layouts</b></a>
            </p></li>
    
            <li><p>
              <a href="filters.html"><b>Chapter 7: Filters</b></a>
            </p></li>
            
            <li><p>
              <a href="mdc.html"><b>Chapter 8: Mapped Diagnostic Contexts</b></a>
            </p></li>
    
            <li><p>
              <a href="loggingSeparation.html"><b>Chapter 9: Logging Separation</b></a>
            </p></li>
            
            <li><p>
              <a href="jmxConfig.html"><b>Chapter 10: JMX Configurator</b></a>
            </p></li>
    
            <li><p>
              <a href="onJoran.html"><b>Chapter 11: Joran</b></a>
            </p></li>
    
            <li><p><a href="groovy.html"><b>Chapter 12: Groovy
            Configuration</b></a></p></li>
    
            <li><p>
              <a href="migrationFromLog4j.html"><b>Chapter 13: Migration from log4j</b></a>
            </p></li>
    
            <li><p>
              <a href="receivers.html"><b>Chapter 14: Receivers</b></a>
            </p></li>
    
            <li><p>
              <a href="usingSSL.html"><b>Chapter 15: Using SSL</b></a>
            </p></li>
    
          </ul>
        </div>
    
        <script src="../templates/footer.js" type="text/javascript"></script>
        </div>
      </body>
    </html>
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/manual/architecture.html���������������������������������0000644�0001750�0001750�00000104447�11776624035�025224� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Chapter 2: Architecture</title>
        <link rel="stylesheet" type="text/css" href="../css/common.css" />
        <link rel="stylesheet" type="text/css" href="../css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="../css/_print.css" media="print" />
        <link rel="stylesheet" type="text/css" href="../css/prettify.css" media="screen" />
      </head>
      <body onload="prettyPrint()">
        <script type="text/javascript">prefix='../';</script>
        <script type="text/javascript" src="../js/prettify.js"></script>
        <script type="text/javascript" src="../templates/header.js"></script>
        <div id="left">
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="../templates/left.js" type="text/javascript"></script>
        </div>
        <div id="right">
          <script src="menu.js" type="text/javascript"></script>
        </div>
        <div id="content">
    
       <h1>Chapter 2: Architecture</h1>
    
       <div class="quote">
          <p><em>All true classification is genealogical.</em></p>
          <p>&mdash;CHARLES DARWIN, <em>The Origin of Species</em></p>
    
          <p><em>It is difficult, if not impossible, for anyone to learn a
          subject purely by reading about it, without applying the
          information to specific problems and thereby forcing himself to
          think about what has been read. Furthermore, we all learn best
          the things that we have discovered ourselves.</em>
          </p>
          <p>&mdash;DONALD KNUTH, <em>The Art of Computer Programming</em></p>
       </div>
    
    
       <script src="../templates/creative.js" type="text/javascript"></script>
    
        <h2>Logback's architecture</h2>
    
        <p>Logback's basic architecture is sufficiently generic so as to
        apply under different circumstances. At the present time, logback
        is divided into three modules, logback-core, logback-classic and
        logback-access.
        </p>
    
        <p>The <em>core</em> module lays the groundwork for the other two
        modules.  The <em>classic</em> module extends <em>core</em>. The
        classic module corresponds to a significantly improved version of
        log4j. Logback-classic natively implements the <a
        href="http://www.slf4j.org">SLF4J API</a> so that you can readily
        switch back and forth between logback and other logging systems
        such as log4j or java.util.logging (JUL) introduced in JDK
        1.4. The third module called <em>access</em> integrates with
        Servlet containers to provide HTTP-access log functionality. A
        separate document covers <a href="../access.html">access module
        documentation</a>.
        </p>
    
        <p>In the remainder of this document, we will write "logback" to
        refer to the logback-classic module.
        </p>
        
    		<h2>Logger, Appenders and Layouts</h2>
    		
    		<p>Logback is built upon three main classes: <code>Logger</code>,
    		<code>Appender</code> and <code>Layout</code>. These three types
    		of components work together to enable developers to log messages
    		according to message type and level, and to control at runtime how
    		these messages are formatted and where they are reported.
    		</p>
    
    		<p>The <code>Logger</code> class is part of the logback-classic
    		module. On the other hand, the <code>Appender</code> and
    		<code>Layout</code> interfaces are part of logback-core. As a
    		general-purpose module, logback-core has no notion of
    		loggers.
    		</p>
        
        <h3><a name="LoggerContext" href="#LoggerContext"><span
        class="anchor"/></a>Logger context</h3>
    
    		<p>The first and foremost advantage of any logging API over plain
    		<code>System.out.println</code> resides in its ability to disable
    		certain log statements while allowing others to print
    		unhindered. This capability assumes that the logging space, that
    		is, the space of all possible logging statements, is categorized
    		according to some developer-chosen criteria.  In logback-classic,
    		this categorization is an inherent part of loggers.  Every single
    		logger is attached to a <code>LoggerContext</code> which is
    		responsible for manufacturing loggers as well as arranging them in
    		a tree like hierarchy.
    		</p>
    			
    		<p>Loggers are named entities. Their names are case-sensitive and
    		they follow the hierarchical naming rule:
    		</p>
    
    		<div class="definition">
    			<div class="deftitle">Named Hierarchy</div>
    			<p>
    				A logger is said to be an ancestor of another logger if
    				its name followed by a dot is a prefix of the descendant
    				logger name. A logger is said to be a parent of a child
    				logger if there are no ancestors between itself and the
    				descendant logger.
    			</p>
    		</div>
    
    		<p>For example, the logger named <code>"com.foo"</code> is a
    		parent of the logger named <code>"com.foo.Bar"</code>.  Similarly,
    		<code>"java"</code> is a parent of <code>"java.util"</code> and an
    		ancestor of <code>"java.util.Vector"</code>.  This naming scheme
    		should be familiar to most developers.
    		</p>
    
    		<p>The root logger resides at the top of the logger hierarchy.  It
    		is exceptional in that it is part of every hierarchy at its
    		inception. Like every logger, it can be retrieved by its name, as
    		follows:
    		</p>
    		
        <pre class="prettyprint source">Logger rootLogger = LoggerFactory.getLogger(<a
        href="http://www.slf4j.org/apidocs/constant-values.html#org.slf4j.Logger.ROOT_LOGGER_NAME">org.slf4j.Logger.ROOT_LOGGER_NAME</a>);</pre>
    
    		<p>All other loggers are also retrieved with the class static
    		<code>getLogger</code> method found in the <a
    		href="http://www.slf4j.org/api/org/slf4j/Logger.html">org.slf4j.LoggerFactory</a>
    		class. This method takes the name of the desired logger as a
    		parameter. Some of the basic methods in the <code>Logger</code>
    		interface are listed below.
    		</p>
    
    		<pre class="prettyprint source">package org.slf4j; 
    public interface Logger {
    
      // Printing methods: 
      public void trace(String message);
      public void debug(String message);
      public void info(String message); 
      public void warn(String message); 
      public void error(String message); 
    }</pre>
    
    
    
        <h3><a name="effectiveLevel" href="#effectiveLevel"><span
        class="anchor"/></a>Effective Level aka Level Inheritance
        </h3>
    
    		<p>Loggers may be assigned levels. The set of possible levels
    		(TRACE, DEBUG, INFO, WARN and ERROR) are defined in the
    		<code>ch.qos.logback.classic.Level</code> class. Note that in
    		logback, the <code>Level</code> class is final and cannot be
    		sub-classed, as a much more flexible approach exists in the form
    		of <code>Marker</code> objects.
    		</p>
    
    		<p>If a given logger is not assigned a level, then it inherits one
    		from its closest ancestor with an assigned level. More formally:
    		</p>
    
    		<div class="definition">
    		
          
    			<p>The effective level for a given logger <em>L</em>, is equal
    			to the first non-null level in its hierarchy, starting at
    			<em>L</em> itself and proceeding upwards in the hierarchy
    			towards the root logger.
    			</p>
    		</div>
    	
    		<p>To ensure that all loggers can eventually inherit a level, the
    		root logger always has an assigned level. By default, this level
    		is DEBUG.
    		</p>
    
    		<p>Below are four examples with various assigned level values and
    		the resulting effective (inherited) levels according to the level
    		inheritance rule.
    		</p>
    
    		<em>Example 1</em>
    		<table class="bodyTable">
    			<tr>
    				<th>Logger name</th>
    				<th>Assigned level</th>
    				<th>Effective level</th>
    			</tr>
    			<tr class="alt">
    				<td>root</td>
    				<td>DEBUG</td>
    				<td>DEBUG</td>
    		  </tr>
    			<tr>
    				<td>X</td>
    				<td>none</td>
    				<td>DEBUG</td>
    		  </tr>
    
    			<tr class="alt">
    				<td>X.Y</td>
    				<td>none</td>
    				<td>DEBUG</td>
    		  </tr>
    			<tr>
    				<td>X.Y.Z</td>
    				<td>none</td>
    				<td>DEBUG</td>
    		  </tr>
      </table>
    
    		<p> In example 1 above, only the root logger is assigned a level.
    		This level value, <code>DEBUG</code>, is inherited by the other
    		loggers <code>X</code>, <code>X.Y</code> and <code>X.Y.Z</code>
    		</p>
    
    		<em>Example 2</em>
    		<table class="bodyTable">
    			<tr>
    				<th>Logger name</th>
    				<th>Assigned level</th>
    				<th>Effective level</th>
    			</tr>
    			<tr class="alt" align="left">
    				<td>root</td>
    				<td>ERROR</td>
    				<td>ERROR</td>
    			</tr>
    			<tr align="left">
    				<td>X</td>
    				<td>INFO</td>
    				<td>INFO</td>
    			</tr>
    
    			<tr class="alt" align="left">
    				<td>X.Y</td>
    				<td>DEBUG</td>
    				<td>DEBUG</td>
    			</tr>
    			<tr align="left">
    				<td>X.Y.Z</td>
    				<td>WARN</td>
    				<td>WARN</td>
    			</tr>
    		</table>
    
    		<p>In example 2 above, all loggers have an assigned level value.
    		Level inheritance does not come into play.
    		</p>
    
    		<em>Example 3</em>
    		<table class="bodyTable">
    			<tr>
    				<th>Logger name</th>
    				<th>Assigned level</th>
    				<th>Effective level</th>
    			</tr>
    			<tr class="alt" align="left">
    				<td>root</td>
    				<td>DEBUG</td>
    				<td>DEBUG</td>
    			</tr>
    
    			<tr align="left">
    				<td>X</td>
    				<td>INFO</td>
    				<td>INFO</td>
    			</tr>
    			<tr class="alt" align="left">
    				<td>X.Y</td>
    				<td>none</td>
    				<td>INFO</td>
    			</tr>
    			<tr align="left">
    				<td>X.Y.Z</td>
    				<td>ERROR</td>
    				<td>ERROR</td>
    			</tr>
    		</table>
    
    		<p>In example 3 above, the loggers <code>root</code>,
    		<code>X</code> and <code>X.Y.Z</code> are assigned the levels
    		<code>DEBUG</code>, <code>INFO</code> and <code>ERROR</code>
    		respectively. Logger <code>X.Y</code> inherits its level value
    		from its parent <code>X</code>.
    		</p>
    
    		<em>Example 4</em>
    		<table class="bodyTable">
    
    			<tr>
    				<th>Logger name</th>
    				<th>Assigned level</th>
    				<th>Effective level</th>
    			</tr>
    			<tr class="alt" align="left">
    				<td>root</td>
    				<td>DEBUG</td>
    				<td>DEBUG</td>
    			</tr>
    
    			<tr align="left">
    				<td>X</td>
    				<td>INFO</td>
    				<td>INFO</td>
    			</tr>
    			<tr class="alt" align="left">
    				<td>X.Y</td>
    				<td>none</td>
    				<td>INFO</td>
    			</tr>
    			<tr align="left">
    				<td>X.Y.Z</td>
    				<td>none</td>
    				<td>INFO</td>
    			</tr>
    		</table>
    
       
    		<p>In example 4 above, the loggers <code>root</code> and
    		<code>X</code> and are assigned the levels <code>DEBUG</code> and
    		<code>INFO</code> respectively. The loggers <code>X.Y</code> and
    		<code>X.Y.Z</code> inherit their level value from their nearest
    		parent <code>X</code>, which has an assigned level.
    		</p>
    
        <h3><a name="basic_selection" href="#basic_selection"><span
        class="anchor"/></a>Printing methods and the basic selection
        rule</h3>
    
    		<p>By definition, the printing method determines the level of a
    		logging request. For example, if <code>L</code> is a logger
    		instance, then the statement <code>L.info("..")</code> is a
    		logging statement of level INFO.
    		</p>
    		
        
        <p>A logging request is said to be <em>enabled</em> if its level
        is higher than or equal to the effective level of its
        logger. Otherwise, the request is said to be <em>disabled</em>. As
        described previously, a logger without an assigned level will
        inherit one from its nearest ancestor. This rule is summarized
        below.
      </p>
    
         
    		<div class="definition">
    			<div class="deftitle">Basic Selection Rule</div>
    
    			<p>A log request of level <em>p</em> issued to a logger having
    			an effective level <em>q</em>, is enabled if
    			<em>p&nbsp;&gt;=&nbsp;q</em>.
    			</p>
    		</div>
    
    		<p>This rule is at the heart of logback. It assumes that levels
    		are ordered as follows:
    		<code>TRACE&nbsp;&lt;&nbsp;DEBUG&nbsp;&lt;&nbsp;INFO&nbsp;&lt;
    		&nbsp;WARN&nbsp;&lt;&nbsp;ERROR</code>.
    		</p>
    				
    		<p>In a more graphic way, here is how the selection rule works. In
    		the following table, the vertical header shows the level of
    		the logging request, designated by <em>p</em>, while the
    		horizontal header shows effective level of the logger, designated
    		by <em>q</em>. The intersection of the rows (level request) and
    		columns (effective level) is the boolean resulting from the basic
    		selection rule.
    		</p>
    		
    		<table width="80%">
          <tr> 
            <td class="lgray_bg" rowspan="2">level of <br/>request <em>p</em></td>
    				<td style="border-top: 1px solid #DDDDDD;"
            align="center" colspan="6">effective level <em>q</em></td>
    			</tr>
    			<tr align="left">
    				<th  style="border-bottom: 1px solid #DDDDDD;">TRACE</th>
    				<th  style="border-bottom: 1px solid #DDDDDD;">DEBUG</th>
    				<th  style="border-bottom: 1px solid #DDDDDD;">INFO</th>
    				<th  style="border-bottom: 1px solid #DDDDDD;">WARN</th>
    				<th  style="border-bottom: 1px solid #DDDDDD;">ERROR</th>	
            <th  style="border-bottom: 1px solid #DDDDDD;">OFF</th>    			
    			</tr>
    			<tr align="left" >
    				<th class="lgray_bg">TRACE</th>
    				<td><span class="greenBold">YES</span></td>
    				<td><span class="redBold">NO</span></td>
    				<td><span class="redBold">NO</span></td>
    				<td><span class="redBold">NO</span></td>
    				<td><span class="redBold">NO</span></td>
            <td><span class="redBold">NO</span></td>
    			</tr>
    
    			<tr align="left">
    				<th class="lgray_bg">DEBUG</th>
    				<td><span class="greenBold">YES</span></td>
    				<td><span class="greenBold">YES</span></td>
    				<td><span class="redBold">NO</span></td>
    				<td><span class="redBold">NO</span></td>
    				<td><span class="redBold">NO</span></td>
            <td><span class="redBold">NO</span></td>
    			</tr>
    			<tr align="left" >
    				<th class="lgray_bg">INFO</th>
    				<td><span class="greenBold">YES</span></td>
    				<td><span class="greenBold">YES</span></td>
    				<td><span class="greenBold">YES</span></td>
    				<td><span class="redBold">NO</span></td>
    				<td><span class="redBold">NO</span></td>
            <td><span class="redBold">NO</span></td>
    			</tr>
    			<tr align="left" >
    				<th class="lgray_bg">WARN</th>
    				<td><span class="greenBold">YES</span></td>
    				<td><span class="greenBold">YES</span></td>
    				<td><span class="greenBold">YES</span></td>
    				<td><span class="greenBold">YES</span></td>
    				<td><span class="redBold">NO</span></td>
            <td><span class="redBold">NO</span></td>
    			</tr>
    			<tr align="left" >
    				<th class="lgray_bg">ERROR</th>
    				<td><span class="greenBold">YES</span></td>
    				<td><span class="greenBold">YES</span></td>
    				<td><span class="greenBold">YES</span></td>
    				<td><span class="greenBold">YES</span></td>
    				<td><span class="greenBold">YES</span></td>
            <td><span class="redBold">NO</span></td>
    			</tr>		
    		</table>
    		
    		<p>Here is an example of the basic selection rule.</p>
    
    		<pre class="prettyprint source">import ch.qos.logback.classic.Level;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    ....
    
    // get a logger instance named "com.foo". Let us further assume that the
    // logger is of type  ch.qos.logback.classic.Logger so that we can
    // set its level
    ch.qos.logback.classic.Logger logger = 
            (ch.qos.logback.classic.Logger) LoggerFactory.getLogger("com.foo");
    //set its Level to <span class="blue">INFO</span>. The setLevel() method requires a logback logger
    logger.setLevel(Level. <span class="blue">INFO</span>);
    
    Logger barlogger = LoggerFactory.getLogger("com.foo.Bar");
    
    // This request is enabled, because <span class="green bold">WARN</span> &gt;= <span class="blue">INFO</span>
    logger.<span class="green bold">warn</span>("Low fuel level.");
    
    // This request is disabled, because <span class="green bold">DEBUG</span> &lt; <span class="blue">INFO</span>. 
    logger.<span class="green bold">debug</span>("Starting search for nearest gas station.");
    
    // The logger instance barlogger, named "com.foo.Bar", 
    // will inherit its level from the logger named 
    // "com.foo" Thus, the following request is enabled 
    // because <span class="green bold">INFO</span> &gt;= <span class="blue">INFO</span>. 
    barlogger.<span class="green bold">info</span>("Located nearest gas station.");
    
    // This request is disabled, because <span class="green bold">DEBUG</span> &lt; <span class="blue">INFO</span>. 
    barlogger.<span class="green bold">debug</span>("Exiting gas station search");</pre>
    
        <a name="RetrievingLoggers"></a>
    		<h3>Retrieving Loggers</h3>
    		<p>
    			Calling the <code><a href="../apidocs/org/slf4j/LoggerFactory.html#getLogger(java.lang.String)">LoggerFactory.getLogger</a></code>
    			method with the same name will always return a reference to
    			the exact same logger object.
    		</p>
    
    		<p>For example, in</p>
    		<pre class="prettyprint source">Logger x = LoggerFactory.getLogger("wombat"); 
    Logger y = LoggerFactory.getLogger("wombat");</pre>
    
    		<p>
    			<code>x</code> and <code>y</code> refer to
    			<em>exactly</em> the same logger object.
    		</p>
    
    		<p>Thus, it is possible to configure a logger and then to retrieve
    		the same instance somewhere else in the code without passing
    		around references. In fundamental contradiction to biological
    		parenthood, where parents always precede their children, logback
    		loggers can be created and configured in any order. In particular,
    		a "parent" logger will find and link to its descendants even if it
    		is instantiated after them.
    		</p>
    		<p>Configuration of the logback environment is typically done at
    		application initialization. The preferred way is by reading a
    		configuration file. This approach will be discussed shortly.
    		</p>
    		<p>Logback makes it easy to name loggers by <em>software
    		component</em>.  This can be accomplished by instantiating a
    		logger in each class, with the logger name equal to the fully
    		qualified name of the class. This is a useful and straightforward
    		method of defining loggers. As the log output bears the name of
    		the generating logger, this naming strategy makes it easy to
    		identify the origin of a log message. However, this is only one
    		possible, albeit common, strategy for naming loggers. Logback does
    		not restrict the possible set of loggers. As a developer, you are
    		free to name loggers as you wish.
    		</p>
    
    		<p>Nevertheless, naming loggers after the class where they are
    		located seems to be the best general strategy known so far.
    		</p>
    
        <a name="AppendersAndLayouts"></a>
        <h3>Appenders and Layouts</h3>
    
    		<p>The ability to selectively enable or disable logging requests
    		based on their logger is only part of the picture.  Logback allows
    		logging requests to print to multiple destinations. In logback
    		speak, an output destination is called an appender. Currently,
    		appenders exist for the console, files, remote socket servers, to
    		MySQL, PostgreSQL, Oracle and other databases, JMS, and remote
    		UNIX Syslog daemons.
    
          <!--It is also possible to log asynchronously. -->
    		</p>
    
    		<p>More than one appender can be attached to a logger.</p>
    
        <p>The <code><a
        href="../apidocs/ch/qos/logback/classic/Logger.html#addAppender(ch.qos.logback.core.Appender)">addAppender</a></code>
        method adds an appender to a given logger.  Each enabled logging
        request for a given logger will be forwarded to all the appenders
        in that logger as well as the appenders higher in the
        hierarchy. In other words, appenders are inherited additively from
        the logger hierarchy. For example, if a console appender is added
        to the root logger, then all enabled logging requests will at
        least print on the console. If in addition a file appender is
        added to a logger, say <em>L</em>, then enabled logging requests
        for <em>L</em> and <em>L</em>'s children will print on a file
        <em>and</em> on the console.  It is possible to override this
        default behavior so that appender accumulation is no longer
        additive by setting the additivity flag of a logger to false.
    		</p>
    
    		<p>The rules governing appender additivity are summarized below.
    		</p>
    		<div class="definition">
    
    			<h4 class="deftitle"><a name="additivity"
    			href="#additivity"><span class="anchor"/></a>Appender
    			Additivity</h4>
    
    			<p>The output of a log statement of logger <em>L</em> will go to
    			all the appenders in <em>L</em> and its ancestors. This is the
    			meaning of the term "appender additivity".
    			</p>
    
    			<p>However, if an ancestor of logger <em>L</em>, say <em>P</em>,
    			has the additivity flag set to false, then <em>L</em>'s output
    			will be directed to all the appenders in <em>L</em> and its
    			ancestors up to and including <em>P</em> but not the appenders in
    			any of the ancestors of <em>P</em>.
    			</p>
    
    			<p>Loggers have their additivity flag set to true by default.
    			</p>
    
    		</div>
    		The table below shows an example:
    
    		<table class="bodyTable">
    			<tr>
    				<th>Logger Name</th>
    				<th>Attached Appenders</th>
    				<th>Additivity Flag</th>
    				<th>Output Targets</th>
    				<th>Comment</th>
    			</tr>
    			<tr>
    				<td>root</td>
    				<td>A1</td>
    				<td>not applicable</td>
    				<td>A1</td>
    
    				<td>Since the root logger stands at the top of the logger
    				hierarchy, the additivity flag does not apply to it.
    				</td>
    			</tr>
    			<tr class="alt">
    				<td>x</td>
    				<td>A-x1, A-x2</td>
    				<td>true</td>
    				<td>A1, A-x1, A-x2</td>
    				<td>Appenders of "x" and of root.</td>
    			</tr>
    			<tr>
    				<td>x.y</td>
    				<td>none</td>
    				<td>true</td>
    				<td>A1, A-x1, A-x2</td>
    				<td>Appenders of "x" and of root.</td>
    			</tr>
    			<tr class="alt">
    				<td>x.y.z</td>
    				<td>A-xyz1</td>
    				<td>true</td>
    				<td>A1, A-x1, A-x2, A-xyz1</td>
    				<td>Appenders of "x.y.z", "x" and of root.</td>
    			</tr>
    			<tr>
    				<td>security</td>
    				<td>A-sec</td>
    				<td class="blue"><span class="blue">false</span></td>
    				<td>A-sec</td>
    
    				<td>
    					No appender accumulation since the additivity flag is set to
    					<code>false</code>. Only appender A-sec will be used.
    				</td>
    			</tr>
    			<tr class="alt">
    				<td>security.access</td>
    				<td>none</td>
    				<td>true</td>				
            <td>A-sec</td>
    				<td>
    					Only appenders of "security" because the additivity
    					flag in "security" is set to
    					<code>false</code>.
    				</td>
    			</tr>
    		</table>
    
    
    		<p>More often than not, users wish to customize not only the
    		output destination but also the output format. This is
    		accomplished by associating a <em>layout</em> with an
    		appender. The layout is responsible for formatting the logging
    		request according to the user's wishes, whereas an appender takes
    		care of sending the formatted output to its destination. The
    		<code>PatternLayout</code>, part of the standard logback
    		distribution, lets the user specify the output format according to
    		conversion patterns similar to the C language <code>printf</code>
    		function.
    		</p>
    
    		<p>For example, the PatternLayout with the conversion pattern
    		"%-4relative [%thread] %-5level %logger{32} - %msg%n" will output
    		something akin to:
    		</p>
    
    		<div class="prettyprint source"><pre>176  [main] DEBUG manual.architecture.HelloWorld2 - Hello world.</pre></div>
    
    		<p>The first field is the number of milliseconds elapsed since the
    		start of the program. The second field is the thread making the
    		log request. The third field is the level of the log request. The
    		fourth field is the name of the logger associated with the log
    		request. The text after the '-' is the message of the request.
    		</p>
    
    
    		<h3><a name="parametrized" href="#parametrized"><span
    		class="anchor"/></a>Parameterized logging</h3>
    
    		<p>Given that loggers in logback-classic implement the <a
    		href="http://www.slf4j.org/api/org/slf4j/Logger.html">SLF4J's
    		Logger interface</a>, certain printing methods admit more than one
    		parameter. These printing method variants are mainly intended to
    		improve performance while minimizing the impact on the readability
    		of the code.
    		</p>
    
    		<p>For some Logger <code>logger</code>, writing,</p>
    
    		<pre class="prettyprint source">logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));</pre>
    
    		<p>incurs the cost of constructing the message parameter, that is
    		converting both integer <code>i</code> and <code>entry[i]</code>
    		to a String, and concatenating intermediate strings. This is
    		regardless of whether the message will be logged or not.
    		</p>
    
    		<p>One possible way to avoid the cost of parameter construction is
    		by surrounding the log statement with a test. Here is an example.
    		</p>
    
    		<pre class="prettyprint source">if(logger.isDebugEnabled()) { 
      logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
    }</pre>
    
    
    		<p>This way you will not incur the cost of parameter construction
    		if debugging is disabled for <code>logger</code>.  On the other
    		hand, if the logger is enabled for the DEBUG level, you will incur
    		the cost of evaluating whether the logger is enabled or not,
    		twice: once in <code>debugEnabled</code> and once in
    		<code>debug</code>.  In practice, this overhead is insignificant
    		because evaluating a logger takes less than 1% of the time it
    		takes to actually log a request.
    		</p>
    
    		<h4>Better alternative</h4>
    
    		<p>There exists a convenient alternative based on message
    		formats. Assuming <code>entry</code> is an object, you can write:
    		</p>
    
    
    		<pre class="prettyprint source">Object entry = new SomeObject(); 
    logger.debug("The entry is {}.", entry);</pre>
    
    		<p>Only after evaluating whether to log or not, and only if the decision
    		is positive, will the logger implementation format the message and
    		replace the '{}' pair with the string value of <code>entry</code>.
    		In other words, this form does not incur the cost of parameter
    		construction when the log statement is disabled.
    		</p>
    
    
    		<p>The following two lines will yield the exact same output.
    		However, in case of a <em>disabled</em> logging statement, the
    		second variant will outperform the first variant by a factor of at
    		least 30.
    		</p>
    
    		<pre class="prettyprint source">logger.debug("The new entry is "+entry+".");
    logger.debug("The new entry is {}.", entry);</pre>
    
    
    		<p>A two argument variant is also available. For example, you can
    		write:
    		</p>
    
    		<pre class="prettyprint source">logger.debug("The new entry is {}. It replaces {}.", entry, oldEntry);</pre>
    
    		<p>If three or more arguments need to be passed, an
    		<code>Object[]</code> variant is also available. For example, you
    		can write:
    		</p>
    
    
    		<pre class="prettyprint source">Object[] paramArray = {newVal, below, above};
    logger.debug("Value {} was inserted between {} and {}.", paramArray);</pre>
    
      
      <a name="UnderTheHood"></a>
      <h3>A peek under the hood</h3>
    
      <p>After we have introduced the essential logback components, we are
      now ready to describe the steps that the logback framework takes
      when the user invokes a logger's printing method. Let us now analyze
      the steps logback takes when the user invokes the
      <code>info()</code> method of a logger named <em>com.wombat</em>.
      </p>
    
      <h4>1. Get the filter chain decision</h4>
    
      <p>If it exists, the <code>TurboFilter</code> chain is
      invoked. Turbo filters can set a context-wide threshold, or filter
      out certain events based on information such as <code>Marker</code>,
      <code>Level</code>, <code>Logger</code>, message, or the
      <code>Throwable</code> that are associated with each logging
      request.  If the reply of the filter chain is
      <code>FilterReply.DENY</code>, then the logging request is
      dropped. If it is <code>FilterReply.NEUTRAL</code>, then we continue
      with the next step, i.e. step 2. In case the reply is
      <code>FilterReply.ACCEPT</code>, we skip the next and directly jump
      to step 3.
      </p>
    
      <h4>2. Apply the <a href="#basic_selection">basic selection
      rule</a></h4>
    
      <p>At this step, logback compares the effective level of the logger
      with the level of the request. If the logging request is disabled
      according to this test, then logback will drop the request without
      further processing. Otherwise, it proceeds to the next step.
      </p>
    
      <h4>3. Create a <code>LoggingEvent</code> object</h4>
    
      <p>If the request survived the previous filters, logback will
      create a <code>ch.qos.logback.classic.LoggingEvent</code> object
      containing all the relevant parameters of the request, such as the
      logger of the request, the request level, the message itself, the
      exception that might have been passed along with the request, the
      current time, the current thread, various data about the class that
      issued the logging request and the <code>MDC</code>. Note that some
      of these fields are initialized lazily, that is only when they are
      actually needed. The <code>MDC</code> is used to decorate the
      logging request with additional contextual information. MDC is
      discussed in a <a href="mdc.html">subsequent chapter</a>.</p>
    
      <h4>4. Invoking appenders</h4>
    
      <p>After the creation of a <code>LoggingEvent</code> object, logback
      will invoke the <code>doAppend()</code> methods of all the
      applicable appenders, that is, the appenders inherited from the
      logger context.
      </p>
    
      <p>All appenders shipped with the logback distribution extend the
      <code>AppenderBase</code> abstract class that implements the
      <code>doAppend</code> method in a synchronized block ensuring
      thread-safety.  The <code>doAppend()</code> method of
      <code>AppenderBase</code> also invokes custom filters attached to
      the appender, if any such filters exist.  Custom filters, which can
      be dynamically attached to any appender, are presented in a <a
      href="filters.html">separate chapter</a>.
      </p>
    
      <h4>5. Formatting the output</h4>
    
      <p>It is responsibility of the invoked appender to format the
      logging event. However, some (but not all) appenders delegate the
      task of formatting the logging event to a layout. A layout formats
      the <code>LoggingEvent</code> instance and returns the result as a
      String. Note that some appenders, such as the
      <code>SocketAppender</code>, do not transform the logging event into
      a string but serialize it instead.  Consequently, they do not
      have nor require a layout.
      </p>
    
      <h4>6. Sending out the <code>LoggingEvent</code></h4>
    
      <p>After the logging event is fully formatted it is sent to its
      destination by each appender.
      </p>
      
      <p>
        Here is a sequence UML diagram to show how everything works. You might
        want to click on the image to display its bigger version.
      </p>
    
      <a href="underTheHood.html">
        <img src="images/chapters/architecture/underTheHoodSequence2_small.gif" 
             alt="underTheHoodSequence2_small.gif"/>
      </a>
    
      
      <h3><a name="performance" href="#performance"><span
      class="anchor"/></a>Performance</h3>
    
      <p>One of the often-cited arguments against logging is its
      computational cost.  This is a legitimate concern as even
      moderately-sized applications can generate thousands of log
      requests. Much of our development effort is spent measuring and
      tweaking logback's performance.  Independently of these efforts, the
      user should still be aware of the following performance issues.
      </p>
    
      <h4>1. Logging performance when logging is turned off entirely</h4>
    
      <p>You can turn off logging entirely by setting the level of the
      root logger to <code>Level.OFF</code>, the highest possible level.
      When logging is turned off entirely, the cost of a log request
      consists of a method invocation plus an integer comparison. On a
      3.2Ghz Pentium D machine this cost is typically around 20
      nanoseconds.
      </p>
    
      <p>However, any method invocation involves the "hidden" cost of
      parameter construction.  For example, for some logger <em>x</em>
      writing,
      </p>
      
      <pre class="prettyprint source">x.debug("Entry number: " + i + "is " + entry[i]);</pre>
    
      <p>incurs the cost of constructing the message parameter,
      i.e. converting both integer <code>i</code> and
      <code>entry[i]</code> to a string, and concatenating intermediate
      strings, regardless of whether the message will be logged or not.
      </p>
    
      <p>The cost of parameter construction can be quite high and depends
      on the size of the parameters involved. To avoid the cost of
      parameter construction you can take advantage of SLF4J's parameterized
      logging:
      </p>
    
      <pre class="prettyprint source">x.debug("Entry number: {} is {}", i, entry[i]);</pre>
    
      <p>This variant will not incur the cost of parameter
      construction. Compared to the previous call to the
      <code>debug()</code> method, it will be faster by a wide margin.
      The message will be formatted only if the logging request is to be
      sent to attached appenders. Moreover, the component that formats
      messages is highly optimized.
      </p>
    
      <p>Notwithstanding the above placing log statements in tight loops,
      i.e. very frequently invoked code, is a lose-lose proposal, likely
      to result in degraded performance.  Logging in tight loops will slow
      down your application even if logging is turned off, and if logging
      is turned on, will generate massive (and hence useless) output.
      </p>
    
      <h4>2. The performance of deciding whether to log or not to log when
      logging is turned on.</h4>
    
      <p>In logback, there is no need to walk the logger hierarchy. A
      logger knows its effective level (that is, its level, once level
      inheritance has been taken into consideration) when it is
      created. Should the level of a parent logger be changed, then all
      child loggers are contacted to take notice of the change. Thus,
      before accepting or denying a request based on the effective level,
      the logger can make a quasi-instantaneous decision, without needing
      to consult its ancestors.
      </p>
    
    
      <h4>3. Actual logging (formatting and writing to the output device)</h4>
    
      <p>This is the cost of formatting the log output and sending it to
      its target destination. Here again, a serious effort was made to
      make layouts (formatters) perform as quickly as possible.  The same
      is true for appenders. The typical cost of actually logging is about
      9 to 12 microseconds when logging to a file on the local machine.
      It goes up to several milliseconds when logging to a database on a
      remote server.
      </p>
    
      <p>Although feature-rich, one of the foremost design goals of
      logback was speed of execution, a requirement which is second only
      to reliability. Some logback components have been rewritten several
      times to improve performance.
      </p>
    
        
      <script src="../templates/footer.js" type="text/javascript"></script>
    </div>
    </body>
    </html>
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/manual/menu.js�������������������������������������������0000644�0001750�0001750�00000002746�12136042273�023142� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
    document.write('<p class="menu_header">Chapter Index</p>')
    document.write('<p class="menu"><a href="introduction.html"><b>Ch1: Introduction to logback</b></a></p>');
    document.write('<p class="menu"><a href="architecture.html"><b>Ch2: Architecture</b></a></p>');
    document.write('<p class="menu"><a href="configuration.html"><b>Ch3: Configuration</b></a></p>');
    document.write('<p class="menu"><a href="appenders.html"><b>Ch4: Appenders</b></a></p>');
    document.write('<p class="menu"><a href="encoders.html"><b>Ch5: Encoders</b></a></p>');
    document.write('<p class="menu"><a href="layouts.html"><b>Ch6: Layouts</b></a></p>');
    document.write('<p class="menu"><a href="filters.html"><b>Ch7: Filters</b></a></p>');
    document.write('<p class="menu"><a href="mdc.html"><b>Ch8: Mapped Diagnostic Contexts</b></a></p>');
    document.write('<p class="menu"><a href="loggingSeparation.html"><b>Ch9: Logging Separation</b></a></p>');
    document.write('<p class="menu"><a href="jmxConfig.html"><b>Ch10: JMX Configurator</b></a></p>');
    document.write('<p class="menu"><a href="onJoran.html"><b>Ch11: Joran</b></a></p>');
    document.write('<p class="menu"><a href="groovy.html"><b>Ch12: Groovy Configuration</b></a></p>');
    document.write('<p class="menu"><a href="migrationFromLog4j.html"><b>Ch13: Migration from log4j</b></a></p>');
    document.write('<p class="menu"><a href="receivers.html"><b>Ch14: Receivers</b></a></p>');
    document.write('<p class="menu"><a href="usingSSL.html"><b>Ch15: Using SSL</b></a></p>');
    ��������������������������logback_1.0.13/logback-site/src/site/pages/manual/configuration.html��������������������������������0000644�0001750�0001750�00000240566�12136562314�025404� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Chapter 3: Configuration</title>
        
        <link rel="stylesheet" type="text/css" href="../css/common.css" />
        <link rel="stylesheet" type="text/css" href="../css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="../css/_print.css" media="print" />
        <link rel="stylesheet" type="text/css" href="../css/prettify.css" media="screen" />
    
      </head>
      <body onload="prettyPrint()">
    
        <script type="text/javascript">prefix='../'</script>
        <script type="text/javascript" src="../js/prettify.js"></script>
        <script src="../templates/header.js" type="text/javascript"></script>
        <script type="text/javascript" src="../js/dsl.js"></script>
        <div id="left">
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="../templates/left.js" type="text/javascript"></script>
        </div>
        <div id="right">
          <script src="menu.js" type="text/javascript"></script>
        </div>
        <div id="content" class="chapter">
          
          <h1>Chapter 3: Logback configuration</h1>
          
        <div class="quote">
          <p><em>In symbols one observes an advantage in discovery which
          is greatest when they express the exact nature of a thing
          briefly and, as it were, picture it; then indeed the labor of
          thought is wonderfully diminished.</em>
          </p>
          <p>&mdash;GOTTFRIED WILHELM LEIBNIZ</p>
        </div>
    
    
        <script src="../templates/creative.js" type="text/javascript"></script>
    
    
        <p>We start by presenting ways for configuring logback, with many
        example configuration scripts.  Joran, the configuration framework
        upon which logback relies will be presented in <a
        href="onJoran.html">a later chapter</a>.
        </p>
    
    
        <h2><a name="auto_configuration" href="#auto_configuration"><span
        class="anchor"/></a>Configuration in logback</h2>
        
        <p>Inserting log requests into the application code requires a
        fair amount of planning and effort. Observation shows that
        approximately four percent of code is dedicated to
        logging. Consequently, even a moderately sized application will
        contain thousands of logging statements embedded within its
        code. Given their number, we need tools to manage these log
        statements.
        </p>
    
        <p>Logback can be configured either programmatically or with a
        configuration script expressed in XML or Groovy format. By the
        way, existing log4j users can convert their
        <em>log4j.properties</em> files to <em>logback.xml</em> using our
        <a
        href="http://logback.qos.ch/translator/">PropertiesTranslator</a>
        web-application.
        </p>
    
        <p>Let us begin by discussing the initialization steps that
        logback follows to try to configure itself:
        </p>
    
        <ol>
          <li>
            <p>Logback tries to find a file called
            <em>logback.groovy</em> <a
            href="../faq.html#configFileLocation">in the
            classpath</a>.</p>
          </li>
    
          <li>
            <p>If no such file is found, logback tries to find a file
            called <em>logback-test.xml</em> <a
            href="../faq.html#configFileLocation">in the
            classpath</a>.</p>
          </li>
    
          <li><p>If no such file is found, it checks for the file
          <em>logback.xml</em>  <a
            href="../faq.html#configFileLocation">in the
            classpath</a>..</p>
          </li>
          
          <li><p>If neither file is found, logback configures itself
          automatically using the <a
          href="../xref/ch/qos/logback/classic/BasicConfigurator.html"><code>BasicConfigurator</code></a>
          which will cause logging output to be directed to the console.
          </p> 
          </li> 
    
        </ol>
    
        <p>The fourth and last step is meant to provide a default (but
        very basic) logging functionality in the absence of a
        configuration file.
        </p>
    
    
        <p>If you are using Maven and if you place the
        <em>logback-test.xml</em> under the
        <em>src/test/resources</em> folder, Maven will ensure that it
        won't be included in the artifact produced. Thus, you can use a
        different configuration file, namely <em>logback-test.xml</em>
        during testing, and another file, namely, <em>logback.xml</em>, in
        production. The same principle applies by analogy for Ant.
        </p>
    
    
        <h3><a name="automaticConf" href="#automaticConf"><span
        class="anchor"/></a>Automatically configuring logback</h3>
    
        <p>The simplest way to configure logback is by letting logback
        fall back to its default configuration. Let us give a taste of how
        this is done in an imaginary application called
        <code>MyApp1</code>.
        </p>
    
        <p class="example">Example: Simple example of
        <code>BasicConfigurator</code> usage <a
        href="../xref/chapters/configuration/MyApp1.html">(logback-examples/src/main/java/chapters/configuration/MyApp1.java)</a></p>
    
        <pre class="prettyprint source">package manual.configuration;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    public class MyApp1 {
      final static Logger logger = LoggerFactory.getLogger(MyApp1.class);
    
      public static void main(String[] args) {
        logger.info("Entering application.");
    
        Foo foo = new Foo();
        foo.doIt();
        logger.info("Exiting application.");
      }
    }</pre>
    
      <p>This class defines a static logger variable. It then instantiates
      a <code>Foo</code> object. The <code>Foo</code> class is listed
      below:
      </p>
    
      <p class="example">Example: Small class doing logging 
      <a href="../xref/chapters/configuration/Foo.html">(logback-examples/src/main/java/chapters/configuration/Foo.java)</a>
      </p>
    
      <pre class="prettyprint source">package chapters.configuration;
      
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
       
    public class Foo {
      static final Logger logger = LoggerFactory.getLogger(Foo.class);
      
      public void doIt() {
        logger.debug("Did it again!");
      }
    }</pre>
    
    
        <p>In order to run the examples in this chapter, you need to make
        sure that certain jar files are present on the class path.  Please
        refer to the <a href="../setup.html">setup page</a> for further
        details.
        </p>
    
        <p>Assuming the configuration files <em>logback-test.xml</em> or
        <em>logback.xml</em> are not present, logback will default to
        invoking <a
        href="../xref/ch/qos/logback/classic/BasicConfigurator.html"><code>BasicConfigurator</code></a>
        which will set up a minimal configuration. This minimal
        configuration consists of a <code>ConsoleAppender</code> attached
        to the root logger.  The output is formatted using a
        <code>PatternLayoutEncoder</code> set to the pattern
        <em>%d{HH:mm:ss.SSS}&nbsp;[%thread]&nbsp;%-5level&nbsp;%logger{36}&nbsp;-&nbsp;%msg%n</em>. Moreover,
        by default the root logger is assigned the <code>DEBUG</code>
        level.
        </p>
    
        <p>Thus, the output of the command <em>java chapters.configuration.MyApp1</em>
        should be similar to:
        </p>
    
        <p class="source">16:06:09.031 [main] INFO  chapters.configuration.MyApp1 - Entering application.
    16:06:09.046 [main] DEBUG chapters.configuration.Foo - Did it again!
    16:06:09.046 [main] INFO  chapters.configuration.MyApp1 - Exiting application.</p>
    
    
       <p class="highlight">Except code that configures logback (if such
       code exists) client code does not need to depend on
       logback. Applications that use logback as their logging framework
       will have a compile-time dependency on SLF4J but not logback.
       </p>
    
       <p>The <code>MyApp1</code> application links to logback via calls
       to <code>org.slf4j.LoggerFactory</code> and
       <code>org.slf4j.Logger</code> classes, retrieve the loggers it
       wishes to use, and chugs on.  Note that the only dependencies of
       the <code>Foo</code> class on logback are through
       <code>org.slf4j.LoggerFactory</code> and
       <code>org.slf4j.Logger</code> imports.  Except code that configures
       logback (if such code exists) client code does not need to depend
       on logback. Since SLF4J permits the use of any logging
       framework under its abstraction layer, it is easy to migrate
       large bodies of code from one logging framework to another.
       </p>
    
       <h3>Automatic configuration with <em>logback-test.xml</em> or
       <em>logback.xml</em></h3>
    
       <p>As mentioned earlier, logback will try to configure itself using
       the files <em>logback-test.xml</em> or <em>logback.xml</em> if
       found on the class path. Here is a configuration file equivalent to
       the one established by <code>BasicConfigurator</code> we've just
       seen.
       </p>
    
       <p class="example">Example: Basic configuration file
       (logback-examples/src/main/java/chapters/configuration/sample0.xml)</p>
       <span class="asGroovy" onclick="return asGroovy('sample0');">View as .groovy</span>
    
    
      <pre id="sample0" class="prettyprint source">&lt;configuration>
    
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        &lt;!-- encoders are assigned the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
        &lt;encoder>
          &lt;pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;root level="debug">
        &lt;appender-ref ref="STDOUT" />
      &lt;/root>
    &lt;/configuration></pre>
    
       <p>After you have renamed <em>sample0.xml</em> as
       <em>logback.xml</em> (or <em>logback-test.xml</em>) place it into a
       directory accessible from the class path. Running the <em>MyApp1</em>
       application should give identical results to its previous run.</p>
    
       <h4><a name="automaticStatusPrinting"
       href="#automaticStatusPrinting"><span class="anchor"/></a>Automatic
       printing of status messages in case of warning or errors</h4>
    
       <p class="highlight">If warning or errors occur during the parsing
       of the configuration file, logback will automatically print its
       internal status messages on the console.</p>
     
       <p>If warnings or errors occur during the parsing of the
       configuration file, logback will automatically print its internal
       status data on the console. Note that to avoid duplication,
       automatic status printing is disabled if the user explicitly
       registers a status listener (defined below).</p>
    
       <p>In the absence of warnings or errors, if you still wish to
       inspect logback's internal status, then you can instruct logback to
       print status data by invoking the <code>print()</code> of the
       <code>StatusPrinter</code> class. The <em>MyApp2</em> application
       shown below is identical to <em>MyApp1</em> except for the addition
       of two lines of code for printing internal status data.</p>
    
        <p class="example">Example: Print logback's internal status
        information <a
        href="../xref/chapters/configuration/MyApp2.html">(logback-examples/src/main/java/chapters/configuration/MyApp2.java)</a></p>
    
      
    <pre class="prettyprint lang-java source">
      public static void main(String[] args) {
        // assume SLF4J is bound to logback in the current environment
        <b>LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();</b>
        // print logback's internal status
        <b>StatusPrinter.print(lc);</b>
        ...
      }</pre>
    
      <p>If everything goes well, you should see the following output on the console</p>
    
       <div class="source longline"><pre>17:44:58,578 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback-test.xml]
    17:44:58,671 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - debug attribute not set
    17:44:58,671 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
    17:44:58,687 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [STDOUT]
    17:44:58,812 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Popping appender named [STDOUT] from the object stack
    17:44:58,812 |-INFO in ch.qos.logback.classic.joran.action.LevelAction - root level set to DEBUG
    17:44:58,812 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [STDOUT] to Logger[root]
    
    17:44:58.828 [main] INFO  chapters.configuration.MyApp2 - Entering application.
    17:44:58.828 [main] DEBUG chapters.configuration.Foo - Did it again!
    17:44:58.828 [main] INFO  chapters.configuration.MyApp2 - Exiting application.
    </pre></div>
    
      <p>At the end of this output, you can recognize the lines that were
      printed in the previous example. You should also notice the
      logback's internal messages, a.k.a. <code>Status</code> objects,
      which allow convenient access to logback's internal state.
      </p>
    
       <p>Instead of invoking <code>StatusPrinter</code> programmatically
       from your code, you can instruct the configuration file to dump
       status data, even in the absence of errors. To achieve this, you
       need to set the <span class="attr">debug</span> attribute of the
       <em>configuration</em> element, i.e. the top-most element in the
       configuration file, as shown below. Please note that this <span
       class="attr">debug</span> attribute relates only to the status
       data. It does <em>not</em> affect logback's configuration
       otherwise, in particular with respect to logger levels. (If you are
       asking, no, the root logger will <em>not</em> be set to
       <code>DEBUG</code>.)
       </p>
    
    
       <p class="example">Example: Basic configuration file using debug
       mode
       (logback-examples/src/main/java/chapters/configuration/sample1.xml)</p>
       <span class="asGroovy" onclick="return asGroovy('sample1');">View as .groovy</span>
    
       <pre id="sample1" class="prettyprint source">
    &lt;configuration <span class="big bold">debug="true"</span>> 
    
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
        &lt;!-- encoders are  by default assigned the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
        &lt;encoder>
          &lt;pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;root level="debug">
        &lt;appender-ref ref="STDOUT" />
      &lt;/root>
    &lt;/configuration></pre>
      
       <p>Setting the <code>debug</code> attribute within the
       &lt;configuration&gt; element will output status information,
       assuming that:
       </p>
       <ol>
         <li>the configuration file is found</li>
         <li>the configuration file is well-formed XML.</li>
       </ol>
         
       <p>If any of these two conditions is not fulfilled, Joran cannot
       interpret the <span class="attr">debug</span> attribute since the
       configuration file cannot be read. If the configuration file is
       found but is malformed, then logback will detect the error
       condition and automatically print its internal status on the
       console. However, if the configuration file cannot be found,
       logback will not automatically print its status data, since this is
       not necessarily an error condition. Programmatically invoking
       <code>StatusPrinter.print()</code> as shown in the <a
       href="../xref/chapters/configuration/MyApp2.html"><em>MyApp2</em></a>
       application above ensures that status information is printed in
       every case.</p>
    
     
       <p><span class="label">Forcing status output</span> In the absence
       of status messages, tracking down a rogue <em>logback.xml</em>
       configuration file can be difficult, especially in production where
       the application source cannot be easily modified. To help identify
       the location of a rogue configuration file, you can set a
       <code>StatusListener</code> via the "logback.statusListenerClass"
       system property (<a href="#logback.statusLC">defined below</a>) to
       force output of status messages. The "logback.statusListenerClass"
       system property can also be used to silence output automatically
       generated in case of errors.
       </p>
    
       <h3><a name="configFileProperty" href="#configFileProperty"><span
       class="anchor"/></a>Specifying the location of the default
       configuration file as a system property</h3>
    
       <p>You may specify the location of the default configuration file
       with a system property named
       <code>"logback.configurationFile"</code>. The value of this
       property can be a URL, a resource on the class path or a path to a
       file external to the application.
       </p>
    
       <p class="source">java <b>-Dlogback.configurationFile=/path/to/config.xml</b> chapters.configuration.MyApp1</p>
    
       <p>Note that the file extension must be ".xml" or ".groovy". Other
       extensions are ignored. <a href="#logback.statusLC">Explicitly
       registering a status listener</a> may help debugging issues
       locating the configuration file.</p>
    
    
       <h3><a name="autoScan" href="#autoScan"><span
       class="anchor"/></a>Automatically reloading configuration file upon
       modification</h3>
    
       <p class="highlight">Logback-classic can scan for changes in its
       configuration file and automatically reconfigure itself when the
       configuration file changes.</p>
    
       <p>If instructed to do so, logback-classic will scan for changes in
       its configuration file and automatically reconfigure itself when
       the configuration file changes. In order to instruct
       logback-classic to scan for changes in its configuration file and
       to automatically re-configure itself set the <span
       class="attr">scan</span> attribute of the
       <code>&lt;configuration></code> element to true, as shown next.
    
       </p>
      
       <p class="example">Example: Scanning for changes in configuration
       file and automatic re-configuration
       (logback-examples/src/main/java/chapters/configuration/scan1.xml)</p>
    
      <span class="asGroovy" onclick="return asGroovy('scan1');">View as .groovy</span>
    <pre id="scan1" class="prettyprint source">
    &lt;configuration <b>scan="true"</b>> 
      ... 
    &lt;/configuration> </pre>
    
    
       <p>By default, the configuration file will be scanned for changes
       once every minute. You can specify a different scanning period by
       setting the <span class="attr">scanPeriod</span> attribute of the
       <code>&lt;configuration></code> element. Values can be specified in
       units of milliseconds, seconds, minutes or hours. Here is an
       example:</p>
    
      <p class="example">Example: Specifying a different scanning period
      (logback-examples/src/main/java/chapters/configuration/scan2.xml)</p>
      <span class="asGroovy" onclick="return asGroovy('scan2');">View as .groovy</span>
      <pre id="scan2" class="prettyprint source">
    &lt;configuration scan="true" <b>scanPeriod="30 seconds"</b> > 
      ...
    &lt;/configuration> </pre>
    
       <p><span class="label">Note</span> If no unit of time is specified,
       then the unit of time is assumed to be milliseconds, which is
       usually inappropriate. If you change the default scanning period,
       do not forget to specify a time unit.
       </p>
    
       <p>Behind the scenes, when you set the scan attribute to true, a
       <code>TurboFilter</code> called <a
       href="../xref/ch/qos/logback/classic/turbo/ReconfigureOnChangeFilter.html">ReconfigureOnChangeFilter</a>
       will be installed. TurboFilters are described in a <a
       href="filters.html#TurboFilter">later chapter</a>. As a
       consequence, scanning is done "in-thread", that is any time a
       printing method of logger is invoked. For example, for a logger
       named <code>myLogger</code>, when you write
       "myLogger.debug("hello");", and if the scan attribute is set to
       true, then <code>ReconfigureOnChangeFilter</code> will be
       invoked. Moreover, the said filter will be invoked even if
       <code>myLogger</code> is disabled for the DEBUG level.
       </p>
    
       <p class="highlight">When a configuration file changes, it will be
       automatically reloaded but only after several logger invocations
       and after a delay determined by the scanning period.
       </p>
    
       <p>Given that <code>ReconfigureOnChangeFilter</code> is invoked
       every time <em>any</em> logger is invoked, regardless of logger
       level, <code>ReconfigureOnChangeFilter</code> is absolutely
       performance critical. So much so that in fact, the check whether
       the scan period has elapsed or not, is too costly in itself. In
       order to improve performance,
       <code>ReconfigureOnChangeFilter</code> is in reality "alive" only
       once every <em>N</em> logging operations.  Depending on how often
       your application logs, the value of <em>N</em> can be modified on
       the fly by logback. By default N is 16, although it can go as high
       as 2^16 (=&nbsp;65536) for CPU-intensive applications.
       </p>
       
       <p>In short, when a configuration file changes, it will be
       automatically reloaded but only after several logger invocations
       <em>and</em> after a delay determined by the scanning period.
       </p>
    
       
    
       <h3><a name="joranDirectly" href="#joranDirectly"><span
       class="anchor"/></a>Invoking <code>JoranConfigurator</code>
       directly</h3>
    
       <p>Logback relies on a configuration library called Joran, part of
       logback-core. Logback's default configuration mechanism invokes
       <code>JoranConfigurator</code> on the default configuration file it
       finds on the class path. If you wish to override logback's default
       configuration mechanism for whatever reason, you can do so by
       invoking <code>JoranConfigurator</code> directly. The next
       application, <em>MyApp3</em>, invokes JoranConfigurator on a
       configuration file passed as a parameter.</p>
       
       <p class="example">Example: Invoking <code>JoranConfigurator</code>
       directly <a
       href="../xref/chapters/configuration/MyApp3.html">(logback-examples/src/main/java/chapters/configuration/MyApp3.java)</a></p>
    
    <pre class="prettyprint source">package chapters.configuration;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.util.StatusPrinter;
    
    public class MyApp3 {
      final static Logger logger = LoggerFactory.getLogger(MyApp3.class);
    
      public static void main(String[] args) {
        // assume SLF4J is bound to logback in the current environment
        <b>LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();</b>
        
        <b>try {
          JoranConfigurator configurator = new JoranConfigurator();
          configurator.setContext(context);
          // Call context.reset() to clear any previous configuration, e.g. default 
          // configuration. For multi-step configuration, omit calling context.reset().
          context.reset(); 
          configurator.doConfigure(args[0]);
        } catch (JoranException je) {
          // StatusPrinter will handle this
        }
        StatusPrinter.printInCaseOfErrorsOrWarnings(context);</b>
    
        logger.info("Entering application.");
    
        Foo foo = new Foo();
        foo.doIt();
        logger.info("Exiting application.");
      }
    }</pre>
    
       <p>This application fetches the <code>LoggerContext</code>
       currently in effect, creates a new <code>JoranConfigurator</code>,
       sets the context on which it will operate, resets the logger
       context, and then finally asks the configurator to configure the
       context using the configuration file passed as a parameter to the
       application. Internal status data is printed in case of warnings or
       errors. Note that for multi-step configuration,
       <code>context.reset()</code> invocation should be omitted.</p>
    
       <h3><a name="viewingStatusMessages"
       href="#viewingStatusMessages"><span class="anchor"/></a>Viewing
       status messages
       </h3>
    
    
    
       <p>Logback collects its internal status data in a <code><a
       href="../xref/ch/qos/logback/core/status/StatusManager.html">StatusManager</a></code>
       object, accessible via the <code>LoggerContext</code>.
       </p>
    
       <p>Given a <code>StatusManager</code> you can access all the status
       data associated with a logback context. To keep memory usage at
       reasonable levels, the default <code>StatusManager</code>
       implementation stores the status messages in two separate parts:
       the header part and the tail part. The header part stores the first
       <em>H</em> status messages whereas the tail part stores the last
       <em>T</em> messages. At present time <em>H</em>=<em>T</em>=150,
       although these values may change in future releases.</p>
    
       <p>Logback-classic ships with a servlet called
       ViewStatusMessagesServlet. This servlet prints the contents of the
       <code>StatusManager</code> associated with the current
       <code>LoggerContext</code> as an HTML table. Here is sample output.
       </p>
       
       <a href="images/chapters/configuration/lbClassicStatus.jpg">
         <img src="images/chapters/configuration/lbClassicStatus.jpg" alt="click to enlarge" width="90%"/>
       </a>
    
       <p>To add this servlet to your web-application, add the following
       lines to its <em>WEB-INF/web.xml</em> file.</p>
    
       <pre class="prettyprint source">  &lt;servlet>
        &lt;servlet-name>ViewStatusMessages&lt;/servlet-name>
        &lt;servlet-class>ch.qos.logback.classic.ViewStatusMessagesServlet&lt;/servlet-class>
      &lt;/servlet>
    
      &lt;servlet-mapping>
        &lt;servlet-name>ViewStatusMessages&lt;/servlet-name>
        &lt;url-pattern>/lbClassicStatus&lt;/url-pattern>
      &lt;/servlet-mapping></pre>
       
       <p>The <code>ViewStatusMessages</code> servlet will be viewable at
       the URL <code>http://host/yourWebapp/lbClassicStatus</code>
       </p>
    
       <h3><a name="statusListener" href="#statusListener"><span
       class="anchor"/></a>Listening to status messages
       </h3>
    
       <p>You may also attach a <code>StatusListener</code> to a
       <code>StatusManager</code> so that you can take immediate action in
       response to status messages, especially to messages occurring after
       logback configuration. Registering a status listener is a
       convenient way to supervise logback's internal state without human
       intervention.
       </p>
    
       <p>Logback ships with a <code>StatusListener</code> implementation
       called <code><a
       href="../xref/ch/qos/logback/core/status/OnConsoleStatusListener.html">OnConsoleStatusListener</a></code>
       which, as its name indicates, prints all <em>new</em> incoming
       status messages on the console.
       </p>
    
       <p>Here is <a
       href="../xref/chapters/configuration/AddStatusListenerApp.html">sample
       code</a> to register an <code>OnConsoleStatusListener</code>
       instance with the StatusManager.
       </p>
    
       <pre class="prettyprint source">   LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); 
       StatusManager statusManager = lc.getStatusManager();
       OnConsoleStatusListener onConsoleListener = new OnConsoleStatusListener();
       statusManager.add(onConsoleListener);</pre>
    
       <p>Note that the registered status listener will only receive status
       events subsequent to its registration. It will not receive prior
       messages. Thus, it is usually a good idea to place status listener
       registration directives at top of the configuration file before
       other directives.</p>
    
       <p>It is also possible to register one or more status listeners
       within a configuration file. Here is an example.</p>
    
       <p class="example">Example: Registering a status listener
       (logback-examples/src/main/java/chapters/configuration/onConsoleStatusListener.xml)</p>
    
       <span class="asGroovy" onclick="return asGroovy('onConsoleStatusListener');">View as .groovy</span>
       <pre id="onConsoleStatusListener" class="prettyprint source">&lt;configuration>
      <b>&lt;statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" /></b>  
    
      ... the rest of the configuration file  
    &lt;/configuration></pre>
    
       <h3><a name="logback.statusLC" href="#logback.statusLC"><span
       class="anchor"/></a>"logback.statusListenerClass" system property
       </h3>
    
       <p>One may also register a status listener by setting the
       "logback.statusListenerClass" Java system property to the name of
       the listener class you wish to register. For example,
       </p>
    
       <p class="source">java <b>-Dlogback.statusListenerClass</b>=ch.qos.logback.core.status.OnConsoleStatusListener&nbsp;...</p>
       
       <p>Logback ships with several status listener implementations. <a
       href="../xref/ch/qos/logback/core/status/OnConsoleStatusListener.html">OnConsoleStatusListener</a>
       prints incoming status messages on the console, i.e. on
       System.out. <a
       href="../xref/ch/qos/logback/core/status/OnErrorConsoleStatusListener.html">OnErrorConsoleStatusListener</a>
       prints incoming status messages on System.err. <a
       href="../xref/ch/qos/logback/core/status/NopStatusListener.html">NopStatusListener</a>
       drops incoming status messages.</p>
       
    
       <p>Note that <a href="#automaticStatusPrinting">automatic status
       printing</a> (in case of errors) is disabled if any status listener
       is registered during configuration and in particular if the user
       specifies a status listener via the "logback.statusListenerClass"
       system. Thus, by setting <code>NopStatusListener</code> as a status
       listener, you can silence internal status printing altogether. </p>
       
       <p class="source">java <b>-Dlogback.statusListenerClass</b>=ch.qos.logback.core.status.NopStatusListener&nbsp;...</p>
    
       <h2><a name="syntax" href="#syntax"><span
       class="anchor"/></a>Configuration file syntax
       </h2>
    
       <p>As you have seen thus far in the manual with plenty of examples
       still to follow, logback allows you to redefine logging behavior
       without needing to recompile your code.  Indeed, you can easily
       configure logback so as to disable logging for certain parts of
       your application, or direct output to a UNIX Syslog daemon, to a
       database, to a log visualizer, or forward logging events to a
       remote logback server, which would log according to local server
       policy, for example by forwarding the log event to a second logback
       server.
       </p>
    	
       <p>The remainder of this section presents the syntax of
       configuration files. 
       </p>
    
       <p>As will be demonstrated over and over, the syntax of logback
       configuration files is extremely flexible. As such, it is not
       possible to specify the allowed syntax with a DTD file or an XML
       schema. Nevertheless, the very basic structure of the configuration
       file can be described as, <code>&lt;configuration></code> element,
       followed by zero or more <code>&lt;appender></code> elements,
       followed by zero or more <code>&lt;logger></code> elements,
       followed by at most one <code>&lt;root></code> element. The
       following diagram illustrates this basic structure.</p>
    
      
      <p align="left">
        <img src="images/chapters/configuration/basicSyntax.png" 
             alt="basic Syntax" title="Basic configuration file structure"/>
      </p>
    
    
        <p class="highlight">If you are unsure which case to use for a
        given tag name, just follow the <a
        href="http://en.wikipedia.org/wiki/CamelCase">camelCase
        convention</a> which is almost always the correct convention.</p>
    
        <h4><a name="caseSensitivity" href="#caseSensitivity"><span
        class="anchor"/></a>Case sensitivity of tag names</h4>
       
    
        <p>Since logback version 0.9.17, tag names pertaining to explicit
        rules are case insensitive.  For example, <code>&lt;logger></code>, <code>&lt;Logger></code> and
        <code>&lt;LOGGER></code> are valid configuration elements and will
        be interpreted in the same way. Note that XML well-formedness
        rules still apply, if you open a tag as <code>&lt;xyz></code> you
        must close it as <code>&lt;/xyz></code>, <code>&lt;/XyZ></code>
        will not work. As for <a href="onJoran.html#implicit">implicit
        rules</a>, tag names are case sensitive except for the first
        letter.  Thus, <code>&lt;xyz></code> and <code>&lt;Xyz></code> are
        equivalent but not <code>&lt;xYz></code>.  Implicit rules usually
        follow the <a href="http://en.wikipedia.org/wiki/CamelCase">camelCase</a>
        convention, common in the Java world. Since it is not
        easy to tell when a tag is associated with an explicit action and
        when it is associated with an implicit action, it is not trivial
        to say whether an XML tag is case-sensitive or insensitive with
        respect to the first letter. If you are unsure which case to use
        for a given tag name, just follow the camelCase convention which
        is almost always the correct convention.
        </p>
    
        <h4><a name="loggerElement" href="#loggerElement"><span
        class="anchor"/></a>Configuring loggers, or the
        <code>&lt;logger></code> element</h4>
    
        <p>At this point you should have at least some understanding of <a
        href="architecture.html#effectiveLevel">level inheritance</a> and
        the <a href="architecture.html#basic_selection">basic selection
        rule</a>. Otherwise, and unless you are an Egyptologist, logback
        configuration will be no more meaningful to you than are
        hieroglyphics.
        </p>
    
        <p>A logger is configured using the <code>&lt;logger></code>
        element. A <code>&lt;logger></code> element takes exactly one
        mandatory <span class="attr">name</span> attribute, an optional
        <span class="attr">level</span> attribute, and an optional <span
        class="attr">additivity</span> attribute, admitting the values
        <em>true</em> or <em>false</em>. The value of the <span
        class="attr">level</span> attribute admitting one of the
        case-insensitive string values TRACE, DEBUG, INFO, WARN, ERROR,
        ALL or OFF. The special case-insensitive value <em>INHERITED</em>,
        or its synonym <em>NULL</em>, will force the level of the logger
        to be inherited from higher up in the hierarchy. This comes in
        handy if you set the level of a logger and later decide that
        it should inherit its level.
        </p>
    
        <p class="highlight"> Note that unlike log4j, logback-classic does
        <em>not</em> close nor remove any previously referenced appenders
        when configuring a given logger.
        </p>
    
        <p>The <code>&lt;logger></code> element may contain zero or more
        <code>&lt;appender-ref></code> elements; each appender thus
        referenced is added to the named logger. Note that unlike log4j,
        logback-classic does <em>not</em> close nor remove any previously
        referenced appenders when configuring a given logger.
        </p>
    
    
    
       <h4><a name="rootElement" href="#rootElement"><span
       class="anchor"/></a>Configuring the root logger, or the
       <code>&lt;root></code> element</h4>
    
       <p>The <code>&lt;root></code> element configures the root
       logger. It supports a single attribute, namely the <span
       class="attr">level</span> attribute. It does not allow any other
       attributes because the additivity flag does not apply to the root
       logger.  Moreover, since the root logger is already named as
       "ROOT", it does not allow a name attribute either. The value of the
       level attribute can be one of the case-insensitive strings TRACE,
       DEBUG, INFO, WARN, ERROR, ALL or OFF. Note that the level of the
       root logger cannot be set to INHERITED or NULL.
       </p>
    
       <p class="highlight">Note that unlike log4j, logback-classic does
       <em>not</em> close nor remove any previously referenced appenders
       when configuring the root logger.</p>
    
       <p> Similarly to the <code>&lt;logger></code> element, the
       <code>&lt;root></code> element may contain zero or more
       <code>&lt;appender-ref></code> elements; each appender thus
       referenced is added to the root logger. Note that unlike log4j,
       logback-classic does <em>not</em> close nor remove any previously
       referenced appenders when configuring the root logger.  </p>
    
       <h4>Example</h4>
    
       <p>Setting the level of a logger or root logger is as simple as
       declaring it and setting its level, as the next example
       illustrates. Suppose we are no longer interested in seeing any
       DEBUG messages from any component belonging to the
       "chapters.configuration" package. The following configuration file
       shows how to achieve that.
       </p>
    
       <p class="example">Example: Setting the level of a logger
       (logback-examples/src/main/java/chapters/configuration/sample2.xml)</p>
    
       <span class="asGroovy" onclick="return asGroovy('sample2');">View as .groovy</span>
       <pre id="sample2" class="prettyprint source">&lt;configuration>
    
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        &lt;!-- encoders are assigned the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
        &lt;encoder>
          &lt;pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      <b>&lt;logger name="chapters.configuration" level="INFO"/></b>
    
      &lt;!-- Strictly speaking, the level attribute is not necessary since --&gt;
      &lt;!-- the level of the root level is set to DEBUG by default.       --&gt;
      &lt;root level="DEBUG">		
        &lt;appender-ref ref="STDOUT" />
      &lt;/root>  
      
    &lt;/configuration></pre>
    
      <p>When the above configuration file is given as argument to the
      <em>MyApp3</em> application, it will yield the following output:
      </p>
    
    <pre class="source">17:34:07.578 [main] INFO  chapters.configuration.MyApp3 - Entering application.
    17:34:07.578 [main] INFO  chapters.configuration.MyApp3 - Exiting application.</pre>
    
      <p>Note that the message of level DEBUG generated by the <a
      href="../xref/chapters/configuration/Foo.html">"chapters.configuration.Foo"</a>
      logger has been suppressed. See also the Foo class.</p>
    
      <p>You can configure the levels of as many loggers as you wish.  In
      the next configuration file, we set the level of the
      <em>chapters.configuration</em> logger to INFO but at the same time set the level
      of the <em>chapters.configuration.Foo</em> logger to <code>DEBUG</code>.
      </p>
    
      <p class="example">Example: Setting the level of multiple loggers
      (logback-examples/src/main/java/chapters/configuration/sample3.xml)</p>
      
      <span class="asGroovy" onclick="return asGroovy('sample3');">View as .groovy</span>
      <pre id="sample3" class="source prettyprint">&lt;configuration>
    
      &lt;appender name="STDOUT"
        class="ch.qos.logback.core.ConsoleAppender">
        &lt;encoder>
          &lt;pattern>
            %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
         &lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      <b>&lt;logger name="chapters.configuration" level="INFO" /></b>
      <b>&lt;logger name="chapters.configuration.Foo" level="DEBUG" /></b>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="STDOUT" />
      &lt;/root>
    
    &lt;/configuration></pre>
    
      <p>Running <code>MyApp3</code> with this configuration file will
      result in the following output on the console:
      </p>
    
    <p class="prettyprint source">17:39:27.593 [main] INFO  chapters.configuration.MyApp3 - Entering application.
    17:39:27.593 [main] DEBUG chapters.configuration.Foo - Did it again!
    17:39:27.593 [main] INFO  chapters.configuration.MyApp3 - Exiting application.</p>
    
       <p>The table below list the loggers and their levels, after
       <code>JoranConfigurator</code> has configured logback with the
       <em>sample3.xml</em> configuration file.
       </p>
    
       <table class="bodyTable">
         <tr>
           <th>Logger name</th>
           <th>Assigned Level</th>
           <th>Effective Level</th>
         </tr>
         <tr>
           <td>root</td>
           <td><code>DEBUG</code></td>
           <td><code>DEBUG</code></td>
         </tr>
         <tr class="alt">
           <td>chapters.configuration</td>
           <td><code>INFO</code></td>
           <td><code>INFO</code></td>
         </tr>
         <tr>
           <td>chapters.configuration.MyApp3</td>
           <td><code>null</code></td>
           <td><code>INFO</code></td>
         </tr>
         <tr class="alt">
           <td>chapters.configuration.Foo</td>
           <td><code>DEBUG</code></td>
           <td><code>DEBUG</code></td>
         </tr>
       </table>
    
      <p>It follows that the two logging statements of level
      <code>INFO</code> in the <code>MyApp3</code> class as well as the
      DEBUG messages in <code>Foo.doIt()</code> are all enabled. Note that
      the level of the root logger is always set to a non-null value,
      DEBUG by default.
      </p>
    
      <p>Let us note that the <a
      href="architecture.html#basic_selection">basic-selection rule</a>
      depends on the effective level of the logger being invoked, not the
      level of the logger where appenders are attached. Logback will first
      determine whether a logging statement is enabled or not, and if
      enabled, it will invoke the appenders found in the logger hierarchy,
      regardless of their level. The configuration file
      <em>sample4.xml</em> is a case in point:
      </p>
    
      <p class="example">Example: Logger level sample
      (logback-examples/src/main/java/chapters/configuration/sample4.xml)</p>
      <span class="asGroovy" onclick="return asGroovy('sample4');">View as .groovy</span>
      <pre id="sample4" class="prettyprint source">&lt;configuration>
    
      &lt;appender name="STDOUT"
       class="ch.qos.logback.core.ConsoleAppender">
       &lt;encoder>
         &lt;pattern>
            %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
          &lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      <b>&lt;logger name="chapters.configuration" level="INFO" /></b>
    
      &lt;!-- turn OFF all logging (children can override) -->
      &lt;root <b>level="OFF"</b>>
        &lt;appender-ref ref="STDOUT" />
      &lt;/root>
    
    &lt;/configuration></pre>
    
      <p>The following table lists the loggers and their levels after
      applying the <em>sample4.xml</em> configuration file.
      </p>
    
      <table class="bodyTable">
        <tr>
          <th>Logger name</th>
          <th>Assigned Level</th>
          <th>Effective Level</th>
        </tr>
        <tr>
          <td>root</td>
          <td><code>OFF</code></td>
          <td><code>OFF</code></td>
        </tr>
        <tr class="alt">
          <td>chapters.configuration</td>
          <td><code>INFO</code></td>
          <td><code>INFO</code></td>
        </tr>
        <tr>
          <td>chapters.configuration.MyApp3</td>
          <td><code>null</code></td>
          <td><code>INFO</code></td>
        </tr>
        <tr class="alt">
          <td>chapters.configuration.Foo</td>
          <td><code>null</code></td>
          <td><code>INFO</code></td>
        </tr>
      </table>
    
      <p>The ConsoleAppender named <em>STDOUT</em>, the only configured
      appender in <em>sample4.xml</em>, is attached to the root logger
      whose level is set to <code>OFF</code>. However, running
      <em>MyApp3</em> with configuration script <em>sample4.xml</em> will
      yield:
      </p>
    
      <div class="source"><pre>17:52:23.609 [main] INFO chapters.configuration.MyApp3 - Entering application.
    17:52:23.609 [main] INFO chapters.configuration.MyApp3 - Exiting application.</pre></div>
    
      <p>Thus, the level of the root logger has no apparent effect because
      the loggers in <code>chapters.configuration.MyApp3</code> and
      <code>chapters.configuration.Foo</code> classes are all enabled for the
      <code>INFO</code> level.  As a side note, the <em>chapters.configuration</em>
      logger exists by virtue of its declaration in the configuration file
      - even if the Java source code does not directly refer to it.
      </p>
    
      <h4><a name="configuringAppenders"
      href="#configuringAppenders"><span class="anchor"/></a>Configuring
      Appenders</h4>
    
      <p>An appender is configured with the <code>&lt;appender></code>
      element, which takes two mandatory attributes <span
      class="attr">name</span> and <span class="attr">class</span>.  The
      <span class="attr">name</span> attribute specifies the name of the
      appender whereas the <span class="attr">class</span> attribute
      specifies the fully qualified name of the appender class to
      instantiate. The <code>&lt;appender></code> element may contain zero
      or one <code>&lt;layout></code> elements, zero or more
      <code>&lt;encoder></code> elements and zero or more
      <code>&lt;filter></code> elements. Apart from these three common
      elements, <code>&lt;appender></code> elements may contain any number
      of elements corresponding to JavaBean properties of the appender
      class. Seamlessly supporting any property of a given logback
      component is one of the major strengths of <a
      href="onJoran.html">Joran</a> as discussed in a later chapter. The
      following diagram illustrates the common structure. Note that
      support for properties is not visible.
      </p>
    
      <p align="left">
        <img src="images/chapters/configuration/appenderSyntax.png" 
             alt="Appender Syntax" title="Appender element syntax"/>
      </p>
    
      <p>The <code>&lt;layout></code> element takes a mandatory class
      attribute specifying the fully qualified name of the layout class to
      instantiate.  As with the <code>&lt;appender></code> element,
      <code>&lt;layout></code> may contain other elements corresponding to
      properties of the layout instance. Since it's such a common case, if
      the layout class is <code>PatternLayout</code>, then the class
      attribute can be omitted as specified by <a
      href="onJoran.html#defaultClassMapping">default class mapping</a>
      rules.
      </p>
    
      <p>The <code>&lt;encoder></code> element takes a mandatory class
      attribute specifying the fully qualified name of the encoder class
      to instantiate. Since it's such a common case, if the encoder class
      is <code>PatternLayoutEncoder</code>, then the class attribute can
      be omitted as specified by <a
      href="onJoran.html#defaultClassMapping">default class mapping</a>
      rules.
      </p>
    
      <p>Logging to multiple appenders is as easy as defining the various
      appenders and referencing them in a logger, as the next
      configuration file illustrates:
      </p>
    
      <p class="example">Example: Multiple loggers
      (logback-examples/src/main/java/chapters/configuration/multiple.xml)</p>
    
      <span class="asGroovy" onclick="return asGroovy('multiple');">View as .groovy</span>
      <pre id="multiple" class="prettyprint source">&lt;configuration>
    
      &lt;appender name="<b>FILE</b>" class="ch.qos.logback.core.FileAppender">
        &lt;file>myApp.log&lt;/file>
    
        &lt;encoder>
          &lt;pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;appender name="<b>STDOUT</b>" class="ch.qos.logback.core.ConsoleAppender">
        &lt;encoder>
          &lt;pattern>%msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;root level="debug">
        <b>&lt;appender-ref ref="FILE" /></b>
        <b>&lt;appender-ref ref="STDOUT" /></b>
      &lt;/root>
    &lt;/configuration></pre>
    
      <p>These configuration scripts define two appenders called
      <em>FILE</em> and <em>STDOUT</em>.  The <em>FILE</em> appender logs
      to a file called <em>myApp.log</em>. The encoder for this appender
      is a <code>PatternLayoutEncoder</code> that outputs the date, level,
      thread name, logger name, file name and line number where the log
      request is located, the message and line separator character(s).
      The second appender called <code>STDOUT</code> outputs to the
      console.  The encoder for this appender outputs only the message
      string followed by a line separator.
      </p>
    
      <p>The appenders are attached to the root logger by referencing them
      by name within an <em>appender-ref</em> element. Note that each
      appender has its own encoder. Encoders are usually not designed to
      be shared by multiple appenders. The same is true for layouts. As
      such, logback configuration files do not provide any syntactical
      means for sharing encoders or layouts.
      </p>
    
      <h4><a name="cumulative" href="#cumulative"><span
      class="anchor"/></a>Appenders accumulate
      </h4>
    
      <p>By default, <b>appenders are cumulative</b>: a logger will log to
      the appenders attached to itself (if any) as well as all the
      appenders attached to its ancestors.  Thus, attaching the same
      appender to multiple loggers will cause logging output to be
      duplicated.
      </p>
    
      <p class="example">Example: Duplicate appender
      (logback-examples/src/main/java/chapters/configuration/duplicate.xml)</p>
    
      <span class="asGroovy" onclick="return asGroovy('duplicate');">View as .groovy</span>
      <pre id="duplicate" class="prettyprint source">&lt;configuration>
    
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        &lt;encoder>
          &lt;pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;logger name="chapters.configuration">
        &lt;appender-ref ref="STDOUT" />
      &lt;/logger>
    
      &lt;root level="debug">
        &lt;appender-ref ref="STDOUT" />
      &lt;/root>
    &lt;/configuration></pre>
    
      <p>Running <code>MyApp3</code> with <em>duplicate.xml</em> will
      yield the following output:
      </p>
    
    <p class="source">14:25:36.343 [main] INFO  chapters.configuration.MyApp3 - Entering application.
    14:25:36.343 [main] INFO  chapters.configuration.MyApp3 - Entering application.
    14:25:36.359 [main] DEBUG chapters.configuration.Foo - Did it again!
    14:25:36.359 [main] DEBUG chapters.configuration.Foo - Did it again!
    14:25:36.359 [main] INFO  chapters.configuration.MyApp3 - Exiting application.
    14:25:36.359 [main] INFO  chapters.configuration.MyApp3 - Exiting application.</p>
    
      <p>Notice the duplicated output. The appender named <em>STDOUT</em>
      is attached to two loggers, to root and to
      <em>chapters.configuration</em>. Since the root logger is the
      ancestor of all loggers and <em>chapters.configuration</em> is the
      parent of both <em>chapters.configuration.MyApp3</em> and
      <em>chapters.configuration.Foo</em>, each logging request made with
      these two loggers will be output twice, once because <em>STDOUT</em>
      is attached to <em>chapters.configuration</em> and once because it
      is attached to <em>root</em>.
      </p>
    
      <p>Appender additivity is not intended as a trap for new users.  It
      is quite a convenient logback feature. For instance, you can
      configure logging such that log messages appear on the console (for
      all loggers in the system) while messages only from some specific
      set of loggers flow into a specific appender.
      </p>
    
      <p class="example">Example: Multiple appender
      (logback-examples/src/main/java/chapters/configuration/restricted.xml)</p>
      <span class="asGroovy" onclick="return asGroovy('restricted');">View as .groovy</span>
      <pre id="restricted" class="prettyprint source">&lt;configuration>
    
      &lt;appender name="FILE" class="ch.qos.logback.core.FileAppender">
        &lt;file>myApp.log&lt;/file>
        &lt;encoder>
          &lt;pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        &lt;encoder>
          &lt;pattern>%msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;logger name="chapters.configuration">
        &lt;appender-ref ref="FILE" />
      &lt;/logger>
    
      &lt;root level="debug">
        &lt;appender-ref ref="STDOUT" />
      &lt;/root>
    &lt;/configuration></pre>
    
      <p>In this example, the console appender will log all the messages
      (for all loggers in the system) whereas only logging requests
      originating from the <em>chapters.configuration</em> logger and its
      children will go into the <em>myApp.log</em> file.
      </p>
    	
      <h4><a name="overrridingCumulativity"
      href="#overrridingCumulativity"><span class="anchor"/></a>Overriding
      the default cumulative behaviour</h4>
    
      <p>In case the default cumulative behavior turns out to be
      unsuitable for your needs, you can override it by setting the
      additivity flag to false.  Thus, a branch in your logger tree may
      direct output to a set of appenders different from those of the rest
      of the tree.
      </p>
    
      <p class="example">Example: Additivity flag
      (logback-examples/src/main/java/chapters/configuration/additivityFlag.xml)</p>
    
      <span class="asGroovy" onclick="return asGroovy('additivityFlag');">View as .groovy</span>
      <pre id="additivityFlag" class="prettyprint source">&lt;configuration>
    
      &lt;appender name="FILE" class="ch.qos.logback.core.FileAppender">
        &lt;file>foo.log&lt;/file>
        &lt;encoder>
          &lt;pattern>%date %level [%thread] %logger{10} [%file : %line] %msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        &lt;encoder>
          &lt;pattern>%msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;logger name="chapters.configuration.Foo" <b>additivity="false"</b>>
        &lt;appender-ref ref="FILE" />
      &lt;/logger>
    
      &lt;root level="debug">
        &lt;appender-ref ref="STDOUT" />
      &lt;/root>
    &lt;/configuration></pre>
    
      <p>This example, the appender named <em>FILE</em> is attached to the
      <em>chapters.configuration.Foo</em> logger. Moreover, the <em>chapters.configuration.Foo</em>
      logger has its additivity flag set to false such that its logging
      output will be sent to the appender named <em>FILE</em> but not to
      any appender attached higher in the hierarchy. Other loggers remain
      oblivious to the additivity setting of the <em>chapters.configuration.Foo</em>
      logger.  Running the <code>MyApp3</code> application with the
      <em>additivityFlag.xml</em> configuration file will output results
      on the console from the <em>chapters.configuration.MyApp3</em> logger.  However,
      output from the <em>chapters.configuration.Foo</em> logger will appear in the
      <em>foo.log</em> file and only in that file.
      </p>
    
    
      <h3><a name="contextName" href="#contextName"><span
      class="anchor"/></a>Setting the context name</h3>
    
      <p>As mentioned <a href="architecture.html#LoggerContext">in an
      earlier chapter</a>, every logger is attached to a logger
      context. By default, the logger context is called
      "default". However, you can set a different name with the help of
      the <code>&lt;contextName></code> configuration directive. Note that
      once set, the logger context name <a
      href="../apidocs/ch/qos/logback/core/ContextBase.html#setName(java.lang.String)">cannot
      be changed</a>. Setting the context name is a simple and
      straightforward method in order to distinguish between multiple
      applications logging to the same target.
      </p>
      
      <p class="example">Example: Set the context name and display it
      (logback-examples/src/main/java/chapters/configuration/contextName.xml)</p>
    
      <span class="asGroovy" onclick="return asGroovy('contextName');">View as .groovy</span>
      <pre id="contextName" class="prettyprint source">&lt;configuration>
      <b>&lt;contextName>myAppName&lt;/contextName></b>
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        &lt;encoder>
          &lt;pattern>%d <b>%contextName</b> [%t] %level %logger{36} - %msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;root level="debug">
        &lt;appender-ref ref="STDOUT" />
      &lt;/root>
    &lt;/configuration></pre>
    
      <p>This last example illustrates naming of the logger
      context. Adding the <a
      href="layouts.html#conversionWord">contextName conversion word</a>
      in layout's pattern will output the said name.</p>
      
      <!-- =============================================================== -->
     
    
      <h3><a name="variableSubstitution"
      href="#variableSubstitution"><span class="anchor"/></a>Variable
      substitution</h3>
    
      <p><span class="label">Note</span> Earlier versions of this document
      used the term "property substitution" instead of the term
      "variable". Please consider both terms interchangeable although the
      latter term conveys a clearer meaning.
      </p>
    
      <p>As in many scripting languages, logback configuration files
      support definition and substitution of variables. Variables can be
      defined within the configuration file itself, in an external file,
      in an external resource or even computed and <a
      href="#definingPropsOnTheFly">defined on the fly</a>. 
      </p>
    
      <p class="highlight">Variable substitution can occur at any point in
      a configuration file where a value can be specified.</p>
    
      <p>Variable substitution can occur at any point in a configuration
      file where a value can be specified. The syntax of variable
      substitution is similar to that of Unix shells. The string between
      an opening <em>${</em> and closing <em>}</em> is interpreted as a
      reference to the <em>value</em> of the property.  For property
      <em>aName</em>, the string "${aName}" will be replaced with the
      value held by the <em>aName</em> property.
      </p>
    
      <p>Variables have a <a href="#scopes">scope</a> (see below).</p>
    
      <p>As they often come in handy, the HOSTNAME and CONTEXT_NAME
      variables are automatically defined and have context scope.</p>
    
     
      <h4><a name="definingProps" href="#definingProps"><span
      class="anchor"/></a>Defining variables</h4>
    
      <p>Variables can be defined one at a time in the configuration file
      itself or loaded wholesale from an external properties file or an
      external resource. For historical reasons, the XML element for
      defining variables is <code>&lt;property&gt;</code> altough in
      logback 1.0.7 and later the element <code>&lt;variable></code> can
      be used interchangeably.</p>
    
      <p>The next example shows a variable declared at the beginning of
      the configuration file. It is then used further down the file to
      specify the location of the output file.
      </p>
    
      <p class="example">Example: Simple Variable substitution
      (logback-examples/src/main/java/chapters/configuration/variableSubstitution1.xml)
      </p>
    
      <span class="asGroovy" onclick="return asGroovy('variableSubstitution1');">View as .groovy</span>
      <pre id="variableSubstitution1" class="prettyprint source">&lt;configuration>
    
      <b>&lt;property name="USER_HOME" value="/home/sebastien" /></b>
    
      &lt;appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <b>&lt;file>${USER_HOME}/myApp.log&lt;/file></b>
        &lt;encoder>
          &lt;pattern>%msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;root level="debug">
        &lt;appender-ref ref="FILE" />
      &lt;/root>
    &lt;/configuration></pre>
    
      <p>The next example shows the use of a System property to achieve
      the same result. The property is not declared in the configuration
      file, thus logback will look for it in the System properties. Java
      system properties can be set on the command line as shown next:
      </p>
      
      <p class="source">java -DUSER_HOME="/home/sebastien" MyApp2</p>
    
      <p class="example">Example: System Variable substitution
      (logback-examples/src/main/java/chapters/configuration/variableSubstitution2.xml)
      </p>
      <span class="asGroovy" onclick="return asGroovy('variableSubstitution2');">View as .groovy</span>
      <pre id="variableSubstitution2" class="prettyprint source">&lt;configuration>
    
      &lt;appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <b>&lt;file>${USER_HOME}/myApp.log&lt;/file></b>
        &lt;encoder>
          &lt;pattern>%msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;root level="debug">
        &lt;appender-ref ref="FILE" />
      &lt;/root>
    &lt;/configuration></pre>
    
      
      <p>When multiple variables are needed, it may be more convenient to
      create a separate file that will contain all the variables. Here is
      how one can do such a setup.
      </p>
    
      <p class="example">Example: Variable substitution using a
      separate file
      (logback-examples/src/main/java/chapters/configuration/variableSubstitution3.xml)
      </p>
      <span class="asGroovy" onclick="return asGroovy('variableSubstitution3');">View as .groovy</span>
      <pre id="variableSubstitution3" class="prettyprint source">&lt;configuration>
    
      <b>&lt;property file="src/main/java/chapters/configuration/variables1.properties" /></b>
    
      &lt;appender name="FILE" class="ch.qos.logback.core.FileAppender">
         <b>&lt;file>${USER_HOME}/myApp.log&lt;/file></b>
         &lt;encoder>
           &lt;pattern>%msg%n&lt;/pattern>
         &lt;/encoder>
       &lt;/appender>
    
       &lt;root level="debug">
         &lt;appender-ref ref="FILE" />
       &lt;/root>
    &lt;/configuration></pre>
    
       <p>This configuration file contains a reference to a file named
       <em>variables1.properties</em>.  The variables contained in that
       file will be read and then defined within local scope. Here is what
       the <em>variable.properties</em> file might look like.
       </p>
    
       <em>Example: Variable file
       (logback-examples/src/main/java/chapters/configuration/variables1.properties)</em>
    
       <pre class="source">USER_HOME=/home/sebastien</pre>
    
       <p>You may also reference a resource on the class path instead of a
       file.</p>
    
      <pre class="prettyprint source">&lt;configuration>
    
      <b>&lt;property resource="resource1.properties" /></b>
    
      &lt;appender name="FILE" class="ch.qos.logback.core.FileAppender">
         <b>&lt;file>${USER_HOME}/myApp.log&lt;/file></b>
         &lt;encoder>
           &lt;pattern>%msg%n&lt;/pattern>
         &lt;/encoder>
       &lt;/appender>
    
       &lt;root level="debug">
         &lt;appender-ref ref="FILE" />
       &lt;/root>
    &lt;/configuration></pre>
    
    
       <h4><a name="scopes" href="#scopes"><span
       class="anchor"/></a>Scopes</h4>
    
       <p>A property can be defined for insertion in <em>local scope</em>,
       in <em>context scope</em>, or in <em>system scope</em>. Local scope
       is the default. Although it is possible to read variables from the
       OS environment, it is not possible to write into the OS
       environment.</p>
    
    
       <p><span class="label">local scope</span> A property with local
       scope exists from the point of its definition in a configuration
       file until the end of interpretation/execution of said
       configuration file. As a corollary, each time a configuration file
       is parsed and executed, variables in local scope are defined
       anew.</p>
    
       <p><span class="label">context scope</span> A property with context
       scope is inserted into the context and lasts as long as the context
       or until it is cleared.  Once defined, a property in context scope
       is part of the context. As such, it is available in all logging
       events, including those sent to remote hosts via serialization. 
       </p>
    
       <p><span class="label">system scope</span> A property with system
       scope is inserted into the JVM's system properties and lasts as
       long as the JVM or until it is cleared.
       </p>
     
       <p class="highlight">Properties are looked up in the the local
       scope first, in the context scope second, in the system properties
       scope third, and in the OS environment last.
       </p>
    
       <p>During substitution, properties are looked up in the local scope
       first, in the context scope second, in the system properties scope
       third, and in the <a
       href="http://docs.oracle.com/javase/tutorial/essential/environment/env.html">OS
       environment</a> fourth and last.
       </p>
    
       <p>The <span class="attr">scope</span> attribute of the
       <code>&lt;property></code> element, <code>&lt;define></code>
       element or the <code>&lt;insertFromJNDI></code> element can be used
       to set the scope of a property. The <span class="attr">scope</span>
       attribute admits "local", "context" and "system" strings as
       possible values. If not specified, the scope is always assumed to
       be "local".
       </p>
    
       <p class="example">Example: A variable defined in "context" scope
       (logback-examples/src/main/java/chapters/configuration/contextScopedVariable.xml)
       </p>
    
      <span class="asGroovy" onclick="return
      asGroovy('contextScopedVariable');">View as .groovy</span>
      <pre id="contextScopedVariable" class="prettyprint source">&lt;configuration>
    
      &lt;property <b class="big">scope="context"</b> name="nodeId" value="firstNode" />
    
      &lt;appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <b>&lt;file>/opt/${nodeId}/myApp.log&lt;/file></b>
        &lt;encoder>
          &lt;pattern>%msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;root level="debug">
        &lt;appender-ref ref="FILE" />
      &lt;/root>
    &lt;/configuration></pre>
    
       <p>In the above example, given that the <em>nodeId</em> property is
       defined in the context scope, it will be available in every logging
       event, even those sent to remote hosts via serialization.</p>
    
    
      <h3><a name="defaultValuesForVariables"
      href="#defaultValuesForVariables"><span class="anchor"/></a>Default
      values for variables</h3>
    
      <p>Under certain circumstances, it may be desirable for a variable
      to have a default value if it is not declared or its value is
      null. As in the <a
      href="http://tldp.org/LDP/abs/html/parameter-substitution.html">Bash
      shell</a>, default values can be specified using the <b>":-"</b>
      operator. For example, assuming the variable named <em>aName</em> is
      not defined, <code>"${aName<b>:-golden</b>}"</code> will be
      interpreted as "golden".</p>
    
       <h3><a name="nestedSubst" href="#nestedSubst"><span
       class="anchor"/></a>Nested variables</h3>
    
       <p>Variable nesting is fully supported. Both the name,
       default-value and value definition of a variable can reference
       other variables.</p>
    
    
       <h4>value nesting</h4>
       <p>The value definition of a variable can contain references to
       other variables. Suppose you wish to use variables to specify not
       only the destination directory but also the file name, and combine
       those two variables in a third variable called "destination". The
       properties file shown below gives an example.
       </p>
    
       <p class="example">Example: Nested variable references
       (logback-examples/src/main/java/chapters/configuration/variables2.properties)</p>
    
       <pre class="source">USER_HOME=/home/sebastien
    fileName=myApp.log
    <b>destination=${USER_HOME}/${fileName}</b></pre>
    
        <p>Note that in the properties file above, "destination" is
        composed from two other variables, namely "USER_HOME" and
        "fileName".
        </p>
        
        <em>Example: Variable substitution using
        a separate file
        (logback-examples/src/main/java/chapters/configuration/variableSubstitution4.xml)</em>
    
        <pre class="prettyprint source">&lt;configuration>
    
      &lt;property file="variables2.properties" />
    
      &lt;appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <b>&lt;file>${destination}&lt;/file></b>
        &lt;encoder>
          &lt;pattern>%msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;root level="debug">
        &lt;appender-ref ref="FILE" />
      &lt;/root>
    &lt;/configuration></pre>
    
    
       <h4>name nesting</h4>
    
       <p>When referencing a variable, the variable name may contain a
       reference to another variable. For example, if the variable named
       "userid" is assigned the value "alice", then
       "${${userid}.password}" references the variable with the name
       "alice.password".</p>
    
       <h4>default value nesting</h4>
    
       <p>The default value of a variable can reference a another
       variable.  For example, assuming the variable 'id' is unassigned
       and the variable 'userid' is assigned the value "alice", then the
       expression "${id<b>:-</b>${userid}}" will return "alice".
       </p>
    
    
      <!-- ==============================================================
           -->
      <h3><a name="hostname" href="#hostname"><span
      class="anchor"/></a>HOSTNAME property</h3>
    
      <p>As it often comes in handy, the <code>HOSTNAME</code> property is
      defined automatically during configuration with context scope.</p>
    
      <!-- ============================================================== -->
      <h3><a name="context_name" href="#context_name"><span
      class="anchor"/></a>CONTEXT_NAME property</h3>
    
      <p>As its name indicates, the <code>CONTEXT_NAME</code> property
      corresponds to the name of the current logging context.</p>
    
      <!-- ============================================================== -->
      
      <h3><a name="timestamp" href="#timestamp"><span
      class="anchor"/></a>Setting a timestamp</h3>
    
      <p>The <em>timestamp</em> element can define a property according to
      current date and time. The <em>timestamp</em> element is <a
      href="appenders.html#uniquelyNamed">explained in a subsequent
      chapter</a>.</p>
    
      <!-- ============================================================== -->
      <h3><a name="definingPropsOnTheFly"
      href="#definingPropsOnTheFly"><span class="anchor"/></a>Defining
      properties on the fly</h3>
    
      <p>You may define properties dynamically using the
      <code>&lt;define></code> element. The define element takes two
      mandatory attributes: <span class="attr">name</span> and <span
      class="attr">class</span>. The <span class="attr">name</span>
      attribute designates the name of the property to set whereas the
      <span class="attr">class</span> attribute designates any class
      implementing the <a
      href="../xref/ch/qos/logback/core/spi/PropertyDefiner.html">PropertyDefiner</a>
      interface. The value returned by the <code>getPropertyValue</code>()
      method of the <code>PropertyDefiner</code> instance will be the
      value of the named property. You may also specify a <a
      href="#scopes">scope</a> for the named property by specifying a
      <span class="attr">scope</span> attribute.
      </p>
    
      <p>Here is an example.</p>
    
      <pre class="prettyprint source">&lt;configuration>
    
      &lt;define name="rootLevel" class="a.class.implementing.PropertyDefiner">
        &lt;shape>round&lt;/shape>
        &lt;color>brown&lt;/color>
        &lt;size>24&lt;/size>
      &lt;/define>
     
      &lt;root level="${rootLevel}"/>
    &lt;/configuration></pre>
    
      <p>In the above example, shape, color and size are properties of
      "a.class.implementing.PropertyDefiner". As long as there is a setter
      for a given property in your implementation of the
      <code>PropertyDefiner</code> instance, logback will inject the
      appropriate values as specified in the configuration file. </p>
    
     
    
      <p>At the present time, logback does ships with two fairly simple
      implementations of <code>PropertyDefiner</code>.  
      </p>
    
      <table class="bodyTable striped">
        <tr>
          <th>Implementation name</th>
          <th>Description</th>
        </tr>
    
        <tr>
          <td><a
          href="../apidocs/ch/qos/logback/core/property/FileExistsPropertyDefiner.html"><code>FileExistsPropertyDefiner</code></a>
          </td>
          <td>Set the named variable to "true" if the file specified by
          <span class="prop">path</span> property exists, to "false"
          otherwise.
          </td>
        </tr>
        <tr>
          <td><a
          href="../apidocs/ch/qos/logback/core/property/FileExistsPropertyDefiner.html"><code>ResourceExistsPropertyDefiner</code></a>
          </td>
          <td>Set the named variable to "true" if the <span
          class="prop">resource</span> specified by the user is available
          on the class path, to "false" otherwise.
          </td>
        </tr>
      </table>
    
      <!-- ============================================================== -->
    
      <h3><a name="conditional" href="#conditional"><span
      class="anchor"/></a>Conditional processing of configuration
      files</h3>
      
      <p>Developers often need to juggle between several logback
      configuration files targeting different environments such as
      development, testing and production. These configuration files have
      substantial parts in common differing only in a few places. To avoid
      duplication, logback supports conditional processing of
      configuration files with the help of <code>&lt;if></code>,
      <code>&lt;then></code> and <code>&lt;else></code> elements so that a
      single configuration file can adequately target several
      environments. Note that conditional processing requires the <a
      href="../setup.html#janino">Janino library</a>.
      </p>
    
      <p>The general format for conditional statements is shown below.</p>
    
      <pre class="prettyprint source">
       &lt;!-- if-then form -->
       &lt;if condition="some conditional expression">
        &lt;then>
          ...
        &lt;/then>
      &lt;/if>
      
      &lt;!-- if-then-else form -->
      &lt;if condition="some conditional expression">
        &lt;then>
          ...
        &lt;/then>
        &lt;else>
          ...
        &lt;/else>    
      &lt;/if></pre>  
    
      <p>The condition is a Java expression in which only context
      properties or system properties are accessible. For a key passed as
      argument, the <code>property</code>() or its shorter equivalent
      <code>p</code>() methods return the String value of the property.
      For example, to access the value of a property with key "k", you
      would write <code>property("k")</code> or equivalently
      <code>p("k")</code>. If the property with key "k" is undefined, the
      property method will return the empty string and not null. This
      avoids the need to check for null values.</p>
    
      <p>The <code>isDefined()</code> method can be used to check whether
      a property is defined. For example, to check whether the property
      "k" is defined you would write <code>isDefined("k")</code>
      Similarly, if you need to check whether a property is null, the
      <code>isNull()</code> method is provided. Example:
      <code>isNull("k")</code>.</p>
    
      <pre class="prettyprint source">&lt;configuration debug="true">
    
      <b>&lt;if condition='property("HOSTNAME").contains("torino")'></b>
        <b>&lt;then></b>
          &lt;appender name="CON" class="ch.qos.logback.core.ConsoleAppender">
            &lt;encoder>
              &lt;pattern>%d %-5level %logger{35} - %msg %n&lt;/pattern>
            &lt;/encoder>
          &lt;/appender>
          &lt;root>
            &lt;appender-ref ref="CON" />
          &lt;/root>
        <b>&lt;/then></b>
      <b>&lt;/if></b>
    
      &lt;appender name="FILE" class="ch.qos.logback.core.FileAppender">
        &lt;file>${randomOutputDir}/conditional.log&lt;/file>
        &lt;encoder>
          &lt;pattern>%d %-5level %logger{35} - %msg %n&lt;/pattern>
       &lt;/encoder>
      &lt;/appender>
    
      &lt;root level="ERROR">
         &lt;appender-ref ref="FILE" />
      &lt;/root>
    &lt;/configuration></pre>
    
      
      <p>Conditional processing is supported <em>anywhere</em> within the
      <code>&lt;configuration></code> element. Nested if-then-else
      statements are also supported. However, XML syntax is awfully
      cumbersome and is ill suited as the foundation of a general purpose
      programming language.  Consequently, too many conditionals will
      quickly render your configuration files incomprehensible to subsequent
      readers, including yourself.
      </p>
    
    
      <!-- ============================================================== -->
    
       <h3><a name="insertFromJNDI" href="#insertFromJNDI"><span
       class="anchor"/></a>Obtaining variables from JNDI</h3>
    
       <p>Under certain circumstances, you may want to make use of
       env-entries stored in JNDI. The <code>&lt;insertFromJNDI></code>
       configuration directive extracts an env-entry stored in JNDI and
       inserts the property in local scope with key specified by the <span
       class="attr">as</span> attribute. As all properties, it is possible
       to insert the new property into a <a href="#scopes">different
       scope</a> with the help of the <em>scope</em> attribute.
       </p>
    
       <p class="example">Example: Insert as properties env-entries
       obtained via JNDI
       (logback-examples/src/main/java/chapters/configuration/insertFromJNDI.xml)</p>
    
       <pre class="prettyprint source">&lt;configuration>
      <b>&lt;insertFromJNDI env-entry-name="java:comp/env/appName" as="<span class="green">appName"</span> /></b>
      <b>&lt;contextName><span class="green">${appName}</span>&lt;/contextName></b>
    
      &lt;appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        &lt;encoder>
          &lt;pattern>%d ${CONTEXT_NAME} %level %msg %logger{50}%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="CONSOLE" />
      &lt;/root>
    &lt;/configuration></pre>
    
      <p>In this last example, the "java:comp/env/appName" env-entry is
      inserted as the <span class="variable">appName</span> property. Note
      that the <code>&lt;contextName></code> directive sets the context
      name based on the value of the <span class="variable">appName</span>
      property inserted by the previous <code>&lt;insertFromJNDI></code>
      directive.
      </p>
    
      <h3><a name="fileInclusion" href="#fileInclusion"><span
      class="anchor"/></a>File inclusion</h3>
    
      <p>Joran supports including parts of a configuration file from
      another file. This is done by declaring a <code>&lt;include></code>
      element, as shown below:
      </p>
    
      <p class="example">Example: File include
      (logback-examples/src/main/java/chapters/configuration/containingConfig.xml)</p>
    
      <pre class="prettyprint source">&lt;configuration>
      <b>&lt;include file="src/main/java/chapters/configuration/includedConfig.xml"/></b>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="includedConsole" />
      &lt;/root>
    
    &lt;/configuration></pre>
    
      <p>The target file MUST have its elements nested inside an
      <code>&lt;included></code> element. For example, a
      <code>ConsoleAppender</code> could be declared as:
      </p>
    
      <p class="example">Example: File include
      (logback-examples/src/main/java/chapters/configuration/includedConfig.xml)</p>
    
      <pre class="source"><b class="green big">&lt;included></b>
      &lt;appender name="includedConsole" class="ch.qos.logback.core.ConsoleAppender">
        &lt;encoder>
          &lt;pattern>"%d - %m%n"&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    <b class="green big">&lt;/included></b></pre>
    
    
      <p>Again, please note the mandatory
      <code class="big green">&lt;included></code> element.</p>
    
      <p>The contents to include can be referenced as a file, as a
      resource, or as a URL.</p>
    
      <ul>
    
        <li><b>As a file:</b><br/> To include a file use the <span
        class="attr">file</span> attribute. You can use relative paths but
        note that the current directory is defined by the application and
        is not necessarily related to the path of the configuration
        file.</li>
    
        <li><p><b>As a resource:</b><br/> To include a resource, i.e a
        file found on the class path, use the <span
        class="attr">resource</span> attribute.</p>
    
        <pre class="prettyprint source">&lt;include resource="includedConfig.xml"/></pre>
        
        </li>
    
        <li><p><b>As a URL:</b><br/> To include the contents of a URL use
        the <span class="attr">url</span> attribute.</p>
    
        <pre class="prettyprint source">&lt;include url="http://some.host.com/includedConfig.xml"/></pre>
    
        </li>
      </ul>
    
      <p>If it cannot find the file to be included, logback will complain
      by printing a status message.  In case the included file is
      optional, you can suppres the error message by setting <span
      class="attr">optional</span> attribute to <code>true</code> in the
      <code>&lt;include></code> element.</p>
    
    
      <pre class="prettyprint source">&lt;include optional="true" ..../></pre>
    
      <!-- ==================== ContextListener =================== -->
      <h2><a name="contextListener" href="#contextListener"><span
      class="anchor"/></a>Adding a context listener</h2>
    
      <p>Instances of the <a
      href="../xref/ch/qos/logback/classic/spi/LoggerContextListener.html">LoggerContextListener</a>
      interface listen to events pertaining to the lifecycle of a logger
      context. 
      </p>
    
    
      <p><code>JMXConfigurator</code> is one implementation of the
      <code>LoggerContextListener</code> interface. It is described in a <a
      href="jmxConfig.html">subsequent chapter</a>.
      </p>
    
      <h3><a name="LevelChangePropagator"
      href="#LevelChangePropagator"><span
      class="anchor"/></a>LevelChangePropagator</h3>
    
      <p>As of version 0.9.25, logback-classic ships with <a
      href="../xref/ch/qos/logback/classic/jul/LevelChangePropagator.html">LevelChangePropagator</a>,
      an implementation of <code>LoggerContextListener</code> which
      propagates changes made to the level of any logback-classic logger
      onto the java.util.logging framework. Such propagation eliminates
      the performance impact of disabled log statements. Instances of <a
      href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/logging/LogRecord.html?is-external=true">LogRecord</a>
      will be sent to logback (via SLF4J) only for enabled log
      statements. This makes it reasonable for real-world applications to
      use the <a
      href="http://www.slf4j.org/legacy.html#jul-to-slf4j">jul-to-slf4j</a>
      bridge.
      </p>
    
    
      <p>The contextListener element can be used to install <code>LevelChangePropagator</code> as shown next.</p>
      
      <pre class="prettyprint source">&lt;configuration debug="true">
      <b>&lt;contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"/></b>
      .... 
    &lt;/configuration></pre>
    
      <p>Setting the <span class="option">resetJUL</span> property of
      LevelChangePropagator will reset all previous level configurations
      of all j.u.l. loggers. However, previously installed handlers will be
      left untouched.</p>
    
      <pre class="prettyprint source">&lt;configuration debug="true">
      &lt;contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
        <b>&lt;resetJUL>true&lt;/resetJUL></b>
      &lt;/contextListener>
      ....
    &lt;/configuration></pre>
      <p>
      </p>
      
    
    
      <script src="../templates/footer.js" type="text/javascript"></script>
    </div>
    </body>
    </html>
    ������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/manual/filters.html��������������������������������������0000644�0001750�0001750�00000141700�11777123722�024201� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Chapter 7: Filters</title>
        <link rel="stylesheet" type="text/css" href="../css/common.css" />
        <link rel="stylesheet" type="text/css" href="../css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="../css/_print.css" media="print" />
        <link rel="stylesheet" type="text/css" href="../css/prettify.css" media="screen" /> 
    
      </head>
      <body onload="prettyPrint(); decorate();">
        <script type="text/javascript">prefix='../';</script>
        <script type="text/javascript" src="../js/prettify.js"></script>
        <script type="text/javascript" src="../templates/header.js"></script>
        <script type="text/javascript" src="../js/dsl.js"></script>
        <script type="text/javascript" src="../js/jquery-min.js"></script>
        <script type="text/javascript" src="../js/decorator.js"></script>
    
        <div id="left">
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="../templates/left.js" type="text/javascript"></script>
        </div>
        <div id="right">
          <script src="menu.js" type="text/javascript"></script>
        </div>
        <div id="content">
    	
        <h1>Chapter 7: Filters</h1>
    
        <div class="quote">
          <p><em>Have lots of ideas and throw away the bad ones. You aren't
          going to have good ideas unless you have lots of ideas and some
          sort of principle of selection.</em></p>
          
          <p>&mdash;LINUS PAULING</p>
        </div>
    
        <script src="../templates/creative.js" type="text/javascript"></script>
    
    		
    		<p>In the preceding chapters, the <a
    		href="architecture.html#basic_selection">basic selection rule</a>,
    		which lies at the heart of logback-classic, has been presented. In
    		this chapter, additional filtering methods will be introduced.
        </p>
    	
    
        <p>Logback filters are based on ternary logic allowing them to be
        assembled or chained together to compose an arbitrarily complex
        filtering policy.  They are largely inspired by Linux's iptables.
    		</p>
    
        <script src="../templates/setup.js" type="text/javascript"></script>
    
    		<h2>In logback-classic</h2>
    
    
    		<p>Logback-classic offers two types of filters, regular filters
    		and turbo filters.
    		</p>
    		
        <h3 class="doAnchor" name="filter">Regular filters</h3>
    
    		<p>Regular logback-classic filters extend the <a
    		href="../xref/ch/qos/logback/core/filter/Filter.html"><code>Filter</code></a>
    		abstract class which essentially consists of a single
    		<code>decide()</code> method taking an <code>ILoggingEvent</code>
    		instance as its parameter.
    		</p>
    		
    
    		<p>Filters are organized as an ordered list and are based on
    		ternary logic. The <code>decide(ILoggingEvent event)</code> method
    		of each filter is called in sequence.  This method returns one of
    		the <a
    		href="../xref/ch/qos/logback/core/spi/FilterReply.html"><code>FilterReply</code></a>
    		enumeration values, i.e. one of <code>DENY</code>,
    		<code>NEUTRAL</code> or <code>ACCEPT</code>.  If the value
    		returned by <code>decide</code>() is <code>DENY</code>, then the
    		log event is dropped immediately without consulting the remaining
    		filters. If the value returned is <code>NEUTRAL</code>, then the
    		next filter in the list is consulted. If there are no further
    		filters to consult, then the logging event is processed normally.
    		If the returned value is <code>ACCEPT</code>, then the logging
    		event is processed immediately skipping the invocation of the
    		remaining filters.
        </p>
        
        <p>In logback-classic, filters can be added to
        <code>Appender</code> instances. By adding one or more filters to
        an appender, you can filter events by arbitrary criteria, such as
        the contents of the log message, the contents of the MDC, the time
        of day or any other part of the logging event.
        </p>
        
    		<h3 class="doAnchor" name="yourOwnFilter">Implementing your own
    		Filter</h3>
    		
    		<p>Creating your own filter is easy. All you have to do is extend
    		the <code>Filter</code> abstract class and implement the
    		<code>decide()</code> method.
    		</p>
    		
    		<p>The SampleFilter class shown below provides an example. Its
    		<code>decide</code> method returns ACCEPT for logging events
    		containing the string "sample" in its message field. For other
    		events, the value NEUTRAL is returned.
    		</p>
    		
        <em>Example: Basic custom filter (<a
        href="../xref/chapters/filters/SampleFilter.html">logback-examples/src/main/java/chapters/filters/SampleFilter.java</a>)</em>
        <pre class="prettyprint source">package chapters.filters;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.filter.Filter;
    import ch.qos.logback.core.spi.FilterReply;
    
    public class SampleFilter extends Filter&gt;ILoggingEvent> {
    
      @Override
      public FilterReply decide(ILoggingEvent event) {    
        if (event.getMessage().contains("sample")) {
          return FilterReply.ACCEPT;
        } else {
          return FilterReply.NEUTRAL;
        }
      }
    }</pre>
    
    		<p>The configuration files shown next attaches a
    		<code>SampleFilter</code> to a <code>ConsoleAppender</code>.
    		</p>
    
        <em>Example: SampleFilter configuration
        (logback-examples/src/main/java/chapters/filters/SampleFilterConfig.xml)</em>
        <span class="asGroovy" onclick="return asGroovy('SampleFilterConfig');">View as .groovy</span>
        <pre id="SampleFilterConfig" class="prettyprint source">&lt;configuration>
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    
        <b>&lt;filter class="chapters.filters.SampleFilter" /></b>
    
        &lt;encoder>
          &lt;pattern>
            %-4relative [%thread] %-5level %logger - %msg%n
          &lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    	
      &lt;root>
        &lt;appender-ref ref="STDOUT" />
      &lt;/root>
    &lt;/configuration></pre>
    
    		<p>With the help of Joran, logback's configuration framework,
    		specifying properties or sub-components to filters is also
    		easy. After adding the corresponding setter method in the filter
    		class, specify the value of the property in an xml element named
    		after the property, nesting it within a <code>&lt;filter></code>
    		element. 
    		</p>
    		
    		<p>Often, the desired filter logic consists of two
    		orthogonal parts, a match/mismatch test and a response depending
    		on the match/mismatch. For example, for a given test, e.g. message
    		equals "foobar", one filter might respond ACCEPT on match and
    		NEUTRAL on mismatch, and another filter might respond NEUTRAL on
    		match and DENY on mismatch. 
        </p>
    
        <p>Taking notice of this orthogonality, logback ships with the <a
        href="../xref/ch/qos/logback/core/filter/AbstractMatcherFilter.html">
        <code>AbstractMatcherFilter</code></a> class which provides a
        useful skeleton for specifying the appropriate response on match
        and on mismatch, with the help of two properties, named
        <em>OnMatch</em> and <em>OnMismatch</em>. Most of the regular
        filters included in logback are derived from
        <code>AbstractMatcherFilter</code>.
        </p>
    		
    		<h3 class="doAnchor" name="levelFilter">LevelFilter</h3>
    		
    		<p><a href="../xref/ch/qos/logback/classic/filter/LevelFilter.html">
    		<code>LevelFilter</code></a> filters events based on exact level
    		matching. If the event's level is equal to the configured level,
    		the filter accepts or denies the event, depending on the
    		configuration of the <span class="option">onMatch</span> and <span
    		class="option">onMismatch</span> properties. Here is a sample
    		configuration file.
    		</p>
    		
        <em>Example: Sample LevelFilter configuration
        (logback-examples/src/main/java/chapters/filters/levelFilterConfig.xml)</em>
        <span class="asGroovy" onclick="return asGroovy('levelFilterConfig');">View as .groovy</span>
        <pre id="levelFilterConfig" class="prettyprint source">&lt;configuration>
      &lt;appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <b>&lt;filter class="ch.qos.logback.classic.filter.LevelFilter">
          &lt;level>INFO&lt;/level>
          &lt;onMatch>ACCEPT&lt;/onMatch>
          &lt;onMismatch>DENY&lt;/onMismatch>
        &lt;/filter></b>
        &lt;encoder>
          &lt;pattern>
            %-4relative [%thread] %-5level %logger{30} - %msg%n
          &lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
      &lt;root level="DEBUG">
        &lt;appender-ref ref="CONSOLE" />
      &lt;/root>
    &lt;/configuration></pre>
    
        <h3 class="doAnchor" name="thresholdFilter">ThresholdFilter</h3>
    
    		<p>The <a
    		href="../xref/ch/qos/logback/classic/filter/ThresholdFilter.html">
    		<code>ThresholdFilter</code></a> filters events below the
    		specified threshold. For events of level equal or above the
    		threshold, <code>ThresholdFilter</code> will respond NEUTRAL when
    		its <code>decide</code>() method is invoked. However, events with
    		a level below the threshold will be denied. Here is a sample
    		configuration file.
    		</p>
    
        <em>Example: Sample ThresholdFilter configuration
        (logback-examples/src/main/java/chapters/filters/thresholdFilterConfig.xml)</em>
        <span class="asGroovy" onclick="return asGroovy('thresholdFilterConfig');">View as .groovy</span>
        <pre id="thresholdFilterConfig"  class="prettyprint source">&lt;configuration>
      &lt;appender name="CONSOLE"
        class="ch.qos.logback.core.ConsoleAppender">
        &lt;!-- deny all events with a level below INFO, that is TRACE and DEBUG -->
        <b>&lt;filter class="ch.qos.logback.classic.filter.ThresholdFilter">
          &lt;level>INFO&lt;/level>
        &lt;/filter></b>
        &lt;encoder>
          &lt;pattern>
            %-4relative [%thread] %-5level %logger{30} - %msg%n
          &lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
      &lt;root level="DEBUG">
        &lt;appender-ref ref="CONSOLE" />
      &lt;/root>
    &lt;/configuration></pre>
    
    
        <h2 class="doAnchor" name="evalutatorFilter">EvaluatorFilter</h2>
    
        <p><a
        href="../xref/ch/qos/logback/core/filter/EvaluatorFilter.html"><code>EvaluatorFilter</code></a>
        is a generic filter encapsulating an
        <code>EventEvaluator</code>. As the name suggests, an
        <a
        href="../xref/ch/qos/logback/core/boolex/EventEvaluator.html">
        <code>EventEvaluator</code></a> evaluates whether a given criteria
        is met for a given event. On match and on mismatch,
        the hosting <code>EvaluatorFilter</code> will return the value
        specified by the <span class="option">onMatch</span>
        or <span class="option">onMismatch</span> properties respectively.
        </p>
    
    
        <p>Note that <code>EventEvaluator</code> is an abstract class. You
        can implement your own event evaluation logic by sub-classing
        <code>EventEvaluator</code>.
        </p>
        
    
        <!-- ======================== GEventEvaluator ========================= -->
    
        <h3 class="doAnchor" name="GEventEvaluator">GEventEvaluator</h3>
        
        <p><a
        href="../xref/ch/qos/logback/classic/boolex/GEventEvaluator.html">GEventEvaluator</a>
        is a concrete <a
        href="../xref/ch/qos/logback/core/boolex/EventEvaluator.html"><code>EventEvaluator</code></a>
        implementation taking arbitrary Groovy language boolean
        expressions as the evaluation criteria.  We refer such Groovy
        language boolean expressions as "groovy evaluation
        expressions". Groovy evaluation expressions enable hitherto
        unprecedented flexibility in event
        filtering. <code>GEventEvaluator</code> requires the Groovy
        runtime. Please see the <a
        href="../setup.html#groovy">corresponding section</a> of
        the setup document on adding the Groovy runtime to your class
        path.
        </p>
    
        <p>Evaluation expressions are compiled on-the-fly during the
        interpretation of the configuration file. As a user, you do not
        need to worry about the actual plumbing. However, it is your
        responsibility to ensure that the groovy-language expression is
        valid.
        </p>
    
        <p>The evaluation expression acts on the current logging event.
        Logback automatically inserts the current logging event of type <a
        href="../apidocs/ch/qos/logback/classic/spi/ILoggingEvent.html">ILoggingEvent</a>
        as a variable referred to as '<em>event</em>' as well as its
        shorthand referred to as '<em>e</em>'. The variables TRACE, DEBUG,
        INFO, WARN and ERROR are also exported into the scope of the
        expression. Thus, "event.level == DEBUG" and "e.level == DEBUG"
        are equivalent and valid groovy expressions which will return
        <code>true</code> only if the current logging event's level is
        identical to DEBUG. For other comparison operators on levels, the
        level field should be converted to integer with the
        <code>toInt()</code> operator.
        </p>
    
        <p>Here is a more complete example.</p>
    
        <span class="asGroovy" onclick="return asGroovy('GEventEvaluator');">View as .groovy</span>
        <pre id="GEventEvaluator"  class="prettyprint source">&lt;configuration>
        
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <b>&lt;filter class="ch.qos.logback.core.filter.EvaluatorFilter">      
          &lt;evaluator class="ch.qos.logback.classic.boolex.GEventEvaluator"> 
            &lt;expression>
               e.level.toInt() >= WARN.toInt()
                 &amp;amp;&amp;amp;  &lt;!-- Stands for &amp;&amp; in XML -->
               !(e.mdc?.get("req.userAgent") ~= /Googlebot|msnbot|Yahoo/ )
            &lt;/expression>
          &lt;/evaluator>
          &lt;OnMismatch>DENY&lt;/OnMismatch>
          &lt;OnMatch>NEUTRAL&lt;/OnMatch>
        &lt;/filter></b>
        &lt;encoder>
          &lt;pattern>
            %-4relative [%thread] %-5level %logger - %msg%n
          &lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="STDOUT" />
      &lt;/root>
    &lt;/configuration></pre>
    
    
        <p>The above filter will let events of level WARN and higher go
        through onto the console unless the error is generated by Web
        crawlers associated with Google, MSN or Yahoo. It does so by
        checking whether the MDC associated with the event contains a
        value for "req.userAgent" matching the
        <code>/Googlebot|msnbot|Yahoo/</code> regular expression. Note
        that since the MDC map can be null, we are also using Groovy's <a
        href="http://groovy.codehaus.org/Null+Object+Pattern">safe
        dereferencing operator</a>, that is the ?. operator. The equivalent
        logic would have been much longer if expressed in Java.
        </p>
        
        <p>If you are wondering how the identifier for the user agent was
        inserted into the MDC under the 'req.userAgent' key, it behooves
        us to mention that logback ships with a servlet filter named <a
        href="mdc.html#mis"><code>MDCInsertingServletFilter</code></a>
        designed for this purpose. It will be described in a later
        chapter.
        </p>
    
        <!-- ==================== JaninoEventEvaluator ======================== -->
        
        <h3 class="doAnchor"
        name="JaninoEventEvaluator">JaninoEventEvaluator</h3>
        
    
        <p>Logback-classic ships with another concrete
        <code>EventEvaluator</code> implementation called <a
        href="../xref/ch/qos/logback/classic/boolex/JaninoEventEvaluator.html">JaninoEventEvaluator</a>
        taking an arbitrary Java language block returning a boolean value
        as the evaluation criteria. We refer to such Java language boolean
        expressions as "<em>evaluation expressions</em>". Evaluation
        expressions enable great flexibility in event
        filtering. <code>JaninoEventEvaluator</code> requires the <a
        href="http://docs.codehaus.org/display/JANINO/Home">Janino
        library</a>. Please see the <a
        href="../setup.html#janino">corresponding section</a> of the setup
        document.  Compared to <code>JaninoEventEvaluator</code>,
        <code>GEventEvaluator</code>, by virtue of the Groovy language, is
        significantly more convenient to use, but
        <code>JaninoEventEvaluator</code> will usually run (much) faster
        for equivalent expressions.
        </p>
    
        <p>Evaluation expressions are compiled on-the-fly during the
        interpretation of the configuration file. As a user, you do not
        need to worry about the actual plumbing. However, it is your
        responsibility to ensure that the Java language expression returns
        a boolean, i.e. that it evaluates to true or false. </p>
    
    
        <p>The evaluation expression is evaluated on the current logging
        event. Logback-classic automatically exports various fields of the
        logging event as variables accessible from the evaluation
        expression. The case-sensitive names of these exported variables
        are listed below.
        </p>
    
    		<table class="bodyTable">
          <tr>
            <th>Name</th>
            <th>Type</th>
            <th>Description</th>
    			</tr>
          <tr>
    				<td>event</td>
    				<td><code>LoggingEvent</code></td>
    
            <td>The raw logging event associated with the logging
            request. All of the following variables are also available
            from the event. For example, <code>event.getMessage()</code>
            returns the same String value as the <em>message</em> variable
            described next.
            </td>
    			</tr>
    
          <tr class="alt">
    				<td>message</td>
            <td><code>String</code></td>
            <td>The raw message of the logging request. For some logger
            <em>l</em>, when you write l.info("Hello {}", name); where
            name is assigned the value "Alice", then "Hello {}" is the
            message.</td> </tr>
    		
          <tr>
    				<td>formattedMessage</td>
            <td><code>String</code></td>
            <td>The formatted message in the logging request. For some
            logger <em>l</em>, when you write l.info("Hello {}", name);
            where name is assigned the value "Alice", then "Hello Alice"
            is the formatted message.</td>
    			</tr>
    		
          <tr class="alt">
    				<td>logger</td>
    				<td><code>String</code></td>
    				<td>The name of the logger.
            </td>
    			</tr>
    
          <tr>
            <td>loggerContext</td>
    				<td><a
    				href="../xref/ch/qos/logback/classic/spi/LoggerContextVO.html"><code>LoggerContextVO</code></a></td>
    				<td>A restricted (value object) view of the logger context to which the logging event belongs to.
            </td>
    			</tr>
    
    
    			<tr class="alt">
    				<td>level</td>
    				<td><code>int</code></td>
    				<td>The int value corresponding to the level. To help create
    				easily expressions involving levels, the default value
    				<em>DEBUG</em>, <em>INFO</em>, <em>WARN</em> and
    				<em>ERROR</em> are also available. Thus, using <em>level &gt;
    				INFO</em> is a correct expression.
    				</td>
    			</tr>
    
    			<tr>
    				<td>timeStamp
    				</td>
    				<td><code>long</code></td>
    				<td>The timestamp corresponding to the logging event's
    				creation.
    				</td>
    			</tr>
    			<tr class="alt">
    				<td>marker</td>
    				<td><code>Marker</code></td>
            <td>The <code>Marker</code> object associated with the logging
            request. Note that marker can be null and it is your
            responsibility to check for this condition in order to avoid
            <code>NullPointerException</code>.
    				</td>
    			</tr>
    			<tr>
    				<td>mdc</td>
    				<td><code>Map</code></td>
    				<td>A map containing all the MDC values at the time of the
    				creation of the logging event. A value can be accessed by
    				using the following expression: <em>mdc.get("myKey")</em>. As
    				of logback-classic version 0.9.30, the 'mdc' variable will
    				never be null.
    
            <p>The <code>java.util.Map</code> type is non-parameterized
            because Janino does not support generics. It follows that the
            type returned by <code>mdc.get()</code> is <code>Object</code>
            and not <code>String</code>. To invoke <code>String</code>
            methods on the returned value, it must be cast as
            <code>String</code>. For example,
            <code>((String)&nbsp;mdc.get("k")).contains("val")</code>.
            </p>
    				</td>
    			</tr>
    
          <tr class="alt">
    				<td>throwable</td>
            <td>java.lang.Throwable</td>
    				<td>If no exception is associated with the event, then the
    				value of the "throwable" variable will be null. Unfortunately,
    				"throwable" does not survive serialization. Thus, on remote
    				systems, its value will always be null. For location
    				independent expressions, use the <code>throwableProxy</code>
    				variable described next.
    				</td>
    			</tr>
    
    			<tr>
    				<td>throwableProxy</td>
    				<td><a
    				href="../xref/ch/qos/logback/classic/spi/IThrowableProxy.html"><code>IThrowableProxy</code></a></td>
    				<td>A proxy for the exception associated with the logging
    				event. If no exception is associated with the event, then the
    				value of the "throwableProxy" variable will be null. In
    				contrast to "throwable", when an exception is associated with
    				an event, the value of "throwableProxy" will be non-null even
    				on remote systems, that is even after serialization.
    				</td>
    			</tr>
    
        
    
    		</table>
    
        <p>Here is a concrete example.</p>
    
        <em>Example: Basic event evaluator usage
        (logback-examples/src/main/java/chapters/filters/basicEventEvaluator.xml)</em>
    
        <span class="asGroovy" onclick="return asGroovy('basicEventEvaluator');">View as .groovy</span>
        <pre id="basicEventEvaluator" class="prettyprint source longline">&lt;configuration>
    
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <b>&lt;filter class="ch.qos.logback.core.filter.EvaluatorFilter">      
          &lt;evaluator> &lt;!-- defaults to type ch.qos.logback.classic.boolex.JaninoEventEvaluator -->
            &lt;expression><span class="green">return message.contains("billing");</span>&lt;/expression>
          &lt;/evaluator>
          &lt;OnMismatch>NEUTRAL&lt;/OnMismatch>
          &lt;OnMatch>DENY&lt;/OnMatch>
        &lt;/filter></b>
        &lt;encoder>
          &lt;pattern>
            %-4relative [%thread] %-5level %logger - %msg%n
          &lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;root level="INFO">
        &lt;appender-ref ref="STDOUT" />
      &lt;/root>
    &lt;/configuration></pre>
    
    		<p>The bold part in the above configuration file adds an
    		<code>EvaluatorFilter</code> to a <code>ConsoleAppender</code>. An
    		evaluator of type <code>JaninoEventEvaluator</code> is then
    		injected into the <code>EvaluatorFilter</code>. In the absence of
    		<span class="attr">class</span> attribute in the
    		<code>&lt;evaluator></code> element specified by the user, Joran
    		will infer a default type of <code>JaninoEventEvaluator</code>
    		for the evaluator. This is one of the <a
    		href="onJoran.html#defaultClassMapping">few occurrences</a> where
    		Joran implicitly infers the type of a component.
        </p>
    
        <p>The <em>expression</em> element corresponds to the evaluation
        expression just discussed. The expression
        <code>return message.contains("billing");</code> returns a boolean
        value. Notice that the <em>message</em> variable is exported
        automatically by <code>JaninoEventEvaluator</code>.
        </p>
    
    		<p>Given that the <span class="option">OnMismatch</span> property is
    		set to NEUTRAL and the <span class="option">OnMatch</span>
    		property set to DENY, this evaluator filter will drop all logging
    		events whose message contains the string "billing".
        </p>
    
        <p>The <a
        href="../xref/chapters/filters/FilterEvents.html"><code>FilterEvents</code></a>
        application issues ten logging requests, numbered 0 to 9. Let us
        first run <code>FilterEvents</code> class without any filters:
    		</p>
    		
    <div class="source"><pre>
    java chapters.filters.FilterEvents src/main/java/chapters/filters/basicConfiguration.xml
    </pre></div>
    		
    		<p>All requests will be displayed, as shown below:</p>
    
    <div class="source"><pre>0    [main] INFO  chapters.filters.FilterEvents - logging statement 0
    0    [main] INFO  chapters.filters.FilterEvents - logging statement 1
    0    [main] INFO  chapters.filters.FilterEvents - logging statement 2
    0    [main] DEBUG chapters.filters.FilterEvents - logging statement 3
    0    [main] INFO  chapters.filters.FilterEvents - logging statement 4
    0    [main] INFO  chapters.filters.FilterEvents - logging statement 5
    0    [main] ERROR chapters.filters.FilterEvents - <b>billing statement 6</b>
    0    [main] INFO  chapters.filters.FilterEvents - logging statement 7
    0    [main] INFO  chapters.filters.FilterEvents - logging statement 8
    0    [main] INFO  chapters.filters.FilterEvents - logging statement 9</pre></div>
    
    
    
    		<p>Suppose that we want to get rid of the "billing statement".
    		The <em>basicEventEvaluator.xml</em> configuration file listed
    		above filters messages containing the string "billing" which is
    		precisely the desired outcome.</p>
    
        <p>Running with <em>basicEventEvaluator.xml</em>:</p>
        <p class="source">java chapters.filters.FilterEvents src/main/java/chapters/filters/basicEventEvaluator.xml</p>
        <p>we obtain:
    		</p>
    		
        <p class="source">0    [main] INFO  chapters.filters.FilterEvents - logging statement 0
    0    [main] INFO  chapters.filters.FilterEvents - logging statement 1
    0    [main] INFO  chapters.filters.FilterEvents - logging statement 2
    0    [main] DEBUG chapters.filters.FilterEvents - logging statement 3
    0    [main] INFO  chapters.filters.FilterEvents - logging statement 4
    0    [main] INFO  chapters.filters.FilterEvents - logging statement 5
    0    [main] INFO  chapters.filters.FilterEvents - logging statement 7
    0    [main] INFO  chapters.filters.FilterEvents - logging statement 8
    0    [main] INFO  chapters.filters.FilterEvents - logging statement 9</p>
    		
    
        <p>Evaluation expressions can be Java blocks. For example, the
        following is a valid expression.</p>
    
        <pre class="prettyprint source">&lt;evaluator>
      &lt;expression>
        if(logger.startsWith("org.apache.http"))
          return true;
    
        if(mdc == null || mdc.get("entity") == null)
          return false;
    
        String payee = (String) mdc.get("entity");
    
        if(logger.equals("org.apache.http.wire") &amp;amp;&amp;amp; &lt;!-- &amp; encoded as &amp;amp; -->
            payee.contains("someSpecialValue") &amp;amp;&amp;amp;
            !message.contains("someSecret")) {
          return true;
        }
    
        return false;
      &lt;/expression>
    &lt;/evaluator></pre>
    
    
     	  <h2 class="doAnchor" name="matcher">Matchers</h2>
    
        <p>While it is possible to do pattern matching by invoking the <a
        href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html#matches%28java.lang.String%29">matches()</a>
        method in the <code>String</code> class, this incurs the cost of
        compiling of a brand new <code>Pattern</code> object each time the
        filter is invoked. To eliminate this overhead, you can predefine
        one or more <a
        href="../xref/ch/qos/logback/core/boolex/Matcher.html">Matcher</a>
        objects. Once a matcher is defined, it can be repeatedly
        referenced by name in the evaluator expression.</p>
    
        <p>An example should clarify the point:</p>
    
        <em>Example: Defining matchers in an event evaluator (logback-examples/src/main/java/chapters/filters/evaluatorWithMatcher.xml)</em>
        <span class="asGroovy" onclick="return asGroovy('evaluatorWithMatcher');">View as .groovy</span>
    
        <pre id="evaluatorWithMatcher" class="prettyprint source">&lt;configuration debug="true">
    
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        &lt;filter class="ch.qos.logback.core.filter.EvaluatorFilter">
          &lt;evaluator>        
            <b>&lt;matcher>
              &lt;Name>odd&lt;/Name>
              &lt;!-- filter out odd numbered statements -->
              &lt;regex>statement [13579]&lt;/regex>
            &lt;/matcher>
            
            &lt;expression>odd.matches(formattedMessage)&lt;/expression></b>
          &lt;/evaluator>
          &lt;OnMismatch>NEUTRAL&lt;/OnMismatch>
          &lt;OnMatch>DENY&lt;/OnMatch>
        &lt;/filter>
        &lt;encoder>
          &lt;pattern>%-4relative [%thread] %-5level %logger - %msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="STDOUT" />
      &lt;/root>
    &lt;/configuration></pre>
    
        <p>Running with <em>evaluatorWithMatcher.xml</em>:</p>
        <p class="source">java chapters.filters.FilterEvents src/main/java/chapters/filters/evaluatorWithMatcher.xml</p>
        <p>we obtain:
    		</p>
    		
        <p class="source">260  [main] INFO  chapters.filters.FilterEvents - logging statement 0
    264  [main] INFO  chapters.filters.FilterEvents - logging statement 2
    264  [main] INFO  chapters.filters.FilterEvents - logging statement 4
    266  [main] ERROR chapters.filters.FilterEvents - billing statement 6
    266  [main] INFO  chapters.filters.FilterEvents - logging statement 8</p>
    
        <p>If you need to define additional matchers, you can do so by
        adding further <code>&lt;matcher></code> elements.</p>
    
    
    
    
    
        <!-- ================================================================ -->
        <!-- ===================== TURBO FILTER ============================= -->
        <!-- ================================================================ -->
    
        <h2 class="doAnchor" name="TurboFilter">TurboFilters</h2>
        
        <p><code>TurboFilter</code> objects all extend the
        	<a href="../xref/ch/qos/logback/classic/turbo/TurboFilter.html">
        	<code>TurboFilter</code></a> abstract class. Like the regular
        	filters, they use ternary logic to return their evaluation of
        	the logging event.
        </p>
        
        <p>Overall, they work much like the previously mentioned
        filters. However, there are two main differences between
        <code>Filter</code> and <code>TurboFilter</code> objects.
        </p>
        
       	<p><code>TurboFilter</code> objects are tied to the logging
       	context. Hence, they are called not only when a given appender is
       	used, but each and every time a logging request is issued. Their
       	scope is wider than appender-attached filters.
       	</p>
       	
       	<p>More importantly, they are called before the
       	<code>LoggingEvent</code> object creation.
       	<code>TurboFilter</code> objects do not require the instantiation
       	of a logging event to filter a logging request. As such, turbo
       	filters are intended for high performance filtering of logging
    	events, even before the events are created.
        </p>
    
       	
       	<h3 class="doAnchor" name="yourOwnTurboFilter">Implementing your
       	own TurboFilter</h3>
        
        <p>To create your own <code>TurboFilter</code> component, just
        extend the <code>TurboFilter</code> abstract class. As previously,
        when implementing a customized filter object, developing a custom
        <code>TurboFilter</code> only asks that one implement the
        <code>decide()</code> method. In the next example, we create a
        slightly more complex filter:
        </p>
        
    <em>Example: Basic custom <code>TurboFilter</code> (<a href="../xref/chapters/filters/SampleTurboFilter.html">logback-examples/src/main/java/chapters/filters/SampleTurboFilter.java</a>)</em>		
    <pre class="prettyprint source">package chapters.filters;
    
    import org.slf4j.Marker;
    import org.slf4j.MarkerFactory;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.turbo.TurboFilter;
    import ch.qos.logback.core.spi.FilterReply;
    
    public class SampleTurboFilter extends TurboFilter {
    
      String marker;
      Marker markerToAccept;
    
      @Override
      public FilterReply decide(Marker marker, Logger logger, Level level,
          String format, Object[] params, Throwable t) {
    
        if (!isStarted()) {
          return FilterReply.NEUTRAL;
        }
    
        if ((markerToAccept.equals(marker))) {
          return FilterReply.ACCEPT;
        } else {
          return FilterReply.NEUTRAL;
        }
      }
    
      public String getMarker() {
        return marker;
      }
    
      public void setMarker(String markerStr) {
        this.marker = markerStr;
      }
    
      @Override
      public void start() {
        if (marker != null &amp;&amp; marker.trim().length() > 0) {
          markerToAccept = MarkerFactory.getMarker(marker);
          super.start(); 
        }
      }
    }
    </pre>
    
    		<p>The <code>TurboFilter</code> above accepts events that contain
    		a specific marker.  If said marker is not found, then the filter
    		passes the responsibility to the next filter in the chain.
    		</p>
    		
    		<p>To allow more flexibility, the marker that will be tested can
    		be specified in the configuration file, hence the getter and
    		setter methods. We also implemented the <code>start()</code>
    		method, to check that the option has been specified during the
    		configuration process.
    		</p>
    		
    		<p>Here is a sample configuration that makes use of our newly
    		created <code>TurboFilter</code>.
    		</p>
    		
        <em>Example: Basic custom <code>TurboFilter</code> configuration
        (logback-examples/src/main/java/chapters/filters/sampleTurboFilterConfig.xml)</em>
    
        <span class="asGroovy" onclick="return asGroovy('sampleTurboFilterConfig');">View as .groovy</span>
    
        <pre id="sampleTurboFilterConfig"  class="prettyprint source">&lt;configuration>
      <b>&lt;turboFilter class="chapters.filters.SampleTurboFilter">
        &lt;Marker>sample&lt;/Marker>
      &lt;/turboFilter></b>
    
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        &lt;encoder>
          &lt;pattern>
            %-4relative [%thread] %-5level %logger - %msg%n
          &lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;root>
        &lt;appender-ref ref="STDOUT" />
      &lt;/root>
    &lt;/configuration></pre>  
    
       	<p>Logback classic ships with several <code>TurboFilter</code>
       	classes ready for use.  The <a
       	href="../xref/ch/qos/logback/classic/turbo/MDCFilter.html"><code>MDCFilter</code></a>
       	checks the presence of a given value in the MDC whereas <a
       	href="../apidocs/ch/qos/logback/classic/turbo/DynamicThresholdFilter.html"><code>DynamicThresholdFilter</code></a>
       	allows filtering based on MDC key/level threshold associations. On
       	the other hand, <a
       	href="../xref/ch/qos/logback/classic/turbo/MarkerFilter.html"><code>MarkerFilter</code></a>
       	checks for the presence of a specific marker associated with the
       	logging request.
       	</p>
       	
       	<p>Here is a sample configuration, using both
       	<code>MDCFilter</code> and <code>MarkerFilter</code>.
       	</p>
       	
        <em>Example: <code>MDCFilter</code> and <code>MarkerFilter</code>
        configuration
        (logback-examples/src/main/java/chapters/filters/turboFilters.xml)</em>
    
        <span class="asGroovy" onclick="return asGroovy('turboFilters');">View as .groovy</span>
        <pre id="turboFilters" class="prettyprint source">&lt;configuration>
    
      &lt;turboFilter class="ch.qos.logback.classic.turbo.MDCFilter">
        &lt;MDCKey>username&lt;/MDCKey>
        &lt;Value>sebastien&lt;/Value>
        &lt;OnMatch>ACCEPT&lt;/OnMatch>
      &lt;/turboFilter>
    	
      &lt;turboFilter class="ch.qos.logback.classic.turbo.MarkerFilter">
        &lt;Marker>billing&lt;/Marker>
        &lt;OnMatch>DENY&lt;/OnMatch>
      &lt;/turboFilter>
    
      &lt;appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        &lt;encoder>
          &lt;pattern>%date [%thread] %-5level %logger - %msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;root level="INFO">
        &lt;appender-ref ref="console" />
      &lt;/root>  
    &lt;/configuration></pre>
    
    		<p>You can see this configuration in action by issuing the
    		following command:
    		</p>
        
        <p class="source">java chapters.filters.FilterEvents src/main/java/chapters/filters/turboFilters.xml</p>
    
    		<p>As we've seen previously, the <a
    		href="../xref/chapters/filters/FilterEvents.html"><code>FilterEvents</code></a>
    		application issues 10 logging requests, numbered 0 to 9. Except
    		for requests 3 and 6, all of the requests are of level
    		<em>INFO</em>, the same level as the one assigned to the root
    		logger. The 3rd request, is issued at the the <em>DEBUG</em>
    		level, which is below the effective level. However, since the MDC
    		key "username" is set to "sebastien" just before the 3rd request
    		and removed just afterwards, the <code>MDCFilter</code>
    		specifically accepts the request (and only that request). The 6th
    		request, issued at the <em>ERROR</em> level, is marked as
    		"billing". As such, it is denied by the MarkerFilter (the second
    		turbo filter in the configuration).
    		</p>
    		
    		<p>Thus, the output of <code>FilterEvents</code> application
    		configured with <em>turboFilters.xml</em> file shown above is:
    		</p>
    
        <p class="source">2006-12-04 15:17:22,859 [main] INFO  chapters.filters.FilterEvents - logging statement 0
    2006-12-04 15:17:22,875 [main] INFO  chapters.filters.FilterEvents - logging statement 1
    2006-12-04 15:17:22,875 [main] INFO  chapters.filters.FilterEvents - logging statement 2
    2006-12-04 15:17:22,875 [main] DEBUG chapters.filters.FilterEvents - logging statement 3
    2006-12-04 15:17:22,875 [main] INFO  chapters.filters.FilterEvents - logging statement 4
    2006-12-04 15:17:22,875 [main] INFO  chapters.filters.FilterEvents - logging statement 5
    2006-12-04 15:17:22,875 [main] INFO  chapters.filters.FilterEvents - logging statement 7
    2006-12-04 15:17:22,875 [main] INFO  chapters.filters.FilterEvents - logging statement 8
    2006-12-04 15:17:22,875 [main] INFO  chapters.filters.FilterEvents - logging statement 9</p>
    			
    			
    		<p>One can see that the 3rd request, which should not be displayed
    		if we only followed the overall <em>INFO</em> level, appears
    		anyway, because it matched the first <code>TurboFilter</code>
    		requirements and was accepted.
    		</p>    
    		
    		<p>On the other hand, the 6th request, that is an <em>ERROR</em>
    		level request should have been displayed. But it satisfied the
    		second <code>TurboFilter</code> whose <span
    		class="option">OnMatch</span> option is set to <em>DENY</em>.
    		Thus, the 6th request was not displayed.
    		</p>
    		
    
    
    		  
        <h3 class="doAnchor"
        name="DuplicateMessageFilter">DuplicateMessageFilter</h3>
    
        <p>The <code>DuplicateMessageFilter</code> merits a separate
        presentation.  This filter detects duplicate messages, and beyond
        a certain number of repetitions, drops repeated messages.
        </p>
    
        <p>To detect repetition, this filter uses simple String equality
        between messages. It does not detect messages which are very
        similar, varying only by few characters. For example, if you
        write:
        </p>
    
        <pre class="prettyprint source">logger.debug("Hello "+name0);
    logger.debug("Hello "+name1);</pre>
      
        <p>Assuming <code>name0</code> and <code>name1</code> have
        different values, the two "Hello" messages will be considered as
        unrelated. Depending on user demand, future releases may check for
        string similarity, eliminating repetitions of similar but not
        identical messages.
        </p>
    
        <p>Note that in case of parameterized logging, only the raw
        message is taken into consideration. For example, in the next two
        requests, the raw messages, i.e. "Hello {}.", are identical, and
        thus considered as repetitions.
        </p>
    
        <pre class="prettyprint source">logger.debug("Hello {}.", name0);
    logger.debug("Hello {}.", name1);</pre>
      
        <p>The number of allowed repetitions can be specified by the <span
        class="option">AllowedRepetitions</span> property. For example, if
        the property is set to 1, then the 2nd and subsequent
        occurrences of the same message will be dropped. Similarly, if the
        property is set to 2, then the 3rd and subsequent occurrences
        of the same message will be dropped. By default, the <span
        class="option">AllowedRepetitions</span> property is set to 5.
        </p>
    
        <p>In order to detect repetitions, this filter needs to keep
        references to old messages in an internal cache. The size of this
        cache is determined by the <span class="option">CacheSize</span>
        property. By the default, this is set to 100.
        </p>
    
        
        <em>Example: <code>DuplicateMessageFilter</code> 
        configuration (logback-examples/src/main/java/chapters/filters/duplicateMessage.xml)</em>
    
        <span class="asGroovy" onclick="return asGroovy('duplicateMessage');">View as .groovy</span>
        <pre id="duplicateMessage" class="prettyprint source">&lt;configuration>
    
      <b>&lt;turboFilter class="ch.qos.logback.classic.turbo.DuplicateMessageFilter"/></b>
    
      &lt;appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        &lt;encoder>
          &lt;pattern>%date [%thread] %-5level %logger - %msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;root level="INFO">
        &lt;appender-ref ref="console" />
      &lt;/root>  
    &lt;/configuration></pre>
    
      <p>Thus, the output for <code>FilterEvents</code> application
      configured with <em>duplicateMessage.xml</em> is:
      </p>
    
        <p class="source">2008-12-19 15:04:26,156 [main] INFO  chapters.filters.FilterEvents - logging statement 0
    2008-12-19 15:04:26,156 [main] INFO  chapters.filters.FilterEvents - logging statement 1
    2008-12-19 15:04:26,156 [main] INFO  chapters.filters.FilterEvents - logging statement 2
    2008-12-19 15:04:26,156 [main] INFO  chapters.filters.FilterEvents - logging statement 4
    2008-12-19 15:04:26,156 [main] INFO  chapters.filters.FilterEvents - logging statement 5
    2008-12-19 15:04:26,171 [main] ERROR chapters.filters.FilterEvents - billing statement 6</p>
    
        <p>"logging statement 0" is the first <em>occurrence</em> of the
        message "logging statement {}". "logging statement 1" is the first
        <em>repetition</em>, "logging statement 2" is the second
        repetition. Interestingly enough, "logging statement 3" of level
        DEBUG, is the <em>third</em> repetition, even though it is later
        dropped by virtue of the <a
        href="architecture.html#basic_selection">basic selection
        rule</a>. This can be explained by the fact that turbo filters are
        invoked before other types of filters, including the basic
        selection rule. Thus, <code>DuplicateMessageFilter</code>
        considers "logging statement 3" as a repetition, oblivious to the
        fact that it will be dropped further down in the processing
        chain. "logging statement 4" is the fourth repetition and "logging
        statement 5" the fifth. Statements 6 and beyond are dropped
        because only 5 repetitions are allowed by default.
        </p>
    
        <h1 class="doAnchor" name="logbac-access">In logback-access</h1>
        
        <p>Logback-access offers most of the features available with
        logback-classic. In particular, <code>Filter</code> objects are
        available and work in the same way as their logback-classic
        counterparts, with one notable difference. Instead of
        <code>LoggingEvent</code> instances logback-access filters act
        upon <a
        href="../xref/ch/qos/logback/access/spi/AccessEvent.html"><code>AccessEvent</code></a>
        instances. At present time, logback-access ships with a limited
        number of filters described below. If you would like to suggest
        additional filters, please contact the logback-dev mailing list.
        </p>
    
    		<h2 class="doAnchor"
    		name="countingFilter"><code>CountingFilter</code></h2>
    		
    		<p>With the help of <a
    		href="xref/ch/qos/logback/access/filter/CountingFilter.html"><code>CountingFilter</code></a>
    		class, logback-access can provide statistical data about access to
    		the web-server. Upon initialization, <code>CountingFilter</code>
    		registers itself as an MBean onto the platform's JMX server. You
    		can then interrogate that MBean for statistical data,
    		e.g. averages by minute, hour, day, week, or month. Other
    		statistics such the count for the preceding week, day, hour or
    		month as well as the total count are also available.
    		</p>
    		
    		<p>The following <em>logback-access.xml</em> configuration file
    		declares a <code>CountingFilter</code>.  </p>
    
        <pre class="prettyprint source">&lt;configuration>
      &lt;statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />
    
      <b>&lt;filter class="ch.qos.logback.access.filter.CountingFilter">
        &lt;name>countingFilter&lt;/name>
      &lt;/filter></b>
    
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        &lt;encoder>
          &lt;pattern>%h %l %u %t \"%r\" %s %b&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;appender-ref ref="STDOUT" />
    &lt;/configuration></pre>
    
        <p>You can examine the various statistics maintained by
        <code>CountingFilter</code> on your platform's JMX server via the
        <code>jconsole</code> application. </p>
    
    
        <img alt="CountingFilter via jconsole" src="images/chapters/filters/countingFilter.png" />
    	
    
        <h3 class="doAnchor" name="access_EvalutorFilter">EvaluatorFilter</h3>
    
        
        <p><a
        href="../xref/ch/qos/logback/core/filter/EvaluatorFilter.html"><code>EvaluatorFilter</code></a>
        is a generic filter encapsulating an
        <code>EventEvaluator</code>. As the name suggests, an
        <a
        href="../xref/ch/qos/logback/core/boolex/EventEvaluator.html">
        <code>EventEvaluator</code></a> evaluates whether a given criteria
        is met for a given event. On match and on mismatch,
        the hosting <code>EvaluatorFilter</code> will return the value
        specified by the <span class="option">onMatch</span> or
        <span class="option">onMismatch</span> properties respectively. Note that
        <code>EvaluatorFilter</code> has been previously discussed in the
        context of logback-classic (<a href="#evalutatorFilter">see
        above</a>). The present text is mostly a repetition of the
        previous discussion.</p>
    
    
        <p>Note that <code>EventEvaluator</code> is an abstract class. You
        can implement your own event evaluation logic by sub-classing
        <code>EventEvaluator</code>. Logback-access ships with a concrete
        implementation named <a
        href="../xref/ch/qos/logback/access/boolex/JaninoEventEvaluator.html">JaninoEventEvaluator</a>.
        It takes arbitrary Java language boolean expressions as the
        evaluation criteria. We refer to such Java language blocks as
        "<em>evaluation expressions</em>". Evaluation expressions enable
        great flexibility in event
        filtering. <code>JaninoEventEvaluator</code> requires the <a
        href="http://docs.codehaus.org/display/JANINO/Home">Janino
        library</a>. Please see the <a
        href="../setup.html#janino">corresponding section</a> of the setup
        document.
        </p>
    
        <p>Evaluation expressions are compiled on-the-fly during the
        interpretation of the configuration file. As a user, you do not
        need to worry about the actual plumbing. However, it is your
        responsibility to ensure that the Java language expression returns
        a boolean, i.e. that it evaluates to true or false. </p>
    
    
        <p>The evaluation expression is evaluated on the current access
        event. Logback-access automatically exports the current
        <code>AccessEvent</code> instance under the variable name
        <b><code>event</code></b>. You can read the various data
        associated with the HTTP request as well as the HTTP response via
        the <code>event</code> variable. Please refer to the <a
        href="../xref/ch/qos/logback/access/spi/AccessEvent.html"><code>AccessEvent</code>
        class source code</a> for the exact list.
        </p>
        
        <p>The next logback-access configuration file illustrates
        filtering based on the <a
        href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.5">404
        (Not Found)</a> HTTP response code. Every request resulting in a
        404 will be printed on the console.</p>
       	
    <em>Example: Access Evaluator (logback-examples/src/main/java/chapters/filters/accessEventEvaluator.xml)</em>
    <pre class="prettyprint source">&lt;configuration>
      &lt;statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />
    
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <b>&lt;filter class="ch.qos.logback.core.filter.EvaluatorFilter">
          &lt;evaluator>
            &lt;expression>event.getStatusCode() == 404&lt;/expression>
          &lt;/evaluator>
          &lt;onMismatch>DENY&lt;/onMismatch>
        &lt;/filter></b>
       &lt;encoder>&lt;pattern>%h %l %u %t %r %s %b&lt;/pattern>&lt;/encoder>
      &lt;/appender>
    
      &lt;appender-ref ref="STDOUT" />
    &lt;/configuration></pre>
    
    		<p>In the next example, we still log requests resulting in 404 errors,
    		except those requests asking for CSS files.
    		</p>	
    
    
        <em>Example 6.10: Access Evaluator (logback-examples/src/main/java/chapters/filters/accessEventEvaluator2.xml)</em>
        <pre class="prettyprint source">&lt;configuration>
      &lt;statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        &lt;filter class="ch.qos.logback.core.filter.EvaluatorFilter">
          &lt;evaluator name="Eval404">
            &lt;expression>
             <b>(event.getStatusCode() == 404)</b>
               <b>&amp;amp;&amp;amp;</b>  &lt;!-- ampersand characters need to be escaped -->
             <b>!(event.getRequestURI().contains(".css"))</b>
            &lt;/expression>
          &lt;/evaluator>
          &lt;onMismatch>DENY&lt;/onMismatch>
        &lt;/filter>
    
       &lt;encoder>&lt;pattern>%h %l %u %t %r %s %b&lt;/pattern>&lt;/encoder>
      &lt;/appender>
    
      &lt;appender-ref ref="STDOUT" />
    &lt;/configuration>
        </pre>
    	
        <script src="../templates/footer.js" type="text/javascript"></script>
    
      </div>
    </body>
    </html>
    ����������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/manual/.htaccess�����������������������������������������0000644�0001750�0001750�00000000256�11766710511�023435� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Redirect permanent /contextSelector.html http://logback.qos.ch/manual/loggingSeparation.html
    Redirect permanent /joran.html http://logback.qos.ch/manual/configuration.html
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/manual/underTheHood.html���������������������������������0000644�0001750�0001750�00000000764�11377016712�025121� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">  
      <head> 
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>under the hood</title>
      </head>
      <body>
        <h2>Under The Hood Sequence Diagram</h2>
      
        <img src="images/chapters/architecture/underTheHoodSequence2.gif" alt="underTheHoodSequence2.gif"/>
    
      </body>
    </html>
    ������������logback_1.0.13/logback-site/src/site/pages/manual/loggingSeparation.html����������������������������0000644�0001750�0001750�00000055152�11777022661�026212� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Chapter 9: Logging separation</title>
        <link rel="stylesheet" type="text/css" href="../css/common.css" />
        <link rel="stylesheet" type="text/css" href="../css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="../css/_print.css" media="print" />
        <link rel="stylesheet" type="text/css" href="../css/prettify.css" media="screen" />
      </head>
      <body onload="prettyPrint(); decorate();">
        <script type="text/javascript">prefix='../';</script>
        <script type="text/javascript" src="../js/prettify.js"></script>
        <script type="text/javascript" src="../templates/header.js"></script>
        <script type="text/javascript" src="../js/jquery-min.js"></script>
        <script type="text/javascript" src="../js/decorator.js"></script>
    
        <div id="left">
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="../templates/left.js" type="text/javascript"></script>
        </div>
        <div id="right">
          <script src="menu.js" type="text/javascript"></script>
        </div>
        <div id="content">	
    	
        <h1>Chapter 9: Logging separation</h1>
          
        <div class="quote">
          <p><em>It is not knowledge, but the act of learning, not
          possession but the act of getting there, which grants the greatest
          enjoyment. When I have clarified and exhausted a subject, then I
          turn away from it, in order to go into darkness again; the
          never-satisfied man is so strange if he has completed a structure,
          then it is not in order to dwell in it peacefully, but in order to
          begin another. I imagine the world conqueror must feel thus, who,
          after one kingdom is scarcely conquered, stretches out his arms
          for others.</em></p>
    
          <p>&mdash;KARL FRIEDRICH GAUSS, Letter to Bolyai, 1808.</p>
    
          <p><em>Style, like sheer silk, too often hides eczema.</em></p>
          
          <p>&mdash;ALBERT CAMUS, <em>The Fall</em></p>
    
        </div>
    
        <script src="../templates/creative.js" type="text/javascript"></script>		
        <script src="../templates/setup.js" type="text/javascript"></script>
    
        <h2>The problem: Logging Separation</h2>
    
        <p>The chapter deals with a relatively difficult problem of
        providing a separate logging environment for multiple applications
        running on the same web or EJB container. In the remainder of this
        chapter the term "application" will be used to refer to either a
        web-application or a J2EE application interchangeably.  In a
        separated logging environment, each application sees a distinct
        logback environment, so that the logback configuration of one
        application does not interfere with the settings of another. In
        more technical terms, each web-application has a distinct copy of
        <code>LoggerContext</code> reserved for its own use. Recall that
        in logback, each logger object is manufactured by a
        <code>LoggerContext</code> to which it remains attached for as
        long as the logger object lives in memory. A variant of this
        problem is the separation of application logging and the logging
        of the container itself.
        </p>
    
        <h2 class="doAnchor" name="easy">The simplest and easiest
        approach</h2>
    
        <p>Assuming your container supports child-first class loading,
        separation of logging can be accomplished by embedding a copy of
        slf4j and logback jar files in each of your applications. For
        web-applications, placing slf4j and logback jar files under the
        <em>WEB-INF/lib</em> directory of the web-application is
        sufficient to endow each web-application with a separate logging
        environment. A copy of the <em>logback.xml</em> configuration file
        placed under <em>WEB-INF/classes</em> will be picked up when
        logback is loaded into memory. 
        </p>
    
        <p>By virtue of class loader separation provided by the container,
        each web-application will load its own copy of
        <code>LoggerContext</code> which will pickup its own copy of
        <em>logback.xml</em>.</p>
        
        <p>Easy as pie.</p>
    
        <p>Well, not exactly. Sometimes you will be forced to place SLF4J
        and logback artifacts in a place accessible from all applications,
        typically because a shared library uses SLF4J. In that case, all
        applications will share the same logging environment. There are
        various other scenarios where a copy of SLF4J and logback
        artifacts is necessarily placed at a spot where it can be seen by
        all applications making logging separation by class loader
        separation impossible. All hope is not lost. Please read on.
        </p>
    
        <h2 class="doAnchor" name="contextSelectors">Context
        Selectors</h2>
    
        <p>Logback provides a mechanism for a single instance of SLF4J and
        logback classes loaded into memory to provide multiple logger
        contexts. When you write:
        </p>
    
        <pre class="prettyprint source">Logger logger = LoggerFactory.getLogger("foo");</pre>
    
        <p>the <code>getLogger</code>() method in
        <code>LoggerFactory</code> class will ask the SLF4J binding for a
        <code>ILoggerFactory</code>. When SLF4J is bound to logback, the
        task of returning an <code>ILoggerFactory</code> is delegated to
        an instance of <a
        href="../apidocs/ch/qos/logback/classic/selector/ContextSelector.html">ContextSelector</a>. Note
        that <code>ContextSelector</code> implementations always return
        instances <code>LoggerContext</code>. This class implements the
        <code>ILoggerFactory</code> interface.  In other words, a context
        selector has the option to returning any
        <code>LoggerContext</code> instance it sees fit according to its
        own criteria. Hence the name context <em>selector</em>.
        </p>
    
        <p>By default, the logback binding uses <a
        href="../xref/ch/qos/logback/classic/selector/DefaultContextSelector.html">DefaultContextSelector</a>
        which always returns the same <code>LoggerContext</code>, called
        the default logger context.</p>
    
        <p>You can specify a different context selector by setting the
        <em>logback.ContextSelector</em> system property. Suppose you
        would like to specify that context selector to an instance of the
        <code>myPackage.myContextSelector</code> class, you would add the
        following system property: </p>
    
        <p class="source">-Dlogback.ContextSelector=myPackage.myContextSelector</p>
    
        <p>The context selector needs to implement the
        <code>ContextSelector</code> interface and have a constructor
        method admitting a <code>LoggerContext</code> instance as its only
        parameter.
        </p>
    
    
        <h3 class="doAnchor"
        name="ContextJNDISelector">ContextJNDISelector</h3>
    
        <p>Logback-classic ships with a selector called
        <code>ContextJNDISelector</code> which selects the logger context
        based on data available via JNDI lookup. This approach leverages
        JNDI data separation mandated by the J2EE specification. Thus, the
        same environment variable can be set to carry a different value in
        different applications. In other words, calling
        <code>LoggerFactory.getLogger()</code> from different applications
        will return a logger attached to a different logger context, even
        if there is a single LoggerFactory class loaded into memory shared
        by all applications. That's logging separation for you.
        </p>
    
        <p>To enable <code>ContextJNDISelector</code>, the
        <em>logback.ContextSelector</em> system property needs to be set
        to "JNDI", as follows:</p>
    
        <p class="source">-Dlogback.ContextSelector=JNDI</p>
    
        <p>Note that the value <code>JNDI</code> is a convenient shorthand
        for
        <code>ch.qos.logback.classic.selector.ContextJNDISelector</code>.</p>
    
        <h3 class="doAnchor" name="settingJNDIVariables">Setting JNDI
        variables in applications</h3>
        
        <p>In each of your applications, you need to name the logging
        context for the application. For a web-application, JNDI
        environment entries are specified within the <em>web.xml</em>
        file. If "kenobi" was the name of your application, you would add
        the following XML element to kenobi's web.xml file:</p>
    
        <pre class="prettyprint source">&lt;env-entry>
      &lt;env-entry-name>logback/context-name&lt;/env-entry-name>
      &lt;env-entry-type>java.lang.String&lt;/env-entry-type>
      &lt;env-entry-value>kenobi&lt;/env-entry-value>
    &lt;/env-entry></pre>
    
        <p>Assuming you have enabled <code>ContextJNDISelector</code>,
        logging for Kenobi will be done using a logger context named
        "kenobi". Moreover, the "kenobi" logger context will be
        initialized by <em>convention</em> by looking up the configuration
        file called <em>logback-kenobi.xml</em> as a <em>resource</em>
        using the thread context class loader. Thus, for example for the
        kenobi web-application, <em>logback-kenobi.xml</em> should be
        placed under the <em>WEB-INF/classes</em> folder.
        </p>
    
        <p>If you wish to, you may specify a different configuration file
        other than the convention, by setting the
        "logback/configuration-resource" JNDI variable. For example, for
        the kenobi web-application, if you wish to specify
        <em>aFolder/my_config.xml</em> instead of the conventional
        <em>logback-kenobi.xml</em>, you would add the following XML
        element to web.xml
        </p>
    
    
       <pre class="prettyprint source">&lt;env-entry>
      &lt;env-entry-name>logback/configuration-resource&lt;/env-entry-name>
      &lt;env-entry-type>java.lang.String&lt;/env-entry-type>
      &lt;env-entry-value>aFolder/my_config.xml&lt;/env-entry-value>
    &lt;/env-entry></pre> 
    
        <p>The file <em>my_config.xml</em> should be placed under
        <em>WEB-INF/classes/aFolder/</em>. The important point to remember
        is that the configuration is looked up as a Java resource using
        the current thread's context class loader.
        </p>
        
    
        <h3 class="doAnchor" name="jndiTomcat">Configuring Tomcat for
        ContextJNDISelector</h3>
    
        <p>First, place the logback jars (that is
        logback-classic-${project.version}.jar,
        logback-core-${project.version}.jar and
        slf4j-api-${slf4j.version}.jar) in Tomcat's global (shared) class
        folder. In Tomcat 6.x, this directory is
        <em>$TOMCAT_HOME/lib/</em>.
        </p>
    
        <p>The <em>logback.ContextSelector</em> system property can be set
        by adding the following line to the <em>catalina.sh</em> script,
        catalina.bat in Windows, found under <em>$TOMCAT_HOME/bin</em>
        folder.</p>
    
        <p class="source">JAVA_OPTS="$JAVA_OPTS -Dlogback.ContextSelector=JNDI"</p>
    
    
        <h3 class="doAnchor" name="hotDeploy">Hot deploying
        applications</h3>
    
        <p>When the web-application is recycled or shutdown, we strongly
        recommend that the incumbent <code>LoggerContext</code> be closed
        so that it can be properly garbage collected. Logback ships with a
        <code>ServletContextListener</code> called <a
        href="../xref/ch/qos/logback/classic/selector/servlet/ContextDetachingSCL.html"><code>ContextDetachingSCL</code></a>,
        designed specifically for detaching the
        <code>ContextSelector</code> instance associated with the older
        web-application instance. It can be installed by adding the
        following lines into your web-applications <em>web.xml</em>
        file.</p>
    
        <pre class="prettyprint source">&lt;listener>
      &lt;listener-class>ch.qos.logback.classic.selector.servlet.ContextDetachingSCL&lt;/listener-class>
    &lt;/listener></pre>
    
        <p><span class="label notice">Note</span> Most containers invoke
        the <code>contextInitialized()</code> method of listeners in the
        order in which they are declared but invoke their
        <code>contextDestroyed()</code> method in reverse order. It
        follows that if you have multiple
        <code>ServletContextListener</code> declarations in your
        <em>web.xml</em>, then <code>ContextDetachingSCL</code> should be
        declared <em>first</em> so that its
        <code>contextDestroyed()</code> method is invoked <em>last</em>
        during application shutdown. </p>
    
        <h3 class="doAnchor" name="betterPerf">Better performance</h3>
    
        <p>When <code>ContextJNDISelector</code> is active, each time a
        logger is retrieved, a JNDI lookup must be performed. This can
        negatively impact performance, especially if you are using
        non-static (a.k.a. instance) logger references. Logback ships with a
        servlet filter named <a
        href="../xref/ch/qos/logback/classic/selector/servlet/LoggerContextFilter.html">LoggerContextFilter</a>,
        specifically designed to avoid the JNDI lookup cost. It can
        be installed by adding the following lines to your application's
        web.xml file.</p>
    
     <pre class="prettyprint source">&lt;filter>
      &lt;filter-name>LoggerContextFilter&lt;/filter-name>
      &lt;filter-class>ch.qos.logback.classic.selector.servlet.LoggerContextFilter&lt;/filter-class>
    &lt;/filter>
    &lt;filter-mapping>
      &lt;filter-name>LoggerContextFilter&lt;/filter-name>
      &lt;url-pattern>/*&lt;/url-pattern>
    &lt;/filter-mapping></pre>
    
       <p>At the beginning of each http-request,
       <code>LoggerContextFilter</code> will obtain the logger context
       associated with the application and then place it in a
       <code>ThreadLocal</code> variable. <code>ContextJNDISelector</code>
       will first check if the <code>ThreadLocal</code> variable is
       set. If it is set, then JNDI lookup will skipped. Note that at the
       end of the http request, the <code>ThreadLocal</code> variable will
       be nulled.  Installing <code>LoggerContextFilter</code> improves
       logger retrieval performance by a wide margin.
       </p>
    
       <p>Nulling the <code>ThreadLocal</code> variable allows garbage
       collection of the web-application when it is stopped or
       recycled.</p>
    
    
       <h2 class="doAnchor" name="tamingStaticRefs">Taming static
       references in shared libraries</h2>
    
       <p><code>ContextJNDISelector</code> works nicely to create logging
       separation when SLF4J and logback artifacts are shared by all
       applications. When <code>ContextJNDISelector</code> is active, each
       call to <code>LoggerFactory.getLogger()</code> will return a logger
       belonging to a logger context associated with the calling/current
       application.</p>
    
       <p>The common idiom for referencing a logger is via a static
       reference. For example,
       </p>
    
       <pre class="prettyprint source">public class Foo {
      <b>static</b> Logger logger = LoggerFactory.getLogger(Foo.class);
      ...
    }</pre>
    
        <p>Static logger references are both memory and CPU
        efficient. Only one logger reference is used for all instances of
        the class. Moreover, the logger instance is retrieved only once,
        when the class is loaded into memory. If the host class belongs to
        some application, say kenobi, then the static logger will be
        attached to kenobi's logger context by virtue of
        <code>ContextJNDISelector</code>. Similarly, if the host class
        belongs to some other application, say yoda, then its static
        logger reference will be attached to yoda's logger context, again
        by virtue of <code>ContextJNDISelector</code>.
        </p>
        
        <p>If a class, say <code>Mustafar</code>, belongs to a library
        shared by both <em>kenobi</em> and <em>yoda</em>, as long as
        <code>Mustafar</code> has non static loggers, each invocation of
        <code>LoggerFactory.getLogger()</code> will return a logger
        belonging to a logger context associated with the calling/current
        application. But if <code>Mustafar</code> has a static logger
        reference, then its logger will be attached to the logger context of the
        application that calls it first. Thus,
        <code>ContextJNDISelector</code> does not provide logging
        separation in case of shared classes using static logger
        references. This corner case has eluded a solution for eons.</p>
    
    
        <p>The only way to solve this issue transparently and perfectly
        would be to introduce another level of indirection inside loggers
        so that each logger-shell somehow delegated work to an inner
        logger attached to the appropriate context. This approach would be
        quite difficult to implement and would incur a significant
        computational overhead. It is not an approach we plan to pursue.
        </p>
    
        <p>It goes without saying that one could trivially solve the
        "shared class static logger" problem by moving the shared classes
        inside the web-apps (unshare them). If unsharing is not possible,
        then we can solicit the magical powers of <a
        href="appenders.html#SiftingAppender"><code>SiftingAppender</code></a>
        in order to separate logging using JNDI data as separation
        criteria.
        </p>
    
        <p>Logback ships with a discriminator called <a
        href="../xref/ch/qos/logback/classic/sift/JNDIBasedContextDiscriminator.html">JNDIBasedContextDiscriminator</a>
        which returns the name of the current logger context as computed
        by <code>ContextJNDISelector</code>. The
        <code>SiftingAppender</code> and
        <code>JNDIBasedContextDiscriminator</code> combination will create
        separate appenders for each web-application.
        </p>
    
        <pre class="prettyprint source">&lt;configuration>
    
      &lt;statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />  
    
      &lt;appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
        &lt;discriminator class="ch.qos.logback.classic.sift.JNDIBasedContextDiscriminator">
          &lt;defaultValue>unknown&lt;/defaultValue>
        &lt;/discriminator>
        &lt;sift>
          &lt;appender name="FILE-${contextName}" class="ch.qos.logback.core.FileAppender">
            &lt;file><b>${contextName}.log</b>&lt;/file>
            &lt;encoder>
              &lt;pattern>%-50(%level %logger{35}) cn=%contextName - %msg%n&lt;/pattern>
             &lt;/encoder>
          &lt;/appender>
         &lt;/sift>
        &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="SIFT" />
      &lt;/root>
    &lt;/configuration></pre>
    
    
       <p>If kenobi and yoda are web-applications, then the above
       configuration will output yoda's log output to <em>yoda.log</em>
       and kenobi's logs to <em>kenobi.log</em>; this even works for logs generated
       by static logger references located in shared classes.</p>
     
       <p>You can try out the technique just described with the help of the
       <a
       href="http://github.com/ceki/logback-starwars">logback-starwars</a>
       project.
       </p>
     
     
       <p>The above approach solves the logging separation problem but is
       rather complex. It requires the proper installation of
       <code>ContextJNDISelector</code> and mandates that appenders be
       wrapped by <code>SiftingAppender</code> which is a non-trivial beast
       in itself.
       </p>
     
       <p>Note that each logging context can be configured using the same
       file or alternatively different files. The choice is up to
       you. Instructing all contexts to use the same configuration file
       is simpler as only one file has to be maintained.  Maintaining a
       distinct configuration file for each application is harder to
       maintain but allows for more flexibility.</p>
     
       <p>So are we done yet? Can we declare victory and go home? Well, not
       quite.</p>
     
       <p>Let's assume the web-application <code>yoda</code> is initialized
       before <code>kenobi</code>. To initialize <code>yoda</code>, visit
       <code>http://localhost:port/yoda/servlet</code> which will invoke
       the <code>YodaServlet</code>. This servlet just says hello and logs
       message before calling the <code>foo</code> method in
       <code>Mustafar</code> which not-surprisingly logs a simple message
       and returns.
       </p>
     
       <p>After <code>YodaServlet</code> is called, the contents of
       <em>yoda.log</em> file should contain</p>
     
       <pre class="source">DEBUG ch.qos.starwars.yoda.YodaServlet             cn=yoda - in doGet()
    DEBUG ch.qos.starwars.shared.Mustafar              cn=yoda - in foo()</pre>
     
       <p>Note how both log entries are associated with the "yoda" context
       name. At this stage and until the server stops, the
       <code>ch.qos.starwars.shared.Mustafar</code> logger is attached to
       the 'yoda' context and will remain so until the server is stopped.
       </p>
    
       <p>Visiting <code>http://localhost:port/kenobi/servlet</code> will
       output the following in <em>kenobi.log</em>.</p>
    
       <pre class="source">DEBUG ch.qos.starwars.kenobi.KenobiServlet          <b>cn=kenobi</b> - in doGet()
    DEBUG ch.qos.starwars.shared.Mustafar               <b>cn=yoda</b> - in foo()</pre>
    
       <p>Note that even if the
       <code>ch.qos.starwars.shared.Mustafar</code> logger outputs to
       <em>kenobi.log</em> it is still attached to 'yoda'. Thus, we have
       two distinct logging contexts logging to the same file, in this
       case <em>kenobi.log</em>. Each of these contexts reference
       <code>FileAppender</code> instances, nested within distinct
       <code>SiftingAppender</code> instances, that are logging to the same
       file. Although logging separation seems to function according to
       our wishes, FileAppender instances cannot safely write to the same
       file unless they enable <span class="option">prudent</span>
       mode. Otherwise, the target file will be corrupted.</p>
       
       <p>Here is the configuration file enabling prudent mode:</p>
    
        <pre class="prettyprint source">&lt;configuration>
    
      &lt;statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />  
    
      &lt;appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
        &lt;discriminator class="ch.qos.logback.classic.sift.JNDIBasedContextDiscriminator">
          &lt;defaultValue>unknown&lt;/defaultValue>
        &lt;/discriminator>
        &lt;sift>
          &lt;appender name="FILE-${contextName}" class="ch.qos.logback.core.FileAppender">
            &lt;file>${contextName}.log&lt;/file>
            <b>&lt;prudent>true&lt;/prudent></b>
            &lt;encoder>
              &lt;pattern>%-50(%level %logger{35}) cn=%contextName - %msg%n&lt;/pattern>
             &lt;/encoder>
          &lt;/appender>
         &lt;/sift>
        &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="SIFT" />
      &lt;/root>
    &lt;/configuration></pre>
    
    
       <p>If you were able to keep up with the discussion thus far and
       have actually tried the logback-starwars examples, then you must be
       truly obsessed with logging. You should consider seeking <a
       href="http://www.qos.ch/shop/products/professionalSupport">professional
       help</a>.</p>
    
    
    
       <script src="../templates/footer.js"
       type="text/javascript"></script> </div>
       
       </body> 
    </html>
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/manual/appenders.html������������������������������������0000644�0001750�0001750�00000542701�12143151241�024501� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Chapter 4: Appenders</title>
        <link rel="stylesheet" type="text/css" href="../css/common.css" />
        <link rel="stylesheet" type="text/css" href="../css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="../css/_print.css" media="print" />
        <link rel="stylesheet" type="text/css" href="../css/prettify.css" media="screen"/>    
      </head>
      <body onload="prettyPrint(); decorate();">
        <script type="text/javascript">prefix='../';</script>
        <script type="text/javascript" src="../js/prettify.js"></script>
        <script type="text/javascript" src="../templates/header.js"></script>
        <script type="text/javascript" src="../js/dsl.js"></script>
        <script type="text/javascript" src="../js/jquery-min.js"></script>
        <script type="text/javascript" src="../js/decorator.js"></script>
        <div id="left">      
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="../templates/left.js" type="text/javascript"></script>
        </div>    
        <div id="right">
          <script src="menu.js" type="text/javascript"></script>
        </div>
    
        <div id="content">
    
        <h1>Chapter 4: Appenders</h1>
    
        <div class="quote">
    
          <p><em>There is so much to tell about the Western country in
          that day that it is hard to know where to start. One thing sets
          off a hundred others. The problem is to decide which one to tell
          first.</em></p>
      
          <p>&mdash;JOHN STEINBECK, <em>East of Eden</em></p>
        </div>
    
    
        <script src="../templates/creative.js" type="text/javascript"></script>
        <script src="../templates/setup.js" type="text/javascript"></script>
        
        <h2><a name="whatIsAnAppender" href="#whatIsAnAppender"><span
        class="anchor"/></a>What is an Appender?</h2>
        
    		<p>Logback delegates the task of writing a logging event to
    		components called appenders.  Appenders must implement the <a
    		href="../xref/ch/qos/logback/core/Appender.html"><code>ch.qos.logback.core.Appender</code></a>
    		interface.  The salient methods of this interface are summarized
    		below:
    		</p>
    		<pre class="prettyprint source">package ch.qos.logback.core;
      
    import ch.qos.logback.core.spi.ContextAware;
    import ch.qos.logback.core.spi.FilterAttachable;
    import ch.qos.logback.core.spi.LifeCycle;
      
    
    public interface Appender&lt;E> extends LifeCycle, ContextAware, FilterAttachable {
    
      public String getName();
      public void setName(String name);
      <b>void doAppend(E event);</b>
      
    }</pre>
    
    	<p>Most of the methods in the <code>Appender</code> interface are
    	setters and getters. A notable exception is the
    	<code>doAppend()</code> method taking an object instance of type
    	<em>E</em> as its only parameter. The actual type of <em>E</em>
    	will vary depending on the logback module. Within the
    	logback-classic module <em>E</em> would be of type <a
    	href="../apidocs/ch/qos/logback/classic/spi/ILoggingEvent.html">ILoggingEvent</a>
    	and within the logback-access module it would be of type <a
    	href="../apidocs/ch/qos/logback/access/spi/AccessEvent.html">AccessEvent</a>.
    	The <code>doAppend()</code> method is perhaps the most important in
    	the logback framework.  It is responsible for outputting the logging
    	events in a suitable format to the appropriate output device.
      </p>
    
      <p>Appenders are named entities.  This ensures that they can be
      referenced by name, a quality confirmed to be instrumental in
      configuration scripts. The <code>Appender</code> interface extends
      the <code>FilterAttachable</code> interface. It follows that one or
      more filters can be attached to an appender instance. Filters are
      discussed in detail in a subsequent chapter.
    	</p>
    	
    	<p>Appenders are ultimately responsible for outputting logging
    	events.  However, they may delegate the actual formatting of the
    	event to a <code>Layout</code> or to an <code>Encoder</code> object.
    	Each layout/encoder is associated with one and only one appender,
    	referred to as the owning appender. Some appenders have a built-in
    	or fixed event format. Consequently, they do not require nor have a
    	layout/encoder. For example, the <code>SocketAppender</code> simply
    	serializes logging events before transmitting them over the wire.
    	</p>
    	
    	
    	<h2 class="doAnchor" name="AppenderBase">AppenderBase</h2>
    	
    	<p>The <a href="../xref/ch/qos/logback/core/AppenderBase.html">
    	<code>ch.qos.logback.core.AppenderBase</code></a> class is an
    	abstract class implementing the <code>Appender</code> interface.  It
    	provides basic functionality shared by all appenders, such as
    	methods for getting or setting their name, their activation status,
    	their layout and their filters.  It is the super-class of all
    	appenders shipped with logback.  Although an abstract class,
    	<code>AppenderBase</code> actually implements the
    	<code>doAppend()</code> method in the <code>Append</code> interface.
    	Perhaps the clearest way to discuss <code>AppenderBase</code> class
    	is by presenting an excerpt of actual source code.
    	</p>
    	
    <pre class="prettyprint source">public synchronized void doAppend(E eventObject) {
    
      // prevent re-entry.
      if (guard) {
        return;
      }
    
      try {
        guard = true;
    
        if (!this.started) {
          if (statusRepeatCount++ &lt; ALLOWED_REPEATS) {
            addStatus(new WarnStatus(
                "Attempted to append to non started appender [" + name + "].",this));
          }
          return;
        }
    
        if (getFilterChainDecision(eventObject) == FilterReply.DENY) {
          return;
        }
        
        // ok, we now invoke the derived class's implementation of append
        this.append(eventObject);
    
      } finally {
        guard = false;
      }
    }</pre>
    	
    	<p>This implementation of the <code>doAppend()</code> method is
    	synchronized.  It follows that logging to the same appender from
    	different threads is safe. While a thread, say <em>T</em>, is
    	executing the <code>doAppend()</code> method, subsequent calls by
    	other threads are queued until <em>T</em> leaves the
    	<code>doAppend()</code> method, ensuring <em>T</em>'s exclusive
    	access to the appender.
    	</p>
    
      <p>Since such synchronization is not always appropriate, logback
      ships with <a
      href="../xref/ch/qos/logback/core/UnsynchronizedAppenderBase.html"><code>ch.qos.logback.core.UnsynchronizedAppenderBase</code></a>
      which is very similar to the <a
      href="../xref/ch/qos/logback/core/AppenderBase.html"><code>AppenderBase</code></a>
      class. For the sake of conciseness, we will be discussing
      <code>UnsynchronizedAppenderBase</code> in the remainder of this document.
      </p>
    
    
      <p>The first thing the <code>doAppend()</code> method does is to
      check whether the guard is set to true. If it is, it immediately
      exits. If the guard is not set, it is set to true at the next
      statement. The guard ensures that the <code>doAppend()</code> method
      will not recursively call itself. Just imagine that a component,
      called somewhere beyond the <code>append()</code> method, wants to
      log something. Its call could be directed to the very same appender
      that just called it resulting in an infinite loop and a stack
      overflow.
    	</p>
    	
    	<p>In the following statement we check whether the
    	<code>started</code> field is true.  If it is not,
    	<code>doAppend()</code> will send a warning message and return.  In
    	other words, once an appender is closed, it is impossible to write
    	to it.  <code>Appender</code> objects implement the
    	<code>LifeCycle</code> interface, which implies that they implement
    	<code>start()</code>, <code>stop()</code> and
    	<code>isStarted()</code> methods.  After setting all the properties of
    	an appender, Joran, logback's configuration framework, calls the
    	<code>start()</code> method to signal the appender to activate its
    	properties.  Depending on its kind, an appender may fail to start if
    	certain properties are missing or because of interference between
    	various properties.  For example, given that file creation depends on
    	truncation mode, <code>FileAppender</code> cannot act on the value
    	of its <code>File</code> option until the value of the Append option
    	is also known with certainty. The explicit activation step ensures
    	that an appender acts on its properties <em>after</em> their values
    	become known.
    	</p>
    	
    	<p>If the appender could not be started or if it has been stopped, a
    	warning message will be issued through logback's internal status
    	management system. After several attempts, in order to avoid
    	flooding the internal status system with copies of the same warning
    	message, the <code>doAppend()</code> method will stop issuing these
    	warnings.
      </p>
    
    	<p>The next <code>if</code> statement checks the result of the
    	attached filters.  Depending on the decision resulting from the
    	filter chain, events can be denied or explicitly accepted.  In
    	the absence of a decision by the filter chain, events are accepted
    	by default.
    	</p>
    	
    	<p>The <code>doAppend()</code> method then invokes the derived
    	classes' implementation of the <code>append()</code> method. This
    	method does the actual work of appending the event to the
    	appropriate device.
    	</p>
    	
      <p>Finally, the guard is released so as to allow a subsequent
      invocation of the <code>doAppend()</code> method.
      </p>
    
    	<p>For the remainder of this manual, we reserve the term "option" or
    	alternatively "property" for any attribute that is inferred
    	dynamically using JavaBeans introspection through setter and getter
    	methods. </p>
    	
    	<h1>Logback-core</h1>
    	
    	<p>Logback-core lays the foundation upon which the other logback
    	modules are built. In general, the components in logback-core
    	require some, albeit minimal, customization. However, in the next
    	few sections, we describe several appenders which are ready for use
    	out of the box.
      </p>
    
    
    	
    	<h2 class="doAnchor"
    	name="OutputStreamAppender">OutputStreamAppender
      </h2>
    	
    	<p><a
    	href="../xref/ch/qos/logback/core/OutputStreamAppender.html"><code>OutputStreamAppender</code></a>
    	appends events to a <code>java.io.OutputStream</code>.  This class
    	provides basic services that other appenders build upon.  Users do
    	not usually instantiate <code>OutputStreamAppender</code> objects
    	directly, since in general the <code>java.io.OutputStream</code>
    	type cannot be conveniently mapped to a string, as there is no way
    	to specify the target <code>OutputStream</code> object in a
    	configuration script.  Simply put, you cannot configure a
    	<code>OutputStreamAppender</code> from a configuration file.
    	However, this does not mean that <code>OutputStreamAppender</code>
    	lacks configurable properties.  These properties are described next.
    	</p>
    	
      <table class="bodyTable striped">
        <tr>
          <th>Property Name</th>
          <th>Type</th>
          <th>Description</th>
        </tr>
        
        <tr>
          <td><span class="prop" name="osaEncoder">encoder</span></td>
    
          <td><a
          href="../xref/ch/qos/logback/core/encoder/Encoder.html"><code>Encoder</code></a></td>
    
          <td>Determines the manner in which an event is written to the
          underlying <code>OutputStreamAppender</code>. Encoders are
          described in a <a href="encoders.html">dedicated chapter</a>.
    			</td>
    		</tr>
    	
    	</table>
        
      <p>The <code>OutputStreamAppender</code> is the super-class of three other
    	appenders, namely <code>ConsoleAppender</code>,
    	<code>FileAppender</code> which in turn is the super class of
    	<code>RollingFileAppender</code>. The next figure illustrates the
    	class diagram for <code>OutputStreamAppender</code> and its subclasses.
    	</p>
    	
    	<img src="images/chapters/appenders/appenderClassDiagram.jpg" alt="A UML diagram showing OutputStreamAppender and sub-classes"/>
    	
    
    	<h2 class="doAnchor" name="ConsoleAppender">ConsoleAppender</h2>
    	
      <p>The <a href="../xref/ch/qos/logback/core/ConsoleAppender.html">
      <code>ConsoleAppender</code></a>, as the name indicates, appends on
      the console, or more precisely on <em>System.out</em> or
      <em>System.err</em>, the former being the default
      target. <code>ConsoleAppender</code> formats events with the help of
      an encoder specified by the user. Encoders will be discussed in a
      subsequent chapter. Both <em>System.out</em> and <em>System.err</em>
      are of type <code>java.io.PrintStream</code>.  Consequently, they
      are wrapped inside an <code>OutputStreamWriter</code> which buffers
      I/O operations.
    	</p>
    	
    	<table class="bodyTable striped">
    			<tr>
    			<th>Property Name</th>
    			<th>Type</th>
    			<th>Description</th>
    		</tr>
    		<tr>
    			<td><span class="prop" container="conApp">encoder</span></td>
          <td>
            <a href="../xref/ch/qos/logback/core/encoder/Encoder.html"><code>Encoder</code></a>
          </td>
    			<td>See <code>OutputStreamAppender</code> properties.</td>
    		</tr>
    		<tr>
    			<td><span class="prop" container="conApp">target</span></td>
    			<td><code>String</code></td>
    			<td>
    				One of the String values <em>System.out</em> or 
    				<em>System.err</em>. The default target is <em>System.out</em>.
    			</td>
    		</tr>
    
    		<tr>
    			<td><span class="prop" container="conApp">withJansi</span></td>
    			<td><code>boolean</code></td>
    			<td>By the default <span class="prop">withJansi</span> property
    			is set to <code>false</code>.  Setting <span
    			class="prop">withJansi</span> to <code>true</code> activates the
    			<a href="http://jansi.fusesource.org/">Jansi</a> library which
    			provides support for ANSI color codes on Windows machines.  On a
    			Windows host, if this property is set to true, then you should
    			put "org.fusesource.jansi:jansi:${jansi.version}" on the class
    			path. Note that Unix-based operating systems such as Linux and
    			Mac OS X support ANSI color codes by default.
    
          <p>Under the Eclipse IDE, you might want to try the <a
          href="http://www.mihai-nita.net/eclipse/">ANSI in Eclipse
          Console</a> plugin.
          </p>
    			</td>
    		</tr>
    
    	</table>
    	
    	<p>Here is a sample configuration that uses
    	<code>ConsoleAppender</code>.
    	</p>
    
    
    
      <p class="example">Example: ConsoleAppender configuration
      (logback-examples/src/main/java/chapters/appenders/conf/logback-Console.xml)</p>
    
      <span class="asGroovy" onclick="return asGroovy('logback_Console');">View as .groovy</span>
    
      <pre id="logback_Console" class="prettyprint source">&lt;configuration>
    
      <b>&lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        &lt;!-- encoders are assigned the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
        &lt;encoder>
          &lt;pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender></b>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="STDOUT" />
      &lt;/root>
    &lt;/configuration></pre>
    
       <p>After you have set your current path to the
       <em>logback-examples</em> directory and <a href="../setup.html">set
       up your class path</a>, you can give the above configuration file a
       whirl by issuing the following command:
    	 </p>
    
       <p class="source">java <a
       href="../xref/chapters/appenders/ConfigurationTester.html">chapters.appenders.ConfigurationTester</a> src/main/java/chapters/appenders/conf/logback-Console.xml</p>
    	
    	
       <h2 class="doAnchor" name="FileAppender">FileAppender</h2>
    	
       <p>The <a
       href="../xref/ch/qos/logback/core/FileAppender.html"><code>FileAppender</code></a>,
       a subclass of <code>OutputStreamAppender</code>, appends log events into
       a file. The target file is specified by the <span
       class="prop">File</span> option.  If the file already exists, it
       is either appended to, or truncated depending on the value of the
       <span class="prop">append</span> property.   
       </p>
    	
       <table class="bodyTable properties striped">
         <tr>
           <th>Property Name</th>
           <th>Type</th>
           <th>Description</th>
         </tr>
         <tr>
           <td><span class="prop" container="fileApppender">append</span></td>
           <td><code>boolean</code></td>
           <td>If true, events are appended at the end of an existing
           file.  Otherwise, if <span class="prop">append</span> is false,
           any existing file is truncated. The <span
           class="option">append</span> option is set to true by default.
           </td>
         </tr>
         <tr >
           <td><span class="prop" container="fileApppender">encoder</span></td>
           <td>
             <a href="../xref/ch/qos/logback/core/encoder/Encoder.html"><code>Encoder</code></a>
           </td>
           <td>See <code>OutputStreamAppender</code> properties.</td>
         </tr>
        
       
         <tr>
           <td><span class="prop"
           container="fileApppender">file</span></td>
           <td><code>String</code></td>
           <td>The name of the file to write to. If the file does not
           exist, it is created. On the MS Windows platform users
           frequently forget to escape back slashes.  For example, the
           value <em>c:\temp\test.log</em> is not likely to be interpreted
           properly as <em>'\t'</em> is an escape sequence interpreted as
           a single tab character <em>(\u0009)</em>.  Correct values can
           be specified as <em>c:/temp/test.log</em> or alternatively as
           <em>c:\\temp\\test.log</em>.  The <span
           class="prop">File</span> option has no default value.
    
           <p>If the parent directory of the file does not exist,
           <code>FileAppender</code> will automatically create it,
           including any necessary but nonexistent parent directories.
           </p>
           </td>
         </tr>
       
    
         <tr>
           <td><span class="prop" name="prudent">prudent</span></td>
           <td><code>boolean</code></td>
    
           <td>In prudent mode, <code>FileAppender</code> will safely
             write to the specified file, even in the presence of other
             <code>FileAppender</code> instances running in different
             JVMs, potentially running on different hosts. The default
             value for prudent mode is <code>false</code>.
    
             <p>Prudent mode can be used in conjunction with
             <code>RollingFileAppender</code> although some <a
             href="#prudentWithRolling">restrictions apply</a>.</p>
    
             <p>Prudent mode implies that <span
             class="prop">append</span> property is automatically set to
             true.
             </p>
    
             <p>Produdent more relies on exclusive file locks. Experiments
             show that file locks approximately triple (x3) the cost of
             writing a logging event. On an "average" PC writing to a file
             located on a <b>local</b> hard disk, when prudent mode is
             off, it takes about 10 microseconds to write a single logging
             event. When prudent mode is on, it takes approximately 30
             microseconds to output a single logging event. This
             translates to logging throughput of 100'000 events per second
             when prudent mode is off and approximately 33'000 events per
             second in prudent mode.
             </p>
    
             <p>Prudent mode effectively serializes I/O operations between
             all JVMs writing to the same file. Thus, as the number of
             JVMs competing to access a file increases so will the delay
             incurred by each I/O operation. As long as the <em>total</em>
             number of I/O operations is in the order of 20 log requests
             per second, the impact on performance should be
             negligible. Applications generating 100 or more I/O
             operations per second can see an impact on performance and
             should avoid using <span class="prop">prudent</span> mode.
             </p>
    
             <p><span class="label">Networked file locks</span> When the
             log file is located on a networked file system, the cost of
             prudent mode is even greater. Just as importantly, file locks
             over a networked file system can be sometimes strongly biased
             such that the process currently owning the lock immediately
             re-obtains the lock upon its release. Thus, while one process
             hogs the lock for the log file, other processes starve
             waiting for the lock to the point of appearing deadlocked.
             </p>
             
             <p>The impact of prudent mode is highly dependent on network
             speed as well as the OS implementation details. We provide an
             very small application called <a
             href="https://gist.github.com/2794241">FileLockSimulator</a>
             which can help you simulate the behavior of prudent mode in
             your environment.
             </p>
    
    
           </td>
           
         </tr>
       </table>
    	
       <p><span class="label notice">Immediate Flush</span> By default,
       each log event is immediately flushed to the underlying output
       stream. This default approach is safer in the sense that logging
       events are not lost in case your applicaiton exits without properly
       closing appenders. However, for significantly increased logging
       throughput, you may want to set the <span
       class="prop">immediateFlush</span> property of the underlying
       <code>Encoder</code> to <code>false</code> . Encoders and in
       particular <a
       href="encoders.html#LayoutWrappingEncoder"><code>LayoutWrappingEncoder</code></a>
       are described in a separate chapter.</p>
    
       <p>Below is an example of a configuration file for
       <code>FileAppender</code>:
    	 </p>
    
       <p class="example">Example: FileAppender configuration
       (logback-examples/src/main/java/chapters/appenders/conf/logback-fileAppender.xml)</p>
    
       <span class="asGroovy" onclick="return asGroovy('logback-fileAppender');">View as .groovy</span>
       <pre id="logback-fileAppender"  class="prettyprint source">&lt;configuration>
    
      <b>&lt;appender name="FILE" class="ch.qos.logback.core.FileAppender">
        &lt;file>testFile.log&lt;/file>
        &lt;append>true&lt;/append>
        &lt;!-- encoders are assigned the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
        &lt;encoder>
          &lt;pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender></b>
    	
      &lt;root level="DEBUG">
        &lt;appender-ref ref="FILE" />
      &lt;/root>
    &lt;/configuration></pre>
    
       <p>After changing the current directory to
       <em>logback-examples</em>, run this example by launching the
       following command:
       </p>
    	
       <p class="source">java chapters.appenders.ConfigurationTester
       src/main/java/chapters/appenders/conf/logback-fileAppender.xml</p>
    	
    	
       <h3 class="doAnchor" name="uniquelyNamed">Uniquely named files (by
       timestamp)</h3>
       
       <p>During the application development phase or in the case of
       short-lived applications, e.g. batch applications, it is desirable
       to create a new log file at each new application launch. This is
       fairly easy to do with the help of the <code>&lt;timestamp></code>
       element. Here's an example.</p>
    
    
       <p class="example">Example: Uniquely named FileAppender
       configuration by timestamp
       (logback-examples/src/main/java/chapters/appenders/conf/logback-timestamp.xml)</p>
    
       <span class="asGroovy" onclick="return asGroovy('logback-timestamp');">View as .groovy</span>
       <pre id="logback-timestamp" class="prettyprint source">&lt;configuration>
    
      &lt;!-- Insert the current time formatted as "yyyyMMdd'T'HHmmss" under
           the key "bySecond" into the logger context. This value will be
           available to all subsequent configuration elements. -->
      <b>&lt;timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"/></b>
    
      &lt;appender name="FILE" class="ch.qos.logback.core.FileAppender">
        &lt;!-- use the previously created timestamp to create a uniquely
             named log file -->
        &lt;file><b>log-${bySecond}.txt</b>&lt;/file>
        &lt;encoder>
          &lt;pattern>%logger{35} - %msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="FILE" />
      &lt;/root>
    &lt;/configuration></pre>
    
    
       <p>The timestamp element takes two mandatory attributes <span
       class="attr">key</span> and <span class="attr">datePattern</span>
       and an optional <span class="attr">timeReference</span>
       attribute. The <span class="attr">key</span> attribute is the name
       of the key under which the timestamp will be available to
       subsequent configuration elements <a
       href="configuration.html#variableSubstitution">as a
       variable</a>. The <span class="attr">datePattern</span> attribute
       denotes the date pattern used to convert the current time (at which
       the configuration file is parsed) into a string. The date pattern
       should follow the conventions defined in <a
       href="http://java.sun.com/j2se/1.4.2/docs/api/java/text/SimpleDateFormat.html">SimpleDateFormat</a>. The
       <span class="attr">timeReference</span> attribute denotes the time
       reference for the time stamp. The default is the
       interpretation/parsing time of the configuration file, i.e. the
       current time. However, under certain circumstances it might be
       useful to use the context birth time as time reference. This can be
       accomplished by setting the <span class="attr">timeReference</span>
       attribute to <code>"contextBirth"</code>.
       </p>
    
       <p>Experiment with the <code>&lt;timestamp></code> element by
       running the command:</p>
    
       <p class="command">java chapters.appenders.ConfigurationTester src/main/java/chapters/appenders/conf/logback-timestamp.xml</p>
    
       <p>To use the logger context birth date as time reference, you
       would set the <span class="attr">timeReference</span> attribute to
       "contextBirth" as shown below.</p>
    
    
       <p class="example">Example: Timestamp using context birth date as time reference
       (logback-examples/src/main/java/chapters/appenders/conf/logback-timestamp-contextBirth.xml)</p>
    
       <span class="asGroovy" onclick="return asGroovy('logback-timestamp-contextBirth');">View as .groovy</span>   
       <pre id="logback-timestamp-contextBirth" class="prettyprint source">&lt;configuration>
      &lt;timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss" 
                 <b>timeReference="contextBirth"</b>/>
      ...
    &lt;/configuration></pre>
    
       <h2 class="doAnchor" name="RollingFileAppender">RollingFileAppender
       </h2>
       
       <p><a
    	 href="../xref/ch/qos/logback/core/rolling/RollingFileAppender.html"><code>RollingFileAppender</code></a>
    	 extends <code>FileAppender</code> with the capability to rollover log
    	 files.  For example, <code>RollingFileAppender</code> can log to a
    	 file named <em>log.txt</em> file and, once a certain condition is
    	 met, change its logging target to another file.
       </p>
         
       <p>There are two important sub-components that interact with
       <code>RollingFileAppender</code>. The first
       <code>RollingFileAppender</code> sub-component, namely
       <code>RollingPolicy</code>, (<a href="#onRollingPolicies">see
       below</a>) is responsible for undertaking the actions required for
       a rollover. A second sub-component of
       <code>RollingFileAppender</code>, namely
       <code>TriggeringPolicy</code>, (<a href="#TriggeringPolicy">see
       below</a>) will determine if and exactly when rollover
       occurs. Thus, <code>RollingPolicy</code> is responsible for the
       <em>what</em> and <code>TriggeringPolicy</code> is responsible for
       the <em>when</em>. </p>
    	
       <p>To be of any use, a <code>RollingFileAppender</code> must have
       both a <code>RollingPolicy</code> and a
       <code>TriggeringPolicy</code> set up. However, if its
       <code>RollingPolicy</code> also implements the
       <code>TriggeringPolicy</code> interface, then only the former needs
       to be specified explicitly.
       </p>
    	
       <p>Here are the available properties for <code>RollingFileAppender</code>:</p>
    	
       <table class="bodyTable striped">
         <tr>
           <th>Property Name</th>
           <th>Type</th>
           <th>Description</th>
         </tr>
         <tr>
           <td><span class="prop" container="rfa">file</span></td>
           <td><code>String</code></td>
           <td>See <code>FileAppender</code> properties.</td>
         </tr>	
         <tr>
           <td><span class="prop" container="rfa">append</span></td>
           <td><code>boolean</code></td>
           <td>See <code>FileAppender</code> properties.</td>
         </tr>	
         <tr>
           <td><span class="prop" container="rfa">encoder</span></td>
           <td>
             <a href="../xref/ch/qos/logback/core/encoder/Encoder.html"><code>Encoder</code></a>
           </td>
           <td>See <code>OutputStreamAppender</code> properties.</td>
         </tr>
         <tr>
           <td><span class="prop" container="rfa">rollingPolicy</span></td>
           <td><code>RollingPolicy</code></td>
           <td>This option is the component that will dictate
           <code>RollingFileAppender</code>'s behavior when rollover
           occurs. See more information below.
           </td>
         </tr>	
         <tr>
           <td><span class="prop" container="rfa">triggeringPolicy</span></td>
           <td><code>TriggeringPolicy</code></td>
           <td>
             This option is the component that will tell 
             <code>RollingFileAppender</code> when to activate the rollover
             procedure. See more information below.
           </td>
         </tr>	
         <tr>
           <td valign="top"><span class="prop" name="prudentWithRolling">prudent</span></td>
    
           <td valign="top"><code>boolean</code></td>
    
           <td  valign="top">
             <a
             href="#FixedWindowRollingPolicy"><code>FixedWindowRollingPolicy</code></a>
             is not supported in prudent mode.
    
             <p> <code>RollingFileAppender</code> supports the prudent
             mode in conjunction with <a
             href="#TimeBasedRollingPolicy"><code>TimeBasedRollingPolicy</code></a>
             albeit with two restrictions.
             </p>
    
             <ol>
               <li>In prudent mode, file compression is not supported nor
               allowed. (We can't have one JVM writing to a file while
               another JVM is compressing it.)  </li>
               
               <li>The <span class="prop">file</span> property of
               <code>FileAppender</code> cannot be set and must be left
               blank. Indeed, most operating systems do not allow renaming
               of a file while another process has it opened.
               </li>
               
             </ol>
    
             See also properties for <code>FileAppender</code>.
           </td>
         </tr>
       </table>
    	
       <h3 class="doAnchor" name="onRollingPolicies">Overview of rolling
       policies</h3>
    	
       <p><a
       href="../xref/ch/qos/logback/core/rolling/RollingPolicy.html"><code>RollingPolicy</code></a>
       is responsible for the rollover procedure which involves file
       moving and renaming.</p>
    	
       <p>The <code>RollingPolicy</code> interface is presented below:</p>
       
       <pre class="prettyprint source">package ch.qos.logback.core.rolling;  
    
    import ch.qos.logback.core.FileAppender;
    import ch.qos.logback.core.spi.LifeCycle;
    
    public interface RollingPolicy extends LifeCycle {
    
      <b>public void rollover() throws RolloverFailure;</b>
      public String getActiveFileName();
      public CompressionMode getCompressionMode();
      public void setParent(FileAppender appender);
    }</pre>
    
       <p>The <code>rollover</code> method accomplishes the work involved
       in archiving the current log file.  The
       <code>getActiveFileName()</code> method is called to compute the
       file name of the current log file (where live logs are written
       to). As indicated by <code>getCompressionMode</code> method a
       RollingPolicy is also responsible for determining the compression
       mode. Lastly, a <code>RollingPolicy</code> is given a reference to
       its parent via the <code>setParent</code> method.
       </p>
    
       <!-- =================
            ================= -->
    
    	
       <h4 class="doAnchor"
       name="TimeBasedRollingPolicy">TimeBasedRollingPolicy
       </h4>
    
       <p><a
       href="../xref/ch/qos/logback/core/rolling/TimeBasedRollingPolicy.html">
       <code>TimeBasedRollingPolicy</code></a> is possibly the most
       popular rolling policy. It defines a rollover policy based on time,
       for example by day or by month.
       <code>TimeBasedRollingPolicy</code> assumes the responsibility for
       rollover as well as for the triggering of said rollover. Indeed,
       <code>TimeBasedTriggeringPolicy</code> implements <em>both</em>
       <code>RollingPolicy</code> and <code>TriggeringPolicy</code>
       interfaces.
       </p>
    
       <p><code>TimeBasedRollingPolicy</code>'s configuration takes one
       mandatory <span class="prop">fileNamePattern</span> property and
       several optional properties.
       </p>
    
       <table class="bodyTable striped">
         <tr>
           <th>Property Name</th>
           <th>Type</th>
           <th>Description</th>
         </tr>
         <tr>
           <td><span class="prop" container="tbrp">fileNamePattern</span></td>
           <td><code>String</code></td>
           <td>
             The mandatory <span class="prop">fileNamePattern</span>
             property defines the name of the rolled-over (archived) log
             files. Its value should consist of the name of the file, plus
             a suitably placed <em>%d</em> conversion specifier.  The
             <em>%d</em> conversion specifier may contain a date-and-time
             pattern as specified by the
             <code>java.text.SimpleDateFormat</code> class.  If the
             date-and-time pattern is omitted, then the default pattern
             <em>yyyy-MM-dd</em> is assumed. <b>The rollover period is
             inferred from the value of <span
             class="prop">fileNamePattern</span>.</b>
    
    
             <p>Note that the <span class="prop">file</span> property in
             <code>RollingFileAppender</code> (the parent of
             <code>TimeBasedRollingPolicy</code>) can be either set or
             omitted. By setting the <span class="prop">file</span>
             property of the containing <code>FileAppender</code>, you can
             decouple the location of the active log file and the location
             of the archived log files. The current logs will be always
             targeted at the file specified by the <span
             class="prop">file</span> property. It follows that the name
             of the currently active log file will not change over
             time. However, if you choose to omit the <span
             class="prop">file</span> property, then the active file
             will be computed anew for each period based on the value of
             <span class="prop">fileNamePattern</span>.  The examples
             below should clarify this point.
             </p>
    
             <p>The date-and-time pattern, as found within the accolades
             of %d{} follow java.text.SimpleDateFormat conventions. The
             forward slash '/' or backward slash '\' characters anywhere
             within the <span class="option">fileNamePattern</span>
             property or within the date-and-time pattern will be
             interpreted as directory separators.
             </p>
    
             <p>It is possible to specify multiple %d tokens but only one
             of which can be primary, i.e. used to infer the rollover
             period. All other tokens <em>must</em> be marked as auxiliary
             by passing the 'aux' parameter (see examples below).</p>
           </td>
         </tr>
         <tr>
           <td><span class="prop" container="tbrp">maxHistory</span></td>
           <td>int</td>
           <td>The optional <span class="prop">maxHistory</span>
           property controls the maximum number of archive files to keep,
           deleting older files. For example, if you specify monthly
           rollover, and set maxHistory to 6, then 6 months worth of
           archives files will be kept with files older than 6 months
           deleted. Note as old archived log files are removed, any
           folders which were created for the purpose of log file
           archiving will be removed as appropriate.
           </td>
         </tr>
    
         <tr >
           <td><span class="prop" container="tbrp">cleanHistoryOnStart</span></td>
           <td>boolean</td>
           <td>
             <p>If set to true, archive removal will be executed on
             appender start up. By default this property is set to
             false. </p>
    
             <p>Archive removal is normally performed during roll
             over. However, some applications may not live long enough for
             roll over to be triggered. It follows that for such
             short-lived applications archive removal may never get a
             chance to execute.  By setting <span
             class="prop">cleanHistoryOnStart</span> to true, archive
             removal is performed at appender start up.</p>
           </td>
         </tr>
       </table>
    
    
       <p>Here are a few <code>fileNamePattern</code> values with an
       explanation of their effects.</p>
    
      
       
       <table class="bodyTable striped">
         <tr>
           <th>
             <span class="prop">fileNamePattern</span>
           </th>
           <th>Rollover schedule</th>
           <th>Example</th>
         </tr>
         <tr>
           <td class="small">
             <em>/wombat/foo.%d</em>
           </td>
           <td>Daily rollover (at midnight). Due to the omission of the
           optional time and date pattern for the <em>%d</em> token
           specifier, the default pattern of <em>yyyy-MM-dd</em> is
           assumed, which corresponds to daily rollover.
           </td>
    
           <td>
             <p><span class="prop">file</span> property not set: During November
             23rd, 2006, logging output will go to the file
             <em>/wombat/foo.2006-11-23</em>.  At midnight and for the
             rest of the 24th, logging output will be directed to
             <em>/wombat/foo.2006-11-24</em>.
           </p>
    
             <p><span class="prop">file</span> property set to
             <em>/wombat/foo.txt</em>: During November 23rd, 2006, logging
             output will go to the file <em>/wombat/foo.txt</em>. At
             midnight, <em>foo.txt</em> will be renamed as
             <em>/wombat/foo.2006-11-23</em>. A new
             <em>/wombat/foo.txt</em> file will be created and for the
             rest of November 24th logging output will be directed to
             <em>foo.txt</em>.
           </p>
    
           </td>
         </tr>
         
    
         <tr>
           <td class="small">
             <em>/wombat/%d{yyyy/MM}/foo.txt</em>
           </td>
           <td>Rollover at the beginning of each month.</td>
           <td>
             <p><span class="prop">file</span> property not set: During
             the month of October 2006, logging output will go to
             <em>/wombat/2006/10/foo.txt</em>.  After midnight of October
             31st and for the rest of November, logging output will be
             directed to <em>/wombat/2006/11/foo.txt</em>.
             </p>
    
             <p><span class="prop">file</span> property set to
             <em>/wombat/foo.txt</em>: The active log file will always be
             <em>/wombat/foo.txt</em>. During the month of October 2006,
             logging output will go to <em>/wombat/foo.txt</em>. At
             midnight of October 31st, <em>/wombat/foo.txt</em> will be
             renamed as <em>/wombat/2006/10/foo.txt</em>. A new
             <em>/wombat/foo.txt</em> file will be created where logging
             output will go for the rest of November. At midnight of
             November 30th, <em>/wombat/foo.txt</em> will be renamed as
             <em>/wombat/2006/11/foo.txt</em> and so on.
             </p>
           </td>
         </tr>
         <tr>
           <td class="small">
             <em>/wombat/foo.%d{yyyy-ww}.log</em>
           </td>
           
           <td>Rollover at the first day of each week. Note that the first
           day of the week depends on the locale.</td>
           
           <td>Similar to previous cases, except that rollover will occur
           at the beginning of every new week.  
           </td>     
         </tr>	
         <tr>
           <td class="small">
             <em>/wombat/foo%d{yyyy-MM-dd_HH}.log</em>
           </td>
           <td>Rollover at the top of each hour.</td>
           <td>Similar to previous cases, except that rollover will occur
           at the top of every hour.
           </td>
         </tr>
         <tr>
           <td class="small">
             <em>/wombat/foo%d{yyyy-MM-dd_HH-mm}.log</em>
           </td>
           <td>Rollover at the beginning of every minute.</td>
           <td>Similar to previous cases, except that rollover will occur
           at the beginning of every minute.  
           </td>     
         </tr>
    
    
         <tr>
           <td class="small">
             <em>/foo/%d{yyyy-MM,<b>aux</b>}/%d.log</em>
           </td>
           <td>Rollover daily. Archives located under a folder contaning
           year and month.
           </td>
           <td>In this example, the first %d token is marked as
           <b>aux</b>iliary. The second %d token, with time and date
           pattern omitted, is then assumed to be primary. Thus, rollover
           will occur daily (default for %d) and the folder name will
           depend on the year and month. For example, during the month of
           November 2006, archived files will all placed under the
           /foo/2006-11/ folder, e.g <em>/foo/2006-11/2006-11-14.log</em>.
           </td>     
           
         </tr>
       </table>
       
       <p>Any forward or backward slash characters are interpreted as
       folder (directory) separators. Any required folder will be created
       as necessary. You can thus easily place your log files in separate
       folders.
       </p>
    
    
     	 <p>Just like <code>FixedWindowRollingPolicy</code>,
     	 <code>TimeBasedRollingPolicy</code> supports automatic file
     	 compression.  This feature is enabled if the value of the <span
     	 class="prop">fileNamePattern</span> option ends with <em>.gz</em>
     	 or <em>.zip</em>.
       </p>
    
       <table class="bodyTable striped">
         <tr class="a">
           <th><span class="prop">fileNamePattern</span></th>
           <th>Rollover schedule</th>
           <th>Example</th>
         </tr>
         <tr>
           <td><em>/wombat/foo.%d.gz</em></td>
           <td>Daily rollover (at midnight) with automatic GZIP compression of the 
           archived files.</td>
           <td>
             <p><span class="prop">file</span> property not set: During
             November 23rd, 2009, logging output will go to the file
             <em>/wombat/foo.2009-11-23</em>. However, at midnight that
             file will be compressed to become
             <em>/wombat/foo.2009-11-23.gz</em>.  For the 24th of November,
             logging output will be directed to
             <em>/wombat/folder/foo.2009-11-24</em> until it's rolled over
             at the beginning of the next day.
             </p>
             
             <p><span class="prop">file</span> property set to
             /wombat/foo.txt: During November 23rd, 2009, logging output
             will go to the file <em>/wombat/foo.txt</em>. At midnight that
             file will be compressed and renamed as
             <em>/wombat/foo.2009-11-23.gz</em>.  A new
             <em>/wombat/foo.txt</em> file will be created where logging
             output will go for the rest of November 24rd. At midnight
             November 24th, <em>/wombat/foo.txt</em> will be compressed and
             renamed as <em>/wombat/foo.2009-11-24.gz</em> and so on.
             </p>
           </td>
         </tr>
       </table>
       
       <p>The <span class="prop">fileNamePattern</span> serves a dual
       purpose. First, by studying the pattern, logback computes the
       requested rollover periodicity. Second, it computes each archived
       file's name. Note that it is possible for two different patterns to
       specify the same periodicity. The patterns <em>yyyy-MM</em> and
       <em>yyyy@MM</em> both specify monthly rollover, although the
       resulting archive files will carry different names.
       </p>
    
    	 <p>By setting the <span class="prop">file</span> property you can
    	 decouple the location of the active log file and the location of
    	 the archived log files. The logging output will be targeted into
    	 the file specified by the <span class="prop">file</span>
    	 property. It follows that the name of the active log file will not
    	 change over time. However, if you choose to omit the <span
    	 class="prop">file</span> property, then the active file will be
    	 computed anew for each period based on the value of <span
    	 class="prop">fileNamePattern</span>. By leaving the <span
    	 class="prop">file</span> option unset you can avoid file <a
    	 href="../codes.html#renamingError">renaming errors</a> which occur
    	 while there exist external file handles referencing log files during
    	 roll over.
       </p>
    	
       <p>The <span class="prop">maxHistory</span> property controls the
       maximum number of archive files to keep, deleting older files. For
       example, if you specify monthly rollover, and set <span
       class="prop">maxHistory</span> to 6, then 6 months worth of
       archives files will be kept with files older than 6 months
       deleted. Note as old archived log files are removed, any folders
       which were created for the purpose of log file archiving will be
       removed as appropriate.
       </p>
    
       <p>For various technical reasons, rollovers are not clock-driven
       but depend on the arrival of logging events. For example, on 8th of
       March 2002, assuming the <span
       class="prop">fileNamePattern</span> is set to <em>yyyy-MM-dd</em>
       (daily rollover), the arrival of the first event after midnight
       will trigger a rollover. If there are no logging events during, say
       23 minutes and 47 seconds after midnight, then rollover will
       actually occur at 00:23'47 AM on March 9th and not at 0:00 AM.
       Thus, depending on the arrival rate of events, rollovers might be
       triggered with some latency.  However, regardless of the delay, the
       rollover algorithm is known to be correct, in the sense that all
       logging events generated during a certain period will be output in
       the correct file delimiting that period.
       </p>
    	
       <p>Here is a sample configuration for
       <code>RollingFileAppender</code> in conjunction with a
       <code>TimeBasedRollingPolicy</code>.
       </p>
    	
       <p class="example">Example: Sample configuration of a
       <code>RollingFileAppender</code> using a
       <code>TimeBasedRollingPolicy</code>
       (logback-examples/src/main/java/chapters/appenders/conf/logback-RollingTimeBased.xml)</p>
    
       <span class="asGroovy" onclick="return asGroovy('logback-RollingTimeBased');">View as .groovy</span>
       <pre id="logback-RollingTimeBased" class="prettyprint source">&lt;configuration>
      &lt;appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        &lt;file>logFile.log&lt;/file>
        <b>&lt;rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
          &lt;!-- daily rollover -->
          &lt;fileNamePattern>logFile.%d{yyyy-MM-dd}.log&lt;/fileNamePattern>
    
          &lt;!-- keep 30 days' worth of history -->
          &lt;maxHistory>30&lt;/maxHistory>
        &lt;/rollingPolicy></b>
    
        &lt;encoder>
          &lt;pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender> 
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="FILE" />
      &lt;/root>
    &lt;/configuration></pre>
    
        <p>The next configuration sample illustrates the use of
        <code>RollingFileAppender</code> associated with
        <code>TimeBasedRollingPolicy</code> in <span class="prop">prudent</span>
        mode.
        </p>
    
       <p class="example">Example: Sample configuration of a
       <code>RollingFileAppender</code> using a
       <code>TimeBasedRollingPolicy</code>
       (logback-examples/src/main/java/chapters/appenders/conf/logback-PrudentTimeBasedRolling.xml)</p>
    
      <span class="asGroovy" onclick="return asGroovy('logback-PrudentTimeBasedRolling');">View as .groovy</span>
      <pre id="logback-PrudentTimeBasedRolling" class="prettyprint source">&lt;configuration>
      &lt;appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <b>&lt;!-- Support multiple-JVM writing to the same log file --></b>
        <b>&lt;prudent>true&lt;/prudent></b>
        &lt;rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
          &lt;fileNamePattern>logFile.%d{yyyy-MM-dd}.log&lt;/fileNamePattern>
          &lt;maxHistory>30&lt;/maxHistory> 
        &lt;/rollingPolicy>
    
        &lt;encoder>
          &lt;pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender> 
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="FILE" />
      &lt;/root>
    &lt;/configuration></pre>
    
    
       <h4 class="doAnchor"
       name="FixedWindowRollingPolicy">FixedWindowRollingPolicy
       </h4>
    
       <p>When rolling over, <a
       href="../xref/ch/qos/logback/core/rolling/FixedWindowRollingPolicy.html">
       <code>FixedWindowRollingPolicy</code></a> renames files according
       to a fixed window algorithm as described below.
       </p>
    
       <p>The <span class="prop">fileNamePattern</span> option
       represents the file name pattern for the archived (rolled over) log
       files.  This option is required and must include an integer token
       <em>%i</em> somewhere within the pattern.
       </p>
    	
       <p>Here are the available properties for
       <code>FixedWindowRollingPolicy</code>
       </p>
    	
       <table class="bodyTable striped">
         <tr>
           <th>Property Name</th>
           <th>Type</th>
           <th>Description</th>
         </tr>
         <tr>
           <td><span class="prop" container="fwrp">minIndex</span></td>
           <td><code>int</code></td>
           <td>
             <p>This option represents the lower bound for the window's
             index.
             </p>
           </td>
         </tr>
         <tr>
           <td><span class="prop" container="fwrp">maxIndex</span></td>
           <td><code>int</code></td>
           <td>
             <p>This option represents the upper bound for the window's
             index.
             </p>
           </td>
         </tr>
         <tr>
           <td><span class="prop" container="fwrp">fileNamePattern</span></td>
           <td><code>String</code></td>
           <td>
             <p>This option represents the pattern that will be followed
             by the <code>FixedWindowRollingPolicy</code> when renaming
             the log files. It must contain the string <em>%i</em>, which
             will indicate the position where the value of the current
             window index will be inserted.
             </p>
             <p>For example, using <em>MyLogFile%i.log</em> associated
             with minimum and maximum values of <em>1</em> and <em>3</em>
             will produce archive files named <em>MyLogFile1.log</em>,
             <em>MyLogFile2.log</em> and <em>MyLogFile3.log</em>.
             </p>
             <p>Note that file compression is also specified via this
             property. For example, <span
             class="prop">fileNamePattern</span> set to
             <em>MyLogFile%i.log.zip</em> means that archived files must be
             compressed using the <em>zip</em> format; <em>gz</em> format
             is also supported.
             </p>
           </td>
         </tr>			
       </table>
       
       <p>Given that the fixed window rolling policy requires as many file
       renaming operations as the window size, large window sizes are
       strongly discouraged. When large values are specified by the user,
       the current implementation will automatically reduce the window
       size to 12.
       </p>
    
       <p>Let us go over a more concrete example of the fixed window
       rollover policy. Suppose that <span class="prop">minIndex</span>
       is set to <em>1</em>, <span class="prop">maxIndex</span> set to
       <em>3</em>, <span class="prop">fileNamePattern</span> property
       set to <em>foo%i.log</em>, and that <span
       class="prop">fileNamePattern</span> property is set to
       <em>foo.log</em>.
       </p>
    	
       <table class="bodyTable striped">
         <tr>
           <th>Number of rollovers</th>
           <th>Active output target</th>
           <th>Archived log files</th>
           <th>Description</th>
         </tr>
    		<tr>
    			<td>0</td>
    			<td>foo.log</td>
    			<td>-</td>
    			<td>No rollover has happened yet, logback logs into the initial
    			file.
    			</td>
         </tr>		
         <tr>
           <td>1</td>
           <td>foo.log</td>
           <td>foo1.log</td>
           <td>First rollover. <em>foo.log</em> is renamed as
           <em>foo1.log</em>. A new <em>foo.log</em> file is created and
           becomes the active output target.
           </td>
         </tr>
         <tr>
           <td>2</td>
           <td>foo.log</td>
           <td>foo1.log, foo2.log</td>
           <td>Second rollover. <em>foo1.log</em> is renamed as
           <em>foo2.log</em>.  <em>foo.log</em> is renamed as
           <em>foo1.log</em>. A new <em>foo.log</em> file is created and
           becomes the active output target.
           </td>
         </tr>
         <tr>
           <td>3</td>
           <td>foo.log</td>
           <td>foo1.log, foo2.log, foo3.log</td>
           <td>Third rollover.  <em>foo2.log</em> is renamed as
           <em>foo3.log</em>. <em>foo1.log</em> is renamed as
           <em>foo2.log</em>.  <em>foo.log</em> is renamed as
           <em>foo1.log</em>. A new <em>foo.log</em> file is created and
           becomes the active output target.
           </td>
         </tr>
         <tr>
           <td>4</td>
           <td>foo.log</td>
           <td>foo1.log, foo2.log, foo3.log</td>
           <td>In this and subsequent rounds, the rollover begins by
           deleting <em>foo3.log</em>. Other files are renamed by
           incrementing their index as shown in previous steps. In this and
           subsequent rollovers, there will be three archive logs and one
           active log file.
           </td>
         </tr>
       </table>
    	
       <p>The configuration file below gives an example of configuring
       <code>RollingFileAppender</code> and
       <code>FixedWindowRollingPolicy</code>. Note that the <span
       class="prop">File</span> option is mandatory even if it contains
       some of the same information as conveyed with the <span
       class="prop">fileNamePattern</span> option.
       </p>
    	
       <p class="example">Example: Sample configuration of a <code>RollingFileAppender</code> using a 
       <code>FixedWindowRollingPolicy</code> (logback-examples/src/main/java/chapters/appenders/conf/logback-RollingFixedWindow.xml)</p>
    
       <span class="asGroovy" onclick="return asGroovy('logback-RollingFixedWindow');">View as .groovy</span>
       <pre id="logback-RollingFixedWindow" class="prettyprint source">&lt;configuration>
      &lt;appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <b>&lt;file>test.log&lt;/file></b>
    
        <b>&lt;rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
          &lt;fileNamePattern>tests.%i.log.zip&lt;/fileNamePattern>
          &lt;minIndex>1&lt;/minIndex>
          &lt;maxIndex>3&lt;/maxIndex>
        &lt;/rollingPolicy></b>
    
        &lt;triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
          &lt;maxFileSize>5MB&lt;/maxFileSize>
        &lt;/triggeringPolicy>
        &lt;encoder>
          &lt;pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    	
      &lt;root level="DEBUG">
        &lt;appender-ref ref="FILE" />
      &lt;/root>
    &lt;/configuration></pre>
    
    
        <h3 class="doAnchor" name="SizeAndTimeBasedFNATP">Size <b>and</b>
        time based archiving
        </h3>
    
        <p>Sometimes you may wish to archive files essentially by date but
        at the same time limit the size of each log file, in particular if
        post-processing tools impose size limits on the log files. In
        order to address this requirement, logback ships with a
        sub-component for <code>TimeBasedRollingPolicy</code> called
        <code>SizeAndTimeBasedFNATP</code>, where FNATP stands for File
        Naming And Triggering Policy.</p>
    
        <p>Here is a sample configuration file demonstrating time and size
        based log file archiving.</p>
        
      <p class="example">Example: Sample configuration for
      <code>SizeAndTimeBasedFNATP</code> 
      (logback-examples/src/main/java/chapters/appenders/conf/logback-sizeAndTime.xml)</p>
    
      <span class="asGroovy" onclick="return asGroovy('logback-sizeAndTime');">View as .groovy</span>
      <pre id="logback-sizeAndTime" class="prettyprint source">&lt;configuration>
      &lt;appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
        &lt;file>mylog.txt&lt;/file>
        &lt;rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
          &lt;!-- rollover daily -->
          &lt;fileNamePattern><b>mylog-%d{yyyy-MM-dd}.<span class="big">%i</span>.txt</b>&lt;/fileNamePattern>
          <b>&lt;timeBasedFileNamingAndTriggeringPolicy</b>
                <b>class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"></b>
            &lt;!-- or whenever the file size reaches 100MB -->
            <b>&lt;maxFileSize>100MB&lt;/maxFileSize></b>
          <b>&lt;/timeBasedFileNamingAndTriggeringPolicy></b>
        &lt;/rollingPolicy>
        &lt;encoder>
          &lt;pattern>%msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="ROLLING" />
      &lt;/root>
    
    &lt;/configuration></pre>
        
        <p>Note the "%i" conversion token in addition to "%d". Each time
        the current log file reaches <span
        class="prop">maxFileSize</span> before the current time period
        ends, it will be archived with an increasing index, starting at
        0.</p>
    
        <p>Size and time based archiving supports deletion of old archive
        files. You need to specify the number of periods to preserve with
        the <span class="prop">maxHistory</span> property. When your
        application is stopped and restarted, logging will continue at the
        correct location, i.e. at the largest index number for the current
        period.
        </p>
    
    		<h2>
          <a name="TriggeringPolicy" href="#TriggeringPolicy">Overview of
          triggering policies</a>
        </h2>
    		
    		<p><a
    		href="../xref/ch/qos/logback/core/rolling/TriggeringPolicy.html"><code>TriggeringPolicy</code></a>
    		implementations are responsible for instructing the
    		<code>RollingFileAppender</code> when to rollover.</p>
    		
    		<p>The <code>TriggeringPolicy</code> interface contains only one
    		method.</p>
    	
        <pre class="prettyprint source">package ch.qos.logback.core.rolling;
    
    import java.io.File;
    import ch.qos.logback.core.spi.LifeCycle;
    
    public interface TriggeringPolicy&lt;E&gt; extends LifeCycle {
    
      <b>public boolean isTriggeringEvent(final File activeFile, final &lt;E&gt; event);</b>
    }</pre>
    
    		<p>The <code>isTriggeringEvent()</code> method takes as parameters
    		the active file and the logging event currently being
    		processed. The concrete implementation determines whether the
    		rollover should occur or not, based on these parameters.
    		</p>
    
        <p>The most widely-used triggering policy, namely
        <code>TimeBasedRollingPolicy</code> which also doubles as a
        rolling policy, was already <a
        href="#TimeBasedRollingPolicy">discussed earlier</a> along with
        other rolling policies. </p>
    		
    		<h4><a name="SizeBasedTriggeringPolicy"
    		href="#SizeBasedTriggeringPolicy">SizeBasedTriggeringPolicy</a></h4>
    
    		<p><a
    		href="../xref/ch/qos/logback/core/rolling/SizeBasedTriggeringPolicy.html">
    		<code>SizeBasedTriggeringPolicy</code></a> looks at the size of the
    		currently active file. If it grows larger than the specified size,
    		it will signal the owning <code>RollingFileAppender</code> to
    		trigger the rollover of the existing active file.
    		</p>
    
    		<p><code>SizeBasedTriggeringPolicy</code> accepts only one
    		parameter, namely <span class="prop">maxFileSize</span>, with a
    		default value of 10 MB.
    		</p>
    
    		<p>The <span class="prop">maxFileSize</span> option can be
    		specified in bytes, kilobytes, megabytes or gigabytes by suffixing
    		a numeric value with <em>KB</em>, <em>MB</em> and respectively
    		<em>GB</em>. For example, <em>5000000</em>, <em>5000KB</em>,
    		<em>5MB</em> and <em>2GB</em> are all valid values, with the first
    		three being equivalent.
    		</p>
    
    		<p>Here is a sample configuration with a
    		<code>RollingFileAppender</code> in conjunction with
    		<code>SizeBasedTriggeringPolicy</code> triggering rollover when
    		the log file reaches 5MB in size.
    		</p>
    
        <p class="example">Example: Sample configuration of a
        <code>RollingFileAppender</code> using a
        <code>SizeBasedTriggeringPolicy</code>
        (logback-examples/src/main/java/chapters/appenders/conf/logback-RollingSizeBased.xml)</p>
    
        <span class="asGroovy" onclick="return asGroovy('logback-RollingSizeBased');">View as .groovy</span>
        <pre id="logback-RollingSizeBased" class="prettyprint source">&lt;configuration>
      &lt;appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        &lt;file>test.log&lt;/file>
        &lt;rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
          &lt;fileNamePattern>test.%i.log.zip&lt;/fileNamePattern>
          &lt;minIndex>1&lt;/minIndex>
          &lt;maxIndex>3&lt;/maxIndex>
        &lt;/rollingPolicy>
    
        <b>&lt;triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
          &lt;maxFileSize>5MB&lt;/maxFileSize>
        &lt;/triggeringPolicy></b>
        &lt;encoder>
          &lt;pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    	
      &lt;root level="DEBUG">
        &lt;appender-ref ref="FILE" />
      &lt;/root>
    &lt;/configuration></pre>
    
    	
        <!-- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx -->
    		<a name="Classic"></a>
    		<h2>Logback Classic</h2>
    				
        
    		<p>While logging events are generic in logback-core, within
    		logback-classic they are always instances of
    		<code>ILoggingEvent</code>. Logback-classic is nothing more than a
    		specialized processing pipeline handling instances of
    		<code>ILoggingEvent</code>.
    
        </p>
    
    		<h3 class="doAnchor" name="SocketAppender">SocketAppender and
    		SSLSocketAppender
        </h3>
    		
    		<p>The appenders covered thus far are only able to log to local
    		resources.  In contrast, the <a
    		href="../xref/ch/qos/logback/classic/net/SocketAppender.html">
    		<code>SocketAppender</code></a> is designed to log to a remote
    		entity by transmitting serialized <code>ILoggingEvent</code>
    		instances over the wire.  When using <code>SocketAppender</code>
    		logging events on the wire are sent in the clear.  However, when
    		using  <a href="../xref/ch/qos/logback/classic/net/SSLSocketAppender.html">
    		<code>SSLSocketAppender</code></a>, logging events are delivered over
    		a secure channel.</p>
    
        <p>
    		The actual type of the serialized event
    		is <a
    		href="../xref/ch/qos/logback/classic/spi/LoggingEventVO.html"><code>LoggingEventVO</code></a>
    		which implements the <code>ILoggingEvent</code>
    		interface. Nevertheless, remote logging is non-intrusive as far as
    		the logging event is concerned.  On the receiving end after
    		deserialization, the event can be logged as if it were generated
    		locally. Multiple <code>SocketAppender</code> instances running on
    		different machines can direct their logging output to a central
    		log server whose format is fixed.  <code>SocketAppender</code>
    		does not take an associated layout because it sends serialized
    		events to a remote server.  <code>SocketAppender</code> operates
    		above the <em>Transmission Control Protocol (TCP)</em> layer which
    		provides a reliable, sequenced, flow-controlled end-to-end octet
    		stream.  Consequently, if the remote server is reachable, then log
    		events will eventually arrive there. Otherwise, if the remote
    		server is down or unreachable, the logging events will simply be
    		dropped. If and when the server comes back up, then event
    		transmission will be resumed transparently.  This transparent
    		reconnection is performed by a connector thread which periodically
    		attempts to connect to the server.
    		</p>
    		
    		<p>Logging events are automatically buffered by the native TCP
    		implementation.  This means that if the link to server is slow but
    		still faster than the rate of event production by the client, the
    		client will not be affected by the slow network
    		connection. However, if the network connection is slower than the
    		rate of event production, then the client can only progress at the
    		network rate. In particular, in the extreme case where the network
    		link to the server is down, the client will be eventually blocked.
    		Alternatively, if the network link is up, but the server is down,
    		the client will not be blocked, although the log events will be
    		lost due to server unavailability.
    		</p>
    		
    		<p>Even if a <code>SocketAppender</code> is no longer attached to
    		any logger, it will not be garbage collected in the presence of a
    		connector thread.  A connector thread exists only if the
    		connection to the server is down.  To avoid this garbage
    		collection problem, you should close the
    		<code>SocketAppender</code> explicitly. Long lived applications
    		which create/destroy many <code>SocketAppender</code> instances
    		should be aware of this garbage collection problem. Most other
    		applications can safely ignore it.  If the JVM hosting the
    		<code>SocketAppender</code> exits before the
    		<code>SocketAppender</code> is closed, either explicitly or
    		subsequent to garbage collection, then there might be
    		untransmitted data in the pipe which may be lost. This is a common
    		problem on Windows based systems.  To avoid lost data, it is
    		usually sufficient to <code>close()</code> the
    		<code>SocketAppender</code> either explicitly or by calling the
    		<code>LoggerContext</code>'s <code>stop()</code>
    		method before exiting the application.
    		</p>
    		
    		<p>The remote server is identified by the <span
    		class="prop">remoteHost</span> and <span
    		class="prop">port</span> properties.
    		<code>SocketAppender</code> properties are listed in the following
    		table.  <code>SSLSocketAppender</code> supports many additional
    		configuration properties, which are detailed in the section 
    		entitled <a href="usingSSL.html">Using SSL</a>.
    		</p>
    
        <table class="bodyTable striped">
          <tr>
    			<th>Property Name</th>
    			<th>Type</th>
    			<th>Description</th>
          </tr>
          <tr>
            <td><span class="prop" container="socket">includeCallerData</span></td>
            <td><code>boolean</code></td>
            <td>
              <p>
                The <span class="prop" container="socket">includeCallerData</span> option takes a boolean value. 
                If true, the caller data will be available to the remote host. 
                By default no caller data is sent to the server.
              </p>
            </td>
          </tr>
          <tr>
            <td><span class="prop" container="socket">port</span></td>
            <td><code>int</code></td>
            <td>
              <p>
                The port number of the remote server.
              </p>
            </td>
          </tr>	
          <tr>
            <td><span class="prop" container="socket">reconnectionDelay</span></td>
            <td><code>int</code></td>
            <td>
              The <span class="prop">reconnectionDelay</span> option takes a 
              positive integer representing the number of milliseconds to wait between 
              each failed connection attempt to the server. 
              The default value of this option is 30'000 which corresponds to 30 seconds. 
              Setting this option to zero turns off reconnection capability. 
              Note that in case of successful connection to the server, there will be no 
              connector thread present.
            </td>
          </tr>
          <tr>
            <td><span class="prop" container="socket">remoteHost</span></td>
            <td><code>String</code></td>
            <td>
              The host name of the server.
            </td>
          </tr>		
          <tr>
            <td><span class="prop" container="socket">ssl</span></td>
            <td><code>SSLConfiguration</code></td>
            <td>Supported only for <code>SSLSocketAppender</code>, this
                property provides the SSL configuration that will be used by
                the appender, as described in <a href="usingSSL.html">Using SSL</a>.
            </td>
          </tr>
        </table>
        
        <h4>Logging Server Options</h4>
        <p>The standard Logback Classic distribution includes two options
        for servers that can be used to receive logging events from
        <code>SocketAppender</code> or <code>SSLSocketAppender</code>.</p>
        <ul>
          <li><code>ServerSocketReceiver</code> and its SSL-enabled 
          counterpart <code>SSLServerSocketReceiver</code> are receiver
          components which can be configured in the <em>logback.xml</em> 
          configuration file of an application in order receive events
          from a remote socket appender.  See <a href="receivers.html">
          Receivers</a> for configuration details and usage examples.
          </li>
          <li><code>SimpleSocketServer</code> and its SSL-enabled counterpart
          <code>SimpleSSLSocketServer</code> both offer an 
          easy-to-use standalone Java application that is designed to
          be configured and run from your shell's command line interface.
          These applications simply wait for logging events from 
          <code>SocketAppender</code> or <code>SSLSocketAppender</code>
          clients.  Each received event is logged according to local server 
          policy.  Usage examples are given below.
          </li>
        </ul>
        
        <h4><a name="simpleSocketServer"></a>Using SimpleSocketServer</h4>
        <p>
        The <code>SimpleSocketServer</code> application takes two command-line
        arguments: <em>port</em> and <em>configFile</em>; 
        where <em>port</em> is the port to listen on and
        <em>configFile</em> is a configuration script in XML format.
        </p>
    	
        <p>
          Assuming you are in the <em>logback-examples/</em> directory, 
          start <code>SimpleSocketServer</code> with the following command:
        </p>
        
        <p class="source">java ch.qos.logback.classic.net.SimpleSocketServer 6000 \
      src/main/java/chapters/appenders/socket/server1.xml</p>
    
        <p>where 6000 is the port number to listen on and
        <em>server1.xml</em> is a configuration script that adds a
        <code>ConsoleAppender</code> and a
        <code>RollingFileAppender</code> to the root logger.  After you
        have started <code>SimpleSocketServer</code>, you can send it log
        events from multiple clients using <code>SocketAppender</code>.
        The examples associated with this manual include two such clients:
        <code>chapters.appenders.SocketClient1</code> and
        <code>chapters.appenders.SocketClient2</code> Both clients wait for the user
        to type a line of text on the console.  The text is encapsulated
        in a logging event of level debug and then sent to the remote
        server. The two clients differ in the configuration of the
        <code>SocketAppender</code>. <code>SocketClient1</code> configures
        the appender programmatically while <code>SocketClient2</code>
        requires a configuration file.
        </p>
    	
        <p>Assuming <code>SimpleSocketServer</code> is running on the
        local host, you connect to it with the following command:
        </p>
    	
        <p class="source">java chapters.appenders.socket.SocketClient1 localhost 6000</p>
    
    		<p>Each line that you type should appear on the console of the
    		<code>SimpleSocketServer</code> launched in the previous step. If
    		you stop and restart the <code>SimpleSocketServer</code> the
    		client will transparently reconnect to the new server instance,
    		although the events generated while disconnected will be simply
    		(and irrevocably) lost.
    		</p>
    
    		<p>
    			Unlike
    			<code>SocketClient1</code>, the sample application
    			<code>SocketClient2</code> does not configure logback by itself. 
    			It requires a configuration file in XML format. 
    			The configuration file <em>client1.xml</em>
    			shown below creates a <code>SocketAppender</code>
    			and attaches it to the root logger.
    		</p>
    
    		<p class="example">Example: SocketAppender configuration
    		(logback-examples/src/main/java/chapters/appenders/socket/client1.xml)</p>
        <span class="asGroovy" onclick="return asGroovy('client1');">View as .groovy</span>
    <pre id="client1" class="prettyprint source">&lt;configuration>
    	  
      &lt;appender name="SOCKET" class="ch.qos.logback.classic.net.SocketAppender">
        &lt;remoteHost>${host}&lt;/remoteHost>
        &lt;port>${port}&lt;/port>
        &lt;reconnectionDelay>10000&lt;/reconnectionDelay>
        &lt;includeCallerData>${includeCallerData}&lt;/includeCallerData>
      &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="SOCKET" />
      &lt;/root>  
    
    &lt;/configuration></pre>
    	
    		<p>
    			Note that in the above configuration scripts the values for the 
    			<span class="prop">remoteHost</span>, <span class="prop">port</span> and
    			<span class="prop">includeCallerData</span> properties
    			are not given directly but as substituted variable keys. The values for the variables 
    			can be specified as system properties: 
    		</p>
    	
        <p class="source">java -Dhost=localhost -Dport=6000 -DincludeCallerData=false \
      chapters.appenders.socket.SocketClient2 src/main/java/chapters/appenders/socket/client1.xml</p>
    
    		<p>This command should give similar results to the previous
    			<code>SocketClient1</code>
    			example.
    		</p>
    		
    		<p>Allow us to repeat for emphasis that serialization of logging
    		events is not intrusive. A deserialized event carries the same
    		information as any other logging event. It can be manipulated as
    		if it were generated locally; except that serialized logging
    		events by default do not include caller data. Here is an example
    		to illustrate the point. First, start
    		<code>SimpleSocketServer</code> with the following command:
    		</p>
    
        <p class="source"> java ch.qos.logback.classic.net.SimpleSocketServer 6000 \
      src/main/java/chapters/appenders/socket/server2.xml</p>
    
       <p>The configuration file <em>server2.xml</em> creates a
       <code>ConsoleAppender</code> whose layout outputs the caller's file
       name and line number along with other information. If you run
       <code>SocketClient2</code> with the configuration file
       <em>client1.xml</em> as previously, you will notice that the output
       on the server side will contain two question marks between
       parentheses instead of the file name and the line number of the
       caller:
    		</p>
    
        <p class="source">2006-11-06 17:37:30,968 DEBUG [Thread-0] [?:?] chapters.appenders.socket.SocketClient2 - Hi</p>
    
    		<p>The outcome can be easily changed by instructing the
    		<code>SocketAppender</code> to include caller data by setting the
    		<span class="prop">includeCallerData</span> option to
    		true. Using the following command will do the trick:
    		</p>
    
       <pre class="source">java -Dhost=localhost -Dport=6000 -DincludeCallerData=true \
      chapters.appenders.socket.SocketClient2 src/main/java/chapters/appenders/socket/client1.xml</pre>
    
    		<p>As deserialized events can be handled in the same way as
    		locally generated events, they even can be sent to a second server
    		for further treatment.  As an exercise, you may wish to setup two
    		servers where the first server tunnels the events it receives from
    		its clients to a second server.
    		</p>
    		
    		<h4><a name="simpleSSLSocketServer"></a>Using SimpleSSLSocketServer</h4>
    
        <p>The <code>SimpleSSLSocketServer</code> requires the same
        <em>port</em> and <em>configFile</em> command-line arguments used
        by <code>SimpleSocketServer</code>.  Additionally, you must provide
        the location and password for your logging server's X.509 credential
        using system properties specified on the command line.
        </p>
        
        <p>Assuming you are in the <em>logback-examples/</em> directory, 
        start <code>SimpleSSLSocketServer</code> with the following command:
        </p>
    
        <p class="source">java -Djavax.net.ssl.keyStore=src/main/java/chapters/appenders/socket/ssl/keystore.jks \
        -Djavax.net.ssl.keyStorePassword=changeit \
        ch.qos.logback.classic.net.SimpleSSLSocketServer 6000 \
        src/main/java/chapters/appenders/socket/ssl/server.xml
        </p>
    	
        <p>This example runs <code>SimpleSSLSocketServer</code> using an
        X.509 credential that is suitable for testing and experimentation, 
        only.  <strong>Before using <code>SimpleSSLSocketServer</code> in a
        production setting you should obtain an appropriate X.509 credential
        to identify your logging server</strong>.  See 
        <a href="usingSSL.html">Using SSL</a> for more details.
        </p>
        
        <p>Because the server configuration has <code>debug="true"</code>
        specified on the root element, you'll will see in the server's
        startup logging the SSL configuration that will be used.  This is
        useful in validating that local security policies are properly
        implemented.
        </p>
    
        <p>With <code>SimpleSSLSocketServer</code> running, you can connect
        to the server using an <code>SSLSocketAppender</code>.  The following
        example shows the appender configuration needed:
        </p>
          
       	<p class="example">Example: SSLSocketAppender configuration
    		(logback-examples/src/main/java/chapters/appenders/socket/ssl/client.xml)</p>
        <span class="asGroovy" onclick="return asGroovy('sslclient');">View as .groovy</span>
    <pre id="sslclient" class="prettyprint source">&lt;configuration debug="true">
    	  
      &lt;appender name="SOCKET" class="ch.qos.logback.classic.net.SSLSocketAppender">
        &lt;remoteHost>${host}&lt;/remoteHost>
        &lt;port>${port}&lt;/port>
        &lt;reconnectionDelay>10000&lt;/reconnectionDelay>
        &lt;ssl>
          &lt;trustStore>
            &lt;location>${truststore}&lt;/location>
            &lt;password>${password}&lt;/password>
          &lt;/trustStore>
        &lt;/ssl>
      &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="SOCKET" />
      &lt;/root>  
    
    &lt;/configuration></pre>
    	  
    	  <p>Note that, just as in the previous example, the values for
    	  <span class="prop">remoteHost</span>, <span class="prop">port</span>
    	  are specified using substituted variable keys.  Additionally, note
    	  the presence of the <span class="prop">ssl</span> property and its
    	  nested <span class="prop">trustStore</span> property, which specifies
    	  the location and password of a trust store using substituted
    	  variables.  This configuration is necessary because our example
    	  server is using a self-signed certificate.  See 
    	  <a href="usingSSL.html">Using SSL</a> for more information on 
    	  SSL configuration properties for <code>SSLSocketAppender</code>.
    	  </p>
    
        <p>We can run a client application using this configuration by
        specifying the substitution variable values on the command line as
        system properties:
        </p>
        	  	
        <p class="source">java -Dhost=localhost -Dport=6000 \
        -Dtruststore=file:src/main/java/chapters/appenders/socket/ssl/truststore.jks \
        -Dpassword=changeit \
        chapters.appenders.socket.SocketClient2 src/main/java/chapters/appenders/socket/ssl/client.xml
     	  </p>
     	  
     	  <p>As in the previous examples, you can type in a message when 
     	  prompted by the client application, and the message will be delivered
     	  to the logging server (now over a secure channel) where it will be
     	  displayed on the console.
     	  </p>
     	  
     	  <p>Note that the <em>truststore</em> property given on the command
     	  line specifies a file URL that identifies the location of the
     	  trust store.  You may also use a classpath URL as described in <a
     	  href="usingSSL.html">Using SSL</a>.
     	  </p>
     
        <p>As we saw previously at server startup, because the client
        configuration has <code>debug="true"</code> specified on the root
        element, the client's startup logging includes the details of the
        SSL configuration as aid to auditing local policy conformance.
        </p>
     	  
     	  
        <h3 class="doAnchor" name="serverSocketAppender">
          ServerSocketAppender and SSLServerSocketAppender</h3>
        
        <p>The <code>SocketAppender</code> component (and its SSL-enabled
        counterpart) discussed previously are designed to allow an
        application to connect to a remote logging server over the network
        for the purpose of delivering logging events to the server.  In
        some situations, it may be inconvenient or infeasible to have an
        application initiate a connection to a remote logging server.  For
        these situations, Logback offers <a
        href="../xref/ch/qos/logback/classic/net/server/ServerSocketAppender">
        <code>ServerSocketAppender</code></a>.
        </p>
        
        <p>Instead of initiating a connection to a remote logging server, 
        <code>ServerSocketAppender</code> passively listens on a TCP socket
        awaiting incoming connections from remote clients.  Logging events
        that are delivered to the appender are distributed to each connected
        client.  Logging events that occur when no client is connected are
        <em>summarily discarded</em>.
        </p>
        
        <p>In addition to the basic <code>ServerSocketAppender</code>, Logback
        offers <a href="../xref/ch/qos/logback/classic/net/server/SSLServerSocketAppender">
        <code>SSLServerSocketAppender</code></a>, which distributes logging events
        to each connected client using a secure, encrypted channel.  Moreover, the
        SSL-enabled appender fully supports mutual certificate-based authentication,
        which can be used to ensure that only authorized clients can connect to
        the appender to receive logging events.   
        </p>
       
        <p>The approach to encoding logging events for transmission on the wire 
        is identical to that used by <code>SocketAppender</code>; each event is 
        a serialized instance of <code>ILoggingEvent</code>.  Only the direction 
        of connection initiation is reversed.  While <code>SocketAppender</code> 
        acts as the active peer in establishing the connection to a logging server,
        <code>ServerSocketAppender</code> is passive; it listens for
        incoming connections from clients.</p>  
    
        <p>The <code>ServerSocketAppender</code> subtypes are intended to be
        used exclusively with Logback <em>receiver</em> components.  See
        <a href="receivers.html">Receivers</a> for additional information on
        this component type.</p>
        
        <p>The following configuration properties are supported by 
        <code>ServerSocketAppender</code>:</p>
        
        <table class="bodyTable striped">
          <tr>
          <th>Property Name</th>
          <th>Type</th>
          <th>Description</th>
          </tr>
          <tr>
            <td><span class="prop" container="serverSocketAppender">address</span></td>
            <td><code>String</code></td>
            <td>The local network interface address on which the appender
            will listen.  If this property is not specified, the appender
            will listen on all network interfaces.</td>
          </tr>
          <tr>
            <td><span class="prop" container="serverSocketAppender">includeCallerData</span></td>
            <td><code>boolean</code></td>
            <td>
              <p>
                If true, the caller data will be available to the remote host. 
                By default no caller data is sent to the client.
              </p>
            </td>
          </tr>
          <tr>
            <td><span class="prop" container="serverSocketAppender">port</span></td>
            <td><code>int</code></td>
            <td>
              <p>
                The port number on which the appender will listen.
              </p>
            </td>
          </tr> 
          <tr>
            <td><span class="prop" container="serverSocketAppender">ssl</span></td>
            <td><code>SSLConfiguration</code></td>
            <td>Supported only for <code>SSLServerSocketAppender</code>, this
                property provides the SSL configuration that will be used by
                the appender, as described in <a href="usingSSL.html">Using SSL</a>.
            </td>
          </tr>
        </table>
        
        <p>The following example illustrates a configuration that uses
          <code>ServerSocketAppender</code>:
        </p>
    
        <p class="example">Example: Basic ServerSocketAppender Configuration
        (logback-examples/src/main/java/chapters/appenders/socket/server4.xml)</p>
    <pre id="SocketReceiver" class="prettyprint source">&lt;configuration debug="true">
      &lt;appender name="SERVER" 
        class="ch.qos.logback.classic.net.server.ServerSocketAppender">
        &lt;port>${port}&lt;/port>
        &lt;includeCallerData>${includeCallerData}&lt;/includeCallerData>
      &lt;/appender>
    
      &lt;root level="debug">
        &lt;appender-ref ref="SERVER" />
      &lt;/root>  
    
    &lt;/configuration>
    </pre>
        <p>Note that this configuration differs from previous examples using
        <code>SocketAppender</code> only in the <em>class</em> specified for
        the appender, and in the absence of the <span class="prop">remoteHost</span>
        property &mdash; this appender waits passively for inbound connections 
        from remote hosts rather than opening a connection to a remote logging
        server.
        </p>
        
        <p>The following example illustrates a configuration using
        <code>SSLServerSocketAppender</code>.</p>
            
         <p class="example">Example: Basic SSLServerSocketAppender Configuration
        (logback-examples/src/main/java/chapters/appenders/socket/ssl/server3.xml)</p>
    <pre id="SocketReceiver" class="prettyprint source">&lt;configuration debug="true">
      &lt;appender name="SERVER" 
        class="ch.qos.logback.classic.net.server.SSLServerSocketAppender">
        &lt;port>${port}&lt;/port>
        &lt;includeCallerData>${includeCallerData}&lt;/includeCallerData>
        &lt;ssl>
          &lt;keyStore>
            &lt;location>${keystore}&lt;/location>
            &lt;password>${password}&lt;/password>
          &lt;/keyStore>
        &lt;/ssl>
      &lt;/appender>
    
      &lt;root level="debug">
        &lt;appender-ref ref="SERVER" />
      &lt;/root>  
    
    &lt;/configuration>
    </pre>
       
        <p>The principal differences between this configuration and the
        previous configuration is that the appender's <em>class</em> attribute
        identifies the <code>SSLServerSocketAppender</code> type, and the
        presence of the nested <span class="prop">ssl</span> element which
        specifies, in this example, configuration of a key store containing
        an X.509 credential for the appender.  See <a href="usingSSL.html">
        Using SSL</a> for information regarding SSL configuration properties.
        </p>
        
        <p>Because the <code>ServerSocketAppender</code> subtypes are designed
        to be used with receiver components, we will defer presenting 
        illustrative examples to the chapter entitled 
        <a href="receivers.html">Receivers</a>.</p>
        
       <h3 class="doAnchor">SMTPAppender</h3>
       
       <p>The <a
       href="../xref/ch/qos/logback/classic/net/SMTPAppender.html"><code>SMTPAppender</code></a>
       accumulates logging events in one or more fixed-size buffers and
       sends the contents of the appropriate buffer in an email after a
       user-specified event occurs.  SMTP email transmission (sending) is
       performed asynchronously. By default, the email transmission is
       triggered by a logging event of level ERROR. Moreover, by default,
       a single buffer is used for all events.
       </p>
    		
       <p>The various properties for <code>SMTPAppender</code> are
       summarized in the following table.
    	 </p>
    		
    		<table class="bodyTable striped">
          <tr>
            <th>Property Name</th>
            <th>Type</th>
            <th>Description</th>
          </tr>
    
          <tr>
            <td><span class="prop" container="smtp">smtpHost</span></td>
            <td><code>String</code></td>
            <td>The host name of the SMTP server. This parameter is mandatory.</td>
          </tr>
          
          <tr>
            <td><span class="prop" container="smtp">smtpPort</span></td>
            <td><code>int</code></td>
            <td>The port where the SMTP server is listening. Defaults to
            25.</td>
          </tr>
          
          <tr>
            <td><span class="prop" name="smtpTo">to</span></td>
            <td><code>String</code></td>
            <td>The email address of the recipient as a
            <em>pattern</em>. The pattern is evaluated anew with the
            triggering event as input for each outgoing email. Multiple
            recipients can be specified by separating the destination
            addresses with commas.  Alternatively, multiple recipients can
            also be specified by using multiple <code>&lt;to></code>
            elements. 
            </td>
          </tr>
    
          <tr>
            <td><span class="prop" container="smtp">from</span></td>
            <td><code>String</code></td>
            <td>The originator of the email messages sent by
            <code>SMTPAppender</code> in the <a
            href="http://en.wikipedia.org/wiki/Email_address">usual email
            address format</a>. If you wish to include the sender's name,
            then use the format
            "Adam&nbsp;Smith&nbsp;&amp;lt;smith@moral.org&amp;gt;" so that
            the message appears as originating from
            "Adam&nbsp;Smith&nbsp;&lt;smith@moral.org&gt;".
            </td>
          </tr>
          <tr>
            <td><span class="prop">subject</span></td>
            <td><code>String</code></td>
            <td> 
              <p>The subject of the email. It can be any value accepted as
              a valid conversion pattern by <a
              href="layouts.html#ClassicPatternLayout">PatternLayout</a>. Layouts
              will be discussed in the next chapter.
              </p>
              
              <p>The outgoing email message will have a subject line
              corresponding to applying the pattern on the logging event
              that triggered the email message.
              </p>
    
              <p>Assuming the <span class="prop">subject</span> option
              is set to "Log: %logger - %msg" and the triggering event's
              logger is named "com.foo.Bar", and contains the message
              "Hello world", then the outgoing email will have the subject
              line "Log: com.foo.Bar - Hello World".
              </p>
    
              <p>By default, this option is set to "%logger{20} - %m".</p>
            </td>
            
          </tr>
          <tr>
            <td><span class="prop" container="smtp">discriminator</span></td>
            <td><code><a href="../xref/ch/qos/logback/core/sift/Discriminator.html">Discriminator</a></code></td>
            <td>
              <p>With the help of a <span
              class="prop">Discriminator</span>,
              <code>SMTPAppender</code> can scatter incoming events into
              different buffers according to the value returned by the
              discriminator. The default discriminator always returns the
              same value so that the same buffer is used for all events.
              </p>
    
              <p>By specifying a discriminator other than the default
              one, it is possible to receive email messages
              containing a events pertaining to a particular user, user
              session or client IP address.
              </p>
            </td>
          </tr>
          <tr>
            <td><span class="prop" name="smtpAppender_Evaluator">evaluator</span></td>
            <td><code><a
            href="../xref/ch/qos/logback/classic/boolex/IEvaluator.html">IEvaluator</a></code></td>
            <td>
              <p>This option is declared by creating a new
              <code>&lt;EventEvaluator/></code> element. The name of the
              class that the user wishes to use as the
              <code>SMTPAppender</code>'s <code>Evaluator</code> needs
              to be specified via the <span class="attr">class</span>
              attribute.
              </p>
              
              
              <p>In the absence of this option, <code>SMTPAppender</code>
              is assigned an instance of <a
              href="../xref/ch/qos/logback/classic/boolex/OnErrorEvaluator.html">OnErrorEvaluator</a>
              which triggers email transmission when it encounters an
              event of level <em>ERROR</em> or higher.
              </p>
    
              <!--
              <p><code>EventEvaluator</code> objects are subclasses of the
              <code>JaninoEventEvaluatorBase</code> which depends on
              Janino. See the <a href="../dependencies.html">dependencies
              page</a> for more information.
              </p>
              -->
    
              <p>Logback ships with several other evaluators, namely <a
              href="../xref/ch/qos/logback/classic/boolex/OnMarkerEvaluator.html"><code>OnMarkerEvaluator</code></a>
              (discussed below) and a powerful evaluator called <a
              href="../xref/ch/qos/logback/classic/boolex/JaninoEventEvaluator.html"><code>JaninoEventEvaluator</code></a>,
              discussed in <a href="filters.html#evalutatorFilter">another
              chapter</a>. The more recent versions of logback ship with
              an even more powerful evaluator called <a
              href="filters.html#GEventEvaluator"><code>GEventEvaluator</code></a>.
              </p>
    
            </td>
          </tr>
    
          <tr>
            <td  valign="top"><span class="prop" container="smtp">cyclicBufferTracker</span></td>
            <td><a href="../xref/ch/qos/logback/core/spi/CyclicBufferTracker.html"><code>CyclicBufferTracker</code></a>
            </td>
            <td>
              <p>As the name indicates, an instance of the
              <code>CyclicBufferTracker</code> class tracks cyclic
              buffers. It does so based on the keys returned by the <span
              class="prop">discriminator</span> (see above).
              </p>
              <p>If you don't specify a <span
              class="prop">cyclicBufferTracker</span>, an instance of <a
              href="../xref/ch/qos/logback/core/spi/CyclicBufferTrackerImpl.html">CyclicBufferTrackerImpl</a>
              will be automatically created. By default, this instance
              will keep events in a cyclic buffer of size 256. You may
              change the size with the help of the <span
              class="prop">bufferSize</span> option (see below).</p>
            </td>        
          </tr>
          <tr>
            <td><span class="prop" container="smtp">username</span></td>
            <td><code>String</code></td> <td>The username value to use
            during plain user/password authentication. By default, this
            parameter is null.  </td> 
          </tr> 
          <tr class="alt">
            <td><span class="prop" container="smtp">password</span></td>
            <td><code>String</code></td>
            <td>The password value to use for plain user/password
            authentication. By default, this parameter is null.  
            </td>
          </tr>
          <tr> 
            <td><span class="prop" container="smtp">STARTTLS</span> </td>
            <td><code>boolean</code></td> 
            <td>If this parameter is set to true, then this appender
            will issue the STARTTLS command (if the server supports it)
            causing the connection to switch to SSL. Note that the
            connection is initially non-encrypted. By default, this
            parameter is set to false.
            </td> 
          </tr>
          <tr>
            <td><span class="prop" container="smtp">SSL</span></td>
            <td><code>boolean</code></td> <td>If this parameter is set to
            true, then this appender will open an SSL connection to the
            server. By default, this parameter is set to false.  </td>
          </tr>
    
          <tr>
            <td><span class="prop" container="smtp">charsetEncoding</span></td>
            <td><code>String</code></td>
            <td>The outgoing email message will be encoded in the
            designated <a
            href="http://java.sun.com/j2se/1.4.2/docs/api/java/nio/charset/Charset.html">charset</a>. The
            default charset encoding is "UTF-8" which works well for most
            purposes.
            </td>
          </tr>
    
    
          <tr>
            <td><span class="prop" container="smtp">localhost</span></td>
            <td><code>String</code></td>
            <td>In case the hostname of the SMTP client is not properly
            configured, e.g. if the client hostname is not fully
            qualified, certain SMTP servers may reject the HELO/EHLO
            commands sent by the client. To overcome this issue, you may
            set the value of the <span class="prop">localhost</span>
            property to the fully qualified name of the client host. See
            also the "mail.smtp.localhost" property in the documentation
            for the <a
            href="http://javamail.kenai.com/nonav/javadocs/com/sun/mail/smtp/package-summary.html">com.sun.mail.smtp</a>
            package.</td>
          </tr>
    
          <tr>
            <td><span class="prop" container="smtp">asynchronousSending</span></td>
            <td><code>boolean</code></td>
            <td>This property determines whether email transmission is
            done asynchronously or not. By default, the <span
            class="prop">asynchronousSending</span> property is
            'true'. However, under certain circumstances asynchronous
            sending may be inappropriate. For example if your application
            uses <code>SMTPAppender</code> to send alerts in response to a
            fatal error, and then exits, the relevant thread may not have
            the time to send the alert email. In this case, set <span
            class="prop">asynchronousSending</span> property to 'false'
            for synchronous email transmission.
            </td>
          </tr>
    
          <tr>
            <td><span class="prop" container="smtp">includeCallerData</span></td>
            <td><code>boolean</code></td>
            <td>By default, <span class="prop">includeCallerData</span> is
            set to <code>false</code>. You should set <span
            class="prop">includeCallerData</span> to <code>true</code> if
            <span class="prop">asynchronousSending</span> is enabled and
            you wish to include caller data in the logs. </td>
          </tr>
    
          <tr>
            <td><span class="prop" container="smtp">sessionViaJNDI</span></td>
            <td><code>boolean</code></td>
            <td><code>SMTPAppender</code> relies on
            <code>javax.mail.Session</code> to send out email messages. By
            default, <span class="prop">sessionViaJNDI</span> is set to
            <code>false</code> so the <code>javax.mail.Session</code>
            instance is built by <code>SMTPAppender</code> itself with the
            properties specified by the user. If the <span
            class="prop">sessionViaJNDI</span> property is set to
            <code>true</code>, the <code>javax.mail.Session</code> object
            will be retrieved via JNDI. See also the <span
            class="prop">jndiLocation</span> property.
    
            <p>Retrieving the <code>Session</code> via JNDI can reduce the
            number of places you need to configure/reconfigure the same
            information, making your application <a
            href="http://en.wikipedia.org/wiki/Don't_repeat_yourself">dryer</a>. For
            more information on configuring resources in Tomcat see <a
            href="http://tomcat.apache.org/tomcat-6.0-doc/jndi-resources-howto.html#JavaMail_Sessions">JNDI
            Resources How-to</a>. <span class="label">beware</span> As
            noted in that document, make sure to remove <em>mail.jar</em>
            and <em>activation.jar</em> from your web-applications
            <em>WEB-INF/lib</em> folder when retrieving the
            <code>Session</code> from JNDI.
            </p>
            </td>
          </tr>
    
          <tr>
            <td><span class="prop" container="smtp">jndiLocation</span></td>
            <td><code>String</code></td>
            <td>The location where the javax.mail.Session is placed in
            JNDI. By default, <span class="prop">jndiLocation</span> is
            set to <span style="white-space:nowrap">"java:comp/env/mail/Session"</span>.
            </td>
          </tr>
    
    		</table>		
    		
    		<p>The <code>SMTPAppender</code> keeps only the last 256 logging
    		events in its cyclic buffer, throwing away older events when its
    		buffer becomes full.  Thus, the number of logging events delivered
    		in any e-mail sent by <code>SMTPAppender</code> is upper-bounded
    		by 256. This keeps memory requirements bounded while still
    		delivering a reasonable amount of application context.
    		</p>
    		
    		<p>The <code>SMTPAppender</code> relies on the JavaMail API.  It
    		has been tested with JavaMail API version 1.4.  The JavaMail API
    		requires the JavaBeans Activation Framework package.  You can
    		download the <a
    		href="http://java.sun.com/products/javamail/">JavaMail API</a> and
    		the <a
    		href="http://java.sun.com/beans/glasgow/jaf.html">JavaBeans
    		Activation Framework</a> from their respective websites.  Make
    		sure to place these two jar files in the classpath before trying
    		the following examples.
    		</p>
    		
    		<p>A sample application, <a
    		href="../xref/chapters/appenders/mail/EMail.html"><code>chapters.appenders.mail.EMail</code></a>
    		generates a number of log messages followed by a single
    		error message. It takes two parameters. The first parameter is an
    		integer corresponding to the number of logging events to
    		generate. The second parameter is the logback configuration
    		file. The last logging event generated by <em>EMail</em>
    		application, an ERROR, will trigger the transmission of an email
    		message.
    		</p>
    
    		<p>Here is a sample configuration file intended for the
    		<code>Email</code> application:
    		</p>	
    		
        <p class="example">Example: A sample <code>SMTPAppender</code> configuration (logback-examples/src/main/java/chapters/appenders/mail/mail1.xml)</p>	
        <span class="asGroovy" onclick="return asGroovy('mail1');">View as .groovy</span>	
        <pre id="mail1" class="prettyprint source">&lt;configuration>	  
      &lt;appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
        &lt;smtpHost>ADDRESS-OF-YOUR-SMTP-HOST&lt;/smtpHost>
        &lt;to>EMAIL-DESTINATION&lt;/to>
        &lt;to>ANOTHER_EMAIL_DESTINATION&lt;/to> &lt;!-- additional destinations are possible --&gt;
        &lt;from>SENDER-EMAIL&lt;/from>
        &lt;subject>TESTING: %logger{20} - %m&lt;/subject>
        &lt;layout class="ch.qos.logback.classic.PatternLayout">
          &lt;pattern>%date %-5level %logger{35} - %message%n&lt;/pattern>
        &lt;/layout>	    
      &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="EMAIL" />
      &lt;/root>  
    &lt;/configuration></pre>
    
    		<p>Before trying out <code>chapters.appenders.mail.Email</code> application
    		with the above configuration file, you must set the <span
    		class="prop">smtpHost</span>, <span class="prop">to</span> and
    		<span class="prop">from</span> properties to values appropriate for
    		your environment. Once you have set the correct values in the
    		configuration file, execute the following command:
    		</p>
    		
    <div class="source"><pre>java chapters.appenders.mail.EMail 100 src/main/java/chapters/appenders/mail/mail1.xml</pre></div>
    
    		<p>The recipient you specified should receive an email message
    		containing 100 logging events formatted by
    		<code>PatternLayout</code> The figure below is the resulting email
    		message as shown by Mozilla Thunderbird.
    		</p>
        
        <p><img src="images/chapters/appenders/smtpAppender1.jpg" alt="resulting email"/></p>
    		
    		<p>In the next example configuration file <em>mail2.xml</em>, the
    		values for the <span class="prop">smtpHost</span>, <span
    		class="prop">to</span> and <span class="prop">from</span>
    		properties are determined by variable substitution. Here is the
    		relevant part of <em>mail2.xml</em>.
    		</p>		
    
        <pre class="prettyprint source">&lt;appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
      &lt;smtpHost>${smtpHost}&lt;/smtpHost>
      &lt;to>${to}&lt;/to>
      &lt;from>${from}&lt;/from>
      &lt;layout class="ch.qos.logback.classic.html.HTMLLayout"/>
    &lt;/appender></pre>
    		
    		<p>You can pass the required parameters on the command line:</p>
    		
    <div class="source"><pre>java -Dfrom=source@xyz.com -Dto=recipient@xyz.com -DsmtpHost=some_smtp_host \
      chapters.appenders.mail.EMail 10000 src/main/java/chapters/appenders/mail/mail2.xml
    </pre></div>
    
    		<p>Be sure to replace with values as appropriate for your
    		environment.
    		</p>
    		
    		<p>Note that in this latest example, <code>PatternLayout</code>
    		was replaced by <code>HTMLLayout</code> which formats logs as an
    		HTML table. You can change the list and order of columns as well
    		as the CSS of the table. Please refer to <a
    		href="layouts.html#ClassicHTMLLayout">HTMLLayout</a> documentation
    		for further details.
        </p>
        
        <p>Given that the size of the cyclic buffer is 256, the recipient
        should see an email message containing 256 events conveniently
        formatted in an HTML table. Note that this run of the
        <code>chapters.appenders.mail.Email</code> application generated
        10'000 events of which only the last 256 were included in the
        outgoing email.
    		</p>
    		
        <p><img src="images/chapters/appenders/smtpAppender2.jpg" alt="2nd email"/></p>
    
        <p>Email clients such as Mozilla Thunderbird, Eudora or MS
        Outlook, offer reasonably good CSS support for HTML email.
        However, they sometimes automatically downgrade HTML to
        plaintext. For example, to view HTML email in Thunderbird, the
        "View&rarr;Message&nbsp;Body&nbsp;As&rarr;Original HTML" option
        must be set. Yahoo! Mail's support for HTML email, in particular
        its CSS support is very good. Gmail on the other hand, while it
        honors the basic HTML table structure, ignores the internal CSS
        formatting. Gmail supports inline CSS formatting but since inline
        CSS would make the resulting output too voluminous,
        <code>HTMLLayout</code> does not use inline CSS.
        </p>
    
        <h3 class="doAnchor" name="cyclicBufferSize">Custom buffer
        size</h3>
    
        <p>By default, the outgoing message will contain the last 256
        messages seen by <code>SMTPAppender</code>. If your heart so
        desires, you may set a different buffer size as shown in the next example.
        </p>
    
       <p class="example">Example:  <code>SMTPAppender</code> configuration with a custom bufer size (logback-examples/src/main/java/chapters/appenders/mail/customBufferSize.xml)</p>	
        <pre class="prettyprint source">&lt;configuration>   
      &lt;appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
        &lt;smtpHost>${smtpHost}&lt;/smtpHost>
        &lt;to>${to}&lt;/to>
        &lt;from>${from}&lt;/from>
        &lt;subject>%logger{20} - %m&lt;/subject>
        &lt;layout class="ch.qos.logback.classic.html.HTMLLayout"/>
    
        <b>&lt;cyclicBufferTracker class="ch.qos.logback.core.spi.CyclicBufferTracker"></b>
          <b>&lt;!-- send just one log entry per email --></b>
          <b>&lt;bufferSize>1&lt;/bufferSize></b>
        <b>&lt;/cyclicBufferTracker></b>
      &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="EMAIL" />
      &lt;/root>  
    &lt;/configuration>    </pre>
        
    
        <h3 class="doAnchor">Triggering event</h3>
    
        <p>If the Evaluator property is not set, the
        <code>SMTPAppender</code> defaults to an <a
        href="../xref/ch/qos/logback/classic/boolex/OnErrorEvaluator.html">OnErrorEvaluator</a>
        instance which triggers email transmission when it encounters an
        event of level ERROR. While triggering an outgoing email in
        response to an error is relatively reasonable, it is possible to
        override this default behavior by providing a different
        implementation of the <code>EventEvaluator</code> interface.
        </p>
    		
    		<p>The <code>SMTPAppender</code> submits each incoming event to
    		its evaluator by calling <code>evaluate()</code> method in order
    		to check whether the event should trigger an email or just be
    		placed in the cyclic buffer.  When the evaluator gives a positive
    		answer to its evaluation, an email is sent out.  The
    		<code>SMTPAppender</code> contains one and only one evaluator
    		object.  This object may manage its own internal state. For
    		illustrative purposes, the <code>CounterBasedEvaluator</code>
    		class listed next implements an event evaluator whereby every
    		1024th event triggers an email message.
    		</p>
    
        <p class="example">Example: A <code>EventEvaluator</code> implementation
    that evaluates to <code>true</code> every 1024th event (<a href="../xref/chapters/appenders/mail/CounterBasedEvaluator.html">logback-examples/src/main/java/chapters/appenders/mail/CounterBasedEvaluator.java</a>)</p>
       
       <pre class="prettyprint source">package chapters.appenders.mail;
    
    import ch.qos.logback.core.boolex.EvaluationException;
    import ch.qos.logback.core.boolex.EventEvaluator;
    import ch.qos.logback.core.spi.ContextAwareBase;
    
    public class CounterBasedEvaluator extends ContextAwareBase implements EventEvaluator {
    
      static int LIMIT = 1024;
      int counter = 0;
      String name;
    
      <b>public boolean evaluate(Object event) throws NullPointerException,
          EvaluationException {
        counter++;
    
        if (counter == LIMIT) {
          counter = 0;
    
          return true;
        } else {
          return false;
        }
      }</b>
    
      public String getName() {
        return name;
      }
    
      public void setName(String name) {
        this.name = name;
      }
    }</pre>
    
    		<p>Note that this class extends <code>ContextAwareBase</code> and
    		implements <code>EventEvaluator</code>. This allows the user to
    		concentrate on the core functions of her
    		<code>EventEvaluator</code> and let the base class provide the
    		common functionality.
    		</p>
    
    		<p>Setting the <span class="prop">Evaluator</span> option of
    		<code>SMTPAppender</code> instructs it to use a custom evaluator.
    		The next configuration file attaches a <code>SMTPAppender</code>
    		to the root logger.  This appender uses a
    		<code>CounterBasedEvaluator</code> instance as its event
    		evaluator.
    		</p>
    
        <p class="example">Example: <code>SMTPAppender</code> with custom 
        <code>Evaluator</code> and buffer size (logback-examples/src/main/java/chapters/appenders/mail/mail3.xml)</p>
        <span class="asGroovy" onclick="return asGroovy('mail3');">View as .groovy</span>	
        <pre id="mail3" class="prettyprint source">&lt;configuration>
      &lt;appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
        <b>&lt;evaluator class="chapters.appenders.mail.CounterBasedEvaluator" /></b>
        &lt;smtpHost>${smtpHost}&lt;/smtpHost>
        &lt;to>${to}&lt;/to>
        &lt;from>${from}&lt;/from>
        &lt;subject>%logger{20} - %m&lt;/subject>
    
        &lt;layout class="ch.qos.logback.classic.html.HTMLLayout"/>
      &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="EMAIL" />
      &lt;/root>  
    &lt;/configuration></pre>
        
    
        <h3 class="doAnchor" name="OnMarkerEvaluator">Marker based
        triggering </h3>
    
        <p>Although reasonable, the default triggering policy whereby every
        event of level ERROR triggers an outgoing email may result in too
        many emails, cluttering the targeted user's mailbox. Logback ships
        with another triggering policy, called <a
        href="../xref/ch/qos/logback/classic/boolex/OnMarkerEvaluator.html">OnMarkerEvaluator</a>. It
        is based on markers. In essence, emails are triggered only if the
        event is marked with a user-specified marker. The next example
        should make the point clearer.
        </p>
    
        <p>The <a
        href="../xref/chapters/appenders/mail/Marked_EMail.html">Marked_EMail</a>
        application contains several logging statements some of which are
        of level ERROR. One noteworthy statement contains a marker. Here
        is the relevant code.
        </p>
    
        <pre class="prettyprint source">Marker notifyAdmin = MarkerFactory.getMarker("NOTIFY_ADMIN");
    logger.error(<b>notifyAdmin</b>,
      "This is a serious an error requiring the admin's attention",
       new Exception("Just testing"));</pre>
    
       <p>The next configuration file will trigger outgoing emails only in
       presence of events bearing the NOTIFY_ADMIN or the
       TRANSACTION_FAILURE markers.
       </p>
    
       <p class="example">Example: <code>SMTPAppender</code> with 
       <code>OnMarkerEvaluator</code> (logback-examples/src/main/java/chapters/appenders/mail/mailWithMarker.xml)</p>
    
       <span class="asGroovy" onclick="return asGroovy('mailWithMarker');">View as .groovy</span>	
       <pre id="mailWithMarker" class="prettyprint source">&lt;configuration>
      &lt;appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
        <b>&lt;evaluator class="ch.qos.logback.classic.boolex.OnMarkerEvaluator">
          &lt;marker>NOTIFY_ADMIN&lt;/marker>
          &lt;!-- you specify add as many markers as you want -->
          &lt;marker>TRANSACTION_FAILURE&lt;/marker>
        &lt;/evaluator></b>
        &lt;smtpHost>${smtpHost}&lt;/smtpHost>
        &lt;to>${to}&lt;/to>
        &lt;from>${from}&lt;/from>
        &lt;layout class="ch.qos.logback.classic.html.HTMLLayout"/>
      &lt;/appender>
    
      &lt;root>
        &lt;level value ="debug"/>
        &lt;appender-ref ref="EMAIL" />
      &lt;/root>  
    &lt;/configuration></pre>
        
        <p>Give it a whirl with the following command:</p>
    
        <pre class="source">java -Dfrom=source@xyz.com -Dto=recipient@xyz.com -DsmtpHost=some_smtp_host \
      chapters.appenders.mail.Marked_EMail src/main/java/chapters/appenders/mail/mailWithMarker.xml</pre>
    
    
      <h4 class="doAnchor" name="marker_JaninoEventEvaluator">Marker-based
      triggering with JaninoEventEvaluator</h4>
    
        <p>Note that instead of using the marker-centric
        <code>OnMarkerEvaluator</code>, we could use the much more generic
        <a
        href="filters.html#JaninoEventEvaluator"><code>JaninoEventEvaluator</code></a>
        or its even more powerful cousin <a
        href="filters.html#GEventEvaluator"><code>GEventEvaluator</code></a>.
        For example, the following configuration file uses
        <code>JaninoEventEvaluator</code> instead of
        <code>OnMarkerEvaluator</code> but is otherwise equivalent to the
        previous configuration file.
        </p>
    
        <p class="example">Example: <code>SMTPAppender</code> with 
       <code>JaninoEventEvaluator</code> (logback-examples/src/main/java/chapters/appenders/mail/mailWithMarker_Janino.xml)</p>
    
       <span class="asGroovy" onclick="return asGroovy('mailWithMarker_Janino');">View as .groovy</span>	
        <pre id="mailWithMarker_Janino" class="prettyprint source">&lt;configuration>
      &lt;appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
        &lt;evaluator class="ch.qos.logback.classic.boolex.JaninoEventEvaluator">
          &lt;expression>
            (marker != null) &amp;&amp;
            (marker.contains("NOTIFY_ADMIN") || marker.contains("TRANSACTION_FAILURE"))
          &lt;/expression>
        &lt;/evaluator>    
        ... same as above
      &lt;/appender>
    &lt;/configuration></pre>
    
        <h4 class="doAnchor" name="marker_GEventEvaluator">Marker-based
        triggering with GEventEvaluator</h4>
    
        <p>Here is the equivalent evaluator using <a
        href="filters.html#GEventEvaluator">GEventEvaluator</a>.</p>
    
        <p class="example">Example: the same with 
       <code>GEventEvaluator</code> (logback-examples/src/main/java/chapters/appenders/mail/mailWithMarker_GEvent.xml)</p>
       <span class="asGroovy" onclick="return asGroovy('mailWithMarker_GEventEvaluator');">View as .groovy</span>	
    
       <pre id="mailWithMarker_GEventEvaluator" class="prettyprint source">&lt;configuration>
      &lt;appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
        &lt;evaluator class="ch.qos.logback.classic.boolex.GEventEvaluator">
          &lt;expression>
            e.marker?.contains("NOTIFY_ADMIN") || e.marker?.contains("TRANSACTION_FAILURE")
          &lt;/expression>
        &lt;/evaluator>    
        ... same as above
      &lt;/appender>
    &lt;/configuration></pre>
    
        <p>Note that since the event may lack a marker, the value of
        e.marker can be null. Hence the use of Groovy's <a
        href="http://groovy.codehaus.org/Null+Object+Pattern">safe
        dereferencing operator</a>, that is the .? operator.
        </p>
    
    
    
        <h3><a name="smtpAuthentication" href="#smtpAuthentication"><span
        class="anchor"/></a>Authentication/STARTTLS/SSL</h3>
    
        <p><code>SMTPAppender</code> supports authentication via plain
        user passwords as well as both the STARTTLS and SSL
        protocols. Note that STARTTLS differs from SSL in that, in
        STARTTLS, the connection is initially non-encrypted and only after
        the STARTTLS command is issued by the client (if the server
        supports it) does the connection switch to SSL. In SSL mode, the
        connection is encrypted right from the start.
        </p>
    
        <h3> class="doAnchor"name="gmailSSL">SMTPAppender configuration
        for Gmail (SSL)</h3>
    
        <p>The next example shows you how to configure
        <code>SMTPAppender</code> for Gmail with the SSL protocol. </p>
        
        <p class="example">Example:: <code>SMTPAppender</code> to Gmail
        using SSL
        (logback-examples/src/main/java/chapters/appenders/mail/gmailSSL.xml)</p>
    
        <span class="asGroovy" onclick="return asGroovy('gmailSSLExample');">View as .groovy</span>	
        <pre id="gmailSSLExample" class="prettyprint source">&lt;configuration>
      &lt;appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
        <b>&lt;smtpHost>smtp.gmail.com&lt;/smtpHost></b>
        <b>&lt;smtpPort>465&lt;/smtpPort></b>
        <b>&lt;SSL>true&lt;/SSL></b>
        <b>&lt;username>YOUR_USERNAME@gmail.com&lt;/username></b>
        <b>&lt;password>YOUR_GMAIL_PASSWORD&lt;/password></b>
    
        &lt;to>EMAIL-DESTINATION&lt;/to>
        &lt;to>ANOTHER_EMAIL_DESTINATION&lt;/to> &lt;!-- additional destinations are possible -->
        &lt;from>YOUR_USERNAME@gmail.com&lt;/from>
        &lt;subject>TESTING: %logger{20} - %m&lt;/subject>
        &lt;layout class="ch.qos.logback.classic.PatternLayout">
          &lt;pattern>%date %-5level %logger{35} - %message%n&lt;/pattern>
        &lt;/layout>	    
      &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="EMAIL" />
      &lt;/root>  
    &lt;/configuration></pre>
    
    
        <h3 class="doAnchor" name="gmailSTARTTLS">SMTPAppender for Gmail
        (STARTTLS)</h3>
    
        <p>The next example shows you how to configure
        <code>SMTPAppender</code> for Gmail for the STARTTLS protocol. </p>
    
        <p class="example">Example: <code>SMTPAppender</code> to GMAIL using STARTTLS (logback-examples/src/main/java/chapters/appenders/mail/gmailSTARTTLS.xml)</p>
    
        <span class="asGroovy" onclick="return asGroovy('gmailSTARTTLSExample');">View as .groovy</span>	
        <pre id="gmailSTARTTLSExample" class="prettyprint source">&lt;configuration>	  
      &lt;appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
        &lt;smtpHost>smtp.gmail.com&lt;/smtpHost>
        &lt;smtpPort>587&lt;/smtpPort>
        &lt;STARTTLS>true&lt;/STARTTLS>
        &lt;username>YOUR_USERNAME@gmail.com&lt;/username>
        &lt;password>YOUR_GMAIL_xPASSWORD&lt;/password>
        
        &lt;to>EMAIL-DESTINATION&lt;/to>
        &lt;to>ANOTHER_EMAIL_DESTINATION&lt;/to> &lt;!-- additional destinations are possible -->
        &lt;from>YOUR_USERNAME@gmail.com&lt;/from>
        &lt;subject>TESTING: %logger{20} - %m&lt;/subject>
        &lt;layout class="ch.qos.logback.classic.PatternLayout">
          &lt;pattern>%date %-5level %logger - %message%n&lt;/pattern>
        &lt;/layout>	    
      &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="EMAIL" />
      &lt;/root>  
    &lt;/configuration></pre>
    
    
        <h3 class="doAnchor" name="smtpDiscriminator">SMTPAppender with MDCDiscriminator</h3>
    
    
        <p>As mentioned earlier, by specifying a discriminator other than
        the default one, <code>SMTPAppender</code> will generate email
        messages containing events pertaining to a particular user, user
        session or client IP address, depending on the specified discriminator.
        </p>
    
        <p>The next example illustrates the use of <a
        href="../xref/ch/qos/logback/classic/sift/MDCBasedDiscriminator.html">MDCBasedDiscriminator</a>
        in conjunction with the MDC key named "req.remoteHost", assumed to
        contain the IP address of the remote host accessing a fictitious
        application. In a web-application, you could use <a
        href="mdc.html#mis">MDCInsertingServletFilter</a> to populate MDC
        values.
        </p>
    
        <p class="example">Example: <code>SMTPAppender</code> with
        MDCBasedDsicriminator
        (logback-examples/src/main/java/chapters/appenders/mail/mailWithMDCBasedDiscriminator.xml)</p>
    
        <span class="asGroovy" onclick="return asGroovy('mailWithMDCBasedDiscriminator');">View as .groovy</span>	
        <pre id="mailWithMDCBasedDiscriminator" class="prettyprint source">&lt;configuration>	  
      &lt;appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
        &lt;smtpHost>ADDRESS-OF-YOUR-SMTP-HOST&lt;/smtpHost>
        &lt;to>EMAIL-DESTINATION&lt;/to>
        &lt;from>SENDER-EMAIL&lt;/from>
    
        <b>&lt;discriminator class="ch.qos.logback.classic.sift.MDCBasedDiscriminator"></b>
          <b>&lt;key>req.remoteHost&lt;/key></b>
          <b>&lt;defaultValue>default&lt;/defaultValue></b>
        <b>&lt;/discriminator></b>
    
        &lt;subject>${HOSTNAME} -- %X{req.remoteHost} %msg"&lt;/subject>
        &lt;layout class="ch.qos.logback.classic.html.HTMLLayout">
          &lt;pattern>%date%level%thread%X{req.remoteHost}%X{req.requestURL}%logger%msg&lt;/pattern>
        &lt;/layout>
      &lt;/appender>
    
      &lt;root>
        &lt;level level="DEBUG"/>
        &lt;appender-ref ref="EMAIL" />
      &lt;/root>  
    &lt;/configuration></pre>
    
        <p>Thus, each outgoing email generated by
        <code>SMTPAppender</code> will belong to a <em>unique</em> remote
        host, greatly facilitating problem diagnosis.
        </p>
        
        <h4 class="doAnchor" name= "bufferManagement">Buffer management in
        very busy systems</h4>
    
        <p>Internally, each distinct value returned by the discriminator
        will cause the creation of a new cyclic buffer. However, at most
        <span class="prop">maxNumberOfBuffers</span> (by default 64)
        will be maintained.  Whenever the number of buffers rises above
        <span class="prop">maxNumberOfBuffers</span>, the least recently
        updated buffer is automatically discarded. As a second safety
        measure, any buffer which has not been updated in the last 30
        minutes will be automatically discarded as well.</p>
    
        <p>On systems serving a large number of transactions per minute,
        allowing only a small number for <span
        class="prop">maxNumberOfBuffers</span> (by default 64) will
        often cause the number of events in the outgoing email to be
        unnecessarily small. Indeed, in the presence of a large number of
        transactions, there will be more than one buffer associated with
        the same transaction as buffers will be killed and re-born in
        succession for the same discriminator value (or transaction). Note
        that in even such very busy systems, the maximum number of cyclic
        buffers is capped by <span
        class="prop">maxNumberOfBuffers</span>.
        </p>
    
        <p>To avoid such yo-yo effects, <code>SMTPAppender</code> will
        release the buffer associated with a given discriminator key as
        soon as it sees an event marked as "FINALIZE_SESSION". This will
        cause the appropriate buffer to be discarded at the end of each
        transaction. You can then safely increase the value of <span
        class="prop">maxNumberOfBuffers</span> to a larger value such as
        512 or 1024 without risking running out of memory.
        </p>
    
        <p>There are three distinct but complementary mechanisms working
        together to manage cyclic buffers. They ensure that only relevant
        buffers are kept alive at any given moment, even in very busy
        systems.</p>
    
        <!-- =========================================================== -->
        <!-- =========================================================== -->
    
    
        <h3 class="doAnchor" name="DBAppender">DBAppender</h3>
    		
    		<p>The <a
    		href="../xref/ch/qos/logback/classic/db/DBAppender.html"><code>DBAppender</code></a>
    		inserts logging events into three database tables in a format
    		independent of the Java programming language.
    		</p>
    
    		<p>These three tables are <em>logging_event</em>,
    		<em>logging_event_property</em> and
    		<em>logging_event_exception</em>. They must exist before
    		<code>DBAppender</code> can be used. Logback ships with SQL
    		scripts that will create the tables.  They can be found under the
    		<em>logback-classic/src/main/java/ch/qos/logback/classic/db/script</em>
    		folder. There is a specific script for each of the most popular
    		database systems.  If the script for your particular type of
    		database system is missing, it should be quite easy to write one,
    		taking example on the already existing scripts. If you send them
    		to us, we will gladly include missing scripts in future releases.
    		</p>
    
    		<p>If your JDBC driver supports the <code>getGeneratedKeys</code>
    		method introduced in JDBC 3.0 specification, assuming you have
    		created the appropriate database tables as mentioned above, then
    		no additional steps are required. Otherwise, there must be an
    		<code>SQLDialect</code> appropriate for your database
    		system. Currently, logback has dialects for H2, HSQL, MS SQL
    		Server, MySQL, Oracle, PostgreSQL, SQLLite and Sybase. </p>
    
    		<p>The table below summarizes the database types and their support
    		of the <code>getGeneratedKeys()</code> method.
    		</p>
    
    		<table class="bodyTable striped" border="0" cellpadding="4">
    			<tr>
    				<th>RDBMS</th>
            <th>tested version(s)
            </th>
            <th>tested JDBC driver version(s)
    				</th>
            <th>
    					supports
    					<br />
    					<code>getGeneratedKeys()</code>
    					method
    				</th>		
    
            <th>is a dialect <br/>provided by logback</th>
    			</tr>
    
          <tr>
    				<td>DB2</td>
            <td>untested</td>
    				<td>untested</td>
    				<td>unknown</td>
            <td>NO</td>
    			</tr>
    
          <tr>
            <td>H2</td>
            <td>1.2.132</td>
            <td>-</td>
    				<td>unknown</td>
            <td>YES</td>
    			</tr>
    
          <tr>
            <td>HSQL</td>
            <td>1.8.0.7</td>
            <td>-</td>
    				<td>NO </td>
            <td>YES</td>
    			</tr>
    
          <tr>
            <td>Microsoft SQL Server</td>
            <td>2005</td>
            <td>2.0.1008.2 (sqljdbc.jar)</td>
    				<td>YES</td>
            <td>YES</td>
    			</tr>
    
          <tr>
    				<td>MySQL</td>
            <td>5.0.22</td>
            <td>5.0.8 (mysql-connector.jar)</td>        
    				<td>YES</td>
            <td>YES</td>
    			</tr>
    
    			<tr>
    				<td>PostgreSQL</td>
            <td>8.x</td>
            <td>8.4-701.jdbc4</td>
    				<td>NO</td>
            <td>YES</td>
    
    			</tr>
    		
    			<tr>
    				<td>Oracle</td>
            <td>10g</td>
            <td>10.2.0.1 (ojdbc14.jar)</td>
    				<td>YES</td>
            <td>YES</td>
    			</tr>
    	
          <tr>
            <td>SQLLite</td>
            <td>3.7.4</td>
            <td>-</td>
            <td>unknown</td>
            <td>YES</td>
          </tr>
    	
    			
          <tr>
            <td>Sybase SQLAnywhere</td>
            <td>10.0.1</td>
            <td>-</td>
            <td>unknown</td>
            <td>YES</td>
          </tr>
    
    		</table>
    		
    		<p>Experiments show that writing a single event into the database
    		takes approximately 10 milliseconds, on a "standard" PC. If pooled
    		connections are used, this figure drops to around 1
    		millisecond. Note that most JDBC drivers already ship with
    		connection pooling support.
    		</p>
    		
    		<p>Configuring logback to use <code>DBAppender</code> can be done
    		in several different ways, depending on the tools one has to
    		connect to the database, and the database itself. The key issue in
    		configuring <code>DBAppender</code> is about setting its
    		<code>ConnectionSource</code> object, as we shall discover
    		shortly.
    		</p>
    		
    		<p>Once <code>DBAppender</code> is configured for your database,
    		logging events are sent to the specified database. As stated
    		previously, there are three tables used by logback to store
    		logging event data.
    		</p>
    		
    		<p>
    			The <em>logging_event</em> table contains the following fields:
    		</p>
    		<table class="bodyTable striped">
    			<tr>
    				<th>Field</th>
    				<th>Type</th>
    				<th>Description</th>
    			</tr>
    			<tr>
    				<td><b>timestamp</b></td>
    				<td><code>big int</code></td>
    				<td>The timestamp that was valid at the logging event's creation.</td>
    			</tr>
    			<tr>
    				<td><b>formatted_message</b></td>
    				<td><code>text</code></td>
    
    				<td>The message that has been added to the logging event,
    				after formatting with
    				<code>org.slf4j.impl.MessageFormatter</code>, in case objects
    				were passed along with the message.</td>
    			</tr>
    			<tr>
    				<td><b>logger_name</b></td>
    				<td><code>varchar</code></td>
    				<td>The name of the logger used to issue the logging request.</td>
    			</tr>
    			<tr>
    				<td><b>level_string</b></td>
    				<td><code>varchar</code></td>
    				<td>The level of the logging event.</td>
    			</tr>
    			<tr>
    				<td><b>reference_flag</b></td>
    				<td><code>smallint</code></td>
    				<td>
    					<p>This field is used by logback to identify logging events
    					that have an exception or <code>MDC</code>property values
    					associated.
    					</p>
    
    					<p>Its value is computed by
    					<code>ch.qos.logback.classic.db.DBHelper</code>. A logging
    					event that contains <code>MDC</code> or <code>Context</code>
    					properties has a flag number of <em>1</em>. One that
    					contains an exception has a flag number of <em>2</em>. A
    					logging event that contains both elements has a flag number
    					of <em>3</em>.
    					</p>
    				</td>
    			</tr>
    			<tr>
    				<td><b>caller_filename</b></td>
    				<td><code>varchar</code></td>
    				<td>The name of the file where the logging request was issued.</td>
    			</tr>
    			<tr>
    				<td><b>caller_class</b></td>
    				<td><code>varchar</code></td>
    				<td>The class where the logging request was issued.</td>
    			</tr>
    			<tr>
    				<td><b>caller_method</b></td>
    				<td><code>varchar</code></td>
    				<td>The name of the method where the logging request was issued.</td>
    			</tr>
    			<tr>
    				<td><b>caller_line</b></td>
    				<td><code>char</code></td>
    				<td>The line number where the logging request was issued.</td>
    			</tr>
    			<tr>
    				<td><b>event_id</b></td>
    				<td><code>int</code></td>
    				<td>The database id of the logging event.</td>
    			</tr>
    		</table>
    		
    		<p>
    			The <em>logging_event_property</em> is used to store the keys and values
    			contained in the <code>MDC</code> or the <code>Context</code>. 
    			It contains these fields:
    		</p>
    
    		<table class="bodyTable striped">
    			<tr>
    				<th>Field</th>
    				<th>Type</th>
    				<th>Description</th>
    			</tr>
    			<tr>
    				<td><b>event_id</b></td>
    				<td><code>int</code></td>
    				<td>The database id of the logging event.</td>
    			</tr>
    			<tr>
    				<td><b>mapped_key</b></td>
    				<td><code>varchar</code></td>
    				<td>The key of the <code>MDC</code> property</td>
    			</tr>		
    			<tr>
    				<td><b>mapped_value</b></td>
    				<td><code>text</code></td>
    				<td>The value of the <code>MDC</code> property</td>
    			</tr>				
    		</table>
    		
    		<p>
    			The <em>logging_event_exception</em> table contains the following fields:
    		</p>
    		
    		<table class="bodyTable striped">
    			<tr>
    				<th>Field</th>
    				<th>Type</th>
    				<th>Description</th>
    			</tr>
    			<tr>
    				<td><b>event_id</b></td>
    				<td><code>int</code></td>
    				<td>The database id of the logging event.</td>
    			</tr>
    			<tr>
    				<td><b>i</b></td>
    				<td><code>smallint</code></td>
    				<td>The index of the line in the full stack trace.</td>
    			</tr>		
    			<tr>
    				<td><b>trace_line</b></td>
    				<td><code>varchar</code></td>
    				<td>The corresponding line</td>
    			</tr>				
    		</table>
    		
    		<p>
    			To give a more visual example of the work done by <code>DBAppender</code>, here
    			is a screenshot of a MySQL database with content provided by <code>DBAppender</code>.
    		</p>
    		
    		<p>The <em>logging_event</em> table:</p>
    
    		<img src="images/chapters/appenders/dbAppenderLE.gif" alt="Logging Event table" />
    
    		<p>The <em>logging_event_exception</em> table:</p>
    		
    		<img src="images/chapters/appenders/dbAppenderLEException.gif" alt="Logging Event Exception table" />
    
    		<p>The <em>logging_event_property</em> table:</p>
    		
    		<img src="images/chapters/appenders/dbAppenderLEProperty.gif" alt="Logging Event Property table" />
    
    		
    		<h4>ConnectionSource</h4>
    		
    		<p>The <code>ConnectionSource</code> interface provides a
    		pluggable means of transparently obtaining JDBC connections for
    		logback classes that require the use of a
    		<code>java.sql.Connection</code>. There are currently three
    		implementations of <code>ConnectionSource</code>, namely
    		<code>DataSourceConnectionSource</code>,
    		<code>DriverManagerConnectionSource</code> and
    		<code>JNDIConnectionSource</code>.
    		</p>
    		
    		<p>
    			The first example that we will review is a configuration using
    			<code>DriverManagerConnectionSource</code> and a MySQL database.
    			The following configuration file is what one would need.
    		</p>
    		
        <p class="example">Example: <code>DBAppender</code> configuration (logback-examples/src/main/java/chapters/appenders/db/append-toMySQL-with-driverManager.xml)</p>
        <span class="asGroovy" onclick="return asGroovy('append-toMySQL-with-driverManager');">View as .groovy</span>	
        <pre id="append-toMySQL-with-driverManager" class="prettyprint source">&lt;configuration>
    
      <b>&lt;appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
        &lt;connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
          &lt;driverClass>com.mysql.jdbc.Driver&lt;/driverClass>
          &lt;url>jdbc:mysql://host_name:3306/datebase_name&lt;/url>
          &lt;user>username&lt;/user>
          &lt;password>password&lt;/password>
        &lt;/connectionSource>
      &lt;/appender></b>
      
      &lt;root level="DEBUG" >
        &lt;appender-ref ref="DB" />
      &lt;/root>
    &lt;/configuration></pre>
    
    		<p>
    			The correct driver must be declared. Here, the <code>com.mysql.jdbc.Driver</code>
    			class is used. The <span class="prop">url</span> must begin with <em>jdbc:myslq://</em>.
    		</p>
    		
    		<p>
    			The 
    			<a href="../xref/ch/qos/logback/core/db/DriverManagerConnectionSource.html">
    			<code>DriverManagerConnectionSource</code></a> is an implementation of
    			<code>ConnectionSource</code> that obtains the connection in the
    			traditional JDBC manner based on the connection URL.
    		</p>
    		<p>
    			Note that this class will establish a new
    			<code>Connection</code> for each call to
    			<code>getConnection()</code>. It is recommended that you either
    			use a JDBC driver that natively supports connection pooling or
    			that you create your own implementation of
    			<code>ConnectionSource</code> that taps into whatever pooling
    			mechanism you are already using. If you have access to a JNDI
    			implementation that supports <code>javax.sql.DataSource</code>,
    			e.g. within a J2EE application server, see <a
    			href="#JNDIConnectionSource"><code>JNDIConnectionSource</code></a>
    			below.
    		</p>
    <!-- 
    		
    		HAS TO BE TESTED
    
    		<p>
    			If you do not have another connection pooling mechanism built
    			into your application, you can use the
    			<a href="http://jakarta.apache.org/commons/dbcp/index.html">
    		  commons-dbcp </a> package from Apache:
    		</p>
    
    <pre class="prettyprint source">
      &lt;connectionSource
        class=&quot;ch.qos.logback.core.db.DriverManagerConnectionSource&quot;&gt;
        &lt;param name=&quot;driver&quot; value=&quot;org.apache.commons.dbcp.PoolingDriver&quot;/&gt; 
        &lt;param name=&quot;url&quot; value=&quot;jdbc:apache:commons:dbcp:/myPoolingDriver&quot;/&gt; 
      &lt;/connectionSource&gt;
    </pre>
    		
    		<p>
    			Then the configuration information for the commons-dbcp
    			package goes into the file <em>myPoolingDriver.jocl</em> and is
    			placed in the classpath. See the
    			<a href="http://jakarta.apache.org/commons/dbcp/index.html"> commons-dbcp </a>
    			documentation for details.
    		</p>
     -->
     
    		<p>Connecting to a database using a <code>DataSource</code> is
    		rather similar.  The configuration now uses <a
    		href="../xref/ch/qos/logback/core/db/DataSourceConnectionSource.html">
    		<code>DataSourceConnectionSource</code></a>, which is an
    		implementation of <code>ConnectionSource</code> that obtains the
    		<code>Connection</code> in the recommended JDBC manner based on a
    		<code>javax.sql.DataSource</code>.
    		</p>
    	
        <p class="example">Example: <code>DBAppender</code> configuration (logback-examples/src/main/java/chapters/appenders/db/append-with-datasource.xml)</p>	
    
    
        <span class="asGroovy" onclick="return asGroovy('append-with-datasource');">View as .groovy</span>	
        <pre id="append-with-datasource" class="prettyprint source">&lt;configuration  debug="true">
    
      &lt;appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
         <b>&lt;connectionSource class="ch.qos.logback.core.db.DataSourceConnectionSource">
           
           &lt;dataSource class="${dataSourceClass}">
           	 </b>&lt;!-- Joran cannot substitute variables
           	 that are not attribute values. Therefore, we cannot
           	 declare the next parameter like the others. 
           	 -->
             <b>&lt;param name="${url-key:-url}" value="${url_value}"/>
             &lt;serverName>${serverName}&lt;/serverName>
             &lt;databaseName>${databaseName}&lt;/databaseName>
           &lt;/dataSource></b>
           
           &lt;user>${user}&lt;/user>
           &lt;password>${password}&lt;/password>
         &lt;/connectionSource>
      &lt;/appender>
    
      &lt;root level="INFO">
        &lt;appender-ref ref="DB" />
      &lt;/root>  
    &lt;/configuration></pre>
    
    		<p>Note that in this configuration sample, we make heavy use of
    		substitution variables.  They are sometimes handy when connection
    		details have to be centralized in a single configuration file and
    		shared by logback and other frameworks.
    		</p>	
    		
    <!-- TO BE TESTED 
    
         <p>The connection created by
         <code>DataSourceConnectionSource</code> can be placed in a JNDI
         context by using <code>BindDataSourceToJNDIAction</code>. In that
         case, one has to specify the use of this class by adding a new
         rule to Joran, logback's configuration framework. Here is an
         excerpt of such a configuration file.  </p>
    		
    <div class="source"><pre>&lt;configuration>
      ..
      <b>&lt;newRule pattern="configuration/bindDataSourceToJNDI" 
               actionClass="ch.qos.logback.core.db.BindDataSourceToJNDIAction"/>
      	    
      &lt;bindDataSourceToJNDI /></b>
      ..
    &lt;/configuration></pre></div>
    
    		<p> The <em>newRule</em> element teaches Joran to use specified
    		action class with the given pattern.  Then, we simply declare the
    		given element. The action class will be called and our connection
    		source will be bound to a JNDI context.  </p>
    
    		<p>This is a very powerful capability of Joran. If you'd like to
    		read more about Joran, please see the <a
    		href="onJoran.html">chapter to Joran</a>.  </p>
    		
    		-->
    
        <h4 class="doAnchor"
        name="JNDIConnectionSource">JNDIConnectionSource</h4>
    
    		<p><a
    		href="../xref/ch/qos/logback/core/db/JNDIConnectionSource.html">
    		<code>JNDIConnectionSource</code></a> is another
    		<code>ConnectionSource</code> implementation shipping in logback.
    		As its name indicates, it retrieves a
    		<code>javax.sql.DataSource</code> from a JNDI and then leverages
    		it to obtain a <code>java.sql.Connection</code>
    		instance. <code>JNDIConnectionSource</code> is primarily designed
    		to be used inside J2EE application servers or by application
    		server clients, assuming the application server supports remote
    		access of <code>javax.sql.DataSource</code>.  Thus, one can take
    		advantage of connection pooling and whatever other goodies the
    		application server provides. More importantly, your application
    		will be <a
    		href="http://en.wikipedia.org/wiki/Don't_repeat_yourself">dryer</a>
    		as it will be no longer necessary to define a
    		<code>DataSource</code> in <em>logback.xml</em>.</p>
    
        <p>For example, here is a configuration snippet for Tomcat. It
        assumes PostgreSQL as the database although any of the supported
        database systems (listed above) would work.</p>
    
    <pre  class="prettyprint source">&lt;Context docBase="/path/to/app.war" path="/myapp">
      ...
      &lt;Resource <b>name="jdbc/logging"</b>
                   auth="Container"
                   type="javax.sql.DataSource"
                   username="..."
                   password="..."
                   driverClassName="org.postgresql.Driver"
                   url="jdbc:postgresql://localhost/..."
                   maxActive="8"
                   maxIdle="4"/>
      ...
    &lt;/Context></pre>
    		
       <p>Once a <code>DataSource</code> is defined in the J2EE server, it
       can be easily referenced by your logback configuration file, as
       shown in the next example.</p>
       
       <p class="example">Example: <code>DBAppender</code> configuration
       by <code>JNDIConnectionSource</code>
       (logback-examples/src/main/java/chapters/appenders/db/append-via-jndi.xml)</p>
    
        <span class="asGroovy" onclick="return asGroovy('append-via-jndi');">View as .groovy</span>	
     
    
    <pre id="append-via-jndi" class="prettyprint source">&lt;configuration debug="true">
      &lt;appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
        &lt;connectionSource class=&quot;ch.qos.logback.core.db.JNDIConnectionSource&quot;&gt;
          <b>&lt;!-- please note the "java:comp/env/" prefix --&gt;</b>
          <b>&lt;jndiLocation>java:comp/env/jdbc/logging&lt;/jndiLocation></b>
        &lt;/connectionSource&gt;
      &lt;/appender>
      &lt;root level="INFO">
        &lt;appender-ref ref="DB" />
      &lt;/root>  
    &lt;/configuration></pre>
    
    		<p>
    			Note that this class will obtain an
    			<code>javax.naming.InitialContext</code>
    			using the no-argument constructor. This will usually work
    			when executing within a J2EE environment. When outside the
    			J2EE environment, make sure that you provide a
    			<em>jndi.properties</em>
    			file as described by your JNDI provider's documentation.
    		</p>
    		
    		<h4 class="doAnchor">Connection pooling</h4>
    		
    		<p>Logging events can be created at a rather fast pace. To keep up
    		with the flow of events that must be inserted into a database, it
    		is recommended to use connection pooling with
    		<code>DBAppender</code>.
    		</p>
    		
    		<p>
    			Experiment shows that using connection pooling with <code>DBAppender</code>
    			gives a big performance boost. With the following
    			configuration file, logging events are sent to a MySQL database,
    			without any pooling.
    		</p>
        
        <p class="example">Example: <code>DBAppender</code> configuration
        without pooling
        (logback-examples/src/main/java/chapters/appenders/db/append-toMySQL-with-datasource.xml)</p>
    
        <span class="asGroovy" onclick="return asGroovy('append-toMySQL-with-datasource');">View as .groovy</span>	
        <pre id="append-toMySQL-with-datasource" class="prettyprint source">&lt;configuration>
    
      &lt;appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
        &lt;connectionSource class="ch.qos.logback.core.db.DataSourceConnectionSource">
          &lt;dataSource class="com.mysql.jdbc.jdbc2.optional.MysqlDataSource">
            &lt;serverName>${serverName}&lt;/serverName>
            &lt;port>${port$&lt;/port>
            &lt;databaseName>${dbName}&lt;/databaseName>
            &lt;user>${user}&lt;/user>
            &lt;password>${pass}&lt;/password>
          &lt;/dataSource>
        &lt;/connectionSource>
      &lt;/appender>
        
      &lt;root level="DEBUG">
        &lt;appender-ref ref="DB" />
      &lt;/root>
    &lt;/configuration></pre>
    
    		<p>With this configuration file, sending 500 logging events to a
    		MySQL database takes a whopping 5 seconds, that is 10 milliseconds
    		per request. This figure is unacceptable when dealing with large
    		applications.
    		</p>
    
    		<p>A dedicated external library is necessary to use connection
    		pooling with <code>DBAppender</code>. The next example uses <a
    		href="http://sourceforge.net/projects/c3p0">c3p0</a>. To be able
    		to use c3p0, one must download it and place
    		<em>c3p0-VERSION.jar</em> in the classpath.
    		</p>
    
        <p class="example">Example: <code>DBAppender</code> configuration
        with pooling
        (logback-examples/src/main/java/chapters/appenders/db/append-toMySQL-with-datasource-and-pooling.xml)</p>
        <span class="asGroovy" onclick="return asGroovy('append-toMySQL-with-datasource-and-pooling');">View as .groovy</span>	
        <pre id="append-toMySQL-with-datasource-and-pooling" class="prettyprint source">&lt;configuration>
    
      &lt;appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
        &lt;connectionSource
          class="ch.qos.logback.core.db.DataSourceConnectionSource">
          <b>&lt;dataSource
            class="com.mchange.v2.c3p0.ComboPooledDataSource">
            &lt;driverClass>com.mysql.jdbc.Driver&lt;/driverClass>
            &lt;jdbcUrl>jdbc:mysql://${serverName}:${port}/${dbName}&lt;/jdbcUrl>
            &lt;user>${user}&lt;/user>
            &lt;password>${password}&lt;/password>
          &lt;/dataSource></b>
        &lt;/connectionSource>
      &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="DB" />
      &lt;/root>
    &lt;/configuration></pre>
    
    		<p>With this new configuration, sending 500 logging requests to
    		the aforementioned MySQL database takes around 0.5 seconds, for an
    		average of 1 millisecond per request, that is a tenfold
    		improvement in performance.
    		</p>
    
    		<h3 class="doAnchor" name="SyslogAppender">SyslogAppender</h3>
    
    		<p>The syslog protocol is a very simple protocol: a syslog sender
    		sends a small message to a syslog receiver.  The receiver is
    		commonly called <em>syslog daemon</em> or <em>syslog server</em>.
    		Logback can send messages to a remote syslog daemon. This is
    		achieved by using <a
    		href="../xref/ch/qos/logback/classic/net/SyslogAppender.html"><code>SyslogAppender</code></a>.
    		</p>
    		
    		<p>Here are the properties you can pass to a SyslogAppender.</p>
    
    		<table class="bodyTable striped">
    			<tr>
    				<th>Property Name</th>
    				<th>Type</th>
    				<th>Description</th>
    			</tr>
    			<tr>
    				<td><span class="prop" container="syslog">syslogHost</span></td>
    				<td><code>String</code></td>
    				<td>The host name of the syslog server.</td>
    			</tr>
    			<tr>
    				<td><span class="prop" container="syslog">port</span></td>
    				<td><code>String</code></td>
    				<td>The port number on the syslog server to connect
    				to. Normally, one would not want to change the default value
    				of <em>514</em>.
    				</td>
    			</tr>
    			<tr>
    				<td><span class="prop" container="syslog">facility</span></td>
    				<td><code>String</code></td>
    				<td>
    					<p>The <span class="prop">facility</span> is meant to identify 
    						the source of a message.</p>
    					<p>The <span class="prop">facility</span> option must be set
    					to one of the strings <em>KERN, USER, MAIL, DAEMON, AUTH,
    					SYSLOG, LPR, NEWS, UUCP, CRON, AUTHPRIV, FTP, NTP, AUDIT,
    					ALERT, CLOCK, LOCAL0, LOCAL1, LOCAL2, LOCAL3, LOCAL4,
    					LOCAL5, LOCAL6, LOCAL7</em>. Case is not important.</p>
    				</td>
    			</tr>
          <tr>
            <td><span class="prop" container="syslog">suffixPattern</span></td>
    				<td><code>String</code></td>
    				<td><p>The <span class="prop">suffixPattern</span> option
    				specifies the format of the non-standardized part of the
    				message sent to the syslog server. By default, its value is
    				<em>[%thread] %logger %msg</em>. Any value that a
    				<code>PatternLayout</code> could use is a correct <span
    				class="prop">suffixPattern</span> value.
    					</p>
    				</td>
    			</tr>
    
          <tr>
            <td><span class="prop"
            container="syslog">stackTracePattern</span></td>
    				<td><code>String</code></td>
    				<td><p>The <span class="prop">stackTracePattern</span>
    				property allows the customization of the string appearing just
    				before each stack trace line. The default value for this
    				property is "\t", i.e. the tab character. Any value accepted
    				by <code>PatternLayout</code> is a valid value for <span
    				class="prop">stackTracePattern</span>.</p>
    				</td>
    			</tr>
    
    			<tr>
    				<td><span class="prop" container="syslog">throwableExcluded</span></td>
    				<td><code>boolean</code></td>
    				<td>Setting <span class="prop">throwableExcluded</span> to
    				<code>true</code> will cause stack trace data associated with
    				a Throwable to be omitted. By default, <span
    				class="prop">throwableExcluded</span> is set to
    				<code>false</code> so that stack trace data is sent to the
    				syslog server. </td>
    			</tr>
    
    
    		</table>
    		
    		<p>The syslog severity of a logging event is converted from the
    		level of the logging event.  The <em>DEBUG</em> level is converted
    		to <em>7</em>, <em>INFO</em> is converted to <em>6</em>,
    		<em>WARN</em> is converted to <em>4</em> and <em>ERROR</em> is
    		converted to <em>3</em>.
    		</p>
    		
    		<p>Since the format of a syslog request follows rather strict
    		rules, there is no layout to be used with
    		<code>SyslogAppender</code>. However, using the <span
    		class="prop">suffixPattern</span> option lets the user display
    		whatever information she wishes.
    		</p>
    		
    		<p>Here is a sample configuration using a
    		<code>SyslogAppender</code>.</p>
    		
        <p class="example">Example: <code>SyslogAppender</code> configuration (logback-examples/src/main/java/chapters/appenders/conf/logback-syslog.xml)</p>	
        <span class="asGroovy" onclick="return asGroovy('logback-syslog');">View as .groovy</span>	
        <pre id="logback-syslog" class="prettyprint source">&lt;configuration>
    
      &lt;appender name="SYSLOG" class="ch.qos.logback.classic.net.SyslogAppender">
        &lt;syslogHost>remote_home&lt;/syslogHost>
        &lt;facility>AUTH&lt;/facility>
        &lt;suffixPattern>[%thread] %logger %msg&lt;/suffixPattern>
      &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="SYSLOG" />
      &lt;/root>
    &lt;/configuration></pre>
    
    		<p>When testing this configuration, you should verify that the
    		remote syslog daemon accepts requests from an external
    		source. Experience shows that, by default, syslog daemons usually
    		deny requests coming via a network connection.
    		</p>
    		
    
        <h3 class="doAnchor" name="SiftingAppender">SiftingAppender</h3>
    
        <p>As its name implies, a <code>SiftingAppender</code> can be used
        to separate (or sift) logging according to a given runtime
        attribute. For example, <code>SiftingAppender</code> can separate
        logging events according to user sessions, so that the logs
        generated by different users go into distinct log files, one log
        file per user.
        </p>
    
    
        
        <table class="bodyTable striped">
    			<tr>
    				<th>Property Name</th>
    				<th>Type</th>
    				<th>Description</th>
    			</tr>
    			<tr>
    				<td><span class="prop" container="sift">timeout</span></td>
    				<td><code><a
    				href="../apidocs/ch/qos/logback/core/util/Duration.html">Duration</a></code></td>
    				<td>A nested appender which has not been accessed beyond the
    				<span class="prop">timeout</span> duration is deemed stale. A
    				stale appender is closed and unreferenced by
    				<code>SiftingAppender</code>. The dfault value for <span
    				class="prop">timeout</span> is 30 minutes.</td>
    			</tr>
    			<tr>
    				<td><span class="prop" container="sift">maxAppenderCount</span></td>
    				<td><code>integer</code></td>
    				<td>The maximum number of nested appenders
    				<code>SiftingAppender</code> may create and track. Default
    				value for <span class="prop">maxAppenderCount</span> is
    				Integer.MAX_VALUE.</td>
    			</tr>
      </table>
    
        <p><code>SiftingAppender</code> achieves this feat by creating
        nested appenders on the fly. Nested appenders are created based on
        a template specified within the configuration of the
        <code>SiftingAppender</code> itself (enclosed within the
        <code>&lt;sift></code> element, see example
        below). <code>SiftingAppender</code> is responsible for managing
        the lifecycle of child appenders. For example,
        <code>SiftingAppender</code> will automatically close and remove
        any stale appender. A nested appender is considered stale when no
        accesses it beyond the duration specified by the <span
        class="prop">timeout</span> parameter.
        </p>
    
        <p>When handling a logging event, <code>SiftingAppender</code>
        will select a child appender to delegate to. The selection
        criteria are computed at runtime by a discriminator. The user can
        specify the selection criteria with the help of a <code><a
        href="../xref/ch/qos/logback/core/sift/Discriminator.html">Discriminator</a></code>. Let
        us now study an eaxample.
        </p>
     
        <h4>Example</h4>
    
        <p>The <a
        href="../xref/chapters/appenders/sift/SiftExample.html">SiftExample</a>
        application logs a message stating that the application has
        started. It then sets the MDC key "userid" to "Alice" and logs a
        message. Here is the salient code:</p>
       
        <p class="source">logger.debug("Application started");
    MDC.put("userid", "Alice");
    logger.debug("Alice says hello"); </p>
    
        <p>The template for the configuration file illustrates the use of
        <code>SiftingAppender</code>.</p>
    
    
        <p class="example">Example: <code>SiftingAppender</code>
        configuration
        (logback-examples/src/main/java/chapters/appenders/sift/byUserid.xml)</p>
    
        <span class="asGroovy" onclick="return asGroovy('byUserid');">View as .groovy</span>
    
        <pre id="byUserid" class="prettyprint source">&lt;configuration>
    
      <b>&lt;appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender"></b>
        &lt;!-- in the absence of the class attribute, it is assumed that the
             desired discriminator type is
             ch.qos.logback.classic.sift.MDCBasedDiscriminator -->
        <b>&lt;discriminator></b>
          <b>&lt;key><span class="green">userid</span>&lt;/key></b>
          <b>&lt;defaultValue>unknown&lt;/defaultValue></b>
        <b>&lt;/discriminator></b>
        <b>&lt;sift></b>
          <b>&lt;appender name="FILE-<span class="green">${userid}</span>" class="ch.qos.logback.core.FileAppender"></b>
            <b>&lt;file><span class="green">${userid}</span>.log&lt;/file></b>
            <b>&lt;append>false&lt;/append></b>
            <b>&lt;layout class="ch.qos.logback.classic.PatternLayout"></b>
              <b>&lt;pattern>%d [%thread] %level %mdc %logger{35} - %msg%n&lt;/pattern></b>
            <b>&lt;/layout></b>
          <b>&lt;/appender></b>
        <b>&lt;/sift></b>
      &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="SIFT" />
      &lt;/root>
    &lt;/configuration></pre>
        
        
        <p>In the absence of a class attribute, it is assumed that the
        discriminator type is <a
        href="../xref/ch/qos/logback/classic/sift/MDCBasedDiscriminator.html">MDCBasedDiscriminator</a>.
        The discrimating value is the MDC value associated with the key
        given by the <span class="prop">key</span> property. However, if
        that MDC value is null, then <span
        class="prop">defaultValue</span> is used as the discrimating
        value.
        </p>
    
        <p>The <code>SiftingAppender</code> is unique in its capacity to
        reference and configure child appenders. In the above example,
        <code>SiftingAppender</code> will create multiple
        <code>FileAppender</code> instances, each
        <code>FileAppender</code> instance identified by the value
        associated with the "userid" MDC key. Whenever the "userid" MDC
        key is assigned a new value, a new <code>FileAppender</code>
        instance will be built from scratch. The
        <code>SiftingAppender</code> keeps track of the appenders it
        creates. Appenders unused for 30 minutes will be automatically
        closed and discarded.
        </p>
    
        <p><span class="label notice">Variable export</span> It is not
        enough to have different appender instances; each instance must
        output to a distinct target resource. To allow such
        differentiation, within the appender template, the key passed to
        the discriminator, "userid" in the above example, is exported and
        becomes a <a
        href="configuration.html#variableSubstitution">variable</a>. Consequently,
        this variable can be used to differentiate the actual resource
        used by a given child appender.
        </p>
    
        <p>Running the <code>SiftExample</code> application with the
        "byUserid.xml" configuration file shown above, will result in two
        distinct log files, "unknown.log" and "Alice.log".
    		</p>
    
        <p><span class="label">local-scoped variables</span> As of version
        1.0.12, properties defined in local scope within the configuration
        file will be available to nested appenders. Moreover, you can <a
        href="configuration.html#definingProps">define variables</a> or <a
        href="configuration.html#definingPropsOnTheFly">dynamically
        compute</a> variables from <em>within</em> the the
        <code>&lt;sift></code> element. Combining a variable from parts
        defined outside and within the <code>&lt;sift></code> element is
        also supported.
        </p>
    
        <h4 class="doAnchor" name="siftGettingTimeoutRight">Getting the
        <span class="prop">timeout</span> right</h4>
    
        <p>For certain types of applications, it may be difficult to get
        the <span class="prop">timeout</span> parameter right. If the
        <span class="prop">timeout</span> is too small, a nested appender
        might be removed just to be created anew a few seconds later. This
        phenomenon is called <em>trashing</em>. If the <span
        class="prop">timeout</span> is too long and appenders are created
        in quick succession, you might run out of resources. Similarly,
        setting <span class="prop">maxAppenderCount</span> too low might
        cause trashing as well.
        </p>
    
        <p>In many case, it may be easier to pinpoint a location in your
        code after which a nested appender is no longer needed. If such a
        location exists, even approximately, log from that location using
        the <a
        href="../apidocs/ch/qos/logback/classic/ClassicConstants.html#FINALIZE_SESSION_MARKER">FINALIZE_SESSION</a>
        marker. Whenever SiftingAppender sees a logging event marked as
        <code>FINALIZE_SESSION</code> it will end-of-life the associated
        nested appender. Upon reaching its end-of-life, a nested appender
        will linger for a few seconds to process any late coming events
        (if any) and then will be closed.
        </p>
        
        <pre class="prettyprint source">import org.slf4j.Logger;
    import static ch.qos.logback.classic.ClassicConstants.FINALIZE_SESSION_MARKER;
    
      void job(String jobId) {
       
        MDC.put("jobId", jobId);
        logger.info("Starting job.");
    
        ... do whather the job needs to do
        
        // will cause the nested appender reach end-of-life. It will
        // linger for a few seconds.
        logger.info(FINALIZE_SESSION_MARKER, "About to end the job");
    
        try {
          .. perform clean up
        } catch(Exception e);  
          // This log statement will be handled by the lingering appender. 
          // No new appender will be created.
          logger.error("unexpected error while cleaning up", e);
        }
      }
    
    </pre>
    
        <h3 class="doAnchor" name="AsyncAppender">AsyncAppender</h3>
    
        <p>AsyncAppender logs <a
        href="../apidocs/ch/qos/logback/classic/spi/ILoggingEvent.html">ILoggingEvent</a>s
        asynchronously. It acts solely as an event dispatcher and must
        therefore reference another appender in order to do anything
        useful. In order to avoid loss of logging events, this appender
        should be closed. It is the user's responsibility to close
        appenders, typically at the end of the application lifecycle.
        </p>
    
        <p><span class="label notice">Lossy by default if 80% full</span>
        AsyncAppender buffers events in a <a
        href="http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/BlockingQueue.html">
        BlockingQueue</a>. A worker thread created by
        <code>AsyncAppender</code> takes events from the head of the
        queue, and dispatches them to the single appender attached to
        <code>AsyncAppender</code>. Note that by default,
        <code>AsyncAppender</code> will drop events of level TRACE, DEBUG
        and INFO if its queue is 80% full. This strategy has an amazingly
        favorable effect on performance at the cost of event loss.
        </p>
    
        <p>Here is the list of properties admitted by
        <code>AsyncAppender:</code></p>
    
    		<table class="bodyTable striped">
          <tr>
            <th>Property Name</th>
            <th>Type</th>
            <th>Description</th>
          </tr>
    			<tr>
            <td><span class="prop" container="async">queueSize</span></td>
            <td><code>int</code></td>
            <td>The maximum capacity of the blocking queue. By default,
            <span class="prop">queueSize</span> is set to 256.
    				</td>
    			</tr>
          <tr>
            <td><span class="prop" container="async">discardingThreshold</span></td>
            <td><code>int</code></td>
            <td>By default, when the blocking queue has 20% capacity
            remaining, it will drop events of level TRACE, DEBUG and INFO,
            keeping only events of level WARN and ERROR. To keep all
            events, set <span class="prop">discardingThreshold</span> to
            0.
    			</td>
    			</tr>
          <tr>
            <td><span class="prop" container="async">includeCallerData</span></td>
            <td><code>boolean</code></td>
            <td>Extracting caller data can be rather expensive. To improve
            performance, by default, caller data associated with an event
            is not extracted when the event added to the event queue. By
            default, only "cheap" data like the thread name and the <a
            href="mdc.html">MDC</a> are copied. You can direct this
            appender to include caller data by setting the <span
            class="prop">includeCallerData</span> property to true.
            </td>
          </tr>
        </table>
    
        <p>By default, event queue is configured with a maximum capacity
        of 256 events.  If the queue is filled up, then application
        threads are blocked from logging new events until the worker
        thread has had a chance to dispatch one or more events. When the
        queue is no longer at its maximum capacity, application threads
        are able to start logging events once again. Asynchronous logging
        therefore becomes pseudo-synchronous when the appender is
        operating at or near the capacity of its event buffer. This is not
        necessarily a bad thing. The appender is designed to allow the
        application to keep on running, albeit taking slightly more time
        to log events until the pressure on the appenders buffer eases.
        </p>
    
        <p>Optimally tuning the size of the appenders event queue for
        maximum application throughput depends upon several factors. Any
        or all of the following factors are likely to cause
        pseudo-synchronous behavior to be exhibited:</p>
      
        <ul>
          <li>Large numbers of application threads</li>
          <li>Large numbers of logging events per application call</li>
          <li>Large amounts of data per logging event</li>
          <li>High latency of child appenders</li>
        </ul>
    
        <p>To keep things moving, increasing the size of the queue will
        generally help, at the expense of heap available to the
        application.
        </p>
    
        
        <p><span class="label notice">Lossy behavior</span> In light of
        the discussion above and in order to reduce blocking, by default,
        when less than 20% of the queue capacilty remains,
        <code>AsyncAppender</code> will drop events of level TRACE, DEBUG
        and INFO keeping only events of level WARN and ERROR. This
        strategy ensures non-blocking handling of logging events (hence
        excellent performance) at the cost loosing events of level TRACE,
        DEBUG and INFO when the queue has less than 20% capacity. Event
        loss can be prevented by setting the <span
        class="prop">discardingThreshold</span> property to 0 (zero).
        </p>
    
        <p class="example">Example: <code>AsyncAppender</code>
        configuration
        (logback-examples/src/main/java/chapters/appenders/conc/logback-async.xml)</p>
    
        <span class="asGroovy" onclick="return asGroovy('asyncAppender');">View as .groovy</span>
    
        <pre id="asyncAppender" class="prettyprint source">&lt;configuration>
      &lt;appender name="<b>FILE</b>" class="ch.qos.logback.core.FileAppender">
        &lt;file>myapp.log&lt;/file>
        &lt;encoder>
          &lt;pattern>%logger{35} - %msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      <b>&lt;appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender"></b>
        <b>&lt;appender-ref ref="FILE" /></b>
      <b>&lt;/appender></b>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="<b>ASYNC</b>" />
      &lt;/root>
    &lt;/configuration></pre>
      
    
    		<h3 class="doAnchor" name="WriteYourOwnAppender">Writing your own
    		Appender</h3>
    
    
        <p>You can easily write your appender by subclassing
        <code>AppenderBase</code>.  It handles support for filters, status
        messages and other functionality shared by most appenders.  The
        derived class only needs to implement one method, namely
        <code>append(Object eventObject)</code>.
        </p>
    
        <p>The <code>CountingConsoleAppender</code>, which we list next,
        appends a limited number of incoming events on the console. It
        shuts down after the limit is reached.  It uses a
        <code>PatternLayoutEncoder</code> to format the events and accepts
        a parameter named <code>limit</code>. Therefore, a few more
        methods beyond <code>append(Object eventObject)</code> are
        needed. As shown below, these parameters are handles
        auto-magically by logback's various configuration mechanisms.
        </p>
        
        <em>Example 4.<span class="autoExec"/>:
        <code>CountingConsoleAppender</code>
        (logback-examples/src/main/java/chapters/appenders/CountingConsoleAppender.java)</em>
        <pre class="prettyprint source">package chapters.appenders;
    
    import java.io.IOException;
    
    import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.AppenderBase;
    
    
    public class CountingConsoleAppender extends AppenderBase&lt;ILoggingEvent> {
      static int DEFAULT_LIMIT = 10;
      int counter = 0;
      int limit = DEFAULT_LIMIT;
      
      PatternLayoutEncoder encoder;
      
      public void setLimit(int limit) {
        this.limit = limit;
      }
    
      public int getLimit() {
        return limit;
      }
      
      @Override
      public void start() {
        if (this.encoder == null) {
          addError("No encoder set for the appender named ["+ name +"].");
          return;
        }
        
        try {
          encoder.init(System.out);
        } catch (IOException e) {
        }
        super.start();
      }
    
      public void append(ILoggingEvent event) {
        if (counter >= limit) {
          return;
        }
        // output the events as formatted by our layout
        try {
          this.encoder.doEncode(event);
        } catch (IOException e) {
        }
    
        // prepare for next event
        counter++;
      }
    
      public PatternLayoutEncoder getEncoder() {
        return encoder;
      }
    
      public void setEncoder(PatternLayoutEncoder encoder) {
        this.encoder = encoder;
      }
    }</pre>
    
    		<p>The <code>start()</code> method checks for the presence of a
    		<code>PatternLayoutEncoder</code>.  In case the encoder is not
    		set, the appender fails to start and emits an error message.
    		</p>
    		
    		<p>This custom appender illustrates two points:</p>
    		
    		<ul>
    
          <li>All properties that follow the setter/getter JavaBeans
          conventions are handled transparently by logback
          configurators. The <code>start()</code> method, which is called
          automatically during logback configuration, has the
          responsibility of verifying that the various properties of the
          appender are set and are coherent.
    			</li>
    
    			<li>The <code>AppenderBase.doAppend()</code> method invokes the
    			append() method of its derived classes.  Actual output
    			operations occur in the <code>append</code>() method.  In
    			particular, it is in this method that appenders format events by
    			invoking their layouts.
    			</li>
    		</ul>
    		
    		<p>The <a
    		href="../xref/chapters/appenders/CountingConsoleAppender.html"><code>CountingConsoleAppender</code></a>
    		can be configured like any other appender.  See sample
    		configuration file
    		<em>logback-examples/src/main/java/chapters/appenders/countingConsole.xml</em>
    		for an example.
    		</p>
      
    
    		<h2 class="doAnchor" name="logback_access">Logback Access</h2>
    		
    		<p>Most of the appenders found in logback-classic have their
    		equivalent in logback-access. These work essentially in the same
    		way as their logback-classic counterparts. In the next section, we
    		will cover their use.
    		</p>
    		
    		<h3 class="doAnchor" name="AccessSocketAppender">SocketAppender
    		and SSLSocketAppender</h3>
    		
    		<p>The <a
    		href="../xref/ch/qos/logback/access/net/SocketAppender.html">
    		<code>SocketAppender</code></a> is designed to log to a remote
    		entity by transmitting serialized <code>AccessEvent</code> objects
    		over the wire.  Remote logging is non-intrusive as far as the
    		access event is concerned.  On the receiving end after
    		deserialization, the event can be logged as if it were generated
    		locally.
    		</p>
    		
    		<p>The <a href="../xref/ch/qos/logback/access/net/SSLSocketAppender.html">
        <code>SSLSocketAppender</code></a> extends the basic 
        <code>SocketAppender</code></a> allowing logging to a remote entity over 
        the Secure Sockets Layer (SSL).
        </p>
        
    		<p>
    			The properties of access' <code>SocketAppender</code> are the same as those available
    			for classic's <code>SocketAppender</code>.
    		</p>
    
        <h3 class="doAnchor"
        name="AccessServerSocketAppender">ServerSocketAppender and
        SSLServerSocketAppender</h3>
        
        <p>Like <code>SocketAppender</code>, the <a
        href="../xref/ch/qos/logback/access/net/server/ServerSocketAppender.html">
        <code>ServerSocketAppender</code></a> is designed to log to a remote
        entity by transmitting serialized <code>AccessEvent</code> objects
        over the wire.  However, when using <code>ServerSocketAppender</code>
        the appender acts as a server, passively listening on a TCP socket awaiting
        inbound connections from interested clients.  Logging events delivered
        to the appender are distributed to all connected clients.
        </p>
        
        <p>The <a href="../xref/ch/qos/logback/access/net/server/SSLServerSocketAppender.html">
        <code>SSLSocketAppender</code></a> extends the basic 
        <code>ServerSocketAppender</code></a> allowing logging to a remote entity 
        over the Secure Sockets Layer (SSL).
        </p>
        
        <p>The properties of access' <code>ServerSocketAppender</code> are
        the same as those available for classic's
        <code>ServerSocketAppender</code>.
        </p>
        
    	 	
    		<h3 class="doAnchor" name="AccessSMTPAppender">SMTPAppender</h3>
    		
    		<p>Access' <a
    		href="../xref/ch/qos/logback/access/net/SMTPAppender.html">
    		<code>SMTPAppender</code></a> works in the same way as its Classic
    		counterpart.  However, the <span class="prop">evaluator</span>
    		option is rather different.  By default, a
    		<code>URLEvaluator</code> object is used by
    		<code>SMTPAppender</code>. This evaluator contains a list of URLs
    		that are checked against the current request's URL. When one of
    		the pages given to the <code>URLEvaluator</code> is requested,
    		<code>SMTPAppender</code> sends an email.
    		</p>
    		
    		<p>
    			Here is a sample configuration of a <code>SMTPAppender</code> in the access environment.
    		</p>
        <p class="example">Example: <code>SMTPAppender</code>
        configuration
        (logback-examples/src/main/java/chapters/appenders/conf/access/logback-smtp.xml)</p>
    
    <pre class="prettyprint source">&lt;appender name="SMTP"
      class="ch.qos.logback.access.net.SMTPAppender">
      &lt;layout class="ch.qos.logback.access.html.HTMLLayout">
        &lt;pattern>%h%l%u%t%r%s%b&lt;/pattern>
      &lt;/layout>
        
      <b>&lt;Evaluator class="ch.qos.logback.access.net.URLEvaluator">
        &lt;URL>url1.jsp&lt;/URL>
        &lt;URL>directory/url2.html&lt;/URL>
      &lt;/Evaluator></b>
      &lt;from>sender_email@host.com&lt;/from>
      &lt;smtpHost>mail.domain.com&lt;/smtpHost>
      &lt;to>recipient_email@host.com&lt;/to>
    &lt;/appender></pre>
    
    		<p>This way of triggering the email lets users select pages that
    		are important steps in a specific process, for example.  When such
    		a page is accessed, the email is sent with the pages that were
    		accessed previously, and any information the user wants to be
    		included in the email.
    		</p>
    
    		<h3 class="doAnchor" name="AccessDBAppender">DBAppender</h3>
    		
    		<p><a
    		href="../xref/ch/qos/logback/access/db/DBAppender.html"><code>DBAppender</code></a>
    		is used to insert the access events into a database.
    		</p>
    
    		<p>Two tables are used by <code>DBAppender</code>:
    		<em>access_event</em> and <em>access_event_header</em>. They both
    		must exist before <code>DBAppender</code> can be used. Logback
    		ships with SQL scripts that will create the tables.  They can be
    		found in the
    		<em>logback-access/src/main/java/ch/qos/logback/access/db/script</em>
    		directory. There is a specific script for each of the most popular
    		database systems.  If the script for your particular type of
    		database system is missing, it should be quite easy to write one,
    		taking as example one of the existing scripts. You are encouraged
    		to contribute such missing scripts back to the project.
    		</p>
    		
    		<p>The <em>access_event</em> table's fields are described below:</p>
    
    		<table class="bodyTable striped">
    			<tr>
    				<th>Field</th>
    				<th>Type</th>
    				<th>Description</th>
    			</tr>
    			<tr>
    				<td><b>timestamp</b></td>
    				<td><code>big int</code></td>
    				<td>The timestamp that was valid at the access event's creation.</td>
    			</tr>
    			<tr>
    				<td><b>requestURI</b></td>
    				<td><code>varchar</code></td>
    				<td>The URI that was requested.</td>
    			</tr>
    			<tr>
    				<td><b>requestURL</b></td>
    				<td><code>varchar</code></td>
    				<td>The URL that was requested. This is a string composed of the request method,
    				the request URI and the request protocol.
    				</td>
    			</tr>
    			<tr>
    				<td><b>remoteHost</b></td>
    				<td><code>varchar</code></td>
    				<td>The name of the remote host.</td>
    			</tr>
    			<tr>
    				<td><b>remoteUser</b></td>
    				<td><code>varchar</code></td>
    				<td>
    					The name of the remote user.
    				</td>
    			</tr>
    			<tr>
    				<td><b>remoteAddr</b></td>
    				<td><code>varchar</code></td>
    				<td>The remote IP address.</td>
    			</tr>
    			<tr>
    				<td><b>protocol</b></td>
    				<td><code>varchar</code></td>
    				<td>The request protocol, like <em>HTTP</em> or <em>HTTPS</em>.</td>
    			</tr>
    			<tr>
    				<td><b>method</b></td>
    				<td><code>varchar</code></td>
    				<td>The request method, usually <em>GET</em> or <em>POST</em>.</td>
    			</tr>
    			<tr>
    				<td><b>serverName</b></td>
    				<td><code>varchar</code></td>
    				<td>The name of the server that issued the request.</td>
    			</tr>
    			<tr>
    				<td><b>event_id</b></td>
    				<td><code>int</code></td>
    				<td>The database id of the access event.</td>
    			</tr>
    		</table>
    		
    		<p>
    			The <em>access_event_header</em> table contains the header of each
    			request. The information is organised as shown below:
    		</p>
    
    		<table class="bodyTable striped">
    			<tr>
    				<th>Field</th>
    				<th>Type</th>
    				<th>Description</th>
    			</tr>
    			<tr>
    				<td><b>event_id</b></td>
    				<td><code>int</code></td>
    				<td>The database id of the corresponding access event.</td>
    			</tr>
    			<tr>
    				<td><b>header_key</b></td>
    				<td><code>varchar</code></td>
    				<td>The header name, for example <em>User-Agent</em>.</td>
    			</tr>
    			<tr>
    				<td><b>header_value</b></td>
    				<td><code>varchar</code></td>
    				<td>The header value, for example <em>Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1) Gecko/20061010 Firefox/2.0</em></td>
    			</tr>
    			</table>
    
    		<p>All properties of classic's <code>DBAppender</code> are available
    			in access's <code>DBAppender</code>. The latter offers one more option,
    			described below.
    		</p>
    		
    		<table class="bodyTable striped">
    			<tr>
    				<th>Property Name</th>
    				<th>Type</th>
    				<th>Description</th>
    			</tr>
    			<tr>
    				<td>
    					<b>
    						<span class="prop">insertHeaders</span>
    					</b>
    				</td>
    				<td>
    					<code>boolean</code>
    				</td>
    				<td>
    					Tells the <code>DBAppender</code> to populate the database with the header
    					information of all incoming requests.
    				</td>
    			</tr>
    		</table>
    
    		<p>Here is a sample configuration that uses <code>DBAppender</code>.</p>
    
        <p class="example">Example: DBAppender configuration <em>(logback-examples/src/main/java/chapters/appenders/conf/access/logback-DB.xml)</em></p>
        
        <pre class="prettyprint source">&lt;configuration>
    
      &lt;appender name="DB" class="ch.qos.logback.access.db.DBAppender">
        &lt;connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
          &lt;driverClass>com.mysql.jdbc.Driver&lt;/driverClass>
          &lt;url>jdbc:mysql://localhost:3306/logbackdb&lt;/url>
          &lt;user>logback&lt;/user>
          &lt;password>logback&lt;/password>
        &lt;/connectionSource>
        &lt;insertHeaders>true&lt;/insertHeaders>
      &lt;/appender>
    
      &lt;appender-ref ref="DB" />
    &lt;/configuration></pre>
    
    
        <h3 class="doAnchor"
        name="AccessSiftingAppender">SiftingAppender</h3>
       
        <p>The SiftingAppender in logback-access is quite similar to its
        logback-classic counterpart. The main difference is that in
        logback-access the default discriminator, namely <a
        href="../xref/ch/qos/logback/access/sift/AccessEventDiscriminator.html">AccessEventDiscriminator</a>,
        is not MDC based. As its name suggests, AccessEventDiscriminator,
        uses a designated field in AccessEvent as the basis for selecting a
        nested appender. If the value of the designated field is null,
        then the value specified in the <span
        class="prop">defaultValue</span> property is used.
        </p>
    
        <p>The designated AccessEvent field can be one of COOKIE,
        REQUEST_ATTRIBUTE, SESSION_ATTRIBUTE, REMOTE_ADDRESS, LOCAL_PORT,
        REQUEST_URI. Note that the first three fields require that the
        <span class="prop">AdditionalKey</span> property also be
        specified.</p>
        
        <p>Below is an example configuration file.</p>
    
        <p class="example">Example: SiftingAppender configuration (logback-examples/src/main/java/chapters/appenders/conf/sift/access-siftingFile.xml)</p>
        
        <pre class="prettyprint source">&lt;configuration>
      &lt;appender name="SIFTING" class="ch.qos.logback.access.sift.SiftingAppender">
        &lt;Discriminator class="ch.qos.logback.access.sift.AccessEventDiscriminator">
          &lt;Key>id&lt;/Key>
          &lt;FieldName>SESSION_ATTRIBUTE&lt;/FieldName>
          &lt;AdditionalKey>username&lt;/AdditionalKey>
          &lt;defaultValue>NA&lt;/defaultValue>
        &lt;/Discriminator>
        &lt;sift>
           &lt;appender name="${id}" class="ch.qos.logback.core.FileAppender">
            &lt;file>byUser/${id}.log&lt;/file>
            &lt;layout class="ch.qos.logback.access.PatternLayout">
              &lt;pattern>%h %l %u %t \"%r\" %s %b&lt;/pattern>
            &lt;/layout>
          &lt;/appender>
        &lt;/sift>
      &lt;/appender>
      &lt;appender-ref ref="SIFTING" />
    &lt;/configuration></pre>
    
    
        <p>In the above configuration file, a <code>SiftingAppender</code>
        nests <code>FileAppender</code> instances. The key "id" is
        designated as a variable which will be available to the nested
        <code>FileAppender</code> instances. The default discriminator,
        namely <code>AccessEventDiscriminator</code>, will search for a
        "username" session attribute in each <code>AccessEvent</code>. If
        no such attribute is available, then the default value "NA" will
        be used.  Thus, assuming the session attribute named "username"
        contains the username of each logged on user, there will be a log
        file under the <em>byUser/</em> folder (of the current folder)
        named after each user containing the access logs for that user.
        </p>
    
    
        <script src="../templates/footer.js" type="text/javascript"></script>
    
    
      </div>
      
    </body>
    </html>
    ���������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/manual/jmxConfig.html������������������������������������0000644�0001750�0001750�00000035636�12021754417�024461� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
    
        <link rel="stylesheet" type="text/css" href="../css/common.css" />
        <link rel="stylesheet" type="text/css" href="../css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="../css/_print.css" media="print" />
        <link rel="stylesheet" type="text/css" href="../css/prettify.css" media="screen" />
    
        <title>Chapter 10: JMX Configuration</title>
      </head>
      <body onload="prettyPrint(); decorate();">
        <script type="text/javascript">prefix='../';</script>
        <script type="text/javascript" src="../js/prettify.js"></script>
        <script type="text/javascript" src="../templates/header.js"></script>
        <script type="text/javascript" src="../js/jquery-min.js"></script>
        <script type="text/javascript" src="../js/decorator.js"></script>
        
        <div id="left">
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="../templates/left.js" type="text/javascript"></script>
        </div>
        <div id="right">
          <script src="menu.js" type="text/javascript"></script>
        </div>
        <div id="content">
    	
        <h1>Chapter 10: JMX Configurator</h1>
        
    		<p>As its name indicates, <code>JMXConfigurator</code> allows
    		configuration of logback via JMX. In a nutshell, it lets you
    		reconfigure logback from the default configuration file, from a
    		designated file or URL, list loggers and modify logger levels.
    		</p>
    		
    		<h3>Using the JMX Configurator</h3>
        
        
    		<p>If your server run on JDK 1.6 or later, then you can just
    		invoke the <code>jconsole</code> application on the command line and
    		then connect to your server's MBeanServer. If you are running an
    		older JVM, then you should read the section on <a
    		href="#jmxEnablingServer">JMX enabling your server</a>.
        </p>
    
        <p><code>JMXConfigurator</code> is enabled by a single line in
        your logback configuration file, as shown below:
    		</p>
    
        <pre class="prettyprint source">&lt;configuration>
      <b>&lt;jmxConfigurator /></b>
      
      &lt;appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        &lt;layout class="ch.qos.logback.classic.PatternLayout">
          &lt;Pattern>%date [%thread] %-5level %logger{25} - %msg%n&lt;/Pattern>
        &lt;/layout>
      &lt;/appender>
    
      &lt;root level="debug">
        &lt;appender-ref ref="console" />
      &lt;/root>  
    &lt;/configuration></pre>
    		
        <p>After you connect to your server with <em>jconsole</em>, on the
        MBeans panel, under "ch.qos.logback.classic.jmx.Configurator"
        folder you should see several operations to choose from, as shown
        in the figure below:
        </p>
        
        <h3 class="doAnchor" name="jmxConfigurator">Screen-shot of
        <code>JMXConfigurator</code> viewed in <code>jconsole</code></h3>
    
        <img src="images/chapters/jmxConfigurator/jmxConfigurator.gif" alt="jmxConfigurator"/>   
    
    		<p>Thus, you can</p>
    		
    		<ul>
          <li>Reload logback configuration using the default configuration
          file.</li>
    
          <li>Reload the configuration with the specified URL.</li>
          <li>Reload the configuration with the specified file.</li>
    
    			<li>Set the level of a specified logger. To set to null, pass
    			the string "null" as value.</li>
          <li>Get the level of a specified logger. The returned value can be
          null.</li>
    			<li>Get the <a href="architecture.html#effectiveLevel">effective
    			level</a> of a specified logger.</li>
    		</ul>
    		
        <p><code>JMXConfigurator</code> exposes the list of existing
        loggers and a status list as attributes.</p>
        
        <p>The status list can help you diagnose logback's internal
        state.</p>
    
        <img src="images/chapters/jmxConfigurator/statusList.gif" alt="statusList.gif"/>   
    
        <h3 class="doAnchor" name="leak">Avoiding memory leaks</h3>
    
        <p>If your application is deployed in a web-server or an
        application server, the registration of an
        <code>JMXConfigurator</code> instance creates a reference from the
        system class loader into your application which will prevent it
        from being garbage collected when it is stopped or re-deployed,
        resulting in a severe memory leak.</p>
    
        <p>Thus, unless your application is a standalone Java application,
        you MUST unregister the <code>JMXConfigurator</code> instance from
        the JVM's Mbeans server. Invoking the <code>reset</code>() method
        of the appropriate <code>LoggerContext</code> will automatically
        unregister any JMXConfigurator instance. A good place to reset the
        logger context is in the <code>contextDestroyed</code>()
        method of a
        <code>javax.servlet.ServletContextListener</code>. Here is sample
        code:</p>
    
        <pre class="prettyprint source">import javax.servlet.ServletContextEvent;
    import javax.servlet.ServletContextListener;
    
    import org.slf4j.LoggerFactory;
    import ch.qos.logback.classic.LoggerContext;
    
    public class MyContextListener implements ServletContextListener {
    
      public void contextDestroyed(ServletContextEvent sce) {
        <b>LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();</b>
        <b>lc.stop();</b>
      }
    
      public void contextInitialized(ServletContextEvent sce) {
      }
    } </pre>
    
    
        <!-- ============ Multiple web-applications  ================== -->
    
        
        <h2 class="doAnchor" name="multiple"><code>JMXConfigurator</code>
        with multiple web-applications</h2>
    
        <p>If you deploy multiple web-applications in the same server,
        and if you have not overridden the default <a
        href="contextSelector.html">context selector</a>, and if you
        have placed a copy of <em>logback-*.jar</em> and
        <em>slf4j-api.jar</em> under the <em>WEB-INF/lib</em> folder of
        each web-application, then by default each <code>JMXConfigurator</code>
        instance will be registered under the same name, that is,
        "ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator". In
        other words, by default the various <code>JMXConfigurator</code>
        instances associated with the logger contexts in each of your
        web-applications will collide.
        </p>
        
        <p>To avoid such undesirable collisions, you simply <a
        href="configuration.html#contextName">set the name of your
        application's logging context</a> and <code>JMXConfigurator</code>
        will automatically use the name you have set.
        </p>
    
        <p>For example, if you deploy two web-applications named "Koala"
        and "Wombat", then you would write in Koala's logback
        configuration
        </p>
        
        <pre class="prettyprint source">&lt;configuration>
      <b>&lt;contextName>Koala&lt;/contextName></b>
      &lt;jmxConfigurator/>
      ...
    &lt;configuration></pre>
    
        <p>and in Wombat logback configuration file, you would write:</p>
    
        <pre class="prettyprint source">&lt;configuration>
      <b>&lt;contextName>Wombat&lt;/contextName></b>x
      &lt;jmxConfigurator/>
      ...
    &lt;configuration></pre>
    
        <p>In jconsole's MBeans panel, you would see two distinct
        <code>JMXConfigurator</code> instances:</p>
    
        <img src="images/chapters/jmxConfigurator/multiple.gif" alt="multiple.gif"/>   
    
        <p>You may fully control the name under which JMXConfigurator is
        registered with an MBeans server with the help of the "objectName"
        attribute of the <code>&lt;jmxConfigurator></code> element.</p>
        
        <!-- ============ JMX enabling your  server ================== -->
    
        <h3 class="doAnchor" name="jmxEnablingServer">JMX enabling your
        server</h3>
    
        <p>If your server runs with JDK 1.6 or later, your server should
        be JMX enabled by default.</p>
    
    		<p>For older JVMs, we suggest that you refer to the JMX-related
    		documentation of your web-server. Such documentation is available
    		for both <a
    		href="http://tomcat.apache.org/tomcat-6.0-doc/monitoring.html">Tomcat</a>
    		and <a
    		href="http://docs.codehaus.org/display/JETTY/JMX">Jetty</a>. In
    		this document, we briefly describe the required configuration
    		steps for Tomcat and Jetty.
    		</p>
    
        <!-- ================ Configuring Jetty ================== -->
    
    		<h4>Enabling JMX in Jetty (tested under JDK 1.5 and JDK 1.6)</h4>
    		
    		<p>The following has been tested under JDK 1.5 and 1.6.  Under JDK
    		1.6 and later, your server is JMX enabled by default and you can,
    		but do not need to, follow the steps discussed below.  Under JDK
    		1.5, adding JMX support in Jetty requires a number of additions to
    		the <em>$JETTY_HOME/etc/jetty.xml</em> configuration file. Here
    		are the elements that need to be added:
    		</p>
    
        <pre class="prettyprint source">&lt;Call id="MBeanServer" class="java.lang.management.ManagementFactory" 
          name="getPlatformMBeanServer"/>
    
    &lt;Get id="Container" name="container">
      &lt;Call name="addEventListener">
        &lt;Arg>
          &lt;New class="org.mortbay.management.MBeanContainer">
            &lt;Arg>&lt;Ref id="MBeanServer"/>&lt;/Arg>
            &lt;Call name="start" />
          &lt;/New>
        &lt;/Arg>
      &lt;/Call>
    &lt;/Get> </pre>
    
        <p>If you wish to access the MBeans exposed by Jetty via the
        <code>jconsole</code> application, then you need to start Jetty after
        having set the "com.sun.management.jmxremote" Java system
        property.
        </p>
    
        <p>For a standalone version of Jetty, this translates to: </p>
    
        
        <p class="source">java <b>-Dcom.sun.management.jmxremote</b> -jar start.jar [config files]</p>
    
        <p>And if you wish to launch Jetty as a Maven plugin, then you
        need to set the "com.sun.management.jmxremote" system property via
        the <code>MAVEN_OPTS</code> shell variable:
        </p>
    
        <p class="source"><b>MAVEN_OPTS="-Dcom.sun.management.jmxremote</b>"
    mvn jetty:run</p>
    
        <p>You can then access the MBeans exposed by Jetty as well as
        logback's <code>JMXConfigurator</code> via
        <code>jconsole</code>.</p>
    
        <img src="images/chapters/jmxConfigurator/jconsole15_jetty.gif" alt="jconsole15_jetty.gif"/>   
    
        <p>After you are connected, you should be able to access
        <code>JMXXConfigurator</code> as shown in the <a
        href="#jmxConfigurator">screenshot</a> above.</p>
    
        <h4>MX4J with Jetty (tested under JDK 1.5 and 1.6)</h4>
    
        <p>If you wish to access <code>JMXConfigurator</code> via MX4J's
        HTTP interface and assuming you have already downloaded <a
        href="http://mx4j.sourceforge.net/">MX4J</a>, you then need to
        modify the Jetty configuration file discussed previously by adding
        an instruction to set the management port.
        </p>
        
        <pre class="prettyprint source">&lt;Call id="MBeanServer"
        class="java.lang.management.ManagementFactory"
        name="getPlatformMBeanServer"/>
    
    &lt;Get id="Container" name="container">
      &lt;Call name="addEventListener">
        &lt;Arg>
          &lt;New class="org.mortbay.management.MBeanContainer">
            &lt;Arg>&lt;Ref id="MBeanServer"/>&lt;/Arg>
            <b>&lt;Set name="managementPort">8082&lt;/Set></b>
            &lt;Call name="start" />
          &lt;/New>
        &lt;/Arg>
      &lt;/Call>
    &lt;/Get> 
        </pre>
        
        <p>Moreover, <em>mx4j-tools.jar</em> needs to be added to Jetty's
        class path.
        </p>
    
        <p>If you are running Jetty as a Maven plug-in, then you need to add
        <em>mx4j-tools</em> as a dependency.</p>
    
        <pre class="prettyprint source">&lt;plugin>
      &lt;groupId>org.mortbay.jetty&lt;/groupId>
      &lt;artifactId>maven-jetty-plugin&lt;/artifactId>
      &lt;configuration>
        &lt;jettyConfig>path/to/jetty.xml&lt;/jettyConfig>
        ...
      &lt;/configuration>
      <b>&lt;dependencies>
        &lt;dependency>
          &lt;groupId>mx4j&lt;/groupId>
          &lt;artifactId>mx4j-tools&lt;/artifactId>
          &lt;version>3.0.1&lt;/version>
        &lt;/dependency>
      &lt;/dependencies></b>
    &lt;/plugin></pre>
    
    		<p>After Jetty is started with the above configuration,
    		<code>JMXConfigurator</code> will be available at the following
    		URL (search for "ch.qos.logback.classic"):
    		</p>
    
        <p class="source"><a href="http://localhost:8082/">http://localhost:8082/</a></p>
    
        <p>Below is a screen shot view of the MX4J interface.</p>
    
        <img src="images/chapters/jmxConfigurator/mx4j_jetty.gif" alt="mx4j_jetty.gif"/>   
    
    
        <!-- ================ Tomcat ================== -->
    		
    		<h4>Configuring JMX for Tomcat (tested under JDK 1.5 and 1.6)</h4>
        
        <p>If you are using JDK 1.6 and later, your server is already JMX
        enabled by default and you can, but do not need to, follow the
        steps discussed below. Under JDK 1.5, Tomcat requires the addition
        of the following lines to the
        <em>$TOMCAT_HOME/bin/catalina.bat/sh</em> shell script:
    		</p>
    		
        <p class="source">CATALINA_OPTS="-Dcom.sun.management.jmxremote"</p>
    
    		<p>Once started with these options, MBeans exposed by Tomcat as
    		well logback's <code>JMXConfigurator</code> can be accessed with
    		<code>jconsole</code> by issuing the following command in a shell:
    		</p>
        
        <p class="source">jconsole</p>
    
        <img src="images/chapters/jmxConfigurator/jconsole15_tomcat.gif" alt="jconsole15_tomcat.gif"/>   
    
        <p>After you are connected, you should be able to access
        <code>JMXXConfigurator</code> as shown in the <a
        href="#jmxConfigurator">screenshot</a> above.</p>
    
    
        <h4>MX4J with Tomcat (tested under JDK 1.5 and 1.6)</h4>
        
    		<p>You might prefer to access JMX components via a web-based
    		interface provided by MX4J.  In that case, here are the required
    		steps:
    		</p>
    		
        <p>Assuming you have already downloaded <a
        href="http://mx4j.sourceforge.net/">MX4J</a>, place the
        <em>mx4j-tools.jar</em> file under the <em>$TOMCAT_HOME/bin/</em>
        directory. Then, add the following lines to the
        <em>$TOMCAT_HOME/bin/catalina.sh</em> configuration file:
    		</p>
    
        <p class="source">&lt;!-- at the beginning of the file -->
    CATALINA_OPTS="-Dcom.sun.management.jmxremote"
    
    &lt;!-- in the "Add on extra jar files to CLASSPATH" section -->
    CLASSPATH="$CLASSPATH":"$CATALINA_HOME"/bin/mx4j-tools.jar</p>
    
    		<p>Finally, declare a new <code>Connector</code> in the
    		<em>$TOMCAT_HOME/conf/server.xml</em> file:
    		</p>
    
    		
        <pre class="prettyprint source">&lt;Connector port="0" 
      handler.list="mx"
      mx.enabled="true" 
      mx.httpHost="localhost" 
      mx.httpPort="8082" 
      protocol="AJP/1.3" /></pre>
      
      	<p>Once Tomcat is started, you should be able to find
      	JMXConfigurator by pointing your browser at the following URL
      	(search for "ch.qos.logback.classic"):
      	</p>
    
        <p class="source"><a href="http://localhost:8082">http://localhost:8082/</a></p>
    
        <p>Below is a screen shot view of the MX4J interface.</p>
    
        <img src="images/chapters/jmxConfigurator/mx4j_tomcat.gif" alt="mx4j_tomcat.gif"/>   
    
    		
    	
    	
        <script src="../templates/footer.js" type="text/javascript"></script>
      </div>
    </body>
    </html>
    ��������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/manual/migrationFromLog4j.html���������������������������0000644�0001750�0001750�00000020115�11777025201�026233� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Chapter 13: Migration from log4j</title>
        <link rel="stylesheet" type="text/css" href="../css/common.css" />
        <link rel="stylesheet" type="text/css" href="../css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="../css/_print.css" media="print" />
        <link rel="stylesheet" type="text/css" href="../css/prettify.css" media="screen" />
      </head>
      <body onload="prettyPrint(); decorate();">
        <script type="text/javascript">prefix='../'</script>
        <script type="text/javascript" src="../js/prettify.js"></script>
        <script type="text/javascript" src="../templates/header.js"></script>
        <script type="text/javascript" src="../js/jquery-min.js"></script>
        <script type="text/javascript" src="../js/decorator.js"></script>
    
        <div id="left">
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="../templates/left.js" type="text/javascript"></script>
        </div>
        <div id="right">
          <script src="menu.js" type="text/javascript"></script>
        </div>
        <div id="content">
          
        <h1>Chapter 13: Migration from log4j</h1> 
    
        <div class="quote">
          <p><em>The more things change, the more they remain the
          same. </em></p>
          
          <p>&mdash;ALPHONSE KARR, <em>Les Gu&ecirc;pes</em></p>
        </div>
    
        <p>This chapter deals with the topic of migrating custom log4j
        components such as appenders or layouts to logback-classic.
        </p>
    
        <p>Software which merely invokes log4j client API, that is the
        <code>Logger</code> or <code>Category</code> classes in
        <code>org.apache.log4j</code> package, can be automatically
        migrated to use SLF4J via the <a
        href="http://www.slf4j.org/migrator.html">SLF4J migrator
        tool</a>. To migrate <em>log4j.property</em> files into its
        logback equivalent, you can use the <a
        href="http://logback.qos.ch/translator/">log4j.properties
        translator</a>.
        </p>
    
        <p>From a broader perspective, log4j and logback-classic are
        closely related. The core components, such as loggers, appenders
        and layouts exist in both frameworks and serve identical
        purposes. Similarly, the most important internal data-structure,
        namely <code>LoggingEvent</code>, exists in both frameworks with
        rather similar but non-identical implementations. Most notably, in
        logback-classic <code>LoggingEvent</code> implements the
        <code>ILoggingEvent</code> interface. Most of the changes required
        in migrating log4j components to logback-classic are related to
        differences in implementation of the <code>LoggingEvent</code>
        class. Rest assured, these differences are rather limited. If in
        spite of your best efforts you are unable to migrate any given
        log4j component to logback-classic, do post a question on the <a
        href="../mailinglist.html">logback-dev mailing list</a>. A logback
        developer should be able to provide guidance.
        </p>
    
        
        <h3 class="doAnchor" name="log4jLayout">Migrating a log4j layout</h3>
    
        <p>Let us begin by migrating a hypothetical and trivially simple
        log4j layout named <a
        href="../xref/chapters/migrationFromLog4j/TrivialLog4jLayout.html">TrivialLog4jLayout</a>
        which returns the message contained in a logging events as the
        formatted message. Here is the code.
        </p>
        
    
        <pre class="prettyprint source">package chapters.migrationFromLog4j;
    
    import org.apache.log4j.Layout;
    import org.apache.log4j.spi.LoggingEvent;
    
    public class TrivialLog4jLayout extends Layout {
    
      public void activateOptions() {
        // there are no options to activate
      }
    
      public String format(LoggingEvent loggingEvent) {
        return loggingEvent.getRenderedMessage();
      }
    
      public boolean ignoresThrowable() {
        return true;
      }
    }</pre>
    
        <p>The logback-classic equivalent named <a
        href="../xref/chapters/migrationFromLog4j/TrivialLogbackLayout.html">TrivialLogbackLayout</a>
        would be </p>
        
        <pre class="prettyprint source">package chapters.migrationFromLog4j;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.LayoutBase;
    
    public class TrivialLogbackLayout extends <b>LayoutBase&lt;ILoggingEvent></b> {
    
      public String <b>doLayout</b>(ILoggingEvent loggingEvent) {
        return loggingEvent.getMessage();
      }
    }    </pre>
     
       <p>As you can see, in a logback-classic layout, the formatting
       method is named <code>doLayout</code> instead of
       <code>format</code>() in log4j. The <code>ignoresThrowable</code>()
       method is not needed and has no equivalent in logback-classic. Note
       that a logback-classic layout must extend the
       <code>LayoutBase&lt;ILoggingEvent></code> class.
       </p>
    
       <p>The <code>activateOptions</code>() method merits further
       discussion. In log4j, a layout will have its
       <code>activateOptions</code>() method invoked by log4j
       configurators, that is <code>PropertyConfigurator</code> or
       <code>DOMConfigurator</code> just after all the options of the
       layout have been set. Thus, the layout will have an opportunity to
       check that its options are coherent and if so, proceed to fully
       initialize itself.</p>
    
    
       <p>In logback-classic, layouts must implement the <a
       href="../xref/ch/qos/logback/core/spi/LifeCycle.html">LifeCycle</a>
       interface which includes a method called <code>start</code>(). The
       <code>start</code>() method is the equivalent of log4j's
       <code>activateOptions</code>() method.
       </p>
    
       <h3 class="doAnchor" name="log4jAppender">Migrating a log4j
       appender</h3>
       
       <p>Migrating an appender is quite similar to migrating a
       layout. Here is a trivially simple appender called <a
       href="../xref/chapters/migrationFromLog4j/TrivialLog4jAppender.html">TrivialLog4jAppender</a>
       which writes on the console the string returned by its layout.</p>
       
        <pre class="prettyprint source">package chapters.migrationFromLog4j;
    
    import org.apache.log4j.AppenderSkeleton;
    import org.apache.log4j.spi.LoggingEvent;
    
    
    public class TrivialLog4jAppender extends AppenderSkeleton {
    
      protected void append(LoggingEvent loggingevent) {
        String s = this.layout.format(loggingevent);
        System.out.println(s);
      }
    
      public void close() {
        // nothing to do
      }
    
      public boolean requiresLayout() {
        return true;
      }
    }</pre>
    
       <p>The logback-classic equivalent named <a
       href="../xref/chapters/migrationFromLog4j/TrivialLogbackAppender.html">TrivialLogbackAppender</a>
       would be written as</p>
    
    
       <pre class="prettyprint source">package chapters.migrationFromLog4j;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.AppenderBase;
    
    public class TrivialLogbackAppender extends AppenderBase&lt;ILoggingEvent> {
    
      @Override
      public void start() {
        if (this.layout == null) {
          addError("No layout set for the appender named [" + name + "].");
          return;
        }
        super.start();
      }
    
      @Override
      protected void append(ILoggingEvent loggingevent) {
        // note that AppenderBase.doAppend will invoke this method only if
        // this appender was successfully started.
        
        String s = this.layout.doLayout(loggingevent);
        System.out.println(s);
      }
    }</pre>
    
    
       <p>Comparing the two classes, you should notice that the contents
       of the <code>append</code>() method remains unchanged. The
       <code>requiresLayout</code> method is not used in logback and can
       be removed. In logback, the <code>stop</code>() method is the
       equivalent of log4j's <code>close</code>() method. However,
       <code>AppenderBase</code> in logback-classic, contains a nop
       implementation for <code>stop</code> which is sufficient for the
       purposes of this trivial appender.
       </p>
    
    
    
      <script src="../templates/footer.js" type="text/javascript"></script>
    </div>
    </body>
    </html>
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/manual/onJoran.html��������������������������������������0000644�0001750�0001750�00000102660�11777024156�024142� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Chapter 11: Joran</title>
        <link rel="stylesheet" type="text/css" href="../css/common.css" />
        <link rel="stylesheet" type="text/css" href="../css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="../css/_print.css" media="print" />
        <link rel="stylesheet" type="text/css" href="../css/prettify.css" media="screen" />
      </head>
      <body  onload="prettyPrint(); decorate();">
        <script type="text/javascript">prefix='../'</script>
        <script type="text/javascript" src="../js/prettify.js"></script>
        <script type="text/javascript"> src="../templates/header.js"</script>
        <script type="text/javascript" src="../js/jquery-min.js"></script>
        <script type="text/javascript" src="../js/decorator.js"></script>
    
        <div id="left">
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="../templates/left.js" type="text/javascript"></script>
        </div>
        <div id="right">
          <script src="menu.js" type="text/javascript"></script>
        </div>
        <div id="content">
          
        <h1>Chapter 11: Joran</h1>
    
        <div class="quote">
          <p><em>The answer, my friend, is blowin' in the wind, The answer
          is blowin' in the wind.</em></p>
          
          <p>&mdash;BOB DYLAN, <em>The Freewheelin' Bob Dylan</em></p>
        </div>
    
        <p>Joran stands for a cold north-west wind which, every now and
        then, blows forcefully on Lake Geneva. Located right in the middle
        of Western-Europe, the surface of Lake Geneva is smaller than many
        other European lakes. However, with its average depth of 153
        meters, it is unusually deep, and happens to be, by volume, the
        largest sweet water reserve in Western-Europe.
        </p>
    
    
        <p>As apparent in previous chapters, logback relies on Joran, a
        mature, flexible and powerful configuration framework. Many of the
        capabilities offered by logback modules are only possible on
        account of Joran. This chapter focuses on Joran, its basic design
        and its salient features.
        </p>
    
        <p>Joran is actually a generic configuration system which can be
        used independently of logging. To emphasize this point, we should
        mention that the logback-core module does not have a notion of
        loggers. In that spirit, most of the examples in this chapter have
        nothing to do with loggers, appenders or layouts.
        </p>
    
        <p>The examples presented in this chapter can be found under
        <em>LOGBACK_HOME/logback-examples/src/main/java/chapters/onJoran/</em>
        folder.
        </p>
    
        <p>To install Joran, simply <a
        href="../download.html">download</a> logback and add
        <em>logback-core-${project.version}.jar</em> to your
        classpath.</p>
        
        <h2 class="doAnchor">Historical perspective</h2>
    
        <p>Reflection is a powerful feature of the Java language, making
        it possible to configure software systems declaratively. For
        example, many important properties of an EJB are configured with
        the <em>ejb.xml</em> file. While EJBs are written in Java, many of
        their properties are specified within the <em>ejb.xml</em>
        file. Similarly, logback settings can be specified in a
        configuration file, expressed in XML format. Annotations available
        in JDK 1.5 and heavily used in EJB 3.0 replace many directives
        previously found in XML files. Joran also makes use of annotations
        but at a much smaller extent. Due to the dynamic nature of logback
        configuration data (compared to EJBs) Joran's use of annotations
        is rather limited.
        </p>
    
        <p>In log4j, logback's predecessor, the
        <code>DOMConfigurator</code> class, which is part of log4j version
        1.2.x and later, could also parse configuration files written in
        XML. <code>DOMConfigurator</code> was written in a way that forced
        us, the developers, to tweak the code each time the structure of
        the configuration file changed. The modified code had to be
        recompiled and redeployed. Just as importantly, the code of the
        <code>DOMConfigurator</code> consisted of loops dealing with
        child elements containing many interspersed if/else
        statements. One could not help but notice that this particular
        code reeked of redundancy and duplication.  The <a
        href="http://jakarta.apache.org/commons/digester/">commons-digester
        project</a> had shown us that it was possible to parse XML files
        using pattern matching rules. At parse time, digester would apply
        rules that matched designated patterns. Rule classes were usually
        quite small and specialized. Consequently, they were relatively
        easy to understand and maintain.
        </p>
    
        <p>Armed with the <code>DOMConfigurator</code> experience, we
        began developing <code>Joran</code>, a powerful configuration
        framework to be used in logback. Joran was largely inspired by the
        commons-digester project. Nevertheless, it uses a slightly
        different terminology. In commons-digester, a rule can be seen as
        consisting of a pattern and a rule, as shown by the
        <code>Digester.addRule(String pattern, Rule rule)</code>
        method. We find it unnecessarily confusing to have a rule to
        consist of itself, not recursively but with a different
        meaning. In Joran, a rule consists of a pattern and an action. An
        action is invoked when a match occurs for the corresponding
        pattern. This relation between patterns and actions lies at the
        core of Joran.  Quite remarkably, one can deal with quite complex
        requirements by using simple patterns, or more precisely with
        exact matches and wildcard matches.
        </p>
    
        <h3 class="doAnchor" name="saxOrDom">SAX or DOM?</h3>
    
        <p>Due to the event-based architecture of the SAX API, a tool based
        on SAX cannot easily deal with forward references, that is,
        references to elements which are defined later than the current
        element being processed. Elements with cyclical references are
        equally problematic. More generally, the DOM API allows the user to
        perform searches on all the elements and make forward jumps.
        </p>
        
        <p>This extra flexibility initially led us to choose the DOM API
        as the underlying parsing API for Joran. After some
        experimentation, it quickly became clear that dealing with jumps
        to distant elements while parsing the DOM tree did not make sense
        when the interpretation rules were expressed in the form of
        patterns and actions. <em>Joran only needs to be given the
        elements in the XML document in a sequential, depth-first
        order.</em>
        </p>
    
        <p>Moreover, the SAX API offers element location information which
        allows Joran to display the exact line and column number where an
        error occurred. Location information comes in very handy in the
        identification of parsing problems.
        </p>
        
        <h3>Non goals</h3>
    
        <p>Given its highly dynamic nature, the Joran API is not intended
        to be used to parse very large XML documents with many thousands
        of elements.
        </p>
    
    
        <h3 class="doAnchor" name="pattern">Pattern</h3>
    
        <p>A Joran pattern is essentially a string. There are two kind of
        patterns, <em>exact</em> and <em>wildcard</em>. The pattern "a/b"
        can be used to match a <code>&lt;b></code> element nested within a
        top-level <code>&lt;a></code> element. The "a/b" pattern will not match
        any other element, hence the <em>exact</em> match designation.</p>
    
        <p>Wildcards can be used to match suffixes or prefixes. For
        example, the "*/a" pattern can be used to match any suffix ending
        with "a", that is any <code>&lt;a></code> element within an XML
        document but not any elements nested within <code>&lt;a></code>.
        The "a/*" pattern will match any element prefixed by
        <code>&lt;a></code>, that is any element nested within an
        <code>&lt;a></code> element.
        </p>
    
        <h3 class="doAnchor" name="action">Actions</h3>
        
        <p>As mentioned above, Joran parsing rules consists of the
        association of patterns. Actions extend the <a
        href="../xref/ch/qos/logback/core/joran/action/Action.html"><code>Action</code></a>
        class, consisting of the following abstract methods. Other methods
        have been omitted for brevity.
        </p>
    
    
        <pre class="prettyprint source">package ch.qos.logback.core.joran.action;
    
    import org.xml.sax.Attributes;
    import ch.qos.logback.core.joran.spi.ExecutionContext;
    
    public abstract class Action {
      /**
       * Called when the parser encounters an element matching a
       * {@link ch.qos.logback.core.joran.spi.Pattern Pattern}.
       */
      public abstract void begin(InterpretationContext ic, String name,
          Attributes attributes) throws ActionException;
    
      /**
       * Called to pass the body (as text) contained within an element.
       */
      public void body(InterpretationContext ic, String body)
          throws ActionException {
        // NOP
      }
    
      /*
       * Called when the parser encounters an endElement event matching a
       * {@link ch.qos.logback.core.joran.spi.Pattern Pattern}.
       */
      public abstract void end(InterpretationContext ic, String name)
          throws ActionException;
    }</pre>
    
       <p>Thus, every action must implement the <code>begin()</code> and
       <code>end()</code> methods. The implementation of the
       <code>body()</code> method is optional on account of the
       empty/nop implementation provided by <code>Action</code>.</p>
    
    
       <h3 class="doAnchor" name="ruleStore">RuleStore </h3>
    
       <p>As mentioned previously, the invocation of actions according to
       matching patterns is a central concept in Joran. A rule is an
       association of a pattern and an action. Rules are stored in a <a
       href="../xref/ch/qos/logback/core/joran/spi/RuleStore.html">RuleStore</a>.   
       </p>
    
       <p>As mentioned above, Joran is built on top of the SAX API. As an
       XML document is parsed, each element generates events corresponding
       to the start, body and end of each element. When a Joran
       configurator receives these events, it will attempt to find in its
       rule store an action corresponding to the <em>current
       pattern</em>. For example, the current pattern for the start, body
       or end event of element <em>B</em> nested within a top-level
       <em>A</em> element is "A/B".  The current pattern is a data
       structure maintained automatically by Joran as it receives and
       processes SAX events. </p>
    
       <p>When several rules match the current pattern, then exact
       matches override suffix matches, and suffix matches override prefix
       matches. For exact details of the implementation, please see the <a
       href="../xref/ch/qos/logback/core/joran/spi/SimpleRuleStore.html">SimpleRuleStore</a>
       class.
       </p>
       
    
       <h3 class="doAnchor" name="interpretationContext">Interpretation
       context</h3>
    
       <p>To allow various actions to collaborate, the invocation of begin
       and end methods include an interpretation context as the first
       parameter. The interpretation context includes an object stack, an
       object map, an error list and a reference to the Joran interpreter
       invoking the action. Please see the <a
       href="../xref/ch/qos/logback/core/joran/spi/InterpretationContext.html"><code>InterpretationContext</code></a>
       class for the exact list of fields contained in the interpretation
       context.
       </p>
       
       <p>Actions can collaborate together by fetching, pushing or popping
       objects from the common object stack, or by putting and fetching
       keyed objects on the common object map. Actions can report any error
       conditions by adding error items on the interpretation context's
       <code>StatusManager</code>.
       </p>
       
       <h3 class="doAnchor" name="helloWorld">Hello world</h3>
       
       <p>The first example in this chapter illustrates the minimal
       plumbing required for using Joran. The example consists of a
       trivial action called <a
       href="../xref/chapters/onJoran/helloWorld/HelloWorldAction.html">
       <code>HelloWorldAction</code></a> which prints "Hello World" on the
       console when its <code>begin()</code> method is invoked. The
       parsing of XML files is done by a configurator. For the purposes of
       this chapter, we have developed a very simple configurator called
       <a
       href="../xref/chapters/onJoran/SimpleConfigurator.html"><code>SimpleConfigurator</code></a>.
       The <a
       href="../xref/chapters/onJoran/helloWorld/HelloWorld.html"><code>HelloWorld</code></a>
       application brings all these pieces together:
       </p>
    
       <ul>
         <li>It creates a map of rules and a <code>Context</code></li>
         <li>It creates a parsing rule by associating the
         <em>hello-world</em> pattern with a corresponding
         <code>HelloWorldAction</code> instance</li>
         <li>It creates a <code>SimpleConfigutator</code>, passing it the
         aforementioned rules map</li>
         <li>It then invokes the <code>doConfigure</code> method of the
         configurator, passing the designated XML file as parameter
         </li>
         <li>As a last step, the accumulated Status message in the context,
         if any, are printed</li>
       </ul>
    
        <p>The <em>hello.xml</em> file contains one &lt;hello-world&gt;
        element, without any other nested elements. See the
        <em>logback-examples/src/main/java/chapters/onJoran/helloWorld/</em>
        folder for exact contents.
        </p>
     
        <p>Running the HelloWorld application with <em>hello.xml</em> file
        will print "Hello World" on the console.</p>
       
        <p class="command">java chapters.onJoran.helloWorld.HelloWorld src/main/java/chapters/onJoran/helloWorld/hello.xml</p>
    
        <p>You are highly encouraged to poke about in this example, by adding
        new rules on the rule store, modifying the XML document
        (hello.xml) and adding new actions.
        </p>
    
        <!-- ====================================================== -->
    
        <h3 class="doAnchor" name="calculator">Collaborating actions</h3>
       
        <p>The <em>logback-examples/src/main/java/joran/calculator/</em>
        directory includes several actions which collaborate together
        through the common object stack in order to accomplish simple
        computations.
        </p>
    
        <p>The <em>calculator1.xml</em> file contains a
        <code>computation</code> element, with a nested
        <code>literal</code> element. Here are its contents.
        </p>
    
        <em>Example 10.<span class="autoEx"/>: First calculator example
        (logback-examples/src/main/java/chapters/onJoran/calculator/calculator1.xml)</em>
    
        <em> </em>
        <pre class="prettyprint source">&lt;computation name="total">
      &lt;literal value="3"/>
    &lt;/computation></pre>
    
        <p>In the <a href="../xref/chapters/onJoran/calculator/Calculator1.html">
        <code>Calculator1</code></a> application, we declare various
        parsing rules (patterns and actions) collaborating together to
        compute a result based on the contents of an XML document. 
        </p>
    
        <p> Running <code>Calculator1</code> application with
        <em>calculator1.xml</em></p>
    
        <p class="command">java chapters.onJoran.calculator.Calculator1 src/main/java/chapters/onJoran/calculator/calculator1.xml</p>
    
        <p>will print:</p>
    
        <p class="console">The computation named [total] resulted in the value 3</p>
    
    
        <p>Parsing the <em>calculator1.xml</em> document (listed above)
        involves the following steps:
        </p>
    
        <ul>
          <li>The start event corresponding to the &lt;computation&gt;
          element translates into the current pattern
          "/computation". Since in the <a
          href="../xref/chapters/onJoran/calculator/Calculator1.html">
          <code>Calculator1</code></a> application we associated the
          pattern "/computation" with a
          <a
          href="../xref/chapters/onJoran/calculator/ComputationAction1.html">
          <code>ComputationAction1</code></a> instance, the
          <code>begin()</code> method of that
          <code>ComputationAction1</code> instance is invoked.
          </li>
    
          <li><p>The start event corresponding to the &lt;literal&gt;
          element translates into the current pattern
          "/computation/literal". Given the association of the
          "/computation/literal" pattern with a
          <a
          href="../xref/chapters/onJoran/calculator/LiteralAction.html">
          <code>LiteralAction</code></a> instance, the
          <code>begin()</code> method of that <code>LiteralAction</code>
          instance is called.</p>
          </li>
    
          <li><p>By the same token, the end event corresponding to the
          &lt;literal&gt; element triggers the invocation of the
          <code>end</code>() method of the same <code>LiteralAction</code>
          instance.</p>
          </li>
    
    
          <li><p>Similarly, the event corresponding to the end of
          &lt;computation&gt; element triggers the invocation the
          <code>end()</code> method of the <code>ComputationAction1</code>
          same instance.
          </p>
          </li>
        </ul>
    
        <p>What is interesting here is the way actions collaborate.  The
        <code>LiteralAction</code> reads a literal value and pushes it in
        the object stack maintained by the
        <code>InterpretationContext</code>. Once done, any other action
        can pop the value to read or modify it. Here, the
        <code>end()</code> method of the <code>ComputationAction1</code>
        class pops the value from the stack and prints it.
        </p>
    
        <!-- TO BE CONTINUED -->
    
        <p>The next example, <em>calculator2.xml</em> file is a bit more
        complex, but also more interesting.</p>
    
        <em>Example 10.<span class="autoEx"/>: Calculator configuration
        file
        (logback-examples/src/main/java/chapters/onJoran/calculator/calculator2.xml)</em>
      <pre class="prettyprint source">&lt;computation name="toto"&gt;
      &lt;literal value="7"/&gt;
      &lt;literal value="3"/&gt;
      &lt;add/&gt;
      &lt;literal value="3"/&gt;
      &lt;multiply/&gt;
    &lt;/computation&gt;</pre>
    
    
      <p>As in the previous example, in response to the &lt;literal&gt;
      element,the appropriate <a
      href="../xref/chapters/onJoran/calculator/LiteralAction.html">
      <code>LiteralAction</code></a> instance will push an integer,
      corresponding to the value attribute, at the top of the
      interpretation context's object stack. In this example, that is
      <em>calculator2.xml</em>, the values are 7 and 3. In response to the
      &lt;add&gt; element, the appropriate <a
      href="../xref/chapters/onJoran/calculator/AddAction.html"><code>AddAction</code></a>
      will pop two previously pushed integers, compute their sum and push
      the result, i.e. 10 (=7+3), at the top of the interpretation
      context's stack. The next literal element will cause LiteralAction
      to push an integer with value 3 at the top of the stack. In response
      to the &lt;multiply&gt; element, the appropriate <a
      href="../xref/chapters/onJoran/calculator/MultiplyAction.html"><code>MultiplyAction</code></a>
      will pop two previously pushed integers, i.e. 10 and 3, and compute
      their product.  It will push the result, i.e. 30, at the top of the
      stack. At the very end, in reponse to the end event corresponding to
      the &lt;/computation&gt; tag, the ComputationAction1 will print the
      object at the top of the stack. Thus, running:
      </p>
    
      <p class="command">java chapters.onJoran.calculator.Calculator1 src/main/java/chapters/onJoran/calculator/calculator2.xml </p>
      
      <p>will yield</p>
    
      <p class="console">The computation named [toto] resulted in the value 30 </p>
      
    
      <!--
    
    
      <p>Finally, a <em>calculator3.xml</em> is also provided, to
      demonstrate the possibility elements that contain instances of the
      same element. Here's the content of <em>calculator3.xml</em>:</p>
    
      <em>Example 10.<span class="autoEx"/>: Calculator configuration file
      (logback-examples/src/main/java/chapters/onJoran/calculator/calculator3.xml)</em>
    
    <pre class="prettyprint source">&lt;computation name="toto"&gt;
      &lt;computation&gt;
        &lt;literal value="7"/&gt;
        &lt;literal value="3"/&gt;
        &lt;add/&gt;
      &lt;/computation&gt;   
     
      &lt;literal value="3"/&gt;
      &lt;multiply/&gt;
    &lt;/computation&gt;</pre>
    
      <p>Much like the use of parentheses in an algebrical equation, the
      presence of a <code>computation</code> element nested in another is
      managed by the <a
      href="../xref/chapters/onJoran/calculator/ComputationAction2.html">
      <code>ComputationAction2</code></a> class using an internal
      stack. The well-formedness of XML will guarantee that a value saved
      by one <code>begin()</code> will be consumed only by the matching
      <code>end()</code> method.</p>
      -->
    
      <h3 class="doAnchor" name="implicit">Implicit actions</h3>
    
      <p>The rules defined thus far are called explicit actions because an
      pattern/action association could be found in the rule store for the
      current element. However, in highly extensible systems, the number
      and type of components can be so large so as to make it very tedious
      to associate an explicit action for all patterns.
      </p>
    
      <p>At the same time, even in highly extensible systems one can
      observe recurrent rules linking various parts together. Assuming we
      could identify such rules, we could process components composed of
      sub-components unknown at compilation time (of logback). For
      example, Apache Ant is capable of handling tasks which contain tags
      unknown at compile time, simply by inspecting the component for
      methods whose names start with <em>add</em>, as in
      <code>addFile</code>, or <code>addClassPath</code>.  When Ant
      encounters an embedded tag within a task, it simply instantiates an
      object that matches the signature of the task class' add method and
      attaches the resulting object to the parent.
      </p>
    
      <p>Joran supports a similar capability in the form of implicit
      actions. Joran keeps a list of implicit actions which are applied if
      no explicit pattern could match the current pattern.  However,
      applying an implicit action may not be always appropriate. Before
      executing the implicit action, Joran asks a given implicit action
      whether it is appropriate in the current situation. Only if the
      action replies in the affirmative does the Joran configurator invoke
      the (implicit) action. Note that this extra step makes it possible
      to support multiple implicit actions or possibly none, if no
      implicit action is appropriate for a given situation.
      </p>
    
      <p>You can create and register a custom implicit action as
      illustrated in the next example contained within the
      <em>logback-examples/src/main/java/chapters/onJoran/implicit</em> folder.
      </p>
    
      <p>The <a
      href="../xref/chapters/onJoran/implicit/PrintMe.html"><code>PrintMe</code></a>
      application associates an <a
      href="../xref/chapters/onJoran/implicit/NOPAction.html">
      <code>NOPAction</code></a> instance with the pattern "*/foo", that
      is any element named as "foo". As its name indicates, the
      <code>begin</code>() and <code>end</code>() methods of
      <code>NOPAction</code> are empty. The <code>PrintMe</code>
      application also registers an instance of <a
      href="../xref/chapters/onJoran/implicit/PrintMeImplicitAction.html">PrintMeImplicitAction</a>
      in its list of implicit actions. The
      <code>PrintMeImplicitAction</code> is applicable for any element
      which has a <span class="attr">printme</span> attribute set to
      true. See the <code>isApplicable()</code> method in
      <code>PrintMeImplicitAction</code>.  The <code>begin()</code>() method
      of <code>PrintMeImplicitAction</code> prints the name of the current
      element on the console.
      </p>
    
      <p>The XML document <em>implicit1.xml</em> is designed to illustrate
      how implicit actions come into play.</p>
    
      <em>Example 10.<span class="autoEx"/>: Usage of implicit rules
      (logback-examples/src/main/java/chapters/onJoran/implicit/implicit1.xml)</em>
      <pre class="prettyprint source">&lt;foo&gt;
      &lt;xyz printme="true"&gt;
        &lt;abc printme="true"/&gt;
      &lt;/xyz&gt;
    
      &lt;xyz/&gt;
    
      &lt;foo printme="true"/&gt;
    
    &lt;/foo&gt;</pre>
    
      <p>Running</p>
    
      <p class="command">java chapters.onJoran.implicit.PrintMe src/main/java/chapters/onJoran/implicit/implicit1.xml</p>
      <p>yields:</p>
    
      <p class="console">Element [xyz] asked to be printed.
    Element [abc] asked to be printed.
    20:33:43,750 |-ERROR in c.q.l.c.joran.spi.Interpreter@<b>10:9</b> - no applicable action for [xyz], current pattern is [[foo][xyz]]</p>
    
      <p>Given that <code>NOPAction</code> instance is explicitly
      associated with the "*/foo" pattern, <code>NOPAction</code>'s
      <code>begin()</code> and <code>end()</code> methods are invoked on
      &lt;foo> elements. <code>PrintMeImplicitAction</code> is never
      triggered for any of the &lt;foo&gt; elements. For other elements,
      since there are no matching explicit actions, the
      <code>isApplicable()</code> method of
      <code>PrintMeImplicitAction</code> is invoked. It will return true
      only for elements having a <span class="attr">printme</span>
      attribute set to true, namely the first &lt;xyz> element (but not
      the second) and the &lt;abc> element. The second &lt;xyz> element on
      line 10, there are no applicable actions, an internal error message
      is generated. This message is printed by the
      <code>StatusPrinter.print</code> invocation, the last statement in
      the <code>PrintMe</code> application. This explains the output shown
      above (see previous paragraph).
      </p>
    
      <h3 class="doAnchor" name="iaPractice">Implicit actions in
      practice</h3>
      
      <p>The respective Joran configurators of logback-classic and
      logback-access include just two implicit actions, namely <a
      href="../xref/ch/qos/logback/core/joran/action/NestedBasicPropertyIA.html">
      <code>NestedBasicPropertyIA</code></a> and <a
      href="../xref/ch/qos/logback/core/joran/action/NestedComplexPropertyIA.html">
      <code>NestedComplexPropertyIA</code></a>.
      </p>
    
      <p><code>NestedBasicPropertyIA</code> is applicable for any property
      whose type is a primitive type (or equivalent object type in the
      <code>java.lang</code> package), an enumeration type, or any type
      adhering to the "valueOf" convention.  Such properties are said to
      be <em>basic</em> or <em>simple</em>. A class is said to adhere to
      the "valueOf" convention if it contains a static method named
      <code>valueOf</code>() taking a <code>java.lang.String</code> as
      parameter and returning an instance of the type in question.  At
      present, the <a
      href="../xref/ch/qos/logback/classic/Level.html"><code>Level</code></a>,
      <a
      href="../xref/ch/qos/logback/core/util/Duration.html"><code>Duration</code></a>
      and <a
      href="../xref/ch/qos/logback/core/util/FileSize.html"><code>FileSize</code></a>
      classes follow this convention.
      </p>
      
      <p><code>NestedComplexPropertyIA</code> action is applicable, in the
      remaining cases where <code>NestedBasicPropertyIA</code> is not
      applicable <em>and</em> if the object at the top of the object stack
      has a setter or adder method for a property name equal to the
      current element name. Note that such properties can in turn contain
      other components. Thus, such properties are said to be
      <em>complex</em>.  In presence of a complex property, <a
      href="../xref/ch/qos/logback/core/joran/action/NestedComplexPropertyIA.html">
      <code>NestedComplexPropertyIA</code></a> will instantiate the
      appropriate class for the nested component and attach it to the
      parent component (at the top of the object stack) by using the
      setter/adder method of the parent component and the nested element's
      name. The corresponding class is specified by the <span
      class="attr">class</span> attribute of the (nested) current
      element. However, if the <span class="attr">class</span> attribute
      is missing, the class name can be deduced implicitly, if any of the
      following is true:
      </p>
    
      <ol>
        <li>there is an internal rule associating the parent object's
        property with a designated class
        </li>
        <li>the setter method contains a @DefaultClass attribute
        designating a given class</li>
    
        <li>the parameter type of the setter method is a concrete class
        possessing a public constructor
        </li>
      </ol>
    
      <h4 class="doAnchor" name="defaultClassMapping">Default class
      mapping</h4>
    
      <p>In logback-classic, there are a handful of internal rules mapping
      parent class/property name pairs to a default class. These are
      listed in the table below.</p>
    
      <table class="bodyTable">
        <tr>
          <th>Parent class </th>
          <th>property name </th>
          <th>default nested class</th>
        </tr>
    
        <tr >
          <td>ch.qos.logback.core.AppenderBase</td>
          <td>encoder</td>
          <td>ch.qos.logback.classic.encoder.PatternLayoutEncoder</td>
        </tr>
    
        <tr class="alt">
          <td>ch.qos.logback.core.UnsynchronizedAppenderBase</td>
          <td>encoder</td>
          <td>ch.qos.logback.classic.encoder.PatternLayoutEncoder</td>
        </tr>
    
          <tr >
          <td>ch.qos.logback.core.AppenderBase</td>
          <td>layout</td>
          <td>ch.qos.logback.classic.PatternLayout</td>
        </tr>
    
        <tr class="alt">
          <td>ch.qos.logback.core.UnsynchronizedAppenderBase</td>
          <td>layout</td>
          <td>ch.qos.logback.classic.PatternLayout</td>
        </tr>
    
        <tr>
          <td>ch.qos.logback.core.filter.EvaluatorFilter</td>
          <td>evaluator</td>
          <td>ch.qos.logback.classic.boolex.JaninoEventEvaluator</td>
        </tr>
      </table>
    
      <p>This list may change in future releases. Please see
      logback-classic <a
      href="../xref/ch/qos/logback/classic/joran/JoranConfigurator.html">JoranConfigurator</a>'s
      <code>addDefaultNestedComponentRegistryRules</code> method for the
      latest rules.
      </p>
    
      <p>In logback-access, the rules are very similar. In the default
      class for the nested component, the ch.qos.logback.classic package
      is replaced by ch.qos.logback.access. See logback-access <a
      href="../xref/ch/qos/logback/access/joran/JoranConfigurator.html">JoranConfigurator</a>'s
      <code>addDefaultNestedComponentRegistryRules</code> method for the
      latest rules.
      </p>
      
      <h4 class="doAnchor">Collection of properties</h4>
    
      
      <p>Note that in addition to single simple properties or single
      complex properties, logback's implicit actions support collections of
      properties, be they simple or complex. Instead of a setter method,
      the property is specified by an "adder" method.</p>
    
      <h3 class="doAnchor" name="newRule">New rules on the fly</h3>
    
      <p>Joran includes an action which allows the Joran interpreter to
      learn new rules on the fly, that is while interpreting an XML
      document.  See the
      <em>logback-examples/src/main/java/chapters/onJoran/newRule/</em> directory
      for sample code. In this package, the <a
      href="../xref/chapters/onJoran/newRule/NewRuleCalculator.html">
      <code>NewRuleCalculator</code></a> application sets up just two
      rules, one rule to process the top-most element, and a second rule
      to learn new rules. Here is the relevant code from
      <code>NewRuleCalculator</code>.
      </p>
    
      <pre class="prettyprint source">ruleMap.put(new Pattern("*/computation"), new ComputationAction1());
    <b>ruleStore.addRule(new Pattern("/computation/newRule"), new NewRuleAction());</b></pre>
    
      <p><a
      href="../xref/ch/qos/logback/core/joran/action/NewRuleAction.html"><code>NewRuleAction</code></a>,
      part of logback-core, works pretty much like the other actions.  It
      has a <code>begin()</code> and <code>end()</code> method, and is
      called each time the parser finds a <em>newRule</em> element. When
      invoked, the <code>begin()</code> method looks for <em>pattern</em>
      and <em>actionClass</em> attributes. It then instantiates the
      corresponding action class and adds the pattern/action association
      as a new rule in Joran's rule store.</p>
    
    
      <p>Here is how new rules can be declared in an xml file:</p>
    
      <pre class="prettyprint source">&lt;newRule pattern="*/computation/literal"
              actionClass="chapters.onJoran.calculator.LiteralAction"/&gt;</pre>
    
      <p>Using such newRule declarations, we can transform
      <code>NewRuleCalculator</code> to behave like the
      <code>Calculator1</code> application we saw earlier.  involving the
      calculation, could be expressed this way:</p>
    
      <em>Example 10..<span class="autoEx"/>: Configuration file using new
      rules on the fly
      (logback-examples/src/main/java/chapters/onJoran/newrule/newRule.xml)</em>
    
      <pre class="prettyprint source">&lt;computation name="toto"&gt;
      &lt;newRule pattern="*/computation/literal" 
                actionClass="chapters.onJoran.calculator.LiteralAction"/&gt;
      &lt;newRule pattern="*/computation/add" 
                actionClass="chapters.onJoran.calculator.AddAction"/&gt;
      &lt;newRule pattern="*/computation/multiply" 
                actionClass="chapters.onJoran.calculator.MultiplyAction"/&gt;
    
      &lt;computation&gt;
        &lt;literal value="7"/&gt;
        &lt;literal value="3"/&gt;
        &lt;add/&gt;
      &lt;/computation&gt;   
     
      &lt;literal value="3"/&gt;
      &lt;multiply/&gt;
    &lt;/computation&gt;</pre>
    
    
      <p class="command">java java chapters.onJoran.newRule.NewRuleCalculator src/main/java/chapters/onJoran/newRule/newRule.xml</p>
    
      <p>yields</p>
    
      <p class="console">The computation named [toto] resulted in the value 30</p>
    
      <p>which is identical to the output of the <a
      href="#calculator">original calculator example</a>.</p>
    
    
      <script src="../templates/footer.js" type="text/javascript"></script>
    </div>
    </body>
    </html>
    ��������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/manual/introduction.html���������������������������������0000644�0001750�0001750�00000025337�12021754417�025253� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Chapter 1: Introduction</title>
        <link rel="stylesheet" type="text/css" href="../css/common.css" />
        <link rel="stylesheet" type="text/css" href="../css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="../css/_print.css" media="print" />
        <link rel="stylesheet" type="text/css" href="../css/prettify.css" media="screen" />    
    
      </head>
      <body onload="prettyPrint()">
        <script type="text/javascript">prefix='../';</script>
        <script type="text/javascript" src="../js/prettify.js"></script>
        <script src="../templates/header.js" type="text/javascript"> </script>
        <div id="left">
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="../templates/left.js" type="text/javascript"></script>
        </div>
        <div id="right">
          <script src="menu.js" type="text/javascript"></script>
        </div>
        <div id="content">
    
        <h1>Chapter 1: Introduction</h1>
    
        <div class="quote">
          <p><em> The morale effects are startling. Enthusiasm jumps when
          there is a running system, even a simple one. Efforts redouble when
          the first picture from a new graphics software system appears on the
          screen, even if it is only a rectangle. One always has, at every
          stage in the process, a working system. I find that teams can grow
          much more complex entities in four months than they can
          build.</em></p>
          
          <p>&mdash;FREDERICK P. BROOKS, JR., <em>The Mythical Man-Month</em></p>
        </div>
    
    
        <script src="../templates/creative.js" type="text/javascript"></script>
    
        <h2>What is logback?</h2>
    
        <p>Logback is intended as a successor to the popular log4j
        project.  It was designed by Ceki G&#252;lc&#252;, log4j's
        founder.  It builds upon a decade of experience gained in
        designing industrial-strength logging systems. The resulting
        product, i.e. logback, is faster and has a smaller footprint than
        all existing logging systems, sometimes by a wide margin. Just as
        importantly, logback offers <a
        href="../reasonsToSwitch.html">unique and rather useful
        features</a> missing in other logging systems.
        </p>
    
        <h2>First Baby Step</h2>
    
        <script src="../templates/setup.js" type="text/javascript"></script>
        
        <a name="Requirements"></a>
        <h3>Requirements</h3>
    
        <p>Logback-classic module requires the presence of
        <em>slf4j-api.jar</em> and <em>logback-core.jar</em> in addition to
        <em>logback-classic.jar</em> on the classpath.
        </p>
    
        <p>The <em>logback-*.jar</em> files are part of the logback
        distribution whereas <em>slf4j-api-${slf4j.version}.jar</em> ships
        with <a href="http://www.slf4j.org">SLF4J</a>, a separate project.
        </p>
    
        <p>Let us now begin experimenting with logback.</p>
    
    <em>Example 1.1: Basic template for logging (<a href="../xref/chapters/introduction/HelloWorld1.html">logback-examples/src/main/java/chapters/introduction/HelloWorld1.java</a>)</em>
    <pre class="prettyprint source">package chapters.introduction;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    public class HelloWorld1 {
    
      public static void main(String[] args) {
    
        Logger logger = LoggerFactory.getLogger("chapters.introduction.HelloWorld1");
        logger.debug("Hello world.");
    
      }
    }</pre>
    
        <p><code>HelloWorld1</code> class is defined in the
        <code>chapters.introduction</code> package. It starts by importing the <a
        href="http://slf4j.org/api/org/slf4j/Logger.html"><code>Logger</code></a>
        and <a
        href="http://slf4j.org/api/org/slf4j/LoggerFactory.html"><code>LoggerFactory</code></a>
        classes defined in the SLF4J API, specifically within the
         <code>org.slf4j</code> package.
        </p>
    
    
        <p>On the first line of the main() method, the variable named
        <code>logger</code> is assigned a <code>Logger</code> instance
        retrieved by invoking the static <code>getLogger</code> method
        from the <code>LoggerFactory</code> class.  This logger is named
        "chapters.introduction.HelloWorld1". The main method proceeds to call the
        <code>debug</code> method of this logger passing "Hello World" as
        an argument.  We say that the main method contains a logging
        statement of level DEBUG with the message "Hello world".
        </p>
    
        <p>Note that the above example does not reference any logback
        classes. In most cases, as far as logging is concerned, your
        classes will only need to import SLF4J classes. Thus, the vast
        majority, if not all, of your classes will use the SLF4J
        API and will be oblivious to the existence of logback.
        </p>
    
    
        <p>You can launch the first
        sample application, <em>chapters.introduction.HelloWorld1</em> with the command:
        </p>
        <div class="source"><pre>java chapters.introduction.HelloWorld1</pre></div>
    
        <p>Launching the <code>HelloWorld1</code> application will output
        a single line on the console. By virtue of logback's default
        configuration policy, when no default configuration file is found,
        logback will add a <code>ConsoleAppender</code> to the root
        logger.
        </p>
    
        <p class="source">20:49:07.962 [main] DEBUG chapters.introduction.HelloWorld1 - Hello world.</p>
    
        <p>Logback can report information about its internal state using a
        built-in status system. Important events occurring during logback's
        lifetime can be accessed through a component called
        <code>StatusManager</code>. For the time being, let us instruct
        logback to print its internal state by invoking the static
        <code>print()</code> method of the <code>StatusPrinter</code>
        class.
        </p>
    
    <em>Example: Printing Logger Status (<a href="../xref/chapters/introduction/HelloWorld2.html">logback-examples/src/main/java/chapters/introduction/HelloWorld2.java</a>)</em>
    <pre class="prettyprint source">package chapters.introduction;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    <b>import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.core.util.StatusPrinter;</b>
    
    public class HelloWorld2 {
    
      public static void main(String[] args) {
        Logger logger = LoggerFactory.getLogger("chapters.introduction.HelloWorld2");
        logger.debug("Hello world.");
    
        // print internal state
        <b>LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
        StatusPrinter.print(lc);</b>
      }
    }</pre>
    
    
       <p>Running the <code>HelloWorld2</code> application will produce
       the following output:</p>
    
    <div class="source longline"><pre>12:49:22.203 [main] DEBUG chapters.introduction.HelloWorld2 - Hello world.
    12:49:22,076 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
    12:49:22,078 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
    12:49:22,093 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.xml]
    12:49:22,093 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Setting up default configuration.
    </pre></div>
    
    
      <p>Logback explains that having failed to find the
      <em>logback-test.xml</em> and <em>logback.xml</em> configuration
      files (discussed later), it configured itself using its default
      policy, which is a basic <code>ConsoleAppender</code>.  An
      <code>Appender</code> is a class that can be seen as an output
      destination. Appenders exist for many different destinations
      including the console, files, Syslog, TCP Sockets, JMS and many
      more. Users can also easily create their own Appenders as
      appropriate for their specific situation.
      </p>
    
      <p>Note that in case of errors, logback will automatically print its
      internal state on the console.</p>
    
      <p>The previous examples are rather simple. Actual logging in a
      larger application would not be that different. The general pattern
      for logging statements would not change. Only the configuration
      process would be different. However, you would probably want to
      customize or configure logback according to your needs. Logback
      configuration will be covered in subsequent chapters.
      </p>
    
      <p>Note that in the above example we have instructed logback to
      print its internal state by invoking the
      <code>StatusPrinter.print()</code> method. Logback's internal status
      information can be very useful in diagnosing logback-related
      problems.
      </p>
    
      <p>Here is a list of the three required steps in order to enable
      logging in your application.
      </p>
    
      <ol> 
        <li>Configure the logback environment. You can do so in several
        more or less sophisticated ways. More on this later.</li>
    
        <li>In every class where you wish to perform logging, retrieve a
        <code>Logger</code> instance by invoking the
        <code>org.slf4j.LoggerFactory</code> class'
        <code>getLogger()</code> method, passing the current class name
        or the class itself as a parameter.</li>
        
        <li>Use this logger instance by invoking its printing methods,
        namely the debug(), info(), warn() and error() methods. This will
        produce logging output on the configured appenders.</li>
      </ol>
     
      
      <h2><a name="building" href="#building"><span
      class="anchor"/></a>Building logback</h2>
      
      <!-- 
      
       Try downloading the file manually from:
          http://java.sun.com/products/jms/docs.html
    
      Then, install it using the command:
          mvn install:install-file -DgroupId=javax.jms -DartifactId=jms \
              -Dversion=1.1 -Dpackaging=jar -Dfile=/path/to/file 
      
       -->
      
      
      <p>As its build tool, logback relies on <a
      href="http://maven.apache.org">Maven</a>, a widely-used open-source
      build tool.
      </p>
    
      <p>Once you have installed Maven, building the logback project,
      including all its modules, should be as easy as issuing a <code>mvn
      install</code> command from within the directory where you
      unarchived the logback distribution. Maven will automatically
      download the required external libraries.
      </p>
    
      <p>Logback distributions contain complete source code such that you
      can modify parts of logback library and build your own version of
      it. You may even redistribute the modified version, as long as you
      adhere to the conditions of the LGPL license or the EPL license.
      </p>
    
      <p>For building logback under an IDE, please see the <a
      href="../setup.html#ide">relevant section on the class path setup
      page</a>.</p>
      
      <script src="../templates/footer.js" type="text/javascript"></script>
    </div>
    </body>
    </html>
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/manual/mdc.html������������������������������������������0000644�0001750�0001750�00000070746�12021754417�023301� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Chapter 8: Mapped Diagnostic Context</title>
        <link rel="stylesheet" type="text/css" href="../css/common.css" />
        <link rel="stylesheet" type="text/css" href="../css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="../css/_print.css" media="print" />
        <link rel="stylesheet" type="text/css" href="../css/prettify.css" media="screen" />
      </head>
      <body onload="prettyPrint(); decorate();">
        <script type="text/javascript">prefix='../';</script>
        <script type="text/javascript" src="../js/prettify.js"></script>
        <script type="text/javascript" src="../templates/header.js"></script>
        <script type="text/javascript" src="../js/jquery-min.js"></script>
        <script type="text/javascript" src="../js/decorator.js"></script>
    
        <div id="left">
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="../templates/left.js" type="text/javascript"></script>
        </div>
        <div id="right">
          <script src="menu.js" type="text/javascript"></script>
        </div>
        <div id="content">
          
        <h1>Chapter 8: Mapped Diagnostic Context</h1>
    
        <div class="quote">     
          <p><em>Lock the doors.</em></p>
          <p>&mdash;LEROY CAIN, Flight Director, Columbia Mission Control</p>
        </div>
        
        <script src="../templates/creative.js" type="text/javascript"></script>
        
    		<p>One of the design goals of logback is to audit and debug
    		complex distributed applications.  Most real-world distributed
    		systems need to deal with multiple clients simultaneously.  In a
    		typical multithreaded implementation of such a system, different
    		threads will handle different clients. A possible but slightly
    		discouraged approach to differentiate the logging output of one
    		client from another consists of instantiating a new and separate
    		logger for each client.  This technique promotes the proliferation
    		of loggers and may increase their management overhead.
    		</p>
    		
        <script src="../templates/setup.js" type="text/javascript"></script>
    
        
        <p>A lighter technique consists of uniquely stamping each log
       	request servicing a given client. Neil Harrison described this
       	method in the book <em>Patterns for Logging Diagnostic
       	Messages</em> in Pattern Languages of Program Design 3, edited by
       	R. Martin, D. Riehle, and F. Buschmann (Addison-Wesley,
       	1997). Logback leverages a variant of this technique included in
       	the SLF4J API: Mapped Diagnostic Contexts (MDC).
    		</p>
    		
    		<p>To uniquely stamp each request, the user puts contextual
    		information into the <code>MDC</code>, the abbreviation of Mapped
    		Diagnostic Context.  The salient parts of the MDC class are shown
    		below. Please refer to the <a
    		href="http://www.slf4j.org/api/org/slf4j/MDC.html">MDC
    		javadocs</a> for a complete list of methods.
    		</p>
    
    <pre class="prettyprint source">package org.slf4j;
    
    public class MDC {
      //Put a context value as identified by <em>key</em>
      //into the current thread's context map.
      <b>public static void put(String key, String val);</b>
    
      //Get the context identified by the <code>key</code> parameter.
      <b>public static String get(String key);</b>
    
      //Remove the context identified by the <code>key</code> parameter.
      <b>public static void remove(String key);</b>
    
      //Clear all entries in the MDC.
      <b>public static void clear();</b>
    }</pre>
    
    		<p>The <code>MDC</code> class contains only static methods.  It
    		lets the developer place information in a <em>diagnostic
    		context</em> that can be subsequently retrieved by certain logback
    		components. The <code>MDC</code> manages contextual information on
    		a <em>per thread basis</em>.  A child thread automatically
    		inherits a <em>copy</em> of the mapped diagnostic context of its
    		parent. Typically, while starting to service a new client request,
    		the developer will insert pertinent contextual information, such
    		as the client id, client's IP address, request parameters
    		etc. into the <code>MDC</code>. Logback components, if
    		appropriately configured, will automatically include this
    		information in each log entry.
    		</p>
    
        <p>Please note that MDC as implemented by logback-classic assumes
        that values are placed into the MDC with moderate frequency. </p>
    
    		<p>
    			The next application named 
    			<code><a href="../xref/chapters/mdc/SimpleMDC.html">SimpleMDC</a></code> 
    			demonstrates this basic principle.
    		</p>
    <em>Example 7.1: Basic MDC usage (<a href="../xref/chapters/mdc/SimpleMDC.html">
    logback-examples/src/main/java/chapters/mdc/SimpleMDC.java)</a></em>
    <pre class="prettyprint source">package chapters.mdc;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.slf4j.MDC;
    
    import ch.qos.logback.classic.PatternLayout;
    import ch.qos.logback.core.ConsoleAppender;
    
    public class SimpleMDC {
      static public void main(String[] args) throws Exception {
    
        // You can put values in the MDC at any time. Before anything else
        // we put the first name
        MDC.put("first", "Dorothy");
    
        [ SNIP ]
        
        Logger logger = LoggerFactory.getLogger(SimpleMDC.class);
        // We now put the last name
        MDC.put("last", "Parker");
    
        // The most beautiful two words in the English language according
        // to Dorothy Parker:
        logger.info("Check enclosed.");
        logger.debug("The most beautiful two words in English.");
    
        MDC.put("first", "Richard");
        MDC.put("last", "Nixon");
        logger.info("I am not a crook.");
        logger.info("Attributed to the former US president. 17 Nov 1973.");
      }
    
      [ SNIP ]
    
    }</pre>
    
    		<p>The main method starts by associating the value
    		<em>Dorothy</em> with the key <em>first</em> in the
    		<code>MDC</code>. You can place as many value/key associations in
    		the <code>MDC</code> as you wish.  Multiple insertions with the
    		same key will overwrite older values.  The code then proceeds to
    		configure logback.</p>
    
        <p>For the sake of conciseness, we have the omitted the code that
        configures logback with the configuration file <a
        href="http://github.com/qos-ch/logback/blob/master/logback-examples/src/main/java/chapters/mdc/simpleMDC.xml">simpleMDC.xml</a>. Here
        is the relevant section from that file.
        </p>
    
     <pre class="prettyprint source">&lt;appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> 
      &lt;layout>
        &lt;Pattern><b>%X{first} %X{last}</b> - %m%n&lt;/Pattern>
      &lt;/layout> 
    &lt;/appender></pre>
        
    
    
        <p>Note the usage of the <em>%X</em> specifier within the
        <code>PatternLayout</code> conversion pattern. The <em>%X</em>
        conversion specifier is employed twice, once for the key named
        <em>first</em> and once for the key named <em>last</em>. After
        obtaining a logger corresponding to <code>SimpleMDC.class</code>,
        the code associates the value <em>Parker</em> with the key named
        <em>last</em>.  It then invokes the logger twice with different
        messages.  The code finishes by setting the <code>MDC</code> to
        different values and issuing several logging requests. Running
        SimpleMDC yields:
    		</p>
    
    <div class="source"><pre>Dorothy Parker - Check enclosed.
    Dorothy Parker - The most beautiful two words in English.
    Richard Nixon - I am not a crook.
    Richard Nixon - Attributed to the former US president. 17 Nov 1973.</pre></div>
    
    
    		<p>The <code>SimpleMDC</code> application illustrates how logback
    		layouts, if configured appropriately, can automatically output
    		<code>MDC</code> information.  Moreover, the information placed
    		into the <code>MDC</code> can be used by multiple logger
    		invocations.
    		</p>
    		
    		<h3 class="doAnchor">Advanced Use</h3>
    		
    		<p>Mapped Diagnostic Contexts shine brightest within client server
    		architectures.  Typically, multiple clients will be served by
    		multiple threads on the server.  Although the methods in the
    		<code>MDC</code> class are static, the diagnostic context is
    		managed on a per thread basis, allowing each server thread to bear
    		a distinct <code>MDC</code> stamp. <code>MDC</code> operations
    		such as <code>put()</code> and <code>get()</code> affect only the
    		<code>MDC</code> of the <em>current</em> thread, and the children
    		of the current thread. The <code>MDC</code> in other threads
    		remain unaffected. Given that <code>MDC</code> information is
    		managed on a per thread basis, each thread will have its own copy
    		of the <code>MDC</code>.  Thus, there is no need for the developer
    		to worry about thread-safety or synchronization when programming
    		with the <code>MDC</code> because it handles these issues safely
    		and transparently.
    		</p>
    
    		<p>The next example is somewhat more advanced.  It shows how the
    		<code>MDC</code> can be used in a client-server setting.  The
    		server-side implements the <code>NumberCruncher</code> interface
    		shown in Example 7.2 below. <code>The NumberCruncher</code>
    		interface contains a single method named
    		<code>factor()</code>. Using RMI technology, the client invokes
    		the <code>factor()</code> method of the server application to
    		retrieve the distinct factors of an integer.
    		</p>
    
    <em>Example 7.2: The service interface (<a href="../xref/chapters/mdc/NumberCruncher.html">
    logback-examples/src/main/java/chapters/mdc/NumberCruncher.java)</a></em>
    <pre class="prettyprint source">package chapters.mdc;
    
    import java.rmi.Remote;
    import java.rmi.RemoteException;
    
    /**
     * NumberCruncher factors positive integers.
     */
    public interface NumberCruncher extends Remote {
      /**
       * Factor a positive integer <code>number</code> and return its
       * <em>distinct</em> factor's as an integer array.
       * */
      int[] factor(int number) throws RemoteException;
    }</pre>
    
    		<p>
    			The <code>NumberCruncherServer</code> application, listed in Example 7.3 below, 
    			implements the <code>NumberCruncher</code> interface. Its main method exports 
    			an RMI Registry on the local host that accepts requests on a well-known port.  
    		</p>
    
    <em>Example 7.3: The server side (<a href="../xref/chapters/mdc/NumberCruncherServer.html">
    logback-examples/src/main/java/chapters/mdc/NumberCruncherServer.java)</a></em>
    <pre class="prettyprint source">package chapters.mdc;
    
    import java.rmi.RemoteException;
    import java.rmi.registry.LocateRegistry;
    import java.rmi.registry.Registry;
    import java.rmi.server.UnicastRemoteObject;
    import java.util.Vector;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.slf4j.MDC;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.core.joran.spi.JoranException;
    
    
    /**
     * A simple NumberCruncher implementation that logs its progress when
     * factoring numbers. The purpose of the whole exercise is to show the
     * use of mapped diagnostic contexts in order to distinguish the log
     * output from different client requests.
     * */
    public class NumberCruncherServer extends UnicastRemoteObject
      implements NumberCruncher {
    
      private static final long serialVersionUID = 1L;
    
      static Logger logger = LoggerFactory.getLogger(NumberCruncherServer.class);
    
      public NumberCruncherServer() throws RemoteException {
      }
    
      public int[] factor(int number) throws RemoteException {
        // The client's host is an important source of information.
        try {
          <b>MDC.put("client", NumberCruncherServer.getClientHost());</b>
        } catch (java.rmi.server.ServerNotActiveException e) {
          logger.warn("Caught unexpected ServerNotActiveException.", e);
        }
    
        // The information contained within the request is another source
        // of distinctive information. It might reveal the users name,
        // date of request, request ID etc. In servlet type environments,
        // useful information is contained in the HttpRequest or in the  
        // HttpSession.
        <b>MDC.put("number", String.valueOf(number));</b>
    
        logger.info("Beginning to factor.");
    
        if (number &lt;= 0) {
          throw new IllegalArgumentException(number +
            " is not a positive integer.");
        } else if (number == 1) {
          return new int[] { 1 };
        }
    
        Vector&lt;Integer> factors = new Vector&lt;Integer>();
        int n = number;
    
        for (int i = 2; (i &lt;= n) &amp;&amp; ((i * i) &lt;= number); i++) {
          // It is bad practice to place log requests within tight loops.
          // It is done here to show interleaved log output from
          // different requests. 
          logger.debug("Trying " + i + " as a factor.");
    
          if ((n % i) == 0) {
            logger.info("Found factor " + i);
            factors.addElement(new Integer(i));
    
            do {
              n /= i;
            } while ((n % i) == 0);
          }
    
          // Placing artificial delays in tight loops will also lead to
          // sub-optimal results. :-)
          delay(100);
        }
    
        if (n != 1) {
          logger.info("Found factor " + n);
          factors.addElement(new Integer(n));
        }
    
        int len = factors.size();
    
        int[] result = new int[len];
    
        for (int i = 0; i &lt; len; i++) {
          result[i] = ((Integer) factors.elementAt(i)).intValue();
        }
    
        <b>// clean up
        MDC.remove("client");
        MDC.remove("number");</b>
    
        return result;
      }
    
      static void usage(String msg) {
        System.err.println(msg);
        System.err.println("Usage: java chapters.mdc.NumberCruncherServer configFile\n" +
          "   where configFile is a logback configuration file.");
        System.exit(1);
      }
    
      public static void delay(int millis) {
        try {
          Thread.sleep(millis);
        } catch (InterruptedException e) {
        }
      }
    
      public static void main(String[] args) {
        if (args.length != 1) {
          usage("Wrong number of arguments.");
        }
    
        String configFile = args[0];
    
        if (configFile.endsWith(".xml")) {
          try {
            LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
            JoranConfigurator configurator = new JoranConfigurator();
            configurator.setContext(lc);
            lc.reset();
            configurator.doConfigure(args[0]);
          } catch (JoranException je) {
            je.printStackTrace();
          }
        }
    
        NumberCruncherServer ncs;
    
        try {
          ncs = new NumberCruncherServer();
          logger.info("Creating registry.");
    
          Registry registry = LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
          registry.rebind("Factor", ncs);
          logger.info("NumberCruncherServer bound and ready.");
        } catch (Exception e) {
          logger.error("Could not bind NumberCruncherServer.", e);
    
          return;
        }
      }
    }</pre>
    
    		<p>The implementation of the <code>factor(int number)</code>
    		method is of particular relevance. It starts by putting the
    		client's hostname into the <code>MDC</code> under the key
    		<em>client</em>. The number to factor, as requested by the client,
    		is put into the <code>MDC</code> under the key
    		<em>number</em>. After computing the distinct factors of the
    		integer parameter, the result is returned to the client. Before
    		returning the result however, the values for the <em>client</em>
    		and <em>number</em> are cleared by calling the
    		<code>MDC.remove()</code> method. Normally, a <code>put()</code>
    		operation should be balanced by the corresponding
    		<code>remove()</code> operation. Otherwise, the <code>MDC</code>
    		will contain stale values for certain keys. We would recommend
    		that whenever possible, <code>remove()</code> operations be
    		performed within finally blocks, ensuring their invocation
    		regardless of the execution path of the code.
    		</p>	
    		
    		<p>
    			After these theoretical explanations, we are ready to run the number 
    			cruncher example. Start the server with the following command:
    		</p>
    		
    <div class="source"><pre>java chapters.mdc.NumberCruncherServer src/main/java/chapters/mdc/mdc1.xml</pre></div>
    		
    		<p>
    			The <em>mdc1.xml</em> configuration file is listed below:
    		</p>
    <em>Example 7.4: Configuration file (logback-examples/src/main/java/chapters/mdc/mdc1.xml)</em>
    <pre class="prettyprint source">&lt;configuration>
      &lt;appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        &lt;layout>
          &lt;Pattern>%-4r [%thread] %-5level <b>C:%X{client} N:%X{number}</b> - %msg%n&lt;/Pattern>
        &lt;/layout>	    
      &lt;/appender>
      
      &lt;root level="debug">
        &lt;appender-ref ref="CONSOLE"/>
      &lt;/root>  
    &lt;/configuration></pre>
    
    		<p>
    			Note the use of the <em>%X</em> conversion specifier within the 
    			<span class="option">Pattern</span> option.
    		</p>
    	
    		<p>
    			The following command starts an instance of <code>NumberCruncherClient</code> 
    			application:  	
    		</p>
    		
    <div class="source"><pre>java chapters.mdc.NumberCruncherClient <em>hostname</em></pre></div>
    
    		<p>
    			where <em>hostname</em> is the host where the 
    			<code>NumberCruncherServer</code> is running
    		</p>
    		
    		<p>
    			Executing multiple instances of the client and requesting the server to factor 
    			the numbers 129 from the first client and shortly thereafter 
    			the number 71 from the second client, the server outputs the following:
    		</p>
    		
    <div class="source"><pre>
    <b>70984 [RMI TCP Connection(4)-192.168.1.6] INFO  C:orion N:129 - Beginning to factor.</b>
    70984 [RMI TCP Connection(4)-192.168.1.6] DEBUG C:orion N:129 - Trying 2 as a factor.
    71093 [RMI TCP Connection(4)-192.168.1.6] DEBUG C:orion N:129 - Trying 3 as a factor.
    71093 [RMI TCP Connection(4)-192.168.1.6] INFO  C:orion N:129 - Found factor 3
    71187 [RMI TCP Connection(4)-192.168.1.6] DEBUG C:orion N:129 - Trying 4 as a factor.
    71297 [RMI TCP Connection(4)-192.168.1.6] DEBUG C:orion N:129 - Trying 5 as a factor.
    71390 [RMI TCP Connection(4)-192.168.1.6] DEBUG C:orion N:129 - Trying 6 as a factor.
    <b>71453 [RMI TCP Connection(5)-192.168.1.6] INFO  C:orion N:71 - Beginning to factor.</b>
    71453 [RMI TCP Connection(5)-192.168.1.6] DEBUG C:orion N:71 - Trying 2 as a factor.
    71484 [RMI TCP Connection(4)-192.168.1.6] DEBUG C:orion N:129 - Trying 7 as a factor.
    71547 [RMI TCP Connection(5)-192.168.1.6] DEBUG C:orion N:71 - Trying 3 as a factor.
    71593 [RMI TCP Connection(4)-192.168.1.6] DEBUG C:orion N:129 - Trying 8 as a factor.
    71656 [RMI TCP Connection(5)-192.168.1.6] DEBUG C:orion N:71 - Trying 4 as a factor.
    71687 [RMI TCP Connection(4)-192.168.1.6] DEBUG C:orion N:129 - Trying 9 as a factor.
    71750 [RMI TCP Connection(5)-192.168.1.6] DEBUG C:orion N:71 - Trying 5 as a factor.
    71797 [RMI TCP Connection(4)-192.168.1.6] DEBUG C:orion N:129 - Trying 10 as a factor.
    71859 [RMI TCP Connection(5)-192.168.1.6] DEBUG C:orion N:71 - Trying 6 as a factor.
    71890 [RMI TCP Connection(4)-192.168.1.6] DEBUG C:orion N:129 - Trying 11 as a factor.
    71953 [RMI TCP Connection(5)-192.168.1.6] DEBUG C:orion N:71 - Trying 7 as a factor.
    72000 [RMI TCP Connection(4)-192.168.1.6] INFO  C:orion N:129 - Found factor 43
    72062 [RMI TCP Connection(5)-192.168.1.6] DEBUG C:orion N:71 - Trying 8 as a factor.
    72156 [RMI TCP Connection(5)-192.168.1.6] INFO  C:orion N:71 - Found factor 71</pre></div>
    
    		<p>
    			The clients were run from a machine called <em>orion</em> as can be seen in 
    			the above output. Even if the server processes the requests of clients 
    			near-simultaneously in separate threads, the logging output pertaining 
    			to each client request can be distinguished by studying the output of the 
    			<code>MDC</code>. Note for example the stamp associated with <em>number</em>, 
    			i.e. the number to factor. 
    		</p>
    		
    		<p>
    			The attentive reader might have observed that the thread name could 
    			also have been used to distinguish each request. The thread name can cause 
    			confusion if the server side technology recycles threads. In that case, 
    			it may be hard to determine the boundaries of each request, that is, 
    			when a given thread finishes servicing a request and when it begins servicing the next.
    			Because the <code>MDC</code> is under the control of the application developer, 
    			<code>MDC</code> stamps do not suffer from this problem. 
    		</p>
    		
    		
    		
    		<h3 class="doAnchor" name="autoMDC">Automating access to the <code>MDC</code></h3>
    		
    		<p>As we've seen, the <code>MDC</code> is very useful when dealing
    			with multiple clients. In the case of a web application that
    			manages user authentication, one simple solution could be to set
    			the user's name in the <code>MDC</code> and remove it once the
    			user logs out. Unfortunately, it is not always possible to
    			achieve reliable results using this technique. Since
    			<code>MDC</code> manages data on a <em>per thread</em> basis, a
    			server that recycles threads might lead to false information
    			contained in the <code>MDC</code>.
    		</p>
    		
    		<p>To allow the information contained in the <code>MDC</code> to
    			be correct at all times when a request is processed, a possible
    			approach would be to store the username at the beginning of the
    			process, and remove it at the end of said process. A servlet <a
    			href="http://java.sun.com/javaee/5/docs/api/javax/servlet/Filter.html">
    			<code>Filter</code></a> comes in handy in this case.
    		</p>
    		
    		<p>Within the servlet filter's <code>doFilter</code> method, we
    		can retrieve the relevant user data through the request (or a
    		cookie therein), store it the <code>MDC</code>.  Subsequent
    		processing by other filters and servlets will automatically
    		benefit from the MDC data that was stored previously. Finally,
    		when our servlet filter regains control, we have an opportunity to
    		clean MDC data.
    		</p>
    		
    		<p>Here is an implementation of such a filter:</p>
    
    <em>Example 7.5: User servlet filter (<a href="../xref/chapters/mdc/UserServletFilter.html">
    logback-examples/src/main/java/chapters/mdc/UserServletFilter.java)</a></em>
    <pre class="prettyprint source">package chapters.mdc;
    
    import java.io.IOException;
    import java.security.Principal;
    
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;
    
    import org.slf4j.MDC;
    
    public class UserServletFilter implements Filter {
    
      private final String USER_KEY = "username";
      
      public void destroy() {
      }
    
      public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain) throws IOException, ServletException {
    
        boolean successfulRegistration = false;
    
        HttpServletRequest req = (HttpServletRequest) request;    
        Principal principal = req.getUserPrincipal();
        // Please note that we could have also used a cookie to 
        // retrieve the user name
    
        if (principal != null) {
          String username = principal.getName();
          successfulRegistration = registerUsername(username);
        } 
    
        try {
          chain.doFilter(request, response);
        } finally {
          if (successfulRegistration) {
            MDC.remove(USER_KEY);
          }
        }
      }
    
      public void init(FilterConfig arg0) throws ServletException {
      }
      
    
      /**
       * Register the user in the MDC under USER_KEY.
       * 
       * @param username
       * @return true id the user can be successfully registered
       */
      private boolean registerUsername(String username) {
        if (username != null &amp;&amp; username.trim().length() > 0) {
          MDC.put(USER_KEY, username);
          return true;
        }
        return false;
      }
    }</pre>
    
    	<p>When the filter's <code>doFilter()</code> method is called, it
    	first looks for a <code>java.security.Principal</code> object in the
    	request. This object contains the name of the currently
    	authenticated user. If a user information is found, it is registered
    	in the <code>MDC</code>.
    	</p>
    		
    	<p>Once the filter chain has completed, the filter removes the user
    		information from the <code>MDC</code>.
    	</p>
    
      <p>The approach we just outlined sets MDC data only for the duration
      of the request and only for the thread processing it. Other threads
      are unaffected. Furthermore, any given thread will contain correct
      MDC data at any point in time.</p>
    		
    
    
      <h3 class="doAnchor" name="managedThreads">MDC And Managed
      Threads</h3>
    
      <p>A copy of the mapped diagnostic context can not always be
      inherited by worker threads from the initiating thread. This is the
      case when <code>java.util.concurrent.Executors</code> is used for
      thread management. For instance, <code>newCachedThreadPool</code>
      method creates a <code>ThreadPoolExecutor</code> and like other
      thread pooling code, it has intricate thread creation logic.
      </p>
    
      <p>In such cases, it is recommended that
      <code>MDC.getCopyOfContextMap()</code> is invoked on the original
      (master) thread before submitting a task to the executor.  When the
      task runs, as its first action, it should invoke
      <code>MDC.setContextMapValues()</code> to associate the stored copy
      of the original MDC values with the new <code>Executor</code>
      managed thread.
      </p>
    
      <h3 class="doAnchor" name="mis">MDCInsertingServletFilter</h3>
    
      <p>Within web applications, it often proves helpful to know the
      hostname, request uri and user-agent associated with a given HTTP
      request. <a
      href="../xref/ch/qos/logback/classic/helpers/MDCInsertingServletFilter.html"><code>MDCInsertingServletFilter</code></a>
      inserts such data into the MDC under the following keys.
      </p>
    
      <table class="bodyTable">
        <tr>
          <th>MDC key</th>
          <th>MDC value</th>
        </tr>
    
        <tr  class="alt">
          <td><code>req.remoteHost</code></td>
          <td>as returned by the <a
          href="http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/ServletRequest.html#getRemoteHost%28%29">getRemoteHost()</a>
          method
          </td>
        </tr>
    
        <tr >
          <td><code>req.xForwardedFor</code></td>
          <td>value of the <a
          href="http://en.wikipedia.org/wiki/X-Forwarded-For">"X-Forwarded-For"</a>
          header
          </td>
        </tr>
    
        <tr class="alt">
          <td><code>req.requestURI</code></td>
          <td>
            as returned by <a
            href="http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/http/HttpServletRequest.html#getRequestURI%28%29">getRequestURI()</a>
            method
          </td>
        </tr>
    
        <tr >
          <td><code>req.requestURL</code></td>
          <td>
            as returned by <a
            href="http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/http/HttpServletRequest.html#getRequestURL%28%29">getRequestURL()</a>
            method
          </td>
        </tr>
    
        <tr class="alt">
          <td><code>req.queryString</code></td>
          <td>
            as returned by <a
            href="http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/http/HttpServletRequest.html#getQueryString%28%29">getQueryString()</a>        method
          </td>
        </tr>
    
        <tr>
          <td><code>req.userAgent</code></td>
          <td>value of the "User-Agent" header
          </td>
        </tr>
    
      </table>
    
      <p>To install <code>MDCInsertingServletFilter</code> add the
      following lines to your web-application's <em>web.xml</em> file</p>
    
      <pre class="prettyprint source">&lt;filter>
      &lt;filter-name>MDCInsertingServletFilter&lt;/filter-name>
      &lt;filter-class>
        ch.qos.logback.classic.helpers.MDCInsertingServletFilter
      &lt;/filter-class>
    &lt;/filter>
    &lt;filter-mapping>
      &lt;filter-name>MDCInsertingServletFilter&lt;/filter-name>
      &lt;url-pattern>/*&lt;/url-pattern>
    &lt;/filter-mapping> </pre>
    
      <p><b>If your web-app has multiple filters, make sure that
      <code>MDCInsertingServletFilter</code> is declared before other
      filters.</b> For example, assuming the main processing in your
      web-app is done in filter 'F', the MDC values set by
      <code>MDCInsertingServletFilter</code> will not be seen by the code
      invoked by 'F' if <code>MDCInsertingServletFilter</code> comes after
      'F'.
      </p>
    
      <p>Once the filter is installed, values corresponding to each MDC
      key will be output by the %X <a
      href="layouts.html#conversionWord">conversion word</a> according to
      the key passes as first option. For example, to print the remote
      host followed by the request URI on one line, the date followed by
      the message on the next, you would set <code>PatternLayout</code>'s
      pattern to:
      
      </p>
    
      <p class="source">%X{req.remoteHost} %X{req.requestURI}%n%d - %m%n</p>
    
      <script src="../templates/footer.js" type="text/javascript"></script>
    </div>
    </body>
    </html>
    ��������������������������logback_1.0.13/logback-site/src/site/pages/manual/usingSSL.html�������������������������������������0000644�0001750�0001750�00000174325�12136042273�024240� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Chapter 15: Using SSL</title>
        <link rel="stylesheet" type="text/css" href="../css/common.css" />
        <link rel="stylesheet" type="text/css" href="../css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="../css/_print.css" media="print" />
        <link rel="stylesheet" type="text/css" href="../css/prettify.css" media="screen" />    
    
      </head>
      <body onload="prettyPrint(); decorate();">
        <script type="text/javascript">prefix='../';</script>
        <script type="text/javascript" src="../js/prettify.js"></script>
        <script type="text/javascript" src="../templates/header.js"></script>
        <script type="text/javascript" src="../js/dsl.js"></script>
        <script type="text/javascript" src="../js/jquery-min.js"></script>
        <script type="text/javascript" src="../js/decorator.js"></script>
        <div id="left">      
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="../templates/left.js" type="text/javascript"></script>
        </div>    
        <div id="right">
          <script src="menu.js" type="text/javascript"></script>
        </div>
        <div id="content">    
          <h1>Chapter 15: Using SSL</h1>
          
          <div class="quote">
    
            <p><em>The whole difference between construction and creation is 
            exactly this: that a thing constructed can only be loved after it 
            is constructed; but a thing created is loved before it exists.</em></p>
            <p>&mdash;CHARLES DICKENS</p>
          </div>
    
    
          <script src="../templates/creative.js" type="text/javascript"></script>
          <!-- script src="../templates/setup.js" type="text/javascript"></script -->
    
          <p>Logback supports the use of the Secure Sockets Layer 
             (SSL) when delivering log events from a socket-based appender
             to a remote receiver.  When using an SSL-enabled appender and  
             corresponding receiver, serialized logging events are delivered 
             over a secure channel.
          </p>
          
          <h2 class="doAnchor">SSL and Component Roles</h2>
          
          <p>Logback components such as appenders and receivers may act in
          either the server role or the client role, with respect to network
          connection initiation. When acting in the server role, a logback
          component passively listens for connections from remote client
          components.  Conversely, a component acting in the client role 
          initiates a connection to remote server component.  For example, 
          an appender acting in the <em>client</em> role connects to a 
          receiver acting in the <em>server</em> role.  Or a receiver
          acting in the <em>client</em> role connects to an appender
          acting in the <em>server</em> role.</p>
          
          <p>The roles of the components are generally determined by the
          component type.  For example, an <code>SSLServerSocketAppender</code>
          is an appender component that acts in the server role, while an
          <code>SSLSocketAppender</code> is an appender component that acts
          in the client role.  Thus the developer or application administrator 
          can configure Logback components to support the desired direction
          of network connection initiation.</p>
          
          <p>The direction of connection initiation is significant in the 
          context of SSL, because in SSL a server component must possess an
          X.509 credential to identify itself to connecting clients.  A
          client component, when connecting to the server, uses the server's
          certificate to validate that the server is trusted.  The
          developer or application administrator must be aware of the 
          roles of Logback components, so as to properly configure the
          server's key store (containing the server's X.509 credential) 
          and the client's trust store (containing self-signed 
          root certificates used when validating server trust).</p>
          
          <p>When SSL is configured for <em>mutual authentication</em>, then
          both the server component and the client component must possess
          valid X.509 credentials whose trust can be asserted by their 
          respective peer.  Mutual authentication is configured in the
          server component, therefore the developer or application 
          administrator must be aware of which components are acting in 
          the server role.</p>
          
          <p>In this chapter, we use the term <em>server component</em>
          or simply <em>server</em> to refer to a Logback component such
          as an appender or receiver that is acting in the server role.  We
          use the term <em>client component</em> or simply <em>client</em>
          to refer to a component that is acting in the client role.
                
          <h2 class="doAnchor">SSL and X.509 Certificates</h2>
          
          <p>In order to use SSL-enabled Logback components, you will need an
             X.509 credential (a private key, corresponding certificate,
             and CA certification chain) to identify your components
             that act as SSL servers.  If you wish to use mutual authentication, 
             you will also need credentials for your components that 
             act as SSL clients.
          </p>      
          <p>While you can use a credential issued by a commercial
             certification authority (CA), you can also use a certificate issued
             from your own internal CA or even a self-signed certificate.  The
             following is all that is required:
          </p> 
          <ol>
            <li>The server component must be configured 
                with a key store containing the server's private key, 
                corresponding certificate, and CA certification chain
                 (if not using a self-signed certificate).
            </li>
            <li>The client component must be configured 
                with a trust store containing trusted root CA 
                certificate(s) or the server's self-signed root certificate.
            </li>
          </ol>
              
          <h2 class="doAnchor">Configuring Logback Components for SSL</h2>
          <p>The Java Secure Sockets Extension (JSSE) and Java Cryptography 
             Architecture (JCA) which is used to implement Logback's SSL
             support has many configurable options, and a pluggable provider
             framework that allows the built-in SSL and cryptographic
             capabilities of the platform to be replaced or augmented.
             SSL-enabled Logback components provide the ability to fully specify 
             all of the configurable aspects of the SSL engine and cryptographic 
             providers, to meet your unique security needs.
          </p>
          
          <h3>Basic SSL Configuration using JSSE System Properties</h3>
          <p>Fortunately, nearly all of the configurable SSL properties for
             SSL-enabled Logback components have reasonable defaults.  In 
             most cases all that is needed is the configuration of some JSSE 
             system properties.
          </p>
          
          <p>The remainder of this section describes the specific JSSE
             properties that are needed in most environments. See 
             <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#InstallationAndCustomization">
             Customizing JSSE</a> in the <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html">
             JSSE Reference Guide</a> for more information on setting JSSE
             system properties to customize JSSE.      
          </p>
    
          <p>If you're using any of Logback's SSL-enabled appender or receiver
             components that act in the server role (e.g. 
             <code>SSLServerSocketReceiver</code>, 
             <code>SSLServerSocketAppender</code>,
             or <code>SimpleSSLSocketServer</code>) you'll need to configure 
             JSSE system properties that provide the location, type, and 
             password of the key store containing a private key and 
             certificate.
          </p>
          
          <h4><a name="basicConfig.keyStore"></a>
              System Properties for Server Key Store Configuration</h4>
          <table class="bodyTable striped">
            <tr>
              <th>Property Name</th>
              <th>Description</th>
            </tr>
            <tr>
              <td><code>javax.net.ssl.keyStore</code></td>
              <td>Specifies a filesystem path to the file containing your
                  server components's private key and certificate.</td>
            </tr>
            <tr>
              <td><code>javax.net.ssl.keyStoreType</code></td>
              <td>Specifies the key store type.  If this property is not
                  specified, the platform's default type (JKS) is assumed.
              </td>
            </tr>
            <tr>
              <td><code>javax.net.ssl.keyStorePassword</code></td>
              <td>Specifies the password needed to access the key store.
              </td>
            </tr>
          </table>
    
          <p>See <a href="#Examples">Examples</a> below for examples of
             setting these system properties when starting an application
             that uses Logback's SSL-enabled server components.
          </p>
             
          <p>If your server component is using a certificate 
             that was signed by a commercial certification authority (CA), 
             <strong>you probably don't need to provide <em>any</em> SSL 
             configuration in your applications that use SSL-enabled client 
             components</strong>.  When using a commercially-signed 
             certificate for your server  component, simply setting the 
             system key store properties for JVM that runs the server 
             component is usually all that is needed.
          </p>
                   
          <p>If you are using either a self-signed server certificate
             or your server certificate was signed by a
             certification authority (CA) that is not among those whose root
             certificates are in the Java platform's default trust store
             (e.g. when your organization has its own internal certification
             authority), you will need to configure the JSSE system
             properties that provide the location, type, and password of the
             trust store containing your server's certificate or trusted
             root certificates for the certification authority (CA) that
             signed your server's certificate.  <strong>These properties will 
             need to be set in each application that utilizes an SSL-enabled
             client component</strong>.
          </p>
            
          <h4><a name="basicConfig.trustStore"></a>
              System Properties for Client Trust Store Configuration</h4>
          <table class="bodyTable striped">
            <tr>
              <th>Property Name</th>
              <th>Description</th>
            </tr>
            <tr>
              <td><code>javax.net.ssl.trustStore</code></td>
              <td>Specifies a filesystem path to the file containing your
                  server component's certificate or trusted root
                  certificate(s) for the certification authority (CA) that
                  signed the server certificate.</td>
            </tr>
            <tr>
              <td><code>javax.net.ssl.trustStoreType</code></td>
              <td>Specifies the trust store type.  If this property is not
                  specified, the platform's default type (JKS) is assumed.
              </td>
            </tr>
            <tr>
              <td><code>javax.net.ssl.trustStorePassword</code></td>
              <td>Specifies the password needed to access the trust store.
              </td>
            </tr>
          </table>
    
          <p>See <a href="#Examples">Examples</a> below for examples of
             setting these system properties when starting an application 
             that utilizes Logback's SSL-enabled client components.
          </p>         
                
          <h3 class="doAnchor"><a name="SSLConfiguration"></a>
             Advanced SSL Configuration</h3>
          <p>In certain situations, the basic SSL configuration using 
             JSSE system properties is not adequate.  For example, if you
             are using the <code>SSLServerSocketReceiver</code> component in a web
             application, you may wish to use a different credential to
             identify your logging server for your remote logging clients
             than the credential that your web server uses to identify
             itself to web clients.  You might wish to use SSL client
             authentication on your logging server to ensure that only
             authentic and authorized remote loggers can connect. Or perhaps
             your organization has strict policies regarding the SSL
             protocols and cipher suites that may be utilized on the
             organization's network.  For any of these needs, you will need
             to make use of Logback's advanced configuration options for SSL.
          </p>
          <p>When configuring a Logback component that supports SSL, you 
             specify the SSL configuration using the <code>ssl</code> 
             property in the configuration of the component.          
          </p>      
          <p>For example, if you wish to use <code>SSLServerSocketReceiver</code>
             and configure the key store properties for your logging 
             server's credential, you could use a configuration such as the 
             following.
          </p>
    
          <span class="asGroovy" onclick="return asGroovy('logback-ssl-serverKeyStore');">View as .groovy</span>
          <pre id="logback-ssl-serverKeyStore" class="prettyprint source">&lt;configuration>
    
      &lt;appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        &lt;encoder>
          &lt;pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
      
      &lt;root level="debug">
        &lt;appender-ref ref="CONSOLE" />
      &lt;/root>
    
      &lt;receiver class="ch.qos.logback.classic.net.server.SSLServerSocketReceiver">
        &lt;ssl>
          &lt;keyStore>
            &lt;location>classpath:/logging-server-keystore.jks&lt;/location>
            &lt;password>changeit&lt;/password>
          &lt;/keyStore>
        &lt;/ssl>
      &lt;/receiver> 
    
    &lt;/configuration></pre>
    
          <p>This configuration specifies the location of the key store
             as <em>logging-server-keystore.jks</em> at the root of
             the application's classpath.  You could alternatively 
             specify a <code>file:</code> URL to identify the location of
             the key store.
          </p>
          <p>If you wanted to use <code>SSLSocketAppender</code> in your
             application's Logback configuration, but did not want to change
             the application's default trust store using the JSSE
             <code>javax.net.ssl.trustStore</code> property, you could 
             configure the appender as follows.
          </p>          
    
          <span class="asGroovy" onclick="return asGroovy('logback-ssl-clientTrustStore');">View as .groovy</span>
          <pre id="logback-ssl-clientTrustStore" class="prettyprint source">&lt;configuration>
      &lt;appender name="SOCKET" class="ch.qos.logback.classic.net.SSLSocketAppender">
        &lt;ssl>
          &lt;trustStore>
            &lt;location>classpath:/logging-server-truststore.jks&lt;/location>
            &lt;password>changeit&lt;/password>
          &lt;/trustStore>
        &lt;/ssl>
      &lt;/appender>
      
      &lt;root level="debug">
        &lt;appender-ref ref="SOCKET" />
      &lt;/root>
    
    &lt;/configuration></pre>
    
          <p>This configuration specifies the location of the trust store
             as <em>logging-server-truststore.jks</em> at the root of
             the application's classpath.  You could alternatively 
             specify a <code>file:</code> URL to identify the location of
             the trust store.
          </p>
    
          <h4>SSL Configuration Properties</h4>
          
          <p>JSSE exposes a large number of configurable options, and 
             Logback's SSL support makes nearly all of them available for
             you to specify in your SSL-enabled component configuration.  
             When using XML configuration, SSL properties are introduced to 
             these components by nesting an &lt;ssl> element in the 
             component configuration.  This configuration element corresponds 
             to the 
             <a href="../xref/ch/qos/logback/core/net/ssl/SSLConfiguration.html">
             <code>SSLConfiguration</code></a> class.
          </p>
          
          <p>When configuring SSL for your components
             you need only configure those SSL properties for which the
             defaults are not adequate.  Overspecifying the SSL configuration
             is often the cause of difficult-to-diagnose problems.
          </p>
     
          <p>The following table describes the top-level SSL configuration
             properties.  Many of these properties introduce additional
             subproperties, which are described in tables that follow 
             after the top-level properties are described.
          </p>
                
          <table class="bodyTable striped">
            <tr>
              <th>Property Name</th>
              <th>Type</th>
              <th>Description</th>
            </tr>
            <tr>
              <td><span class="prop" container="ssl">keyManagerFactory</span></td>
              <td><a href="../xref/ch/qos/logback/core/net/ssl/KeyManagerFactoryFactoryBean.html">
                  <code>KeyManagerFactoryFactoryBean</code></a>
              </td>
              <td>Specifies the configuration used to create a
                  <a href="http://docs.oracle.com/javase/1.5.0/docs/api/javax/net/ssl/KeyManagerFactory.html">
                  <code>KeyManagerFactory</code></a>.  The Java platform's default 
                  factory will be used if this property is not configured.  See
                  <a href="#KeyManagerFactoryFactoryBean">Key Manager Factory
                  Configuration</a>
                  below. 
              </td>
            </tr>
            <tr>
              <td><a name="ssl.keyStore"></a><span class="prop" container="ssl">keyStore</span></td>
              <td><a href="../xref/ch/qos/logback/core/net/ssl/KeyStoreFactoryBean.html">
                  <code>KeyStoreFactoryBean</code></a>
              </td>
              <td>
                <p>Specifies the configuration used to create a
                   <a href="http://docs.oracle.com/javase/1.5.0/docs/api/java/security/KeyStore.html">
                   <code>KeyStore</code></a>.  The KeyStore created by this property
                   should contain a single X.509 credential (consisting of a 
                   private key, corresponding certificate, and CA certificate chain).
                   This credential is presented by the local SSL peer to the remote
                   SSL peer.
                </p>
                <p>When configuring an SSL client (e.g. <code>SSLSocketAppender</code>),
                   the <span class="prop" container="ssl">keyStore</span> property
                   is needed only if the remote peer is configured to require
                   client authentication. 
                </p>
                <p>When configuring an SSL server (e.g. <code>SimpleSSLSocketServer</code>)
                   the <span class="prop" container="ssl">keyStore</span> property
                   specifies the key store containing the server's credential.  If
                   this property is not configured, the JSSE's
                   <code>javax.net.ssl.keyStore</code> system property must be
                   configured to provide the location of the server's key store.
                   See <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#InstallationAndCustomization">
                   Customizing JSSE</a> in the 
                   <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html">
                   JSSE Reference Guide</a> for more information on setting JSSE
                   system properties.
                </p>
                <p>See <a href="#KeyStoreFactoryBean">Key Store Configuration</a>
                   below. 
                </p>
              </td>
            </tr>
            <tr>
              <td><span class="prop" container="ssl">parameters</span></td>
              <td><a href="../xref/ch/qos/logback/core/net/ssl/SSLParametersConfiguration.html">
                  <code>SSLParametersConfiguration</code></a></td>
              <td>Specifies various parameters used in SSL session negotiation.
                  See <a href="#SSLParametersConfiguration">SSL Parameters Configuration</a>
                  below.
              </td>
            </tr>
            <tr>
              <td><span class="prop" container="ssl">protocol</span></td>
              <td><code>String</code></td>
              <td>Specifies the SSL protocol that will be used to create an 
                  <a href="http://docs.oracle.com/javase/1.5.0/docs/api/javax/net/ssl/SSLContext.html">
                  <code>SSLContext</code></a>.
                  See the <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#AppA">
                  Standard Names</a> specification in the 
                  <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html">
                  JSSE Reference Guide</a>.  The Java platform's default protocol 
                  will be used if this property is not configured.
              </td>
            </tr>
            <tr>
              <td><span class="prop" container="ssl">provider</span></td>
              <td><code>String</code></td>
              <td>Specifies the name of the JSSE provider that will be used to
                  create an 
                  <a href="http://docs.oracle.com/javase/1.5.0/docs/api/javax/net/ssl/SSLContext.html">
                  <code>SSLContext</code></a>.  The Java platform's default JSSE 
                  provider will be used if this property is not configured.
              </td>
            </tr>
            <tr>
              <td><span class="prop" container="ssl">secureRandom</span></td>
              <td><a href="../xref/ch/qos/logback/core/net/ssl/SecureRandomFactoryBean.html">
                  <code>SecureRandomFactoryBean</code></a>
              </td>
              <td>Specifies the configuration used to create a
                  <a href="http://docs.oracle.com/javase/1.5.0/docs/api/java/security/SecureRandom.html">
                  <code>SecureRandom</code></a> &mdash; a secure random number
                  generator.  The Java platform's default generator will be used  
                  if this property is not configured.  See
                  <a href="#SecureRandomFactoryBean">Secure Random Generator
                  Configuration</a> below. 
              </td>
            </tr>
            <tr>
              <td><span class="prop" container="ssl">trustManagerFactory</span></td>
              <td><a href="../xref/ch/qos/logback/core/net/ssl/TrustManagerFactoryFactoryBean.html">
                  <code>TrustManagerFactoryFactoryBean</code></a>
              </td>
              <td>Specifies the configuration used to create a
                  <a href="http://docs.oracle.com/javase/1.5.0/docs/api/javax/net/ssl/TrustManagerFactory.html">
                  <code>TrustManagerFactory</code></a>.  The Java platform's default 
                  factory will be used if this property is not configured.  See
                  <a href="#TrustManagerFactoryFactoryBean">Trust Manager Factory</a>
                  below. 
              </td>
            </tr>
            <tr>
              <td><a name="ssl.trustStore"></a><span class="prop" container="ssl">trustStore</span></td>
              <td><a href="../xref/ch/qos/logback/core/net/ssl/KeyStoreFactoryBean.html">
                  <code>KeyStoreFactoryBean</code></a>
              </td>
              <td>
                <p>Specifies the configuration used to create a
                   <a href="http://docs.oracle.com/javase/1.5.0/docs/api/java/security/KeyStore.html">
                   <code>KeyStore</code></a> used for validating identity of the
                   remote SSL peer.  The KeyStore created by this property
                   should contain one or more <em>trust anchors</em> &mdash; self-signed
                   certificates marked as "trusted" in the keystore.  Typically,
                   the trust store contains self-signed CA certificates.  
                </p>
                <p>The trust store specified by this property overrides any trust 
                   store specified by the JSSE's <code>javax.net.ssl.trustStore</code> 
                   system property and the platform's default trust store.See <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#InstallationAndCustomization">
                   Customizing JSSE</a> in the 
                   <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html">
                   JSSE Reference Guide</a> for more information on setting JSSE
                   system properties.
                </p>
              </td>
            </tr>
          </table>
          
          <h4 class="doAnchor"><a name="KeyStoreFactoryBean"></a>
              Key Store Configuration</h4>
              
          <p>The <a href="../xref/ch/qos/logback/core/net/ssl/KeyStoreFactoryBean.html">
             <code>KeyStoreFactoryBean</code></a> specifies the 
             configuration needed to create a 
             <a href="http://docs.oracle.com/javase/1.5.0/docs/api/java/security/KeyStore.html">
             <code>KeyStore</code></a> containing X.509 credentials.  The properties
             of this factory bean can be used in the
             <a href="#ssl.keyStore"><span class="prop" container="ssl">keyStore</span></a> 
             and 
             <a href="#ssl.trustStore"><span class="prop" container="ssl">trustStore</span></a>
             properties of the <a href="#SSLConfiguration">SSL Configuration</a>.
          </p>
     
          <table class="bodyTable striped">
            <tr>
              <th>Property Name</th>
              <th>Type</th>
              <th>Description</th>
            </tr>
            <tr>
              <td><span class="prop" container="keyStore">location</span></td>
              <td><code>String</code></td>
              <td>A URL that specifies the location of the key store.  Use
                  a <code>file:</code> URL to specify the location of the
                  keystore on a filesystem.  Use a <code>classpath:</code>
                  URL to specify a keystore than can be found on the classpath.
                  If the URL doesn't specify a scheme, <code>classpath:</code>
                  is assumed.</td>
            </tr>
            <tr>
              <td><span class="prop" container="keyStore">password</span></td>
              <td><code>String</code></td>
              <td>Specifies the password needed to access the key store.</td>
            </tr>
            <tr>
              <td><span class="prop" container="keyStore">provider</span></td>
              <td><code>String</code></td>
              <td>Specifies the name of the JCA provider that will be used to
                  create a <code>KeyStore</code>.  The Java 
                  platform's default key store provider will be used if this 
                  property is not configured.
              </td>
            </tr>
            <tr>
              <td><span class="prop" container="keyStore">type</span></td>
              <td><code>String</code></td>
              <td>Specifies the <code>KeyStore</code> type.
                  See the <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/security/CryptoSpec.html#AppA">
                  Standard Names</a> specification in the 
                  <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/security/CryptoSpec.html">
                  Java Cryptography Architecture</a> specification.  The Java 
                  platform's default key store type will be used  if this property 
                  is not configured.
              </td>
            </tr>
          </table>
          
          <h4><a name="KeyManagerFactoryFactoryBean"></a>
              Key Manager Factory Configuration</h4>
              
          <p>The <a href="../xref/ch/qos/logback/core/net/ssl/KeyManagerFactoryFactoryBean.html">
             <code>KeyManagerFactoryFactoryBean</code></a> specifies the 
             configuration needed to create a 
             <a href="http://docs.oracle.com/javase/1.5.0/docs/api/javax/net/ssl/KeyManagerFactory.html">
             <code>KeyManagerFactory</code></a>.  Generally, it isn't necessary
             to explicitly configure the key manager factory, as the platform's
             default factory is adequate for most needs.
          </p>
    
          <table class="bodyTable striped">
            <tr>
              <th>Property Name</th>
              <th>Type</th>
              <th>Description</th>
            </tr>
            <tr>
              <td><span class="prop" container="keyManagerFactory">algorithm</span></td>
              <td><code>String</code></td>
              <td>Specifies the <code>KeyManagerFactory</code> algorithm name.
                  See the <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#AppA">
                  Standard Names</a> specification in the 
                  <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html">
                  JSSE Reference Guide</a>.  The Java platform's default key 
                  manager algorithm will be used if this property is not configured.
              </td>
            </tr>
            <tr>
              <td><span class="prop" container="keyManagerFactory">provider</span></td>
              <td><code>String</code></td>
              <td>Specifies the name of the JCA provider that will be used to
                  create a <code>SecureRandom</code> generator.  The Java 
                  platform's default JSSE provider will be used if this property 
                  is not configured.
              </td>
            </tr>
          </table>
    
          <h4 class="doAnchor"><a name="SecureRandomFactoryBean"></a>
              Secure Random Generator Configuration</h4>
              
          <p>The <a href="../xref/ch/qos/logback/core/net/ssl/SecureRandomFactoryBean.html">
             <code>SecureRandomFactoryBean</code></a> specifies the 
             configuration needed to create a 
             <a href="http://docs.oracle.com/javase/1.5.0/docs/api/java/security/SecureRandom.html">
             <code>SecureRandom</code></a> generator.  Generally, it isn't necessary
             to explicitly configure the secure random generator, as the platform's
             default generator is adequate for most needs.
          </p>
     
          <table class="bodyTable striped">
            <tr>
              <th>Property Name</th>
              <th>Type</th>
              <th>Description</th>
            </tr>
            <tr>
              <td><span class="prop" container="secureRandom">algorithm</span></td>
              <td><code>String</code></td>
              <td>Specifies the <code>SecureRandom</code> algorithm name.
                  See the <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/security/CryptoSpec.html#AppA">
                  Standard Names</a> specification in the 
                  <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/security/CryptoSpec.html">
                  Java Cryptography Architecture</a> specification.  The Java 
                  platform's default random number generation algorithm will be used 
                  if this property is not configured.
              </td>
            </tr>
            <tr>
              <td><span class="prop" container="secureRandom">provider</span></td>
              <td><code>String</code></td>
              <td>Specifies the name of the JCA provider that will be used to
                  create a <code>SecureRandom</code> generator.  The Java 
                  platform's default JSSE provider will be used if this property 
                  is not configured.
              </td>
            </tr>
          </table>
          
          <h4><a name="SSLParametersConfiguration"></a>
              SSL Parameters Configuration</h4>
              
          <p>The <a href="../xref/ch/qos/logback/core/net/ssl/SSLParametersConfiguration.html">
             <code>SSLParametersConfiguration</code></a> allows the customization
             of allowed SSL protocols, cipher suites, and client authentication
             options. 
          </p>
    
          <table class="bodyTable striped">
            <tr>
              <th>Property Name</th>
              <th>Type</th>
              <th>Description</th>
            </tr>
            <tr>
              <td><a name="parameters.excludedCipherSpecs"></a>
                  <span class="prop" container="parameters">excludedCipherSpecs</span></td>
              <td><code>String</code></td>
              <td>
                <p>Specifies a comma-separated list of SSL cipher spec names or
                   patterns to disable during session negotation.  This property is 
                   used to filter the cipher suites supported by the SSL engine, 
                   such that any cipher spec matched by this property is disabled.
                </p>
                <p>Each field in the comma-separated list specified for this 
                   property may be a simple string or a regular expression.
                </p>
                <p>See the <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#AppA">
                  Standard Names</a> specification in the 
                  <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html">
                  JSSE Reference Guide</a> for a list of cipher spec names.
                </p>
              </td>
            </tr>
            <tr>
              <td><a name="parameters.includedCipherSpecs"></a>
                  <span class="prop" container="parameters">includedCipherSpecs</span></td>
              <td><code>String</code></td>
              <td>
                <p>Specifies a comma-separated list of SSL cipher spec names or
                   patterns to enable during session negotation.  This property is 
                   used to filter the cipher suites supported by the SSL engine, 
                   such that only those cipher suites matched by this property are 
                   enabled.
                </p>
                <p>Each field in the comma-separated list specified for this 
                   property may be a simple string or a regular expression.
                </p>
                <p>See the <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#AppA">
                  Standard Names</a> specification in the 
                  <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html">
                  JSSE Reference Guide</a> for a list of cipher spec names.
                </p>
              </td>
            </tr>
            <tr>
              <td><a name="parameters.excludedProtocols"></a>
                  <span class="prop" container="parameters">excludedProtocols</span></td>
              <td><code>String</code></td>
              <td>
                <p>Specifies a comma-separated list of SSL protocol names or
                   patterns to disable during session negotation.  This property is 
                   used to filter the protocols supported by the SSL engine, 
                   such that any protocol matched by this property is disabled.
                </p>
                <p>Each field in the comma-separated list specified for this 
                   property may be a simple string or a regular expression.
                </p>
                <p>See the <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#AppA">
                  Standard Names</a> specification in the 
                  <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html">
                  JSSE Reference Guide</a> for a list of protocol names.
                </p>
              </td>
            </tr>
            <tr>
              <td><a name="parameters.includedProtocols"></a>
                  <span class="prop" container="parameters">includedProtocols</span></td>
              <td><code>String</code></td>
              <td>
                <p>Specifies a comma-separated list of SSL protocol names or
                   patterns to enable during session negotation.  This property is 
                   used to filter the protocols supported by the SSL engine, 
                   such that only those protocols matched by this property are 
                   enabled.
                </p>
                <p>Each field in the comma-separated list specified for this 
                   property may be a simple string or a regular expression.
                </p>
                <p>See the <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#AppA">
                  Standard Names</a> specification in the 
                  <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html">
                  JSSE Reference Guide</a> for a list of protocol names.
                </p>
              </td>
            </tr>
            <tr>
              <td><a name="parameters.needClientAuth"></a>
                  <span class="prop" container="parameters">needClientAuth</span></td>
              <td><code>boolean</code></td>
              <td>Set this property to the value <code>true</code> to 
                  configure a server to <em>require</em> a valid client
                  certificate.  This property is ignored when configured
                  for a client component such as <code>SSLSocketAppender</code>.
              </td>
            </tr>
            <tr>
              <td><a name="parameters.wantClientAuth"></a>
                  <span class="prop" container="parameters">wantClientAuth</span></td>
              <td><code>boolean</code></td>
              <td>Set this property to the value <code>true</code> to 
                  configure the server to <em>request</em> a client
                  certificate.  This property is ignored when configured
                  for a client component such as <code>SSLSocketAppender</code>.
              </td>
            </tr>
          </table>
          
          <h4><a name="TrustManagerFactoryFactoryBean"></a>
              Trust Manager Factory Configuration</h4>
              
          <p>The <a href="../xref/ch/qos/logback/core/net/ssl/TrustManagerFactoryFactoryBean.html">
             <code>TrustManagerFactoryFactoryBean</code></a> specifies the 
             configuration needed to create a 
             <a href="http://docs.oracle.com/javase/1.5.0/docs/api/javax/net/ssl/TrustManagerFactory.html">
             <code>TrustManagerFactory</code></a>.  Generally, it isn't necessary
             to explicitly configure the trust manager factory, as the platform's
             default factory is adequate for most needs.
          </p>
    
          <table class="bodyTable striped">
            <tr>
              <th>Property Name</th>
              <th>Type</th>
              <th>Description</th>
            </tr>
            <tr>
              <td><span class="prop" container="trustManagerFactory">algorithm</span></td>
              <td><code>String</code></td>
              <td>Specifies the <code>TrustManagerFactory</code> algorithm name.
                  See the <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#AppA">
                  Standard Names</a> specification in the 
                  <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html">
                  JSSE Reference Guide</a>.  The Java platform's default key 
                  manager algorithm will be used if this property is not configured.
              </td>
            </tr>
            <tr>
              <td><span class="prop" container="trustManagerFactory">provider</span></td>
              <td><code>String</code></td>
              <td>Specifies the name of the JCA provider that will be used to
                  create a <code>SecureRandom</code> generator.  The Java 
                  platform's default JSSE provider will be used if this property 
                  is not configured.
              </td>
            </tr>
          </table>
          
          <h2 class="doAnchor"><a name="Examples"></a>Examples</h2>
    
          <h3>Using JSSE System Properties</h3>
          <p>JSSE system properties can be used to specify the location and 
          password for a key store containing your server's X.509 credential,
          or to specify the location and password for a trust store 
          containing self-signed root CA certificates used by your client
          components to validate server trust.</p>
    
          <h4>Specifying the Server's Key Store</h4>
          <p>When running a server component, you need to specify the location
          and password for the key store containing the server's credential.
          One way to do this is using JSSE system properties.  The following
          example shows a command line that could be used to start the
          <code>SimpleSSLSocketServer</code> that is shipped with Logback.</p>
        
          <p class="source">java -DkeyStore=/etc/logback-server-keystore.jks \
         -DkeyStorePassword=changeit -DkeyStoreType=JKS \
         ch.qos.logback.net.SimpleSSLSocketServer 6000 /etc/logback-server-config.xml</p>
                  
          <p>Note that when using the JSSE <em>keyStore</em> system property,
          a path to the key store is specified.  When specifying the location
          in <em>logback.xml</em>, a URL for the key store is specified.</p>
          
          <p>While this example starts the standalone server application
          provided with Logback, the same system properties could be specified
          to start any application that uses an SSL-enabled Logback server
          component.
          
          <h4>Specifying the Client's Trust Store</h4>
          
          <p>When using a client component, you need to specify the location
          and password for a trust store containing root CA certificates used
          for validating server trust.  One way to do this is using JSSE
          system properties.  The following example shows a command line
          that could be used to start an application named 
          <code>com.example.MyLoggingApplication</code> that uses one or
          more of Logback's SSL-enabled client components.</p>
    
          <p class="source">java -DtrustStore=/etc/logback-client-truststore.jks \
         -DtrustStorePassword=changeit -DtrustStoreType=JKS \
         com.example.MyLoggingApplication</p>
          
          <p>Note that when using the JSSE <em>trustStore</em> system property,
          a path to the key store is specified.  When specifying the location
          in <em>logback.xml</em>, a URL for the trust store is specified.</p>
          
          <h3>Creating and Using a Self-Signed Server Component Credential</h3>
          <p>To generate a self-signed certificate, you can use the <em>keytool</em>
          utility that is shipped with the Java Runtime Environment (JRE).
          The instructions below walk through the process of creating a
          self-signed X.509 credential in a key store for your server 
          component and creating a trust store for use with your client
          components.
          </p>
          
          <h4>Creating the server component credential:</h4>
          <p>The following command will generate the self-signed client
          credential in a file named <em>server.keystore</em>.</p>
          <pre class="source">keytool -genkey -alias server -dname &quot;CN=my-logging-server&quot; \
        -keyalg RSA -validity 365 -keystore server.keystore
    Enter keystore password: &lt;Enter password of your choosing>
    Re-enter new password: &lt;Re-enter same password>
    Enter key password for &lt;my-logging-server>
    	(RETURN if same as keystore password):  &lt;Press RETURN>
    </pre>
    
          <p>The name <em>my-logging-server</em> used in the <em>dname</em>
          may be any valid name of your choosing.  You may wish to use the
          fully-qualified domain name of the server host. The
          <em>validity</em> argument specifies the number of calendar days
          from the present date until the credential expires.</p>
          
          <p>In production settings, it is especially important to choose a
          strong password for the key store containing your server credential.
          This password protects the server's private key, preventing it
          from being used by an authorized party.  Make note of the
          password, because you will need it in subsequent steps and when
          configuring your server.
          </p>
    
          <h4>Creating a trust store for client components:</h4>
          <p>For use in the configuration of your client components, the 
          server's certificate needs to be exported from the key store
          created in the previous step, and imported into a trust store.  The
          following commands will export the certificate and import it into
          a trust store named <em>server.truststore</em>.</p>
          
          <pre class="source">keytool -export -rfc -alias server -keystore server.keystore \
        -file server.crt
    Enter keystore password: &lt;Enter password you chose for in previous step>
    
    keytool -import -alias server -file server.crt -keystore server.truststore
    Enter keystore password: &lt;Enter password of your choosing>
    Re-enter new password: &lt;Re-enter same password>
    Owner: CN=my-logging-server
    Issuer: CN=my-logging-server
    Serial number: 6e7eea40
    Valid from: Sun Mar 31 07:57:29 EDT 2013 until: Mon Mar 31 07:57:29 EDT 2014
    
       ...
    
    Trust this certificate? [no]:  &lt;Enter "yes">
    </pre>
    
          <p>The first command exports the server's certificate (but not the
          server's private key) from the key store and into a file named
          <em>server.crt</em>.  The second step creates a new trust store
          named <em>server.truststore</em> containing the server certificate.
          </p>
          
          <p>In production settings, it is especially important to choose a
          strong password for the trust store that is different from the 
          password you chose of the server key store.  Make note of this
          password, because you will need it when configuring your appender
          clients.
          </p>
              
          <h4>Configuring the server component:</h4>
          <p>You will need to copy the <em>server.keystore</em> file into your 
          server application's configuration.  The key store can be placed
          with your application's classpath resources, or it may simply be
          placed somewhere on the server host's filesystem.  When specifying
          the location of the key store in the configuration, you will use
          either a <code>classpath:</code> URL or <code>file:</code> URL, as
          appropriate.  A example server configuration follows:</p>
    
          <p class="example">Example: Server Component Configuration</p>
          <pre class="prettyprint source">&lt;configuration debug="true">
      &lt;appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        &lt;encoder>
          &lt;pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
      
      &lt;root level="DEBUG">
        &lt;appender-ref ref="CONSOLE" />
      &lt;/root>
    
      &lt;server class="ch.qos.logback.classic.net.server.SSLServerSocketReceiver">
        &lt;ssl>
          &lt;keyStore>
            &lt;location>classpath:server.keystore&lt;/location>
            &lt;password>${server.keystore.password}&lt;/password>
          &lt;/keyStore>
        &lt;/ssl>
      &lt;/server>
    &lt;/configuration></pre>
          
          <p>This example assumes that the key store is located at the root
          of the application's classpath.</p>
          
          <p>Note that this configuration specifies the key store password
          using the <em>server.keystore.password</em> substitution variable.
          This approach would allow you to avoid storing the password in
          any configuration file.  For example, your application could
          prompt for this password on the console at startup, and then 
          set the <em>server.keystore.password</em> as a system property 
          using the entered password before configuring the logging system.
          </p>
          
          <h4>Configuring client components:</h4>
          <p>You will need to copy the <em>server.truststore</em> file into
          the application configuration of each application that uses an
          SSL-enabled component acting in the client mode.  The trust store 
          can be placed with your application's classpath resources, or it
          may simply be placed somewhere on the filesystem.  When specifying 
          the location of the trust store in the configuration, you will use 
          either a <code>classpath:</code> URL or <code>file:</code> URL, as
          appropriate.  A example appender client configuration follows:</p>
    
          <p class="example">Example: Appender Client Configuration</p>
    
          <pre class="prettyprint source">&lt;configuration debug="true">
      &lt;appender name="SOCKET" class="ch.qos.logback.classic.net.SSLSocketAppender">
        &lt;remoteHost>${host}&lt;/remoteHost>
        &lt;ssl>
          &lt;trustStore>
            &lt;location>classpath:server.truststore&lt;/location>
            &lt;password>${server.truststore.password}&lt;/password>
          &lt;/trustStore>
        &lt;/ssl>
      &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="SOCKET" />
      &lt;/root>
    &lt;/configuration></pre>
    
          <p>This example assumes that the trust store is located at the root
          of the application's classpath.</p>
          
          <p>Note that this configuration specifies the trust store password
          using the <em>server.truststore.password</em> substitution variable.
          This approach would allow you to avoid storing the password in
          any configuration file.  For example, your application could
          prompt for this password on the console at startup, and then 
          set the <em>server.truststore.password</em> as a system property 
          using the entered password before configuring the logging system.
          </p>
    
          <h2>Auditing the SSL Configuration</h2>
          <p>In settings where secure communications are required, it is often
          necessary to audit the configuration of components that use SSL to
          validate conformance with local security policies.  The SSL
          support in Logback addresses this need by providing detailed
          logging of SSL configuration when Logback is initialized.  You can 
          enable audit logging using the <code>debug</code> property in the
          configuration:</p>
          
          <pre class="prettyprint source">&lt;configuration debug="true">
      
      ...
      
    &lt;/configuration></pre>
    
          <p>With the debug property enabled, all of the relevant aspects of
          the resulting SSL configuration will be logged when the logging
          system is initialized.  A representative example of the information
          logged for SSL follows.</p>
          
          <p class="example">Example: SSL Configuration Audit Logging</p>
          
          <pre>06:46:31,941 |-INFO in SSLServerSocketReceiver@4ef18d37 - SSL protocol 'SSL' provider 'SunJSSE version 1.6'
    06:46:31,967 |-INFO in SSLServerSocketReceiver@4ef18d37 - key store of type 'JKS' provider 'SUN version 1.6': file:src/main/java/chapters/appenders/socket/ssl/keystore.jks
    06:46:31,967 |-INFO in SSLServerSocketReceiver@4ef18d37 - key manager algorithm 'SunX509' provider 'SunJSSE version 1.6'
    06:46:31,973 |-INFO in SSLServerSocketReceiver@4ef18d37 - secure random algorithm 'SHA1PRNG' provider 'SUN version 1.6'
    06:46:32,755 |-INFO in SSLParametersConfiguration@4a6f19d5 - enabled protocol: SSLv2Hello
    06:46:32,755 |-INFO in SSLParametersConfiguration@4a6f19d5 - enabled protocol: SSLv3
    06:46:32,755 |-INFO in SSLParametersConfiguration@4a6f19d5 - enabled protocol: TLSv1
    06:46:32,756 |-INFO in SSLParametersConfiguration@4a6f19d5 - enabled cipher suite: SSL_RSA_WITH_RC4_128_MD5
    06:46:32,756 |-INFO in SSLParametersConfiguration@4a6f19d5 - enabled cipher suite: SSL_RSA_WITH_RC4_128_SHA
    06:46:32,756 |-INFO in SSLParametersConfiguration@4a6f19d5 - enabled cipher suite: TLS_RSA_WITH_AES_256_CBC_SHA
    </pre>
    
          <p>The output shown here has been truncated for brevity's sake, 
          but would typically include the complete list of protocols, 
          providers, algorithms, and cipher suites, as well as the location
          of key store and trust store resources utilized in the configuration.
          </p>
          
          <p>While none of this audit logging is particularly sensitive,
          best practices for security would suggest that this logging should
          not remain enabled in production settings after the configuration
          has been validated.  Audit logging is disabled when the 
          <code>debug</code> property is removed or set to <code>false</code>.
          </p>
          
          <h2>Resolving SSL Exceptions</h2>
          <p>When SSL is misconfigured, it generally results in the client
             and server components being unable to negotiate an agreeable 
             session.  This problem usually manifests itself as exceptions 
             being thrown by both parties when the client attempts to connect 
             to the server.
          </p>
          <p>The content of the exception messages varies depending on whether 
             you are looking at the client's log or the server's log.  This
             is mostly due to inherent protocol limitations in error reporting
             during session negotiation.  As a consequence of this fact,
             in order to troubleshoot session negotiation problems, you will
             usually want to look at the logs of both the client and the
             server.
          </p>
          
          <h3>Server's Certificate is Not Available</h3>
          <p>When starting the server component, you
             see the following exception in the log:</p>
             
          <p><em>javax.net.ssl.SSLException: No available certificate or 
             key corresponds to the SSL cipher suites which are enabled</em>
          </p>
          
          <p>In most cases this means that you have not configured 
             the location of the key store containing the server's private 
             key and corresponding certificate.
          </p>
          
          <h4>Solution</h4>
          <p>Using either the 
             <a href="#basicConfig.keyStore">Key Store system
             properties</a> or the <a href="#ssl.keyStore">
             <span class="prop">keyStore</span></a> property of the 
             server component's <span class="prop">ssl</span> property, 
             you must specify the location and password for the key store 
             containing the server's private key and certificate.
          </p>
          
          <h3>Client Does Not Trust the Server</h3>
          <p>When the client attempts to connect to the server, you see the 
          following exception in the log:</p>
          
          <p><em>javax.net.ssl.SSLHandshakeException: 
                  sun.security.validator.ValidatorException: 
                  PKIX path building failed</em>
          </p>
          <p>This problem is the result of the server presenting a certificate
             the client does not trust.  The most common cause is that you 
             are using a self-signed server certificate (or a server 
             certificate that was signed by your organization's internal
             certification authority) and you have not configured the client
             so that it references a trust store containing the server's 
             self-signed certificate (or the trusted root certificate(s) for 
             the CA that signed your server certificate).         
          </p> 
          <p>This problem can also occur if your server certificate has
             expired or has been revoked.  If you have access to the server
             log you will likely see the following exception logged
             each time the client attempts to connect:
          </p>
          
          <p><em>javax.net.ssl.SSLHandshakeException: Received fatal alert: ...</em>
          </p>
          
          <p>The remainder of the exception message will usually provide a
             code that indicates why the client rejected the server's
             certificate.
          </p>
          <table class="bodyTable striped">
            <tr>
              <th>Code</th>
              <th>Description</th>
            </tr>
            <tr>
              <td><code>certificate_unknown</code></td>
              <td>Usually indicates that the client's trust store has not
                  been properly configured.
              </td>
            </tr>
            <tr>
              <td><code>certificate_expired</code></td>
              <td>Indicates that the server's certificate has expired and
                  needs to be replaced.
              </td>
            </tr>
            <tr>
              <td><code>certificate_revoked</code></td>
              <td>Indicates that the issuing certification authority (CA)
                  has revoked the server's certificate and the certificate
                  needs to be replaced.
              </td>
            </tr>
          </table>
            
          <h4>Solutions</h4>
          <p>If the server's log message is reporting <code>certificate_unknown</code>
             then using either the <a href="#basicConfig.trustStore">Trust Store system
             properties</a> or the <a href="#ssl.trustStore">
             <span class="prop">trustStore</span></a> property of the 
             appender component's <span class="prop">ssl</span> property, 
             you must specify the location and password for the trust 
             store containing the server's self-signed certificate or
             the issuing certificate authority's root certificate.
          </p>
    
          <p>If the server's log message is reporting 
             <code>certificate_expired</code> or <code>certificate_revoked</code> 
             the server needs a new certificate.  The new certificate 
             and associated private key needs to be placed in the key store 
             specified in the server's configuration.  And, if using 
             a self-signed server certificate, the server's certificate also
             needs to be placed in the trust store specified in the appender
             client's configuration.
          </p>
          
          <h3>Server Does Not Trust the Client</h3>
          <p>NOTE: <strong>This problem can occur only if you have explicitly 
             configured the server to request a client certificate (using 
             either the <a href="#parameters.needClientAuth"><span class="prop">needClientAuth</span></a> or 
             <a href="#parameters.wantClientAuth"><span class="prop">wantClientAuth</span></a>
             property)</strong>.
          </p>
     
          <p>When the client attempts to connect to the logging
             server, you see the following exception in the client's log:
          </p>
          
          <p><em>javax.net.ssl.SSLHandshakeException:  Received fatal 
             alert: ...</em>
          </p>
    
          <p>The remainder of the exception message will usually provide a
             code that indicates why the server rejected the client's
             certificate.
          </p>
          <table class="bodyTable striped">
            <tr>
              <th>Code</th>
              <th>Description</th>
            </tr>
            <tr>
              <td><code>certificate_unknown</code></td>
              <td>Usually indicates that the server's trust store has not
                  been properly configured.
              </td>
            </tr>
            <tr>
              <td><code>certificate_expired</code></td>
              <td>Indicates that the client's certificate has expired and
                  needs to be replaced.
              </td>
            </tr>
            <tr>
              <td><code>certificate_revoked</code></td>
              <td>Indicates that the issuing certification authority (CA)
                  has revoked the client's certificate and the certificate
                  needs to be replaced.
              </td>
            </tr>
          </table>
            
          <h4>Solutions</h4>
          <p>If the client's log message is reporting <code>bad_certificate</code>
             then using either the <a href="#basicConfig.trustStore">Trust Store system
             properties</a> or the <a href="#ssl.trustStore">
             <span class="prop">trustStore</span></a> property of the 
             server component's <span class="prop">ssl</span> property, 
             you must specify the location and password for the trust 
             store containing the client's self-signed certificate or
             the issuing certificate authority's root certificate.
          </p>
    
          <p>If the server's log message is reporting 
             <code>certificate_expired</code> or <code>certificate_revoked</code> 
             the client needs a new certificate.  The new certificate 
             and associated private key needs to be placed in the key store 
             specified in the client's configuration.  And, if using 
             a self-signed client certificate, the client's certificate also
             needs to be placed in the trust store specified in the 
             servers's configuration.
          </p>
          
          <h3>Client and Server Cannot Agree on a Protocol</h3>
          <p>NOTE: <strong>This problem usually occurs only when you are
             explicitly 
             <a href="#parameters.excludedProtocols">excluding</a> or 
             <a href="#parameters.includedProtocols">including</a> SSL 
             protocols in your configuration</strong>.
          </p>
    
          <p>When the client attempts to connect to the server, you see 
             the following exception in the log:</p>
          
          <p><em>javax.net.ssl.SSLHandshakeException:  Received fatal 
             alert: handshake_failure</em>
          </p>
          
          <p>The server's log message is usually more descriptive.  For
             example:</p>
          
          <p><em>javax.net.ssl.SSLHandshakeException: SSLv2Hello is disabled</em>
          </p>
          
          <p>Generally, this means that you have excluded a protocol from
             one of the peers and not the other.</p>
             
          <h4>Solution</h4>
          <p>Check the values specified for the 
             <a href="#parameters.excludedProtocols"><span class="prop">excludedProtocols</span></a> and
             <a href="#parameters.includedProtocols"><span class="prop">includedProtocols</span></a>
             properties on both the server and client.
          </p>
    
          <h3>Client and Server Cannot Agree on a Cipher Suite</h3>
          <p>NOTE: <strong>This problem usually occurs only when you are
             explicitly 
             <a href="#parameters.excludedCipherSuites">excluding</a> or 
             <a href="#parameters.includedCipherSuites">including</a> SSL 
             cipher suites in your configuration</strong>.
          </p>
          
          <p>When the client attempts to connect to the
             server, you see the following exception in the log:
          </p>
          
          <p><em>javax.net.ssl.SSLHandshakeException:  Received fatal 
             alert: handshake_failure</em>
          </p>
          
          <p>The server's log message is usually more descriptive:
          </p>
          
          <p><em>javax.net.ssl.SSLHandshakeException: no cipher suites in common</em>
          </p>
          
          <p>This means that you have configured the cipher suites on the
             server and client such that the intersection
             of their respective sets of enabled cipher suites is empty.</p>
          
          <h4>Solution</h4>
          <p>Check the values specified for the 
             <a href="#parameters.excludedCipherSuites"><span class="prop">excludedCipherSuites</span></a> and
             <a href="#parameters.includedCipherSuites"><span class="prop">includedCipherSuites</span></a>
             properties on both the server and client.
          </p>
             
          <script src="../templates/footer.js" type="text/javascript"></script>
    
        </div>
      </body>
    </html>�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/manual/receivers.html������������������������������������0000644�0001750�0001750�00000062340�12143151241�024503� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Chapter 14: Receivers</title>
        <link rel="stylesheet" type="text/css" href="../css/common.css" />
        <link rel="stylesheet" type="text/css" href="../css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="../css/_print.css" media="print" />
        <link rel="stylesheet" type="text/css" href="../css/prettify.css" media="screen"/>    
      </head>
      <body onload="prettyPrint(); decorate();">
        <script type="text/javascript">prefix='../';</script>
        <script type="text/javascript" src="../js/prettify.js"></script>
        <script type="text/javascript" src="../templates/header.js"></script>
        <script type="text/javascript" src="../js/dsl.js"></script>
        <script type="text/javascript" src="../js/jquery-min.js"></script>
        <script type="text/javascript" src="../js/decorator.js"></script>
        <div id="left">      
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="../templates/left.js" type="text/javascript"></script>
        </div>    
        <div id="right">
          <script src="menu.js" type="text/javascript"></script>
        </div>
    
        <div id="content">
    
          <h1>Chapter 14: Receivers</h1>
    
          <div class="quote">
    
            <p><em>You cannot swim for new horizons until you have courage 
               to lose sight of the shore.</em></p>
      
            <p>&mdash;WILLIAM FAULKNER</p>
          </div>
    
    
          <script src="../templates/creative.js" type="text/javascript"></script>
          <script src="../templates/setup.js" type="text/javascript"></script>
        
          <h2 class="doAnchor" name="whatIsAReceiver">What is a Receiver?</h2>
        
          <p>A <em>receiver</em> is a Logback component that receives logging
          events from a remote appender and logs each received event according
          to local policy.  Using a combination of socket-based appenders and
          receivers, it is possible to construct sophisticated topologies
          for distribution of application logging events over a network.</p>
      
          <p>A receiver extends the <a
          href="../xref/ch/qos/logback/classic/net/ReceiverBase.html">
          <code>ch.qos.logback.classic.net.ReceiverBase</code></a> class.
          By virtue of the fact that a receiver extends this class, a
          receiver participates in the Logback component <a
          href="../xref/ch/qos/logback/core/spi/LifeCycle.html">LifeCycle</a>
          and a receiver is <a
          href="../xref/ch/qos/logback/core/spi/ContextAware.html">
          ContextAware</a>.</p>
        
          <p>Historically, support for logging event delivery over a network
          connection in Logback has been provided by <code>SocketAppender</code>
          and the corresponding <code>SimpleSocketServer</code>.  The appender
          acts as a client, initiating a network connection to the server
          application, and delivering logging events via the network connection.  
          The receiver component and corresponding appender support offers much 
          greater flexibility.</p>
        
          <p>A receiver component is configured in <em>logback.xml</em>, just
          like any other logback component.  This allows the full capabilities
          of <a href="onJoran.html">Joran</a> to be utilized in configuring
          a receiver component.  Moreover, <em>any</em> application can 
          receive logging events from remote appenders by simply configuring
          one or more receiver components.</p>
        
          <p>Connection initiation between an appender and a receiver 
          can occur in either direction.  A receiver can act in the role of a
          server, passively listening for connections from remote appender 
          clients.  Alternatively, a receiver can act in the client role,
          initiating a connection to a remote appender which is acting in the 
          server role.  Regardless of the respective roles of the
          appender and receiver, <em>logging events always flow from 
          the appender towards the receiver</em>.</p>
        
          <p>The flexibility to allow a receiver to initiate the connection
          to an appender is particularly useful in certain situations:
          </p>
          <ul>
            <li>For security reasons, a central logging server may be
              located behind a network firewall that does not allow incoming
              connections.  Using receiver components acting in the client
              role, the central logging server (inside the firewall) 
              can initiate connections to the applications of interest 
              (outside the firewall).
            </li>
            <li>It is often desirable for developer tools (such as IDE plugins)
              and enterprise management applications to have access to the
              logging event stream of running applications.  Traditionally,
              Logback has supported this (for example in Logback Beagle) by
              requiring the recipient application (e.g. a developer tool running
              in an IDE) to act in the server role, passively listening for 
              connections from a remote appender.  This can prove difficult to 
              manage, especially for tools running on a developer's workstation, 
              which may indeed by mobile.  However, such tools can now be 
              implemented using a Logback receiver component acting in the 
              client role, initiating a connection to a remote appender in 
              order to receive logging events for local display, filtering, 
              and alerting.
            </li>
          </ul>
    
          <p>A logback configuration can include any number of receiver components
          acting in any combination of the server or client roles.  The only 
          restrictions are that each receiver acting in the server role must
          listen on a distinct port, and each receiver acting in the client
          role will connect to exactly one remote appender.</p>
        
          <h2 class="doAnchor" name="receiverServerComponents">Receivers
          that Act in the Server Role</h2>
        
          <p>A receiver that is configured to act in the server role passively
          listens for incoming connections from remote appenders.  This is 
          functionally equivalent to using the standalone
          <code>SimpleSocketServer</code> application, except that by using
          the receiver component, <em>any</em> application that uses Logback
          Classic can receive logging events from remote appenders by simply
          configuring the receiver in <em>logback.xml</em>.</p>
            
          <p>
            <img border="1" src="images/chapters/receivers/serverSocketReceiver.png" "/>
          </p>
    
          <p>Logback includes two receiver components that act in the
          server role; <a
          href="../xref/ch/qos/logback/classic/net/server/ServerSocketReceiver.html">
          <code>ServerSocketReceiver</code></a> and its SSL-enabled
          subtype
          <a href="../xref/ch/qos/logback/classic/net/server/SSLServerSocketReceiver.html">
          <code>SSLServerSocketReceiver</code></a>.  Both of these receiver
          components are designed to accept connections from incoming
          <code>SocketAppender</code> (or <code>SSLSocketAppender</code>)
          clients.</p>
            
          <p>The <code>ServerSocketReceiver</code> components provide the 
          following configurable properties:</p>
        
          <table class="bodyTable striped">
            <tr>
              <th>Property Name</th>
              <th>Type</th>
              <th>Description</th>
            </tr>
            <tr>
              <td><span class="prop" container="serverSocketReceiver">address</span></td>
              <td><code>String</code></td>
              <td>The local network interface address on which the receiver
              will listen.  If this property is not specified, the receiver
              will listen on all network interfaces.</td>
            </tr>
            <tr>
              <td><span class="prop" container="serverSocketReceiver">port</span></td>
              <td><code>int</code></td>
              <td>The TCP port on which the receiver will listen.  If this
              property is not specified, a default value will be used.</td>
            </tr>
            <tr>
              <td><span class="prop" container="serverSocketReceiver">ssl</span></td>
              <td><code>SSLConfiguration</code></td>
              <td>Supported only for <code>SSLServerSocketReceiver</code>, this
                  property provides the SSL configuration that will be used by
                  the receiver, as described in <a href="usingSSL.html">Using SSL</a>.
              </td>
            </tr>
          </table>
        
          <h3 class="doAnchor" name="usingServerSocketReceiver">Using
          ServerSocketReceiver</h3>
        
          <p>The following configuration uses the 
          <code>ServerSocketReceiver</code> component with a minimal local 
          appender and logger configuration.  Logging events received from
          a remote appender will be matched by the root logger and delivered
          to the local console appender.</p>
        
          <p class="example">Example: Basic ServerSocketReceiver Configuration
          (logback-examples/src/main/java/chapters/receivers/socket/receiver1.xml)</p>
    
          <span class="asGroovy" onclick="return asGroovy('receiver1');">View as .groovy</span>
      <pre id="receiver1" class="prettyprint source">&lt;configuration debug="true">
    
      &lt;appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        &lt;encoder>
          &lt;pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="CONSOLE" />
      &lt;/root>
    
      &lt;receiver class="ch.qos.logback.classic.net.server.ServerSocketReceiver">
        &lt;port>${port}&lt;/port>
      &lt;/receiver>
    
    &lt;/configuration></pre>
      
          <p>Note that the receiver component's <em>class</em> 
          attribute identifies the receiver subtype that we wish to use.  In
          this example we are using <code>ServerSocketReceiver</code>.</p>
        
          <p>Our example server application is very similar in function and
          design to <code>SimpleSocketServer</code>.  It simply accepts a
          path for a logback configuration file as a command line argument,
          and runs the given configuration.  While our example is somewhat
          trivial, keep in mind that you can configure logback's 
          <code>ServerSocketReceiver</code> (or <code>SSLServerSocketReceiver</code>) 
          component in <em>any</em> application.
          </p>
        
          <p>From a shell in the <em>logback-examples</em> directory, 
          we can run our example server application as follows:</p>
        
          <p class="source">java -Dport=6000 <a href="../xref/chapters/receivers/socket/ReceiverExample.html">chapters.receivers.socket.ReceiverExample</a> \ 
          src/main/java/chapters/receivers/socket/receiver1.xml</p>
      
          <p>We can connect to the running receiver using a client application
          that is configured with a <code>SocketAppender</code>.  Our example
          client application simply loads a logback configuration that will
          connect a socket appender to our example receiver.  It then awaits
          input from the user in the form of a message that will be relayed to
          the receiver.  We can run the example client application as follows:
          </p>
        
          <p class="source">java -Dhost=localhost -Dport=6000 \
          <a href="../xref/chapters/receivers/socket/AppenderExample.html">chapters.receivers.socket.AppenderExample </a>\
          src/main/java/chapters/receivers/socket/appender1.xml</p>
        
          <h3 class="doAnchor" name="usingSSLServerSocketReceiver">Using
          SSLServerSocketReceiver</h3>
    
          <p>The following configuration repeats the same minimal appender
          and logger configuration, but uses the SSL-enabled receiver component
          that acts in the server role.</p>
    
          <p class="example">Example: Basic SSLServerSocketReceiver Configuration
          (logback-examples/src/main/java/chapters/receivers/socket/receiver2.xml)</p>
          <span class="asGroovy" onclick="return asGroovy('receiver2');">View as .groovy</span>
      <pre id="receiver2" class="prettyprint source">&lt;configuration debug="true">
    
      &lt;appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        &lt;encoder>
          &lt;pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="CONSOLE" />
      &lt;/root>
    
      &lt;receiver class="ch.qos.logback.classic.net.server.SSLServerSocketReceiver">
        &lt;port>${port}&lt;/port>
        &lt;ssl>
          &lt;keyStore>
            &lt;location>${keystore}&lt;/location>
            &lt;password>${password}&lt;/password>
          &lt;/keyStore>
        &lt;/ssl>
      &lt;/receiver>
    
    &lt;/configuration></pre>
    
          <p>The essential differences between this configuration and the
          previous example using <code>ServerSocketReceiver</code> are the 
          specification of <code>SSLServerSocketReceiver</code> in the
          <em>class</em> attribute and the presence of the nested 
          <span class="prop">ssl</span> property, which is used here to 
          specify the location and password for the key store containing the 
          receiver's private key and certificate, using substitution variables. 
          See <a href="usingSSL.html">Using SSL</a> for details on 
          configuring SSL properties for Logback components.</p>    
     
          <p>We can run this configurtation using the same example server
          configuration, with just a couple of additional configuration
          properties:</p>
    
          <p class="source">java -Dport=6001 \
          -Dkeystore=file:src/main/java/chapters/appenders/socket/ssl/keystore.jks \
          -Dpassword=changeit \
          chapters.receivers.socket.ReceiverExample \
          src/main/java/chapters/receivers/socket/receiver2.xml</p>
      
          <p>Note that the <em>keystore</em> property given on the command
          line specifies a file URL that identifies the location of the key 
          store.  You may also use a classpath URL as described in 
          <a href="usingSSL.html">Using SSL</a>.
          </p>
        
          <p>We can connect to the running receiver using a client application
          that is configured with a <code>SSLSocketAppender</code>.  We use 
          the sample example client application used in the previous example,
          with a configuration file that uses an SSL-enabled appender.  We
          run the example as follows:
          </p>
        
          <p class="source">java -Dhost=localhost -Dport=6001 \
          -Dtruststore=file:src/main/java/chapters/appenders/socket/ssl/truststore.jks \
          -Dpassword=changeit \
          chapters.receivers.socket.AppenderExample \
          src/main/java/chapters/receivers/socket/appender2.xml</p>
        
          <p>Note that our example is using a self-signed X.509 credential that 
          is suitable for testing and experimentation, only.  <strong>In a 
          production setting, you should obtain an appropriate X.509 credential 
          to identify your SSL-enabled logback components</strong>.  See 
          <a href="usingSSL.html">Using SSL</a> for more information.</p>
      
          <h2 class="doAnchor" name="receiverClientComponents">Receivers
          that Act in the Client Role</h2>
        
          <p>A receiver that is configured to act in the client role initiates
          a connection to a remote appender.  The remote appender must be a
          server type, such as <code>ServerSocketAppender</code>.</p>  
        
          <p>
            <img border="1" src="images/chapters/receivers/socketReceiver.png"/>
          </p>
    
          <p>Logback includes two receiver components that act in the client
          role; <a href="../xref/ch/qos/logback/classic/net/SocketReceiver.html">
          <code>SocketReceiver</code></a> and its SSL-enabled subtype
          <a href="../xref/ch/qos/logback/classic/net/SSLSocketReceiver.html">
          <code>SSLSocketReceiver</code></a>.  Both of these receiver
          components are designed to initiate a connection to a remote appender
          that is a <code>ServerSocketAppender</code> 
          (or <code>SSLServerSocketAppender</code>).</p>
            
          <p>The following configuration properties are supported by 
          <code>SocketReceiver</code> subtypes:</p>
        
          <table class="bodyTable striped">
            <tr>
            <th>Property Name</th>
            <th>Type</th>
            <th>Description</th>
            </tr>
            <tr>
              <td><span class="prop" container="SocketReceiver">remoteHost</span></td>
              <td><code>String</code></td>
              <td>The hostname or address of the remote server socket appender.</td>
            </tr>
            <tr>
              <td><span class="prop" container="SocketReceiver">port</span></td>
              <td><code>int</code></td>
              <td>The port number of the remote server socket appender.</td>
            </tr> 
            <tr>
              <td><span class="prop" container="socket">reconnectionDelay</span></td>
              <td><code>int</code></td>
              <td>
                A positive integer representing the number of milliseconds to wait
                before attempting to reconnect after a connection failure.  The
                default value is 30000 (30 seconds).
              </td>
            </tr>
            <tr>
              <td><span class="prop" container="SocketReceiver">ssl</span></td>
              <td><code>SSLConfiguration</code></td>
              <td>Supported only for <code>SSLSocketReceiver</code>, this
                  property provides the SSL configuration that will be used for
                  this receiver, as described in <a href="usingSSL.html">Using SSL</a>.
              </td>
            </tr>
          </table>
            
          <h3 class="doAnchor" name="usingSocketReceiver">Using
          SocketReceiver</h3>
    
          <p>The configuration used for <code>SocketReceiver</code>
          is quite similar to the previous example that used
          <code>ServerSocketReceiver</code>.  The differences relate to the 
          fact that the roles of client and server are reversed; a receiver
          of type <code>SocketReceiver</code> is a client, and the remote
          appender acts as a server.</p>
            
          <p class="example">Example: Basic SocketReceiver Configuration
          (logback-examples/src/main/java/chapters/receivers/socket/receiver3.xml)</p>
          <span class="asGroovy" onclick="return asGroovy('receiver3');">View as .groovy</span>
      <pre id="receiver3" class="prettyprint source">&lt;configuration debug="true">
        
      &lt;appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">    
        &lt;encoder>
          &lt;pattern>%date %-5level [%thread] %logger - %message%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="CONSOLE" />
      &lt;/root>  
    
      &lt;receiver class="ch.qos.logback.classic.net.SocketReceiver">
        &lt;remoteHost>${host}&lt;/remoteHost>
        &lt;port>${port}&lt;/port>
        &lt;reconnectionDelay>10000&lt;/reconnectionDelay>
      &lt;/receiver>
    
    &lt;/configuration></pre>
            
          <p>This configuration will cause logback to connect to a 
          <code>ServerSocketAppender</code> running on the host and port specified
          by the <em>host</em> and <em>port</em> substitution variables.  Logging
          events received from the remote appender will be logged locally 
          (according to the configuration shown here) via a console appender.
          </p>
       
          <p>Assuming you are in the <em>logback-examples/</em> directory, 
          you can run this example configuration using the following command:</p>
    
             
    
          <p>The example loads the configuration and then simply waits for logging
          events from the remote appender.  If you run this example when the remote
          appender is not running, you'll see <em>connection refused</em> messages
          appearing in the log output, periodically.  The receiver will 
          periodically attempt to reconnect to the remote appender until it 
          succeeds or until the logger context is shut down.  The delay
          interval between attempts is configurable using the 
          <span class="prop">reconnectionDelay</span> property as shown in the
          example configuration.<p class="source">java -Dhost=localhost -Dport=6000 \
          chapters.receivers.socket.ReceiverExample \
          src/main/java/chapters/receivers/socket/receiver3.xml</p></p>
    
          <p>We can provide a remote appender to which our example receiver
          can connect, using the same appender example used previously.  The 
          example loads a logback configuration containing a 
          <code>ServerSocketAppender</code>, and then waits input from the
          user consisting of a message that will be delivered to connected
          receivers.  We can run the example appender application as follows:
          </p>
    
          <p class="source">java -Dport=6000 \
          chapters.receivers.socket.AppenderExample \
          src/main/java/chapters/receivers/socket/appender3.xml</p>   
    
          <p>If you enter a message to send when the receiver is not connected,
          note that the message is simply discarded.</p>
    
          <h3 class="doAnchor" name="usingSSLSocketReceiver">Using
          SocketSSLReceiver</h3>
    
    
          <p>The configuration needed for <code>SSLSocketReceiver</code> is very 
          similar to that used with <code>SocketReceiver</code>.  The essential 
          differences are in the class specified for the receiver and the ability 
          to nest the <span class="prop">ssl</span> property to specify SSL 
          configuration properties.  The following example illustrates a basic 
          configuration:
          </p>
       
          <p class="example">Example: Basic SSLSocketReceiver Configuration
          (logback-examples/src/main/java/chapters/receivers/socket/receiver4.xml)</p>
          <span class="asGroovy" onclick="return asGroovy('receiver4');">View as .groovy</span>
      <pre id="receiver4" class="prettyprint source">&lt;configuration debug="true">
    
      &lt;appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">    
        &lt;encoder>
          &lt;pattern>%date %-5level [%thread] %logger - %message%n&lt;/pattern>
        &lt;/encoder>         
      &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="CONSOLE" />
      &lt;/root>  
     
      &lt;receiver class="ch.qos.logback.classic.net.SSLSocketReceiver">
        &lt;remoteHost>${host}&lt;/remoteHost>
        &lt;port>${port}&lt;/port>
        &lt;reconnectionDelay>10000&lt;/reconnectionDelay>
        &lt;ssl>
          &lt;trustStore>
            &lt;location>${truststore}&lt;/location>
            &lt;password>${password}&lt;/password>
          &lt;/trustStore>
        &lt;/ssl>
      &lt;/receiver>
    
    &lt;/configuration></pre>
    
          <p>Note that the <em>class</em> attribute now specifies 
          <code>SSLSocketReceiver</code> and that in addition to the configuration
          properties shown in the previous example, this configuration contains
          an SSL configuration specifying the location and password for a 
          trust store that will be used in validating that the remote appender is
          trusted.  See <a href="usingSSL.html">Using SSL</a> for more information 
          on configuring SSL properties.
          </p>
      
          <p>You can run this example configuration using the following command:</p>
      
          <p class="source">java -Dhost=localhost -Dport=6001 \
          -Dtruststore=file:src/main/java/chapters/appenders/socket/ssl/truststore.jks \
          -Dpassword=changeit \
          chapters.receivers.socket.ReceiverExample \
          src/main/java/chapters/receivers/socket/receiver4.xml</p>   
       
          <p>Once started, the receiver attempts to connect to the specified 
          remote appender.  Assuming that the appender is not yet running, you
          will see a "connection refused" message appearing in the log output
          periodically; the receiver will periodically retry the connection to
          the remote appender after delaying for the period of time specified by
          the <span class="prop">reconnectionDelay</span> property.
          </p>
      
          <p>We can provide a remote appender to which our example receiver
          can connect, using the same appender example used previously.  The 
          example loads a logback configuration containing a 
          <code>SSLServerSocketAppender</code>, and then awaits input from the  
          user consisting of a message that will be delivered to connected
          receivers.  We can run the example appender application as follows:
          </p>
    
          <p class="source">java -Dport=6001 \
          -Dkeystore=file:src/main/java/chapters/appenders/socket/ssl/keystore.jks \
          -Dpassword=changeit \
          chapters.receivers.socket.AppenderExample \
          src/main/java/chapters/receivers/socket/appender4.xml</p>   
    
          <p>If you enter a message to send when the receiver is not connected,
          note that the message is simply discarded.</p>
    
          <p>It is important to note once again that our example is using a 
          self-signed X.509 credential that is suitable for testing and 
          experimentation, only.  <strong>In a production setting, you should 
          obtain an appropriate X.509 credential to identify your SSL-enabled
          logback components</strong>.  See <a href="usingSSL.html">Using SSL</a> 
          for more information.</p>
      
            <script src="../templates/footer.js" type="text/javascript"></script>
    
        </div>
      </body>  
    </html>
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/manual/layouts.html��������������������������������������0000644�0001750�0001750�00000251073�12136042273�024225� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Chapter 6: Layouts</title>
        <link rel="stylesheet" type="text/css" href="../css/common.css" />
        <link rel="stylesheet" type="text/css" href="../css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="../css/_print.css" media="print" />
        <link rel="stylesheet" type="text/css" href="../css/prettify.css" media="screen" />
        
      </head>
      <body onload="prettyPrint(); decorate();">
        <script type="text/javascript">prefix='../';</script>
        <script type="text/javascript" src="../js/prettify.js"></script>
        <script type="text/javascript" src="../templates/header.js"></script>
        <script type="text/javascript" src="../js/dsl.js"></script>
        <script type="text/javascript" src="../js/jquery-min.js"></script>
        <script type="text/javascript" src="../js/decorator.js"></script>
    
        <div id="left">
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="../templates/left.js" type="text/javascript"></script>
        </div>
        <div id="right">
          <script src="menu.js" type="text/javascript"></script>
        </div>
        <div id="content">
        
        <h1>Chapter 6: Layouts</h1>
    	
        <div class="quote">
          <p>TCP implementations will follow a general principle of
          robustness: be conservative in what you do, be liberal in what
          you accept from others.
          </p>
          <p>&mdash;JON POSTEL, RFC 793</p>
        </div>
    
        <script src="../templates/creative.js" type="text/javascript"></script>
        <script src="../templates/setup.js" type="text/javascript"></script>
         
    		<h2 class="doAnchor">What is a layout?</h2>
    
    		<p>In case you were wondering, layouts have nothing to do with
    		large estates in Florida.  Layouts are logback components
    		responsible for transforming an incoming event into a String.  The
    		<code>format()</code> method in the <a
    		href="../xref/ch/qos/logback/core/Layout.html"><code>Layout</code></a>
    		interface takes an object that represents an event (of any type)
    		and returns a String. A synopsis of the <code>Layout</code>
    		interface is shown below.
    		</p>
    
    		<pre class="prettyprint source">public interface Layout&lt;E> extends ContextAware, LifeCycle {
    
      String doLayout(E event);
      String getFileHeader();
      String getPresentationHeader();
      String getFileFooter();
      String getPresentationFooter();
      String getContentType();
    }</pre>
    
    		<p>This interface is rather simple and yet is sufficient for many
    		formatting needs. The Texan developer from Texas, whom you might
    		know from Joseph Heller's <em>Catch-22</em>, might exclaim: it
    		just takes five methods to implement a layout!!?
    		</p>
    
    		<h2>Logback-classic</h2>
    
    		<p>Logback-classic is wired to process only events of type
    		<a href="../xref/ch/qos/logback/classic/spi/ILoggingEvent.html">
          <code>ch.qos.logback.classic.spi.ILoggingEvent</code></a>.  This
    			fact will be apparent throughout this section.</p>
    
    		<h2 class="doAnchor" name="writingYourOwnLayout">Writing your own
    		custom Layout</h2>
    
    		<p>Let us implement a simple yet functional layout for the
    			logback-classic module that prints the time elapsed since the
    			start of the application, the level of the logging event, the
    			caller thread between brackets, its logger name, a dash followed
    			by the event message and a new line.
    		</p>
    
    		<p>Sample output might look like:</p>
    
    		<div class="source">10489 DEBUG [main] com.marsupial.Pouch - Hello world.</div>
    
    		<p>Here is a possible implementation, authored by the Texan developer:</p>
    		<em>Example: Sample implementation of a Layout
    			<a href="../xref/chapters/layouts/MySampleLayout.html">
    			(logback-examples/src/main/java/chapters/layouts/MySampleLayout.java)</a></em>
    
    		<pre class="prettyprint source">package chapters.layouts;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.LayoutBase;
    
    public class MySampleLayout extends LayoutBase&lt;ILoggingEvent> {
    
      public String doLayout(ILoggingEvent event) {
        StringBuffer sbuf = new StringBuffer(128);
        sbuf.append(event.getTimeStamp() - event.getLoggingContextVO.getBirthTime());
        sbuf.append(" ");
        sbuf.append(event.getLevel());
        sbuf.append(" [");
        sbuf.append(event.getThreadName());
        sbuf.append("] ");
        sbuf.append(event.getLoggerName();
        sbuf.append(" - ");
        sbuf.append(event.getFormattedMessage());
        sbuf.append(CoreConstants.LINE_SEP);
        return sbuf.toString();
      }
    }</pre>
    
    		<p>Note that <code>MySampleLayout</code> extends <a
    		href="../xref/ch/qos/logback/core/LayoutBase.html">
    		<code>LayoutBase</code></a>.  This class manages state common to
    		all layout instances, such as whether the layout is started or
    		stopped, header, footer and content type data. It allows the
    		developer to concentrate on the formatting expected from his/her
    		<code>Layout</code>. Note that the <code>LayoutBase</code> class
    		is generic. In its class declaration, <code>MySampleLayout</code>
    		extends <code>LayoutBase&lt;ILoggingEvent&gt;</code>.
    		</p>
    		
    		<p>The <code>doLayout(ILoggingEvent event)</code> method, i.e. the
    		only method in <code>MySampleLayout</code>, begins by
    		instantiating a <code>StringBuffer</code>. It proceeds by adding
    		various fields of the event parameter. The Texan from Texas was
    		careful to print the formatted form of the message. This is
    		significant if one or more parameters were passed along with
    		the logging request.
    		</p>
    		
        <p>After adding these various characters to the string buffer, the
        <code>doLayout()</code> method converts the buffer into a
        <code>String</code> and returns the resulting value.
    		</p>
    
    		<p>In the above example, the <code>doLayout</code> method ignores
    		any eventual exceptions contained in the event. In a real world
    		layout implementation, you would most probably want to print the
    		contents of exceptions as well.
    		</p>
    
        <h3 class="doAnchor" name="configuringYourOwnLayout">Configuring
        your custom layout</h3>
    
    		<p>Custom layouts are configured as any other component. As
    		mentioned earlier, <code>FileAppender</code> and its sub-classes
    		expect an encoder. In order to fulfill this requirement, we pass
    		to <code>FileAppender</code> an instance of
    		<code>LayoutWrappingEncoder</code> which wraps our
    		<code>MySampleLayout</code>. Here is the configuration file:</p>
    		
    		<em>Example: Configuration of MySampleLayout
    		(logback-examples/src/main/java/chapters/layouts/sampleLayoutConfig.xml)</em>
        <span class="asGroovy" onclick="return asGroovy('sampleLayoutConfig');">View as .groovy</span>
    <pre id="sampleLayoutConfig" class="prettyprint source">&lt;configuration>
    
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <b>&lt;encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"></b>
          <b>&lt;layout class="chapters.layouts.MySampleLayout" /></b>
        <b>&lt;/encoder></b>
      &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="STDOUT" />
      &lt;/root>
    &lt;/configuration></pre>
       
    		<p>The sample application <a
    		href="../xref/chapters/layouts/SampleLogging.html">
    		<code>chapters.layouts.SampleLogging</code></a> configures logback
    		with the configuration script passed as its first argument and
    		then logs a debug message, followed by an error message. </p>
    		
    		<p>To run this example issue the following command from within the
    		<em>logback-examples</em> directory.
        </p>
        
        <p class="command">java chapters.layouts.SampleLogging src/main/java/chapters/layouts/sampleLayoutConfig.xml</p>
        
        <p> This will produce:</p>
    		
    <div class="source"><pre>0 DEBUG [main] chapters.layouts.SampleLogging - Everything's going well
    0 ERROR [main] chapters.layouts.SampleLogging - maybe not quite...</pre></div>
    
    		<p>That was simple enough.  The skeptic Pyrrho of Elea, who
    		insists that nothing is certain except perhaps uncertainty itself,
    		which is by no means certain either, might ask: how about a layout
    		with options?  The reader shall find a slightly modified version
    		of our custom layout in <a
    		href="../xref/chapters/layouts/MySampleLayout2.html"><code>MySampleLayout2.java</code></a>. As
    		mentioned throughout this manual, adding a property to a layout or
    		any other logback component is as simple as declaring a setter
    		method for the property.
    		</p>
    
    		<p>The <a
    		href="../xref/chapters/layouts/MySampleLayout2.html"><code>MySampleLayout2</code></a>
    		class contains two properties. The first one is a prefix that can
    		be added to the output. The second property is used to choose
    		whether to display the name of the thread from which the logging
    		request was sent.
        </p>
    		
        <p>Here is a copy of the <a
        href="../xref/chapters/layouts/MySampleLayout2.html"><code>MySampleLayout2</code></a>
        class :</p>
    
        <pre class="prettyprint source">package chapters.layouts;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.LayoutBase;
    
    public class MySampleLayout2 extends LayoutBase&lt;ILoggingEvent> {
    
      String prefix = null;
      boolean printThreadName = true;
    
      <b>public void setPrefix(String prefix) {
        this.prefix = prefix;
      }
    
      public void setPrintThreadName(boolean printThreadName) {
        this.printThreadName = printThreadName;
      }</b>
    
      public String doLayout(ILoggingEvent event) {
        StringBuffer sbuf = new StringBuffer(128);
        <b>if (prefix != null) {
          sbuf.append(prefix + ": ");
        }</b>
        sbuf.append(event.getTimeStamp() - event.getLoggerContextVO().getBirthTime());
        sbuf.append(" ");
        sbuf.append(event.getLevel());
        <b>if (printThreadName) {
          sbuf.append(" [");
          sbuf.append(event.getThreadName());
          sbuf.append("] ");
        } else {
          sbuf.append(" ");
        }</b>
        sbuf.append(event.getLoggerName());
        sbuf.append(" - ");
        sbuf.append(event.getFormattedMessage());
        sbuf.append(LINE_SEP);
        return sbuf.toString();
      }
    }</pre>
    
    
        <p>The addition of the corresponding setter method is all that is
        needed to enable the configuration of a property.  Note that the
        <code>PrintThreadName</code> property is a boolean and not a
        <code>String</code>. Configuration of logback components was
        covered in detail in the <a
        href="configuration.html">chapter on configuration</a>. The <a
        href="onJoran.html">chapter on Joran</a> provides further detail. Here is
        the configuration file tailor made for
        <code>MySampleLayout2</code>.
        </p> 
    
    
        <span class="asGroovy" onclick="return asGroovy('MySampleLayout2');">View as .groovy</span>
        <pre id="MySampleLayout2" class="prettyprint source">&lt;configuration>
    
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        &lt;encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
          &lt;layout class="chapters.layouts.MySampleLayout2"> 
            <b>&lt;prefix&gt;MyPrefix&lt;/prefix&gt;</b>
            <b>&lt;printThreadName&gt;false&lt;/printThreadName&gt;</b>
          &lt;/layout>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="STDOUT" />
      &lt;/root>
    &lt;/configuration></pre>
    
       <p></p>
    
    
    		<h2 class="doAnchor" name="ClassicPatternLayout">PatternLayout</h2>
    
    		<p>Logback classic ships with a flexible layout called <a
    		href="../xref/ch/qos/logback/classic/PatternLayout.html">
    		<code>PatternLayout</code></a>.  As all layouts,
    		<code>PatternLayout</code> takes a logging event and returns a
    		<code>String</code>. However, this <code>String</code> can be
    		customized by tweaking <code>PatternLayout</code>'s
    		conversion pattern.
    		</p>   
    
        <p>The conversion pattern of <code>PatternLayout</code> is closely
        related to the conversion pattern of the <code>printf()</code>
        function in the C programming language. A conversion pattern is
        composed of literal text and format control expressions called
        <em>conversion specifiers</em>. You are free to insert any literal
        text within the conversion pattern. Each conversion specifier
        starts with a percent sign '%' and is followed by optional
        <em>format modifiers</em>, a <em>conversion word</em> and optional
        parameters between braces. The conversion word controls the data
        field to convert, e.g. logger name, level, date or thread
        name. The format modifiers control field width, padding, and left
        or right justification.
    		</p>
    
        <p>As already mentioned on several occasions,
        <code>FileAppender</code> and sub-classes expect an
        encoder. Consequently, when used in conjunction with
        <code>FileAppender</code> or its subclasses a
        <code>PatternLayout</code> must be wrapped within an
        encoder. Given that the
        <code>FileAppender</code>/<code>PatternLayout</code> combination
        is so common, logback ships with an encoder named
        <code>PatternLayoutEncoder</code>, designed solely for the purpose
        of wrapping a <code>PatternLayout</code> instance so that it can
        be seen as encoder. Below is an example which programmatically
        configures a <code>ConsoleAppender</code> with a
        <code>PatternLayoutEncoder</code>:</p>
    
     
    		<em>
    			Example: Sample usage of a PatternLayout
    			<a href="../xref/chapters/layouts/PatternSample.html">
    			(logback-examples/src/main/java/chapters/layouts/PatternSample.java)</a>
    		</em>
    		<pre class="prettyprint source">package chapters.layouts;
    
    import org.slf4j.LoggerFactory;
    
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.ConsoleAppender;
    
    public class PatternSample {
    
      static public void main(String[] args) throws Exception {
        Logger rootLogger = (Logger)LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
        LoggerContext loggerContext = rootLogger.getLoggerContext();
        // we are not interested in auto-configuration
        loggerContext.reset();
    
        <b>PatternLayoutEncoder encoder = new PatternLayoutEncoder();</b>
        <b>encoder.setContext(loggerContext);</b>
        <b>encoder.setPattern("%-5level [%thread]: %message%n");</b>
        <b>encoder.start();</b>
    
        ConsoleAppender&lt;ILoggingEvent> appender = new ConsoleAppender&lt;ILoggingEvent>();
        appender.setContext(loggerContext);
        appender.setEncoder(encoder); 
        appender.start();
    
        rootLogger.addAppender(appender);
    
        rootLogger.debug("Message 1"); 
        rootLogger.warn("Message 2");
      } 
    }</pre>
    
    		<p>In the above example, the conversion pattern is set to be
    		<b>"%-5level [%thread]: %message%n"</b>. A synopsis of conversion
    		word included in logback will be given shortly. Running
    		<code>PatternSample</code> application as:
    		</p>
    
        <p class="source">java java chapters.layouts.PatternSample</p>
    
        <p>will yield the following		output on the console.</p>
    
    		<p class="source">DEBUG [main]: Message 1 
    WARN  [main]: Message 2</p>
    
        <p>Note that in the conversion pattern <b>"%-5level [%thread]:
        %message%n"</b> there is no explicit separator between literal
        text and conversion specifiers. When parsing a conversion pattern,
        <code>PatternLayout</code> is capable of differentiating between
        literal text (space characters, the brackets, colon character) and
        conversion specifiers. In the example above, the conversion
        specifier %-5level means the level of the logging event should be
        left justified to a width of five characters. Format specifiers
        will be explained below.
    		</p>
    
    		<p>In <code>PatternLayout</code>, parenthesis can be used to group
    		conversion patterns. <b>It follows that the '(' and ')' carry
    		special meaning and need to be escaped if intended to be used as
    		literals. </b> The special nature of parenthesis is further <a
    		href="#Parentheses">explained below</a>.
    		</p>
    
    		<p>As mentioned previously, certain conversion specifiers may
    		include optional parameters passed between braces. A sample
    		conversion specifier with options could be
    		<code>%logger{10}</code>. Here "logger" is the conversion word,
    		and 10 is the option. Options are <a href="#cwOptions">further
    		discussed below</a>.
    		</p>
    		
    		<p>The recognized conversions words along with their options are
    		described in the table below. When multiple conversion words are
    		listed in the same table cell, they are considered as aliases.
    		</p>
    
    		<table class="bodyTable properties striped" border="0">
          <tr>
            <th><a name="conversionWord" href="#conversionWord">Conversion Word</a></th>
            <th>Effect</th>
          </tr>
    
    			<tr>
    				<td class="word" name="logger">
              <a name="logger" href="#logger"><span class="anchor"/></a>
    					<b>c</b>{<em>length</em>} <br /> 				
    					<b>lo</b>{<em>length</em>} <br />
    					<b>logger</b>{<em>length</em>} <br />
    				</td>
    
    				<td>
              Outputs the name of the logger at the origin of the logging
              event.
    
    					<p>This conversion word takes an integer as its first and
    					only option. The converter's abbreviation algorithm will
    					shorten the logger name, usually without significant loss of
    					meaning. Setting the value of length option to zero
    					constitutes an exception. It will cause the conversion word
    					to return the sub-string right to the rightmost dot
    					character in the logger name. The next table provides
    					examples of the abbreviation algorithm in action.
              </p>
    
    					<table class="bodyTable dark" border="0" cellpadding="8">
    						<tr>
    							<th>Conversion specifier</th>
    							<th>Logger name</th>
    							<th>Result</th>
    						</tr>
    						<tr>
    							<td>%logger</td>
    							<td>mainPackage.sub.sample.Bar</td>
    							<td>mainPackage.sub.sample.Bar</td>
    						</tr>
    
                <tr>
    							<td>%logger{0}</td>
    							<td>mainPackage.sub.sample.Bar</td>
    							<td>Bar</td>
    						</tr>
    
    						<tr>
    							<td>%logger{5}</td>
    							<td>mainPackage.sub.sample.Bar</td>
    							<td>m.s.s.Bar</td>
    						</tr>
    
    						<tr>
    							<td>%logger{10}</td>
    							<td>mainPackage.sub.sample.Bar</td>
    							<td>m.s.s.Bar</td>
    						</tr>
    
    						<tr>
    							<td>%logger{15}</td>
    							<td>mainPackage.sub.sample.Bar</td>
    							<td>m.s.sample.Bar</td>
    						</tr>
    
    						<tr>
    							<td>%logger{16}</td>
    							<td>mainPackage.sub.sample.Bar</td>
    							<td>m.sub.sample.Bar</td>
    						</tr>
    
    						<tr>
    							<td>%logger{26}</td>
    							<td>mainPackage.sub.sample.Bar</td>
    							<td>mainPackage.sub.sample.Bar</td>
    						</tr>
    					</table>
    
              <p>Please note that the rightmost segment in a logger name
              is never abbreviated, even if its length is longer than the
              <em>length</em> option. Other segments may be shortened to
              at most a single character but are never removed.</p>
    
    				</td>
    			</tr>
    
    			<tr>
    				<td class="word" name="class">
    					<b>C</b>{<em>length</em>} <br /> 
    					<b>class</b>{<em>length</em>} <br />
    				</td>
    
    				<td>
    					<p>Outputs the fully-qualified class name of the caller
    					issuing the logging request.
    					</p>
    
    					<p>Just like the <em>%logger</em> conversion word above,
    					this conversion takes an integer as an option to shorten
    					the class name. Zero carries special meaning and will cause
    					the simple class name to be printed without the package name
    					prefix. By default the class name is printed in full.
    					</p>
    
              <p>Generating the caller class information is not
              particularly fast.  Thus, its use should be avoided unless
              execution speed is not an issue.
    					</p>
    				</td>
    			</tr>
    
          <tr>
            <td class="word" name="contextName">
              <b>contextName</b><br/>
              <b>cn</b><br/></td>
              <td>Outputs the name of the logger context to which the
              logger at the origin of the event was attached to. </td>
          </tr>
    			<tr>
            <td class="word" name="date">
              <b>d</b>{<em>pattern</em>} <br /> 
              <b>date</b>{<em>pattern</em>} <br />
            </td>
            <td>
    					<p>Used to output the date of the logging event.  The date
    					conversion word admits a pattern string as an option. The
    					pattern syntax is compatible with the format accepted by <a
    					href="http://java.sun.com/j2se/1.4.2/docs/api/java/text/SimpleDateFormat.html"><code>java.text.SimpleDateFormat</code></a>.</p>
    
    					<p>You can specify the string <em>"ISO8601"</em> for the
    					ISO8601 date format. Note that the %date conversion word
    					defaults to the <a
    					href="http://en.wikipedia.org/wiki/ISO_8601">ISO 8601 date
    					format</a> in the absence of a pattern option.</p>
    
    					<p>Here are some sample option values. They assume that the
    					actual date is Friday 20th of October, 2006 and that the
    					author has returned to working on this document just after
    					lunch.</p>
    					
    					<table class="bodyTable dark" cellpadding="8">
    						<tr>
    							<th>Conversion Pattern</th>
    							<th>Result</th>
    						</tr>
                <tr>
    							<td>%d</td>
    							<td>2006-10-20 14:06:49,812</td>
    						</tr>
    						<tr>
    							<td>%date</td>
    							<td>2006-10-20 14:06:49,812</td>
    						</tr>
    						<tr>
    							<td>%date{ISO8601}</td>
    							<td>2006-10-20 14:06:49,812</td>
    						</tr>			
    						<tr>
    							<td>%date{HH:mm:ss.SSS}</td>
    							<td>14:06:49.812</td>
    						</tr>
    						<tr>
    							<td>%date{dd&#160;MMM&#160;yyyy&#160;;HH:mm:ss.SSS}</td>
    							<td>20 oct. 2006;14:06:49.812	</td>
    						</tr>
    					</table>
    
              <p>In addition to the date pattern, this converter admits a
              second option as the timezone. Thus, the
              '%date{HH:mm:ss.SSS,Australia/Perth} would print the time in
              the time zone of Perth, Australia, the world's most isolated
              city.
              </p>
    
              <p>Given that the comma ',' character is interpreted as the
              option separator, the pattern string [HH:mm:ss,SSS] will
              print the time in the [SSS] time zone which does not
              exist. Thus, the time will be printed in the default GMT
              timezone. If you wish to include a comma in your date
              pattern, then simply enclose the pattern between quotes. For
              example, %date{<b>"</b>HH:mm:ss,SSS<b>"</b>}.
              </p>
    				</td>
    			</tr>
    
    			<tr>
    				<td class="word" name="file">
    					<b>F / file</b>
    				</td>
    
    				<td>
    					<p>Outputs the file name of the Java source file where the
    					logging request was issued.
    					</p>
    
    					<p>Generating the file information is not particularly fast.
    					Thus, its use should be avoided unless execution speed is
    					not an issue.
    					</p>
    				</td>
    			</tr>
    
    			<tr >
    				<td class="word" name="caller">
    					<b>caller{depth}</b>
    					<b>caller{depth, evaluator-1, ... evaluator-n}</b>
    				</td>
    
    				<td>
    					<p>Outputs location information of the caller which
    					generated the logging event.
    					</p>
    
    					<p>The location information depends on the JVM
    					implementation but usually consists of the fully qualified
    					name of the calling method followed by the caller's source,
    					the file name and line number between parentheses.
    					</p>
    
    					<p>A integer can be added to the <em>caller</em> conversion
    					specifier's options to configure the depth of the
    					information to be displayed.
    					</p>
    
              <p>For example, <b>%caller{2}</b> would display the
              following excerpt:</p>
    					
    <pre class="source white_bg">0    [main] DEBUG - logging statement 
    Caller+0   at mainPackage.sub.sample.Bar.sampleMethodName(Bar.java:22)
    Caller+1   at mainPackage.sub.sample.Bar.createLoggingRequest(Bar.java:17)</pre>
    
    					<p>And <b>%caller{3}</b> would display this other excerpt:</p>
    
    <pre class="source white_bg">16   [main] DEBUG - logging statement 
    Caller+0   at mainPackage.sub.sample.Bar.sampleMethodName(Bar.java:22)
    Caller+1   at mainPackage.sub.sample.Bar.createLoggingRequest(Bar.java:17)
    Caller+2   at mainPackage.ConfigTester.main(ConfigTester.java:38)</pre>
    					
    					<p>This conversion word can also use evaluators to test
    					logging events against a given criterion before computing
    					caller data. For example, using <b>%caller{3,
    					CALLER_DISPLAY_EVAL}</b> will display three lines of
    					stacktrace, only if the evaluator called
    					<em>CALLER_DISPLAY_EVAL</em> returns a <b>positive</b>
    					answer.
    				</p>
    
    				 <p>Evaluators are described below.</p>
    				</td>
    			</tr>
    
    			<tr>
    				<td class="word" name="line">
    					<b>L / line</b>
    				</td>
    
    				<td><p>Outputs the line number from where the logging
    					request was issued.</p>
    
    					<p>Generating the line number information is not
    					particularly fast.  Thus, its use should be avoided unless
    					execution speed is not an issue.
    					</p>
    				</td>
    			</tr>
    
    
    			<tr>
    				<td class="word" name="message">
    					<b>m / msg / message</b>
    				</td>
    				<td>
              <p>Outputs the application-supplied message associated with
              the logging event.
              </p>
    				</td>
    			</tr>
    
    			<tr>
    				<td class="word" name="method">
    					<b>M / method</b>
    				</td>
    
    				<td>
    					<p>Outputs the method name where the logging request was
    					issued.</p>
    					<p>Generating the method name is not particularly fast.
    					Thus, its use should be avoided unless execution speed is
    					not an issue.</p>
    				</td>
    			</tr>
    
    			<tr>
    				<td class="word" name="newline">
    					<b>n</b>
    				</td>
    
    				<td>
    					<p>Outputs the platform dependent line separator
    						character or characters.</p>
    					<p>This conversion word offers practically the same
    					performance as using non-portable line separator strings
    					such as "\n", or "\r\n". Thus, it is the preferred way of
    					specifying a line separator.
    					</p>
    				</td>
    
    			</tr>
    
    			<tr>
    				<td class="word" name="level">
    					<b>p / le / level</b>
    				</td>
    				<td>Outputs the level of the logging event.</td>
    			</tr>
    
    			<tr>
    
    				<td class="word" name="relative">
    					<b>r / relative</b>
    				</td>
    
    				<td>Outputs the number of milliseconds elapsed since the start
    				of the application until the creation of the logging event.
    				</td>
    			</tr>
    
    
    			<tr>
    				<td class="word" name="relative">
    					<b>t / thread</b>
    				</td>
    
    				<td>Outputs the name of the thread that generated the logging
    				event.
    				</td>
    
    			</tr>
    
    			<tr>
    				<td class="word" name="mdc">
    					<b>X</b>{<em>key:-defaultVal</em>} <br /> 
    					<b>mdc</b>{<em>key:-defaultVal</em>} <br />
    				</td>
    
    				<td>
    
    					<p>Outputs the MDC (mapped diagnostic context) associated
    					with the thread that generated the logging event.
    					</p>
    
    					<p>If the <b>mdc</b> conversion word is followed by a key
    					between braces, as in <b>%mdc{userid}</b>, then the MDC
    					value corresponding to the key 'userid' will be output. If
    					the value is null, then the <a
    					href="configuration.html#defaultValuesForVariables">default
    					value</a> speficied after the <b>:-</b> operator is
    					output. If no deault value is specified than the empty
    					string is output.
    					</p>
    
    					<p>If no key is given, then the entire content of the MDC
    					will be output in the format "key1=val1, key2=val2".
    					</p>
    
    					<p>See the <a href="mdc.html">chapter on MDC</a> for more
    					details on the subject.</p>
    
    				</td>
    			</tr>
    			<tr>
    				<td class="word" name="ex">
    					<b>ex</b>{<em>depth</em>} <br /> 
              	<b>exception</b>{<em>depth</em>} <br /> 
    					<b>throwable</b>{<em>depth</em>} <br />
              <br />
    					<b>ex</b>{depth, evaluator-1, ..., evaluator-n} <br />
    					<b>exception</b>{depth, evaluator-1, ..., evaluator-n} <br />
    					<b>throwable</b>{depth, evaluator-1, ..., evaluator-n}
    				</td>
    
    				<td>
    					<p>Outputs the stack trace of the exception
    					associated with the logging event, if any. By default the
    					full stack trace will be output.
    				 </p>
             
    				 <p>The <em>throwable</em> conversion word can followed by one of
    						the following options:
    				 </p>
    				 <ul>
    				   <li><em>short</em>: prints the first line of the stack trace</li>
    				   <li><em>full</em>: prints the full stack trace</li>
    				   <li>Any integer: prints the given number of lines of the stack trace</li>
    				 </ul>
    				 
    				 <p>Here are some examples:</p>
    				 
    				 <table  class="bodyTable">
    						<tr class="a">
    							<th>Conversion Pattern</th>
    							<th>Result</th>
    						</tr>
    						<tr class="b">
    							<td>%ex</td>
    							<td><pre>mainPackage.foo.bar.TestException: Houston we have a problem
      at mainPackage.foo.bar.TestThrower.fire(TestThrower.java:22)
      at mainPackage.foo.bar.TestThrower.readyToLaunch(TestThrower.java:17)
      at mainPackage.ExceptionLauncher.main(ExceptionLauncher.java:38)</pre></td>
    						</tr>
    						<tr class="a">
    							<td>%ex{short}</td>
    							<td><pre>mainPackage.foo.bar.TestException: Houston we have a problem
      at mainPackage.foo.bar.TestThrower.fire(TestThrower.java:22)</pre></td>
    						</tr>
    						<tr class="b">
    							<td>%ex{full}</td>
    							<td><pre>mainPackage.foo.bar.TestException: Houston we have a problem
      at mainPackage.foo.bar.TestThrower.fire(TestThrower.java:22)
      at mainPackage.foo.bar.TestThrower.readyToLaunch(TestThrower.java:17)
      at mainPackage.ExceptionLauncher.main(ExceptionLauncher.java:38)</pre></td>
    						</tr>
    						<tr class="a">
    							<td>%ex{2}</td>
    							<td><pre>mainPackage.foo.bar.TestException: Houston we have a problem
      at mainPackage.foo.bar.TestThrower.fire(TestThrower.java:22)
      at mainPackage.foo.bar.TestThrower.readyToLaunch(TestThrower.java:17)</pre></td>
    						</tr>
    				 </table>
    					
    					<p>This conversion word can also use evaluators to test
    					logging events against a given criterion before creating the
    					output. For example, using <b>%ex{full, EX_DISPLAY_EVAL}</b>
    					will display the full stack trace of the exception only if
    					the evaluator called <em>EX_DISPLAY_EVAL</em> returns a
    					<b>negative</b> answer. Evaluators are described further
    					down in this document.
    					</p>
    				</td>
    			</tr>
          
          <tr>
    				<td class="word" name="xThrowable">
    					<b>xEx</b>{<em>depth</em>} <br /> 
              <b>xException</b>{<em>depth</em>} <br /> 
    					<b>xThrowable</b>{<em>depth</em>} <br />
              <br />
    					<b>xEx</b>{depth, evaluator-1, ..., evaluator-n} <br />
    					<b>xException</b>{depth, evaluator-1, ..., evaluator-n} <br />
    					<b>xThrowable</b>{depth, evaluator-1, ..., evaluator-n}
    				</td>
    
    				<td>
    					<p>Same as the %throwable conversion word above with the
    					addition of class packaging information.</p>
    
              <p>If you do not specify %xThrowable or another
              throwable-related conversion word in the conversion pattern,
              <code>PatternLayout</code> will automatically add it as the
              last conversion word, on account of the importance of stack
              trace information. The $nopex conversion word can be
              substituted for %xThrowable, if you do not wish stack
              trace information to be displayed. See also the %nopex
              conversion word.
             </p>
    
              <p>At the end of each stack frame of the exception, a string
              consisting of the jar file containing the relevant class
              followed by the "Implementation-Version" as found in that
              jar's manifest will be added. This innovative technique was
              <a
              href="http://macstrac.blogspot.com/2008/09/better-stack-traces-in-java-with-log4j.html">originally suggested
              by James Strachan</a>. If the information is uncertain, then
              the class packaging data will be preceded by a tilde, i.e.
              the '~' character.
              </p>
    
              <p>Here is an example:</p>
    
              <p class="source small">java.lang.NullPointerException
      at com.xyz.Wombat(Wombat.java:57) <b><span class="red">~</span>[wombat-1.3.jar:1.3]</b>
      at  com.xyz.Wombat(Wombat.java:76) ~[wombat-1.3.jar:1.3]
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.5.0_06]
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) ~[na:1.5.0_06]
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) ~[na:1.5.0_06]
      at java.lang.reflect.Method.invoke(Method.java:585) ~[na:1.5.0_06]
      at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:59) [junit-4.4.jar:na]
      at org.junit.internal.runners.MethodRoadie.runTestMethod(MethodRoadie.java:98) [junit-4.4.jar:na]
      ...etc </p>
    
              <p>Logback goes to great lengths to ensure that the class
              packaging information it displays is correct, even in
              arbitrarily complex class loader hierarchies.  However, when
              it is unable to guarantee the absolute correctness of the
              information, then it will prefix the data with a tilde, i.e.
              the '~' character. Thus, it is theoretically possible for
              the printed class packaging information to differ from the
              real class packaging information. So, in the above example,
              given that packaging data for the Wombat class is preceded
              by a tilde, it is possible that the correct packaging data is
              in reality [wombat.jar:1.7].
              </p>
              
              <p><a
              href="http://jira.qos.ch/browse/LBCLASSIC-212">Feedback from
              users</a> indicates that Netbeans chokes on packaging
              information. If you are a Netbeans user, then you should
              disable packaging information in stack traces by adding
              "%ex" at the end of of your conversion pattern. For example,
              "%d %logger - %m%n" should be rewritten as "%d %logger -
              %m%n<b>%ex</b>"
              </p>
            </td>
    
          </tr>
    
          <tr>
            <td class="word" name="nopex">
              <b>nopex</b> <br />
              <b>nopexception</b>
            </td>
    
            <td>
              <p>Although it <em>pretends</em> to handle stack trace data,
              this conversion word does not output any data, thus,
              effectively ignoring exceptions.
              </p>
    
              <p>The %nopex conversion word allows the user to override
              <code>PatternLayout</code>'s internal safety mechanism which
              silently adds the %xThrowable conversion keyword in the absence of
              another conversion word handling exceptions.
              </p>
            </td>
          </tr>
    
          <tr >
            <td class="word" name="marker">
              <b>marker</b>
            </td>
    
            <td>
              <p>Outputs the marker associated with the logger 
             request.</p>
    
              <p>In case the marker contains children markers, the
              converter displays the parent as well as childrens' names
              according to the format shown below.
              </p>
              <p>
                <em>parentName [ child1, child2 ]</em>
              </p>
            </td>
          </tr>
    
    
          <tr>
            <td class="word" name="property">
              <b>property{key}</b>
            </td>
            
            <td><p>Outputs the value associated with a property named
            <em>key</em>. The the relevant docs on how to define ion
            entitled <a
            href="configuration.html#variableSubstitution">define
            variables</a> and <a href="configuration.html#scopes">variable
            scopes</a>. 
    
            <!-- XXXXXXXXXXXX -->
    
            If <em>key</em> is not a property of
            the logger context, then <em>key</em> will be looked up in the
            System properties.</p>
    
    
             <p>There is no default value for <em>key</em>. If it is
             omitted, the returned value will be "Property_HAS_NO_KEY",
             expliciting the error condition.</p>
              
            </td>
          </tr>
    
          <tr>
            <td class="word" name="replace">
              <b>replace(<em>p</em>){r, t}</b>
            </td>
            
            <td>
              <p>Replaces occurrences of 'r', a regex, with its
              replacement 't' in the string produces by the sub-pattern
              'p'. For example, "%replace(%msg){'\s', ''}" will remove all
              spaces contained in the event message. 
              </p>
    
              <p>The pattern 'p' can be arbitrarily complex and in
              particular can contain multiple conversion keywords. For
              instance, "%replace(%logger %msg){'\.', '/'}" will replace
              all dots in the logger or the message of the event with a
              forward slash.
              </p>
              
            </td>
          </tr>
    
    
          <tr>
            <td class="word" name="rootException">
              <b>rEx</b>{<em>depth</em>} <br /> 
              <b>rootException</b>{<em>depth</em>} <br /> 
              <br />
    					<b>rEx</b>{depth, evaluator-1, ..., evaluator-n} <br />
    					<b>rootException</b>{depth, evaluator-1, ..., evaluator-n}
            </td>
            
            <td>
              <p>Outputs the stack trace of the exception associated with
              the logging event, if any. The root cause will be output
              first instead of the standard "root cause last". Here is a
              sample output (edited for space):
              </p>
    
             <pre class="small">java.lang.NullPointerException
      at com.xyz.Wombat(Wombat.java:57) ~[wombat-1.3.jar:1.3]
      at com.xyz.Wombat(Wombat.java:76) ~[wombat-1.3.jar:1.3]
    Wrapped by: org.springframework.BeanCreationException: Error creating bean with name 'wombat': 
      at org.springframework.AbstractBeanFactory.getBean(AbstractBeanFactory.java:248) [spring-2.0.jar:2.0]
      at org.springframework.AbstractBeanFactory.getBean(AbstractBeanFactory.java:170) [spring-2.0.jar:2.0]
      at org.apache.catalina.StandardContext.listenerStart(StandardContext.java:3934) [tomcat-6.0.26.jar:6.0.26]
    </pre>          
    
             <p>The %rootException converter admits the same optional
             parameters as the %xException converter described above,
             including depth and eveluators. It outputs also packaging
             information. In short, %rootException is very similar to
             %xException, only the order of exception output is reversed.
             </p>
    
             <p>Tomasz Nurkiewicz, the author of %rootException converter,
             documents his contribution in a blog entry entitled <a
             href="http://nurkiewicz.blogspot.com/2011/09/logging-exceptions-root-cause-first.html">"Logging
             exceptions root cause first"</a>.</p>
            </td>
          </tr>
    
    		</table>
    
    
        <h4 class="doAnchor" name="percentIsSpecial">% character has special meaning</h4>
    
        <p>Given that in the context of conversion patterns the percent
        sign carries special meaning, in order to include it as a literal,
        it needs to be escaped with a backslash, e.g. "%d %p <b>\%</b>
        %m%n".
        </p>
    
        <h4 class="doAnchor" name="restrictionsOnLiterals">Restrictions on
        literals immediately following conversion words</h4>
    
        <p>In most cases literals naturally contain spaces or other
        delimiting characters so that they are not confused with
        conversion words. For example, the pattern
        "%level&nbsp;[%thread]&nbsp;-&nbsp;%message%n" contains the string
        literals <code>"&nbsp;["</code> and
        <code>"]&nbsp;-&nbsp;"</code>. However, if a character which can
        be part of a java identifier immediately follows a conversion
        word, logback's pattern parser will be fooled into thinking that
        the literal is part of the conversion word. For example, the
        pattern "%date<b>%nHello</b>" will be interpreted as two
        conversion words %date and %nHello and since %nHello is not a
        known conversion word, logback will output %PARSER_ERROR[nHello]
        for %nHello. If you wish the string literal "Hello" to immediately
        separate %n and Hello, pass an empty argument list to %n. For
        example, "%date<b>%n{}</b>Hello" will be interpreted as %date
        followed by %n followed by the literal "Hello".
    
        </p>
    
        <h2 class="doAnchor" name="formatModifiers">Format modifiers</h2>
    
    		<p>By default the relevant information is output as-is.  However,
    		with the aid of format modifiers it is possible to change the
    		minimum and maximum width and the justifications of each data
    		field.
    		</p>
    
    		<p>The optional format modifier is placed between the percent sign
    		and the conversion character or word.
    		</p>
    
    		<p>The first optional format modifier is the <em>left
    		justification flag</em> which is just the minus (-)
    		character. Then comes the optional <em>minimum field width</em>
    		modifier. This is a decimal constant that represents the minimum
    		number of characters to output. If the data item contains fewer
    		characters, it is padded on either the left or the right until the
    		minimum width is reached. The default is to pad on the left (right
    		justify) but you can specify right padding with the left
    		justification flag. The padding character is space. If the data
    		item is larger than the minimum field width, the field is expanded
    		to accommodate the data. The value is never truncated.
    		</p>
    
    		<p>This behavior can be changed using the <em>maximum field
    		width</em> modifier which is designated by a period followed by a
    		decimal constant. If the data item is longer than the maximum
    		field, then the extra characters are removed from the
    		<em>beginning</em> of the data item. For example, if the maximum
    		field width is eight and the data item is ten characters long,
    		then the first two characters of the data item are dropped. This
    		behavior deviates from the printf function in C where truncation
    		is done from the end.
    		</p>
    
    		<p>Truncation from the end is possible by appending a minus
    		character right after the period. In that case, if the maximum
    		field width is eight and the data item is ten characters long,
    		then the last two characters of the data item are dropped.
    		</p>
    
    		<p>Below are various format modifier examples for the logger
    		conversion specifier.
    		</p>
    
    		<table class="bodyTable" border="0" cellpadding="8">
          <tr>
            <th>Format modifier</th>
            <th>Left justify</th>
            <th>Minimum width</th>
            <th>Maximum width</th>
            <th>Comment</th>
          </tr>
    			<tr class="a">
    				<td align="center">%20logger</td>
    				<td align="center">false</td>
    				<td align="center">20</td>
    				<td align="center">none</td>
    				<td>
    					Left pad with spaces if the logger name is less
    					than 20 characters long.
    				</td>
    			</tr>
    			<tr class="b">
    				<td align="center">%-20logger</td>
    				<td align="center">true</td>
    				<td align="center">20</td>
    				<td align="center">none</td>
    				<td>
    					Right pad with spaces if the logger name is less
    					than 20 characters long.
    				</td>
    			</tr>
    			<tr class="a">
    				<td align="center">%.30logger</td>
    				<td align="center">NA</td>
    				<td align="center">none</td>
    				<td align="center">30</td>
    				<td>
    					Truncate from the beginning if the logger name is
    					longer than 30 characters.
    				</td>
    			</tr>
    			<tr class="b">
    				<td align="center">%20.30logger</td>
    				<td align="center">false</td>
    				<td align="center">20</td>
    				<td align="center">30</td>
    				<td>
    					Left pad with spaces if the logger name is shorter
    					than 20 characters. However, if logger name is
    					longer than 30 characters, then truncate from the
    					beginning.
    				</td>
    			</tr>
    			<tr class="a">
    				<td align="center">%-20.30logger</td>
    				<td align="center">true</td>
    				<td align="center">20</td>
    				<td align="center">30</td>
    				<td>
    					Right pad with spaces if the logger name is shorter
    					than 20 characters. However, if logger name is
    					longer than 30 characters, then truncate from the
    					<em>beginning</em>.
    				</td>
    			</tr>
    			<tr class="b">
    				<td align="center">%.-30logger</td>
    				<td align="center">NA</td>
    				<td align="center">none</td>
    				<td align="center">30</td>
    				<td>
    					Truncate from the <em>end</em> if the logger name is
    					longer than 30 characters.
    				</td>
    			</tr>
    		</table>
    				
    		<p>The table below list examples for format modifier
    		truncation. Please note that the square brackets, i.e the pair of "[]"
    		characters, are not part of the output. They are used to delimit
    		the width of output.</p>
    
    
    		<table  class="bodyTable" border="0" cellpadding="8">
          <tr>
            <th>Format modifier</th>
            <th>Logger name</th>
            <th>Result</th>		
          </tr>
    			<tr class="b">
    				<td align="center">[%20.20logger]</td>
    				<td align="center">main.Name</td>
    				<td align="center"><pre>[           main.Name]</pre></td>
    			</tr>
          <tr class="a">
    				<td align="center">[%-20.20logger]</td>
    				<td align="center">main.Name</td>
    				<td align="center"><pre>[main.Name           ]</pre></td>
    			</tr>
    		  <tr class="a">
    				<td align="center">[%10.10logger]</td>
    				<td align="center">main.foo.foo.bar.Name</td>
    				<td align="center"><pre>[o.bar.Name]</pre></td>
    			</tr>
    			<tr class="b">
    				<td align="center">[%10.-10logger]</td>
    				<td align="center">main.foo.foo.bar.Name</td>
    				<td align="center"><pre>[main.foo.f]</pre></td>
    			</tr>
    		</table>
    
        <h3 class="doAnchor" name="oneLetterLevel">Output just one letter
        for the level</h3>
    
        <p>Instead of printing TRACE, DEBUG, WARN, INFO or ERROR for the
        level, you may want to print just T, D, W, I and E. You could
        write a <a href="#customConversionSpecifier">custom converter</a>
        for this purpose, or simply make use of format modifiers (just
        discussed) to shorten the level value to a single character. The
        appropriate conversion specifier would be
        "<code>%.-1level</code>".
        </p>
        
    		<h2 class="doAnchor" name="cwOptions">Conversion word options</h2>
    
    		<p>A conversion specifier can be followed by options. The are
    		always declared between braces. We have already seen some of the
    		possibilities offered by options, for instance in conjunction with
    		the MDC conversion specifier, as in: <em>%mdc{someKey}</em>.
    		</p>
    
        <p>A conversion specifier might have more than one option. For
        example, a conversion specifier that makes use of evaluators,
        which will be covered soon, may add evaluator names to the option
        list, as shown below:</p>
    
    		<pre class="prettyprint source">&lt;pattern>%-4relative [%thread] %-5level - %msg%n \
      <b>%caller{2, DISP_CALLER_EVAL, OTHER_EVAL_NAME, THIRD_EVAL_NAME}</b>&lt;/pattern></pre>
        
        <p>If the option includes special characters such as a braces, spaces or
        commas, you can enclose it between single or double quotes. For
        example, consider the next pattern.</p>
    
    		<pre class="prettyprint source">&lt;pattern>%-5level - %replace(%msg)<b>{'\d{14,16}', 'XXXX'}</b>%n&lt;/pattern></pre>
    
    
        <p>We pass the options <code>\d{16}</code> and <code>XXXX</code>
        to the <code>replace</code> conversion word. It replaces any
        sequence of 14, 15 or 16 digits contained in the message with XXXX
        effectively obfuscating credit card numbers. Note that "\d" which
        is a shorthand for a single digit in regular expressions. The
        "{14,16\}" is interpreted as "{14, 16}", that is, repeat the
        previous item at least 14 but at most 16 times.
        </p>
    
    		<h2 class="doAnchor" name="Parentheses">Parentheses are
    		special</h2>
    
        <p>In logback, parentheses within the pattern string are treated
        as grouping tokens. Thus, it is possible to group a sub-pattern
        and apply formatting directives on that sub-pattern. As of version
        0.9.27, logback supports composite conversion words such as <a
        href="#replace">%replace</a> which can transform sub-patterns.
        </p>
    
        <p>For example, the pattern</p> 
    
        <p class="source"><b>%-30(</b>%d{HH:mm:ss.SSS} [%thread]<b>)</b> %-5level %logger{32} - %msg%n</p> 
    
        <p>will group the output generated by the sub-pattern
        "%d{HH:mm:ss.SSS} [%thread]" so that it is right-padded if less
        than 30 characters.
        </p>
    
        <p>If without the grouping the output was</p>
    
        <p class="source">13:09:30 [main] DEBUG c.q.logback.demo.ContextListener - Classload hashcode is 13995234
    13:09:30 [main] DEBUG c.q.logback.demo.ContextListener - Initializing for ServletContext
    13:09:30 [main] DEBUG c.q.logback.demo.ContextListener - Trying platform Mbean server
    13:09:30 [pool-1-thread-1] INFO  ch.qos.logback.demo.LoggingTask - Howdydy-diddly-ho - 0
    13:09:38 [btpool0-7] INFO c.q.l.demo.lottery.LotteryAction - Number: 50 was tried.
    13:09:40 [btpool0-7] INFO c.q.l.d.prime.NumberCruncherImpl - Beginning to factor.
    13:09:40 [btpool0-7] DEBUG c.q.l.d.prime.NumberCruncherImpl - Trying 2 as a factor.
    13:09:40 [btpool0-7] INFO c.q.l.d.prime.NumberCruncherImpl - Found factor 2
        </p>
    
        <p>with the "%-30()" grouping it would be</p>
    
        <p class="source">13:09:30 [main]            DEBUG c.q.logback.demo.ContextListener - Classload hashcode is 13995234
    13:09:30 [main]            DEBUG c.q.logback.demo.ContextListener - Initializing for ServletContext
    13:09:30 [main]            DEBUG c.q.logback.demo.ContextListener - Trying platform Mbean server
    13:09:30 [pool-1-thread-1] INFO  ch.qos.logback.demo.LoggingTask - Howdydy-diddly-ho - 0
    13:09:38 [btpool0-7]       INFO  c.q.l.demo.lottery.LotteryAction - Number: 50 was tried.
    13:09:40 [btpool0-7]       INFO  c.q.l.d.prime.NumberCruncherImpl - Beginning to factor.
    13:09:40 [btpool0-7]       DEBUG c.q.l.d.prime.NumberCruncherImpl - Trying 2 as a factor.
    13:09:40 [btpool0-7]       INFO  c.q.l.d.prime.NumberCruncherImpl - Found factor 2
        </p>
    
        
        <p>The latter form is more comfortable to read.</p>
        
        <p>If you need to treat the parenthesis character as a literal, it
        needs to be escaped by preceding each parenthesis with a
        backslash. As in, <b>\(</b>%d{HH:mm:ss.SSS}
        [%thread]<b>\)</b>. 
        </p>
    
        <h2 class="doAnchor" name="coloring">Coloring</h2>
    
        <p>Grouping by <a href="#Parentheses">parentheses</a> as explained
        above allows coloring of sub-patterns. As of version 1.0.5,
        <code>PatternLayout</code> recognizes "%black", "%red",
        "%green","%yellow","%blue", "%magenta","%cyan", "%white", "%gray",
        "%boldRed","%boldGreen", "%boldYellow", "%boldBlue",
        "%boldMagenta""%boldCyan", "%boldWhite" and "%highlight" as
        conversion words. These conversion words are intended to contain a
        sub-pattern. Any sub-pattern enclosed by a coloring word will be
        output in the specified color.
        </p>
    
        <p>Below is a configuration file illustrating coloring. Note the
        %cyan conversion specifier enclosing "%logger{15}". This will
        output the logger name abreviated to 15 characters in cyan. The
        %highlight conversion specifier prints its sub-pattern in bold-red
        for events of level ERROR, in red for WARN, in BLUE for INFO, and
        in the default color for other levels.</p>
    
    		<em>
    			Example: Highlighting levels
    			(logback-examples/src/main/java/chapters/layouts/highlighted.xml)
    		</em>
    
        <span class="asGroovy" onclick="return asGroovy('highlighted');">View as .groovy</span>
    
    
    <pre id="highlighted" class="prettyprint">&lt;configuration debug="true">
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        &lt;!-- On Windows machines setting withJansi to true enables ANSI
             color code interpretation by the Jansi library. This requires
             org.fusesource.jansi:jansi:1.8 on the class path.  Note that
             Unix-based operating systems such as Linux and Mac OS X
             support ANSI color codes by default. --&gt;
        <b>&lt;withJansi>true&lt;/withJansi></b>
        &lt;encoder>
          &lt;pattern>[%thread] <b>%highlight(%-5level)</b> <b>%cyan(%logger{15})</b> - %msg %n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
      &lt;root level="DEBUG">
        &lt;appender-ref ref="STDOUT" />
      &lt;/root>
    &lt;/configuration></pre>
    
         <p>Here is the corresponding output:</p>
    
    <pre class="source">[main] <span style="color:#611">WARN</span>  <span style="color:#2bd">c.l.TrivialMain</span> - a warning message 0
    [main] DEBUG <span style="color:#2bd">c.l.TrivialMain</span> - hello world number1
    [main] DEBUG <span style="color:#2bd">c.l.TrivialMain</span> - hello world number2
    [main] <span style="color:#00F">INFO</span>  <span style="color:#2bd">c.l.TrivialMain</span> - hello world number3
    [main] DEBUG <span style="color:#2bd">c.l.TrivialMain</span> - hello world number4
    [main] <span style="color:#611">WARN</span>  <span style="color:#2bd">c.l.TrivialMain</span> - a warning message 5
    [main] <span style="color:#F00">ERROR</span> <span style="color:#2bd">c.l.TrivialMain</span> - Finish off with fireworks</pre>
    
        <p>It takes very few lines of code to create a coloring conversion
        word. The section entitled <a
        href="#customConversionSpecifier">creating a custom conversion
        specifier</a> discusses the steps necessary for registering a
        conversion word in your configuration file.</p>
       
    		<h2 class="doAnchor" name="Evaluators">Evaluators</h2>
    
    		<p>As mentioned above, option lists come in handy when a
    		conversion specifier is required to behave dynamically based on
    		one or more
    		<a href="../xref/ch/qos/logback/core/boolex/EventEvaluator.html">
    		<code>EventEvaluator</code></a> objects.
    		<code>EventEvaluator</code> objects have the responsibility to
    		determine whether a given logging event matches the criteria of the
    		evaluator.
    		</p>
    		
        <p>Let us review an example involving a
        <code>EventEvaluator</code>.  The next configuration file outputs
        the logging events to the console, displaying date, thread, level,
        message and caller data. Given that extracting the caller data of
        a logging event is on the expensive side, we will do so only when
        the logging request originates from a specific logger, and when
        the message contains a certain string. Thus, we make sure that only
        specific logging requests will have their caller information
        generated and displayed. In other cases, where the caller data is
        superfluous, we will not penalize application performance.
    		</p>
    
        <p>Evaluators and in particular <em>evaluation expressions</em>
        are presented in a <a
        href="filters.html#evalutatorFilter">dedicated section of the
        chapter on filters</a> which you MUST read if you want to use
        evaluators in any meaningful way. Also note that the examples below
        are implicitly based on <code>JaninoEventEvaluator</code> which
        requires the <a
        href="http://docs.codehaus.org/display/JANINO/Home">Janino
        library</a>. Please see the <a
        href="../setup.html#janino">corresponding section</a> of the setup
        document.</p>
    
    		<em>
    			Example: Sample usage of EventEvaluators
    			(logback-examples/src/main/java/chapters/layouts/callerEvaluatorConfig.xml)
    		</em>
    
        <span class="asGroovy" onclick="return asGroovy('callerEvaluatorConfig');">View as .groovy</span>
    
    
    		<pre id="callerEvaluatorConfig" class="prettyprint source">&lt;configuration>
      <b>&lt;evaluator name="DISP_CALLER_EVAL">
        &lt;expression>logger.contains("chapters.layouts") &amp;amp;&amp;amp; \
          message.contains("who calls thee")&lt;/expression>
      &lt;/evaluator></b>
    
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
        &lt;encoder>
          &lt;pattern>
            %-4relative [%thread] %-5level - %msg%n<b>%caller{2, DISP_CALLER_EVAL}</b>
          &lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;root level="DEBUG"> 
        &lt;appender-ref ref="STDOUT" /> 
      &lt;/root>
    &lt;/configuration></pre>
    
    		<p>The above evaluation expression matches events which emanate
    		from a logger with a name containing the string "chapters.layouts"
    		and the message contains the string "who calls thee". Due to XML
    		encoding rules, the &amp; character cannot be written as is, and
    		needs to be escaped as &amp;amp;.</p>
    
        <p>The following class makes use of some of the characteristics
        mentioned in above configuration file.</p>
    		
        <p><em>
    			Example: Sample usage of EventEvaluators
    			<a href="../xref/chapters/layouts/CallerEvaluatorExample.html">
    			(logback-examples/src/main/java/chapters/layouts/CallerEvaluatorExample.java)</a>
    		</em>
        </p>
    		<pre class="prettyprint source">package <b>chapters.layouts</b>;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.util.StatusPrinter;
    
    public class CallerEvaluatorExample {
    
      public static void main(String[] args)  {
        Logger logger = LoggerFactory.getLogger(CallerEvaluatorExample.class);
        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
    
        try {
          JoranConfigurator configurator = new JoranConfigurator();
          configurator.setContext(lc);
          configurator.doConfigure(args[0]);
        } catch (JoranException je) {
          // StatusPrinter will handle this
        }
        StatusPrinter.printInCaseOfErrorsOrWarnings(lc);
    
        for (int i = 0; i &lt; 5; i++) {
          if (i == 3) {
            logger.debug(<b>"who calls thee</b>?");
          } else {
            logger.debug("I know me " + i);
          }
        }
      }
    }</pre>
    
    		<p>The above application does nothing particularly fancy. Five
    		logging requests are issued, the third one emitting the message
    		"who calls thee?"
    		</p>
    
    		<p>The command</p>
    
        <p class="source">java chapters.layouts.CallerEvaluatorExample src/main/java/chapters/layouts/callerEvaluatorConfig.xml</p>
    
        <p>will yield</p>
    
    		<div class="source"><pre>0    [main] DEBUG - I know me 0 
    0    [main] DEBUG - I know me 1 
    0    [main] DEBUG - I know me 2 
    0    [main] DEBUG - who calls thee? 
    Caller+0   at chapters.layouts.CallerEvaluatorExample.main(CallerEvaluatorExample.java:28)
    0    [main] DEBUG - I know me 4</pre></div>
    
    
    		<p>When a logging request is issued, the corresponding logging
    		event is evaluated. Only the third logging event matches the
    		evaluation criteria, causing its caller data to be displayed. For
    		other logging events, the evaluation criteria do not match and no
    		caller data is printed.
    		</p>
    
    
    		<p>One can change the expression to correspond a real world
    		scenario. For instance, one could combine the logger name and
    		request level. Thus, logging requests of level <em>WARN</em> and
    		up, originating from a sensitive part of an application, e.g. a
    		financial transaction module, would have their caller data
    		displayed.
    		</p>
    
    		<p><b>Important:</b> With the <em>caller</em> conversion word,
    		caller data is output when <em>the expression evaluates to
    		<b>true</b>.</em></p>
    
    		<p>Let us consider at a different situation. When exceptions are
    		included in a logging request, their stack trace is also
    		output. However, one might want to suppress the stack trace for
    		some specific exceptions.
    		</p>
    
    		<p>The Java code shown below creates three log requests, each with
    		an exception. The second exception is different from the others:
    		it contains the string "do not display this" and it is of type
    		<code>chapters.layouts.TestException</code>. As its message
    		commands, let us now prevent the second exception from being
    		printed.</p>
    
       <p><em>
    			Example: Sample usage of EventEvaluators
    			<a href="../xref/chapters/layouts/ExceptionEvaluatorExample.html">
    			(logback-examples/src/main/java/chapters/layouts/ExceptionEvaluatorExample.java)</a>
    		</em>
        </p>
    <pre class="prettyprint source">package chapters.layouts;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.util.StatusPrinter;
    
    public class ExceptionEvaluatorExample {
    
      public static void main(String[] args) {
        Logger logger = LoggerFactory.getLogger(ExceptionEvaluatorExample.class);
        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
    
        try {
          JoranConfigurator configurator = new JoranConfigurator();
          configurator.setContext(lc);
          lc.reset();
          configurator.doConfigure(args[0]);
        } catch (JoranException je) {
           // StatusPrinter will handle this
        }
        StatusPrinter.printInCaseOfErrorsOrWarnings(lc);
    
        for (int i = 0; i &lt; 3; i++) {
          if (i == 1) {
            logger.debug("logging statement " + i, new TestException(
                "do not display this"));
          } else {
            logger.debug("logging statement " + i, new Exception("display"));
          }
        }
      }
    }</pre>
    		
    		<p>In the next configuration file, the evaluation expression
    		matches events containing a throwable of type
    		<code>chapters.layouts.TextException</code>, precisely the type of
    		exceptions we wish to suppress.
        </p>
    
    		<em>
    			Example: Sample usage of EventEvaluators
    			(logback-examples/src/main/java/chapters/layouts/exceptionEvaluatorConfig.xml)
    		</em>
    		<pre class="prettyprint source">&lt;configuration>
    
      <b>&lt;evaluator name="DISPLAY_EX_EVAL">
        &lt;expression>throwable != null &amp;amp;&amp;amp; throwable instanceof  \
          chapters.layouts.TestException&lt;/expression>
      &lt;/evaluator></b>
    	
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        &lt;encoder>
          &lt;pattern>%msg%n<b>%ex{full, DISPLAY_EX_EVAL}</b>&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;root level="debug">
        &lt;appender-ref ref="STDOUT" />
      &lt;/root>
    &lt;/configuration></pre>
    
    		<p>With this configuration, each time an instance of the
    		<em>chapters.layouts.TestException</em> is included within a logging
    		request, the stack trace will be suppressed.
    		</p>
    
        <p>Launching the command</p>
    
        <p class="source">java chapters.layouts.ExceptionEvaluatorExample src/main/java/chapters/layouts/exceptionEvaluatorConfig.xml</p>
    
        <p>will yield</p>
    
    <p class="source">logging statement 0
    java.lang.Exception: display
      at chapters.layouts.ExceptionEvaluatorExample.main(ExceptionEvaluatorExample.java:43) [logback-examples-0.9.19.jar:na]
    logging statement 1
    logging statement 2
    java.lang.Exception: display
      at chapters.layouts.ExceptionEvaluatorExample.main(ExceptionEvaluatorExample.java:43) [logback-examples-0.9.19.jar:na]</p>
    
    
        <p>Notice how the second log statement has no stack trace. We
        effectively suppressed the stack trace for the
        <code>TextException</code>. The text between square brackets at
        the end of each stack trace line is <a
        href="#xThrowable">packaging information</a> discussed
        earlier.</p>
    
    		<p><span class="label notice">Note</span> With the <b><em>%ex</em></b> conversion
    		specifier, the stack trace is displayed when <em>the expression
    		evaluates to <b>false</b>.</em></p>
    
    
        
    		<h2 class="doAnchor" name="customConversionSpecifier">Creating a
    		custom conversion specifier</h2>
    
    		<p>Up to this point we have presented the built-in conversion
    		words in <code>PatternLayout</code>. But it is also possible to
    		add conversion words of your own making.</p>
    		
    		<p>Building a custom conversion specifier consists of two steps.
        </p>
    		
        <h4>Step 1</h4>
    
    		<p>First, you must extend the <code>ClassicConverter</code>
    		class. <a
    		href="../xref/ch/qos/logback/classic/pattern/ClassicConverter.html">
    		<code>ClassicConverter</code></a> objects are responsible for
    		extracting information out of <code>ILoggingEvent</code> instances
    		and producing a String. For example,
    		<a href="../xref/ch/qos/logback/classic/pattern/LoggerConverter.html">
    		<code>LoggerConverter</code></a>, the converter underlying the
    		%logger conversion word, extracts the name of the logger from 
    		<code>ILoggingEvent</code> and returns it as a String. It might
    		abbreviate the logger name in the process.</p>
    		
    		<p>Here is a customer converter which returns the time elapsed
    		since its creaton in nanoseconds:</p>
    		
    <em> Example: Sample Converter Example 
    <a href="../xref/chapters/layouts/MySampleConverter.html">
    (src/main/java/chapters/layouts/MySampleConverter.java)</a></em>
    <pre class="prettyprint source">public class MySampleConverter extends ClassicConverter {
    
      long start = System.nanoTime();
    
      <b>@Override</b>
      <b>public String convert(ILoggingEvent event) {</b>
        <b>long nowInNanos = System.nanoTime();</b>
        <b>return Long.toString(nowInNanos-start);</b>
      <b>}</b>
    }</pre>
    
    		<p>This implementation is pretty straightforward. The
    		<code>MySampleConverter</code> class extends
    		<code>ClassicConverter</code>, and implements the
    		<code>convert</code> method which returns the number of
    		nano-seconds elapsed since its creation.
    		</p>
    
        <h4>Step 2</h4>
    
    		<p>In the second step, we must let logback know about the new
    		<code>Converter</code>. For this purpose, we need to declare the
    		new conversion word in the configuration file, as shown below:</p>
    		
    <em> Example: Sample Converter Example (src/main/java/chapters/layouts/mySampleConverterConfig.xml)</em>
     <span class="asGroovy" onclick="return asGroovy('mySampleConverterConfig');">View as .groovy</span>
    <pre id="mySampleConverterConfig" class="prettyprint source">&lt;configuration>
    
      <b>&lt;conversionRule conversionWord="nanos" 
                      converterClass="chapters.layouts.MySampleConverter" /></b>
    	
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        &lt;encoder>
          &lt;pattern><b>%-6nanos</b> [%thread] - %msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="STDOUT" />
      &lt;/root>
    &lt;/configuration></pre>
    
    		<p>Once the new conversion word has been declared in the
    		configuration file, we can refer to it within
    		<code>PatternLayout</code> pattern, as with any other
    		conversion word.</p>
    		
        <p>The command:</p>
    
        <div class="source">java chapters.layouts.SampleLogging src/main/java/chapters/layouts/mySampleConverterConfig.xml </div>
    
        <p>should yield output akin to:</p>
        
        <pre class="source">4868695 [main] DEBUG - Everything's going well
    5758748 [main] ERROR - maybe not quite...</pre>
    
    
    		<p>The reader might want to take a look at other
    		<code>Converter</code> implementations such as
    		<a href="../xref/ch/qos/logback/classic/pattern/MDCConverter.html">
    		<code>MDCConverter</code></a> to learn about more complex
    		behaviours, such as option handling. For creating your own
    		coloring schemes have a look at <a
    		href="../xref/ch/qos/logback/classic/pattern/color/HighlightingCompositeConverter.html"><code>HighlightingCompositeConverter</code></a>.
    		</p>
    
       	
    
        <h2 class="doAnchor" name="ClassicHTMLLayout">HTMLLayout</h2>
    	
    	  <p><a
    	  href="../xref/ch/qos/logback/classic/html/HTMLLayout.html"><code>HTMLLayout</code></a>
    	  (as included in logback-classic) generates logs in HTML
    	  format. <code>HTMLLayout</code> outputs logging events in an HTML
    	  table where each row of the table corresponds to a logging
    	  event.</p>
    		
    		<p>Here is a sample output produced by <code>HTMLLayout</code>
    		using its default CSS stylesheet:</p>
    		<img src="images/chapters/layouts/htmlLayout0.gif" alt="HTML Layout Sample Image"/>
    		
    		<p>The content of table columns are specified with the help of a
    		conversion pattern. See <a
    		href="#ClassicPatternLayout"><code>PatternLayout</code></a> for
    		documentation on conversion patterns. As such, you have full
    		control over the contents and format of the table. You can select
    		and display any combination of converters
    		<code>PatternLayout</code> knows about.
    		</p>
    
    		<p>One notable exception about the use of
    		<code>PatternLayout</code> with <code>HTMLLayout</code> is that
    		conversion specifiers should not be separated by space characters
    		or more generally by literal text. Each specifier found in the
    		pattern will result in a separate column.  Likewise a separate
    		column will be generated for each block of literal text found in
    		the pattern, potentially wasting valuable real-estate on your
    		screen.</p>
         
        <p>Here is simple but functional configuration file illustrating
        the use of <code>HTMLLayout</code>.
        </p>
    
    <em> Example: HTMLLayout Example (src/main/java/chapters/layouts/htmlLayoutConfig1.xml)</em>
    <span class="asGroovy" onclick="return asGroovy('htmlLayoutConfig1');">View as .groovy</span>
    <pre id="htmlLayoutConfig1" class="prettyprint source">&lt;configuration debug="true"&gt;
      &lt;appender name="FILE" class="ch.qos.logback.core.FileAppender"&gt;
        &lt;encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
          &lt;layout class="ch.qos.logback.classic.html.HTMLLayout">
            <b>&lt;pattern&gt;%relative%thread%mdc%level%logger%msg&lt;/pattern&gt;</b>
          &lt;/layout&gt;
        &lt;/encoder>
        &lt;file>test.html&lt;/file&gt;
      &lt;/appender&gt;
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="FILE" />
      &lt;/root>
    &lt;/configuration>
    </pre>
    
       <p>The <a
       href="../xref/chapters/layouts/TrivialMain.html">TrivialMain</a>
       application logs a few messages finishing with an exception. The
       command:</p>
    
       <p class="source">java chapters.layouts.TrivialMain src/main/java/chapters/layouts/htmlLayoutConfig1.xml</p>
    
        <p>will create the file <em>test.html</em> in the current
        folder. The contents of <em>test.html</em> should be similar to:
    		</p>
    		<img src="images/chapters/layouts/htmlLayout1.png" alt="HTML Layout Sample Image"/>
    
        <h3>Stack traces</h3>
    
    		<p> If you use the <em>%em</em> conversion word to display stack
    		traces, a table column will be created to display stack traces. In
    		most cases the column will be empty, wasting screen
    		real-estate. Moreover, printing a stack trace on a separate column
    		does not yield very readable results. Fortunately, the
    		<em>%ex</em> conversion word is not the only way to display stack
    		traces.
    		</p>
    
    		<p>A better solution is available through implementations of
    		<code>IThrowableRenderer</code> interface.  Such an implementation
    		can be assigned to <code>HTMLLayout</code> to manage the display
    		data related to exceptions. By default, a
    		<a href="../xref/ch/qos/logback/classic/html/DefaultThrowableRenderer.html">
    			<code>DefaultThrowableRenderer</code></a> is assigned to each
    			<code>HTMLLayout</code> instance. It writes exceptions on a
    			<em>new table row</em>, along with its stack trace, in an easily
    			readable manner, as shown on the figure above.
    		</p>
    
    		<p>If for some reason, you still wish to use the <em>%ex</em>
    		pattern, then you can specify <a
    		href="../xref/ch/qos/logback/core/html/NOPThrowableRenderer.html">
    		<code>NOPThrowableRenderer</code></a> in the configuration file in
    		order to disable displaying a separate row for the stack trace. We
    		don't have the faintest idea why you would want to do that, but if
    		you wished, you could.
    		</p>
    
        <h3>CSS</h3>
    
        <p>The presentation of the HTML created by <code>HTMLLayout</code>
        is controlled through a Cascading Style Sheet (CSS). In the
        absence of specific instructions, <code>HTMLLayout</code> will
        default to its internal CSS. However, you can instruct
        <code>HTMLLayout</code> to use an external CSS file. For this
        purpose a <code>cssBuilder</code> element can be nested within a
        <code>&lt;layout&gt;</code> element, as shown below.
    		</p>
    
    <pre class="prettyprint source">&lt;layout class="ch.qos.logback.classic.html.HTMLLayout">
      &lt;pattern>%relative...%msg&lt;/pattern>
      &lt;cssBuilder class="ch.qos.logback.classic.html.UrlCssBuilder">
        &lt;!-- url where the css file is located --&gt;
        &lt;url>http://...&lt;/url>
      &lt;/cssBuilder>	
    &lt;/layout></pre>
    
    	
    		<p>The <code>HTMLLayout</code> is often used in conjunction with
    		<code>SMTPAppender</code> so that outgoing email is pleasantly
    		formatted in HTML.
    		</p>
    
    
        <h2 class="doAnchor" name="log4jXMLLayout">Log4j XMLLayout</h2>
    
        <p><a
        href="../xref/ch/qos/logback/classic/log4j/XMLLayout.html">XMLLayout</a>
        (part of logback-classic) generates output in a log4j.dtd
        compliant format to interoperate with tools such as <a
        href="http://logging.apache.org/chainsaw/index.html">Chainsaw</a>
        and <a href="http://vigilog.sourceforge.net/">Vigilog</a> capable
        of processing files generated by <a
        href="http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/XMLLayout.html">log4j's
        XMLLayout</a>.
        </p>
    
    
        <p>As the original XMLLayout in log4j version 1.2.15, XMLLayout in
        logback-classic takes two boolean properties, <span
        class="option">locationInfo</span> and <span
        class="option">properties</span>. Setting <span
        class="option">locationInfo</span> to true enables the inclusion
        of location info (caller data) in the each event. Setting <span
        class="option">properties</span> to true enables the inclusion of
        MDC information. Both options are set to false by default.
        </p>
    
        <p>Here is a sample configuration</p>
    
    <em> Example: Log4jXMLLayout Example (src/main/java/chapters/layouts/log4jXMLLayout.xml)</em>
    <span class="asGroovy" onclick="return asGroovy('log4jXMLLayout');">View as .groovy</span>
        <pre id="log4jXMLLayout" class="prettyprint source">&lt;configuration>
      &lt;appender name="FILE" class="ch.qos.logback.core.FileAppender">
        &lt;file>test.xml&lt;/file>
        &lt;encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
          &lt;layout class="ch.qos.logback.classic.log4j.XMLLayout">
            &lt;locationInfo>true&lt;/locationInfo>
          &lt;/layout>
        &lt;/encoder> 
      &lt;/appender> 
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="FILE" />
      &lt;/root>
    &lt;/configuration> </pre>
        
    		<h1 class="doAnchor" name="logback-access">Logback access</a></h1>
    
    		<p>Most logback-access layouts are mere adaptations of
    		logback-classic layouts. Logback-classic and logback-access
    		modules address different needs, but in general offer comparable
    		functionality.</p>
    		
    		<h2>Writing your own Layout</h2>
    
    		<p>Writing a custom <code>Layout</code> for logback access is
    		nearly identical to its sibling <code>Layout</code> in
    		logback-classic.</p>
    		
    
    		<h3 class="doAnchor" name="AccessPatternLayout">PatternLayout</h3>
    
    		<p><a href="../xref/ch/qos/logback/access/PatternLayout.html">
    		<code>PatternLayout</code></a> in logback-access can be configured
    		in much the same way as its classic counterpart. However it
    		features additional conversion specifiers suited for logging
    		particular bits of information available only in HTTP servlet
    		requests and HTTP servlet responses.
        </p>
    
    		<p>Below is a list of conversion specifiers for 
    		<code>PatternLayout</code> in logback-access.</p>
    		
    		<table  class="bodyTable striped" border="0" cellpadding="8">
          <tr>
            <th align="center">Conversion Word</th>
            <th align="center">Effect</th>
          </tr>
          <tr>
            <td class="word" name="remoteIP">
              <b>a / remoteIP</b>
            </td>
            <td>
              <p>Remote IP address.</p>
            </td>
          </tr>
          <tr>
            <td class="word" name="localIP"><b>A / localIP</b></td>
            <td>
              <p>Local IP address.</p>
            </td>
          </tr>		
          <tr>
            <td class="word" name="bytesSent"><b>b / B / bytesSent</b></td>
            <td>
              <p>
                Response's content length.
              </p>
            </td>
          </tr>				
          <tr>
            <td class="word" name="clientHost"><b>h / clientHost</b></td>
            <td>
              <p>
                Remote host.
              </p>
            </td>
          </tr>
          <tr>
            <td class="word" name="protocol"><b>H / protocol</b></td>
            <td>
              <p>Request protocol.</p>
            </td>
          </tr>
          <tr>
            <td class="word" name="remoteLogName"><b>l</b></td>
            <td>
              <p>
                Remote log name. In logback-access, this converter always
                returns the value "-".
              </p>
            </td>
          </tr>
          
          <tr>
            <td class="word" name="reqParameter"><b>reqParameter{paramName}</b></td>
            <td>
              <p>Parameter of the response.</p>
              <p>This conversion word takes the first option in braces and looks
              for the corresponding parameter in the request.</p>
              <p><b>%reqParameter{input_data}</b> 
              displays the corresponding parameter.</p>
            </td>
          </tr>		
          <tr>
            <td class="word" name="header"><b>i{header} / header{header}</b></td>
            <td>
              <p>Request header.</p>
              <p>This conversion word takes the first option in braces and looks
              for the corresponding header in the request.</p>
              <p><b>%header{Referer}</b> displays the referer of the request.</p>
              <p>
                If no option is specified, it displays every available header.
              </p>
            </td>
          </tr>	
          <tr >
            <td class="word" name="requestMethod"><b>m / requestMethod</b></td>
            <td>
              <p>Request method.</p>
            </td>
          </tr>		
          <tr>
            <td class="word" name="requestURL"><b>r / requestURL</b></td>
            <td>
              <p>
                URL requested.
              </p>
            </td>
          </tr>
          <tr>
            <td class="word" name="statusCode"><b>s / statusCode</b></td>
            <td>
              <p>
                Status code of the request.
              </p>
            </td>
          </tr>		
          <tr>
            <td class="word" name="dateAccess"><b>t / date</b></td>
            <td>
              <p>Outputs the date of the logging event.  The date
              conversion specifier may be followed by a set of braces
              containing a date and time pattern strings used by
              <code>java.text.SimpleDateFormat</code>.  <em>ABSOLUTE</em>,
              <em>DATE</em> or <em>ISO8601</em> are also valid values.
    					</p>
    					<p>For example, <b>%d{HH:mm:ss,SSS}</b>,
    					<b>%d{dd&#160;MMM&#160;yyyy&#160;;HH:mm:ss,SSS}</b> or
    					<b>%d{DATE}</b>.  If no date format specifier is given then
    					ISO8601 format is assumed.
    					</p>
            </td>
          </tr>
          <tr>
            <td class="word" name="httpUser"><b>u / user</b></td>
            <td>
              <p>
                Remote user.
              </p>
            </td>
          </tr>		
          <tr>
            <td class="word" name="requestURI"><b>U / requestURI</b></td>
            <td>
              <p>
                Requested URI.
              </p>
            </td>
          </tr>		
          <tr >
            <td class="word" name="server"><b>v / server</b></td>
            <td>
              <p>Server name.</p>
            </td>
          </tr>
          <tr class="b">
            <td class="word" name="localPort"><b>localPort</b></td>
            <td>
              <p>Local port.</p>
            </td>
          </tr>
          <tr class="a">
            <td class="word" name="reqAttribute"><b>reqAttribute{attributeName}</b></td>
            <td>
              <p>Attribute of the request.</p>
              <p>This conversion word takes the first option in braces and looks
              for the corresponding attribute in the request.</p>
              <p><b>%reqAttribute{SOME_ATTRIBUTE}</b> 
              displays the corresponding attribute.</p>
            </td>
          </tr>
          <tr class="b">
            <td class="word" name="reqCookie"><b>reqCookie{cookie}</b></td>
            <td>
              <p>Request cookie.</p>
              <p>This conversion word takes the first option in braces and looks
              for the corresponding cookie in the request.</p>
              <p><b>%cookie{COOKIE_NAME}</b> displays corresponding cookie.</p>
            </td>
          </tr>
          <tr class="a">
            <td class="word" name="responseHeader"><b>responseHeader{header}</b></td>
            <td>
              <p>
                Header of the response.
              </p>
              <p>This conversion word takes the first option in braces and looks
              for the corresponding header in the response.</p>
              <p><b>%header{Referer}</b> displays the referer of the response.</p>
            </td>
          </tr>
          <tr class="b">
            <td class="word" name="requestContent"><b>requestContent</b></td>
            <td>
              <p>This conversion word displays the content of the request,
              that is the request's <code>InputStream</code>. It is used
              in conjunction with a <a
              href="../xref/ch/qos/logback/access/servlet/TeeFilter.html">
              <code>TeeFilter</code></a>, a
              <code>javax.servlet.Filter</code> that replaces the original
              <code>HttpServletRequest</code> by a <a
              href="../xref/ch/qos/logback/access/servlet/TeeHttpServletRequest.html">
              <code>TeeHttpServletRequest</code></a>. The latter object
              allows access to the request's <code>InputStream</code>
              multiple times without any loss of data.
              </p>
            </td>
          </tr>
          <tr class="a">
            <td class="word" name="fullRequest"><b>fullRequest</b></td>
            <td>
              <p>This converter outputs the data associated with the
              request, including all headers and request contents.
              </p>
            </td>
          </tr>
          <tr class="b">
            <td class="word" name="responseContent"><b>responseContent</b></td>
            <td>
              <p>This conversion word displays the content of the
              response, that is the response's
              <code>InputStream</code>. It is used in conjunction with a
              <a href="../xref/ch/qos/logback/access/servlet/TeeFilter.html">
              <code>TeeFilter</code></a>, a
              <code>javax.servlet.Filter</code> that replaces the original
              <code>HttpServletResponse</code> by a <a
              href="../xref/ch/qos/logback/access/servlet/TeeHttpServletResponse.html">
              <code>TeeHttpServletResponse</code></a>. The latter object
              allows access to the request's <code>InputStream</code>
              multiple times without any loss of data.
              </p>
            </td>
          </tr>
          <tr class="a">
            <td class="word" name="fullResponse"><b>fullResponse</b></td>
            <td>
              <p>This conversion word takes all the available data
              associated with the response, including all headers of the
              response and response contents.
              </p>
            </td>
          </tr>
        </table>
    		
    		<p>Logback access' <code>PatternLayout</code> also recognizes three keywords, which
    		act like shortcuts.</p>
    
        <table  class="bodyTable">
          <tr>
            <th>keyword</th>
            <th>equivalent conversion pattern</th>
          </tr>
          <tr class="a">
            <td><em>common</em> or <em>CLF</em></td>
            <td><em>%h %l %u [%t] "%r" %s %b</em></td>
          </tr>
          <tr class="b">
            <td><em>combined</em></td>
            <td><em>%h %l %u [%t] "%r" %s %b "%i{Referer}" "%i{User-Agent}"</em></td>
          </tr>
    
        </table>
    
     	
    	 	<p>The <em>common</em> keyword corresponds to the pattern <em>'%h %l %u [%t] "%r" %s %b'</em>
    	 	which displays client host, remote log name, user, date, requested URL, status code 
    	 	and response's content length</p>
    	 	
    	 	<p>The <em>combined</em> keyword is a shortcut for <em>'%h %l %u [%t]
    	 	"%r" %s %b "%i{Referer}" "%i{User-Agent}"'</em>. This pattern
    	 	begins much like the <em>common</em> pattern but also displays two
    	 	request headers, namely referer, and user-agent.</p>
    
    		<h3 class="doAnchor" name="AccessHTMLLayout">HTMLLayout</h3>
    		
    		<p>The <a
    		href="../xref/ch/qos/logback/access/html/HTMLLayout.html"><code>HTMLLayout</code></a>
    		class found in logback-access is similar to the <a
    		href="#ClassicHTMLLayout"><code>HTMLLayout</code></a> class from
    		logback-classic.
        </p>
    		
    		<p>By default, it will create a table containing the following data:</p>
    		
    		<ul>
    			<li>Remote IP</li>
    			<li>Date</li>
    			<li>Request URL</li>
    			<li>Status code</li>
    			<li>Content Length</li>
    		</ul>
    		
    		<p>Here is a sample output produced by <code>HTMLLayout</code> in
    		logback-access:</p>
    		<img src="images/chapters/layouts/htmlLayoutAccess.gif" alt="Access HTML Layout Sample Image"/>
    
    		<p>What can be better than a real world example? Our own log4j
    		properties for logback <a
    		href="http://logback.qos.ch/translator/">translator</a> makes use
    		of logback-access to demonstrate live output from
    		<code>RollingFileAppender</code> with <code>HTMLLayout</code>.</p>
    
    
        <p>On every new user request to our <a
        href="http://logback.qos.ch/translator/">translator</a>
        web-application, a new entry will be added to the access logs,
        which you can view by <a
        href="http://logback.qos.ch/translator/logs/access.html">following
        this link</a>.</p>
    
    
        <script src="../templates/footer.js" type="text/javascript"></script>
    </div>
    </body>
    </html>
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/manual/encoders.html�������������������������������������0000644�0001750�0001750�00000025353�11776570371�024345� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Chapter 5: Encoders</title>
        <link rel="stylesheet" type="text/css" href="../css/common.css" />
        <link rel="stylesheet" type="text/css" href="../css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="../css/_print.css" media="print" />
        <link rel="stylesheet" type="text/css" href="../css/prettify.css" media="screen" />
      </head>
      <body onload="prettyPrint(); decorate();">
        <script type="text/javascript">prefix='../';</script>
        <script type="text/javascript" src="../js/prettify.js"></script>
        <script type="text/javascript" src="../templates/header.js" ></script>
        <script type="text/javascript" src="../js/jquery-min.js"></script>
        <script type="text/javascript" src="../js/decorator.js"></script>
        <div id="left">      
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="../templates/left.js" type="text/javascript"></script>
        </div>    
        <div id="right">
          <script src="menu.js" type="text/javascript"></script>
        </div>
    
        <div id="content">
    
        <h1>Chapter 5: Encoders</h1>
    
        <div class="quote">
          <p><b>ACTION THIS DAY</b> Make sure they have all they want on
          extreme priority and report to me that this has been done.
          </p>
          <p>&mdash;CHURCHILL on October 1941 to General Hastings Ismay in
          response to a request for more resources signed by Alan Turing
          and his cryptanalyst colleagues at Bletchley Park</p>
        </div>
    
        <script src="../templates/creative.js" type="text/javascript"></script>
        <script src="../templates/setup.js" type="text/javascript"></script>
    
    
        <h2 class="doAnchor">What is an encoder</h2>
    
        <p>Encoders are responsible for transforming an event into a byte
        array as well as writing out that byte array into an
        <code>OutputStream</code>. Encoders were introduced in logback
        version 0.9.19. In previous versions, most appenders relied on a
        layout to transform an event into a string and write it out using
        a <code>java.io.Writer</code>. In previous versions of logback,
        users would nest a <code>PatternLayout</code> within
        <code>FileAppender</code>. Since logback 0.9.19,
        <code>FileAppender</code> and sub-classes <a
        href="../codes.html#layoutInsteadOfEncoder">expect an encoder and no
        longer take a layout</a>.
        </p>
    
        <p>Why the breaking change?</p>
    
        <p>Layouts, as discussed in detail in the next chapter, are only
        able to transform an event into a String. Moreover, given that a
        layout has no control over when events get written out, layouts
        cannot aggregate events into batches. Contrast this with encoders
        which not only have total control over the format of the bytes
        written out, but also control when (and if) those bytes get written
        out.
        </p>
    
        <p>At the present time, <code>PatternLayoutEncoder</code> is the
        only really useful encoder. It merely wraps a
        <code>PatternLayout</code> which does most of the work. Thus, it
        may seem that encoders do not bring much to the table except
        needless complexity. However, we hope that with the advent of new
        and powerful encoders this impression will change.</p>
    
        <h2 class="doAnchor" name="interface">Encoder interface</h2>
    
        <p>Encoders are responsible for transforming an incoming event
        into a byte array <b>and</b> writing out the resulting byte array
        onto the appropriate <code>OutputStream</code>.  Thus, encoders
        have total control of what and when bytes gets written to the
        <code>OutputStream</code> maintained by the owning appender. Here
        is the <a
        href="../xref/ch/qos/logback/core/encoder/Encoder.html">Encoder
        interface:</a>
       
        </p>
        <pre class="prettyprint source">package ch.qos.logback.core.encoder;
    
    public interface Encoder&lt;E> extends ContextAware, LifeCycle {
    
       /**
       * This method is called when the owning appender starts or whenever output
       * needs to be directed to a new OutputStream, for instance as a result of a
       * rollover.
       */
      void init(OutputStream os) throws IOException;
    
      /**
       * Encode and write an event to the appropriate {@link OutputStream}.
       * Implementations are free to defer writing out of the encoded event and
       * instead write in batches.
       */
      void doEncode(E event) throws IOException;
    
    
      /**
       * This method is called prior to the closing of the underling
       * {@link OutputStream}. Implementations MUST not close the underlying
       * {@link OutputStream} which is the responsibility of the owning appender.
       */
      void close() throws IOException;
    }</pre>
    
        <p>As you can see, the <code>Encoder</code> interface consists of
        few methods, but surprisingly many useful things can be
        accomplished with these methods.
        </p>
    
    
        <h2 class="doAnchor">LayoutWrappingEncoder</h2>
    
        <p>Until logback version 0.9.19, many appenders relied on the
        Layout instances to control the format of log output. As there
        exists substantial amount of code based on the layout interface,
        we needed a way for encoders to inter-operate with layouts. <a
        href="../xref/ch/qos/logback/core/encoder/LayoutWrappingEncoder.html">LayoutWrappingEncoder</a>
        bridges the gap between encoders and layouts. It implements the
        encoder interface and wraps a layout to which it delegates the
        work of transforming an event into string.
        </p>
    
        <p>Below is an excerpt from the <code>LayoutWrappingEncoder</code>
        class illustrating how delegation to the wrapped layout instance
        is done.</p>
    
     <pre class="prettyprint source">package ch.qos.logback.core.encoder;
    
    public class LayoutWrappingEncoder&lt;E> extends EncoderBase&lt;E> {
    
      protected Layout&lt;E> layout;
      private Charset charset;
      private boolean immediateFlush = true;
    
      public void doEncode(E event) throws IOException {
        String txt = layout.doLayout(event);
        outputStream.write(convertToBytes(txt));
        if (immediateFlush)
          outputStream.flush();
      }
    
      private byte[] convertToBytes(String s) {
        if (charset == null) {
          return s.getBytes();
        } else {
          return s.getBytes(charset);
        }
      } 
    }</pre>
    
        <p>The <code>doEncode</code>() method starts by having the wrapped
        layout convert the incoming event into string. The resulting text
        string is converted to bytes according to the charset encoding
        chosen by the user. Those bytes are then written to the
        <code>OutputStream</code> given by the owning appender. By
        default, the <code>OutputStream</code> is immediately flushed,
        unless the <span class="prop">immediateFlush</span> property is
        explicitly set to 'false'.  Setting the <span
        class="prop">immediateFlush</span> property to false can
        significantly improve logging throughput. See
        <code>PatternLayoutEncoder</code> below for sample configuration..
        </p>
        
    
        <h2 class="doAnchor">PatternLayoutEncoder</h2>
    
        <p>Given that <code>PatternLayout</code> is the most commonly used
        layout, logback caters for this common use-case with
        <code>PatternLayoutEncoder</code>, an extension of
        <code>LayoutWrappingEncoder</code> restricted to wrapping
        instances of <code>PatternLayout</code>.
        </p>
    
        <p>As of logback version 0.9.19, whenever a
        <code>FileAppender</code> or one of its sub-classes was configured
        with a <code>PatternLayout</code>, a
        <code>PatternLayoutEncoder</code> must be used instead. This is
        explained in the <a
        href="../codes.html#layoutInsteadOfEncoder">relevant entry in the
        logback error codes</a>.
        </p>
    
         <h4 class="doAnchor" name="immediateFlush"><span class="prop">immediateFlush</span> property</h4>
    
         <p>As a sub-class of <a
         href="../xref/ch/qos/logback/core/encoder/LayoutWrappingEncoder.html"><code>LayoutWrappingEncoder</code></a>,
         <code>PatternLayoutEncoder</code> admits the <span
         class="prop">immediateFlush</span> property. The default value
         for <span class="prop">immediateFlush</span> is 'true'. Immediate
         flushing of the output stream ensures that logging events are
         immediately written to disk and will not be lost in case your
         application exits without properly closing appenders. On the
         other hand, setting this property to 'false' is likely to
         quintuple (your mileage may vary) logging throughput. As
         mentioned previously, if <span class="prop">immediateFlush</span>
         is set to 'false' and if appenders are not closed properly when
         your application exits, then logging events not yet written to
         disk may be lost.
         </p>
    
         <p>Below is a sample configuration for a
         <code>FileAppender</code> containing a
         <code>PatternLayoutEncoder</code> with its <span
         class="prop">immediateFlush</span> property set to 'false'.</p>
    
    <pre class="prettyprint">&lt;appender name="FILE" class="ch.qos.logback.core.FileAppender"> 
      &lt;file>foo.log&lt;/file>
      &lt;encoder>
        &lt;pattern>%d %-5level [%thread] %logger{0}: %msg%n&lt;/pattern>
        &lt;!-- this quadruples logging throughput --&gt;
        <b>&lt;immediateFlush>false&lt;/immediateFlush></b>
      &lt;/encoder> 
    &lt;/appender></pre>
    
    
        <h4 class="doAnchor" name="outputPatternAsHeader">Output pattern
        string as header</h4>
    
        <p>In order to facilitate parsing of log files, logback can insert
        the pattern used for the log output at the top of log files.  This
        feature is <b>disabled</b> by default. It can be enabled by
        setting the <span class="prop">outputPatternAsHeader</span>
        property to 'true' for relevant
        <code>PatternLayoutEncoder</code>. Here is an example:</p>
    
    <pre class="prettyprint">&lt;appender name="FILE" class="ch.qos.logback.core.FileAppender"> 
      &lt;file>foo.log&lt;/file>
      &lt;encoder>
        &lt;pattern>%d %-5level [%thread] %logger{0}: %msg%n&lt;/pattern>
        <b>&lt;outputPatternAsHeader>true&lt;/outputPatternAsHeader></b>
      &lt;/encoder> 
    &lt;/appender></pre>
        
        <p>This will result output akin to the following in the log file:</p>
    
        <pre>#logback.classic pattern: %d [%thread] %-5level %logger{36} - %msg%n
    2012-04-26 14:54:38,461 [main] DEBUG com.foo.App - Hello world
    2012-04-26 14:54:38,461 [main] DEBUG com.foo.App - Hi again
    ...</pre>
    
         <p>The line starting with "#logback.classic pattern" is newly
         inserted pattern line.</p>
    
        
         
    
        <script src="../templates/footer.js" type="text/javascript"></script>
    
        </div>
      </body>
    </html>
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/manual/groovy.html���������������������������������������0000644�0001750�0001750�00000054355�12136177166�024070� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Chapter12: Groovy configuration</title>
        
        <link rel="stylesheet" type="text/css" href="../css/common.css" />
        <link rel="stylesheet" type="text/css" href="../css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="../css/_print.css" media="print" />
        <link rel="stylesheet" type="text/css" href="../css/prettify.css" media="screen" />
    
      </head>
      <body onload="prettyPrint(); decorate();">
    
        <script type="text/javascript">prefix='../'</script>
        <script type="text/javascript" src="../js/prettify.js"></script>
        <script type="text/javascript" src="../js/dsl.js"></script>
        <script type="text/javascript" src="../templates/header.js"></script>
        <script type="text/javascript" src="../js/jquery-min.js"></script>
        <script type="text/javascript" src="../js/decorator.js"></script>
    
        <div id="left">
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="../templates/left.js" type="text/javascript"></script>
        </div>
        <div id="right">
          <script src="menu.js" type="text/javascript"></script>
        </div>
        <div id="content" class="chapter">
          
        <h1>Chapter 12: Groovy Configuration</h1>
          
          <div class="quote">
          <p><em>It is better to be a human being dissatisfied than a pig
          satisfied; better to be a Socrates dissatisfied than a fool
          satisfied. And if the fool or the pig thinks otherwise, it is
          because they have no experience of the better part.
          </em>
          </p>
          <p>&mdash;JOHN STUART MILL, <em>Utilitarianism</em></p>
        </div>
        <script src="../templates/creative.js" type="text/javascript"></script>
    
    
        <p>Domain-specific languages or DSLs are rather pervasive. The
        XML-based logback configuration can be viewed as a DSL
        instance. By the very nature of XML, XML-based configuration files
        are quite verbose and rather bulky. Moreover, a relatively large
        body of code in logback, namely Joran, is dedicated to processing
        these XML-based configuration files. Joran supports nifty features
        such as variable substitution, conditional processing and
        on-the-fly extensibility. However, not only is Joran a complex
        beast, the user-experience it provides can be described as
        unsatisfactory or at the very least unintuitive.
        </p>
    
        <p>The Groovy-based DSL described in this chapter aims to be
        consistent, intuitive, and powerful. Everything you can do using XML in
        configuration files, you can do in Groovy with a much shorter
        syntax. To help you migrate to Groovy style configuration, we have
        developed a <a
        href="http://logback.qos.ch/translator/asGroovy.html">tool to
        automatically migrate your existing <em>logback.xml</em> files to
        <em>logback.groovy</em></a>.
        </p>
    
    
        <h2 class="doAnchor">General philosophy</h2>
        
        <p>As a general rule, <em>logback.groovy</em> files are Groovy
        programs. And since Groovy is a super-set of Java, whatever
        configuration actions you can perform in Java, you can do the same
        within a <em>logback.groovy</em> file. However, since configuring
        logback programmatically using Java syntax can be cumbersome, we
        added a few logback-specific extensions to make your life
        easier. We try hard to limit the number of logback-specific
        syntactic extensions to an absolute minimum. If you are already
        familiar with Groovy, you should be able to read, understand and
        even write your own <em>logback.groovy</em> files with great
        ease. Those unfamiliar with Groovy should still find
        <em>logback.groovy</em> syntax much more comfortable to use than
        <em>logback.xml</em>.
        </p>
    
        <p>Given that <em>logback.groovy</em> files are Groovy programs
        with minimal logback-specific extensions, <em>all</em> the usual
        groovy constructs such as class imports, variable definitions,
        evaluation of $&#123;..&#125; expressions contained in strings
        (GStrings), and if-else statements are available in
        <em>logback.groovy</em> files.</p>
    
        <h2 class="doAnchor">Automatic imports</h2>
    
        <p><span class="label">Since 1.0.10</span> In order to reduce
        unnecessary boilerplace several common types and packages are
        imported automatically.  Thus, as long as you are only configuring
        built-in appenders, layouts etc. you do not need to add the
        corresponding import statement into your script. You will need
        them for types not covered by the default imports, of course.</p>
    
        <p>Here is the list of default imports:</p>
    
        <ul>
          <li><span class="code">import ch.qos.logback.core.*;</span></li>
          <li><span class="code">import ch.qos.logback.core.encoder.*;</span></li>
          <li><span class="code">import ch.qos.logback.core.read.*;</span></li>
          <li><span class="code">import ch.qos.logback.core.rolling.*;</span></li>
          <li><span class="code">import ch.qos.logback.core.status.*;</span></li>
          <li><span class="code">import ch.qos.logback.classic.net.*;</span></li>
          <li><span class="code">import ch.qos.logback.classic.encoder.PatternLayoutEncoder;</span></li>
        </ul>
    
        <p>In addition, all constants in <span
        class="code">ch.qos.logback.classic.Level</span> are statically
        imported as is (uppercase) and as lowercased aliases. It follows
        that your scripts can reference both <em>INFO</em> or
        <em>info</em> without a static import statement.</p>
    
    
        <h2 class="doAnchor" name="sift">SiftingAppender no longer supported</h2>
    
        <p><span class="label">Since version 1.0.12</span>
        <code>SiftingAppender</code> is no longer supported within groovy
        configuration files. However, in case there is demand, it may be
        re-introduced.</p>
    
        <h2 class="doAnchor" name="entensions">Extensions specific to
        <em>logback.groovy</em></h2>
    
        <p><span class="green">Essentially, <em>Logback.groovy</em> syntax
        consists of half a dozen methods described next; in the reverse
        order of their customary appearance. </span>Strictly speaking, the
        order of invocation of these methods does NOT matter, with one
        exception: appenders MUST be defined before they can be attached
        to a logger.</p>
    
        
    
        <!-- ========================================================== -->
    
        <h3> &#8226; <span class="code">root(Level level, List&lt;String> appenderNames = [])</span></h3>
    
        <p>The <code>root</code> method can be used to set the level of
        the root logger. As an optional second argument of type
        <code>List&lt;String></code>, can be used to attach previously
        defined appenders by name. If you do not specify the list of
        appender names, then an empty list is assumed. In Groovy, an empty
        list is denoted by <code>[]</code>.</p>
    
        <p>To set the level of the root logger to WARN, you would write:</p>
    
        <pre class="prettyprint source">root(WARN)</pre>
    
        <p>To set the level of the root logger to INFO, and attach 
        appenders named "CONSOLE" and "FILE" to root, you would write:</p>
    
        <pre class="prettyprint source">root(INFO, ["CONSOLE", "FILE"])</pre>
    
        <p>In the previous example, it is assumed that the appenders named
        "CONSOLE" and "FILE" were already defined. Defining appenders will
        be discussed shortly.
        </p>
    
        <!-- ========================================================== -->
    
        <h3>&#8226; <span class="code">logger(String name, Level level, List&lt;String> appenderNames = [], <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Boolean additivity = null)</span></h3>
    
        <p>The <code>logger()</code> method takes four arguments, of which
        the last two are optional. The first argument is the name of the
        logger to configure. The second argument is the level of the
        designated logger. Setting the level of a logger to
        <code>null</code> forces it to <a
        href="architecture.html#effectiveLevel">inherit its level</a> from
        its nearest ancestor with an assigned level. The third argument of
        type <code>List&lt;String></code> is optional and defaults to an
        empty list if omitted. The appender names in the list are attached
        to the designated logger. The fourth argument of type
        <code>Boolean</code> is also optional and controls the <a
        href="architecture.html#additivity">additivity flag</a>. If
        omitted, it defaults to <code>null</code>.
        </p> 
    
        <p>For example, the following script sets the level of the
        "com.foo" logger to INFO.</p>
    
           <pre class="prettyprint source">logger("com.foo", INFO)</pre>
    
        <p>The next script sets the level of the "com.foo" logger to
        DEBUG, and attaches the appender named "CONSOLE" to it.</p>
    
      <pre class="prettyprint source">logger("com.foo", DEBUG, ["CONSOLE"])</pre>
        
       <p>The next script is similiar to the previous one, except that it
       also sets the the additivity flag of the "com.foo" logger to
       false.</p>
    
      <pre class="prettyprint source">logger("com.foo", DEBUG, ["CONSOLE"], false)</pre>
    
    
        <!-- ========================================================== -->
        <h3>&#8226; <span class="code">appender(String name, Class clazz, Closure closure = null)</span></h3>
    
        <p>The appender method takes the name of the appender being
        configured as its first argument. The second mandatory argument is
        the class of the appender to instantiate. The third argument is a
        closure containing further configuration instructions. If omitted,
        it defaults to null.</p>
    
        <p>Most appenders require properties to be set and sub-components
        to be injected to function properly. Properties are set using the
        '=' operator (assignment). Sub-components are injected by invoking
        a method named after the property and passing that method the
        class to instantiate as an argument. This convention can be
        applied recursively to configure properties as well as
        sub-components of any appender sub-component. This approach is at
        the heart of <em>logback.groovy</em> scripts and is probably the
        only convention that needs learning.</p>
        
        <p>For example, the following script instantiates a
        <code>FileAppender</code> named "FILE", setting its <span
        class="option">file</span> property to "testFile.log" and its
        <span class="option">append</span> property to false. An encoder
        of type <code>PatternLayoutEncoder</code> is injected into the
        appender. The pattern property of the encoder is set to "%level
        %logger - %msg%n". The appender is then attached to the root
        logger.</p>
    
        <pre class="prettyprint source">appender("FILE", FileAppender) {
      file = "testFile.log"
      append = true
      encoder(PatternLayoutEncoder) {
        pattern = "%level %logger - %msg%n"
      }
    }
    
    root(DEBUG, ["FILE"])</pre>
    
        <p>
        </p>
    
        
        <!-- ========================================================== -->        
        <h3>&#8226; <span class="code">timestamp(String datePattern, long timeReference = -1)</span></h3>
    
        <p>The <code>timestamp()</code> method method returns a string
        corresponding to the <code>timeReference</code> parameter
        formatted according to the <code>datePattern</code> parameter. The
        <code>datePattern</code> parameter should follow the conventions
        defined by <a
        href="http://java.sun.com/j2se/1.4.2/docs/api/java/text/SimpleDateFormat.html">SimpleDateFormat</a>. If
        the <code>timeReference</code> value is unspecified, it defaults
        to -1, in which case current time, that is time when the
        configuration file is parsed, is used as the time
        reference. Depending on the circumstances, occasion, you might
        wish to use <code>context.birthTime</code> as the time reference.
        </p>
    
        <p>In the next example, the <code>bySecond</code> variable is
        assigned the current time in the "yyyyMMdd'T'HHmmss" format. The
        "bySecond" variable is then used to define the value of the <span
        class="option">file</span> property.
        </p>
    
    <pre class="prettyprint source"><b>def bySecond = timestamp("yyyyMMdd'T'HHmmss")</b>
    
    appender("FILE", FileAppender) {
      <b>file = "log-${bySecond}.txt"</b>
      encoder(PatternLayoutEncoder) {
        pattern = "%logger{35} - %msg%n"
      }
    }
    root(DEBUG, ["FILE"])</pre>
    
        <!-- ========================================================== -->        
        <h3>&#8226; <span class="code">conversionRule(String conversionWord, Class converterClass)</span></h3>
    
        <p>After creating your own <a
        href="layouts.html#customConversionSpecifier">conversion
        specifier</a>, you need to inform logback of its existence. Here
        is a sample logback.groovy file which instructs logback to use
        MySampleConverter whenever the <code>%sample</code> conversion
        word is encountered.
        </p>
    
        <pre class="prettyprint source">
    import chapters.layouts.MySampleConverter
    
    conversionRule("sample", MySampleConverter)
    appender("STDOUT", ConsoleAppender) {
      encoder(PatternLayoutEncoder) {
        pattern = "%-4relative [%thread] %<b>sample</b> - %msg%n"
      }
    }
    root(DEBUG, ["STDOUT"])</pre>
    
       <!-- ========================================================== -->
       <h3>&#8226; <span class="code">scan(String scanPeriod = null)</span></h3>
    
        <p>Invoking the scan() method instructs logback to periodically
        scan the logback.groovy file for changes. Whenever a change is
        detected, the <em>logback.groovy</em> file is reloaded.</p>
    
        <pre class="prettyprint source">scan()</pre>
    
        <p>By default, the configuration file will be scanned for changes
        once every minute. You can specify a different scanning period by
        passing a "scanPeriod" string value. Values can be specified in
        units of milliseconds, seconds, minutes or hours. Here is an
        example:
        </p>
    
        <pre class="prettyprint source">scan("30 seconds")</pre>
        
        <p>If no unit of time is specified, then the unit of time is
        assumed to be milliseconds, which is usually inappropriate. If you
        change the default scanning period, do not forget to specify a
        time unit. For additional details on how scanning works, please
        refer to the <a href="configuration.html#autoScan">section on
        automatic reloading</a>.
        </p>
        
        <!-- ========================================================== -->
      
        <h3>&#8226; <span class="code">statusListener(Class listenerClass)</span></h3>
    
        <p>You can add a status listener by invoking the
        <code>statusListener</code> method and passing a listener class as
        an argument. Here is an example:</p>
    
        <pre class="prettyprint source">import chapters.layouts.MySampleConverter
    
    <b>// We highly recommended that you always add a status listener just</b>
    <b>// after the last import statement and before all other statements</b>
    <b>statusListener(OnConsoleStatusListener)</b></pre>
     
        <p><a href="configuration.html#statusListener">Status listeners</a> were described in an earlier
        chapter.</p>
    
        <h3>&#8226; <span class="code">jmxConfigurator(String name)</span></h3>
    
        <p>You can register a <a href="jmxConfig.html"><code>JMXConfigurator</code></a>
        MBean with this method. Invoke it without any parameters to use Logback's
        default ObjectName
        (<code>ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator</code>)
        for the registered MBean:</p>
    
        <pre class="prettyprint source">jmxConfigurator()</pre>
    
        <p>To change the value of the <code>Name</code> key to something other than "default",
        simply pass in a different name as the parameter for the <code>jmxConfigurator</code>
        method:</p>
    
        <pre class="prettyprint source">jmxConfigurator('MyName')</pre>
    
        <p>If you want define the ObjectName completely, use the same syntax but
        pass in a valid ObjectName string representation as the parameter:</p>
    
        <pre class="prettyprint source">jmxConfigurator('myApp:type=LoggerManager')</pre>
    
        <p>The method will first attempt to use the parameter as an ObjectName,
        and falls back to treating it as the value for the "Name" key if it doesn't
        represent a valid ObjectName.</p>
    
        <!-- ========================================================== -->
    
        <h2 class="doAnchor" name="internalDSL">Internal DSL, i.e. it's
        all groovy baby!</h2>
    
        <p>The <em>logback.groovy</em> is an internal DSL meaning that its
        contents are executed as a Groovy script. Thus, all the usual
        Groovy constructs such as class imports, GString, variable
        definitions, evaluation of $&#123;..&#125; expressions contained
        within strings (GStrings), if-else statements are all available in
        logback.groovy files. In the following discussion, we will present
        typical uses of these Groovy constructs in <em>logback.groovy</em>
        files.
        </p>
    
    
        <h3 class="doAnchor" name="varedef">Variable definitions and
        GStrings</h3>
    
        <p>You can define variables anywhere within a
        <em>logback.groovy</em> file, then use the variable within a
        GString. Here is an example.</p>
    
        <pre class="prettyprint source">// define the USER_HOME variable setting its value 
    // to that of the "user.home" system property
    <b>def USER_HOME = System.getProperty("user.home")</b>
    
    appender("FILE", FileAppender) {
      // make use of the USER_HOME variable
      <b>file = "${USER_HOME}/myApp.log"</b>
      encoder(PatternLayoutEncoder) {
        pattern = "%msg%n"
      }
    }
    root(DEBUG, ["FILE"])</pre>
    
    
        <h3 class="doAnchor" name="printing">Printing on the console</h3>
    
        <p>You can invoke Groovy's <code>println</code> method to print on
        the console. Here is an example.</p>
    
        <pre class="prettyprint source">def USER_HOME = System.getProperty("user.home");
    <b>println "USER_HOME=${USER_HOME}"</b>
    
    appender("FILE", FileAppender) {
      <b>println "Setting [file] property to [${USER_HOME}/myApp.log]"</b>
      file = "${USER_HOME}/myApp.log"  
      encoder(PatternLayoutEncoder) {
        pattern = "%msg%n"
      }
    }
    root(DEBUG, ["FILE"])</pre>
    
    
       <h3 class="doAnchor" name="automaticallyExported">Automatically
       exported fields</h3>
    
       <h4 class="doAnchor" name="hostname">'hostname' variable</h4>
    
       <p>The 'hostname' variable contains the name of the current
       host. However, due to scoping rules that the authors cannot fully
       explain, the 'hostname' variable is available only at the topmost
       scope but not in nested scopes. The next example should get the
       point across.
       </p>
    
     <pre class="prettyprint source">// will print "hostname is x" where x is the current host's name
    println "Hostname is ${hostname}"
    
    appender("STDOUT", ConsoleAppender) {
      <b>// will print "hostname is null"</b>
      <b>println "Hostname is ${hostname}" </b>
    }</pre>
    
       <p>If you wish to have the hostname variable be seen in all scopes,
       you need to define another variable and assign it the value of
       'hostname' as shown next.</p>
    
     <pre class="prettyprint source">// define HOSTNAME by assigning it hostname
    def HOSTNAME=hostname
    // will print "hostname is x" where x is the current host's name
    println "Hostname is ${HOSTNAME}"
    
    appender("STDOUT", ConsoleAppender) {
      // will print "hostname is x" where x is the current host's name
      println "Hostname is ${HOSTNAME}" 
    }</pre>
    
    
       <h3 class="doAnchor" name="everythingIsContext">Everything is
       context aware with a reference to the current context</h3>
    
       <p>The execution of the <em>logback.groovy</em> script is done
       within the scope of a <a
       href="../xref/ch/qos/logback/core/spi/ContextAware.html">ContextAware</a>
       object. Thus, the current context is always accessible using the
       '<code>context</code>' variable and you can invoke
       <code>addInfo</code>(), <code>addWarn</code>() and
       <code>addError</code>() methods to send status messages to the
       context's <code>StatusManager</code>.</p>
    
       <pre class="prettyprint source">// always a good idea to add an on console status listener
    statusListener(OnConsoleStatusListener)
    
    // set the context's name to wombat
    <b>context.name = "wombat"</b>
    // add a status message regarding context's name
    <b>addInfo("Context name has been set to ${context.name}")</b>
    
    def USER_HOME = System.getProperty("user.home");
    // add a status message regarding USER_HOME
    <b>addInfo("USER_HOME=${USER_HOME}")</b>
    
    appender("FILE", FileAppender) {
      // add a status message regarding the file property
      <b>addInfo("Setting [file] property to [${USER_HOME}/myApp.log]")</b>
      file = "${USER_HOME}/myApp.log"  
      encoder(PatternLayoutEncoder) {
        pattern = "%msg%n"
      }
    }
    root(DEBUG, ["FILE"])</pre>
    
    
       <h3 class="doAnchor">Conditional configuration</h3>
       
       <p>Given that Groovy is a fully-fledged programming language,
       conditional statements allow for a single <em>logback.groovy</em>
       file to adapt to various environments such as development, testing
       or production.</p>
    
       <p>In the next script, a console appender is activated on hosts
       other than pixie or orion, our production machines. Note that the
       output directory of the rolling file appender also depends on the
       host.</p>
       
       <pre class="prettyprint source">// always a good idea to add an on console status listener
    statusListener(OnConsoleStatusListener)
    
    def appenderList = ["ROLLING"]
    def WEBAPP_DIR = "."
    def consoleAppender = true;
    
    // does hostname match pixie or orion?
    if (hostname =~ /pixie|orion/) {
      WEBAPP_DIR = "/opt/myapp"     
      consoleAppender = false   
    } else {
      appenderList.add("CONSOLE")
    }
    
    if (consoleAppender) {
      appender("CONSOLE", ConsoleAppender) {
        encoder(PatternLayoutEncoder) {
          pattern = "%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"
        }
      }
    }
    
    appender("ROLLING", RollingFileAppender) {
      encoder(PatternLayoutEncoder) {
        Pattern = "%d %level %thread %mdc %logger - %m%n"
      }
      rollingPolicy(TimeBasedRollingPolicy) {
        FileNamePattern = "${WEBAPP_DIR}/log/translator-%d{yyyy-MM}.zip"
      }
    }
    
    root(INFO, appenderList)</pre>
    
    
    
    
        <script src="../templates/footer.js" type="text/javascript"></script>
    
        </div>
      </body>
    </html>
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/download.html��������������������������������������������0000644�0001750�0001750�00000013022�12021755022�023041� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Download</title>
        <link rel="stylesheet" type="text/css" href="css/common.css" />
        <link rel="stylesheet" type="text/css" href="css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="css/_print.css" media="print" />
        <link rel="stylesheet" type="text/css" href="css/popup.css" media="screen" />
      </head>
      <body onload="centerPopup(); loadPopup();">
        <script type="text/javascript">prefix='';</script>
         
        <script type="text/javascript" src="http://jqueryjs.googlecode.com/files/jquery-1.2.6.min.js" ></script>   
        <script type="text/javascript" src="js/jquery.cookies.2.2.0.js"></script>
        <script type="text/javascript" src="js/popup.js" ></script>
    
        <script src="templates/header.js" type="text/javascript"></script>
    
        <div id="left">
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="templates/left.js" type="text/javascript"></script>
        </div>
    
        <div id="popupContents">
          <p style="font-size: large; padding-bottom: 5px; ">Would you like to subscribe to the
          QOS.CH announcements mailing list?</p>
    
    
          <p>The list is reserved for announcements related to QOS.CH
          projects such as cal10n, logback, mistletoe and SLF4J.</p>
          <br/>
          <table width="100%">
            <tr>
              <td><a class="popupLink" id="announce">Yes, I'd like to subscribe.</a></td>
              <td><a class="popupLink" id="popupContentsClose">No, thanks.</a></td>
            </tr>
          </table>
        </div>
        <div id="backgroundPopup"></div>
    
    
        <div id="content">
    	
        <h2>Download links</h2>
    
    
    		<p>Logback modules are available as downloads including full
    		source code, class files and documentation.
    		</p>
    
    		<ul>
          <li><a href="dist/logback-${project.version}.zip">logback-${project.version}.zip</a></li>
          <li><a href="dist/logback-${project.version}.tar.gz">logback-${project.version}.tar.gz</a></li>
    		</ul>
    		
    		
        <p>If you wish to download an older version of logback, please
        refer to the <a href="http://logback.qos.ch/dist/">distributions
        directory</a>.</p>
       
       
        <h3>logback-beagle: an Eclipse plug-in for viewing logs</h3>
       
        <p><a href="beagle/index.html"><img style="float:left;
        margin-right: 1em;" src="beagle/images/sailing-ship-32x32.png"
        alt=""/></a>We also offer a console plugin for Eclipse called
        logback-beagle. It allows you to receive logging events in a
        convenient Eclipse view, and offers various convenient features. A
        more precise description for this plug-in along with installation
        instructions can be found in <a
        href="beagle/index.html">logback-beagle user guide</a>.</p>
    
        <hr/>
    
        <h2>Third-party tools, extensions or forks (in chronological
        order)</h2>
    
        <p>If you are the author of a logback-related project and would
        like us to add your project to the list below please drop a line
        on the logback-dev mailing list.</p>
    
    
        <dl>
         
          <!-- ============================================================ -->
          <dt>
            <a href="http://lilith.huxhorn.de">Lilith</a> by Joern Huxhorn
          </dt>
    
          <dd>
            <p>Lilith is a Logging- and AccessEvent viewer for logback.</p> 
          </dd>
    
          <!-- ============================================================ -->
          <dt>
            <a
            href="https://github.com/mojolly/logback-akka">Logback-akka</a>
            by Ivan Porto Carrero.
          </dt>
    
          <dd>
            <p>Consists of several akka-based logback utilities, including
            ActorAppender, HoptoadActorAppender and Logstash redis
            appender.
            </p> 
          </dd>
    
        <!-- ============================================================ -->
          <dt>
            <a
            href="https://github.com/tony19/logback-android">Logback-android</a>
            by Tony Trinh.
          </dt>
    
          <dd>
            <p>Logback-Android brings the power of Logback to Android.
            </p> 
          </dd>
    
    
        <!-- ============================================================ -->
          <dt>
            <a
            href="http://code.google.com/p/simpledb-appender/">
            Simpledb-appender</a> by Gabriel Nell
          </dt>
    
          <dd>
            <p>Logback Appender writing to Amazon SimpleDB. See also <a
            href="http://www.peecho.com/blog/logging-the-cloud-with-simpledb.html">Logging
            the cloud with SimpleDB</a>.</p>
          </dd>
    
    
          <!-- ============================================================ -->
          <dt>
            <a href="http://perf4j.codehaus.org/">Perf4J</a> by Alex
            Devine, Doran Chakraborty et al.
          </dt>
    
          <dd>
            <p>Perf4J is a set of utilities for calculating and displaying
            performance statistics for Java code.</p>
          </dd>
    
    
          <!-- ============================================================ -->
          <dt>
            <a
            href="https://github.com/Moocar/logback-gelf">Logback-gelf</a>
            by Anthony Marcar
          </dt>
    
          <dd>Logback-gelf can log messages to a <a
          href="http://graylog2.org/">Graylog2</a> server via GELF
          messages.
          </dd>
          
        </dl>
    
        <p/>  
    
        
    
      <script src="templates/footer.js" type="text/javascript"></script>
    </div>
    </body>
    </html>
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/css/�����������������������������������������������������0000755�0001750�0001750�00000000000�12203357067�021147� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/css/common.css�������������������������������������������0000644�0001750�0001750�00000011460�11777120446�023157� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������html { 
    /*  padding:0px;
      margin:0px; */
    }
    
    
    a { 
     color: #4183c4; 
     background-color:transparent;
     text-decoration: none; 
    }
    
    #content a:hover {
     text-decoration: underline;
    }
    
    .example {
      width: 90%;
      font-style: italic;
    }
    
    
    div.source {
     margin-top: 1em;
    }
    
    div.breaking {
       border: 1px solid #F44; 
       background-color: #FED; 
       padding-left: 1ex; 
       padding-right: 1ex;
    }
    
    .longline {
      overflow: scroll;
    }
    
    .source, .command, .console { 
      border-top: 1px solid #DDDDDD;
      border-bottom: 1px solid #DDDDDD;
      background: #f5f5f5;
      font-family: Courier, "MS Courier New", Prestige, monospace;
      padding-left: 1ex;
      white-space: pre;
    }
    
    .source {
      padding-bottom: 0.5ex;
      padding-top: 0.5ex;
    }
    
    .command {
      padding-bottom: 0ex;
      padding-top: 0ex;
    }
    
    .console {
    }
    
    pre { 
     padding: 0px;
     margin: 0px; 
     background-color:transparent;
     font-family: Courier, Monaco, Monospace;
    }
    
    .alignright {
     margin-top: 0; 
     text-align: right;
     font-size: 10px;
    }
    
    
    h1, h2, h3, h4 {
      color: #505050;
      padding-top: 0ex; 
      background-color: transparent;
    }
    
    h2 {
      font-weight: 900;
      font-size: x-large;
    }
    
    h3 {
      font-weight: bold;
      font-size: large;
    }
    
    h4 {
      font-weight: bold;
      font-size: medium;
    }
    
    table.footer {
      width: 100%;
    }
    
    .footer {
      color: #564b47;
      background-color: #fff;
      padding:0px;
      border-top:  1px solid #CCCCCC;
      margin-top: 3ex;
    	font-size: smaller;
    }
    
    
    p.menu {
     padding-top: 0px;
     padding-bottom: 0px; 
     margin-top: 0px;
     margin-bottom: 0px;
    }
    
    .small { 
    	font-size: smaller;
    }
    
    .strong, .bold { 
      /*font-size: 13px;*/
      font-weight: bold;
    }
    
    /* ========== body table ============ */
    table.bodyTable {
    	padding: 0px;
    	margin-left: -2px;
    	margin-right: -2px;
    }
    
    table.bodyTable th {
    	color: white;
    	background-color: #bbb;
    	font-weight: bold;
    }
    
    
    table.bodyTable td {
      vertical-align: text-top;
      padding-left: 0.5ex;
      padding-bottom: 0.5ex;
    }
    
    
    /* apply to tr elements of tables which are both bodytable and dark */
    table[class="bodyTable dark"] tr {
    	background-color: #ddd;
    }
    
    /* apply to tr elements of tables which are both bodytable and dark */
    table[class="bodyTable properties"] tr {
    	vertical-align: top;
    }
    
    /* table.bodyTable tr.a { 	background-color: #ddd; } */
    /* table.bodyTable tr.b {	background-color: #eee; } */
    /* table.bodyTable tr.alt {	background-color: #eee;} */
    
    /* we don't want the first p under td to appear indented */
    table.bodyTable tr td p:first-child {
      padding-top: 0px;
      margin-top: 0px;
    }
    
    .striped tr:nth-child(odd) td {
      background-color: #f9f9f9;
    }
    .striped td {
      background-color: #f0f0f0;
    }
    .striped tr:last-child td {
      border-bottom: 1px solid #ddd;
    }
    
    td.word {
      text-align: right;
    }
    
    /* EOF =============== bodyTable =============== */
    
    .author {
    	text-align: left;
    	font-weight: bold;
    }
    
    .definition {
    	padding-left: 5px;
    	padding-right: 5px;
    	margin: 5px 50px 5px 50px;
    	text-align: justify;
    	background-color: #E6E64C;
    }
    
    .deftitle {
    	font-weight: bold;
    }
    
    
    .big {
      font-size: 130%;
    }
    
    
    .green {
    	color: green;
    }
    
    .white_bg {
    	background-color: #FFFFFF;
    }
    
    .lgray_bg {
    	background-color: #EEE;
    }
    
    .blue {
    	color: blue;	
    }
    
    .red {
    	color: red;
    }
    
    .redBold {
    	color: red;
    	font-weight: bold;	
    }
    
    .greenBold {
    	color: green;	
      font-weight: bold;	
    }
    
    .code {
    	font-family: Courier, monospace;
     	color: #666;	
    }
    
    .variable {
    	font-family: Courier, monospace;
      font-style:italic;  
    }
    
    
    
    .attr {
    	font-family: Courier, monospace;
      font-style:italic; 
    
    }
    
    .option, .prop {
      border-top: 1px dotted #BBBBBB;
      border-bottom: 1px dotted #BBBBBB;
      border-left: 1px dotted #AAAAAA;
      border-right: 1px dotted #AAAAAA;
      padding-left: 2px;
      padding-right: 2px;
      font-family: Arial, sans-serif;
    }
    
    /*  background:#FFCC99;	*/
    .highlight {
      width: 18em;
      float: right;	
      display: inline;
      font-size: 110%;
    
      border: 2px solid #711;
      -webkit-border-radius: 4px;
      -moz-border-radius: 4px;
      border-radius: 4px;
      background:#FFE0B0;	
      padding-top: 1ex;
      padding-left: 1ex;
      padding-right: 1ex;
      padding-bottom: 1ex;
      margin-left: 1em;
      margin-right: 0em;
      margin-bottom: 1ex;
    }
    
    .quote {
       text-align: right;
      padding-left: 12em;
    }
    
    /* --------- numbering --------- */
    .autoEx:before {
      counter-increment: example;  /* Add 1 to example */
      content: counter(example)
    }
    
    /** ----------- labels -------- */
    .label {
      padding: 1px 3px 2px;
      font-size: 9.75px;
      font-weight: bold;
      color: #ffffff;
      text-transform: uppercase;
      white-space: nowrap;
      background-color: #bfbfbf;
      -webkit-border-radius: 3px;
      -moz-border-radius: 3px;
      border-radius: 3px;
    }
    
    .label.notice {
      background-color: #62cffc;
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/css/_print.css�������������������������������������������0000644�0001750�0001750�00000000637�11377016712�023162� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
    body {
    	margin: 0px;
    	padding: 100px 0px 2px 0px;
    	line-height: 1.3em;
    	font-size: 12px;
    }
    
    #left, #right, span.asGroovy {
    	width: 0px;
    	height: 0px;
      display: none;
    	visibility:hidden;
    }
    
    #bodyColumn {
    	margin-right: 1.5em;
    	margin-left: 0px; /*was: 197*/
    }
    
    
    table.bodyTable td {
    	vertical-align: text-top;
    }
    
    table.bodyTable th {
    	vertical-align: text-top;
    	text-align:center;
    }
    
    �������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/css/screen.css�������������������������������������������0000644�0001750�0001750�00000011037�12136042147�023135� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������html { 
    /*  padding:0px;
      margin:0px; */
    }
    
    body {
      background-color: #fff;
      font-family: Verdana, Arial, SunSans-Regular, Sans-Serif;
      color: #000;  
      padding: 0px;
      margin: 0px;
      counter-reset: example;  /* Create an example counter scope */
    }
    
    .footer {
      color: #564b47;
      background-color: #fff;
      padding:0px;
      border-top:  1px solid #CCCCCC;
      margin-top: 3ex;
    	font-size: smaller;
    }
    
    #job img {
       border:1px solid #DDDDDD;
    }
    
    #job:hover img {
       border:1px solid #8888EE;
    }
    
    p.menu {
     padding-top: 0px;
     padding-bottom: 0px; 
     margin-top: 0px;
     margin-bottom: 0px;
     font-size: smaller;
    }
    
    
    #leftOld {
      position: absolute;
      font-size: 80%;
      left: 0px;
      width: 15em;
      color: #564b47;
      margin: 4px 0px 0px 4px; 
      padding: 0px;
      border: 1px solid #cccccc;
      background-color: #fff8e8;
      -webkit-border-radius: 3px;
      -moz-border-radius: 3px;
      border-radius: 3px;
    }
    
    #left {
      position: absolute;
      left: 0px;
      width: 15em;
      margin: 4px 0px 0px 4px; 
      padding: 0px;
      font-size: 80%;
      background-color: #ffffff;
    }
    
    .menuGroup {
      border: 1px solid #cccccc;  
      background-color: #fff8e8;
      color: #564b47;
      border: 1px solid #cccccc;
      -webkit-border-radius: 3px;
      -moz-border-radius: 3px;
      border-radius: 3px;
    }
    
    #left a, #right a {
      display: block; 
      width: 95.5%; 
      margin: 0px; 
      padding: 2px; 
      border: solid 1px #fff8e8; 
      color: #0066cc; 
      text-decoration: none;
    }
    
    p.menu_header {
      margin: 0px; 
      padding: 2px;
      font-weight: normal; 
      background-color: #ffd0a0; 
      border-top: solid 1px #CCCCCC;
      border-bottom: solid 1px #CCCCCC;
    }
    
    #left a:hover, #right a:hover {
      border: solid 1px #FFFFFF; 
      background-color: #3333CC; 
      color: #ffffff;
      -webkit-border-radius: 3px;
      -moz-border-radius: 3px;
      border-radius: 3px;
    }
    
    #left div.jobadd {
      font-size: 140%;
      color: #fff;
      margin: 0px;
      padding: 0px;
    
      text-align: center;
      -webkit-border-radius: 3px;
      -moz-border-radius: 3px;
      border-radius: 3px;
    
      background-image: -ms-linear-gradient(bottom right, #FFBB55 0%, #FF8822 100%);
      background-image: -moz-linear-gradient(bottom right, #FFBB55 0%, #FF8822 100%);
      background-image: -o-linear-gradient(bottom right, #FFBB55 0%, #FF8822 100%);
      background-image: -webkit-gradient(linear, right bottom, left top, color-stop(0, #FFBB55), color-stop(1, #FF8822));
      background-image: -webkit-linear-gradient(bottom right, #FFBB55 0%, #FF8822 100%);
      background-image: linear-gradient(to top left, #FFBB55 0%, #FF8822 100%);
    }
    
    #left div.jobadd a, div.jobadd a:hover {
      background-color: transparent;
      color: #fff;
      border-width: 0px;	
    }
    
    /* ------------------------------------------- */
    
    #right {
      position: absolute;
      right: 0px;        
      width: 12em;
      color: #564b47;
      margin: 4px 4px 0px 0px; 
      padding: 0px;
      background-color: #ffffff;    
      border: 1px solid #cccccc;
      font-size: 80%;
    }
    
    #left img {
    	display: block;
    	margin: 20px 0 20px 17px;
    	border: none;
    	width: 90px;
    	height: 30px;
    }
    
    #headerLine {
      background-color:#FFD0A0;
      border:1px solid #CCCCCC;
      font-size:small;
      margin:0 4px;
      padding:3px 10px;
    }
    
    #content {
      min-width:50em;
      margin: 0px 15em 0px 15em;
      padding: 0px;
      background-color: #ffffff;  
      line-height: 130%;
    }
    
    #content img {
    	border:none;
    	margin-left: auto;
    	margin-right: auto;
    	display: block;
    }
    
    span.asGroovy {
       background: #fff; 
       color: #0079C5;   
       font-family: "Comic Sans MS", sans-serif;
       white-space: nowrap;
       font-size: 80%;
    
       border-top:    2px solid #DDD;  
       border-left:   2px solid #DDD;  
       border-right:  2px solid #888;  
       border-bottom: 2px solid #888;    
       padding: 0px 1em 0px 1em;
       margin:  -4px 4px 0 4px; 
       float: right;
    }
     
    span.asGroovy:hover {
       background: #E0E0EF;
       cursor: pointer;
    }
    
    /* ------------------------------------ */
    
    .anchor { display:none; }
    
    h1 .anchor:before {content:url(anchor24.png);}
    h2 .anchor:before {content:url(anchor20.png);}
    h3 .anchor:before {content:url(anchor16.png);}
    h4 .anchor:before {content:url(anchor12.png);}
    td .anchor:before {content:url(anchor12.png);}
    
    h1:hover .anchor { margin-left: -24px; }
    h2:hover .anchor { margin-left: -20px; }
    h3:hover .anchor { margin-left: -16px; }
    h4:hover .anchor { margin-left: -12px; }
    td:hover .anchor { margin-left: -12px; }
    
    h1:hover .anchor, 
    h2:hover .anchor,  
    h3:hover .anchor, 
    h4:hover .anchor,
    td:hover .anchor {
      display: inline-block;
      text-decoration: none;
    }
    
    
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/css/popup.css��������������������������������������������0000644�0001750�0001750�00000002441�11377016712�023025� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
    /* =========== popup ================== */
    #backgroundPopup {  
      display:none;  
      position:fixed;  
      _position:absolute; /* hack for internet explorer 6*/  
      height:100%;  
      width:100%;  
      top:0;  
      left:0;  
      background:#000000;  
      border:1px solid #cecece;  
      z-index:1;  
    } 
    
    #popupContents {  
      display:none;  
      position:fixed;  
      _position:absolute; /* hack for internet explorer 6*/  
      height: 150px;  
      width:  408px;   
      background:#FFFFFF;  
      border: 2px solid #cecece;  
      z-index:2;  
      padding-left: 1ex;   
      font-size:13px;  
    } 
    
    #popupContents p {
     margin: 0px;
    }
    #popupContents h3 {
     margin: 0px;
    }
    
    #popupContactClose {  
      font-size:14px;  
      line-height:14px;  
      right:6px;  
      top:4px;  
      position:absolute;  
      color:#6fa5fd;  
      font-weight:700;  
      display:block;  
    } 
    
    a.popupLink {
      background: #FFF; 
      color: #0079C5;   
      font-family: "Comic Sans MS", sans-serif;
      white-space: nowrap;
      font-size: 14px;
      font-weight: bold;
    
      border-top:    2px solid #DDD;  
      border-left:   2px solid #DDD;  
      border-right:  2px solid #888;  
      border-bottom: 2px solid #888;    
      padding: 0px 1em 0px 1em;
      margin:  0px 0px 3px 0px; 
    }
    
    a.popupLink:hover {
       background: #E0E0EF;
       cursor: pointer;
    }
    
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/css/prettify.css�����������������������������������������0000644�0001750�0001750�00000001356�11760202323�023523� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Pretty printing styles. Used with prettify.js. */
    
    .str { color: #080; }
    .kwd { color: #008; }
    .com { color: #800; }
    .typ { color: #606; }
    .lit { color: #066; }
    .pun { color: #660; }
    .pln { color: #000; }
    .tag { color: #008; }
    .atn { color: #606; }
    .atv { color: #080; }
    .dec { color: #606; }
    pre.prettyprint { padding: 2px; border-top: 1px solid #888; border-bottom: 1px solid #888;}
    
    @media print {
      .str { color: #060; }
      .kwd { color: #006; font-weight: bold; }
      .com { color: #600; font-style: italic; }
      .typ { color: #404; font-weight: bold; }
      .lit { color: #044; }
      .pun { color: #440; }
      .pln { color: #000; }
      .tag { color: #006; font-weight: bold; }
      .atn { color: #404; }
      .atv { color: #060; }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/job_fr.html����������������������������������������������0000644�0001750�0001750�00000007234�12051416453�022510� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=utf-8" />
        <title>Logback Home</title>
        <link rel="stylesheet" type="text/css" href="css/common.css" />
        <link rel="stylesheet" type="text/css" href="css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="css/_print.css" media="print" />
    
        <script type="text/javascript">
    
          var _gaq = _gaq || [];
          _gaq.push(['_setAccount', 'UA-9228687-3']);
          _gaq.push(['_trackPageview']);
    
          (function() {
          var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
          ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
          var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
          })();
        </script>
    
      </head>
      <body>
        <script type="text/javascript">prefix='';</script>
        <script src="templates/header.js" type="text/javascript"></script>
        <div id="left">
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="templates/left.js" type="text/javascript"></script>
        </div>
    
        <div id="content">
    		
    
    		<h2>Ing&eacute;nieur Informatique</h2>
    
        <p>QoS.ch, ou Quality Open Software, est une soci&eacute;t&eacute;
        de conception et de d&eacute;veloppement informatique bas&eacute;e
        &agrave; Lausanne - Suisse.</p>
        
        <p>Nous avons une grande exp&eacute;rience dans la
        r&eacute;alisation de logiciels d'entreprise en langage Java. Nous
        sommes &eacute;galement fondateurs ou contributeurs actifs dans
        plusieurs projets open source, notamment cal10n, logback, log4j,
        mistletoe et SLF4J.
        </p>
    
        
        <p>Afin de compl&eacute;ter notre &eacute;quipe de
        d&eacute;veloppeurs pour la r&eacute;alisation de divers projets,
        autant open source que pour r&eacute;pondre aux demandes de nos
        clients, nous recherchons un ing&eacute;nieur informatique ayant
        une excellente capacit&eacute; de d&eacute;veloppement
        logiciel. 
        </p>
    
        <h3>Votre profil:</h3>
    
        <ul>
          <li>Formation universitaire ou jug&eacute;e
          &eacute;quivalente</li> 
    
          <li>Grande capacit&eacute; d'analyse et
          d'apprentissage</li> 
    
          <li>Capacit&eacute; de r&eacute;daction en anglais </li> 
    
          <li>Autonome et enthousiaste dans le d&eacute;veloppement</li>
          
    
          <li>Int&eacute;r&ecirc;t marqu&eacute; pour le
          d&eacute;veloppement collaboratif</li>
          </ul>
        
    
        <h3>Connaissances souhaitables:</h3>
    
        <ul>
          <li>Bonne exp&eacute;rience de programmation orient&eacute;
          objet, de pr&eacute;f&eacute;rence Java</li>
    
          <li>Connaissances de d&eacute;veloppement Web avec des outils
          tels que GWT, Struts, Vaadin, ou Wicket, </li>
    
          <li>Affinit&eacute; pour les m&eacute;thodologies agiles, en
          particulier le TDD</li>
        </ul>
    
    
        <p>Vous correspondez &agrave; ces crit&egrave;res et &ecirc;tes
        d&eacute;sireux de mettre &agrave; profit vos aptitudes, nous vous
        proposons un environnement dynamique et &eacute;volutif avec des
        conditions avantageuses.</p>
    
        <p>Merci de nous adresser votre dossier de candidature par email
        &agrave; l'adresse hr@qos.ch. Si possible joignez une liste des
        projets auxquels vous avez particip&eacute;.
        </p>
    
        <script src="templates/footer.js" type="text/javascript"></script>	
        </div>
      </body>
    </html>��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/license.html���������������������������������������������0000644�0001750�0001750�00000006401�11725600422�022662� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>License</title>
        <link rel="stylesheet" type="text/css" href="css/common.css" />
        <link rel="stylesheet" type="text/css" href="css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="css/_print.css" media="print" />
        
      </head>
      <body>
        <script type="text/javascript">prefix='';</script>
    
        <script src="templates/header.js" type="text/javascript"></script>
        <div id="left">
          <script src="templates/left.js" type="text/javascript"></script>
        </div>
        <div id="content">
          
        <div class="section">
          <h2>Logback License</h2>
        </div>
      
    
        <p>As of release 0.9.18, logback source code and binaries are
        dual-licensed under the EPL v1.0 and the LGPL 2.1, or more
        formally:</p>
    
        <p class="source">Logback: the reliable, generic, fast and flexible logging framework.
    Copyright (C) 1999-2012, QOS.ch. All rights reserved. 
    
    This program and the accompanying materials are dual-licensed under
    either the terms of the <a href="http://www.eclipse.org/legal/epl-v10.html">Eclipse Public License v1.0</a> as published by
    the Eclipse Foundation
     
      or (per the licensee's choosing)
     
    under the terms of the GNU <a href="http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html">Lesser General Public License version 2.1</a>
    as published by the Free Software Foundation.</p>
    
        <!-- =========================================== -->
        
        <p>The EPL/LGPL dual-license serves several purposes. The LGPL
        license ensures <em>continuity</em> in terms of licensing of the
        logback project. Prior to version 0.9.18, logback was licensed
        (exclusively) under the LGPL v2.1.  Moreover, since the EPL is
        deemed <a
        href="http://www.fsf.org/licensing/licenses/index_htm">incompatible</a>
        by the Free Software Foundation, the LGPL will allow various
        licensees, in particular software distributors who may be already
        bound by the terms of the GPL or the LGPL, to distribute our
        software.
        </p>
    
        <p>On the other hand, the EPL license will placate organizations
        which refuse certain restrictions imposed by the LGPL.
        </p>
        
        <p>Please note that logback-classic is intended to be used behind
        the SLF4J API, which is licensed under the <a
        href="http://www.slf4j.org/license.html">MIT license</a>.
        </p>
    
        <p>If you wish to make a significant contribution to the logback
        project, you are invited to file a <a href="cla.txt">Contributor
        License Agreement</a>. The purpose of this agreement is to
        formalize the terms of your contribution and to protect the
        project in case of litigation.
        </p>
    
        <p>Upon request, we may exempt open-source projects from LGPL and
        EPL's reciprocity clauses so that the said projects can develop
        logback extensions under the license of their choice. Exemptions
        are granted on a case by case basis.</p>
        
    <script src="templates/footer.js" type="text/javascript"></script>
    </div>
    </body>
    </html>
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/bridge.html����������������������������������������������0000644�0001750�0001750�00000002141�11377016712�022477� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/2000/REC-xhtml1-20000126/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
    <title>Log4j Bridge</title>
    
        <link rel="stylesheet" type="text/css" href="css/common.css" />
        <link rel="stylesheet" type="text/css" href="css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="css/_print.css" media="print" />
    
    
    </head>
    <body>
    	<script>
    prefix='';	
    </script>
    
    <script src="templates/header.js"></script>
    <div id="left">
      <script src="templates/left.js"></script>
    </div>
    <div id="right">
      <script src="templates/right.js"></script>
    </div>
    <div id="content">
    	
        <h2>Log4j bridge</h2>
        
        <p>This module has migrated into the SLF4J project, its original
        home. It has also been renamed as <a
        href="http://www.slf4j.org/legacy.html#log4j-over-slf4j">log4j-over-slf4j</a>.
        </p>
    	
    	
    <script src="templates/footer.js"></script>
    </div>
    </body>
    </html>
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/pages/documentation.html���������������������������������������0000644�0001750�0001750�00000012453�12143151241�024110� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Documentation</title>
        <link rel="stylesheet" type="text/css" href="css/common.css" />
        <link rel="stylesheet" type="text/css" href="css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="css/_print.css" media="print" />
      </head>
      <body>
    	<script type="text/javascript">prefix='';</script>
    
      <script src="templates/header.js" type="text/javascript"></script>
      <div id="left">
        <noscript>Please turn on Javascript to view this menu</noscript>
        <script src="templates/left.js" type="text/javascript"></script>
      </div>
      
      <div id="content">
      
        <h2>Logback documentation</h2>
    
    		<p>Below is a list of logback-related documentation currently
    		available.</p>
    
    		<ul>     
          <li><a href="manual/index.html"><b>The logback manual</b></a></li>
    
          <li><a href="reasonsToSwitch.html">Reasons to switch to logback
          from log4j</a></li>
    
    			<li>
    				<a href="access.html">An introduction to logback-access for Jetty
    				and Tomcat</a>
    			</li>
    
          <li><a href="recipes/index.html">Real-world inspired recipes</a></li>
    
          <li>
          	<a href="faq.html">A Frequently Asked Questions list (FAQ)</a>
          </li>
    
            <li>
          	<a href="codes.html">Logback error codes and their meanings</a>
          </li>
    
          <li>
          	<a href="dependencies.html">Dependencies per module</a>
          </li>
              
          <li>
            <a href="demo.html">Walk-through logback-demo web app</a>
          </li>    
          <li>
            <a href="beagle/index.html">Logback-beagle: eclipse plug-in for viewing logs</a>
          </li>    
    		</ul>
    		
    		<p>Source code related documentation:</p>
    		
    		<ul>
    			<li>
    				<a href="http://logback.qos.ch/apidocs/index.html"><b>Javadoc</b></a>
    			</li>
    			<li>
    				<a href="http://logback.qos.ch/xref/index.html">Source code</a>
    			</li>
    			<li>
    				<a href="http://logback.qos.ch/xref-test/index.html">Test classes source code</a>
    			</li>
    		</ul>
    		
        <h2>Articles and Presentations</h2>
    
        <!-- ordered by val -->
        <ul>
          <li><a
          href="https://wiki.base22.com/display/btg/How+to+setup+SLF4J+and+LOGBack+in+a+web+app+-+fast">How
          to setup SLF4J and logback in a web app - fast</a> by Cody Burleson
          </li>
         
          <li>
            <a
            href="http://wiki.eclipse.org/Jetty/Tutorial/Sifting_Logs_with_Logback">Jetty/Tutorial/Sifting
            Logs with Logback</a> by Shirly Dekker Boulay
          </li>
          <li>
            <a
            href="http://gordondickens.com/wordpress/2012/07/03/enterprise-spring-best-practices-part-1-project-config/">
              Enterprise Spring Best Practices - Part 1 - Project Config
            </a> by Gordon Dickens
          </li>
    
          <li>
            <a
            href="http://nurkiewicz.blogspot.ch/2013/04/siftingappender-logging-different.html">SiftingAppender:
            logging different threads to different log files</a> by Tomasz
            Nurkiewicz
          </li>
    
          <li>
            <a
            href="http://maciejwalkowiak.pl/blog/2012/04/03/application-errors-notification-with-logback/">Application
            errors notification with Logback</a> by Maciej Walkowiak
          </li>
          <li><a
          href="http://webtide.intalio.com/2011/08/sifting-logs-in-jetty-with-logback/">Sifting
          Logs in Jetty with Logback</a> by Joakim Erdfelt
          </li>
    
          <li><a
          href="http://www.nullin.com/2010/07/28/logging-tests-to-separate-files/">Logging
          tests to separate files</a> by Nalin Makar</li>
    
       
          <li><a href="logback.ppt">Logback project</a>, by Ceki
          G&#252;lc&#252; and S&eacute;bastien Pennec.
          </li>
    
          <li><a
          href="http://beta.parleys.com/#id=1701&st=5&sl=1"><b>Devoxx-2009
          video presentation</b></a>, by C. G&#252;lc&#252;
          </li>
    
          <li><a href="http://www.infoq.com/news/2007/08/logback">Logback:
          Evolving Java Logging</a> by Geoffrey Wiseman
          </li>
    
          <li><a
          href="http://ekkes-corner.blogspot.com/2008/10/index-blogseries-logging-in-osgi.html">Logging
          in OSGI Enterprise Applications</a>, by Ekkehard Gentz
          </li>
    
          <li><a
          href="http://blog.kornr.net/index.php/2008/12/09/understanding-the-osgi-logging-service">Understanding
          the OSGI logging service</a> by Nogunner</li>
    
          <li><a href="http://code.oixx.se/#post0">Logback in RCP
          application</a> by David Virdefors
    
          </li>
        </ul>
    
        <h4>In french</h4>
    
        <ul>
          <li><a
          href="http://www.insideit.fr/post/2009/11/23/SLF4J-LOGBack">SLF4J
          &amp; LOGBack : simplifiez-vous les logs</a> by Ludovic Meurillon
          </li>
    
    
          <li><a
          href="http://blog.xebia.fr/2010/07/07/java-en-production-les-fichiers-de-logs/">Java
          en Production - Les fichiers de logs</a> by Cyrille Le Clerc
          </li>
    
          <li>
          <a
          href="http://blog.courtine.org/2010/09/13/logback-ou-log4j/">Logback
          ou Log4J?</a> by Benoit Courtine
          </li>
    
        </ul>
    
        <script src="templates/footer.js" type="text/javascript"></script>
    </div>
    </body>
    </html>
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/�����������������������������������������������������0000755�0001750�0001750�00000000000�12203357067�021272� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/beagle/����������������������������������������������0000755�0001750�0001750�00000000000�11777771475�022533� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/beagle/images/���������������������������������������0000755�0001750�0001750�00000000000�12203357067�023756� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/beagle/images/beagleView0.png������������������������0000644�0001750�0001750�00000004055�11777642343�026633� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR������A���ٵ8]���sRGB����gAMA��a���	pHYs����od��IDATx^kLWG4i&KhjUTJE@㣨Ե
    TH+E]Z>X*A&ܙ;̲NN&g{͹s
     c`_v젺hTW�
    젺0x?G젺lEk`f)�MlXh~QFMj182J7R =Oeut{GuS)Lz7>НN7Ix)tkRS[b57,3n3U2NTl[f2:�mo!5u7[ZHCȇYmJ˩8)LC6]^[&X�M,sWwǠ`Ap!OuLqH꥘7ƽ	�Ŋ\SjpK�L+%ˑX+:0QElX_2Q!)R�]9pg3g)_pydjil^-4tdWTS�xWCi&io?(0W|RM3cny�pҞ>)]`o-l>6h!*rNHtmu{�vBc]`b])\"6Vc?r]rW0GC2I:=�
    ؄3(x]t%@Z�\k;d}Q5׶s1:
     �&ޕ%hކ*7hEhYɉQl-k:)l7x0K
    QAt1W$g|;İDtڱ%CQ{Gw}%*z_ٲ-1*7HрEP.�.6ﷻLWۉ
    w>`<Ἵ!,BKSb'8v}T!8ώlO\mD{]o\1J8Ufav\B=�PP+6ЄR]j@NlPؼ`*Jpctc\M>
    `88hjSN7/B?e_:ȎeݯWKCM#b�ĉzpDmVꖬ.B#cn]֬<�~sWzs[V~"R?Jx/.H*�pCΘj`>m>p7JW+I=Js0`kyi,!wF26ĉ(=(Bőd)68tM^�dp.qLKQ)]0`XǸ/6utdn	kWY�-.KvuDR]fh+[aON	G؛ƒC]QqXy!E*C㏀p+\g]lm'=h܆jXp*nb-XvVKqo-Uڔ<p_՜R2KPr\"aqΙd|inxVEq竰Q7鮧ɳ3LC{ޠ&/dLW@bC,O>A҃jaL6_mtHX9wi喲祿Vɂ	[ilX-Ab`MY(ɞcņq;O,xLF<N~A5I7`Hc2d%tDrpJCaVi5u--o	0_pњXG҈<[NCTJYch:`)	{zWxI!\<
    C8x<ϘÄ
    ?Ba<i`_::::::::rX����IENDB`�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/beagle/images/nebulaFeature.png����������������������0000644�0001750�0001750�00000126550�12021755022�027246� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR��t�����z���sRGB����gAMA��a���	pHYs����od��IDATx^wǕ&cf\˨̜#yl=VqMuu[rnղ],,rSɂLQ(UA-Ip7pL$X"HȌ-wBT"3_,_ܛq@�� f.U0\'KnZ@aAd.#xBL ���D|Dw|97Ry~43@	��@^ri3	ARؼJ*Z	u�@��B@O7}_|l?PjA@�� PkHr]?-gGofS4tLթL<}K/S81v}іw𫓃Gr?y ZL�@�r;s@>č PLADq9JmVP W
     Wt? ��er%ּw@2Ѓ[Ay
    h9
    ,+RaZtrͽźŗr+i*G((_B#XPd"WR@��#`+)Ħw_ſ\I%~5TXAd+J&"kUgּɢ/{2@��/Jrj+Kr2\rrȦ>PVƮ|
    h14׈,%=^zɫ)2@�� Pt͕Q	~,+WiA)40+ȕ7Ts9tR41f7VYfjc:w2۔bǙ20Uza�/ZQɒB}!C �$>r*)V(2,6=M\s+i{$Έ82Ѩ*Vt}EqD;Nƻ`j%
    .\+qQRj(
    #59Pi �@.-)5\Ş&Ss-	r}͡*432IňH;ʍkF:%1kDpM((S,
    ꫂ{Š@��Uk.Hs5vm\A꽫nI!Wgd~,Xm8bۄWq
    ^,utdTXa%K:rk*@��R
    5wn
    Mw WJ*\t67,C<\=k=cr)T+:W ؕtVc9*5y<Pw �@Qkq?!rCmi/:8҈s'ȯ/63rr*:dD޽RaD\k(!w;udv1d�X{r%S\ 71;isH>)#Th;*FLkSsuEI$bsWwnt2߹*:(To4cSvƶQa ��'WuC߹}r~
    GG(Ohg'4i<ȕ|ҥ\gŸkq �@	0ȕRRT9U<J1)[+DM/N߽6O'�r-a'@@�� P\Ifa\/8%@rrg'9SGB*ZFGn@�� PZFFF%s2\d
    a&,\98DkSIO*ȵM܁��@Jj Ng1IsN$WbVAK\YAnh��C@-L/A/9:%JL%p@rCȵ|퍒��@J|)F&%J7Y?~Ax$' 2/�@��2#gD£YbJN5EAp*OV&TaAcG<Dk �@quyyiyDu>[tX`)pJNiy| W3}"r-n#7 ��(S,vQhܵ92gdzZ QM
    BTUqP fGJr\	P�@�Fg
    O\"S޺xnh	AįJW
    N*޶_
    U "60@��r" րVJoXq
    
    +{~}
    *N\R멂S*vKf\mQ�@�bV_I'~}2;<;B3混onƿ{bhd&_ilj$
    WaZ&G@�� PR"f
    ݻ~H{u`OG.\w`Ɵ`oPO%
    %ItPXE[Y<r-i#s ��(5SbV
    `+!<smIk{=>{s祇z^LLYhx*UpAYMlkX)]@OCwUL2Z\x )PU}eċCx-&R"V T@޳
    bWIsǂ)f%r7I6ɡ+d6ؔDJ9Uj-#ĪOxIȕO+pW0@I,LDMYhJ_PH@ya&GzckJ52ϝu{V؄*]v_iS1%$w/8æ=o:Pw.W%̤+ 0h^l%de>%ϭ,s_VPE� C 2Eq
    J\
    U0+-ݧ]ě~.ٖ'gGfsConH.٧8>nZ~,ٸō\#/H>r"[#ZI{G˖nqSMEI:	ftQKrzFHýv"LtQr"`\mÍ W̿@`!֎KDg~mMaJ#rf5}A’KwH{@SqA_;tO(mZ.%_eSx\2
    _N̤N6%MI_mב<{ZYF\zg+[$SC|DEYfB_hx'4+l/[f<ڱfQ{tz:Pޗ)Չ�kI*}KC}g_n}h=_Μ9q}o5X*D?_^t!啌dIj-Ʒ7ӿ~R\O_Ng+M
    t!R*sKPF :#WƞjfbSNXLO
    (Nj"1=%"xV$1CޚvTrkuN
    &L&dpX޾}\ODJ(U*qgKKKwɄK+.ALAv $$6P邜`Nد~}=$Zq-uя?LΕ>;R*TkL2q.	7b!V),x,#٦Xt)2UvQ\cbmar-@u"me"-|_
    HvZW:{jKDg;|zwOK'KP7קF7 WfauʙyNoRkp$ڌ5z>ʈ#*nK({8#Ⱥ&,,:fwW<A35QF⢓V'Il(4	gU��X=+1+}Jav}lC;?rVH&_
    t!ݤS#Art6Dc_xoIoorM撊l2J;i2e<faSi{"ta
    x$~_RWfɓ##M:ld8Y;yRI1_h2:ܵDuc.2\H;؜
    vr�Տ@D=Dw>]w>pkSK(SRX[&uȕ(^R ~7ش%r}?_>ȗͅ)
    /L ޕal.0\2%!qL �V"WO"N2R DԊtMHrS#D+uC/i:ÿσ\WtU̲8W� Pd"rc~ڔ$m@۔Hs=}=+m!3m8,LbB+7h73\ܤNFI PI;WM:7˳3As!
    kHGW+m3ZRsi+yMwO7ѧ;fi/#a2N|C]%QE@�� vnJ?Nzg9!fpvdVzJJcIl?Fلz\VJrɓ85uwd� PM#s+TTI`‘CĬ}4QC.J<J\9[)q01+@bN
    &|pؗX>%B6	͵d@��&:RJZ%fU=
    dnsB+AĬĩ;N•6	t8BDAI᏿,\_;ۃ-T2t_|j01`Vk\L
    rE7@��D@v,e]DGWGFF)ц1,&!P[n,щK@>a
    ta+AS U0U|S=	R ��G@H[J)HfbVRNbȕv_JG}6Jf)=Mu,%K}Y?u71+鬁5X(S;W] ��Jy3P[M%\*v$V0KGuda6ҒΪ)SLt&	��i擻'+Yb҇f+ѪN?Hwxh(99}فIav`q<� �P^stia6a:@V2:\7cN'&�@FЪ8䚭i��@@ W2~IVa6Uv@;g1G}s$ǿYƭE0aHaTڧ
    \A��@ |WįOR qDJ͕7KV:\dV\
    k,pׁ@�� CNΉ;ɺܭ[]D\Qt0*_9ھD:u?8i||xxR:	C1y'"^q-��@ 0ơQzJar
    y@,{jV<8J}6CP@C	
    N;q㷓7>@fa� �&Z|;9"95i/1%%ɲDFc
    ~+	~J;R+U+umC� PkV	*<
    K[b>z,v4KmDE0ۇRJهS,:�X.&A(~zwQ`_nJnr]KAl[mдf{ *�AY}Jc27 Od`p
    !T	� �8YA@�� �UV\u/@�� �@]і� ��� ��(* ע‰̀��@�́\��@�kEv@�� �@@�� ��ȵȀ"; ��� W ���EF�Zd@�@��+��@��"#�r-2� ��}�� �@�Pd��@�>���@\(@�� �rE�@�� Pd@E ��Xz֣'}o/�@�AL9SO}w
    BbM\? ��ȏ�͙	?^ش_\Z?>@P$Z!]	1��@!$'|rzzzaaQ	:!��!$W2ʺ5:@P\A)D@�,uqq֚ 9z犁��!@r
    \g]k9^##~vAI2%g&Sydupeu92.aaUH_t"ph3
    Xr%w{]F|B̿S\\xA^VjEYyuݺu|T'rRLO%O<g䶲+KU9N"\T/*g$@<oLg+@Aʐ^)xե}Jynuuɞ>vf3&Vgb<1mgrVGs]װO͑+|mMVveԥ8
    B*4~IH/y]x-x+QiT\?͠j\#BMͭs+drk66	v
    beЩStإ<e~P.	![
    khPpUkU혝up�ڇ)lz`ܒfcY9rKuHd^_O9Z}RLyn*c
    ]v>Tz뮮&$s2q!Z0Lau}J)m{;'u'ΛjU`S26h/!#tnHre8poq'Lo)۫oX=x>p	RUk<U[+el%Z"iE׭*pS7Ueb�&RFSZWnZMB$2O
    }^ގ.d|ףy1pZ[EUA;9kaC;7"kY%0})}>4<RD4oKbw 5KTdfrr\r)zf&TsJYܙ\%Hf1l܌foC1_1dnŮ\'D)xS<Z:S5Ve %	֔8f@@	]&NR
    L8p`Qz'yŸ`Aݎ&KuK*Y#i=>¹c7s>uM6>_d+E,J%5u;GPW,f2j;wJ;ǂZWoDwDR͓@X;WI1
    SFa4X]ۓh2cki422]ܖWL6'׈]GI~rMq@PCh;պe6�75}-FQ2U0n K7d1+#ʴNI:+#(ʪ2W[r͕wGȘJu<Y,|GܧkLr5dWSojPCs"r|lk`
    cR ~ʑY(Z"B2)SM S3ӛt]90IkM)+7♘5hDKh,.<dƷmV7mƻg#:Af	jθ<U(0ӗA"+:#^U
    "~uL ׾viTJk@Qq'y"%Xr
    h/0w*
    oji
    ȔQ1uf[168Hp%ZV}-H#>Nr	|T`l6E30fKf~Ng[
    }! 6;Ʒ8&IX*Q]p\#XF"ΨHBm]g#ZNȧjs:kv{Î7Y*qVJ{_":V#ޢxl?選
    nE|7E2/3"JM ,5>pPi#vbgF.'2Br]jiآcة*Hd]bfaGC<yʝQθD힝]5v$W%_b`MS\SPjM%%β|r׵4/:̮ݫޥ&\/j5Wn]r�V[ޥdj@XܩZJsob|\SrPp&4AZ$�#@]kr
    8a� Pn|sh rI@
     $'|rddh
    A`1˺7N@_G��AL'nڴ饗^#mAufѩ@�� 9ϓFF5ɪݚ\h��@X\$@�� !�rEW�@�� Pd@E ���� ��(2 "��@�\��@�kEv@�� �@@�� ��ȵȀ";?{[/]x)~6e+P9*g
    hBugc
    }7Wu"\]<Ņs>Jr8[W~<j�VC+!B|MPP6V( u!Y:VpISh+xοP%4}L<4$~ȏ}\ފ9o>G8;om|D*G&XT|0R'a/X
    C&m`5}",K1mjzaW׃ſ6IJ:b*e]^$
    *KcQt -χvng
    ,=3̯awAqY<yKW1yr
    uN!VA#ifVĭ&Ay8YJUɢHA-RȣU6"H	C,&j,oʛ)QD7bzEBg
    WN?cŤ62 KFQs aLތui
    TRUd!^GAyMu;|ծ\H"J3�O!g,sBw
    >v3=yXyf{:0-oP W_`cDn<.G
    ;M0+9{<3b#ZBtTzV2AI~'čtRy+Ձ|D2eŀ*)$$oVcUyqjl&B_2cT[oqw,^Ko8dLN׽Zn#R5!ğJ$U)f,yFOVaq93H<2<3'ȵlԂxhY"*|صŪc\SFO͊6cHXqP#.cJG31ΉK C<4[E3%=L$)V*^yOm1EgHtuy:4Qq~<C3V^b]!~ծIo8KeoED)ttHu+0&wmt:yhsݗ\ki
    +UHbA!W#!&DuCs\%|-cá3sbE"2Bc vu]ܖg
    $yirrMjS̤g$KY*lR*SZ9&( r4:w,^oRW!ø9IҘCHO󐫣/i!	r͇
    5Yeզ vdˡһfJbGő ^Yx"ꑇ8%QD^L`2ULeu%qlVi-1㚛thqL~2fu'Vo9o{BmvdE5t8`G^IxLHN;|[Ɯ;yE6Jo"6-$ עQ2ʇ@x74E]Ϝ;[~"5V͗UBDWܩ_uL|n0
    ؊2ɫɕ1\fJ@C՝Ϩzcz1�"ad5ޕ>ڱ6wpd|hk"e
    ;#TԄp˰-K6`ݽF$
    1/ӂ=i}䚏T14SAQ	U<QaVц@xh+,=>wp]vX�V@�UMʂU:;lYDA!D�v@�� �ʌ�e �@#�r6F
    ��@\8@��G�Zm �@�p���ȵ5@��2#�r-3(� �jk1j��eF�ZfQ�@�> oc� �ʌ�ȵ̀8 ��}@ƨ!�@�kGq@�� P{{��@��  W
    r]� ��("ck!:�@��D@ @�� ��ȵȀ"; ���%s~?x|[? ���YE r-.Ժ,beYm]
    ��Aj+ ׊t
    ��D =
    n>qbs$Fb&(SSUn!
    oI9,Hݹ"/ ��X'WR227:ߡۮ+0k+Χ1f&!0J �ʂJɕTę]E$4NWՑMg!%vN �C`hboQrh,؂\]@k@��#rr
    ٕ{J/P?fRk%F|Np;J@�E
    "אtӪ)d�^&$؁e6u@�� P2]M[JD� �*ȕn
    k
    rZC^ ��(
    +#War5vۂ\KD� �5k@�� �ʈ�ȵ`( ��X!Wz���@�\W�@�� ��ȵ(0" ���
    +z�@��"#�r-2� ��}�� �@0ɵНQ��@�$E;um|Z ��(& b��o&kltT�!�r-TȵZ� Ps\kISU
    &D@�[n,!Rek P\J#ȵ4"W �@�umvlw�2!@;$SM\g;rT3�jΘ6;װn
    *en:@jA@U#pM|:[ny9?...}<Zŭ_^wzh� XZw}r1?_͟zMeqMVѠ*ȵgG뾰r"Wݣwݽн"BvᓠzXV;S͌
    T\\*_à^͖dL>Js&͍A2FMq?7'[SS„SRҝOa}aK7ݴ/dL( KAKa r1SDC�	��D]K[ ;RH}Q{2;l|t796ʡ{>f�1n2)5Ƞ>]G&	zi'F@-�X=	z@븼b1'C6O?
    E%1U|~RAAϠe̲3Vߛ�@JwSs#h}A\Ml]POV\|Q/7/Vx'|
    E"[zRB'�@ c,ݻ7:6Etj~dOTL	S>
    R!2hs7fB5"J{B?\E;hBl �@22%U0G͢&})T= J.#R݅���"@\G0["O.w��@P\
    b-b��(! ׬OG.<�@�еO11IE|z"� �@,.-
    
    c-b��(! ׬OE= ���HE �JX#$[c"W8@�� �
    B ˹Cd ���@�>���@\KiB��@�o}9tp
    tA/UkSș'QnYאsbȈ&fXtD(rF+L@|u^d,1@�M2BsCG[̾SDQhut6u8\},^NU0.6_ŕ
     �. pRoOon`\7=Qz?Mg'''o~>rm߰Nu9TR%[Ǵ�()#׎]=}ѱ|hvzu
    tA(}>>ͳG~#Wf)|ţ^rZL2L>"&o9lT&kZ~
    gVV $Hh;V/2~84v#s �@�vt^}JV\NXKM[_7J ׈8W4
    4$;A
    9GF
    1*ɛ.lMgd	9$HhȯRDE]g=%Bza� �@)(79p}C8uvvFlw^~˯U~_h7D7l(ot_"JC)uRw2f|8n#VYgAx_n
    U,+F&EyRI	�<&׃I_y?0h_ţ!]~®~|'{|'{kSa&
    ̫6#WGڂՒP{\iYpCoܚ`nG�(9&#OOMMJJ:??O[7>-
    џo>Й;0Jo6Z1_Lŷ
    ߱8
    ,H\cU٩:P'!��~M'O:77Glz'MLLFof
    tAU[{߹]'׈^c^@؅Xq
    [4bfa(ύWiӐ-!KeH][?Gv$0��@Dz|{wwO.mxx陙Yojj&W4Cej@@�� P\h2J*%ȵRȣ\ �@\qp\W �ʋ@ȵBi@�� �*�ȵbУ` ��U@ڲ�@�TkŠG@�� P\keQ/ ��#4[)N:
    @��!PVrM>D❎A.t0I Nh:rܤS ED	_%MLu<h_)lVԁߺu`}aiO]saꄬR:ǫRC@�r뮽rcm6>o/)<'B|?VGgnSґ~Ҥ%dq,cŦj!88 l,)HwxJ?eݝZKTG4 �
    zdx<Бc׶Sglrׇ'޼6Fz?Mg'''o~>ru~qN?K;((8MV+:uj+8i߄'{)TB㧬;5%P@vt^
    ~M?7(Arg7~\z5<3gIچtprw9ZW_kRRgK#(/+s3qixIQ#G?*)^Q54Λyʃ,MhU<ҚSbA@]J"CzY!o7Q�Cyb+9RXW'&kz{GMCl'Z^-/]hhۛ%+HGb=%WF~8{8*TزG1rvM @0{)Q(O/+۷~W_[W[Lj\[%ĵT֐T͒{ՂvQ(�#Pnrsف
    Β9u\;
    g/邠ٽ&M4͟?7J?
    Y?]}dƽE(Q>Oo5SbBG dV3IgT&BFܲ*iT$V1](95rU[JӶl-"n
    D �ʎ@`qWǧo޼Iů`&׿G;A/~3Bf4:]/O:3O!׈Chu%U-fReT	5W(`QObm\oj5ekU.VF&sT
    $הx!vf4l}@ �*@c_:q*<;<2bvn׾·J4?G>@g@gGRP?a@X# Gs5gg#fԲgӊȬ"'LٔDt3e<5nMܬXsa⨸oc[4W[&	vR(CWoX{UqB�(3&ד
    f#6&&&lr}u7z3 \w~yww@U#ݎ[,Eݪ7h1	e&>2sTc\VS+ӴYXm&7Qdhq%F@F5}zRlVa۫# PQMηwwr׆'_mr(2(|Ex+ʫW$U%"@z(7&҄gLzeUO*k$@x`M,o
    BrFE@(� �@U!�r0@�� P\kQ ��*@U� �jk-"���U@5Va|SU� �(+&j"Nlj
    ߠ@T=:ܤS'49En)Ѕ9>O2fZ;X?xeggv8NpSmƏ!qYq� �J@ً~7#[߽s6>o/)<'Uh>
    tAܦ@r]Ny&q-MzH8,0}P4r	]V@ٕGL]uQ��+G~tjc/=wglrׇ'޼6FU<~nwON
    N}++ajN?k9ה2MV+h٦iQhB+>P(w<	U8� P8e'olkSSƋw~?o]^~]P{?+cQ/tGdzuY;8=<?2:9RT_S55WIB|}+a Ë:Ȳ"~.p
    29S~gm$M]ŅdE\?@Qg:f(| �@ 
    &?zx}cc_.7~~qw޿z&׿|gwSeZ^-/]hhۛ%5̢p"=ugaLB:qB}
    ũ՝DTJ.+=\,QP%	1oQɆ�yMF5+[)~*�H@qo?~p?zt?~6~>:]Pvo{MtA~ROtOW5~nD?AZ©Q6R&=\*PL
    %pr1J&?8FuIhbzlbUd
    I,)Lr�"	�(r'Smr_x?zw_ߣ?ޣ=Czɞ<rQ~6_t+jG%Ttڏ-sA׼V@~$mM@VKdWf+*^r501U�>T� r}qo{O<ΫK/Mڹe_
    zc+U>49:s:^~>r"+[L9Ӛfd)B=a48&Yy16KJNR".roΦ\+,CXad/ҏ@�DOwj?6'Ѻ]P}w~yww@0rbl1&J17!8<fP,ŏBS#+s)Թ$2vr28[XJt=Dldj~Tx
    MQVtoK9B
    � M|wcϿ?%B
    º04I{�@(7&҄T<	 P\/\@^EEm/j� rG+)��@�d
    k �@�f #�@�d
    Z&2dQ ,�@�d%׽
    ɟg
     �@u#rMօ7)zush{Yvt@�� aA_&9߮2~g==MvN~‘xf> 1YF3qv˜:cD5^睄TjstE6
    ϛʘ1avFY,'?[{-[m=&['E{SNx?\.z@!tWnJ#{n鸅
    Ь$<~rU8(@NjɁa/DR-oPNuq*1c\R<o*c,Y.{܌,sve9XӔ1Y,zdx?70vM6~yfDv'AiAo53e0FIP�ٳ@+"y)Y楤)JETdּ sb
    zBg#׎]=}ѱ|hXo|8uS͍t:
    tэȭյel!̴|k GkVꆒ]Ņ	3tb9^;tM(Ọ(>QH�KLݐi9Y	/O*wBmB/f!>\eE>&yb+9RXW'&&'';:lr8~va~t4LAP@z/5CWc$h"#h.V,*;Xݑ!FSA*Gf\7O;=_nEu>y7_99h@iTd5QDcI]ySZh6ߝ&9SpR-WM.%c\8Bvkãĩ7_we\R־-okjJddS{_]ؖ l3Q\\ʈ+̇űua*dE)H<LY-fG)G%Gc|S;JdY5Wf
    
    ^T:aK<ӄ\CbC&_\+z8c7o޼mr}|ۑ0kϞwBׁ{|F
    V|믑U;WOa#z=;K+ȵc	eV5ޞzٕJlQN.ReD\?9:6>55E*+<;<2bCO@
    Sۏ:Г#PjB3-m0DY?"h/޶P2^nlդZ@0{RkԌOޛښ!/kgUt
    )J9O)M4/%Ɠ+a9sح(TVd
    k,5!kf鳂YMĿ	\e%/?Po^Xڲ8:
    y-~ 	E{bKhW˯H;nWN#s&fn.9ozźvl"6 qWdHehK I_с
    I>Ƙ>'Q-GQ'=M*1	Y3yg<%\U$3z|{wwO.mxx陙Yojj:\	]vEzB_QLO�� �!Cy#օMouk\eqo6@��G xV֛&���! W�@��l!�rV{AZ ��� 4D@��l!PfU -�@�d%׽߽7g �@#rMUtօ7)zush{|ҫ �@�T5 \ۗeXY̷8/	??Dl
    JF4]B)V},[q@P#8Ɉy$G+YqaF*u:N
    OVw87+N7;rrcmnrurYׅU?mmecWIFV4]!u23ή)Th4E @8띾=gG^L
    #7DgGZ?E<Pr(WQJk~\feFs%Z=Q/:rvM6~yfDv'AiA/D<;Ԝ&f
    )Ӧ&HY(ˊQ(]{m?MeEؠ3_#^ۓSR<X}J7Yz޾RRsy77zL;6{ S75^AM:ݤptI3ŏgsӎ3v=UZT3+	+)X8lC9[X"	u@1Cף*.HfhcUev̸pl#\z4{6WѠqNAB-ȗʝP!ҒNbfdIsrj)ī5&ׁoPך/MKO&WVs$uGAF[1&scpUҙWU³{W^!(Gc!W.$Q>vJNf\Fd{*Zs;	R.m>Kx$,4o*Coz4/Z"ABssف
    Β9u\Up*sMW\lZlz׶R9;4ر3hn,U>'(f"hN+/h%޽vΊu5h{F)\/Gk:]R\ٲgVkx锕{sv݉؛Z[\'}ul||zz͛/]mr}|ۑ0kϞwBׁ{|F
    V>!>5r:rQ;[7-)(}yt59/%czzf	G<S@3D>%
    审E6]Yd,q_3՞!#OĩDȈM=*)Om?Ds[CO.B+}ϴl۷M$WRPue3"Zа.ķa3w;[L�jQlIbe>VUλRv̊7px4<ba,M
    C^Gv#W>^hџ3s&YӇkdqfjRg\O>+unnNHpvݍzЖšOQ7kq'w1ۋ_l1w�7DrYkT^G\x[O„t7veEKD=/N$qRXUӄ$(GVZ>SĀk7M†2R6ȥ=?ăXb9`GOˉȈ	nTAS1s6iN!sۻ{rkׯOSS	J&O;v]^]:
    n1H\fd$@��d\i2?'N}X{SڏfkΨ!�E xVf)ܶ_UD
    ZD u@��,#�rrAv ��J@U,
    � �@-+w6@�� 1j\~~Ɵk%��B f)SoR3lѶW|+~gj=��U@65#Weg);
    gֹE-
    >&$:E$g)Ki=;̎]k*KII *zw.vB>jpE6͛ʘEوS68SQ9xΫdGt#4n9tX\o\u!.;Dr].8_6L5¦X4t&NkX~Td*I 9^wqާRu?hjEv?(\r3Ee9;ʲR,xM}hV]HU8K^@G]N/hus~d83-t?]\>UOib&旦4q
    Y$sQlVJRhk@,"*іLڡQ46|}cJO*•	e
    EeY~.kiJjՎ]=}c>s,7a>Gn&H"לq=O鏙XsV79İ	yG)U<=+wn</Ҫ"N -DkF#5E,ArCm9;oU7
    J�SL|cw
    q3CxyR	-<}KK:5:KkG畋WHa%^ 6^|0|nXn (vu}2 HZmû\d(St5y5P_q`ܐ_
    `	+1cDbڙ\ÖzFBmQHArN ryc \rkE΄ySY4ִ3]Skz\8Bvkãĩ~~=mrJny\SU?'&µmǶak?Wަ5f%؈lbf$9:,Yr70[U<".wSzcVd(Dsc#L6?H[EjH^reAѩ\^r=zձ7otmGzcL={ޝ
    ]o})X+8|̅2؊.w/ˑ\!zzf>p;0Ks- P0[n=_dsL,eBUWO2c>rظNJ:??O"N7?d+Lˆ}Drqk@O5cEV,;s2r,nas1C%eE5Sjr5	Ŗ)
    /kUMmVyp,/~n BR>B"tSky4	<}V0711,Kc6쥋š-Cn
    (.\_/�1R0^#{UJ
    ^{$QYVQfP�\R#i9Ddl[`gCSV;@ ȑ))LOզi~|cj&=9Q&z;,fM3Cηwwr׆'_ȕ:yrݱҎWOQx\#r{k&�@f5&C2ĩ/ua[𗞉egBx	�d\/ТD`et@��D2@hA ���B�䚭@�� @h$��Bɕ;pV@Z ��45K{{?oL@��*G f)SoR3lѶW|+~gU^� �2@65#Weg);
    o	o?+}L]JE%nuh$P	*ΊGbxՋgn9省q	krxy$G+YjŒT(]]ŧHiǾG(eL9<a
    }r%Fhn9rh67:,C]Dwn¸mlJ4i*otT>E4/#<ƯT[A ?Ԩ>s8pQ+YBb%<h
    8vΎT"\lYn,p.K䁎:c͟_+ꆝ(pfZ~;w8⧟ĬȜ7JɕQ(].vÝ>< ,X#qPDȾё*bR	eũ?q_9lkG实`1}z0#Nxasc]7tэ$k8i>W%fbdiޫ䵺$'[XuLOїQbYij[ 2ϲ6$`j"wb.".(]^<@-\ʐ:c]tUh"{/O*ܪOWvwY:1#vt^}JV	a˷{(k͗^of
    bZ'+O.?H
    0iܓy͝(M]=T
    !W}
    kxC:ScrIcM{~i?cn|(uZ\΄yS/wwT S,}ρ#d6<J:;;Ks&Wȟ떷5^sqii뽯.\vlK]&s59g(2ܚ:X?En-.%3+Hay.ru]g
    אә&78oB	j-J|7G0[k.GXiG]4>.=oyqYr|\+7l=N͛7_#ah=1&מ=}N7{Ł\kդ�zE 8wV1+ւ#9T4 f*B˷ڃWyd8J^HU]FlTqs%Ӷo*5v19~rtl\K'N%BGFlr}VHa}j]'zuq
    ]M_Y{eCݾ
    uo"7l5^akAV,;OߵE[-IU)yA�-7kLHĵ4WG|b 
    "[Φ'=3ShM3"CenMTF{Q̄G?ZceǑ_sF 4ub<}V0y'MLL$8KcC{bqh(+Z]{W_"N}^:Jb+^|n:6N
    n:dRHsPD64ǑTb0Fclg
    %M8(y &tfxt<3Hp3Mhسyz>v'="3=\קgfffg鿩r!O;v]^]:
    nNf-@Q��+G 3|Hq!ǃ8.lzcKFg^AJ �@" 4'Thu1n5] ܼA�( 򁁒��@�k1PD@�� � Wt ���EFɕ;p-2l� �%׽߽]� �@�*l|C:ԛ:۹um=㊬ߙkF@�� V&v>߾,2~g=Y:?B%MyB!'RF]H}YD(k94pvE6Us}R=]nl?vu;8|vG4׹u!]{pˡzw9t	'uy=H:h*}Cx_n^(?	"tQ434D'"Zc(tTLxrhWzΎT"\R`IkuGz9vm;u&S?<W
    ;Q ̴ v"rŢl*GD^R<reJ&a	Y(Y?/�2sDqDȾaJ[|>�,�g~R[vt^
    ~MǞ{`y19M67vЅpN7)@tĚ$ރ,$^V+\MO'<_W%U\Ȯ/�8q6N4a|&u**S}^YUCyRRe/5E|³vt^}JV	a˷{(k͗^of
    bZ'>Xsy$
    7E7ZHW"u7�-[mŢ'm}=R\yY=FU#R*=)@G>]a.\B2gM7KVHFk\8Bvkãĩ~~=mrJny\SU?'&µmǶak?W6"\Jǥo
    :ߘƗz\P8xFqYm|DOUބ@ P|5XbCt"YJ׮OȵrR㤯OOO߼y_Mo;c2|P:PxcϾ[HolAw]Zs5?*x)IsdmQiJ"۶zzlPk0M(T	>%Ȱk[/YRloy5W	p,xWI#3f#OĩDȈM=*)Om?Ds[CO.B+}ϴl۷M$W]jaFl=;ʌDO.Hb+$Opg)_TC9&̙zP0XWraLxd"Dg*DeՌ͵r}]h'O:77Gމ	ҿ/?Po^Xڲ8:
    
    w
    MᦡrYkn
    P[Yd\Wp(^l*1
    Q,jӱlچ&Mnyu)*@Rj[ڻsFZ1n܈	rH*ʇmclٴl	+H.<3=\קgfffg鿩r%|ȓ]vEzªAj4}J8y" �@&d8.lzcMKgHox_Y#? �@9^8vյͬRW(S#� �J@ȵF@�� �J�ȵ"k ��X\f@�� PBj\B��@�,Ɵ@�� �J@5VaSYޤpgέmWd\K5r@��@65#Weg);aK.Cco[JLb'R	V#깖~.ǿ}KGWdP5ą}gQ3AW5|fȕpˡzw9t	'�䪟C#8'syjWӝ3
    )hEf[u  ^1*98xhyCr*>Ԋ,-͟5I<sfYTn(J%5ԯ[|v`b
    g"\Kȱk۩36噽"nyBaqܿ�Og&*fqB浉sB`39$<�ӆ+	yrI-?Pծocg
    p^ 'UjG实`1}z0#Nxasc]7tэ$kv5NS7Kj%	snfZ?6˜w;wADn	Grj8Ԥg<~^%D\rX_@prO89:CxyRQm	*-kG!>J.e"KkG畋WHa%^ 6^|0|nXn (vu}2M*7pvOc2KsM P߈mͱAr'J%'6X$M#?\32o@Y'2)J2/мn''M7;Y"AETf%4=(q,_we\R [>z.ɦɦpm۱-uAؚh~-N`7CFt]&$W'ZB7S04q@@X}Ӑmϥ7ؓT>r嶕ȭީewH"g	KRmBxSk"nQ2l=N͛7_#ah=1&מ=}N7{Ł,xR|\U&LQUSđ䚶5~l
    VƲ]kB2"S"놆]_dЕQJ^|{5bj_2L9~rtl\K'N%BGFlr}VHa}j]'zuq
    ]M_Y{eCݾ
    uo"Jre8	H44-8yid籍QiǑr
    5b-ӖHzUR˗0O+n<Հ"џraZBژklҮOMFnV)Cf鳂YMĿg_zlx`/],mYt?pŝ&nH0,_}AzGA:קlIgFU1Jƚ{㺹KE.G(;[=+Y_V&H*@x5drBG1q%M(!ј/g,CjzcV[Q!sۻ{rkׯOSS	J'.x.~DD@�� �"rM>8מ8.lzcmKO!� �V@65	XYWW�@�D 䚲&��@J�VIC@ ��@Ӗ	�@�T	L܁k
    1��@`- P3\M: �@�*l|C:ԛ:۹um=㊬ߙk �@ 
    ru~駟޽{Njr;Ko_aqf3ߞ,pnpe0S'8"3g<)3qQ mzE7Of,%<s\&HM#DgYGCWH^Xڙ!Wï/w'z1:d\oC歓n]p^l2ΝQdNru^dCb P->5<gq-o0f`EY(4*&[<7rɀ#gGYV*s΀e>;}TK"GU8K~ocoC/j͟_+ꆝ(pfZ~;!Rlʏ.&W Q�߬f�s2HxC7S&AJb68Uࡹ+6?WR[vt^62|o~zI,|0#Nxasc]7tэ$k%%fbmUZTC/rk6t@	X3t-#.a"RîX/B@prs	,V˓=UZNG'N4מC#2o~r\M/ ¯5_z.)h]L7;zohu
    	I_E7Z1sݥEPJlD0afLAfEK�\tO$+Axjtd5Q�%YhT.82ʲRE2<r=_4֮o|ᶞ^M{zz.*8s֫tA.N6-M6uՅkێmDF+OSӺBܣ">L5.f~"Z6%ɻehdp@d P|*q3P0Ig>)Ry^ Gojl>
    \Yx?~=ͧA\v$':dڳu~ƞ}/߷8U޺;g3Ѳ|\rՍ:2B2USHę/îe=}rE6]Y*ͮ&}^%mpXgFsspxꡯJ7~zwhuxd&ׇh֧u'[G^gZ6PG&Ea~
    H44NrʌDA.SCv!su*[1(f#\uCtrMT.\͈	
    zڦ(g\~xnzvnÿWxC#׉g_zlx`/],mYt?|ŝ$n
    H0n	~W_V}NQ-cIm7$58jgQ>L@#,/}\8P߉
    hoLj	
    5.V{,йdGfԶ7qo޸133;55@Yȓ]vEzB\T� �*@fUDEJd|Q%N}ꀿJw6�X+d\/bD`ֵңQO �@ r �@���� ��H�5
    J��@�j\ AT ���Cfuw4@�� @5Va۟ԛ:۹um=㊬ߙ+�@��"
    r埴:ۗeXY̷':K-ľC2mqBSfVȂR"E!	>3j|eE* vpDx:;*9\JqaF*6c=L:P%,g*1ӘLk?W#4n9tX}BS@NFu!guuDr].8_6SU[C=;Pk0r$ᰕ㏝,nצPr-4~@HOjx8qw
    a9+Wl /*QJdk3`No3MDY/cP۩36噽"nyBaqܿ>e't~ZO=Sj"WFtY@5K"#
    C$ P.�dZ"[_>*bR`vsN(+^q~Nj"=rכ;6{ S75^AM:ݤptI<%%fbiޫT$1$	%prh۶h+lm[\.3%}cK؞xsv
    Nnm(�A6@D89up#Ǔ<O*>(a*-//Vs%pG畋WHa%^lu=AK7wt3A5]k.lÙ]
    eCqVwtsqWkH·9Ƽ#L*o}#Xq96ӫsǾ]P]hx^[8\%stJgySN%W+U$#ȵrZG?tmx8uv6
    N@\}*]ПMKM]}uڶc[ꂰ5џL=i=C">t-4WF81<7Y%Z+ghg*}."RX?UD,wto9_ދ@E;}]G6N}ZlTnT4,kקgTFVnr=zձ7oގ6>HZOtgO߻C@=^oq`#fð޴<ڑ
    JيEq
    bvMEhn:'p	a-ɐ^^G7ߎ@(yH0TLT.[^U$bk{M4c@W*Yf޹9~rtl|jjU"V~'ZE wonőW(t5}e
    u6ѿ*K޲OY
    yJrU(1!ۉm^m&fhb"Z:ٕ>ʶ}e0ҽ7]0WjA+CQO"bT#|uȜUPVjF溲STBs=y`ֹ9NHpvݍzЖšOQZIJ&Ѐ bjLmH5ܷC\tgdF!*^!xy.65a5"Lc.9oZE\_" PL
    bpEc˞x7R鏢(o'Ojm_{9 a*RL˜Wf4sۻ{rkׯOSS	Jh'.x.~D2C\[yR%fţ� �@d\i2Nh�օMou_zblz.FՐ�@hd\/�	*H]hn.R
    �@d\^gd��@\K
    /2@���u-:��%Eɕ;p-)� ��Gfuw4D'�@�� P:2@i
    ޤpgέmWd\K5r@��@65#Weg);aK?IiJp&wXfErQK.kk@%PߘYGyci$Y>F0΅!gI'g*1j(̐+3BsCG[e^r"O$u4$WvXYiXO~V|e*9l P|7DggRA3-[ZCTuʟU]s0i(+gYXӔЗ/,zdx<Бc׶Sglr=3{E Zݰ_?La'"7.?Gl&&&j:*_YZM5T3ƈ`|}&<"`rI>J>PV*�gY`֎]=}c>s,7a>Gn&H"^bQb&Gp)L4Պ,T:h!r0 /hUgr+.+YY]Y#
    CzFY	t+(C_dI%T[u#i_z9;KkG畋WHa%^ 6^|0|nXn (vu}2dP0v2P//!\V7\BlܩM[b|mŘ2boVH�\PKȰxrCvFǛ:	jblegqR_.^jA^rRE\+]%N%slT
    uZ8ٴ4Wm;.[OCg}3*bU6!p?LBeG6'cJXr $χ3C@08ٮ[c:[MʳS@^rRIZnUHn\'}ul||zz͛/]mr}|ۑ0kϞwBׁ{|F
    ,)w(@۹iroKV:c8YUK hNG#yrB
    fLjgs#Q
    Q_dsꅤMxMlkO3Ӻ19~rtl\K'N%BGFlr}VHa}j]'zuq
    ]M_Y{eCݾ
    uo"»\㒸qau-HPlRX0[aufc-UHy(5肸@cGfMI|,9:&*Q+-y!5s%g+e\O>+unnNHpvݍzЖšOQkq'Y*]9ᦡ,,S{5	b\xq*~Pl-Z*r:HrLlc;@*	$3
    0HlM+}<Q#Ǯ=u8'xҤ!1/g,eՎGr;ݓ_~}zfffvN WjcץuůrW_/w�X;d\i2?G[6QCKĂ%v&� !
    rMspBrnq1ȵx"7 �. ׵89�@�dk6
    R �@#�rƁh@�� Mj\l@��L"P1d[Ah �� 4[OqHg]zWg;{\;sHAL ��bAϷ/˰8LߙoOtnJWT!,SPJD3IhiVŃ�#=Su`4vE6UJ\HrP~&d�]g>8V]bfuCFhn9rh67:,C]Dwn]I�\Nrb:/q]QszZhUwsd�	`hQ5<gq-oND8,vgqp<OdGm.esveYhqIXMV,Y"W,]z9vm;u&S?<W
    ;Q ̴ v"Ȥ]hb`E<8,,_`-d�(`	xmEȾʧaŸsBYz8~nVrVAzzs|hXo|8uS͍t!ܤM
    G7>D9^bQb&&^%Me I˭Arz<u1hy$*.z耀uZ83h>P:
    @=ΩC	݌CxѸOYzT>3%Wi2;KkG畋WHa%^ 6^|0|nXn (vu}2Hz 2!׸ܤ2ӵIƉKţ-VJft'FL6航R9S=f?Vb7qv%{o\ie\q۬{$)Me˚n\T NRuρ#d6<J:;;Ks&Wȟ떷5^sqii뽯.\vlK]&s5_i`Ü3\fPix/uPZCN(+Uxס<dcRǙn:EnjgqZN|\�5E*Ϯҵ13̣Tr�Vr=zձ7otmGzcL={ޝ
    ]o})X5-XIFvdd.VSDh;<4BruYClիe*\}+׫P20>%v0ab}0",WspJP;3f#OĩDȈM=*)Om?Ds[CO.B+}ϴl۷M$W[B5֌I8B2nuXe+Tm8faeU\%FlLvqk\aΦ
    <׀S3~*<?#d3V-]uCtrLTvՌ͵rXh'O:77Gމ	ҿ/?Po^Xڲ8:
    
    we8  r(_}[^8mE6{^Fui5Qd*]c,icWd{$FQ}RTފ@~bֈƫ=?D;Xo*}c'&U49Ŝ˖\ώeʏd5Ȍz|{wwO.mxx陙Yojj:\	zcץuůPQzʥ5%� ��̐k!MX޺魎S&rUK@��"
    rMspBYc|JJ(# �V@uCR ���@�ZQ$�@�6 n_� �*@-+wZhQ$�@�Uj\~~ަƟkQo ��( 4[OqHg]zWg;{\;s-(� �jlkGng2,,SwÖ$|˖41y3d-2ֳd_dEA~	.g0KHadQ۹0>#3I=6�˙*ou52+3J\rcmnrurYׅuݺ~9~I2qɏ:54Rd8M?PTK0Ӂ_ޝ4ЭzzB@ ˃Q:xir  ]a
    GP?o*&[<s9Kesve:6{l_!uU8K^@G]N/hus~d83-t?(�*u8Zt(.7N1e ,
    8[J&<l}}79UĤּWv	e!r/#{y77zL;6{ S75^AM:ݤptI3~)1knxr028Z,SNĻD&vWJdždWq!	0k<sF
    pF/r4NqNRO'hX^Tr2ъ?-/f	>3|>%rrj)ī5&ׁoPך/MKO&Wq#!(CqI1肪E/BzOϩ4[fˣ*WH{6e1�ɀ@%\R_2OLV.~/󒫕**
    Z'.8Bvkãĩ~~=mrJny\SU?'&µmǶak?WuH!h=Cѕ"F4:T=Jf4.NͳB+ǩwnJU5W;ʍ�\էQmH;qn@,
    "gZv7Υ\'}ul||zz͛/]mr}|ۑ0kϞwBׁ{|F
    +VQeӺTf{P'Q'۰|.WK'CMΏX1>%I%a-u#/YRloy5Wt"d�GPhG҉S<;<2bCO@
    Sۏ:Г#PjB3-mUzVR]HtGcMǝFv/M񎾐cmWWWh<+
    vJ=)@ЈlҕZә1QjiSэC
    th'O:77Glz'MLL$8KcC{bqh(ϵY^l-bI,S{5R
    :tY"WǶ %X1lH:quKΛTP$bֈF=?D0G$D*㝐z 4|جdp#;gϸeKX$+Mf\333tuǮK;뢋_=QGBPniv뉚 �"rM>8מ8.lzv1x)� Pd\/@D`bw`:T�@ d\3-@��5�u6<
    ��C�Z:l3�@�Qj\5ڼ6�@�T%׽߽iY	Q&�@�2@i
    κ0&;Cvnm[u"wV@��!
    rM,}}Yře
    |{t~p_T'nL#O~:T4Qi"93w_>b�2"<\~f�iAl>3RG|IҮqdzGW!]{pˡzw9t	'uyr\QG=╂"4)gή_^h@d sQ38	'GZe?-7\p^yʲsveYXK~L/FG=2\Kȱk۩36噽"nyBaqܿ�Og3u(ɩR䩤.(rA]H93
    C$* s԰yh#^7TSELj;a&;焲gjr_9Z5Gzzs|hXo|8uS͍t!ܤM
    G7>D9>g^bQb&Gps$'%EOhYlVC."{Jo<33QÉ4Ol]Ņdw%dRkjV5C1o:l|9!_>yR	-VӒNbH򜋴RΔ%rrj)ī5&ׁoPך/MKO&W֟d{_?:{vZ9.Ev<sGvmv4Owʖ5C̢cN^bT%U0(!š@Gr/O@";T%^dg)!**
    Z.9p}C׆GSggg{.*8s֫tA.N6-M6uՅkێmDF+MzzI@J}❅LJwfYb'NYҶԵ`cZZqM.Gf8	݌7_Nkgi\AW\u(+/G@";
    "ctl=N͛7_#ah=1&מ=}N7{Ł,xc`s:dvb�tjrM:bıkEW;DdA:S"\Ún^-0#WȕHE@=g#:ᑦ~(WUyB|E֣|J-WOo(BK(̘?9:6.ӿ##6>D>m=ٺ8
    ,=Ӳn߆:7\a}ԠDX.5WyOYu$4:Âj'9krCP&s1U]}lʝӛ&YD	M{<ʱh/Ȧ$WdCuhTDURM~U\bgџwD/=ˏn<x.,mn~_LOemA
    i‰nǯ5P:cg95Z0J Ziu|%Љ],8L0U'K+jc$3֧XmCCizk"? @4^RMSk8(LJNF>v%ɖ0(3=\קgfffg鿩r!O;v]^]:
    n1HӤ&
    � �@f5&Cqo]VT}Fo75@65	D
    fNW6XJ@�T% ת
    B ��"�rE�@�� Pd@E ��er\@�� �ʆ@͒A4,(� �  4[OqHg]zWg;{\;s]}�U@��"#
    rM,}}Yře
    |{sKi#d3E'-ytf7ʪ[G)x>`<8(o8OYKH5WdP5'ą9IysIgl8}.>Q{-[m=&['E{]xȡNx?\׭LT
    'pȨT
    ?geU;LR p	QhA/@8mL܄GXP+BbW.8}y1Z9;ʲR,r
    tltK]\D?^@G]N/hus~d83-t?<uXɵaT>;9s$(хTh9
    bj;?Mx7FSELjWv	eӵ}dd\;:/wCcg?&c=<q;BIn| \sqzbbmUZT$)1
    5=	LŚ{F4,]r/U\1/Lڨtur0#R:yOFb
    5_dI嘔&Y+i_\ڵDvt^}JV	a˷{(k͗^of
    bZ'8karM^EqQ%$SLBR:dCR⎯ZvVE%j1xQZ՘%릢8UL*|*Wn&YhTƂ?^jqJr\.8Bvkãĩ~~=mrJny\SU?'&µmǶak?W]qOq>4΋]9J+d٬Bm!}~_Nrg:!螑~wS׋\Κr
    %
    |2:운l(4E*ϾMҵ3Tr\嬂l=N͛7_#ah=1&מ=}N7{Łyc`is#JħQM;Ug8,Ta"kE^r
    e'cRW<RCVd '`ڄG=O6f_ek2'Rv/]x19~rtl\K'N%BGFlr}VHa}j]'zuq
    ]M_Y{eCݾ
    uo"W>o`LAMMA*S688[žlf+O%|5tn}EٔK	,lT7+5P.H@Ɂȸ5Ȧ$Wd˞lgt=6Bs0gџwD/=ˏn<x.,mn~BfcC  r}K.w$
    B.Y8,_,d7e$ZOYiC>c贽KΛV5Xmb(D#ZȳIm{cc,	ryC	K*J){rɗYd~\333tR'.x.~Dl޴q8P} �̐k!Ml޺K>XX$]H2@�lkp#Z_4E 7 �@1�� �@�c���kkpT� �J@-+wZz$Q�@��%׽߽7'� �@�*l|C:ԛ:۹um=㊬ߙkF@�� V&v>߾,2~g=Y:?lB¹zKS"2ߑRy%?K&o)*V	_ljH}*N<o*Y";MS_wʏ1/3C2BsCG[e^r"O$u=*"6yu%?ݏTd5<NA1W pN]VHVHO\xbċg-gGYV*E΀%a<Kz.^%tص\Om^V7<G!O0B8_ؽɁ)"]̘4UD3mzP(_6	r
    *_"[ PnB_[hxQYIe^6cBC}NrHkH	eũ
    p^'*rWO_on0>vmr=Anj.tI5mv5IWkuSH\Jh@mzVH~82	pQ$%Yl37òu4ʄ�Ln?؎Ʈs
    ʦk}';.,TE5w4׎+v_ɑJ:>1A^;:lr8~va~t4LAP@dreA%iCqɫH%B1`ҡq?f;XFn^zD~`rg]e#QXlW1	Hּ	8I6}*㵳%W+U$#uE}(]%N%slT
    uZ8ٴ4Wm;.[ͯVi=#Umv	2s72s\")"V>U{YqD\$ۢtd\cA"Qle~e<šilJ{cevkQy\eZ*`qWǧo޼Iů`&Ƿ	C뉎1{wz(t_g-l`U*d\b1Ȇ	R1YDH(a	c:_;C"[tu~Y#G{To2rqPB@B(tXܢ=0Rloy5W4Zҧj'GƅtT"ywxd&ׇh֧u'[G^gZ6PG&\HU!|5
    2zw>	Z7$",6lW. Lz2:wf"/~3xtm+Yx鲌*g,jsao`�?rY=2ܙ!ד
    f#6&&&_~lwƃt8eqhsuZÌUᆠ%nǶT-@NcfLHS$ s66tXTi*EEsJ:Zr"2Df-1oEp ڂA![e,Xvlw̐=\קgfffg鿩r!O;v]^]:
    nlI`VE -�@2Cɇ4rS_x¦:/Q8" �@u#
    rMspD`2CN]Q�@
    �VJ� �@\�Q��@�A�%@�� P� BT ���i�A	q��@�@5͎߄/j
     ��(e%oU 8PWO.#gF.\fT-bɝvNhG@��R!Pnr%Fhn9rh6\ٷsbٿ� Zl]ПD3)EYȵz(z$)UD@��L#Pr>ExɑֶSglrׇ'޼6F(z?Mg'''o~ LB�1*Fzzs|hvzu
    tA}>>ͳG~#Wf)|ţk5>ι~8XZЯo-V#)w~n>?[d,S#3돨�@&�vt^}JV	r~a_bP;	햗`itA~{C?CkLKO^X8N
    8Tܵ_KfWnDD%��5@uρ#d6<J:;;K^s&46_B~_h7D7l(ot_jqyMcXC=[J2''T\'o5Q! �@m Pnr=zձ7os/~_P_.
    NaG>G{>=.T-PM W+UQ FD-��5@c9q*<;<2bvn׾·Jȿ4?G>@g@gwa~ʩ8ZfaK=1ת4fa?9ھڜ\D��5@鳂YMĿ	\hͿL.mwG|G(Ѕ-3i	Ze
    LrR(J077bsC}m,*[nők@��Cz|{wwO.mxx陙Yojj&׬b|@n ��(rk!Mqm-Y�� �@Y5™6f*� �V@uur"5�@�� �rLSAP ��
     ׬@�� �rLSAP ��
     ׬@�� �rLSAP ��
     ׬@�� �rLSAP ��
     ׬@�� �rLSAP ��
     ׬@�� �rLSAP ��
     ׬@�� �rLSAP ��
     ׬@�� �rLSAP ��
     ׬@�� �rLSAP ��
     ׬@�� �rLSAP ��
     ׬@�� ;b˖����IENDB`��������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/beagle/images/preferences.png������������������������0000644�0001750�0001750�00000113744�12000016371�026760� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR����+���H_���sRGB����gAMA��a���	pHYs����od��yIDATx^y}[wWr]77%$67XMlx7<L<bA`l-qb0f,A<5V[RkA=[cuNNUY?:U{SSߞvڵf͚_~;;P�
    @(?woի?*{^_9ul̇IfΔĦ|N3n:A6ylvncYlDϜ`>;yԙ1FDggF'Ok<G8=2qe.?߲bDupۣefش6槙ޏO)ML!IfL8vvbF>73g3s|Po~&	
    W\vDabmO+/>''Ϝ>=$;"}IeSG#S5u$R鳉.uNvc´O0}´qfm.6.uְ}N0WXӚGw51%mdWFv48.mmdNn%;*lxgw
    nnap!M6r`ځ
    wl]}?^ڞ=k׭mվU5]AkNVa{:n׶lwcڗj3m鮶;Z=dg+d'x	fZw5g6)-._Ki6UT
    pB^MkӗH_k6iChٟvެPjm7J}T#V)ose_[K~ﶶ[Zؑ}tKCu1ªuџյts]Ւ?ד'ڰ/l߹sc]ag禺.{@vk{`uo!;{m
    =
    Nj7bhG~ac58.lx|ǟ9=8=O:vrװS;־rYתeݫ^l0Kǘ-XxrF'%t!]>ӡԆV/)^K];:}(L,&"N3HzыΕ|79Ls\͓BR1<czzе&x7t
    `ƁMlxo#4gwnfyYóIhgIQ³mM<rC3iw[8<`fY_WOw_5k
    
    k9-]1`vTsH{9MDY
    l-68 8텴8H:f4s:,JFxp A<͈$ğZ:@9킴Fl]vۀ/5%
    HS-'֦~Ӟ'K&֜ZSE^# Pִ֜f'!N
    Dlij+m>Ͱ}@rA54[sz@Cׁu0}&rKHI9MV&Hf#Gڗ-s[f797ǸMh*2JZҤ{ItE]{p DdO3HG?"*	n	f^fr7*N7fdyD<Ϫ "dj4syg3#tl3#r5ɍVzʁl>i:܎,̇nffʇ>-!}hp0ҟ1ޘpJxiWuP4s9.5.ߙѺ6l^Ikzoҫ.Pp%%Q-(h0:HS1	r}4C8mfsWߋjOt9%f^jǫ&9n^_K.5=^u=jN^ANTH'MvsO;.hKMǞ H9.g
    naW|W;~W~WyeW.~e6NK;Pd2Ot)_ʽk4	@DdW_ }EQe`0[ZkqBlR\xaKiT@3)߈3[Sߔ0*3[xZ$0Eh	x({X7q3BK<K7uvY{'
    qQ{'Gb݇ɆȈЛM#TxnXegpVD	-!-iW[fūE}Ao�DC"̓L8ڥ&~;Ao+pE�_Ddӌ
    }k"vzՅVw@[DmAoMnϯL.W-"�nrZ[:W-C:.Q-hg`8sSp2ͼjf̫Xb73-iRoF&Z6-DzNj=ʭ#N(w|ExqD|l鯯;M//j!{eQ+_Ynn܆^]4#>;c~uvz%ty:}*YJri}HR۷_}gMHшDgi6:uy!q	lu&	Y!ylp-Bn~\` nf&Mȥ>D9) }@{g	o\!o+<H7{GNj<{	͝Mdn0?|l}Dh7>0Ó;.j_;K۟vOCqp~ZQm<EmeTYW	iwQ7twGU+
    }iՎWm8֝|n~U׫G4EG5KM.U^jQ턾EGjWyC>ognFÚ:
    ?0i!2%,ËN7m`t޷og:SǙ=ݲYۢ=ݵEO.zSZ'9nsD.=EIu[y.>M9{gg]e5zmĴC3dC:Ouf3:'Q"٬}2ofG*0[Z:ų}ꘔ==Ċ=cdڈok6moȻ޳ғδ3R2mn;u48HqZY	:adeTB:3qd̙fMGĽo_;EmGtQdC
    sfӞ.r6OGR;~5wQQvQ{٘2h2EJoiNb5q:�ռCe̟&NP-m+ؖ!qdO9269U{jW[z|pDk鎾cX{.;pYcdM]d?߿`fnma }cT]vz_?yb'b~x'Xp‡{=ؿٓ?ӧ>~]N־ᶅX0O?s|z~ۆ]W&)MSꄖCôMΨƳN2hȌJE֨&E{Ye/5z'1LƷyp[t?K9Њ<sd³ŭ:@n,cbVѢOC9̌h!Lx3TCoiOsZm^5vA:[kkwKffȘnqow[tQ^|Z%swQ
    ,]ԶޢU߭owHCjTkilK@^5L
    (D9=^P&P-FHQ\jgnCt[C-5
    'vD}Oe=x}
    i3sk^#ނtάٱ}[jGV?#6=zoˣ>vocv=vo7^e:B9|.'k!{I)S
    {hc݂k߲vW>9@}8=;o-=\slHWj⹋LzF=r*в=3G^6jFk'EiG;3mN
    3M4go;+e[0;,	W
    67sAzhA2,,6[O򼑳$V'Z8]KϥEGfN.j5vwQ~[~tIYZyա):-|0'2otQfgQߖ!ߙG}hc&E-NjgJN˱czV~jKCnz5rkǚYC&;<^5CU[j-"P-zNkw{3YB5Mbqo΁]M4R@aͻ:`3C{54wˇzGcEo8Ɉ:Atqoztlyow<p{};=tч:M2wv̿s]6Xg!r#=F'хm<&4)eJCwx}i^<!Xٳscf}wogշdoYݹ;<>r^z~}6"t<ﱫޛyj2[z4.if-9Mq2=;l6 xx!n9KhOp[ķmxfVf3sIV)<H3N>3͍zݓ+,6??'5ּf.vV@ܛ
    YvHQl4:HHxZgE]H:ާW&!4	Zo+SftY!js}:-c1δ]4QyuM'jftDBkWc-2lxBPꀱ._^+^]!^Y_w}߾ WWmy7V3۾#͝oFvT :Y~ג
    6Gڦ={6
    o?o?_ϯ}7}_ogw~峻ٚ~=rۯJg!r#9<JgW>KiRʛu_/~~Y{Muw4
    +/	[޹ykyʯgw.K6뇖9Ol{{߶S~׎FNf3?{3g%C3=E0di5Z.TсHY[=x&NkYCvQniKkDv4Ihi6XLœ68^τ5t0]Ԋap9ڷ^V.jbUYԙW;Q@Ǻ.j'><lu3E-gO&˚'eOypZ_�;s:/+,j)]ͽjWiz|Zv帺55jvmUfr
    Nvj[sN0P;o>̆jv~eOGv{~&m/,dO-z>"uv3s]W1oio=_[-o0Jt/[gݎw$#]zf⿙/k.Y._=W\T{EuW\t_W"
    @iwE.)+.>O/OylV74/?аeuk?ݷ
    Bs#B_?O> 
    tl{AӱW}ӦY ,@O�Yi< M4#럡qHO3H˞ii1Mˇ۶x#4:,0-ggNh@gƳM=x:}.BWp7ܙLL˰S.j{;C}m2tjX&St,jDZv&Z=>,dYs˞xBƢi2`Mma2ׂ'Κ'K夬YԮ|_9[yƜiUsZl5ƖafmzܱfG$殶ڤB(o3�tWz26)NӒiZ;ꎽdi/.L!mA>|omhxmfjog|	v,f޹mƻ?6;}ve]}fYϬ§ӛ0㋳v~q/ͪҬ/:O	[
    Fh=}*NҬ=_dImY]1k_ieX.^_!/H/p5/_rE5޳ܜ_y%DO~n~VvFW~_McH/ϟd?UW>z?3o?5^}.яQȝ&_nt*23[8)ccdӫr³ͽg-	Vnt!6{Vx>IoVZ˘7H{Iғ韖r<=A]ԖO�xT}7/D�<WZm[$Q-h2uDj&	}=mu.jҡ}`"YXz[WP-3&BUW=Vvy<ܡӇV8͆9^%FGG\DΨf^uf=
    {i{O/z}Wqm뎓Sq<++-r*3Hg;__Uۄ1)CZ:Ћ^luE7^YK|_dW/YK]y+/|%[dǕ=߸]uɁ>/̑y|sDV%W]RK)W^K߿W^Kt.]K%_tS]!5yݻvg˷t.yMmo}emZ]]ùO؊ v+ḰMoh>B)#q&t?�}9)qY{\ <_sUݻh쭆ykHoꓖ냊9Оa=:,+Zrt{f[fp>MH=z\ҒӞX.`cԁĠ/.jע1eH.ͼꀵdɄ^=M:;c\k}g.jgwd~{zj<zǑECew߫&HjLKUk?[W-,�ќfpBX^TpZ)Sqoj=5[?]Ҳ/-žyuoo}MaϼՕ_[%Uɶn?|[kw#w
    56,ٸo}{px˯Ҋ9_Z5Kk|iݜ/sv
    _qv}Bw-:>#t;WЅd{nb
    Wl-ߺ뿸9_^3˫|yŜ/|ịWR7zݵϿS~/~y8n9%q?c6	cNuqIoAo~3׋M~o &LC5,F6PZD,ʐV@nvyGNK惴vMBbZT8קx+=.IYYW;	Z;:Brx,;scoE_ioo۳6mY@5;Ri¥ɼkg1eETa~õ5@7S~S1p�gnëVlkT}ռڍj˫ÿ]=NGMoW]zv&mvZwI[
    eom[kh۱pіNXba1۰okɖ1ۿlYVl[._GW.Yk|]{n]e޵nf-嚚^SoU~tա]uGWY#�Z5{]\krl7gޜj[n{KIT[yy|nt+͆>]s4K휠g	鯼Az)zbFX4ҕ"j1i2(n0{Xe�Wo<m쐡wY/Q	Gw3NgAhcmp,1͈<9XLԳ}Vkk]r%ђ(tN6gQoԷoa2'GΚ'oRŇMU<EkW!0솴nSCsyBr=^x[Q]S&Ƒ9өՀ2i>; }t{MwlslaK7YlSU؞VlgaCo`a͖[m;Y#v֭y~:o̶m`m?uk~߯wp͇kGGdw]A?R)#fo{n]ʏq8Hq<as;7r_~wGVg8ƠȆ_)}Wx1gwW=\c~j@{/x1=<Mr5jibtcRTwH%Bb|쐮3 6'Ye :Sm{3g+790795+Zιb+;z&r r'{u9ZPY=9DGF;hE3wQ}M.lwn]j^oQwE-'hɁgy?<v;~{R;h
    Rr}],Pm=oIi)>bv{2j6Io:Ȍ5͕OT@uk'w\-W@}ö4Ұʰ[l[!l쾖ۏ(;Zغv[v5m$lad
    }>ݍ[~-ٶ_޺[w{owz[=_Od~"[dv6<<mܶ{/ο=෯3vY<TWf'޻}(7^ߝy
    9ҧ\EjmӮ{ztz&z)0O*c]^>b-;6DY[
    sb~ڋg49htXx<@pep{.Hk ͧGLm}vͰQ9,WuNgY6H}Z,x"Q۔Ԑ.lgm2Z.jk;h"؎:66Q!}{Q<[[6i͢f{RF֮*:UK~KTsf;MT1cx۵z|-ƁC_g;2_'I:lfM>;ɭr|R3$a'3;Ffأ`zm+1\k݊
    7-#ܴl۰cˇ7M7-ַqyVv[.lӺ+_ꩯMJ	b궞f'7.?K̇嫟xAaͽՑrĜg}~؊cʍJ&lqSܘZD,ͺR܍%,i,Q�m4x=yVrW+ijf=<3ki9s
    IR'QXqilsj,9A5:Yadj:˫.d0r8.Y
    9NP|\Z6F}KT]n{:vEm~4 +{P29ֺZavwQ+PxՒtčj1?s̙Z̫6·f^znϾ~N\h0Zc}׮׸}oeƵU97^}n̾}O7~k_2/d_u?ǿ}>!\ǿE?u|ڿ5g??o_s쿓࢏?=rXHe}VҞ~+?yy/?kbkw<Ďrni{P~s0k<5Lپ l
    7@zjX-&]|ۙotex-�Ϝ4Z=<Gi1Uz7vՈ̐qD}C쐶Žڶw.3y-d,]dH[
    {F}뮓B:Y
    
    ܎ڶJOygJ6ν	^5#U{;W TO϶z*gj);ϫfoW[%sh??Nә'eD3a3Ƥ
    86~jH	NO>)lҴ3s󈶩3#6:cYڟ*g>K YE`v=i2Zi1gwY%9#h-מZfY|Εg'MPkn"ֱVrij
    -Yy&5h-f"<̐DfXC4pme]터-&̡vYLf+W;aAoxY~+NC&sϢf;sdZ/x6U"-$CXS=d˓Y]2Mfnf޿ܘX+TM#U3z/AbF@4f,7:3[|pg@YPMĶlo~zLгc;$;ڷKرŽa6YM}dd-' k%%'k>v@u6AfƢMRBY&e|GZ)irF[WvE=(5)6iI~ˌ
    nzn/-\>t=!oퟝ%
    9=Ltd:{wݮ3mtf،(\Rvp#˶}י־g82Үik{\2g:qd.Pk%Y.&pzQBQR;k}e5l_lI[˓PM;iiij7ܥxO#�.im/k(Ǘg2=̜a?_fFje2c#ݜwP7YFN3HKNsP}Tsz@pz4G5j铜,.	p:)#4t̄jD <!m60)&(3(F72ŵ~‹&ShVۧ|\o4	7"{[eԖз+f@x5e>UrꢖgEٙ#h{,DZ.`/jE~{fQsfjKbj=,pGjWwwaAڌp{G9(<TU"�ɭP-i8pa+N:\뉚^5Y崳ZUԳXi6;?ݻC@ϫ.tfZqDߟpi3?!D NзjQ-h-JJA}r7,;ݤIcT惷l&7SQ5h`Bgp˅gm섶rZ;=l|BDUgZɷ-GΡoBցYfQ{\:l}[ǑY[UPA|&vGcޖC*k>EvRLH:x[q5L2]j1GE[z·V^576�8C55[^ke*(?}^ڣ}Rn?�Ԗw3}f;(CY .,$`zOY(mfat:vRx̬qb`33sY&Zy ~.N"o{9{vv7RaXZB0tX3ٳߥNm.oY}.jYݐ6{B7(i
    oFK}X,ܨoJVU
    ijgo@˫vq�whU̜8q:�jv�gP_L,bNK\jO[f5G5뢶vT.+U5럎:<G~?yG5j޿H!OAwnlC&)+xTh1�}PYMRĂ%ˇܶI`&B;l6i9;m}s܌5950ZWgQg>˵IE:x@[]b+,%&s-ʲmer!j޵œE]
    9RȺirYۘ잮~rP=gZZAZz
    5uGUD=Z2Qͣj9L~.jaKm:tyBj43L&dwQg}!H茜v~Sh#òx
    Sڱ,`Ǥ2%V=dJ́!4!zt <mAo>W~9x8`g~[Ep:{uNgw gv9qdGfμ)>$iK{
    Qˈq'ZM&REm>OU
    %3e.c9d_G(3fQchuj'n|Qͺd.T{5sAy885ČGcZ/#HkNg~el^5MᚣUOөƗ
    yjw.j5Lv&uQQܟ.uơd.jMB834`Q]><~&NgmpN*;M7ij'[S+Ê+5U\Ӹ\aalhfC3u$|68T[Le0vRĉ~e}'o۸z[w<71nvm
    Qn#k1ltBZ՗Z11[`ߋm:_yH;fq_W?<HJ
    GK3qzdu|*l
    qZԴqфi;vLtZkhcCA3<鶩af'Mqa6)
    I58q5酴/[nA(��Vt&HM/(M^zN
    @(�
    PK5`HwN؄ϥtw%.P�
    H$d݀4 R@mPpH+N mCC"
    ҅ߜH
    @(41 
    A@Pp�"�	I�9P�aK� 
    @(PE⥫a@f҅ߜH
    @(PLH#CTG�i4P�
    @R+P*H_GiXB3Bҥ3>P�s~F�@@)�DP�
    @|,}V=vcݛ9KF>:>[՛gχiF@ضu+YT
    Y<֐f.KPJmf׫#.1ONp ÙP�
    dVHyrA\YU=xCZxϦ�ҋV^sf=M\f�QAr*+?0CvՄOj	5Ez3\ӫN^:5qf^DJ3%T`Y$^Z]ZYx%tUua~YJ@9 F>=-lղDٴΟ>e*҇:&ni
    wpP;\E
    
    iw1V	lINkTo3[_hӋT"'K).
    w{MJ�iJH/ 	Pl
    23[?sev5o2s͑
    s/tMB|w_upc}ψtՕSNٍ=InfY(-ksК/{h!=i#.]`wX]O)x O-=s�(񱡬5323=11GQ?.'2OZAci"t!VeЕpK3m~]%|ax6Bl~nޞbԋz!E(P
    OdɴwUsE29BZH6LȰUk\:7OLYjgt%wgt)!-++e񇛫Mv))tԲ8
    @*@klY!ME"N)%٘d>GTӹZC`OZ:WHSیZ?eF1_9]yk.8Vc2t;(]&t8
    @(`sF?p2mo9(,$V8B	(
    w
    it)=dGIyґB=dv|=o2\@ 4v&+5#L!t޲IH$.
    y[S`ٜUm='mK-B(PD)dR@cJi˳5]A
    )@lU()g7YS]l'^8pt%	NP
    @wi^|ה =0v^B8t@
    qVs
    qfq'Z@(�Jth0@:hObiL*]�(ҭdӞLV9
    d~bx饗脨~.HctT#(�Jt4t0;28'%B	2P�
    Et?
    Ҵ7˂(C|�r?#S(�R�'9Gș>YcA 
    Ƽ$tZ
    T
    @( !r8} =H( ]B(2Gf7o9IFANYK@(P8Os'b蓎9cU<@,32P e
    ptmL3OiV
    6bE
    �)k)P(�ʢk9OT@b� ]B(2}#5̓9�X.�y+ !4X89&n^x%DUfP²8ii�P64qpVϛW]H\HD\SsCu�(ғni4DVp7CtI 
    HCP�
    @
    0H&BK+?30ډs.'m;m<
    4 >P�
    @(  S)X
    ¢Xxh+6hZ=ռvީ|:5@.˭L� H␖:'5]nQs(dא%U&>7΀P�
    dS@@z=H9),L<I_OWuOsba']@:ۭϡ�p ؿq`oc�Œ&Q?f\3Yiw]qr3'8
    @(POo#
    zѱh -DŽ^az`ciF!]<DI~FP�
    L&NO:knᡮ	fz%DJ\ x^jo1Jm-3{b0{uud
    s(�H=KhtwTA>%U GHf]3t(#g]Bzl"M$q.Hwcǘy!M>tK$yBf(`\
    uq8C{9G0�$*>i@:*;<!m҂y%5Q9,PQne
    feXOv-cNY?E_q\ՕKE/_/0Tnb\}`-(B>&hIIkO:W.GHNi
    .^<B7,Su%F<ӱtgrt?Yc֓GuѼ~pPE<0<4=byҶD6==y4"9
    (H!NsT9B	{t|iS8ٚ3M,g\LPx^g0:nky\fɍZ/sGCa mF2O^i=QR(%!
    OKybyBÙV(ҜB mİҩjb8.n:"료ʝWQ@Czﱾl,tAC<!3ܖ(rP,Zu&xwgpxep/(m5ܭsOUsj	w{.dzHi݂it:`i27Jj?pLAz.* !
    YRsSz�ScQZ&89PAlOTX-7gt܇J'\n<+YWuFg^am3)Ŕ^|X?O^t
    ?H&dvOZ̖ly�nFZ\ ]%Spۖ~X\(F"I#-QYqP
    *i,F3td[U
    /ʝ肕#Eo"-.ϕydvGZ޴ȬS(MEa
    OZQel-D@:<7#=3HEe#Ȣes3G']6}kRXCD4VtvQx!ًo"xΞY$2A(�Ҝ
    6Ei&9jxyY3�"ޥH
    
    @U4s}?Ԅ&֒K=ڽytYL}
    �ۦP�
    QibiV:Mo" +
    H'Y�.]�X<}pt/
    H{P�
    T'ǎ
    78Ia<]L̊VHc83Ó.ErXw-^@qO =2EisSg?<=IƝi,3Ƹ8t) 580<EP nn
    ~a>iuO�k_yW%tPc(PA
    d4yvHOZX}u4 7J@�5
    h>}/fo@4J*STQ)(PRam-V+H<
    �i@:R ҵҌd^H$C;]&HeoB_RвLi17Ǧ?@!l<_9z^P_.TP6p.Xző
    ,KS	U!_Wu,H-z
    ϘTkQIɛfɓnm$y=G8IIWeti>R" ]=O#P>#1CK!s	6L@Yȕ2ͻؠ}gnSO>BץYĨv*N.J%
    rl.i<|tIұZX(@:>5 %d#i(3UvHg,sg
    |Dt=~lIzp	I5*偐>~np
    HKKfBpb1upsf/3ᦝZ:yBfg;j\	hl̛2Kp\J>{
    5miT$d/4rL:ذt6[̞¦:m]{u:&xDs}Vo2ͯhvtF7s`i,SRIg~]_%W%|a_wP^Az ?ɓV	b@\(ҌNs0U*Υu',Y:Y2KPeU҅)F{#hy㹏L&POAu'|ulF=UK;	
    f*!AŔnlg[¸o.2|E֯v~᭒#r_9(@"Lį2�FmTJdɱ__\[Jn4C?=u[ ]7P1iH%?U?<iA
    ]9w)3L5>iKA׹YI@f鄹@W>jk4+Io^^C\{dH?dXz4C+g+#JĽT/.Rfרb,ckFatKƅɴh<g0__%VirZMBXI
    ?9ƐDV	~F�i[gз+VS:uj
    lcyy⭐}T85+jhe'$=v@)H)O<Q <򕹢&sd'$5Y/\T3VHL׵iAAZ컠"dz+NsvegH DE&a"֙\Qwσsu0e4oXM&+2O	Sb%
    FDd50W6Jzk`@Ev=EZXLo#n~9<=3мu~ k` )ACzC�OwKGiwO@|Pp}
    iXs԰Y3.r}8/3Ǫ0YY
    ~8GEiϱTQ;c:Au
    /C2\$1 >,/1yo1C:ߝ++kxKkY
    #.rYG̲HfR4? y	$ӕPʾn{eYh?3@eϲ{L]~OE{{D\A]ayNܯ^c['O:'%ǵq5~6V>Nu+H[.X¼cz&O7mL)^הv& zdކ!ԘgxAN<yҽSxt!G
    QKJ�8u6.�%CkĶadH	 Q]nH$g
    �!YN-B<BzptZ 7/'Mc#tK/#\J@P_�NP i
    m،v֜ēOW@:?Ju ]
    H
    t
     �Ht{<!趓NΜ9wP]E:ac
    w
    @:?Ju ]
    H#M(�*MmÇ!}C<iLؓ.ln~
    �ҕ֔P�
    B4]4Ao8
    ΏXx ]iB(Pi
    Hj{ɸ?=<
    $Z
    HWZSB(P
    $	'N6ғo@:8-M�RܮH
    @JSAz| >BwO5JKC
    H)9zqӻ/]
    P }
    Mt7ApIinncF.BbU`�R@+VB+GyC9ҜFJig
    &M~W3+) ]"HW	Նu1a4-I+g:HvXfXAZxV
    HfhTQK(PL }SBhϓ&HNSib׮Nxf83|"j 
    H7@+飝sx6ZpIs-9og+yζbv6ޤ0ڻ>XLE,o +! 
    Hׄ@(`ĩc]|9lh9}9~,3rhTB׳5n[=/|i=~]n,}Hd[_r{X)֖#riL.X@}D*KP�
    ''N;5ʬ{Yst7y3Dhn%8*y膴
     eP븤<fXz(9BZR0�ˊ([TBY؜!O'Ŭ@z!;z;A4*�ǻy!:H6VvHoEʳVnAvdN
    &Q+3e*
    ZId6<!ű4X,Ff%+�% ːq?i5~sm~GNP 
    X!=2yLnavϜmpF[L -8'+@:n턳yx]En\ǟ[2MEE-'\yDg/X#ҭe.x	ܱΥc&<',jojӦ׫K~DҽRשf~&H[ӳCľ1C@tSϸ2Co\cXU=k޼�Oh{&g);llL5qcpwjIkZ O8x.#KuX=HS%7BxH0dϷ(oV~H?	
    ^Lott4LGINcJW'._X`҆;~An9:-N^%O[J<lt'؍ÓN*U H3AfC:
    H~ffht,L6൬Җg:v|0N8}Ҟqa)�C@H(Cz}H yIv<iN:C8V~6iK_:De&nUHyA<ر2T:^
    X!=:yZY/14#P=xI@Ӥh9l.S3}U
    w;}2GDԜtn;I[ÑιOOqrr1r"#}
    
    @Cz4DkדfH|]sUv/f)fUq1T
    O Hy!9<m|&L'{%(nvPf~u�JPJR
    鱩D6ag+<鮓gՀt%Z
    k!9	.G@Czq/T?g}}rFXə	xұcR@@cF1@Bz|Ldd7?Ou61s[n-Ql�K4NP(�twAZ>9-䩨 iʉҥH(
    @*@ ǘ<)iCSnOCZh<i@.&P a
    Hw
    MiBwT4@:P�
    Rt4+fþSdգYBõ݅	K.FQBF\cyPP�
    $L陳H{>eSew�P	k	P\(�b�Azrlim.Hh:yJ띡lli=A!�cyPP�
    $LSg{GfwsH5}{;rgco)%U�NXKB(K{Gy!=0vZ:"H븵~hmlwyg9%� P a
    hOodF
    ӥwccz?3FzNR*�H'%@q�SgGy!=HVK	t,w
    
    @) !3NQ.9	k	P\(�b�Azف1scCgHH~G�HҧęIG
    $gH'%@q�ЃiftiX(	S@@ZZg͔~tw$Af%S�NXKB(KOiKJJBA(0LH2TvCT䙙3,ZI4Ki]鄵(.T '῟:mtAJjS@:;
    @ RGim\U%<iLG'la,=VW¢`d|/
    .v:@:a-@,Pi
    tscϪ
    6nlU�kd33.hȊrfcyPP�
    $L,`M`8VfFL*%ls/2Y	kP\(�b�1VrF
    v366m<$}hܐ".γG[kY#mUܹv۵HXmzmn%>qs~Y5meuP)$DD~FFоH@~&tlw
    @)@m]W׻o]}Y7P`lgOiy5LH mN2[9LN8Jc9K~QQw'%@q�kV+B!3P$9:n|q#?yNj֔8G_JW^Ko*}% P a
    pHO5-!KݐQm[x6p,O!/z'zXŷsNXKB(Kx{o-wք
    (VSwjxi}،]H%犱nct
    <oP� {P�
    V
    ii/$'-{`y1-{x
    ]!gƙ
    ޺:t>r="-,ų&%\`X'B(�@!w7(IS՞.wVGy�H2]WvO c%Wڋ$2(3P :LHAH`FK$:T"�IT ǦU;@gHGWdMP�
    Mtﯮ#yҀt6sLM@(݀4 H&P�
    O
    i0ײ'GpU	�wS#g(�ң@nn`IG� F5P|
    0HNaa<i@:2%=#@|75rP =
    j0׮3KnXJ-:i|^H@M�(!蓎ē6`߲zZ҅ټ.M�HDhxgٵukر!Z:%v$Hps4	S@C8-l|y_@mpC8E
    i=цrk
    +a
    .T`<`O*um~ 
    @(kq =E/F/kfLgGsHm۶z?&egM08˹#dH&P�
    O@OAZq{n6	bjsoIzיrؙuH tnj@z
    }VrꅨeGK35íyHp4	S ;WrO[Đ6k@ٍi;;[{ZG܂Qvx
    HFP�
    G	oյӭy#͛aei/wwKyĸ1cNW_.l>i4	S NSʬ&N2O:
    H"ǀDnZ%ֳ
    @(''K?p,I͓TRNO#@(P>�<H
    D/wS#g(�ң􆃃ڼUzWnifSbUNO#@(P>@Gs.R ]9C(@zt}ixz㝝MѾ(G7-tz	
    @)ҌqO<5==}QHR`,廩3Q@Az'<L
    ҭ'N9}̙_/nR;@:=j@0 Mf8!-m_ MAs7ʗr/c.M�H!BCo"V	gϝ;%_+,.VpRjypŔ/ 9NO#@(P>Cc	3gNp[qsgmLqiffݹ
    @P >sfJ\5C<@]4 ]*	@H<7zbr۲VA~w<~2%%Uaq9yD%bK|i@|w.rP"if7}iLSk\OzsN/
    ;Q@ҀtE4$S ;%9c8p`[<Z#񚻘}J'ʗ:G]?7�̣1p|75rP =
    ^F114+B7UzV}xVMo;s#t?_NDRrR(_x&P�
    R>CQni4n^އftPιPK'CҀt,oj
    
    @(]+J'=999(_oSU>)}7ߟOԥzA:>R|i@:=-j@,H<'&&f{y#D/ 
    HF�Hitoo_oWU}!1p,=�j@\H6[[[IX
    >yk!)_=oR;-rA($|[Uz7ؠcf[UvvjtDR/D;I:
    @ H
    N}*gXC A-#{8B#ܝEP a
    $҅dqm@;a-@,�KǩNBA(0X`PhƸtZ
    @X*`@8P
    H}) P a
    0HLftH7/X-0vSz^UI-~I˚" �ŅP 
    (HkN'.F,@:t,w
    
    @)@n'HKN'C$�P	k	P\(�bt]tb!F\Qv<Wk<yZЅ";=*$@:;
    @`\8]GοHREN}1yL{g1Xy$vP՟'tNAW=Ԟg@:a-@,^Ws:ɐFVg6󅆓ٓ͜ұQ((��AAGsz,4>[XF s �ŅP 
    pHO&H3M\HbآϘDYm3*\3_>E;Ҁt,w
    
    @) 7z_7k
    i`.NhZSiO_E|S5 �ŅP 
    [Wt1Tx<+v+j雠9ҖE@:;
    @`_SsdՀtYL鄵(.T ;bOt�9$,ecyPP�
    $L
    i5]cSgyg.) �ŅP 
    H/NK�$b1^ecyPP�
    $L鞱eڈՀth�	k	P\(�bҝeb1^cyPP�
    $LtҝetX�	k	P\(�b�֥̙n'X0Ʃt,w
    
    @) }bɎܟnM.â»M0C3=U	k	P\(�b�tғ:;+Პ(s-ycyPP�
    $Lt#t3@:4�@�鄵(.TCzmҜө4B`z1>k<:](07poVN:AoB?7D@:;
    @Pn~g[t!01O7ƔǼsY_ݥZ4$=[^L$|[-@:a-@,`y{+kzVt~n2
    ں6w<a8Ӡ(.	A|dԻ\%zj@:;
    @*!MvCz,t_5һCŃDB=j@:a-@,Аt 9qUA_m_9C?ĥ9t9�X(	S@Â=iLޓ}j=pL!jAI3͎db^ͼS�shuI# �ŅP 
    &N3yDYK$]ڛ‰� P a
    4q[K? ]ͩtZ
    @X*@>5=i@:'@BA(4$4mn@QxIk
    P^(�⨀t[[Lkw,EhsTEHvG�HtEtP�
    Q'MonKG
    J2A(4ݬ[AU%bVNZSB(G<SӀt1YUiqQ&(�@ 'U@iKX٤#@:iM@,ft:ZZ�qQ&(�@VK�|P�
    QC�ZnTaE\8Oha_OcvQhCtnxLP�
    $MCZōfq<bTw6rC_o%O˜;9@:i�(iJ7HnggA{O]A:[IFP�
    CTCef8 P
    ҚD)^'WI3ڈ#];rP�
    $MAZy.V:�>oe8f@z'
    KڭB(�ʯ@ ]X|W[β#]%P 
    0HwmdO4hsI?noP(�ʯ4qzk$.TEL�(W�7[:@:j�@Bz<r1VsP�
    $_)pw`�oP(�ʯ� T
    Ƽ܀ton�
    @+�HvI- 5P
    �I`
    HF	�HwJn@kɈi_N4#;@:j�@^:ِkF*c� ]%P 
    #0s�it�
    @+tKj
    swgg/*m�|Y[>N{KļKuvxWB|.sP�
    $_"HnǭǹkMo]ur
    8;ISzK[@В�oP(�ʯ@ wT5ϖAJ179Kşe?LS{F
    Ec|sP�
    $_Aǻ,@u"ξՕB]lm6c@�8P�
    _CnK72KqԈ;$o2.-b[7pJ+	 ]%P 
    0H.qYj]|nVgϘ2֒
    'bJu4}dORd
    c8P�
    _%Ҝ8V80p
    e
    ton�
    @+�HXӨ)R@CZ:O.*9!x)j%P(�ʦ	i4Y%CZe1)R�.2P�NQ+@(P68ǖl]4[$�
    @)@n[JVFHd�
    eS�ltid@�KNNQ+@(P64)-Iw\˿gN@
    KS+R~WT|OvO#c(�RUٕzO%yB]sS@K.dm='YOSH@U�()^%Y$ÜHw�P EnxD#BӑY8Olsyd&N-[l=(^K	jGڕ܋<D($	P@AMI'9 IT	iKßxǓQ%q>x{k`;eֹ,'8we)Dc1("	P@BzWRCJAvkou\\J:{_<H=9Qp}	QD(�b2inSg9p@bV)!-T Aw!T8ͷ̆HC�А&NK,*Re8'ͣānK.k
    W+'5(\O:=�UCz\:ɐ]etJ?8A4p̓yjKS3POpAٵ͓)<N3p,sIn(	RAw|{ҥ	.E&LNP+B([�L4b֩$i	+HG�H3>ǘq2U* !@:A�
    @lp Mon+�" {P A
    H/ݮ
    .=* @:A�
    @l�+�" {P A
    (Hw.қ' V�EP 
    HH!HCtze�(	R ;bO6IGɲH'@Q�遴w+^!4OIy쎕g=A( i`d@2K
    vm?]`\Wi
    P�
    VAڵg%]fi;+iqEO=A(�H֑.?ڀܛ؆CQQGCN[X9vsمw[U6Bʝ|`U�#E
    $OPp;0pLmiƺ5M]\1iV,}eBʡ<m]7t>Rly?wDdk=|҅ߜH
    @( 7ro
    eI-	jV1\[rWilB 
    .}i�zeߦ:
    Jh\�+!MN2e%q /N˦*p-<hxM
    t};:;!y̧@gݼ}҅,H
    @(H
    iekrE=(@7	*Y3a$]n.[j2Ŷ^HG}k!?(�@
    
    Ҿցc؜Emw&Ae.8bzz1T\
    8&
    "H^<z"w~s"(��uK']22aK(E6 
    @(Pt$ʘ	q}q�҅ߜH
    @( !]ӵr4x҅) ur 
    @(P}j`09Pi4 o%t4(�@
    !=6u/ T?gW?I$(f9�9P@A[Gr-5yh\�+ ?z_7*.@:5,gE�oN��0!8]
    HmF�(\AZ-åJԀ8SE�oN��Bzyg0p,굦+VF�(\)=6
    HGfH~s"(��}=bX!%pO%1}EL�i4.P�
    @ HOY-,l(ڌR`sK6Q�zFTD@)@(�4%2m.t-dz9YYA;<F(dHqP�
    @  @)@(�LHg:4]]UfiP�
    @*4q:&*~ycI@�\B:~ArQ�^FP�
    P	kjI?�+  V@qX"@:{B(B�$0eSZJP�
    D� �%t22P 
    �I$`H@�\
    i-)X	A@:{B(BLH�i
    �)l-P%(�"W�._@:{B(B�i$
    �)l-P%(�"W�.	( �HSk'C4Z$�+  ]MV"a#!)T�lt
    [T	
    @pA;KJJ^FP�
    P
    ix+%+ UP r�a#!)T@AteCصSZJP�
    D�AFw3cFؼ�ed@
    ^WO&P
    HW$T]i@:@
    >{P]EN]G[K$]PP@:{B(B�2USZJP�
    D� t22P 
    0HN@7)eH@�\	tp|ed@
    �Ȳ
    Nak*A(3e\
    �HG~/#C(�Rd븍Ϝ4`u�SZJP�
    D	ij@tKIt22P 
    dٕ5=&X$%-}5�+ =(h'!9
    Hn)^FP�
    P0t
     FP
    @:@
    ���#!)T@BzX<iLaJ$nuSZJP�
    D�A`	HsBzEM7@uKvʃXx	 �Ha!-P
    HW n2 UP r7fXUWґ
    @*�HW,FK[q@:@
    �ҥeUŦHG~/#C(�R� ]-m+�HU: �HC4pl>cbVNak*A(nH3TdUŦHG~/#C(�R� ]-m+  nKK
    I^FP�
    PՀt`SZJP�
    D� ]ZVUlt22P 
    �VNak*A(tiYUґ
    @*�HW,FK[q@:@
    �ҥeUŦHG~/#C(�R� ]-m+{fd-}tAi[w
    �ed@
    
    3+ҊӀt*�E%�+!=#1.fHGHG~/#C(�R@hHsgthZ)l-P%(�"W VHh)L^FP�
    P	|kwS[Ct
    qZ*)l-P%(�"Wati Ted@
    �N2Nak*A(t led@
    �N2Nak*A(t led@
    �N2Nak*A(t led@
     Hwвz4`Nak*A(қatDKw6t22P 
    �fejH@�\@lKwƀt22P 
    �fejH@�\@lKwƀt22P 
    �fejH@�\@lKwƀt22P 
    �fejH@�\@lKwƀt22P 
    �fejH@�\@lKwƀt22P 
    �fejH@�\@lKwƀt22P 
    �fejH@�\@lKwƀt22P 
    �fejH@�\@lKwƀt22P 
    �fejH@�\@lKwƀt22P 
    �fejH@�\@lKwƀt22P 
    �fejH@�\^k	l
    ?2Nt22P 
    4 Jt
    [T	
    @�fHG~/#C(�R@XHgtZZz)l-P%(�"W t-W֌>,	ґ
    @*#{1p,P-v�+�HNH+�HG~/#C(�R� 
    D@:@
    �%A#!)T�OK� UP r� 
    ґ
    @*�H%Q�Nak*A(tIDed@
    �Ӓ(�H@�\@$Bt22P 
    t=ҚN@:@
    �ᘃrT�^FP�
    P@:Gp
    �)l-P%(�"W�t22P 
    
    q Wt
    [T	
    @�+^FP�
    P@:`Ubt
    [T	
    @�+^FP�
    P@:`Ubt
    [T	
    @�+^FP�
    P@:`Ubt
    [T	
    @�+^FP�
    P@:`Ubt
    [T	
    @�+^FP�
    P^cNf{:{XKCt
    [T	
    @	it xFU@:{B(BrnxQ!.�)l-P%(�"W�N>cY@:{B(Brtc	8
    Nak*A(t	2ґ
    @*�H�q UP r�8.e#!)T�NX@:@
    �q$\
    HG~/#C(�R�  Ʊ
    t
    [T	
    @�H	^FP�
    P@:@c�+�HǑp)( �Ht
    *�)l-P%(�"W�#RP&@:{B(B��1U�SZJP�
    D� G¥Lt22P 
    �)�b�H@�\@:KA�ed@
    �S�8VNak*A(t	2ґ0.
    ,\;'ib$S�8V1PhX_= 5HRU@1)Dt	2ѢEo}ppٳx)H
    ҄~IPt   Ʊ
    t\rD�x1=
    &bB �8.eErs΍V4�i(FjIH�q h*  m	-+P#R\&@w4ңx
    iHq SX%V MN:or^7m|[W͔87IftAسInbEօU+Os`({{ed;Ț{82etYc
    Ҋd9Xx0US@҉g/m ]Y74+ÄU8u
    t �1eUb[7VzFm7N
    f.<4ƷW䑣$Y!yJ5&sO${rO3
    @:TY��T!o^xS/l֍7Roj:{3KyH}(<LGo<%+
    Ŋ
    +uzp/%CCA""pwP�1eUb333'k^:L?__S~Tޫ'qvI“+wu;Ȯ
    Q_OGi[iOڭ!^o;^l[O ިT@
    ,(<HP}d=蓎/cU2@,@1U@@y=w]Յlnn|υU='Ƌ#<RWɓՅwjFsH^DO{Y5"2㬐6+[U[%TUSYnE*/ +0tLbX&&&FHjsI-@d8WAܩ4%ut{Qy$+}b~y	ͺh!B8`�H! ]b *@>%H߽Aq
    w_\U5Y~},zOyHPeىKxW!M2݊k_B.팺TXEf3G|9yIpwЖ�1eUb2BΡ%q,e罆'XI7`4E&g&t	Q%Ni}^F;Kn^}AMeV3唄Ҁtz�%fGr+
    ̵U޵ޓ:gJXL@:hKO!2*驩xydї4.bu5UڣqN_TT$B;=\UM��TCx
    oV}k<ZsD|%E.2 +0tLbXA
    &<i(FjIO:,K
    �To~K)@j&;bSC3Ϝ;aFLIYhL2*կxnr
    	)ce('	mXq,,c�WwH]ib$4g
    HǗ!(Q�N3)X7@:9�J
    @|0'-fAolQF%+k@:7=J@rmK5ɢJ[�4()U�.ҟ) ߛ%P 9
    �eYjH'@I�@_�P�
    @R+!S(��@>o\�%P�
    @("�}
    P�
    K@:]'j�)R�Nї@(�@�}6P�
    @("�}
    P�
    K@:]'j�)R�Nї@(�@>4˷F@m�P�
    T@:_�P�o�
    @(�@LpAWbA(�@)�HW7B(�@b�UP�
    @(Pi
    k6_^{JSP M
    k{WVQI…UDˏk7忼ɳuX/ fڐEiP�
    @(=Қˎ}PF'He~OP/>@RF
    ߾zx|̙d^O&~߅):΁P�
    Gp龉8:6UF'Ho$l_T}D=yτ瞾\wCџtPM&(��/;AdUD )
    r]U'H0,<dg;ۚ{0zY~Dhpw^_ctKp߾迾GF
    @(PONNTQBܹs"&oHS?4EE}ɞXXS3G>t||k2�,"2P�
    X;1
    c/Q$?Sy䅞pR|P�
    @D(@ZNNUQInhſG릦D0~dttC5uGő#|;?'
    P�
    H7
    
    Dh̭RYU֋o~QfWU]MY!MæNU,-õEN훪f7QVnʫOX7䴷w؜ęLS7P�
    _2@cioͭ2]@k~X/�i4 MyZaxS>ⱗ�M(!�A=88:4pvՍoyΟUuӛ,wȓ~vtónz'PInr"yhVՍo3E_ZoX5롚bfQtOPHS7sp|[${5SFFF~苀4?(��GODa8]y>8k(wC~bDSUD
    "rF$ʗ!ytC{E,	'z(| M>kźbY}iEKk;�D4O($D<DWc[$?y&W^d՜)pUDi<Q{'^JAoފwtXg+#E*9P><{⦭'›kWo2w>P 
    i8v"{3ɋzrڪzNFgT}!+|υU=gM+}=[1/gGKۼ8El߼I?HE>4źWn迾P�
    Hj8mU׼`.QgX/]Suѝ}HDFb6T<K9L.g4{c_mIϼ8E7[B5{4'r
    G='G'>;
    @(}`zGc[CSkDcdv/^SU{YĊ.ڨD'2{4xq_ϲgU@6}|Qz8>PpI{{xqZ^~gw?R8S<w&
    	�4qZyN?8&NQq<$ֱmXgpΜbK^];Mg@ M`@{rb&;ڴFϢ 	Z=(��tc'6VQIъtVOnWM#'Ovt{52:N 6P�
    O⺩GUQI̐pſHⅻw.!+`1~5=[i5oSh7WGkz#ʍ
    @$*  ~C#kT0>TbBz4t~+y7Li
    2b3yϿ}iƦ$ޜ(3P ٺw5;|bO"d)hz_$B<CZ̄jZMLp(�@
    >t}UQI"諼;;;i:O}$I-Mo<4lx|y_GU?#K09P�
    @(>;>bO"Aگ~'x[S\o$IҚE	w)΁P�
    $NE}_ֳUM*ը$B/nDRb_T}!;,dtHYqP�
    @�)@(��(tIdEP�
    @(�
    W�.\C��P$
    �%B(��(\@p
    P�
    @(�HDV$
    �Pp�5D
    P�
    @(�J� ]Y(P�
    @�)@(��(tIdEP�
    @(�
    W�.\C��P$
    �%B(��(\@p
    P�
    @(<̫t
    
    @(��(}鍇>dG0ڪrKC/q6,5Eb=Zxs"m7hIM)lL&g<y?Ms6:`Ytn64ݞd#Bמ3!M\>>裪.^T߽dit~&yOfmKvJ[-"նtW{~lW{
    {Bޮ{VȺWVtsa.ʬ?E(5V*UzW]Uۻfk	[[ׯln;0hC
    rCCbc&nxiLtfw_\;V,Hڵ_#NGl@:39ʏhj}J6=]Ӓ;*Hm:]c�<,.!.K_b^Wjt;?Cܼj#q	e{:M+RcUKNXzEt-4\<stg:41�H$|u1H׿hKN[tQny9֑A"`;uAZ?>JUx
    _`A=ANJ'EwA^Sq:<w7M,&" AzѢE, Nɿ~WF&όL.QN¦Ό’ѩQX(FٱB
    !G/QX+?]w [ow#N_O`P�
    @(�@
    \/\}7$B?<>A0+W]����IENDB`����������������������������logback_1.0.13/logback-site/src/site/resources/beagle/images/beagleSample.png�����������������������0000644�0001750�0001750�00000112142�12021755022�027035� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR�������^ͧ:���sRGB����gAMA��a���	pHYs����od��IDATx^	ŕ[k|_͛yy~vc
    1ccc
    ,e0F47Fcb)!"$@"v@P*I(_܊XN̛/Uy/NDf޺]ݽx������@$J�����@B @�@�@�@�@�"Pg(�hٰ%A�@�$-!Ԛ!Fj[TҩǛעt	6J͜}ӹ~8@�@^B!!*Xy-m^un'phd(9s,7Vo&#6ht�0nG=]+_mo̹zƗ^M4MnM|G1��T"FIC?t_1{~W}NbꌩSg3y3=5cUkߟ&+6-y?97>l^}6ַQr|
    /X~ٝwkh،kQ.9�TrnUASI߯oȜ#3^q\o‘mƶlaBWpԺgOϏ?WԺuy~?9D7<bHN҄#;sObksO/]RB'ym;e>ُ|i)7g�4δMjag*,0+&⍥K=E{~Kbk""+Ѣ?csOy*ٳB9$S$G2|#~}%&/c+jEoL\5ŖS})*XOڤ~xuK^^mlg̙,[BB<f~rKv:MnG~@[l&ӶGfo"Kw[:K.٣BZb{<{oN?E$<l@@MoDw<	~Wcw^Y%M=?)p\6ЛlY~^gBEmpGܺ=ٴmdrݾe!!~??wڭM| /a+!÷n[6v6x|*5(ϷWzgB/P}u!JwyP
    J�C3ؿ.ыW>$mbK-!v	q۶'ú+?WmoI5JgR?l8.<4-F+_;vڜoIA67j*s0)E7M#BS))glN4#=npXӗarCA
    	/U:3�Y.>SL8?OM^<כmv<5,	釁AKM/#]S-%=[rk=b[[B?UHUs#k+2Nt>{F#vdv܋(
     �3۸uæ}Z?7m3E=l
    8/{XSobke{Ib% $w#KB\{N2
    Ayws4,H>4fd_%Mok/Xm^%!rOimp]ycO_ݸ+v]
    &[Żp]a?>WjuXBh/mY=MݚNҨvZ4ܠܚC5AJg_WMsXq@7Ϛ}8($*ߙ1kά3>u6ծԬ諈\ԭmO \Q@�lN?w?;g&߹D{o=gJ>X.8{g>w!zlYeKwHB\.YBt[޵寮 VM.x_N$UԻO>~/]9m㗕,)!^_^!~{֖Im[r_3~z!!۰Elkmmcn%XQAH[{ئH|Aꇍ.q�ئ%Wz.yCnBB-}_P;_̔v!z48Z
    ,�I`ͧZl
    4^VPK{5w=-}nT(#Tokg̘ዞKNzb
    x"U^Rk\u+|+/EM숇$(Fgp<d1Ǐ<#S?n	 wD8^;̕5urHgYjquay]ie&dZG Ԏ8(d Y%Y5ݚ\BBo+G}ȴ+uv3$s܅8da']&BmS9oW9O܋XnO
    OӌI!_c>6Gwէ0
    ^:>-GSP}./sv]wkpoJ	yPHUs>sv.a*yi;=ó2;}ڰ͚epXKį[^	Pm]a@n=]^M,!KPo۶aV 9aS?'I SkքÃ˺9mXŴ1Wx¡%;}BB/%"BhrAG}5`3BKM(2Z G		!~"@8[!Cjv<V	:҈'o	q%wL2uj򋣒w̳/B?nKkݒ\sqgF6Ccp0Uz({_sH8+xؑN?ta9|'afR??>:o΃μΛg\z#RMH
    3:_z1ՌRB<۳6Ij"V|KHyPH}b?^?ep,2(~g_Ovzu\*3t
    YY%,YFphjv�~Uێ>C9cyb?sw#	!x~I|BPBBl޶mփLza_t~i[KG%Afk5.Wz|a)ə<u!yŜsM)&!$X9HU^2|Da鞏)C(ȧN/^؄;o?Wa*?;ڬhpߺ3Z8{V{훌9$9#~}oKvxbobBEe˦ΐ ۸}$!!^7Ϟjk1g]ɃsH7$}cSH>$<Cswִ^?i9X]+fH,{k#/Yw}M6q\HSm"f־/TqʌGf׎<h^vwj
    ɗ98-Vy{ruTcw
    xh6].ărA?cBs=WEB!R~R	!>]e.v!!%9*Ϊ(<'g5?w#G_jA?*^R%HFr@7[É$y}iŚ~	!~ʛroijWf~Wh |0%ᇇɻ-!~;?tkvk^{y_\]eŰGFba	l=$WN$tޏξfL~7]<;s*ttƧ}bz|_Jrccݛ6oBb]sяwOu-K.M)ѵ|,vIkߓt#GDȧNt22c[\;"h@E0@�@@|kM{?Nmu/RE߱G]?+.W#EFV}돑x3uUwL߃ק߼߮{e䇪Q
    qAVx둊VgK!#OHѢsu"&YƶųVGG0ld\ecT38>Ȥ}�fGH^~so}@5ɚ-?׋NvJ	
    fREU葃ZHxgG7\.ʝ)~e1<x1L>}=R!I7$ל7>ک7]yC@BL?WUxY?}9M޶K	17nzySsJo,ޮܽkǃо8?w}>yVǷNFN,*q@:huG PH@�@II}mum7{B9{8´پb2}_!WBbϊQS)ĶJN9 ȳ
    O+&j}?իraZ}Pd2~z>Ng&-Qf]o]}
    rҔ%!S`TqCO(p283w@Zno߸J#OV2CV:qBbEZrbKw/unbYoWx롴BCD#.=zϛ&Ma܂iDI|kԸB|xgvKK&v;oy?Fu_	:!;ba0\윽e;섯vɃ𻦅a>K7U(+n	&P[a@Ix˫6}[r?nܸ=Cs=q"dXB8dzo0g2u/"֥IXq~WѢ|O/_vo[PGĶs{>_U/}O?~JsHmT>C?ξvWim,-QjF~Ð~O4c %]_8kڎBEBBqp	vm_9֣nkМl*w<TD	A*A�F+.13o}Wr8#l*{^HYm8#Zy	SKoLIc>,剞}[s6
    5OE= _~s)!DlgBHd<$wۑ!6';+Un㋂D PB6|ߕ騣B,]Ӯ&_y9м$"!|We؜|f=Weg*8Qm"QnGͶy>P:Ur_TDc
    Ձ�@$Dj+>kQPlc}%%HNuʔt�JTwduX֖>84m"?(=ݻLlRHDS�@a !
    C]DE	6JJ˪;g?-7h|g?X�b%ӱ � $ y5	@�@�*B@h.kI�����p߅hX#�����PGP����@-H	Q΂ � � � � P>H�����@@BԨ*����O�> � � � � P#bڭwbk0=vL4
    @�@�@�@O7i$DWC	02$DCf����p	)Hˑׯ7_,%*q	uvI;ѢhFP5n9W0 CXTOq+VZvuK%E#ZW		!<oܸqml"QTFmU}I0K`9f1sA@'ЌjF+*\j{tb !W^""*	q3o]~}M]ꁗ{g[oӏ}rsb#4		=EAՌVT<,�c
    7QB<uV!"
    DuR%!.]tŏ}#.Z87lmZ#/Zx]W?BB<uhFP5Q@x5=X:Mhزu׌CF^>,…˴7o24hR%%z;g_9;s{'?J֌5x r;!Љ
    nB$-7mf<3/v~r<>e-PDu8eCf|3v_ߘڝb8|c !-!4mF%@%cPR/"br
    8`)JSzhxuOv>i~rp-81n~Qns^MlW7z=AB[Bqa̜Y^F^+ HWAgމ"p67dz*96*Hk\K/!6l [$y)
    ~ܵyK[/;Kv,Fe %//}vĦ~owî݅w,!E
    Hk;U*0
    ^/UT 1
    
    N (!dDaC)!ouQE	!> |M;3}ؒ;<~pš[#͓Euo?O''8(.DBE$	8Jˤ/	o9al!!TLjUn|M&ُh::<BDgrNB0cLDvxuB9Bꇿi8�"**!mژ?dK#LGrUxkaZ\b~6e$E1H%1iV'y)yN}@l_[s!d`+ˤX&B r$zBFV{a0A	F/fƌĉR}2NaPQBꇏַN<ċ.sϕ*Bx&mu];Z]<\D7tx4w!ߜvcf !JĥP$
    XDHuA
    &/뽙džQc2'J-!j�;"tK}j7+BnE (!D{W_}mvw?gǫ(!'Եُ_}uԑ2#Z|oFS}Ib3beI:1,y=ة&\B;WC+[pHA.̙ORKu
    `}mS`|=S*8 ؛W (!]Uѻ­Mu}dž~yύ&~tpq?VN=،$D7Nмy[:?#;*blE;$DllFժdwtevJ<EBӔ/|:aT vsbK+vuU!;.lb3vip !-!|1ى}y0	HF$W5XJn}>F|J6Li94ꠃ'L3,1fc@֝7t2ٳ(@	۫
    	S>~=3x?bhEw.H"Oid[\-PWb,!&"YG;|ۅDE:Q̆*3wY_oo_~ov&!! !8_t_9ЌVpZZb|!.n]\zX^ALEv%!JZ曢KF}C~DJBaYvPBB}h\ci7.< Cu`רɍ"+	">PKTC(I_v*:fU3ZQwPC5_bŪUDz>K-?H]SNpqb	8%<@�@�@�@�jJ�)t݅ȅ@�@�@�@�
    &�	K*#^)$ĆukEggc.F5T � � �  )dȟ@
    	?2y+m_6}ۥ;>n^7읅 � � �?iE@PBlAls>?IIߪd~so8Kʑw\oC()ꍲ#;]._Qv/6#	ȗ~̿zuvն'FKz&slS~bh<5+)j
    vb'`-dY+]�$J-=Y4)yIɋ$o.LNV-mYxvZ
    NdIYWp<1s|s&K?֎]>AY-Ƽo0Ncт б:vz9's`Us~NZ^mste?	4%D;o-	qÞ{$s,6y}~#{3ĝ^}8
    3T;mrvLӜ3p IHt!g"%:=3Gh<ADz(!>9!!	95t$=k	
    .^f0%Īzɢ)?Hn7ydɔ'w'_.kw
    	!gs.'}'^ZBptz|R:wY855`hRszVÆH:ajs&:`g1~u.}~ǝU9}f΅7727
    IJ
    #WcSÕS7Q^bpΜSTB'eParnKY(%1L (!޺o%dAɃ$ܒZ䅻ϼ,7'{]{TC~ĀdU4^Qc$%?F?CO=}3{p%svO,7cQ8k/O5u??fUINr!5viTiN)[Ptg_"ş=EJq:ScpNG. !!4-0|A}DhBoCCJn=$a[ɽ$Oߜ:o\SSNbi<t|	AOIķ&^}S^6e#QGln
    d^yoe2JOfGT?fqfg+h׿]KC*kקĄ-b؝EĒ>1c6j8h;ƙm[p~4zd'DN첯9$}[sN?=L=vq$$D{NPB\~<y}N/Lu\}t5{]OB&I$24쟓G,i53{l:qؙ?y01W~_6IKH|4NaXeNs8~:Dž/;f9Ӹ[ç2Ћ]_�B-799#ڑ@g0R�$DԃLBDX|өϟ_dI5מw!ł91V+vff	'J{팚 '}oI49v|0r)&cF^xsi`F|NaNl}N/;by+YrfKC9W=E	N'RX
    O9<Ȇ?0>N|xIIv%{JluyPg>;oQӎ^sb"89=]pҤ9CM<(&!8ί={I
    /F舖fw|Fԣ˞Tf;{O}PCpkBv\P>ek7շ8T7.|^>AP�	e˿%!3IF NhP[h	e{CBd7ۃ,B<$}cc@�@
    [뻥� 9Ne@B4;/u%`eD��@(?nY$=W$nD !:mnB{A�@�@�*K�	|"!����WXjժk׮^7S֯_#)(3qRuww.|}nK蚦hjϢ] � � �  @B '�	?SX���LW4Hu& � � �&HD\b-Dy'FّFىm(;7Gّj~sA%ܶ2x+%T
    5(y^#|D69*$D}k-K}0wSuc?oW'Ϡ,!8s@c	pMmo#�܀j5`	IOKfPNrq0;oʖ.9?>m
    QF<Da4颩L !г0pu1w!P �$DUv"啣=żI߉iYo0O!c8M#
    wƷq
    TΧ*j(JJ]=\)Ax+qS|
    sӃcכӀ#\8puy1�΁kujsnZSF_c~tw wp5;]Xc=#}"70|`v]<v/Me1Qd	#]&4tqFzw*tfY9ն`WmL7|?z9n]WЌun,ERaC _b;kV|sLONY= X0M_}N/UaO;8s	Ai/9N('X|ba
    .zkbc p`l8E'I]t;ݚAg]'AR-50
    ZU<K١m>7cY(EBǡs9L:3'`v'=J; =OOY^eչ:]R_Ì.284|ݗ0b:uBpqv^,yW2uIL#J۸a[sF=0AbnDLv#n,Įzlf"zS8c?d !2L##!1hWS[QdrO-^B2:$@Kh>
    N7Dre)8Ei/G'uyHj?9؍,93UQ\~h锯i"zi?E~2s#g"ԫ㔬`81`j<`I>?1Ù}0r
    `F"!4K*Ι^c**y+E1z`[BJ79902V2otxob!&g:]B霡A̍ !rigrA)fgRˌ1E]oAN
    cb_R,
    )4()".D1x| z:yGu#1/)K{P1,;N'ٶ}
    NxY/ӎ|:;=Yz)U}\%!"oJuJF+ϏF(51&
    #Zcr{6vG'1y=)@kDd5%-K~rʫ'bG
    Z?x})9դȑ!!RO!2vz=$Пej
    %D.ĉU#Цdj̈́? Pw+ɷPwV
    oHvPth?@C	:>
    *~u4']1$DABՂ���@ !iu@BtZ � � �E�BBՀ���@ !ʠ:*!6n � � � P0=hz:_FRH
    y#nw>lvشƼdтG��� !H;bٖ}ɢ3o[7sBE@B`���	@BtR:_F[br;|xƏhɶI&/>*YDy߼r$m[P$;mzNWĶWortHk59Ṫ>@E5g[]5aU!b%Bn)†o.N@(#:bMLL6鞔Oxa2gvliU]>n]|;A	`swu-:叞y.ؓ'9D4:N8VERΤ9pzp̢@ҍk~06l9G.
    .:Pއt%DoϷ$ďL#9
    &'=\u	L?qn'>aObQyC
    [T6cxŗ>8mSsߜ'J=sh	<ΎNg;J9%!8Q
    	yɃ3
    DƆ
    8K0ԐedYgPBw֯L:9ɘ}Ln<D2WNw^TH9mkqq,G$/6 @g,K]P[5L5 T$tހ43CѮg:XWM&=T!Q1@vSĎ;l}~c>4'Gä2ёy}J.˒sNM~ЃIfܒZ޻^qsYoN:v5sՊ9УvI!\
    zBϷ׷2d/veY7"QF쥅Kvf]0	"NrWlPwD!+gƲjHz-	POgP5!8;;}iiDTuNh,Gg\4Ō 2_O91I3gO(0vT5{l.fOe0N^G_J^eQkQF`	
    J;nRuJryn;d󃄄q.|!_Bhpzƺ|˪>7٦ܔ	=i}#fF_8)'4X>5/$;i,TQs&~!	!]/pzߘ7|}d`}bǚ'13	Az9**P
    'm~OB8;K%jl:Ybqp,:S"7v+RZrPȬ_bgXChl|e'SON>{;?q_zaW}c]v^Wo>)!ÛSÕXJiisI&rZw֛e
     N{=;[6Q0.fFzk(0GusHBÖNmPF_<9afVd7Ytu[4`}b_0g|7r#zB59F7G7tL%dգ%mI`!f1{Jt(16Ff⠄X|Gz#w?O93:S.X|[y$83oj	g3LS\cÄcǙ&z[fd}Blb˧w^\Wy02%05dio!d''괟b#,fP*`vIsǗsFbg]%8K36At8g`{9QQJHbj6=w[BȟGnR΃%46(!rg+!|K:nAvڗs|qF8]/a0sFRqC3Eڍպe-$qP-Op@׫q;D>v|X~TO}t'"RߏF9O218{ndmXM{)7lD8cƈ(;)ABU܅; FU~fg%46xn_(	QAu#WuZ3Xp~0J-mKk,^o(�$D	Yuyi#uAkNKhl	!_။11N9!2 �AV`yh0`]]f^u`/KgEqYzX1l%dձUZ6{΃5P>~̸3Z � � P#9d511_=\}!~o샄ѴWA�@�@�M�6򙥑X	���h;+VZjڵWooMTUD[wKt[b_h{PAI<ty���@p"@&iT � � �&�	)?Að � � �(@YB|$\eS̡H@�@�@@Ȕ $D)û٨Hӛy( � �5%�	́Q HN
    %%VD?yik8��K�"S~\rHx55`	?ۣ-quP_J0Q'$U^5]SJAƼf諸|-cT'u;v��(�$D~rr;
    Ы%:OJd1l*6v:-.‘y]"o*(THbK;8@�@�A�? !fZJ⪳SBÞ.ۮȿ{&6S z3ANPI6cG+@�@�@ eZK֭/0v蛭ewhvĮ	1luH{iؑNu£,pNDrOm9Y5'_vV4;6>v"8KJAS(� � �C�?|K!0䭃šH?(]1h àDH]\~D3=;Δ܅8EW,h)�� !B7F~UX4ё[h[Y`%gW]qľ̼U]a(
    c6q^	r 8経4x���@BW(0CHR6\hoF
    w!j:cv4
    >]	 � � �$D~Y}ZO 
    pyzis4ر#*\w!h+!En,sKw,P/��@5	@BY8Pݚސ@4+Ld?%ʺQ@�@�@�@ !Le=^a $D	4@�@�@�tdU4b?BFUBsg����EŊVZv:+~?k}}}===j#Ee&Z*n%//m}a"6t	"џqċe@�@�@�@�'h$�	QF � � � V2h�q���(�$D'	@Bأ]rŏXG\}*v&>n?Q֢děNW꾿N%c{RefM.'yhԖE$D.i.F䒣ftֱ)|:(un^WGɷg *c^ݎS?\|	-ɥRb)OѥhS!!Rd9E3{wv+>Wׯ\yæl.~\i+,eQ8E!!c582#
    %S;~6;P.v@xVlՔ_oσ}ZAAK~T]'qHYqsN+9K9a<5NlkmGnK:bS/{$9eLm1۱w
    #^Ҩ']S#CWynwFur8եDdL,tNtvrkTg85(i_sxׇswKD7=667U=rb7Г>93c6뛯T+9|2%<!!jEgBE?8=OɏOydS[N~'GxGI# ~|{Ʊ3!(5W?s94L_ljz9-MŶW>ѹُGavd/)jz`:bMpt8-&17 ޜ}Alы
    ?D
    -3$s
    Γt(v^{Ds#$DM%DK@y
    >a}sfmlۢpb8#?G:JB)NpPP"GK,<iJO%57mㆇe6Bq&v)W$|޴Qp6K/%UU.i(:g{aW2,X_Q=r02oND.,s|kG0ވ`F:s`>N51%}91~tk>y>u-Y"
    A*8?~q̬&v<voYPHz
    &
    N.|O8sI^D-]%$6t篵&8O׽)N!T,?DG)c@GpB@Qs1N̏c$78(0f?9p&X	i$'}?m$	gZ!}'ȭ	BtnW&v)ExB.~@BS0ыn&f+;S`"9Ь|i3WKC7fw\.u͏N
    s3\?]JkWx~_,ЙGz:NS#fJ:qbEN!Ǡ)t"J9z8F=?g! "<낄Ȗ˗v~B{%p4+?}ܮ__~~U	!grf&{1,뫔^sƱZ^c]4Kd�z38>E O{
    vJ.!'Β'8IB:Uy uCtDיљyg�+ho-+zvbm7:<btNg8#q>YpUgek)H	QV&!ZaރxUP7rrSbSCOO*uh{5	gtNҲ
    
    wZ46ɨ…U*
    RȖɗvvn{^yrxb wU(kx]rw]G]J3KkZ9lK0(ҙxE:U)x+3@B&UL<$H2zP7gm
    &v/XJD1HW, � � �$�	-/iڟir>N?S6qcꏺrҿ9( ABTp�%���(�$Di"
    U]~8>bU`@�@�@�@	XbժUk׮]z{{oz_Gv[b⬥b]?=a<Nl(	QbOj���&HjK`tK_kz7{ٿnrɮ_K_XCB'`@�@�@�I�k
    Uwp)C � � �%�	QٮcKj㢘xFLwGzNWĶWo!M#	ȗQǃCq\dW�2vKE[^.PSPpP5F,am20,!wf߹Ne	^?z;O^vLJ-(?ǜ9vт б:9ulx6sH:a}.XBpSgIp|Sv^K}s	!9	^P P N8Z*&lr*HvE !*$5żt\YW24y_㝈}U8[pt>N8Ɖ"]ʺlo׫H1X
    y\'̄1v-¾OߠS1bX?7Q>Qga*L
    pL@6r/;)b2Oc~t9*v{֨˹⁎܅H1qJ@Yˆu߰ѳ`J4ySQ@V®^zMsD|;i]_ɘc)`\{wf3ㇿB=8p2z[}5s:Ň!-c꠳
    b z^7-uH:E{+~&0رì7F8c <7|ct.'0ҎnM 1!!*>oҽR$Dp:LgMLO%zLdŃ93[̞5>%_&mĺX'(>5ZA&Db%šS|ѽ1b:u
    ?Nzw;3	L[3bΠbOh'y=Nz=0R6Ƥ/Dg:|QÇqsbtHzM#x	r"sw.1K	!
    0ۥ<ag,7_dk8\qҗ(	
    :kdbx酓'	a?En--tYEM_v|`STƩB3m3'ceC18+Qu0%hD	#P⾕ƹ1[YcJUo)3geuI838+w`F#ú#:;:H͍)Pcſ=/3?"$86ƛ='$DB%vLѱ'U/_sZp-UˇNW1)RHN)x	aOj0ƶ}%ͶW$^c8C4?8%qN:8۞`0#Dq64$:蹑SkguhrօѢHzdG]`Lnv:fyObfӵǡ13*&S)t,98*&cMhFHc&
    K,\>hWS|FS:!!*>iҽ%D-i6%Ӏ
     /P[sXLv;$D;vMHN�@DY;{FG=U-k
    $D;CBT[���C�"@<���@	@B4sKkOB	 � � � Pk
    )!���@	@B48/iN	A]/]sΉGynwy'vgc~9_ϭ � � � $0$Diyv+Nq❓l=\}m޺yݜw*ICm���hp&_Zӂw!>7/gxއ6gɶG/MzOV%+HX0oV{џ댩aj˶Lw(;(;eLj?(;|Z4NB^]mi
    9ɜoS~ԃH֦֬(}Nte.ȱ�BK?@ x؅'&%O\<>)yͅɪ#/|N+?	F>0gb֕;
    
    &�Ƿ5&3,}|86wa*Z1�%Ю#=BDUЉ=nAnN.D3Lw!vϝa=N_>?ydkn9f;t8qءOO"b|Kz.?8~Op=gvƉ x>CpEFN:1�;*p3HB x​[9~dɔ$7<pfdJǯ|.kw
    	!gsptLs76gyh,*H5҇H?E/r1DO߾Og>?Wm?.!:="盦wĆ<9'_f!"pwr^bpsV.=HVg?~C%dAɃ$ܒZ䅻ϼ,7O<d`1z%$s}3oYgn'zE̹QvX91C'Ag{±oV||;KÚ0ߊgG%$X^;<ji}i1w/zic<St:b
    Æ6<fȉyD_>ͥBޅ?0]SoN^eQktOM9QHrY6ztNNv6<ŸkzcJ!&V_偯|~T'">}XhLWbD+t掜a-p|Bvg|in-897$�=pts3e_so\bUÇNZ8؋)Ω3ޅx7_پɓ'OŃ?q'u\}t5{]O95xJjΔnUKsIY
    .
    0ۥ<
    7zIg-6Ky9W<tv5jMM>nC5:юy~sAmơ
    jD/dB9DIδh}bC>(jwMvU^܅Ww!N9%3?Yv_]|~j<|W)qAh$V8c$Lٜ"X&XvCΆ#\b3\FCR"]ۋ9˗YXDyN; V0!!D09S=X=Eqӝopϥ@::hϨw!D3]"|ܹwk`dA3 )\oK,>a"'&&)vRqCӭW]f5ߥ
    WghěrBDKija߸#`0:řQNQ%yv(G;i+AS2£kᏓQp9oQ1sɨ}cK}Z.8]b$;Qj
    &`gMD�U_IAxM|܅!c	@%~9A�@�E|P|m4X͓ӫVw!@RBL?tY���p-9trǜ$T0DA�@�@�@�F�w!:<oWKԇ � � � �u'J;ٮSBt2@�@�@�D�IY@BT'����$DvIH����h2H&nYm+^B
    h(fv|$S4Et5Nl(?Ri?)D/l#FԻq.*kR0F
    Պ@_8hy^˲$EmR3Q],K}0w.-kGOC9ܙmrOYfS5`63SԯDñHg/	:yNƴr恄hLpV!KNzL=3^I7,cpm7U0,?byⷑ�>ԍR)2xXW@<p !
    	VRL�'o6HFLgZexp^N1%2)2R/~stSЕVABWlo׫R3
    y"evz}vΪKsp6͉Bc\p:vQe15{2Ȍ:m^{1CƐtYD	 Pp5c#8llvt$LhoĴdOž|-.g8fcKlFynx*ڟz;0baS˞
    |$X+uW4:ǯ>%qzc2Ř"g
    N>ξlo,BwˈPq5BBkH8413*=ULJO%r_Eװh;wz9gݎ'}{1!*՗
    3AP'V2=C#jFӈڞ:|icAH67R̍|>T-88#N)fvDĤz˞cD"X]1yC}/fǃCBp/(^B2<QC6_\b]bY/\K:֗+fao֝88q[2%gATN�'dFLCD/'9S&5NuJ0;M1)gx".8;gڟ҃h3O
    UĎUTOSDV:/t\x8цo}^'#:"2V2[Kr^H[pTv	jdk#dF2<"8d_mAD1ESv*Cp@Ä'8Ni@h!^H=-^Bӄ-8*8F׫
    "F|sX;8	ȏy{I$8Ms|v.$`ĿrB:a~4gE'z̨H[mCҳ1s}Y`$FSx
    by?c!fTLr8_ΙN[9ƈod{4V}PV;XrHx~1sf{HOt`	QKFpEΟ	@CWo͇K#xkGABjۄ@A�JsY,ϹP~hVqjN.#G � � � PHXwNMh)��@No{!!ڎ���@y !cܚ*!6n � � � P0=uhn"_^ !
    Ҩ@�@�@�M�3jh}���(�$Dg$嵲x	v1|E1=Q(;(;ef(;|Z4NBϹ>ύʾ}\˨
    ^ͯ?pQ jV$PLDT(ַƹkp3j.XB̾s}YWp睼_#5veǞm>%A8N*
    @+'#@_^XǶt`jӹvs۝	|y,XBpSg
    gN3=5'J}
    4Wާ782 �sAB4sod[ !K;fH>	2'35On;4Zi=v{)=*?E(r\u<Ntnǘ+췘Gd}A3koD8թĢ줈ɨ1e51F|Gǃ
    r�:PFk̸G~$v߮3ZY0Fo1OUJOnF~pwg"η#K:1Qog|gzp`X"r[ wD*ѫ&zD>xJ*]=oFr~W:ǯ>,:߼Тb2Řr3Dqg{튈u6X5�{V˖y\(/Kȟ=yGO
    M%Fε3W\W盂c]2sRbFG)<7VM_y.1SgOqLjDe|p|BļY@kykvCMΠ
    L㜴Qqz.uҗ0&vbc7+#/X1TH}#J:OtF	|y,^B22u\y?8j'^:DOi)3ɓ#}kIiK2A[3ơpG>=fmfl:^z^^kC3p3'c�k~ePtν?HgԜ$K*[i12Ι4{|<9='ݣc:KќǙ)W�gh;Y>zUgdFi*Nt`$&
    ۸ӷr5vJ!;u
    	(w̱fLWEtS;NY}=Ylpi~{	/!iBv:֘jK>4EOyJ||~fY}$+3߹)bld[N*Œ-ٳ'rڧ7
    =6hS~09ְC
    냯2x0՞@3=Fd3ƌ=>Ӫy`(#bho
    K؉+K Us8E?T}%:
    ,&BB o/H*�@.gWUgYp !ڛ@:$DCՁ���@	@B o/Hva���	@B7J���(@+VZvuګW&~zzzF(LTlbK'_b_D-G#�	> � � �(�$D;M���a	@BA�@�@�@2 !*
    rx	vAw\oȉIQoYjvꍲc|͍pI@|v'NG^]mhS/0߫tC?L$}osmwb"mwy\|+8+±UI
    $DTף0@B};X[zc<9p|`RY;iW^vl	}AY8(ΰF]~A_aK
    pQb@O&B&N$'V^nmW%sw6X)g텄BI.%'=d>;pqRtvR,Ěʙ8kX>N9IJʤVc℟RO1$94
    3BBY$�$DKGe,?DIHHoˍ69c%%!
    ]"^YO5$d3*
    "Iy܀k&^~L"81F\vgDxJQ!pY�kc$X/:$+=9Ce !J:P,9#+T\9vH˩
    &36
    $E
    ĥ8>[3|vb#]agDssVO:`C *sʼn1	G16D9f`㔧'fAf_LζpE]QDt1I;@{ΰ0Ǧo`\Uɞ#L)	QhH|Jh7g,`ĜeDVDx\n.v1#T_,xlcO
    mͺ!"3
    INs=i`R_f)ը}YO`>Q/3Ύ
    gyz-{U%c}(w3tfoىi*>w)	QΪx	.06Y⬎\`
    NC-TcǷvp|b=t.6Cg]
    ahiE6!'y&B1vI3pfGΞRSt/y+6F>A>}a,1ՊZzZn8s>,[XN/I#]T=iSIH6hK<Ʊc?7X?_!bŇH8Ki\b-t>mdWpP̥tLQ@v&b*XB}by+K0;w,v.k99R؎1\8by:.8֜-3<*	Q&[-!긑O8Ӗ>%Y3vN_tvhz1H{m߾dUj	>"!뿯<O:C,j:Q2eԪ@m* )8[:ϠgX"*]LĀllX=m#E!b/g^|! !M,!:qCۜb}m(g/Y$`[7o__;dYr|^٭Χy !ק> '༂H�]R$M(;[̷s˪7Vp:QQ !J:�	NE@�@�@�@`�$b!3E���HtEhPg) � � � `@LO�" � �4ϱ-zcφhlז0Hj��phjۮ''HF !g
     � �IH}|9/gNS?SsTy={_?; !b|�$DJ��@$#VAO
    )u*n_W鵯^##bE~uޅ @9c3΅hF?Vx � P[t0ʷ[BxO#wL	I`	r%DmçCBnǚخGA�@�r$`?cMT;U}.'w'$CJ9O2lLyHte	Q΀+ � �%]B839qH<A&B9kJ;	?SX@��@.grTFWw!<ݩxFH+bӝeߨݸ5aCx	#o}@BԷ9$Du��h|�r @B '�	?SX���LW4Hu& � � �&HD !g
     � � � P9	ѠDS@�@�*M	؏7ĖNqgąRr!!w}@�@�G�r	JR ! � � PQ
    ։v]V!!jIp@�@|KqFa=A~7EY#%gꕅmUiW>BBTo$D}��TlB0|v)Fyf
    ?csKCBFF@@��@.WߙFu@7Y$}§
     !r	BH\ːh9�@~|R�	_vC'!b,	_0 !Ƕs-CBtnߣ � �(KB FeĂ0T	'*$Dz8M� � �/}츔B '%-p"c|BBd ! � � P)4,[YL_/$D~BBԯ1�@s	0*qwȪQW. !r#@B  @�@�@�@ !ܹ5
    4@�@�@�O�;Hs@�@ ̏#gO)>`Dvt	..%@G � �M$)z#JWWaNS뒐:	Qю[ � �u#�	Z"A�	FE� � �I,ߓ`$l}lZTBo΅.}Bo_1Q-58K:@BmZܾGA�@�&`Lڙ3ob}yv&VE~	*jB)Ye(.'I'|C	Q$NSz�h?0F\Ɂc}l]Y$D̛_#$D-�(�.틝6RB8;!G	k�ڬ(I$H.\$DJ% � � @="6nw>
    I`jo;
    ~r@8@ߵO[$D[vqHx4@�@=/t~9oMe#k׏8)."v9pƸS5
    .=
    	Q:M��ȃ�nO$	@BY$��@ nU	$D;ABԲ4���@B8THZ( � � �5#�	Q&8	 � Hg~~^g^H*N]}ko��F@݈nt# !*=5uA�@�A�XV@BTw$D]{~��T/.0v~À%BYU H4]N?
    8
    zJâo鄏R;RH
    @B D@�@�@ Pofy]f8*{FT.NCiZD04맡ĈP׮\i}l;2$D=Z � +%3w^}";;qNdܗ]>)eoVt,c,L(E�"
    
    ��@^Be4yׂ{`dtu%BX	+~	c0!	;RL ! � � ^ד]__A	i6!3NBX9wN
    ك";CX0	@B &@�@�@ Ƴ+FB,sG=%;:)^y>EᴋnQ<uT[?uك";CX@��@[RMF;%n^HU.Dc
    �("wQU'	Q8:M��\k9$D2���N�.h
    T4	@�@<mz 'Ks蟄5ڸ
    	Q � � "Q0d<=]o֕/)H|yZ�$�@�@�C c^1Y.�$D;
    Hr4@�@=oP_>j6 q%R<']6A'ʱϯXQԖ)#?QQs/>QD…,,L( � �<vC*̌zlu!ز$xz�'7TanW-
    Awg)q2T3rYH
    gQ ! � � #AA6ND(qr}獅3R'i}}I)�H��H  (Xa$|>	+!>@S:ߢ(4c„$D.1�#@B  @�@�@ GK.A0U*@<oc#bJY,(~ʇshHQ1US~BBY$�$ʁ���Ix`Fz_xvWջ-=[q^g^=ak¨<$h6z͓0׿m[mۡ!!:l��	D%e;kL�ƝWY!!*5p@�@W^4D%olՐZ4@�@�@�Q?H"���T�$DeA@B43��'7.Ϛ_zx	Q~ � �M$PVZVyaϋ$E � � +R^ϋ$E � � 'T6/y'uf"ΩW7W	}^}N<_7!`rVLHb8wV-h-�@{i5NFZ8O.Jzmi`+.u?W|nqV!!x4�$ʀ��@5FeΫ(l\kϥ^UN+!&>;?>Q !�� 	,̭Q2]fo`q-ݽ]?g-:"wD !ڳh�@9(-!9qv	螥^rJ,Zu6}}MB$ݺuzڿ~HE1) !X[$Du��Ԋ�+xyaD]ׯٹ0Qz˸kr"rk-R29l)Y@BtV � � �F�:BB���@9 !ZSH
    <|ő=|aǦ]0%s
    ���]beW.ھlKw|Ooݼn;QE���$E5(!o}6^}h9x֟l{ҤoUfuy7N-k � �#.Ԫ}K7>\O-炢F !Am%ĖM,<qm{7&g',q;|th?��*W|dr!Jr"
    
    %D;o-	qÞ{$s,6y}~#{3ĝ^}8>��&,c۹bmtdɔ$7<pfdJǯ\~y}OBA�@�	_`KYިYxWYӻ~	ZKK|Rot6"
    $D;x\wjrˏi%<sKksZ<&wߜt��(|ǚ5D}gABp'zmNCA!E (!Oۻxo%<}sm&?pOM9QH*��t2t~UP2ovHn.mjmGW#A%t{)Ebl_''ovwz?a=/{|ˮ_|v
    2@�@�,}Ђ|cmvH:jgǙ;](f`ޅV׾c۹bM>߾{Gz~'S^{fUJ܅!:7r��AeI7ԃ^LNKIy"ZlH
    gQ8)qƮ0��٧ziL2aHa1<evWEyF!O2a	I!EBL<z/$	@�@�r$y&Lq|㔉FH
    P]"!KB?<p7]0 ����n@iFEݍ
    (H&b_X02��� H
    vJ]"!$q#BW{h����4�$D{6eeA�@�@B|-EEU{?֟ǥ±ޛ)H
    @B D@�@�@ ;n9
    KS4')H*B|hZ= � �exZqb{,EsRUeCBTkj$D;��T/C1q>d{`{n*B 6/_	8G !x4�$ʀ��@�sU"K<dgR!<buP/|W 8AIMel`:P0`H
    vJ]} � �$Tλ
    >m	ھSsnq:q!?rJ%|+k !kU=@�@�I (!TĝyB?O!!|8Ȱ-!0K #$DCBԠ"�@	pLr>q9tu<ĔAPDu쵪	Q � �5!`<H{ă"S-^8`ϼ;K' v|+D?"&QrFUW!!jUp@�@3xF3ʚv
    $D< !קh�@}	7x^F	ѨDc@�@�@�@`4HDD !g
     � � � PBB,ZhGJq@T[n')booYK-%{&*L�"g0 � 
    +5}^l%3Iyfl{BBrMïk׮Yg=oxꩧoVHXX{m�h3	n8KA?s4˥|ʡoCX믿ʫ+K^<e[ !rC	C � � 0L cv%~ɠ9
    RB;6l]{}w+|=g[zD܅hp$4H<i�@~/&X^O/RLAlo7S::I~*]y%!~Xz_~.]K,X4o%KBBTC+!$D%N��Ԝa;n#K, ?,èU?DA1Ai'>OZE`Ѧmf!!:x��dtBZ	INB|_wE]dflABTSj$D
    ���H̔BW;[>	+f*} !G~}A�@�G GP+LA7)!2>TN,XJHBBT#$D�(A-q)2U:rZ?cAlgnr[ДAwmʊY5CB4o2���"TY?CBV$D8 � � Q_
    !FwY/oXE|x		N���jB|)WZVa',x?: !ݓUJ_@�@�@�@ gBBL:uʕ~w͚wōW^y_^K/^X[4eʔၑ"NTlbK'_b_a"\e@BT+�@c	p>\E >΍s8KH!yބ~3g$D]@
    T4	@�@z*bL�1|Km
    [!!VXjժk׮^>Ms nSAB#eQ݉ƀ��T@2ҝ)H) !:aT/Hw�1vҬ00ȜXcCyV]3Ns+at;,>w!RÉ^��ȅ�`}]T23luDeh'`Q(d,w3|}qZDtk.!4	b !"`(��	Jg
    ˉƵlp^Oy5LkatQINՔO&0ς`BP@�@�r>AH}0
    ^2vl9�_2ޅ:Ӗag)�	u@d��@.I02?u@
    	K3	΢@B >@�@�@ ă7*Ɏ+,Uz9ES?80,_i*UE^DP8rͶGQ\,HpJ�$B@�@�r!̡sF@ �$D,13B	��Яʇ}(�$D;2Hh4@�@�@3	@BtfՐ � � � P*HR7rHv, � PΧ[Ohd؀!!Љk$D��ԙ�?eєe'(PV~!!6^6lX~xGxbg-[wwɗؗ#rGhS`tw��h~/䓣)H 0$OwO|رc/"qv[ÐG � �M$`gUM:n~p)Y"&ȁ#Ɠfo
    _yz]>L
    wMkqu��0TP٧,IV$!X^1n]z8`ƪu;ľ]C,؊
    ؟2W/^,xw!b|;c@�@@ՙ*IΦ%!KYR3N܈�S68:_{;JJ	;{
    B30}t !6!!۵h�@/!ܗ)$8}	yٱ;l4T	f͚u։oڴITG	!-q2f		Q � �&P*{h'hIt.!S"^B?@Bfi=��D@HCl±9^yLJg
    '
    g4
    Tg)ƎK?'@;
    H	!S2ăP]vBlBB4G���H	a@	@B���ԖTmW8$DQ���M@J!/"~W}/x � � �GB+ؚJ@`6] � � � �QQOTlbK'_b_g_A�@�@�@�@�:�$D'> � � � � !����dh;����DF@�@�@�@�@Ξ0Ilgvi^~06qs/[	QfϬU@�@�@�@y 7k(3d !ʤA�@�@�@H	!^v$ٸemz:`	Qf@BIu���@8cuM!<У~zO߹k'E%qpژ.6^&H���@="} Ӊ\']`3M<2()ƌv	!dJ-U
    $D0@Q�@�@�@�@ GGv[=O0-[aյUB"H2MH4p���@Zvx6oٲq/Bn=	Q h;2
    yI'GʋoaF$Q֓RCM @BU���@wYBBlܼe=#]vM<`qK	1l[>?4OBhǧiiq`UfCZQŌJ,�	Q"|T
     � � �H_Z7
    lۼI	!~HĒp=?{=
    bGʨ[ʲVŠٺ|0"(� � � � #C9%o?ܤ*"X]b%ϖ'G}%![,i=#G � � � B0۴amCSB9̿GE !: uƌY%N]!H
    w\���ّ'
    M3<:sB)![PE#
    2X}DHW2
    f#RCFF>\]
    h���TC:#WB0BE]YlbG!nDt}nAz	QI25s
    fwA�@�@�@~#		-IV{KۤC/~� !jp@�@�@�@�ׁ%$Q/|Q"q����(m{!xw!J=T � � � �%jup@�@�@�@� �	Qu	 � � � �%�	Qۮ � � � � PH2N����-Hv����2@BAu����@m	@BԶ8����A ,!d	l � � � � � tww%/@ � � � � � $(^ � � � � � $кQƓT@�@�@�@�@ !s@�@�@�@�J!ԑ!	����IENDB`������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/beagle/images/callerData.png�������������������������0000644�0001750�0001750�00000025140�12000015124�026476� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR�����j���(-���sRGB����gAMA��a���	pHYs����od��)IDATx^kmWUɕOD1M"DL *cj	(QD@*T6[˻-R(-ϋsY099\k9g97c̱w{^y:HHHHH`N<y7?~;;{=qæI~�	�	�	�	�	4@$@$@$@$@$bW7pB$@$@$@$g8s'    X@|7OK;-gL]?%..|'-j
    V<Oޖχ]8DNԦiYc'~VC_Jx8C#a_V"y<S4|r[Bc|X@VdkU2ΥWs?!leδ;&%I"5RM5X4ި{EуZS2} ׄ1Q@VrO]�0]ak5Q,nGN\nWrN;H7"EܵBDtKc֠NxG@7`zzG3:';.@,yҩ.G7>FBTibW=VǏ?&Ԍ[7wduv>s_/Gڞj:<1OgȬ^o_Kê|g@H~s
    }HIՆ0IpA-4sB+%\R_Ky-u1?wQw,;ZͶ]3lCQZ7s=B
    eWŹU!
    iL\;US�f^ƅ
    38XK%=Ga[ǁs,>\!X˕XH)Z;}/ɲ6
    /#jެm\.!.u@JG;)>\pW:
    |6-
    Rq҈ukmԏ/kC
    ֎ޏ:LzM)9mC".}GzWe]`Bp:ɿ:ֵ*$/+8t0rՑJ?>#PXQLZe.RPw&ײYoB6SなgFR>\?ȁsTU{KA{H(ϱ[c\VeZe0rF5\w4Tv.|zpJ>0XA70"QS5?ݕzL"\'?9)[W'	$A{-D]MZVv[uY+k{(o}UG7#)&W-R?myo$:+j$<,Ќ."X3
    (WU:Es*:*S~9]E]6GCHCP+B|hiՅtk5onWkQzcrnSϷ٩R5n/q:䋅@j]B=4*kX#\-�\5//ow0.YVKQ{V/NԣAR~($.qJ+]]+DIrewΩ-g"<V+POzs];K@Uu]V_^VŸjKb/\{WM΋Z%uژ#@OjZ8RJm+0e:toާx�9ЯH4ۗqzJ>xX?ÕJclvJοxos|#�Fρ=	�	�	�	�	�'o9n'   7"    h"0@K_Kxg3^pAD$@$@$@$@$oG8٧nԗOo/vgHHHHH	L2П:ut}Ϲ5?|߫~+~~Ͽ~s57\O}7+'^ivIHHHH&8?ͥo\%o|.\+zr|o^']9H—xz]}	ce]/P1]S
    !/>j5eΖ~a$7"W󕵔	SUxe%%U%xEcWXkzxTE-3d8W9\eo͍n.;>k{?G\Fϡd9gq޴{\B-nS)ɗ#yC\cފP	 ̈́$I{j焎HsKx[~7kIW}{ҳ6`7_8wsk?~Mzo\ԁ:ñLAbO2, "jv2'WsӌHq6-c6魚�r!w"}1Nam$?Eo|{hso>߳ul>p֗~E[og❱WA퐚We|kouzD5!G#Ct'5_"p@>mmK�{ѧ?}CѢQЬw8T@)vD9׃l/RťGV[~RIKN@3I{{l|7W{O=x;Nӳni~kPMFVUkUٵu["UyQsC?,)ޒC]W9QGH�I%$G`NZKeXmiwx7!shŇ;ί~7n-i3ΰrs~Eo\q抳O];^_9n/wg?ӗ/nxm̰R^<zsliSU5<bqjGU \SxĜqmD+xD[gcn9?l>LՎYa[jV<Rlԝ/4DbE2eeBZ=lR ]d]]sc8׾)/l?wzhʂW%`~V@x*u.Nd
    ~^QxEB~voġ`n:B:USeg&萗’,ۚhP$�趜:2@P}k	6TclbH! GL2;>}W3#wO(*B;+/rgsWC-Ƿ{
     ^.[Xmi/yGX?>e[K/Jct-
    szE(J
    tbJEU^KrL_9,jޑ-;VT5ZV8O}U'.UyLv	Ö!p¶`&'Wͻˢ�(No8RiunCS}RO'Zn&_~H>5	SU}ÊWɫ־5Ǿ3΁͂sNxo'Ϛ�8j'8I7Z[8(1XXé+]%ff;H9["I¬8X5_:(ľ2e\$@$@$@$@$0A$@$@$@$@$p&<:o^}WHHHHH`:o?>cە'	�	�	�	�	LG�M׵lew?x]G_$@$@$@$@$c{9N2o9Ox䱪\L$@$@$@$@$%0@jNX`=.۾TW}S׋�?]rgpr-`~qV_<1x[>\O,Ow!!j![5#jKV	9+{骋34
    Qͺ/vZ;QTm'V>ذ~K?m&Z^gA%{\K#R\kh3A('I}迿y֖S^>Y.GD;ۅ@m_-okm-F!b#2L5cHFk=b? q;c4M[T!,6r
    @t` ?:XÁlWNFI+\3eUQ Dc.vBs>5S
    st7+'뷉I+~x0;ޟs-OzU{Ӗp}zD~ÜWWnP8Q׫ΨƭCOGSFX/9υ}+qY2(S7£uF
    MZum),؜ˎCD%J%sԆ⌜۠̽b%nWs{jy-bK<!V۩[9-sI뼄(#䋓Wqw*/*\5d^8D՗TUW bѹ_2A} 0eN2ǁs}+Nsj/lbIV- vuMf%:n~Ҭەn\\[rBi,uO[}o貛*1ۄUǎa}}NiPoV,~?v8;�=,+Y~~
    MZU-}=W5Lw_r ,WSꑜVuEd1
    zI=6[{gT?̖}#ȹGV30+]=5(5SOSSvS+	sY<jΣ{ro\n	iTIWs㲬񪡅 q9[ŚYipi`r3B<G
    cy^1mF|y䓣EPd1WK|Bum7.s];wsZSAXq)KD}[B诿+Sdž[yyط\rY֖&?Z/O"GjCE; oM_c
    /(WU*aПksXW9DooU1\p6GC
    .0Զgc8Ra5x@V2N-LkoAj
    lSϷٱEMkD;@;.Fw?FKcrL],?t*.U'.a<'k>0.z`!UiGQJԉׯG'VyN[Zd]~\XywP*bNZ"TWLEi8Z
    MǕ*-	G,[2motWkʼ6,~褵2wluCjUzj=/6s7+gw{'ꝜBvgOGV\ķCXC)bd{.3@$)c|=r5uTXU"ّZ꺊ۡjx#c4)vM}kn{k?Ƕ+O    �8k$;z7]Wv&    $<7	�	�	�	�	@|/A$@$@$@$@+&~kx-$@$@$@$@{F=z    X1=7S{opp?nΤp;atUUfqsz[.ەϾe`KbWJkX_>BsUgK4oRH]hj	R}Xc
    >Wm)G@>E4'F+X㔚W"{egR;N4;<~]GdUڙb%
    xkHv]poHn4߂pqoTp@c.d!f7k/1�IθfNYë#Ҿ0"+іT>) v7<72
    -zqvN_F(njS,1lKjэ,ЌM+'NS:Y^WIٺ'Ց}Յs?EZGV(Q<QS H\\C9Y./J㉸V5dUU:YÜ4^[)$oGX'T+t/ݻ3ȭ`Yj@e$a%
    {L}gYL.بY_%Dܧj;u"?1ЧzhK0D[SPwl+Q-j%=ɗ4+a0{HU59ǎu[qE^uBNJ7hճ$8=wPJ7A*4&\EaX_
    wNT_ƐN-R5mm:^o[^e㜋ȫa3Tŧv:
    1Zou^?MwZပ{4x\)҃S`k;V^4)^M?!6jUqk>y%lB8	ڜĩ/f)<�zO	'ADKi~Qu#,lEhA9tY"yozdnSxD_[D<n;S_c$AA9WqrZpvCtU$TUQ?(WPv11a BNWQX|7K82a
    CjYNS^r~XLPоH}9PLe~~?`!O)t569^C>D6Q*nV\aK	Z,F.Rv	0.u:N~:_VoqUW;X_D.Gk֪j|N˟Z_,X:ƜqA+b:7P9nkZ"U8%4җ�Slmn,k̰s-πG%|[bչ͡Tfٸ
    W*M$@$@$@$9Г�	�	�	�		p_q󾐞�	�	�	�	�z$@$@$@$@$bW]$@$@$@$@!rCOHHHH@.?_ݟ
    pw'щ]E]턲 Se?\KRT֋к֪Pysi�	po軴.Fv4JXc
    >Wm)G9sU/|1Ny%WvzQ8o/gZƻCfQ[:wI	p@N`Ri|Ʒ+qU+qv87,$ˍ^yAf{�]^+?H-gsx	sJ}0ΦN~r\[[?er[A	WSR'"G4ҥ
    ϵ?[ܵNޅ_}ɕU](rgzuLˮ6\HQS&<ҳ
    rԟ˾"u>&H8K^&~Gf;ByԮ(B'ivtԹ&QX�ôT{|sP0|,/-g@FR
    ?N̔"gv٢M9(qr_uea"װ*q*"3_irn!<O\Ь?nkɩqGKUml`U	2u7diޔΈ Jy?TǺ3玟jҔx;x^e W4\fm>x\~9;t8+Z%c!YPi>>pA9i$'|`^(zrxx/saX@?u T9(W�qgixTw8|5WVP)"?.AxXX%x0e,*=8A'pP�
    %֠Za5/:K![;Ǒ֋0#aN˚
    ąG3xCGk!ڋ9y	HiIT^6Mq.2x*^gpWR}3뭼pT'*'X̄=nUk90MHkӧWXV.0:GRԱOezzZԜѤ/:t8O嵧Vc0ͯjqm$ozG[EiJP1|ι֡^WN9@Y*β9T3w)Tk9R98.BAYW~@YUs,?Y۔ߢS˭j=E|ꫵˎZJr1@"]n+p	+\ui-/'	Pc8b1C;+w9c޻ćЃHHp4ЫXɞmZ
    ESwu<(,4?*
    �FD$@$@$@$@cp_'c2ͽ$@$@$@$@{I`_$@$@$@$@$@M87a&    X     &蛰q	�	�	�	�	,'L	DK%Og
    _]/0k]>'mk,j|0GTFBBnc5%QW녰Lk2W 0ݽv/;`\,Wk.|q}.Yg5=^dTBuKz		byW g9Zki .MF�յ3#KH_2}!Omm|!<�<`?=H7�cy;_6;qX2O'@&Iu:tl`0҇٬6L'&Jsʷ!7HX3l,jո@'j\ϴ%6i_pyu%]Jѧ&<%$*^fQKɛŭ_Y%4SEJͻZ\iQMUqHxӠoBZj'KbQ;FV1.wQ忪tXyK!vp{Uy)M\P{ֹNI!T-W�RxM>Ö4j~Uc5_QKWp([#$
    lK5Y)/kD!*7kbQAYCi֪w$yHzB.eL,tɆJ#aB3g>tlLsnJUzVq:iukVM�2US-1T}պK?^\V"
    p\
    z4`*'Z;ugLAg?z@:m8l2%*ڂ`Q{\!@mP>7.QզN_S$Q4?
    }悵@nq^.A;~x8s3Hf&^Uin70g%hG~|2\Aa5`+imlh>h{zA
    %7H
    qߐH^P[�H\?q,$HB8YP=G+}7U@#0U`sp.lh|ya^6y+17
    ZἪ
    [zWI~{G~"lM_Ș*jF|H>92)"[sZJsPs87ĥj:GUaU^S&n8˾E-ZʲHVYjSYN!yO'T]nT7\8K#^*鼲D.EZ/DVW=pA{^ppw#Ӻw*=׺]νo5u$zZSYuo-:v|q!59}w 8ˣI`UO	!2�u`$a	t!布5`SIHHH�}"c    8XI~�	�	�	�	�	4@$@$@$@$@$bW7pB$@$@$@$gjHH����IENDB`��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/beagle/images/font.png�������������������������������0000644�0001750�0001750�00000157726�12021755022�025443� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR��>��c���BS���sRGB����gAMA��a���	pHYs����od��kIDATx^y}vϽw}997'yc$ld'cA`' M%1D`@
    -BHhhI 4R5K-<hcUVZkZjo=?DZowvܹaÆ_~'P�
    @(�@B~gY|^xaɒ%]?_pl'i/`c>.~<l?F.~iWF.Xl_fCWqnc.F/.
    Vʹ28ve,ꥋ)P`p]}^5Kyԫa|G}wO8x|W2~Kt#0#<#Hя~O+U˖-#nw^կF.;6n!;"}ѶeGr#m:z$nUIveÇZjk>xNZPpvc6yh3dd{ZڞSN
    2k"-wSvgvَI~o1f2%hdG{p/mu{m=ؽQۍ]ڶ4v1;еb:7q/>/dymþoP׷l]=m=m.k[fkakZn]ٝO|s9OkZ<Mkno7[닁]! H]r
    ]6 ݛh㵃=[joɶdr_7	;km,k;bho}ՙLCvl^m{勤1;nq\XvmΫVv䀴]w)iu
    ֝f/=kN`r=#.iƎvGnfC㋟%1{9zyd-oѺuot0[íoݪf+֭^r$<G:Ny>[U3"rwžG[	U	zb&ӻqcn;>yr#UðnF<"l`psqn3sЭo%NW:)6vw)xC7ŝyqBHbsC[϶C=*FЦ]4z�6azts~f
    4qh3M0
    b&vlG%ƥ2	vg8FoYp%Αf\�ܺ=m^	.Co1c�09s6psS&ns0#&.l&Ρ7b@+"b`�Gj(}\vg�^MoNЛp9,psM�xIo#n&t(pnAE?zFCo&&{W;Vڵ՞7�,MEF9P>o<)կR)-DQtǞ[}SٮB5{grmDi,kmgvBX
    c'2cd}D5AEx�m!6lfv覝mfBC7lƈM6&ЍmG<6#`767ih|5*7p"FA7+&x7yz-t#sh0+v\f^G.7w͕CF9@ӛfsI	gC7)+\&z+9Fp^\V[<F<ҿG<g'=py<p'{<7r�; 8IS1%p.tsl
    [$zc9-XRVƦ/Yrϭxe˭+^>厕˺V.f
    6v>)tbϡ{2ʐrsD*Jع/~^ؾW}0jqR
    :\fZS)eTJD;5hF:g(:NvPVr0݄iAUp3n>nQ'HꁶT#B6e폐j
    ~M
    g0
    ryh#nc6ͤ7)h/Hx̴AIfF-ػu+itȍ*݈޸r@7~S",x"<.7́6AXpqx<Г.
    n:gj5#a7+{LQC8B5	ynS!Tg�?@~kpO7F9x6G8۩cl@Wco~o1JNo?ԝؿزgO,{gϼlϞ{Vnܺ_y_W~9ѾSĞWWRTYT._ŸFS6¶*=AM~8w�Hx$1P?C=\D;m7
    xQ�wueD?;̌ѭMqơ͍n6Zm£rG'' B)t	n;rq76'ARo=x6MlxĊstؔ{Ln!fZЮo'7z]4k!F<�y1S87wȷ7en:q<oੈrY.'>'Oe-)B5oIo;.*^7l}Ï,ixSkLj&B7J?2o}٧>1nM1;S=S=St=W\MsO
    3KpJN?WCY9楜TR-޹O趯'͈k:mfDEib;3Nv¹-҄e\P
    7Jy]Ta6Upo{k<G&o
    966"l6drS<mm}t_g\6Krc&̉M[cd/78.n
    ]ݦ-݄S+1Sn2%;;,†/[Sᲈ0dBozB>]4	־73xa8=v[pQ0%hBºyo?izc;qzG7a3F0dip[0=xy>HHs٩�kj??]}Ç<g~XO;';cO?SO?O?mO>n5?j8}Ki?B'dOܚxΔ?r5Rӛ6~bL.^T69A;qM	\kcj"MьjElG�wLv=?zT6e@1S6mgC7&ߦ\nӶA6
    mrLб~9"K`6t73.w>mHC$	ts�09T)Ǜ{cCMŐ@ 1}04!tBj	fiu}{84fy*/$3CS_׷z=L]̑
    R�\GlG0.npÅDe�g??
    @?n-
    [Dk0vkn}pނ!#4EcH)عc{͟𽽏?LqÇ%;pEs=xn-rkWiDz:N'k"[)6\*i[_39ۉ#<
    <cu}9#ۘ˄VmDl4|
    ‰-D^7puS;'荆2PTL&Ѝ¦%#8n6mMo]o ڈcB7IըRg1:R7fxcSl%ӃI< 9`8=K6}$Etw}3YS1`Ǩ,f!kةyj9S*:<%bsF*+*[-ƮoF.S@\sw3-|&p\T5H�)=߷ٽGβ
    ?zV8?4ni&k h'89p֮_{gO'3yi|tG}tΉsN>69g9ǭհ'_tѢ'/vY:@Yxt1ʙdN#sz*~bOn'םmoh'l}ǵ?}w3~G7Qߦmͯ|Jo_YLvfoG5INz_vu7	zcTe7nC!2נz2Aong!mw7	3Qiu>q£h񴹦1d/7>@@hc&͜Dyy35QLM޸ͅnN4Cx
    pŘ-oH
    b(lTO?.ìoYu}3j7=[]
    2uH܎7/]629u
    qFf-yC64-8}Qyy)&�gO !u3ꏜYyM^߼K؋{{g/X6;xf=x}bN0quP~[c>Ɨ>ϭsoƛmi՟Wu_~__?ܢӑƯ\�R___]_]Ηt˗Q)_ܛ_/}g>GƎ:;;_9w_>ſ?ouX69!n.p'^8?p1m_[UJ|&<aa^=979$bsҴ4u9vfh/BC]N]m&=m2N#j$)Gλ%Hc]1fDK 6"6n<zmΘM̘LxF7_6WȔori/<j!Kt+ެoEW;
    -S!BX7MoNdᲡ71t]pd:?v2[:rE}ϵB9.,S뉟
    ts;o0>n̲{
    1JƏ^]
    }?ˬ#Zoچ/ɈZ"k_a>e/gS^)|ʛ>?'oogŤo/'I{rҾ`_[](ETdu<'(gʟJYSV9+Jߵ?CMkzԮmp٧wPp]cm7O=>7Tkng935kU:h-~'#Yf0+iK6Q"7[;L<b~M-6EorlsMMfn3&U2O\4sAloBMtt3Pۦi�18ӛ377YMt*{6N-ϮoO3,.ʔo-o[uo!^{Jj.@uQy]p&~K/cCO3"@${zMRa+jӈd�o]?w	t;tUjn;4njM#`:Q6n}Ɨ_\g7g7?//_S78'o~iG7M}7Mw䆛>+f٧oEĺ&i>ޗ>)gʟJYD*J߽=
    6yKyM'-qψۮRfynj-:EDm@MnXb	k|Ux2{q}6}$n3﷪~8QЖ%cu{bmblB71=nvh;CmIJBy6ާMG=6mtc"XpUjpkP[.nAMCXC7n&q)t3{|1.ZԳVacwbtfN/3]pO+¦w,eG;:h2uHo)@i.ehJpeGZ<pr"Z!S|\qkhggi>/_~]Ykw$۴sn_qZf+dF	Vlܡmdƻ꯾+_x+_X//~[_{_~aWk_
    7NY"}#"?}@Y}/l9o6~E%RT
    _o*daJ}󏽾6:qGmkoyc۹[_|敍g^Zw깵'xyRvڿaNAco )g3�񜑒[ޑ�ø15dQj00.ߪz[w:1TLb&X}䒦bBѹEH|,1AlGH>
    &eWu,6=mr65t!@L	DiZW)unV{	`z3'
    ެ]<+b4m|Z⡷,
    q
    >-[-`S1oj_nکeV~oE{eE]I1(jlpoGe"e|O=|{Vl"l3M{_\Q˗WٗW3{eK+k_߲W潯mٳ@w~B7QVrs<?TjVn
    '>o5}۾/Mݴyo޸7ݍe1]Ot';y߼;n|/}MTF^"K]RF�.lr|ݟ̦moQ~}mۍ7>/<>iß9{Ofa$	36~p	׍pz%sm8maSaQ ҵƑm>tckM"(&#hKحF$nmFTCG'gћ\Tm};	bK](,;e,l*1.5LC¦^ԂDXݲ=io|ްOCol߰So75UXor[A<-.i!͎|CW\--m1lǢpQ�p;pA}2YAN�xj;V_Yê0l;
    a2G6nl8;_6F[7fZmWw]۷}oߺn~PYz?w`;tڧSt]|colGVpk-/wc^~W7M@\sEN^7>[+`(37,7'Itm>t
    n19#aeːNLO)[-Ŗ7S)_AmqncЦLE0#8F69idT.i"=m~hSSseR'ۨ+tWX8ނ:v}X^{_-j~o8쩹b\pͥb-K/dyZue_B<U�W}2h308"2LdΙ=$C|}G78G؆lٿꏴ~?9u??`}n;}nq>7O:Q~|{?n{?~;~;;gpw
    #M>t}<7ʓr 2Qʿ۸ZM6o\wh;~o'ƟIgW~ǟ,ZiC%6(["r£9X=]`"$NpЭCiLܪ(0.h91T£V#uA¦hV^>0[M,q۰&z6mNyƐR	g64dWFR5g8kzQM@0MPȈn)y}Ԏ;*r>ˢ[&>
    ]rG7gnK=[кbSsX^?a:<:3=gKM7'~qɬ|]HŹClp턳Bu{w?�OY[Ém{lujӮ&aۖ]<Sov_?>w7;[vѾv"8x)W7{s{?t{޽mxGf?c3=d'~S6vYGC<f,gCf\WX#߼=ݨozr۬WqVo<-|rrnqtB7_Moy@>#Lń l_o_lS.1jA,$
    ط>;KnrB+fzGXT~5ul{Rhx)sqt=MpF񡺵9R
    㷝nmlPh�"m_lt\T޴.FoQI̹r%96j!S9jd~)~.dq̽jz#~�G/*tcR9+.$
    2[!t}LoyC<s:(kjˁdsGN}?șSNrӆ9?^<0|i:*HgşkOo\{fZfj״Ԯi̬d]o֓Yt,[({׭uSǟ>~x &	_mN~~S?OV_CS򪕯/1nҵl'i飯VSP.7ZTbMWҫhi3M"N϶Amv(ukz4w_$#2B|#^Nb7MrEKK΋#Nit0!`^K׷U2!-K
    ӳ9{NZz^&+>hnv}d7]hoNsYe j8VrE
     '8?uƟoN9?e!Ff-ϸ7w}vAOίUnO7>^oߟG?O7?5HJVao6O't?|oSC}n'Q~$t#zkhعq+Wn\G<?э^5EXo^^eq/oiSkLhVaK
    X:(MHpMsG'ItSQ&Ɛ۴[[}ڈ.7n|v7	pME&:3vzsO<I'9f[,
    {wSZ4Y,zoz5]O3<coYӋ.0wsF1\p7c"꜑!/nz>x<aof}sM[HLgz%.hI}F9/==u{\Spe<,-h7\5o8"6|}#n#{#=)ǠSҋ'	ArB7CN-?Oxbgy726ʋE:iaڴ9l 9qRLmߙAmb]?&%<ʧ}ژv8a׍;m.to55!gV^pR
    x_(fa#_w}sy¦|s-]E	O_{hb<?e?ůe=fBoܳg}FNůo-`8W;�_&tu}!NЛm$u}sA!TN0p݄e5Z^rYO6rV]FG
    ԟ)nO1ˬϱjT0y7qSm7Ȭ
    u[+OvIolN渢bb],2rhXId8]ӳ6*eTebzyӹIՐR<⶟wqp3ynmAFƌڡMzaa-ڂB
    z,s%݂Qq/x{o/x7…<-{tsoQ^~O].\7CoսQ;-P7W﷈cҹiXWzE
    b8U1pʰbpOf{IқF76plG0Лћp,mAƎIoDݨo>8opv;c8?	N+Te4rLФ0Q9&%hc9l gqR>gI*lwkS6l*x?6UAkcHRowI5\3ˋu|-8喩[yC<y-z傧12fU:5Owr@7fosu:?-t]pӅh(̸vVFӐoJ>{H.?#5UE5.)|Y<g}%7zA3D7g\9B}o\0`qo26+iz3o	{d[+<D%RF4F;?vRى4@UR,-Ɛۨ!|6i3Ɠ1h6<oI:B68¨Oӭ@R3ՃIC+N_7?9&1͉tT\63B|\fY4]rNojzO�g*/~׼!rE]~S3ob>7z;F7.iF-뛳B{NHow1d1^1zs.,~z}n7SBOt:|2W<
    E0 tfߎeY`8al
    ڧޕ9L;6bGPwI!OS1bDl#4)g^&YCMGО6!5m&&sis;&)+%RJ{~gp
    yCPxLnoΌ!Pw6gAqK'99goG-
    f7؅]ߜufYw5xvz-ȒY&ŁqiapԻb}#Oue,B(f
    p{'U;pP\q]Lot\~`z]̈́6u@|32Hd8oL񓇫qc˽zLA5!$kqFPoFkDl|5!Ė%5mrڶR1"A;Ihcf&ЍA^4WP7g^7G?9C'
    Ff.`˼d-ioZ2BN8Yszy}EXnAV�gio6oHGz{E[p{VAtb}$ްbzaudo0z3pwy.#FBot6SHNV[ifn5ҵε6Wi8v\h8arxWA
    7ɕIt,LgnKD_.ƚ2BR!&M`i&m[97}r
    rY*GbZ0C9Oz¹Y*{pj-ET.xM7B-m0*M%\@c׷Hk*zK`׷pD|߬k1CP�no삋9&z)ȩ7xg䩫[ z	asLjRz.ޡ3t1u]ne]:6pӳ산y$&a3ޢ\x;㵳=c̺ZJI;}q$u5mLW9zk#g:V;d)Rcl|vc(;׆q͹i햑7jY ³+͕W\%-2*֩5Un\|g^mkW4c~u/;.V?izw淃:2x}G<	GJ&No0<o|?A(��P�
    D~CoF36(Ie˖QAlP�
    @(�@
    t2	Ϥ�-A(��
    t3.�2	Ϥ�
    (��R@7[&0�vEP�
    @(�LtKi2	Ϥ�
    O(��R�	C}
    �
    t"[(��@gdR�'P�
    @)	h`T VUt+l�P�
    0twV_hsun1| H�P$
    t)�ʇbk	Э$*
    P�
    @(@
    D@7{Hx46.@FW�gP�
    @R)ESAq5.O<Y(F_R(
    @(�^Q-	i}l?:$v[[?@(�@xw#+~5>[\{<ȡN*q)$ݢ`H	�9(#?>s87S._dzKl@`+�jFM]?)g֌RM#6'z (�@)siݒLo biS/RqIC(d.6'7ob3'y3aX"'"ˋdJ]pE
    nP%	Z&JP?.y8"<jں7	tK,yu5]Ofn';۬2S7^Tݔ^ZP^PaOr5Be
    @(O.d$=8;Bc٦kPam!56j[q$
    u;S	vD!HL̮m͒r9[.z$YKfU' -d.`Uv5#u{~N>cAhԏnaU*96!ʝ4P�
    @+'{q;эZ職6e-~zmZ+݈@7YcC8ЉA-y3DA7[pX6Ftb!7W7qL$2- ܩ|Ey2$miFTOA>tЄ(
    P�
    $]5?/mž7ghz`bqȂve,Q'0-+nuܖqvfwŜZClA/4DF7G3L$Hו	x~X@04{wnѪDT#zE*"%T`ǝ+?\q
    C83JmDoPbᖑDADoQJ4z˖\5LAs[ƁtVCܡQ3vE]7{O5W\qnxz@ˏݔ7%ћG/_;Y>G+G
    
    lN@Aio/l.H�(>{ُ۞]5?G/p2a
    ?wTܖs"o3pu#Ǜg?	c_zʧquLMP{0[2J	E7s{ҌR|`s>g`O�H+🯜gJ;ůZq-݌nnnSύl|iYuS)[^eSNx_71q	Sr[;@Zx_ӕӏҿů@Bi^0'`B#=#4nǯ|j/
    ?bb_* korݜz{
    y\(�ңOdůozb&,^tˇpnB݊kD(��T@Ln	VΛP�
    @rP3%o^7z*Gp\l%(mP�
    @(0|)Lύ]	tJIS�薰ՁP�
    @Q 9
    4BJl}n@K�P a
    dB7m
    ]-v:P�
    @(P>
    DDa[(-P�
    @)uc˘rsO¼nȺuK81%z@P�
    攼y.JAEn@K�P a
    ptPߩ>aC@RtKm@(�@( t?yݼ覣%\![<!(��H&3%@Rr&Ѝ�P�
    ī@"ѭf-i5MDP'8knؠ�P�
    @`6xa~ag.~|T>>2H1nsx6F;
    ".	s:P�
    @(P>
    Ht;ӿOšUn@(��
    $B͉
    US
    ڒUWS�EM!
    V	9��[}g$4`Jूgj!a=u_Nt͌@(�@%(nKtcVjtsKZ$1vaAB3E_JxvP�
    @(P;3ovtkl)BX7d.pẢjnK[Inf
    �<motkl*Mp/3Æn<";g+
    V	9�壀<(lA* cZ73f*hH3,,>G0-Lu+'Z�	S IJCB.٣SO]?&Y5*\B鈳BLuYC蟱f2^I	C(
    ݆1%ϔjz[1,89`@H)K͊nٽ;2ZHQªJŝS"l9. t[P
    wk{+|sp宀@ۄMqneTEjD6覼KߎJnWw2^?l_2>Z)4)MP�
    Snѭ{".ŤY,-܌ zoǀog.<k	v/xLS<>6K:H++=>Nˉ
    "ԭO
    yU2E~'UMBunTϬI'o}Lq<0eJsܮw'󅄲��CiL2EafbAݥ١=ޅm2߂odevZy9e:{G7dPmU\9+p3HQT%\B[j嫎u~qUlMt{ЬEǫIfsT`G(�Yn
    gsLeݬ)B/o醵f7hX'jXI7dЀ'T	+c8D=tb0DY@`zKȚ"=cd�q?>x%#BIG$P
    6tAaBtvYMn<эG\('[kDJ}nAtp*AĖr,![xx-g`P�
    D覹vndћ
    Io'<CpĖDbY߸NSKzj}ZNͽ &¤0Rnԗ̏G`QVY͘mH?>2	݌PJeH@y+`EK6^̂Mkh5,8m¿ubaQ9!0[majTJJO6RWO=SEV "NG,uzZ<s~>Aػ!2ƀ#}G5P�
    C9&-�g
    |ه-Y4,q~
    duKǝRZZ@Zsgʵp#k(�ҫ3%B7Ӵ׋\e
    8!.݌n!k]|)!LDPNz4F6P�
    A0m:@C.ۡsd4o*eV$BO
    7ᾎXG4, '=Y1
    ג~A~P !
    )-M#L؍L_[3GYNL8K˘+9zۚy|}r$tKj@(�@)4!68_	b$:hqS'\zo%9}Rl"e ߓ-P�
    @(@F\P9[4Ef%OçMO;x7XfVط*ݬ%ه}݀n	Q
    (��(?tv׭eXʛyr8MJe;hg,o5e=[=)"(��H"`*(-)h28lCQzPiuaOr0սRbYV薐ՀP�
    @S@u%sMmIyM?X1lw35c΄#^w#1G;1r.:Z�@QTIZ$5zP.:o_,=JHY-svH�W$S~ʀB7׍CԮa
    t+t+(
    @(lnqA6[d薬P�
    $@[`~L6mI떀kUp�jP�
    @@э@7|+ t^޾v65lP�
    @(P<n1Ƈ)F~|uXXjrhh$6	)}U~ ]DeeuJVW9@(��-Ft^Ffnf}oe0kmmrc�iBʐ>yIB7
    ϋӡ�(�t+1zUW_SEўrB3O_xҥ6I'8'WtMb-8-=􍌂2Y0Tf؜8y,̈́/(c]S,/j8
    @(Fnr*˾n$r
    ̯�)CPݨX#H.'G]YmoYe<j덀iNP�ŋn"TJݨKu n&`Jhrʕڧ7,9;Ua_B鈳[!R&)f2$2IDre]gvmnLe�N(@>
    �
    na
    n!*]Yr.ɥ˗ǥZLz_;k]uC*O52K$ݘgM
    UdC'I++tgn!@	S�Vt;xuG-FFvpԪo>e߮`q%O52K$8Q3bN-!69ݘ̈́nS0MػՁP 1
    �bF-L׍;ކ{/׍x
    0k$r
    1~S|US6-}7D6.T'seodHѨK9u}
    54T[WtYLIэ;Cf2,o&jNa*<<mIP�
    @[C^tэx+'tg4LA~0ƌo4U";o,<ْ5?J&vto*o	j+gLi81*7_-P�
    �-~t
    SS9R(RDF3Vt_E$.?8-%d	DRFyM|d	"7ߑqN1εU2Yfts[,Od�(@ѭeƖ SSIncQ枥gVؔVO+iS̺ʝ-t,#yЩJL$euHM[	(
    @(@MFKv#md	hAVIr
    n|ώʃu]:8e~]oTqt,ONbɟ%)\[QaqtL2-2P�
    @(�tTԃni#L ###Vdwlu+>ڝUj?[J(;_4;'<}Gu
    Yc,3z*I�ݒC=�e�-ftm>a]	c6\>
    wvv
    2EF7aP�
    @(P	
    .MAKnk9@FΟ(2UC(��VnbZuQB7V&9sd@ylnHRC}
    lWP�
    @(P
    Ѥ<T*u㾷raJ.[[Zrb&t�U@&|F9}:ua3 M6^P�
    ]nl}yxLFDش\)R�C(�@bFvS=´mTy݀n	50(��C骘׍
    $KAi0aZЭЕAP�
    @(OEH-CauSK^n*F7Lp駢@TL$P 7.^AݣX>Ch)
    ł:`*ѭmuc7{+StV~FIC9gXLnigf^%D]KV!_(�@e+�trˇ%*%0=>BV^(X%Mi`W][=b=YwmOm|,xQ�P2jjj̙3[҄@-x\ԅn۔閴z_*v%楽KZ?{bݽ3
    @(�2+#-X𩧞[҄!}]K3ѣ*(`9%hq$%bb&eB	ݼCM|j*讧_SS#ùtyfIn-\/iT:)�Q Ft5k|2uf*@2݆.hv}MM{Gdy_�mmX[Ϳns
    *߅ͬ8)(aTf0(
    }8jflLB桉\�U Ft !9�mVH'vQS0=v~ymDonFӏkc-
    |c#
    ES̜2
    ێ;FGG3>/:ѳمs@_46)qMF(�@IB1WF&W\'N%md4 ymusX覾t\˄nLnŌȕ٣�/-_|ŊOm'Ofbi/o}trft3й'mxI(
    @(PhF~#??6-"6вʌnr7?ό¦}0կck&ZwnF1f1`筶&֜oэ?|[[[H6ϽnyⶋN}hO4?MOW%7l
    r
    'B(�Ң)Soiznp
    6nvtNonהpn|p3$P9G3`U@dĀjB0k>!;QMFäO<T_;qrg~n#Ѝv&ڏ~fR'$/
    ㇴ6s
    'B(�Rޗ??.-
    Q|ڷʻiVZ)X}__cSN26R&(`JMLOp2ET&)d!Ѝ$͛ocͬk&gM^hǎ~cg?)~—7v]Н2'Fu�d<Fv뭷<d/oiӦ{'	BLCl#%pt;&Q6v'':F*Fͪ@7i½nTC><o"p�GCULӬ$PLz<[tU
    j=A
    O_ʪ3y \vc\ЭLn"4#vtMً͜mM6"6J@;߲Ԧ5"йw؂g\jL"B(
    @(NBBo܅͟SWߊd\Qen#Q62)z-yxqj[.̬Pgz྿d~7(��Gxm||tp"+{^WUumg5)	FPnu[Ip@|.:7^t8[BUB(�R vtk*U|('9,ptC9mו^I'Njn+'/9@(�*Hэf(tBF![[N}\CxS]c:^O+DSsU ik;pP�
    Xhpo=,TM*NfV2ASX\ṫnDoƀn#)�t$A(�ҩ@:&!&=;nPfnt;5
    [@t	�(n{}7uo=߿Vġ=ƿtyȷtM0eեulsyt{b]϶rI'W:VF/!ZrlEz(���q-NH&ft	8{z{ϟ8{܁W^n+)OL`TE73t6gJe
    {zF5)k_P, t{g4
    
    
    =rٓ'O7<]yz 6MF𡛊&ݜEu_P%JKzt$g宗ƛ6.i`uN81k�݄L;};qu|nэrhfS	
    ^:gtt12xL0r3'yh:b+Wd|YzSSƖ{~~#*djX)%	22`z3ن6Geͱq8
    @W@uu8yȑ㍍kܵknfjii MHA]nɺFiJ99F7pIG7{6J6(H$i.?,	,Mbf\2gg59s[SğS.y^2tp"BMVo6�Zm…O>$u#6S҄!}6vY"^m.t;=Ƭg'f_r@:Y͗IWWt=<=pfw%Qt۾hDzfYg}طx%D}�Sэ'E
    &]&bFʆ0J*tSY8YYF
    c{gglU t{Jo?y7cM~y8}3 ;3ӋXF/
    @(PE7+`nl"(JFaR'`Js=’n%a	xuĀ-J1= eotK-CրiEw)g>)R
    ^7ѼtbqŋhdC'u[bF!:5~t'^_C(�T�VZ覹͋nRn	ico\>	~W5).sRyXhct=Bnnt['Mx?F;hgbGn
    5r|dt(�@�țv{n-چ+g!*U%^;#̺fqD%x衝byagJpgF%)C(bnI@7ӹBqm@gŭzfr[8QZo_vn265W�n;npNSw!PP
    �ݒnnn(<cD7@6p;{@[CFF',^(d3K[E	‡)k}dl@(��Э6~
    U%IEbD{m
    
    u�KgSb.R9H�(@$&\l]I[߸6[io^Zt-[2ǝ}^2GP�
    @(/̙3y MHyZƹ] s[;G7|BSH
    ʚ$
    DTtq薏ސj>y\(�@*,\SOuvv~ͭ�iBʐ>yhO@0[*$T2iMP(�@(#њݗ/_V4!e0p?6Mq}1r
    W6WR8n9C(�J@FQBr6۬
    2FHF`@?9@.)@*O݃}7Nà�Ht#L7uJfvʕ!l6Ht;?pQCL݌G%0nN2!/QEJhHm޸	Vnd.僯ʎJ;`3y:.jxGxҽn|kFrXA!r^դL-^{o쓾1VndNñ\;
    `)	ݤgk)d[sj�[@7s(Fᡡ=)49djשׁ^sv\(ݨ?~jc磑0dN]+S*`*lFn2ASuG%xrr3'ǑwFS$r#lkbZ)tUz?'K
    ^M#b=tSߴUMNTfsu&UUwF;E7)4)"DY2GOpQ
    
    vE_uoVWMvhtlJ"n9rn&t9ps+`%}IbsM):ߛeu9iszrF3g*2'̿[DǰoAG^%n6zR]U:G<ME*(*!ZDטW)won^n?#;:ۊ;ߣ?{>	v?7sl瓏0txE@:ƕ%{i}\Ҍ42=T`M{2KG,566>2mdj>[Ukw&,1;.7z٫'dFJAu8SQ;LsuV_p܊loFm>]mWAF^P`JK1RҟeJU~
    ?ya__padQjLOazc@=cGgS?uѝ+:̂P
    y2Kڛ3?g,ߛ{*逸O6_3Ձnct
    ^vaj[‡)[x0Ü,QEȋ&ej҈T]tn-.u,{M0G[O׫|Τe[sl2YM?R:XO_vR+W>|\"z>*Eht2XTSa#JX
    f}<uV)U0:˽:V4vO;ۋwT]7w>xў;xmscO;yq
    Q32vYBwNCzXDMy2Q9{OٗLP_7nCu]Bc	ij5*.iLkT3̿e^7V]ɍL%9/Wމ̽jw(앍qqՋh>od"USꮪ;^j飯LϡǛ)O颞f&jIojTVi룻BI3+o9+OF L:2`=҉/$az~S\uR@O3-vgƎnMU|GVypRl`vy
    e"RpۓK
    lV)h_ꩼ(ȩ5߹MMэMnW>n].&@ԇP0pҷ8nw	ĕgiG3|>+n[^iwMoY;;{_T+i^{>+h|짋zOҧlJn~S魳E
    Yt`JW3+GAa9OdUb^1mϏȸB@=cGζIܪ>ӧ/gqt׮N%2ug|a:(Ԓҵ/5SZr9=y24yMswasc[)$ݨibez(=mOGdNl4=H/u}UW3jڃu<ggvzU8s_ՁRN:<]$HpZa&ordWO*K5JP$V-d򥴷ȦK)~@=ұK5^`UDVփΕ8	W5ng[^�qc{
    ϙny`Le~O< O>NiUNũf䦿LGo"S3>Z#cqR&$`n]Ru+eCAސ'Ѝ_Ȃzʷ
    Nb&M5H㶦';n^߾i-VU<WӎT)N7kvMT%I6*tYt0dl]	hf@婞skO\%tGk/c4^ebo&f5WUG{M]t;by6Fɤv#k1B9#qrDޜA73pt0=x^(-zZ&tʨ(Oܦ?j#
    﫮})bb$)m}?t%yoVu۳/&2e.t#bt0=?q<@
    4͙<mΎel+Y[\nE{ċnf=0uwj\{O.iLHTsЭgBEa@i/(-Fà�(v;,aP2
    u_o䲶+UW_SEjb-aEAH=Ώv@ng#<$EFl6Ha
    9^KW>ima;:<~	#Lc+ Tۦ=k5u0gXi8
    @D)@72uW5Mf͚BJ5`s+@2F.\9?p|f'6rc]ƀni_Te~og(P 
    ЍL3ԉ:IcD>mmmaf*@2h=]X5	[ܩC@2
    ܌T[5@P�
    @U Ft#.yɷDAl	)6:B0v{@7&f=CW$\ZyNagikqy㨙84I:*aJn\
    h(�@+/YC`5[no	ٜxta2$j<ZɟB3?e䲠P�
    @P�VZ}Vv%楽KZ?{bݽ%j�H@t1&2yjjeT$32,%_8+اiTBpDo-Uu \P2%R�t#z#;tt/){`&©]ltJ-νn|4[2tp"ЍcbM55tzT	E2lP�
    @JR�dtƎ3nnf&v^֞ݐc)^t۱c(틦Ngvz6W,}s_:8c e�
    {ƈn"X_+^t[|+hr͟<eot}Yx\	H@Y*�tra[ǐ0VEԺL3ݺy0Dsh^:1|ŅdSuf2ڡOo~@t`1cWPL/a4
    @0EM[ٰi0S҄	-xrtLu_7?H;LA
    D,bO^'OeN\41x@teu~7vQظ=.K
    @(RbD6n~ΡᏱ MHǺBȼn)B^YB)1o޼~jkf]38koEs<v[>3IatjyE�1ۛkG\B}
    &t=W
    n}}}^7j[sw7
    @FFF
    -*pߪw)O'(ŸPIS Ft!9�mVH'[tħL=4ivE'vtM+~f^Lܶn
    q%oYӺ!x	7/`Eh<�Э8Inww-S]{fhkh3=mp_.f<(��`
    �ݒn#tý[y݂-[v
    Dj(�@%+�tU_mHL:_rP�
    T)D?l(z[Jxl#+W]}M%|!cФ[4C�Q ̶Rr7:Y/e>?
    	zsj'`
    tKMUJP�
    @)ntc3~snfVCfG77aP۠r@(�Lҍn&}l{FQ}ˆ"ћt3$%~Ȕv-^[U@P�
    @2U 9e@܁י#̗ /]6fF7xDo}Itf:mJng~lFà�U ƃ̭qqL'H 7)hݰ0Qq_{i%A7r]zlyioXw鄣$:@(�Ү@эÛ3�6wI,)K3T&Ù8rsιRvJHKncLo	WAMUj@(P2Rn|7w:`A?AmӁMG7ZgX][AI*r8R
    .
    }8j)fynewAP�
    d@э{!Q9lAU~L&)0qt76zifi:*ˍQ6Mj[8'm
    ċnWSؾhDzfYg}77݁n�tRnYH	!4	ߛήI�.}iǚLĿAS叫{2Njn˗/'31ִӷ>:9uoD#m*2yWN9@(�J@XIM!29Mt7*8GQ[uإ
    RjϷ(yuK']vLF;t|]%byU9ݜ?#8[.7*^ԡ[)ZptسMSntO9L/bO1bG7VoooMMɓ'k'N.< Ѝv`Yя"'-qb�
    \
     ϥ\�H@`Ft֘VtbȄ,)i!Ѝ*1o޼~k̺fqD%x衝bya/nwggt$(�ҩ@+WRT
    iBʐ>&٥nm\^7٦OGd4T9',{ݨDo}x/DF;7wq+�
    E7-돹G3Ӝ @ު##l�l	)CnDoҏn".G"Ďn===V;{@[CFF	h[νW7lYeTW;Pk@(PDbD7⒵7oi0S҄s!?-!^2B"^ו]Te5LO+U>J :PP
    ċnV:0tFaSoVk|"$Fоn1lC["rP�
    N[iR-dހn+%x-D4[%Xs
    o.PQ
    @(PDn	B7No@"^eZTЭLeF�Q�,t;t+͍PVDc�nnI@EnGU�薯8
    @(`Lt#jk;rOӊ8ԚGԔxʦt׍M[JэOZg,T9IE(!Zrb6eA(�*G/|nڴ|͙#쩚k45Mt^t6m	o!\"ހpls`M_-^R2+{{p&P�
    
    xЭeRۻᄏg[M림nbtʓ|+-p"
    E7r]zlyioXw鄣}<{�P 0-Eə{ݚL^3Ɖ[̘7Xԝ^ˌEV}rȳ|xރfGlu.~ZKxՇ[z3g?l"ιɎ�Q�(U4
    zX1JjAi+Z%SOnή*aZJκ|t?\^7\JsEPklΏЇnn!k]'C9�T�aY
    t怩JPbRPMb4oUF24^0vA^hy*O8-l\.Wc*E)l_4ug=,ֳbi[�wЩ|P�
    F¥vMXnn5lNEp~uvE*u@<u֊nĎnw=Eċn˗/'31ִӷ>:9KrW']	P�
    ˢ{4zn$*AU3d,>-CM0 Q%w[rE?cCB	ϷyuK']vLF;t|]nJV�4n~x$P2#l Զk׮F0a!t;3P/CCno}Q�Z`4	`.2;XiH`�FN(t|BTKݡa1a?[h՛Y.ϡэ*[SSsɠ
    ډ&<tn31@~h^7	&8
    @(P6
     `ruV٠[АB1o޼~Fkf]38koEs<vN0Zޗǩt+mP@
    `! ,|LtLt}"\({ݨDo}x/DF;7wq+�{Hu>[.;΁PB>gΜ
    &2ۮo
    y}RWuf@ӓt9{1qۚ5mDlvei`ӌFG
    ΅P�
    \m…O=Tgg
    &㧷v]dހn)׊W-Sݼ{fhkh3=mp_xB$(�@9*#͚5]|y[҄!}rF7Fo@rҦx-nA-׭ : S(�@Y*#QM6t+˛(qott˿��E+Wa)@�**qKn%C(�K-eЭdP�
    @6ͦ@v<FuW@R(�*PxэOwYZINNy)bǾ2	Ii3$2QuԒߓ2yLnƼ.m_*{j	mג뵥W@
    @(dJnL
    RAf>T\ž
    2EbcJ@79V	[z0B3?eV1A
    @("bG7Z0ӶΪ)kM>g;Wس/z>%s함 tsY{t#g宗ƛ6.i`uN8/Հ"�e@Fg8չS{[U۝+s<**v9]||~xљgRY�^>Z,yX-[\ݛݑF 0%k*9{+\6w{In-ހes!P�
    Vxm||t;nwҳ#bo몪MYoAv8|OJޚ- eʾ?`jk׌CΉscWڧծ/+#Mao^2tp"ԀnEP e@֔y{Ic{Iړʂo&wJ$7QmĢ3ПMjjJn'U5
    Aspи4Ϩ@[/:ѳمs@_4ns%P�
    Tdn[t[[;ʡjq)ouf>BJ@7e,'!|s39DE7F"tj8]^>q_	8|QۮNjn˗/'31ִӷ>:9
    9Qp4C(�@666v<[ttjsȖk&ož<]s7N׻퉢SEZ+fo?)S)S6£ųH켬9D
    (c4ur.Iwf>uh	-V^7ѼtbqŋhdC'uQM		lJP�
    Rňmx@FKIX	$9ɍbnY:C]oP3	z&,>AWMLK@V8L2뷉觠555O
    Eю@7ڙl k?Q$ts~31e;T
    @(;fSn_p䯡̡FYwtt̛7Z5h5ѷ{ɢ9;zhX{^FoA]�4�A(P
    ċncڴ,J
    )So[hpMzx܇Mds}7ѿ_KSwظ'mM~
    @(hbGl
    �2@EM׍*MWً͜mM6"6J@;߲qOfsA'mMUP�
    ZxmddMR^T)i|e螙5LOK+P y
    Ĉnfjii
    &3۾zWsښQ]BQ"FL}'#*�H1…|I@<LLHR%.(Zŋn#a/9@(�*Fэ'E
    &Hۚ[ܕ64io{p>P�
    
    ċnV:}WM]5[q΍�-PH�H@ҒettKU:J$<P�
    C[Ѝo~[J-	0]Hۮ%k˱8
    @(�B�%:`j.TSÖamO5|̱18
    @(�
    �nkڤ%
    BYɴ�%A7r]zlyioXw鄣JmP�
    Z[m2D_ܻܻSK΋8ղE͹}KABpq?!W~%2sV9QHAR(�R�
    e*K~^mc.W\RTęl^eOmÉPD7K=OkDPVaMl-
    P`b"^t̙I<
    &Lмn a
    kZ)f*oR7Y&w9.Md
    ̗ τ!+^tES'z3pb=+ƺY$OFt[ԋ
    �(1ۂzΏ MHǺCr^7+1;Ց$Q9B{@ˣamL5-=~Nh'nu}3n9;o_εG˿*|}Ǵu>:tebxYi"cD1eyvv[UYC(P4bD7Z3
    &L݈޸&Цm8k֨W~cy^Kyy_qU[[#Ŏnt>[(^7ѼtbqŋhdC'u9]=)fzy}NW5*:}|3\FO9n{JUWkUP@FQBr6۬
    2O-fB>ifԌN#&="c"ȿ;9KQ'Ok'N.< Ѝv`Yя2T]mWEvMkQu!`ds9篭jiv-@ݮ\2ͦ�)S껠*_t#:::͛okͬk&gM^hǎ)֞Fч($nA09m3GiV.DNt*rўV vt+Ėt/{ݨDo}x/DF;7wq+�a[#ɉyLx#`ĝlSO9i]4XKA(PbGl6nz]ѭ'c_7]{g/6sb5ukۈ(\R[._F|QuwN[]m prpfmvNq
    ;s@nv	(suz̾nF59!V	ц^Ip@(P&
    ċn8?6EX}s"&Zyι*C"mHkL `Z&L;Eaegf:F�%/ j�HA7m�뮕,:3)9fϾRQ;ynIʭn[y݂D[hP nbG7i3J՝+2~Ϊ)D9˝2yr)ٝtE~
    ċn+-/�9@(�*Iэzd8YNA"0%ˡN`E;ygY;dj4ЭR5iVj=P>POgܶͽx2D&>xGU//T"!}DO)9xS[+`	61wJ޷2%oYo-?!��V vtkʸप_pp{դijrf&NBu'%Or]
    f	"7s5oIj
    ǒ�-I�Yэ[ϴ0XmN>n%:LGqVtN>c͓҉LW�b&t]1_]	mג뵕hP
    ċnccc#l[TU599"QGY
    @rM%SﲢE*Ωfmݙ60{ڴTG05icެ3\FdW*t[?Se#/�(%A7Ib:<q3,T6Ata)eBK>Y"wOJ9MnUL
    ݈z<SB7iFU(}o%A7r]zlyioXw鄣xܠ�@vMrG7&gAz`Τ|6x: -P]	̩$Vjumb>܂͵\HCigRC(P
    ċn3mHn=)!`^e:Fj^B*mK75!9a]msd6Dereb٦/G8@);fSq126uk?n9OJ2%\ngVq5틦Ngvz6W,Mؖ-eh1@622҈ͦ�)S^7yHBZl M[wemݖ/_e
    m'Ofbi/o}trVp	1e�H1۬YZZZhŨlnHRm)ytB(~L
    sgtqr?WbG-9yuK']vLF;t|]qUdKP .bD>x'6S҄!}0w3}n} k_&4zҡ[S vt0_;qrg~n#Ѝv&ڏ~9׋-ia6mq_r ^
    @d*#<[ 6S҄s)[ѯnPFutt̛7ZYL4Κ۽d=S=/VMs_j2g7HPB(�
    @fQ�5nn½nT#><o"p�GFB7
    rHe
    h\ 9W8	
    @t(�t+-YݲOK10bG}tXًԭ!n#bs-Ka0qvܹg�Dl,P 5
    �݀nXQш
    ĎnQF3F[CCi#u[dP�
    @(`U�\tnoD/+I
    ċnu@[nIuP�
    $U-&ꕫ[pL/9@(�*BЭ".jdЭGc�V�t+5�Э؊<(�@�Nwx"^(*
    �ˡP�
    @
    �݀n.(I|%D9Dil˖N<sK8z	mג,NP�
    @n@8nsiZ3:DOGUYRKS*t[?S/׏|��
    -`=eU[A_vv%楽KZ?{bݽP�%ݶ+W]}M-}XXmy6G^	M|/`[HyM
    ȝ^OϾ੿yW	k)Z|SoIɴG~Pl>܂Q^y/a(w^GB(�@1�%
    ݈RntʗH+٤1MOV\3Ú.^,ĕ$#v+R2'ɒU.|jiu8uЇ񖭟2 =%d?
    @(dn@XO~:~A)q̓ni*U($F{(k)fG:rF
    ܡr'"}ԉ.X	bA7Q5C:(�@j�bX՛Ntb<"	^xqn&֩amQ06Do&ƚqG'gnNؓ~͵CB,g翅/X fx�U/d�622288uC64ܻwuOwwwh,)-M4Sٞ1-Ko-S2"7N/{=j6RN9j;> QTRW
    B)3TZMo~)bЍn-䉹yuK']vLF;t|]
    :ĕ.K#|,i*S9i`鎵u�Ƌ
    @(FGGuuuwttw:tXmo]|}>�+PlFg7Qy!c0U';D>j0vi <s_
    \Sp?tC?a>v&
     qFZԜ<y2k'N.< Ѝv`Yя@7I\A^7k:sh\6ϫ9F^P�
    Tn?KӧϜ<yɦO=zuu{_}UxABv*heRy}(`*1o޼~kf]38koEs<vN0Z>@Dmf:6bb@7Ex>$bkUP 
    ڵ荂FܶuVЭ5-;n}}}^7"[sw7
    @FFF
    #wmGWhvL9Ρ -`'Dj(�@n4=�>BnaЭ-;cG}tXًԭ!n#bs-K͘iu
    
     L#y?K:
    9r2t�0)d#"5P H[(mnތ_-S݌{fhkh3=mp_.0GP@q5)�tMtYa
    ċnuF}JP�ŋbt;f9VU'y)�tMןז5L
    qr
    $
    mrP�
    T@xQ,܀n~@ȊL�P�-lś薌jt+P�
    �ŋbЭ{lKc^khUW_SE
    ]NKԙe]]A/<&XUBt۵zmYɡ�P @la+nݜIR^sigUeFtSazHT~̚z>f$P�
    @@xQ,݌5iM*g/
    \^Yw|IЍm^"o^۸'k:h
    @(@la+nզ's"*ᬖhyts--y3-3Nj*]γJOmb>܂8<R	ܫVUJpjL_RB*�tŲM26Mg8V7Z6҅b2F6˛|uAbc,MUDA˝>E&=JnCNZYҿUrgkE"A_@\(
    $^[ozݺ77$w9RsMI"6fv|ottUGw:ZeV߹a"}ԉ.Xnkx?F(mz[~KX[(mnMuDxXk?m&t&\~<Pk'�RO=<
    E˗GYtkZ{Fw q8Ex[Rpd)<r׺cz5yf*,E2U,J_,|X),; =].a 2][o	ה~ט5)E@!uScX*$qy;B-9yuK']vLF;t|]flXGOdRR^>΅TvKoWq S3[db[J
    @�ŋbMFKufᗭ3US~p!
    RJ>>n̋n+V~{ݨ⽽555'Oj8hb3?@7F;
    dG?
    @&U??7p~th/w{z QdVgёT:Uyʣ+gn#�-[؊7DݛX_L{W\
    n$bGGǼyuD㬉KC;h5z[*n趀ȸSA{*2p:T=CR�/e@M8+Ic
    n}}}^7j)[sw7
    @FFF
    pmB#q-W|CF	lίR{s5Z<|.]IN
    @
    �ݲxӻn@gdzzz2u;{@[CFF	h[HW\;QzWuu{ߘ蠇8$OS0FA7\km}d�+P�
    V[(mnF7{-7Sb*;Ea[m
    
    u�K%F'T
    @(JnVum: (Y"$FL}ݒ!j�Htm###CCC-@mydAMS1t뢾nۀnSTx-ixGKAP�
    @
    Qnm^{ӟ?y?)/	HtcS[wmfЭEP�
    @
    Su[W_}u+QjuT^d�(n"f:k֬+Wn#Ȁ׭mM[ؕa_NwP^.(=
    �R3P�
    @Imj4!V#b{74
    m6q72/	K2Wq&u,]Օ~V	mגUπC(�
    @7i``jzaBǼn81xRnΚtW<(-[T~6x><d�lMCC66[&nn:6'cNt3�vkZ~gE&7sʾ'o}IЍm^"o^۸'k:h?!(��F64flKoF5MoF4'nd.}4%{ԺTka"~sOŒl{NT}mb>܂-sݾ/sZ}A(PY
    tSJ	_t+�h<#ߛ$%tTN$㉓K
    .
    tskta]_bM I
    XY2KnCNZd	<~A�Ht;;׼&mߙptK
    $8oI6X}
    ^7:±]\ؑOys\x-j
    MY9lXE=#ieL�t‰P�
    $Bnd77VS(j7;$"	^mt\k˛Z9;UM#vs.lߎnk$^tKă
    P�
    @�Ŏn/&[d#L8n:Hg̈j>ө?jeSrvVF73
    @(�*Aإ^7=njnhqq&U;�Ai`]нch5̘i8ࢣ[~h>P�
    @lnoz2hBѭ>l0:	}P�
    @(�"*эM�-nQiC2(��*A77-*e{"=P�
    @
    ~kO0[ԂI[ɠ�P�
    d݈u}�-�P�
    DT�/|@A(��VL^+�t>Dz(��{FϋRBsT t[5.Gp3$ۿ`j̢f
    @(�@^
    t[[תG*�r4q*+:TPl@$P�
    @(݈ބ%ݼ!�R@68|`E`7[Ld�EWn*ƚhiQlPs])L*pnrEv&`we5cDu|g̊ڌ-بSGԕ:_џS(
    @(�݆ˍ{Jnbw{`y"]^7fѪƘLAMtSG3Lr%R*tdnxB(�@ tk:?fw0-1)fsj˼;
    2WЍӗ�~7~f	s?[Jwa)Kwd(��݈8^+w{Cl&qPe-T;i~
    &rA7}
    >(��Ht#z+1FʣfR鐤JGi{h`T&sh/JTNm)0MP�
    IC7#*kWJLfLרw@)wp`WãmP�
    UnDukԅ/in>ܳ	gZa�EU@ۛΑ�0%tSvkw)v s@٠;EAQP�
    @&	s[mC"[bKA7<.�P�
    $M[^
    $	ݒvǡ>P�
    @(�R@7yrP�M�P�
    +a)-p)@7<s�P�
    H=LA[nWd�Pn@�dP�
    @(P 0hů@tt;zw?\z=
    @(��(@HzQz? ;�P�
    @lj>tõQpB7M\
    @(�@WdͿBBXô[@T?)Py(��H@8ge�-!<�V�5�IC(�@BH?&SS+VӔpସ�%G5�P 
    $0flLt"xcbIC(�@BFaZT襫R)y)8.7ws{ݔ
    R)�tK=j@(�@E5x!pt Jm\[<P�
    $DzBJKm@P�
    _Ǧ6XsyݪpuK-P�
    @+
    ZK-7ܼVnQ(��H@B
    (�tK-P�
    @+uAghDb
    nYnQ(��H9[q@(�@��Э;j��W�V$pA1@?.(��(@70U�vG
    �P 
    �݊.(Z��W�*@P�
    _ t;1_3%^ZrUa_e*L)})lBZOq@(�@A8݌PK8B-%ذc?Э;j��W�qMr
    tǹq@(�@Hqͫ|u-%0g>4y̅hzxZ_VΫ%k.[%:A)<V5P�
    @+n3) al>jeILffuE6c쥣:<Y#xn\P�
    @(PzRnvy^ӕ-B-zdI P}&})	t+@(�@H?jg$GQ::_[X*q@(�@(t3N8723gN'9u/4~ɄN\tz9Rs6Э;j��W f
    tPS0҃sȬ|&,]1i8Tl/T@XW~q@(�@HgG)`PȪ]@P�
    _
    G|t=%-�
    @(�J�-"�"
    V5P�
    @+�t˗Hp~Dn\P�
    @(PzF+t*;50*Y[ow�
    @(�ү@F&�V4Uہn\P�
    @(PznY�Э;j��W�;̬�q@(�@
    zD}ݲMt+@(�@݈ޘ07GZ��W�z$JKnQ(��H@O	tK-P�
    @+>tS;̻/Iz)�JP�
    @(~҇n
    bT7b7cWB!-�
    @(�J@
    qq3n8&7}(ASUvG
    �P 
    
    ݚjIP=ebٗ2i)Qq@(�@H	ȧa<jڪqS&QSvG
    �P 
    �xS=jhkĥ$5Z��W 	ktTCWdŝ7I�Э;j��W�
    ݺz/g@(��(|ރOu+nѭk��P�
    Xe&tkCpSeDG;(��EUu#tnMVoЭ71
    P�
    @JR�VpnA[�P
    �*
    d[Qob��ЭS�*B(�@QG놾nZq7VԛA(�@%)ࠛS;%Hk&`u	`*B(�@Qq{¥uIyV0Ҋ=c[Qob�@\Q[u5!b
    d@JzP�
    @(PT'^&kNy	XJu:Z^_5L0`lЭ71
    P�
    @JR@L#+10O:GߪD;e*,[%=CV(��(	E7MsƔMf7igl)gگ0*VsnEQP�
    TIE7nr
    xД Wx9@JzP�
    @(PTnS*rfS_2j
    nf8ҩt_0*ss*'A(��(	F7M3iL2Vx1SLmz$uJ@P�
    @("nEX�	:68h&BU�P�
    O[ȥ͘1j*;Nl}G&a`>WbJNCG{Π$(��M[sV
    ݌)�:j;1Nf:Mpb:6ޙ
    \lOd�ER�V�r,D7=NA{Ӭ^4wsMnp4,*l܊t(��*�tx*�YA7'@*.~_hV@}=c-'2P�
    @"+�t+�T|qf`E}^:KbΠܮ"r(
    @(�@>
    ݛ4wQYX -C
    #	ϓB(�@E1nހn)٠[.|�P 
    ܊_䠛g?7,j
    �@ƾn"`C%`ְ.@*Pp/mUsP 9V7�e�Αu{ۅm`UW_SE
    n0Wz<YR[=( (��Ha&)0k`V4t3W'eAV]MH9삾*@ߨP�
    Ѝ\ЭZZILDE٪*2RځbW�Vv
    4
    @(�(f
    AXbuc.4ܵf@
    JcAWbdh*�tKz@(�@)G1	݊n4je4W"슸jVv
    4
    @(�@(ѼnMMVĀ)gZrs:vQx1эRbP�
    @(�B0cbэA1j3G2D
    ^"[V薔bP(��S^9ފ0eA{~kBxtK޽A(�@*	 Ś$^P='|)k$C[*4P�
    $OЭ+ܼUD<"*�tK޽A(�@*66t2>SztcLUD@�JC(�@8%bcdTPnɻQ#(��H@2
    �Rx@�P y
    dnYTL0CT۪bwFP�
    @(�٢;7qP<MCUUz_05^tczqPÅnNABP�
    @(PF
    ;�EB1x~xэ̓'Q٠xK+EB(�@�}^-nǕ:Btg)tqy3~@Zyy
    ӅKxAyP�
    @(G7Z
    Yו[Xk!kCNQgSpg-tksY7]?:N]oo�@趏LO|[2ʽU6yM @lΔ6^t 9@e58=�Lb84[>{EP�
    @(9b[;kn@L89?ӗV&/tD7;#[0uC
    9B(�[ЭCp[	͡)LD>_5ƪ 3M,6s<e<r;1ŇarJ;q<
    DF)pL^~VT1`#[
    @(�R kt[MۙL=݂.ǝf.@n,/N̠CvHDFYG89@7	՛	=	ր1$@'KݓΕkN{ni
    ܔhbu2 q=ʐPRB{)|TW
    t0
    n{ݼ\̀)?=!\)up0WU݈vB(��Ȩ@.X^7^#EG7X0;-"@@"@(��@V߱lE
    j&'X`38itssG9ESGU\G҂E4ݢ܍H�P V߾l/3Wt]yn܊n^grPA`qyM`S3LA�˭Z]pu_a
    f�
    @(�@
    [:c+򘁰FiHυ-{gB(��0ݴ(^4Q?욦@7<v�P�
    Ģ@FFvs)(j'%ntr%<r,#*nm/$HzrmkhKpu@P�
    @t;&
    V^pUn:/e"Iaq+omjߊ$Tv',W׌~ġGqK
    @Vt;9:n@bM%3} ^x5Jn@hHU8A7jrV$0|tOųu%+U]⛹yȇ:;d3 U78[=)(ˋO3FRg�
    +{YMsōPjarfzހ]ذG_hA)�t+=TB
    n
    okFLoVxD9XގnY/d&qxnP|3'ʪbf$aYyz\yc+HTmflG7rVNr?D9kbB,>^|.EQRͪ0j3J~Q 6ԟ'Cરm,�VzEa|!9/f}3	.IܡԩG[3-`-a
    	4M ͤgPѻ{d@vD?咀6?k5 P$
    
    :aaZX)܋n_3C7y@f,X*<X<pt#F$UF&.
    V^CAY6ݢ_n_W?RfK9[KBP.`:0v-(}\@\Iv
    Jטbd&$VAd
    ,Ca~*[�b3fPfqeugu̯tꩾaYp?bP元�
    ͑/E+-ય&#Rj(<k>הsצߛh:(IG7cEQ0[+ntD[goBog&ox7f^*ٽIfnPb^^7Vpn±#'\Q6jĥ|"W^TǏfqY1 mQng14y.EFTk{G)8ڛŅ@e+49EK N_7mo15'͛#A
    v{t
    VlfٱSJGφƛwĩP�
    8
    n3V|,a wB΁i55by:π6tNqB)
    -#Gtw4B(nJ^uvxayX[F1g9%`*D[9?sP^^-n9^"PPWd6sl)NPT nG7sPRS|]l4ԙk	�2P�
    @T)03uK׍s=[	,H[,P�
    $W@tݔy)ƣ8v1ݒ{ˡfP�
    @(�Q YVS{>6:SCV]
    [-{p.P�
    @+nbABXz58L!y0e�EQ P�
    эfwsaj['6y
    �VA(�@Ȉna^7[)5FP�
    @(P
    }a
    r-jVA(�@B:8u `<J[nEQ P�
    @AP:t+Z�EWn]&oTk[om��-ISuP�
    @+n׍o/Re@(
    @(�S0t#zVZt_Zzsߨe(Lu
    @|~UP�
    @(Ptѭs~an8ƹ7%2]qlsi
    B-rM$OFP�
    @(P
    D@n1F]A²M`+<<
    
    @(�@N
    ݜ@ ,'ީK/I_SS4Dy/wF\d)WdBnFUUֆn5%̶ۃKt{$(��^ЭVFKY4^7Sd #|V[{n
    Uc>WjƐK֝S1[)Nj_$Cڲ
    br
    (��(nDonIpP\xK1˓.Ԃn
    A}毪%Cͅb<L�P�
    $+7a�W-Z6?g,j	`,]UW(��@эw&3_>a_j+i
    MӴlTH!a	zȩYL=A%+x*Q�P Rn枾LN@40:%gAU>vY6fSW9h<WwPQS'V�_P�
    T@"Y#
    �*Q�P *̐kD@x�s"(��xG2;90w||YeS +tؠ�P�
    @ <J0vkS{rnޒnٱRTVMA�(��)@5	VṔn݅H
    �P wJu׭�,"߀H�P ;S1C4w3n݅H
    �P ۘM0
    d7DB(��)ЭkS0ۀnɆd]P�
    @(�"+,t	Aj.0^17;XJ6@7 B(��Nd-[4K+2%@BP�
    @(Yu
    ]k?Mwt+RԵU0ݒiz�"߀H�P ;lvtוw^WR2^4pD/r^^~[S-֨eN%-�P�
    DV iMpa˺##.q$%:8牣%ft|"!P�
    @H)viis︒
    tsEi52C.;few"5P�
    @
    0ttdhSBNa&8l-D[v4Uj[	�P�
    d@э>/W4pi؉!S%QWxݲ"	[vw!RC(��@эYM@v:y	Ns)OTa
    V\"RH�P
    t,J0͎:
    V{yC(�@E+эMx%EP�UCP�
    @B*Э{a@(-
    �
    y"o(��h$5`)�t
    �T,u-	#Ly"o(��l|֍n`|׭*h=P�
    Pݔ
    /|[oYd
    �@-(rBw(Q[e?Uz(��(t#zs>nDo@ȂB[oYd
    �an6tSVtU*T|sa .K9/,YOqeYLsRO@~P�
    @(P@t_7Mo>[эњf%^/Jߔ
    LNƉ%[ʹٴ2ine5P�
    T:`u#nVh[]C	/\qe8&rE/K_[e?Uz(��(f_7+uJtWnϙ;5ӤqE9t*�jx>6ϲN:+GUN˩@Q*͂6V[YC(�@e+q"uPqc_njps*g4x(VaMUDtb8=n&Э*h=P�
    Pn=[y$)8eKm.uUUJw5ijjE7:}Džf8d_;Y~q!49�
    x"k(�R@MM͜9sfbS
    I/	B$wr'()(&t&`[]}&Wiu
    tKUPP
    ,X𩧞R MHPt
    (y&;fn1`j|0BL`z+sq[Xx
    DP�
    @)0k֬˗/cS
    	)c"QA:FW5s7|b\E}<#Gf@K[PP
    P(6	)c	$J"0�z _(�R�ȕ+W MB
    ZA݊2V-/T
    @B) ЭP6ߌږVq[SItEFP�
    _n
    dD7t+)TX@k(�bSЍ9ʻ	Zi|S]WS+S͐̀N4		Y֬uϢW:H"L+\[l|d@, ".h0h1YTNa<smKnMr]S"2+b9�݊,(+�tK-P 6:ۊ;#>Fng;WȡD}Js3[x3rZL$s30tr_Pԫ)~ү�-G>2P 
    tq6㟍ݞ:(ݹ}g~tj~)S)"e:DQWLmŎdD7Cw2AϰBmX1ƚ{Ȁn釦d�w
    Z�@l
    vvNj0n6;pGu6:yt*]b_\%u2O}Do
    Y&!}܊K͕wxvn=|Q˳ X_1nuK@
    @+ Э^j҃45प_پa~:K&V'/Own*FWs^nRz߿#f4DbUUK]-iY"m)A7*_@_
    [ UytK-P 6tme2nR{U_0]J@/@s?$/s5yS%*},h<|bلf[
    !_0rnVbaȨXU!ZnTXpʳhOt푏�Hncccǝ9BzvF[S{ΪOE_]o][`>,O.+Ndlj6[ji0u+nAΟL\mw3}q
    InlScqt]+kwʨ@k(�bS 89,|Be'&!MibSF:OɍNLtw&N`9ũ!G7/9ɾ!
    s͛o=YL8aLAa0x6͈rl�)@
    @+ (6ѭ={[դ7{
    t=[jFFL9X*-ttK-P 6FGG'cR_;$$`Zł̭UΩh`=hsXuHL͍nuvsR\P伱T[~\�GFP�
    _nȈnEl7SHaāSbrzM?jDV+;9.91*�tK-P 6FFF MBnP
    (i^7X]$dǕ
    ň[qft푏�HfjiiՎ)H
    ҄Pt
    (gS3-B1h:t
    ݜk j@*�tK-P 6.\OP MHP,\FLEK@
    @P'O	H
    $䷅b!en]ET A*�t+w
    �IT�G.@$P�
    @@Q�P�
    @$*�t#H][u	
    @(�B[t Aʨ
    �F@(�@v(h5500RnIQ'(��(t#zZTL"'FoelP�
    @(��%Q ktt�P�
    @)5P�
    @(�@*�gC�P�
    @T�V;Z
    �P�
    R[*6T
    @(��LnP�
    @(�@*�gC�P�
    @T�V;Z
    �P�
    R[*6T
    @(��LnP�
    @(�@*�gC�P�
    @T�V;Z
    �P�
    RBs=[EZ~>D�P�
    @(P
    &mhUW_SE
    ]ްSۙQJ]F#�P�
    @(JnPi(��P2G+wqcnՏh|ieme�h5P�
    ˶ɷ?[k|!'3g
    ި$Bn35n讙~ph;jƈF2(��	WwMkw\䓊5j>@RX.|ꩧ:;;?O"Q.uk,nO/[O?Evҥ񱱱gh/%#D7@(��H_bˤnx]5j>@RXf&gpo|rIg@Q4t#n#ϒ6͚6H	z!
    P�
    $\
    orO"A?IV&N"Q.F3>ۈw~}ctTsEOXty#
    P�
    @* K+֨ʕ+C	B7FqR$}7adO>FáN6?H)]x{bP�
    @(�Hn]n]
    Lv=due۝MgZ}E/wtGoZ
    @(�@z趶bH5?mۢپttTr>;g^qȉ3{q|u]Qs(��nS|bTm#ܵ_u#D5<r}UkS%j>׍:ſ?6E	1_yWU̙I	uttw߻d?'{eՖo=qC(��H%@7m.DS+8S8ݵRZcxэfkk]mݖyO|z+]ҧ
    �99\;<(aoJg6®WX[Pxz̟Ru8sΪ)YDnn}ݷ:r]tw%{qc'$s
    gP�
    Wn?Yqch&@UySبGUS,NeT)|!c'ƭ-C.9͗G̯S',&zu8* tvb!֞:s֓sSdj�+^yPc`1lk>p?[_S髾Aը$B8Q/1n^wmaxGHA;UUwҲ]G˯U:=K4Ts!)}ٯ~POs{B/Q-T@_ᶇP�
    @(^Wmցb_Nv*WM+@|,QI΃n+ۤߡYccy'Sۆw/ȋ&6k%omٱx]Qs(��ݞoo(U7b!_j>.ϏɨQdVB/rtޤRc%?x t[b4.ٝw`w<yh_?ԁGpC(��Hn4^}Ee̞ŭZU?MS}UcCS{|uD'½n4xsK69}:8-tl>DG-_YvT@'0[nw~ȳ}Doz{"`T¬WQs(��@	ЍћܾL#nDoO~hVt|mxYM?u*;'Mm<d]Wd}^3>⶿­ѳ0/yP�
    @(P
    0t;p};{+֨$BFъntgM++дmt\K{gW"Cw2xZ	P�
    @( npcXF`p7!AS}j5iUM	0ip-{m)xA(�@( G{>hXGA%nb8Z<mO/{es!P�
    @(�SG;UF'½nykDHMpR6P�
    @(�O?om9]F'Hw֬Y---4DCo|r|?<3P+W]}M78ve.mg(uL
    @(��xC}ëwk|.\O۩b7j>@RDknQTB(��(փ7t3+֨$Bv?89(\X5Dx"
    dP�
    @(��(@P�
    @(�"*�t(A(��P
    �JP�
    @(���-PH�P�
    @+	6)B09H.�
    @(��l2[2[e_&h=P�
    @(nP(��P�
    DP�A$$P�
    @(�@2n,lnP(��Pr�UoC(��S�薺P�
    @(�*W[h9P�
    @(:nPa(��PrNŋ+P�
    @(�@IxW+Oum=ԫmhUW_SE
    ]J4@FLgTBZ΂ةΑ ˦Dg:G-.3=XsĻ̪|;͵T<bNuņNu:?T8kj*
    6Gٚ;gJ3NwL|^+c] g?SvgFVfD76ng{/We62sپ3[W(;ޘA%h23aul)VˬbkmR;#t'*ڴ
    58~kFf?ןm/-k][kYeέux;;ּzG{cG3o7Rw
    c:KJkv1'xlY:moP~þulQYMH|{s#-=[>ؓ}`2P۱P%4@FV|?ˆnj,c"�\1M�D!FPXlt#nJ1΃nΝKK&0N#}$I$Wt#6Oj|>m|bdlM@�NқĂq:ø\$g7ќhFW]*Do'�88�'[[7mŸ	`XM`IЭwꯪ~uzpdz㫝MoC7ӟW(ht8A7~.c:9zO
    nm\=i/]GH\<Fn8-+t3r0..z;}oe�8{|o{$ބ/U�z^XvmPo~}ߡC{)r;y")MO9eߌX!$rjD-㋜LǛ..NO�H:lSmnFT]BYfd�^7[7~1$o9
    n:x"ЍN牜*ߛ8k^'xo:~<pfFN�iYRK-n$A7L~Dor{W\z4
    ]h+4v9Ņm$bbitmKs}؊إ
    K?rɰ#f&f,\<8姿24-1Ԥ 0#<#H#n9sC=TbŊgy{;h
    @(��P !
    tMvCŋ"����IENDB`������������������������������������������logback_1.0.13/logback-site/src/site/resources/beagle/images/sailing-ship-128x128.png���������������0000644�0001750�0001750�00000044233�11777770134�030025� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR���������>a��HbIDATx]Ү{9qAPbUD$H (A@.p94ᯞ;}:
    }I9ڄFM]v,^^pKGN60v]^{#y	^la{EW@ӯsS[bb6WzZ~?\&>:$�RoykJߧps,mSTP
    ɢUNV&ϽzpyOYj~GJ4=V>J?VQqs4>Kz?vU?�^~|m0fXZqϙWXPB
    &7QMQW(̳B㜧4|qc?U39{CW�hG=O7ihढ़E/+<0D;/Vd\(y4�2�T^\)7uafDXVV~8_U*Gb_}=֮;j?�w/_[X:S3wC};z)l�@+�j%,vY/;Qra)G)cp
    jB4yI֡}](�XE%6SA~[^rBtyCp%$#�NtN/8y(ŞٌIfFr;dCvsNS;ov}�՛å)(b4Գo4,1u[&7sp%�� E��P�;Άk+:z
    :3C6.SN04O=Q9ϲt2w/v4�XʶX+,b{oʨ{{ghz6ݹ\j;jYoM;u-�ʞ{uFXYg@M4*uJ@)@�Y)^g)m%)Ntx+VO],�Y^t⩊W
    n�hF:0mq<c?ęWF&��sWYG_]Dz(q<`8T:Ov~,�ƣ@A\ڣO|n[%ߌ9�ܷ;:j|lׯa}zV(&
    aCYu[*,[?Ƕm
    |e9Kb+*^:{[щaKgkA:(X�
    6	:k0?�<ke/*{Nˈ0N@רTc_ZnWT=H�dw~o~:6Z2wvJ~~ފjɵ4|N닼Nh|j';+r)NS'vTW'�w)=jqڵIm[@Nj
    A
    <l>~kC+wܓ3ۼg&]3D>fTΦ6xުZ?WU�ۘJƝ6YUM{gԃ:_䑢i 	O@`2ۑ9Z<^bY㹣ZPE݊wwޞcu]d4mY:UxS[Y?MhGFHi
    lvTl}¤[{GxWҧx[/}�j8XR>wj|RzɲA!!>
    Iq<P|߯9kNY}kj]GMVms]]&w[n~{^C6iUZ KV%ܐk=ONFGBK+eɷNǽ^YoE,t)󻯎}_�͑Tpȱ'X<!q:|B!91H&!^Lt`H!B'repw[KYS^x-ioѮ[1͝s
    �WLb3d%Yϭhc3cc`l0IH0諜Gs7umv;>=z
    vtzV>8i+6s{O鱦bk�p%ëQ>&xչJ(}+jvXf߆ԈkZ2h1GST@ɯHAp\Xnc*O>?-ɬIn攞6j˕,W�WliW|}q:&)4}3!-X5DѨ&<2KS
    ƭb됔0`Ccm|!a}h1򹯏rϾ8VnYdwov{y &n}0
    	鈟'*}>J곬:~̆}<F5l}c/5sCM{�.WlpiyeQfݒF~
    ADht^q?O=UWX
    3~'KsypO7#�h>g_i�{zHi,{[XMa\uEQCLLD{e!Jco*#gcOf�v6g_)�g3S1nw#͛jb%)j*&;=%6_uɶyԴ-;Lwiw#?:m}v�{�h)Z?zHfC!:p4!Gv~k*R3	Vy/|yZ5vy_S춞E{WhᅟZ.+�z.XbDžeZS:;5*b@gk
    4jj""Vu51wT+KˍGp3}hr_GֽxoŠۚ;.<kc/Zy_
    ֋h>wP/"5~R'$:H>`_Iﶱ3ni]M1mZ?�3�.[ץEF4l@h(`0|$z=b/LJ!YHKYz,f<P0U>OyVǂwk"�[sQ.�>^ùR"
    
    |O#8<)u	gC:M-[;2k4u߼\�&}mֹ:4'xy)BH(:OK!:/v8aܺy^vs76g28+9YQ>5�V_٧^߫oIױ5(FB".^eRo-\~ڭ?NkCӦj]z^^k�^9ommU$xU=GBL.tVYH۔eƶnVu>͙-J`O?k|go_D}6{3bx? Y�'=e!&	f&lS@?ܾUcVxy�$�N�•ڙW8Lyۇ3{hZ.U_i|po۽
    pF�y'�*2_6|&g=	1#;)F5{n'E;*>~]iQ_oz)φ{'+e��Ε(k7_8SO	1AXO#L`+9FpQBCJ❇e#�&
    r44,ϸ@crU-�ƴk]C/h0Dy<<χ|5`	˾q
    Xyψ#s]Tz0\�@Y_=}g0쌟nH_B|"wnJ&$ǾV8svtWOY1O̞>~x^lY6z>s,#K45I?;sk1k
    \?RSD^/#dTןsIvn;n3&αm?jP]YCh}teEquJ%OGeWfܬx&ֵI`ᫍ0;*$'⦔>_>[bs/6e^x桉PM9юK�c~�З??ERm4?H"~G}%㫱⾓efrDj5?Ы'=ֶmY>qG;+&X!M|6K}s} $p\NϠ9>p_p	qcO=q+no{J%�>S>,:"Nj+*x`4\(dEXu)bBB!$PIyܻGϽZ
    t̰_WkT�c{�Ă^|1QcN̘ ̪<SUa:($,?|||RVv{%|n8PZ@�p"1!�>*ҥV�LZɰЉ-3S=Tq^@Q_V�yo67BuK˕�d5`*\qѕ*J+/>;PC	�RW_]q!PBSՌ#gYzbϰ`c;٘a3Y�ϖ�jv
    �ba>xУaZHzW]9R&_͔xd1zf3|{];|զxe|zX;�7nXI!J�{yG?|IJ'QA@^r\6秔jx}+<hSe;0[ZD�p[w߂^@Qj٬c2VC+l_dFoME>EpÐϾ"seMf>=`-k��xp;vr`f/T93tp
    O
    #?J-vk0{<r~t�}%7o̘Y5�LX~Sɝ3x|?e\\.�_)I#_:d �\, l�)w?*tۄ{ᒜ-+Qj@%(,-zxgI
    S@\F B-CЋH`8_f�͛kݯ{'nSw��Ϯk��3'<ܥtF鴚jl²ȏlv
    =Y%&�M=zaփ_3F�\o))6}v.,ϭF
    �-zgHoԾeUÿH�~@Wi|
    Nj*`ȲA0롏_F7>S'sI@A{U(C¸všb+p
    ݃p7e0`Ш'?в�=}EI9LRɛ{pY:[	W'
    oF
    �Bx}<UK$PI|~P+i �VWЦ71Xzp5�tفs:E7pH��/ɨF?x-b�Tw~SI,O-7 �3�.;_N,*+|dacq
    r(GeQ!m!|0/0zwz^tmf%fҦP{̊0f:T۱݂O*@2*d$x@m9_V'�zw4PR	kS6.ZqY0yf=s*/;Vᳫ_i]I3ySFZ>zHxKq-F�LZQY4l^Ŋ\.W
    ŀH!`7b7p&h6 E�gR֛~Z?7?jV	N/#>S3|yt%adjT{Z-t]ٽ>pY\H0ԏ(:4ry&_3Vj+7,!n5U7Il$
    S&F=3-~oVt	�8^9s"4tZVdw6RtSz
    9_"8פֿ7!-d�1ƱQa(4dR
    ߂/bCpۡq9ĜQCX;oLM㹜5XT�ܵ|L|D5<MlPЌ@�ۈi�rAցsLVjo_#�VoU]o$)�_6e,ZY�ߣ;&4@JAKDaEE@:*&q1|X*%2$Ust7$>`Ņ
    ȩasVE%mSv'^3xNzd9M1N'~6>JUk^N>ZZA)Ucq\i[I.G!Ƨpȟ$%cț5d긶ѩǛw$�||9SeE=V;Q?72ahfqNcE.#YA)|]@d+ue~YO:�#4U\vizZ.-=F@
    N-mssR;ˡ`p�zI%.k}N6�Щ:آS1�`�{豑/Σ\3'1:sX074HA>2 U�VN8Jt8nAhWhK/FEBXWvҫZpg:u.o+Fsm/<LYQHsySPcr}^'l{xlgwtL�IiT9z}hPM|(52굷5 #t0
    
    	>
    �P
    _a
    50~G+,[+RJSST;fο½K�|=iF%&9K++qDikB>xg	[޴a|?</:a-u=lM^W�$gQӿvTpAAl%M�@Ap �q,'yt	xҘZE�a'S:]:XYן>^q!ȏE K%~'
    +"X~$mV1CKVw#miVL_^R^YÍ
    
    \3fA	g'^Et@xtbUp�Dž[ x6%
    +lcXw<"Q><KB˯twY8:%_GuԸv{Њe07@˕F
    AvU["O&_;lOOsߴö{dMڨMT�]6."Pr|Ccg>VQqYJ'Xb(H)!=:f/oS#0#<;兺q5f:39okT?}HMA^6�S)B["kJ;kpj[
    >M �lLjqn0~w-V>}͸[Rhމh1fGP8P9ޑʼn=Dd;HX^Xa'lײ^x}QR5x^y|f]O?VfM]k4	/gq#@!ixP0޾z#Yl?s]_%$j6!k-WmqܰxkM}>=kއ:%#rE$0H; |i\
    ^bj]_g�/lo;CBH0񃉉1}>MjߐU0]5b-UxS|q`u7]*H�D!�Ws|z_CՏ
    ڗ
    v233h®"JdENH)�H4,/
    ��<s~
    >fi银O[<3hJ3oB aH1e~�o2=($Mg`7?ӒqϚ�xa-/8&�`s\_cZ�Po΢&4vs}հaCѣZnߔF=K0?TT&Xr܎�
    qM@т7(w{H~�V@VQ7ui{RqqBW i[i_l�E}<`ZS|QK[U!�z �L-^߿i[
    L4ʵ*ׯLo+-M,
    =RF|Zg<h%=Vlzut�ְZHK>	#jAh?``Ԡ�.iZ~R@ghg{lXŮe
    ƵGygvo�uU[~=|U-tvW�aEvad`Ðmwn>!a'u}Co>*Bup`X},Le`?<0zIO4qY�~)[,�×|]V}P]`ĈW�;4k֬Ρ0/�FÁ΀/3V^^|֎?w"uwA
    W6Ҫ"mK_Ty`~uw)L|O/WvF�뗹vT6xhLd͙3p*l~HJ1*3A%8#(M�?>|^<'z|^9JPj1/lVs|lfo"-+6:RX_B+.ŷj$7_aã[e_qPϾ:A~�h2}ζꞡvNjlC@h>|8|嗠+4]p|2*4Nj�`p0`Ϡ}^V�ƲpfvG룐*BVvwS/a�ܵll4yg3NL,puZ+ɡ=LTp
    ɷ)%?h^o
    �~,
    Oi㎲=o�N4
    /UQ.Np(>F߽wyyy<O>ɿUqqR
    YA.F�<>aq<2~nna�
    O1�t.qxa7^7׉̺L2nn03u	e_i?M.pu-m?8(`JB2u'jH/ wv۝닥X_Տ(�5Lfو">Ґɯ[Ʒi
    i`۶m4rUy˗U)ab;
    +,	�zE kY0Q /%{e|`bc!nEl[pd=7݋W/u]; \! JVХ)'pm\S !v6=ed .lbj9�b{݉4<Έ񷚢AE&k6IIĠy7駟$<p�o߾>qlˊ]�[:~,.jd=�E N-\[@1i�5¸T,7yEW+sFukԻNkReqC%J=uԴNmQSj/NZK[Hv
    ZBCWJdJs>(8N4P3MECzr<DEZv6m5ݻwCjjj}<*lhB4.	ݫx	C;pSV
    1�h"3	Ӽl͏*fZٖ<XZm'R=4{##ʌCmXiE%{YvMztDFCo|R&#E`0aeib_@]3$�ȓP	nmh\VV]vCK>}`Æ
    Q$fG@ͽERLI9d%tvEPq5E�zѳ/so?1U?-)xSAg:js=>qos}2;QZV]P4_%vď&.)YN''I$ˆ$HI\. &I�pBHo:λevs1M%i$VhҦ+ߤ]WQNpxZBDz!Xpa?Var,.=NБy!v*!؜ 3iL`b5tue<}JTX�tÁ�v\GN]jz4W-ltF"،xU*<uAHhcBI32+؏I򂠗`[,t&�(Z	FX&h)y&2NB3āGD'ŧJ7CѢE{_
    Pb
    UhW6n,N4&8[aҿ8Vt"|^Xx�[s%%lꞟ;_SCK$'v;|~8":
    1%H%EEɅ'$'CHSv$YA RZʯ#1` .A&i]+_򼓠F.P?1
    ˭�c#Hԍwɪ9(Hg_f+]v	ahA
    `u'zlEỜ>(0W2(Z>g'ς`ΈD|ٗ\�gk,~ŏm�n\y܂6N8V8\d2GOڅ!N{
    8j j5aȸcU1K]dL*MbQ'AqZFmր_-=wy8C�2�>!x[Yqa
    KrTpNR<t`g6xoswK$|7n/4&M`:gP�pzQ"[�_l{ޮϧf�+ja|pŠ] M=k th,႐@U[OUh媋0b*-lo"�Zo`Qѭ+Ր�ٛ)HMĐ[WZ9rEVoж@h٥/6hs|m4C�PóKtq	3z&e�&_/|IДS/PA+pYXe_m:y8zTF*PW6@hb-V>両�#F.�
    OQR4q:A*]E@qjZHG#aZ&R+@A0C9}H
    i~"6lG@cQA^1%
    Y)??X+W8_"DL
    :ة20c8Kbz$,97�xs	@]juUӝuϿȩ{:Y<4*$n.%\X}]Z2S)UU-5YC5Iml:&21iNJc3Z"FJBA	!p&;W��`ID'X=Oi1W`f<lPU,q
    (82Gp+IZ��^/�M$߯.AB-Ÿ?KG;w5ƺRm](;nI
    /HHI%d@UreV;K]6BAL-$J0&f�GP80g 8:"T\F_\벂fH~G	� o!fJRn1@ɳK2lE
    nm�昆GJQ�\�xNxVſ):g�O*$$q^p5thK40�7.K$*@I�
    E CXa}qЕUex#dXRN)ģ5AKF*-JE S
    )0>7>L
    X81l8<BQӂU*JRQeI`-[.ʼnZnIs\#63Ro9�p��%O.A_EZ86p1
    CL@kմ�{a8a꾇;yeBs%9A%	^0�m^%Tl�}.??!w
    ]}�$p~BLjݮx1U̝+'#H1ǀ+"	 L+/Zj)�>
    Zo@ZO̾/OC̽|8Iѣjv󙷗ԋxtD7j*gLAn eHʲ6Nl/Vmy@!;Ms1È͢
    G$LT>^>,Bw*B%Rt7YUiC9cik\ט�.3*
    ,QB�xi-*$-~��߀KG2�BWB۔683F늴7{>~)aϼ^Rq'#}z5
    4K?<[^� |˯	 b/<U"[Y|
    \s(rh-s^H"(7i=#E-3b5*GS|ErT@}H=ʧ4iL1w(J'\ᄬ| ySz?1[Wxi.�bpcy2{AV�BV0R~P9h~Lz5Hu`8a$G=6W@=p3qAOGRgD-;�.ph']ӯuhb5'> @P7-m^t|!@|^/h1hUh*�vk"/	R9߀sYB7/
    xN&r,�l1Zs!Ï@kM~ZWrH֤p0lW
    7eet`԰d f#Q"m�6Ryr:|7	4|ct.[=(Zi򩂙'.B`AB(
    ʜJ*͸"U[|sp9ψ9}TςL
    t>-1#,WDz
    ^pxE=$ǿ�`[ExK&}MU:vX;aтcThwU	Zٳ}+![	'ӯUtq@ mSX�ҤsX.�APj".�/p*^2sٺ!Ϡ|`e(ޑ(hq
    =[%|GR"j%XpENQ9UN
    v<xtLK}BII	;vLLR DH@�9EEm$րo aBV=�Jra$oZJ
    :lйZ|-\pOE"e}걂WjfӺ}GST|?Z^WWLnV&[/[paUVa*dU$ZsNN}EV
    _!H6foR2�x%+*oX�D2RA
    h$,C�I@z^"qJQnxyލjG5Q(2&P |Z U>*};Z_#�H}iy}F)pmڵk!##CObCfJCn
    <jo*H&q	"k9Wŗ#sBI`]:\8d$0Y0:E<:YPEB!npR^2BҌZƧZ}K}X�`a[ERln%CIW1�	B6m2�D!p
    UBa=X%�B<Jq51\<ω#u)i+CvBʖ*5{*”`5<ZO uj~
    �Rn.%ɏa,n8Z\)6CAb�=e/T8>V>NPs\FX++3xߠCJ0z/
    _\Â5*-wg.pq$;G'zFéֹߜTjAi:Qa2Y#ݗoaФeF�%
    CdVu21ShqU"tiHJ*I69g)`H..K	d6pъ]#Nh7INr-S�HʞTt/}gw4!`x5htOȒ΢<Թjݓ0rЉݦ{V
    B%:+JbM8HfԒ3EM\R\YHG)ɘ dOL�DėTDt,Pz^h#dUL=`D%MVfNk3.j�R&Do< `T
    C5myXpXdtd bFHJKB	kP:P}=Cxyv�hǐ$Ί"`)$BmFxq`HcMـE!c*.
    R:YT�rͪ?av_WxuPOFo͂oMb/VVw>4pHpv3}A$!���Wl"lJ@`5 )`@JI;z^l fɘCBH2T$!uXrAM{TVqh)5O]zGG!7	cٺ2f}dB'rO5"J^/PB>Pm'ɲDL|?WEC!mYBy@H>W`6PB7RLfB!v7 !x^r@-
    |
    h(z}5E^+�R&zsϘ]ەߦ-x|h+>(Z
    )(cqP19
    țEsejU@+ J§l>6�Rk*D2Gh4UY.gR\<.<Nb":?,* 	@|>H2@.dOGj4iizi+&?�Rn_Y%n&i'(ͼ[;/:߼8}9[.X\�%=QZhzzjЪ(1QWhNd67
    ϋ.J;f
    \WPwFR�2?)F<cq*s0rl^YmPƿVQ1{eğ�R-Jw<q
    8_Z|ٿ%B6ҢբC<V+ R}8q6Y4F-ES ޠu**wFh(6!�<p0ݐ˂vK\[;Xpy̨r4�y
    *2
    5
    �r9I^(
    D19jV}fyyz�R2T<BVRN'ӛyudtQ5=dbEؽ'*H:I8%k!49@}a%G+
    ݥF&RV
    /gHR&9	4$IR%U2B;[\+j:I8ZEϏhgON�H/J?bX#m9ng4Zm-{
    Ȏ2=L^otMn+\pr.��DMD0(7.?O_f1 d\'HCc`[doDi5)z~%7%�P﵏:77tyeV-YeV0αPlu�A䎐//1.Tz}@v	q194bQ�Mzt] ROA5ڈ
    RЭPIFBU	VPmBE_::dsSjoMV?mqWTlJ00fWILxhٟ9Ƹ *JL7ef/wʳe+"OD5NH8qDPK-҄//o,\fi.(Q&(}ԭ<$]E݌_׾oPy/
    �&o1M崳K,Mת>s_IN|t #zXY�aߜC;ZN�/5	~٘BȈ).E($erV;bߟ
    q1C|{P'[/7Q.pV->4hTE9ڂd�$Ξm]G۳DkZT뇜?j�x
    8_a
    Xa?f[fY�5O4b@( 1q - א_!%"SϻY<YvQʨVBz.?__}c;IɰEPjsñ?/!.>ޟ"h&=[E{@HPݽA�!\|DII8D~ӿ@|Y3o)-ruPԩ~)4hTHsdwa<@Ry܈ ć2C;fp	!m'4'1�Zjeja!ެ3u2z�o&d"FƴXGXydjT �a|Nʁ0l~$*[�x@fa7+KН*7#@AoL0F29J5y)�K7RC_pyjJ;=IiRG#@t:ӴT��G) +݃(6j(ɢ~rRt"L v%(7W@IKwekcuƒM\2�S/SEC	qM1\AbH-&[);BN5$)jdxOۛe\>JBA)<Kz*!LҀ䛺)Fw^0Vqʑ6;D@|9S%ťlUQSZGv%>:]�@.~;`lnD9$?XJf,	F0X.Z0A+5#s�l^/
    ͅ6;X[�~~TVmM[ES_m@YF|5Ө4`\]@::^mp>�GiņКH!hid|$1yyؠVӪu%r\1�\LiѪ(꣐hQ:ă!G
    m
    kAso'yW?Qٿ?6]eo1����IENDB`���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/beagle/images/callerData-jump.png��������������������0000644�0001750�0001750�00000035260�12000015732�027460� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR��:������Ljm���sRGB����gAMA��a���	pHYs����od��:EIDATx^}	WuJjRa&d)2&RAC	a&a<`</l8ظ&,cFF*k[,[l[y$/Z}_lɲs[{w9~_tuns}}Z'v9p_
    UɯHyD	im>{ə]|#6#9&)KB2==^٫zZkU$rnSpGw%=.PY4=]~y9׸ԊV7Kr&jCO_/'#y_HfN!I⦜g+,f.tdC@XD^dpq-1$8HܽbZ1ABBj,|<#CXFEVl1D	A[QSrB6v\
    'N^, ̍(/D-r!�l[RLn*!$k<Y©8{P#y(%)$3/@Q_tڤ~#c}I]׶kOq\C	7YQѮ*I�xkOEA"#8#s]	+GJYc
    ! %qfXB~[_\ݵEh"A}S$L%H`&!ŋG3;/E(͒ŵlJ/Zk$Ҳ¹+'f.o$#aE߸x"BvIUеTz:NhAF;>S "MaBOp|H%gY3W!}JԢT>еT8fl8QO(:oj-OCΊ'1St
    �cѺ[-ν-mC<VB=
    gbB19AdrI!eφxc@ZvLHV!N9
    li:B�CsmDh/nRE�#9ڝ`gX\HWQפ2nU0LIH6Z៻
    tA66FՅkm7vtYNњ$ŭL3IM0魏gjZnx^	VNQER4/V;Ynv!I%5LĺJYB
    	mS.9_1I2KaW.'ՙOm뷬dTa//Bj05G�$†Ju3^weZ5udElNt$gcw%)EO}|fOGMTKCDRI'=cIWtMPE@PZ#t7""("F =>E@PE@P:5e"("kOhn("(E@5E@PE@Pj@ҵ[э0vfwt2wUwIU&ؓ?jm(IgY3%alX%gkPѤ1tJQeIJI)i9lN$GR*v&\]sl߮0RnIBRBSG h?]ࠕTU\].ߦCuLF(QDM$s
    ܀.!V"x	;FYqA&qWZ0*	hVx&T
    l˂N~VwDea˄׋'Iv-)֜\:pv[m2>%nGҒT= !8\i:Ynd]d
    %
    gD?!dq
    fq7Bƺ&(Cɟ~JZ}>@F3rXÚdW\pFYh\!)/GD>Z5uF[WIً9KFnhb݇¾$>//?u
    �Z4B&׾=<YѢEݑMA|:7@!*@:¹%N?d>
    {v7+[G=w7͖lloz}	t+!
    ;xOe*hJZN'~tm7oB(J+N~!^d[@΍
    Go#"
    1x/Z`|C_Τ$VSqpF):rs痀\8Ȕ\!RBj}fP`?D[#uZ[dkhJZ.Ɍ[7 I/R<d$'kYD=+c)Wpe{;0ȜNn&|AqP
    ]|]EKVt0	.5h~FӀWpY'm-htGOrty"maHX
    FVB2_7i<#ޥ$nE�JGph(2c5=o=E>nCZsA@ij
    W3#H$JJl\/p�Hd:?2pN&H֗e!qg@�&zmǤFS<|8;A|89zĽDΒ$9j!&%.8Qܒ𑑗CZwI	c_У0HǏ
    W'춈z	/!! AnYD:\d4ryRRKgasM ZwP1DIt
    پY2d7MI cAr)bMTS,%(Q%}F#J?:A#VW8;b"@e/{U{W''bn#0534:JP֙L]E@PE@PtMPE@PZ#0pfˆ_Ч"("(@XrϽ#ő-_0"("(�ΦpɁڸZ\X%E@PE@P 0`o}DjU"("(5D7__iӵCv| !bMɾ]kig1w;;;wEzzTen=Iֆ$2٢6SKtF!zK֋I\
    *iӵZ;4V6R)EIfҭx.񄓮-G|;N\Oq"$>8J%ˊNYzBS;ޮ'	~ɡS~C~
    U16]P_D޸uFcJQ[�X.Mt<%dY!x+֪(b!]D~
    N9i]Ta"ZSP<Ra|(ns[4nTVivW[T٫QOON+Jz[sv"~YN~(>UZ&1CO2d\2!z&翛9^E'L~rA)�	MM<2a)	}c\>)@scH+/qi
    9La}l^q}X3>/5"uZ^
    w~*Ӧk	Ϸ�"oF*vǍ	%J`N. bTy[#l;IS@NO]wc-D|L~E㛅		PaEF*,dhDl$hrszy:ChxFS0_�BP\NUN6hG{,"Ӧk;[વ@?n=I*owPg6
    ]dH%kم`ITyJMTL̎gk`n_2CBd"rP
    =v+.!<$]k.~Ef]Z/nB&r\"zN+DM-q+KN`Y#}56nZYD=c׽<+l%0[r5pzL%/GᕒzM�|O+
    ;0WIU:Z#^Ƈq	YBCBM6EixbÀgփP*+K䢱l/
    q+.V> VXYt_k9/h|Z Gq76ྡ;t,yY?/^#_\Fnk!V`72̓H(+rTIZ/rFȜEfxbd</wl_T|ڧk[VLxy$"V;ZπUd;W.f]mܾk@h/(M>n!>_dR)!<B%`5H+T/F^r~E
    ݍNOr?hIzSA6%Ff	y֋WkrAMu2yaN^\YoӵZO(i
    
    8;bRBM�q%M~۷\֭(eF8߮Lg]'Vh=}a"֫2]Nl5WpWCqpf,{׊9@aWPI}TIyn!)\r_gŞhSP#tMI>E@*.֭ƭCho3)Ք!tv!Q~C@ZU*]WA@"TҵjP[vȑcǎk'O<uTUɧz t!R3E@ZUZaÆ[ㆱ)]WP5[oCn݈ByR.`)dFf4A.Ai@Bף;*pj@Flaݼ{iMVoܙ}?ܶ':U붬&oٵjU5-][`ec3+怭Oj;@4e$mE8g,NȾ)KOP"I`8(w?!lG
    NepBfg?q9F>{E,]qǚ?SWyw|G+m&ҵjUZ-]>}aliEDI2
    z!6962BDҋRw~!"R(MDs&2t
    O�j^)}'K?}.X8~K7=O\~ϝ{yWi)tmhp`j9GIڭ
    떮M:uxxxڵ&'N(%<%D*PFӂriMx',)"47'^`q_
    mdPԾJn1S϶*YMttmpCVZ|K#gֿi^3W\O,^жeֆ˫3?X.ĭo+UoԎ!%p%0)l%WKCΝrNׄN&aVcϩ<;/RFQ=傛#n[r6D5,SȩEܛ.Imau#v={S{wӦMŐ}mܸе˕=Ԫtmʔ)CCCk֬1z>WH�˖,|Dom#c$awggdcYFxHܙ0pn$>̣t$$5.	Aи/)-%*@ǕGlƺe~rF!]uKϜSCA9][dsY~+V0BM7}o홗kIsɓNvpi1wUKcsy؋O
    /g_?*MM4R;ԆXm,d<S=\]qM9ǽȔ�LJ&kRFP?M,H ]hIt/З(\Mjӂ(>DIJFtmfxwmٳ3foJFi4J?;*[m3'cpP$4iBF{-kgҦkZc
    9S2]gqbِc
    5V%EZt-
    rT !g	
    J(ox7H庨U1!];}w{ի3/gf[hk߾;R%?7C-6ї(?^lXs\m~Z!T(]pvH'Hc'2<*e|3{x'¢$ꃝtIsi/1/rtYؗp&7T2CdzN!#=36\]zQ&ҵ3.2t-;]۹skfZnk0fN^G{ӟ^%rtm\IkMϞkn}{]ɕcN%U
    W�7_>oC;IqS�Hu6;6΋+1̡!kg|,:-3ԗ^zlͿW7ɗ8qED;H	7C=Bn},]sj"Hxs^ fhVS8E,B}Mu٫6ɿwƥMU=_|û}ݻ>_?>k�;7~BײGU_5 ?]}`Ng[=s6s34E^iU(]mh0E_.xϷ|7?y9 ]+SWvU&e ?VѯS?{k=FuBh2!]{-<]s٩?z'ɘKZKYmdvTED?1~Y%p[oZlҵ]~ٳWٵ{ϑoJh"Jה}*@@H\jZdE+]k"P;ҵ.XPj5eik5V5[(]S(]F@5k"oS(Jק=u#f^
    I(IyЁ1(ŞR/c/֭zfc{2n-d"+SSc5kkrj
    v_uZgĿ]s>3ܵBؗ}K{J˵9=#pR􃱳b^u+"2`+*I$1Ĕ)]0]^ %߂uڬ˹y!xQs5Rd(_GRx&GR-GArѓ/.!v"d> sYEERуS"){>Jה)]ʭORBL1(]CWNd3\" JzVJ׌rw#oUɥUEʓܑTm*X'*0ny*]S57I/߫MȱE
    7uֵ{{kJ>aidRKUmH{&s%q@R⍟h78*-\ؗ
    ig\֦x4d$CrS7̇H2z=d9F&h	>7i9|/o;9gҥ_DH~3TU$fX^Ҳ|m{	I?`OW%еTa}xȷJт I&e#*JHSpjavHm[tG0o,& dЏR9k;v8s8{`֝KW{bߖ,YelJMq&9YH򿬷adQ_$2nk=n˧kxs&y("	*o1DIΨ1_ȾxtKSutcQ �KUhO'I~7ma/lٶfV޹{al36kk_5@|oVE]st4Ifnk7i5]VRkN~mH&[ۆx*[&qTGwٜx88]#a$[36 5vIzضs5?v9{Mxr/nߵy}Qግk#'mؿ7?<Uu!7vfhV#5Yษ~Ÿԣ\Z3+<ȼII?UOf?N~a_7$AvwO>,Eΰ*ͶP՟#B"XNl9ң=݈?q	w=ܻYok6lza7o?n:t4U##'۟}RQ
    OJ`*h)ft^L57OW
    uWZWQ;f{^+Bz> fz8⒝Apt+s_\շ/z'2p)tMƹZJ“!#T\VɸN\ܺ־z\mĿB+I0XnŢ>tm?`KZ7
    \?wdw.2k\wC]ؚstt,>FN\:kT*Xp(EsF\4ipp¹a{1I'<}we46=lw='ë=AVuk_~<J׺!GE@Fk󇆟Z}eo>;W|cn]k>fIk,šVp40J	'x&9=
    ;uyg]C=]jRkJEptmc+n=kͽ\=xƭ}GsY3wP2]#N<u[4=;}(Uy9k_29oaB]q62
    .8kҷ0q'Q$ӵϺ"(2,]?韟?nYw=;}E{j͆yi&E|v
    kb
    <iS7r9c{NtMvx:bFktmʔ)CCCk֬1M<q"(]P#ѵ~wqu~heOi9Of=H;]pVPfhzpfa:w!5;Y	n[lޭM%u3Tx,ܤ)]~AD@Z-âF)�G׾+fߵhȚK~poѕӿbs_<y䜹=A{o]
    oڏSӟwswo_m4ҍ`lWfcmX@ҵ~*}5k	`"T@Hv??o-3si7;rڌ+~|Fz ;uԬ9sе2H>_uҥtS=@Qfa1R OLʻ_&wTK'32{Kz޺=\\p-	rB\΁1dB/}KW>s#[nݼyMEsYoU޵҉ҵ!0]KP=c4eH$q' WS=eJ$	L=qmlE|	fpk!]{~߻+߾j]8t|صOmҵSWummnѵ	9Ƨ= F#p˔4Gf䦡HT&JlG'~	h5$	{?>]p_Ӽ|\3|D7PVu~ktqZ QdF$RTByNCY7[BxEO8~6D]6z/W݌x|p%j 0%O+c/VWzܺ|4 ׯW=\m?עɹ̩9&?)tMQMԇ|IN¦=BNm%ZTIq	9edHkp[k2#_rtD!]3B9K՗=u2tqm؅>{ZG1!ͤ]\x?^xHt#U$>9#&sĻT%4'*Fs6}yfR-<.ҵnH	lw0v'=\vM%B?rz#j~&G8wB֒$ͪJZ.HrĥU*QpCfih@ĈDkeOLOךX9:si+gQA3(N.WY !XNՖDB3rC
    B22J:N껡ҵs}'�I[t;M䡢R]%L͆%IuiG\r~
    ~Hؗq|pHs*,.e&K5y嚑dR}z_u(]/{eW
    r8ͿdT3�ĐE!SK!W۾YzKz;k[o߾gϞF8*a/6zVZUJBRzՕ(tm_kl߶m޽{MZ	*d㼿+)*#ttHU"!@5C.^xرcᒅ/l~,t:)]8*aZZn"+(]H@c 隹y݇_>"k#'L<R(boMlOV3? J[jx$ӵק"(%"ѵ9W#FMNS1>12y9?Ȯ,{kA$OЙdaK׾w3g^jd=G^>Zb*E(]S(]FkA.5p(&k\-? ,{kA$ǪЙdҵ.`KڬtMDP�Gθ9]wE{_yE|'wEQ&5;cFoC9	<g]O(ty˧ŭ?L}L_7hԟű'MvzևDD]FPAIeF@8]3tF{W4k%>s̍7&5(i“E氹u.}#Z~BkmVG/۽\͖w)]At;	nKAE{pS_=@p%\s=p=Szz^!?90٫ȵѵg~+q}7߼aÆF
    N&x~0ml1FC>qps-Ytmk%zmSƏ2C'7n|?FUZkqzBt͝dsjƾ+^]rS_9)<j;]H9TDlU]CH$_=lhyػWDGM7ݴ~zyfiIō9P߉Ѫ]j5H5^kIj_}j_	W]!{kȨP\Aу_' zŔ`b'B{d/^�N¨b)){>3ywG)ZvW4{њlf=>c"ݻ;?	]Jfj3`
    Dff㻷$O'۵6	y-\�ҵpR=)EiRE淼)B[ZEIgfTMz]3yj2Hyܦ%,Bz\I%U;|:uOi3tm�?5do?\吻	k	@
    v_ha*eoz_ۯl^mr%}oSE]:n٭7W7{l)S^9=	^i%\`˞np.).2] 5~!倛9QHl%ѼEZAF<ŋi?Ivms=gkf=]C.tz},W+h%uXxnhͽVsq!ZjqUD6(Ɂ
    Y<\Q:Ֆ"
    G$4aە['٦,9@r�
     ^vBs1
    UZk럻vwE͍Q4wH>C3}YkI!L֒bN&^BƕuYuF[\CdH?9x#SW5|?OxH"X)H* !jIø}6YN8 ;,v3s|77iA{8SZh?I,37=_2̜2gΜ͛7wew;k/�ɱhIVDl]dʵVuFgk/	pt+0
    5<ʃ
    4DCE&~mH|q!>rLkݑѓ4z6g+z#t-dᩱݨ隹iضlbN̗@݇Y1\mǎ5LJE7C+ZdFgG/	
    g+ܺ/E@.2f$¾~ol+{n\"a%703ջ`M!pQjI DABޮD7`3/Kk$C?^*Pe"`際'6rׅPeŒpiuObDBKL[>	vI6~AkQ(p�q覥kf+*.cd\'.YJ
    WmѷZǬԍ zC3 طnp2JךͰJ^ks*ʻUGڷ8½+]	V/KײQEU{״E@5E@2Jהy(][Rs$ӵϺ"(2f6C2e-k֬1_+9q"t{oV\sgy\`"9aÆL>}ԩfl079`2ɓ';x"PgڌڶԚW}7W>x$ڦ(cǶnݺl23>}&}RkQEN:yο<z~~痏~N,g]ֶU-~ݙIUE�A^3̜6'+k׮5ч0`ԩSH樌"vثbzkͭ[zֆZ;n<~߹푫oyg%n݈p=~Ёa+ŞR$jnuWص06[!=aW2y(W`N9J1ڜ`ȯíZM9ѵyI<DC292phצ6]mn-Vkͭ͏,i𗇿<||mvqRgzq(2r}8G+p#N()fʹ6?.g~!mAMR90<̐6y_:H�Y2"wʀ$iFW
    ;YZqckk=tiYZ_ޟnZx1I\h1Ah
    ^�X_Hq	E!B׬%xܣWeɉo &!oNM>֢[j
    z;[6_Zʿ3rُ'ӂ(	8ۓ"**Lg`SRZ>9{Wwio1
    'Z*,ۤR\Sx+筻/Q8=:(dH׸f8rqJ޳KyD4H6s~z$S}|Ps?k=wg6[~Y_5tK#)$hc^G$ŅfZf$ijV˄0᪚ӳr{S="%:BĶffj{J&Es:	wίjwr^pM[S(5OI;:^O-5r[kdƩ5w8Ԟ7qMş?+г'q= a`#Tv}*n_t3}#L
    i95F4_Ԁ@#I%۟j{W#&\t6I<CF*L9!MRk'b^4i'T9_{
    _WiشVs&|pJKKN/S$l7#hOdDW6.a%k-i_#~&7\=H;6*td#S.:fɸlPP;S
    m?ҟ~$ZѤ|@א΂u3)]<mU=
    k*: W^ 	,l*&_)]ëI%SKhn.<]hPEKOVGW�Gstޑ'ɅY>efG+COHyw1ZeWE=uHOI03E
    uKDB%W'rZrRD#A-tr=\QMV@jsn!Zq$򚪻9[rߋIrx!7+Z|hʼ#j!ĻjCW_Tg98HG@2yhs0* *PtmZv׵
    uOVUaEC@*z�&"bE@k5sf=~Hs=TE@PE@h49s2����IENDB`������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/beagle/images/sailing-ship-16x16.png�����������������0000644�0001750�0001750�00000000762�11771040324�027635� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR���������a��IDATxcd �d`%ψKbӦM2Spg]�d~OSW�6qV4cSSSQǎc8ǥHLLLفLӧO?
    %ƀǁLK߿gn*'x a+O5‡/^F ̙3ᗲdwn, Clmm988w9_&9ٞ-K`ĚĿp᳓t|fpRgpZvԕQ,K?}0gdǩ[O?dx'+#ý�3|KgϿ߿tc `h[Bdcp?>%
    g�	tL����IENDB`��������������logback_1.0.13/logback-site/src/site/resources/beagle/images/sailing-ship-32x32.png�����������������0000644�0001750�0001750�00000004344�11777770117�027651� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR��� ��� ���szz��IDATxڭ	TT;̰ɰ((Rڪjj)5mFA
    QOՄcc₢Gb5&5n*HD\ؙY߼y}r,sޙϻoC#e^nxV]Va?<1GwaqǘFc9)l΃u;^d>\\�;jw|^jjx<Y%qTc1l1wHo�Ë#B>s|=vTJÍ=veoxQ|m\VURYkT+dhVjxȊy#3Mn5umNKyPRLo~+OPe)WF̙28�!F=؜eཫ7KO^RXqs*99(dSBd`�R8ĠF	Nur&]r_<<Q{2"rz-hJ@pW=Z]1V{d<jOT*ժ$wvͭS3&mdӒno7Xwmӻ=4QUZ+
    `_͙YBhfn�/̀  "b8zr^Ύ~́sr$E8"v^;ks?7w^iX=ZD2Y_H.,~n\L(N�>ثX>v/wd,@~&,H-x~_�bߣ]7!3,g�hI(_.\xkT1»`d�)#C8n��wƒyU(uxLy|l[7
    �HĹ;kg:HC63pF9=�UIկNaZ
    <,"/6AX:Vۮ4z|k˹^Wh(8(ow^F0_U=<z첉/qcD1Q^R44)Txveݒ}<\?iQSMʈpʱǠ& %^(:=o֟ȫl.5%ԉh4ɓk
    ՚;eMŰσ Ʉ]G~i2NA zI9`tra;jүRϞ_QipvvXL H/^NhtM�\4^u֝S-Q-C[~>vb @FC ժYIH[uv8Rs+m
    rV4hպQCv+5Cm4X$tZ6d~ɺPn渡"֮LGItѨ"fI8MoČ)XY2=Ze6fp~|ЊNނ(aKI`ZR:xi XjNIF%8l-phC񈀥#m
    2B#�mhOڝ#m衣8v[6dڼoG3'?1B5cAk�t#AЄ!JΖoq]JVmX#=h0AeEG0R=&x.ti?	ʌO1&ܨs"١2<'s!쵷7Cy0#CN`�.PK�7PfFl�^d5a{*u
    W6)#ZJ=[�VCBB4q;-8$51(uu{,`HO,[}U,>rJf%րR-8190}� � uEqA'"ȍ1ϭ`7x,dܮ#qL_ްrq#k�QjTCNFB!�iZ,453ă`@9fXiz3'E[QD
    VcfBc@N^`EL{yhQpX('H(yᢟ8=e z6,mӰGmޛ_6OBIHN(c^$U O]9`ls<rOms_qm,pKPc7f2NDDc.6VU
    bum~.@m: ȐF5hZW)CI֐x--nO/spEci/B
    y����IENDB`��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/beagle/images/sailing-ship-48x48.png�����������������0000644�0001750�0001750�00000007751�11777770077�027701� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR���0���0���W��IDATxYxTն^LI	1CҹJ	b>l>D|XU.(@D"!H!}9gNoIh^0{N__k3n].vGBE&0o;y!^G|fU;i&^_^=XpZ9BSbdf^�DlyZgh9OKw:?{M'0
    5Aa~=)(_;AexY36Qk 5󁄢Ȉ[T:yJi3suP+G(J_%7qSs).inJZYqIAkU<VDB99 Ls^yg~ ܹo'Wasv_EPUPe
    xM->RcÌ)uܦ5$%ƀ@P+;|l?,	p	{'82ִ?J!6	�nO�4Jm|줧g͢7=vv۰[$wֶ5{0E63E	k=@|=`)n*rg"f
    6$mR *1=QVV@QU
    
    ښON4..f˽vipXiL=hy*gسM!m13Rdwd6"#q߸bݽMM!0;9^݄Vр z5ދU5n{R|QtޝO<l6 ȮAbF7z%8bH&:~a6`r<upy]: #UBG,(<c3s9h
    %pwO# :`߇CM
    #knSfܵ=z\EQeE8zl!~}ޱu	txFi)P:պ`97@k~3yt_GFpMh|aJ*`GFzlJȈڕ3!SjslOg`݉&
    C	tZ'Ep}t\v6J3bO3ΛyAm<pخI@U5*IrOSǔPw?NY#ʖRv$h(vcZCn |і)c~pR}HWΐ~QN0a'a'=p'UR8-_gFd5 n4e18Wx86.L}xI%VWm~h̲6Y-d`.4z,E~cf;&a[=SSUdYL^[!BPtCAu==R]_w+puI鍿*Whҷ6<3n%VFc|-!	�$fja~ѱ;9>I]5"3}vT͚DĄCȲ"!$I!"<OVT挝Wkn׾
    /GV<@؍
    !v8#ä82mk
    ٲ{{阜t`E%RD`mypU\|냕bQ4"NPj�۳y"z#os	Eᵹ5d7i^^tgߩI~yΈ,Ć=wuҊggE{o'trD4d4)!Fwqs؇,a	f3_(ɣmǭyxHTMM
    MMMŖ{ݻ_:)&7`D$t-k_2ɢk`+s/V
    o->!>ۊ+IR
    8XYoa\?{lJp;Y?7aVaC7ncƌџ$@neE'Bx	jEr[
    `UZF)/#h݋V`s3HqX٘.0h9H-wvP޲arӧO@˖-\'RA;
    H|(=*Sf+0@۟D:zf<sFᠾY-`#إ^VhWp	`azB2ZP#ۯrĠR E*اǏC–-[wr7O~߃+gOg/PlvAL`e	isOoS5-U dlyKtJn;6xlg:֩#;z$Bcqrkdžt˞sџTRKj"y%@*(N8|�yIM9cޓf}!%8e9IE8Q`90ё$kDd3&{5첐y>S@N~-,%QveӚMUP,;t"w9ɩ*z
     8g#h^R)&u>_D+o{t?Ã	ɪB+~5?D+p.…
    ƘV`DhLzЀIѮޯIvlPل4^[ĶgR;6Qb""buNXPwV]BݞCyTr'4W@O)<hjP%BL)$&s*Tb5832+z5K
    &;%x"R
    "$k^nT'C;jLhi5OgD*Ʉ2Uup{qQtS-!&S`5u�-!h,7F>KHRRT�ԆC@0CR(VP+
    >?AU^ŕw/gAAZr`7`Ѻe(Je(q"10z[:{5
    ы!Q#b*e2xJB8<,>嬳ʚvxF=kpKj"aVy4^\%	@*H*L2|-l}[́P	JZjT@ETTX<δyK|
    ahX=!uk*==q< RglѮؙf$]Su͐ʮk+.tߟۦm~}@/o
    V>tya+
    hTRSRi:s
    `eodj%z}nh
    yNRp!#Ht@8+imfrU]^lhG	*+edj$F)x/ƃy*Lf	Qۦ[>yоp{GQ�&8bL8Lv10	_+AP>?}hYQ+6RRJF4Ǟ
    <-�.Է>5(I;_H.# gg9K*=
    AOg@&@Iª!e7c`AlJHNwyB9_}k_@0hj\'f?u+w38$I̤U'1&~lʁ<]"W%휻Ɨ/82;tx,hB,SR$f9N9r_ WDT%и2gisGٝdE`ƪ6S!zUmt9P.;>wxOht]_LqZZ`@On25a4dvSG%)(
    S����IENDB`�����������������������logback_1.0.13/logback-site/src/site/resources/beagle/images/menu.png�������������������������������0000644�0001750�0001750�00000014167�12000013352�025416� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR��X���������sRGB����gAMA��a���	pHYs����od��IDATx^]kTGv(RVJQ6RJ6J%RQv6mqٱxa6`1,xa^=�f0/0c,3<f3̋af0]u{oW{=uԩ:U}:1ͲDYoxstx
    u%c$K.6K2e"-vYrMY'a
    9^/Hv*BQyDFj$7St�A�9<05ED@<@ "9@ uDߑqЄ*-pa4"a=D/xpVhDB'ę,7i-׫~	S*uR˺rS)qxohPACbAN0]93OHHoGעA"8^Ee:y3R]-bzB-])A) V~O�vJXx"p7uy!Tv%$PY;vCqweٴ.mYfVLiDVZAѶJv0,.DbA%DĒk,)INecN!U_q!0=0r{6x@ĉ!lt$c
    2&h�<a@=x@=9/_�y HLNM )䁘{ )כ$Iʙ<uOܮ?T+Ĵ+}
    Yd)_-`^3ml\?m1I3:L`X
    }Hä8W?4%15ūS['/zU7I"3JoEY./v~J\Ht5I*dze*躒r"EJa6VI9Qo44I.w"3:;EU:
    2x뮮PjaM<3̬}e];cJpʏp^+z$*d+x/Msu)AN;%3nW4Ny}߂Oj[`j:_ULUoWt%`GRԏ鋤`xNj4vb.ft6]{{Ɔb} 5N|drFk~+ѕG:1IWyDfH5=쩤/f\Q49LA2iCX776/Onq(9?Uٯ,g]Iy-ĩ90Iy@�L	۳'拹m$=늬?=:/_8\+Io/|}�cC
    #pO@DPVPk,'/Eabs"qg}v֭۷oOpKAYAծ:;;{{{a\@DH(g0swuN;y҉?sݺ:#Y;9444477@	>)"pA'�<O?_rAmUǞzBW<[f-L~Z(TjDf`@D"{C{M0N"xM>1!n޼sX}3'\<sBɊĴvgssS]Dlٲv?$#>RAC@Ǐ?zhSS,w\9rȑ{!/}7CCEl`ҥd6�QKE3D�z;vfHWWWyZDDt!M}Y4!$H))MvFjo@CDp!X;::`;v[?%_D korᴴɱKHKf({AMx*Ǖ{̞gUҴ
    WBh7h2DW1'T^D�r AUU#ϟ?D[ߙ{IA }^he)LJ
    dѩTeĿS˙hfAώ "8}4#	vjD8!C$bJ
    鹇dBr!!D,9@&JD
    *	z/H@7n<s(׾WT�DSD m
    {<Yz~n	&ߵo
    oKgK_~~/w@90(@ZbU7l
    $�;jr m\g(bAl ^BwpӋ[ɵw<,ZtߟS˒?zw<o=w<+_YsD>6<~�Cp./ar/fzMD�yFą\ap]%g..ݿ/~gH"(D5'A[ PRVJD9{G9#_DbIu؆[xc}8xO{G/]Axj2 /!0 %Oom�{UVUo,w%ʽE⅛DDDDD9Dvkބ:IXWĐ1xjׇB]	b`*`^s(Z6"""@=g9>%$#{͝;9s~0{6|n"}XB[# *R];rqAٳGF
    
    v^n:V}/0|1ٕ|J)W2TQW{}⥶ή-/DDdzoyD -Nx_rI'2WiCor[ʪ?~~&IdU&"h״f,U ƹkEWE
    
    PFi"48|eǮ>:PWl\=Z:/\;sgB/?pR4k6jD"[̢59?"m[[ \zo>|xxe75?x}3bD$D%Nn6QwOQ1bk Z"1G@o4,}u':jZ;-`D 	`$#IB$daHv<BxDʹŪE)Nu5删P,LD0֠.Yɧw5?{ȼ]5mX85@)IqD4*%"8eI[Y+L "(YТ!	|ju3*w=Zcp~vu;gU}6�j)a5]s;-5[f!A
    v6-%[Nb+tu3gN>d[gmU"bה_8�0mf+"Q2(ِjj:bUo666;r
    欪[@y[ȡWwE~aq7V6xJD`l~<⪭ͭmϽu[-+6ߋW~*;/٩`HRl/Ȇԇ\A+vnqR	a`f(�PmwIp=y[WZrw֭Y_zex5u	؆[x;_ۓϾMv~IOO2_ƺ
    ^>G
    "W "/Pm[$;{׳x7jf̜M""j'"
    7fsMD;7oOUŝԚwxDOāl7EI%5lͧ~"b.#"	TՐD }[,7"PB4FFO"pʰ]9JPJD#fA(jDymODjDθ(MG$[wMJ޾WRȑ@CDS?&"`�ʕ+L^7ޣ.]vJ^ZLAD! J"�/5~
    v]o
    ?<zDDAea֠,ۮM/z"ȥS+
    z&&l|†NNTNڔAE0rj"H�ꕺZ.^V3ubzbC'	UG!3E{	A#:="gRPY#"G`;m
    >q%ۅlFH^Fy%U.�y)1וBΧ4)@#%eAaK:J&,&)Twc}DG`0-x啕]]]@3+3fi`#\$BgFc%8Zgs*$KE!WEp9 U'" "1iG`SX�GFF@9,?k�2!2&"lV3vʅˁ2L߯ķ)|ڵX"H/@]%䤿yPʡ53j&&tk
    <>tїٹasv$+gb܇]
    uUt#xڜOl!@G"$wk E׹,33�N`Sv*A~ͼlAzQ0Xe09`m`p
    e8{1"�:rD 9wxNj|'FޜOTJgyꭁ#$F8寳rq'
    :1 8wk[ `ppܹs|vF�~�;QJcBF/rֽ()?'*R?GHUx[ڜ`�75(_~ٳggx^0ʪC+V<cU	<%h91	ld0xAIuu5d:/x8GkD%iytۼO%D٣CLDaDj (x"xA	.9}zK*J[<wWID 6a"p;P5*bhM IEUkm[|l
    bE%`̀XaPod:MUw)䥱%BTzD<NlE)I	"c%Xsp\:]đDr>Mxg%K`BC�䍂/?EVX9
    677744G芡`aL]í['D2[0 @{{{]�>	0n߾yu`||b{�FbC	0<(`s6d.㈀}aXDSNُMMP"Hƃ<8+4q!;rqӁ֢qp٩0:;r1PW)5ʻ+7^O~�=DАX̬DWA$)=ѵ(j^K$%d1p.Ŕؠt+'�;W`Wy%
    <AȺHS*BE	E%5"puF_CԠjyGDq(b9�OE'"`/qo,g%"\#dIxOuvtvfxȣ.E0	 m./D1=PD\y0Ń:O1ދLA4zA0
    dyÄEβB͑<@Dk
    Պ䁛D4	af$+?1QCܮT%4-}
    YdRuKΥH����IENDB`���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/beagle/images/play_doc.gif���������������������������0000644�0001750�0001750�00000001126�11771040324�026231� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a��I��]�'3>}Q\e%�F�z�
    `ju~r~ȄpzS]gN'kufjutdmwnxq9^hqJS]PZe`hqyYcleoyhs~w^it[cm\dm̂fp{������������������������������������������������������������������������������������������������������������������������������������������������������������������!��I�,�������IGI�@�;-�":16,%$�	4I�5
    39��*>	#'�&A��F�E+
    Դ8� .!ߴH�/=)7��!�8<G@"B$ti<8L`,IP�Hɓ&l�;������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/beagle/images/beagleFeature.png����������������������0000644�0001750�0001750�00000040752�12021755022�027216� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR��!��]���Z}*���sRGB����gAMA��a���	pHYs����od��AIDATx^{Ǚd'3?̄`<yf23?3Y3;;86^1I%/00`#vVam~Yꜣs)Vwu-ooUw7|{}�	�	@ܾ0;w
    ԘQeJ$@$PnZzc~,5+O$@i9=uH
    Ԙ2 SgC229@j�	@Ippu2zyvSLH*K`dlT{gCGg2_ 0ԘʶN$@$�yoa;ro}rޣ2@)eZ$@$Pq95&.[۟h5⍁  PK_8Ԙ_Q&G$@C@i̷m֝^0|p:/^>oTĉc]cmF9>ԥOO
    }x|aϑ]mw"7tڸo[5zKB$@VD4f`WF&oM81E:"<(741+ג�	@h+lWpJot9q~\Y64ʚ1]khp~w*pkSpl7&#Y2ub$AnSN3D,<H,h
    ȿJip@dF4d&bЈ4~3ׅL5&,09C,
    % 	z!QL\c 3i44.+xcns_hr#c<P*ѵvm-R\E̻ D b:ێEf8Ok2eD4�EcևF0
    Y )J^f+ٵ']
    w45WP~w]^$diUpZ&,u5&KuI IcDf҈)d]vL`_Vz>&ޘ6FlISd/;^r'kAdȠ%;55yJBE$N`]$VHD Eck&]cd_-k614F{7X2|ԋiBvyi39(b$tC8+sqNrÑ>%b$U!d%H
    !,,/;&@۹<=d^-͓	ccR0'R<Z#{hF+F\gwuWb2W![iia<H	D!X9>c"cJ1&Q#֊wh{Ȇ~cjm]11NDd`b8֌)&@߮T]u'@ IcOɔv24F^eVԻd(="D6>ml=/:+nQx:*nC%m-(mI�	x.Î-՞,`&].ȣLKx~Ԛa>e]<,a)
    o\	T%$b%sԴXc t۔|TDeC1pY+W1<%ue]2?38>o-۸LHhdC["DcYT%cW39Q8:saxtϐ1vS' Dc`RW;PZߕ]c71+0gטK8Ec3M N|^.~KqW//+KcLݎi"5Ug$@$PQ"aTzQ4#yr\c 0Ԙ\nB$@e% #0AЅĸE},򄿼tYW1jΟSKHHl"	1)u20EcpFLĎ`ʨ1ëHFmhVܯ`$}hY.-w#o*6Uj&5l�	U,,/,H|zboȽI$2S)V%.Ƨ/Ecԇ1?}LjKIH\_X002}I7{a,e-C\WpiilZFoÄ(QĤƔ3 G@OWn:{'?WuM^(Kȳ/*ĥED;Fij͔IH<|qE&f_C.2?wf!h(Ȍ<Q|GYZDZvdJ`L7b1̅HC�G]~!<hѡO}0_߸zoV?ۆFOt]\aS0]T""K_�B$@x#}<]!1c83ݐ}"Ɗ1Yꂧ|C`^yc3Y (EAsadcEcju
    =j 3燆+"-!(G|o+Č̝V<_T+S93)RrVE*QD$P9`>ocQrxjjyم@`1-kX=7/YDT
    ĭ.-jKᖮfk)~q[eTEza,5cr/"r/&wAZ>:rDf)ʮzm\ebH6l63ـ	1<xzL1DVԽ<5-Xq/m2fJ)-vx^2 0G
    "DdFˮ1bD`:؏fO`xW`pbRiesrĈsMTS٥{HtHrsj=IDps|AK`h[\ o/]m@]	}vSA
    9LЅj(O\R57ə&zk棻[1hLdQKH 0buqVGd3XZy
    }cʈ鎉/@X2wX>8$GeˠR㵛6cv#r6ܝN`/Q",'}R}+Oਪᦔl%hE_*{�OVxV<i]!xo2T*ZΤH1T1x0td#N3<q{vȞ?Z;\d|L]]bjavzac$^{¿7Kz/Nl=?zֲ]e9[~8IkrA\|+[ӀlXs]|qS5&&sJHj_8gT#B;sfDepyǥ(4ؾ]i' 0Phe~Z0el&	+�̀r@T/txnN6d[Fl]2Yct
    ݘ5$Oq<qxIP8Y^D+^pnrXErm L)f,H."e=-Ӡq>ԘjXfas@WK!64"p^AfvCi<}tezDlͥ\Pۧ1(qyRF;9%n?Sו# Wf\kwJ	^HYx,NTǃ'NMpriRLh w*yɚ\4Ө-*F'!4>kWI< HƟ}W {`'v	L#@`C&X'|ϓ{)3U64402O1R~^ DËH]>VkrLӏPI"IVRP)M@6H\Xu]"ԍMsthYfSԽ).|O\ZhДsc^%ix;47NMca0zph4HcO	ӵoӿ=?K
    xiؕ˳#n4Fg.TZ\C*
    �	d%hT;r/T7#đe1xRRјv_1WldV,^
    �	1x%^y{	X|1#ਲcLO�ǔ`C4"6c>/SXeIt첰8$P|,8\Y\[t˕&c`&ijF/hfe<ŌیϾ8,7Px*=^VghZ
    ^y_x2K  o],<>)"r}UkZ2YT`2LtpA1xEs1HBx?,ۺ`vM$@UH@ކ|r9HRC- 5Ahiv%Æ1.3ڑː"�1ͯ;=J
    =!\S-E" ?El.o�w{|$ e]i0d2'9JynAD̉6g
    t\8w#+>45
    H@0%S;3"0PjKE'KG.3XG1Ϭ
    f>(e؈k;%@cD`D]vʛG$@:u2Շ (Ƅ<?4dF1bZ3YQW%0xGLs>̱C!0`/#|>mHk]Ц1!*Jceʈ`31p3!oo v΅2_FjU,-	�	(w0d.2((@]"27lkFz/BT$)9Ec?5H)1eyLx=J񒉣/%l|/Wƻ/"5$%fDnM[3K0WuPcibIH@2k^jr21(hL `_eXo9:1/a
    W$eЛ&o*ư�	@-};<1ѡO 3x9?c $X�bJ`"4;1k
    $@$D�/ABz$~Ûʠ+Z3C}}3Q&3|2
    _H;]f$ $�efv&Q 	B^bOi98}댱A=DgqŞCF1<1�__팵"Ox?c1Z/dA
    $䐨tEQI~1q(g;dIj�&b(5#(Aw�O?iW'CK$DEw 8V:f~f[+F$P0/FmhLP|9%`bGei>_`9m8	@-$ih"3*@oTЅ1WA]/b溲ZnL	�	D`1l$@$@'PƈhhǼ	�	�	X o-~)�	�	GcG$@$@Pc,@e$@$@.j	�	-[d.	�	�5mHHj-LHH6@$@$`�5YK$@$@a  Ec,% ư
    �	�	"@E�	�	PcHHl"tIH1l$@$@Pcle$@$@1gIe  0n`0JEss>B֋_/ӑ�	@^0ntŇ'|@"3u1y5,F& !`ԘPPca! 520u/^(1ԘzO!Hc0] PcтH0IvW.xm1M
    M/~hl*|nʉ8M+TWscCR9cY_i%Ӝ$G(e9VH_U(ޟdT)*,
    )'RJ
    /g,@h)s%И
    [Z%%Kzt=/fl21MN?jne)Csn4=Yj%N^XKЩ1ȒGZE:w[U曎fHRNv[y"xOXmYаlKB8ANk}e8~0/MpR@aФLS`R&;Fԥ5),2=]SVFa7aȒGZEάK1Tu
    ,^$=Br9#4,
    dXԘǗ,YlI\Hdh1єW?k2K̕Dvlln{VpWwbt-u2un){ҹc)u9+a;F)LwSDA28@3dF
    yTzpCS&JngWYb%j;V2]XAh$4ĩN&I1v~[)i1S>-R1(F3p\F~cѕ˱;`#	ђtȑ2ȘqO	vwxyM	0cwSq7
    *199:xz]ߏAPR+fFs
    ~Ht!$^AlZ"LZ"eu"ԯHe.ߪŊj'u1czO
    0~~ƌYrؘ/qc9wZ)9ђhR#mҜKD"mjǵR4Z;G22?]%	7]7pznW4'M&X_[ݤ1.P|Qv
    N֛oE T%`sƺ`hMbQIQYMs"֗lҘQRO156ZHDR<%5"3d4͛m>x7~
    
    øFcz x~g{i_:qD%1b1i~4F5oթI#QBM='o	 ï7%NT&N2,ᾇSsk78F)1!/ax"gSf]c|'VUc4[DGįtYy+_yh$olޮ
    hpУd4!Lc}&qE&j(EL#GhW5tZlxBF$ѼHq)kא~cpœr
    5[+i[Xox!#CK+Q|5&PYfШ@NIp̆d2|.XJ\2,oÝQݝnGyv{!qg鋔b47jYHbD|e?j\OKs8^65dj[ޮМ;|Jhs"p/$:\hj̮1ñ`4uW:Wnoi	=c'I=YMjjƙW(G	
    qژ]Xe6Y2hۦ	X
    A22TJTZfn(ջ004V?0kn\S4fjjl@>~+HvOp+d㬳ˋSPiE-a2w$`L(	,%ϲnLO:M ޼@#Fco?D@`%T~dY"wKN,)Kən(BWnԘ(qU}'?	Ȱ3.-Ac2>7Y2nji>	E#^TL׭+c,Gu|+zaS4%cJV^iL3(gqQN^\\r&ث]EĻF9ʪ17n8]_x[|J W($Ә%,-	@'GtSl?$P4'cz@ߏ1.wm�	Fy'׮];00�)
    ^ybkRɋ#HH _=իqOQP}@HEc�	�	�5<	�	@@@$@$`�5YK$@$@a  Ec,% ư
    �	�	"@E�	�	PcHHl"5yipi%9JUH}bYX^d4{L)-޿AZַ5ȯN=KN4e#3JlCSPD{h~/(vHR3_Юr)0ۧQclP̹j}i5[3/Ad<y1M3^
    +9$y-h3|ٳz_Rurh6YiE+KP`W`O&\c
    ˙W95F%1G\uT-YXL=+V6\Ko3a<jeプnv_qqSZ[T\H-Hd1i^$)QpJ)Vk#HL%d5˿K-f5b8֌7أ+W󪩁5aq(qN5LsxN)Ғ=jC1
    NwKn,'=\EDSpxJ9Rx.5^EOV	M|8&GB1ј+Èhd\`˽qg{M'OHӼԵW&8%ecԹH?z8)6\SҒ0a�JŢkX\u2_%Qte
    U+UL]]gZNKK.^OoYQЬ?FByGxYPҠUJ:ܘ擻vu_בsmӃrԘh4&6^fIo\F?j|hѴI/q?m:U3	M]I)C,5ٗXUpUc).]Fca]0|DM^y(2"/ݳ-|kvfqdFqmߔQHa-vaEpJkŖP$ܚRp]hy5S9zV_m#|0jL!M0/êP>2%A:jW$
    z'3Ȥ3+'.AS4Ɠ;SI".8o8O?.OQ|Hl暟'쳊NCcMZ@tI]3&
    |yi(#g[^p.I|16x#T)8dy
    @]Q94a!JESnKcGIFBrDHČ1 %,K-?ܚNNHP2hHM;
    Cg~\1Ұ1!Kjck31b3_T9F'UzN\#@[BfH5%ԎFj^}_\ZE$\$̜BUiQ£Z—HjL5$WjL08~F5
    [uߛ+)HHx;Xà!D,2iBW')R\N-2Kcz'_0x">]N*]9;x#&Qe|)JAttwY虡xb	5Ju4U.a!>5&"b f:P:*o[U1XWuٓGYb*(ѹP2YOk7N@kԘ*!,	}aHi"$@YE&  *Y�	@fHH1ϬIH	Pcjz$@$PAԘ
    g$@$P15~Y=  jL3k qԘ	�	T�55	�	8jL_`VH*HSA̚Hj�5/0G$@$@ |fM$@5N1-xHH
    &Ӭ1�	�	@ALԘ$  \18	�	@1y$@$@TZc
    n{ʋ]	�	&ƔV�Yw8BPeQ@^yW}Yz kLdT%0S (=4F[o6qsyu`iLDZܓ8׭Cª87",cf$@$PҘd	Fjx7Q^,uaEVQG|M<%V妯.<+M$PFEh>X{<?�ҧ_2k!Bh;")#1+ #P8j}wxg4obDdzjLr֘HRWd0'LEefqlg,ƘOR-�	#|5Կ;n<|eἢgSB,RLERןu& ֘Ha�f$@$@@qMŸJEqYH (5FPuYԘ2]6fC$@@(jB�	�	T�57	�	6S5y"	�	�	}S	�	�	C++|K$@$@I1l$@$@Pcle$@$@  [$@$@$P%Yf۬	�	=7S&Eڵk,-	@{.Cư@VeYx$P4jL�	�58X	Pc*|=	D\zLHf=IWV3
    Nz	О6jmLvPcjZ&.e髮
    45M�˶XԪ{l@5&w_d(mWs#NNRZ1Jl$b4QMWW/,*HL+%jј/g
    w<Kל{#'	]55K-jF*W-<8t	7ݙDiݶan+4;ߊwC$wgO?{Dϝc\{'GL}㙥Nv6oNY--9E~Y4ߋvm
    	A@sh|LnҧOCJCZnsg:ms$TtvzGI%fM�}fN=T-MIcW
    /.
    E.cƳ/"kH{u
    Tq�N2
    =uӝ_/@UHјh-TK8{MZ Q^?엻.'2ބ@=/
    ;]o~\R'1w-k@nv>MFiLQƍ2Z-ԘVgHҞƎ9n8<%wmw$;;%ٸnɔ@ߺuq`h"}V
    Ǜt˸
    g^r6NY-Ti
    
    {:oW1QvEʤ1ңw߶WgLH*rjIk]F[U#{8jմKcffnL}@L�znTwiذWv7H	+^ȾPm.Ep@V{#S.?*ӘkקH	^f_PP=#`^j|1=s
    gs=}jҞa^
    '	d%@71.iHH$ՎH`nnOGB�vΪ1umVHHX_l&<HH.	Pc$@$Pe՘֮RqfB$@$`@57===33sMr䣟܈
    ?'_Kl=Op0·
    XXX9y	�	T/
    hwwPo~ށt~ں.:?.Ǯ!`S%#W%ИϏKh;11y7zaׇaD47څ~Kb}k'?+=×CjLK8$@$PN%ИM6m޼y||<g#sDDžvڷ^{pW6"`x˷&߾|`Ǻ/{930pY5NMSw.V/aS27n-'F  Z#P}W(i?wl7_O;sߖuǻ_E:$?qkt6=Oұ{ڕMcq]vZ6*%$crO}�	I4La477wvv@4f#փŴ{{G\c}@Ku
    36?flϕ輈4&<C
    `enz2Q8)4`t )%PtҪU&''\G~?zvtk^_ċ?x9$?{a?Wzwo{=+VcSc|%	%Ƹ"C+z
    +C$PiDF;ȱ=}#wׯl=.}q
    AZ|s=kZ\[;Nt8ѹm4Fsi&H3d<dI`ZsHH&FcƲ8xxt3/e//muBkW6�lYG[~|̶gzh+64ƟY\i75yq}D
    u�!!*h^	@(䵮m]#Ͼ~ƽ׮kL/M�	2hLȓx?y>{7̎H@	4&{=2Ù엓1IH jL8	�	@MdeHHPcr0$@$PS15u9Y *Ԙ,	�	jL++ʐ�	@(w0jf#HLST/ưW�	T;hLw0uU(^!O['G$	@cL\Tv~>R>Nk{dIj@i4ZCw0!	,-f9!NN&n6z&kAA4 RQ_>@/-͔/u[+Zh٬	@5(Ơ2{Ew7ϠĿ6sh?Y
    e (;eɎM	gfҗ:_$`&F~S]9mĻ|&+oNOuj\,	Bi4,_S*5+,s"s%И|w0isRg1x.	@	@cZWV/aV$@uDSG\YU  R#	�	�		dco{r;y  H!�d@8:4潶G&M/0�	�	@
    $‘Uc31uk	�	�	X@2 Y56酱ņʊψ)�	�	T�$‘\baz;zF[|wdK
    gmŋZgtzWC'`OS]^:Ήz('S  $�Oc&o.\VlL=n04:O[7`?T'6'5lw
    Mbk^{lKCczE{pkݍ_
    4F+HH	�	T!HF30x>xIGJc>?.x;}|]y&^0ڏy	wO޾v?3|?4M
    y؎T^7ᘦh	@` aSyjz66<?Ah̑ykz_KðrGO灭mDx˷&߾|`Ǻ/{930p[׫CzE{~ח#$@$P 1pN6}W$őJcϝl?}ׯ_~ӎn=;*[a{k|~tǭ<KzyjWB]?[L|wRo64^	~N55,kŌ$�	@d1Ώï6n¡#]?[ݼpgR4ȡc;o;Dc}@Ku
    ?|kh36[t^DX|n+fߑzxD쏟$$	y
    	�	HF~a9r&9tҽjL)s?lcWX1}G4F?{Eo}O^FğA{ϊU$e*w?α;:W$?9~b"(	�	<HF~3pë9&:xnǛw~֙
    Ec;7wwC`YS
    Ǿ4|ϚG?=֎];Nt.{x!7|P6|Ѯ3#){Lljj)U! C4asxM;_~ј_ymNٸ{WB㱘-hs3w=$w=
    
    ]WMSqsQ m4orԐ94Ǔ"1?oy7vȨhLtHH	@281d;?FQ}LcCq$8$@$@UK�<E++2N$@$PAH#vD譚_
    �	�	I�b~$gn(^�	�	@:$‘Վ7DIHH�Y@<HH1l$@$@Pcle$@$@  [12]  j�	�	-[d.	�	�5mHHj-LHH6@$@$`�5YK$@$@a  Ec,% ư
    �	�	"@E�	�	PcHHl"tIH1l$@$@Pcle$@$@  [12]  j�	�	-[d.	�	�5mHHj-LHH6@$@$`�5YK$@$@a  Ec,% ư
    �	�	"@E�	�	PcHHl"tIH1l$@$@Pcle$@$@  [12]  j�	�	-[d.	�	�5mHHj-LHH6@$@$`�5YK$@$@a  Ec,% ư
    �	�	"@E�	�	PcHHl"tIH1l$@$@Pcle$@$@  [12]  j�	�	-[d.	�	�5mHHj-LHH6@$@$`�5YK$@$@a  Ec,% ư
    �	�	"@E�	�	PcHHl"tIH1l$@$@Pcle$@$@  [12]  j�	�	-[d.	�	�5mHHj-LHH6@$@$`�5YK$@$@a  Ec,% ư
    �	�	"@E�	�	PcHHl"tIH1l$@$@Pcle$@$@  [12]  j�	�	-[d.	�	�5mHHj-LHH6@$@$`�5YK$@$@a  Ec,% ư
    �	�	"@E�	�	PcHHl"tIH1l$@$@Pcle$@$@  [12]  ]c?9nl@����IENDB`����������������������logback_1.0.13/logback-site/src/site/resources/logback.ppt������������������������������������������0000644�0001750�0001750�00000715000�11377016712�023424� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ࡱ����������������>��	���������������]������������������Z��[��\�����n��͒^bEN凙=UPNG
    
    ���
    IHDR���������I*Zr���sRGB����	pHYs����od��IDATx^$yvFdDddw/weNx%�bH
    \]@%DEJgE`%Q%	 f`{]UwF?2etz@yU7w/]{ߏouCӴN~;yYgϻͻn;<z4^E2tnY>ϻdUo''ڑ
    w	3#Qw^Uy?;轔gmޗ*Wx6'>nO{q#<#=bg}=W9:>6Spijj-*l{;lN9;^m[Ƅ?ZCC[zk{gy+kӏ|]|uOQR(}^4Lqhiʷed|HVp~w:7]VHnCbg3X0VF1MZDVUeթwdYC')u^3nyxHzS<l`GyC=ΞMZ%N7�gx"kM#oDT6Im2ݺvu,R\/3_]EWepQPO[_lqxש^=ڔ=y9+.<=Eݨ{Nw=gj3G6A=X
    DS٩7&6;roQ=MwO6>G6m^nNe6bw^M0/zרWJ;}Dasbx2meއO>NQzFF2L=l䮆y$m+&Q
    O=a|˃/3K7	,BMI2#?><o w,
    57o~q`T\[O~*s~0n1,xJ[{>ݔ*ʼaK)ٷ%meoceQy<tsp>98[թUR! cJbnRj=oYTWϭQ1͘MHu㢔ẸGe)68+Iɟ0!WovxL|M<Եfְ ;b}c XDvhmC{@@Fq>-cWSg™a7(%>*GL~lCt:~dn,Tϳ6l
    2}]f$iуpk=+IFϞ22s
    K
    ~\:=byR54h]inL-~�?gF*uTrǾ}ePofaw<dat1ŗx*F`I@Kսw?{nힲmu[ԑ=^Ws'`N<b%-f9>o؜^$.=;Q{yz+}|ϻa"-[޹
    KS0u)񬧯u5V\<YͭtViu]mXV%J	|{^{@6B;M	'M4&/#UZ
    oY~C'N߇mKƬ;acm:гtHR!0NbZL]"FD.u%uCm=Ѝ^3|֠5\uZn34:Ų*;V\_+ Jv{p8f=ihV
    ﶿ	l_\d31{*_NIs6!%?*Ie#>ZWfyDչst:+{6}<;MG.mD$5Ļ*&Ye
    /zU]705>àg"wm;Mw0zoZZQ(VsFT-+;09 m7i
    BNKo޶,;>KrvoX&0?ɐZJ>?0gmQ:~y:&:8]Mnr	GMrr
    9`%kS˫<zfw7L) F6Q	'uɰhhu15͕كr)_HA(D"`�_71zdn@ �ZJQA@$=bus@$
    \lj*03ӁKAxfY|L/?w7oã!
    k}pssՁIau;xՁw9
    9qtF=%uFnP<ݞ&"[iȺz~,o:͵zƙI'ⱅT<<vcW/ԓAzSb͵VkP.^nBPM˞\~d!֬`v>rFz4hM~8V,=ޯ3DR	kSIk{ۆay򏘵-o~ȅ7ziɁT5'ws1M~J=w>|skgk}kk{R)WWWϝ=x$bJB/g}}ŐƭdbTʁMWk)fYV
    ѻZ1
    J٭T1?>{ꆃiXD
    a)>LQ:DcQS?)k#aM9HO$}1a6q
    M(ksbm-$YV+㧺rue}A V䅼E}˥[kwv{Z88?lx4ÓZCfvzd~|a`GF=+#Aq)H[;Ϗ3kkMn60u⠿8!⯁ch4~{-jVgO})-e-DV0l6-c]sc(HoTFMrGZ48ގznIomw lHȚpV=39*dC8^7p[DK}P
    ^c@	ZbPV׳l$[Y\J0^`^bd_h~Nf	x-6[wzZBh7lj16^k4{V4nܾ+地Ep#WVw>rf9DҜ-BFkAzc\B8Wc>ZGߓ#(3r
    5"@
    RzM,Ur_I|wjs66h6I>S7p/u^hz?9ɨ1d:hf^(C~Z-p\_Ƒ9mFB�08msg"WaD_4zCxi~K	N|00UqP<&b.v @7|ܓbԌԂX^jӶ*:MeЫ)/YTGYwahi$)ᘋy/1fm癨tGȃ%l89$rMcG:6IUōjCV*Uxf7;3X}#Ɲuײf}`%N+`zjN4+n
    bbԞ'uVFk6Z1bjڵ@ءt-JeQjq[̛>_[YAݜ-iu%
    o!DŽgu?nKv;'ו;t\ (yX
    $(Q6\M|qN+@
    0REmtME YDk]ngvrVtZFt`,(U`L/
    X_׍Ya/	kF&	c~\Y^Žfn״fAh%_xxFbM�NiuJ0p8Wڪaڭ"gj+'c魍
    ӫg-dA_"bm +tS
    GSU@8'�>t8`ǀ}eZ!N6^Pe^\U`ki=aSH
    %pcZZ?]2wVWp09+bv
    %CfOrЎܢ
    m`ǜ<Yokz26Ө9N(Ddoij]cF<XŴA[ީԋ.߸uExl:kPĒ	nX\H
    z˯q#ȇ\r"F,M-�iQ̂<UM%oK>u:JrHė
    hQKjnsQ9S!rGT$q7I,8"D(<|J=}"vzzI1΀cլ0j]\%w̰rY_(PCv)5uPRž+
    !ﴻ|៚oSlW]cKSAVY5Jf0Mď-vО/433ӅRjEQ\Q @7^%Fsϛ76vӏ=3O=o(Q>U\\0$Fυ	œu]	x}`rS
    ki|!o<c\@61h)ib4HF2$![>nldk<^�};D2CDChIMҫV
    ^6}MQ[==ۑjZAJFim0vEiIj(GZ4+^ѪmolltNj:](猀83NՀ?H@N\.NMM67k~'+Uk4j
    ~$kESo^璟G}vǶd*02%&@cR�#_KSڢ%FxZ^T‹2I/,p#eCA&YÒT$dqȾ"16Yx2\"~_ȯE˅1V(sHH܋n5۵hm)	񦜔55.�_�VSY*V1AnC7mB*}efg-|d\:?ʅAGY,cWoӃQ73_(z/_}X<U6IKyH(F%ԉR(@K㛲�Zn-	WvB+'y'Z18džUJPueh$hŀ(Nוj#uܠm"E
    ~/,"�ewI7	m-t�E3
    thS}Ap{z
    fFN1֮-6}~\rRU)J2an3:V(SߑrfI3Z	<gC*Y+r idBzz*h0d#z"n>٩9;
    F.mi	Gl?sxsK+'v=_sr>x,DZF'*QUAma܎uTWpNSKNFw!#�g+;9�	&$g(!~	>?nLP,>jUi5	U̠+(YoWu_,!3
    JaV<6ӶMˏwiSɈOG9(W%(
    >VWá)ADq'.OKkhNϿqK/^CB9SӔKTxff.OIo{M,^7-#Tjd
    c�FcF$OѴ2ZrnA#�doa{}cm1?Lu:[_9(QNUjB1[	tcx,k"6$&UB2AѡdAN6%lLE`4|
    	cesX(ި>R޽R	p8vGu%9ĒcM=pܙk P-
    iJ
    3N�ƻ]#z[VhyZKJK+Bi'N~?t֭ǏB,MRQ(>P$:-B<p6w`.OR(qN/6X~tbAT$ɄTҳR]>N#>Y*ǗLBXqMPR3.\W]ЁAnTm\%cFL%>2mx2<n7`ٷa42?y1=r(6>&~opuSL\©kvXzsTkۅ˧3ٕp8`A3rH&]_=ߪ-s285:^5}N
    j^gfQo'BViZ\z7_muOȧ)vo}!Hhk<{氰2O~tf&Tc~ٔf;$~"E<߼t!Q:V*e\h@K6pbe	`m//>\;6+];#ߦ豒[
    A7Z8<l׺P{PSĢHOM/@KLՌ{*�HZ#!,SX)UR^ՎQ)ԷBY|"Wo\m!<;c'9䩕'<9×1P8}@U皀UF 8pL=g783BN,�4(i	=dl<~A2 
    h<Hݍ߲TR!"z\~j',
    BH0@KK3iBl<Nuxؖ;P&aƤ ^C2T
    !{momʁ\r$Pqg97/LBr-\|[n狭C!M:=3$otmF)l2o	09F{]nE6[Z-}$M׀(wr~S^Ȓfny`+av/qVHyff͟p(wh̚7lhmK&\H%E9g`$tڨM'rtRkRP�t4sJtb!:tċq.[\]r`h4t±	d:3I%߰k6==?133ݒ$OǧNr%s<iMZFְ)"<25	ێMUޗixTo״VNe[Nڽpوw:q{?
    \N_p+:4�a$5:Z7];Z5(77sF֫R:X*z#LO$'
    Nt1`Ek6%Ri0*t»lGdӛ&IXZڬ:C&C)Not)&MM%RA+
    tjj:])6wwvg33SߑP2۳()% Ttg?iZaycߥ:FY=8'nu_!K?	"6T]kS.ۧS, 
    pXSSڰ{P�%4k=
    vѲEy,fA)cs25;FXfX;v頴.6#0R 
    v8Kgs\D&1g&OVܭq;RBf#t#N`K7
    6٦٫5kvğک2!c]@]'`]䉽Fߤ^mv%O1$<$fQKdԸC.fLMOŦH-NHqy8A~}X(ŢRB'lP
    V1&I-Z'`HM*&%iy
    {]D`֦xT
    mȎ%@zۯ\ۯ7zA۠_.Y#klҺֻ:IX+cs%:Er
    X#@:Sa
    ܻVd::
    F'1{X0'b3o*2FNJp0qݱY|fDSz'ъlt(4u1qZ�&RG)J�be7JfRg##�iGHԡ}gO
    ͑le2";ljEk\O0_]]Ds
    	}=3B~-D2dyMeG0p}UUM4m(gP({?]gvFB�N[	NUPWk*_=hux:A`?G'o0;m)D*QGLs@�"ܪvh0	zRL3 VQ61
    p|
    ^E�`25/%Hw .4mܖ0#iһ\K.;u|@.4Wֳ
     MIx[ݍF#s帞Q+i#Ϡ~lUekRrJ&YLr1z&[}0ޏ֦ܥW:d�ζ[^' f%)Hb1K
    vK)-BܬmtcGCNma'8GvIō_p&zWmZ=!04=|emIFXkltڎjY-54ilGM+=ܿ-[V.&j7dxAs�܍>8sHfl@F	ĤylqGz1L:ޱ$Q
    nfX߼U0P,V2ґTܚЈ6P\{ڻ|)S%)d5& 6!Œ> .D͵bX*ƠҬ1KE�D2=deX	DAAmh%F<mnQSD\ax}wK&"&
    xBpխVWiVEҼ
    SWr,Llu*4|`go}{oszdЪ@+`!x5dhv,}\>&kPPGcapFz;C%jM;Z2D>զ"TxR!GR<Ǽ`.O+]P7DD2w0?(&|O7ŽqSm5¡x8oջP1Ib8۴i2pshFeHȌSO]gʙJVL!2-0Q_8sHjC1dWQ>`U"ڤ+"؁AS!ꕊvX#:7ȕLmʁ%ij,ʤ3|fnnGb:I`Ȋtr	nZbYU@PlR!H͆蝦i`ba[(-g<O{Hn&8tHVadPHޔJ](5a>8EHD\Rpq
    -X0ʮ5QhtmHihh`#a;ft.܌V;1Z!HGC:)etAX'+>atz>I1b-W_^\gN$T0O%JV#�|+6
    ҭX0
    vtA`r};#a9:rF:+Q֪]<}\
    Gb]@6�SЄ`ԤH!-cߒZo*H=�0YA!!%!e
    XHJfm[½GLDh$�!-
    \`\ȱL$ʕ\U溋Gm~H:lG|aå[`t~4^@ЧRD<_dQ],49]6juAU:FxcJ܉Vgd);n>"Bzoo+ؠ/OEfp9�HmSDnoqg'�JEC2ңFV?rK0j 3dvܔhI7�#P
    ,^'Wi<	i*&Z
    U\R{RvZxw3"8raP"x%2Mwl:Nr}i)~ÉFiZ&EM^BFWNt/GI!XAb)enDEo@}iL|yXI*�#`8IX9~lq5KIgm~}lRl5kn21C㥾ei$:}x@mfx@`0*GU3)v2XZJWK
    QBu1mfC1Q?82&g2T|*A8qI^*4vY5jBHr6~6a!IZ6WZVHZ6U%>
    rW>W9�Hj4+._LI-x0]mp2''bNQ m3T*I.X$@;$WEy+iTBmPPrڍ[XL&5wr'HD2ek|XSh)UXCX6nz〫hR(N-c‘t*GOVԩP Ie!r
    YѰ} !q׫1lx"\r~8	$JE@M4Ճ|amwr$M*oK"=UnQ|菘ar|`4MOO
    @pT4\>Wzh
    L'Qa'A(rń4kRLRZKB&>L{T[jaA6᠈nVЃ[ƂXh	(ry19wAT\_vkow{wc0h.I1b*)<ޗi?U*qQT|X%4Ÿ()B$oc<sp4@WW]7dxx¬bk#�58uM uZGv5\Aj;UxG'6's(iu|[-$)"pI{f> FϙM/gvGh): i_ë,c!]#R<T\&|!0C6ļL?Et&{Y�rFWoZ`<<E6&(uMjw"Ug.Oߡ
    R3gN>2\"w"%u,m,
    ņ[h?+
    `x=#4=r1MROq2XSP0
    _}'4O6׶.;.uWJz-\%WZQoѪB֎h}M"XgjV=\
    ;HfFKH|Ht
    oY(V	昴x,IEлżZa*.j
    %u:'-äL#s_Phh"7Vڭs&jER-ҥ.4r�dE]wmZ`@bN <_Z9{ģss+TI:rpqd]NQȈq-P]x
    J8`1z"󴙎d2]-ht\i1.4�p,EzmqKErRF/1P>J+gBQ:7t2ي0)u֎8[M	)_c_=25J^?v?jVzSBRun9&t-['ȕԁ<B%88HA}.} oJ/6@ƴtXa
    Y=l&cQ;FE4n^PZx1jhf#Z_;pۥf#:!?Kz�
    ~,I?d.]`=t܄g:RIa_tZrv+S(<&|`vJA.1{ڞ䠘 rBA]@B|P"W
    ZP !v*=|X2Bj)T@d</?z:!#b
    
    LHuG=WzܻݵSHCX&Ӕ%I3,x4^6OŎ'-
    @쀿us?=(YJ[1ٴo~!:Z03gSgԌ53XbAաD/TrکRF@na9F`$[Ѵ:|\rh>CMwX^$g@:XEcAjM\iZZ:(}@kd1+*JCMԻ6Z@E.LXR!j&Yl
    G!\B]Y}"
    	�9)Ap~a^2z;ɓ�0Hja(6pvۃ~7j9rLlH*'ec*P=R H{]r>4V@y	HeAaêG)O:u+b&SfG}is#'?<h_`'ꄗ($zԉyDL�y+bHج0AڑzN[-=X٫STN`�79o?=}9+s9̈́^H Tv'3;5G$6|qMjQ_d0;R`S2໽q-R>[VjcN4UJ]K~xFC	"`&R1|sh![,}UXUŕ΍·@ٶMJn]R ւo?2G;BֆglguigqE32Di>wЪa)C
    �jKm Kē$.œQ3= {ϘL͇SɁ9g9v/jT`ERk-L"o
    
    gb24kszdfME`}*3$;wB]fpʐr9$_nԪfjѻVuTnC!hDBvK#U\ݔFTN%1 Qm0	OC
    cvZKWyVwv23/ƈ]_O1:O2fnBLԫpǔNg^-g:4M !By:BJZ/Z`پ-lmo4'-f[.&WNPp#&2Icihaxgixf\DAV_>*,
    ,ԃ7_X+ǴZ:'Rw#	EV3խ8Un6,hu}Cjœ'_d2j5K/ꇭrY#p๋ۛff6@QU}}Ւd9x,qs|pia= )k_^}ҧ|lq[;;wOx'fu;j^vSDG";O׷;y:vb47ix9kfS3?Ȥ7~ֿa2>{?W\͟[<|@"ti*^ZK^~ӟJ:q^}K1#'g2M0.Pɲ-IX5/- _)T D|}kKk|.5쏥@V
    @BL!C7IbG+H	%6kw}/wkBh6 k7povoJf{qR1	
    
    Ӥgo.6봌Hi(~k/z᫹+&Ыif׆T[eQꗲ\vSغ~kkc)Xsqț#W+|Ր@rn3ON%ֿzyۮww>Ak8laBq-1/\W7V6wӏW{z,o
    T9+pslP[
    ]# .U2AuRnR%sU,VL9sFFʐMEǾ'&cB:EW.Œ.0:$z~=/OFլ[n]!A~2&GJgĞVSuc_oӺJp"*9hwie[zW]gkko+nbZr!}B/ԵW]sSn9m6S PKLT{R۬a5cvfяv[jqң:șNЋ`K[x40)F\4e^EXB鐹ЫA>2ժ~P1	4FP6ŻHb5zkr2f16L!s2C_fiAkhrPZC+}j{vukW;l5ʤ+tV-DHP*)Jyݗ_ȍWK<UH�mRГ]V!p
    f24piP*uUGXiѡ#HY<d/ewbn3__X˿ovkK߸^jTg;FN6\3	_){}n`ZL?k;_޸[ÃR$Jk|G>YWwoE q3t"ף	g>�Is]6"(k[ d6˜@xhl2JL'3fߎ3ۛ뗢Z$hS'msk,GNٺ)ݥf}>t5$.{ju*l]+|KHt3!ȯtv
    ZH,φZ`Y*6%h$aL}
    /R6@VT;i�ecZWܚ2?Ǎ`Xgx3/hQz>T�7_zw*Rj[_(G??7?G|K߾t+0HmG7hʗʸ2Wv׏
    +'r~Ͷ{꣟OGCOϝ}ʞ^,֌HbE Z9Ocɩ̔3$R;3X82`/&l}q_yK+˙PS	<8HLO2q>kQObֆFe^�ϊs91HxM~>Nd4\,Ni+ӲZ\ppX]+54@nt\1n@4iV39@qg=L|署6oxm!/M<QI(K JoxKg&nQjZ*M`8z]nο#|&[ȶڏ?B
    WX\?w?/gVS\[{Q;aLƍa_SoW^]kFWo->pZ
    Fm_߼p-$"BBB+%qEr._OC~F߼wn^
    Cq6PhuɨdZ^EV(A(!+]F%Ԍk׷80o9+UK%	Lvtz:q)%Rfu<^Ǡۇ!`ڔhhF')cTɰ^FБJFT%k	(,za-?]#$|NO43]BQPR
    7DX/>-!^O{#΀t28Q59{?p/|yV,8Vۿ;	q_TocK'hȏ2u![aI/z/~jg>̢`Jd%e
    ˍ~|=@0
    [‹wO,1II8+am렺Xp&
    10jw]
    2اH;?۷1Z/Ǧ"/_ˤ-�51z fC@W%X+5՞\-bj�5݃}qd>ժݭ}e"3'2'A鍨NAIUI\=m"}WV;pғR,J,7$2)P(2eC(Rw_4\qi'jS~nI,V:g6aMkЯnЪ3?7y,^ntJF5d[߽B6;Vn^-]9YRk5.:>@XReI5|J@O>)/}=!tvOiD)Ifl/rͭ[ۅm'˫fS#�^mH[Kz3"o1Ck4Y9DM
    QF{m5=X]_%pi[~~e^|oܾ}7v?zJ	@T)Ȝp.6($*%GnSGWtx vȘ
    =f#Sqr`0(tY|X0 Y\~ɟ1-nbjΥovWj-_gAџm颅Ͷ#Zb~a}3/tF͆aSbkVUJ@jvۇ@'.Eڨ{۷Z]>XDA:;…oZs'OOˮ΢Fb6CY
    (¸eHL'TcjmdC:m_KoP`LI1SEyQ@Q
    |vu!R`7HR'._H&p(..[^0X}3J&
    !lZ*:2/ev!Q.6-QGKxU0%[!1[ı	
    AޔRҔPQȢ[ԯt_%kjZ
    O|6|lyVFв+͍ն]\o9
    n?&8N`>ѡKZ03"[	ٛۗrd	 ZmШu\fSK>FyNV_[PX<@ۭҔ[LK-DI
    7^VdPMƮo]Dv=	@ĉtC`LV-zt"]LFR(\}QVFأ͝]\F_7IK؄�T(2Ctbus}ͤfpܟK.nexUSd#.㧓QQc O[CMNmaJl+	i~19UIw[\CˇFd$BrHA22]+7Tn\МB24;eSRcy{-
    _>#_ AGtս~ɷ iMGrXZY8d)2`9ԆvPpu.7.˵,-։Hլ›/+{R7p#OrPڃKLPB31=: 61 .?eGowwUJ%D4Y`;4:8}fX{aۈEr	Vʵ:;Hcj2Ut$6N&X1h7}<s6a}4JH8!5C\io=t(z`22y-E$1SbIzOUȨ
    VD!@(t.%CZzkHӹ~$531atf	m#)T8!mƨ&?'hJ׀_xfD`WɘrP#~$Lt5
    kB
    iv\Z޼v	c| g7ݺƂBOu3=OcSΉ`D$jH2ҶRa'Uw G$S1Ø-{ qxKy2Oudxۭ[\fcsLe-?D72gVӧŸ1E
    <	i%*"J${N)>{UJTTnojaY9UpI4T4BJҮ+;vqA-/Q0z3YNrm`%) }13i5wPy](ڲ?|k$':s
    #Ժo\]Ы٬V?~7"ZYWX%Gv:Yhw-ް}S{@L򭦝0:mŒ
    E!+s4'S3zK&sgS'T4N;S`&9Jf:f1{Jh0~S[޸uO;kĂ|pv ?cDLwFXBfPETWk"h“`V.dWMÞz~:Ed5;0L,J50a?3ptȂCPDS�0XȐCm&ۅ}wgQl͐pxDŽoT< <gp%o{oo.vϓ?uLPո*<H9cc@ZE&)
    WzM/݋feClΐ	ph`s=_ǙNftLci91/dcc3 lQxpڐlI9*"*}Lֻ6HA^3o<mG5,i7+g2�6kKǵ@eKxt)Ī
    5V^b1*=	VzU
    Dj`h=HB	Q
    ~\hǸ2FvE/&" XS291i:NJd+_T_^‹@DN9 &R2#xn +p~*eA+Wi"ˤEK'h<RSf7qpo*.Y
    <<=?sgo
    fbL772=#%V*|K8.7GXKYIMO$^FyD籎R"dI4?`NJ"
    UX7lX<9+{2ciP?0Nh` ̩U0aT?~X<Ll,3G5Ϧ޽|0kϘ?pl!Cw_됨=ulkuc4~?ۙǺ]*P4S-!%{i3-*(ضب̘& {gLA?KNPa(іf˳ń1M6`_^vc),|gщ݄G&btHSNxԡV
    ð:
    og<s=yBm;mr;G~^eC4'`hDep0Y"h;l#9V@R2;MI%o)}p{͔z=%;yZp!#A,OL<2^Ƭ$#vf$Ԡ֍^{WU43&HU݀UVR(ۇ~:˒Rt)D,5i8fjBLnBA'f"ˬ׃jtFBV;I靠b&3	Җ}1˟z6bhɳIm/U_wymհkڃX;ًzMN	z18aRS
    S�Ql8A?.f,I(_~:Bn,k0g
    Vtp)Y&ox"LJ~KϷݚ4;F,&L1ohɁ5o8VtJIX.}43~<Y}|xܹ}z翠%S҇@Uul9A
    us	1;FޫBC/T 	;LZQ
    >oP
    FQHL4KDb~4iHLWS2a{	qDm3L|猭1q({plbvBDs,?YUA4ǖL$~#8`^|:y>8z&@)cm@2!5`2ƺ,ǭ+Ǯ޸X#uQ_ Itg5vJ";g-B/Tڙ̈́~əՓ>𱄵ZfZb*]ax}iWWj*
    -zdGA
    7˹;4e|pIAC?0S:S]O:g]FPe0}di~y>sl6z2cĈH+a2:$DZ�/4?%R],`S2P2&ɴϥy"sF_.^2" m'IPo3M	s҇u�~GGI
    QʕאA669RZd+1 j`s.miN~6ǽ`
    M'Ϭ>Cxt_	/-X_+_ztlEHo\|&Z[x̹ϲyp13e״vA˯8jF/GSc/M;t,slyfS0(6H+$w|FO_Wm.uՒi=0|t:1;[
    hbN@v}Ah$FCnIQe*1uT z/O+ۅ_;/2tx^Ŋ2؃_m٬,B
    )b_d%0ڭ
    ٤
    x(-]/=,IkTՐڲbI
    305=\sV0ҳReXp7o;oVi1MX՗+_K_|g_k$25텯Uo/[[^0cӾ)rMuzHL##n,EX(d3SBMS9C+i:ѴcMO1@R{NQ("]?'ޅJx}#jt+�/em!c4k5{,B{Bb^:-r]cBwjl#KƆ4D[;JR$:O5clŚ#sQJ#>̂4NZ>>H+'EJ/_zwoW_yn7/қVv{F0ktr(@Tzӌb8s\
    9}KS[6ҹ<ёLͳy?&=P9%APGGg1XdjLJMƾ[c>)
    NN6uC,4oa8=>ZHTDE(=jdϜ>M3&^.9-:RM8&F||&<ЙG75h*elӥF6"2'+[2@gZ
    RJ4|FդM>荚!4YY-0l{1TkBsM=D|J2٧a#Q|_d'_5¡r:c\j2عs[(/\v/3t\WB2b̊/&Ptb
    1% ;6GH2ӽRyWBpٴ$_huا^S6܋|t|.rn2]VcgcC~-|I( 7|11b>ןf5B4(tjp=(O{a<z0~8DfʥBg\mjZdܬkrͶ;{6]åFPu{ƀ+Ad
    4:}]⺐/W	Y<SXߎ⛤t{#O 
    O:}UhG[BDzӉ#|*ZW.eP}ӛJKN}$8wG`,}jMEFw45p?F*4&&JiZ5jP\rvPDfjƍ[,'2Ox
    om[ ;a|W2E'i՘;B[rmV/Tl +K
    2Ӭ
    ZM>10EkȎ;s7r77[_o=|}}aRXQrоZ4J]3qU
    oBy^B͵;@n#)v!$AX�(ڶcVOM%x(GcoE!"}&pIB"<r/MRmNFL@)@?
    a7{Sީ"QI-h%p_Nk8~wZ8g[R% F)(TXOD/̳>Zlf@_o~_?SZ|~'>Z{ҿ~~'3rl-mQ4oTሷN[Ǣ]v6(2涘\3}ߤf6a#r6{Y�mzr> B
    U	
    XH输lu4hnvӁ,$<90Hnf{sNs:\
    ԫH/T].O'?c5ٯs>'r7oZz_z'_Ee-7Bޔk2'p屯;45{P?LNjNؑzIӃ&/aGJR�!Ai=4EiMtp
    fCX\v䣍|LS(͍ZVϒ)$Q
    kcK]bN^O>:`"V6.|j
    xb̈lqK/}Cnhng:4{F;Pv=1 Cdn{TEk`"M+j+^+Ԭ.f$io~ʍ3ZzQZRh!l}۶hyignU,5Or.
    -cHfzò1K'>o9ݽJPlYK|:$ fV�%}wx"<S'~+D*{6F@aܙxrWw&UWx!;ߊ§"8NDhШ5EÕ`cH7ZIғ2J:cxsaq/i-
    (_o}ǞD$驕lݺi
    +z[W*{svV؉v'b`2e20>Gy9"KaѕW`ĨZFj&nS/h
    ZmV{Ӥlu``Q*aAKM}ⶓp{~Xv#4�,(Z_f,i=ƌ~%M%‰t<2
    Χ:C'4aǿw(FwovXPi(5ɟ)es$AW)w_jnIsm
    7.DڝG;gam	ZPuob6V9`;瓙s䔉c7sZvo_W#ይ\,O~ͽdDbs՗m^3%R,{11KɥB tz퀵[a(0=ּZͽ~]tFYw7ۗ._o|WnoTC]R:FQ{G+sc{mkfشdc0I=c.DMA0R6!b>{叅SgN=7b)k2 ߪ"a?qlU"M["[5<m&M{ی/_ �}VEHs4s'(n^ޢ	-Ieٵҩj͖
    рY+?9h	hѥɤWڎunZu4�DŨi(R-ow_ڷv>6Wnoԟ9KjNYޭΈ*. UOF5z%_@TP;25ǵx7{.ʭl+^gnKk	s8ࠫ#ﻷ]~&Ies0>zÞW6v7ork=(<qؽu[ٛQFhGb4~Txno\ciDS'fCtEEvt	w86 =a{tLGd)z@k$X<! sCT!+uhSW׿jfa�ɈYjьD0JX@-@,5ףR'ܚYxOHkcƕ?sy!xed<FOwlmw>;{Goa1S=K]g[U8Pbih}3Nj0tov7Zpݴŏ?ת/}�-7Kdb@IpqXc칏}Cy~A=~yk/6e;ʊy'lj{7~_';pwT3: [6fƲW_7~ᯒ fg.
    BN2a<-e3csWxо۸VxPk3AHXh%|�[
    �nnv5wCl*^mce4*Z.nC~CXHg+G镳O~W^?XuF=Ul7s{՝mTFɊ[$@lKh8c˫_o~FRd%]nN)[[7.֯:c.Wz!CG?+ҫW_~+N*zmP92Rp-D HYmdjvr7iw`͊,<vA5Um		L|1n&l޺]Z 
    /0s3Ujܦkb$jlb	A|Ȗ!ƷoGzT9ݶ0O%\thg,+BaYo,fOtf?tu=Uג5-Zᙚh,G/b/]X2�:*y,M""sivڡ?7~J?hځqFtp'믮|n曇7:땎,AA3ч7ʴ۵Ћk7kDQ֛O|3d
    ln~~W߸|n{ T2Hg)Ik]}5p,?d{)ձ s:rG@e$(T�509v
    AуX41_3&CK0ٍQz~2%8mBV!~}K7ƐaQEa
    y^}9hgD(`YO`ᩏK6ݿ	\6%cF
    "(_i?OfOCݣg!^st<G�gXos89럟
    exSA _(/Xvwg?w/U}I?c?ʫ7FU$yӏ9b3S9Яŭj&oʯ?ߚ2'?:}D~Sf+*ըdN>s~pi|-v OSOW-vwT"־_yO҉3OէN}3zAh?b=|g,>Btِm
    %!傆4잂]+߾qu	�".VM(\?PZvj<G?	Yty}w_.wVE&v:}H`ng'?]aNe
    rb6X�&K†k,n\_W__YwJ&jt*>t3FӳH2ỷKO>
    Kg{qXxX(XD
    Xaf~s:vS܇|x¥/>k>btj
    6j]5[m^X&[X25VkݿtjPNoU,>K/  9WߊV+kj<%LsBfk\1<H*`Z2/m>]1n=U-՛M"1U*
      JWFLA@D	w<eȜSC}Q߹˒=53rj"<TAne;זJ8Ȝtٱ?	젻鵊
    &Xfd|6zaĮ!ko[Na'_m^Yr7tr^2uS'_8y
    m94"HmYafܼ|LrM1a[/?%~J+?W;ՃJ',J4ytaʣ'ztnv`U2tIuY=/AC<3ךj>yFG$'hlFG(f/Iz;DpQJ~AF^tFq:dioK*$EBa7ARozJ_uxeƶC9W&rÙLV)oo>>qf#_ڮ?q蕎?6ѹz^|m9=7�MQ]wk~f+Wdۨm6oDl$n{`|"ܩS̏2{EShBHVq?;Nvn:ZZ5v	zK%AwͲd%,֕fPyfǧCyztTaS~Ͻ=ș~`;{"i?{08655QXE-bᕥЍ	ҰS,|Pbyl-"m2]`v2D)qOR=1aPu1YB5o5lewD~^JƵkdX*`ڦ:_f`SY+?w+;vI{,m
    ={Pra'khhܬ
    b.@O\YMƦND_�5[]6_yVy^n6$VoEnZo<dp
    7a<+Ϟx2
    Vq<,HB6Rwڽ
    wjF|dofm`N'(ͯ@mHr2Y)/)TTQ:<&Rp|>Etd-'(%x&դE*EEhdz*^xeܛ74D,ME^JKSp׮rjo1(Vj݂nRՊH1d[~/]{		sݭZ}c"<έo^QhT).6?ҧ?ӟ<}x3B5^xnl
    3Z7_7_4tV~wKkӟ
    oUZwlygsgKI@y! OƲh5ʃjrm{2\+}4)A&QINEOT>9)ʇRF"(B´-e*	+Ad8pdU.xev
    7/`nDہld7o<yؕ1Rgx8NiMC5iLдS_ukr,J98`ZTS,<|C=̹㙙(6SI{P)
    \y[lt\k_s
    QσJa7p3(]v`fqT؟dփZF$.<_Psoe;:yN
    ${!]
    )ﵾ7kәSm!`HC^@=OP0Z2Q)o-,o1WvQI-ŘfF~?  }Dto2m
    ;lm_3ɰn1z8(ʯbp@Dt{s֕?Z
    L$v1/+Ӟjc?ou�10:s^
    np<)WRE6�N@:;Om֙
    ]'SV?WW/.Fa!ųg?ɩ_ϵ.n^Gܩb7^{݅ɔ]@.l9\6^8IEQ}/zlNR*atx(qD(q%e$47F =y"N|X+YfM<*TœxH*P	q&Si4eVA,RhCR!tRg+h7~{L^lwk7wPYZ\?-na,^]۟ǧr=FZ~F\;cǎ|LO%evPb٩Y&FmByc`wg^orKK!kAB;Hh2
    [Eu־*g,!*z浝K}vdS\G3JLO98j&
    -vCpez\Dh0RBN$Ah4|0jǷm\zͫ1 y|I/tZCDUTU3ܸ0SV+'V.nۓk;fb^I^U
    3_fƻW.\?4wz&I&Cn-_=¥??3Oj{{uf0-{ss0?vd4vz&QXLLͳx%RIQŤ
    6`߶"SVñI?Ȥ} 1h~>8L&>|!5D|ބ2\$:l}Wo_9=sLl-ُ8ȴPpR'E-w Ɲw4O\w|~㋿+񼴺|a{Y08
    λAz,BAY>Cp{-3`ܾ~-9r>L;{rŋ.]&WgRY{ЌoN(N7_y ZL4td4cxm*j?35F$(ͬk!jB	u@ABl_xkWvvJ.t0q:O-;xNm%ZխYuڥOXesSOLYi"#}-\
    swC[z£Ba·7by+Q`/=rgґ'$)$RAԜ,2;dW^xzJ&Tn5nX>;Dvwpzlen~_TѓO> }T2KzM!ٵh).lz!H-N9Q'ۺ8R|V{;jREZBԳ<}$k[EVIxb:;mZ/_|i|04fO2,sq.9bV|cw렿{ڇU!hGw|uwGWN|`m$JNX[2qzaeIW.mlٲEs/]^g$3(|̓}'`s3o,"P,B
    >JZPAak|yx<>w7>?X
    M"aEPvWVfvŗ^fxꙐ{f8G9׈_G$ϋLb=;P g>mqCk{`_=C]Oz~X�=r{v>rj{71v#S+nQ�{V*[kϤSI\P<qLD"�ym)	
    (N23F+gO_c]J@5*yβ-;`cjݯr
    =ʵsOcn"񼔫<f-?9g/#Q-%tk~׍;ܓ")-gANXۃo2ھ+6iawu]	=C-7-guu:O/4BڇYXHxvyf~q7o3)^&NݛC,Hh6@F
    ݓFUaZJ#+<|^vP84Ǟ?sO鸙uDĈf	$o-"8>",Ms7гZqkr}1sʆ!PP*qٽř}Gk{(x;ߩ|
    S$f,V)@)9g[Y|d=ytee/e[_7v3AnTEa'AX
    T09=3&NQmfC1劅Bfe:67\>T8[Pm@yddzؼTZ2CD崐wF-vi:Kʫovǖӫh)6peJNCO7S;gr~YI~Kphn*4Ɩ-͵w6kggՏďŧh2-j7RSw0,Yv?j�$aՁӪ`]VQK./g<x0e"'`8Bi&:NJq<Pҟ"_vzZJN!?�c�@=T<*<sfBoqkkNljAڭݯܺ<}gW>vv̅ya@ bPP.]=ZC~M{*9),XHC]Zݎit?+7/w]hu_{Kg:5;i2x(n^'kޘL/-%BDd:iעNjxw;!A4lDoYh#6e
    嘍ԑf-b3Eh[Z9SBQPF>3Ek޽ƅ/ljgйn.ʆ YrhrqPEs{i^9Cyg6tFj@d' ˍoKk{7=AgÃٹ"xģOl)lnXB<*;"-m
    WEޑFR \փ�jj`m2.%ʅCQ|qфP!RE͐w*
    <hnkÃ/}[/g_xd@?la$ >hx5{Q\+oW׻[~̑2!~6
    DabVMB
    SP;`:3UV~Wg?CV|WSh1ċЬ	NE|頖k	
    SȦƞ�ےzu6bZMBDvLٽ,WKa\Bp*­2Ď ?½v[źy
    ko\fkOO[y*KcQ	OIʕjJM~UD'v
    x6]!2y	}g&DuLū) J
    ;-lgwG?l~s\kYeB,
    #O"k!3gIgRJp=a(%F+mJMrl;h
    Vw"4aY"ڀ.kRj\uo<wsG=#?<);K+׃FPEVQ;5(?_`TZ,!^~1t
    =7{/r雃POZ8✓^_csѥl.^3!4RAcҪe~_.
    c�Hd<b͒>nQrx_!}
    q:8\l4DkR~zpǬW/xK|+|O/[
    Nˍaˇ*~e!o_Is*K^~N5Qkh,TW;>omãXMI�4#s:tj.7*_^v]iU;�,V%#S_̠/~*b--vۂwf9+,(ţN	=	7f)ኄSl6;xM,MV}Fv\e7ϣ+3\15557<u'[Sv`\-hb}x#k2CŅ@)jH枯<Ǽ#khƦ晗ϱy7>ͷE#G.pQ"!jr]\ΥU;˅͝
    $D,uHӴ):	g36\M!S삔!fK}\7	tvx4ah,<О#XBd,6GBray(<fv6{><h,Ǟx'Ӂ%e|!-a@8N8M+CAl%Btm,KN6xȪ^t|%bm'^k?z)`x-lFNd7j$qhzzq~y-VQ*7ja`-茢苽";F$Y~_UCFڍ&Y;W D|a*Qb
    q$*4
    Pf+je
    ּ~mWϭf3|yd1D+f]YP*GDgh!\BW`I;`z/ET<4ae𯞼6	&x}m\%|ͷ<8	XSU7q-t*on~ۯt̆dQvvJOM;v^dډVnG:ZlFv	Eו.zYx.`QѴf~(,ndPf;V6߼Fݘ[J̲ı3gfë6pGszʇԬgwh%
    E
    >BetȦr#o7;>΀٩c+�'+{K2ЬA(QfrühctA]M+BXte|?Т#.lmcfjff=Z0[jem##4`l84ᐨK@Јdی\t\ccv5_9r^7/,GVyetla5s:
    vCXi`T2JSV4@=Gʔ<x彄h%acچ׀zsm2'*sej3CUT͸Ui}`dFcVv6<l;H=~̩3@k%#ݰRG@oGyDyO#t&	25A{ue"!27aF+v4Z]8::9Famz3D(Ô˳9,F6u+k(ߦnF^sˎ32wR
    �G6GFfÇһ̞ڤ>�"sBh7o!Riir7.ں-^za}}=
    %cH$ٝ<yܙ8jLفQ<u>b{Eȃe%H9h\YGip(#�78s1]3*2S{vutd/JቘUȾ|z*.�5ᴋw%3SvsZR=4"<6E'jއFj1;mld#[>	SC'_.׍2#-ՑP7FHCJv0n.™^zn^37O<8LӠL`JH$R0؎S>x8B3G4AD
    Vp/·عO=DR
    EoŃ~Yg(I3i{n2|@y2P8*֨A{V84⑵yyû弣E϶Oahy2]iÕ*~9,1="Tdj0_a_W/|ߪ5H83%f2lvsVF\*,woӬ@XtBVF3	A-ӫVFPނkt?yEP< Zۂȝd!9榀fqFqyHvpHpd=#TmbwZ؇0Q@6iM0y*bҸ29m/^f n]|_9
    Ff�igikZ{~雯j݌%SVMXCm-'J<'|8di(&'je$;C{ؙtb`a%lZ!;*m/ Ց~RNm,Fذ~Wұ'WgUPa<iOh{o(7CU	iS)(ѐPC4R:XD	<L;ɷfi}kʕ{M_ēa�^,f{K8i8KEX}>b6u/Vn
    l3ᢰ^^:1?Fl%WT<`f
    %&ፇpc(_ 6`	g+ㄉ_+�K)zU(87%䣬np\Y0m0:[}črĕm490nrCj&JG@{p厴"8l%rD@Ծ+rZ(&MN
    f@DXڬ#˦,d8V(hbx+Y;KFGx(HӀT<};TQɭ>C,Dg
    O|񭞵!룾g|i$]a%qdzM\'ߤgc6DCe!IkSry�Č1l){l.-
    DDj=�]NtAu4Ԋ:>12!ÌљU>��/(;DkXU^T-*1FGqpF둩+LLݮ>(>^D06g"=k[ۤFƧ26emkҷyFOQvx6Y,`&&U-18D5‘a`%V'[Ad?=<-l^77XD?Q$^[đ
    Ds*hL\CjꚜVs>6+KV qem_?uaUJTBekJë%FuyQ:i@w>&/45y?\d'GLq$9^^06IiIn2%ۂGDIYH{9H4v˜䮘E	K PLQ"5܂{C�Nna{ʟԢF5"Q_hJgLX349BFUKC8ϯ{=y
    yw|pKSim#+FO/o[]G.L.M"|qeYi)Tz`)w:B/—=(!2Iőz5ELP9yNxiSlE!@g*6j?	c'ܞ͍$&zwkSJQ0n7v"U;iGcʒDI[:Hp_@"wI
    CS)#x
    *V-"˟WLga액?L!:
    lT3StKٱj7E؛?Oj8U᭟UYz#‘	wmH:3ɽø/!nQo@TE:J%'?'yHs{Ik08y۟wR
    e86jbmXhMQo?BA{;RM9sUr9[ XHE)zFgv&=a
    SRZԫXN(5BʮClxdN6)RU)bou;L|h6q+!M>w÷y׸UPE+Fٛ<D@O(q*ցn+`m,NXj[JDS8ӆW
    WLEe2LU\p.r
    :,∀Uh
    ]Ѱgl{*_4d=ڥؒ竔:<Ucʷytu4$UyX,}dmLc\FpDy]S%e[yZ-	anIpqؤb#{OVc_޼ $y<{./Տ%C<{FtΦVXyg9DZKoG}ɘX8m"DU-/Mޕ4�Yo۳I/<j1U</_Gwd{h¾=qgGҋ1=7MqJJqh:?5n_fl<˜ N><$(I޹=6m܏ͽRD,L,kɍ6cbck;_^L2y_1Bd6<
    ;exz	;udbRG(y&>|`7|c9p'm{z·M^jiУxFU0(K`<qjφ5*cjhmC&<Q�H=v?}ңbϰ?OpQB6JSɡ
    ]=zM;򶱃EUE:$x12a#=q#kQGTxN=b#H[#_l:Ҕxy(IKsy
    ݞdXTY&y9( amܑKxa;2 Fp38R
    O%Ƈl)6w/�щmepc`alvq̝}^&cLٴN|M䣛lxQ}<S=U=hXeCbؼ+gCR6ivSRLCI3a֪C;2##@P{.ebo=9Wy;
    a?Z8<#3W<2T^Vv%59V gL<:Vc˓Z:U:-FpS=z~n4m4t٤yvԝ#x_=7Crx\hG.г3ew<z	tct‘{"ǀT$FmՍzwէ^tn!Y1FQxhRwɏ{B�am"qL0S9Cӛ@|+;BC2ByQ7y%wߚxz;==]]{sԓ'mޙ3MܻeT3NǚI"mh	V/4a,&>~7B&zw:3q<>=/Ϧ����IENDB`�n��LMJm /!PNG
    
    ���
    IHDR��������@\���sRGB����	pHYs����+��EIDATx^$u.\\ü̼bf8'vs؉)f[f-iayzVR{%+?jW3={ú˼z<&eq.0\eòK"^'ȽO{pu,"2P/^;2wu&[+*S]*P7/+o~GhH[ckn>Øfc)/Mm°Ԣt)!o`I<~?zuӋL..29w)rˏx/.e~1q4wdYDMC~[yY'=`?],-;9x0{y_V66n5bT(N,:P}ZUIJ3zi<G2<VWP
    pr)왶F֤8[>|C{f=x+*ӝJP̗Ν>P~"Nmiʽz^weex^͈Z% lWUlnIHk{H40y<yܬ[;}$8NQ;;v!˻GJT%rNeeh\c+;oH9#"Z5W7Ip3<2<x/
    G0;*:nΎ,=Ȏ1#@q(`[_L?G2<s91\븪v5DW,k
    NE3<g2<gI6MWn&(2F.y*Ȃ;@	*9A|\
    _|!=fȟv]sCgO7$_dRrd*[&4wrHTixxY0
    gv/1p?>p78{ =Bh=mx~#A?2xLO7IjE\q@�#"`ɣ{hzAH?ոI΋uyY	,#@$.ûm.EŽc2oLΡ	?/xn֋|/݁'"I2bgsc̑#nqs6y <*-%g|cFJ4y!no7{BɋMH16;/:LZN:gq˚K}FBCtTlc~Lq,/''?Gg;@t1;Ȏ!v	>n[.@ ۮ;h*>
    rJ_7:cȴkQvMDYk3,V
    Vw7u_:vm&' N/b2Eh׋|ÑX2I:-1#QA!=CQ6mIy/�4z[_?3k3r?W"6g!KĿ!$pq?HVkp|p4dFqDbmG9Wa|,cq&ʷ<X>vY=OQ!"OVdqG9<rx~KρH3>=y@^D1StiE$'",$*D~RMuv9L'`uթnQh8pLkL
    Bcl,HzU(,bmIe-pt+`xGw,Ԝ15jխيXNilgh1Uvb%ïZxDiB	5<n<"䧞XxZQ\= a&cEƐXeOd7U
    ܴ[fS!.h8p
    9U=dpFͭnMpy͵ᨎs29gN`%1n
    2gLNdnmޜ*imXQj{qQ٩A+NV,Ǫ͜9keëhnt-.<+h	Bz0?&CPq,HUZ<O!@kTuDoLXZ_4Ys\=_8:vh6׎jkn9v[;jƙ*XN[`%gB.$ƶlDds}+xZ7M`JH"vfi0N)E~Nug!`v(\le!f|>!cQ.vܐ
    ?WHI/{ޝ݋'15Ϥu
    hBA]�e`#몫j-nIgV*˜&Aqk61$Bѐ@/YmJk*'W9;SKLJqMWpDFiLm~!)u'j7N?R-)Ҷ܆]]6%Ϫ3uS
    Bs~r&cp;~9y�|Q;/s|./¥8E2hiEtљ&B2ͳtN7*l!
    $5Ra
    9{qL;6I.Ʊ}GwfL̕eFjWR}rg2.&cBwI)bk
    ),lMKG.iTp\p7j)ڒ+5m~ΧRyPG*j9-6J%h4j)7J|p^B\T	$	n2swٳyqWtNdŪ[?猱987suVEihe+HMbmFh&ՓJảFX(2ژg\"ԜZ)-jE#^DWJNlxǔ)*EE&WȬVa4kis婹,(f	XZc"	",GBL	%zI(3mK-|5Ӟ>2:|(oGR9C&XuE0-螧_"d̄uhvb3Uh0
    2c~ҪFQqN2F�acD蕣SGۢa%(gٕROLdr|*\vZikLyv_:T{HWr՚Vw(f[>_ S/+mժP"Uݺ$&NdPKEzO~>uX8TXN-F)/)BR!$;V´5:9}4~Z(5ea,DBƚ^3N>m!,nQ0ҧܨ](-LXn&ZA,$$^޵PS['Sc&42mC
    $s%nHR'?%!sMgT3}VP=cϺSO={w.y􏬈}CG-ĺc[L6ZS93=WZb`4F7 D|X[\[]6jӕ)P#$rb9h9PdkAaGw\`g+L8ԩice|?:	e5RBgLL
    u9C͂c!9z2#)z"VmߛBpU8T0ȓNjΞCqIelZcpw=lw{9mܸP=*W>
    E5i
    vq:S4vM?q1˙|+2gM-THw4L2'39$);,*Ԍ;O]=˝>]?)5=2\cɶNK$fkqu3Oie<}{z8==ZvH{@VDPA.:wƜ=4;AzbzKydMfW9n֮!GHx/WՊ#g
    NaBE)SjWZ@öv	ũʘA>e64STc\.Q0P|֮<+&$/ 
    8H`gpYPیoEc.G}10K1S<W\NK$/Z:jiUN#Iţ)0bbb_A5zg	R+Or:)h78e"d%iӒwyC0H0D?p'h)kUDS,4#q,nO׫>q˿Z�*q܋ڢy_GadG4uU0L8ΕWgNLAĩऌY3}j<s62;u5۴$KqޑO}}wQ+pӚ?L-@95x9h)B8ЃKf(~U#u%08H+sm/%?r^VXBԂ>J E3foSYuMr'׎6n[۱Q;ţ
    Pb@PaP<"5(./0<#ˬ'& cvZd+YCxX%=2*E:[/ 	htq)@NDB@Rz>YNX}vL\36Λ/8(M_(#phHӤ"D6B%;
    u?`AXԸB|e˛p
    =:?pޕ|_ʳ,*k滯.+ߛ>ߔ>.]^{&F.AuqQx}uOwFU,nx%~%]%cy/#>gύUY\ 2&Fi|f(;ml/i-ؽ<G#0ҨL'jfuYh
    =
    DOxd[l̹L3oLrsb?F>S(ٰ`TuKwQjnfEn!.flU-[g6@c/k_	1z\7+ 9QBPHS5S,/ay!1嶡rBȑNa&¤#Z^ۚoN3شi3ZS>8	katmGnǧ_;PIK]ԲvfXW)]O=U'
    `GOhPQFKv?\ƿ:U;UbjгEX~v/Yj("�gд_B\S\/NJ@v
    I'
    # YPBU{?}7O>ke]q<DMg237gNf\!Sӫl!
    s!`l63;Uy5:Q4kbrڢf!.*9YT9VlGX2VlfcMSJ[.Ud0:qtmGz;rBJǬjݨ ;bQizT4˙@,+4"M:%AJI"b %H*nZ\-m@.\|4gGi"^*j,>9*UN
    דzza礇+g#9b}7N0ӼauoafSE(La
    k|ifa91Ɨ}hyo
    " xu7
    ^ؼdYq�Έs`pH>WSs̭޷u|6_>(,#TПI~hi/Qq4$!NǻyKw{=1Ò*JI xbT\9TMVYs�-0i"mڢ>_#y{]"n"2l̮dN_Lsy3?٘l9.Z{m!%T&̍kԛf#Sj9뚎+j%FB�W1ڢH|$$?pa}0vl1GM/:s;w3T|jwIrΟçҋ{ފ4�zQ
    a근'G$D^ں[f-:J}_7OtDT$!r<p]kaYRkن?Eۅ `=}]I"aRH=D+�ߦ$LdR@�O;!h:K9)2`;"C܊AD|L	zu==0C,MjMxMKA[u(^FM$r煺 m<'kXɅլZl͈?V
    ^rja1ZR=Zk\,E�:btAF	9:7dUC-yゖGi'tSY6a4Ŭ6ֵJ)\Ej0,'~EI/ODI4!!p>Y}AQD)I�GÀr(̹f^3%g!Lff/5b4
    s1:[ȏv-az1"qH"Y $za{fy@5G\m4|xQ8U_Ч7do]^eOb8S{p"<,_cxBB|aΎobVyA.2l_�3N chi,
    42k{=iz䤦ϜKD1<cHavdz'n;Hqa(̛̾
    d4n9dj˜Xi21ެ-f-SxEVmjWd)("\OKFa^%P2"m0(;@/0O&
    UR@Qd$819Ix3$d(QEQIRb
    1,_D}	DrRYsxcߨyꈾd#9k2Ѩ35m4: {l^%5-. $2SY-9gbS�rl.d`F"Otp:7p!G1,|U׾;0
    uK&"/j}i@BB!ztQPJ%)ecmPĹm_J'-9hi~f{jړ_J7jtdgI/rp"nyQ{_?|wok/|G<5ߣc-d=AJ;^;V6ᬅc+}`d>,B`(4JVnv(64jY6k&Aj9N"(Sz	`TOt*
    b$kA$jQ}Sx
    sj@JP[P8;dVU^>&
    #/ֶzr0 b\/pk%>٧@[D1,�zj15ۜB:>[=[ϟ:S<=\;>N#8u4Pc%2LN{ي[q.3Ms427̙â 5
    3FWdѶ#O:J="v}-i+7D*�ءzW
    H,!=Ծ*q_`P<{JXUw6]t-`qL:u}߷JQgmo7
    b:C"r>ǫ?{S)J!ybtqkH4	ش劾D
    l5׼Sla_Lw\u_(t9)Q4-1d_ըIMjOtLF=,sIg+	.SR`jA|8@D5CDUJf
    G]I5#a}:9B:JJt c1.cn�#>w4YQ%_`9j͹t/Ջ\6;[gfն-
     _7nzrfNUsе7:ђk}yK-^w'8Q*ysզKmŞX@)a/4ʒ[L-RLǐrJ!|O&S$m;>*
    'fFZuL򊉵{m%3:M3Vu$7O/xWG;=!JѺ|4pY㦯/5_Dm⍿aiCFYO3{P;GWr뻯r<po}r4H jEĀ8vRO2.|[F/$Q))ZlIx
    }P֑$D(@|BdK8;cr>0Ia?9#Dl+TJ0$ևG�eQL>z9WϘjSSJ\,ͦ1CJFڴA%4N1h:fZ.kN|:XrVY+OzEHDlTޞ$5״)ὁv"M>r
    y�xZwf$Y
    i#^`޷< .Isisژs}N{j|BjSfHe_#|MEoÎe>4X}+ޤZֲv8rvD5s0пZմ(IL7FWeKp?ul񯮹}ZRO=O{a<|ނiK/)r"Vkl7N5FRb{<L
    ]ml[E\I+gڅH]}Ņkbv:k5.{$Jr]x>bp\jYar8>|% ^LB
    La:E �
    M$1h(!nE,:7g4Z\M=,~F@ԂzV7y=oe>dWp$+5L
    hL_KY&BDqˀ#iA$Wy!w֧ ]8>eu-ڞh{Vs=_kçNEQӋ5!)-޼#_Zc);;]	_xeӴMHh3[g?y[u%.;L3Ge'J?}>tsU}@(h:.)Tkڒ>8N<WC^O{M~_k
    (kvl	LJqCoY4L.'pbeKz|+!D8Ltrmׯ[wp\ɻ|~&sQt< (X8b!":+Ċ@	鞑{ȢAHllV2=!^
    Cnpy(UKxX|)!4{CD4<Xk	;fO5
    Ts+�'o[cDL(<WLЪxRM >_,tɕ
    "4G%5[ǛwY=hIGHDHDz1US)(o}#Zc-<3]v_w<9|^Ht&+mA2'♡Y'C;J!z`N荿++4E9V# &$3;HaP' w>(#$`8?JEgBj.NrjNa]|w{-ݰALKN'L3U
    R lh~G1UM1b.&OMŰѠq
    xDبLP_HXpd-lҴ <
    Loʑ"gƗhI?�Zn*~z
    ޫ=1<В/6ȳCHA/ B%J&S?kJ3U!'&*[":	9D*eԊ(Z)VHme}WHa=D,bJ![DC%._m[+%WU\!ၔo4&J/$w}r}7|!W"ʗ4y=p0�rC~,3{cwhO}Icw𢂆aa $k/1Efw"il)5eӤf&O?`=O<sOw|4#'�yn6
    l̹v?<3p@e!{"7^ILSMy4Ie벵`dg+)be+ͪilv
    ֜&Ƙ*Ě:b6P(|/(6p$G"$#[CHcxo754Zw @`bY'/k_4mZSHn'L3%/)M^[42E:S+)Vqo�C^iA	!vzF@Ӳ:Deo niiCZw]]	71/^M2Xa/haPS"ڔ#:W_E&3_@Şd�bFNT?`P>[34d	tնpO*E+]ysޛCt
    .uU{<'ɋe\ca>im"JGnZLp?X˘DvFMBr ATM)Q_?vmrK5Ĭ5ac7aINF@6N�lKo84U'dJx4A@a# Fь0b
    	8La>,8#LIlZlvqKɛ0j-/|3uokW7_Ug֋_$, 
    Ax#=PO[ő	{?-<-ܸb!QGh(Mϖ(B/sx_Pm-۾Zl[ɇECC/EKQVjH@O%՞,"
    \Aon!Ў?í;ȸr1tdX[ߥ\W+ES =uj&3"j@>{-0յCT+Ʈ;E
    ewחz1^I
    "fa70,`NHpPY+M
    嬅E
    TޤDlm-H4V6#R;sxCi(RbIKm2?n$ctȷ9l#h$NTDP@?kc`*esë~ JekWJ
    ;Uvw8-֬nز:az(6ef9DƷw<C7:<gf8v/|G<)'Ϙs}Zu0"%S'01]
    0a!E &֌e!dt�oT$>Q;sfj8bZ	Ql`tD;LH}8I	]?;xV*5ˮĹ)>[>sL[O6㧻j;+CߗdvCZ8	bQ?>
    N
    '2vu�z	3҈gyqc.kGSx�>m%Mj܍X4pObB]Sa aVD'(Vjp~Y-Q}JG
    mim$ZCa<6&ִ0%ty�I
    hӒ7h�>".[E]'J[J}?tFDݑdS\;F:ߘH哓 2+М|W|TahLO
    0F$Ad~ʉGMqQi@@ۊ:>&3HJw#
    Ҷ`A^ZSͣnD/2(e
    �{+B9MNԶ B-zHMS/ƴř=H9ndՇ.^n_4J7%I:a̭FhaDE�=:䙸i=,6MAW@Hkcte�S717ý4\$gͨ/jiRPVԍ*)xH4gYng3)x�-!bW`Y d{xHш>@։�jtÏA2a�LF%<d*H” &ϐ1h/|&B\,%l;2xB(]~qYr%NTDQ XMgF	hZ/\~M5	w&"jQSd/V
    m]O]O<IP~fB j#K?S]UWc+?ڪQU;={SA$$ E{\C-)Qby"uZo fz0@fKNlp:^FݘYT=l{)
    ȣY@o"&FA1ܟ
    4g1B@J$
    т�pXp/9Ӕ.N{wؚ=ܗ?](V@N./ aV4.#�
    #\cU4tU-;TIy! )A"QʔP쵛NGL$X2@(P-1$&:qdR�D2�
    -Ad:3WlK7$TK<zbԹGO)Q_X+N:LWYbT衼K+W|𜞁(F/?22`wrW㶡p݀sgxzr #5D#?7O=|y]*` Zp;||bX7wK-,
    Mw@ֻV@S9LX:8P(ۑUkq`!ZrBqxĕx 0ߍCmBjx#N{Vh @i^P"y|GwCY&6SO
    D
    8	
    U
    xwGEW*؆6)rFqEll2Zs)F<E^!JO-,	
    4о, fK,D`n
    ։LԛD$RHBܑgOl#Ϧ12-L뤜IOQ=_KA؍h
    (boZuHVLމBL~pE/;g�<=msb)9fn`"șGGg'>'". @1pq>׶R*I?05{ˇ'eP#؞V8KHFs9psw|Z/re}	U=pג(/J`ErTh(hny$\#	~>%<ݻsA~
    
    $A"<JDގDzK%_A9nn.fm15`5̀ak.6L0G}b�sLO45bk`犍"N9OXt6[seL+'88abi~@Ye'_BtiRAm鋎LQK;!^¸$36}l`tTHAP74Wvd@"P~9v$98G)gΌQ&ʞO;NW_+އE"gHwq	5mՁW~R-3p44<o~\=Ro�;168+D$@2Z!};axdlJ]qj>GIFC-ьǢ
    aM=:=|]Ia%m<^P_F7?nzl%J;_=|o5<iݘCԉBI-m{FM	R_GFJ4bpb/Ƨՙ&[:n
    =4h-[|_F_T:-8<Ѭ4
    >
    =!:@B
    :GgJ2(bH*`V`uZ!YCЁ&O4j76I|fcB�bU[F_i]SKBрDŽNzZI#!A
    :32p0 W+_8mmQClP>"j/x\Q{xvk>‰N\}qd2]#5F�muD_;7Ox	7g}\v#fa"fIJ]H)XM鴖D^dt^bwq&NakT8(1V`v?LNa1I͕Sw<v&8igO8QڀOB)|
    ?jV{T:mx$j}<+ێ
    |Ek9+Z 66	rE?-³}bۻRJn՚QoXHT\'?�4-Y2h;!P0D猰
    x$bѬ̍.͸x,@5Pv	h҆@4P0/փhz.&HKPKZ5W/)4I2:!%$"h;q&T,q=H_5Ļ$juHU=]Ulfܸ`\v-Nk;;j&őA7U ߈4G33\M&koOЄ
    :H35G_ªWX A)ɕY&;/p24Zfh1%q;lՐ5ɮZm['nO˥OZ9$7+~{I2C;(^'^oZه>>	ueu':r&G@@ZNx>#v :"moIĝ#Bq49C|`v"qzŧ?¹2+z{n;yqWMX`NcF)J1]8
    M'<?Cd:
    7;=T6ʞa֗D~0stYxiZw9U11Md0	X'pX@xr"�bh�qPL%)6z5qOZ}Vk܈ʄY<8Li|>l?RI\5Gjx�qrN^]U!_B[qT$WcnXj,Z<9Cabvbܽm-B"!H}MYIwS*kq̍0S`3aSz#=fy:zŗt:QZ{BICѣA%Vg9S^vvn|Kb+\jZr'vF=	$$A8awv9q0)XVqX͉ƕ̲K}l `yZE99kAn|x9Y|fA:uT{rJ젲/DV҅<+w0N�5E3HP(܁1Fy*:(C%QFI1)<p@aU\d
    VgQԝrՕ醸6J_6z䴾l	K~5@ړ]æw	aJGD RBK"!5SՋj=#I ܑQ/fw8T
    Zb)BHK#g`n@*]4YCuD2(@:J"BR=RzVD3pĊ D:@b+zVW2Ip1NL0zS/RoJBv:l@΋I+:i�=-@H|4^AO(0CBlL`52 U#b?H&"޵yi[Kwnb0~PoBl JV$-�ȶߐx_F7򗳟*5+/#3_~|6(|l[‘ʉ"kq!#uO{EkяMԎZ>yp͜=2k2"7K,N8e̎|[[l>$wW1?bePgU}73͑%%2 X&J9]HiCﭛӺ?�tL0Sٹ<Px(ޕ8/y
    ~]2%Ή~M~6HBS3G=+I*ȒqH^RoàU
    u"~h/٧N1BNAٞ)vHϨ,FY̟D>koS@si0r9ETWI8_0X8	$H/(%xҚwcJWnzgz.%-`M949ܨ>ɩB~B=+HUT�0H-zh<wQ_uM[vk~7;@uv넜kVёh2slɬE_7LcZۀ>RFXC(&x$,[~U+02[CDe#"dU)2
    iE'ABhlAYE=yOrI
    hc�WlVU0fK}F?B۲�W9zCKT&e؉S㤵bSo
     Y= E+dk{'mr;ADCmI#G;d̴\m&"ez>4"ކ!rVC)y
    ZWޔ	u^'%~S
    :Lpip}Hi~@6HLlRo}zjHsjF8Lč2vg7/h~FFf24k04tØ5&Ks)Sг¼5R`|9-aeID7F;�pB0	υRp@CUU8I[Jv@\-LꄼNz
    `d+
    I݀B[gk4IIehaꁕ
    1T\gtm(L~vF)?&YZꝱ'(C}A6=5AM׮d*@馺I<O,*Rzs-szo#E/Q$qsaA
    0a]<l&8hcT)R!ͶV<K
    9.b=@Ϟ3pN(5ܥG>@9/^"w{N>qwT <"$a1Dž@lgc\=cqNS=V8`5p]F(mv_0dCgZ]@.cgkFSŝ1�@ze֜POdVTZZ-h\3/ԦWw,*'Z]xg7j4ۉrGAܷd
    B͙u	R
    G�H]?^-1T³]Щݤ>gj<A;[>1[jS&RKo$-MS5qXb$<%NWK'<
    :bDx1N}#چC
    M4X'*Jaܒ1i!j:mj{KO$Qb94w!zD~)?\BzTATII/'9EKM$*l,ػSYlIo)?is\Tu`G`L.VFͬ7�gB*"9:W#g'LTc0"¡љSg?8~jqx8:U@4jݗ~trn}tnRa@Sձ$h*T-Ic	)g̝T"CѰIH"�n
    CyKIRK>Mµ>N<r
    
    Ds@eВcZ!Io
    .3I,H]%'*DAECx-ˢ6nKp)h&Hu`?֨ YN(>ĻpB-/'&>ꥼAwC[HFr@ۨ{4#B&yWJt\ 9SS#R;ݴ* 6hw;@q A1Cv`o`yƞ?\؏s”tm[""4L
    y&=QYW3JPLZ)m,3Ŵo2JRAG,Vڨh$3թc'#	,(-NjU܃ZQW'Xюv^Ӫ1O2F.a!v`ETz@v|2x["A_ݎ6	x8ׁ#u޳'7(zc_ԁQĐhH%|]zLuA{=N3ZBK=d{K+<总LO41-␥_n0
    "B-Vzjšp%nijPM$ݳTYs9ʅpnR`T<%ŧk�c&Ao Kx87Ҧ}ѠCB2ȫL}
    L[CUH%GK'3˺JVT-:7=;)/RMr^e+\%xlݤ(6j^5j~EH%{1/ 7Mn!+f9$B	|T1Xm+ڼ({3PJx!|)c2GiBu?xLzH8
    Pk镚u:ևqLUlM۞z/('[Ǡ=nD=sz6L;r>|9|'#'|뮧vșggr&^0yIXS_?E/k~잺ט/v1Sz%^5eIlҙ˓DV}K悝Bjliղ(i[S! <#@uֲHa
    aT!oY~^=eëp'-rAl`<ҲK#i8s|Bwʫ/~AvϨ-R|BtsrxH8Dzے煹:~pv(@Yx%'7WZt*2ٕb/O4Lf0܈S0/
    H^[neЖTGW{(l.7%tJXd[VmqV&FTV
    4
    z:Bcvò+s[ =
    xq#<:sGP]'UTSkvndp^m_
    YC7˶քܖu
    yBq`)Կ]&Hā*ˤ4D?.ΡCE$ֿvm	s5ʚ+lgb\<K]JϼphRG#4J0Ɯ/J߀CDu-oRX18UXՂJeK'W,_6\QP]τDtP:6pl?6=fdќ{Ad@Rl/s@mR!V)nϙ#+O `%HP ++$[/
    `[VD^UG,bDD"TI�.}xC\Ѩvv;֧6mq\oj'#[6Ml
    +ql%މynp�ݴq`ֽJpuFҬf-!C}'#!j1YAUjUƾ5†v>	w.ո[1Q%!%M Cw(ߌ*:庿_7k[v!bj
    QY'!Y$PbIR9|~ǵ>.
    \}WC_
    + ,D)sM˥")qҋYZxZWdƐx:;+>y×uYB~:iA>8r]l<hdM_P=08KPT_E7>|W؎}F2B20Ox'vdmK؁`T<?Z
    
    !@Z2
    YfȲbiT}c[F[|Ù>`
    Z:"[wtQk6oi	[56Uh&�33MҐbg==c3*pڢI+0<k#[:^H99;Ъz'ڱ&4,c7WJDRb|}xN[щ#wnVgpE9_.2?6>)v`XxV	iժ.^0Bǜ;}%=2
    mCLiF뷼Y?]RAHkҗnwiT%w	'.>Yc2\Ŏ]~ucW;{hS_,N1]>_WG+?yGAoCǾ*?@?+:/i<B}q}fv
    NEN%Cv-}oY=Cl@�{X3?c=Ifpԙ;W>`լ8O.gT5*Sv ŷ(-zѶ`FM*wL,�VOy|	jFf
    ڷtᦶ㫶'.>pb9;|>CeAl`us5,%4Zrtf"qΗkJ#7WkupUf}3ܟײfq6%0PVUBa7'-$m׷:
    rw0>^~cZmv&IW(Uun%#ڻmc7Jڝ,Yz3^$oDLlDط+0xMvtGUOݫ<`a=CvOm;] .&R`n]/6~'{pĎ[{]cI/sGGoEV~($]4#`wv'>9ʼy~άjI/nۆ`֑I',@Niva#ZeUniwÿLe^{XMsZYo3fO>-og`;7YavJSv=/&ݵמ>`};	X+'`\U|\hJ1l=x|Fp>`4Tʵ,g
    ;/wa0g|wްcI>1ךZ^\9OtLJf㶣JEpĥU�F5q�Ǘe(*W+"5}}fls3J3*GeVE3{$ ?Sd hMx*#'GIlNwG_쏏.@ xfk#@V]csrkFe$<#gxe8#ROc֭$F׹p)w
    En߱O]?]lN۪໾'sn w^?^8/to%	6\:S
    *ldsscf?̉|SYw#"S]]+ -`ԋgAcwDf`ϫo^|-tgBo-M/
    n89Y6w}>7;N{9vöLqxi
    ls{V;|?)[ovmUASOwoz7cɲY[BNJơG~ςw8mJrCk`.M=n2yXþpT׭xc$U(͋mo6st̂{x}jBcnJ("GP-=Z8
    u#n 4]Ǭ&
    (ŕ
    FU'By'
    1X̟ݲՑ1ym:3	K[,鼅m2HCCahZldd.Ք3={80j2jR}`_߹ Ao4Qq޼Wuq mfEfn֝8uݔ/%Kqqhu6@9v0QSa%#Y}5lp׼.GHNJvODTpЅ7kg;S^8f՟.D=᥍ޯO _+糱,iηv~pq?$4'm!&]ʲ;X*ef#Ɓ7>(m~+f4@lE{ߧCo�9を;W9g1fO/M甀[`c/T֓_7JjwqTU)<̣)uw}>T m%&%,pS]bǧ	݉nj*:/Rb㺡;*}=x(ǒbA!Z0#/:
    UC̽Jd	FR( 1tDq\{|ӕhEx"ʵ*D!t6F\IvE56ŊCVL}9<-ړ<3en73xΆZH| B:hY2돆n[NҡVT
    {!n+,.5&2H]H?sN#~&ϔ?*|x1بṰIg9VmW^SZtm~,7k V#Q:!IvD⣨Iʬ(x[Yx;|%eOny?R(a酎x<NӾy)NI0AduƩcI775JŠwҝ=d/v0);?Z5g[ʚOcT7JqR7{y.̩!m�ҡm ,g33Q&rХAxopV rߚR5@Tژ/ϝ*bC|Gs&?m4՞^m{0CnjbC*2kP&Ym~CGn0&1p_1-dUچ䖑Xbaaj~̙G|PMYҴtTRr;66	\Jrk{<b\&Ql
    D=/839wAu6uKR$v+Yr|
    MJ,B|yנ@A}>׹Bel۬a&[q;%EFb
    -Ck?H(k~ՑK7)tG	aiЕBs,b:N_M[.T.c,.0m+8E
    GrFC5JA^D8QJ֟@e#'Ʋ8hUb=ʫ>y`Ү׳#xlqJLۖ}F4~©h:qFaM\|0+lC>^ԂOf9
    mVz.�ٚ]Z+lQjW7Cݏ<xS2xi@)P^ӶH;HuEWCEh-U{"b&<(aܻ>(R"5AF"WQυTv6ȡ)B욟z䠧Ah,,p
    L0_<Dt.=>ܰgW֭By8dtȎ@1VuZ;=n-؋c&"XM`=xir8gsR8>9@d4_3ku7x@.3l۪tkgg	⣰y\0	JV�9gҏFl\N;n\	qExZMsG)䒱I.j^\꺀
    _@ n~fQaYZ]Zs<ۥ< KD)N
    MHMR|	`qixq.K?/_Һ`);QW@d5
    ^sCn#P'3yGP\2ajibj>IW;]eq[qne̅mzz1XU7D7_`zS#SCPdn|];mړ{tAܽ},sѱx",fb8}W4W
    9QTNCj2@@؆5nR&}y|eY
    vaU }}W\֗
    )�6J%iwucOP8<T-!^~2c<hj6"
    ްtThi+6HD3)zqVUi:g\?<yMg315R'rV:p;8_!&90eW6ϴ	ek	k1<Ҹڮoz
    k7w'}&Ɠ_l4R.͌>bChYM."jin|7o(;q{n?1;7	$?BTh>i<j7s*?ptQtުӱAIxxǻaO͎a		>yߧ?c|NPܘ?% c#VHFyzqmV8)` ~YVȗ}n;^oS5&Dlw̜8];6}YVʾݣ-wF$_8T`Fr泳IZһT:]F3Y
    R0M/+-ӐP B!$#HE@5}I`kR0(&G@PZտ"$F'J+Xleԁ2;TFvÿ4PR(Vh[y`ՅusLUNV|#=tV&db0+&amL**2Fvb5٩[<ND)m.tWJ$
    =[n 2'(kF@Y| Noy]_TV!9DmWfemqqEaOݫu]V.pL["�o܇H,tAsIOwGoeu[A"/ #
    r$Yg<qq._NyѥK>"<)Mj{|Rt%;ك\o{5w8a5n|52M`E?y1K\~Uq.x #{<zqjݹCʖ63#'BM܍ם2,.4lX38	I@!}2zd}mz`*\۱
     FcX">Q_eJjQ	jZ0͞H_-[' <$)9ÍA(<FF)ɲT] XFft4pC+m㧎
    
    "[\W*U,uWv#t_}ȥ݃G;gt{SU,6_kX�hإYu$!%lQ	vBN,VSoWHriΟd^nFt 0�Z9L^	03JmжKgɮ)ⓚ%Ԃ8VJ`<$'94yW1GA4Ыbj.̝AE̜KAm%$ώ&�%䁝xA5#v#H!,+1ٸo1 	KEdRR"̊Ծ҆K,f)AńQq&f͚?йCL9m%>1�B&
    +F㻘ݛ-+Z~Db[+j!^JkW~\Xt%+ܑŅ9>S6T<r/43S%cu}7y=~"w,Ldk@wT<3w&\5BEegwgd QBa4@͕}4Z,-_Nӳne|3&O&c7\حHw,͎Ώ
    i
    PUObWWgOjrU+/k.cWmpfM`å6Oc{y)H2Lb<(\QJRKN;cq`ʧ=Ch�9SJLGȒ̗yhdot!AxNg	.ѷVWLj/fJAlH<o5ނjӱ(S"%	!=ml[	xFSªk+"WG,A_(oy;!>n17j{L~_F95w|2x<*zMbg
    WO_0R<~*p[b=5MWyTcɦjGZlF}Cφ:�KW
    ;/F"_TWvS} Mi͘⟪E!F	Efc]fb@EA\.l|({`+uKisÉ@e;:q%_Aws~e^Cˏ?@U
    ~)pvŻf7_^gnWyX[/�,;~L>+5Vł])2:X<8#Ө`ƀnĨtCsIThFG$2KDbI߸xQ&y/Rp&^JpzFu2i>o$
    !ci~N2i$"=&Θ9 Dmo萫7(D
    HM4z	zvy%'!/Cͦ;yypmxlyuכL;宱pP]9{խ,1IR6X[4)e_C�6aS/|e&7Jq	fm0XSL7\\W"U6{zQubФΥr9hqkz{8][b!tT¼ofwt]pfO~Z�<w}Ӈ_mkܟDu+_Vս[O	m}{W=^;ӟ_ln/~sv/]f] O];.w:k-�.]3l=&'L�`I`Ɏ9FMszg݉?h�qM(=	Ld3֭[^\2Yz7JdwSOL8PM9/0Ӏ)iRvUDR<(U	[tJQ33bt#Fˉ~9|zXk;W!c;I'`u-OxG"zQߍG%?Nr�R<;,"LK+F_vFq4{h<0rWW7r,Ct%h5ODSk!ӵ!G^sD*
    f%ƍ%Fg�
    :	WnEۺsÏfV)L+OݞI41us0ppeOyEꆰvzv+:ا*v,7εrctop֝8d<^Kf骉>I	#9eo-!aj눳I,vJ;w=W[gtwӘzj!H""-_Shs!Iilw)wp^_l:qRO	y3^Aq|6,ΚSby2Œ͙!vf1DzGR.S)9,`ta(m:R*;o~ǩN΍@̭hv\qA_߹-;G5~Mҟdl\I
    B
    r}+&FaT~m)%InC_`1|x
    zUEGZ[\vo 9FȊw^Јt#k_y~3Vn%k֊۲ܓGGcW7dsVF*\վ<e{x7Z6]:$50?N#?
    =
    g1~GJ=C+!3K(M$hނdzqBgF6L*{fӸՖ{Ё;/4uVʙSsz_zG2Q,1cb> lV'6EϻuؕK:}C+uxujmy'n3ۘl^}͡NlkPېF\~X.'‰v 5ԕgrF{רTK]ճS;I?{Ƈ2j1
    `O֯41;JtOE^8mB3Γc)y-Lv6նx0,Jl!t7њM}KeAM}X=6wZͣU_'ՠoűy\=xxNamW,;8X7H)}{Dd)l—g%*kd,'!!dN|C)',ߋ+SՂ<&I[{hܤc-8"o=t	
    O5f
    3}|Q%kuHژ8H}ߓ/8®(Pl
    U'ǃE	+һ JveVEdMo?;{wE"[18W꺪r*
    n聙X{O\Jw`{pva#Ky"ԇ�iOzp'}>-Ĝ;.cт@~)Y7>}j{nMloj[\۰ѷ}ptD=m/med$uc
    [Ggw+㛱[ȶ%K\&[ܶ:AaSޱکl3QoE-q�eFkTjU`m7"	*t,K.LjjV
    =?F<2�캦�]m̊3s\	R"E4&A?A^6?3I/mH_@KS2iJańr'oLr$鼳0kN=1$|k^Դ=_.e5~S_66_u46]9ؿW5{?xWp7}}fu^xr=SF4;}3?uܼqkEr%uUCiWc>h-W&:=2$xhuda"iHBEٶx
    9maE+A֬VH@08-v�aF" H{
    LbW,YmL\cq9sCdko(/^ͅ
     J<}pGا3]G+O"[_!zހ4+3Ιu	Ɛ[Ŕ:yR8<噢S=՟}J<xe,7,@ICa/mV߬e"OQ	ٓ=%=4cŶfnK	_yl!~ϛUƉāOѕgZ.C\Ȕ2xɧiuJ3v|h~Mn.7۾ud>qyI6Xة+1b3 r;my̩ӟǧ06;=W-V5+~dX.)J?$e:X.T�gI0bIrV‚c,Xh	=zmP
    6;Hm^pN=`^:RzV)yK(qT &p-H"�ʦD%FCGk'mZ[zdy72%~.>~Z;2kŤy^
    A!4"3q7(,fٲ[=b?Š	Z^%k>Kv{yeMS
    k6P|OM<]On_2$vmYoe"rp+D}pN�:`qD9:/vek5R)ƭbfOqCԽEAE=p}(_YwIjh8??oƂ'āYn?BŽAM6	;𡲙 ޲PaL_d00NH}jNpz$2zHhD
    =BOEzTA訰(	GFHJpf3CD]m" Q	cτ
    #(FJ*N|ɕɵq!Z.bpʐXTQ˯	mWLO[4=Ork7G/Q'GK:Vq<Yhuv*
    و:<n)mlIK32~j{xR6cBd8}/ضp~Xvkk=EvcL5#-o_|鑓KFloy"ocVk}4tOTJHʌտN>z"Rkc}IkT;bmzMY_uul{_WRv;Z4V湾m*_n[.G~(NbY'}tw3{PM_XfJ1X[ĒYW+@Zijhm^UUWTJUV##Qv&WzKM2CF	khiM>t1H lx>|C+}nԸR)�8b`;PmAei!WU7/H
    DBB=?8#1)KRWmW䱃ic5<i"]-3O0`wWtMCmx➙7)V6t(=�x)M7O#x"^?Np)ڧm-knxoK=#$	
    CrOu_�dͅuюL䳀ZyVvzXtcS"+8up<]Vd=jFgHK%^]u`=s$i+͵?f9#Gܙ.qeFT9Mr|[@||p.:8t[a`ubpЭᵴ#咫/ݩYLPpbIsC4;>喵-ZidL0NJt.
    La :Lu0LvŰWTtȡ#FY3t?d'%wPt<VBq͔
    F=wǻ:{ȑuR=خFV	a;;%l:=
    5tF
    0	XV
    'ML=Re7Z?]n8]lِŸѩwͯ|թ%ʩÏD5z;>7wt)=ux9x_+yBiI )Ė<XäE`VU>lny䔁)wQԲ9:ɎqNj;|n@XXCwOf߲+u]0/?݁j-IHO}})qyǛ}kk$3-n䝎/`na扇ӷ+o|X@o]Ɍ]['bOQN?9̑@q'L't_erJqsk_Gn
    .t:俀|q;M<\vK2չ̴0=c-}mnV4*afDtU`-;n)tjA)8
    "A<H,	%1�bGTd:.+HD҆aQp�d92eE]j:qA?~|S[xnj=;DW
    W"A@S-(d2T}N/8kS(|M/t}_$dzF6]n0{V/ƪ(fdO)*[})75|O 8ob8Y w�4s>/n`Cto8b0Wa)5zP{/o5Bc&IBΝ61֑ٗ??Ŷ}Sw}`SYb>96]o2C?r]\n9SO{]u.J-qRl	]$oo-CkgNú'Bm=BI.]]6( glEX(P>0ٷfG6-ZV<f§IjZG��yA4&%/='D
    @	Ƈ
    DY*(1pP&y!73$0\vkWa>d1KL\FT芀b=pIҟhEwFj҈5<Ȃ:n<9\=M4Jo+.pqKWp>kjS%SqO^/9ee6g~om7K?#	\e7al7oz6>R?8/x{@qgk5H
    4RNu߷՟n1xf6r/>e78x3Ǧw6g%/B&SNm7fUf7}ڇ'X'dwGN_Ҹ#ZCIh]c0�ZU]HP_⊵#'ĸ?<pE@R*恦|Bf(EHH
    ~+⑹Rx
    "J$<yF
    :z˵bXoh0�A-pǠIRiD"�JD!P96jZekydɊb!?_R֨rD
    ٗ,i~RS1|QD0c\-ki*}AF6x"rs]rtqfw{??Z]xeE_^UM>WCWoߛxAe-e6s4AF_ʀمcw'^Ld)_ЅUꮯ`Ůu\rũ0-UBǾtyHM*+]3ٙ�G~]2k4'	v\0jjHtV3ВM]\�?msQBԿIĶs{칅
    ťui{-;N'pAK>BZv
    Q^Eq:MO9]9yz(H#Ps|UkwF|х`
    +6D~9U`MFA,HTtLt:/aN-H2VF0$~y4Á1	F{ÃB]zqqwgz
    21`=~ހoEnMD6(¢賂6.F$7B9srQ0l'q=cѽ՞P%5Ly:y~ژs~wLxx#N,ⶇXT&6:SG-Vb'l}+Ͱǭ#&Peҟ+E`\z3v {6؂v15%3($B
    kl_\{#Aaak]' MViM7 ߥjDNIBNUl |էnn\5>eS_|Gn.yg!y~;QKqʎk~Ka W?V_U	$1e[O6DG4RНZ},!c/XTkr,	t5
    G�rl	&6Ɨ-VfP }HR
    V�t.V,kY�㛈HL5Ԅ
    
    /ʍon3#SC.n.51�b)H
    WvJ0>}ˬmc:;B=\)ҕ&:sRPҾ
    ]6?Y=Drs5†(Wh$6bgaPv9ujWG>py�e'2()_z~2.^.+
    7TEV#~Cx-y^/0mm[2HIѮ>}BS?+]~?C.>؁qmw1KX
    k&zcY+b|)gDј;j<8;7Pdډ_{׾sF>qv�k=$Jɗia/߷fhoK>5k 	D;C<r2}pT!Ucljp,7[_dy}Ԃe`ͣYILUoVsVwϞ&Y^Wzs<ݴϔXV6V`VFY)i�|Z@W*4C/O#'& 5t
    ]LobC;TؔOs3`Σrdsεm#"B"|4o|
    vsLtc
    [IA%zѲ_3%`h@Y͚s|{@EcZ
    pCU[_[c	oSO3gQOh[K)T0_eFdo|!0g6N:D{|ouᅴXq?aV_05~ه@wcwfKfFI}Nnӵ!bPcO#?[bm0*5S-߹i?�D/jf}wnivzGcwbčt8Ckf_%טfM\|v=<x	k=d>{!O|2̯$$-a/c+E7;oO;YM;fg�O4~*yÙG:5?4]˱
    d		3:h<i8"5߃m#Aa\h̤Γv}Xj`n䱉p1=y[[EG(,~妜YPVښ[b;CVy>h`nTXReY(-3.%SBrySI^2T
    820i}2ce1@HR;p-+kۄ.?𱸛9�h:gaIE4r@.m֓%dU̓lr"lG1aچ@fG1i#Hy|ykQb+.dCO7`EF*蝫zs@І?c$0xнq7Jt5~`+0|JF.xFyGJ[+v%r2z 0;_7K~>^330Lȁ_'90޵x	l+m_|E|5Н}U{<f[NԔǏA߶×<Z$
    lksTuq%c~(7ObDžҘKRΰ8mP
    !\Fɇ
    n(zG-Hm|!
    '~WGAC}ވ[	#�".WSFՙȇf2܁TvB"9f@KV2oK+U"ζzf*=)5HY<}=
    -}XH%G'`:&eog1Kh&Ns|y:@_)jMZD¤DVUzp|D<Yg.I+AL"*x"]%%�>3 K&@5)ȝB#Veg}|*s
    v浑_侽wzY`p U@Ӎ'rG&c*j
    %YGBWv.V'+#࿫;D0`
    C;[BYƓ-HXL10(>.$o N
    ˆ@zA&R#Z,60b;ccꀍ'AJEU &aXZ'J#5Qۻ/BʹMQڙ:2
    oi>
    6-\]v׆w"\PN%0Ʈ1(0ٜ;2 [p(hslxiBsA)0
    S#1t煩ù#<,	<upAm~zFtYtSsGvIMҤ--.	,f.99V?60/ʁ(6@ x-95GMzYoX
    Wu%6V6&L}XP6hvf&; �ޞ|7pqh$m;[CgPn	:-ԦgV"OV_su-d#PKVܒ8`!VloBx#:]_;O5.[Ro
    l1,Dۊ@D[Vq>s dI
    FI�@PM@+`P�T^m5�`|YЀ
    :	B*SZ8ϙ|@4Kz0gs*Ҹ7D9'@F%bd$ٜ'A/n^	QXRoYlg5Ykj`Y@}z锝Pu4;`;Q;wer&V1ݖ"Ɓ#4OqEh&RWP^uQ屔Tw9;}\7}A-gh>'KU0;Pw.XHCyПXӻp˒ϗ4)sBDͅdlq8Wɪ bCDFXPD9D|ZXAMTH5zrwJQrj m[W7ĸP>m@	baMELN&r>.2ӧ絅־cп*ŵg[!#X00"Zetc#42+V1og@D•^zH7ʀS00HI:.t5 T$aq_[ 2Bfi-$kR0:sy*@(c"F5F9[-VD<k͈R%oz4{$ifuyc~JD*׉φ`9	!x״S5܆؈\2ϩvN%{+#B쨂>&\([V\D5:-l
    ԫǮr;LHjɲ_0$ۄye'ˏ<tD#;d*cYkL"M:ОAR0�HpOnUHmJcfS
    Cⶈ輁[6%/"r"f+ҏ
    +2x~\NB'c3I=z9fLHPq!	Jp"؊�zqMXuk&1-c\_	aM&vi`ygΙy\rdۉV=	<k<
    S?DMZ "J<$ϣDK	ӆ+
    lL)9N]ZzE&'Ti_Ue90kqq)!:
    gs=L-.4bEcA^_shU|I!.o]&]; gߟ^.tPZxKHs@>|?&sS㥳f|XUXNLci \BV3qE �\2:he৽>T32;]!.ټ?Mpјygn<:xvH\qxiF	R %dGJ\h1p.M40'/B{<@'(DKV~ќ3OC
    	
    g
    	o&=>^V,JM)mpSNhq^(RPCxzi:sw9<-sy7[j>
    @it%8dv.!D#\<*D>"KZ7:.x ՘XhE}Ÿ\g/]4PpSbWF7~M1�rF+N/ o/_¾G96dmy0]'vQ[lΝM*/B3
    u}[Nˑ7+|9ە0@b冶-(AO^S>5gb7TGc{	&4
    ćٓaBxbvg5VCQGD@q.r2(("2c[P"DڰɪSnM(bh4ƺQaeWvXetGz=2HSw	-gs.jן2l-tpOߗj>t/DK<zTYR'_h_'#HK/s[Jk~Kqh`Gk8DLWͭMgzK@SQU{FnG*0$R:F+Fhl7UF54LDA8Tk1Y̻tnK1ʭ],yfz7`f2K	"Y
    . pjJts|Xy+~6Ps{&zEuuePw8:G-\Z*jmUۚ$L4j%$QY,``:$6%}	4
    .e1	{zKz>L#$U-u!&2!g}Bic
    GF7:eYt\r]]|Ŭ;a%$d@Q'x3uPn
    P-&.FLۗL("\ۆsyп^~V.o-_ыa5ɳ'%ߤeXBᒩD3g}#ӽ9(^@o[m/
    GKy*$kI(EW!	m)/;?pw@PIjQ
    䧴EFBUipw1ְǘLBoqOۤ !|6h!J,9>H*hѹ:<ZCPM%7̯<}{~Qᣳ
    Oܼle~V dDTA^S^0Ȇq_׉ï`2;O-hR0YqD|шND
    ZtcAOK8KבBP,PD]<gJ\qb:xBPX:~_({d=ccR9x}sv?&&PxWU苭#G)m'WB|4aFr>�}9UX$k€4
    Mtn5(\wIPr%dy
    ?2PbHc|_훯	\׾K?DND+D;{ƤJMϏh=Z!ulOF*b˫ZESsKZFEEճ{?ﻭXm:21BO3uZxD8B:
    2M-r-ZM_�E=TmOU-Rr9cVjHOLiy0*ۯ07WCyW=Z;A&Vt]^<D]5ͦmiMA]<`8d^c0'
    ߶J]=W;[=
    7s؎X4ЗxpYnՅu]$`Ҳ[Yg!
    !^2dmbrCrB1b[)IRJO)7U+k!H|.2e̴1Cn_@>h%YQ|Aوi\7LVױ\̮T�ba<rW4�RĐaUo?yP<g	nл~N6@l'hv@(L!ʵ2nTZ8
    جz3u-lk=(	%1ίStOKn27=橇ٽYq#V"7pʍs(l۹.H(*ncJl\ri)Nq$S<_Nv$[r%V,-./w``T#ǾwqmI.f˯$\
    P˰1ͦ޻˺FWKJD_~nx|?cV'*s>SthIs؊ЅU}
    `Xa{am4;qaC	'*s' `@/^,^>L֝:Xa>
    ~oY&NLU[;(Mai;cLb}i8{԰׉͕#?W8UǿIqcȜBP	l"7AJjfL \2N&3nI&P,w
    @;>$-)-S9Ys@K4䇭&j\JnoG7=#=Bfù͌m2=�N^ufU)Ga�Ķ�Vd`(
    "
    
    
    s­3v\D"S*ajLەRJr�uh_U8hpa䑋jt9*r-H[k$vK+Fr�_@H#<c&!b;x4	#L2ty'+TALn?O])Z},0XaϯvGO!A0
    (wSS5[WIXbf^Qs/*G.=kc)#?tf<NrӇTS(c\SPTj_y�RiQ,EK~Jj懿CϝL
    ]MR=l=@RG\Cnk\˶~GlMO2	IG
    f/;x̗tçq)w?ul'~A	-̝{W?&?3>`
    K=V4}+{և{7kdؒ/®ua,H)qz,> Oh!,dӱսz-}19sRW*Zs<i_5'vnҘb1_{'[JY6
    'vK֦—1uhuuG|K
    ,p4iC.y(kjf6
    bG5!.NG' ss͝6l+d؇U	X()J)ɴJX.7rfpѢDH:Y;VIbqA*zP'~KOZ?nGQK_(^2E]_fO?´b;nrP/?
    r5~P~
    �\y	KpoX
    Lf_',PuHMUN~�-{GQ%X\GMWs/+6u(ׄ}&blI	\4l~,ȯm٬]f-Ъoe	dӊكƦ _~ZhƤc_hoCN쉙~~Z?cN۪yc)l(䱯oXa)=_لb
    P+6Jʰe}HMBhEp
    >w?w%>Q3h4ҭm`tXz2W66ϧg|t]0Q洒E+[Ha}z:5oq!y1?|RbGRcT?ZYk΍!	�(\*n?93(-&x묓X:;;z
    _,N_AFW%3*K4Hn73]|w7ǷԲlwhhbꄺFc߲شq{]uW=ꆡJс:lbPքh֬K *_]	:ENCV븅]f<%~Z8k1xEGYG%?öyu͝դ$n͍<~;%n篒hZ֋}IRl&fv]lNtᡯsb3,[ySKD^b伭(1U/[ȇCZ2+BĖ9[[Um
    a_RN^gY{v4cJmyRe(kQa!ƠG{A]3Vt),{(E(S?(t`z0қ,7ǟ%UKucθLW4Cgu}砓mn1wuWl|X"67j>we 6@(Tj	W
    &-S~VdS;?xt*tk/.έ{a)
    A9iߧ[ J"]OZѵ{-0 :|!NJlnr*6Q&kɌfZMIEE҅FKW6
    C	&7*QTS!$&V\_0V�S 腧XjKꍝ@k\JQ4Ob/~m:n-xAd)ΛMw\?rTL3Gɲv_%*mc{A.=s9ۛɎ>ÛܠL8ؼ*٭7ތ-..SaX|�xco=6r#KG}RdVˆ,}	$L-+:5�!dVo7cOTw9x�Atߞj2;fSdL	t-4|0&$_Xޜٜ|شJ=
    YEstxl\I޳ճҤ5iǍqn-lw(&ЫX*^nѬ^ΎQ}oibՉ
    {곲&M͞ʋW*$8s
    C A?nL66eR&]0.-KɕL=u}yssDBչpr2索\jL�dB!9I,]Ki$Pb H:yJvۜfJj2b|%o*ȇHȑH|@dT2"|2 i[F]Gz>4һN.~¤@/q)D:A4Z,{y`r}0r
    /�^&TTw>U͟μ7,VYK
    d`954ثK,2A�dфgC\덤APM%�؜~zE`v^b9@\8'zi#=&o3K	ɦbwPcPŻ)*
    G#i~u?xA)#>kPlpv۴xu}B<0;$E&؊F<Rcm8P‡EʃY<!ջZ΀T*3epܴ'!l.~NG8ww86OħLْ߭S6uCZ.B+b['Wuv˶
    sEaz.qOԉkc|j$u6�.Ig,K11~$) X
    -T�,2Khtɪ>,?8.�X3(FTs4,	G7sM -X1�Ev<s[vQ@
    ^:}` e
    ^{~
    %aoICA>x!궀4™<OSD]&spb6D+Q?
    5B:QD뢬g!2q6+g'*Q/3LXDTi耼?82+FNƱC23~DYOĶOak+t ghixL͛oC~lvy	
    tpU*DZayn!zϸY5Ϙv~J	MR&7?kW0uow?÷ZrrbFGJ!ƱFmjdgS'sCAWVCϮ=FIi7
    ӧWJbQUň=etvr~.#"k=|mw#}al"n3
    ޚ_9@e=Zȋz9vߍ6hc*~yTU`CADZNa	- L=FmE
    U\qYRi&ʬXaY1fx1O`!U.m%!xkhV6h<1%j$1sI$Zx<Z:="A9197~K
    q?H*kqc�*07|0{<"ڡ	#XA0rg
    <5ʱPD}ұ}e(ч !0t>\2�]xcҫ_c-Ś^m0f؋5Jί-f-e-03*
    CZA;̹O7QIi$l lr]g`,xW}g~6[T8?\dP8cpxa	O*v]ۭ63I3L
    Vd"É@Ϻ
    +@\\x6=gfE_Q58`޻2?q5,!CR w{!:)+t<(ɩ&ܚ;9=3~h<{'sF
    UiRңZa^)bIٕe{Z;|J(d�UP823p'l~9ASTX+@%eB5/Dqqih"Fo3O*\~S%tr]jؼ~?/,0BE
    jE3VCKʎG=yN<92-@/d$JxpS]0+BVP&^rYd	6LUĉ|;[ҫA)A2#s(alzS槫ਆ>/
    eLmR O`|/ݶ?UM?VnbUy1l5YתQa'h$3R{B<Z!@Y\;fUkqxc�)")yڒpҠX,z۟uZwLӁT0u
    &hYCWa6>h|;EǎY}_SbԚv39|<Kf�BvvvBO`5p#aJ5
    χ=}}Lz6ЋA5űKbiCiw0+,wV'X.
    )"CЂ죝"68G,כ2q̴	
    VVc҅h8֒a!ps%_J.FA]J֊>
    
    D*%5YuHm4tC_<
    Vo/M\	
    ا(AAKil#$[}_1?H>Ciw_~%GTp=ɓ/ywMn9a(MK/c@T\]:yɗ}a vf\ +l$ɄՙXG7{`˟x%?8I}1{+Ě7گ^ίtϠȏ>gIWP3Ǥ%VoVwpF)Fڞm]=jj!yiakvm{u玙<5X'_)s)[͈(NvCUkKrxo#|O}!zz&:2zZ`qASsKy$5Mռٚ7 h ~˶eyTxuێ4?|iy_ӢS҅ʅ;-!�
    T 2]r&q
    `IsGE +"GA%mwpDh@^/
    �||$&A1NEAk�
    c8
    4FO؁0wjLȪ',O�saLQanH+Iz^W,Aon߅Vʌ6XVTBa_ytZ&?yF]:g+"dԴr7{ߩ	']tDlL'sA\cǿCo//&^8-2"-!pICե?Y;r7Pe8:	IĕW8@DX\:рiwu3ĵDu޼۹N֯[^b>P^/DSH:"v;Nƌ=}[E7GqY%p:zd dك�!:(6	�X^t=T%Pɉ)7(dl>ky
    *-N3䏼\eE-T (J#jD[�uS.w?ZO`ہH|y.9hkq!Hy
    A_97(F;.
    Ba\Ndf@7cWiPqZ=&'-J2X bAYEF!�g
    _µ1�B	oPG� /*.+S~SU?|ȯtbO/V�cY"qӊ1(;ͿotL	S&[aㅥ׿%2"~0o˟֍6>[7XOYcOK5¢	.rҀ|n4~:/p@<O A@YI-v-2<ĐFE\ڊV2+g猲RY2aed%Fܝ�n`и@b%	y=0>)&bb4yaZyjwvM(@�CbD)eRH;J:tqdж+Ϊ}^ ՠVkgF#$)[j0&\S`@O$(S%x\U:}UL~`݀{2S4CSL5CQ%A
    ŢX_5[YHFd8m^,yee(z$t,M'p+}
    f%k6Y(iC{LG5�ԭ1QwΜ�l.fSi^7C(4oOJbSgYv3}5q%؅ӗ"Te|o$tm,kd4A>,
    $x:[ɯOQ9yb.?d]4	@+*0skԅoд@
    
    :BSsD79kM4K"^pc`|e%B#Y-pѐ;ˍ3^@_ZdEK)BR6jPnT#S*iѼ�+]iqw՝fŜu.ƎG!3
    V)(Бdk�pW9oJM	9jc8csbi-V᪯uBkx/C
    dBJ(@U	Rs+P2;jPс~wZ ݂T+F"8iiLНֿu}\\2cL7i-tlc}'gD/1zDoPtf&ٜIvT+uBӒR0SEe˺~]39=Jq֔Sk4(2oB(eH.Il<T[l>*AHGRSl[lU|M~mI[Q&<$6ro⠭X
    9}Six+LNcec'4
    +Sς*Tju�飝p8v~̘	0q^<%`�2çk-
    u|;~5㩓m!xhS|BKl{*l1b`R$ة@57ė[PLb"gTijscGlF|ˑUyObGfhZ*P
    &-%rk[
    (iA0mp�82<Qy(@ kMҪ(@)	\
    w:tP\뛯~9_\FHrM&oEZ:y08RA@23W2#\2nmjqTF.k4yf(tzG[jpVנ>O%Q(,nVO\2ӑIt7\�jX[q'#ݹϨXmAF>XݠLh\5wLBR!g\=!@`f#R_^Lcs5LpRR6O@:-RtBeYkeXdkM!!B(,lu
    DF'ug7Gp ߆Q!D$xXS]^2wX=8@ys|%iX-=u|#:}J<.5#v7A~h@q-<	dWAKI:FLaHy\Z2Vm߶^U	XW<6U ̮fs}7;^*�@ѣAfE_8?B{"x˱jkFMuQ#3>suV6{|,-Hq+VwK_<[ݽ"^d6]t#JҼTHmZScJ|,>ftEi^SgK3	Tȁ	Z4,JA0ЧMiYr0X&$察:MrQܥå�Ō1
    skL!J#"g5|bIWhт%b)gP-Չ˱scP}ksnn\|ZK\
    
    -m&W.2em9z]mw*P^sPt>X}HTZduCLfVz<BB;ZԂ�0ǯmh qxaq[	QR5|eui]z;iv2|	(vwGD:0nrt້xt鼖Fh2qVs*	9,c9^k@GaQ2I.!1":×;$lH{{dY#\bB"ĸ"1,g0})3́SptFf2mM1ZM}zYBgM[<#ҧT.]F;
    8w(`~	;WWVՕPX/Ek
    <JHqSq%2!t?!cQ/4\}Ɗl:OW9h m1{!xwT&O%	-0B<˅xPC2
    }Ėڛl`Wh6ʮlu2SchSRqmMϘ̎L%FՀaLLeYLJ[9k�a h'@p`Љm^I̶J`5XNJRd5M`xPnˮwgKN(e-QdMXD#]YM-G٪f
    >sw	1=o]M[F1 ̔:6\墲]0pqm7uKel4R2qoP"JP̮meNkik`GB
    ))_!Ժ _</wRl@Rf4]voo \Xẅ)lZ-"[ƹlL<7aK^W1볨N'Ce,R[O
    ^"|zf+c! lWbCL!qmMfQ9zs~^@hڔCQޕ*k/pDt֯s@Jr-XL-]==`t-7o7z7ZpiZ(CR87Л;0)qixF	d8Aפii~:40٣X#d5n_D/zE^0%׉)tᥱ~Z-0TjX>KUn&'W-;(IM3sb*TH
    aZ9Z[�iC3P@qCOgp68$~rVIL)"`Cj-H
    }k~2XX	병v
    D!.�@-d&q&opcWj&Q`lQ3Їz{Euv$:]n4tڸt.žrDdE
    VYXo64Anub+lY>2T]PD{CVA=`3bԚF[LI ;
    /Hi	AJ=&_TSN4EBQ.<4
    Pev
    H`.C"_W"dAy)+7c5JRX.qFYg
    %6�oY*	--Q$}2$<Ra-
     0$ԜYwYv'S3pnWeH~8EKj|3e_+ڹnrcVr
    ӉX0F%mVFT4}OQiӸ{`.~dE7$Հ^7-nګ
    !ő$8Bueń9<`V@\BJk3DL`0V\ޫq9(7jڍz0u^WJAKDe2Dhe5_Cl(lx
    "2*px}MX@.WgScka{ѳ4A/^_j0lj7leT<ymi(
    [[!
    kןA>cȀ~>yH0ZI Pgœ!ōo	,N�w�	)juwa:qV\*x	o#dȨ5;[A�BH*L[0H\
    藎|cKG6"J`|>%/zk:N^WOkptq+iCC	@/!3H/rQ-)9vg&=\pث;jmBX9
    yݞ;NQMN^3z>yjIh:WBL`8KUt;j( 1 J4M<iS�ᭂ@fhtB/`)aPnP;'{8 }+`iF4-[;x$>|S>@]*}C6;Oxn1{tpL1idLf4)cH蚭iT̩|j54+STH$][T
    pz[Lz!9
    np͚5'ǏG_4CmήZ
    XwwPݎ~(9:"dZ�<}pR@4?C@h1O81GIWCBXgI a	0msj`l5`TB	*O"E: nmwERJ:	?QZz7o|ai'2�PbD5�*ˈ
    JM30b ͪX`=X5,G_)QX	H?ܼ[+V0XxF5F (M&
    M0УpHnPX:sf@~
    p)2b/hz|uSjZ5"q6B=PHڂT<LiC!LLj-A[Ӈkw
    s$x=~A-K:.�@#VH_BM4
    q
    )U̦
    	Y>
    ~dZ/F=4h
    |)hu!II{ cǡHS}�hP�䉂묎'B:]և 7rw9'UmǛF5`	@([v$[b@(TefAxOx~lMPAgu=~1݉/@GV#H%vK$@	YRL(hdB9)I2
    `)5]֛GbN0*8 zu"z�o`LJ	^P@'y 
    a!O<k>~hAafnR#231qɄ_N10
    tH_z\F0(]$]LxS.{O|O3B _ 陃nIQրk4 樰YSX[k
    )b-[`0̫+kS.H'r`/e$#-ѱa7<VFdx0@<Np-p: 0	hd4ʶχ3XzL>)OCωPQ+wAzἾ&m	_V-KE{)t54	T.+9E8CX3*Ώjq0j* g"PoB#3CLBe@u5v<!!0"�τ܆#�iBm�/:~'G�O$K
    >F_$I˔EVAKq8^u^V9:|@ )}ِ(3I@CRDb"x7/,9BVIc36y.Uu.[?ӮRK!1"(P>ޱxۥssZ?˾)0kɊ_zA6cF�xz<\[~.7켜|y
    -_WX(opKf^<L\n
    ~,o?o9.DHd
    V:QG:Ѵ<fA^dN]?A z.51C]׾/]?~a7VVO6_L�|#$
    ǀmݳ֏Aww'j0=<
    K7Eεa0_vQ3����IENDB``!9��wlֲ;|����������K�����/�@f����xڽXklT{,C\l$nBD
    "*X2^6^`b
    @)	)(?h)!FjJK|s3@|y̙9s]F9o&A>;-5sf[LEMMTUQ^8I,:82l	Q]5sXB<WF	b1V(q]2iH֓'"x/u,#?;fo
    ͢:R?QշQ'ۉL}x>J{è+,:r>iI=>-
    v'-3-u:Llŋ?}UG['nJ4ʹ]&6i?7R"~C`t$'9Wj<EmnEwOuqgg'+E{Þ;h{w…
    iA}zJu�gP>`3P\='fQϩ#
    u0FIL+fSZ
    GYC92#qJ_OYvRkgbCŽ}&{ȔZOo*||zQ/y2Avu岻#1+#UF}Ug}2rstU&*TSUM;g4D-p쪷6=gXq60/I2Syz5zǝ(;N8R'KY?\}I|BkkKPsLڳ\sFΕ\Z˳b919-rcҏߖ}XE?o\촬ڭ6\{^|\ >ò[</aWn XcL'˸P_YFσ
    
    5?=٩guȵßB9z='=H_cRDb7E13@ڕtuuʇ�>tÃ07(wƛX{K-#on8PD1D5>%䚝(MG
    [_%nǷm!×+q=]�aG_2_|Dzk~/�yЗ|O:ey::Yߘ!QA_rdop|8gϿf%&?<]^aeJ>~%	ܠ䣀cJ~CJ^ܬQऒK)XJ>x_ܡ7*yf%E'oS);|*J>E~xG/>SON7yPaEJTWߧ*yQ	W&ǁW*y#ps?�F^K7("MJ^ܩ|*|#򚀿¾2@:+޷*tt~xs]PC^n((cGw>U7gso{`wfseF*ͭ퓪52-G167Jks1V/{妈7(jiK[״;O{}5ɻy3l{k-Cg=Q>ak{6~k|;^mcvh'#m~HmOӲ9:ӬlXˋP]0Æb]OPnؠ'ܹc+XΧPbɠһ͆ܪ{5Oz>=TS긣đ^n^#xJzT=tF{-6v Ue;as59F}uTom:"Y<w
    [}%h?;UMޅ[eX,nrFw0?akq49l+׉[6Qpp4:Z%sgUVVn%m.AiYFĊ_	wmn)bpQ[H	n>=)DDqKh"=ݱ8fmp[ps6ҧuП[K[MK%==D'5Nn1qdZz-c]]nǺrxv,^~i$?"w���������������������C���(��������������
    ����������������	����
    �������v�������������&���l�o�g�b�a�c�k�-�u�s�e�r�@�q�o�s�.�c�h��4���m�a�i�l�t�o�:�l�o�g�b�a�c�k�-�u�s�e�r�@�q�o�s�.�c�h��t�������������,���h�t�t�p�:�/�/�l�o�g�b�a�c�k�.�q�o�s�.�c�h�/��,���h�t�t�p�:�/�/�l�o�g�b�a�c�k�.�q�o�s�.�c�h�/��b�������������"���h�t�t�p�:�/�/�s�v�n�.�q�o�s�.�c�h��$���h�t�t�p�:�/�/�s�v�n�.�q�o�s�.�c�h�/��h�������������&���h�t�t�p�:�/�/�j�i�r�a�.�q�o�s�.�c�h�/��&���h�t�t�p�:�/�/�j�i�r�a�.�q�o�s�.�c�h�/��D��/����0��������|����D���A�r�i�a�l���r� �N�e�|�|�
    ��0��������z[	0�����D���T�i�m�e�s� �N�e�w� �R�o�m�a�n�����0��������z[	0��� �D���W�i�n�g�d�i�n�g�s���R�o�m�a�n�����0��������z[	0��0�D���A�r�i�a�l� �B�l�a�c�k���m�a�n�����0��������z[	0���"@�D���C�o�u�r�i�e�r� �N�e�w���m�a�n�����0��������z[	0���1������@�����������.��������
    �������	��@�n����?���" ��d������d���������@���������������������  �������@@�������``������������\����T������`�Y������8�����������������������������������������������������������*�������*�������������������������������������������������������������������������������������������
    �������
    ������������������������������������������ ������!�������������#������$��������������������'������(������)������*������+������,������-������.������/������0������1������2������3������4������5�������������7������8���������������������������9������:������;������=������<�������������?�������������A������B������C����������������������������������D������E������F������G������H������I������J���X�����������������K������L������M������N������O������o����$��������������������������������������b�$���͒^bEN凙=U���������������$��������������������������������������b�$���LMJm /!�������������$��������������������������������������2�$���wlֲ;�A�����q������0��������A��������A��������P����������f����@��������������8�����������������������������	����������������������������cP;	�ʚ;S1�ʚ;���g������������4���d���d���d���d�����������z[	0��������j���p��������p��p�������@���<�����4���d���d���d���d���@�	0|�X
    ���������������������������������������<�����4���B���d���B���d������@�<	0|���������������������g������������4���}���d���}���d�����������z[	0��������������p��������@��p�������p���8����0��������_�_�_�P�P�T�1�0��������
    ���������?�����������-�O���������
    �=��*6�������������������������������������Logback project��������������������������� �������������Ceki Glc & Sbastien Pennec�����������������������8��������������������������������������������������������������������������������~ ���������������������������������No revolution, only evolution.
    The same basic plumbing only done better. 
    Faster, smaller, higher gas mileage, and generally more bang for the buck.�����-�����������������������������Modular architecture������������logback-core
    	Joran, Status,
       Context, pattern parsing
    logback-classic
    	developer logging
    logback-access
    	container (access) logging
    ��V���
    ��������Z�,��������Z���������Z���������Z���������Z���������Z�������������#�����������������������������Access Logging������������Definition: Access log
    		The log generated when a user 	accesses a web-page on a web server.
    
    Logback-access integrates seamlessly with Jetty and Tomcat
     ��<�����������Z�F��������Z�<��������Z���������Z���������������������������������������0���logback-classic speaks SLF4J (as mother tongue)�����1���������1������(�������������Logback offers a native implementation of the SLF4J API => Logback exposes its logging API through SLF4J.
    SLF4J can delegate to log4j, logback, java.util.logging or JCL
    SLF4J can bridge log4j, JCL and j.u.l.
    ��,�����������������(�������������������������������������������������������Joran: a bowl of fresh air�����������G�i�v�e�n� �r�u�l�e�s� �(�p�a�t�t�e�r�n�s� �&� �a�c�t�i�o�n�s�)� �i�t� �c�a�n� �c�o�n�f�i�g�u�r�e� �a�n�y� �o�b�j�e�c�t�.�
    �J�o�r�a�n� �c�a�n� �l�e�a�r�n� �n�e�w� �r�u�l�e�s� �o�n� �t�h�e� �f�l�y�.�
    �W�i�t�h� �i�t�s� �i�m�p�l�i�c�i�t� �r�u�l�e�s�,� �y�o�u� �d�o�n� t� �e�v�e�n� �h�a�v�e� �t�o� �w�r�i�t�e� �r�u�l�e�s�.� �
    �I�t� �c�a�n� �d�o� �p�a�r�t�i�a�l� �r�e�p�l�a�y�.�
    �I�t� �i�s� �g�e�n�e�r�i�c� �(�c�a�n� �b�e� �u�s�e�d� �i�n� �y�o�u�r� �o�w�n� �p�r�o�j�e�c�t�s�)���&�����������Z�d�������<�������M�����������������������������������������Configuration example:��������������������(������������
    <appender name="FILE"
         class="ch.qos.logback.core.rolling.RollingFileAppender">
      <File>logFile.log</File>
      <rollingPolicy
    	   class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <FileNamePattern>
               logFile.%d{yyyy-MM-dd}.log.zip
        </FileNamePatter>
      </rollingPolicy>
    
      <layout class="ch.qos.logback.classic.PatternLayout">
        <Pattern>
          %d{HH:mm:ss,SSS} [%thread] %-5level %logger{22} - %msg%n
        </Pattern>
      </layout>
    </appender>��6����������P�5�������,����������v�������������#�������/����������������������������
    ��������������2���������������������
    �����������������������������������
    ��������������$���������������������$��������������(������������<�����������������������������Logback-access configuration��������������������(����������x��<appender name="FILE"	    
                class="c.q.l.c.r.RollingFileAppender">
      <File>access.log"</File>
      <rollingPolicy
            class="c.q.l.c.r.TimeBasedRollingPolicy">
        <FileNamePattern>
          access.%d{yyyy-MM-dd}.log.zip
        </FileNamePattern>
      </rollingPolicy>
    
      <layout class="c.q.l.access.PatternLayout">
        <Pattern">combined</Pattern">
      </layout>
    </appender>��4���y�������P������������������������������.���������������������
    ��������������
    �������������� ��������������������������������������������������������
    ���������������������=���������������������	��������������������Another example:��������������������(������������<testShell name="test1">
      <period>5 minutes</period>
      <!-- we need to configure a totally new test 
           object for each run of the test -->
      <test class="com.wombat.myTest">
        <DataSource class="c.w.JNDIDS">
          <url>jndi://com.wombat/ds"</url>
        </DataSource>
      </test>
    <testShell>
    
    <testShell name="test2">
      <period>60 seconds</period>
      <test class="com.wombat.myTest2">
        <file>c:/wombat/foo.properties</file>
      </test>
    </testShell>��4����������P�������������������������������������	����������������������������
    ��������������
    �������
    �������������������������������������������������
    �������
    �������	��������������	�������[���������������������	�������������������8�����������������������������Is Joran for me?���������a���
    Joran is ideal for building frameworks which need to support arbitrary user-developed plug-ins.
    �����a������������������b���������������������
    ��������������������Internal error reporting���������~���Who shall guard the guards?
    
    Logback modules cannot use logging to report their own state.
    
    Something more generic is needed.
    ��(���������������������b���������������������0�����������������������������Errors in action������������
    Internal state available via StatusManager
    
    Exceptions and status messages accompanied by references, i.e. URLs, to external documents������������
    �������]������������ ��������������������������
    ���Documentation�����
    ��������������������������M�a�j�o�r� �a�r�e�a� �o�f� �e�f�f�o�r�t�.�
    �
    �C�o�m�p�l�e�t�e� �m�a�n�u�a�l�,� �w�i�t�h� �o�v�e�r� �1�5�0� �p�a�g�e�s� �o�f� �d�o�c�u�m�e�n�t�a�t�i�o�n�,� �i�s� �a�v�a�i�l�a�b�l�e� �f�o�r� �f�r�e�e�
    �
    �A� �s�h�o�r�t� �i�n�t�r�o�d�u�c�t�i�o�n� �t�o� �a�c�c�e�s�s� �l�o�g�g�i�n�g� �w�i�t�h� �l�o�g�b�a�c�k�-�a�c�c�e�s�s� �a�n�d� �J�e�t�t�y�
    �
    �j�a�v�a�d�o�c�,� �F�A�Q�,� �e�r�r�o�r� �c�o�d�e�s�,�& 
    �����������������������������������������������������=���������������������������$���Filters, Filters. Filters everywhere�����%���������%������(�������������Filters attachable to any Appender
    Evaluator filters
    Janino filters for evaluation based on java expressions
    TurboFilters for optimized global processing��,���5��������������2��������������!������������!���������
    ��������������������EvaluatorFilter & Janino��,���������������������������������������������<appender name="CYCLIC"
              class="c.q.l.core.read.CyclicBufferAppender">
      <filter class="c.q.l.core.filter.EvaluatorFilter">
        <evaluator name="loggingTaskEval">
    	    <expression>
    		  logger.contains("LoggingTask") &&
            message.contains("Howdydy-diddly-ho") &&
            (timeStamp-loggerContext.getBirthTime()) >= 20000
    		</expression>
    	 </evaluator>
    	 <OnMatch>DENY</OnMatch>
      </filter>
      <MaxSize>512</MaxSize>
    </appender>��4����������P�����������������Z������������
    �������������������������$����������������������������������!�����������������	����������������������������������������������������������������������������������������������������������������������������������������$���������!��������	�����������������������������������������������������������������������������������������������������������;������������������������������TurboFilters�������������������������������<turboFilter
         class="c.q.l.classic.turbo.MDCFilter">
      <MDCKey>userid</MDCKey>
      <Value>sebastien</Value>
      <OnMatch>ACCEPT</OnMatch>
    </turboFilter>��&���9��������Z�`������������������������������������
    ���������������������������������������������������������������	���������������������	����������������������������������������>������������������������������Parameterized logging������������Integer entry = new Interger(50); 
    logger.debug("The entry is "+entry+".");
    
    can be optimized as:
     if(logger.isDebugEnabled()) {
     logger.debug("The entry is "+entry+".");
    }
    
    or better yet:
    logger.debug("The entry is {}.", entry); 
    �������������Z�0���������������������������������K�������������������������������
    �����������������P���#��������������/����������������������������*��������������������������"�������������������������� ���Markers for specialized handling���������V���Markers are metadata for logging statements, coloring them for specialized processing
    �����V������������������W������������L���������������������������/���SiftingAppender or the appender-making appender�����0���������0������(������������� ���������������������������Sift logging according to runtime attributes
    E.g. separate logs according to user sessions, so that the log file generated by every user go into distinct log files, one log file per user. 
    Works with any appender, not just FileAppender�����-��������������������������������	���������������������������������������������������	��������������������������	�����������������-��������.��������������������M���������� ��������������������SiftingAppender (continued)��������������������(��������������������������������������� <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
        <discriminator>
          <Key>userid</Key>
          <DefaultValue>unknown</DefaultValue>
        </discriminator>
        <sift>
          <appender name="FILE-${userid}"
                    class="ch.qos.logback.core.FileAppender">
            <File>${userid}.log</File>s
            <Append>false</Append>
            <layout>
              <Pattern>%d %level %mdc %logger - %msg%n</Pattern>
            </layout>
          </appender>
        </sift>
      </appender>
    ������������P�P�������������������������fG�������������������������f�����������������fJ�����������������f�����������������f�������������������������������������+�����������������
    ���������
    ����������������������������������������������������������������������������
    �������������������������������������������	������������������������� ��������������������������6������������������������������������������������������������������������������������������������������������������������������������$������������������������������JMX���������S���
    Logback configuration can be reloaded via JMX
    
    Statistical results exposed via JMX��������������S���������T������������%�����������������������������Tested & Ready���������J���Battery of over 450 unit tests
    
    Tests written concomitantly with the code
    ��4���������������������*������������������K������������I�������������������������� ���Package versions in stack traces�����!���������!������(����������n��java.lang.NullPointerException
     at com.xyz.Wombat(Wombat.java:57) ~[wombat-1.3.jar:1.3]
     at com.xyz.Wombat(Wombat.java:76) ~[wombat-1.3.jar:1.3]
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native) ~[na:1.5.0_06]
     at java.lang.reflect.Method.invoke(Method.java:585) ~[na:1.5.0_06]
     at junit.runners.TestMethod.invoke(TestMethod.java:59) [junit-4.4.jar:na]
     etc..��^���o��������B��������������������������������������������������������������Q�����������J������������������������������logger name abbreviation�����,���������������������������
    ���Odds and ends���������H��RollingFileAppender automatic file compression the background
    FileAppender and RollingFileAppender allow for the same log file to be written to by instances located in different JVMs
    10 fold improvement in the speed of transporting logging events over the wire 
    SMTPAppender now does TLS and SSL, subject line in outgoing email
    �����I�������Z�I��������,�����������������P�������"��������!������������N����������!��������������������Odds and ends II�����������������������������]���%() in pattern strings can do magic
     %-50(%d %level [%thread]) - %m%n
    DuplicateMessage filter��d���$���������"������������������%���������������f���������������f����������������8���B������������������������������������������������O����������"��������������������Odds and ends II�����������������������������]���%() in pattern strings can do magic
     %-50(%d %level [%thread]) - %m%n
    DuplicateMessage filter��d���$���������"������������������%���������������f���������������f����������������8���B������������������������������������������������H���������������������������
    ���Conclusion�����
    ������������������������"���Logback is the successor of log4j.�����&���������������������������
    ���Questions?������������
    read the docs at http://logback.qos.ch/
    study the code at http://svn.qos.ch
    write to us at  logback-user@qos.ch
    file a bug report at http://jira.qos.ch/
    chat with us at irc.freenode.net#qos
    talk to us at +41 21 312 32 26��������������������������������d�������������������������������������������������������������������������������� ��������������������������U
    0��������(����������������������U
    0�����;���L����������������������U
    0�����]���p����������������������U
    0��������������������������������
    U
    0�����������/�������������������������������
    ���������������������������������������������������������������������������������������������������	����������������������
    �����������'����������������������(�����������
    �����������)����������������������*����������������������+����������������������.����������������������1����������������������5����������������������6����������������������7����������������������9����������������������D����������������������E����������������������F����������������������G����������������������K���������������������������������	��������������`� �����f���f��f�33������`� ���3KI�����3������ff�`� ���33���f�������f�`� ���/����������p�`� ���3����%����*�3��|�`� ���Jy��3f���ff3�f������`� ��������3��������f��f3��̙��`� �����3��3f��������f��33����`� ��������D�D������yq�3f��`� ��������������̙��3��n�`� ��������w�����3���ff��`� ����������}�������ff����>����?���" �d�������d���������@������������,�����������?��n��K������d�������@������������ ���������P���� ������n�A����@�������F����`��������d�������� �n����?���" ��d������d��������@���������������������  �������@@�������``�����������P�R��������������"��	���� �����	����@�����	����`�����	��������`��������������2�p�>���������������������������������������������������>���������������������������������������������������������������<���.���(����	��������������������
    ����<����������
    ���<���
    ���6�������t}��������������	���#�"�����`���������``�������������
    \����������������*��������������������������������������������������������T����	�������������X���
    ���<�������������"���������������X�����
    ���<��
    ���N��������������������������d������������#�"�����`��������������������P���
    H���������������������0������������������������������������
    ���<��
    ���6������������������d��������#�"�����`�����������U��������
    F���������������������0������������������������������������
    ���<��
    ��S���������<��������"�������������U���Y������
    @������������������������������������������������������
    ���<��
    ��c�$��������ċ������������"�����������Y��������W����
    @������������������������������������������������������
    ���	<��
    ��c�$��������4������������"�����������Y��U���������
    @������������������������������������������������������
    ���
    <��
    ��c�$��������������������"����������������������
    @������������������������������������������������������
    ���<��
    ��S����������������#�"�����`���������S���V����������
    F���������������������0������������������������������������
    ���<��
    ��S�����������������"����������������Y�����
    @������������������������������������������������������
    ���
    <��
    ��c�$��������������������"������������������X���
    @������������������������������������������������������
    ���<���
    ���<�������������������������	���#�"�����`���������  `���������������
    T�������������� ���Click to edit Master title style�����!�������
    ���!���������$���
    ���<���
    ���0�����������������	����"����������� `p��������������
    �������������R���Click to edit Master text styles
    Second level
    Third level
    Fourth level
    Fifth level�����!�����
    ��������
    ����������
    ���S�������������
    ���<���
    ���6�������X��������������	���#�"�����`���������^ P�������������
    X����������������*����������������������������������������������������H����
    ���<������0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���
    07���+��������D=�����' ����������������������������=
    ���@B���	����+���� �
    ���P�i�x�e�l�����������	�������������������������@���3���(����	��������������������
    ����@������j	���T����	����������������
    ���@�������������"����������p��P
    �����
    ���@��
    ���T��������h������������������d������������
    ���#�"����� ���������������������
    H���������������������0������������������������������������
    ���@��
    ��c�$��������k�������
    ����"����������9��)����e
    ���
    F���������������������0��������������������������������^���b����	�����������e
    ���
    ���@����#��������������"������������������e
    �������
    ���@��
    ��S���������o��������"����������i������e
    ���
    F���������������������0������������������������������������
    ���@��
    ��S���������s��������"����������9��)�������
    F���������������������0������������������������������������
    ���@��
    ��S���������u��������"����������������0���
    F���������������������0������������������������������������
    ���	@��
    ��S�����������������"��������������?��e
    ���
    F���������������������0������������������������������������
    ���
    @��
    ��S�����������������"������������)�������
    F���������������������0������������������������������������
    ���@��
    ��S������������������"��������������?��G���
    F���������������������0������������������������������������
    ���@��
    ��S�����������������"����������������o��G���
    F���������������������0������������������������������������
    ���
    @��
    ��S�����������������"����������9������G���
    F���������������������0������������������������������������
    ���@��
    ��S���������h��������"����������i��A�������
    F���������������������0������������������������������������
    ���@��
    ��S�����������������"������������A��?�����
    F���������������������0������������������������������������
    ���@���
    ���6���������������������	���#�"�����`���������` `�������������
    X����������������*��������������������������������������������������������
    ���@���
    ���6���������������������	���#�"�����`���������`������������	�
    @����������������������������������������������������
    ���@���
    ���6�������!��������������	���#�"�����`���������``�������������
    d����������������*������������������������������������������������������������
    ���@���
    ���0�������[�����������	����"�����������`0	���������������
    T������������� ���Click to edit Master title style�����!�������
    ���!�������������
    ���@���
    ���0�������\����������	����"�����������P
    p��������������
    W�������������#���Click to edit Master subtitle style�����$�������
    ���$���������H����
    ���@������0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���
    07���+��������D=�����' ����������������������������=
    ���@B���	����+���������������
    0������P����������*���(����	��������������������
    ��������������
    ������
    ���0������������������	������������P �������������
    �
    X����������������*��������������������������������������������������������
    ������
    ���0�������V����������	����������	 ��������������
    Z����������������*����������������������������������������������������d����
    ������
    ��c�$��������������	�?������� 
    �����������������
    ������
    ���0�������4����������	��������
    0�������������
    �������������R���Click to edit Master text styles
    Second level
    Third level
    Fourth level
    Fifth level�����!�����
    ��������
    ����������
    ���S�������������
    ������
    ���6�������x,��������������	��������_��P������������	�
    X����������������*��������������������������������������������������������
    ������
    ���6�������1��������������	��������_	�������������
    Z����������������*����������������������������������������������������H����
    ���������0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���y`g���������0������L������(����	��������������������
    ����L����������
    ���L���
    ���0�������l����������	������������P �������������
    �
    X����������������*��������������������������������������������������������
    ���L���
    ���0�������<����������	����������	 �������������
    Z����������������*��������������������������������������������������������
    ���L���
    ���6�������P��������������	��������_��P������������	�
    X����������������*��������������������������������������������������������
    ���L���
    ���6���������������������	��������_	�������������
    Z����������������*����������������������������������������������������H����
    ���L������0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���@Z����������������������������������-������� ����������0���(����	��������������������
    ����������x����
    ����� ��c�$�������������TH������@�������`0	���������������
    �������������x����
    ����� ��c�$�������������(I������@�������P
    p��������������
    ������������H����
    ���������0���������޽h������	���?��� ��������������33������������������_�_�_�P�P�T�1�0���i�����.���3���+��������D=�����' ����������������������������=
    ���@B���	����+�����]���������
    ������������������������-��`���X��@�������������(����	��������������������
    ����������x����
    ����� ��c�$�������������<ʎ������<�������`�P �������������
    ��
    �������������x����
    ����� ��c�$�������������dގ������<�������
    ��������������
    ������������X���
    ������
    ���0���A������������������?��������0	�X���
    ������
    ���0���A������������������?���������H����
    ���������0���������޽h������	���?��� ��������������33������������������_�_�_�P�P�T�1�0���i�����.���xPLK���+��������D=�����' ����������������������������=
    ���@B���	����+��������������
    �����������������������-�������@������������(����	��������������������
    ����������r����
    ����� ��S���������ه������<�������  `�������������
    ��
    �������������r����
    ����� ��S���������ڇ������<���������@��������������
    ������������X���
    ������
    ���0���A������������������?��������B 
    �	�H����
    ���������0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.������+��������D=�����' ����������������������������=
    ���@B���	����+��������������
    �����������������������-����������������$���(����	��������������������
    ����������r����
    ����� ��S���������D������<�������  `�������������
    ��
    �������������r����
    ����� ��S���������������<������� `p��������������
    ������������H����
    ���������0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���`:���+��������D=�����' ����������������������������=
    ���@B���	����+��������������
    �����������������������-������� ������H���$���(����	��������������������
    ����H������r����
    ���H�� ��S���������������<�������P�0�������������
    ��
    �������������r����
    ���H�� ��S���������:������<������� ` ��������������
    ������������H����
    ���H������0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���y@1���+��������D=�����' ����������������������������=
    ���@B���	����+��������������
    ��������	���������������-�������p������\���$���(����	��������������������
    ����\������r����
    ���\�� ��S���������������<�������  `�������������
    ��
    �������������r����
    ���\�� ��S���������6������<�������� ��������������
    ������������H����
    ���\������0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���w���+��������D=�����' ����������������������������=
    ���@B���	����+��������������
    �����������������������-�������������t���$���(����	��������������������
    ����t������r����
    ���t�� ��S���������������<�������  `�������������
    ��
    �������������r����
    ���t�� ��S���������h������<�������0����������������
    ������������H����
    ���t������0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���C`c	���+��������D=�����' ����������������������������=
    ���@B���	����+��������������
    �����������������������-���������������$���(����	��������������������
    ���������r����
    ���� ��S���������\������<�������  `�������������
    ��
    �������������r����
    ���� ��S���������������<�������`�P��������������
    ������������H����
    ��������0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���3���+��������D=�����' ����������������������������=
    ���@B���	����+��������������
    ��������
    ���������������-�������������|���$���(����	��������������������
    ����|������r����
    ���|�� ��S���������8������<�������  `p�������������
    ��
    �������������r����
    ���|�� ��S���������������<������� `��������������
    ������������H����
    ���|������0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���C���+��������D=�����' ����������������������������=
    ���@B���	����+��������������
    �����������������������-����������������$���(����	��������������������
    ����������r����
    ����� ��S��������� ������<�������  `�������������
    ��
    �������������r����
    ����� ��S���������m������<������� `p��������������
    ������������H����
    ���������0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���0#���+��������D=�����' ����������������������������=
    ���@B���	����+��������������
    �����������������������-�����������������$���(����	��������������������
    ����������r����
    ����� ��S���������<������<�������  `�������������
    ��
    �������������r����
    ����� ��S���������T!������<������� `p��������������
    ������������H����
    ���������0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���DO���+��������D=�����' ����������������������������=
    ���@B���	����+��������������
    �����������������������-�������p���������$���(����	��������������������
    ����������r����
    ����� ��S���������&������<�������  `�������������
    ��
    �������������r����
    ����� ��S���������'������<������� `p��������������
    ������������H����
    ���������0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���0HN���+��������D=�����' ����������������������������=
    ���@B���	����+��������������
    ��������
    ���������������-�������p���������$���(����	��������������������
    ����������r����
    ����� ��S���������Pr������<�������  ``�������������
    ��
    �������������r����
    ����� ��S���������ln������<��������0��������������
    ������������H����
    ���������0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���8���+��������D=�����' ����������������������������=
    ���@B���	����+��������������
    �����������������������-������� ��������$���(����	��������������������
    ���������r����
    ���� ��S���������������<�������  `�������������
    ��
    �������������r����
    ���� ��S����������������<������� 0��������������
    ������������H����
    ��������0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���:kM���+��������D=�����' ����������������������������=
    ���@B���	����+��������������
    �����������������������-����������������$���(����	��������������������
    ����������r����
    ����� ��S���������������<�������  `0�������������
    ��
    �������������r����
    ����� ��S���������Ȋ������<�������`�P��������������
    ������������H����
    ���������0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���j���+��������D=�����' ����������������������������=
    ���@B���	����+��������������
    �����������������������-���������������$���(����	��������������������
    ���������r����
    ���� ��S���������������<�������  `�������������
    ��
    �������������r����
    ���� ��S���������������<�������`��������������
    ������������H����
    ��������0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���iP탩���+��������D=�����' ����������������������������=
    ���@B���	����+��������������
    �����������������������-�������0��������$���(����	��������������������
    ���������r����
    ���� ��S���������8������<�������  `��������������
    ��
    �������������r����
    ���� ��S���������������<����������������������
    ������������H����
    ��������0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���>LB���+��������D=�����' ����������������������������=
    ���@B���	����+��������������
    �����������������������-����������������$���(����	��������������������
    ����������r����
    ����� ��S���������������<��������0 �������������
    ��
    �������������r����
    ����� ��S���������������<������� `p��������������
    ������������H����
    ���������0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���|���+��������D=�����' ����������������������������=
    ���@B���	����+�����$���������
    ��������������������������T��$���(����	��������������������
    ����T�����r����
    ���T� ��S���������������<������� `�������������
    ��
    �������������r����
    ���T� ��S��������������<������� `p��������������
    ������������H����
    ���T�����0���������޽h������	���?��� ����������}�������ff���8����0��������_�_�_�P�P�T�1�0��������.���l@�$���������
    ��������������������������X��$���(����	��������������������
    ����X�����r����
    ���X� ��S���������df������<�������P�0�������������
    ��
    �������������r����
    ���X� ��S���������g������<�������``���������������
    ������������H����
    ���X�����0���������޽h������	���?��� ����������}�������ff���8����0��������_�_�_�P�P�T�1�0��������.���mqK����������
    �����������������������-����������������$���(����	��������������������
    ����������r����
    ����� ��S���������������<�������  `�������������
    ��
    �������������r����
    ����� ��S���������������<������� `p��������������
    ������������H����
    ���������0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���~ǩ���+��������D=�����' ����������������������������=
    ���@B���	����+��������������
    �����������������������-����������������$���(����	��������������������
    ����������r����
    ����� ��S���������������<�������  `�������������
    ��
    �������������r����
    ����� ��S���������@������<������� `p��������������
    ������������H����
    ���������0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���@D���+��������D=�����' ����������������������������=
    ���@B���	����+�����}���������
    ������������������������@��$���(����	��������������������
    ����@�����r����
    ���@� ��S���������tB������<�������  `�������������
    ��
    �������������r����
    ���@� ��S���������[������<���������`p��������������
    ������������H����
    ���@�����0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���Ic���+��������D=�����' ����������������������������=
    ���@B���	����+�����{
    ���������
    ��������������	���	��������WD��"	���(����	��������������������
    ����D�����x����
    ���D� ��c�$�������������P������<�������  `�������������
    ��
    �������������j�������	��������0��
    ���
    ���WD����������#�"������������ ��0��0��������0
    �����������������
    ���FD�
    ���6�����������������������?�������� ��	��0��
    ���
    p����������������m.s.sample.Bar�������������������������������������������������� @`�����
    ���ED�
    ���6��������([��������������?�����������	�� ��
    ���
    Q����������������%logger{15}������������������������������� @`�����
    ���DD�
    ���6��������hd��������������?�������� ����0��	���
    |����������������mainPackage.sub.sample.Bar�������������������������������������������������� @`�����
    ���CD�
    ���6����������������������?������������� ��	���
    O�������������	���%logger 
    �����
    ���������
    ����������������� @`�����
    ���BD�
    ���6����������������������?�������� ����0�����
    j����������������Displayed logger name
    ��"������������������������������������ @`�����
    ���AD�
    ���6��������8 ��������������?������������� �����
    ^����������������Conversion specifier������������������������������� @`�`���B
    ���GD�
    ���0��������o������
    ���?����������������0�����Z���B
    ���HD�
    ��s�*��������1���
    ���?����������������0�����Z���B
    ���ID�
    ��s�*��������1���
    ���?��������������	��0��	���`���B
    ���JD�
    ���0��������o������
    ���?��������������
    ��0��
    ���`���B
    ���KD�
    ���0��������o������
    ���?�������������������
    ���Z���B
    ���LD�
    ��s�*��������1���
    ���?����������� ���� ��
    ���`���B
    ���MD�
    ���0��������o������
    ���?�����������0����0��
    ���H����
    ���D�����0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���L���+��������D=�����' ����������������������������=
    ���@B���	����+��������������
    �����������������������-�������0���������$���(����	��������������������
    ����������r����
    ����� ��S���������B������<�������  `�������������
    ��
    �������������r����
    ����� ��S���������x=������<������� ``��������������
    ������������H����
    ���������0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���v@o���+��������D=�����' ����������������������������=
    ���@B���	����+�����}���������
    ��������������������������\��$���(����	��������������������
    ����\�����r����
    ���\� ��S���������,������<�������  ``�������������
    ��
    �������������r����
    ���\� ��S���������ݎ������<��������
    ��������������
    ������������H����
    ���\�����0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���D@+���+��������D=�����' ����������������������������=
    ���@B���	����+��������������
    ��������������������������`��0���(����	��������������������
    ����`�����x����
    ���`� ��c�$��������'������<�����������  ``�������������
    �'�
    �������������x����
    ���`� ��c�$��������'������<������������
    �������������'�
    ������������H����
    ���`�����0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���D@+���+��������D=�����' ����������������������������=
    ���@B���	����+�����}���������
    ��������������������������<��$���(����	��������������������
    ����<�����r����
    ���<� ��S���������Tp������<�������  `�������������
    ��
    �������������r����
    ���<� ��S���������q������<������� `p��������������
    ������������H����
    ���<�����0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���| 5\���+��������D=�����' ����������������������������=
    ���@B���	����+��������������
    �����������������������-����������������$���(����	��������������������
    ����������r����
    ����� ��S���������������<�������  `�������������
    ��
    �������������r����
    ����� ��S���������k������<�������  ���������������
    ������������H����
    ���������0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.�������+��������D=�����' ����������������������������=
    ���@B���	����+�����_���������
    0������`����������o���(����	��������������������
    ����������X����
    ����� ��C������������������ 
    ������������������
    ����� ��S����������������������
    0��������������
    q��������������Faster: Certain critical operations, for instance determining whether a log statement should be logged or not, has been significantly improved. This operation takes about 3 nanoseconds in logback versus 30 nanoseconds in log4j. Logback also creates loggers faster : 13 microseconds instead versus 23 microseconds for log4j. More importantly, it fetches an existing logger in 94 nanoseconds versus 2234 nanoseconds for log4j, a 23 fold improvement. The improvement over JUL is also far from insignificant.
    Smaller: Each logger instance uses up about 40 bytes of memory version 160 bytes for log4j.
    More bang for the buck: Logback does a better job of presenting logs, has much improved filtering and evaluation capability. In short, it does everything that log4j does and more, but better. ��@�������������������������������T����������������������H����
    ���������0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���ypg�����������
    0������@������P��� ���(����	��������������������
    ����P������X����
    ���P�� ��C������������������ 
    �������������������
    ���P�� ��S���������`�����������
    0��������������
    "���������������������������H����
    ���P������0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���A\�Z���������
    0������`������X���j���(����	��������������������
    ����X������X����
    ���X�� ��C������������������ 
    ������������������
    ���X�� ��S���������@Q�������������
    0��������������
    l������������6��As a logback user, the vast majority of your will depend on SLF4J, not logback. Thus, if you later want to switch to JCL, JUL or log4j, you can do so with relative ease.
    
    SLF4J acts as a universal logging API bridging between the various logging systems. Logback is designed to support SLF4J API from the start. In practice, it is a little less convenient to log directly through logback instead of (indirectly) with SLF4J. For example, logback's documentation always uses SLF4J. (There are no examples in logback docs that use logback directly.)�����������	�������i��������H����
    ���X������0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���A\����������
    0�J���B��������x������(����	��������������������
    ����x������X����
    ���x�� ��C������������������ 
    ���������������B���
    ���x�� ��S����������������������
    0��������������
    �������������\���c.q.l is an abbreviation of  ch.qos.logback
    c.q.l.c.r stands for ch.qos.logback.core.rolling�����]���������]���������H�������������������������������	�����������������������������H����
    ���x������0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���C`\�q������
    ���
    0������������������(����	��������������������
    ����������X����
    ����� ��C������������������ 
    ������������������
    ����� ��S���������b�������������
    0��������������
    ������������o��logback-core modules cannot log because it has no notion of a "logger". 
    Loggers are defined in logback-classic.
    
    But, more generally, a logging system which uses itself for its own logging is extremely difficult to design and to maintain. It can be done but a the cost of non-negligible complexity. 
    
    Instead logback relies on Status object to report its own state.
    �H����
    ���������0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���E r{A�[���������
    0������0���������k���(����	��������������������
    ����������X����
    ����� ��C������������������ 
    �������������������
    ����� ��S���������m�������������
    0��������������
    m�������������7���An example with MultiFileAppender might be interesting.���������������������������H����
    ���������0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���E�P������	���
    0������@���������`���(����	��������������������
    ����������X����
    ����� ��C������������������ 
    ������������������
    ����� ��S���������>�������������
    0��������������
    b������������,��As mentioned previously, we've used Joran (part of logback-core) to implement a monitoring framework. 
    
    We needed to recreate sophisticated test object anew each time we needed to perform a verification. Joran's unique capability of selectively replaying parts of a configuration was a perfect match.�������������������Z��������H����
    ���������0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���E����������
    0������������������(����	��������������������
    ����������X����
    ����� ��C������������������ 
    ������������������
    ����� ��S���������?�������������
    0��������������
    ����������������Contrary to log4j, where we wrote many regression tests, in logback, we have learned our lesson. We write many more unit tests and fewer integration tests.�H����
    ���������0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���uC
    ����������
    0� �����������������(����	��������������������
    ����������X����
    ����� ��C������������������ 
    ������������������
    ����� ��S���������7�������������
    0��������������
    ����������������We consider code ready for distribution only after it is properly documented, which is the main reason why logback carries a 0.x version stamp instead of 1.x.�H����
    ���������0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���uu����������
    0����������������#���(����	��������������������
    ����������X����
    ����� ��C������������������ 
    �������������������
    ����� ��S���������,�������������
    0��������������
    %����������������Show JMX counter.�H����
    ���������0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���up�/������
    ���
    0���������������?���(����	��������������������
    ����������X����
    ����� ��C������������������ 
    �������������������
    ����� ��S���������s�������������
    0��������������
    A�������������-���- Turbo filtering example based on user login�H����
    ���������0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���ub����������
    0������ ���������'���(����	��������������������
    ����������X����
    ����� ��C������������������ 
    �������������������
    ����� ��S���������O�������������
    0��������������
    )����������������NO_EXCEPTION example
    �H����
    ���������0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���vo�#���������
    0������P���������3���(����	��������������������
    ����������X����
    ����� ��C������������������ 
    ������������������
    ����� ��S���������,�������������
    0��������������
    5������������!��The logback-core module forms the foundation upon which the other two modules are built. Interestingly enough, logback-core has no notion of "logger." We have recently built a monitoring framework on top of just logback-core (without logback classic or access).
    
    Logback-classic relies on logback-core for basic services. It natively implements the SLF4J API.
    
    Logback-access integrates with servlet containers, in particular Jetty and Tomcat. Thus, the capabilities of a fully-fledged logging system can be leverages in servlet containers. 
    
    
     �H����
    ���������0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���PY�f���������
    0���������������v���(����	��������������������
    ����������X����
    ����� ��C������������������ 
    ������������������
    ����� ��S���������h�������������
    0��������������
    x��������������- ajouter une classe XYAppender, ajouter la config ncessaire dans logback-YY.xml et montrer que la config est faite toute seule, sans modifier quoi que se soit.
    - configuration: configurer un fichier xml avec une erreur (pas de TriggeringPolicy dans un RollingFileAppender) et montrer l'effet des status objects et le lien vers la page codes.html. Logback se manifeste lorsqu'il y a une erreur et fourni une piste  suivre pour la rsoudre.�����������������������������������������������������
    ������������������������������������������
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������
    ���������������������
    ����������������������������	����������������������������������������������������������������������	�������
    �������
    �������	��������������	�������������������������������������������������������������������������������������������	����������������������H����
    ���������0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���n����������
    0��������������� ���(����	��������������������
    ����������X����
    ����� ��C������������������ 
    �������������������
    ����� ��S���������"�����������
    0��������������
    "���������������������������H����
    ���������0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���a`T"F����������
    0��������������� ���(����	��������������������
    ����������X����
    ����� ��C������������������ 
    �������������������
    ����� ��S���������$Ӕ�����������
    0��������������
    "���������������������������H����
    ���������0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���aN����������
    0��������������� ���(����	��������������������
    ����������X����
    ����� ��C������������������ 
    �������������������
    ����� ��S���������䅔�����������
    0��������������
    "���������������������������H����
    ���������0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���aPY����������
    0�/���'��������������(����	��������������������
    ����������X����
    ����� ��C������������������ 
    ���������������'���
    ����� ��S���������9�������������
    0�d�������������L����D��������_�_�_�P�P�T�9���&�����������������������������������
    m��������������
    Given that 
    
     Joran can configure any component via setter/adder methods, 
     can be easily adjusted to process configuration elements via user-specified actions,
    
    Joran is really ideal for building frameworks which need to support user-developed extensions.��<���������������������" ��_����������" �������������������������H����
    ���������0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���0#�e���������
    0������@������,��u���(����	��������������������
    ����,�����X����
    ���,� ��C������������������ 
    �������������������
    ���,� ��S���������Pٔ�������������
    0��������������
    w�������������A���Logback-access configuration is very similar to logback-classic. �����0����������������������H����
    ���,�����0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���xdPN����������
    0������P������0�� ���(����	��������������������
    ����0�����X����
    ���0� ��C������������������ 
    ��������������/�����
    ���0� ��S���������0/�����������
    0�������������/�
    "���������������������������H����
    ���0�����0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���xdO����������
    0������`������4�� ���(����	��������������������
    ����4�����X����
    ���4� ��C������������������ 
    ��������������������
    ���4� ��S���������+������������
    0���������������
    "���������������������������H����
    ���4�����0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���xdH ����������
    0������p������8�� ���(����	��������������������
    ����8�����X����
    ���8� ��C������������������ 
    �������������������
    ���8� ��S��������������������
    0��������������
    "���������������������������H����
    ���8�����0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���xd` �@���������
    0������������P��P���(����	��������������������
    ����P�����X����
    ���P� ��C������������������ 
    ������������������
    ���P� ��S���������p�������������
    0��������������
    R��������������At the end of each stack frame, logback will add a packaging information for the corresponding class. Packaging information consists of the containing jar file and versioning information. The inclusion of packaging information shortens the time it takes to identify software problems.����� ����������������������H����
    ���P�����0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���%hd��r����������o���P�q��[d��^��C��T���0�z��}j����������:}���P���?����7����� ����� ��i����f��x��W����ſ��E������������u����0� �Ќ��.��5�P�����������;�@�4��l����͙��D������ ��8�@������P���+��*���������"��?
    ���������O�����E���(������������������������������������Oh�+'0�����
    ������p������x���������������������������	������������
    �����������
    �������� �����(�������������Slide 1�������*Unrestricted*��������Ceki �tr������Pixel�tr������ Ceki�tr������191�������Microsoft PowerPoint��P�@���@FhQ��@���@3@���0^Y�����G���X������g���	��$�������������������������������������-��������������-����@	!������������������������-����-�����'�������-������������-����-����@	!���������k������-����-�����������������-����-����@	!���������k�����-����-�����������������-����-����@	!���������k�1����-����-�����������������-����-����@	!��������
    �k�@����-����-�����������������-����-����@	!���������k�M����-����-�����������������-����-����@	!��������
    �k�Y����-����-�����������������-����-����@	!��������	�k�c����-����-�����������������-����-����@	!��������	�k�l����-����-�����������������-����-����@	!��������	�k�u����-����-�����������������-����-����@	!���������k�~����-����-�����������������-����-����@	!���������k�����-����-�����������������-����-����@	!���������k�����-����-�����������������-����-����@	!���������k�����-����-�����������������-����-����@	!���������k�����-����-�����������������-����-����@	!���������k�����-����-�����������������-����-����@	!��������	�k�����-����-�����������������-����-����@	!���������k�����-����-�����������������-����-����@	!��������	�k�����-����-�����������������-����-����@	!��������	�k�����-����-�����������������-����-����@	!��������
    �k�����-����-�����������������-����-����@	!���������k�����-����-�����������������-����-����@	!���������k�����-����-�����������������-����-����@	!���������k�����-����-�����������������-����-����@	!���������k�����-����-�����������������-����-����@	!���������k����-����-�����������������-����-����@	!�������� �k�(���-����-���������-����'�����������}������-����-����@	!��������������-����-�����'�������������������-����-����@	!��������/�6�q5����-����-�����'�������������������-����-����@	!��������/�5������-����-�����'�������-����-����@	!��������.�7������-����-�����'���������������}������-����-����@	!��������/�7�qk����-����-�����'�������������������-����-����@	!��������/�7������-����-�����'�������������������-����-����@	!��������/�7�k����-����-�����'���������������}������-����-����@	!��������/�7����-����-�����'�������������������-����-����@	!��������/�5�����-����-�����'�������������������-����-����@	!��������/�6�C5����-����-�����'�������������������-����-����@	!��������/�7�Ck����-����-�����'��������������@�"Arial Black������������������������-����.��������	���	���2
    ���1�����.���������������"System���������D�������������-�������������������@��Arial������������������������������-����.��������	���2
    [%���Logback project�&�'�&�'�&�#�#��&��&��&�#�����.�����-�������������������@��Arial������������������������������-����.��������	������2
    ����Ceki Glc & S"���
    �
    �%��
    ���
    � �
    �����.�����-�������������������@��Arial������������������������������-����.��������	���	���2
    ��������.�����-�������������������@��Arial������������������������������-����.��������	������2
    ���bastien����
    �
    ������.�����-�������������������@��Arial������������������������������-����.��������	������2
    ���Pennec���������.�����-�������������-�������������������������������������������������������������e�r�@�q�o�s�.�c�h��4���m�a�i�l�t�o�:�l�o�g�b�a�c�k�-�u�s�e�r�@�q�o�s�.�c�h��t�������������,���h�t�t�p�:�/�/�l�o�g�b�a�c�k�.�q�o�s�.�c�h�/��,���h�t�t�p�:�/�/�l�o�g�b�a�c�k�.�q�o�s�.�c�h�/��b�������������"���h�t�t�p�:�/�/�s�v�n�.�q�o�s�.�c�h��$���h�t�t�p�:�/�/�s�v�n�.�q�o�s�.�c�h�/��h�������������&���h�t�t�p�:�/�/�j�i�r�a�.�q�o�s�.�c�h�/��&���h�t�t�p�:�/�/�j�i�r�a�.�q�o�s�.�c�h�/��D��/����0��������|����D���A�r�i�a�l���r� �N�e���0.�8� �0�������8�z[	00�����D���T�i�m�e�s� �N�e�w� �R�o�m�a�n���8� �0�������8�z[	00��� �D���W�i�n�g�d�i�n�g�s���R�o�m�a�n���8� �0�������8�z[	00��0�D���A�r�i�a�l� �B�l�a�c�k���m�a�n���8� �0�������8�z[	00���"@�D���C�o�u�r�i�e�r� �N�e�w���m�a�n���8� �0�������8�z[	00���1������@�����������.��������
    �������	��@�n����?���" ��d������d���������@���������������������  �������@@�������``������������l����d������h�[������:�����������������������������������������������������������*�������*�������������������������������������������������������������������������������������������
    �������
    ������������������������������������������ ������!�������������#������$��������������������'������(������)������*������+������,������-������.������/������0������1������2������3������4������5�������������7������8���������������������������9������:������;������=������<�������������?�������������A������B������C����������������������������������D������E������F������G������H������I������J���X�����������������K������L������M������N������O������P������Q������o����$��������������������������������������b�$���͒^bEN凙=U���������������$��������������������������������������b�$���LMJm /!�������������$��������������������������������������2�$���wlֲ;�A�����q������0��������A��������A��������P����������f����@��������������8�����������������������������	����������������������������cP;	�ʚ;S1�ʚ;���g������������4���d���d���d���d����������P�z[	0�����������p��������p��p�������@���<�����4���d���d���d���d���|�	0�.����������������������������������������<�����4���B���d���B���d������|�<	0���������������������g������������4���}���d���}���d����������P�z[	0��������������p��������@��p�������p���8����0��������_�_�_�P�P�T�1�0��������
    ���������?�����������-�O���������
    �=��8�������������������������������������Logback project��������������������������� �������������Ceki Glc & Sbastien Pennec�����������������������8��������������������������������������������������������������������������������~ ���������������������������������No revolution, only evolution.
    log4j is no longer being actively developed
    The same basic plumbing only done better. 
    Faster, smaller, higher gas mileage, and generally more bang for the buck.�������������Z�������������8���������������w������������-�����������������������������Modular architecture������������logback-core
    	Joran, Status,
       Context, pattern parsing
    logback-classic
    	developer logging
    logback-access
    	container (access) logging
    ��V���
    ��������Z�,��������Z���������Z���������Z���������Z���������Z�������������#�����������������������������Access Logging������������Definition: Access log
    		The log generated when a user 	accesses a web-page on a web server.
    
    Logback-access integrates seamlessly with Jetty and Tomcat
     ��<�����������Z�F��������Z�<��������Z���������Z��������������������������������������� ���logback-classic implements SLF4J�����!���������!������(������������Logback offers a native implementation of the SLF4J API => Logback exposes its logging API through SLF4J.
    If you are using logback, you are actually using SLF4J
    SLF4J can delegate to log4j, logback, java.util.logging or JCL
    SLF4J can bridge log4j, JCL and j.u.l.
    ��>���{��������������E��������������(�������������������������������������������������������Joran: a bowl of fresh air�����������G�i�v�e�n� �r�u�l�e�s� �(�p�a�t�t�e�r�n�s� �&� �a�c�t�i�o�n�s�)� �i�t� �c�a�n� �c�o�n�f�i�g�u�r�e� �a�n�y� �o�b�j�e�c�t�.�
    �J�o�r�a�n� �c�a�n� �l�e�a�r�n� �n�e�w� �r�u�l�e�s� �o�n� �t�h�e� �f�l�y�.�
    �W�i�t�h� �i�t�s� �i�m�p�l�i�c�i�t� �r�u�l�e�s�,� �y�o�u� �d�o�n� t� �e�v�e�n� �h�a�v�e� �t�o� �w�r�i�t�e� �r�u�l�e�s�.� �
    �I�t� �c�a�n� �d�o� �p�a�r�t�i�a�l� �r�e�p�l�a�y�.�
    �I�t� �i�s� �g�e�n�e�r�i�c� �(�c�a�n� �b�e� �u�s�e�d� �i�n� �y�o�u�r� �o�w�n� �p�r�o�j�e�c�t�s�)���&�����������Z�d�������<�������M�����������������������������������������Configuration example:��������������������(������������
    <appender name="FILE"
         class="ch.qos.logback.core.rolling.RollingFileAppender">
      <File>logFile.log</File>
      <rollingPolicy
    	   class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <FileNamePattern>
               logFile.%d{yyyy-MM-dd}.log.zip
        </FileNamePatter>
      </rollingPolicy>
    
      <layout class="ch.qos.logback.classic.PatternLayout">
        <Pattern>
          %d{HH:mm:ss,SSS} [%thread] %-5level %logger{22} - %msg%n
        </Pattern>
      </layout>
    </appender>��6����������P�5�������,����������v�������������#�������/����������������������������
    ��������������2���������������������
    �����������������������������������
    ��������������$���������������������$��������������(������������<�����������������������������Logback-access configuration��������������������(����������x��<appender name="FILE"	    
                class="c.q.l.c.r.RollingFileAppender">
      <File>access.log"</File>
      <rollingPolicy
            class="c.q.l.c.r.TimeBasedRollingPolicy">
        <FileNamePattern>
          access.%d{yyyy-MM-dd}.log.zip
        </FileNamePattern>
      </rollingPolicy>
    
      <layout class="c.q.l.access.PatternLayout">
        <Pattern">combined</Pattern">
      </layout>
    </appender>��4���y�������P������������������������������.���������������������
    ��������������
    �������������� ��������������������������������������������������������
    ���������������������=���������������������	��������������������Another example:��������������������(������������<testShell name="test1">
      <period>5 minutes</period>
      <!-- we need to configure a totally new test 
           object for each run of the test -->
      <test class="com.wombat.myTest">
        <DataSource class="c.w.JNDIDS">
          <url>jndi://com.wombat/ds"</url>
        </DataSource>
      </test>
    <testShell>
    
    <testShell name="test2">
      <period>60 seconds</period>
      <test class="com.wombat.myTest2">
        <file>c:/wombat/foo.properties</file>
      </test>
    </testShell>��4����������P�������������������������������������	����������������������������
    ��������������
    �������
    �������������������������������������������������
    �������
    �������	��������������	�������[���������������������	�������������������8�����������������������������Is Joran for me?���������a���
    Joran is ideal for building frameworks which need to support arbitrary user-developed plug-ins.
    �����a������������������b���������������������
    ��������������������Internal error reporting���������~���Who shall guard the guards?
    
    Logback modules cannot use logging to report their own state.
    
    Something more generic is needed.
    ��(���������������������b���������������������0�����������������������������Errors in action������������
    Internal state available via StatusManager
    
    Exceptions and status messages accompanied by references, i.e. URLs, to external������������������������	���
    ���������
    ��������������������������������������������������������� ���!���"���#���$���%���&���'���(���)���*���+���,���-���.���/���0���1���2���3���4���5���6���7���8���9���:���;���<���=���>���?���@���A���B���C���D���E���F���G���H���I���J���K���L���M���N���O���P���Q���R���S���T���U���V���W���X���Y���Z���[���\���]���^���_���`���a���b���c���d���e���f���g���h���i���j���k���l���m���n���o���p���q���r���s���t���u���v���w���x���y���z���{���|���}���~����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������	��
    ������
    �������������������������������������� ��!��"��#��$��%��&��'��(��)��*��+��,��-��.��/��0��1��2��3��4��5��6��7��8��9��:��;��<��=��>��?��@��_��B��C��D��E��F��G��H��I��K��L��M��N��O��P��Q��R��S��T��U��V��W��X��Y����^��`��a��b��c��d��e��f��g��h��i��j��k��l��m��n��o��p��q��r��s��t��u��v��w��x��y��z��{��|��}��~����R�o�o�t� �E�n�t�r�y�������������������������������������������������dO��)������������ gcY��������P�i�c�t�u�r�e�s���������������������������������������������������������������������������������������������y�����C�u�r�r�e�n�t� �U�s�e�r����������������������������������������������������������������������������������/��������S�u�m�m�a�r�y�I�n�f�o�r�m�a�t�i�o�n���������������������������(�������������������������������������������A��������P�o�w�e�r�P�o�i�n�t� �D�o�c�u�m�e�n�t���������������������������(����������������������������������������>������D�o�c�u�m�e�n�t�S�u�m�m�a�r�y�I�n�f�o�r�m�a�t�i�o�n�����������8������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
    ����������������	����
    �������v�������������&���l�o�g�b�a�c�k�-�u�s�e�r�@�q�o�s�.�c�h��4���m�a�i�l�t�o�:�l�o�g�b�a�c�k�-�u�s�e�r�@�q�o�s�.�c�h��t�������������,���h�t�t�p�:�/�/�l�o�g�b�a�c�k�.�q�o�s�.�c�h�/��,���h�t�t�p�:�/�/�l�o�g�b�a�c�k�.�q�o�s�.�c�h�/��b�������������"���h�t�t�p�:�/�/�s�v�n�.�q�o�s�.�c�h��$���h�t�t�p�:�/�/�s�v�n�.�q�o�s�.�c�h�/��h�������������&���h�t�t�p�:�/�/�j�i�r�a�.�q�o�s�.�c�h�/��&���h�t�t�p�:�/�/�j�i�r�a�.�q�o�s�.�c�h�/��D��/����0��������|����D���A�r�i�a�l���r� �N�e���0.�8� �0�������8�z[	00�����D���T�i�m�e�s� �N�e�w� �R�o�m�a�n���8� �0�������8�z[	00��� �D���W�i�n�g�d�i�n�g�s���R�o�m�a�n���8� �0�������8�z[	00��0�D���A�r�i�a�l� �B�l�a�c�k���m�a�n���8� �0�������8�z[	00���"@�D���C�o�u�r�i�e�r� �N�e�w���m�a�n���8� �0�������8�z[	00���1������@�����������.��������
    �������	��@�n����?���" ��d������d���������@���������������������  �������@@�������``������������l����d������h�[������:�����������������������������������������������������������*�������*�������������������������������������������������������������������������������������������
    �������
    ������������������������������������������ ������!�������������#������$��������������������'������(������)������*������+������,������-������.������/������0������1������2������3������4������5�������������7������8���������������������������9������:������;������=������<�������������?�������������A������B������C����������������������������������D������E������F������G������H������I������J���X�����������������K������L������M������N������O������P������Q������o����$��������������������������������������b�$���͒^bEN凙=U���������������$��������������������������������������b�$���LMJm /!�������������$��������������������������������������2�$���wlֲ;�A�����q������0��������A��������A��������P����������f����@��������������8�����������������������������	����������������������������cP;	�ʚ;S1�ʚ;���g������������4���d���d���d���d����������P�z[	0��������f:���p��������p��p�������@���<�����4���d���d���d���d���|�	0�.����������������������������������������<�����4���B���d���B���d������|�<	0���������������������g������������4���}���d���}���d����������P�z[	0��������������p��������@��p�������p���8����0��������_�_�_�P�P�T�1�0��������
    ���������?�����������-�O���������
    �=��7�������������������������������������Logback project��������������������������� �������������Ceki Glc & Sbastien Pennec�����������������������8��������������������������������������������������������������������������������~ ���������������������������������No revolution, only evolution.
    log4j is no longer being developed
    The same basic plumbing only done better. 
    Faster, smaller, higher gas mileage, and generally more bang for the buck.�������������Z�������������-�����������������������������Modular architecture������������logback-core
    	Joran, Status,
       Context, pattern parsing
    logback-classic
    	developer logging
    logback-access
    	container (access) logging
    ��V���
    ��������Z�,��������Z���������Z���������Z���������Z���������Z�������������#�����������������������������Access Logging������������Definition: Access log
    		The log generated when a user 	accesses a web-page on a web server.
    
    Logback-access integrates seamlessly with Jetty and Tomcat
     ��<�����������Z�F��������Z�<��������Z���������Z��������������������������������������� ���logback-classic implements SLF4J�����!���������!������(������������Logback offers a native implementation of the SLF4J API => Logback exposes its logging API through SLF4J.
    If you are using logback, you are actually using SLF4J
    SLF4J can delegate to log4j, logback, java.util.logging or JCL
    SLF4J can bridge log4j, JCL and j.u.l.
    ��>���{��������������E��������������(�������������������������������������������������������Joran: a bowl of fresh air�����������G�i�v�e�n� �r�u�l�e�s� �(�p�a�t�t�e�r�n�s� �&� �a�c�t�i�o�n�s�)� �i�t� �c�a�n� �c�o�n�f�i�g�u�r�e� �a�n�y� �o�b�j�e�c�t�.�
    �J�o�r�a�n� �c�a�n� �l�e�a�r�n� �n�e�w� �r�u�l�e�s� �o�n� �t�h�e� �f�l�y�.�
    �W�i�t�h� �i�t�s� �i�m�p�l�i�c�i�t� �r�u�l�e�s�,� �y�o�u� �d�o�n� t� �e�v�e�n� �h�a�v�e� �t�o� �w�r�i�t�e� �r�u�l�e�s�.� �
    �I�t� �c�a�n� �d�o� �p�a�r�t�i�a�l� �r�e�p�l�a�y�.�
    �I�t� �i�s� �g�e�n�e�r�i�c� �(�c�a�n� �b�e� �u�s�e�d� �i�n� �y�o�u�r� �o�w�n� �p�r�o�j�e�c�t�s�)���&�����������Z�d�������<�������M�����������������������������������������Configuration example:��������������������(������������
    <appender name="FILE"
         class="ch.qos.logback.core.rolling.RollingFileAppender">
      <File>logFile.log</File>
      <rollingPolicy
    	   class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <FileNamePattern>
               logFile.%d{yyyy-MM-dd}.log.zip
        </FileNamePatter>
      </rollingPolicy>
    
      <layout class="ch.qos.logback.classic.PatternLayout">
        <Pattern>
          %d{HH:mm:ss,SSS} [%thread] %-5level %logger{22} - %msg%n
        </Pattern>
      </layout>
    </appender>��6����������P�5�������,����������v�������������#�������/����������������������������
    ��������������2���������������������
    �����������������������������������
    ��������������$���������������������$��������������(������������<�����������������������������Logback-access configuration��������������������(����������x��<appender name="FILE"	    
                class="c.q.l.c.r.RollingFileAppender">
      <File>access.log"</File>
      <rollingPolicy
            class="c.q.l.c.r.TimeBasedRollingPolicy">
        <FileNamePattern>
          access.%d{yyyy-MM-dd}.log.zip
        </FileNamePattern>
      </rollingPolicy>
    
      <layout class="c.q.l.access.PatternLayout">
        <Pattern">combined</Pattern">
      </layout>
    </appender>��4���y�������P������������������������������.���������������������
    ��������������
    �������������� ��������������������������������������������������������
    ���������������������=���������������������	��������������������Another example:��������������������(������������<testShell name="test1">
      <period>5 minutes</period>
      <!-- we need to configure a totally new test 
           object for each run of the test -->
      <test class="com.wombat.myTest">
        <DataSource class="c.w.JNDIDS">
          <url>jndi://com.wombat/ds"</url>
        </DataSource>
      </test>
    <testShell>
    
    <testShell name="test2">
      <period>60 seconds</period>
      <test class="com.wombat.myTest2">
        <file>c:/wombat/foo.properties</file>
      </test>
    </testShell>��4����������P�������������������������������������	����������������������������
    ��������������
    �������
    �������������������������������������������������
    �������
    �������	��������������	�������[���������������������	�������������������8�����������������������������Is Joran for me?���������a���
    Joran is ideal for building frameworks which need to support arbitrary user-developed plug-ins.
    �����a������������������b���������������������
    ��������������������Internal error reporting���������~���Who shall guard the guards?
    
    Logback modules cannot use logging to report their own state.
    
    Something more generic is needed.
    ��(���������������������b���������������������0�����������������������������Errors in action������������
    Internal state available via StatusManager
    
    Exceptions and status messages accompanied by references, i.e. URLs, to external documents������������
    �������]������������$������������������������������JMX���������S���
    Logback configuration can be reloaded via JMX
    
    Statistical results exposed via JMX��������������S���������T������������ ��������������������������
    ���Documentation�����
    ��������������������������M�a�j�o�r� �a�r�e�a� �o�f� �e�f�f�o�r�t�.�
    �
    �C�o�m�p�l�e�t�e� �m�a�n�u�a�l�,� �w�i�t�h� �o�v�e�r� �1�5�0� �p�a�g�e�s� �o�f� �d�o�c�u�m�e�n�t�a�t�i�o�n�,� �i�s� �a�v�a�i�l�a�b�l�e� �f�o�r� �f�r�e�e�
    �
    �A� �s�h�o�r�t� �i�n�t�r�o�d�u�c�t�i�o�n� �t�o� �a�c�c�e�s�s� �l�o�g�g�i�n�g� �w�i�t�h� �l�o�g�b�a�c�k�-�a�c�c�e�s�s� �a�n�d� �J�e�t�t�y�
    �
    �j�a�v�a�d�o�c�,� �F�A�Q�,� �e�r�r�o�r� �c�o�d�e�s�,�& 
    �����������������������������������������������������=���������������������������$���Filters, Filters. Filters everywhere�����%���������%������(�������������Filters attachable to any Appender
    Evaluator filters
    Janino filters for evaluation based on java expressions
    TurboFilters for optimized global processing��,���5��������������2��������������!������������!���������
    ��������������������EvaluatorFilter & Janino��,���������������������������������������������<appender name="CYCLIC"
              class="c.q.l.core.read.CyclicBufferAppender">
      <filter class="c.q.l.core.filter.EvaluatorFilter">
        <evaluator name="loggingTaskEval">
    	    <expression>
    		  logger.contains("LoggingTask") &&
            message.contains("Howdydy-diddly-ho") &&
            (timeStamp-loggerContext.getBirthTime()) >= 20000
    		</expression>
    	 </evaluator>
    	 <OnMatch>DENY</OnMatch>
      </filter>
      <MaxSize>512</MaxSize>
    </appender>��4����������P�����������������Z������������
    �������������������������$����������������������������������!�����������������	����������������������������������������������������������������������������������������������������������������������������������������$���������!��������	�����������������������������������������������������������������������������������������������������������;������������������������������TurboFilters�������������������������������<turboFilter
         class="c.q.l.classic.turbo.MDCFilter">
      <MDCKey>userid</MDCKey>
      <Value>sebastien</Value>
      <OnMatch>ACCEPT</OnMatch>
    </turboFilter>��&���9��������Z�`������������������������������������
    ���������������������������������������������������������������	���������������������	����������������������������������������>������������������������������Parameterized logging������������Integer entry = new Interger(50); 
    logger.debug("The entry is "+entry+".");
    
    can be optimized as:
     if(logger.isDebugEnabled()) {
     logger.debug("The entry is "+entry+".");
    }
    
    or better yet:
    logger.debug("The entry is {}.", entry); 
    �������������Z�0���������������������������������K�������������������������������
    �����������������P���#��������������/����������������������������*��������������������������"�������������������������� ���Markers for specialized handling���������V���Markers are metadata for logging statements, coloring them for specialized processing
    �����V������������������W������������L���������������������������/���SiftingAppender or the appender-making appender�����0���������0������(������������� ���������������������������Sift logging according to runtime attributes
    E.g. separate logs according to user sessions, so that the log file generated by every user go into distinct log files, one log file per user. 
    Works with any appender, not just FileAppender�����-��������������������������������	���������������������������������������������������	��������������������������	�����������������-��������.��������������������M���������� ��������������������SiftingAppender (continued)��������������������(��������������������������������������� <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
        <discriminator>
          <Key>userid</Key>
          <DefaultValue>unknown</DefaultValue>
        </discriminator>
        <sift>
          <appender name="FILE-${userid}"
                    class="ch.qos.logback.core.FileAppender">
            <File>${userid}.log</File>s
            <Append>false</Append>
            <layout>
              <Pattern>%d %level %mdc %logger - %msg%n</Pattern>
            </layout>
          </appender>
        </sift>
      </appender>
    ������������P�P�������������������������fG�������������������������f�����������������fJ�����������������f�����������������f�������������������������������������+�����������������
    ���������
    ����������������������������������������������������������������������������
    �������������������������������������������	������������������������� ��������������������������6������������������������������������������������������������������������������������������������������������������������������������%�����������������������������Tested & Ready���������J���Battery of over 450 unit tests
    
    Tests written concomitantly with the code
    ��4���������������������*������������������K������������I�������������������������� ���Package versions in stack traces�����!���������!������(����������n��java.lang.NullPointerException
     at com.xyz.Wombat(Wombat.java:57) ~[wombat-1.3.jar:1.3]
     at com.xyz.Wombat(Wombat.java:76) ~[wombat-1.3.jar:1.3]
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native) ~[na:1.5.0_06]
     at java.lang.reflect.Method.invoke(Method.java:585) ~[na:1.5.0_06]
     at junit.runners.TestMethod.invoke(TestMethod.java:59) [junit-4.4.jar:na]
     etc..��^���o��������B��������������������������������������������������������������Q�����������J�����������������������������logger name abbreviation�����,���������������������������
    ���Odds and ends���������d��RollingFileAppender automatic file compression the background
    FileAppender and RollingFileAppender allow for the same log file to be written to by instances located in different JVMs
    10 fold improvement in the speed of transporting logging events over the wire 
    SMTPAppender now does TLS and SSL, subject line in outgoing email now based on PatternLayout
    
    �����e��������e��������>�����������������P��������������C�������
    �������������������N���������!��������������������Odds and ends II�����������������������������]���%() in pattern strings can do magic
     %-50(%d %level [%thread]) - %m%n
    DuplicateMessage filter��d���$���������"������������������%���������������f���������������f����������������8���B������������������������������������������������O����������"��������������������Odds and ends II�����������������������������]���%() in pattern strings can do magic
     %-50(%d %level [%thread]) - %m%n
    DuplicateMessage filter��d���$���������"������������������%���������������f���������������f����������������8���B������������������������������������������������P����������#��������������������Plans for the near future���������l���Finer threading model leading to less contention
    Better documentation
    Eclipse plug-in to visualize your logs�����H���������������������������
    ���Conclusion�����
    ������������������������b���Logback is the unofficial su����������������������������J����������������������������������������������������������������������������������������������������������������������ccessor of log4j, as the latter is no longer being actively developed.�����&���������������������������
    ���Questions?������������
    read the docs at http://logback.qos.ch/
    study the code at http://svn.qos.ch
    write to us at  logback-user@qos.ch
    file a bug report at http://jira.qos.ch/
    chat with us at irc.freenode.net#qos
    talk to us at +41 21 312 32 26��������������������������������d�������������������������������������������������������������������������������� ��������������������������U
    0��������(����������������������U
    0�����;���L����������������������U
    0�����]���p����������������������U
    0��������������������������������
    U
    0�����������/�������������������������������
    ���������������������������������������������������������������������������������������������������	����������������������
    �����������'����������������������(�����������
    �����������)����������������������*����������������������+����������������������.����������������������1����������������������5����������������������6����������������������7����������������������9����������������������D����������������������E����������������������F����������������������G����������������������K����������������������Q������������������������]���������
    ������������������������-��`���X��@�������������(����	��������������������
    ����������x����
    ����� ��c�$�������������+������<�������`�P �������������
    �+�
    �������������x����
    ����� ��c�$�������������+������<��������������������+�
    ������������X���
    ������
    ���0���A������������������?��������0	�X���
    ������
    ���0���A������������������?���������H����
    ���������0���������޽h������	���?��� ��������������33������������������_�_�_�P�P�T�1�0���i�����.���xPLK���+��������D=�����' ����������������������������=
    ���@B���	����+��������������
    �����������������������-������� ������H���$���(����	��������������������
    ����H������r����
    ���H�� ��S���������t<R������<�������P�0�������������
    �R�
    �������������r����
    ���H�� ��S���������H=R������<������� ` �������������R�
    ������������H����
    ���H������0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���y@1���+��������D=�����' ����������������������������=
    ���@B���	����+��������������
    �����������������������-�������0���������$���(����	��������������������
    ����������r����
    ����� ��S���������������<�������  `�������������
    ��
    �������������r����
    ����� ��S���������ܤ������<�������� `��������������
    ������������H����
    ���������0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���v@o���+��������D=�����' ����������������������������=
    ���@B���	����+�����}���������
    ������������������������\��$���(����	��������������������
    ����\�����r����
    ���\� ��S���������p������<�������  ``�������������
    ��
    �������������r����
    ���\� ��S���������D������<��������
    ��������������
    ������������H����
    ���\�����0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���D@+���+��������D=�����' ����������������������������=
    ���@B���	����+��������������
    ��������������������������h��V���(����	��������������������
    ����h�����x����
    ���h� ��c�$��������D_������<������������`�������������
    �_�
    �����������������
    ���h� ��c�$��������_������<����������� ��������������_�
    2�������������������P���Q!pT�H����
    ���h�����0���������޽h������	���?��� �������������XXZ�>������������������_�_�_�P�P�T�1�0���i�����.���SH���+��������D=�����' ����������������������������=
    ���@B���	����+�����}���������
    ��������������������������<��$���(����	��������������������
    ����<�����r����
    ���<� ��S���������������<�������  `�������������
    ��
    �������������r����
    ���<� ��S���������X������<������� `p��������������
    ������������H����
    ���<�����0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���| 5\���+��������D=�����' �����������������������������=
    ���@B���	����+��������������
    0������������P��)���(����	��������������������
    ����P�����X����
    ���P� ��C������������������ 
    ������������������
    ���P� ��S����������������������
    0��������������
    +��������������At the end of each stack frame, logback will add a packaging information for the corresponding class. Packaging information consists of the containing jar file and versioning information. The inclusion of packaging information shortens the time it takes to identify software problems.
    
    Logback tries hard to give you the correct packaging information. However, if for any reason it is unsure, it will prefix packaging information with a ~.��$���������������������������������,��� ������������������������������������H����
    ���P�����0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���%hd�������!���
    0�q���i���������d�����(����	��������������������
    ����d�����X����
    ���d� ��C������������������ 
    ��������������_�i���
    ���d� ��S���������@�������������
    0�������������_�
    ���������������%() can be used to group parts of your logging output. Try it out!
    
    DuplicateMessageFilter will automatically filter out message if they repeateded over and over again.
    ��>���D��������������/�������
    �������������������������������H����
    ���d�����0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���0벭��rD��������M���Q�,��S�H��v[�K��]�N��:V�P� �X�b��������?
    ��e����Q������E���(��������������
    ����������������	����
    �������v�������������&���l�o�g�b�a�c�k�-�u�s������������������������	���
    ���������
    ����������������������������������������������������������������������՜.�+,D���՜.�+,�������������������������������������������������	������
    �����������������������������������
    ��������^�������������On-screen Show��������CG�s���>�����������������������������������A
    
    �������������������������������$������Arial����Times New Roman�
    ���Wingdings����Arial Black����Courier New����Pixel����Logback project����~ ����Modular architecture����Access Logging�!���logback-classic implements SLF4J����Joran: a bowl of fresh air����Configuration example:����Logback-access configuration����Another example:����Is Joran for me?����Internal error reporting����Errors in action����JMX����Documentation�%���Filters, Filters. Filters everywhere����EvaluatorFilter & Janino�
    ���TurboFilters����Parameterized logging�!���Markers for specialized handling�0���SiftingAppender or the appender-making appender����SiftingAppender (continued)����Tested & Ready�!���Package versions in stack traces����logger name abbreviation����Odds and ends����Odds and ends II����Odds and ends II����Plans for the near future����Conclusion����Questions?������������Fonts Used�������������Design Template����������
    ���Slide Titles�������������������(������X������`�����������������_PID_HLINKS�������Without Tagging������A���������������������������������������m�a�i�l�t�o�:�l�o�g�b�a�c�k�-�u�s�e�r�@�q�o�s�.�c�h����������������������������������������������h�t�t�p�:�/�/�l�o�g�b�a�c�k�.�q�o�s�.�c�h�/����������������������������������������������h�t�t�p�:�/�/�s�v�n�.�q�o�s�.�c�h�/����������������������������������������������h�t�t�p�:�/�/�j�i�r�a�.�q�o�s�.�c�h�/�������������������1�th��������������������������������������������������������������������_���� Ceki��� �C�e�k�i�������������������������������������������������������������������������������������������������������������������������������������������������� documents������������
    �������]������������$������������������������������JMX���������S���
    Logback configuration can be reloaded via JMX
    
    Statistical results exposed via JMX��������������S���������T������������ ��������������������������
    ���Documentation�����
    ��������������������������M�a�j�o�r� �a�r�e�a� �o�f� �e�f�f�o�r�t�.�
    �
    �C�o�m�p�l�e�t�e� �m�a�n�u�a�l�,� �w�i�t�h� �o�v�e�r� �1�5�0� �p�a�g�e�s� �o�f� �d�o�c�u�m�e�n�t�a�t�i�o�n�,� �i�s� �a�v�a�i�l�a�b�l�e� �f�o�r� �f�r�e�e�
    �
    �A� �s�h�o�r�t� �i�n�t�r�o�d�u�c�t�i�o�n� �t�o� �a�c�c�e�s�s� �l�o�g�g�i�n�g� �w�i�t�h� �l�o�g�b�a�c�k�-�a�c�c�e�s�s� �a�n�d� �J�e�t�t�y�
    �
    �j�a�v�a�d�o�c�,� �F�A�Q�,� �e�r�r�o�r� �c�o�d�e�s�,�& 
    �����������������������������������������������������=���������������������������$���Filters, Filters. Filters everywhere�����%���������%������(�������������Filters attachable to any Appender
    Evaluator filters
    Janino filters for evaluation based on java expressions
    TurboFilters for optimized global processing��,���5��������������2��������������!������������!���������
    ��������������������EvaluatorFilter & Janino��,���������������������������������������������<appender name="CYCLIC"
              class="c.q.l.core.read.CyclicBufferAppender">
      <filter class="c.q.l.core.filter.EvaluatorFilter">
        <evaluator name="loggingTaskEval">
    	    <expression>
    		  logger.contains("LoggingTask") &&
            message.contains("Howdydy-diddly-ho") &&
            (timeStamp-loggerContext.getBirthTime()) >= 20000
    		</expression>
    	 </evaluator>
    	 <OnMatch>DENY</OnMatch>
      </filter>
      <MaxSize>512</MaxSize>
    </appender>��4����������P�����������������Z������������
    �������������������������$����������������������������������!�����������������	����������������������������������������������������������������������������������������������������������������������������������������$���������!��������	�����������������������������������������������������������������������������������������������������������;������������������������������TurboFilters�������������������������������<turboFilter
         class="c.q.l.classic.turbo.MDCFilter">
      <MDCKey>userid</MDCKey>
      <Value>sebastien</Value>
      <OnMatch>ACCEPT</OnMatch>
    </turboFilter>��&���9��������Z�`������������������������������������
    ���������������������������������������������������������������	���������������������	����������������������������������������>������������������������������Parameterized logging������������Integer entry = new Interger(50); 
    logger.debug("The entry is "+entry+".");
    
    can be optimized as:
     if(logger.isDebugEnabled()) {
     logger.debug("The entry is "+entry+".");
    }
    
    or better yet:
    logger.debug("The entry is {}.", entry); 
    �������������Z�0���������������������������������K�������������������������������
    �����������������P���#��������������/����������������������������*��������������������������"�������������������������� ���Markers for specialized handling���������V���Markers are metadata for logging statements, coloring them for specialized processing
    �����V������������������W������������L���������������������������/���SiftingAppender or the appender-making appender�����0���������0������(������������� ���������������������������Sift logging according to runtime attributes
    E.g. separate logs according to user sessions, so that the log file generated by every user go into distinct log files, one log file per user. 
    Works with any appender, not just FileAppender�����-��������������������������������	���������������������������������������������������	��������������������������	�����������������-��������.��������������������M���������� ��������������������SiftingAppender (continued)��������������������(��������������������������������������� <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
        <discriminator>
          <Key>userid</Key>
          <DefaultValue>unknown</DefaultValue>
        </discriminator>
        <sift>
          <appender name="FILE-${userid}"
                    class="ch.qos.logback.core.FileAppender">
            <File>${userid}.log</File>s
            <Append>false</Append>
            <layout>
              <Pattern>%d %level %mdc %logger - %msg%n</Pattern>
            </layout>
          </appender>
        </sift>
      </appender>
    ������������P�P�������������������������fG�������������������������f�����������������fJ�����������������f�����������������f�������������������������������������+�����������������
    ���������
    ����������������������������������������������������������������������������
    �������������������������������������������	������������������������� ��������������������������6������������������������������������������������������������������������������������������������������������������������������������%�����������������������������Tested & Ready���������J���Battery of over 450 unit tests
    
    Tests written concomitantly with the code
    ��4���������������������*������������������K������������I�������������������������� ���Package versions in stack traces�����!���������!������(����������n��java.lang.NullPointerException
     at com.xyz.Wombat(Wombat.java:57) ~[wombat-1.3.jar:1.3]
     at com.xyz.Wombat(Wombat.java:76) ~[wombat-1.3.jar:1.3]
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native) ~[na:1.5.0_06]
     at java.lang.reflect.Method.invoke(Method.java:585) ~[na:1.5.0_06]
     at junit.runners.TestMethod.invoke(TestMethod.java:59) [junit-4.4.jar:na]
     etc..��^���o��������B��������������������������������������������������������������Q�����������J������������������������������logger name abbreviation�����,���������������������������
    ���Odds and ends���������d��RollingFileAppender automatic file compression the background
    FileAppender and RollingFileAppender allow for the same log file to be written to by instances located in different JVMs
    10 fold improvement in the speed of transporting logging events over the wire 
    SMTPAppender now does TLS and SSL, subject line in outgoing email now based on PatternLayout
    
    �����e��������e��������>�����������������P��������������C�������
    �������������������N���������!��������������������Odds and ends II�����������������������������]���%() in pattern strings can do magic
     %-50(%d %level [%thread]) - %m%n
    DuplicateMessage filter��d���$���������"������������������%���������������f���������������f����������������8���B������������������������������������������������O����������"��������������������Odds and ends II�����������������������������]���%() in pattern strings can do magic
     %-50(%d %level [%thread]) - %m%n
    DuplicateMessage filter��d���$���������"������������������%���������������f���������������f����������������8���B������������������������������������������������P����������#��������������������Plans for the near future���������l���Finer threading model leading to less contention
    Better documentation
    Eclipse plug-in to visualize your logs�����H���������������������������
    ���Conclusion�����
    ������������������������b���Logback is the unofficial successor of log4j, as the latter is no longer being actively developed.�����&���������������������������
    ���Questions?������������
    read the docs at http://logback.qos.ch/
    study the code at http://svn.qos.ch
    write to us at  logback-user@qos.ch
    file a bug report at http://jira.qos.ch/
    chat with us at irc.freenode.net#qos
    talk to us at +41 21 312 32 26��������������������������������d�������������������������������������������������������������������������������� ��������������������������U
    0��������(����������������������U
    0�����;���L����������������������U
    0�����]���p����������������������U
    0��������������������������������
    U
    0�����������/�������������������������������
    ���������������������������������������������������������������������������������������������������	����������������������
    �����������'����������������������(�����������
    �����������)����������������������*����������������������+����������������������.����������������������1����������������������5����������������������6����������������������7����������������������9����������������������D����������������������E����������������������F����������������������G����������������������K����������������������Q������������������������]���������
    ������������������������-��`���X��@�������������(����	��������������������
    ����������x����
    ����� ��c�$�������������,������<�������`�P �������������
    �,�
    �������������x����
    ����� ��c�$�������������P,������<��������������������,�
    ������������X���
    ������
    ���0���A������������������?��������0	�X���
    ������
    ���0���A������������������?���������H����
    ���������0���������޽h������	���?��� ��������������33������������������_�_�_�P�P�T�1�0���i�����.���xPLK���+��������D=�����' ����������������������������=
    ���@B���	����+������r�����e���w��������?
    �ae�ܮ����Q������E���(��������������
    ����������������	����
    �������v�������������&���l�o�g�b�a�c�k�-�u�s�e�r�@�q�o�s�.�c�h��4���m�a�i�l�t�o�:�l�o�g�b�a�c�k�-�u�s�e�r�@�q�o�s�.�c�h��t�������������,���h�t�t�p�:�/�/�l�o�g�b�a�c�k�.�q�o�s�.�c�h�/��,���h�t�t�p�:�/�/�l�o�g�b�a�c�k�.�q�o�s�.�c�h�/��b�������������"���h�t�t�p�:�/�/�s�v�n�.�q�o�s�.�c�h��$���h�t�t�p�:�/�/�s�v�n�.�q�o�s�.�c�h�/��h�������������&���h�t�t�p�:�/�/�j�i�r�a�.�q�o�s�.�c�h�/��&���h�t�t�p�:�/�/�j�i�r�a�.�q�o�s�.�c�h�/��D��/����0��������|����D���A�r�i�a�l���r� �N�e���0.�8� �0�������8�z[	00�����D���T�i�m�e�s� �N�e�w� �R�o�m�a�n���8� �0�������8�z[	00��� �D���W�i�n�g�d�i�n�g�s���R�o�m�a�n���8� �0�������8�z[	00��0�D���A�r�i�a�l� �B�l�a�c�k���m�a�n���8� �0�������8�z[	00���"@�D���C�o�u�r�i�e�r� �N�e�w���m�a�n���8� �0�������8�z[	00���1������@�����������.��������
    �������	��@�n����?���" ��d������d���������@���������������������  �������@@�������``������������l����d������h�[������:�����������������������������������������������������������*�������*�������������������������������������������������������������������������������������������
    �������
    ������������������������������������������ ������!�������������#������$��������������������'������(������)������*������+������,������-������.������/������0������1������2������3������4������5�������������7������8���������������������������9������:������;������=������<�������������?�������������A������B������C����������������������������������D������E������F������G������H������I������J���X�����������������K������L������M������N������O������P������Q������o����$��������������������������������������b�$���͒^bEN凙=U���������������$��������������������������������������b�$���LMJm /!�������������$��������������������������������������2�$���wlֲ;�A�����q������0��������A��������A��������P����������f����@��������������8�����������������������������	����������������������������cP;	�ʚ;S1�ʚ;���g������������4���d���d���d���d����������P�z[	0�����������p��������p��p�������@���<�����4���d���d���d���d���|�	0�.����������������������������������������<�����4���B���d���B���d������|�<	0���������������������g������������4���}���d���}���d����������P�z[	0��������������p��������@��p�������p���8����0��������_�_�_�P�P�T�1�0��������
    ���������?�����������-�O���������
    �=��8�������������������������������������Logback project��������������������������� �������������Ceki Glc & Sbastien Pennec�����������������������8��������������������������������������������������������������������������������~ ���������������������������������No revolution, only evolution.
    log4j is no longer being actively developed
    The same basic plumbing only done better. 
    Faster, smaller, higher gas mileage, and generally more bang for the buck.�������������Z�������������8���������������w������������-�����������������������������Modular architecture������������logback-core
    	Joran, Status,
       Context, pattern parsing
    logback-classic
    	developer logging
    logback-access
    	container (access) logging
    ��V���
    ��������Z�,��������Z���������Z���������Z���������Z���������Z�������������#�����������������������������Access Logging������������Definition: Access log
    		The log generated when a user 	accesses a web-page on a web server.
    
    Logback-access integrates seamlessly with Jetty and Tomcat
     ��<�����������Z�F��������Z�<��������Z���������Z��������������������������������������� ���logback-classic implements SLF4J�����!���������!������(������������Logback offers a native implementation of the SLF4J API => Logback exposes its logging API through SLF4J.
    If you are using logback, you are actually using SLF4J
    SLF4J can delegate to log4j, logback, java.util.logging or JCL
    SLF4J can bridge log4j, JCL and j.u.l.
    ��>���{��������������E��������������(�������������������������������������������������������Joran: a bowl of fresh air�����������G�i�v�e�n� �r�u�l�e�s� �(�p�a�t�t�e�r�n�s� �&� �a�c�t�i�o�n�s�)� �i�t� �c�a�n� �c�o�n�f�i�g�u�r�e� �a�n�y� �o�b�j�e�c�t�.�
    �J�o�r�a�n� �c�a�n� �l�e�a�r�n� �n�e�w� �r�u�l�e�s� �o�n� �t�h�e� �f�l�y�.�
    �W�i�t�h� �i�t�s� �i�m�p�l�i�c�i�t� �r�u�l�e�s�,� �y�o�u� �d�o�n� t� �e�v�e�n� �h�a�v�e� �t�o� �w�r�i�t�e� �r�u�l�e�s�.� �
    �I�t� �c�a�n� �d�o� �p�a�r�t�i�a�l� �r�e�p�l�a�y�.�
    �I�t� �i�s� �g�e�n�e�r�i�c� �(�c�a�n� �b�e� �u�s�e�d� �i�n� �y�o�u�r� �o�w�n� �p�r�o�j�e�c�t�s�)���&�����������Z�d�������<�������M�����������������������������������������Configuration example:��������������������(������������
    <appender name="FILE"
         class="ch.qos.logback.core.rolling.RollingFileAppender">
      <File>logFile.log</File>
      <rollingPolicy
    	   class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <FileNamePattern>
               logFile.%d{yyyy-MM-dd}.log.zip
        </FileNamePatter>
      </rollingPolicy>
    
      <layout class="ch.qos.logback.classic.PatternLayout">
        <Pattern>
          %d{HH:mm:ss,SSS} [%thread] %-5level %logger{22} - %msg%n
        </Pattern>
      </layout>
    </appender>��6����������P�5�������,����������v�������������#�������/����������������������������
    ��������������2���������������������
    �����������������������������������
    ��������������$���������������������$��������������(������������<�����������������������������Logback-access configuration��������������������(����������x��<appender name="FILE"	    
                class="c.q.l.c.r.RollingFileAppender">
      <File>access.log"</File>
      <rollingPolicy
            class="c.q.l.c.r.TimeBasedRollingPolicy">
        <FileNamePattern>
          access.%d{yyyy-MM-dd}.log.zip
        </FileNamePattern>
      </rollingPolicy>
    
      <layout class="c.q.l.access.PatternLayout">
        <Pattern">combined</Pattern">
      </layout>
    </appender>��4���y�������P������������������������������.���������������������
    ��������������
    �������������� ��������������������������������������������������������
    ���������������������=���������������������	��������������������Another example:��������������������(������������<testShell name="test1">
      <period>5 minutes</period>
      <!-- we need to configure a totally new test 
           object for each run of the test -->
      <test class="com.wombat.myTest">
        <DataSource class="c.w.JNDIDS">
          <url>jndi://com.wombat/ds"</url>
        </DataSource>
      </test>
    <testShell>
    
    <testShell name="test2">
      <period>60 seconds</period>
      <test class="com.wombat.myTest2">
        <file>c:/wombat/foo.properties</file>
      </test>
    </testShell>��4����������P�������������������������������������	����������������������������
    ��������������
    �������
    �������������������������������������������������
    �������
    �������	��������������	�������[���������������������	�������������������8�����������������������������Is Joran for me?���������a���
    Joran is ideal for building frameworks which need to support arbitrary user-developed plug-ins.
    �����a������������������b���������������������
    ��������������������Internal error reporting���������~���Who shall guard the guards?
    
    Logback modules cannot use logging to report their own state.
    
    Something more generic is needed.
    ��(���������������������b���������������������0�����������������������������Errors in action������������
    Internal state available via StatusManager
    
    Exceptions and status messages accompanied by references, i.e. URLs, to external documents������������
    �������]������������$������������������������������JMX���������S���
    Logback configuration can be reloaded via JMX
    
    Statistical results exposed via JMX��������������S���������T������������ ��������������������������
    ���Documentation�����
    ��������������������������M�a�j�o�r� �a�r�e�a� �o�f� �e�f�f�o�r�t�.�
    �
    �C�o�m�p�l�e�t�e� �m�a�n�u�a�l�,� �w�i�t�h� �o�v�e�r� �1�5�0� �p�a�g�e�s� �o�f� �d�o�c�u�m�e�n�t�a�t�i�o�n�,� �i�s� �a�v�a�i�l�a�b�l�e� �f�o�r� �f�r�e�e�
    �
    �A� �s�h�o�r�t� �i�n�t�r�o�d�u�c�t�i�o�n� �t�o� �a�c�c�e�s�s� �l�o�g�g�i�n�g� �w�i�t�h� �l�o�g�b�a�c�k�-�a�c�c�e�s�s� �a�n�d� �J�e�t�t�y�
    �
    �j�a�v�a�d�o�c�,� �F�A�Q�,� �e�r�r�o�r� �c�o�d�e�s�,�& 
    �����������������������������������������������������=���������������������������$���Filters, Filters. Filters everywhere�����%���������%������(�������������Filters attachable to any Appender
    Evaluator filters
    Janino filters for evaluation based on java expressions
    TurboFilters for optimized global processing��,���5��������������2��������������!������������!���������
    ��������������������EvaluatorFilter & Janino��,���������������������������������������������<appender name="CYCLIC"
              class="c.q.l.core.read.CyclicBufferAppender">
      <filter class="c.q.l.core.filter.EvaluatorFilter">
        <evaluator name="loggingTaskEval">
    	    <expression>
    		  logger.contains("LoggingTask") &&
            message.contains("Howdydy-diddly-ho") &&
            (timeStamp-loggerContext.getBirthTime()) >= 20000
    		</expression>
    	 </evaluator>
    	 <OnMatch>DENY</OnMatch>
      </filter>
      <MaxSize>512</MaxSize>
    </appender>��4����������P�����������������Z������������
    �������������������������$����������������������������������!�����������������	����������������������������������������������������������������������������������������������������������������������������������������$���������!��������	�����������������������������������������������������������������������������������������������������������;������������������������������TurboFilters�������������������������������<turboFilter
         class="c.q.l.classic.turbo.MDCFilter">
      <MDCKey>userid</MDCKey>
      <Value>sebastien</Value>
      <OnMatch>ACCEPT</OnMatch>
    </turboFilter>��&���9��������Z�`������������������������������������
    ���������������������������������������������������������������	���������������������	����������������������������������������>������������������������������Parameterized logging������������Integer entry = new Interger(50); 
    logger.debug("The entry is "+entry+".");
    
    can be optimized as:
     if(logger.isDebugEnabled()) {
     logger.debug("The entry is "+entry+".");
    }
    
    or better yet:
    logger.debug("The entry is {}.", entry); 
    �������������Z�0���������������������������������K�������������������������������
    �����������������P���#��������������/����������������������������*��������������������������"�������������������������� ���Markers for specialized handling���������V���Markers are metadata for logging statements, coloring them for specialized processing
    �����V������������������W������������L���������������������������/���SiftingAppender or the appender-making appender�����0���������0������(������������� ���������������������������Sift logging according to runtime attributes
    E.g. separate logs according to user sessions, so that the log file generated by every user go into distinct log files, one log file per user. 
    Works with any appender, not just FileAppender�����-��������������������������������	���������������������������������������������������	��������������������������	�����������������-��������.��������������������M���������� ��������������������SiftingAppender (continued)��������������������(��������������������������������������� <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
        <discriminator>
          <Key>userid</Key>
          <DefaultValue>unknown</DefaultValue>
        </discriminator>
        <sift>
          <appender name="FILE-${userid}"
                    class="ch.qos.logback.core.FileAppender">
            <File>${userid}.log</File>s
            <Append>false</Append>
            <layout>
              <Pattern>%d %level %mdc %logger - %msg%n</Pattern>
            </layout>
          </appender>
        </sift>
      </appender>
    ������������P�P�������������������������fG�������������������������f�����������������fJ�����������������f�����������������f�������������������������������������+�����������������
    ���������
    ����������������������������������������������������������������������������
    �������������������������������������������	������������������������� ��������������������������6������������������������������������������������������������������������������������������������������������������������������������%�����������������������������Tested & Ready���������J���Battery of over 450 unit tests
    
    Tests written concomitantly with the code
    ��4���������������������*������������������K������������I�������������������������� ���Package versions in stack traces�����!���������!������(����������n��java.lang.NullPointerException
     at com.xyz.Wombat(Wombat.java:57) ~[wombat-1.3.jar:1.3]
     at com.xyz.Wombat(Wombat.java:76) ~[wombat-1.3.jar:1.3]
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native) ~[na:1.5.0_06]
     at java.lang.reflect.Method.invoke(Method.java:585) ~[na:1.5.0_06]
     at junit.runners.TestMethod.invoke(TestMethod.java:59) [junit-4.4.jar:na]
     etc..��^���o��������B��������������������������������������������������������������Q�����������J������������������������������logger name abbreviation�����,���������������������������
    ���Odds and ends���������d��RollingFileAppender automatic file compression the background
    FileAppender and RollingFileAppender allow for the same log file to be written to by instances located in different JVMs
    10 fold improvement in the speed of transporting logging events over the wire 
    SMTPAppender now does TLS and SSL, subject line in outgoing email now based on PatternLayout
    
    �����e��������e��������>�����������������P��������������C�������
    �������������������N���������!��������������������Odds and ends II�����������������������������]���%() in pattern strings can do magic
     %-50(%d %level [%thread]) - %m%n
    DuplicateMessage filter��d���$���������"������������������%���������������f���������������f����������������8���B������������������������������������������������O����������"��������������������Odds and ends II�����������������������������]���%() in pattern strings can do magic
     %-50(%d %level [%thread]) - %m%n
    DuplicateMessage filter��d���$���������"������������������%���������������f���������������f����������������8���B������������������������������������������������P����������#��������������������Plans for the near future���������l���Finer threading model leading to less contention
    Better documentation
    Eclipse plug-in to visualize your logs�����H���������������������������
    ���Conclusion�����
    ������������������������b���Logback is the unofficial successor of log4j, as the latter is no longer being actively developed.�����&���������������������������
    ���Questions?������������
    read the docs at http://logback.qos.ch/
    study the code at http://svn.qos.ch
    write to us at  logback-user@qos.ch
    file a bug report at http://jira.qos.ch/
    chat with us at irc.freenode.net#qos
    talk to us at +41 21 312 32 26��������������������������������d�������������������������������������������������������������������������������� ��������������������������U
    0��������(����������������������U
    0�����;���L����������������������U
    0�����]���p����������������������U
    0��������������������������������
    U
    0�����������/�������������������������������
    ���������������������������������������������������������������������������������������������������	����������������������
    �����������'����������������������(�����������
    �����������)����������������������*����������������������+����������������������.����������������������1����������������������5����������������������6����������������������7����������������������9����������������������D����������������������E����������������������F����������������������G����������������������K����������������������Q�������������������������r�������������?
    ��
    ����Q�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/logback-2011.ppt�������������������������������������0000644�0001750�0001750�00001046000�11524705454�024005� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ࡱ����������������;��	���������������#����������������������������������"��������������	���
    ���������
    ��������������������������������������������������������� ���!���"���#���$���%���&���'���(���)���*���+���,���-���.���/���0���1���2���3���4���5���6���7���8���9���:���;���<���=���>���?���@���A���B���C���D���E���F���G���H���I���J���K���L���M���N���O���P���Q���R���S���T���U���V���W���X���Y���Z���[���\���]���^���_���`���a���b���c���d���e���f���g���h���i���j���k���l���m���n���o���p���q���r���s���t���u���v���w���x���y���z���{���|���}���~���������R�o�o�t� �E�n�t�r�y����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������	���
    ����������
    ��dO��)���MS PowerPoint 97��������������������������������������������������������������������������������$������_�����Current User����������������������������������������������՜.�+,D���՜.�+,\�����������������������������0������t������|��������������������
    ���_PID_GUID�������_PID_HLINKS�������Without Tagging��������A���N���{�D�B�1�A�C�9�6�4�-�E�3�9�C�-�1�1�D�2�-�A�1�E�F�-�0�0�6�0�9�7�D�A�5�6�8�9�}�����A���0���������n��:����t!D��PNG
    
    ���
    IHDR���������I*Zr���sRGB����	pHYs����od��IDATx^$yvFdDddw/weNx%�bH
    \]@%DEJgE`%Q%	 f`{]UwF?2etz@yU7w/]{ߏouCӴN~;yYgϻͻn;<z4^E2tnY>ϻdUo''ڑ
    w	3#Qw^Uy?;轔gmޗ*Wx6'>nO{q#<#=bg}=W9:>6Spijj-*l{;lN9;^m[Ƅ?ZCC[zk{gy+kӏ|]|uOQR(}^4Lqhiʷed|HVp~w:7]VHnCbg3X0VF1MZDVUeթwdYC')u^3nyxHzS<l`GyC=ΞMZ%N7�gx"kM#oDT6Im2ݺvu,R\/3_]EWepQPO[_lqxש^=ڔ=y9+.<=Eݨ{Nw=gj3G6A=X
    DS٩7&6;roQ=MwO6>G6m^nNe6bw^M0/zרWJ;}Dasbx2meއO>NQzFF2L=l䮆y$m+&Q
    O=a|˃/3K7	,BMI2#?><o w,
    57o~q`T\[O~*s~0n1,xJ[{>ݔ*ʼaK)ٷ%meoceQy<tsp>98[թUR! cJbnRj=oYTWϭQ1͘MHu㢔ẸGe)68+Iɟ0!WovxL|M<Եfְ ;b}c XDvhmC{@@Fq>-cWSg™a7(%>*GL~lCt:~dn,Tϳ6l
    2}]f$iуpk=+IFϞ22s
    K
    ~\:=byR54h]inL-~�?gF*uTrǾ}ePofaw<dat1ŗx*F`I@Kսw?{nힲmu[ԑ=^Ws'`N<b%-f9>o؜^$.=;Q{yz+}|ϻa"-[޹
    KS0u)񬧯u5V\<YͭtViu]mXV%J	|{^{@6B;M	'M4&/#UZ
    oY~C'N߇mKƬ;acm:гtHR!0NbZL]"FD.u%uCm=Ѝ^3|֠5\uZn34:Ų*;V\_+ Jv{p8f=ihV
    ﶿ	l_\d31{*_NIs6!%?*Ie#>ZWfyDչst:+{6}<;MG.mD$5Ļ*&Ye
    /zU]705>àg"wm;Mw0zoZZQ(VsFT-+;09 m7i
    BNKo޶,;>KrvoX&0?ɐZJ>?0gmQ:~y:&:8]Mnr	GMrr
    9`%kS˫<zfw7L) F6Q	'uɰhhu15͕كr)_HA(D"`�_71zdn@ �ZJQA@$=bus@$
    \lj*03ӁKAxfY|L/?w7oã!
    k}pssՁIau;xՁw9
    9qtF=%uFnP<ݞ&"[iȺz~,o:͵zƙI'ⱅT<<vcW/ԓAzSb͵VkP.^nBPM˞\~d!֬`v>rFz4hM~8V,=ޯ3DR	kSIk{ۆay򏘵-o~ȅ7ziɁT5'ws1M~J=w>|skgk}kk{R)WWWϝ=x$bJB/g}}ŐƭdbTʁMWk)fYV
    ѻZ1
    J٭T1?>{ꆃiXD
    a)>LQ:DcQS?)k#aM9HO$}1a6q
    M(ksbm-$YV+㧺rue}A V䅼E}˥[kwv{Z88?lx4ÓZCfvzd~|a`GF=+#Aq)H[;Ϗ3kkMn60u⠿8!⯁ch4~{-jVgO})-e-DV0l6-c]sc(HoTFMrGZ48ގznIomw lHȚpV=39*dC8^7p[DK}P
    ^c@	ZbPV׳l$[Y\J0^`^bd_h~Nf	x-6[wzZBh7lj16^k4{V4nܾ+地Ep#WVw>rf9DҜ-BFkAzc\B8Wc>ZGߓ#(3r
    5"@
    RzM,Ur_I|wjs66h6I>S7p/u^hz?9ɨ1d:hf^(C~Z-p\_Ƒ9mFB�08msg"WaD_4zCxi~K	N|00UqP<&b.v @7|ܓbԌԂX^jӶ*:MeЫ)/YTGYwahi$)ᘋy/1fm癨tGȃ%l89$rMcG:6IUōjCV*Uxf7;3X}#Ɲuײf}`%N+`zjN4+n
    bbԞ'uVFk6Z1bjڵ@ءt-JeQjq[̛>_[YAݜ-iu%
    o!DŽgu?nKv;'ו;t\ (yX
    $(Q6\M|qN+@
    0REmtME YDk]ngvrVtZFt`,(U`L/
    X_׍Ya/	kF&	c~\Y^Žfn״fAh%_xxFbM�NiuJ0p8Wڪaڭ"gj+'c魍
    ӫg-dA_"bm +tS
    GSU@8'�>t8`ǀ}eZ!N6^Pe^\U`ki=aSH
    %pcZZ?]2wVWp09+bv
    %CfOrЎܢ
    m`ǜ<Yokz26Ө9N(Ddoij]cF<XŴA[ީԋ.߸uExl:kPĒ	nX\H
    z˯q#ȇ\r"F,M-�iQ̂<UM%oK>u:JrHė
    hQKjnsQ9S!rGT$q7I,8"D(<|J=}"vzzI1΀cլ0j]\%w̰rY_(PCv)5uPRž+
    !ﴻ|៚oSlW]cKSAVY5Jf0Mď-vО/433ӅRjEQ\Q @7^%Fsϛ76vӏ=3O=o(Q>U\\0$Fυ	œu]	x}`rS
    ki|!o<c\@61h)ib4HF2$![>nldk<^�};D2CDChIMҫV
    ^6}MQ[==ۑjZAJFim0vEiIj(GZ4+^ѪmolltNj:](猀83NՀ?H@N\.NMM67k~'+Uk4j
    ~$kESo^璟G}vǶd*02%&@cR�#_KSڢ%FxZ^T‹2I/,p#eCA&YÒT$dqȾ"16Yx2\"~_ȯE˅1V(sHH܋n5۵hm)	񦜔55.�_�VSY*V1AnC7mB*}efg-|d\:?ʅAGY,cWoӃQ73_(z/_}X<U6IKyH(F%ԉR(@K㛲�Zn-	WvB+'y'Z18džUJPueh$hŀ(Nוj#uܠm"E
    ~/,"�ewI7	m-t�E3
    thS}Ap{z
    fFN1֮-6}~\rRU)J2an3:V(SߑrfI3Z	<gC*Y+r idBzz*h0d#z"n>٩9;
    F.mi	Gl?sxsK+'v=_sr>x,DZF'*QUAma܎uTWpNSKNFw!#�g+;9�	&$g(!~	>?nLP,>jUi5	U̠+(YoWu_,!3
    JaV<6ӶMˏwiSɈOG9(W%(
    >VWá)ADq'.OKkhNϿqK/^CB9SӔKTxff.OIo{M,^7-#Tjd
    c�FcF$OѴ2ZrnA#�doa{}cm1?Lu:[_9(QNUjB1[	tcx,k"6$&UB2AѡdAN6%lLE`4|
    	cesX(ި>R޽R	p8vGu%9ĒcM=pܙk P-
    iJ
    3N�ƻ]#z[VhyZKJK+Bi'N~?t֭ǏB,MRQ(>P$:-B<p6w`.OR(qN/6X~tbAT$ɄTҳR]>N#>Y*ǗLBXqMPR3.\W]ЁAnTm\%cFL%>2mx2<n7`ٷa42?y1=r(6>&~opuSL\©kvXzsTkۅ˧3ٕp8`A3rH&]_=ߪ-s285:^5}N
    j^gfQo'BViZ\z7_muOȧ)vo}!Hhk<{氰2O~tf&Tc~ٔf;$~"E<߼t!Q:V*e\h@K6pbe	`m//>\;6+];#ߦ豒[
    A7Z8<l׺P{PSĢHOM/@KLՌ{*�HZ#!,SX)UR^ՎQ)ԷBY|"Wo\m!<;c'9䩕'<9×1P8}@U皀UF 8pL=g783BN,�4(i	=dl<~A2 
    h<Hݍ߲TR!"z\~j',
    BH0@KK3iBl<Nuxؖ;P&aƤ ^C2T
    !{momʁ\r$Pqg97/LBr-\|[n狭C!M:=3$otmF)l2o	09F{]nE6[Z-}$M׀(wr~S^Ȓfny`+av/qVHyff͟p(wh̚7lhmK&\H%E9g`$tڨM'rtRkRP�t4sJtb!:tċq.[\]r`h4t±	d:3I%߰k6==?133ݒ$OǧNr%s<iMZFְ)"<25	ێMUޗixTo״VNe[Nڽpوw:q{?
    \N_p+:4�a$5:Z7];Z5(77sF֫R:X*z#LO$'
    Nt1`Ek6%Ri0*t»lGdӛ&IXZڬ:C&C)Not)&MM%RA+
    tjj:])6wwvg33SߑP2۳()% Ttg?iZaycߥ:FY=8'nu_!K?	"6T]kS.ۧS, 
    pXSSڰ{P�%4k=
    vѲEy,fA)cs25;FXfX;v頴.6#0R 
    v8Kgs\D&1g&OVܭq;RBf#t#N`K7
    6٦٫5kvğک2!c]@]'`]䉽Fߤ^mv%O1$<$fQKdԸC.fLMOŦH-NHqy8A~}X(ŢRB'lP
    V1&I-Z'`HM*&%iy
    {]D`֦xT
    mȎ%@zۯ\ۯ7zA۠_.Y#klҺֻ:IX+cs%:Er
    X#@:Sa
    ܻVd::
    F'1{X0'b3o*2FNJp0qݱY|fDSz'ъlt(4u1qZ�&RG)J�be7JfRg##�iGHԡ}gO
    ͑le2";ljEk\O0_]]Ds
    	}=3B~-D2dyMeG0p}UUM4m(gP({?]gvFB�N[	NUPWk*_=hux:A`?G'o0;m)D*QGLs@�"ܪvh0	zRL3 VQ61
    p|
    ^E�`25/%Hw .4mܖ0#iһ\K.;u|@.4Wֳ
     MIx[ݍF#s帞Q+i#Ϡ~lUekRrJ&YLr1z&[}0ޏ֦ܥW:d�ζ[^' f%)Hb1K
    vK)-BܬmtcGCNma'8GvIō_p&zWmZ=!04=|emIFXkltڎjY-54ilGM+=ܿ-[V.&j7dxAs�܍>8sHfl@F	ĤylqGz1L:ޱ$Q
    nfX߼U0P,V2ґTܚЈ6P\{ڻ|)S%)d5& 6!Œ> .D͵bX*ƠҬ1KE�D2=deX	DAAmh%F<mnQSD\ax}wK&"&
    xBpխVWiVEҼ
    SWr,Llu*4|`go}{oszdЪ@+`!x5dhv,}\>&kPPGcapFz;C%jM;Z2D>զ"TxR!GR<Ǽ`.O+]P7DD2w0?(&|O7ŽqSm5¡x8oջP1Ib8۴i2pshFeHȌSO]gʙJVL!2-0Q_8sHjC1dWQ>`U"ڤ+"؁AS!ꕊvX#:7ȕLmʁ%ij,ʤ3|fnnGb:I`Ȋtr	nZbYU@PlR!H͆蝦i`ba[(-g<O{Hn&8tHVadPHޔJ](5a>8EHD\Rpq
    -X0ʮ5QhtmHihh`#a;ft.܌V;1Z!HGC:)etAX'+>atz>I1b-W_^\gN$T0O%JV#�|+6
    ҭX0
    vtA`r};#a9:rF:+Q֪]<}\
    Gb]@6�SЄ`ԤH!-cߒZo*H=�0YA!!%!e
    XHJfm[½GLDh$�!-
    \`\ȱL$ʕ\U溋Gm~H:lG|aå[`t~4^@ЧRD<_dQ],49]6juAU:FxcJ܉Vgd);n>"Bzoo+ؠ/OEfp9�HmSDnoqg'�JEC2ңFV?rK0j 3dvܔhI7�#P
    ,^'Wi<	i*&Z
    U\R{RvZxw3"8raP"x%2Mwl:Nr}i)~ÉFiZ&EM^BFWNt/GI!XAb)enDEo@}iL|yXI*�#`8IX9~lq5KIgm~}lRl5kn21C㥾ei$:}x@mfx@`0*GU3)v2XZJWK
    QBu1mfC1Q?82&g2T|*A8qI^*4vY5jBHr6~6a!IZ6WZVHZ6U%>
    rW>W9�Hj4+._LI-x0]mp2''bNQ m3T*I.X$@;$WEy+iTBmPPrڍ[XL&5wr'HD2ek|XSh)UXCX6nz〫hR(N-c‘t*GOVԩP Ie!r
    YѰ} !q׫1lx"\r~8	$JE@M4Ճ|amwr$M*oK"=UnQ|菘ar|`4MOO
    @pT4\>Wzh
    L'Qa'A(rń4kRLRZKB&>L{T[jaA6᠈nVЃ[ƂXh	(ry19wAT\_vkow{wc0h.I1b*)<ޗi?U*qQT|X%4Ÿ()B$oc<sp4@WW]7dxx¬bk#�58uM uZGv5\Aj;UxG'6's(iu|[-$)"pI{f> FϙM/gvGh): i_ë,c!]#R<T\&|!0C6ļL?Et&{Y�rFWoZ`<<E6&(uMjw"Ug.Oߡ
    R3gN>2\"w"%u,m,
    ņ[h?+
    `x=#4=r1MROq2XSP0
    _}'4O6׶.;.uWJz-\%WZQoѪB֎h}M"XgjV=\
    ;HfFKH|Ht
    oY(V	昴x,IEлżZa*.j
    %u:'-äL#s_Phh"7Vڭs&jER-ҥ.4r�dE]wmZ`@bN <_Z9{ģss+TI:rpqd]NQȈq-P]x
    J8`1z"󴙎d2]-ht\i1.4�p,EzmqKErRF/1P>J+gBQ:7t2ي0)u֎8[M	)_c_=25J^?v?jVzSBRun9&t-['ȕԁ<B%88HA}.} oJ/6@ƴtXa
    Y=l&cQ;FE4n^PZx1jhf#Z_;pۥf#:!?Kz�
    ~,I?d.]`=t܄g:RIa_tZrv+S(<&|`vJA.1{ڞ䠘 rBA]@B|P"W
    ZP !v*=|X2Bj)T@d</?z:!#b
    
    LHuG=WzܻݵSHCX&Ӕ%I3,x4^6OŎ'-
    @쀿us?=(YJ[1ٴo~!:Z03gSgԌ53XbAաD/TrکRF@na9F`$[Ѵ:|\rh>CMwX^$g@:XEcAjM\iZZ:(}@kd1+*JCMԻ6Z@E.LXR!j&Yl
    G!\B]Y}"
    	�9)Ap~a^2z;ɓ�0Hja(6pvۃ~7j9rLlH*'ec*P=R H{]r>4V@y	HeAaêG)O:u+b&SfG}is#'?<h_`'ꄗ($zԉyDL�y+bHج0AڑzN[-=X٫STN`�79o?=}9+s9̈́^H Tv'3;5G$6|qMjQ_d0;R`S2໽q-R>[VjcN4UJ]K~xFC	"`&R1|sh![,}UXUŕ΍·@ٶMJn]R ւo?2G;BֆglguigqE32Di>wЪa)C
    �jKm Kē$.œQ3= {ϘL͇SɁ9g9v/jT`ERk-L"o
    
    gb24kszdfME`}*3$;wB]fpʐr9$_nԪfjѻVuTnC!hDBvK#U\ݔFTN%1 Qm0	OC
    cvZKWyVwv23/ƈ]_O1:O2fnBLԫpǔNg^-g:4M !By:BJZ/Z`پ-lmo4'-f[.&WNPp#&2Icihaxgixf\DAV_>*,
    ,ԃ7_X+ǴZ:'Rw#	EV3խ8Un6,hu}Cjœ'_d2j5K/ꇭrY#p๋ۛff6@QU}}Ւd9x,qs|pia= )k_^}ҧ|lq[;;wOx'fu;j^vSDG";O׷;y:vb47ix9kfS3?Ȥ7~ֿa2>{?W\͟[<|@"ti*^ZK^~ӟJ:q^}K1#'g2M0.Pɲ-IX5/- _)T D|}kKk|.5쏥@V
    @BL!C7IbG+H	%6kw}/wkBh6 k7povoJf{qR1	
    
    Ӥgo.6봌Hi(~k/z᫹+&Ыif׆T[eQꗲ\vSغ~kkc)Xsqț#W+|Ր@rn3ON%ֿzyۮww>Ak8laBq-1/\W7V6wӏW{z,o
    T9+pslP[
    ]# .U2AuRnR%sU,VL9sFFʐMEǾ'&cB:EW.Œ.0:$z~=/OFլ[n]!A~2&GJgĞVSuc_oӺJp"*9hwie[zW]gkko+nbZr!}B/ԵW]sSn9m6S PKLT{R۬a5cvfяv[jqң:șNЋ`K[x40)F\4e^EXB鐹ЫA>2ժ~P1	4FP6ŻHb5zkr2f16L!s2C_fiAkhrPZC+}j{vukW;l5ʤ+tV-DHP*)Jyݗ_ȍWK<UH�mRГ]V!p
    f24piP*uUGXiѡ#HY<d/ewbn3__X˿ovkK߸^jTg;FN6\3	_){}n`ZL?k;_޸[ÃR$Jk|G>YWwoE q3t"ף	g>�Is]6"(k[ d6˜@xhl2JL'3fߎ3ۛ뗢Z$hS'msk,GNٺ)ݥf}>t5$.{ju*l]+|KHt3!ȯtv
    ZH,φZ`Y*6%h$aL}
    /R6@VT;i�ecZWܚ2?Ǎ`Xgx3/hQz>T�7_zw*Rj[_(G??7?G|K߾t+0HmG7hʗʸ2Wv׏
    +'r~Ͷ{꣟OGCOϝ}ʞ^,֌HbE Z9Ocɩ̔3$R;3X82`/&l}q_yK+˙PS	<8HLO2q>kQObֆFe^�ϊs91HxM~>Nd4\,Ni+ӲZ\ppX]+54@nt\1n@4iV39@qg=L|署6oxm!/M<QI(K JoxKg&nQjZ*M`8z]nο#|&[ȶڏ?B
    WX\?w?/gVS\[{Q;aLƍa_SoW^]kFWo->pZ
    Fm_߼p-$"BBB+%qEr._OC~F߼wn^
    Cq6PhuɨdZ^EV(A(!+]F%Ԍk׷80o9+UK%	Lvtz:q)%Rfu<^Ǡۇ!`ڔhhF')cTɰ^FБJFT%k	(,za-?]#$|NO43]BQPR
    7DX/>-!^O{#΀t28Q59{?p/|yV,8Vۿ;	q_TocK'hȏ2u![aI/z/~jg>̢`Jd%e
    ˍ~|=@0
    [‹wO,1II8+am렺Xp&
    10jw]
    2اH;?۷1Z/Ǧ"/_ˤ-�51z fC@W%X+5՞\-bj�5݃}qd>ժݭ}e"3'2'A鍨NAIUI\=m"}WV;pғR,J,7$2)P(2eC(Rw_4\qi'jS~nI,V:g6aMkЯnЪ3?7y,^ntJF5d[߽B6;Vn^-]9YRk5.:>@XReI5|J@O>)/}=!tvOiD)Ifl/rͭ[ۅm'˫fS#�^mH[Kz3"o1Ck4Y9DM
    QF{m5=X]_%pi[~~e^|oܾ}7v?zJ	@T)Ȝp.6($*%GnSGWtx vȘ
    =f#Sqr`0(tY|X0 Y\~ɟ1-nbjΥovWj-_gAџm颅Ͷ#Zb~a}3/tF͆aSbkVUJ@jvۇ@'.Eڨ{۷Z]>XDA:;…oZs'OOˮ΢Fb6CY
    (¸eHL'TcjmdC:m_KoP`LI1SEyQ@Q
    |vu!R`7HR'._H&p(..[^0X}3J&
    !lZ*:2/ev!Q.6-QGKxU0%[!1[ı	
    AޔRҔPQȢ[ԯt_%kjZ
    O|6|lyVFв+͍ն]\o9
    n?&8N`>ѡKZ03"[	ٛۗrd	 ZmШu\fSK>FyNV_[PX<@ۭҔ[LK-DI
    7^VdPMƮo]Dv=	@ĉtC`LV-zt"]LFR(\}QVFأ͝]\F_7IK؄�T(2Ctbus}ͤfpܟK.nexUSd#.㧓QQc O[CMNmaJl+	i~19UIw[\CˇFd$BrHA22]+7Tn\МB24;eSRcy{-
    _>#_ AGtս~ɷ iMGrXZY8d)2`9ԆvPpu.7.˵,-։Hլ›/+{R7p#OrPڃKLPB31=: 61 .?eGowwUJ%D4Y`;4:8}fX{aۈEr	Vʵ:;Hcj2Ut$6N&X1h7}<s6a}4JH8!5C\io=t(z`22y-E$1SbIzOUȨ
    VD!@(t.%CZzkHӹ~$531atf	m#)T8!mƨ&?'hJ׀_xfD`WɘrP#~$Lt5
    kB
    iv\Z޼v	c| g7ݺƂBOu3=OcSΉ`D$jH2ҶRa'Uw G$S1Ø-{ qxKy2Oudxۭ[\fcsLe-?D72gVӧŸ1E
    <	i%*"J${N)>{UJTTnojaY9UpI4T4BJҮ+;vqA-/Q0z3YNrm`%) }13i5wPy](ڲ?|k$':s
    #Ժo\]Ы٬V?~7"ZYWX%Gv:Yhw-ް}S{@L򭦝0:mŒ
    E!+s4'S3zK&sgS'T4N;S`&9Jf:f1{Jh0~S[޸uO;kĂ|pv ?cDLwFXBfPETWk"h“`V.dWMÞz~:Ed5;0L,J50a?3ptȂCPDS�0XȐCm&ۅ}wgQl͐pxDŽoT< <gp%o{oo.vϓ?uLPո*<H9cc@ZE&)
    WzM/݋feClΐ	ph`s=_ǙNftLci91/dcc3 lQxpڐlI9*"*}Lֻ6HA^3o<mG5,i7+g2�6kKǵ@eKxt)Ī
    5V^b1*=	VzU
    Dj`h=HB	Q
    ~\hǸ2FvE/&" XS291i:NJd+_T_^‹@DN9 &R2#xn +p~*eA+Wi"ˤEK'h<RSf7qpo*.Y
    <<=?sgo
    fbL772=#%V*|K8.7GXKYIMO$^FyD籎R"dI4?`NJ"
    UX7lX<9+{2ciP?0Nh` ̩U0aT?~X<Ll,3G5Ϧ޽|0kϘ?pl!Cw_됨=ulkuc4~?ۙǺ]*P4S-!%{i3-*(ضب̘& {gLA?KNPa(іf˳ń1M6`_^vc),|gщ݄G&btHSNxԡV
    ð:
    og<s=yBm;mr;G~^eC4'`hDep0Y"h;l#9V@R2;MI%o)}p{͔z=%;yZp!#A,OL<2^Ƭ$#vf$Ԡ֍^{WU43&HU݀UVR(ۇ~:˒Rt)D,5i8fjBLnBA'f"ˬ׃jtFBV;I靠b&3	Җ}1˟z6bhɳIm/U_wymհkڃX;ًzMN	z18aRS
    S�Ql8A?.f,I(_~:Bn,k0g
    Vtp)Y&ox"LJ~KϷݚ4;F,&L1ohɁ5o8VtJIX.}43~<Y}|xܹ}z翠%S҇@Uul9A
    us	1;FޫBC/T 	;LZQ
    >oP
    FQHL4KDb~4iHLWS2a{	qDm3L|猭1q({plbvBDs,?YUA4ǖL$~#8`^|:y>8z&@)cm@2!5`2ƺ,ǭ+Ǯ޸X#uQ_ Itg5vJ";g-B/Tڙ̈́~əՓ>𱄵ZfZb*]ax}iWWj*
    -zdGA
    7˹;4e|pIAC?0S:S]O:g]FPe0}di~y>sl6z2cĈH+a2:$DZ�/4?%R],`S2P2&ɴϥy"sF_.^2" m'IPo3M	s҇u�~GGI
    QʕאA669RZd+1 j`s.miN~6ǽ`
    M'Ϭ>Cxt_	/-X_+_ztlEHo\|&Z[x̹ϲyp13e״vA˯8jF/GSc/M;t,slyfS0(6H+$w|FO_Wm.uՒi=0|t:1;[
    hbN@v}Ah$FCnIQe*1uT z/O+ۅ_;/2tx^Ŋ2؃_m٬,B
    )b_d%0ڭ
    ٤
    x(-]/=,IkTՐڲbI
    305=\sV0ҳReXp7o;oVi1MX՗+_K_|g_k$25텯Uo/[[^0cӾ)rMuzHL##n,EX(d3SBMS9C+i:ѴcMO1@R{NQ("]?'ޅJx}#jt+�/em!c4k5{,B{Bb^:-r]cBwjl#KƆ4D[;JR$:O5clŚ#sQJ#>̂4NZ>>H+'EJ/_zwoW_yn7/қVv{F0ktr(@Tzӌb8s\
    9}KS[6ҹ<ёLͳy?&=P9%APGGg1XdjLJMƾ[c>)
    NN6uC,4oa8=>ZHTDE(=jdϜ>M3&^.9-:RM8&F||&<ЙG75h*elӥF6"2'+[2@gZ
    RJ4|FդM>荚!4YY-0l{1TkBsM=D|J2٧a#Q|_d'_5¡r:c\j2عs[(/\v/3t\WB2b̊/&Ptb
    1% ;6GH2ӽRyWBpٴ$_huا^S6܋|t|.rn2]VcgcC~-|I( 7|11b>ןf5B4(tjp=(O{a<z0~8DfʥBg\mjZdܬkrͶ;{6]åFPu{ƀ+Ad
    4:}]⺐/W	Y<SXߎ⛤t{#O 
    O:}UhG[BDzӉ#|*ZW.eP}ӛJKN}$8wG`,}jMEFw45p?F*4&&JiZ5jP\rvPDfjƍ[,'2Ox
    om[ ;a|W2E'i՘;B[rmV/Tl +K
    2Ӭ
    ZM>10EkȎ;s7r77[_o=|}}aRXQrоZ4J]3qU
    oBy^B͵;@n#)v!$AX�(ڶcVOM%x(GcoE!"}&pIB"<r/MRmNFL@)@?
    a7{Sީ"QI-h%p_Nk8~wZ8g[R% F)(TXOD/̳>Zlf@_o~_?SZ|~'>Z{ҿ~~'3rl-mQ4oTሷN[Ǣ]v6(2涘\3}ߤf6a#r6{Y�mzr> B
    U	
    XH输lu4hnvӁ,$<90Hnf{sNs:\
    ԫH/T].O'?c5ٯs>'r7oZz_z'_Ee-7Bޔk2'p屯;45{P?LNjNؑzIӃ&/aGJR�!Ai=4EiMtp
    fCX\v䣍|LS(͍ZVϒ)$Q
    kcK]bN^O>:`"V6.|j
    xb̈lqK/}Cnhng:4{F;Pv=1 Cdn{TEk`"M+j+^+Ԭ.f$io~ʍ3ZzQZRh!l}۶hyignU,5Or.
    -cHfzò1K'>o9ݽJPlYK|:$ fV�%}wx"<S'~+D*{6F@aܙxrWw&UWx!;ߊ§"8NDhШ5EÕ`cH7ZIғ2J:cxsaq/i-
    (_o}ǞD$驕lݺi
    +z[W*{svV؉v'b`2e20>Gy9"KaѕW`ĨZFj&nS/h
    ZmV{Ӥlu``Q*aAKM}ⶓp{~Xv#4�,(Z_f,i=ƌ~%M%‰t<2
    Χ:C'4aǿw(FwovXPi(5ɟ)es$AW)w_jnIsm
    7.DڝG;gam	ZPuob6V9`;瓙s䔉c7sZvo_W#ይ\,O~ͽdDbs՗m^3%R,{11KɥB tz퀵[a(0=ּZͽ~]tFYw7ۗ._o|WnoTC]R:FQ{G+sc{mkfشdc0I=c.DMA0R6!b>{叅SgN=7b)k2 ߪ"a?qlU"M["[5<m&M{ی/_ �}VEHs4s'(n^ޢ	-Ieٵҩj͖
    рY+?9h	hѥɤWڎunZu4�DŨi(R-ow_ڷv>6Wnoԟ9KjNYޭΈ*. UOF5z%_@TP;25ǵx7{.ʭl+^gnKk	s8ࠫ#ﻷ]~&Ies0>zÞW6v7ork=(<qؽu[ٛQFhGb4~Txno\ciDS'fCtEEvt	w86 =a{tLGd)z@k$X<! sCT!+uhSW׿jfa�ɈYjьD0JX@-@,5ףR'ܚYxOHkcƕ?sy!xed<FOwlmw>;{Goa1S=K]g[U8Pbih}3Nj0tov7Zpݴŏ?ת/}�-7Kdb@IpqXc칏}Cy~A=~yk/6e;ʊy'lj{7~_';pwT3: [6fƲW_7~ᯒ fg.
    BN2a<-e3csWxо۸VxPk3AHXh%|�[
    �nnv5wCl*^mce4*Z.nC~CXHg+G镳O~W^?XuF=Ul7s{՝mTFɊ[$@lKh8c˫_o~FRd%]nN)[[7.֯:c.Wz!CG?+ҫW_~+N*zmP92Rp-D HYmdjvr7iw`͊,<vA5Um		L|1n&l޺]Z 
    /0s3Ujܦkb$jlb	A|Ȗ!ƷoGzT9ݶ0O%\thg,+BaYo,fOtf?tu=Uג5-Zᙚh,G/b/]X2�:*y,M""sivڡ?7~J?hځqFtp'믮|n曇7:땎,AA3ч7ʴ۵Ћk7kDQ֛O|3d
    ln~~W߸|n{ T2Hg)Ik]}5p,?d{)ձ s:rG@e$(T�509v
    AуX41_3&CK0ٍQz~2%8mBV!~}K7ƐaQEa
    y^}9hgD(`YO`ᩏK6ݿ	\6%cF
    "(_i?OfOCݣg!^st<G�gXos89럟
    exSA _(/Xvwg?w/U}I?c?ʫ7FU$yӏ9b3S9Яŭj&oʯ?ߚ2'?:}D~Sf+*ըdN>s~pi|-v OSOW-vwT"־_yO҉3OէN}3zAh?b=|g,>Btِm
    %!傆4잂]+߾qu	�".VM(\?PZvj<G?	Yty}w_.wVE&v:}H`ng'?]aNe
    rb6X�&K†k,n\_W__YwJ&jt*>t3FӳH2ỷKO>
    Kg{qXxX(XD
    Xaf~s:vS܇|x¥/>k>btj
    6j]5[m^X&[X25VkݿtjPNoU,>K/  9WߊV+kj<%LsBfk\1<H*`Z2/m>]1n=U-՛M"1U*
      JWFLA@D	w<eȜSC}Q߹˒=53rj"<TAne;זJ8Ȝtٱ?	젻鵊
    &Xfd|6zaĮ!ko[Na'_m^Yr7tr^2uS'_8y
    m94"HmYafܼ|LrM1a[/?%~J+?W;ՃJ',J4ytaʣ'ztnv`U2tIuY=/AC<3ךj>yFG$'hlFG(f/Iz;DpQJ~AF^tFq:dioK*$EBa7ARozJ_uxeƶC9W&rÙLV)oo>>qf#_ڮ?q蕎?6ѹz^|m9=7�MQ]wk~f+Wdۨm6oDl$n{`|"ܩS̏2{EShBHVq?;Nvn:ZZ5v	zK%AwͲd%,֕fPyfǧCyztTaS~Ͻ=ș~`;{"i?{08655QXE-bᕥЍ	ҰS,|Pbyl-"m2]`v2D)qOR=1aPu1YB5o5lewD~^JƵkdX*`ڦ:_f`SY+?w+;vI{,m
    ={Pra'khhܬ
    b.@O\YMƦND_�5[]6_yVy^n6$VoEnZo<dp
    7a<+Ϟx2
    Vq<,HB6Rwڽ
    wjF|dofm`N'(ͯ@mHr2Y)/)TTQ:<&Rp|>Etd-'(%x&դE*EEhdz*^xeܛ74D,ME^JKSp׮rjo1(Vj݂nRՊH1d[~/]{		sݭZ}c"<έo^QhT).6?ҧ?ӟ<}x3B5^xnl
    3Z7_7_4tV~wKkӟ
    oUZwlygsgKI@y! OƲh5ʃjrm{2\+}4)A&QINEOT>9)ʇRF"(B´-e*	+Ad8pdU.xev
    7/`nDہld7o<yؕ1Rgx8NiMC5iLдS_ukr,J98`ZTS,<|C=̹㙙(6SI{P)
    \y[lt\k_s
    QσJa7p3(]v`fqT؟dփZF$.<_Psoe;:yN
    ${!]
    )ﵾ7kәSm!`HC^@=OP0Z2Q)o-,o1WvQI-ŘfF~?  }Dto2m
    ;lm_3ɰn1z8(ʯbp@Dt{s֕?Z
    L$v1/+Ӟjc?ou�10:s^
    np<)WRE6�N@:;Om֙
    ]'SV?WW/.Fa!ųg?ɩ_ϵ.n^Gܩb7^{݅ɔ]@.l9\6^8IEQ}/zlNR*atx(qD(q%e$47F =y"N|X+YfM<*TœxH*P	q&Si4eVA,RhCR!tRg+h7~{L^lwk7wPYZ\?-na,^]۟ǧr=FZ~F\;cǎ|LO%evPb٩Y&FmByc`wg^orKK!kAB;Hh2
    [Eu־*g,!*z浝K}vdS\G3JLO98j&
    -vCpez\Dh0RBN$Ah4|0jǷm\zͫ1 y|I/tZCDUTU3ܸ0SV+'V.nۓk;fb^I^U
    3_fƻW.\?4wz&I&Cn-_=¥??3Oj{{uf0-{ss0?vd4vz&QXLLͳx%RIQŤ
    6`߶"SVñI?Ȥ} 1h~>8L&>|!5D|ބ2\$:l}Wo_9=sLl-ُ8ȴPpR'E-w Ɲw4O\w|~㋿+񼴺|a{Y08
    λAz,BAY>Cp{-3`ܾ~-9r>L;{rŋ.]&WgRY{ЌoN(N7_y ZL4td4cxm*j?35F$(ͬk!jB	u@ABl_xkWvvJ.t0q:O-;xNm%ZխYuڥOXesSOLYi"#}-\
    swC[z£Ba·7by+Q`/=rgґ'$)$RAԜ,2;dW^xzJ&Tn5nX>;Dvwpzlen~_TѓO> }T2KzM!ٵh).lz!H-N9Q'ۺ8R|V{;jREZBԳ<}$k[EVIxb:;mZ/_|i|04fO2,sq.9bV|cw렿{ڇU!hGw|uwGWN|`m$JNX[2qzaeIW.mlٲEs/]^g$3(|̓}'`s3o,"P,B
    >JZPAak|yx<>w7>?X
    M"aEPvWVfvŗ^fxꙐ{f8G9׈_G$ϋLb=;P g>mqCk{`_=C]Oz~X�=r{v>rj{71v#S+nQ�{V*[kϤSI\P<qLD"�ym)	
    (N23F+gO_c]J@5*yβ-;`cjݯr
    =ʵsOcn"񼔫<f-?9g/#Q-%tk~׍;ܓ")-gANXۃo2ھ+6iawu]	=C-7-guu:O/4BڇYXHxvyf~q7o3)^&NݛC,Hh6@F
    ݓFUaZJ#+<|^vP84Ǟ?sO鸙uDĈf	$o-"8>",Ms7гZqkr}1sʆ!PP*qٽř}Gk{(x;ߩ|
    S$f,V)@)9g[Y|d=ytee/e[_7v3AnTEa'AX
    T09=3&NQmfC1劅Bfe:67\>T8[Pm@yddzؼTZ2CD崐wF-vi:Kʫovǖӫh)6peJNCO7S;gr~YI~Kphn*4Ɩ-͵w6kggՏďŧh2-j7RSw0,Yv?j�$aՁӪ`]VQK./g<x0e"'`8Bi&:NJq<Pҟ"_vzZJN!?�c�@=T<*<sfBoqkkNljAڭݯܺ<}gW>vv̅ya@ bPP.]=ZC~M{*9),XHC]Zݎit?+7/w]hu_{Kg:5;i2x(n^'kޘL/-%BDd:iעNjxw;!A4lDoYh#6e
    嘍ԑf-b3Eh[Z9SBQPF>3Ek޽ƅ/ljgйn.ʆ YrhrqPEs{i^9Cyg6tFj@d' ˍoKk{7=AgÃٹ"xģOl)lnXB<*;"-m
    WEޑFR \փ�jj`m2.%ʅCQ|qфP!RE͐w*
    <hnkÃ/}[/g_xd@?la$ >hx5{Q\+oW׻[~̑2!~6
    DabVMB
    SP;`:3UV~Wg?CV|WSh1ċЬ	NE|頖k	
    SȦƞ�ےzu6bZMBDvLٽ,WKa\Bp*­2Ď ?½v[źy
    ko\fkOO[y*KcQ	OIʕjJM~UD'v
    x6]!2y	}g&DuLū) J
    ;-lgwG?l~s\kYeB,
    #O"k!3gIgRJp=a(%F+mJMrl;h
    Vw"4aY"ڀ.kRj\uo<wsG=#?<);K+׃FPEVQ;5(?_`TZ,!^~1t
    =7{/r雃POZ8✓^_csѥl.^3!4RAcҪe~_.
    c�Hd<b͒>nQrx_!}
    q:8\l4DkR~zpǬW/xK|+|O/[
    Nˍaˇ*~e!o_Is*K^~N5Qkh,TW;>omãXMI�4#s:tj.7*_^v]iU;�,V%#S_̠/~*b--vۂwf9+,(ţN	=	7f)ኄSl6;xM,MV}Fv\e7ϣ+3\15557<u'[Sv`\-hb}x#k2CŅ@)jH枯<Ǽ#khƦ晗ϱy7>ͷE#G.pQ"!jr]\ΥU;˅͝
    $D,uHӴ):	g36\M!S삔!fK}\7	tvx4ah,<О#XBd,6GBray(<fv6{><h,Ǟx'Ӂ%e|!-a@8N8M+CAl%Btm,KN6xȪ^t|%bm'^k?z)`x-lFNd7j$qhzzq~y-VQ*7ja`-茢苽";F$Y~_UCFڍ&Y;W D|a*Qb
    q$*4
    Pf+je
    ּ~mWϭf3|yd1D+f]YP*GDgh!\BW`I;`z/ET<4ae𯞼6	&x}m\%|ͷ<8	XSU7q-t*on~ۯt̆dQvvJOM;v^dډVnG:ZlFv	Eו.zYx.`QѴf~(,ndPf;V6߼Fݘ[J̲ı3gfë6pGszʇԬgwh%
    E
    >BetȦr#o7;>΀٩c+�'+{K2ЬA(QfrühctA]M+BXte|?Т#.lmcfjff=Z0[jem##4`l84ᐨK@Јdی\t\ccv5_9r^7/,GVyetla5s:
    vCXi`T2JSV4@=Gʔ<x彄h%acچ׀zsm2'*sej3CUT͸Ui}`dFcVv6<l;H=~̩3@k%#ݰRG@oGyDyO#t&	25A{ue"!27aF+v4Z]8::9Famz3D(Ô˳9,F6u+k(ߦnF^sˎ32wR
    �G6GFfÇһ̞ڤ>�"sBh7o!Riir7.ں-^za}}=
    %cH$ٝ<yܙ8jLفQ<u>b{Eȃe%H9h\YGip(#�78s1]3*2S{vutd/JቘUȾ|z*.�5ᴋw%3SvsZR=4"<6E'jއFj1;mld#[>	SC'_.׍2#-ՑP7FHCJv0n.™^zn^37O<8LӠL`JH$R0؎S>x8B3G4AD
    Vp/·عO=DR
    EoŃ~Yg(I3i{n2|@y2P8*֨A{V84⑵yyû弣E϶Oahy2]iÕ*~9,1="Tdj0_a_W/|ߪ5H83%f2lvsVF\*,woӬ@XtBVF3	A-ӫVFPނkt?yEP< Zۂȝd!9榀fqFqyHvpHpd=#TmbwZ؇0Q@6iM0y*bҸ29m/^f n]|_9
    Ff�igikZ{~雯j݌%SVMXCm-'J<'|8di(&'je$;C{ؙtb`a%lZ!;*m/ Ց~RNm,Fذ~Wұ'WgUPa<iOh{o(7CU	iS)(ѐPC4R:XD	<L;ɷfi}kʕ{M_ēa�^,f{K8i8KEX}>b6u/Vn
    l3ᢰ^^:1?Fl%WT<`f
    %&ፇpc(_ 6`	g+ㄉ_+�K)zU(87%䣬np\Y0m0:[}črĕm490nrCj&JG@{p厴"8l%rD@Ծ+rZ(&MN
    f@DXڬ#˦,d8V(hbx+Y;KFGx(HӀT<};TQɭ>C,Dg
    O|񭞵!룾g|i$]a%qdzM\'ߤgc6DCe!IkSry�Č1l){l.-
    DDj=�]NtAu4Ԋ:>12!ÌљU>��/(;DkXU^T-*1FGqpF둩+LLݮ>(>^D06g"=k[ۤFƧ26emkҷyFOQvx6Y,`&&U-18D5‘a`%V'[Ad?=<-l^77XD?Q$^[đ
    Ds*hL\CjꚜVs>6+KV qem_?uaUJTBekJë%FuyQ:i@w>&/45y?\d'GLq$9^^06IiIn2%ۂGDIYH{9H4v˜䮘E	K PLQ"5܂{C�Nna{ʟԢF5"Q_hJgLX349BFUKC8ϯ{=y
    yw|pKSim#+FO/o[]G.L.M"|qeYi)Tz`)w:B/—=(!2Iőz5ELP9yNxiSlE!@g*6j?	c'ܞ͍$&zwkSJQ0n7v"U;iGcʒDI[:Hp_@"wI
    CS)#x
    *V-"˟WLga액?L!:
    lT3StKٱj7E؛?Oj8U᭟UYz#‘	wmH:3ɽø/!nQo@TE:J%'?'yHs{Ik08y۟wR
    e86jbmXhMQo?BA{;RM9sUr9[ XHE)zFgv&=a
    SRZԫXN(5BʮClxdN6)RU)bou;L|h6q+!M>w÷y׸UPE+Fٛ<D@O(q*ցn+`m,NXj[JDS8ӆW
    WLEe2LU\p.r
    :,∀Uh
    ]Ѱgl{*_4d=ڥؒ竔:<Ucʷytu4$UyX,}dmLc\FpDy]S%e[yZ-	anIpqؤb#{OVc_޼ $y<{./Տ%C<{FtΦVXyg9DZKoG}ɘX8m"DU-/Mޕ4�Yo۳I/<j1U</_Gwd{h¾=qgGҋ1=7MqJJqh:?5n_fl<˜ N><$(I޹=6m܏ͽRD,L,kɍ6cbck;_^L2y_1Bd6<
    ;exz	;udbRG(y&>|`7|c9p'm{z·M^jiУxFU0(K`<qjφ5*cjhmC&<Q�H=v?}ңbϰ?OpQB6JSɡ
    ]=zM;򶱃EUE:$x12a#=q#kQGTxN=b#H[#_l:Ҕxy(IKsy
    ݞdXTY&y9( amܑKxa;2 Fp38R
    O%Ƈl)6w/�щmepc`alvq̝}^&cLٴN|M䣛lxQ}<S=U=hXeCbؼ+gCR6ivSRLCI3a֪C;2##@P{.ebo=9Wy;
    a?Z8<#3W<2T^Vv%59V gL<:Vc˓Z:U:-FpS=z~n4m4t٤yvԝ#x_=7Crx\hG.г3ew<z	tct‘{"ǀT$FmՍzwէ^tn!Y1FQxhRwɏ{B�am"qL0S9Cӛ@|+;BC2ByQ7y%wߚxz;==]]{sԓ'mޙ3MܻeT3NǚI"mh	V/4a,&>~7B&zw:3q<>=/Ϧ����IENDB`�n������l$1��PNG
    
    ���
    IHDR��������@\���sRGB����	pHYs����+��EIDATx^$u.\\ü̼bf8'vs؉)f[f-iayzVR{%+?jW3={ú˼z<&eq.0\eòK"^'ȽO{pu,"2P/^;2wu&[+*S]*P7/+o~GhH[ckn>Øfc)/Mm°Ԣt)!o`I<~?zuӋL..29w)rˏx/.e~1q4wdYDMC~[yY'=`?],-;9x0{y_V66n5bT(N,:P}ZUIJ3zi<G2<VWP
    pr)왶F֤8[>|C{f=x+*ӝJP̗Ν>P~"Nmiʽz^weex^͈Z% lWUlnIHk{H40y<yܬ[;}$8NQ;;v!˻GJT%rNeeh\c+;oH9#"Z5W7Ip3<2<x/
    G0;*:nΎ,=Ȏ1#@q(`[_L?G2<s91\븪v5DW,k
    NE3<g2<gI6MWn&(2F.y*Ȃ;@	*9A|\
    _|!=fȟv]sCgO7$_dRrd*[&4wrHTixxY0
    gv/1p?>p78{ =Bh=mx~#A?2xLO7IjE\q@�#"`ɣ{hzAH?ոI΋uyY	,#@$.ûm.EŽc2oLΡ	?/xn֋|/݁'"I2bgsc̑#nqs6y <*-%g|cFJ4y!no7{BɋMH16;/:LZN:gq˚K}FBCtTlc~Lq,/''?Gg;@t1;Ȏ!v	>n[.@ ۮ;h*>
    rJ_7:cȴkQvMDYk3,V
    Vw7u_:vm&' N/b2Eh׋|ÑX2I:-1#QA!=CQ6mIy/�4z[_?3k3r?W"6g!KĿ!$pq?HVkp|p4dFqDbmG9Wa|,cq&ʷ<X>vY=OQ!"OVdqG9<rx~KρH3>=y@^D1StiE$'",$*D~RMuv9L'`uթnQh8pLkL
    Bcl,HzU(,bmIe-pt+`xGw,Ԝ15jխيXNilgh1Uvb%ïZxDiB	5<n<"䧞XxZQ\= a&cEƐXeOd7U
    ܴ[fS!.h8p
    9U=dpFͭnMpy͵ᨎs29gN`%1n
    2gLNdnmޜ*imXQj{qQ٩A+NV,Ǫ͜9keëhnt-.<+h	Bz0?&CPq,HUZ<O!@kTuDoLXZ_4Ys\=_8:vh6׎jkn9v[;jƙ*XN[`%gB.$ƶlDds}+xZ7M`JH"vfi0N)E~Nug!`v(\le!f|>!cQ.vܐ
    ?WHI/{ޝ݋'15Ϥu
    hBA]�e`#몫j-nIgV*˜&Aqk61$Bѐ@/YmJk*'W9;SKLJqMWpDFiLm~!)u'j7N?R-)Ҷ܆]]6%Ϫ3uS
    Bs~r&cp;~9y�|Q;/s|./¥8E2hiEtљ&B2ͳtN7*l!
    $5Ra
    9{qL;6I.Ʊ}GwfL̕eFjWR}rg2.&cBwI)bk
    ),lMKG.iTp\p7j)ڒ+5m~ΧRyPG*j9-6J%h4j)7J|p^B\T	$	n2swٳyqWtNdŪ[?猱987suVEihe+HMbmFh&ՓJảFX(2ژg\"ԜZ)-jE#^DWJNlxǔ)*EE&WȬVa4kis婹,(f	XZc"	",GBL	%zI(3mK-|5Ӟ>2:|(oGR9C&XuE0-螧_"d̄uhvb3Uh0
    2c~ҪFQqN2F�acD蕣SGۢa%(gٕROLdr|*\vZikLyv_:T{HWr՚Vw(f[>_ S/+mժP"Uݺ$&NdPKEzO~>uX8TXN-F)/)BR!$;V´5:9}4~Z(5ea,DBƚ^3N>m!,nQ0ҧܨ](-LXn&ZA,$$^޵PS['Sc&42mC
    $s%nHR'?%!sMgT3}VP=cϺSO={w.y􏬈}CG-ĺc[L6ZS93=WZb`4F7 D|X[\[]6jӕ)P#$rb9h9PdkAaGw\`g+L8ԩice|?:	e5RBgLL
    u9C͂c!9z2#)z"VmߛBpU8T0ȓNjΞCqIelZcpw=lw{9mܸP=*W>
    E5i
    vq:S4vM?q1˙|+2gM-THw4L2'39$);,*Ԍ;O]=˝>]?)5=2\cɶNK$fkqu3Oie<}{z8==ZvH{@VDPA.:wƜ=4;AzbzKydMfW9n֮!GHx/WՊ#g
    NaBE)SjWZ@öv	ũʘA>e64STc\.Q0P|֮<+&$/ 
    8H`gpYPیoEc.G}10K1S<W\NK$/Z:jiUN#Iţ)0bbb_A5zg	R+Or:)h78e"d%iӒwyC0H0D?p'h)kUDS,4#q,nO׫>q˿Z�*q܋ڢy_GadG4uU0L8ΕWgNLAĩऌY3}j<s62;u5۴$KqޑO}}wQ+pӚ?L-@95x9h)B8ЃKf(~U#u%08H+sm/%?r^VXBԂ>J E3foSYuMr'׎6n[۱Q;ţ
    Pb@PaP<"5(./0<#ˬ'& cvZd+YCxX%=2*E:[/ 	htq)@NDB@Rz>YNX}vL\36Λ/8(M_(#phHӤ"D6B%;
    u?`AXԸB|e˛p
    =:?pޕ|_ʳ,*k滯.+ߛ>ߔ>.]^{&F.AuqQx}uOwFU,nx%~%]%cy/#>gύUY\ 2&Fi|f(;ml/i-ؽ<G#0ҨL'jfuYh
    =
    DOxd[l̹L3oLrsb?F>S(ٰ`TuKwQjnfEn!.flU-[g6@c/k_	1z\7+ 9QBPHS5S,/ay!1嶡rBȑNa&¤#Z^ۚoN3شi3ZS>8	katmGnǧ_;PIK]ԲvfXW)]O=U'
    `GOhPQFKv?\ƿ:U;UbjгEX~v/Yj("�gд_B\S\/NJ@v
    I'
    # YPBU{?}7O>ke]q<DMg237gNf\!Sӫl!
    s!`l63;Uy5:Q4kbrڢf!.*9YT9VlGX2VlfcMSJ[.Ud0:qtmGz;rBJǬjݨ ;bQizT4˙@,+4"M:%AJI"b %H*nZ\-m@.\|4gGi"^*j,>9*UN
    דzza礇+g#9b}7N0ӼauoafSE(La
    k|ifa91Ɨ}hyo
    " xu7
    ^ؼdYq�Έs`pH>WSs̭޷u|6_>(,#TПI~hi/Qq4$!NǻyKw{=1Ò*JI xbT\9TMVYs�-0i"mڢ>_#y{]"n"2l̮dN_Lsy3?٘l9.Z{m!%T&̍kԛf#Sj9뚎+j%FB�W1ڢH|$$?pa}0vl1GM/:s;w3T|jwIrΟçҋ{ފ4�zQ
    a근'G$D^ں[f-:J}_7OtDT$!r<p]kaYRkن?Eۅ `=}]I"aRH=D+�ߦ$LdR@�O;!h:K9)2`;"C܊AD|L	zu==0C,MjMxMKA[u(^FM$r煺 m<'kXɅլZl͈?V
    ^rja1ZR=Zk\,E�:btAF	9:7dUC-yゖGi'tSY6a4Ŭ6ֵJ)\Ej0,'~EI/ODI4!!p>Y}AQD)I�GÀr(̹f^3%g!Lff/5b4
    s1:[ȏv-az1"qH"Y $za{fy@5G\m4|xQ8U_Ч7do]^eOb8S{p"<,_cxBB|aΎobVyA.2l_�3N chi,
    42k{=iz䤦ϜKD1<cHavdz'n;Hqa(̛̾
    d4n9dj˜Xi21ެ-f-SxEVmjWd)("\OKFa^%P2"m0(;@/0O&
    UR@Qd$819Ix3$d(QEQIRb
    1,_D}	DrRYsxcߨyꈾd#9k2Ѩ35m4: {l^%5-. $2SY-9gbS�rl.d`F"Otp:7p!G1,|U׾;0
    uK&"/j}i@BB!ztQPJ%)ecmPĹm_J'-9hi~f{jړ_J7jtdgI/rp"nyQ{_?|wok/|G<5ߣc-d=AJ;^;V6ᬅc+}`d>,B`(4JVnv(64jY6k&Aj9N"(Sz	`TOt*
    b$kA$jQ}Sx
    sj@JP[P8;dVU^>&
    #/ֶzr0 b\/pk%>٧@[D1,�zj15ۜB:>[=[ϟ:S<=\;>N#8u4Pc%2LN{ي[q.3Ms427̙â 5
    3FWdѶ#O:J="v}-i+7D*�ءzW
    H,!=Ծ*q_`P<{JXUw6]t-`qL:u}߷JQgmo7
    b:C"r>ǫ?{S)J!ybtqkH4	ش劾D
    l5׼Sla_Lw\u_(t9)Q4-1d_ըIMjOtLF=,sIg+	.SR`jA|8@D5CDUJf
    G]I5#a}:9B:JJt c1.cn�#>w4YQ%_`9j͹t/Ջ\6;[gfն-
     _7nzrfNUsе7:ђk}yK-^w'8Q*ysզKmŞX@)a/4ʒ[L-RLǐrJ!|O&S$m;>*
    'fFZuL򊉵{m%3:M3Vu$7O/xWG;=!JѺ|4pY㦯/5_Dm⍿aiCFYO3{P;GWr뻯r<po}r4H jEĀ8vRO2.|[F/$Q))ZlIx
    }P֑$D(@|BdK8;cr>0Ia?9#Dl+TJ0$ևG�eQL>z9WϘjSSJ\,ͦ1CJFڴA%4N1h:fZ.kN|:XrVY+OzEHDlTޞ$5״)ὁv"M>r
    y�xZwf$Y
    i#^`޷< .Isisژs}N{j|BjSfHe_#|MEoÎe>4X}+ޤZֲv8rvD5s0пZմ(IL7FWeKp?ul񯮹}ZRO=O{a<|ނiK/)r"Vkl7N5FRb{<L
    ]ml[E\I+gڅH]}Ņkbv:k5.{$Jr]x>bp\jYar8>|% ^LB
    La:E �
    M$1h(!nE,:7g4Z\M=,~F@ԂzV7y=oe>dWp$+5L
    hL_KY&BDqˀ#iA$Wy!w֧ ]8>eu-ڞh{Vs=_kçNEQӋ5!)-޼#_Zc);;]	_xeӴMHh3[g?y[u%.;L3Ge'J?}>tsU}@(h:.)Tkڒ>8N<WC^O{M~_k
    (kvl	LJqCoY4L.'pbeKz|+!D8Ltrmׯ[wp\ɻ|~&sQt< (X8b!":+Ċ@	鞑{ȢAHllV2=!^
    Cnpy(UKxX|)!4{CD4<Xk	;fO5
    Ts+�'o[cDL(<WLЪxRM >_,tɕ
    "4G%5[ǛwY=hIGHDHDz1US)(o}#Zc-<3]v_w<9|^Ht&+mA2'♡Y'C;J!z`N荿++4E9V# &$3;HaP' w>(#$`8?JEgBj.NrjNa]|w{-ݰALKN'L3U
    R lh~G1UM1b.&OMŰѠq
    xDبLP_HXpd-lҴ <
    Loʑ"gƗhI?�Zn*~z
    ޫ=1<В/6ȳCHA/ B%J&S?kJ3U!'&*[":	9D*eԊ(Z)VHme}WHa=D,bJ![DC%._m[+%WU\!ၔo4&J/$w}r}7|!W"ʗ4y=p0�rC~,3{cwhO}Icw𢂆aa $k/1Efw"il)5eӤf&O?`=O<sOw|4#'�yn6
    l̹v?<3p@e!{"7^ILSMy4Ie벵`dg+)be+ͪilv
    ֜&Ƙ*Ě:b6P(|/(6p$G"$#[CHcxo754Zw @`bY'/k_4mZSHn'L3%/)M^[42E:S+)Vqo�C^iA	!vzF@Ӳ:Deo niiCZw]]	71/^M2Xa/haPS"ڔ#:W_E&3_@Şd�bFNT?`P>[34d	tնpO*E+]ysޛCt
    .uU{<'ɋe\ca>im"JGnZLp?X˘DvFMBr ATM)Q_?vmrK5Ĭ5ac7aINF@6N�lKo84U'dJx4A@a# Fь0b
    	8La>,8#LIlZlvqKɛ0j-/|3uokW7_Ug֋_$, 
    Ax#=PO[ő	{?-<-ܸb!QGh(Mϖ(B/sx_Pm-۾Zl[ɇECC/EKQVjH@O%՞,"
    \Aon!Ў?í;ȸr1tdX[ߥ\W+ES =uj&3"j@>{-0յCT+Ʈ;E
    ewחz1^I
    "fa70,`NHpPY+M
    嬅E
    TޤDlm-H4V6#R;sxCi(RbIKm2?n$ctȷ9l#h$NTDP@?kc`*esë~ JekWJ
    ;Uvw8-֬nز:az(6ef9DƷw<C7:<gf8v/|G<)'Ϙs}Zu0"%S'01]
    0a!E &֌e!dt�oT$>Q;sfj8bZ	Ql`tD;LH}8I	]?;xV*5ˮĹ)>[>sL[O6㧻j;+CߗdvCZ8	bQ?>
    N
    '2vu�z	3҈gyqc.kGSx�>m%Mj܍X4pObB]Sa aVD'(Vjp~Y-Q}JG
    mim$ZCa<6&ִ0%ty�I
    hӒ7h�>".[E]'J[J}?tFDݑdS\;F:ߘH哓 2+М|W|TahLO
    0F$Ad~ʉGMqQi@@ۊ:>&3HJw#
    Ҷ`A^ZSͣnD/2(e
    �{+B9MNԶ B-zHMS/ƴř=H9ndՇ.^n_4J7%I:a̭FhaDE�=:䙸i=,6MAW@Hkcte�S717ý4\$gͨ/jiRPVԍ*)xH4gYng3)x�-!bW`Y d{xHш>@։�jtÏA2a�LF%<d*H” &ϐ1h/|&B\,%l;2xB(]~qYr%NTDQ XMgF	hZ/\~M5	w&"jQSd/V
    m]O]O<IP~fB j#K?S]UWc+?ڪQU;={SA$$ E{\C-)Qby"uZo fz0@fKNlp:^FݘYT=l{)
    ȣY@o"&FA1ܟ
    4g1B@J$
    т�pXp/9Ӕ.N{wؚ=ܗ?](V@N./ aV4.#�
    #\cU4tU-;TIy! )A"QʔP쵛NGL$X2@(P-1$&:qdR�D2�
    -Ad:3WlK7$TK<zbԹGO)Q_X+N:LWYbT衼K+W|𜞁(F/?22`wrW㶡p݀sgxzr #5D#?7O=|y]*` Zp;||bX7wK-,
    Mw@ֻV@S9LX:8P(ۑUkq`!ZrBqxĕx 0ߍCmBjx#N{Vh @i^P"y|GwCY&6SO
    D
    8	
    U
    xwGEW*؆6)rFqEll2Zs)F<E^!JO-,	
    4о, fK,D`n
    ։LԛD$RHBܑgOl#Ϧ12-L뤜IOQ=_KA؍h
    (boZuHVLމBL~pE/;g�<=msb)9fn`"șGGg'>'". @1pq>׶R*I?05{ˇ'eP#؞V8KHFs9psw|Z/re}	U=pג(/J`ErTh(hny$\#	~>%<ݻsA~
    
    $A"<JDގDzK%_A9nn.fm15`5̀ak.6L0G}b�sLO45bk`犍"N9OXt6[seL+'88abi~@Ye'_BtiRAm鋎LQK;!^¸$36}l`tTHAP74Wvd@"P~9v$98G)gΌQ&ʞO;NW_+އE"gHwq	5mՁW~R-3p44<o~\=Ro�;168+D$@2Z!};axdlJ]qj>GIFC-ьǢ
    aM=:=|]Ia%m<^P_F7?nzl%J;_=|o5<iݘCԉBI-m{FM	R_GFJ4bpb/Ƨՙ&[:n
    =4h-[|_F_T:-8<Ѭ4
    >
    =!:@B
    :GgJ2(bH*`V`uZ!YCЁ&O4j76I|fcB�bU[F_i]SKBрDŽNzZI#!A
    :32p0 W+_8mmQClP>"j/x\Q{xvk>‰N\}qd2]#5F�muD_;7Ox	7g}\v#fa"fIJ]H)XM鴖D^dt^bwq&NakT8(1V`v?LNa1I͕Sw<v&8igO8QڀOB)|
    ?jV{T:mx$j}<+ێ
    |Ek9+Z 66	rE?-³}bۻRJn՚QoXHT\'?�4-Y2h;!P0D猰
    x$bѬ̍.͸x,@5Pv	h҆@4P0/փhz.&HKPKZ5W/)4I2:!%$"h;q&T,q=H_5Ļ$juHU=]Ulfܸ`\v-Nk;;j&őA7U ߈4G33\M&koOЄ
    :H35G_ªWX A)ɕY&;/p24Zfh1%q;lՐ5ɮZm['nO˥OZ9$7+~{I2C;(^'^oZه>>	ueu':r&G@@ZNx>#v :"moIĝ#Bq49C|`v"qzŧ?¹2+z{n;yqWMX`NcF)J1]8
    M'<?Cd:
    7;=T6ʞa֗D~0stYxiZw9U11Md0	X'pX@xr"�bh�qPL%)6z5qOZ}Vk܈ʄY<8Li|>l?RI\5Gjx�qrN^]U!_B[qT$WcnXj,Z<9Cabvbܽm-B"!H}MYIwS*kq̍0S`3aSz#=fy:zŗt:QZ{BICѣA%Vg9S^vvn|Kb+\jZr'vF=	$$A8awv9q0)XVqX͉ƕ̲K}l `yZE99kAn|x9Y|fA:uT{rJ젲/DV҅<+w0N�5E3HP(܁1Fy*:(C%QFI1)<p@aU\d
    VgQԝrՕ醸6J_6z䴾l	K~5@ړ]æw	aJGD RBK"!5SՋj=#I ܑQ/fw8T
    Zb)BHK#g`n@*]4YCuD2(@:J"BR=RzVD3pĊ D:@b+zVW2Ip1NL0zS/RoJBv:l@΋I+:i�=-@H|4^AO(0CBlL`52 U#b?H&"޵yi[Kwnb0~PoBl JV$-�ȶߐx_F7򗳟*5+/#3_~|6(|l[‘ʉ"kq!#uO{EkяMԎZ>yp͜=2k2"7K,N8e̎|[[l>$wW1?bePgU}73͑%%2 X&J9]HiCﭛӺ?�tL0Sٹ<Px(ޕ8/y
    ~]2%Ή~M~6HBS3G=+I*ȒqH^RoàU
    u"~h/٧N1BNAٞ)vHϨ,FY̟D>koS@si0r9ETWI8_0X8	$H/(%xҚwcJWnzgz.%-`M949ܨ>ɩB~B=+HUT�0H-zh<wQ_uM[vk~7;@uv넜kVёh2slɬE_7LcZۀ>RFXC(&x$,[~U+02[CDe#"dU)2
    iE'ABhlAYE=yOrI
    hc�WlVU0fK}F?B۲�W9zCKT&e؉S㤵bSo
     Y= E+dk{'mr;ADCmI#G;d̴\m&"ez>4"ކ!rVC)y
    ZWޔ	u^'%~S
    :Lpip}Hi~@6HLlRo}zjHsjF8Lč2vg7/h~FFf24k04tØ5&Ks)Sг¼5R`|9-aeID7F;�pB0	υRp@CUU8I[Jv@\-LꄼNz
    `d+
    I݀B[gk4IIehaꁕ
    1T\gtm(L~vF)?&YZꝱ'(C}A6=5AM׮d*@馺I<O,*Rzs-szo#E/Q$qsaA
    0a]<l&8hcT)R!ͶV<K
    9.b=@Ϟ3pN(5ܥG>@9/^"w{N>qwT <"$a1Dž@lgc\=cqNS=V8`5p]F(mv_0dCgZ]@.cgkFSŝ1�@ze֜POdVTZZ-h\3/ԦWw,*'Z]xg7j4ۉrGAܷd
    B͙u	R
    G�H]?^-1T³]Щݤ>gj<A;[>1[jS&RKo$-MS5qXb$<%NWK'<
    :bDx1N}#چC
    M4X'*Jaܒ1i!j:mj{KO$Qb94w!zD~)?\BzTATII/'9EKM$*l,ػSYlIo)?is\Tu`G`L.VFͬ7�gB*"9:W#g'LTc0"¡љSg?8~jqx8:U@4jݗ~trn}tnRa@Sձ$h*T-Ic	)g̝T"CѰIH"�n
    CyKIRK>Mµ>N<r
    
    Ds@eВcZ!Io
    .3I,H]%'*DAECx-ˢ6nKp)h&Hu`?֨ YN(>ĻpB-/'&>ꥼAwC[HFr@ۨ{4#B&yWJt\ 9SS#R;ݴ* 6hw;@q A1Cv`o`yƞ?\؏s”tm[""4L
    y&=QYW3JPLZ)m,3Ŵo2JRAG,Vڨh$3թc'#	,(-NjU܃ZQW'Xюv^Ӫ1O2F.a!v`ETz@v|2x["A_ݎ6	x8ׁ#u޳'7(zc_ԁQĐhH%|]zLuA{=N3ZBK=d{K+<总LO41-␥_n0
    "B-Vzjšp%nijPM$ݳTYs9ʅpnR`T<%ŧk�c&Ao Kx87Ҧ}ѠCB2ȫL}
    L[CUH%GK'3˺JVT-:7=;)/RMr^e+\%xlݤ(6j^5j~EH%{1/ 7Mn!+f9$B	|T1Xm+ڼ({3PJx!|)c2GiBu?xLzH8
    Pk镚u:ևqLUlM۞z/('[Ǡ=nD=sz6L;r>|9|'#'|뮧vșggr&^0yIXS_?E/k~잺ט/v1Sz%^5eIlҙ˓DV}K悝Bjliղ(i[S! <#@uֲHa
    aT!oY~^=eëp'-rAl`<ҲK#i8s|Bwʫ/~AvϨ-R|BtsrxH8Dzے煹:~pv(@Yx%'7WZt*2ٕb/O4Lf0܈S0/
    H^[neЖTGW{(l.7%tJXd[VmqV&FTV
    4
    z:Bcvò+s[ =
    xq#<:sGP]'UTSkvndp^m_
    YC7˶քܖu
    yBq`)Կ]&Hā*ˤ4D?.ΡCE$ֿvm	s5ʚ+lgb\<K]JϼphRG#4J0Ɯ/J߀CDu-oRX18UXՂJeK'W,_6\QP]τDtP:6pl?6=fdќ{Ad@Rl/s@mR!V)nϙ#+O `%HP ++$[/
    `[VD^UG,bDD"TI�.}xC\Ѩvv;֧6mq\oj'#[6Ml
    +ql%މynp�ݴq`ֽJpuFҬf-!C}'#!j1YAUjUƾ5†v>	w.ո[1Q%!%M Cw(ߌ*:庿_7k[v!bj
    QY'!Y$PbIR9|~ǵ>.
    \}WC_
    + ,D)sM˥")qҋYZxZWdƐx:;+>y×uYB~:iA>8r]l<hdM_P=08KPT_E7>|W؎}F2B20Ox'vdmK؁`T<?Z
    
    !@Z2
    YfȲbiT}c[F[|Ù>`
    Z:"[wtQk6oi	[56Uh&�33MҐbg==c3*pڢI+0<k#[:^H99;Ъz'ڱ&4,c7WJDRb|}xN[щ#wnVgpE9_.2?6>)v`XxV	iժ.^0Bǜ;}%=2
    mCLiF뷼Y?]RAHkҗnwiT%w	'.>Yc2\Ŏ]~ucW;{hS_,N1]>_WG+?yGAoCǾ*?@?+:/i<B}q}fv
    NEN%Cv-}oY=Cl@�{X3?c=Ifpԙ;W>`լ8O.gT5*Sv ŷ(-zѶ`FM*wL,�VOy|	jFf
    ڷtᦶ㫶'.>pb9;|>CeAl`us5,%4Zrtf"qΗkJ#7WkupUf}3ܟײfq6%0PVUBa7'-$m׷:
    rw0>^~cZmv&IW(Uun%#ڻmc7Jڝ,Yz3^$oDLlDط+0xMvtGUOݫ<`a=CvOm;] .&R`n]/6~'{pĎ[{]cI/sGGoEV~($]4#`wv'>9ʼy~άjI/nۆ`֑I',@Niva#ZeUniwÿLe^{XMsZYo3fO>-og`;7YavJSv=/&ݵמ>`};	X+'`\U|\hJ1l=x|Fp>`4Tʵ,g
    ;/wa0g|wްcI>1ךZ^\9OtLJf㶣JEpĥU�F5q�Ǘe(*W+"5}}fls3J3*GeVE3{$ ?Sd hMx*#'GIlNwG_쏏.@ xfk#@V]csrkFe$<#gxe8#ROc֭$F׹p)w
    En߱O]?]lN۪໾'sn w^?^8/to%	6\:S
    *ldsscf?̉|SYw#"S]]+ -`ԋgAcwDf`ϫo^|-tgBo-M/
    n89Y6w}>7;N{9vöLqxi
    ls{V;|?)[ovmUASOwoz7cɲY[BNJơG~ςw8mJrCk`.M=n2yXþpT׭xc$U(͋mo6st̂{x}jBcnJ("GP-=Z8
    u#n 4]Ǭ&
    (ŕ
    FU'By'
    1X̟ݲՑ1ym:3	K[,鼅m2HCCahZldd.Ք3={80j2jR}`_߹ Ao4Qq޼Wuq mfEfn֝8uݔ/%Kqqhu6@9v0QSa%#Y}5lp׼.GHNJvODTpЅ7kg;S^8f՟.D=᥍ޯO _+糱,iηv~pq?$4'm!&]ʲ;X*ef#Ɓ7>(m~+f4@lE{ߧCo�9を;W9g1fO/M甀[`c/T֓_7JjwqTU)<̣)uw}>T m%&%,pS]bǧ	݉nj*:/Rb㺡;*}=x(ǒbA!Z0#/:
    UC̽Jd	FR( 1tDq\{|ӕhEx"ʵ*D!t6F\IvE56ŊCVL}9<-ړ<3en73xΆZH| B:hY2돆n[NҡVT
    {!n+,.5&2H]H?sN#~&ϔ?*|x1بṰIg9VmW^SZtm~,7k V#Q:!IvD⣨Iʬ(x[Yx;|%eOny?R(a酎x<NӾy)NI0AduƩcI775JŠwҝ=d/v0);?Z5g[ʚOcT7JqR7{y.̩!m�ҡm ,g33Q&rХAxopV rߚR5@Tژ/ϝ*bC|Gs&?m4՞^m{0CnjbC*2kP&Ym~CGn0&1p_1-dUچ䖑Xbaaj~̙G|PMYҴtTRr;66	\Jrk{<b\&Ql
    D=/839wAu6uKR$v+Yr|
    MJ,B|yנ@A}>׹Bel۬a&[q;%EFb
    -Ck?H(k~ՑK7)tG	aiЕBs,b:N_M[.T.c,.0m+8E
    GrFC5JA^D8QJ֟@e#'Ʋ8hUb=ʫ>y`Ү�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������׳#xlqJLۖ}F4~©h:qFaM\|0+lC>^ԂOf9
    mVz.�ٚ]Z+lQjW7Cݏ<xS2xi@)P^ӶH;HuEWCEh-U{"b&<(aܻ>(R"5AF"WQυTv6ȡ)B욟z䠧Ah,,p
    L0_<Dt.=>ܰgW֭By8dtȎ@1VuZ;=n-؋c&"XM`=xir8gsR8>9@d4_3ku7x@.3l۪tkgg	⣰y\0	JV�9gҏFl\N;n\	qExZMsG)䒱I.j^\꺀
    _@ n~fQaYZ]Zs<ۥ< KD)N
    MHMR|	`qixq.K?/_Һ`);QW@d5
    ^sCn#P'3yGP\2ajibj>IW;]eq[qne̅mzz1XU7D7_`zS#SCPdn|];mړ{tAܽ},sѱx",fb8}W4W
    9QTNCj2@@؆5nR&}y|eY
    vaU }}W\֗
    )�6J%iwucOP8<T-!^~2c<hj6"
    ްtThi+6HD3)zqVUi:g\?<yMg315R'rV:p;8_!&90eW6ϴ	ek	k1<Ҹڮoz
    k7w'}&Ɠ_l4R.͌>bChYM."jin|7o(;q{n?1;7	$?BTh>i<j7s*?ptQtުӱAIxxǻaO͎a		>yߧ?c|NPܘ?% c#VHFyzqmV8)` ~YVȗ}n;^oS5&Dlw̜8];6}YVʾݣ-wF$_8T`Fr泳IZһT:]F3Y
    R0M/+-ӐP B!$#HE@5}I`kR0(&G@PZտ"$F'J+Xleԁ2;TFvÿ4PR(Vh[y`ՅusLUNV|#=tV&db0+&amL**2Fvb5٩[<ND)m.tWJ$
    =[n 2'(kF@Y| Noy]_TV!9DmWfemqqEaOݫu]V.pL["�o܇H,tAsIOwGoeu[A"/ #
    r$Yg<qq._NyѥK>"<)Mj{|Rt%;ك\o{5w8a5n|52M`E?y1K\~Uq.x #{<zqjݹCʖ63#'BM܍ם2,.4lX38	I@!}2zd}mz`*\۱
     FcX">Q_eJjQ	jZ0͞H_-[' <$)9ÍA(<FF)ɲT] XFft4pC+m㧎
    
    "[\W*U,uWv#t_}ȥ݃G;gt{SU,6_kX�hإYu$!%lQ	vBN,VSoWHriΟd^nFt 0�Z9L^	03JmжKgɮ)ⓚ%Ԃ8VJ`<$'94yW1GA4Ыbj.̝AE̜KAm%$ώ&�%䁝xA5#v#H!,+1ٸo1 	KEdRR"̊Ծ҆K,f)AńQq&f͚?йCL9m%>1�B&
    +F㻘ݛ-+Z~Db[+j!^JkW~\Xt%+ܑŅ9>S6T<r/43S%cu}7y=~"w,Ldk@wT<3w&\5BEegwgd QBa4@͕}4Z,-_Nӳne|3&O&c7\حHw,͎Ώ
    i
    PUObWWgOjrU+/k.cWmpfM`å6Oc{y)H2Lb<(\QJRKN;cq`ʧ=Ch�9SJLGȒ̗yhdot!AxNg	.ѷVWLj/fJAlH<o5ނjӱ(S"%	!=ml[	xFSªk+"WG,A_(oy;!>n17j{L~_F95w|2x<*zMbg
    WO_0R<~*p[b=5MWyTcɦjGZlF}Cφ:�KW
    ;/F"_TWvS} Mi͘⟪E!F	Efc]fb@EA\.l|({`+uKisÉ@e;:q%_Aws~e^Cˏ?@U
    ~)pvŻf7_^gnWyX[/�,;~L>+5Vł])2:X<8#Ө`ƀnĨtCsIThFG$2KDbI߸xQ&y/Rp&^JpzFu2i>o$
    !ci~N2i$"=&Θ9 Dmo萫7(D
    HM4z	zvy%'!/Cͦ;yypmxlyuכL;宱pP]9{խ,1IR6X[4)e_C�6aS/|e&7Jq	fm0XSL7\\W"U6{zQubФΥr9hqkz{8][b!tT¼ofwt]pfO~Z�<w}Ӈ_mkܟDu+_Vս[O	m}{W=^;ӟ_ln/~sv/]f] O];.w:k-�.]3l=&'L�`I`Ɏ9FMszg݉?h�qM(=	Ld3֭[^\2Yz7JdwSOL8PM9/0Ӏ)iRvUDR<(U	[tJQ33bt#Fˉ~9|zXk;W!c;I'`u-OxG"zQߍG%?Nr�R<;,"LK+F_vFq4{h<0rWW7r,Ct%h5ODSk!ӵ!G^sD*
    f%ƍ%Fg�
    :	WnEۺsÏfV)L+OݞI41us0ppeOyEꆰvzv+:ا*v,7εrctop֝8d<^Kf骉>I	#9eo-!aj눳I,vJ;w=W[gtwӘzj!H""-_Shs!Iilw)wp^_l:qRO	y3^Aq|6,ΚSby2Œ͙!vf1DzGR.S)9,`ta(m:R*;o~ǩN΍@̭hv\qA_߹-;G5~Mҟdl\I
    B
    r}+&FaT~m)%InC_`1|x
    zUEGZ[\vo 9FȊw^Јt#k_y~3Vn%k֊۲ܓGGcW7dsVF*\վ<e{x7Z6]:$50?N#?
    =
    g1~GJ=C+!3K(M$hނdzqBgF6L*{fӸՖ{Ё;/4uVʙSsz_zG2Q,1cb> lV'6EϻuؕK:}C+uxujmy'n3ۘl^}͡NlkPېF\~X.'‰v 5ԕgrF{רTK]ճS;I?{Ƈ2j1
    `O֯41;JtOE^8mB3Γc)y-Lv6նx0,Jl!t7њM}KeAM}X=6wZͣU_'ՠoűy\=xxNamW,;8X7H)}{Dd)l—g%*kd,'!!dN|C)',ߋ+SՂ<&I[{hܤc-8"o=t	
    O5f
    3}|Q%kuHژ8H}ߓ/8®(Pl
    U'ǃE	+һ JveVEdMo?;{wE"[18W꺪r*
    n聙X{O\Jw`{pva#Ky"ԇ�iOzp'}>-Ĝ;.cт@~)Y7>}j{nMloj[\۰ѷ}ptD=m/med$uc
    [Ggw+㛱[ȶ%K\&[ܶ:AaSޱکl3QoE-q�eFkTjU`m7"	*t,K.LjjV
    =?F<2�캦�]m̊3s\	R"E4&A?A^6?3I/mH_@KS2iJańr'oLr$鼳0kN=1$|k^Դ=_.e5~S_66_u46]9ؿW5{?xWp7}}fu^xr=SF4;}3?uܼqkEr%uUCiWc>h-W&:=2$xhuda"iHBEٶx
    9maE+A֬VH@08-v�aF" H{
    LbW,YmL\cq9sCdko(/^ͅ
     J<}pGا3]G+O"[_!zހ4+3Ιu	Ɛ[Ŕ:yR8<噢S=՟}J<xe,7,@ICa/mV߬e"OQ	ٓ=%=4cŶfnK	_yl!~ϛUƉāOѕgZ.C\Ȕ2xɧiuJ3v|h~Mn.7۾ud>qyI6Xة+1b3 r;my̩ӟǧ06;=W-V5+~dX.)J?$e:X.T�gI0bIrV‚c,Xh	=zmP
    6;Hm^pN=`^:RzV)yK(qT &p-H"�ʦD%FCGk'mZ[zdy72%~.>~Z;2kŤy^
    A!4"3q7(,fٲ[=b?Š	Z^%k>Kv{yeMS
    k6P|OM<]On_2$vmYoe"rp+D}pN�:`qD9:/vek5R)ƭbfOqCԽEAE=p}(_YwIjh8??oƂ'āYn?BŽAM6	;𡲙 ޲PaL_d00NH}jNpz$2zHhD
    =BOEzTA訰(	GFHJpf3CD]m" Q	cτ
    #(FJ*N|ɕɵq!Z.bpʐXTQ˯	mWLO[4=Ork7G/Q'GK:Vq<Yhuv*
    و:<n)mlIK32~j{xR6cBd8}/ضp~Xvkk=EvcL5#-o_|鑓KFloy"ocVk}4tOTJHʌտN>z"Rkc}IkT;bmzMY_uul{_WRv;Z4V湾m*_n[.G~(NbY'}tw3{PM_XfJ1X[ĒYW+@Zijhm^UUWTJUV##Qv&WzKM2CF	khiM>t1H lx>|C+}nԸR)�8b`;PmAei!WU7/H
    DBB=?8#1)KRWmW䱃ic5<i"]-3O0`wWtMCmx➙7)V6t(=�x)M7O#x"^?Np)ڧm-knxoK=#$	
    CrOu_�dͅuюL䳀ZyVvzXtcS"+8up<]Vd=jFgHK%^]u`=s$i+͵?f9#Gܙ.qeFT9Mr|[@||p.:8t[a`ubpЭᵴ#咫/ݩYLPpbIsC4;>喵-ZidL0NJt.
    La :Lu0LvŰWTtȡ#FY3t?d'%wPt<VBq͔
    F=wǻ:{ȑuR=خFV	a;;%l:=
    5tF
    0	XV
    'ML=Re7Z?]n8]lِŸѩwͯ|թ%ʩÏD5z;>7wt)=ux9x_+yBiI )Ė<XäE`VU>lny䔁)wQԲ9:ɎqNj;|n@XXCwOf߲+u]0/?݁j-IHO}})qyǛ}kk$3-n䝎/`na扇ӷ+o|X@o]Ɍ]['bOQN?9̑@q'L't_erJqsk_Gn
    .t:俀|q;M<\vK2չ̴0=c-}mnV4*afDtU`-;n)tjA)8
    "A<H,	%1�bGTd:.+HD҆aQp�d92eE]j:qA?~|S[xnj=;DW
    W"A@S-(d2T}N/8kS(|M/t}_$dzF6]n0{V/ƪ(fdO)*[})75|O 8ob8Y w�4s>/n`Cto8b0Wa)5zP{/o5Bc&IBΝ61֑ٗ??Ŷ}Sw}`SYb>96]o2C?r]\n9SO{]u.J-qRl	]$oo-CkgNú'Bm=BI.]]6( glEX(P>0ٷfG6-ZV<f§IjZG��yA4&%/='D
    @	Ƈ
    DY*(1pP&y!73$0\vkWa>d1KL\FT芀b=pIҟhEwFj҈5<Ȃ:n<9\=M4Jo+.pqKWp>kjS%SqO^/9ee6g~om7K?#	\e7al7oz6>R?8/x{@qgk5H
    4RNu߷՟n1xf6r/>e78x3Ǧw6g%/B&SNm7fUf7}ڇ'X'dwGN_Ҹ#ZCIh]c0�ZU]HP_⊵#'ĸ?<pE@R*恦|Bf(EHH
    ~+⑹Rx
    "J$<yF
    :z˵bXoh0�A-pǠIRiD"�JD!P96jZekydɊb!?_R֨rD
    ٗ,i~RS1|QD0c\-ki*}AF6x"rs]rtqfw{??Z]xeE_^UM>WCWoߛxAe-e6s4AF_ʀمcw'^Ld)_ЅUꮯ`Ůu\rũ0-UBǾtyHM*+]3ٙ�G~]2k4'	v\0jjHtV3ВM]\�?msQBԿIĶs{칅
    ťui{-;N'pAK>BZv
    Q^Eq:MO9]9yz(H#Ps|UkwF|х`
    +6D~9U`MFA,HTtLt:/aN-H2VF0$~y4Á1	F{ÃB]zqqwgz
    21`=~ހoEnMD6(¢賂6.F$7B9srQ0l'q=cѽ՞P%5Ly:y~ژs~wLxx#N,ⶇXT&6:SG-Vb'l}+Ͱǭ#&Peҟ+E`\z3v {6؂v15%3($B
    kl_\{#Aaak]' MViM7 ߥjDNIBNUl |էnn\5>eS_|Gn.yg!y~;QKqʎk~Ka W?V_U	$1e[O6DG4RНZ},!c/XTkr,	t5
    G�rl	&6Ɨ-VfP }HR
    V�t.V,kY�㛈HL5Ԅ
    
    /ʍon3#SC.n.51�b)H
    WvJ0>}ˬmc:;B=\)ҕ&:sRPҾ
    ]6?Y=Drs5†(Wh$6bgaPv9ujWG>py�e'2()_z~2.^.+
    7TEV#~Cx-y^/0mm[2HIѮ>}BS?+]~?C.>؁qmw1KX
    k&zcY+b|)gDј;j<8;7Pdډ_{׾sF>qv�k=$Jɗia/߷fhoK>5k 	D;C<r2}pT!Ucljp,7[_dy}Ԃe`ͣYILUoVsVwϞ&Y^Wzs<ݴϔXV6V`VFY)i�|Z@W*4C/O#'& 5t
    ]LobC;TؔOs3`Σrdsεm#"B"|4o|
    vsLtc
    [IA%zѲ_3%`h@Y͚s|{@EcZ
    pCU[_[c	oSO3gQOh[K)T0_eFdo|!0g6N:D{|ouᅴXq?aV_05~ه@wcwfKfFI}Nnӵ!bPcO#?[bm0*5S-߹i?�D/jf}wnivzGcwbčt8Ckf_%טfM\|v=<x	k=d>{!O|2̯$$-a/c+E7;oO;YM;fg�O4~*yÙG:5?4]˱
    d		3:h<i8"5߃m#Aa\h̤Γv}Xj`n䱉p1=y[[EG(,~妜YPVښ[b;CVy>h`nTXReY(-3.%SBrySI^2T
    820i}2ce1@HR;p-+kۄ.?𱸛9�h:gaIE4r@.m֓%dU̓lr"lG1aچ@fG1i#Hy|ykQb+.dCO7`EF*蝫zs@І?c$0xнq7Jt5~`+0|JF.xFyGJ[+v%r2z 0;_7K~>^330Lȁ_'90޵x	l+m_|E|5Н}U{<f[NԔǏA߶×<Z$
    lksTuq%c~(7ObDžҘKRΰ8mP
    !\Fɇ
    n(zG-Hm|!
    '~WGAC}ވ[	#�".WSFՙȇf2܁TvB"9f@KV2oK+U"ζzf*=)5HY<}=
    -}XH%G'`:&eog1Kh&Ns|y:@_)jMZD¤DVUzp|D<Yg.I+AL"*x"]%%�>3 K&@5)ȝB#Veg}|*s
    v浑_侽wzY`p U@Ӎ'rG&c*j
    %YGBWv.V'+#࿫;D0`
    C;[BYƓ-HXL10(>.$o N
    ˆ@zA&R#Z,60b;ccꀍ'AJEU &aXZ'J#5Qۻ/BʹMQڙ:2
    oi>
    6-\]v׆w"\PN%0Ʈ1(0ٜ;2 [p(hslxiBsA)0
    S#1t煩ù#<,	<upAm~zFtYtSsGvIMҤ--.	,f.99V?60/ʁ(6@ x-95GMzYoX
    Wu%6V6&L}XP6hvf&; �ޞ|7pqh$m;[CgPn	:-ԦgV"OV_su-d#PKVܒ8`!VloBx#:]_;O5.[Ro
    l1,Dۊ@D[Vq>s dI
    FI�@PM@+`P�T^m5�`|YЀ
    :	B*SZ8ϙ|@4Kz0gs*Ҹ7D9'@F%bd$ٜ'A/n^	QXRoYlg5Ykj`Y@}z锝Pu4;`;Q;wer&V1ݖ"Ɓ#4OqEh&RWP^uQ屔Tw9;}\7}A-gh>'KU0;Pw.XHCyПXӻp˒ϗ4)sBDͅdlq8Wɪ bCDFXPD9D|ZXAMTH5zrwJQrj m[W7ĸP>m@	baMELN&r>.2ӧ絅־cп*ŵg[!#X00"Zetc#42+V1og@D•^zH7ʀS00HI:.t5 T$aq_[ 2Bfi-$kR0:sy*@(c"F5F9[-VD<k͈R%oz4{$ifuyc~JD*׉φ`9	!x״S5܆؈\2ϩvN%{+#B쨂>&\([V\D5:-l
    ԫǮr;LHjɲ_0$ۄye'ˏ<tD#;d*cYkL"M:ОAR0�HpOnUHmJcfS
    Cⶈ輁[6%/"r"f+ҏ
    +2x~\NB'c3I=z9fLHPq!	Jp"؊�zqMXuk&1-c\_	aM&vi`ygΙy\rdۉV=	<k<
    S?DMZ "J<$ϣDK	ӆ+
    lL)9N]ZzE&'Ti_Ue90kqq)!:
    gs=L-.4bEcA^_shU|I!.o]&]; gߟ^.tPZxKHs@>|?&sS㥳f|XUXNLci \BV3qE �\2:he৽>T32;]!.ټ?Mpјygn<:xvH\qxiF	R %dGJ\h1p.M40'/B{<@'(DKV~ќ3OC
    	
    g
    	o&=>^V,JM)mpSNhq^(RPCxzi:sw9<-sy7[j>
    @it%8dv.!D#\<*D>"KZ7:.x ՘XhE}Ÿ\g/]4PpSbWF7~M1�rF+N/ o/_¾G96dmy0]'vQ[lΝM*/B3
    u}[Nˑ7+|9ە0@b冶-(AO^S>5gb7TGc{	&4
    ćٓaBxbvg5VCQGD@q.r2(("2c[P"DڰɪSnM(bh4ƺQaeWvXetGz=2HSw	-gs.jן2l-tpOߗj>t/DK<zTYR'_h_'#HK/s[Jk~Kqh`Gk8DLWͭMgzK@SQU{FnG*0$R:F+Fhl7UF54LDA8Tk1Y̻tnK1ʭ],yfz7`f2K	"Y
    . pjJts|Xy+~6Ps{&zEuuePw8:G-\Z*jmUۚ$L4j%$QY,``:$6%}	4
    .e1	{zKz>L#$U-u!&2!g}Bic
    GF7:eYt\r]]|Ŭ;a%$d@Q'x3uPn
    P-&.FLۗL("\ۆsyп^~V.o-_ыa5ɳ'%ߤeXBᒩD3g}#ӽ9(^@o[m/
    GKy*$kI(EW!	m)/;?pw@PIjQ
    䧴EFBUipw1ְǘLBoqOۤ !|6h!J,9>H*hѹ:<ZCPM%7̯<}{~Qᣳ
    Oܼle~V dDTA^S^0Ȇq_׉ï`2;O-hR0YqD|шND
    ZtcAOK8KבBP,PD]<gJ\qb:xBPX:~_({d=ccR9x}sv?&&PxWU苭#G)m'WB|4aFr>�}9UX$k€4
    Mtn5(\wIPr%dy
    ?2PbHc|_훯	\׾K?DND+D;{ƤJMϏh=Z!ulOF*b˫ZESsKZFEEճ{?ﻭXm:21BO3uZxD8B:
    2M-r-ZM_�E=TmOU-Rr9cVjHOLiy0*ۯ07WCyW=Z;A&Vt]^<D]5ͦmiMA]<`8d^c0'
    ߶J]=W;[=
    7s؎X4ЗxpYnՅu]$`Ҳ[Yg!
    !^2dmbrCrB1b[)IRJO)7U+k!H|.2e̴1Cn_@>h%YQ|Aوi\7LVױ\̮T�ba<rW4�RĐaUo?yP<g	nл~N6@l'hv@(L!ʵ2nTZ8
    جz3u-lk=(	%1ίStOKn27=橇ٽYq#V"7pʍs(l۹.H(*ncJl\ri)Nq$S<_Nv$[r%V,-./w``T#ǾwqmI.f˯$\
    P˰1ͦ޻˺FWKJD_~nx|?cV'*s>SthIs؊ЅU}
    `Xa{am4;qaC	'*s' `@/^,^>L֝:Xa>
    ~oY&NLU[;(Mai;cLb}i8{԰׉͕#?W8UǿIqcȜBP	l"7AJjfL \2N&3nI&P,w
    @;>$-)-S9Ys@K4䇭&j\JnoG7=#=Bfù͌m2=�N^ufU)Ga�Ķ�Vd`(
    "
    
    
    s­3v\D"S*ajLەRJr�uh_U8hpa䑋jt9*r-H[k$vK+Fr�_@H#<c&!b;x4	#L2ty'+TALn?O])Z},0XaϯvGO!A0
    (wSS5[WIXbf^Qs/*G.=kc)#?tf<NrӇTS(c\SPTj_y�RiQ,EK~Jj懿CϝL
    ]MR=l=@RG\Cnk\˶~GlMO2	IG
    f/;x̗tçq)w?ul'~A	-̝{W?&?3>`
    K=V4}+{և{7kdؒ/®ua,H)qz,> Oh!,dӱսz-}19sRW*Zs<i_5'vnҘb1_{'[JY6
    'vK֦—1uhuuG|K
    ,p4iC.y(kjf6
    bG5!.NG' ss͝6l+d؇U	X()J)ɴJX.7rfpѢDH:Y;VIbqA*zP'~KOZ?nGQK_(^2E]_fO?´b;nrP/?
    r5~P~
    �\y	KpoX
    Lf_',PuHMUN~�-{GQ%X\GMWs/+6u(ׄ}&blI	\4l~,ȯm٬]f-Ъoe	dӊكƦ _~ZhƤc_hoCN쉙~~Z?cN۪yc)l(䱯oXa)=_لb
    P+6Jʰe}HMBhEp
    >w?w%>Q3h4ҭm`tXz2W66ϧg|t]0Q洒E+[Ha}z:5oq!y1?|RbGRcT?ZYk΍!	�(\*n?93(-&x묓X:;;z
    _,N_AFW%3*K4Hn73]|w7ǷԲlwhhbꄺFc߲شq{]uW=ꆡJс:lbPքh֬K *_]	:ENCV븅]f<%~Z8k1xEGYG%?öyu͝դ$n͍<~;%n篒hZ֋}IRl&fv]lNtᡯsb3,[ySKD^b伭(1U/[ȇCZ2+BĖ9[[Um
    a_RN^gY{v4cJmyRe(kQa!ƠG{A]3Vt),{(E(S?(t`z0қ,7ǟ%UKucθLW4Cgu}砓mn1wuWl|X"67j>we 6@(Tj	W
    &-S~VdS;?xt*tk/.έ{a)
    A9iߧ[ J"]OZѵ{-0 :|!NJlnr*6Q&kɌfZMIEE҅FKW6
    C	&7*QTS!$&V\_0V�S 腧XjKꍝ@k\JQ4Ob/~m:n-xAd)ΛMw\?rTL3Gɲv_%*mc{A.=s9ۛɎ>ÛܠL8ؼ*٭7ތ-..SaX|�xco=6r#KG}RdVˆ,}	$L-+:5�!dVo7cOTw9x�Atߞj2;fSdL	t-4|0&$_Xޜٜ|شJ=
    YEstxl\I޳ճҤ5iǍqn-lw(&ЫX*^nѬ^ΎQ}oibՉ
    {곲&M͞ʋW*$8s
    C A?nL66eR&]0.-KɕL=u}yssDBչpr2索\jL�dB!9I,]Ki$Pb H:yJvۜfJj2b|%o*ȇHȑH|@dT2"|2 i[F]Gz>4һN.~¤@/q)D:A4Z,{y`r}0r
    /�^&TTw>U͟μ7,VYK
    d`954ثK,2A�dфgC\덤APM%�؜~zE`v^b9@\8'zi#=&o3K	ɦbwPcPŻ)*
    G#i~u?xA)#>kPlpv۴xu}B<0;$E&؊F<Rcm8P‡EʃY<!ջZ΀T*3epܴ'!l.~NG8ww86OħLْ߭S6uCZ.B+b['Wuv˶
    sEaz.qOԉkc|j$u6�.Ig,K11~$) X
    -T�,2Khtɪ>,?8.�X3(FTs4,	G7sM -X1�Ev<s[vQ@
    ^:}` e
    ^{~
    %aoICA>x!궀4™<OSD]&spb6D+Q?
    5B:QD뢬g!2q6+g'*Q/3LXDTi耼?82+FNƱC23~DYOĶOak+t ghixL͛oC~lvy	
    tpU*DZayn!zϸY5Ϙv~J	MR&7?kW0uow?÷ZrrbFGJ!ƱFmjdgS'sCAWVCϮ=FIi7
    ӧWJbQUň=etvr~.#"k=|mw#}al"n3
    ޚ_9@e=Zȋz9vߍ6hc*~yTU`CADZNa	- L=FmE
    U\qYRi&ʬXaY1fx1O`!U.m%!xkhV6h<1%j$1sI$Zx<Z:="A9197~K
    q?H*kqc�*07|0{<"ڡ	#XA0rg
    <5ʱPD}ұ}e(ч !0t>\2�]xcҫ_c-Ś^m0f؋5Jί-f-e-03*
    CZA;̹O7QIi$l lr]g`,xW}g~6[T8?\dP8cpxa	O*v]ۭ63I3L
    Vd"É@Ϻ
    +@\\x6=gfE_Q58`޻2?q5,!CR w{!:)+t<(ɩ&ܚ;9=3~h<{'sF
    UiRңZa^)bIٕe{Z;|J(d�UP823p'l~9ASTX+@%eB5/Dqqih"Fo3O*\~S%tr]jؼ~?/,0BE
    jE3VCKʎG=yN<92-@/d$JxpS]0+BVP&^rYd	6LUĉ|;[ҫA)A2#s(alzS槫ਆ>/
    eLmR O`|/ݶ?UM?VnbUy1l5YתQa'h$3R{B<Z!@Y\;fUkqxc�)")yڒpҠX,z۟uZwLӁT0u
    &hYCWa6>h|;EǎY}_SbԚv39|<Kf�BvvvBO`5p#aJ5
    χ=}}Lz6ЋA5űKbiCiw0+,wV'X.
    )"CЂ죝"68G,כ2q̴	
    VVc҅h8֒a!ps%_J.FA]J֊>
    
    D*%5YuHm4tC_<
    Vo/M\	
    ا(AAKil#$[}_1?H>Ciw_~%GTp=ɓ/ywMn9a(MK/c@T\]:yɗ}a vf\ +l$ɄՙXG7{`˟x%?8I}1{+Ě7گ^ίtϠȏ>gIWP3Ǥ%VoVwpF)Fڞm]=jj!yiakvm{u玙<5X'_)s)[͈(NvCUkKrxo#|O}!zz&:2zZ`qASsKy$5Mռٚ7 h ~˶eyTxuێ4?|iy_ӢS҅ʅ;-!�
    T 2]r&q
    `IsGE +"GA%mwpDh@^/
    �||$&A1NEAk�
    c8
    4FO؁0wjLȪ',O�saLQanH+Iz^W,Aon߅Vʌ6XVTBa_ytZ&?yF]:g+"dԴr7{ߩ	']tDlL'sA\cǿCo//&^8-2"-!pICե?Y;r7Pe8:	IĕW8@DX\:рiwu3ĵDu޼۹N֯[^b>P^/DSH:"v;Nƌ=}[E7GqY%p:zd dك�!:(6	�X^t=T%Pɉ)7(dl>ky
    *-N3䏼\eE-T (J#jD[�uS.w?ZO`ہH|y.9hkq!Hy
    A_97(F;.
    Ba\Ndf@7cWiPqZ=&'-J2X bAYEF!�g
    _µ1�B	oPG� /*.+S~SU?|ȯtbO/V�cY"qӊ1(;ͿotL	S&[aㅥ׿%2"~0o˟֍6>[7XOYcOK5¢	.rҀ|n4~:/p@<O A@YI-v-2<ĐFE\ڊV2+g猲RY2aed%Fܝ�n`и@b%	y=0>)&bb4yaZyjwvM(@�CbD)eRH;J:tqdж+Ϊ}^ ՠVkgF#$)[j0&\S`@O$(S%x\U:}UL~`݀{2S4CSL5CQ%A
    ŢX_5[YHFd8m^,yee(z$t,M'p+}
    f%k6Y(iC{LG5�ԭ1QwΜ�l.fSi^7C(4oOJbSgYv3}5q%؅ӗ"Te|o$tm,kd4A>,
    $x:[ɯOQ9yb.?d]4	@+*0skԅoд@
    
    :BSsD79kM4K"^pc`|e%B#Y-pѐ;ˍ3^@_ZdEK)BR6jPnT#S*iѼ�+]iqw՝fŜu.ƎG!3
    V)(Бdk�pW9oJM	9jc8csbi-V᪯uBkx/C
    dBJ(@U	Rs+P2;jPс~wZ ݂T+F"8iiLНֿu}\\2cL7i-tlc}'gD/1zDoPtf&ٜIvT+uBӒR0SEe˺~]39=Jq֔Sk4(2oB(eH.Il<T[l>*AHGRSl[lU|M~mI[Q&<$6ro⠭X
    9}Six+LNcec'4
    +Sς*Tju�飝p8v~̘	0q^<%`�2çk-
    u|;~5㩓m!xhS|BKl{*l1b`R$ة@57ė[PLb"gTijscGlF|ˑUyObGfhZ*P
    &-%rk[
    (iA0mp�82<Qy(@ kMҪ(@)	\
    w:tP\뛯~9_\FHrM&oEZ:y08RA@23W2#\2nmjqTF.k4yf(tzG[jpVנ>O%Q(,nVO\2ӑIt7\�jX[q'#ݹϨXmAF>XݠLh\5wLBR!g\=!@`f#R_^Lcs5LpRR6O@:-RtBeYkeXdkM!!B(,lu
    DF'ug7Gp ߆Q!D$xXS]^2wX=8@ys|%iX-=u|#:}J<.5#v7A~h@q-<	dWAKI:FLaHy\Z2Vm߶^U	XW<6U ̮fs}7;^*�@ѣAfE_8?B{"x˱jkFMuQ#3>suV6{|,-Hq+VwK_<[ݽ"^d6]t#JҼTHmZScJ|,>ftEi^SgK3	Tȁ	Z4,JA0ЧMiYr0X&$察:MrQܥå�Ō1
    skL!J#"g5|bIWhт%b)gP-Չ˱scP}ksnn\|ZK\
    
    -m&W.2em9z]mw*P^sPt>X}HTZduCLfVz<BB;ZԂ�0ǯmh qxaq[	QR5|eui]z;iv2|	(vwGD:0nrt້xt鼖Fh2qVs*	9,c9^k@GaQ2I.!1":×;$lH{{dY#\bB"ĸ"1,g0})3́SptFf2mM1ZM}zYBgM[<#ҧT.]F;
    8w(`~	;WWVՕPX/Ek
    <JHqSq%2!t?!cQ/4\}Ɗl:OW9h m1{!xwT&O%	-0B<˅xPC2
    }Ėڛl`Wh6ʮlu2SchSRqmMϘ̎L%FՀaLLeYLJ[9k�a h'@p`Љm^I̶J`5XNJRd5M`xPnˮwgKN(e-QdMXD#]YM-G٪f
    >sw	1=o]M[F1 ̔:6\墲]0pqm7uKel4R2qoP"JP̮meNkik`GB
    ))_!Ժ _</wRl@Rf4]voo \Xẅ)lZ-"[ƹlL<7aK^W1볨N'Ce,R[O
    ^"|zf+c! lWbCL!qmMfQ9zs~^@hڔCQޕ*k/pDt֯s@Jr-XL-]==`t-7o7z7ZpiZ(CR87Л;0)qixF	d8Aפii~:40٣X#d5n_D/zE^0%׉)tᥱ~Z-0TjX>KUn&'W-;(IM3sb*TH
    aZ9Z[�iC3P@qCOgp68$~rVIL)"`Cj-H
    }k~2XX	병v
    D!.�@-d&q&opcWj&Q`lQ3Їz{Euv$:]n4tڸt.žrDdE
    VYXo64Anub+lY>2T]PD{CVA=`3bԚF[LI ;
    /Hi	AJ=&_TSN4EBQ.<4
    Pev
    H`.C"_W"dAy)+7c5JRX.qFYg
    %6�oY*	--Q$}2$<Ra-
     0$ԜYwYv'S3pnWeH~8EKj|3e_+ڹnrcVr
    ӉX0F%mVFT4}OQiӸ{`.~dE7$Հ^7-nګ
    !ő$8Bueń9<`V@\BJk3DL`0V\ޫq9(7jڍz0u^WJAKDe2Dhe5_Cl(lx
    "2*px}MX@.WgScka{ѳ4A/^_j0lj7leT<ymi(
    [[!
    kןA>cȀ~>yH0ZI Pgœ!ōo	,N�w�	)juwa:qV\*x	o#dȨ5;[A�BH*L[0H\
    藎|cKG6"J`|>%/zk:N^WOkptq+iCC	@/!3H/rQ-)9vg&=\pث;jmBX9
    yݞ;NQMN^3z>yjIh:WBL`8KUt;j( 1 J4M<iS�ᭂ@fhtB/`)aPnP;'{8 }+`iF4-[;x$>|S>@]*}C6;Oxn1{tpL1idLf4)cH蚭iT̩|j54+STH$][T
    pz[Lz!9
    np͚5'ǏG_4CmήZ
    XwwPݎ~(9:"dZ�<}pR@4?C@h1O81GIWCBXgI a	0msj`l5`TB	*O"E: nmwERJ:	?QZz7o|ai'2�PbD5�*ˈ
    JM30b ͪX`=X5,G_)QX	H?ܼ[+V0XxF5F (M&
    M0УpHnPX:sf@~
    p)2b/hz|uSjZ5"q6B=PHڂT<LiC!LLj-A[Ӈkw
    s$x=~A-K:.�@#VH_BM4
    q
    )U̦
    	Y>
    ~dZ/F=4h
    |)hu!II{ cǡHS}�hP�䉂묎'B:]և 7rw9'UmǛF5`	@([v$[b@(TefAxOx~lMPAgu=~1݉/@GV#H%vK$@	YRL(hdB9)I2
    `)5]֛GbN0*8 zu"z�o`LJ	^P@'y 
    a!O<k>~hAafnR#231qɄ_N10
    tH_z\F0(]$]LxS.{O|O3B _ 陃nIQրk4 樰YSX[k
    )b-[`0̫+kS.H'r`/e$#-ѱa7<VFdx0@<Np-p: 0	hd4ʶχ3XzL>)OCωPQ+wAzἾ&m	_V-KE{)t54	T.+9E8CX3*Ώjq0j* g"PoB#3CLBe@u5v<!!0"�τ܆#�iBm�/:~'G�O$K
    >F_$I˔EVAKq8^u^V9:|@ )}ِ(3I@CRDb"x7/,9BVIc36y.Uu.[?ӮRK!1"(P>ޱxۥssZ?˾)0kɊ_zA6cF�xz<\[~.7켜|y
    -_WX(opKf^<L\n
    ~,o?o9.DHd
    V:QG:Ѵ<fA^dN]?A z.51C]׾/]?~a7VVO6_L�|#$
    ǀmݳ֏Aww'j0=<
    K7Eεa0_vQ3����IENDB`p!S��%����7VbD3� %����7VbD3� |����������"����/�i����xXklT>sa{Iq1ik <%4m W^BMAHӀH	)(?Ph6
    /6RkU
    ];wg@{W3w<Μ3ήk7+ńGK|Y)2ԱD>׌41X>4cSWUY+sJ7ԭ:Z&$^$2YOOLQw+�;3Q#݅{~G{J5uwt>:ec3b;T_͈gs._ixO/8G~RsM޷>|&J%|;/>/>{/kU
    zP&c_??s}Ϸ'4M|E|Y]R?6CqP9wD"wkB9D6(
    (.0GgNqF˓BVS5ͧS';( \ID`qn?1oLŵ<)+ʏT-
    C&vQ*M)}"U7}Z'x517zn&]&XMkb2Kՙ:'a g?-No&Ӽ9>&Տm`<\\ G~_&t^Y?,Ɲ,;Q8RG'o6o8~zSL'svN
    ռo\{>Wk9rȹ\k|; x9;#<&}n?ؓM̌KT]Fk\#	}k"vy˹ϵa>>#['_?IZyWQ1Jl.
    ɗeK(cmYtڅZ?N+AǏjG_BMg7+s%IN9?>3R_M|P+*J.'
    3]WWpC矠ʇ0(wPRʯhn#(Eaj|+2\UY_(~K4]Mc_P'_^t1
    zc"g|b^}y8^b<eo(L
    K8ͱ`G]_r
    /&uW
    /SJ%/~@K|pBo~Xˀ۔<Vr>s%�N'oP/w+$-J^M'oW;|n%oWoE~3>jY΃[O7G*y
    %_|w�?i%pR[SJ^-JεJ z%x�ެK*ypޡJHF~o{!ky|uCeqBϿnޤ
    %ܟ775o;39ؑ*MiZhl+Z!1a@o-V15k5V{ev,.n[]=?ޙHv
    a?C؋(~F>Z䷣e`<oʒM]W
    Q>Us,6~
    |ˇ*OJ<E51F2Wq0>L%!`o%XG}[W
    c[s'vPc]DZĒE__c7Vgtvl2|zҙ֖U5uɐ"GQD=<o|*S+ht�
    Ai+rmKU]]m	joHVc{x/X9HƝa7[$꽸%WVJ$6g}>Y<H^ۅa;Kr=UZn+wNm?w[KnfR.IۄkAX!pNV ,e%pqяU(n9m,ۍ3jI	~/PnpppzW4-\Fp	zCfp)Vk-5!,@X|`zvڱaw^.Jtm}MH/��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������b���(�������������������������������	����
    �������t�������������,���h�t�t�p�:�/�/�l�o�g�b�a�c�k�.�q�o�s�.�c�h�/��,���h�t�t�p�:�/�/�l�o�g�b�a�c�k�.�q�o�s�.�c�h�/���������������4���m�a�i�l�t�o�:�l�o�g�b�a�c�k�-�u�s�e�r�@�q�o�s�.�c�h��4���m�a�i�l�t�o�:�l�o�g�b�a�c�k�-�u�s�e�r�@�q�o�s�.�c�h��h�������������&���h�t�t�p�:�/�/�j�i�r�a�.�q�o�s�.�c�h�/��&���h�t�t�p�:�/�/�j�i�r�a�.�q�o�s�.�c�h�/��p��/����0�������������D���T�i�m�e�s� �N�e�w� �R�o�m�a�n��������������������������������������D���A�r�i�a�l���������������������������������������������������������� �D���M�i�c�r�o�s�o�f�t� �Y�a�H�e�i��������������������������������������0�D���L�u�c�i�d�a� �S�a�n�s� �U�n�i�c�o�d�e������������������������������@�D���W�i�n�g�d�i�n�g�s�������������������������������������������������P�D���A�r�i�a�l� �B�l�a�c�k��������������������������������������������� `�D���C�o�u�r�i�e�r� �N�e�w���������������������������������������������1������f����������
    �������	��@����?��" ��d������d���������������������������} �� ��d������d����� �������������} ��" ��d������d�����@�������������} �� ��d������d�����`�������������} �����d������d����������������������������(���D������C������������������	���������������������������������	������
    ������������������
    ������������������������������������������������������������������������������������������������������������������ ������!������"������#������$������%������&������'������(������)������*������+������,������-������.������/������0������1������2������3������4������5������6������7������8������9������:������;������<������=������>������?������@������A������B������C����������b�$���:����t!D�����������������b�$�������l$1���������������2�$���%����7VbD3� ��[�����q�����c�$�����������������@�������������8�������������������������������������������������>�����������������������g������������4���U���d���U���d���U���d���U���d�����
    �����p��������p��p�������@���<�����4�����������������������������
    ������g�����������4���;���d���;���d���;���d���;���d�������(���p��������@��p�������p��?���������
    �%�O���������
    �=����������������������������������������������������������������������������������������������	���������������������
    ���������������������������������������������������������������
    �������������������������������	���������������������
    ���������������������������������������������������������������
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ���������������������!���������������������"���������������������#���������������������$����������������/��������%����������������������&���������������������'���������������������(���������������������)���������������������*���������������������+���������������������,���������������������-���������������������.����������	�����������/����������
    �����������0���������������������1���������������������2����������
    �����������3���������������������4���������������������5���������������������6���������������������7���������������������8���������������������9���������������������:���������������������;���������������������<���������������������=���������������������>���������������������?���������������������@���������������������A���������������������B���������������������C���������������������D�����������������P���������������������������������������������������������������������������������������������������������������`� ��������������̙�33���`� ���������������������`� ��������ff3���33�����3�f�`� ��������333�������MMM��`� �������������f�������`� ���������������f�������`� �������������3����������?��" ��d������d���������������������,������} �� ��d������d����� �������,������} ��" ��d������d�����@�������,������} �� ��d������d�����`�������,������} �����d������d������������,����������?��" ��d������d������������������ ������} �� ��d������d��� �������������} ��" ��d������d���@�������������} �� ��d������d���`�������������} �����d������d���������������� ����?��" ��d������d��������������������������} �� ��d������d���� �������������} ��" ��d������d����@�������������} �� ��d������d����`�������������} �����d������d�����������������@����?��" ��d������d���������������������������} �� ��d������d����� �������������} ��" ��d������d�����@�������������} �� ��d������d�����`�������������} �����d������d������������������P�������}���" ��d������d����������"�����}��� ��d������d��� ����"�����}���" ��d������d���@����"�����}��� ��d������d���`����"�����}������d������d�������"����`�������}���" ��d������d�������������,�����}��� ��d������d����� ����,�����}���" ��d������d�����@����,�����}��� ��d������d�����`����,�����}������d������d���������,����p�������}���" ��d������d������������ �����}��� ��d������d���� ����������}���" ��d������d����@����������}��� ��d������d����`����������}������d������d��������������������}���" ��d������d������������ �����}��� ��d������d���� ����������}���" ��d������d����@����������}��� ��d������d����`����������}������d������d����������������������������� ���(����	������������
    ����������8���
    ������
    ���Z�������$0z��_����_���������������������������	��������`_�����������������
    ����������������*�����������O����d������ �����������������������	����6�����������@�������	��@��
    �������@����������8����	�������������W���
    ����������������W�~����
    �����
    ���N����������������������������������	�?�������������������O���~����
    �����
    ���N����������������}��������������������	�?����������U��������r����
    �����
    ���B����������������33�������������	�?����������U���X������r����
    �����
    ���B����������������33�������������	�?��������Y��������V����r����
    �����
    ���B����������������ff3�������������	�?��������Y��U���������r����
    �����
    ���B����������������33�������������	�?�������������������r����
    ���	��
    ���B�����������������}��������������	�?��������S���V����������r����
    ���
    ��
    ���B����������������ff3�������������	�?�������������X�����r����
    �����
    ���B����������������ff3�������������	�?���������������W������
    ������
    ���Z�������0z��_����_���������������������������	��������  _�����������������
    z��������������F���C�l�i�c�k� �t�o� �e�d�i�t� �t�h�e� �t�i�t�l�e� �t�e�x�t� �f�o�r�m�a�t������$�������
    ���$������������
    ���
    ���
    ���Z�������1z��_����_����������������������������	�������� _o����������������
    ��������������C�l�i�c�k� �t�o� �e�d�i�t� �t�h�e� �o�u�t�l�i�n�e� �t�e�x�t� �f�o�r�m�a�t�
    �S�e�c�o�n�d� �O�u�t�l�i�n�e� �L�e�v�e�l�
    �T�h�i�r�d� �O�u�t�l�i�n�e� �L�e�v�e�l�
    �F�o�u�r�t�h� �O�u�t�l�i�n�e� �L�e�v�e�l�
    �F�i�f�t�h� �O�u�t�l�i�n�e� �L�e�v�e�l�
    �S�i�x�t�h� �O�u�t�l�i�n�e� �L�e�v�e�l�
    �S�e�v�e�n�t�h� �O�u�t�l�i�n�e� �L�e�v�e�l�
    �E�i�g�h�t�h� �O�u�t�l�i�n�e� �L�e�v�e�l�
    �N�i�n�t�h� �O�u�t�l�i�n�e� �L�e�v�e�l���6���&���������������������������������������
    ������������8���
    ������
    ���Z�������d2z��_����_���������������������������	��������^ O�����������������
    ����������������*�����������O����d������ �����������������������	����6�����������@�������	��@��
    �������@�������N����
    ���������6�������������h������	���?��� ��������������̙�33�������������������������������`� ��������������̙�33���`� ���������������������`� ��������ff3���33�����3�f�`� ��������333�������MMM��`� �������������f�������`� ���������������f�������`� �������������3����������?��" ��d������d���������������������,������} �� ��d������d����� �������,������} ��" ��d������d�����@�������,������} �� ��d������d�����`�������,������} �����d������d������������,����������?��" ��d������d������������������ ������} �� ��d������d��� �������������} ��" ��d������d���@�������������} �� ��d������d���`�������������} �����d������d���������������� ����?��" ��d������d��������������������������} �� ��d������d���� �������������} ��" ��d������d����@�������������} �� ��d������d����`�������������} �����d������d�����������������@����?��" ��d������d���������������������������} �� ��d������d����� �������������} ��" ��d������d�����@�������������} �� ��d������d�����`�������������} �����d������d������������������P�������}���" ��d������d����������"�����}��� ��d������d��� ����"�����}���" ��d������d���@����"�����}��� ��d������d���`����"�����}������d������d�������"����`�������}���" ��d������d�������������,�����}��� ��d������d����� ����,�����}���" ��d������d�����@����,�����}��� ��d������d�����`����,�����}������d������d���������,����p�������}���" ��d������d������������ �����}��� ��d������d���� ����������}���" ��d������d����@����������}��� ��d������d����`����������}������d������d��������������������}���" ��d������d������������ �����}��� ��d������d���� ����������}���" ��d������d����@����������}��� ��d������d����`����������}������d������d��������������l
    ���d
    �� �������������(����	������������
    ����������T���8����	�������p��O��
    ���
    ������������p��O
    �~����
    �����
    ���N����������������������������������	�?������������p��f��
    ���r����
    �����
    ���B�����������������}��������������	�?����������6��O��]	������@����	�������0��
    ��]	���
    ����������������0��
    ��]	���r����
    �����
    ���B����������������ff3�������������	�?��������6��Q��m��]	���r����
    �����
    ���B����������������33�������������	�?����������6����C���r����
    �����
    ���B����������������33�������������	�?����������0��
    ��:���r����
    �����
    ���B�����������������}��������������	�?��������i��Q����]	���r����
    ���	��
    ���B����������������ff3�������������	�?����������6��
    ��C���r����
    ���
    ��
    ���B����������������33�������������	�?��������i��@����I���r����
    �����
    ���B�����������������}��������������	�?������������@��:��I���r����
    �����
    ���B����������������ff3�������������	�?����������@����I���r����
    ���
    ��
    ���B����������������33�������������	�?��������6��F��m��T���r����
    �����
    ���B����������������ff3�������������	�?��������i��F����T������
    ������
    ���Z�������$3z��_����_���������������������������	��������` _�����������������
    |����������������*���&�����������l�-����������#��������������������������	����������������X���
    ������
    ���0������������������������	�?��������`����
    ������
    ���Z�������3z��_����_���������������������������	��������`_�����������������
    t����������������*���"��������O��d��d�������#�����������������������������
    �������������
    ������
    ���Z�������4z��_����_���������������������������	��������`/	�����������������
    z��������������F���C�l�i�c�k� �t�o� �e�d�i�t� �t�h�e� �t�i�t�l�e� �t�e�x�t� �f�o�r�m�a�t������$�������
    ���$������������
    ������
    ���Z�������d5z����������������������������������������������	�������� _����������������
    ��������������C�l�i�c�k� �t�o� �e�d�i�t� �t�h�e� �o�u�t�l�i�n�e� �t�e�x�t� �f�o�r�m�a�t�
    �S�e�c�o�n�d� �O�u�t�l�i�n�e� �L�e�v�e�l�
    �T�h�i�r�d� �O�u�t�l�i�n�e� �L�e�v�e�l�
    �F�o�u�r�t�h� �O�u�t�l�i�n�e� �L�e�v�e�l�
    �F�i�f�t�h� �O�u�t�l�i�n�e� �L�e�v�e�l�
    �S�i�x�t�h� �O�u�t�l�i�n�e� �L�e�v�e�l�
    �S�e�v�e�n�t�h� �O�u�t�l�i�n�e� �L�e�v�e�l�
    �E�i�g�h�t�h� �O�u�t�l�i�n�e� �L�e�v�e�l�
    �N�i�n�t�h� �O�u�t�l�i�n�e� �L�e�v�e�l���6���&���������������������������������������
    ������������N����
    ���������6�������������h������	���?��� ��������������̙�33�����������������R���J��0�������������(����	������������
    ����������p���"�
    ������
    ���H�����������G������������������������	�?�������������&���
    ������
    ���Z�������$6z��_����_����������������������������	������������O�������������
    ����
    ����������������*���&�����������l�-����������#��������������������������	���������������X�� ���(���
    ������
    ���Z�������6z��_����_����������������������������	����������	�����������������
    ����������������*���(����������l�-�����������#��������������������������	���������������X�� �������
    ������
    ��#l�������7z��_����_���������������������������$�����	�	��������
    �����������������
    ����������������
    ������
    ���Z�������d8z��_����_����������������������������	��������
    /�����������������
    ������������&���
    ������
    ���Z�������$9z��_����_���������������������������	��������_��O~�������������	����
    ����������������*���&�����������l�-����������#��������������������������	���������������X�� ���(���
    ������
    ���Z�������9z��_����_���������������������������	��������_	~�����������������
    ����������������*���(����������l�-�����������#��������������������������	���������������X�� ���H����
    ���������0��������޽h��������	���?��� ��������������̙�33����|����������
    ������������������������������������������-�������@����������(���(����	������������
    ����������N���
    ����� ���Z����D:z��_����_����������������������������	�?����������`0	�������������
    ����
    �����������������L�o�g�b�a�c�k� �p�r�o�j�e�c�t�����������O�
    ��d��������2�������������	����6�����������@�������	��@��
    �������@����������
    ����� ���Z����:z��_����_�����������������������������	�?����������P
    p����������������
    ������������:���C�e�k�i� �G��l�c�� �&� �S��b�a�s�t�i�e�n� �P�e�n�n�e�c���.��������Oh
    ��K����������������������������*����������	������������������	����:����������@�������	��@��
    �������@�����������N����
    ���������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+��������������
    ������������������������������������������-�������P�������������(����	������������
    ����������0���
    ����� ���Z����;z��_����_����������������������������	�?����������`�P �������������
    ����
    �����������������~� �����������O
    ��d����������������������	����6�����������@�������	��@��
    �������@�������T���
    ����� ���Z����d;z��_����_�����������������������������	�?��������������������������
    �������������N�o� �r�e�v�o�l�u�t�i�o�n�,� �o�n�l�y� �e�v�o�l�u�t�i�o�n�.�
    �l�o�g�4�j� �i�s� �n�o� �l�o�n�g�e�r� �b�e�i�n�g� �a�c�t�i�v�e�l�y� �d�e�v�e�l�o�p�e�d�
    �T�h�e� �s�a�m�e� �b�a�s�i�c� �p�l�u�m�b�i�n�g� �o�n�l�y� �d�o�n�e� �b�e�t�t�e�r�.� �
    �F�a�s�t�e�r�,� �s�m�a�l�l�e�r�,� �h�i�g�h�e�r� �g�a�s� �m�i�l�e�a�g�e�,� �a�n�d� �g�e�n�e�r�a�l�l�y� �m�o�r�e� �b�a�n�g� �f�o�r� �t�h�e� �b�u�c�k�.�����������p
    ��n�K���}Z����,�����p
    ��n�K���}Z����+�����p
    ��n�K���}Z����K�����p
    ��n�K���}Z�����������,�������+�������K���������8����������	��,�������	��+�������	��K�������	����6������>��~������>��~
    ������>��~��������j���
    ������
    ���B��������������A�������������������	�?��������0	�j���
    ������
    ���B��������������A�������������������	�?���������N����
    ���������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+�����p���������
    ������������������������������������������-�������`�������������(����	������������
    ����������R���
    ����� ���Z����;z��_����_����������������������������	�?����������  `�������������
    ����
    ��������������(���M�o�d�u�l�a�r� �a�r�c�h�i�t�e�c�t�u�r�e�����������O�
    ��d���������������������	����6�����������@�������	��@��
    �������@����������
    ����� ���Z����$<z��_����_�����������������������������	�?������������L����������������
    v�������������l�o�g�b�a�c�k�-�c�o�r�e�
    �	�J�o�r�a�n�,� �S�t�a�t�u�s�,�
    � � � �C�o�n�t�e�x�t�,� �p�a�t�t�e�r�n� �p�a�r�s�i�n�g�
    �l�o�g�b�a�c�k�-�c�l�a�s�s�i�c�
    �	�d�e�v�e�l�o�p�e�r� �l�o�g�g�i�n�g�
    �l�o�g�b�a�c�k�-�a�c�c�e�s�s�
    �	�c�o�n�t�a�i�n�e�r� �(�a�c�c�e�s�s�)� �l�o�g�g�i�n�g�
    ���^��
    �����p
    ��n�K���}Z���������x
    ��n�K���}��Z���������x
    ��n�K���}��Z���������x
    ��n�K���}��Z���������x
    ��n�K���}��Z���������x
    ��n�K���}��Z���������x
    ��n�K���}��Z���������x
    ��n�K���}��Z����
    �����������������������������������������������������������������������������������������
    �������	���������	���������	���������	���������	���������	���������	���������	���������	���������	���������	���������	����6������>��~������>��~
    ������>��~��������j���
    ������
    ���B��������������A�������������������	�?��������B 
    �	�N����
    ���������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+�����v���������
    ������������������������������������������-�������p����������"���(����	������������
    ����������F���
    ����� ���Z����<z��_����_����������������������������	�?����������  `�������������
    ����
    �����������������A�c�c�e�s�s� �L�o�g�g�i�n�g�����������O�
    ��d���������������������	����6�����������@�������	��@��
    �������@����������
    ����� ���Z����<z��_����_�����������������������������	�?���������� `p����������������
    �����������4��D�e�f�i�n�i�t�i�o�n�:� �A�c�c�e�s�s� �l�o�g�
    �	�	�T�h�e� �l�o�g� �g�e�n�e�r�a�t�e�d� �w�h�e�n� �a� �u�s�e�r� �	�a�c�c�e�s�s�e�s� �a� �w�e�b�-�p�a�g�e� �o�n� �a� �w�e�b� �s�e�r�v�e�r�.�
    �
    �L�o�g�b�a�c�k�-�a�c�c�e�s�s� �i�n�t�e�g�r�a�t�e�s� �s�e�a�m�l�e�s�s�l�y� �w�i�t�h� �J�e�t�t�y� �a�n�d� �T�o�m�c�a�t�
    � �����������p
    ��n�K���}Z����F�����x
    ��n�K���}��Z���������x
    ��n�K���}��Z����;�����x
    ��n�K���}��Z���������x
    ��n�K���}��Z���������������������������������������%��������������;����������������~����������	���������	���������	���������	���������	��%�������	���������	��;�������	���������	����6������>��~������>��~
    ������>��~��������N����
    ���������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+��������������
    ������������������������������������������-��4���,��������� ������(����	������������
    ���� ������l���
    ��� �� ���Z����D=z��_����_����������������������������	�?����������P�0�������������
    ����
    ��������������@���l�o�g�b�a�c�k�-�c�l�a�s�s�i�c� �i�m�p�l�e�m�e�n�t�s� �S�L�F�4�J������!�����O�
    ��d��!������(������!�������	����6�����������@�������	��@��
    �������@����������
    ��� �� ���Z����=z��_����_�����������������������������	�?���������� `����������������
    p�������������L�o�g�b�a�c�k� �o�f�f�e�r�s� �a� �n�a�t�i�v�e� �i�m�p�l�e�m�e�n�t�a�t�i�o�n� �o�f� �t�h�e� �S�L�F�4�J� �A�P�I� �=�>� �L�o�g�b�a�c�k� �e�x�p�o�s�e�s� �i�t�s� �l�o�g�g�i�n�g� �A�P�I� �t�h�r�o�u�g�h� �S�L�F�4�J�.�
    �I�f� �y�o�u� �a�r�e� �u�s�i�n�g� �l�o�g�b�a�c�k�,� �y�o�u� �a�r�e� �a�c�t�u�a�l�l�y� �u�s�i�n�g� �S�L�F�4�J�
    �S�L�F�4�J� �c�a�n� �d�e�l�e�g�a�t�e� �t�o� �l�o�g�4�j�,� �l�o�g�b�a�c�k�,� �j�a�v�a�.�u�t�i�l�.�l�o�g�g�i�n�g� �o�r� �J�C�L�
    �S�L�F�4�J� �c�a�n� �i�n�t�e�r�c�e�p�t� �l�o�g�4�j�,� �J�C�L� �a�n�d� �j�.�u�.�l�.�
    ������j�����`
    ��n�K���}���7�����`
    ��n�K���}���?�����`
    ��n�K���}���*�����`
    ��n�K���}��������`
    ��n�K���}���j�������7�������?�������*����������������F���j�������	��7�������	��?�������	��*�������	���������	����6������>��~������>��~
    ������>��~��������N����
    ��� ������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+��������������
    ������������������������������������������-��������������$������(����	������������
    ����$������^���
    ���$�� ���Z����>z��_����_����������������������������	�?����������  `�������������
    ����
    ��������������4���J�o�r�a�n�:� �a� �b�o�w�l� �o�f� �f�r�e�s�h� �a�i�r�����������O�
    ��d���������������������	����6�����������@�������	��@��
    �������@����������
    ���$�� ���Z����d>z��_����_�����������������������������	�?����������� ����������������
    V�������������G�i�v�e�n� �r�u�l�e�s� �(�p�a�t�t�e�r�n�s� �&� �a�c�t�i�o�n�s�)� �i�t� �c�a�n� �c�o�n�f�i�g�u�r�e� �a�n�y� �o�b�j�e�c�t�.�
    �J�o�r�a�n� �c�a�n� �l�e�a�r�n� �n�e�w� �r�u�l�e�s� �o�n� �t�h�e� �f�l�y�.�
    �W�i�t�h� �i�t�s� �i�m�p�l�i�c�i�t� �r�u�l�e�s�,� �y�o�u� �d�o�n� t� �e�v�e�n� �h�a�v�e� �t�o� �w�r�i�t�e� �r�u�l�e�s�.� �
    �I�t� �c�a�n� �d�o� �p�a�r�t�i�a�l� �r�e�p�l�a�y�.�
    �I�t� �i�s� �g�e�n�e�r�i�c� �(�c�a�n� �b�e� �u�s�e�d� �i�n� �y�o�u�r� �o�w�n� �p�r�o�j�e�c�t�s�)������>�����p
    ��n�K���}Z����&�����p
    ��n�K���}Z����>�����p
    ��n�K���}Z���������p
    ��n�K���}Z����1�����p
    ��n�K���}Z����>�������&�������<���������������������1���������T���>�������	��&�������	��<�������	���������	���������	��1�������	����6������>��~������>��~
    ������>��~��������N����
    ���$������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+�����
    ���������
    ������������������������������������������-��������������(���4���(����	������������
    ����(������X���
    ���(�� ���Z����>z��_����_����������������������������	�?���������� `�������������
    ����
    ��������������,���C�o�n�f�i�g�u�r�a�t�i�o�n� �e�x�a�m�p�l�e�:�����������O�
    ��d��������(�������������	����6�����������@�������	��@��
    �������@�������	���
    ���(�� ���Z����$?z��_����_�����������������������������	�?����������0������������������
    �������������
    �<�a�p�p�e�n�d�e�r� �n�a�m�e�=�"�F�I�L�E�"�
    � � � � � �c�l�a�s�s�=�"�c�h�.�q�o�s�.�l�o�g�b�a�c�k�.�c�o�r�e�.�r�o�l�l�i�n�g�.�R�o�l�l�i�n�g�F�i�l�e�A�p�p�e�n�d�e�r�"�>�
    � � �<�F�i�l�e�>�l�o�g�F�i�l�e�.�l�o�g�<�/�F�i�l�e�>�
    � � �<�r�o�l�l�i�n�g�P�o�l�i�c�y�
    �	� � � �c�l�a�s�s�=�"�c�h�.�q�o�s�.�l�o�g�b�a�c�k�.�c�o�r�e�.�r�o�l�l�i�n�g�.�T�i�m�e�B�a�s�e�d�R�o�l�l�i�n�g�P�o�l�i�c�y�"�>�
    � � � � �<�F�i�l�e�N�a�m�e�P�a�t�t�e�r�n�>�
    � � � � � � � � � � � �l�o�g�F�i�l�e�.�%�d�{�y�y�y�y�-�M�M�-�d�d�}�.�l�o�g�.�z�i�p�
    � � � � �<�/�F�i�l�e�N�a�m�e�P�a�t�t�e�r�>�
    � � �<�/�r�o�l�l�i�n�g�P�o�l�i�c�y�>�
    �
    � � �<�l�a�y�o�u�t� �c�l�a�s�s�=�"�c�h�.�q�o�s�.�l�o�g�b�a�c�k�.�c�l�a�s�s�i�c�.�P�a�t�t�e�r�n�L�a�y�o�u�t�"�>�
    � � � � �<�P�a�t�t�e�r�n�>�
    � � � � � � �%�d�{�H�H�:�m�m�:�s�s�,�S�S�S�}� �[�%�t�h�r�e�a�d�]� �%�-�5�l�e�v�e�l� �%�l�o�g�g�e�r�{�2�2�}� �-� �%�m�s�g�%�n�
    � � � � �<�/�P�a�t�t�e�r�n�>�
    � � �<�/�l�a�y�o�u�t�>�
    �<�/�a�p�p�e�n�d�e�r�>����������Op
    ��K�P���������Op
    ��K�P����>�����Op
    ��K�P���������Op
    ��K�P���������Op
    ��K�P����@�����Ox
    ��K���P���������Ox
    ��K���P����*�����Ox
    ��K���P���������Ox
    ��K���P���������Ox
    ��K���P���������Ox
    ��K���P����8�����Ox
    ��K���P���������Ox
    ��K���P����?���������������	��
    ������
    �������������������������������������� ��!��"��#��$��%��&��'��(��)��*��+��,��-��.��/��0��1��2��3��4��5��6��7��8��9��:��;��<��=��>��?��@��A��B��C��D��E��F��G��H��I��J��K��L��M��N��O��P��Q��R��S��T��U��V��W��X��Y��Z��[��\��]��^��_��`��a��b��c��d��e��f��g��h��i��j��k��l��m��n��o��p��q��r��s��t��u��v��w��x��y��z��{��|��}��~����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Ox
    ��K���P���������Ox
    ��K���P���������Ox
    ��K���P���������Ox
    ��K���P����������������������������9��������������������������������������������������������<������������������������������������������������������������������������������������������������,��������������������������
    ����������������9��������������������������������
    ���������������������������	���������	���������	��9�������	���������	���������	���������	���������	���������	���������	��<�������	���������	���������	���������	���������	���������	���������	���������	���������	���������	���������	���������	��,�������	���������	���������	��
    �������	���������	��9�������	���������	���������	���������	��
    �������	���������	����6������?��������?��
    ������?���������N����
    ���(������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+���������������
    ������������������������������������������-��"
    ���
    ���������,���	���(����	������������
    ����,������d���
    ���,�� ���Z����?z��_����_����������������������������	�?���������� `�������������
    ����
    ��������������8���L�o�g�b�a�c�k�-�a�c�c�e�s�s� �c�o�n�f�i�g�u�r�a�t�i�o�n�����������O�
    ��d��������(�������������	����6�����������@�������	��@��
    �������@����������
    ���,�� ���Z����?z��_����_�����������������������������	�?����������`�P����������������
    f�������������<�a�p�p�e�n�d�e�r� �n�a�m�e�=�"�F�I�L�E�"�	� � � � �
    � � � � � � � � � � � � �c�l�a�s�s�=�"�c�.�q�.�l�.�c�.�r�.�R�o�l�l�i�n�g�F�i�l�e�A�p�p�e�n�d�e�r�"�>�
    � � �<�F�i�l�e�>�a�c�c�e�s�s�.�l�o�g�"�<�/�F�i�l�e�>�
    � � �<�r�o�l�l�i�n�g�P�o�l�i�c�y�
    � � � � � � � � �c�l�a�s�s�=�"�c�.�q�.�l�.�c�.�r�.�T�i�m�e�B�a�s�e�d�R�o�l�l�i�n�g�P�o�l�i�c�y�"�>�
    � � � � �<�F�i�l�e�N�a�m�e�P�a�t�t�e�r�n�>�
    � � � � � � �a�c�c�e�s�s�.�%�d�{�y�y�y�y�-�M�M�-�d�d�}�.�l�o�g�.�z�i�p�
    � � � � �<�/�F�i�l�e�N�a�m�e�P�a�t�t�e�r�n�>�
    � � �<�/�r�o�l�l�i�n�g�P�o�l�i�c�y�>�
    �
    � � �<�l�a�y�o�u�t� �c�l�a�s�s�=�"�c�.�q�.�l�.�a�c�c�e�s�s�.�P�a�t�t�e�r�n�L�a�y�o�u�t�"�>�
    � � � � �<�P�a�t�t�e�r�n�"�>�c�o�m�b�i�n�e�d�<�/�P�a�t�t�e�r�n�"�>�
    � � �<�/�l�a�y�o�u�t�>�
    �<�/�a�p�p�e�n�d�e�r�>����������Ox
    ��K���P����3�����Ox
    ��K���P���������Ox
    ��K���P���������Ox
    ��K���P����2�����Ox
    ��K���P���������Ox
    ��K���P����$�����Ox
    ��K���P���������Ox
    ��K���P���������Ox
    ��K���P���������Ox
    ��K���P����.�����Ox
    ��K���P����"�����Ox
    ��K���P���������Ox
    ��K���P���������Ox
    ��K���P������������������������������������'������������������������������������������������*����������������������������������������������������������������������������������������,��������������������������������
    ������������������z���������	���������	���������	���������	��'�������	���������	���������	���������	���������	���������	��*�������	���������	���������	���������	���������	���������	���������	���������	���������	���������	���������	��,�������	���������	���������	���������	��
    �������	���������	����:���������?��������?��
    ������?���������N����
    ���,������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+��������������
    ������������������������������������������-�����
    ���������0���
    ���(����	������������
    ����0������L���
    ���0�� ���Z����D@z��_����_����������������������������	�?����������� `�������������
    ����
    �������������� ���A�n�o�t�h�e�r� �e�x�a�m�p�l�e�:�����������O�
    ��d��������(�������������	����6�����������@�������	��@��
    �������@�������	���
    ���0�� ���Z����@z��_����_�����������������������������	�?���������� `����������������
    b�������������<�t�e�s�t�S�h�e�l�l� �n�a�m�e�=�"�t�e�s�t�1�"�>�
    � � �<�p�e�r�i�o�d�>�5� �m�i�n�u�t�e�s�<�/�p�e�r�i�o�d�>�
    � � �<�!�-�-� �w�e� �n�e�e�d� �t�o� �c�o�n�f�i�g�u�r�e� �a� �t�o�t�a�l�l�y� �n�e�w� �t�e�s�t� �
    � � � � � � � �o�b�j�e�c�t� �f�o�r� �e�a�c�h� �r�u�n� �o�f� �t�h�e� �t�e�s�t� �-�-�>�
    � � �<�t�e�s�t� �c�l�a�s�s�=�"�c�o�m�.�w�o�m�b�a�t�.�m�y�T�e�s�t�"�>�
    � � � � �<�D�a�t�a�S�o�u�r�c�e� �c�l�a�s�s�=�"�c�.�w�.�J�N�D�I�D�S�"�>�
    � � � � � � �<�u�r�l�>�j�n�d�i�:�/�/�c�o�m�.�w�o�m�b�a�t�/�d�s�"�<�/�u�r�l�>�
    � � � � �<�/�D�a�t�a�S�o�u�r�c�e�>�
    � � �<�/�t�e�s�t�>�
    �<�t�e�s�t�S�h�e�l�l�>�
    �
    �<�t�e�s�t�S�h�e�l�l� �n�a�m�e�=�"�t�e�s�t�2�"�>�
    � � �<�p�e�r�i�o�d�>�6�0� �s�e�c�o�n�d�s�<�/�p�e�r�i�o�d�>�
    � � �<�t�e�s�t� �c�l�a�s�s�=�"�c�o�m�.�w�o�m�b�a�t�.�m�y�T�e�s�t�2�"�>�
    � � � � �<�f�i�l�e�>�c�:�/�w�o�m�b�a�t�/�f�o�o�.�p�r�o�p�e�r�t�i�e�s�<�/�f�i�l�e�>�
    � � �<�/�t�e�s�t�>�
    �<�/�t�e�s�t�S�h�e�l�l�>����������Op
    ��K�P���������Op
    ��K�P����0�����Op
    ��K�P����+�����Op
    ��K�P����#�����Op
    ��K�P����$�����Op
    ��K�P����'�����Op
    ��K�P���������Op
    ��K�P����
    �����Op
    ��K�P���������Op
    ��K�P���������Op
    ��K�P���������Op
    ��K�P���������Op
    ��K�P����$�����Op
    ��K�P����*�����Op
    ��K�P����
    �����Op
    ��K�P����
    �����Op
    ��K�P������������������������������������.����������������$����������������!���������������� ����������������!����������������������������������������������������������������������������������������"����������������&������������������������
    �������������������	���������	���������	���������	��.�������	���������	��$�������	���������	��!�������	���������	�� �������	���������	��!�������	���������	���������	���������	���������	���������	���������	���������	���������	���������	���������	��"�������	���������	��&�������	���������	���������	��
    �������	����6������?��������?��
    ������?���������N����
    ���0������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+�����:���������
    ���������	���������������������������������-��\���T���������4������(����	������������
    ����4������J���
    ���4�� ���Z����Az��_����_����������������������������	�?����������  `�������������
    ����
    �������������� ���I�s� �J�o�r�a�n� �f�o�r� �m�e�?�����������O�
    ��d���������������������	����6�����������@�������	��@��
    �������@�������\���
    ���4�� ���Z����dAz��_����_�����������������������������	�?���������� `p����������������
    ��������������
    �J�o�r�a�n� �i�s� �i�d�e�a�l� �f�o�r� �b�u�i�l�d�i�n�g� �f�r�a�m�e�w�o�r�k�s� �w�h�i�c�h� �n�e�e�d� �t�o� �s�u�p�p�o�r�t� �a�r�b�i�t�r�a�r�y� �u�s�e�r�-�d�e�v�e�l�o�p�e�d� �p�l�u�g�-�i�n�s�.�
    ���l��������`
    ��n�K���}���`�����`
    ��n�K���}��������`
    ��n�K���}����������`����������������*����������	��`�������	���������	����6������>��~������>��~
    ������>��~��������N����
    ���4������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+�����N���������
    ���������
    ���������������������������������-��p���h���������8������(����	������������
    ����8������X���
    ���8�� ���Z����Az��_����_����������������������������	�?����������  `�������������
    ����
    ��������������0���C�o�n�f�i�g�u�r�a�t�i�o�n� �i�n� �G�r�o�o�v�y� ������������
    �����������������������	����6�����������@�������	��@��
    �������@�������t���
    ���8�� ���Z����$Bz��_����_�����������������������������	�?����������n�#����������������
    �����������:��S�h�o�r�t�e�r�,� �m�o�r�e� �c�o�n�s�i�s�t�e�n�t� �s�y�n�t�a�x�
    �
    �A�n� �i�n�-�l�a�n�g�u�a�g�e� �D�S�L� �=�>� �m�o�r�e� �e�x�p�r�e�s�s�i�v�e� �p�o�w�e�r�
    �
    �A�u�t�o�m�a�t�i�c� �t�r�a�n�s�l�a�t�i�o�n� �t�o�o�l� �f�r�o�m� �l�o�g�b�a�c�k�.�x�m�l� �t�o� �l�o�g�b�a�c�k�.�g�r�o�o�v�y� �a�v�a�i�l�a�b�l�e� �o�n�l�i�n�e�
    ������ ����� 
    ��n�K���}������ 
    ��n�K���}�,����� 
    ��n�K���}������ 
    ��n�K���}�O����� 
    ��n�K���}������ 
    ��n�K���}� ��������������&���������������������O����������������b��� �������	���������	��&�������	���������	���������	��O�������	���������	����6������>��~������>��~
    ������>��~��������<����
    ���8�����c�$����������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' ������������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+�����	���������
    ������������������������������������������-��������������<������(����	������������
    ����<������^���
    ���<�� ���Z����Bz��_����_����������������������������	�?����������  `�������������
    ����
    ��������������6���E�x�a�m�p�l�e� �l�o�g�b�a�c�k�.�g�r�o�o�v�y� �f�i�l�e������������
    �����������������������	����6�����������@�������	��@��
    �������@���������
    ���<���
    ���T����Bz��_��ȯ���_��ȯ����������������������������	�?���������C
    �
    ^��������������i�m�p�o�r�t� �c�h�.�q�o�s�.�l�o�g�b�a�c�k�.�c�l�a�s�s�i�c�.�e�n�c�o�d�e�r�.�P�a�t�t�e�r�n�L�a�y�o�u�t�E�n�c�o�d�e�r�
    �i�m�p�o�r�t� �c�h�.�q�o�s�.�l�o�g�b�a�c�k�.�c�o�r�e�.�F�i�l�e�A�p�p�e�n�d�e�r�
    �
    �i�m�p�o�r�t� �s�t�a�t�i�c� �c�h�.�q�o�s�.�l�o�g�b�a�c�k�.�c�l�a�s�s�i�c�.�L�e�v�e�l�.�D�E�B�U�G�
    �
    �a�p�p�e�n�d�e�r�(�"�F�I�L�E�"�,� �F�i�l�e�A�p�p�e�n�d�e�r�)� �{�
    � � �f�i�l�e� �=� �"�t�e�s�t�F�i�l�e�.�l�o�g�"�
    � � �a�p�p�e�n�d� �=� �t�r�u�e�
    � � �e�n�c�o�d�e�r�(�P�a�t�t�e�r�n�L�a�y�o�u�t�E�n�c�o�d�e�r�)� �{�
    � � � � �p�a�t�t�e�r�n� �=� �"�%�-�r� �[�%�t�h�r�e�a�d�]� �%�-�5�l�e�v�e�l� �%�l�o�g�g�e�r�{�3�5�}� �-� �%�m�s�g�%�n�"�
    � � �}�
    �}�
    �r�o�o�t�(�D�E�B�U�G�,� �[�"�F�I�L�E�"�]�)���P��;����������(��������������������1��������������������!������������������������������"����������<����������������������������������������;�������(��������������1��������������!������������������������������������������ ��������������8����������������������������������������;�������	��(�������	���������	��1�������	���������	��!�������	���������	���������	���������	���������	���������	�� �������	���������	��8�������	���������	���������	���������	���������	����6�����������@�������	��@��
    �������@�������<����
    ���<�����c�$����������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' ������������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+��������������
    ������������������������������������������-��<���4���������@������(����	������������
    ����@������Z���
    ���@�� ���Z����DCz��_����_����������������������������	�?����������  `�������������
    ����
    ��������������0���I�n�t�e�r�n�a�l� �e�r�r�o�r� �r�e�p�o�r�t�i�n�g�����������O�
    ��d���������������������	����6�����������@�������	��@��
    �������@�������,���
    ���@�� ���Z����Cz��_����_�����������������������������	�?���������� `����������������
    ��������������W�h�o� �s�h�a�l�l� �g�u�a�r�d� �t�h�e� �g�u�a�r�d�s�?�
    �
    �L�o�g�b�a�c�k� �m�o�d�u�l�e�s� �c�a�n�n�o�t� �u�s�e� �l�o�g�g�i�n�g� �t�o� �r�e�p�o�r�t� �t�h�e�i�r� �o�w�n� �s�t�a�t�e�.�
    �
    �S�o�m�e�t�h�i�n�g� �m�o�r�e� �g�e�n�e�r�i�c� �i�s� �n�e�e�d�e�d�.�
    �����������`
    ��n�K���}��������`
    ��n�K���}���>�����`
    ��n�K���}��������`
    ��n�K���}���"�����`
    ��n�K���}��������`
    ��n�K���}�����������������>��������������"����������������T����������	���������	��>�������	���������	��"�������	���������	����6������>��~������>��~
    ������>��~��������N����
    ���@������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+��������������
    ���������
    ���������������������������������-�������������D���d���(����	������������
    ����D������J���
    ���D�� ���Z����Dz��_����_����������������������������	�?����������  `�������������
    ����
    �������������� ���E�r�r�o�r�s� �i�n� �a�c�t�i�o�n�����������O�
    ��d���������������������	����6�����������@�������	��@��
    �������@����������
    ���D�� ���Z����dDz��_����_�����������������������������	�?���������� `p����������������
    8�������������
    �I�n�t�e�r�n�a�l� �s�t�a�t�e� �a�v�a�i�l�a�b�l�e� �v�i�a� �S�t�a�t�u�s�M�a�n�a�g�e�r�
    �
    �E�x�c�e�p�t�i�o�n�s� �a�n�d� �s�t�a�t�u�s� �m�e�s�s�a�g�e�s� �a�c�c�o�m�p�a�n�i�e�d� �b�y� �r�e�f�e�r�e�n�c�e�s�,� �i�.�e�.� �U�R�L�s�,� �t�o� �e�x�t�e�r�n�a�l� �d�o�c�u�m�e�n�t�s�����������`
    ��n�K���}���+�����`
    ��n�K���}��������`
    ��n�K���}���[�����`
    ��n�K���}����������+��������������[���������8����������	��+�������	���������	��[�������	����6������>��~������>��~
    ������>��~��������N����
    ���D������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+�����.���������
    ������������������������������������������-��P���H�� ������H������(����	������������
    ����H������0���
    ���H�� ���Z����Dz��_����_����������������������������	�?����������  `�������������
    ����
    �����������������J�M�X�����������O�
    ��d���������������������	����6�����������@�������	��@��
    �������@�������j���
    ���H�� ���Z����$Ez��_����_�����������������������������	�?���������� `p����������������
    ��������������
    �L�o�g�b�a�c�k� �c�o�n�f�i�g�u�r�a�t�i�o�n� �c�a�n� �b�e� �r�e�l�o�a�d�e�d� �v�i�a� �J�M�X�
    �
    �S�t�a�t�i�s�t�i�c�a�l� �r�e�s�u�l�t�s� �e�x�p�o�s�e�d� �v�i�a� �J�M�X�����������O`
    ��K����.�����`
    ��n�K���}��������`
    ��n�K���}���$�����`
    ��n�K���}����������.��������������$���������8����������	��.�������	���������	��$�������	����6������?��������?��
    ������?���������N����
    ���H������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+�����
    ���������
    ������������������������������������������-��,���$��0������L������(����	������������
    ����L������D���
    ���L�� ���Z����Ez��_����_����������������������������	�?����������  ``�������������
    ����
    �����������������D�o�c�u�m�e�n�t�a�t�i�o�n�����������O�
    ��d�������������������������6�����������@�������	��@��
    �������@�������2���
    ���L�� ���Z����Ez��_����_�����������������������������	�?�����������0����������������
    �������������M�a�j�o�r� �a�r�e�a� �o�f� �e�f�f�o�r�t�.�
    �
    �C�o�m�p�l�e�t�e� �m�a�n�u�a�l�,� �w�i�t�h� �o�v�e�r� �1�5�0� �p�a�g�e�s� �o�f� �d�o�c�u�m�e�n�t�a�t�i�o�n�,� �i�s� �a�v�a�i�l�a�b�l�e� �f�o�r� �f�r�e�e�
    �
    �A� �s�h�o�r�t� �i�n�t�r�o�d�u�c�t�i�o�n� �t�o� �a�c�c�e�s�s� �l�o�g�g�i�n�g� �w�i�t�h� �l�o�g�b�a�c�k�-�a�c�c�e�s�s� �a�n�d� �J�e�t�t�y�
    �
    �j�a�v�a�d�o�c�,� �F�A�Q�,� �e�r�r�o�r� �c�o�d�e�s�,�& 
    ���0�������`
    ��n�K���}��������`
    ��n�K���}���M�����`
    ��n�K���}��������`
    ��n�K���}���E�����`
    ��n�K���}��������`
    ��n�K���}��������`
    ��n�K���}��������`
    ��n�K���}�����������������M��������������E������������������������������p����������	���������	��M�������	���������	��E�������	���������	���������	���������	����6������>��~������>��~
    ������>��~��������N����
    ���L������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+��������������
    ������������������������������������������-��(��� ��@������P������(����	������������
    ����P������t���
    ���P�� ���Z����DFz��_����_����������������������������	�?����������  `�������������
    ����
    ��������������H���F�i�l�t�e�r�s�,� �F�i�l�t�e�r�s�.� �F�i�l�t�e�r�s� �e�v�e�r�y�w�h�e�r�e������%�����O�
    ��d��%������(������%�������	����6�����������@�������	��@��
    �������@����������
    ���P�� ���Z����Fz��_����_�����������������������������	�?���������� 0����������������
    \�����������2��F�i�l�t�e�r�s� �a�t�t�a�c�h�a�b�l�e� �t�o� �a�n�y� �A�p�p�e�n�d�e�r�
    �E�v�a�l�u�a�t�o�r� �f�i�l�t�e�r�s�
    �J�a�n�i�n�o� �f�i�l�t�e�r�s� �f�o�r� �e�v�a�l�u�a�t�i�o�n� �b�a�s�e�d� �o�n� �j�a�v�a� �e�x�p�r�e�s�s�i�o�n�s�
    �T�u�r�b�o�F�i�l�t�e�r�s� �f�o�r� �o�p�t�i�m�i�z�e�d� �g�l�o�b�a�l� �p�r�o�c�e�s�s�i�n�g������#�����`
    ��n�K���}��������`
    ��n�K���}���8�����`
    ��n�K���}���-�����`
    ��n�K���}���#��������������8�������-���������8���#�������	���������	��8�������	��-�������	����6������>��~������>��~
    ������>��~��������N����
    ���P������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+�����
    ���������
    ������������������������������������������-��@���8��P������T���
    ���(����	������������
    ����T������p���
    ���T�� ���Z����Gz��_����_����������������������������	�?����������  `0�������������
    ����
    ��������������0���E�v�a�l�u�a�t�o�r�F�i�l�t�e�r� �&� �J�a�n�i�n�o��� ��������O�
    ��d�������������������������������������	����6�����������@�������	��@��
    �������@�������	���
    ���T�� ���Z����dGz��_����_�����������������������������	�?����������`�P����������������
    x�����������r��<�a�p�p�e�n�d�e�r� �n�a�m�e�=�"�C�Y�C�L�I�C�"�
    � � � � � � � � � � �c�l�a�s�s�=�"�c�.�q�.�l�.�c�o�r�e�.�r�e�a�d�.�C�y�c�l�i�c�B�u�f�f�e�r�A�p�p�e�n�d�e�r�"�>�
    � � �<�f�i�l�t�e�r� �c�l�a�s�s�=�"�c�.�q�.�l�.�c�o�r�e�.�f�i�l�t�e�r�.�E�v�a�l�u�a�t�o�r�F�i�l�t�e�r�"�>�
    � � � � �<�e�v�a�l�u�a�t�o�r� �n�a�m�e�=�"�l�o�g�g�i�n�g�T�a�s�k�E�v�a�l�"�>�
    �	� � � � �<�e�x�p�r�e�s�s�i�o�n�>�
    �	�	� � �i�f�(�l�o�g�g�e�r�.�c�o�n�t�a�i�n�s�(�"�L�o�g�g�i�n�g�T�a�s�k�"�)�)�
    � � � � � � � � �m�e�s�s�a�g�e�.�c�o�n�t�a�i�n�s�(�"�H�o�w�d�y�d�y�-�d�i�d�d�l�y�-�h�o�"�)� �&�&�
    � � � � � � � � �(�t�i�m�e�S�t�a�m�p�-�l�o�g�g�e�r�C�o�n�t�e�x�t�.�g�e�t�B�i�r�t�h�T�i�m�e�(�)�)� �>�=� �2�0�0�0�0�
    �	�	�<�/�e�x�p�r�e�s�s�i�o�n�>�
    �	� �<�/�e�v�a�l�u�a�t�o�r�>�
    �	� �<�O�n�M�a�t�c�h�>�D�E�N�Y�<�/�O�n�M�a�t�c�h�>�
    � � �<�/�f�i�l�t�e�r�>�
    � � �<�M�a�x�S�i�z�e�>�5�1�2�<�/�M�a�x�S�i�z�e�>�
    �<�/�a�p�p�e�n�d�e�r�>����������Op
    ��K�P����8�����Op
    ��K�P����5�����Op
    ��K�P����'�����Op
    ��K�P���������Ox
    ��K���P����'�����Ox
    ��K���P����1�����Ox
    ��K���P����:�����Ox
    ��K���P���������Ox
    ��K���P���������Ox
    ��K���P���������Ox
    ��K���P���������Ox
    ��K���P���������Ox
    ��K���P���������Ox
    ��K���P������������
    ��������.����������������3����������������#������������������������
    ��������������������������������#����������������)����������������2������������������������������������������������
    ����������������������������������������
    ���������������������������������������������
    ���������.������������������3������������������#���������������������������
    ������������������������������������#������������������)������������������2������������������������������������������������������
    ���������������������������������������������
    ��������������������������������������6������?��������?��
    ������?���������N����
    ���T������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+��������������
    ������������������������������������������-�������`������X���>���(����	������������
    ����X������B���
    ���X�� ���Z����Gz��_����_����������������������������	�?����������  `�������������
    ����
    �����������������T�u�r�b�o�F�i�l�t�e�r�s������
    �����O�
    ��d��
    ������������
    �������	����6�����������@�������	��@��
    �������@����������
    ���X�� ���Z����$Hz��_����_�����������������������������	�?����������`����������������
    �����������0��<�t�u�r�b�o�F�i�l�t�e�r�
    � � � � � �c�l�a�s�s�=�"�c�.�q�.�l�.�c�l�a�s�s�i�c�.�t�u�r�b�o�.�M�D�C�F�i�l�t�e�r�"�>�
    � � �<�M�D�C�K�e�y�>�u�s�e�r�i�d�<�/�M�D�C�K�e�y�>�
    � � �<�V�a�l�u�e�>�s�e�b�a�s�t�i�e�n�<�/�V�a�l�u�e�>�
    � � �<�O�n�M�a�t�c�h�>�A�C�C�E�P�T�<�/�O�n�M�a�t�c�h�>�
    �<�/�t�u�r�b�o�F�i�l�t�e�r�>������
    �����Op
    ��K�Z����,�����Op
    ��K�Z���������Op
    ��K�d���������Op
    ��K�d���������Op
    ��K�d���������Op
    ��K�d����
    ����������������'���������������������������������������������������������������������
    �������	���������	��'�������	���������	���������	���������	���������	���������	���������	���������	����6������?��������?��
    ������?���������N����
    ���X������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+�����d	���������
    ������������������������������������������-�����~��p������\������(����	������������
    ����\������T���
    ���\�� ���Z����Hz��_����_����������������������������	�?���������� `��������������
    ����
    ��������������*���P�a�r�a�m�e�t�e�r�i�z�e�d� �l�o�g�g�i�n�g�����������O�
    ��d���������������������	����6�����������@�������	��@��
    �������@�������|���
    ���\�� ���Z����Hz��_����_�����������������������������	�?�����������~����������������
    �������������I�n�t�e�g�e�r� �e�n�t�r�y� �=� �n�e�w� �I�n�t�e�r�g�e�r�(�5�0�)�;� �
    �l�o�g�g�e�r�.�d�e�b�u�g�(�"�T�h�e� �e�n�t�r�y� �i�s� �"�+�e�n�t�r�y�+�"�.�"�)�;�
    �
    �c�a�n� �b�e� �o�p�t�i�m�i�z�e�d� �a�s�:�
    � �i�f�(�l�o�g�g�e�r�.�i�s�D�e�b�u�g�E�n�a�b�l�e�d�(�)�)� �{�
    � �l�o�g�g�e�r�.�d�e�b�u�g�(�"�T�h�e� �e�n�t�r�y� �i�s� �"�+�e�n�t�r�y�+�"�.�"�)�;�
    �}�
    �
    �o�r� �b�e�t�t�e�r� �y�e�t�:�
    �l�o�g�g�e�r�.�d�e�b�u�g�(�"�T�h�e� �e�n�t�r�y� �i�s� �{�}�.�"�,� �e�n�t�r�y�)�;� �
    �����#�����Op
    ��K�Z����)�����Op
    ��K�Z���������Op
    ��K�Z���������Op
    ��K�Z���������Op
    ��K�Z����*�����Op
    ��K�Z���������Op
    ��K�Z���������Op
    ��K�Z���������Op
    ��K�Z����*�����Op
    ��K�Z���������Op
    ��K�Z����#��������
    ���������������������������������������������������������������)�����������������������������������������������
    ���������������������#�������	��
    �������	���������	���������	���������	���������	���������	���������	���������	��)�������	���������	���������	���������	���������	���������	��
    �������	���������	����6������?��������?��
    ������?���������N����
    ���\������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+��������������
    ������������������������������������������-��4���,��������`������(����	������������
    ����`������j���
    ���`�� ���Z����DIz��_����_����������������������������	�?�����������0 �������������
    ����
    ��������������@���M�a�r�k�e�r�s� �f�o�r� �s�p�e�c�i�a�l�i�z�e�d� �h�a�n�d�l�i�n�g������!�����O�
    ��d��!������������!�������	����6�����������@�������	��@��
    �������@����������
    ���`�� ���Z����Iz��_����_�����������������������������	�?���������� `p����������������
    r��������������M�a�r�k�e�r�s� �a�r�e� �m�e�t�a�d�a�t�a� �f�o�r� �l�o�g�g�i�n�g� �s�t�a�t�e�m�e�n�t�s�,� �c�o�l�o�r�i�n�g� �t�h�e�m� �f�o�r� �s�p�e�c�i�a�l�i�z�e�d� �p�r�o�c�e�s�s�i�n�g�
    ���H���V�����`
    ��n�K���}��������`
    ��n�K���}���V�������������������V�������	���������	����6������>��~������>��~
    ������>��~��������N����
    ���`������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+��������������
    ������������������������������������������-�������������d���:���(����	������������
    ����d���������
    ���d�� ���Z����Jz��_����_����������������������������	�?���������� `>�������������
    ����
    ��������������^���S�i�f�t�i�n�g�A�p�p�e�n�d�e�r� �o�r� �t�h�e� �a�p�p�e�n�d�e�r�-�m�a�k�i�n�g� �a�p�p�e�n�d�e�r������0�����O�
    ��d��0������(������0�������	����6�����������@�������	��@��
    �������@�������p���
    ���d�� ���Z����dJz��_����_�����������������������������	�?���������� `p����������������
    �������������S�i�f�t� �l�o�g�g�i�n�g� �a�c�c�o�r�d�i�n�g� �t�o� �r�u�n�t�i�m�e� �a�t�t�r�i�b�u�t�e�s�
    �E�.�g�.� �s�e�p�a�r�a�t�e� �l�o�g�s� �a�c�c�o�r�d�i�n�g� �t�o� �u�s�e�r� �s�e�s�s�i�o�n�s�,� �s�o� �t�h�a�t� �t�h�e� �l�o�g� �f�i�l�e� �g�e�n�e�r�a�t�e�d� �b�y� �e�v�e�r�y� �u�s�e�r� �g�o� �i�n�t�o� �d�i�s�t�i�n�c�t� �l�o�g� �f�i�l�e�s�,� �o�n�e� �l�o�g� �f�i�l�e� �p�e�r� �u�s�e�r�.� �
    �W�o�r�k�s� �w�i�t�h� �a�n�y� �a�p�p�e�n�d�e�r�,� �n�o�t� �j�u�s�t� �F�i�l�e�A�p�p�e�n�d�e�r���l���-�����`
    ��n�K���}��������`
    ��n�K���}���/�����`
    ��n�K���}���-��������������/���������*���-�������	�����������/�������	����6������>��~������>��~
    ������>��~��������N����
    ���d������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' ������������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+�����z���������
    ������������������������������������������-�������������h���&���(����	������������
    ����h������b���
    ���h�� ���Z����Jz��_����_����������������������������	�?�����������0�������������
    ����
    ��������������6���S�i�f�t�i�n�g�A�p�p�e�n�d�e�r� �(�c�o�n�t�i�n�u�e�d�)�����������O�
    ��d��������(�������������	����6�����������@�������	��@��
    �������@�������
    ���
    ���h�� ���Z����$Kz��_����_�����������������������������	�?����������``�����������������
    	������������� �<�a�p�p�e�n�d�e�r� �n�a�m�e�=�"�S�I�F�T�"� �c�l�a�s�s�=�"�c�h�.�q�o�s�.�l�o�g�b�a�c�k�.�c�l�a�s�s�i�c�.�s�i�f�t�.�S�i�f�t�i�n�g�A�p�p�e�n�d�e�r�"�>�
    � � � � �<�d�i�s�c�r�i�m�i�n�a�t�o�r�>�
    � � � � � � �<�K�e�y�>�u�s�e�r�i�d�<�/�K�e�y�>�
    � � � � � � �<�D�e�f�a�u�l�t�V�a�l�u�e�>�u�n�k�n�o�w�n�<�/�D�e�f�a�u�l�t�V�a�l�u�e�>�
    � � � � �<�/�d�i�s�c�r�i�m�i�n�a�t�o�r�>�
    � � � � �<�s�i�f�t�>�
    � � � � � � �<�a�p�p�e�n�d�e�r� �n�a�m�e�=�"�F�I�L�E�-�$�{�u�s�e�r�i�d�}�"��
    � � � � � � � � � � � � � � � � �c�l�a�s�s�=�"�c�h�.�q�o�s�.�l�o�g�b�a�c�k�.�c�o�r�e�.�F�i�l�e�A�p�p�e�n�d�e�r�"�>�
    � � � � � � � � �<�F�i�l�e�>�$�{�u�s�e�r�i�d�}�.�l�o�g�<�/�F�i�l�e�>�s�
    � � � � � � � � �<�A�p�p�e�n�d�>�f�a�l�s�e�<�/�A�p�p�e�n�d�>�
    � � � � � � � � �<�l�a�y�o�u�t�>�
    � � � � � � � � � � �<�P�a�t�t�e�r�n�>�%�d� �%�l�e�v�e�l� �%�m�d�c� �%�l�o�g�g�e�r� �-� �%�m�s�g�%�n�<�/�P�a�t�t�e�r�n�>�
    � � � � � � � � �<�/�l�a�y�o�u�t�>�
    � � � � � � �<�/�a�p�p�e�n�d�e�r�>�
    � � � � �<�/�s�i�f�t�>�
    � � �<�/�a�p�p�e�n�d�e�r�>�
    ���x��L�����Op
    ��K�P���������Op
    ��K�P���������Op
    ��K�P����+�����Op
    ��K�P���������Op
    ��K�P���������Op
    ��K�P����'�����Op
    ��K�P����:�����Op
    ��K�P����$�����Op
    ��K�P���������Op
    ��K�P���������Op
    ��K�P����=�����Op
    ��K�P���������Op
    ��K�P���������Op
    ��K�P���������Op
    ��K�P���������Op
    ��K�P���������Op
    ��K�P������������K�������������������������������������������������f����������������%�����������������������������������������f�������������������������f����������������*���������������������������������f	��������������������������������	��������
    ��������3����������������
    �����������������������������������������f��������������������������"�����������K������������������������������������������������������������������������%������������������������������������������������������������������������������������������*������������������������������������	������������������������������������	���������
    ���������3������������������
    ��������������������������������������������������������������������������6������?��������?��
    ������?���������N����
    ���h������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' ������������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+�����:���������
    ������������������������������������������-��\���T��������l������(����	������������
    ����l������F���
    ���l�� ���Z����Kz��_����_����������������������������	�?����������  `�������������
    ����
    �����������������T�e�s�t�e�d� �&� �R�e�a�d�y�����������O�
    ��d���������������������	����6�����������@�������	��@��
    �������@�������`���
    ���l�� ���Z����Kz��_����_�����������������������������	�?���������� `p����������������
    ��������������B�a�t�t�e�r�y� �o�f� �o�v�e�r� �4�5�0� �u�n�i�t� �t�e�s�t�s�
    �
    �T�e�s�t�s� �w�r�i�t�t�e�n� �c�o�n�c�o�m�i�t�a�n�t�l�y� �w�i�t�h� �t�h�e� �c�o�d�e�
    �����������`
    ��n�K���}��������`
    ��n�K���}���*�����`
    ��n�K���}��������`
    ��n�K���}�����������������*����������������8����������	���������	��*�������	���������	����6������>��~������>��~
    ������>��~��������N����
    ���l������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+�����4
    ���������
    ������������������������������������������-��V���N��������p������(����	������������
    ����p������l���
    ���p�� ���Z����DLz��_����_����������������������������	�?����������  `�������������
    ����
    ��������������@���P�a�c�k�a�g�e� �v�e�r�s�i�o�n�s� �i�n� �s�t�a�c�k� �t�r�a�c�e�s������!�����O�
    ��d��!������(������!�������	����6�����������@�������	��@��
    �������@�������4���
    ���p�� ���Z����Lz��_����_�����������������������������	�?������������`p����������������
    �������������j�a�v�a�.�l�a�n�g�.�N�u�l�l�P�o�i�n�t�e�r�E�x�c�e�p�t�i�o�n�
    � �a�t� �c�o�m�.�x�y�z�.�W�o�m�b�a�t�(�W�o�m�b�a�t�.�j�a�v�a�:�5�7�)� �~�[�w�o�m�b�a�t�-�1�.�3�.�j�a�r�:�1�.�3�]�
    � �a�t� �c�o�m�.�x�y�z�.�W�o�m�b�a�t�(�W�o�m�b�a�t�.�j�a�v�a�:�7�6�)� �~�[�w�o�m�b�a�t�-�1�.�3�.�j�a�r�:�1�.�3�]�
    � �a�t� �s�u�n�.�r�e�f�l�e�c�t�.�N�a�t�i�v�e�M�e�t�h�o�d�A�c�c�e�s�s�o�r�I�m�p�l�.�i�n�v�o�k�e�0�(�N�a�t�i�v�e�)� �~�[�n�a�:�1�.�5�.�0�_�0�6�]�
    � �a�t� �j�a�v�a�.�l�a�n�g�.�r�e�f�l�e�c�t�.�M�e�t�h�o�d�.�i�n�v�o�k�e�(�M�e�t�h�o�d�.�j�a�v�a�:�5�8�5�)� �~�[�n�a�:�1�.�5�.�0�_�0�6�]�
    � �a�t� �j�u�n�i�t�.�r�u�n�n�e�r�s�.�T�e�s�t�M�e�t�h�o�d�.�i�n�v�o�k�e�(�T�e�s�t�M�e�t�h�o�d�.�j�a�v�a�:�5�9�)� �[�j�u�n�i�t�-�4�.�4�.�j�a�r�:�n�a�]�
    � �e�t�c�.�.���d�������Op
    ��K�d����9�����Op
    ��K�d����9�����Op
    ��K�d����H�����Op
    ��K�d����D�����Op
    ��K�d����K�����Op
    ��K�d���������Op
    ��K�d��������������������"����������������������������������8����������������G����������������C����������������7��������������������������������������������	���������	��"�������	���������	���������	���������	��8�������	���������	��G�������	���������	��C�������	���������	��7�������	���������	���������	���������	����F������?��������?��
    ������?������������H�����N����
    ���p������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+��������������
    ������������������������������������������-�������������t���T���(����	������������
    ����t������Z���
    ���t�� ���Z����Mz��_����_����������������������������	�?����������  `�������������
    ����
    ��������������0���l�o�g�g�e�r� �n�a�m�e� �a�b�b�r�e�v�i�a�t�i�o�n�����������O�
    ��d���������������������	����6�����������@�������	��@��
    �������@����������l����	��������/��
    ���
    ���t�����������#�"��������������.��.��������0
    �J���
    ���t��
    ���T����dMz��_�����_���������������������"""��������	����������� �����
    �������������(���C�o�n�v�e�r�s�i�o�n� �s�p�e�c�i�f�i�e�r���&��������Op
    ��K�]��������������������������	����6�����������@�������	��@��
    �������@����������
    ���t��
    ���T����Mz��_�����_���������������������"""��������	������ ����0�����
    �������������,���D�i�s�p�l�a�y�e�d� �l�o�g�g�e�r� �n�a�m�e�
    ���L��������Op
    ��K�]���������Op
    ��K�]������������������������������������	���������	����6�����������@�������	��@��
    �������@�������d���
    ���t��
    ���T����$Nz��_��G��_�����������������������������	����������� ��	���
    ����������������%�l�o�g�g�e�r� �
    ���H���	�����Op
    ��K�]���������Op
    ��K�]����	�������������������������	�������	���������	����6�����������@�������	��@��
    �������@�������V���
    ���t��
    ���T����Nz��_��hN��_�����������������������������	������ ����0��	���
    �������������4���m�a�i�n�P�a�c�k�a�g�e�.�s�u�b�.�s�a�m�p�l�e�.�B�a�r���&��������Op
    ��K�Y���������������������������	����6�����������@�������	��@��
    �������@�������6���
    ���t��
    ���T����Nz��_��G��_�����������������������������	���������	�� ��
    ���
    ����������������%�l�o�g�g�e�r�{�1�5�}���$��������Op
    ��K�]��������������������������	����6�����������@�������	��@��
    �������@�������>���
    ���t��
    ���T����DOz��_��hN��_�����������������������������	������ ��	��0��
    ���
    ����������������m�.�s�.�s�a�m�p�l�e�.�B�a�r���&��������Op
    ��K�Y���������������������������	����6�����������@�������	��@��
    �������@�������T���B
    ���	t��
    ��c�$���D�������p5���
    �?���������������� �����T���B
    ���
    t��
    ��c�$���D�������p5���
    �?����������� ����0�����T���B
    ���t��
    ��c�$���D����������
    �?���������������� �����T���B
    ���t��
    ��c�$���D����������
    �?����������� ����0�����T���B
    ���
    t��
    ��c�$���D����������
    �?��������������	�� ��	���T���B
    ���t��
    ��c�$���D����������
    �?����������� ��	��0��	���T���B
    ���t��
    ��c�$���D�������p5���
    �?��������������
    �� ��
    ���T���B
    ���t��
    ��c�$���D�������p5���
    �?����������� ��
    ��0��
    ���T���B
    ���t��
    ��c�$���D�������p5���
    �?����������������������T���B
    ���t��
    ��c�$���D�������p5���
    �?�������������������	���T���B
    ���t��
    ��c�$���D�������p5���
    �?��������������	�����
    ���T���B
    ���t��
    ��c�$���D����������
    �?����������� ���� �����T���B
    ���t��
    ��c�$���D����������
    �?����������� ���� ��	���T���B
    ���t��
    ��c�$���D����������
    �?����������� ��	�� ��
    ���T���B
    ���t��
    ��c�$���D�������p5���
    �?�����������0����0�����T���B
    ���t��
    ��c�$���D�������p5���
    �?�����������0����0��	���T���B
    ���t��
    ��c�$���D�������p5���
    �?�����������0��	��0��
    ���N����
    ���t������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+��������������
    ������������������������������������������-�������������x������(����	������������
    ����x������D���
    ���x�� ���Z����Oz��_����_����������������������������	�?����������  `�������������
    ����
    �����������������O�d�d�s� �a�n�d� �e�n�d�s�����������O�
    ��d���������������������	����6�����������@�������	��@��
    �������@����������
    ���x�� ���Z����Pz��_����_�����������������������������	�?����������� ����������������
    b�������������R�o�l�l�i�n�g�F�i�l�e�A�p�p�e�n�d�e�r� �a�u�t�o�m�a�t�i�c� �f�i�l�e� �c�o�m�p�r�e�s�s�i�o�n� �t�h�e� �b�a�c�k�g�r�o�u�n�d�
    �F�i�l�e�A�p�p�e�n�d�e�r� �a�n�d� �R�o�l�l�i�n�g�F�i�l�e�A�p�p�e�n�d�e�r� �a�l�l�o�w� �f�o�r� �t�h�e� �s�a�m�e� �l�o�g� �f�i�l�e� �t�o� �b�e� �w�r�i�t�t�e�n� �t�o� �b�y� �i�n�s�t�a�n�c�e�s� �l�o�c�a�t�e�d� �i�n� �d�i�f�f�e�r�e�n�t� �J�V�M�s�
    �1�0� �f�o�l�d� �i�m�p�r�o�v�e�m�e�n�t� �i�n� �t�h�e� �s�p�e�e�d� �o�f� �t�r�a�n�s�p�o�r�t�i�n�g� �l�o�g�g�i�n�g� �e�v�e�n�t�s� �o�v�e�r� �t�h�e� �w�i�r�e� �
    �S�M�T�P�A�p�p�e�n�d�e�r� �n�o�w� �d�o�e�s� �T�L�S� �a�n�d� �S�S�L�,� �s�u�b�j�e�c�t� �l�i�n�e� �i�n� �o�u�t�g�o�i�n�g� �e�m�a�i�l� �n�o�w� �b�a�s�e�d� �o�n� �P�a�t�t�e�r�n�L�a�y�o�u�t�
    �
    ������>�����`
    ��n�K���}���y�����`
    ��n�K���}���O�����`
    ��n�K���}���]�����`
    ��n�K���}��������`
    ��n�K���}��������`
    ��n�K���}���>�������y�������O�������]�����������������������T���>�������	��y�������	��O�������	��]�������	���������	���������	����6������>��~������>��~
    ������>��~��������N����
    ���x������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+��������������
    ������������������������������������������-�������������|���d���(����	������������
    ����|������J���
    ���|�� ���Z����dPz��_����_����������������������������	�?����������  ``�������������
    ����
    �������������� ���O�d�d�s� �a�n�d� �e�n�d�s� �I�I�����������O�
    ��d���������������������	����6�����������@�������	��@��
    �������@����������
    ���|�� ���Z����Pz��_����_�����������������������������	�?�����������
    ����������������
    8��������������%�(�)� �i�n� �p�a�t�t�e�r�n� �s�t�r�i�n�g�s� �c�a�n� �d�o� �m�a�g�i�c�
    � �%�-�5�0�(�%�d� �%�l�e�v�e�l� �[�%�t�h�r�e�a�d�]�)� �-� �%�m�%�n�
    �D�u�p�l�i�c�a�t�e�M�e�s�s�a�g�e� �f�i�l�t�e�r������$�����`
    ��n�K���}���"�����`
    ��n�K���}��������p
    ��n�K���}d����$����������������������f���������������f�����������������������p���$�������	���������	���������	���������	���������	���������	���������	���������	����6������>��~������>��~
    ������>��~��������N����
    ���|������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+��������������
    ������������������������������������������-�����������������d���(����	������������
    ����������J���
    ����� ���Z����$Qz��_����_����������������������������	�?����������  ``�������������
    ����
    �������������� ���O�d�d�s� �a�n�d� �e�n�d�s� �I�I�����������O�
    ��d���������������������	����6�����������@�������	��@��
    �������@����������
    ����� ���Z����Qz��_����_�����������������������������	�?�����������
    ����������������
    8��������������%�(�)� �i�n� �p�a�t�t�e�r�n� �s�t�r�i�n�g�s� �c�a�n� �d�o� �m�a�g�i�c�
    � �%�-�5�0�(�%�d� �%�l�e�v�e�l� �[�%�t�h�r�e�a�d�]�)� �-� �%�m�%�n�
    �D�u�p�l�i�c�a�t�e�M�e�s�s�a�g�e� �f�i�l�t�e�r������$�����`
    ��n�K���}���"�����`
    ��n�K���}��������p
    ��n�K���}d����$����������������������f���������������f�����������������������p���$�������	���������	���������	���������	���������	���������	���������	���������	����6������>��~������>��~
    ������>��~��������N����
    ���������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+�����b���������
    ������������������������������������������-�����|��������������(����	������������
    ����������\���
    ����� ���Z����Qz��_����_����������������������������	�?�����������`�������������
    ����
    ��������������2���P�l�a�n�s� �f�o�r� �t�h�e� �n�e�a�r� �f�u�t�u�r�e�����������O�
    ��d���������������������	����6�����������@�������	��@��
    �������@�������r���
    ����� ���Z����DRz��_����_�����������������������������	�?���������� �����������������
    ��������������F�i�n�e�r� �t�h�r�e�a�d�i�n�g� �m�o�d�e�l� �l�e�a�d�i�n�g� �t�o� �l�e�s�s� �c�o�n�t�e�n�t�i�o�n�
    �B�e�t�t�e�r� �d�o�c�u�m�e�n�t�a�t�i�o�n�
    �E�c�l�i�p�s�e� �p�l�u�g�-�i�n� �t�o� �v�i�s�u�a�l�i�z�e� �y�o�u�r� �l�o�g�s���l���1�����`
    ��n�K���}��������`
    ��n�K���}���'�����`
    ��n�K���}���1��������������'���������*���1�������	���������	��'�������	����6������F������	��F��
    ������F����������N����
    ���������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+��������������
    ������������������������������������������-������� ���������x���(����	������������
    ����������>���
    ����� ���Z����Rz��_����_����������������������������	�?����������  `�������������
    ����
    �����������������C�o�n�c�l�u�s�i�o�n�����������O�
    ��d���������������������	����6�����������@�������	��@��
    �������@����������
    ����� ���Z����Sz��_����_�����������������������������	�?���������� `p����������������
    X��������������L�o�g�b�a�c�k� �i�s� �t�h�e� �u�n�o�f�f�i�c�i�a�l� �s�u�c�c�e�s�s�o�r� �o�f� �l�o�g�4�j�,� �a�s� �t�h�e� �l�a�t�t�e�r� �i�s� �n�o� �l�o�n�g�e�r� �b�e�i�n�g� �a�c�t�i�v�e�l�y� �d�e�v�e�l�o�p�e�d�.���$���c�����`
    ��n�K���}���c������������c�������	����6������>��~������>��~
    ������>��~��������N����
    ���������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+��������������
    ������������������������������������������-��������0������������(����	������������
    ����������>���
    ����� ���Z����dSz��_����_����������������������������	�?����������  `�������������
    ����
    �����������������Q�u�e�s�t�i�o�n�s�?�����������O�
    ��d���������������������	����6�����������@�������	��@��
    �������@����������
    ����� ���Z����Sz��_����_�����������������������������	�?����������  �����������������
    j�������������
    �r�e�a�d� �t�h�e� �d�o�c�s� �a�t� �h�t�t�p�:�/�/�l�o�g�b�a�c�k�.�q�o�s�.�c�h�/�
    �s�t�u�d�y� �t�h�e� �c�o�d�e� �a�t� �h�t�t�p�:�/�/�g�i�t�.�q�o�s�.�c�h�
    �w�r�i�t�e� �t�o� �u�s� �a�t� � �l�o�g�b�a�c�k�-�u�s�e�r�@�q�o�s�.�c�h�
    �f�i�l�e� �a� �b�u�g� �r�e�p�o�r�t� �a�t� �h�t�t�p�:�/�/�j�i�r�a�.�q�o�s�.�c�h�/�
    �c�h�a�t� �w�i�t�h� �u�s� �a�t� �i�r�c�.�f�r�e�e�n�o�d�e�.�n�e�t�#�q�o�s�
    �t�a�l�k� �t�o� �u�s� �a�t� �+�4�1� �2�1� �3�1�2� �3�2� �2�6���$�������O`
    ��K����(�����`
    ��n�K���}���$�����`
    ��n�K���}���$�����`
    ��n�K���}���)�����`
    ��n�K���}���%�����`
    ��n�K���}��������`
    ��n�K���}�����������������������ff�������������ff�������������ff�������������ff%��������������������������������������������)������������������������������]���q������������������������������������������������	���������	���������	���������	���������	���������	���������	���������	���������	��%�������	���������	����6������?��������?��
    ������?���������N����
    ���������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+����������������������������=�������@������������(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    ��������������������
    ������
    ���0������������������������	�?��������
    0����������������
    ������������H����
    ���������0���������޽h������	���?��� ��������������̙�33����b	����������������������=��	���	��P������������(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    �������������������
    ������
    ���T����$Tz��_����_�����������������������������	�?��������
    0����������������
    j������������*��F�a�s�t�e�r�:� �C�e�r�t�a�i�n� �c�r�i�t�i�c�a�l� �o�p�e�r�a�t�i�o�n�s�,� �f�o�r� �i�n�s�t�a�n�c�e� �d�e�t�e�r�m�i�n�i�n�g� �w�h�e�t�h�e�r� �a� �l�o�g� �s�t�a�t�e�m�e�n�t� �s�h�o�u�l�d� �b�e� �l�o�g�g�e�d� �o�r� �n�o�t�,� �h�a�s� �b�e�e�n� �s�i�g�n�i�f�i�c�a�n�t�l�y� �i�m�p�r�o�v�e�d�.� �T�h�i�s� �o�p�e�r�a�t�i�o�n� �t�a�k�e�s� �a�b�o�u�t� �3� �n�a�n�o�s�e�c�o�n�d�s� �i�n� �l�o�g�b�a�c�k� �v�e�r�s�u�s� �3�0� �n�a�n�o�s�e�c�o�n�d�s� �i�n� �l�o�g�4�j�.� �L�o�g�b�a�c�k� �a�l�s�o� �c�r�e�a�t�e�s� �l�o�g�g�e�r�s� �f�a�s�t�e�r� �:� �1�3� �m�i�c�r�o�s�e�c�o�n�d�s� �i�n�s�t�e�a�d� �v�e�r�s�u�s� �2�3� �m�i�c�r�o�s�e�c�o�n�d�s� �f�o�r� �l�o�g�4�j�.� �M�o�r�e� �i�m�p�o�r�t�a�n�t�l�y�,� �i�t� �f�e�t�c�h�e�s� �a�n� �e�x�i�s�t�i�n�g� �l�o�g�g�e�r� �i�n� �9�4� �n�a�n�o�s�e�c�o�n�d�s� �v�e�r�s�u�s� �2�2�3�4� �n�a�n�o�s�e�c�o�n�d�s� �f�o�r� �l�o�g�4�j�,� �a� �2�3� �f�o�l�d� �i�m�p�r�o�v�e�m�e�n�t�.� �T�h�e� �i�m�p�r�o�v�e�m�e�n�t� �o�v�e�r� �J�U�L� �i�s� �a�l�s�o� �f�a�r� �f�r�o�m� �i�n�s�i�g�n�i�f�i�c�a�n�t�.�
    �S�m�a�l�l�e�r�:� �E�a�c�h� �l�o�g�g�e�r� �i�n�s�t�a�n�c�e� �u�s�e�s� �u�p� �a�b�o�u�t� �4�0� �b�y�t�e�s� �o�f� �m�e�m�o�r�y� �v�e�r�s�i�o�n� �1�6�0� �b�y�t�e�s� �f�o�r� �l�o�g�4�j�.�
    �M�o�r�e� �b�a�n�g� �f�o�r� �t�h�e� �b�u�c�k�:� �L�o�g�b�a�c�k� �d�o�e�s� �a� �b�e�t�t�e�r� �j�o�b� �o�f� �p�r�e�s�e�n�t�i�n�g� �l�o�g�s�,� �h�a�s� �m�u�c�h� �i�m�p�r�o�v�e�d� �f�i�l�t�e�r�i�n�g� �a�n�d� �e�v�a�l�u�a�t�i�o�n� �c�a�p�a�b�i�l�i�t�y�.� �I�n� �s�h�o�r�t�,� �i�t� �d�o�e�s� �e�v�e�r�y�t�h�i�n�g� �t�h�a�t� �l�o�g�4�j� �d�o�e�s� �a�n�d� �m�o�r�e�,� �b�u�t� �b�e�t�t�e�r�.� ����������O`
    ��d����\�����O`
    ��d���������O`
    ��d��������!��������!�������!����T�����!�������!���������!�����T����������	��������	���������	��T�������	���������	���������	����6�����������@�������	��@��
    �������@�������H����
    ���������0���������޽h������	���?��� ��������������̙�33��������������������������=�������`���������H���(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    �������������������
    ������
    ���T����Tz��_����_�����������������������������	�?��������
    0����������������
    ������������B��T�h�e� �l�o�g�b�a�c�k�-�c�o�r�e� �m�o�d�u�l�e� �f�o�r�m�s� �t�h�e� �f�o�u�n�d�a�t�i�o�n� �u�p�o�n� �w�h�i�c�h� �t�h�e� �o�t�h�e�r� �t�w�o� �m�o�d�u�l�e�s� �a�r�e� �b�u�i�l�t�.� �I�n�t�e�r�e�s�t�i�n�g�l�y� �e�n�o�u�g�h�,� �l�o�g�b�a�c�k�-�c�o�r�e� �h�a�s� �n�o� �n�o�t�i�o�n� �o�f� �"�l�o�g�g�e�r�.�"� �W�e� �h�a�v�e� �r�e�c�e�n�t�l�y� �b�u�i�l�t� �a� �m�o�n�i�t�o�r�i�n�g� �f�r�a�m�e�w�o�r�k� �o�n� �t�o�p� �o�f� �j�u�s�t� �l�o�g�b�a�c�k�-�c�o�r�e� �(�w�i�t�h�o�u�t� �l�o�g�b�a�c�k� �c�l�a�s�s�i�c� �o�r� �a�c�c�e�s�s�)�.�
    �
    �L�o�g�b�a�c�k�-�c�l�a�s�s�i�c� �r�e�l�i�e�s� �o�n� �l�o�g�b�a�c�k�-�c�o�r�e� �f�o�r� �b�a�s�i�c� �s�e�r�v�i�c�e�s�.� �I�t� �n�a�t�i�v�e�l�y� �i�m�p�l�e�m�e�n�t�s� �t�h�e� �S�L�F�4�J� �A�P�I�.�
    �
    �L�o�g�b�a�c�k�-�a�c�c�e�s�s� �i�n�t�e�g�r�a�t�e�s� �w�i�t�h� �s�e�r�v�l�e�t� �c�o�n�t�a�i�n�e�r�s�,� �i�n� �p�a�r�t�i�c�u�l�a�r� �J�e�t�t�y� �a�n�d� �T�o�m�c�a�t�.� �T�h�u�s�,� �t�h�e� �c�a�p�a�b�i�l�i�t�i�e�s� �o�f� �a� �f�u�l�l�y�-�f�l�e�d�g�e�d� �l�o�g�g�i�n�g� �s�y�s�t�e�m� �c�a�n� �b�e� �l�e�v�e�r�a�g�e�s� �i�n� �s�e�r�v�l�e�t� �c�o�n�t�a�i�n�e�r�s�.� �
    �
    �
    � ����������O`
    ��d���������O`
    ��d����a�����O`
    ��d���������O`
    ��d���������O`
    ��d���������O`
    ��d���������O`
    ��d���������O`
    ��d��������!��������!���a�����!��������!��������!��������!��������!��������!�����p���������	���������	��a�������	���������	���������	���������	���������	���������	����6�����������@�������	��@��
    �������@�������H����
    ���������0���������޽h������	���?��� ��������������̙�33��������������������������=��V���N��p������������(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    �����������������N��
    ������
    ���T����Tz��_����_�����������������������������	�?��������
    0����������������
    �������������"���S�h�o�w� �J�M�X� �c�o�u�n�t�e�r�.��� ��������O`
    ��d���������!���������������	����6�����������@�������	��@��
    �������@�������H����
    ���������0���������޽h������	���?��� ��������������̙�33����	����������������������=����������������B���(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    �������������������
    ������
    ���T����DUz��_����_�����������������������������	�?��������
    0����������������
    ��������������A�s� �a� �l�o�g�b�a�c�k� �u�s�e�r�,� �t�h�e� �v�a�s�t� �m�a�j�o�r�i�t�y� �o�f� �y�o�u�r� �w�i�l�l� �d�e�p�e�n�d� �o�n� �S�L�F�4�J�,� �n�o�t� �l�o�g�b�a�c�k�.� �T�h�u�s�,� �i�f� �y�o�u� �l�a�t�e�r� �w�a�n�t� �t�o� �s�w�i�t�c�h� �t�o� �J�C�L�,� �J�U�L� �o�r� �l�o�g�4�j�,� �y�o�u� �c�a�n� �d�o� �s�o� �w�i�t�h� �r�e�l�a�t�i�v�e� �e�a�s�e�.�
    �
    �S�L�F�4�J� �a�c�t�s� �a�s� �a� �u�n�i�v�e�r�s�a�l� �l�o�g�g�i�n�g� �A�P�I� �d�e�l�e�g�a�t�i�n�g� �t�o� �v�a�r�i�o�u�s� �l�o�g�g�i�n�g� �s�y�s�t�e�m�s�.� �L�o�g�b�a�c�k�� �i�s� �d�e�s�i�g�n�e�d� �t�o� �s�u�p�p�o�r�t� �S�L�F�4�J� �A�P�I� �f�r�o�m� �t�h�e� �s�t�a�r�t�.� �I�n� �p�r�a�c�t�i�c�e�,� �i�t� �i�s� �a� �l�i�t�t�l�e�� �l�e�s�s� �c�o�n�v�e�n�i�e�n�t�� �t�o� �l�o�g�� �d�i�r�e�c�t�l�y�� �t�h�r�o�u�g�h� �l�o�g�b�a�c�k� �i�n�s�t�e�a�d��� �o�f��� �(�i�n�d�i�r�e�c�t�l�y�)��� �w�i�t�h��� �S�L�F�4�J�.�� �F�o�r��� �e�x�a�m�p�l�e�,� �l�o�g�b�a�c�k�'�s� �d�o�c�u�m�e�n�t�a�t�i�o�n�� �a�l�w�a�y�s� �u�s�e�s� �S�L�F�4�J�.�� �(�T�h�e�r�e� �a�r�e�� �n�o� �e�x�a�m�p�l�e�s�� �i�n� �l�o�g�b�a�c�k� �d�o�c�s� �t�h�a�t� �u�s�e� �l�o�g�b�a�c�k� �d�i�r�e�c�t�l�y�.�)�
    �
    �I�t� �i�s� �a�l�s�o� �p�o�s�s�i�b�l�e� �t�o� �i�n�t�e�r�c�e�p�t� �c�a�l�l�s� �m�a�d�e� �t�o� �J�C�L�,� �l�o�g�4�j� �a�n�d� �j�.�u�.�l� �A�P�I�s� �a�n�d� �r�e�d�i�r�e�c�t� �t�h�e�m� �t�o� �S�L�F�4�J� � �w�h�i�c�h� �w�i�l�l� �t�h�e�n� �d�e�l�e�g�a�t�e� �t�o� �t�h�e� �f�i�n�a�l� �l�o�g�g�i�n�g� �f�r�a�m�e�w�o�r�k� �s�e�l�e�c�t�e�d� �b�y� �t�h�e� �u�s�e�r�.�����������O`
    ��d���������O`
    ��d��������O`
    ��d���������O`
    ��d���������O`
    ��d���������!��������!�������!��������!��������!�����F����������	���������	��������	���������	���������	����6�����������@�������	��@��
    �������@�������H����
    ���������0���������޽h������	���?��� ��������������̙�33��������������������������=����������������2���(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    �������������������
    ������
    ���T����Uz��_����_�����������������������������	�?��������
    0����������������
    �������������n���A�n� �e�x�a�m�p�l�e� �w�i�t�h� �M�u�l�t�i�F�i�l�e�A�p�p�e�n�d�e�r� �m�i�g�h�t� �b�e� �i�n�t�e�r�e�s�t�i�n�g�.��� ���8�����O`
    ��d����8�����!��������8�������	����6�����������@�������	��@��
    �������@�������H����
    ���������0���������޽h������	���?��� ��������������̙�33����r����������������������=�������������������(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    �������������������
    ������
    ���T����Vz��_����_�����������������������������	�?��������
    0����������������
    z���������������c�.�q�.�l� �i�s� �a�n� �a�b�b�r�e�v�i�a�t�i�o�n� �o�f� � �c�h�.�q�o�s�.�l�o�g�b�a�c�k�
    �c�.�q�.�l�.�c�.�r� �s�t�a�n�d�s� �f�o�r� �c�h�.�q�o�s�.�l�o�g�b�a�c�k�.�c�o�r�e�.�r�o�l�l�i�n�g���D���,�����Op
    ��d�d����1�����Op
    ��d�d����,�����!���1�����!��������,�������	��1�������	����6�����������@�������	��@��
    �������@�������H����
    ���������0���������޽h������	���?��� ��������������̙�33����
    ����������������������=����������������F���(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    �������������������
    ������
    ���T����dVz��_����_�����������������������������	�?��������
    0����������������
    ���������������L�o�g�b�a�c�k�-�a�c�c�e�s�s� �c�o�n�f�i�g�u�r�a�t�i�o�n� �i�s� �v�e�r�y� �s�i�m�i�l�a�r� �t�o� �l�o�g�b�a�c�k�-�c�l�a�s�s�i�c�.� ��� ���B�����O`
    ��d����B�����!��������B�������	����6�����������@�������	��@��
    �������@�������H����
    ���������0���������޽h������	���?��� ��������������̙�33����<����������������������=����������������x���(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    �������������������
    ������
    ���T����Vz��_����_�����������������������������	�?��������
    0����������������
    D������������X��A�s� �m�e�n�t�i�o�n�e�d� �p�r�e�v�i�o�u�s�l�y�,� �w�e�'�v�e� �u�s�e�d� �J�o�r�a�n� �(�p�a�r�t� �o�f� �l�o�g�b�a�c�k�-�c�o�r�e�)� �t�o� �i�m�p�l�e�m�e�n�t� �a� �m�o�n�i�t�o�r�i�n�g� �f�r�a�m�e�w�o�r�k�.� �
    �
    �W�e� �n�e�e�d�e�d� �t�o� �r�e�c�r�e�a�t�e� �s�o�p�h�i�s�t�i�c�a�t�e�d� �t�e�s�t� �o�b�j�e�c�t� �a�n�e�w� �e�a�c�h� �t�i�m�e� �w�e� �n�e�e�d�e�d� �t�o� �p�e�r�f�o�r�m� �a� �v�e�r�i�f�i�c�a�t�i�o�n�.� �J�o�r�a�n�'�s� �u�n�i�q�u�e� �c�a�p�a�b�i�l�i�t�y� �o�f� �s�e�l�e�c�t�i�v�e�l�y� �r�e�p�l�a�y�i�n�g� �p�a�r�t�s� �o�f� �a� �c�o�n�f�i�g�u�r�a�t�i�o�n� �w�a�s� �a� �p�e�r�f�e�c�t� �m�a�t�c�h�.���`���g�����O`
    ��d���������O`
    ��d���������O`
    ��d����g�����!��������!��������!�����*���g�������	���������	���������	����6�����������@�������	��@��
    �������@�������H����
    ���������0���������޽h������	���?��� ��������������̙�33����������	����������������=��:���2��������������(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    �����������������2��
    ������
    ���T����$Wz��_����_�����������������������������	�?��������
    0����������������������������_�_�_�P�P�T�9���n�����f����������������������������������������������������������������������������������������������
    ��������������
    �G�i�v�e�n� �t�h�a�t� �
    �
    � �J�o�r�a�n� �c�a�n� �c�o�n�f�i�g�u�r�e� �a�n�y� �c�o�m�p�o�n�e�n�t� �v�i�a� �s�e�t�t�e�r�/�a�d�d�e�r� �m�e�t�h�o�d�s�,� �
    � �c�a�n� �b�e� �e�a�s�i�l�y� �a�d�j�u�s�t�e�d� �t�o� �p�r�o�c�e�s�s� �c�o�n�f�i�g�u�r�a�t�i�o�n� �e�l�e�m�e�n�t�s� �v�i�a� �u�s�e�r�-�s�p�e�c�i�f�i�e�d� �a�c�t�i�o�n�s�,�
    �
    �J�o�r�a�n� �i�s� �r�e�a�l�l�y� �i�d�e�a�l� �f�o�r� �b�u�i�l�d�i�n�g� �f�r�a�m�e�w�o�r�k�s� �w�h�i�c�h� �n�e�e�d� �t�o� �s�u�p�p�o�r�t� �u�s�e�r�-�d�e�v�e�l�o�p�e�d� �e�x�t�e�n�s�i�o�n�s�.����������O`
    ��d���������O`
    ��d���������O`
    ��d����>�����o`
    ��d�������V�����o`
    ��d������������o`
    ��d�������_�����o`
    ��d������������!�������!��������!��������!����=����!��������!����U����!��������!����_����!������~����������	���������	���������	���������	��=�������	���������	��U�������	���������	��_�������	����6�����������@�������	��@��
    �������@�������H����
    ���������0���������޽h������	���?��� ��������������̙�33����������
    ����������������=�������������������(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    ��������������������
    ������
    ���0������������������������	�?��������
    0����������������
    ������������H����
    ���������0���������޽h������	���?��� ��������������̙�33��������������������������=�������������������(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    ��������������������
    ������
    ���0������������������������	�?��������
    0����������������
    ������������H����
    ���������0���������޽h������	���?��� ��������������̙�33����z����������������������=��&������������������(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    �������������������
    ������
    ���T����Wz��_����_�����������������������������	�?��������
    0����������������
    ��������������l�o�g�b�a�c�k�-�c�o�r�e� �m�o�d�u�l�e�s� �c�a�n�n�o�t� �l�o�g� �b�e�c�a�u�s�e� �i�t� �h�a�s� �n�o� �n�o�t�i�o�n� �o�f� �a� �"�l�o�g�g�e�r�"�.� �
    �L�o�g�g�e�r�s� �a�r�e� �d�e�f�i�n�e�d� �i�n� �l�o�g�b�a�c�k�-�c�l�a�s�s�i�c�.�
    �
    �B�u�t�,� �m�o�r�e� �g�e�n�e�r�a�l�l�y�,� �a� �l�o�g�g�i�n�g� �s�y�s�t�e�m� �w�h�i�c�h� �u�s�e�s� �i�t�s�e�l�f� �f�o�r� �i�t�s� �o�w�n� �l�o�g�g�i�n�g� �i�s� �e�x�t�r�e�m�e�l�y� �d�i�f�f�i�c�u�l�t� �t�o� �d�e�s�i�g�n� �a�n�d� �t�o� �m�a�i�n�t�a�i�n�.� �I�t� �c�a�n� �b�e� �d�o�n�e� �b�u�t� �a� �t�h�e� �c�o�s�t� �o�f� �n�o�n�-�n�e�g�l�i�g�i�b�l�e� �c�o�m�p�l�e�x�i�t�y�.� �
    �
    �I�n�s�t�e�a�d� �l�o�g�b�a�c�k� �r�e�l�i�e�s� �o�n� �S�t�a�t�u�s� �o�b�j�e�c�t� �t�o� �r�e�p�o�r�t� �i�t�s� �o�w�n� �s�t�a�t�e�.�
    ������I�����O`
    ��d����(�����O`
    ��d���������O`
    ��d���������O`
    ��d���������O`
    ��d����A�����O`
    ��d���������O`
    ��d����I�����!���(�����!��������!��������!��������!���A�����!��������!�����b���I�������	��(�������	���������	���������	���������	��A�������	���������	����6�����������@�������	��@��
    �������@�������H����
    ���������0���������޽h������	���?��� ��������������̙�33����D������
    ����������������=�������������������(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    �������������������
    ������
    ���T����Wz��_����_�����������������������������	�?��������
    0����������������
    L������������t��-� �a�j�o�u�t�e�r� �u�n�e� �c�l�a�s�s�e� �X�Y�A�p�p�e�n�d�e�r�,� �a�j�o�u�t�e�r� �l�a� �c�o�n�f�i�g� �n��c�e�s�s�a�i�r�e� �d�a�n�s� �l�o�g�b�a�c�k�-�Y�Y�.�x�m�l� �e�t� �m�o�n�t�r�e�r� �q�u�e� �l�a� �c�o�n�f�i�g� �e�s�t� �f�a�i�t�e� �t�o�u�t�e� �s�e�u�l�e�,� �s�a�n�s� �m�o�d�i�f�i�e�r� �q�u�o�i� �q�u�e� �s�e� �s�o�i�t�.�
    ��-� �c�o�n�f�i�g�u�r�a�t�i�o�n�:� �c�o�n�f�i�g�u�r�e�r� �u�n� �f�i�c�h�i�e�r� �x�m�l� �a�v�e�c� �u�n�e� �e�r�r�e�u�r� �(�p�a�s� �d�e� �T�r�i�g�g�e�r�i�n�g�P�o�l�i�c�y� �d�a�n�s� �u�n� �R�o�l�l�i�n�g�F�i�l�e�A�p�p�e�n�d�e�r�)� �e�t� �m�o�n�t�r�e�r� �l�'�e�f�f�e�t� �d�e�s� �s�t�a�t�u�s� �o�b�j�e�c�t�s� �e�t� �l�e� �l�i�e�n� �v�e�r�s� �l�a� �p�a�g�e� �c�o�d�e�s�.�h�t�m�l�.� �L�o�g�b�a�c�k� �s�e� �m�a�n�i�f�e�s�t�e� �l�o�r�s�q�u�'�i�l� �y� �a� �u�n�e� �e�r�r�e�u�r� �e�t� �f�o�u�r�n�i� �u�n�e� �p�i�s�t�e� �� �s�u�i�v�r�e� �p�o�u�r� �l�a� �r��s�o�u�d�r�e�.���L��������O`
    ��d��������O`
    ��d���������!��������!�������!�����*����������	���������	��������	����6�����������@�������	��@��
    �������@�������H����
    ���������0���������޽h������	���?��� ��������������̙�33��������������������������=������� ������������(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    ��������������������
    ������
    ���0������������������������	�?��������
    0����������������
    ������������H����
    ���������0���������޽h������	���?��� ��������������̙�33��������������������������=��p���h��0�������������(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    �����������������h��
    ������
    ���T����DXz��_����_�����������������������������	�?��������
    0����������������
    ������������<��W�e� �c�o�n�s�i�d�e�r� �c�o�d�e� �r�e�a�d�y� �f�o�r� �d�i�s�t�r�i�b�u�t�i�o�n� �o�n�l�y� �a�f�t�e�r� �i�t� �i�s� �p�r�o�p�e�r�l�y� �d�o�c�u�m�e�n�t�e�d�,� �w�h�i�c�h� �i�s� �t�h�e� �m�a�i�n� �r�e�a�s�o�n� �w�h�y� �l�o�g�b�a�c�k� �c�a�r�r�i�e�s� �a� �0�.�x� �v�e�r�s�i�o�n� �s�t�a�m�p� �i�n�s�t�e�a�d� �o�f� �1�.�x�.��� ��������O`
    ��d���������!���������������	����6�����������@�������	��@��
    �������@�������H����
    ���������0���������޽h������	���?��� ��������������̙�33��������������������������=�������@������������(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    ��������������������
    ������
    ���0������������������������	�?��������
    0����������������
    ������������H����
    ���������0���������޽h������	���?��� ��������������̙�33��������������������������=�������P������������(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    �������������������
    ������
    ���T����Xz��_����_�����������������������������	�?��������
    0����������������
    �������������Z���-� �T�u�r�b�o� �f�i�l�t�e�r�i�n�g� �e�x�a�m�p�l�e� �b�a�s�e�d� �o�n� �u�s�e�r� �l�o�g�i�n��� ���.�����O`
    ��d����.�����!��������.�������	����6�����������@�������	��@��
    �������@�������H����
    ���������0���������޽h������	���?��� ��������������̙�33��������������������������=�������`������������(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    ��������������������
    ������
    ���0������������������������	�?��������
    0����������������
    ������������H����
    ���������0���������޽h������	���?��� ��������������̙�33��������������������������=�������p������������(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    ��������������������
    ������
    ���0������������������������	�?��������
    0����������������
    ������������H����
    ���������0���������޽h������	���?��� ��������������̙�33��������������������������=�������������������(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    �������������������
    ������
    ���T����Yz��_����_�����������������������������	�?��������
    0����������������
    �������������*���N�O�_�E�X�C�E�P�T�I�O�N� �e�x�a�m�p�l�e�
    ���@��������O`
    ��d���������O`
    ��d���������!��������!���������������	���������	����6�����������@�������	��@��
    �������@�������H����
    ���������0���������޽h������	���?��� ��������������̙�33��������������������������5�������������������(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    ��������������������
    ������
    ���0������������������������	�?��������
    0����������������
    ������������H����
    ���������0���������޽h������	���?��� ��������������̙�33��������������������������5�������������������(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    ��������������������
    ������
    ���0������������������������	�?��������
    0����������������
    ������������H����
    ���������0���������޽h������	���?��� ��������������̙�33��������������������������=��j���b��������������(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    �����������������b��
    ������
    ���T����dYz��_����_�����������������������������	�?��������
    0����������������
    ������������6��C�o�n�t�r�a�r�y� �t�o� �l�o�g�4�j�,� �w�h�e�r�e� �w�e� �w�r�o�t�e� �m�a�n�y� �r�e�g�r�e�s�s�i�o�n� �t�e�s�t�s�,� �i�n� �l�o�g�b�a�c�k�,� �w�e� �h�a�v�e� �l�e�a�r�n�e�d� �o�u�r� �l�e�s�s�o�n�.� �W�e� �w�r�i�t�e� �m�a�n�y� �m�o�r�e� �u�n�i�t� �t�e�s�t�s� �a�n�d� �f�e�w�e�r� �i�n�t�e�g�r�a�t�i�o�n� �t�e�s�t�s�.��� ��������O`
    ��d���������!���������������	����6�����������@�������	��@��
    �������@�������H����
    ���������0���������޽h������	���?��� ��������������̙�33��������������������������=��4���,��������������(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    �����������������,��
    ������
    ���T����Yz��_����_�����������������������������	�?��������
    0����������������
    ������������n��A�t� �t�h�e� �e�n�d� �o�f� �e�a�c�h� �s�t�a�c�k� �f�r�a�m�e�,� �l�o�g�b�a�c�k� �w�i�l�l� �a�d�d� �a� �p�a�c�k�a�g�i�n�g� �i�n�f�o�r�m�a�t�i�o�n� �f�o�r� �t�h�e� �c�o�r�r�e�s�p�o�n�d�i�n�g� �c�l�a�s�s�.� �P�a�c�k�a�g�i�n�g� �i�n�f�o�r�m�a�t�i�o�n� �c�o�n�s�i�s�t�s� �o�f� �t�h�e� �c�o�n�t�a�i�n�i�n�g� �j�a�r� �f�i�l�e� �a�n�d� �v�e�r�s�i�o�n�i�n�g� �i�n�f�o�r�m�a�t�i�o�n�.� �T�h�e� �i�n�c�l�u�s�i�o�n� �o�f� �p�a�c�k�a�g�i�n�g� �i�n�f�o�r�m�a�t�i�o�n� �s�h�o�r�t�e�n�s� �t�h�e� �t�i�m�e� �i�t� �t�a�k�e�s� �t�o� �i�d�e�n�t�i�f�y� �s�o�f�t�w�a�r�e� �p�r�o�b�l�e�m�s�.�
    �
    �L�o�g�b�a�c�k� �t�r�i�e�s� �h�a�r�d� �t�o� �g�i�v�e� �y�o�u� �t�h�e� �c�o�r�r�e�c�t� �p�a�c�k�a�g�i�n�g� �i�n�f�o�r�m�a�t�i�o�n�.� �H�o�w�e�v�e�r�,� �i�f� �f�o�r� �a�n�y� �r�e�a�s�o�n� �i�t� �i�s� �u�n�s�u�r�e�,� �i�t� �w�i�l�l� �p�r�e�f�i�x� �p�a�c�k�a�g�i�n�g� �i�n�f�o�r�m�a�t�i�o�n� �w�i�t�h� �a� �~�.���z�������O`
    ��d���������O`
    ��d���������O`
    ��d��������!��������!��������!�������!���������!�����F���������	���������	���������	���������	���������	����6�����������@�������	��@��
    �������@�������H����
    ���������0���������޽h������	���?��� ��������������̙�33��������������������������5�������������������(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    ��������������������
    ������
    ���0������������������������	�?��������
    0����������������
    ������������H����
    ���������0���������޽h������	���?��� ��������������̙�33��������������������������=�������������������(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    ��������������������
    ������
    ���0������������������������	�?��������
    0����������������
    ������������H����
    ���������0���������޽h������	���?��� ��������������̙�33����d����������������������=�������������������(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    �������������������
    ������
    ���T����$Zz��_����_�����������������������������	�?��������
    0����������������
    l������������R��%�(�)� �c�a�n� �b�e� �u�s�e�d� �t�o� �g�r�o�u�p� �p�a�r�t�s� �o�f� �y�o�u�r� �l�o�g�g�i�n�g� �o�u�t�p�u�t�.� �T�r�y� �i�t� �o�u�t�!�
    �
    �D�u�p�l�i�c�a�t�e�M�e�s�s�a�g�e�F�i�l�t�e�r� �w�i�l�l� �a�u�t�o�m�a�t�i�c�a�l�l�y� �f�i�l�t�e�r� �o�u�t� �m�e�s�s�a�g�e� �i�f� �t�h�e�y� �r�e�p�e�a�t�e�d�e�d� �o�v�e�r� �a�n�d� �o�v�e�r� �a�g�a�i�n�.�
    ������C�����O`
    ��d���������O`
    ��d����e�����O`
    ��d���������O`
    ��d����C�����!��������!���e�����!��������!�����8���C�������	���������	��e�������	���������	����6�����������@�������	��@��
    �������@�������H����
    ���������0���������޽h������	���?��� ��������������̙�33��������������������������5��������������������(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    ��������������������
    ������
    ���0������������������������	�?��������
    0����������������
    ������������H����
    ���������0���������޽h������	���?��� ��������������̙�33��������������������������5������������������(����	������������
    ���������X���
    �����
    ��C���������������?�������� 
    ��������������������
    �����
    ���0������������������������	�?��������
    0����������������
    ������������H����
    ��������0���������޽h������	���?��� ��������������̙�33��������������������������5������� �����������(����	������������
    ���������X���
    �����
    ��C���������������?�������� 
    ��������������������
    �����
    ���0������������������������	�?��������
    0����������������
    ������������H����
    ��������0���������޽h������	���?��� ��������������̙�33��������������������������=�������0�����������(����	������������
    ���������X���
    �����
    ��C���������������?�������� 
    ��������������������
    �����
    ���0������������������������	�?��������
    0����������������
    ������������H����
    ��������0���������޽h������	���?��� ��������������̙�33�����r���@����j��`&��,=��D��JJ��NR��Z��Db��^j��Pr������Ԙ����l��6��X����N��`��n����.������J��
    ��J�0�9�@�^G�M�S�\�j^�g�o�r�{�~� �2�v���ܔ�^���^�F�0�����д��~����J�2�����������
    ���������D������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Oh�+'0���$��������`������h������x���������������	������
    ������������������
    �����������������������Slide 1�������*Unrestricted*��������Ceki ��������� Ceki���������191�@����P��@�����������@����93@���#BYG���0�����(������x����������������������������ېf�:ې:8������^���6���Շ6daѮ66d׊89������f��f���99�ېff:��f���ff���::�ېf��:���ff�:f��f���f����:���ې:f�:::��ې:���::�f:��:���fff��fې:��:���ې:fېېf:f��:���ې:fېېffېېf��:���ې:��f���f448ӄ58`·da�aa։6d׊8ed���9efې:f���f:f:ffې::fې:�fې�fff::fې:ff:fffې::fېff:ffې::fېfېېf:f:fېfېېffېېf:fې:f:f8]�`������`��ad��d׊8e֌�8���9��؎ېff:��fېېff:::ېf��:ې:�f������f�fې:f��:���ې:��:���f:ffې:�f������f�fېېf:������:��ې�f������f�fېېffېېf�f������f�ff8]8`·`68ad66d׊8e֌f؎ېff���ff:fېېf:f����::��ې:fېf::ې:f:fې::fې:ffې::fېf::ffې::ff::fېf::ffې::ffې::fېf::ff:]48ӄ5��68��·dad6�d׊8ed�9f99؎ېff:��f���ffېېf:f۶f::ffې:��::��ېf:ff���f:������ff���:��ې��ff��fې:��::��ېf�::���f:ff:��::��ېf�::���ff�::���f��::��ې��f���f8������^�dad׊89������e�efېfې:ffې�f���f��f���f��ff�fې:ffې::������:��ې̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}����}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��:�}�:}��}��}��}��}��}��}��}��}��}��}��}��f�}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}����ې}:}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��:�}�:}��}��}��}��}��}��}��}��}��}��}��}��}��:�}�:}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��:�}��:}f}��}��f�}f:�۶}��}����ն}f}��:�:f}�:f�}�:}��}��}��:�۶}��:�}�:}��}��:}f}��:�}�:}��f�}��}��:��f}�:}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��:�}�:}��}��}��:�}�f��}:��}:��}f:�}f��ې}f}��f�}��f�}:��}:}��f��:}:}��}��}��}��:�}:��ې}f:�}�:}��:�}�f��}::�}�::�}:��ې}f��}:}��f�}�:}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��:�}�:}��}��}��f�}��}��f}f:�}�:}��f}f:�}�f}��:}��f�}�f��}::�}�:}��}��:�f}��}��}��}��}��:�}�:}��::�}�:}��f�}��}��f}f:�}�:f�}��}��}��}��:�}�:}��}��:�}�:}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��:�}�:}��}��}��f�}��}��f}f:�}�:}��f}f:�}�f}��:}��}��:�}::�}�:}��}��:�}�f}��}��}��}��}��:�}�:}��::�}�:}��f�}��}��f}f:�}�:f�:�}�:}��}��:�}�:}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��:�}�:}��}��}��:�}�f��}:��}:��}f:�}f��ې}f}��:�}�:��}�f��}:}��:f:}��}��}��}��}��:�}:��ې}f:�}:}��:�}�f��}::�}�::�}�:}��f}f��}:}��:}�:}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��:�}�:}��}��}��}��:}��}��f�ꐐ}f:�۶}��}��}��:}��}��:�:f}�::}��}��}��}��:�۶}��:�۶}�f:}��:�}�:}��f�}��}��:�}�:}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��:�}�:}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��:�}�:}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��:�}�:}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��:�}�:}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��:�}�:}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��:�}�:}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��:�}�:}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��:�}�:}��}��}��}��}��}��}��}��}��}��}����۶}�:}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}����������������	��
    ������
    �������������������������������������� ��!��$��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������h�t�t�p�:�/�/�l�o�g�b�a�c�k�.�q�o�s�.�c�h�/����������������������������������������������m�a�i�l�t�o�:�l�o�g�b�a�c�k�-�u�s�e�r�@�q�o�s�.�c�h����������������������������������������������h�t�t�p�:�/�/�j�i�r�a�.�q�o�s�.�c�h�/�������������������1���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������R�o�o�t� �E�n�t�r�y��������������������������������������������������dO��)�����������������������@�������C�o�m�p�O�b�j�������������������������������������������������������������������������������������������������9��������O�l�e���������������������������������������������������������
    ������������������������������������������������C�u�r�r�e�n�t� �U�s�e�r����������������������������������������������������������������������������������������,�������P�i�c�t�u�r�e�s������������������������������������������������������������������������������������������z�����P�o�w�e�r�P�o�i�n�t� �D�o�c�u�m�e�n�t���������������������������(�����������������������������������������������*������S�u�m�m�a�r�y�I�n�f�o�r�m�a�t�i�o�n���������������������������(����������������������������������������T�������D�o�c�u�m�e�n�t�S�u�m�m�a�r�y�I�n�f�o�r�m�a�t�i�o�n�����������8�����������������������������������������t������logback_1.0.13/logback-site/src/site/resources/slf4j-slides.vsd�������������������������������������0000644�0001750�0001750�00000323000�11377016712�024311� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ࡱ����������������>��	��������������������������������������2���R�o�o�t� �E�n�t�r�y�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������R�o�o�t� �E�n�t�r�y�������������������������������������������������������������F������������yIwd���@������V�i�s�i�o�D�o�c�u�m�e�n�t�������������������������������������������������������������������������������3���}<������S�u�m�m�a�r�y�I�n�f�o�r�m�a�t�i�o�n���������������������������(����������������������������������������������S�������D�o�c�u�m�e�n�t�S�u�m�m�a�r�y�I�n�f�o�r�m�a�t�i�o�n�����������8����������������������������������������������������	���
    ���������
    ��������������������������������������������������������� ���!���"���#���$���%���&���'���(���)���*���+���,���-���.���/���0���1���4���5���6���7���8���9���:���;���<���=���>���?���@���A���B���C���D���E���F���G���H���I���J���K���L���M���N���O���P���Q���R���S���T���U���V���W���X���Y���Z���[���\���]���^���_���`���a���b���c���d���e���f���g���h���i���j���k���l���m���n���o���p���q���r���s���t���u���v���w���x���y���z���{���|���}���~���������V�i�s�i�o�I�n�f�o�r�m�a�t�i�o�n���������������������������������"����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������	���
    �������������������������������������������������������������������������������������������՜.�+,D���՜.�+,@����������`������h������t���������������������������������������
    ���������������������������������������$���Lombard Odier Dareir Hentsch & Cie������������������������������������������Page-1�b���Page-2�b���Rectangle�d ���Title block contemp.�eir���Note box triangles�.���Note box contemp.��.���Dynamic connector��.���3-D box����Shadowed box�cto���Border small�cto���Title block classic����Border neon������������Pages���������������Masters����
    �������������0������|������������������������������_PID_LINKBASE�������_VPID_ALTERNATENAMES�������_TemplateID�������A��������������������������TC010492811033������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Oh�+'0���S��������`������h������t��������������������������������������
    ��������(���������������������������������Ceki Glc�������������������������<���C:\Program Files\Microsoft Office\Visio11\1033\BASICD_M.VST�������Ceki Glc��������Microsoft Visio�@���@kIwdG���\R�������������������E���a�������������	�� EMF���TR�����������l�������������Q����������������h$��V�I�S�I�O���D�r�a�w�i�n�g�������L���Q����������E���a�����������F���b��� ������������?����������?�������������d���(������(Q��(���F���b���������(Q������������������������������������������������������������������`_^??>??>??>??>??>??>??>??>??>??>??>??>poo������������������}N.ϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙu{L�����Lj]��>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<Lj]��ϿLj]��Lj]��Lj]��ϿLj]��>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<Lj]�����Lj]��������������������}N.ϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuLj]�����������������������������������������ת߻Lj]�����߻߻Lj]��`_^??>??>??>??>??>??>??>??>??>??>??>??>poo߻߻Lj]��߻߻Lj]��߻߻Lj]��Ͽ|vl��HGG??>??>??>??>??>??>??>??>??>??>??>??>POO���>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=</.-???��������]ZX蹲??>��������������H-߻߻߻߻߻߻߻߻߻߻༥������������ä߻߻߻߻z]ZX���蹲??>��������������T4߻߻߻߻߻߻߻߻߻߻޸������������ä߻߻߻߻yl]ZX������蹲??>��������]ZX蹲??>�������������������������������������� ���{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt/-,{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt]ZW??>������������������������������������������������������������������������������������ �������������������������T4߻߻߻߻߻߻߻߻߻߻߻߻߻߻߻߻߻߻��������������������H-߻���߻���߻���߻���߻���߻���߻���߻߻߻ϙu߻�����߻߻�� ������������������������������������0//߻߻��߻߻��߻߻��������������ݶܴ׿��������������������������������������������������>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<��{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt�������������������������������������������������������}N.ϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuΖp������������fϙuϙuМx����������������������������������>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<�����������Ͽ`__??>??>??>??>??>??>??>??>??>??>??>??>POOPOO??>??>??>??>??>?=<=:8??>??>??>??>??>POO��������ߺܴ��߻߻��Ͽ߻߻��>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<߻߻��������߻߻�����������ϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuLj]Ῠ������������������������������������������������������`_^??>??>??>??>??>??>??>??>??>??>??>??>poo�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Visio (TM) Drawing
    �������}<������O5;�H��R�����wf���� %7`
    ,�o7p
    0%7��5�7p
    0%77����*������8��� �������!��fff�MMM�333�Iy�Fw��������ͩ������|�����o�ݡ�������Hx�����������������������������������������������������������������������UPT���������������������������/���L��
    ���C���������U"J:D�T5I[1hX�T@��.	
    
    /U�bW�##_b��0zGz?L�\&B1r&b%U&	!�oM$d )
    P?;H$,Q,
    &#&J,
    5&?D#//?M?\.? ��CA
    ~,,,'q/%P6$Y6	(}k?�l)?"U
    U%A3#
    o	>S@#B:_�a�_ReUUeUeUeUeUeUePONODN`_ReUUeUeUeUeUUeUeUU/b	SR%;5OM�%>Qiq;RR�RRgg	Rqh>Qj  /A^F' %p3:|bFpT#|	|
    |vi?=Os<34x,,,/RQmeY q]U@QvovL__q_�___OO_OOTYA`,X@L&/d2?ɖQ3YҨsUΡ̦�xΟ@$"Jʼ& ͥ*@d2A??ϟJ[D!�	f:45ŧ5ŷ5@00D$#	
    Q#b	;
    C�hߠ
    �Y
    ,00JDNrq(NN㊮NN(NN&&NDhuc7XXKvvFN&KD#KD#-�BD#KHGHDHB$NzDKq%��iz4
    }1T,Eu9fdhT,W'�0΢Uܮ5E0	fI$[O�mOC%ߑE##HZߪ
    E,3Y&4JY&5&6<s9FaBaj+h88?&!3"DE=T;ܯ?w?@??8&t,'5UR^LY Y7akKt//BJhuipsĝa.1DTcAcpvOpM
    KKuhdX(GNiXIT[EEh.D#E,ah-50zG#zpvb
    aHGmc/QP
    K{\Hp_hd? pA?%?7?I?[;<t5j!
    OO*FQ///F�/K]SEn%cO@OOlE$g�\Ey[EO_!_�3_E_W_i_{___�__VB506,�HM.`e^M�Ia,>PbQaƒ2q?
    a%oXIoQ�fdooo�SEX_O-OF�6EDi66Oҟm2H�g;pbӏ�_
    ,X7R[,<WbӤ69sc Rba2T^<�C=ACoor<G5C+=Oaﲶ2T}R`�PL6;�]ї匒<ұwr!�1r��/Ma�&3@M�)ZQg#��P$!y"7A*%#႑�4�$"WA;Z`Яܯ�u[/�lsx0aq&Iy$6H̻UxB�z;b�bt�b}JmM8~{Fw�ƿK@Xu�b{_ߴߠXEU"	5GPH]�&;-?MW,GH<WW][EM%qYq3~O贁NkѼt6M$%RWYlm%O+1C&Lmu!` EOUdK@U/'n /2/D/jR>Vv�u//?Q/Xj�|?C?	qvy?C�_|�C??"<�WyJj�bJ�\OO_'_/K_�]_o_[/ӣ___�___o!o3oEoWoio{oq-w_ooU�o42�b@�b2~q�bGYk}�
    2�%7I[m�Ǐُ!3Ed �!gy&urW�b2{Ar侟�П*<N�`rᚯЯ�*<N`�rf2b�߿5C.}A�SewωϛϭϿ�#5G�Yk}ߏߡ߳
    1̶"�#Ugy2{.�bL�bݬ�*<N`r
    �'9K]oxR$ͩP8u12#�5GYk}/ /2/�D/V/h/z////////
    ??i%�&C?U?g?0R0?�b>E�bۚ???�???OO*O<ONO`OsOOOOOO�OO__'_9_K_]_o___@'�(___sϒ�bd ,s�bo#o5oGoYoko@}ooooooo�o 2DVhz�
    zq)7P2DV0Rވ�&ŏ׏ 
    1Cas�͟ߟ�'9K]o@*|�+󨯺̯k�{bsj�b܈�*<N`rͿ߿�'9K]oρϓϷ.9,�-x&8gq�b[yu�bk}ߏ�߳
    1DVhz�
    .@Rd.9�.0I&�8J\nnA'9K]o&81!d=�b;�bn(U/�0//&/2-�b@�b[3?�bD�bY/k/P}///*m)o4///?MF"b�HaS7?I?[?m??�???????O~!O?39O<KH@I�b]O2NSOOO}a1B[OO_�_*_<_N_`_r____\____o�o+o=oOoaosoooo
    so,o4=`"#5	9ji2B�hz 
    iXL^�pʏ܏��$6HZ~5�6ߞŸVLpV@+�=Oas�Xܯ�$6�HZl~ƿFwKH	{"qi:�L5(+ϛϭϿ�Ϻ//+?fxߊߜ߮�,>Pj7H!x2.|�0BTϊ>P}$);�M_q	3&DO贁NkFFY6
    u(tq0??6?\.? ��7A%&T|36|2LLG$o'E//&/nF|2	F
    jKO]O\ŕ({G=F03kRGF�7FJ<_{k$__\E(GyG_/�q/Fi1Tm////�//?!?3?E?W8�h?z???p??_�?
    OO.O@O__vO�OOOOOOO�'*_<_W_`_r___�p__ڏoo$?o!�~oooooooo
    -zz1ҪG� 7IWŬb15G�ȭa!G�Yk}'9Kׯ�
    :;M_ ZTx�b�"sK;"ErdSscu�ϙϫϽ�);M_q߃ߕ�߹Ɓ�q:
    !4nPbVɟp�fEqt"9G�Q-:s�	#ad�
    .@Rdv�
    //1/C/U/�t1CcJ0zEX4FXj|�%UFDf�P
    h>$/�T6D
    UUF~@x<?F
    BP(?43P?� �J+1:{
    b�j/b��::I!H??҉^ 	01`b�o�x�,�r�e�c�t�a�n�g�lS ,�bY s�iU |e^
    {%k�Ui//X''W�0U32!0u ��P��(:��{�W_q�D�r�a�g� �t�h�uesa�pWo�nodw�i�pe�. �c�uT�m)�zdb�yg*aT�Xslci n!�z:������bL&d2鿸\.?P?hHKMD?l?~4
    5DHD"
    #	B=hZ,>TE=��cA��UF~?M&d2?F\.?QR6iu�` ?7u�B
    bq*z	zBAD`A�MJڍU5
    �L/��@%'#a!f$5	`?C�o�p�y�r�i�gT�t� �(�wc�) 2�0 3 M c o�%s f"!r !ua i n�. _ �A�l  (Us"e e v d q/`V s�_�S�b . h�m�!�#�4�5�7+02p-l'/m#	m'?9	
    	&H?LUl>0>Uh�h11E!4�	a+�!B'E'@JT3FSF>zbTrF{
    BMBO(4MD]OoAtO�I"A?5NOwIA�EETF_oO7[E21PO>rA
    �RSI"q]o?
    "VJ�@=ll1n"> 8mSYL aM,k?Ne�EfWi]8|CCeR%�,nEn0Yoko|] a�?5,eU\gwonWoi\jLo8EPiC;'g@QT=7
    bTA&!&#O(STC&@
    �2H'�+�򪠄���~L)����uE/>F[��_���#$P7��JB�
    M]�za@]�@��T]�MaLV?L��XP
    #�)
    +T,'-4U/A1NU2[	5h�UFDf�P
    h,�TYY��BU?Y,b'@?#H$ @Fx<?F
    BP(?|	P?7C� �
    b�3b��Y'�GMש c @3�b 2;G3(;9 
    FL&d2?-ɗ(\.Yҩ(.sU!&/:dH?$?66?	[�`2Bqw( 	0`Pc�o�n�t�e?�m�p�.\�;_o�r�a0y\�t�i0l0,�b0o0k2e�x01o0,�f2m279c0pT21,0a0e0>Ae�g0n�db%e^E	UYG�]5ha�h
    Mu ��1����??�EwwEUbqpg���T�U����D�r�a�g� �t�h�uesa�pWo�nodw�i�peS�.
    ai%l?n!� a8I DsNcGB VNr5s)�z7������b@ jZ??Y08!O?h|*?HF1Q׿|>"H$47D<
    UG
    D�
    #	h8.�T	 YTYUi��U@|>@@"H$@F@ �@FjZ??ֻ?P}	��^�**&
    *':(q
    �F��B$�F$$$%(
    /%(F$։u�`h?"u�)b%&	!*]r�33‰U;?
    ��"�/�-"9%)1!$/$h�/'񄄉53,2&L��@#253ADKK-`V�i�s�_�S�E�.�cP�m�!�#�4�9�2@7!2`?C�o�p�y�Ur@gP�tg�(@])g�2�0@3g�M@c@o@o�IfBAr@Qa@i@n@ g�A�Ul)P Hs-Re@e@v?Pd@1D453|	]CJD&l  	G?hEH@L&d2?]X\.˳
    h^sU0a .f3PoSF	HL+5Ue!a !e	*":�Ha�Ud&ked*kedvggY	azET$t,2%t<B&tpB't[RDADAŴ)8{s6A�c@�&qTC�4Ov66vTh�rq�oEdEq<E[sFx<NQ!q)B.d?rq�b'�pE]0^KjqU?
    !_b�	oa
    ^b�*_[U9ftQ0tRҔ3u2&@Ē,2mx<E}sz
    ,5sAUI�	`�@c%'7'#CAn@eĶ@Ur@ v`TP�ࡡa_2`*C)Pa@sRB;RܯyE)Pue@a#;�N@&pPdR?Pt$B%#2d@hal]I,5:�81䅭h1@hf�4jӆ2bB5tt1vrc>d@ j@񓺑F=d@	ѐ0t!K]o	u7
    373,55:T83>�b�솟~`@m22bXj
    2҂�%�PW&8J\c)8sIh	(EMSF1CZW&�z?P @og�f@A&x@ f2v�`
    SBQA.�X@��~d@V�Y#&!Bh!a�uJ-Zpr`9UHPuD�"
    #	%>h-(JTEQMU:M��UF@ �@FjZ?ҷQM�NuQ�`b��Ao��@uA�RN5A
    N	m>JitifNtb	ft�DJNU!
    $�`?C�o�p�y�r�i�g\�t� h�c�)? 2�U0K 3? M7 c5 o�s/ f=".!r1 j!a= i/ n�}.?  �A�l U 5(s"e] e5 v d} `N`!N##0zGz?jH@	�R2#0L&J�cSV
    l$JUp5
    UI	&!	1	Na2a#;#Fm6f;�N 1?tr(:4�8??=5QM?_? q????04cK??@C2{"?>MU�A1zE_OqOOOOO_$]I*J)O<@UHXuD�
    #	U>ih]0JT x]]I	>UUM��UF@ �@FjZ?QNtQ�`A�o�@Nt�Rb?�BNr$�bo� -�r%K
    Z0'2JMuu(0N0l	0J#NU0zGz?@4Q#&�N=-#'�(�Iy�;$(P?$$-#$"LT-#!$+"`?C�o�p�y�r�i�gd�t� �(�c�),0]2p�0�3,0M$0]c"0o�s0f*2R1r0W1a*0i0n�.,0 �A�Ulr0 "8sv2eJ0e"0v0dj0 N`1>2-#0LQ&J�S%lJmUx	U1K$�]	Na�YB_@%6;pJ1qJO�7!(`1#G[�V<BH,"
    �F$"[(B!O$OC�U%(^A_S_WU�(U_O_U<6O��rMlNc#1Q(�GU
    ?M1,PRaP�!bFAIOq.dx<?Fz^ H!aT_3p1CQvQv
    *Qv[(e.d!w	v3EtB!#"~q%[~Hh�}gAu'NTQccP$"JJ^"!(Ұ
    ?��FZsQVr�dsQ6#JMns Q^#rM#NqBc"Dԁ^%ZV8�""rJ�6evoooooooKCbGXܫ,Wx�tץO�ө1gy6�:L^px
    �AW
    9K�必ɵǿ�;M6]
    .@�RdvψƮuVϒv ߣ�Vhxߛ!�"UHPuD�"
    #	%>h-(JTPE=M0M��UF@ �@FjZ?QM�NtQ�`b��A�7�@tA�W�
    >tJNu`fpup1fU
    N	iJNUr$�`?C�o�p�y�r�i�g\�wt� h�c�)5 W2�0A 35 M- ]c+ o�s% f3"R$!r' `!a3 i% n�.5  �A�Ul{  +(s"eS e+ v ds RN`!2 LI�SR#0zGz?H)@Q'lJA$JUp5
    UI	h!1%�	Na2a�/pC1�='<Fx<�p�2%ޮ4�_(>:4�Nv ??35QC?U?g?y????:DNt?X#D<NM�U71ErOOOOOOO:E_WZI*Z"J<OO@�HD:�
    $	T=h4>T]]9	tA��UF@ ?FjZ?@i
    nPh?@߾3?Pt�` ?A��@�t�
    *uL'bd�p&�-QYDV._>uju&zb��U
    	J^0zGz?I@L%"+%+@#�G@# 9 N$(	?A�i+4@#/3?M?\._?*�RN <62<<7%"b4+%@#d14*� `?C�o�p�y�r�i�gT�}t(�c�)W2�04@3M @]c@o�s@f&BRAr@SAa&@i@n�. �A�Uln@ HsrBeF@e@v@df@, `12`$@@M="S_�@R."l>0>Uh�hE
    	A]$�	a-#AJa�U&U&44R x(nU_p_V�%^_YQU7�n^o_9kn__soVi[&,eEV+[@#7/'�2U=r<6AP{r6	7�@AL$~Rb�;A
    b�Azpv�%!$#+!45!%3<v2'MqM(@#/U3v0=sDVh@XB rNjAle7;Ib'<?!3[�1XJr<A>??;,i?�8%"1BFk0B!$h#�+%he�T @tn@eh 
    J@w^I	JQ*(;L].+@�eɟ?��?b�KSzE,ZAe�ܞ?!1vT{�<2B1�>�}�8��H?��u�+�_���y(����KH �Fl[���#SD��B�
    TTD4��xaԠ@o�@��To�]aG~d[
     b�P܂^O&��O$[(z��;^?-��n,^:0Z'UFDf�P
    h,�TPYYB)��U?Y,b'@?#H$ @Fx<?F
    BP(?4|	P?7� �
    b�3b��`
    �NNN
    NNNNY'l鷅U  1@&t3�b ;D!)&Q#JX,X,X'3; R"
    X,X'BFL&_d2?-(\.	8.sU/1-6O?&:ȍH=4??6?	�V2(Z% 	0`<t�r�i�a�n�gO�l�e\�Ms\�n�o)@&Ab?@xR'Bi)@$Cc@pOBo@,B>CaaHc?@m@e@t%e^	(A>#UYGT6 ��qp��'9K]D�z~@�OO�O�������OD�3
    ��8	'H�yDD�r�a�g� �t�h�uesa�pWo�nodw�i�pe�.umt)�clO�yiK�zdf)�te�x:T	8������b@ @\.�Gz�?TW~@Y?j6ks4
    ;UGD�
    #	h>4�T6D
    ����U@?j6@@ks@F@ @F\.?FP}	�r�u֌�` u|�$?v��	�P\�`|uE	]
    ]`]]�
    
    (?
    ƕL\��X�x$|$!)�$<!)L!)\!)l!)-b56	1U2L!L�K�@23I1�D;-`V�i�s�_�S�E�.�}cP�m�!�#\�9�2�5:@0`?C�o�_p�y�r"@gP�wt�  c�)_@W2�0k@3_@M"@ucU@o$@o�f]BRNArQ@Aa]@iO@un,@ _@A�l@U UHsBe$@eU@%v@d,@4`C4L!0 	G?%f3!88@L&d2?c]tX҆Xd^sUQV3_6 d<5UeL!H^0L!C	@!<!2�U	)a~g5d�k5d!kEd�kUdkKUd�<!kd%e~gEd�\!k,Udl!kh�khk|edgnUdXada&7�TPTa!!28T9%DO81C}RBi�&�z@ ]@o_@f"@^Atһ@x]@0fv�yn5p`
    SwBܔA/A.�X<@��Ӏ~0�Y365p@Yd*<N`8⪓Fx<ޞ	�14sba�GBA1!	t7C2`MO@Aͅ/Aa@gʂf@AuB ‚ɁB2"	}e%"TԖr&2dXa%a(,]]T`�Ԕ?@%"@%&_UbrΗb-SRt!]Xa@{bIrg>uz`Q\!0b�q]o=It77�R̿�۹}KBK&}Ǹ25!S0"Tû#Rٍp}%��Y@rX@?Q�22A'B11	8Iӗ�'T`{|ώ7�6ob#6+R#"7cva
    P{b`272626B62#B6B6R6�TR7R6R6b6�b7Jb6b6`@#B 5ね;KE<%?
    _b�	h$�B22EAA(�tQ"Rp5ح՘U&@Ҹ2BXTW`΄J8uHD:�
    #	;ih,>T!9
    A��UF@ ?F\.?@QZt`b�A��@t� ?#9>uX�5nxu9#Ub
    	UJU5
    �L
    BG#'�(�IOy�?]&P?A�Kb<#a @#;#SR
    *-##I!$5J`?C�o�p�y�r�i�gT�}t8(�c�)8W2�0:038M&0]c$0o�s0f,2R1r 0Y1a,0i0n�.8 �A�Ult0 $8sx2eL0e$0v0dl0`1l>n0>Uhhnn1$�]	a�BE	@J1DF�~[�XBjAh2
    �hFMB@0>DNO?lOhCE%NOO2W�EEEF_`O@_Eb2>O;�rAS HD:�
    #	;ih(>T9
    ZA��UF@ ?F\.?oF��@v??Q"t`p%�A��@tH� ?2Glw>uf�|uG#b
    	jJU5
    �SLB<#T @Y#;�~b�S8;#J#!$5X`?C�o�p�y�r�i�gT�tF(�c�)F2�0 3FM c o�s f"!r 	1a i n�.F �A�l$0 (s(2e e v:0d0 `J1l*>0>Uhh�e1e1!$�	a+�250JT16�Q0BAv�|
    k):FMB@4??OCTE�dN}OOGTEdE@6OOOTE52?;�rA�Ss HD:�
    #	;ih(>T9
    JA��UFx<?F}>?"Qhp%�A��@u`b��" ?2$u�`b1,!tb?Ql>$#/
    	/JGU'�(�(Iy�I?'&Ps?A�b(B<
    #n @s#;L#f\t+S
    #!$5q`?C�o�p�y�r�i�gT�t~(�c�)~2�003~M c. o�s f"!r #1a i n�.~ �A�l>0 (sB2e0eJ vT0d60`d1l>p�UhH~!
    #@�	Wa�250BJn1�*0Ba ?�
    k)PFMB@DqOF!2K�G@jEzE9O0MGjE2OE�rAIS HD�
    #=h4>TB]]9	A��UF@ ?@9*?@*IQ6u�`b�A��@"tp%�+t� ?5u7`PuF`u.	#�Ax~M
    #u>F�.3b*&	 J-U0zGz?@L2"8%7M#5
    �#LGM#"�#��Iy�[$(P?A�v+B&C?|W `bd�L @2$x9��]?n""*M#AD5`?C�o�p�y�r�i�gT�tE(�c�)E2�0@3EM@c@oK�s@fBAr@Aa@i@n�.E �A�l@ HsRe@e@vRPd@9 `#QR2M#IP@M="F=S17#l>
    0>Uhh :U
    	A$U@RUPJb!@1b&�>�*b35h(eV6 o7?>oPk%fn_5oo�gVeEno2ooVe@oxo8oi(Phe(b*T@t@eu HDB
    
    #=h4>TB]]9	EA��UF@ ?Fv5?FTn?@!拮Q6u�` ?A��@th7p%�b
    �ku`@)	*@	�u`buޔ�`b�tA�`g�t.E
    f>#�$3b.*<&	< J=U0O贁NkM?	@L~T"b	�u&]"fo#27q ?/&?\.+?43T"Z%đ@?1&>quLdU�@&Fb-h�2�<  P<&-1B'"E+o#1B@G72Bo#AD5`?C�o�p�y�r�i�gT�t)(�c�))2�0P3)M@c.@o�s@fBAr@ Qa@i@n�.) �A�l;P Hs?RePeJ@vQPd3P[ I`aQ2o#P@M3BM!Sh@]"Ul>,>Uh@E
    mEAUf�aba�&c-`J6o#F?�7C�Q#4]"(9JdNY>�7@yo48n$g9od"�&fmEa9#P3(bD@u�b;PeR0c;PQk)t@qy@e)
    1Po@RQ4SSrTQqcJB"pi@q"s\Qqqhr,Qs.
    �jAl emE9	Yb!xyD$l��!30[ C!w
    ?4$BZ%i$6UyD
    '�$ 6	
    V"R]"HD:�
    #	;ih(>T9
    JA��UFx<?F@ ?"Qhp%�A��@u`b��" ?2$u�`b1,Qtb?Gnl>$#S/
    U	/JGU'�(�(Iy�?'&P?A�b(*B<
    #n @s#;L#fe\t+SS
    #I!$5q`?C�o�p�y�r�i�gT�}t>(�c�)>W2�003>M ]c o�s f"R!r #1a i n�.> �A�Ul>0 (sB2e0e vT0d60'�`d1l>.p�Uh ~!
    #@�]	a�25	0Jn1�*?j0Ba ?�
    kPFMB@DqOF!2KG@jEzE9 O0MGjE2OEF�rAIS� HD:�
    #	;ih(>T9
    JA��UFx<?FbX?"Qhp%�A��@u`b��" ?2$u�`b1,tb?@Hl>*$#/
    	/JGU'�(�(Iy'�?'&P?A�bU(B<
    #n X@s#;L#f\t+S
    #!$5q`?C�o�p�y�r�i�gT�t>(�c�)>2�003>M c o�s f"!r #1a i n�.> �A�l>0 (sB2e*0e vT0d60%`d1l>.p�Uh ~!
    #@�]	a�25	0Jn1�*?j0Ba ?�
    kPFMB@DqOF!2KG@jEzE9 O0MGjE2OEF�rAIS� HD:�
    #	;ih(>T9
    JA��UFx<?F$D"?"Qhp%�A��@u`b��" ?2$u�`b1,tb?@Hl
    >*$#/
    	/JGU'�(�(Iy'�?'&P?A�bU(B<
    #n X@s#;L#f\t+S
    #!$5q`?C�o�p�y�r�i�gT�t>(�c�)>2�003>M c o�s f"!r #1a i n�.> �A�l>0 (sB2e*0e vT0d60%`d1l>.p�Uh ~!
    #@�]	a�25	0Jn1�*?j0Ba ?�
    kPFMB@DqOF!2KG@jEzE9 O0MGjE2OEF�rAIS� HD:�
    #	;ih(>T9
    JA��UFx<?F2L&?"Qhp%�A��@u`b��" ?2$u�`b1,tb?@Hl>*$#/
    	/JGU'�(�(Iy'�?'&P?A�bU(B<
    #n X@s#;L#f\t+S
    #!$5q`?C�o�p�y�r�i�gT�t>(�c�)>2�003>M c o�s f"!r #1a i n�.> �A�l>0 (sB2e*0e vT0d60%`d1l>.p�Uh ~!
    #@�]	a�25	0Jn1�*?j0Ba ?�
    kPFMB@DqOF!2KG@jEzE9 O0MGjE2OEF�rAIS� HD:�
    #	;ih(>T9
    A��UF"H$�@Fx<?QQ9@hp%�A��@ju_`b��,it+ ?u�`b1"HZ]afl#A$
    	/JGU'�(�(Iy'�?%&P?A�bU(B<#l X@q#;J#pf?S#!$5{`?C�o�p�y�r�i�gT�tG(�c�)G2�003GM c. o�s f"!r !1a i n�.G �A�l<0 (s@2e0eJ vR0d40`b1l>9�UhH~!#@�	Wa�250BJl1�*0Bk ?�#
    k)NFMB@DqOD!0K�E@hExE9O.MGhE2OE#S�rAARGS� HD:�
    #	;ih(>T9
    A��UF"H$�@FjZ?Fx<Q9@hp%�A��@u`bW��,t+ ?vu�`b1"HP.allAJ$
    U	/JGU'�(�(Iy�?%&P?A�b(*B<#l @q#;J#pf?ST#ҿ!$5{`?C�o�p�y�_r�i�gT�tG(�c�)G2�U003GM c o�s f"!r !1a i n�}.G �A�l<0U (s@2e0e vR0d40`b1l>9�Uh~!#@�	a+�250Jl1C�*H0Bk ?hk
    kNFJMB@DqQOC"0KE@�hExE9O.MGhE2OE#�)rAARGS �HD:�
    #	;ih(>T9
    A��UF"H$�@F\.?Fx<Q9@hp%�A��@u`bW��,t+ ?vu�`b15"H@Q]anl>$
    	/JGU'�(�(Iy'�?%&P?A�bU(B<#l X@q#;J#pf?S#!$5{`?C�o�p�y�r�i�gT�tG(�c�)G2�003GM c. o�s f"!r !1a i n�.G �A�l<0 (s@2e0eJ vR0d40`b1l>9�UhH~!#@�	Wa�250BJl1�*H0Bk ?�
    k)NFMB@DEqOC"0KE@hExE9O.MGhE2OE#�rAAR�GS _��H�+�H �lҮ
    ����9E!'F[5���#]7��B�
    CUߌ8��qaW@o�@��T9��RaG$7^S�lP^?��OĈ^IB�^D��^:�<^vJ��,�^N��̍^*Q^S�Vl^X��{L�[��,^]��OUFDf�P
    h,�TPYYBU?Y,b'@?#H$ @Fx<?F
    BP(?|	P?7� �
    b�3b��Y'�GMש c @3�b 2;G3(;9 
    BFL&d2?-(\.,(.sU!&L/:ȍ2H?$?66?	�`28w( 	0`Cc�o�n�t�e�m�p�+�E�4�1�5\�;o�r�a0y\�n\01,�b0x\�Wt�i0l2c0p21,0n4aH1m0e2c$e^	)UYG& ��U��'9?@�?
    �piwwv�|r		?�_��O��u���D�r�a�g� �t�h�uesa�pWo�nodw�i�pe�.umt)�clO�yiK�zdf)�te�x:T	8������bjZ濰??ֿwd0	v?�:F?HF1Q׿Y,b#H$4F
    "=
    UG	D�
    #	h4^�TYY��U@Y,b@@#H$@FjZu??P}	�r�u�` n?u�J$��P	`�Y	\�
    }(�L�/g$)\+$b%&	!҉U"L��@"Ԓ#!$+-`V�i�s�_�S�E�.�cP�m�!�#\�9�2�5�8~!`?C�o�p�y�r0gP�t� c�])O02�0[03O0M0cE0o0o�IfM2>1rA0z1aM0i?0n0 O0A�Ul0 E8s2e0eE0v0d0$	3$!  	M'?%#	*11(@L&d2?SMdH\.˳vHTNsUA F3O&dH,%5e,^;E	E,"�UHXQ�%dTYo[%dT	o[�5dTo[EdToWgYdaoz\11�T%Hd"&Ud"'bd2!԰!(AcFx<?!M0%
    X
    Ycbb
    ,D!EKaQc;E�w�r	{e%Ac%dB	TbZvff^sKsea�=%?
    u_b�	h{
    b�u#v595|btQ"tRr!NsXa`as:u&@r"d%aM,%H�C%[Crb}�B%&%d?-@@%^Ίscb�1NswL	svt!Òl@酀>  v rpß՟= qt779p"K�"p	ok,o��AAc"(%lF?�!4�72HA!rssa)C"`)M?01 M0oO01a0gf01u:2 0i�z024Cfr!cnЯ(Ac)h4/Z(1
    3R2iW`汼f0N1t0xvbfv�^%`
    Sg211'.�X,0;~ ͭ�Y#
    &%jVhaPE	{G6!30D4$03J2~MJqEr!a�}/No0'HD:�
    )#h	<>T$]]9	JB|A��UFjZ?Q6t�`~A��@ctM�3�] ?,#Au`�#u$Ab
    Z	.J&AR>&A�>#U0zGz?@4F&�)+P#J&'*MJKP# s';!S3�\P#2q50?4?F6G#?\.?Ae.R7/[�3^$E$I=P#'�(�Iy�Q366PW4� @~>3?@Ie@?IFdF�vbJRHuAڭD&uLAd�pA�@*	O@-F""" ">RRIF7BP#AQ17;R`?C�o�p�y�r�i�gT�}t@(�c�)@W2�0P3@MP]cPo�sPfRRQrPQaPiPun  @A�lPU XsbePePv`d"`1d#e%59	,�P#Fx<?e&Af1`#e@?@3�`r>R�s>!
    b�j0@r%Cb�)S6IWI@CAoob8yej~(helJ0>Uh}57Q4\P  D(EpEK9CZ\Z_�~(:�~d9BCoM6O%5�JN^5EWi�̏P%	TAqq>"D(2d?&�DRw�sBt2i>oPoX7'�0\E!4qw;	k8ޟ=5#T
    �HD:�
    #	=h8>T ]]9	z<A��U@FjZ??FQ6u�`b�A��@0tZt�`C$,A>{q{&uDL
    	J#U0zGz?xč7#5
    ~L{p^#(�"Iy�$(P?A�j&�u#0@3;�bM�h".aSK%l@~2?t7�
    N)ud `bd�-B1>2
    #.6"x'F08"l�B\#/OM?\.+?l�Q!N,#IAD5W`?C�o�p�y�r�i�gT�}tk�(�c�)k�W2�05P3k�M!P]cPo�sPf'RRQrPTQa'PiPn�.k� �A�UloP XssReGPePvPdgPR`Ql>0>UhhEQ7QlI!%4	VWa�JB#Fx<οR�p%�O7l:(_?>mb3l#?ko}k%GmBc! oa2_il`e1%I;mgUo�gc-R6:oLo^ooj:(he(e�
    PA@#e1%9	6a	llMi�P8HD:�
    #	Uh	<>T$]]9	QJBTA��UFjZ?QZ6t�`A��@tM� .?,#=7@u`F�u$A\#b
    	J,A>eA�>-U0z_Gz?X@#b	�%+(#BMJa� @%=P#8US2@Z"z(#2q0??6?\.?A24P#E6l3s<%s<s7%7l/[�3*4\>G(#'�(��Iy�366PQ?A�Q$4@3?@I@?pFF�vJRHuADuLAd�.!	E' D"eBm1eBEpFB(#Q17;R`?C�o�p�y�r�i�gT�t@(�c�])@2�0P3@uMPcPo�sPIfRQrPQaPiPn�.@ �WA�l
    ` XsbUePePv `d`J`1db%9	)(#FOx<?=&A91Ce@?	P2`=reB�>!
    b�j=r%�b�iDVWIC AoobEy	u!jKo]o!o$)O6!3r05�!4P6K?O$5l(>Uhm1yP	Q4\UPŅŀB(DpGcK@OCypW�`(RplK9CG8M:d9BCrgheDa'�qq"(#Td?)wDA
    EsptZ"iUo$'r5%r"O6	&m2Z"!ko+e�
    �UHD��
    #	hz8�T YY:��E<��U@FjZ?@?[?FQ}u�`mb�A�rA*�$	G^X+�t�`Zuh�`UG[�#ul�
    	J#U0zGz??FwM�7#xUL!QFU=#"��7Iy$�?&-P?\#2q ?/&?\._?h�	!~ќ="Ix<?@h?FS]6�]6<"fp%�h?B+U*%u` `bd�2&3-0({A&J.9F*B#ADH+f`?C�o�p�y�r�i�gP�tg�(�c�)g�2�0@3g�M@c@oK�s@fBAr@
    Qa@i@n�.g� �A�l(P Hs,Re�Pe@vR>Pd P`NQR2#tP,&^�tpS9A#�CAida_j6((__(^uT@t(Pe�
    JP^%	|Ye#f4?h@ho�|9b�4@#�`2>0a
    b�j @8K3�*w7kK8_otHD�
    ##=ih,>T!9	3#��U@FjZ?@۪1?@~?Xk[?uP>.[
    >>mu�`b�A�$&u3�`bu3u..nu |15&tf5J7U5
    WL7Hp6	@�*u`bd�p&�-DJ 5k!,�$&�,e�%{1@@J^j6H0L:rt-FS!{115`?C�o�p�y�r�i�gT�t� �(�c�)02�0030M0c0oK�s0f21r0Aa0i0n�.0 @0l@ 8s!Be0e0v3@dV@��l>0>UhhE~13\1��J*9'W!B#H
    (E2&OG?O[3�^;%0_B_WUN�_O_UO)__M_
    (bD0ul3@-0lJ2k0t0ay0e0
    @o04ACQSb6Aac2"x`	i0a"c>AaahbAc.iF��bzMI	JXw'�o0qhp?!TWA5	.v3j"FJov!3 wv��@1}yozva?�?a2`BCEkZFJJ0_F��H'�����qCs*����gADzd[aw���#?]cV�B�
    U1d��qa@o�@�}+4To�\aG^?e��P$^j��j�^Eo��4^r��^}w��hT^z��UFDf�P
    h$�TYYU?~@ǿx<?F
    BP(?E	P?C� �Zȅ2H?Se?C| 	0O`"l�i�n�e�,�cs�oc�tWo�rrub�a�sc$o^
    6%f2�:Y�`	C.M`"
    /"e:/L/J
    IiV(/?XE_'�0U2-!0ED� ��^���� � �-}|5p`I`V�?}`xa�833��ސ���]���3σ3��u����33?,	�?Gxpx�^��&�
    �D�r�a�g� �o�n�ut h�e]pe�,nqdd�sb�l�u	x� < ;�hRp	�<(e#�w �i7i�cUtecn	�c]i)�.lu
    e��b\.[?D?�HD
    #	=h	<>T$]]9		#FA��U@bX?\.uP6
    u
    ��`ub�A��@Wu
    ):/*PAh@�u	�` ?hjt~u�JKaJU
    @)-?nDxK'$nU-t'(�2rq?@I ?$v%?
    @�	j
    2*ALA- b�r@	]�l
    2m<2u. 
    228F
    2u9h�LH/MR#AD5/`V�i�s�_�S�b�a�.�cT�m�!�#�4�5�7�6�8%`?C�o�p�yL0i�gT�t� �(G@)x@2�0@3x@M9@cL0o;@o�fvBgArj@Aav@ih@nE@ x@A�l@ nHsBe*;@eL0v@dE@\@bBF0	l	C	G?9K#CG�03A0E+4z'e8
    &g_K8	p@?l�Uh�5	_AY�J48$Ie�14AbC�2$4hb(Be[kT ljaiAeE9	]UjTg'�2"qV!TQQ!E	m&pO2ĄWB81e�@2ghekJTAt	(81ap&@DQRHu��K���g$R}���
    �l_JFD[H�����#]΀w��7O�B�
    YD��do�@{�+T1sDVo�PUFDf�P
    h>$/�T6D
    U8��UF~@x<?F
    BP(?3P?x� �*+1:
    b�jb��::.Z*(	$!HU?&?V2"d: 	07`b�o�x�,�r�e�c�t�a�n�g�l ,�b s�i ,+�3e!^
    %k+�UGi//XO''�0Uy2!0u ��H��B�,23�?wO�P\nВWD�r�a�g� �o�n�ut h�e]pe�,ndy	�l9�o�w!imda#�j�u�	s"e
    �XNUoittE�.v	�rclf9�i
    �sBQc�tfpsc������UGDF�
    P#	h>8/�T 6D
    UUň��UFU*JR@F~?FM&d2?F\.?Q�U�[u�`h7?u�*�
    bZ	bYzzA	u^tvz
    /'"M"M"M"%\lU"/L��@"!"/%\
    b)#1	4+`?C�o�p�y�_r�i�gP�tg�(�c�)g�2�U0G03g�M30c10o�s+0f92*1r-0f1a90i+0n�}.g� �A�l0U 18s2eY0e10v0dy0Y/`V30s�_�S�bo0.?0h�m�!�#�4�5K�704X$!) ��Iy�3i?8FP?�lA%��-/3	78F& ~O&~
    �e$^=%%,\�U	H5Q�%ATL[%ATLWpda_'UT(T"(TFx<gf�1�\+bZ;fl#�t `r1�2tV[dcg�Sjk&Cw"`A0j�uY0:1D0p90hg�aw0dg�P2sB-0e?0r11}$dB^	MACohmh]C{�rQ	�^BsRbtF�rv/"cRq,^E%Y\DUt@YA2	  �&$1<0`%t`CWY�k�|b%��Z`rCl%ÎXޏ y 9@@M_qg _$yYS@11"!!"(b�Th?'rW`�]btR[d�ts"á%s&ե&@ߢ"B�a�|!ml'M7HD
    #	;hj4>T]]9	B%A��UFM&d2?F\.?Q6#�t` ?M�t�
    ]b�2 Cu\Su!b��A��@
    2	A�J#U0O迴Nk?=@L�B1!6$5`?C�o�p�y�r�i�gT�t(�c�)2�0t 3M` c^ o�sX ff"W!rZ !af iX n�. �A�l  ^(s"e* e^ v d %`2 @&>SI$k�L��I/y�>#?6MP?A�-=#	E='6A42l>
    0>Uhh@=	d5O!4w�	a�lBrEr@JTFF��HbxF
    BBM�Ba�OADM�E%^_IDE�45UF^_O[d5$ڞO3�rA
    �5c"HD
    #	;hj4>T]]9	TB_A��UFM&d2?F_x<[??Q6t�` ?;rb��
    t
     A[��@u�`AEb_� ӀEOuu.x�(O 
    2	(AMJ#U0O贁Nk?<@L�<+#k @p#;�dZ�SyQ*B+#!$5`?C�o�p�y�r�i�gT�t(�c�)2�003M c oK�s f"!r  1a i n�. �A�l;0 (s?2e0e vRQ0d30`ii �L+# �!�Iy�#9#9PI?A�-+##	'H6Ax2l>0>Uhh=	5!D�	a�BET@JZ+#F��F"
    R
    &ReY(/D�R�rA
    "@QEIDt:N?Fs�hW �!GR
    M@Qx52DX �SrU~Y5UOezRgzYdAlePx59	O&]U5o?�pHx5awP$V)wR#b�RHD
    #	;hj4>T]]9	TB_A��UFx<F\.ߗ???Q6;r�b��
    t�`A[��@u�`A6+t} ?M+5Ab�ƑuJuBJd�5
    	Y]AJ#U0O贁Nk?<@L�<+#pk @p#;�i}:Se7B+#!$5<`?C�o�p�yi�gT�tI(�c�)I2�003IM coK�s f"!r  1a i n�.I �A�l;0 (s?2e0evRQ0d30`Ui J�L+# �!�Iy�#9#9PI?A�-+##	'H6Ax2l>0>Uhh=	5!D�	a�BET@J]+#F.��F-:\i
    \
    B%VMY(@!�9G\HASE/P]3{�r
    �jR"CQx58MA? WAQWUV52OElTbPd�Alex59	O&P[F5Io?�px5	wP$V)wR4RR4RlcbN&d2鿸\.?L?jHKMD?XiB?Ƚ7U*JR~{T5=_��H��0ׄ���5A��Y@
    	F[���#CX}��RB�
    ,]]�a@q��@�Gܞ^u��<^?)��^��h$^K��f+T��b�aUFDf�P
    h>$/�T6D
    UUF~@x<?F
    BP(?43P?� �J+1:{
    b�j/b��::I!H??҉~ 	0Q`#r�e�c�t�a�n�g�lK ,�b�o�ux[ sP�a�d_ wc,ek \!ae iHM |e^
    %k�Ui//X''�0US2!0u ���E�G�+?>�M�߄SYk}
    �hD�r�a�_g� �tesa�po�nodw�i�pe�.d�w9D������HD"
    #	B=h50>ThP]]9	E)A��U@~?FM&d2?F\.?]P6	�u�` ?u�&
    Wb��GNN	N8AvV�pvMJGU��?Iy�@�a?&	?A�Hb�d5
    �_L��@="J!$5`?C�o�p�y�r�i�gT�t� �_(�c�) 2`�W0�3 M c o�s f"!rԲ !a i n�}.  �A�l0U (s
    2e e v0d O/`V s�_�S�b . h�m�!�#�4�5K�7S03,1g��-O/#	'Q&A	B&p?L7
    l>]U�hz!f"S W�	Ba<#JTFiF�"N8F
    BMBC(4cDsOAO�="Az%NOIA�EEjF)_OM[E2cO;BrA
    �RSR="qD,bPEO\J@[d1"�f S'C'2eM�Fi[mboth'bFN2eF%RCon�0okf"Cfz%dfRm4wGyHA0��dg9g{wf ?CbvBw(e�P[@nT[g1ex'BTAN!N#C(ST'&@oa2bL&d2鿸\.?P?hHKMD?\iB?Ƚ7~645DH'��6���Dp=#����4�GJˣF[ݘ��n�����tHPK��OB�
    #V]�d̥W@]�@^]�P+<To��VaUFDf�P
    h,�TPYYBUF"H$ @FY,b'@Fx<?F
    BP(?|	P?7� �
    b�3b��uY'�X^ c @XW
    $'BFL&_d2?^-o(\.ҁ(_.sU!&/&:ȍH$?/6?	�82!R% 	0`Hb�o�r�d�e0,�t�i0l0,�1x\�f0a�m27b0o�c�k2e0t\�n01,�s01bT01c0p2o0,0a0e0AeK�g0n0;$e^	,3�UYG&O ��Ad����!3Eo��W�?�/y�}
    
    �[-oD�r�a�g� �o�n�ut h�eqp
    �a�d� �s�ml/�,r	�s�iK�zb/�
    bur�e �w=�T$t	�x /�Be/�.8e{������b\.?฽Y?#|>U*JR47T=UGD"�
     #		h4^�TYYU@|>@@U*JR@@\.o?P}	uz�`3?Su�V22Y<L^Yd
    �.*.88L�L��@Ա-`V�i�s�_�S�E}cP�m�!�#\�9�2\�2`?C�o�p�y�r gP�t� �(* )[ 2�0g 3[ M cQ oN  o�fY"J!rM !aY iK n} [ A�l  Q(s"e  eQ v d}#l? "	'?3-8Bd(
    5P8@L&d2%?=ɟ8ұ8>sU16?_8e#a(=J
    I
    H XAdDYoGd@ha5	Hf?@3O3�tYb�gdaN_+T'T&T	9|S3;?�.Q�!SQtRTQjԺ_PKrQ�=3?
    %e_b�	h
    ,Q�d%eSL"QELd
    g&@RB8Qa�l,klFᏊ\tHD�
     #	=h,>TBE>NA��U@\.?@|oh�@@
    ںQ6
    t�`b�?A��@63?
    t�R6/6r�^Ҕ	
    u4 u7m>b�I�J=U)��Iy#��?/&P?M#l!q$51`?C�o�p�y]i�gT�t(�c�])2�0 3uM c]o�s If"!r !a i n�. �WA�l  (s"Ue e]v d /��`1酉##0z߮Gz/#@2#o0@M=3�Sul>8>U�h3319	�D!	l22J1�QC�=B3?6
    �RoFMZ(9#MfQ H=OOA^�"#8T#DE)G'ITQ ]WD6h^^�"AE9BC^^EEZ#DFWIt!f@L,_>[.B�]3O[SOeAE5h4)OVA
    0DbB3Z(`d
    0Ab9	w9M~3þ?3&3xB@1Q(-DT!?b�$
    CLjF
    ~B
    2rssr1}CwsHD:�
     #	=h8>TA3[]9	EEA��U@\.?@f�Q6
    5֍t�`uL
    -��@!	'A'
    3?3Ft�3cuH�u_Wb�Q&b�p�.0jdDAE)5
    
    
    #
    $"IbeQ"W&X3J#U0zGz?<@: =#)��IyM#��#)PK?$#I)1.45Y`?C�o�p�y�r�i�gT�}tk�(�c�)k�W2�0l03k�MX0]cV0o�sP0f^2RO1rR01a^0iP0n�.k� �A�Ul0 V8s2e~0eV0v0d0��K`1
    2#0@M=�
    SH09#+#
    A2'2B
    E�XsXĎm�sU�g9O#�XD.&LR"o/ҁ$\#2qP?_VM??#�D48:@l>0>UhhE�		G18A#�J19qH11P?b$S3KS"'�LR'"M(!}oHaoa8VndFF'IȏT@_L_rS!C_Q(-DT!;?- @)sa%6nd|Ch�Ge
    _jz+uTtoTxQ"�rA
    0Q"�v�X0'herJ8bTX0t0e %h׏k)HƏ _��Hu������"g^���&Lu1F~Ĥ[b�#]b��B�
    TM]�}a@_@�+ϩTc�BB�Gy^�P^��p^?7��ܩUFDf�P
    h,�TPYYBU?Y,b'@?#H$ @Fx<?F
    BP(?|	P?7� �
    b�3b��Y'�GMש c @3�b 2;G3(;9 
    BFL&d2?-(\.,(.sU!&L/:ȍ2H?$?66?	�`28w( 	0`Bc�l�a�s0i�Uc\�t0t0e\�b0o0k2e�x01o0,�f�r0m279c:0p2o�n\�1ub0l!Be�g0n�db%e ^	UYG&u �� <>w???
    
    ���(��
    ��:��>�B��{Mh���8��3<�(�i�D�r�a�g� �t�h�uesa�pWo�nodw�i�peS�.
    ai%l?n!� a8I DsNcGB VNr5s)�z7������b@ jZ[??Y,bw4>=vUG
    D�
    #	h8^�T YYy��U@Y,b@@>=v@F@ �@FjoZ??w?P}	�f^�( *�+J�V(�2JJ�։u�`h?u�b	
    ]r##�‰UK/
    ����)!UFkJh�񄄉E#<"JL��@3"E#14[;-`V�i�s�_�S�E�.�cP�m�!�#�4�9�_2�5�1"`?C�o�p�Wy�r0gP�tg�u(0)g�2�00U3g�M0c0o0o�11r0Aa0i0n0 g�A�l9@ 8s=Be*0e0vO@d0A43Z4J 	7?h�|	]U8@L&d2?MX\.˳XNsU@Q >V3`_c6dHX<;%Ee^kE	5L5I8�UHgYda#ozET$Xd<"%edL2&rd2'dkBT1T1Ŵ9(IQch1�Rh�r[a�.ct5aL52QcFx<?c"F�cp	�b�f5jt]"s5s6vw&fKca{�h?
    ub�	Q
    b�J
    ufkE9R||uab�tQ tR(?wL"f&@
    <"m oL5@mQc*[j9(Qc1El9�	`�@�x[ask�C`C9@a0s	B_`TP�e0Q_"`*;Bn0;"Er0;ʾ0lO@g'@`;�N0bp'@dYRO@t
    Bp3"d�haM<%e:t?,h1@hf-uhaq�^A"x"(rk{}t!r(s9>t0vz0p=&t0' t$ӭĥ' ,#7#<%E*d('o]B�b[�rۣc	t0ۥr[bp#twsp�l~pp<"%9(	z
    FY�14I#At15r$5r" aC"`SM0XA 0og�1~gfO@(Au
    MB %zO@^BwBC~ƕ3"nV*(<N`ȩ9(Qc9@h	5=c610&&'f01bx0�v�}2`
    SB(A1.�Xr~t0<M�YaJBڳa�OHaAj˯HD:�
    $	T=h4>T]]9	tA��UF@ ?FjZ?@i
    nPh?@߾3?Pt�` ?A��@�t�
    *uL'bd�p&�-QYDV._>uju&zb��U
    	J^0zGz?I@L%"+%+@#�o 9 N$(	?A�n!4@#/8?M?\.?J*�N A6*2<<7%"Wb4+%%@#14*� `?C�o�p�y�r�i�gT�t(�c�)2�09@3M%@c#@o�s@f+BAr@XAa+@i@n�. �A�ls@ #HswBeK@e#@v@dk@, `12$@@M="SH_�3l>0>UhhE
    	tA$�	a-#Ja�U&U&44Rx(sU_p�_V%^_YQ�U7s^o_>ks__xoVi[&,eE(V+"[@#'�2UBrՠA6QU{w6	77�@AL$Rb�;A
    b�Azpv�%!b$#+!45!%"3Av2'MqM@#4z0BsI[m@X: r�~G."jAle7;I'A?!m3`�10]Ow<F>??;i?=%"1BBFk5GT&$h#�+%he�T%@ts@eh 
    O@xQ*(;L].+@�JΟ?�5�PSz5,ZAe�?!6vT{�<>7B1�>�}8��H?����_L���f~]m����!AN]7eF[ɭ���#M��B�
    ZDn��xa@o�@�+𬯪To�AaGg^+��6P�+=Oas^a���UFDf�P
    h,�TPYYB��UF"H$ @FY,b'@Fx<?F
    BP(?4|	P?w� �
    b��$YCw=CCf[]�Y'%�=U  @/0}3�b �32!?#\F'3b4$f!BFL&d2?-ɥ(\.Yҷ(.sU!&/:dH$?2?D6?	[�n2q(H% 	0W`&b�o�r�d�e0,0d�g0,�m�a0g�iS�n\�1u0d2y\�f0a01n0o0:eN��^	,#UYG6u ����	?؟ߍ~ߏ�.	*���w_��o��	��t���w^
    D�r�a�g� �o�n�ut h�eqp
    �a�d�-�s�i�z	�"br�eR.hn�l	�src6. �cYt	������bz^
    |>@@V% @@"H$Y,bD4
    ;UGDF�
    P#	h=4�T3
    YY��UF"H$@FY,b@Fz^@F|>%]
    @P}tS��`b�r7�wtTu�` n?5u�j@
    box	x6&�	���Y@	&r��^	�J)J)!J)rJ)6!J)G,	+vO$��$$&&$(!)-A<2�A)p2HN!*U27v�(5~��@=6=�7AO"G@M`	E�v�e�n�tr�o�p��JC!WL0Jԭ3AD;-`V�i�s�_�S�E�.�cP�m�!�#\�9�2�3v\=2`?CB]y@i�gP�tJ0u(@)J02�0.PU3J0M@cBs@If RQr@MQa@i@n@ J0A�UlhP XslRe@e@Ad@o񤀍C4!o2	MG?A3E	8:��8@L&d2?&m7h\.gIh'nsUoaAmfo6d<5UeYk}r�UH3q5?taJ{�E?tJ{U?t!J{�U?trJ{e?t6!J{?t!JwntqaPd0GrTq(e28Ѐ^UAAVO8Xrr6Ia&`H@d@ +�&DPo@tR@#`SP�o{�w�+8ȄDž02q%xxgt!p&!I��R^%2ȁȁB RՁՁR'۔	E8^Fx<?I"ŀh	�Gjr'B
    bC'&76R%Eaa3!�aahǧj;r6!]2U@M:dSqrՁ$æ�7'U0`A±KƒޑA?
    6b�	q#
    +�J!8ȥ	>r2Be9@nbƣ'V4QD	t
    BBE&s&@2,%cxAV3Tۏ텍A"4TXj8FC�A4a�=2LրAPA‹2! qC}`M@A @oJ0AaJ@gf@WQu|R @i�z@RǢT&BBxb`,,G7H|aHD:�
    #	;h(>T#P9
    RA��UFz^
    @FWj%@@Fx<?Qt`b�A��@p%�b	� 5?,t�H[?cuM)udb6
    	l[>�J7U0zGz?Fw�@	A�bU�B<#f @k#;5:#S	>@N"J#!$5^`?C�o�p�y�r�i�gT�tL(�c�)L2�0 3LM c o�s f"!r 1a i n�.L �A�l60 (s:2e0e vL0d.0`\1l>]�U#�"!v`%�	a2a�30J'!�q�y?B- )@B5Ou0+O�=JRN9mOMGBE?HOHHD:�
    ;h0>T@h]]9
    7A��UFz^@F|>%@F/g�xW<?Qt`A��@t� y_y?" ?p%�>unb�`urb
    	m>J#U0zGz?@L�eB5
    �'L
    ='�(�IyC�
    $(Pw?��
    < @#;�r}S
    &Z#J145`?C�o�p�y�r�i�gT�t� �(�c�)Q02`�0�3Q0MI0cG0oK�sA0fO2@1rC0|1aO0iA0n�.Q0 �A�l0 G8s2eo0eG0vR0d0`1l>]Uhz819$�	a�5B;E;@J1gF�mK�"{BH�K
    �FMB!qOG?�OCEd%NO_�UWE%EhF?_Oc_E2aO;�rAS HD:�
    ;h0>T@h]]9
    TA��UFz^@FNt%@F/g�xw<?
    ?Qt`A��@,tt� ?p}%� yy?" (]ub�U#ubwb
    	>J#U0z_Gz?@ZL�B#65
    �>L
    醑=#'�(�?Iy�t*$(P?��<#p @#;�MS
    =w##71<45`?C�o�p�y�r�i�gT�t(�c�)2`�0�3Mf0c.d0o�s^0fl2]1r`01al0i^0n�. �A�l0 d8s2e0eJd0v0d0I`1l>]UhzU1V$�	a�RBXEX@J1F� �BA�,
    �FMB1!O?OCE%N�
    __rWE%EF\_O_E2~O;#�rAc0�HD:�
    ;h0>T@h]]9
    AA��UFz^
    @@*I?@Fx<
    @FQt` ?A��@t�`b�"p%k�u,�u"b�)
    		>J#U0zGz?@L�B	#5
    �1IL=	#'�(�Iy�$(P;?��<	# @#;k�?S�d#J	#$1)45`?C�o�p�y�r�i�gT�t
    (�c�)
    2`�0�3
    MS0cQ0o�sK0fY2J1rM01aY0iK0n�.
     �A�l0 Q8s2ey0eQ0v0d80&�`1	l>]UhzB1-C$�ʏ0?BE@1X6^7J1�q�BH>BK
    �FMB`!�Os?O�CEn%N	__nW�E%EFX_O|_Eb2zO;�rAc HD�
    #	=h8>TB# ]]9	B��MA��UFz^@F\.e%@@i
    nPh?@*I?Qt�`A��@,t�p%�l?u?ul�O{ub�au rVb
    -	$A>JMJ-U0zGz?FwHL7#MLfB#?/&$W?l�A'L%4 ,"��Iy64/�P?A�K!	#??r*F `bd'M&. @1W1m.6mEaLr] 'T2#ADg+`?C�o�p�y�_r�i�gT�tk�(�c�)k�2�U0P3k�M@c@o�s@fRAr@1QaPi@n�}.k� �A�lLPU HsPRe$Pe@vbPdDP`TrQB2#P@M=�E
    S1L|3l>
    0>U##@
    Aa$w�	a�3b%9e9`J2!812&� GlCyb9ChU(0^e6oog?ok�%n5oo3we7�^noAe5^ooHoU(T
    �jA b7;Y!d$I?!3XQ�D!d4a*,=E#bBi,>ra'7'�2UB[,&	7VZK&!d'(;L].+@�vŏ?�n5�x"�Czz5Abn؏!�T{�<R1�>�}�wHD:�
    !!#	T=h	<>T$]]9	EB:A��UFz^@@@Я?@*?I?UQt�`ۀA�b:u&gu 4uob�Hu�I`#\##
    	#l]ARe��J#U0zGz?Fwh�L�7#ML)\#?/&M?\.W?D&2&4f "��Iy4/�PI?A�#jEH/2	~3C3R*hp6�3Y3??-f `bd�-�>ATC.'FT,i�H3YDY}k"
    z'k"Bc2#A~17;`?C�o�p�y�r�i�gT�t� �(�c�)2P2�U0>P32PM*Pc(Po�s"Pf0R!Qr$P]Qa0Pi"Pn�}.2P �A�lxPU (Xs|RePPe(PvPdpP�`{1B2#pP@2&>�k!KS'A6l>
    0>Uhh�5
    Q&@J"U\fP_be`2?J19LGDbeCh<(e�oE1ok%n5	�nwe7nXo|ec5o&P<(e�07a,Pe2P
    �j(he$iAb7(;YXl77_'�0U�&6H#D1a+	7BˊfxK'$@�Y%+zK8._"�zW5k8u$
    ,Ab0YUa@TQc4P08P��HDB
    !#	=hj8>T ]]9	RjA��UFx<?F\.e%@@�s?@JdS?@Q6p%�b	�A�,t�`
    l?uL^(bd�-�jRu(k.`u�`bC�~u'bT
    	>,$X�J#U0zGz??Fw�L�K:#5
    S@z�
    '
    "�\:#?/&M??l�L4SI"��IyS4/�P&?A�B?? L^py�!~uul�
    ''E:#AD5!`?C�o�p�y�r�i�gT�tk�(�c�)k�2�0P3k�MPc.Po�s@f
    RAr@7Qa
    Pi@n�.k� �A�lRP XsVRe*PeJPvhPdJPI`xQ2:#P@^&>�tSHAu3l>0>Uhh
    At$�	a�9b?e?`J190GlbIChh(de6uog?ok%noo�9we@5dn#oGe@Edoooh(bTPtRPe�
    �j(heHiAe@59	YXt'/'�0Uɂf63Q;	W_r��H'�09���!j	J�����=5@
    F[¼���#Sw��B�
    U]��}pa\@o�@�+CTo�SaG^$��PD^��w\^Y�<^��˻^��}���!�^��^��+�����������������t4�"H$ @Y,b'@dnBQ��
    AJ-D3�[7U#$U%&'(���������t4"H$ @Y,b'@[��C-4nB*7�
    AU%&'()���������t4"H$ @Y,b'@dES��C-$nB2*7�
    AU%&'(+���������t4"H$ @Y,b'@DS��C-nB*7�
    A�����,������������t4�"H$ @Y,b'@nB��
    A~-TmB8U(-.���������t4"H$ @Y,b'@/LT��}C-īYe7�
    A�����/������������t4�"H$ @Y,b'@DmB��
    AJ-$3�7U&'1��t4"H$ @Y,b'@0L_��C-|@%7�"AU$%U&'(2���������t4"H$ @Y,b'@[o��C-mB*7�
    AU"%&U'(567���������t4"H$ @Y,b'@[��C-mB*7�
    A�������������������������@���H`e��D���R�������������������@���F`��N���R�@���tG`<��N���R�@���G`��N���R�@���G`
    ��G���R�@���$F`o��M���R�@���D`��D���R�@���F`'��H���R�@���DE`��N���R�@���C`	��N���R�����H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(�������������������������E���I`=��
    ���R�������������������E���H`J��
    ���R�E���TH`W��
    ���R�E���\F`d��
    ���R�E���|E`q��
    ���R�E���E`~��
    ���R�E���E`��
    ���R�E���E`��
    ���R�E���D`��
    ���R�E���C`��
    ���R�����_z��(FT
    
    ܂V��ݞS�4OIBB!<V4��/"K�f`��*VVg~��SԄV]��S}o���Seo�.�l���Sܷ���SLVX��/?SWv�P�Dt�(�U	3������������������������������������������������������������������]��
    ����*?&d2@RT*$@W�g(�	"*0^p?4	��[�����	#�5GYk}D
    C�:�\�P�r�o�g�a�m� �F�i�l�We�s�M�c]s�f�t�OUfe�V�s�o�1"\"0�}3,\�B�A�K�G�R�_�5.SF��[����7���"4FXj|
    D
    C�:�\�P�r�o�g�a�m� �F�i�l�e�s�M�cs�f�t�Ofe�V�s�o�1"\"0�3,\�B
    R�D�E6_�.SF��Y������"4FXj|
    ��C�:�\�P�r�o�g�a�m� �F�i�l�e�s�M�cs�f�t�Ofe�V�s�o�1"\"0�3,\�B�A�S�I�_�.S6��՜(h*DP��^C!4]$��/]=�/T$`s��/U`���,?\.r
    @:NӇi@	L��FDN�TyB@
    uh$�TB�UF"H$ @FY,b'@Fx<?8F
    ?BP(?JP
    a_�<�k
    //+/J4,,'p*^"p/2.U2-q?-(s>#nu` N#6F"2u�,9#@L&ɯd2?~=ɏ8#ҡ8>sU1 6?'nPO	!P"(!/�TxD-6PwAE-`C�o�&�l@r� �S�c�e�m@s�.B��`C@��Q CGBgO#O5OGMaT"((rqCE{A�CD@f�a�u@tUoSE?>f#EmE@UC	An@e@ItBEBb
    %oT7beT|dQpa	dQu	
    A
    "1TQ Q>!a#Hq%t�{t{tQ�{UtLA{dQxdQ�{tu{axa�{axa{axa�{axA{Ax�{ta{axa�{axa{ax>!�{eta{axa�{axA{x"1�{"1xa{ax�{)UtQ{Qx{xpawMQuPaP`3mQQQac8a9a:a1;>!Bȡ"aA22"1AQ@��paLAqa�Qs%dQ/�E
    =Y!E$i4F?@1"@@M2?@#??(@(5o8RJzrA,ƾ#${A`~@a%-1S�Ll�4�J@cPlJ@s`lu0�ʒ)]u	Qu	.Ŋ(A/Teߨ﵀mUT޻߬uTq�hAdUW/|@f%aߨ12�ǪOOȪYJfv-醴v�eU8PVQJ __D_IFT aczTu<?k��浺2?MQ��iĸ__NXXo7'�28ȃ!E	f1tf5?Qcuϻ"?H$ �,>łTÅ&&^pςϔϦ*l@gPc�y@JL*�<r߄ߖ?�ߟ?&8J�\n/'((�L^p!O_�O�$6HZ�wi�);�]o~ϻ@ %#/5/G/Y/ k/}%01JΆ01/////./
    7l;�oI`4�j?+?�=?O?a?s??COUO?�??.OO'O9O�]OoOOOOOO+o�OO_#_Ώ�&o___l_x�_п#o2GoYoko}o�oo0oou
    �o*<N`r�M|0"!3}4M p|}=
    AUF<@@q"@Ft:N?@Lo??Pu`uޝ`A#<Hx<?@pX,]
    �)phpl�@z3fl~4fpt<
    `(0u;q0:<W�sp!=tNhzs<P2rq?@IK@I0#0O贁Nk?_Fw�F�KdX<4""qu
    .uğU�ޟ	.�%ϩϻϩrܥ�٨&8J\nG�`0@dP!@F|>@@ G?4b3!BuG�`u)
    h="H$ @FpC_@@rbP<1LF�fRC4GOpq%V_/X._�#5GYkFV�BV;qMbS?@;f<ASew�u<1uqX7:�>/P/b//u68644,%1�F///�//2}?+$8?J?\?n?��8N 1??Ƶ?U@1@AK$@@h4F@@0D"Ǒ迂0ؿO$O6OHOZOF2%@@@p80#FE&�&DFfg:_fx񹦂__pŶ&�_jߗt____�v	DS%_�o o
    CnXo$?Vjsoooooo�I%EGY�k}-�#5G)k�}3ssɵȏ�3g	''/*/U&yF\FM:?@JZ?:?G?Q1$oeq|�`}X11_S-c,"305GAי4d4RO%FWXe4F֨&Q��f
    I%r&%?/CՏ&$y
    S�L�F0JPkE�f((Ey
    _ y1ۤQ?9?�?A7CS59�(?2'9K]# ɵ3@ħKtiB��G(C)4XC/'�2%Q!.f	C4ث[KU�ڏ"4FXFvk5?+?*d2e{˳Dܔ3fݟz^5@`0�5[*g`tᔥfίook�Cr+C
    O.�@Rdvk#�[ҿt�);=nXj|ώϠ��C7ψ[�*�u?q�Ef߅+l?O�)O;O{QS\S�qnS˛u 5 c/AS|IZ@@H$%@@
    ?@ƿx<?r;Qclb^up`T?b²u̹ 5!zGz}7quEA^LuƘu\2q?X}?PpP!`0'Vϔ�//C/<4HWb²�ȹg�²"XՀiʷհߛɕމ�-=X{;=X߁߉,J+i�n�t�e�r�cpdPb�yPl�oP4�j	�b!i�g*.?a!
    PA푥OOOOMü__(_xrj7qQaaMqu/Q}\!3x�qu>S`uE 5Q�en]BkĤdv+/qSQQS\�sϯ߯ɕcǟ_d9C>@@-5) @@#@@[?$?$�Qν&�/ASe�+=O߽�K&O)BOfL%�}OOUgO0OO@OxO8_ORt0jPl�104Ao�vR-�sf=PV!:�j#//> 2/nPz@@z^#@@% c/V!�/νv?!6qp?�???????�O�n___OZOf!O�EOi#_G___�ҏ6\_~>_R&[g-Sp[@P`D
    {tw$002\5
    �6e<oGc{أ?/Q/c/u/Ef4F?@`0@@M&d2?@Č锵#?QPgy5tf00a�r��-йz	zSNdS�L�F=JMcSlpsYqh1Pm?[�ōO&ޖ b>qt,1?ŹϲȒ*ץt\4@6
    edRߪ?66^ar@
    h57H�M{5v=g4r�TVa(sqsqh2(<1ޥ??i
    <Xзi'�28�Ȋf	iq�ůפ2*<N`rP(
    `ÿ տ�1,&�1P);M*`lPugݐcRJ�Co�xϊϜϮϢ�,>n?t߆�G?/f�(L^p,/�Om?�9O]*_O�q0�iRdv�	q1�Iu%|{Q5[I!4pa~I"H!+q
    DU@:@@t:NuL?$,?ɖcđuz`up`-Azđ-hH꿄x<X,
    @@�)ĒpOƇ�I @z3jƏ؏Xp*1b*QBbdn(A�`!!S,N.BiBN!q!WZg3m/) ntYNdzsjNHBW!t82rq_?@IϚѣGx#0O贁Nk?Fw�
    6LaE||d3|%k"zg5?U7?9@c?�+۵_oo'o9o�QMmn�X2@@b2L&@@|>@@(?HRGYk{u`uI f
    ;`!H$@@%B@.ݏp%?+I�H]Qn+"b+"�Sㄟ̝_�>#"'9K!Wi{bX,?@;f<ѯ�Rj)�;%ALa$e
    A�i9:ݿI=ISH!�Ѣ( 2DV�tD!!u3#�.%A%Ecbrg5y~@@vn!@@< a@4F##9qϹtbBu�` ?c62u 9ECaBw!ULՇX\2q??6C?0�i}'%v�$VXL%qa0BONgU�vQHb2�9N`279A)gE&xO70OI%N%O�O<W)egN&_OJ_�)PegOO_O絹Rll�ob�a�c�k�-2`l0`s.i2`.K�j0`r)ooL`eFha!oooom3&!xjo/\H\HX7fo!3rgf��@ijV1>`k{oox,_Bu�u/)/;/	X-1R//U@SFwI@@23?e ,?11?6R3�~K?]?o=?O�O(O:OLO^O___�O?V8_z_�#ǯ_d_h(_Gpԯ
    j&s�fj6`a�pr`Gg
    rwoWr{evωy�u?=sUZ�Zkqq%`/r///~߷  `0@@M&d2?@տjZ??Q3S=B:"!"2:@:J1-=m4	q*q,2tq(�s d sT瓁3D~:R=a֫sV( 1x�tV("LC�f<ſi
    J`LNb~؟� Z9᥿"�Tem@T&TsgU55/N/:C�T-(#<2tպ2
    ?)sa
    - ?ϟoom�soooE#ZqZ�t8ߪ;&Yq8'}́q=
    ́	m
    ߡ!P(
    B@@ՁHL?JVD^E<Aup`u%@`Aȑ_FCq:z^@@մZVտй�)pbEG;�p@z3ȑBAO
    ^x"NSBpр*QkV_j_|^q - 6SUq�
    `J1IՀr.@B\eb̅WÐmΠBtNbzsBFbcqDiN2r#?@WIp	uuIyKӅ"DX1#0O贁Nk?Fw
    z!=$X14$t?Б.U3�.sDfsU;@`Aj?KnMWF/1/�_U/g/bHұ�lOM_q߃*O!H$ Hُ.or~6>fe:DQ>DQ:m}Oo�8Bbto�1L�f}8ǪWTh}2N"�fL+o=S�F�4��Z%70�md�/ݏi/�{/W//.Q//�//?#?5?G?Y?k9�Ađ<a~�ȕuӟ9C>@@"@@謿#@@rq[?.?7yFg1.Quz`?au�kDSADRAquMuz?GzcB!a-LLEѽ�	44Ba�gd v}![%//it/�.8??i7.S?�/w?//?!?Ri�n�t�_e�r�c[@pYB]db�yj_@l�1* 4o�]v[B-�sf]jD`j�a]@
    A�ki
    �Z!{e2	U@.P>@@ko@@9H>lSHZl~�Vf"<	//�-/?/Q/c/u//?O�O&?/lVoe?o2?�l????Yo�}?o+Oft،G-s@d�ky@4Hjbrh{Wˏ!356-
    ?(kkJ�EiaOaEf4F?@	@ʹ?p?QٙbZ5_ͲvHد׵J�L*c@ls]a�*o<oٟ`oro-|�cuHqєR,�ֱșRR>B m4΋ߏȵd׿3ſ?*ŜͿ�֗	�׺ߔu�d&8J�\ngJ87.@R R�OoQޗRQ4șNY6FYsX,@@|>U�fl@@эh?`5jVDuĐ`;u
    hpAau
    f
    0x<p�
    ~@@'
    BG@� RuR()CpJD�@z3a>DVbpWA`ɩCtNhpJzG�@&","5#f՘@ 
    '2ruR?@I ?y$R%ؓx#0O贁Nk?Fw<E
    DE=30B�E`XrQʡ\e.qؒUKd4CqJ�dqBV.!o,Ϣ*U`7O�νa#-?QcuK]Ak,_b͟ߟ@Lt�"t:N&S8JS!?BB92	S6&f%b6V3Df6>c/�ʯKWi? mV߀ghVP~Do=2#v�Y}&ouGw߀\s}ܡjeD^l�o@b�c�k�Q%oIOm�%OmOKQ�`ǟ$jOOOO�OU←A
    1d�>PbteNUJUU,389U:;?@ABC���������t4"H$ @Y,b'@L
    �>}C-nBF7�
    AU.U,3CUNOPQ���������t4"H$ @Y,b'@LJ`
    �'CtnB7�
    
    A���n����������������������@���k`P
    �M���R�������������������������������������������������������@���I`
    �K���R�����H<(H<(���n����������������������E���m`�
    ���R�������������������������������������������������������E���<G`�
    ���R�����U`���,�*?&d2@RT*$@	L��FD�TyB
    tuh��$/�TUF"H$ @FY,b'@Fx<?8F
    BP(?(JP[�<d @L#?\.ϗsU!&)/ś 2h-?xz-o(su6` """u�))eH0P	uU	
    T1#	1�^7p4{;p4�{;p4u{;p4D1�{;D1l8H1{;H1l8\1{;\5p4
    x>L1l8P1�{;P1l8T1{;T1l8X1 {;X1l85o	&f >Q>QX0`	C@njPe�c�t@rX1_R
    e_wRUPP1TFQOQussD13�aH1#Q
    a\1uuFP1C'a�	1=E}u\3�D1E
    EeU!Eb$`0?@$"@@M#?[@?tu?
    af5Hhb"u;6RzB-4Ty
    	s~�$!`wS�Ll�4�Jp_c�a�lsS0qlH11�Ua@aH1.E0?GnJYub/�veu 
    EqdD1�d+D1
    E=1)pi/|wDd֏|22wqr@u}vr-̟�gcg@dBp[Q3a�T_Q_S(
    H`&/k��u?xoiE4O
    _X'�286ȃ!6	�6lIo[4jo|oo�oooook'܏@4FXjtetsR~*{l gpc�y
    J*`L
    1�CUg%7�	?Q�cu
    ϟ�7nQ�uJVᯮ�);M_q�Y%	)Y!ֿ�0BTf9i@ӗ�;
    EX14+!nOA�EzpAAE*ٓU@
    pL&@@	ut:N?@LQ?45?Qu`uW@`A�63&uU*JR@w?7�)pF%JG�|P@z�`@EDBJO\O2pQ|AFOON1F"BC{8W�
    `S_Ra.l~xdRBdRs1WS02tYN0F!zs6RH"aSd2м=2rq_?@I)`e'e;Ӆx8#S0O贁Nk?Fw�
    P$Pvg)ٰ�$d�?SeUӼz5S�e6_uu�–//??�(?:?L?^?p?)Pw)AL
    @@@ P!@@}>2A%@ ?̄?@(ׂ??@uF%P`u5M
    F JGi4F_@@r`@FCwpOCuaOp�xEÖ̟͘JuEF"B8�__,_>_P]xS�____U__/܁bX,?@;f<o1oCoUogoygo6-oo�Sc6�.@ạ͆͆ׄ
    u�&r(:L��8,'\֗U@_z]aK$@@hX0D"Ǒ`%@jؿ&8$AĂ%&DL@@p8׀#AG#%|A؟BIV�V=vDa|A�&�H/u�Rdv�TYdSwxSwͯ�߯U#!!a6HVjŰdvxo�п%�7I[mϑk}�at/a%?�I[m%{Q'�߅;i2o3J`0?Mb?@?D%EC?Q9R"Lڵ5Z au61-aIڳ	!ڵ(l�o 4�jc�al
    :Dd=:�')-9/[	W/i/T/UG_NW ^_Ռ_*qF${1,�78a)F_'�+8DW6@k.OtGDeڵd_;CeXGaM,re�n'Fmo5e�lwYp{o�-6/??)?;?"ՐBYtE?%:i$F齔,qXaG'�28CDt!uD3b5
    	q�4w?�$6WcU@~@@"@@(ELFB?ppzY'y4a9d3zf&f2�$I!iQ�iD/Z[�*<N`yB/=eeƵO@
    �6HZl~F�?/7"�??صf_O/6o|/�8ewd9Ko�Y2V?>?????i%hF(Z.H@ORKW`yBVU"!B%@ZQ:e�wÖOOOQgco�uooono'x@FsXoX�F^Du^n�e5(w�"j/4<-AYHS�L�FPJT3_1_U_�(y_L____�_>O0o?�Bկ�	Y+=PCJ\n_3�س	_&U,qb;5Yk}ODWD\ur	@@-5) @@#@@&q?d?dGցAuذ`?bu3i_Ѻf|2[Ѣ5gzGz}PC;صAEcL�˥љ=?O?\os??@9!ZOb�ici+=ufge4<Ue�nӇM~!@FMg'<R;i�n�t�e�Wr�cŐpÒd
    b�y
    jɐl�u1 4�o�vŒW-�sf.0j^j�aǐ
    {q�\[c__o6U(mرD>wIsoU@Ntw@@s!@@b#e`֣oo�oo{y:r�as�_qK֦�Ϗ6ϜZ{8�'Mo/ߠE-o$t@1}P�j0'_9_HlH{eV9!3UWV<&V�ZV%QGa�HGe-?Q:oLo0^oLʠ?t:N&SeB:D:|�.,/5+׮*-�+/.%�'P/5Dy/%�//.??�3?ҿ??�???>?O>?�NO$?rOOOOO�22O_2_�U_g_y____Y
    !3EWi{@"srG@@f.	#ԯ
    �i=QyifSw�////?�u߇ߔOaKϗ�ϥ-QK0Y{,&a͐iߟO�O-_Qcu����v������������������������Ow��~%������kK����B�?���$S�v���P�D���S�v���P����S'���������������U1(�UO"D&aUAUNj	)h"�T}
    	)��U	|
    |�
    '�--	(
    TW
    ((((#(.C+Pɉ&!Q-
    -H*=(�X?#Q)
    - '--o)EQ//?�p(�0O贁Nk?%@+fe��A�r�i�a�l� �U�nc�o�d�eM�iS6?/?`4R$f��S�y�m�b�o�l$67f��W�i�n�g�ds*�7
    fE��A�r�i�a�l"�z�@D�/R$fG��S�wi�mu�n{�a ��( R$fG��P�M�i�n�g�LU{�a ��( R$fG��M�S� �P�G�o�t�h�i�c{�a ��( R$fG��D�o�t�u�m|"�{�a ��( R$fE��S�y�la�e�n��� 
    �$fE�s�t�r�a�n�g�e�l�o�U d�sa@`�9$fG��V�r�i�n�d�a{ ��( R$fE��S�h�r�u�t�1i$�&�<fE��M�_a�n�gl$$%>fE��T�u�n�g�aH"@&>fG��S�e�n�dy�a{ ��( R$fE��R�av�i"&5<fG��D�h�e�n�u|"�{�a ��( R$fE��L�a�t�h#��&�<fE��G�a�u�tm�i &�<fG��C�o�r�d�i�a� �N�e�w{�� ��( R$fG��M�S� �F�a�r�s�i{{�� ��( _R$fG�u�l�i�m"�{�a ��( R�$fE��T�i�m�e�s� �NwR�oa�nz�@D�$�������������������������������������������������S!�E���B����|S!�.���B����S"�%���B����lS4"�5���B����Si"�9���B����\S"�=���B����ԂS"�C���B����LS"#�9���B����ăS[#�7���B����<S#�=���B����S#�8���B����,S$�'���B����S.$�"���B����SP$�#���B����Ss$�9���B����S$�"���B����S$�9���B����S%�&���B����tS-%�'���B����ST%�C���B����dS%�>���B����܉S%�8���B����TS
    &�G���B��������G�u�i�d�e���T�h�e�D�o�cP�a�g�e�-�1"G�e�s�t�u�r �F�om�
    a��R�e�c�t�a�n�7g�l��S�c�h�e�mN�
    a��V�i�so� �9�0C�o�}ne�c�trV�i�}so� �0���V�i�so� �0�1V�i�so� �0�2V�i�so� �0�3V�i�so� �1�0V�i�}so� �1���V�i�so� �1�2V�i�so� �1�3V�i�so� �2�0V�i�so� �2�1V�i�}so� �2���V�i�so� �2�3V�i�so� �5�0V�i�so� �5�1V�i�so� �5�2V�i�so� �5�3V�i�so� �7�0V�i�so� �8�0���B�a�s�i�c���B�a�s�i�c� �S�hd�o�wL�o�c�a�l�Rw�0v�i�s�V�e�ri�o�nR�e�c�t�a�n�wg�l.�1R�e�c�t�a�n�wg�l.�2&B�o�r�d�e �Ugau�td(B�o�r�d�e �A�n�o�t�a�in&T�i�t�l�e� �}Bo�c�k5Tx��.T�i�t�l�e� �}bo�c�kc�ne�m�p���T�h�e�m�e���M�a�r�g�i�nA�n�t�i�S�c�a�l�e���S�c�a�l�e������R�o�w�_�1���*N�o�t�e� �bxt�r�i�a�n�g�ls>B�o�r�d�e �Tx�tr�a�n�s�p�Urn	Lf	���(N�o�t�e� �bxcnm�p�.(D�y�n�a�m�i�c� �on�e�t�r3�-�D� �b�o�xS�c�a�l�e�Fc�t�o�rS�h�a�d�o�w�]e �bxB�o�r�d�e �D�akB�o�r�d�e �s�m�a�l	���,T�i�t�l�e� �}bo�c�k]ca�s�i���R�e�c�t�a�n�wg�l.�3B�o�r�d�e��B�o�r�d�e �5no���S�h�o�w�Fo�t�e�rP�a�_g�e�Mri�nR�e�c�t�a�n�g�l.�1�3R�e�c�t�a�n�g�l.�1�4.D�y�n�a�m�i�c� �on�e�t�r1�5.D�y�n�a�m�i�c� �on�e�t�r1�6������������.D�y�n�a�m�i�c� �on�e�t�r2�0R�e�c�t�a�n�wg�l.�2	���R�e�c�t�a�n�g�l.�2�5R�e�c�t�a�n�g�l.�1�9R�e�c�t�a�n�g�l.�2�7����������������������������������������P�a�g�e�-�2,D�y�n�a�m�i�c� �on�e�t�r�.�4,D�y�n�a�m�i�c� �on�e�t�r�.�6,D�y�n�a�m�i�c� �on�e�t�r�.�9���T��<�����������R���R�������3���lL((����E�3���L8(����G�3���LM(����G�3���dKb(�%���G�3���dKS(����G�3���KS(����G�3���KS(����G�3���KS(����G�3���KS(����G�3���LS
    )����G�3���$LS#)����G�3���DLS<)����G�3���dLSU)����G�3���LSn)����G�3���LS)����G�3���LS)����G�3���LS)����G�3���MS)����G�3���$MS)����G�3���DMS*����G�3���dMS*����G�3���MS6*����G�3���MSO*����G�3���MSh*����G�3���MS*����G�3���NS*����G�3���L*����E�3���dK*�"���G�3���$NS*����G�3���DNS�+����G�3���dNS+����G�3���NS<+����G�3���H[+�&���G�3���ԸH+�)���G�3���H+�(���G�3���O+�.���G�3���L�,����E�3���L,����G�3���NS%,����G�3���LA,����E�3���LQ,����E�3���4Ha,�-���G�3���lR,�:���G�3���dH,�'���G�3���H,�)���G�3���,L-����G�3���NS0-����G�3���dKO-� ���G�3���NSo-����G�3���eK-�"���G�3���ĹH-�.���G�3���OS-����G�3���DL-����G�3���$OS.����G�3���DOS/.����G�3���dOSL.����G�3���4eKh.�"���G�3���\eK.�"���G�3���4O.�/���G�3���lO.�/���G�3���@
    /����A�3���$@/����A�3���\@/����A�3���O/�/���G�3���eKE/�"���G�3���eKg/�"���G�3���eK/�"���G�3���$fK/�"���G�3���d@/����A�3���l@/����A�3���t@/����A�3���|@/����A�3���@/����A�3���@/����A�3���@/����A�3���@/����A�3���@/����A�3���@/����A�3���\L/����G�3���H
    0�.���G�3���$H80�.���G�3���THf0�.���G�����������������������������	���
    ���������
    ��������������������������������������������������������� ���!���"���#���$���%���&���'���(���)���*���+���,���-���.���/���0���1���2���3���4���5���6���7���8���9���:���;���<���=���>���?���@���A���B���C���D���E���F���G���H���I���J���K���L���M���N���O���P���Q�������UvU	
    U
    UUU U!"*04���������t4"H$ @Y,b'@P7�_C-lB#8�
    A�����������%t4lB_}8�
    A-@7�A���J���������������������������������������������������������������������������������������������������������������@���B`-8�P���R�������������������������������������������������������������������������������������������������������������������������������������������������@���|o`8�6���R�����H<(H<(���J���������������������������������������������������������������������������������������������������������������E���dD`9�
    ���R�������������������������������������������������������������������������������������������������������������������������������������������������E���o`9�
    ���R�����{��
    	g"4FX�,υ�,h(Z@(;L].+�~#hcK��zPB�X |TO`�.WS6P	Og��Ҕv�O��R�$��x!)S_��Y'CO �~O1$Od5T&�P�250�,2�?[8�*'"D[:H%a!���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/images/����������������������������������������������0000755�0001750�0001750�00000000000�12203357067�022537� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/images/plugin/���������������������������������������0000755�0001750�0001750�00000000000�12203357067�024035� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/images/plugin/filterWindow.gif�����������������������0000644�0001750�0001750�00000026547�11377016712�027217� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a��ѬꙙqkҾT[IpKKji㺼̼bdjcchaԉ䥤ǵY^{v"SGHL薶̺,/z{ȀzroVX]G]`ĺˣܵst{}}̄ެɦ9Dh˗KMP\^cff~^]=>�<t׼wwޱセΤiK|<UİV|^ſݴ %qlmsɶܷghnҷ~���!�����,������/觠*\ȰÇ#JHŋ3jȱƁ,(S\ɲ˗0cʜI͛8sɳϟ9
    h)/~@*eDӧPJJիXjʵׯ`ÊK,X#c4)&#ƎMqDݻx˷߿LÈ+^̘cz9ZGIӨϠCMӨS^ͺװc˞M4nC5Rȓ+_μsc 6vN(iνËOӫ_Ͼ箥ײ	;lֱQɀh&6F(VhfPň$: PlXŒ4h8<@)DiH&5P TN	eehɗ`)dihlp)tib:ÓUX%j!>=4
    F%F*餔Vj饘f馜v駠*ꨤ
    j+gE@*jʆd4z@k&*[@*RV[HBKq*ï�#+rkoA<B<l«p
    pWlgwT!_+R@!iK,ְ =ȌNDmtAI+]#b00#0<B/5ҏ\-tbl1-tmx|=1gPF<2&2ed-1�SN�+:CSt褗覧.zשO}'@-^n{娇^N/o'N9|P�d=:t>0!>$}A�  	{dBApǾ1o^챏j#	.8`vmal>}Ux�ɏ~ꋡgH8̡we!Ve8	8Qlܹ8�F$.]# G!#dž8Gȃ
    0p6"h#%@yk@a05<A	�F7._dDE:^&$4R>k|ҘJ6<񕰌,gIZN.w^0K.AW!z�O
    ҄XӚ|0״f©B| ~�euS`�TN>t-H
    `p &c;)rxBUA8IQ$(D+tZ^HGJҒ(MJWҖ'-IMKz@BلCMj.tUsXCz &!hMj=!%QM#>41!hP*T,45V̚.v#1׹g
    XVjuavxjׄ@ؠ	VgUJ:d'KZͬf7zcJX>N2U( !
    v @p+jCXBmo+QTCר?dAaU@\v-ASK]d<EDfwDGX!5.wKjk"(nפߠ7A{.N;'L
    [ΰ7SA
    T qe-Nkb4D
    qհ�C*!cp457�z-ۘ@І\=C~8\@]^0xMqצ|k�Ǫ?;:h3E=YHMBЈNF;ш.
    Tĩ#C¤c)d
    QbQuqdC
    
    O(@L;1LG<puR;6
    7lOF
    ji7]sƺ�~tc;ki�NONpIO	"#ik(\T QrkA
    )kuC\ake㮐?dWL!"C5x.@D0H],"Cԁ~u7opG�TL!JOE*&w}"{~o.OO;񐏼'O[@9%݀I{WA�r �`�^]�(��;O=};ЏO}ehC}777
    2SpX'S0_ȿs@PkXx
    ~"P؁ 8$X&xX~P}01e~7
    FFP
    `A<E@hLуNN݀"�XZ\؅^Y
    b8dXfH�Tmpnpr8gvxxz|؇~hB(<؈H	A8�`؉Ox`O�	8Xx؋8Xx8	8Xxؘڸ؍8XxȌ~	8Xx؏�9Yy`�9Yyّ "9$Y&yi	*,ْ*6y8:<ٓ>Bɒ0)~@@JLٔN69RY3ِPyXy_6ɕ^\)CIGiaj	`#ٖncI.iHx$	P_ٕz	~sIDUYɘ;9&ɗ&	%I٘!	)Yyٙٚə	鑤9 	IYiih9~iiٚYٜiֹ)ɜ99yy)iiיi橝y	өiiٟI"JZ
    
    *t)ʟ癞̹:*	j).ɚ(Z,J$
    _piw	Iʡ9H
    %'*.ZrCiG
    ڢ-*JZ9]ڟO:gKVz\h١^Z3Qڧu=꣨	ٙ9zڹ8lڦy9*䩞_zo:Zꨍ`: ʪ)SAꪸJڦꟲZZ:ZL)ڬ:Zzؚںڭ:z蚮Ю:Zzگ�;[
    ;[{۱ ";$[&{*,۲*2;446{Y:@\BD[eqVH۴NJ_RT;L[Zx\{^UPb{hdOl+n;o[vwkq˶{kyZi+h۷s{+Kt봍˵E{˹x~빁[ˉ[+[;{+s[ۻ;[{țʻۼ;Ի{bO˹K{;[
    ۴{j[ۿz˿;Q1Ua|,
    @KP뽐+l:7\L
    ;32(%K4\6|8:<{/|,C,.[ĦG)NJU|SW]܉RŵŮQbf|aƥKƛǚnvLuLkltuǀrܵ,Z\ȭ{F><ɔ\ɖ|ɘəƌŐ<yL̺l,YǣɅɜʃʌw˷ȩ,ʻxKlȲ츴ܾll,ό<Lܳƌl\͟˵y{dac1ÚïLΰΩ+L~lҬ|ϲ{�ڌ\+
    蜾<ў]߬ }|X1%ݽ$œ
    .-<>Ә6--=
    LӋ7Jm5\{T}"/lZMU-֪Lejf
    X_tvLyMqxF@؊،+Ԅlh
    ̑Mԁ
    ʃ}^lٜ]ƙѕ=ΡēѠ}ڈ<ڳڬmʞ
    ץϱٮҵϷdz]װ#}ܢgז܏&
    4؝ڽݖ
    
    r
    	YSc
    z
    mcߘ=�Ns]C{
    ^m^V-ػ$^&~.K~{1=
    +6~!:TV
    AXF8>Bn!TV[mM`P}W1>廋prjlh^]aIM|>wn3SX~|G{N-NARL.`
    =Nڦ~ꡛOmn:=纾뼾uߜÞN~쭞	e쓞5.~O/뮮ž>R]~W>ɿnӰ>^ݴ־]m+N-Oa~K>KE>"o$>/1Έ8:-+?OoEoGO&|ʎ IP_5?WYACcoe__OaOk/]߹t_v=ioOqo[?߁o?/}g3mܕ/o/ޥ#~8-KoĞ%'U?..>NNOɯޝ?ݏίЯǟ4.ߝ"NP$XA	.dC%NXEȏ@8WI)UdK1eΤYM9usA$QI.eSQNZUYnի@;~9Wiծe[q
    JYy_t5aĉ/V+Xh٢%O\r^v_7UڴiUeȍ	G]mOt�oEbΦ@FS1ʆwr&ם]{*}Wo@ʔSpv�ppBoA	5~
    1~F\DP35qEcqKDOJExDǣLү!uL WNI'JSC)RɶtJHRK%p4A35\ʣcsԲE=NL1D4A-P?<C,OC+4RBBPB'TQAAP4J+}?FIk=2I\<4W]oXk}UYOa]2?iZkUV?5Y!>YX!=WYca]AceUK5]_g/8P&xmr{WyEWixoyߌdymc2=BOR'e=YeF:kyu{bcthw\c:jDzj}oŔؚ=6I좹QM-Ҳ9Td~zzjDqjpζOBLw~\pM0W\q3stʱt[wuKƭS%Dzwch'w䓿b&xg1U׾m8e$6QR?`0"xP\Q�
    xd`S@B'XA6G49M=P�qv4ePB89_VxL:>1uSC31OopbCeHON?&:Q'KqcDxFCJ
    (*/lY("Q{tQh(Q5:
    KTEɪd{R,Gj,*qĤ8$'hJ$e)Bi*UuI\%*g6'U)eS8KWNLl"yL7$W"IVRg<Z5er!u&.M6mPT2UIQ
    Uf.Kz-uz
    mnc?o9M]7[hEjW--h™S-lY+VIj}bɺ&Ljf')Q4u$4`X}iETH,NfEU`SSC҅43sJSXֲ
    [Mzyu:P7̡5ifR
    2e.׼zZ}+ӝ~i%qMERF_/֬g%-㚴weoUH{Z
    ,
    f~WWQHzKs[!ӑ[Yu*j3IŌo|+QiZղVb|Nhߨ$IN%x[~wE]{W`w_u.}.z&0W<6^W`Goz/-̕0W*swO+.?XƖm<Xlj}XȁA!�xd$'YKfrlD[#&?|e,gY[m+�?�qbG�\duYss/
    Ih,b8ތEoYыft/uBCKL=iP_A݂\.?ޱ6FԳum
    `-xŪ}WΝu}l;Yק~ELV�
    }ml3h26mt[76pcފ}o|$_/-{}p_߸njWy~qӚߺEqq2y3~r3?EAb\cGem~9e^uѬS<yэ<@Kg5djS:m!@Bù
    !=HInnY]sg*faȢ'`
    U$ _ELw'vǻw'-u}}{sܺ|驞ys>+w<=?y\O9yɃ&}{^o>Ka|;g}[{ǽ^W>b}_f_>�4+;@\\>:K@t?9C?@-@<A'=L;=c|TA!3@A!	@!L™(:BTB(	&
    B+l)*B.D,-B1©C1B2
    3<C+LXC6B7
    8$çC;B<t
    =Cr(DCCTAD\
    E\DlDxDH@IJCL=ԽLKL0EQ>ADBST(
    |WE0323[6BE[ԳI4#4CAa4_4LMCSF$5SCT�6_FT]knFGGxT^7zATen{7]fol7^k6xGyOl>\6{F+R\H�{x8HP8ÅxʼndEDsEGǕ99KǚLc:tsL�::DJ�;;S;s;!J Dʷ2˯�K,˫"L˙=l&BK-JK?KK LL,L̻K"	t2HV lL&{AT
    LT2LĿl L$LGLp,8M#"I4MF:BdMpͽT$QRML2$ET(暔)g:$EYθN,ὉTNʚ%b((Μ8+L#̲|,sy-R'쥧XO	\*,ϚڴR*
    ϚP̚:бO"XRŊЙPDAa"2r*QOP	M}mQ %R0R|R(R)҈&K$K,K-ҶR/MK0
    ӲR4MS5]SRDR%	&}S�uS;P<J=ST\"IR@
    AE:Mڊ_M@T@<mTJ$Gm
    KSLeNr'r"u:IJW}frNU;A:Pjk"Q;o8UF]EO^EBeUeUU$cURdu#@rUlPtVRS,D
    
    eV*i2PBk%lMs*^iUO\zQs=W]TmL]t=:}XeXbS
    YY%Ӽ4SJM٬\Y2}YY1YY1Y *"H
    5@(XڠepZZUZj!0!@
    "۪ME[!([ !۵Ee22B$#C)@ܿ5
    m2Ɲ[B"4*J
    ʭ\\UL3]**.2]-]ֵ\]mR(]
    ƅ]=5]#>:<E^ݖ]^M^­)AR)Q^
    %(y%%
    ZP-%Jҭ5Qd_d_݄d޵&_d_yBQ'Siz'RƧT	'Ƨ.a
    ‘)a6)m`l"R)m9DyYb`*C*+~`$*Zb)vbIX`9㿂4ޫ3,(yb㾪)+ҫ6N86N2.BD.DVdCd.BdFIvBGH~hd..ePT>OYVMn./]ee_<eb&[f/e^f]fg&`Yzfj~c^/m/m*y�gsƯn&ޔkg90w0x\vg|~g]Bt0A
    6vFhU۷}!3Nhh臆O{+i[1+26QN~闎NiiMZ~#1*j"N&Ra#Yjjj"Jj2kk1>kKk1n{k0k/ڦZk
    l!-!堿Nll!mڶhʮl!
    lΞheYpV(m>mNm^mnm>m!աbܥ<v
    mmmnnH"*U
    YЀ
    ^�\۝n"e%j9n3]-o#f8,Vnni.^�p&?E~F?Q(p	RpRJ_._w_OqG'WGq~׌v`q ?' /r# #Ǒ`'`yZrq(q`r.!/r1Rs1>)fFs2cBHb<s=s.=s@OR=&.DWtD71s7j@tLd:LtOtRtL=c?3(q;7dXuYOu[uPYWeLu^uV	WwaOvTd\_]ovCyXdUnb/(fpwqo(RwtOw]nj~wxw)wRw{wefw.o?gwq>
    x?xtgȞ֝xxxxxx}6[yfhx}F0&qf VHy_yoyyyWy0nygyglhOzirfZ;zzo~z7{mkN{ko{~{9 {!{{ {
    
    | /|¢X|o||ȏ|ɟ|ʯ|˿|||||}?}O}_}o}}؏}ٟ}گ}ۿ}}}D}}~/~?~O~_~o~~~~~~~7~~~/��;���������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/images/plugin/buttons.gif����������������������������0000644�0001750�0001750�00000002446�11377016712�026230� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a����het?R%~Ո|Ű}hv^xPC?Qܦߜɶ!#$ᕐu35ѕ]I)0RO}x[8cjXFǤE*/KnU`lvza[09HX{ؽmn^G>(b|8{ ,'r=:˲ckdk=9r6>HX|Ϭ'~ck6>~ǤDjG? +qtмªsjlsućɬڈG?XFp,3DŽc|j׎WFT`,4~Ļrt|stqod������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������!�����,��������3	H*\ȰÇ#‰Hŋ3jȱǏ C~@I/\2!˗R\)2
    
    *a`a�@
    4KLH<R:+r
    Tg	�@@,�d0҅nbzZp&M#8R<tA�	+NP25"+nJzTN@nDrFkB=�^}kU+,Q"
    '	i|˘m?ʌth‰bHh4a@Ly"pDɑsXlB
    Lh0AMuE1BIdPRod@Ft@	5"E`F0�WLP�
    p]H�$Hh#rHA(<F4@NB�XYE C$"ip|^D9A	&|T �fpqH>B"찃|`E!4 jJ꫰W@�;��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/images/plugin/stackTrace.gif�������������������������0000644�0001750�0001750�00000020562�11377016712�026615� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a���Ʋz$�o5]m̹νf*bSj\\\M)o```)kEvRRRlǵqv+X+[rrrݬTBWppp\uꞛԲiiznnnu*W*fwSln*h>+\+_ڝ��OOOqod翿įTdxxxFs׈rI+Wfnƿˠ:NZhhhWgпɶdt~`5X􆚾�>�R'Z\HyW`wڽ|0tJ`]us2]rdddʁy\TqǿX~~~r˪_sp}QȏFwŴsttt���!�����,�������	H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜpO8sɳϟ@
    JѣH*]ʴӧPJJիXah	G1K`W:hӪ]˶۷pŹAew߿.o=hcߕO&iSǐ#xqEˀb̹Ydi6^ͺװc˞M`!޻ۤ =Wt?ѣþ}2uУKw]G4nrN`;jWsժ,ȟO߂Ǿzy{Gh` 4$ GW*!
    Vh!BfhyyMuX⊌X`0(4h#Ȑ$d$
    -(>KS>.@,hH` Ev#bnxPdi&AdI{zc/*c0ѩ=$	"@4$	I‹.IceBx򩪟u O0@03@jXAmR_4EslCfdSBA	h+Anhm"ZҲ�&7bHH
    *v龒tC`p�j	(4m:Z<p7#=,p=TgZ&l3K4LᕳE<-4aM{
    \af]ѢjnB4P>/KmAF++Q`%zW�T��,nJ�&j1ZE@
    )҇4t"1u:+3((uk6*6
    +t_]D~D-Ġ1dPb5szZw606DlI"볂	oMA6HS&*ǐ%ysV6T@ 71h#` 2r=^x#ZΎEšNxvk@~@PmF3!wBMY2le؏ۭ05,amBgs5eL\īiы_(F0r8XC$az:!|D$m1T!
    Q(Hpx#+$FJ3Ha8ĕ�8="iEnr.za
    8Rb*�l ,e) x6\Y	k i=98<$(eʑg}2HjnDd5f634Mp(Fvvql'<vsidiӘ݌YM147e:Sv$p F7:4cX@jQ(Mi2BIR.dD9	<P8t@}#)G:F4#!ήiH1q@zZ6I5ȅeHZ9.pg<1^
    YE~Q^
    ªР!U=@#.Vd*)qP 	i(pV"8A2RZ*g]Zj $Ѓ`ef賯.?Ш.mhB
    ;Jө
    hv+B	;'w[�wuz^9зVׯ۝ {TjFurEHAYD6Ȗ'h1&-nG[s8!%o	;cZ2Hw<u ꀁV6W=hZq)Ը^?]RB`U@	Ʒ=4Mwԝ2aU}jvLe$y#0eh >p%7~x�RJ At
    j�*0c3%,"LհFa�#7lR^=dSKőask=1҄:S.s{WV:WH6~k@6v=6vyhle[5>")B%Ƭ@(|a;H3 aH�I"*/T�kg[#'`NpBhG__Q`%8'vs&8ЇNHO,Kw%77<
    g Ⱥ1�+xbJȂD	+4D<߹?j�CD `z;ġyHl;|ծ31c7$FOҏ%H"`m1G9%LHCdA>*'JDoO[Ͼ{/yd(_"_u`~,6Oۿ_~�G,'scw
    htG~�xLYQxx؁ "8$X&x*,؂.0l4X6x8:<؃>@B8DXFxHJ؃mNPR8TXVxXZȃM`b8dX]hjl؆n{3.u4apz|Hr#l@X:G4x؇؈'ʥLV۳;؉C(mJco}DhHf>nhXx8MPҴoȊ|`d/
    &XhgՅ،؆ȋg8hLkFGee8XthUy8X]5UhHZvGMBveoȸeِ)T<$H6/4mql "8&y(P*ْ.Ȓ094Y1:<ٓ>@B98tHJLٔNPR9TYVyXZ\ٕ^`b)&yLF9jlٖnpr9tYvɕyz`	w٘9Iy��	�|
    Yٚo�YIp9Yl}	@}|`@I`�rZ]ɝQy؉[Iiٞd~Йˉ}�i.X	I)bBcbKމ٠癠
    ZxzɟЅ%:�jH
    -z(0d/*y%BDJ5:-ڣ2)5)3eC&W*&UZc`Zyzzy�F3pZibn:j?vGYrEzsڧ|)RJHX:ڥayiy~@l:s1~*z}Zt:꨾	*
    L
    ک:4ؚPg}p~0$ꧯʬ:ڬzڔ,*:HZ
    ҺԚښ
    [y9ୡ)~~	jʮo
    ۬ ):C:$%+z[
    ֺ+5B+yHPi?OQ*z6[ۤIJZۣʧ[;*sZe;::KX+T+X=Y5^
    iC;+EΙk�
    :[ZL+	ۅ0ۺ;[{ʕʹPP	0	;;Kkp껾��K;[˔apliedb f{
    <|	̿Lؽ*<%,,\6|ÿ<"l&(l+TIWiV˻k*b	V8:,!\$|PM\M)6+:e2cw	2m+0_i|l[|K\|ۥKclȂƓ|֊Ē8۲LڤȺz9AQy<3ܪ7{;ɜ||ȑ̳ƓlԪƆL\μ{Ō�˔/뱱j3˳\ø2}Ί͙\n7kż(zSVWr|
    1$Jjfkl"m!(\$
    ϳ
    rLǴl7~˒˜8;<;ҔJmkҒ.MX	
    *͠'KUkֳ<}\,Ƞ\ח?kךW}Uןʗʢ<~ȣLv~=d]`t[*qʧ쪖
    km¹΀b漚5=Ӻ-[yк۾۳ϸm4<ȝ2ŭѭq}ح
    ܛݢ
    ;}
    ͹}=};sĹsɫ\m^[ٯ
    	.Vl]߬y֭,p5ݱ
    ^.J,u�^ɌԙؙH}؉˄O=9ڦl{
    S3Zʓ=֟_k,'ã=p'ܳJ͈L%Ԝj-}G-I)mei{Lt֎J誨ujf%^,[r啙KU(�n޷g~1+ ֩q;m{Tٰj
    ݲ)aNsfQgМq.lMƮ]ZhK~0s	@Z>)0n[t^~`-1j4&{n
    n@n秮>߆׎؏]>"tt{|̑]Q{o\˶2FQHoN
    \ni¹X9Lʑ]fhor?	txv|_}\_qV?_ݕ___/o_ᷟ޻޿_ȯǟ/oԏ_n=k}?,}]q__o$XA	.dC%NXE5nG!ED4i֔iCF1fÏ_~95IOA%ZQI5R%K0eҴS'O~KnWaŎ4ʖ/cRΝ=Υ[]yv54Tnĺaĉ/f/ڨk*e̙5ol1TSV[iԩUf}_ɣ)mܹu}Yҵw'^C&]9+rѥOqScwyNJݜvϧ=߿
    4@-;tAS"BO=2C0C4DARtE;,Ю[psqGVđG  H$c,$t%;|rJ**Ԓ+[K0041TsM	g7X$M:,M;33<O܄l9PD3QFuLKG+TE/tSF
    tTR3ʴTTSuTU[u V_5XgZoյ\w^v`5bUduvfvhjlVIHakD/5WnUp,u1]y}^{-_}ݏ_`6`aa#nHǕSbl
     ydD&dLFyeTf\yfdfE7urq9<%%wΟfV
    i.i
    jjkƈkÞl^5h4{юSm~wE^&l<ph>x&p/\=hCYDGIDC?hAHq@
    	EYtk@@ uqvۋ>Pg@y>⍷P}y@Q?(?y=h?F�cBc< 8C0�`bG@P[
    r`%x
    "L	BbA@0\$Fs!?
    wX]z`Cap;DB Lazp"q:,c[ PD�kSG@ҏa d!
    yHD&Rdd#HHFRd%-yILfRd'=IPR$e#yJ@Ẻ3Re-myK\Re/}K`S$f1yLd&Sdf3LhFSlHXyV/r09y
    $g9yNtSdg;NxSg=yO|Sg?OTe'$G9].s\"yMЕt[]^UAhG=QT#%iIMzRT+eiK]RT3iMmzST#DQ=oe%rw�^`FUSjUzUfU[jWUUc%kYzVUkek[VfGTuK$yOz$XCa
    {X&VelcXFVle-{YfVlg=YІV%min
    	Ji/_PVmo}[W%nq{\&Wens\FWӥnu{]j+%ӟw?Aeo{^Wo}{_Wo_�X&p
    |`'X.y@/:]?iP;�<aX#&qM|bX+fq]bX3qm|cX;q}|b"}ax	gb`ASr|e,gY[re0Yc&s|f4Ykfsf8Y[-8npIDHB)I
    }hD'ZыfthHGZғt-}iLgZӛt=iPZԣ&祖)3^(C<7`m}k\Z׻u}k`[؛c@HN}>PD<}mlg[vmp[&w}nt[fwnx[wm=xfOL)-gxpG\x-~qg\x=q\#'yM~rx
    9| b/qz*y}s]C'zэ~t5bF16rBctg][z׽u}Ug[=48ʑwcXJ]s{~w]{&>G]֜lrx'^g|xG^|-yg^|=yЇ^'}Mz	g}]z^}m{KAM}}O{_'~|'_g~|G_ӧ~}g_~g_'~_g~_�;����������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/images/plugin/createFilter.gif�����������������������0000644�0001750�0001750�00000030761�11377016712�027144� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a��ꙙqk̹ҾT[KKji㺼̼eflgމccє҉䥤xY^{v$U٪薶,/z{ٺȀzroVX]˨G]`ĺֻ֣ܵst{IpӨ}}FFK̄鶰IJNɦ9DdzhΜLMP벵\^cff~^]=>�<t׼ww⼼ޱȽ藍MK@iL}<UİU}ʶݲ %qlmsܷп٪ĵקدƎM}җ~���!�����,������18*\ȰÇ#JHŋ3jȱƁ,�(S\ɲ˗0cʜI͛8sɳϟ9	x)1TvDӧPJJիXjʵׯ`ÊK,#d4#UDݻx˷߿LÈ+^̘pd|IZOQIy3ϠCMӨS^ͺװc˞M7sa FMȓ+_μs&Ũ5sQ2iνËOӫ_ϾE=kɡɀh&6F(Vhfƈ$9 rhŒ4h8<@)DiH&5L TN	ejШaɗ`)dihlp)tib:ÓUiX%jh#nC(*餔Vj饘f馜v駠*ꨤjjj�ÞEPj:qChR@&k&6@�HEjm"mF#	N0
    [H!0RB	K6[ث/%$
    %A&ϛOlgwC-N12"6FAo$0!=Nԃ>H43'h`H'4J74MgAAE\\/M	`0B]+Mvlpw=tmx|75=jP@%?#B' ,`X>8<pDn飗,'X6_跗{o''_ЗЫ1:<c?
    oOt
     KA>H,W
    w10l{8@
     =_kǽP_п)@~fH8̡w@̡D@=Aҷp!P"}8A6aDA	40aD�%X F1$(,@D;	(F
    :'�܇3j|#IAplɯVp1Dh>5Q
    r,gIZ̥.^0Ib^HD-Eh.
    =5(Plh̦Fk	O!X<N$	Nqs'=O΁[ :#j3D[6Qx6=M|'JE0LgJӚ7-NwӞ@
    PrjjHB3
    8jQOIPK	cP*|xtZCzU(heE>)a%PP+%H 3hhժX(.5n6zc(@ͫ^VXʵaz8׆Yig[ҚMjWֺlgKi٤JSA~U5hu(H@"
    zB
    p,fC`BsKYV׬0taYH;^~D	dHm/NІדE>׻+߰_J/${ GL;(NW0Ol*XMj\iwQmP*HHvtŰ@2&e9`nHhX΂(,s@0qc[X1OkhfA5f	̎#1g*K@>'4|.Ҙδ7N{ӠGMN/H‼%j2
    (xh^o}XJzv	AFq`	ws`v+q@ �;v m-�~Afm䁭q-.�pn<;_#vMfÎ'N[ϸ7{FuDj /PPbxe.|1r	!v=`6dsbU(	@
    X_^TAWE1':5N[�_c/+^|?<}�~O;|N[ϼ7ʟGЫa (8!Va
    x}Y
    a8E7`{؟VL;Џ
    Ͼ|{OOY{߯A
    ?GAЊP
    
    H
    
    ؁ "W&x(hx.028(86x8:؁H�
    j7DHhwppN
    G@
    L0GPb mpp cl؆nprȆPvxxwXgz8p؈8XuM	A؉G	@
    f؊q	P��8XxȘʸ،8Xxhw08Xx蘎긎؎8Xx8@��9Yy
    ِ9Yy	 "9$Y&y(*,ْ.0294Y6y8y<ٓ>P9yHJLٔNPY?9=C9EZ\ٕ^`yT9VIhji0kym9ٖcIeg)zQ|I~2IuwY�n!*IYBiFYЙɔ)yəy9iI)ْ	Iy@x9))Y/Y9ʩƹ陔yI֩9ɝy)ݩYi9ډyY!IiziZ:zI!y�Zzy
    ٝZ$
    ١#穣
    &: ڣEZ:WI*-4i3IV@:BJ_az>#u&
    DLʥyh
    @ڦi.FJ<*jlOQ*ʞ¹	ڧ~ɟY		
    ꩜:t[*
    rJ)0ɪ~:vYZڕJ	ڭ:Zz蚮꺮ڮ::4pzZ	�;[{
    ۰;[[z	 ";$[&{(*,۲.02;4[6{8{S<۳>
    C[D{FHJ۴LNP;R[T{VXZ\Z`^+f;g+ADpr;t[v{xz|۷~r[뷄{tZѶ"˸{KY@+k{s	r;[˻;xkX+{۽˹[ۼ[{k+˶:O[kܫ{;[,狾۽�콘ܻ{k{{	
    ™+�L0ܾK̿*<l&웷L9ć+8|,+BlL$JU'N<"RlCJ|ƁdL1?‹[8<
    ;[;Xkt!ܿƆU̼e7l+<Ă
    ZL\l̻_S,Ƈ{˿b<'\ʀۼŅlx|z춢|˸\ț|˼[\\|Ȭz;[E<\|؜ڼ<\|Ψ;<Ϊl\_�<\
    }U
    ]d
    N!ѵ Z M,*SaҚ4M0]7M25"
    
    EFG-BDIL
    O	,XT[=V`-]
    c_h
    `]lpr=t]v}x}|mky}=ثlZ3M،]]Ϗ-֊Ӎ]a=EmٞMЀg٤ϡ-գ]ڪҧ
    թڰѭԯ۰\۶ںY۽Mڿ-=ܞ}ܰܯ]݊n؝ڽ{ݍ]ݬHޅN-޾=I
    ==m=Fׁm-=h]}\
    N>.5}n}~n>~+*,4^6~8s/1!|]`AB<=m^K~NmY娍\X.,ace.giN`G-\A[rok^yv>LҁnZ:M.?x^C}%~Ҟ@s>.⩎顮}^81ԼjfN~Od꒞ھԞ̾m>~Q= n^}Nnﳞ^n^|lOUo&(
    !_}2/4_7#6BFLD/	.?n�_\^1Q>fXpr?k_hw?jE]S焏P^/퐿=moo/ZOI{/t*/oѤ?Oڟ?CЏ_/.J=|O?$O܏$XA	.dC%>7ʼn1nPA
    t(Ѡ)Ud%/e.9ӦC,yOA%ZQI.eSQNZի;IDyWa=K	z[8.Fro߼!'/flpc!ㄘd̙#Jfɖ;&tϙCܪѩ1˞'_عg6͛CѾ
    xcۭ/g8狓m^ݹ腧lvWfMLOϧ_}W
    ?Z<30%J\;KB\B93p
    CF,qŃNtųTdqF`$FdE;q
    \HL/H\HtC'R!K0sL2LJ,J4!r7eb|N�|B:TS9ϖe)PA3tEUB4Eσ΄tPJa{R3}mSNQ낲P4PS]sZu5R#U.uW^{W,oGaE53YuYNuYbQZ>}XnA"pZmV5lõVnBOMO!7]tSyWoŗZ2vur`a#x1	V]}}kF.aw_$
    UdGxeuy[{9ڙs^(yFgMwZգΘf~mu^ܩ;&ݫk{,κ¤övm{nn{oo|p	7=#q#\3|sΕC}t?qSW}u^Msc}\Wvs]tHw_exW-wwyȿ0z쳷^FH>jz˗X&"gq{?i|_WUdc":d Fy˽u#`ECd`,b�-xA"#�
    #$U4P�7Pr!QjPL'D}C &цNa}'Q+JQe:(/~1cWDъH2"%nb
    <ychƟo㛣HC"7T!x&:R!BR$'+yIGL&KYL2NX
    X,&g	K@VS*E,vPe1yb2\&2KgSpl%if|f+tBR')YNrR6Qv2df2IFړԤ;MJjr6ADxћ9)>hDչ1h<9z擣QL5Y'>C$"KMrtL(lt8iN/Zz$JRTCMI?ɥtKЙR儎j?UGx_ɏV,3-yQ-UW~/Wf5?[*&įr.V;Xle-ZvFl Y՝%miQn6eO	VmBζV.W.4tܮv-2:piW:}�@={Q7w2a`WHE}+f4!$"P:�&0\`	fp`z<gwpWa<wp$=W+'bXƃMZҾ31}򷿗5k\PKVa{FYW9!Ajw[6ef\gꥻ`af8P#ng?Ma{n=7)-
    Aʳg65wS_HFLgZsfHv(T9)h<Ԡ֦ZQY)}G>ڏ9?UmkVg|*Kf٨6ASxm5HUgs+i9KY֒N,my_YJ虫qE
    e_Oӗ$
    "<D**_XDg9iNg|8)}g:fjEhoT	W̓HeY^s2ڔ;"s5DQ}o|
    mT.*#NpGu9aNyӷT;{s:/ZfA>r;ܩ@ԣ|}9T}f>=yGi=9PD}U|:gܖt}HV5}E(}Eذ"4Լ;/Df,OM6~/]-j~gQ^K[_k\䢾?
    .K骮벿|@c1
    2/T.|@r///ALү'$
    lA00YA
    AA
    T!\h#B&d\T]Ȁcc�kP$臉&,'TP%�6dC`�#"$ ÈCH0CL
    C?,C4y]P6�`x^8,:>;1,=t2DJDJCB'5LFS<HHIACWDĆE[D\!yHDSFTTŪBON?;@$[@DfEDmB*DXE
    lE@CeG?FOdYTFjEk'<6FzB+o,F%TcNlǃxŨ[?|GxyEmz̀8G0rLFdGKDǀLG@LƃH,'�`7zHpԲIGrqITsęɐL�؅|)�ZBG0I4]X]h*¡}Jtʧ<kǕʣ|BkBSG,B$:�KKkTK˸\J(^K%(8bxLȄtP$tKIKX�[\P�DC8MX0%L<CHMdEdMqMM$
    0MTM~M]M4NANߔM۔ʢNBNMJ,CTdN|N\NlNΩNOOOO==L\Pl�OO	O
    =PeP
    N�E=QQMPQ}}OEP Q!
    5ғA-R&'о(U)-QRQP*=L.mR/RS,-QMS5,QӋ7S;-<ES=S|S%%R@S6='-T9= MTEA}%}TgTTJKm
    LTWTTO
    P]
    QK)U!TTTFS-O(mUPդ8UZ[E
    \6)#tT_M'Ÿµ.a3LQlÓ9lVgCVEdDGHVH	EnR<ŽW$DF_Fu%XYu׸WZ``{H:P|}WdHZJeցՂ5XTXlz{mسE,Iz*ʀ5QE|Hؐґu�PJWd<ؖ�ʭ®JYY)1KYdBeX3KBוեZ\Tڪ]dLnjȜʬA5U"=[]([[5|[[ե[[][۳[A,\*]\m\}ܿ9
    -ځh�M\˭[\\\ ݢ\21>4
    Z%M3
    ʛD1'i|fH	ݡݵ[:]d4HH=E^4
    Kilka[#%^^mՖƻ97໦j[9YS
    Er|_HH_<Tߚ9z`yR8|c
    eGwfuT`d`w"`�:B�N
    ]Ea$a[Ӄఋܝ`[
    HE|_M[$K6nc-=6:F$>g|a'&b]حZ56j}c>]ԥc\҅c݂\@dAdBϭc%5N]dFA}
    dI~@JBdMdN>F8c<Mce,eQ><Eeו0囅e{u^O}3
    ]FS\X]f
    *bfc^d.[+bg?8+66?$HBbbzCfbaE[g}I5Y<"~a;7f
    |b#%hyb>}.b6b`ኦTfn~;&[aRfHfV&eK*]pZ+3/$f>cOne6^iWݞNe=㭎嬖ݯd>kVJKn{kf?kk2)k>2l1.l01flqlĞl0vl&D@v&m3mNm~~A"EY	;m۶mmmЮmi	!S.侉L202'
    ¾nnnCno*o>of\(\^k&So3?On3"4K!Mp2*##ϴok
    Ǥ#L3qp\=55
    #qq]tXZZ:ruKY#o$%r\q67+$b7%&G!A�r2':s#c3p7?6_s{s,k8:Ǹ9s78/)*t${(D(,:K:|::IglG/CttJ/";;Ruk*3usFn;W?Z;Q(ʼk`'+UaavbtǼr>`<dublW䃾cv@+_r*wm_ow{p{wO }zGw(+xpOw.?x(xx?xx-<@?O@/loyO(;yc@
    
    yyy?y(цm@Pz//lz՞~|$/&{7{O09lĮ0{o0{/0ġN|_|o|Ƿ\
    |@ʯ||̿?||>}.}ҟ2?#K}1o{ͮl9mڷ}0~l}vm_~
    o~gz.~|X~~~~ȱϟ
    A„
    2l!Ĉ
     6A
    t( "G,i$ʔ*Wl%̓)m&Μ:w'Л6,q͠J2ehI=i*֬Zr]jMǒuf_ŖmӴ$v+޼z5;pnFXjȒ'Sߧ̚7s3Т3FvѪWǚ3㹎ޭl6n_	7‡gw?ė3k37~z؅Ivw׳o/{P㷯o?Q߿O? ~]) )}U?H8!Zha?fzh?5Zz!IhX.awΖ`9W>C
    A
    9$D3$EÈk5TRYeS2Y#FB#e
    &m)qpy'%jx)g֙蠅"~	Ebf&?Xz)ji?v馡|V:jzz)ꪨ@Jz+-#+
    ۏ:b*Fj2lkbKҚэc:.Ojk\.,Vk]ދ,Z.
    x0
    ;0K<1k1<!?|2)2-
    35|>*2Ϸ	A=4E}4I-*4QKTӲMcYG.*x5a=6e}غ@<6q=7u}7qCvcW5:.Ӂr8+8;83
    ~4yk9Gs}?s+.Ȱ뭻:>;KX�n;<+H00cA0K?=[O}*k={4Q1<׫>߻>ыOX+?Wβ?Vљ@
    p|`	R` 3hj$?(N&$<!
    b.qTGb(Ұ6!s>!(!F<"(D0N|"()RV"-r^"(1L!Ҩ5n|#(9ұv#=~# )5*<$"E2,b@��;���������������logback_1.0.13/logback-site/src/site/resources/images/plugin/sampleLogs.gif�������������������������0000644�0001750�0001750�00000026205�11377016712�026637� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89av��hfRLfVEXILThpzsS’b[G;tyɭ򎕢WYJ3<wXK&ovn]S87yzjsUjًfbt~㈖B;YP9"S[?Rrt[Q~ckG?U`jc| ,���坞ܷqod?==봴etħ~Ո|LcŰ}&Hhv^xC[^q[otqߜɶqpSgzkܦ9RƆKnĸz)0ѕa[$*/n^~ǤEx[޳<ؽm̰ouȪչ饨ϺܬH@Q8м˲ϬĻչ뤢ٞ}YaHOnh,4vrⷭέҬ~ªs���!�����,����v��	H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0c͛8sɳϟ@
    JѣH*]ʴӧPJJ*R?
    i5fז_eIҪ]˶۷pʝKMb͊bMizԻI/Tǐ#KL˘3k|kϠ-,P`N
    5Gib˞M۸sͻġw8zӞ].vf4УKNسk=zË/x"#~c{4ȟOϿ6^h"DƂ6P`{
    axpiJ4!jA	0(4hc17 GpIAPB4bFmIȤ[ND[Q%
    aI4!<5B"3p)tio2sx؎h9	.0B#2BSUA69!{0jAvQzqI*B4!-9ͬ+lkVJgI
    8@�-Ђ(h҈.qT@[/C"oeE�KZp!Lp\Q4aŵRL:'xk*\|q?"l2$r%L2*|qZ*	
    *[펗PC
    ?4l"vQlu:-l%`+
    ?Ly
    ko]7= 	'0q`noxG~8i!y8Κ(G裃@	Că.OsD^*}on{؛>
    Ƨ=s|=;߰ӓ_|qA!?)g-/?ヽ/"`(@1<`
    b 2<9{@! h7J_(�
    
    l�a<yP|;b=zCb־P\G)Z|ObXEqS86鹍U4ըwcc=`qc՘=ΡxH?)F^T#_C0syI!1 .V)B;ΒKjQ=1/zY-
    Y0兯]l_Kc<	B=xS)2@�2Aoz; Ozs=Yx'@oΎM;'E6ԗ%@VS7dэlCP.ЈE
    a,齝$GƗ^yIlh.̱ESڌ,S+ZO<}C9͠&vjTXWAqHUjXֱڡ`=kZͪVUmj\*WҌfukTEB4*:
    ̢(B2aRd"D&vXֲs,o'~5%bꅘ,զhZ&ө"eAN ᷿C+ �n֐:~0׹u.t R׺ӽv]n7[7mXb4H,)XR$p*�m;xv5uL<1ԛm|R|,'1&|憽HGx_>f;K<h9ЀXcNjw/=;.2\%+9;fP*g&㇉ވTbH@fDp@6~Q
    D-P`r5&adP$F;x'MJ[ҎkED8/+V 5A`�Xb!"4B(Bg|ima	B26C�b:f;uF0Pԣ=1]}fGB1Mzη-oM)a%>L`ɳUD'N[ϸ7W|17G6s"'Uކ0gN8Ϲwsw$zz<+g:S;PԧN[XϺ>}䟲N?pNwGwOƒOƇfkui?&O[ϼ7{GOқOWֻgu%lwOr;ЏO[?r{Ogi90շw?+�Hy~7yK7'WHzhy~wz~7*(~}g((؀hw:y&y?(W8HB+LX}-|1QJxXXGZ؀
    =2]/U؃kh6c0׆_jH^xz8a{8f؄~x}hhRx3ȇ(aw(x3H؉7x؉\H8Wh5HXxhh~s{؅xȊthH`芕Xʨ~8xkH؊؍H8Xy(D؋}h똅8ȏyTY؎ָ((ؑYzy88ɨ)
    ɏx8Xx*<Y98DYWʗxK&I8҈%	2((SITӈ،]YhbZjI_9FYEu~zi|{xIwEzWs!y�HrǙWyٚ9Yyٛ9Yytȹٜ9yؙڹٝ	Ijў9oi/ɟk9~Z/y)
    �J%j(j*z.ʠ*Z6ʡH}1z/Z#Jp �zI-
    j
    ZHzEjʤSz>_
    )/J*
    bڦOZ7r
    JAڤG:cC\zjU
    y@Jʥꨒdڨ
    vʨj::YʣZzlzʩXo%z*Y:
    ~JZa,J:i	zʤDZ:Dj<
    ʭъʮh
    *Jiڤ:jʨʩˮJ:;ڮኡ [9nnʬ'ۚfjz
     ZAڪ]/z묻"*
    
    !Lyz{Q۴3
    SKX۴OkKz
    d[fjlKh۶pr;iyxz{zv~}[{;{eȃ9~Y~۸zVY	xYyXpG8rۺ}#{4If	wx˻<hK냴{yˎ
    {^	[8ekdؽx[k	jٖ8틾kbH[(8쨋k{0	@R9+|xt>ɖBɉ9xˋȈ6)K	53,ȿ.#1܌X	²[$=,i�.h:U|,Y5\y.ILJD,gܒܓMOYllX\x3|`"̒9f̖agp\˔kI[kȆzhHǠܕܫdY:\o	ĉPÆH~;W’ˌ,L|{\,<|oK<L\,]W˵UKHڳ+z	͚r1BKsbK<O[�{
    m(ڭ;ҧ:ёjjz@ۥ7hj9[ڰ%K,ۧ+D\Wk=h+
    zj&}6k+0Ⱥ	:ڊd=-:e=?|zЁm<+y뺰&[Vjj|]=-a1Պ}֋
    N<}@}<M$6؜]J5کM]7>=UCؾݼ
    {۝:]z
    x:�Մ*iВ[z=Y
    ?;9ݕmjͲbګ>~k;Ͼ	ӱi"*$ޛM/2>4~86<lBθ@>F~L"L[NRP{KkS7Wٖh,?<XCx͛Zmty}Dl4<Lko\u‹9lì̾6	_ÇFɈ~+PƋ.ŲH{ณ,l.缮Cmɨ^^,hYl0Ƞl똘F
    \1y<n|.ɞ_ܒ[Hɿ~BIw߮/^+YalnJlˡ|ə
    ߔe΍]|~f'9t^'8O5_|μqAFGL>_MR|;VX\U`!b_f?d_`lݧo,}M^T/ݩJk
    ܬ{};-*]x!miƽ=*@
    4-j_صvͳG=.k}J([Q>UmX]J|OIZ{.L޻
    -ͫ-ޣO៱ݧK?ӟӎm/-#8ATp†>LH`Enh1D !jlG'Ef,PDYœ3KOA%ZQI.eڴ(?~AJtN8YԹcْͮ(^J&[nzzU؞Y+/טZ&\aĉ'ڸҷu7.xc&r2'}ui{kaW^\mܹuvL)̖n9|epuIGv^=8WF|nezC_Yϧ_voϟ4@@T7[v;(0B;ÆqDK4DST'WtEcqF}j(rqG{G rH"4H$TrI&tI(rJ*J,FK0sL24L4TI.ZM8sN:N<l<O@tPBs(9%(
    RQ,uIŬKtSN;e3*ǒ3iSOIU-UE3URփvUJIlKoM2U]GHWuc=UvYBUhku^elt`]i\b3YfuNg][k}W\WVIwXiUHZ`vXq~`%a8aa7bXKN`t~we([-Q6ztbu97bogzwYg}6fn:h|y.ꇕVjV[˗T{g>cXm\Yjv]9[jNi:g?ǖ|r)y}FOjCϺOg5=Y\pk	_{H{jm=u7W>j;'}s!}n_<ua]u^ؑ|sI_UÛלT5vCFe-za)42X(e0I.siI*ExB*%I,#03ߏT6CH+l}C qP<TxD$&LDQD(FQOUxE,fQ[E0QclxF4QZ46TeC8q{bH8!O S'cR(DrI@ҒwP&9>)mOkh4Qe$HSy1%-/	ItRAD1	*Yˑ;A22ghY mB͊;AJPMd(2ypnV
    9p^琳f=mTEf7 D<rqʺ._Y%[*\S)hPĆ(r&QCƕ$Qy˃T/(EѓoDhRQ\8d?A:$<:e*_DԖ0eJϒFFJ}QRUYugKf5AOCC#=+wlzM&
    EMTjR|2Dj,櫒{R<4HS،t.ѮE%TZ?NӚLg3MUаӛbO 
    [(SsM[Uixy3f5;gdztVG^W.}hqMx[We/^W{_Io_%&pE(`'X^Ӵh	Pp \+MCp:\#֠/cX:p./G8KRe(?1%Ld[GC氕NSc,e(99d
    /YXJ2|'u_>3|\9NV3#yz2
    O4
    e8X4e?;:ŋ&t5GFu|bP7`!
    S+ӘjFCYw3h_y˟wiOҜ.u==2'{g~bhs:_8¶ejsܴuیm]Z־u_,ie:}ume|moW{.6k{uYT6mEq6ywŌ/<wIMlOV3Cg;x9nuӛЍ~{Qȡ^t#$8u*A]2utv[ZV;Вn{UvRWjfu^o+8g*oCH|'vQic=88֞g}ةO^i{܏P (@_ç/w
    `0	|G7\@	�d_~oC!/@0}_,2~IxSBBy'?b�@ @1@@\(
    =Sk?@	@
    ???�\4�\@T?
    <
    $@d,
    S>?A#,B#A	@A<žhBP+\B*|B"$
    +l/\,l?��>.B$B$T-A
    B
    LA!@8B4;;C!DD;?>C=@C<,7$DFBI@H6G@ADLO@QdMRC2+.DUCLCG7<#B:|BO^<DE8Lb%U|Fic4D"Fj$A:F)FGHlFd<G\lq@c6FyCaGjFkD|}nD[GGp\FqEj4FgmlallTBDd<DNBDHHlȉtTٽ=1Cz,FeƗ<HHbGɋIgZƛHIM\ȁdHtHBI0$	[SJIdəǟ\ʂJO,Kƣ4G|IʳKtJtģJo\ʮ$Bm˶DG4\C�ؾ*CJTȈ=CPL
    ,Dm4ˀG[d,ʝM@DMrD̈́TLDDS|ŒDCLKJTE?Z$>#?̍,Ԯ輍<'z/N$#NN,NO,OLO9OlO|O�OO
    OOOPM
    �P=P{=BPm(PPP	PPP
    P
    QQ-$QMQDQmQdQQQQQQQ
    RR!-R"R#MһBR%mR{bR'PR)R5R+1R-R.R/
    +S1-4C3M#S5muDS7bS9SS;S=S?
    TTA-T TCMT@TEmTހSG/bTITKԥTMTRбTQNUSR=UUUT]UUmUW5UXUQUZT[LU]T^HU`mTaDmAHVe]VfMV-xVhViVjVkVlVmVnVolMqWr-Ws=WtMWu]WvmWw}WxWyWzW{W|W}}mV]	ЁH(X-X^(X_NhXXXXXXXXf'(Y=YMY]YmY}YYYYYYYYY%؃5؄99ZZZZZZ
    [[-[=[M[][m۶UZ%
    &[[[[[
    \\-\=ܾ9m\}\ȍ\ɝ\ʭ\˽\\\\\
    ]]-ҕ[X]
    e]E]+]ڭ]۽]]]]]
    ^U\(8^M^]^m^}^^^^^^^^^_}]p]5ŝGX
    e ^__+_]m`.`>`N`^`n`~``	`
    ```
    
    F]u@[]ە_:C~a>aaaaa/  b!#N6'~b("ba+a&,&Oť0c1c2.c3>c4Nc5^c6nc7~c8c9c:c;c<<6v_MHddCdfa*.+nd-~dbIE%Vb-bM~JFbHeb/)8eTNeU^eVneW~eXeYeZe[e\e]e^e_e`f=dBvCdPE]@�^fgvfI?fkkNmfnfAfppFr.gs>glNguNKFxgyfqo^guf}f{srqE\>hNh^hnh~hhhUg^f^fdvuai:BNi^ini~iN钞iiv>⛦Bi韎ijv钾}^jnj~jjjjjjjjjkhv鍮"~&i.jki霎6ik.+8jU^lnl~lȎlɞlʮl˾lllllmnkk^k@6hanmڮm۾mھmm;`n.nmܾ؃n~nn>n&mnnoo.oVlvm؎6PmHnﺕ<8<ooo΃EpW?pOCXpop	opp
    pOp7Cpŭ?qOq_qoqqqqqqqqqמo["ok%_r&or'r(r)r*r+)W#r.r/r0s1s2/s3?s4Os5_s6os7s8s9s:s!?"d<m?s@tAtB/tC?tDOtE_tFotG't-sItJtKtLtMtN;?r9.e-XuVouWuXuYuZu[u\u]Xqt`vavb/vc?v1uS/uTo'�,vivi�`vmvnvovpwqwr/ws7w~]wvowwwxwywzq}p
    ~wwxx/x?xOx_xoxxxbxxxxUxyy/y?yOy_y xyyyyyyyyyzz/z?zOz_zoz燀��;�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/images/plugin/prefs.gif������������������������������0000644�0001750�0001750�00000021072�11377016712�025645� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a����ٱ񵜟jiԼdd綯쎡͉efmфZ_{v٬䖶GHL-0{yz|roT\˧WX^%SGkgg^`ֻ֔st{EEÙԫẍ́}|뙋x{☙|u؛ɦ9D􍂍ǴޏҬlmtUZY^hΜ۱KMOvh\]bIpXWsnb_ON;=Ǩww⼼ϬĤ�<t꺼궸i?==<UL}!&q㷹ݱطU}ˑȁƎ濿ΖHMRUghM}ݷff~���!�����,��������	*\ȰÇ#JHŋ3jȱǏ CL8	Zɲ˗0cʜI͛8sɳϟ@
    JѣHWKP`U2IիXjʵׯ`ÊKٳhӪ]˶V\7"\!Pķ߿LÈ+^̸ǐ#KL˘38ܵV%ˢӨS^ͺװc˞M۸sͻNt*<'8YHOEВJNسkνKh)TXCҫ_Ͼ˟OϿ�([$&zTQLyd0bfv ($h(,0(cl@8
    :\HƄH&L6PF)TViXf\v`)d^hl[$x|矀*蠄j衈&袌6裐F*餇n
    _<|qyY!jHB0!C;,`*무j뭸뮼+k&체nApV+>1k% ~\+֋.7oۖڭ!t"3�AZ`a. |"O!
    S"3DB ,g0#2%5DB%DR%L08s7w"DmH'L7P7
    TWmXg48#0PoT[!fL-B'1
    W`'x/;nN$fCA$nwy	Ԁ柗nuꬷ.n{9P@7?e&3EAp�3:{n߃�Nρ귏=Ch@yW>@ПH@L:'H
    J̠7z|	$P"o %,p=칣 +0	W0!8ġ<"
    1a¹G@,D#D;20 e008 0))N@:$.!GWqet1D*fqlc)FYb6X-<'IJZ̤&7Nz(GIRL*WVt%h03	.B"ΰ9L&CbFf@8�
    h!P0C$p�'#Y$
    wHУeE$&@zlQ4#Q%Bf8
    DpJ<6- ?0&Pkfsg9-Q&7/p,j(%JWҖ0LgJӚԦ(ͩNwӞ@
    PSh#$a
    w\2`$�
    BrCXU'V"YxbZ鎎dY`�Dk%b]B$.7•gM+�"ұ YV�X@^�4M-`;ֺlgKͭnok
    pKMr\X݂HT,_Z  xū=PLcf0p]#%$o$ʡpoi�Wub_zh @$0
    
    g1_k0A,Z@NW0gL8αwcK
    ta2;@huP x9sgX"1
    �`z>pa̋Aa_fce8S*Hs#f9}.srs37 ӠGMRԨNWVZ˰gMZָεw^{:[t}0U.ͅЎl$Ty}#~hpޖ0~	0,@5MOrG~㝍�`w1C${C`?sK8s�7ͭor[`?3'rc܅3Gq(OW0gN8ʷ`y&6|6l}p6'41Yhb:`e	`5w*ЌkqJ;
    apllEhFfafs@$=@=1p�~@&oHpuiWgOϽw{NOO|?L:{=/ѹ`'O+@?:
    @:wП2Xч
    OsDf?z
      ~~z@v
    'P'P~~��Ѐ	800P8x	'䷂nX	8:<؃>@B8DXF86JL؄NPR<jsZl`FW~/Pt	]peHߐ	0	߀tpxw5 p$z8XxzX8؈8Xp؉8XXdv[1pl8ptPnp	p	�p	 	(88
    fg0vw@؍H3x긎؎8Xx؏،
    xnP0i	R1IuБ u@3p((yڠ294Y6y89<ٓ8i	@B9DYFyHJLٔNR9TYVyXZ\ٕ^]ɑPyhj
    	nQvyxz|ٗ~u9
    f  0
    %	!	И9Yyٙ9Yyɚ)	9Yyٛ9Yyșʹٜ	 	Kyؙڹٝ9Yy虞깞ٞ9޹Iٟ�:Zz
    ڠ:ZzpP":$Z&z(*,*ڡ-:4Z6z8:.ʡ<B:DZFz$?
    HڤNPRJ@:X\ڥ^`b:dZfzhjlڦnphU*Yz&|ڧ~vtVʤxzڨʨڟuzZʟj:zJjd{i`ZÚZǪzɪ)
    ʠj:*ڊIJj_ѫZ:Zca
    ʧ{ɬʟ	۠⚠
    ;+Iڮ[bKa"$˱Z(,k+ jajK)=˫
    AZ>B{HKIڭK;*;˴V;?K<z	j;05ۯz+;3khگZlKk+:ڷdh˷|-kuky}+z;k!븏[8:۳;ZU˳]뺲K+Ya�Jt/[{K,;['[0uۼ[z۶kț+*KڹKzJۭ뾧K:;Y;N[[]+j/&ʶjs
    {‹r{,ҋK+
    ̯[n[#L–k|/[û[>˺:L>k;l6 LpZ\U\^||2‰,]\j拸We%qßkNĭ+HK,ȩ{Āܺ,}Ȁl,oƛ{ƔK3<Sof3{݋R;ɟʜ^\ǔLJ+
    {ȿl,Cœ̽x۲+Ƙ+1<Lb<l5׼~Kތj[rn΅k[5|TAˢzQ6[LdϖH*	:'|ZwnUѲz}*,]깵2=-]6}ea3,>@B=D]Fͦ/<LNR=T]VZ\\`2b]f}QJh
    Gnpr=`8Yj8|:R}=؄
    l]؊}؈ؒ=|؏=ٜ|J۠츪mǝڮ}l3JF̠
    Lүی8>lnj\Nkl¾
    7ZȡMȌlEl˪+<H彵⪱Ԝj-mÝČ{Н"<
    v<
    �
    {M,mͮ]5MݸkN+;ݰ-%,6$N۾W_ͺ<~T+C;~P9>Ӷm,Q1@VXdNS~::e~Fl>,}p~tz|sw>ք~~膞舽֐>~R]^>^~ꨞꪾ^"t^c뺞`� W]'J.CP
    [Q
    CjC..o^aqKHNΞ	XJ~>NN
    @4po	/=#%~m.o.0A
    I]=\ML\�n^`T/S_P6O8;ȉL,^D-JðϬQ/ToWOR[ߣ0.)=οEklɄ^_sO_x�Cȅ?Ȇ߰=Sm?ƪ׎ZsZ>^⦏b/⩏ݣŜȟ?~+I̷l䉟_Kkܷ,S\͎}̿߬
    |A	.dC%NoX5nh@!E$YI)UdRC#thK9u'ʂ%ZЋfSQ{”IӦTYnWa:BYi[qSRY\y:_9Ra`رSV>\#̙5ogСE&]̖U>.kرeϦ]jWoosO^qɕsѥm>uٵH~ŏ'_yկg{ϧ_}!/_`�p@4/~.#pB
    +[P2BCqD%p:[tE<
    _S;cqG{lhR~,2~NJ1G(B R%W9)s̱+H\ML6/sO>#2*$,АTBT>#?$NЬdM4F=eΐ4ISUJ9t+M#$S\uW^al5WYitQQA^u_6*MGUT;봕T8K}gh/ֹ&Uw�=Wtٕwޯ}xw_T{˗_Fހoava#x4a37+7c8dK6OVyeKJec6efsyg{6bWkm`aW#hE:i˖nzp2֚Wl?UWzk'zCN1\S[lIpOoTN{p6lFZōɝu
    rf	לJNUk5Vщ=]BD7Îueq9Ա!//>77aAw~[b}痏~橿?OYde)O7pIQ{yg{c^x#^)>~3`W=9
    `�y+!Z_Ⱦ/^f?FC!k!(C("(y*_rg=펇c;у"f5Nt%7-pۛxǣMcRr6<2BzX2G�R!E2Rq#If2,$\|IPR;yJTfde+JWR,myKᜉe/YSK_S\0yLdfVLhFs$ϔf5IMkff7Mog9]INsTg;NwrA=yO|SE?OT'-seBPu2	M9D	6DG=QT#%iIM] IF7zRT1MJ+]^Th+|SUC%jQzTڠ	,O0KtLZ�[jWUUc%Wmd5c
    Ys@?qWU{k_W2B2WVe,cQطz.;Xfֱ^
    jVc=KxN6ilhIZm*ha{њ6S-/YkYRW%nq{\&Wmg?FWt[Z?N]W%)~e)炄mzT4]_ p
    |`'^p)GX~o|k	O07a
    [X$0UX+fq[X.q[\a
    d61_\IF
    2Wc#oqSr|+Z.e,"|e-i^sf.K6{C{s?ς.
    }h@d/-@It&B;tN|gH9&uM}SԪf5]S+ѠUjRzԺ5kjNɟ%Q	d'[fvgW"nvlY̠lj?;VeF&-nxHЦwڛn
    ~O{7a?@pG\x-~q?3q<'IpB+gy]r\3W;Ns\;'yMJBC'zэ~t']K͵=_G]SzsWaz׽u]c'{DEv]s{y}9#'|
    x'^g<mpy-y_>y3%}gRj ]z^ٽQd!HF}{_E|'_}7Â}/_g~}^*͏_Iݿ__ɩ/?@Ԋ<@	|@@	@
    @@@
    @@@AA,A<ALA39|AAAAAAAAA B!B",B#<B$LB%\BxB(B)B*B+B,B-B.B/B0C1C2,C3<C4LC5\C6|C8C9C:C;C<C=��;����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/images/helpEMAIL.gif���������������������������������0000644�0001750�0001750�00000002517�11377016712�024733� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89aX�������			
    
    
    
    
    
       !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~,����X��@�	H*\pa*_$h\JČJQCX㿚Y+xv+x1.':VcÃ$
    EKv!D&)ӯ_6q4ۂd
    MYU	'jjrU:K+T"͝Nf<E61MLt%4٧^ߊM:Crw$h-OqKQYk+ܩj-RԪu,Ź]nd[n;ëWyI>3w1yb	T4zfW\S
    4_ih&V-D2.ĕ$`BFR	O
    3&3Xx|6\T~3|ݕX@|c!S<M#ZZYGZi4M($6R^d'N0e%xed
    zd}֤e|UWQSCYP5ֆJeN	[	ae3I~5x@h'FWƅvVqQHt 4Ѩ('FdXy$b&Ԕ@V[݇\儉u�;���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/images/myjob.png�������������������������������������0000644�0001750�0001750�00000004644�11533152140�024363� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR������;���%���sRGB����gAMA��a���	pHYs����od��	9IDATx^]oG?edQ
    ÝpHn[D+XH 4RB
    
    ,
    2H@ 2\fv>cvgf߮חg!Eo~Y2k'4 �rz< Fp>+bؾTt_7yWȰ}?}:uiF\ 1p.	\ظT|iа[Cga˥o{><`Dm؇
    Q`NLO.��f50{kQD`ka&ZtNRQ[קsк;,.]Y	׭L^m΀A
    凉v崴yu]	?ZV6UFS崊ܖa5IU5)rҟHN+nm7ޜohn쿊[zVox:tlQJ {O+._{wvdof}!._#9
    'JD@eF҄ЗWMTy65!t-n6qp+Ӏ߹+nfB37=_QGJsf	7eZ,4 O>8|(ãc[s+ʀ9>WF%hr԰-$ɴEC&4_zI.}yق5<2X}NΕJbhEkqrG(PwD(>LI$EY6u.>&2߂[$lI).ݎ*P`cԳ1P
    OΙ
    OiYc9KJ?
    t0#7W,w=c1lVu{El=SZj:	�!N\t2$yFdWX
    z&@aUcP͡>;ϊTp56ʹ66ẎIJƜf70Rύ\8Bk;!GW6sx(m۸"ibks;hEp̤;yܯNhb*aAH< ,	iP&+U;LKfA<)$M�bxFi{#6M2V;&qԯ5F+kX
    'gvǷS0O.|"F�mvQN=&6ѢMc2K+e,Z"YqLz@*e5ESf%,M V2(9>d=Ď_90!ZtM{ƛMC@M})\UL>{5~VdH3YIA[tUL6>A8]{+c{n6IbɌ2BhM'"#\䯘
    2JPNˋ(e<Ҍ/j=57(i+c!ਃ."wuC+^lNqYHhC@$uӞWE~]ms`iߝq5<`cIy1mB-?+jě4tӈK:΁T8zQbZM;
    ׯξFxV#19KI߅Wh.h/ѕKbi;}WxBTbEV4mBvQV+1:	]Ӗt|fϺp1t|pH!jǸ)*I�i!]*J
    )m	լ9.Ni-SjZX.e`d:U:z{xN}gW|RDTZU.4b1f8eĐngQ-C3U=i_47q8a'yM<mɊ4zpȺ_BC1T.ͫaYB 0nBŦݼ/h1>Py.4`keiiw3"B3d+bo�2:}?}*wSK	2c%:]v3;7=U#,{__.:¬CF$2́@)]x!	W]h2Afvf}JiQ+pDAam܀oeZ"rQ
    _Vű+46j /ΓסV8dOj$x'"|p9<u5ct"H)bJNSt#:?yG]tD�96<ʻ�r0l^yӕw.#`ؼ +"\#iGy@NWE@Gӎa#pm@@����IENDB`��������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/images/cyclicView.png��������������������������������0000644�0001750�0001750�00000112067�11377016712�025355� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR�������*-\;���gAMA��|Q��� cHRM��z%��������u0��`��:��o��IDATxb?p32�=+o~hbl
    J	fdhQ0
    F(`|� X�3o?N샊(e6\~Q0
    F(`�bhC+܇WwBòؕ`Q0
    F(�xe,�_+sjH<xpU?hADzQ0
    F(`f�@#
    Z
    ](*dx/oD(`Q0
    F�4"Zl!A[A\ǯknX~:
    F(`Q0@�&
    ޒZ=ƭev/6~(vQ0
    F(`j�@#
     3K*~c7\)Y`Q0
    F(�Јh2Nb9ɐMӇ{_liQ0
    F(`�	|N( S 0>Z,=.K	`C fA5aXIX@&% ^q?.?@@?Q0
    F(`Q@
    �sA hh؇E؇q8	Jhy(v^/K~1ĝR^\ZkìX՛#&\g%c1r+֬ZpΧYng<w<z.]p\Pe
    w0K^L2ZSl35((/O;_a w[n$(<	AxafC,u]
    >Qu\;a胸:*ﶼ+sGR_H!XM�n 8sXSۑt{D^.;~=,Qe%!k#P'7TPZ}Hƈ,iiuBs�TF	e$cvC/f00�읱
    0sMŶNVDuY(.8TӦmR[!d	>{Xjjh0kT޹�UQiCs믺/|FmH~\bC)ȴLH)ioaNz.R
    bm荘vwb]F�K3?Fd5`;s  HK�vXawCJ%4P*LĊx":r6qܜ9!&7SEU9MSq�jH,όu<iF:;hoMOF'^lrT:y>כih1yhk!L>ey_Us9_<>m_lqwP;̲bmMЮkS()`NJg4om^瓂JN.X^rKAAK�_av�AH,,,``ea	xRleGPSJڀSR1tom'yY&7:JCd3&	zi0	k۲}So-�^U
    Xtb`c~.M0<|U]ʨ"ԛ~iVc	K[<ljV>L®q"2$U9 wQ9qrQ$,Y]ӬW3*>s]-ܡs @`/~`y�
    b420qpwpsq"q%!$^^KRut
    @DO.l-JwF3t\8<E*ɻwdxƣ(lճʾ-}3&>qfǏq2fSpو#Hzlv<ZA�kij/34\xIHrjfxlLmχeui)%27<X et 	30͂VHS>
    V
    "_AA[�n% T&	It	Q-ttAuuTUi%?6g<03sHRYƸv4>�Um[rnOMwԵb|RvQeb?`[UwL&Ocδtܚ,Fַ�B\F
    :kOgꊫN(1M@o]y?{g~A ˧�57s4\PB8a)V�,&3F֬&)"d$ݵr> @Mi+R	>lH@F6·չ!,B̯A7t*bn*$p/+@?w,
    aN.i\l#iH`pұSg7G?v{
     . BcmKO$kcG?=q9K@O~+¿	y{kP>7*,;BxFJgp]UKSw5c[lc靚9
    (QjX̟e(&_+@|5%:%ފ&[<aV<Td
    ԳAu}[er݅a[~.}kթfEy#{B&2Qe?^F ;A뫒a [af9*	hK37`C.S3<lXfSgJP(
    s:
    P4$mU̝:10	1 !uPR78!iӁ7ґ,Op9m)EO㳫feQB<wԆuw?NeԸ4.n;j)+0rt	�4\u)`jLIiXAiWuzyEMj6;c̔b)OB\W)E3mGWjC~
    Kg}:^zVR}WYPloh臃ƙ8b7tGal�fhE!%!eT&Q(%+|5p/YpAB
    VUAA�"}TކT@ 6
    $aRZ.0Hp3(qtF�+tqSGbZU(PM\o||G^fX}76;qت,ib[q@zӰ躲{hZ)J#,*S?|AD1
    3zI܆}9
    JJ9+j%NtpVًnx+Ґ_ېpUTu=׋=Xb>LӐ1
    (x?vU,RLWt@48|,T#,ك{G!hkaBUc41J
    k&Sk,@?\	 @ -�{g0GmZM6ET)n>>O* H-RۤLZ~ᶃ?#N
    ,u?[SS>>yVp>G=isy~	ñu0N]_`+=VZ�Pnj
    Mv3^'GC-*W6`pU5tҮޤBm/)5oJBayhOwz	B./gSgeIy#Ggqa3j6<Mc7(E$dT12&)%^,UPAA 1(#SazԵG#hk
    ?,+DŽⶬ`0/_w>DQsgn3iPM	.Z,,�6X2<6"MHAatӹj$V^;9/|gg_[f|*�~Yr_?'4uQdAe#	cAT/Ƹ\=C
    8&D琙D֋!uF~j6u_.08@x\L '[Ǘz<nER,eSC_Aa.]'C99e
    3'ΜB?hէgm{?nk~kp,o�*܍lWʙ[j.2M1cc9`PȌ\C"խQ5�QdT)
    !QQ@CV _`q(IC~AP	1�R7�\�#p�biRb*Jihq"$<(7H%V!n)_mUq'Arq*XhחBg^~ţ3RapMٲoam[Xȩ.>[%i@k'8+i"$wy,<Z5~40@Eӊ7+FuTi+K)H,5r<2z&foms9h(!Ҁ>t  2
    &SKI-&8`z&!�dG]eѿo
    @ sicv>ı-H !v"ˠD@P
    
    $((H" Gl94S\w}Ө,." ǃY7,ts .x4�<r-Fo9th
    ˣ|.uDD?^<['9qC--
    Srw<i&[ƠdfjitVQ"nW[c=<~l�Y!;[3Yg<.a;U<D
    4jr("C
    &:�fb
    tLʉV$NL%G+yX,nc[Su*MA7~~BP(
    ?[�Ο'a wז!Đ@LBH4
    _A?@h-w޵n&{{q A˗8HSѯS*>X@@iLifPlY_*2M#D "2g].K9ӳCd=6;DZdΙP<fTPE4W/r#,*nK59=ju*P0V2>֜:fBLHO؛@,l`:UinOKIDDš{
     zP}"D�&ءmbfţɒUEa(,ŵMVPKm6Y})AOй_gN^F7EDHHHOysi°/mZJ(Z1"!<��R&ѦVml:1tuG'>#@*RY m#Irj)\:Z;GO~B{f%}a)25rݟU	Uk^.LP&эp~yk)L\M;ek[0	u z Cs.#Dr`*lЌdK;YD[| 	uؕ!0I|XIxC1qmn�K/mJ#9Ր
    4e��ۄYXtP�
    3ӅLVxjѶzvXQ|\F繮;ޙ	-=^Je4#bŊsYiL2)IFTfQnJ7)E.\*к4ӼfI+w*ȁ	pܫȪWp*R3w*IS�u'*c
    a)0=x{p/.7ַԥb&̜ޜSVDq[f1I2ey賫#t4,@3gEA@4|Y+-V``'%Ā8p\O⼶iV^E h8,edE٨ͫS#N3�UQܐgB.LքRY$KXjH2,""=FgX`Pam| CR5iC]t8k_Ʋ_Nv~{y3gi lbn<h0B<
    iZE"?^P11nfYN}~4|X`ofUl.r|komUWŗ2s)Bu)I捓SX3mHѳ+㩣ł.ܖ2
    }T=kx
    H?-
    dһKw%73�DXhmjO_ܔw>]o<!.Œ�8BG#t5>Oѥo/LZ&jef[YrtxҼ!O%NaoJYt!<KIĖW./
    `RY`(W{+#�gWˇ4M(i~R^hHt?nDX,ۧH$[/& k^331ccy|b]m~S]+&XI3>[yQu/_{(!0MIϜݹ'dȇ,9ԅE12cfeW}O+?XUrnnvV9#VJ~VSfYY}SQD]۝ӷCLREծ2,N|٥ÿ&c`bD̪nkޯb,-׋ߌ19'o>vnf
    
    ~Wffdϧ#=oߠSﯟo�6m75`�3p,'_fV;3kQp֭ٳgܼy3^||*r%@K&@4Mre?~b
    .ů�S=ȣG։_
    D3�_d.g7
    F(D�]oA@WC`Ij1޸w
    9G;'
    \Li-EEwzy3f&|<>n%ş_'!)MUxSeBvgjƢoĉknItw_?Q.g̶HbpP[CQ$5qk~O.)b"4/Byl<PG66n!#ʹ}+3r-L[{"Ocע+_ȿFyk}W)BXOFD˘}Bq	3+@Sx0VݗЯ!ҦC:�['̜r穁[15aJ)Ąo6/3JǗ0p<+nZk�JӭVlJ$@^AfrlȕJe1Z.8ӿ8a	 zm4\d>hK\e4uC UB׿gK-L&qKttdݮjV(ܟ0JP*t]z \;2f_uW]<,_߿?!e'bBi绂#@Z
    &!/6nĈ8x&
    n7#n!AV%]v^FsA�_ΔK?^觝쌜_}Ke-I	F?֋nWЬq]6Jv:7\�a &ip޻n)	)_~|J~}aQ`ceЅ@'mt-~汔wR``b`FoS8%DYMM
    
    [`HLLѣG@+d<|PNNH\\.l˦>|)܌Hn%Bh��
    i===jmm-
    ;A:WDQ0
    F( �`V0Mb	r*_|_E(xi =[[D&$;ݝ1P{k~B,|;*v}TMmުʦY8
    TEB~E&3v/!"jV?2=s	 }Ԅk˪z,&ȆSӮH-\f#m㔱LIb:aY䚦vfU8زp8i2L2},]we_h0<L/m[d)WRSa5PlR\_U
    L+ kB;s^Ku<�Z-2ޤ$]}""T$_ZɤvMFVvѐa~|=g+Tӧ�]J@Xŋ,}^}$ћ%XRVmL15d7n6QB!eA \x!F>]1S(	O4R&(4zeX�3?UY%xWp@0e$	J]c]łB&ŃEİG1 %D@�<O/ ft!i;n̰OZLۋ)	AL#26Qkv3e%Y<i^է34}]`ԻcG/ٓ;(>^˶w+]{#0x~.f¦nHP.(-
    @L͑#GboCVKT~-h4@rLsm|U?ۂOKcOU*Du~4Za=ˑ#Û�K`ǟͽBM
    "ФBtI:ts
    Y<ud(TҒ9g뙫ҭ}a{x>;ʙrwdŤU]뛀2nz&jFCtt->}UD4,ծ)tm	c?1uY:55�N++t80]5i/y%;mDKlskb�PK@R~ER_
    9DEc|G
    b[jq࡝H (IP$ɴȪ(w(>29ADA`cl*!IQgfIօza:#~WVau.M7dllrl6d,"L<oOR|M!(^28ppzӊdrgccxm㸝)(YڵL&�QqOs?@&ā8©'mF[B3-۲/iظ628-?Y>XXdm~¸c5y+/ԥη"wc	"`v7E2| z)k$>G\hm&d@=N`J@R5L}H\
    ',I/8!#+pMo5J?S
    .'86I)J}큫E<Ofp++hh#s(рڀj1vͯV9iI ]%rB\"Lj"ӡ#y}9Z>^WX΢GwTz&+-SA^n
    [jRL柦QnJf-ADUq)RH(˵Z"eSTZVx�Vټ_Js_y^'N?eZVClpIGۉj|@ovw0qGϓ?na}uw\Ym>u]!WH?xsϮ};[&1>>u _~=s_3	HKE߿obdddUu�bp8847fiW7M׫Ka7
    ԟ}fRgY_^j~ǭy<`L_|x?qKj︴E7z"w?ܲLcg''+#;쏟Tezs7_s_IXG4(NXAiŗ_e~\EKMQ�;##3xIMo߾CR£LgCd۰swѬY-IKc+ ~Ac@oooII	3�mS%A2Q0
    F( �x#xOb?+Ū`Ǝwrڤ12,r,R?~r.=:_uy313ďkxa~>1>l'[y'9gSV}qEE2>=`ǿWP?ɿ@yj)%8x`&c_׏?~`dᅯE~ce~_01?t귫Ll=c__>^r}|7ۗ^qrq2gW_\n;Qn&&NvY>%!Uf&.Q>vN̯c}ޏ_5�[`X`Sf„	..%z		(\Za@Ef9s怳ӧc 	* j3 ;hkL-,, `J	d�G(`�kAwiւҴxHEecRDDxI	?Crǀ m Rvvdef:`[%~`ax<wyCj$`I!O/$)$jHRop6?{B}4L
    ZD/Auʫ =z31]}u}}%.=g$O4lRΜ\ϙX=h}:;mt2;6\XVhB(5
    @%,>h-MOm-r:kD׶|'Oq={茼۲ٞlo'MDf3*C`qc۶ӭ^d(4M,�DvT1ʷ5WM2}9s>{I.Kdኂ6m
    sesG_cbN<{EZBK$hQUP}S*zhphECaGtJt!JT.ɢZҟRD]"\š#Qqw-MQtl(EݴTjq(U!X!AP7,-C~
    $P% (aҐG_{$"Zg1Fwlx<
    &L'^z@I("q~yM\$,hN%6;%ۀ#.޵kb/Ƈ9UsNp~_D*M�{M`!�(#L^n=Ba-p鞨&6%[D硝v0wK 42W3}:0ąZV笖P(K)}Q}M>8t5fsZ^CEV"/P"8LL4#mB+vfר!3.GX9?ۍߏLz5Oq$Rq6x+%Mo,7
    RS4N=~骂=%|0]_t^9(bng\.�ÔJ6QkJŻufZ(˔.h7]6EPJ8atѱn5rٱ+JX,Ѹd2Md4n7⸍ @�kAg&3nF⶚D1*hxR={[{oZ"ك{PۍF%PmIvvgi< 9>
    ߪ}ܭ;)<to%51"4Gf`I#%R
     
    ޏSHɫwA͝%A10\NۅR9I._V)|jB|[W镻(egaa>t d&�=IMk/=:X<''jK{X_ۦ7j[
    byfpfDa�:aQ pw�'BJfOtF:эi/^u#;{qƻ8TN䭓{f+>nH"`"
    R?Q@{bb9b3
    iO!�{gH|LøʸREzv*x?={\EmuNd3z^EyN	yISxBUyU)yQb+aBӑGZoMKU'!R&ǝ<ޛVIW+EE$LB0Q�Euc-`Sr˟b}2i,7?E0=ZA94#B|qx%2zUFFdr
    Q`Ѧw]ۃ}Jug$v'7t仵?,˛,nϏ/]#(<Ӓ^v	4:Fk4	z^tW>4w&6V{+l5"nT-(uE.X~6B^
    ޘ0 ۪!}ݶ';{(|--$"qqфqt!FI@#Җ~k\tg}M=J1JZҊ*Ȅ4W,_S?RGYZHR+LNB!4U,eZ,GIb}bR,NR!\b-jIU䅵jOl4SaԲk11a3=$&HXz6		DAeyY"}7o#oztwa.T!$[ϓ?c؍	!kӄ0vptb!hBL0tuUJEh)/z.d=vJ̨#[oҀ9gI4(}Y=^pv/7'''_%�{g `df7/>GeYȜqA[r1|IM۴O,,\Z``6֟"p.MKanʔ^i<ˁVjM`[6<~s#ct?XCݣ2r4SJW#iI>F:mv;+b/)M߯Uܘc,f:fu\,Ba	 *.H(C36Ucq 
    睋ëa쫢	뵺``(@A5C-@(P&q{J_lf;+gG6bQ5kסw,rY4a˄-[QQQsILC
    @	6vwC&5F&-*SiٺѸg=sgL^SONA !s9*IF
    )	~M%u/Fcm�pCeع�Vm<Bv1@`1oBL3xvJ}e3J9$Tgx;T![jSwEbBnU1{3RVY$( db~σx1tކX嬒nea3bLgL/?P>5| ]jMkJ%]gp.)
    և_cb˲:v^ZH+K+>`u�kJĤZAL:Qct1.puttrprYEA)kږWpn`ʧfK烵{�*ߋxX]&>2䖤qh
    _QúGŗ~nj_}m)Ų;Rrܾ7;Fv\ܸצ[S }.ZgB*.[M(nز- @#w~!A4&$ђ(J+dt*#=%I)%'`dA.LB<$,Tl܁&yUฅZu]SDCM;f2"ye,
    + LRyP(
    _{gi �|{ټ.9QEb@6jaB
    Ę1eZ
    ì_^�yx@Ky+4
    j|;rZ	o2`.YS{�XvMB}
    1ȭ>L!+UZ}h첪uxX�|>BᵽkN8l\6L߬ۨm[6c4dX+�D0EHfWcT@mҳ{Y<
    gҎop6HfGmn:R:%𜂊HҖWÜ&MGJQv$!,E▩Iq*ItC1a#쟵,@3Ip3mGd)	j1W71<zb $ZQZhigWf뿜ÿNwuZ]1g4{J/z<~:`PP0騃֛p'biK)%7tmvG_oJqY-6I(B`㉓/RnYmf?+`^4+[8S]e\t}o{+3c,Q.�8@H7fb3q)_$L
    wSijB4G쯽3Jp6[LL!F4ih�?S9XLl>$�bC0}|| YJHHHHHH$a�iB.77'/pј7gFAL (ЖrN9ހ}{,~?`Z=i3\
    gv6	ȼ9d]HՈ6lP;U2l *r2޳CQc5>]]`7YM;EnSx%o
    <dӾX&Zp")_Vj\Se*5-S`b+R=uV@FdnPJĕde\zԅ6*ff٘LvLY&Aul 3"@& jB-I,IO<^^y<;_w7+	DQ̝;#B+*rчB6eE-z=BD h"Ȱ#B	iMq>L3k~pp8O' +2]va=wSYv-b02IZ#9#Z("^2?^geeD9c&5:0BQ+ľV:|ye|!غl.XjbG1HZaYvyt
    Y(ULJb1KN=x,UU{�x9i".ҿO{il{d|>Kh42RNi+t-˄dSԡ~ʄBi*=0
    ։Tn@ݐ!b(/68+p8ػ{(-$DHjDM&~dtcv3WI+JK{jg=g~?4?;Ĭ!D�ngק�n܄fI#A1»K�λ-0>R=Y|HVv(	b}.vIiA:Su
    !ZޠT%kAUKys^Y,*ǺVD))IiyUDbL;=s5i[S-YZNgHz*,#ЍYOa$BraH2D{}={-Juy3|觖,\JRT*}ν$D\Z)p+
    &l$MWRO„Qbl\-~M_4쳴^9j
    PPCH&W=\nY@ȴ\`&iq!(5s
    t[ȮN
    P^wgsE썛}:mU?'	lQZ=)VpO$Yɘzq- [7,wK"?	
    4#yn0Y4`e2˶-4%ERi׺T۫B\�2"-W#E(TH01i KVi5 =:әk3 Dz0�dkL&d_;w � qDB?%Zh4146"Bq	ʔ7KUogˋm@4
    N D	Š60u@Ft`!ހʓ}J٦`Qe]G~Z^1N'cn]wgVwQz9A
    =M4
    ~Q]j,t=3xuP%diW\!O&D!KaČ[<f;kzt?y4dch>"(y뜙/ѐGx.<eVi1I32ۏ5i2)%F[d6HB&D"H/?w.
    `N|\QEŏI":;*"hhJ{-w&Ĥ<o?3d׮;I-V-Z	aSЯdUZd9vdnx2P´v,m8TZ=V鋾=Նk\;#z~+T)\#E?Qm|((Kڔ$HA7߂kV	ƠQq%
    8^|v9]fee-U
    kB"ޮmS9lMoڤ[c,1CTԦiRY[{3ד\?Qrfs;zձO
    @ /; gL6-oz{'*ZJM66٫\f==ü?-<ݵ*S]}0םu%}ط[YUA΀n8%$U((9̶]ZZvZin۷m9\]kFGB)^gTM�vq3όѫzSh~
    Ɛ9CMS w.OM$>!:!X[A:xEF3uNx+Y855w,p(Z(C8۠^g{P]Jb@Gƶk$D"̗�MK@;iRM-5*"(HR
    	6IΚWqX==[«ޕGu6% +-=^w6FNj\MkWE嵄UA(?L?[1"xt)?*V!ԑl"e8@ ,TpAyFalzOŁhB"W%,%ݵrvܿCFiڿ
    N.\*]$4sy2&=#Gl6.?&fs-^/z_30B
    Yb*ȤF]$sDI!#i?|iQ}ʜ`\V0$[kQ\t^}$ŕO#xA{A[Wt2q3t3"dB?_j]ݵ~~EZ4̒PNa,CE,yFFNU7WЙhP!K9+7"R6kT&hBa5f%ck^4kM
    7?
    ޫŖvia	8d"ajAFNC?jǷ=sZ9;.ߝW7r?giz2yGZlҜNqB6,hs7;~Զz%`"	l" LϕJkĠP2ޘ*AO)'x؏;, 
    )[yjBrbdddddddd_;& _
    H@h�K4A$DN\03x͋'/	I1GEUMl{޸%0$sff2_j-5`	/Laz7p԰AxDՙ
    ]=
    KjSi=V6+z-څ;j8x0\,3z .-;{2vYT[}^X҅5|m'zbڸNjeWթ֧+A?IV{!3Nn7x»;mRN%*�Tcc H6R(鐏gVIs Q)qd	X;IL<2_ci(BN3ʿۧ/Ԭ*%6UJ!b<+j!Q249C~8֖-"RF
    kNNNNNN_ط&83CPEY	U<>o!&xHn1APRҮݙݙY	><w&ټξY,\�y&my7{mal*k\y>]yqHy6h>g>V|1?wBa~+!sb
    ķA2w>_y~:9燬4[6Z_&Wkf$`Ŷ^(G{a1{lL	NY Z%K^e&'=q$qJku0R0x	=3<k=k+hΨ
    f-jG_C.;HE.8.q$uc~ά2Tl
    \dVɣݲ2[	߼SU%FP(
    �KKa[4siPPMQD[P(ŭ_]7 -R41$Lf:3ߵI_8l4,"+'wa,!လK*mH36^/ocH
    p&+ɪH O]Y4-A25Gg�޹(XJuh&nؓC{
    `<۟+O�[�Pm_=Rٮ]h<ŗaYԝ[p/>k|ֶvA1RGPJ8
    SAlEmnY$mxa�qN$	gHV1:iZ4	@)h,o|H-j,9O˨_*�N4ƑҏRH}x@}*ϔT[Cxŀ"rrrrrrr,`z8{n]׵SBh&&}01<ģUh0Ys.Dܠ۴㶽[sr>6E"d>d0WE"sDkω}*)|yz:Yocg~ASޫN ch{ے]>~4q\돠U/^sk%7K7B@VwvYu9|A1OKA)fVA
    {gq
    sWIiֆON>n~7|@ulPkfi7p-ItVOJ{sx6+br^vKwkHR2i\0l#e*YBPx/	]f֏Lرx4nKS�:qoWك8l9O
    Mq`y]#H$\`^v0�؞qBE*`D7xJ,X -65jUZQZhJ&؞lѷ8~Ua<"t<,byGBOh yUwliG^qƩ;6pν{>{R%CjasQ?@QnrAIlbyz6
    Tonl&R	 l
    :MzU=No;ëmR
    _VOYۨŻ#ϋL[
    gECS BNhn'~Y-UhW
    jN>EI),8\)jGa~NHLg+	2/Ɠ랯[~L"L�;]C]3EAQJ3P5ޟExbXw'�;8p\b[Ď2M7
    ܁pf^|qx
    QD(R$Jo]L+99)c+XFk;}Ӛ"	mq
    Cϱޜ`$mYX+U2rtq%$^"u+&Cj_@d
    ^o\^DpJRvP)#'c٨V8hJ,|A1
    @}I4}0xv2}52Y8ۿGwETܬUͣ*QϨ{#:
    k!|靭f6�G*]:h빺;EeCpylx3
    e$@.�C.rE*j`q<'QLD[YVfM7$ɊLnMwiæRT*O}޹$DtfZJk)W\)~_bb\sa4bbxKmg=f�,N"Aܑuk;@7Wb4ޢ9(NŊ,
    p4RK]l7o6r7xIZ~'Vsܻ1}V![WM+�ܟf4\q0TFEeXs�^+cI$$j+wVs T02m0iW9|Np*R-áYTf%
    鯟O 2E\cuQr?&0
    ֻc 2`7�rYm?sЖ5q/L	cB/Q,
    <dxMHHHHHH
    $q66`ɓ77?&c!р4�adm)K'o`@nzQ+IjMۄR	
    bxH	`2EQ+dl`5Z�&(Vc~Ea|n|"dK ø.aAΩ1{߳\rj{R- j>kg`س8VO2O?7�"di0I\hW
    (.52ͱ3z
    D5ĆSe$M\;M1X1VD01V:KP~ߙԶRE5'c=lx9Am'鶖ܕ9VKH^Zp8ɟ�MO0׭^xQI@"	yۦҵ>д͓O'@	j+)	|Nf'Q)[͓'CRy](A,M0iN<m֟�t.i1{7ojVtyl˝	N8/8/]
    g`?%}?mfg>ɓ=~v/tv"!X˦uF!؂N;^bIgj^4^x1&2]d7;IxA.=i'E,,fheل$2׻vG]gزZU'TB1Y**.{)h4Fskip65֍tN˴(]kA:P=76=0ehn>^x̫T|ʋ-PfmPTݯE
    -/cwrw\`e1ƍy囷yOIzT
    dM"?
    _iYWݢxdHP%|l3x,4Q2,'˕tG5Fxuwսimxele~e(	=Ѭ8	uE]l pcux?*яT!X$A+@"ZJ^7*H$-�{0E<4GC
    4V0؍T44cmG[mY=:t
    }}uzQ`»\䴋ϧVn{`S\g>8dAaZ[k|#Tb=xEQF}l(7aǦpe<\ZXʾ	*T=J>%Ƶ	̜B\kwMsy\ވNJ_e'	1$KBą7c6.jq	WLe16ӢN-vuQ&|9�)]h"JTB;;ȵKX,`0~`V0�ν[b4
    l(޼n:1t;aܥ9a]#Z雊saҏ֦9Zd	ۊy\,.b\~b`uj.\/_>z[7Cn[\E02yK-L|u7}piHa,r?B$,3,Vph&*	<�%wU_Ϡp����M0؎IFR\Ā:;RJibPu/ttw"4:6΃j <iEz*N^Z&}>U,Vٜb=N5pe)'mc+Mt7~")#0zz}67(\YJ^'Ғ"uN|Nk\2bfnje'[/x����*�;w0@aI#*č?ҍ(5%iKD[w|l~s2H<8$	o,(fΪF>45LT0l[VUﱹ[[�K)^u"1D0>E8S?>QS
    dW5(Mܩڨ6qꨁ`|-4�	EfH|EU4MӴ{A0m+JI\s'	M#.\x�N񧙙yT1jK5o>NdɧBhmקq6Z[%뺉XIpnд5A4`P9:M/m6}z3_k	^dI-J	GWZZu|iU4e@_=\����-�{粂0DѴi*
    W	~A
    b*5ϱƽ0g;dnyxlX'UX'91W7={+v2W{y<_N2)yS)Bάn,wl\JHqe-.[]yVˠ40skJ  7o;wA�C_*#N|HO -]My5̢KrdYA>s18UZc= 涩/>mBTHŦnb_:vG˸HfiCܯ*Y~9Rpy
    Ym%EQEQs	�0Ϥ8vV@�L,VyU֨e..>3^JkP췕a̵ Mv,u煮,kTd̮����y`Q�A ?m9{v,$pCA[^o8ɦԤU@&md3v*VebfV���W�ց��� {|E?��l$�bhQ0
    F(`Q@,�(`Q0
    F(2� F`Q0
    F(`��mQ0
    F(`!�h:
    F(`Q0
    �(`Q0
    F(2� F`Q0
    F(`��mQ0
    F(`!�h:
    F(`Q0
    �(`Q0
    F(2� F`Q0
    F(`��mQ0
    F(`!�h:
    F(`Q0
    �(`Q0
    F(2� F`Q0
    F(`��mQ0
    F(`!�h:
    F(`Q0
    �(`Q0
    F(2� F`Q0
    F(`��mQ0
    F(`!�;�� 
    >B̮Vǽ$Elٖ}��0hD+())Q@<XzhuQ0
    F(�`H����ݎ@w
    ���mQ0
    F(`!�h:
    F(`Q0
    �(`Q0
    F(2� yv# hWQ0
    F(`��z٧_-Ry
    4rF(`Q0
    F-�@�
    QYW_~d<SN֛-�b<]4bDb[i*9yQ0
    F(`P
    �yq yW޻ƾ]d:
    >ԙɒ"@)Ȋo "'}wG(`Q0
    F
    �!xdnFa&d\7j
    JW7xD~o�Efz	DpDp闸h:${<屚j˂@-tDreZz}Q0
    F(`0�PjeG`j}ۯ	GɗULHxlY3iD2:vdj@"Q0
    F(`B� ҚWHk[]%۠r\y֛V);#.E۬lL "/fBD?k(FQ0
    F(`Q@!�x]v5TD$fIHQe?�Ӵ3^�f41}G.8N`	`	�PjJN ߾BT /.r@A`rV2d!dE,D=!4pJ8ȵD3F_	b
    %(`Q0
    �zw=%%%zHupw-dwv(`Q0
    F�@Ciu,f/3u(`Q0
    F�4Np`alЗXnjQ0
    F(`@�@#$b[ћF(`Q0
    �׮][z5-`Q0
    F(�7lQ0
    F(`Q@6�����y�`#DeݣTp5v(`Q0
    F�@ak:իG`Q0
    F(� FO`[o
    t`s:I&Bڋ1XD
    aׂiIkxM
    Q0
    F`�-c�@nH)0FN*~Sb</(_LbV/=)n\b:G
    _ẏdN4%:O,
    !Ds�ݰ5
    FHd7Y(o`@)IW#KyG|˘(`�mR
    jw?[t}]1|�#`Ĕ¥8$h bL5h.t@ZLьůF1Óhڋ5F F=M|I(`��b-ŖOOy_yH6=K-#05Ɉ1̆Vh7\:R
    uXĀB3L6"rI�0Xe tv(`�4G^?Ku3Q"ۣK#[F83
    U
    1
    "+xb&|I2L<N?
    i%Ã*86TůQ'IBMQ0
    F��4ͮr۬ l [t=s] =|c1 0;l2[oc_��g�5B fՠB3-x0
    0֊?1΀MIZ�Bт�W`'�;~`!�@Cl�&|=gl r}`S/$7Y{`{QQEK5'^.[x �ϸrG
    ~C6.NQ@)f
    *`(�@Clx7YxXf&ΌZMqȌe_3VX̴wB3H[xaU/Dx Vbt*%@dT3I~DjA$h2<@`�o9�0LNzx'QHHֺxN&#%ؗuvq1-[on3?J	Cg;f
    )zFVʲa6ш=	u[gY\FMa>%'{ӴUaq$C'iQ-R</&)$oD1D#~�QYJ<\5"Ֆc`VR_.VX׸c#ޝD\,AL4\(<f2$+3LF\E(`�@Cikːy8njS/3ğ~qy4@!QdH!*5jP$7b*�/q7ز{%h1^`Q0
    F(� =Ut=%%%z3`Suo6|Vx�W0
    v
    @@"<FkQ0
    Fu@�
    W PDQ@W0�r`4F(`�kR2EY`Q0
    F(L�@#::d;
    F(`Q0@�ѻzڵիWQ0
    F(`Q0<�@�v���@tn?��6@�
    s^G(`Q0
    FH�4x`Q0
    F(C�huQ0
    F(`�@Q0
    F(`Q0d�@�6^G(`Q0
    F�4x`Q0
    F(C�huQ0
    F(`�@Q0
    F(`Q0d�@�6^G(`Q0
    F�4x`Q0
    F(C�huQ0
    F(`�@Q0
    F(`Q0d�@�6^G(`Q0
    F�2�kQ0
    F(`Q@sl&�`H����ݎ@gh^�H�4x`Q0
    F(C�huQ0
    F(`�@Q0
    F(`Q0d�@�
    
    [`\$
    Y
    h�kpUT	q(@@SW@Po6eS
    ōtxDX?{ͯ_
    VR$iu� FG^G}Vusio;�:fp.MQŊq(G$/ %Bͻp.$�D鏬,VF[0-j/Sve9}3P1ywsC>`˕Q0
    F�(>X6Q
    
    �נ.}=u(@pʍ,u74"}Ί5H`[,/J	/
    ny2@G(x�@�.wJpFZ8$hqS~`Uն{aIB+9H ?N_ NR3]9Ҧz@PU|Jgq`y;	\uI
    @5p.ࢧmM%؁~>pْTY
    e..Nf4]_Q�Ga&`RHsH+#Pf:H�&$ۗ`7a~\.lX;8򇌔<
    F�y4&@;d )ƶfk Xo.>?24ȜE$PDeu<r~[|
    4%󀊁CK7<w`T2M@Zx.6\D@cH@D)H/wx( naAV׃'?H20lաI!GS/MdHSrWR8򇼔<
    F�mz<+
    \R_31|o`#L,XBv]�mz<hPVYnTٔO.C8?�YY!
    Y<EYK]`W5%NB#u5%whgRl<XK�x"3h=eO$!Haͳaכ?_PG(?�e�ymEzde5Le܂pa
    >!/hD_ʈQՅ>3G�
    6( @9U*{(-!/xIB5Emwb8?tL�@Q@o@ _x�?I
    Y^/=Cۏ4Qu~ZPT.!u;d
    `\<w~'(ȴ�xYd'RTݏ'	56OyY(]%Mɣ`(�ڵ(r�>v^1�<tE"JʈckG}	L|I_XaE;+rd֩!y;	{/~Ydh䑑	}OZُI5~RՓ?!xT礒3q2܏5	ezl`yy+VqhJC�huw�.^uCSMU4ˁKP`q€@p�]`m}'"u _
    n"<sCȺXbdw#]y|<*�rR|!z2%r~<IXE@;_Q0@�. U*Wf"M:	%X0x!|0Gj<A_ jؙ|Q/4kMx=�j֝xr8E9>.H	؈s0O|~YZnDt6ǣbΘ	�r,Pvz,~@w`Jӡ~wAF0EkOB@~{U.
    X?)yE�@h7.tl"EK6&�}@qV_VF:<
    η|�>12{GK~?}^ 6]bE.
    .s+KGmeh$CAY%~o3=F`|2CbP
    s?DlMtOox?Q0
    (OhuQ0
    �`H/KKwQ@M0GW�]60
    F(X2}o[B�d(CQ0@�n`,QR�7qa6ȶ3`0GP�4l`Q0
    �gkAٴ]ې|Q`є<
    (_6�@Q0
    F(`Q@'@y �v@��� vCm��huQ0
    F(`�];$���`Կ+L^@.���; ���u;y�`#4x`Q0
    F(C�%``j@&&hp-pq"E*
    ڋG�30F@ID;VdHŤEQ$Hg
    "pï}�[9� bBM=)BYyer슻j*xy,<"Hr_f5$9ͭQ@
    z,3Қ}m_?
    .Ds;尶LhTB	b t|�ԍW<UԲ9$O95o/ى`0IR?
    	(Rq0	s>p%	
    %ڱ%@*&rZ"=K|!j� �{֖0vSc	1PhllP	xugQA�
    dWh:tJpguF\&z!iuz($,75g&FRpI[tCɟ4M\(Ėon)�f PeӑYF^Ge,BN=ko_tediHھkpeU$YzD._3i=,	\4
    q%`!p9}kI(A6)E7#jRIo*0ǸdRo+9Alk%=FÁurdD]Ż3Qb2"	$pl9zKWDU(#E17ͣA1)sO�
    +qÇEX0a^'.YL@a{QIaaGw*WF(֦Z5fm4$
    gԈudP�`o.֩e,yAӠ�$6-ԑWF�fl4YcZn@@E"@�
    K
    mbaJjGnQ5srsx�Y[&kYRZqHSG$Ȏb�KvZh0<ک,xdкQ@6��@jo=0̂&Z>AWlkuk
    >{Ks+gkGȏkZGԲό|פ̌J8aZ9}zB-7]Zkb/X2Ųܣ�.jFKb}+`ТB0K`IY1t1ɤm/-uu0Q0
    F(r� Q0lh`Q0
    F(T�4x`P@Q0
    F(�h60
    F(4`Q0@�
    ׯ	`Q0
    F(@TTB�k$����nG;��H�4x`Q0
    F(C�huQ0
    F(`�@b+ &&azԲQeq\`$Ix'I2ـ>rxS\E*
    ڋG�OM)qUxD5�2*)z)ty#1T
    +JR� �ղ0m!
    -hv'@I6;] _lr_[˸~x=Nu_COyA&6+.ZPn_#`YܧPI^Y9L%o0\ȕC@zP/R_VqjCQ-<	Q0*,&Sء h/]xP?QQh#ݴGc(q?U?��°;3Ra4:ㄬ[;3Pʘiɼ6z@{@#OZf!.ѓ6jHQx'IDз$@0Zn%d,<t	11K[uvDSYBr:D^rE`r�a?`1f)ݺ1ES)ҹЬleDwɃ~B#DchPQ�U4UTjXRL-H1lx3]Pq[g2^6TފNc(a2!Lq/hCvvLp
    ~�fK)KLb"?^rx%ז!YBl1yHl>;Hck(^C5ԇ&њ$ܚ Z^)=̈́$I],*y1?l#F+qad=$ KQt_;<!5Nh7^iJe,y/{ZTOWM"*`ÈHGx
    Y.
    Μ9�ALgO
    (S*		+�Axb
    +%t&Ε\`fhPihT.!"
    5r!)=sr� �;W0
    ԂRL#Dd5H-�wɖA5/�$+O,ιXvj|ޚVLS'U p-b]
    
    bXA y-/N3e6\S26% �]+Ia@/(3#-]2.>Rl~ŝR6=x'h5)$1<�VNC皇,rJ]B[bց/#^m{5"Bzv±vMB$t,zB޴)jd"M
    (`䂁VQ@%T$갌Z7^h/`Q0
    F(��htuQ0B|(*sF@j2bS>
    @Q0
    F(`Q@'@y EuQ0
    F(`b�@�v���@t+��	(`Q0
    F(2� F`Q0
    F(`��###6ZԲQeq\`$Ix'I2ـ>rxS\E*
    ڋG�OMpeS=(/\?
    �AxEN`S^<d>H۔gR}M6-7U!\p6z\*hxP~2*l<xm"@$
    Z\bTω[RQ�@zP/RVqjCQ-<qgs 
    %qGaZx\Gi``Sy͘%	Zǘa�k9� lÀd.Y"
    ckc_*G30r(~~-SUg		N7!N5ȓn|+mhr‰C*k ̪TiAXǼlᎭ!=>U]6w�ZA ޮK[
    D΂Bk]d,W©A$<c=M/H⓺@p\0u5JB.!P\#/;#Ȟn6 sO\H@q8c{2f#N+H�a]DனZ}м֥�%_#Tj"x'+j|,˱QH6x['_MtWXQW'In-	hրPvXWx*q,5*/+L4K
    2<sOu`]v	
    z	(6^EFJ"yJ-1jf. /Ay}P�Рް5h.
    6Zf~jz?0PȀO
    6͘
    Т}6L |]F@"%Il悡�k;� n; }bbV2�d^PƸ礅?Gؿ46Q0<O<{[3(6Sg46<RŶ/]ZzNOL`r�A _.44؀{ۖmW2
    ZLOgc%XGD5alPE9LSD,0,Ie/WGͭ|vW8K(2Ap-F`FKF$FCi{c�@z(`Q0h[s@�Q0
    F|`0�!56i{o�@Q0
    F(`Q0d�@�
    ^~=N`Q0
    F(4�]; ���u;ݡ
    �Fh:
    F(`Q0
    �Al`A^zE,y*rn0vAh`ȊUX@]"$M&LF!I{`F%u#\#Vd)
    Fc$'a�h7^q?jS^FaT18.C0EG=}™Ε"~YҜ"vZ؈@ڬoۯEbL)W<D(lG(L.20ޠQIȥCDFb5.H4*�hP7^q?je/sH2sk$^R66%™"$PmTWxv-9!8N<BZf!O|\P@byxKG( �`R�a?Hmb͗ȴW%GWѧ>;Uw5<mnE3I[^m @Hvݹ1|/?4`䤞7aej mA=ƟTt1hEQ]YDسA_k3Z&0ٓAP	.^:xjŁn`#:#ZCgcItmEPn\ɺȍjXŋRιC>1C</jTn9f0so8m„3@-s64C1^<U:(/8E9@sV!/~gOz> [H]`DT$ovBT4*qijZ7
    F1� +eqL-:B9Wcڋu\ U=Aeuň"F
    ~YSmx[;\clx"�Y0Iu,%(�x]{Zƒgi, =b3tXJ]a-`/Q@$_a[JU? I4
    ڂ>!
    �hP/El-WR^5|72p`ONPl	#9n# я-_^@-Ĝ!i-&nBKxBx5#KhT�3�A!'j5yrCnYJÑs6MlGQ'+A?ԛL>T*Qr.�d5ZLl`fɅ̅wiw<R	mH{һ`ǫ7+&K9:4)qٳ")E�ԍQ0l�ChC`p0KHm2GـDhȀ+@�
    e`؀bkQ0
    hF[`�y`x$-X}A΀4< }xdQ@u@+@�6^G(`Q0
    F�W�	�����6@�
    Q0
    F(`Q0
    �ر����A_#W��6@�6^G(`Q0
    F�4د*+d!\6W6�SP])Q˃!_ֱvQLt6g�bkh1j�#0R"k�VA jt-(7	HhRU~/MG #oTKdIS&ieFGԇ$I&߅	arOl*Q\5Z@z䕘6cIa~Kj¥*P+m!5H$?Z�-hk�A{a`=
    w4v	�gF9� ޟtJ0無b9:y-w]YҦ\7P
    Yk];'Z%
    |dPu`VZn)QbR)m?()u1f$�Y�_ͬN{2S*3W	z3
    ݴx]_Y?YXg[jg)x
     |3lnQ*
    Znq9 f;jmf $^Pl)x0։dU�MS3\.$ƑXg
    1�)YMY!VגYjYdh4]h4R1Kdˎ�Bk
    ՜¯-Fʽ�Մ�Y �4g?\2L-#k`-@b\epFZ-?9׆X-\;Jⷋ( D2S fBLGM@�
    +j/jK9:
    �Y0R$uoFBύF�5`D`H�4/)B
    +".2YI*46m]?1g9
    $:FRB?+<k#KR'f 2Rm\"#e@bj"
    >Z� �֖0vSϐ4.1_ṆOPH3ǀk3KT&<yI/'1{yd4F*sP6T룟QZbuVXxl_;fC.xZ\񨸨%(@|<g;H21s%^44jQ0o
    ~Zx)l)#ʳ#
    �Р^60
    
    -/F(`Q@�@Q0
    (Z0
    .w:�#*RFgG�(`Q0
    F(2� �v@��� vCm��huQ0
    F(`�@Q0
    F(`Q0d�@�6^G(`Q0
    F�4x`Q0
    F(C�huQ0
    F(`�@Q0
    F(`Q0d�@�6^G(`Q0
    F�4x`Q0
    F(C�huQ0
    F(`�@Q0
    F(`Q0d�@�6^G(`Q0
    F�4x`Q0
    F(C�huQ0
    F(`�@Q0
    F(`Q0d�@�6^G(`Q0
    F�4x`Q0
    F(C�huQ0
    F(`�@Q0
    F(`Q0d�@�6^G(`Q0
    F��4A����IENDB`�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/images/turboFilterForMDC.png�������������������������0000644�0001750�0001750�00000063611�11377016712�026550� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR��������-���gAMA��|Q��� cHRM��z%��������u0��`��:��o��gIDATx�18CýQ& $_F
    ƾ! zjcOsV*稐Jum[QG/,˲,|[8� X4qpt.rLk?; e*cT_ꐏ/۱XɈ}XR皅B)QdQ0
    F(#�@;`Q0
    F( F[$`Q0
    F(x�@-Q0
    F(`<�(`Q0
    �hdQ0
    F(�hE2
    F(`�4"`Q0
    F�mQ0
    F(`@�HF(`Q0� F[$`Q0
    F(x�@-Q0
    F(`<�(`Q0
    �hdQ0
    F(�hE2
    F(`�4"`Q0
    F�mQ0
    F(`@�޽{s(�k׮+F(`��DBhQ�WmQ0
    F(� FgmF(`Q0� F[$`Q0
    F(x�@-Q0
    F(`<�(`Q0
    �=Z$UxQ�At(`Q0
    �2F͊5@4(`Q0
    � vRZp.-䢵6Q0M`Q0
    F`�D1CA\mbh&@4h\<
    F(`�	|€hB9F%@8N`hP__?NC�fm(odhsa,`Q0t�@�ѯE(_wi2
    F(`~�@'R{6Cz|]1
    F(`��#:`Q0
    4�a"mQ0
    F(C�`9!mQ0
    F(#�	c$׮][z52
    F(`�`Q0
    F(4�4:k3
    F(`�D¬ͽ{hQ�hWQ0
    F(��6<!
    V^M	###1 ss@Ϝ َ!`i8.Eֈ?*IU,KbC+Ti>;`Z�@d(
    @N!D2dAD֝h!F1ZۅlŘnǥYa`b�@HF( ZWoIHl$9؃VR)%Nգ`a�hE2#``MqGZ5!XMC3bL7:
    p[2B@pNLn�0R`+z� FgmF`=͈cXԅWU1q9ff52<F16\ES<#ځ�@	iNH6>`5[KV(� h"A-=W*�^¹e.eڱpNM;;֖1)[-$8BukӐ�Oj/yG%(�`
    юfL6,p}@!0Egba`�y2b*F!2|aE@S&<2ON-@L
    'haXQ+IF	x8/P„Jj�D/X#Q
    $Pddi2
    �ػ�AjMWd5\V6<nxvks9$ȗUoOd*9A˵OPM筏l1L2]>ՉPFc>5֐o'`t-G4@"#&	I6.w�D>s+ ((vصAlNXs*mO>(/3\Ī%!7*v=omnG!;Dq
    Oai
    v &`RHT6t}n!((}\J%wh,us.2) `0&n>;<%m,p|#ɶj.0H$svaxx4"/;Рh\0	46֮0.Cpɓ"FzYʈwy_^C<; d"
    !c!ׯ??~�ٿ!p??r F;.{�k�"	�;P;detd�k(�@-La$l0@I5s8	&��7"sW
    =DܚHN4z0Gwa5aԒuVs*%m^æ}3Xh#,/eΏ;PZHʓߗU'XqRlK"qH&.GxB;AMRJM3
    Z'"N	C	6DBx=2L&v(`P3?!ɟ>F6G$6ğ?#x
    |+?x6`䕐2
    6`cytA( �`Q�a(Z)J):4])op|ka|jJgLr1".垎H"E<"sxŌ+PTw
    a^Wȍ	%k.7c�A+!,D`�'/cf+%Bstxpz/Qzu.9dʪݿ
    4ߘ4ZkpF5oRJع�A 1Rh7J.ڵhg냣Q$iBX~76M2�lN{4Db{X~r['kI85,qL׵̖8GoP!)JN9w�a 5IH܏ب`74fyHr)���w*Gj][!r,D3m]\d
    k&V[YDNm\v;cATP?b
    W-t˛"hp<3P$WQEQIUܬ9הhfM|2ú=vXsdѫ%ӎ*inqqo,cȆRmr Ҥ(Ϝw+�0ec`R S`yAs I=q\?�"2j
    f&R
    ""V7Iܼy
    Jejۣ9ʾ>ޣrLDžA&#�;g0`?E-Az\!=zm*B1fU9bıFEսZjYrdv$EF2%{6V,
    :#zO
    U&I"CȗG�]@`@Bad&p0��'mXClQV_	"Q\ZU,DD, Ca	uo~=1`yrϚǜFG$T9f3Tk�1
     E⠃x*HQ
    )B)=@!D1AQ�ɾS|:Q
    .h^-P
    a!7a$pnE81oKߐYxKJt5..Ńb$P"|p	�0d;q8diFIE$$I{`Ng=(׷w{4l Zs) <7^71ӱIн6fu=:H=]IIP"}j
    ޹�A4j#$0~p%;;#�_2%kTb46NƲҬΑ!p{xCCwCD%C!VktZr15
    R-�{ P?+Iq##ߔ#<##B_`�"0YZo+ `X+;U?E:Ǔ|I֥Vr"&eCJH섚(*\w:�@?%H9Z)!ke3.1;0Gk4CYJ)dʑw/.{0u7e\iFd0DIP$w$k["c.;A"P{Q="lz*Y&&2!� 6[ɦ5KG\lwz
    $k=ͺǠ܃Gן0f$snnϹmlH|K2�1VE?So+akZd*BD\"SZ{kHDu̿?fהy`s!%˴9"SLX]UJ`ލa0�ǖS0#e	fa	F܅Wbǖlbฤ'>N54R9,˲oT"$Jp)Ӗ悶Ud"1 PN?VC@AtuH!R]}T>0W;RaPFT_`\R
    a(J[:[hM%tR!#a7 ?:BħX|k<d;&IrZo"g:7aʥA&֖d̎ddXg>g)0�+[I!4i,+!R-jAJd2/28)b"iڞUTnDFluH6X�FPZMwXd>U}4
    61`6؎J0
    唷W�v BRtdjEO<,&~WˣDD"viKg1mχH!ᙇe\eܤ_N"$ 9JRV5RnMaMIe*(bl8͟]s(Զ1Ѩ+ڟ=CMx e0ccׄMGt佻`k}"7M ^%%RHȻ\čF_a%쮦\>MY]
    jow:xvD7#(�ڨkp)L©乐>nTAhϠE$RV`3t<hvP
    >ii^		n8j'=g`d@$eJx]tK4ximUn~^)9T~n@o2٨H`co%@T+.%$3cyCv	;GS�4:o7
    �XKv;^@.M)w6A#g,}6
    K?VH@[>1nfF #@5s22|aB$lg2y;	N6>TRqa[A|"v? dc
    z1'L~ӽ?{ULтbN(� F[$�+~F	Z0S>`hF2�U1pu4Y+#d"4pӷyxfdbf0�7GMl׿@ظn['"d\-UafrovBAF	3+dͿ_hK~4
    `u(� F[$�' QB;7#8
    F
    , a-e6rprNZ􂙅EIyӯ$;-W>I#WQ4rWd5'.|ӌFL=8!-$`d/н%??ݻKUV:EE;G��4dК&U
    F�`T8}3۸j+'grtLH{x] j""=GCbp-�VWo`'uR*yp:
    2@[,)ƎX9h!7�ȟLHHps7P&<,N6L_H4//>!~'KA	d/R�7{31c`c`�c{11Āv[$̿<IV=!Hd@}9	2X݉+@Vh7&
    Q@�@c$X�:9
    .7]w�c>W"+,z*CSe7�tľcRr7`	Xd[@�n6A8V7cQ@dOбc#0CV`|�	hc-#`\S8܀?h|UlvlxNFa@>!/̿>[CUc˝rLZ:xqz(�1Q@, %Ay.Zq	"KATZUT܄0x0J^z5C-#^s
    ؙ҇
     =KÀdGh9>GЂP|
    v_P:4Sz33(U€XtN`U@'30@�_,۶?4t�z;q߿ZF<|VA\4<
    �hE2
    h1$52ϲΆl/|@AU8{}	}&!`J�z`<d/dt#	hA+F&ЂVZ
    >Y7؁ZO_TUKx/ aP*%BHy~[6	 |]ngg:4"&L؁|7�'~wb-޺	qAaUGM�hE2
    pE!"LEo,T"/@)�62$!.*t5a!#
    M<6\�X�{@ ϩ)�׀.:|Wp[=ˏw@3t?hs|
    V Tuȧ:"Q idh�vbWDS1{
    np6Adx߿34%dX8Yj1`;WW6�&EH \?�(@�hM]KI"9)O@zu<x[o2D\Azڡaj`I,y6B�TbmgeiTw< !7Y%0o WBĩ@?FG{Psg_S6fa:*	eB=dqx<D <57|)+i+PPٗ1<�b/3'?>xHCBϟZ,ʅKo߾pNwJQ*VA\~4
    8� }Vd6([=u9;Fn"^/!`I}gc^`o1|	yEX(9FTu1nõMA7gs\TtI
    ?޲~Dl^|i<؅p!vDд	` Cv�Z& }L~1晭)\=)@eG?ho_@+oSgebaa9(LJ>ɲtM7Ԃ5�={` \OR�4"`�=Em5nd9\uݰ�ɯ^#YrAցce�6D~s[$@Y@7cf@;l�%#E_}{	l�&
    ӿ_pU$~qK)|903=}1h�:Q0
    F	@Ms뾷~3e
    Ȕ
    <4jVЁ6$2
    ḣ�o
    T`4D/d?x3L4<� F[$`{mL=g/( 
    @o'$4ߟ}\Co>�VŤ-b\|k6279r'Z0?]}3�hdQ@@^iK( ؀fY?Y@XNh:0	|_КV^BQnкQPs6@2�h'F?yF"M{( �4"`�C@gf2F9}	F\Az*xtbנ~`OdwB΂O&(l� �;w x&i6	zF(q11^as.[,˲o	1OR-"Fkע�!H7p0.H
     GykRZ-暦]c]푾o֌Qc8m)-*&ze%�;g0C&M).BHޠ
    !$$؎8ޖ6Za!d6\D";FC@r"Iybջ]sԉ~UO]sI$9Cj1kc7zlj]BFHR̉DWБ;ƃ]ZkTYzkw'Y6HF`v"^A+fYP$1l1&V8U*"*ĥz.
    ߂S|]Q"%q()4rLxa/n&%eX-&y%2/lgg!(Igo}Hh'Hx=(5BRq,{TydGuBh%Os8�y\swůlo;0ed^_=x:X1إjDJTԼNqؿpqp]Q:~j:?ΉU\J`ѻd�VqpQE"5xsZm"@=Ą] <}#"--PHe)<ck%HnZ#"8vBi"RTg5@4i(!2 r9EPfbZa;`PH@:>Fl&t
    �	??h	!$kЄl	jl
    	`C4:
    luIDgnpkP�`
    V�ahue 50А6m:֡-wI,WhN9`#2HQHONSfd˥_' cRd=H|9ZXAfU15B2.Nx@$['#-)09(tdEpUdh[ʦKЋ+C#(r"o~̹8@m �[Q
     u0Bo6l?&6fhҪh>ZMKĠq߷68SӮACsV?Qv<}.&%BsCU}5CDl"鍜I#A&uR
    NrZ08ko!oߤZ뾇M}ΑTnI\AF�Y1]w}8HB~OGBPbX{uJ-K8P! (E9
    VtV�Ah{EdVv`>DYHv.!.):&9n^V99[&49r7MYa
    5]lu||wֹ<N6cBW6\&&HER{*_Hت<A
    <RɄT�No�跴\ٺVs)z44im/[�p
    <C-c3Aq<�nbb9ZWrLL`7fzׯмƿM(l<<1v_vvfF=+̑E\�vB!:_Y9d
    �`Oٰrp~0F)I3%(Hw'fP):�{mha2B
    TsP<x3 �7@R21CX{rZ+�iew:]LTN7J�7G k?A.abTؠF	x29eÀb#S$ՋǙ||#гҀ)..um?W Fí ;fIPP"Ɓ=_�aj&/,~}njܔ.
    xE4iZ[�}u.Z|=SǞ_[\2�oE$+Jt	~a	/̈́Xib.$J&usbjRbjx8Ǔ"w޻>q3h[k1r__pYQQԐ:ґe8u!z=jn#Fn;S((H(RYYXRk%h"h\RSA\ɗTX -&^AW4w	\&vK1
    C�Z?c$G$Qj 0133�"G|h
    gH&dqWH@}[}ԔKH_ZZ@^^XQ_Frl/
    >pH3>A("eV
    Mmb&)li�w)�@\
    Viٛi`m̊1e/H"2#	IJXrk\D^E6ůDQ`ҨYvUyK3;xy$`H<r@p&@:AI #:2ZCaoi:OE="7J~w/he,*0:C2fQf
    (`he!6]5TLNmO쀮�`0S4G;c!gBl196'r/_|c�	Z5>
    >Ab̢Z{yA�htfQ0
    A34�\=#3Eue`k~m??~tO�J1BieggcԵ^�9A
    |+EjeYwޡ1+sUN_4Ɯضݹ0RJL	cdP=f[K˲s`mj2IQux*8gb.!aP<Z$Z%/4:F2
    F(g�/"L@K C!5=�] r(>*ctK3h+3=
    ƃw� �;g�b\M/[\d	m#!*#HJQԠ}5Z?j|c-3gX٨JH"C$c&'\DbbbƫWh!N-{x@́+2  ">~2Lk࢝K S
    `*1]'Ȏ\Z0@#h>me<u0)a�3+Ak.@7|t0.pjC>
    B.Bmw|ۿ{)--RR(�&-@6cI5@Àwxœ܉UdĻb10f.$R5H6qJ3Xl [^1G0BZ$LL7lp|ʆpc@
    :<1{?#_Bn
    2[$<<ɴ9sN=!%%d@Rj!#_ )�D!�Ck@-2W8f0 &h.$@@gע`Hi\0r7d'QW98ב@@!>_>99� װ@{l0��4:i7�JjtkL1!t+n*9`48YLAӅ5mlApn�r%$$EX0ۏ=
    ۿ5k 	܌$V3Ĥ$%`D_?�;??;/![њY܃+p6Q&iFe�5V@�@mQVC,9d(t~spM`o~k2dMGd<UTt?<XpcXc`JaN
     Oȥ9FN0S#Sێ$•zâŋ끂lj'CB&L�?E
    kh Z?}
    ts-- #hE^.:3H_))+K@gǀ:;DF%r`-apUIO�bHL*9� hxf+Alt#h9ha^!deXÄHpC{b"GIUxp)b`pYyDbadg~28sd)KKKS<-%lqfja7 232^|OLLլׯ5[l G�h/7__clgS�Dý64g"P*�zOk`-.@RӇHT9HʨV'`|o0&Q\c`v�&�a*;
    _६ɏ adbl@cbeƔ
    FcT4(
    �&6ZaV*d
    |ԑи+3~@dbvjIO (
    Ec@.
     �i!+Ȭ
    y e*Z"DXAV׷o|db>z"-hae-hec!xf(42
    >,@�Qt'Sꆒ*7TCЌ?I-sdFQ+Z`r
    \ErM[$]_NpC#W.4[x_hce0N!Xe!h;H$�f7/?x7-_^$oNkKCǎ}7!7OF&&+߿1LGb `!(_gVRTdadt<lkZD7dKDWJGR[LKHKAE؈I)"aٟ'q<@�ѤE2
    
    c0mA28d_~/>>zɓooصܜWR_NWZGLꂾ΅-߯_~}_>AC_#Ѡprr	"0x&VVbnANKTLW42v-�Q0h.F�rf+|*t~K1-+B#b`^_Q}]@Z*>>AA 6@S6vdȠ<[e�(�yy2;;hPaΝLL'O*�w#d,r??@GA
    ds
    t9Z)()$-"a�O`%Q@	�(`)0xGc�JalPm\6492<	h׿~fsi5++77hs
    E"(TFaO֐4@B5P�٬0Aä/BخfN90af~r$_\AҕSJ8[XcsUB]F;5e&'y#%,<4Xm+"ʘ-ڶ8}Ӑ~g&$';cAR\*APPOqjRhcS%oAtKr(?l^##ΘQ`@	IW"V
    
    Wjk֎ZRZG
    QNX!F3dC؝9+$ʋG�X`DСwI[ЭG9BÝUBP\Tw2Ό3c,	K콏.`Sg3[GkpH	#YCN)VIHb5쎤V!�{W0.9"ll KFC/xi5qFp8j9k
    Z55wj$j*%D5e}IDz'+aƴM1Cd~"'k,?Yc54l6c$A	9Ȥ\/oZ$1P]Z7
    S񀘃9Ⱥ	g<w*-v &5XD/nŔ>ht-W’
    GI@)<
    dr#?/p('/"�aUM$+@lئb?B`
     "ߐ蔔?
    _@k/_Κv+عAc!<<Q<<lY#ȭ(M'I>r�@�%AĂnB[wuƻ.D|0Ԥ
    B2LyN~I]IQV 8	~#lyp<!٥U(VZ#8puˍfU%a8rکH 5,R2)%ݎ7Hi}KN,f8Y]y4Ryyw8ciF6wݽq[U<.:Q
    s!J]̔%R&>	rII鈯\([S9+\Iju{w߶.;BG?JpNcDR	ՔJ9ftOr|yoVyֈa
    ޶)^]_D`k /40׬8c{jP,q,qiZY,V4�C-]G|5hn	tf+QeE4dj4-aWI,V#3dj`co2\`CSh1݃9Ā	WBť8Xmkhk?rOę38�H>>}
    l֊%+Lsa3RҐȳgπ\i)) q01}QCEc�x‚'%?|6\C7_Ĵcf'Gǽ?0,k:C@7$\Q|-n`X#3	F`1U 0	Vd TF� n0dq09dhhj2VR
    DS��kPDI\G1XFX3)+	F4S%3Hr\ϟ?윜=eiν{,,.;l%􉇙ӳg@ɓO�['?ŗ/zkFo߫ݹz<a5Yٛ.�ׯ-#u{۴ãG::kjKKIdf铛`otm@GN5sܹ|'.^oEEYK #7dlŌ4"95WZ%$%a�c$,Za*	Zl$sb7Y0!4\x`N5%,qi!Q_1c
    \#"'^Y3i>H,_߿C*{v^GEA&JH7/'q8@+6#ll@[pYX6ntpV`C& ؔ.YGfe2
    {Y`CdNvv iظ#*ߴ}:LX|*wj:D2b2yai�Dý64
    YjK9oN*mEo�}|4l@RӇHT9X(<0?S@�X6ߟ?l?>}9 ”<3!OԒ+:�[!<�m:٪#V޹h=Pppt
    �m>+.ϟs
    @nTP/<I!9`6sкlʰbԌ<� h2k3hk)
    6Pj%n\#:.JLF.ze1CjUxGIh!F\
    ũh9y201Z-_A'}իOϟzÓ'=z0zakyGjYX><|lv�R55@
    fos21.UCL?:��WB>+)	6S$ KqA&afآל<
    J\EEӆ1� zX+-\D9fQ\x\q9xspA(j+Z€aẌ8pE=3;@;1
    k,VJv\lGȦ1pD[r"�+57;#+WlV͟_ÇǏCdtttF!k5�&r
    HHnܴ	bx@@�dVhƍ@TW}v@�;9|c20`FL|<l^ 4&@[䔕WM+CX1€1IM00<jp8\%>1cOS�@#ϣx0s`v0�d@qkח/wgHƷw@WA�e5DP&J3A耉ù
    >p+	ݗ4(YHLQh
    D8�@�h~�
    |x+)?QQ&A#llwNN6?~
    :�֪�
    NaƢ"wHKt
    zYgl�IH6A@'�"}4 uGsdu�@<
    $ u:o(!߿̌LL7/]=hOw߿3Qz9n&`JM^fߤa|`6A1[i@gCN<6hp/:F�;w�al%QBr$$C[v>R$BToͼ0ci72T1\xwD-F%J\ca713z_r
    ޹�Pǀ-7m3:"<rmRJoCAPKL]جEi=�w[ζ֣5ok5(
    >FgH9/r)t#A4-fߗ x7@HF(`x<`䄏#?~� ~_b`	;|^K@2@.V<azQ0@��UtuUN`n_GBE1`ZKADiqedn!ƅDFªaa1/W3i&�UDLLx-ĩe/~09pŘZd]Ą3{;$	Mkdg,h"pXp0],5QR#M=iT-41AOae2>x?il��	tC
    dI>abb=<#l.iAs/0)II쓤q
    9� h"AN+`S^<d>a]9|<U2.wbUIyi7dɰMI3Aǥp~)bԓ8 RڄI çasI		f66ȪVV_Ⱦ_XcH h7UUYyx@MFJxkCO[hn"5+H5is� h"!+mQhRZj9Ϳ�XK"mlѡQB]@yld^Xgu) mc@e#Ȱk2@�^Q@	VAIꄼVGc
    \"v3&S4@r8cq<!M=hF71~w-"h;#
    x' d-eЕ0IJKK�aCfjהHJJJHHވ#NAM*L.11b8	F12 4
    J��A/Obxus""1}GY
    OV1V4l'y	>ZFd7F2,QMh[4UQh$nFA%90/
    f[r^Km;1tYO)QO]�3r9iAf{b-H@2.�f0A &-'cŋomO1t!qgEαjLDTѯSH{a~)<蝽W`KH_"+5)W`[ȃ*;73'P4cW<~zM#h׆F!K-c3�R݃I
    MQҥF3H#�Z:�hC�"WLQ�Mfmm-E9Bč2zZc5-+3b</P"Ǔ$hg8O@1RvqUDIR>ت^bFw@d9Bi�̝A {k0b头]q#ث-z;:+zW8\ghhth%Wk883RC	\Q"H_VJK[
    #|:Դ[5
    'Dryi6C遈#k,f>&sY" HF9Wf
    0HG&
    =L@d5\Fq�-�;
    <
    F(p0ڶ!� FHFN�;;Cd
    A#(`Q0
    h�(`Q0
    �Ec$`Q0
    F(T�4:F2
    F(`�4"`Q0
    F�] ik(^Q-O&E͹6BQQs9T;8N853˩*F:&뷰1Cϖ5u#RGl߮T7mƚ҅ARߐN#VjYaW0b5[|K=*IDQG.e']�ŸƑx/;.QӍOCEYo+yYLkc47	u,ԔQ96⬲,:TO
    @y-G�df0*> P=l%)+Uc
    ٵȣ`�:D
    խMH�ص�BOsӬCDG;znpy18	+9VsdAaFĺP,0ˆXFmBH7AĕQ/!fG
    ]Z$|&/2Ei^nu.�f0z>`C+1t~liYx^(N/Y5V\?zدW~1K9]uPLjq-o
    (մ$ra؍A**U t*[
    y]̶r#Ygx ׌u�A !LE51$ާ$G-J5*GgBZnX {sؙRDiNѾҒR�n;ެ*Fyz5aj4ٶ�^
    %7GHuZg67{j`}H6A
    dt	H_FQ�̑E\�cuLkg;
    �Mfmm-E9B̃Rdwc5-+3~@dbvjIO (
    O@1Rvq5&4`[39� �u֖ u}S~岠
    "'MZꞳ)?ּ|
    )lP[6M5klf~gR9`VyָAe<k*4,b~8!mS%`p*=>,K^tJ[a7ET)[u%`($`w1n
    0HG&
    Q02@�h8
    F(>� F[$`HF潁vhPFCoX�@c`Q0
    F(x�@}51
    F(`aDEEI@6`Q0
    F(x�@-Q0
    F(`<�(`Q0
    �`q�A7J,B\ Rpy"fWՍ|	)Opt։Aݘ*D4rܵb<cyڳ\B&ħwM
    A4r&
    n3M7O�h_C":r6RJt$>ߊ+�Ʊ|cw�g9J2:H	' :!%+5!1`э>t&b-6!N8so,?%h2k3C`sh
    \6^R|CСfP0cBh�`
    R�AX_?uMS':Ҋ1ҲgnvYc6M0^{97ՄPSZL|\mw{ōto92-͑gGPGGqiP(_sE(٤G;3JaGc0jRuU-1kj?Gxg$y+Sa=wKOלel^/�ݚȅI>$[>TbO(Re�*f "f#Z4(	{M]Lzkq@�@?;CDY5_iEzz'k	8
    v!q"XLHLKS\{2W;K_du՚JlJ
    x #	(Egy.@4kCC}�AlQpOG&(TRH_FQ�7d6[�Hjp
    9 䔆{īx�@�dfR:l#Jܸ!G@X<V"IP2C!*r<Iv$.
    h*xkt`;Oh0�x$A_[,rRAԃG?mutW.L4n
    o>{>s5أu-䬝]oa[00!IqL̚b+vdJ/G6h%|ҡh:
    ,]+hԥ9`yZ2x n]jv	d
    Ӟ"XS\&-Q0l`m�ő	FC&h
    `@@F Fw|`4?Q0
    -F�1Q0$y$@a%`4:Fp�2H�hE2
    F(`*2Z$�DQdQ0
    F(*� FבQ0
    F(`@�HF(`Q0� �9W@?=q[I]FD]tBYY<rfrZIkSR;|m&Vt#ʇ=é҂=mIƞ
    "+NJn(g$F*I�IC"e4e#[6p(lOW8b8:Loؐk0b%EC9pN�lh'l9`I%t7fcƲ`tDYNXZj9ͿĀq31%`Es!j,:Wy@H	� �V@ºbxnC{9#H~]/N=/G3z42ªbcN,(l҈Xʳ^\\˨Qf920$]ŒskSK$YfRH5
    ˭N`V�a v:cAfƙ5p5RUcs~<z=7CgZV 8oyk@%[
    nRyuT-
    b�ASql
    gUĀȖ~l\3X h{[Dv=rٺ&:'	ؕ{HrԠYs928z#w|c]?vI(H>?+V$+-)5(	ඃͪbWs[ۨ/j_9s#h׆F1G-c3�R݃٢
    X)RMP]jrQ:�sd@aB]7َ�DYA[KQ谁jP+2T30]XM$A_8P)!ZR-“$H5lC0B*#*v\	"$!A(Y
    9�=+Iaս:@ʉR>!;lKg5O>‘=Oge#ܥ5YDz^]h2sʓ;FӍ/!X|ȷMK}I,?p:(E
    %m`o΋#T%ې\h4G>0s`v0�d@qd#�Q`Q0
    �hE2
    $`mhO@a%`4F�4:68
    F(`�4:F2
    F(`�Dy$_;F(`Q0l(Z�htdQ0
    F(�hE2
    F(`�DS W^BZ7
    SWe@AEL8SIr�dFv6\1ͿR�S\Z<E]DfA(YT2%sADxꔡ� �e@X0{,W`3$/q*]|9-pi^vq(tWoNM4N^ָq'Vu
    X#sڱ
    &2DY4�Ck@-2g0 n&f H(�P,c�]G2�
    D2tL1C*)`AX"
    #}ȂWF|6pwX=KT܃�?/_t\jtce/Xbu.abf4.obX�Y+a{B
    aqdJa8Ͼ\n.Blhk8Ŋp>o/YȔx~nj뭐||v[kT"6NS+3:sր
    6:80}&V᳼G!'EE
    >S!fYcv�ADJLk0pخ?[mE{5j8B؊}IqT?<%<cz]+Kpk<g`,~J"=U
    X
    ?!yӦsd6rP	 We,yп9B@{:[qS#<Eհ	j"M<6r_{l< N{@.ZAO�ɬ͠:l#2Tq<V"IPw�_p$%38IExF*C|!iIkC>@{E8 l@�@�%`5Xee?[s	ۆ~;aYk|N-q|J&4g]GW$D)yujCwJCYXI7� I}HavstLޱxB0jZoᴩ9/(N
    OW�ѤE2
    
    Ab`v0�h쌂a	F6	@�h`Q@�@-Q0$(:0xGcgK0i
    �htfQ0
    F(Td�E-Q0
    F(`��`Q0
    F�mQ0
    F(`@�HF(`Q0� �5@Q-LA1R?Oxyf
    NՏG͓py	CN%bGO}:/١Ca^,oeRf@s2M:hq6QEO˿idF*VE
    uR՘.ht +k&rTтM-{a`Ve`@0'
    .hZAG*[Dy(Ow%`xF
    �MfmzXZjO_�s B[Т`8(`0�سA_0[vX+tnP92s_AGN	{;fDX\\{C3*07xL(-RѣAN*_4($b&l<[(kS#-͖9ң.eC�n-`G!8M31Fk.:ڣӱgKX_'3CSnqG^<@C"Mu-2PT/4Q.ۂwb4�hP2ˋpT*PrFC98rx{?Pc9� ڛ!@;+LN͂Xz/a%?yH8vb\*N&U5K	O+]%kMQIWԡ'KgO[>HtQw"k(mAb;=P4s?)z{mhe#Cis}0t
    #D+1d8�"ض #LֿJ"qF C� h2k3h%
    6PjIC2vmjͧu=M2B)w1>-Hd<0FR_p&jǣxp[-#qF? 
    �@�0i3-
    2ߥbR<3rigf)=PַT92z~RpA&njFbrWh}j~9`,џMА\{kKb7Q-L�26zSY)s	Hh" owtt	A:1
    	 Jn`4xhh
    E0l"q{ FOKУ`Q0
    (�׆a30$`D@�HF(`Q0� FgmF(`Q0� F[$`Q0
    F(x�@-Q0
    F(`<�(`Q0
    �hdQ0
    F(�hE2
    F(`�4"`Q0
    F�mQ0
    F(`@�HF(`Q0� F[$`Q0
    F(x�@-Q0
    F(`<�(`Q0
    �hdQ0
    F(�hE2
    F(`�4"`Q0
    F�mQ0
    F(`@�HF(`Q0� �(t����IENDB`�����������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/images/lbAccessStatus.jpg����������������������������0000644�0001750�0001750�00000434514�11377016712�026177� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������JFIF��H�H��
    Photoshop 3.0�8BIM������H�����H����8BIM
    ��������x8BIM��������8BIM�����	���������8BIM
    �������8BIM'�����
    ��������8BIM�����H�/ff��lff�������/ff���������2����Z���������5����-��������8BIM�����p����������������8BIM�������8BIM���������8BIM����������@��@����8BIM���������8BIM�����y�������������>��6����S�a�n�s� �t�i�t�r�e�-�2��������������������������������6��>����������������������������������8BIM������8BIM��������8BIM����������p���!��P��+P�����JFIF��H�H���Adobe�d�����			
    
    
    
    ��!�p"���?����������	
    ���������	
    �3�!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw�5�!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw���?�,ٜnV,W]+?G~㨀LlwO:}')Dz]^cƬ=*rluMZHuCbh]s Ikw8z�+n3ԝ]qkK}/?F�f�̱&J莀:2[2k0ksEu]C:?k{ֶH3u73z?{�L~ޫ?~ϫ_{4ZYen}�N�Y3�"3/C+wq`26kTW&}x#h;7�_wks��//So�^_�ȫo*Xa`d�>mK\*�W�s?)o�^W�ȭ/[>�z(fѹaѬ67Gk}<7�}�ߧ�ܬ�K�|s?+Kޑ澝�z_z�TƇ꽌4�|?&WԼzppU2t~oگz�]պ_OT6>=9nWݿv�K0;�8qqF?caի齛.~ZqLbWu'
    85špc:"s>
    H?'O痙DvMw&Ү7
    ۿ;}-Nv1Ǥ
    v6?CFobs	t=
    lo(g8Rƶz&\Mx�sRu
    Nʜ(o+W۾]'Fr{?ML#{5{�V-%sȀ}XY�M%9EإvE,s7󓑇!@k@_<k2&]w?Q*?fm@!αޛ}i?ysΙC[R6l{{K?w/<8=% e}>Sc!p)WF%Nc&	ןr/M�zcIK��v�YG)}O(tܦ?5$c0Ч5U�1IxK\Zt$gIxI)t$gIxI)t$gP�r�8BIM!�����}�������A�d�o�b�e� �P�h�o�t�o�s�h�o�p� �E�l�e�m�e�n�t�s����A�d�o�b�e� �P�h�o�t�o�s�h�o�p� �E�l�e�m�e�n�t�s� �1�.�0�.�1����8BIM���������!Adobe�d@�������������������>6�O�����������	
    ����������	
    ����	
     p670!589:P"`1&@A)#*��
    
    	�5	47!12Ӕ6֧3w8 Aq"%v0Qa#&P$pb'x9
    @`rWLjBdg()��
    	��1!2Ҥ56A3Ӕ"7pQaBrs q#0P$tuRbC4Tւ%Uef�����g[ͣyX���������������P��������������f ������������!`2w[>Q{-mmI7xI[wZه]./p9b2T{[A|
    n9q#ea9tw@��������������������������������������;3[tce<卂'!jcr<rftfgM�?垰y/ܘ�rn1U2n�cXyg!nQ:����������8_X���������������]|P������������p_0m�ӏtzrzR''G9conwo9OWa-wwY
    )xT 8)�8QājN-_@yNprp p@�p€8
    @8N�pG1�8prp8Tr)Grg1o#CfzŅї~z_9GʎQe5_"Vy-s)jg2NmIԂ%$ee6mikS=҈wKo;Ҟ"2^!/q/|[Ι4G̼R|/:oA~F
    /q5ps+|Jĥi0ļG8Kpox^4"RG
    $"0ӣ7Okߓj[Ev֞h[Mg>wg}.J/֢I,h&Yٶ_gZ-m:]1:fؾoq^	U>FDZgW:g18q/(~h4/:\5q4JpBpsG48Mx]\@B8RQƛ p#G+ ip_ȿ'ʗmy#jgy�8�P@�/	8@��8�@��8^SN))
    B��B����rp�8(
    @�  �_ unN�������������������������������������������������_P:$הZº%b5`G-YI1<%?yCѵ"k<]-TshDd���������������������������������9.|&񴢗q4{G4	ґ$\Nx1&C!{$5Bj#Q##`ڀ���������������������������������<bY'7'i�����
    LB&��
    SH��������������������������������������_Pz$氾| �������������������������������������������������xNkN�:�����������������������������������������������y/);H�˴��p?X۟r'~/��
    w:oPZ��	js|�>f68g��b#d�����������T紲k��������������]>K]>L�uJ=xyIPDV]�MKqvV��Gsw\ϵwc|5CGͮn ��nĹzlluu뻚5 �~�����������KܑovC~GߧE-L-�����������E#E#�]dׇ�ywQ|ڠ�i�OL1�tx9�6	nO~?l^R�=hճZ?6��Gs`�����������~�~=~/h%M-0�����������V�xVoN�*	Y$S \Ҷ!sJwVJDPޖHD
    KzwNKvAGBggzKz�Rv3W0S:0S:+h'S3L	`��������������������e��]dׇ�T^$Ne'Ru(+B5AF*AFAnk8%X,u0C;:#:*:d(聰r�ԝN΄.iБA+ v��������������������(�_P:%f< ������~JT�(e`0BX�����PN
    'P����������������������:j�/txo^RvT5@X0s +�J
    pg@MDk� ,�`
    @Y_��Q*"ߑg	��%�1k`+�dR�|$1!?1@1$�k#�%�1@6�����Q*IY7);H�c>W@$�1�k�
    %R>LTF +|΀ʀY 36��*3SL$H~ZX̀
    _'ߘߝ\5d�#@+?6>G@C>]?1 $?!�%�3o�΀͟����TJ�xVo
    N�+A�������at�tp��;���tp�:#��@"rX��������������������}8�1}@뤕z򓴀
    kĭ5\X5w|ݹEH(nPI-d$]CH3;X(r(:k��:<B:#0Bu:#0C%%H�Kzj9�����������������e��]$ׇ�T3X+itKP;u+iޓ=%Ҥ:"X2r0R,Ѓ3.h��ʠ%r,ސQނX0RW"3�����������������bX �<bI+7'i�Q>V 'ϐ||%�̀|(~GV?�* ~d�glIF
    ̀���Ȁ~@�! 2ς  �����������jI@�xVkN�"^�	�>ZXnxX
     sƈAU5kL*X
    Rς>Hc1 )G6RJJV@#�WWk`*`
    + <~5Bcߍ`g͏"$@+�߀�����������T�Ia}xI@ H������(�����	|��|�'� �?�>L���������������1}A묓򓴀
    T�9X-ylN^:<4uԲDvztFvT,<`��:4^';ӽv`KD`vE*yz^k9HRu5Y# ̝J\u����������e��]d׏�T 3X*y,S`9'6QR
    6j<&]eP-x%| 3_`3
    .iS`AFttF���u'ljA$;⧗4ztE"rEH(ftY"4,!<H3"shEO"s-:e,s@���������hY@�<bzY+5'i�"������`~@�00��c@�1 ��<����1 ��c~L���>d�2�����>d�̀0�Gc>wD�_Pz$氾| *(X�6>k�k�
    )D I*4[|Fjh	Ǎ@_1.�EDy1�>Rϗ|X�|
    ]c�6>k�d�.|H		�˾k�)Oɀ|~c*`
    V�?@�]d׏�ED*d�ɀ>[0�	@O@J|Tʀwd>L~d>L@W ,?P|�^5BH!>@~d|@WWˀc>G#X01@!`2?,  +  Q*I97);H�f�%'3"pKD`tGDgGD
    tGB&e'*ysL$0Sz��qؚ6ADU׀S"`t���������������������ɼ�Ia}xI@A52A@΍'R%sv晈(ޡ74h4&RfN]Bω,0BX)d\
    wp�:<̃'S;;'+i)+I ��������������������hY@�<bY'5'i�������1rB:P�?	N`�����~���QR�����������������������?a.Y/);H�������������������������������������������������1}@묕z򓴠������������������������������������������������Y/);H�������������������������������������������������1}@묕򓴀������������������������������������������������3\mΨXh����s�q@r�P89��@8P9��r���-� ���@s����i'/���nmoe7,<#fAsdWC"ȮEt2+]dWC"ȮEt2+]dWC"ȮEt2+]dWC"ȮEt2+]dWC"ȮEt2+]dWB2+lllllllllllllllllllll
    2< #2< #2< #2< #2< #2< #2< #2< #2< #±:Qv&WFՄP[QTS,{ig,U>g:uWAR刽YgB=SU-.3/4؜dsQdP:a+idVr(ŌS9tмKnPLҼ5tӴ:vN;ChtӴ:vN;ChtӴ:vN;ChtӴ:vN+ChtҴ:VJZ+ChtҴ:VJZ+ChtҴ:VJZ+ChtҴ:VJZ+ChtҴ:VJZ+ChtBЀ@t :BЀ@t :BЀ@t :BЀ@t :BЀ@8eS\`ivxN)cщ0Q<}*dF-]+
    TJ4v
    y^W#AZ+n
    :JK,k2(Ї!5$I3g^ja57duJQx2e#.Bt.Bt.Bt.Bt.Bt.Bt.Bt.Bt.Bt.Bt.Bt.Bt.Bt.Bt.BBFtnFtnFtnFtnFtnFtnFtnFtnFtnFtnFtnFtnFtnFtnFtnFtnFtnFtnFtnFtnFtn0xaM=6zl0aaM=6zl0aaM=6zl0aaM=6zl0aaMu.p:>2LdiUv4hK%ˌEP10&
    J6Q,Kh->vhY}
    ȃl0}w}E�G~
    |w~
    |A5k5נ;kÿ&;k&;k6;k&;kF;kF"~pw;kV;kcf;kcf;kcf ՘m`wm`w\w\w;jaբ;j;jÿ;j�QU�QU@�G<A -NT@&<51	 MNR@ڐԇ6<( mHFmJ#RAG6<1
     J#RAԄj
    `<5yj#3Q3Pv<! @yiCOBxǐ<!!-<y
    iSNBZpӠ<4)!M4y
    icLBlƙ�vz)khgYvQշ818wbK޷*CmD)P!bsDFZȅ"!}F{#7Ќ:8@Fȳy7Xވc1o8q^/GZوX0Zȳj6/90װ#EEֲ:G!:a݈7"#}fױ׳<cduFcײ:Do:׀xDu!xq0Y׀" =@7׀ =Dou{1xb : =EGuBx\u:î#z#ׇ#:~~xb:?�aᏌn-ϯ�uNqfͫ>͑k>Gb&!<q6l8XhBŜM80q0-8Y浉.\"=gqd #~:WfxǯXp#|:7XxZր@u`#{ԀÏV^و@u :ـՀBԄVՀYAA":HDsx8uR##6ǚ7G4-xBDmp<<=ds@s@B 99#jG<-F㛈DsG0Ќchsa9h"Wޛ0?v8.Qp2\e(\@e(E.QFdqO>dqO>dqO>dqO>dqaM6daaK6daFK&dQaFI&dxAGdxAGdxAGdxA`EdX1CdX1`Cd8!Cd!Ad!`Ad!`Ad!`?4#OF?4ipO`
    ;w�4i�ӲeNKƜ9/r^4ixӒ%NK9/n\4ܸiprᦥMK
    7.n\4ܸipRѦMKb'/z~k�^|�Dc,�֪'!g�ƵQ?X?5fC4,*di<B�/2E,b\zél0/dfn4(M|(4?�A]0EvQ#�Dch�m5B6?1HƩJsa"Qb>~r2L`҂faC,
    UfD`-c5q2a18eL#UwPHpoM>7g*ytޒ<܊}?%uϣe
    xXy	=*f#�Dcn~D$Qj2;FGq5ƣ"n7V6&d6hn<tko2j2;FGq5ƣ#dwQII31pa0u\ص&s53dwQj2;FGq5ƣ"p
    %an]/q2\}cSZbe~/ọFGq5ƣ#dwQ-I35ƣ#dwQj2;FGq5ƣ#dwQj2;FGq5ƣ#dwQj2;FGq5ƣ#dwQj2;FGq8DC*Y
    ly
    ko2\mx8eƣo&$6Hj2;FGq5ƣ#dwQj2;FGq5ƣ#dwQj2;FGq5ƣ#dwQj2;FGq5ƣ#dwQrbO�z~k�^|�Dc,�ת'!g�ƽQ?X?5Y�TO>B�z~kU�Z|�Ec,�ת/!g�ƵQX?5Y�T_>B�z~k�^|�Dc,�ת'!g�ƽQ?X?5Y�&�6i3p?3k?3k?3k?3k?3k?3k?3k?3k?3k?3k?3k?3k?3k?3k?3k?3k?3k?3k?3k?3k?3k?3k?3k?3k?3k?3k?3l??3k?3k?3k?3k?3km5ov���^#c:l]V,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,rO$rO$rO$rO$rO$rO$rO$rO$rO$rO$rO$rO$rO$rO$rO$rO$rO$rO$rO$rO$rO$tc:9·Nt:sӝtC:9·Nt:sӝtC:9·Nt:sӝtC:9·Nt:sӝtC:9·Nt$yai!T,F):ˈj$mO6Oi6CWa<vLLՔR$4YTDQ$(S
    0sIXۀ$&df>e-0o eajbp{i/%x{|L8᱘8#8#8#8#8#8#8#8a999999999999999999999999999999999999|Lp)1&ygc=K0cq
    rȮ"%؞ޞf{Srg(w.]QU-x9`f)B/*IQFbEvf!_7Rf*)Y50\	1e.-y)qq`(p3g8p3g8p3g8p3gB9u@gPu@gPu@gPu@gPu@gPu@gPu@gPu@gPu@gPu@gPu	͑͑͑͑͑͑͑͑͑͑͑͑͑͑͑͑͑͑͞	%)>@ea0lǥ6FK:0˰*L6\7ʳ1CVͭ[)_5|h굡aVab;LTGi-Rijij)Riji)R\;LTGij)SCLv@vҕ!R;KTiJ)SiJGiJ%ScN#LvU1J;ITJJB;HUi*i*HU";ITB;JUGi*%V*\vUaB;IUi
    %V*㴅\vqB;GUhW㴅\vѕE*u`vxѕ2;FV";FVhhX#Udvefe`v4EWhT*EPvq
    UETvQ;CUGhj
    U%XvЕa;BUhjh*V*ô%XvUa;AUh*Vô\vq
    -j&Mb$Un\8hYJۋ
    v[n>ԆMC(GU13rLJ,xrFG$G$x#v9cc8^0<HF9c6x_˔r###!p9xXY!r#D`9xÖ<8Z1,GX<ychpG-XB#,GXB8Z-"xj"�ˌl1�4c�(1"0k?18Da1b!<cC#cDŽxCF�!GD!p-DBpGF#jՋ<Q	#܃w 9!rBrY9 #v98ǐBF9a!rDrQrDF(9G'B"#f#BG,,lrrXXQx@p!C9G/ !@p?( !ÀQGDr!D!8aFx~b1#Äb!G(8È8QrG^Gp�1G�pqo͞XHr
    lXGZ#ֈ{ChuG^Zh״:^{Chu״:Z{Chu״:^{Chu״:^=E-Qlzc[Ǩ=E-Qlzc[Ǩ=EmSlzmSlzc6ǩ!W^Ux=UW^Ux=UW^Ux=UW^Ux=UW^Ux=UWޏUz=UW^Wz=]wޏWz=]wޏWz=]wޏWz=ewޏWz=]wޏWz=]wޏWz=]^Y|=]ޏY|$Wo?S}�o?S~�!d_?Y}OEo_S}�o_S�~<.-Yx,�68_ӟ1X+}u_a/	?�#yo(KlY-`?'�~�rHFUf#c'1`%8[8}G1 %xQ8&6+s1)`q7.x,^aF
    яξ2lamMs;b3TJWV1|cJaqS[sw;_?oͦ-c<4yh1cGl[V.K5e} nōc<4yh1cGƏ1!nue't^8ۻ*.Fn
    8oKcGƏ1c<4yh1-^8rcxm&<^
    z<4yh1cGƏ1nuh1cGƏ1c<4yh1cGƏ1c<4yh1cGƏ1c<4yh1cGƏ1c<4yX)N":oF6˧x	a	s;A`يcGƏ1c<4yh1cGƏ1c<4yh1cGƏ1c<4yh1cGƏ1c<4yh0Le?�~"7Eo_S~�!d_?Y}OEo_S~�!d_?Y}OEo_S~�!d_�!d_�!d_?YOEo_S~�!d_?Y}OEo?S~�!d_?Y<}<ᑯ#_DDDDDDDDDDDDDDDDDD2%dN�dN�dN�dKȗ/"_DDDDDDDDDDDDDD2'�2'�2'�2'�2'�2'�2'�2'�2'�2'�2'�2%dKȗ/"_D2%dKȗ88888888888888888888888888888888888888888/"_D	\`���XLr#suzl_-E677777777777777777777777777777777777777777%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{.!/KwfÂI
    ^PK澽aioRf_6I.O܂lyDMS%=vƳmՓZKQnk3Ն!0O1Xi!ichE"'jpc*G?"3ϑdSrQ9G(rQ9G(rQ9G(rQ9G$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$nǧӈt:q8GN#ӈt:q8GN#ӈt:q8GN#ӈt:q8GN#ӈt)9,S	!4%˧DdU*#4LY7'N
     %}n-@I3%]F_PD T̡NQLÍbs;u[eѿza1e-I6NGOIREӷƬNe>昴4š-
    1hiCLZb4š-
    1hiCLZb4š-
    1hiCLZb4š-
    1hiCLZ
    +z4ҷJލ+z4ҷJލ+z4ҷJލ+z4ҷJލ+z4ҷJލ+z4ҷJލ+z4ҷJލ+z4ҷJލ+z4ҷJލ+z4ҷJލ+z4f7Lލ3z47Lލ3z47Lލ3z47Lލ3z47Lލ3z47Lލ3z47Lލ3z47Lލ3z47Lލ3z4hдR%:WQ%MK<]Z!/%vU2EMW9ŷ)}Bg8]˫&`i3Ul-Ҋօ%j)+UQ%*<JDx-U>%<KUDFQ-UZĵTj^%<LU?zOb%<K<xp3TbSj&j<MU8FUM7TfS`<MU4BUM7TnSʦL9TjuLgRG3Tb#RUH&j<MU x@5TjRx87TqrQʣF'j<NUx(;Tav<NBE=T^>'<Ox ?TA~QD'PUQ
    CCT!QU#*UI(<QU x@ITq⎩(<RUx8ITq⒨<Rx0KTaSU-QZҚ)<SUx(OTQ⢨EQGE**<UUxSTH5D*<UUxUT0Sʪ
    {vqty7欸Xل-0Gs/3avqPك?ԃbgΓ_k5.wP3<TB)pF|,zT:9SMBhLg1؈ruI4"mOU;AڲՙR%KC)MQF<3U9mOSjcr49mC~!''ICK+uz5⼶)-l[fԡ%H6YNGb,uQdGdCdZ#duYE#dz#dBk1{: :GZֱǯ`uo@F؍ԻX[b#`ul@un/lp݈^[`u,X/,K"7R]=wul؍终刎k{{Kv#nDmو0pm`sF݁`sKdsXEr1;/�ړn5!Ν)xld-1<?	3|eV5!>{'87?&.OibC7jffF`)'q}jIBR9S,t&@I*2[yvFu!<MNiecI7)II{	q[)5PGVus1ؤM)O4-).L}
    jiHr)kM 3B03C<f�xFaf8#DG^3^=x\=oc_0"8C>zz֏[z/Z=pz@z؏[C]#GG=lGz_c֏X#X=`pȏX=d! #p!#pepHɷIdrM�kFm
    
    DlTlTl\l\l\lTlTlTlTlTlTlTlTlTlTlLb#bebe#be#bebeb%b%beb%b%b%b%b%b%b%b$b$b$b$b$aab$aaaaaaaaaaaaaaadadadadadadad%%%%%	%	$$	$$	$$$$$$$$$$$$##$#######"""""""""""""""""""!"!!!!Gov�!Go􃁥=:m=_mΆG^AC4g{|dcs-Wp~_W=ex5G�K&굨+5K*us-VAh;?/O#M3_VVӬ.`αTbM]`E[jOUBOhdIu][ڐ}VVQ)!8%>єzKO.U/L*5*eVhŖ>8F/E,OoICkeVhŖ*,KW<ΪA9%'JNҫSI[:	W6hߞӯygtij뾓ד۶<Zn1E-ɘS_\YQ)^Lh/DVʻ4|\jHܥRkhTzNS۶ЛpMy^x[H
    FX5
    ;fuqfGqCpʞ
    KmSUk�׌U4;tNY/xՕ4Zsf<j N#wZet|}1٤ OYANvRHou>5)*vQJOl,q<;٣jPm=]f:m1RɾG�u'8AI}N|4oioE; 
    ?u$Gϋ\ /%w՛Q'?Ri�7mV,*KqD
    \{EIUMƬilS?5~#G*f\N16iMS2eu%=d7KskmYȑ$EeLyIKpN~bth5)((Iy,ƥl5'sj2		w&/2tgn©|#G(fN4v픵*\BY=(?ߴXrӯ5&j<Lx3P!fC@UFKF5WRQaulOZ{Uf|[<ª|<Lx3P!fC@5&j*O7p"EĆ*+@O
    %UݿD)J@5&j<Lx3P!f@N%CQ|bUt)R%C	PzQ5&j<Lx3P!fBtx(c3P!fC@5&j<Lx3P!fC@5&j<Lx3P!fC@5&j<Lx3P!fC@5&j<Lxʣ%ٹo<*j*Nص^V	VynlLU<Tƒݪ93P!fC@5&j<Lx3P!fC@5&j<Lx3P!fC@5&j<Lx3P!fC@5&j<Lx#Lp-w4oioŻ)Km	퐛=x38'Bo`	WNKpOl	퐛(9LMWNKy]jFeU֤mF^;}Op9TlUݹ:R VJ�VeNdKϑ*gDٌažD1jQym̝fCqe?tMX$fY۵$t[#@H2cC2#l̬i,?
    ܐL͍MI*
    $ee!{BachqbVK)!e=ِwRl]ym�(+`f86ͤw[-^RꖱAH~|&:mռIjS"�Lϑ�_&j{,m_=iqf+m_=iqQw/vef+-nq1]w6G>s&l``y
    1Ϊ́(5gYyEV~f,[eVR^e}r5&b$kGLˊ2+1W;*(l£Y_~=JN+4ڳ+=ɺD`xm_vиr"rh[S7w=is0=Bt*Ŕ+&X7ڛ;kLxR`CIB#˳Jis
    ]Vĸ)B 
    j5	)[WK*"l `ҮJSW䮐SڔCS4oio,'{lٍf6m1clٍf6m1clٍ
    s%6q31clٍ"fm1cl
    ,(9Cglٍf6m1clٍf6m17&`d'm
    [bLւJhؓ4\clَ[6m1cldL1clٍf6m1clٍf6m1clٍf6m1clٍf6m1clٍf6m1clٍf6m1clٍf6m1clٍy&:m!?dJ5=WFԔA5/^jKRSS#5|_RT_ʦU9ɖ]"IBreH/�SP0.do6,\MpTޢIl8IITfTxeOiEWЕl#fn*XN/8&~B	9JљuSiqYT{+IҥOR梉fhK'W-%IwPOIk,%U;eu0VS[koJz`rLWOTcn0U9F+cz5:6+JLR?U4Y28``rLUQLUGTSV&+)UA9pV^Ϊ/	URPxR}+ˤ*fUVQ8IaƬՒ
    )]*gY<	: ˄pv�'5:4m*j]]<Ip{U4dqQD8zX}4v^E؎ڐ!$2uTɑ}+ocSj`b>B
    )p:/ǔ}M?uB~8FGy58S@N`Sق'N=ٴ:u]TWۅ@T;fu0S5NpƫmqW]58TjbGQ\I@\7N$_czToW˜н>4}],}-Ē㉨O|z-
    *Y)0ư㈎:uGtߴqiB]Sܵ*e\M_\lYuS}]%j87T:QV9%=c3N=!R0v=9TNWQTdj߳?.Pܚ?bc0S،r=h RicꙇYftqئ<SeV41ְeb3
    a~B'gPaYI3VR{MɁ ʜ5f/47}1*nZrt4
    bTIU+DS6$ޙ+îSX$63Mem
    a6boJ9S93LN!S}I)6]-`ʙlS6!Vv*x-*S&<nugNWclq/ǔ}M?uMMCӱӱӱӱӱӱӱӱӱӱӱӱӱӱӱӱӱӱӰ*Srzb:eƝƝƝƝƝ1ƚv7v7v7v7v7v~/iii1-B|qcqcqcqcqcqcqcqcqcqbAN;;;;u_n4n4n4n4n4n4n4V!_ӱӱӰ<wv7v7v7v7v7v7v$mƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝ	cPO}	�jߩ2le7nL7nL^9$';=DiF/-$	9*&H%Enb*ɾ s0t7J1}ݺ-0$; s03픢
    YlVgo*dS6ۙkrB3:j&զIdY60)&.s%v7wKMQfgD	~ө[]Jә29|#xfpvbo̭w$*2>oX1d)`a;PF5sqOCE0)&.s%v7wKMQfgD	~өzCFF	8B^>�&'.,*^MaRدLȝ[3:+4Tؓ0{:j͉'�`M?u#f8ġZa*Ц,L^*Gף2J"#љya+;dS2}z3(-Ԫ)^XjJ*Gף4?N
    I\beHf5"+$FEtd8fǦLb3R>G@
    HYpK0MW2hIp?3EuiRUR
    2JN̤U9[.a%B&d(o7+1Kj^5|ӲWNV)ȧc"v2)ȧc"v,P2)&0t<\[CPJ|Y4ҁc-'P͝V)m9[33"ELpjӪa6)'NV�IilЉݕ#
    5"*^5lx)2Ԉija*[r|XHFe#љtnW &ܿdSNE;dSNE;dSNE;dSNE;dSNE;dSNE;dSNE;dSNE;dSNE;dSNE;dSNE;dSNE;	lq/R~O}[o
    ԵލK[o
    ԵލAky-NZKxoF䷆j'TSky-7vQt)5~Fd_.YZ<-;lUT%2UJ:b2tQk*EYV?x	'iMy$!)j.QսX19(K?
    N:gml&$OfJP'3Uv	ѣ?4X
    {2\j
    _
    MEܩ@q޽y�hpYUEG
    
    NNlL0ؓUP*DIB	@1	ӍɞV?x&:m!?d*I'+UG	MnbU"S߁
    lZ'"keЪ[QPHBr5@L3rӺ+T^ϥO@ulɮ'ٓ]tO�]Q0*MlDm	Ӭ4D²�
    f3GN&46!4FpW\GF%hEk%i1ů MJhKe^5XvI	bjx124\VsFN4e8v-=Q-e/O\;O1_)M1EY:RR4CL0Nc!P&JDݳ>ܦxW'H0ٜZ*HL$fdR
    *jN787$FDM\0$%Wvβ̽aIr,KK)їeӂ.T#IgM"-/[h|/DdfBV
    *8T_̛ԝ\5HIy
    	x_EΖ'[׬`]XARLH=('NqBgO	G�_ml'"ذ5`kbŁ[,
    lXذ5`kbŁ[,
    lXذ5`kbXyK4HحlXذ5`kbŁ&m:ذ5`kbŁ[,
    lXذH{58lXذ5`kbŀцӈذ
    9Ъ\[s!`kbŁ[JsmH[,
    lXa\v,
    lXذ5`.2K*`kbr{wif,
    lXذ5`jqذ5`kbŁ[,>CV,
    lXذ5`kbŁ[,
    lXذ5`kbŁ[,
    lXذ5`kbŁ[,
    lXذ5`kbŁ[,
    lXذ5`kbŁ�_mڷfUYtop̀3 gF:7f@0%0:7f@΍0W,q4Y/0`Kar3AsK%y~ae_?jS2by.k;qYcK)-J|f%Fe.hk1:V;PngU,dO{mlS/ߵL
    BY\<M$V'po%\|-wvnGHeIk#rF5*w fOcUʼn h)QPnbW*w fTI2M6p.9&uS&!%;H]4{n{gMZZΛU`:Jar96N}buSP{:(dž=$e*1	A[Sೌ` $gnhT6F|-uB
    OФ)1-=#
    8$gT ;j`}	~{N|�nm=wE5d3<6g/X;9BO]fRي@!X΁,|ژTɾ s0w<,rFgkJ2g+`㕞?jSW2]yZpT=M\&6t̚\vw`KZLjq2ǿNI\)}0W;2>eTN	,kK|٤7~Hbl,b4jtwL_T2̽ϻ+SÌoS`57~-&u9ff50q.u-\PdE>j(j+s.yC350145soH=+1j
    6s35s.*m#O]jLHTL)QYLAO4O
    iVluC\C2)6$sObK|2KLMcGVm8 xe&t#fZWP ,jK]%G~TTx#o76fhAg�M?uF˲y/KD,
    X$4I`h%KD,
    X$4I`h%KD,DI&xҼc%KD,
    XINʇKD,
    X$4I`y]KD,	ʞˋ.,
    X*_5h%KD,
    X$2ӢKD,
    X$XT.)RWD,
    X$4I`hRD,
    X$4I`haRaLˢKD,
    X$4I`hNI`h%Z¥Iv,
    X$18Tj%9¥Ɏ,
    Xl*^c%KD,
    X$4I`h%KD,
    X*_5h%Z¥Iv,
    Xl*^cl%K�cASQK�مKETƂ$B,S>G}
    #
    "5
    QÚpjϤeUI+hu*aq*OGoX8E_n}#*_rePLq&S1ݺINq&a'A*NK�UoH<Ιz7RS�ōaTUÖ8rѨ%ItF:yiK>ho
    )qXRm%Rr9xϰZvr{EU@peMV%MD|*wxWGRc-s\YX:򎾶"YV/Ή91,GtURz4ra67Ƭ+T䊜ե.DU8ʦ=uBh=WNh=U:}IJ6&'l	#I=&.E
    Sklbt;n/) Vי))8WN^KqVWKebt께SmWESwNgkp(Voӷ,Ptar2e#UӼJpުqC}W[$2-o@^33>z,؞R"[K[ @
    oM~ޮ):X5זwN/}L.}MkӪaKz@di:l-/cjԸʙv,ǞE,�RPN84EI(W1yHVY3�Rn_e4�n�	}N|OSZٳxp7
    jQЄ\57
    jp]ZٳxpLPp]͛Å5NKR1vk[6o9-K ؒ'bDr
    "v$E3Cx!7bH9kgjKR".D}r"wib'el,iLͱy1![ULdTbd"b͛0ɩdMሶ{O]r6o6I3c4CAlI{T?qЫ-[U	/a(eሶ{(TGFU"+sUukB7UH)tkO͛e'4h"&nu[Utfd0LfDӓpܕ2TP(͛z5#"Bim1"?8]D(&m3fލF&đr*/7|eTYPđ7Pef޲tg6zj<711s=%ܷ
    '%Sl"$ND8SŠؒ%\"3D+))�͛eӑekbH=r3ۉu:ڮO,$l&,n[=D*fT[U)˜#�"hŮ|*1t{'%FKb-܂%:ڪxUQٳxS
    oϺk:ګ5Y#=L(Oѿl]T�(ߴAv	HfP]f`e&i![‚47W_kc8P]f`mlguz%4ͭnD0<r^5%z$zdA{.A"Rԅ2W&53BŔLlƘ*H]LУQp8]3oV[5kc8/.q:p8`iWG,ӽ[ƶ3lg5kc8q`l[Z
    `3T}cq[	�[ƶ3lgaz5kc8q[ƶ3lg5kc8q[ƶ3lg5kc8q[ƶ3lg5kc8q[ƶ3lg5kc8q[ƶ3lg5kc8q[ƶ3lg5kc8q[ƶ3lg5kc8pS�i~ӯ?]CWtf)Q3TY(,eGgqӂjE
    p|8U͌,,i|5F002LTX.^6wnJp&
    )s\.r՟go[]w/Un+Hc;p�&4~c1ݛ@r1ș́-qa#rU14uHܱ*Ԝ\0ndrcfKzIb.>JV:K\s$Rd¬S%z,޶fa*|J͉ja>fl(	̭߬ZZ!uhҙ.ƛ\fBG4pUT̠-u[%+OEl;L	}N|B$�mmmmmmmmmmmmmmmmmm1b%Mf󍹝2_?O6v6v6v6v֯^5Q6ŔvELyrJ`ۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙ"gh~ӯ!Mw)}N|4oioIUg0m[5ojw>ﱪ}cT{ƨ}Q5Gjw=߃T{~
    Q5Ojw>}߃T~
    Q5Gjw>}߃T{}Q5Ojw>}cT}
    S5Gjw>}߃T
    >ﱪ}cTƩ}Q5Gjw>}CTƩ~
    S5Ojw>}߃T{ƨ}Q5Ojw=cT{ƨ}Q5Gjw=߃T{Ʃ}S5Gjwﱪ=cT{~
    Q5Gjwﱪ=cT{ƨ}Q5Gjw=߃T{ƨ}Q5Ojw>ﱪ}cT~
    S5Gjwﱪ=cT{ƨ}Q5Gjwﱪ=cT{ƨ}Q'VW�?�˶~	r>cA<μL-L
    ]iPpZC%QuҸ}GM?0x3iD(
    u2y#]LFuu2+eW5ˬ$kY^HS.]ey#]LFuu2+eW5ˬ$kY^HS.]ey#]LFuu2+eW5ˬ$kY^HS.]ey#]LFuu2+eW5ˬ$kY^HS.]ey#]LFuu2+eW5ˬ$kY^HS.]ey#]LE?Φ}ey#]:
    w4K5ӭ.sN]:
    w4K5ӭ.sN]:
    w4K5ӭ.sN]:
    w4K5ӭ.sN]:
    w4K5ӭ.sN]:
    w4K5ӭ.sN]:
    w4K5ӭ.sN]:
    w4K5ӭ.sN]:
    w4K5ӭ.sN]:
    w4K5ӭ.sN]:
    w4K,ͦt�H.y[L
    m2'5ˬ@.y[L
    m2'5ˬ@.y[L
    m2'5ˬ@.y[L
    m2'5ˬ@.y[L
    m2'5ˬ@.y[L
    m2'5ˬ@.y[L
    m2'5ˬ@.y[L
    m2'5ˬ@.y[L
    m2'5ˬ@zy{M1INRx(minx(i-ŝ$iK'�DU{\&$Q$=PDEJMaM)#R
    ("3^	Fv(i&I߈m4,D
    'ǟvT,CmKRRFe%vڪP0渗S袜$!YA0p**L_Ωg|eWhpar15N!3ZH6MDCdMͨh$"bKq-n4(JR%{AإvGŰNdC0.EkBۉj!ȨeDCMEJN]4{
    TR(eaal9	0I8؂'d\S
    y/�P׳
    G27Q.32v6ZnqϷr!5ç_qlJ{&ZogJjq
    }vmBbFTj4%	TjyJ|D!lc-uĶ}%c!fEH9{{ADȸVX(#&3DCDs\[GAKgVDO,
    o)LQ-.	6%xUҨuC)BVkIl|mN.-ؤqPmgpm<S)eII͡Q%kf)QdfDfDfFtc&S
    BM
    (Śft%dT(ҎҥLfvszPbpz9?o%Pn)b\Jͫ	hr&%W܏C1*e|[ɇuNSNxjQ~*`la9$bgPޓjjٰ-
    o."7ђ_/ящ)[shAE">lBlK҂uIQ`!$&xTE3QC9m(YL8KA-XhQ<1ɝ1ɝ1ɝ1ɝ1ɝ1ɝ1ɝ1ɝ1ɝ1ɝ1ɝ1ɝ1ɝ1ɝ1ɝ1ɝ1ɝ1ɝ1ɝ1ɝ1ɝPG|b*w"G|b*w"G|b*w"G|b*w"G|b*w"G|b*w"G|b*w"G|b*w"G|b*w"G|vU*66shʐ8be+;<Y8;~deM$>"<	lfrXbe
    !HL֗&%a2QH%!.ŲD_*1ZRRcP~<	)%6УZLAI$ltvLIv⍔,RJ$8QDpPDFRIT
    KRS-/ٙaaRJRԓΖiFgI`]^ŷŕk\2#>?cl;JMBJ,""q*$BVD|).g٧g}pG&1.R푚TCE"xIQ
    L#ڋe'a%P<h$&K.;
    M{	pP0Oo@DKЂSiy3KJ&Vi4,Qm`s kz'0̡	ʝR\J=dIiNeطcGٌ?bqٛv4[&P?"R^^qlPؙFE@llwc$:K,,4AE6VL)&do0Q"3k'[Q	ٚJyOfG>xIy3j5$4a
    uӦ{Q9^O%kmqǺ"KOC)v!(ϋV*q	I]۽mVHQ&Ví9B͝i`!,'cI^*X&(KN1	5:Dۍ;M<m"P0+jv`jآE@!κmL!m>h7]hJ4?Jcoc"ۉ5ma:J'aQDꑄRq(L]MK8sg =">qVO;JҶZ!,4lpژv1hA?2KyKkw!IHL>dC%
    RxEW<"UUs*\xEW<"UUs*\xEW<"UUs*\xEW<"UUs,pbw)pbw)pbw)pbw)pbw)pbw)pbw)pbw)pbw)pbw)pbU[1m6}f>FُlѶc1m6}f>FُlѶc1m6}f>FُlѶc1m6}f>FُlѶc1m6}f>"WQ%�?	fIٵ]r[SiTu	Rxꐻ-m#fFQJi'fN:F:kJLp"C P+&w;*Ez/QsHȶR͚M*&V)>v{yc?*d݀q\PJ6(IILYNvC*3 .j>T%L\omWWiJȜ.7ƪ+c�8ȗv~"2
    -)+qn܆5MNY{sc4zLO䨨-(goW?oaQf8$XS`W�C
    4ЏzZZZϙh#ϙh#ϙh#ϙh#ϙh"?=)�.{>e=====(>\|A\|A|A'=3G'=3G'=3G'=3'=3G'=3G'=3'=3'=3'=3М|@|@|@|@|@|@�7=37=37=37=37=3g
    �sM4u	7Ρ4F�&:AMoBixu	=9&Ph#Bi9&P#Bkxu	=9============9=9=9=9=9=9=9=9=9=9=9,���糦糦糦糦糦9鮂=9鮂,糦糦#Κ#+Κ#+Κ#+Κ"糦糦糦糦糦糦糦糦糦糦糦糦糦糦糦糦糦糦糦糦糦糦糦ffYڜt$L<Bb!`f!+B^ak8-.:ZxG^�A?fT.D_l̆EO(6dqk'cxEʢ爟$X/!Iݶ�vBva[S_dAR
    mb!QX5N4iU
    
    /ݪ�a	ephNp*}&xI$+
    ̌ҾӶo$cC�]K1LqH:RN+JZHIEIRCa}=W/'^I�/�,SG9?vOISJ?eB.8l)**#ttb?	�xTwV
    3cH$TX/(*SE4ئűQ[b3,QʋuV�w|Tl"{ˆ͟SAQE5ب8-l[lp[h>o8-T,
    Nb+!fcرEMc,,[U,lp[Mcآ
    ?xElTVQ[]tTVQ[]]]]]
    設(
    VŒ+bn(1.[褓tY"1n	,ыtbETw87AF-eF-M�M=tbX[l~tbF-щtbx:SgeJe6UYwIa`z0K&T3.�64ا�c?s)
    #Qw/|DPtSEO)௻u^593%|*HZ`utVd;p~,#kExxPti]EbDeA?`l2$hMfd_)xL̼{<6,>.œViutPFfvEGޯ l%TM6W3M*m"'GM5<*`<N6x8hYA_!PDDvسV	?'�#O$�VO˄L/_%	IiIX"JχTB
    eBɋ*
    G*M~ؤUT*!1E4
    
    (|X?P,|ET*Q`T(T*,
    
    _bH
    ~
    �D* Xn)°~N�=+/Dphx?/w8HuKe%BpTaEFEZe5GYe9wmHݶY#vd]e9wmH坶Y",˻lG,$r,;lG,$r,;lG,$r,;lG,$r,;lG,$r,;lG,$r,;lG*$r,ʻlG*$r,ʻlG*$r+ÕvdUexr,;lQexr,;lG(W*W*W(W(9Gm;lQ(QexrExrExrExrExrExrExr+Ôw+exrExclw-岼1ܶW;Q^[+(w-W;Q^ExcW;Q^ExcW;Q^yExcF}b1s+(w<1+1+1+1+1(g<�sg<�sg<�sg<�s
    <�s
    <�++s
    <�++s
    <�++s
    <�y^R|6wG;'o*/[R;̫`oK62m.ʾ!ֿT;'o*/[R;̫`oK62ٝ��η,Aе$xN;N
    $qd)59Lnqp,\)D!EJXiХaԚOr/ PH
    4IQd2FStc:$?rΙZ\s&ϊj:mDx<jT1[ѳ
    Q*iL6
    HGT2pH>-ř,,&$��02s7B;DE>&%0< ?I<Pg6"`
    jA8DiZN!hY%m6дT(ȼ	ǎt`,GA8#Ԝ*v>I/?jm^+BʅEe%M$dgzoD[Y$!n,$fdJqTҥJRj2!2٩dO6_ahԛ(}t)
    JHTT*2#=9ڒ4a04Sq(RTam!.!Kqk$6$�#vs��~zd�^me_;�~=)9,iRfDTĤFDEYl91AOl[%	yY%I%,3#-gf6g/nz$!C	R}Êy1h֯jO0kj)Xg="PlD*ք-iTJ3Rdt[[}1j0BT%RMȖP]lpYALB`DN.RgE8**ʊHJ}NԮ+f?é-@-GpR]1
    	|R6o8SIL$PSSGqQ
    ub\B>=Tn0Jjzp\jCDZ_xbnXFBZGE&A2̢;;aI%mGNKJJ%).8&%��o3@K:	p2ICTaҒQR#́;/nk-&Cl>9ZvfSPjm]Hf[pW9vfnp!(K&f)uJRx&iVvqQ3#\6 JL\L+BY&a]ݵ}63tũ0'O8[dS&St6g56eJxݙ)I=7'ŒP..%x($	$Tta^:(JZg2H<553ZpqQfX\Kh"QdB
    hJ1oEqdjK,(KE
    $QS	ŷ7ۅ-dr+[ICQ녂=1
    8JR_N˶kwqpITP{1!v]m従W6[.;j"y)fnAA:%P1”3QщK7mF`v?frKO5OGA h̞.)iZlvy`ܸ!a<)yd6,a2RmLG"*
    Dr՜CKR16(JtK%V��?_>?כ}W%W?YWJ8imLC .$Sk*
    DPdgYv74цf0,;FGh|HoiAϧ0iY,<YK$*Q"RFIؕ>2	$X;6Jr*q/Z	
    [ȇTMKQHȌgA`54A53CIi/"[RRHKiq0dm("JPGI"I@E4̍G3SAN5SE'Ef74цf0,;FGh|Hoi
    #aYv6kgi}oc~ah:PQMA$~sA)d"
    $rY0$Uil)JHI"$"ll< cźI
    x&ZhRi:1
    ię~-{3G<E45���?W؟H_Kxܟ`vK0[K(4=,ICl`5i^
    k+#|Hoi
    #aYv74цf0,;FGhX834&"]$ΊM$&t&TSA|I/vJ\!L6ҠʹRG+v&\6gWkC'Qa4ei$ȇC)2JU^%=m:^#D
    RIHΘx6$2'u+Bd
    L	)*J*###"2:B3X5,mA)5[JMFFT%%MC|Hoi
    #aYv74цf0,;FK=7~-Goa0B(̈4цf0,;FGh|Hoi
    #aYv74цf0,;FGh|Hoi
    #aYv74цf0,;FGh|Hoi
    #aYv74цf0,;FGh|Hoi
    #aYv" 6A!-
    #JҤ&d�-rY9*}j6\`m/RFf?*o;},,/lľi"5Hy%82ZDQҢ#;$#-eqr`.`
    IxR,Q@AG@5	tK"R͗R2K9f'2)\_-mRW<MejA)M
    6J)k
    x¹̺nukBԧQ֣$qdD#J#I SX(#Yb_
    FDFCpNIS`f0,;FGh|Hoi
    #aYv74цf0,;FGh|Hoi
    #aYv74цf0,;FGh|Hoi
    #aYv74цf0,;FGh|Hoi
    #aYv74ц3KOLXo|MaqkŦ,IS;\yٕ|ClpvOfU
    ^?כ}W6zd�^me__\yٕ|Cl~pvOfU
    ^?כ}W6zd�^me__\yٕ|Cl~pvOfU
    ^?כ}W6zd�Zme_\iٕ|ClpvOfU
    >?֛}W6zd�Zme_\yٕ|ClpvOfU
    ^?כ}W6zd�^me_\yٕ|Cl~pvOfU
    ^?כ}W6z̯5aEN"ab'2pzY|v,nyOH7;ڞnw= ,jzAYpg{S
    OH7;ڞnw= ,jzAYpg{S
    OH7;ڞnw= ,jzAYpg{S
    OH7;ڞnw= ,jzAYpg{S
    OH7;ڞnw= ,jzAYpg{S
    OH7:ڞnu= ,jzAYpg{S
    OH7;ڞnw= ,jzAYpg{S
    ζmOH7:ڞnw= ,jzAYp{S
    OH7;ڞnu= ,jzAYpg{S
    OH7;ڞnw= Ypg{S
    OH7;ڞnw= Ypg{SOH7;ڞnw= ,jzAYpg{S;OH7;ڞnw= ,jzAYpg{S
    OH7;ڞnw= jzA9psg{S
    OH,w= ,jzAYpg{S
    OH,w= ,jzAYpg{S
    OH7;ڞnw= ,jzAYpg{S
    +12]3'	~9/heM�?�KmiaR|Z7ԅpԥRBM-(#IFJR?%).�X[%UhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhv1c5͐k!6Cl3\fsd1c5͐k!6Cl3\fsd1c5͐k!6Cl3\fsd1c5͐k!6Cl3\fsd1c5͐k!6A\TFt`!$IIR-kRP$kRRP<R_I5Ii3YJ40S(JxM0<:i'	efX4(R$�預exB#n8⡶TJ)Ga$fd&2|',f	4P#
    `X=
    ?4*O]h=SCl#RʢȨ+43i61)2:
    4PdgXRN»+ͱI/fߜ8̩uulŮϥEA:Lò vNL)kDGq0P	[/DRa{И6&һpKgiBDq0B)Mm*('^
    /	̓/cMCf3J_A&ÅA(x$q)fZ͵m(۸M%xDTdf)a2
    ۨ
    6x"BRi*H!)DbIBhu%Nu^KFNqJRphO4\T|q0*|mt-g8q*23UDIc ^Y1ʔEYJLȸLm96&Q8+i[Ԉ(Ѭ",S:H[+-٬qdAE!kC>;o›Q;i|m)Z	eIt.܎Ji}N4N'		ik"%&RBy4pr,:)q=xH7	%�4drtFLۘE
    \xXK6h%9Xx%d d-iIմ[78x	
    "bXV+bXV+bXV+bXV+bXV+bXV+bXV+bXV+bXV+cv;E|c1_hsW9+v;E|c1_hsW9+v;E|c1_hsW9+v;E|c1_hsW9+v;E|c1_`*d?NZ_:tY0M(wR|;4V~y$I;?A+hv2f3.ԔL#E#/FE`ΚFL6.uӊtp\a0$FgB*?"26vŊ.`|6KTU)lm0fg
    0!.R̸TKKm#o8lH3'fN3gp/u$I
    mCnC3;~144zC?'O3n)4-:J4afuDfFD2.D¼J4PIr
    IT*RXDovxװD%qM f,_P뤧1=BZ"eT>{+5%L"'ҠpHa*Q!PiZSݘ÷xGQa *‰Juhm	-`^`!f01u
    za-Q7œA%T̍gl6'i=a91z\|t"A6ßE/_mX{scd;C_T,U;)q4M;NqK`D!նMA
    v$(q?KJ<]vQ-EBP;EC>%VKJۥFѨS]b*[9"-%,LɅ84*8	OfN8Bvgjf;ev*%%IChDC+"l5]Y0n)ZTc!f5(fVd3v\>4J JšfLR\\!Ld܎xy+MrC)s	-[Y)-6_I-NmT;1
    ^"qf7Ѥp[FKmJ#%R
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    i+>³
    ϻ+>³
    ϻ+>³
    ϻ+>³
    ϻ+>³
    ϻ+>³
    ϻ+>³
    ϻ+>³
    ϻ+>³
    ϻ+>³
    ϻ+>»xWt
    ]Ӽ+wwN;»xWt
    ]Ӽ+wwN;»xWt
    ]Ӽ+wwN;»xWt
    ]Ӽ+wwN;»xWt
    ]Ӽ+w(H�ݥEq\t,D1
    !fе(2xIQgUE0fGdF8Q)lM-DiAt{)O�Cэ?"[JڅePNZAJ#*lt]PϺpJڗ6CC!*$QJ۴6ھ'QmmJD4Ix8Ԃym!NTڍaFn]ڡv,cl F
    gRjj88͓$x*(V6TCMdzf,6QU𰒃?PtR2h]$PR?
    'ARG?
    J~H�%G?2Ts@ԨtG?
    H~H�%E
    J~H.5"9] jTs@ԈtR#G?
    H~H.5"9] jDs@"9] jDs@ԈtiR#G?
    H~H&5"9] jDs@$G?
    H~H&5"9M jDs@Ԉ4bF~I&))"yM jd@4OdHtOdH4i#RFO?	'FO?	L~I<&5*yM$jTHԩ4Si#RFO?	J~I<&5*yM$jTM$XE*yM$jTHԩHԩHԩ4S!4S!4S!4GTM$jTM$S=bI=bI=bI=bI%OXE*z&5*z&5"z&
    9SPzJBiCSM(j=	
    ?YM(j?	
    O4&5?҆P~JiCSM(j?	
    O45?҆zP~JCS=(j?
    ?y=(j?
    O5?҆zP~JCSy=(jo?
    M57҆zPT[!aq4/9^iFn%1V4-BЕiRH#O޿�pپ0>5.'͞9DZoG>!8	f9fgq-xHRx+gM?z�5(pqjBHztJI2{_ٴbZT:1mF|Ш33,#”EE&	ht:؍BK0hwњ0(c0̪1\g|K)6xi#5Cq'K%I;�tȗk?}"AGV>qMB`V(Eؠ|+,Ȥ"ɊȠSXSM?X,
    J,|`t|)
    8"d4
    
    BHQE1l(Wc1EB
    @
    
    B,`dB|+|TرUdT>oU?,
    B|,"QH&zTzm־EEb"SMGdVc+"E"+|]WdV,Eٰ+8?,P+!X;"LY?IPtR87E6Y&8)X�b4__R)V+k4XH!W`R5T`I(mϪVGYČB|b&񈛷"n|b&񊛷*n|bv+)]1v+)]1JWoR|bv+)]1JF	]1Sv+)]1JWoR|bv+)]1JWoR|bv+)]1JWoR|bv+)]1JWoR|b=N	]1SvOw|TWoQ]*+Ew|TWoQ]1S*.*.*.*.*.⢻|T]QwwEw|T]Qwww|pwwpwww|p]8;・8;・8;⢴8;・8w|pwww|pwww|T]8D8�r?_PC8m_[}CmǪZge�
    jk?{/8m_P;YÉۏU�'n=W~_q?
    ̟
    Qx(,5$T:(#r63%୵X2Q!J4I?,xfD|eE%OT?%%�e1�GHmV*֕f5QÂGAY;^0	DA		'A"AeN.2z:KRE%4dRɡ:,deIFd"bn:JЛt'G,Sx/J:)"2FeQ2
    I2IYdȈS3"*ۘJJBUSYT
    gĤNkm4fFDJQ(Β2""΢?<�7-lv0na)"*OZ3Bs^"x.
    *L袜,:B*6^XNqaI	,%4L35*D{&Ҡĸҵ(#}#YX3Y(Mz&[QFّqƓF		$:I,"_Lɴ".5:-TߛCn7Y&IT̓XDfTڇ"#7Sc<#RpIRPFJRdTT&na0$<)ˋ%Q#5	X#eQ"2V	4dXDdFGEddFGU
    o?d`e'HRW♕&eEf	TՔLԕ%4ai22$ЪKSec\c35iQ*""t6HHaȄqD.̋7[C̬a%M*!jTPmRI(B줎a`#4&ta!*;&fuK~�Q7!a^hMCA`gIRAJ3KumvjOjLS$Ґe(K2%qI+'hU*)##Iބ?F\[mtO4gJՌI$"ILB(k$
    M_N*<"I	l-)409$NjYIz!'\7
    )ոDIJfTDXEAY";0.4hq\b\IqhQ`!FvL_DȊ�_ۏU�'X&<$&-gE
    QF\
    ]55wk,j8XqYcWyƲNPfI`褜##!ĥV HmGI_BH堜+?8S25&
    &:L̍)3g]6B=)
    *KEEPqYcWyƲƮe]55wk,j8XÇ^SCiIR#+$9X](y[u8tvN9Jk0ҪlI֓$tY#a~ÍaWO¦|K�cFxXf5X;DCFaxXdAPVlSHqYcWyƲƮe]55wk,j8XRqf}!q-bTTX5X*π@iCۦfBVj.2O}8ZsJʂRhB\Mi3t̎͐TBQBLA#T3EAmGEpΊLΏƮe]55wk,j8XqYb
    ..tgE-%a*3ȬqYcWyƲƮe]55wk,j8XqYcWyƲƮe]55wk,j8XqYcWyƲƮe]55wk,j8XqYcWyƲƮe]55wk,j8XC\I22]$dvHR>R|g~*+.T:
    |=884QуE(wXqPIJh*
    bT7P
    M/UM8EKMJ!i8)3O3rhy
    QJTDGӂtteKCZ5$KTj3̀NC-(ڎpΏj8XqYcWyƲƮe]55wk,j8XqYcWyƲƮe]55wk,j8XqYcWyƲƮe]55wk,j8XqYcWyƲƮe]55wk,LC|g%TӊJ+[q꿖;ZÉۏU~O6z孎~_q?q꿖;YCmǪZge�
    kcO6z孎~_q?q꿖;YCmǪZge�
    >jk?{/8m_P;YCmǪZk`?'n=Wk_{q?s꿖v
    kc8m_P;ZÉ۟UO6~!-@ge�
    kcO6z孎־~!-@ge�
    kcO6zbg;\L1ʨ<x)G�nl]эͥl]эe~sYn@ߜ[75c~3YoF75c~3YoF75c~3YoF75c~3YoF75c~3YoF75c~sYn@ߜ[75
    e~sYn@ߜ[75c~3YoF75c~3YoF75
    e~sYn@ߌ[эeߌ[эeߜ[75
    e~sYn@ߜ[75
    eߌ[эeߌ[эeߌ[эeߜ[75
    e~sYn@ߌ[эeߌ[эeߜ[75
    e~3YoF75c~3YoF75
    e~sYn@ߌ[эeߌ[эeߌ[эeߌ[эeߌ[эeߌ[эeߌ[эeߌ[эeߌ[эeߜ[75
    e~3YoF75c~3YoF75c~3YoF75c~3YoF75c~3YoF75c~3YoF75c~3YoF75c~3YoF75c~3YoF75c~3YoF75c~3YoF75c~3YoF75c~3Yn@ߜ[75
    e~sYn@ߜ[75
    eߌ[эeߌ[эeߌ[эeߌ[эeߌ[эeߌ[эeߌ[эeߌ[эexh}%v'{d0GhES
    X>)!�?�vRg$tXb.IyCWշHt޲ū{{Qj*2\6Zfw}ޝޏݏG,۵޺n4Wm~m[mT[տc	goC݊?E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=>K"	g�y>D2^E"}^k"ϑׯ5gȆ_kךȳC/dY!,zY|ey>D2^E"}^k"ϑׯ5gȆ_kךȳC/dY!,zY|ey>D2^E"}^k"ϑׯ5gȆ_kךȳC/dY!,zY|ey>D2^E"}^k"ϑׯ5gȆ_kךȳC/dY!,zY|ey>D2^E"}^k"ϑׯ5gȆ_kךȳC/dY!,zY|ey>D2^E"}[#m;4vv�^zk͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S�eFE.Ȁj4mXy%^JdiWnOp5tdYGm}Ḿ}wVfhۻe.	[_cj)۷z{5Uv6*}4PeX\z4;iZ쥭b4rlosz}%߱U7kN;jtV9_-Yk۰pUtv%%~]wVVUZTQm~:*Vn&X_n0(I$rm*]ݯvUvwKf] jz>|Fxiy,KCR+3�3I
    --T֝%mMUܤ{"p>Ԅ97%;ֵ2N5/((B{6RZJªgj(cr]Wq[л]n
    ܻ,mFըOvUrfWfWevd"@e-[2ߤdՆYŋWUq5{)J'##&AYqt팫ʑ*H^–j[&^ZrQ^9B]	l&e3o|NMod*Uf=.v]X��p UQP\ᨦ=2wwfcLpȳWZZףM[ٻX@>\:$PUx6Җkf(fuշڴ^{U/Ħs~lb"F"f y\eBQ0;`WL*6Sa*P�rd1%WLU?CfoΚ@PʒաD?aSoW]]*ohY.&vvMuc[dRt[KSRܹM5Wnz};I9d.˔�X(G\zc+.Y66HH[wKmNhDAo'FĐٚXgPqqlzqqx>xEMdAM5*m]9'	̌%#o,.cD=}m#GŖЩ7[G |Ec�\0|C(Uebu%e "*OE+ŗ٭Ku҄W=tg#ty9DT9=^`V;eԢCuo
    'Vi߳'l6A+8fjxD؝KMmJRߵ5ݫOs}MzS^׭5}MzS^׭5}MzS^׭5}MzS^׭5}MzS^׭5}MzS^׭5}MzS^׭5}MzS^ץKW^-]z[uoץKW^-]z[uoץKW^-]z[uoץKW^-]z[uoץKW^-]z[uoץKW[�uv?ïkt�a:O?ïkt�a:O?ïkt�a:O?ïkt�a:O?ïkt�a:O?ïkt�a:O?ïkt�a:O?ïkt�a:O?ïkt�a:Oʗ}c0}vi.[jڝncJ'Uw6SѾv}K
    .oqkW,ߧ~5~ޖKoR\]jee7kQ{uMҪvK|sRf֥�ի
    ꚠ"uj׵+56=)jD]f2ǣYJc&H4(|'۽~VUXV]۽Nin6hG%	ꢎN{SiVm;oaF2ws&5BӲTP̑-l+KeF(K4+,B#4/xNz"/&^QK{~[[IrwzM/V3ٷnF׽;EUtq�}~b{oY_i]ĈK~J-QjuU飯ҋT׶o1H7f66q{}mY,F֩%Xr]oWrqJbX$Q2gT'Y]Se+Tm_&fOI[iK*Q	l[@1[fGW왞aXSZ #LBlFJ#[!V
    7sޔp\]ET??V͙W#[PdA	CE-cB~,mK׶ݩ:v'6zx&IiB׎CD46"#2Wb(|@|Z">]/iiF"ĨK'=9 j\.|1Id Z
    nU~B
    o-۶UⳉyF2YקyԸZw2q0P3�{2Fg�͵u[y2e2b24e	[ǘYk.G㣁qXL-(n{P�b78"j3yT�LZVD\b˂UPJmV6lpRvtxtx!eR{(&R6dիPwU)mZY¦W=e4_%93Lc.<SfXK4)|Kv˄ދW߿nNH:N€xp9ltDڂuZ^K=X{Wr6"(C=k_XfE;ӛ[~/C.loԄCB6^N̆;7Ƙ]r]MjUZ2QGbL _}U=FhrVͮ6ߒN6gz?s^~O׬߿S57z?s^~O׬߿S57z?s^~O׬߿S57z?s^~O׬߿S57z?s^~O׬߿S57z?s^~O׬߿S57z?s^~O׬߿S57z?s^~OmFݟkշ~Ol׭{fmS5mzٯ[kz^k=^שOl׭{fmS5mzٯ[kz^k=^שOl׭{fmS5mzٯ[kz^k=^שOl׭{fmS5mzٯ[kz^k=^שOl׭{fmS5mzٯ[kz^k=^שOl׭{f۹oޅwmoGm}OT-}OT-}OT-}OT-}OT-}OT-}OT-}OT-}OT-}OT-}OT-}OT-}OT-}OT-}OT-}OT-}OT-}OT-f}T0wimpᵽ�}kGd	//x+FH򕇀IÆ,SwqS޽^=JhYv\\>v)^Wxty6+v/ߦHum[�{Z}g߱M5m_UVmVѧBɲ޸rr,ٟL)Ȇmj5޳WMms$F(dayQAʔJqjcձUЎ«Vm[w66~6uVBնU5fzxE`2PK!yXPP6۹i]k؉s],J[穠:oyzj&-wj(Mwhke{ָUmlmmuޝ.ǥKKocD?DQAM2e%`Jƪ]JB.tvmv<voMMuvGi;ތ7_elnv}T붧ӷo;c�ev�bUϮ:mI_~7?>*~%\޻dˮ:mJ_~W?>*~%\޿D\us뎿[Z~}qo^%\ֿD\ucsto~W?>*%cֿD\us[Z~}1k_]Ϧ;}mkKo~w?>.]Ϧ;}mkKo~w?>.&\cֿDLvs[Z~}1k^&\cֿD˟Lws�[:.~}1g_eϞ;lL~?>x.o��<RkKmv>w{?qw?Z|q[_]ώ9}kkK/m~w>8.~%ֶDrw_Z.|q[_eώ9}kkL/m~>2&]cֶD˿rw_Z.|1[_eφ9kkL/m~>2u&]c֮D˿sס>6u&c֮DۿswZn|1W_mφ9jM?]~=6u&֮M?]~=6>u']֮D뿞tK߱;3;c;m'__Ӧ;gKt~N/&}9vDϧ<x�Y1;_gӞ<}gkLs~Nx3vDϧ<xY>;_gӞ<}gkLsǏ~Nx7>&9v?dϧ<xY~;_oӖ<fMrǟ~NX7~u&9cnD,y?Y7_wӖ<fNrǟ~NX;~u'}9cnV'1vb'�3D@Ez5CVf&)wgD2'VRuV-^(k֚~3cmmz7OS&5߱e~j{
    :o&ثnQ]zUSﶎ7J2qit�ٳ9P+L[<E^Kjݩv'vѳq!}=Mmc:~�zLhԧ^&S$	.S}X1p(м4nBk֪dFC׹U>PN'5%L1MEG(mN\2{ܼ-;ӿS2v}qϡ߬wU:#={2<uҘQ\y03Mʶܾ2-趩%VUYzB,sWۇ$˵lgI'Ah-oN;o6u[dgcc}?Pc
    {;Y1�C<1=1Òpvth-zlE)`i`22eQ#(6(MƻKT�-uQ@xA5\FQfWB<Na%e(pc$o۝SQy�{nF;[Ė?-Sefo0fCb,;˿Jۻ{c1R1lO
    ÒLk<DN)}(e�R
    2E2ʇdkD-8_;zǢAoΡ0{YpWL8.nw7x1eY1KZ1}ճˉG*N{߼@`{3�GXA[C&@<|NU3zv1uZޖK`I#ia?J~n9ބl`yU0PT>xۓYzT4F/ikb9%e0<KA6IoC"ĦQ�21:"aygDDL̉UUJb{:B񔚃h0&T)ɹ'Kc\%trʬ)gwBQ6Aq$&5D	"6L,"(qijzZZŮaBDThr3rl4>3auNISz|Όt*nxS'0x>xl%i{OQ1Xzj7i72B8/#SRK
    }DY,Li(ڡ:T8JaY�/d^*DhTЬ#j8G
    GR,^CZ1˕fkA=6/<d%5a7Ch~�sx
    ~�4`O܄{wNW3ypc/R<y# `R9qǐ{{u{v{zHM(~ZxZ2
    n8hh$)�P<|Ni11!ROY]PޡLQثOIAR)<wAB{seuH[{ے)y^iv}/ͱ&.8c?law!te'/v*VqJoH̭A	cN,zo@8#2GRMFL+PjA	i "F譹JV+r
    :<ɻ,蜆?ްd5VL#{+t/M$/l,|!qhvg܀.z <[p
    #	 *+o/*iF`PFȩǡ5gѩah<}EBـc}
    u9,tq$ 1bqVdqՆqv)J󽋶x#,mR	d{yK<P'2jHa}e&usk4N;5�gHacXDQ311K,;A!ㄳ3Pۇ.%XuZV8\ҙ#QK9bBrRt'#	6f3~U4jw@ѽFTw-ӷ~g5&@36r$);'x6!C8'bt2QP[={7˗Hgɞ;mqC'Ob!ޡ8f`<r),j4EiEw*oqI+Dy)ōL&t&@^3)1d#FľxP,qm}W8)Ov�?k��Fkw)cZ}^ƿsC�goz_�g~m�^�F5z?;zmk�kSGc_ݶ�~v;>^sOOOOs^�zzmg7۱V;k߳z^c�kѫoWkn߹]g~}�ޏzZ5z-bףgŶ
    �km~~mzަv{mcg�ޏo5km=�~�s^o-^^�s[�n?u^[z*gv=KG]mzs}z}?5޾o5uMgj/CO�}=]7סc�^o�ٯ]o]�ů_o5U]w*7߾CWDD?u-룱oz{Kos}wEuSL:GJўX]v;=ǻ�}vjѐ\fKeƍnҎmުiuV~Q]C}{us:mﶲ+ng?__2;�o8+>SBNТei-"&&!ȼǾ
    7RD̅Um੭KsCRu~03Yʼn:k�eSF&LM6F:A8PT3c|ʰA e\lA`𸅛!Q ɓ~K1Qk{귴#=
    ,7> %%h<?
    )&W6n'VW]q=KJOqu+l!W6#X`6%0r1Ո][:>0H{
    gt4=JQ/*1qKڋ7ǣ#\&"g38I$acTRH!ƶՎ=<&#\e%7oeϡV߷ާ0By)#FFpfF$m"IIj5de&xDY!XJL$wt7k]܏HXaJDb&Tr%r11_=	*|eC%(Xs^T:rD8a
    RNnV`wwLEb*lz8
    CHbT+&9*bbP_c0û?Ty<mҰ\Mo7z~oI.TC !<?G\G>S8X2^m9I4NV))'4hZvLgB(K1n؎.]&hDcV%�'Ux88e[NaVhrA#bi{CěhP@U1춳Ydb<Kr<**_GKWz:>J<|u{%ZRԔhr^T;I'J)	
    Yv!HBgdyd;˽ۡkc~�,B(X2/s'ܣ*̇@׶*chtAQf+G~SPe߱0%#§&N�84C�fru|FQ)Oq{VZtHXB.MY.ƛ)
    )0<ǗU/7j"].0uGӗpːL3s6!.E[�ynv.<aSC:D(k|r-z(
    13�V=m)c`9�dk+(H[: |:NU&0"&Iýط#wi{j9|0A!
    ݾ
    kJ!�H12ɲƃIo:<ݘXeZ4fbc-`힅[cbg+c.!dF80xv2=KXpFު7;hZ]MidID9&Q)x5D`93TJc$֥žSO
    ]
    6]:4JIA܏B͏@&V
    fleL<*ZڌG,4Zn	#c3x@E8#23I	?{5Ύߵ߱uB2XJ�l*vbjF9Ȫ㚞Rg*DKfò̂{B20&}¨@<7=%HٗR#v@T®1VdΕڢAi8s* HB3RMniŜrOeCv7+Wq�z~;}z~o�^}z{�c?>v�}v{;^G�G}v{?=z~=?��z�z}z?_>
    w^~z߳�Oo>=wzק��ק�z{mo�7?�^�OogW}_Cz?{?>wo}z~^=ݏo_C};z~=w_׮OoCzwo>:w}�]�]ڟ6}?�>�c�}Oo>?Wo�Oo>[kk}vk�kmz^__Z�_k�zZ{=z_k/G�?v�=C/eǣ;=_ס�Z_jZ^۷c
    65
    *sv?yM[nj�{0*brrp~߶ۺvڣ44=ZB[_fm+oNۢڏ0bG�ؾ#K7&iW�]
    &N۸]NӴvv{oC�ݢ�4�݂�4�ݢ�4�ݢ�4�ݣ55�݂�4蛟c榾;c榾;c榾;c榾;c榾;c榾;c榻7=1S_1S_1S_1S_1S_1S_1S_1S_1S_1S_1S_1S_1S_1S_1S_1S_1S_1S_1S_1S_1S_1S_1S_1S_1S_1S_1S_1S_1S_1S_1S_1S_1S_3S_1S_1S_1S_3S_3S_3S_3S_O3S_3S_O3S_3S_O3S_O3S_O3S_O3S_O1S_O3S_O3S_O3S_O3S_O3W_O3S_O3S_3S_1S_O3W_3S_3W_3W_3W_3W_3W_3W_3W_3W_3W_3W_3W_3W_3W_3W_3W_3W_3W_Ͻ3S_Ͻ3S_Ͻ3W_Ͻ3W_Ͻ3S_}3S_Ͻ3W_Ͻ3W_Ͻ3W_}3W_Ͻ3W_Ͻ3W_Ͻ3W_Ͻ3W_Ͻ3�º}ᯚ}ᯚ}џ}џ}ᯚ}ᯚ}ᯚ}ᯚ}ᯚ}ᯚ}ᯚ}ᯚ}ᯚ}ᯚ}ᯚ}ᯚ}ᯚ}ᯚ}ᯚ}ᯚ}񯚺}}}񯚺}ᯚ}ᯚnv7�ᯚ�a�v
    Co.�^K�o6�X2s��ч�56�X2sX(G /E}O]sT
    <"(Fb
    ڤtVRE:w(<|R{ۥED)(Xwdp;2Nԙ;J&{Ewu6HWӓslqL~m(Jx۳v6 Fm5c[ZhUզ{_	QY,,m+B٨EHǒIW*ѥ=oݚt'Q
    !-B:5Z5a=\2vDFX"jOM+4X:\~/&4Ole$ lK]nb[�#㫲,-Hg"۪86g$9>8&oT,<MHȪM+qU`ђХ554'b5vBCS)c@w͉&[9&\cw!uJj~n¥
    ^o!~i= 9frkbM@,+aQ'ƴ#
    ƅ56r]
    vSY\'C0u2qFe(q)I#Gnh%#OJ۩\lh2	#y"lqkfԪ5Ţnh"$VW{Bӱۡ…Onvy@)]\,!
    P|_WT9iᦄvw};WcLr6iK2=t
     VW%c8Udy ifP*]J#�1˛I*G${%n<rӍp*#7Xt_[*/$hfYEPC{јSi	z1QH%CV1KUbf+w6me]-`CGㄧF}e@7ZI9``�kB1LawnJ}QUto^^1U@lhך'R}8ܐ	ɰp¨)t5?<]jNB/fU9C&\q
    ݲ@9/Q@pp}Q":iĴܮYXrbalrdxG0G(;Pgr\YG*PSmɛZH/\Cg]oy:1q"ESl`''@	8}�$"=XPBی.Y‡u,ٟ߫B-tHnh}ƿ)eM:a*vj/{m�f8tXrd`A/]Eh(UYHua(悻JSR㷩EWItd�="#pa&pH"+Mv>4߭"572{oZŀz)f+.^24fa:D{>=/NX]U]eb3EΉ
    v=;r)L;[N
    Em#{_٥"rɋ櫐@/P
    H+=N$s%*Z{f[c/1Ʋ?2(&,cm&󥄖Hqh.RjZ(w2XUmWy2+%ƌƐrHBg.֕e8pءNZ5יTU8J>ac9[am1T5cUV.fbsf]Xv8Q#XavZi<%Cuʐ
    WA:[xi7UJ}P^|+9*'w!pWskche5wGIJ08cov%4
    4+Q޽ը�!41Lq+LJC;ނ4̼OuQ҈]IHZ4SNf.sd{ظ.퍄d`"!RejS^"c2us-aiwnjYOnت*%sŸSHH0ڈ0RA*
    _m1^sm.,JmiԊ|J;-4!H+ ؝-]SZ4>UFN\E7ı<@ɲ(PxĹ4z,D11SQUct[qvvڪK°̢W3Y!Cetl9e2#
    DEKM\FWrEVL,4K%xŹܐIA:Pmq 0`hHд64RН6lX6+J4<aFKYpm=*]՚^$4kjP6;J]Rm5}X͈'z˙`DwL(7I{R:V\U@{!bZkR(dPHӈeQtwkhbɾDCWݴނrxb;ko�{w_[?֟aPF�'5b%MX!Eyso*jZ;:c%pUօZz,@QƷb4+'ksO}l,<P?EXՑY6B�!0:@ C+#dޓ,|m=q,9cd-ƭO#8-۹+4F?!A
    Ť2^jQnz+uoU?X>HY!*1x=~TCEU6#$nW0n߱ܬXnz+ec~=fF�²4T�M m#XHd&h%b5LR+S{�͍?c@aq/bIi
    ˍ`g;:mo h`)BԚMmfx={ݑY�<cNDqFTe(EK#udU
    G4V{#s*IqaR
    ^=Hd>gcGI%GLAyel_sU_czzΣ\}x'r~"aL[yV4gUxLCFf
    $4Bj\B2Kne9fv3^3x8<AVj/eHj4G9wg+0ި#zĚ3i/MAj`1<*k]
    nB庆f7Gez
    2<^C#&LtѬLKECmAu
    E0кWh+`;W~q&&>Oe7#j%򔉐4Y-\ԧqU9�xEֶ1ȣɢ-`'f<xil:@3Zk(VBkщw"ݰa7UnDbʓǓvgˑtIeI!*vvU@RGz5'E0UyQ388%X!β6S1<i@**[U68(SmnlP¿k]d^|O`]bMbQ#h5Er&tΆLh,:,Yqe뾶SonLM>h^MȘMl(90 
    P'BdGFÌ 6)weYZXNvHR)zŘC�s3Me	}ݖ036Ig�IHw4y*wwfTpIk+ؖ-LN#iNEkNYUҮ[|"�ibi;m�AeG+XzCi2UlcI0
    K!(zpHȹKq5jo^N+I⿳GKԋ`?>W}
    'Dv>c]N1	c|(2cBh[+�DWK#bG{f1[h\aTgU7mt!Ƽ9�rE@2/r?
    )p*ގhv2[)T7u+rj+?ʟn>Hf�c{g w�lN^iC�4o3)1psl:70GU"f>Y5Vk٩NOzSs1(^O�S퓰bE)4�PXEŷm!fFvZK^?uW
    	<oQ|gAiJH#ٕwoe7x'BɪpRb,F%ބvUՊC*OMٟ.Gb"{%P$W}+Ivԟl
    &[)]\"3JH1hKHAK=nSה%k˝x-9TaRr^OX/C31,N9Gvgk>&qз^g-I=ldKSxNe6rLLQh@jV~Vы -5_hِp\މkV?!nDօ~dp\Ʃu^R,M7f߬ĻБn0"ZYvIɻ3DY|Os$�;;Ey#TBM%:K$\<&iY1~c8i?igBjc`Pښmys^YO'q"US4<pA$X(v/%Cdg+Hkc٩K3rުRYsr>%LglwX$xB;fiilg'&0ļ:<oΩ.ajtE4/gW@]IN9W*X?Hx#v%2=odz;PE%/˔'_of6RƈBB 	0P�tWDz4,kFc[kVp?%5-iXrR3DC"bF-qZÒL<u,]Licçjuƶ(+
    `jr鍵բl{j`Wy}b7V6lpihX֯�azXk79�,k)/?;*,Hȑ,D5;5+ۈY%oyuMMPFαZao8p*`wKSYg
    .o5M\qFp?yЖHg+qLFQ%WX1IC: ꎗGE4YdBr ⢹q8ZI	 /I=5j7uu+8^eTQU,۷�֘jz}eo9�hi�eo?s,Čk)SsB7kuGez\](nv{So�c*�eo?s8�"�hKƨX݋,Uy "͕$IKs"!O{M.]v7.QfvnA{#Sf浚EV$EZ7Vuo0jJ3߫mвŝiNP-ҹjNߡcUNɔ-mLTUvhWfkoW�eR8dr>#kE:JE|v1SRKئ׻K6WOY#ușt	hsP:V6.@uv{)ZkI]・)_�i#8l
    "Qّ,f罾YJ$5}o-*oު6)[@%VW]Ԯe~gYWMh(OUw-ExLO(\Η:v}S5kgg^UvM]=õw:7ڭIl]6Ze6wL*xKK;kWk]5S�jRG�Z]nRK
    T)R͌,m{N-ztVR-#l]{n*
    3fz+zv#%o./{_ttS^PBzrսɬ슬%BՋZڽUTW_�Q�56?q_�q?Eы'	
    {7/ܥ2yjQj4i]^vQUUo;oq)̰@a_[ܰ5Q	]6EW=CyEE7P/ݰުiqb	AmRvXZ%j%Y]A"T΋2&@DFjeTإY:WSM[w{u[X%	�jN(쯎9d_n{ԞŴrIjgMm[~#pxޚ6ȇ0
    
    Jp&2w_8CZꕦzjPD�)k]j%bjY-([Ubڋ]w}e$|31ͧ\I&[2#fc鸳n7^ :^B{e\JFusrVX&UYurGAN!(XU{ȬRwdI&~\LfY*(Z%yə,DH+~	_\.bT9i)lޓ*Z4RXܱ@$|ŜybkU,M}
    w٪_�iĕa*-/Yoolo)rNmvrP]N)Mʮ[:'Y
    ]\l0`4VgvA-ݥ/vӸP7qEZˉ4KZ8
    R'e#'w'Vs.vrLDGdF,X:w}'X,ba"77t(UK\]ɡ
    "	)Su>'gIRrxI1=|PDnɄUJ	*oݾŗ*jot{"Ţ0,+nEMKʵ~۔jw~gD�O)#�Gx`]~q}&@Cf7SKm8
    RTn6`|zSnإ}B5׹ccxsJ+N	�GA4TNQwMw6zW^NBlR"1z6mdBpP"Tƥm"5w,yW~N/iF:!ȡݫQa<ZtgndžhOɑߴX9	cةo6LwS̒~@jR:y"QA6l];TlRڮ	,b7qv@EוAɑIqYKLniIn=֦sW-`#y,^D&L(FE"lr2N|Jdn4Q}-݅,"89HvSiK?Z'ȘdΗӐ{g{	ߺ�2�ar0�ZᆿYAN4BqMEZqpux9+.xTKKX\n&;jWuvz|*BX
    }cҤ)0?J>*BX
    }cҤ)~i?,nέ}D]4(RmCz7]Wl[zwwڶ	
    \=brی:Pr{_OrɅr:Xnz;4Nm%faY/腨G%�Qv‡YISftWz6U5նXcxDG#kHWup VIJZ֥so+WUʪ޺v}a
    sningeÓ,)V{;JkTvvߵRטHS^`~!O}yT>RטHS^`~!O}yT>/JqdCҀ2rONȑxPaCnТ~QU5U#?>VB&(?*{$^֨TrnmeJrQz+]WT\}rV{0͑+F6|gV+-T޺7ޝƁg~!ca-$;)XM:/vkmmg7Do%'_V9C7�}N<~NXA؈M	fHfSEr#,Jޝ*BX
    }cҤ)0?J>*BX
    }cҤ)0?J>OcsX	R{+K
    UڱUյ;WcO+ $'oZtr헷4UiIV_%cn&]B %ɀ4NɩDVdj_;::6}mުvhݡد9$]59AB6�haM-lVMu\;WQ)s;#Z9<49ɩյl}s;ٿbڻj}L$WmY=OsVV-ԝȂVpYaM{ZmNWVT>RטHS^`~!O}yT>RטHSQ)=�./{<&/.�Os}U>`~!O}yT>RטHS^`~!O}yT>RטHS^`~!O}yT>RטHS^`~!O}yT>RטHS^`~!O}yT>RטHS^`~!O}yT>RטHS^`~!O}yT>RטHS^`~!O}yT>RטHSMDGylwgwlSikkS)2(bjM[Uꛅf"Sp(B^h$1)f2ͩ$u[E;miG:П0oDz#ɜndnr7
    vtP~H+]6x
    ;ȷaqT3v-p{6ꢞ;ﶘTDI-^{ɰW[־[
    -UW'ڭU{Wo~|^_-h-$#aUojo,`Vh}WgmM$=%ԭ8*#m	)n"5X\nUB{Wܵz5ǃDN3d d(:267:D°:Vfj7]Uw,+W,YmnulId"(l5}8ǛMۛmSWv,^{տgҤ)0?J>*BX
    }cҤ)0?J>*BX
    }cҤ)0?J>*BX
    }cҤ)0?J>*BX
    }cҤ)0?J>*BX
    }cҤ)0?J>*BX
    }cҤ)0?J>*BX
    }cҤ)0?J>*BX
    }c!|t>I-rF|rB@;t~Ҿ1�56?aȬk\MGr8bu4Ӝ:j3▾\Tvb  G!	=:8Fdž-TfrX>j"v�$Mc88He!!dlĵ42jfqU[\jk.l/1԰|DSH#q|p˲BC$ىjhd^1IM⪶E]
    ^c`$ڧ5G;D"#idHɪciUmqh:HX$s4@o"6vHH{$1-M٦:i9)UVˤ2³}xb
    }homw"ɞ[WILޱHjG֡"ijy>^c`$ڧ5G;D"#idHɪciUmqRTIO"k$wƈ
    DF.	d3#f%U{4M'%6ӊU3Yt2³}xb
    }homw"ɞ[WILޱHjG֡"ijy9[u,5D;T�&Hqh$Dm2쐐I26bZ5WLtrSm85Q}c5M@,+>ȇ׆ ֈF},tDnA֭yZ]j*ݦSCAr܎C`E$$
    œMr#%Ֆ[*p1*zmV٨Ydڜ(WK.2M#(\FF&F/NOEƥR$
    ejr$\RGY/˓7 Qs{8:.Z=[MJ+�'_-9�_5;
    ꚡm( $bi_hі?Zy~BXg$LԾZǸZ;ASeD
    MN:lzuLJB[5HV3uh	Ѱ&/'\?zS?!:.̍n3$6ȍLk/7!X1FY^'9e[d3	OGL˱.ƬS8>;R+m#lйmOG_F	,CG{ij{em!re"aSMLhc x}dMYxkc}0~O_뜻)k/c[ԓұUG}$V4^XP(pK{u+lBц`(S<-#0$�27,y)Hc0hP9*Vg'V֘	fTl__#K@嫁_Yx|8?$eP0Q<ՉLRyDns٩KQH
    X'2riҭo),l]dy3'8MI1Q#~2;"o2k3&ׂXدI+ȜgFM;ke!bG%.EDfҽߑEE_]y)R=5V
    !Ks,/c!YiAŠF\AvUVЭ]7$"_(Q�'ښY_Y,UQ@F"V,%ozkUU
    J�8DLN@bG9Yo2*>MR&덏
    -Qn.,Ȩ*KE$\�2	&
    GWHohfw,ȠpK]#BGv^ȥBNԩ~pV[g(%'&g;s`,$=)l^.*\tŜVOq9V1=8�o)FǠͷߚY%!#coj:ӳ}{Rm+	e6@Q;0= ehd5
    v%6Ld
    Ӵ9w5q30ԃ"oLz+-$�dOK$Y Yy+Ws\)vP*QiAHhy�@zwf!
    ڞ؞ڕRZkSOv몊7+bAȼCbHy:PҼlf6y#G"R	JKqs cVtwP
    .U~ˮr3;ܣ~ZyEDZ40rRsHyhDߧ,fw膛T3PB% ȡҡ5M5$o
    6&#eJ6Piۨe*binIJt4mŮ&9&bcC2.']yszEl+tZE#=J)&r}	RYKZ,/\/QBEv/\OYʷad2KI,4)
    O&2`ƴCb^HUDfGOchMb!Rs'oshKT:pUVZY6On䭋.Kȹf
    Lׂ~>&I@t**rXhQ$oK}Gf˷۪IsH`W
    dv#i3dE->NagݼU%(m&q/A*
    4!]�y,>S9(N8^~ʾ{Z
    1K+1yHR,q10=u&#v…&V_C蒤[(o
    ok777
    x22jD<0T&݄RۤlFR;uc
    5(DAq4
    40IbxMeM۸m}^¹% $11�R%Bcb# ,6v>xe	uHS+8k$9Ђ
    $pܰ+q;eIb2dT
    MXZQ*U_qw0[yYd)L7-s+F`i!ڋ֦jJ8t/=ޘ-~Ty
    }gFi
    &7~BW.8Σ"c"jkGuW'hTa�
    ~79G+�Wi&SAbF‰,e
    \͜H	s
    Ɉ
    bdow gjFP쎫Q6fc>mYfqc�z.HD&˦uv.Ԝ}jCUlab'->:0lx,bE3Y RH�A:tή:m[=j
    FRc'=2J9	$po\KstneB@-~RIwl]דxiӨHi@ګWXc,Hab;
    yDjUSXMg-@ŽյklԠ_&j^ppBK"
    yhFdnxLb>@Sz[bO$_㝠V&!♑N7ZdKkyui[<buF45ZP6U=XXゞQ _ګUv.YP0pnmF85(#ɀlg(ڗCfwxHžE}>љ`5K	Ȝ$(|&㘐	rT.Y,ѹW1
    &>#q\0f8KS&GWf!N:'(4I(e9eo2b)q;n)SuNDv.WYeqQ܅`T=X#2"oX~+kLOxIJ a;{Qj,tbRSiӵnL<�%gwkzKOMO\;Xr{jY:Kf!N:'(4I(e9eo2b)q;n)SuNDv.WY
    ]$y3G$w$:>%rdghy>ÂvzD&+kl"9F;XvSVyvȭTʬNCՇ'Yn󪴱\1K0
    CILȈrd$36#8qrN@LH_Rs.,:`*!}&3"!˹WhγC\؏T4ze;뚵hQ2X}!}K%O̿Zs�пk/mX|テRv]cGٔɍ6N63-+la\"cWwؗ".;-(G9mՐ2J!OJ&w<0+ ?P-OiҀX
    ONO]jlYt_.loم{eMdx5TRTUQ0;A8x5?0:Zչũv<$6^dyQri vZqa`"gj$O3^V򩝹jri
    �\T ıRN
    $͑1^G??1HαMoɚ0'rSivnReN8', ͤҽ�4ˌ410p۔8%i&jmdvQpț֒`vȬ¶vsU̱<He
    oHc6T4zJШgߪ0DeFo&qBVl!&jV[ihG6!v	cL]Q
    $7@qp#s|Nb!,:-PW,O'Qu(J5HDp̰EfgPŖLv	#b&ƶd?lWﺴwMIi]l0d~>dl%@HO8j'o
    GY$8dSɊLY1L5:CqNuN2,G_WhnslKR$3)Y2զ˘PYr&%o"Vo _eo ih62qz"M5	N#	)nJ*~ٍϷLT/"M=\gg'}T,x-:L "62\J	$sxҞɍgWF6#n9D$s$Z,f	7bm\>b:(lvXy"
    V\~IfS$&J˖OP4i6dbG]|eWAV)R}?Sl _uMH(<¥ɓ$%A-`4R\&;@q:F,gT>dVRL%1Ww-/K8T5͌}.I]T3.)|`t3zgAVIc2W$a$
    ן'B\0s;e/8Kl	nVHh	$lSc,lY!W:ѐ̚nk];'(@ɣv;
    \25$)�&vp	20˄%*K;5*ӽ.WPz7+cTֿR8Uv8F)!@m8:RC5Ĝ:zWG3
    3f
    ?XMȏ8@3#Gy|c1Xg
    -O!|Z\$5[x[KikE81^ńRrʐQgMTsDW[#[+9Ѕ_PWOr.W(<;9ce|M&T(Q/ws*؞tۓ(+Xڟ6Ocޫb<2n.B8zkؑ+K
    _?G[hWUZ9=#̝[@sM
    +.Fn#r%r3(qIrQrY|1_>ehzvVl4L̈Dœacn\yB@J:2Sb!4T֫Վ2YNHhe LbL(^	EaD`#)>PeMjBV')*nuux咬ktD&SokNFx{-A–7]Èn4:1>GOZel9b`X!Y7/YXj&B@#_NR7T6{ܥö86'ľ	*3EgU7䴏:ʧdV6S{C"/Lm%�RTD[zdlG΁fg_h2ZIQ/F֡_RrsdãRFuumCd¶S$Dv̸8?G-%F#,8!d:+¥y}3ytDpel(B&m0շ/ë;Zo8exߐKemX!##Nm!l=Ϫ1Po#'2G�1x0,u,Ydg,5! e)*u^b=դ8IV!lOv([$;$21w8UM&IE(PEe.7[Ģ)%^-APA)Q/"^AJ̆J[QSya[[ZR6�o"?֟aPF�'?S,	ܡ/s߶	ncޞ
    
    
    
    
    
    
    
    
    KR@jxvW.wQPڝbi{vP5\me.\Oq�3iSڱkg5�\o�\o�RK-w\-}=HR!W-oM/-VET^U'ݪ{{g
    
    (;ihHy�@z&kڞ؞ڕL"WSOvw(uX�`kꢗ1(v(\I4"\[궦DIjnս翃}�{7翃}�{7翃}�{7翃}�{7翃}�{7翃}�{7翃}�{7翃}�urwTo <XlLVU.JܴU׋UvnҪnݭEʯZ翃}�b#^M%a/Jvubu֤Sw{;֯QܷE[2Ɛ$O
    rGc?	`e*-SW*ZXթzߞ
    
    D o�D@<|R^N__�=s�=s�ьBTy2H} -B RaKHt񁹼-8j5ŵ{S^o�\o�\o�\o�\o�\o�\o�\o�\o�\o�\o�\o�\o�\o�\o�\o�\o�\o�\o�\o�\o�\o�\o�\o�\o�\o�\o�\o�\o�\o�\o &k+mR!NsBjTRk֪OfZU7/ovl0aPF�'?S
    JFXV?Cq1i|}6eOa2	H[MۉAyE,hN+Va83HআY*\㖗hc^6h6usb>'?<&aث#EKrbb1+@цζ7.ubS_R\� ۡwZ!`[KqLUThcXcvh#?h:bԦS-߾6ӑk+Va83HআY*\㖗hc^6h6us\=1%&ȘJyML%LXypN#C7gZEwcm#Tr}eb>'?<&aث#EKrbb1+@цζ7.ubS_R\� ۡwZ!`[KqLUThcXcvh#?h:bԦS-߾6ӑkY)0DRŜhei*b$q%0=w
    /S+i{SWBzkb٬xS2ވ$G~,@,nPr`q`]*R16Ɉ/4 R4uLQRSK�hUf۳ηQ[QSzEXEG|I&:dE+IS(A$Ǎ(G)VzXH;ܰ.0c鳈',wS+HHv?Twj\fWxwR{]6Udj+k\B#LYʈۑ%1yѠ~5Vm>njue98U1`? ș^ű1LtSҁ1q�ٶN
    4rNKwҸ0c~A27'9+ctcy?7)blic—StqhayM*�.�|" C	Gn̊>ȢI~~gdبȄԠz۫m^MX4ۚ?ܴa2EXzaz稻LLTg
    yHD@jPf'*[T9rSq,G9�FQ�Vב]X%<)MRMdQ/M̛\/(nbG+D0D<A	ԡxU+#nD9!2P.EƣjgZ)ovT;[pJCrKNq L}qegxyQ3! D!`#ݒ6'5omco;a<YW/WۇgU,N#VAWwfmq*gC^᜿$dn1\_XD*u+Iqn;6>'T$aXjd0F@@ gH!%f1|b d:Tu^Xmrw@;	#4
    `h
    os`[HN14f/eR}e=֫䶌KMV"#B2�= .]
    _.d/�X;+@r6H&O6G.<c<g]`3-	viȸ9Gd�cdǶ*!jI-8dlJPN<ełS2!񦁋J]vu-WqbLm.Cfh[[Z\EL3əcCK ՜aD׸KԨhKʎP=QJ	܀B?0X!'xA#F2&MzX4T!^貋<$-F-t]!,OxVCIBDȦ{&ޤAq)tR{3�^E$d@ A&Yb.�X#XOhF)U5w|Ey6O�NK8,cX*12-Z_'n`n,JOULmmhGq"|:2^G&eg!
    ,Vr2j#^1.R/*8-CLlE9N[̈́IOL"E#`C3)ph~DpΑQise)o{ƓH<cl=ᨋ!OzK! <qݫobM
    
    ٱ~EL/c\c+t 1'W*ԠSӻ*uiedr�mŕMwCGAD)0>O/m
    ,/f[`v,5t:7c$Gy/0cI d@;3a|s,xnW&elw8zq�M3)<4|`=tVl,{ɍ3zrMb"lpO8w!ib
    A->~$DZWo}9-!//9")m?q|X5?1=U@'IjnM&c.fؑ<6a!X^ח6qqgi2R%')_x'P7
    JFLIʅ{9B&d68C'qa	a41X۠I?ȒX"NL-+	mܾ◘W#o'Gރ7¶dqQ	iɹ\n}Aڟ6ݨKgV׆R~!y�#0F9aÓX>?GPjQfkcX"[,=ȶcYNm85!@dzG)Ga0NZ@tyQ2ma}YR:2>
    $-Aّx5+9\5OoL£ʍ{X,"dv.ocv;㍌dC3Ł)�۳CthȪ\dxSX-�d�Dc:2E.9d\Nk8` DtNJh
    ;tySx
    l*M!rӏX".d/tcY˾N.ZًMo#H#с#X}!80HheCmb$OI,~f'&Ac_NBKHKKWpV'9pq+fV`ʇ_sj_`y}b�(cH561l^m{i"G<44mj^y;`Gf'(fiVMfMDLҍ4R^p1ULED
    $DʏnjtỶͣΛiDJ[އQM2>Qq(7P ','\6L~J7f:"1Sb8KKC6aC8?3
    Ģꝣì
    GU8F<kg1CR#tyÄ2خs=HR$& +S7
    Py4O
    L6o
    7d2+(3d)ia;9MV;&s؄lU	J{v@^gEj?(K50ԉ+Rx$	BZA۹"O[W4D`	|NI
    N3.=
    uzg4"@qĉh~ԉ1:EaeJZwz.QOi0/d?Q;
    ?E"�G5LnDDA#<7$h%׎Rܟ
    ]3CkaV^,Ñek=<\U<Zxn0_nw@Hhu0KfXt("bT-C1<688n[I%/-
    =em)c魂$!IYb$_dNiјe /E
    آQ*~븵&I!@`:]jX#L
    (LHS3%OT=^T$i)Ist3Xbs,v}f"r"$@1GS•
    7qb@KNrt}8DG)7zMβk0ˆ위qy'!J�g.MXb?fEz[#nNG*:<FX!0tHѵ g1dHbA-	4Uc
    #Rt1ͱN4 &"i=xRX21JǛQtW>$cXA`㊼c>@1.Rag6^P#2HDcc
    (Kx~̉s,tiK:ơt
    Q!GpՎ -dLsL`~klܨ͆ÚRrz9P-܁L[Cm �rܰwDbrEJ	Fu"K]T7-Zq'I_c35̡°9Pd{8<Ol;$(iW	@3U#;Y?;)["4ӏq`x̦FGa|ibҗfv]KUXCːٚ!%m&"d#u:'MR5]cckm֭;9)S#?S'CP|$dTQZ$ 1<m@ˋ+OtaH␜&3`bѶ
    `,q2ǭ84j$v>4
    6Pq+ݻ7935k:ln?&#ђ,Uq"sYC&I$rSDV!ۥ#ʛ�VK`p\W:?4G259sLp9MҸoIGFܝv`'x
    bsr$@Вw+ǘ2*d	!ljV$0'Aт2.Mh"};]Vʷd,vzK #z0"bk*b>[RdLy,@RHVk<R']R]*Z6\?a.1([4}iѴ+Ån	Έ#h�
    YxDi&qNdٟjHoI@8@C&;VPɇܚ6V1;e6q@4�厌bˎY'>)2H$}$)T([
    H\%4qYysor9b`ꮈŢ>H/t`H(D",Fd!3,7|f+t2yKIɐexX-Ӑ<R+oJU2Ü_X-Dǒ0
    MF5[^<b)CȢd2|ZN$Y-ٚU`~CSd<4z"ׇg\�($cڐJW;'<I۞3"
    M�H$*HZڸto�%PvTa%__gN~GΰFiE	.Ar£
    tp3#Q$#"B;+ym}qbH葉sbBr	~6	`,$dY{[%Ѣ.4eIR[-jyVm^nV!59yeđT�8[/cd4Aƌ7}KeO!ߡ
    ӽQC#e L#2-`9j
    0h͐v$+/R:(awJk@$ҎL,)cL/ r#;x7.;;@BD)xB[VhmۢZE(K"1�-Otbgٰ-\%Kda,2n9#X,XerWkaL|	hZRux"<LJOby#,WZVtSZW[+nR{&	4:K"Xd\:˥ŁN>Б
    ^F՚;[vi Fc
    Ȍ@lS]&Xvl`IF'K'L8HÖ;Vj\]B|)�/d7!mUTHlFl!!\<z!GXS#qyb:E^7O!SXdc+q ֕;E֕}%۶MCN^c�e$F$?B3b-F|q*M_}&bkSwbCjBwGG)RtiČVRT& lo鮵 XJjsnƹ@p,NgW)MlxyTV'r25ugNm;uu_IrbPl9Yp<IO�u9KQD0\hʓ{IZڽ;Нd
    T!yq}q#T"Fa7D%,*gpkH7҂څۙΣ`klJLe
    L#<\I2
    4y2,Yq<LSajˈF8yvsX ǹ6[&e¡S&RL�b<z̼K\@++TZ+nxݩdHdN
    NF!513*8B98A饁au} z%voP޵{㜕&AGy
    F7O.pk(R~_	ǡFBMh\ĉwwYn?xhq#d;?E.sJ|H2(emQdiE2nΐ4z c9Egs4ARY0J=	$p)t ZeSck+d+
    |LtT?I: s),*컿"0gs&^/;?Ho;h"L#i|%fr$ Rqϑ-�>;]XI.:&kR߿lآ&ƉC`MG/*bCɞE
    )`ZG|ҀcQn㓎JJE�	c6f$u1;Fc/JyE)9H/)ezv1ڙ1[%ŶT89r|UW4fAn8ːhH^+&٭? ѥ)xJ$\>Pd٥d3Y:l`NgHTƘtk-א,99s}7҅Xh.+*^XB>ķ(bwT>uʚ/P3`8%ΜOAz7șO@%ȳ#zQ
    +:[&.6	j#dbH>';h?3651RӶsrU/Mdm;Eq҉!LIƅ#kjDԩtrf rku큽v|(XEmT2Cd3'Mlzfi˘|:c!Ƀ1E{=%#a#=h&挗%Ly2ꑡoGSJ!bȏ1)/71RTgf;Ŷ|3YVFŅ[b5-FFZoBla~#{;|gsݐÃf?fIhtvR,q[Wڷ̜ςpk$!\<ՋR-u)7h1r9=lOɗ)NI~؜kDUw�b&R*yLBX4h*U}MPr'rzZؕJWbuJynR,^yn@c}7N/+`m bcH}&v1DQvG9wL`o,\#ưVGo9fLf9ZZ\_e^a$69>7C5d4l-^fW,cM1uv-28bvJ[܆0�d9B)	G
    QO@t1�l@*dd9H
    =\d6nplEQ|V8؁7		蔅bgUj`g41dG"c.%ؠ	$e6'[$
    sdO%
    cXV)(?Q
    T5+A>X"Q|$*&]""VRumoZ[Z),أ >fv0nm?f
    bv8ZkJ-|VeJ$ԒXkռ6(�U"TAiU{ydU@
    ™׌R,8	&怨nXWdw#^'O�$c	ϬĘW0i H	|uB}ybmcA|`~;-X+!*6p9_X[G7(ʔI$F׫xlP;
    4fD~2s�']%~K;f|#"@@:ģT!kOzzfg37Τ,qoˉW,A[OYwr"lh`:bΥҁCm7e~=2|\W
    Rd&b#
    IDl'�sS%tMSSh.X}\OD[ѕ\1k'KCz$b<k]�q*x�)s2(w*4tݓpcBcSxg/YN5{qŗެkDlرb#$VGoȐἕ#Qd(Hk^?.@.ٜwyB]W)�d?jgc/4*ۍ(cEo$c㸁3 <)ʚht%JkQ@YE:]ty*
    wakI8 zʞA\Dg*g8+ᜊMxT\|[$FcOYƮ9@coyBQB¬o<0/:L@>)
    R>ŭnD
    e,m̈U3�۫/xKY{#m�9	0$&,faO#fGٓ8XnMhh9L}ޛ6*}zR5tXetTo2?''b`6ņBxYw,] ]P}�j?+7r=>A@!8CEtt�"poz@
    ܞhnU­ڲҗUqF%uZLur[w�c<g-(H/9ĝD+t F@lYMv1f<D!v=r>#o@1OMl$egV2fP"2`	BaKqȾlvGq>w{[jPM7H83UL1oI7!H:eR1R>LZI\#G.ݑ$v&l5]LK]*$!!́�gl!`eybXnr/ux*oma
    &1[Ⱦ�yGg"BZk2p)Fr_%cwt
    פ&H#Ͱ&?Lwc!Ҩc yXvd2ѼܷXF9U-5wEMB7< tU,plS;beI4AN |~;"JIʅt4^mM{rt�ţ#@"wۆ6KR [84WL$bI1S3/U$J@qH�2'ξ٬񍉞QdR|>4T0,{huJ{յeD&,p^8PqbJKrp,g:!,33Tl8a]V<<�k'!p;#-380%?y#lr=e_-
    5o#FU2>{),鑒ԖɊ'XhlɯQkbeoƒQ~dG셢X33₧hO&J`C,{#(C o&Hk!@k+GeSdՓ)6ӃF2
    Bd8{#氲Bb[	\=wVv;nq+4OXs(fDIH	<BҔ@o3:|r6NŸi$'Jٵ{D[ZA"x֨*cQ؆vB[	*ZzDA"dJnIf>[XAxC9W
    H'3	k`U3aoiG#ۼB]ضQ(#J1R0ŇdTA�(SZ{E
    {\ZXʬn?҈>LPBŒ,Y&U@~=lO[;IZVMNɟ^ZX9Q؏ Z3&UxR(یF?RxS/EOwהDRs1?̤ذhO`}v5YfpB0[yzN͡ib'
    8! >p	a!\qzd~EC@*hqHynÔ_3A( 211D2-~"d0ُx<|Z;#.\mpV
    
    E9`#ӊ
    ^	<Gx)|#_ġj_"S5,eGNt׈	_р@#G-9E5+Hj2i0d%\!	c\Fi!k[lJ=[05EsHCj	q<Ey,ϓ >
    *
    aY׏ir|/8?.˸l6g&]PF=~J@%;ڙƯ
    z~Jūr[ b/268k<B2	RűeQNW]J4]ZDr~�9g"y=%}:=<I>Ǒ*=�gyq0aCaAoD"{xа(e/LKΓ6wFCqk[5CaKs"?kb6K7&(B9^ns@BL55<),>;:<٩)ya$	67Yk#hŠvWnCH$H~0ɱpkT
    ke֖!JtJᆿYAL*%W-܇c5TںZm=kgo{>+VkZ¾=j
    +VkZ¾=j
    +VkZ¾=j
    +VkZ¾=j
    +VkZ¾=І,ک{;	_
    NRm4w;mZ{;vt2vW)-v[Un߱اoC^
    x+WxWǵ]_ׂw|{^
    H8lANispIE{qScV͕]Eknk)Wum+VkZ¾=j
    +ViCiCRGґenc;X5!.*e
    hT%En[Z¾=j
    +NZ.ԭXY#F$AC9&MyȁKZJjClQrvVkZ¾=j
    +VkZ¾=j
    +VkZ¾=[8o&nV'm][]-wil%w{ZwN
    x+WxWǵ]_ׂw|{B/-$"5V:,c$Cݝ$IM65UXMz
    x+WxWǵ]_ׂw|{^
    x+WxWǵ]_҇a'҆"\-&&w
    5PJk/C]UVШK~wܷOw|{^
    x+WxWǴ %J
    t}J,[1
    C.$[ݑ~5&djVjI-ݩE/\sz|+VkZ¾=j
    +VkZ¾=*Va(c}Z!O	BjjHɛ]Niu(lMFJl-ӷQkj+VkZ¾=j
    +VkZ¾=j
    +VkZ¾=j
    +VkZ¾=j
    +VkZ¾=j
    +VkZ¾=j
    +VkZ¾=j
    +VkZ¾=j
    +VkZ¾=j
    +VkZ¾=j
    +VkZ¾=j
    +VkZ¾=j
    մ&,^(Xٽu7TSFiՊj{JᆿYAL#܆+V̼/&c=
    "VrmX*0}&T{h:{sh2:KY`A:c̸#G#X;lN8J�U;Ȩ
    ŭ'mUbm6muIu^Ǚq#^FGw7b (p7!)�vPZNڪŶl;pL
    `"w'(grJ*o))7
    j(iuR6k	u}`4oJ%øw$nVSΪnQܕXfwKB,@ꠉsoaQ,
    p<v�fje֖LX2~T}Nt�N2H(5/6f`xT->!iZ4V֑n̻:C~R×Ƙ@MUi@dwN^
    y9WWMԪ;hBEA~T.mS1t�tZl:%TnmX,ɋ^fOʏd&Gdxl;DP39%7rǔћ5dN`Ӄ4t)kIC&a%@8
    `&M'2rB(dCw֬[.ΩQI'Z~ϸ*9ƅPAxY&:eM1l`#SNrDK195+}Pc##$J;6# L`x3JձعZ\kW3,2�dPk4_m,$<Ff[ }LBӽewh"ݙvuMe‚4+$wC\tcQOfRnS$;3dƱ3֭9ű:WJkl-NMJT'5XD>3H͈ň>2L҂rli6.Ve/+>RcJY
    r'!A1>fK
    5%2q}r;bvhjD0mCA:k,V/ň)1c,놹d^b%h8];45"XP5s+I/㖜�/b(b'~u:0tZDszFdIc*@4X#؈M"ꯧsliJQ۳Չj*	1G'1HZ\d68XKx=fwl=e.!|tH1u~`UrZ8K0I^Ze/Iq؁$P(ю@-)b0@;IT[C3cO7M,B�c43bxb 6E1jfד)YC5ͮ'ԍr&4ٳ&tg1fK<ߎw!`7Sx"L5?']xh{IiiKxȸzg"'e	]RZOj+wjGP%98Vyٳa|Rd$	#Fp+B7X܌6VRXKq>ϖܰ<+�c)~'ɘ'r=UGxpfEpQí\U"<`+=TYptk
    ?ٔcY神_ш]֔mɗ'fx綶AS4:S*2Kb9WLr"X`S1<Y۫{~@?w"[humbU6}F
    F~_|�)_f_/;�F?�Ơ,^ĬlK#NqoApy0pN7uGQt%V3%܀mJ�iZ;V)mc	?2SI	Fˈ'_
    [F
    odóKYGR6ƊnCAUHK\+Lm6V鎰10:"|pHrhŞWI
    tS0$&~I˹FEG ǂ�fD1.azKEw[L,mkY.KbX'Dj.#~,ѱi(1g7sRf.$hc,3G
    aɰ>612lJO(1JϸFn3\J05=\l[
    %qRj!c%%9'|RT#O9*
    ŦOouD"�PWH%
    !<lQ$`=x`ݶD2^G cmے¬ŜI0Fq3Io2g)TrLQ핏	\OcucG�NES-XX*H	$E
    "Cqq0Dp3d&͔H_'#'ɺ\za;TcFTy1e_Y	bizVy\"zeX	=4
    K(#U"466$۝rSJ,Ƙ'XfCF_'9SL[^.f6M}�cGg;4iVUWnME\
    cg\]G2K 'udQͱ]b']	Y[xCp4\C%ƸgnXg�1o\mF9*<}83"ո(IݪdEǰQG	Ǭ:5otGD1,rs/�h.J6˓\s[ D)%1hi+c&C9?,0)rwս?u ;[r{o-:*>ܣ}~_b/I��y/E�#yVopcP/bV6%'^ӷR<c8X'̋#(:o@6hح{ܶuKe1j
    )#en/i#ֲha٥#cEܷh!ѫhpg'ew\1_(Lpi;%:A,2; l+F$p2'ég1&Q*c>@E�8,F /
    i@fuMIɳ@4Jۜu�T�ޱ=glQ	19ɹS	H՗V>6mn!HY#RX;VzVUk<L14"aWXRC(6f !0b-Hz*NjI!q0A]d$M01C1vVVgBYny.[SiN\_HG1BXꚌ;78Bo7ڡxFP	cKȩ*K=BNV32b4Fsg4>ƌ8ݡӃz-'}egrAL1-hബLt|2Q醆ò
    =LfDe1/HJʞ]kn_m[fF.[ǯK+srӻrdIHl {{{_JJ%IUeᏱ<
    'oSHt17%o:РW04֦My륤'f¥"Cm7&O/JᆿYAL%u"F긙-S^i*ލnvjj~ǧm)2(jG^';BGx !2D}/RJ~nn	l::bJ Hx^ep$.nhc,
    CrB'B	,!zB*l=:XNm1%$H<w/G2741@Ge⡹!RBMCSX6mʏ/U$7*	1=
    $#	IaUY;C'V]k@FuοNѓ$fWB2T7$"t*H^)(|rr"ӭّ])FGpKH$*eXYiI(mS#ʫCڧ!-'G[LID	̮e!QxnHDTS`P /V(EM[k#rC"1KE"CI
    ʂk.Ol$FCIR}&nzVNIFZ8Ѳs3~ӠSlȮ݋J#L˸%MےMn2As,p,`̤\uUS҄Nm1%$H<w/G2741@Ge⡹!RBMCSX6msXeeH{&mC	\NRpKQBެ6Ysz\[*L!mҘ۱x	DiywrIҦQh.eR29]n=zPѓ$fWB2T7$"t*H^)(|rr"ӭk}PDm}[!+ZX\[Zj(Sv[՗.v9[OKzIcɈrPZ,v%)vm;["zS	e+z$R+zkn$LޅƋ[.@Eb1mJnGȁ^FJމJޚۉ=qː"QbBBujHRJXWN2{)}EEQUVmワolpQf	^MUSQWkrݺ߱ݍLS̓j>x!){F
    ƛBę$إIK˚gFWw7eȖZ}\eL1ѕN}Q2#x]&h:sc"QSMֶn67'i?$ۥPJL hhR\A\Cc=qpqTK[%iվߢמݫZԽm2FĔYQl=390?cBXR?rNu	ktqK,y:1rnD켈KIٱKגתqqTr
    .J/Y$oum+6JJ\S#]R;{zEuUWNCP?$Ҕ}YT7_KpsTöZnX]=Alȥ?g>z#}<ݖݍ?1$u!ZGw<:Ѻg=3pn:dM>T(¦6ࠁ`ՔZVIgjci,Үt[2@㔞ߍ/20Id3K3Pԥ\r,YTa	d Ɯw!D)i"ehnD4:޾|]:_D
    2V.ֶTA,6NIr3*K+åv0qX26,[AŘ16r*m2b	ٵJoKdzhG`ufAaԶP[J8e@@�"
    Ɨɐ#MX*)fHnr܂ژ*nTSR$[
    W@[2VJLN'O'U!]%)4k	>lPZ7xǘSiJa%
    3*%+E,v~\r'lu3|RP\8ڑ5T<pG;dr	&'jMݠA]De*t*3ͩ-,sbVU Z_J,ɐ K,*‘cj�tJWU:8
    Yq'%ye!soJ�+S6bUN8=a5Vl
    ng_\=_뙝s3~ӮfuuοNzi3:W:V6ÇnJ1ooKv(ۭ)[w$8/boM;޽nmziԷM�R:y`+ L*;~Lfe2#P?88r[.sj:ydl\odXtf;ԿF|5Z
    9]
    ~WrFJƲH"[og1	6E\r-IXT]P0=~7oo"]!D:9f{M.=(dX{협MB	+iHdKMvR3LkV"c䗐ő>>Y<G
    Ϡ*\3osoX0ٽV[n|)cxH#㙽c~QM8H7̨>}%Lܔ)mrC\hl6u|}/#IdfU%G˜u&@j[,)4IlZ[MvieKǸlpsvw&r*LdSOP@l-+_\$Q1eW]iWPH- xOolJ$|jR9DCc,R0OgbcN`Sw"ZBY4\޲4]f7"]Țo_>./"sWdBjb+Uy
    k[Tt*ms'CRh%ƁIarlw}8
    U\~bQM[}uf6q1%7%ٴi#Vy:3m [(-b6FqѐaOAwٙN14GX<`}n٨amjUEo,Q J
    ܳdd%}Iy*TҜoHjV?[Lj%hB')*	ƀ,DӮM	M5><IAd R;
    f`E[Kk'HcI;Na>2P2A;+:
    gwVYWR
    U^]VC-7Wɾ:ϖ@ ́�
    >`"vhNm_r9rPRSgj@7F,fZnzą>,{5i;ջ{\:@lȦ84"r.IHJS4@s,hWJG)-J9Wo[ko2T$rb)%
    /ir=o;o=GQ&8܉Q}]H(ss)ssZBk޺!6dQH)^Q<]H[Jle1`.,5HC#u
    B:%ttdi("Az>9*;/
    
    l
     $ma/
    ={cҩ"7p!W~Q�yf"wF;!YEJTXt(2θ IgT0qC&qtAdjӔY1>ϧglQSzt\RTgs3~ӮfuuοNzi3:W:g_\=_뙝s3~ӮfuuοNzi3:W:g_\=_뙝s3~ӮfuuοNzi3:W:g_\=_뙝s3~ӮfuuοNzi3:W:g_\=_뙝s3~ӮfuuοNzi3:W:g_\=_뙝s3~ӮfuuοNzi3:W:g_\=_C\
    rDK T*M钨j*!䞻QZEmJᆿYAL7*?-oLH]3'V7KR8AqukA*dij
    \P#oUX/o&|QBꓱ;D*4JfNn,qX=^ւTӨ'Fު_"8L6'bw:U1 iw>̝XY-HzխQ)pN1CԍU`DpmENuxtb@t}):Zb{Z	S#NPRbשz|03y0T-7J$
    .Gҙ%V W245.	(}zȎ7
    (uI؝|h26q+lWeYہwB7Z@Uru*qP-7J$
    .Gҙ%V W245.	(}zȎ7
    (uI؝oLH]3'V7KR8AqukA*dij
    \P#oUX/o&|QBꓱ;E˦#gRܾ|P%t!uq|H[w'Rw	RoLH]3'V7KR8AqukA*dij
    \P#oUX/o&|QBꓱ;E˦#gRܾ|P%t!uq|H[w'Rw	RތAK]/L$0HRR	\Gߍ!bp|%ܽ)!х/V⊛t!Ҥ1q<fRAz&΂wu޹Bk-5$X涤N3HC	I/c[O7y2̥HM7r.[njHmIP-VWslXɺ5:^Ek.F."jmBUiT[w(讝}m�ɍy�F[	68c@ImSTxŪH2Āp['رU
    uW] Vα frPDąalxQ!
    dD4}?GY�TP#e7(UE(PE'0	e[GY`#$ުHf}bS84[EʒgJ2M/"tq."Ĩ;#ÙNJ$ÐĈz`v#}Gu
    ǻ
    Fռ>7
    
    *Ôrd3&55;=FK+KB2mm^<L<@><ubQz)W8L'IU{zv^M;Wv֩}FM2J IBPD~�)	Ŵ\;w$Il$IVKqH]Fc @pY3𸰊um5) 2A#H:՛uZ̍M+GG-opLJ~w8aZXD 46pҍ
    IjzXT@Xі
    Ď X5dK]Uk lL۳RdptDcsԗ?e<5̤ϵN1ŇÎN(�M4U=7r{1@,.ndv[]`גAUvG[
    ۂb˝LJSm/[\]jY-umאA2lZcw'ņ]LE*!DH9z2J\ЪKqj=<:k@@$
    نw^sN%"K)%T6N7ILŹCaG&)rcWq9l7A	Y?T|ۥzeu%!g =wbyykR*ŭJ"cJΉBRJ4WZSzJksMѤ$8~j8K/Rt{Gt#\kjUNtYeZD@z?eXqV
    6*G~9K*5&"f^RLҹF(Kv+JJu@a:,JvѯjhX&6sjw6۷Qf.8N26wds}3`rSͰQŞ9Vku%$O9<TH*07dڕK|M-6X\U#OrێMBv)LtʼnpVRUiDЉ4 lbŌ	5/XJXlqY"t}@Lxws
    E\mICg
    (pt_TF3V*U9+ch,KCNŗER;vX޻L׌<#丶GK$y@xeYJL2Z?q;;8͕^q3^?�A/pxS;z:R\G2QCj#bQw(RZ7ˑdt!X\91ᣃҙ))1pWŷz/&*u#[8BK]~':o v	a.k1kJܸV+z:!oBаcCh*\55QMhޫ<ӝq$#Cضf#B$"f&'4Є?&EH*
    Zе"od-S@P0KLk u#-1qnۭή.,]?؍1TADFԒ
    3t.q6\Am43;RDՠuB:R+f`|iH
    bWENJK-<]F>Ѝc.\Wؾ4
    8>y6@HDk.$>GȯaN"*vV+N-+>1W ضRoDŽ;w#I9D#)qυ7\VQ]ZuV,4{Q>0NoRH+hVVVǨ*fHq7w7'IV}ׅ
    c�N.,W[j8(^BsDΝbtW{
    קkKEӵwhMjktmb�kѼlѫ](F>(~GpLؖ30OIZ#2FջȤO*ZHG]ظEI`YHs$W0;Um®8d8T!\zǚP'G)Z)sV۝iٞu2Es~uPFm*㈆LHuǬy:N:E	q}"b-@Jg5j-֝tdyٳ؇}<;R[tl%aJҎ>́8rDRWgԕhJ
    d GLЌDvܙ<'pj%|Ik7,֭GX $+Il$YܺHb-Vcr"Lc ʰ(]R֡7lOQusZWdh'ʧy%\QQ8̏�itp/)ZZGbo?ae,8_Cm)؁J93B2MGrgo˲(XL>E-T5Dw%ܳZ`o&T;drY eYYT1~*ԡwKZ;ߤK>E(Y?dl!Ob"	ER N81zT�%DhG뫚Ҹ'D>U;/pBdx-K|	HH.;}.LampͲuD_ *G`�,g4G61+6VȾP#cĩ͛qtNJ2'(ˡ
    ޑy,W'藓r+ҮF�'Gi\m扢*䗸S
    r!ED2<hqkeiHRt}
    ڸf\)byeORrywBq,ީBrzkdX~'(ˡ
    ޑy,W'藓r+ҮF�'GP,?p+0aj0*$	s6Y\!}¬|c ;#'U
    =-֑(fQP,?p+0aj0*$	s6Y\!}¬|c ;#'U
    =-֑(fQ2~J?ꋿ3?
    Rlٌ9@ZI$1iV%1HBY&q8קu
    7$V28;֔�6\qv)Aw-q]%FcWX.?WZFM
    ?eJY1FiTP?_"(2&O3$(ED!G]kHZ;;vk[Ҷy# 	H#q@Ŝf.<nƨU-drzO,Du::/HH?�X\4	8Iq#3I ɬ;Dnr!iym@fU
    �[mgЌ|Z}űܮvTw+34l:TZ%HUmHڑuz&Rp'"�d~qRՇD+jG0@% '@NDnm xQIEK&I!^oՖdn_EО<-c1dA$ EyjQ7:d	~uM$Il̙,vldʌO)j/r˗KS}5kW'ul0aCp~.{	b<uY
    =g6<J؟JһLdS>Vt]^dKufQ(+${{&~|*%SS(%lnC
    lTrYt0pC�
    _!q`$�c(?2Ç㴃'
    z
    T~r?"DG5C4~9M17Gh܅:9tՖ7coS/udIDdn2f䔛,*	rDR7J#cRe\*:!X�:N/A_]\
    .r?SHK+p^]hqba=נCf2"Le!|K6OGHL9O*g_,eH1~Q[Z?NTuSzzq4R'LmIg,J;aT'c'
    	@ӹMBv灛t:|XsuѴc!4ɋ0)s܊ (%5l.myxBp6@q%_bG?K)UaxtOV+"}!9El#_X6ic+h32
    706a`^\9#qtHQY"g$lmB9�&gl{N'")ȉdhz#`kt~[ Z(eӘ}Е!̾KX(ڋ9~sX$Q,8:B3j1J~9!^Ҥ)C\ds[ɰ8ͯ~o`Fw\,Z;J#k6rH9K\{#Mvv0vРĚӦ_KJda.dfOS݃]]&mNki-=T_,VOҌ=;^kbx͋RxnR%cQb~nژpMM2IPMPx5�g%B&
    ƣ^6qU818$HJQĝ3=$-DΖA?W!2`Qs})m˹f~Ƹ>?0Bo)aWȶU/9SZ6z b_Z�X+m�
    CX݈cL1|;@Hc#w
    @mAwy9ɫ2ϐNNg&>xC5mMQl`:r_O2.)Xږ!Mq=jL�:K؆2Y4btԾ2tь0Dtq.x&{*WaCLS/r GEAycX
    O9uAQāhٕ4K\&
    6qb!ˋ_q�fLxc! Dr,W)fA}_%GOKf3ֱpFᮈ_yyQy|G>*>OxE=یS鋃l̅6|vvbi�}ѩ5[#l'BSd�F�YTY%5)]['�N17d"X�h.0MIOD\F-78ߡg,\N
    sVXAYᰌ{_Z2h攰1Œ40kGC
    +A*焃C7K">VUu2u�r$t&
    fHd|,5JrR[7N//]o]gH}H_&_`hpF3i12{SQ2:ڲQ|=`M:RPž9k|/\s%i3zD!#[Ȉъ-.Q;1~l729Vex*y$9ھER@zv״$zgP*0&i1
    œ<T2ʪrJg<X^shwM$ADf_a,&./[ܰ^iќ#maطpF_51B}Y^ly*-}(<COsqb;D
    $GZq`ppM}[taYfcT79$MY|ʥ"\`麤}>.}#=>R&:e;KNr r$6.jAy=J3$
    ?qfTx9ch2>Sʼn(/bX0@?#9\,4|3F]—T2pك!2[4pv%N	XB_/✽/N2D;錠–$#miZ)�E
    Vq'3}UUU=qcrCw'E>2xqqHفC]cyYLRY),k*yLA`R;\pAmN(EvE1_/<+uu1,b}bJΉv]b~rOȘf=U@cIYԘXjc؊@(/>�S%,sŌt44#+"׈+A$e	KrLJ;W;D.N	* .yΖ1+ԢBOOt,|1?JPkƐrk7Ll]Ő$sq{6M�'UM߫[۝Q#I@X}pp_R?&a?OKܥӦ\oޖtr(uȵc8)_x96B/o];�JɪdM[6mۻvkdH_#",@ʟ!c`CNQ;y`sH
    Ku}_?:"ޯqPqPnz@%u"\R9K?&LUlaG&-%d:U(UA19Lr^NxZD,Q'&ĕK˝MJUj$pK+4BU`ɱ0Ř)!σ9`Sio!܌tɘ7\0I8?# c܋82_#|S"joR36!*jH~dY}XwmJ3uY1)e>VgA3{,,hcS;	[c%ӼL
    Q_8џ^AÙ	#	J Y-c͠}WB|duO	݄+:I[4odV, =c`D{:R,|xEx_&Q	yG<emǢ
    j)69cH71c5s,JNE[Xw漧[$Edw/U=r:K J9;H!^8W
    
    P̵Q=*H\~Ԯ(Pt얈
    cc$|%$.	̜pr6<w
    mz%	\?c412RjlŸ!l�%`#y/
    $8Xd DCK,c.ce!C@#",,{c19f=≎'y(c"R V?nW*{^{ڈY	U
    �[oFWՆk(?x�8,c]ڨQ5v,\nv۱?p?p?p?p?p?p?p?p?p?p?p?p?p?p?p?p?p?p?p⚔ZHݳtlw_*BeNiX$K;{X~SinuMӺ[.vh߳n7Ĝ8Ĝ8Ĝ8Ĝ8Ĝ8"Oi/':+GBGW 9LZu6mĎWgk^wn٪999999999u*$
    آ?.A[Uf'8Q*SsbʝW,REwwZs')s')s')s')s')Q  ~
    'D,>N䧋's(LKU+{qJuj\ku(?p%x| FX>4L+srFWXL;3 unS
    (ݻFѲ^ɯ( xux xp%,..,%Zw .{##{\FZ(~$5~$5
    [Fڔ+)$xHeDAreԴ+iuJwMw\]?p?p?p?p?p%:l4	4y1,،TTK9(ZƇօDʓ]*1`*6Z>M!yKB®-OCQNJ2f>h:ШJXnЮڒ8qMs8qMs8qMH`̢@m_A�U_p	bla!^Bu
    Qwkϯ?p?p?p?pt݈]�.[3ҨBQ)	$@TKZQލ뢡wcMjJ717&kBqikÂW;֡Z.\Tb[!@F! 8jᜤ*><Jy32|R($Hq
    .uQJĜ8Ĝ8IDp#@tqMD8Ui܇bq֥%ۖkIÊkIÊkIÊkIÊj:slQEέ|Á(p	t͹ZNë)XȢbg9999999Ԝt%ic9JP*_a+C^*c0KZ*VIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊhѵ"뎢Ner-̊-,QRq
    omZkݪwUO05Ѽm?XFyA9$?H35dA䄅rJfX
    Zich9}C*dwRueH)1Hay/2zL8N۬lY"LŶd3}:gG"٥W_gR
    CRn)h^eK18$HS<m_d#{QȶizTx?RC*8Gpa3m?	6Œ+T,[jC;zr-^u}L!)7/2TpIg	u~m$VXՌwL([4WCy	;}3�?/)0(".s3!ڦ}@3C{%R
    CRn)h^eK18$HS<m_d#{QȶizTx?RC*8Gpa3m?	6Œ+T,[jC;zr-^u}b$[$�t3kl'Θ8̄gj.׹a�
    #\TL!)7/2TpIg	u~m$VXՌwL([4WC/LL\	FE$Cݝ$IM65UXMzy	;}3�?/)0(".s3!ڦ}@3C{%�HLQ;9F1$#2B!:ɲhSpxa"$,D;]o/LL\	FE$Cݝ$IM65UXMzȬ1H2ܒFoʒ[ܥs\O:WB:a+אamwdV$dnIA#eIr?KgRծ'dF+PAq0k~̗?29i�BoI
    xIj0əSb-.FH}M!"dT: us6Nq<=[|q5#-c9%EpX#RNIcuIƝDv@T>0Lf"L=DZIinlͲ_~4ÎH[zC$fi.ʴJ}i<~oԏK\&(&Cɒ}NF,13PB@DjU-l8K"+25 ]-+ԙLG#S0ta5Z@kNLW.�bVrcq(g$񙌁T*I"'yn;Iijgqu1k۴$bۂ�%Z_,w6ô/X鉶v4g*{YT.y6XNB89zxpi*l[BƏʭ3Rr{%9#ai/A1̵Ɉ&g&X¸!�IBϕ)qi^_m(*}%;.y.yFyL�M|}<w3䎈r@Ҟ=s:\
    "L%*q,V9%F04Oi`VT[޾ޏ.swJŲXmي/0@
    FRiph^'rj
    "%	[-@t+ei:?L- ~<əf('L,%EFT\&!VY+]"Rqk[$ǣ9NA�89!r;
    *
    r犬/yjqKCl-`ܦ<XƢXLﲡ4nj5q%r:7S6=Io/1T]VdTc'q)g
    !PP>T;hPw<d"E%;
     1"9b>71P=&^Khj	Pܭ\<8NXVEF/ν׬mW#D-L_n%9R|9˅$u^PCԟn@#Ha%i~EF2xIpNcwpJ|�{MNm&IAWZݜжDSY03~‡/-(-Ju^My?"*VK462çX+(:0 "ua"K+^Z[EŊOt V,f,!=	C51!x= 7n6h.BHC0'aFb4/j,i`(*Y6>q8P˲Ec3޵Un픪B%'bJ^Hz3	sb7 Mco)xYǞжs<,'{&dt`v'
    /"Ӳb{4<6RrUnmIEŊOt V,f,!=	C51!x= 7n6h.BHd,i4q/\d	9
    3ove`Ebp6,ZXc|YX픷o\"c@-tV¤4n2;t\$ 25hȀ
    $fpONiܽC:$_eReS-Y$,0b'
    MW\H863icTM<#@R($,R&A?YOǀ2Yӣ{زE
    *Vͱ2jcIWb&HEʑd+Jc #ɓ'n@HؑP흽t~wA)z9;]dy=v3(t3Ifܸ<вX8¤讯(@BPHW'O#B!iȈBoc&"h
    L,;AFG'$,Jd	
    OEo9*CF\#^JeIr S]f�Ivn7
    x]nS)'tw!s3gGk=ӿ&$tC:.)S%@IuQT\59=EtDd0"5|VW:*yz̗by2(,Z<x+bsh߈#7w<9/m.vJdF:i6'W؃XH9ye	CJ@rrYGxw"j|!^WJkn]`g*մ1v
    Ѥ;n2J`1F,K^m*pf{D.mU,n'NA;?&J&F#rUd	/H-[2-kp{Tuc[艙8IĂM'^M&9:e7:/(ؘm%#QyʧT/0[ef'\CP	yFrQ|&,0'd`{Pɰ[+ecr^=
    9j2+Au]IFzc){K{8+3X+J52dM�dmį,A<HtdPq,;F Q1[ٹMkdYܐY@Ɋ`\(Dq\`�}6YWu:i]t̓O,qK`oZLq+CFps#gȓ^a=ȢEPC
    ks%|1(/vUY>0X&"&K8Q;cr&W$o76/TKq@D0t&Ȧ6Daym1\.8RȤ!!۪Z]*o&f}T,N:h
    {ɛTd*OW6"Hޡ{{j.8"S$ep<w:.JŜm-yˎ$;5l8G 6}h-$QetDB+癒c̡(&'�#ƪӍrwB%b|
    ('yQ�&~L?(<t|?�׸�M//y
    Ge	5l2
    6gi+X<dcB'vdU/ maF,}aAϤbD	@cyrA&¹$<!y0o"!(@ Ů}
    !JM䠩.	YdJrАLq:Bݛ:? o|hW}W'Rs1dQk2e|q14JᢜNN
    ѧ=(d;+ p	(O8>b|II)!ƒ.c)	FX.p#\m[Վ XŐ~2BL?<_rlHC`ԑS
    HPVJtʯf
    ,WRo%Hpf_	pJ&Sc
    Fح)Q{BҼ5VKGo0f}MA34Kld~_Ű{́"G"c )%1ӫhaliKlRD^<hb�LqJ`cHі?d0!PYwQ['SBm7XFO0(?x�"q6fzM#9w$̒d0uK!ḓRb:�t,.}X5":!<#S�l~p[t1a!d+V\9U9Oe@[<rٲy$Sz'Td'rj`M"Kn7$6}pjˇ;ۊ)Kg.Pv0Bkik[;KLS7~zwh`᩶D*JF"i~YB
    oH&`�ɼ9iy䦔y4r(8m֧u]T~"\e
    ǘ%R~LcB	iC<nY^cIQP2N7TFm_6㄰99NOɊ	1'q`�IڛXZtO:PB5Yn;H&`�ɼ9iy䦔y4r(8m֧u]T~"\e
    ǘ%R~LcB	iC<nY^cIQP2N7TFm	RHql-37Nx2r:Eݢe۩)Nqe7aN/LqXwLY''퓸
    �V$MMS'OnR
    ꚬUJXL0i%O
    gW4A,9/̜6@ɝ H<(NAlQ%H'&ow"pdpdZGqfb	o&iAqZ4+_Ympq7%yTŒr|>LPLA;�аbL;q*n[q_
    �s)Gct%3�G�PÔؚLιi+bbXBd5VeLBZNj܉|f%iś&0}djl\~ˮ_Ee*^9R[}&rXA$Ô!.AG²~.uXH V7{Ilq.`dFdS;a
    guڷh~hqa"GXdqNzMe<<GD)L✈Il	q:7}ɧo
    	-}kZp*="tg?*=EL	HC^fD_l++
    q4k:ce7H'nK`r=?܀L&bd4$;$;N9268ٷ:caV,;q?0R:G΁trW1*G[so%%|rL#8񱜘F0ѭ~rJޠۃͦ	f+stnÆtC z3=#aФi1mjlvO8YTaܑx"R3cL͉366˰M7ZCHj$jv4lk[!x\t0zrM&gyE/uv/EGu<ecC_DIw
    񦲙Z
    l2ʘIPڂ	_cٻjb;Wn"fCӗW(m|e('ܒI9M#A@ȖX@y<aH鋨!Ft	պDZl	&)6udl
    U=Iћ^C&"XL6i*F:;FlŚ	/Ƥu|gɔs,u<6CiAXɔrPuM,Ci/6R뎥D{#+GK
    gVƻЪXJKbx(#\Z[5nli4Ѽ:E_G=3
    Fk6-
    ]`y GIй/-
    }umϙ,R<D,�88V N?ݎQW&n+uqJ)nNE~ۦy9znbά+A.X
    p-{д$wTԙ-n^Hiֵwkf,@>GS~m2IXәw y.?KA`Y, e4Zu+/VI_w
    .wO!&t&"pcq/5?1^jS=Jͭ<Ood=9%domrB\ehWNI_Dem[}:7ijH%2(3q;,3G<& 6!I[HG2	#ͩHA Bki|QK^QҞ6!ΠȄ>7pM=$3ѰU,BR~8F6?.sT+hb
    q)8S}P$-7d`Tf:b.Ϲ>#ZfHp~M{"ty%Ē=skK
    Pv \9
    wAUzFxJQ<Cq(FF=^qMB'Fp9H	af;ܓ	F@2%7eOOdXTNB%i0<$S90ČT~A.0T{"5fsX>XLipE{Xψ|uՑlr&@f*]RsНBhI^d7QScK0$Jx cN7udPnU#,&aRv@T1uQ@LNBV{aS_عdp2umG9
    H c1>c:_0*0xµVRmWM~ж-)z\}^YdI㢞"ydIvhwFdۋ.yZ,_rؔXn _I5S//)bC,+
    Ō0EP4=k@|xM4;44pU,Q؝[Rg2GR-GMen
    #;lDSAَ!)3VBiq=Jwmu,L'J<tzrK,efDdu .˘g򰻠1Ndj--I_;Y!DM77MdvY)BTͶ(J0ul<uewN4qķuq7rY3r.
    a-ؓS	|^Y=^p}'q`,IW(SMZFw}XTaMymiBx&@DIedG)gghW5H._n+V]mU)ٓMz.^TۍO¹:.RM`d	 (B'̆7Ȃ_ÓڭSS5Z#(JqB)7 kE1;d@	!1I8\`GP'G'A_h߰دyX?'y_!Ȝ;�.hU, 'i{N'ô&EDFdd	ͤ"tp0{Jics{q&8F88DR93͹'' M&5bNH15I+*Qe2
    B؊})3 p"䪹1ᱚ(',MXVT	^63٥{ks`A_bUqJXA FqgLĀɓH qLvJS=;;T60ޙK[2vՐuL\r"Í٦R`X
    .V1T-rh7(W}+zN]X❬[ru~5
    "b0
    0޲"gv,va"~iP])u:hnmDQN8͝`O97!ć"D$Ӂ
    He-yZk(ͽlO$oDs^~MLdU)m0CՐ
    Yp{qW7=lnf˾bz,dcHrv_b)}{&/E~C+.7ÇlGt:a6!ي!UI$FX
    pjF*5ZqvO{n\O;v3Q,v[9)�%G,@bWJFYf=LRPXTe9Akά(4E)~l1^pז#(x]"މF`-"ZN8tdg;@H&r}
    l*0
    &rw1_xpKL|AÁ>t1垐SSlkG"=DdU<ò~:gl
    >Q9\>{X:B#6VeS*yX8+ S9	pkۅts�&:D@nR8RYN2xKٗ+✍7S dc9Hb�/.PmdLJƆX*]yV7aYA*)S&<28
    kH^SЩeW"LK|E4%R|Lϓ.̀qn򵁌$c77?6y~yQu)wP\r*8J+M.dd\l^AM1
    y344c5pw:`&(RmU'>N^;/2TkqyS\2;ܐYXWjKGc;N=DLa ͸S0dy4'"/SZTlQRu2we2M_9Q
    v79aK>z;M|!UŪESOkb7Wr=ϣl7l7l7l7l7l7l7l7l7l7l7l7l7l7l7l7l7l7l7_[Y9iٳ!pTߺڪwMUjv}WV,Cݔ;mjZQEoCm/<uÍ<uÍ<uÍ<uÍ<uÍm0UHߕܮdvrsCkvxi^Sbۛ<uÍ<uÍ<uÍ<uÍ<uÍ<uÍKscB25nD>%**y:RRkfÎȪe-Ψ$QE.ۧ<uÍ<uÍ<uÍOe} GԖ/2\h**dq[cS\ɨҲd<uÍ<uÍ[Sb1R$X*}qg1%fKW5,֙Eks<uÍ<uÍ<uÍ<uÍ<uÍ<uÍ<uÍ)avV9~|}ׂK{Cj=kE<7mofpzpzpzpzpzR>XЌM[6ϭJANktT�Y;*Ks	QmE:s4	4f,1&،TT3(;ƇօU"Zʓ]ꢪjߛ<uÍ<uÍ<uÍ<uÍ<uÍ<uÍ[Sb1R$X*}qg1%fKW5,֙Eks<uÍ<uÍ<uÍ<uÍ<uÍ<uÍ#a_*b4q,g%ySXcVŷЙzUW]hSl} A,ۤ*Ҥ[Ã3ܶb)쎪keV7<uÍ<uÍ<uÍ<uÍ<uÍ<uÍ<uÍN~T6)`l#*ā8x`q7T"uN[;t<uÍ<uÍ<uÍKscB25nD>%**y:RRkfÎȪe-Ψ$QE.ۧ<uÍ<uÍ<uÍ[Sb1R$X*}qg1%fKW5,֙Eks<uÍM}H+[6n&HIN	\aIPyM
    M+F߹G6x6xc8a3bmBʖ
    $,BA&,ʚڝӪrl7l7l7l7l7l7l7l7l7l7l7l7l7l7`UncMKm`T-Mĕz.nI\سZd
    ^Z]OMl7l7/cպ
    lܔiJEI83":PEXnl7l7q1p"gMl:8,:H4X#
    M-YM5;#WMUb|oBxC/CYz>	ySATv	U+%6#J-ŨMEU^%o\o\oK<G<5?mdQ*RZ]|Acצ-_jʨ]<&o͞:Jtt>>XbbXMਘrRRDmCM*ZUI]۵E5U
    GdQ}b�^yM}ߒU\ݳ_krtj\FNO|W)^A*ij5\NT5սjxk^mbLa�
    ~79oUTZ4Ly�יqSwŀrwZSj,?+cR@R"CXvel|qY1ƽe&,}Td
    H^#Q̇"qtx1cұViZKo/Z{m'y{Rb*LnAfN0%21r'G8=+	!jqH+IBwN9!#>h
    aToXѐc2dD=H2DٖaCcFO
    LnL$Ipa>EY~@;ɜ{gR
    cLw$NvUɎnQܕfX$%/ꀇsZlt TYDrwO`;G%.oƛ_/*('ϢwfFuJlLdd	I԰mQgth}܀w9A-ϩG+)Jƙ2(HЫ%H+O~;I2K�_v&2N)@�xJNy^e;J&1vJ\}7*_8=0H?&OMԃ$Mkd6?d>@P$ߺ`DzF遊;=ٯǭpѥ}_`ҪC2(cR@},/EƔkc-2uD )8�,B9O`̦G726B/\�AI[tbNd!JN0B)<8
    *J#țZ24Ƅ͒lX5)_qB
    =YECBuָh>iU!b1퉌) [>ږ
    J5ԱÍҠ.O~c=fu`^+^TTr
    !x~/fQK9SeĔ8t:xaF
    S.y%qbqTZG6"di/%goرckMK8Rq'r?ŬyY+2$nE!vCE) ݐNEV(+)f*Ka=Lg<,D7";!R"Д\?'DWZ%lɓU!�T]�K.WN[+%c 0Ahԡ3P:ET]N؊ݎ_Qk�(	kIc B2T!Җu1cumQ>\�˞_9(NA4⹞RC	Y^@@nZTUb`(7fo(~ypN`crx)M�tz,1L@m/; )ҤQ<B>;`Q�2v'@~)
    0{h#U~;&$3ovF%	ljikC!JtSQ𰐱ǖQ1Q/$/
    Q14#jW&JwnMVQ(d�)X~QBbtvd*e9`r,
    bU Q6k1bƫߕ%(,w�6-tnD&ȄTp8\
    ɑFOyez>Tr(2^7,=PZHT_ޑB:W7)aLvCZAo%|ORV
    	f6ܕǩ�q4ܫWwn ]7V^ؚck
    .:)�k�Dy|��yߕ�['x�J�E5XNr@}	#i,146s@iK*zݣ֑Z)
    m@*]	zQg%$>ɩC=0я	9ᝤ3S-3P]SxL(+`c+AZ}½aq*漪nb'6:/G\Ә5V%P
    .lK(;Axq� !\zx:J`)Afk GFcHƸHGE*bTJHSdȹ//0oH B`/V
    C2U>d)xpHN''leKMU@u*&'NخfHR["f/R1}joS(:\jZI&J#Hr28 *dȜfYGBYnl)Z9J9B<U]FSQ./d]&Tudf-%`	'xCD'FsCDSn&N]TvK0 bH͡U×N*hHTY+2n 7]*Rڤ�؃47Zn1BYxWR0Gn+|K"Eq$\qǜf)b$|8QH6
    N
    [q0OULtTL|W1e/|`?;H0p4
    9"1
    re>GS+2"hE\74=p~/0'QMU_GlY-l.V{ᤏl90Ø3r&<	ytK?~ccIb7+LQό1jiW #zc*t"KvAJ0PL4)}Y,Ҵd$#`X�['cQ`6UOg92jY'86ƤZ,EznZ6u1 0FPoTuXzh&;Y"P(1QPJש.Xep�%,@$֜R+ƉfxhUۈC2c=t='n#nOv(R
    `u�?-0]̡(
    ף+jr@z,cbU5$o
    n1aN3d%MWmFؖBR߄0@+2y))0’\]kPR#o$`q޶5c2ȢdgQ6&^D
    `WF*L'm;mʮHPqǩC8_vo)kƲ}f?=k䎔t_%D `q
    
    Q9IPNQ!M#0pU`TY`֗\m%(:U	<^9Ń}]9 #9I#F\\{s㉃ʋ #\ߟ?QMo"8*l+*=R�|iW֮Aohн5Z]XuMF-+<&.HyAȉ'FcߑWJ^nVL6�C;QCvfL=tci$$tbˬB@.:
    U+b;HsA.p!,Ğzgl-2wW*Q.d%án^Ѐ6<_1�hjL5H<:g̵JT??47C48}@zJteC%SVvN_ʋ�$|Upv2(:`s M~T#uyAt!CwR%qK
    ,=`h|SZd=,osُ#29 2@H<5Q}Hmus˧�~WN^H?"y$mrt;^mȎx�c!#<Ɍ'O! (kI4d5qفBSfkZZ|`w!@c¨4n|M1ؘ,}\ީ;S—G+n	'spc�QV_f̘>)wC,#bT҈n?!*^%eTc~s^\rʼn)|#99C =H; lT;uDib�q=Z	/Y
    $1h%M}܃AS1Xog@l֨*K$ON=JMoMuFu7Eb}[t*5!ݗtFИcz&RF"ʮ(kCrBFI;o#ۥtՂ&�\~j6@A$HCoi쑿r}ܫ+>‘kE(-M֠&"$N>Н?
    \RϷvʪ~D~yՁeOuEk"&4=e.yvv�@)oWZ`)r,MƹZ WA\4zMA�;,rAlɉ,#
    mW:O1jiW #zc*t"KvAJ0PL4)}Y,ҴfY_f<E#p=f('_~J2ّcx* %5]M:7HPFds֔p83c*-p+cTA/
    kM&aUAdmi� PַOqԊOdA\T{Ht
    ۍropR	\@KL	d{=exB<ibjVOϫ�%=fu
    lfH|akmHM	[V^dKCѻٽ)/Sa%uQE줌e<N?a4Ȱ'E9Is6KsQ�
    wXiB/^ؠͧdY=a.ZE$E=NM!䔶b&]lI'n 6+8͜%egCg}YTty*['>b[\+d<<:5Ej]ĕ&\H$J�p�5FMs @~kЮUɜ7Zȷ0?�Lcs!l7$[W[uUf$r~m8.Z˞]͞�c	)pz8($́R=ZL,eS[2�ªvV‰LeYQUm]yqa
    fOxc'IM)s'X3m﫯T<6:fجU"D>Ωcs.)R/ZZٯ5PqǩC8_vo)kƲ}f?=k䎔t_%D2p>vSC<Y
    ЌOTVhǎ$f9~ACih
    50=jܷYv/70,UcC	Э/$k!qo)K&8N`ܐ%L4@QK'dܥ?Vdx3Bfγ9`53&hǂMMXPQmk+-`�>dm,~4piOw;#7.2
    Ҡ?q;hjOKUyWBiO dCfR`҂W񸲸zNIٷh'vj_Tv:Rԭv3\'AOl-h:@1J�"FKɳ4<P(W٠0BDjJF爣1<ąYYlw
    ߪ>T`82vcxEK5"R'Β279@
    vZ#D}6_f)4pٝ?Kı-,
    ht2{Z6Ok^,QjEhM ؾ-5_x'<|KpGE<[s/)tm<vJfIq<6}%9
    )'PM�#]A
    I*eg$
    6rP븋=5aL8cFk׬/NjQLihT<Qf[[Y0s!?}?12%7sQ*21*2hr!%#SJN݇Pt>0Ū\1E[{l.§a(áBY2hbЧn!,^%dGJђ^P;en6LK;va7n|xBfCR.]
    D�V2ֽJfi񖌭M2ƁmN%8O<١$830b6䵨nTX:^	1l_0#'{oaOl% "/b$}^F[B]z%E�c]@}"H^]\5̱UYmˣ&w%C>[vۘ~)7 +eYdd{
    c{Ra]@XiR&r0jBD%3uKP>JQב4Ez\ y.;{:L>mВ*9]
    hܸ/M6SѦJf(d~;3V�OJ3Ɇ%S:ډrD~>Pѻ:[.`3c~[SdQxn2eEe)Xn4Y,gp�5	"hUMECYc'ش?fb]R(͆&h"|fܿMbk!N@HWD78
    Ep>(➪aHTH_Y`LYHDgQRE"PPMNK.1L|WN2-M8RzLxDjs
    =#fɊmPvM-~wMY5cDibv-xXX*]lEi޸x)g}*}qipԍ��[Ss#RNߪ?֯aPF�'?S
    JFMeײ�^MpׂX/12�:D	%E,:#= !TRnnټU vw>0 ܧ-GzWЈNN=S`BDo'=iNiky@h}(a:ANZe#AcS)$zN3e1#zҝĶCk #STX5pBnԕXq}%<[d>)m|ZV8
    f:ܨVo1C'H7)QqutAh,jt"$Tl$|OBSZ$Wk~=S&_8{#^.bgXIJM~dTGJ]Vu;TU vw>0 ܧ-GzWЈNN=S`BDo'=iNilb[!H*,!7FjJ8D-LA6	-+ezRB˳mTRm2l_ߏTŹcW2E -_҇U9l=-2q9j8."NBrv@#y8͔ďCJw{KD) ,I+=b¡*IC,gykh=Um/ZFm=.Mҁ2l_ߏTŹcW2E -_҇U9l=-2q9j8."NBrv@#y8͔ďCJw{KD) ,I+=b¡*IC,gykh=Um/ZFm=.MҳZIx)5ɲxw[%�}YHQjHܕBҾsШNMi$L2�D֚:&!jld!FZ#rUJځ΋[/oB<*�.�ؚlڠ4&2Tyf=aлX0s)|u\@ Bru.Ex<Ar	"X<SD`hRo&;6:!IKJe
    IZҟRi,HM~#Mc# 
    ,M	
    UZM#V&X^}xsyѝ3�!j`<\X*)kquxq[r'uCo9Ru9T6>$?w&@@JX\\XJZw .{##{\FZ(!JthRtI ;D\>H6A0gw~{5y(܀? %VqZ'jR]a=vVi@*3p�be`vbGPJGk#'sy}ӽYud5JPV?92eUo9-)(H# ĥ/";3j*Gl/JՋ;;c,"q*ʑF	Y|11mItrW#V"D E[k滼E<9ᐪ'>tXN%B?nNvMo&
    	'遪~:-Ky\ъefpHP9N5^\+9X+mx
    6xzņmK}Gڤ	JKopʼn6b#SScD]&aNF$4u[H'h8 ؎ lrbdcltuw#ջP>.qv*zb	8i0&<^WHTjBfIM)؈ۭ&5,qpFE/ :y:[Sy�D:˳ZA)Y�mO	NҬaWKY"טItfegAV"4őO1GkGlMVik j66L
    #_fn~ L^^VH| IR{Mddo/#zwu.S;0'6ͥl-<A2ӆ>Dl�wvgD5]~'ʜW¤&`"EQ\5$Dze E>
    vo	4XhV ;lh69Ae0kCd*l='IPz]uSԓ$̀RMdv'9BB1x(J!fGK+Cfָ3Rt*�Bd(s’m#N
    >)k\hp,eUTٝrPEݦZ{L|	eAR₢XTtlvهBJ-'ioHBwzvwQZI81dNLdNqDiSqRxML,)|Tم*˨*GrH-3MdNCOH!{q)[JD31nRtG*{^F\R[+۵/#|P#"<-B@I�"gbe- ,�TACնȧiV0el,$E-OjںZJ&YٹɮZ6SkjQ])+$QbJ	_ȱ0f@Q#"n՞8}&lL=yEͽ
    LGayɽsӉ!2KAa.Y�-fu.#\]#l-+oZ/c JX*J!D2`RVV-ci~")BbF5X<94k1{X?̷23bn2A;1dX6I53ɠ #P/	&*\Xo:,;"1bLr)0l))$,)#'|@O3FN$
    Ua0i8Afnh9i6,3'ICNY#b2\q -y	(W|'yX^S^Q;,=c�*3a?tIWJHQIak)Dd8'13
    Ѹb%Q$
    YP1??06$N'y-Ms_52(9̦mpwQ=-󧵤w	*/WyrwB&fئV' 
    Q .
    )1
    B͒dIlwjmЪRRS%,Zmy\s~\C=10L	uEr=L<}vtpX50 ?5uU2G2+O_k[
    o\w9k&@H9Gk?#
    rҌxNaQgK	JREʆ"^9@r̓5EaC,buc?gkD
    : ̍CuČ6QlS磘-8&jAHژ&y@J;4n\bvn6#l( |ЂZFiLmV7~*BY5C
    CmY*뭛kQٴfWU%p1]HI)R8Aqjt_,t\P#lo&cOZ4ZE=I1I)nL	%)It6Ih"}$#(ׂ od(dt26mk35'F&Ӑd9aR|לb%ۄK}!p+˛F!Oz{)RH
    \`X&rٙ9"XYk$(M?/Z6еrj؝XV+Iy[SuQYτ
    
    NO)zL<*Tű,/˥'2@,<ƅkӊv֔mnB;T@t}P`BINZb{Sdbשev03y0zԝ(,RHͱD~]:͓c#p!Np	t͹ZNë)XȢbgYd\9Ȱ3p\q*IO+fr#挗jRQn\r~GapCH#hՉi[2B. 7>RAuM_6]Hd`b&̍Y^ࠊk!)FM?ZHrj\_]$Ie[Ig	1hhB�̞?%te:of`0n^L.LpTzKV:S|;Ɯ $_5\icyL9{FBt|ʍγ%])"AaX9ŭR|6
    EgR8	ddشMnZ nJc4D~iɩWBaS�<zdPNAO=*SFO
    =ʠ)0TeMQ:+w,d!3Bo^e9h=G!%F;RBtLAiC7^ꑸYUHbAcv.1BHLaIiM2"@w3'EJܕVy$@.I2	"Vq8HF9-D;[7d>s!5*abŧB-ԓc+ c	ZAq7X6me<
    ɂ)uL)|ÌH&`3Agbrt uE].iI?$%6[`X.CҘ4{bs^$sz$ܢ2Qlb#?o,w	<>@L{Q+yob7-bb|tgonLm9w@GG(rFk,N?fr|g'A99-D;Jz,;v#ӔctE)
    M`vT\rvcҍ5#BY5#wjݾ?iM%1fkMSaLߐ
    zELDR*@^V]HRgGȁ(^s$±a&-<KYH547?<Nm#ӵg	1hhB�̞?%te:of`0n^L.LpTzKV:S~Dތ2 妲s2n+OY05,cxlCqsHgTmqCS]lL	$< 9NDdvw$8F7gYB&2#ciZ[R9hFBI8ûl2 aw	A1IrL)*_]"9jJjaēZ!ض$@͙&b'k"|Ƙ`i($(^|dFK[8u3dw =� n NJblqxU0d2cDU!EuKKͫMw4l[dXༀfUL%�!&ٲw1?Fag/"Kr	#gA֫ajW]yJ0Hifܩ<×ٍ6X0!t̻>[//e[*5
    ̤\PL"BZc1Ry1Bu)#lND|
    Dt0?SZ!
    *٨C/ ق`5S9cG&Ut!Rj@dٶl$H $RQwaF7VkШ*�`ž2$y.#IMޱmڇdѢ}3(y}r	޸1eYr@Z? =V!̒	OKAɒ8
    !}i84ЅZ�L"PP\zVӞ,
    Mmά|=rTD&CmNGHl}vؙ%ToNA?! $c3F2JnqF�* dSSUﲶ{ȡގ4  _;K+aJ2};凾TlFu,'*I*3e%~b`2k7ѕ_
    GHBK6FCWT_}IvtscyWI9�!1ʬXXg=qwϜW-"y6S˧CX&& 3UʙWiS0526E�
    `ŜI0(LچkcaD,?PdJe9kʣpZ@f8}0sJ,8P2H2n(glAc|jS<@ŜhRxGe")i`%2,QdS:{r6UJi^yyXm�!>TGӯ)d*e/(TӎYg(B�K;I?4c%0L�ɒD9W*]!E."ΑfSd^c0)ѽY2i.;+U:FȁR'w^f&Q0N5}t!)cNG>:=j܆[bZqugt&Mì_ecsȮJ%:ȱT*2g
    TW1SЩE9Z,qh~<VTG2-ͭq,'X L8Rz8ZuHڋP4uA
    @"xlhe)r9{9u*X@|9Y=vC%X@˭3ZXM(ĝ	Y9�w7H31GIOEdʗ(hݪލ�%PvTa%__gN~L޳ٮGKwvV꫶b{vhNݎcn+OQ<de1-H'a4MCMC	S]Jnҥ(qKoZڸ*Vxc}Z!N#iP&cv56&#eJ6PiۨqT=DPB% Gҡ5M5$k[]Niu(lMFJl-ӷQkjpZz#)hJA8	BjjHֶ>P؛t(C[}n7MFRFSBqJ814;mu8}ԡ6-*QNEi~5bdu8}P,} dk(0h{ĉ)Ƶjk	\Ij7
    22jD0T&݄kk.
    HiR8v-m\n+OQ<de1-H'a4MCMC	S]Jnҥ(qKoZھs&)fV&GSM\	F*HS;\H(lkVz6#pZz#)hJA8	BjjHֶ>P؛t(C[}n7M42:>
    lwT>`LdX5YR@4=DQCcZ[ѵ׮P.X<�NHCĺs&Aܿudܟwwq_iWcIi;iRaddJԓ4XBdןL489N/޷nŦBJE9*doRLpL:c	^}02 @֒P:[\zݺڞ+8y3rNi׷V�qP{EjnQUv;mݝ55
    dw;^=�u=w7ܯ}�
    X]';d#<f9~ӐYk$@+>fsF(+Z$2<-*i|&k
    wh1q(K[Ql腪jD`$'10Ř-s{X̉aI91)vFZGsesC{-m]a<XZ_,ImS$N:qW#G&AeH-(hu\e]}+)^atTX$$k1�$ch78J**]{V�զm/"&/r�F’ovhښzMMXC؝KKJUv~""~v#S##RKUSvtWrtND6I>\}z',Us&�d�mS#-b
    V+jFBul7MH[Ѩ'..A %O\LMWdITK6\7q$Ld<;ÚjFQQBsD\4Ӄ7Rm
    [^s7Ms7Ms7M;-q!+ (3RwʃsHAS"ΌNL֭rK-87Ms7M8弾w(Ƌr
    mɅ^[V]ԎhRE%}-7;oPDDBFF&FTVڮ额݆KF!tf-2@RY"G&V_CVq{J˩Zܬ7Ms7Ms7Ms7Ms7Ms7Ms7ME�';<-	cI�Ŏ~ݍ-TWrwz*ěvi$ED`S0")83bE憆D7ܢs&)RAR9"#k@/&ƇtnzlOwe܌S|%fkt?ol)QM]
    G/-0(NCJϰQ%	KJ]BIԹ
    l-V0*IkIkIjL	dyyt+ӌi	67]uIgHE"
    	7sfm
    MS\MS\MSD	CK}
    ;E$�}wWx9�6Gy}=nbJ,?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o:dvqm˫jn^'$vݓ&
    N<uQGqѵ;^~/�ZᆻYAL#rύe`[$fE!f|@*p�GcW#ׁYzX$uy;DN"…NW]ac&!,ꃌ`\V!woe&ɉ͵ìݥ%	fYalM|trӓť̶Onv֔VD0e}PqD.19u3,7́ZrxIq<2'ÆLh	:F[|X;&4X.7<3{m6aa[wq<8ɽ*:_͝{J`d_n*Lpm)ܽZ[eHdΦXj
    D<&Q�NG-G([WQxDY.bq>'ԿR]Ll}`
    TRj:Q&+SjSwq<8ɽ*:_͝{J`d_n*Lpm)ܽZ[eHdΦXj
    D<&Q�NG-G([WQxDohg!s$hNVx8Vɍ)u5}fuˇMDo6dfexVᮭY.bq>'ԿR]Ll}`
    TRj:Q&+SjSd>GmGI	'
    3gKoOLB:U=kGL8/+I}Xv-QhvȮNTLMKL{׺z'ݮ˪E]Z\"|O#SH	, 19hժ
    uRMV՚;e(y.`jBXq><@sA왘e*J&\l{]TUiFJpZ%\+En
    <%kQz4LԴǸ
    _m{}ꚙ캤UGr``l¹<?O,bYmD.&솂؟b|L;FjRÉj%iK
    (<c/edGܛ
    7b}0uIHBH/&R_?&g]c~)P�!X5xY6]vyV		U)Շ$w/uiB*vn}1Fj8R3q28vIޱeS.1JZT`Y;y>A!#wpb@%%1jlP]J捱fr'ƴ@l 9Hp̯¬D\̞I_DdQUwԽVnY81)Dog2|f5_Ev.rKyC"tW1:5-?']J@K&afBj|\}ew!FD뉍_XczF&TϊP	^ x.C^.31O!/j_NډQ#Qp;Ӯ[԰4J&Y,͊zV~OnVF(ۆq)Q@%9<Zncj(\
    GaVKqXFr_AdV^& 6-g>ܭXяosv5Hl0δ.}`>\Ҋ1|ӿȖlU<&aL15C\`,ExE9Y,6ްr]cܨjԐRG\N/CǟJI#
    dVr&gkcIXy:@v6Γ	.HmX¬bPi(!:d$16"w#Ncs"W9,2fP+L%p~NYz#A`;L,X$/OU4)`l jt	8PA<c],j">ua6n?sGO_~CA:D#\sdeH2+Fꮄba,eYY:n8@LE3'⼒Gcݔ!ԍL*?ÉV|z̹Ԏ,#omz}oQ#!1>iϺc : {6;t`�sy
    G�$޴SnY[PN[PKVvBr:c4irvi6/e-=7`ȜyDp:VY+HI.ݖ$H}ONUu$N\m5W	$NLk׮e)'`+D#h~/Da(=hGЖ?8eyמֲvܩ\qbcRWx#)҅¥Ŵ2n'b0-3NQIe$f"'q\m)=N@`{R8}{\#pUOoֺ͘%aE[1H6P8c<$6.>ɚmlw_R6HWӾrM>)nBuub;7(56!!M3f|h&kSBs!W$/#`)uE]82W	a৫"BH.?b'5mQ=(ZA"+[%SyS#Q�V0@myxsA8 4X(^&ŝgv_C!tr&Լޓf[vwȤ7q?l_k
    &.�Wf]Le=HgGԍ,H5˽,LNrK&%q
    fSؤH'?([؎![q=e(k1𤢆‡fT
    ]R7EvÕL9Ճ)&a( n	wʃ7@^8PFdg׉!8Wwl7L16SP	օ﫤ܢJL 0(Ć"PZ4ϤY񠙬jM	؆\QX(8}kb|?CTfLA{0ɒR*B/3loɋ_mrE<mdNX+̌B);dì8O}03e�Jcf(U1>|}@5i4ϋ!~ybz&	F6:gDxrY$Qkbh@J+a2wCKfLQvSbyԿYK{PKRh5_)IFFw,eEA.zaˁywumIػ5	uS.о\/; l싔GiVGqF,W>p߳Wt%J!1*Zu4,hgyAlzؘ/8'2rRrgQȼr|۷ Dld?$b&M|u8R@B8Y'hTazXk沃79:4iܛ^-B:$Vu^L5귷rͩEjvmxSWWuM]_ׅ5w|G^xSWWuM]_ׅ5w|G^xSWWuM]_ׅ5w|G^xSWWuM]_ׅ5w|G^xSWWuM]_ׅ5w|GEW1Z\@.Ȏ.Tҭ{k~	mފ+jv߱NXC}Tp~қTwnŊjmFݚU
    j):š#
    jg@zEjePӫŔENNUʪUMmNSWWuM]_ׅ5w|G^9GO
    ^}4'p"FOFeXCyesw'4>$D½C}	E|D&<f @9^b\Ms8>GQ#Bd[AK\$Jؙ5w|G^xSWWuM]_ׅ5w|G^xSWWuM]_ׅ5w|G^xSWWuM]_ׅ5w|G^xSWWu?9[xM@Mm[EG'+)p$][\;YU[SE^xSWWuM]_ׅ5w|G^xSWWuM]_ׅ5w|G^xSWWu
    W0Hf2�eT=j3ǎ]#AgSGob-<30-9p(ݓxSWWuM]_ׅ5w|G^xSWWuM]_ׅ5w|G^xSWWuM]_ׅ5w|G^xSWWuM]_ׅ5w|G^xSWWuM]_ׅ5w|G^xSWWuM]_ׅ5w|G^xSWWuM]_ׅ5w|G^xSWWuM]_ׅ5w|G^xSWWuM]_ׅ5w|G^xSWWuM]_ׅ5w|G^xSWWuM]_ׅ5w|G^xSWWuM]_ׅ5w|G^xSWWuM]_ׅ5w|G^xSWWuM]_ׅ5w|G^xSWWuM]_ׅ5w|G^xSWWuM]_с-"򫊭*vW١=%UUQsz�S?_gN0�ZᆿYA�4_
    v79�hi�eo?s��ч
    ~4}XqgoVwlT_,[n}RKݶ4Nǚj~Wud:MO^i]Ց�x͆�*ok͆�*~5uaכƞ?^l?z�
    yiaՇ͇OVכƞ>?6=X|^l?_Շǵk_Vכ
    UuayWVכ
    UuayjaՇ͇OVכ
    UuayWVכ
    UuayiaՇ͇OVך�ƾ>=5�}X|{^k�~5uayWVכ
    UuayjaՇ͇OVכ
    UuayWVכ
    Uuaz1uayWVכ
    UuayWVכƞ?^l?z�
    yi�5͆�*o͆�*m͆*m͇WVכƮ>?6]X|^l?~4ayiaՇo]X|^l6UՇo]X|^l?z~4a�aՇ�xk͇OV6=X|^l?z~4ayiaՇ͇OVכƮ>?6]X|^l?~4ayiaՇ͇OVכƞ>?6=X|^l?z~4ayiaՇ͇OVכƞ>?6=X|^l?z~4ayiaՇ͇OVכƞ>?6=X|^l?z~5uayjaՇF]X|^l?~5uayjaՇ͇OVכƞ>?6=X|^l?z~4ayi�5כƞ?^l?z~4ayiaՇ͇OVכƞ>?j֛cigUBݫŅJNjjػVU)S߱������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/images/logos/����������������������������������������0000755�0001750�0001750�00000000000�12203357067�023662� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/images/logos/lblogo.jpg������������������������������0000644�0001750�0001750�00000130423�11377016712�025645� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������JFIF��H�H��vPhotoshop 3.0�8BIM������H�����H����8BIM
    ��������8BIM��������8BIM�����	���������8BIM
    �������8BIM'�����
    ��������8BIM�����H�/ff��lff�������/ff���������2����Z���������5����-��������8BIM�����p����������������8BIM����������@��@����8BIM���������8BIM�����m��������������������l�b�l�o�g�o���������������������������������������������������������������������8BIM������8BIM��������8BIM����������p���<��P��N�����JFIF��H�H���Adobe�d�����			
    
    
    
    ��<�p"���?����������	
    ���������	
    �3�!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw�5�!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw���?�TG~˼}�԰Yo1h?gM2HmJ	@w6RU԰ʬ7ͿqSYaDL�aZpqn�S;R54W�tI+)}qcƟs""PA)4;Cik/Xr{r"{E%¡c}GYcıUe7cQ�sC\w7^XǵEe�<RYxDo[]'u}Vj?v5\\zp[\`3(7}�{zEnjh>\?4�Pc&㤨a1Q7%@�pIc_�k-.s1Y{ܰ#~>c|3㜸bufI$eKKOQvl!#)Z]5;5^qYꆆv5nд1�ٲwHʩ}f�ּg#28`Ȏ+z5Lkf+:SWh!RZڿV=s,]nP0vo9۾vn)k4klu?=FzOw~z3
    P@f;׵~DDAQO"x#3W.MΫ-QvrIJ8M;nc�nCgRCE?F3TŞ?ws�Jf
    %;Gls[�H;hŭᾭ!-%�c,
    B>^.&�VI_kuW'�_dDvϥTfV.Ev?'$:^/q"ϣfUnm~k`ewӎ!9ӣ}ofYK;c\Eu8MI7QDLJ}D	_L)zet2)n6K@}Θ!qFEe:׾̆[[V�QO'^`m|Qٹ�?λ,.q`sGc6=Bgt:Y3WV x`xore+ӭtC+V5V,07G%[�[UfnvRv@sᵻhyou!x4>_�XcC]^e{Z+kI')'v:}�KcVde&F׿{(l+),c^ pG
    Sz[A{oʮp4??:!K,p!oݻcO,`bh$EtVMtc>vYcƴ$�8g�tLѺW I5w�Y�ޫk.l<{cppl~ճ'5Xn)ccdz|:6(g!%ǧ,Љr_f}�g\znNB+۱kkh{v{ߗҙslqYdmkc~/
    U[stg5ٷ]Oq2SQ<fJ~Yh>@Lf+l`,􍵷W_Y}Om[<4_A~W	&CI{=*b3!."jhVmڛ^($	7pgb8՟ҳ/<͹W/sv{e~JEʿyl\ih/a/`e7llm{+oE:Ňͩ649U&K,sڭfX
    7<IN�l":]Xmf<~}o?B�`tq66[dZc9u˄EdCCs'|7@q
    �ciqЉNsPo_3#: 0D]ssX9$cΰ;
    !!8|qw<|hHn;an?cP]0u	opsg]IE?f
    wx[,=<U|i:^m`6Z;_䢳Tڃ}kZ;hùGo#$}U/waӰ-:˜=ӱ}P$zL=M�$k>"^#Aq8n[:g*6˱n
    춧T�4G/>C|~~�V|==_Gys42qW�Ͽ0wvO?h�=/Ff{MXns^>n�mklnؘz~Fgj	}�59:Kq-NR׷{	p~#c[c?TևB#�gn5ODzRr(F<^x_N'Eq-~c-2)X>cֻYB5�g_8BIM!�����}�������A�d�o�b�e� �P�h�o�t�o�s�h�o�p� �E�l�e�m�e�n�t�s����A�d�o�b�e� �P�h�o�t�o�s�h�o�p� �E�l�e�m�e�n�t�s� �1�.�0�.�1����8BIM���������!Adobe�d@����������������������������������	
    �����������	
    ������ 	@!01A7P"#$%8&��
    ��!1A"Qa#2 R0@PqB3bCv	rs$4%5E'x�		�!1AQ"aq2#BR b3C0@rS$P%uҳTt£4U7����������������
    RUշh����������������������.zh9P����������������������}H*z/x�v��������9������<IOICGS}OH-3yoۺ&@���+QiUU)lKml+3Y]nN˞.xLN`vu*=4k/F_F"5}mf=�
    N۵/2WVw{Jຎ/>ښգֱC`dWq|�֭h<_2eV5Mc[PNiX5EAJ{d`lm�+=nPzwM:,7jL=Ukn.f]f-v6]f귟;`ӷz[w܍h-
    FW:}ޤ8xhFz+90�
    *U4VUNVәWYyI/%-1o-c9pvOVsLŠ>>^Oo<4`|) �<sXfz(ЂSJEκAkTvFlW;*'˵%VE	31:y%]ykpU`a믠Ob�U]|פL3ݙ[ں˳G
    >YnQXLee6/^kX2晧653\sWk93q{FԲlMuݠ.݀���VĠ⠳WCjZ.PX
    T"3PHx.;37gn^C;tW;4*2&ol,kY���q=OjiA_3m_Kh4⃽2=ZPni8Z4abp<\yeiY=o⊶+1%bn[m<1^-ِ0q<982}|qk϶U<uL:BSuA^ŜU6{ݚ.#
    
    a6eY:KT1mllvNk#EwnEJ!f_EMni*<UgzWʦU8*;ܺf,fq"OzK&Wkh%4T//#dd-n38Q[)~~TV}˿hIRܩi8Y)f*Kn&Ɏˈ*1'j+
    lL?.}~
    5܁:;5	#hCt��C���nACkS5vCFwyW'}2%X9/	Iuul	cj>?u?#����������p
    E
    Jӕ#,C['wS2JλK͖3&ܘ|x������������t/nޙG9bNq3>�����Idz1�Zؒ/@ెa+]a|yc;c2qc}q!`bl' W^!I,ܕ
    b69rq�^>pHm8uNOY֠Xܘ\Ek{?c*XwK2,�rGjHq=}B_oep<2Xx'hPYql\pݺBi%	IFa0B3|TWQ_\yQav1j�y<`ğOt>ctԎEo|p?4`]z 
    gΕ@Tv7$J!S`,Aq
    %XиFS	*hdGŦ@x@c& #qS0-QYέf`
    "?/7'vYAaܩdƈc\7TJzڵeAmWaKS֤Pfw68y^tQKbF4ntZ`SmtHW$Ɉ̹!=Bb^)>|QPQC*%NZ'h	/&jw&OV	
    lzRXPZLPS+4J4T\eoHƛtfD7PY$,�\"!TsalN^DW(0Xˏ3\
    ~&',osk쀈߹'dJ!hCﲵGT$62%ÚnwPRJO핺!mF_a]"ѻ9;1vGi!124BfZ>pJvF45]WU8K>7DyZsy6E>\`-6R+:ҩ$auj\ذ1WIO'd‚W`	tfWƞ12FV:",af: W֢a9it
    M0e(<=sia?5C#8BmZFP1!
    	o^eǜϟ/*GT1׫\/;H#ͣ}ٍLe@8$ 	]i@րeωpRF&J\1Ip\9ZK"dߦoȘaX<zc1a;C2[<%ĢexDЫشG/<{8>|2ӎk(1CH1:yq;'8^qil#87vлbSBWpOC<qnMn(B@V^\$hY'؛AJ!|}}ؿmkYF&SOgY#L2eallۧ7X�ݖ3!ưo?C=T5
    Lf瘫(4Gr\q џ[=zDPxwaN$N}|O;گtɋV‡OUWVЕ)YarUW-eA<O&#ZNhٸZܚV
    .e̗ASE&>RVRU҅Gv̸4եxmU?'B^Z<]q>==,pF|LԾ_DXS7"1-x&gܼῙ1
    o(a|X|{y{x+7]<^9˜]M|oU۶]
    �t=muY>+A,HvLN"RRMD�@a:H=e|>o|~>cs=?3���u=�b??T:esW||q9~X<ٳ
    Xxd&;ƻq=XXHgbd99{$o ]tS1О';^�]R֤-7&v-K)
    M]dًEEv^EBnZc	b!ClF>n榥l5?2!88#p
    @yQlhտzR>aemLk"H'r'տn=y⌙.=GȊz%IJQQbeOxCsaci
    5kYQ-Ua(R։V�defkɃA'):5F;ÅX4`$vH4>u=7_[t"u3]A"ɉ@캛
    #k-O�P#
    "[x_+jv˾^űW_dm%ܶ=_'UX9vcېMQu@qp`mfS#Ug$bD@7s?9k
    
    +֥PVݺ6
    1lG),cf6LY71bb"Gp^dtjocô)Z^'Y;mn#~l	p?tE׹1ʓDVKr1yr]JW~y@x2f]<W]Fvm!QgvS@cnµƐZS9uѣ%nS~CÔOF4^Zw
    KBhz$Á8paMpفdsWQDu#;BдT^bhJ1_с$1 5|biW./!-Eh5k#ZQE"t|7j]nlY;!B!
    l3䕕Ƽ'IyV_FV:d} "Sخ"Vx,B!B|5rrniFYd%|z{vZ#rVɛa:['.ugI8:Xc#F/t1.8xue1H.zHj_fZ2Ӱ~;d`09#&.)2u+Nr]CC	'5tf->	DI
    8珗<z3y ?%J	C͊a^(B6ZI/@m*�<|̏M^6ݖ$7琇r̗+~dvl`
    M%XaaLE@X͸@F�T`Y9`:OqM2BW\RQX_!cb`
    :=lNk]4\O)TW)Qek-`kSn'd*AH,0wV)}Xv.ڔZhI5K#DSdHܷ+Dcy9F7QlRcs2*)#4<m%i"6mb;[
    lxf`A1*E<K
    '7-Mx60..4{o$@[d
    2LhMA0Ih=0KH|iظ(x&nju$0q9#"S쫳zȬj|L	f@ qr1Nf"t7
    h%pׯV??.梽{Y۶ul\l5�JČl?'!]V	q�?9}z=8}??���_^�q~_I;=L]1G}<<81qqe_^8}}ѭ+fVٺvRR{VHUź3DŽb@<k;k+nֿ[[1~[AԝNN狚Ğ˃K6֧n9Y;٪"wS.=뼛
    r.	8VV\ژw<fLՑ^ZF?wdzp+\yI,--lAl=Rk"ѝQƙY@�x(ʋU$it!d>ܖT$g|c;Ϸ!j4I}k߶Wb
    U=,)^b�XOz0+8v5uOH/[^
    	"2:̫ӡ,o>h4nکuo^wZ[[Uo>/=:3gJ	$HOzU]mĺ<}̻K.(�W{{7Eݔq{Vtg풑ʮ@P:Zf{]yغˬfYT?ڬLa<M\]fBs]Rھd+/;/sn*mzK@]J">q:ay`fJ	k0+	ĘW5>;ZQu;6Mqͫz]bw5֍:Sm)0uCOiP
    :Gas]`&M^_Akʢb�~G<~<օjDZRng<ۥ빭=Z1{9p7$4'j\SN'@ܖiW8՜".gnj3b\T]ѽ47`mFvl5dtdTˆ¤FooWb=sK@VB.a>7o_c͠e׎Y7*W[:pۨts9}Љkޡ)ە!ƃҧ["@\zru5/x�ؼ,贫v9hnݩd7my`@B?^Y%__+:"]D1E	v~^v^ͱmX0bXH"HVyoX,[ʢkCɌtLE
    BcڇdUtB-(gdy{,Yq<tm-yO(p1Asůh]<8/}	$}:Ϊ`>'Nt:NJ'`VWifXf�7AII.ۅzXN$$(QcL]`L(g9$9uFC*J0v
    dWO
    Hu̎{wԠ~>h*6Tb@0gWB0l8+pus72;vXqZ|4Zk,	/V2)ZA*ʵyRE
    4UAƭ6.٩ګ8pG�6n|`�ßVڗ.ݻ*kiVgenMc;ddz{z"'~X;4lc'jolE5v%y}d"ؔVU�ȨsD:e!.eQ[uz<G�+jJ@a{*#
    |kTu4`}xL]06T}aWEPTB/3V]ZL6\h1ZumwV$E1V4</)+X">E:
    QPXk:;	6QX6Glpiz%?ӏ=8zq"FWU֌ɷut1znp2rdU2[3.`
    AM`C5|p{6mm7W؃W0zף<h]e9NGjoʽO:Nq]mQ+�z٢&XgOSm<ZH
    z
    |a88>g|IBz\~濥y�?��1:vҪn,):�/xaos*ݧ>xX6PW1+FA0c9MQϧ)myxS~o*hV?Hӧ?M�,/mn$;L=�hMobZzM
    ψ54M.)Eȯ!COHw_ln.y@zWGX+Xą4Ѹ1u]<F-ϳrEߥ<:&5d)󈧹ˍ@_
    C"Aj _
    ?pA1*Huڤztխ`�߫:Z:j
    _c/%$9/]He?Acr\%r$}@,K1�j!^"zRzPFT>Mc[o8<7T3b˾],ݱyvR@>ۡX�GXO;涮©,ӑBFy_]3',6WuWiQtڣs';)K0]9՟w-UTwIyom OᢣGol1ڜR|-#[,#qQ Ɣ7OUƯ>ٛ14~�s/խg^EuE,@׽ފD~$kIs_"%%ԑ^RЊ*|K_1j+znjuq#4>6h;!�+lGՃZe)X}ENz%C_j*Xo}8Wj߷3CAӭv�x,~ؠ$l1c
    ni�5{"@5=7>?oR:Ն6$hT~I-ߡЖUx~�u���.Ofqk3}Ϫ*Cj|ٯP^l
    <t)yYk.CԠi#N)+3{f>^CJCN՗b3C$\f@JUn	m1P\KћjJMȻ;ka&vHgfD&VUvAe+9-d1oJ^m묮3!s]K-\*bNUz
    HOݝpV7w5yRʲh	$uqkA/.%[+!+m1ZFSǕUR-Gq
    i-Q"R6fR#7Kzh@kNRt++Z17�2A؅
    }7_Q37anк-c#a�#Za^2E1`t�(ٯZen^m<>5=Co
    XcZEsa t%*~'WhܿQn"&%Nf=ȸdޢ,uՏT|C۬qhXD/NHUpq>@O߾OEQ$|MF~ٙ%y-<P*|֋Ө8{r@FGJG�f#gO9.LmJgE%hLҐK6 FLֹ.ЎTCS	<DtVW?-յ̩,(BcV^'Ŕ+\seHks(aVe_A,TebnF.3OncvcT,RV,LÈ8
    E|J	KT'Y&e%:_2^XCBm'%EH$|u%[!2LkJ(.(,v'쳶. ჳ7X/NJ	[U5=RCopsN*
    Y4c!5${䆀
    yؠFiޝ+]^Gs|u�gzE=a
    ȅxز,6wȏ*2JcW$!bTv鯮Pferkɶfy9$z(ꢕۻ>A�۠59Qh!2AźkoyA�b<E|wR^ۏ’/իlW_^l.V8}�Q>�#=?Kdx#F�O&[:ďݷS\?wvl~|uFڰ&"HWuwXBƄ7WHZ2ހBv+JX;�2	KMp']Nz��ݝ6nUVS#RJ=	$jLpvU5iP4.h92jO԰lXMq�ڐxе<i!5x\`E F^=5XU? Z2viXXk%A}G-tkJʠQFm%�nv>>:J# rGYqI"Cej4#q]+ܥY?�wkaf0xN悴WiZ_ޣ$2xr&m]{	gP:TMT;3	5Uc_K==^;r^
    74"TVH*vYkg#	�_Pqom2j<ͬ<9}k{}uy<,&]Sx*+Y^X[-8RR,,iJu|߹h,mrHQ@WQ.ott;z_=
    ʟbag	c]I9
    tu/$gnğ7.acuھ<AXJSJ>1TuG٬7d}@qq}w�LZdik["R%?j[kɐs%T=ʜtWI\ ou5khY%Q\9
    c͏HJ04P3ᶷ
    ,Ґ8T5nk M6{ߘԐ=VњIYQX'|mOVĤS%Y(K+b> Ե_ck+Ń\@(\OsIJ*ǝ$*̶ݜjjh`IZHg6�,ErV85295`Z^;q")aI-Y.eV[47\3h\'o.3%0]"_DAƢ;'/+81xYnI%`":8ʵ<+woKUf&Ib	0.$0�;!u6Q>A"o^^AW;�Mv?3HREPr|ZDNj]Pk|']
    M{|}n(,
    Up$,;h$6#p65J|ݽKkŗj%d$oG2IƏw=XrOW(	;,iHhZ=נ=u9<X.џu
    @Fn55sȨ2!H;TJ3H�"EkKujjݫOT~5մ6YF53LM*ch)s)4D7j6
    O.cH-%s�J1FSJ-*ڃZYeFoJ&,zA:;Vj˂ZZWc@,f"j9o7H/,--l1#O9zTkh91^RL=c)Wz{jXi{g�$wIr{23RIAדpbڹg*`fhfdaъ<n?5vQp̦91[cviR)G")']׋[b0عv(r4VA*B~3_լw#w$q?ƓE"q,1b`\Ely%AE a�*~ZbrY[	KJQwAB@;=-U2Q,Qj*]2WVXLbƭ0DPdps?'kvb"ױܿ:REa~B)VH_%9CRv[3fQHW]'ywoubm#}iDG
    P\i8*EP1]&
    t6<֢[s^xFGrJ\'D{=!q3^*4sN dlb(#,z/+8AWI5)T-j:Qռ&+DY
    K :v4ՕܶD	Y֧
    Ȥ<ƌeQT$_tV hEjZMN~(VK+eK(GO+O wf;Q3)գw*Ny[Z$E''\)WW7q8kkEAdZn1#F=%]|en[j	(o.KĞ_K?~4Һ0(EA_2}ڝk+8..Hq~j&"2w}Ş3<ep1ZPTҕ,!	#.Eq*R֚%xGF)Gd%K)�Ԥ_{blf%cVH=V�f*,ge2(,TL
    X@7$k{O3<|i5W4$J,unBd&h]Vc^1z<cMC@u_}$.!FW,qEf:l]sPK+YbĞD=H䴭ccI{u_5s4[\5-iu'[1܆hvuo(#Șњw$"Xԝ[Èp$x@G(j,o^,׏P
    xTOқK#̰5r5p`7jEz�GΉmI<j|Oi|<5mnՒ$�
    	`D5Y.XԵd4r)jیA>{/j8F}6Kw2HN%V.Ң)2҂ٴ؂uڢ͝Ez( bq}H%Ws#fM֔'�!]י3ovRFx,tp\ib<lY^<eRzUYd&
    8FzP~"Mn"x(֗Uȍ7Pe64=lŌ\ƒ5_lK4I
    9$ʐFqݐ]o
    x~򏛸v&R0+<b%~Dy{QmFIeYٍ-`쎁II
    hmG˫f>j4I>ى*$]w6-D6ؔlZK}Քwu#3HQKnads2MO}o-6P~^4B?!.Ǵgdeo9, HqidaBIKBTk7}�|t6ɐ[.Ў[dwk/#TQhc$2$8ªU%%iR}D3umizoar	,�>W6n$ZYlM]Eoe"_TcViBti*q_H  n)*)C]_�nbS
    xAuo-IA>,ƻq
    #+MM17sġ�ƣ4<E|CtK';v>@a]ǧcTA(@e25Ie1"F>YUdEPX{+k8ȱJ(S^jK#Jyפ_I*5:Ȓ1tMV/i=J+E*|9ßsZr^\kiJZ�2>RUy$!R(H��Iܚw'=tAa
    D\E�9��c~:+f+"	mrUאbը!kQ+m_H�o:1㌸j,hj=G%Aʝi^M%>F_’�[QK6%%k^5Nk-!~BR:О2
    *=5"3+ԴvM4$T3YK:�7	L>[YȂS}QZeKɎNrle!KꯇMl<.B~RTZ»4+VW(&`-]Sb!ԐV7
     V*E)ZW"7?Zt7zPZ֝*I@$ю|I4
    T>Aڞ[)o�%6V<`yjFTAZw=i0W:r8NKR�
    ҧ
    ]=!̶TuY%ڴ@-;m}fŠ
    N�#Z~+rFMPiw6<�g[qK)dn6V�/v-ƣWa7�JY/؜>ӱ[YKndVݧVIq!*%9V7/a%c{iQ)R6Q�ՏzvncIl'ȃ8evD}rƈ>CƠ7|'FF\!WK.B
    YN[eyBdEϓf.KHS_Y\pnE[a2[y8++ɀCʅE|u\�H.&LSXMWks-QMuطiaW?n"&Ye]bcIgi6ߕc1нFNd4:
    ܚNò$Ō8.Q#;w(ƫ<hfA HcX͒y*h"XC-DW{1�[[nd9~R[&b+xcVgƣY+t
    ^	L\ȶV3_[
    g3R	$0M6sm#IܘrJ/{ϴrqcakcdmld.\q"',϶0$/lK�n]#DnxĂňH\Pm5{K)H3?p?Rs@9*nUCYV"5`2ŵ24WE=ʐ)QAFW6qf/ O&
    @'MCkqVDyrO$FoDE#(#	9	
    #olK,d2T"YʙY,�G5>^b
    B
    j[b*LF	(|AOP׉rVT庘S٫e*$#aOKw4ah ݛsI[n$Қ"Ӿ3�mMH}KFkE~'
    Ҕ#Mh?VTx�'s`dl_w<kme 2M@4;
    @ڇiRYl$[¯%Ư*4f0"ASY[0$2*FUFy	wV@[\wl7vu01#I(TbKLdh$]NxHG*mE[mwD%I-kxDH' =�m2rBX[9?"SVLVh0[@Enc?#&ͯs_bnOnMi-n=v̬a'PGGQPkNy[ۭjM`by;3N{yr}@NP/,;n#^L
    ^w3}-QfH&1<M,>@ej-+!]ήSd4,*3Fv
    +͎A^|ĩIqG02]j,wrOq"-5]N{nݻqŠ�v]ɛ,'k[3 EiL/"jJ	#UCzM蕂c#_O^2"k&[HBdKTjVP'*31g
    R+5aLq	
    j)ű&MG#$׷LA7
    YذV"8ImX[w$XY[CH&(nlGv+H/#AN8|J'nM*>E<q1MW )FJ\!I)$iљT*^1RO#7U&N�@5
    <{osoLd,Xz0*T|XGO-=[l$x^ԯJ]uIɠSvgs&j<sdOxܶnčEia
    *P)ji,"J٧vU|B WoaT+
    U<�a{=P[.ܟهOujw+#D:	I%s']v[kuq&%!')QH܆E0gӅ4@$jF^ܞWe܊r]Wշ V1HM(x>:{KqM RR@ڀBC7lgovPVHGQPQsY1@$uDϡiỺYoc'BcxŢŠ{lzu~Kuo.S8+"Пk
    d�h!T-oҳ?ց@6k"ccpMnmvw^GK]Yn5Z3W`jw:(&!3!FsR|5ǦZ! 7`WQȊHCb@:�K'-v;omS�$IbOZIؼVIM8(#OoxAY`
    
    o&ksO&5�
    H'o{oo/K;j:l	:5m6~zMoW�u4[tZ�]u_��?��2Ԓ-]n,):�-
    	[uMyl*u
    iqh;K(yfܥwJ~l5zLޓYmy/#ouLOk#_/??=c4>=d<אqQO?ofZzQRܨ(�Fm~kދn!^1>VЪÕ`nhBn7#W$(xdPL7!+r dE}P:
    SXU@7Fzҵ>5uH ]I j@s6Pt܍Z߃PE+5o[WTWԫlkm"@Dh1QRM�ueVl2MJP!ŘSߦثsgyOLy9rT4<cBr]7jZvȠi`~#~H8�Gi!*F^36y4xnETPY˪%e_D0}96Ŗx[C㾚0f{QJh*zq>'c]2Wv%RIځ@`<݃�LxܽͼmyOaR@Yy3!UVv'ܰ)*>Wo=|anŗOfN꣦r?ƌg#a=߻$m�#Es࠙bdt]X)Eݍu?~83zkXƴ�	sS㫉	(�h&(@
    ᰆ֓y--Hu~cXd
    u�j.V�`NޒAR:2nbbj1&vp`"Z}s;4sO=O1EVh@c1BO>;,ܱYM�PSaQMy"'i>tSX}EWMkA[{Ctߧmw�Tlh1ʨi@�i}骖$f$J$8Xؠ07NecAʝK?שP|5,Q4R?]7EBy/Wi̦[rgp5Bjµխ|fqs$EH$?=c5Q|[B=m<YN)m6n[dy1(LKٽDt
    CNj퉦A4REHIR+G
    eDADTt@dTAA>}!{Kxƒ\M,0%Mq@uYn㲑6"c`QPI}}@{sJb
    ,ՈM~67FJ򕤷Q3 䱱}*cOز4,��2+צv6P6/q
    ٶ qcķzI +]_wq:g,|kmKX\7I@5~ɭF0z'ՁhY,?xE�@QUW
    b1YSCQcg<A;j68#"BWN{oAZxj,ETDl:WЏƁ$SU`g�A)܍:k128*pF#WO;olwsĂUK8E _ӹk[xeha:KrوAԟX@خD@ۖYJ!T(']oIw.vÖ1ӓDbzxKa	YXN+­>0VTőPkhu/5+F[X@XMu{`1ƾRňUyaJ$P\YEن�^fJeJcSey/\u[hcqaH}RX5ٽ൵M϶%xMݙc.WH^L7RV)"`l;Ke2�X(uRxS}}q\CX	n`Xጣ7P81/fdQ�ܖQ$8NκiݱD$eKڳO7e%_nXm�E_i˔G@Aj<
    ̿_@IeQO(5؆o�2�NC`�׫z6CZ+nA&>Du+xҺX8�BEEz5b-#SSʼnZVCjFjtڣY--r%9#
    +Q]A!2�[!)`@:xy]ǏAʋU_亾(j#	kDS_52) 
    An;7Ͽ]V;	(JG}}
    A,R(xzvI칵+3,Kg5b#P,{ol[FBH©ɁV\M(4rF]t*˸�NtlzɍeJHcTg߯"Aw>^[ءX Ɵ6aSJu[XPT"9*> Tuo�W%p1	"Q*GRH-{75ಋڃ q>zWzk+wv%s$|Z�):/�U['?~�M�Ʒ>PL%7`	=vvʦ"**:&n.T% *:S]$M aO[ij:G[㷹v
    !o1MyK a]f	e jeӐJ/{w(PS
    '+LTu.k=5cmO4=OY.9o6tAi_<UTY}ט`LGdb*+uI3sĨ2]
    qcc!-Vܯ\C
    [NA<M@X;<uXdSܖ*$я|=[6~b3һ I$�1+�zIUYCI$Qj+'zڿec
    X&5k(my(+gn�oE[4KЋ&Z#l0b5w*>ΆeIb㸔l[%	*ul;x۵k}w>\kMvG8]wmOJ^gth dM7{,V)uvimm򹐩+gcf%H=ka\^Moeo"T׉03r]]k7taFY"Ie Ku䱼`T2jw7,oqBflܓVI-@ci1"Ѣay{;t[""K"=̍N@,GԎʇB()B�}&75@|O[s�) 4ЄuF+N[q!hgHٝD@F6k!oi"s(bB{jކ�H>f8ĦݫO=e>ݜo!i^)ҕv=.9-d&c6܂O]܁E71Wђ9kݎ(jRIJU&xhupE�	^>L}9"7;&9/<'p1׏龻D7m%&OD'K^enc<mആFiF{ |)y][vz}b7]Z[Bʫ,3BõT2HQJ}GXc-G&!kWUS$l
    w?lO1sdF$(ʆ",AB禗,3\$qح\H:2I*{Ggxeb
    *ug6Oy{%C-ai6!D;))f㰶F)AogM=H;S:ז鹒dx$	l"C0-_IF=%vu<]4L$7^EM^^QELhZ`cnYcK+{{dfݙy&N&X%EnT
    Z&~1LdDV3CG:~n_|%@%r
    ^C9ewqu2W[9Yfʱ0!(˱9>o'[m}
    S돷No띕PHDP:'9T\cagy|۰tqC?^mgMT5P@<XJܪ+,ܤʦI,6A]^-xnqQVp椠^G"6#VWofJ/rV2H$ROOh6g;*�?#Q]=;Ԭ
    �nC,A u򦥒)4wڛ sб'Ң
    :Wcy&Nz"sթ!<ǕLӓOE- Smy.
    oM #bGFA-{hO7PVڵđо?(ԺZԑ%SJ7;a{w<'MrpF^*uE;N/‹&	J9W5YLLjeBֻR-4u0tW\z栒`Fw,fHZHH%Oʍ\V`50~:k'$PDBQ@5=�:.wNJJlB1		R6k\_vUmEZZd.J�ڐ[,R-E,
    *2f(ٸZPk,gY~C I"F<`NWٙHb5c>o x_nx~e!%ƈ)2]2[9-ې3W(
    T-T$[LnoR2ԤhFQc+Y-+ҵ�Vtӵ̮b
    v`TѶ@g$�@B>'o<xI2[TF	ZP׮m_gh
    ozAZSRƲXHN7r^70q'VVy[=I^rv	-*tEff],}+V׀+"X[b
    Oۨ%F�Ε?!.${s)BPхЅjSYq}۸ۥckHDM<h4r*%dH11M/>W[,5ͳ-/0uPRn]jl#yLɊG{JxEPoC.l7nO3O #bY㊼%IkM}VY1V?3-:8'з#2WG*6)U"Re.0+[+8%|M#0#Ҭ6r<t]}g{WvחY_D[dℎؤ0E|~86o<(OHıuO�wwped'8rwYf5ۍ:0^{YK6H$Y1!
    QbيGr'u34sM%pHX$b}
    G2�j15յ</O}‡Ԝ֚ZPzc<T񯚣u+}q5JMA:Tt5Aj
    ?Vt![-O@(z
    ڵ?9qGc_M#+תK1%
    cē^;$l)I,}
    ]ǧ]CV
    BT
    hvRI&'M?PUԴPϏP]W
    qݬ7_߱՘5MN!"B| ~$᫅Kq>(*+N|=':W*qMִRHr#4nEК敝�I4oxig,IAI&Gjy[EPѱDJFT-(ASJk殮o[3mI;xo;$V#zI'VI5Zt6]cgo,Ih!s+FI]tٮ]y:^c&OM�ښn;J=At=<(\!aJSA %@e}F9}KαIpŁ[Y`P7,7cjBt{hQC(jTq! Vv﩯/1Ʌ=Z7>-X(
    j
    I7q ^2
    %bOE<@*~4oצ6>&iQ־Z_d3Scv	RZI ޶ł+5SH=N(:[E<9-Ha0?bؖB,ڢ9Cm$tX-taoϖH?}E%I)&7)m]<(߱iXsoKpDVպl6(z/n@~c#q}u看kHϞGcq{8Yș#,�^2X|K0[α3m1,,EjKK{w&ly$XqC{;}o౲rX.r=G${k[+H}֙(;@l6^ᑠIxQ۪O;bxƤ`c0x	=''RȢx8֦X^W-l$TZ3{CV]]Io.JwhVn$r[	T%휄aY	b6S4*JZ/5}Y?!=d\Z7XN<mb2ri73I![m.fzp(ZXF;~~۵ۑ.@?(eM5)ҕ�?uxKVhYKgfK_`%5HPeq=.ڞI4<PԧE+Hv]s>,ƚotD4k9iY
    MEo[lf%ngq"_CHV-ƀFyԓok�Σ\?ʀx̖hHGިY/p1H& Y\?]s<GV2*U`2Kcf�T:;PsQԼ\q*&d�mCu)G5dD종=A�/d[81FA#+/!vԷNтMǁsaXx-ƒăjgߤAje$6O|4rǓkB03tAV>-\N6[kE5K!y-?W^)B? QZB?>dk�VٿV0#\^}jTdBʼnf<jISe,0ue^(JH3 @&1)vJ"Gv,`\JLe/VgTO[PT{#ܝ>G'hEmrq}}$-գK=LrlY(/QZFQVՎ/rv<Y|sZ[-W6+A)) wկxbC^-ζjܐ~%W9𢡊F/uqq{k-P	@Ouv9[[;,w6)U`%bc;'kOysp22ypUET�
    }5/kNڊvv}En4Go;/)6QIr#yKl,S{eʂӕu/2zC.`&P҄O8<.k͌P3r`X�<R#(Jj1=KIr]m6h"+8~e%qXԒIu5؛^նMrӵ+ˋGc!f/Pj{۳olRHKRLÚŠW*9eѪ@r[XD֤HVm@R[XBOHSv,!1dYmnRvk3Σr䐭DJ[VPAw#XX亸4ypOre<2;=O#1Hoq92|8}@rib{~ƄRP>:1U*w,rDUH2�@?<4n2L(^ex2I
    M{!"#Z @uqKih?G<֡$n_y*݈FT�@=J$BJ~çe �<jmi[QNH">fFOVV9LN7%ӟ݋τS
    8+OxcgH$XW6JP�Lؙg\my"
    ӈM^\fHDaQgs@SSҢjGI}rJ^D7a=⚒| %¼!7GO5'Mon	/Lj_t6 z75upq=g!TPCSZZPǗAcs(cQZ1FjxnDQU׆UF-xo"ǷqMsrqO!ׯZܤhO'k_/
    	=՞SA#Ptua+np=GC~\0_=ףX\IY]l@ohVؤIՅ[d<880IeHx
    EjKu%,N߶[ǵL�I$|$6/4NC_VWsOt5ʃ!ƮT�hɗ̑]ɭ
    EjOO/ӡ5o;1J}Xl#GWTosW_ׯW_kO
    mOա^�?���?~?</�Zξ2duhʉ2:;qJxSO@O�ӏ7	-MK#TnUȟ[>D_Xh+!KA4s\T_�CK]d;$kprQYVmS^Zb[
    ok>Ӭrc=͚zAYgy2ZOtj=�ȞS	
    q"��zc?}~W"�W/&GCkc4�,dg抟_oW=iOga]V_Rïٺ8a@Sh$Ij3Lrǣku.'i1)ggQ/�{8JUNc
    SQb)އ?1+@7pwQ=U}\Y׀E^Zh
    z[d!il!mKQ^S܈)鞵i,gSQ`VX@+6.s М_QZ	U*]t}<LS8~#8/HbLs5f4#A?GyѮj*/=XTV6m~~ݎW(,z1]75QZHSdi?h9hΎjH\orzj+f3ċ'i9}?++KKz|dYA1ZÝȎTc/MY[;B=k ȨHU›k&Tww?%Dն3,Qeh!#%ֆ`ȱ@s'ȔDO;̭u["g^c2OI2<Ӑp€ef{?`&<aH#cV:4֏)3ϥ!ÃAcH.-gڒ,#|՚.5cw-]{3R⭽&o	0Bz9`8<yF?t=	wh(dicǕm
    Ls8
    &$=WV߹l\Ζǭu5wNzIJXDLX\Fg]u9<O`::[SiP:y=啍l8f5Eb+pӟۜ*;\T?c1,$I+%(/g	Qgp	7岩Cs-D"?XHM~R{{+ʪ]3q`B'KJ3Ě8^x5QZG5Ȩr*rf]Zo2'E?!>ވ?~N5֊$kH2ND7q�9_�/> Nh*ٯR	G(!@Tl+;KXCXTVSmx3#bDE!)351iEmaV	(Y9 ìmhiVlCf_%FD0Ԅ-ZKL\BPYO[=$I8\�5�"Hs|,h+ĸh!!#Xk9TTwzѺwRXl@95�DzV;'5^<͍ZkQֻ~UO6Ĩ2Nza	pHЫ#
    <Oj)X+r}	ήPLtk419qV+lFlj4r1IhLOǖ'H'F*_TuWpz4*T*|Sc\"(0r*5}zc<y
    ȩ~w��__XJV\aX+S&fkQ==f5b=IJ*)kքjP1'j:0R"~Ih;*ױWݤIG§t"#di{y
    Yfβ"Kӧj"L{:1*̱?XКe_ߧ=٘7dlq٤-TU@)k:	NV@q깘+	IR6P-l6(?׉�{zd6[>uVӔhOu^|B)7CVCuy[픪M]ea	Y`'؁kneK,vm]>
    ,
    Zy]~]RMa9bmT̘6q_7x§Nsgg^ǸII2m<@R<:;'p%Eh6V2MumΑ/bQŻ^BPLb.1ѢkJ͖sT<eEB}~[bydIhb=ƩSYY!,mڷҎi76=e<D\/ňrqGX[Q0*bȦh#'Im@Y]kFv9NXtU{ЄTkeJrϊ}B
    e|gu-%*\+:Ƣ=xVD}2A<Ma8u6r5Gh=誾A�u�T
    .Z8a|!Vz1ֵrC%9F9F>VJrWn=~i[Aޏ @zxǟ2Gy;s
    >&2#W͎֫=U.EO4@S֒qBLw\ow9yTO]2	c浮s%:9<U{ŷA&̓<mtL>W~dr	zso^ge+ Ud3
    д/
    ;NNDkV&Y	TkZ^\IϯQV/-#ZsQ;�be�zo,u̞z;檰=C؊,ӈ΅1rx}N!=ӿUmxcQ[)%4kS9\YM#f}4Sag_KkdQI@7XWza+9dv
    m|G%#C6-/=#[oma'wItY}=m&\ :aUQʮU,+aoiN2\dfږ_:\
    L?0>s~nJ5:O2Җpg,u?	`s!O/j
    m_e$;h5Gכdfs#ĈRb9NyTXnz&UTCsǒKi"
    TjvGڥ#H5Ư<#_g]ݽFtg=,-p՟rƸoB'f
    *-v	Bh՛GqMT�V6fSQz ]>_J琼1w뵿m){&òlv
    -}[o!WVn1WΈ[hW>e(K9X7Pd{wYio?yU֖Kyd6ʊ{$|O_&D؋5.lYz]dT%A qq C֡n%ݨZ~WE7?nZdX<5w3eJ5T渲Fsܟ}T}�QY~dOtlz-̈́-f5Q(¼in03ǓOwI}dV�S! y5%k6Ȏr51L#Q7q;gZtjbyoҀHO%XmP|)~(Wp/>K"9Wx>;xTDž+q[nw*H/]"?=T5G/<>"V*ߧJ|68Q<Q8UDE>D8&7( e{<-s�nV*,E;yRJ3YllOB/֣ӞU�2)y6ZDkcՎs}>wFb\kK뮬uC30
    E=h,fUYDgɝX<y}eyrm'L'jiYUyz򼯿랳g\E]z/{2wdn{FF#}$TYx$F9V
    Dks\ESѬmz[Hdӡ
    N|Ɇ^Wu<M%'a6SVLK+/SX ףZªz>:ҋG$972_`	"A9lvQƼ5=ElC-!Mms	O{HxF=QZo
    ֪Xt6Φ(fkF*{rDTQ}zc72lIc-/)L	8̨{{']X`S72k%OL#ײiA&-Y3c#m{/iG"'<9Fj"!8Oo_ݽoִ%7Ne~:;WI_a*1&Rz*^Pe+YNV4AF[C�n_խauoQm#"A+s\S#dU1
    'rQZload,HGEK#Tʫ˘{�]}wyCGLqAFdɥp8r(Ǣ<}KVC4ؐ5{Zֹhڈ+ە^"7fu6}v
    	>39'NDE}gɣ
    fS=Q*:m{Qj2Fsxj=yzܮ))u~ &sL;;HUU08VvW>辠m7X֧E;O*dD`S�SW]:,?l*9r:t⩡0R6eY¼UV5|]K;1iwWVb^
    #_�
    6)'!LTwo(Y דOʔ#Ō799RXmeLAں4S_$TU<xPEϲQ]/{g7͋"/ྲQM<˺Qt^ֻ|(0ARLUc}1[ì%lWYys*O&k/9Z6늤vn$^"f)C"	c̴j;G
    ޸
    &YV,YE}G(o#=X6inR#}t_QYnA25%|Tב"{ܬW+q4;z~-}=j~HL[sw65|VAeUV6D~.1UQqv=(Ւsךg_SyE
    ej*Ft--C<3ԑ r*1Sr<Զ^ޢV=,/QKkfW
    bkNÂYrB1HV}@_VW.Ǝ;Za2|X%ð+厾3\"'ӟʊgm];~56PNHDIU
    NHwvMޏaKK_7;A]m+{rԧM`	F#ק
    ν;(ޞu=E,\'ȵZh_p'+A5z'[_Ukm{4:߰7uh)bM-M{F/hsY".4v|vg?O'Wzks']sh@{߸NIqwKBR\ϏEXlFa\D�U=D~K~VBWg6Xռ$zG;:ZDcؾ:Yٗvg!bfc<@dv7UzJӴm3W}˥�mGT)&FՓDc\ꈾW=A*5P8UW!ʎ,SA~7WƵYX)زFCBNr{"/P:ζ9iX<NǬ�pSWֈ/si䯊rTU1*rQا-dv.nxOiOdnȷU[]a%[=ZTZ1%`ڪS1{Waj:6*J;_CHP|x=Wb2´J|\%&|.'2[?ZEkTylaQNvF$S`ˍ[|4:kQB!q-UsנЌ䊞*w(?nO=Qǧbq(Lw-vn5ڢcaqyʨޱ=>QF{ݗ%þc]]ء4LD{=g M5.-Fm\ESBbIQLXjGzI!Ucv7ό2/׭WrM_duCy4JM;_\TUH(
    I#XC$es9S]=մYnuW\Zp6ƾ=h!承NºnKM[vkTB~a[K=A4yХF\A#էot>IquV3M941"F,X#iWlr3ѻk3_f]_Qyī.{EiQo9pImx&	Ī"DO]Kؑ?9d+hlUQN<sg*#!G0hΜɍV;OkVHGX>i+R@@h`Wp[7^tMK
    굳i YLrhV˜)Axr#Q5(I-|1¹voc_
    qAMKkx9=:w1{{H8׃;U[H׾\聤,6Tc&5?KVuW\s[CQ>2|}b5V8VKW\\!#f`t`œ"'leG/VVV֊dwI:%sֹ[Wgk*{BL2TbY>�粒%P%r9[FI$7;A`{</ff'w]VKPGD+'BaE0[شRO3v%-rm]yb:Mb5uO08؝DSYjbclʑV}	U|>=m[%U~?W>DeM()jbKFQfI>""jQ8{>O20b{vӯcI0\HQG=	9<]#QJ9p
    d>]u{3'^Ӫo59GWrGXTݰ'cfm6$9]^׼U/i]
    f@Шk#CyEi y
    �Ouw4EqnA5)jrǬ~.`"fv8+'5(@6NDsQG%O#F7+|hfs°/Sdg>xZYXRx,8<*>Bz6mV$gõ
    VH75z#-sUQQS�:$ES1AOvދ!
    ZST&�u$€/z7fNu)wϜǑ{�-Z1Ĭð'1t΄V+?7<{5^`h F:s#5|1D'R185sW%]6'ؓÒ$~n﫪ĬlvFWzKmwYg3!..)4Xc62{|Zʪ'}GJşoړ$vFRxChx,f*{6DiKTK{G5"#`Kc_Z5xpde}S(r7VWV2al4q%	bWz	EȎvҨ̝e[P[*jKYlz>An{]5WJM7Ct]Lz\\رi<Z9"%XBlv"*lRYX]q(p+!^Q$a6֕Y*m9~_v\hkvNtaH;-�[z[|;F4E
    "h)&(DTRq:1|d5<|㄃cTljJeΪ].ގ1?aF8-&Eas\	G{`✎߈d
    
    UUF'<z1bTƙ`c/H9^\usD==>%g?w(^r'>ꦫGmhzpϾ(m0m
    ey2
    24U*63<Uqn/1x631{<(.|j"O=yWty9QrM__"%Ln*q:KZAX,IJI+`G=ՈU`QlbßQfDq_S%T	:ږoV+Y_
    EOʕ*o|޵죈E''\XɵQ#Oӑ8W^l@w
    41XOWG45p9ʈ<P4:Ed|;˜>ǐOt
    [0mF@UU痯D{Đ)6HCrDTW"�?I12Qm^iW^
    GQg0aGli[N'
    TNUyL
    {G{+R֑֩$[ݜʧ5HX΃2Hb/3=ci5޾Q6a͐
    kV<,k^"l=kme~(+f^춓.{{eo*Cw=tec΍z>~so4QVnK:GJ:{l`E0#;ǞmL&
    kYi3cFvzfHfJ:d˴rrMc2y=`n#Wwn脲tsWH#F=߶] g=)0)zXյR@w6JI2h;}mj�trz|@uwZkB7"rԼGdm:.Χ{8wm麚P<k%^k,?I2Q'\u.=vgٵy+
    XI?Ą+}ͩd-1
    �1ߥc֎{G~{˳@GIMfSnk
    BDդ#q2Uj<ӛ^*Tﰛ
    0)+&#Qj.ysv%/_ˍo(KY	"XͶ
    |R#P?t{]sqma22c%[evF3Z=v�Nik=lBGbD*VcI?4K@"1#!8EV5Eyo0W_h%0#rPB<D^=>wmm
    &<W4D155TYJ]	o#q5	o_I6K0D靍Rk}&SC3D{ߣ";f0|zg4L
    sUG!&(@W':_:+Jt:ȂWGsYn~q?̦wUZzD"˩!Zy1vbTDTN_\*q"Ǭ5cqa/e<s|0"
    ]lMW}h;jfP|'
    @SՐ`) ԭ5q[!VG�A-RO'o܁g		)_۞}'?N=NcEg^	q6ĆGH!_6|o}zpGq3�,yLy
    kW˗}<JzO#D92[UkՄڎ)p3dC΅s"+ʨϯy
    $x9:�ـ1r/UBCcq:XT0cHUWy7ek-P6Rp9nOZǣJJ5TR"Uı<*J nT
    kU}3%OO^aP`,ϹdC&Fq5>|yIt	$;X8RF*x{'<\S5~S\kZdja
    wW՗ae]ړ{Jxʨh:D;(B�!F{HvZSO={C$j/B-L	C'/Re$s#Ƌ D8/Q[vǯ={<n{HCRnm\LSVcywX؊yZ6VƗ%Y[:$><^I-U3@r:ryP2$nL`]&
    N)'G!S}9m1�v9//Z$11EPfҽ[`<	AC�
    X
    JI@9/F^QcjqNG<Ysa7k*>CDw$ `|hcT}X@iԦ9r WېzDvʪ<g9a*к@	|hDs^бlMnyq={e7'֧9OBa+<x/yqz1UE,zec>_Rn4I39|^;~IRRLQWdg
    ElL8xu@
    Z_&1gO7no)G4/-I$_l@'7aU(<'�'cpG]s԰e9�
    x+|f܉^SS7wu-%Fez4K)yZ+2�6jRʇ$rxGPs}f;g;uflr5y15{LHbrqeEQxnKCWaSiY"-hj'H"1⌃C;̍7\crz^>ܤ#=[[%ʽ*,ɞl (Drևg^]rbrm\M&m+f%Q$!Ӑj=yw^]0{Σ/*aOYg|M@Q]Un.Z]u\i:YbYh1BwpEs
    ]ZFRa17`k\j;pxl\"KdT{M4Mo=ڝI3:w:kvf�>!G*X9:|UEjlHVPf\6BJ[(UX}bFt8ϱqP,k::`]
    l̑H'i;kgiC_T+=<C$Y25*
    q#*6KhH{'B8k4ЂUs/Ym
    $2q|bsٍki+whr4V7k4EGez[:
    "=Y_dzDڛUqY>\ˮ=oC%%>LtSbWN3/OA4cȮwLNYݓ8{8ji|͊�E=YFUKf
    o_q
    {.8IG=~a gF]ә821I[կɅV:Lx{GE9eWqH	#rY2֟rM:km
    䳌"ǰknT~D()ՋлU繆Z=	&,G9&jOQL+jZ9-}|uge_Ɋ2eed`;2Ioqz
    ƓRZ̄quwV.gJzQRX6®H+W.RfJ]ijz/&zp�WM"'sʍ,GU\vV2|k9DYn,_籷ml'VsA3/-#cc/*j|)]]<LRxޞ^ȉ˟K02ע"8a+2{ާS	ɴO>BDqOСG�֣޼rD�ߏ9�&#|N^mtqr}}dZ߫[-udaF&|#c}WLֿ}s-0$`e#εz1bXYtM+@)
    ׹;=-Ծmc:oB5|o|~ccG*15.北,%ֿdR2^c3nʻ,bj$T0LGtRȭcsZ
    ,r626K:03F	>3pcSi}3]sNJ
    jhE_wp][pZVFP,ںxI6=Fr=BZTargN8M}Z9~Q,vɕmiOgX}M~_8mX:,<C*\Y1[R&\TiQ_Y;xjDub.J,9af�z9W*tv#.e3!'Fq/Q}Zus0TȹSd<kbUJ=N¢e}-G	#A"*ۻ*].LƲK|ZAʒͰ@`ːYeR4N\|փ?T=MZU4
    ~m<swZzliETdq$V
    z?XaʿBʡc?ZSh%+#SL>kD`uز󅪯w
    cOuqz93q?DeG~=c5W9d<lJ7C%TcEs7k+,{	7!*S54+܍|)HF$
    8 i%Ãkir@z6o"X1X$F*8#>\ce@6r+[3wm<!ȲHEV.W9Hl%ךdge&]P$)Hܖ*GW5b0C|T)
    k\d!msR%o<'>Ҡ{NK:YdWޚEqaMOi( AETTW36S# : ;x[cd�)�%tG9>?e5`쪦j9	c^ۚ2xʣ}KGߕ͋o">gkYb%Mxq$7r<}HbTvt1PLiNR3N>G9yS48ҷyV5e/=#U%8Q>EK
    lVVY6?:kxVu^	O5F
    b{T?)�i(76@Fv+\׌Q}&4Qf WYKxQQ~Q${{5C~\';?ZceqSAt:49#yR$1Fp6y~e
    TMeUD\L4ֺl㰰�^G**rؚv~:Nmx<_,˫�?M+xDQQOǝd0^R<#qբ}ul~ZI6\I)jl]nֱ$
    tY\:1x۱{HTA[YҮf¥Y&5F+iT/&9+[»D
    ̽&qu'@TJgq9U.4Iж�YTpۼ2 nlRĈŕ¡>3#A9TG}%ȡȉmK�_/4IT0h`	 sj*>%}X-kIO{#|^ڱHj¿F9^KQf+L",Y9KͫKk"o%^!2z.U [=qQF-2r9$V9hJ"Ń2@ӖUkF+
    c1,lF
    !={#y&,ֵ֢{)zD'��E,eO+Uisus. 3CG)jpy4}o+?
    Ŷ1Gw4MQGɆkfܐqJŔbؠbBƣo0e$?<1ViDq'-ⒶS>/�n%QlArܫ3@TĄϝM_i-cS U1ʽ|SHΣ]{#(#)GǙ7Ay=dI#ǷUsu	7v:+!5F7 '8z[LʺaG^�5D:ZW~f'v.»OŇ$eHߞ<i*EUgNG:t[IfUq4I%	5:9=y(t"HUƣYª}Q?^=5<8TNȟ8={7|}�z"~O?~??\<s?>s��nsۏs/ǿx~^?q{x=~_?y^=78<Ƿ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/images/logos/lblogo-200.jpg��������������������������0000644�0001750�0001750�00000050612�12136042147�026140� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������JFIF��H�H��BExif��MM�*�����������������������\�������d(��������������l�������������H������H����C�		
    
     $.' ",#(7),01444'9=82<.342�C			
    
    2!!22222222222222222222222222222222222222222222222222��U�!������������	
    ����}�!1AQa"q2#BR$3br	
    %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz��������	
    ���w�!1AQaq"2B	#3Rbr
    $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz���?�(�
    (�
    (�=+NcoˋsA%=cR$T(Q@�Q@�Q@�Q@�WK9t_X2ڐ
    ?:ENKusb&_l	E*Sjo5?+xԋIse8|	?(IVXQ@zako\7n~oX!V>uSo�ۂ_k3f;k_M,`dQF)xՍv1"N֥qSoVpjS{MXlE6;UAyu-i*Hc|͂zUJXj4~۹z^B
    
    U#AMN*K88Iu V5<(CEa�QKPdEs2\5c2@άͩg,rJ)SOpFG^]l[+bF&v^&%RU{f7oֺG}Ci~V4m'9.[IRQUC#0fPwTeG)=9L%')v)hȻʌՠ}9Ej{V1O�JOJ@K2r0O\6%��ܑGg3GLb_�Q*Y Sጀv?J+_?E?:SR,mj_ϭdvדke}Rn݆qڢ~ڤ.WW'cNvj:jji\&'͓sA2	VْK9%k`YExNߖƞpsU}Q1FHJ/.OIf^E1W-*ER	w
    ru+Nl堗VVvjha+)92)\Ȇ3B}QЊTc|H֛KQmu/-W1clյ}7Mn؃5iAI5J*M|�{KxAMf#@ȷqX%c$'"]d<VMRXo>rXiBxyfkN3-ΨR׶{^[j[=Đ4.	*ѭ.LO\^SkC,rK	Tm=,u8IEir3Z!Z/i~\zd\f6Kv=8QqmRItKMw?lmщdS
    rxB*8(Ż*ݭ$X?̭֛gڦ'Ud, JM4n4fW뮿inc[�8⭍.5KEELh^#JP?j=;-O9}7޵
    >)I (w=p=cc]>T7kJn=?Sr}26ΏrKr9ʲtZEV/~=~^,?mk1|2rZ3Y6ZjɀXJLeUJǤX]۽EgW#e(|`۔$+3T15-zP!iHpO3X׶\:a#4ႯS:*�wa^Y%'m,Mљ26GA%_YW(Xy8j%)zkgqPmKf/-e謑/v9'MT[e˷p<@>^猁Y%M?ռ=Ik^fsh.8S2XqYFSm0@C<llⴭ+J^�^TycxQK[[%#R	<g�qP_<S@ev+*`/$zpsl_oBkR
    J{Ʋy.&2
    d8$>F`X1\՛Ngf+mO8d}:zʹ	#{7G=7}VC<j!pr'9bQos;,BO.2^S9?jI${j1[1
    'ݻ?J=>MZH%GO:z]4袤ltW˓ӱ,5UHߩѪF[V.M=]U=L.B<QPMc` زbB2p3sOYLi!IaW8zV+hnK+AUx#�~XCukiı,Y[zQ,S]܋sY_{WkQ9`zv@ ޲+l$MH<P@bNsku)s5��9k7)O_B@%Ŭ̲)<G<tǾk֑'b;ڸ-6=Qtj=2^
    3;ӏj,h zm=$	a)`?!>[YF9u	>ejir<'N6�gBNdu.O"`+#�.n7Xuwa-[w;h{-ܹ$m$)}gkzTmʬ7�{$}G]
    
    <]q=j;k2kpҺo'?aMNjBKm9F#
    vɦ$["Jer{y<<!ImFu1u:?fwX##!N;=jTr?G!x\rRsK3[25u{]	2.HbU5}UxRZ'.gDy:g9Ko0u+'P=R�u)#hg"g}	ŦlU⃔0;WOZؼ1tٵm-C[^F[V@?S0X5FܖH6#%*;)Z,l <줿|cTj$A#̉W*'}S5=$(T@:ZRwʟseקgHnJ\$c>Zy�[N3ͦ_+ˀpĖ'=+MlNԧ/U-1CNsNX"-Hܣ{:mZ4N�%ʭ8T_5V=<PNzNqQˤQ#&h* \zZ_ZQq,rbMaܞ)yRL-0.͌|7Ws^Eק^g{6^Q"*#^~jEr)7u3VLDȥ,J	1\#ʣ"F@;ddpMq%꡾FRɮE
    CDZ�
    S%upՐA<V>H7δ>ُؐFuOs+sHӬ徕g!cm\WQڡ@*s{
    ݓR�:j:qK,���jZ�(
    \
    :ƚRJp?O.3\?8kєe)F[qpQڿë́N<Y}Tz/ֱ=6׌ٔ5yc
    FqhXnkp̀eL`c۽uR]e+cy%wRK{{<ow$}ߑkj%c�ҷ�[Z|ͺi?!ɫ)ITT5OHB \WKgh)�Q@�Q@9͢ұ-kOR5ӟČF$To\�zоql5+	It3XJKb-vя
    \KhA[Fѧ|(cQO�QrQ@�vPhotoshop 3.0�8BIM������H�����H����8BIM
    ��������8BIM��������8BIM�����	���������8BIM
    �������8BIM'�����
    ��������8BIM�����H�/ff��lff�������/ff���������2����Z���������5����-��������8BIM�����p����������������8BIM����������@��@����8BIM���������8BIM�����m��������������������l�b�l�o�g�o���������������������������������������������������������������������8BIM������8BIM��������8BIM����������p���<��P��N�����JFIF��H�H���Adobe�d�����			
    
    
    
    ��<�p"���?����������	
    ���������	
    �3�!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw�5�!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw���?�TG~˼}�԰Yo1h?gM2HmJ	@w6RU԰ʬ7ͿqSYaDL�aZpqn�S;R54W�tI+)}qcƟs""PA)4;Cik/Xr{r"{E%¡c}GYcıUe7cQ�sC\w7^XǵEe�<RYxDo[]'u}Vj?v5\\zp[\`3(7}�{zEnjh>\?4�Pc&㤨a1Q7%@�pIc_�k-.s1Y{ܰ#~>c|3㜸bufI$eKKOQvl!#)Z]5;5^qYꆆv5nд1�ٲwHʩ}f�ּg#28`Ȏ+z5Lkf+:SWh!RZڿV=s,]nP0vo9۾vn)k4klu?=FzOw~z3
    P@f;׵~DDAQO"x#3W.MΫ-QvrIJ8M;nc�nCgRCE?F3TŞ?ws�Jf
    %;Gls[�H;hŭᾭ!-%�c,
    B>^.&�VI_kuW'�_dDvϥTfV.Ev?'$:^/q"ϣfUnm~k`ewӎ!9ӣ}ofYK;c\Eu8MI7QDLJ}D	_L)zet2)n6K@}Θ!qFEe:׾̆[[V�QO'^`m|Qٹ�?λ,.q`sGc6=Bgt:Y3WV x`xore+ӭtC+V5V,07G%[�[UfnvRv@sᵻhyou!x4>_�XcC]^e{Z+kI')'v:}�KcVde&F׿{(l+),c^ pG
    Sz[A{oʮp4??:!K,p!oݻcO,`bh$EtVMtc>vYcƴ$�8g�tLѺW I5w�Y�ޫk.l<{cppl~ճ'5Xn)ccdz|:6(g!%ǧ,Љr_f}�g\znNB+۱kkh{v{ߗҙslqYdmkc~/
    U[stg5ٷ]Oq2SQ<fJ~Yh>@Lf+l`,􍵷W_Y}Om[<4_A~W	&CI{=*b3!."jhVmڛ^($	7pgb8՟ҳ/<͹W/sv{e~JEʿyl\ih/a/`e7llm{+oE:Ňͩ649U&K,sڭfX
    7<IN�l":]Xmf<~}o?B�`tq66[dZc9u˄EdCCs'|7@q
    �ciqЉNsPo_3#: 0D]ssX9$cΰ;
    !!8|qw<|hHn;an?cP]0u	opsg]IE?f
    wx[,=<U|i:^m`6Z;_䢳Tڃ}kZ;hùGo#$}U/waӰ-:˜=ӱ}P$zL=M�$k>"^#Aq8n[:g*6˱n
    춧T�4G/>C|~~�V|==_Gys42qW�Ͽ0wvO?h�=/Ff{MXns^>n�mklnؘz~Fgj	}�59:Kq-NR׷{	p~#c[c?TևB#�gn5ODzRr(F<^x_N'Eq-~c-2)X>cֻYB5�g_8BIM!�����}�������A�d�o�b�e� �P�h�o�t�o�s�h�o�p� �E�l�e�m�e�n�t�s����A�d�o�b�e� �P�h�o�t�o�s�h�o�p� �E�l�e�m�e�n�t�s� �1�.�0�.�1����8BIM���������C�		
    
    
    
    	
    �C��k�"������������	
    ����}�!1AQa"q2#BR$3br	
    %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz��������	
    ���w�!1AQaq"2B	#3Rbr
    $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz���?�(�(�(�(�(�(�~ D ZH`yHW)sS83MŤyKhe4屸kK+ӫWڌL)Ʃ]Vr&ק#2�_˜A,/<>/[$S_5*Q|%:(>(4�QE�QE�QE�WU?z�O٨j>ֵMPaOܴ%8ܧ8;y~YG4�`p*a=ta(ۺZ_j+�6_.Kx+ᇆn
    il"զ >Nf$IVj<:gOk335]Y\ɂFU.
    �ج{/7Kk۟ܝo[j{ioks[>8E||S>kO�y"}G_̣)aU`ݪcUC:6O*+KyMyJ$EmD9ۿ#+
    ˟^SqMwٺ19,,y1­i6VR}owF[Gk?xC|N
    Ze[1Ԏ7f *?x:wuxwڔZmޑ.d"3#rRX
    S/e>TߖJDxck/i*n¹k-y>%~?.Xjm`<9! b9=k+u-j<;|5̰k
    N]H$U]F8-_S&`�yďml�-El>3**q_4�O>-e	xzzyIW2+FHeN+$nMyY0jΌRtx)+GTկyYøMjP	SKN.rѻ'{t~g<?l'O<8ש,Tԡ3Ctc
    }ri�skDN6+"RFUR3A/)9æk9gwI.k+
    lG|'ay;I4Off{:>	%YW8lW_ꔣ=/i}uDB+]6Zfg�T_++{f7%~"H(4|d#gQK_ 7a6º0`+=7L݃h7q<=b%߁gvw+OُKF	|G}BPl6`l_u~mM<wF.iBi'V_#1ڴ%Z|?M�ihm!Xuڈ%y>gXA4љuk~N*<ut#_Sľ)X,>g	<gzC oa^y?Zv;LzDBrv[E{,CXiE~LQ7ҏlk[s*Yw5B
    `>q;Aj!b5>2O[p"]=p}7/L6tMnp${ׁ.3(*mٞ$8R_F~z
    EJL21Wk<Ux7tu8�PNK8ߚP|H(�`}~ٖqN1UbetV2b>ֽ
    (>O�ŏ!�_�Iɻ@]P?+f�jn]PPиy<7]1qs\߳(t&lM�-dF
    pG8\WUbiԧZ4qtw_^cJ]!Nte6ԕMnչa%Ӻ8$>i'�Q%ĈeRT&qP<cgO༑mF-cfvF=GMv}3ℾ7yx1lYN-6ӐI9M}#MG_\mEK,u <k`o�mb'>Od>ϒܮissr_KSX̲ksUN7+v\Ky/V_#kjoip+!oV:4?<]|BtX�S0_nrk>4ZOúީGڎr'�LHPp8_AKxڞk[˸Msҹke9E*3shө
    1i;'5	_x_Use%U
    ԧ:nRM(ۛisEFyCc/nrOY@{d+f6"l1U<;q�uį;` R,m/d#3a=ok|D/^*MSupXީ2y�&q1{
    ؊ĭ�o}<;:]tvq22"}⋻p[!VtU]uRy{<mI[n%(U%Ate5gdqw٧i5|9>Yu2Yc
    P1X�px?]%aC5K4c&	
    %s}JZh
    gCKĖRӅ`r.=V"+]֧^xGm:.R&Wfy2sBc d㝞[bs5kGuu>HP8$w6-1̲6_Vs–)Ft56ĕ˧/[(<M&uZKq
    )DqT&Eb�^4M~ݽ6/*;#cʀrNq,{<=u[^?šV'sX%
    
    w**,�_�bMž&.iz̚b)K+B$eUX0z'iS ǎөs'Y87q|^W1SϿU)S|O*Q-'/?)26V&BT}c̋l2A7c#t*N
    V,?�/FY"=�u�W/kǿh%5|!�Al'2bȅ`2AGSF<7_Q7֦ž'v_.X�$|zWE\
    XR-z~<K?,uWZ;/<\a:oR%-&gvzWL֣voh8{.Va|SW�:;#tTI(X�1]U׊|)a=&>隤PJ_&FOGl>︸
    x{ڂAץFi5n]	3)S_bi5oL�񝟏+K-JS^֤/,18m�F
    pY!cxScpk>g�L
    yPCwk%y9;z>0i?Ig-ՌmgT1PH{~93ּzx:FI'(:zo6GSPX8Ө4	~�?S^w닫|YgH%9�Fj~,ZMB:3}ýy_C.ЋlS.ɟ^fJXxsF?J`�N76[DM<
    CjlA?Z|[*F:j*[XC݉鷶sܚ?0�{xc
    -m'kxȸb9>xcdpEzo0x{[<i~ֺҼ<OdХDBB+<R]F_QMuVի8Š(`J#t[Ho4'�]h+Y{cz7~=	xQ^2}>Oo}YDmz3koZKB.F2==<o4rI"c,aI>_cV'R/',sM'hiGfl-9*ROhKڼ=l?nU_Aq6k15hTo5|!7vI&PK8g_5|^6.aXEjڄ#J36oSʱ�dOH&Z.]0*
    @C,Y42wS&yşS]!5s:բXI/bFfM4r(e.edc	cŸkr#v_c^JJRJO|%̣nmӂi+/ºV/)To>~e"O@J5+Z?`67RFxH4Vc$cb	nKWID5힇Hӵ8[k)i#(-U–?d
    A5K6
    DZyRG"˱ёX2*Hq7OE+%'y4ܚ#8iJprNחZ)5nOvF5KIm=歭Ivzmt,32ym?[grqI%p[Be!~6+._,+_ZY5m^N77Eb.\8#¨(9'~Ӽhsd%ıIry<(l*`ӓ[>	µZQ\ISRm[m7-읢`:Tٷ77U+$[]> ^xDVZ޳md6pLaXqy΁\j>		}ޢR`P%eK_05@vJWou{B�#s+ۘY,Usֹ'NѼhbZݢ[r-4J[+m db<u<[gked'3w蓻(140VC{٫.:\-Yڲվ+@nZ3\k:^jI-#B:AUUW-
    Tu|MmA{^.՞EmofV 
    5/~[mS{ĚTbƒLgڦ2
    yDt<
    k-R8-{<FV؃,0ZoS:(ѯVRZvqz.VE+i+iN:+Wdh&o߶񎥭;#EZ%Ψ[E*eC#څ0>|<H4_i-Vk\
    vhf�|$M{WJuo}_DT$|^7“˵<d+#jH^ZjKi#M5coPZ_,pJyL|0x;c+s5'k%w}iZ%nSl,ro~kKlխ/�[i:}{+ybJ3?s,J_o'q׵^k/֍\kh$XfOHi1մ5<9mBHNm 1nJe
    $pG�cs“Ǥj\ڏaBۤ͌mUTm!Sm|/=y6Zk%�#�7m]ӢK柣Ժ֡Ow.x,>y%s*ֱJsJ)>կ4h$h6]KMMy$HE'4|xl>/Cڄ6<Ʃy@qгy<W-~Bct'yWZiՔm]Jm_O|)'N걭VM"-GTrR�=S~xCJ[m-dؖ H˹9Ԑlq^Qg|%B%y!cfG?�P:]h+Vjjz[TF#XrIF3'Om	E-MA|v>n]ZBAm28isyݾzRY9{(a�$D
    <]c�鷺λBlt_0%Q?夫_O|=Z%
    }HI3g.	\#K'jGv6j辦iMYݽvٷo7TEߋ>|?eiXcE�`qע*Adc|yu5KO,cm8~
    |j]/V9vIVPހ|6z7ΓIYv]>GOΛIYz5*+K$F܎SE}i%U]~nn`rʲъV�8`Ae~^rs[Bf)ڿ]пggI$ZnmFMp
    {_9+j|]fMN]>D-ayt	a|DYNb4Tq$^lOpA*_	xďj
    =iq*q;pyͲ|V*",To{͵$M];59No*kNVԓMZ_vm;=S=S/VM~?솘k۫Lc̢7id1Kk^)x)o߈~(ҧ0DOhR3;,C1+g|"<Oi7_AjP&bg��{࿆|OZu6 ʼn3&vr8?785¤+C
    Rkv8rxfߡ_6Btf1OqW}j6\֕Jx_GMAҭdIwI[Km5FglIIr[_Qz7y/| ־$vc{&ۄ
     PJ& )lxl~[LmׇK8;|TXg8rOS\=SpnlRKbycr㍲9A\9ieu*EJQJuֆU8/իNn%yǓ-$wrnmf|^#+tq\_mco�􋛻fD6O&5~HEc8�UcZ(|=u~&e+KH
    ̈\9n.B_ospB?Aۣe*cD\BVo];BSt>[X`[^`ҙYn-BHFf!،jV֪T[Zӛ[pqXeSNqprPrYY%fe>6߈dž,eԵ=6mwb<!T-,Lēx?X٥񾊐]EL/g"XiA[aBf€_7qxPby'igݼ4)h`$�g揁~?k:,7
    EKN 8"$P8q%9sάNѩ;xvq0uRaRm--,i|qkm%TWw:1s)	oh1FF+
    .xm;Of7ZfXexF=2,K)ez`/c-N/4pڸ76
     8;qyG'S{si+쳪2ƣ3ScrZJ2Zg{5w򊔪J3]l4FkmԎN׎6kuxHB7	JO5o:]3*6@Ԃ8�fףM+L.2v Ҽ_ԿOk1kNكXD<VipO/ſ.&.0L%a0snymw[h	59,~UOO>_A_gFO#Kg80	\+n=Oץ}>YүV
    q|]yz}]:`'UG]S^&ycd<(ECF54WmЪ.di$ㅕmuo4YZeRG4u�Г]<w[L6$㎠P?l{WG_VXi?'}UUnOGu;&Pl@"!Uneax>ԭmdK׵`l)y4<CP[ SUobwΰq̻uxu9 /]H
    ϫ]>P+/'knfϣ(<ڿf}>3idYG #Nh|m a%\��VEw?Mʔ7ÍZs4|�>+|Vм7ᇂshm.Zjp	m|D|+|rr>]`UG֝$EɐJGCv,*bjj(r2T_T>+0jNjnZh2]_>0վ>']lwLሴ\~˨^S>J#x21 䑍
    E^7no0XNU+LH`)|<SC}~!Z_.6&B
    0°v8W^EZ}k֒jqɏ0 m6Xk	.|tWmѕ?xY?'2ڻYo(zkk>qO4ͨuQiknagddԮ 3|_c?t
    ~Q>*|suj9JgmXL4$AsÖsd5\6fGNaxmnUnkp%w^|T
    2NI<WGqqT+SM9]ᵾ/7WuT(i._ͭKSo?H4�-nb}nNe6%a޳~-N?O^"]64D2M;�vO֟cT.рst<0̠}3o_k:|q-?4̵[.[j‡RNju%}>c~WuŦ|[ȵ�zk=.h,RTL?󷖤e=�>%uO
    _xny)յ{-KʬJ	(\[9f
    3Dqca,(IHfE'/4jLlNI{Uɦͦ:(oyUAitwV$OK_jVf-
    7^mj/7b�$0$yT~(j|9KK}NK)m`y 9`DpM"kR]W×mɭwh.deV\MyN}7r^0"h./6(39ڠw~X%liaug+{|TwչYɶ?FYqYj{NYɸnm{E{n?;kO7!HИ-(X\.[~ڻ*ÿg[
    JX|෻CE\IԴӯ+˙ΥaYGtu\IFyEVXA7X漧_uumY(m�30I
    	rFϛUQ2vMs%v*⺹Q%KPoN
    6vWxVޘr_
    I<Qd(\۽yόK"t}v)qhb##?LuyO[}Qc)5+͍JmHPzVozڇk1=ml#;n28Cy<�y.֗=Ϗ/	W%sΟ\HPG)7?וAߴ+Bd;ŧ|=}V\I<)640ʌ1UHAE`Crv`kҾ6]jڵqiZ.#�ZSVTn!|$gt+$q(PGʹN0+ݧ3oytF_ܭeR{﷙Wc_ԯRL*<mR<H\q>=^%{W0y'^'~hǚ,ZTPʳZDKGbWz) `ZZOmSU޺A-N-QG;&WnzI$rFpeРRJwow׽&w6?hv5S_Z[/47Iigw%ˏz-VZ$g-gh?<?j۝CIu}/^,5~XGlI՗<o<oq
    Nּ5NڛJOxa}J3|ukK{{ҿkG݊[k+-*Tm6U{k-"ڻ#~:b]JGbluItz~jKӱ1_KrP	Ȗ^"P'!k@f-
    T`ڽ
    εXsm<zcI|0I}捔WjT־X
    -E(�(�(�(�B;㿅^=Y%e5ttV5ӭ(]WJ:ROWGx";xkĺχ.ֵ:Fav9BkrKƅHxs2R<T{I9oWσ*\g*Oi}[9Wp7M�vM/|&𿍬u;|5!-Gn勰gXq>VUY	4Hrt
    }�u&EX3ȪS.%g[ݻg'Ҿ7\\,JD+cqݛ֬��u/X~noCʱޠH_�c?qy秽I{TTe_D g(puml|,߳_Mq.G+�#�w�O�|j-G[(qCyA<}}*VцhL<':⓶J
    *⓷ܬyKF7Gxlb;uW|)#8p�UjE<t5B1s
    B
    +R3U(QZ7s�(����������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/images/logos/lblogo-40.jpg���������������������������0000644�0001750�0001750�00000021014�12136042147�026054� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������JFIF��H�H��rExif��MM�*�����������������������\�������d(��������������l�������������H������H����C�		
    
     $.' ",#(7),01444'9=82<.342�C			
    
    2!!22222222222222222222222222222222222222222222222222��(�K!������������	
    ����}�!1AQa"q2#BR$3br	
    %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz��������	
    ���w�!1AQaq"2B	#3Rbr
    $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz���?�(�
    K|I-Ӄ~u*�?G7gQ�_-fxʃ)"8ʰasTJqnɏg=`/9#0�v2B4fƬٓ'b!!nv3\3[~,5m_E;VRd{8y2:1!p<wx⸑a&�U+||"%$[;Ock_A=?-by.4YyѻƑ6
    4&ԴL(.XpOA�ؚR|�fEp),k*!*#�>Aq~T"];iѤyWEYEMT8RGVte6b`1G_F~uvS炗s֧>x)w2obKߴZ6 ' qSo_&-6c<wd}Ce%Q7hQi^CGݴ@v�4N\{r<O^s^__R|BWJ8p3ۡ\̨fXHfl�S#q^v&yH)EҕH<CwiK8iԩ�fvDuKq"ѵJtT`qГL}뒕Y*Y:�κ}Z;yף;׽j=o
    +GZkx$),HqqQU.oDp6I2?\IL9y"-$>3`G�px9栜 x/LDIo۠?3+|:Sfo\;p|iY+J9
    F	c xȮkWy$$(LN0o'9>WJNjˡQS<0<=r
    d	&߀?IMe-ϘyWh^s2zΖi9H)vfG[vƣ=ϵu�pz]60b?Z4[d
    7rGg8nҲda1Mv01Cґm\soq@#AMӃ'9w2eaoXSi:8X#>0+0ČzJTNWGV5m邃œrv?a>U?
    ߼dwo1`}t{}TMh,~`ZIq#; bAAY�vPhotoshop 3.0�8BIM������H�����H����8BIM
    ��������8BIM��������8BIM�����	���������8BIM
    �������8BIM'�����
    ��������8BIM�����H�/ff��lff�������/ff���������2����Z���������5����-��������8BIM�����p����������������8BIM����������@��@����8BIM���������8BIM�����m��������������������l�b�l�o�g�o���������������������������������������������������������������������8BIM������8BIM��������8BIM����������p���<��P��N�����JFIF��H�H���Adobe�d�����			
    
    
    
    ��<�p"���?����������	
    ���������	
    �3�!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw�5�!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw���?�TG~˼}�԰Yo1h?gM2HmJ	@w6RU԰ʬ7ͿqSYaDL�aZpqn�S;R54W�tI+)}qcƟs""PA)4;Cik/Xr{r"{E%¡c}GYcıUe7cQ�sC\w7^XǵEe�<RYxDo[]'u}Vj?v5\\zp[\`3(7}�{zEnjh>\?4�Pc&㤨a1Q7%@�pIc_�k-.s1Y{ܰ#~>c|3㜸bufI$eKKOQvl!#)Z]5;5^qYꆆv5nд1�ٲwHʩ}f�ּg#28`Ȏ+z5Lkf+:SWh!RZڿV=s,]nP0vo9۾vn)k4klu?=FzOw~z3
    P@f;׵~DDAQO"x#3W.MΫ-QvrIJ8M;nc�nCgRCE?F3TŞ?ws�Jf
    %;Gls[�H;hŭᾭ!-%�c,
    B>^.&�VI_kuW'�_dDvϥTfV.Ev?'$:^/q"ϣfUnm~k`ewӎ!9ӣ}ofYK;c\Eu8MI7QDLJ}D	_L)zet2)n6K@}Θ!qFEe:׾̆[[V�QO'^`m|Qٹ�?λ,.q`sGc6=Bgt:Y3WV x`xore+ӭtC+V5V,07G%[�[UfnvRv@sᵻhyou!x4>_�XcC]^e{Z+kI')'v:}�KcVde&F׿{(l+),c^ pG
    Sz[A{oʮp4??:!K,p!oݻcO,`bh$EtVMtc>vYcƴ$�8g�tLѺW I5w�Y�ޫk.l<{cppl~ճ'5Xn)ccdz|:6(g!%ǧ,Љr_f}�g\znNB+۱kkh{v{ߗҙslqYdmkc~/
    U[stg5ٷ]Oq2SQ<fJ~Yh>@Lf+l`,􍵷W_Y}Om[<4_A~W	&CI{=*b3!."jhVmڛ^($	7pgb8՟ҳ/<͹W/sv{e~JEʿyl\ih/a/`e7llm{+oE:Ňͩ649U&K,sڭfX
    7<IN�l":]Xmf<~}o?B�`tq66[dZc9u˄EdCCs'|7@q
    �ciqЉNsPo_3#: 0D]ssX9$cΰ;
    !!8|qw<|hHn;an?cP]0u	opsg]IE?f
    wx[,=<U|i:^m`6Z;_䢳Tڃ}kZ;hùGo#$}U/waӰ-:˜=ӱ}P$zL=M�$k>"^#Aq8n[:g*6˱n
    춧T�4G/>C|~~�V|==_Gys42qW�Ͽ0wvO?h�=/Ff{MXns^>n�mklnؘz~Fgj	}�59:Kq-NR׷{	p~#c[c?TևB#�gn5ODzRr(F<^x_N'Eq-~c-2)X>cֻYB5�g_8BIM!�����}�������A�d�o�b�e� �P�h�o�t�o�s�h�o�p� �E�l�e�m�e�n�t�s����A�d�o�b�e� �P�h�o�t�o�s�h�o�p� �E�l�e�m�e�n�t�s� �1�.�0�.�1����8BIM���������C�		
    
    
    
    	
    �C��(�K"������������	
    ����}�!1AQa"q2#BR$3br	
    %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz��������	
    ���w�!1AQaq"2B	#3Rbr
    $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz���?�nW}bX>'KK6@Mhs唪Y^ ;W׶][RiYZR2$?i>Ѱ$@ȓm??[(\˺Q_/uG9YßslJ-e]Vߴ$چk$t\ssi=olneH:j.ݑ!�xW?ۢCVgk-+R,֡ddw9'bd+m Qċ	-e宽kvҧJ:禝׾j{Kx<Kмi`5]28
    9ye,�q
    x%c<CmW_״1^iZEYEp
    (VkfX`?O|kIKx\g麅rIxgr8
    @U83n*8ZRzn./ic8qhR&DӲiݥ}ϊG+.c:~>jquLRUc%žmYGƒg/}+"}G4sM7joxdړRhpBTB؀p~}4x޻ӥ<;T-U.10:]SۢW2>|Z7U[cgqrD3$PH9�ξ]%t}OJ5;J򟉾6sþҵPɉ)f%fhV@$v-wg
    &+OqXgmo0C#]!cpҮBT;]?|O<%Im-İ3+k:p> qz=L̫"Yq@pY	w	VO6ۚ+^Tݛ#谳>Uy'kU-&Ѷu/Ï>2E[C_0`,IJ+;+i4awG9[4e*2H1߹BFXYhv$W5ytO4@D,E(q7θ,4z%֑;{V$6Z/lc{HV<
    ¯M>n".zMFu=])Ԓ|=t&|{׺+xWz>#k%kl]tlf'o1e�ڛ-&i&kMW{#�U;);<·dmp+/E%ky/lR	"XXnH@*t-~i�b=f{u{jj
    * .QK2F-@yX)t1巒?=j)J7m-g|QP6i;)_v}W
    ~'wcRӯ<E}qO}eu:G7BM&YWl�+1AK)OsܸZMUeHNf
    C :h^|5M6g#KƬx=i?<3ۈuHu(Jbڀ[per$$V7UV%)C[ꚾ7ߢn~K%Ub4Tzlo~
    ZΥ}s%ޱ
    ]+*H 2TpkQ-VHodX[Ys�uϧh6P\H%Q�	xGWVK݂Vw׿Wg
    &ZK݂V}gx_<a$jzw=yrN�8�p{
    ӿgiZ=K}Dlf(v$cBPqhX<:qo�.C^]~mTdty$Ț9QQG9�RMO_uD>f59H.ݻ$Q
    ]0((IYm,EVs<A7h
    ɵ|‹m#$+b3O#~#iG`ZP_[(Čh)k0Wi*MlO2zrgRw[{׷'8>|j,H|Ё6y\/pS~O;OW񶣩^k=&[X溻mB#/EϘ9<�Q^' Zm�]|eȨJue)z|}7h~<Mqj<`ґU@HJ�NkcX((R8SV_shaч/��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/images/logos/lblogo-150.jpg��������������������������0000644�0001750�0001750�00000040335�12136042147�026145� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������JFIF��H�H��Exif��MM�*�����������������������\�������d(��������������l������a�������H������H����C�		
    
     $.' ",#(7),01444'9=82<.342�C			
    
    2!!22222222222222222222222222222222222222222222222222��P�!������������	
    ����}�!1AQa"q2#BR$3br	
    %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz��������	
    ���w�!1AQaq"2B	#3Rbr
    $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz���?�(�
    (�
    (XG4ا\[^9~XӨ9EQ9NQ}?(B�(�(�(�(,BF\�AQvڞl`RyZT)rIb%w}v
    �צfδUc*ƬȫHeBg𰢬1R^lWlBIr0sNֵy4momQz\ҭ%v_;~jkk@@b^Nis0Vmp[{`AXj^Nn-޺nk쨸my{ukk-ޫ跷W2ZM$X0;}uR*孮-41GBc13sNukBVmikZk(ң8'I릿sisn/Eg_VgD?f�~uҫ|֒w9zs /.XC2aY"/{3BܫsrZ2]Օw'	ѣ̣+)]mY!^~ED/X.>V?#^T9i=Qr湤:-DO2!	,NOr*1y1۶*J-+(חvY`ܞ9W)o#?kRnosLHӓs{QȒ`G״jM]s:~,UiIf85st\J[G1yaP?y'$VSeZEjv͢=%Ԃ81rHT5qօ}7#;Vr
    Rs_Krq/r[[ọyu3KC}%ռpXxXt?D,f2jbTi<oF1WjzIz'{鷻5I�"Zf98#=@e:*xNK>°�q\d.}ˏҪU96su"4a6k4jG$n#G\fmZjVuy<a}�_%Uo_kq׍2]J~gX]y|��QS�ghUu=ıN-$SlE=6VZL'_/i55sFbGhO͘`u&)i>9O$xav{F~Jm5�Y^Mҳw`;>Ev
    S\`jGTrii%B7#j\z@
    哥u_=N�yt!vIhs޼⤕{@3܄,82z~tӣoge!j"c$LaXe]\/^;@5Х!/ss:Q͇MI[M-iu}FcMn.ly4*̪$dRpZo*	aV \!7*xt8�?1Խ7քom[-V,*ˏ`_Jf6}o1". hçEIptLS*rn>9-m/'PȤY'QUe	;idpРm9pkXm*ņ@\�Gxle9?wr@}osk+ةm�kkpZ8dP7u=k*k|ǧ!RmLBے2 N]jlN3O8cky�u~(㴯ym[rGVeχ2ILvm9AAkC촵#N/<’B1xݜrsSÍb@?*H�J�'rѽ;[.Zv.R׽QdHVw,ٌs8$g5g&kkٯ,;DZ#x��?Lpn
    -KF~~^DzQ9<PfB`ź8Hxu)_FK,{qN
    \o#m�&.#r.%/	oh`'F--턌YR.
    H�0RWwKLk^�>mԯaqoq
    f� gdAPsc!)9pv*1r3:;CU	5m2]\cқfF*H#z˭ٷY.n|Z#kՏ`�{wӼ5u%ڣa<V5wCm<=}ZS%\݃GQ:2RMlz4줚ҊPZ(�VKɬDBG2G0YV,3Z2QߟdHFQb%︃i
    bOF;XŸ0Np8\Y^Jݿt}۝ҍ(n�H6d"B`qZ[\ıo,6+0@dwsR5+[e[
    Rw߮
    nc?Dr|{A' 
    .#yV1%gitr VITV}<EHcIZiϿqR$@Y;͜*9	^wkWDYwmn`?gּ'|Dӓ()s#9Vv"%]qsY]؄oLw<'!_9>tbnq]S鱽84F3l`Ÿ?)#=1EZ?�nA8_p+[ݤRwgM	}rУ R*F|2
    6Ru 3lȬWTޫT:G܄xy2ynC)
    rG\О36]�|gch�ԥgCKH%B4̆\mݒy\piFhenp1n�?[EK_[�ZZ>$ŭOS^.$
    M8QXVBg[,Q-Wyh[cMTH.ѻ�ty88b/cO-ƲJ<~I#ڰ(ۿ1W,j_vwdѨ1*� G?5\hK<hn6URnR2@Cs,[(ԤqYtX7Bv"Z[oZS�%y۞�]J<PΩÖ*Yvb6eR)І4V�8ypj<X[N^AJ
    +JǨvzb\QCxn''0'\<*]vtS(Y-WA;#ģH 䃎<U	D#BoRmǣYGŮi,d$/56q0Fu8S%&DI ܈B899ykzn<Z*)s'kcΛhP(ё9a6*6跱`0<ҔkZ*yZa
    5Ä	F00Qu	uE<)0Hɯ>~O8:M$]88m.F=q"}jMxc
    ۩tГQ	{T ֘"G'?V}a2$H ƻ%]$jo])a| ~yQ|"~	=	%~}LmXW!p+!c'$Ѧ']Kt.(αPE�PE�G,1OIcWS0Ȭ;j^=61>\ЫϹ\<jkQEX}RډyŔtQYuOԬm#9x^{3^EuL g֑[^=^za}8S3VզmhE
    'V>g:)w/,`vb:?�vPhotoshop 3.0�8BIM������H�����H����8BIM
    ��������8BIM��������8BIM�����	���������8BIM
    �������8BIM'�����
    ��������8BIM�����H�/ff��lff�������/ff���������2����Z���������5����-��������8BIM�����p����������������8BIM����������@��@����8BIM���������8BIM�����m��������������������l�b�l�o�g�o���������������������������������������������������������������������8BIM������8BIM��������8BIM����������p���<��P��N�����JFIF��H�H���Adobe�d�����			
    
    
    
    ��<�p"���?����������	
    ���������	
    �3�!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw�5�!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw���?�TG~˼}�԰Yo1h?gM2HmJ	@w6RU԰ʬ7ͿqSYaDL�aZpqn�S;R54W�tI+)}qcƟs""PA)4;Cik/Xr{r"{E%¡c}GYcıUe7cQ�sC\w7^XǵEe�<RYxDo[]'u}Vj?v5\\zp[\`3(7}�{zEnjh>\?4�Pc&㤨a1Q7%@�pIc_�k-.s1Y{ܰ#~>c|3㜸bufI$eKKOQvl!#)Z]5;5^qYꆆv5nд1�ٲwHʩ}f�ּg#28`Ȏ+z5Lkf+:SWh!RZڿV=s,]nP0vo9۾vn)k4klu?=FzOw~z3
    P@f;׵~DDAQO"x#3W.MΫ-QvrIJ8M;nc�nCgRCE?F3TŞ?ws�Jf
    %;Gls[�H;hŭᾭ!-%�c,
    B>^.&�VI_kuW'�_dDvϥTfV.Ev?'$:^/q"ϣfUnm~k`ewӎ!9ӣ}ofYK;c\Eu8MI7QDLJ}D	_L)zet2)n6K@}Θ!qFEe:׾̆[[V�QO'^`m|Qٹ�?λ,.q`sGc6=Bgt:Y3WV x`xore+ӭtC+V5V,07G%[�[UfnvRv@sᵻhyou!x4>_�XcC]^e{Z+kI')'v:}�KcVde&F׿{(l+),c^ pG
    Sz[A{oʮp4??:!K,p!oݻcO,`bh$EtVMtc>vYcƴ$�8g�tLѺW I5w�Y�ޫk.l<{cppl~ճ'5Xn)ccdz|:6(g!%ǧ,Љr_f}�g\znNB+۱kkh{v{ߗҙslqYdmkc~/
    U[stg5ٷ]Oq2SQ<fJ~Yh>@Lf+l`,􍵷W_Y}Om[<4_A~W	&CI{=*b3!."jhVmڛ^($	7pgb8՟ҳ/<͹W/sv{e~JEʿyl\ih/a/`e7llm{+oE:Ňͩ649U&K,sڭfX
    7<IN�l":]Xmf<~}o?B�`tq66[dZc9u˄EdCCs'|7@q
    �ciqЉNsPo_3#: 0D]ssX9$cΰ;
    !!8|qw<|hHn;an?cP]0u	opsg]IE?f
    wx[,=<U|i:^m`6Z;_䢳Tڃ}kZ;hùGo#$}U/waӰ-:˜=ӱ}P$zL=M�$k>"^#Aq8n[:g*6˱n
    춧T�4G/>C|~~�V|==_Gys42qW�Ͽ0wvO?h�=/Ff{MXns^>n�mklnؘz~Fgj	}�59:Kq-NR׷{	p~#c[c?TևB#�gn5ODzRr(F<^x_N'Eq-~c-2)X>cֻYB5�g_8BIM!�����}�������A�d�o�b�e� �P�h�o�t�o�s�h�o�p� �E�l�e�m�e�n�t�s����A�d�o�b�e� �P�h�o�t�o�s�h�o�p� �E�l�e�m�e�n�t�s� �1�.�0�.�1����8BIM���������C�		
    
    
    
    	
    �C��P�"������������	
    ����}�!1AQa"q2#BR$3br	
    %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz��������	
    ���w�!1AQaq"2B	#3Rbr
    $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz���?�(�(�(�(�qHX
    �o?nM֠)ˣlGew0�9lg#Jrk?m٢\I.86w|a]�ls|p͏8
    "VIT�2_/O0ܪ%8՟7OS
    	UsSoI)�n^RƼ_dž8Sg_^,4H=cvDhhz➅.ص+go@ʷf@C)whb֔ԽhiUW%/GqQEnlQE�xƟcGl#ӛI-4,ӨݤO-pʷ??F^
    ^<ik߰hsR+yh;U~Zm~WskmosL#}Y�dr+ړ7;MW^m;ZnpS\縅?ӆ.ז^<_dkFOD}*RxY{.kќgiJ*vݾX^՝?ſ_?e&52ƺ嶗ay]3J(RF,vɻz?oŚb
    YKMfn[Pb;{thPs2ʭO㞁w<{E,|G,t]?NKSB7LdC}xߌuA麍ܐ	mvGg;6Ll8}__}_MR)ak[Og�?}Vv{rrW=?ogx^~DzteWi`0zqw_YxW~uKcccI|Pi`ʮyW?!<axA摣qܕ2F܊˴�A#?>uIu/-mgQ[=aH%.m4[ ۆwVu}	J0F~ޭ9:JqY5(5NnI5iN=VԴ>;Lj%ҵ{Lԭ"
    ?&A5.oXt3G°H`+'#�Ŀ:őNP<3q6~BPeU4	mv$`rK;;/BG�-s2]_  s]
    UOXf\]QU8^I5ʒOfܗ3m'jY$1DŽP'%%6OZ/$'>Tv+?ɳu�/whV5r֢M9J৞%i~#𧊚]IWkxVvfh``L0?ĺ.#l/ۋ{O-$yݳ~3qty-S�wA/˭rfMY"a`RO;sBl5:r:kܭ)$ޮ֋ջ'QUKG;^'ʯ&e{Y$ܕ?	~ZF).R(I$Mf.6I<�74OSмVkЈ.KDOq<+wseҮkjؒTQQ[~΃avM	,/mūXI4^2}TӕNO;\hbtTNn7wgu'+⿉o5HtBH-F2<ѫ`D#}Gĭ3\v`I�cfdO	x<Xo`m^)kZ(T}i!?WE\LBS%5R4NIP2JJ;E/sV\1x32džg{(Z/L"VK2v�iSֳbyd4'ofs^	4zo~:ީ`#k 4JrF<*=8jeAM}j0թ,
    n3譶V})V尚d3Jr*9c-jWk]m)U8$W<9,	^Y&]_a}/,iQ^ǕƑᓭxLGff{H,@B&I8>tKzt~/l[{I5n+0($8滯	?<6gE&rc<Ḏf#O8x=+|oWɹ|B&e\Gэd.6yu<S`z-S{+vݭua
    ^-]5{=5faziυ|9/B7L.
    K30ANHDpZxM1+	i%ݪDJ8
    WqQ[4ލZiwdM.Ym.#9}Y7ĤHl/G׼K-n㾾i//	f13ħl{qƄUfPKqCI^Ryt⤤dgvI۵F᳥hRJm!"_$>Yf7pvlx^?�^ϤxAUQ[+pd:` ~88帗_ok;n7qq2B7G,]i�8c]o@|S]KFVZS<vQG)P`]Ăۀ69淅IڮvM|VN]N˙_^d_G?R,|pEox6w:^mqqkmj;TA$``�)6ï	x)|?SH%V-=1$.U"	qoNq7/Oj4#qeix$K|jS7mcw.iK|-u+ϵVpFUTFr6j̝ڻ[%DO*O7ՓK;ڽL|>sA4kk"Fnĉ),t+b|p/)_Zg_k:+*h庘[Cv~o΀뼎kͼM^OjyvߧiF)'0;	q|^�<Mjv9-/"Gcu.pʃhVMᐸ	\mzsFz6iYi[n7l"Jsp\6{gL/Kþ
    ߍlkV,J_6畸Ldryt"U
    I䥤H-\ʫ$R�zMxu(P&ȡH̅AC3ZĽ>Dk6zmm!!A 2�r6sTn]w611TlZB~:ot{%^.J,XHL{G�gڽ7WMnI^p8uW|$c=[=h{?x/ڮ3@b0bI1=OA!~-Xer?:ԫ9P[9>+q
    {ۻon<B^n�<B-B{+G-#AuZ<Y/#QˑJ/i֕9&բY&daSw.{kK8|WQs2Vӭ/u0fؐħ4ǃ!ɏ
    ~"޴|Y}>D,l7,ڑP
    rǗ_AYeW-f~+pqa%'{٥hg_NKQcQ#fsm>^׆_KG�s/i!%̌im�RO'iz ?h [mu'!ʽ=Oƞ[A`+Y6Mɯ'XLBM~_m<j I3W5Ss#sZ$^	Lsl	ڌk/3xS_K94fPF#dKXԸbVRGpyVo~_+0^+:1Z�3k~?x:�6
    kgԯ[PĬVG,a12N,9Ԛ:OlJfx@%ħrHD{ƅŸ.u]3ZHcU4iEo<lvw}^uY)'o϶ٞ%p})k7wѫM:Z-zlLm�BQnRG͘GtڃxoԼS-LjE}\^^XrW0#:ȱ
    pz=cXNhg>hdqJZf]AV͓m?kK+]IWQLqwV6bu2	f%"CcJۂ(a ک*WW+'O4<$bԵ{J-ޫUɣ3{_<#"sg}<ZA
    q DQD]r5	xzemFmY#0Q/au2.d?"VXog- � vş3j>"[{1?d
    ˬ0S"|yMy~X|G<d}+i쿙'btѶ.gk[-{H]KMa;-tft9md*LvM9+0
    0Y&_k(LM)Oz,♡ȐmUDxXyH6WC6Ӵ)K`^{"#|&|3pvl-t0ռ:hj:uuc[{Yf
    !YT*(߉@$[UyYJek\;s<8_^2p
    OwddxZ%i>_Ʊj7֫s*VHaӮƩ,Y'ВG_xOӭUͼ_;S	##LުTMQW&|>lm*k&E@nbt!T<kͶ-m.?!UtB<TL嫷>?-|jm|?5^ꤝWoO~mKNQŃ1v?E#379(�ܕ^|i%0#R�i6گRHӬf^yɏ;C
    +a:My4ܮx|9ʚkWr8ُy^irmB̳g"2ѓJm;9�{+|<�W+dKHP2)ns+gEz<9mC춎 [X#P¹*5|A~)LӬ|;oqՑf.�ƎIe+**0+꭮[.(NN9e}Uk5!\q-˜gQk,r̋8YgJS?.8;#v<_ڢL~>sVK[[l=efhZvE6VqC k& ׹=ZXgNWV8Jg-e-"~Gu9uoXM7.)<cԚ+SÖhz=8
    TK
    u$0tN)ݤ 񯀴߈vjIrcrou-ʪ^6Vïz<Q+h:Ɨ?i7"MZKN4,di+;#!Ez/)nҌѻk{\VQKe}>пbNk;*4+b`g2U`Rdfq,JX`WMٿEegioa4Dn5N.&Vh++T-KtFcioߦ-W*#VunkK?�h1yr9v^֘.n$w<IYYhqiao-P9\HlHwp_%Xn<sEu*2I謖�ܻ#fQ֍Y)6kWv�ݜ1>%`OeM:}p	=xK7PvF^֘/.f]bIiG]��`6
    m*QZZ$k=լ5qعҕ/m4{R[{Ϗm"*ͮZ֟4+DA;A#fu[]moIpѷf&HYaqG>{vܬp+cOV
    F
    yoc
    ]z11DN88|]nݨ(ԏ>;!OLLFk6̟wײQ_][-Q.X+2fjڕ. IV%ϖU.5<a2I7㔱N*>F]*�vqyɼBnv1Mfǀ@a9$e^Ѝ*Zie$-)}ߦ%K/0:se$-'~ENLyv
    ̀ni'@EszslۣdlD"}*]DVڒ)Ai/mlӾFEr%K,B[=A9LWC~2[뛛ZSۋiƕ$A[(pING!?J¤TU9?ҏ;Tsj%	�ۥ/CO#
    "s7n0CyѴL¢>/C
    >%<du'UN}5'kDd@Ts=FM{?>�Gi6VA@HSYG,Nn1{O_$9KVK�g̿�<q<	�Ykos0$\y~|'ue#y1?vvB[qW z8<^{gl$Sgḽmlb_lQ]Wv{���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/images/logos/qosLogo.png�����������������������������0000644�0001750�0001750�00000006452�11377016712�026022� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR������@������sRGB����gAMA��a��� cHRM��z&���������u0��`��:��pQ<��IDATx^SGU-RlJJ65WEyCDAT7AKS0sLHSS=g|s=zOh
    J@BB%Fk uk-h
    MiBׯ_onn|rqgf&''&&b1q;g8_)CIollp-5MZh͛W^%X\^~`8>>6Q-͘p߿YZЅ奵U6MgHPmӸ8?7	2:(^=]\\\]]hH"謱KKK	''wk&EI@1n4MfH\w(rcce勅x|*+h4;>5Ɉ&cM
    \#Z5%//-bjI[(_l=)5eL.gffe b2ƦEW`H	 8$u͡LIx52xɡ|Gd<>Uenh.g"p@=F.G$2/"aF"l3cƲ@B	x1:2D
    CUawESlj"FwA	G8{]>ڒ=Ussġ s*==O.jV]P<1*.�&/ڔr7˯ڨӎfVU,%2Fީz4;(1t%SS?G
    ejjf}048ǙC
    C'I~{Z+Ad&y?t7-fh||*xNVP1>6ʬ&z<t;uSwP
    3|to-�RX>xyv%#�շ݁r{4$"q|L煯T;(m,7<=o,:WwY*2{c΂+ZbW(qr1Kc2P<Snpx_o9r!}/<R̳WW:\&ɽ%
    ٙ4$ÐPRîLM_oCp)c/՟0J|d(4KEΣuCIH833=5)[AAP�Hc;8ԟ455ʴBKyU B$
    Ot;*(Xq;a8@5UTdLP君N׃Ξ/B%$zpC#gx ,K1=t%"Oת+Rp!{xh3
    JAJO\xF	,}rsA[__[kˣӟ
    JB6$	چ+E>H*O`9C(q	pKwnJA R!^`2}RJ+8byc^7x9Ojn
    !HlH|qR}|>-H),P65}G08p4QE*dC DEp)H6jB$9@P:@PvWP sft
    4~mA|EBg%&Ur?(4`,TyZLaƘRR=2ySz"#U} F		H'v7ūc7)wsQNwb*c)	OeN##&tS0'Np{X Zq�t?BBLqkUW''vqnqJߘEMkjRšڄnOf:
    kn\vFGg)yRyl'T$u)s7:!ÐMwH2
    9D1| !!Rݵy{RsOuᡂ5#Kvsӏe2PU{۷Se	90R4k)C Rd.Oy̿Z?C8H<S65e(U!(YdM_P_Wr=]b쑣$suubQr	ʝ5:SimsJ݌X*/_kv"_>޸؏5epuչPY7H.{>+ta!ΏAgYV3!CS5H
    z/LLCTFۆ/ze1K,|}š&4Hl`2S_aZZzCժj`,ΚcGKK*,'Hwh棇]j\檁]{	.
    CClIP_[sByFU;h#0\pƍ?${	QQ]ȭd5ɋtwۮW_;_XH"h/46Z)*8WE]|TYMSqWVVXsjUYiIQaS%|$Ȓi(J._mnnjmmq_[`e
    0N�2KWcYgO4=3LMXgXv'_1+#lb(L5m<s2NPlQ_~5%\wtq"O?ɜv4 ܜl!G4_r;LO3-GL"m۹S's.cGIIs2cD|h('<}vg/hw̷֖}N!1֖�&o`g,'+?i8~n`8v3.*ƻ<'&JoA"DؒCD%QCt1+MY<dUV\T|lټ~8s|p
    aLMs53Hf%ŷr\
    C:}D! y䇳nʏWQV*~YeA%RٙSH\)(onLdI.pJr}W$幊kz' xRLV}v6;"i-Vg8>r6O#xyy	Aڴ!
    JCVH6k7$a!EWPPugSyiBiSO8cDg8_Qv1@A<U(pZC
    !{v4){Pzn'4x{����IENDB`����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/recipes/���������������������������������������������0000755�0001750�0001750�00000000000�11506604177�022726� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/recipes/images/��������������������������������������0000755�0001750�0001750�00000000000�12203357067�024171� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/recipes/images/factorEmail0.png����������������������0000644�0001750�0001750�00000144700�11504335741�027211� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR��8��G���du���sRGB����gAMA��a���	pHYs����od��UIDATx^{mGuzGN|mICrMN}tt
    X6En;Ǐn1K
    )G~@`@CBdI 7 !s^欚VתYs~sVoZ{@�� ��X$
    F ���@�<x ���@�,	 ���@�,� ���@B�D
    	��@��"�, ���@�!��@�� P@8qē[ꫲp@PWa
    t@
    v0� .w~wο\ꫲ3w�2<]k9u; jI{�� ˿Ν/.UVYXٙJ;�B5:=@��IB$0peaeg+	I	b<]k9u; jI{�� P}k.UY8-߯$%VAktp6b6ɞ@��$LO2`6μ{E^I
    ?z%6t}#|_/u1l34cAԦZ��#{+կ#&B*Sn]9_Zk$NPr_EɫZWAWbI6L* K~N=/O>tgvL1)�@ !jWf>|/~L%LN`F~_WW\aN@U9}^vԪ+$3;Hmҧ?悯]7?<Tx|K^ӟG?:t"5T �Zm{믿/Y_RU?яVtDWxFkG>n!W뮻n@#Ӫ7+ӯJ8Ɍv6<p_W}ᖯ῿Lg'՜d=wГ/ÿ]z=CU7}~_fYwɓۺ`�@`2_Ռws.[oU4gΜ+*BC5
    LԨҊʯ}_Ї~UfV�9̪_?t\>AcwW*Փ4׫[#_ClS4/QO|⭿wqΑ;ϸq?{X8%AԶK �VO*U|]s3\׼>.|榛*XVSGs׎&VCs~>o꫿{7=%]_zaEY=tox_z#ޯ+O2K~'s\Fg#j~;]p'Ϳ;.>=^=s^0xQS	DmU7@`V5'כ7/xWUUo|_^	WX%L.!gBC~%[ۏןɟTTfx/|w/*r7S9X\6(n <*zk_#!j+OW7Y
    /yw=[gG^/|W_2εncFm^zw諾zU	}O]^ **B.|c??YzF~7VbUwg^y?xpp+U?}+i߽5B]ej,K"{{{Dȏ>5O?z}}|sį;~jH^G>i5,,x+7
    7tupᏜ\k>;+|CO??,tS7+.W_=kCo?z%C/zC/|'q-xN+뗝m4L͝=7ozף{uy_O'TrJv}kRS<
    Tw"՝i*�$ F9K^[u*6S=g?
    !7_|x?zu]3G9tٳݧ͵+~1_X?
    {+CuvovOU7sz~'^vڇ7\3֏U~UWKEcEmg+~1իF85w;aN@}WVׯ~?O=x{~"jiw#1	ϊF݀O-OГz[^}ߞ{VK>;9ר_4]םmXk["jW]]O~Re
    Iv}u^Kwv#MK' jka@upP}:@`i:gE^-o1,sgڳ;?O~O	xg};ѿ
    Z?P]iuR	�x7=exn}oU7>vĴ뢋.B=T
    _v+%3y'mz U?z!oux?OǞ?dSڙsw}׹=Oc/jg7ȷ1e&jv8>}ϟ؇>ׇ_9G^G|3u>FCJ.;X_I6w>u
    g{GQzx_Q:3?Y[_#'L`}: jka]wַ<Yճ-�C/Ǐ۫3+vw{Y7S
    ׿>GϺO~sſx55ȪJAD.|ʋW~?~^}sW~x?핧|;V}<TC?5y+::ڛ=OZeՏ?}=U5^Qq:J4jaQbwiI'o<o跿+y7zsW7~,Q;z-zVu~goow7}_{<W@;(g ϕ3^wsu+e{ѵô40Ix#QS~EoG@nwT[nq~Š֫/W`W\Q]>3C<C$O}گU[gշ~/ӯ{o[~S/7=_@~/:jO\߸W.JU^ֈCyihtW5߯K{;7}s]ӫo]OW׍ի32{@T?ɀhͻm$VܫjUUɽ+o;~{Qw|wT–{QSMLDwy_<ڿG^_=y߹x撟إe&Iܡ]t~%w׾\ss#~P1$:X|k_gIn2xl$XM1{M.zg/azgg/gV?RTAwݫ[TMB 0
    Vgd쫺񪫟;|koG}Ʌ~~7<oo//ݧ|smwaTo:僉ԟg=^w~%|#oo?	wb=p'?BÜ_qU^U=MO}?;V2\unY3yՁwӋBS7+?ҷ<oXo/o|=.<o{|/C.ĶΕ?E;Nm:IT/|~{/Wa_W<&"j/}m_F"2xl$X]v!?{EꙚcWR~#Y/*)S.ZEќWuje6dTDM˯^{ëK~?^puηUgH`Kw'$Wp@G-W5mv5!ݗGH Uﻺ:¾ᆏvyŻo_|17^7xו梅DOQ?_Ư?o-oqr)6Tix#??ߟ׿3is<WV'ۗ
    /9۵nmm'[.ȕpr,Wc/=-^֜u4g2/pse3]m1s8`VL8{CZ14B"wy:i:ko_%%j귋/MVUdF J\GTQ;GsDn"~?c#<oToy?)/}O?ǟc*6vj>|'-?y߾_w|xox?臯g`l^\D?L!pvVV5j:j;V36s=16#S;4[d[#v'jnW
    /KvtGBI%`M-X3ޙ'Bݘ)6X)P[W<%j2RS"`Zu}>	uQIY_y[~v:M_3—9Aؚ>z?rOe>o/ہ|uܥ?__T&}>!32f֒9uo0auO=fӧt~Ja}몧
    }K;sNc[X3Zzް+j<7)	rTf/pgy?k*^}1Ҳ/1X2Ռcj5NJԪo}e/>B7Ȍ@EԾ/U_>W5:Fp96(HZvгqfjSY
    R;*9e)ް,17촕ƐfF3U|ի^#T'7{VTo6G@/>㺥**+;X_Ix@(5:FY3%Qs>Mw-SG֭C�H2g,Fx_Qո]lf4go5
    /g'Gm]L@馛w'H~Azd	U	~~~up_L/UVYXٙJB;�B5:ߝI2{)6)JH
    y+|kC;',J3=!}kwceξ&2{
    kot>p뭷V1?x[Q.VTN ooV]mʶ(-ܯ$ \́B0'kOZAπ)*8��@`KbA^ j. �(ѯ\NìKܒl�Q[R4`�@�@aD ���@`m>���@�� T@Ԗ��@�lͧ���@�� ��R#��@��#���@�� �R�Q[jd`�@�� y@6��� ��X* jK@�� �fEw''KXDmd@�� �2ܩԅ^2k/ehV?~7akMNԮ}s^[moa.NiaS;%=25׳h";͜\'$P��@`TOb%^vc/co*ŠQV]cDGj,P#�^NFZ75ڋ.: jii ���]J+U-]t펚F55oɳsp$jbـ��@�LRUø"D9i=Skvc-~ų.~_c䔳s'+o1<%ؽJ7X'=:c^xs:uvê6c'ͥRq-Vٴc^СphZ'��@�F`WJ@zjDeTD:ёV2DI"jϺWZhMn=u5۱G
    YiIKv'"Rss1>F7iU8wb��@`s΁fK؇5S{"n$QaT5C*2ַY3]Zkj/𭪦DO*)|qݴ+׬X5{VhvH[cCG1b@�� �R m8lG>Dꤌ$j\gCv2ԧe{%j"!jkUI.QkZ_D_o_:jB� �@5B~g}fɩw$*Dᠻ~@*֝Z<lwyq̚[Oѧs93WG"M&5uwI0GXcT` jz��@�Q۱1{�ݕ7
    [xPaLP}^LQP9gG{ʬ~pmpIz~|jaHo?A|b9
    ��@�lQLEŜцH
    8
    ��@�� f4
    J@�� 1& j<TjcmJnA@�� �@L@J	> ���@`~@3 ���@@�
    & ���@`~@3 ���@@�
    & ���@`~@3 ���@@�
    & ���@`~@3 ���@@�
    & ���@`~H玛|FcF ���@�("Q~>Kf%L@�� �l{7_G;sϿ=O3 ���@@:Zϖ?k{w}>~re}W+/>ﶫx5/W*
    ^@�� �fG%pEIDŽs)TOԮ}s^[Qj5XM;]}ڽ{^q/9k|gξW4z ��@�̂�%gSl%Dzi<\_}_yK'*v<?˛ً@�� �@f@vLԪvڳ.6>ʼW^]0M={׼چ^|?W>p;ێgU}g]��@��%nA9-uq)Z?ʰ؅Vz@_#V͸ĵsK.VAf&j;玷5l"GVEsly,{7>]ߝ_{'!@�� �2!)͓c,]XsgQK$Z}<3\mKf9{]G
    -i^S^
    ZDv߽wO}og~?L5@�� �@"iYv]#5[f5mȃުڒYڈ�=us7v~~5?_w|Ĝ8�@�� 	NQ땷_FNjoLQ8ɓ'$G}wM	ӓ4]7?ݷnzE7碛?~4gP��@�A-Yw?s90w!?Kk~@u}@^�'8v/vo[+|gsw|w>Sos}">@�� �&C+M=w4	g+AЎ1秌U}tDiD-��@��r�Q+7� ��X9 j+ @�� �E�D3 ���@`<0� ��(rcπ��@��#��| ���@\@ʍ-<@�� �V���@��r�Q+7� ��X9 j+ @�� �E�D3 ���@`XDix ���@�,=�@�� �by��@�� ��bBC��@�� `#��@�� �B�Q[h``�@�� �@Ԑ@�� ��X( j
    @�� ��r�� ���E�DmY@�� ���QC� ���@`��@�� 0
    W^yUD�@�� �D"j, ���@�V4p� ���E�DmY@�� ���QC� ���@`-400� ��� j ���@�,f ���@�D
    9���@��"�, ���@�!��@�� P@��@��5��@�� ��B��@�� ��@�� �B�Q[h``�@�� �@Ԑ@�� ��X( j
    @�� ��r�� ���E�DmY@�� ���QC� ���@`-400� ��� j ���@�,-Q;}艳uуcW`Ip)^cQsfKSZ<3yE1)̨	hn;LҀ,� ��ڠOFȘHBM#bkx0
    4;#k"hFAR^Ľ6Z7pB$��[C<6K$67S	j&8biNl.cCgY jv!Iv$z �K
    ̅iAFˬ0wѩْ%Q)#*v44U\<gs!36cp?{}]gz`< d}IJi|$5FymjUDJDGBd,QCԂbv[&@�̋(f$zNKT>~#
    5D9M꩘uDFg5{kibB,No;'cQ=1g0J#YO5/<΄DcQ8'y$erxIH"jgw>6ـ��C`Qc;tC@xI<OB"O~	QDXF,9V
    tZRd b&jO"3$bpʥ&#&U>m� \FF%z%MjUċ_ͤ.b\W̮\95Qsu0:Q4Ѱ׍y<
    ,wC=ޠ(m⁙6"%Qn� &"jvɃk֕{`iDѧUU]T9)D-3D{$DX裼53DZ)a~$-R^a,'U>l� lF5rvnNyvD$'aDjs]!#DͯadTi0lg̫#
    *fZK\5h<َ$jc 0첷JX�#Ziy
    5S,Z!V<O0VSFEԄ)ߝŹ~UӥJnEyTIr	?Zㅸ:l>Lf
    x<Ң'	G.\"~[y̦?MY܀∓!ۿԄp? f@�,f4)H]Tбp%xy辵V1QbCGkKg6W;pQkncO7Ho"e߼NB5 i>d:v>L`rgL�dW+n_~-p񷿎"%Z")ID�XZd4@Ւ@�� ��*5ùV~ ���5=(%QN`0�@�� �JD`*V"V	� ���"�6+ܘ� ���z@XA� ���"�6+ܘ� ���z@XA� ���"�6+ܘ� ���z@XA� ���"�6+ܘ� ���z@XA� ���"�6+ܘ� ���z@XA� ���"�6+ܘ� ���z@XA� ���"�6+ܘ� ���z@XA� ���"�6+ܘ� ���z@XA� ���"�6+ܘ� ���z@XA� ���" u~,Q8%PX
    Myd.o25b(lHyQȇ�Qo"-72Q1U#IͺDlwD
    D&i3S6qdɀg@�:Ș �VŔbA)$j]w j j%ДE-SL(Ƒ&
    $lPc"55X~xZ|GP6@w(@SfX*"ߜ}uyWg|Dmnz4+z~YKOf/>b҅ �6?{5eömnS Yq?;vMDm)2a j ji	)L;Ja5k2(Q4+!jw>r{?t)l/>W_|vQQ�QQQôRWT?4eD-Z}!�hV\E><f@د^yͺg7VAH@@Fє"WESaf35	[)	DooikHi{n]uyۇ,dyVۧQF9
    |tWɇ.(9)K!͊reg-bօ.Yz`Js[nryTnPΣd̍�9}ܯB}GmI./juq}ƹ&gm*M35ր8OK"j>qA/o\_oc$="\J6&&tvpΣd̍�9WQVZT7}yu{j۾Bεm-(W_혯ᱛrH#jݝ�9M4M%$ejxΣd̍�9iE;jSl>�ƚh8̂2w}Zje:מ{9s\X͊9ON?-6f;g]t;х917 j js\a~'jz4eCEԄi֜~Z5&6prF9Yz~֚o㎁G@6hVK>ty}Od]Q9шw j jXulLsaiޞQcR�?|~
    2prߊZQQ'{IMa2Qsү}'s<>] S{%PlOU7?{X>	MPu~=FW]i"''jI7>(7~j͊srFҰ;e{(mGɝzvnh`
     j jXu% )<QV|Cu?
    ,)si~[MOjπ
    YqI@F̹yYyFmP#8os|(k"a! j jg^Z3ה
    $'v`-H20_G}ǣ3ˏ#y~mtѬ8/ۋ	tjܐX<7t:V]	h7:T-`>t}REH0QiV<`5 j j=% Y9#
    'jZu-.QA2_w̢D�D
    D
    k^6
    k:Gs	Gʝb[C`DI<8gD
    De1ZD+NS>ն`=ܶ܀S P,)@eb82xSU D]E0D
    DRjE1eGDc�u1*B}sxLI>>A#Dc �PŔb)!�1 j j%&bF1Ll^�Ha+&m%Q#eC"fC�D
    DmdD"PL(Ƒ	
    @� l5z~S6fshVHbQX)%,'k~gw6>&A o٠ԙGikF`'d^G}ܩ_qfב�ʍ8-�B8R|dvR䢉	L
    dV
    RqDmD+mNX+y)I3`Q!/#̺gΩ~쌖}!jUOMjF>rs6u$൲qxk	xMWirnmD̈́kD-rN8 jF<оN</#̼ENotI"vOe3Jߣ5</3>V9lglDQ.Q;rxX"j&:yY-QK
    WNխx#jISAE ܈+(Y#jyNՂ~[tKD'\ȝKD'%aJ!|T?4JMSKOԌ4+Q;~?GLG߃LM4q*OLzS
    r.P\5ز>n0Zeyy`NfO3bÀ%!DHTPN%#^lhބB;#c%n#JvfG@RlD
    D/5
    
    r.;$IO@Hّ1ouvO£I,g:b)8uW& Txhq0ܳ59X^=&GO,V'}+Ƽ 'Hʴ
    %j焙 MNxu㈚=.Է5+:�7]ąoDmDR_'ܻwz%SdE	fEmuy~z5s\F7DD-ڑn45bN&ZV2QzW僈ڤ xA,	Aڠ̘݀DLJ,|ǬrZ*R]Ʋ\zү1z6FC4Y=,먹۩WҘw(`X}Dl@XBv
    jRt!/D`Q4$\40 4OF(Cj˹qnʒAԦO2ԛ	WDFҾ1ilT?)
    -J݀M!ܟ҈Z
    hX0u;QKJDc /5ڇu	m7Jq<
    Dm
    5Hjxf+z&&|,<Kxm44/>Iot;jܞmH+p:jޣ8ù1#ORgkfYP&П C"}j:7ot$HQmwq7!lG(AџM*EiT>btt4cO+U,!DX%.WFFRm;j[<}ϚsĮ~�Ŗyݟ ~%jf	Ei3j^!2?6̦څDcA:.2Aݾ6s
    R]Aj~#=ɛQA~>ơfnW=v@-ͯZ~n.pzg9IuGB-l>muI7,Oc*~n*A,nTkdnx4QoY3a2K}~j+HƻVw/P6]<G"n"zԒs# 
    Y0xD-T(T;פF@ &z3a)+^<B
    ڐ0h
    -{8#K'j? }&uǖJO2}T]/̰tɨ,yg`iK_h}$jhLC[#fw]xmad/mKRU#I^Cxu QW=ŔbAv�.;5E%$@1eGV�u%*L}̍YKD\#%f|@"fC`Sɶo}fLT<Ŭb)>6 u	0J69Ss͊@1+Gf
    ?&$owM%vxϋY8R|mA$`N7l jsbVr1~L6;H!J6&zgscT`FJ,U%ꤙ3Kf6mm*@0nyW2RgOvZ6=qwۚs^GF+&7&ؑFRxRNEChڙ`[-mh#=^àiA;+FÄ&Jb^Q몞t>K͢'΀1F$0^OOQ8S\l$3Jfu5~K}Aב,JQ˲Î4u5Y'j|5Cyx5^fːeI+mWܻr@:y~
    NotnjHaSYh(Х
    T`_a;d=vjq[k|"Z̑Дxl)b|%Bw
    L :Al|\
    QK-Fm;%,Id&a4|$&QU=QhDY}27ݬ5[9Tӻ9@i%zt+=G?}NH2$cX棝P%alK;x;X:-{pe~Du&kLZ)dwTC+:qR2=N~j%DmƧB,{t.UC*Q2#Ih�QiʻURx5Kc>AwyB@i;pt0^JQ+򶛐𭦬wԩ][BqGY:͵ yӳ|${ft9JhFqD
    𖰽bջ?~L꧇-X(l=ٴ5;IޕL$JĊLAR`cI~8wʬݐ@|@ "w"y!c[[%7fR"OɻNud=UzN7".Ž[neX_tnd􄑴Y$$jT~)֏I{ŢɶDڴ2J"BIʥ'M_c$jt$UmZw=<J ݽۛuԢ{ke==Kd%}ͅ%JT @$7>'Q#rt,
    �Y`hVz!ik#}{IQ-KȻ/;Ǟ5@x/@Dք9W[.jE~vyWD9z=fƢ_zIȵHY%5S\#:j5r "=g j5(t[
    Q$jz2$aTfRzMNX4zQku~GMq7<"[2i]݁S^dW"!GOZ	@MyP_"`[�"r
    G7YR4):jҳd55]wO|ʰzR;O|.=e^/,
    t$UIzg%}T鉖)vZ@Sf.s{֤#MOI4~2A}D>Nn+
    a=j4)J2C8xclvq
    D=?j{[}nEf˱G	hk
    VgP(S~QL6Zf]d8$N)<^Avc⌦L?jP`Zw%ZDJ5N<v]'"ߐlB"dug82<]AH\e8c"I*1鋇$/EAsQlcxhE,oGMxFo5qդLDmo9&a1Zc'Yt̬ؔ
    Dmf1|(|ƌ)#,c;A1A̞lU;ܻjK7'=ٖ ڒF!PJȘbDjG%'"0&9u&z6D|1zc'ےaQ[rt`(YSAF%ɍڴi9iM	s1_S$b�Q[lh`XY826lˎOQm*@Ԋ]8C(f%lewQm*@{0&'Ŭb]ZHŤX6l#j0+9})Ƒ}G�:=ƘA�Dm?K0/dT1/-
    $"R= j j\+lȆo"Q78
    ìy(lHB@.-"VpzoȵbF1l(6*uaߏ j j<̚bl:<88<R,gRU)!LV͖fΜw/ŲӮ4Qe%3Di:3ǏJΝ]syEv#Q(Jl(ŤI-9Fb#ZRQEC`)Mjhǥz4_o]DmD+lNJ+#?RgѓjgJC_FuY!\q	+`g~6ok]wxiZ=*:H=[Yڕbf׼58lwUD8JQ=BdLvٚ?叴=DmDc2PE0U+GWYh1|.sj|d>VvNQDZ=ArW?
    aeUڑCQ5hFg~tAb|%ިBeF@'en4*@lY}UmR!w֊46¬Ei.UCGS$kyYɶ6}DѲu䒞u+FQG*AO~R5ݦ\W`
    JE&N)Q1,\FyNUzo6Ѕi0cYXIM
    b`iߎV
    )	o
    l(&ܧ옹ې0~h4Ctu:ݭpμXatfE^
    tD\|/ݽhF1uQ"Dm OKtԡ_ꍞ�wHc/*Q+򶛐۴9+fs.ޣ{,fjeP;K/Oi
    c7~GW夙kR:^ZĖ>@i``^q!M]]\r'l!+Ϻ	0z%Δ'RaJz:k쐀_s5j:u?m[Bdpa50�w$3H}
    Zv
    S|(`7ŗH5D8̤~%jl&IN2kP2v&qIC$$ZQ.;jK)OnwIJ%_�=k=qpMRhZw=<Z6+P[Q;T$֡%G۰ק(J<D.A6땜<Q%j6BDUzs5o8f#Qy'M1խPF_T3va%y\=D+@JY5?s0'XaI?mE-MCQ3kYEтASGL0:u@.r*~Ԇ="lO6-nvԜE.$K>2N+ثd]Zcp1& fԏWnC j-3ͺOK\C"L4w0Dԃrp\9Fdy}&;'~*K1i
    `]#0Q덑⹎nCԆ}$1Qs{=Iׄw~PEvlho':yFP30%^A*&`EwM	[:j3DgpۀOZn>*2l&U%cؒC:R*Jzg;*=5i3ĉۻYGrF?{jZxHWvE5[
    ƻo[_>5'F-^|ǨzIv=P9v<I0^Ekpqtř obJ
    5wY2IҊM?#8899k{Ygb"聥
    GFKZJ?rdB.me3qXQG ynB#jpڳp9jO5ՕQL$\OM@bޣ/4/Pƞӹ(=$a|D-QwzF^::.]Owܥߓ0{O!9=:DH;CiĬԦVQ@iͺϼ%ڶ߬d,kƧ 0&YugHqГd�:jx`|y)@1ݑ18.-ʶgLs&@~;}, Z,;zO6"/7;b2*#c1>(9&7%(~ek4|hʷ1(&qdYe[̾Ы|X3'zQ8R|mA$`NAMXsf*&qdYe[̾Ы|=l$"PLFlewQm*JjY8tQQ M%Z!PJ.Ƒťʊ�5+PB`SP,Ŭb)6X�0J6
    ͍@1+G�7/HylJ6MzgscYT`FJ,U%ꤙ3Kksm*@V0qѕfyY2i:頳'JΟ]syEv#GE+jPH#VgYϢ!~0QJQ&Q/eF϶+.59I+#值,zRcTqH.X<>.,nѕ۪{^eC׺^]zuԑ\[+"D͢ykp6zR\=#§}V)5G@4cTYvnGڞ&eT&2Oj5D0p�;LʧF<B5ᅹ|dovNQfQVO\裎h(+R,DԎ;f!1f4o&{5vC$KģDA_5
    yD$==4[[%a&QU=QHT%=QW
    ܙTt8v'.nS+0%"'t(.h*T=aD7bHo%:lOnRtFv(jH	^7
    K}ʡKNM'CG'`{,#ِ/L;DMRPәT
    D-@|0;D'գ5e-!jyZW,+NR7;7!"nL;ܙ+bJ+DFmWnBM
    Ũ(tfs.=
    {m0U*;K/2޶B#n쾩NH:H uQum#.>@6{?۞lm^G٪.HHlx)#jwYf訍a$]RD*$u:I&8wvclvJ]sVGzlIDͺ|u4DKQN!jBiոw Ab'?hΰfSDm$n3:3ftik5UoV*jsE%?Tl74+#jK)O.[\zU5FHFNRpP
    GW@9w3n2݉$"6uG۰W҈aV"fɒӢ%j6BDUzs5o8HrTex2蘣l
    )fꋈ-y\3x+P&-`Қ[Q?P%Nު^SQJf@+wHz_!j#x;斉AGL0
    MɵDQbƓ=2mҎ(څP쑹wj_:C/p1& Fa%3rQ@3d5DM
    $ 2T
    uI*WaiJҖu5�#LYWX?qgf.=J~mn5Z<&yڐOQ'"jڂf*cg$-)A[TEԤ!)r
    zKoi>|Nu:Ɲ"tXH4oVziw,b	'ɞ~~%ѕl!f5\w+t_uJ,#9cQkR
    ݵv~2+f=>2+Mc+^,QqbwI`GOQ_)K0^Ekpqtř jEĕ"*jb38d]&6	iYLg]ggk*dɶ8 0h$8]-Ah)ȑͯ
    M{K-c_K:B�)/PHNW29jO5ՕQL$\jRc}ܮaGALn$Mf,>OC'jNAuGѬf
    Qk4tu\dL͡s[D̎
    iCiL`ۭ"w@Tǂ͏9f	ɒdw߸GZvJ脒YugH33.ɖ: js#fCݑ18Ζ0$? 3Q49�-B\9m񠀨->D0p(ŬLĨ&R;471A̗Sc*'MS:|ɶAV$8bVr1#F$Z"UJ62.qZ6HԲ(6l j=bVr1.t-$bREJsxLI>>A#Dc �E%b2Gږ�ui)5{CS6qdCɷIW~QQOaּS6q$o|mi QQQ+87Z1eG6|tɰi5df͋@1ec6GNFA)3*XQfK	X~)?uZO�ڄճ!lн#^_k7Fۏ?eH�h%6cbDQdH#
    VfYϢ!~4Q"KY%";9
    A؞7-BZWXK+#?1ReѓjgJC_FuY(T|qM!j]GޑG{Φ,%EDSxPسEI~6|^NHPX65vJ8#IYԦ2y%5KlG
    	T=|mlLғjO4>Yb/߸DᡵNjE^GAԂi&*cc@(Q93d۠\ %56%	e(9MHj0Wñ
    ^J?#j蓹+(8BNө^uOyĪhd-;E?#q݌a2ʛvBvO}i\4!oٓ(&j:5U>cc&W	v:;gv?ySKAZ0ÈFӚT&^7~hDͪ䊎nͣRp'Hu!$g3Ýy8UkbMʠQUK򶛐J2LW{tϡfpܗocXhܢ*5i1XM ]|	o[%dIeBuiQ.ڢ	R|ΓDhYDz2 jIԳdrҐ�Q|-I}fAy-[RBVCDы5u"_!gM6#a<5`M2�)M+iDSL"1(pBlc^<k}?mNDmD-ܹuXBC*j'M|eG*K!`h`3$*hوExjQ]JFLmtԆT.XrE9J'DMHd'zs5oDWQ5uƲ6n֗s=ŋS&n j%j^`͉Q
    [phI55~EۊIޱچ-JDܑܟ55!ًKF;dB-/W|;!DM:L9-Y[6QѿLڳQ["Q$jǰ0N2\>i"-IHԚgq~Gܞ?8W_16pdsx`7ĈpFm�ϽF6iְ=5PH芓iP2h3kjJ[J"(%VQ[(Q嘏؋4,uR;OS1w	π$=It:A[lh	8-~;7D~D5Hk~R2ַ3z2+f=MsZxu6@i>V>yclvPۿ{ƒ̖cǻ`<4b0UcZO~Дl[urK~~Y/8+.wK`u"ImIDmDmKXI1XDF Qk%j44BvgߐlB"du8-J#5FxǗo-dIAS&
    *ɶj؉|Tkpf~f
    $r#Qm~mid[ݛj{nFoKڶQQ+7䙂߬Dϰ2a`01{s�|)Sy33uI	bD]0eY-+#a0)SAԆeZFɍ쉺`͟u1?Ŕbch\H%Ep[@@
    OWL(Ƒ$fDn6;6aS6q$qI QmQ'QܘDY8Rb$*a66l'O1;Ѧp/*Ƒ$fDn6;dQ?0Lqdc=!D[vS߈ŬbHmM$fC?J63΄@1+Gf
    <H=i7l j[L\J͑R,gRU)!LV͖fΜw/ŲӮ̵dQ[AFaDWrK6gLf\Ξ8z`+9~w݆k٥fRLrCiW#[f1>DS*Eɟ$m6)qŸv%`&68z%V}BEOc*=I~aepQH0+yW:z^eC׺^WxiZ=bs:HDYڕbf5xn.υ>ѓ,J5{
    t=KMTO(i1l]
    QZf:5\$SQ{4б:5Dqx8FWY;
    (Q'H.QG4kd])"jGU؉Fit7K=K3IDtإHQbJW,F1֐#϶GGa4|$L$'j5Sj(a:rIO:#jw#MUnX3߬OLeL?iGyt:v~FodL(o>ک
    CO%FC�ٱ#x˞$ܤ F&Q} O Tgb\˒rrLo?C;NXnR{-؉ْ.LDM0 of&Fr5g-!jydYq_ꍾٹ	q``<P"f'tbkIpLW0\:s*zv[ܗomcXhܢjF9iZ,<"E%|%Bʺk؁lvJsٷ'&ijބɶ7N>TNLX^O:1dHe+@tuz|CJEW2CFmwM'53ښ9!c,:\GG;	6w NHbm(p~2f$n]#;RSRhKf?
    ]D@2 +[26kVF½(M%4wS\zN!`a=
    'b)w܌dsfeM
    L"jb-i%"Da (J5[ЛY$┧F"JD7U:s&*%.2kl&K6,Wq87C	˝+Aѹh!ڧ@t{ߧq^Qc;jG$UpH"jÚaLNOԢj+!i-5sl[3Q3=qIUd 2\^ BQbƓ=p,v!9T&@(Gީ}Ễ{?V& fvmz@r=[
    QT}&Q"iP
    AOrq0Neu:Ӊ׉w6LYWX?qgf.Ŝ=ڿ0:C12\<&yڐOQ'"j*8}$fyt4$eYn#<ut{yDԤNOwK2;o@?Jϥ47%:UIz&u[t%{uYm:B/:o}%f1Ϩ]ƆZ[}O@Kivj
    bYk8n!qbwI_mCcǟ%5,
    qT6;@Ļ߶ĕ"*jbvg,̈́>emBhn+3.d{3j/MnqX
    Q[4}8Jn	BGlWhzXj5'/]j47U%B]wӞz!?VW1pwI㩁
    -=Be4J}wQʢIT!c E,kșq:$r&c$6hqv4ii&ChuP(r~b,.3QpL7
    ~31cfHҔC3b|vFDagd
    "5_Z~Lq!;2;څFĜ:9o7-3C"PJȘb641nLnKTY$GMKo5m. H0qŬbGZHԵD�;7l jd,\(f%2lewQm*@{0&'Ŭb]ZHŤX6l#j0+9})Ƒ}G�:=ƘA�Dm?K0/dT1/-
    $"R= j j\+lȆo"Q78
    ìy(lHB@.-"VpzoȵbF1l(6*uaߏ j j<̚bl:<88<R,gRU)!LV͖fΜw/ŲӮ4Qe%3Di:3ǏJΝ]syEv#Q(Jl(ŤI-9Fb#ZRQEC`)Lw	*qŸh9(]Ī
    KiEOc*=I~aepQH0fW:z^eiou>]zuԑ\۳+"D*9kp6zR\=#ΊÉZќI]tDU9i{eLDFKoti"vOeJߣK)</SO:>cx{s0zBuDFFb!vBbTb'iљ,MF,%j:tR j:+DFECV<vJ"XM^h0	kipx?LOb䒞u+F#`ozvvpRrCKb*	Aã<:;E?7J2(o>ک
    u-<aD7bHo%:lOnRWv(jH	^gUS]d6^'Cs[:k6ˀY:(H>?Q2H#t+5{Q
     "jP
    i9u藥zovnBDv3W:x	DmWڮ^݄�Q�!at
    {m0UAm,|kSx[4Q('\$Guב)0 0+@6{?Dڼ_6YQ[4Qs@j'&oI"4O"@z=
    $){''_lĉVGzlIDͺOc4=J)DMh9{u'?hΰfSDm$nuf?5RI?}"7+=gjsE%PQ[.QpMg	
    -,Pvr.T(t4HeC jۼQμ)IDPM@đ646x`E񟇨Y$⴨G�5"QDMV+N$j6w[q2h|l
    `w@"btK9h0ъ@h/j0Qfatꨆp-DkctJh0"-H4I#Dp>LzG?b2ԩCvd+:2GmCOl6iGYBrL #T3N5j@~rQmiփɓ'gS&\4=9x1a�Jr0WO5m5ұD-~Ñ	.9B~mn5Z<&yڐOQ'"jڂfw~PEv	>O쫼A@ICRVwAKMD|ا:j!lQ&uz$�aЋN#c(yv$UIzwo$5i3ĉZj)y+<k?3ٓVMݧ_ LY紌nDW^?gчXĨŋ4GR=Eg|!THY*Z[+,LQ(=fG]*!;޺,̈́>eIiYLg]ggo
    DmDmp81pihxme%-9yb_uYjYgcQG C
    qשXڳy^C5'(?&5Le>xN$>O-{.*2~8Q;<%1ؘQ$5T^::.Mzs޿fU\D
    f!ҝiCiiRK~u5GY*7l
    eX>&aIx&R;0h#0&YugHqУG{A�oܸ|/I@1ݑ18.+JfLs&@~;Ezm?qk蜋|;
    Oeɨ쎌) je1/Qg=0,@7-	
    Z[I5:)dT1Ln(;HԽ`;#\CGcogi1U#$꾐 jCָqX\l\LFȤ#D{c�85tp
    % PLFHB B+ZMT-9֚5{yqdy9r"D͉&tTa5@1+GM58V#DE"̆
    DmDs#PJ.Ƒ3�͋�u^7=ۦ
    Dmӹ^Ŭb);90J6
    ͍@1+y6GN;88v:'XTϤ0RB`G-Q'͜9 _e7]+kSnl6ˣ'ΒOԹN=qVr
    +KG?*ZdU48FI'">KEb|%.AꯧT2MtpZI~Cg隈ZXr@^
    I=v18$eYz,E!).]y{^z]}^CnQGrm%Ү5NS3^7\{B߹Im0
    DjX$K9=F#mOd2U*mƧZFKotiHaSYhecujBqdovNQfQ68D QVPX=v*j;H#fi0gi&ɂ�7PQ=:FIEFi
    ] ju^jEZCV<vJ"XMFh0	kipx?LOe%=QncDmu
    k[1ӱ;;8@%1muvEGyt:v~Fod9Gˡb	7b ;vf,=IIA,MұV
    )	o
    zFTO9[͋Y8IW	Mj;5[eɶt7tpF$�!40bҤh_NFB6ʲ1.}s"!Ýy8:ءDN jJdv&ݤ�XBg8	+uVk۪l,|kSxv:i",<"E_enb\!e݅5a@6{?omO6/|̫IBdKҹX5*vbzjIa$D*_ǧ�u3Q d9DD#N$fF[s>:"d%C(h5jɻN[ 4gX)DUz}67Yjtřuxgq3DM~THiSYw\>SP+(dby0eiT-_feD-܋
    wk:yZvY 
    4ƹD&$5|
    KFW@9x3}?t'->u.K8݆F(7:A6KD(Q+&@$	x:Df#QyhSL]x!W_FR؅[避8 L,a55ﱣ9\SÈ�I!}q[&j'N1xt\'Z/!
    GmCOl6iGYBrL dxΓrK̏UŘD}?4VSl5DMQN9$uI44W=J}jy}xGn]*
    -?6b".QC]ѣ0Q덑⹎4CԆ}c"F
    {Gn.aH8	w	UDmgq}˙Ll5&
    IYEhp'(a#jw|PUǰPm`T~IU${:1:lqP/wТh{J]a׷	\1Q1Ә+,Kxcx񌹞A?)*iDHY*Z[>b,nQ(=fG.4V2žK\z?oq0q!nCG<0dSj[j:jHѕ
    <G,콽3qAګ#Q!DȸTe,Y<wΡ|Mmuk	x?I@8S߰i}ܮQ0G}wQ	3VɇNԎU)EI[.En]/.-A"s
    f!miCfvk#K(IPIΪ4#0'R; fMTUnj!4&ҜsQ[z``YSH	bDo"@C@d[(ŇEݑ1Dmh>cܘȗdiHT+%[{QrY82O1˾@
    λdQ`obVr1l%'u߃ߛJ6=dbVr1w̲/B~n*G2!`Vr&eTS#sO�uz1C�~99`^ɨb_h[HԥE`{@@
    N
    VL(Ƒ
    %&]En2qD
    Dm?Y"PL(Ƒ񅶥!D]ZD
    D
    DސkŔbPmU$&þA@y5/Ŕ9uxppx*XTϤ0RB`G-Q'͜9 _e7]+D
    Dmi
    DFK6gRv3uAg9;n5QGP(QI6[Ns()FIZf1>DS*Eɗ$-qWӌ8T-uISz%V}t@^Z�Y0ƨf]x	|7f۟Z/
    QGX5!]Gɵq+KR,B,4PгEI>f!|7(VgEGڞrDFot"vOeJߣ,</SO:>	7^g*f7̢D "D QvX9<U؉Fit7K=K3IDt
    ]{y�
    Q["Q֐#϶GGa4|$L$'j5fg0{'j;sԑ*7oV'OvvpRNKb+	Aã<:;E?7J2cP1]bM1t	;3Ku؞$ܤ F&Q}XO6xo^DCpмF@⤫srkuI`'fK^ޛ3&vRZCzR=@vedV5[(BDGNu蛝7%^QU"Wm7&bT4fs.ѹ^afjeP;K/2޶B#nl83I3Igi.*vhUVYwat
    Ay;Ђ͞Y˾]V=ڼ_6UQ[4Qs@jKcI7]He+J$nN;y�k@-qFmՑ^'tQ?9s
    2ƒÅizڒBԄf�ɻN[ 4gX)DUz}67YjtʼnD:wftipq1aw\5񹢋}TKQ[.QpMg	
    -,Pvr.TӜIf^	9n]t'RDԺHԿ646x`E񟇨Y$⴨G�5"QDMV5Iʻ8mitm8uv8AvasI:h0ъ@@[Ť`Q
    y:jQcĈEM_aע*sÉY;eɖ!f8wF&j#O1x]TpʥDQbƓ=۴MQsE*/;٭7`;-ǪbL@"~VvmDm?eYh_'OiNap5$jz2$H-چNwhQ:񎚽݆_#*KbƯҌu( 9B~mn5Z<&yڐO{LDԨc;	9.,>汕c/g2:4&
    IYEh7CGm?-JԤNOwݡ>I*tt4c(y){TΙ*dOgR,0E'fb6m8Qk:B/:o
    YGr<v]V/_&pŬG҇sZx7Mc+^,QqbwI_mCc?R`$3[AԺ/+ETb7FYɸ,̈́>eoK`>C_^LlE01 jK$jAn$5x--Ahȑͣ
    M{dR20g⌓|R J7$_wꯌ=9TC~|c"PTv(cOALn$Mf,>OC'j hV5T^::.Mzs̿S[
    f!Yf<ɐNݚ(rM~XYWs9`c6Dj%J1kF]Cl6v+bB�oܸ|AS@1ݑ18͉+9 Lԁ<y}͘585ttE^db©Dɨ쎌) ji21/QU覭,您
    Z[@Cpɨb)<6u)0� jX6f*&qdy]/ۍ잃
    ZaϞOXLFH	yO��QGCA¸ɨbIDW�uA[ɛJ<Zv/bVr1,/G`QN9ф J65b(f%HjHT͖WhnY82w`y@΋gTm:v\#eC"fC`S6[^a(f%cNGT`FJ,U%ꤙ3Kksm*@V0qѕfyY2i:頳'JΟ]syEv#GE+jPH#VgYϢ!~0QJQ2'el%r4_(Bl]q	PuN^U(䥐dѓjgJC_FuY!\0&Qt%v~6ok]7xiZ=*:HDYڕbf5x<lwUD8JQ=BL{r-QHSlb>W&[z[b3]4\$SQ{4;б:5DqxcѕuΩ"jv,J	}
    eUc,$F,vF҄atϲPN%͒JkШQD*F֐#϶GGa4|$L$'j5fg0{'j;sԑ
    arßNNL?iGyt:v~FodQ|S*{"M17ƌeb'	7)QI~;Rv~Z5z/3ў%0*).U8
    6~h4Cq:ݭfC^2ٖB5
    Js@Mg.LR5�7TƩJf0ٱUDϨ
    i>Ɨ"?**M"Y^QU"Wm7meS2n8CYsg4mU+Y}&:6lF}3('\˝GuݴPuFs3Vhf6C[:ڸ7!e;9 <I&$דѯ(CF[;ev>D0DD#NHGJ[Eß֜Ϲc4=J= )DMh9{uk?yAs5[BT7C۴)d+N$jqIO]&Bj?i*.*9LoV@Dx	I((drg^2ٖi|U+#j),eNR.=( )	 
    QsH[ԣ0;+Y j϶GDS
    ZD:#mӈaVr%E=Jl0	$j>ު8HrT~7TEԬ^6m:GhCyS;T ܬ<p[a+m!֎4cMD-ڋLԢ Fjg<+QsƯkO5lgtFW2-MC[Q3m`f;z4!x[^ B؏5	ئmҎ(څPQkxW?˧| HŘD
    wmDMY)iIԒU
    AJ0(5tu5{
    SFU:bKv1wG_xbD7F:GwԆ}?:QMv
    FaN8K"j;O4Ɏ+w<S&6ĵM?$eYn[#{nktJ'Oױ0NtX)u\X�av$\z1/e*БT%uwet%(=i3qt_u
    ڏ.Gј#zîo6EfL@żXԕWc5�'F-^|ǨA޼6l9v	ƫh
    Kpy?tKfq+ZE5ctߐ1s4?-em&)#|3Xhn?f`I|fW&[L:>_MGmpJBYH$[~}K-{oLxХ/PcoH@BԨXڳpڱӽsՐ3+5kCM*SYcl751ID:/~1{ʇNAڢ$vIA΄Kך5H>F{t|jRH7,4i.vudVQ@FQ{`T(TӛbDj%J1k0>zpAl_dM}9DMV@1+9#cq 
    &R[c3Q)ҳ
    'L;2
    u}3	;աfF/|ɶ<<@V$8bVr1#F$Z"UJ62.qZ6HԲ(6l j=bVr1.t-$bREJsxLI>>A#Dc �E%b2Gږ�ui)5{CS6qdCɷIW~QQOaּS6q$o|mi QQQ+87Z1eG6|tɰi5df͋@1ec6GNFA)3*XQfKI3gN;Hbi
    QQ[A(ѲfyLtЙGl%p}"tԑ(Jh%6zbҤJJFRVgYϢ!~0QJQ2'	5]rO;/c7/P6'EXy)I3`Q!/#̺c.
    Iq	8BaGnwhz#ݮڴ])!j}\dzx7\HY#j
    ws&pUk5EGڞ"�DFKot"vOeJߣ1<o(١[*W4Q~uΩ"jv,J	}ԑhҮ#j;H#f",JDtiʮXv.%5eQiDL%z1lh@zkH[XdHe(a:rIO:#jw#JoVvvpRNKbԟ
    Aã<:;E?7J2(o>ک
    CO`fS]95_R$&14oGO{jωUSvܭV؈O?4!N:NX\Fx@Y557-N_F3jFl0uQ"Dm OK<=uz'$g?Ýy8:ءDK jJdv&$|6gNʸKgtwi۪Vԑܰ=9pc+wtřQN;H EDaiV0 07$@6{Rq!M..@vFLQ[4Qs*NK.aJRD*l,$Zuv+ZTlĉVGzIDͺ|u4DKQkK
    Qmp';A"o]?OpвSBT7C۴)z8Y$a&Ì.Qc3(z:X]D@2@3/SDmD-\•X_Iʥ'0RqNHFgLR6OeC j	GD'"6uG۰WW҈vЛճZ,YqZDͮC�Jo|N&m+'5Iʻ8mi`mXPJLc#n/ϛ)fꋈKo=D{tV
    -?Rj:Bp6FCQtzJȖ!)Lj56Z0Q39~S'څS^ B؏5+lO6-nvԜE.$K>2N+&k6*n,ɏUŘXR~rQmiփɓ'gS&\4=F`0`tHU[׉wGfWJdCKϵ$|`p.ksCO	๎hO6S~]
    &jw-acj)3qw	UDm7Tkxb#h*&
    IYEhp퇰E;]$�aЋ""c،yD39T%I1>O@Q=Fӽ&f1Iih3HΘgڮTC)km>eWz/}8?eWDW^)m>>5-x񌹞h$S~BmchGWњ?]qf)ZEqJ솚ؘ{"tS&waYKo3RCp^LlҰI jK$jAb%hxmWe%-6O+4u\,,s&}+@oH@!2:_K{>s$_S[]eD:C16\=B?Jct.Jw ~ŒU!SbGQ4ZCa/
    Gvߣ+DHpe&C:Hn/)r~u5GY*7l
    YX4&R;,OA`L&*۪{kcBqX
    e}e]KK*سɨ쎌)Ɓ@Nv)1gis�
    4As.rAȘb6$3fLnKT1) [P5n\E¤ PLFA!D]P0J7Dm:5dT1̝o^@ԆRq7&p*Ƒ	B�`n
    85tp
    % PLFHB B+ZMT-9֚5{yqdy9r"D͉&tTa5@1+GM58V#DE"̆
    DmDs#PJ.Ƒ3�͋�u^7=ۦ
    Dmӹ^Ŭb);90J6
    ͍@1+y6GN;88v:'XTϤ0RB`G-Q'͜(ߡ]+r!&jƦ
    Dmds"]VGO%;s:{聭5wWd+:h%6)$-9y5H:Yf(qqLT=IbVO:Kd綒qѳK�nMD+lpJG9 /$T;Uz2¬z=ᢐ,Fyt%JGϫܿ?է5Dau$V,JQc<x7\{Bb|%Iҳ1ۘzd{OkV(Wk.g]qw³R[b3".`zXT֨=[yG5RUqdoCGQfQf׀h#ZE19eiWch5d1kß4(U/G؟,JDF�m	{F%>vE5)O#Wd",caC!maz#ɗ1+%=QcDmuB,͊^Tᒘ6
    ԠdQdbmQ1,\Fy΀PalK;mx;X:-{pe~DmrՎ/%JF\
    )A6uװj,v8]X؈F4!N28OUX\@e˼󂨩\;Q2#C^5DV?:L6eQ"Dm OK<=}/KnNH@Ίi;ptC@vƨyMHVcϜzߕq39\a=wNF̟r_:Ҏ
    c7vߌ83I3rgit{ݜgFˢѺA˫V!炭nvRɶsٱ>T1M::z%UJ|"AJ�K2V2E;y%Qꏮ8Q6H8[7"h1dpa&45qD޺~5UO
    UIi-Ehѯ`CYI&wkĩ]D dbdݮI&\Qpe9-lWvr鉆:=Q4$jt$U>ehGW@aڣLwIDs!ZK"DZoO#jQڻyZN %K"Nyj'-ϓD"7>'Q8Eu`]Wvk3zpk"9\w%=DѾɶ/λ&hHͪM=q
    $*3�$lh^[Jm֒Q3kYEʂAGLd_"T%5'`97Qb7WGީ}IG5d˲"燱aL">Ao%;0{AҨ鵭izZ;jQ5JQ
    =ۣo:8#D(AkOݎ7\gɲ}҂jGK
    )QksCOT7F\G8CԆ}:QL{]BQ
    3pYCdK|5iH\$O&-	DL~55]w8I^#I>CqKCJX4�g\
    ѕlo!fSD͡^.vp3HNp9bOZMYks?Ѓ,cE}+,~5'F-^<c'*ǎ?EM0^EkXDmv�-&QPs9E:%m$|iXhfq0q<Э CgC.rj"уQC!z1ѕj|~##sZ9TV0NHߐlns{m}=;;P
    IF+_clH;Ԥ25ƆGkTYeW~2ӹ(	SɇNA5XKCQǥHm'wZm?(NV*fђJ<NAHDExjx%}iDm?c(f%gwD`$cc2ڱfa|
    c5Qwna~�=)AvdM=؟4%Z\^Ŭ쎌)ƁHrn	bDo"?@ 3)C"PJȘb641nLnKQ>D7mjedKy j{�S΃@1+G;fH}!y7l j\J.ƑdVDn5{{SÔ PJ.ƑyY�u_opM%9@&JΤljqd b@N1fh�Q;"̋@1U#ymKC�lZ!׊)8ۤHM}?N'0k^)87ж4KHrQ#JMDd4~2E1#OET`FJ,U%ꤙ;bE.Y�QQ50DDF6;g)\?r`+9wnwkkي0ZDJ1ɪ{iq^4NnE|,J\_O<$SG2S5JT7#P6'Xy)ɳI3`Q!/#̺c.
    Iqaq4Gͮtl{^z]}!jE#6geiWEUFƻ޻T<DO(G4fNv3&fTrUڹ1}Y@ԖHhV-.4\$SQ{t
     \O:>JD7ކfm*f7̢D G QvX9<U؉Fit7K=K3IDt)[,GJF%~(̄o5dŬD$=YIZa8H:u|m=|Q.o
    \yň7HS7+S;;8@i%1m#mP(21NN?(ɘQ|3 T<afS]d5x˞$ܤ F&Q} O T7|Gfq.:2͋~08<Ua5Ie缾Y	a@r;kLdNgӣTԨb
    ;Ǽ1hhF4:LB6Ksԡ׻y="Ti;puC@vƨyMhIpLW0\ԮrXEnZR˷6ѱa{,4rVhQN;H uQ	w
    D.>><cZ[4}'-|o粵yka@$m7=ڢSS	JX>$@' ~Mè:؍>hو5:
    :ً|+HCLQ-O!jBa�{'HgX?yAs5[BT7C۴)R+N$jqk:\&Bj?i|n(Qb[^@M|z%�1DmD-kIt\AIʥ'8$@MJ깚40eC j䰁GDS
    ZQT#ѽӈa~V"fɒӢ%j|bKϚ{D^7>'Q$GwCUDj3EFI´qk_,8Av͹C$D|֢	-E{QZ4עSG5TDe赱iUюZٷ }<BG{eD͠w)#&"M	/*:CQ㋨P6!DMiD=c@5"Bru'NziV06tUdA?4;~MYWeMOkN'C^0t&jy}xGSZBmRŭ8R.9B~mnS<PȅSVkeK!jC>y'̍TOT=Qkqw	UDmi$jJ)\@ICR9J5=Ƞ	u˪s4ļG
    êZa3M/J%_@QHԬC̦ljC\&sA[hѽ2=iޕ{z(^p~N>t|}؋%j1NZx"ROҠzoQd;5xI-{Dmw5-=fGٛ5JLvia}Ai]ȀUNI"OR`|$5Lͨ }׽R;`Q!DȸTe,Y<wΡ|MmukIUpE<OsQAf?UEWY	{i<t/)FF	!mQ,Z@92y<MY=Oc&})Mecdw$EDjǘ	bDac@G-	LTuϜ3nQSHs\1giS@g
    <QKdXs.,(&;2FDůSMtLXL+QME^f^«TɨbI ׅ�u]Z j+8/&qdI2"D&T�Qļ`ceE*Ƒ񅶥!D]ZD
    D-ae0dT1 _F�Zv|ݦmq?ϱT1F\#N'E�TJYŬbY\ Q	e80фDMdV@1eGVF0Z�U
    "dQ.XY8TaY@fJ4l*@4)U"PJ͑[)3*XQfK	X~)?uZObm
    AԦ@:@ޕL'z[{}n?zlIW"#D+&%{FIm5K=b|%.A^Y*dlPinRC�7K\P4`c6DԺx/]Ī|Y0ƨf])
    g*g�>,+!j5~wb&#K!j2zYL4=Y'j3%hSn43ƣ䆯6g j$F튩y1j
    ʿ%6"vOeJߣ7Lr
    >Qc^(
    _ޕǎU;jQNjE^GAԂi&*cc@(Qx)W)T-{4%Ͷ+.5Hm;%,#QƐd>-4-M\O$|`&"F&Jډi'=dn=490ŀ
    :\WN
    �79[v
    @^ζ1,\FyP)RM1t	PsD5x˞$ܤ FB4Q'֩(7qT,a 9
    xa1HA|}(C2leԻɓ'w=AQN<P+=ehA}Fi2!jV%WtB{p%E(Nu;G	q022wptlpmQm7m'e03C&)Mf7kYYtk(F%MT+CVI%+yw]X$#Zj/B=0 j8}r}Thi:=bT*T)R^O O܁!,u%Ѳ4̈Dpp
    "'"j=3"d:\+J)DMn1Y o]?w,"r0'j#qS|$FTKWD!F/6cUhm̋
    ܖɦԳ
    RRKlg*J=Q5F`љ7ImyW2OԚUU.Q)�oO#jQ6O!julKt	QH
    dHdDAygI)D8_%!je{|rxaf-[F lJ=[Qr	DtjM-XQS4~mvi9f{FmDEoHm35˭W%1{Q;3a{iqQO8
    $jV07S5a
    ;8I7W-<145'QKV0NG
    
    +YUFVweđwOy_8Sbm0Q덑⹎pb
    9Nk"F
    r芓;jSdAɠMxg)ylXe/%5%&R*VQtzJ:PVOjIϥP}a)O@U${ISN]E>o!˘#MOIZ}<[Od[_64iiuRǗBi!im"նVO?cj>7D!ݢ%j}K_lv-:ը٫2I)p_^qEv)S4ٔzV!
    4afF'+w%Z(Q#gR8byߺ	H!jG7n'9h
    NRJtDp0n0½ld;MÉ=+ĝ$9kQ't+VD=vL*=no4Q-c𦹞]q=,Q!W@1+9#O6D`L'H_0`6l jg]+f%gwdL1dDj?&u^1ۚT)5akŬ쎌) jII:1=QW
    M%lyF\#sg�$xozM%ڦslY8Rv;$*r`66l j&bVr1̝o^6l#j0+9})Ƒ}G�:=ƘA�Dm?<K0/dT1/-
    $"R= j j\+lȆo"Q78
    ìy(lHB@.-"VpzoȵbF1l(6*uaߏ j j<̚bl:<88<R,!0[pCrpD
    Ds-t;sG8M}tNg(T83"7�P͖\w[܀\4Q̟ǑYLF,(jj4DmD+mNXy)I3`Q!/#̺CRU>Ѳi0Dڵ<Wz_#9:#`D])=<ui(Ad`jW6;JB^\yw݅i)f-ʿ%6E^C 0U+G)Hx^:V1/t|hɸDUgTDu\$##j&{xYSڳ!%%ƄzȃYoK&ѥDFæ!+R[HN0>~hɍf0)G Udjl$YgNzp0Er?hpI^9|˥>UAbe9Ϲ"oIey,GL+aƇ@ܡIsތ9ay6'Crw,
    .,1y#KX�x{ډd?{\|WTj֐-hH*QA.ꈥԡO)U1%	Ýy8mDc{*,6t󩍭[jռuc-}IK`gBIiU85Q)Bf_n!j;ܕk9smZDpRN
    #or;aUA^�uQ[4Qs
    3})ayi
    0p@g+&W '0dѲTXF^#p"[j*w¾nQ÷hi[Tne=rf'(+#8JoRڭJ8⚂ݬ>T@])@CijrT~~!<rg0L(E;D|'9Dp
    'bV-Q%BwFv5wʏtg_<\09Бgƍ!Dͦ~B	encb%0)+]qc#޴@-佘z<Q[!$-,6iZhDmD{쨍j�IDmX3,P<[Q37GrcgHԄ}دCZ;(1~/i4,55LJjsO}RFqu5%5{AzߞIQ%5MOepG-=i49
    AOrq0NeuQn*h5JP#q)W1cq.Iy_ SNZ&_J=T\pt sX۰;:Ё:U([ppOHG̈́H4-̎B+TܕGNI>ӈ2/h:g$=It;6e#5%Qo}_E,sN`u|d=hL&M7+;D}rh*-E:ArhKJ
    }Xej}pHȬz276w1h	=g[s#H}l,QB.42PDmDm{KE JRJѲ4kS/_&OrQ!|l
    *!jp?<wϹn
    Ì>ۤOcxDͬ5Y	Y3NUnBׯ
    /a9@CVrcm9vuXnz
    -$4z˫:wˍ~{w,PwZfHD
    D-Cx(B-wDa"TQl&QQ˛Qж1AfLv_cTYqk:4(e@@"PLD5c"0Xf#=QK#o4A@fbF1'0\ QB4O>ɓnMEŗb2Gږ�ui)tCذ^T{q*Ƒ&
    $lPc"}̍YKD\#%f|@"fC`SɶŒG\#ŧDn<tS6gjaY(f%Ȭd#DNdQny1+GO;Dx
    Dm\"PJ.ƑYÏfG�:;۝pSD/bVl>vppt41bQ=(0܊qg0`kSV#.yW2PΞ8-NS_k4ݿ~p޼gFy	$rTI�P͖\w[܀\4Q¢l3,.9VJ+#ߥ=v18$eYz(QJG?QI5yD5I#9:#`Sz옮{x~'LCҘSGsIlQfY9-ʿ%6Y!vOeJߣ	B5ᅎ-:=vj%\EԸ
    9E:0vJ%Kyzx7#j(RM4Q3pܛ5EϰGDtm;%,#tG
    [I뉚LRgs8vңOQq8v*ہMĪpBhhslE@:97Q-<bH5T5Iph9>6=tMpҭ{Blmlda	's`g֠f3z4٢V$gD-L4Yc.>;Z5$i0¼+!jV3HQY~:ꈥ1 ;cS(
    r``<A	UmISۮlmZh1(FZ֎'Ÿ旝#k&~Ce>h6FOXQY�]6(@26^eQdjXS%Ҧ>I�gJU0RF5`d?Jf׼DD-ڑ@1-#ႜUM٣Tf4vow(%:ɴ`yBUyE!k[g@f EiC8Y7a6UGAԦLM	vȔ"t(JDgz	k$NR6;]<Q37;ya*iMu-	X|Q3�EO
    :Ŋv,@gbrD4cDIDf'qfjD;MDW=:~Db2zZam!_sԘ1~9MJ5q"Nu]Q3<sp3ȡD-[hPy;+Ģ+̢OSժiFB	冪6&2tCA5MOESHBx0ԃ#UID06Z6"(r;j6mˈ#q.IyߏT욼Z0R>}y:jbGmR_LxghJ	gIy&jWVRQN\Xkri3nytXQ7N|^|^0vc،y
    /bpR\0!jgeP[#Fe΂"	mIMOIj/i}> YO!2Dmr1LhԺAMS3:ACԤ[KR4]&,:k9d;w�;f
    .mmw
    jS|)ZcbTVC*l
    "%X˻\A"P7(1ϼvE$Dȸdn> 5 !y4Rxnp ZGO4Qz}6wuM<;jh(NF"9i	';w4?ޅp$i4t-^Dm!C(f%gwd"0ڡǸȞs;0z>,jl*@Դi!PJDd"K=QW$l!T͖WhnYLv|CȞC
    8,٠T͖WhnY82w`y@΋gTm:v\#eC"fC`S6[^a(f%E�:/ޛmSɶ 餃@�� ���QCR� ���@`-400� ��� j ���@�,f ���@�D
    9���@��"�, ���@�!��@�� P@��@��5��@�� ��B��@�� ��@�� �B�Q[h``�@�� �@Ԑ@�� ��X( j
    @�� ��r�� ���E�DmY@�� ���QC� ���@`-400� ��� j ���@�,f ���@�D
    9���@��"�, ���@�!��@�� P@��@��5��@�� ��B��@�� ��@�� �B�Q[h``�@�� �@Ԑ@�� ��X(+k
    h����IENDB`����������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/manual/����������������������������������������������0000755�0001750�0001750�00000000000�11506604176�022550� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/manual/images/���������������������������������������0000755�0001750�0001750�00000000000�11506604176�024015� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/manual/images/chapters/������������������������������0000755�0001750�0001750�00000000000�12136042273�025620� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/manual/images/chapters/receivers/��������������������0000755�0001750�0001750�00000000000�12203357067�027614� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/manual/images/chapters/receivers/socketReceiver.png��0000644�0001750�0001750�00000033333�12137256617�033311� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR��t��������	pHYs����>M��6IDATx|UrQ!wTpVz~<.2n58HX'1iYd:U+qp
    *@f!%",#-_"ԩWWUw|t9uw: _z	pg&".>]	$qrn7J*!	x	/kLF -I{R!μcxœ˫dNwhqkpdAj;;;'Nu{`@I*И].D]R˒' ߡ$qgK.GfQCHh6f!m~aeτM7	ŀZwaHN?UPf&JjӘԺwԾhbF?,pj%Cp6$c'6J	.pz܅N~ǯr1BA zankɜ	,x
    `1uօm0v>pf8{
    ZP@L\GFvO-$VjIR鯔Ԑ!u'wUnP
    1R|7Tz5jhr-;P[B[6\߭w^ԒTO{<7.~ᆱrȭeom
    "TRVbfaS$X}f\GF$%>q
    @%>!ĕN&Bq�;jtk{<٥Iv,NxSt6ͰG32O©M*v	FеI---mnn6vWU%J,l%i\&$Woy3AӗIjN'dpc1sn4tB8c,Lac=U3!Cpt|b=]m MP%5@ԾGNX&{5yQٴ?ޤ}{bR#H:rV4FjAN*mhL&f1tD~PN$Zv!"#O
    Mk)|e*ғT;p'O&o%uI%ɓӚf;ZH꒪fRZAQ2¶kd4=$6T媁<.HbMJ;豋%:9w0nSqoBx8P%g\^*e}.ޥ=|c%ySk+S]]P^ë&-T>_o>wH@9dK:Kp�]%WYʕ+yx	)늗Nto#|5TPF-L,ya4/Q,	f*D2"
    ϵ^{3T]vR#4־DY_mfB8__\7"rp7JcP=%zwDB/lta
    |}=7lR]hic:$95l!wli#Χ8DpZw9^<Np򂰓9n,/sX2NͥΝ;w-i* Lq<nZ
    tRpHpȁ(v0~ƝHJk¼0=GwKwAaR\0_y4IU<<sS>0zhT_?%ΜB4UʘC{3LgzDvgE$y+̣8$){.aֿ21Rw._I=ؐ'~ĂB9n=3>
    ɭ\La]!uб{w;gܺVTy#J
    ڌ´.J_12UY3{pj|�U+DSb2x̠Af'1}Z'zbͦk7dt#B$| Yr'74|0J8_jl
    'ǵyی’L(J\+ŝ[c	p*Dl-lu>+Ld$kvuw{90:=r.cAıíņ^p/xPd,T="`֖6_f*BG25�c=~^^G6DGaat#\p2�N	PalPzD	}z	U|Q[,IlKTKJ[67|3@<_̤535-k
    2Ւ']h;ϐkOW~Eݽ}%%>lQ8aݝ&W%FE-qo(d9_1SMض?g&/P25S!Bb	x?|???ܚ6"ٙ
    |=n~,	Yhߜ3Fzj~MtT8b? ى6_ٷLl-䷲2#Q;I|j3ʝOt(0}'nVVt+L_%~;q\2W=XRih,O=Zƅdnlc@~gT찙m9;˟y=c>!/+Rڠ0[Urp|!=`!0HQH {;rg2atPX_AmY
    LMI&/Β=݊$Ž sg�|4g*ڼ|<\E36#`8ļlĦ`_%D4q^N8L5F,|&E7WGi0L`V(hx^I6K&/1l*kFJXzjt"CDa2/X=C/}[@{H6(RFQPYl7Q2$g:c󕒂)o%6ͼۓ|5l__djgUL|]+`&JO=䖛	e}'_I^[drs/-SJ`O7vYK2U5V'}KY	GC4R>|T}4%	qe#;pySN}WkT3AE_"p{\F|'E:2#ss]=q2PW')CҏMy<OXov\]_Kv
    >']*ܜi	i�VByELP:9ʡgXş)
    KYru$8ct;l4TOOȒe>E�" ~u1SSa
    B%RfQSxq9ȾƼhhWj@Qf~6
    H60b.f;2G^R72uҤI6!R;g<C$ibu2dȅ̤PY,(K:dSE@qe
    g]&_-ĪrqYOR`TH젭)ZMyT3chJuMR6 "ϔ+G0.N =;e;~^هR?y�^H@fq|L.<RY@Q	ծ&|k3i2uR?!k2fu[^,̦\!A)#Oiii(UJQhT\AU](_.uK'֨QUW-쓼K͆^YTu%ӧhHd.^x̙G}4�!d"ovWUs*?LJ2'ҧ#p]+;vuy?#~z/?Sp_LA3zazF/4TWbT &d3xU?iuz/	I5+~g&hY]LjkAP>y,6()ufB1G~;f$,u7҃l!c1WEYO_-\rdyw<s>4su}b60"J]eYѐ/U,n2@1WO^s.Fii>_A)K8䝱4;έg<絈�ɋw6nrjm5wԣ6{NsئhQt1Wחip扇G&aYKo!
    љ<Nkv�Pn5aGs;h\AGp.(r=v0hVϳEBHifmY$
    sH:wb[XgehzVG96@LPU(^q"-@TL{
    ƖR w1LEcA�}dsubUzW2K-zNu&;B5:]"W@MtxFN8^qiU#
    s_VhYh wUϹx4h|)|M(D'IY%Kg۴�5>j¦-zAhUm}kj\aV4&[lj]Aqgv\]uaj*HۆR&#+vV[ޖ5Icn$JkkIvwX'w#E*-T[]~7;6*jA}ex.Z_|9*ky̫F 5P^'^RYeʦhc^}T)\FonŅDuNf31ɗ�TK!.aTrٺcN	3ptbm
    NSNX*F\4L6Ayc/6L'Bk(Gs!IڷE4NQpGp8!oJȩF>pwbGjԈGb6и)o*H<uikQ'V"_W[~_zTV!"#u]+𒀙6P]8%o8KAuMœHAuk$ۜ&/pTW$=Pk&	T׌fڵ֭O(ϲςޖro[[Sd#.^yl{y@y,۬_S^Sdv$Uf(Ǐ/--%f&(,-o!ǽ-ﯿ/_Fp)':KDȽ5TW	BOؐԃꚡ7W:u*l$z	\v-gLEw&5G
    IG6I:l6İ!	?x<W\9rw󝒒^TT4qD~zAuk8p`޼yGӟDmԩ3f(*RocLjn_bzËÇ+ot Eٲ5l)B
    c˘HuE@$[P
    + V~uewRքhw0m33_WWvSn@ZBb֌Uues
    >_-RAvrr3]&>'o|9AZK�xsyA�wef쉀DEUA>$R[(?WWFzwVK+$Y;`h<
    ڡRյ:Gs=(UU1(S3ŷI1O+HF`.XP}FE#(1Ղ8PS�?H7 w<vA+*1*6.DүwAp	5w^.Q"NY	1WPx\XiK.᜗a~uE$JP]$k^]KKKͤ,&!{$9r-t0X]r˫z`{{*+ۅh>+n
    #+Z[77Qrr'g+֕rᑳꠂw*_S*\*olu
    uf"F
    $S
    vsNO=n1f3>jn'pBqAiT{UT}^:J,]AÛl߾=V]U
    *0T`ԥj Э\Ub_P2r`EkkM ݃d:r$+Xtܹnh6W\.P]g-S׋/fRap{<i{I8Y	l�RQ	&&metqEiii<=)UᑳBgEErŬY\]qZ*{^uRc(b:ʕ+fRaQ|=GrT&Q3p.E/G2ϛq`hfY1UdaVT<AoYˑ"ȤI>l&߱F]qH?bg?O{Ȝ6On/fKJA<-P׶)w"$bIk>$Qu.zRuqgKɸ9lE	U52bM!�8c&�To]/c5oI!HxHį˦
    o@u|;S1~ܸH4B»HL
    A)n3k+QW<o7BģGR3fR< Ӓ6z
    TEZ	#fuAf"٫$cbSjތbyj=ZԵlsf"O{̄Dհa!	A4`¤Ňqz:NNǽ\]՜|1߻L
    ATto^#H?ˋכx`dy	!i&D-{
    -?1G&\3!su%#LHBhb"x<a{8dHŤ1U1QF#)1sTfꪞw
    .n];":u?cU.ݞ:O]eոE74xɔķ#I8VqUrQ^2j!T7D680
    fOarpϏtI"c~s̲Â$䎍~RЀk׮]n9زeŋMlGx78FH$5p6gk�cæ,̓ybTwaFl!W6+VzN+1J*۽Bzۗ_z{~”o*6L6rAa@p'r6kz*aѢErKIIɟ.^HæHV'*NLQO!"ނբWxЏYq]4QY:f[lC]GG@
    �zоW�G1AsW>M ɨv)ݬ1<w̐Bj:b[iAe6>ZRJW”IVZ~81ϽQQ-=W7ԇBX@B򮮧QP.>ҥKէ+w+ܳP=U)+TOfF5SŤ
    菁f3p@l6-
    S"쐪�9X-XNL&66m*aYeqb=h%pH'	gWð`\I.NnX&zLf<
    ѣQ[`GvjA|$i*oSdvP%_eTڷP^U!F83,ߖ^qc
    .L(E>?(d[7Xl(0L&1𽅡m4bʽP::Lԕ?T^#̓jv{
    5t�8Vl33H
    �m>LwJ}|S^9%-dL"~O~O>⡫/JW74BjHeV+aD֋?U"tKiOV6TK4o�+]D]m
    9 iFؗQzjoiI:yo%bp*XwuM^%*'Bh!&J7H6S`ªH1;wh,$}W}h˓s8;s*.e]GCLf
    !oJQ aD9'l+#$yjxCafu[MGf{3�Y4.i$݄PU81yc.Uڙ2vWt|a~B
    bp%|R{Bc+CTh,;&m`a.bqtNh|#NTev[pZv	]n9B؏~El>H�bFi?_(EC^MIX
    +s`ӿŭxz$(|q᳊;Q+QW3TWD!%HJ@uEAT><In&X	+d
    }z{=fK^HP]|T%�45P05"*zCn6P]Ǐd:mEu\P]3YK#c[[SdUgV=,oE\<6twgHCyy.̲Z'IfT5ԩSy{Hs[{8aܸzݲ澙.-'k4Uq7ߗ'&p[ʥƭq-䰰W\uVIf(k@{1PTC[Kqr
    2*tؖ留gEkS)�ޚ@IQ\46I�Ô6C,s?X
    yb!HWdԀa$rO/H~rwC5-<#{3f}J
    $=5o߾y@ pM7?//WƆ;mFn{E~)-0SEA}>H-  AA,kμcUAe&d8
    A"F&|nz|c7D@㪵de]Q+1ѷdgu-溨3J6)ubPAjIZzʠ\eBkZXu}`3UW2#\C/c,E$.MvvL@㪡fV6<rqݵ]A
    pAbQ)}*ԃI	u˦^ot�hPn_`
    CC$W.Jf+
    N].)X/k|w0h\5LS審,ZFK:V$DlFIAGLՅTaShHkg9*9їXUq2GnRzU.?H0)2:2-}G&XAE%ȕz`ՃvHDи2Cz`H<#qVQUǑTBRGb Y1uJư6#D/+ XLN}A3E#3>ܹsv#Ӎ+wqǧ~j&'Pl~A`ҤIF곖u?+WBxN)p*G:
    0`*źuW97Bbl6…y3D<%;)W(D2׸\ҥKfV9j[pZGNXE+BypL
    FŜ	_ݎ8ʆwG2n{G5L.Φj-[ъ/R2Ը>}LJ잪b]k*(}*+Zc!
    'T)MEN.drrr^~<USq,A{HLz=Ç	Zje
    Quhގn+FAĸxСCy睉'ZQ͓EՎul7g\f #/<x,%kJ eE'kf8ARdqMd#I�*H4ƵsɁ@`ԨQf ֓Mk[[۴i>c@$-0˚̀/L,2L,
    �D Ց	�RC EHv+߆7q&+qbMXGͤ0=tW5I/3,祟?AQ=cCkIy˨F@$M欇LA$uui^ޤZ  H<}7,~j(OJN)i  Hl~V+LA"uqgO־\� -+Ra\/iC{`B~;Vú39׏ظӜog"I{nXfrb5GѲ"6©w`Jh\vԴi?3AAm)\셥be\в"66υ6XLAzđh:۲OApк
    J2F`qjmӦzK'OP b%kdnF
    ,0~\u罧4ukgV5A*&͢T==pxLm IJ({-?/ջw^7P b
    ']4H:ƸSy~~q8 #8
    >Om/9 2IW[D&]wݾ}Lb&n<;$$uXf\cw1xl5_?Gev)wи"/J~/8pK̮@UXX|@0_
    '7]Osp505!inO]8ѩOQ{<(%H/6'''M
    8L3~ԚʇCDl&ih?}�?<tqW?nM5z	׳gK+O
    WY b݅oŒ~B؋iƖ9�XbcX{Kwus	͛7ກ/SJziN]Nl	$^m|aƘH.bY`xe&oq`4}	0ׄvB{*tDӮ|gokюb%s~@t1OH@=Wt,-!WE ?aIGq!-$(--ݹ`)c=e]8WpǦ`ľ9I^[[[}_MCcBzPl7:4THBKO1'XiU:&;F$&8B-PN"F]փM
    -%D42Q즯_iCߩ`L&b"Q:l=*;ϽQ:vV0dHtj8d{$K}IȆ6
    DӠVDMBJ=G8G4$窱U'5Pz0()
    (QpuXxw%P"muvƣME�~yC_|ȑ#]q]y^%.ON&G�fBqrpJTG%'R+
    GUUd�Zm*13]*d]dV@+|z 9QFFTQ)Mc g4vJnD.$1	=@O1F	!
    k=>b&cO#iFl/#`07Z-H_`’qTBiua%;S쾽hϊkڸk^�R	Mx`/Y_z;
    LLHRUahnK6!°y
    ekI&>,F8�z魒Ln~SN=^zUN`lP;TQ%6zjO6Z#zxTroMeK i9;7χH@VPy;"cu*_>9;m7ZzGŬSTO&LT3~\逞h	p#
    CU>KLxQ֊^aʓYq+n[ i[[?xO&%IU	9${T!>vj	WjZVf`u+(	4(۵5Nk-A7L^XSZBאtʿM3N,Qյ[q#S5ߘeOJսk2ǁ1D>L8&�vR>oҋ=ڧC{o/`3w.:JBNiDi}؁$(/@[o-x}s;=}g^W|~
    7
    1ELJ)^({J6䨙G4_#*hI:/c.@kEԊ2'%{f.5ᣄ|W\`SWC#M,c6>L\@ߠ3 k&V)VHGU^J<XF7* n6+@
    0 ak8Z, #yDG\+AP2&sClOZ�݊	":
    8D=
    z
    s7⡫]9n9D9E&I'GRKVGWKˋtq~	R|!GsԠd$%ƴW$r3T\@:�
    ZO#ަ]b%rv:
    hi
    ]5z'k%7
    %a*b5y%,f/DXi26v8ԯ- iF@xic!bLE_f3盯/ڲ*QѤA3	o#]u,pL
    DXLx/7O1m"FUA>5̬kAA5Ě^K~2VG#ݠqEĀ^zLAqEAA  AT&2hР~ARWbe5Dl6d1h\$wUJ
    8ɓ 4M`WA4pYdY5͢"qEAA  A,㯿ڵk3Y3-f@ 	LɁ=Uƕ5xAcoM*
    dPaɈ6ܽ@`Ӷ{jzA@ 1ΔmQY5Dmo]驿O=5_SN͎nhi-ԂΪ!FS^
    h\Ĝ̲=™Qۢt4vۨywi%wa{<ӱ,S+H aA 7n]9[NY v/;.4isP(xH^fwŎ/*@UF~	W=uΝ;RhniwRrU>F8Y%N9 4b
    G0\s54qAA`LAT`Abի�dbAd1|p
    'ү@ H߿>8~S3gȾ_|顲cE3h\	={>|ʕ+7tS~~DG}tf A2Ə?zqƕ[F>N<__ַL'ZPI4ȣ2Onnn&F>.]_!_Oo@X{7lwygQQ>S[!b|
    ����IENDB`�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000151�00000000000�011562� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/manual/images/chapters/receivers/serverSocketReceiver.png������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/manual/images/chapters/receivers/serverSocketReceiver0000644�0001750�0001750�00000032623�12137256544�033715� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR��q�����T3IR���	pHYs����]L`��5EIDATx
    |Tՙjh2kIDo2RdE +,,).X0#8E!)G	K&,Yd3S:PJ-`i{s~̝s{9<{9^/a0Thk!4&dPyzLTu⩓Z)ۼ^Xk'ǫ�n!i|u(tR'yT0n7nyl0w+	<A3l.>_$U$BnA(-MDVRcKxIvoDS�>|_yN\j&BI=@QRIMCYRN
    ;g6<8m<ϡ':5:K̟~4Yga949;A4;ÏZLm2" ؅=
    WdڵkKJJ<|!Kԣ9
    
    FQg�NUi4i,IlsDeBeRbdT9SSSIg8[ Ķu4hsx<#GTGlS<H[jYT}DEF찡*կ
    VYnr+FG	~8^~eYs!W=aIb,&Uĉ)nw@t	NݤRvk5\sA]fһ,6!)u.#rH
    
    "pyUZ4HVLUaҤI~
    IUBt|0e'8|4g^W�ф0v=!u|IMtM'$p	71؎Ds$鄠
    5fƺݱ"PTx~SDB᧖O'�#IA$pmȒK`#2m9<̦=	#(#U
    7rzROhITtZ&N1I8$t>9eP͛R$+~K'AN�͛7Dx()8"ǎ$uҥuuu
    A;]ua$'/q<qli:Xz	^
    ;O?U΀K/!%Rm55^Giȡ!�c<;~Q
    sNpc\Y-s:i66^ycpតS,tH&!k999.zMe=I#w93l[ x)WZ$hsו+Wje*9~
    &f:Zh?e	"S!pB2LBMKTh-4G#L$ʄ=36b0_cyYO(V5[onuq$Hj&I|MWxZޮE/_=|
    φ&;崮o=lưۚ$zTnrsupYm,|%(ww*PiA=F:3a|`6<D(I|9aQ*e*^O$s2Y6a.rHCゲ$a1ԻON걛nbeT_ׅ~Cͦ}EK!Jҷ8[%S!IM/+'_.H|!egtR_)ˏ�GÌw߱#uѢEj|J J(Wу#pS&6=)?/^v5%aB4<CzT')*?xb'ORJձD<+=OF=ȇqr gNo^չtD,	'6=<z[2U"ToҍVandIg|')ܓ>If3I<35##Cj&?ډ"mٜv;e/kq3L!i&	`Ne޶vSmvTx{6h|f˙KNbsmV)v7_xƫ'=붳IlG"96QsI/-P%{U?T9=HU/�df" [
    !	' S Gӄ@&,6ȖƐ2S!qg*L_Zatяp,텯	ELQPԧ8uXLGjbFKa~)CQ#N9
    L<Fڅ|iH�i$(qԂ'zOH#!rU_Dddd?j5z ~:K~\ׁ_>SRAX:ecv6|`i:Wf͚`!�=~I£P84Rl3|C
    Hl7e3?ߵ=f/[k(3rmE/M9M;T�-FK ,Rj[@Q6HLuL\%̾ns/ؖ6'57nEJ[dSvlNDŽgK}LmrHͥ$WV
    SWMx1]+P:j2M`V1RPH:f[]~g2vu`hFƵW?{W.g T"[c>O=Zr !zL~TrD)A'Wt+dcp_*ngv}/x}d	=bG8;KrT*4ͫ?Ǎc(/݅gCD\WL*6v58vkFv	9@]
    ɰGMyF%Y;")3Xh7&Rɚ o@<QRB#1s(0SXiՓJ4Sl`4.xfizh&bճQ"256	�SJcqb
    BWI5+SfmeϲzZI,X	tTFT+HvF%X08Y|-wu[o5o<MDZ!5RV677>-Z$_@WFIEgj;C]5dBOvH-;;t(X&κ*b5^l6hvӳf9[8LUUl&gu>Wag9s_lȵT(cfLV>_.g3-ppYQ$?�uL_\ek\O)AEE"f8EQUOIe0ЂO2u)er\ęGwʷ<M<#/q", #E0JW顗	*Wtpbh|$#$:=jԨ́t,$Xromb]
    硴,y*\'mݵ@x*処IW%Lj5.ͅ492	P,#RHu5%,C'-s`5o3((/`񪲂zk;rEPZZ@\	R_dQ:I"H:ՈytuΝӓR)n{~G W|@<$[40T 2�=!Y/Def
    h֐e^�(
    zb~ҴWEzmD&̕u7<+	dfbvuwF㢆Ho`/Rtu?0$BHD;@Bz//}*#H5ՏW&m
    I~8xGO(<زy饳H"i,zKO4՗gxaÓZb2@$9qASWf@eƓpU4MM4uu׵N!a3hРWdn/3i\WN{+YxMrI\[-ױNV/=, wh
    C3GJ㢌Gh;;r'O�>}<fvrn ]*tlnQOvuvu]m9M<rza+!5JWPXr1C09;HC`l7fQ,>j*Z1$b=@GQJ(/9Y/ڭ\JA]s}{osy<v*//^zj SK9ՋW):�fBtW0\p3Xhsbw>	<`!(}apĭQQv)w:݁k
    ]Ͳ9|u]CvwXE=-mrBX?^ Z)ĜK6>[N'Zj|1:7<fe.M8JUNb}smǪDrS2L欠[
    uʠŵkD7QTѽpBʕ+QWՑRbcXI_dLhćqj[R-v=:Mnl#hR)Q	8ZtwGoDKbuŒB.`*GN%sA,K),1Yi[`v'mmw(CSb<TƪrP=L>6ܑJPz_鹯ujqDtҥK߿;uJ[m`e{bA<6R=6SD
    mn?U5'|TÔAj&թtON]C&BIBrH
    x8~ooEת$;fKp{92V)MCT`wF+~t2qPR}}}:#EE#*t.R_`|E
    
    ],L&sGVs=
    [B\f;Ghl)j'MR#65BPW�J{	QQe,vLMUDM4RB *}FYT�}
    })6&gF_CCXS٘`4_l}�Qu5Yti]]xXQZno(n6Ϯx*i͇DҞoG�fhj*hѢW_}UOJnowr>J&m~4hl0F#plq$HPWƎz߻?Mɲ/CXp0dܸqDf͚裏u]JΝ;/_<mڴѣGgq(
    9\D1ՌlD&G$*CU"&
    `PP!
    \Θ(* %m5'~\^IOAtE0eE**)\6R$*;dE1e_Qn<f5F0=˙bű`vx)]J5IAqGˏ`ƑCvOV9fY۽%E>I5}!a9C;^jjQ�PVc3{txkH[_=k!UسA"d	Z~_SDcKY>hsX/궏#}MetzIe&2j\>KɋK,@("vk
    iY
    |J.kAU-aWEZNhmcrpteZ�jISXeBEԱ+/)ʧXtY8ݴ
    D2⪨**$Q[nƍzR#fHjbY,!knȩj󒦽`I:ܝP_PrLR`*5zhs<\^e-՝tXPTO=5kZ|r=5b],# 
    tyB[nϰ@
    xI&=ē>q%aPj*W]F%Ns)i5UYv}E>$yP׮Ke$6RE}'Ɛb/u,6	K'}}sh\zR!b	*~'N)mKɶpJUd0x]tY k$m�*$ixXF@D:iҤ'jX_h}WXc{y4;]eDS-$Ăo}[a'|E8hPWWZ
    (K/uu6aƍZ&Q
    g8ܼySĂ�((*?~\O
    A˗/$7(ɓC 1#McϚ~p#ԫ
    ka@gA̭maPrEmٴ4B0 1v*JzBS]?zzA|%$sVI)DW]H2I);ej o{a.=!Eu$=@>&W3;E_Gh)e4'"Hؿ{=!(E]o$JF⹚8I$\PD'ZSbBs$?~7	:fR$e=DSQ[6/=]'"N{Nr՚zƟ!b2@L/{`Q[45QW{-_MUA{gGGxwk-,׀)-{{x3s)P45QWԬܼ1}k{�(}-z&ԓNA4V)$իH1$HȨ)C]PQzR~ӼzSxh^=
    ?¬@2
    +Ԙe&n8ljPESdYf6Qy$jKN2$XEؼ1
    lBOQ"C4	f"HmyPՁcETFRؓSI6lXfff/x>�#( ZywDOQǐ½ݱg3~m1Gj^@_YaBݴ.&nrl6:;.j�nk~ÏZTƇ2M[+MU4E<
    ,84|_`9C]%J8؇`l(P3L񳓇=&IT w59Q	\?ECP(dbNb	v䧨IĚBeOZq׽Ee{_L%%VQ].V/!-OVZIajq7}[tL+D6t@,("1%(P
    $	8
    O_\=/]$#>wy' 2χi͚в%rO#OK	!œFhug 4w+tO#6M*Cj`!-9PȒ
    {9)tJK?e=sXM{cAO2+Ċm!?~}ءh![JkI0Gi
    _APJr
    W&pYmu̲Fՠd		AF
    K)`fH	BGۧrJh#bso^le<lQ1)0ܷχXc
    5TQiPTSgz0d.vI;<?9UT9٨nXMԒ*8DTyQ`ucvLÆt@Hߊ7%-eq0VhrGc\	Ē[!_
    Lquic"<@ʒ>1b3pz`$NQc²T[PrƵ LwIlg
    I*iݲ)+DE%]^Wm/ZI|Coy
    Nl,mԄ`* 	u0Q7p=[(].-*cU%t^Ag
    @F+p7vҥK|mp֓~<үy%9!ʳs*6/�
    FlD)9jRHD#M_ӗ胣\.AJ'iJW	P-$
    [8(.qISGerbÔVty$@͛e~V\?%�U{#||_a0IU@%UD'Szb	_9ZOAT@E ͣ|֭'$|Qg@EPnjAhfRFFKIСC^řƁ�hiͼ#hLŋ7vZ**"'m!C9sFO
    n I�**$Hkhl=1$PQ}kMv_"Pl,6tuqCf"8FS8C‰'JKK_ӧsd7ZrqsmCTBZFNW=4]p[D5T{<5ayY=AM~s:SPSZ_%c1 , ]9&"!D"ٕvcqh,xZƮJ#0.bci*F"55#r/Mh߱*9&*SD+|ϴB"5e!}Q6ދF#Gn4TcaY&69	U4$PQӈ{ch"1aջwr`WB|&N]0w+:IQximm%=~okzA WUpv"Ǎ7sJ6/njjjVd$6}9oqH}__spphDd;KG )s,bAATAilSvsΩoհBjrLz 	EbH/0"m4+|kTwzx'JTIr
    JP;r9S,G&>NNF 1EU5l>i' A�U/v}BThS[pJ^6{YN	n#ʠ$lN(_^3bGA8ZQr׎8Y~i
    PU*oӛРWj@*I>C4s1P 20XPRIЪQÌ'hScUVP]d`-)K$HʈnPZn,VCIbgubme\Q*Uo'J< M�؅w^$(n@5R$޾k՟~7Uځ&m* DIJ<ȼy$ H/<xPO0H2lh\`A*Ti]ABy…W^L	LzwU#A2̗aO}-
    }t*/,7{I'e"qI#V\85k˸65##_um/s-6|<-kwXfr)I0
    -Yd>uݶYoK"`qx*lNUՆ_"HZO?x<zQ#k˸gOzǏ0all5UEbRRU$xXYf	;n_#+פq/*>nĵ9 �PZZz9˥'MSLqݣG֓
    }3%SuTdZdHgK.B$U4i?C=eM%uɟ~iff, HڑskzH&ݸqCOA$aAzHb:AĂO?ÛW)${"=Y9α ԧ:6M`#	"#Φo H6S׮]կ$4c +F)Æ
    ARM
    &xq,iw>ؐck8A='%~g5\ߧ	l 
    WР1WпʄA}!ICl.\4 X
    Xz@OI&bbS?vwΟ6A[A7!IFmjϚx~_຃ j4!Gmjۏk﴿oA lxH*Mq;	"%k殃^OIVfSc.x0|ARÆB(D$&:6bW]ӄ"( ux|=WOIn`SWLոq. G`azHMtv??8 Hqm<!zi.?UA>z^,#
    jMxr++'G:,< .4i'7UI5Bg~j
    *OE[ [9Sm/¤b*:!Ti<gWw3TA4r¯!;_$ͦ?$)999qos$gU+7Fޣ' !TI222]f0^=vOqos$ܑ3hSTܹs{S 2@6*t"1@1Yoزl0KOTᝮr!NV%:0k\,s(7
    bPњ"q(,LX<$u8@
    �=	Ig;`Ƙ<|=m3\TĄX%]Ǖd9ܶBouFmbCpt9IFFj)sƍ/ ͛7^|8O< Jvؿa]~aĠA	xsA4,wziS?9re񫼎Uj!H}Ӽz%]%'cAٲ-}GNwyujA)T(V<터$Sמ"ڶ%sx ['$@ ~*{b8@@znGxlbJU/Ypo/))ٻwA49}w朄9jݾC!
    nr(o=W3\�m'bzi$bg}֋Z	
    'u*C>oD	j	s$@Ӧ(wRX7I|'ԭn!
    ycMVo)u5}гzSQ~6ysn|}T^*6`L  nYjFiP+Bc*O3THk4|)NH0;-}!]>w{:{ӪG~GgDF�R)φ6grΗKT'*Cm`�	YY3C"	lrI`HHlǪIi4FCTnMCc-߭kՓэ'	ؼZH#gߜ(	G}H%nD"?	>cñ:	բYԌ??dYiv?;4g9-6k?D	ui)`!ؘ3#3Y]?ӲŞ2zV9;(JLl:[(R*OH00 �9(ɯ3eeܖXqY- guo ~CU 9dcGv5m$*2T@fNfXlwELww@@2O^DvNS
    <P6X&xJ]m3\bHdɦpRl*R166Y_e
    ᾤ4no_qF'%~6)`CyTz{,wZ6(^gz5[nAj,V1hРk_s΍=Z&L:%%%?
    ob/Xo*Q#33!Qz{AfH_|&t#-jWuظl@Rx=6fٳ\]i*|F"*7:T_߰
    >Te
    i/pJ
    nڅV;lg;vBԡo'ViR;y&eÿ\}n:d<x_ꟙm۶Gy$Xrä\N9:LExɢ<h72g31[ωSn̖ޡjMeQYytXrm|%Q}JX&x*!)a.7֍C{엟Ik^ߊZL*@*ͮ*M\|VQsq܅
    rB	{˛Gma`e[e&:GIސ�#g~BDp]v=:5cQ?bY7wС:s˗/+A!5;娑PdCDX2A~j?#$oNu1YdKD-H=.:m<6[78QkA`$Opnߧ
    {exCφl1DVRֻ<-U_O~fDT̍ Cf޼y䷲pʦ_7+~`(!NB068 Zs�]$8##{SUd(] <)ك4'. 6IAe%9s֡kw$":ŃIMЦ"LQQэ7>(!b0<T"b4'G@ HȰ=CbSq
     82̙3 m* !CjvLD$|Ц"lt7*1I[$A  m* D$}GzbWЦ"5vΘ' m*,'N̼#5c<gh[+Apd[)ͅѕ(/Pm9hS$E q߾}gϞ=}}
    5]�]&ѯ`k}3Ȧ2əNu#_s7} ͮXSa6!
    bK+[= TIJT-hXV;Jlmrm
    ߘ}v&Z}km:rd$hS$i8}n'vҥKz<<H ^{MOY94qdtHzM}
    xR3*vrd@ Iرcq>^sss�+N>]TWj
    P	0K)MЦ"H3#$+H@ )"#GhP6Aʕ+$vME$q/;wvóKJJ'�:ed #!HR{ǝ<n8=9uԡC:::z{{?!CYXXHL�VH8<~* 67q^vʕ+,1zߞE&OA$…_|A033s=>`qqq!֭$t:ש����IENDB`�������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/manual/images/chapters/layouts/����������������������0000755�0001750�0001750�00000000000�12203357067�027325� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/manual/images/chapters/layouts/htmlLayoutAccess.gif��0000644�0001750�0001750�00000442526�11377016712�033315� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89aJU�����0JAYE]G_IaI`KbLcMcOfNdNdOeQgPfSjQhQgQfRgRhSiUkTiTiVlUjVkXmXmWlYoYnZo[pZo]r_tbv]pdwfyj|dtnsk{vy{l{~ށ߃߂߄߄uƅዙ᎜⒠㊗՗匘Ҝ揚΢葛̥臐鬷갺봽쉐咘驵뜢ؤӱ~~~|||{{{xxxwwwuuussspppnnnmmmjjjiiifffdddcccaaa___\\\ZZZYYYVVVTTTRRRPPPNNNLLLKKKHHHGGGEEEBBB@@@???===;;;888666555333000...,,,+++(((&&&%%%"""   			!���,����JU��H*\ȰÇ#JHŋ3jȱǏ CIɓ(-"$&N0cʜI͛8sTǥΟ@
    GC*]ʴӛq|JիXji:Yϱh*ȝKݻxw.Kt#d0ǐ#KL`W̹ϠC-9Sۍ�DP
    ͪc#cGxtpN*b$زУ&#Pҳkνw'Ԍӫ_Ͼ=[ܸXιM a{8~ 0#gp(Ā"
    r䱰 %| B
    o"b
    btYG8
    <x^xˆ#Ah #	0߈"\v%z!ߌC(eo+Х#`I~#)B-wJ"(}�
    v#tsX,
    2�'\@_hY
    )0Aig
    Hz0ΑFJLdGB6~)-z+̀
    : qs@b2FezEi@ںsE=/elpa[	TܪE0pq\@Fg0ptpx[%�GhvvQvt\6|:`!x=1L{@=pqaU#\M,EPd
    dQ�7`ET,8tޡW0
    ?p	ml0h[a|pC 
    eбe@# qG�h'q	'AmXPApEƉymp+|`E�wp<~
    ,FpN	h@oa3 
    d`>|nIђ(TOTDg!(FRNh=D%,	?@f=9+(сL@Ɖo<6(tP%L&쓉D*]DBpA<^&*3�F/"$T'N:YS0OP�T(+�0U NRQo:&x_f+2i>1:# dL 8@vC&P&0.o0Pqa{L2Tv*�V\fh$-hsxnH=% 	K3X5ĩ;P8p!>qI-pK!OBPЀn?\oR9YP809L`Tɨ�
    ~@
    (6Vll^8jg"p_`�@wg�'L@_
    �(`�O8Ǣ!.?
    $XUSWX@T\@-Yai(D��
    8l2I48pqT@:oML=ZyY_`7L'd8P7"xWZ aKyB]05x0.3, OUpU 3<`y�VVt'Ѝ
    Zg0
    =vP6!WsvK\GF0 )f8wK)Bׅ7 =43Rd@
    #od%x&
    Ե$/R�20wfBf,87Hsi{#ӯAoW�2Rz�:]`G52�2>C
    "(@\C7yKVUtRhlPPZwx\p\
    CpA�)=Cb9h;3;:
    uǽ60PPABu�.(
    xn9
    iPWdž!lè{�!;@qlf`N{;
    xm
    B@@WPSNxaT�(Hi`30u;h�?6qDO(ࠀ6C'aBrܛ" �>|> 6;@Ru["n]f6
    o�y�6u[W�7
    cR[o}!ћ<(o1ā!<md̸%^t;HA@6#@4\gH3AL3!;&�DaFQ6D80WTaw-P�t^ iO@+8UtÁKl@4Uvv];�pA
    �#NgpS2x �K"NhP:C�eRD<`1�3p=E_Tf_�s$pRA(pG2(�LxV�;?uNC6��:{,`_e�kP7M�7`7Nf=x*wW3Hvm`s#d+@7:0HxS3)@7;@G%z,@RTy'9_pK4x^{JUm]ba:so$�;z.@r�0�D7 3@6O��3vC@6a0h6Q1:H�;s0@_?p	H}00;0D+`YY00D0gh:*I xG7[G	dPشD%h�4-vOT`7+0nRa0#]D@D�R0D@7�KPDKX}@pSkLwg`HxTRw i3~v@> 85C,Wh3w7Uw0D`<O:FXE/R8O0 k�eNZjY}ze#hXf�Z#m�{ģͅx9DA*POo IP�M0O$OYu$g;8xe;0':Q�2NXp; 
    `98:�22 d1pZg30<? C@i4@6iN@6@sn'lG2@7-pG8fY�OX3 fN>Beiaa�v@#3+.p-=0j;7f~8OoP4; d8NcRu>�0BZ� 7Иdzp8.�M05y�\`g7=w> 5w@RF0c>D7Rs2P:QЏ>o0wBv
    a>p�
    :e�v׮60c0;VJ3p�W+J:؄0�7@6:pz{QVP:Na0seu#5:cH#=M> Zvi�);8Эaeo6p(/"0s@w d::8F]@7d0V 
    ȩwp�ac?T@2
    :0E0Jv`xg 3=3vj"]L`6_00a�iRRp3r\$j?@7@;c;G7}8:f r*">y@:ap�y@sP6�rd{:Twe@7iCS�Yދ
    M`;�ayfP�y RsOs�P\x*+]w`
    0:OU)Q.)0ev0_p�w3=@6_@i?d��'�),8k@ڛc/�Z8MyPft1M$g)`P`I;`IP01DPNJ;L�7`,`D=b>P`bQ`N% OG 40Yl#�> N:p(�yIE0uNPp=E8Cix2P0JP"Gf:PPc>P70$2B,-+P) rat(3~z?7 K`O&\lAP=`J@7DN0>PlcXǟW2Qp4 2FQ0JQ<e\\|ˤ);�ڲ:KL;@BJpj-&ϡ|/R7`
    )ḌSQpS_f Q02G<PDN`bN2M朩YD3�=QP QS;p:^=vGe (}N
    hCU!2]5�-
    !fb-#+` 
    ٭%m!=ż,ؐoڪm((٧4}و""PqSݻ۪"u\(ܖU. pJF1EpJ}Hbr
    nBG<"b"m?p"]
    
    #`-#q`7)^έ3M#0M:~J&�Mi%CB!`%�]j
    з7} 
    _NRԎZ?{1q&hp^
    M'bn w\h9 ^~芾
     >^P~頎 ء=븾�~0mN 0.%UI>^~^I�rA0>{=�r~0o? AP   �)
    (0	 _&0
    ',.
    �	409? $?Ho)LN!P6S/;W/AQGboK?fhRQlY	q P�
    {_@a
    0]Qp@Pǰ`
    `Ȱ 	
    
    p Ő0ÿ0ɠЀ
     p
    Q9?�P	�	1�_n	q	P	sO0
    �-zl+Z,�iYe6|qhXMG\qYI)Q.%n*-[3XkBKݺYʹs@
    `	)&|I+y
    RyqXD9I۷M/@݅wejDD3BMX
    vk!cTq6l(oD;5ڪ-,-Jt5@'fDAju..c09\ge[V
    )樥O^uAޝ1Yl%kPY�hY~b$YϧQREHrh5eDYƓ�6fk@pBQi$C%:dK2ɦD&e�撹axBd."D2UyĐGҲ!?zL($MT#de-Jʆ+J8�ϻ/A%�FYdffZYhm!N|%�MJz1a:PE\Au!m�!usԦMb)T۬&.DpY`-XdUv햝�xe(Sf	@OߋYpK&.Oя?�HR'dnMIbHFp%Dh!!_hCAxX6D$c;FDA]!
    c>^(XbDw ,ER6�'El9�BAF:>:�HЅ)A'FS#K;e\YIDQk	FW�EqKṔ.2P5Uw!Y9<v񕜩UC}%$V)$�/(O݆:?؝(&f5V鵗|g_d؁;*0m
    `ljx!%~b�aZ	 p骩K&*U񆏬Exf6[H%1PF8ˆFb�P떶`tiL{DZ i3_C	DFA4xJF7<a�B|PH2l 00R&{04JS<ԅ9˵IT8.lsx>1I!XaE=vD3NwY2T1a^ƋWI9o"E,ԔHD"P�1	AÈ>ru9QǾB|#KG+Uc4!-qՌfIBAp#:
    mZ=
    #h7VBpyD2V)LI6ilD`ᜃZX81o 0P!4LiBu)^!�DX!EP(Qa|Jh\H9bSTT c"SLud�[;"ɐGw:2:3n.Ӝ8<h"x3.ԕ#pf�D(|&�b	F+1nd1\4	j@`3@"99.gԎa>VkJB)E
    :4dE2%ad0QrQ劑!+ڥU]LMV洧d 'TvdvᝏSHt#Ҙ)4rOkV'
    d<S$�DJFJ%JJGQG6iySjԎvFg:<B-=bod˚�eqr
    fX)rc 3$p3j	yt#f񍟌c+"
    /sd^ZD5B8>혚JHžd-V"p5	m83bw	@1BB8g(j60F"ob42RURn1bLu}}ޑM0L�RAG(Bט"HAC;84;r$h
    m1E,-v/ݗ(6vJJ;_t%*#CP$ �p/X.D{v3Dz̈́riDGDÐBLKiIf0h2ls 8qڅb�Gzq}!	�P:r+[G5CP"M\@!jD`8raC71UC㰘&qxPccqsD#3o;+v\8aHSÐ؆6718w%V$c~~GtrIn_}g=g_ƧA}_>轿/~^_=w~*YE�<@L@\@l@|@<E`W�D@@
    TIL@A,A<Al@EHR(|AAAAALQ`ALK((A"$AEYXF �'|B(B)B*B+B,|BxW&B0C1C(lJMB2\C6lC7|C8BGPSP8C<C=C>C?C7dQh@,D)dLJhCl@K J K4@GDKtEDKDPQ�L<EU\EV\EG .VEZE[EZd3YE_E`FaFbdFCOEF`lLFGHF[lF`F[FFXF�FUStLFJFUblGw|GxUAGxtMDh4}GLPDpGn$e$�r,QdKHBGDi4MTMfTKNJ0EF`DGTGRHI0E{|XHE]D^DF;V$EX�hSʡ4C`DlB�C`JUIJ<ʟrªQJʬCxʟtdJ$KH˫<:<EGPN4M؄LOȄGOL4GEGظDLHTG HNȄEʮ\IEǻ8LMKK4MP̟$I �DP͗M_V_Ź,GOPNɅJH\B �DFKM@ȏDtHGX8qko8o͵D^(^@tDORd3oCpII^\HZIGH[>0EDtM Fp	eGdDEZ@EH\UJeZT\E܄IIZGXPK$JJQ&Ő!�ht!'[R}DƮ4>�piapwn[HoyCJ\LVOf(_dL "Umj0bjt�YUeU0TchxSyvHmpQm}y2FmHIE(hSe,gUU^uIUZ�V�qL`(ced-\8PNVbl�W@iq c8<nHlHDcY8E ]xQ;JJ\^B`TWaDk5wh
    TjGM4h_`HXiahQTMEwB``JY[HbhiLٙيPgL�Five_Dy0ĦE_`թħTӨdd`^`[dW}tKO$Cghm-@�V	x9
    _UD@Hn	�[Ix|mD|mX,KEeefVpIP@[WHfDXF0nd
    �c�6u֕D؅`t>DEsއ^_O$�pC0]^@�5_ ]OTVmGFdWPMBYp
    EEs}HtDIH)o0TfhUnE|mYnȄ`R]XؕE_ES(DHoh%Di8EHnB0o@DI`DfT0C`)TS &~Z!lJXDEmPaBJZC�W&Kc,nSc2�RSDXaKh
    �@n?&KCtJDFzc FxQPODQFH^DII+T)EMxUI�OƄN`IO Ex?CȞMKgHE؋I̎M�m>^8Z	lfBVDOPQHeaBɆe.J0gGKmhHHNNMhH`Ugq`CH\gX�sBx�r5WH/+`oJTӫd,fl؉_Ÿ<SZIj0CH7_0FpH
    G(>PE8RGp6>G 	QDfDÙMT\W8d0UWJ�ED�ȅdSih<IPAG�@l];P:GFEm6XG�C�@HWWxZUb@�DhEN0+{xagІ`xHm~HX@f@-ֈm`rJichA^(s@b]M@i8fT@r	�XF�go>XWY@NPOFE	
    nD fh	LL�DD]hSCigۆAPPQBuLfPY,0|I&`FihRhQEXeinٜEi%DHEň=Ev`_m&h-ajRC jLk<GaNj\,`cT䅊@*.Vx&ndJ,_@>eahUlhtxmFP̾vfNd os`Gw8sm)yppSSӲ3bGPMxcxpVU r0_B\P}XofChBTqGXp bo:~wXgpwHMmOsXi�X]>pW-q6ZXY_qDhq<Sx[qEHMPVPH/O)r(/'dya`MPiG~Y(r(__.EA�̏ ej@s<7qJDh,PXH GoX{T;0fĞ<{^.F/ctFPllooXDk]XiDlV)8%
    OnT`i/
    
    G@}E>!F6C.h]P-XREvF�XhH�cH.MPRWXBEP@Ke8Kn wUOO؆<iAop9Zh,Pjv됀}XHYY@!"Y
    %Ǝ"G,i$ʔ*Wl%Z	ӑ![zMR"OLi0Ū&Ԩ,A0�L!,rH*UQbrU jY�
    @/-
    芌G'pj@F<yH2訌(҄9a#H|zA\	Ku�GReÖ*[)
    fkuZSk#oM4H}(*lTn+{EB
    t4ԻeAu^R6:u*4")83nk)-}B$3,3RHPV#Vn02/@�@S	!d�#1"	4�M,@J�\B&x6'L
    ,'|	8`2.#43hI�h*aB#V�(�$t2h'hrM'B]L�y!�
    "9JRL�(•�*n:+$MJ5+eԬ2-$SNlJ]1"?>ʲJeZ(
    &x"X6$rH-%44˨&&リ0H&󈸳Rfi
    0@>;Zi
    64%<#`3%@C	7"L%Ϭ6W$:*$b18s=3*tK4<H$@c	N0F#C#
    1|6"֑4#%04$35$o}lfa3Mј9,;þ<p2!$@!ΠC*<#M%|.C;94&%S
    %4"ʌ*#2(+�J=h%,"1!`!!?&L^3B;È<۴ˆ1L"@~+o/ 28<:W"TF�&2)[bs(ۤaebVS"Z)b/
    e4Eb,i�2!WDb�E-lQ
    F,Oa*&IbB%&>1K!~tˌЁ3HѢF1hEb-ь=*Lqr#nEja#H�jc#
    <2!~L!RA1\dZHEoۉFY(fZP`K1'`Cb8%f#JM )	VB-NQUBD.)
    Z'0ӈI.-X1�Ets "'w6Fp3C,EYs}@m!
    Ftc%Hb[:T( ғ
    =L%p1+KD8]X*naId)	
    uõ0"j`yLg6dG6ꆌ [ma3ձ$%
    HqC,/F]!*
    z<*_
    i/PK=b/j
    _!-M"aJ~'`aA{rn="�WaJciJuUam*[يtH*[-Ըq�im5UmljC
    &bsRgenur$.J\Jeҫ}/|+_
    |7 &>0%~0#,	S	fL,a2"MAC\`\S.~1
    P$61sbEHH51,!,VD*JX#3N~2,)Sȉ<e'p<dEP�Ҭ5n~3,g6#3=y-AІ3*FqE3ю~4#-I34	Y0"Ӟ6�fa3jM]j?Zծ~
    YӺֶu-kFoӻuG_;n4Zz~6h]K;Ͻ6R!KPF3J@kNlMPsoF7F@1RpF-Ԝc,E3ad,#P*XHjϪ7A~f CXF1a|F2r@E�\BHlkj{�h0
    A#AF@F3.k]4#bHVȧW`-fH,h5vǥ'm9jD7�T߀)]=�%֬Mpw|/ok<�|ټ\F7:fhƷl9$
    _B i|p<~)aS(Kg+V[Ơ*Qa,I8|N#h+ΠQ!	>o"pvF;o8G,mt�*.,d22uC�= Z1*XB۱P�D-24qZ$24iݰ(424&\"$x5xB`]("IY
    ߁0XB&dCa&PY-WC=6\Bz0P›"!&a�0<!2؃._6`B%�dd&Ⴐ2C/ A%Y6pB
    @�%h&b%rbpa)ښ916,$4/|
    '-B�0ð.+�PC01\JŸ+,0Uĥ̂9,6L"1 B1\
    "\#"BY8c]Ba�020ա#ay52 cI677J)d1"~9>ܟY"thi$тЈ/xa�dZq$G[7JBK$K򠚉.�$tLB)#;a!t"d0PBS�!t	r	!`e�pW^eV*77()DC.,.ԃHҙ)%X:WB�4$"3.HO^34e)b�/H&-Tf�4q&$4h"2jC&3jVk+Y%Y&!>k6\&m[@*\6B6g>s2H]EFa18l+ΥHK,x�C+L$KRD:7t%[�dB7xY%t((CaQ"S((2$1B#2<E�&W0Wv%XX�!k(Ω7<B�/(e#@C#:%H/@j)C7x((]2/.1L=Pfb=/Ђ!@ݝ=7ChN1BB�ta&fo)}>XE&&,if�'A.2 I
    u~$BCt6%d$
    v1О!LB!-YH҈yr*J|*L7d'5a5P-C#Q5(-/-|:7\ R~h)27aY(>%$T%%h4l8×�,@ƣ3xҁC7L7�.4LC)Y+HC�1(A+H@7"$f"ah&"*Ͷܘ4d	*8B3H,(*Y@q2BfjtfJBu�)ݩ
    C, �"0`z٬F$|ʭK$
    kQ"Nڭ1j:.ODTVe[neXXzB1)۽Y\k%1$")@,-<Y3d2ш2dž,3:h$J'B̪Y-,(#"gIG"|84'(( #/ifuRkbg!C6⽂7pVɚ)x7	!
    ϝ)lpŒ*C;u7(gm<D)p�$;3Ī	cµ6|CލmD�B^UC- +1@#4C:P$+,4؂IVB6؂+P\|4(3ùp.�_�#C+`nl$1B)8H-pl!B.HC" B$|(P N2@%ha2Co#I$4_�B(^, )\-)|p
    e9dE4C7h8@bW8`),(<3^B9lC"FZ֢㩎F%l!P%*I$Dԍ3%/
    �939/;o!suF$H=s)z
    4D?A?A$Pxt!Txnt%#`C8`(8.5.IIH	�8\I:'C,hIC5 O;l"C8h%6$U,6'L8>g8C4|78g58|&|Z	5Q2#5ÝɂB^)#27j�8j5l63.4o)z/f7gh[>jh'knvh/h6lǶ
    vՙhkv
    lk6pwѶvhvEvpo77t77qq{‰vvw7y;)Yyz7{w]Yy7yY
    X}7Wi77؂ȁ/87?8cX+@u؇Q8PEv$#LlVuD?KWKL8T\WI<vDĎ']l"|x8P8Cwɖ#|xf|ÔTcx8{K
    H�Dn'"DԠPVQ39#$h<XuR�WmZmIVRLQ#zlYH7!o}HHz?:$MP:s|[lFVgUxBI&l-yB&<%x'`'tw#LOF?;c#PBBuB&l'HfSE#dƭg%z&pB&к%pg&$"=Ĕv;4<fs9@	;B	y&
    X|re}C,dOC/ 'XC8x9|߄
    /C/#.<{-\W�9B*@y#m9+=yUׂ]<+m].8I@%p1Bm$!&т-I%tZ9#B�JRݏ-wZC8T40;p7Ѓ-7<p':pIB3DFɟAm%P9%T<8=>&8h=)B57C8C:h;;}ʃ8~3@L7,B)@P)<C{L�8-Tz"C9?#9oxu"59p!\w)$B8^	0Ȓ,GdYbdP�H:ț&te%o,/`rFubN;ytDU=5ziR(4`AcѢbiݴhH-E*0`]
    h1J;]aIz-K	]~Q[0DBȗa ݰB'C'DأݫvlynIrֈ`9dn%,l8m"~Z)F<g4$EJ4`OQ$HE^5_[%ej	[qFOOy'0�1I9��Do	`AI%DpA RsjT} <jQZI~'CaxA($F"$JKL %CDtKAL"Jht$�en9Q$YD$CXSVSKdH
    �]p
    SPd)PB&I9$M	HĒiNY$n|)JAo$idJleCfHQ$fiD	AeNo(!n
    ;d�DAo(KUS1Fv EKE$9K8a~"DXf<
    yĒ�v1[F%BnD@DHD0%EdJIL)dN4DI@qO.N\$F>OGCdKy&�@p6ēNēI1;XMdLNX$n>QDDєl@	 Xe
    " S*=#?RGDU#Im]}חmhVpfQdcRYDѴ!rHBSD0hX8LD6$E{s*;T׉ԧrS spl8|FL"D8$'8D)Hc 5rԢ�"b1*2p!G8j"Ti^t0!Vw-�D<
    "#$kLQlD)81.H&W7T!
    b  Dt;q	gh#1ڱX#@E3.|b�3srȃF=ъ '́qb&Ƈi ͠F*ъ%8Hun+j1ttjƟqn� D3fqlXȄdЛ8:r&5P.RlQDD(9.}霢"6,Ig!`iythPP$ǽU|9J<PD Ơ�$Ŧ
    1"P|`)6uRP}P7HtPIP`+"/Tm8
    $tCu5M2FÈa,hH$,1t<#KZ""@Q
    GP^80Bd �sp1q�d҃H!"�0a
    X+o<BxEhaJXc%TAr D0p}a`,IX8AG4X:D~iWcp;61+n2αitA
    "i9ӽ%|}dNXPxHdy!)ʈAg%3!y{N
    Q=�sɈ	ZYQ8Fӷ)}E9%)NFШ1Ӱ#|UA"F.I(	B8BXĪef90tvd^cBDE2;F=ao4bYr3k�]�.=џ,4$*qB$L`$K�G'lbR[<
    ,Hb`$&!(_b
    H82ѰM(8-X8jřC\Beݠ",э�hP2=Bx*n]3P»t1>]eTc`Xpp	n_;BP!!ɸ0	>$5�@n,F#)'Sƈb $x5Bg{E4|Gg"�;p0Erٖ'<aJNJ/bF<b"F�6R1i׵u?.Ӱ{4>
    H*
    U,{#P0v\(~Xp<Ku
    n�5;)9%4tajLb�,b!^np9,"@�FQ,�F%ql`54N�Yc%(	Qx�FL
    @$>H3|h`C64OV.�|A�>mF*rfn0`!�@ Gl0a&$�LAan�^A1A(acAh$kK)DCaXdnD!UCAzLt!
    M
    #$>y"B�+AC(a�"L
    J"/*AgbXBT.A$L#D"PǬ8p16<#'VA;$i~!iQba1L!Aaa_a8%AhaP"ȡA4A(AơP!aAAcPPIIaAhctaDaZDiN(́fa"LARK,og
    .!
    
    !c-Lok',c9�j!*' d"a�HjJ0j"&$!&AQ\63esXP."kpB<
    WJ'`dj5#7![b8As8D*lSBB5La9I9(s4;'938s8ē8s7Q'cjL``al2.`Ra6,abaP0tavX$8Reh]&!8Th@8a( a` IDNv,hAHB"?[FdT(l!HaHgA(*T^a4YTSVSKEe,
    ,_D*d�LQjpKb3"Vc,2rAY~"$@l�s8er387sVO=g(ZR/GԳSAPm.P9LfLee~g�@,XLTMVFQq5u0V;3AXSlr�TTmN<%XXUCXm5TU5u71U\{K
    ,P
    !<T#Ts�5'֔.w
    9l]_Z 0R_1T3`V:`Va'U\_'
    ؂.c3Vc7c;c?dAL�!(,6dOeSVe3Lve_fcVfgf5¨fsVgwg{ghfHh5?XicIc!OAjjkVkN]ckVlǖl$ibVmזmmk!JxnoVooo6Dp6.!8pmg �&r+r/s3Ws7s;rPsGtKt/wdNu[u_vcsQadvowsWwww{woXws#A:xv`"rz+tE7z7uWzW{qv{|W|7xvyw{y%W}swzwW~|~Wm|t}y/4ar&A*-w3rMa~7~tWKvwr*rLAa!$rUoJ7tSsQკA4a!ᆭxaArlr؄x{} A-!`�r[7+r)RarXaWh*c1Y!	C;+9�!r)�rRx'ں!d^OÖiv9�Ф8�2wp&!N67'w!#նs'A/XyrYm,LA>arV!V$�taA'vsdr-Nws!%DZbAy�`PA@zaJ^،-a9,Xzc|g}AV/ hxetr	})AYl(�<'<*gr	Ad-ר-x,Ahh0rka
    hf.ar:�]9['G2WA:{*u2�
    !4Qrzr?Er!D&789.)A8`Ǚ(7'ȍa&Tɪ	'$vP{r_8(�AyWr]A"S40POJ
    AaDe,׾Zs׍՗�Frx7>a׀r)Wrۻr=\*C&G|7|rۺr/kr}!95'7h|\aNȱrE'w!C(>ɑX+,�`1\̇zr	a\|r;
    ,7;L!hrrgapzLVlX(!
    �袄Ta/Ьz
    ,�2anɻrU}r=|r3r]=[=dirW.U]ߗḊz+7Țr-w'}1[+JG<�r{7Uvr	s<{@l)ȉ=�!A-EoYEAݴ+A)ݩ~ab΁S޷krg\BZ(W+FA.AxA\LAL:�FAxp!ZxfhAO
    䡩a[ym!�srw}~t|?Aaؑr+\3|A(w½յ]i?r=-hGR-"('Wc|8V6}%s|r`*rɁ|<s/>)�ʼrmFQ~/wh8e~rC"g
    r-,A!�B6gŚ�K9T(�nӾS�L-
    0(I1EtJ"J!tK(Λ.:]bѤL:}
    5ԩTZ5+(VYbUԴ�؄ͥfFȫܹsI
    @I[R9%J3i�fcijFESRRϞZ"Y7w
    {,E].u;t5;J
    Qn.`.G.c:_cS\’Fȩ
    lZ/	GoF1uj'c^*)dI6/1JR`^
    1(B
    t
    4`N<c%0)(2&J-
    <Db4K9S=dBId�[	Zd"ˈ[q!IeVW_Ɣ4C�M.|K@F#ǘ!p KB%fU	S֜:ـӌKx
    2Sfxsأ;6ߐtJ7b(j~RK$b;$zj&D)xj;<@�x3"OKl
    W4kB+(&UN,RM-ʾ1<R"4%$J�Nc˸zBYI6B�4"͈r
    3xHH5<2!
    en3SJ)Ղ҇*H.$H$ߌ"{HM,2/ㆂKP#꺴sBM\G=$L'B#x5 BJ2IIt׹C�2Pė_19(L7ڈK4/T8p$.w~pI9L^:(SPRI$.B	%5%	$��Kyyzg!vE	"|nxI~S!!2	%iɧ|%K`9p8,Ԁ3"؏K˘58)5Io1.N5f܂�Z8¡K0Dgl8n'q#F8Ajc7>jPkC3 dpU:pxi.Q8Xmh2z	~(4S-Y2($a1HۢX/qd,#|hƪ<1U*-*];q|!52n< "C2ldSHJrN!IɪL$IEB2,-9HL)n%1Xr-o\r\#\Dr,1iI<3	hJsTD*JKjjs7	ps+ƉZ&f:LEPB~%A|s?	Ѐ
    t#\
    |tmCJB
    }E/ьjtt*LQQt$-IOҔ4E+V
    ~2"D#bS/#�Ԡ2A#Y4p"Ԧ>5H%*Uլ@�
    ְud&ղulm[
    F|tQPY6tmj_Ŋ׵:X�ΒLuD,j׽>K
    ,U
    jvURrֱ�jZԚ5eh_ռ`ik	z:}u!*b".Nte#KZ$nYz%Y5V�Au�QF!nj_|w�/U׻WK>{Η@o	UxpS+<aX #	OPTD&<L<&<\>bժ#bWcC9#(NPDb�q%؄"ڈg&8aoBĖ񕭌eM3iqw8kZ૟3TF3g	x(Q	s:<)!ъo@8zOX#87TD@U]E7hqj75t֢uD*la>v%6SF8bؘu/#!mj[ٮa!}	\'͈ZW=&|\Z*!(	t˛au,=ou͆8Qicp7A[7:."@@j(DYMzSu�%ab\H8E\8Va*5N
    yІ;ގ}קf@,"J3u�x}
    sr�Xq"F9Έ]." 9[r90^FPzFj$Yb~WRы`�`۾0;jQZ,*�cD#`$1hPU&l`K0HD1`_TI<=QvrZV%�	`
    7pT`Urа5g'G�
    Q3�!t#؁`UFWpPqZ�0i	-	܀j
    XHK`H6	
    UE[uXa5UZ
     		ސk�
    `�۠`S�
    .T簈'XVtG[E�	`ЉĠvXwp
    c		@0�	y[�p%
    0`
    p	P	7~ܐ	Hԅ#|5|h|^[	P
    0	h0
    
    P
     	7
    p62p	P_P	6uZ
    xcH@	9w��30�
    
    }pj
    T�^2y	
    
    =<9�Cp@1X*1\ 
    	'	h
    `
    @		B:	S�	
    	0v�
    8Tp		@0T\
    	@	U\Y	[p(
    	@
    	 
    H/P<b-k 	 
    		ڰù	ixlh6�ΰ
     r0
    ЋLU0(�
     t*
    		߰T0DI8	[؜pu|[p
    �\\V	`
    p70	�	kZ
    $:%0lp5@�G�k@!g
    16:r}&pW�00ГX3x4ZpTư
     
    �WP	a �	L
    @pN°
    P@@	 
    p`Ƞw	Ԁ	ӀԐ
    @+Pߠ @IPx
    0	V9za9�@Pha	@
    0� TE
    IpǛry	X
    
    ﺜVjł1rF
    0�B4	TYn
     		)@ɟUTv`Au0
    |
    J
    W0z0@
    p?k|�
    U9|
    CJTz	�
    LՊ0ZP
    јYz	b:dzZIy:�`ps{x*@q�Q/Ъ	`p	@`
    @	�P ⠦Ag<(?upu t͚0p0
    .r:
    [
    @U,ڮzȜ+V	x5
    0+�k*O
    d	W͚޸P{U#{{�t^~kI
    /+_|'@	ߐc3
    �	
    yI2
    7`q	`
    
    �_`SYe
    W@
    ߚ[ApǼ<f�j�2	@w
    бRР
    |	b	2d0A
    `p
    p�ymЮx	P*;
    ʫPp[!0ڈ9P
    	ʂ8)(,Κ[`aL`;Xvn
    TȠ
    T(
     0X j
    Э>`m#Ν埧U	(,T^
     G
    ـ
    {p 
    ٧51UҀDԷ0
    Q
    O=
    T�
    ۠
    ~qնՍ
    B`
    TMz{B
    0^.1
    `0	`�0^i[ؓi3PZtTP,P&	P	p	_ 	p	I	 
    ހ�
    S2
    0	/�	 �
    
    
    ?	s҆(	C~	Ү(I#:Oq
    y7P{
    !we�yr
    d*
    dUΓ8�kԐ SmBڨPP,e@`{u}e}0ְ =�`	�tɀ㿹㈕	�xoUҧeW>G5 
    ӷ�
    pTTT�
    @	^�p{0<;7<=B
    0Xp{'r
    OT 
    t_
    Ȱ^�
    TP
    d	 
    t
    ut)ꛎ*X`
    `	
     	Bwz+/΀
    P	|@)p@
    @	A
    @	Ȁ0̀
    uҠK
    3^`=t*1
    &KTPr0
     
    
    0M}0�`
    ذX%owu8
    P.
    K0UG‡P0
    РխP]k	
    CF
    n\ 9	f-	0	
    X)hJߏ&OU*|kUߘ
    T�ksz^z^[}^0P^肯dPvPUW`
    p�|`tX'6[�pp0�`
    	U
    		p
    �	pp
     /
    p
    ࢜UJǐ0@?M.N_vXտZ)4l 
    �HY1�G^҄H
    @ @F=~RH%MDQTT蔭ZD1RT	ףr̸XDPOeKҢDEr$Ԓ,GdY:�#C@T"(" @FrbԖ]z-UiȳBXPJ4!^Yd!2vC֢-G敻Oh-zD5"Dz^VQ!GQ!EOȐ!%"sC9J!DD+ -ķ}gҊr|tieZƗk��"(Ph/
    ,'Ԩ(DðC#,G$DO?(V咼1GwG2HxİD2I%ı
    d2J)J+yt3(K/3L1$sJFZ*3ɤFԄJbJJl O=O?4PAsF\%BeQGTDX0QQK/4SM7TTJSQG%TSOE5UU5MDVVD.ePcRE(p�6Xa%XcE6YeEN6Zi-vY&6[m[oEeo%\sE7]u%V؅Hda$^{`|_a}~V`67\fa]ɝމw_/6`%cVxdOF9q%V9ڊ[7cG%M=g.gia+a))XS6ac
    i-XE9gHgEDYSDifcY&IUicYZU[AFM)&c|cIFhP	vXb+:sYxd`5`@}Ysm/be9XD'`ey%UXa!Ye
    yhyw]]G6ja=o֬�ѥ�,Kw$MqXK}pV'"p`UIl7+V&
    6К6Kho @j@)aS(c+V[�Ơ*Qa,C@(a`Ac
    HPk�D3N0D+mp>�fs2J@0bbcw1cbHF 2
    )ZH2L',m,XP4mH<A`]Æ
    T
    ,GK{8%2
    ހhj�,aC6.CX6
    LtpՔf�V!GXʰ.
    LT"z�2BdCT _j#`<	J+�7JhC�AP
    Ԅ3 Ljm,b^�~1�HX-B�fQ#+!�j$�1`.U(CX)["�Ș,Om(LQT1
    XZV\WDU(EKQ7Q4O\cX,2f*,IlCXL
    S%aoBGgbwK,Z#X f�C,Xpl*vleC),QX�?n6>#S`maoea�˷"@ErpB`IX(3 ',n(@JJYX#$fM:QLWLwBC0=\HçxFqK�(nq�9
    �^:׼X@U0X.lUbF!7`ej%%WQX؀^�uXm-E|X%086Xd;cYg+Z2HG8@K*
    >0Py	\.0\
    2sPb
    u"h4P%u005`Q^d#�1i0E�la`-
    7aI8/[`1-cv/>q2xY-`8�6$kc
    /b0["9~uQ(|b2�.IalreIrR5fLXXQjX䠅8zg
    wXFKhbx7~hI9Jgn#Ma-@
    N`D,K�$!m8
    �,w:G7_Cn)6R%+VCv+J@6Á%sSoS#L1
    Xhlz`+x=d1Xi?Lx�Hg L7 ]&%KY8"
    a~2X83"X~am^ham4X2zk^r5aAc2V(�8i`/a[D dPV;R:h�`gK`JSh!`Q)W<K㣰 !u$={z=5b1~=>ӱ`Ӄ\HOQ+#�dxcH6&QH5lCoh`0u>:BPl�*od*vh:o)DWB
    zS3"Do.S
    �UX;ehw�DM`91Mh�R8;`)roX;bk	q8i@C_Q F(%ZjcG0xjtI@;vZig�h�J[pjOiQ8f0oS
    Uza ]WFx!R(Ǫ{DiHDo3%^9DP(`	4%\&l~
    T GPSY@R=R8bsȆ3knq`1^(�RdӨI_KE}8%1&ӐJ&CJh9bH!KJCb˲öB)4IHXt`qaQh$v*/L*˿LcI"%J2λ,ɴ̬/kd�Fp @p�	\j�)\E
    qltO(X8`	uB"[`
    \qMsrip?aqOp1q҄o@O,N[cJDsxYh#CO2ICIYp|Dqȷjm *7SŸ<*&PqգP
    >ZPeQo)=KQGZdѩ�< ee'e!"5I[\1D,ŕH.1%SRP)4U5e6Vy7Y,S/-5!#>u@5C,DeFuG@=V.a7F:8`=yGXSOQ
    
    qWZyȓCkQݓFp\^Ua-	deE=!UC8
    cdm%UGժqEUh֗`Uձ UiVC��E؄OUEHNJ@ՃWkezrWMWUو7A ExhCxX=ؐUٕpُ}Yٸ
    YeՎpEOFM؄LOȄGOLEGHXhLZxJPLWIOeOKhLM@ZK8Z۾Pp۸ I@EZhm=oS=ȋus<i-gl-C{ڈW}N
    FȢoC�M^@Ops`DrDE
    FoChU0Z-ݑxXXZpT[TXMXFpV@e__~t�NH_F	8ZNUV`eYh```
    Y[-\Cpj`wpnztqnċEn@	=CXhB@ mj0bjt�hGqj@{=vj8ophtw@v5q63f؛oXR >Rx>@]`p[8DrPdF`r%d"pxD[r0OsDx]yH8xCXB_ЅWo8E` _�*ea_vH0wJ
    chFuh+E[P`p^(inoNbha=gxiSgLFavrf_箰Dy0wHhsia茦p`~.^@GNޡCghN.:@B�VT_UX]Q
    MJ9<1Wf-
    QU֬XZ\iig>	]W!�gF0nd�c�~چgنD؅`x*thkP\8nN
    B>�H8cЅlF�bPJ_6WI@xx݄m ΒPbׯ�P[YQ[6Pfh*VnnLPdef6U}̀S(DHoh&JKSXT_('IxDfT(ϋHE@fb͸hJhT؆k&o_]��Qo	G@f�ND開oo?3o��ka@[3|$
    QPODQkJ@L@[OrHHإMcI�>LžVF(eCMCx$IZOڸe脣8Z fچNi[ N`HHnEDX&l`lgmFȵRT7	FQ(
    NDiDi"mҽadVgq`CHuUmBx^h03$'No8
    E8n׌BhVuƘPC8j2JS8nIHqwmRGpoxwG `DԈ3r�e[H/G@WMrVJ ivk
    _y͘e)DxpqljCFE8zwv]0�WWxZUb@Pr[F곇wKpmG/ކXtThDPp�af[ yLz8V.DrO0dHE؄;3>kjHd3[(q CyBx8XWY@N]rE0D fLL�DT߈t7h	[XC�yEDxP]?BdvL`fPp
    CfgvJah`EXeovqpor7e`H#"Lp!ÆBTȈR,M*5M"GE(Q%j,4,XFANIjP
    8DEMPAFS3VH�#^ }-mQVP!>)%Ee+5(aYƥ{KKq/1B%}.FL=hHW2B2Q,w `'n'Wcl!	ѷݰq(mPk3VT+g/BpG,7J`j$iY+Dg,EGtH`hZ):xջeϜ"-8	7XH2,3M'4ST2T	!#X'8(bвE}!B6ʍ1I,D梐C"Z-(12@"t3"(IX"RXdJH+PL,&
    &XMd
    j¦5D&Ĕ+\t"S.YUA#@�$I&&b�K�PM"|	&H(@B#|D묵"b74B"h�/|
    7kH#`S6<M#|^2|Jd"dM,0[!	3F.c8B=@A̲.0I&@Bi,@k�pIbp"SK�J,bN(Xr2\
    "P%%Ȇx<4`K9@8@}R364h 
    2H2	" c�~ȡhZw},}#Ҍ"TK'F';ZyJ�pl�˼bHBTZZ̙R|8$ά43�-\d"C݆'BT'%9ވZ<$+<b .("L*
    �dM*@"-HH0Ľ:hϔ4b	GlB6l"<9bOG	JD!XĂ*aB�EA#[Pc00PpK-r~	@el=4*AKd#�Oa$q
    PE�6q	JhB@r%O4bM�"	|"&&f pM,3L�`XzDF8"�/�H|'$�B @	\ь�,g0`11"�X%&9<9i3أnBԔiLc!+X>Qc1\"ٴeq>2F&ft�pb!ůdqURM@D8l#Y�ta4Bp"t	&c((&L(~
    `�(
    /gH"3aRРF?a3f+VWi%
    V$u1F3Ԡ&!Da'΀%$0Ј2|Uit!(*ÈH4C	XHuxk~-9FKa\CX;m!(5g3Q	>c89TbF34RCxG3e>i(0PQv)OюrF+(ˀ4x!(!m`tN@㼭zEipD6	t6W"8-JҺs(\aV06B)bM/
    e4Iu˄,^E)O̅%IZ$d^!E?l7*M$%#
    kˑr!҂17Is5nO=G7,Քag<?WsI#h0pφ.DY;3z͇^_"Y(fZ91lFd,ܓ]lE,
    S`(.6O+n!	Dp(*h!
    DL"-NX̂q	 1XЂu'[bcDQ	[Z;K`g^F\+f	DBێDgC\!x#Nc}x�^qnxhU0jxt	i!\#�v㜈y?s	0toU&#>DesZyBϮhoEt<za!d/,"&Z'b0ĠG,F1#b�XaYscA
    unYP߼&q"z@{#Bh.2VN{9wDDNBn)+[C?ҟ>o1	{bo?_?W??oXQ}TH�•u)2`:B`:9($b`j*"HB] `		:"B)
    ``
    	&(
    &%"PB¦2a:BaJRa6!'Xraz!.,aaR!*aa+Ba$B,a �R$ "fa"&b!#Bb$!Jb%Z%bb&aj! v$!*a(!j)#b+^"%b,,Ңrb-r'#&,!3\ڂ3(C3NV4T4:)l.~!+jc7!,:"C322(2\/,C226<r&|QT!*c�la&VB33B,0C:#<*C21,2X$F*C1,1$B*(6!7ޢ)@24ä,!A$<.$@R�\38-0)PP.P%/2!"L>2.2,B3+74v·l%yx%B4a6$rczB7pC%,a5@)5͡.e�L7X&p_.%f_e`"LD"k $7
    ?N6x?Fa0e~fR$h7\#OfiJi.ajCi2!82"$,3f)77.)64&d!Pa"8Qӄb>"G.a.5!,I61a!CstJ+
    �+C/T&,7B:|�p( 7'7|҂T,2#x<`#enJb4^GZX6dZ=Ē#8)(,!)$C+h�:aRj'(4@2L&\"P' C^'6((h"T6.60XB&dCہ&PB$8a-܃P\6BZi�%tyh&i!i*# '*=B6`B% N�̝jiif&>!$Pf'@V&%h@bVj"qBj
    ka"1p
    %^f$*b"L5LJ%VC^:$TB6*H%-!$jja2zHV"8BnM("h%)!(\֥&&2&3P)P*�ګ(kfhJ3*)�$lj&jCBl^kFk�T"Ĝk&B7>!-l•R.a,0v|!l,u2(B0i"@7Pg(20BN"ml2-B�B-K�\rÅ.!!m�ق.!l:ᩖf=5:4-*L+=TC(@q&18\1NB=,C#%]3×^C)$.Nb;+C,x
    /؃2x)5.r+f,,#i/-a6f?~l2Ớ&h7\ffB2azm5-$2d. 3,/6>24l" .!6bL_.n򢒒>a!4!96,×,˺,2,0B�jp@:0%Pc�v7B((2.BԪ^m*im2B#\L٪-0X16!&8#B=TC<>a.!2TB-8.'/6L;%&-+2C*&C(8C,:&"@+B0�9h*@!.B5lB0|))-,:>Xp8n~9h6C
    �8X2W9j62o'22().W/aNB06/&C�432+s/j",10p,o^
    fN0!(L6 '-r6>s#6,dBa	'5i5-C/p
    pbC#7;xDr"@0%٦mm� "/,8C!B324t3%|3xBpM$,öG�`)1(qRj�<d'x
    p+'.!+L8#CX$G66$4.)*B</{]?!,rr&@3(.K.[b6*:Swz5ddS3"#2D'4&o32d3%BKYsZs�db, 23l�m@0s7:@?-"q3.;l
    zRN>!׎mG_h/h{ZB3<"&%mt|KSPB,}5TB�0*0B2B65T;5q2646<'<C+ruZ+urHc&Cn:\u+"o___"52vrJ3L=x
    >0Sc64C4)B"x40p}>ƒr]I9)xwf8+x74.92Ch7x9:	{	j�|KR;]3&C4d
    )(ؾ7|?,Ln78H<(m9C&L#DB31L4"oP)4C(kC- B/X(Sc,b(@00%PR+BC3�6Ԃ:�$d#x/8p¸S1$cŐ44306.L&!hB8R|H!B(�""|CB8�T/ağ(8v5"B11<2Pu?B2P5x#T$ 1@̣(|+%f9d4C7h8@Bs
    84.(0L^B9la'okOD%P:S%J$DBg@}SB}ǦvKB$@}3/5av=!*%P0=$~SGwN/"$~!D>c~%4Ib7v 8|6h9h,C8L*KR9�RÅJ1ÉB6'\9L'4B9DC+(p*OK+/B069x'X6'LCoC-;/+d6i78/58@ @qX%.NM"�M\NDA9dI'QT$(V,a¬MT41g(d19hbDS|գYBZkW\q:lE$UmۉF;n]wuw.P|Uk`{6bǏO…<re˗C<漃n\袌M+Yukׯa{dgjA}}OZxqDnyLв()0zuױg׾{w{y[W$)&Ǘ?~}RnP	/QX)P$I[PDb8AQI,xĕP6<aF(EeQyGQ,#LR%lGFFi)Ad$X*i-t+Y,aD1d2sdLFLYD7ᔓ5ϼS=$VA	-CdFMEG!TI)mDH7Fج03B9`5457O3N4P5)_
    VHSeM,w5VW#V7LuMK.tP1DHTdO8UO:鄒Ta]\-Oq%V?C1=-@CٓE!@�1a:)Ê
    '|89&dEZLYb=	`YG~yPAv䐚9gmtH:QOnDM2ēLN0TD>DG0zG&^d\mdE`6\:dUlOdM*i3لOܓؑ9dq)\Xb[8`CA?�}g+VsacMYw.LnF iXnO	ǛsaNDx)Dt]~LGaZP^5]ZjבTlTE�,D\wWp`bv	\NO'LjZT0C&/Z#.!
    rЃb,H)vP),n]M0jL#p;
    z"<m4L�7p2>Q�2 A}�&W0QT7X7
    @b$D"l]"tB-!pB89ޡ
    t86ܑD&Bd�F7O\Ru''9Pj��8lqF$"H*[	uf
    D ";onM8<dqExC.^!
    QnZD/A_�c8Y7HW[}S1_0F4ш9)BPD0B`%@DP[$҈F0Ћf4ˆ$Llg02Ŋ�JJDxb@#|aa@M1L偊;NSi@R:^@ߤjC@f9,rd�EB8�l/n
    OS]dI(bh"!4)ˈW5!W<؄Z'JP@DbYVa+nP/�p*�Y�x2jQZW"'
    f@ ~
    fr5Dy\?�81taЕ.uZ?
    B8",!_o*�ʸD!EpSD3ZEEpD7#ʍL�2tNcӻ\=!qB$7Y )
    n40!	-%'f*qoL"CĎ{O�E�@ֈJd	0
    ()%]�@�
    
    K\9ˇ2)@̧B,"<o8"�޸D#Z;YೝݔU2!Ҩka�Hf#DOS8	k("1I|b(G* lbZ3& f,6p2l�]&!iHZvD�
    [X:wɱ DaHp ݌[4
    cٴ(D$*>b\{"؜#N,Éi]|?j؆%шDDlX"Q	uqe&
    
    x4Vl`BQo|*D3<-
    /|RdUNQq+A
    S~Pi#&H@"׸RT$8Y01�0B\bF+h0IP^G%]�F4F]މ-HΔgDBq
    Q~X?pLE
    X*AL|҉щg%`<h6bt8.qSliF*֪
    hq�3,ь}C5@Qz@B7y60:QG E-^!j
    K`ɦAJbt28иN(Ha:PAAIMlH,6A༡e$FN�n*HVA$MjNhn.pLn.	P.Of^U.NA$.Ha
    a.ꦮꮮfH(a$aP'<O
    LZZ
    NL%Ɇ,~n\f!A8<,ot!a|b!�4
    ^!�!|`0.A6*!VaA,!׊<tK/VlMa!-|a`!�%G7Iru>APJS0W0>$D΁
    
    !vzv~P§N8bdl4
    qNf!hrVLA&&~,ըa
    _&�~( (Aa831{LaLK f.yARʬdxMu,K43ArEl&da$A"6/A6d#m!�&!(>Hf!�!1;[!ؼaDabK!�n!
    XA^!aA<1! ݐa $B_ab!$C2G,ATZNA$anEӊk)Dc%!"^B2w䭾RD aAa�nIi!�J~+wfdtMbAnA!�SMR!!xGntfA~aMDpO�aQ!Q@lA"RmaRa<!fqL"rSel�FT%CUYnb=qAl&a�a`!ukXs$~`#A9	BpO=A(ADa@AJyaAdARAa*<!�2Aج/Z!:'l0'$A`!�OF68WF~aa
    LfLy6XF_A|ashom$�1<@
    &Njj}H߄!aA";rttjEA0V!nn*i#eFSzG�!$:;(sAqbB*Ew[E-*lAX!@tZA*,AuqWГz!xDJa؆"X
    !
    zwzKa2L!Aah_a8lA*avȁ^
    AAZl"a<TRaAlAAa|`!BP&Z!DAءvzAY#ztaB2a$
    Af8gXR~vWa:eMbtdA8nZE�X1%2TO^!laJ!^0FsBY"S0eLtLKZZ
    lMA'$kKEXefYbb&Ņb
    9qytlAaaeٕ	Fq�xٙU|wjL`^}`!:lA<`!rRa6,abeP0!�DJA6a�,cW0a
    vAVl!T&a8!0a H!ݖafNR~la`h`:I`f)IhAAHlnF<yNmA.pbƪeH&$[-TQ:trOfggtt.
    [dz_L`r
    El+fYo�lag'f#J
    a�mIaD&^afATagr촏aHQ#
    A:(7{X
    Fg[eZᶘy�O
    ׹XAI@(盰a�ߜ:DE!CK$EV$IhF$H=o	pQ%|9çJÍJDKD|K%:&ŧ<=\|A֣=d|q<?C}ǁ<ȅ@$A>A"gBE7c"z#-<ʉʵ|˅c69$rC4|ʣ8<8<ټ7ˋ$|ͼ9|ac/\8$NA. l#*#0?-9S@~aTA~a"}d'l=%62$b!d
    cӛbXgՇ]ڕO*#E32 !ֲ=�U~"(h� d-!q+ =Ī*B#ap2;hWh<j#�,0#!O.>8B=�<lta-A
    ׊k	1a"Dbpa	IB9H"fMb(	%	"#|aX*=NtNv"6[
    $Z@$
    "!%&$?&$?Xz4aanaa�AD^aiZa_?͇2a@ǯx.>bSb"*�HZ$cMju	@!|	,b"*!п7	�SBCT 0Q`Z,W "m.i;d0��"jCTH&=J#C+*`l*mLiL^jfA
    f4I[O(Ʃ�4Q[SJjը2VY\RR�Ķ*A
    P	�`ilaÃf*e8\$urVJ)Ƥװc˞M5(Vs+&Ĭg)j R�Q+FHٯ]{QAPL\[PO(�f9r4KOe+JVQR'o,Ad<7p",H7 !Mc/	!LXP,!"#
    'vHJR.t"ݬX1";"4.RP(8*#(c�Kd0)H�LeTNVUJh&.O׀8p4e2+SM(h�#3J1$ܒ&2wIN8
    !h�12t"-T
    4)|93u5Af=*Ẕ)eS+Fs͔29e&~)ܱ*(HR6΂2m�Sd1{_E SfwTh �`4Ba65L`XІ;1# L+1֥7iA0J7aP%%2d02ʌMVH#,È{fi0m*ͥ]}UQ%38RO5h[)B![3x	|LŽ.4*۔1C,E=|@1 
    !0(7zKV̀S-I5DӒK6([7h;߫	�$,C	"
    ol1LI74)-"Lܨn6{#*5n`7Gz˨R0w[%EPhZ�1Ld%*"1
    Ab y
    rqc&721,�FL͂q"cЄ[|cﰜ`*IO{Z4pF!daфb�gp'ȓ=*i+iF,q)f!TF!qa-d�bt"u3J
    y8#1.ibz$qeNV
    "VR~EV6{%^Ќ
    yϊA'K(`:pSE>D8H>"U{_Amgv߰WR<na􉃳@"
    fb�,Y`(0�hrB̨F&4;4cЛ0%0;qIQJzѐ+iPbf,iZ{rh))A2zB1V2L
    J
    
    Q
    E Ev\aTeFM+4Seqլ>Y?ܕOζUg|+l)�2�Г&S0CɰG
    OOԷDF.	O`HxGA(Y�%`Y ):f�'Te=7V7s
    a޸K�L2@1UF;aV A61hFL[M#9FLi"1ǑiG%&/d$h1.R|;E3ȣw%DracNe{IE><q
    "�W.ra˰Ď3x"P:E>@Q
    
    BUhf;$Q
    D 	"BI">QfV1ú
    1ٖ3bkM*enЏHq8@-)dl)+	M}H&̑
    4k_Թ�m�~ĺ .%ѹAA	Nۙ M$HF-Ml,0Ǧj,⡒$mmD%$A b讈"rC-,$(E [w]{gD6!cІ6aY#ވ*2t	R5$c\Lz:^ň4"a_QE8Bn|YgX!C A0px4W!pqu='];b7`Y܇gVc QU!E_74Sbv"C18x\4;xِ67s>xI+fOiRrZ?C{\4<w_`rF(y,7
    y'(4T˵g3W׽kW"` 	*ݟEXϿ,z5ݗW}W~
    lz>1M@	0�x؁ x�
    (*p,84X6x8؁
    P9@B8DXFx8
    H؄F>TH@	p	@�^`b8dXfxh
    ]pr8`t|؇~H
    x؈~
    Xb؉!p4P84hpHX((�x@�m8�8XxHlx(،8芳hCh܈848xxpX`Ը؏08�i8X
    i0h	Y �	p		@	p2!)	H
    >ʨ	=)�‰`m@pQy0WI[y]H`_OQٕcIXVQ9bY(_0zɗii						В8ɋ0	8			0 		inPXi?ٜ9�](`0Y
    Y	)H�P-%ɛ)�*ٝ	h�	
    p@]�MwߠP꠴
    c١xBYP�
    `|`ESf	p4HX-: 8@๋|	2`H	`0H�MʅP*Tz0Z^:`0?֓0
    0
    `
    
    Ք
    `Cp/
    P>Ř~Z@f z0qz
    
    ŀ@	zZ
    y8��畉 ҊԸp
    
     \
     d
    	�p
    � 
    Lys+p><=
    �	0
    0 	P'[)kP
     2˳>�А	)�B0;;V멞 ^
    `I]+
    @hmrt{UzQTs�Q@@t
    Ea8`0
    Q
    `=84֙Qٍ؅	8akiܰ	�/G�`P��
    r
    Yp�
    	jP	Ċ;䫎�pƠ0�Ky
    b	܀`		'@�CBuY)
    ok
    
    X™*Ƞ;p
    	
    Ai	
    Pv
    ^
    P	`
    	Zաp:{U7�[C	J[lK{��[6�
    huL
    .
    O D
    �pgȧȒ<�Ȥȷe  
    	L(i�			&	o
    
    9p
    Y1H�
    p
    	Z				�*	`	`Ÿ8�`p	P2�
     
    	߰�SG	
    F
    �@͡
    @E7j-
    	Ñ?miP3@<f`	5
    9,� �
    а$
    �m	H\;i#9pP
    "y@0I@
    pSO~ဓSLךեP
    	e	wדG0~�`0+�ʀ�@Myo
    xٜP
    +bl�ڨ{z-ڗM\hQA
    
     
    � 	d �	
    p
    Z
    �
    �
    C@°
    ̀	P[
    2@0
    ;`@�
    	;@ 	 �`x!PO0O[M	mU)ݔ؊ڈ_`�H!>Np@ʐ	�
    }Rϐ΄,;|�
    J}&LQMS]O JP
    �=֤@ L<	kג֥@@
    @	 	zד�
    Ca]౾EPg	ڸ(
    (-Cz�
    pڈ�
    pڳ]۬ہYи`p]2'$F`	^|	R
    @!0	 
    0@Z
    70}
     )ހ
    𨨉B
    NRt*P	Qu/<}9
    ;D@І@ FJ(E	։%¸P
    �`!
    L\:}�[j$Pš`xP=YPS> 
    �D^;԰U9k
    Ð	o
    Cy>ŨNl�ey�%ỏPP
    S
    @p¿^@
    0
    ۍ
    paȊ	 	lπ�]xi@�	
    =mv &F�iLmJ"Qj,c$JܫX6i["I݌˔YEDUVLIY@ۥ-@,s	%h7FLɂF%tf-@[#}Z4-PmΥ[]yߺF\#C)2蛤D!z6DLaU)aС액^}h$WR!FI%nrZȑ,KVT$g@HѳX^EuZڹ{@-:"*TP*yd	zQ	F YǗX^ifn%EIpDT&�i	Tٓ![Q1đE>FPfU|Yē$ĔwYhrRF -G$1ga'N	�&uI0gXb!gDs8kAFT1E8eAHh*!l`$BF$�hT	`K(Do,Q䓓<iDYt"dPfI&H<QLNΩj|df�٥n%KF2;h1NyӧK	`@Dh 4teEh
    qd�UɊ�dlw3`K0mW)DYe8�[YJ:aAD&�(f�TcM7Fx
    oA$kFDu&�ŒQFeQDLNjfdL瑑fϽ�`K&yphFKyFghmbXgw
    D]$JRDVqg9+o
    V>faY$gDs?b\]RU*fDF~&d\㟃^DhLuY杋_Fg]n-thAEgvryCG5
    lA
    U�C *qeܣE5Tm4xaHX=S]4b[�!p*j1w C�<
    E,@LaD$`HD*DPb>A=Qc`眃jF!'
    c@Ϝ1aŭ]O@/!
    M(-ː2!7q�2!WDb�E-lQ
    FlYa*&!$IbD%	Uҕ$v葌p\C(D#"DC�S|T]`qՈiG83
    Ql"pAo \D9sts!gYq˛OiOs,jSxE-jpVU2	y8D*vCXb@*L	L	@D)t˜.Nqq¦X-@q
    ⥡hEJW"-I-T1�IL!XIe�DJXB�(-UUl[&
    [.XER1!K$lafFޥ-DJRDd'떐1FX؂IB(ɔ7Al
    1�@4e˴maLr\Z.8!nKVmM(b)"V\ B
    /:"TD!M
    oy1F̗۵liv.¾4D(j_hwĵ"]y]n+\s.X!/tM]X+oӶkxlcxoIA\#'Y
    j$Un"ȋ+Y[O̗6i#bqwYkfsf8Yj#9Y{sMσ&t
    }hDKVt6VC�"T$iLgZӛ1NΌDg)jT'+ؙmjXZֳum}XkH}k`֊ĥz-ld'[fviTBΦv}mlg[涳!
    Vt[ܱN%bq{ي$g!�[w}o|[F+8o\"d1	'\gxoTx-~qg\8(Xq;`DMp7>yGm~sG;y}{yɇG8̙^q?]=ԭ~ug}Bzu',)4CP3ьȻ`	WwyYw:uU"ь_cP2q_,#x;,|GEcysBS�}f CXF1ac,80ǀ*
    Z\Rs3}�h$(
    ׏/Wno,x_ΰżNx#bHFV()b`-oH,˨FC|877Ono
    E�K`#Kn,AL7>+8\X
    oX{[=m`9ԷIІoػK0½%&7dVxwˆS8oo@]8SMhCȷD1PBXy(ԷPHzfQV8XІen(Dl�Y@sFlXR@Rn`X_ĖKYG@;EKпehy{(XVt>GpRQ0?7PiAepMDÒDOlkMx#E;P,al/pJ`y]1$4x�KHBLB�H<ax57e]ЈBLɰW�xHMH0ܻlЄ"HzJl"�X=Jt�I&TI)8yCc(xbpHJlI xÆE(÷kpJz;8WPxF�P˛s�m(Ib(b<D�fA\ ysKG8Q:B`0)j �K7X<WpkDPȈe)kt�%z;b7Þʒ�`yӆyC;Ky[yKn8Gy1_�pz͞McC�N\xJ]�d)hFwBExN�=CB� zaЈtEnpEl�OdOԈ)7ܔ,zu�hHNTW {P`If(Ifp�8PzJg RP
    Q[>iNJԈ�d<\f7UMdm,OWnpLJ(LCem'm֓MLܤDyÆ$M07GQ`x+b0pԈYټMY D�ah$Lp@[x[n>JhTQPBNx=7l�O`ȎVOHqF8zx`NF\C�eZp\�OJlvJ8Jr(
    T؆R؄[agu0d`0IYz T|0\a�8{nbl
    c)?}US]:FXjRkd"}EB`R0lp(mIyk[7,7]e=L1,x;SԜKh;<>6@b�0IȄlXCZ7MSLBCDC=BL(z� Ť7rqNNqp S7[uxo[O�BYy1񅥁g(Y;7ftxrOpOZnhisMĄS8؅[RpG_H1	%
    7Vǁo?mHʅmX
    9h`dU!%R#ŕ=>eR`u@Ԉ=C YF;dR(əљ8qR�YKSz|Ԉ`ګ5T	6yD`4wN][zc`g[SNzCO[Wz\OZxf4\Z�aዉSϵ@bHE`XdZX_PRm(I[x�x}_3EބU6n^8η9XX^3fPdWq?
    ;RxmDnZQ@G8S`5dO7hdMS5eBPl�
    |oNVy[vBoZFt0¥ISԦ4c7Ulw@dWxՈM0"o`SM$nf7Y[݆o0qidu6@QyMqLFf�cۖGShU�Z@^QņYPDbydsWu0W8E	h8Xp87DiHDoDF,i�ƞJ;N<8^{cX@STe�GHcK@-fHHR88WحH@U:zsȆlnq0�0t_ N苈軄rĸџXJ7IHxAC설hGɦl^SH,Ύ$7EG NlٌmئmvmJR[N^ɖ&n|,I�`n1AqmІsYpAe[�Sr(?PXjpEi8a^txFiO0hhsUq^lu$	WCCZ`7ah@pBqԄoհqhQkDs`YHNC qej�޹jm Vq�P>>NeS,peV͟mn}޷/r-<$rYYdm|r0:)Ml|{sx÷Dp3s-_r5%s4s=g4w9DIX{�Kx}CBtss-q$tKCuR/uztt(;Yp5u{5^uu#6cu\uk6iu_u`vaoa6sCcuv3Tw;vkW'@kvnoEۓnwqwr/kV0wI#5SSwq_5jla#F蛲b
    }y'"@2/x``)WX1Gϋ}x*ydFwx/.C,:
    3yz_,HE؄Ox$EON
    yFhz@7%F.cRC-#q'ᐡC85gkp
    {R{
    书G{{�0k(zEO4IЄM(OȄGOL7G_ֶ?"ϋ*/mhK8%OIɟ|OMMτMO2z(z7/;1q|iQ7}MP	1PZG {-�oC�d^@O>or�^	r	|C'RhEG\#Ȑ"GȈR,MM
    U#Glh"F.-ZD.u2(EpU*Z1@%N@aֲ"D,dD֣nTlZ0gh�ݴw{+nFLY@pM6̝;nJM<n!*(7Hf
    UgvTVKE̩H`Q"R""[C%
    9sﴡ^9miMƉn(.pӯoZq�+c!$L9 .&T-7tcJ"x!#/h$9ň%8,d1r"h/"!PMQ!�^n䒁Ab;UF]%~'MD/@4M(-/̘YЛ$R4C:0,"3dd#L;/(@%< KpS}**JmRD�E*4Ĥ̫K,C!83# -�+`�'	7-x#0T.#"",J"&0%('xA&&>h"o䤯Q`@,* Ǧ�Ƶh)o"'Ҍ�pC23\3=iN$"I/M.5A܈.r	XRň!"@%+b92҈(,2!)L+L*%TB$db8.rGjY}(8$7L!F@"Ls"pK!~"Hꕬ*$|H_<ӈĜVR	A0vB2;!P)%t.�%{�7>| K}37HH�׈m_QeDB:#,]yx(	n B HX	k("E}b(G* lbD#4KmQ!N1M("#>E<ZaTRX_Xz%OPM!J[@eV f܂,Q�cH-
    1o&,)A?(6m.gBMp$T!E0H6W
    t7`cp`$#vq
    h4щIO1SfogR&{9N8E5s05LqRp
    $ I8"DYj<"ᘄ:y|>O
    "b1ư�[,㊈x-:Aƨ|.:JՐF+vы100pP<D(1	G,]M]X`N\W<P4DhDp҉g%`<h6bt@*.fPcx%AfX(xCB`!iE%aKx"rG�:hQW .n@,iB)#2QL&ns[!R!"@qCq\KJIkQB@ʠ22h"�G�^x&y,S["VIEL1d3Ւ5pRLCo�Ƙ~w79ѩNI!HA
    J,j&$j@#QfYFbLxQN׈bE3=7bp*D
    =R$8ԥ�E5
    і^])x:&9X8F�r|3p<8!lo$&F9�΀E'T�p,CV!<BLixG/4!UBEQpw<pǍډV"h;AV`@Nd~v!]Cb!q{	D(76SkI0h<#D4,؆*t#,ymKb!�O$k4qpe2Sr[
    D1ri&	#"0P7dH
    '�)D8se@7<x0p’BH"ߌP6ꁍwclC1RbaE#A)̘D	Bo�j/`\@?+vwQ�L"DS̓f"�Ј
    HP!82@"~' D4
    HƐQ	uQ7N*z�Mİ]9"㖇uW#]+eWymG09Hr8[ކZ8wg(mxc͠3R
    #B1 !Q@@(3@+D� BxY RF� CF%x'DI:B,B#<B4(0BD*d6B#@4-H iĠ:j4>4-LFN$('zH6ۋX-`a#,'z8$B-#@C.$;86[T@1-P$9,BNLY!N"LY-b,B0 @-@�h4T!\B60i0$@)8^,`4HZ[P&7 6BZ"N�!,Cw1*2 B3$`&1z,*6`B�h KC)B2t$D-ق#l'a$DB�<B�B3 ѩ;*Vg/t#L6D?p B=�(BGP*@1JI-�^RB!p
    Z$_7�<XC$<
    i9B ƛ7<"5,a%%؅2HCC).H#$Q*QK&8<sL%BA0@4"\II՚1(
    %@4P�D80xe1%4
    MT
    1("+$Q381_򥛠(D3@/6cOd"P4\E(B)0B$44@C4$@j&l(ED0LCE)92,;L+l<<'IK!8Cf93HC%A;,.9P;!�/1|B<G<T,1;:<;@$ 4L.>�*/8C;T,\)B",;,/G"B640C9B; $F1Ph8d$(B&`i>B!,mBQQvC7iJ1K"�
    ./L4(C#(.HCt"$4h"z�ee,B$�)BWL`'l*LBJB.l"@B^)*l8S$،bVN&JDNB$Et$hN:*J̡B*4BFT(p0!p!j"jū*�jj&EE-)+,R-y[z,,!.l!X,')`&"_pk+lB,&,D,h+;-$B,-(&)X+$\)2B#,anBM&,+-Tl$B+`ƚ	>*Ђ($&dP(LԨ5)-U.ET,`<F*#--x�(D�#ΉN�ܼpShYj*؂PLΟ¬
    jb!B}ޖFنE
    IՆ&
    �i!D6�ȕz,BVnw&N,H*ЭV^ ݎ-M*""ޮ}Ȭ٭!$.2n~ndX~NRdz.TV/%foH	6BqbmbVzł[�/Ư/֯
    #p/�KJ�0'/0˯#TGM~N0go0w02~xolI0
    '0#\B,)%ǰ0
    װ
    0˰(K0ð"H+'/17Ӱ"B)W_1go1w'('(1+%,�(Ʊ1ױ111  "
    2"'"/2#7r(8$O2%W%_2&g&O2(&2+#2)7�‹q)1'2+!2-2%C-.2/2(w/O(.r*11W+'3%23?.24O35W5K20_3 6o1;*)h(B1<%-824q%@C:Z&l2w ;3?$K+14/!C2(2\/,C2C;c7E&1*X-01&,C1$1220$2tM1@*q%44@%gs2@24ǁ(.u(B$,2Q1*P-14C1"luW7s#4C*"31.C+71$2r�u+ܵB4'g>W5{B7pC%b5|7c_"B`[JPdo7tfgg[#(:"Bwb%p1J"@+6|H$hC4os�HoppDZ@"$,+bAC67.)6&!q"pIYc>h4(> 3"7$9B6,r76�@-9w32jwу'/@8aW"51G,Ļt%u17[x2 --5*|"(42|&\"'<K_'l˵9(8!0X8`%ׂ-=Ji%\6N{y�Cs5bn59>
    #w+=(&Tg+�敇&�":��w6hn'zC%ıy4%h`'Xz�pp4(&JC)q,h,QBJY)JBJ16,B1�_U‘q5OB5b+$^*T"j"6©#;΂96H0 B14"däWC>#.C12!0C5\c:;(;OO\6Du@_wXx+Eı6L:Oq124&aq""B /Q�ܚ<(Bʗ3B߼<{DZ(09{©"#;y!R�r+}zױ-]�X}qÈw=ׇؗ}�oσ)5:4=*L+=TC(@Bw'18b+3xOB=,C#]35".Lc;�)Чj?ö4(>(:;c=Zo<(f>(B+{<q'&\K7Pc}eBb, 2,6B�bOV#3'2=(bCTO<~ϱw~q!D"96@
    ʃġnE`AZan
    S�.iUݼX)cAQʖ
    P"1JRѤ1�F1[�ܔ ӥJJՈjY4&'ѩz,h)�hR-gaItQ:F*@2[@.U3Mr딺UAZ`iS,\m
    4Q%lSm&FdjCpK3VI~{v۹w|X7/2OHn>@#bt~⤭Za	$(fqđYR/YF8J۰CPp.%MJ|EdDC C&$h@|٥D*L.ц@RL*&KȡE^^iEp~)'5uͤ
    �`l)# D|g
    RU40t!ǒOdIn$YjTQ  e[!LN9E	Yk}	n>	`9yOL)L#W
    CD12jo*8+Hxѥ:=t#O	h%܃O>껯|&EO	@a&&8|BH
    9D="g*ԗ�d(a^ar b#aEf!)}hn3ihv1fΔ't1gT39TOzE@	Ь<
    j+hQd”nK5:YHԂqRUIfZV[gh
    ygZ9Ɣa=2֣J	Z٩X0܉G0U\Z/eǎٻ0ޞ{Ozv}5RA�%Or`h"`IQySU%M_#hc?Bf
    zn)i;71y7s
    D,�*
    b
    P [�w/�M#!7S 5TȍolP-x
    `,FzCQ(&I0boE3шc	#f,I*F-Kb,A"l@4DWXG3Z#<B1Z1|$Ԥ
    g @Ӷ]�"r1D Z"ԗC@�+}P@#LFA�}&j7\CHF�RAG(cW|D2v;|F8#kF�qzySK&̑
    44*�U(8w�?/QmR]fFP%(HU�AQLg�(G=:QJ|%-"䴡H@b)=FYBx	EXS(:ikBL	%$!T&䨕 j�lp#2C8
    m#EG8�H8r	렆Rqa�'.qi|E9
    rHƃBl0*$tC9<HXF!p8N5h|X51cl@[d45�X�B\й6AbB<8
    f/E7?o\C)=o
    NF
    o:_ڮ~@׿ڹW^;E0w`')bV8�p~(+QI\)+aw)qb	9ֱ}YLa:%5�#IVd'?F^#\DDYIW\f3MVD*JQ4q\g;̉+g%'\1+`P,.<ґ)]iK_ә�P8ZӡIFP"�uYjWֱ# jY׹yk_ՌE+]I3"D#`AQPjFvĵLmk;b۶v-q�VٽnGh]o{ߛMo݈ZBi#%{[�~tAFf7#MpkWۍI^o4@-{�wp#/7A8ͫpsPąt	7#,hGH[@$M|bኸ':	J�^ok]t[ߚw	C@!v�t?;z0ՍE(>|jʏW|7z8D#>08ZNxBՒ&2	Od,&<avs?br#`*nv$M(Bݎ$/pO"X""0'�PQwxػ%q	}6Vo/<(a:642!o,$O.~/@>a[0N*N<Э/>Zbơ/ʡt-BanP
    
    nj!!lP6(8.]�$p-�*jm�6aҎlҐ:@QIQnRZq_`na?଍�!aaAAO�!>o޴{`ዪm�&!^ϭU`ap�jfa ̡4q
    m6ᰰpvX~!N!IpA$ZA
    ZVA!Vr!aA&A%BLv!"(r~a !D/*AN)q\AqnA!ݪ.ڦ!d4~A^A
    ~Rs0j+?r+.nی!aaAAlAx$23DH!AZ6s33$!SRN‡a5zA
    ls`P.:=AP:SX: s={=/veHf=8a`
    na<am0rXE̼n^XBjA0!&o�F 4nbp--Aa$DڴFnNf.o!P!Lan!E4	BtEVp2P!H
    J(Z-�A8aLa8�$$xQ'1JtD/JaS;(Mp2!t`U[UA̒fK5A$.a"6a/R8�O$aZ>OL8.A*/c2![C"SWO2
    N"a �!
    Ծ$P&!P`b�d#(VMPaa5a	( 8a�@J,d5VR �A-
    `a\O<vh�irQXAʴ8&(!AD!8Q z@!XJ>! G
    hbu$.Na/DaB! Ж2ʮt./CR .[A�>V@o#*n /U(>!!,xbL� P47�)!6"a<A
    N($!4Ե(O(a
    UC0�\Ya36Ld|A`IV!\M]#!:K56KWS881Y!AX-ngaY ^{:>a!g!P.]GOpҮ^+LP !`+{47&9ȁba1�xVS�la_OkQX*�RyE9S5�laF|yu!!||yT\hTAa`kw7:AdA ab&cPa_a(ȡfxA!'+a8*z>aGL9Axā<2!pA!qA@bapoL+n!d?ZA8p8X�AJas
    Al(A�x,8q!/iMJ3A(8Z
    AhaAل}GӘgؓzaCqX+Q-6Ta'nBVA$8c[ɘ\\qDQmJa!3J(_%aK1)(!oy |2;э2$yWZRy5VaZV͖-f!V[W/!|ui9A|bn+y
    LVaMlJ`0a9!`*-8t>ypaNa(�(<"`K%A21AVJa@!7$	ιJ!<$`騼Ja5CHH#A:*VA@!CO!I4dpAF)!"�*|lmAXDZAV3aTSXFaCRA;{M)Z]�rzAVڎxǜ{-0b5,\U\GfʁUspA>/8n!]808C?M]%vaod-풷�VdIᱪ?㾡$!eaa
    ahF6vH͟ #bG(2Ĝ0"8c A�!La/	Vt`$Ea0DO�ph,>*lL7D@,4ږ7KǪ-H8J@ۅ,oΜ9¶Cވ"*@`Eۤ7D.݆-NR[�(E
    7DV,UBڦ`5Z�j↊CF,B@:g	x,`&pCH@#JVH�"TA.4,XDjHѨk8nR#ȶq=`T+ċ?<yqGl5Sd7I<iC4=m3#˛?^�(u[x�&n[ȑ,K!L,0J1"#@*H#<K�D3�"LHj^�Zz9B+�Y#x%Hc1BI,X#K,4H3"¤r	J6ؤ4""0$"$#y4fFC48'iۨ"#28M.{4Jb;,Hp1 .P3�K,0򌨤.j-׈*g"t!�,
    bB@S	!d�#N2"	4�M,@J�\B&<ʅ,2]�+0
    + Ҍ1`.),'S	v S#B0c	%tp"Ӕ"J5(B((6Jc8$\I�ؤ
    $@&	8tH3
    "4)6P"&|r	'7.2
    "4*C,�/�XrsL!cI2#юҐ%L2<ӊ3tÔM%PlsH!<#xt'\҈,/_($d�s6-t7ȃ޹N\pوr"+R
    �܉@]x|p\<HL_h7 5`#N"BzX2@#H#Io?,wscP"h�(HH41>]a `g<p4AR0%,Fd(.b0$%JG`E"Dg8
    Tx@4EDDDĈa(p#"i\B4(B"k\#[-4D
    SX2WlC|d@-P!gH|h2vqrP8�x!
    hI<!u#(:R!R8{D2QupD5	Dxp�xED`H
    |B2g48>کa"D*ܱ^p&Rb|8G3"`4pnl̀!f,9rÐh*_dprW"H3,QQM2
    Vj&#SP@F3QR2u|hST(/ҁ` ߀20`U(+3*`u8'nDЕsЯ(a*#JF4	Y#�'xE$@
    [`w>1FB7D.&:QOmnQ%E&HpG1jBrƉ*UOvD肗�Ю,&4-KE("%{ʗzUK7-#q1Y(fZ,I-lqf
    ,]lE,؈
    S`S,nbh&dHB'$Eb
    ,.6
    S-NQ	[�yE&(�CXE
    3GE,DaUB.L	Z;*
    a
    ^x,f8
    ]|б$Z
    XB+pf-*1<"8ahXP*,nKY\BśKAQ'xY8)XaI<boqfb#"TkCh)":qs("NaSb<(+atbݏ0�S)X}vɵQ#нZQlx�4p&y-őÈU9='[!"Dy/Mr9r\}խ\ۇ0#rWS(P!A<6M]}4pߋ"
    Eܔ*fqd1!#n46{nBHzxF=Ť+m?fp.uZL!=7ڶ"x=!EďDZOMëxߕgJܩrCGADƷ_^BqyŮy;
    {_r~<̲Ԡ	|A�
    x
    0
    }đ0
    H#�A"$UŁ}#;gY#!^/1(3H5h70(�"?A(/:CIKȄM8GN(Sa6 fVtTM$]fQ�`ȅeP^%]gfSцq	Q9rnx	=eU(H8M
    PTȈ舎 -hP
    (Hh 
    hU@	#7苿(Hh�EvȌ0	Hh׈h0
    (Hh
    !sB(�	8(i	Ɏ騐
    iXᨏ	yɑ	!)Ȑ#Ɍi(`x
    )s:%!X	@hB=	x)iIp7ƠʀːPRы̘x
    pP	pHp
    ֋0
    NdA0ٌ
    \U9ưʐp�	
    )%Y3),@0,Ў`J@e0 -ً0
    .;
    6	
    ќ
    XiH鋞
    ܐ Ӌ(�i	6
    09F|	`.Q	
    )�
    �}P!8	
    C�`*	
    ڋLً
    ;
    p
    p߀
    p,P�s	,�[!pAX@Ð	h`Là
    	�|0
     0Kp
    0S@P
    �*	`ə@
    Pprً'H		ւ
    TH-DZމ0	٠x	`XLPp	ږX0z
    oW4<`xYـ	p
    �`	)	Ћ	J	ذ2GF#ڍP
    2ŀ@	"	&ۋذŀ
    x
    Y	հ8	^�큣0	ހY 	#lx
    Z
    q0P 
    	@@
    0I
    }ًpِlC{K9ڋp
    Ҡ�6Ȓڀ660Jꋉ
    )1:p Q+k0�݀бZѼ[ԫT@ p
    S뾾HX@
    h	P!�
    {
    p
    �RV
    ?)P
    ӐĠP+	
     ipŰ4Р,a�@@0
    \*	͐C	+p
    �Ā,0
    Tp`Р$[\0qH̶ѵb[h+
    cȽX
     
    ȍ34۠싩@QH[¨#K��ې;*:cQ: p:�``ۋ
    `jpN0I܋P�+5K[ p
    L@�P		;7p	
    	
    f̰P
    piP
    
    k
    =]
    P@P@;k	`	
    נUՠ
    p�
    
    	Ͱ
    � P
    @	�
    yxcP	€�/=-
    Se|K��4P닄 
    p{ِؐ
    @2zu9P	P`ȇl iːȗ	�\Ɋp%ҋPʭ6lۉ*"|0K<	ʣ0?J|�ɪܽ;ͼOh͊K
    Z
    @P׻@P[h߰
    u�,ۋ)@2P6'<&�ɀ@		|
    9S	pĠ8P^; џd
    ,Jwm
    Yn
    KTೞrT
    
    m@	ϰh�Rk	P`66S
    `׏	�Dz,!
    ߋ؏x
    �	 yě}:)DŽ5
    I�͠۰<ۘʚ܋/ɚ�*Y^yP6
    !YH
    ":3c
    ;=Pŋ}м``>{غ.NBп<30S!̠̠
    @@
    `
    
    	xs<
    !6`b"c.]~�6ɐH`İܽ
    
    jJ;	p�
    IʀPڒ UPl6ؐkoƯ	y+LǷ~ڿ8u{
    ˠ	ۑl뭉>λ=(
    x(�J�|,
     eG9
    -uLԍz,8�
    
    R	[I,`}
    \
    n
    f`8?̽	
    M/. Rp@
    
    8:
    �Q(mXX BF1dYIv
    ٢F0"*!	T&հZzY�f(HM+Uk&�[-uzp$X2ئXIZ)0%*ePaJP+%qk߲�pi \p~:S_HF*QV/^r4RYް1"v*d
    1\)�&F¢~H�Tɺ6M.!BxrΡC~jB^xZh^`!2,@*b(Y`d1b/@N[	/DhTɮ,fqđY -snDz�L_q`Z/)'+CNnG7H2JNH"I%
    	o�% IJrJ
    E$H�-RdL6!y4$	6!RN9#1SH.I(s%%AT:rK&b@fog'o0aH]є)'(P֡3iF O.9gOʑFriP%z9ggچXqGhф4ViCFmyQ{ŜbdYGTї1G�6QјQ�4!VĹejFEU
    EQ9gp)s?Vn![	'CH6Pgyg
    Sq&Car}<ƚjцeRE0k|lSHeh
    /\osorpG<Hgm(	Е/Qz<lsspY|ug/kqڳNp"\ptNib'M}2hfnqvI׾svovD`J6HI|qE~%7
    <3ྦྷg|
    T 8`W@
    �dA	E'Da
    UBЅ/	W"1au*B
    y8D"шGDbR0Ob8E*VъWDb"D
    ,vQD,&D/,*K0�oc8G:юwc(G"nc 9HBƱ&�YHF6ґd$Ubd&5INvғ#1VҔsdD&bQFҕcda	FdD#niBGؒ'-ER,1}Ke6әϼ#@Ӛf6yL"%g89NrӜd0mBf&T:Ј\И'#9x>|	YDaҗ%B͹P6ԡ1@ʈ64l�0QnbbhHiP\ܴ1x:D/OSb(qOF0ORHB&5ETlvSߴ%qCR�0!L,b�AUSd}XV10[կUr"�yW6�z+]zͱX[ka&v贤;щLuը'>aDV#zB0#&>s"&G̶&:QfokLxb=n'	EL(D$`{KFwLnv]R$&hj~b(oOJuD!a2݄q˔ʒl$ZXb�8zOXCT~^`uaaKޠpBP@LukYZ-pO";D-Rq-!;pMqf1#ja$9)-lS9m$�!(	*<f.gj-tوʒ 50G2AwhІ<�0#\Yb9"l5_%iQC鈅0pȣ8htC蠵<U8F- Qqlb}bjW؜h+!`J..DKyokF8a
    2+/#qx&]BZ7^�Ƴ@qa\<1QuG]~wCSM## iDc0"4aE(D`ܖ:E"!hCo_.bJȄP/^!l<Ld_0}mvyȿ`0ԕmF}i(|}(G0e@ź>QL"XD!edVg"	w9DP!3B("DX/~vC !
    `�dь�BpCp41Oyl�G$a] b@�?�$](5Fh7#'FdWd]BP57b
    �eI0o0RfhSnE;:nAw](9S@Z9wS(DHo 	#Di8EHnB8o0oVJJBF@C8oH0D C3T4[qFV*;TsHBBJغ"��Q@=o?C� ;l0S&DooF;DMENBx9n_ �DlXhH EO�Y(]Bbr8-b.j�hPCl Nh2/D_ؒmoB8K`g@QXMG`N0g�L8o`C�f��P?
    Tq?G,m0HHN4MH\Jܦa$Y,cH~LgAH0Wg#BL`AoD`RoTlLD9̦ t'E8S:\jJS8iI	­,jxHzKH˷|r8ZBX^^R\e@-DxZP͛U(Dpc%DLgjVت�ȅdDJ� 4pDCkG F ExM:%UPEU`BDLphZҌ+![X}�PlRH;W{KpS`d(kL(dsp>�{xbj`Wf b=Dg(@NxBsFsP	.mS2TDRDPP(
    &I(gq+/tI3>*SUPI�J$ ʟ4J1E�,53Dzc:Rt`x_h$cK,jE6th:iJ[ʍID2^x9_bhg;HpLԥ:mahgX*_@ΜYqHg04MD�jxA+KMQͲM;qXipu#j3]:N8PNxMxdpGPd	�WzPK\PSFPK{Xxlpe(e[:�KxgnWzu{T@Ce&P}U,Q|u&RMKPg
    \UQ7X"K'A;=|(%%Dr(CX_R[Q L@CHjҾj^�GoH#ٍK]tIMKè52BCV*aZ=D>CrF(z8GV"F@lmЧ�ЅKQE YmT`(NTN`Gs	P<SUhpZr[ oH�E�l[En8OIYOPRZHV=O	ODo0qf�X8o�p�rZsEtXX�Y"נטߔWs)[hE06-Dd_NQv;MhHI
    �X'B`T(D8Q'H`T0ExKOg82JCZԔUJ�OD_uXxFxf\EЗ&HlT0iTaV_@ai\G "i@h0i`-^DHOĆmP
    qb[FXOgS-Sxsh-b0SpgSnPJKA2[I�sXT?EZǍ,
    gPgXHT�gѭfXLWXC�lV�"FFXLX0M(SPlG^ֆNsPeRp+$8I؆���pfhΒwZ8+|FMW5g*WE(1jetP̘_&;g`Wx)�NC{x9xGkXvIsmK'eT]yJHLxpxw3'9x_aiE=s{g0bhJ/*[axb8J45:hhjgTV=xg8{VTh{>`hGXHphg^ *g@R&E(Uh.Ffd_hhk.5TD2JHwi
    H`TXh e=s\8F`^\PpiC jhJvo(.ij@`Їmoe]8q�+EhmPichVyPh] v@hnEgKUd@J]
    .sfJwsnkc0d{6i')y$)xpEie-haLW\R)+„O1T.\#OqE qz„	¤TYo:&C@�EF(+4sqCd7qN"\E+!G~nB@�*&E (r*_++,g'VMr7s:s3ǢۢWU[*OXjHXU�(QFxXXЫRЅM8KKY] UP8OIU؄Wo�L1[�Tt
    	VτtBwY[F^ZPU`@T�va'vWzwkSp[߫\ಿ9#Q|6pH(	Z[,}<iªu1*DХ$z'{wvo-Bve7gn,x,ʪxEpת=;CwmRB 4DD6bL1ECÚE߸+x箪yjw{wC4r4vEvOyrpwYz	y5
    \#0{>#CJKRH$KQ*%TZV{gXZ)27!!R|/! rǧO%j"|,".$#1"|4R)!xg	o} 
    7ן}}
    G_ϠW~�~'燠a~rf
    I8pqbx_MNnㅈJ0M0o p "L Q!;)9E0ѱeLje$TiXx2�X+5+l,fƒST0cːEHDOm3bͪu+׮^n
    ,ل54P4٢,IղvD4Y%)k&YP4|2j٢WVō eM4Ck+N_]$+tAOݸ
    P۷f9
    HW�u;&nZrܸkp.7yP&y+0�}SroQ\_~7PCy1([̰J0d1M5,#7Ȉ)A
    K8@!D"9	!b@l�K%0M,r�(p36J-*|#[a唰a[%]E34bgdYUחot9%/ٲ
    a!A("wʨ5$"'t'lM@*@(MZ
    7oXI6 &HP-=6w6
    &+,"#.=TH6T+B�hR"p0jAP2P67@�Qذ+o�简*4m$/wbK(0#.KE�,0KAx1"pxln� SH1H'"ز2b"z`1L�@Mm4K34X^:!|[
    Ʒ`u�X1tE5yR
    "%3AX3Aڨ,0r-2sZ[FAtCbB@�@8>Ply7^yR@�t3z(Ĉ0<ZH7R�^z;B#!ݔ͚|�Cq)JP2.,$+GPb:
    LI5,+"ǤE�RFl r#+n+ݦSmXpp ӠAD*�ȫ˔	K
    M6PjG l6	1涷o[
    US"B9OW@&W9)΂R�ъ.sJ:
    XA@V
    oa ϐ2d&2;p+#e0B1#t@=OzA2__#vpB|$#>C/i'J(P4h"AZL4
    fX(H8̡
    l
    @8AbːD|]<(NF,Q#O(,8F#! �WferPA0oaA8O	Eɒ#
    !&a*b %+ MBA&F8AEjPl!-ы;Nx- AluG]d1ܗAoJ@Ad�bN6�@؆3Qy
    ^IoUD(|!�~ʰXE	F",5ˆxxZ`A6	1
    	ЌPD@T(Z@19 �E2>DdvkU
    , x3ڄ` f�Dt#�Y4HI]XV (LFĦC{:cC
    cjE'ɭ
    kEVj4N[!V
    5I1V5yc
    QXe@XYQS /,}@Q{2ӄ
    ksd
    "
    h�H'3hH�M2qS�.E2f1|FK�o
    op̞^+О	Btԧ8}ho\oܞ*FvΒS8M#!xFy
    Odqa⨣Ojilր$ET%1 頄$jELÎr(+
    [Q)sS!\K	X6ZE8[.-D("ODAB@sw3ǹ
    ^0dSAG$(�D257U\!@8[
    gl@2al8І8!S`8l0[.QmKM9tEEHJTU%VjI@"q:%bk";
    WD\^(P	a"o1)Eh Ko&QS4F8AI,.@QB5B#
    t刅zfqY<#І-oc8Q�Bᰏ@Q}k`_�
    v0E6AB&8(vr'D`@°š- BL]1&AR_Y^i> i )X`	R\ Bp`z 
    `
    `�
    `M` h
    %(�HRaZbajr.#($BaV"HB,`aa*B*Bab 
     a"+b"Za"\]"B"*%a%0h&rb'z'b((&
    #B(db)b++rb#PB,h*-b.."(:*-0c11"c2*2"#B+0c4z"#dB,TB#Hc66c#,XB"	@8c!:8N!8#,9c8;�<==:�?d@
    @$#̢&#A*B2dC:CB$>60;Ja!5#Ta#XaE:BE
    dFc=aH!>2<F8:6dLd"5B#�B:B:j$cMJcJdQ�<QNO6%K>;2&X#H*U6EJ%T#xG�D9*&|BF*%|B't%##0BZV\;:XJP.%?BBbe`A"`
    �0`�! >",f#(&e#X!`f^gB&�hcdNfeRi"fff&eZfib&@֦h:!ئ�fo&kNd0Σ#('xB-J&lB&x'd#\'p&x[#L_#Н;F&%@:$ 'l"أ#d$pCj$$$"D(m
    C�^
    Y~�f@:B$x&tBqB&tV['4':(oJ$0B!@{#bz(J"e+C#r@&'(\J%UVUhYRzsfBNңWv7$$7!C/ 'XC8x9|z&"B9"# .py-`c?hAf"B-ȥ#-#b"BY&$RJG(# G":œc^.=@%pB2B-=# &|\҂-<Bn&*=,*Gjj,B$E8C5LC0;7p=B:x87 c
    "f>zB3B8$+H<6BF\2,C7B1`6N628|!$9TB.&(`-0(l9P"t8ȃ:/CT7~>6Cǚ<x<�k,B'C/Ԅ8c%˺Ҭ@2B"̈́ϖ.PڨU.+@~-9xP)X8F1,".(8&%x8.B/!0,B80ۆc#@1_j*%a":
    1DC4#@:LC4C#"h;B!F0n08n8B-$B1HC4Gbn
    ;J3@C&��GC;2/a&'̃)/092�<¡
    4@򥌦&#/4|�^o/h#mp#,8C:B90-H,H
    'Is`�-'$b.BN2-p$x<b-("xB3B6 �&F"`ڤfb$%92B:(!B]*GF#L.
    f0S(d%G
    N6B"B<:܂cnkd(H0<B6B4$7ا�?\\*PC"$,&<(T3C(,1@l#!./ @1.TV%'dIB!\l6"iՆ%^2g$<7d*"p%(B%-rC&*cBb"&wB!dq$L7J@"X4"7B!77H6&B% 3#!7LB$\)"p7+84h6B%\#6
    "7PBMbM.�( B@!|%:3�Bxվ#",77\B#,o�Pt#H4F_�l4E#"4=r4#,(ؤ5% &B$H$|C*@B2Ă%x"H(\!8g,$C!"B6,%A#4#h&PB&8[%%g1cB<�-"4H+?¶1"|G*%RG'Tqn&@g"d$uԧ~#<u'#� \#!`%/84B,؃)\B=&`v'$;J')P"#T8*!5 %t8(\)HC�I5"nD7.[;#6r"t¯|C$$&&rv+F1!8=+t+~%c!<&#�+@jٴ7tBy8*7|Wd!4D-z'e
    B59-e1W5!D/n#f#T3i
    B5<B$$@8#&",Hk�1X�(.B+cB?C%5"K9'T4o.0$a&-l"<8T!B97/yj8}‚+<-|$"d/=vBs;%86#@16?C,B3 *4+ 75l1<%494%4>(/"7T1z,((%p6/TB9'hC=o`,6<6@6l٘@-</#?x+3dB9$C8.C.P2l0H:"B6C,0B23,C8-x4d,|A8$7$8.6`1!+�@5@6C)VC%,3{"$pfR}1.c"B62#hR2=cw+6%�գ>L~5f&4*�&#X2C~4p"2p(}oBwURx>plv}Ab;B)L';0/B0$x)!5PS$@:P4>#//gf13,/$\yd703ѓB5oc"4C:<!9#(T*_Bonwd9#Ă;9̴6z~CC=L8C8)I[x3@\R
    !]V'U-
    m(j"\NͣĊ%>cE陧c m*a)N`=mQ#d=*l*}[`%c冱㳊![Q* }+4[oؐDh&�%K"]5
    1^N=,�XD\!ȑm֌8i4ȈZY3Z:iZt6S$׾wo߿>`T+Ǒ'mS.!"u:P%3mWg1HSE-rH%=uH@W(�H&"SLԤs+]9Gp%&rtLQJbD# �$jH90G(&DrĄGX$e !đArHKYG&�GB.�GQzao9JNtGFĐ�/EHembAo):af�jKKkDS;Ėg`Y	`b$J Ynff	�XxfV n"YLdM9ĥ�pd(J>aDng<9h	Vol	@r7ih*c`caiEoq,Ty�F29K`IJgfgfS9bh!pXoXm*Nex&EkjpWh^ݻYM4L�5B[haJ6rC>8[2GESD<oDO&`�()W0o'PIDqdmgVFyW�Fb%�m@dhA8*KVlx%Wy[pFaRaҴT&i	&W9![?Q]=@6l"<8bx2h䢁 @'(	SY.:<_)"� FL4[Pc00`02"zXTq"  �
    (	hTF�\%�uAŠ&M\ж
    YbC!�0X"aI`rq
    E,"9*qJ �G*XD'0Yi((1�EPCPF"p"�c&kh"�ؠ%6 Y %'N8X"ьbc&Kp.i bf-!Xv�,R(*2؄'	Mp&
    qhI!D SLhK!SHM(8,"Pć12zŹt'-=X<c1
    L7Eч	<D8qZ0Fr�ipDT1GTXD&G8qPn1ե΋&a@Cx%#	4x3qDJ@X+_CFb4%
    Sc+&I+P*X8F&;(H!Dat$΀-[ڔ""$!
    FXnfHC 4@be.q"F_a\CX;DmxARg3Q	>c89Tb�4x,Ր:vbpG
    -	*BX=a.%CX7LT#@^W\*A
    Vh*ta)cxF3!SC)M[M;@qf<A2؆3	"CXD)1s2fg̴Y&n"x2 akЃGP-hE3(pSC#iNg'hsL(paWVTt4;_;O7L�)lQ[BmmI<P"E@Fl=Ϭu[nba!:&f~w!\EFFWBG`RĘD/5Z۹׈+^AO%c*T&.LQ>,Hm>؂TZ̄'	X4!,1X@
    DW[<"D,Z	Y"Є+8	IfZKM&4qSTcD+d	w�*|SU >-b!
    C(&va
    MEgB0D%b10B8},bVhP0^
    \L5*D5DaJ\|�E%X`-r�"!}|-DQZnb(ӟPxI+A~rNN!w*a�2"07gХan$!=,sJ
    trc8&&D*.k^arm)EJ}CMpN0P.#H�al
    ~ӥO&
    >N2У0a&La
    dMpc
    
    ʣ	Pqr.p	{I8p!�0ð#
    a
    `!|&v
    hp@0!CBL#�}1n\1R0]*M'
    ?1h!p@qC&޴QneABC]*Ua~##XaAޔ#{At-;"ҭv*He@!!!2"%r")"R�C"9#=#xp#A$M$Q2%U"V%a!
    #gNb$'#'O'
    &s2)$8)+2;*&bsl̼+2,r,ɒ,@!r-ٲ-rAH-߲..2/2,!J20s0	0
    0312D12 2R(fL(3=3A34Es4I4M3�Ns5Y5]34A65i6m6q37KFA7}738s887As9A97`c3:=359;36g;3<7ų<<3=397=s:38>;s?ϓ<?4@7s@Y=
    84O(t3+(3C?83A]S?M4E??S~!NA~alb:|5_3OZL*a!4&833Ka)@]!Ba;
    B[Z!GwFNT9`>bXF@sO@s�O@U$9eNU4I)3A;Rbh8jX3!a6;`U[3!A9IT54Q3=(Ed`tV-ҩX`uZ(!Qab*[ES t3!(֕4'Aak._FbFbX3!o~aCNnPAxA<sPH3Ȥb0A(4 :nXB3Ceԁ!(.?QDaut!\s�V0a禖FāLj_!.fDvOm>a XUnv#34WMSjL@>3Sb@[Yd3,W6As;aXD4wba,!(i=v!�.l[bB.a_3i7�aw
    5
    xIcASJ!0G4_�ez5zY3b&[v{Abur̕ar}緖~;`cJ3hK)a$;P4F*s=3'(Ar09q!؂bVa*`R$x(,AʡY](a`a~A!�8<K;PۓJ*B@3tG3@�Ё@qCS4m=S֗b8�&i?8I׌aS6E324i(j7�bbQ*Cl=d3E<sb
    Ad6bAsSyVy(ƕQ=@q94mLby=ga?3)4Qa^B06XG.a[~X)bŒb^arpaHA|!jtA8!3w!]Ab ar!8([gnxn!�BIazV!S!ZJ!TB�~R[!k"blXbx8tEaǺ3sA@;7�!oy)	Y4MlZR1:4q;S=3_[8U8o3O3D
    X)fw�)fˬwgH&:99Y aA:֔;s\Uxpk3AUa;!Giíb$by`{3baāNH씯9=3h"
    &tZბR4A!!NAVa6atAJ6!MKʡhV:�jX<�A,RNA`n!@AaA_VVNXZءvHK\xagXk	�	?WN;3!!؁1ګo[	*H@Ԋs:6:�캲=W3t!:s${;AGW;(ba`sbVPha>#=uY?Y"74y;�3Ɂġ=4{),B3m!Z .5;3cd!C4A@><!!Q3@U�NA0V~;||Af[衋XVe<!>i},:UE!<AwAOB!�ANRRA3׊t'T$3!EX;i+Sۓ�p;s3_vQ=]4><M=Qud;;b_}89�HXt}]f!(03M[̦ f{ڧKYSV)fmQsk3=o{w}#<iEi lU
    <MV�nFHAUeL�>
    Tf1@,hQ
    ѧgYV�[Δ\+2PbT2DhѺd.
    i6Ff
    @
    Z�-/XJkL%1өip%Ŗw/_>A˜í	6	,5Xn6rf˘VXҨS^z5(Vc˞my(5
    	[�2I#ȓ+rkf9r4K�jiB˕S�4	$YGL `(dճr\qϿ?ELX!dN3
    7yV˴wx)8!h3ͅ!@8*
    L; @ޜb+[m2O47-@tBE,D68?NSR%bR&dB.M"$"|x!62¼2L-b(4,h�6@""�5:M-2'4	,"Ǵ2I>
    $)R12)@-\"N�ހ&
    .|@8Ɔs/K'HR`*v5@/Qc#@7`'7&QH0�`ˆ0v�ܤ"\3�!l"%D06'p$V`HcǬ]"$@*<,?G ?RI$ܦ3ϷA'u!94L7ڈS)Mq�^�Մi}I9U~mvr�;#,!PYi@ID`jzNޅn"I	$x>@ 9$p@'wBP"qKby!z%%jdM88h92N8`.ʔ((P44$؀%LI9҈RN4
    7$St�2LZ0K:"N8h:(
    +1gPx!
    ql@
    sCF*ءAv&ԁ
    s1C&A
    V۠5!	EPC6*M5l
    U$!*α
    pp88pP6F8
    [#8)PWE.!ZϜBg#xjlCP@T!^DLqCBF)HE&:ө!'Q	&7ɳͮJh
    =1o*@c9A2$-f],m.?)̏%myƏ6Ԩb\N!mlpD1)Y9<'%s)IuT0IOOzA$*1:)	!im5Mbn|9#tRg\E[ύ"T
    )r)ҒhI-RP�fJӚ8ͩNwӞtp(ӢH"$L5PTJժT(Lծz`
    XJ֪&B(ZoKb[]\Jb:#׾
    `Kx+B:_AXhͬf7zVP)0ҚMjWrhkgXFd"hmwZNG`�K\F43upASW�Xr]Rwǽv]:�@wKeeŋ|:35n#[Fpy쎗әv<�j'L^635y\BurA\S@lQb�Ӌ	
    8~/M[⮎�.aDB'K|Z�1#d�O%�$Ab79s{ի	�8!t+�D.�P3g=5kzםshD'ZVC۹Ҏ.Ӗ'bR'.+	Ml"D&q	OpDIt`tL#@'6:"u|;DH΋(Jj1Ǘ�ą,$B�f.#"	LtD&:[C~'^MNpº$hݫV,U�*OL�rk\?MmXgoKF@߈!qfC(G/]G BB'pVx
    Cnn-j1eGьYbEq_l{uɸvP	NݵKvL[<b�m+̈Y8yn}G\41wܠ-
    qȃ�	n `%:y`!`=uQv%G7LQC_p3
    p�0G5nu.bÆ-f>mc"6":y`;1o4ߠ
    0�z`�#svW	 X~ph^}~<0%Q\qf
    T r@&d	�p
    � 
    pF	\@�0\Q(Th	86uUau%�
    �	0
    00]	Plu8\whP
    vȆ]А	Wbvmv�Ӂĕ0F-]�
    Àn@�q2xQ5zmw�
    
    
    >7�p	fh\@5�PCTI6�TU
    	pEaVSqe\0 
    v1]%aΕ\x&a\b.fy<
    `
    pp
    
    teS
    f 
    
    &�P
    HI
    A9�pP	@wYiŁ^]pƠ0�gkI- 	p	ݐ0ۀ0YrAr"f 	
    Pgp	P	OHܐ	YK; ^^TGbK	PA	
    u0
    
    P
    
    [P	`
    	=Ɖ6
    AhP	b
    
    pam�@t
    )zl0�
    
    \�yg Np	
    
    ӟr	@6\
     L�S	܀ 
    Uxb
    @			t&	P:
    	P! 	p	p
    l 
    
    ٰ6e	mu	@	�k-vam	Nu|
    �	 
     �	l�
    8	P		�	m_	dVepnfTfw
    -p&
    `
    𝥷		6]
    "Ԁ�k
    ``
    `	+5
    Ji
    p
    fЫ(J]
    
    		Z\sy8Vx2upp
    c=XUP`�
    WHـ	
    0\
    �V͐ReEKP
    Fv@S .1F|�\[nP
    �	&'k@u'\{`F
    gozg7ˠ@崌` n7*]릇
    k]]gf�C@v	Ϡ
    p	Π
    p
    
    @
    `@	@`	Ͱ�
    
    =)0�
    o
    P	PP
    π
    Р
    000J@%	ϐ	@{˰
     	@`@
    ـ6d	Ӑ
    	 
     @t𿇰
    @p
    �P
    
    P
    rN^j�`%Dvzh`	@g
    01<[+vڮ<][ۀ?
    Al6(v|P
    `[	͠
    fƃ+'`誮0x
    0ph	\�+9F禐mH\aUfӀ�l*9u౥uZD
    )+;	�
    ]{lᨗV�*�I\{մOq[
    �]ϕ�
    e�
     ˗ìFzekApp{|z�pţ
    p��C{Xv
    =0
    @	|0k
    *00P	 
    	}ї�+P
    0�,c	P|
    @
    P
    	ܼ
    а
    
    ؀	#3*@Nmp
     |%#:U 0ӹ<Z!&	 
    p((\5L2<:l:lpO"C
    \	X\hRJ|U10T	bճP倖m^{гpg梜/J
    <iX@	ߐA		{@'Ayҽiީ[tNۉ@B.pVgC[	`@
    0
    &П&,�W02	@	g�͠�	j
    (
    p
    
    hw
    �
    P	|ph
     
    @а
    Z!
    ߠ(@@��|W>ˋͨ�R		
    pՀ)S 00
    
    p
    p@@
    pk
    	0n^շ	0�
    �i-	̠;#Pdkmpm{�o
    w%JdIlz7q 1	pvW1ٌ
    ŀoPvD 
    n>1@ƭ-zkaľ`slf.Ѡʕ
    ـ
    rp 
    zح]Ҁ0
    
    ?
    Ѷp
    ۠
    !@	pf
    pҌp
    װ8�2o]˰wa�;L
    `0	`�f\Q]�.S	P;jg 	Ѐ!!	C 
    
    n	W}p1̀
     	؀	Wો
    	O\@`	dVj	@>
     
    0�6$
    � 2	p
    
    	S�	ɀ 
    `:`<	U
    0
    	��
    �PUa
    jaJ
    pB12%#R�'*G!E$qV%UdiUBB
    *ej,QGFbUbQ-	B ֳELBjI#G,H<oDj9@`.K)"]&{7/Eށ{5iIfzl4`Ñ%dD)	MڰF.A{&qf={f"JРQzZF<�EU
    .7qTJgΎ6>|QrT~
    8$
    0EGPQ"9fiI݇TTjGFIdhydH돑FT12hLuY^Fg8]	gСi>YfCȡTi9x$jdYp)egܙ$3EeEĹf{1JufLGDN�WYVADjanځUtgYƙgGSATaLMRqg^
    g4IbysypJQsCƙf qiY{9L!GCe<bdբęxi%pQSRQĖhlF1gG1E6l^NJ^|Sc䜺1Ʊ@^
    |l_FFxⅪ*< Y^d�RlŖR	ꓢAe$eEA $dIqX3mh첣0Ɉ! $:!F)k�隀FH[6$:#*&`B^
    Vjl<;j\L)Y^XR-[.i9OReC,%P1L	-[MbigX"EW8DeJePL	M4JlMZ%
    PV9CTQ?W`%QQY
    dS4OXE!LOEpFO(0D+UB+p*a�(lQ
    !@ZD-r�"!|CQ{(JQ=-7�T Jd
    `E#-b@Xe/3J0YJ �x4+{,	#Vq[H=u4@&<8DHC lH!4[$&2:,1c))c̘R\vF�!qH
    qdSD#gYEDCi�iVQ)u/VԂ@D!F葆@h1MN%G)Ex3ߔg!!ӗT>f"%91NԠ9p!}xexbpLDHL2Wʤ+!1I[Ι+gYNl̩ȎlRT:USm+4FHMJhPdA4I$0/5UZ/ܕ^=OqTGtd#la
    {X&Velc+G(lle-{Y6lg=YІVu8;ZԢif{eW{Ԃ;	b~֢	I#Z[w@pKYFdb(V;nsˈKZUu{]fW{\DpW%oyWI5o{^WUD*JWo_�X+|&"4CpJll@-|agXp=a# y &qM|b
    /B@q]bXF(f|cX;q}c@&Lj"'YV&d(_XĜrU*gY:e0YEq|d3Npu<e7q3\g<Y{q\b4kvē3|
    MTx%*l@54\æ,ԣ1c4EOe XF2,X\6&NSdĨ$QChHq&NQWXŞ]PPDI!c8hƫomkX@ƺۭs3;�DY	
    {~v�+k%@Ĉ0F3]K40
    maDL03pe,%`-qaH,rS0?ž7*Qj|p#]<�%�lpҧ^uKLC8b\D•7aat{{mgb'ot:�%
    z-dpMt6Nq
    o9Nm\x!<Ƅ>~a$̸3Xqg8q!AažpgTC0tafDX9a	LPχ~c)DW"p1fmCӁO4Gc|U^K|pqaaVe g >kBk3C�ED=O@O:l@ڄ0BPh;0SaL{L廰Z؅�Z0qK6� ԆnL$\B$UG<
    S{L'԰W��a�dB^0aAmP
    lm'l;<*<0D8R0
    Y(
    +J<IpDÆE(TkJðI
    kdPe�;L2\HI
    [ijBI@ICKPr+gc E p�(i�NB�`h8Gm0Cn33B`6,j�mp4tTGGt0[
    �@xtH80e5m0mx
    ;�0mp:0dOSAzܰDC@0Z
    XIEDhtIn=R]�EtI
    B0Fw
    00\E0[�F0BJ3<DTKĨ
    ˰k�u�hPKTW {PKp9eXIi_cS\8D(TW'\$e_HXeN0!^�WPDhHH0b8bX\BNxJxh8Yӛ[<bpG#i=IhdXTqfLexS(ڬ;InVHc0c`[DaxNXkӬ0`R
    ;B0g<<jgO0ܷO3n-�NyH
    3cH[H·0B4IdP
    ÆKHHȆptE$@�s�m
    a� 
    ;VY E�ahI#IKp[I[n>JhRQLʥ&
    0Q 0ݡ а0`@A|50D
    KqF8z0.eZ8pXJX\POHlvJ8L[hSDvHfMPpX8uXLh,C�oP!j|@*j؄_8FpoJSR0rZZ`NlHNx~PKT8~SjPh8X[PЄfXo�eXjXJ0PXzVva@]L \UQ}T �h9� :d(0BSW�0lHlv`Fi{
    SpKXK(gCND4ce@=PSyS|6\@6[UaHUGH8X?=b@Λ<ZɒяtAI$IK&0(
    �ئJ0rq8C.08K0[uxo`FJʰӱD�@_`XpB\|c�HtxrOpOOn8׽uA"ńS8bPK5ypC:h|z5V{5OeRc
    �QHS`C҆Pl`_Xg OЄg q7S(e({po{LΣ漁`POXIeXzkHH�YϣXbM4Oq43h-DPG
    CGk0ߵͰT4d8=C2UHMȦŰM%(ZzdQahCDdIQV!/`ZMc#\\BḬ]0w`SJJaMnXJ\\Jɕ\@0K UD˥6S#]J	;h8W�fPFH]c]T̼
    SOv
    hkmxO`cQI4X@1;fSއ$uH=lp%
    �R4YcX(Q̆0g NakÆsN|O_0MΰB8T
    F>፵ϳ<ka1[eR@5M
    aT0iBhȅDx
    e!GQ@G8!�ޒ>i*�hXZHp nOJ[v
    <ofXt;=)==K�SҨ�0ehw驆K&Rۄy:ewx7K~BnK0Y`
    #q(iOQ
    oP:gf[ic`FD(ox=fOeaDK]HElu@Zl�H8jxUuhZP=,ۆI|m@V|hSHHI|�R0C(aNEhq�o�F~(@U8z5مN_pK0UsB_Spa 8lx_!N8\}B�anH9k�B@MK[DlpM_#0n0bqdY1X@S0T GPzGHGH@,#R f;sknqOS�/q(_ 8Q
    s+߆b^˰0
    3J0IH:9ưs*EH:FsSGxHPtBͰBN9Q?Ih!+ dom8*q0U([�|Sr8c-l�OsO(irV P	uW@e8YxFt\p[7g=QI؆sxs(#T`g
    $sMPl7fPaqmkIPj¥�q(ZT8m�n(Z8pHnr "rl8Rpp(�腞c0SPz=30mrhLU z]b�oʲ?~t\sa]suu$3pS0u{Pr ٸ/{Mj1C�y0/l(;iS}+hmnc||#|_-WŏQsDU`+H2BJ0y+9Isܟ1W8؟
    ;|}}3~*~R~'4Y.k.rC/b/ϯ,h „
    2l!Ĉ'Rhb"Q.rX0ѥXy,i"J9u2gҬi&Μ:wU(<-jtf#J4	=)ԨRtTSZr+ذb2j,ښ2Ū(-\!YʲH�޼/w
    p/‡1y�:@2̚7sNH˝G.m4ԍN,pol]ض؞cfR dߩnhm[ oΎ˞Xs	_�߿Opy1M>=道_sQ]ێ	W&Ħ%t	%1ˆ- a	 vQf|RE�#�b""@@#"27Ӌ#c+"@Bd?ؤA#8Y<Vy%^a#p	ShI&x#x	& x#T(#Paa$ ~"9	$w$H"I"Kj@ܞ�~"9'tb%d҉phIhz&p#HH!$zpBi9�L},.{,x8k{	oG]y5I+r�t3N/|bM8ޜM!K9 #x9+rjrwR˂b-|\""`&wv#|r-)#�XX�pb2#2c IP3sb#Ķtә-8N@uӴam,D%k`S4;pC-x#<ܠM,	7ٿK35$ἒwb,r22N7@<1\Kt 
    8AR9Ք1ilB((ېKv)	8c/<߀7ij9Ǜfb#�##J3Wb=f
    �83H0嘏~90W"|N"9d/}H8"	B(, /TP` aw}q旡y/ƈF4~HcF#MBp/
    `09QiD#)#bCaFπF&6)dyI'a
    D`4c!i@cc	ph
    #1@6 !%p#ʁ�"@�+f�pb75_b#GP$ъD@xVJBD3Z
    `ޒJ@:ʹcH"1gcĤr0_`	T)34")qm(
    時F(L
    i$r�q�FCdx(*x"{{iIU2G$a] b@LkzSbk)I6P\	2n1"QHb4DL-*PD%&-ndb5X�@'S7 )
    nI"
    I%�,#PaC|cb-`�*b"$KoP9mv�Q8m^˗GBpKor%X닾^@s\`x	ؾDB#,]x>
    DHB|6 a^P�E$X$OLH$2B2ba.B!N1B""BExjAHMhHӁ4+\R1I&(u><c�DD+sHCe}�>E|"e(OT"L$45DMЄ9rħ�"͌ذ/x"i"0%Z+MpdB"щ�@(Q	p�Y0D+�K7@(,j
    i8E@Kgﭐa#GIvMD'H$bx_{B
    83!VN/qRgHU�!^
    .7:oFĴmSf 7Cnw:l9.hV8|F$W᠐cͰlD8&\9dvDby�/!D(X#
    ZhSEowyf(XClؔ�[#�x8!"vy#r<1."W7J$brf։g%`<h6bt@*vfPcx%AfX(xC(H1E†8~Qrڨ6ya؀66X>�x$q32Qd G.mC :́Rd`D2B"-<1l7đo$C!pQb /QV�>JsU4Dgc̘F!ˠ%!(B"$ڏ %|!/C!1"d)tZX n]"m"`( zC5Zd&4*xHSn[!@(*(îhKeb&Pal[Pe<XJj!4T#�B=)O!üIB)P%4աM�5@QƺE!1//Ę=I13<�/`�!B5X
    _5BaF"4C:<CO!(TW)^йbaG%!/;<B,11\]B3B�8C8)1- 7`b}7`!#02B'B�2HBtR(B+`""<P+%+P3x1% 6C%`4hB&A^,C524;<B),�>8,C�l%C9;*0!L#7PB)'6@Cj$xC!|6 ;lRd�>X/!!37!C,0N^�db7434N# ! vH:H4F^`qi!ЂE
    �		
    Op04<CF"h1Z� 	NL@2B	@WQ%UWi_ rHz"B9M%F,(`$75@#P7$BCA&&M(,$B8TCi",ekfPfj!j8B#66F�0#�|2L0�&4p",LCڡ#|#u3gruUW\9͢�H3 �L,.C�LB&P$X7ۇ@3B�@C, #$1pC~C&|C!D1BC-�.p4$B%HB78lBGz!44l7T4B01p$#"81B2<,6hBe!p%C5h)c	8P.$,x38#`&77-(؟,D@7&hJ"-p4@!(/`C" @Bm_d5GWð5$-_%*j-4C=b!:fDK�PBa
    &p̯	@d2B*"Tb@3B"<CB4�+-�]2dUhK%%D2j:B,B#<B3.D"íQ�B6`C*4-H5,v<:R4>-LFNCX(lsa6K-qxB(l;X$#5̬
    .9,,uatd
    %94-P$9҂)f$,)ւv)F0 r&@C%%dh͌$@)|h,`4&ę&Bbb!,22*2 B3$`&2db.`"d'p9TbU2`8!�C,%P%9|4%"P(2$'+"7M&\&�6,/6@2B�r80B'8B4 B24%a4PBbB�|BA.P4 2@*LB/)t�W)Yݙ]&BO~S=)o0M#LL5"̆fr �)P*P-^+i!m,<"p�"<"5,%!7E.X(4`"&8M2D1Qq*e;ZƷu	}pdd_4H-%$ȇ3<1%@4PP#Cc W~]!S*B"1<3Xn",E%#$#]r&4D(/$84`c(B)BDB3HWr4$#,$r-2-g"E"4q4B.:,2C
    63J%3-4<4T2!5Co
    �/1|B<�j<T,1;:<;l-e*8\2C1ku_1۬&TC<hR
    RC+$*P5B4*=2,3<C3؃0>>)D7oB*2BMb3hB*C1|;9435!t68C3@@ 44"=Lý`B93+6A&T7B,;)\=Ԧ/[5\uuO"><Bu_/F[-C7tC!Ȳ4@862^"4@24"h6g`T+b@&+D�-L),&̠$$H8Wk2n+n&6cy۽^6gd!--aY*:&C7stE#t/-I
    #�H!0",Ɋx7@JzWxIyG	pyoypێ~kw}[J0.B!,6v'0'B.l!n, 	*B"Ăn+lB,BpB$Ȃ&'pž,(l.lB(B�p&h-B%BmB+B&!@#(Ѱ*@y$,B,@*܂,&)h-'*)'.|B,6*0P+ZT(B%�<B.T!B.B�B.P^0G-B)?'�*z-:r-'+l*ۺa{Z#BkU.4MTX7-r@aLe<7Et{P{B+G;{oixdy^7~g
    =#h IPIR4� oH",+5"仺r	v,3wb鑦^NpW]�
    q!(<"|ͳž;"p;B�YtBw͉1,$$ػ/aLҿ+}U,B�%r!TJ\G	#İG;=i{3rK	>wH2Pf$$4h[2@4BDF"4�C
    mFNCX/ǯ[vFDV\P>ER,׾>UXV~Z ,QyL$(w\N20?Tws ?EYsZ[l3\RWr(?JH߲?D(B*I?�	4xaB6tbD)VlH+9"Lt)$EI,Gf	fL3iִygN\qhP4ɚ4iRK6͉jSSVzkVSAf$Ym*`ʖf-ۢGֵ[]{ߩb
    ֋VKU.:qdy%W|1K2OizyسK/m9S֌JVˤDM[
    we*:엧PS٥_˒{
    +f#A7"I'J;DVᩙNz4]]%
    0hBbf̙SZi9{ncAFA1PQ>yHh f,|Ih> DIfL81^gl)bBd|Ry\XYfWYZ	eZY\�-Ŝɓnjq$Et2�K3܄8_8۬DpyJOo[)m/IDovL7ӗ@gSidfaw~-SNoPSx&M	AcbDhB Vn1vPu&<q^p{Dat1H`sciE>fɗ~qH!&|_%D^*fD6$y844,YP6%;	,sVfY&�G!QhLKPe,D$MEL(3$l
    AL(q7Zv	`{jy	m.<`Am0n`a	&e/Bkz�@fkm	rJ,	J`ʆL\G&tmNMcJ)f)B(_%&l)cM&VQD�4/d&UX
    Fdb�K)GOٴg8EAp~	iF!2s6C,k_˕P2AQddcZN@@T8#�@G)&&؎Ķmx&7$8p&ȘE"8™lI&!ęЂ0C‰/EaEDxx-10r'FtZK!w%`#L(.i�$Ml!cY��8\d�N䒛H~5kb-ITLG5B	^%@`RMSXF#XQbF(F3pbi$24d<'Da^p2CH(2r7N<Ff
    e"3VCikH2vb:T3NQsgy	681N}N3	|tV
    jQ&/c�tc6i�2̈611s}(&/M.4P/!}DDjMBc@9
    0dh[�+bm Z'
    )cTX:Dbk*
    >2!<PU)9f(
    ҄#\SGP{$G[/I8Sԣ%:\XF%j\2$ءJ#ɰE+v0BXBD3�oKE5
    | (E56s0ސ)[
    SE<P_!'EX8E?qjTC8,qlBX7UTc0(1g쨄0l`(xlbhrP�(21H2>ńld(DiIAz�(2.Qg8.�2-s0bD۩N;S�u2>q9DtfY*c6Uë$WZL.Xd]1DId-XHŷ:QT>O0M+Vj 
    	9h!^D7A%q]z&:ycCIHƤ
    �"|BX88_fŒz;�@3aO8䆉HlRR�0qsC¶PB0
    zxgwdl
    O((D*qSXɠ'C#iE�_&`)8)ʱBGF8
    KXə.+jW>M0TeH	!d&{4,D(iHR.1`Ǯh;us[9ֈɾ]H3DAT
    0t,xG(ia<@@-ŘKb�`ҧV=^(Vpd1\Cv'8 {#ˤDv�zqC>٧%KJm]p#W`D2vAczz2X@C6FlZ_"hLI!JH.NJ/�Hg|XFlq$A	<Ha[^DAf2
    8JhU..L1//|*�N^^BfBr!%mJH XD!p
    '�񪰫%LR<aȦ!|fC2ENx
    @j)&W!T8	mB$JPD_a*h!6paJaNH.ojzDa%а ApdFT!h֡�jA[b&<8ZaLA !4J!?
    
    wj!.A0XF~kB#ca:~$VxcaF$&ސj:p
    !��(JnRAa�6A.Aִ+R֒Q;`O"`L! aB~J0&"d1ӱNd"!AAL޲ơ<CDA4_>N%(dB !6)Aeb�nl~p3wnS$! !Pt8aB~O a
    Iӫnmsfj(m6%A;<s*a<)	vdv.aA|b!&Tn,DaF@:FA>a>A!Z@j4^fXf!ApAABd.BaAaa@̡da!AJ!hc,!4!$AA21 PhM4'(^!HFa䈏QRAR_PNJ:UʌATAU'3&ahVgbeUMV%WG
    sp(/HЖF&\0X9C	
    &vUV6ZjX*!R'Pa*gBYa!d["ZMfZUW[X75 >'
     a$a6ys)*6osra__CVYvd1Ca[fc0JUZSf!dF$zv#\g$$!0hii-BRxijkVkV 0B#h?"$lv PB%!.mnVnnnoV�BmpWpnbApqqrT7r/s3Ws7s;s?qaZtKWn!bt[7tAb%d8K�jv3vnw hvavvkxwx�wWyyoyzzzeq{{|W|Ǘyr}wx"
    }}}w~vw�2"|W~k~7؀
    x�F7tvx%xT~!x7v9v-!me7~
    A�"awa>}>$)x`}qXW@77z5؈W{5{k�XW����ታxXWVXyxx8X�aHxX�̷rV$A6!<2.8<lvaz:W&!!3a&0X7-ac4A�ᔅ٘w[!xy	@z?!ׂ1ׅ=(9XW$Y�fVXcwv#Zbǡ AxzHA:Xpˈ8x91jpRl,a8ZAi�d*!8ly7a	zyqlNaa�DYyqx}g:׎
    !aaAX�!xz`!8{!Qv!AAށa¡A!!ALlq[3ڷwyAl!A2/ا{�ZnAAFXf!I9svo7d4~A^Av~v
    \|A*z/5xW�!aa5!܁
    a%Ã3[!A~e|{Åx%!IX~@U~!W"m7<aLa@5A�ax�|r�ͧ\w	`œ!hJTh8d\V*vv�lM'AIXw@#wW\x	!ʄ`.�l�$4df@$!x!mx9Ûٍy	�"�Ataё׺3X0!zjA`}!v}naEAZ.Ajv!>&qt߇1wÉ#!&΃	 ,aNaR|$ubP&!!'�Af̸*aua`rpw�D!O!g*]y8^M-vv!Kd!�pDA>AD (0"9%γ.k
    !8A�L@TtTmax^�X<a6O*Dh!Fgo?7]#!:anP>�b6D
    2:|1ĉBcUhQm1Zԍ"K9
    ֡,rH
    =53�C-@P6LG()Ѧo<~Jg3]3)zHU_˚=!#J4eHѡSD:#FUf�j4)$H$9xRE
    7qf̚UKBDfB(ek#G^"Siȵ`
    mrj=z˰o�[ zR䆺6Qe7g#Uxe,�F`zD*i$Z	74u*#%h#6N,4"L7N7|r;l8H]d<hCO8#P"+̂&Pr9T$BH3b%P�M!meZbIffYJn2D!)"lH#&B
    	(DB23d&3"м@-("O2dN:WP]4920TTSUUjUp5Vt)—FV[tH)H0DU!bIY)]B
    5,"	gn6�P08k/^6RL+ϠBP!gPvV�0P"@3N:Bv!J5(Bx}^Aǐ!$C#s9 �
    <C3)s-x	"l/ S"(<4K�d"I<dH-3J%3ϼe?uU3TG9LI�%^6d/x^٦iB2dyg 'C%e34�h"9L/]
    8jh洓CfZTRL,;
    &XMUh|#B,唣[
    -"l u@	5/%$W_s(@BGH$"A@"%AE,~ 
    Dlx.,XN)0D�aFc"H!iX#
    ፍu|K/�F枢=|	,ⳋb`$l&
    nF֞aV@B�Fn)*D61	oCx-f@c!n�B߰E�<C@2mx,+H:7eL@Ӏ"!K+_	˲@.q8dG|[7R8')tJ!`F~"R,F*8Mynwj`a<F8(L	g@D#񌬽"0z"iheǐFTa1>p+fP0R!&F*d([BFu¡֓.Fӈi4^:
    H08J#Pm'7ENO()6�FB]�ڔef`V*EGhԘ�1Xb>c$1ZU=q ˰b|	hTF�zI@e&
    *]7
    PfM\8"1L$iE�[$CX0Mlbp%�mPB00\Jb0"d8xd-fi^QX.2'Х"`1sbx"&/5`WS7	xx5ѢDT.,1F(CQ.0d.I2p<iXՈDubJ(\0hHcH4!	!C5Ɛ1D	h@Qr#bԌh"ȬX	J8
    X8F֜fa4g3:#caسP0	gH`D(#"ilF4ifzӐ5D׆&Ӑ[4LscxG|_
    y<G9tx4*v,c 5ށC0)QedB8lbJx1±LTX4<E(!mb"	hfG,eC@�,Jq],&/.&$`q7QLKB92	&GBbPFi\3&0Mc27kXdB�HaZآ{'TL$N`AV_8W,'bd>8$w(;wНkD{E�EpX0OEEpHY!?`L|!"Cd򒇼3x}C<Z,TX|EM2X!RMPa
    L)%_
    ]h"D,[D*1J"hE[ZQ&lP4bž	goqu	 `(vhquϑx 41L(Ёp,4	,+Jt VSaݤ+p@`D�ywmCwDŽ!)(k7,(o]&pFNE80m h(y6<KN!cUN2Izgn!`|5Sq6c%WGrFϵrH#hHcwx}煝X^^Ehl`¤_NkxdQ8<}xwT8)H牵P8\`(hx&(rXd1<Hh׈٨ȍ(� ׍Hhl	x(}5ȏ8&�I|	AR&Iih�
    !)#I`Y Y+ɒ-/	�q1i79;ɓ=1
    ?IuE.Pa SIUiWY[ɕT�	])cIey Edkɖmo	[
    uiwy{ɗ}i
    ~)W	�]o)�P`	j9w9ə陟		iy٘QwaٚvYIYɛci)i	Ry D�
    YYUi
    ӗ)f9IvyUTaʠp	P9%S9@YTy
    qĕP	pWx	P"Ƣ
    
    )-Аe		`p
    y	`ˀ)P9
     0CUI雭9�5X>
    
    `Yc*HTI90
    R
    ˰
    
    T		
    `0ez
    )EڕI
    P	RY
    
    cCC�o�qP	
    Z,
    0|X�P	܀4Z)X	
    ʕ
    )	*
    99
    o֙
    pm
    p
    
    T	BZ533i1p
    U
    p0 `0:`
    	e9�``	p
    `{
    @@@
    	
    �0
    ![90|`sJ+k	dPD*\)
    PXPQʚR� 
    ZTy
    @%�0TI5p
    5t`	
    '@	Jm 
     	:l�@Qڀ	~
    j`HKQ	��€@VW		0	:�
    
    ZJTP
    S4ZHPv�PS
    Pא>@UY
    ZP
    R
    ȠɐGR
    %@$	@@Zey
    Y
    t@4 
    d�r
    c
    РH
    ]+@\dU
    Ԑ\� TI^I�@bTgB{"Kʵ +	a:ڀ/l@F\_XkLvK:Rm{[kskCPNNO,IܴS)
    @�RYN�дpRR+S)ƽjV;\Wi�+ RIz�~yRɫVĻUTR	Vy
    5�
    
    p
    y
    N`
    <
    ppIROӀĠ�	`3`ƅ0	PPː[6@V4Y:
    �@0
    ͐p0ˎp
    P6*Y
    O
    p`\,`Rپ*R@۫+
    [SY
    h&,�  -	;Xi
    DSV鬤Pʘ9STȰR
    B.R)Si~	+};l@��ېR9�E,=<JlE5 e
    N�3Z<
    ޠ3Ri%V�iv�
    9L)<!-S	[زȇ RU}TpP΀~	(
    @	ǀ`pI	
    	͠
    :ְP
    	p Ʀݥ`
    P\)`,
    @ՠ
    p�
    
    	Ͱ
    �P
    @	�
    Z3`P	€
    @
    ڭݢQ��y��c5sǢp
    ~
    2J
    4BbݿS)RI'p	p	>!WѨUR[$-'=Y	
    K3-Ty5p?M+<E-GTy	r5I[\
    .D`Dl\	Z7lSą
    0W	�Ԁ	P
    [@SY9NP
    U<
    4%OǍٔM@bS@XU`	� B:N	:+Ő`K	@
    I	 
    
    -
    pt`
    
    @		.l	PPaa
     
    `	
    @X@
     XG
    
    ~)+F\2~�S8I�ͰGN%M~h	@>&yen,L1<5{SI
    r^榻0L_mZ}]5L,�g
    Y]_RY	H`UY|2pǑ<mmSȲ�@V�
    
    X
    
    @``P	
    `
    
    	
    P�
    RO4�}CU=ـOeO
    �o�u21!*	
    @qa
    �)@#n�~PbB˜)،kbpQBKI8HyfL5męs"(V:}*r5
    	[2-IU^
    JID1rht5+ѧe
    GA;Ԑ@IQ3�ͻW"X"pbAɚl5|[^OH'.k׮mS޼
    y"!tھ9kxسQ54e[Usw9@noci^ع{xryMY$gqܼM~(1QYIvylQc摸bk$eyeZQv
    Yԙ!l@DD%�j^Q�iF�ljQ<,m&%QV&ɧS$aj:%PJ1ƐB9b%K	pTEOgp.eCv餓_)(YEΡh~)jLqdHjFA퓿N}($�0aDu:D�nRAYD6DN?
    u�ye"nP#�WQk֜x5WS	 bQfKaIf˨ҵY[$dVZ&*hĜlFmm	E�J'/]tὤ1ת&JmJ(Y&I D櫦aJ"6b Ni$(X"E y�"	yR'ZeCT%yJ\`I\.$ޫl	�m9GY	Lvۥ[Sr:ejap>i>)GQʉr@dleΙ噶a$tEpu4gyFCyCgs^AkN_1Y&vbgGDb9kuٓun	@raE[h$Qq[QEPĩsBf9\q(&r^p9	^܇_pob[l"hjlCPFCT!e`T@F)$[b!\UH}Ѕ)e8~1.%0&*`lχGDbC\iI<ᶞNYbhC-*GbpÈG6#
    D"V
    
    olcȆ#G%VqW
    +U4UHF>
    &Q	D%}HI^8YɃl	ʛ"+HY2eUK^җZe/]KPP�Lf6әτf49Mj.sp(QMnvӛl"$LlDg:չNvFS(E29OzӞg>Ov&Bg@KbhBѩJ",#0QVԢhF5Qvx+B!QԤ'EiEAXh)iLe:S4P)^jSԧ?jP:TΔhEQzQFd"hRjԂE`�UF4btV̬nU�XDXzִU^uk\:׭:�"�]WկkXKWְElbۈuj#F8ӱgeʕZu2%NvUj,jZֵֶ_ض6plez[
    xjgk;âCq:DXOHVD(ZF0w\H+^^V*qCDU�0!!W,b�A_U`J40X"La�W�p;;31|bo:]#	OTD&<L<&<щnpDϻWELG@#$	!W"92	K8Ǟq'	Ed(D$aVys<gζt+Zi	E =3	Bs5VŪ!ъo8zOXkFϊ^#S`7hQ7M4{݋֢uD*la>V%6YGe"Zpv}Kq
    @%8YF+>iBPbTDK[<r,=woao7͆8Qicp7A[7Z_,"@1"E؂�.E$B~@G,pȣO>ܡ
    t7
    C<"�ʨ$j1M,⫘X&kWꈵ:�Y(|PD"qKjhDkE9x>z#m$Yb~WBFYы`xk0;jno*�cD#`$1hjU&l`K0Lk5HD1`pV7酁VI<z#Y`e
     )v<P!m_H y\aF@0܏^?z1"Cgh+�@�VmH
    nEPb�eP:d(2Z_nE XPHЄ� YYP 	hV0NMhx*E':г+� OC^@�cЅE�I8bQ-BZ_B^:߲;Io0R#:EKPJH<LhG΃-ϋC=ЂS(DHoZ#Di8EHnBXoȔoJJ`EF@C8oH5D�FaTbpF2T؆a=HEBJ1�Q@Sj<n<+o$d(BX�=Kh{|}Dz@wdixK]0�GEn@IRB5KLFMLH.2FME#bۆJ�xg@QXN5H`N@Zx�E0VJX OCrPMʫl--BD(dЩQLNІKCtb9GS.>4Bx?>0WlDNHMRo,̹lx5<N-E8S:\JJC_ Fpp0\MRGpHM۬M|rжBX�^0�e[XGPWHS
    \(NBNNihTCN[`H�K�AG�{lOFP$kFhO4H*CЅ/WWxZi HEDhD�0FjP0IKx\k(E`qXnȔE(
    qEj9E_Wf mɴ:B�D@�bB_섪tMĔRɴ++shDe@.,UEMKoCv�Kh@7EXeL$*DL/E06u+ԪC(iDG�MR#)LMI`RJXIWM'Kj+ԪFNF󅰐f,\;fVpU6]Գ2Dhtx6DPF$m|OOԅd s`Gw8s8�Khp�yWJRdhAr(`e:CDdfKqgXrXBݪCwxiMH�R)=ORIY+TRhSKZhD5rS89KH,<B˹UrJTDMPEJUE%.MY(rKZJ]QXN0%=!FHj�spJDEH͎eBpI8JQ-FZ4l*[^�pkDlFsF؝z=҅̍/
    ]tzІZGohE YmT`�)zTN`ȐGKGGsJ萨�܅%LH`Г*Yi<HDgpnpEhXxM0QcCdl UK7-�X۪Wx�ԓL@ZZҵٚM
    œJ
    9C E(\56E=lGYQeT(D8Q,HhVdC5ExXh(R|Z!}FuJ1K(O[_WhGh[hP)ܰJlT<i[Kbu,+i6~[<;H@OhmPc[FXOsI0wX:k@�HdI0wpkJFE6S�;h[I�sXVXEZ\^
    _@�阅ކJ ah8D]HPY peiH׵o�ihYxMhVA_uRg@3!{=J@
    {C
    4ZQBMB3ᇎCv[X
    >WP-a֫Eu~9uˊ=xGHkXI
    ?K7eT]~K~{pxS,<2aaipEhxIX3gxc@+JYJ-
    ]ab8Jp>V
    j>hkTVH"=VTh4/qdltaYHpiURX2cHhi`DFhlH0m7ȺB`SsPeXwWyxNpCHWecplPV݄wPjUPexjUHeehE] hlPichVyO@] v@LȫDX}Jp}@7:ֺH>cP&Ζ	gYm-ep|�nǢS5W [0R.L`4BIpdIȅGmW,LHSnbpbZ+C(Ji3Y1:&0F(B0)'')+
    rx.+0
    "3/
    06O74s4W;s>ǰvZS(>Q_djq>-MRY*XI`Q8IeCE\E\O&6[�TX�PfVuZp_tn@dPU`I@eUP#rkW6{Ju~;Q buW˒/_+d>3Orr*Twy/['>rJMw&twuED}J*9r.>k0lsFkxJAJ>B@M]y
    0wCPv/(ww<rfpyMxNfI
    z*F,*)B/jw{)*<J*穦z2gZ.dRWk&s|'row''7}~':v"(Bտ|R.)"|IڟEߥ`a~ߧϥg?\"7!@!O~bZ~O%~\?8	C(ggPf0≨hk` �6Lp!Ä\qj(q"Ŋ+.5"ǎ?)r"QkS([ˌ)SүeɊ)k`}"#V2t)M
    XY1f!jlȄ!{yVg
    j@QԄv+w.ݺAKw@fjw``I
    #bw1SZDqA	rhK5.Vˠ[ŊZس//#TBOݸUX۷f	9
    H�u<&nZݺwL3py3PS2|Ҷo)N7H]" R8 EPI
    -,/@)xs7r)hS&%GАSQ&\BsLE#@P3d.I(#7 d0�6HAp:(:WgNE3ʨe	lpZ2jbk5,E-('hAiƙCH2mr
    "	2]I�`)(J!@pgF6%dS"`BI$	ղK�S@hsIk�
    "hIF;m�!)cY
    &8+�<�2Jt.Rh PAB	Ap�G6bT"ǔBP,0K1B0e$!}E׌.X4M['$ꮒY0&쌊,J)9:T0&
    	%MOC]Q7D3@BM�uQ-PS+\vu1Yg
    )AlS63o
    *De*Cts"+D1k�rr9A#Bݔ$
    )Ũ#
    4<#¸@N-t#Y"@ȫ
    "}�c<X}e7
    H#
    !$IML0p3X3%$'�03
    F-4=abS`J
    X 2h!`(l�|̐7%$qa�3#Jdj@T
    xQB4Đ0R(!#eH XTH7m6d5{ 0uqB
    AU��6a/�CT<Y#F+pA2�7c$vYE7T’P2DA$wITo hDM%Zo P_",!H2!FՈG0\lP@,nqjh6"aQ#2TphNA-XZPE71`"�LZ;.G
    ^E&ȁX'S9l[(o7zZD
    j62zCT2eʈexJITǶ^$
    )q,dɌ7╳ (iH5qT]L	r	XĢA@qC^նh1d+$ZM7+$LXk!#5U%G/NL@j :
    R-\{�}�ȧfQ'bQOlbg$HQ
    tb!!#B<q�5�2)
    SB;""\6Gb%Q
    SZ[E5
    et5%t 2�)]9ly<O$@3LiD$J=%!L*`:Ԥ"nLbBHd(J\F*8!3
    SF[1L.b89.y @#&dkwх1,oyiB^4m0bf{3ہpc12^LC@)
    .QtQL]Se8FF
    Nk7X7�٪UPgUƛg]U(){m	ql3/RqlfPMe$'S<.-!4rO,c pW&=Dt�4ݛ.{8:X'v#7RR):{1E'5>U1p9t 1gu)<FW|!@Hތ>8"Dل321	F삲h"q"xD Oь^P&1aü4Ac0H'dxD/V}Wi<L.-r	r#k/
    qYpP�HCF-][hѸ8效Pai,⮧/ZK%8e7C^08SAG(p#!}?!`A*yDWqML#*jF7!t6u0@~1K6c[5%T®%P)$@B$!8)�8 Z %[[x HD$b"@($<!@$m`A`Ҍ V!L%"8$ 
    !LB% $LB\B6pC8\27h6CD8C|*87 -/7a�|8|)+pAC�6'	m9t8xB5y5\�xB8`C#<)C0B'L9T'59B5'L(N8l9R+38؈0x!6H!PC,H0Ԣd4
    0pB>;l*cU6h9IQc(&6 V
    &78~c�`2NDcA `;£B(^O<=)cGc?�;:\,6dC:d5:CN?$;#AR$\�!ndHHNH.U5$F£FuKLIIfId%(�OeP
    PeQQ"O.#($BRBeTJT"HB,`SRVreWzWeQ*B*BOYeZZe[[e"+e]
    e"\B,LYe_r"P,hF,\#a"fb*b2fc:cBfd"�<+aJffjfrfb6%Ă&`fgfiifj6#)jfllfmmi2(Bnb2B&B%4onfȂ%ؒ�8ss#@O6s:"Ps:gvn'w
    @txgy#eyg{{g{2hjz}g~~gg#urOR#0BP6P
    #ؒ''�Hh~Nh|2v:OhWrg#4t~'wn脢hx�ov�|gΨ'#`p:x(u2Rh2%#,�Du*&|*%|B't%|'#0B
    )w:“JB(zg)~ghڧsi� !Hy",�4)x!!,xii£B",j*y�i:ꦲ'.#BR詖n*&x:"p'$h&d'xB&<%x'`'lwҏ#*"L{τ:#d甎)6"Lj
    @#D'`B'X&pB&tB
    p**u:$H#$@wk뿂ggvz~*hVŽ,�^fi'T"`riJ(dˆv**'s>g#@B+|C,�p8|5|9|"t'"B9.,R#7!BNӾi}�B-x#-|g"tY&4#Tmz톖զ-Bxv%BĒg�T'4(#Ԃ-'"&,!Pi#8myz,&(:�@�<- nC8T40;p7Ѓ-7<p!s.B&x1}.-pC"�\B'#\1${,7/�~v2Ȗs6"t9x"('<C-;7ȃ7d7|>C*C*~<|.4,(,s2B%Я>m/|�+8B&B03B.(-B~
    5l6Tr>2C2(9`B&6)F1,"x& /+P74"B0/�
    CB1C-Dp2VpFmR1DC4#@:LC4C#l"hF;B!hF0dq0s-$B1HC4qCvJ3@C&R(#�C;3/ft:g"x<",2;$rB�H<%4@0�&2B(C
    2(?#@^'Bl=#æ܂8!�+BpBt
    �RgO~f$vB2zt"//v,U&4(#(ts"78-L5'9kvBv#|vm$BՑs�"B=p:B!l'<K+<"|"PE;B?W+$Z+HEc2&<'X3'(sJt|L'C$1"/ �O4P.4Mg"B(H%`+85"6+ z*4%2iv'u$7B*B3+7L^%0sC&(]_gt .<1FRic'$B!$7D$|DpZ4"7B!|E#7HBq&B%H6#!7LB$fvj6L)-j#Tqv+*l01$\4!|%�B6w7)|m7s",~Ctx%4'G7wgw@xows2u4=vBx#$v% B$<B"`(@#h&PB&hB&,q&,}R,B
    "t$(&d%8#D(\B"$$88H�L8$pw?u6$+<%$,pY#@_/*%!3@&('$T/!d(q"pR4 (�/8*|B!5V82*̗y6BKi�\CgMs#Ȫ6$v$$B'8b'‰@oxNg�8+u:* X@04lWt@!<CYs�+@7t¢Cs*7|h!4ui`Cz6v*!\.ЂVl%P)tB"7$#|v+B5<B$$@B#C-",@o�1�(.Č#+^@.ػs8'T4-0$lb-\"<5!5d+K";o:!t1%,8-|×x$B#$2B'Pǚ$x6/X8ă(<|B.5" B/2ԗ/ "p8"l5\!84÷Ճ7<%”/:)xC< e
    6'8B<�~<C,97$8-oB9$C8.C.2l0P-8< >2>8ء8!pC(1"x1BlEb她"&x\n!0nw9wK;9!"H"ܭ\¦{'uǧ.-%3x37:
    s':4"2>:@$�}HРBtj8bEpj@C)bDbI'QȈR,M'*5M"GE(Q%j$
    (4,XFANROj"E"I&-͊UtԠ	sHWN_c?mT3TJ۰,FZ9[8hqRR#ʌvIʖ/-,RAT2-deݣX;@OM,U�X DI^)>JV�d
    e_B
    SkF`h,Q+f
    voUYx%^A ky�ebAdl)dE@KLB(%�a9EY&m,1aةE"DZUq~Fyp,effFBjhLY$D!EFLLS5ټhQZiS4
    e(Cm3>$JVPCCHLtQD!&`pYeE&ֲDdPEB^B  dbQ E$K1VMnU8:Ԣ6Y)GmM\7Qy$"!CH _x	JI$o [	eHqDoYwH՗_DF0�x\HA	6ؑFlq$�]6`/'Fz)EFԉ!EiFyo8넙Ix#/K35:Ėg?cإ�&ɄH|Σ�CgƕEMec9J$B殛"70ej	V)dL2yFfyEWBDCg2C	SęW1i	Er1PF|A!ǘobj`cu?h~DmѤFH	;�PI'$rJ&+9ǖYp<s2w|3Nu[7oD"	@"hW5n@:}/ʶƠB0"(H@D#"3hȠG,4',ѽ.-y	!_xD3nh(B�Wbl`#-n!
    EË~y:~AŌHi|xi1u$P6T1>⏍X'Iwb)H8b�Lg,#%DlB#[Pc00`DfXDdjAKm5/�hP&Q	B\"0#$S$fP,Uao@;6<c<@),T6,Qj:HF� JL5 (6qKGq�hWdj"�`)6)�dbꂑ6|ʍmK]&g\
    h&8B-'O
    ŸP#*kxe-̺(5se 2C@*&4PvАO,!MxB ŐAGP<DhG"Q`��iTKjGXD&GYBV#۾6ZO4b
    iÑ3$Q>N)x1I	h@`t!7xw'dhNHĐ
    V$" 1z!Da|ddC&߼""x""iXQD)V1&FD#~h$HL"P`
    4
    SX2џWlCĐ�|]1ܑ
    E;Q
    |BxF5D,Cʀ.!]�H44E0'K
    U�cU*CcE!	D 489CX=KcԘǣ!Lc3qX "D5A
    u<`~^G+C͛x<Y$F5!
    Qx19iLS"Nf(b^QnPhIRxv4Qs#c�렄m6%	].+#Ʀ:ɂ Ȅ,^E)ʂO#%I([$4qTO%}+WZID>R"x9!sTyG*�9Ip܁E/DӐxlh:ө>ulUFtNw~S.LQ>,p>آhȄ'q]b %f	D@܊$X!CL"1\$#ؑ@-X)YNX-D%=7!<ބ"gY(bvXX-&q
    [EgB(&Fq+<!
    ۛb*Kb0E-NO/@*_x/I{XaR |cXATnQ"AN@>o�AZ
    pN
    `"a"6A":E(k">!#�Hk $戎q.vAY~R唰	p""lj
    
    A0Afa*
    Afp7mvIb
    $e
    '<F
    !PxЅ$D�lP.#A0
    
    Bl0 q573`-$$Dqm7wPMQ
    [n7)"Y		k
    [kMr0\cr.#	n
    %	*
    ݇&!qɑnMH.JUq1qQ�a#r 	 ( 
    r!!!!"Yc"5r#9#=#A2$D$MnP$Y!$@nk&i&m&q2'ur'k\'r((iR$!l())2*sRRA*2+r+++R*AX!,Ͳ&baβ-R(AfA\..2/r//.8/	0
    0rdg11!32%/Qa&21335s393=31X4I3/#A4U32`b.W3620S6cS16us732y738s8KS43O357[5r93633qs:38}:s;;/803<I96X*�Ar.+.+?64<:@13;R~A~a3=҃P1/AC#s;-aR^EC/4BtGktG.K
    /@Cs4s�z)J	.dz@O?dzN#�.L<ѳ.a!p.VhA!7O.!\
    @SI	@*zrJ4�,,!S5fBSKT-T1.)rpA><RslV2js/'A?YUz..!3NtN.7!]C
    /3a&B;0z!r1,!\!Z!DaAaաfzaaRsFQ'<3fAQS`P_.4<H.ogSD\hMz@zA[6_	:겫`k3eQ`aa9".kag[Bcn
    
    p`*/tz
    !0a5/_�2c)/;WYeX?/!28XTW)AZWv[5H22rh&�8d<$yT1/T0gx�a/]Us*�JzឦjDDa�Xz!Se힨aD7@fQS@Pt!JX[&Oi%D^Rz@8�$G*TK/?VQks1266/iAR6�d
    kzb۶.Eagrr8S6zA.ZvԌ&�ef@؍{x.7/x8yU!4Bap/JǹHda6A:@J6cϘA$!7!D9asۖ!x
    AM#�T({ka>`!4!LQA^!uLDqZ
    |W6.WyCkم
    Ske
    e34c[A'dmp5ϳiR88[JEXuSQ؄=vXX_XP?aH?uzzw@Z=]!j.-?.Wa6�>"UB"�zζw.zaվ2<D!:nAa"DAjAAnPBX@j!ظb@a;A64YA
    !AaA.aa*:xb(TvAIA[Ra_ zDT!X�R!7�ȷt(!sk+ܦ:gX97vOĞATa^jiEMҤ5rh:]ڄ!U=3m+9.@6�j!ha.7.ǥz̓!7/:�2|.Ɂ̷/ǁa;4aaa#L	:rdD/M\Ac8!6yi:"A?i{7y8:jA!BA!j]Caj6aj!A]_,pTwqA!/@`G5Bu@N(˫C8�NO
    A2,R�yOjYA>W<�9//S�Ai?zĕJAAY~4a0=a{2vRRN.AGEȁ;k?WaC|ک`'|.׼zvɾzZ/ua/՘_e{ao؎Z%!7=8^A?	~Lp?8Fzj}|a7\ʉuS!}BHXA=vB5"!\zxPߍ_w.^'+)\RÇs̚ZZfK?L ٻ2l�>@,Gf	Q.r%(h (@GL `e22iFϟ@"p)ѣH*MH$e+odzjqYv%T	Sʾ
    )UzMAL3ˣo{Զo mKQCL(ehg_5:QoRm2�BTa*0bX`Z�1r/c
    p
    ԣ^՜RZ 	!V.CQX蛈�5<2#xC"ېO*8È8!s&4'Cb83K$J5m2 H�X�,,-x%)#ތ!"\!t"N%(TZbA7�ԚlfPI]"$@*<|>E"ˍt&:'5Qe'xTxYF>ebN65Ӎ6Dgf�#S�<ؒzI9(QCFS1BB	%$	$0�FRkm!
    HDDV"#.EotH2	%-$,k?]
    7�2|658xI^D
    "/0
    @*X8ß)96xBJO
    yDS-TL;,%N+\ΫOΨ,IJ0K;r6
    ;r+c8ݔ+ߤĉ-Tc'Ϙ
    6͇.<v9@d7
    .䄃M!v!N1D:LbgV6TN8O";s
    QD3DŀiˇT԰槯<7/={'ݻ�>0w;0n�+HAH
    T8B:nJ 
    W;ac!�%P|!P@ۍ|=<	Iq!&)K=YPBȢ.z`ǨE0H6D,07x̣FEX IBL"Qbb".I2"(! (GIRL*WQ
    E([IZl%bY0ILT:Be1f:Ќ4)LF̦)XTg5)YXH:ufdѩN8b=x�
    @r�MBІXDC'JъZh#IO}fŎ&u#RЕ3`);3
    weD>ŐⱞN:TH5T  )TPLxLͪSţMKt4#!HSDHqOt*#!W\�$VYMlE!	�8!)�D(�,e	Zъ2=dClg?ZVg5[φMoYC�מ%nrd'z)	Ml"D&q	Op+T1	GlU$J^`D=7Vbh#Q^ _j$<NXD'
    ݻZu]E#
    	HwVG,,tJ~p^jJ`egv3FǟgϺ
    9f-9H8�2^ 9""D"c#X
    ZBć
    cqLxd@-jWGT!4Yb(uĞ]XFHѵXN=Jp-b
    P bK&%>Sr#нB gk\f2Gk>#՘F0wpE:!ypc-"2
    Dc]-XD:Cc]N�$WS8|ZT(ĺEtX">yx79C9q53DFBPw<+qI5q+`!`C<9.ߘuD#n!r$#`ӟԋr=90GyzM2ZH8"	Bf)
    z.0T~waB*o1QkՠrF:Xx## iDcȧ"4aE(F`d>E"!hcw=!/{JD۹R`#g/hS�<La_M>~
    B2�};܎pF#^BO`,�NPgo2
    OE>YDPY_NOmfp]E'v\Հ1eFۇ	Xܠ	p`aNOO5)HO
    �:%	P$PnP	P
    @	V0
    
    PQ			mfmxrP27-E�	`~ĠmFg	ԁY	Ep�
    p	PNbV�p%
    `0`
    *PPw
    Q`xxHx	P
    0	$0
    
    Pd
    �NP	`
    	\؎H�0MQ
    ۠4�	VH@	Au,w��0f
    Jn\I
    e	Bv/Y߀ p	P}	0ɃÖN
    p+�`@ 
    w2 
    dj@		�
    		p	]N	NANN
    p�
    ݠpq@8�
    5Rp	0I 	,]W@6	pdR`	`u@�pP}vp
    r
    � 
     
    p	J	
    @U	~@\
    ІEiPu8T ѥ
    		̹	ϹNhp
    ΠP
    @W�`Ӱ	
    Wd	&gETπ'�
    Рn+
    0		@O
    PZ͐gh9vgs]p
    VWqY	`
    &�|0	a@X8oP
    �	89@Nm z`ˠ
    YlYIRJP
    cƤp|`P#�	 p
    �rn)@
    
    I	Y	԰0	
    0 
     `
    @uV0_@
    	P̀�_�  p`@@
    p
    `
    ڀpo0p
     	P?۶05B
    p	ȰZo `
    *@	wZ	�V0�:IeNp-
    FWU-	m9ЌМ�
    	
    Qph`|�
    zʠ^XNe
    4Ӱ�*po0(,*	/Z
    v@
    ۣ�
    WP N�yU0T
    ΰ
    6skO�
    `x*�
    PxۧQ@	pZJn	
    �		 4P[	�;	�jl7ޠ�|P	0	 
    p
    .`
    pr p
    p
    a	PWY@
    р$n$	�߰
    Ry|[ 
    !0[K*9qsxjղ/3[t5K5�	&O	
    A	ٰ
    ˰
    '��N;P+oа�'�HG1HNTPЇbPlN 
    O� 	@
    w[Ќ	\
    �	a߰hY	Nʼ0ì[JPؠSXŬt
    
    D`@
    0
    QOΗPs~\t�@P0	@	XEz
    `02@'d�Pxа
    
    0�)1nP`pP
    	@r M
    �٠	
    `�՚
    p�|@5n8
    k0SCYp0Y$	߰[O<"śtV<ke͠"a\	'DI
    Ƞ
    ؋�	P
    Xe&&`Ȍ
    ŀRp6f@@s�YC|xn]Pd.ѠrC
    ـ
    dp 
    .RPҀP߷0
    
    =
    pOr
    ۠
    ߶�	;`
    Ōp
    p+L(	`F!8_ruР``��Y⓰[O�P�
     �*	`	 ^	lC+
    1	mQ
    u
     
     
    ̀ˀ l	p0	ȓ0v:ڠ	@ �� ��9ʈ`_p:
    @	
    Y7
    Pu�&97��
    &	mhb
    >݊w9��| g԰׾ː1U~AT20J{ �0]@
    �ְHy
    ְPnc`	𤊠kɰpGQedV^%��
    Ҁyp	tɂvO�
    @	,x &/={FY
    +E}6n
    Д}5S~	 
    r
    Q	 
    5(|
    7qmPm~0
    0
    ˰
    K(�@3 ٠P
    }(#w\
     
    7P90ư}	@͐�
    lE
    p	`A
      ,0
     
    
    @
    Ԁmmj8w6O(En{TimH@S)KǐdK1eΤYMFKGI[֭[Hͤ0 4dd)V%F?n}4h)VYIS�D2!*+MGd9r$R֜d4ZJ1)+#T-kF(MdFUKjĕ#B5LFbib`TP#07/ݻr	ht<8ɗ]݋%'wO<z_zꅾOϲ*S�oYjŔBZjEÖKēE!ěK6Kfy[$aEC&ŒMYd\$YđEbJ<Nn)[%PёYZ
    Hd$\&A$HT@\bY0]<A$EB@XVaUn[`9YeBLœB6WdY6aQh	EMUBĖ	A>HZdS	E2F"I$UgajVxFLLFd*wuVYVnEi3EʣFD)U$F˯fy3Yא1	=)8mNzedݩ�5Ւ`b`vC�w+xMED$j*AE2D^xCy_
    <
    al<
    Idu+6dKG)$gyAv݅9BKc~WS}z
    qi6W{ؐDKūV*
    7
    cCt]#r/'xV[w4}I&^}w{p][6KX*nywy裗~zՠ~{~FdD7|WyG�$y~gdyU#@Ź FP`-xAJZ�E"2APT$b	P+da]
    *"PmxCP;a}D?$Q-T%D7@SbxE,fQ[b
    NtQc$cYLŒkdcF8rcxG<Q{c
    VQW#yH8
    `|""I/D'yILqd'=IPc!IIE22c$YyJR,myK\沎MK?)4!C-fТ3Hj^+YX~Sveqf2e XF2MXP"8Wt+E
    (36dD@D!d3vAEX � hQqd�HLQЈg*	+RR<E&c8S4�>T&1i#Rd.XE"`-AEH,˰:ֲG ͝j1TD7qj|ͨ"]5�0%�l0`XK,SC8pzF\T7&Eal!Il$
    n$h+Eۂ#S,Yf6Nq
    o9NmPqMA.fbLaU^]6Zp$Bd@8D�#h~p"7"q
    uÊHS2Y+V[BhDuDPb3l1֘Jb15Uk:Ŧ7�P44n@'Akx"�2(LEB(&,4uD6LP"UGqZT!�86016X0a,*b!J�O=#�͆&\+BS'\{RBņ7N#qRL1ҜE1La6DI_5+ITÊGZM
    ccn#x}hWdϫpF�4#c(DQ�,#s"@
    +&~rJ#JB$�F�<z[Icju"5@͂g")c)*k)^϶a%q)"cour+&@ʭHbL
    +r)"S<D7Cz(
    RPqPt)"Rd0!d)SondBtc;m!)p}mbo+}I%fmEn<"�.Bb$C|$!3zԤu8Ņ4@z # ,1jLИ)a�Xc֬H
    hh5@	g 3[i܂ΞȧH*j|+6&Y	"w'{3A~f+>Stc|ES1qٌ"ms>$B U1s�mXY"țb@VP+;C�Hp,{n>JxAQPe):*)x:Uo8kzʊ;&B*;*;dq`Sj5+{XSM "mcaH�ePmZ[CVPn#0]b RPTȅt�ShIFglNnpUBDLL\\ uxVX[USfho"Enl>*�hC8ceP۾�о&#%FX!#0{d?,Gs8EC*88+B@>+˃Xحj@d")�C*3Z
    �hB9zD&$L3,@h"rqC+Z_"jpj0)oXwƷC`� +BR,D*_6XpBi껿"f@EXO؄X؋R?nڵ?Rۅ`fXmPaHg LgO7TԄPg\Pí*ZZPxO3IEX)BPnpBľ*jk%h|BF"KqXTs,uT%#C@"d8@3}=� gxpy0�a(Ch9DX`O)
    H<AT+:+cpfh,c`g++:0sB�f(+[~"*J)2Oddi@_@S<n;N@lg�?W0h<"Si8m8rŭGe*ܛP)M~4ӬG׼הFٜ\MOTn4ޔDd?J\·"i�\HOX)h<Hzc0� �<XF>&S$BPl�<oF
    vhAMFo#U$CSUoPNSA�Ukw\):MhBvpgxd<V)y7R@B_"YS-ΚDV)rR.gȄI`]I_F8$ox<fH+ePLЇbڮiH<Fp~HN8G@Px^`R<Qxc@lȅNc(qD^PGN@YDBQlQ讘N@;e �dPMThD[)JEpEZڋ\jL B1SX@ST GPÜGHL+jP�[@PTR8AMvL0lPfm
    �S�q`έ)Q])rTۿB9*J2JW+H2ۥ*�ۥ]ߥ,^,íHR^㝢EHxBHx޲^"BJE]I_tKnCqmІsYp)R;Dt^ZpASUAS#�lO K
    �\`WSqSeضWhc84sTkvU`6"Y0e`pFN�l0,gP0~Vgqh` `lC,brJT"6N ��wN}%2jm BUq[=
    Ǹڄs|n\p3dDv\[@\㝲;<
    <LddN9N6d+?׍ddQ&KEpIB%NeZMmP� e5eCe]ƥU_Dfe>O\e^S_n7`^fYfkfmޥ[~geaZ"r
    r^:Jgw~g!gzg{g| |"$~~&yɞ>
    ^hi�hhh^i2jёeha	i`~aيh
    BjPXpꄑ隖jA0jjFh@i�qFkQif	>n9H
    E؄O
    EONfjF8�I[iiIި�(lvhϦC`̙El>mf	~mVԦ	ƙ	VNM؄LxKNOln<GhnǮ	ƣ	ޘGhFSI؄VMM`nM`MPO@!ߞHPqpkyO@ppG̼FppkƠkshHX8qk(sp-^0ۓq]qZ
    lkhpTJiڄp(+_-ZP\ J``@M B4o7Kd	dA>j>'[wpT>�piapwn[HoU^*EnHK QXP0WXsp@hs0w�`/~8mpt8s(wlDlfQ_"S߉�V�qN`(rgs/\rrpnW^0[DrE@qqtH8xM@_ЅWxmO^B`X	cxZpwg!xOɆkhFuhFE[P`p^(h`y[Hb
    ozFxzaIxho
    `h`�#
    g	uS@#fV7yFiah0G^E|h[Z8lDpr[C0"R,�`E(0jh
    >d(.E_/Z�0VLj!yz}ڗi	
    a
    79IWXVS�LKX(ei LUhsHUІOy	o�H8cD^�t!1]0d)V%F'Rh"ƌ7Rd$	YWyT(X/D~B$&2$ˑ#Y$Nt@٭CDIZDɛE5k5S"nU3j&V{@ǰpjشjײeD)&A:U(ѷH
    �V�DZB(}C蛤F+fСo"}Sxs
    F*5Jj۰BtFb@Ff5oߤN`}ͧKP!zlOXIc#Kv3(E!$5lC	"<&@ˆ&P&~B4‰&(b'H&6r6I'2&dR%8'\JQHI%`	'0ȍ9F%B'	'B&(	47.|R,P	!H4@.CK!<rE6'[
    :(5(E<'I"h\JC1Z>1S!"M%Drȩrԓ6SzLP$"!@3dSxI"|s74,E4Se\zu"R�-NF)/(6I8@$$R	`[J5D$&SK-O,0�/&2ز# 
    -W4X@.34rPqR4ױ-@D`0	vDyH(LэFw^zR+*@"H#H'H9x8X2N<#'cM) ҋ8tX/"x#/lB
    %HS1Ӎ8?`	&l#$9t8,	3GI04c2CJ"0R8߼)J"ĬcBO^--xVf!H!|<"Ҩ363	8<tI?!hZlA4Db`()*4H+`17+CV5INS-^|
    eHZrj]/Yz6
    ƁW\*iF4~6//}_(_A
    a^\$j@C8it1Hݕb@!|ᲆh3VF
    E1h#PHӌPTc*%IjZ2!xD,qs#�07~5"�$^	Jȣ|@F�bFآ+(0~aB%))X+T(m!aPlr�H8ȹ
    Tc{ZgB@D7(q
    N#*g<c "7Kx2[B#�YB&
    NCbh`x	D$b
    TUj(Jh"qNdX|iz>x+ΒxV0dĢ
    &pCZ͕uòe(G9SPq\�H5�pcH`"ze(	B8BРf8Y "r1^㯐e	Y8F=袳RJlCqtrRi@#BdG`$\ٜfG<Ny<ɐC8M�fQ]#�% KY&�ͨ!	D<p"gh1qoPB!_u�YF-
    ak,D5"b1PF4bH8IT^rih+dqL4f�Y
    qmxn]NDaU]QT= G,TUI #F)S")Ef({D"<qsB7e S|("L̪xskB\'UeD*CBx$sg"�Z8҃,/2t?vK5%H浴u":|W4͸.TVK6RqjiPD0hV&4pG ٷi@fLm'ҶOb&)0:�F&�mnIX#p;g-!4G@C$`a"Y{'GEOO_ �]Fv�M@D6L6I@.$!C?[x#�xEv߱f�}/D�Ja	g.AU Z�!8p,oO!LnN8'�A,U,>1F
    gm1	>k<ʜ+쥈Pc�_"Je!hZŌW|o8"?âpLibJ7pXctK!jx@@#!
    )B~2('�#r(NSX7 E�À4!K@xh101X%@4Pº`#+Q3$`fI`e$L`%̄"+#C{+eB*,4CC{!iɝ
    (@1<"D3H%
    E(B)BDB3HT0/@C4$B&!"at"40T4B.:,263pL.$G;d"B5&2T>2<C5܃*$2H2�.HC22C3%4|BWtC">)H3 !+2܂*0>p'J'`3<5$P)�@B1@4�C!68&(Ld"64B09,.;$A4#"8D#%,(j�>TU(B(/#yş:.muC7J1_="�həy:r68T2dC8XL!""AC
    M�d,B$�)B-B)x&tȓ$$$(v"@J$*܆C\dy㠔EBǁEbhDBOtPNWQ$R2i!%`(7*%`uhU%`,!`%U"xheVV^DWrV>%Ye\JU]t�B-)+@,F-\D',!X)\,D"|d-H+!L.X&0$B-B,I%xºq-!@,xBM-B!.p!T,T8(f!Bo:&B=+xY$B,,F'&,Bk,B(bn+,BD}Ř*X-$M-B"dB<)'$Jğpp-TBU,hGTfDE^$$@)()Gi#\hGfS%fEe!0Ue`�<%eSh֔覑ոDX褎(j!haƐ~ϣ`pI,\% B!(cڐ!,B%7dT)B`)"1B9Mi"Ŝꉔ~ibBJJY*iן*Bh"LiR2D;rމPߒ�|㥒nTj)jX$fΪH^3LCV"0 ?ުZdꭺ"+_,(TM+V^+fn+R�<Y<e+Nb++:kK0#+,2Bb@d,,k­�^,fn,v~l+B"ɞ,ʦ,*$BV,Ƭ,l*B*",,-l"+fl"\B,F*%,@�dn-v~-؆؎-"+p٦ڮ-z"Br-֭ޭآ(--.-(B&F,0>
    ,Bn٢Z~.ކ.閮.*n2.J.b-m֮v...ں&:Bv)hBB1<3(C3PV4Tn)lBnr"C3}1(2 %2$C1`/5im#P9��ؚپ�'n)8C10&�2T1,2\022,1[3ԉ¼(rt/{m�$C3U֒
    4 "ok)dB"18C%h- o6"4C*d-3+,"*-B22xn�!D> .omn't7 q5|74ז
    %ȣ|l-o7t 
    "g"c|"	7D
    -TN7lN6U^)o�H*g++kmj"$,+/po67.)6l@(tGB9m&l&B>ЮB>hsؒ
    Z.,7$0x( 8B0�1B64<'0C)B.h-7D)C9t*C@q0F,!r74q#pq"P>B6-1]IB+yp67�(e2&\"Xs�x0i5&`^(No@C4%dB6	8R$pm-2C-6\*Vu�W_J!h&5Z*#ȉ*=B&T¥|+��w\30�r6<6B%hm6p)/&S6,4v�+/0-"1Bw%rh-6$6^ g$TC.08Bm#xqWB&*0&OC(2�]0du"Bqm]7R/B.!0ÿ5d7y(p452̋'\Ce|C|7O.K0,Sjkg-2pg|HBg-2Qkvwmcw7ޅw--\	'…Bgm,pxӴ֊)l.�C]t(xv20mf-.и-OB7,B�$Bg�O47Lt”gSyrv6׊6P8#\rs1O�4!C2h>$W_35rg6 .H(B= C2,o=(TCb4)LC13To-DzZ]1=4R3518|4>7*7-?7Ӻ5x6Ovwu7LO4Q13&s�d7;עt\x" g-6谁'6o6,z:+u18l0x5|x,ܞ"0_xx�C8p#3rxw7lTV2,Ci�?|ă*p7�ZJĒoCQk9|f9Ó8[=TC<\ism.,C0f5h10lC$(N26C+4]!I7b-.1)C*B:)$,J6HX8h*@C!-d'`B5.:s�<C+B,*`)N+|*<p6z�&^ֺz򺹟/.#,m;P4zWA/{'Ci<{gm"o2",'x#xגq*7,pG/1u�we0xz{_XES&*JS]W3s-9Ђ89؎-2�5�I0xַu
    ЭQ�neD5j<jADY�X
    ɢuR6
    (�biX�Z#.�M>qKӵ�$ @�a
    @I[�yB6UѰteS!hKPåhHIN]]VRP>)�$J:*b͙�2xtfFSvvlٳi׶} (Vy&LA6a{1qd1:lfZ
    X կaX>S,Gf	hCND^ă[
    @=4gQe[DIR敃D	`bReC&BLnDQ\Z
    1_4f%Ft1g[!"[EӨZʈ(7	,iFJ" ZD)fTAƦdz&�D~Ak$
    K;2Ȗg@!;W&m9:L%:�\ I;?Y�HɃN;l>*mFMm5eZs	.�B+�9r=B$RҮNfK-kM]&D>YƠQ9 G1*DIF]v	pl[^
    6<u^v=Hei�Nƛt&S Δ@lǝ(yNiEMƠdqBM RFdqmun\qig2]FqRyܐKBQ}h$iF'Ny^&uQ^9lr$cq*^2GA@N:<5	VdQ$\D)tH8IRQe_^
    p$Ah|AM[YD.Bqf6ky^EϠLM{~?_VзX1%�R!edZs-
    p�a@<I&̑
    5^ƴ�*(8AHD$4/N8r
    YFP0!(A	FDUCJ+5Cz^pAaDD+ D�"yQ$ضy2%ڶJsl[!&Q	7dk3D6!cІ6Y#AT1!/q**cr38elW�p(B
    g^c�E�<k *Kc 02]0i�6u8la�Z!H1HbH:riD"wp109C5Ck
    mCP&PX-&΁
    =*[	R>Zd\Х1Br,n< WLySF?MFjEiiR{S>Y"D܄VѠv5DkzfgWVHUV|A!1N*^ŚTK�_gW`"Y-XǢd	3U0eiCZ0H#\meSZ&U!\�;��������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/manual/images/chapters/layouts/htmlLayout1.png�������0000644�0001750�0001750�00000052501�11377016712�032261� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR�����������sRGB����gAMA��a���	pHYs����od��TIDATx^};$Zu\[~6545. rdcV wf/,2+*QO?0C0tb&e!`O
    !`!Ex)3C0
    !`!Ex)3C0
    !`!Ex)3C0
    !`!Ex)3C0
    !`!Ex)3C0
    !`!E7_Tn-2Jm `Aii:0pEt\ԴEV֯{[4XhPZZx9&nښ`dm `Aii
    .ugQ)A01
    *1p'碦-śS"pDPpo1
    .ugQ)A01
    *97;6[|<?hO$
    oi)ՓH!Xu4B/{in_QC<WQQkJ")M$C+T4Wl�}MU;UJe1VU-o_dgǃф~WN6o#w_HF]VL;c9x#iAMN)pdzIPm_oF|h*xbg$?#O?KBohڇ(~-ϟ8fvG6_a?'Mݳ
    Hh
    "
    ][UxCZ	Vcij\poZԩ7iHN?ZQ$Y77aฝho+ܻ④˧5Tf|yUC]>EXĝRpH_;k@gqH5:M%%Qh8s[Gp,,\j89JlxzU"y:g	pN)~ݮ,yC:u>G4P	>7$QE)dtt	�[@mC_�|Zv5342
    "}/:z*'j	ߑvb4{L" \>]|&ER	bMCG¿aalJAiSϰM_zސ9@D:V͘mPő>7xC)[0kGT	(;hG;+Ͱz;E%@7y*oHׄޗIW$6wh}82 
    dO4\VTI{zg0ްnŞE�r@Pi�tRm07}Q}oD2{_!2G͘t#�a?N1!V;)U	rtbr3܊2-9'lV_Y}"ohO�65^̌sG0igRK7=/z:o@
    cYվ9m
    eSoTRPQ~&Vm}y2YK
    pO?~	<	y3H
    o4,xa:o�g*D&з<U{D3l"|9GtQ=7/"2)8o$zQ$=ޗUE;/]*u9Ehr2
    nK"n@!c~/gړ>{az9A9>/]>xh7N9%+j~aFu9"J\ܑ+p	>*eߏWJZYiA[:)6$/t,17Vg$,1XE/om7
    MP~"|t3_߀J@GXP^drԴ^InH;Ҧ(k٣"rзzvE}*댿CE[/ڔ?
    =&(D_[V;R7xF(V2?<!VTuHu,x#(n{ܥZRz̟X_Rۈa+S8/~Y!RB^)a~nT }\E~gⷌTQ,Px s@W.hfR^`UN^BPCX7O#�>~_/)*WWټhiݨ.uʹ5mQ/|GtSVK$2
    SROZrv༨i3͇]G~ibgX[tuixKNuh.jڢjkmn^]㪅A4G`zuz%Ntь7o՝XU['N]\R;
    Be-]xo\TpTuvGu>LrNQ(-=, ݩF"NkQU[{[4XhPZZFO]jFЄEn-2m `Aii7\]QoN
    "N	iPѠb箨BEM[TmC7(A21ZgኡV质ip5%H&f!b@S7\14
    5mQf,T>Dhjp˧O_޾MubA	L%r.ߗGj]zyOw8
    [wp> "u|gS;\*?qfzuH	p
    ִG)s54.0uJo(\jD"RMw;3Q"}{ITZ:i{zw!}[_l0H8BghCZl~UltfqXް[D`^
    >*Fk<we+-jD9ox
    xC\޾kmu[|7C<6Iܚ-\v@`NPy˵G
    M-B#fCx2E0ݪ\g0\E|Q&-m"sm)7ķ{
    C�}	үԺFxû@Gڭ:*OzPWPsxc
    'jutl]
    _G&!	ӔO4Qm7^_
    !ťK}ǡe]dB5W(B6)+I$d@EkmMk"_u^=|fQ
    lo! e*)*Xh!.H+#}Z}Pz秅|tn<Wc3xC*l"E09!d]d
    o9_rq&XS?jQv7
    Rdڕ(m76zV勞x:"m.xw6$PN$!=Qm8{qDG�/=g?98:%,^lNq#fhA4,B<E�W(8Ge8p}DC_8n>IG.s^6Wxe0eek%'kaRtZů(5؀ux`e�Wnj7$_Ooj_1>Z>X(
    '=X<'y�pD]8/&H޳Ҟ35o
    bWkF7\aNE-iIM"SH5*3Ÿ1@d\F&,/"`C>-{Y)Bpp@70_w	Oo`5ڽHGyC|Rʫ	'	ʳtgUސv
    ;"aZ2+։\u5Qƈ$NM~tgu|eaKj]VyC,D{tv4Ԑ9@&͂fl"S
    O>e&�@ȥ)J!XGu+uy催@\.88C
    
    =@__a`bW,ӰŵXxCu�?S@dEuHEdI4qEXbUxC b/xį-¬+a罿Q�ʂ6Tx剽zZQcL|G*EܧRh1~Ԯ%p	`9y1MRpDPEGx7Α_דD4Ay:ک&MB?)g՜{yT4jRT+jdV5Qv<�˦]a9e�eP{	DGᜢɱv[ki3oXrU[SV+;h闞7ݤޗ\]VCN)H ؏,MԺ!SG$V9@n_È
    ,Y^Ǘ\Wt$}OOWU?I5>r@);LDu`=X?I	~|k Z2$ăl'@3G
    ~˿ Eaxy>}3&!r[@SX]:r
    O6i)Jc.Mxebh#?fe)Ms@:EU
    vMؾ&-jᢦ-2H&Z'.1j
    q$wnb,	JԸxV质ip.2ѺWbb d穛sӸxUfxӋJ7ϲl>qxJ7 6+TV]ґjH[b
    WsW[Ӣ-!";q\55.60FxOjQU[{[4XhPZZF#MF{n$~QU[{[4XhPZZxêqr.jڢj+)A01
    *1ްnuJLLe7'碦-2m `Aii
    ɹiL{[4XhPZZxêqr.jڢj+)A01
    *y
    oO_}T_~{@AN0mfazޡ2=kďR:di;(K~Z~uStUAA UĺΚOlsǥj轐$L¤ErgyC`rOGuPuiSSjiMMJD(\YT.>߾2@y8vb؅l0k$oPrCU]ʉB?U¤͊j^m:]v$XAlWZ+kݨ.鋚֫q}/Ax!?%ܺBZ>İ=@zi5l!?Ǥ*wsם:P0xs٩^1QJVf1
    +WDO�b]O5WmD
    7^ˈ9tV7I:{Eu#xCJz#*rsԺFx7+:8d
    VQ:5}
    oP^&ħ189P({\E=>zKݷ영:s
    o8BHPYE d?q5o'Ȑƒ^r5KpZb9z
    !5նI
    6^E.?+�]Ex+N ^ItG'oӵ˂bRr.Y.Ω#NIqrBJ!#IrA2˹#Yx[eDoHk!
    JDW<D9Tz({L?6۰{y/p>Q#&$Jhe+,σcQE<^
    P2A�.xwQc$PN"gDQ
    pi9K~3?4)ܝ }a:%fD/WD 	f(Mjsn䀉:
    a�w~$>l<BGd@(㴜GA?@ek5$Q$
    X~83ޠo39i]cXv+	1mJf-19&�$_T(ZVa#]
    ##WpBT!Q�hT&IO.ɢL"RJͼҼ"qY&`Y)M&b&LS�T:o>AHw(C]$QdS6j%x."bLxq{3@ւr;}cU[zI[o@=S'hO߮?dn)͸ͥZIbnUa{v=c�ڗb#k,
    ]QW[2ExHY.MuFYBa_^=6R`ltR1KYR.(?mɅiL_uIkA!07mP)yM
    i8o/zGD!8YkzɒμP!ܯ_]GR&xC5v@`~UUDdTKSݹ	;X[z6pH>w
    	7B|o(BE~P_o-$C~-VF7[oDjK+ԧXoCXXXŴ6xi~q'J%Ur#E1Uaye�e8Y[`;(T0/RLdBg"̺ Ȧ@mŀ_͆!|$9iy˔qYխ\}drNqB<7`Tj<QNΌ5xy2U>X>~yBWcaTc]l^~V.fiɗaqznj:^?I	4k $>Fsz�:=DC?6#`P�4! sE\'q�a"!vIx@?EHYP&^[@liv
    Eqd*(&lP2݅dP/
    !6Zu|a5mQ2ѺNR!b՟2db|�0xnqr.jڢj+`u
    p90ް'gCi,_ہ-
    +
    l :oX7NEM[Tme:%&ABE2VuߍsQU[�N	iPѠ,&#df
    i⽭S`b,T4(--q.5#v
    h"7yQU[_N	iPѠb箨BEM[TmCv{[4XhPZZFb
    WtsW[Ӣ-! ʇM3pPxz+tZԴEV8Ě$P1u
    ]QoN
    X3Pdb*"4n8oӧ/oE_GU&H:٠	MВ
    ٣/Y#~%KKg@A]<4W	訫<@u5DKߏP{!II^DX
    }>ņMPz=BJD9wP.loOG,*(OBN-^=>>wefPZ~$JnB9^HGz¡![4YQK@M8fMv$XAl7Z+k}KZE-^Դ^{)M[r`;A[W^\?2ۇVS'¦S~{LB{7׿ԁś`NZ轐$΍Rt2\]K^Msij
    7Hò2bUe
    n^kнҭBܯԺFxûQWUV7*>.JhPՌ7(cD|49'biYЫX"<辧\`STx-HE ^|R!z3p2<y@4$Smk$xLnH6t+βx]&qHC>˂7Aعd,8&89'
    B	+Qn<Ѡ7}ʕY1%`\tTDM;7#6%{Q$ȁ
    Q5BL#<F"oΗDT4I=Bj Mպypb,*:tC4j@厸>g&r{NndDQ
    pi9K~3?4)ܝ }a:;CSF,҂ae|s*[(O9PYtKjќGA[9Ձq�˜NSnn&'k!C:8rRxPLX"oMcoPS�jiLho_5q,^@j!|M%o-�%*V~}ēK(/WBWD5.@dBOiXD'5�UN4It
    BGM\&{4d3rV*
    (Z770Lc4k�SIΘm rEkjpO	ʳt阧Wm1aO'a_߀z\OО]7)͸ͥZIbnUaa?}*Vm<&aU
    SQW[rcAxHY.MuFLX�]1OxYoTOx;@kjt�kX7՝0i`0
    j\N֤xT
    @GhAp	"m
    @D/d%K*xuH}yy_vgFKxXo־oʾJݙwÃBwi;9NrKJ?^Ա}K/ɧT7W_!>aNBZSQyVNN.zXd
    n2c-pPb`F=,gm߈I:N*KdG�a|qd,
    :�@qpwP1<^!.lI1a!u0ʃ Bi:7RrHܧE9gP2 <`<�ٓ)BZ#YZ77@(fCReeܯacVNW8 <g	ʳt阧GmX
    ~
    \̪ė'c6ej'"!|o
    d5`; 7!oc6`PO6/
    �i8CR#E�ۺ۸IS&&
    O78ġB(JO<nyDOH>#/dم
    
    ɂ$T(Eofц'Stc- Ъi=cO`dJ*ks5.pks싚J7M2.異G`b@@b
    B+iQU[]du`xڮjĠ5h브ĬPY+q+ƁsW[Ӣ-!3yrz[{':~&:.jڢj+}}o 
    JKh\|7xM9/jڢj+}|o 
    JKoX}7NEM[Tme:%&ABE2VuߍsQU[�N	iPѠUw\ԴEV&S`b,T4(--caU895mQ	po 
    JKoX}7NEM[Tme:%&ABE2O
    ~/"r߾Kso4	
    Ҭ:L;_F gQJ',/yEwo_+tpN>C XYiMtnTX
    i^5H>:~NJq>oa>EbCOOA	5m Ы6)|A>G\|}eq!#{y'YaNIz䆠,A$'Ic/ռٴLzs>oؑ`1-x^iz/.֫q}/AxKN~l';xr
    kKK>İ=@zi5l!?Ǥ*wsם:P0F0dz-T^HG�F)M:[G/J5U
    @,cޢ-Fk>c?*27Igno^bʝ~m5	\~[hoh!T|TMToUxϵMn{-ow
    v3K_J#JnQO9b^A>#L4ZH�DīOjшn`\xK-p3< oD5MRbG-r9X_FM+βx]&5,(x-yf\
    ]\0$89'
    B	+QnV0}Sr.)A5
    otϸblV+"DWڔ<4Ttmr26Wm7GEOӏ/qR`.%j>$ )Ƣҩc{M7DCeV�
    ].Oiol^$&EJ	{NzE2MJ!w'H_.0<i�tY	G
    Hpk恲
    G>9q@-ЏħA(@Z4$T&fYNRC㟐Ş2zb3}LN1KY(=A+ۀ{ǟ$߫`Sj7)�5P4&	48$}r̜ۙ;_d	J%o!*V~]y]+A+ᾊ4Sll<XzJؼ;$?m
    ԉ~;Dt_.'-^4X2dSr22ow	0ɛlo.{ւom �{:	7
    $oq X7&x7ԩIh"CF`+NZbC	ސ]QW[2EX@Ζb	87* aE#nWwXOxjH>rtRo(WBR$B&J?g^7͝Yp<	
    
    3`oJam"v*Pvq _,{&`	|zIQ>5~ٕl.%SDOxC-D}f3/قTw.rt _ؾhw~|JKe~8ސ"+aBju+?RY"?NNJC2S7\ۀ~x^IK=X.1ہ:;,Z=>i^jn~q'5W	d9@"\f-[YOBir7Wg!Bi:7RrXH)u+"ecRd"P$< {s
    xpA<x~C(Xz֎ʆP1ke>o+rtN<gۀҫ1O0.l`_*"?+#2(T=mYIH<[Y`>W!ACjq<b'x҆vt6#l�mkXuN/iڰH$<�FƔEi"Q\8@HAF,:Vc˕E1HF<eNlh
    \ԴEVD5Rb՟<m*l1Ì7,氤sQU[�ow$bC
    ɹiLYց='5PaYDG
    :ɹiL{[4XhPZZxêqr.jڢj+)A01
    *OG@gyJ:%&ABE2AYBy0+i{[4XhPZZFb
    WtsW[Ӣ-!ȽS`b,T4(--q+X+iQU[
    JLBCĀob(h<wE:-jڢj+b@	Y|:
    W箨BEM[TmC(A21Z77|ӗ"/죪p`slzy|h&hɆQ{Z?J%3 .R~uStUAA UĺΚOlsǥj轐$L¤ErBX+SQ]~$k_Ǜ=%?ϡDMzXsQA>G\|_g<eoi;yB^DIiAiS^(!n.D{!Ita؋fE5/mm@4n,o5a1-xhc4[ʠ좦-tw\Ki"dޒ	ܺ_zsIlbXO=~{zO1i\S
    oa ;kB?287JiʌF£gWĒW)Xk(ֲ(iij%Hؿ=s謂/.3opt^Fn-GT"ԩuw+:8d
    ǣFT
    >PՌ7([\h"pۋnU^RBQ*&(ej%ƒs3S|NQ
    GhCDT^"!z
    ƅ>+S8tHoxhH'Smk$xLn�d譨
    ]1⊸,^ItgHYP7Rr.Y..Gɓ!ޕ(7+D)Wf9|Ĵ?Qug
    @@O9]!jSPMbXZsy<EIzy/p$"ϧGx@ΗcY2UL1NQ-
    } Pr#wH{c#",�5D.b
    Lثo@u�ǀ&7cLo	T"]bAatEBjLd#eXma΍0A*ЏħA(e(H3xL~Ͳ&6Dl15n>o�YnA٬I[5tXqfd&(()֫`S7^l_5be6%0C*AC:dH%o-�IAsēK(/WBWDQdvƒe4mD+�UN!Oi.'-�Vf:~x<6:jjt0{4~z3f\cZP%,4A9kU[,AR߀z8r^~(QNbs(h\s^:4g׃]k,Tj5A)ڛGZtvE3Cf)ݥ;#&,@{)w<n *PHR^Ժ}>t�
    k\{g&
    �ހA6
    +AX"jkIcC^/3#0k|R4L{Boy&4۝x<<,t&W8q;X[z6SZ*{唝15n<o(ٞgE~P_o-_+F7&(LؠjK=)6:a1_{7bR7Xk%RCɎ�yLW	Yu�&'wpA5MRAp/z!@<d@Y/MUfCJC>t0Hq.Ͼ$:%1ϛp?
    Vn?V~1kel|_}y{yBWcaTc]lUD~V.fii˙8=7ej/i$Q5
    IAtO0n8Zm>/'mhG`=
    �i"q`b?=4mX$&$a˂4A@<5iv
    Eqd*(&lP2(+"D<.RWU6pQU[(#K=BSĪ?}5e:1Tn֒&i\<bI.sSY΢-+oy%,&ֿ5e-o5
    5mQEfYO4<hD
    nXAlV`Qb
    W箨BEM[TmCf&Nu0QS7Lt5;<s\ԴEV)A01
    *Ѹoa<s_ԴEV)A01
    *1ްnuJLLe7'碦-2m `Aii
    ɹiL{[4XhPZZxêqr.jڢj+)A01
    *1ްnuJLLe~y_D}eU嗆'$iУLYuIj__7?wQrp\J8E]E|vT:k>ͳ?.ݸJ3=:Bkڣr%
    ѿrOGuy-{JrP|{Y	$ۻ=oP"5Quf~ja.ej݅nnu(o	ȁݳIvu&7:&zו*mq>o؝D`^|}%}Tk6!9+aQ&yW@A7$֦^unx>c#O=|6[ۺ,iIA{mS
    f@vJuJ˔̦5E>v_	+H7pߝҢMT[
    ށ_ERo=oy6ЧS_۩uo1t{j*Awl|>ݳw~ApeՒ3]=%Iy }Dbgם5̒ye�.}C)`K׹PG$&
    Q"l3bJ
    @W2 g<4IJbG-r9]W,Jɼ&n
    8Y@[RRp	"$<{zܧw�ё>g'b*!6
    .VLN!d]Kr?Rb5b	cLTbyp)2՝vCkájݮ_"xg NA7XhUeF6_
    ij�ԤI;DIoYPۺ&%ސ/L蔰㟜^dhA�0,B<EJe8p}㵎1jN<w'z_9\7mT
    ʎJNVB!._:-UW_vMlݺt<0Q2oc'7l߹#}r}@t憓,q�8D.ykb= K}bWkF7\aNE-iIM"SH5*3Ÿ1@d\F&,i
    ef•DID/XMǶv/RQހ|e,Ί@a\M9QTծS)%mJk7(3bQW:[qe? NMam&a%C!)&fM]VyC,D{tv[%ռSj=+D26J7ȃEx�wȥ)JfoPm w	@ +ra`C<`[] &7O
    ;QoWa60ܹW̱R>
    jb/(ou	0�N¢u|޾BlOR3d_~C\oN[Hoo2T"Gѧ%
    zi
    .})V^!jsxZl)BE~f#؏9zr<ӊjӬOY5g,yTjRT+
    uVv<�ǀ]a9edƁpN :
    zEma[T
    {3׍*xByxIi'/)Bh{dfR|ސWH#4-@99
    #^˯7|̾Bgy_O
    ۉ
    xf4LRtU,X}LiUQqenOEBlȱlE)&[	Ф?+A`>�@ۚ&![D	uOEP5mcPqeM1DZyJ#H
    Wsi.wqkc)cSXL7;9#`OR)>fV
    }t	V_EM[TmeLl("&j㔩;PY4^{P\d
    tB'碦-"v]7L&g%;s8#]'碦-2gYc
    Z<QV*+.ȎV5$maU895mQ	po 
    JKoX}7NEM[Tme:%&ABE2xOsU5-ҋN	iPѠş,Ԍ5	EM[Tme~:%&ABE2o5
    5mQEm `Aii7\]QoN
    oPdb*"4xCA+iQU[kJLBCĀob(h<wE:-jڢj+b@	Y|ԺۗO}~aU?#5f{C'6AK6dM?Sw̓hdqNJ8E#+gŸT:k>ͳ?.ݸCnƜR8^Y߆|.*t~sTTT!b%}T?+ͦ\ER\5	
    Ԯ8TC9SG?Ǐ??;{
    `sHATP3;jX΅ٚgeoؽ
    ^/aȫn.PC|{qc!ϦU*D)X\mJds3EGKXްkjR)}T?\u:~U3$57l"
    @%~n[H2~;F
    TW�O=~{kKTcrڻ֗:P0>S7<jq–M �*=>c5\7l.S
    
    ܇u0;EM
    lC[%42pc-g{09ԓ_۩uwqݪ=a[:YA2�hMȏ~}~c
    |sa-&׻1,7Ri'
    [#'I�&4epgp$&%Ar
    (N0)HMx@Q̆m𠗄Q.Bɂ?UDFvj5j/>@v787*!)oڂM`
    CBoeDƦѬW26g(00@>�(<5n,,^ 5dpYg!׿V5؟:7)rTx"hx3H�>,	ʇ'?7"ow'cں~_I!51Wo	OXZŖTlc	%o_-4B_Y@#J!CMu{`KFF @";H6|S)gZ[8ko�čs<oP
    wP*Ǐ4Al@H+@2(!t
    p1ԯOJi8,$QGS
    9rͅ^J�–RCb<4܇ak~(o\=a##4xr5}8(G鬞t-]y^$HjJa"ةH&l˂7`�
    %潂?E72D=""ogЏġḅ-yIMIt$a$o`\In^s{
    !7<G{u0T)/S.fF~Ci r}yQ뒸2e҂&5BGDʯ&c/2ULlBCoțhoVΎF7PRzxY2&p/}2)pyyJnabv1[nḃ
    Ge,O~+A5t5%z~p74۪x7Zw+=رߐ۟/t}3B!S>E\A(FQ=œQ7E`�Fv{5I/%UA',xC boK!5QX1,Ru`۬WU?J?Qt%/TM xܜҢ=7V}$6p
    0VkJLt4A9sc_v/3odJ�f.A:\cZLK}>';=\r'X
    K(, 3DGۥEc)E軬-¬+d CaZ#ea.o^np`L|:BKf<ڀ^Gc,$ڋ&t5%z,op?0А?X칌5xy,FdN?Ht`Mү4vN>M=>(~^$<̕(t/o(X
    <[9|KUL~h?5^*/';AVs
     F�4~Jٚ1ƻm\p-/WQU!4�fP!ˡq!{DbQLp&C*!u)z@}
    1ۑ$ɇyЂ�]	LBYx,o`_RV_(-2P&Z=6*!2ܧG@S
    7<OR:Ӣ-uoy%,&*5иx5|xz+tZԴEV8d&m}K58Ew"\sҸxù>ͦnI-jڢj+o 
    JKh\l.xz+tZԴEV8d~rz[{':~GxC0Cfo0~c!`Z7ha4sC0o0`!`Z7h:@C0Cfo0`!`Z_~"K?K~o?QuVR5Ekf"LpԞ^OSF(Uss^/!`|L7<scMp_G	T=6α74j!
    3qw{@i@o+<&8|LW#VrJ3EN%	*\Q|T7U)M`s#mFs=er0tϊ\9f@ҥ.Xb+_긕)6K	28aNuu 8*E<WCcN)Nȯms:=h!`o RWտbk:RK+iMӗ$Y`e8K?}4xJtSs^IHTLnNCH\7BYo~=DfeojHz^z%{yC) w.hRL.Ӓ[Si!@X7*g7re:jMGz~XŞNM؆]L7$!`7YחwJ@CeIT
    q["7o(AhRЮ:ԏQBB=2]lƪ!`.|I5)qqLXTEG@͹�oKnSfu5-936f`դ%5,!7&ckW$kju5W.q4¦!`Z6X^oMY"o37gA}VHz]\sѷqb\'kaZ!`@
    &&`!`
    C0C@-Rf!`!DxC0C"`AT!`!p{7
    a\=*?iw|qط{$A+z՘GHϚ+{UFԤTX9ڇ
    cCmh>\fy,(J?>6jcZiåFӸ\y)PFu^l#7LɄ+h2CcM{%y}+bR2 +a"p5PnbMnҦAQWIdX/UΠ;J+OM."Q=杤phQfCA/ɢܕif3U%sI$y6fbP}pWHXWPq$rx Ht9ohv+#ɺy*#ö́$*}zTZim*&
    FՀ)@%ao#JiaIC,h[
    x\Ow&#8zXJXLDGr&Dr^}+[~RTٟIJ~)eTr{AI>eic{|5 =*F	yfn5'FE7sȈi(`͋dX^ش pgXc%o)e2[(�j!z6gW'#@Qkh&:ץ~.
    },o8fS0Ty
    UrJޒ~e#:EփX
    ueIwWF(q;.
    %O	ES87Bq~e
    R8Pǚ
    ]5	0x&<CoE$F*fybUb(j"=ܮxocǺr_B o{ܕ7<וO
    j#ض?;S=t/σ"vGQ\+
    D+j)TBwSQVT_z?2b51+O#ӄ&DD	]6O
    =Jz	/D\TⰞz3q~oJ\_i	@j|c,38
    3rXi3"T"`qJ/Fv^J4wox&ohnc'*AFXz~5|ZHLnᙼLO\!`o0`!`Zg!`Ov30C00ЇI!`
    f!`!Ї>L0Co7
    C0>7e҆!`GFxGn!`!`/6C0>2>vC0C
    }x!`!0o!`}-s	Z}����IENDB`�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/manual/images/chapters/layouts/htmlLayout0.gif�������0000644�0001750�0001750�00000023161�11377016712�032241� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a������Yn՝梮誵굾@@ttꪪ������������������������������������������������������������������������������������!��#�,������@@,Ȥrl:Ч0JZӫz.xL.1znB{Nl9ߏ~gqw[NLqvRf{JMUUh}nJG
    J
    KhIMd%q�ʶ5	G�8<k@lDm."D";ydfQA&qeR<H4N|\YiaK&0'D=,r5ظ*tȠpPA3Q-Bʖ9k	_
    P˖ۿ:l^T:q)l6NJp)*b&GDzeמ1oVsh"_n8Tb((@@ċT g6Œ9j[΀nu#Ÿ9_|L[|@᳕T�1O|a|СvtW^ȶtV7N4_{ŷw�"}x�L"reHDۨ8e4p@@ �1`' xEtb(`fصCLod�>YŜC$vweAd-ft�^egN$#D(gc
    �t
    ZD8%1
    fay%o�BtRh*SqQH
    ]:)!DQ|D]鸑[NCFB`z)Il� GEZ)Ҹ]Z{c~ĐCSbԛ,dXdԊC-Uv 50],'kѢ\xrn5:
    D.72#W44f 7hsFFq6ωHGȼ͵pX4i24ıɵB
    p\V+g3D܁ǖX}Qϼu'Qtwޚa!H[E:1e.ښܜMC4%z@K{>	6(ﻯʹ*oNz"-#[YEi|@q7^!<]S^󼔝_/?WN߾?ڻH )#rd
    ?9PW)>
    D)"QIpAmɃ6J
    ).BΎtz @3<cƣ܇0Hcn"4mGiLi^$pqE4`QD!u&60/HSGT"d#NXSq€""N!y\h
    #$"c
     &GH@ B~kOr	�"0<Ed&k']ÒFԃZ*5O4I_ÎXNh2N>CM6HP"Ǹ5yGrBo�5HEzg1gN>sdU=}ڳ64;5P*}?QP?$t@PZTE0! peD
    :@#B?SjK^d,ELDd>Ǩ$K	H;-K6TΔE5jPOqԥBmN_`₪QXVVz`
    XJVbhMk+Ϫֶp*[J׺b+^׾5]`[6=bkV0kb#K
    6,`YN-gCKZƎMm40Оm-l9+5mdY[f+⮕MiH��@|%nsݰ:5vht%s:Z׻Eozj޴N~mXV5,oKVl^809X`Wuoe3W~C֕Ep,	SP1a;_fCqfm\bx<F+I;#pn հ,XU[,W&>2Lb"3_nb{x4pt٬/[e2WK纙 -,hiq?7΀.	`.t9,g8Wҍ0<?Н0w"h}3-iAyΰvrCMi4[ƳskZZyF
    -NvifҧdGGqymOxv홗\nW*܈.Y}'xFoNWf}q[0-pL#춸>m?׽gVֶǩpڻPxl~	`|:4/n&qNq;!r3_6?ɏ+;4_}}=NGnt/É[I<vxwz/Nx~>-|c6t[O}u
    Wm:xkSo7<7|×Qy_u;qo>?s:ߴo~UO?SOg`w_tbv{	8Xx6myU('Y\nՀhm u9FBf%_%.{3([0XՂ8zu ;fAxrE6|փ2h&DŽu!R8TXVxXZ\؅\(^b8TdxhjRhlprn8vxxlz؇~urXxxq|HX_(sx艠8X(؊pXȉ8؋ZXvxU\ƨh�6Ee(VTy؅娍hhtWHxHȉxɍIxXʘ\x]Yy8X8ii&S8~aX*y츆2	g+:).	️(QXIA0)hC?ɔyXX(xؔXJZ	fsr(GqbyixY7Ie)Ij	c^ȓ9Uِahjiٖmid9YyO)ii)Y	)c雼I9]ٙHcȝnI(ŘiݙYɞԙȹ~}9i)Iٚ	޹YI
    y٩Ɉyi	YY
    *&,ʒI	ْY2!Jxe9.*8ᩣJ\4ڛV;z҉
    ^jJjEJ)ky왟R
    \Fj[	q_}ؤl'Y*.)dڞ-:a:g*VړWYuzXIxyڍf*y]
    ?zFsq骧J*9<ڬj:ω::@ɪ:jʟSJ|ﺧڮ:Iiw꣔ڭ*"[{	ˊsG:ۉ[{{"*$�+['K-&XN.N8~9b8ELh׳>tE[YB{H+K&HeŴ>T˵T˂^b/d^f{uZ(XTVY[]W'juh+|_xlɗc,{u^{{[eHa;iYduv7eWgrtzlZxpnǺVr~;0׷fGse[wvxB_Ee+x`e_ոcīV[sWusW;hz+u&~WΛw{<f|GlG}ycyWjj~Ka[ګ^tg}Wm7g۽&kmGekbɫWx6{rpx3'xsgzk7mjkìǻ&ll2ՂKo(,rC@wRy?vL\z}tp:+6̋,pGwz,+Vo+wuQLsL:Ş/ƥÇl8@i\t;w;Čqr}Ǽuģ|zm7Īq'iǑZyw{GlɢȬruFf\pL%fL)Wln|ʶs%Luy|+<Ėˋy'~vLkw,vm$~D||5,YYs;wKn+ŽD~Ͼm[ӗpss;}c|}8pY,ogk	]QFS{~	ܵX[3
    E[vJcMɜB}<GƵW{u;=53HSj{^]Zca}gi][>meݾkMqsu1{+2{]y  )؍x'K؀m)}m-=B،]ٌٖ-ٟ]]=-ڙ*#鯅M
    zZl(d(|)Es
    
    |[Hm
    ڮ	|~/ږ=٪٣hܔt>ュXʤ
    ݞ	Zze
    5ޥ.ঙ=M
    �Jhި>i(
    9zϚDʯ
    Yݼ!]9驝%N:>y>^ͺ#
    P
    >`nٜ)řAN N͒'JΫ:ٜz&>L~|n	by
    ޕ=)ޙ9~犾G>i	.n矮)nlO~e(fp.¾^N5(I1~E*U+ꨁN_.\N~3~îNNʎݦ
    Mޢ%)>9)^澎R.	ZvnE^ez&z2!od~?O~'2gΪέkjoND­=Lo~mbiE?JlɠFn==
    tȎB}Mv?z/}{
    )M熨ݲO___/٭?C<ײߴ`]`{Vrϸo2=h_ttM̟/?M8JKR}[ye L˷mՂ˹˸ӛP!@X$âryLˀH$^Y
     zF3%t5q^ék}�	,&$!07EGI49KWQY=_ߜ,3?q]eAlGCw{Ub3ƠjGhӦ*+lٻӷ0ѡӱ9ߗ&uSꔳ_!?vHq5~Dž|x/1*<1ʇ,ay0X$0e$-U	:jJfReFl̥.z>S)xRtOL2u*`ԷdEvolU+sY(ۻvgYثAmM{+rd|oN]zqkY[tQʢʙؗ%]Mַj۫5sp>}sTug*p?^'lލG
    iQ=~߃o}Чm;
    dhh!B&Ǟ(WH2$*=uRB
    DFFEqLе\<,$OA)[aJ@D*+Y'$oBJ"f!L6	p;[
    =PP4
    OMTLG,;tF54MO==%QI-SQMUUYmW]YiTYmU]yT\}
    Va
    bMVe}gUhkMlvm
    W\n\[=7VmtݍW\xU˽^z
    ~aw
    }Y⋑T/0fbTq%(dC8d@UeY6
    JR_.9fm5dfVG-H~BZWT6b:UdG>kqA(yT4`lG@	H
    .	6u	0hf9UI%jUuz;f\_ɋVV/wz\;lvO[I@H/uSAV롏~\Ϝj|w^79oڻEteOzR+R=Ggo<UAU~y}uso~VpC\r¯v5)k|[Lo&>	0hcX9Emc_QP�Mh	~5hBy0K\H0=i8φ$O ;b�p�SYU3ӭe;^Eڹp[˨;
    vml4WCЍ(ܠyPhܝOBDcXB~,u1M}\Vu額f۫ިJY	L/e$5>r򐊴!pGKRL7A9*kp/G[&3�d&(5'Q<08_%ddbSRo�T&Ͽr#6hr�-)vn|Bg9ЂΟT8р±B#*A
    y'!iQS_Ge23UXWӛ42}5Re.2*yIBr&8JlӨ\E'ЫfUUD1Ӫ%I
    MRbn#u{$@׵uTr:כu=*AJG-	Ka՟k\C9
    q*5-ҌF6"\BZVqfն&{Her7ԝm:=wt(qoEFVP,#9B
    ##JR>lF]޲BlI:3uCMn[۱ԵMm>q=51F`hU:"X0{.{"Uuq`/83nm8Ǵq'
    Xȅ؏"x>Ee)OU򕱜e-o]f1e6ќf5mvg9wsg=}hAZu&hE/эv!MhCGҕ1iMoQtAjQԥ6u?}jUխvaj6ʴnlk2$�2,HоlFV6v)K{e6{
    fjGyme3g7f7Lg[U~LosF3ym_c[v	66+Tpa3	.e`CBpZشv3#O'{n/sB϶)Z_CEtc</xȥs[;:ǝmW<Z7Ƌs]�9}q>o}|iw~_߽<l}{v|#/G}IoW%o5w۞걏?M>ۉ|^{c>:Yz?:֟{S>/oZoo�c-
    hx/^t.N@:g�3;N`D\'cnpt߸Ғ犰	Mm	
    	U
    xӺpp߰0ɰlp
    ٰ
    P
    0p!0Uq	QM7-41(pomOOxP161/xXP
    Mn>qBeQ0qnv1tq/ornxpKXp^P`Upn1Qq19Ӭp뢯RP�a/oPQ!p !rL<qWq϶,o%.#W"g1 1Z?pr2]52$GR'Y}Qg2+(%w2$/
    
    &Ֆ+c,J,u/+R%0r,}+r26"9&SQ{28/r233u& I3 4&# r3)'3*2#.R*	8=0Gn81eR8.3ё99:NrQs93<us(x-57$M2s33>`Q?7(	4405mAl@t4B)BpB-4C5
    1tC=CCAtDIDQ4EDUE]
    E>-5qFZm-֭FqT	9EӐEUv-t.S('cJ%H,F426m#22B_TK%%F NM,TjP1u3"3THIشM30AI/I<?\Y6!NST�S17P
    WxUt/=Q;tSSN5fJvN9.�Z&U0[r :YԴEUS=3]t=]^1m؎_m[!bS_[a$u1X^YYL5b67U+;`?v72`0ne!5eKQL.^Utcga=Kafh5Odo3V:fA`b4_{iI"Yrrs;S55*3S4羖]eM0:1QY1;ms0=
    kRto;m;Q9#UoV<VR-q*߶�6[PVcזD5|VFtShtS\?UfDYutjsww~wDosx%4t7yԆwyy
    ��;���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/manual/images/chapters/filters/����������������������0000755�0001750�0001750�00000000000�12203357067�027275� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/manual/images/chapters/filters/filterChain.gif�������0000644�0001750�0001750�00000002312�11377016712�032212� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89aE������!���,����E��ڋ޼H扦9/|
    MahLR|LiJЪu PtMpnKa}޽jק(xEHb&YIXEi)9ӹY&
    Zjzi*;8I:k{ˑh1Ll|TlǬZ,w
    =!W
    D-lO>Ͼ^oZڽB�_%@6KJz!nb2d8MƋBs'y!9"",UJ]}œssI
    1ҋuH&pf	Wl4-E>K昶o[][KUÆS&F)߬9qJ՚=oƑAWu״ڐ*t*_kg6}Z4۰`l=m87gwٝOr^t=Sֶ{{<Jee>>GzҳUK|1d8b`v-VbRpP4Ik4{*VZ~T :\̘k6 g?Fwc)"."C�`^X-đ%%`AMI%"vfg9 X[G.iU n&6dhgyX`J敒if9	b'B
    Fi	b'*f X3$B&u
    xkI<7@":r	gӮTc6bcz{C9ˮϵﺽ+Z2Q˿;)ǡRv@[f&;nԺmMe})3[)<=̱zkQS|$,ͼ͌=”TcҞthO1RtNU9$#b-iH~&7]s/j;+;m0f*ĺ-WGuWw,ZY8fG;x䞛MNiVN,|380Q6*HJ7M~>RsN"n{¿qh?Ha|B_2o}~O~柏~~Oߏ�
    p,*plX��;����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/manual/images/chapters/filters/countingFilter.png����0000644�0001750�0001750�00000256476�11473454232�033023� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR��V�����=���sRGB����gAMA��a���	pHYs��t��tfx��IDATx^]`E	FمCQO"**HDNzr,+16߳"F
    9EO1lg('MٝoKHycݙy7f&m?~w֬Yx`F`F`FG)'4m{oH{cVu>i�Ç__|3@,\+I!o
    ADjH)TL%R#NT!>==
    1YUrtz>1gq:RՀ4Õ)<`abQA
    [Oа~=4hNT$#|ҤɨdVJ']eggޚ瞇9$+G஻ù;6m	;K f(iihg:Vu84JvlqJ?sSK<=h!-9#X/^P<y:E_e/~Ļ!\^mD>zfa$/,mX[Qe>"8*"yc2%> /j[կsoPx۪qMfvF7|_qFrg8S9ҪH˘]#Gъgו䬮{
    YuNi}ʫr'&Öm;02Jણď0H
    'ҷaV[/,ҽ{;ƍ\\sl.ZԬ3j[_(].Rl!!|@(t[2^/!k=>z(|Xa+4hPyeKp#/*HYƍ<ov6رI4TArjID!>!=dbݘ".R~Kw0Vzrl}(OrusӇuM4@3%!O"&*G%WRu|2Un\,}e;d*Yfƕ_o$2&&/ns^骺HHG
    
    dK?3oP)#Y\(_Tl+3/c"!c_M_2_X+~XUOn2޴wǨc@c^#JWcхr&e(EƆLFbL5LQA\X
    ;AF	쑓-&8}0hKRr:b2ʑv]|.{0�];1N(�B]K^rIA)
    œ._P.tz`}EnXr48)EXDm~ꭢwnaV”H.Y!E$0NMz([RP_һEyS=ฎ魁]qפ™߯V(,T9tַ.CUdzaai8rci`ΧzlzÁ1=} ^z\OzkDӆ'7s3$,O0,4Afzy:OCyzatڰtHZ<[nrY5Mq[ya2+=uϥvQZwz]eT:+c})i;zg;)=&Ԅ7`	*252'` Dʼ[kEIgOɴW"ѼWu;SwJ-'ĪtN1_$%H,akHJ09!&	$4lI2ILEKr(LyeRMRJz#!s!K.!W_O28q]]/.n	?X'R#.J!a&xG	a>V|
    WD<ɵc!qNp]Wuvc-}j +ŗ<euF6I?DE&:U\"]FnvQO2=ctOMԗ)3b6_{5*\ig(K5B>QoF-6[p+4Ƌӄ@iqL>GByͅ'
    '-dR)Ro>,z
    8'`ȐNW@8/:ҹ5n_~*\[
    $7@q)!DyiW@|񿉺]҄jj(iޔNޣm\3fZAW@hnEo?0eu:2h"X{B<
    
    X&1:JKTyr&*0_<t]�Be>} "ʎGF=2GhYrs1F=r&H`lu=]{Ɍ\Nۏx'+&.1mt:r4ۮkf=q\ce#-MpٛQNՍ\y!#`н@Fe`vS9+Md\}JY&2:Ÿ`	u<XMz1HsTK<޴U-RRèuM'
    C<̀,4]/¹ulW~&ᅫou07s$_D>Wxq8}K$TRq}͊C55"j	q<;w~"	-]vşOkHj D<'L"w@xI E<iH s}˟PQ)T*3|q!Nsf΂TqAqWDϕ6*(2@eX|ʓ14HN}%hgzD'ĢYONM:=15H+8*byT,,$	e4ri:x0uP}-JgABCWGyذYGy
    8}gG(h=)S@b5V,[ô'G64M#u7G{>/\x(XɇDJZbJ	>rcG?yօ:O{Eٞ_;ߴ[W*ISm-yN]Jt\3b<'qĊ
    ߽GwQs$V7:Q2ң҈x7?BA$H%)U$Q69XGSDtt
    pZWUPp$qFjp/JDH	H*5	UǨA(�Pжqmu7Dmg9٥YJ{霔H=JdԝGD"mCRcz,:DTrXj|aq)y#xXYRؿ,w:,1Ѕ{yOv~-C{P�+bR\&igB-VHտcn'ꎱxCX7{Oxan5>+uk\=&ZY[KNo߂\tXsOrY4sIV,f
    bGHEI+'lZ~Z{ҷA{~-B
    $@+k*+%o%JF?r7%?KΥ0/Ѻ*bĥ8D<-Dx<}N�H4/!yhr
    F6#-`Ϣ�QƯ(yӄc.Rx'2t'V7drί!n?gRZ̻+uŜĠTX4ExAνu@5y͋``E,FqcPvY;u-פeD귵8VƎ/;nrcַ{K/n'yVmZVV,YGHދ?lWo%WBGV4iF(C[r&Vt.n͎׎/XX:͏}Ta_ذ	4]'M&"-t^iu/&zB<"uf':;q/W(
    ?&"2	Z9q�19Ɉ}	JAы
    D?<Q)evPa&Wyϣch;h+&V#xaկ,XGJ69&*G$:72LdYQqq`	=xC4\ZE*X]5z&VZ
    ~"i
    fJv,$Vk2;(P>7&V"z_\#Vre
    ڮ45\yK#UAd➑Y/pTVWlu0bDLҴlT;$WDפMzh{kBu$FleDLQ%G|0p''
    ɛCw_J_)PV=<y(h}qګx.Khy_ɜ}/Ԃ>P?'¨{<a}?Gw9|YϠ|k]׏W\=t5q'CIvKS>Jc#ֹzZ#wzRUl1pr>:=~pXF,+$bdZv둨1Kf!b'ȝ}EZ$MWV7C%XwEY>\?1x|VӋx]i8z̍p[@Q)'+qjI6weFN'nQI[,(.+(KivkB!RN\}Os"WS ھ[&]Še-?!i[$*,zboF='
    ؈|Fr\AǫXQY$vKjr*"~IqEB=I|~S?T}QGA]r�c
    H|M})G
    j*/n]qv4W)>D~iظuדͱk߰ =d6TgKsO#/h~
    ;YX="I8ƱxHBaq7հ&,>}*~|$.+ac$&!I9(e,^*,7c)=攥ɃʱH&BaS)h.7oKBKuq2|'DC9A'EcE?LUIǦMQ\.|BwY9nD;Qm*l5~o2trfي)8o@+w9ʼn4m�OxϮ#ʦfr[L_J[y+"PCҟ>%XV+"e?c|Am%o)R(Rg^uDNb~3q<|9&2+dϯ	3OW1qs_?ʬ꓎Wɑ_|95*ԅ"Hq%#Q%8=#Ppߗ6X{f0�$&r͏X٦p~Ab|U@GQЊ%,9OCFbez!֡gk}m'?<kwHg	k&5#|qIKi'Xn9Fc@$j�۶muxź
    a=
    &XfkGJg
    dlolLqf^E9Zݲul۾o!535:t,o>](Zعi#l/2lo[~	"6c<GOWXiy
    qukiJ[TSܭoU]t_`Z/Jd˲WܵI()(Uص`oZAP~9YO0Y|OD>¾;
    W5Z7:l@ƫtcІL\"P_Blz<$N$KSo8A-egײI-/4!K/TfO<D;S:+VBj6M*\9V;E
    m
    c)US5C<_euxjEea5C$_ph,Xc?C/~=~Gu:6q:7%?l`DB|^a45w6
    7|>
    \XvO<W~?#AӇm[),5d'm\`<BWd5Ǽ"oï.ga |֟@ytΊiird^߱GaE׻;dt6RPۊI%%]wG"3^D+sNaZua)K&XnY
    	EvY		HL$a6qLDK"kkD(l@kz
    h%I*iN&{@ۺDׄVZs7A"c+$@	Rd3FbB$;!r XDt\ޫe[6T<9B0."V;6{%f:}ILJ&J/RE&]}bLK߁ESˏ,u?JqrF=()^*ۊoQ-PfX5̽|/hW~i=lV86ʬjx`_5K_q܎ly֒[Xvp*ptks;YKCwWl380zq
    qs'{ףcz8.Qum}Tkg>kzI,P$?FBUav+X|ipmf-ŏae=q:e9Z&F9ދ@5{[O(	=a~tt~#/
    2o>]8ZF"4{#[%sGi+M@־w~dFˏ#&\T?A~r7'O\/Ey_1
    	!/3^|qdN(!m ɥe5N)k޽~[2(XN2KN܋^[(?sP16h,=LZ!ʴ6u9|X#I,k83=jȡөq)k=>qGڝh�Ю}opC-i\kNq7]Co."(\__`jtt]nQr~<$tAtJKkvrs5)ʹV(}_xHb1�=
    Ͳu~nK RÎ=L˕r9ۊv;Ac}:;
    J/{GT~;lnF,7}7rmXm7Exp|/<*E@K^ii/j┞ޤeka�}/:qx>?`Fie6ՎS`^Р'�- 	eܛq~dTa`^*X";O6X
    {7,D8gq=~+_l	pY
    HS�[y%leA	{6FhyXd$3>&$a9\ռV+�*^o,2n>mhF	{	hg*N&a|a%	A%0"䣫kM%{7L;n--XTTʲ[Ycץ]M|('ӺrSorzE94U*?]xWa:>us;ex<sy%6aJ/b%\=d	hLbg69>mT\i6V<jgL:]+.,S
    y*?x{PoH_/lCDTIr&N@dt
    l'Zv 	2z^\(6jciƱs~~ia[6qot!$7Bz2KaFi4D_AaXpl/F]
    ۠
    Gh%Q(|oEy\ɵ 
    ]g˿-UxKuj8@'&=	Edm
    B"-VphC")H
    )`(p[txzD;{C`+\4bHnu<Ĉ;:
    C"X3o%F.*x'ϖ(1%rU>\#^3eS/>VLGR2p~f!w3lQ?.2;*IGW떋KσR2e:q8[,7ѧteԯn;,]-m+-Z3=p쟠j7ylFT/U}`�<9y�zcQϡ)
    ~h)kCBW,^i((Rb}=Qqx4*z,L.F@,E?as,	{/׈/h=O-Uxcz}t�n˅(>)v98k"_?RlFj4At*xVpͻ>/KB_K&k޽2jmӫO,ڣW56}~)*w4xB搹]W<•D!\r\Ə=
    _AbYŒ6pZǖC1u*]#@vv-_B֡h=SC'cS.%wFyT._Rku9UZ5{kв<	0Τ>11oNO#X>]oq+<!Lt>pMVnKqotCߛxo~xo
    '0cx9|7
    c`_3;~P?XMi}ѳE
    WXViX5$0t&֮(U$2hS ,*ҽAzW~^_MQ4[Mw/ҺSorEU5c]5㥰5ˠS(C/H+w^:ZM֮k0wwN
    q�$-~?<.s̷f0.1Q'iE龂#cp= ]w{y
    ξxu
    y6u+s^oqBwVr[dm5
    _t.~ҥ`)ع.~}b>Hӛ-xMH"G�KUo3~^	~FbhuM>#fd3K6U(#v2pg̸JDz#!v' o0ógOnu)wd%~WZ]I.C:R⏽}$|cpE10q[xoOVH,T]	^OE<:8֙S{ԩ@t[Cpp.uҖCտggf#࠺|
    
    Z3g[k[=uHu9v]aڌy<E#.
    4v_deA賍6OE}9~2k~[X7د||>xq[?x\eeŶ?pޢW$ʦsr/[+e:?Uؿ,LAw;QD>2y~^%clOޣ~t7j>G09h_
    N:a]Ʈ
    >Ogob~%QSyxl[a?_1%$A'ﮖU1Ú90w|�;*N�qu|4pϿ[cPVN(v)|<f,ZXIaX1'ĭ|`U67K-hr54aK�O.F0,~Θq!Iu2ȪHzO1jxy~$;հR揫Ovr|tጷ.qBsw<_y
    AԹ0~/~o>7`Y'wfAbOyp°\8a({
    _gg}WgBSyL$QGmu<]ç"n zLZm;''cy_`i8_wo4oK|	(XjOJ7/^&W}Iea[D7G[:xi}A1J~:3`$p/-[;ѐO9
    KX(cKvy,.fX"D(:nٲ*I,$FF\ս$g=f7Cg}Z r+k{h31pTnnnU_IXĚXgD1dvՄ]SݰC+L2?I+:@sab<Y ,?\/<7SA̼$QfC:OBF#gëjJ덽7.cYNG@_⏀s^B6=˺z}0*v?](оz.>h$:8Ι찎"
    q~iZ|hty+(<,,	H^+(
    ׹4~;s9=qكoxFP5V8*v7z#5Y-’/au8Rs^##=QN^L:u+ґ|9�o|+Bog^#;vzJ63I|-{<s_nY8ɾ&ES>tL=:pyґW7,cuVwќcLWH"�Id�I绦A_79P7Ҵ:飼8u&pYxlir/7$yX"Zw6o#ey5V2rDp,w		ٙ*٨Rkmqv41GCǾimqv4Ǎۆǚp	]H@:AAp+pjOxI=qt+9X*UCRqZ"i٭�w|Ow
    ',e:$U>Dy?+K,gwz:q,RV>Y巆N`,rBC&EyOQT߂qJu`	U/ w24'dp-:0im	oUS|qIrVG߰ߦ`٦Pc`?e	`ر}]v~iDd݄Kaƀ7Q\!F'dm~
    ㈷B~I2߾UJw?=+ ;cCbVW'QT'(Y}'M;hn|w{/Iݛ^MjʒD>~MORd
    dnB@4E<W]+2o޼*4.^nj}žfݖdυ^k_kR"2VCAW6!A{
    qFZ-vב|ڠ5Ո%5S_w+CDb%Bkv#b5[p9"\w	0ӏL>nxv˳o4Na'3]$0QpO_AV:{-IdȟEMYPȆj|tLɭ&*}w$쁅K%7XE䮓|c1$b/^q6>Ս/r[݇Z[w
    8@6?Εz]Εje<<Zx4jȿ8i舃˟֐<r,X_^FIw1&Y9yP2Jw5"ˊ^[,Z@"*AJ[
    V}̯,?e"	8uI#5býf.auiUݬ9='˗;Fiqqcmbk*+Y0.Nw{ VzAJydwttEJ"'wܲ"A2Q[M3ʪDDxK_ś	WZ8#uoѽ_v=Q>֔L@rgcp:>+!#sX~E6rgR@
    #L7,Ncfz e8UrYsM
    hذ+X\E뚒w9+BLtlm8ƩS+vlUv6]u+o8]	p?DȚuBk_A4!m„Q`Ck˄HgHg3U~Qls,
    \0&/	G|
    g#ɺ=k~1~D6\4h+ZkW};x44b`i?hэbwu>N	~lGCU :3nEy:phfogzoFw[-{P?&XV,{T sXx|! 6*Bv#->u/~ӡHLXYu,+\F<MiYh#+Ho[@.YoQ&8!q&
     QC
    !
    C&z#<oכ�4~7je_ btם,R#F~>@隻>d<3Pv1ҩ/4 az6~!(p#l9ԦiާZt;x4k\nĐT}$SƝ9fvqUO˕K{~8z<nW`F60t9m	Y΅իE n_Áo)T^LynƊh!4|@Wc\V<SxHk<=a	H.ME]5$wԢ/nYrڥX)
    ,=dX"ZĬ&#p#BpQV#X)NVb,4p/>C\O2NDE_EUf$<E{0
    R$SǠ;pOBuKG1Ϥ;,FW~#w@rLqs&nNPBi2Vq
    oJ29L]1U{_ꯙdVDW'Tu#.gς04"_ڃLtɮGCU7R4pd9jq8/K_ʷҵ<BЄ4>'⧹H$Gu]Et]Ib~'SNnܥzG7<q^1_mKDR7Ұt$8ص@}[P DӑaչuG)D"=;(KDk=tz{Qh^HD'^`/$)0I|±6xփiקJI_1mO5:P:ߴ[gs=oZbQ)εasZiEL+ǪTPb)�ižinKZ+}7t9QϿ,cORfŐ#BӼ%mY:N>:
    =\L~v?e-R([U}lj9Tտe}hPnvp�E(ի	k~>?-u} ;6$Ez$\Х_@'TWj
    j#n6_#%({8KWǰ
    ntBVr (~ҍwѪ
    #t# ^7ߪ\n4G&NrJ:f?ظ;oB\(E
    އed3TT\:VHJHY宓/Fzak~b"[/.ho>A>U\j3sL2tqm
    >[z!fҢW,Cĉ]t/q^;ՄV625^9QozsȝBBE(/u2o#W/ɴ3_wy*5jvùK%+$}(suv\U`b Akph{rrbe_VL9V­8#g"?s}f(\]yӚø{C\@˓FbY,.~BZ<_^EڲL-ˍ>fdMkWXn[%_4k#Kg=LײG!!#?ZAX
    "T
    O1)HrkW+sHjI+m%3Ӡ\jo_|xqӳnzcJR*={UOim	_e[YԊnfIK[g'3u7L-hDhP-/XYq@]^L8Kx]K?T.s3>LW_y:,3V"WNW}.S.&<q'8.C=tiH#>
    Bx셄
    {PooWSд)HiSmh:.uTjlF;pV"M=-CT@:5z߻)Sh@2T6kH!#I}x$ DkS&ʇKZtp=EDW?i)y}(s?3X+hv^;pr#o7
    h7@{E3Z*Vq/
    ]L}Q@Swz$g�kTNT+Q9f^^b']UYp.oZ't9=qo+!jMc\%^!Q
    f=.aN!7cD>^RtVY~j8rc@(	;h.kp&𐇚8iE?"h?n#vFsjh5$h摯c|SG+t%ˀn|>(tK4[V	26fO1ZKX=exkGKcynV.ύ4!p`1.]h9^UӖ KwlSeGQ%GKo]<W�1ku?1W'W~LDe Qrj;qWku;o1ط}?\9G'Gsx:FEbOZ$#IGOb³Q6zS5eVE^.F+҂݅iχ1Vj@tjFqzKA&ιR:$kTJkR/z{ޯV-p4R"y[͇3,'2Gh$)R-6X\W[=K+NTeobnBϦp,w.LԾfqሩ][6@w9P^c#kgyyV1g*NΜJNbcE}Y(?}p	Vσ87+~p4E[O
    >P1sED
    RMu0<'.L9{UL6GsĤ�ObN?8To}I*/J<eNd)QV̛?n"Ǣ?aee6h(F6l$N7t0}F2Nˢx
    
    ߠW-fxշuкB'ҍd\^:sEG_S]]�oLM!"(a3<@$	L=$'.2hAÀ2<2(GyTBQ}ҕߺ
    75i75Y:2f ݏh'w>[#"PZCyu YΛFᦸRފkMQDFH,~<EW7էX/>ʶ"yDo%1.7>i
    Nn9[^8)\[ZFGo{z^,֥9dc8ugl/{$\Qٰ?^ۿc羕)>8+oA(a<ŇKqei^^h9pR[nntntz^븪M9_.btjydn<tXrD?YMGi jF:}6'@sr	-C:zjcu
    p
    o
    *ߒ+%t99F式GǵN4N4u#AWZ,B,ˮ©$-O{W•̺Ű=DhL6J1_lc/7]]8.^r}g72]֮!f+Vu}y"x,/+X@yCr:)pbh}fc:,EwG'~vR}�h݋wD%҅/[yf.`DL̑´njzI;C'9XXi|:zM}U.~
    Ny=zIux*sk]n{3e-糗,2ʨ":s蠖[�Ȳ/pU?
    ]แy/�z\z%h•˭su&tQq0Twsұ0R:KperW=yf	e<Ǵzs9:.7~A
    Rhғj .~Ys}n4ˎ&>GĐ>?C-r
    zȧh?ϢGYKwGBt_ô-O.=g֏s0S|Vpc_>C0
    nxxP'
    yhބ*^: G|_sp>3o~<
    }3/(.|6%[
    OW<}4Gc|cI%|J=}-
    #iY,zo6=a\,:[k?=R'<珸ei$M$8f] JձŭDf_$Y{Ƃ‚n\"m|@"`_Eh&iңaЀדdЁ~7"n0-F7C&UE<Fue`}Fk$!@#4FPýFb"]otJC$[tJ�ȰσeLC7DSFCSۿuHV(OC/7sI؞mCG'[{7Ӳ:|gb9[pk>o"ãTwZobsM`=O7xrBLN9B?cruciyp&J1Rf*"0X=b{qW_DQT# ws'�@ؽ#σڽi8IJuXz=V~ljہ[Ą#(_h~~%'
    AihƱOh~}]PlRe)<Sbivҙr)d>MC?aS4s;IίM)32Ff|{&n}tZ〺LTyOjKv}#daZ<y2rpXq^Zpouz(='+6t~=uї=O:#jR;,JK2]=ݾxq(1"GwbLs\wYWD`XR,Xx($]*oJOD!]0�_@i#EI71fga5p2;ҝˬ-nX<"Ǟ[uK?Z:$aJI%$W2�ljw?LR(#ܫ,yy|.辊5	=@GEO^$u}0MD�#XaD֢G*j֛Г͸gڣȎ(bOd7K+"IEH#M_e+tD"ʑ
    ;|dEШ~:zg6|8U_U4$?a0F5"`<TEiBbL/&zCGH?Gw%6\Ё"R>M˥їe6h<?&<;JcH V]ճ3߸	_9>
    Jy�Έ>pBf{KFK
    |[5s>LHUhE_rG~Jeh&J:J^Wv~(OjMD%\{UHwRH}"NiΩ"=;G@QhړS\\baܫo11je{+ngAs8Dl)3R^O8TXGRxmOBWB=4&;6wc0ZiT~IpnYf"%qV&Q-Gy>Ka,"Jbe*&q_J!WIv$J<WbŰ퍖4F5\egQ["t".+\
    5@`IJ“sJ}`޸ueЇXo$W׿
    eZꘂ֗KK+jr%ʤ|,{м{'
    F#݇y%6Vm*H?..QJl;wy<z=$ϫDpzFv$FP?ltzav5at~E%~(Jˈ  <?ދb|H'~&VCDlN$@zl㯉<!ץ\|#=[F'M	"MTQVK>LX|:UǨ$I\sE9^j\l`##d/-eSj+r貆1b*Wcn)Rl:w2+$FqJ[r�h:E$VZ{jǛ_d)ϙ]yiUD̮&Y5_䃚ĺhmq:.%wy{*7V\f,W5e`ʙ6az65F`Bb-"IGy\?O5Z߻!*ր($rhzi߹=s~=u	+7BŬ$Km#M΍8ar*E@*? >DExf Xr_%Ħko޶U&f?땺\.[ͤȕ!O7pv];sVC]}xKd.V	>}?jdQ\+kT\q+qz
    )՘A\[Fv߈dIT_bHՏE|	]Wur2bD!
    ,pM8#~,(tNtи<~y|_W
    VG_d	QzX"gȩ9v
    SސF~{160CC?a\¶Hi?T4WEF~$QA»8KQDm,XEeD"uJDvY.~!V/sX;Swz?j	][{$Yr	x2-*vZgYcq}0> fRDL+
    !E,Lt}j`ŷJR[?1؉|omPѸg>χG\ZaWIἔ8y05gEْ`;O2CӅ<Be+?r;`!ړ?zQ&,~/.1@Drs}6ۮr^&2#&N=v3ɗ&]"E
    2jYD)`|k2Bi(˴`hXi2U;=mpv~YX {qP yNL\9:z5guMBI\yJ V:̘<
    /R=:OgڂPYxaRp'礎-q$|&tj|9u:uRUs:r!⣙\%g`^#ḥrQUQ~d	~UxDP"(x%|Dx_'~@&_rBs[]<� Z8B?)*o sCDYĽ"5|
    "Ws[a>KI7X6Q	^	v$uS;*t䥃WSAXkԃֽ+?꧃Nb2:2·B0H6bOl[\+&$/1'	3;N~:JG~Ȅv
    Y&e2׭K.~y?+a*g)ɳg#EFlQQӉ`utQeF&xU-J~HިJG!,^+nY%拪WCǍ,F26J[+[ssFl:я1e8uQgdM
    %&iI~1h2-]F@+YHky-jPzetOj}.8޴=v6N#&
    z_Z<`:7q$fߏ|4`_k7sI]qڤn~YBUhh\Q@Ck5K@*HƪȀЯQqP�<-Mzv|yMTy~&?
    I	'WRۂ&ʥ*W΁y9�2Ju{%&Q
    ;i..YIMD;gYˮNO
    TQc )Ji8M2&qP*WAȸk?ETf{>hY'Pb~K]ѤL>H9}<e$׏XH>&qj㒗uqX7D1;.d8&.ȘrEG&Unq7}""_fVd8!#PcJij-"JuT[E7MRv*q<j"|ԁ/<V,;qdJD^oD%OAWU:r,sΧcMAmE�h'Y=ce$ZY]!FfQ.2M첅Y2C1aTB{=z,{0J}K}<n8vOsdvq*QY%y~q*J4ȅ<T<(S,`T#upT
    *T$EFP"%ʍbC5/>_|7E(ib.} m%X>L^hu"kb^&0c:|}d/LHXٖFh,y5>G<7n6({+/R[3^3N0�#0�#0@-Dpf߾m$Xnc h|O閑c#0�#0�#0\54g<EbEmKCbEWiY}3"V=A:`F`F`�ܡZaXE$Vypm>F`F`@պ;w;c}S\&kX!^0&AbPZ*F`F`+ϾZT]U	v9c}S\n|Kj-}Мu0YDX=fũS%1�#0�#0>.&CUI2=;-A6mЅxK]o+]ZҦ VZn3f~8mlfϙ}z]bƀ�p>}+ᨎPfà[8Lض1.g}+N𭟞3ߙz[;	-{5ɓ-^p(DX;af_hpp}|0�#0�#0WޞS-VkpV7+=׃k�}W+ z~訮[
    m?rtP386(++zYQϫ`Oᤣ*^k0�#0�#T"g̓sz&lPTbl�^{S]oV+&w&!-bE͆5	ziU@
    kmm
    5
    :B
    HU_b)-塼Zxr`p>}�կwsw_%.x}{7C⹟}6m�
    رcx2ľMJ6lN;P9#0�#0�#;TkՒopV+V-Gu?,V;vV)r3֭[aG|a!۰#عsPިǏSπ#25p5s5L74ե =7	qI+L
    ]Ey_UMT>+#hȂ9!#0�#0@BIЖ+}dD[^>y#ف3wNjtֲsW#/R]{)ؽe�/"+bTLENZ*aF`FA`ʔ)8Z	T*\I\ĉJN{;4iH^0.
    ?N
    .xMBNʇO
    dŸk$P?̂Yw?Vz\o{0�#0�#44ͱرcga*-
    4*k
    еM6kt\xzB?t2Uv&^w| J3_;0{Sy�g*t+I**V9NG5]w_/.fLm	P_}6ShXIA<\
    t*ƻ.΅;Pat/kkm#OS`F`W^	fNyBd2՞^֫@�Ŋ,P{Z!ei`ƍm6x_E͛o4NLр*n*>?nNϴ+L_&[/xl)w)`B/{TX9F7&+Gg[8nŊlbb!a Y͟D0} 
    ŠbU_b<	D_pQ&b|WS8,x,F`F{:#AO&2Wnr<
    W@…-=Ș
    ɔ9jԓoØ`;-OO/J~LX(
    
    N3yN>tJKkw}d]CϋH!:W]y<_=ip d[w0떺:auHbd.{>-|&>,uN?́rov`.xDhќg༑f~LNgX?l;@X߸mkY7pKD,EuO`ʁ1>}�5Tƀ<2RveȪ,}$*UʡH:͵4kXʖ#p3XM|6\8{g{cӺ@qģ	Uh|mJ9A-/C8)suiHvxQBй]bx$S<YkOEĸy.tB~-B·qu1t`)l죴!	b.6[T;ҧNX[kY>-'
    =DsEON<`lp؝}2E*el?ԐK5vWaz!wxr@*G_x//u,
    A!mSl~ BCV][V/%RWR~:[
    VxUDttDʕʯ/SYBt|YDb#
    huJC
    H$H?۶ F
    Q\[fysoq>}�*JS*{uʲ�U~+C_?T+S_;STVZk>Nh,
    dz
    ^zb
    ?$c0s"Q448hԨW{h';pڝ%,'i"ֵx2iaڒk?:p=8Y(<{ZҮ#o4O+ILCI1('brj?3dN'>�^5	G3:HCgzGv9t/Ehut{|p}�@eTum*`*dZ|NlmQKec`VNMOh˭/XOK~/f|Q<Ap
    .6
    <x�1ҖvrBa0ߊq$NR ~eR:y8<KQbe9IQ<,Ern6$z
    rNu'ՍF{a[
    | gvX&d.	ǁZ1.,�={$ptDBjOI>*c.
    G/Jpړ)p>PсۭNWTne/ip6i(XI$bEthLPq)\iCy=awaDHi:h&\Cp0k2ȵ;g.hk'rC,Gŵx*cESedaJf\!PU^ka1*sp[T!K,0eN=ģ'~)2u
    ^bꛞt2u%]V|GZjkwѣAGu/]4txx0p>P@PeqUYJnMW9BK)T
    4-ӑ.o	 Joѧ᧋MCxl؄qbF!ȦXE$|0�#0@D`ނ᜿	[v6ܳQxͷ`Eg·?ltVmѴ<f
    VAdբ#c!^X!lsߊW!
    qwu4A,
    &Rd}"V$�#0�#Pp6+=7*q#Et~6onN"V\ aDk0k=1Z;$%}YGnKp>𛦴T`R+G7`
    шUs[,~۩=Ӯja JY'p>@RbjH}xYb}+V~Eݶ./H36l>7F`F`Fw>xCsyC?7uƷ
    [ns~9Vz1]biUhs>&Vk+0�#0�#05"V7|EHm\ib2Koƃ�p>}�:<`Z$W;IV`F`F`"';,VZ:Y6}F)RKcF`F`F p<ObEgͱHReV`F`F`"p%ZV%VD*
    Ff"0ys5SxHIF`X+ILRj/Xխ>õeXtZ̈́&Zۼ\1F` IH.PW@JZͱҮum
    pg�#P`bU0�#DDXaC$V
    X|J@dQ\PGjZZ$!lXU`F`݃@ +AXmݺuh7{8㵱u}jk=kkv-WbbU]`F`vXJW:HݹHF`F`F`F`Gvxfdhr_4z:WKv&bE]\PGjZZpU×e2�#0@ wͅv?v7<g_:BObe%W:U,ʪu4IUm#!u~p/ii6\	"t:&@wԿ_X"#0�#PjraoA,&9]xJG,bE˰뽮߮ͯj`4 .Z+^ِt-[skUVʋ-LTR�c9oU΅3X8#0�#x!W?O~z~^#Y] 9]xJԡR,
    -P4)d^IkV^^^dboh޼zO,L痿bqݼ7L,֭"clwva3;W^;o`K&Bo]6߲%wTꔕXmGfS\bU^<^%07üqg{Oa׾ʪ*,*/(-�a£dˀ!/sFv9-Z5+Eqh+hYN1yׅMdM)F`jwt~~qaُ_BF`݆uklߎĪ4&9]xJ畟&aJc_X2++gg@[ŵka/B֭]WTќSၵ3aa%=3xFj]x@i
    -f<Low3r#ao[!Eԟc?+vg=70x=gY0U
    x!ү%V$Dz=r3}�埵kX2D(8Xo%5+&8:(9V>vtID	g,-dI^
    r"F`F 󞆂qabغm+Hw_:2~W6O?1+~4.}8� yRX8Q|ρ-πM71$gzZ0"'*J2PN|^2iAwAl9|c@e0ƎՃoa;ClXYqk9?:g(E&NZFjw?Pmbx<kc%Smx,t	<pYOo
    Į-WGzT^~, /G)V_D??9pダiMkP;$k2$A3
    !wt$V%30Zgeժ0RK`eBkٍ9,[�_[鐠MV{5aF`B
    xñ@'aS_}?#9zˏS҃*,=6n_.WУzxu	<eWq"V/|
    ]nꍩFͅ+V`Ʌ0߄pm/GEVl	ٽKog@7KUK=:GuևguXE_oƒˠw2꺴CtA˛pqSaT;}fίu|sХw641mMVmBX4Zl+nip;KGp튧v!}5WŸ[k/߄uvkϭ>Y~p^xv=+л˳pa{|pg|"i{d_Ct1X	˓Z؂WPgE-ðT"U5+)#>xF`jdڴkZXX~tkc#9:m
    ~9^/]qkHb(N셣f{"w0wb׉P\BzR= 0=9p%WH0_̃(.館f	mK`wT{0.`7s8t'•#=%eJDpdRPBzH'z<cveC3uVm^GQG{
    -nmQ8m"%ݶfc&D"*<SȄ\}nsw}z}zaŽy
    l"{`90iڝOɔu3A}^((ק]<b2B(\ h#Z.\x:)LdB'>˚7s&e^,#8-#0@5G}a櫋<
    [@)ΫUZq\+&P_^|ļf/re+ℒHvp[8z
    k>D]NFp�18~ApE^0~Qic#戨A2O	(]ߟ\D8mޞ団s(
    +YH G)rQtlwݍs8�b'B:,:A_6߇QoFΆbS.WDw�xa/QjKY.~׃HI6̣眩aN2=G>ׇ|}9'N):/`΍ 5()ĩXp"pc!c銐0�#0Q2;.o	
    v;AsN+?%{D
    
    F4t4VAsAt 89hxqݼq q2D_Ŝas@ݡ0'ӽ'7K/|JrJq]
    CP#rw{9|^[:~%_{ӳ^5	Ѷ8
    at^7XI/o·!dY=,!'j=q>x%A'Cџ#	gEK =L?]�Yn}گ;\>D,>tl=\BXq`;oWvX#
    Z>\DXy
    VkrK`-=75E9yi_Qs'fF`x uQqǑ=AM3D5*Z9]xJ畟V*'{[i|'#
    >|]=
    !=КDv8D^DԈ_`8S*D펆o'Nt;z:LڷUzU|$/= NRuTg4n%$,U'n[XDmuG3>
    .2;9eCn;3J|3`R.~׃FJe߃P$<iރaw@!T^he.H"qPAi.sdڹ+#e}d[^'O6sTI`YF`jJ.s9t˟EO9]xJ?Z&Lq[\*}b9xb*+D
    oyD[A?c$aŒKq +eAZb6WrO947F
    yI!pi'XVN\V7,}xߡ	c'ob1p5�Ӭtf=Ql\<>O@a%wV}i64ldWyĝpe~zDZFαt~b]0Hʲ.:zQ:	z^K{PW|u{*iܱ^}-[G`/Sj.aF`Ft�\[w98
    ޟt;KsN"Ts$qJtdşweӔ <k|OyHx;D)A_=j\C=$7>r{|Ԏ:wZZMU㭢뇤j'gavzB�#0@2GSWwݺuw67i7o.G(w_nb1]7�knlkd]?oQ#aOmgmWd`F`"M[?\̣蜮'Jvs
    Hx+Vk@kjO*}McԶڮIvTkKaF`T#W\/BLcAX5
    ;rWe_#X B`
    ˭8ֿtGYFm裕OD$`F`j)КcҜc*ܦc7`:@mcU0�#"Wɋc3e9V
    ]Z7nQĪ6*/1�#P+_{�ם`FX.6׊gF0ȵ`FpC*܉2hUhE0�#0�#0�#P**yqXٓh9VEs=U6�#0ѷ\6}1ڴiSmeF`&{\+k7Ɓ$:ֹA}
    9VDEcӡtw+Ayi)iw4\Mw=[YIS_U˪ \#0}E F`FZ#PPP�^7*?>J}t
    fUIJhش4iHߣ`ݠa'Cv¾{>tkT`F`F`F"Ty2~W:&rCk"F]-ꗯo!ؼ}bUCL+ݾ5F`F`FE@)Fͬ,b70QW9s
    .QՃ]hڎa+lM}"
    JR/%2�#0�#0@Gm[n]$P^(]ˠtί*EKU T;7c؈"螞FD-H,%/LgF<@^a+!5k-KaF#CDX9IUߔꧏr$SX.Dv`-hg3Q3@r`R|Hڜ`F +a͠Ɂ܄#
    &LT+F`'j+Zs]:9VtbVɑd�V("UD6+ "*}#ԫW֮|>(W0)Lg~d�Y,Y{(0<afM]N*/9#0E0Aӡ֥P~i[Kj1�#T>H?1ok
    Z&_i6JkM̠_-O];`綕Ubt/
    X 3uɰdÒ>Be@ِ_Laly?i-C0~OGxF`j/+LYTX#4;ϛ5kʲ4g"-^5a7-@okW9s^ʠ'/KJMj.K0=jo_1�#PHeq)a&c?dBu
    +~_uwq&vTHpҝ]{þ^͛!n뾾2O+OcEs2($F#5Y:"SGA㢤5ex{m+XU-%0@#>V?P�CQDЃ`Z�I9H\-P^HŞy(=z8$Xx!/H;t-Yd
    #ԥnZ_�(qkAGx:t)IofyAzƸ{�0@B~HlJs>Vضb˾_[5Į|]Cywz(kéQ:cc+'bkx8۷wg֮]+rOQh!(
    1:WE*uz7博6L)߯l[W_8`~__>ccƌ~gڀ/Ӵi-6~qsJgʯv-bӬz뿞c�JG
    :*#0z,z_iD
    'Z_K~;cĩsism`uOͧҖ*V؆ntwcsZmBD,h?{LLߨ(+M$6
    XLN0@5F(6lZ93L\ȅx:.lݒBPyw
    
    bxVlŀ/u`@Ƙϝ}`<pQTKjo*^pO`җ""BHp/+:6++5*WYTK`];.4m``1u�%H
    E8@RJ(#DŹ\n>)-&ȡ;#@j6�nQ'`FA h?_,nQR5a	5XZoγ.FKˠk3I,_@3ddTZOBk!?
    E>\"0mBUS-/	8#05")UIY|DEBc@yU䦯 Q9' 1e`lrbXmsA`	f⺇]�#d8)#0\P,)
    (`7k١c'xWC;+Ak3G
    
    o\$1^~=#o$\i؃ʎ_5Mj:
    *;R`�.0a*tt,>hOp-N_7u
    )XO,\hCnd7ApsigM#Xv	3v4`!R~vFZX>_bF@@z=L?h`X̋*zտظܻ'5am`{Bƍh
    '"VVE:^*P2F*9Ǫa�#0@M6ezu@U
    hmO6nw`K*
    HwhE,=iIDm|hhau+P8ć!g dzA$UiF`F`FHaK+N	V,bȱs3(+hfhܹ=c9l;`Ͳ`meiVBlV`F`F"@(Y,+ĺT)3Y%f+avФ? }fP5
    Ԟw۝
    	6YPg+0�#0�#0'x^LUź09RE$fRipIEg+š7B?ע!/ݾf7"E3�#0�#0@]E@8i>&{#+PC$d=g.<Îмyk.QÅ,h	_A9XAG)`=һCϞŻE%.`F`F`BZBr*a2RJ3S0t@|8X́q)v"T;7cSn	tWi2CFMRh]WɽTpn08q"$ϝ6V`F`F�L+Ŧ2N#N)zbLY~(oĪ|p$BUC3w!746)a:QR�
    sXXˆb{߫*S;U1�#0�#0ؔI.hڈX9G1hX<b$d˄z_]<X}5kc=^{gl߽Фeg$58j'4hr,ZQmPC&͏m/NJ+ x>ea,(;n:ґH|%/YCz<ei8.hN;S8%!'К	í?rafy?nBR>ds-Ǵ6@98"f{;x.~V1d=C`F`<$e{I)EXm;vŖ}:ձ"-f{c[b;.Cv:BS]t~vl۶mݰ scf3r;cc|qM䣫<E,+̌)']3߈WL)8?Mq)$F\)]q,?bH>2KTYKeu1$aAqv#FV ׯ0xؘ1c,)F.#qFq?0wH%9'Zns:<ߺ}g8:-Z"oˠCúZ>jZv.Tu(WJwl	]7Ao0O!`X4
    sG)RPEsCL28_˭E)~RSèira4]̾?tQX^rL=sp~@Uy	?a?
    #'eF`F`c=
    M.XbuG@7nXNe-rS<z+_"QT܆j V1_%Xm29H0o.#-XA2f@⎒H\
    Hn#\tqD˓4K<|@8)#0�#0�#P@#AVUp+9*+nf 	^@*CE*MJw "+VN$WhBBU˭n"bYr=#FB|ІiX1m"cI2),O-,{&"2�#0u|<qH^SP(dXՂU"Vīc(/Eb,UDŊHeZyv{g+A~8_R}]t ]ZJ|
    1\ѽ1tÝ\zշe�#0�#0B%RE>V@) Vk3	"UehB^Akn
    p4
    }3*u.upYz%L!/Zd>V%J$7Dr3q%LkL\S(ɡyfPG4L=4pu*K!XN0�#0�#TwhkIlje-ݯ'Ur̅8:v^=Oϯz
    [
    rE5+`Ƕl'4jbgba;hwq7饢eS!ks
    6.mu
    6Ӳ|0@!5#V"Kc̱RjW"DSaݺuqHIoؤlYQغ[Cc(ð#v7e j&h=KfF`F`F@rysͪJrD6mCv@=]'>Y'?Y=-U@6eF`F!{oj\!Fd5ɖk/Y^-O4ne$d˄ڵ#hD?w`9Ur
    Z0FVhҼ$U,`jɺz((-+	Ud"Р~=XwhҸ!^|]Z=V,�5	ajMvsi$V*RtJhش4iHߣk֯=M;;m9l^㻆9F`F`Oށ`xFbRW@aX:0bPCk"F]-ꗯo!ؼW=vFX}Mtќ`F @†Ф`yXK	xC߉K⑓]F$`A9$],Na[\늧7hR2iU~7owE9Jaz `*Apٮ-P^́(iF`)_ܫiZ@\3J'_YJ`+U,`(6+6adZևds7,R9pY T;7c؈si
    wՌF`@YȪSYbŝH	n:*e˩nh>uφ+`
    a23ՏІAuu/9Ō@`e.(E6^%~qM	e*GW?}
    q/+$V; 2i*3�#|]#`<Mҳ_7-?[cn竴nWXz2+SN͇kPκVDž3_8N
    ԝ((qڀ@IXVR-:lǪV("UD6+ "*}#ԫW֮|b
    t;"C:Ȳe_.h+*"~^~r*fF.# vt`w vNpS~Wd"-Vna	|Sa<m3cܹJ[T3x#_n;%.tߗ+Yt9Lnv} {ǸV(5;^K}gM	
    'Q9Q9VhE-쭱3I*GIUnsJ$Wx
    Ubt/
    M1T%H,r*/	"]	tK|XG(�*L_9ɫ9F`" p0t<<kLM΂em;0Gd7HȦ@&`} T
    M�>oH}@%5H/?}+c5D]�
    |th{XW7]Ӈ^-WS*"UPJbE+TmBM#̳
    k& ¨<Q#/.ژِ?5T!'hgF ppӃorfOZ<WtA5pl#@c=9{ð	�,A^
    Ƣ)~Zvc`ε"K>9VXQ
    	EsCoK$Jҝې@m*-VHD"?tȃ3sd9ڤ
    
    	ÃS!׎`GӝFk.dJ]k{8:nǩeƓ\tKpыGK!W%Z3*|3۪pszÏ?2KGsμ|iUzu=sU@)(EU�[ns뚟4,UT@bEV,=
    	U.^^MXV4-III
    .0SفY[3�#$@;ův@!~ſưИ+ .X}7MG8v>TǑT?so@ih֤:#ğ=Jq*p"VtnUz"R*"UbE-t=
    %!X@?4C/i ?%\p{.Y97@>3J
    m7'BHpfF`I-ж"ƵCm2<ޝ7ʹC^
    m\nT+%-KWΑq~>gծjՓHy%ֵTĕ*$X&A؅	Zڡ]p3QnJ2^	[x^Akn
    u̙TeZe3Q9p;.=ss2 oLG\,IƼ_9	U3�#@XW{)_כVp<grcem;(!\
    R%=\<6~Рq$.}p^XŒdL\7ӑ 9k"0�#0�#0
    5JZثip:ºuQ:avewu/c:oC$-PaG(o
    Xö�Y~։`F V;Ֆ1{}|>�?+8^OfRA
    (I?I̳ҫEs<h5ڴql;J?t?a:,t8_AgDF`jbRP0upL}@]ƽ+R$ Yө b`TcTEs3(+hfhܹ=c9l;`Ͳ`meQt<0=�#0�#0@F@_ZV#c_|z
    `۴	xl	7]?=
    f@zaۺcppiPACҝa6o,B[F,j"wF\:#P7
    6X�1?<qu[NSPP�w^k(8�Fd^~'5m}|OQ25٫@t\9$pqkf|1MT}IX*wCf7L5eWk8,(hgs: .rp@<afbUɽgbUCլ$KnZ
    WC2[n=;>FrZ
    <Xo
    ZV3X͞3^4ƴ*&LXUy{Kh٢	j
    N՚cLXqU^/TJH
    ]R!ìZUlE2'c*drXxF`F ah}6cq{;-V?RWDnC6c=&V
    :bEY
    غۼ	<($U;D/y	XU'
    ]R!Uh�#4D<V32D=qUX5FZ#ׅHHb>Vb:V,dcer!v(+݅jnv`,}X.#0�#0�#0qU"+UZP5JoLfMce;E BUJaFW>]|H+5'uTd1Ⱥ޽$@KFzw@wKqEf~sQ\yǭ{:8GXݱ}$+ۯLu~X&1?FD`?%F`F �ܺ{uE+;m
    *GIUnsJ$WxM*ݱAao#R
    sgrŐAX�×g‚ARƒb%c&ZH2C$tᙃ"A}@~+7 ΀= yP$Bq>,tcѠL˜qj'#ۯLΦ~X&1?FF!	K"h=!x1YQ
    FB/H9#$e+s~e"v%M[1W12]1	K]aO%"I6K&hx*XQ oRI s!YZ˽VJFC!90bhHB&>*+/ȅQyzqe $t]X~wU}˔"E_Q?;
    	brFFdG&o36S5X~`ꀀɥMv
    ޸a=<;ox:d_"QT܆j V1mBBU&!'pY~\$rk2,9``>Z
    nQ<ONfYAzcqg=W^},L$!X&qv焌�#PcpX;ZO8,`X{8C,EQ
    5h]B@l㍺T}+#P󨐆)Ͱs*u6s!8TdҤt+b9VHvmE\#XedT>,@I	,7H$O,S<G\P=ZLל,dd3MEmLTt	0ʒvg$RBGk2-AXr\p3[gWb
    X)7*/Eb,UDŊ۸omLt=
    !JLEg"fmb
    :pI[�f(?AA&ԡ\iӕUp,ABX\͢M=܍a!A|L9Yz76I+3Ƕ$Z0H,`%E	s,s[klɰZ	gղ¬TDh GV09dfAć+UJ4"fw(A*C'Xvk+ }FQ{DuӥHrRHKΛE8X$:˜z-�`VP$ӵС+2ۡIU#_|=)~e&fӲ@Lm2)+lFmdwpewuW Ru,)bd&?.h:?!qkTbz>}Hb%",kVe;tjht~p4H V"84no]gh!3<EmR?gyf\Lc5>+-ߥ<Rp-t᪣C\#o8iG
    ==$.jJ~wMAYoFH_~SDuk4/zȜew"3^%TȂ(Ԝfj;H$XòXi]ثip:ºuQ:avewu/c:oC$-PaG(o
    Xö�Ysȥ/0@]F Gܲ]hZMi`F`C@oNe
    Sƪj7+cEb^/jm|hhau+P8ć!g dzAUt-Hg`R\F`B�E(p
    KpI-#~/<C
    X^ψjUL
    Č�#0m2Rx,^1>UHߨ8dt}zy}ߤb6LPad*0gZrUXjH櫚q)�#P5Њ~nFi2>R$ٲѵjdCf DDV[D8#P	RymP%Z¹:-BZH$YF`F`FrޟfL񮀘XKd,V~TTڵki/?x/*qF`F`F`!Jq,iY}bX~KTp3d˄cyFr]@:{\zPٴ`bZ@G>M{N0a`y
    عt<+x≾eE0(}d&Vb)J>F"6l01biĵm:MAAAŋ+0�#{臘M²)wRZ	DǕC&m;oht8]w+!HDjС!|	+/ä-[O.W]~)<p^V?p`\Dn>OFM2vT`F`FVI[4(Xd=BUcz
    ;{1QXXM~?6	"i]>+!}l8|quؾo[bUV2tQ7p8#P{HbU{1�#Tw"Y'fŊnY-VlTvc>p/̞5>5\tVwG·tl	0:'N=\VAE2�[V KiRA]R*`x&Yh(](񖩼/=(
    e*X{n1Y#0�#0�#P0R
    XhfSXkn:	<Vy�-"EܙP^N˞C>,GD#s8tB	QTRiy?)8`(
    P?7̆b鵬W>`pJGQP⥇`:/c0USO%0�#0�#PWPK9Ċ6XLl\QU/_0QT^�+[3|	emrܮC�
    rI	&AFt.B?}9te
    lȂΰ*Wt?_2|$h+169
    C~F_mK�#0�#0@F�9SgR*L`+bڸa=<;ox}r۷>ha2w#!jT:Ck2DdeGY)KV0cIFF`P},L$rqF`F`F!I,n}AVTYWVjmn4j-@p}ÓOmEɗ/- @}I6L|.~vH%S"aF`F`{뵉Uj~ScE{꫾r;V.4K֓CοOo{+S
    HBX	&f@IYpw4\p1><Ge))8@Qܫ	!"\B-@>jɧ>
    ƌ<ㄑWʜ𪀵y|N
    +رcQF?	05
    (>}uz5۫1qrT+X%
    be֒6nVd^g VPm
    NGBi`I4
    `ZB2&莌I\W#;?:6
    "HD鑈q0<ͅ%>E!Vn=,0·4*xiv&V5Y2)GU!e'M=4.�ZlYM>jG_|n
    >&@Q#>ĪX߼==7kX%sBZ;A5*#mzgG**U}=uPUT#&VE35&V5X{.Yf}{ةc׸qcX~=w}p뭷u85jҸZG#a[OUcEd6
    QIՇ$ӊ <RU%YҊ//ӷeFڵZhʧl>@C xQ
    XѼ" "ɸ&X'w `Gӣ�#0�#PYg`*{^M	T)s&+%I/UVHEX#0�#P]`bOk^@JLJ
    \=Z^˩F`F: [Պp:]O\"lkv:L\:+\uhցLfd+]EtD
    Z^,`F`*"U#i;Bv-&	^~wx{Iܛ	B;y]K=q`W$0!Zao7=(9hP`2{RF`Fw-¢#xa7<F 2q+/Vdi:XhCitH^[E!JQ҄!
    aep<#0�#!+ 
    6,6#ᄚ
    P
    xXva0'F΀<gtzW
    rIw3avX|'гRzuXJf4�8{4QaRL*76N,`F`dR(Xxi8U""Pc?5kOGt|ODz@5<Bi5({V)=ɓ9}d/\
    G=HZr󮪺-<F rbU,Vd4Saj>4YI9iqeY**h2m tnz[üʑWQz) kS+xGdPb9�#0@B6nܘD
    ;a>j%+`]/߄]/n)[fC.7,[;6rbhu	ʿy^K]vQsҡk/CE9VKo'HuX	vH^	^fOJf@r<//"0UL1~y?9tf.,> pUAI|99-/raIap	>Kr,#0�#V<Ȥ-|H`�KpyvN`b̐P.~{㵠_/>y!pn}/H,+k]Z"T'U/_B0(ȣv3B֠PxM
    ڬoȑRr!Y�u7$W0J(.閞LtE՝0�#0@ɺMDsH	޷]�.)Pl;OTV^s;mS.9VZ'ԗ{#PZ5=宀bqzxvB/@th}Q.v0|ڌ%%YX!\d|qL80�#0rd-V|xzrqӶ뻧Gɸe=I([~P[8pP	ZxuKj5EeJ9.[AXo"^3t+3*(%,ޭg9XI_,&p`F`*"33?=7deeл8$jO君ջr"c
    +_bcuXUMCan?p:ΑU͎JK•O+I3`?Q c*)qasN
    J
    ɹZp ͂,#0�#T,V'e%97=`u,sJޝ[L߸(Oń	>$VȢeObJPmGq з6=r|-
    <V\UP'.R1vE'-:ϴV̜ކe^OϜ5bF`:ɺvBrd-:*
    XZ\$Wgu:2?[ǡФQf؍.n~!}usB�:v^=OO]y `@@/6l`1biĵmfЅe2D`̘10n8Xre**Ym۶QFa#PShڴ),8B傂hW+rH<Zp?l)Q\`=B#'/Pew2:X,]{TՔg=F`F` 
    yu5i.\qHL)r&MtM,ȉ VJ`պ*l뷈[w$[cUmF`F"РAXnpIX\R"H>@mC`;ro.
    ۄQ"Vļmv(SW"TU"zoy睾syv_*3.ʼn3�#0u
    }^yؾ};dddppa@>@mC`ǮRذe7o~C̱Zh,.%mocnͱNHj5l`ZRU%0cU[x`k.Ņ�Y5kCel@9VcǎVm|Xk8cSObU#b5Gjԝ2@`brHY #0@%"Xڏ7ZZhU7L:7�_.*ˮԊpF`F`F !UXՆ9VamH2!"
    VR<Y
    a2`F`F` ɔ)'VXsRSH&Y(|>;MO+WwXU.,`F`F!`+[NI9JĚSS!:F+UK]{Iҥŋr3_QTvMm֛`F`FBQѦ**kNҢcQ>*K%"5~e*1\Y_&zQN)0,`F`FU 8uOĚrRQ3o-NdB�`�KeBv00q-*AF`F`Z{^-VI4.Y*o$:A<-"a~G?gaF`F`^+V+`]XEHFsCYEV1�#b?
    ,>~sF`P}D殺=$ViY-ZǿƠu&]&t>6q1M㼨p"Pb@$O⼩pLpprE.}-CI[>mN$#0@
    IiUeF`@Tm޼JSPP�Mj%8WɃ1c10C׮]!Ċ,V,P8:xL0҄Kѡ½Ndkq|l&V?I]Męuf@TbE5`F`v'6lpEhbe3b;e֏-VU80D0�#T7骭ULXu}iDyNdp<�#0�#0@uFJ[nЉ֑,GWyU|[n�#0�#058r*![[5LĚSbvkDeR9rIu[gF`F`<CXJHԚd15[]ngF`F`!A˭|D9H*Յ:F1�#0�#0u
    ]`=u,Aݡ\*#0u9tU|D8Y3hjX5ˆUa:TiΩ'VbUkNbu$BFTdT	t2�Xs:F^|q)6'kɁ?<wJJx:wDpr 71B	D2YX4:N[ׯYCچ)�#jȕ0[h-Vِ_,(/·%}ҡ{$SL*y	*Y2A6d/3Y%'gTa%Lְ_,
    X봲C7p:Uغ
    ς*,=i0�'
    zvLS)B,`j.U1**1kNBuȃ3saA,ZirATɌi�|i~@AzV5ҒmP-V:ӅYֻWXkF8DimZY4"m&pZlkVKY&ږУ$4`ŬȊB٥*<'Mu5ym
    *GrQoBh[+Μ`&WvKtdl…ݿs;d˄cyFr]ͫn8{]AViy"r`f9Lq)G$s9*9t3CP<?ȘU4(e|a"CX,NfB*�,'W2tVyqp:S,G\q|TFņ
    1ڴiyyD&u[4i?2]/Yt)MȄų@[Al~.p38$Hz2#i	(S:j96^*Z{vVw3}P}t
    .~S۲fb֞`cdVq<=z4ڑƭ:
    w�M[|e\i{cHb;.1cƄ%TG]ϰ3cCW@ ;yDNo̍ALUNq,?( 76SaDz8O)CΎ2t:Url|j|
    0@N~CKOZ]bwi1t8|Al4Un0 6aql|7#>.,)҃dj9d]čQ\HuR_WTw9w}F`j*>2OD_Rf}
    6oJ+`j:z
    ^-/sg#.n~RyXE
    22a<VȹmŋyXpYJ(>蜝%,iqG�#P FCj]97c*5!Șcx<,XYNySZԢY.0r.4/sĜh'r ̩`DK2Ѳ=T2uR8s%;6xp}GXMW@L9
    >*{HdS?"5Ẁ$R*"sP-Z!Nd@قhyX:Źy)jt^<`5ʩrFz#v4�..@Ltؚ4�tak�ܔs`TL$eH*g1BZ<"{tJѯp~F`)'Vubt3Ҽ>Ho9Tup%\'HK.ÑHYr#ǡ7
    *eWRqJ%
    ҙh#$H0pF싎5*tq:A*v=ݦc凌 8\,	th\$v$}D@irlY+'NplTKڳ/QS~yFyV)'V�LVq
    1<z?lGQrt…!!ar;)+87
    >H3LkiY{a6:a!.)/r'riFn K$WXከYӠ.־M]gB3ъ~V8s(!mqA\[m!_7zaO'rMrGk,>p^ls-'/::
    \0V2.
    /9`!IxUJnS/)W[>*e/5UPa4Q*`48#P*9Ǫ:ׅucF4m}V5j|*=f=bU@X%OX%QHXZ|b齱`U
    0�#0�#T	)'V<ǪJ
    SUM+v]j|`F`FXUkN%Euc$\/nwJxDB7keB8CML"fF`F`R=状vԻ*
    F`F`F#$ڨ:XP0�#0�#0@%!rbJj)0�#0�#0`IxwvnYtR%$0ĴqJ*`F`F`4a[>VWbNHPs"=1'_X|΢Aާrqc{ԡrRV+c,`G }~|jqF`F\;xeѣG[X{HxNG6m{qUcW.vaXλߠc̘1aIj||"u,/˅X~qyW3]ZB
    HX8ȝ6bZ"_nl(˯b!+;Y^v~ŕ=yqDzuviv}^<]'�#Pt<xp|w?J(]k֮ظq7|0�#B"9^};Y*Bт%Vذyk8U]yUTʜ%qy|XGmK>K-	?ͧ$raB.\ȀaPM/}!ólL$6$Ά}3|*%uFkXj}fgil̇82Q[1�#0�#0E *GU:z
    И#d,	R{Vy7
    rL"^h&;C/t.i xad1#:;p�#0�#0@"@Rt%Xg_&&|(.Yԑgݩ0ErR֬~`1"$EA6GͲdU/F`F WNE<FC&K9+
    ="3HFh3I.r#ѭN2r
    w+UvF_蟭_,\w/0J,`F`FXU[]޲M7Aԁu/|ъi-kB̏¹R7=
    2(-<B"6<3Z@zXYHʴkcI8@74/'`F`F`+Xy5.ΐi7'tJ4q-?IJg$0zijғʓ.TjCZ<b!r; '"[eSrE6̺4	YJo$%W28�u
    V]Usq)�#0E n<Ո3@MB!)'Vlrw+|b>$ymwIp@ו;V^¿2/[Ԍ`oLGk.ýp~^fZ*߻*`Mzd�#0�#-RNbU:XBXɯΪ2�#]*ksEk-*FY-Zh[1CfL!0`--+Xj
    %
    J>0ʓ^=Z$'`/}aK#F@6m tnt<ti~|*j(-+cv;
    ׃5k&ž{e+,gw<@TiӦ_{hW+rH=\
    G;WL+\$tKڌ:tPH]9#0@]GȊן`A 宀<*f<�#0`!40]�sB}e;q+9ՇAF`Cs*ĪXs`uLq.F`*
    dKBe\Kf5#xuQ	|?p@ZRS#^\	Vʉ[vo#)mlv\>#0;oj~%@YȪ֨ZYbŝ8une֩1~6\S
    Y	~|%&_Z^^} Ŋ2@
    0ɕ V1
    jJEkNbu$2#rDG-QYd
    ~UqT8#0Gݵ0{
    n	tXz?,=kaܴlqpcGhyҒ_a}ˬN9KL+he3_8NYKDA0gHZY*Jb0dV%00;dCi0U0DXb`:MEc&Pmt|K
    :Nv6:Ɲ%o	-WSiπsXNb:ZAYt9p,Bk}sWB~~xOw+\F0q65'թy1spm)1
    "*#.[nKJRq]U鲊pː()CEްN	O�,fa:kk:W7uuXxq2˩RF`7"p0t<<k.ZM΂em;0'oM~M" 8Ag#pYpǯO
    HAᾲۛ`#<*VI*׷Z֟"8YFH42C癸:~+ɒ>iy?WlgHM2 oL$gH܊)$3saHk%з6,6r+^D:J@ѷ?1+.miDr%[_l鸤Kq�SI0$[e
    @r>IA9# 2߰u<hig*z\	9ãր9*m
    &�:y+�Vp_IE{FINĭ9);sQu=z
    !)) 5$3BށDHnPY\iyDoza R(wVe04p"jD@.)Mrav?5O7aBR@I囲-gw.`*uR
    kܻt
    )ug/l7,3=N_^<]
    CcWԹb)]6i{ߐYÃsrQK;8]+Ux_q_aW@~>`>C*r
    H9JʚJU8g_Sd#)!AFGvA<2 +2k"O͏H]vx}a&RJsk$a{%ˑB˕Q?T.U
    s90$\NebȲF` W'Gk7rą|Žm"@̤'TьH7վ&~2<hɤפMt֚5	M3-hk^dPeqMm >>\Ys޿o'We#kz+m9j.$,_Z)es%w}۝ּbfK .ź]gªQ<V%
    LK	OD+ׅs2SdA>pT(pLF{e3'RaFhASuܬGCxr^,1Q 0W#<܊Fស}hB{_i;_
    Bk3ɰ3w>|OD桙K<}(!=ԏy Q<V3LV-^߀P"a9
    6_T p0Ef>,zd˹dSӚl#~?-v_A)u(,%-0_c^3́CWXSi,<4;xhqU&dIJuMh?E:- uwBJChpKg5t<oT$h>n3:LA7#eФn׊l'M]� �@�Bms'OoK\~<cҺUyh쓲O3QYⷚ{2+G^mRY5 mS	?rTE[J딁�'^w)˖->繗Ξ5*=xPپM.V
    RaT/eYz;g4Q$C~1;޿٩YN,_yJd
    8mߖs!w]~^XcUՍW˰G,jj$H!*�+k	`k
    B//=$ąk7i{PUae=M^6c �@�@H<xs]\liO`9=^GYi,_\^z)sCu!�!`CL\X-*naU]%PڹB#`>[/\ Kk!8 �CzaU7�to1}DXUȉ k<~	*EKA�@(EX=`?y
    l}	Uo#FFDTas%G#+tAC�0!謀FXEּ'Tu1/h<ZyV|&htJ;ϭcEuV� �@q	dd,R+T>ˈ-RT>smE>:+9*o8\=b	 PeK'cWâ� Pt=Dɻ8oNWCd{xp=<[vɰKraKL=,ڰB#ۓywR֧<8^ݎFʰٔzTuNP({)fqU0y(O$1iZu}	EQ!B{D: �"&h*aX7ř.oS\#4&dp*[%RCi7vKa9|ݞJz6Y=Sb{FUY6z߫d"^w5)fQ9<ޡd!϶\T%4E �#0=%6{o+ǔ90q6TNՔ� �TJX%ͩ1}=V*|eB&fǭU=j;eT⌍pJncԩBLIX]liX:bseUlE{Na &0}Y{7SDwx{(W=υ755h}]5~v}f?&R~Q8׃ousK($m?@�5M _4<V%X^|gވ.9wݑFyGKWopWZ6HlQ	((6A
    H[G	U$ͶҶ%U�*M'rꪍ7IƵpo{m9#~3LӔszj׏o?sUj:NOM{ЭN�@ªQ<Veϋ+[lJP:у#нUAO'u
    29^v2+eta7N1*]�*D`loyoi{U|(ŢX?&E{?5uVK8s&[rķrBׁ
    Z@�
    dUF$G
    M cMX=3Lx~*f]ˬjpzuحO䴭E=kSiFyHv筇 �&0v["/#*BIV>ߒ
    A(k' �7hvoVx&SzuQN?=G$
    b]HSdRux!~V@=-')WcHkwqV
    rsXu3s2?$r3f5!: 01'?5ot~"KDQ;Pd9@�N^wJěrP\#Ti;,ǽ2vܗ:rͬ
    eum467͎]lA>y̳x__Q~	y@iM:Ï*Yav{%-dKi']tGV;dڴ'H|aEz4+�@
    UM!@ 9=ߒ޺ڛd㽷U<Of3[C؏*dϚ<!I*vWc1Ykyɣ	-ڷ:tdY0ø�j@ª8oNmk>`5 PN<&'VgZ>.s'܄^?~b3a:-A<P]vݶ<I^QS!�N!8qaǪ1d	D=NEj� �@�h$WF4BB_!�@�� P,Mmk;y<3hP}+S>Ǥue<6'e٦Xջ(sssŎH n%VK1@LPzΝl2D4xyYs߳eZ �@xQSYN,_yJd
    8ms4_	5dߵg^BeRU]'t_E6㎰1GKTaǻ%I(GΤۦ>@	$!qax( kmlWts\{NKj}mo-B�� �@VQjN]0@>vvLLZ"jLF;CQKYMOKGF'ՂG*m<lۂC� �!0&[֥*0+#\UcږP]}\&a劭`#;r]<ϭOYjnlkK6}HA98(r8P}锬_U1G6{rc^ӗԛPZ^VG|ug/1̕,:3/Ng݂@0axetE#^ZxG\i"FlIy<P%S2;;+S2勘\ҝ*{n=2~h=d*w-{qj,{uC|hCZS3ڷ"~gG9�S PgPȳ_FaBhpܬg;xND[8j=@YcU`=s7HA(PgxPqT]#̆`yܻ^ڦẋIK.
    "^߾KbM_K9#qm9!5<˸JJsgڷmKvJD@�UOʡϥԱ~>r=Zֹ%@XqPJSx0!ϖΧ?ڭ I}O[ϨshD95JgM[ڽuVFx)GkU^|Wתsoz0?xd?t<j;dw2(;TW5vlq!h_c5:0M@eO̚N9x);>ذ}/~zkY؏?PdXO{.7\TT,.<OֱvfH	u@onz$GZ%.Xc3Pݮh̬2!tܒ6gUt}+vȜ=sM=DSSs5v2xL8`*hlx*usaI6raaĜ-EQI>h'
    5A�Ls~	/́۱W45:=)Wo!"9͗A`ٳܤrʘ[eAQ@	$.cU<E*pY
    Ȅ9;4`-Nmuu-U]FUK
    @>F~J2:d˹ {,R&3O;B;G5cˤn@t>,&^+49kkJ8O;U=ӿ&(R%:V[-#]	ͭ*6f@�K qa*~�[4q~`3b2xY[y!{'{!1|nMjʥ!94p\&"1./߈JFUZu]+}
     PQmVGҭxTVr+ԿeULj"0~dZNgЉέj-@re4'.XeV}5q798nBq~ޕH<+_Ff)%h/:89at,.f!5d17vݮvyYB6Ku;2$^*T-k5pxMW	W{B[اU]9?w"IjnU5� Xa*`^@WUb꧕ג@=0^++OzIeTgVI^v\uh啯'MH'11aBS;w4s7+Xbsyw4.<V%}-{jT%@H+bhw"R) PuLfaܗ~wfz;p?Z}ND:8@̼
    w[䊭C4:J`ԲW	=L�JU8_ 2,� �@�@*n9"l>ʂ �@�� �w̝<yR|1GwδlG&{>~9]xGAXXq"Z@?/fffܹS-[&}}}s/=/knU{^<Wp! �TE(޿ٱYN,_yJd
    8m{L'c;nVUAa5&[
    HT$aqe
    ªF
    3@*ߏwuΔE9j@]0!+[\*YS\(ɲYo
    ۪{>m<{ʻ2Z\MR`:%yRyG-,e䜠YT@�� P}%.=p>v~'&MddCw9,G=9qh:?s{l,jQ;!Ũ<@� �	ɖuodFC:oKu־q
    5@$.TBIÒÛc}}$K7VSnmqKDMOD.>.rVFgpaRk>iei<hztNI8nPyl^d?N٬wޠMa6a?^#}@u0_Ҽ=닺/
    -W
    ,Xf]8jC7FBƩ{L|mumcn}ZldUz|UvVͩ$d"#H-^A65kB|oϨn~y7wx(=i5}H[O-Ĉ-i7OdBn'4Ƕ-oRrxsPd{FU,Z<݁ҿW?2u	 P:tWouB7p_s쇔ijyv9BQYX-ԴS!'m~*o΂i|!R1(iN*bj=c'TC)B
    6vO-rٰ8s]:1wMЯM\J~:gGޡWa+l1[ �Z$`6w=+??Gثhm xO%uxG68QWZ%
    %Vg-N<}ȽOSDq9nYǣ9`+JĄ
    Ƶ6eܽ1^9gP<*|4f	{mk!|86tVgՇ0߹x7;T4cwR{Ҽ:`A-I\X%YP&y7}Q%hxCDUѕ̖[geB<1cY_庫b+
    0,]Aa{mܢ%1:ڬ5_-֑;7@�Ls[#j&=n
    x|0v[/xǼğ}QUqG)g1Mn9G}LĪE闟Uc*<ԠN_BԾOŖe?eJmmFU渱1G<۠?U;!oqs<c>yľ΢}	^gюdeڰ^(V?*i:FC'y<\F}K<Me;{\VXz\!VFX<=&Eor鈬,rcYUPqYEWk2j igXk&qJzJH(3hD7n'ݘ�
    #`B߫wWt_.Ot@2*闐ܯ?gUxvYL;x7y[zm}/ls59޾t
    s}@޼*^-b<#ce杏^3Y^gQ׏דA;A%3s~weiz]poQ5WMnąUxw	׳Mcޙ;.Uᬳ	VtA1`= 
    f-l"KzGDJUS"0Ph^YRYFٔ=JT�T#ӎ}Cb~/ݰa]9KN!EVaX\`[1<1wpZi'9`kF-wF<oBoociU%bgƿf8aDY%OV|V()=K@
    U~7ITxK*J[KAkj5UN`ڃբqt8e=rg<un󄗛�"էnW-'IaKt(CzM;I1xی( 7kPc%紏g+ �%[!>w
    0cVY_`=㧭0(W`#YG5yI*g,ssܫ{SQ۫'k̈ckƱ'
    從oBAr!3ƹJB;}Ȗ”O\X᱊K$犈p!x܋B.}cYeHzOv<<ng+00ǷϹ
    /<bgWo/�DpLòO{B-]/ee_Bu
    ÖhZ8d,aޚƌr-0l{7y?E&[xplҴkڄY䚷_rqI_~@\ ʶ3|engu*׆#�0BU.ӼX}/fs*2vCmx@XEIxH�mOC$oEfj_zVDq-m$8}ivhڇC}l쿊=*3ryk{ul¬6t^N~LWw,昷Fd$5Pv]3/Wj5:S~ku<6I
    .Μr1zs.`pC1wI8U
    e;+[呇ɞ>)d&wuI	TrVej@?/fff;we˖Iz[ſgVgYkGV?g]k1'%S8wjᬒIҜϺ{Ȣko4,^xY/]<NR[
    d9{xylW]wݝ|( @�� 0ƶX['P{Ӊڪ:*aHh� �@�uAʖA؉\5EDl|1}$X \@^<S@�('6_i'0qa5/jj�@Šu7WJq1?r �%P2kbU)ӥud)"oCReojM†냽:Y*q`_%̠N@�� �$X
    ˈ-XT6TB/2UKW?GEJ7)@�&:wG
    #_\� �Z'!Lҹ9emr=9#Llo/Ij}n7.=:dpPаâOZ{iT8zmC͈p(_]'VoHfx\ٞ;+X�Boߙ+W)UR	 nxp@%xJd<VƋdysekJc4kBҞ^UXR!<?|c/ҳ-GTMv$mWf9RӺQ]NOlMxITw
    fθCmW=xg_ފjoM݄bU �@ZٓJƛS-0}=<>*4eB&qoaaON#16"ý/qJ8&vd?mSj(=vHbeUjJnTaτv �!в^}粏WkK2]k}}Grz-?ͮaY_h:3}ryRxZQ/V_@ۋJƛSy`31KϬFyGKUѕ%L0Җ=1<"[GT^);=c+J]1uuIZwH[S
    j@	}nnľߛ)HcVtrM~zޱ^YE`F,0{8xsDkS\ƭF!PV*{pgI?
    OΡtGd	S1wX'wFmc
    zegԿǚnlb1>_cZ&C,o�=᮵:I 1?ݖ^ZRA{2Z^s~qks{[\^~Ъ:^Oi+VE)mFX=a9B;4qE:*zoCVtvov=-OPVQԀ&c!Ef
    քCq~oWW/AYOd|6Sv6Œ~@`	׫4Vic!HlJ?qdylS.ۑ\FYeiB7& P\	,VxFI=Lͺ('ß#I5G*JͬBV{:{qUi
    "?qdnjx҄$Wa<nNBt8"
    }TڠkƜ^DC^F.rf"!UM@C4OHxTCoǡ5vĉYvZVGiYs3-*,vU5c3	4� cι"x:ohHNDeLV\Sײmla l
    DSZPAs=t-?td؆hÏ<}V+[!�%'t]oϩ·ez<[\#5`'Y2\'6	x^ubYLhfg˘g:'=/:tO qaj �:rʴjc")>o#V4th1r345_&4|\Bv݀TS:}k:6c1׊`ܪi4@ [ąZ@	}'2h;#YNy{`8KZkE
    5]LmK
    ��]"IDATG?9Ƹ~,\bJ%@C T-� �@�(@c%qJ"u@�� �@�Dms'O~Cy!Wf1֕Cdgݏ~2g.	9\)/+*5C�333;we˖Ia㥳e/ًUu@�@"]{<xff9˲|q*7h sܷOqyGSw)뮻$,L)K\"eU`"*˗!P*RUJrG9(yIZXe&0,bXE馸fEwUVzoS]sw	"1-jn@�� �ME#CeVV)6W1Fړ#-2}T/(ʪPj-1헕\HmtL?SičbXgoi<cX^q|kVx&BiâOZh&Vh"Y|PDRcQSj}nx8.l;zAÁ|떭Nܘ׵mg^m{(%f<.YNx.ݮ/GϿmcn}fC3@�O qaU+Ǎxdoꙍm9F\d씪vag*TMi!bkbp*gIGW鮚-{;WߛbcxowujnęSA۬ |f" 0?:7;Ĥ<&Gճ.BqFe/+i9=!SJ �LFXypݕexxT tjivbCLxk(=VH^o0פ_|-٭_lG<1gظv=4`zN穵_}j^_L}6r�@j
    ODLr:xtֽÐyq[m	s68knؘFd"GײvsQTM1g>_cqvB0jel@H\XͩZ~?owx:TlvEJ22_'PV2FBkB20g֠8:/O]2򚅼RzwG[ESiގ>zH;xxt#'KiS
    67w 08x=_3,7l9'XQZMc2c^Я?`\:V79){|=df]ֆ	o^`9\6Ԣ(aUªQ<VEN'zex)%URl^C!GӍp^-wnیwN?Yq;'zv@{QӧLO"hx&
    *zsuHڞ;E;7;)CqmEܫ?F6iF`
    ndc ӄnB aFX:&Į#$RE\?,p:5%!z^+CҴ&p:f͔}ӡm@6{발;s
    cLC\Y"~@{Lȟ2,oE5K<ob#yU{&"`CrJ[5.p|	dlj6$I 0Zw
    Uee,Ұ]Af۬+	:.׹fT	-[|tm9htg:q#2爯3}=dt39"!{F}	_+$_5,<)2*3?8U%:vަUncvHmL<	uD.(<jZceCřex_f;$h;]3YVV}8xNyQCZz./״MZP^2;xa$ PN٤?㮯g՞=2qO!
    Y!_&0I7B+}IL>	ElYUmܓ(BWWrMt8D qaǪO}j7w]-7"7w8Փޞ%Mlw;}wB#%P;b{M~A$78	6Iڷ
    :HWcSՖ_z״clz|1UL qaǪG*MvfxǪh�@K	
    :ޚ¬1w=ϹuY)u@D2ʅڏD13`49Ƿб2G2
    3(%z+<VGcYLŃ@�� �T@
    U �@�� �"Զ'!<VvTVymOG?zWфp$O %(y133TsNYlistVŃ2{\9R� P0E(޿ٹYN,_yJd
    8m=<\;KVAn_a5&[
    HT:K`bFXүz!P](G[@RUV*:YI|OWj+>%f`@�� �@0qVhPEaɥcEY
    .@�N)YT֎ɖu7VUy+<V%	@XHGi{-_6T_Zom\)c[Cީ飇EzAÁ9u뾝dL[Dr>;R=qKK^S{] y.'}yڀ� H\XՅ7'H*@Z}K;>.֦9mNttlэ5
    Fgn{hiqtnٲ(+N:6ۭ%SnzA"Zb(H_/5;*A?k{1}_y$eUwO`ZNwjT(M]ndj|5YKaѿ{Xin}4,#B!7l%Aߘw8B9J.w͖#kn8#o2`k3㽲%Д팳Zx	4a}.{JmO@-xpc(Vf1nL(2~nXf.YU[*!PVzs|=P1eok{h6ϓdm$z0?#:z$U꽒./UER!`ra
    #'ckXP@\È*JElRt;I@	3&	rYp?3Nss4^S8;'Y+&=֑<�4|YVJt&OZe2`)e}2ဩP^ʨgDOrraღhY=mQ<O\^9zv
    @MAL|`Mf卷<N#&2W!mEhܫ?8)(=@`a	%FX%6^߀h"hWnөta!_T pLΚ)0̺r<Y=[gVjiS?g;hc1+B8p PZ1
    P@hWm!`Dq6O;PU=<@�UK qaǪر$Bay]6']e]YWCb՞@HixÀ&hTޞVaKǵ=?|	8>*jO6zZ8-1@Yh_B׊lX&'刬ЮV'M`숳v98?cv84遢>WXͅw.xLvn[Xϩ9EryϪz5pr*?eD'3uRKq=N9mZ]#q3u
    s5;rf&e!�%	B{ԚW	#bla٧{-KS[cEqMC@eU*P˰
    4Qjc[TI9@N8ҙ޶&i߾*m!uBnC@|jxY5|1aUܙm^	19JY@d
    EVcU,?WSg\{leWwC�uDrB"YND�tf~DK߉tu\*rB�kJZ9|Y8͍m&i-]� �@�@ą+& �@�� h1wߐU"?lG&{>~9oNbh)G mg	-A	333;wʲeˤO㥳e/ً� �y#7;577˩^K8S,Gm}200 ?W3[{-rwJjHHC(5d#P!(GNA�0!ICkeQ9ӫ>EJ+$+tJ֛}skv_>[!�@��@4źąUxǢ^c[eQk	)FE
    !�@�-Mvhdq+qaU76#>K+_.p\[MylY.wmBy{Ned\RӒ)	' M~ؐJsXl֨E8T1Va�$t,gh$ۥ.@�@[RPVI*<t.O!5!ShTzV;n*`U ٞveƼ9kP7 rбQӡdtQ9<!=
    nZv#{eLtHp P#ts:{<''H0�@*oNu6}=V*eB&S9ƭUeݏ`/W}٭e 
    
    .mYuU6oi#XTz5Is5E֥A/$,=Wea[
    z/T?bB^O;D0^X1b)ąU2ޜm3{bDULhQFyb{|T%PW:T0{"߃e{V;T,m%i-cOʆM POZd2~
    Gwh\zyko  s=O&6lQ)Q_T<.</vپgk~ΏmuZ"Co �d	eN\X5*aItyK#
    
    X7>|0&˰>Φ1.)
    ;~Hܷ192!:ܤ?XigyQ94+\}ﺷcXcR;Djl
    "5ٚv$d=?
    �$`'rU[6*7;ZޡI"D
    a
    >v8^KпPh`zuMU&]KJث)$mUDJ �!)zQVtǽ̳EV^*eC
    JHWO$ACD\@ @Jj#[<Vq,JOZwcp29"P@#*TY);;B,'WCQ8&7,=㺐&xv.]}br6v93omh<
    Lya<tH<ʱ 1*v77yO"5s GwC=�*O 
    軳nbcg3Ҧx:ohH7J%Z.cܖ#ϙQAȽVhHqTEqm$bC_ivP,fr/ PLv>lE;eu>,4o
    0I.gB#
    9W.
    uq@�NN+f � fn~49*/߆	Ep ?qLڷ
    2::Ka
    d@pRx i9Mv2;G(B�B Ip
    s�!_vNxhgh,U/'܉XM-M 2OB{s :";xu4ߝ=@$.]cu'#rGKWOȹ(gǓ3~[^+mV0jy\sZ4B	xY2tU#ωbeϙ%C<VsrrMJY7d799s,ni~e_wGޱ|~Nu8 �	}ng]
     `Fn9GIms7/dmw?.+[呇ɞ>)d&ǪquGr͍s:7]޶!,Y*see+YߋmOE#_Ƿ-&5T%bff&oΝl2d9xyYs߳e⹪FA�@Xt577˩^K8S,Gm}200 /y-Ě,wy%k-O=5kJ}27\}*߼YniܲnVd[r嶟E1*04
    j:ZJV\w
     �@NVeQ=s݉ȕo9^YR]y뼆l#(n@h=I
    � �@�	(KXŵ~(fϚ7a5x.:E-n� �@�� PAbmPFT^6bu+|Uꪫs&'c,ϭc)Y<o{:<GjkPf1r,8[}NN{Qo8K{c[jh6sr3\Ҭ󶗕i؆ȴwjߪ� �@�([XH>4]{.[M/uQ.hUJ3yճ2A;u9%2_{km/q>^(F{㿸5!S^{!G,;Uj[9}NDW>m*<7vЫz¿lL"}Ǎ-@�� �@ 9e+cJCw[Ex֛r32+=]Q&׼wr}M|H7QFtOwva	V6i7_:2Ncܺ"e(Ye\b/6Br<dw6+㽲%kZF(i^@�� �b-^9'_~|{=6`&pEKo8ynXzrfT1.m1:@:-Q,GUuŅ%PQUqdy
    )f UEXQ7'UO	MS� �@�I([X]ا1,lT|QbkTP]yzÙ]ʪMHLd)" C;Gd-z+]5[qV+v].ÞIeA=� �@�(@ª2TQx̗uݷIjۿ5\
    G
    )BLR
    sDCY'0l'хaxxG,"8PN!GBmۡN81j!k;dPYLiMa(ur0j �@�� P^WT@9UW4$PՓ&{+\
    '52ixk&tI8@&хzXz.cǮtf)0EQ7kXA'8"rCCu	$nqa9Uj=c\ /aEQ@�� �"Զo|r2z3\ZW#m=}Rv?྿_K;WY+|WbKfG\Qesg+ߘoZ".NE2wJYu\{U_c1mX@BM755U)%^v)˖->繗Ξ5*=xPs2� 0ϝf9˲|LjT*%o@o[ȋg^0r{n;Sk2ZR#|yٌ粉*5Wߓ,/Vcg:Źly*Vm~qZjyL(`GO	^EO!�@��@⡀~ֿBqT[kPMyXZt{e/엶>%meYKߓnPhܗ+_q@�� �V>Ubt);"rZNWMOxro+S{-ZK@琵l<OT@�� �	dRB֊Xڪ敲xoȢoMsr9Yrҕ,\ucZyLR9Í� �@��p.*vRq+/@UR䖏M?,WϞ_,fOjb\~Lq �@�� �&X+LVΥKf<g+v)/~Gf5Kn|2kB@�� �@� P+j{Lɮ[V+r岷9ˎ|u=_=rl\8SI{�=� �@�@E	Į*ş#EP?u6ֽTX^rB�r={j!�@�� �T'ڙ*ضS2jSk(
    +|Uꪫswf,ϭ&P锬77'5(>5-2yU>M~-wӒZ%2.ٗʫwgUQgC�� �@	RŔOG,<
    Ӭ(_T]́/+}NUJ3yճ2AZI>%2BDkzGUdX1햙(F{	SJoA!^
    TЏ.;nN'\>Fu �@�� АbXr{!+<~O=UFT]D=
    +UiHkrͻ':rx\W:C؈zlz[
    H2-mnD_xB&Չ[:eho$|*ms+{[6JOǨ=ZAk߼A!�@�� PUA^9'_~|{=6o߈(_T]
    7a5{TP]qN=ss.LO]<mKG,hb{sKU֕=#*KW*nU	F!�@�� PN^qbBsTS勪UX/JM>{
    OXޥzi܄ǴL+:us;Ԑ:Gd!='ze	K9|3+h1 �@��晀#L
    ;PrlTQx0н朄ۿ5\
    
    FhkJпѰ;`1	*L=[ItF9^KNԗT"=;dPQքiŘcT@�� � ؍mO?(2f*<QuEW4?^yBP@?QpO]'0rN	?CQoV1n]wYkvC7KOI-ʰmO6?vʎ/d1GBe!�@�� P#1oz9-:)=lG&{>~Ak-97\f_E-ꚛqeD9ϝ\|cNni\8]lN5+efԕsUF-Y讅a# bff&pΝl2s{yYs߳7'c�@��?w/KRTJpq߶>ϼQ,wy*4و|0t={6l4}r«/guEǢYNyqF8,o^yty@c@�� �@�X(QQUg+C?'+e+Sv{?.^qYOI/~YVҟ6Z5A�� �@�*K?Kgk!"˪뤽}tʏ'?-gN2WΟB
    K �@�� �P@SxtmrMJY7d799s,ni~e_wGޱ|~&	
    @�� �@�TŮi2ލJSSqs;+PiuQS770p� �@��@xLVΥKf<g+v)/~Gf5Kn|2kBH1ٺhWT
    P! �@�� Pb=VB6	6xgΔeU"W.{_˗^U*A%w@�� �"+')go^!8?G4~1l{Y�Au{foD7=.}Ƹ� �@��*OVfSt]+*^(#f/1r9l7_Z^y?g7jl,ZHO?<xDJWk:%mŕ"[[V{)߾E>5in|@�� �j"P#FguzVE/x^ŕ>*cYd9uJop^s95(][UVuJwuTsL=,W2-_9mo۵EeIm&!�@�� �j 
    &/;w1[x]9Fլ2&pWXzMC_k;Z~	TgQgʯ@=<.ݝ^2,W&2W{er �@��@*TX:sN=zlw~wb7"U/
    GX+TWS~E#td"ԹC;eĸaW(sK-v	KªY� �@�(@(UJ{ub澸粕7멌U/2^,
    +n}*$3؈k``7E6tj	Y&R˙*'5 � �@�UeVʈ*ce!^VsNB}|MߚQUJC:@4{ײG:d<Q2j&p3`<mee٭8cA[� �@�@ib=V~Uҫkknt7VA剪+rrϙrP>9hDzFJl]b\zU湜er&YƨJ,6E!�@�� � !1b|%iv8rqwۮ{W1&N:
    84Uzǎ8e/"}!?ExϬ{kE;̅CE!�@�� �'+BW_|0t={69s_+ɅW_zέr\܍rqY޼f,].֩]j(V;m@�� �@�yYc?yE~?_OV5(Vʅ,o-]޽K_?=
    Uwi!
    cX
    DF#Z	B�� �@	d
    X*B_Ɉ\:\YzYv?C̩ߖW3Z+.+Ԉ	G62&|5!�@�� P*$0y4qrMJY7d799s,ni~e_wGޱ|~f*a �@�� �@Y+PB
    Ҕߔ%|\naz<?N.zi̞VuG&F� �@�@)[߿?t.]49s_!7M
    #%pV7y-fB\{d8׵3!�@�� �X><yOs_C
    Weos`MnKjl
    zEDVx}@�� �@�Xwr#EP?u6~V@#\tOD*ʜ
    \-vUDM� �@�gMmk{g_	5IgvٵklG&{>~}&x<D??p;^UH]uVmL݃rMv}s^xDzx+L<1)5ݺHN%}Gu͹ǻ6r|;K8fJj}6z^͘#ŭm-r=Tξf=..)9CZGEINy 0ϋ;wje<[ſgγ4@�N7;/KǩTJpq߶>ϼl{n;SV"V_DX}!ŷRQuE7^2*aZ=Wʈ+7ee-ܾ99rO<U9%2fN]〘U&soxa
    b>fc+#M׌p4MJiG].׵{=#m/ªߎ?	"`	@�X(IXrHs{
    6-0fDeMTq3*\9/_5
    	|My**T"IM+2<2rvɈ2>c#mn}4,#豽]Ͳ.׵Nl6iA  �@��@}
    3ՙs'	csV2*#._z9ss]c\qN=iT!n;;:wȠz2}Tˠ"GBL6Ej]4Z6&QGmq pw2'� \*
    h*k>яOm=|%Oɵ+Qu\t
    xݒgwH3
    8m)jr][
    ,npMbX@ѷeG#fByQKP@nA_�jUz`k)k$xKs''_8ǯ}O?P27L9ǓO>9/տܟ/Ͻs?zw~8s'G;&s8ow&[zstW:osmWbyczGGsN2Ss2'^[cM<7vmi'sP²wn4Uo3ۊu`�44ܹssy=ccE!�@*؟Woyk cDFi&Jc'Isy^r�hH_~V.]lRbvq~d'\JPWO+lc&ĠLBq:^3z8?]O:
    dATѾeV<V5#FB`	걚wh� P�R<Ve	_K=WY+|Wb-ꚛQeչ3ߕo7-		9Y$s׬[*[RD
    z_?ª$@@XA@�uMaUVV@#Tlʌ5W=^j urEϋs7fy;TTZ0N&viKg|Aۺj]4葍^s]+HuA�� �@	%OɊeߔ]^E˻~\V~iSN_TtۆfMؚI}.?-ia3j.
    eD}� �@�].Inz=rcs*CYq&S6m8b7
    MNz?7pd\
    RH;� �@�
    a\w	� �@�@X?sZ� �@���ª@�_ok3ku@�uZA� P|Fr۟S=7ʇ+h|HR瞖m+j �@	 ~  �: b<}x~I;^Gk}!o׍ň'y:}aC֗~Xy׿x>#|n9Ƕzs+yu4�@YWsǰ
    �@1t|Kxb	i52¤G9I}ȈHiV2bSȹ|{DZNR*)5\C0TzuRvnsJi6>okLV:DpF�ٓ>J aոC�Bkn5dL~aRNiWhM=˹)Y0_8ae<[EʆTThŵ#\qb@�(^[\!
    ]� Pa+_TB*zd;7H'`F;rNSEVPz|帷c@� P8#-JV*7wB�BQ]ϴY6^b%<TJI/̩krw"?/S'sTtrJgD@�jl� �Lz̃VI=(<ae	|^K8[hݭbEtk YcK8LJCUYve[`@�5G�aUsC�mOykDαB=}X|AJ~Fb$pl>D -N
    QxgVPӴkjxM	�j�ªF!�7T0{~Ѳvf5'v0nϪs֞ZVl{;ĖI
    m{;@	 y; �@�� U"� �@�hdF}@�,@�@C@X5pY@�� �@VJ� �@�@C@X5pY@�� �@VJ� �@�@Chj[{3<#JFok.i]*<M|I'
    � �	333A;wʲeˤye/,!J@�� rꅗe%T*%o@o[ȋg^hm{n;SVeE!�@ @ŠQxdvv"@X{A/IaE(`#� �@��"VL	@�� �@�e@X	� �/m �"PU]M:@�� �,BPM@�� �@ j8 �@	T*C@{Š@�� �@L2R� �%P_,JAB(B�cns':&C%𶫯3X_w,Yr\@C B�� 0_R>qߝh'h@�uI|ٽF~Ip]uٝΕ2~9TvcT�@ D�ań� � dOB
    B"D2gC>]r!ͣm@	 zx �!O|e0!yW;?|<[\O<y`
    ו~8}O>oGU[Y}wTdohsN+8n=a:d!bj@�@mXĬU7/^y#,G&{]kdۏ{Mٯɳ;605s9UZw7aTRAJ!K {HV#JgGI@�H3ip3N+=Y+׽{cv|]&z4vˬh5{_ǫ'Vzn~2ƞ8y.~b쬛92|#L;m?xs |qZse^: Df$&R �T~F~?JCDN=\x㢞_Wd$݋SEK2N?cf0@se PV8*@�Y'v#WK&gL}2∳r|\fWe"_V]g"V$6_+I'u@`	RUҸQ
    �*A 6m(ٹgb{n4
    ?O_}"uMYMn?I/>T_θ{/ǘ몬eWD6m;pBJy.O3y\kq(e!	!Ju� Pi+jvX[2މɒTgVI摵n=z6H`el?/貹;Ͼ΅^uk^1WjqJ`3*Mms<+mve׮]ҺUyh쓲OV&� �'^=ٹs,[L^:{^~A= ou{$pݵK/4Y|K%aS7ꐀb>wf9˲|q*7h sܷO3ePY;$yE@f	2t;frk-/�s~IÒPR �@�� pV
    7t@pUdf + ́"@=$CU@�J'lZ$73;@sz)*$*i@�� �46ܐa@�'PjV_=7套^	@`	"i@(UX@ݳ0.\%Kܴ�!࿇ ƽ�  JV~"b4B�@CHZXƪ� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��J%07d rUj˔� �@�� �B+U8]� �@��'@(`H� �@�W&/./CXᵪ)@ �@�� �DVʈ+VRȩ� �@�wzn@�� �T�k*A:!�@�� �"n:@�� �T';]ƪ� �@�W9X^~A�� �@�IpZ*DU� �@�g2
    AUL �@�� �J%Vl!�@�� �pn
    YI`Q{� �@�@	8~U� �@��@NU=u@�� �@�XU,B�� �@�
    C  c}UÌ?� �@�� TMMM	TM� �@��@(y2Y5K@�� �@ 9?	� �@�@XL �@�� �$K c+BLm� �@�@)('�=� �@��'[7UB
    AU>Xj� �@��@5Vƙ� �@�(@ +DUP)	@�� �4j,� �@�@zJ� �@��@h`cE(`cMz@�� �N #ݺ/J� �@��@(QN/!�@�� �d	ĮJ	j� �@�� PBª$U=� �@�H@F(`S �@�� �'UXᵪ� �@�@22p@D\%Z �@�� �&X� �@�� �k!� �@��$+,*!�@�� �"3y� �@��J$@(`(@�� �@'b.@�� �@�(�ªL� �@�� b@�� �@�(�ªL� �@�� b@�� �@�(�ªL� �@�� b@�� �@�(�ªL� �@�� b@�� �@�(�ªL� �@�� b@�� �@�(�ªL� �@�� b@�� �@�(�ªL� �@�� b@�� �@�(%ʬ� �@���wz
    @�� �$H�a L� �@��@DXp@lL � �@�@rxX~@�� �@1	
    ؘN!�@�� �	 IU� �@�@}-U};� �@��&`ĕFFX% �@�� �'`!! �@�� Paj2I�9 �@�� �@ 
    UAȸ	� �@�@v+f �@�� �2	eҤ8 �@�� А2<VF\gC� �@��$@(`� �@�@@NaEh � �@�@~x3@�� �@�9	  � �@��$* !�@�� � � �@��$* !�@�� � � �@��$* !�@�� � � �@��$* !�@�� � � �@��$* !�@�� � 07's[U@�� �$G聰J/5A�� �@�
    JVM
    y
    @�� �@QR(R� �@�h(&/*t� �@�(@*Sª� �@�� `&� �@�� �0x%� �@��
    tS#: �@�� ��k
    � �@��J&KqU*,!�@�� �$Fdª!g� �@��#஥'$0[c[� �@��@\6@Mmk;yrgXu-KVymOG?�" �C	ٹs,[L^:{^~r, �@h޿),^xY/]<NR[
    d9?VUcŻλ@X}CLdž� JV� �,B}aʾy:G� �@��n;k
    #X6@~eN �@`	#p
    POӬZ葦}@�5FP@ӥnAa. �#^[qk>i\FEO]X!m@�KPae2q� �$`'[2vdVdzvdj!G!�9bU{� Pe4++6d@�� �@`~	8{|֪5Vk>A�@0cUn@�h,}B%� �@��2L|Uk(� �@��#ms:~߶>͖X45VRI^C�� �@�
    OV_>\ӭ7_ʷ톇	�@�� �@1	}~uCO3�? aK
    ۮ(vv
    7gm\|KHUf>_}~7s]+@|H~7{
    E53|wC+{(:\"VΘ*&YF&T!9Iq~k.ʹ̨_ޚX}I1"B?\{$8eA\zho$ǖ PB+o|M_3=𥉉ByBY@^VJB	ΣBm9Fv@?|0WJs4ZIW|E}E?*K_kN<Ө~IWo)rtƱf?]z¢5g_h~$D 
    =υ{G\?ZD+\{o83J+Z'o4%uw#:fiG0%KJ;j?׻ɟSmŷLx&vo|so)2to(_8_Tig~T_76!DBD:kXU=,#7&|_Md]?૩I{ܓk%>O
    0THsBpJ!PǞB?K1>Gkkÿ):2;'O~U~w$l[]55,S+Nj]e68JKIB<BǶ\[U*PgL&$UB,qyeKo#NZfcߒ?si]˥W[k	sY/j4s	yb=dx}᫗/%
    @!	
    0u=Goc!V\ɺfyU͂Q	VZ+
    $<5=E b=~Y]7O]/i_>;#܅dfftq.ھ_o-	Q]%֗O-P{mr{9T `.i浓eUb
    y
    fb)0_柳TUƔۙ)_�n46
    kO}OU{Fn6y.M===soܹsrEykfߦ{{@�� �@&}Sȭ*7p,YD7\(����IENDB`��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/manual/images/chapters/appenders/��������������������0000755�0001750�0001750�00000000000�12203357067�027606� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/manual/images/chapters/appenders/smtpAppender1.jpg���0000644�0001750�0001750�00000671637�11377016712�033057� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������JFIF��H�H��>Photoshop 3.0�8BIM������H�����H����8BIM
    ��������x8BIM��������8BIM�����	���������8BIM
    �������8BIM'�����
    ��������8BIM�����H�/ff��lff�������/ff���������2����Z���������5����-��������8BIM�����p����������������8BIM�������8BIM���������8BIM����������@��@����8BIM���������8BIM�����y�������������3������S�a�n�s� �t�i�t�r�e�-�2����������������������������������3����������������������������������8BIM������8BIM��������8BIM����O������p���.��P��<`��3���JFIF��H�H���Adobe�d�����			
    
    
    
    ��.�p"���?����������	
    ���������	
    �3�!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw�5�!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw���?�S##nkvdE}Z͍ɱֵ9�"9h5�Ar"7zѹ�t{-}9c1h_]/vL:s=m_}1WHu6&a%��5{'ĹB3+&qf/!o[VGkyoswk)Zm^*fM{ܶq_~_b3̲)t̆hZUo_jύ[W93ݣҜxkg}Zlݵ:ƻzcYY_Ϩyl	[S~F˟m6�t-ǽU_�-"Qm>
    
    ?p۬V�5UƏחk۵4V{8y[�yƿS}[];qc4-kswc6#}kѰDz57uAe�H(X?wxo:XX�ޥ�5.gzw6'm~'zߡ;u׶FHNM}OSϠg�zrw�Q���upllmx[H9/9XͤӡhsD;3J_+2#�9?K�!?<?L\lc75i?F#gXfKR펮5z{vK{vIl:?7u4à{i#oE?9H$]$9|xPcu~~66_MVqp#{hO~a~;0kumk*{*Շ%5�:8?ene}
    �Jѕϣc4�L�_a?/4GA8	{Ǽurk|{^D;1q03phic;POŀh3|�M�9oOd�3O;O��L|lmgilcx`ƵO
    ]궹q$:.D>ݻ7�ۉd7s�huKm$m}o[s??S�m0c{4_�/5_p(ys*֒=0,Z1Gծ
    ,na{r*/UM
    �em}?o٬�I[?àLMĐGQSJΛҰ.gI/G;\_ͫe.!Mߦr*	6Aqٹ�6?(wpx2oOnmn�_#)JfLx)Wd>_-P_�Q,QŠz\�Y%0t{t;s�W�
    ~ewk}�ܷ�ImfI}ƻvgnwRH%=Wq;n']cK��=;qn+�0wpk=2Oy
    Py}&�S9xM[sMKEUMoՏӯG2��o*(>�.#yI�5\jS�3"<MUA[&l-�IVfMNOݷ/wQͧokm>eL?6?ne\dk99w�1봖$�	ޟ;��ZUnDm4۴o/gOz95�K�#XAA=f/.-6l�GKkĶ0uLk�K&zعw3AoF�2$i?ѸMٿnܯޏK}�Uy9� zA!�?A�!el~}�76{m4oWonhzFe3ݙ{~'	c�|6rAy없c�KEuaoM~>?C�hssvoou3�GS^ngAwnI3[׻rv�k;~ܿW͟�礸O1�U<+d$\o3//"�G;~qhzf@54v'/NO|X�(�8BIM!�����}�������A�d�o�b�e� �P�h�o�t�o�s�h�o�p� �E�l�e�m�e�n�t�s����A�d�o�b�e� �P�h�o�t�o�s�h�o�p� �E�l�e�m�e�n�t�s� �1�.�0�.�1����8BIM�����������Adobe�d@������3���]�������������	
    ������������	�
    �	u!"�1A2#	QBa$3Rqb%C&4r
    5'S6DTsEF7Gc(UVWdte)8fu*9:HIJXYZghijvwxyz�m!1�"AQ2aqB#Rb3	$Cr4%ScD&5T6Ed'
    sFtUeuV7)(GWf8vgwHXhx9IYiy*:JZjz���?�'*c|
    ˹&g:nsMյU[od6	t[SrfۼPa3er/TQ[QGK^qiKO7ȞrveaOrZnTO<,Oq3QȖ+,H-#]1$+<,=qcYn\jچ(]bw!fjE(i{r$c]m$$7)U$T0sGK;U$zw2T^ޣ�Պ*%
    njbYz ?$iq[tۉ�{I
    ~^.uoWY?v@޷*C�=�ca�Mo}gW�=_zܿ�{�~�8m:�@G߸��e/�@;?׿n�Y?~/)i�߰�!~vή�'�F{(K�={Nq۶�uw83߿qE�G_w?ݷ�>	ў/=n_R�^ӽ�a�C{6]�N#Qr��zm�Ϭqg~[״�?^�Mo}gW�=_zܿ�{�~�8m:�@G߸��e/�@;?׿n�Y?~/)i�߰�!~vή�'�F{(K�={Nq۶�uw83߿qE�G_w?ݷ�>	ў/=n_R�^ӽ�a�C{6]�N#Qr��zm�Ϭqg~[״�?^�Mo}gW�=_zܿ�{�~�8m:�@G߸��e/�@;?׿n�Y?~/)i�߰�!~vή�'�F{(K�={Nq۶�uw83߿qE�G_w?ݷ�>	ў/=n_R�^ӽ�a�C{6]�N#Qr��zm�Ϭqg~[״�?^�Mo}gW�=_zܿ�{�~�8m:�@G߸��e/�@;?׿n�Y?~/)i�߰�!~uw�K{آ�K�={Nqq:�@/{ܩ�GʟoFq�ug_߹S{?m�Ϭ0߿rO*u?׿ӎ�Y՟a߿~O=T�7?�>?�׿~ʟ{?�״o�?^�N;o}gV�~?S�h?ߐ�!~vά�#�^*t��7^Ѿ!�C{8Y�FT��eOn|�~C�8q:�@/{ܩ�Gʟ{Fq�ug_߹S{?m�Ϭ0߿rO*u?׿ӎ�Y՟a߿~O=T�7?�>?�׿~ʟ{?�״o�?^�N;o}gV�~?S�h?ߐ�!~vά�#�^*t��7^Ѿ!�C{8Y�FT��eOn|�~C�8q:�@/{ܩ�Gʟ{Fq�ug_߹S{?m�Ϭ0߿rO*u?׿ӎ�Y՟a߿~O=T�7?�>?�׿~ʟ{?�״o�?^�N;o}gV�~?S�h?ߐ�!~vά�#�^*t��7^Ѿ!�C{8Y�FT��eOn|�~C�8q:�@/{ܩ�Gʟ{Fq�ug_߹S{?m�Ϭ0߿rO*u?׿ӎ�Y՟a߿~O=T�7?'ͺê@lEpzknu��@o{8�?]�>Ǫ�ۗx{E�8^�M{}T�
    �/)?^q��G;O;n_R_{7m=S�6'vvܿ�{޿/:nz�@lO߸?I�:_uݷO؟?߿qr��@uz(oϱ?~��e'Q1׿v�c?b�~i�GmO׼=�c�>Ǫ�ۗx{E�8^�M{}T�
    �/)?^q��G;O;n_R_{7m=S�6'vvܿ�{޿/:nz�@lO߸?I�:_uݷO؟?߿qr��@uz(oϱ?~��e'Q1׿v�c?b�~i�GmO׼=�c�>Ǫ�ۗx{E�8^�M{}T�
    �/)?^q��G;O;n_R_{7m=S�6'vvܿ�{޿/:nz�@lO߸?I�:_uݷO؟?߿qr��@uz(BAˣ:tnô66z̦c5Wp[{T^}s5+rv6|͸mʺy$fw:R8'i]$yT^_b#kh`M4"*쨈,ʪ8џԎuOŠg_ԕ%B
    Rn<}6^d?7>!dzv�k6ӹ�]/(`5[,>t*'�O>e'>�=4}(ZO)mivovbn:
     ׷lݛ~۱U4Y_
    K",B	ξ윿E:2lۍ>主_-`R8H/B]7mcnVAԖg$ .k^/9+?V$ٖo_*yoasI�1ṡ?G/s8��m@o}޲OK_Y)١'6-MۛWޙm˹s.?MS[Y;$PD:{qO=vi}%iڣ+q,	
    /!]</$sԎ;wsQGA7Tusw:TR[);)`jGjMr<t7ժzrB1Ce}wsmp͹{iҕԉr~OF{owl
    Q}Fˏˡ_)֒K$]0cp?�bTZ�ly=1qK0jʞ_AkomgbÄs?ZO~8Uyz6;p29jc^	',Q<#�7/9i~Ud	=nr\$`Pku,E(̼1mhؤqh8*@s+jNωxoYv^dۛdS�
    +7!z'vtk0Ś)h)qtyLW>l]{oO(a]Mz8�XdB˹nR[w)B^WH|M�.J曩9Y!.-uѕi1OТݻQMݙ`^UVEQ}TXagj08ŗX1TCCK-ZP
    HGGǷ܃U//lCyi%HT/2)Jʽenmn]_
    n]kcu{
    ;B.](3vg{;|oZ<X9.l!CSUpC=XiL|=>~߻sW0s3G;h],Sml�췑b5*<$!^B`q�o]D
    1Y@ZVёPRZ[{gQ휖iG51dQkbi
    etT+;x8:yUHKoW34oٺ놷*;IFddRjݭW`y^q%}HKpI*J1|YGn?ǮlcvGem]<Ͱzy!UM.GwIFHeW + ~>U,h]mn4P^[*SsHಕA ?,.gq{ݔLDCΈʤ)Eߌ?&zktc@bA7n:suWH+1{
    缶RUVҚ<ZC:U<r:Ex^M�p{ewu{Cp{ehQY!#@$.ԎXy7r?lo~"XaGka̅FvXgJ.;!֧:3+y`nأ-S֢_UTL37?r2L]9R/5j})OWFWA*=#~ghEяԈ%6V*	Xc9yύ#6^Sv�{{1[;IΩXnƢM޵}>+rFcXgBϭn͏|'(msbK,Mek,dMQm`i4)]ԛ,1lX
    IO
    Ĭ2j]
    i&ʾ=OSoո6?af+}Y
    \d;[EV%l:jGdW$=}hgɭ..'ޚCww]>vNѸE9wbf[ǂ(cAq
    i
    
    uqCOBw>Sf%íq[+wF5vu6
    ]łĢI+`~z}imw;4\{7oxk<Ĥp2|){ٿNLv5Qr5Orͺkm3FDZ/zw2޹5q}p?PczNݛnUM|ri6NƮmCzel,O<}~|"|$Knn	T%4r4klxʲ"TV_mK݅\fHT%j%f:dhkd}٘並{Sl1u9mɜnwI]Yd+fjT;yojl#oneU$Ɛ#ZIÍ##ЀZ�.}|3ݵH9U%˸
    !iFV?�2Gɩ*2>GUvLQ	&4hd[\83{"(ƈ](ǢSBhh0z:4h9#x.YGՔR#פ/|w.={llSoǵ}na)3XM˗j,"jjxFT2q{m[={)-3E,JJ$1*ʎʐzAe|׸]mgo#$Go3nIP2+TH||[ؿz){#'\ynzʽ0Samڵ;fVYvzSM\a`ap>ټ՞m
    k#\K{ru)<\HwQx2T
    i%򷳳MMess! #KȦ#!eXXw=	Ք}[\H˷i7t`90c#I1Ao9V7sw7>s?s\%Ⱆ܈̚d́&KR<9f{u.atQf@)%jZCfW\[eo/{;+~{3b/Exڰm/}o|MS1IhTKQf&幡HwQq%GKVkx3Ka!TWyf-N}eu\!n$rQi#HK*/G\yv/4fUT/_n-
    az1UxAr{sɲ{?hyt&FSY�Fjۉ.*�c \;lQ^PČ$̐O=䔽wٝ	3(Cxcf2_s7ܛcaQMS쭝E]MIC-�]W^p|\˻]cM8V\4V4EUM.Nm[-QNn]|R!+GXB> 2v�?3su&}͖m֛7'vf[톂M.X/a>U>b#_y.-LQƍ$C~AQ)9AH'j.k7Ԟ
    |m6uLZ9ʑlɪ6J4��{o
    guWՁ.6(_Y7vgƶN3m<O%~̹GgRN>>m�wQcvn',Χ± E.>]ѦiLFU##\`hB
    ޳QG2ԝO_wJ܆['&n?kdi+kz:f
    u+-y/nomxFy<
    Py'&`dIh1vlt9~"b}7!Ŕ2TnŸVdh*To_U_=ʼ;mG:E<p+p-T)|D7CcȻo<eIV9<Si+qw-kܖku!q#DѢHeôQ�N3!~'i}ݸ͍]QmiU8tÅ$<:Vuwn
    >>7%Oo)/Kx"=/)sdV{ܳq•)JIQ}'^wg|t0vVNx#[:#A[#%.2*դ	2:@ZNKM6b]i.&j%J
    64fEa3KM>^l9Xl76[O(7pkb+eV $i]N:(wE_VNm6?;kov.]={ܹ-zeZ1	Fr{.֛eػ2 S.Ĉ>x'Nz˵nplOc/0Bᘂ-K>[3/s޻s{	۲+ڻ/{�w.?fխs4x|U5RA"SHU{na?.Z:$QZ/+q(GeDW`]UA$o-vVܣgVhkiYw
    *M�+}-=/{+zY+qX{bd2tp$x=ъTVi#VE,<fΖ|nkaDcRp@4hzE;/ye40JIF:{�=?g>.~?q{Gٷ>M�RgN>O]~=</կOVs;2=uhîjx㧚ύ_"؝tuPW#q_M쌶�aF|
    Q\D稗%l"!>yqwX[%ėIg{Kf`
    (E$tNS渠.em^%so0Y`L+(Rt~QIӫS_~?fɷ'ta}MSShwm|4O\)*hKL}v#-.9d\syJ.1(<_10EYÒCf1|2xZ5aBtkQN6wX>n9{ltxmA|^O
    YM=rA4Mx*/ovfxl[I./mKQKwEYT7g2Ň*N5{ţbFe	*FP%XPh�xM?A~aڏGw;S{?;_Wݛ؝]lv-׻r?"yxF
    ,~’N"O'@{rV~ng&F9fKeErFZh\́Pʞ./]s|w0!辢9Q"iYasQG@)fT�0?(?vT?b>4On;;!/p캪M:/}c=ypgj2OFTR5\]}[�{?\csD/FZ[[[I594H%P[/&snD$244$J6ezR0G+9.<5?cU:qT=UʜT4[[jTQ슭ɓCOALҽdwvrV|Ӷ.𒵂,o;YrnVìFAwWdDd%s!	PIHS{ba~2o&߇|_L>Cuwn*;bݛvm͗۲nl%$[K԰$Wio}!ĦD@)4922)vbFW:IDx^?eM@kPYjzM`>=ߙޫ!ۓVGsuc~m}0Wgv;
    Qqte)Yj)Hڢ WțVc[96ܱtKyoW F`UQ!hۖyslzm-$	o+L(	x�+te~E�/_? >0/?e똷>հ�^}AQmmwsE5MeY%4}r'=m>sFr;c5=&7x䡉$`ek@>g9K`c-D5wrSV*UK?3Swuԗ1O;lum>Źn+W˃sBj*#4."ܿ%l,o<ݵs-،i5\&	$YdQCPcZQ.]o~{>a$#D8yUJ!HvJƋɿ=dtog:>0tw}ڴOa?Q7U_QI&:imG#$]퇿\/5{5{'0mZ=Oq{^CX
    eJ(ߜOO#2웖ʐ:.;2=6[םq/)gwcz׻ksy\wm͛޻Gbf蠣xںN"(o_2|k˶^~5DAW3ZS5(=Ca>�OWطs[-NUx]
    ID[RB҂�
    OyaWֽA5jl
    AջrCz7<hbhhjŵ奯F7-d;H�vI6;'ޞ
    $VR37f
    @mmJymYobuO%rF6~lԛ:o;k_r/5=Q{k3{mL) _+Q>ߛy?涏vKxJ?JxBk�6yf|{K9	�HIde,I%u55@o״}oj>{@߼&�}z״}oj>{@߼&�}z״}oj>{@߼&�}z״}oj>{@߼&�}z״}oj>{@߼&�}z״}oj>{@߼&�}z״}oj>{@߼&�}z3�%�x�F__3�K3߼
    g�k�%�{X3�5��~~{�o�F{?a�?^?~?�=߰�k`�?^[�ўo׵?xs_-�~7??׼g9�gxc3�K3߼
    g�k�%�{X3�5��~~{�o�F{?a�?^?~?�=߰�k`�?^[�ўo׵?xs_-�~7??׼g9�gxc3�K3߼
    g�k�%�{X3�5��~~{�o�F{?a�?^?~?�=߰�k`�?^[�ўo׵?;XY6SLmAlVY~g@H:)$r#
    3lMګ&F8|s^oeM�G=w۝_UYW]O
    .iЁ~~~{r)C0I#QqǩOw	2JiDc{vOp]N"Ho{9rn{fmA}kus-ҿ/^wKwnf#)7+C9
    X=S+,)fOQ
    o[
    tWynQC�:~CKEs|hg\Χ?oV'${bv^szy7_n蘒bvQn8EmL$s"|^_C}ob
    ifHDԗY7kv
    |$Ae]$u!\XYmmd"*UiIpVAJ8#&�V.N+;Ovf>L,]XNQ*ˬ?ώihjK2c|pqy.P۶oĞ$+-uRQ:[DKޮ/,.n"t8T05 m;18V�3jDdO
    y~,>(Vf�_'~w_tZ=ګ\ճ9=ugv(}0� @]c!р7n[Z.ίle{q|KZH4KABb0ԔK[],5Dx!J*q3rk0oF&{IB]�4g݃mӚ_zh武3<qXw;WEx㑓I4;"S13{X-ؙ^[_ż.ߵV;}ôi7da$PfH+`ݵvݎVgy{{{Uy誯8DCjuiy,&oh#}VgovHlXlͲ	�wUh4c%:``a!
    }@W*B3w36z{}Ts%	=|J+ot~ΟQ:Ѥ^l3&Юn{hdk|m.|^LE|sQe1kBjieV="Z{ɜWCkYI4*ZX0ឹ!w2?w3^6VVPG*)-C?ڪ~c|"
    gunܴt8߻Wen-$mb*$cO/Oݳ,l{sŴ39nTEt-\G<q(aiR
    ӧ^=޷dK;ibU
    TU̦)#*e�@Ff*{{7̢[2vڞ<XvYMՍG\m<IxA/7[^s˱Y;x3R5ɇJ:�B(`H}&&yN%"V2uji]e7M5#|(\˾>%/^~Yje>ص]$Mͷ0Y
    N}3q%Z镠ȯ/m×=Wfugvm顚+Cʑ~,\Jmr_\{O\g"r3m3M$PۺٚHh"Udî|B)Nx[ll�~Ta's{{7
    WFWhf1]̴an<t4WnmϽ~6r4H-%#
    cuR"YCf\o֛UJGI
    `x@oNa]ה�oݹ{i3�17~,�ov|m_il\:S>VSSJ(B~{Alז7MrtR(\ǷF"G1Y Gaw+{U۸fE]@VIYRAa%7YfJBo}u=_𝿊}=hyo&қ_huV59>~T&qQG!JOp=ͻyAM]՚K8m]FDEH	Y݈/y[F9nUjݴD@hy�fP9)
    :[x;*t$-7eKT?ps1]7ns1m2#qOnއwP؃%{
    yiVc.wW0s-x7WI S5WHdi-!	qrǾ~~\~ꏗjNVYY䀈"KEC!R5w΍Cao0k쟅wK|heՕMUs+an"*䍣dmϳ[.@Vk\5xnR;XmCknDH?w=ݛi?;xf4fhi5tH"i
    #0G	.#gaT]O~:wmw^>@dwzva3si툆Kbga1U	oKJaqvܧ)8vUBZ]*F/
    50ī=m{fΖ65ɺ3ʮ$HB+mDRDo#�Rt^?�"ٷ~c_vW~~YM
    M.MS�vd*SP[oܓ=W[@Ϻi-[uţxB2IxZS32,0`HHIsl%:Bib.I/#M-I%X@c,KIdY?y>_9~\VKm3Ey|mXcå˭R$kqˀ{iO&O~
    9Hĵ]1RrP$_zyo-uJ
    (x&
    r(2	#ơoM߷%rn{{$~_
    0{Ug0S`39<*Hbv7\ra-6]_kueoѤnn%Xf[{<HDSBTqD[G\g0wr[x]ΚƄDbWvh(/EO}+?eß6̢ٟp^DŽXޢ%5e͈ː)%dJHb>r\W-	eDxȩIo:2`6u/mk;G4o	2ũVu*(gňHQBՔWg=?Gzww�{{;6.n33	ltoq
    ǸtË>9OAIizEuo8{UŔ?O%ͱ7W{LMm$alee&i9:H͏s{|;[\ڞmynHko%tenxVON:_}彺[|@uUיu[H:f>-(wLv٫;(+E]50z>"{S{%m{ݮϽKX4Q4fwSE":+|kM8~l<.u6B ao
    Y#+jĊIcA_t;;_hu�lnNK=,na豘:jIhrR{w=r76[봋0MQlvs$qT+3e[$b:2[\/mrw.7t2]$jOAl[ugݵzg0ؼ!}]f;Twml~@nM˹*fg8,B_bps6o>-]I#2m<hJDs"tr6CfiP<&+dJx]>CwL?d{u�;66>=;;Uzulm퐐\nS<Ux餜={nX?�*Oek-K'4&A)RhH˲Ԅ:C7>Q6dvm-6 6cLI=aSE$
    6îtcur?ofqTm_nmls~WϘ922J*_o|sN˿muk[R}鬥H4"T8 v!$WY?m]w}sTݦ -KnE**ђY4J	/�NL|v�_T6|a:[7s#2e<|'/H28ғ6.ho_toW cno%GpB	cK
    G-m;F Y:4#$~+s;v)!$RO4vGdtv�lY:SUTN8: {C1o	YӊMۻz|&
    XC%NF:&DY{gzoiy6mzG㰼mL䮳mQBx+>_+e~b&2x(̲DӰEO(
    )!X
    ~Ta>sm	Q|m&ܸ~<N܇iŜ[ov0ωfU\~ٿc6({z5;v<(#ZGticGa]5"Cwopkx7E絎FW(&[w@!\*i�Uw&>ݟ˫zN|-ёەT5U;|f?	**f؟m�>�;.So۝aK{	m-㰍6UI*Z	KmD
    f`oknZk[3`neJѺOÚ/|=T~�+&AGEXmظɶ>wpQU{9
    ~.u*G6a}/lln/?vøW\\^Z-Cc{+,mx_۫>yg[x{hXa'Vͤo
    m(JI#2m<+ǩ>AtT#}bY;kzCblz2["M~W
    GHq<G&pssY6_ra$ʖC=ckKwԪ.![[.4mNh+O|wz7>NLokW6oV#@Ca|;Vm?lfi~ Sw1?]_w.ө:	t5KeGch*|e~<͵GsAw<כ^d4NKM*ez+Lu^{XۄI>׺\;[+ķ*FE;P\j@5N=ޘYxo
    '-~CG8e�Wz9w^,>WvVAIEE%Tp3F{k͜,>˰jʱR[XC
    ިuk&X䐳Kԇ9S,y6bܢeDHJWKfZ=q�0Qd2vwُi>
    ^g2\sfma:8+A3;vrIZo.s{�<y�m;I
    7̞:lۡ6Rڭ
    0dIW{=m=ϖ̈́W
    4O3,kZA1]i*4І |�M7oOg^/iAvOpt�n6OIE7ؙ:jr~&*`ugVeP7m?ž*[06#}>}ZW>'L<?zݮ[3sR6ͷa4.Le%f)cDgU-	H%`|Ŭk=gJ{ބ+W;vfJ/͞7_lCxm|/bV<8ZzjZB	sgvja/^;vC8xFܫ^GDfQʳ/.Zn[&ٸ2[DKRHuPƭtp`mؘo
    vW[nݿ.cv`6Coѐ<|�/uUxZu+j5CwOrk)Ͱn;фr9ud
    3)=Mq
    yZ}4XCQChm5):˭;+cIw3vO[{o:v
    hpoۻও"R6Na	˺org4r�$Ic1Zq߬V<Pi-"+1k*i@Mmsԗ[ݡGIm11'J:M]0H)v~˦3߶s_fqqTm_nm*\umAmhI&F[5lv%~[[뤆f_*1]uE	0m\;/x"S}ђY((&&+?�9Opɴ`ڕ;pQѻctbmZmܛ/=no7MNQPKPJ"/1{y+h{f[&xќA\KtJ1Hujr3{λ'.;0+kF!xc,UN2Hnʊ}ӆ�%ݻcw{K\zuЮ{[=Ʀz1[7jhY_cu=.mϺ׼d{ce]ZXBkyDQ┪Rrysg1ny}K%	4R;#5b)~#|΃l\]BQ|Su&J=*
    )*Y+co&{7$݋yKב`7+qj7niLs%bp+x	k{7ڝ}-ߙ~Ctu^2-n'%H
    ?�Cwήޙ/]Sw6kp,Oٜ_wfoloCc޵Kdf)Ͷ*)rGI-R̋#}۬~6\߻`ݣ!pLw0@dK
    RTUqzmm
    ,Y=KnہdG6Y`Q!E߿.4wf�:Yl/i;·odv�Zfv8];竃oWckhYU3
    cܛG_vØ}eb?x"KVkK"xe[K.u3ʂ#H#õ9nd#iWX#] KUim$*"_
    c> Wв>(^mGu>z/Vvgqu>霖"z|yː]Ur-ZK:zHWmr,n7>^x{6]X.ڷPܬoễ"\XHw~{M>�>9+$NM,<7%D#WzUorn�=-yY/Seڻ'+2voud!*U$fO({̶~{s/)Iuɻgm=ǁ9-n.&hu	a	u	C1{s[oy- 	a)Zh&Hh	T,$i4J{B92~8:|f6p7�&'+[ۯ{=z2atv<gr31c2ON?SnmeOvlanW�$$2Hc41-eW[ykK	9ܹco\:A"'kyJ+U"`ݽõ{'w3M-k;1̸*v'vOֶl'A1ܔ~V('(5{>۷!=E6 HaI[ {D.Go"okZ^p.,\0'DRԖsηPnjydr{+lci7
    .\L[&dzZ<1R~E<R˗ⶵkToo
    ȂHDq̠,i4q염kqo_
    E\ZֿSU�WDrQcN[GUO{^G+m}ػhgۢ0vZijI8*2˛,{/s-eE�x䎪xB0A*ŒN׺{͸uK4m8x}<U*PhjjhA?Y�_=QGub�x�'uC�Y�_=O߾�W׿�{׿}S˯ue�S|?˯~_^/^=O.՗L_߼?�.z~]{/?x0	]{?V_1~`ub�x�'uC�Y�_=O߾�W׿�{׿}S˯ue�S|?˯~_^/^=O.՗L_߼?�.z~]`;fPH"R>mn@OWӏ?̿ͿR�~__׿2�6�K�G{[G}�7^�/Mmzg{/sow}5i߾Wu̿ͿR�~__׿2�6�K�G{[G}�7^�/Mmzg{/sow}5i߾Wu̿ͿR�~__׿2�6�K�G{[G}�7^�/Mmzg{/sow}5i߾Wu̿ͿR�~__׿2�6�K�G{[G}�7^�/Mmzg{/sow}5i߾Wu̿ͿR�~__׿2�6�K�G{[G}�7^�/Mmzg{/sow}5i߾Wu̿ͿR�~__׿2�6�K�G{[G}�7GK0mig-/=U�|m\/ލd_GCN~`~KmC[�C`�~靛_v'oWŜ;jml.f	}əU'Eo:i>lCES.Np|dy�r\Y{kϸrtf/XY+m.m؍3Qk
    UTwQmGY|}k0"G*v	B-&+<8
    q%Wֻs}vM7U]vY^sdkc)جrx(uj*6Y#k>E̛)2mv&^E8%7D)uR%P
    H�ĮeId`BKQ
    I^�|}/"+G6U`�ӸX_xR_^�X[yk¾NURN=ܵ[wS|-_:l۟$N
    }כsPd$ڟNޟڪKG_UuUO'7<\'[Γ[ϲREw^].7x&h,FR1Rg͇eޖ>q�FYcԯ18>h*9q~=]bv*61xv7i;Oz֮'[[YVt(b2(9/n}=/}~_ڭ!rI$YosN,/oUQV�3
    )=DXYrv÷s{}<.'n Mյ,ZbB+�`:?]͟jNȱ&W4)9`}/@7r!';Q?ϯ?;(*ڏM%Nr0Q>Jnۉ|\߬19:|KemLT\i^R
    =y"h+mK{},…-UY}ٽݹMf8ٓcZlx$i
    la?}4{q	r�0|^[-
    wbqپfgMysCFxEyj݆SO\rs#+Hر' $gFxN|mu[Ag8YlkiU⾆+iWT@nI [x
    S쵱=nE-fG~OKXGbåi7>Y�q\p=|lm{?)s+W	g=?Ҭ�~\ٕhmڕco?Kǿw^j寪940MRiYb{3yC,^��ͬ3mo0]"x:WWn-NY{O~3^3pcXjT'P3թQQ$Z܎x#Էib5W:E7?	iٖUzʏ_5A�[7WjkJ{/?�OHU_m�m=@K�4mKU2:{eE�P}@�%_�N/%Z6·o�GX�?L=~:�;Pd�~�l=_txOk�m{W�%I��m~�pd�~�l=otʟ:q+纳y7g^Tnߔ}5#{c.Pm
    )3ߑ{?nrqhizv!7`y{"n~ön1]Sȫb%I]:cFfB-0휿H[vEjOhMcWP3,H#
    OMG*Om`�ƒ'/a;�W_dOk�mw�
    +��߽_2ܿr��_?eOk�mu�
    -?��׿_�ƒ'/a%�FT�׿᥿T=~:�<>?O_ֿKG�9K5ĩ?zu�x}?_[�//2'��i�r�kߏ8'/a'��
    1oR'_?_^�+?2'��
    /I��m{�2ܿr��W_dOk�mu�
    1oR'O?_^�+/2'��jR�k߿�BOk�mtO_r�k޿�B�"{_h?;.Om{_u(Rܿs��W_dOk�m{g�%��m~��
    O�JO�9L�4Ĺ?z|v�yI�r:	>�ё?=u4N?)r�k߿�Bu}�"{Oh_;.Om{u(Rܿs��OdOk�mu�
    7$��׽\
    O׿IO�9?�ᦿw\=>;=~P�~�l{t�ȟ:4M�L�Go^�o�
    /�탯Oi�mu�
    7$��׿[�‡'?`${�FD�׿�od=>;�=P�~�l{u?ȟ:s&I��mz��O׿HP?=ui�x'?�}o9?_�Z�'?2'��
    ;?$��Ͻ�[�‡'?`g'�o7ʐ~&IcoO7lYR	
    C�R:	>=uc�%?xq�>�d�2�{Oh?'._?k{uo�
    z	>_i�m=u�
    3G\<~8�?>��dIXٗsO^�ir��[߿�@7Oa$�Fe�׿G\<~9?>�P$�
    z	c/��
    5?��W�'n׿I_�9?M4Ĺxr�~տI�d=_i�m=u�
    5?%��V�'n׿H_�9?M�4xr�_}տI�rz	�љ=4G�L�G/�[�
    A�[�2��
    7�%��V�'_a${�FU�׿?7d<>9?Pd�~�l={u�ʿz4F�L�G/��W�
    /퇯WsO^�h��[߿��A=�*�{Oii�x/_NT�ƒ'_`#�FU�׿)�M�G?ھ�'�AuG`z4F�L�W޿?uO(2ܿu�~;*�{Oiql<>9�8S�
    /탯WsO]O4Q�r/}NT�ƒ'_`#�FU�Oi6_�j�
    Oև݃e_(��
    ??e��P�~�loov?ʿQi�m={&��m_~�}�I�r:qʿQi�m=u�
    ??e��_P�~�l{ovx_(��
    ??e��_P�~�l{ov?ʿQi�m={}?M�G?ھ�'Bu}�"�E? M��j�
    O׿Fg�e׿?'l;:8K�
    /탯+i�=GP41�r/�}N	Q�…'_`#{�FU�OiT_"~.g~���rzp}=ՠ+�5?ᨿO_O�NS�‰'˷_a"{�Fi�m]{�%�t�;޿u!�On׿DS�Zں5H�K��w>_Q$�v�l=oOu?�U??Gg?�N	R�‰'˷_a�kOjԟ �ܦs�;޿u�On׿CW�^ں5H�K��w�rz~�џZW^�h�_S?9w�poY?]�^�_3�{OjR4q�r��l~�}�rz~�џW]Kg?N
    P�‹'˷_a!?W��
    Kѿ?9x�pY?]^�_3�{OjԿ3�cǏ�'ܻv�>~?W��
    Kѿ?9x�pY?]^�^�꽟ujo?S?9x�_pY?]^�_3�{?j5?E�M��w>�Qd�v�l={/u�U�h3�cǏ�'�F۷�?W��h<8O?�
    4.ݿ퇭��꽟uj�x��l~�}�I�rz^џ�W^�h<�8O;�
    4.ݿ퇯�꽟uj�x��l~�}ӿI�rz^џ�W]T�4A�r��l~�ӿI�rz>ћ�W]U4?_f+�On׿A_^ں'}|y�poi?]^�o3{?jCoz/ݸ
    π;bo͡}n;'U7X^硦\_A(ꠊdsWu[Dnͽ[]Z",;GÒX%XeI"7H~rfۦ۱A(&Xf&*9oDpQ]YAB5oUU 9d{?v+-?L>{ˤG˥�_\T�&Orpd{1M52#}H${VzDj><#"
    Ty(h "Hfo}# R o٫{⯰>
    jÃhSn>8-=omՉS{箷~�Ee+pY|qüP=<y߹;?^F}\[n~`'%'82#V{^rܼ?s.m
    2Eѓ>2c:LCl͟`-z}2N=/KXk�FOzht՟Ao6⨦�::7ػʗOG[>/
    ㎞cTh*$.-~>*/B$CC-*qaOGVt?iݷ.mȮ) GdaMKP#TïOσ&;zojdh;{6]EgsJ}aGP|GPGcr_mO%E,RmO5_ڎ][K)6=HtiY6Ċ2 }u�7mx1.9,XQ|RIp*z}�d �'?-;ŗa?̉M#0qAW7
    zɘ?CK.�m._Kz\|uù]>Gպ>lFMv?>sfţةM
    SSHa\A6|i}{a:ʐEKm#!cM&u%D
    (j*:%O$j%MME**>q|>IήXh2֧|E4qXo5ܟT1Yq
    �^!)<^'ok/&?0V\}]caS
    A-ot;o_�;�/$�ߒ~
    ڟwj{�5?=l}OIvTt_$+6qvvm|7c~M3{1+@#goAEMO(ㄹ;q(@sN
    �;	н�ǻW:?v�dSua~ڟv(eVsY m̾?Uxuoٱp}=s7/aucz6G-	jj|x+)AU k[
    ��ꮓ鍥ǾIvWnl.F
    �_қSzg7>cWGނU;Q	sh<=�zc7GmM[[z߈On|B.m"G]t.cpCv_fYےf0y)v}=6Yi0ԟ?^`ߎ+7
    [oP;w.�x.ڴI=ޝGMIq5nrRAu՛)::#=ЃPz
    [;ltF}Ab3IOqՙG;",SL^}VVU Q%<3t׭$=.nf|&#zc?|Yɧߵ{
    dmn\_f8zDץO
    ͱG.\:-]ay|nn
    Q]G|u
    VU
    tI*+xԥ+г;cpw^#9̮Sm]1<_mzMgꭗxh0lҝyz}Gž}ngl`q~OmSCm/3oM?em9Brs,OlwևI_S:j_?ڽ[$g
    1ۢkA?v_ag9<{g7DCPViD㭐i#~]hoރR[|aΏk݉2�]6^xw+io>k;F!t6/vFNM=^3S=<?݌AujTub89߻OGgdfzvM&]iEzm
    U6Ie]4Z6W"+׼Ga�.�ӿ'�wO?�Scϡg
    ;u{_Rg;bV?cplY۩ܛ(3M8#+Fȩ::	6ς;cvf_w7[u'O+vӹ_ܼb�-ٍU8SIC%QMF6"5Nxe6lm7&ylncvOnMTUs&*:Y$IO>҆dC))5˲zw>$|zϲzttcEx/])YWVo;-lINSC#/.b<a7oxL~l]OGgdgm6M&]iEzm
    U6Ie]4Z6W"i|!5?}ԟ%v_?FOkvvqMZWMQPKQ>₽)t^k!}?#6~]I3ڹ=]Ck=;ەbi3xTrLA# Ic-M$qhk]h
    GMnWAzvRWr2t{_7@A)V=I*yki*xw^g.v�ewpꝓ|vgp~2oWV햳~�읳1|y|oSSUU
    UF{ˤV�1O[;7;s^}_-!=ϳv~ڻp5cq^,DgZH�OWy{�|<-oz<:ۏu~}>zNiN|]z''}|G.[u#$W[]o>ׇ]X^=r1׽ӭqQϽ١ǀoOZ"]0ޏZg$ouqDi1Z+l��믨B2O[]\X~ :r=t\k߇Z z^�#Ϯ,AN=h{iJn^O><{^^A2
    pnz^�NGV&wpEOJu#yo3כo> =y]_zg4G+׮8 ׸b,}uִ|iN1hq?g\G_>Ձ^Q֨O]{9�[:y'ߪ4î6>ս:?ޏU>}u�czou.?SCc'ވZu߽p}u~h>F:)&Ŷc91�qSSŒ`4MȲP㿈<p,
    h3K"$pf&4QB.+>o?�~�){5'O~q�r
    m^pC[I8:~.ߊ
    }D%"_t*u&L
    LC^2X8&hk`Q>*WQQbH
    Dg*�_[Em(ʾ`0S̎=^&iz�cV�qSuo_ǾDu�ɺ^c�Đo�\];�Cn&�ߒ~ǵ=;uwY�nV�_wO�=۠?ْmп07^�/�9�fvôwO~8ؿvS:9ʌ6Ft?Z,�GYD*g�.{.O;?Uz;kŽ㺃!Y-Vת.�xQIٻqmŷ
    ո|ۘ;_va0�"Ld n<c_,2?Q$u+~/j<>2sg^Pux3F͓ak;moGeΣsU];ûtvv}ve?Ư;_=[Q]OmUJSb厬<T]'%[|u<GV|3/qWEG[v'Av;w&[gvnz29KEIvST ֱ?oþ7iz{{e͙j}#|.̿VRbwQ?eT{ګra3?qLLU`]xћz�8O[o/!󸗷VvQont7Zo
    ]Zcy%ۙz|rFյ}=C+m׀#F{֝K=Pl.?T>>7?̟W>'hvǮmй^vc~32sQfrSujҝ<_ncTU?'L|}-{f{~FggUmMA쭔z/rݟ#t||^db7�`K{#V[vd7{s~nۓw|mόF_'Y3!&z
    JosS^�_ފSbכk=I$?PͯrqY/ǟݿ7=U[qTQŹvÅ:ހ6܇Os:~~oV`[K.u|󛳺vu6K}_<oF7:u:!IAPzu ?]q5 z{*[Xn-bF�8;m-+"|(Io;7}0=͵26I2-M_ոPt<叕�Ss8>Dl{Wl)=_H~
    p=AG=ۿ.2K9T;xAkgc&]!ָ5[kr;s~^a
    �1۩>lXOM>\b.p1{|H?/883~�|Cr/>ػWeɴq_v^{?vIʃ?{:3]56Wte@+ǯA*5F+�:=y7Q懱#n�'mϟlY��w#T}{\<�Վëѳt
    ո+M1;s~wkۣ[{飨=ߕK1(*2VEV[X�ϺuUsv﯃9'|?/|;oc|g0wNPo7pck*p\.:ݏǢ�s|ܛ6]>Muydf/\+o[ez㳾'U?�B9Y*;9bR`uڤ۞~xT�7[z~#Vߝu񢖧/NǷ>HwN{`oJ%G/=[C==YZl~wڛomfhryl\8jmTp�7[GV!ۭ~CwX簿#̞SvoSmN:;'ͽ]MKpUcphSh
    y:OUsٿ-z=au#]g_`,Kyt{M'juF#d*?qCUЅ4?m=zVQ�,i;okvK^/`~7溯EX[zgr|s!:fK~El|Nx͡_!q6/JW|שǡd|'f1?
    ԳobGlck`{+:i|{w/m'PdwFЫ[(A4YhrSRAn;�}xJu}#RtO^Wyx@r:(\y^y(k:?{ב|^<7^]o˯}�\ֺ蟯z8uߺ]uׇ
    u:O�{Ǯ?Ou׉?>Ď
    I4=oˮ'}�4{zޓ׿}׏ϯ8u[>ǁ}t8#NGWi뢤�O~ꆥ:�ӫNzS8S֫_u:龟q~c_{SϮ
    z?1덴~9|k׏�}Ӂ={^�z*O\-.Jg7+\^'}zu]Z
    +ҽtE^=l믠=
    W	:i^{"t>F:_ހD[߼^&q�OuuNOdu�cMu�D҃>պZ"{ވ:x^h'>Zq>]]k
    
    Z8j\nN[6jh顯OA'zfze4ʬn^eG
    i"8)RJ<zuMpOgn]޵3vק[ᯛ;QWR66&5nO,m}K,0\$iQ8 \iE8D	Dۃ&Ӯ{vV䠫zhjk+0)1TVPĔy/mn�[F+ZP�qHI|:{t�Ua�sWN��ȯ/�ɺNb�Ď�Zu7_ZWϿni_yo'-)ɭ}ZieyÍZVW^]bP?:؏smF2=8?�?]<_YE�{na�F�^=ЧG?7]n}?}Oq�_|�돁־�q9۵}O�[|�#B?7]m?}OkoܞG�O�kon.M?B?�}{Ë?7]ߩ�?ǹ�|hML�Cu�S�ko�g뱑�0S�?զ?1�kzb?�Cum�)?Ǹ?1�kEb�~6?�CuۿzO�C銿7
    _\W�C׏p?c�{oשG߳
    ?<�?Ǹ<!_Z"#S(�vͭ�?	־1S`��W�j\�{otO�Cuūdq�W}־/}�ln_M8Dž־1m_<�[�C??�}xg:
    ٸ�~S�_Ş[~�Aud�/�[�_=M=)i}l�~�ѩD{7
    �kԎ߰]{cy~�,־?o?.]�3O}~:#�zo~�AuѮOcEi^,Gi믾a{�G&dM�Z#߰]tk{b�v:{�G	e:oւM׾�{�Gx�M�Z#�{�G%??�}{J~�Auz�F�^$dGR?o?_}z[�Gx(�ޛ'~~k{^�vz�RI־D&q}/�E?�}[տ`�?]}kS�K}��>#ߵ‘�7kF2߰gk�#߃CO_^:+ſ`�?^}u?�#K|?�}hh߰O}O�G}�Rp?�}oտ`�?^�o�hYM�Z(|ѫ^?߷�[�=[ӌO�Zy]}j߷�4w�h~�־DVt*TO
    �#u7G_Rv?u?
    �#ߵ7G_տ`�?]"Χ�ѡ?D{Zkݕ߰?sڿu?
    �'j{{Wyާ�ѡ?Dq�}{տ`�?^�w�ho>Ҟ$�_^KO�C~�_^:~~j�wſ>�}X돟�{�?Dj�}j/?qچ��O׎Ov?ߟ=?_~~P=�3�hz3�}l2u�<S�ߟ}//џſ߿�3�h~Կ�k�־U??߿�3�hz��_[ѿ`�?]}i�?�3�h~%O4ױZѿ`�?]yN?�'ުmoF_뿸.߿�3�hz���־M7i΃�go>T���}_X_~ҽ�go?ħ?kꠌ�?]yD�~O�'ގWǎ�_^/_�OD?񗴈�S�߿o@7�ћD`�}D|�ZqM-׌��OG��}h=^^ѽ�u?�'߿NDյb[ݠ߿}�rc�{6n�^|*1�O׃go~v躟�Ff�ߥ�)1�O{[y;Ct]O�3~�үT�}l>_뎾��W
    TSxv�?^2v�O�WG�U?_^&?G�37�hu"�$�}l~_'g?u?�+ީ�q?_^$o~/O2�h{9�I�ZcC/Wg�e^D'%$�}WUG{_g�N�їE{ o#־7�?]kŗ�e^D_ڻ;tO�+P-�sc־Һp�/S�L[ڏ7�?\ui#u?��+ނ+;aφweoP~$�}x&/Ğ
    jV��Em�s־|6_?��-OO$o~?��+ߴtOko/o�FN��m:?'k�7�?^f�Ο��E{-:?'kUc?Z3tO��+J�|2oS&_g?#�Rw��hz)ji?̟^@ٟ��+߂Z}|2yYɿQUuN骜'WϿwո߾`
    :$6_"5
    F)-
    8Th<MA0��?SL&�:�MPOð�Bo~*?O
    S?v۫Ǹ?��?ǿ,#���O�&/=?nN8xzƭy:\ci:f$o~v>J{cowj�5l?[_kЏ'oYCNLSy/du]O_ϝ[YMM]MoO/U1b3Qc!+D4$}ZܿrkՎGv~J2\$}՜UǺ;<țuIh_.nF<"]1ѱ
    F	~<{ͩ/'WgѦj
    ASUV5T,f?5Xvjd2ܵr%s᫰w	S;f0'q8t!UKSrMh1NE_BGOyֱ?_~o?_z+_}`)z�}ӯǮ~:8`.G㪨9V[vIMOU[aY]͒1TkWLx覍<<
    pՕ)]HEExE.�h	V>2^J@
    ;S̎gvqG[_jFYW6zYt>Ү2JMP!q݊_YJ[1p+pB+SJm[NeJ	_GH8�X=`qk]8>Zu]$uİ$y�SW߸˫V괱_)Fn퍿vQp=yӯib7&Uv˗]1Nq[v6$PV`EJ?u3uIn5ڼPT3""\ടivw7,:)^X;[ryCz_	Z
    ϱ%b	j8VaAKXY&I݅TMhXz|:p;�KNe#<7'd6sW677E/Z1V}i�CPA#{vgJHH9�X�}=uH
    �*zyz&tS'�cef3HY[��r/ۄCN6Ь/zmjn[=.&\dڸlE5=4T/*TM^[wr0y5
    䅠'Z,4㎌l6&{TBZH�2HV8ORvn:CG ?�aȺ[?Oz[@u+p}IKtyĀ,tR|ۋ�Mop?7M#6~W6;o.u5zʜ3UZeYjJVrgH7%u9hZ4+8`dt[wgqaq%hHXQ0 *AR	҉XkT"<�^"�C+U{zIs;ko涎mS!ٹ[v1Xqj1Z9ĄS`Ǹ-$+lLj"D��$];{DP"
    "ߊ)*Oi1N=@y-lLM̔v�ȻiYN+�*OH~IAMwݴ2)ymj*}7
    &b,K7f8cNsG@IL)施#S)<|pr{BF`uiz_?++m76NʭG]+fjQSSt26~Tdvk(Z]UU<uqASeH0k2$JJEr1!qgwf+i"TӅhTJc`i}'q�x�S׋�}ދ
    u⤞]d'v!-lU>NZ-Tf#ifX]B(${G=6E+0	)PĈՈ�
    m%#
    ^H�2HV44J~?:�nWJ?s]�E[ޣ?j`[W||v�zu7C�]o%֟Um�[zSm}لXhkfI[Ƒe9
    l1_X6zc38y)HJ.b&,2
     � \g;[((He%H*Aǥm{j:cA_^7?Fگ�mޒ�/U+ZO\$4Fw`]ʪ" H
    <~
    I
    IN:)eWD8msM}KۗmI_>+rv^Gb=3STCSH �xI."~M~L$<XgO&H.WH|Ոۛon9kJ,0TIGYI>;/%@SERd;ոm6jJV*x20%]O!*|FVwm'W@hxYMXy�GOEW>ΕӮ̫�x�8׮&AߏRxȦҔ^]	�}ϭ:wM{Ҧ4g)4pdq4{z)nݮUCPf
    'Y>[]nH5xU	u'{\7<|quH<H3H_"a^bڮ!j"34谬*F,D\n}Q
    KJS5Jz:fMۺ6Ynmݶu4^שjw5%tu[3nn<pR$4bi+qt$ՑE"[.-<k'CWG:s' Aל.&R<"6
    s9!"E?t
    \LÀx�=l
    u8p?G[׼sWiïS@Ȏ��?KU8%M$qWZ�
    ;oR<K=,RUeIf2ܞр<ُ�.l=
    :,唂R$**kiu¾ZL_uUQQ;,7)WG駯ЬśI]FڛK 5z}Oz 歚=dw{k{ufQJj�0J(+Z
    t)_j)A)CNN__t=h`*�{�zjzR3*_{:5U}ԩz뉕H+TzڎO-�i׸%Q?_t9s5�{G[t,fQˋ2�+seoI�J?YX\ߏ>u
    tڛ{!Q՜W-4A mUqsCqZ?gy!.dK@
    4ZIt|
    3[u>lyFhXa^C^+5|7FS%-1`|fIrĿj\9"3$*Ǐb}nʹsW�WD|&>ZvmLlrAnOb>eLp=:IC';cirzr8)T3#d)рxJ>5ٺZF "S^ݸX6tYJGSPEiA
    A�:p2�W 3ю�7�x�=xʷߏNy�x�1Nƃky03*=4%:CS+6K/ 鱿63OV	O"~
    &fG55*,{VK0-�)q-~Zk('cm<IhfJ�lA}9I:_Wt&>Nu^x<_z*E:E?Wީupu~}5|:nx<}AׄWLdN?*Nnm�X\<��pk؇<�\}:_ֿ$8<AOU�yz�ںşי-[k|>?_�[(<_-=e۝['hf>:edn~-(+4սSp[1͇j\sU&O'h)d"EwJm۠_"Hh!"Pp0J\:Ǵ^w˗42?'"^z.K3+id;7[OnY]1F_	9h.ْ:Ty1NK>m,w!;}Q)V*QIt#Qa\:zw`l܋٠}*,QxhR#vڨ;[qwk1k	M6IY[YUEǭnS|45u\1YU*d<{W:a`u9ѨX鏶
    U��b
    QF|U'̳NI_2X}?7�ƽ4m85fNz3N
    Ǻ׈q뎿O�{ֺӭQ׼�_[;zO2
    q;{
    Nw;V6Y$Zxp=UC)	e0CKw2U~lqp	{vO$3ahOUص&_dgq>:-h,r㧅)a]C!Ef2��~ixdO"4
    ^S0ro~tćsRf)A՘
    lv:@Y
    Ze^jܙ&FigIIZCocm
    -@�Pqz.$y.n%-3,O=(�kZSϮZ[kߵj	\VKq^^z{k^\}>�t8?\C?^d)Nz0=f|4�n!�:sܟRq̎U71fkbOfPdWsA.PCE/Xi̡lbkn7[g>kOٚzTǵm"hqP\k y5zнja�uM1�q>P�<]wӏk؇F@\X?}ƩV}w-�׺4Xytg}wt.�tGi7�g-M�ooT+_>㐆U^F*
    CŊG>Ԁ_x>̤{Eſr^}RA׻.1$ͳN:۵1g3X8HZEWcL+gj/1jjE<$j�L]Viq}gCB}@ժ�:E>->L]Sx>F
    ]YWfڛ"`sRSbM4r62	%	.�_\mр
    HuTjNچb0mkfI0VIQE 2f�*
    pMv2H7}3؉ijᖃo�}̯y)}Y4H
    q9gS˷
    3g,<)ݡ8҄o˸mQ^Ւ)S¤%V�SIb-?E�~(+~:?<Q'˯b_{Sg:kɾwv#iPV]߱NRt4ySʞ{7Qû1@?'6[)6H0;ENcH˨{ZatJn^2mҹNZzjŹgbee0Ďni'5 'yp}[QVŒ>Nnx7-)%<94E⣸ƊD.>(pG	+mnk*-4Ty^SAZ$O
    f><4QL MȥRWt*(	�R�5f>	xA4xdU�
    	nET:?5rsq(S%Yq.ܭNB*=SPQoUy>)㍻
    g�㡀TSTMJ>l}rmI0&T GqFUpT?jt:?L^5u^c{gvN|f
    0;r?m�觞hcemLTS<r7eG7=~].-JXXܴ/PCܤ-a$
    -F
    M,	8I_DOy.A?#^vRby7hnej
    *ZT)$V"A:k!]jWRVSN+,Tt	ݯ/iVܔfmukhL1M.S4M˪O׺{�[�vMjnG@$RrڵDPmhB
    ,y;+d$81YiVW*o]R_'v|I;`e?;{m.ERsHz8��<]
    wf%xtPq;w�|op{r&�m5V:Y-?^O#bZ˿)ig];&
    Y@2jsy0R)'�߿lEc%Q54n]p%E?6R~U9=+VSoCعNMߚ]CP$Ω׹L<u!UKJA[7#
    8*~,'Y4'X]ʨ@@,%ܖvXW%0ᔮ1<oPIcSN&(fڛ{m.^H!ՅjL5&)&WKV`KPO�N2mC,e^[ށA"Pp{d_ ~{=nb`MVƪ<6a3*iQjv&555t,PG76;ͥؐrSď*
    Yh$F,BI	(+R!ط[[Ģx4UҺXb0r�@C	}O
    SOB*Tw_iJu��.R}V/o}sk;a[*FOcKڻ'/Pl'JsUAH,);+eh)AkNgO;{`K򑘄#LҹfҨ-bHPź>#[y7VO^Ulf1x䎓c-
    ׹ʊT
    fn|t=+nܧk׸	Јɧh)Lݛj۹NC(`m:6i.j$$}BMۻ/oav6۸lNchXih8i5
    ?I+F#8�0�rSp/ktqHŝݍY$|O}^xtNk^�Z<:t[-�jWl^ku?>&?3=KTyvTl*826XzQ}5ףH5b3JT!?۵81ݟi^ID9w~zB
    ux1ooE'eiuS\;7}g|lY?g;Ӯ~+1dE-Ft-@>`$YQk+A"]+@U5`i\>Ͼ|1[[n+MPʎB
    +&kKձk{vbj(tv"!O%k](EV3#ҢT".=y6m)
    Xas&n|;*qlLKJt ҧIR'H}ktE�5ڪiNWν%ػ7v|SMg=0�mU^Z:pV <j#ڋ8d~*/3&u%sتI�n؝չ
    ջnf0g6flp8^2c|*]XrNdѬ*QRg[}vm$@;CW$àu1\}ڭMM
    4NkEpM㰛ڹ,U>::ޖ=TȰCk{hYOMe^Hw טlnK�TP1[Emy];P$3ឌknڍ^WٛgdfqtX*h-c|Ef[.k!.k~bx^J'1S11.dvBY[ObI
    H8PO>*P�+Ė~@/ӎz赿_V}i�o%a1B3Я6+�ɽzb�=UsC#]'R~�PVEPcqyI8U;tYVihͤWx7mgb3ȃ3Lgf�q{՜.QDd?Mve9Lo՘ؖn)jqH:̿wT\4767!vkjoҠl@b�Nĥ
    DSJ-{['orArjS]L|omϴ'd6Ѭ[MK㪣bir+\]-+VIGF%#4u<ͼeYZ,ۍ	wk֪f9p0sg'{_]rZ"Šj!nV9,?˟W'A::]<&7#cWYb4k*iPRy'jyS,'\w�9#yMtxrִ?'9n4nc}J!$9B$z
    ZUx>Wˬ"uufu<~mUMəLgd@0L+&2zV<X0D ~N{AoNʗtQm*q1C&nm*
    ̑e&|e<L;hj*($O͞,'e,
    US+6Gi娪r
    NiI$"mֺ:TSYڅ4j|yL5NF9)&UtȒrسtE0xSOۚ=<GbúLtgū֎:?׃[E]x>׎:_˯u�z�&EGGz�pkؿ$y_9#ǟ;犯ޒiH�voggj�n筛;yj++a]%v2ke_A%=u
    u<<SC"K20`f]dPc7FPA\S,-.jShiOE.J[FUPyd5S<XV.\
    w]'*@n)Jdb҃M*mΡs돜^s}a#G_pF3kĥ*!᪣GR<HTL/Vʀ�&z]ga+Mv#z!\83@2O).Z\^J76/7.RR&3n6
    
    ,WkOGALT;*<ka#E>#jͩJU~f<ʧJM( M?!@NI��y�{A:z�8΢8wQ8};{wfۻcbN{yEr4j\m=nFZZ*Vx	>^b>pz%IHl>dolȒٸ~a﹐j2S) 
    zg㫫|IEzɯF5x`Sy^M1իh|*]6~/-{W|Um-]}Hbe	oϟ5ZbQh;KcPU~j5j|dk{0͸-(.z@q
    N؟k* oRR)kqi%n[1YaS)A4/�tnxpQ>d!__/'Fkz~�"E׼^G^\^|#	?6�_׺JcA_�jǮo�ƽ՚VZɊ|]ro\Tc;-RHnefF:ԙ±8-VmZI,Ǹq#<+]{aμ-soPƈ#$cjщ*N<^f$ys?ܾΒes̄�ĺY)X<=-v['U'FV!W!@^]8bFOh,Mp�C}mhrʊI}[7Ĭwlt<6K3f)'e)h7?go-ˆ5Ta"M	}*-5cE%X#@ym}͜%e5RV(ѨFԤT`ң'�uJ\u�kީ�׽p	{9�^A_f!?~�{nVۛC#v5bw71޹=,7auf:aD:[IwMMKy#4aêZSOϏGFm*Jp4z>@~ώEim,1T6/SiU{}AGPQRGM#/rm(X%<QGPG@u9vn\SH	ILFr<ӷEJnMԽp]wō;Zf]וl
    SԑC|lTx(x}ͷSo뻦!C'#5{��!:{7<�'Ҵz|OP0u5M�)$tݿwkd/ܝ7\4AGmmʜ0dj0VTHҚh6r}Z.tj
    "Qx�WwWݶd7ϸJ%rکR8p:?h,U{UI6[�g^Ņ~}Ht/�y�{˭uїo�{)^N�i�y�{^>Hᅭ�?obve5&۔{c3�"ʓ:g1zYѿ?w
    PViUOZ1g\ǻzT$�yDS	J;3=\W/V377ر4Ѫ8eOA=�6&lnYwvdf7K/ܽMءTOGWZ)+$$MeQ]AuhUX5`J5~S=a�.{ya,_$gY$5aS3^U:u|?zZn=C9_|vᆣ%Yw|ny"3X,̳&(!J++YAV0_3#$
    PGc4jIגߑyRg7[LI&[@@C0H�װC�׽^'?z+ֆJU.[G?n
    Ӂ``a	W]k@8,StmF_xLgWWɏi]ۖ[Ow-TmqY]C2tD-Tn@MGT_vƶ2[ql
    	ӻ7N3nٛ'/In{%ml\3hQwY2άsdpl♠ic�3H:\3#4$^Ou'UsRjr>|zCq�%붖?EKw&k+ܝzH#䷾X�)IhC.ymwKN]ݡc	ȃ2 toJ*[\<Ë,ʠ`r?ޏBQl\죷svVٜS1^9
    lNޭ;ǤIU`Vy1e&v$
    
    3
    ZnKytӤE$hmFƱU4Qá7?n'_D^>v�nTkť??l^J_*m!X*䪧`T6J#dwoGI*i?qfuy;sU&EGZܧ]v'a+h]ΰQ1Ohg(+'tQcnX(BڻIuj"9<㱙{U3B2P'Y_fornogQR"z/,OUTج6;41vJ$dGrTog2L*<PYx|ZT1*"7~3NmylX#v ckWUs6]a\=Y;x7lݩ{O'E5lٌ3|%m>3SCX$yz�Mx%8SHS<b*qFfo�,#57HcG]�#~]|;x?fy.k軧{oOv_1fm.w휄9fGLNC0I41Db^*M(ϯ5 Zt{�_״3ǭ>?~Ձ=:s�y�{OUYط'ɈKnl/=a3]Uv2(-6/6)&zTqS
    V:8[F1Z@%j9QR(11xPP)	;n|�gg.l%KTG* <*!Y
    <_-?xAvOG6wfn.WNT5FzHi4TU(%& ,CGʢkq,?<Sq~?8C.r)fų1
    #
    `6*Fj^=;7�
    K]'Ysm�zsU;R/بQy
    lWvٴ7Rc>&Y.l6<f7�Z0*$TRB׫kPo^?zk׎1Z^EzqN
    oxӭע׻Kٱa;c݃-Zl\8[
    O$$<}<զnC!A#mX_hyv(>MHY yq_co`
    {nd7J@ȍ<A5֝z[r_۷Va]k{u#QUWʕSGd'ZM>4GO;YX[դlZY;W@f"ݍ.DٹFPnS㓑l[pkk$^c?Wq˄
    o-+v[jhh&_ےpdW[$}{:NYI.$e�J'y[
    m~3x)K8?Y[0X#2eO�0(=BU^->kQ30{vu۱+knM1_|ro8Jveq#^?o䷍KX{Wsa-Qx!P!@J!@@I?Ku�8P3:N*Ҵ
    	zOcuggA{n-$B>�qM,#]ѳddq[]ILO_S,I4&ﹿrT*<2AK[Hh+N[72$3K#-JPƄSJw�z6?yoNjk}nnT*T:j2jettM͞w	LjA8U(�sH$wn<;jVU(^*F; =s}߸LFKweڛ
    Y_3V<{Sq`w]6۲btn<tT,2ELcq-gŃM5r
    ss%+U8
    P
    q8�ugEž�_׸@ӡ8=��-1?>ߒ[׻6/^hv#;{l5eFkwzv^}_mώI9TS&2![FYXP	9>_ZfкHY|RFT><>}q,ݳnm|K־.\dR*z,UTTxr+PZ_Fzڶ&礶s4-�/lVMݾG�֣#:-)z~>vT㦆16_JUK"[T3JFXHGL^]Bmpuh姩ݨ<A~xܥ@{;	#,"^ù>v^sco,ٷ
    VzΪ
    2{7C/̆m$xً-q5VVZj~s{ZnSDo NYr>$5<PF)N7@fO24vA\R�+~=1FkUnՙͼr\&RjJI*icJx\TL-v1AVֆJi„4
    |!oow_݌jn1QRSԨ57:6,{#Sdnh2{ζW-XvSCEB	kaBh3cރ-7CUm)
    DAFa=M&ϻ#Oۚ)!MA2雱2k!ת_|돂|>7jzme3੻]>Wmງ+(7
    ~"<ո(1,lKW©RN
    i3N5"(4ՂJt9=px
    Md.,d觢vRcta#ת9^ٹv34b*_p=Rs$6k)<n[\bYQdCz/  uɌꑎڹûj3[s[pb6<S6nz}K=,
    s wi*^Q׻+qWab=~RYj$wJ6O=a,^7;#~O@;SXn@�Xltޛ}kn&
    v]&;!BQ1L%[OL^aLFcI(dQ	$H̪4T
    >Pyg3vztӥ=,nޛ;Qt8|^c1hᒏqRb3)cH1 #44]ڛYݥFqMH dyӇ5h0Rϡ?_�ƽ뎻?^V@~?k޴ߟ֣kUc{?|?�'	:ƭ�Gi8Vֿ#
    _ACT1c�ݧ\
    \v�s[oLoݨMwNWv?y΁nT|uEWx3?5YZ6ݢj0yd^N@RJt'vV#iro깲Rl[7qcؽYQa_m=\&ɥ]]E6p9jhfz+teyH@rZ.[ԁ_y{˨g>tgut|�Jѻ<nɇEJ}vt1cڻW!
    PXHgLABs2z^?8~H'u?mڇY>(7Nݱ:n?Ǯoѐ&[�7e5{mm*	3txʒ,T3!EMsn佾mSɟAG�U- O>g?مj\>M؝4'UtÍ{,?�ٳb!a>3b(}B>Z�:8grN;5E]yS׼??zz3Jכ5ׂWϤGF+NW|6cvf۟�M:kvo804?3Ӷ`jj꿉릊h
    $j:Jb/r=VtV{Xv]ٽ:>o=0lOIivagrŏ/M\"idh暍�$95bIYs{sx*Ut	9??,�z~ދ_!
    8_b&?pmߛknסٛj~Im
    )+1
    yruՔ<|4L�a*i^7#�׺ziQ^&?5^/z׮5/޶ν#H_|�#�O3H�[�C7w,WZ~}T=>{la;Ӯ>?Uo>n<NbltV=rd9_8I1CEQO5=-sM=;u5t3Sx*\Fߛ/Re~:7z|}>?)� i+Y<Mn=޸i%d#4SQFbTqdi9Sajz"xx&Dr,R+$HC)l}5A\RXt�=YYڻ&/U\ӏjRe	ؘ<c`]]NۤO,PGK;[+ܐI8
    >]	7.m}fܮDJ]d(�c*�t_7jznF}rn][[poݳb鮍ؒdzqW&?VKOCO%Bl5*
    VEI'A5=nݏ;c7Bl?=Y95||^t_t|2*h2lދG-$U'QG`j{+@+�/^@X??t2qSW]ɧhB4׹f(_qt2??uJuP+L;jznN}rn][[poݳb鮎ؒdzqW&?VKOCO%BUjU8p�^z~}-͋_ǽq[){_PnfƧ*}8W0],;ӼO-D45R[}ycl"))1:F4<jI.Ǹۦf_x~0\#4ex+ҁHRMN�{0?ЃOϮ>kg?kݼZz�ku㭏>omѽSԝ'ub6&-t_}on~흽ؽ{/Mtvė#ջJa1~Zzy*TR*OOïF-׶kunw/z+?ᨱy)|&Q28't;(g˷IEPU2M-g.
    8\|U8F„PAk|}.Qm-7Kzf
    l.FW
    IA#G~[Kd(aT30|qE+SRC&Y制kOb7HAڤ -4$~M?̷:_}?��
    )_o#&ӭ+_:W0#zB?_5'}Yx+'`c+.��[۪î>Gś=,T:6+"W#
    z5�q􏶵|-1^uoΉ򎟽w/c
    xϱ&|.ٻ}-vx-SN[!STԘl~F9Ʋ28]$W,⣁5>]PRz|5?�{h2:ǎؿ!:~ყ$E~RhP΅v&|v߆J%eCS}/&M<3I%?ppŭ5CG~�	Si~?{ֽ'|	Ȏ鏐+~-4-͎=C9,*;IdTյ+sʀH֐to1ץ>z][6}=Y?[nE/[�g5_.0)e^9j6nVw5UAMV߹yxn3!KO5Cx
    kOh'>?|On쾯Ulyw_^y}7^?hC=IոK`AW.R}F:I7$dxsО5.�<8}4SIOPԓU+Or5RM9:+(ub/b}fb
    
    *=>mV*XCQ|&?�o[E:p=??z/N2]��׽kugA5Zp=ӣ{6'qNM;+ggmme:o,rU~{	CŊYZ(h;$`jNF�<i֙y#O�_گN{lΙ^.XOٻCp4;3QM[YOB<T+Ԥu5}r=~۝םwpI6o~uoozq})n)U8Y*40ҧ1V0&c5#3LJ/gW.F8̺LN2hMe@-uWH^Qt{Ԯz�'ƽW˭S4;5U["힁7tN~tuWw|u}8plb>)K]R1*PYl6ź֫$uք7rH! =1.>^췞FUxQ\B,cR#7ݽ۲!]pR0%fs¢hGՒ.Hf7>wo{
    \úmIAɊFOϡR8n_܁-][ɖ)gXA@i@)/]{Dv�Um̖>޶MT8^oggqlkGJԧU	4O0.
    5aHUQEqT9	_n;u$wY$00:LO5/z�{jyu��\uDâZRWu]f
    fuwz/<n5?tVf3db[uNG3'Qb}�tum[0d8Kw"h:8m׶n,6hi"H(~m,{j,>{ yK{΢-ϕ[[qGWC{;{=AEOWO3Yb�u7.+*"PN#
    Y
    f.jXicFBjbVy;�(
    (Yf{M;ڃ`kv7go[ur)"#֩S04aE1B%<&䊓Lj#=-@4�Pt%y�׶	[xr=?K^2O[){Rߪ4i_2_j{ւg[p=ٱo_$>7{Q|kyw�5[<z٧?'ݽ_z%ڝv/;vm};3sdw7fo͵n݃cx՝[x1e]Diyd	NHrh�'' $gϼ}gibq{0i6nzKvwvnuqfjg1l].U6TJ,{\>jGjrRS]^MuT7Jfq�"vIAqFkSA'ޗ/=뮉M۲_]fvYmch(6.5u~'	,0rTHUg`)}xlm-̄.wc+yz ,%A5Ɯ镁\z*5AKQ,N'Gi)1u4T88i)`R8UDE@yyygf$$ԒNI'$ԓi$q XP�(��KkZ]9׼�3g3mbޢ*1dPdrRUeru56;I]$Q;qŮ}iA\p=K%e
    >bczfL횣"GxUtg�L(bxԯH-Q>	rT(ag'jl)[1oI鋝F2r+$]QV2|VXKwN61Lr!MsШ~dlGԟj[u+@}
    ^VL>GPGᤠ:jXH"uI#v7gv,ı'{;;bK
    )`=Km׊e0<TVm
    &Z&ܰʒje!CkQZ�ש@O"NI_׺uPSrxjiի'�ƽ^8u^[5Eׇk޵|3^-�mM[z?]u#Yw�E!_Nu[$</7�)"@;o#o]*�z]dwg>|xYzo`:w",FKq�2z3-	m:Z	s<'ĈIv3^"Ӆz@	gA>Y<}~Jum� �k_ڳ5�P|S-;}͋%<Gjm87Ʊ#W<N|uh2&o}9-P٘-;nmw@//wωj.ݑu
    Y6O32kZz]*j<=E?g&.ӷ[�Z%6Fνݹ#{Ώ
    ˛?Ά[Ϧ߽A^>
    2z;Vl>ݟ`복7YBX$>.=x>/?įO;f3fvvQ1S7gsiSe\ԥEFzj.RʅHC�#y0ſ+9s\uWߵug	DžC?FCƒR:O߷alL}ۜn9vƯkQ|˴39X0=
    ͷ8:
    QK8-
    Hal�>*+C?sUu>srlͽO[a7=m__o۝-յ/6`vXogSSmUOŵxm¹
    C_M}}UO5['w_Ϗ3&O#)_}Swblvv'|} ,W{oqrT5cӮL[G5:wΩ}\~fϑ=0e򏾪^dg|V|W�l9~1ݏnG)MN'SJ�)JM1ZW'{}�LO;,Wުz:q7h��ob�fc1�?5?�qZ/�q�k�._j<h)Z\)Xê'?>n~=O0Ct=g|O?{a]-~+nmy_p:nњL�lY{&vABG^Tᎇo�ԝћ02w.Ɥ|}ۛ{f}Կɏm^op�.평݋ӶZ
    3rO?pGJK5#$9z }^_,t}-D+w�)]U;N;."nl]qg^nmU׻3o}И5–R)\W^CGA״<>_'{/ǐk�)L|~G+?(?w^
    ~OMdIqY]](k4;nT̴
    >ӨJ
    ?auwvɯ_>ҽ~BM{lͺܭg_}z>GV�NK%e϶]s8d>R0rHi	�~Rn�mc:I!3̼o^GoOY|z-5rcޜa.M<
    /~YiՎۜFCۚ7S\={I5ggǼh;guN"ѺFu^l]Q_+{n-^3o%~8=)|.TpN9rdyQE>ڑ״#=^E&KͿi`t<?,Ңbj4rdx,&?~~gNiO%e4=Oyor"+߭ŧ{}�sê=S�O-˵;9>N[ue7Q|mϸ-G[v/Ⱦn^=K6$<}.^W\dJ#Q#A`ahF@9SDO:wG^K++;c/muNno?WduG{O[+ulo|9zS3_{
    
    x&U?MM_LE8`Co=�v~4m\?E-(%�nݱe|4]/{#؇:o{W1~]P$^]FN=aL2G
    g@T)[nټr.鿉?�p_ݎ؝?d}՚nٝd?]?9"dɀ)Fj3}l?VQ?.�ڏV Wߵ:�
    {7ȟ[jv.scuh|1ns=g9qnZ_]/ܽ?{~|lIy=\$;ȕG:$qv5WB2ȭSU+S?
    ó>~Rn#n]Sۗzb6>kvƞl[79;/ln6‚=A9z;ax~,*2œ0[V&tL|JǏka'l?YA'~�g_v폘3^;Qtȉb΅\\;s{AL>63rYUedQtF*Jx Së_^4׻7nA:o`Oc'v1ufۧgDw|Y,OOFHww4pZw1*~'Ӈt�g4?n�/�{?ЧG2o_r
    >T|:SOz/?~7wwſ;bt?DLY{Osy|�GKsS/�-
    M%L$�7b?m?{WBǧOU�~U2۬+j
    '^;̈́}Eݛ{^MNJSnSW㣂*;PÆ5{H5PH:^p?Ϫ9Nww7 ۜͳ?v7ݝսk�7t׶w]ݛ=׽{�=&vIQJZf3PQ(kEE	4
    A*(*�1_F�=}u̿9[6�͹ۥ>d~)ɲY|O_>,nI%?ɥc+5u,2"TsN= ?OEp/ϒiٟ	0[Sb@�C''_1CGKENRl4ݪj6Tn9&25Y[6Y`%NurµkA~T^.toӵ;CeBkYѰ>$a6~nV
    zd6bu6ͽ(q2s[%[#h$TxdNxEj~uk:{=;XA'uM�s7
    V!egqS4UU4,I<&e5Rď\*т9;ên?{{}݉�[<+<W:[}{�}=hy>4wC謧P
    ?:~gv_pG;[s|~�(~@k6ˑd7Cqndi
    68SlLq,F&YЈB5OcΟTJyOS뎩MdS_yv7wPEˋ;y/fbGuoW$ŲV7}oX\f3u)ݽILj8I`ɥUԹFM	!^kSV=6 Ӈn\e`me_ȃ(^򵾃+EZ|Ğ�թ׼o�i^k}O3~rw'g][[~(|J]pݗge�o;jgcnZ\w~ʼػ Xxu4xJb4y(ĐBpppHGCA[v�Lh7=�#4�1t7ǎ쾸ﳺ�T�+nO;Ygzeh=<RJU:%@!*57p@4PjGS8�?H_S�ol;zSmZ^ן>3h}xw~Fްy2/$Vq唢ܷ8FˠV%�Nrœ
    uUFI~Ϯff__biػ>Eu7m74_)S`|Y{k3a]yllw2
    ߻)6}x)
    IQu jr
    2
    +VQc@~jҜq�OCm=}}39ɼv7SݻtG7>{smg[72ehep
    FjGDh`�RČSSOSi֝
    F�J<^5+=xźsyYNov^רTw1=j:;*!ZJI2l^1*&CUWM�y˖�<MqOSF}wwkn|_mg~Em1=U_wF!6ƹpK]{<dgrqP‘9kI-utQ
    nA@U0mzxb_E7^}77͉>ilPܤj;k~迎˦~am]x<fw`u?pߦGɓQ!/QeYI+.3MDSB
    0i˜�%VoNZwVݔ;qm<�LuVS=ߔ*f2{}%V?M떯wJ[飝j.
    I:Ploj8T-}WM'?9uk_z'S#>V�}ujyuWO{˼Gb-�egwO}bd|k۝%AQKr;v?TgmLOdUXք%\!!.&EBEx}.v�{=ìO|�D[|ng|[I7Կɮ_v^$)2X]FeOvMhXbj|%<s_0\F�z],_{?Nt|͜�1rYNږd2[=񗲻YCﮃ{sAC%M6G塊I*_Vj'pw`SM4MJgƅr@=x?u;׼j#t';,q_/�<K}IԿo^VR0a�V>߿b//?�ǏU~W`My;�]8
    }]Fk:~eNZEzn\b4^%X48(TPT˯JZ�NGzkr_u_]|]ύ\/>NwПٟ_x|x*Ysso#ZQ+YL
    _&084I$eN<Gxt_ɬ^ ~>Go?\'ˍӻ~1&ʿav?tvtc{lwʽUr,ƯfD]%&%R0<R~*7m�^QW1Rmxz]޺8{WnJQGqS[?v#6yjcR٣gE/d\JM1M?OO蚒?kUӨ�[ʽ{q^";YxHfRWˊ;s-WEUGQITx%J<'ˠ{5	'�#ʦݏiټo
    I6^cRMNVz]ୌxq1}A5fVg76CrZw<mu^J'Tݏ--UlC<8**RdQc %iRZCuǶN$PS|Q#3rMEaIW)Y1Vn8GCB??Lgݰz-KYZl7Vޠϳ)N:L?SYv^UE;oᆛl)["kG1H(hFs?:id{nVld1;=[]{#eWnlσURH,0*@z8{~+.׼y��c]{˯y�}˫M3\p��=xp뉙y~}xc�ALu��v׏}g�|�Q8I5_�Pk2MnawV_vB
    Ϻ�!ݼNS<h}5/h|8zӷiNv~āsBv�O$\//M�<_j�D]�؟j
    n<_׿ҕ/ڿ(;�?zKc|Ut{F}"�ĽUKzOVh�?^J?O�g}z~[B?QhQgJg߉
    nb/K�<_j�4͜-nE�~/Mc�?ߧl�you!*~ѥl�GnkQEx/_=G٣�?{s�(r�oS�Eg'U�9[Z_?_F�ڟ(7�?z-s9?[kJyʵG_3?Qo�bM?9?OUG
    [�Ǚڟ(7�?z��9?[B_?׿ҍ(ڗ�IٿIz
    o;S�Eg'_?I'ZWQ�0gi�=`�I?O
    ?K�<gi�'ݿuiG�\�$'kJE{(�);7�?~O^Ҥ�hҍ/l�Kٿ.?O)/JEoD�؟iYO^QoD싃�Qh�?M
    KÊvW/rq;6_ז�mQ|Mz+,͋z|׎z)O�aԽ�؟iOt�D҅-.?o�b~K?K'tZXu)>/f'_'zWI�<wh�=cQdQ|h�?^�Jv^�Sީq�(~רu)?�اRQd�y=x5{(R_){3�OzǝƿhR\�2�\�3ר|Et{>>3�O~={:F?Gn�Sߩr3[kGP��\_zkG'�_)/�Ozq_?_>x�M{.3,�~�In�T{?L��{'vh�}L�qu~�&}#5}���c�g?;C�E?e�*=E5O;?�E?e�+g�wxu?�~�S޴;νAc7^cj�9\S)/e/}ui_e׭-g=8U^!h{ǗN>y�O_oD�lc_]
    O��دhQu�~1_>��'}P߳]�1G�1GeU}L�߳$c'}Ge_ug[q׏gю?�f7)5+Chw}Ûo]Nߡ�ߨ}›xuG�<g}Dx:O=b�^uCow*{+�xs-֨?uF8w�W޼)-Jju�=�دxs[`!_:#ٿ*{'�_~�|>4�>y.�S?{?]?7�EOd�-�_w�=�طxs}:'�%ٿ*'�_z1Џ>E!F	�~fs�~M=o.;>6fŽ7GQ}zN]c�U?^�Wm}�m�xsR�W^=xu3?vH�[|)�Gv箏f'ٟz
    n_u_E�<e�}›Wׯ/3W{7�/׿u}�?
    o]oOE_̡op{;"�ch>t�q�qG5څ6#|#G^ǯJl2�ˇ+*_軱7Mz5V�[wO4xkrԨMi^"˨2�t3�>-�LS�?V$>=C3Vv?�bM?z׮m}��_o_zo=Y�{^n9C�<fŽ›)Ǯm�6y^[egc/^�I?v_�_|	׿e�{7c6++;�~f?ׁm�_n:?�?^^�I_�_ߌ3>}u(o�e}?v7�bMOS]oWiocq�x?h�?[]͠�W�_޼	~~îm{+�عq?�?^\OfP�d�o�zyfܰNa�Og_qxu??�s~}g5O!C_~ccVq;?Y}mJ'3�%?}s>Vy]bSa�Vzo?z|^]
    ޻}Y;+w?Ȏ뾚?"(2zJzۛ[S&:c#/Xm%OsynV;Uxi{I?i4ꬮeP_zmzW#.{+K6cfM}ebUvU{꒣KMUM4&7{DٮKkS(IdY
    O8kէ4wbdV*pfQ��4 W|Za�wc~g�_F>zŌGMBo.v0mh	U5mdW(9!;nn]=GCOz�2_tߵ~@dewOmɶ؎Y]ym
    Ue,bm7xjXSGh˧ފn!_ˆz[>C}G6'v�[1=5ڔ7aoN\q8jڻK92Y*te״gOrm]>KwƏ!;*;+A0u6|,|u9=ʙ:30dhp R<e?o^kǣ-_7mm_=�CuUM�!)|n|όޤ
    .PRcoA%}f1$�pT;E2z_>�)zvA-?lVﯓv_qwZvWv^lFe~97#Ty<x^e
    ˜uXwv={gr3:wb6>tdXlm,OVbrGUm<$!iBpH�dփ^V_%Gߤ_p|g?3cg٢|
    \OW|1<
    pٚsu7.OnYԙ%?==잌6
    :ﵩ6Ɲcqӱ9
    krAʚ2ȯ^s]>V'z{K>/_875[crt�b|_?[r&3۫eb-=VnZJN(e|eBH�״^װSi6ܭ}'zu6?kb:kۿ۹逭[}WV\g EJmS*Ҡ>޶R~P6_)z~C|J_Sq`]wݏ,h�={g~IiڳQ}MSY^b}{Iz�(KowX<ߟ:io>_o~DmImϲzY۰d3Q)栊RQ(&Z
    |)[oeZw/e뼓/5]<i;|oG`w7zu&o|oN~]ou
    [uU&n)^Auh{+q_;v'Kl~xc}&Cj�1xx\|^9߿~{L.z|`N*"O?t~Ɍ_}7yϖ
    0{7~mφ/gK?6s?/[Pl-EY*uP*:'MKM;A*&?u'Ӣϒiwow{1=]C7/fn5wį=
    hmnޢNN wxǦ{q^?2?zO
    wmX./g�O=
    1?#bb{p{L6z߆]{Orwܙf
    iv厯<rpbc~G˭,�+/[z~v�nas#ܛm}7{n]vOuץ̴ܹ}0ɗR{~ߙ{IwN}L^vfu_R?bavxmWsϳ3]kwݩ	ۯQKAK\tK(.q>nTE�0ѝ
    �,4�1^?OzPo?v>?_o1mFr)C5Iu.
    WשՇ|
    1}Vw]fVl~l7|-M`[~n
    ٵ;[l&h-^䫲KȥM�/^s,OlU=;z|?%/1霆~\oݭ_]a_jlnꎺ|vxvjZ:�A'9OCܿ!;jk1{}>Z|.{{Ud7CSPⰝ֔7v[�}pLMM99hXmE"h�vq=�h|uouL;o=/g;tkm⹆bYVi£uttq8lt̾α}0m_|紺##tk`?0O8j|keQW:~|8E+h�5ܵ[d?]K]o]6_%?k%;#¯]�FUbQ`k8}ӞsZTGD<}8z-aGn;/�c_p}Sڝ.GԯkL92	QRLKp�uLt%ߙ.rEM}S؊7{&탈;3C;MVTb&kcW3K3fUwEP�ǭ
    Ƕtq3_׽	Ќҽ{It'N/o=ξ\~޽C\uם؟x£'ӯy�ƽ\wuѝx��=Jy~޽׮׽}BWN:̿?Suz24xΟ=\oN/ {/}:)>;Kz_}Yd7ϑۏn'3ygTu-M=E$loƄ`}OZ!$�?o>|yퟀ]񝹺T팆C݃E`jJHp=[*$7"`$Ȭ@cG+":{n�fk)�	p|W|sww';sluRqv[37x)V+t.[N0t1_4đ\p�/f.t6oG;9l}7_&7UoV:#y穱Tۃ'GۃlV3QK_
    h*^yLP:6??v|On3o3>oȝ7#ow7};anGCmURRRMK3xqJ(S5qZuld7q__cm'R|q˅{A5/{qPO}쮸W\uFs"^s਀yyIQѻ~ҟzNPY{pqj7YfH;(b;}_s[Hm!k!?r\smm6HL|_	C9b$HK>n�4݋ds]_ m>j
    hS'VwƍӰ{s|vV;n�0w_bav-6R3㥧|WB"?א?vyg9Ǖ}y>m}ߗnw--v;m1m2fڷ8(]f)a{8ܭIWg\pi!L-5TPvp콛I׼266
    �O]uMx=WK迍_~@t!bf>\.<&ްG<Z(|7x/m}۷.h>bN_ܛhܗ~Fc5bv?Eڗns5Cik'H'TO;3'1Vq4Tk/#s6]c/zQA{;\vwyVzzon1~'g[uq_|ғ3EWN7܃~rne彛ew}awϟwv=}Sh7A�+X3l}glk7=Nf-Q4E*CxJֱ	eQ"5tpG\ݧ#kf:MS]P-T8Oc?u:TMZ,U)i1ƢDōMr^[=5l`ْm;J>Y7kfQ	gkkb,s݈=~i\ndliB?Wx|9>DnG3ST}6ޝ`;{{o=y)18wǟ�rÞyqNc;͖͊/n.m6ۋkit^%^ma)no*P!dp?{7a1/?z\^Mx:Cڛk6||
    %?-tu&V*,~_t{*nW<y�X^_mV}6$)6qcQT=mPdP!.<k
    UYK
    EJpՈ`5g%D=GTn/mO|i�{it]e8ĕq3\U3d}~~G^}i.7}.n7adkxc@)_}=SuظXQBjWÐI
    WFNm񣳺ս�5o}_[~um{puLn3TpQW+6,;V	Zl؍On=yzv7zm{&ZY-gq
    *onbC0lݞtۮ-wv=Z\"kRm\&=&T�?d{J?oG |Oӓ�Zg^�]ߪSލC"�ac�=ϭuђ;PX�ďzׂ㮼@[#޾xS?o[^2'?ؓu�ϯP2G`5�ozIx^D?}z..z?q֟#޼q_~޼<zȃ\�Ox?[Dq�>+בϽxǮ%�T8y�xgi�o�Ͽ�>p^֟Ǻ�ح8g>D>�GSyW�{4�c?ϯPZ_Ox.?C{?^??[ɧ\u5�f^^֟�"uS\uz�}:�?ϭҽu?�x?^v7}|}'www{d<%/Xod|hݿu
    Κ\m_6ُtoz5Zʜg0s
    I;,=n9a5"f:fUAl"eѮwݝ{[lcw`p;R/3f66.}ob({kw6m,6TTؼ}.WCH颌&Dd/:j4'R@�ԐxϠ+/7~_1H?w�_zqs?RVbzu3bhg5LrURKq5(CH1꧈+81JE;Bj@'z9q]y,fI7E7Vy
    n_Tn,Hm͝ԛ;һ{7G>aqBbKqqO
    M
    1^ꑫ	$V4*=ߗFOR_c?>]j'T`<�z~ÿ<6Kq!�y_7�ʵo:/m{حgG{jP}�OXwZ?_V};r;MܛFiKv!S쮙F9,Z.]Z:fy養I3Ӟb̻~gRiD
    pFY':Pp
    r|*�*OCONە"sɜxśݻp1x?i|}?_wVB8V毨y*FT)ngmѠQ^Q+4䳬p%`)BSV6]eMM�1Дr�"��x/<?,K3.nڽ߾ݫbvG{,/o|GC}t~>vwr΄ٹ혛mTگ$oZh/1@G[rZϐ�@yq8<}6
    /TC_;;龓8z=wR=SѼMDI�=0?1
    GQa;#~%mߟ0rM񊮗/>w/Hacp;!./Mr<m}uJ<dMʖ�{ƽ.?k׸Oi;h?=Iƍ[#Fn,yNͫ{mmI$3=\nt
    )a^~yסk3.[1=uT{|,wqeƞS/qznŋahĩʌzSˑ~
    X�.C>4n&o>�B{jlnGMzfc4s`^)*1tuU3ͣxNQ=oz:[w{#{vf6;ctÏgeYsY-5eTRȌA":ׇgϷ=7{>I|
    c1mA켬8WӪK|Q%3rff?"z	(�WlW(l-1?cm$Xr�}Onz߽7\Q6ԣsXPp^ϐ4	e|l];May^Ǘy'ܿ7qφ_;#롢	;vqUu4>kڒ�U}>#zm-;m2yZ;}FQN~,f'|l=|w`N{gTQUG_49{E1C||X7Ew�e�z7w}??���?/u[UFΝu>gb[2,�z7v;;;/?C�G]ͻ9ن?�q?*dհS?PzAUSGM(oaC-�)Bϖ=ɺrwSfv!X2zLb)'Ux
    (շ/)uH=~팼->~Rvk.KC{nf{׵;wyn�C䦦Pvo�w|gUWev>{~yIw=.CocE=vŝGni3rjHct/XW#ˈzzϤfs_t
    w}=c=Ǹgdn}ٹ7(++'zE=FFtƟ[xgET`v�emߒ[Cr�>}[gq=oޛ(jQ
    9ʬ~QR(aZS_/^?g׼?:oz3ѭ؝bػ[!Wwn7.?˷pc=!ޙ}Gz15�/[=.d>8:qŲ^yk%vFdjJϴzh$ԕ$㭘ނ^w>[jF�X.ےv..ۘw=vU"w2+k9<tp*UCQ`�Ouu~>g{e{l[=؛Ӯvnѻ_kwr
    %fx~78S9i+}Resִ0z?FKo͎,socv.y1ո7>cC㷯~gFJmpTP=irZ1<G[G+םM֝S'ul
    ީ|۷c
    }>C==m_Wߛtds[k?[6W4jt7%
    1<Oӯhi.}ۆT{Vm?}?#>In.\F6IܟStݳcVma!,B:5_^,?`ɦpO^G+PAU{n1_&>nwUZ}ǵD}Qu	Yee=#5<K;Tݹ?m|A.o񻮷X>c}w{vuntS}ٽ2ml>vnBlb2)oM>@/~ν}|Zz\W31vd)Gzwow>}ǰ޵oM{s9UVOz>T1^>oD򛃫6l{k={/nmѻ_tq
    ג9fߙ~99YS$,(S(|[	O.][v7J\Yb#]ohu_m|dl=S	_pd2*ǮidZ3b	&l uu?o^,qZ)ִ?�8u`WT_37^2?e.Sx��׌8*�mތO>*;�C�zVŐ�d�}z�#�~\u8-{;3~{n�#~mxO+;+A4UTpy5,r*uu#P5o^ӊi|Xݝec3g\|(}ٟ6)ў߷//Ex>pUei2:ES -w8 <|ּ1‡ r|!ٻgcܛ?\PWmm.	r1)7鿑H8l|P>x)_V8TW
    *+#xjjJ�
    |_]�2{o��s=/MG:}u/͝al={o!]im͋3z�wkT�Mf&2i%eRi:߄_Ge#�϶ʚRMx݃=EONZ�7qT;{'df^�6jΟAd~۵Ɋ~R9C&zwoI#Y7Mv]w_D@z_9C563{uw)THnwS'ҽ;>Bl?q�s?�w7
    ﻠN/14iI-텗ô~b;Om[u�}<OskI>h<yG-7_ duܚ^:aMFcP4d�*π5QW}w=&tmOKmwd=ihň]zqIdql4w{/7}->lw+NuqC{YwF;(#8!Hꜫ24dy/4~
    :IUOov7m>ra�ޛ3&ݟ[r^SG
    :xvv&KxA&-[5�va}ݹ~D~<uݑ=l[nw0o0[՛;MxC[mo>6
    Hycv]>o%[K٣eXɐ3DcOV5j~%=ڿ-zO�~N`w_K{ytvonN\L}9Fܫuz֩1Na	bKP]˘vme,Mh^O-*X-5+q9VnHfүhَAUj?}utlNX|/s`z.u;E)[yVuA,Od;~TM3.6^`y}mK7_c\
    oM3q*zWU`75_	oX:ZoZnn$nmَ(`ᅫ7r{viݝ�.mm[QK|vڣJϫW*OmwAɜeMʻ-
    0ruϼη[enr]_CJc5֘{եښs$cLeKAPĠ閿Kn̗YITv74/q]w|�q揬zGf!a~7E
    ]U46]SG3^ͣ9]Md:v'ۦx߈+5\չNf[b;;cWVO??? {?^';_#=ݽWN,;C}3&avȩPAۘSQXN>3{'^SܵV;'߶n4[Rد$`g.HbU4G[~qi}}<<
    E"PiCq*QEE �"�W3x._.)tK?_~>]zG?(־C׎Q?_Q�C_ؿ�íӇ]kkרE:QX�O߿k/�_=_.�O?/7Z>}nH�-ϽkkI]O�c=oO׿'tK�ֱzH߿ku?o]f߹z3íģ�~:֓룑:G?~\z!C|z״\Gy?~^l/Ϯ?ē\0}_z֜~^??=迠z~}{�C_ē\7޵רzST}]<]/z2Aר|�UL_P�G�%[)Z|
    |^o'_:
    �m߂vRTt	ڐl}x_�~ݹo�*sqŦe76y+tVC_Nx!~+M$
    
    TPS|0M
    +^'=
    Hu_3f';f1\zonns;Mڽ}7F|㪮%@((?!i�$�(�0)`#zBzתMGgLW/uڿ!1]w?w~ΤU+殪'5v{ɤ:|Mp;J�4(MP4Ƶ�Fc֟d{LXzup1^9�::ԋtNXOmV?ݕ�_Y�`!�=8I5l_<�Pk5�𘾓]!?�ߏ�?ڽa�|�Ͻ%9�|?}m[Cq{KGӏ^b?ZO.�Vz_~�]�OO~�|Sx7B��ҮW�ۣ߿wY?+�^�d�W|�߻�Oп׻�U�_Ot/�*=u~~u$	��J_�n~e�x^�d?�W|�߻�MП�U�_O�7B�ҮW�ۣ߿wY?+�:$	��JW�n~e�x_'*_=m~~]{^��]�G~�qO'uIz�wwʯ?i�?^d./B�ҮU�ۣ߿v8{œ$	��JW�n~e�x]{^��]�G~�|׼Y?KПӻUݶ_O�/BN�ҮU�ۣ߿v?+�:$	��JW�n~e�(�KПӻUݶ_?i�?^_׿%OU*t{G�x_'*_=m׼W/uIzwwwʯQ?+�:$	;�JW�n~c�(�{^�[�G~�qO�׿%OU*t{G�x]{^�[�G~�a�׼W./A�N�ҭU�ۣ޿vX�0+�^�d�wV�߻,?�Kӻ~Uݖ?'u$;�JW�n~a�(�׼Y?I{�JW�n~a�(�׼Y?Iӻ~Uݖ{œ$;�JW�n~a�(�׼Y?Iӻ~Uݖ{œ$~Uݖ{Ɠ$~Uݖ{Ɠ$~Uv{Ɠ$~Uv{Ɠ$~Uv{Ɠ$~Uv{Ɠ$~U{�?^.'A*ߕ_=^�(�׼i?I_{�JW�nzշ�*�?O�ҭU�ۣ߿u�oƓ$}~U{�?^>�dogʯo�U4�ҭU�ۣ߿u�{Ɨ$~U[�?Z.�dogʯo�U~4׿#/�Y�G~�/@�*ϕ?=^�(�׼iHGvV|�ߺ�E_~KgG?;�JO�n~շ�*�?_={>�QݟU*t{QW�x��ҬS�ۣ߿um�{Ɨ^�dwggʟo�U4z$]?>T�[w/�?^3׿"�Y�G~ۿ/@�*ϕ?=V�(�׼yHGvV|�ߺD_~gE?;�JO�n~շ"�?_={.�QݟU*t{Q�x�t�ҬS�ۣ߿um{Ǘ^�dwggʟn�E4z$]?>T�;w/�?^3׿"�Y�G~ۿ/@�*ϕ?=N�(�׼yHGvV|�ߺ6CNgE?;�JO�n~Ѷ�u_=u@>�ҬS�ۣ߿tmϯx�HGvV|�ߺ6CNg"ݟU*t{P_={�}�W�?~
    :/@�*ϕ?=F�(i׼yHz9__ʟm�4<z$=��JO�n~Ѷ�u_={�}�W�?~
    :7Hz9__ʟm�4<z$=��JO�n~Ѷ�u_={�}�W�?~
    :/@>�ҫS�۟߿tm{Ǘ^�d?u�U�_6CNgC�9__ʟl�4<z$?�u�U�߹BNgC�9__ʟl�$<z�˺�Tg^�~�U*?sPӯx^�d�r*>�(I׼y߇}q}XT̔3N2J.ńErxgʜvuujM!Nj_Jy{we:/đG@mS;=GIc*{,V?u<VWQGRprG=1/RۼqQ^+ExWt@߹#KY�Z?(=;NG*>�I//�%�߳7/6!m<+4OO~]�<\WĵOc=װIoml��}[O,{Ov�]bVv歇[i~qr
    l{Wmlm]ٛuUcӶۨ:ko{)ar58en:e/AnNG`o:.sv_RtN?Ѿb
    _=՛羶Uc}�x6ﭤgfe^�T[=;~~u~͙{$ӻ;}u�ۻC!k)2RarQtܿ2~<mٙlVvgOao0}/r:;=׀
    F'sf[y(g}Ń\FߺE`|Z'kooݓҽYOfþzcgl^�iQf1uMrۋhc5eFF:L&ju;_"4uWOvqtv|r<6tjnꮥ׽]٭m1/dpYj:JYi}׺?W{7) n
    ]vݙ7UV;+;kn,#S|Z!㫪׺7wbu`G;yv>BwovImnx=Юq}m&=;5WMC/Fiͫv[rwn͝vgڻMۗmn=Mf#;jifT'decSgG߸ouyMK{/{-N(6w^}}rnӗk/T7;Oo}AM(){w-ODwɸ7f+z5`A�y=L
    2ۛ	&)[C׺3׺(|g�eG`/�|�JOOTѧ.�?u�~N>-_`/}�}؝;׽e_{R63q<2׻Q|uSv-_`d7>};}78}"=׻z^f_
    Ɉn7Ħh㡪^?�2~<uWwc;oZO=Y_,7WbXM~0l^ΟSo1hwz3Ȫ׺3׺,kOǍܵ=;{&ݛ3t-f:E.?l_G3?6nl$Wpms^?>zNNhln^}'~M=1]ų/Y|�ܦعmŴ1#&k5gBE/_ޚnf_';O>9v?ǵ7uWRޮ[X}Ƙe8,%\x4'FwepnMWnGtkkmGC۩;RdYj*at5>/#%7A�c�1OggUKWWzj,_:ONsow	GMtd^�o)RPoe:>Bv
    A5z.ժ޽SRttUgmr76pzLjMF/J
    ~"lO||#G}cўu=f?߿Oy<L=glxӷ{t Qϑm;7`o^;>BUtN>�|/ZmϔpucevF7qYUCWWEF�ߺ@�rwY;`;O)0药l83U,^[[su[)Epn2
    :I뢨ou~{ߺIٵhVb]Kܻol:
    ՝ڻ/#r+m߸*\l5Nj)d^A{{^�蜿ļV'XN^gh6ת7.7'شzN
    E;+']̦o&Z\rc2u׺ur㶞:)T[i[OuoLwl=MNgaz=G6[-4	b'߬ӳ:;SpbPGM;7wνYml]-w\es؊�VUICuf�5�{#ߓT};3j˙_jgat۽W;f:/xC&РsUevf2|_h}׺_atV|vۿwYc
    .][;wGanϞ\N
    ASIYZ8)goV?{NK|qڽ%z�[+?IfG}*s0{ݫdE^mjͯGMWQǃ{�ߺ^׽uT�a2VcOݿқ�.3Y_btܸ2Sdv�oj*zmՕ1UP^'xgZw_Ve{K/ű;ncwf�XFzzh(VA҃mn\vT1tۂpn͵,[ilY6/Y2)塁YSJ׺P{^?w.;i㩲JmUMU6ڊ-VȮGzn6v;y|e@)*2y:<m]\(=u~{ߺ^?;߬r@`rEݝ;:jT^ܻOx}==ulsZӯ^}}iٝ[)1{~O#ڻuu^[rb`6Sny|2pqU9lEīz*{ߺ^׽u~{ߺ^׽u~{ߺ^vn\vڻx)f#iRm=`9Jmv.qm'e\IJzJy$&^|um�ZvLgnu;
    "q5;3gtvn94Uf|,Vuc׺u{{^׺u{{^}}iٝ[)1{~O#ڻuu^[rb`6Sny|2pqU9lEīz*{ߺ^׽u~OgݙSpVe3}ؽ˰;2;k0[Wf戴]5bmmSSd1VR]UO ߺCu{{^׺u{-O](zs,6#*15L/hU6ݲmYhx00$5vvGJ'C8{aje囙Tdn=�R 4ǟꏋ;?Ov%jF{io^"}Ŕ4N;{\c)pu	*3'`2Cim(I;SPG�U�܄QPP�
    )�U`no[Po�Bn�'A
    k�VcаIoml��}[O,{Ov�]bVv�Vz1zKswnV9|{N鮬ۛ/c6>NO	jlb|v#a5mARu
    {/;~w՝?><O;C5v\L�"Oq]"gNv.퍷!;"ݗ7&ܕ
    tWXWōO	?p|H?5Wgu~lwVt?vt]|}żzk~?k~Vw?qiI^w'ܿ2wu`f/_wv螏ųOXo�@=+ssr|^IC0L|#{].ߓdϸ7ff/i/<v3ig6wM
    “)&rfN2uj^:-]UЏ7/e{+z3~s6iu9*I[#lf0NW f1~u(3:O�vi�ƽs}ݝ'�}m{.ҩ�eڙɔe9,n3u|Xһ�oS/߽	Y];v^cm|'w'9qX8IoF
    C{>?vfeKޒ|
    ?z�M0|n׽sKzsux-N˲zqoݛqNd3/a׺�uƞ)z�Mb>{'ۻGw2a
    8i^K9ǝ%_G{ܽ(''?knϔgj�%6'i&w aqygItuG_-�0oujkNnN{+wٓ~,;bm[p,z&
    �z#j8_y|O8Fm^_5;~LmvB
    t[1ⶽM5\TN{hAs{Wb_�0oTvvջ1jS^>|6Oab)w$YqTɕ1bS5J{tX;v{'q|�ggRv|O՟%._[K#aa7Qg�*M*(&V7KAIѿ/wd򳮺+>Hm�ܽ'N1~>ߔ:�oQ|Z71ő~YHoUAU\tf\\;v|ڟʃޙ*}M_\|B|Wn~Jo{wbU}՘])+vBn^,8z_!'M0*lqj>ؽ0۵(p;mVcp[7"KIU�鿉dϗ.p_mm=C:wg|`K�!�v,{~P]f7NÒzg�y	wIjσHk;{.s>9٘>?՝/ٽ?:[vLeOcd6]`	;'{?7?}鿐[?lm>bwGz[6wVO`p=ZgJz<̅.In?u<`;[|ﮠ%1)w|jj>ȟ=M{|SEA5M4X6RZM^;{w;NKyY?m{wƭv�Co"_Y?~shn'pO{|Gr�|
    ?]˃g޹`cd|ʣw՛c̦77An(O
    !0=33'_�;?"RtXux?d݁֝v6+
    'Xvfy7N5|׺RtM]cW!ӝyGUs^;}I]mw=0A|-஬]^X%5�ܛ{Ǹw]n=ݳ;j�uwnF.|M̈{@/5?R?ɣ>*VK]kнvon/]0v^U6~۽i~z:z~9^݇׹'[|v_>|�ݗד|�|N=eKS}U9޻OxVV9;Zs=׺ '`l
    s/�_{}P|k$'>/T~[ugŎ�1b1ٛ>3�u�?T_ݵO_�4;7?=}ݙ/Uw.g;uI٫K)w{I<ਢ^?b'[3{ĝ7Rfݛ
    {K_{V=׳%vSE;ۮQ\Oϻ0{za0[u�,ڿ_폏�*rYάꍻ}Kݗv..ݵ{rv_nz>ũ~�$�0Os_�/1�$>^lߎ{cߐO}.d}ٹAtcV6a)׾26_Ǡ?]'�btw\6Sӝ1?ō**?2\e?D~|PQϐKNWn\?!=m"-;odve+=ʗ?T{'Mp�EGo]~CU�I}w_YO}c_PXݕ�]Cqnx1s`;	{uc/7g˷}u_^;kdv\̏/Sb|[۽0uYi1d6kDS?G"w4�O__�'6wg�Hݯ]?7�}wx{`	ן$~.ԫ[7{|;۸'l�YΥ|c0>6`;cPL#;/{snڽwUntc+}׺,Wɏ=iӰ:3_^{S3>؟6Zh7w_?)�7jdr}z2rUn]п�FfuY'lt�-2^E{j.f{+<n{s\\97\K[i?Sw�W" ?ٚ�d�a�ӿo�@�q�~��ݏ~]V-gSGn?[Y.ッ2C;/:ʣy_ᛏ#%z=,>]ڛv/ߓ�{~
    QzSi/\F#vd*ED஦G,tlPg^^0w~a3t^�T>|Tep{R㻗>::c`s p{7M7ʼV+	][_oIf>%ABܯU{k|hڿ6NZ}Y?r;bA>;{z%޿/=vOFt=~70r
    Mˏ^3ӝρY!~(W�-oqOߖ[.{I;o(=;I>@NJ\><oJ֝G=/IOF�S|U}K�/e|v;gvy:گ;޻`KrB<m/TP`LO7EMGI�|eu=۸�ƾݝ_K|]я[w2Xz(UehR9>>׺(&KOpnꜧ?bnӰ`vid{-�)vwmnv)v߲>!gbM;7[ٛ2{uG.gqg	j7�i]] vݩԙ.k[1v|.u/W`vkX-սѯvW;ؿ=dz=zq޾޿GݻWr4ıth|jhdE>PgOs[G�3�62oܵo=�.~?Im$><loh~<wU^;3s[uWV߫G{)]^{>ո��zK`�?=�Twz}6U|M1;�rvt]4㷎�6򢩇q%6^	{w+''k[�nxouO̞
    
    ßQBL]�d[/Ql=<׺][;~߿ɇ~|2_!3݃}MޔIgmcSvTj]Q;6&-c6S{vڻjv{'e6;isj=1}Q0[iHEEUjsώ4:x>Gw.==5ޝr9zFoDz{ZLN+2 v>Ɋ{�>{)zC�cA;3�V,vѨ__z;3auqw~tgy:nd{tܽ-M&!?;XS�+?.;kon	aN\{�^خ[/Kdm׺k[vt0]i~ow�_zu-M3ApRx|{~	7]TbhBЎ,[k)w?MǺW #;�o	t|]Վyпc>,|K؛bmʞ7}NFTQdt}O?˲1?/vX
    >[Gel>q/(mmohnڵNaw
    =5~lU[?N�f��8�D�f.˧/�2��.t/Gnm]˸pOpoܾos8vޙ^:iv^ɥ1⒦djZq$֨_ʮގ9>5L?,!{WeXqzNz-?>?OwĽW\.뮣YbgU6{??	sE;]l_?�w7.vSs�NS݋kjo8p>G~;[ko|e׺Oῗ_gEPϛݫ^W;>Oퟐ_{zE0XSivOmo(�Ҧ!{??~tcܽG=m/M[?uwgywwG|;hZgw4}[qs2n|WY
    GD6]{fo+mg/�+XϮ]'/6f<u|JWv6]5N;oe=׺.b߃O5woĜWKcWQCuC ;KMtFڿxH󪥤ь{f7՝][v_3;ҟ&_0aJ'տ»K;'(|O<;7诪2ʞjŲ?w#ۃ2~B|V{}ؿ^:/ñ{5A'q:sUuv_YM63mRaiBϋGߴw?_d~C幼7VGg.ܿ$_#[쿉amۙf
    f?b+'ꏌ]Gj]/pm~I|a??V2lod>}p[pVY-gFW|H|D۝:[lWþ-]QW?6C'}|�
    *Qf:Y6nJ+r0`=fGf*{>!>c~m�O뾢\۠{1}3zvfoMɽ>/nߙ1v?*7PT&8Ƕگ.{uc�ƛ;���C��E}?;�eSN�ǿu�uK0;s=}#	׻Ǵ
    ͇~ |.67vg`doIgԡq`C͔e^u~{ߺ^׽u~~ܢqaG'2YZznV;YH0M%=>2+]긻c\:/:
    wyj�Ө�ii0&Q	rΕ$b}S˶_Ia}֊Hz/2LX".8.c*-@wgj<;IaiUflU-A+Jhzgt͵?+>["V=U~+OK}=MO~EZ|?,i{<:itӎ]?מkCzWݮZѰIoml��}[O,{Ov�]bVv�VzCc#;Wtpw
    ]:˥0Vug22㲹}9[r巆۸`QUgrx^Ce'E_w_:#xi�o:'nv�e'빻z%�@�[7%{�r1'@-p}6pw_N'=
    ڿ>;|gmm˷.}{amh鶭\UX(++0ԹOu
    v_r§;1v?pt^3]EO7LtCp
    '><؛icg#L~|7GߺUAn;:q0vOΦlq? mt`vkmllnlYM"OYGt`:պwWK>=suuY:϶2=N_]=SWߋ44U;rykuxK팏P\~k;)v.mZ՜ˎrY]m>W˖njaGQU1yu#gf6TTtG�ftN=OizWswGz?@K;�snK�c01Uf)׺7O[z;sގٽ[fc	؝1hn,~#pb?=GRRS4Mr+ ^	|ٿ)`|쿐GIz/~]
    'fvݭVهW&^ٿ;zw.)Ӹ0'|wpuoy>5ۿ!?Aw?L<#2� r||Hn6FMXqzmtglugk�}oe�e^}Oؿ
    7w�{z�wrY`m_4�İ?4)o`_6ޟj~N_'f^7gDUfX>ͅ3}bWݵ]}2\m6;iPTe+P{>z.ߐ-k0)?6n;e}C![؝g]ӟ۶Czz	NZ5@Du;J]33o=Aғu|^`;/r/pt7Tm{hb
    mNZmU&V׹ԻoZw̜sv/AXNMԣ>o1CwMYX}{twtH6oޝ˄
    n>?z^fMvv;O=6;)3bmͥdv^2}>'wۃnm :/�k?*wtNW7&][;׳~MVkn7_?c2驨^`?wV.]/�_o?Mf7P>;'~=w|M^~.*pT⪲'S|ɸ?m<ƿ"ݽ[VoNl	(?uX
    U,cQOU-5]V.
    �u�h4޶;Ǧ6_t]|l]3�nf6/{umӛ'=>@l2[/1źx4Lc^?kodwK߄7V�';y~0mwϏw;ǵ:-73wln<ή%V\J
    Ψv0O�/7./'VW|6_i�F�??06瓯߭Yy�n7ܸN�OpE?ˌ6><b3gkbf2>?$v>]{bǸ3]yA{8h+r؊u�u[@۸}�/vG!7?|:Դu_r.<uTSbi({t`?ٱ٣�f[�,铮O~?f��p_p�	~'/߅/M?.0m<EgO?M߽SUtXm{š))i齷?SQ<QI`0O,?'f>];Kb`w#iϝ#o?Sk*32ύ<.]}׺?!znw.{ç_ ߩݛs=}˽6r>Aߥy$#38^x_%?.iu>+]Y}>7u?hF*ӆ;~᧎Tf^?�5zu|	8
    yn=�+nRf;quǽz+7U?`Vvh6V~̹\~WCп!z^﯑}rۂiu^꽫Ubmc`9Jj9T){v|-{xt͗3;Ox콗:iU=GvߙnkQͶ+h1>:TZhGH1]_]?O:
    Kݽ!==׻zҒdGn^v=U⦊<EO%[{tO~ߌ=K}�f;vamؓlM'I'S`vߎM؊;Gf%K6^Pt�S~S
    ٹH϶J~N&_ۿruN�ioC9A
    gcߺHWҿ'_/(w&!Zt\|oYJz>Gn꿰X#SgS=:�|_kv|.0g~>l-M{ar5Udjmnϡݓ읹*w8+y2jMT׺O̝<_%;+wD=Y.˖n:n]ص59z;)Uj=׺7׺u{�6]۞Iʣͻiz�ievLkۛmҙݱ:iwnֻ=Kؔxjc7IޛOz�nG/[[{]b7M!OYTIiuk#P}׺:IDL2sT-Ս:x-K*u`on-U5sst5~:{_%6C}|t퓉[O)zS_jm\nbk!v.k;x
    TRL1VA+ If^郻~OtTm>N}z맺qvQu{cflv_�(ry|vLvZ2V^�2�%?wN뮤vx�Ƿ��}>˧u�~ov|tߐ{on8nyN{V
    UIwgXPsoSoL<PL\t0{^u7ܻ޻~^eOQWHn�#rll^ԛwmݯvܘij(Z:^ۻ|j|j8ݛko|
    2=]ޛƧ&^T6O@Ul.?9d6]>jZ^`�f�'�lru|O�yǹ�M׺cchaqnϒݱԹܝuVuăeO%騷_잲q8ǪcpR-}D0t/=ٵw[b]6NmٳݛWq㩳{rÇgvwY
    Um,USJ쌬}׺:wŏk�o�C]~?[ڟ4_g>?4~ou/Aw]Op.m=M{lf}/򴢋+
    %IUţ]<ʞ :ڽ='vw6zj;pfrv)[}O+T+rRSle\Sװ7~>ݟ"˿ߏpSm=nꜧMlY>ڥ[wd'nn
    野:*j^LU�u/ڽKۃa>9.t;WWjcu]U5V5eNbL2׺@R_]L˿+:e){j1[sk+ݏMڛ
    Ըz,WjbDtgtݙڻp߹|q{iZ=ս28uMuU{r콓K7LGE&c1%LuI{G>5|A+~,?ro{jMu~엣}>
    
    ܒ56{U;SӮMXcczV�]%ֿ?[:xfm=ỿwGim_2_}W㧎m^?q]`|[iwT:ke-&ݝC';spUTL<qVWCRePu߅sȽ;Obgz[uQϹij{e#jX{�g|.?swO_vmݛWݗGr^ڭwr՚v�U9[LS`@ּ{gս[-�/ٽNw']W̾;]ջFq˸;{k8ztx꩒c<vm]w.[o콓gvo38vܻۘp*h-QU[[U4TԴ<u	>n/j/˿잫K;?x߽RW6cܻpU	%5\2ޡ%Fou?7~G{aO}߽S;uv~o[ڇs]NvK1X*rج}M]*KO'I}7Br�.[=EzC}dwfpm?rx֮KC^@�,~,uGVl/פ+']lY6+wm-Xꌦ7jtTîg{XXwn_o?6_;crK:w3{ոn7fV:�/ٹzMKHڨf">/�V?�6��[s)�?%�_�q~wo7{ߺE~aaWz? :#pnU=鶶&�OEۏ
    cnooq춮}যtou~{ߺ^׽u~nju޵`zVD:A]MѬoK&0FCQ xZmD�DPi"PDS!ͧ8~Tyxr)ŊL;(q̴$JOsc8斛J4ڼlU
    Uo'ĜUٱ[nyO rS.#uƷPU#bZn?fW�y�:_y�O˞?ҰIoml��}[O,{Ov�]bVv�VzO~+?_�*7wv/ŘtmΧﮯݽOvłTv=UlWonOۃN/B]z{q�_.鯌'zxtr.v&-?ܮŽ\C9G=׺�7'ݗYoEOx*s[ө7WQm_/^'>꽱ӈq*r#2`Scv%33Va׺;_7i9.>?�|{G.;O.*_ O�$�qR$㻍Vj^vr/v|[vnYp{
    Kސfi7~~>Q8N&Nz7h=׺])zaNV�}�,!/|v.=]qv]~\;?Jg(vyo>GqA	vg{);>'|uO-!?~w/[]A+xn鞲-pw6[s5[g̽
    X}׺;yAcwpgcKw#ٙNyZ
    ۴_>r`vaɌջnmUܴ>�{g-;6�.^ۧxoL?ͩwoal_V;`n=/Uȥ
    Ի~vW0ou\n.-ۃ7U�Zumع]>ە3vepoܾ.lhEM[jT@잷a}%{;0d>u?OWA/]˙ڿ%7^]M՘;dn͐MSTeE%{t.==7O�<6/g/hnp|jݝ]]ջj~v=Gۮ9ȣv6�FWNm_yA7�?z'o|pޝ5{sjv^_17Vݙu?rfi4tSW׺O�/nOuٛ�?-ޛ+-}ؽW_qmA2z�A3TVKO,~�,}kOwg#a|ӳ>g{~RT)mؙN}w4g}Rz*^|nn返_6ONꞟyNޝrW^u݅M?#6>_6-&Zl6䞱/)`o�ͺvQm
    {g�.g|,fG{f廃-w5.ݥaSu"ݕ\/uqv�~2_>Duoݻ`؟z7om_݁׿e[ejw-T>
    {N72? >F^w;i'~m/�ŵە]GmK1jH^=>-�|])UV3mǰ?my�'O>㡧j>Cqfjtt/[>:n
    Nﭿ{+U?->Oڽk׽
    C|Ǿ7ܝٹs6l`Z{͎O6�Ѱ?Z@o޸>,w�ƍ~;uu\4gާXuj�,n쏸!o,H@{4Q޳wgL]һ{+-ݙ|GjڍRQnouh|]˃!݋ƍ}?r!޾ߖ6V}&pmr;M;K5Y^`+w&.to/~nޛ7�O;zc;W>5'J>-U?&mS{:r'o{
    S&7:߿]�Ln�&:}�f{O�WEr�š}o|7{�Ǣ�٠[GGO7?-ޟ}�x>~>/W}׺?h|
    _�>ym{!OkLx/C
    u]_hg?|m_u{�`nߖ#>??w˞{G}0:ݡMƜv
    lg^amY(s]岾ߘW|9t�tvT�6>ݝ9~Ut~n_jT~OvNȭ]9]Ņ,ۿugs~aڿ֯?{|!A6ujwV?x^]ۛsC[FLe5]6vS":|AKrw,s=;_~0|bu�i{oxm�.vܟ|25U
    MzL&v{�oE/4wr/
    ~մ~C.Cv/:WtJloo[wdXqN]LQ^��cO݁Ovs|E�(:y[ve}۰;u۽CMol�{;70xnuz&r|{t/S2N7{3
    CWu&^jb~Nm[n,�HkU
    ᵺ{nm貘zj,c%y=׺ ΞOӝ]:>(v/ϒ=g,wH,~[[ocT M:pw&+!묩LK'>1-`|\۝U'6ϗ5}m�^chVvn#7{rVocgTf*|oF�]goH@�.',|ѻeW߁g0n�m-R{tp?)�٧��d��OR��c�u/?o|O\c{|][698ٟ5Diڜ/"kmݭs2ݓX+6T";?ʓ?]l6mQb3ݙ?>2zό{mu/mu7[odgei*!%~^|XOv|7I��gln=UfnlF|xY;e�Y:\v&!Gx(ːb}׺)>�? ޟjT_0�$�oG>;w{|׺v_b`׳z�6hoe>ؘc!bΧ�oIUU[KJs)WQA:V?x]OIҟ7~h|kڲc9\59
    ӿzdfYrX$==-4Ptgt@1_m|m
    ?˱> |yޔ'}{9ߒ-Kp>TdUNkxdp{b193a׺$|]X}ҟ)?~Ivo{ꓱp4?֚-1r3T^խ&joA&^@:hA'G| omA->Yl;/='[ptVKWԦyZ
    nTľ>*Y=׺7�><vǎN;K+;9v;3Gbc>]>_wٟ Vne&n=ɽev+/GMp7I��)`|h_{zӾ�>Kͭ6_ޏsazzȩ{7iʦ?g~]|3%v:蝥ߏsSǾh{imMVhq"us׺o[Fw~t뾫$3{W[㳝g;cݳ�.-𿮻(o\V^
    ڹ]Y1}*i}׺�=ŏ??b>?'E�}y�o�w?�c?w}:@v?+~do߈̷_�.IG}[,w'}͵W`us=nf7;㧢u�'1t?3;+G꟟=>@3*V�
    z;y?#~
    vf`m
    ɍQ,ģ?j*O^l_)z{cs�ۇ�#.{n�t=Wwo-ۻVv�eSv>n�J23gv$ȴ-P|mc~(d;t�>A:bd6ӋWb^gto]v'T7a؍D[{`nC4pWg~m{h~?./I4:^?)N-{qn~{lb?,EU],&i0>�q|pmӟ_vgн7ϔY?6X)6k/?'x{3�1v-tj^@Naz?ݩʪZ|?Cwf]أT`muG`>3V#`[.ew.}#^!?{n�H��9ٸ1��?�{�E�?�ޯa{�~"Won>S<ݍ??~nm^/uWd|Ǯvkl_cs'Q,;]MUǷ}׺MS+>T|?7/Wj~9lׇ}aw.so%O
    iammc*(׺�i�_�%�e�/4��_�_�{vT=j.o=K5;;onˑ{W;T˷ۗx=ˬ0VpY
    gy⠬tZy=׺��\wRWD6�nA]߽;{ß;+zۨ7~{oޜ^r+T#Q'׺4c}apcۿGfd3iw=U};'`t3{UnMv>N<͉=׺"_'0�θ�_9iM7S�6-=ѵjjwVC՛3qHv7+u>BPJ
    :�~o>�fט/&>)?٨ͽ8�37WnO]"ݝ�ى;Ż[{1wIPv�}Pt7l=ʮ>ςXߏko|Nn?'{r6;M&wh׺wG#v�vuOr|;b63㺇utӰp	M6a|\O6&s+~bs[!sZ|
    tT8:<OV*wUܵ{
    f콫Pcem˼pO~e+rt,M3PV:-<kñ?'x8[:o/{z{v(;O/N~Cu�N|^
    �Ʒ<fܔmյ9`fI!׺;oM�G_�)�\dۿKgf�$?;||__^t�c=`�'I7x_LGƿ�PRRn_=Oܻ?3b6/)U6ט*pyZj|m<MQMsߺF�{�,	a㵶c;~VNd7ˍ/tm>co~ܛ=vu'1pح�M\oWb0t n/_%z�b||9~
     쟏{cw=A]V:{
    wv꟏5RwdW+yRW{O> /P??b?~ҟhO7K?O{{U�>gi]duV{;jJuZm-vψ-6Ώ%r##+Yܙ=w7V{{^׺u{{^op՝029P`:t#U42IDݗ{^Zj&ZsYh˽']m#' A&VURݞ;P,.0�ǍpBIǎH'=LH_),.Sdu`ygMϷۢ„}NB ߐGȃ˱VIiKjε);s�AbS?ھ7/W_y}~#\ɶ
    PKiAE4z{4SFiP~mŵq:3WU]Z\ӰIoml��}[O,{Ov�]bVv�VzC_r]~}jNH:c9q\SvvO`Q؝o1[)z:<CRuϞ퍻
    �_�#;b
    ڟ wX{>+Xt�쾬ݕ7on�nڛ)0yAfxzuV'_Il#Cvh�;nw.xSiw'v鼟)s`2+rTÑ{t9~d~,vSc3޿ϙ=hvmgve�_vكbv꿹2Y�uvޛWnv6?=_}{#=۽Ը'auOz?'v#ȧCl^sS娟pYu7�J4?�ѧ&*;1GōE ?Fh׿[g�;O%BPtgu.ڸ~ؙKԃ:lce7gdMMCٛ+Urg>O9^{�s'm�q?x�K~[|�eD?kxl_/Wh�oe�~:+_Xܮ�p�a.u�Wδ/W`uJ�lmwi/We�u{j�7'C}Ak7VZ|]ݿ&Oߛ{"utk|z׹!S#%nʊi+ӤT^uo8<J/?[K}nds=ˑߊ|nћ:&~잿OÎLw۫5]WǜI0G?(?W?ߏ]@v?�~?Ocom�I}Uͥt_?n#l|{t2Xtw}1Yމn	z�k﫧^vI6Q{�vX|qUg�e;�ؽCè^۵;vT֯-CE?hf*Kр'i'�IݽTt}ۏ:՝	Ceo�Cv
    ;j&Qq՘T娦{tP7/tV)?�PuVO>:䷟һSu�? 7R]7:-sf3X6.^߽uXi?̜ŏu>펷a'�5�N'G۟;g�o]/F'{Y�5V`?zKz��L|�L2qvpllL训]36Dn=ŵ�-g(_,3Vto=|=}�Ru�SoS�LeN6ᆲug}>[^i{vqiþlu954j٫k(~'_ދޟ/D_O>_�po^FoO핺Avȼ>BIw?;oODnZD4U4_q$tu8uy7쟊{':c>Y�nٳ|[>?c՟c[^nwop`kmVQ7.`VǶ4ܧIoGӝWoh>0|d-WYWˎ_~"t&/fa[`0ڃ;]=->/{W}O_.�?*|۟fv.�H_� ?8}iS	m௛+�)GwWik6|Eߏ{+>JUc;cf>2n>-7ƪΉfWm!n_;6pbu%Z_Gvnͫ[rv^wfg6ڻsS;rM#X9kj'WTVa`v�k
    gaw8o
    ?
    W6G~tڿ#q0Ӷ)o]UV@a0°Yij3USV{th???OOf?ҟs?A�E�[�?ͱ뭵Nݽ:do'7Z^puou33۷q$XRQK{GC]_0x}uM?^[;O:z/~?eؿ>.[՛6=Ks?SWA>"#clV3\Chw-7D緎ϸ6g(=5{x]1�m
    ͺ1;7&EC;,=׺OGƍ;pwoYvNQtJ/SΣkn<VQm.Ufv{/S榤u$||S]]*|{y)wiUݿ6uݑFo.ܱ֬>fI&+=׺0$>N퉇
    
    
    ո>|ﲳiG^VڪL&:*:J
    =GA�>z1�H2?n
    7dbm.�c0]i}[pv;
    U0YJ<VMhMm׺O~ڻ/ݯ+:fnJò׽vouM6MlA.Tj)՘u]׭i:o};'7]gƮ%n3؎y^NYީA,dz^^~+�3��+{Oz`|Vݽ	? 0[7.]v&{սUfk~e_vIL\w}nzͨ{tz7atzD�y| �ݵK#I?^v&[{pe:sj39MQC6lV~t|[w?3|;dg<EcMnYvNqvv
    \l%Yu_+;ĺ`�m�M`=&ؐu?7e
    � ̿䙾e#`~Ju�u{{^v?捸;T�?kl{ad?~Zvgq&?+_'+:66WzňDݩuDO�|xy[vFkܽe6Gmv\/lggt&uv>E>tkGQGc\\iK|ʼcT]}S�؟菱zg@nv�=YwoswA[^@wPagj1`7V.Ϗg&pY޸.޿ZgWGOP_u�$R쿍/s	rSԻW%'\g^S΢=I2U=MҦsV&`cڻ)^?_wſn
    __�E'*{/�{�B?w_lvc?e>{{dxS8*7n
    ٳ19ެ7Monfj;^kb>vpu{S>3ClIw
    Vw8�uٻ6ڻ}o˷^{37ݙvڻOjuNcp]˸s4xb(檭*jZhY]QYU_^;_z�sqنlcmzsv/Au}u7*XV˧m_PQM׻S^|aݘwtv|=x/ݘ=+zo>N}xνڵqߚw:ܐ:t`0_;3?npe?lV!2]tvuou~3Օ :st[st<hݧpWzR&^?�Wf}۟(.,=f՘.�/20YTu;wnRe3cc^=ˎޛWmo=6nͿܸMٴVT:)CMv.mJ>+OWODrDc~H^[<fޙ>U[r;ֽqpEKxV7S,jU^A>zNNhln^}'~M=1]ų/Y|�ܦعmŴ1#&k5gI>*woW�plWwO+ޛy.=eݽ'kkv/9h#Pϒ{a\^ơ/)1y+z=quzO[~mKLҊ3#.7^AzNڛ'=e7>*67d6nm:vq�;'jn>8.3wUkJv^?4սNoݍ}yw
    %MONCʿ0[)jqXu�uuQ]Wpqj]{vn\ڹ:]ܻ_i]a'KTS;c�z7atzD�y| �ݵK#I?^v&[{pe:sj39MQC6lV~w|g[{M2?-}?ku?kpfN؟vO9J׺OῘ\^ơ/)1y+z=quzO[~mKLҊ3#.7^�1O]gS
    ӈ[kil}Sv=Y.
    yϒ;;ohnLcjPb2*.:u̇/ǽ߽ߛ~~쭝ku]ndmޕ8*_Y>fN4av^A」Sn
    !:&؝{wsc][1e޻y1uk}Vn
    "
    ^{
    oFvn\vڻx)f#iRm=`9Jmv.qm'e\IJzJy$&^ag-[sgt7Uﭿ"POwau&/j÷/1}O2?cX>*mٹ=S>:>Wv|~Zdw~S4oؙME>O6UDڊl|:'cU|a޻;;˽>@vƍ_}.Ӡ؟#z;Mٸ>B�1%A޴{fve.n\{t`7wbu`G;yv>BwovImnx=Юq}m&=;5WMC/Iczuun{}ߠz{Ͼ`pdv&G))kxF9MnN͟YCI2iD�OWrk�h�ѧgx�̉�H�?g_�o�{VOd_
    ۶:>
    "0�!7F%N{kmu_@vM-GwmF3?QAtu~{ߺ^׽u~.Zd?:Y�~:]P}~.<OZ^n?_/*�}@��&:]�>_԰Ioml��}[O,{Ov�]bVv�VzǮ7՘N?`b};cwyg|ueTy.콕{ͻrXlftAܘ,w;Cy*e'@w�>\sSm�m=7-_({rd;l_]mn{om*'9$\VN\6[)#^ ݿʓz>?}rK|�:+[svVt�ڝK@dvȽMŜڛnOl5Lnuug{|[ǹws[Oia[yr{W''S㯟?uWFw
    Rgq+|Fm|"_^ivU.w-V߰fiw^ӥ
    MZcZO(ouTuՏ�{[w,}_裴wŎ۝5[^]:l,;rjgu0hh31^C�ˍwgqύ[_r}%=pff*cx
    uMvK{�u�/]7Ac<)`kَ~ovEmSo?=='ڿ}b<bQn.c?IL&{W|Oq<!CO>a6KNsy}5z+NEkn蝇rsKdSeh8u�Ǯڿ:l\lMݕXՒڽWod7-vVn
    F
    +e+tX;G}SYuO_'Ns;;wNgxߌ;rӏvCp|d[1\vߣ~';$I;{t?V]wV||_�%fXQuG
    ܸ_e{CT`=ssT1y܁d?р?vMo.>
    pϏlm_gqw.}{/I4ʬ;*^?7ǿ~1lؽޝ?ݸ{V~9N7{_n۫zm۷�ݴivTqlj/u�w'GO3o7̿7{vq/}˾ܕ}�f#76A^0K$t*u^@i'OݽOӴu;1՝CzZ
    ]j>0xSTkftP7o^O-_ܾ�:Gd|�J~,t]1b鿐/y&Sqg6ۓ[
    Sۦ]G^,󇮛
    �G	z[lcݰmY=#6J'swwz)k9~~˰s+ޗ
    .ỗ߿+,hw=ʟ'vj1;8׺Pm/#MPu�gvoW|7-Gƺfߟ,g�n]eTJv'Hा})tq1׺՟
    ҎۛC_ώ{sODt=g67B}Ӿ��9<qՙfLXM�J�{7-=1׺{;z]s}N]!5mM~W\=%=]6O{�i'7A~N
    Ocܟ%6W`6`V|}6X>ː=!P}׺O㴲=я�]?vO|oYܻzj/;/7sꞪ?(w[4};V9	L]du?uoum/?otuoQs=ˑߊ|i^잿OÎ|-;5])Iǜ5�ors?9��n㎫ݍ߿)hdCD[r)v׻C5mm[UT}׺?�!zSj.龲{/7SicwV7jl]ÐUٌVwG(٤:F	4m 8{ߨ4? >*!Ah:OݘkꟙU[;MsݛYmۘ|{a�-��?;.|q?麇Rf~U/.[
    5o_�EsSm?u�S`B|JuӬ߯�Hb>mc�:>LtWʜǼ'ŜG]G]+_Ü]dؿuW'^y`2[wQ~D][,ۿgum|S˷p6_Ϟ;EKLCQTb}׺&Tz4)) wvBgv/_onw.?K6{k2YF^)|�Kznػoþ=G.sgvDmjuW_�ȌRa՟Ki||
    п?wB~3o޾L?dPLtPڿ93e}hjCy<9tS!׺_2{gN|{ߟ9z�F�M~PŇ�_>NbP~փMJ{am,F;W,]yrq׺(#O>16ϓ�oq?/^>umӠ3?0w
    ~uL-g6owVRa)}׺6O>"lu[g,y۟ӱp;սC:͉p|<ѥeglJn.<]~.lS{?+�ޟwMae.n
    n٫ܿ
    ;[q�r߿7㦇ӮjvO6OV'j4l'+CO-FSi{A_//�E{_/1�t~?|s�GC%�SSn�.۷hf;}}<j�G|mݸ\.vZ<{b?I[1][Oh;Ǐ{GvoV؝;4]oP9jKr-u~G/=:g/?qOq:G[{3n^l*wܻ'7F(SS,v*ҟ
    Wt�O�
    e�
    ͯ�'�N�W&}�d˯?��sQ{>oi6&{˯i��ywwV2῁uw6_qrwYI̔MՏ_""|`O{7V7jr;ir{~/9:T4�~>8ߓk:~_:ׯ3g#{}Ѽ簷9co˽Fo	s{~	rc1uD/_|�s>O�rG77�e?a =�u׺_.6^ݸ~V`ݵ=lW|GWwa|_]ՈĤ,lK#dr/
    l_F�_�?`ew�/UsjoWߏ߮�B�y&gan-ɟS�Ou�9>8ݗכ{ӧK{uTvw=ߙɺ9wN,~ߛjM�۩E.䊦N_^bQS묧eww
    F9UN~Or͑Uy|;poj6۟)eGs[j!ZuߺT[wUͮG6_O{|&ﯛ]{sc'\﯏/Ʃ=9P=q)՟|MSnN쾔9MUXݫڛ/5wCmWf1YEgfZhUX&@ѷU؟'~Fny?$>0v#z6;h|ޛ?b_Oo[[[~kw7ktݓ>ՅݛfZzLvooE=]_^-.;'DwݗPEOq:7|:n>
    R{StO9#۰$T4Jt/�3zvo:X>�Wvg'w7F3;	ݻ'Unm,KApi>}׺[6>s6N|}.]5N;+;;[[N)0lcÁuu�~O_%7?zn=1ػK_on:Ϟۿ}I/;Fؖzz�ǜ^`?b/Ne?#p]Cj[qaڿ#ҫ'^jɱ+|X
    .
    {t嗾~E]vG ?!)*Mkr3"7�e{;7/5$4{ju�
    ]�8��}�Cس]+�
    ��w?G'�\^׺/,~uL/}=Keп
    :dt߻6ڐr4X_+ޢ6~W
    ڢ,NЮ6Ln*/uJ՟πݽ%G®�g>YK��ŽޝU%Qm48y_=׺�w�b��G-�3"�yً�O?{?_�k�OuM6ع7Vlû6Gzm\S]ݛ/6/.[jkj#^vGgX~޿!~v	⣩~%dz{jY_H폳2%{;mNٝ99)oC>w7XtOȾ�In�DX̆WWVo-wnCJg~\v=οerӦgjmvUIWSul~쏈[t|�L}ax%?]t�"(+z;ݻ;f\waU.g6̴O׻W|:'R~>?G�K[|L�foDxoӯWZq+y_Y,�sRu�}�-]On|NϹ�wn\cWnd>>|Mml's?֝Mr}soLD6~1}׺?`m\ͬM~n\-?]Oi1�~OPTNߥ=-"۲ooz̮mgE՟mYw-&fgnٶ;jT꘶gr>Y}ٷyvze.wS_LUnQTÁR}]՟?ο%�g}}qi/V|۝a;#gw6X_"JݩY]RkG=׺k-?=;Ƕ_>?ٿd7'+vM]?,wt#inݥv]Cs;'6/70~�x_�2i{9gj[�Wm~l?"GY>>`VJu2o&zWP[Wv_EOmvRn9/ox�~R|ܻ/Gvu<[6흑YqWV.n{v3OA{K�-O
    Z.ʯ?n-�u+_,[Rgm$�v!
    NO-lG4�c__�)_g�H_b���x>{�ߺD0.v{|/}?ڽ	Ѳ7StN=F({+zOݠ`l{fLǷE>CI^^׺u{{^׺	]r?uG�?=(t'#^]2x?XǺ^U�3=Mu$<}mհIoml��}[O,{Ov�]bVv�Vz=ՙmջ��O�w�q/v{:k6nݿn^x?S熻}|vM,):N+͟JmoO{n�]{NLŘ;[w]On[uoz4O39l׺�7'@Yo]E:6OG�*͏ӶWn_/aαM-ӾOdjwM%gf0Q}׺;_vl9.u�2 >9t~̬ܟߪ^ݡ�c">
    /{a:?05�lT89DL>w~Z;
    pnͧW;kz;ܴaA[j1{{A6]6IjS1}׺c#f?9;t/Z+j3|?Jmόz|~߿ު/x
    |XV)WzL׺0Lw|}Cx|잃_僎Aݻ~svn={(Fjt7w-N_hgL
    j7An^Ewd۳ӠjmS[3pG7/ؘkq>ش.qE}Rcaf׺(v?t[{oݛwT.UuevJvip˗dm}EK>nd"6zϟT^Ͼ=vvG:1Oge6}{WmdwwbjSQnL984i[HM<^ }{M.[=v�Aiez�xm/?�u)8T[t߻z{9a>>|/~6ޘW[_5{KoUO,ǴhjTh^t~��WK�_zu3WJ�1KSj?z׺+?4;kq/A]GM_ƭT/dtOU3)ݳSTeq,tnό,Aw\n
    uT�/{ٝz�puFvCji?ݹiN|nYjw555~g SGS]р=~:n>m?32}U;jM+{8poj[Mؚm=bk+f/{m;64v�\o| ߷;w~,]%׿)l͇WlD잩ZNOvvg>;g+gW{ꏞ]ٽ~dz5A�w2{wm�qizf`Y7̽?\zr%2u3{tϜ+fsջ:nwʯWrMۗKdv]x]ް뜍65;}*h1u�7ٖ?}-̟O?v0�
    X
    ?e�;�v9UGKh`
    A}^@)'b&7̯
    {-ޝ	ؽ?Ŏ�/7N֠&8�_?4TR�)pwK+[{?{oᅬ~!܎qb_čCs~5f'wn>ծNE.XͭA׻0=˼s2~Ac.cfٛ;Sp|غ'�OOƌFX*}^`__>9G?��][�V|�d��}۞wu%5/_{d<vuFߟ$�tB�ƞ{'b۽:9нəG;7ݍr*n[ű'_{ugݱ[~]ػfc7؝2[wgm~_pe�mEEGUVTxC2^~B1뮺�|@|v'Ml�M=ƍ_c/t_}i~ŘV*[⠪{|�3N쮭tp`#[|<m-=^M?{/nn
    ]WS1f*Իb_uܺ'JNMOɞ~ڎ񺶮i]$!ٕ"S7Lnv}3A;%>(7o),?@|/7^vM?cqttw|6�<.O1&VL=f;&1$}׺e�7?S'un_fO;+��vz�){?Qv~Mۧd⿼y(^On?6/tvv3DԻ7yoH;�wt9䪧mڔ}׺{i'{ϵ~?~X1[}-ݟvuc�ۃrY?:Mymq+F>%ھ}ӝ)OzR~uP,QuC {:Wk
    mK,IhsPUOc`WQ{tW?gŏV7ˍM6`l5-d=u՟4`wO]ٽKz�<vޘL޻W>VӬ#׺S�ކ݁:gomD>-ź~_˴W[?f\o.EYDۚ6t	^|.vӪzo-[|@Camp|u^4OQu�uO�%ǻ;ߧW.O7`wo_;~<8z`_:[zn?ۻߟqݿq9h*\k'޿L=lT�[|]~DZ߀<5ٽ=v_Pڝ;?%tg}dr_h<+6׺V}t=_ٽ7_O}ws.x.꿘-7˲w,XLewU
    ޖzTq
    ^ݥ;?Jd^͢.tr}fpޟ wmjm--?belS=v{ug׺,wƽՏؿ"]`zVKjdrzˏv`~/8ZJ9W/�~R�΃qwfSٽc�'zosbGnGqI7�2]][~k+(k)fj׺2܏]ϼ>?{z�ji'O6ܻ{na;RebM6v[pmQ{t0ul=W708κ[vu;bm#jt
    NaK1C!X޸xf+^@U'g|�ol
    a�ۛW;_z4wOiNK	>u`8zuP^qSq|qyao;{_nzwN�L#SԽwgΊٿmoi6#X׬
    bk)(^:yuopv=ocuoYr+l#_�pn,;{ʊKBl.k{pmq|ک?lvlݨw.
    \ޛ#c{'p)9O{oy'xNsbLFpm9-Y}YYt�_.]31Nۙ-ٻ?/2�6"hi**<z!IPuT4C#}5˯w�ll{WnO=y>HG~unثۻhG*q[-[}h~",R.{6~؟ ٻvݩ;Moos.˸rg>a͹7̓lnO^o+x큲#kv�(8_~4|nR^8')3?s]AI?�Al鿓[0.qכ/r.{utLݝ[(2m~ܘ@97fg#¦~Ou�ir;jØ{ae
    l]Sk7V1Or]˽6MVە3l|[0RVUSuY?}J]mw'{﬷M*G/tm�zSꖭe#.><}_uv.쮟!6m<T>{mt}w"|mE{#hl^TnUd,O^oѝ_$ogw&׻#gw[Yߟ64y
    &C;gpb6튗װ2g̪
    s)oSg{#>mfeOFYGuڭ&we#׺6@.>ޞt|^l[1v/;o*pmKCN;%Vk^n'Ǎ�xZ/_۝"l]71hǷs+p|1=7hvTy=AYuߺIM6ع7Vlû6Gzm\S]ݛ/6/.[jkj#^X/_΋x0ݶ?~|q7XvX9fak߇JꃷM]Nm>YK8ϊ=_$i%쏊㑡ڽ>?$;Öݽ+
    Qͦ׺fS>]:nw7Ms;/~gm̻i+3~;U$l}^:G|޽MCkwm;||=w	쟿g]|/a;=b܂MGcyWJlz*l쏐�/?N=֔uǷ6`>==Ӳwͬ�OU(W
    E�e7Go{^?qv_y{ptw]oM;#Fؙޱ=o}+mE[:gTJΔxmU^fg#68}7_9^u;VuoL/S]C^ܻ/d
    SIbqIS25]e-8t^q�cr(!ָműzgT[S;ygb6]w\f-GVz⤧{!�;λܝW>u1?3'fɪ쟓}q$[~/}qU3ceqZltuxϚ^�wic?3vOSRvqG=)!=}}g'pUJ'a6a>ufc׺_}g[z('txݝWwV_;
    .;/c|!?r;{
    [EvqT=ݽI]^@ܟ̷Su|r?��Ɉ_|`as:mڝ{SlNC#ܽ5=)6}k)Pa2՛nѠ�O�_O�q�8�3�_g_�ߺC�ujr|w~W�~Ń7w�߻~	hV?o>[M(Փä޸]ǖ;ug׺u{{^׺ua�\2Q�h�OJ?.>�oj�WL'/7Oqo�B�Ou�dc�ecְIoml��}[O,{Ov�]bVv�VzGO(>R^rGptOY&:k1>_ulLvhcN[kE۳ᷖq4u򓬤]Rީ'?f7fOmɱ>Mcw6oTSNL%>`b+6gb8jad=׺Oo[jdnNmz3/3~A=vuܽko7{/|SnjQ᪱~^N}Oed]
    Ycw?:mٜ~_Ow,x}ɲhGX
    u�ud�+W9ֻwu|`쟄}Mxmoc6>龿~ܻrnسwޛ掛jKK3U^t(:Wuvenٛ6냦S{?֝m_o;)qۏkjwWd1T�u)v]m{:Bh^p5/&;qE1gw�OT-Njubmpn`rX:׺Twgﮦ�fmY㽻rlO}>ǂ쿍7_=	OͭجNr4u�SnN_oV'�wv'_n8/;!OOUuU=sK$}׺,oz|؟.io6靵/MRv޶}Stwnn嫤pJY,=<^7^v}7ecd~]M3Yg?;bmu~#O},}վI;Fouӑ}?oaK|yɋ]inychv
    Ms'gt�P㖳g|pb2JqS$
    Ěw}m8>J|~8q>jU,N/&Z⧧EI {/r	il?Ҹuˌo7dow/hM9ag;rfj*d%{t w(;uuem^}{v6uldz?}m_!zzo
    C)-pۉhvPhuWvvFg:?;Wޡo\}ܝݱqcp-Dze6꫖;=eK7k�v)7Wne|.^`w_Reeybv{!׻/pM};;WS|tu鮢؇i1_wbK&uoǴojQ?o{ll՜S?;'>?ot_ϵr;1}cr$~9~5Gpwtݳjjv$u/-^`迏x~	dwq6ėhTa:ìo_zax9[5-$ۃ=e=׺S|I7?nOwݽ!gVoNl	�gne
    -,tTgQQUM]..zuvPF?N:oh`nwfl}�*2|NN}Ѻ3Yܮ[+#,IJ̧ASPmÑ)~l޻'>0tGn <t^`쬷Ŋm;rN=ߺp;k2ƺl~Ox~
    Cwr>wptȮ醬1]OLw6e/on
    'λ<>{sidd4c#LLϺ^ٿ:e./3'cpoγ=5_!@?sm<# ߒ|Id:MX1؊4{tgcv'xgei`ev<ű;nd۹FzkXUq /nav_rO55wU�
    静wĊ?8-:Mѓl*}qs#({u彷7u\?)>OOj||ػޖܸ|JL-wJ͝߉]cc7i+LϞ{AUu^韙]蝏{{+;q/a|!Ois=>;FvI*j+dtUx}E{t'jr	}//O:Jγ{n|xc;9
    O_Cd荑Y.b>튧l@xird}׺I^vbޗ;spu:k~n޸M]^-_kpS_M5xw
    nO3]׺o~C}~`|;3}ٽp]_MTwo[u֡IᩩnegUe${t�>d.οz_`a:=D뮬_:wb>9�3(rX*{t.X2z_/jn
    t�#7`tq|߻Og콭vl~
    (6I|n2yƜ%AB�'Ng|./ku'Vw~'uzcv^~mFh-Cisr{t�S~t4_?>ol_7M۫q.w_=Yq}rGc׺;vV|'non՝қw.�]h;|ug,n6<^ɧ1
    c}׺0r?��?b�O@ˋC=/�v{^Gݽ?6n2/{#{zi7Fݨߓ3ql[J}ߐyɢTI{QKڽ	ֻ?ΆA�51[W0w;n`7:㵢mn{o!6KY]곾So]۩~o[S-s;Wz.Glm^ٽx/6MM犒\+)MU՞h[^?�
    C/7G:/�З?�Aޟm�g�B�/�t�K?G?~ٻ&h;KY{/JuO?J*Կ6;]$MQfz׺=u~U&p%>@mOW:Օ[3;iǜퟰ6>㙧;1U՛.G^gšW�4>_t�P6x:s6(GŎbP�nJ^Y_M}x#+O)]#flNݿ1oUꩰt48秗{A~*n&ؐoplMLw	:n�wz6ۥ{cG-*r9oA�5_.s;d)S}G}m}?5]ka�F]ո
    ."LMGQO%HA�q|_v̟�)KM՟&6& `lۃ{v�f;7Թ>ELyɉG�pV�->R|'~OڇK}ܰw$=[S_7<>Fj
    $x7u@ͅJ"b׺;ջzS_ގ][ػkc	؝2[Ow`܆#pb?E?PS5,r*^Ehsǵ�k;�9m�Cnq7Ğ|*>2^N\69ojG0ii׺Po_gVߺiQnY	^m{ww|ֽ?J	_VAz;Sݽu6>ۿ/O޿1v{ :nxӒ_-t{B|q"
    W_"{C9;eRケmz{o}RRm=?GS>gwWWK{u׺K{buomwYVSz|[hv­oXbWc*i鷳oI^u]g՛ס6̟Nw?;_][(g_f>?۷~F("mL{°hZܱ+{E.kO�!]3%ڏ'd؟;O5}Oջs֟vO*{v&n32rU~0c1{gs�f?pOv�N'+�d�g1>׺,pwLuϩ7&wM/t_q|j=Մ?`cGͿ?%FݑRu\Snf3}׺kUuV|s}aGoK@;kczt?!o_'CۓY'+[h}׺8r?��?b�O@ˋC=/�v{^_ݘlڻoafY|{imZղ9LuM
    TmoMU6LYEc=L(tuTH{7q;W:w?9;x+jmڽz\v[-#C;m ^Ik+Vw{'>ľo\KvkGMavgPziGQ|7뭓SnNVco	ž
    zS
    ;GOd;Kq>qtO-8?llܿŌ_:c1Lw\#!uީN]YD{nʯ펀=o,=GA�e{t@>B(^O;_=vOwvht;}>'l]>>SQ�/~]{JZmrbs/uMU{n>� :J;evwtqY;f޵絻kzzvR۵h*<M~V{?0ǵw.ݿbӦڵerٶ7ޛ&pmʙֲ<-zQj̐?U?oRvBusw?7wnjV�ۘ
    {'rwNh[[6F.1wAMWn:LC=`?װ7+6
    𫽷7n.Y'_6~gyVS+drOGP7gE{K/﾿m_G;_2�|ES/j:I4͑>ީN]YD{nʯ펀=o,=GA�e{u/{#c;~_fv=Y&=z/wb�{FH0,(
    UJu��f5|��@_�ŏ5/P��s�ݞ׺uX?B(ϙ=;K=nޗN迏:7Nnr J:/y�cj()9sY�u{{^׺u{#�kLT{+??cҏgKڟ?'K�qq{�]��#;'XAsk�vװIoml��}[O,{Ov�]bVv�VzG_#j?kmwfڽܹvNyp;K:#kZ;?w	ɰWr[>aFbrRu
    -O{o?7{~쏏�5Bo꽵p|yoqaoΤ}zc,Yl?CI^z_f~#5{é;{gvf|VRtsl;p~qTն&рO&6�̝=I]I�̯m~E�oM/G	?9>ϜE]44]Xw;jz'Oj]6Թ35o{Ǡ_+6dx)'-|V~GLeEcR,T[?:E?[uTL?(?^/:o_k6_Ýv^cꝳ1Ox?pvgbTv%qS)3^'{ws(6jgN�ƾ>Ϝ4ۭo׻󤷿Oic4,c؝_"glTC�i|۽;>@|=ػ_1s}a};)}~a+VN_odU[oc[tQd0/؍3ߐ򣴷/|靧ҹ?U8~ٕpUSs:Y�wŏ=׸7p|^o'Vn,`uݙ<ZaKG_rQt|t|Qլ=׺f$.'Nv{pN_jg@,6d%Jgqy:FޚX1TUU{tP:W|rzsn3�JݡԴ5{'__W0s{sIC.~m;6ٞMӸE/u5O�q@v?]eݝϢvo}/T_&_rldo2[{~L|E7]ocӿ�Ϗ{�+N_/+|x7ǎ�;W4m7H?{Kw,W`3>�/_~-uoowvN읓3]؝sYsYmUVZu�w_{~쏏�,~Bnݵ{s{\mMJ!:ʏ
    \C0l6'2t{uX?OzYc?ÿO+­t_s2;s?k#�Pmۂ6j>CN*L;[{^zoɍ'eyw`Umsgl{C�0|WQ~?OۦWS
    o\}ߺ^؝f{[w~@nU;K~f|gwn;{?m|�͙EE/oͩY[>*`׺�
    s*o�yl�olľuwg7̇cg#qt]'|_;O>r t |ozp|kwNШ]tdwէ_^!"~?w6pmKM-49HluN;{?9;/~:ױ>OiSp|߻KrWonCo_6fWklΟŸwhbN
    G-}>77{t�0]8jO#o{6i`m;]|_|`
    m=_CY(>נ{�˺|?:@mOu�Wίֿ
    +D��I	?yy<�//ly*Ӹ~{k}wgBl|�Ľb|@_ߕ6^oz%u>ۋxkઢۛ;n
    =׺׵~5x|X={q۫%zeWEU]GM%K"<(ZE^~U|bo3o{rmk)'�WO
    ӽ/eU5OV
    MTyumSMetto~/.^ɟ?o>OuO{3)[yAmֿon�EuLn2MYea{]�4mj�":熯~ANuOm|?~1wřntVޔdg}Q^�rXu?>~Si�d_3�v\2� {;OqIߏ?'/=,?�dkjWaE^�y3M*f잼Nm׿'>Gks~LnTl?;|]?{;6Wx7u-͆Rj۵I{S?#zR�_%ӝzT|ܯT/Dn`Tmplgۏ{H2u橳Y1κ۝w?Uz;FXжS%Tv?l`q݇߻3*7IYIڸ
    ۄSug�6BNڽԽI͸7SGa�fLmt}�F5}\5S׺$cꯏ;s=czpn]Y>zWn/Pw)=ogyCVe;{Se|]_{�Qh՝�1.;1=uֽw_Nl&^
    A{d:]ju�ٛݤٝ6ҝ>^ڳkk!gN_6}>2]TSWW K�~k'GvjAwɞ
    ӟ˚J\_7l럈{/F_:xg2'M-UG[l6C!@[�7?ou|eퟝ wq�ʃG=q]{op&;3cd~>^ީ흀?uϨP=s%>^0ܮ^߾0�0~E6ōQn
    ݟ0^쭱RvWO ;'Go	jVfi R秩E׺`/}&wXo`uGv|}=/Ix?xz7[Փ^u4uraS6^߽tX;TOr-KiSV<ufG+!:tjlNJ4.&!V
    gZtou�uft|�yO	|{a1�.jLv]�.gȼ~+c|A;rlPE7\A7B>:Wo�o˂gIۛ{nqu_R綷
    ڽOl6gM{]vbv+s?'6c7bwN[)ӛO}A0&ݵ/nǧ%6j&~s*n5!M=׺>|/{{:so~Xmٛ#]wٝ>v${+Y8]\o^ݝxN=v[g�K>݃avfwˏ}!{?񫽶OkmS5t{1xL<yk�+v|2Sֿfn[57ޮJ]Y]S_Ytj*Ut\b1*:7&Bu͵׺�~Ugs/XO9~Ug]׎Gl~{ҏvnox;~Lw@
    X6zoei{hrn~^�񯠻^8KY-{/5?mP2,Ef`*:i*YYB/Uwm0<^4]�7+s:^ŬEWIS|f,7Om6c}9n
    ΛOm籿|ߺ^qدcz󢻃۟{'fC;^wi|,6�Oˈs+m}r};;vο�]NJtz�˷u}7y�tvo`QWmnˎ][i&6ROu
    77ńA?UX#~@l	~@aV;]w.ꝗ9LYn
    ,2	i;wUK{u;js{Um5NOrwn69o4Y:yh(ڞ?uc]߻[r|lQ/pvJYwG6�b\]йzr�ʳ$K)S40dr>(>4#{	+Oۏo�Viu޿);|J˷~@vTCbV�Q1XvW7׺7|=pn7ο볺h_�Iydk7J#3\|\3cQ߷WߺI7L5n?v/O|lؽ/܎㝺Cmw^ݝ[]kn1
     YʣR(cZ;{�]�2ݛ/_I|`˵{ow~Gmm_~0|_muܛ2x:m.iw
    u<~
    _a5[f|
    {gF~cgtɌfIޤ;~m-93&C
    ٵ' GA9Z_u
    {Wr>/6/}m:mY^G)ݛj}mjܩk(aاuɰ+W�?C󧴶w_tBj[7ɜ~Hl	r>"�0ّ.{R^
    ÏLu
    VCr{us-{ϳk|dFmL^}ϏJm~R|tgVfw'du>mWZxn|m8׺`ٿ̃&gv?Z+ٻk;&v]�#`Q�fwUO
    :1^?iq_v{p|[WmVu6>5
    G&[:kuVk~K۹u?#-Sŝݽw˃g7mm^7M|}ݹz'	Md
    ;4UnL4WoC
    ^؇}M}׺PM{&'vBo8?=ɮs|/}ɹ�guFP+~ZT{Wr\6{ڗojvvݛ#wuAoa.={)X`U4AX{uH08^ION\:/X*r;æ<a:=?	ٻh>un|交cݲo\Pꇯ2^l]?C��߽];O=O]nM;>87d?!W.Z<?ғbn2MMٹ_O]S`w'Mwǽ=O;b|U|lߝ`.Y٪k6b,&3?e*3>w}K0n1z|9}N>!|-};o]unf˽fjmfn=׺o_gzKWߗ7-Ȏռz;1;ֿ+zv�>jmχcUOuDoi�?.�Om�_o�H/��ϫߺC�u#]}k~O1w>x?7Uu�dvkKbwTg/9C[d7TܫUa׺�~{ߺ^׽u~{ߺA0�G֙ΨV'~ΗTD�7ߵ?˦O֗8W�{��/6I;l_\Z�ݱ:аIoml��}[O,{Ov�]bVv�Vz'.Axnڤ׻{>?⦅�f{z�sؚU]NT)=%yIRt*>6#7mn]6Oʿ`adk鳟'v`Hݣ]Ź19_fʺyj18(׺Po�_#M;cu
    ]zW7I߼g7s/N_ >?*,R'qm~;=GICY҃r6;pTodOyt]Xn݅ S�jvL.|�7~m̈́j碮
    �~
    +w[�}iS{o}AUC|Ouuf=q鎥-㾺�Ee6ݡ`pu)0h׺:/Q|u'`d	ߝݝ78}^Mjk?avf_
    ɗ&))!f^!>1u>v'`/.[ݝ�}}c6w]e_{ROrI+?K{؎v?*Wln#ߝ|ك#v�ovEw7]~+5+*^=v[bNmvc{Wnc{mm`G
    -,1SRDD=׺,;n|�MKb|[	fv?6z:J>u{n
    vb!RWͭ{mhw-O{`vvϸ7f{O=5{�1;7&/[];,d=׺W|6{W~=:Ӹ;گimaV^c}[k}RW34تf}ǃ*1kEP_~{7ސ8~^oݛ&>J
    ՝[}n˷~Ahl7%nh*w&V8d{�e
    
    zOոN#'GWlܗV࿿-|VVYf{t w.֩ZNn
    n
    :w;iDhǎno[ۏ|[#UMWMK|NU6os)vW^}'~=Խ;v/Y|�J,^XŴ1f&k-
    g^_]|ߛ>?Թ
    $-K}c7f"*�gm-C5f:T)׺Pm6rgn
    }vo<Nk3['~NYMϜ;_rnӾ6C{#񟫿-wo�!*зVnϳ;֟vg%Qu'I}1w׺S:m.)vn˾w�avfoU`Ӿ{[?km^?xqZu#~ʼUf;}{r%7&R+#Vڵ5c}WSs9,=5m{UTb9JJW){��_^]cj~w]5.Go*hl_;'5;;i=$۸jyJ|>2*_u76pS1}?ҟ:~_|n]jl;s:
    H2gr]&5>^7{~|xM흸*7n
    :.7Mona�;C}c>vpu{S�psm|IvW@w�u|xS)
    ټ8:Mlfi:k}d>>u7pv{>sl|NɺN8uٴڻbﭵޛ3ݘlvڻj<uNp˷՘+&Zji^)QOD;"nˉսޙߚ�5ٓ]>C>Bwo_}܍v﫛?AJ҂uU^rlp&wݴ*WPLrᶮC);7vS{nI*߮k6ub+6ނd~
    ۰q{:wU�n^|ai߻>^Nߔ3_?vbmNYʍQmjrearou�c6ٛWvu^qm3j8m|O]uײ.{`#MMW &٬۸jd%^?{cm~ݕ쿏}�I�6nm}�v.myo,^ͅu_�Xw
    [
    Ϙ/Vo-6u^gw@>._FcqJYvO<V5i}׺7._#fzwVl?;1UA,J`[Փc*몲vyL,;t_�fտ].=uK]f6Nw0yCcw&Rx-u<QTR{t3opuY>ڛ[;:vRTRY6n^ػ;3)ߕݓ[1ǰjvF[o1m`zP|3<7OKE}zpT?r},~q
    ^t{
    ʨj=irLegBl//ّa`:)x|̎ڟwŧ5w;j~la.9TRdrTt0?���e�?"/Xs?�f'+}tWog8Lڢ?NüYwV;im^ݻڛOOf_7#7n)5.WpdkKc{W�6Ou`f�Coo=QKe=(Z
    Ӊ;om8to7{mwj;r/v_;!?s}v&sNc7s>Gv_䡪SQt	()׺67OV?*_?�w:�D�/@�e���uW?{սizb`i/?Q_1.]ٻ[)ʍbRS~׺uWސ^o}?8?%v:~d"==C6uNs+]C8\{1*+=׺�w�?:kG�{C	/6�_l
    m^{n�,o_=e={cr1=ݓv_]o}7+{꡷v_3XL΅MY"!_u�JtGY|ڹ
    X6spUnչw�.جܽwkv^mYvq47CKOސy~^l=ݛ{?&>J|Ղ[?}mM˸(~>vWSo7f6nakvVUޒI{�{.{|`;r}?i2?*W6.|l3bȶO=0ݒnZlB0I �.}&0bwOlW`\vͽ;.=xyɺ3\2YѿݛOjݫv.[zl;Oxنn=6Tܻ{1MY"jZ*etH6s{z�hۘn%}|.^ͬ{v`_6vU/^_3r>_�'`ncJ}ؐu;S��{'%"9JfB;uNlT/td=EX~A{h];GnXs};s`S;Y=I*{A73uOitU|k>;tNiCuw.՗=X<FEޛeb;m^ڱ0f=׺~V_'O=]{?^Eٻ){Kn\ίN}Ż'ۻwo;Wae)rԕyҺ*]+=׺1˯'j^R;^ߝzK%vg5{z3]ӝn16+cYϺ^uU=ypnGeܻ|oo+~ϑ>HS`O|{Gۋmpd2uTeV{t�dG?,�D~?I�O�!?٘�J/K�f)�[?o��|��/ߺE^魿ӄAڝ�/
    ;vܝ6�ku	GqX]ݹ0f6,r8
    ^`�-/~�հV�~4m�_!>3vΗۑm޼>	?\v.<G?K/Zu+?:oɯ_�\�Im�2'"�77�`¿>gߺBXw.T
    <F{ul-Kqu;k}l\/pAMTE(2ꐕTG ��f�CλW`9ڽYMǵ~>}Խ{G%PKAq9mGm!ty|n=Y�d.]ٚx|Ղ]X=#/btʚݟ>{f_\^>w/*{ؘo+z=ҒO[~mUc|Ҋ
    7^Ag[=2ԝ�?t?Ov6Ƿ&O39Jj׺$#7TMuWƾߛD펟ܟ6ؿ47Wr﯍YyEl;n-XiV#u썫zL~ۃLFc{�~Zn+C{:OcJaܽ=A{;p
    X*߁vzF>uٶj]xٷ;k)Wf[Tvع^-Peq!*)* 9W{A��͓iw�[>%szj}é{?Yv_J&ts1Ez/&C^?�'O;1ܹ-7n�E}otfOGn8ݽ[&lǻksYݫGPb(18j?uO'�/ڥػW˦{
    6u>b�gnAVo{rp�+n8v%m(fĘXq{Ag[=2ԝ�?t?Ov6Ƿ&O39Jj׺O?۫w?n[d;17Y|}7_haj&M;-]Z&{Ή�f_7/�6��G�0?܇?_?w߳{�ߺE>|xǪv[3lRnNڽA׵VR9l^[dbY]ٚmޅX׺3׺u{{^׺ua�\2Q�h�OJ?.>�oj�WL'/7GqCP7�Fw!�ɲNb�Ă珲ѰIomm��}[_,{Ov�]bVv歇[c/F~nnmԿ;1=o}ɷ7VKktVߛ/qu�f-n0̞Kv5#*;=Ci7he'Dkl}p|ص?�Oho꿍�+d1=^|�#{[yMӓww&4{tH2!{GG�<??SfKQO`7fwVtkauO}ú~4lF߸M˱th(2ߝ̞.
    ~o�>(:?m/0n/
    _,]s}c_Vl#']lњ^~wjz)0n
    ن^ݟj ͇ݔ=v|]d&9$YXdӜ9}׺ߝ?:Gݿ)o%'}69Q{=cVO띚syC8u�߿T={�{k|Ro^FX;>Qu_O_I~3d
    :+&#f<Vɦ2\i=׺n޽SG;ek[�
    
    m>IoܾLϸ+׵8|~dKTےju|-m�f?y�>wGɏ
    x핸m>]w`|?w6؃.._x0ۿUuk�'#ܿ"vc{n윧cn͍zuoꝧ뷶]'75}nb53-%LG+tYo3wܽYt�ȯ]nK>⓬;nwa㲟gUW5%5$4}_{S2[_f
    gS??Ll/~>ufQ3&ڻ_rb+#|lV?;O�ٟ�J]ѯ~�eyn=͝�K#}p>u
    kktW"uCvtϓF�ݍIkr5�5Nl^)ٞ}n융r3))iT\>�wk�W?}]6?gM~R|_w[s:ܹ}ٛOSEll1ƪer~�	ş{{{l/JwrpY>ivǭ6mo[)v�wU9*jk1׺%{W
    �>>�&̯cbw[Ӿ_{fOU=Ѹ0'^]o-#2^eY7]un쾿K[ym&qourY*m;~:zr,81^z?~wd2z[*:˾~A>Bv�JT~wC=s_2NEw_糽8lt{u&x;�&kc%�oϟ),Oՙ.;2'im^�D8_]?SLvsnaT%{{wf2:.}%]BlV3}Goʯ뤣ʿ9</t?PdUޒ\B9ú)^º;f<`|;_VE*~n}5ބ:%E=,dV{uT;w~]u[Kpwjv6#'rk{oƿ?;[zz|!76L&#=Qz}#@wOI|_P	R~Nn/}+5X<?,/z9_;3>0mϗ!:3u9
    vg1t?v®�wW}zo�w>qڿk֛د}a0�vouv|a}�'g�̛=?s_
    ~s\ln#LQҵ[,U{#zr5u&)w7V�ǽ?_[[˿OWu�ow»<_O׺N9jgvW|Pߣvƌ#/v']CN_t욙X\+#S]Y]q7Bil~?c33xܹ]/[|l쯕y{ltb7Ƚmd-r).#?w:b0t_RkWM/ޣQ]{o}N|ǰjf%cj|l8J//?){Onnύ�Y|Xqu/q|qݿ'
    dߛGWQ3%xJ8~-QI
    ҃r|;gݿ޿ϸ>>u6Yљvgǟۇ
    wNm?'1ٺ-ͦTq!nF;W{�l__..1�>)jJ];W~(Ƚ*fwuV=폥nvvTf*}U9Ou_[㹿7P|o>hd_?ͮ>ڽgTԛ\mX4y}Y^�e!~w
    ?�S=[j]> |Ӭ�j۲'$)nad1k?#@|JI#{gLuoS<MWe�旍m̓Խٕ;O7U{pYWxc#W�uȚ_m򛧷Z}wlkC)o4{n_iVjhWkVd:w{|w`m�ٷbソ7˷gT0ۊW`tb*̅f
    ύGF�,ugS�A/�o?�Kw?ҟ,�s�_>%�G�g?�&y׺ׇ{϶s#O쾜|пw4͇_+'۟!�Ǯm֝ߕMV
    ɴv^>-MS!1:ⰾѸ~_)+_|=e??ܿ&@�eGWȾu=�?z@Rgv6nvbuRWF{OwncRu�ƾ/;b}؝hMqmk_Ysp5Ȅr{�3x'C;=oٹ?/ݽ[=#k-Z_FS=Tי*4=UU{uw׺,߽{//�%1~3QSv|/m\NF#i)>E-&ࡦCY,zQbj`^^v'Y)vM|@[=ݓ�3ߜ0oվWnv&�fi|smKTrU͵۵%d>(?u_noo_ʁ~GteqڛWDl;ɝ͹+gSn9X혤'[*fCoOW{�~Aw?|vOfKY?+0y=g{3j�1Ǵ?wD̺
    Ѯj5ؽ?	=K
    wulUKNϐչ=zʫOEvSO/YvSUl)[*~{N}лۭ__:��u;7qmn\?vI:?Mֺ/y?M^�e-dxd>,?ϴwwwv>ԡKS>#~w]a>`Uޞ�3UT{}'qm:JCI}׺~S�9k`kvWx-Smmm`;36-7FJ(7ܟN-:uj6/	ouzcޟܯݟ$ǿ�?}wyo6{uL;ojOx^mlwMf3//~+|]zpcc͏|V96E6bvm]&^A;'no˗ɪϟI7SatOrN\'zoƏ-z�qϷfk9cz=˰}S׺:~oL�?N
    җj~�+O]wpܵ{x65UMz9wE{t_'@_+[C>Ow6|k>~H4c2G#/+8.Zl&+)S{uNuQ]I;qj];iڹ:-Ù[;17_i]fUTS:A-}cTIHf�)}'޽;]b�67M.޽:�5n׿oǬ|{t |*󳼺?o>2u�O|eߟ2.wcyt@g\ڽc}Z|¯!,TuWf9׺U|`wﭷ�iYu�|Euv덱x>Lvstn~b1~9vH}}vwg^wV6e;§{o8:3vmô)Z7=n|ې/ݵ"oΕ7oNs?Yٱl:I('LBOq	c^v�
    }<W9Z.:}7Qat.[pN+iEQ$9S_̣?J|a�~�|Nέ[flMfc2izwp|kmUv
    >;�d%˾ǎg}׺՟O��M�,�J�I�{_G{^A6;zm]˳;6gme*[uR㳸]uN[37SU3Qe
    :%E%D*uMC??/�%O[�"�4:N֤ڿ$W[c-|&7##1X3
    u4CԴ+XW&?6+~EB|zݱeн{k}:;#ڛ࿺t>[EVΎwI~d0LǾآ36oǍ_lu�b0[~@IwvR`:.E6GIsݿջOfnU=:;>ڿ
    ~Juޘh:K}|\ӽGnj-E7ϻIi?)_ōG[ڟ{@t'I޽_ޓv.Q_&F}ٛ'?��_z�JiqMtɸ{anؿv�qNgm=j}纻6	E%k|/E4?U9m跠>^߷e6ڻbv[3MYp[|uL[{3vvvl,C=n2;G*7u{xO7=!1?1]??ORݻ]Ѻv'[�*>K6f/f�H1m+)Q7ct`>QOB|?vw۔i:O{Gqu9/ɎqP쯗kjvvޙ!^]LMN6ܱ{tWw_6?suM.ߤX5]35!?ognV#͈
    MIM87kq9Np`}׺0ܸO=aӣv7vv}ujwq>oMٶSy{wQ{+i0MGD�{Kl]_ڝ׶7}[?~m~>ݓohE㡩OYJxu	?q��G?%�_/P?_/y>~�~Qn~TC=e~`uw`=7Y?kV>{+>|T&?Skbf�{!5{^׺u{{^׺	]r?uG�?=(t'#^]2x'Xź^U�3=Mu$<}lҰIomm��}[_,{Ov�]bVv歇[i_%6?b퓉6_jm\nep;;xu,Uµ1VOIV'YI3~魧pDNؽ.tUZ˴»iϲv઩ޙ$V395S^�WXM{gLM7WQ^;-}5*MN2]zd^ٟ]i=ߐ{o=ٞyN{V
    KWgagsoSoLrQQCLt0{^돏]ӛQtO^\u7Rdwa7/gn\
    ܬu"'W.u3u_Cbt[)S6_U\bۗ!.
    ,B2SQ9HcU^렾Jm\~?')wf/gw_ZlڸCw.?oo.wG(Xcjc%pH3~魧pDNؽ.tUZ˴»iϲv઩ޙ$V395S^^n__r|?>0nϐt{iNܽ9[
    5.ܴݟu[
    ><Mj
    ttN"�
    렶rϑ{{~m
    ֛/ܻji6,qZm:*驒<MK�OuXm[?=7mMC{uv:<?g^ԸX;sT)EV {c�?;�~?}_MR|??�ޟ��~}QWOAoNz?g='D^yޚڻ
    |5VTal6˩ۘ14KB)PS:F`^]Sj/Ⱦ8K1{;evWCq{}as=GR[+S5d+Eou�WXM{gLM7WQ^;-}5*MN2]zd^/o2m�[o|ĝY/ؿ;s7 ovpn&փr꒮T:z[Amݟ"GO}w6^/wգmRm8X7/tUS$x5T�0a>'|X?�f2�:o_x??ǿӧm?o��M_w?{�V?VtvuoJu_�Ymݮݛ:�bmy�;O/W]UeT>$v> ;wŏoe47�N7]�uspw�O?W=>'�EDv/x_AuOjnnաs;kw_;]Us-4u5ʨi׺OoT So_�b{'_e.oM*Q!M
    BgAn>"Gw;Obg6^Sv^լrYT1Tu<yjd"p{
    렶rϑ{{~m
    ֛/ܻji6,qZm:*驒<MK�Ou~oo�=	iY��_/�q~o7{W/|DY)1[^.۫{mݩ0-Uέ}M>VZj$yD�u�%{Sӛ1o_>]̦ݛ532W)c7..hB9M^�_Ǯ)q_G�lNݘ}iSjwU;+ܸEgkbxM"L�wŎ=ޝ�ewoZ�w?qo{7vۙ۵#Q\cJtL{Ee-OȽY7fm]SZտ`SKқq#Vq_P P/?q.z? ߩ{=i˲dmm>ϮϽߪޙ䢣V+!S^Eq~"|`|[vl^T:ke-U^}a];spUTLĒVRetۿ.؝ջO
    ]�K]u~4bv?OE8ݕM'pT]'OU6F#>'W۬ڸmW~Ul7.:COp[zcx\6ޗ`#7f#a`ruB5ZwJ:u{�^{_|@ks�6wtzexVGWG5C
    kkt?�~�Ju�m�G�1svS�E?4�H?�?}?>7ߺEm,已59~m<fݛN)(t6#Uw]k{}6NaLƛ#I)6^@mֿ>0u魿}Av7AuN]Sw>G{f7.mÀx/{5-5]NK*;U4o;vaAoݿM/
    CxhVTkvP)ߥ/fL&PTR"{t�?_#?З@�Kw�EO�I�H/g?��&x}׺&zS:�k�uVݹn�d7gxFz꯷+*I#^@׽t�d'|X,Ɵ~u?u.O}Ve-N[r]_CQTU㦣RT^?^q� Ps�z>?=/K��^۞
    �}o
    Ke__~ou];v_ni|&ql?q*ooN੒Nmd5?F,}׺&zS:�k�uVݹn�d7gxFz꯷+*I#^ޟ,|/�ȏ?Wt龺G�ۛ}x~i1^?E3}f>"|`oniNtTnڽW1kw
    Vӗ/2V56׺3׺,ܴ"O{/AuNwiwVƒ
    Kw-7g6VplmZ§:ӼbtgtP6_[{Z�}Oؿ=/Y~֛ޮ_é�a~h_B{O[uW
    j�
    7ݛ{gTPiuoLvˆbl,.NRAGNt?=tgj.tOO@
    :'gdem^]WvV\G\nJԸ<4u8zf1R<(J^|P
    >MNVu�\t/G<Eoǿ!{1Ne=ٿ�yk22*:leuV{A�W[mo~lvl(t6[Oum̍6con]p/,5TUESKSK^@"_]�>0bwmxzhwWum^ǘ[iŗ}x=E1RZo~{
    ~o|Dw6].TsM˻:‡iw३xy#$Ѳ4^Awŏ-?�e�t�C}u�H(�f�^?O{^_sڝױz5MpRFOW-T/+:_ŮvO.vmnaMA$Y(Z{7>n辔_3#zmwWm.�E	6Ӥmlpc7qOW%fKu;<u�O՟O:N�M��/n�J�Fo�{ܧoG^A6߻Wr];ov۳
    {Wvm]ǎvbEdԵUPMUM+*23)^�mֿ>0u魿}Av7AuN]Sw>G{f7.mÀx/{5-5]NK*;U4'6'bn=kpt]mߍ=/؝-v7eSm2Wb?
    ŏJ/Mw;bNg)[/uVOj.
    >ۛzf$-XN_{�cet_i|i�]%ֿuӻ�xfm͟]}Gim_bcI㧒!^P
    >MNVu�\t/G<Eoǿ!{1Ne=ٿ�yk22*:leuGNӴ4_:-�}u{O`�sf?ܮ[s#vWvj2߱r3St/ͧwܻ}m6NvvcݛWqpmn]gvwY5-mT2USJJ}׺�67/a}uOyko6Po]SWT]ϑٍ˶p6?/^㪮KMWS2RʎM/Age-ǎx}~gqo=Pl;eZչw^t5zm귶f$Xi+d5S'�O_>׺0�wŎ͕}�etZ�w?N՛+6~uۙK#Q$cJhtB{��/o�J_ vW5u�՛;?=i[+#Fn5׺�?V?:�6��Os)��rw{ߺ@�\|z.]vnݝͼz6^]#3	{;p.//wfVVf9:u먙{ߺ^׽u~{ߺ^L?�C�s=1�	G_?O�:�-���_�lvؿ y�buӰIomm��}[_,{Ov�]bVv歇[g|G>p`6Zuuo\r{onfw}[nV厏!96.e'U^XO>@_?�Oٿ"[o/\m=gCk~C9{;ow>竰3PgOV{tX;kbt춿~yA�eO�eLҿe�q�"�x�}YߺFM6]3O!~k_˷�Adq_
    ״{/{O1ۨΦvJM܉W0Cshuwkv|ЪZ//7e5'g};}Ge.fr^ɥzeSaczz+=׺Nգ-W
    7:_Cm{hg$/lqSv߽�S`y>f}=-eJgi^�._>dAS~(dnO_gvK}m/+v_nZ\o#O1,&27^|>,`+J|@K@b:Gs|nݣzun=?>z
    NFCvnϴ]Awm|^;J>a߄`T;:	_ʬw.+{b:k;kplz6ZNDzz#d&-ߋI1_*Y%^w_:
    x#;ꝧ.wm=ݝ˴nlVS_J堣wjx׺ ~v_0A| k{b8.[_?twzSn=Ә{fMNF:^&A=\_/YOA�w�8?9�,�gC7sA~��m�eg/_O{c3j}o;f>;vt;az9\#�\DUVuTMye)H̾塶ςoT`ϛ�0.gX̓iuT)޿)]ueݘMe2ӶiD+O]hd^O՟/ʯ=1=:򏬻ר~%m./�mO*Ucrc20۰sYJL<tp?W+J���e�__f�g?EA�Ŀ_�GcߺU[麳='d�?@|-ɺGqi_;/1懱;b�lS.ޛ#tQzӻe/P{)kwM;{
    ;tcJ%˻7ٍ{Sظ
    w6GMhOS]Q;{u@?2z~[�/tuX]:];
    ّݽ76>[vFmn~JMٝc{ٟi7}�1;G�gݽǺ~?|Xَh7?'vm`md+wIҙݱ̕=^2ZѿRx߾?]~n>ǵ_)6^ۏCWhuv}mlnͷvcU>դI3c/۞{��/=tٿ�f�wg ,�?�m�FĵW__'ߺUn%bv/xο-W[=E;Ow�-~&~!|vO
    xmldbs;d_{Q7{t\sneo/�\9/=}L^ca0*6[߶6w�
    Nڛ+{C}d:\_~?'}wr黺?g?{^뮉ܝi5qU|
    <+n56[lsPiTs�'騾hth?_wf>yP/k|u}/ٝؿ33]7Wnw'YPeZ\)^Xꏋ%KWJ޵�ܛ�zw]n=+1۷uzn:n.wM"L{x~cFd>7e/�36r{\Μns7Nᅨ[3Wvvre1fu#!eq-OP�p=mӣ6Ξv|=c3w՛vӻpٟ>*?6Ɏp4[�i7~F|}׺�:ݮ[�ž]:g{g߃ge;w̞ވݽ;ߝ[Sb|~5-6ݛcvLv[
    џY"Ya{pvKV._]+[k#}b3C;
    ˈ3+^?4LϺ^9>O�/gbI|`ӕgkt/׷/vɎNm忷y?2,;?+ko]Z>ٔזoj}C}f0]�_-�z�x܏lwiݪ}?yKö4Xؤ[odvnvzjL7EuOWR|͚ߴ>n]$|O7\?o{υݽml&wQ�u�̏7}zŏ?�r|ջWn?=>Z<wm|n8*#ͷrP{t@:Gɟ[�fvX.|V>؟v'߁=m9=yw~*u[=wN~ƬVmf&҃;?d=0mؿdt_a,7i|%.-ztGYnNݙNs3:`=ָΣI("\7{]=-nG퍧ػ:_|Xnv^ٝO[E�;7	S3MPspgi1*U^�٣i�*�M�4?�~_�3�+cm׺imCݝ˹{c[Ϭn꽣ѻz뭶�n�76=6L}}�/M]kqOKq
    l%%}&#5׺,ʿ:?;�̭�쿓=߈X,C|BOo~|[ok%Ng6Jm2t9fIտ|?b/_#�
    {/'J|ulLwfw/hwgṁh~XEsb\LP沸j́Sg&{U?/dG
    XΠg?÷c;i6덴p>@lNc1mY|f:)^l{ս՝0]ҝ[kzym؛&c!s?ve_FU}DoYK,/HGAuϚ-Տ_;Sdɷjr]@=Ul~ؿJb2[~
    dTSQ<
    ASQUџְ[_<۟>]|hݟ�b�
    ՟_>ey��2�gsڹl[l+/u'�/̍~>oI[/a}*/XmY:}wUsdڙȩ]9bt?s԰+ߑۣa0/:{�́>DUd<Rc̻Ӫ9vu|sꎜm(2ԝ\͋+Squ�^_ ٞl^teusbSuMd&W}=RdJѬoh:hre=׺@7nn_7^���/zS~'q>AJO?{swgq_!xv?Vw=.Ŝ�"{>soLVkG~0`;`\wG(:oyZsd�2ٕ=u=꽁:W+>jr{{mݳ׺
    {wf3.I�]�'UZ>ń߹.߈0{�M.pbVM;{cO>,|._+z�ro?u_lϬnݸJḺ25
    43u[#z1Wq%7lNޔ]z>a|诓]G~8uϣOveGSɶz`lf&ܞ{~#7'\}�ȭ8z�G5gy�lnEMwҵ/ZlNWf]ø=׺;/n⫺'}�#M^:�۽+'t|2O�r6^נl-{tH;w|�h|��KzgJn˂Ց8y+n|l&ip|mKN:,&Tcm{vnr-e7ڴ{zdqxjٹi6.{&pn:<>Ji(ip'Z|q�O=zSۋ>?un[^`?lΠW
    LGomi(Z3S/&pdru{c{�?6}v6NA?&;Gom�S.;h,7t| ?>AGOņM;,;4(<ߺ^߈;oO}_rW?Qgtv`u~kmCc'kw~9
    *+we7~=ڴ{
    V/u57麷c3>(Wat`Y�OYӂْvnw&jAΠ$5^�w;>2n>n;o&7zf+[uwĮszv�ncsحX\0y6)#^�_wwoC?u|ᅫ
    z_nb	�8ɣmtۻgwR_sdr[u4}?%_ߟɯ_�٣�Fݝ�2'"��`�{ߺK�E賲�ӧ?�B_�y/�E�H?//??w7ο~hV|N�dJ_�%V~q�#۝سv�A�%WemG;"O`
    ٵ#U՛7sxUQt^|N|�Xͅ˦~@lϖ'1[ᄏ')c߳z..9;͸7Fubx}׺Oj~-7e=?;7LʾߍXjn]럏_Ge
    ͗Zwwɩvw/SÏ\.Ou0Um2Y>[wo;ĮLw[o6>ݽ�dvlWI
    {ib2K?A_ǷwW_ܧ/}K/E_$_,9we+vfͱ75>[domI44{nuMa�1\_uz>,#3kR>lmw׍)/bwpoMvs;kil,&^c'ugewi_
    �Cz
    ^n(-Cj)?Zl'{|GzĶ�u|~B|]ӻ_am0Q=3]!A{/7|ehs/pI867{[{:ꜦPV#!v^Gj.8/wt zzssWJm
    :;9"^Կ1?g_Ώ[>oTߕ[Wx|mv=>Tl.;sl}K(7c{t'*N]%݉>{Sen_ug-;W\R߶~|Û6023m~b'[:1x\Bz|{|`B�.
    "2Y#.C6z~vO]rߙ~4,~m{C!+Eau08 �_8��+}^<?�0-Sywğ]?=w\6}	W`/w>;=:zctT=#[{׽u~{ߺ^׽ti�egG�LzQuAO#SGd=iy?.N�Ït��gr{$/H.x-_԰Iomm��}[_,{Ov�]bVv歇[k펬퉝.쾿�?[nuۿ;fK^*#ʨMRHyIRt�,~,uGVl/פ+']lY6+wm-Xꌦ7jtTîg??^;{ç{wfm;;/e}ۛ2;kvbp._vbM*SFU׺g/Am7xt;bNg^/wգrU]٨7/1$t3S$xgr׺/Aw]Op.m=M{lf}/򴢋+
    %IUţ]<ʞ{>BM_;çdwVo콗ڛWqجvn(#;CU--LtՐJhٽ׺PvlugGlLiw_e�O^[s&77ݻ2X/24qQVUE
    jDSYӴK|^:-�ܝu|vf?ܮ[Wic2߱ISQ{t?^?�KY�_K��m?�{��OɼoGuov|tߐ{on8nyN{V
    UIwgXPsoSoL<PL\t0{^��f	�fo��E�N�A?�?�3/_'t�ҟ!zoq;i7Jv^MT8Vbmd7gq{I:j%d	4l{Bƽ_"çd.콗{W%\b+7f#]Us5LsʨR}׺u/{WEOn
    ]={/KuWc;5Vn
    F
    *(j)P22un^v|֩zMm=;׸jۛ~{oJ̖M1Rɚb{aB]owO~A-M7D/e;eZ6U&ݝaC{mͿUM0G[YC
    3ǖer*/ccOz_V�]ֿ?ӻ:xn:=}wGv__}Igm:^�>BM_;çdwVo콗ڛWqجvn(#;CU--LtՐJhٽ׺`O?>/�uٗ-�+:w']u'#�=�x(><i]>h{t5~@lߥݘ}=W[V#\~[|u,UTxdU^?	SV|Qٽ}un}oۻ;F=ۃr5s7GL,{q�0;�j�~|5<Zo�{֗�qp%5^/ul~,oW?ٖ�d�wD�E�H/�[�[�sߺC�u�Yܯ}ֿ+6S�ym͝=_,;uG5#]k{t {^�_u|믖N~ꎿ[lMUC{`}),wInVOmʚ3`C�{{^׺�V?�6��[s)�?%�_�q~wo7{ߺ^rٍͫvVn
    23cVXmv5vR}74JƧ#I*'6^?c6뮭ݝ_{zqo-}n-K%M7'o]OU6E>׺$k�-鑩
    veݕx򿡳]g}oSCU0mvC1eUE]CO/BW[l^wr
    wnm2;w/[me~tոj*vJ)]b^^ܿ!ze7Ƚ?>Vm);r^tV߳v.jdϷNljZMiC<A׺=u~{ߺDY>�d|u�{f߻Wmov;of;O3{Wvm]ǎm˶Ed5TUKMUM*K2^kvm]鎩l˷f"pnͧWYvwK]ku5Tn
    Cf8E%BGQJ~'.ڻ/M;o<Ef{N)s8:uoՆػmSWe*ii{n<~Djr9ZzJtxou׺u{{^?۽՛}/V>ٽ?�K]uwᆴ�Hy�HG'餮%GMOKuc6뮭ݝ_{zqo-}n-K%M7'o]OU6E>׺�;Q|Sw'`n
    �>wgvu�Vvr�qm^-_"�;EJ*q;Q25t?^׺u{{^}q;}f
    ]OWҟ!{^#Go{-ޛ33KM )i{i=ػmmv^m=6ڻsMkmm=5#X8iha$$TUQ҃ߺIٻ6ڻ}o˷^{37ݙvڻOjuNcp]˸s4xb(檭*jZhY]QY@W[l^wr
    wnm2;w/[me~tոj*vJ)]b^^׺u_$IopOݝ՝ܿ#[G:iȮanoNTcjL|5>׺u{{^?]՛C}Vٽ�Duo�Gx7�G[G%c�G"Q㍃u~{ߺ^׽t^=çS{t];;/e{;ke2p6_iiEVJSFy=׺=u~{ߺ^׽u~.Zd?:Y�~:]P}~.<OZ^n?_/*�}@��&:]�>__հIomm��}[_,{Ov�]bVv歇[a/?IuZo\II;m~|j_8rhb_#wgXv;ӽiz86ڝɕ{f9܎rucec_7~>az>oO_�$~m|^	~/tQf�ؔ5m`=tP2~G=Y'?<??'Saz7tmSzO_v7Yvwi~OBm~K߹iut>Ӭ;c@�Gm=1�
    AugN~kߟ)�6ɥ>g=VܟzV
    ^oۃvTuO`ڵfWb{)wzl*gǾ[&s
    6j:ZŚ{!'ݝcz7fF@?1v_zun_Vo?=_vfm۪�x�bn;]y~:ˎ/^O]{eui]s|1ޝkY}vvWI(mw7On,nSln
    ݋sZ|[пB|u={ou��N_؟E:[GSfۅ5{S-Vn^Ҭڸ̮WutH2x\v	:nfdkx
    Wfw/u5;�>cm�;]Nܪ?Imm|v6cPif}׺�[uu�koόPm<Gs^[Kvpܹy}÷6_6.q
    jT\sUK?b
    I:K~0|;kˍXn)wz.Ifzq[m^-#ξڲb* cj}׺�:ofv/~og{3	X$jU1vȼԢ{v3ě[jɗL2;q~�;ϝ㘦c>R|{~v.n=>OMJ՘>>+5IM3/:z|tpbjv�]3#zOSOGS'^?#vn^!|+VevvW{׮3$){t�vfP*�}k>*wu;Omͫ{v>l*jw^H|/؝k{WEIw$U嫧d}׺7�(3?'7V
    ӛG~ٮݝ/zϏ[Zw|cjqRWWSVdPVuP8nGjWc%?AaEKwGؿ6?q]7;yPL~**F·%}׺ïvˎYCǸSSmLY;:k{3gE]=/7.گei2&E*׺>ӣc!@_�n1
    >gqP~k)i?mi7ɪ>`'.݊H^؝ۿ44T/}bݎ'N}�a|p�f{iWæGi툰^�J93?_,t'Q)$՝|uޟ,y_"{jܟ&c2ksu8Z۱`?Jؔo�7vd:�{�;K~d:/?͉MWJ.wt{έ�fPGfC*)b{}o]7?˯79Wo'o!U]]>|{q|^?o|Ol]e_nmI-jq{�
    |n￑X.鏟
    @|&ҟq}=پ[si[K7_
    +fݔT{&-əmۍKY^&&_M}#��7Pfo>6j;xϑx[7ҏb]ۖFe[=׺LCWlvFnٝQ}�ȯۗ~w~ڽyCo?.}uG{z1{v⩻FL"jn<Z�oW?즿O]?�"���f��]�&{^>Dmm_=&�'�N6'=cKnΜn[;yn|oeTum|.(f7YC{t<}?[|yW[;k7wV�2nx?g7[wym<\�0]a{s)./euXv8O}񸊞jM[C:GMꏃ[!Snvm~;w~;#/k	&
    ;p>{
    ^Do~N0,_?atGl-�j}Ղ2?
    {7V+}|^ݙ}2w&Ư2{*׺oۗ�K>,/K~)GnjW4?>Ln_כuwvS6v{?;7ynݓLsc
    `.KB�;?~?U/gĭ{+P|6�]7|<ob]
    i7LluWYV;ߵk?W�$9F?�6woɟ]IO#;AGuB=v~y?Luqd}N>~^|Ǡҿ�O||Cvo\|O;?6\61:gpvKoﬥ7U͎
    SCrME^tt|�^\wYW{;bvg>m޽?� u鵺'~mν'iJlǺB?tvO/G?|诟G	�묿Ct.LFw;G'ltjsz4X;G�M�vQwѷg~pG'/ޔە{֗`|yܕC{Glt	N:&d=׺?�r+�>�??b�+�@?=߸�u^?`:϶szcMٟ'gvLc�,/~;k_"_?X=dƻ�mAs#w&�*C>oxI�e/uF|�fx�$Ygn=>/>7ӽ>vu�Ɏn~IC_ZLGܘ)ftS?:|loߠ{2{Giwn)%)!z6ԛzmQEMO5^�n]G?g۳ͭ߻?S+vc;;Y5-ofUC.ƪJKje>^V^
    ]F_�KO?CUw{f�f-n2G'6IQ{tw^XL{~)'kwI]w^#1P2L]L54Dt�~Ti:v'B�~foi;_u[sr]e(2{Snly2yس>
    L%7{f՟o)?fc>bcwGB�0JUݝ:aV|}yb`lؽр4kw7;5ُuQB6�n=vn|�?#"�_3{W^Rqy}{to�6읥};q|x-M;1v"uM`+2w/q|nXwn̾wݸ6b=׺O�5ʛ/	xoOkܻ~&vWM`\|d|}
    zm7Rփ24%O)箒&^4hw^?g0ߪvOStG鍫ٻӸr=I&9ne~u�,=kMYahtuָ8m׮�\n
    ɸ~_ϴ#�uutu+;zjg؟m]͸?6�Qval|vkfu�v�ec+S_'.�G[��3_?�y=uA;@oMb7囃]�n=Skύ]߻/~[w>AVFؕ}ѓܵxRTap[o{fu/W]ܟNc[:o�6^O7_^Guvo?ow56=عlljvǺFe]>Ro�Gv1[ydT]K%qPϱ6.Yㇳ<i}׺ '6�ʥ^?YCѻ�au<>�W
    w
    =X\f>!pbdE'[n={Wml=Nm=Xٻ7VUX:CSw=7ԪչlB+/QWQ=DJjs>RlO>njG|zgik[N_&zuT퍿=y2|$23PÚyk׺m[ޝA;/BuVm{7k~ivȿ=7{|.Tv-N~*pUg
    {uO]|xӸ/}�]?Y
    ڰu�!{P;of;[~�;`^{&=Qװ#&ᅴ
    ~)<n>£KmQEvM9OI}R:]&w;v͹y2ԙͪ^?�"gH|dcp0ҟ>~~w_l]}:}hS3u{xG
    O`x�=~ۿO({jR?h|ŢSo�x?�m>͇XT[Wr+�>�??b�+�@?=߸�u^_ݛ9mY{3rOi,uNRml]{zn	Yh8|}~W#RRz#׺.~8Mn|ȇ?Ql{~ڿ~Oώo{n
    .ʡo.>zm}X�Lw%1�0o]6o޶nc')v\>Bͮ⟰?w`l]٭7fGI6v_mٶe�1h;s567G�5]gݶ5y,_ힱm}t{W{u)1~lžo-owlɀg'35w>O5
    Cw6s?;rخv?eSv{t�|	)3!A?}Avf-r;W}sXGK꽿.sm}USW:/u)6w+H|gf]ۘߌ.q=_Nvȼ6N~۹bCv˝-u{ݱ�E�H/?)�?s%oͿg7;_|?ߺZl7mCkn濸QL?!3=j'Pvw.l'E;rw~]I?7tjad/);c/)U§ra39uɻ3769@o.nm;szN*}o%OlLJ᩷Vۛ#sl|_:Ogؿsx/X{Ck=c{2-SGv6!m|{޸_ސI/�U{N_pz?~mT+\akg/o�7pT|9>{'stA.�Rt wC+~^濾:-77[.꽫7@f{~'vc//76^>_e=0u�s��d�����u{�{Wg{s1cv��][Gcq?V|<m?WNW�s�?7-F91c*|�xjW{{^׺u{{^&u�!��/F�{ytzt�\}a��yW��/6I:_\Z�ݵ:ְIoml��}[O,{Ov�]bVv�VzC߬>m\~ܦ9)v[`vovfUXt絻/pcg+\N;oaYj'YIAw|gۻ=΋ݗԝ{OokvOuf﭅we6Ƕ3i0٪j}׺�;�U9=_ߥߝ_'ft6|?mt]e�+q{}ec9|\~(7/̟Ci'=w>}f[9E՝魓[5G__h|\Φuhnmщٹ7VJ*q`!џ@=~'vG֧	v[67dVo>ٿg&@|TY]nS~l\v{
    YQ5{NȯM7]U3pl]'ݟO
    ڛ~CWvkuyz,>LKZjVF_un)i]avfoUNn-{[?kmr%Hqu
    >؝ut]쾤ݒ|[?:{7}l/+)=m[IUPџ{jݫܻzl۳gon=6Sf6[SY"*Y%XtY^SpR{S;
    
    =6_o9MNEfpSf*J:y^dxS8*7n
    ٳ19ެ7Monfj;^kb>vpu{S>3ClIw
    Vw8�u�u=�g�fK �@!?ҟS�f/i˿,�f __?ywߺBǿE3=KW�itv|{?}�q6'gCuYv�frԵM:<Ozu;_݋W=ϵNv|<k�u^׽٫Brb()s:jj׺O?̟gzxVv
    ؽ{;o*Shl_s{{:ņ:2*umhVg}RmK[Opl6:
    ՝ڻ/#3;mfwT˗m߹ڬe=5NjX^�_2~<n7٘oVval35}_/5q�;g:=wF[sa$ڻ+h`}\I?`f;nv/@|?;_]^|^ٟ/7{'KkEMtЁ'zW6WIN.ώ]MUԿ!5�wq%Yl-GIW5^+#
    /^Ez۱v
    m}|͹kp[vu^ֿk2j5ar3/a~O|Uޝg
    >ݟ'
    ySvž>wgn\=6^߃fVo x_u?SQw.{uϳsSvcϯ{FN<ͅ=nf#]Jl{tohnعo];;oAVϑLJ,ZyϗMK7RWJ*=׺�~{ߺ@�rwY;`;O)0药l83U,^[[su[)Epn2
    :I뢨ou~]i=ߐ{o=ٞyN{V
    KWgagsoSoLrQQCLt TͫGr]ݛ{gTqny;
    \So<R`*sTN'J~{ߺ@?DGd%>uw;GwnvWVq>Ŧu`m.Y:.e7U&xa2^׽tܻL6દOmE{zdW#7Vgajp;
    <v	iLV<E6ug֝EG
    :mYwW^u.&ke:an뽧(WSW�JH׺=u\73߹&/mVsٛV\`;W;vlo꽧_p7{6+13C׾:�6π_-;zunot8؝3;vn|RvXmߍEnJ̪L>W+}׺�~�w[wgU-ݙYO2;hL.?!S)܏v_3"*.CnVmz:jT0<׺u{�;b%ݘ<?t1vgjU[WSQ#{PχUn/IzhǺV?;ǫ:Ӻ;.]uf0-s6w67#}u%-e?DG"ukrf:)ԻvmbܻOuldv^M6xYzͿYO6'-➟'RU҃ߺI˹qOMSn
    jQmEr;uavܽߣ`-`1IQQh^A{{^׺u{{^׺�;>8.]}
    *"/3fٛy=$+ptshq	VZM4׺u{{^׺A|ڸ/N'pR^}q\~X\"pQ3ԱV
    MY<J&[{ߺ^׽u~2~<|ߐ)7Μ7VvjcGs-vRu߹}u[%OK+YGBjeuu?2~<|_ wC�pwgmlݫhdrx׸m.=6N/VM6C/5eD>K-OFߺ@�cz.]cw7Iݝ3{6^]G#zp|.S/e*⦤58Iu맅{ߺ^׽u~{ߺ^?;߬r@`rEݝ;:jT^ܻOx}==ulsZӯCu{{^?.؝/39� cpf1ki?1w`oۘm͹gww!IRU;߬A\,*[`vPfTVtmpd6(h\uNGof1jT^`׽u~{ߺA0�G֙ΨV'~ΗTD�7ߵ?˦O֗�8_�ʻP7�Fw!�ɲNb�Ă矲װIomm��}[O,{Ov�]bVv�Vz1zKswnV9|{N鮬ۛ/c6>NO	jlb|v#a5mARu
    {/;~w՝?><O;C5v\L�"Oq]"gNv.퍷!;"ݗ7&ܕ
    tWXWōO	?p|H?5Wgu~lwVt?vt]|}żzk~?k~Vw?qiI^w'ܿ2wu`f/_wv螏ųOXo�@=+ssr|^IC0L|#{].ߓdϸ7ff/i/<v3ig6wM
    “)&rfN2uj^:-]UЏ7/e{+z3~s6iu9*I[#lf0NW f1~u(3:O�vi�ƽs}ݝ'�}m{.ҩ�eڙɔe9,n3u|Xһ�oS/߽	Y];v^cm|'w'9qX8IoF
    C{>?vfeKޒ|
    ?z�M0|n׽sKzsux-N˲zqoݛqNd3/a׺�uƞ)z�Mb>{'ۻGw2a
    8i^K9ǝ%_G{ܽ(''?knϔgj�%6'i&w aqygItuG_-�0oujkNnN{+wٓ~,;bm[p,z&
    �z#j8_y|O8Fm^_5;~LmvB
    t[1ⶽM5\TN{hAs{Wb_�0oTvvջ1jS^>|6Oab)w$YqTɕ1bS5J{tX;v{'q|�ggRv|O՟%._[K#aa7Qg�*M*(&V7KAIѿ/wd򳮺+>Hm�ܽ'N1~>ߔ:�oQ|Z71ő~YHoUAU\tf\\;v|ڟʃޙ*}M_\|B|Wn~Jo{wbU}՘])+vBn^,8z_!'M0*lqj>ؽ0۵(p;mVcp[7"KIU�鿉dϗ.p_mm=C:wg|`K�!�v,{~P]f7NÒzg�y	w^%K?ïu>?wޒWgK:�q�(UJ/r+;oW0vC�o 6iA~|n�966_b|s!Ly]-6/,oy63xVQԙyv^S;Lܴ{ޫw?vWimG%-n
    vo,P.vjܬ\uT?*|NꟋ{k7_u3�llkvn
    >~O8;`C)s=)M:�1�݅{zg>{ )~#.ϓN~}:ɜ{gTa6ԡrP2X&/)z|Uڟ.;IG?/ss0to[T=soSo{..`eBI9]XjT{uu;_n{?&==[nl<ڿ]ۑ%#CSF")^;
    OԏhjZ/l6ݛۮ `8]:{r8MvdEyߞN}׺a5}->8]�?weFkp_Yf6vmoosdvgiNևOu`^T�_~)e,	;,IOt}8_Yc~?L{Xm7~dfϤm:L?{?U77m|S�3~=�=/Mov`wfK]˵vt7Rvj�gRa/*(׺O󺿘/'vŞ}'u-ԿfCm=UuobTWws1^`񞇮w.+6W{c�ʜ_s:n~%tRe݋K{k;muܹ۫|&޳jlA��?ù;1�$:~�7Žw6S~z<lK�dns2v%5vcv>Շ
    JmuB̍9>C�+O}I�iv(؝
    {#;{~tLncd?kjʏ!5YO�=wǯ?~@}3Ʈm쿁۾O[uȬKln[fvO,dSv?B?Q"{e|�~v_Eo�VSD|XW?(7enmduP�>`Fv|m(05u^XGq]y�e:W*~N>�_#GK؟3656w6VLVZLD
    Q.;pd*"�H?'�eq�ͯ]=/kO
    _e�s]?{^>u*�*,I[?{3p!�>?2{/lہ]ør[|3uïcEZ|45s;{{.Ov'
    ֻ
    e}�xw?Mڙ^nܴt;nt/?:.eG_?pmײ?^ڻ˿z{E;Y�'JO3^k)M3l6t0p>]��Uȯf���F+G~?�f��?~߿c{ߺW}ջqvnۃ/OVK2kc!;N7EEFf裫j>ެOKAukvw�ƼEߥTl^W-kݙ
    ;{G+0.b) hj=׺3׺4ߴ_??9O67YoԸώfn
    MWnVepPP.+`|6
    �pVmjAܽŰ_ؐ|tN޽	wO|ѽ3_&ܦmr׺CLsw_�[\cwBR0
    <Nmϐ=pez}쪨o'SѿTj&m�#_ 2ݥN|qݻ6N鮶X)~ܽmK4T*5:SQosyOp|>?7gm8#Wǭ.>2wWtc+3v.L-tjOx'u@}{nI)؛_>Yvt�][{|ݷJ]>쏈Yػyarf̨^a~k?�\||tDvZemD/;jt&K;~o+z36fz�n6~FKտ�0?|gr}?G`l?Ay}�D;g?ر9\>#E[GߺTwp8o)Ww7OqN_WmU|Q?Pu)6߽OѴ[grU	'Uf/A?OȨ>v���wm-s{Yti'Dn[ocK`c}CtvGrIU=~cye_{?Mz2˗zn.^ؿ.W{o{ɦ;wv^sOuNELؿp|C?v.
    _|a=[}v'˾?_n90Ux|
    4ujuklp'q��ľGb|/۹ΎzL}Ӱ݄jv>ءݫ_G^
    ?>4.=,:o0=^ܽ->>At2�(Ĝt=UVqAqusSȏ?WH��l}Yž3ݻ蓰'Sd?*:4T{uH=a}#ʏ[_wumea[u5~wN`v}]{su>CԛsWR\>Ut?�K|�eػ�qtSmؔ/oNj%S=�'^*88!{3PӍe{�`/OL�d]~6�+?L{߽I�Y]ٙZ׹:X냍5 >t-Y]7k||\]�*n;jp{/wbYmԷEwqO${
    7atnCYlFxj+Zu�;v[vW|wNF{k'no{~bEC_&{>?Mſ^;:#\l^_+^i-a7v~Y,w_'ʢϼOrɗ^ʆk6n}Ӵ66ܒfv-lTRuo؝_:|t�e.�N}Ϣ�F_7j�ߣf0eS#y�{ӹ*zg|d-�;zw
    YPc}5+pSn~ܻrS6x%QQNׯ^r�{c�}:׿
    ;S_MaV+~Aڝkun3~ڲecM@7п	s۳w�?Ő;*vgn~b~ſWu>u,_vV_1zwd\N+pstyƌo+Л7z
    c~>sr
    n|?ǿuQ6^K~>{{lqT'ܛ7kII�GďU�8aY_>@v`lPϏyoK;%ӛfݑk{~mhc͵zWr./w7c͐^ 뮥�5=:Ooc�*>[hxvW/K|O]9L:m'=AwvUcpc<&Pc~�'[(vNgg.u?V3}oU{2hv]l[doN�V-7#oF�vvn$n1ާY՝w~Bl^N�-v3-#('h׺$kwku|]�/mzݝ-?nf~eh�
    Woeu}ב:+ x$^W_y|g~;o[]/j
    ޚ�˷)ՙ?!F.v],}'^Ŋٕ~G{`^`|IV�GU>1'ڽzC7/ϝU;-}ŵ;O7s`ir%
    NR5ݟg/;f|ߴU� >9o,wBt7Nv?j|�S�rߙs16|yǺt |PC?;knW+޽�NK/9՝Qr?o{[n=ӝ۶uV\mվqoYص6{�:��#h�O�Зm�23qϺC̝ax8|~@:kow./:ö/euWdȍ:&ptd,VJ_>ǂj:nfwW{t�/};;zݛQtgi=7DWݑ/=buBb&626,#IF{tu~{ߺ^L?�C�s=1�	G_?O�:�=��3=Mu$<}lаIomm��}[O,{Ov�]bVv�VzGc#;Wtpw
    ]:˥0Vug22㲹}9[r巆۸`QUgrx^Ce'E_w_:#xi�o:'nv�e'빻z%�@�[7%{�r1'@-p}6pw_N'=
    ڿ>;|gmm˷.}{amh鶭\UX(++0ԹOu
    v_r§;1v?pt^3]EO7LtCp
    '><؛icg#L~|7GߺUAn;:q0vOΦlq? mt`vkmllnlYM"OYGt`:պwWK>=suuY:϶2=N_]=SWߋ44U;rykuxK팏P\~k;)v.mZ՜ˎrY]m>W˖njaGQU1yu#gf6TTtG�ftN=OizWswGz?@K;�snK�c01Uf)׺7O[z;sގٽ[fc	؝1hn,~#pb?=GRRS4Mr+ ^	|ٿ)`|쿐GIz/~]
    'fvݭVهW&^ٿ;zw.)Ӹ0'|wpuoy>5ۿ!?Aw?L<#2� r||Hn6FMXqzmtglugk�}oe�e^}Oؿ
    7w�{z�wrY`m_4�İ?4)o`_6ޟj~N_'f^7gDUfX>ͅ3}bWݵ]}2\m6;iPTe+P{>z.ߐ-k0)?6n;e}C![؝g]ӟ۶Czz	NZ5@Du;J]33o=Aғu|^`;/r/pt7Tm{hb
    mNZmU&V׹ԻoZw̜sv/AXNMԣ>o1CwMYX}{twtH6oޝ˄
    n>?z^fMvv;O=6;)3bmͥdv^2}>'wۃnm :/�k?*wtNW7&][;׳~MVkn7_?c2驨^`?wV.]/�_o?Mf7P>;'~=w|M^~.*pT⪲'S|ɸ?m<ƿ"ݽ[VoNl	(?uX
    U,cQOU-5]V.
    �u�h4޶;Ǧ6_t]|l]3�nf6/{umӛ'=>@l2[/1źx4Lc^?kodwK߄7V�';y~0mwϏw;ǵ:-73wln<ή%V\J
    Ψv0O�/7./'VW|6_i�F�??06瓯߭Yy�n7ܸN�OpE?ˌ6><b3gkbf2>?$v>]{bǸ3]yA{8h+r؊u�u[@۸}�/vG!7?|:Դu_r.<uTSbi({t`?ٱ٣�f[�,铮O~?f��p_p�	~'/߅/M?.0m<EgO?M߽SUtXm{š))i齷?SQ<QI`0O,?'f>];Kb`w#iϝ#o?Sk*32ύ<.]}׺?!znw.{ç_ ߩݛs=}˽6r>Aߥy$#38^x_%?.iu>+]Y}>7u?hF*ӆ;~᧎Tf^?�5zu|	8
    yn=�+nRf;quǽz+7U?`Vvh6V~̹\~WCп!z^﯑}rۂiu^꽫Ubmc`9Jj9T){v|-{xt͗3;Ox콗:iU=GvߙnkQͶ+h1>:TZhGH1]_]?O:
    Kݽ!==׻zҒdGn^v=U⦊<EO%[{tO~ߌ=K}�f;vamؓlM'I'S`vߎM؊;Gf%K6^Pt�S~S
    ٹH϶J~N&_ۿruN�ioC9A
    gcߺHWҿ'_/(w&!Zt\|oYJz>Gn꿰X#SgS=:�|_kv|.0g~>l-M{ar5Udjmnϡݓ읹*w8+y2jMT׺O̝<_%;+wD=Y.˖n:n]ص59z;)Uj=׺7׺u{�6]۞Iʣͻiz�ievLkۛmҙݱ:iwnֻ=Kؔxjc7IޛOz�nG/[[{]b7M!OYTIiuk#P}׺:IDL2sT-Ս:x-K*u`on-U5sst5~:{_%6C}|t퓉[O)zS_jm\nbk!v.k;x
    TRL1VA+ If^郻~OtTm>N}z맺qvQu{cflv_�(ry|vLvZ2V^�2�%?wN뮤vx�Ƿ��}>˧u�~ov|tߐ{on8nyN{V
    UIwgXPsoSoL<PL\t0{^u7ܻ޻~^eOQWHn�#rll^ԛwmݯvܘij(Z:^ۻ|j|j8ݛko|
    2=]ޛƧ&^T6O@Ul.?9d6]>jZ^`�f�'�lru|O�yǹ�M׺cchaqnϒݱԹܝuVuăeO%騷_잲q8ǪcpR-}D0t/=ٵw[b]6NmٳݛWq㩳{rÇgvwY
    Um,USJ쌬}׺:wŏk�o�C]~?[ڟ4_g>?4~ou/Aw]Op.m=M{lf}/򴢋+
    %IUţ]<ʞ :ڽ='vw6zj;pfrv)[}O+T+rRSle\Sװ7~>ݟ"˿ߏpSm=nꜧMlY>ڥ[wd'nn
    野:*j^LU�u/ڽKۃa>9.t;WWjcu]U5V5eNbL2׺@R_]L˿+:e){j1[sk+ݏMڛ
    Ըz,WjbDtgtݙڻp߹|q{iZ=ս28uMuU{r콓K7LGE&c1%LuI{G>5|A+~,?ro{jMu~엣}>
    
    ܒ56{U;SӮMXcczV�]%ֿ?[:xfm=ỿwGim_2_}W㧎m^?q]`|[iwT:ke-&ݝC';spUTL<qVWCRePu߅sȽ;Obgz[uQϹij{e#jX{�g|.?swO_vmݛWݗGr^ڭwr՚v�U9[LS`@ּ{gս[-�/ٽNw']W̾;]ջFq˸;{k8ztx꩒c<vm]w.[o콓gvo38vܻۘp*h-QU[[U4TԴ<u	>n/j/˿잫K;?x߽RW6cܻpU	%5\2ޡ%Fou?7~G{aO}߽S;uv~o[ڇs]NvK1X*rج}M]*KO'I}7Br�.[=EzC}dwfpm?rx֮KC^@�,~,uGVl/פ+']lY6+wm-Xꌦ7jtTîg{XXwn_o?6_;crK:w3{ոn7fV:�/ٹzMKHڨf">/�V?�6��[s)�?%�_�q~wo7{ߺEW?67�b;NMYm�ۙDzT?O'�qti3xgu~uxjJߺJ;un]ϸoAscu팏a:ӲqpwTz{w;7
    NܞZm-^*!џ׽u~{ߺ^3߻?֖%7]m^'ܕ{rqﺱTtZ:ftj_hh)ᥧ97{[ݲ["TK!M>#ÏAM[{gd_	NIasF
    >rb2nZ)VōM<E2k`$*:WnDM
    3AҔ#F^x%a'#vF�z+f_�OW	�&+jv5ܿI�w]7sĵϏjG:ѰIoml��}[O,{Ov�]bVv歇[cK>O;>]ؿ7cmѷ:v?`n}S۟(Ve9]?n_):N+hm	)w=�Y|_OM/ˎ؛ptTOr
    :oasyJ\.^�ܟ�v_Ae.=>5�)nN]E~;쿒=x$Ǫ_N#w|́MԔjY^`ݧ>d�=up:o?z:~t؃3>?�C
    QKڛ'w5[c/᫏u{twN}Sؽ~{Un
    ٹe_47M.GzASS|t=Gq8vb%;)ގ^:u͇ۏ:�?[X>4|ػf۟vu#p�e+	
    徼Q{$ٟu�?�ڸ}?{o|X\=ܽo׻cuuF;z}޴ommoTmSW25c^@]םw.gߞ0fe:jeh7n?GpnMɁ۔I&3oV
    Y7eV?rt�vg®ힳ{[Zn� {n0�6ݽ[큸'ľߏ'>uT{"7Rj[\E^Ơe׺]qs?gnWiǹbSuv/7gnTn
    ٗ]r+5o嫨}S?Ez[}?]Wܿ(;[mw.gj
    {}v7VbI:6B{6%OQQ֟l/O`?ώ_7eؽ['ܽaUWvtMwTavOVۘHucn{";t_߽9~bU:o��>蝽‹ztͫ9zy|5[veݘ|OIM^w^??Kfl+zlEbG_j>S}ǵM�ҥlQY->#LttχG/M>w>썅kNIS=;l/be:i&uU3?I*`{;Q|t۝?;۪zgA:WztNm_{av?6/H˦48ضMiےzP*:<U�6ڽE6.qm>*/M㸱߃[;1{f/_aԻv{N5tvT=r׺�#?8zv[�	˵~?;ϯ8}վvb|}^}v;w^in<V
    oіtPtP:7i8`>??{.;Oެ믄'�?փnTUv<M.y#ھ{#۴wπ_�/W]tVY{OXr�D?㻇s¹ϵmп?n麻#);[�Q<]T?kj^6G{
    wrwfdڟ6Ej~Wsu6:>_�F��jz{Ӿ?�6/cUpz*zUb׺ >]#GzϚ�ߋۊ?3qvJ򚷬:�;7>vej6n!IG_U׺Oswlw7D.kv/6?iz;˷~Z8[ܘM{yLU7h,d}yܘѿ쿆]p{znߛ�
    >xo^_ Tԝ+&3['�eTäN=Xȝnu6OOFg~�t~9tG�11ӧV|71o﯋;]?;]o�v?u��foޟ?1�?�[`z�^E^>X_ߤ7}|_\{o8wYU>R!3	>|Sm7]u|8]M\m
    i}׺O~Zn�3||�.zom? :}|?v7�p=s)yߏ)mf࣮BvO+tH:~c|_];}S�Vvw?N.|Uӟ!%n\]S>'
    ;"wpwdWnv#՟mφ]j�/Zt�׾={Wxc K]Xzv_nn>_m0Ut۪y=N/R6]?o%;pg=ﭾ0ueorA{r}`Vd)6J0u�򟨾iп)�Vعؾ�}]])\d>mnOam9w^:	2rS=Fg{�ɏ?8~'v=?M}oߏtٗ?%n]גn5ޜn7'g׻2er*
    п۽M;I۟7'�]{~0
    69m#=W7b)騲N)憂^|eV:z?Nv^/v3Կ/>HG!mnݿʝSaSNv6}ÕܘSoe2,CaĶO-snuW_?>\eϔ[&e{+l
    Yٻ
    ZٽgVE>sIQa�{ev/�ս##o`ظ�6_FM_~/S汻κVG32J97̵I��f�__��O?E�K�%�ɏ�L~׺_tO.M?pm?>Iwn_0>HtWf|jpl7[v>vMbPx0XG@�E�*Ou:?OG=[{vgD0׽>3wgԽN\n>SŕL{c='�+~?k뭝;K|Uwgf
    Id)qؚL7;Do.C)^�_��G_?o(z٫Y?R�A��d?߹^ߺ%y}w^ڏ]սbb<Yo]:%UWml_VM-*}p]GAuDX㾷g_v='J|jɎr6/N꽓SeUcLSPCџ�}|6�.zR}.}~Jv.*/]÷ӯQTf19QZdKA^|?ACv;uaJ| |2\$+o^%K7WANPZh�goo|(Se{';V{3|gߝ؝1W8gG)?`V2Ğo[[},=_{Rqh73Rd^_:;0mv.nϓ9v}_f|Y2ru&A۸Ǚ6'�OW=a¾@|iMN^ʿ~/6֠~B�z?w+WU͆y"꒖/u߆�+Vne�*0l^uln̖G۰;/vG~>5όOl~J=55[C{^~Wmo]W	�y]oudgv\k|IqYx7jvfg?e੥^X_4>K|h�q�و�ܝ	�{/��߇/U��Ȯ'~ t23'o|ܟ!{6O]׿ϯ;F-Ώk뱘׫�|h쯉2{~tϾi�I[k6|Y|5=+w&7-Dch�L⥨>{|펭wnظ
    �Y�>d�]ݼVWnZ
    'Mtk*㪤ؓ͝"зUAc�(o剐{N/]}{ٟӾ;mv؝S~Ob7oHm큸vM]uu'_|{d 8O/iźW[s#q
    pGEUv&+S@t0|_Xë7_YN|}�;OB�ߟ_;>Rugl�۝c۽:⧤0?Qrlu��ca۸{l|9/o'\|p�vKGo*i
    ݛwbKڝQkTX!n͕ܹ{x|�eM�#�!�f?+��Ã��G�z=tW5G]sNSv7|{]=]Oɏ{pu̝GS޷aw6Tf%W߭^o7yNCo^P|"Wd0]^ܹτGOؕ? r*~᥇ɌJ^�)�٧��d��OR��c�uSظm.7.Ge\S.n]{/S.[fh)犂i^\O�%qK]�:��ǹv7~l~(n_mmzsxuȮ6TmS2H-F^m/qwon�͛|ͥ{;pV<wuv߈sUv6j:\CO6&^||{:[�z[y|%7OضTK>@dFסoYVnU!D׷?	C_(6^`\|?�f6x㿇�0ό]>]wm�vwO�f';[dcouo'3C'ۧQA!_*>}c~>w3:;tn:%ސp4ߑ?^[=Oώ[N%7¾=s>ؙόnީek)5SP>[T{Wr\6{ڗojvvݛ#wuAoa.={)X`U4AX{uT)o.gk|@龲ؿ]ۘ?;K
    ;U{6�c�rSeVsWQ&,^@?7{|��
    q�W+n�_m/�dx�oyy#?s?Ed'~0l˃1OoAII~`>;r�[a�,͊ؼTcpb^cc_i5E4Y~L'ǝo][O'/;Wd.6̽MX|RmrlXb5rnj}]Ё!|]+~<l^폘ߋavXʮ)ۧ;~<mJ-ݑ\>J,ZC<Y_u�'?~ӧ4@�D���J?(/)��}?|>_u�uq"?̓o]N/:S/k|]G_�	hp_>.7ߢtv'T1@SɖOu�E/nt�[on�}ꞔ]W~:oOCY]#.|eSWce6m+-\Y(~�~{ߺ^׽u~WON
    u_cõ;Iҭ}>|8z&b
    uB=U4
    M4$h2qmqɽ5!TP˪+Bt	KkZU:EhP єȂ: 峕{iv;�;s+Q,KRv>||T۸}4*ɨVH)`mXg'I�EBh�T'玁{o~O�-J
    w+Gun߿?au�xW쟿^Z=^a�&(Ew<_߲EӎJzhh]xiݫ֝1-W{g6ivV[9F@ӑ;c-9O>/?ŭiϴz~;OϬ\j)?w>ly7]wᶵkcwǼWF#jDu;Fb(\|5k'Gxr�+|vی6r*\
    n;efHDRBr㹋}M2$m/"F0
    H 3ҿg_qb@`wwjX;h9~3nc$$12{mgammFѺ!a|#{[\FX2*8t>_;[�gj�Yָq#�@z�c}?FQ�ޛX*:G�ZL�헼_g�zopbn�?,n>S?+u���+O7_�z??g^�B;�?�ޏ׿Ў��:{O�~u~#u#���߿x�x1�{���+7_�z??g^�B;�?�ޏ׿Ў��:{O�~u~#u#���߿x�x1�{���+7_�z??g^�B;�?�ޏ׿Ў��:{O�~u~#u#���߿x�x1�{���+7_�z??g^�B;�?�ޏ׿Ў��:{O�~u~#u#���߿x�x1�{���+7_�z??g^�B;�?�ޏ׿Ў��:{O�~u~#u#���߿x�x1�{���+7_�z??g^�B;�?�ޏ׿Ў��:{O�~u~#u#���߿x�x1�{���+7_�z??g^�B;�?�ޏ׿Ў��:{O�~u~#u#���߿x�x1�{���+7_�z??g^�B;�?�ޏ׿Ў��:{O�~u~#u#���߿x�x1�{���+7_�z??g^�B;�?�ޏ׿Ў��:{O�~u~#u#���߿x�x1�{���+7_�z??g^�B;�?�ޏ׿Ў��:{O�~u~#u#���߿x�x1�{���+7_�z??g^�B;�?�ޏ׿Ў��:{O�~u~#u#���߿x�x1�{���+7_�z??g^�B;�?�ޏ׿Ў��:{O�~u~#u#���߿x�x1�{���+7_�z??g^�B;�?�ޏ׿Ў��:{O�~u~#u#���߿x�x1�{���+7_�z??g^�B;�?�ޏ׿Ў��:{O�~u~#u#���߿x�x1�{���+7_�z??g^�B;�?�ޏ׿Ў��:{O�~u~#u#���߿x�x1�{���+7_�z??g^�B;�?�ޏ׿Ў��:{O�~u~#u#���߿x�x1�{���+7_�z??g^�B;�?�ޏ׿Ў��:{O�~u~#u#���߿x�x1�{���+7_�z??g^�B;�?�ޏ׿Ў��:{O�~u~#u#���߿x�x1�{���+7_�z??g^�B;�?�ޏ׿Ў��:{O�~u~#u#���߿x�x1�{���+7_�z??g^�B;�?�ޏ׿Ў��:{O�~u~#u#���߿x�x1�{���+7_�z??g^�B;�?�ޏ׿Ў��:{O�~u~#t6F6Gk휧uU4t9!euBjf57x[fyo**̪fp*zC>ն_w|F'#	R|ִ!�UpA#w~R
    �[7:T�?�5%Zn/?ϻ=Կo^k?#y.<Wok~B[ƭ՚&kƽ@;i�G<Ǥh8_ToZ=�;�SDWy>�z]~c67EǽKO]W썙
    U}v^M� *sTTj24~}=ysan7=sx
    $S	ZV�wih9	ϵM6q5@̠qҠSpDڻjmvVY /dlLRQd7o.jb5y1t^9{aeRެd!+n'uo/hdWJ@+Ficnz.:+"=lAg`y<av[}͊קX-kS*:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:P0FٞQ<pV!߼yQ�մ�?=5gst:<ߥ4~7KKX)Ib/)R
    rPT0
    q"t:ԻtT	+�K�['Sg?�t~O�wM?ּ
    }ZiJjT"Esњ\3<֝o)/}mY+).[22"R5BìP%M]qA7k9xލnacgqw	k|ą$Ѫ>4ğc9gKXhp˨) 6Б^#쿑	;O#I%J|EV
     X}77jF0/A5
    CGQ"	�xxVD_cyٷ}�$?۳JQ�/yyM
    $�'8j
    ˵">꧕p[HUrTKOBfU.@,'OeؾqҮHۍh&q�-N|jA�G�sI}G�ew/g>u�&�l{q�e�o6/O?Ӿ�=~�x?ο$ܿ헫q��e�_a|??>��m4�0i�JMzs]k�[z>~&~>Qm'�^mg4Gu�&�l[r=l�o~>&Q|m�
    xu��lkr�d�o׿�yE�GT[5_{u˭o^�gg}Q�o�__׿+ۿoO.�{_}G�e�_7�e�G7^�\n�?~>&Q|m�
    xu��l{r�d�o׿�yE�GT[5_{u˭o^�gg}Q�o�__׿+ۿoO.�{_}G�e�_7�e�G7^�\n�?~>&Q|m�
    xu��l{r�d�o׿�yE�GT[5_{u˭o^�gg}Q�o�__׿+ۿoO.�{_}G�e�_7�e�G7^�\n�?~>&Q|m�
    xu��l{r�d�o׿�yE�GT[5_{u˭o^�gg}Q�o�__׿+ۿoO.�{_}G�e�_7�e�G7^�\n�?~>&Q|m�
    xu��l{r�d�o׿�yE�GT[5_{u˭o^�gg}Q�o�__׿+ۿoO.�{_}G�e�_7�e�G7^�\n�?~>&Q|m�
    xu��l{r�d�o׿�yE�GT[5_{u˭o^�gg}Q�o�__׿+ۿoO.�{_}G�e�_7�e�G7^�\n�?~>&Q|m�
    xu��l{r�d�o׿�yE�GT[5_{u˭o^�gg}Q�o�__׿+ۿoO.�{_}G�e�_7�e�G7^�\n�?~>&Q|m�
    xu��l{r�d�o׿�yE�GT[5_{u˭o^�gg}Q�o�__׿+ۿoO.�{_}G�e�_7�e�G7^�\n�?~>&Q|m�
    xu��l{r�d�o׿�yE�GT[5_{u˭o^�gg}Q�o�__׿+ۿoO.�{_}G�e�_7�e�G7^�\n�?~>&Q|m�
    xu��l{r�d�o׿�yE�GT[5_{u˭o^�gg}Q�o�__׿+ۿoO.�{_}G�e�_7�e�G7^�\n�?~>&Q|m�
    xu��l{r�d�o׿�yE�GT[5_{u˭o^�gg}Q�o�__׿+ۿoO.�{_}G�e�_7�e�G7^�\n�?~>&Q|m�
    xu��l{r�d�o׿�yE�GT[5_{u˭o^�gg}Q�o�__׿+ۿoO.�{_}G�e�_7�e�G7^�\n�?~>&Q|m�
    xu��l{r�d�o׿�yE�GT[5_{u˭o^�gg}Q�o�__׿+ۿoO.�{_}G�e�_7�e�G7^�\n�?~>&Q|m�
    xu��l{r�d�o׿�yE�GT[5_{u˭o^�gg}Q�o�__׿+ۿoO.�{_}G�e�_7�e�G7^�\n�?~>&Q|m�
    xu��l{r�d�o׿�yE�GT[5_{u˭o^�gg}Q�o�__׿+ۿoO.�{_}G�e�_7�e�G7^�\n�?~>&Q|m�
    xu��l{r�d�o׿�yE�GT[5_{u˭o^�gg}Q�o�__׿+ۿoO.�{_}G�e�_7�e�G7^�\n�?~>&Q|m�
    xu��l{r�d�o׿�yE�GT[5_{u˭o^�gg}Q�o�__׿+ۿoO.�{_}G�e�_7�e�G7^�\n�?~>&Q|m�
    xu��l{r�d�o׿�yE�GT[5_{u˭o^�gg}Q�o�__׿+ۿoO.�{_}G�e�_7�e�G7^�\n�?~>&Q|m�
    xu��l{r�d�o׿�yE�GT[5_{u˭o^�gg}Q�o�__׿+ۿoO.�{_}G�e�_7�e�G7^�\n�?~>&Q|m�
    xu��l{r�d�o׿�yE�GT[5_{u˭o^�gg}Q�o�__׿+ۿoO.�{_}G�e�_7�e�G7^�\n�?~>&Q|m�
    xu��l{r�d�o׿�yE�GT[5_{u˭o^�gg}Q�o�__׿+ۿoO.�EV_8͡ԯ;NQ]Jlt>�xɥW_�;iЀcܫڊ#zu#ۥZ+S�ߝCe-ͧ,}oIR&'#Z>id*B"msiFqg:!8l;~TUBI$+\{r&2ye?:W5ֶGgKo;Xd'V߯`?g>n1$x^_}qxr'cs Kv?^+̒\;!M�P<=~d;͘ms9q\k�;>,u?ݼMـ�
    [Ɩo~tMZ<|||}>T+\|_1?/d{g��=#5^�)��G~G~W??��=5j^S��Y�wj^?u�{;VWʿ�#߿_�׿C�
    _׿ʿ�#޿_�׿C�
    __?߯�wQߡ�U?߯�wQߡ�U?߯�wQߡ�U?߯�wQߡ�U�?޿_�׿G�
    O?߯�oQߣ�U?�
    v׿G�
    O_?�߯�wQ�U?�߯�wQߣ�U?�wQ_�U?߯�wQߡ�U?�߯�wQ�U��÷�W��v׿G�
    __߯�wQ_�V_߯�wQߡ�V�??S�+oQߣ�U?_�oQߣ�U?��÷�Uz�=��=k?�t~^?��ǁ�UO�od{��Tz�UzO�od{��Tz�UzO�odGW��O�Tz��Uz~?���Tz?�r�)��z;U5?^�)�G~GW?_�oQ�V_߯�oQߡ�VW�d{��Tz�U�=��=k?�qog?1�oQ�S�}c��G�
    _׿�'�?�={�{�}c�׿G�
    _׿�'߿?�={�wS��Y|;�Z5^�)��~;�^5]��~;?W��O�Tz��UzO�odG~W�ʿ�#߿_�ֿC�
    _׿ʿ�#߿_�׿C�
    _׿ʿ#Ǐ�wQߡ�V_�wQߡ�V_G�û�WO�od{��Tz�Uz�=��={?�r�)��u;Z5?^�)��~;^5?]�GOۿ[5]�GG~[�G�׿C�
    __?�wQߡ�U?߯�wQߡ�U?߯�wQߡ�U?߯�wQߡ�Ua��Tz�UzW�od{��Tz�UW�od{��={?�uS��Y�wj�^S��Y�wj�^S��Y�wj�^S��Y�wj�^�)��{?G~W��G�G~W�Gj�^��G~G~W��G~G~W?�;V5^�)��~��û�W�x��W�û�WO�od{�;wQߡ�U_��wQߡ�V_߯�wQߡ�V_�oQߡ�V_߯�oQߡ�V_c�û�Wu�û�Wu�û�Wu�û�Wu�û�Wt6�J4�UVEwWV~7ݦ
    *c5qW:>rnJ'?sOz�������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/manual/images/chapters/appenders/fileAppenderUML.png�0000644�0001750�0001750�00000015034�11377016712�033273� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR����4���EG��IDATxˎ<Fd׼\E|ЛhS-ğ<)Bbl/���� 1��H��kT__|?k 1$KLE^{"Ab 1Nb4y-@b2n@bBb�$Fb"$	$N3}r<FH$Is!1Hlpn}ՈۖL�#>e{;s]eTFb 1ldw@b0'VdUzDgNL[E7
    YBFVW#@bBb�$Fb"$	$HDH 1!1HLH 1Ty'1Hlp<_#1@!XV-pR1S@brfb�ev@b b#\@b_x#1C!!1`$vHrBb�	$FbBb�Ą�#1HĄ�	$Fb"$Z1M`$&cH$HD̉$Fb"$	$HDH H,qE[?Z|zzà5˟@b(.-Qޯ(%H$lIa=Gacޱnu[Yz2Z-Rx\'CV--
    3lkoHvQd'eMb 1TtR9xt?$:Is$FbFb,=KKRDci!1sb 1TvbXH{t+SޚvbO^ʜXcFb)sb!oN S_'V뵾xkZ};@b 6@b$&bN$HDH 1!1HLH 1@b$&Bb�@bBb�_V�ľ<d~Wc/6<y	1Am$T_"AILY1׽:_V.�H$Ā$2�$/U 2�$a#1�$/'2�$@b@M� 1 RQ~��@b����$� 1>� 1�@b�H$�@b�jʝAb� s	'~J#@bZퟷ=vm@rqm``ٷQH;bGbK[74Xu3*3$Vܶr͉H 1�$�CP'w 1dKbYd@b $6Mӟ?@b $vH 1 1$H$Fb�H$Fb�V;BHF$.*Y10$%61kIli[@bPb[2};#ŭQھI 1$5KĎrͫ@b8H,>CGN15Hb�B>1ǵ'E-_ʹ@b:H 1 1X�	$#1�$#1@bBb�H�C4@b0s$Fb�H�̉$H$Fb�H$Fb�Ą�	$#1�$#1@bBb�H�H 1@b 1!1@b$@b$HLH 1 1 +Ju�ؘ#1H$Fb�H$fN 1@b 1@b 1H$&$HLH 1 1$H$Fb�H$Fb�Ą�	$#1�$#1@bBb�H�PKc`h$G:c.o 1%A'u.z?y 1�P[D0D0m$0D@b�H)0"H 1�$X* 1k)�$@b� 1�H�$�@b� 1�H�$@b�H 1�$�H��@b�H 1�אؑpju$ֽDDcHLD4MIDd8n7#1HD@b"Bb 1pDߟn_o@b$v2nH*u[zɡ}~kIli[=q6!1
    *5#
    H[djGH$FbJJGH$Fb,E6k91ǵ'P'I$Fb,R2#1HD@b"Bb 1HLDHl<'4Ș#1#1HLDH$Fb"Bb 1HD@b$&"$HD@b""$Fb$&"$#1!1D@b$&"$#1!1D@b$&"$#1!1\b�4M$FbFb"2HHD@b$&"@b$&"$HD@b'vXOvhGϫ~ׁ@b;sUgu-ϯzOIb N%4YNdktz`Bk혷qKyNxmdcի۶kI$֙>hB:N9b۱d
    FbkDbRb5#I}cJ$Fb .:a$Vcud$6H$ۉ[m͓|Xj&t$6לe;'91]zQHr!~zFb 1HLDH$Fb"Bb 1o�K۵a1gک[=_oY~HgSb%j3ˊH*;�rdE:+E<{{1uܱew-[hx^הrOb$fNJeW{#rdDmI#1ν_Sߍ u0{_{
    }S:rxZ?o'1Xǫؗ\&Rb:-pr>V'1s&ړ-U#1HD@b"Bb 1HLDHD@b$&"$ے�|2M~+,"~Vsc'%vdXNxnPj0w;<rP@bmK5Ćd@u
     ayӱ@]Hl苶u.P�ӱ@]S@bht@b:kHG;T5ĺt5t,@bб@]HLk�X)t,P�@b:@]Au
     1X$c5t,P5t,P�@b:@]Au
     1X$c5t,@bб@]HLk 1XJl@C[v�iۋXE^1WqڶF,]Ui<!1md~HLD&1QILDHLDHLDmDm#1\zm}$Fb%{٭mkG$vY}W},;#^v$$PFhk#w{\5O99~#rk$6st;Jo81W;ЎHS6Hy!1k1ӎH2{Zž*2"1|;13%a|{g1vDb;YH&1OE'1HHL#!1!1QILD&1!1!1!1mĀVL\b�iމJWzӶ5b!1_DzܜDٶ5b!1_DHLDHLTtѶILTt!1!1mDE'1mĄ!1!1QILD&1QILDHLDHLDmDm#1!1!1ѶHhE0qڶwջ$&"mXHL!1?7'1smXHL!1DmDH,	oRBe1{:Rou{{V-,|e%v`Z6OiʭVYr~=K,gh$vvFb}d֨/?aR2wYľ?d=R_5[{cX{:Zc:},^$ދY+f;@95,%רkGEc(=2l]3#OvOةDYXޑXLo	x{XHhKْ�Ep:;xO+n͉R.u-mXGq{!U812Ή-=oH|ș~v\9abK9#Orr͉m30r9r|g+*׉Ҏ
    eKb]HqYK 0k{;eK`$&*;DmDHLDDHLD&1QIL>1ЊiNkBvKw5EyX=}?y̝@-^{u؇'>#"Cu2/�
    ا.MQ/sn{ݻL+XĀ+Sc0/2XoPH8*~hJI,v.HĀVO\GH�T#sb'E#;p)Hb$\b"V!1D�!1HLH 1H,o\Tqm]z[xפ_� 1फ]d>$6kSّpUC][x!C:̘/bnY~cG('.\ĀbY"ǒsd8*.$']h|9JbkT V	}ɑm=qGb_Pe_R]>fǦvcNIX̧�׉.ks\$NS|-H 1Kb�$&Bb�$&Bb$X~!SG˯crߛ bY`;٣Ps8*e?dЕCWH9ν-FW 1beR蚉)##k:$FbUoL"R=N#1;ÑV?:z-J%V$Fbo'|D7*sMGGb1\;)=sb$NdHH 1@b"$@b"$Fb�p	4M$Twhc|^{ĀD8
    sr 1�0%D05z$0ED@b 1�h�H�
    ,еH��@b�@b 1�$S�H$�$� 1�H�H$�@b 1� 1߱<O$!%&"KbYd$$6Mӟ?$$vH$&"$@b"Bb 1!1D�x'1{۹#uzIb�5lC3<oZ
    �@bK#no*̭o?9ĤljʵZÑcɁX/=]ZsޏHL2ػjO!@b̉3ל9?WŞHLɄ�NFb$@b"Bb 1!1$&"$. 1�f&9#1@b"bN 1!1@b"Bb�$&"$HLDH 1!1@b"Bb�$&"$HLDH 1!1@b"Bb�$&"$HLDH 1!1@b"Bb�$&"$I`$&"cH$&"$HLDH$&"$@b"Bb@1z/mSH-ex];WyIXN{i?!-a=e=k4q)wk>:Эlm$֎3qwV1#s)q\Ǹв%1Ė	i!ljkql	eqtZbsiGI<Cn펻DǹչŎ\-%r\$FbМ^cg]],HhĭJ;/r\,z;:I91ub÷ZooeQ1#F�:k=uڭE6Wk_boH$&"$@b"Bb 1!1*_;wcqz>*
    ewRjuu繴G:Eb}t[q|hO;Bʖ`Ƙ0{nrfc5IVXt盺(++G`#?H,h$Fb蹕9c#Qrz~'$@b}1m|7{]|@bVUǛCdʱz^=@b"2lH$&"$@b"Bb 1Ħi"1@b"RUbۍ@b"Bb�$&"$HLDH 1!1DH@b"Bb@6V~+nx	1$%ve;��EN����IENDB`����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/manual/images/chapters/appenders/appender.uml��������0000644�0001750�0001750�00000203362�11377016712�032131� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?>
    <XPD:PROJECT xmlns:XPD="http://www.staruml.com" version="1">
    <XPD:HEADER>
    <XPD:SUBUNITS>
    </XPD:SUBUNITS>
    <XPD:PROFILES>
    <XPD:PROFILE>UMLStandard</XPD:PROFILE>
    </XPD:PROFILES>
    </XPD:HEADER>
    <XPD:BODY>
    <XPD:OBJ name="DocumentElement" type="UMLProject" guid="JEGKOL0wwE6O2Emy29kFuwAA">
    <XPD:ATTR name="Title" type="string">Untitled</XPD:ATTR>
    <XPD:ATTR name="#OwnedElements" type="integer">6</XPD:ATTR>
    <XPD:OBJ name="OwnedElements[0]" type="UMLModel" guid="Nu7ucmhxa0aC5WTL/Hl5qgAA">
    <XPD:ATTR name="Name" type="string">Use Case Model</XPD:ATTR>
    <XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
    <XPD:ATTR name="StereotypeName" type="string">useCaseModel</XPD:ATTR>
    <XPD:REF name="Namespace">JEGKOL0wwE6O2Emy29kFuwAA</XPD:REF>
    <XPD:ATTR name="#OwnedDiagrams" type="integer">1</XPD:ATTR>
    <XPD:OBJ name="OwnedDiagrams[0]" type="UMLUseCaseDiagram" guid="AOpe9EpUuEqbJkhPg6UN+wAA">
    <XPD:ATTR name="Name" type="string">Main</XPD:ATTR>
    <XPD:REF name="DiagramOwner">Nu7ucmhxa0aC5WTL/Hl5qgAA</XPD:REF>
    <XPD:OBJ name="DiagramView" type="UMLUseCaseDiagramView" guid="jha7HHI2JEmss41Kcx5rmAAA">
    <XPD:REF name="Diagram">AOpe9EpUuEqbJkhPg6UN+wAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[1]" type="UMLModel" guid="nzHC5ZSub0yOmXzqddVh7QAA">
    <XPD:ATTR name="Name" type="string">Analysis Model</XPD:ATTR>
    <XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
    <XPD:ATTR name="StereotypeName" type="string">analysisModel</XPD:ATTR>
    <XPD:REF name="Namespace">JEGKOL0wwE6O2Emy29kFuwAA</XPD:REF>
    <XPD:ATTR name="#OwnedDiagrams" type="integer">1</XPD:ATTR>
    <XPD:OBJ name="OwnedDiagrams[0]" type="UMLClassDiagram" guid="ucvrQjCCHEOMfGCAAc5zPQAA">
    <XPD:ATTR name="Name" type="string">Main</XPD:ATTR>
    <XPD:ATTR name="DefaultDiagram" type="boolean">True</XPD:ATTR>
    <XPD:ATTR name="DiagramType" type="string">RobustnessDiagram</XPD:ATTR>
    <XPD:REF name="DiagramOwner">nzHC5ZSub0yOmXzqddVh7QAA</XPD:REF>
    <XPD:OBJ name="DiagramView" type="UMLClassDiagramView" guid="sxIjWZ8eT0KTmxDhcr84UAAA">
    <XPD:REF name="Diagram">ucvrQjCCHEOMfGCAAc5zPQAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[2]" type="UMLModel" guid="dQlYoesWY0yxg2VJCxHxOQAA">
    <XPD:ATTR name="Name" type="string">Design Model</XPD:ATTR>
    <XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
    <XPD:ATTR name="StereotypeName" type="string">designModel</XPD:ATTR>
    <XPD:REF name="Namespace">JEGKOL0wwE6O2Emy29kFuwAA</XPD:REF>
    <XPD:ATTR name="#OwnedDiagrams" type="integer">1</XPD:ATTR>
    <XPD:OBJ name="OwnedDiagrams[0]" type="UMLClassDiagram" guid="jdoFPKplx0W53YpEZi95TAAA">
    <XPD:ATTR name="Name" type="string">Main</XPD:ATTR>
    <XPD:ATTR name="DefaultDiagram" type="boolean">True</XPD:ATTR>
    <XPD:REF name="DiagramOwner">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:OBJ name="DiagramView" type="UMLClassDiagramView" guid="oWGUMKWgOEus+/3Jqk/tpAAA">
    <XPD:REF name="Diagram">jdoFPKplx0W53YpEZi95TAAA</XPD:REF>
    <XPD:ATTR name="#OwnedViews" type="integer">15</XPD:ATTR>
    <XPD:OBJ name="OwnedViews[0]" type="UMLClassView" guid="tSxGyrwfEkSgp1EcheSXaAAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Left" type="integer">496</XPD:ATTR>
    <XPD:ATTR name="Top" type="integer">140</XPD:ATTR>
    <XPD:ATTR name="Width" type="integer">161</XPD:ATTR>
    <XPD:ATTR name="Height" type="integer">69</XPD:ATTR>
    <XPD:ATTR name="ShowProperty" type="boolean">True</XPD:ATTR>
    <XPD:REF name="Model">Ec4V6xlK5USBInAfRT+kBgAA</XPD:REF>
    <XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="4OJodmUjvU6Oqy3fe+ZfuQAA">
    <XPD:OBJ name="NameLabel" type="LabelView" guid="nTnCIikI3UOMxs9QtoE1sgAA">
    <XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
    <XPD:ATTR name="Text" type="string">Appender</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="LabelView" guid="iOfigC5hM06553UhkG3o4gAA">
    <XPD:ATTR name="Text" type="string">&lt;&lt;interface&gt;&gt;</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="LabelView" guid="gAAMY35/8kO92uV18LmCWAAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="m+f/Nz96gEqfQeHGgfAxjwAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:REF name="Model">Ec4V6xlK5USBInAfRT+kBgAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="ViAxcLeYxEC/QDB9dCuwagAA">
    <XPD:REF name="Model">Ec4V6xlK5USBInAfRT+kBgAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="gvxeAhX+WkGcvqw6KjlA7wAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:REF name="Model">Ec4V6xlK5USBInAfRT+kBgAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[1]" type="UMLClassView" guid="NaiNuZ1qLUu+5nZq2pgoJgAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Left" type="integer">448</XPD:ATTR>
    <XPD:ATTR name="Top" type="integer">384</XPD:ATTR>
    <XPD:ATTR name="Width" type="integer">257</XPD:ATTR>
    <XPD:ATTR name="Height" type="integer">69</XPD:ATTR>
    <XPD:REF name="Model">rzT262Z1jEeiLPfjq8YXAQAA</XPD:REF>
    <XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="3Qx0O28WLEC1wlpntM/QWQAA">
    <XPD:OBJ name="NameLabel" type="LabelView" guid="gLLmeDlS+Ua9NL1IKkZqBgAA">
    <XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
    <XPD:ATTR name="Text" type="string">OutputStreamAppender</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="LabelView" guid="7awZOkK3cUS1dBI9YKP2TwAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="LabelView" guid="LtVVLfcmbkq7TWeA6T7S4AAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="H/1viIm6yE20XaYIV5XQmgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:REF name="Model">rzT262Z1jEeiLPfjq8YXAQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="/LiIyuskqE6jkbei5roLSgAA">
    <XPD:REF name="Model">rzT262Z1jEeiLPfjq8YXAQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="LFUOQyCzKkODyDltdenqSQAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:REF name="Model">rzT262Z1jEeiLPfjq8YXAQAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[2]" type="UMLClassView" guid="82N1NUXIMU2s0JVvIgA33wAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Left" type="integer">460</XPD:ATTR>
    <XPD:ATTR name="Top" type="integer">248</XPD:ATTR>
    <XPD:ATTR name="Width" type="integer">233</XPD:ATTR>
    <XPD:ATTR name="Height" type="integer">95</XPD:ATTR>
    <XPD:REF name="Model">xVL+I0ePyEKePe2ybmIZqQAA</XPD:REF>
    <XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="MEOstStI0EC0RQoiT5DFLQAA">
    <XPD:OBJ name="NameLabel" type="LabelView" guid="CDkuaYXZDEC5+cMzdHsl8wAA">
    <XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
    <XPD:ATTR name="Text" type="string">UnsynchronizedAppenderBase</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="LabelView" guid="N/VzkXk9vkGTb/Gq05Hm4gAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="LabelView" guid="Wbq2KwFqq0uOx2yShkE49QAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="MbkisNcJq06fy8rfNf//qgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:REF name="Model">xVL+I0ePyEKePe2ybmIZqQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="bHWlSSp0L0KsF9iS2K/VuAAA">
    <XPD:REF name="Model">xVL+I0ePyEKePe2ybmIZqQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="A3o0HBZQP0+GUAIDarVM5AAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:REF name="Model">xVL+I0ePyEKePe2ybmIZqQAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[3]" type="UMLClassView" guid="uk+yKXVJ4kGbJp9tS5jKTwAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Left" type="integer">348</XPD:ATTR>
    <XPD:ATTR name="Top" type="integer">500</XPD:ATTR>
    <XPD:ATTR name="Width" type="integer">205</XPD:ATTR>
    <XPD:ATTR name="Height" type="integer">56</XPD:ATTR>
    <XPD:REF name="Model">yqvs3sZ9DUGqcZqP0JhEYQAA</XPD:REF>
    <XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="pd1JNpNdxkm4N3mMjABxcgAA">
    <XPD:OBJ name="NameLabel" type="LabelView" guid="Jfgvt5uhf0aDXP4fvB8FuAAA">
    <XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
    <XPD:ATTR name="Text" type="string">ConsoleAppender</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="LabelView" guid="x915MlraB0+hK5agb0HxVwAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="LabelView" guid="o72CPBdC2UGyraSt4vxsHQAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="nH6UBhoeX0KbQRIkAzLiWAAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:REF name="Model">yqvs3sZ9DUGqcZqP0JhEYQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="Jb94kigpgUqu4dlcc+CGdAAA">
    <XPD:REF name="Model">yqvs3sZ9DUGqcZqP0JhEYQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="QxduxAxohEmCZQGHeQsZcgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:REF name="Model">yqvs3sZ9DUGqcZqP0JhEYQAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[4]" type="UMLRealizationView" guid="lL0hvfNl1UCp0ZckmzYqAAAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Points" type="Points">576,248;576,208</XPD:ATTR>
    <XPD:REF name="Model">MLMgV5lk30+73KeQUlkJ1AAA</XPD:REF>
    <XPD:REF name="Head">tSxGyrwfEkSgp1EcheSXaAAA</XPD:REF>
    <XPD:REF name="Tail">82N1NUXIMU2s0JVvIgA33wAA</XPD:REF>
    <XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="R+yIkrw1xkGRRmxo6cIv7AAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">MLMgV5lk30+73KeQUlkJ1AAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="MHt2cHh8nkq4xztkXeNA1AAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
    <XPD:REF name="Model">MLMgV5lk30+73KeQUlkJ1AAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="1cFzyVYsZUexhz9n3LRU9AAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">MLMgV5lk30+73KeQUlkJ1AAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[5]" type="UMLGeneralizationView" guid="fqotcKjEKUu0dHy5krCbbgAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Points" type="Points">576,384;576,342</XPD:ATTR>
    <XPD:REF name="Model">iGZQWONRSkmUZXwA2ctTYAAA</XPD:REF>
    <XPD:REF name="Head">82N1NUXIMU2s0JVvIgA33wAA</XPD:REF>
    <XPD:REF name="Tail">NaiNuZ1qLUu+5nZq2pgoJgAA</XPD:REF>
    <XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="a5TKNXnsu0Cm1O3vWK2A5QAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">iGZQWONRSkmUZXwA2ctTYAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="lfapsg0nvkOzLtKq21jKcQAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
    <XPD:REF name="Model">iGZQWONRSkmUZXwA2ctTYAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="J/CqIqCm4k64OiOc5XyUFgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">iGZQWONRSkmUZXwA2ctTYAAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[6]" type="UMLGeneralizationView" guid="Byj7ulJD9UmN+tawKGwCEgAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Points" type="Points">481,500;537,452</XPD:ATTR>
    <XPD:REF name="Model">AjD3odwWRkqn7DLLtsqSMQAA</XPD:REF>
    <XPD:REF name="Head">NaiNuZ1qLUu+5nZq2pgoJgAA</XPD:REF>
    <XPD:REF name="Tail">uk+yKXVJ4kGbJp9tS5jKTwAA</XPD:REF>
    <XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="HQiDhC6IA0iqlMhf1tdcJQAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">AjD3odwWRkqn7DLLtsqSMQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="npCChlHvbECPkeBWStHdGwAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
    <XPD:REF name="Model">AjD3odwWRkqn7DLLtsqSMQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="DNi8lqQWi0GHkNrHlB+wdAAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">AjD3odwWRkqn7DLLtsqSMQAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[7]" type="UMLClassView" guid="umRYCn2dek6PVCutQ7EHjgAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Left" type="integer">612</XPD:ATTR>
    <XPD:ATTR name="Top" type="integer">500</XPD:ATTR>
    <XPD:ATTR name="Width" type="integer">181</XPD:ATTR>
    <XPD:ATTR name="Height" type="integer">82</XPD:ATTR>
    <XPD:REF name="Model">fbO+5cdSPEmSXuXSqE8gXgAA</XPD:REF>
    <XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="IY/ehYDmxki8kSqbCHHCfQAA">
    <XPD:OBJ name="NameLabel" type="LabelView" guid="lcA4v9eDHUugTZoPU740LAAA">
    <XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
    <XPD:ATTR name="Text" type="string">FileAppender</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="LabelView" guid="OVAuCrBMykaCfcii7gDdCwAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="LabelView" guid="xiHCrB3qu0yBBg0U/q3EawAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="XJMRRQ4IvEKN76PkDbMKOQAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:REF name="Model">fbO+5cdSPEmSXuXSqE8gXgAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="wZmHw439VE+zuefCYQQqVAAA">
    <XPD:REF name="Model">fbO+5cdSPEmSXuXSqE8gXgAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="PHqgEBQhpEmlVKbjkRedkAAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:REF name="Model">fbO+5cdSPEmSXuXSqE8gXgAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[8]" type="UMLGeneralizationView" guid="xnvee9U5202YS/ztrwJSRAAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Points" type="Points">661,500;611,452</XPD:ATTR>
    <XPD:REF name="Model">DwI/SvxrPEa+xlJeUNknVQAA</XPD:REF>
    <XPD:REF name="Head">NaiNuZ1qLUu+5nZq2pgoJgAA</XPD:REF>
    <XPD:REF name="Tail">umRYCn2dek6PVCutQ7EHjgAA</XPD:REF>
    <XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="oASzcKN58EuYmztjk4WiEwAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">DwI/SvxrPEa+xlJeUNknVQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="O0OgQK6n40urO6JVc74njgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
    <XPD:REF name="Model">DwI/SvxrPEa+xlJeUNknVQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="bgKTOidFkEeRLn6bk0KEEgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">DwI/SvxrPEa+xlJeUNknVQAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[9]" type="UMLClassView" guid="rHFGD6C9T0y5SMWPFgS09QAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Left" type="integer">596</XPD:ATTR>
    <XPD:ATTR name="Top" type="integer">628</XPD:ATTR>
    <XPD:ATTR name="Width" type="integer">213</XPD:ATTR>
    <XPD:ATTR name="Height" type="integer">69</XPD:ATTR>
    <XPD:REF name="Model">V4xOMUpxokyB4fxrQNJPxQAA</XPD:REF>
    <XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="OuAPH3aKlk2rg4cWgwv2BQAA">
    <XPD:OBJ name="NameLabel" type="LabelView" guid="BEu6SCte7E6fslLxmD8brgAA">
    <XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
    <XPD:ATTR name="Text" type="string">RollingFileAppender</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="LabelView" guid="diAZdqUjrUSnaEkyvki5HwAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="LabelView" guid="HpL3GnQOO0KyNABCTyAsRwAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="1hKuFZUojkuzeqX9AiWUlwAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:REF name="Model">V4xOMUpxokyB4fxrQNJPxQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="g+GUofZEmU2lEM1VL3vLIQAA">
    <XPD:REF name="Model">V4xOMUpxokyB4fxrQNJPxQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="4HSOp+H3/ECJnOpzcIo3jwAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:REF name="Model">V4xOMUpxokyB4fxrQNJPxQAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[10]" type="UMLClassView" guid="0AQ8gdYUKk2Ms7nTdCyd3QAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Left" type="integer">788</XPD:ATTR>
    <XPD:ATTR name="Top" type="integer">372</XPD:ATTR>
    <XPD:ATTR name="Width" type="integer">137</XPD:ATTR>
    <XPD:ATTR name="Height" type="integer">95</XPD:ATTR>
    <XPD:REF name="Model">F1lk6TogWUGfYFH4FvBLOAAA</XPD:REF>
    <XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="h/ce/kieOUyyxRZ6c71fTQAA">
    <XPD:OBJ name="NameLabel" type="LabelView" guid="UZy1Qq+RWUWzR+BkMD2qBwAA">
    <XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
    <XPD:ATTR name="Text" type="string">Encoder</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="LabelView" guid="A/4/paNKfEeyuIjaeXDosAAA">
    <XPD:ATTR name="Text" type="string">&lt;&lt;interface&gt;&gt;</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="LabelView" guid="Y950eaGp5kKS5JcixC2pLAAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="lyHSH0gj5USAm8DDiVvc1AAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:REF name="Model">F1lk6TogWUGfYFH4FvBLOAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="A7cLwlK4RESapHusUAalugAA">
    <XPD:REF name="Model">F1lk6TogWUGfYFH4FvBLOAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="qQCEnWeXyUaictLrSH/4IgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:REF name="Model">F1lk6TogWUGfYFH4FvBLOAAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[11]" type="UMLAssociationView" guid="lMmxZJude0e4iK5TJK4KmwAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Points" type="Points">788,419;704,419</XPD:ATTR>
    <XPD:REF name="Model">kXyf6+RLrki8M9yh9qd9JwAA</XPD:REF>
    <XPD:REF name="Head">NaiNuZ1qLUu+5nZq2pgoJgAA</XPD:REF>
    <XPD:REF name="Tail">0AQ8gdYUKk2Ms7nTdCyd3QAA</XPD:REF>
    <XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="Lpxx+3J+D0S223D5ODQq4wAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">kXyf6+RLrki8M9yh9qd9JwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="rhfNbKEGWUaK9KPGeno2AAAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
    <XPD:REF name="Model">kXyf6+RLrki8M9yh9qd9JwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="5lfzJsxzLkS60zCpNz5+twAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">kXyf6+RLrki8M9yh9qd9JwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="w+U1pR05XkeMT1rnnS2TcgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
    <XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
    <XPD:REF name="Model">KNPa5jL8m0SnxCPJDiLPEwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="G2JYoZaOKku0lwIKN7cKRQAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
    <XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
    <XPD:REF name="Model">JFP7YnD8ak2COLWe8jfBSwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="Wzm+qJkDL0+jgE0ioVsNvwAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
    <XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
    <XPD:REF name="Model">KNPa5jL8m0SnxCPJDiLPEwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="h/GU+p9gHkyMIIzW5Tap4wAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
    <XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
    <XPD:REF name="Model">JFP7YnD8ak2COLWe8jfBSwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="MLngpvqsdU+i4Djdsali7wAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
    <XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
    <XPD:REF name="Model">KNPa5jL8m0SnxCPJDiLPEwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="yN2upZx6REeZpBi/IRMnlgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
    <XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
    <XPD:REF name="Model">JFP7YnD8ak2COLWe8jfBSwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="ZVjULz2utUKwdUcoGweZkgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
    <XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
    <XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
    <XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
    <XPD:REF name="Model">KNPa5jL8m0SnxCPJDiLPEwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="4leicQixUEWISYBF6P8LSgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
    <XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
    <XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
    <XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
    <XPD:REF name="Model">JFP7YnD8ak2COLWe8jfBSwAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[12]" type="UMLGeneralizationView" guid="VGws4gb7FEGKDPIpXKW13QAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Points" type="Points">702,628;702,581</XPD:ATTR>
    <XPD:REF name="Model">MAm8gr3YDE+lxocsUB9afAAA</XPD:REF>
    <XPD:REF name="Head">umRYCn2dek6PVCutQ7EHjgAA</XPD:REF>
    <XPD:REF name="Tail">rHFGD6C9T0y5SMWPFgS09QAA</XPD:REF>
    <XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="2t9xQX0DaECER1G841x4ggAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">MAm8gr3YDE+lxocsUB9afAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="ZJ+e5yqWkkyJmgI5NCe9qQAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
    <XPD:REF name="Model">MAm8gr3YDE+lxocsUB9afAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="uWFySM7Jq026r7z2lz9/TgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">MAm8gr3YDE+lxocsUB9afAAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[13]" type="UMLClassView" guid="XnLeT4tUAUivKFCoAi8mCgAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Left" type="integer">240</XPD:ATTR>
    <XPD:ATTR name="Top" type="integer">392</XPD:ATTR>
    <XPD:ATTR name="Width" type="integer">152</XPD:ATTR>
    <XPD:ATTR name="Height" type="integer">56</XPD:ATTR>
    <XPD:REF name="Model">ObD18j8uiUuqWEEES+U7VwAA</XPD:REF>
    <XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="w2rmuF62nUmUAhOhrmqOyQAA">
    <XPD:OBJ name="NameLabel" type="LabelView" guid="irr7mImnC0OIf0QeBwSo3AAA">
    <XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
    <XPD:ATTR name="Text" type="string">Filter</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="LabelView" guid="/ZkI9RE/EkCmMYBYxW9vSgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="LabelView" guid="/Seh5JPXJ0WqIDeUCCMxGQAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="Y+K3bBi2DEiJlBzf/w+degAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:REF name="Model">ObD18j8uiUuqWEEES+U7VwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="x12I7wVJHkKX8s9N/bVWLQAA">
    <XPD:REF name="Model">ObD18j8uiUuqWEEES+U7VwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="ybd6Chc7bUaikqpMu2gydwAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:REF name="Model">ObD18j8uiUuqWEEES+U7VwAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[14]" type="UMLAssociationView" guid="1GuVB976AUueN1l11+x/9AAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Points" type="Points">391,419;448,419</XPD:ATTR>
    <XPD:REF name="Model">uh4HvYt2ZECJHo2VN0YtPwAA</XPD:REF>
    <XPD:REF name="Head">NaiNuZ1qLUu+5nZq2pgoJgAA</XPD:REF>
    <XPD:REF name="Tail">XnLeT4tUAUivKFCoAi8mCgAA</XPD:REF>
    <XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="rvc1lZzjJkyWMr6P/IPRnQAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">uh4HvYt2ZECJHo2VN0YtPwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="bCA0jUpnukKQFQdvrUXC5gAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
    <XPD:REF name="Model">uh4HvYt2ZECJHo2VN0YtPwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="okxxVKfDiESE7wFAiHiTwQAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">uh4HvYt2ZECJHo2VN0YtPwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="IPgYB1C27EyGv2x09901MgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
    <XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
    <XPD:REF name="Model">IA0uuG/DqUSPP93NTt7KPwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="mdaJom9Aq0CCnF2E8j5mfgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
    <XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
    <XPD:REF name="Model">rtqCfaDNzE6xCSqNvsGQmAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="QVrq+D0yCke4xdkp2ecVFgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
    <XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
    <XPD:REF name="Model">IA0uuG/DqUSPP93NTt7KPwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="u6QeWosm+0GF06B6oeoA3AAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
    <XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
    <XPD:REF name="Model">rtqCfaDNzE6xCSqNvsGQmAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="YoNg+kiZ/0Kk9BC8Hs4jBgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
    <XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
    <XPD:REF name="Model">IA0uuG/DqUSPP93NTt7KPwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="TwLu6YMezke1PLwCqD9EKwAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
    <XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
    <XPD:REF name="Model">rtqCfaDNzE6xCSqNvsGQmAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="j3F8XkYCU0K+Wb/6ACwHmAAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
    <XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
    <XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
    <XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
    <XPD:REF name="Model">IA0uuG/DqUSPP93NTt7KPwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="5M6UkF5vREiYn4A49eajJAAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
    <XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
    <XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
    <XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
    <XPD:REF name="Model">rtqCfaDNzE6xCSqNvsGQmAAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:ATTR name="#OwnedElements" type="integer">28</XPD:ATTR>
    <XPD:OBJ name="OwnedElements[0]" type="UMLInterface" guid="bL5DGTE1wkqFiYq+yJuTRAAA">
    <XPD:ATTR name="Name" type="string">Bae, Rankyoung</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[1]" type="UMLInterface" guid="PfW7flMvskqKmFDofejCYQAA">
    <XPD:ATTR name="Name" type="string">Jung, Yoontae</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[2]" type="UMLInterface" guid="XthOkDh0rk67+FyPgXCRgAAA">
    <XPD:ATTR name="Name" type="string">Kim, Hyunsoo</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[3]" type="UMLInterface" guid="WhfjywuM1kqS7RtEmuvAlgAA">
    <XPD:ATTR name="Name" type="string">Kim, Jeongil</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[4]" type="UMLClass" guid="Ec4V6xlK5USBInAfRT+kBgAA">
    <XPD:ATTR name="Name" type="string">Appender</XPD:ATTR>
    <XPD:ATTR name="StereotypeName" type="string">interface</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">tSxGyrwfEkSgp1EcheSXaAAA</XPD:REF>
    <XPD:REF name="Views[1]">m+f/Nz96gEqfQeHGgfAxjwAA</XPD:REF>
    <XPD:REF name="Views[2]">ViAxcLeYxEC/QDB9dCuwagAA</XPD:REF>
    <XPD:REF name="Views[3]">gvxeAhX+WkGcvqw6KjlA7wAA</XPD:REF>
    <XPD:ATTR name="#ClientDependencies" type="integer">1</XPD:ATTR>
    <XPD:REF name="ClientDependencies[0]">kjMmekdMhUCZp7nT1+7m5QAA</XPD:REF>
    <XPD:ATTR name="#SupplierDependencies" type="integer">2</XPD:ATTR>
    <XPD:REF name="SupplierDependencies[0]">MLMgV5lk30+73KeQUlkJ1AAA</XPD:REF>
    <XPD:REF name="SupplierDependencies[1]">kjMmekdMhUCZp7nT1+7m5QAA</XPD:REF>
    <XPD:ATTR name="#Operations" type="integer">1</XPD:ATTR>
    <XPD:OBJ name="Operations[0]" type="UMLOperation" guid="FRx7C/jgm0uUQ2KJbSES0QAA">
    <XPD:ATTR name="Name" type="string">doAppend</XPD:ATTR>
    <XPD:REF name="Owner">Ec4V6xlK5USBInAfRT+kBgAA</XPD:REF>
    <XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="HEOzMeB7hUCVhMMCFiMU/QAA">
    <XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
    <XPD:ATTR name="TypeExpression" type="string">void</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">FRx7C/jgm0uUQ2KJbSES0QAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="/QxGe2nRTke4OPZr6B8DjwAA">
    <XPD:ATTR name="Name" type="string">E event</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">FRx7C/jgm0uUQ2KJbSES0QAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[5]" type="UMLClass" guid="wrUqRmysaUaTNG+EIldTAgAA">
    <XPD:ATTR name="Name" type="string">Lee, Jangwoo</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[6]" type="UMLClass" guid="R4ueGs13U0uU7uA7GfQuwgAA">
    <XPD:ATTR name="Name" type="string">Lee, Minkyu</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[7]" type="UMLClass" guid="cZJpDMIhLkaN+6380nTjCgAA">
    <XPD:ATTR name="Name" type="string">Lim, Heejin</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[8]" type="UMLInterface" guid="KkLGJmfcO0y7keuSLh3xpQAA">
    <XPD:ATTR name="Name" type="string">Bae, Rankyoung1</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[9]" type="UMLClass" guid="rzT262Z1jEeiLPfjq8YXAQAA">
    <XPD:ATTR name="Name" type="string">OutputStreamAppender</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">NaiNuZ1qLUu+5nZq2pgoJgAA</XPD:REF>
    <XPD:REF name="Views[1]">H/1viIm6yE20XaYIV5XQmgAA</XPD:REF>
    <XPD:REF name="Views[2]">/LiIyuskqE6jkbei5roLSgAA</XPD:REF>
    <XPD:REF name="Views[3]">LFUOQyCzKkODyDltdenqSQAA</XPD:REF>
    <XPD:ATTR name="#Generalizations" type="integer">1</XPD:ATTR>
    <XPD:REF name="Generalizations[0]">iGZQWONRSkmUZXwA2ctTYAAA</XPD:REF>
    <XPD:ATTR name="#Specializations" type="integer">2</XPD:ATTR>
    <XPD:REF name="Specializations[0]">AjD3odwWRkqn7DLLtsqSMQAA</XPD:REF>
    <XPD:REF name="Specializations[1]">DwI/SvxrPEa+xlJeUNknVQAA</XPD:REF>
    <XPD:ATTR name="#Operations" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Operations[0]" type="UMLOperation" guid="Y/8ny1CDlUmGw7XO+p1IVAAA">
    <XPD:ATTR name="Name" type="string">setOutputStream</XPD:ATTR>
    <XPD:REF name="Owner">rzT262Z1jEeiLPfjq8YXAQAA</XPD:REF>
    <XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="o7mxtv1VFUuGMzTZ/PzpJQAA">
    <XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
    <XPD:ATTR name="TypeExpression" type="string">void</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">Y/8ny1CDlUmGw7XO+p1IVAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="WiQnBPlZNUKAb1kDr8rYMAAA">
    <XPD:ATTR name="Name" type="string">OutputStream</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">Y/8ny1CDlUmGw7XO+p1IVAAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="Operations[1]" type="UMLOperation" guid="LBTffoJKpkuteoCZOKUnaQAA">
    <XPD:ATTR name="Name" type="string">setEncoder</XPD:ATTR>
    <XPD:REF name="Owner">rzT262Z1jEeiLPfjq8YXAQAA</XPD:REF>
    <XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="QBbT8+accEGiDOyIxemC6gAA">
    <XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
    <XPD:ATTR name="TypeExpression" type="string">void</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">LBTffoJKpkuteoCZOKUnaQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="euJK1npBAkKQLyA/ixyf4gAA">
    <XPD:ATTR name="Name" type="string">Encoder&lt;E&gt;</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">LBTffoJKpkuteoCZOKUnaQAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:ATTR name="#Associations" type="integer">3</XPD:ATTR>
    <XPD:REF name="Associations[0]">CNBYSz/4s0OUBwR3Ujj7qAAA</XPD:REF>
    <XPD:REF name="Associations[1]">KNPa5jL8m0SnxCPJDiLPEwAA</XPD:REF>
    <XPD:REF name="Associations[2]">IA0uuG/DqUSPP93NTt7KPwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[10]" type="UMLClass" guid="xVL+I0ePyEKePe2ybmIZqQAA">
    <XPD:ATTR name="Name" type="string">UnsynchronizedAppenderBase</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">82N1NUXIMU2s0JVvIgA33wAA</XPD:REF>
    <XPD:REF name="Views[1]">MbkisNcJq06fy8rfNf//qgAA</XPD:REF>
    <XPD:REF name="Views[2]">bHWlSSp0L0KsF9iS2K/VuAAA</XPD:REF>
    <XPD:REF name="Views[3]">A3o0HBZQP0+GUAIDarVM5AAA</XPD:REF>
    <XPD:ATTR name="#ClientDependencies" type="integer">1</XPD:ATTR>
    <XPD:REF name="ClientDependencies[0]">MLMgV5lk30+73KeQUlkJ1AAA</XPD:REF>
    <XPD:ATTR name="#Generalizations" type="integer">1</XPD:ATTR>
    <XPD:REF name="Generalizations[0]">mt8sHMuW6k6vvkswchHN9AAA</XPD:REF>
    <XPD:ATTR name="#Specializations" type="integer">2</XPD:ATTR>
    <XPD:REF name="Specializations[0]">mt8sHMuW6k6vvkswchHN9AAA</XPD:REF>
    <XPD:REF name="Specializations[1]">iGZQWONRSkmUZXwA2ctTYAAA</XPD:REF>
    <XPD:ATTR name="#Operations" type="integer">4</XPD:ATTR>
    <XPD:OBJ name="Operations[0]" type="UMLOperation" guid="QrizX1w8Uk+lWkr80819WAAA">
    <XPD:ATTR name="Name" type="string">doAppend</XPD:ATTR>
    <XPD:REF name="Owner">xVL+I0ePyEKePe2ybmIZqQAA</XPD:REF>
    <XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="i3SFY3XjzkqfjCdeRItB0AAA">
    <XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
    <XPD:ATTR name="TypeExpression" type="string">void</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">QrizX1w8Uk+lWkr80819WAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="rcsyT8SmtEaJWAgOu29ifgAA">
    <XPD:ATTR name="Name" type="string">E event</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">QrizX1w8Uk+lWkr80819WAAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="Operations[1]" type="UMLOperation" guid="G5EvR3IAqUWyIUSQT5iKfAAA">
    <XPD:ATTR name="Name" type="string">append</XPD:ATTR>
    <XPD:ATTR name="Visibility" type="UMLVisibilityKind">vkProtected</XPD:ATTR>
    <XPD:REF name="Owner">xVL+I0ePyEKePe2ybmIZqQAA</XPD:REF>
    <XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="BZo+omwID0Op8lvSMhrmCAAA">
    <XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
    <XPD:ATTR name="TypeExpression" type="string">void</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">G5EvR3IAqUWyIUSQT5iKfAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="0mhi1Re0mUaekyTApQtYKgAA">
    <XPD:ATTR name="Name" type="string">E event</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">G5EvR3IAqUWyIUSQT5iKfAAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="Operations[2]" type="UMLOperation" guid="noZlW3WOpUSNYP7MIP2dIAAA">
    <XPD:ATTR name="Name" type="string">addFilter</XPD:ATTR>
    <XPD:REF name="Owner">xVL+I0ePyEKePe2ybmIZqQAA</XPD:REF>
    <XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="7JBY4nyhIES1n0jpwFzs0wAA">
    <XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
    <XPD:ATTR name="TypeExpression" type="string">void</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">noZlW3WOpUSNYP7MIP2dIAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="Zd/8hSZIgUuOnnlNuMOW3QAA">
    <XPD:ATTR name="Name" type="string">Filter&lt;E&gt; filter</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">noZlW3WOpUSNYP7MIP2dIAAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="Operations[3]" type="UMLOperation" guid="+Hda0J6VTEGM7V6+m3aW7QAA">
    <XPD:ATTR name="Name" type="string">getFilterChainDecision</XPD:ATTR>
    <XPD:REF name="Owner">xVL+I0ePyEKePe2ybmIZqQAA</XPD:REF>
    <XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="b7Oh8zbH6kKEeryzkMlLQgAA">
    <XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
    <XPD:ATTR name="TypeExpression" type="string">FilterReply</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">+Hda0J6VTEGM7V6+m3aW7QAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="QFIz2saC3kK9QRns9gVVIwAA">
    <XPD:ATTR name="Name" type="string">E event</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">+Hda0J6VTEGM7V6+m3aW7QAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[11]" type="UMLClass" guid="yqvs3sZ9DUGqcZqP0JhEYQAA">
    <XPD:ATTR name="Name" type="string">ConsoleAppender</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">uk+yKXVJ4kGbJp9tS5jKTwAA</XPD:REF>
    <XPD:REF name="Views[1]">nH6UBhoeX0KbQRIkAzLiWAAA</XPD:REF>
    <XPD:REF name="Views[2]">Jb94kigpgUqu4dlcc+CGdAAA</XPD:REF>
    <XPD:REF name="Views[3]">QxduxAxohEmCZQGHeQsZcgAA</XPD:REF>
    <XPD:ATTR name="#Generalizations" type="integer">3</XPD:ATTR>
    <XPD:REF name="Generalizations[0]">KECSr2IcSEKuUekqxWFfQQAA</XPD:REF>
    <XPD:REF name="Generalizations[1]">jfTGxiHUzUynYKDudsAtlgAA</XPD:REF>
    <XPD:REF name="Generalizations[2]">AjD3odwWRkqn7DLLtsqSMQAA</XPD:REF>
    <XPD:ATTR name="#Specializations" type="integer">2</XPD:ATTR>
    <XPD:REF name="Specializations[0]">KECSr2IcSEKuUekqxWFfQQAA</XPD:REF>
    <XPD:REF name="Specializations[1]">jfTGxiHUzUynYKDudsAtlgAA</XPD:REF>
    <XPD:ATTR name="#Operations" type="integer">1</XPD:ATTR>
    <XPD:OBJ name="Operations[0]" type="UMLOperation" guid="QBjgNn4eI0Gb0Lu8uW8RgQAA">
    <XPD:ATTR name="Name" type="string">setTarget</XPD:ATTR>
    <XPD:REF name="Owner">yqvs3sZ9DUGqcZqP0JhEYQAA</XPD:REF>
    <XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="D6Tvg4B6zk2nDCrvCSXiogAA">
    <XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
    <XPD:ATTR name="TypeExpression" type="string">void</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">QBjgNn4eI0Gb0Lu8uW8RgQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="5HN4co7SEkGYIIXb9P4IcwAA">
    <XPD:ATTR name="Name" type="string">String</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">QBjgNn4eI0Gb0Lu8uW8RgQAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[12]" type="UMLRealization" guid="MLMgV5lk30+73KeQUlkJ1AAA">
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:REF name="Client">xVL+I0ePyEKePe2ybmIZqQAA</XPD:REF>
    <XPD:REF name="Supplier">Ec4V6xlK5USBInAfRT+kBgAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">lL0hvfNl1UCp0ZckmzYqAAAA</XPD:REF>
    <XPD:REF name="Views[1]">R+yIkrw1xkGRRmxo6cIv7AAA</XPD:REF>
    <XPD:REF name="Views[2]">MHt2cHh8nkq4xztkXeNA1AAA</XPD:REF>
    <XPD:REF name="Views[3]">1cFzyVYsZUexhz9n3LRU9AAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[13]" type="UMLRealization" guid="kjMmekdMhUCZp7nT1+7m5QAA">
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:REF name="Client">Ec4V6xlK5USBInAfRT+kBgAA</XPD:REF>
    <XPD:REF name="Supplier">Ec4V6xlK5USBInAfRT+kBgAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[14]" type="UMLGeneralization" guid="mt8sHMuW6k6vvkswchHN9AAA">
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:REF name="Child">xVL+I0ePyEKePe2ybmIZqQAA</XPD:REF>
    <XPD:REF name="Parent">xVL+I0ePyEKePe2ybmIZqQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[15]" type="UMLGeneralization" guid="iGZQWONRSkmUZXwA2ctTYAAA">
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:REF name="Child">rzT262Z1jEeiLPfjq8YXAQAA</XPD:REF>
    <XPD:REF name="Parent">xVL+I0ePyEKePe2ybmIZqQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">fqotcKjEKUu0dHy5krCbbgAA</XPD:REF>
    <XPD:REF name="Views[1]">a5TKNXnsu0Cm1O3vWK2A5QAA</XPD:REF>
    <XPD:REF name="Views[2]">lfapsg0nvkOzLtKq21jKcQAA</XPD:REF>
    <XPD:REF name="Views[3]">J/CqIqCm4k64OiOc5XyUFgAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[16]" type="UMLGeneralization" guid="KECSr2IcSEKuUekqxWFfQQAA">
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:REF name="Child">yqvs3sZ9DUGqcZqP0JhEYQAA</XPD:REF>
    <XPD:REF name="Parent">yqvs3sZ9DUGqcZqP0JhEYQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[17]" type="UMLGeneralization" guid="jfTGxiHUzUynYKDudsAtlgAA">
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:REF name="Child">yqvs3sZ9DUGqcZqP0JhEYQAA</XPD:REF>
    <XPD:REF name="Parent">yqvs3sZ9DUGqcZqP0JhEYQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[18]" type="UMLGeneralization" guid="AjD3odwWRkqn7DLLtsqSMQAA">
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:REF name="Child">yqvs3sZ9DUGqcZqP0JhEYQAA</XPD:REF>
    <XPD:REF name="Parent">rzT262Z1jEeiLPfjq8YXAQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">Byj7ulJD9UmN+tawKGwCEgAA</XPD:REF>
    <XPD:REF name="Views[1]">HQiDhC6IA0iqlMhf1tdcJQAA</XPD:REF>
    <XPD:REF name="Views[2]">npCChlHvbECPkeBWStHdGwAA</XPD:REF>
    <XPD:REF name="Views[3]">DNi8lqQWi0GHkNrHlB+wdAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[19]" type="UMLClass" guid="fbO+5cdSPEmSXuXSqE8gXgAA">
    <XPD:ATTR name="Name" type="string">FileAppender</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">umRYCn2dek6PVCutQ7EHjgAA</XPD:REF>
    <XPD:REF name="Views[1]">XJMRRQ4IvEKN76PkDbMKOQAA</XPD:REF>
    <XPD:REF name="Views[2]">wZmHw439VE+zuefCYQQqVAAA</XPD:REF>
    <XPD:REF name="Views[3]">PHqgEBQhpEmlVKbjkRedkAAA</XPD:REF>
    <XPD:ATTR name="#Generalizations" type="integer">1</XPD:ATTR>
    <XPD:REF name="Generalizations[0]">DwI/SvxrPEa+xlJeUNknVQAA</XPD:REF>
    <XPD:ATTR name="#Specializations" type="integer">1</XPD:ATTR>
    <XPD:REF name="Specializations[0]">MAm8gr3YDE+lxocsUB9afAAA</XPD:REF>
    <XPD:ATTR name="#Operations" type="integer">3</XPD:ATTR>
    <XPD:OBJ name="Operations[0]" type="UMLOperation" guid="RGzx8sTCQ0+SvjEhj3FCpwAA">
    <XPD:ATTR name="Name" type="string">setFile</XPD:ATTR>
    <XPD:REF name="Owner">fbO+5cdSPEmSXuXSqE8gXgAA</XPD:REF>
    <XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="uxSNpKmGV0+K54EwgffqpgAA">
    <XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
    <XPD:ATTR name="TypeExpression" type="string">void</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">RGzx8sTCQ0+SvjEhj3FCpwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="i90wHpacOEiHseZIDnpZAAAA">
    <XPD:ATTR name="Name" type="string">String</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">RGzx8sTCQ0+SvjEhj3FCpwAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="Operations[1]" type="UMLOperation" guid="emxKAOn2sEGODzlrBwfBDQAA">
    <XPD:ATTR name="Name" type="string">setPrudent</XPD:ATTR>
    <XPD:REF name="Owner">fbO+5cdSPEmSXuXSqE8gXgAA</XPD:REF>
    <XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="Qzhwjji8FkawThwNpGWYlAAA">
    <XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
    <XPD:ATTR name="TypeExpression" type="string">void</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">emxKAOn2sEGODzlrBwfBDQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="/c5zBe26tkWrpTH8RQJKDgAA">
    <XPD:ATTR name="Name" type="string">boolean</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">emxKAOn2sEGODzlrBwfBDQAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="Operations[2]" type="UMLOperation" guid="pzOru1aa1kKBEpPdw/x8HwAA">
    <XPD:ATTR name="Name" type="string">setAppend</XPD:ATTR>
    <XPD:REF name="Owner">fbO+5cdSPEmSXuXSqE8gXgAA</XPD:REF>
    <XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="xfe5Kz7eGUGt/qsdAVz1nwAA">
    <XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
    <XPD:ATTR name="TypeExpression" type="string">void</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">pzOru1aa1kKBEpPdw/x8HwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="byGZtqglLkSMXqHvyAwzXQAA">
    <XPD:ATTR name="Name" type="string">boolean</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">pzOru1aa1kKBEpPdw/x8HwAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[20]" type="UMLGeneralization" guid="DwI/SvxrPEa+xlJeUNknVQAA">
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:REF name="Child">fbO+5cdSPEmSXuXSqE8gXgAA</XPD:REF>
    <XPD:REF name="Parent">rzT262Z1jEeiLPfjq8YXAQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">xnvee9U5202YS/ztrwJSRAAA</XPD:REF>
    <XPD:REF name="Views[1]">oASzcKN58EuYmztjk4WiEwAA</XPD:REF>
    <XPD:REF name="Views[2]">O0OgQK6n40urO6JVc74njgAA</XPD:REF>
    <XPD:REF name="Views[3]">bgKTOidFkEeRLn6bk0KEEgAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[21]" type="UMLClass" guid="V4xOMUpxokyB4fxrQNJPxQAA">
    <XPD:ATTR name="Name" type="string">RollingFileAppender</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">rHFGD6C9T0y5SMWPFgS09QAA</XPD:REF>
    <XPD:REF name="Views[1]">1hKuFZUojkuzeqX9AiWUlwAA</XPD:REF>
    <XPD:REF name="Views[2]">g+GUofZEmU2lEM1VL3vLIQAA</XPD:REF>
    <XPD:REF name="Views[3]">4HSOp+H3/ECJnOpzcIo3jwAA</XPD:REF>
    <XPD:ATTR name="#Generalizations" type="integer">1</XPD:ATTR>
    <XPD:REF name="Generalizations[0]">MAm8gr3YDE+lxocsUB9afAAA</XPD:REF>
    <XPD:ATTR name="#Operations" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Operations[0]" type="UMLOperation" guid="zJE7QEhOYkGwavHKRi/e1gAA">
    <XPD:ATTR name="Name" type="string">setRollingPolicy</XPD:ATTR>
    <XPD:REF name="Owner">V4xOMUpxokyB4fxrQNJPxQAA</XPD:REF>
    <XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="fBG8X0xpiU2QG4VhcArHXwAA">
    <XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
    <XPD:ATTR name="TypeExpression" type="string">void</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">zJE7QEhOYkGwavHKRi/e1gAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="pokyvx+ik0yawdfYXl/EHQAA">
    <XPD:ATTR name="Name" type="string">RollingPolicy</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">zJE7QEhOYkGwavHKRi/e1gAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="Operations[1]" type="UMLOperation" guid="90I+pA0XnkiDcK8Um95kDwAA">
    <XPD:ATTR name="Name" type="string">setTriggeringPolicy</XPD:ATTR>
    <XPD:REF name="Owner">V4xOMUpxokyB4fxrQNJPxQAA</XPD:REF>
    <XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR>
    <XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="/rKEm7ax1kOVmGAMDsfXRgAA">
    <XPD:ATTR name="Name" type="string">TriggeringPolicy&lt;E&gt;</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">90I+pA0XnkiDcK8Um95kDwAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[22]" type="UMLClass" guid="F1lk6TogWUGfYFH4FvBLOAAA">
    <XPD:ATTR name="Name" type="string">Encoder</XPD:ATTR>
    <XPD:ATTR name="StereotypeName" type="string">interface</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">0AQ8gdYUKk2Ms7nTdCyd3QAA</XPD:REF>
    <XPD:REF name="Views[1]">lyHSH0gj5USAm8DDiVvc1AAA</XPD:REF>
    <XPD:REF name="Views[2]">A7cLwlK4RESapHusUAalugAA</XPD:REF>
    <XPD:REF name="Views[3]">qQCEnWeXyUaictLrSH/4IgAA</XPD:REF>
    <XPD:ATTR name="#Operations" type="integer">3</XPD:ATTR>
    <XPD:OBJ name="Operations[0]" type="UMLOperation" guid="KTkAdBDG1k6vBX6/3VDh3wAA">
    <XPD:ATTR name="Name" type="string">init</XPD:ATTR>
    <XPD:REF name="Owner">F1lk6TogWUGfYFH4FvBLOAAA</XPD:REF>
    <XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="K1xInu1IW06VU8RAornDFgAA">
    <XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
    <XPD:ATTR name="TypeExpression" type="string">void</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">KTkAdBDG1k6vBX6/3VDh3wAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="q0oNOzYnwkC00CgD5grrpgAA">
    <XPD:ATTR name="Name" type="string">OutputStream</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">KTkAdBDG1k6vBX6/3VDh3wAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="Operations[1]" type="UMLOperation" guid="0OIKQj9lz0epLF4VThStRgAA">
    <XPD:ATTR name="Name" type="string">doEncode</XPD:ATTR>
    <XPD:REF name="Owner">F1lk6TogWUGfYFH4FvBLOAAA</XPD:REF>
    <XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="DMbvra8Y4E+d/ziodIGqyQAA">
    <XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
    <XPD:ATTR name="TypeExpression" type="string">void</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">0OIKQj9lz0epLF4VThStRgAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="v+KY7Q4t4kak92z8YJ0K7AAA">
    <XPD:ATTR name="Name" type="string">E event</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">0OIKQj9lz0epLF4VThStRgAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="Operations[2]" type="UMLOperation" guid="I6ieXuGhMkCcbz9MDCy1uAAA">
    <XPD:ATTR name="Name" type="string">close</XPD:ATTR>
    <XPD:REF name="Owner">F1lk6TogWUGfYFH4FvBLOAAA</XPD:REF>
    <XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR>
    <XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="XyFkApGcmESs4dwJgM1s8AAA">
    <XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
    <XPD:ATTR name="TypeExpression" type="string">void</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">I6ieXuGhMkCcbz9MDCy1uAAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR>
    <XPD:REF name="Associations[0]">1RTpKQO+4U+uqZahckvNEwAA</XPD:REF>
    <XPD:REF name="Associations[1]">JFP7YnD8ak2COLWe8jfBSwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[23]" type="UMLAssociation" guid="u9/9xY5vOU2kSfX9AmlMAwAA">
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="CNBYSz/4s0OUBwR3Ujj7qAAA">
    <XPD:REF name="Association">u9/9xY5vOU2kSfX9AmlMAwAA</XPD:REF>
    <XPD:REF name="Participant">rzT262Z1jEeiLPfjq8YXAQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="1RTpKQO+4U+uqZahckvNEwAA">
    <XPD:ATTR name="Aggregation" type="UMLAggregationKind">akComposite</XPD:ATTR>
    <XPD:REF name="Association">u9/9xY5vOU2kSfX9AmlMAwAA</XPD:REF>
    <XPD:REF name="Participant">F1lk6TogWUGfYFH4FvBLOAAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[24]" type="UMLAssociation" guid="kXyf6+RLrki8M9yh9qd9JwAA">
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">lMmxZJude0e4iK5TJK4KmwAA</XPD:REF>
    <XPD:REF name="Views[1]">Lpxx+3J+D0S223D5ODQq4wAA</XPD:REF>
    <XPD:REF name="Views[2]">rhfNbKEGWUaK9KPGeno2AAAA</XPD:REF>
    <XPD:REF name="Views[3]">5lfzJsxzLkS60zCpNz5+twAA</XPD:REF>
    <XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="JFP7YnD8ak2COLWe8jfBSwAA">
    <XPD:REF name="Association">kXyf6+RLrki8M9yh9qd9JwAA</XPD:REF>
    <XPD:REF name="Participant">F1lk6TogWUGfYFH4FvBLOAAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">G2JYoZaOKku0lwIKN7cKRQAA</XPD:REF>
    <XPD:REF name="Views[1]">h/GU+p9gHkyMIIzW5Tap4wAA</XPD:REF>
    <XPD:REF name="Views[2]">yN2upZx6REeZpBi/IRMnlgAA</XPD:REF>
    <XPD:REF name="Views[3]">4leicQixUEWISYBF6P8LSgAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="KNPa5jL8m0SnxCPJDiLPEwAA">
    <XPD:ATTR name="Aggregation" type="UMLAggregationKind">akComposite</XPD:ATTR>
    <XPD:REF name="Association">kXyf6+RLrki8M9yh9qd9JwAA</XPD:REF>
    <XPD:REF name="Participant">rzT262Z1jEeiLPfjq8YXAQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">w+U1pR05XkeMT1rnnS2TcgAA</XPD:REF>
    <XPD:REF name="Views[1]">Wzm+qJkDL0+jgE0ioVsNvwAA</XPD:REF>
    <XPD:REF name="Views[2]">MLngpvqsdU+i4Djdsali7wAA</XPD:REF>
    <XPD:REF name="Views[3]">ZVjULz2utUKwdUcoGweZkgAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[25]" type="UMLGeneralization" guid="MAm8gr3YDE+lxocsUB9afAAA">
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:REF name="Child">V4xOMUpxokyB4fxrQNJPxQAA</XPD:REF>
    <XPD:REF name="Parent">fbO+5cdSPEmSXuXSqE8gXgAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">VGws4gb7FEGKDPIpXKW13QAA</XPD:REF>
    <XPD:REF name="Views[1]">2t9xQX0DaECER1G841x4ggAA</XPD:REF>
    <XPD:REF name="Views[2]">ZJ+e5yqWkkyJmgI5NCe9qQAA</XPD:REF>
    <XPD:REF name="Views[3]">uWFySM7Jq026r7z2lz9/TgAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[26]" type="UMLClass" guid="ObD18j8uiUuqWEEES+U7VwAA">
    <XPD:ATTR name="Name" type="string">Filter</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">XnLeT4tUAUivKFCoAi8mCgAA</XPD:REF>
    <XPD:REF name="Views[1]">Y+K3bBi2DEiJlBzf/w+degAA</XPD:REF>
    <XPD:REF name="Views[2]">x12I7wVJHkKX8s9N/bVWLQAA</XPD:REF>
    <XPD:REF name="Views[3]">ybd6Chc7bUaikqpMu2gydwAA</XPD:REF>
    <XPD:ATTR name="#Operations" type="integer">1</XPD:ATTR>
    <XPD:OBJ name="Operations[0]" type="UMLOperation" guid="h2ChKW0gZES/JuZQuxznnwAA">
    <XPD:ATTR name="Name" type="string">decide</XPD:ATTR>
    <XPD:REF name="Owner">ObD18j8uiUuqWEEES+U7VwAA</XPD:REF>
    <XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="en+rpIVeCkSoJAa812PoLwAA">
    <XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
    <XPD:ATTR name="TypeExpression" type="string">FilterReply</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">h2ChKW0gZES/JuZQuxznnwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="uNlc9FZz80ancniLw7/8MgAA">
    <XPD:ATTR name="Name" type="string">E event</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">h2ChKW0gZES/JuZQuxznnwAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR>
    <XPD:REF name="Associations[0]">rtqCfaDNzE6xCSqNvsGQmAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[27]" type="UMLAssociation" guid="uh4HvYt2ZECJHo2VN0YtPwAA">
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">1GuVB976AUueN1l11+x/9AAA</XPD:REF>
    <XPD:REF name="Views[1]">rvc1lZzjJkyWMr6P/IPRnQAA</XPD:REF>
    <XPD:REF name="Views[2]">bCA0jUpnukKQFQdvrUXC5gAA</XPD:REF>
    <XPD:REF name="Views[3]">okxxVKfDiESE7wFAiHiTwQAA</XPD:REF>
    <XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="rtqCfaDNzE6xCSqNvsGQmAAA">
    <XPD:REF name="Association">uh4HvYt2ZECJHo2VN0YtPwAA</XPD:REF>
    <XPD:REF name="Participant">ObD18j8uiUuqWEEES+U7VwAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">mdaJom9Aq0CCnF2E8j5mfgAA</XPD:REF>
    <XPD:REF name="Views[1]">TwLu6YMezke1PLwCqD9EKwAA</XPD:REF>
    <XPD:REF name="Views[2]">u6QeWosm+0GF06B6oeoA3AAA</XPD:REF>
    <XPD:REF name="Views[3]">5M6UkF5vREiYn4A49eajJAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="IA0uuG/DqUSPP93NTt7KPwAA">
    <XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
    <XPD:REF name="Association">uh4HvYt2ZECJHo2VN0YtPwAA</XPD:REF>
    <XPD:REF name="Participant">rzT262Z1jEeiLPfjq8YXAQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">IPgYB1C27EyGv2x09901MgAA</XPD:REF>
    <XPD:REF name="Views[1]">YoNg+kiZ/0Kk9BC8Hs4jBgAA</XPD:REF>
    <XPD:REF name="Views[2]">QVrq+D0yCke4xdkp2ecVFgAA</XPD:REF>
    <XPD:REF name="Views[3]">j3F8XkYCU0K+Wb/6ACwHmAAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[3]" type="UMLModel" guid="UTbE66PthkuXloDrctmmwwAA">
    <XPD:ATTR name="Name" type="string">Implementation Model</XPD:ATTR>
    <XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
    <XPD:ATTR name="StereotypeName" type="string">implementationModel</XPD:ATTR>
    <XPD:REF name="Namespace">JEGKOL0wwE6O2Emy29kFuwAA</XPD:REF>
    <XPD:ATTR name="#OwnedDiagrams" type="integer">1</XPD:ATTR>
    <XPD:OBJ name="OwnedDiagrams[0]" type="UMLComponentDiagram" guid="UJbtRzsKuEa7sZAmr/tDGAAA">
    <XPD:ATTR name="Name" type="string">Main</XPD:ATTR>
    <XPD:REF name="DiagramOwner">UTbE66PthkuXloDrctmmwwAA</XPD:REF>
    <XPD:OBJ name="DiagramView" type="UMLComponentDiagramView" guid="vo5SIJcJIUWJz7mqomMr4wAA">
    <XPD:REF name="Diagram">UJbtRzsKuEa7sZAmr/tDGAAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:ATTR name="#OwnedElements" type="integer">1</XPD:ATTR>
    <XPD:OBJ name="OwnedElements[0]" type="UMLInterface" guid="naDG3jNwKEqkpiKwcQF/xgAA">
    <XPD:ATTR name="Name" type="string">dsd</XPD:ATTR>
    <XPD:REF name="Namespace">UTbE66PthkuXloDrctmmwwAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[4]" type="UMLModel" guid="sbAEE91CXU+VbUQcRp4FwgAA">
    <XPD:ATTR name="Name" type="string">Deployment Model</XPD:ATTR>
    <XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
    <XPD:ATTR name="StereotypeName" type="string">deploymentModel</XPD:ATTR>
    <XPD:REF name="Namespace">JEGKOL0wwE6O2Emy29kFuwAA</XPD:REF>
    <XPD:ATTR name="#OwnedDiagrams" type="integer">1</XPD:ATTR>
    <XPD:OBJ name="OwnedDiagrams[0]" type="UMLDeploymentDiagram" guid="tzrsCrrbjka5umz88mdzIAAA">
    <XPD:ATTR name="Name" type="string">Main</XPD:ATTR>
    <XPD:REF name="DiagramOwner">sbAEE91CXU+VbUQcRp4FwgAA</XPD:REF>
    <XPD:OBJ name="DiagramView" type="UMLDeploymentDiagramView" guid="OlRAEhzdxkCw+mUnxs9v2wAA">
    <XPD:REF name="Diagram">tzrsCrrbjka5umz88mdzIAAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[5]" type="UMLModel" guid="mC0A50UCikqRZT73f5NgTgAA">
    <XPD:ATTR name="Name" type="string">Analysis Model1</XPD:ATTR>
    <XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
    <XPD:ATTR name="StereotypeName" type="string">analysisModel</XPD:ATTR>
    <XPD:REF name="Namespace">JEGKOL0wwE6O2Emy29kFuwAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    </XPD:BODY>
    </XPD:PROJECT>
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/manual/images/chapters/appenders/dbAppenderLE.gif����0000644�0001750�0001750�00000075050�11377016712�032571� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89aJo������>N`@N]8DQ恞]r:GT5AM⚼ޗږؕגӄrVi|2=H$,4!'犨xj '.=JWf~}mJ[kcy,6?DSa6FT#>MY۷tܕʽl܋}{yەͯ|||zzzyyyvvvuuurrrqqqnnnllljjjiiifffdddbbbaaa___\\\ZZZXXXVVVTTTRRRQQQNNNLLLKKKIIIFFFEEECCC@@@>>>:::333,,,$$$
    
    
    !���,����Jo���YH*\Ȱ`T
    #JHŋbȱǏ
    _"I\+U.0iIaʒ5s6͞&/cd)]ʴӧPJ*ճ[ȒRʵׯ`ZŪ5ٳhӪzX[k.mV]YzߪW.\ˆجP/Y2iڴϠCMiН<}
    	Y7w>M۸sN؜uNӪW&&ͳOjy盥W͚.bkΛkУ_ou˯]7zsg?{]_qc,$J(4&'@h|Ivx(r
    )ʼzbء�L n8!"h3(dq8H&y�b)0ɔb%.h$EL:	T	kA
    )�s0fȦ,ba#8ˉx~gaOF)̔)$2J(މH(DJf))UreZ6)
    ^I"ĎbJ/�+,2R-Or2k8~Š5dkm>,(Ћ)
    ;,Fkmk0xŚ(�golZl. ;$*Bf^JL1KKm�RK^<r'I/bof2$*3g�zlp.+2nvm.12Kn6={1ly	Ǩ-t{x|L]n}wܴX^�S
    πsý',~ +6R(KlBnoR"u*)J(,K*`0H(8ǧ_|L«=+<}*	)E'נTb+1OX{H3	=.TEc1]/{`|}KRѾ"~SgXVck
    p{[E,H@Qp`$:щ@*V!)UY!Cn{O(/%-EBMRz_P!#Rٓw@	BԆW
    D#wD^+9R܏وSCU<.a-G6zG)nIK *x	D^(NhQ.b+py=x=6HV4ddNM.W!yc&vB+!
    9Fs5z2)Ob"җƳ'WDTBDϴ"'L
    Q8hazb-UwBۄd?E<!`#5衎YΘ;y?MoUb̀L!ղTF=Бfܣ(<t4tx!8jRy<6<JW 0!cbI^yȕKEVJZX~5/Hֲv]k+Zrlhzj]7ˉε5V:יh-2v;0hЃРM0Yy#>1
    e$C,<:]R74Qb8GdCqy U=lbkUtmoUKs`*B'yF`n`JǦxldSx0:f[[}kZSң(0RWS(ok܋t8lm|	l4C-`U)Fw¨ZFXD
    "@xqN]V*Scn0X=yp#]fwV4@*gZɭG|!,e�<`HɔMZ
    vԭ06Pqfzb4�Fq]3Tsc8Ɓ8!81*ڱyb@;Sc$8<<aW0#X<!x[�˘FuMGhjM'7)g(G2BeHD	wB>ź"3A
    MݰX/X1o[b!y<z[8ėmT<ÙNxŗ!}bE?:5qqOxOQ|5+Nԝݛ.hX<g(۟@O}Bf^y(0Ph~|
    Xd-7
    =ةA
    VƘ&&g`尐(-_<�̝*F#szP]E.o/(_>;av;Za~[ݒw?Ag~q0
    gvʗ
    zFz'o
    
    -auNp
    }	zw~ozwvxoWq`wi6;%�W	)n||oGs0
    8'	`|6v&|	6`v@S
    hj
    
    	�
    Іp`
    p 
    t(�P
    
    �}f؈؈lHXqX
    Ҡ
    `
    mhxh
    <	`
    @ϐ�? ȇ`=Xop舶8e)g،xx�
    Xpp�
    h(xH@ԅEOÆ㈌ؐ@樈i
    
    mHXnH
    $~憅q
    x
    6󠉭	 )F
    0y,�
    
    pysX
    Y
    S
    kx,0ٍ0(HjPA#YX戎QnHXh$	r8 ְjxfX8
    H!Ў8I	
    i"mI	
    P
    |ɌM$'3	瘎i8q)ts�q熲
    p
    _$	jiypY
    
    	poxr醡~װ	0	D20YTd
    	`
    0��ְ
    
    �
    ϐ= 0
    `j{ OB
    П?	
    p{
    #R
    
    �
    : 
    ֠
    
    ١pp
    nq
    z㉠
    ʠ
    PJ%yp
    A:`
    -:ɞ *jH p�GRIÐK�!a:p1@z48ji&0	0 
    B+:/0
    
    {	#�`
    5
    `IjW�
    䩧yzY7
    9
    ?
    ٭:ɬJj
    `Zw:2q0
    `У"ꭺʫDzڬ誣
    RZ
    ۚڪ:Pګ@ Äl
    :N	zګ
    ˚1ʍp
    ^P
    P
    jJaY
    P=pC2S4[X
    
    @
    Ȁ
    K=Ɛܐ,dk
    �
    z;	JU
    WsK
    0ea;
    p
    
    ڠ
    xiI@fp2
    b
    `
    k
    h( 
    P˷වE
    [ƫ[
    
    P``
    ȐZ�P;`KƠ
    {0̑*4Eԫ
    5\bqK[
    �]
    P
    hH
    ׀˿;۹PL8:ʀyZH`p;25BۿJ弶з.;XD|ثC
    UL۸R[hѕ
    ܾ4k"Tlc\zֿ6IP
    r	
    0[
    L$@p|Ljp½3<͐
    
    nj<ZlÐ|B
    Ƣ
    ȍ
    QDz츩PlCø
    ۠Ưl
    
    P2;}`
    ll=p‡
    
    	
    tpܺ\Ͱ`@2ߖͬ`P`��l\`m
    \l.]]&ͬ`0pm
    k{P,ytB-(p0`]>=K2]-?
    ŐG`HLaL@]Ь
    LUO]28j3ˀy
    M=E)}ρ
    ;hQTp.
    <
    m=\<ӌ؞M͡mל͟E}I~aszMөܺ@@
    ֠
    &!q֪ۦM46:}ͭm?Юp
    d=ռٝM-8]m
    c-ۮ?
    
    ]_sweBNm=>LLs^J
    "..'?]a-&0.<aMNP!$NA>hIHȾ	H=/U:0Ia*^S7._NBNR^v)>+`cq>Q"9NjK> 	p>^^	n>^~붎ꮞ>^쥮ȮĎ	n~~>>^ɾ^.<
    pWd_$_&(d@V0+/0�d5o6B3C#%_=B?
    �Z�
    �eP
    �AP^e_c_gl�qZ?C0k/do_~0`a}v{t]_/e
    �CA
    [oc_�Q�_ A |oĿ?_
    0 b/_O?گǟ|Oe4 XA	6P%-e0`0d*b/(>c$
    #_QFJ.a~`B8x9r4'^i$MQF}e$lrʁkԯP]pyXlEdׯc;њک&\pUƆˆaea	$Ll+H!_n䨤7;];B'HyI<xjmo琰h%'N'BW}jU h.h-75̚9sՀ	ѹZwy,n-T7N5l46@(c1ŸM4Լ3q9/hI;CQE
    \°E"# !&@b5P.�	P@&^#Tؠ	.
    R!TC
    !:rJX(`�1B��8>Ä0@3O¨
    V8@+:'eN0@ht;`53P,@
    'J
    JM�Iݠ!hpCX2J�#]O
    h%AP^} [0<vQ7lItW
    egh!q,`�I�˷'E/N8݅.
    3U07c&6CyU
    ~JxT7Vh��Ag[FAxJ+ࠧ
    uݮ#b+!D(+vi@8aVdSa1ƜybaY`u^kUW].dI'g
    Hcm#
    R(@
    5̘##fÌ
    `p<hB8"$CtCȼ,B3?Ģ30(@$l@l`0ÈX�w@
    /.$^	'	#7"	ӞD$HC8H@B`F
    	6ڇ# U;B(pA
    @,P@|HU�`>*`_0K
    n!i0�/j@Ula5:k(�ՐGUz#N;kJP
    hpP
    �p%	/UL3�2(@BP�Oar9PK	Ƞ{w4ᬚ@=(-(i3'\	H`7(T&XA ?H6/`;/˙@p U*&
    t(@Ё0)Hv4�:l{ 
    P'#4b/4GCN#7$A	|ʹ80$h	yH`PmP7!j_`=4U
    ؝)hO>*y,q"Q`@_X^0�bU1KgAwUK(b 3+h.5*Q*/Dv�?
    jې6P⚖+& i9T_,6n=r<S&j`eV0;&dE*g@
    6QjЮ$	#<E
    Zl#pWL%\Gpjf0c+k$%|8|/lRY &Jɝd׷.')R\%e�8Pr5D7Ho
    b}iH2	pU2v#`z
    P؀D`i.̈́B@#āx!l`@,l`GOG0לgl�A|/yUctZA|sf=  oHh*Y-L8ԤA
    4�٣=:whl5[5`)Ҁㆋ.qP9Og jQS1m.1>=M8�Bf-YfzFB
    R@فN@@V6[OLآTnB=!�	�pӒ/0'=uOެu .sZyuc@\&0�Ͼ0sp=VnIh*gf ch/�w
    	A
    |IX ]!EEWI\@ѳ&\#D=voV
     ff+'tIkNg~淟h@!SH8Gn-] QceDXB4P!�@E`~$A,KkϟջPL9d#
    P-YX܀T$hlZ>�wS7,X{ CAZzC򳬠:>/ӼX>�?H+̣<
    r1D;< =CAX0PɃi69D@I˾:yA$AEkrˁ!(#ȓ(V@
    Ȼ"2#0&�(&0�HX)$pX$BDC�/x7P=x$?>D<tG�e19D 5`B5 
    *=Qt@XXNį/HDt"<@7+'\\dFZE8뛁QEH`hL$qt%oE5ph<	)�Z&((�Hd4gm\=tfL%)7p</F >1ƈTH#�ȎF|&Ck@,�DH`\c%#@­\dAHzDqL#^DUH\E)JgFXDH/,Itąȇ$X&(Ha|HnDHVCt2Pɤ<j<:k~í$FYG|:K�P-ӀC|E:3��	8τ6h,6Ђ87P3(3X�-p<MM.٬N�,H�L2:Ђ.-.X1,( �/ MN\M$NOOOD\MlشN\�/8.hONtM3P	MΤN-0ЬԂ!@M.MNOלOu�|QP-RL�,`4R&mRMM uQ2�NNaLE
    P6eSe/UN*傐0,45M
    }S"R�]S'57EߜQMMLu)UR-US=UTMUU]UV-*(hUkUS؁ZU^U_W_=Vc=VdMV,Ue}VSeVgVj%(*Vm5`V^Ձ[TU_VaVtp-VVtUVs}WVV)@WfEBW~WW
    XXBX}-X]XmX}X=؄XXX-XHHD،؍؏~E(MYXmن
    YuYUXYYXmYHT�ZZ-Z=ZMZZL�ڥ}ZZZ�hZZZڤOZZ[
    Z]۫uZ}ۥ-[ۧZZ[۵TpZp脠UmOxx(�|ņ|Ѕ�(xxO�]ȇm��{pL8
    %
    �jx�\=ڦՅw[Xl[[MZNh\_0l
    Z_8ި}ެ]%ZO[x[z�P]{\]_[=Zܭ^K8\uߩZ]U^%Z-^%lP�f]_mߢ=\zp\-ZOH^
    bb^]m^
    ZO@m\%
    �aɥZjFvxePe�f�eaavfPX�`�YnaF`SxbU[cMPZmOPbLP[[pkP[UV@THT`jPiPcn]X�c<� ] ZX�؅M
    L` �:@ބ]XH`:>4�UcbeN^ YHcL^\v@eO;HUSZKe]T9ZJtx@�>c
    daN�O0SƄK�%N�XPaNhXZOUS8Pe=f8cU]enfnVeaFuXu0c8T�
    �`�LfLMJW]yv>ZEDބXdegwfgcg. :ajWHQ&΄L��`��fd`Mh]Eڦ}MNf]v_OZ$քj"~ƄSHp6FPMe
    ZfaH�
    �S0$%}ɕkքg6lv1mZOP�t-\^�b^\(^H^thg�~Hk@V[kH~phmZM؃d{Ӗ^HL@b㶆L[xVζlb�bblr@`NЇWh~�؃cmiNN_�vn%.monqmZ~_aaEPQP�fPڰi\HrV|nNXH:l΄.lnȆb ZoNmpxNYnΆ`@x@pgpObMoh(SkehOZhq~�(Y@DigPHWȇ_Swsa fhrXro=o(a>^n3gntN�xh[/}��knFkW=8c(V]%u[�bg_�_v]~s $O@b �hlZhiqeTwa8e%.ivZtgPgZvo_h}fmvSmfo_c8xq'wofp�}0xwJf}a} ujOhpxwpuw!v%nwv!uqYwi�X`tmWx9iq>?u#6yWywq^1�w`&t�N8ps$|?in�{zwwyWw?k`wxfa8?=Gv[ԗu~ui@�ȄFug_Xo^d%gjN fO{xlo|vZShkxNbMHT(|�je|ovvpwGY؇pwwXvցn`�ʆ=WB^nqR,@�e1]�؂
    (p'R	Wc1Ҭi&N$(&TFG1)ԝ=W._ö+X
    kYL<K:eȑ[2t\jaBb7v\”I]߿ѦԮUf#8KD/C-[4
    ܌Uk�"NxS'E-<(-v.iגSɓSv^}	S+1Řl۶U;ʛ4n֝oX&|zIyKdR^�+O>\S
    Ui#>x&\sMn@
    ,iӇ!>0xs
    ? 5:(@p	3{BƠ{;dۂU1|c|�0e\�ż
    7h5l$*S4rp3Ma6޼U6pL6F�1lnLlj3&RI&TNNZ4eVa�ݬˆezX�6*5ɔTyМ0 ec6q*T*y	2ؘcswHΏ'>cMjWUBX6a2٠#?K:$$]
    {dme)Tse9'''6<P(p#W_w'*`	*a/`r-#cr<)ccTs!c$39,K��,43&|q7?4MDlu�"JIJb%#1auIZ'	&bJu" 63pL+)x�b$c݋,.Rt{-TXJikI''Nt/*,Aj(/=ԥXpCw'	.D3Unwcc4ӵn	;\qύ¯N}T#%wQԢK_
    Ƿ
    k^)F/KXni6Y[L'?Au{�pqyˡ`}yC{J&1e|Pha_(c>	x 
    -xX$.c(!NhA1yE9
    NJabx0B�f<#Ө5n|#GQF7#8
    N䱏~#5q<$"RB\##)I5⎓d@rrz%MR�>J=j+M]b]LeLagH,nLsT3Bij,<AȜ�ŭ+R\E7kf�9r3BW
    >"Or,LSJq4D7(Z0ꝃO:5Vh9{fNgj,hJPD46QNkPTj8QIR46RST'$(FYմ]3XN#49Q�l`d8a.8Ʊ�mAZ "S1zW'D2s#13ؤs'bS	fi4@=-IX+V0r5E
    g%8ȱWT4XjWdh{tBkp&
    :*u'_q.N�+QC
    jRx`$kii`>AC.X5qyh@HqS-#j_++UhbD!S(:^3\8V<E4`C�7_�CN�<3N,x''
    -*XOF6ޡM#@^r']"Ƹh��dc5/
    _0A9)$/h2M"-2y,6xlcL3ь҇|e&&�-w9lrfӱh?36�k"(4AIlˎL|PD^xg&FyaNcVYh
    K540} 遏��1
    Ic@s}qjXtDh>P(Yui<`Z~W`llr8�B�ȸ\_QgG6�n圴z7?�Z#ue%F,,.ArBd8E1vIFhp̕C/xqpL#GwnF	 ilbWXēN &:m!=XD?zx+$E>Px}WȬ#؄od	nx\X~Wmm6ģCjoi<U/F7(S(5a`_]dpxcЗ=W_ig{QV|$}2'80waȨ}>I\PmC7tCoY
    M7
    rUQ_-˙W*t_C9@	&`5<e\h!;؂'E#FxC7-Ƕ!Cnܐ@C[J(tC,L$I|•}e<(ىUI(^X,$'p*F5Eƚ/;l[;=x&mUC;,
    0,B+p=,$_+L	@B=샆!X.ĵa b�_a^nV%Z"&ʡ#*F^#V&^,bؖ&B-\Ca1U%:$+Ƣ!&"L5Ι5`ŒN\B)NX]!b�Ǽi%hR2ID&@M\a^ˮ&<&I.u.#jlbܗ
    31|‘3^n[#$^Dh&om$BMM+B{5) y(&(Cݭ7dD5dHöa-2$aiVi@:8B/LV`QbWeS6&6`P5N]
    ]2xW%:&X2C4D3lbfITHV&!Yd@&4B܉Gw8h'F$@C,`8CfaC?"rBtfrLq&ȸe+r7elbwb1dVq~8@|"'1C�C7&rw%M=HC[Ч}g:*Et'7{ZʧqCE'Ч{v‚|�},}'CȘg<4P(7\"g/&x>4h<+pBz.<4€1@(2'8\0(΍
    i�CB2`iA8W0'>i¨/ȩ9^=CfÜB-/Ó<ُh:@甊h::,Cjif:xB2]b&)j¨{f4[<ԃ84j[C-.艥f00ꁪ(Z)>HH<h)rfʇ|:e,A;6VqvJ'␧5W"&T6tRDިh׹Fy+Qbr\6d?['X37\C6lH"#(d&L,V^,fn,R&,vȎ,ɖnB.B,~lȲlł',֬lJ
    ,,l.&�-ZbB#.f)&"f)L-l~Ɔm~*Bhڮ-۶۾-ƭܮ)-m't'-jMnz.&.ڂ.2.Fn䂂)XnnzBmVnrm▮-.(-ݫ.f25,t-2F/X/.	/8or0&i6<+ÿ9fo�lC)>/8Zo�x/Jo /M7D^Pr}^:mM:0MY`0u/7op7#.0s%/Nj0u
    
    p+S
    oC}߄;Dn'4NoC7L@
    ܐ&}.Bu+X.5:4x)$-�:̂,7-yqz.r�B~C"D'+X
    bD(>7qD3@C+DLMd�XIMԱ/~&3XmɂS\_&B<B*ЂS,x'Bx0k&)*s/Ǔ�k6�̈́.ÂɈ7q'B.r�4#2'B&7/	=-'+b<{+8>zu\G,,1;*l9b?h:b1c9wBR5H6b(/�&rrj%BA8ttB<c-t.ӏB3;DK4:%ǂ6BPS==&sCa*gs1BCk5F*K):t5ނ)&,4P&u+Hr�&Pxl/h	[E-lyf
    91t	=d^Cc?a5]v6Ta#6ٝ^mgۄf;6j5pYmMd>l7dC8L18'DoC*`+ÔU9Cw\a	1�5x*1Ctrc=<0PF046(7bpwUCH�9G;}7@0ÿ5)k%F�1s]7`7Cwl7uv[_0@éi
    tKo$2<!2�\93%z')sϕ0C9(F~w-CAC/bNXGWu7><J,#Tyv918,>.#Bx)B8l>`B0w$lMmBovp/q7rr&%LӼj&L>02uРm!H<C.rnZ4 c+h4.`_r
    *^¶$,D3܃n^[rMC4t8M>1fieڶ'*In''З;Ԃ'$x0C5dB@\{Ӵ=³'UeB5TX n;C3;Ad;Ѓ"tI*Boſ:ثn;=;0_G{[{�|%h;}mj-H<;J;,"L*,B[1HS?mBRf_<:N2{Wݶ[`T'4<#zrsNd<$*d9$ÿ&0 6�$"÷޷F|-@j18jw<!N:O0x8q5"gbIZ/C6PH;7<BUL?s>\C7XA7x{&nZS!k@\6]B~E?G#ZhB>$~ʗ_G>f1,7>
    C&4c\2S?g
    DaÔ``(P6dZ7Ʀq6آo!Tx{nGpOdiq,hPC
    )�nncZjԡG_d׭3[9(Z\jZqulTMB)]*kd9S.Y`,,8a1	�f-TTWʩI(ŔI#&JU>+7m+O5r嵭
    oe̙jd7x=#iZ.+g+m^k
    $�*d k8Vfh:TZ%_~x)L
    Pq0�mP?U8VnXi�J<1E
    B*C(}z\P�Lp wZQA�kbti=u>qGu$|ˉA!,h	`M2QשƁld2sxye;bl2Ж1'{PPbrKF_p=>ɸ5CG!)LQLR8O2ůiYh
    f6&0dmi%�d΁oA&V6iR%b-[n|\C%i5&bZU[Y\qWq7w^s�%X`W^LM1fUȘ4AVat1	G_V^ucz	�[YY
    /1MYU	o6_yp	�8obaeÁ؛[^5Ihs)3:l	l}+䕅FiYt.�2nZgⷳuSae:�b.!vA^^6ěZ�߄"8XZ:(Oخjom[?W[rtS�P~,XvґeoLge(b`^ya|ץO_j.~japiVHfw�c+Tg+B(XA^9XPbIXB!
    )
    N1iHOb0a
    o0E(XDЈ#^Ot„=a	NpD"i(E.rЋI�P1
    MiTF7i"G;y8: 	GM(䏅T!AHE>R#)F?V{d#3;^ғd(8Lj@Vo,(@ZɖJt.YrG&\	LaY&	b.9<dD77yG88tf5LgG9/#8Pbp@JD39L]S(莆ы
    P�;=	^샚(<Q�胤ڨwMr-@-7l< 0aN4(
    uC2zVPL_2ӡL0*-(xS�,!4(
    $ÁdMc&ʊM&U.yau	@
    z.2Td\a]-�Uq|9WCG8\^b
    LpȨhNgDiK(HGg1rHq$ݺD{ 8nMqeK[Ԫ%MuXhI-ʚ\z[
    cHhV&IX6�Ț`YUx=+Bζ+�
    :*n|1ymg{ִ];_xHKAڝk`-&8%p+\�vi}~@=L��$-f .Ihqmo]dXtTK4oV]?B24<;D[3ypC=>u.'֡O#V+!Px@)\{E4ZYL*qi+ci\9ft0jžIY;-�֘F/dchuS_4FOYhh͆&^mOo=^WƃE/K{'68;J(a	E2CԠ4r'H6ԑw;[28X4lxjX9aa\mxE u@oatc1dAkE4~K;ߦ*Pp]Tİ׍L^"p(6ԊG8 (wKf
    pl㮆?BAS@ ^F7ʢ
    6qCfD*[	Kȥ#g<1v/~#YDAG>
    c`bIÒ}U#~bVZFFc}F+(�bAaK
    "oF|�p<ξ BH"N".bFPAb�O /|CXB\8p|YL6!F#`0�2V,^t#x%jP*Aޡ!dUT΃|&.Xa~!:jҺszPބ>TXݴk$�Q!
    
    cAh!&%@f�JH8~!kp}ON�<6!=$A$q<Af%QKeq9\NC'QBi'1I"ADM	ISo
    Wa09A>d̈́{İ%pPA!L!n%j
    z2&b!AZ8(!ra'^:B	2�r"'o[x8qJ+6Ē'ڏ@d!t)03.aa(/aX[PS5k` au|03o1a.a-|aa!.r:Kar0'*2w[3,Dz8s5P6iar"l+!2-S9n6!#0!20S&d#s,9}L%JVA(oȁ-;OXD\0A4`4CdhEY.hRT}F\CmtF_|IG�W0DC4>hD++DIutIeA!~JAT!IQ
    dFyIșdTE.II:MtKbAKbJCL8AD۩N2bD]L!F5LTP*FEG5fQU4U48<LUTKGKdP:aDb5KXmO-T15STE2J=tX>AE'2(KIE1U!ġTTI4ZS^DiTUCaAB_uX`al
    `ˇr4(&D{�BVdGdKdOeSVd@֌2aTVfgfkfovfYeq6d%igyhVh6dJghiiEV�NajGVg6g9!4d>ajiikv@@!lQjvhmSnhUi`	/cV7Vo`oY)aYka6ppapoc)O2.j4|\rqr1Wts;F�r x!Dt]BrCX4ςb!(Z"K"ʦ{t@w6t#ww7\a<8O(zs`rs+d{wb!xςt/qvkjI+pG,{{kw(pwx'(*^Lwy"uwvivԩ~ׇ*�u)dWD^W
    J% !&fC,6i2�gF 8V!:/@Ӿ"Ʀ~%(~n+ĀBRowEQ(Ԭ08r3!A(,7/AԘV"L`j}_+!K(xYw
    *OT!ΐϋ,(%NL%)>
    8Q5XI{b04r&HVJx+BP[_<#v9a|J!BaxA9KA!ݎ!ࡻP!8Av!Z�(OxҡA꡻^AԙDá:A𡻸ٛ'"[!�ay)-+ZEyê`៨-�!!zY95-xq,p1ƎLU:
    C9$S%6:!AaE%�:>Gz:Z$z8a[`ZiڦqAq:ǺoQAYp�~JWnE]P]$WYXj0E2Z]alL!fm氕A8`ײҁp}aZ<fĻSq`@Zv0�$1ᄍ[h!图2=O| pwZ zA
    )=@5! Go72:)0ax!PubϿGC![S|Ł|P_2P!-8)=[vd%e%H)�A}䅦˾|$	|*�40!v8<a$r3[1y+K)
    ځ$<õJ/8j|+pYխA틸LJaLX?-.<6PEXE-Y*A]>]S`K=O=I	\s%PڱG=A":ס`!A]jagJ՜0cA!"Gh#ȡ2&Z!x?4>_AtA+b>A#%FqvbL4R@a]
    R["EB'(J!R,%˼A_S{c\fc/]~{
    "V\	 =%LAoJx꥞]]k{`ԋ\_Pa<)tj!]b4u|B#x!R)!Cgwu_jv{¬\7r4d6(4$.|8A/|pf6H�b[_l^kV�ݲqnYPx60W
     -@8i<yrP .|J
    
    <S81[=x:,XJiX"y*ԩTZ5'LA
    k=jw20|0I]6\|R /xni
    Œ$=={KV=]fu.0lNE5rH&Qr2JW6t'&k#f͜=irU݀:.apJc_;zREf?vy``~(~
    >!yE_y([:`~!cN`&VቮbU,BX"pBc6ވc:c62="*	F"dN>	8nV^e>nJ(Aj	f\zf6nBjhɚO%rdxbI<)&R'h.h>hB'Z饚niHiJj�j
    +J֊+":j6z믞*,*�*`>ˬNK\/Vkյ^ᶌImK!6"X}2	C&O3R5,hB[TϨC&ko�T;/Vڍs:6,{xN	2,\%%OEʍ5 [2zI+So�c:b̎?oKUfp!g,$U(UT-U}-sV\UW5oSui[TRSe-	~SI'818_,lTRJJ|"/H:HH,%8?y�ĀNZ��	dc<r/1@#drJ,'<&T#[<>\�^b{HkbzS5|sXj@pB8G+?bHIv;0
    y/t`aQ05Q/XG� y�	K(
    H=aY)G,LG?@@(䁑>O'эⓊ-4A�" cMTЉT-8]a#S=P,,T&E0Cu,Ә5kS1"NQ-G-\ѰqR!Od`e'1
    d@D- W"RA.1??C^%
    �(|xc@v8G#`Ldn
    JH	l\ :sG4`
    i(2i
    o>e\P;afԠ2(
    d�Ȇ4_hEl9:t$7un(4�'E.#FJя^`i;юt"YFCR*C^E&\Oy)G/α	:ԅT)/LR>T>mA>pTȩ?ڻEAP'HѩNմT1̱u;BMT�(AH@{Ss;i`�`U[W*Zg&DDcVl9!�cJQj?r!Y+)psr+,q	^A,TV.�.ڡ-[,@zqܣ`9LS*<�spYS3aXu?+HzPM-~ʇZ4aOppYFCf1f~pდ1GuoFON*~?1�(L#e7BxDj4 h5l3{#Dp)xONx1Gk FV&Dׂ29/CzS4IaS#YҔZ&!="&qiM0潗KdBNhdF/[ЭnBK& V*Ha
    Gˤ	:[x0C_͘7@AGi<U558K
    XtaiT
    ^/v`Cؿ?:±Y>f-9;Dsg@1+a}e`Ê#Ԝ|l޺qTx̄9q}:Al85^	ڳFyַތX*VKj|uvx4[	oNif3Y|D-aYD9l
    [Ģ8AT]ľ(x.!:=$ F3`r4\\r�40Q՗4xыo@<A7;0
    W(M/�}zP}A{/*Trfp߷a�wܰ'g4ط-Q@P|{
    @
    BtaPC
    M7tVz$C
    
    @/�ІW]uH q	8؀~	u,�	YVׅ_cXgsU?q	Pj=	G'|	@{	Qئ	 0
    
    А
    d@F0
    h
    �HF`RSьx�P
    �茾p
    �
    �
    
    Ҹ	
    @LHȍp
    ?
    p
    X騌8	
    hȐ
    CPr戎HF:PH@<r(iI브.	P
    p~豓hֈiD 	 IP
    p縔B57Icڡ
    ـN
    р
    
     
    ?9>?h;InAfɍ`0)3Y'	[ɔrT
    _cYy)rI@1(x77ra
    	Ґ0c,9ɚYd6e.Y-92G-/y5R
    ɜ	)ӹ)�I	�ٙ	Ii牞i㙞꩝	))C
    Ip
    Iy*0zɞى*ѹJjɟ꟡<t$#J%j')"	+
    1*3J5Z-6;ʣ=*	?AD#		I$O*3jC:WQ<Z[]*	20(XuX0fzj٦oˢ0i"�"a~.pcknz(Xn!Vj	՛- )ҧS.Dh]
    	0c+� 	@:<`p 2j8:
    Cb
    EP⊟pYQI!HJPiPa�p
    45!�	j�ڛѰ0
    а
    P4Z:5BCZV`	UQzWڪ.k+Y({`TZH KR@ʆGB*y
    `8p
    ,td		W
    
     h`ZkA f15b_chv@mS!0`3rΐ�
    /	f^P 	�@S!W)5Gb0TQVcR
    	{Ƞ4ǻ	{V`) {Yk,E2ݰ
    s{V�
    h
    Pg!K {TuF?aмGBuJ!˸	koH#qȹF;ck{;K
    XA\|\In`_f׵R
    "H
    w8	ywC #0p€` °_ŵ`
    
    sUw/`)
    @ 
    Ҡ
    p	P
    ~09
    o{Ptl �W
    #а:dۚǰ	>p	>PR_
    d
    ;@9!Ȭ̵�
    Eʨ�p	̲M0 <L-{Vȃ4W	 ꫿j`xl ,ܦ�@
    <͗@ɰ>`
    W
    p̨!lڬɜΟL?d
    Ȏ@!-L&h(,Ḭ)eV
    @p7E#\, uACp1^ClP.'A�ް]		QAvٶ͐
    c
    `{ a:	0L3rπ�ggT	p
    g	}r4R]{qv3ڐkYt6-0/'
    qWtgsIh@
    	 p	Ɛ2"IѰN	v"fW 
     h
    /i)a�bpi\!7tm]sMS.dN؜4
    @ux	0	&R y	0Wܳ W
    Uq	/+X	
    4bC
    	JFD	C	ǐ
    i[S w>dnVۚ0[MsGRAmNS:~jCܱhTZxmvut?$9'kn	p0�G'axѝWFvd0pE蕓p�rLznxY7I 
    PxѰ
    �l	3!H	JLtX�0M0ML0Mﬓm`
    	/wop%
    @'A0zpaNᠷ~	'	̴	c!n S*	�
    :9q0T0V|Ġ�Pn4QO(.�Yd"yOC
    tRNYа}ÀCLNETVKj>OrO`z5O0IT!_&?r?ZP
    @3כ�`
    s
    ^`
    
    	P^�AR��ujSK	n:D0	)AI	|8D7$x#uBJӥK$]J
    F)ǁ6iq!(L>
    b'i⤉L8q
    SRD&5P!K@pԄ7)x7
    ӦCAFEX1AO.	(bYJr8rŝ4d5n)iQzF
    U�&SMp&SҔKL4mYXv5vjO@O.e}_	%I"mGkS)Z$J߳$Xä@Xc@HB'<
    ڐ&
    /A	ip7DP6+T1EET	ELC2S)	DȁlKC^d2A"3L1o(DsϜ+$lN0J;!B�ZiŢBı:q&w̲H-rBA!\tM?0I*uOH32U7ðTCn5W]wW_6Ql
    X`=[UYguXhwœi6[m{-k[ou[qq5%qϽUmGsm6t^`յ7[y{IA=F8VaFLsnbV`3Xb?6S`x<V8@a*�M`b2[S,f	%1 q֙	z0kz!7~Jc+eQJy
    ]:�QEЦ�6"O8	ŘcdW0{iQ~*T&h5\LQF(l~ʖ+g<'{)\sן\ԣ3\i'=O�f�hY�AFp&hlf	g	O{i>I>kP+<?L|b#iH EP#0�2 ""m! X@d.0D&>#@!]0D/ CD@2>XAxlBp	gЂ.,,hTCwlbaȜSv Є>]Bd-olgS@p`+,a$~ӝ2̑#:@
    d#F$.bfaa(P1<sA
    dU]FHerT@G"S$7Ic7=x&90mb-%sG(ӱZ(`Mlr#Nxf(2NE4ъc3H;Ax@;9PD	wl GeB؄Gǁ	FbE6rÎ'b`c,('SFN@<8OpiJ	
    0YTPl#i�MPՎ6S
    A;rsN2tO:0lAPK<60ұŃp0~ወeٞO@k'�F#G2WPEኖrb؄(j5�\0v+Vk@s5.=	ζtMKpks:r,cwBiQ>) $
    �<@n02ZѾ�\cG4ъG{ǂi`Jx2QmP<"np'vBcx>.XC>67bF.DtN{�R'`bdˋE�8a(xf:y' 'k0&/y^^b?vYs7-OW>X,2iPBǍ
    �AmyIe)GV딩(ųyg?s$xsf4/	T9{ukm`kВ޳yY_;&2}xsX[V}2Chglr/AkDxR&>!@Nd_;PQy
    DxhB�1ɔu@)RiH(_=*CH>.QiX:ԊFVr̍tjۆh~EmcO0b9tS''=;+Ub-rAF48ĉc)0Q&@�cC@]
    CxL}0]z0q&~	H_1݁й1w|.=Չ'֪\V=V06'M35N`/:8yfh:PQ:EΟK_sb}i>?ga0�ppwȄ\>i�z:*RLt0AaM=he@
    @A!aPJ:='lC~�yQ=0"?@63TPM#Lg10.3=.@Ģ-2D.cRC죆\85.H*�_<gXw '܇^dTA'lj|BB\&|B),Q:B6tCHIԿJL- @V,&tBi)A:LkMRFi脗�Yukykr{piZpuqTo$u,'=[z
    5ǀy/j<z"LV܅
    tJ8_Z3ȉ�lPHN�hGx@uHNjpIƎl!pi=pZ\Hd.bǢ,'hh"J<)ɍ¢<Jr�H�i[ZOȄYvizhK$u>DcLxlbZpLHlđyvLZXLZxwwľ~@F\ʦ<HJqv Kl!\˶"LLMI֊MhrB]@H-Xȇ+~ԉFLȝHZ|,iDK<[/x\-L
    (KEɯp	
    PRh%Q
    -QMeuQQ	RQ=BQQ!ER	=$"uR
    js+,-./RT�1R1%3S3E5ES5e,u79:R+<
    8>M>@SA%T6+BU0D]=}/=TBES�;����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000151�00000000000�011562� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/manual/images/chapters/appenders/appenderClassDiagram.jpg������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/manual/images/chapters/appenders/appenderClassDiagram0000644�0001750�0001750�00000213037�11377016712�033610� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������JFIF�������C�
    
    
    
    
    �C		
    
    �T"������������	
    ����}�!1AQa"q2#BR$3br	
    %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz��������	
    ���w�!1AQaq"2B	#3Rbr
    $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz���?�S(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(> Agg^ɫkiCvӗf7��	_ſ|��*_OUf9':rVTJtm6rf5?+�B/��U[�Y�򪻺+7\Կ�'%�E_w"/�;UWwA8c�j_}�"/�;UQ�	_ſ|��*uaƕwxxiP؃Ol/l]%%07Ooe+OMnl$mzICDV�~ven߂{ywj_}�䎇"/�;UQ�	_ſ|��*�i+=[P[[_`t
    NT>R豜cx<WZ^ׄs2j]o($4nVRՙi~c7htߓ'M󷮛�	_ſ|��*���Uh}sPij𧉖soA,Km+2!T^X]ڧ@'nu[-wOӞZѧ*2y}I#%pMfY_D:*ߺ_|�	_ſ|��*���UizeNj'xVT2Z-ƨdI.Xid+j.kMS<E}@ndjĒ2740K6o&S[�Q�[X���TWo_�gw�ʪvR
    3XJ5dOwqY2N2@\{uNcv{oi-ŵ夫,3tu$2Ak7㢮/9�Ϩ�?"/�;UQ�	_ſ|��*c߂�!R�K�$p[�Y�J-�Ћ,�U]lc?_Կ�>"Cx{K>QI4bMB)0	͸r1^^]O8ث�+kkpg_
    �3­mz>{Q]QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE+�/ �ҽ<W�'_|A�z5wuq?Z_¥�Q^1QEZ|1дI]&)MFLVړ2!Kw܍⿀?B/|<Ů?&4$4O7"rhw܍R_;o4MsVҾOimc}j\"ϪΒ0sۅUQIj-봾a+JI]]E}iM6A./Fկ'5عP}M`.I-~K%O#xE-+πfkkyk7B!"D9#c~3~)ϳUf(R&W]%P<?ڟU�??`|F4-,�D.u!F�	B$,&&+O/Uk}Ek1sZ?f| px{W-lkC"yi;183Fog÷n׵{Xb9䆎gmjRF�|_ڏ.ž.+Mb:.o[[oc1iNHVBV
    5ړt7<'6}Qab#h7U}'2[hHپ-vnė~5TGfN}ZG$H̖SƶF"A zmO{k!cHcNMŴj!!yR6@,g$ws?~EKP7tk:+Ajn$kXU4jCR>%A/n<U'^1AIlD6e"5	̬2ZN-I-/})et~mmF=_%&OE-axSSkVz-ܥ}ۼmvBpp5h6n0m�ZZv很k
    (aEP	O8ث�+kk˼)�'|?�zz~�lg~Q�PQE!EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP|W|:/öxk_.kbi
    ֐H!XV4O*^�†�U�_^]֩gcqgoswmEV3@NXFlp=G%B<[v{4Լ�H$�(m??	?x/�
    O9]N?k>.bo٢U*KXp	c$\4�
    h:܋=3Oᔰ$R��{WJA(K�_H$�(m??	?x/�
    O9]|Ixn\/QKY2o2)@#�֕
    (4y	O_ο~R_6riT�
    �E\LI+V5.@3RRt��"x~"�<Q+u5@�i0Gv4Sj|<	87zjk:�	|빈2w`|+�{ftm`OkluM%gW"Y	es«07|ךek2,։{J[�c'e|jE7$eoD}%�H$�(m??	?x/�
    O9^Es�#��"y4O*^�†�Q�
    #��rʰD9ڈ1މ/h]]u!u#R ڄ.-dA$L"!Ākm�IϰW�/G�?	?x/�
    O9G4O*^�†�WS6ο~R_6riT�
    �=^	FU.\eW�Ha)+r
    
    M<#x9լ;"*PapHsNk~;}b�+��"r_?	?x/�
    O9G4O*^�†�WK>l??	'|(|{ڇu/Vk@Y֮Fz׵חxSN'_*�J+�sˎvQEzQE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�yw�|�b?F?/5'tMQ-$Ŧ'."bGgwU!@<!W�a8�ث+ѫIxv_KZ4x*G:nt<p5
    rY~)^Y$\d?ڐ'mA,F0c~
    x}7X[?~4x56lwYVm*8PTV]?utKSQRG1ռ?;i;;OͥiK:}-1
    $R5Gr{)u/tEjmcI+/HjŲO<o #*cktZs_Oǿ(_un>7쩯Zً=c~*ZMMvǥk-J[6E{r"lrgy4Oۯ{?8MJZ{K贞DQdNfd52Tmo򶝮o{��ZR Դ/	mcjYfNP3B,)VeȐ{MkWOGuK}>OJg
    *]-F
    X'sTJkmv_]87ͭ|
    j�%/lu?Hև--.al4+4Y8N2"Ii%(MDŽOq{vVMdYfu@0"5uj{Oie�	A(Vok2slvZO	Xq}Fc>t5&)$m2J>xb/?�[xBk5:ڄ ٵ@ˣ>@J}SEbeV�ҭs=ʴ}S>|J?/omscw-1JmyO
    kz/_ONYٹ R.eKy
    ̊吱hc_WQIb&)o]ӭʏo/w>3a`C~_(^;nlki&]ʈmx3/Q~�_<jStK+;p)cr# һ**gV<K_ˢ3mQEhp��ҽfFŸq>:�W�Wר_?%Q^QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�xxw_x_;a'V&i4b:OhH$�(m?zb:vю&'U][W߹?	?x/�
    O9G4O*^�†�W\�|??	'H$�(m??	?x/�
    O9^E��O$�I�EKP?~R_6rn?#�??!��%�ȞI�
    #��H$�(m?z`G~~C��K�<G'/�Ci�(�I�EKPQ=DR
    41SFvn1iI
    
    U/m�Y"	[QQn
    G}y'4O*^�†�Q�
    #��tV���K�<G'/�Ci�(�I�EKP(?�#��"y'4O*^�†�Q�
    #��tQoG�/DOiT�
    �G'/�Ci�+?��_
    <mwK~ {&;AuBѱe8tQ_Ej1{UUsYY-K(9((((((((((((((((((((((((((((((((((((((1�~]_mE{mM
    	ׇ|_k>vi:]ܚjX	Q@$lMH+iǖCDQv:0Oo[m~	wgំ:gu3aOzvn#TFŷ4I&ŚF,XNoN�S-ԐEtI\[orWs7V$9tVVoŷ)_*I?Y܋E)o6|vkz?tUK]'[pgG%EDGvi^lS5o>.QEQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@vJ<5yv[iv98lev4'ớı蚤vVj-Oh8lezꕻ5N�_@*(((((((((((((((((((((((((((((((((((((�|�_oj
    #}w6{
    IfcfwfbI$I5�7|$�['?wt$&>J}:�nI�DOZ񺥬)&TվxK,iootK(a5gwdTI'J^~
    um
    c0D@5<﹄15$G7SN`gyJB=/OiH/>ur9�᛾-_֟n*&+mQKk65wDX74bc>\6Hͧh>,O@~5;]kX/6Kse61Y,uM$݊z]-Nhq-.i]_h]zV;cfK|��'�=i�|Is7'6麗۵/
    ^Z]tkqp	(|'�(&l|A?^~a隮�l>{)LM.&ܩ
    kWSMW&{ry-iZKn;ںu[-!('¿|xSiy�;$X|G tό&xMj3I%cԗF65j>2ynٍmIo?
    wNl>"iffךL6Z;b[k(*;dI$V$=U᜚\yKMwJ8D7K{�7|$�['?	?/�	O7_$j>M+*x_WơkcAndqʫ_9f,Mq"?hSZֽ7HK|.Mdօl`\<SCxK_/Ӛ�O(;+{_W^%WJ-/]5;75.Qc,UT&6*ApsZ	?/�	O7_|A־+GR#=tUeM<Fo
    <;&~l|o?HtX4PԟSYx.cd\RCHEr<#M'>cϥG<ʿ+f?�>i6z>/LL_E}ϲ$p܊	~�W§
    lj틢/Oi8D;7#v1_|bďR=64XZhF4&!r x/zdߴu=巍Tæ^n�`*#nosۼ;1USWjʵY;jZRmNZ-=O�᛾-_֟nfK|��>1IgǺnWRB#y,ރms�>8x^>:5ټj�wSO|̻G0YN||$/ib2/{wܿm~�7|$�['?	?/�	O7_]h3};}
    fxov7vȾ,W7FEmFUCm
    9+:5]&O{nn,fծF
    .#/y%aL<2j
    oiz8/K^35[kwh_ß>~/T{&x!йE$*2`$WI/I>x&8goـu$uWsß
    ixZ6>Le%ŵžѲnn)ȭּ9-hNE�߇2k1]7
    
    $x,q49`L7,yNY6m-Ѵqu]Gk̢}^=~$j3i>mt[m2T oe1O"/fK|��?x3UӼkZnU2C7r4w4FR�a}VxZ
    ņw^om;iKETXz3lM�$]6_xL._hfݬ3wO%�z��o��u}�	3T<]5Ϋ}W\�p۾vG#CȘd۟lu-3>,m)u_JLHWF@Hz%j9ﭭ=6z٧Ա�괺?fK|��'�=i�hiw5#~?>F#PFZVr"*A+OGMK^_a6R_.P&!EW՞HQE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE?Ҿ|7Nsm6kokYmcڲ:pJ${�?�!7ɻ|-�WJ�Hvo׉C^}STY,s@O&އeC{_3�@�3�@�U_xC|Kh_o,4Xg ?ڞM۫W6�(y0hV�tRQEsv|ݠɷn6S(^7N|;/�^R�x�]o��x�]o�_:+w#k[uFe!@Ā7c$K??־D|+n6kRkVg49&/moҗ���%�ȜK&}=
    Vm:/bcmp4{8e<֧/�3ƟB[VL>&1#
    vKj`}v2�5k_=Z.kRizW3dh%2s$%+%輪w_E.O�x�]o��x�]o�C}BM6_%[;l;2[+d)ds_l'~>oVi!>y:}Em-U
    #earrQ*N-E_fA*f�%�Ȝ/�3ƟBG/�3ƟB]|^/ЧH:Hn2%aSDeܣ m8-;4&m"xR}]J-n٭PѴ'!FzTrW5�J3�@�3�@�T�ho	.zS~Mfm5=˽R7ȎC84Oh,ou6IRʬ'vr#Fmj<.�	ܯ�^_ӿC߆O!uC߆O!uCOhptV[y2~T/#mC|;p-hojznjX4Jҍp~v*ʪͅ2ʹ_o/5]�K�9}
    E?Qyv_E@C{Xϊvoh6dAa<-,X,I$u$֦%<	kFޢtN)Ӥh"f2Qx"0yǢSi'$]͇\}�_~�g?�_~�g?�>l??	'<i�.�t<i�.�uQl??	'<i�.�t<i�.�uQl??	'<i�.�t<i�.�uQl??	'<i�.�t<i�.�uQl??	'Ͽ6x{U"
    ;5φ(Q|AfIj1
    $3_LW~?nUZܵ-
    |eH +$(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�gJ[
    !5XXlDar	h
    'AԼ=74_1%N>qxy	;s*BΌ'~-֍h>ҝ_Ɲhmb
    >6'Ē�ם|6Ix[֯.{=:(dxCʢ+-.Y%p98HߘU;j�7oGW/�Xht_XgwxK.$#RY!B^ݹ	!S럳<C?"Ğ Pl�٦G2QjnpǙֿ߈5
    !ҾA6kZ_k2B=3o{MalgQ7Gs	nou]>OΡ$IvuRUi1
    K
    N'ֿ_K{�#w.V{P𦟣nm{s$٥k)X*K�f/~/dzA]3:ir@g
    M+cO^�e%gIXiq-]5џRtVyLRS:FC1%F/?+>-Y<3km/Utˍr_o"uj>3>9_ 	%ܩ])ٵͫ߾ZY._3fgiz0^Mu{[n$I##0`9=|C�*
    [[C^xwGm:wmBs%M4mk�sk󢼛K;u 78mCC<U|R|-mxR]<- d=G{YaE
    꺏]Kg}oXIKz;7Ԥ{iQ<[CHF1n<뿺VфRmF�&}sG?~"ڣkeBl<oU>6Ϻ~#\}SFGҮ|ixp",n˃6vCŸkxg;PKolI%ݝF�xlj d
    Yպ񵦂W=%:ѰeY"kV!<ada<rܫM^gC_vV5<e8]xPšԭ|;闫D%{lp#\go?5?L(nndY.¦]UV#l?:SӼ3j^
    Vp5,kp*:!W]mxG7oX/.a{hW&tO*9h1FmN<饯>{KMd�rMoT>x>x t(xJ/t-ubiU!j_<	-Zg]jF3&cs{t"ECt -X5n42�QyHHyg�H[?.�kk6A4Hu{gɒ=)'Ky?,[<'1*Dj%}Zu�ɛvM.NZcOWZk=v+x|=*uٱc,׶":6yىk[|_(fOK|7Y6IHvois%
     %|f@L^>ᗏ%yN]j}kAjLi#o+h+fU@I2NIQEMz[hmJ�>|#񟂵�	&o]ž5M}[V["xa,a7l{W-J/?Ŷ�JͿk~EVC
    (
    (
    (
    (<�v�b�׭ג~?nUZJY~Q
    (B((((((((((((((((((((((((((((((ZxbqD6qG>)mk Q}7SC!DDKy� r-o^]v/{o,;“BϕpH<GᯃiؒQ6\x{zoZ}�ڮ"*G*ΌHwY97i[U�kz_k~)ԭ|!eG꺈WSqE,Ls#!ȧ…{MfWriPȹVim(Tܢ@HOwC�JĝZnÖEwWKyz)0-UՐ&Um+x|BRH/,x-[(1+KHwS*_nҳo|޿y>�h
    ?Eo77͋-'>^BzK~]ㇾ^j0iO>FxnJ7ܴ	CWw|<^.e_R6n3B1&cۃ׎/h>*MmOV׺[>tjo,X^*:�`N\RG{ov^Of/m��==Z4_T/oo"}y\jiMWv7	P`yψ�M߁AJHie�̷s4s
    |&Cx܅xG>9>v{*v]S-y>eԍ,GBnZF!cZ~Ql^x:^	lPi6VO^o-'İʄX""NQݡ.ͭf�gXh
    
    k2k6w֗o7ۆhAus39FO?|e'Z-RXk/1	)P2rO^4a:{-$VY<WGT,ȹYd<q<>+ņme4&
    xAqha<GzOa>.$&Fp_?k�w{~syx:Ff#M%6#?^'>W]//5%hPZhzBmaҎ�04M<,&gܼG
    nƾf+Kvio#Iql!ylAڟysZi<+2Ý"}N-t?ɭ=w7.6&K4P:*Sm_VVwOy'k*Iy*ߒv][�\~^hWfxRg]"0`qH k~2/Vok1Ӯ[qkk}5c,vgdK^ĻDUХE=Z(j[TVpGpu0S^4'韴5?-4Z릟],{`mմ$g
    A'?9@q#-nE잞RkZkR?
    U̲<vj-rQh]RTkU`BePp�+M~]Z׋tW6y
    2۰ERn62U_h_1/.4u.k^TR2qu=Տ�&BB"Ri}4o|sk�NGts^ִ[KmWGhX$Huޣ̍`$MYs
    i_4:÷]k^a1wWeرcpl<F؞@ԤӭǸ�
    9eBQ82Oj�^gvm=5OhZG?jp6<wαK	#IB@$# i_tKˏ\xCSMůw4z߻#/kq
    0^C;'Jv-IqnC]S]J�p6',>Q0rºaOO.�>*0KL`Ÿ^sQEQE�QE�y#�&K]W�I%[$ݾ)ث�$u9S_QE}aQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@I7ɻ|-�WJ�Hy7Z;ol.4h-[gHmĒJIGXc৅_~
    ou]$Ovqo.XYwaڼUu>Z^s[]hz4#%ݠ(\!4ep96뭷ǩn_K>67SԚ]ݗ@	Di/W͒	"w܈RǿESEJj~0.t-#o~糒=ăĻe;\W3�Q?wP\jxpC_ݠMNӡ*-{?5;A�o
     [Qp&LE7FޞL,$}jUv֋mu93U</-mN+y/šƹ-)șmx_]!@B3xS^뚂<ڭ7ھ4[ne	eb	z
    Vml�3N<s+~Wwi�ox
    u8͝1h#E>HI"(/N^~%u/B|#mqz]XV6ީHX[NҘŐ7/2|a/1kjZ^\x}ErD1)߷O.xi_Λ߈4XYFX76#ԐBAܭ+s@gm<Y?ZԠԋJZ#kVU&|bw;n2(~V_m?7�/\skA!}?R]˘Gۄ&YLe�y&-r}N#^8̋4{<,ʏ:&#SCtQ<3Z]YICM!,ۈ=?foG>7?$FSHԾ{6y9tmܡJ\{z_ӳ̔uup_
    Ϧ_YxkN@of1]m'ȎWb~2xhɣjwYm>ڌ.+ɲxHCG#?e[<Y˥iz!ӝٽdXd(QfG,¿t'.xkĶ^~l2C4.%7nNjc1#=*G
    .Wen&z˿_:|bojyw[hz[4ڋA-s2]1EҾӾnfӬ/!;-DR#e&+z|S.xs]_\xC[}ZÓwdZ[߬nVղ|]w>�RO?O7z?-դW8gO"`deO5 0Bwzw~w׷=MkhڽɺInҮyKx/*yRm[״JY΃6k0I
    ǟ2$ P(N77[4%jfKսS;݂/o}}mڝg˴ּ>_N!<gɎEܥHU5\mwi{.kiz}OL'ŭ5MvF-ƣwx#BHfeƒ7(6m~1x>k}e'ynFf 2r-6>CmQ֭2^Sb-kzt?gid4(UNu!4,YtȬ4#NwC[oo&8,Yo:iɾn,Ivo]v_ߴØnf֮aw7:=Q^$1h[̒ľdEg8u';V3M.Z]oXD?Ν<v?>)?e$2I3#[ZYIm~
    [+kn.l
    $au#0qHc~S-̢h@̮v\�Cm˄Omk�ۧGwm˾6:gf[1/"VeK%n'o�k.o	y�|6PWoLasy|nޣ|;WMr�]CV!imZO(b;<ETdz|^O<M>V<ߞw}Χ<G%)讯ktfwK�;yV\\khWZeCC̸,bZQ]#}I}Vy澺o3\4")&RM *n&
    ՝ʼn^j6ͦy[Mo]jH$LZF	H`[.xog^]EYmI<җy_je#.Zeu'mF;j:/:	j꺅Ε|4*[#-],km`:ƿ'@P*iwRM"#2d+ޙ}2s'/jB|A}WKEi	_wW	#Ո,�f Z}%sn/VcѻjDq0bѓk_ok~M
    뵕uڧº͞Piq^=k8Qp4e³Ѵ=ޓkj
    sq[\GiyR)A6ɵqWg<&:
    ;OZ糸w7rآHZ/p	K/|BʹiE4WeXmFe/	]Ms18UҬ0N0r~E)y2o'ߟ൲H�ɻ|R�WU�Ik?i7o_*I-z}A~�/!EWhQE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE䟳wt$O&o|*gu.�El-FA*Ja]g,�he]E.zӔe6{Ey�,�hG�x�4?YR+}_
    ?z�<W�DsƟ�ʏY+�9O�eGq_=?
    +�dx?3C�<W�DsƟ�ʏ{4(�W�_f�*?dx?3C�QϷ02h�Q�3(?�#4��T_f�*>�oae�gQ^�#G<i��,�#4��T}G�>�G@zկt~xukK{|0<)+n6#w4dx?3C�/Vm_G@�G�x�4?YQ�#G<i��,G�>e�gQ^�#G<i��,�#4��T}G�>�G@�G�x�4?YQ�#G<i��,+}G�Ey�,�hG�x�4?YQWsc/=�Y+�9O�eG,�h8_
    ?z�<W�DsƟ�ʏY+�9O�eGq_=?̋�v�b�׭ϿxW3 t7֋{[s},K$<j\HPXdN;
    $V"h7M[4GaEWXQE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QEq<G>
    6|G]\ȋ,Mq RMhM0RMT3*o\ҜI.j:e犴\-'o쵻MC3%Ƌ`%9;iPm�L6P࿰.-E4l#! i敠�dtHlPā#]K*I8>7kxH!vZ`Ҥ%!cYĤ%bgmiD$6�߆6sh(((((((((((((((((((((((((((((((((((((((((((Z΁o7/
    iIg*3̪FKyHE
    ʳL#I%fiNK;O3
    KD5)kY-)R. `OqiMh8bhő[XLI`y6kkq�SYWQ}dw֯5N	$eQElyEPEPEPEPEPEPEPEPEPEPEPE	CǾ<M0kZ}oόnUhEK 02#=rQ[:iaVNPio~vg^]�	_ſ|��*���U��#_�g^]�	_ſ|��*���Tj��>W�Eyw%�E_w"/�;UQ�� _/
    ?z[�Y�J-�Ћ,�UG~~u|(�4WWo_�gw�ʪ?+�B/��Uڸ??�g^]�	_ſ|��*���Tj��>W�Eyw%�E_w"/�;UQ�� _/
    ?z[�Y�|m_⇀PftF;o416b{?0o^~ڌmw�tQEzQE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�W|WO|{:
    /Vk_-uk8Y֐Ȥgև3wO%�z�u8^F8j^rW)knǭ^I�o��t7|$�['?q�o}?0���Ey'3wO%�z��o��to}?a��+�=nOfK|��'�=i�ߏ�;�W�$zxoO7~/͎53=swٿ �['?7('�{۝�+�=r
    |M
    _y3X"	
    V"!SVSvOfK|��;:_�
    �[@&_<!kO$k6yV^~13mtbVԴ{zjO-QiM5C3JnAm1Mgړ�
    �䏥h~MOLu=KMn--4;)a6�ApA	?/�	O7R䝝/�;T
    �-{N;*x�K4jOfK|��'�=i�V}{�6<<u[]o3	վu'CNֵbNn>+ң/L3f�᛾-_֟nyZ�e0;�W�$z	?/�	O7G3wO%�z��aw�H+?᛾-_֟n|9[ĺf�wb�^q>̼ ?	jOMwv/a_m�+�>'�=i��nI�DOZ_�?G^I�o��t7|$�['?��
    �['�=i��nI�DOZ?�>�0���Ey'3wO%�z��o��to}?a��+�=nO	;O΁vO
    hgM!ԹX*J,-э[Z6"S.m}~EWQQE�QE�QE�䟳wt$nn�v[�b�Wg�
    ?zT?GE8η>Үo�?imkġD�}|+ci>0ĺLSh˻Ҙ&e{?.B?hٹ˯7m=C'[Z2S⦷OEV6$!+	]�Z%gjkk�,7aCjb2|X[JU3o_Oxy}~WşȋPFQ'9O4yjnF|4}=V`H<bJA60';Kغv_o}o[^ׄs2j]o($4nVRՙmNCᦩxž&Yψ-9#Ӕm.%KPiSayb$2	vtZԾ]47YbҼ1fft"*JC>:AگZĆD
    vcgqgo]32tkd.hw<I|-/xUt9{'m412W
    N'kᦗ\xzouC+XޥqjI
    e|JKFBT�O<k&Zƙ+{io!kRf+s3v^zLo6mLY`J_iQٓ>LOH@ÀXnjMt}۶^ڍ.Wn�~v[\؛-4]OXFaZkuC5?cK"Tֵh:U߈<[%xøc7*Ypѕrh]o6NJ]	$_J&5Hf<) h3lxᆅNqMX[ rәn%I!
    գۙn֚];]ɂ�[Iu.S/m-6%exR 
    [v/0:ݾ)ث�$_/u_$~$ua)([<P(�(>+'þ=?+5ΖwQ,HPdR�3}kC'�=i�׊�|�b?F=2v}${ZtiFiYHfK|��'�=i�h]#~?u�o��t7|$�['?z-sK}k�?:�nI�DOZ?᛾-_֟n9>�gj췢x5�l<GPqݫT8$@ WUbfb%}lyCK�k]~_�|Q*P沶IMn0FspNko
    IqS:eDj6j^i^gM(s`)
    HZ(aqSk_]}k3ʦkwq~?MWpF~x(x~�!�7|$�['?|;H]7O|E7.GxUR
    CWbNToRXJ.q?|Cioj)o!&e[+WƎ	6PU
    h:o[-|zjJb,;IO	?/�	O7G3wO%�z�ע^w4}k�?:�nI�DOZ?᛾-_֟n9>�g7|$�['?	?/�	O7^EZο᛾-_֟n7xG[Z][/&NKx"ݢlQ�Qf'I^\?1V+Wj(Sjw螝EWޞ QE�QE+�/ �ҽ.g�j~Nui&;hpSt?}g4�[�:7xv*jQ(Ag#h:�x�]o��x�]o�b~�og^u�?�!�?�!.\Gs=_~�g?�_~�g?�Yv?}ڗ¡|O�	^)TO.F-gٞ+S7)xk_%kwChB1Ga
    I_^<i�.�t<i�.�u}fNPmZO6DxBI}y�Yz-?	gԏĿ;6}_f#!dYŒalS]Ɖ|q+V?_[BڕpH~an)eN>>)xϧ_jͧ]%yLm;&u'#'�x�]o�jUrr];5/o0j|W߈SN%wӯKEMYonŮIK9'/)[	6Ywџv+eVRnܪ�x�]o��x�]o�*c'QI8hM\vvi]08ˑreE~<cei=[.%SZO
    o7_)N�'k�i[>x4;׏oCk7Z^yd[@t\lHФȹv-Y�?�!�?�!өRMKzt,
    ufG[iT|;S}x.o;,!cjsO3KsVSZ_{/^YZ.WySHa	*~�x�]o��x�]o�x[V:-˯|eO|PE դ{6[l=Fx�`A'~!EJ5WƇ.nE-wЌZěwYC`}߆O!uC;◀4cTլ<+k-WU1}oX{4WiO^w)r[9`1\Vֲz㟆'ό:5}z↹k=ޥ7#[X9?x:
    tᗋu=S?~$/u{
    Ts-Dl B}Rt_
    H[/bqp4ll8֧/�3ƟBY<S:%~+>=M3W:~Ws+4k:oi^+y~%Mh}BjIHNQ( c.?Ҽw;U杬6m6
    FxĻwR	J`~�x�]o��x�]o�꾻;teo*Ks5\ݶ)Z=/ ߉^IH;HZ$khe *).?#nPˍWqm?Z_~�g?�_~�g?�+Uez.-`fz-_3�@�3�@�r˱UϷ3h:�x�]o��x�]o�`#}Ey/�3ƟBG/�3ƟBG,q̵O8ث�+kk>x}{[JM֝)aucr3@+O
    Vv(TŠ(((n�v[�b�W��>?/Ѿ|7֛ŭλkȶ#H
      <6=l%9ԡQB-$}Ey4O*^�†�Q�
    #��i\Gs=iT�
    �G'/�Ci�(`#}go�KW~W#ᏍVχS,Z;#+]RLIsiT�
    �G'/�Ci�+gF.M6{&Ք?~+oV>7�ooMG-'tyg f'.즱T|F>�MrYl<7H�/ncC6IHؿ?	?x/�
    O9G4O*^�†�VB.-ҽ}۪{YXsrJK{}/GPF3|=UCo*[&@9V9\_K𕶫irw7[uF-8
    ѕd2ۉ4O*^�†�Q�
    #��㔾gK_onSG)7{s9[陟
    ߍu:s<Ov?gcK(!>ī.LU
    +ο~R_6riT�
    �Juj9>m~;OT\${3h:�I�EKP?~R_6rcO?_/u_$iT�
    ���~#7~ԠmdiETEY	f$�U˙htzm{Q_8QE�QE�xX3㿀ou5Kdֿ]'Ienr8\)r@:3�@�Z_OU$ӴMGHn{c7*/ˎmg#RRnϪ_j^L?}g4�[�:?}g4�[�:5�>&xv֏P.-R/i񭤷>t#E(9χzu^ӥ0kgk!*K0}ĺpzI>Wg۫#{r;�&o/�3ƟBG/�3ƟBKq@>߈o<a?@Z[jZݚ^H,"e#%_m@,V.O?	xNlwzxUiHM뤱yya;	z[MIu>_ۣ?}g4�[�:?}g4�[�:#oUshuۼi-݊YKrn<4_cm-w:Ҽ7Iˈ<{x͜YVF6v	qIگ/]7>�"s3�@�3�@�t<)i6&t,U(9Kp0B$'i</ůAZ3zޙlo/ 6V2ȁYN�a"ܮ�אsa~W�/G�x�]o��x�]o�~ҟ7ቼB5Я{}VFmY`T	v"1\?Wޏ\k˥_j&mAdiP7$U /fNMsr�|/�3ƟBG/�3ƟBV|}V_H4�k1յ+[ԃC?*^$vv~r&t˨?4LѮmGWoql-1XxčPE`29p[o~1aӷ$%ot?3�@�3�@�iX|j{Z>g
    ]j:ſ8u{w|ȿ#9~z,tw`x>M-R ¡RC`�ħj�]v&/�3ƟBG/�3ƟBW7']xH!\OE^Gg5!Qrfo A`1exW7ĺ<GZ cI*vy]�~:�.?/�3ƟBQZWO⸶&c=n' rA=>1Чu8(Ef{uT##^e3w~/?Ix<翕2H`qmNA;p=LV
    #jRwKn{?�yO�>	�2�<_ga�?c�'^m�y�Z?~/�#/?kG3W{�5Þ*Եm?E_Qyl.ɑ(0kĵ?ktSW0&P \n4xmEf0q4%7ScM&_>7t'-4hͧ
    =p5¼,R2)gW Q�u,Kw/8|ߖK8�ث+ѫ|Ihc{qj
    ieo6U+_'9lHxIQKńכIӵĿV.Q;v;I<cF<Bڟ-Ǩ5V-լЯu'dYw7f\˟Eeׇ{E/?ǫkzS˪hp5֫duX|*i'M@Ig�Z?i<ohw:_/VT{G8ݛ`R7 w.>jsYt3Bڤl,WfJ+L֜�2V=Ku'f{ZFYxMbƚI`L̲*:Pܻ/C}_k[[]j�?OW=u_jwe#^"vZwfR1+g7	6B)án?#�+Ե)4}1xw	keù¸&Hg> \Kÿ59|:	Юl5nR%!Fc^
    �W~$Ɲmx�7/u$c61
    o^B߳tVIi6Ŀkk[/c~=|3׵?OӾ!R�PFli&w~㚛?#�+Ե)4}1xw	keù¸&Hg~"D<mtGźfyê\H%ۈ"m'Ja~�	bOigoa{c{qrRJ-;ch#h+Ɗrߧobbj�ֶ=7GtYOEռeG=׊4'LdI3,$3<1Ȋ_kK|2�h1h˥ƭj'id$H\mxzNy[R{xs_[BQK{t*0|`>x�IW_Nj7]+4mXY^3G݀xU
    *>z쯾ڽoWi9ZtoC <7(jTa>ͦiz~?>ucFʤ)'q�ZM3NK[mgNH
    x�Z-
    4k42&#B#�dϧu$[]k[{͕As2�tTpVӾ?ϧUkfMw}ϣ/Z:hτ.4뺯>I;d1 E8f±mXV^FiZq�׈#ݭ:eԌJ@YG#
    ,lJa[í[�
    SJo5Վo,\ipش&t$r{ s/8'BtẞMJd&R8_tPO !0yyRQMk{u7:[oGk$o]?U^~"ze&o>-ul>xw8W"¡~=|3׵?OӾ!R�PFli&w~o�89I:L-�/lon.^IEs,mb"-sÿj~"D<mtGźfyê\H%ۈ"m'JawJWӚ�%M]_D�;c�^R֬=%g
    "PsdAV@-𞋫xD{{[hOg>k,Ȓ f7Y�Ibfxc?,62!ÚĞӭ:[,w2F!R-ѫW<;޽]xIo<5jQOukSkhJ42obrE@o*	}jtiYY~]ox3ei6cїK[;ZNӥT"IaAՄ<7(jTa>>x�IW_Nj7]+4mXY^3G݀xU7_4䵶t-4Z\@@C"i|Pl4-/":V�In-;{_ۦ{ͦiz~?>ucFʤ)'q7?t5OMͧxšKNk|eE*UImjT,)O'FI5+Y/
    :4ww*g.#8dqZRB 񕧉	|vY^kdE1fYڥC)JjZuQnWMg)IFM-om}߮�	tKgoNǰ3-lab	$1`#iR1UE¾׼K0qu6[+D`]ѕIbj)qo}[J;{]
    kyV�OBpkm~xDt-V?BỶUXm屶R<r{'Y$PmSm;moWmtzXY]w$|?oeio\궩dܳ.V)�lf!G{/ĺw|ܭS̰,"\Fc#
    ٛ4Z7}fUt{]Y&ѤCT_*O)y$vW~
    xGXOSMמY5
    Bow~y4UU5Ztr;}v!t;z(
    (
    (8O
    _�^]|q�i(	eukC0@0V8p|Q+xOO¾�HtL	A۷�<7o+-O&${DY J ln[nO12h77g`rZYw?ulW/[sS9͝K	U]˱6>_iP>MƭIy/"7R 6bVdFPGG*
    _#̲X
    ~%+}^m�y�Z?~/�#/?k]_ga�?c�'^m�y�Z?~/�#/?kG3W{�4W`_�?F^֏�<'�Z�?7�"zMy'�&]+�I"/�<'�Z3SH׿e6:�.𮓳S!Ŭ$KNn	\[Ƅ4~N)|w7$(,G@V=7R\m6='�HvEhTg%T@'
    Xf_|._޻ԼE'^.pC:I0ZA2,ap;;N4gqvl5[{d9woZ+R`9:44ݝWs]VOa|mqG☍݋[DzcY$d^=ّ)fw]Hu{uhi71jZK<HH#nmel~o~�)
    /R×'f	f2쑁b?3(ⷄ!w|'g{KTk{ۧӮ-"JXHTO`ZkG$tI}|ա97gϢ|AM;p]je(c>fU%‚~gu3@ɭ*S|_oky?m~LY_O-(YX)U"eO�~O|1�;[R2\xKSPw-C[$ğg,7D0[zY>\ivtĚw.>o5Q|4K3g$\͏Ư	j^.v_4tϰ4+4w>B~xX־%�nKoeynB$
    JyX>.X
    x|#{5kf_7K<IE1fs0Tܽ{j7vZn5+=ú
    7ZҧVGwk>O2'PX28 QZ�{RgA]FjW=Hb2yџ<UW;X=6o$%#fxX|
    -1nQYB۫n�Օ�n7', AKK۫S׊h`żYYW"@TO�e-~J�BOGͦY{+kGHQJ
    <мQCd^xj^'FK*i.b"IVhn&t)Û|miѽz|\KmM_�g=/Qy|{oۛ ދ�{6n>iT;k|gk[׭tzB}XwτVͥvRs*[mdW,F3R4ͳ}]mVw4mcjR}K[aE|p2*@)XG4VZ/Bȱ`$F~Y!~/Xx,e)@w*#nl̾fFƽW>/蚭߇WwVRǦRAdzVңN߻Ϣsl$Rӯi}EWǒQE�QE�yw�|�b?FcF<Bڟ-Ǩ5V-լЯu'dYw7O8�ث+ѫϳYʞ:rK4_#~^2I]G\\u-ct-kU7e	Yhmg<=2"ڢE
    ;kf{O/rIWӴWݬsoQe˯\$ҮukW6|M,W"s=
    $|(ڝmd񮱦%՝mmxDi|rpTIuj}̚}ol|kZv5b|ŀ˸m.e67Q$hQ3>k<{m3OtmSW.׺]m-[is¨P8*"V]5[~Z�$;j{vO�nƍ+Kk+B{_i[E͜bnncY.Mʫ
    ߲VI9tRSZ5
    ߥ
    #gWhXw^}}[/;z%�گH|:ro&}-E#$m士+^N�
    kzߍ<Ed{?Zms%#FX<ӈ$d�!*�ȢyyO?<U_Z\mڲH"2,2�d;?eR]WljK.jzVinf' LJUɐ)NT)YARw~O>aŚK&A:?m!n`[HMr+ʐN@Pʲ{Z>}ƅ%ׅuk>TZbX,`+$P󏢨DZ[פ\Wk݉+4�>V/j6wN	j&=gV	
    oZDHsiTJYdMbwۍC𮙧$tn
    /[&ڨ&[!da~|tVQ~}-EʺJַݧż9h\döV^m]^h%+�5ļH^k�LzUw �pJW')'65J[v_TSӨ
    (
    (<q>�WWW1Km3?l[_	jש}iG+H**W_OUӵGH󮴋{/+D 7+6G͞hsWV_4��?j΍yDgŌZnuwuzHgm4e'O
    Wg�<OmyGz%W1&5<
    ugq?BS%Xۯ:ėU^7[&;Zo5Q[dB*1j_>,􋡯_[_�iZR}2RK:Fu(!W`T9Q|ן|1[ki�Oc~V?мeZ|@$V!VUc7H]D
    ^|x񆳬;/[˘,1ZfKdermPg (-xm7b<E-[�5kH,; ]cz>;7s]_j^N{]yp>٭EFF#yjJ3Zԭ[ikmmJ۩Iֿ?Tn0>ace)
    8B9ĝHBu_	G&hW4mV�VjSI,
    =F)nUirR<ܲ{$5CS:2qő7	EF%w	%TsP?!;UiCxRP%{<EҨ12ӊS^ׯow�wDww*mtumZMZ{IF
    ֩,2c1
    a
    j.u[5߈ګ{LxBMHa_.48>UX+o</@\c
    6XsjW:C%Ē3`/$8U|5+{JCV,.t_j3;ZN-nghDRFFrMBn1K]_ﯚӺZVkKc?h6ˬxiwjV%OL־BF"ɂ&f�5k_~%C:(ⲏŲ+8A̓�c$ƱT[Jd(.fUnegxqs8*?�`cb
    ֑mOgٟVk$pnԅWt*6ڤ*Ǟ}w뮻k/#Zqa:֮241Z#cwH�xּG`/~jb6MOpS-sa	&.@IrL>z~W:,Ii4vzսg٤kHXHqvBQW;@7=V;%+t	4gtȴi�6i a-gkd_-6Eo;/!oCV:
    
    t#3�,I(Ypm]c
    Ƨ㫍'I֭,^oxvv%[K!o-`
    ^<_hei7JPI
    
    -�gYVyEhH4y`[dQS/ͻ'8ѫN
    GkO讻RMj�<#/
    K}zi#ѯK2Og:lLy�ie6_1x^+;[(.ukDyfPM#Y]DybHb}H^gRҴkM_W6Qhgg!;P1TRE®�[t+Mџ_/k{emBeDHBf#fp%n/Ju{-M7w5>[$9?Jn+p�l6s:5mF5	|1Xѯ澱wuڼpd!iOț_uQ/[n턎<2n 7
    +TBr}ƣqM,]%ͱŠkq,V_&d,H6Ft#oi�>֌kx|ֺD:?$>\j/mg{mB̤bN*t�>
    Ҽitۨh必Nv֐\JK$rPf,nkQPV�/DBN�
    (,(�(�(�(�<)�'|?�zzyw?|u�b�YQ2:?͓/?J
    (S(�(�(�+>
    xE_YaLrnW|BY=H?f7o*_I|/zXOQq<
    )toU-|1]N.i&#⁦+"m bWvGjaYn|K_]{m.uo]:Ho v Kz67MՆևykZ厳`I]X^&B3Ga�Ì%v>4|;Ė^^501yɐ>=-�Mg+�^si-߉5rO;]4߇y-GFXUi=ޛ?|Ukd+/5fx䅅ɅWe7$l#A*?fN/O
    
    ~}cҾ̂yU$�y20$pu |еJŷ#-[Ak*kvs[Ӗ\|<4wsTR3Q)PiVorv_O/ˡG?Nӵ	xIK]3RniW*
    ,̀eLͷkM+6>!Դkzެ,`Meݔ6LVF3su`ϴ))xW�>!g/>^[7Z:fh#bD0Ô⌴	ݹɺ,cY!;%4RZU2I{E]�ko-﷗῞~Pfûun];PYoNMWtPy
    ?_�WNuKimΌ;8MBQݮ\|
    t%GGt/xĺo)DOjgkgV	:mJ<@4$P*
    2j(i܆$QGJ)kkuTiu�-E7)|{F.]ZCV7|^\$=vj(ɔ+qNB>M7Osi"X[)f$QL:."�:/⋽CJan/}M<M;3lnT'�/Y96^Ҵc[lvl)7*$hc6Zr=e|>]}oߧ:l^𮷢IZijwbKnfHY|"˸�ɼ_|iJt�kq3Hiy.!|K$ IR06!dc'|Gk^#ѣ5
    JУ\uj�N2T9-㏁λi|Cc}*41EDf(J5Vg
    XaꮋO=VrI׷l7+ߛo}zfFerG
    R_2ٳfalwIrv^r׶X[FNn@$ڷq#Dv)gUMmzWS?>l6[aHu>^|W~-|[g7V]>hekc
    >8gM\˟m/VimwgMSi揭iwᙬQ[( Erd"`,A<<w\/6ӬK+]+S))63[I$m1F0:=r7!.Y%M5ܑx{cã9+?f�x_k&Bfo' Chl)q:Sku[Yw6])nuyyEQEiQ@Q@=KYvL4
    nKE5uFM��ÿ	�!׬^+)M6zS'Uvgo^�O?^�O?f�_|;�@	|;�@	z`w�_|;�@	|;�@	z`w�_|;�@	|;�@	z`w�_|;�@	|;�@	z`w�_|;�@	|;�@	z`w�_|;�@	|;�@	z`w�_|;�@	|;�@	z`w�_|;�@	?UetSO<Mşq4kг#I6H+P5Wn+#&OQZOQE{G�QE�QE+�/ �ҽ ><gxg:^isǫhjM̖w0e6kX灊�ſ�e�-kʥ8;u]]:SM:4i3}wtW	�ſ�e�-h�S^�2�c?_.Z_}�N?�Cׂ��|[�F]�֏|g+Ö_tOE>-�#.�kG"�z_�0�?W/DO=x/�˿Z�ſ�e�-h/9iK�;+üGcYgG_n4=zۣ(a$G?x3\i4D&WwW^XEGmN([x<7,x/⎨7:Jי]%}/};\2?�Cׂ��|[�F]�֯�3_tOE>-�#.�kG"�z_�0�?W/DO=x/�˿Z�ſ�e�-h/9iK�;+�S^�2�)o�w�Z?Z_}�N/h_4jGg)soɕ	5]`qg'y~3xÚV_xcZWڇoG	4s@jbF	(gE0\]tSªrQ?Nkܷ>OE>-�#.�kG"�z_/�?W/DO=x/�˿Z�ſ�e�-h/9iK�;+�S^�2�)o�w�Z?Z_}�N?�Cׂ��|[�F]�֏|g+Ö_tOE>-�#.�kG"�z_�0�?W/D<)�'|?�zzy"�CoxK/]>NHM>(c@Hrʀps^_k:hSFuouh)u(8Š(((CƵk-6|MN�Ev0#H{}y'�&]+�I"K	�?~*FӾYOI.U_x]Ѹ"[)K1lɽvJwYGjMJ-+K<sm4R5i<FW
    (")ouۺ{[{T�|KuFH]#ůo2Z\5ѾټknyrK*0m=Z_|Cǎ|1q/u&mV)�o$QHhi6fzo4
    CD-K-ܐ`>AZ}jTҳu󹛃qF_ש޵-|NS_AU[+[H̘<]k_�Gf{�NҖ5>uw7VH;Aw|:Ҧ H'kﯧ帝Yjp04ҵid;jѥ{߯�?ZO[q{QXN)mn0V{7@dp߉^(<MQo,lmm_=O$PK$
    I#!mO4|?.ݺZ%ed5�^QEQ@Q@y#�&K]W�I%E:ݾ)ث�$QՅ�x3袊lB(((((((((((((((((((KW|VI=tϸ.YtASeċK$9&d]}dd;=M5,,-"{qC@U�I8�fPƧ~ybё&ծK{ED2i%B.SWө߅ܛOfxgG~oh:Ul4d-Yƀ(31{w*�	Wƍ�ggdOO%qxP|U,-Z	
    UXi{{)3KvG"fj#i=6_T;}|ռŠ(N�(�(�(�6_�ms�$rMqs3$-W�y^mk)g><'Ү$ă,qas,YNnGzZ]�5mPxግĩ%aܵKjd8L!b5_3`*l oa:z]W-j22d0	H&Ү2؞#~?hi:7N׷6p"u`dLlmuVFVm^w#e?4݋M/nݲhɱrqs{/}n]{ﵮvktQEnyEPEPEPEPEPEPEPEP^I7ɻ|-�WJ�H٣:6k$qCx���
    3<
    LjJwҍ9Bj={_w;+�z|i�޹�ɔ=xS>4�\�k�2ן
    �W�$vW�O�s�(�z|i�޹�ɔ`e�sῚ_
    �֊ូ)�Awe^�??2�̿|7K�_\W3ׅ?#O.LŸz�&Q_Aφi+�;Z+�z|i�޹�ɔ=xS>4�\�?k�29/GkEq_^�??2g
    GƟ]G
    _>�Hh+Ÿz�&Q�O�s�(� 4�y#�&K]W�I%g
    GƟ]U/٣:Νu'ܑMxC)k"|�#Z5FnRѧHJ(((((((((((((((((((<[mlwҋku-1H rL[lQw#
    Uc<%;h[lM+7W|HH2GEƀ4z$$^x#�ZL%Xږ�%P)Uy"$0
    dtBKߋ�fi/C<qxd]m`GXʺLx|zSI"'RU-Ek( (�(�(�(�ڞgiz~iOoqks)`Uс#U(m;o>�w$w^gneLo&DXgj2rRi5fT&;?Ěntn4Om9BueX>;?^cMvyV2mIaRFx;?Ěntn4Om9BueX9Mfk8)/iOngѾ(9Š((((((((((((((((((((((((((OWh&l5>Q7K*4k"�涿+�B/��Uy_ژ5�/?G|5ekGQ"/�;UQ�	_ſ|��*��W�Eyw%�E_w"/�;UQ�� _/
    ?z[�Y�J-�Ћ,�UG~~u|(�4WWo_�gw�ʪ?+�B/��Uڸ??�g^]�	_ſ|��*���Tj��>W�Eyw%�E_w"/�;UQ�� _/
    ?z[�Y�J-�Ћ,�UG~~u|(�5ŷjQoqy⛘)km2ܖQutTqAteRM=wf\Zi^^{6w3(Xohմf*VdAF(>"MI%I7^xQ]O6bB"(ª/4=O�0r敛蹣un9j[QZ//ۻd1&[ʷ{qٚIdI:JJ-�Ћ,�UG%�E_wLVU?FsכW�+˿+�B/��U[�Y�~~_/
    ?z[�Y�J-�Ћ,�UG~~u|(�4WWo_�gw�ʪA?g;+ORM'XPhdd)n0VԱjT,%XE{J/;C+
    (
    (
    (O=fm?>Zx|ctsF(pYa	k*VKRrK{k=J-�Ћ,�UG%�E_wO\N=F?m;~ͭiK-UL{yY[n)"+2K"/�;UQ�	_ſ|��*<s-x>hgG/OIGm3nm;pUMըbHPYgU4uxW4<+;iEՎgKf@`nZg>3Ŧ&]_H.'e1I&HMrNHR@qR0GSi<乣ʟUS֨.���TWo_�gw�ʪ\N=FJ-�Ћ,�UG%�E_wW�??A:_+˿+�B/��U[�Y�\Q�3h.���TWo_�gw�ʪ?pS�GQ"/�;UQ�	_ſ|��*��}N=FJ-�Ћ,�UG%�E_wW�??A:_+˿+�B/��U[�Y�\Q�3h.���U{x~!ω=wVaN&wmFSfa9cӝ&XJ_[twݞEWyQE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�y'�&]+�I"E:ݾ�ث$U$&{X
    (
    (<y7dAֺ>mvQm1_RK0sY׾	hx#.h	y( ?j
    $JsEwxKđNuY%0Ž)}YO##H<>3G-ckZk2;2UFFVI"G&p:W]'K)ͯ}f3{h{
    W=߭99?o?KkϥZ%ńv>
    Ǜr]$mi_?I{@mgX6kډ,8g$"wu	A% H
    O<fƋxA-
    }mf.S]wS݁`|UW6xsUuOþm1Nsu?G@Lцk?SyyKܶ{)s\v�m?gCVNu];P|?{x?/u+tbDnʬ*1Fx¿(ׇ'/ןoGKMkU6H,hDSOn%vEn>%FWw߱otZ߮	Kb_Ӽ/-MRO;*<HQTxgh'?_-[JCTyuO<̋qŬGf6HNXEIj&nv*jNzlF*vo8_~𮗦_mt�kW	 QGhА)
    |*]m?~%
    7N<CVag%Sn
    ȝ��$=,|g3u=fIub`Q�@
    yqZOnWKS=Ɓ=
    &]QtNM'@؂EV,:tҌί׬W5Wɓ?iiJ;-z鶧m~۾ni{xI+ڕ3_%L]
    r2G8洟)'}iuY-cզHx%m9,Q]4HɗTHIPzE7oD4珵ɵA]S:?lf鱛ؓN
    LgUfLj@ {M/C4Ë_~]xrYl%Ĭ3̕0+&yYz^KhoÛ}oO:֣uyumjZjEpYW<?>�gLVI/?($cS3-x>tNL a#NO)"<'Q_nOuHY+MAcldZ7Ԇ<tũ`ӖO4mo;)_%{G}>Y_սpAOnŚ׈$-4OPES,;`F`Qg]T>ն+O~x>zjbLqn%JBv9'qjZd[E֮5`+(�Ÿq>:�W�Ww\'?|u�b�Yg'�|6/*'E!Q@Q@y'�&]+�I"[$ݾ�ث$UY�OyQE|y!EP^-`|g>�e{V4ԭl1
    dֽO4_:5յKȉ0x&ILkZ.
    O_�+߉O_ڷMͲO/
    ڞt4SP+4z`#0HdrIm'
    �VMyu=gR4w�dVvuH]fSYgZ$kM)!wx�m9=CU	~ZOÍz}S^5gMie%žֱEd
    mkхL#Hk.mG#w|'ks?lv?7Sx٧߰F$u?
    WkI֒xp}]NY9#e�M74Gm~}TM$yב7qf65'E^x}WC?褹]O861A<	j@ s/ꎟcwU+^EsI]ޟ6�jѭ/�爴SS<I
    Q;R1^6ۑï8WU-3O)ڠӵǓGK9t馊qlmy,AC.?O+]/▩q-NE4$`QX7يAv30
    @~>%^>x7|Aᘖma}4Kl-eI",vHORZ`cWWݭWg'QN;o[~o;[r~s&<-KĿ/6fK$LJ?乘q|gᏄ:6>T^0Yt=⵵eOol6
    �C뺷c�>%׼GxpjSZWf!%12uY{?~u$<W#~-ţ^fkef`rTK-־[ys^mӿyoqw'<I@<YxIm	y>&!2TᘕV"ßnk]Hr[@*Og!58\kҫ]-KkaG_p+(�Ÿq>:�W�Ww\'?|u�b�Yg'�|6/*'E!Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@3�o
    `:5Ȗvֺ96,ʨ8O5�­7�)?k�wQxWI٦infvb`s�'��△(n,|X2xPW֭+6Mu$)
    Fp΂r�%Qd}+5^z-ُ9�|M�EƟU&�O?[^Eo'o_YxrڵP	V"T[Y"D|s)eok��c[kVZhX%%K*hjv$һK޵zV8*i7e�dz}|M�EƟU&�O?[^Y#];Aͤ߁tJ֩nܔFSp'k0dqK>G:/mvxB](R/Js E\yl~zI&9mE}f|
    F�Ꮷnz�
    X|i�z'�+h�[o,>4�=�?hϊ�Idx.�Bt-USugos4,K
    .IX>w?x\[)#c5i1Q"	bI�R�0e;󵧣}�-U׽tmf{w*ao��OV牾4w<k0xFPBlgHcHQf^m^_[k]y�
    h>&40]픷rL|1axE̋ q]_w6}3u1۷?|M�EƟU&�O?[^5+H/uόK;1mnJ%w7~oz.-cS0m<;iXmLrO;mϘW*MmTSXj;jRQtO\�v7n?Ǩ�­7�?V?D�m\5
    ͦCq\6tcqb%s
    2pc2>&l*xY4="
    vE qg|S^,QacWB%Ic)46m4xc~5/U&�O?[G*a?GCӼCmj%jKq24Ɗ߽Fc_{>^^Zg[ּ(PL�ڗ[4.TǭiRE[Go$<TJ�4�V?D�m|M�EƟef}<o��OV�
    X|i�z'�+khg1�#οV?D�m|M�EƟ9}f}<o��OV�
    X|i�z'�+khg1�#οV?D�mg(/;ڇ5OL$v*)ǖA<lkOU�5�"iNTlQQ+#
    (
    (
    |os_i6DP)`UAy+>
    jzD^vicۥٵX8?)=)|�CNPStIw5?V?D�m|M�EƟ򶼃G�KY7>Ԭu<CZMV}Cg|MA&#d8gA9�;
    DM;7/Z]6V\Z<J:Wʋq`k9Xȏm]iK5e<Tn�ݶ�Tz*ao��OV=xAӮu_KzDŽ1oEn-$yneHʢ6J eK9t+[I5MYцk٢3{~go#ZC
    )0Wi]^OV%mZ:;|1�#OU&�O?[G*a-TU*1x~W
    uk46E[Y
    Eyv2c3akQk7&Q^:^<OszqKAKU!!Emyab4|VzZ�}*rvIt_{۷�|M�EƟU&�O?[^]{/-�lim.[&}>FmE?˸+H/uόK;1mnJ%w7~o
    z-gvǙ}_:Z/=tg�­7�?V?D�myuޯnXE<%OZtS<-qs
    m`&}w!<1x+FNLy.,UD7QfPb`][?]un3r/S�[o,>4�=�­7�hxM<,cK8k)oHX⨰gzwuYo[仟MIaXY"BYF]|VVfݺ'r춿w|M�EƟU&�O?[YIP:޵]DbgԺw*.n=k+p_U&�O?[G*aEe}f}<o��OV�
    X|i�z'�+khg1�#οV?D�m|M�EƟ9}f}<o��OVÿ}mxTDAyGj\y`[A
    mʖq=VO
    _�^^P)֔UM-/(B<0(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(?f7o*_Ioxo<_.GBִekӵ2qp٦L.<ݾ�ث$U+mI_=_KPA=[^ҵvZR(JJK45BI**</iqA"cZ29!r)U*<Vs˿drk^)_j
    "bKKe/*:W5{{	et]-V;KjPqq^E
    r)h8k'@<;kog7t7vQ@?rd]A
    zO𶺓Mgayu8uhAxocD61FxVHx5QUj7��(.TV=K_<'úyznWf؃3pխᯄ<=
    J𮉦hxFgC=\Z]džFA]r{mr>+]xsK}9fӭ%6֏|1<2EFBW7?qPWXBᵷ5xcTO#IE\kN)~ZzhRtM;ALӠi.^+HV%idrHB3337RI'Yÿ
    P.{*)-f2LY$d-ך(/U[Cg4Vm6K`Sn%\
    3dZnZi:tEv0,1!f,E�$$)6+ *FQE�QE�QE�xSN'_*�JOU�5�F_E�D(D<(�(�$ݾ�ث$Uu4{[mccr_
    ;5=1-ZNqTF`K	�?Q�e�<7}4nĒ	aVA(qq|M?PA=[^ҵvZR(JJK45BI*+ks}k
    jo|DxM}/m;#y"38hLm
    ~'kVX^@FGh#z"H#3rg(ڵ�S){|:q׬`}�|!wy{qimM*ƥmA ]>gfcѴ=f\o6ZC2_a>$H9rcN4�6VH_턺!F�+7Cm-�pvx2F:=Ɗ&I]0�!cf,
    K|r巖;_djO7wvjzΥ3VJim;PMjOY[ٽQf2̛mC#
    
    <_E/xC폋tn-dTީp#\9čK+\[_Sj:xGR.i,mfKn>u*$~nQ\15?e^xAL62j:
    - )%EQ]-$hIjT=MZO~]݃gKO;[S5o45;k=.5o&4DA\'=spˡV?it>unbdKh2B)Xy^߲l-}/Z]|75#C6s+$e;s�_	G
    6k3l}{[6|.Y*|}.�ʜ؛ing|9|'=
    6[]*V[?Z\_K\6F@,jdi0,t7}}ldHXv2H(�1f$I$
    �R
    ӔhMC?0|/RE̠%buu�EXn4Iw	}g<vEG'7;)/iiU_ve8�ݶWgњொtn%#Վi<2ȸ,8d2}y9'<?yi\l`F2vFI(YxZO\j|/5MOoMk<+bȖ4r$Gv5xS9EΕog/=OMZFK&ݕky3:NXUI7nzwQj}s&�:<)m�b隼[amV\UG	]HMCvu&ZѴM-[ǖޅ$M[3bc3/p8&AVw,/ZÚf-Θ�mQ\JZ~N<9�{�
    qԂjOF}bZO$�UhgTMi+3[ȱ!]~CRJIrc׋5j0
    VVٵ.x`bHn|]FA\?xMwD2\x)/,̲YwO),^X|#5Ef/vwmVMZ7~8Ѥ"(ĭª{ s#b9^k::
    {wh	o%�pҫc10m]QYxSN'_*�JOU�5�F_E�D(D<(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(<7?j^i?miivYZ[E*".Ӌ*I8�A/,^6�M�W0}s֓�<x�4?V�
    _Xm��+kӨ_}n<x�4?V�
    _Xm��+kӨ__/?y*bhx�4?VקQG0}_T"�o�[G*bhNau|�?<E�E	�T"�o�[^EP�ϵ1�#PxC�m<E�E	�:>�k�cG� /&�?PxC�mzu}C�>[�1�A/,^6�M� /&�(}>W�c�
    _Xm��+h�A/,^6�M�Q/_p}n<x�4?V�
    _Xm��+kӨ__/?y*bhx�4?VקQG0}_T"�o�[Z\|-k]NWUY[4{Qm_u)%'#h)0$ɖ*g%Q]g QE�QE�W|Noᶳ^A|+
    N-k
    \�2z;׷ג~nUҿ*<�j_?�H�oީ;;REkvfO4p9i(dou
    U(kSٞ2;3Z{{'Dhkr؁xa5/־^>%K)on%[9I;o4W6$$0ѓ^r	4<<X8oĞKDЭwZO>I#-Q!�rO+_wEr?o;�BYYwx4Xx&iyOk{\\nm\ vLȿ.T[Wߵkǫ_ĚMZTVcp%"IPA)d^,x+SĞ#IeCy}YxopZiS;MW}W9};BӵwO^|;ttޜm. 7WMg!kR[F &[!Z/۪~/usfotgQ/kF^An3d2*;2D`_k8+kWu/cGtBWi ho{%+-)Q*cg_ΗuamQo{?
    EXn@'; EuV>
    MwzώO4KX
    eloMnT{HK%mʧ?x2VI~ؗm7?jៈ.|M] <>=k47"kiX<D$)hIƖ,4-Oq3,ړGu4Yyl&؊ѠXX>*hZmivV:tuf	!you8SF*\Wj^;/,SMI<Cc{InZ6s\M$G~xeKt+Oei[274t-9[K[VץGbKm7]$sb`
    -C-4kK+]REUͽ58dyaL)e0CI
    Cfwl^~,WV]ak.$bqrYz}N+{]5o=6..-ɃDd_9v*ߟ~GO/ڕ~"7gke&D.hELdyR$ِ2/дgZ֛PM:=#Iҵ	^Gto:KeRe*Tn
    1n?gkGx<-l5=.^G(hc>Z_
    ~|Ux~&-T6qء4@oe	*}[魗}OWb_2?'-k<M.[·nfef
    XAr<Bb@-i3񾡢kZ][qa}lG+\FyAH$*6in2tmKPS6ɵy]q$`7wcf_|
    ka_j!]?:{fw4݁98&_/b[ohM?Dծ7ž%V"F2m/sp<'G	Q0m�j;X[39vLЭ-qf,.人HB27&@&vgM5>*7u=kuŻr�:	"s,WBi,sEx$ƻ>Xs
    IMnHkk[f<Vhe%d]Uڇ+O{4߿z=5^RwkMψ/Y:ޫ1-bgmx�Jk~/OXI<:E6Irh@\l(�sڶkҌPٷoKEV%p��ҽf<)�'|?�z{9?~WQ=F($(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�+?f7o*_IzxO_{�W7�zUKo#V=?sg5%ST{_=<5FqNݥ]O`/_�+?Y^򪏷_�+?Y^c3�>i_G�}�	^	��T}�	^	��Tfc?ؿ;+���*���*Ϸ
    ?wW��%x'�+UQ��%x'�+UQ�ob�?h��JOW��JOW3�>�4(�^=oaLӼ!.t;iq\.Wcۦc bk[WI��%x'�+URYn-EK8>Y4g{Ep_o�BW�Uo�BW�U?g>�4(�\/�Е,?UG/�Е,?UGf3}=h�Q�3/_�+?Y^򪏷_�+?Y^g{�g{Ep_o�BW�Uo�BW�U٘��/�GO
    _�^M���*o|?<S&ieM�_H%s��pzW`q1QHYk
    ҩy-R٧M+O(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�+@k1�i^io٤Xmm<G߹+ͼS�xhI-58G�ܴNd_�60ME)NVt;u]E>mxO:Ա}Fp45wڴ�J_k߅5=IὈZ0[Y
    .A4NH
    O|;5mR8-2[+s !3VƵfUev;:(8(((((((((((((((((((((((((((((((((((((((((((�Xmkx�T./SOiW1[ܤ{c\3
    *\TFԤۧ&�oşuMm�Z_&Ҵ`g?63�<~0h}�]ϨW:GI8bP7`|*�'pJI)^�3^j:]�*QEQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Wx'3@6aiw>1YV9Y8],05_G
    ok+\饇Y9BVݥٞEyw%�E_w"/�;UW'~~~W�Eyw%�E_w"/�;UQ�� _/
    ?z[�Y�J-�Ћ,�UG~~u|(�4WWo_�gw�ʪ?+�B/��Uڸ??�g^]�	_ſ|��*���Tj��>W�Eyw%�E_w"/�;UQ�� _/
    ?XU�#O�^^H~-c]�"գ<Klm-6g,7.OI�	_ſ|��*#`֧~_RsN-mGR}OQ"/�;UQ�	_ſ|��*�psN=FJ-�Ћ,�UG%�E_wW�??A:_+˿+�B/��U[�Y�\Q�3h.���TWo_�gw�ʪ?pS�GQ"/�;UQ�	_ſ|��*��}N=FJ-�Ћ,�UW|A<g^iIjM̗qLe6m㑊ږ?
    ^j9ݿReYoiEG}tQEwaEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^I7ɻ|-�WJ�H?f7o*_I|C~z-Q_HQE�W?k⿄:ׂt[7,VI@hUv~S߉,"4w߆gn'd7,&
    
    ބ
    UֿmVJ�[Wiv/xz6&U2.EXN�5wڌJ�ǻ/DlrxE{hum֗%ˠ%w
    eơ=:čyGbl֟6\$ː!w|=v_
    r;+kE251"K-0q^j`)I+m4et9mQG��ҝ�g(/=vh6'ԯ.,CY%8`A<Kp/ �2U;{NP^ha>mrԹH.py4'í#zּPW_#[ݵu"7{
    ۞kGkO��xJjq%qܶN
    P)eٌ `jV7릜ߤ6KwB^R/Ǖmw̩OևW:6EHu}Hx&w OoJޯ-5
    :bCe`ns 2M4qc=*it~Ek
    xQgy7I{BVQ;Z?`�Oq{gx[vj:mxAHۏD*=5b[.OO]56ӏI~W�"ܯgJ|i=v}N5i
    ]Dh
    R5HȮJ;|*ԡ-gǺMΡox|Z!cV
    �I;z-SG<oQѬgm5fiP^Y~_؞<;ڗ]i�mQkGa9*&?T\6nﭗ+F;7[ܽnEM
    	8]CK׋<CU֝ofeVkؼnc#pS�Mo7щ,"Qc4_.P#;C9)?n}|-qx>[-&1ޅiY[gQg0hĞ]UmRtvۧo/j&Bq*I}dC/ۭʯo5+ekks�nOk,мIY\kzo&SrǷ@/}ύ^5
    ::՝mA`U.<T,Ar
    z}O+k6I/˸KA=>\>PRvCk+A|	h^𵦏\Z;x්bAkcaRf%}l{tkoqk\ɳ�-𿉵tK+Ky$u^XGGP澇}h!Z]Ht8gh_{+щ/*MU	[J/{ _xY೷D֫m,rGhTK3vE7/V}zY[Z#ϧ7^kEW	QE�W	O8ث�+kŸq>:�W�W׳�GGU}hB(((((((((((((((((((((((((((((((g7>Wt3xkM,ts
    mc"42X3Pp736$kރ-6/Gutfq6maa(,w:2pgJ_?(T']OU&�O?[G*a ?R|
    ŏ+FOjվ|sw&PI!H#!N@~?~"/
    b>Mկb$O-ҵΡŲnXfa7r#WZzzoM$O4�cm�
    X|i�z'�+h�[o,>4�=�ľ#|v�4WŗcRѮͪyѮUHs"QuzVuz|A�tkW$O?4Ȭ,^)"H}RP4ci4֯ۮI-?vG�­7�?V?D�m|O~k*kh'WeHoe"-'nAWr�`=S/E>�UҮ)ྙE{*4!̹ڻ
    <,/]U&�O?[G*a׾#|X!u~v]@/"+u{eF;G]n#_5_+Kpvm62q<bm1P;E5篚Ck/=�­7�?V?D�my3޽';BJ]bS[vŵmN&ETUB|w~/鰵WH\au%t"t{XN>n\_OVT+^I%|�z*ao��OV}2Ba^cKyC"xn5j(f
    pm?މgo�n�#ݮeo)Ԭdy_쏘(Sϋl,3+ѫ'},X$?/�­7�?V?D�m|OxYiMn)uu38IBF>]pwnhZ<S>/C=Σ5up^mۡř.Z^*hK71U&�O?[G*a|5_n_,iWR,sn"[Hd�m['ŏװi"5_mxv>D5R\խټĕ$@B2j8YI5}֧u1]�|M�EƟU&�O?[\cOMYxafS,"T4TPCv!orZx|_H'ҧxnI̠]Bܐ)JIivI?[ɵ{X.qKKW}:Y_�­7�?V?D�m\5
    ͦCq\6tcqb%s
    2pc2>&l*xY4="
    vE qg|S^,QacWB%Ic)ӜQ跉.f=7]B�[o,>4�=�­7�O3_mt{=;:7]Ϧͬ,Z}C,MhѾYj+?e*5审vukλuBUI
    ]8z֕(ʔ[v�CM4y3Oo��OV�
    X|i�z'�+kh^f_g1�#οV?D�mg(/;ڇ5OL$v*)ǖA<lkOU�5�"iNTlQQ+#
    (
    (
    (
    (
    (
    (
    (
    (
    (
    (
    (
    (
    (
    (
    (
    (
    (
    (
    (
    (
    (
    (
    (
    (
    (
    (
    (
    (
    (
    (
    (
    OٻMoWE^^!SH׿e6:�.𮓳S!Ŭ$KNn	<�j_?�Hu�?ᡦ_s~'wN,,mI dP$յ+\Oo5%"NԮ4$HcXd)0H<bjֿg?-֦gGڊnx==h㺊O27#::6{?^ּOun-%l4xa9l̗0$m[K"<s7,&|RݫZu2}ө�~8&<:ږu5ƹx&Ksg[kW̍4*]PF]z75WsCky(]Qp2$[wipP7�n3[
    xS__y/,QjvkLoV])oo�@>#|c^X4O2鰝5*ŲF1@)Sڳorޟ^�ۿuYx>f1dӡmEsΓ?}O_×Mb/K$8Y(/-YJJI
    piZm}y^?m)
    NR+R\H3nޓ>EA4>^O1(t[ݡ<i̪7X[ZN׮[5g-vm}῅~GN4=4+Vt-S̞WªFo^
    ]v_kzu' 774wH"
    H¯
    KuOk7뻯ͯRZjZͬڣiY+nȨ@w 7O%2aF/iZ
    PEwI-ʋ+<1D+$#9:vo<ϮbcJ+_?]S/eBn=*+OϬhD{iLHٜrMuZG-}ޤh1}4^A-DpWnrI$C�MGGuXmE(P]@Q-CFAult#r~o'&k1ϧ~_"M';_
    
    vW5g'Q̾^g|#Ѽ%�]kg�Sj	%MqrD&(̃x>^ҟ:֧{_S67EݶL2ɳsDŽAU_-C/<=hO&oi�\+M;.t{k~gܾn156[m`Ɨl|Aog}hmDcg<c<aKs>ohSZF/E�ߝ
    iHl	}vI-WWYn|ʼT$V²r#[xvV7eK3!SX"B
    Qq5)J5}*xt˛Y!u9Y]
    9VViq)5;Shzu<W>=CP廎"XuUK}$3mjQxN7ֽw
    _~6}UaXVmieeogj$J^F/#ffb{$k~?tg4kN^i.HHRHcT
    Y%c%ISΟ8~Ѿiz,�t5Dm67G$sՈȌ6_A|5A?[ݾa%ߝo&Ibxd<3[4sK!^JMWNFR7_w\[tgu>~6SkxnNi:AGy{�nUULV4Kb/mtǑE%Ĥݷ23,~̺+4B|Uk".V	R|G\AT7دO:υoujOnV=B7.So,$R~6n}:?en|Z{]S4|?v6Y3qusȲI+Ff8ɭ:O<?ď
    麷m!UѿHKIus_7~_fI3᾽atvڍjzgƒE\B[J/0D~4<__x-+e,kx햇'K-?qal(1sJ5=V6-J[�I-u{MG>,i'FZ(Lt4HL6c�n1
    8`OQg4ȴNt,`XbBY�bII|;S|]cy/6x~gծ
    חu:bþAm*Pz/e=@þLBAwtcGYmuЃyA;ݿ}--�&;߆jnUbrGOMpd\4
    |JahzpiO.&⻊'V9PG	/%<1KL'/uguHmhfeHg.>W-
    Ϩ|+tWy|tO$S@%D]! J?g{ۥZkb��Oxǖ~GtkK]Kk]H*UT.9ݽ]d*v>Y
    O8ث�+k5
    ^OL}x#"]EΖYF^ym!Cd}Ÿq>:�W�WשB1A5mi*_OEQE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�䟳wt$ng�~#ᾟ|H.-nuXEYZ@UyWNa)Υ
    oX#*+ο~R_6riT�
    �cO?WH$�(m??	?x/�
    O9G,qZ+ο~R_6riT�
    �]긏z-_?	?x/�
    O9G4O*^�†�Q.\Gs=iT�
    �G'/�Ci�(`#}Ey4O*^�†�Q�
    #��r˰}W�>EG'/�Ci�(�I�EKP9e>�og^u�
    #��H$�(m?UϷ3h:�I�EKP?~R_6rYv?WH$�(m??	?x/�
    O9G,qZ+ο~R_6riT�
    �]긏z-_?	?x/�
    O9G4O*^�†�Q.\Gs=O
    _�^U~R_6rxþ=C:+5@ZMwQ,Wbb�q=k"27]�"
    UҲ?tQE~xaEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/manual/images/chapters/appenders/appender.~ml��������0000644�0001750�0001750�00000140112�11377016712�032133� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?>
    <XPD:PROJECT xmlns:XPD="http://www.staruml.com" version="1">
    <XPD:HEADER>
    <XPD:SUBUNITS>
    </XPD:SUBUNITS>
    <XPD:PROFILES>
    <XPD:PROFILE>UMLStandard</XPD:PROFILE>
    </XPD:PROFILES>
    </XPD:HEADER>
    <XPD:BODY>
    <XPD:OBJ name="DocumentElement" type="UMLProject" guid="JEGKOL0wwE6O2Emy29kFuwAA">
    <XPD:ATTR name="Title" type="string">Untitled</XPD:ATTR>
    <XPD:ATTR name="#OwnedElements" type="integer">6</XPD:ATTR>
    <XPD:OBJ name="OwnedElements[0]" type="UMLModel" guid="Nu7ucmhxa0aC5WTL/Hl5qgAA">
    <XPD:ATTR name="Name" type="string">Use Case Model</XPD:ATTR>
    <XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
    <XPD:ATTR name="StereotypeName" type="string">useCaseModel</XPD:ATTR>
    <XPD:REF name="Namespace">JEGKOL0wwE6O2Emy29kFuwAA</XPD:REF>
    <XPD:ATTR name="#OwnedDiagrams" type="integer">1</XPD:ATTR>
    <XPD:OBJ name="OwnedDiagrams[0]" type="UMLUseCaseDiagram" guid="AOpe9EpUuEqbJkhPg6UN+wAA">
    <XPD:ATTR name="Name" type="string">Main</XPD:ATTR>
    <XPD:REF name="DiagramOwner">Nu7ucmhxa0aC5WTL/Hl5qgAA</XPD:REF>
    <XPD:OBJ name="DiagramView" type="UMLUseCaseDiagramView" guid="jha7HHI2JEmss41Kcx5rmAAA">
    <XPD:REF name="Diagram">AOpe9EpUuEqbJkhPg6UN+wAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[1]" type="UMLModel" guid="nzHC5ZSub0yOmXzqddVh7QAA">
    <XPD:ATTR name="Name" type="string">Analysis Model</XPD:ATTR>
    <XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
    <XPD:ATTR name="StereotypeName" type="string">analysisModel</XPD:ATTR>
    <XPD:REF name="Namespace">JEGKOL0wwE6O2Emy29kFuwAA</XPD:REF>
    <XPD:ATTR name="#OwnedDiagrams" type="integer">1</XPD:ATTR>
    <XPD:OBJ name="OwnedDiagrams[0]" type="UMLClassDiagram" guid="ucvrQjCCHEOMfGCAAc5zPQAA">
    <XPD:ATTR name="Name" type="string">Main</XPD:ATTR>
    <XPD:ATTR name="DefaultDiagram" type="boolean">True</XPD:ATTR>
    <XPD:ATTR name="DiagramType" type="string">RobustnessDiagram</XPD:ATTR>
    <XPD:REF name="DiagramOwner">nzHC5ZSub0yOmXzqddVh7QAA</XPD:REF>
    <XPD:OBJ name="DiagramView" type="UMLClassDiagramView" guid="sxIjWZ8eT0KTmxDhcr84UAAA">
    <XPD:REF name="Diagram">ucvrQjCCHEOMfGCAAc5zPQAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[2]" type="UMLModel" guid="dQlYoesWY0yxg2VJCxHxOQAA">
    <XPD:ATTR name="Name" type="string">Design Model</XPD:ATTR>
    <XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
    <XPD:ATTR name="StereotypeName" type="string">designModel</XPD:ATTR>
    <XPD:REF name="Namespace">JEGKOL0wwE6O2Emy29kFuwAA</XPD:REF>
    <XPD:ATTR name="#OwnedDiagrams" type="integer">1</XPD:ATTR>
    <XPD:OBJ name="OwnedDiagrams[0]" type="UMLClassDiagram" guid="jdoFPKplx0W53YpEZi95TAAA">
    <XPD:ATTR name="Name" type="string">Main</XPD:ATTR>
    <XPD:ATTR name="DefaultDiagram" type="boolean">True</XPD:ATTR>
    <XPD:REF name="DiagramOwner">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:OBJ name="DiagramView" type="UMLClassDiagramView" guid="oWGUMKWgOEus+/3Jqk/tpAAA">
    <XPD:REF name="Diagram">jdoFPKplx0W53YpEZi95TAAA</XPD:REF>
    <XPD:ATTR name="#OwnedViews" type="integer">13</XPD:ATTR>
    <XPD:OBJ name="OwnedViews[0]" type="UMLClassView" guid="tSxGyrwfEkSgp1EcheSXaAAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Left" type="integer">464</XPD:ATTR>
    <XPD:ATTR name="Top" type="integer">76</XPD:ATTR>
    <XPD:ATTR name="Width" type="integer">161</XPD:ATTR>
    <XPD:ATTR name="Height" type="integer">93</XPD:ATTR>
    <XPD:REF name="Model">Ec4V6xlK5USBInAfRT+kBgAA</XPD:REF>
    <XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="4OJodmUjvU6Oqy3fe+ZfuQAA">
    <XPD:OBJ name="NameLabel" type="LabelView" guid="nTnCIikI3UOMxs9QtoE1sgAA">
    <XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
    <XPD:ATTR name="Text" type="string">Appender</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="LabelView" guid="iOfigC5hM06553UhkG3o4gAA">
    <XPD:ATTR name="Text" type="string">&lt;&lt;interface&gt;&gt;</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="LabelView" guid="gAAMY35/8kO92uV18LmCWAAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="m+f/Nz96gEqfQeHGgfAxjwAA">
    <XPD:REF name="Model">Ec4V6xlK5USBInAfRT+kBgAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="ViAxcLeYxEC/QDB9dCuwagAA">
    <XPD:REF name="Model">Ec4V6xlK5USBInAfRT+kBgAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="gvxeAhX+WkGcvqw6KjlA7wAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:REF name="Model">Ec4V6xlK5USBInAfRT+kBgAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[1]" type="UMLClassView" guid="NaiNuZ1qLUu+5nZq2pgoJgAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Left" type="integer">364</XPD:ATTR>
    <XPD:ATTR name="Top" type="integer">384</XPD:ATTR>
    <XPD:ATTR name="Width" type="integer">361</XPD:ATTR>
    <XPD:ATTR name="Height" type="integer">56</XPD:ATTR>
    <XPD:REF name="Model">rzT262Z1jEeiLPfjq8YXAQAA</XPD:REF>
    <XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="3Qx0O28WLEC1wlpntM/QWQAA">
    <XPD:OBJ name="NameLabel" type="LabelView" guid="gLLmeDlS+Ua9NL1IKkZqBgAA">
    <XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
    <XPD:ATTR name="Text" type="string">OutputStreamAppender</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="LabelView" guid="7awZOkK3cUS1dBI9YKP2TwAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="LabelView" guid="LtVVLfcmbkq7TWeA6T7S4AAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="H/1viIm6yE20XaYIV5XQmgAA">
    <XPD:REF name="Model">rzT262Z1jEeiLPfjq8YXAQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="/LiIyuskqE6jkbei5roLSgAA">
    <XPD:REF name="Model">rzT262Z1jEeiLPfjq8YXAQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="LFUOQyCzKkODyDltdenqSQAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:REF name="Model">rzT262Z1jEeiLPfjq8YXAQAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[2]" type="UMLClassView" guid="82N1NUXIMU2s0JVvIgA33wAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Left" type="integer">428</XPD:ATTR>
    <XPD:ATTR name="Top" type="integer">240</XPD:ATTR>
    <XPD:ATTR name="Width" type="integer">228</XPD:ATTR>
    <XPD:ATTR name="Height" type="integer">95</XPD:ATTR>
    <XPD:REF name="Model">xVL+I0ePyEKePe2ybmIZqQAA</XPD:REF>
    <XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="MEOstStI0EC0RQoiT5DFLQAA">
    <XPD:OBJ name="NameLabel" type="LabelView" guid="CDkuaYXZDEC5+cMzdHsl8wAA">
    <XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
    <XPD:ATTR name="Text" type="string">UnsynchronizedAppenderBase</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="LabelView" guid="N/VzkXk9vkGTb/Gq05Hm4gAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="LabelView" guid="Wbq2KwFqq0uOx2yShkE49QAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="MbkisNcJq06fy8rfNf//qgAA">
    <XPD:REF name="Model">xVL+I0ePyEKePe2ybmIZqQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="bHWlSSp0L0KsF9iS2K/VuAAA">
    <XPD:REF name="Model">xVL+I0ePyEKePe2ybmIZqQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="A3o0HBZQP0+GUAIDarVM5AAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:REF name="Model">xVL+I0ePyEKePe2ybmIZqQAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[3]" type="UMLClassView" guid="uk+yKXVJ4kGbJp9tS5jKTwAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Left" type="integer">308</XPD:ATTR>
    <XPD:ATTR name="Top" type="integer">548</XPD:ATTR>
    <XPD:ATTR name="Width" type="integer">205</XPD:ATTR>
    <XPD:ATTR name="Height" type="integer">43</XPD:ATTR>
    <XPD:REF name="Model">yqvs3sZ9DUGqcZqP0JhEYQAA</XPD:REF>
    <XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="pd1JNpNdxkm4N3mMjABxcgAA">
    <XPD:OBJ name="NameLabel" type="LabelView" guid="Jfgvt5uhf0aDXP4fvB8FuAAA">
    <XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
    <XPD:ATTR name="Text" type="string">ConsoleAppender</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="LabelView" guid="x915MlraB0+hK5agb0HxVwAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="LabelView" guid="o72CPBdC2UGyraSt4vxsHQAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="nH6UBhoeX0KbQRIkAzLiWAAA">
    <XPD:REF name="Model">yqvs3sZ9DUGqcZqP0JhEYQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="Jb94kigpgUqu4dlcc+CGdAAA">
    <XPD:REF name="Model">yqvs3sZ9DUGqcZqP0JhEYQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="QxduxAxohEmCZQGHeQsZcgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:REF name="Model">yqvs3sZ9DUGqcZqP0JhEYQAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[4]" type="UMLRealizationView" guid="lL0hvfNl1UCp0ZckmzYqAAAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Points" type="Points">542,240;543,168</XPD:ATTR>
    <XPD:REF name="Model">MLMgV5lk30+73KeQUlkJ1AAA</XPD:REF>
    <XPD:REF name="Head">tSxGyrwfEkSgp1EcheSXaAAA</XPD:REF>
    <XPD:REF name="Tail">82N1NUXIMU2s0JVvIgA33wAA</XPD:REF>
    <XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="R+yIkrw1xkGRRmxo6cIv7AAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">MLMgV5lk30+73KeQUlkJ1AAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="MHt2cHh8nkq4xztkXeNA1AAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
    <XPD:REF name="Model">MLMgV5lk30+73KeQUlkJ1AAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="1cFzyVYsZUexhz9n3LRU9AAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">MLMgV5lk30+73KeQUlkJ1AAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[5]" type="UMLGeneralizationView" guid="fqotcKjEKUu0dHy5krCbbgAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Points" type="Points">543,384;542,334</XPD:ATTR>
    <XPD:REF name="Model">iGZQWONRSkmUZXwA2ctTYAAA</XPD:REF>
    <XPD:REF name="Head">82N1NUXIMU2s0JVvIgA33wAA</XPD:REF>
    <XPD:REF name="Tail">NaiNuZ1qLUu+5nZq2pgoJgAA</XPD:REF>
    <XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="a5TKNXnsu0Cm1O3vWK2A5QAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">iGZQWONRSkmUZXwA2ctTYAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="lfapsg0nvkOzLtKq21jKcQAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
    <XPD:REF name="Model">iGZQWONRSkmUZXwA2ctTYAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="J/CqIqCm4k64OiOc5XyUFgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">iGZQWONRSkmUZXwA2ctTYAAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[6]" type="UMLGeneralizationView" guid="Byj7ulJD9UmN+tawKGwCEgAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Points" type="Points">428,548;520,439</XPD:ATTR>
    <XPD:REF name="Model">AjD3odwWRkqn7DLLtsqSMQAA</XPD:REF>
    <XPD:REF name="Head">NaiNuZ1qLUu+5nZq2pgoJgAA</XPD:REF>
    <XPD:REF name="Tail">uk+yKXVJ4kGbJp9tS5jKTwAA</XPD:REF>
    <XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="HQiDhC6IA0iqlMhf1tdcJQAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">AjD3odwWRkqn7DLLtsqSMQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="npCChlHvbECPkeBWStHdGwAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
    <XPD:REF name="Model">AjD3odwWRkqn7DLLtsqSMQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="DNi8lqQWi0GHkNrHlB+wdAAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">AjD3odwWRkqn7DLLtsqSMQAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[7]" type="UMLClassView" guid="umRYCn2dek6PVCutQ7EHjgAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Left" type="integer">628</XPD:ATTR>
    <XPD:ATTR name="Top" type="integer">552</XPD:ATTR>
    <XPD:ATTR name="Width" type="integer">181</XPD:ATTR>
    <XPD:ATTR name="Height" type="integer">43</XPD:ATTR>
    <XPD:REF name="Model">fbO+5cdSPEmSXuXSqE8gXgAA</XPD:REF>
    <XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="IY/ehYDmxki8kSqbCHHCfQAA">
    <XPD:OBJ name="NameLabel" type="LabelView" guid="lcA4v9eDHUugTZoPU740LAAA">
    <XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
    <XPD:ATTR name="Text" type="string">FileAppender</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="LabelView" guid="OVAuCrBMykaCfcii7gDdCwAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="LabelView" guid="xiHCrB3qu0yBBg0U/q3EawAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="XJMRRQ4IvEKN76PkDbMKOQAA">
    <XPD:REF name="Model">fbO+5cdSPEmSXuXSqE8gXgAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="wZmHw439VE+zuefCYQQqVAAA">
    <XPD:REF name="Model">fbO+5cdSPEmSXuXSqE8gXgAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="PHqgEBQhpEmlVKbjkRedkAAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:REF name="Model">fbO+5cdSPEmSXuXSqE8gXgAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[8]" type="UMLGeneralizationView" guid="xnvee9U5202YS/ztrwJSRAAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Points" type="Points">695,552;574,439</XPD:ATTR>
    <XPD:REF name="Model">DwI/SvxrPEa+xlJeUNknVQAA</XPD:REF>
    <XPD:REF name="Head">NaiNuZ1qLUu+5nZq2pgoJgAA</XPD:REF>
    <XPD:REF name="Tail">umRYCn2dek6PVCutQ7EHjgAA</XPD:REF>
    <XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="oASzcKN58EuYmztjk4WiEwAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">DwI/SvxrPEa+xlJeUNknVQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="O0OgQK6n40urO6JVc74njgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
    <XPD:REF name="Model">DwI/SvxrPEa+xlJeUNknVQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="bgKTOidFkEeRLn6bk0KEEgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">DwI/SvxrPEa+xlJeUNknVQAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[9]" type="UMLClassView" guid="rHFGD6C9T0y5SMWPFgS09QAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Left" type="integer">628</XPD:ATTR>
    <XPD:ATTR name="Top" type="integer">704</XPD:ATTR>
    <XPD:ATTR name="Width" type="integer">181</XPD:ATTR>
    <XPD:ATTR name="Height" type="integer">43</XPD:ATTR>
    <XPD:REF name="Model">V4xOMUpxokyB4fxrQNJPxQAA</XPD:REF>
    <XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="OuAPH3aKlk2rg4cWgwv2BQAA">
    <XPD:OBJ name="NameLabel" type="LabelView" guid="BEu6SCte7E6fslLxmD8brgAA">
    <XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
    <XPD:ATTR name="Text" type="string">RollingFileAppender</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="LabelView" guid="diAZdqUjrUSnaEkyvki5HwAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="LabelView" guid="HpL3GnQOO0KyNABCTyAsRwAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="1hKuFZUojkuzeqX9AiWUlwAA">
    <XPD:REF name="Model">V4xOMUpxokyB4fxrQNJPxQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="g+GUofZEmU2lEM1VL3vLIQAA">
    <XPD:REF name="Model">V4xOMUpxokyB4fxrQNJPxQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="4HSOp+H3/ECJnOpzcIo3jwAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:REF name="Model">V4xOMUpxokyB4fxrQNJPxQAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[10]" type="UMLClassView" guid="0AQ8gdYUKk2Ms7nTdCyd3QAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Left" type="integer">820</XPD:ATTR>
    <XPD:ATTR name="Top" type="integer">380</XPD:ATTR>
    <XPD:ATTR name="Width" type="integer">85</XPD:ATTR>
    <XPD:ATTR name="Height" type="integer">56</XPD:ATTR>
    <XPD:REF name="Model">F1lk6TogWUGfYFH4FvBLOAAA</XPD:REF>
    <XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="h/ce/kieOUyyxRZ6c71fTQAA">
    <XPD:OBJ name="NameLabel" type="LabelView" guid="UZy1Qq+RWUWzR+BkMD2qBwAA">
    <XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
    <XPD:ATTR name="Text" type="string">Encoder</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="LabelView" guid="A/4/paNKfEeyuIjaeXDosAAA">
    <XPD:ATTR name="Text" type="string">&lt;&lt;interface&gt;&gt;</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="LabelView" guid="Y950eaGp5kKS5JcixC2pLAAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="lyHSH0gj5USAm8DDiVvc1AAA">
    <XPD:REF name="Model">F1lk6TogWUGfYFH4FvBLOAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="A7cLwlK4RESapHusUAalugAA">
    <XPD:REF name="Model">F1lk6TogWUGfYFH4FvBLOAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="qQCEnWeXyUaictLrSH/4IgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:REF name="Model">F1lk6TogWUGfYFH4FvBLOAAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[11]" type="UMLAssociationView" guid="lMmxZJude0e4iK5TJK4KmwAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Points" type="Points">820,408;724,409</XPD:ATTR>
    <XPD:REF name="Model">kXyf6+RLrki8M9yh9qd9JwAA</XPD:REF>
    <XPD:REF name="Head">NaiNuZ1qLUu+5nZq2pgoJgAA</XPD:REF>
    <XPD:REF name="Tail">0AQ8gdYUKk2Ms7nTdCyd3QAA</XPD:REF>
    <XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="Lpxx+3J+D0S223D5ODQq4wAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">kXyf6+RLrki8M9yh9qd9JwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="rhfNbKEGWUaK9KPGeno2AAAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
    <XPD:REF name="Model">kXyf6+RLrki8M9yh9qd9JwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="5lfzJsxzLkS60zCpNz5+twAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">kXyf6+RLrki8M9yh9qd9JwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="w+U1pR05XkeMT1rnnS2TcgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
    <XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
    <XPD:REF name="Model">KNPa5jL8m0SnxCPJDiLPEwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="G2JYoZaOKku0lwIKN7cKRQAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
    <XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
    <XPD:REF name="Model">JFP7YnD8ak2COLWe8jfBSwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="Wzm+qJkDL0+jgE0ioVsNvwAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
    <XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
    <XPD:REF name="Model">KNPa5jL8m0SnxCPJDiLPEwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="h/GU+p9gHkyMIIzW5Tap4wAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
    <XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
    <XPD:REF name="Model">JFP7YnD8ak2COLWe8jfBSwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="MLngpvqsdU+i4Djdsali7wAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
    <XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
    <XPD:REF name="Model">KNPa5jL8m0SnxCPJDiLPEwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="yN2upZx6REeZpBi/IRMnlgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
    <XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
    <XPD:REF name="Model">JFP7YnD8ak2COLWe8jfBSwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="ZVjULz2utUKwdUcoGweZkgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
    <XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
    <XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
    <XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
    <XPD:REF name="Model">KNPa5jL8m0SnxCPJDiLPEwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="4leicQixUEWISYBF6P8LSgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
    <XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
    <XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
    <XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
    <XPD:REF name="Model">JFP7YnD8ak2COLWe8jfBSwAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[12]" type="UMLGeneralizationView" guid="VGws4gb7FEGKDPIpXKW13QAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Points" type="Points">718,704;718,594</XPD:ATTR>
    <XPD:REF name="Model">MAm8gr3YDE+lxocsUB9afAAA</XPD:REF>
    <XPD:REF name="Head">umRYCn2dek6PVCutQ7EHjgAA</XPD:REF>
    <XPD:REF name="Tail">rHFGD6C9T0y5SMWPFgS09QAA</XPD:REF>
    <XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="2t9xQX0DaECER1G841x4ggAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">MAm8gr3YDE+lxocsUB9afAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="ZJ+e5yqWkkyJmgI5NCe9qQAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
    <XPD:REF name="Model">MAm8gr3YDE+lxocsUB9afAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="uWFySM7Jq026r7z2lz9/TgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">MAm8gr3YDE+lxocsUB9afAAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:ATTR name="#OwnedElements" type="integer">26</XPD:ATTR>
    <XPD:OBJ name="OwnedElements[0]" type="UMLInterface" guid="bL5DGTE1wkqFiYq+yJuTRAAA">
    <XPD:ATTR name="Name" type="string">Bae, Rankyoung</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[1]" type="UMLInterface" guid="PfW7flMvskqKmFDofejCYQAA">
    <XPD:ATTR name="Name" type="string">Jung, Yoontae</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[2]" type="UMLInterface" guid="XthOkDh0rk67+FyPgXCRgAAA">
    <XPD:ATTR name="Name" type="string">Kim, Hyunsoo</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[3]" type="UMLInterface" guid="WhfjywuM1kqS7RtEmuvAlgAA">
    <XPD:ATTR name="Name" type="string">Kim, Jeongil</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[4]" type="UMLClass" guid="Ec4V6xlK5USBInAfRT+kBgAA">
    <XPD:ATTR name="Name" type="string">Appender</XPD:ATTR>
    <XPD:ATTR name="StereotypeName" type="string">interface</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">tSxGyrwfEkSgp1EcheSXaAAA</XPD:REF>
    <XPD:REF name="Views[1]">m+f/Nz96gEqfQeHGgfAxjwAA</XPD:REF>
    <XPD:REF name="Views[2]">ViAxcLeYxEC/QDB9dCuwagAA</XPD:REF>
    <XPD:REF name="Views[3]">gvxeAhX+WkGcvqw6KjlA7wAA</XPD:REF>
    <XPD:ATTR name="#ClientDependencies" type="integer">1</XPD:ATTR>
    <XPD:REF name="ClientDependencies[0]">kjMmekdMhUCZp7nT1+7m5QAA</XPD:REF>
    <XPD:ATTR name="#SupplierDependencies" type="integer">2</XPD:ATTR>
    <XPD:REF name="SupplierDependencies[0]">MLMgV5lk30+73KeQUlkJ1AAA</XPD:REF>
    <XPD:REF name="SupplierDependencies[1]">kjMmekdMhUCZp7nT1+7m5QAA</XPD:REF>
    <XPD:ATTR name="#Operations" type="integer">1</XPD:ATTR>
    <XPD:OBJ name="Operations[0]" type="UMLOperation" guid="FRx7C/jgm0uUQ2KJbSES0QAA">
    <XPD:ATTR name="Name" type="string">doAppend</XPD:ATTR>
    <XPD:REF name="Owner">Ec4V6xlK5USBInAfRT+kBgAA</XPD:REF>
    <XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="HEOzMeB7hUCVhMMCFiMU/QAA">
    <XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
    <XPD:ATTR name="TypeExpression" type="string">void</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">FRx7C/jgm0uUQ2KJbSES0QAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="/QxGe2nRTke4OPZr6B8DjwAA">
    <XPD:ATTR name="Name" type="string">E event</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">FRx7C/jgm0uUQ2KJbSES0QAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[5]" type="UMLClass" guid="wrUqRmysaUaTNG+EIldTAgAA">
    <XPD:ATTR name="Name" type="string">Lee, Jangwoo</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[6]" type="UMLClass" guid="R4ueGs13U0uU7uA7GfQuwgAA">
    <XPD:ATTR name="Name" type="string">Lee, Minkyu</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[7]" type="UMLClass" guid="cZJpDMIhLkaN+6380nTjCgAA">
    <XPD:ATTR name="Name" type="string">Lim, Heejin</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[8]" type="UMLInterface" guid="KkLGJmfcO0y7keuSLh3xpQAA">
    <XPD:ATTR name="Name" type="string">Bae, Rankyoung1</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[9]" type="UMLClass" guid="rzT262Z1jEeiLPfjq8YXAQAA">
    <XPD:ATTR name="Name" type="string">OutputStreamAppender</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">NaiNuZ1qLUu+5nZq2pgoJgAA</XPD:REF>
    <XPD:REF name="Views[1]">H/1viIm6yE20XaYIV5XQmgAA</XPD:REF>
    <XPD:REF name="Views[2]">/LiIyuskqE6jkbei5roLSgAA</XPD:REF>
    <XPD:REF name="Views[3]">LFUOQyCzKkODyDltdenqSQAA</XPD:REF>
    <XPD:ATTR name="#Generalizations" type="integer">1</XPD:ATTR>
    <XPD:REF name="Generalizations[0]">iGZQWONRSkmUZXwA2ctTYAAA</XPD:REF>
    <XPD:ATTR name="#Specializations" type="integer">2</XPD:ATTR>
    <XPD:REF name="Specializations[0]">AjD3odwWRkqn7DLLtsqSMQAA</XPD:REF>
    <XPD:REF name="Specializations[1]">DwI/SvxrPEa+xlJeUNknVQAA</XPD:REF>
    <XPD:ATTR name="#Operations" type="integer">1</XPD:ATTR>
    <XPD:OBJ name="Operations[0]" type="UMLOperation" guid="Y/8ny1CDlUmGw7XO+p1IVAAA">
    <XPD:ATTR name="Name" type="string">setOutputStream</XPD:ATTR>
    <XPD:REF name="Owner">rzT262Z1jEeiLPfjq8YXAQAA</XPD:REF>
    <XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="o7mxtv1VFUuGMzTZ/PzpJQAA">
    <XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
    <XPD:ATTR name="TypeExpression" type="string">void</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">Y/8ny1CDlUmGw7XO+p1IVAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="WiQnBPlZNUKAb1kDr8rYMAAA">
    <XPD:ATTR name="Name" type="string">OutputStream</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">Y/8ny1CDlUmGw7XO+p1IVAAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR>
    <XPD:REF name="Associations[0]">CNBYSz/4s0OUBwR3Ujj7qAAA</XPD:REF>
    <XPD:REF name="Associations[1]">KNPa5jL8m0SnxCPJDiLPEwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[10]" type="UMLClass" guid="xVL+I0ePyEKePe2ybmIZqQAA">
    <XPD:ATTR name="Name" type="string">UnsynchronizedAppenderBase</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">82N1NUXIMU2s0JVvIgA33wAA</XPD:REF>
    <XPD:REF name="Views[1]">MbkisNcJq06fy8rfNf//qgAA</XPD:REF>
    <XPD:REF name="Views[2]">bHWlSSp0L0KsF9iS2K/VuAAA</XPD:REF>
    <XPD:REF name="Views[3]">A3o0HBZQP0+GUAIDarVM5AAA</XPD:REF>
    <XPD:ATTR name="#ClientDependencies" type="integer">1</XPD:ATTR>
    <XPD:REF name="ClientDependencies[0]">MLMgV5lk30+73KeQUlkJ1AAA</XPD:REF>
    <XPD:ATTR name="#Generalizations" type="integer">1</XPD:ATTR>
    <XPD:REF name="Generalizations[0]">mt8sHMuW6k6vvkswchHN9AAA</XPD:REF>
    <XPD:ATTR name="#Specializations" type="integer">2</XPD:ATTR>
    <XPD:REF name="Specializations[0]">mt8sHMuW6k6vvkswchHN9AAA</XPD:REF>
    <XPD:REF name="Specializations[1]">iGZQWONRSkmUZXwA2ctTYAAA</XPD:REF>
    <XPD:ATTR name="#Operations" type="integer">4</XPD:ATTR>
    <XPD:OBJ name="Operations[0]" type="UMLOperation" guid="QrizX1w8Uk+lWkr80819WAAA">
    <XPD:ATTR name="Name" type="string">doAppend</XPD:ATTR>
    <XPD:REF name="Owner">xVL+I0ePyEKePe2ybmIZqQAA</XPD:REF>
    <XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="i3SFY3XjzkqfjCdeRItB0AAA">
    <XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
    <XPD:ATTR name="TypeExpression" type="string">void</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">QrizX1w8Uk+lWkr80819WAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="rcsyT8SmtEaJWAgOu29ifgAA">
    <XPD:ATTR name="Name" type="string">E event</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">QrizX1w8Uk+lWkr80819WAAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="Operations[1]" type="UMLOperation" guid="G5EvR3IAqUWyIUSQT5iKfAAA">
    <XPD:ATTR name="Name" type="string">append</XPD:ATTR>
    <XPD:ATTR name="Visibility" type="UMLVisibilityKind">vkProtected</XPD:ATTR>
    <XPD:REF name="Owner">xVL+I0ePyEKePe2ybmIZqQAA</XPD:REF>
    <XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="BZo+omwID0Op8lvSMhrmCAAA">
    <XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
    <XPD:ATTR name="TypeExpression" type="string">void</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">G5EvR3IAqUWyIUSQT5iKfAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="0mhi1Re0mUaekyTApQtYKgAA">
    <XPD:ATTR name="Name" type="string">E event</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">G5EvR3IAqUWyIUSQT5iKfAAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="Operations[2]" type="UMLOperation" guid="noZlW3WOpUSNYP7MIP2dIAAA">
    <XPD:ATTR name="Name" type="string">addFilter</XPD:ATTR>
    <XPD:REF name="Owner">xVL+I0ePyEKePe2ybmIZqQAA</XPD:REF>
    <XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="7JBY4nyhIES1n0jpwFzs0wAA">
    <XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
    <XPD:ATTR name="TypeExpression" type="string">void</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">noZlW3WOpUSNYP7MIP2dIAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="Zd/8hSZIgUuOnnlNuMOW3QAA">
    <XPD:ATTR name="Name" type="string">Filter&lt;E&gt; filter</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">noZlW3WOpUSNYP7MIP2dIAAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="Operations[3]" type="UMLOperation" guid="+Hda0J6VTEGM7V6+m3aW7QAA">
    <XPD:ATTR name="Name" type="string">getFilterChainDecision</XPD:ATTR>
    <XPD:REF name="Owner">xVL+I0ePyEKePe2ybmIZqQAA</XPD:REF>
    <XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="b7Oh8zbH6kKEeryzkMlLQgAA">
    <XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
    <XPD:ATTR name="TypeExpression" type="string">FilterReply</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">+Hda0J6VTEGM7V6+m3aW7QAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="QFIz2saC3kK9QRns9gVVIwAA">
    <XPD:ATTR name="Name" type="string">E event</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">+Hda0J6VTEGM7V6+m3aW7QAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[11]" type="UMLClass" guid="yqvs3sZ9DUGqcZqP0JhEYQAA">
    <XPD:ATTR name="Name" type="string">ConsoleAppender</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">uk+yKXVJ4kGbJp9tS5jKTwAA</XPD:REF>
    <XPD:REF name="Views[1]">nH6UBhoeX0KbQRIkAzLiWAAA</XPD:REF>
    <XPD:REF name="Views[2]">Jb94kigpgUqu4dlcc+CGdAAA</XPD:REF>
    <XPD:REF name="Views[3]">QxduxAxohEmCZQGHeQsZcgAA</XPD:REF>
    <XPD:ATTR name="#Generalizations" type="integer">3</XPD:ATTR>
    <XPD:REF name="Generalizations[0]">KECSr2IcSEKuUekqxWFfQQAA</XPD:REF>
    <XPD:REF name="Generalizations[1]">jfTGxiHUzUynYKDudsAtlgAA</XPD:REF>
    <XPD:REF name="Generalizations[2]">AjD3odwWRkqn7DLLtsqSMQAA</XPD:REF>
    <XPD:ATTR name="#Specializations" type="integer">2</XPD:ATTR>
    <XPD:REF name="Specializations[0]">KECSr2IcSEKuUekqxWFfQQAA</XPD:REF>
    <XPD:REF name="Specializations[1]">jfTGxiHUzUynYKDudsAtlgAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[12]" type="UMLRealization" guid="MLMgV5lk30+73KeQUlkJ1AAA">
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:REF name="Client">xVL+I0ePyEKePe2ybmIZqQAA</XPD:REF>
    <XPD:REF name="Supplier">Ec4V6xlK5USBInAfRT+kBgAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">lL0hvfNl1UCp0ZckmzYqAAAA</XPD:REF>
    <XPD:REF name="Views[1]">R+yIkrw1xkGRRmxo6cIv7AAA</XPD:REF>
    <XPD:REF name="Views[2]">MHt2cHh8nkq4xztkXeNA1AAA</XPD:REF>
    <XPD:REF name="Views[3]">1cFzyVYsZUexhz9n3LRU9AAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[13]" type="UMLRealization" guid="kjMmekdMhUCZp7nT1+7m5QAA">
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:REF name="Client">Ec4V6xlK5USBInAfRT+kBgAA</XPD:REF>
    <XPD:REF name="Supplier">Ec4V6xlK5USBInAfRT+kBgAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[14]" type="UMLGeneralization" guid="mt8sHMuW6k6vvkswchHN9AAA">
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:REF name="Child">xVL+I0ePyEKePe2ybmIZqQAA</XPD:REF>
    <XPD:REF name="Parent">xVL+I0ePyEKePe2ybmIZqQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[15]" type="UMLGeneralization" guid="iGZQWONRSkmUZXwA2ctTYAAA">
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:REF name="Child">rzT262Z1jEeiLPfjq8YXAQAA</XPD:REF>
    <XPD:REF name="Parent">xVL+I0ePyEKePe2ybmIZqQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">fqotcKjEKUu0dHy5krCbbgAA</XPD:REF>
    <XPD:REF name="Views[1]">a5TKNXnsu0Cm1O3vWK2A5QAA</XPD:REF>
    <XPD:REF name="Views[2]">lfapsg0nvkOzLtKq21jKcQAA</XPD:REF>
    <XPD:REF name="Views[3]">J/CqIqCm4k64OiOc5XyUFgAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[16]" type="UMLGeneralization" guid="KECSr2IcSEKuUekqxWFfQQAA">
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:REF name="Child">yqvs3sZ9DUGqcZqP0JhEYQAA</XPD:REF>
    <XPD:REF name="Parent">yqvs3sZ9DUGqcZqP0JhEYQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[17]" type="UMLGeneralization" guid="jfTGxiHUzUynYKDudsAtlgAA">
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:REF name="Child">yqvs3sZ9DUGqcZqP0JhEYQAA</XPD:REF>
    <XPD:REF name="Parent">yqvs3sZ9DUGqcZqP0JhEYQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[18]" type="UMLGeneralization" guid="AjD3odwWRkqn7DLLtsqSMQAA">
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:REF name="Child">yqvs3sZ9DUGqcZqP0JhEYQAA</XPD:REF>
    <XPD:REF name="Parent">rzT262Z1jEeiLPfjq8YXAQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">Byj7ulJD9UmN+tawKGwCEgAA</XPD:REF>
    <XPD:REF name="Views[1]">HQiDhC6IA0iqlMhf1tdcJQAA</XPD:REF>
    <XPD:REF name="Views[2]">npCChlHvbECPkeBWStHdGwAA</XPD:REF>
    <XPD:REF name="Views[3]">DNi8lqQWi0GHkNrHlB+wdAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[19]" type="UMLClass" guid="fbO+5cdSPEmSXuXSqE8gXgAA">
    <XPD:ATTR name="Name" type="string">FileAppender</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">umRYCn2dek6PVCutQ7EHjgAA</XPD:REF>
    <XPD:REF name="Views[1]">XJMRRQ4IvEKN76PkDbMKOQAA</XPD:REF>
    <XPD:REF name="Views[2]">wZmHw439VE+zuefCYQQqVAAA</XPD:REF>
    <XPD:REF name="Views[3]">PHqgEBQhpEmlVKbjkRedkAAA</XPD:REF>
    <XPD:ATTR name="#Generalizations" type="integer">1</XPD:ATTR>
    <XPD:REF name="Generalizations[0]">DwI/SvxrPEa+xlJeUNknVQAA</XPD:REF>
    <XPD:ATTR name="#Specializations" type="integer">1</XPD:ATTR>
    <XPD:REF name="Specializations[0]">MAm8gr3YDE+lxocsUB9afAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[20]" type="UMLGeneralization" guid="DwI/SvxrPEa+xlJeUNknVQAA">
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:REF name="Child">fbO+5cdSPEmSXuXSqE8gXgAA</XPD:REF>
    <XPD:REF name="Parent">rzT262Z1jEeiLPfjq8YXAQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">xnvee9U5202YS/ztrwJSRAAA</XPD:REF>
    <XPD:REF name="Views[1]">oASzcKN58EuYmztjk4WiEwAA</XPD:REF>
    <XPD:REF name="Views[2]">O0OgQK6n40urO6JVc74njgAA</XPD:REF>
    <XPD:REF name="Views[3]">bgKTOidFkEeRLn6bk0KEEgAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[21]" type="UMLClass" guid="V4xOMUpxokyB4fxrQNJPxQAA">
    <XPD:ATTR name="Name" type="string">RollingFileAppender</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">rHFGD6C9T0y5SMWPFgS09QAA</XPD:REF>
    <XPD:REF name="Views[1]">1hKuFZUojkuzeqX9AiWUlwAA</XPD:REF>
    <XPD:REF name="Views[2]">g+GUofZEmU2lEM1VL3vLIQAA</XPD:REF>
    <XPD:REF name="Views[3]">4HSOp+H3/ECJnOpzcIo3jwAA</XPD:REF>
    <XPD:ATTR name="#Generalizations" type="integer">1</XPD:ATTR>
    <XPD:REF name="Generalizations[0]">MAm8gr3YDE+lxocsUB9afAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[22]" type="UMLClass" guid="F1lk6TogWUGfYFH4FvBLOAAA">
    <XPD:ATTR name="Name" type="string">Encoder</XPD:ATTR>
    <XPD:ATTR name="StereotypeName" type="string">interface</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">0AQ8gdYUKk2Ms7nTdCyd3QAA</XPD:REF>
    <XPD:REF name="Views[1]">lyHSH0gj5USAm8DDiVvc1AAA</XPD:REF>
    <XPD:REF name="Views[2]">A7cLwlK4RESapHusUAalugAA</XPD:REF>
    <XPD:REF name="Views[3]">qQCEnWeXyUaictLrSH/4IgAA</XPD:REF>
    <XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR>
    <XPD:REF name="Associations[0]">1RTpKQO+4U+uqZahckvNEwAA</XPD:REF>
    <XPD:REF name="Associations[1]">JFP7YnD8ak2COLWe8jfBSwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[23]" type="UMLAssociation" guid="u9/9xY5vOU2kSfX9AmlMAwAA">
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="CNBYSz/4s0OUBwR3Ujj7qAAA">
    <XPD:REF name="Association">u9/9xY5vOU2kSfX9AmlMAwAA</XPD:REF>
    <XPD:REF name="Participant">rzT262Z1jEeiLPfjq8YXAQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="1RTpKQO+4U+uqZahckvNEwAA">
    <XPD:ATTR name="Aggregation" type="UMLAggregationKind">akComposite</XPD:ATTR>
    <XPD:REF name="Association">u9/9xY5vOU2kSfX9AmlMAwAA</XPD:REF>
    <XPD:REF name="Participant">F1lk6TogWUGfYFH4FvBLOAAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[24]" type="UMLAssociation" guid="kXyf6+RLrki8M9yh9qd9JwAA">
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">lMmxZJude0e4iK5TJK4KmwAA</XPD:REF>
    <XPD:REF name="Views[1]">Lpxx+3J+D0S223D5ODQq4wAA</XPD:REF>
    <XPD:REF name="Views[2]">rhfNbKEGWUaK9KPGeno2AAAA</XPD:REF>
    <XPD:REF name="Views[3]">5lfzJsxzLkS60zCpNz5+twAA</XPD:REF>
    <XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="JFP7YnD8ak2COLWe8jfBSwAA">
    <XPD:REF name="Association">kXyf6+RLrki8M9yh9qd9JwAA</XPD:REF>
    <XPD:REF name="Participant">F1lk6TogWUGfYFH4FvBLOAAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">G2JYoZaOKku0lwIKN7cKRQAA</XPD:REF>
    <XPD:REF name="Views[1]">h/GU+p9gHkyMIIzW5Tap4wAA</XPD:REF>
    <XPD:REF name="Views[2]">yN2upZx6REeZpBi/IRMnlgAA</XPD:REF>
    <XPD:REF name="Views[3]">4leicQixUEWISYBF6P8LSgAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="KNPa5jL8m0SnxCPJDiLPEwAA">
    <XPD:ATTR name="Aggregation" type="UMLAggregationKind">akComposite</XPD:ATTR>
    <XPD:REF name="Association">kXyf6+RLrki8M9yh9qd9JwAA</XPD:REF>
    <XPD:REF name="Participant">rzT262Z1jEeiLPfjq8YXAQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">w+U1pR05XkeMT1rnnS2TcgAA</XPD:REF>
    <XPD:REF name="Views[1]">Wzm+qJkDL0+jgE0ioVsNvwAA</XPD:REF>
    <XPD:REF name="Views[2]">MLngpvqsdU+i4Djdsali7wAA</XPD:REF>
    <XPD:REF name="Views[3]">ZVjULz2utUKwdUcoGweZkgAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[25]" type="UMLGeneralization" guid="MAm8gr3YDE+lxocsUB9afAAA">
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:REF name="Child">V4xOMUpxokyB4fxrQNJPxQAA</XPD:REF>
    <XPD:REF name="Parent">fbO+5cdSPEmSXuXSqE8gXgAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">VGws4gb7FEGKDPIpXKW13QAA</XPD:REF>
    <XPD:REF name="Views[1]">2t9xQX0DaECER1G841x4ggAA</XPD:REF>
    <XPD:REF name="Views[2]">ZJ+e5yqWkkyJmgI5NCe9qQAA</XPD:REF>
    <XPD:REF name="Views[3]">uWFySM7Jq026r7z2lz9/TgAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[3]" type="UMLModel" guid="UTbE66PthkuXloDrctmmwwAA">
    <XPD:ATTR name="Name" type="string">Implementation Model</XPD:ATTR>
    <XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
    <XPD:ATTR name="StereotypeName" type="string">implementationModel</XPD:ATTR>
    <XPD:REF name="Namespace">JEGKOL0wwE6O2Emy29kFuwAA</XPD:REF>
    <XPD:ATTR name="#OwnedDiagrams" type="integer">1</XPD:ATTR>
    <XPD:OBJ name="OwnedDiagrams[0]" type="UMLComponentDiagram" guid="UJbtRzsKuEa7sZAmr/tDGAAA">
    <XPD:ATTR name="Name" type="string">Main</XPD:ATTR>
    <XPD:REF name="DiagramOwner">UTbE66PthkuXloDrctmmwwAA</XPD:REF>
    <XPD:OBJ name="DiagramView" type="UMLComponentDiagramView" guid="vo5SIJcJIUWJz7mqomMr4wAA">
    <XPD:REF name="Diagram">UJbtRzsKuEa7sZAmr/tDGAAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:ATTR name="#OwnedElements" type="integer">1</XPD:ATTR>
    <XPD:OBJ name="OwnedElements[0]" type="UMLInterface" guid="naDG3jNwKEqkpiKwcQF/xgAA">
    <XPD:ATTR name="Name" type="string">dsd</XPD:ATTR>
    <XPD:REF name="Namespace">UTbE66PthkuXloDrctmmwwAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[4]" type="UMLModel" guid="sbAEE91CXU+VbUQcRp4FwgAA">
    <XPD:ATTR name="Name" type="string">Deployment Model</XPD:ATTR>
    <XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
    <XPD:ATTR name="StereotypeName" type="string">deploymentModel</XPD:ATTR>
    <XPD:REF name="Namespace">JEGKOL0wwE6O2Emy29kFuwAA</XPD:REF>
    <XPD:ATTR name="#OwnedDiagrams" type="integer">1</XPD:ATTR>
    <XPD:OBJ name="OwnedDiagrams[0]" type="UMLDeploymentDiagram" guid="tzrsCrrbjka5umz88mdzIAAA">
    <XPD:ATTR name="Name" type="string">Main</XPD:ATTR>
    <XPD:REF name="DiagramOwner">sbAEE91CXU+VbUQcRp4FwgAA</XPD:REF>
    <XPD:OBJ name="DiagramView" type="UMLDeploymentDiagramView" guid="OlRAEhzdxkCw+mUnxs9v2wAA">
    <XPD:REF name="Diagram">tzrsCrrbjka5umz88mdzIAAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[5]" type="UMLModel" guid="mC0A50UCikqRZT73f5NgTgAA">
    <XPD:ATTR name="Name" type="string">Analysis Model1</XPD:ATTR>
    <XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
    <XPD:ATTR name="StereotypeName" type="string">analysisModel</XPD:ATTR>
    <XPD:REF name="Namespace">JEGKOL0wwE6O2Emy29kFuwAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    </XPD:BODY>
    </XPD:PROJECT>
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/manual/images/chapters/appenders/smtpAppender2.jpg���0000644�0001750�0001750�00000734777�11377016712�033065� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������JFIF��H�H�� Photoshop 3.0�8BIM������H�����H����8BIM
    ��������x8BIM��������8BIM�����	���������8BIM
    �������8BIM'�����
    ��������8BIM�����H�/ff��lff�������/ff���������2����Z���������5����-��������8BIM�����p����������������8BIM�������8BIM���������8BIM����������@��@����8BIM���������8BIM�����y�������������N��|����S�a�n�s� �t�i�t�r�e�-�1��������������������������������|��N����������������������������������8BIM������8BIM��������8BIM����	2������p���*��P��7 ��	���JFIF��H�H���Adobe�d�����			
    
    
    
    ��*�p"���?����������	
    ���������	
    �3�!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw�5�!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw���?�j6){+vח>w鬿Xw]/ݰK\)ʚzZ.(}E/}ks�Wp֚[oA-oWn6W"<g!�z9\$`,՟Qȸ\ѰC*v.:n?{?Q`*�-w?onKX�Oj'dN[FKxq.lNg�?|C?t[}L}",co>skV�ޢ*#)O̱t7$\n60X@Զkuk-߳�I|j>	ݠvNϲ˿Fߢ�Js~�W0Up?laЗ7N�BMF+Ɩ<hcGqfoU{hii[{ml�;+Q<_r�ӿ;�zt�˿tֶʍ!sڃ^5bڋ@cuO^x9hVr��:'��g�.�ބ?l�eкT\dR_ġ�xZ�<_k,_A-1o>0oxɩƺm!k
    u_eQ|>S_8Yu{I~yX$~8�ЄWGTaDxs<1dIGЫ'1f?qo�ӋSܫL�Nϧ��?/4GJ{uES;=K!Yv7vlo?ͷoenV>gBra>`~>�gUVj5ҝHn�5PqV(vo{�V6}Pv>,o?oڽ*=y9l�RI-m}:GlX1'nؼDi՝a̐78qtjӤ5/rHqޓG*B1��[n)pDozOmqlO?wo�se%w1_7Jj؞�X70q?l�a>a=jTvX!ݮD`omskՊ>>.,0FI[Wg�oSu'08=Lǐ}cJ��=:<|eVe81;~";ݱSv[02F;*N�?*g�ĭꖰV�c
    dۚ_s\`˩$9-u4};C_Xׁ
    z۷K�$J(Ȇ�Bj=Ukk0:D{75W�/_gUm.?MeYD'�|Fm=a5��=�Rė�\H�Бa~gֆִ@h{@�vC�$J|?gC_�F�r5auN魯ixwe�_q$F\[t^X�._윿Lw`	ײA�/�5gC�%W\qר�.8BIM!�����}�������A�d�o�b�e� �P�h�o�t�o�s�h�o�p� �E�l�e�m�e�n�t�s����A�d�o�b�e� �P�h�o�t�o�s�h�o�p� �E�l�e�m�e�n�t�s� �1�.�0�.�1����8BIM�����������Adobe�d@������N|���p�������������	
    ������������	�
    �	u!"�1A2#	QBa$3Rqb%C&4r
    5'S6DTsEF7Gc(UVWdte)8fu*9:HIJXYZghijvwxyz�m!1�"AQ2aqB#Rb3	$Cr4%ScD&5T6Ed'
    sFtUeuV7)(GWf8vgwHXhx9IYiy*:JZjz���?�L|K\#/NFo%"Lk}f2pGPsTgI"E01ƟB_wb/nRm-6;9KEۅM,3QHK,h-	%ZwGg7.sm˱[{`t"XGa;d,W(cU@&`ܢ[I'6JEI =\E�aR{�I)_]zEz??b{ko[:i.ڿm^7�oV;kpz^ac?_˦9n+�[mb8p8O}](7ʟ�F1e?�?Xn�Y?v/)�߰�!~vή�'�F{(K�={Nq۶�uw83߿qE�G_w?ݷ�>	ў/=n_R�^ӽ�a�C{6]�N#Qr��zm�Ϭqg~[״�?^�Mo}gW�=_zܿ�{�~�8m:�@G߸��e/�@;?׿n�Y?~/)i�߰�!~vή�'�F{(K�={Nq۶�uw83߿qE�G_w?ݷ�>	ў/=n_R�^ӽ�a�C{6]�N#Qr��zm�Ϭqg~[״�?^�Mo}gW�=_zܿ�{�~�8m:�@G߸��e/�@;?׿n�Y?~/)i�߰�!~vή�'�F{(K�={Nq۶�uw83߿qE�G_w?ݷ�>	ў/=n_R�^ӽ�a�C{6]�N#Qr��zm�Ϭqg~[״�?^�Mo}gW�=_zܿ�{�~�8m:�@G߸��e/�@;?׿n�Y?~/)i�߰�!~vή�'�F{(K�={Nq۶�uw83߿qE�G_w?ݷ�>	ў/=n_R�^ӽ�a�C{6]�N#Qr��zm�Ϭqg~[״�?^�Mo}gW�=_zܿ�{�~�8m:�@G߸��e/�@;?׿n�Y?~/)i�߰�!~vή�'�F{(K�={Nqq:�@/{ܩ�GʟoFq�ug_߹S{?m�Ϭ0߿rO*u?׿ӎ�Y՟a߿~O=T�7?�>?�׿~ʟ{?�״o�?^�N;o}gV�~?S�h?ߐ�!~vά�#�^*t��7^Ѿ!�C{8Y�FT��eOn|�~C�8q:�@/{ܩ�Gʟ{Fq�ug_߹S{?m�Ϭ0߿rO*u?׿ӎ�Y՟a߿~O=T�7?�>?�׿~ʟ{?�״o�?^�N;o}gV�~?S�h?ߐ�!~vά�#�^*t��7^Ѿ!�C{8Y�FT��eOn|�~C�8q:�@/{ܩ�Gʟ{Fq�ug_߹S{?m�Ϭ0߿rO*u?׿ӎ�Y՟a߿~O=T�7?�>?�׿~ʟ{?�״o�?^�N;o}gV�~?S�h?ߐ�!~vά�#�^*t��7^Ѿ!�C{8Y�FT��eOn|�~C�8q:�@/{ܩ�Gʟ{Fq�ug_߹S{?m�Ϭ0߿rO*u?׿ӎ�Y՟a߿~O=T�7?�>?�׿~ʟ{?�״o�?^�N;o}gV�~?S�h?ߐ�!~vά�#�^*t��7^Ѿ!�C{8Y�FT��eOn|�~C�8q:�@/{ܩ�Gʟ{Fq�ug_߹S{?#7#Ǥ!�yܐy��*#??ݷO؟?޿qr��@uz(oϱ?~��e'Q1׿v�c?b�~i�GmO׼=�c�>Ǫ�ۗx{E�8^�M{}T�
    �/)?^q��G;O;n_R_{7m=S�6'vvܿ�{޿/:nz�@lO߸?I�:_uݷO؟?߿qr��@uz(oϱ?~��e'Q1׿v�c?b�~i�GmO׼=�c�>Ǫ�ۗx{E�8^�M{}T�
    �/)?^q��G;O;n_R_{7m=S�6'vvܿ�{޿/:nz�@lO߸?I�:_uݷO؟?߿qr��@uz(oϱ?~��e'Q1׿v�c?b�~i�GmO׼=�c�>Ǫ�ۗx{E�8^�M{}T�
    �/)?^q��G;O;n_R_{7m=S�6'vvܿ�{޿/:nz�@lO߸?I�:_uݷO؟?߿qr��@uz(oϱ?~��e'Q1׿v�c?b�~i�GmO׼=�c�>Ǫ�ۗx{E�8^�M{}T�
    �/)?^qݙ=Z&ٚ9ku7W
    |SPxvٻ^|]-,GC[<<=
    �ͼȳX3+}rn/o}=%f
    eha]Z
    yw9m <5a$/q,Q 1jiL.$K ؉>MB
    r.=ݯm){9�vq�Szat7t1<}C+sɉj0u{K{T1TWejͺLV:	jE:!y;ygy8"Yo6I!wyAmw!ŕ;*-YY\29H/6t&}"PXs:;jMB,[6<V"
    ϿLJ |vlPU{TF&ϾvCF]
    2w&[tk
    *縼bw-~IVex|M5jH7zE/Y 'wXܝ_!c*~͓5>{هLvn:�jW~0,&ؤ%?wf|^|S
    n[`uiAM,,in٠9A[�[ŠkXd,V
    ̨Bm}lnۤhԚkxnRB@,	pGv.4{?qG5NfUdsES
    ؙ	e:)icRFd`#q>viy=w1@d3JіA*#r@J}~ls"m[$Uf]Jji*>g*(e&?/r8$@,9�`#_rȀ~ϤH
    4{-c-|9ꍳ{�({{OW=KeNt|w.\tUR9r?yo\'ҸvKyAIễhȨ�zBa{=}YyzY&VH`Q⦆FK5_EXOj�`_�w>??f_�r_�G�D�[sZ}W?ޞ5i>}7iN_Q_կ	ux>uk)^/]9_ТݻQMݙ`^UVEQ}TXagj08ŗX1TCCK-ZP
    HGGǷ܃U//lCyi%HT/2)Jʽenmn]_
    n]kcu{
    ;B.](3vg{;|oZ<X9.l!CSUpC=XiL|=>~߻sW0s3G;h],Sml�췑b5*<$!^B`q�o]D
    1Y@ZVёPRZ[{gQ휖iG51dQkbi
    etT+;x8:yUHKoW34oٺ놷*;IFddRjݭW`y^q%}HKpI*J1|YGn?ǮlcvGem]<Ͱzy!UM.GwIFHeW + ~>U,h]mn4P^[*SsHಕA ?,.gq{ݔLDCΈʤ)Eߌ?&zktc@bA7n:suWH+1{
    缶RUVҚ<ZC:U<r:Ex^M�p{ewu{Cp{ehQY!#@$.ԎXy7r?lo~"XaGka̅FvXgJ.;!֧:3+y`nأ-S֢_UTL37?r2L]9R/5j})OWFWA*=#~ghEяԈ%6V*	Xc9yύ#6^Sv�{{1[;IΩXnƢM޵}>+rFcXgBϭn͏|'(msbK,Mek,dMQm`i4)]ԛ,1lX
    IO
    Ĭ2j]
    i&ʾ=OSoո6?af+}Y
    \d;[EV%l:jGdW$=}hgɭ..'ޚCww]>vNѸE9wbf[ǂ(cAq
    i
    
    uqCOBw>Sf%íq[+wF5vu6
    ]łĢI+`~z}imw;4\{7oxk<Ĥp2|){ٿNLv5Qr5Orͺkm3FDZ/zw2޹5q}p?PczNݛnUM|ri6NƮmCzel,O<}~|"|$Knn	T%4r4klxʲ"TV_mK݅\fHT%j%f:dhkd}٘並{Sl1u9mɜnwI]Yd+fjT;yojl#oneU$Ɛ#ZIÍ##ЀZ�.}|3ݵH9U%˸
    !iFV?�2Gɩ*2>GUvLQ	&4hd[\83{"(ƈ](ǢSBhh0z:4h9#x.YGՔR#פ/|w.={llSoǵ}na)3XM˗j,"jjxFT2q{m[={)-3E,JJ$1*ʎʐzAe|׸]mgo#$Go3nIP2+TH||[ؿz){#'\ynzʽ0Samڵ;fVYvzSM\a`ap>ټ՞m
    k#\K{ru)<\HwQx2T
    i%򷳳MMess! #KȦ#!eXXw=	Ք}[\H˷i7t`90c#I1Ao9V7sw7>s?s\%Ⱆ܈̚d́&KR<9f{u.atQf@)%jZCfW\[eo/{;+~{3b/Exڰm/}o|MS1IhTKQf&幡HwQq%GKVkx3Ka!TWyf-N}eu\!n$rQi#HK*/G\yv/4fUT/_n-
    az1UxAr{sɲ{?hyt&FSY�Fjۉ.*�c \;lQ^PČ$̐O=䔽wٝ	3(Cxcf2_s7ܛcaQMS쭝E]MIC-�]W^p|\˻]cM8V\4V4EUM.Nm[-QNn]|R!+GXB> 2v�?3su&}͖m֛7'vf[톂M.X/a>U>b#_y.-LQƍ$C~AQ)9AH'j.k7Ԟ
    |m6uLZ9ʑlɪ6J4��{o
    guWՁ.6(_Y7vgƶN3m<O%~̹GgRN>>m�wQcvn',Χ± E.>]ѦiLFU##\`hB
    ޳QG2ԝO_wJ܆['&n?kdi+kz:f
    u+-y/nomxFy<
    Py'&`dIh1vlt9~"b}7!Ŕ2TnŸVdh*To_U_=ʼ;mG:E<p+p-T)|D7CcȻo<eIV9<Si+qw-kܖku!q#DѢHeôQ�N3!~'i}ݸ͍]QmiU8tÅ$<:Vuwn
    >>7%Oo)/Kx"=/)sdV{ܳq•)JIQ}'^wg|t0vVNx#[:#A[#%.2*դ	2:@ZNKM6b]i.&j%J
    64fEa3KM>^l9Xl76[O(7pkb+eV $i]N:(wE_VNm6?;kov.]={ܹ-zeZ1	Fr{.֛eػ2 S.Ĉ>x'Nz˵nplOc/0Bᘂ-K>[3/s޻s{	۲+ڻ/{�w.?fխs4x|U5RA"SHU{na?.Z:$QZ/+q(GeDW`]UA$o-vVܣgVhkiYw
    *M�+}-=/{+zY+qX{bd2tp$x=ъTVi#VE,<fΖ|nkaDcRp@4hzE;/ye40JIF:{�=?g>.~?q{Gٷ>M�RgN>O]~=</կOVs;2=uhîjx㧚ύ_"؝tuPW#q_M쌶�aF|
    Q\D稗%l"!>yqwX[%ėIg{Kf`
    (E$tNS渠.em^%so0Y`L+(Rt~QIӫS_~?fɷ'ta}MSShwm|4O\)*hKL}v#-.9d\syJ.1(<_10EYÒCf1|2xZ5aBtkQNvwXNnY`{ltxmA팭^O
    YM=rA4Mx*/ovfxl[I./-KQKwEYT7g2Ň*N5{ţbFe	*FP%XPh�i�x3gA~g^ϣ;V)۽YmݫtfNW]Lݹ]ml{{#G?kaIcyj'=e9cp?ol~Nq#nogs\I#-4DH.f@(Die_k`t]fvf9Q"iYasQG@)fT�p_(?vT?b>4Onc;;!/p캪M:'}c=ypgj2OFTR5\]}[�{?\asD/FZ[[[I594H%P/&sD$3E44$J6ezR0G+Y.<5?cU:1T=Uʜ44[[jTQ슭ɓCOALҽdwVrV|Ӷ.𒵂o;YrnVìFA
    wWeDd%s!	PIIS{ba~2o&߇|_Lv6Cuwn*;bݛvm͗۲nl%$[K԰%Wio}!ĦD@)4922)vbFO:\IDx^?eM@kPYjzL>=ߙޫ!ۓVGsuc~m}0Wgv;
    Qqte)Yj)Hڢ 7țVc[96ܱtKyoW F`UQ!hۖyslzm-$	o+L(	x�+te~E�/_? >0/?e똷>հ�^}AQmmwsE5MeY%4}r'=m>sFr;c5=&7x䡉$`ek@>g9K`c-D5wrSV*UK?3Swuԗ1O;lum>Źn+W˃sBj*#4."ܿ%l,o<ݵs-،i5\&	$YdQCPcZQ.]o~{>a$#D8yUJ!HvJƋɿ=dtog:>0tw}ڴOa?Q7U_QI&:imG#$]퇿\/5{5{'0mZ=Oq{^CX
    eJ(ߜOO#2웖ʐ:.;2=6[םq/)gwcz׻ksy\wm͛޻Gbf蠣xںN"(o_2|k˶^~5DAW3ZS5(=Ca>�OWطs[-NUx]
    ID[RB҂�
    OyaWֽA5jl
    AջrCz7<hbhhjŵ奯F7-d;H�vI6;'ޞ
    $VR37f
    @mmJymYobuO%rF6~lԛ:o;k_r/5=Q{k3{mL) _+Q>ߛy?涏vKxJ?JxBk�6yf|{K9	�HIde,I%u55@o״}oj>{@߼&�}z״}oj>{@߼&�}z״}oj>{@߼&�}z״}oj>{@߼&�}z״}oj>{@߼&�}z״}oj>{@߼&�}z״}oj>{@߼&�}z״}oj>{@߼&�}z״}oj>{@߼&�}z״}oj>{@߼&�}z״}oj>{@߼&�}z״}oj>{@߼&�}z״}oj>{@߼&�}zK� ~I]q[�ўoյ?xs_-�~7??׼g9�gxc3�K3߼
    g�k�%�{X3�5��~~{�o�F{?a�?^?~?�=߰�k`�?^[�ўo׵?xs_-�~7??׼g9�gxc3�K3߼
    g�k�%�{X3�5��~~{�o�F{?a�?^?~?�=߰�k`�?^[�ўo׵?xs_-�~7??׼g9�gxc3�K3߼
    g�k�%�{X3�5��~~{�o�F{?a�?^?~?�=߰�k`�?^[�ўo׵?xs_-�~7??׼g9�gxc3�K3߼
    g�k�%�{X3]ei|iE(#<=O|$\_`?{
    6A2:G'=k>AA?+m${#Ե$4×#AK[ÖVDev])ݷSct|t;,JDecD$~<2:F O=h?nC_5- #Nr曇=b+߄ޤ_}Cz|7fl]JtW5Xk)k)ZIEԎS	m._x.oMո<Vh9[b@WPBhMz{m"]r߶<DV6"}pBVhqPE@<:79_BI>AMw9*�lAi/[G^SuΗ�6�ډꬻeu_ͩӛp
    P
    \pş;o�ol7#nm/yBOI"YSΌ}i/iݹm[]a˛tBfvYGbA�F53s}u$OvX^Jx٤Va:WĨ@P=X7Qom?r']Zn|ۡφYKOSOZZ!:ISu4O]�~<m?-xgE2A$UYuɶV̼<vHeuY{W$iH|%x.َ
    !lLKPw]gm|w[S@so-)V4Z	H$*kom7K˝tߐ[II`r|5^B�		|Hyߍq坪ǒnޭK95%|C)0UY\7eGW2=*~7`kɹ)1Y0p].l=FhcYR93voy`ы@%CVzMeWޣwݶ�gxVrEYZxe\Rj#ɯ>_^}oi򮏋y\"cj)_Ѥ^l3&Юn{hdk|m.|^LE|sQe1kBjieV="Z{ɜWCkYI4*ZX0ឹ!w2?w3^6VVPG*)-C?ڪ~c|"
    gunܴt8߻Wen-$mb*$cO/Oݳ,l{sŴ39nTEt-\G<q(aiR
    ӧ^=޷dK;ibU
    TU̦)#*e�@Ff*{{7̢[2vڞ<XvYMՍG\m<IxA/7[^s˱Y;x3R5ɇJ:�B(`H}&&yN%"V2uji]e7M5#|(\˾>%/^~Yje>ص]$Mͷ0Y
    N}3q%Z镠ȯ/m×=Wfugvm顚+Cʑ~,\Jmr_\{O\g"r3m3M$PۺٚHh"Udî|B)Nx[ll�~Ta's{{7
    WFWhf1]̴an<t4WnmϽ~6r4H-%#
    cuR"YCf\o֛UJGI
    `x@oNa]ה�oݹ{i3�17~,�ov|m_il\:S>VSSJ(B~{Alז7MrtR(\ǷF"G1Y Gaw+{U۸fE]@VIYRAa%7YfJBo}u=_𝿊}=hyo&қ_huV59>~T&qQG!JOp=ͻyAM]՚K8m]FDEH	Y݈/y[F9nUjݴD@hy�fP9)
    :[x;*t$-7eKT?ps1]7ns1m2#qOnއwP؃%{
    yiVc.wW0s-x7WI S5WHdi-!	qrǾ~~\~ꏗjNVYY䀈"KEC!R5w΍Cao0k쟅wK|heՕMUs+an"*䍣dmϳ[.@Vk\5xnR;XmCknDH?w=ݛi?;xf4fhi5tH"i
    #0G	.#gaT]O~:wmw^>@dwzva3si툆Kbga1U	oKJaqvܧ)8vUBZ]*F/
    50ī=m{fΖ65ɺ3ʮ$HB+mDRDo#�Rt^?�"ٷ~c_vW~~YM
    M.MS�vd*SP[oܓ=W[@Ϻi-[uţxB2IxZS32,0`HHIsl%:Bib.I/#M-I%X@c,KIdY?y>_9~\VKm3Ey|mXcå˭R$kqˀ{iO&O~
    9Hĵ]1RrP$_zyo-uJ
    (x&
    r(2	#ơoM߷%rn{{$~_
    0{Ug0S`39<*Hbv7\ra-6]_kueoѤnn%Xf[{<HDSBTqD[G\g0wr[x]ΚƄDbWvh(/EO}+?eß6̢ٟp^DŽXޢ%5e͈ː)%dJHb>r\W-	eDxȩIo:2`6u/mk;G4o	2ũVu*(gňHQBՔWg=?Gzww�{{;6.n33	ltoq
    ǸtË>9OAIizEuo8{UŔ?O%ͱ7W{LMm$alee&i9:H͏s{|;[\ڞmynHko%tenxVON:_}彺[|@uUיu[H:f>-(wLv٫;(+E]50z>"{S{%m{ݮϽKX4Q4fwSE":+|kM8~l<.u6B ao
    Y#+jĊIcA_t;;_hu�lnNK=,na豘:jIhrR{w=r76[봋0MQlvs$qT+3e[$b:2[\/mrw.7t2]$jOAl[ugݵzg0ؼ!}]f;Twml~@nM˹*fg8,B_bps6o>-]I#2m<hJDs"tr6CfiP<&+dJx]>CwL?d{u�;66>=;;Uzulm퐐\nS<Ux餜={nX?�*Oek-K'4&A)RhH˲Ԅ:C7>Q6dvm-6 6cLI=aSE$
    6îtcur?ofqTm_nmls~WϘ922J*_o|sN˿muk[R}鬥H4"T8 v!$WY?m]w}sTݦ -KnE**ђY4J	/�NL|v�_T6|a:[7s#2e<|'/H28ғ6.ho_toW cno%GpB	cK
    G-m;F Y:4#$~+s;v)!$RO4vGdtv�lY:SUTN8: {C1o	YӊMۻz|&
    XC%NF:&DY{gzoiy6mzG㰼mL䮳mQBx+>_+e~b&2x(̲DӰEO(
    )!X
    ~Ta>sm	Q|m&ܸ~<N܇iŜ[ov0ωfU\~ٿc6({z5;v<(#ZGticGa]5"Cwopkx7E絎FW(&[w@!\*i�Uw&>ݟ˫zN|-ёەT5U;|f?	**f؟m�>�;.So۝aK{	m-㰍6UI*Z	KmD
    f`oknZk[3`neJѺOÚ/|=T~�+&AGEXmظɶ>wpQU{9
    ~.u*G6a}/lln/?vøW\\^Z-Cc{+,mx_۫>yg[x{hXa'Vͤo
    m(JI#2m<+ǩ>AtT#}bY;kzCblz2["M~W
    GHq<G&pssY6_ra$ʖC=ckKwԪ.![[.4mNh+O|wz7>NLokW6oV#@Ca|;Vm?lfi~ Sw1?]_w.ө:	t5KeGch*|e~<͵GsAw<כ^d4NKM*ez+Lu^{XۄI>׺\;[+ķ*FE;P\j@5N=ޘYxo
    '-~CG8e�Wz9w^,>WvVAIEE%Tp3F{k͜,>˰jʱR[XC
    ިuk&X䐳Kԇ9S,y6bܢeDHJWKfZ=q�0Qd2vwُi>
    ^g2\sfma:8+A3;vrIZo.s{�<y�m;I
    7̞:lۡ6Rڭ
    0dIW{=m=ϖ̈́W
    4O3,kZA1]i*4І |�M7oOg^/iAvOpt�n6OIE7ؙ:jr~&*`ugVeP7m?ž*[06#}>}ZW>'L<?zݮ[3sR6ͷa4.Le%f)cDgU-	H%`|Ŭk=gJ{ބ+W;vfJ/͞7_lCxm|/bV<8ZzjZB	sgvja/^;vC8xFܫ^GDfQʳ/.Zn[&ٸ2[DKRHuPƭtp>B�0^L7U{/7^_cvܻCv<}G2n:-L̺TB5�[v5y�f7h9Rk#u;$M%F@QFnxaܯ6kO>sskH`~8[*yN8VSziv-V|M=mgN
    b
    _3SSIHqbc0Geܷy9n�Zǖ,b6xd	 h֒ ֲ�2$.5Gu]:%`ؑp]؈Φ
    m]zǪ3Y<99{cpb4CIAQ&'1se&dT>Ye߶x-)>RW]$iba+m˶|;{Ÿ)mȥTW2TT4+&	A14';_vX`}iu*w>n}UCo;lb֛ml&Ysyjt]RT(fӑ9/\{C_s-ٴ0+F qKJXbt geR86N\g7~aRhWhC-XtD戀vTV`|S'H-_I._E8n
    ՝WjK4
    Y&bSF>;^6[quib	oўȉ"cԵ/܎]�Yom$'1K|kñ_\pV~@|G|9]u].CPSuJ-�շtUSAEYR<s5lnfTo3iwFIV+ks9f{s5+x	o{3ڝ}-yߙ~a!^2-n'%H
    ?�Coξޙ[Ww6kp�,*O͕·3kXwTVE7JG={XԬw�0	RkO9+$BXRҢ5߻hny^$^kv">\bw;7m\Gxa|O1E
    sx'۷3Ǘyݿ=\z*kb=B/$siZZ_I=*],%$u	sT"G&<s'/YK"\Ki!WkOYGzl>_)z;?崷~LCm\>h7zl*\?RBoWmycqٷ)vպgS
    -7!5D]6@Ki6Hַq\$w(bi`uũ($2ҫ{F3w=?ԝ޿͇Io\ͧ~8�7-v9]Pô3{'q	RA$2yCeyJKM=my<	;kqq4pCKOK(`Lz)߻{m0OSQHA7F@Jehy#OSJ^	;1;9wH]'?0]M7<8Z{qmє[S?[)*xpϱsw{k/mez~c[c{r )$_Y!E+a9k*[_^I<>VK}̀,&>[Q]ȯ#oFen;�om]yܔو~eU={rxdp:	wwD9Gyu/aݹy-.$Yi7(F
    O b$t=>y{ZLqbܡ?ߥ6?O7$"@ß~>u\wOxsuP违#ؽX�ػfI6>Vv`n9w>zb6~&Yt2Oo.io?|rn\Z}xm.D@N^$gvxcfecId?[|ܻ2�Xm7.&Dʯ
    #(ʈCbwO">NvϚfݏ9\sl^{G3>]Ɇ32KO]GKWLXQwn\c�l{m7-(g@$uVS	Ve%H&ǚv^p6m+YhVZCPsPB1/g`?}S˯ue�S|?˯~_^/^=O.՗L_߼?�.z~]{/?x0	]{?V_1~`ub�x�'uC�Y�_=O߾�W׿�{׿}S˯ue�S|?˯~_^/^=O.՗L_߼?�.z~]{/?x0	]{?V_1~`ub�x�'uC�Y�_=O߾�W׿�{׿}S˯ue�S|?˯~_^/^=O.՗L_߼?�.z~]{/?x0	]{?V_1~`ub�x�'uC�Y�_=O߾�W׿�{׿}S˯ue�S|?˯~_^/^=O.>֕E)ޅ~S�cWu/sow>?o+f_)~ko׿|?ݙԥ�魿O^�ve�m�R禮={�3nٗ9J_;߾?+f_)~ko׿|?ݙԥ�魿O^�ve�m�R禮={�3nٗ9J_;߾?+f_)~ko׿|?ݙԥ�魿O^�ve�m�R禮={�3nٗ9J_;߾?+f_)~ko׿|?ݙԥ�魿O^�ve�m�R禮={�3nٗ9J_;߾?+f_)~ko׿|?ݙԥ�魿O^�ve�m�R禮={�3nٗ9J_;߾?+f_)~ko׿|?ݙԥ�魿O^�ve�m�R禮={�3nٗ9J_;߾?+f_)~ko׿|?ݙԥ�魿O^�ve�m�R禮={�3nٗ9J_;߾?+ΦPTH Lצ=^">7`͝o�B1.۸sP�'Y?d;?eխN'�+p=U1YIژ|vE;)JxggUؙ|1{K[rԗ-ܩ4FHZTF!/E@BX�#ͼe[<績c}/0H@
    ϥX@=S7ͯt4�w#D#b/Ӌ�}^O`=۞QB4xqtB]
    [�}ӻ\eUp{Wlu$upO!'Țm=nFQ㨤OIJ#1
    @rzݳb[kx#Y?`XSwS֬Dkaa,vj"oc@*@	<�'ս1Vo�,"�ڝyTَe zO�Gz-mh6�h3�ۛ;'w|ʩuサݽ~Cxlg�cuQo,	tmJȠzu$D +K%[<ǹW_O+$Q@5k0\F"EV%uEvg}|6n QeTwxO/�6ѲY힓ٝɼ;�m<r13g2R|%jJu5=eGdgDY֚<�piDF	>c~w9}vv�"!vT	P	[Muhzi?O_t{^j>,;4VA,(Cyp(d^?O_Sdz++9vU6fv6brc{Ÿ-
    *)Ul:
    ^FU9IJ,o0"kU	ƬKi:!(M<s%k{A'󔗿x8�r,bM&%%[7>
    j-_nv흧umg<e>sdO'9>Z#wjڙoh{y\cittv[+!ȋKxeYBZ*C;w}oK=mliYD	Y"	V7%HZ
    vE>˟yW;进Wqk{�j]_:SL�oS�/><=3J|^Ҭ�~\ٕ|hmڕco9\=W-}VɥjJxٛ͢~!b0^mfɛh&OJե9?q/Y䴕|Q
    k,z*ۨ
    CJujԨ�]nG{s<[j[}�tGH!m;2ʳZ�OSi#THڗC-_W7{h/׶�I?{+"U{?ם=>w݄_p$�~�l=8tth:k�mc�j?2�o�Ao=�*{_hҟK&Om�v(2ܿr��g#X�9n{1Iݟ7c6~%FG[=68
    &{OgV.3-R \7/sVWݘv1qpkylB2ˤ<uHG}=
    mohVIj>4fe$aPiWJ�G_~ğx}/ܿ퇠	b��j?R�o߿A�"{_hG*Omu�(2ܿr��__dOk�mx�)o?R��߽|֞�rz	~�ѕ?=uio�x'_�?_[�//2'��
    -?��߿_?J�ҿr��_<?r��
    -?��׿_�ƒ'/a%�FT�GK�4'_�?_[�+?2'��
    /���׽^?0d�~�l=h}?Ok�mx)~��׿^2ܿr��W_dOk�m{_INm{?uWpd+/a%{�FD�_>�e.K�t�k߿A�"{_h4P�J�G_^�{�
    /�퇯s�G]K�4�ĩ?zv�_y}I�rz	~ѕ?=u4N�K�Go^�w�
    /�퇯s�G^�i.Om{u(Rܿs��W_dOk�m{g%��m~��
    O�IO�9L�4Ĺ?z|v�y}I�rz	>b'��iOR��׿]�…'?`$�FD�׿u\��׿]�…'?`$�FD�׿ᦿp�K�Go^�s�
    /�탯sG]M�4?z|w�z})?_�^�'?2'��ir�k޿�Cu}�"{_h_7.Om{u�O׿ILS'��i)_�^�o�
    /�탯܉�9?M�4�r'O�_9?_�[�#O2'��
    7?$��Ͽ[rܿs��GdOi�mu�
    9?$��Ͻ[�‡'?`_$?刟:4L�L�G>�o�
    /�탯sG^�i�g��CuHPqsG^�i�g޿rܿs�>b'��L4Ĺxq�?>��d�2�{Oh'Ĺx��X�O ?퇯sO^�i?r��[߿'n׏'af_i�m=u�
    3��X�O ?퇭Odž̿z4H�K�G/�_�
    A^�#~?sO^�ir��[߿�'n׿I[�9?L�4Ĺxq�_~}�I�d=�*�{Oi_#._?k{uo(�l={u�̿z4H�K�G/�[�
    A^�'3/��h���[޿�l={u�̿z4H�L�G/�W�
    /퇯sO]M�4x|r�}տI�d=�*�{Oi2_k{uo(�l={u�ʿz4F�L�G/�X�*�{Oiӟ2_k{�u_(2ܿu��?�e_i�m={s&K��mo~���O׿G_�9?N4ox|r��rz�ѕ=4F�L�G?�'�Au=?_i�m=x�)?S%���>Pd�~�lov?ʿQi�m={w&K��m_z�}?�r:pʿz4F�L�j�O׿G\=i8�e6_�j�O׿G_�9?;Gl<>9�8O�
    /탯W-?᧿/l<>9�?u1�O׏qܫ�9?O�4Ox|s�p/)?_�[�݁�,U�Oi�6_�j�
    O׿F`z4�D�M�G?ھ�'�Bu�*�E4�D�M�G?ھ�'Buz4�D�M�G?ھ�'Bu�*�Ei��x/�}NR�…'_`#{JQi�m=w�
    ??e��_P�~�lo_vȿQi�m=u�
    A?e�?ھ�'q�\)?_�Z�݁�,U�Oi6_�?jJ�/탯+i�=_ܧK��m_~�}ԿI�r:ѕzʋ5ɿ㪋;IN	R<=Ót_uݳ�?潡�Q4Ŀ�g�OnտDSZں5I�K��Q$�v�l={Ou?�U?Q�4Ŀ�g{?bI�rzџZW^�i>;�8'K�
    $.퇯�굧u5'H�L��w>_Q$�v�l=x}=<6i�m]{�&s�;߿u/(ܻu��g�#/�c�'p�\Y?]�^�_3�kOjjO?S?9w�p_I?]�^�_3�{Ojԟ3�c�'�Eۯ�?W�'G_<87D�œۯ�?V�'G_<87C�
    ,.퇯�^ں&s�;߿�u(ܻu��s�{OjԿ3�cǏ�'E۷�?W��h<8G?�
    ,.ݿ퇭��꽟u5/F�L��w>�rz~�џ�W]S4a�r��l~�}��rz~�џ�W]S�4_?g{�On׿B[�^ںS8��w>�Q�v�l={?uG�꽟u5?E�M��w~�Q�v�l=ou�U�S�4_?f#�OnֿB[g�m]{�&�r�7߿t�(ܻv��g�׿?'o/?}NN�'˷oa!{�Fg�m]{�&�r�7߿_t(ܻv��g�GT�4A�r��l~�ӿI�rz>џ�W]U4?_f+�On׿A_^ں5WC�N��o¾Q�v�l={u��U��'_f/�On׿A[^ں�'r�7߿t�On׿@_^ں_fi<.ݿ퇯꽟t2lmmI_]q{n	jO~lD[Owc9]ǵ'N|}atC)dHbw}u=-ŻmWy#xvky)$H_d$ʯ"w~u(nT+!+UHqY\x"BȤ),?ɳy�?d5>u5O;We˦_hp?3~�C]WX
    ;vɭϻ>͢2n])76%͎
    QUH
    a7wHF͟ymymnvʂ9;I"Y%J xٔ_j/q{gmۮ	M"xAZّC�CN+vٽz';
    >Cbv{dsy:gnbsϧrYM_r5Ij5z95}~<ſ_s�07>v_̐CB"g#I|AZ9_ٯ{kgؤ䝯q\*]scH&vfM:S| *ɯ{n�{$y_$??f	&Y�}UG�/�?ҝ6켾#*wv?vPMsQ_4{{)^lnBCIUTњKUSދ7=q揼o3}w0[_msvMl^W@²$I*3$hW{mݵsyC,i0;ʢʤEbV`^q?�'?G6ci^o"kn0tݱtM!AU(i
    SRSC0_S笠2n$7"l띒Mfdd!’*I/g=G}kT-[F{0jB(K^7}W-;-D"�^}S}ۿo}_އ^wۂ^Wm�-�'A`ifn}�æ##viؼw}a9=ˆy�w<٣,1ՙ
    
    Iy(LY
    kos�7S@G5p`Y�Fv1QMF~>Q6	D6�hT򏤊rzs7}?>淇OժW\/׫<:yJҜ|uO�0ǁ:GZ|_)L;?$�ߒ~
    ښ��ںo�k[_U]38.ͅ]}!_
    zSjL|8QSc5'v8.yLsJ
    #
    Nߛ/cp[{o;me]6s#wVjH2s/h`}:SCѵN]ֻoxm\~ݛW#5T5>
    <dnz
    S=/AE靥ǾIvWnl.F
    �_қWzf>cWwނU;Q	sWOH`1l-Sm uu6IC#1!ٻWs/zY,3<V,tOp=[O>|pY7W⻃``zx:1+wn.vՠNNJlOȬ&Mۉu{}um jj:z:czE8_sm~m3Ns:i).>!odWEaޝʲDj$t]ztR|;g=_�e#Mڛ�wSlݏugL|G 54aa̍
    0Kck~�ʮW�hK'ʏc;m]ֹ]ݫ,'puWc亿Ϳݑݔ|
    f<fs#lvkIQ[]lt.bwV9
    ՇnLs-3W{vO!wEf{ޓm**vze,F^::yZ:CL2>_.A|}{#PӠ;݌3cojn~^؍&])֝m6_QhN_p}łÑU͞qY=NQN=0|ꝽOy|>SjgA|ퟏ7n
    }Sj;A
    BA[9JB:tfWn_OGZH-zCwv'|>!wctF*
    ׯ~;˹~>
    Ѣ�H]
    �CqOWb:{Oc(k˭OV)_Ǭvu&sv&uo~>pmMɺҋ3>m㈒:ʺ(i2lEL%T"�g/=ηğ/�Ew�F?�F�S�r�Zt,awpnXL~\
    >썛
     u4uuf}鷰5T$utPӺeh\Kmߟwf.ڿ5$nA�ҷam�9cM/BݘSL48Uk#hi)Qֈ=}s{Ɂ[/y`phnSm9YiiI#vFV>ǭ=?Ul`J~J|r쮜zO%ާ잹5C2=C;sru^;Jn|V{ս)[61pSeKyGtFo_Rg;b`)V?cplYܩܛ(3oMX#+FT_\zgDo|h=v'R|!>Ln>k{5kvCVc<1]5E
    %^:
    }A)tU#?Zzgz'nخ�;e;W)kwgnr?39U&zIV:z$d	,e�gvdCG]WAzvRWr2t{_7@A)V=I*yki*x|iA3O]{=}�:d>�>Cջo#e߿Ļ'l.o!5cUB<A] z|aٽ~Ct^nc_i}^{.ECd*$=lԭ<*x8t|~m:ySU9ׇߺu?~m)Ouu"zޝnSK�aӯ6N:Oޏ�:]ZzG]{^vHXN=˭{>]k׮'}x8{I4p?[:�{Ǯ~xun/^~}{޾]k\Gz:uq׀0M?￧zu*kL99�zև ?:L	NXӮzpzߺ]uz=Ќ_ߨp|�zwp�^JGmo~UCT:GV*\I{T{V~QשA[]
    Wu�.^�OV뻋	=j-O[tS[:͇Ꭻ =q^돽=oʞ}t_~~�{
    OW^ߘ:'>:{5[\��~X{Np=x_*uսuO>N�czߏ{u덏'>}׭zGoּ\-~n[ɹ�a=huߺ]{Z~n׉{Z\r1Չ:}X
    8
    =kf`idúu3<5lTf`i*)#Rt8pW\HEą Q	-|JPhsǟAVT;S�^�?w㞯wڱ?ܟNBsZ	`kW;iqL@ƴO[n#GǍg(kt/g�I ib:6f#\7*H49TGUzׯ7�s��zw	�~<?�$��ϒ~ǵo+}gcjջW�U|m?')vwn�fOGB|t{ȿ_
    >;Sb�	ڝO*0~\u�j.T5
    V=#wgOGu6Wm|Q8wP?>]C}S_3w`	27o-?0oE$p��7VO}[Y"s7ogk&_ɟy
    lm]G}kTvo6S䎥vqmGT.lktꭜuNl,-_{Bq콙ԟ.{Xw~?.6'k8b+s�
    J|Q蚑=wE)Aew^Nug?>rpn]> {gbtn|(;ӷpomUwf闫*3)TTWe=S׭`~·lNu&{2w~ڻx6|to/ՔylOwUܘLfS&Dl�A=Zaz=Sn/[o":󸗶VRon߲t?Zo
    ]Zcy%ۙz|rFյ}=C.qjzmr>m|wN?qOn}ô{cJ\k|X;Rz`[1zۙ99E�)+ռ3[WSgy[,Ʃmh~Ob��2{8``�/nڛ1[(^ݻ?5vF:-]C<�Gs`vF#vrunwfG{>N?=7vmvdeu2bg)|:׉Ua+S7?RV۽{N>I~:3_wt�~z'_?!wmԛK/g𚷫(ro)un?н[*O}s&۳_5~#_;z1ӬJ�W.uu	Rjzޏ:AְUҿ/qߓ*7uko1md~pGK}nٿmNVmYݕIIjj|iA>Wd;=odpg̯A?ϽRzz~\s(wVܛiv缀Z:]>|m~vn|ڹ==ߵ,7?v;v>r1e�6<NrӮjPhhu͸h^*:A|W_)~V^�Ǟcw-ːɏ/~1unڿ*Mqq�#MׇTՙ驲-L:+5k7ʝW�uG{4cvF�OۛO?08;_s�
    ǔ6Xu|?_G+q.Z=pbvcGqv-GQ۝_oz
    ſ*+3rc*7^PTe` du6G^>nnz1'wX7WoFy|n
    
    meN+SᖱE[E'{/.KS6]|mܻ|^Q_!W8g|6N=?rTUVv
    vs).Ŧ`3I<Ou��Q_)jr,_Uo{ot$u$h4uo`ml(ei%jmQ5p᩵_g^#g!O݋dO)׻GU?7[O?ٌMCenޮ�{܏ywv_%*͸r5^'#fǺN^WU|n�')w^�fGOC|ؔ{~_
    _>Sc	ڝQ*0
    ~du�j-Bz�uZEdR^#vkx�4_僱Ww'o�':3>5~nl'鏞X,-,Jt,�97el~i|h[{[c_sIYNۿ!{o:##6^شyF.deA�uǭ�׈\ޛc[]n]}9]7ëy�[=j?>GV@q_�}^]~-9@P׎@xî6Vր]zuo{Z?	'Wcׯ`zzsG=h{UԨ޺3^
    z{^^5zl֠?{:<�׺^#}kREhi]?'ޫL	=qO^{[3׾{Z)ׇ^}uz:k_}4V"zSg?^zb?^_g^:7>uċ{T{I֫t{^=q?O[=w{yuu�;k^8M׉@W$^�VozMzߟ]7ׇ/ϿSWv[zoz=z덏'xun.z>}T֓Z8�okP|Bz^?R7?=֘^8ވ\}ZzqN�xCׇ]A}WϮ��qI�}�{ׇu`u4뇽un{ֆ^B8^uoϿzufq>GWOz{8Dz.]%{Num]
    ٨٫)TQQMNjxZ/f]5;ikJTq$&'(VEJȿOtûmɀݛ;jlnݯ<utUʸ
    *LRq9vy\Zx`!yB[UlHWUBPxi4$u'Q*c<8Ӈп6^;OX˚tzsUYM5}t�}%7;w@@0js$ӥ0F#@�<}��c�ȯX:�_'?7
    [|bvW^+�9<s#/�{7_>�z4ǼMƭWݫV+vEj�.kyݝLGp�C^?}Om�}]0?�F�}exx�Cu.>�ѯC־?7]ϯO�C�x\<�p=E�}OoJ�?x_�?7\NG}O�[|�=ρ־ oG׏S�_�?}Em�ZXO#�q�N�ѭCٸ"m�Zn96�~S�|{S_^1vOm�޼{m�Z!<F�y��S�ko�m1SF�y�d{ou??�hu3\־m�Z?Qn!u?m�{_^n9�S�j\��wC��?x�c־!߳vխ�G}E?�}xol^�ѫC؞㏃־?.2kuz�F�k_Vζ?.?�?x�]1�troz�?W}־/�t+h_OM�#޼[?�}[Ìӽ`��57�h{3У�{oմ1`�ͭ�?g?q�k#o?.�F�,��⑷o?.??M�#ߖim�Z߰]xv?M�#޼Ym�Z�~�Au폧_�jo�kc6ƻ#�57�h~f�ޛ1߰]u8?=�޼I_[m_}�~^,Gi!�Auv�v:�F�lG>:ذݎf�%c�zoִMu7]}k�1�4�h~3JE4JS~�Auz�F�^$־H�`�?]}k�3�4�hz2J|�zo״k`�v=O�O}�P(DM�Z#?`�?]}k?=O�K}?{(#�zoN5o?.k;\vz�5K}�OH�ޛtj\�I־q߰װ�~S�K}�r�ޛտ`�?]
    �~S��D{yo׻+ſ`�?\Mgk�k�h]<#f�}{-}O�G}�R�ޛ_&xvm?�#C�Ϳ`�?]}j�F�M�Z1V{;T�7�4w�hu�?kGA<[V?�#ݵ8�Q8U`�?^�~S�G~N1�?kG
    믺[�[�ߟ=S�_[*߰?u?
    �#ߵ7G_y«GÝO�C~G׎߰Wj:�F�U`�ׁOVu=�<S�ߟ}q�}n/?׾�Oj?ֆ߰}j;�47�huGkuO~~=�<S�ߟ}u=�<S�ߟ}ֆ_vO�'?�jZ~/?׌�~S�?~s�|H֪{;PO�?~Tc�Zi~~*{Lq~?>X_<~~5M�O�'ދ
    Sŏk`?ן�S�ߟ}_K߰}i?O�?~ꁟ?�߰�<�S�ߟ}P�~_w~Ӹ�~�S�ߟ}ꢿG��}z3FxvO�;~K7�Z 
    ?�'޻��_[g_?�'޵/?kFFxF�OU��_V/כA�3�hu��־/?i^��h{��־/v�hz8��־Lpo~z�Fn�OH7�ZG�?^S�߿}R#��־Q-FNҽ�?�+߫Æ_/h?�'ߎ��_[-õx?z�Fn�Dq��_^k/їO�Fn�C"?k�?^v�fn�	�LS[>^�S�߿&?�Zo�?];F�b�W~TS[躟�Ff��)1�Oׁo~u?�+ޏZTS_o~�WR�ֵo~~>7�hz_T�}X|
    ^^�S�gj?�Zqwŏ�E{n?'ka7�?\Lx	�2�h~#%$�}zxgO̽�+}ֿW%?tO�/!8�dj=_{_gZz�?/!9�djxgu?�+@�dt_K�2�hz"LI�Z_6_ڻ?tO�+-�sc־�/־�[�WR�dj?q/ٿ[��WhlO?_n[�WSc־d'/na�n2��hz"Sc־6_n͵u?��+J�tO`o~Xẟ�FV��Am�dUf'
    ᫳O�2w��h~m�)?m׵vo�FN��m:?'kx�?S��MG$�}xxMD`�?S�'�'Gjl~c�?^ه\O�'��Okl/=��W4�Oj7�?]_9�qO�#�''Al
    2h~x��E{KZ�B??YA:6lWd ߻ܗQ}T}}R/#7
    Ï{cnʨۚZRZ
    ъMIL,(Պp/�Hy~r
    �Bߵɓ/�"e�Wi�W:�fHy�OՏF�Ǵo,}gcjջ,	o|\PSϮ%ƣ�}oëMf~~vn||I:ΧelxsR[odbgjC#^P4CN>Nَ[l=+vXDKgg$)xu2Hje`#V@=w~NDۭKE׈ѧB˦86:\/炯y\0Eø*iPTyUd*qxܖb[Cu2E
    AcwMjWef]5v*teTV`( &*	NF5RZTRk@YN?itɯ^.	͇�ujc?E:^?׸upm�x�P)>{X�*t`.G?sy
    +jA䲻%Pb֮%YMyb(+$R#�
    -Aw @H5v)V(ВM�*A�(cCA#7ݫ?P|G[_jFYW6zYt>Ү2JMP!snֻՔwR-:
    Ԧ@`qUXK6tӡYiRVFUqR+@+�}S^@:q?_u:>}0:ڂ�ׯGf>GnW׽:6#zz
    jj\Qny)Us*<womE�;f0TlGS5n^^,[CP̊ƁpZO;`[]ZovYʭTt9l<cٍvF/`zcKiQmpa
    .ں5KU7taZCVvVvr4H#
    U4M 2E$K֌UwùYAy�"9(H cx6Mke3EJH
    rK`>՜cyu�}.s.>zڏ>}hm}Q�^ه7V?%��w}y�}ۇ9zEn;>A|5X[.2#RԛW
    5JTRIm0܌MEBH]54Ej�YFiSqIeC8-+;S�WRu<@A>`{e79e$՞m4�Un麳+p}KtzDI,rsotBዧcLF~W6;oͿI]En+Ex+0jZj29x]iyo{][9hIS�FGEvWZ Y@*Œ =)�m-�qoW<^^��cX
    n-ս[~vmۻCe<C?s^1Xi1Z39ĄS`n1nFHlLj"�^'=ݻnmK{DP"
    "ߊ)2|C�	w:�9}2&vf̜{kn5zi�/Tݩ	80=~vWq0;-WMwfEwi`i)ik82=7(-w+,;iDfQ֚:gr;mŶӸ%⢲YH*!f5jE:5gxm=C.Wg}1pVKA6Gmfk	墖UUO\PUD`)"..3%K40a\T+@K'[ITR+F�ҠzQc_otIl�}?M:<ȿWޫS=vqWd<7lݼaS뤢<M-Fn6e5"I[HH+.ĈՈ�
    ]&DA/$qX1QY$+
    <RIo�zhn�[ҏgʭwQ۵1V^/
    �Bn\֮Ki�eV6ݘM熇?lt|i#rm>
    fq.h D"-kh# 0  pͤs(
    pŒRAVO�}:`zCnVQ�>覲GVȷW޵u5y"+;UDPYTx߫Z�	'Jq]M&1Sl9."_>+s`6^Gb=3STCOL�ryVH&ID?&P~]�cy< t?]"daV#wvQI_Qda SWck|v_Y6K�7�i[n6+B#U2cgwkut*Ge 2V�N@E?�iҭ'�u$u"<��Rsׂ׼k�}꣭=u_?N[o�
    4
    JÓ!ǷSfhh\Slݻ]_!3O}k]R聃Z
    SH'<GRfϹ3s7\Č;xd85*0*lm&1yQ)#;N΋
    ©iR Qk4qh").M)_JznmݹYRnmݶzTek^ԕQl͹O"JO.&L2MY2  T'�2ZԨ*<qי9}nG)b~be,�R-lY9@*�F�l?֜ӠF^E�}u$c�~z:Hu@oȮ��zpvCTi,ܵ/8F-4\S,XFTa-͘Q>ԃ폶|߶ER^YX@&p)PV\-P=6뾽9i)2;cm}UED԰Tg0Xܥ\T^iwB3m%uj'7vv^@|{xf]wufQJj�0J�:\�x�Qt$Poc�>xuёy6?_�[@u_?3^N?+c�!׌?+]x
    ȭou=q>��c|zApȧ;HX[5�mהw/ЭFc+pxW�G܏cDE.GѿQV�9mTKGYD)E-AyʊHX\VM��@ǗQUDG{)jE[ I#:ۜR@O�?^
    ƣB!M]SM2hdarYlU=(t é%�}G?׎G^2?F�l?TӭH]~�:5)|,Ƒ+=,?`8VmR_SAcog,	z0_vmqǑ449P{RcӶPOOA&r:\cs8 *!f(He[x]XbKm2-=Nx�[+|i뗕@7#?ۧZ
    }z$[?N^=xʤ�AU<Y9Z\<yu)~e 7a�Ri$uȣ?T^-}IV\Lb,_~z뎱?_{#[뗕lEo�2zz@�`P�x�+ʤ}TO>c+ZO[c?r:]y�F�l?GW]T,~4uו�x�TAɱ�x�׏]yͿW޴׌XX+I$]�x�׆:Q*?oq _#?_�}u�~:_$8<gI57iqo,yݟa�Vz??P)Q+^տ"6gU{9_J
    =uoT,gI1,vYe5ZdxfybB$Ony}ǛW顨$4KOC8m%R@P:Ǵ^w˗41eg(5*NEAt,H=	|gvVvo[N>=eGpcp,rslr]%uc/?e`>}o۷B0v{1 R#U-JKTI*F^t^s6nEH@˨P<z4~Haݧj6xyjFSnMsVVUQavb)>G嬪ȕ2JY}E^S=XXw9Ѡ,cU@��ckx(5H)E1>BuT2I9'ϡxs5K+׌[5u+5fJӭNo׽x{k^-a_u2i\)os5犍lTXe;IZ-<B8dEE2d`r$Gp68q8vE@h8<#:ߝITSIZ۷H"xܖr9L”.ҡ"3gg}742HNEh0H{?n`-"88R1l=ٻS#nu>/,ɤ%5S2M433;3KHvѨUQ�(=Es5\HZgbX2zQ?5G邾UK5E>?{2:zWy?5%M)ՊqI~-�׽(xu=T}UA,Ƃ-C9o'Ա�dr
    $c6vݓ[Ͳ{2'X>⾏	p҂,LzLe`{]{uq<-qkZ~ҧݎ=iEp
    YȰѫH�ooT[;{Zc�w.V�mb-I]�׽i׊Q@^/ck�ƽĮi׀H^kl}wA�mE4Yִϐ�!ž�ꔠ0W]*5I~H\A:ŊG>_Čx�Q׹PmbV}RA׻.1$ͳN:۵1g3X8HZEWcL+g~ռ^,b9,%EԊyHr?MOZڭ$+{·'K:hU�t}[|޻fX|4#͵6E+U~-CԚh(le=E=LKWSM]�p%0ۣ�R'KR*aNki~xaܭ{T@e�jU@)g|ar{krU7h"ZZe�yG+y`ZiriVM#G+(xYr-d,3YƜiBpEH~e6g
    yokh΢$:RIJj)R�"_$ok؏EkE�yS%3N}tߏzSaoboSg:kɾwv#iPV]߱NRt<ySʞ{wQû$[*~O5ezl3lx0;ENcHǨ{ZatJn^2mҹNZzjŹgbee0Ďni'5 +r6{%a_}Gn[RJ#"yHrh55Gp'[]&|P6;}&WsM$UZh&,5*I|yi^A̛K;p,*TP5"j	v}5~i"ɡ##WR^tDj*?1SncRPKɶ㣺]۹Z%<Uz7鞢(ޫ}Sݮg�FQ
    blzPIy{g0^][ӗmNi0�*;0�O0S-O׼A�y�}o~>]{9'mLMWI[_6RBŹ6�tSO41:6y*)剞9)
    䧙SەO˻ũKu[|,$A'66{700%'$~ՔݵJ]#=U,B"
    ݗQ_Rcc0ur3ᲔeZ Zje1p{dH'Mq+JSizj%vuRЊ�1?={E<vܔmU|31)b3ƑrQuR�C	O|~{ɭZܭB@XVXA0Ge,Ē2+-*cZ|~z퇝Gϒ '|XV;\:6T
    ƀ�.Of~/z(V?/=_޲ �շo#2=x[1S}A-fߴ_
    WݝY 4dgZJ\e5D^aݣpr%cp@pM4H7Ki.HZB@9ANo
    ]yȷRvJnA'T~O_oa]DvvԴV_Sݒٍ=§uOx叵ܪ
    (:y]fe-ګᔮ1<oPIcSN&(fڛ{m.^H!ՅjL5&)&Glvk&)*Tţ`CD�ӌ<P>oqy
    % pWEH큻lMFkenjS?BhRjSXCWO"0Ung~ͭ߈V9)G#!$҄u(
    Ԉv-pkk\A#(�Y*1�y+t!+^��Q"yG]__כ뎯.^7.ܙ{5}1-#'eEC]\._$XR?am7S%ޣ24�AkJu>}9W[%yK!-24Y<[u[pY}縺gym^}T;^i6cH6>ߙ,{Mfi6/.Nvydo,k4a4)>{{m;w0|
    'X&Z٤IwdQ%$I$LPmW6[{
    SbpX-V'G#!l<}˱pFEXP�rGqo{tqC$HŝݍYI$5^{iC^=x7?=ŭ=x6{N{OzW{C*uL?9s=ԝSIl6̣S#>Ŏz+Qz:TP&#4Hϻ|#nLoH@W?tSҧ׮}mD
    ߞADi{~)<++M4JGL)/bH};-6w.qYf+)NZ)j0imJ�7pNxۖ_x}Eo"]+@U5`iT^\1[n+MPʏ$mCq<ɚtum38덷ػz
    *l<_ dp|Y҄Uc24GJP,4m}mwKO^ʰ)=`>rN׺۸"4ROk:MTOB�y�{4 R}tOO	xi-eٛ{blfՑobӫYLOF6,GYT_QTb'wcvWVd7Vn2F90g=+gqRoZnX3oA;EFEK%6ZoFE1(irA*j<:�FnvCuSB>'?ez
    =>3#no[jdTzZJLdS"3u_egk=5y {vvcslX��GDv[^lWp$g%ؽeݙvFgErնVoչq";RUUό9ΨڙM=EЖfVؠB^8PO;|EWf��GLcX=̊kߋf`T:�M^޿d]AVQ~}
    |YN)E#~CݡfMßIZJjjhjV|BOVKM\sןmAI?[a@ƽ}숤uujKS%*fQSyi"JSGy,iS}L
    Ҙ1q~glOOap[;a	tS-MPܵt;APژW˫qDڕ;rnSX".Ե5ؼ`c[uE{\w%@3Zux�VZOiZ��y�{֬Vh/zߏ~mt˹	?"Y13ֲ6>["Sz֝5ϗDeͺ,6zt˛J$gI#WEM$4N#cP.t*'w#%D偪||wu=\T±0\Bԭ<4@CdR.|2:TS9ʔbj|YL5FJ9)&UtȒrؿqPxR?aN
    q섿˧N/O�{ޮnދ˭N~O�q
    bM}W˭w6�u1שӮ7u~ůSV+/zRuھ]kǮ-�=ZߵS˭RuދyS^޵|R{_�ƽԚu?>_zךӭӯ_߃Ҹ}uz6o^kNOשAW�{@׬�ǟNGǯW{��.�s_޿9#ǟͿ�KOJ�ϴ{wj_�5l?[6w5]T;PPVֻZ:em^?%GUʽ=^>Jzy<SC"K20`f١]Hn#F q&YBCmJqJ|(tW|74R7ʪ%Yڙlt3X"rHm9R;qJS#'Jsz5ボ(\|Pfj
    y:c1_%)Q
    eN_
    Uu<"8喲Bpje-ܹzFT�g@55&<;
    Zkq
    đ
    |Nv~RR2Ui7i1w^'xP`hf
    WZz<|N
    gؤ1V([[
    7"|GGUՎ*OV(*cP4)4Og�i�y�{:5%~tPumwN˸ꎉۿC<-OvsSM\+ɥ3Rir2TiM{zA7_x_mҝ|.ۻ#ho}$n#nl_{dl-FJz$!OLuuozF�Jvf??zӇUc]o_^[tu�Um-]}Hbe	ߟ?(kikrGOģ#C4=ϹQ{ZƠ2==X$j/-ups_6<h`%Hߎ#GѻmeDpv6E7n9tM"$mݿ}:"*e(&bîX^Z�{sO=wmK*"E<Iт��ƽ<'k^O׺u$׿[ˮ_OkߏVif^?OkއZ_~|E:+.wgHvvvvLS;|vF#rޙo}Gw'C,41'Ǘ_Zڽ˝5f=È^u`kz4AQ&+VIRtyћp!WT�r:J\f'g2RK%6+dޕ1#ќ)(k7V)d��I94hG;vTQX,@Q$�>V;hb%˙|b㲔uRGWex&D$Uue[k]"�U؊,nxu`2+h#R*0xN=?{:'s/Okdׯno5@ӭt뇶N>߹e�!4_?W~4Kkߺ펮;ul߲wج+1na+1T;
    %
    %ԢKm2nOm$wb&8uT1CKJhֽt7pY+#aPH<_Rڿ/>;uWsm]԰ǎW]S4OcSjvWiJAEK6<3$7\K{JbZhP34y(vrܟ[FLbJf_"3/ݠ֝z/}o=Uwrn~ƥ}͚뼇en,n݋6f`m
    >bǤEM7nw;}]4M#ȆM ԑ�8+A@�D>t>-ØnyR	owk�O1hv`j	 
    �S|HMջv.6_;o)o2iImmʜ0dj0VTHҚh7r}\.vj(QDALQx�WsXݶd7ϸJ%rکR8p:?
    ^RMϓ?^ŞH]u�׽ʹ��ƽ˯S'�ƽuO_$;.vm=ٙ�{Gdɍܝg0t=mߟr(RYw+4*-[SOھU
    ǻzTZ|1 #xҀ}筓a<8&c5VgH"@|;Gz�Yݭ.{lvw^_I9^%yy.;.t
    *VbFPÊb@}eܶOo,d$,4Ē*|5F`TߪRJНUGr390dFw|i!3X,&*xhҺ詖zj$]oۤZF~H9}^TM$=Ēe3P2p}??
    Sz8���ƽ֝zu?_�{tUW>Kk>T|?\Spn=|%]~]smMҍwa|tRE2K^_$�mwZom}۵Q3etu�k$eӺ _5lXh:S�1T_wmƶ8[ql
    	ӻ7N3nٛ'/In{%ml>4SdfTR;jCWeIEu6qL^1y.TƉNeJ	N59>=l׸ߒO5;3\KnNM,r[g謌0b-c�Yiۼ7{,s23A"pbU+_BJp(YfUSzdeewsvVٜoLEFW{+wvNBw1u{)ldBl]mnag]M�A3EÍ@-81V
    2xt&y.>?oo]~ӣ{=/+�ն߅/O�y�{lh:/S.+*䪧`TfvJFQjy
    tOdxD¹QNħ@Uoܝ!ivn6.j<:;![Eu&zQ{G>g
    Fo_O]IY=ƣ+K
    ݮ,#BB
    HZFr5*rT#L(iN+,W|VV|mܾ*DL'[eIjuްf3UNYD,ԴHvA.2dTxcUDne٣V$8}L@r֮�mmz6
    
    {r\n=ŒٻOxNj1ٌ3|%m>3SCX$yxi)Ĥ)
    R37CmncXF|+GEϗ$F_+1Yy.o軧{Ov[3^.{휄9fGLFC0I2PsÍhf[ӣf??l={^[�^k�׽A^OUU7'ɘCmas]Wv2(-6/6)fzTqS
    V:8S%V}EH4<((x?tǝ>hj٥˪#KKXA!YF#k|MI7dASng|a|UtUCTgdfENRRbώ];4[T*!\tsۗ]rfb#{jGjTU5UG=w~>K='Ysm�zuU[R/بѼy
    6+[:ٴ7*24'}oa
    y1inom�<i aZ	QI^#]k]AփM{xuu.5>ē[5<֔WK٩?l푻j'Win5<�SVuiij#mX_v	A%?r+\v"n xk]5Fܗ6J0ٮ[z=}鏩keJbٲQc銓&X#$mvvo6Tk2v
    ^M\r,�ܧ'".*"I^
    O~/(0mɮےG۵tL%-^VʮW.X}2�RiI.de�J&?+~}/srM78zg?2y P�+p'ϯ/ž�Zq:Fv.oο[[v%{]˳>Ɋ}Wc+j2F2~7o+6湋p͔^,PP,B,Bāf7�qjbtPXVAbp=WJ,n7rozžHWub7{oK=Hatl*(VRAS"SM<qG)oܣxm�TsAK[Hh+N
    72]gJF:ZehI4@<7[[nl~݁Y-8>4\UVuoteX#\0
    <"=.7-ԃ:qZQH�簐H8qnñ#Rz�Fz+滟p|c1#g8x]dňsf"SR$x詤&Y^d~^{e{?HiD*fVh+N�gg-Ź\>[Z5S)N5��k/Lס:)5[b~||$OKwvNol۽VɎ5ym;bm/j1U'9
    dd+߂q"$Ucµ>'qZ-#<Wid;VK2}KSz{w(0gnvsGOv,RZr-ƥJd1UQS"ِ8j#+OpVF1ѱͽysoO >7.�ܛc4DA'nФt31+ieh#=6F T$feI< uO}5;|33.|ݵ&IӿTqJ5F#cB9E,B1GPw_a|`g;#j6k2ĕ]-Z}dCKD!W:ޯG[#ڵXUB6. Y^vzvkjiPHybrHjӉN= }e:x.l|J7SvS/c]?^6ߣ4QfT8-S_Ipjts[AJEV
    uW4iƤPZ&&t;6�y�{Iթ\ӸqpnoTY)s|ŒS2`YchY\qֵTӻrhfqb*_p=Rs#LJyM#n-r=EVE8#RA1}S?j+{쪪LnnA=E=a筯e!Nd%QT֫*I]5݇*Ej\%VӴQU\8%A~\طqD^=Ċ};X50:m\o>ֹˤ[toI0tO^ceRc+.uaiUP*jf:tGcHdU*ՠh
    >LEi^=;tɱ1]ga304
    08dT>w?e|iᖦ$fX&6VVaMH dypQC@N2X?�ƽLquus׃-?_׽Ǵ׮uz5놮/o~zsN}?uu'�ƽ뭓Zu'�ƽuĵ}֝nzo{ו�6�y�{Z'guk~=
    kdZmϿi1A~>�?>Z]{Uީ׫]'k�׿պ�y�{֎u�ƽ3^Z:_�ƽ>:;C
    ܯ`ϟW?_'_	z8V#8=gH6L~=;w^ggj�n筆˾S{G,I;Vxώ"}K4G\gT|g=[~m*1:GJ&czB>+;/)nm=ɾkmIlub%f=E}}sԹUSj#榆gΆHEO0t[C!")o:;<|vw_wOnw]hgAK~m~[&=rՁ4yT]gez^?8~wS�j_jm_7t֟}v7W`wV-e5{mm,|B<RTI*^nwr_^ !sS֬`-"QOԟR|J�c6AԸm=i7/:R>X�gCoA}gU]KTPD\L}�7J4ķ?5%3Ncў{<׼??z)#[#ٻC+>ߛ3jmy쎦[7^|0}MT5u_ĵE4tOLuz)2?vL{s|Ɏ-K2z'[U|{la"٘$!vO^CmaobI5Y5
    �H�!BrjĒcYO*ErH`P�znދ_!
    8_co&?pmߛknסٛj~Im
    )+1
    yruՔ<|?1.+г�i�^d^	?O�]_.fo׽ku�f{ٚ�d�9٘�G_�2G ??��wݵ6GmiϯS<zwNw\}g}x=>=&Л'wP$ŕdr"pcjzZzwj/L;e`q<^tc7>o[%~֖'_S[fw"Ij⡨:j
    pxjEx*L!jj"	%heCK$R#Atg(WxUHeb:�v?Ʈ~ѭ]Cd+6_iG)2L]w1k0[vZim'h#uff%m[UʕnH$L.6oonWBkx²UU�1Vj�:G?=ٵI{}7V#bm>9l7Ew.-7ݍ}ױzrtFI2=[+k%(v?`O.@�xl[OkM:Z=cwBl?=W95l}F?? L:
    ,3IuA`X$a p`�,?^|:EuԖq޽~׼3=I8_qt���ƽZE;q|rͩN{i+YuoYo}vn;7bK%^_xgn?	[_Y-=
    <
    eԨ)Zq'8>]k^g�i�^Tp~}=͊Oý[#){_Pn^Ʀ*}8W0],;ӼO-D45RUa全k@0J:ihNjHk南dw}kXn/?.3%/c6P6	Ism?�dZ4Az�y�{~&x
    ןN�{zu?>om|ѽSԽ#ubv&-t_}on޲ۃ~m{w/Mtvė#ջJa1~Zzy*TR*OOïpF�'ƽ^]{OϠhtn.?Z,^Nys$;î<	y*
    hQT<0ULJn!kJPWG$GT
    
    EApAˮkz3x`zlôY.m6;peL)\F&h6%$g!Z"Em6)h?PQ=WMI'loZr퐶k~4o
    I:@Z(h�fwɿN'sݿ$-�{q?�!S~}~&ҵДϤ'�e_}x
    b�Rv7o~.|o0mͺ:~!|YZaOYSFX
    ):6O׶OVE6DwnGOۗ~igؿXvYl߻{	{bd^-n*jL6?#	icY.QJBѯ}=?_�OmWߧuv/lv΢{8`_m8=]ᒩ)YPŦwE"^2nrtۋ[p/j3,4SG
    !
    Z
    ,Zbk�i�y�{kuJdƟ;5z׏A?BwN}1ecޝO]ŴEgv~zhw'%Rgi1Y:uyP	R2$~ν
    ])R6Ӽk}~q�h_[U/q|GH^}y]ccvW5v[/ڵY>
    LU76[~Z1̆JG
    -<mf
    5}i+à7Ϗ!j;/U;z]񗿾8|^_mMױORun'?;b0~U˶Tii"*:fJT??"x#F*Zi)jZx7jï9YC+{(hiQ}F>]U[Ae}Gϩ�}UGuh�z<~�%3NN׾N�}W˭Rϣ6{+qoNM;+gg[{{7YnN&Gy}ߞc%e}dP%@ubDԪ)Zq$S�Rr8ǪNOF�qJu`(kMНѶ~CoL|X3fSqm,flvݟ޸GfTLVn(⦭]cTFQ6⤏َZ>e=Ȏ۝}uIvo~uso
    0SC-=%RqThaOlkVqSGfn:W%vQ6OȄC&TWUt
    ~o׽tOϯ	-5״~~z
    Nk�y�{zmpiX_wK)PnMh�TwN^̧;+cly)v/da2ѥ-]J3u{ŷo6g,WZd`H! r3\y%yỡDeWXH9� i/lNo;dS
    F{ᬥaJ:mM4VH!ַ-2NLR$J/	>Ñzr%+y2,+H(
    (:񫲶q|unꭻ}g۽;ֽ6jc>;
    bh󴘼IZյ&v\)ZتU<NzW۽=]sVf<I'(5�y�{oHϧ]GkV_.fz~�x�zS=kG^#u{-4]יwXV#^֝Wݑ;
    r9>Jw#&/kmyՒH-܁FOՑ: 6[4i{_M$Q	~aёa)wzTCջKkn(w7`4]og(cjZIx1ut
    �pSJ
    	¤aU;1VKwgciamY3;3P
    gc@cEE!u,ocu[>6#{Puvx
    nnj$RⱸuyxjhL
    (QK$YgqZRrEINZiP�]	FN�{oW˫׌�?wkߵ|=ɯ4zzy/U:\+go24\_Ҳa=4��=4}sc62\a!HM%G-W-^W#IR4uʊ̍tQ"EgZJ^MQҌu^nmni`"8=_$C<2ӮS$hʌꢹ7o֙ң=$X5su#'Vm84SBmlГ&&UT5$*'ݟpq>#Z%4tTTRQ5-%,qR4D0TPT�['WOY~O5S=w�i�y�{ju͝ܘ͵1zhbIAWqԴMvF#]HDY:u.4VSf)ኡY3{pm"ExUtf�JL1e`=T-1^]qӶrt1|Au)Z1#jc-ϷmO.A]rI�!Ms~dlGԟjp"Hsэ1;I(8TtMKiDQ"$rŘ$BıXgT]3t%&߭۴A2K6YRML(j
    çq/$�k߸^��ƽ{OϮ&K�g5:5��ƽT-�y�{4ǻ�'ƽcuŴ��ƽVF:3^^ϯS=qku|^kߵ|^kރVq2\Oӟk}]<]ymƟ׿j:+}??u&Zi׌�{jfxc=x�&zte׿)״^`M�ƽ_:$u~_�{֯[q{�׿ᎷZuђ�y�{޾8ck�k޵Tp_ד?^պ<=pj�?VPO��}�:\:&�7�)";o#o]*�z߻]d7g>xYzo`:w",FIs�2z;BpF|vN\-${7"S&xN�V:aSQO?}n7G?k_Bs{,?/4:?/7ĭ�3n-;}͋%<Gjm87#XFPrN|OR:_wɾꌖloRT]]#^v/>1TU&�vf[r+OTKIIPyXLWk~Ü_c)7OVVρtxn\�.t6}6ZghmYڳf)Ǔ]δIsָtZ�fu7Ȏ�K8Y~5ٻuvf-Ϛfqq[s͞v.ҧʹJ4<]E~HSV�!{ ,�Ou`G�}칡=x>3�}94Ԩ?~}rnslw[A[=E7O.㷤{d`W6{6ާ7'L)E.\ط#K@i�6zZ_sUu>srlͽO[`7]m__o۝-յ36`vXogSSmUOŵxmN*
    ~PWz<}|	?>�6e}ٝ0n||M+�'ꟓeoӴp]s>;~oH;Ƕ}\0{ƬtFx-Σz\Lu=_;6vvq>D^|u>yA[_#JOt1^v6_58M(q)\q1Z^י�?_iu;�E�l�?o4_~�1w{ПC[2_r{ċFŸŎ<:E;{
    ޞ]a:ž'拽�.kw6<lw8=Ohq{6?=.*<cfQ0[=`<(H^~]?U7ͩ;7]~)|eᅯ]=W6�]M'{wᩧl&sf,~VyOHST+WS<1�GT6GμvWㇹ:?tظm�ywoxŞyi]W^,|{)Bcӂ…)\WVO/E^ǏCg=wq>>/tSe>w|W~Rvrn=нSOxg_7:Ⳳ3!Pf(h(wvܫLk4?3J
    ?a_KM|>M	]jl/{ݛg>mk~j~CvpY,/}Ʀ!ubDkE3Lp4Yg/c!K7mc:I#3̼o^GoOY|۟z-5rcޜa.M
    /zYJ/npA4=jk'&0?cv~lYlBNodW�7\vڎ9>Lu7]er/zm䣯ڧE.ޜsT'"mHE}_WIdooXv<];2{k36?b>'a!m.#odܨ,"*)YHj�?^9<zO
    {x#{˳?މ(Oɿ՛?`��cWzZ]CE6b67Qz/X6s >9n-ݿGwğۯC*ˌBNb|0# )]5=�xo]sGܽ񛶺u7ퟌ]+ףퟍ=:ns7vWaؽ)mONz
    Ѽrn,!(p?MM^dS�j]?S]%ϵq7<7_�v3\tjn̏b΅\d;s{S�\`NMFN=)HQT._^4ݺnEݝ732/߃࿻%ɏ,5=_:'˻e}(r2C7F?[O.+˫b3E��>	ߞWߵz
    {7ȯ[jv.scuh|1ns=c9qnZ_}-ܽ?{~|lIy=\$;Ȕ2F
    ՃQ�p<iLWI>
    ?
    {dz7&믒8폌;lc]ֽl|i>lճsLSo}(*sn㗣ߌdЁdS�@k1M';?ƍ屸Ae�۶>c�,拥Ovd{Nt/j>�!ۛaٜ5+J+˨թǷ2<*1 z`^4ۻ7nEݝ70w'?[g�LrϺ_m3|,_'˧҇#$[̒y0(Fo~ږSec_
    �e;�h�o`�f_�1O5>��rY-�q�k�._w�gJxkI&??>7wwůbt?DLY{Osy_�ntw>2ϻTKVG
    Gwv#iX|�M~[>S>ʗ6faݗPl_!:؟~o.۽OvZn<NBxmښ?Uaڅ]Ep+7GҮX窼]67Ml>6g:sl͏guoZn[?ovGv}۾y׿tQNm4|c5rVBt,Њd\g�uPF'޺n_X|/`w~f|V齭ݙ7�~m'#OnM{ctl*=Őu)MN^igFDY>#U'8-AFH8~.n_%׳>ඦ=~?Gu/?��i--�9Jw}Qj&[dpzdw|n}DdMV�6ANZRr٭OUA_K_]3tN2.6Y|P�*~)V?w#?sMߛ/ŵ:?~=#
    uM73omJ/Gri%[#<2A'=X%kկ~eam7S|P֛�n�f?om;kn/|C)�
    ⧃hi'Y#erw4Φ\hNrVm 
    ;}"L+�նtt7_+ǯi=xNj/c�gd=/)|ίݗ=e|P{C=9Mn
    [nl-$TJ&E�P
    tSǝ<t4g5Y>{_Ǒ]�Qt_s٘�7u[I?q쭓{ãAty
    i667oR`6:TR+C&WRZzqrOMцhi1a�O<�}YV˭A^F}?+ڍzߟUf՟9{=_>%u.8n}{3:onM5{糱Ƿv-.;ve^[hl]Lyj<^B<}BxV++"^>ǪGV?#:Gzv�dk
    />o}
    㬻/757SW!ֽWwf?#d8.)kx#HժuKA�ȥ@4Q}}!~.�-?A};v7Xl_M�)z^|{aǍ[í?voXv<
    ՒuvxrNQn[fˤV%Bp+h#I SνS37pF}a+~:o_?٣J_=[bS1nIMNjLfO:YvUhAc@z0N?,أ6뾌鞿޹[gnź{#ۛ=3٭m^22Yjv5Q#Iy4E23(K*yT쩧N+Z?_t$6\L,l96�5+Fs%[=`|njsn7QYGV{CfgwD+II&[-%Dj2X	kS:
    "Tͳz]�?g۟YߑxmoC_KgWѾ7/]\N窩T;mySV44"PT/uIcWTp?*|t_ivR6ޛ^4oz�(HvnMӵٵ>_Oc0v;ؐ`zvgocteSR(󐌃#e&c4ZBʚ)**Gv?+^Gݿ:s׺Pu{iw\g_VŸgU^fs5op6ٯ3n
    h7\òSNHvlPԓ|5jZ4"�P�W][/c�QǯyYߵNz͇�y=Y^<zh�+?~~]=�ouM~'N+URϘ'V,_,Ɗ
    ]Ñ;xʣ;o0eL>fEQ
    hNU’€g"J($E67s|A?;7Ymo_Mu/;})p±I#>
    L8Qmc OtJx7
    y/=.'=ӟ':�eOv�Eeo,OoKS~,]!{|wA=Q9Tdəjiy:J/5 e݃M4y7)9?oW+o?*uّ�y�c՛Ӡc],9??dt+?dzc2o��=7?OwhMc6FJJFJ,>V	k(̤\"PdU:ȣDOxF~5%fmŁuj
    6b3^έ[+NfJW!OG=,-v66L~:ݱxmYY2u{nn팆ةsn
    J:|3ǭY8xq󴱹'm| _QOԟqۃOG,iM"::ס_Iz񕁵+]l
    ܻj<=$3WR)2bei4t5TuxGT|֍ܻ~ԴWly7W)&
    #Nˎ|F;
    _L*oEj*|3؞ܔ{s婆s}Sd:-.y꜖B)T
    ZZy|pTTON~ ǧ[C6N$pSm|"MQ'32MCaIW)Y1VHGC@?|M9j]ю2cQ?=QN:L?NbV]וQmxaE[
    VȫZ2cW/^lumڽ0G_޷5(͚f^sfF|Br'yeiϯt?j=ky?_zz][+ŏ[-3�?_zOLW̬?+Z=x/c�h:׌�ǭ(f&_+ō:8љx?�}ӯy7_+}x={Ts+]yX�y�iǧ^e�l^_>5+Uc8fWމ+Z_+g&z}{ֵ�^]	ߑeWߏ^=up~+z~V'9�_+^xZYx:=qa�Zz,T/f
    >ޝN=|?bγ/W	z2MnawV_vB
    Ϻ�!ݼNS<q^m]/VRS~] v<i/݀<X?}z)�3P�b~'SJ_�7YP
    Ewi}��W$R�7Txv/fvè?�?~s�(R#Q?߫GR�/Pw�b~[B״?Wu[�Ǘڿ(?�/~s�(R�7^*iQٝo;�?~ʡ52-~׿ҕ7ڟ(8RG/Q)/}�
    �r�گBx�E7?/QߋG^/Wb.�Oށ,�you)_?׏h�ڟ(;�?z/h�?]
    _WQh�Oߵ\Ó֨*Fx�Gn_}h�?]ѥH7�?~u�(R�U?O
    _;S�Ef�'Ax}'kJyJ�ҍ)�3Gٿ{7'!ըq�J�3?Qm��-ִUh�?^�J4`Կ"N�O޿Oרh�?]�
    o;S�Eg'D/h�?]
    _;S�Ef�&=c??߫GR�3�Rvo�b~KEn~iOfvN�Oީp?,'Oҍ(�7�Rvo�b~KuGgo\,WOy}�͇W|mu�j|%^ƟI-|طiV$=)ӿQ<�KٿE_?_Fxҿ"^�O޴qYO^ңh�?]Хc�)/f�'`N1~{F1/f�&}苏D�?h�?^�I^�Oީ?׻iOh�?^�J4OoiLVu](?J?
    /�2\,'~~�I_){7�?~zǴ)ݣ�ZOOOר?h�?]
    OG�E/f)'_7_?׿҅'ݣ�?Z\,/h�?]
    OG�E/f)n?Oרƿ
    _G�E/f)T�Y?a_~)?�اRQE�~/H?vg�bKEzc_?G�?u7f)Թ�WcZ~�ߟ?K̦=#?J�ƿ
    1�0h�=苂k^\~~�In�Sߊ�~�/ݗ�اi>�a54:̾�uF?[1EmŶ6~/a~�sLe׭.p9J�*ׯ`k_=A'?){/�_m�g{ƿ?ݗ�دi~~�ݗ�د�w{ƿg�!z��;νO;C�E?e�+Z.?�g^~zO�C?Sv_�b�g^]Ϥ�C�S_�bGרO;?�E?e�+Zn?�g^1_>y�O։��g^u~}{'�!�)/�_z?׏hQ�!�)+�_~?g[ �Jv}W�bGoׅ?uNM�ߧߊNi.߳�}���*Go֎~1G/;?�>v_o(uA>�Iv�WߊOo=F~GR�W޼9Mb{(Rog}Û߳'�I[*;+�_z�|7[uG�<g}Dا:1w?;+�_zZxu�ߣ�ߩ}›{:'R#*{+�_{[!׿}=�WތSq[cuG�<g}Ûxӎ_:y�S?7/�=�طxsBX?tݛʏtm]˶C�.ɩ?}n>5&[P9u~!ҳ!4u
    wf5~/Y2xgǯk/oyK,NSOJBc_>y.�S?{kÜE!׿}]�柤/�0O3]�ذ
    }uG~6f�ߪŽ›z׮�u]�`={{:2�'�_~�}~}lS_6y>�U?{юc�/zvu}�G�*"#ֻG]͢	g�ʯxSp�?[�]//�E_d+ת{'Q'ه�)_d+^ת׿u}?G�bM?o{'Q'ٟ*#�_~�}׻u}�?
    o]{uO}Vv?�bb^ٔ'f�WބS#GE2v{:�'+;�ozM?lS?6y>�Y�{يc�/Cׯ3�Egc�-ցóhGjv_Ž/~Q_2Ƿˏck:&;/�Egc-^Q�lS96_�_ߌ3U?�?^Aku{/�Egc/F�?.;2yN�Yтoczp={&)+{�o~g�}�1~hG�S?�?^t{6�+_+;�uf?^�IW�_)|L�WVv7�bMc#(E�߫+;�{&gxzoW�]z&~~^=wh??v7�bK8G:u?x�[71~Q@8O�[ތ(?h�?^.t%G'vۖf*8u`_*{�E�o�Wf�W;?I>%{s;Xų�%?�_}\9{ϴ_vںŏ'اut+~~+r33
    [mmv>;Wwҳ7vvV4)IQ}4~De66'+LLtǚf.^ݒq'ipq<t[Xjrp,ePCףkҽeasJ]᰻G2m$0l^ٻ۪A7^dUSeik*buI)~o.wG*[^ZtK"VxֱX59Ó"@xT2�o>_4|þPu}?>0lb43�,e��gw>2l
    ytpwcHIȍ̻os@Jk&3"_xq<p_ϧsg]:#={|+sh#6?Fv[oMu~o<m8j)fnkĬwql&sE7O+<=-}SS\�!gv�jݗJ]ٛ簷p|L㮾[}85~]Nԙ|SU:G?>V�
    H6%WezG_
    M~_>:�_LuN./tf`1AHl�>їv7>]w�|!ߛﺪ>CR_ٟ�n߽I]bS[JbI䯊0<^C={g~I6+~;m8K;/ytgzz~W[*<b}u/_K2*
    +8Cjs	3]I˻{V]2[c6vg{6_'g1X9cJExqZ8V_%IߤOԻp|g?3cgآ|
    \OW|1<	pٚsu<fS.n9ԙ_%p?=]잌6zﵨƝcqӱs9
    krAʚ߈*}~N垀MҾVw'{K>'_875{_rub|_?]rn*۫e|퍿دKOU_xWf&fGLw+~t_I}MO؎n뮤Zꝅ6n7z`+wߝ՛E.opϯi4|l'Sa~R|ڿ#z;hߏ#9N�B_[~ޒl)f7c>>yn<6*⮭ 
    ֜z֘ھG|u'ޝc~|X�|'ywSo>gn3Q)栊RU	״\tRA]޽ӻoUUtRwVx�	Cl=ԛ
    ;	yX-O6an֭Tc	5~2.:ޜtJtm~8-mⲝ
    �q{o~}15
    .z|V*")~u'oks-i;avn
    1�^:~m]?:^{~US`U2tO⚖wU OE%/v,h{zo^[Ot|iG+gwmw۷״mH*:1\}'QJO�>�e݇z~b~Gwvw}N1Uapm믈տz-r8;pR^/myِdS"~ϭt-+/[z~Ŷ7gكMQ?˗.ڻKkLOzZL>Z|VM^)=��/̎Tk߿9zפ
    _iqym]I�]Ѽ7FL'iuOkv`PR`p'!^'Q*G(=x?.S?
    ϊ΅?~|oU=oç!;gu7ޘ6nbosA]!]>5 RΝz}Xw^k
    O;냮{|a?e6荿lpo:km׻%scxvIqՔYA*<u>L?9YaU|uu^=_�l޷&-ݥ&66Φ쾨^Qghq:lްq^>zGG_rMޙ)k?k}Uc_EvYڽo154;wnj:v墮ic*
    zy�Qo]C~ewN{f_%/Ew߿3~0|><xv}?T|ۧ_M[o%30*d1xӯPt8F/ߝe0#7`?g[iFK}`6q]A4zE,RӭӢ}j.[./]3ySxΝGWĞ�*ߋu([5i,vO>9-mqh€zQO:֟Qгa=16Ŝ4@ཋc~b�/{SE[N_&fɐuU8J5zf+ 98��.~5�0Or}!;:1Gbo}?M3C;MVTb&kcW3K3f^iTg~@�Y_/�y:|o[^�=ο.?OSތ1ׂӮ-7Ž_zG׍BS޼u>i{ζ�ǽ~޽<:Ο[:?N}Ξ3q3?k߼t#$Wi9:?�{z˜t[k޼uiz	:ο�{W-5:ӈMxSݽ''yכ�^:WN12S޼uANfO۟zze?؏ѝ>Bx'81_ioN[ƍ�ޯ:֘l^eO~GQּs?<9oyύ�ߏ;otc:b|N�dm#ꪗWd7==2Sx*2ko.
    ķ?oUt?ϳ_W?�/ħS |ZtUq7ۏy
    Cz6JWVfLc?|]Luo
    ,q�쩯?.	:pOO?ghoHV?bb;Vn;}7�];aFߴ_!EJI@ƪ#IaUfZ�3on|:l߄�#6q$1
    '_{#fqSٛ6x\h-Ź嬤p}YGƉ1A'aNܞow6ݝc6%ɰw3);�:L}*Ƞ!i3 pxuj7Maafm�}қ+b[v]Yސ']ژΡav[ftM͹GrY=]=N#CECOYU,
    6R7_nG#'9EVm{L;mtY;{{HIuu4<@,ndz٤_Nfb&KZ�I4f7M�)7_Ju߽Kh~oٸ͛6.'r>>W|r۽/{
    :YM2ge!97ݯw?o!=mkimi&~vXD\Tjng!igei۳rT`"1Ϭ/yJcXOݸ<`�>Waso?\_muxTw7g1sͣ2ekrW.}6ܱ||rg,aoZm:;uٌCmry,Wl'i'!rZcEͻ+:ߣ;+rwNܹJl6ݿMws>ڨޕo0[f퍙7Qe2YJj<+.9E0s6-ͷ0[!l;Vcͻ5-w[vmVvS\ZnN]5[ٴO2a-@;Hijpƥ0ۡ?Oh<o~>H|Ubn{J.l<vMQO؍[njLr9)v]&ܣrW.=>luw
    w;w?:7k{Y+mr}K{\mM\>pge3.f]K>-%cnv3"0�Ǹ{6?Ym?__6]v鯏:!6_L^.
    GqX?5/$�Ki.zݹc}]9mR{|l{n<X/7+J�I
    	Z仵k}xE-˫J@#GEav*M
    whۿγ.ӷx=cy-ۿ$.l~.yxp~<g϶sTNj;ݿәksyx]瘶N[ݢۧ.}[gܬ==t{-/c9D
    9;-k<P4їGotZƤ^o'ͽsSeWlTc|{;u{W8,.lΐw>nYk'b(h`㬪w
    /`Kqy?s6~ENrmwo&4wvۈ)#iEx HI.[ݣ٬Klfb.KVTLh*?^/Xf;wzn]574[mu;JR;>-2MGӪVǾuo}j/-]{=nof[mzG|Yg.MrJZ7﷖w7vk9w-e˧ZyHh_ʟr=uO8>OQ^T�T?=o姮~K�~)FD?Ou_ϭ}:/ս>"_�n
    #N'>�=1A$|z�=h?[
    Eq׼ �{1]yWz3=zczϭu$wC�{=uO_A'#q?ϭ"Fp?o[ˮ?Oz7^ZӞRq'ǽxC~H�sތ;["z}kϮ88a֟-6�{?T]k__y�{׎?�_
    p1FD�{>_ג?_,Cut�U_߼�>C?~P}lcjP�[I/^8xkߨ>�C�Pսש:�`xqˮ:W߿x}oP?ϯgӮ׎?~޷O*Fp=/-ݳ?cvC<_Rm[q츻u:ڵ&*;WTS+v3l]b9[h44i�0$Ԩ즄wͽ;zvgb|/o_oM�{qힱ[x||>ۿ-6wb|WO윕^mEU=6F*<}nMWHDLs%MB
    V*u<@`ySZ>:2_%~OJm-S%fGvK`mo8N===+knNl]ܻ:lSA^،D59gpᘀE+ 2-4 LꦐZIjpt1qN�ʽT?|߿?6dvz_|t}ܹ=-37F~gںͻŬ}Nm
    ]Adz	q,%vE$
    4$kϊBTZܠ`NƾX9f]IDg??hOug@W#%T׫ ើG1o[:�뙿'?7�ʵo:/m|حG�^[ϴ|2wi~�[{v^v'6NvUwR˵B]5ͰTyo,8]һ(uIAg<ŋv)x.ZR4#NuCT($(y$X*OL==::nW]&sqovnJmœ*.Xe~UCgR5}CP0ҥQKs;lV6\4ӱgXRuR5w%5jPpOB`?̇d?T=GNx^D1K
    ݟmTwO;
    Ogw6=ّ㶟Sjh^֚RlF~}�dhjBfb`%T!LXm{cxߒ{sN".߹Hj
    OFE5SOKI$:i^w׆1Sӝ?=Aݝ͹_~1U=Gո	{a,nr%6{	GG/r@kNcU�
    :)'yմ;+>Vѽd|hםE6]{O~m,qfX֎C5,>7q^zq~"{3Y]G{'vQ|i]:ϲ'jGh-v{J̾άW<**�$c\xo}0k[Fٻ|Tg>0Wo$_b;kvMo}i{Sw.é}̓xQTT6H^tV3joFwylm]ߴwV36Qǀb*jZ:Oj?o^G>0tOnmǽ66Komц͐錿cm�~veearvTTb_Tc璉)#ju�.QO[kzgٶ~#~I+
    }U{w:⋩>Ü|=]]E.27G_Z\6t?Ǯ-&莰,fv/p?6>A{~|2!g]
    XdvL۵T^Չ꯯׼/:~l{Nn|{i�{7ߛ1	ݯe[Gp{ޚl**x=í+^_w,_sc�e�d>�Eܟ�ݿĿ�w}~_vCUk׼3z{|}lyչ�e9nuw,^~Mwds?2{CTɯ@x=ozAe|UGK(_aþ/�)Clϖ=ɻ6rwSfv#X2zLb)'Ux
    (Qʇ]?
    v^
    uA);6Mٿ#~Ivo|~ؘozn-՟u<ՕB*Zܝ5oTS/xoOۿ>ҭڻ/+$77Bnz\˞Ȋz=ۇ;RfWUbGAOK1ĺ<?^އn^87}{A[5{vFgXtFq=vlxuwM
    ޣ'Q@Q'g>G~E6a}_gh|%:+wgiVO[.ڔtۃ{ruuu`?vFk[CchNٱ]}+ѻ?tT|r؟=r1�鞐oL?]SWS=ZՈ�Q^+F݅p`q[;6_+C:7XJmdݮx<IYoUZrZIڟ~>w.|m\rN]ڝYsy.;y^{M'|+rf`7VGT5�W׊|Oݻ;/bܹޝs3p۷2[oӽL+vG홸6ǽ6ڙͻI]cz\
    ,=�]#%w{o	fߘduYf�!׿3#v[oi(WU[+`u=Nn;3;~3˺vݏ7C)<o??R=Wf{~}ёnͯnl\]�c\z>}Wkݸ]KMfo37l?[SjtNn7Il=_65m&X\6~٢- ãP7ҕ_^є:u!Z*3y}`7HwUZ}ɵD}Qu	Yee=#OSU,ۜνλKybvcn=۝ߝ;=\uOegf={CչnNRzټcPiJyP^<us>njpf.e6Wh^>݇=}֙{ot־cQ#
    Jﯫjꨭ)y#Q|}7Uض{=_\<ۣv,{fb2%sӿ3y
    rS^sqUf
    ISMrXQau=/:elN龲Ŷߩv>۟Ų{!e`qT}mUM\=sK$jbFz֏u]1�Oxu.a?�SG״}{}|��hG>n8u৯:'M|ޟ\NY?GWލŸNu_qzy�a~=_^ud�W�㯨z~޻,�~3ZӞq,q�.T3�O?~fqŖ߮/�}z_/�^(u3_Ŕ?:U}՞}<^r~do!�O!ִ_œ:G�}Sg+^0ϭ'u�𚆸T:H�u>FGuww|vlX>KӾ*݋g�v6Bj_C~Z<dktHiOZV#>-,GLEsn{+wSvn+3}nmx=ۗ#=>_rd*hQZVJdiK~<2)JJSZu\z{flNDv]vKktoi7"on{~#CMEQ,%44RGM澕՛cNBzBAU7YtNC$돎GY�K}͓_o-o	]1&`fBUWU^*Z7M𜳿51Rp?//ׄK@)ݑz[:뎦؛Gnl[ja?ܯ*Ǯid9f.cSmigt|M:n
    =K[+ۿz>
    AY[O:|[=~9Kx;77|6[}4W1m|\$Oi55Gb
    d+yUF3'QṀ#A=swplϑvo>΃#sVn%K{o.zWvfbm3!Sr:;V!^=ݹ/hamnٛir#rܭ6gh7�k7{hmĿB ؛u 㹒+#$wH4i|#b_OAQ6n[?:�8̞[De7{|nJ/읗ܻ#Qn*{k1Tov-~fpbnd#yأlܬ#ookomq-V͸Z-w-O)QER"F" 1:M'=u_Wa:G)ꪽ�˲qrn̗L7sfEdo
    *,K#MǎRwu4n;%m[oWR_ox~Y十w+mP]=ōۋ^Wܙmvb@cPO-$ED30Dҳ[ɔ뾅܇r.f7R$ᅨvfwmno_{?wefm0w1]8LpS,>Ysgks\|%,Nq9Ynߙz~Qm7uk
    KLdyj7V롒XYKzuԗUҬMtPIzߣ�XIoꏎ,:wLWd;[}'knۥ)7jfz|^J#$jɪ%Nm=�r`y7v^`mݶt-nv۷1%BÆ8Q[TYٛcΎZj&*I&n{wVS~adFJ~l{_eg]wz�=*?ğ6.kby0XK>2}3E^MOj+*Y{{p6vs)&x/9}7 w)-fWF-˷5yjL%LkxHQtH~R!Qc�ؘ>ja;[-=/zﰻN=�kNuY>jqu3=TiC.>Λ7G9o
    p7G,vk6˝vKInl湆8JhNh FE)6meK. T�o�w8H�P}�?A�[?d=�wE�U�_;_=�j�i}W�oogW3Q?_37'B|H�37C:֞R?L�׈}::D�~>]n.)�vGIr^?,׉?>Q?_?_z2bPH/(�}X=uM?_~2�)NC_#7�%�NC(,`xcI]cs%|ޓ)t^_g�~H�?}XAOϮtz=3u4�~?#O�cӯ':E�%�P:uJ>r.�~u'׿G�"��~|֟J?LOk(:^$k^$I#?�ֿ[~]trhL�{C[Ϯ'\0}^xugOGދ_ėZ{C_ē\4{־NI?G^u9?ڏsZuC"��c޵ӯSׯOQ�c^1�~|ȧ�z/Z 9�UCרk^ �c%�{A?yu'[|M}fóRmۻ~uCp횹)j7gZn]p[GEOOQCXTA+NHEA"Zyc#=iR Ӡ|7?��]zo{_�/_o-?񌷗ڟ}W9Oٟq/&MZ
    +|SI zz6pvڸg{}c+嫿}ws7}DjfZfuZ R$`)SN<n=[3X}O:	�pwFz 0;o8}QqU
    h6eŻp;3qZ\
    lūe$v|5$
    `
    q<="7!oA` �֟/>ٸʁO>=|b�γ'_	z5�𘾓]!?�ߏ�?ڽa�|�Ͻ%9�?}m[Aq{KGӏ^gXwf^gj${�J_�n|e�_{n��]�G~�|׼W.?B�^�ҮW�ۧ޿wY?+��؟zvn+'o}�^;s�OiaL�wY?+�Coam]˾v^wg[sj=19ùw.w#X9kj'WTVa_O?vfI~G'>ڤ۟~뮽2/;*mZM>=6eN]%F'.�wY?+�^ͫƓxGKm}I;�/]{.;pe);Sw_w4;:|zmʝJ>N*_~�|׼Y?u;~nI>Gu#>ڤ~뮽2/;*mZM>=6eN]%F'/wY?+�J_	Eziv3pl]ž9v
    ?ǵ7uWR|[٭m1/dpYj*JYi}?i�?^_Žw.[^{37ݟ1LͫT7ܻ14xb(檭*jZhY]QYwY?,ٻW&jwm�0_\vRvؿ'PlO䩶vui7|5;w3Ot|Te�xu_f_';|r<6tjnꞥ[}nab_tsU0u~~v|R[r~;/owf;?ɝvۘۗp;Ə,EUSEMKM++0/G�x@\cfm^4{w\bz[oOݷ~'qۃ)IڛbC}?դlT<TaqRm~~](:3a|'몿Ovqvxl>/]Ksuwf_ݷ4ľ-e*da/{œg/[j]/g콓gvo>cۛWi]n˹wch8-QU[[U4TԴ<~�qO't�`).h.sv�xO̭ϵ_jplvI[|LТdiԩSzjY/G�xJ뿇�"?o�s��N~/uٗ?}O5|e�xC�$	��JW�n~e�x@�{C]i|M
    տ#�3~Pb'Pᄉ؛[{+_6/5[ƊMUlxī/{œo_ޚn]+$aa1o]MUԿ!7Wvkuyz,>LKZjVF_~�|׼W�Ckam]˾헲v^wg;sj=19ùw.w#X9kj'WTVaݶ_?i�?^_ٛWjwm�0_\vRvؿ'PlOivui7|5;w3Ot|Te�xO|u_f_';|r<6tjnꮥ[}nab_tsU0m׼W/t0nϊ?ܻ}n^{'e;v|36ڻsS;rx0[hiyeuEfc�(�/ڽi7t]T#oO]uײR7~?{`#MIǦ٬۹x+G�x_q_{;xoqm϶>Gven'jnwFggVwϏMYSs4WIQKݶ??i�?^_҃o_ޚn]+$aa1o]MUԿ!7Wvkuyz,>LKZjVF_~�qO�U�O?ww3�oh~M#�ū>׏_߿v�8{�F^�[�G~�qO�׿%OU*t{G{?=ݘ*_TM~@ۘ̍V[*=oݾKlT9X1T.KG�x](?%?U*t{F{*ߕ_=e~uIzwwoʯQ�?^_/�>-WctN{%ٝ˘Ak?Q�v
    QKNOvX�0,YbWn&pO紶<NuE_Zg{]_%d.
    RdkwE5Qa�(�׼Y?V�v܎Wm 6Wݗڿ6{vVIX?O\Vn\VBZ%La�(�׼Y?Do;ubwZfeͳW>:]]S8꽙B'xé;C4_9Q-
    r{e/�?^d.�dd�DK??Z���~�߳ǿw~�e,҃`_'xvgݡ-6;�龧mZ}{=s;um"|ghsm1xǁ#ݖ{œ;�t*ߕ_=e/�?^d.�ϋ]UngrfIJ_|qTxݡACөēݖ{ƓPw'M6,vvKn}nپqgs-X]ͿR
    ertEQYKa�(�׼i?N�SݿU*t{F_~I]{N�SݿU*t{F_~I]';jw'fM6vlc|{Wvm]ǎm˶k1ݿVCUE[K4TҤ;#+~�e4׷g;j]'f콓gvo>c|ۛWi]n˹wch-QU[[U4TԴ<~�e4:HNvٽ[XO
    ݛG;qv#pb?=GRRS4Mr+ F_~I]t�ҭU�ۣ߿u2�?O	~+MS	_io=ٴ{jlMxmםU=C�ߺLC$M+1׷�*�?O?7
    SGkepnM�3�ӺծYjԩ8lbijkXl]*MOM{�?^.
    ܿʿ;OJm[Iٿ*Ӵou1qFk3=.':spu6n?3x?EH#b޳_�E_~I]g|kwQN?\kn<uMR.ؗgemݔꝅt:Toc+-j9|U^׷�*�?O`_�:wrV?^8:>~awv.KϷz{omM;d㼔_;5sY\]gum�kƓS|u=Y֝չe{K73?0-s6w6FzzɢhY�u�oƗ-Z蝍Gs3%�f;Ê�#v
    >
    VMv$~�/`?#/=�[�G~�/I:Ov�V�ߺ�E_~I]{>�SݿU*t{QW��]G_{�JW�n~׷�*�?_�ҬS�ۣ߿u�{ƗD>[go>fGGqb~=M7?Aٛ[nmo_[Oi򼰉=o�U4zPtKt;K`unYWw_/eNݿ̷>nwd޸|f:ggt۫uco~�/GGvbhFAS6KOnc25[Wmovcp~/v7e,2eSqPbIP,vBߺ�E_~Kgf~$|pdv.d;pT<o4:#Kw.vf6g1o#iC[;>;6VZ<du
    *o�U4zPG?;�JO�n~շ�*�?_={>�QݟU*t{QW�x�ڝ5zw/ot#0Eݝ=kvuA]˴}ٛ?SY+vG1M1M]O-:V�(�׼y鯆ّ?^d~FVe3}ؽݿ:#3vnP&ڵ;o6OaZe)T	=V�(�׼y0E?;�JO�n~շ"�?_={.�QݟU*t{Q�x�t�ҬS�ۣ߿um{Ǘ^�dwggʟn�E<z$]?>T�[w/�?^3׿"�Y�G~ۿ/@�*ϕ?=V�(�׼yW/}uowͽ6Ol�0JظgW`avwUte5nOUT<2xߺQ�x�/}`\m?ۻd�(Opݳ7:s{lK[uNvV*71M5j>*~ۿ/�$]?>T�[w/�?^3׿"�Y�G~ۿ?/@�*ϕ?=N�(�׼iHGvV|�ߺ6CNgE?;�JO�n~Ѷ�u_=u@*ϕ?=F�(i׼yoi֝E#1{~O#ϝywW^u&&e:an뽧(WSW�JHm�4<z?"�Y�G~
    :7$]��JO�n~Ѷ�>gq_hw-7DoȺ}i̶rgOao0}}3:;=׀
    F'sf[y(g}Ń\tmϯx�?one|mM0Lc1ͱM[kb7J˞|{oݯVozlWzmzL{n}Kߺ6CN?`;Wcu^|fͥ_�Ku�-Gwnu/=ӋyN7_GY?tm{ǗKz;s׺:˸:�f]n_f>`?[67vmm/k]IKYO4QȬߺ6CNg�}�W�?~
    :/�]W|{|ٹZ{u1|WgVsݻ
    }wW²7cзm�4<р�d?u�U�ߺ6CN={�}�W�?~
    :/@>�ҫS�۟߿tm{Ǘ^�d?u�U�ߺ6CNgCϺ�T�o^3׿!U*sPӯx��}�W�?~?
    :/�U*s}Px��}�W�?~?	:/�U*s}Px�H>?�.�ҫQ�۟߿tm{Ǜz$�u�U�ߺ6CN={�˺�Tg'^�~t>7#Q
    wZM
    \?5?)LS[[K(6 j#4SbyI4vPvj퉷7/qQn<S+oX
    :*jZid` )>=[]RDUdQޡlqZq)w̗4qzUd8N^>JMw~a1&>^QUOv[pC(5 FQ.//hol伴QwF;#$T౩jd3=ׇ1jcN_1i�_c�߽װIoml��}[O,{Ov�]bVv�Vz):N{{^oﱾ׺c�ve^[�u>m̖uw7Wc~>Dר{uL9>h/iyM;{
    ջS}l?+8Ω񟣷̾Mڻaong7|stUd|V{{{wV/WlGA�
    R>+ni㿙NS;>(vBźkJ+==>NZ^^*u~[ðN|]:Tu~o?ǽ�qnm/vz�55gԕ?q*VM(>'=粺qewOE뮹yǾN,>E;+�6Yu;d7)7EnnU->-^_j|/~0w_>|^랔3rT
    vWn|ݓ߮A-5V7\5=,T{to.m�]9�;iwoQ_%$��r
    ź-{/ۅ3ˡwRTm<�nY6tx˞
    ŗ?c:װ;3쮓PKenݓXܦsS]/Vܴ{轫]/:뮟ߛ?>vY[GG_:~A78Ev+cjr:E$5>ew̛z;o??Mw?O?'-`믐Yߒ=wv__woinwG`{+չZnjп5߿';jp-]m3~>d~*]q>Y]p~b$v;u59O󉆧mu�vn\vڻx)f#iRm=`9Jmv.qm'e\IJzJy$&^~-mߓ?ƍ_/?ef:vž޽YG�_/q뾡\`o~ߔ5tw_&;krT1nFߺF~]㺻'ooXwGߍ0|P܏rr={u|=\~TNr,5rF{w?_?�NZ�e�-j�p�O�׺+WGv?؞ݙ~L>{xwn=xc;콭dwy&nՏ/fwګ?'dn[{wߏ7W\oO{x=+/ǟ:Dg
    Ng5|a[c{�Y}O7-9MT}7/v{"tԻqh*4NM6-uLcgOuzuiG٤S=Ptynӭ۟<'::/*Z|W#3T&^_�4>S|ڻ#6Nn
    :#l滯gIN^?>BNik|ŸIC]SYE҃�FW=i<?hn-[#%w_
    m]Â5XZZ׺flx;ſNGiO
    ؽǵ:g~P핋tcqUu9Yy9rT0|*ݻO:�/�zPuGInOۏݸ-i_	v�^!0;VW;t9کayu�
    oߔ�0.�;Oev{N1;P+?{]ےٙw#3TY-繤C=׺2;j=uUb&7u.[>�[k`|/ǽcyq);[vߑavM;d󍦟
    X^f6ڛ{A�c}
    �R/>&|a%ܟ6랍뾃;pvy[C[+礪q7V�
    <6^@[>Za�9.f<7O6ڱ%凴bm<w6Ugb[Qt6J?+6]
    ^ep|ؽG}n/]?{b63�zs޿^e^qz6TQ'F�ߺ^UK�d_9�~׺kx!G^mٽfsOFufnkvlv_ww?D>^4ى7Sce7T[v{`7~ڟcWi?w~dP?K7ng_ͯ8Nljt{ʗ{}an=ԛheKo_S+~*w.过/J|M{Szgw?Cny|[\{U׺3�e7#��f�w	�A?�ߟn?)Ig}{^;O| ~5g/Ǹ�9�#:Oevg`n"Wvl^#6ٍٸ7_lݔVuoL/MC]7-&[/d
    SVVLJqIS3%-8^%�b/�~Pf⽂~O{߸?7VO-z@�!kvN~b6F1lݕQrSbcLU؆^?O~�%o*=E8o{حUu;-{vw}qUd׺;kzvq
    ?�;ux/]z `uX8;e۝}m>[cI]W}׺>}&�I/Z@1wo{qd{ncc?,gHu/Cuq[mpVtoxPS{t/koݭ;o/;zk|#7_L4.S6_�nV8};[yt٪
    39J>{o5֮{uؿsluNmv�L_zc[clݝ~9d6v{Zol`u~ڻlm67fjkv^s{cy|)v7&;zn1pz{tTbt=oݝd{ySG̬g	mش]_Kxg^[?`nd�6wVvV|/m�Eݕ
    >ߝ˗︱?imvT,uo�[i{+)s}}?ٟ/};k�qe}6p|N1)r9<9"mmp
    ݴ;'nc@G]K>Nu_L|URM�'1vuW_YlfW`w^ժ?h߻W6Dʿ5zkzu_>FoO󶻛:?|4d|4Iv{m6Bl9-n^ :ó5��vgB|�_nv	OUzKswB7N;v�]RRuwʒ;e|[hݻέ'}Fڻ:mgv7dݫq÷nխJ%ѬUTTЫɋs�߃tju~{ߺ^׽u\3?>w]I;uʌ'Jtwrڽ5fm؝qjuOSgrG44cyrU:ui%�)>_{kCe=/n퉹GU|T퟊}9;Wo}_);/2]Y{g?K[{=K_t^7޽}sU�͇g)ٿ>잸ͳS5|>cgm=7<9ݸh
    ouvmu[Q]?>n.;s>Im학쏏}vMmz٨)V奯b#{V/-/)hwp>-Evldv?tl
    ?
    �cwMEm=>G'WulU]g@�]_#uO\n?So�ޟ>]p>"lMj旹_?h�x֣Vҩۘ}׺ G_#nFgOn�폐{;vfV=EO|ワ
    }
    v{?՝c㭻;[[n\쿌>5.d]_W|w=6F&mM_Ve3^�m/N^czt\{y_sM+S
    ?pw/-۽6'z�-~Cm3TgoC%wF�$?TY_7OV%0?v'[o?iG6�LPn^O{762&-$�^ƭJn+z:Ɲ&uۭyR;/wo`wenJmқMcu0ou:n_+zGmlc�7VͲ+NV?!~]6?ooܟ<^=R\8.u?q|c=0[7ؕ_}uY_-vO\|�E�:wn_>؇!6^~N꿕_!o^)k�5.?.]t2}��:�d켇f{[xFksa7x֥uk�z�_N6anFm�]{O?;>@nM۹{fc5;^{ϗ7mbr'2i@|%{qx.?ŠQYߥdUV33@=iܽC_ 0_6[|�qwkbm޺o{mg_zu� :_}7^j\=.3*G~:`u?=>W=nᛛeW؝I~Bpl~}ٹ?x{֥3t
    p]})׺3~˺6?z?`6o*ٻ뮲;:[dm�ޞIu;#M}C
    [E;ctmQ_=G*C꽝ӛS/oj=A]o>]ds5�1uyOXoK^�/j_n
    j{ov?GU]c+c{/qso^n@r}S?E5$g@^s{uXK
    |trt�S濑�O�;]-t9:uugrO]	
    [k'︫=⏰*r՝۾;ww'L6y=}SǟV?MS꾟�1KbJ0yΞWEfˡTS%�g~PfGic�W�C݃ݛR_󃬺nG{tƧ]_n-ͺ;4tge>EQv_Ҙ==H)%xo;!:Ө�+Zn1_ݖjk2t{{p:Wdn?57Ylޝ|炟c/;6p`mm\Ë+c*.;&wkl׺O'>_;תvw{|{[>*v7]j;guwYvdY,6ho=Yq96tP6ľu=}g�W|{^~?/;1�)w^oϑ�1vwlu�Z﯁]y-Cf
    ~c_5avw?#:#1}֗lト؟;}�?�eNvF	Vnǧq=(nu�۝?W{vnen]=fmXm{eu.RMWJ̔ti^�^/˟^׺5^׺u{{^׺u{{^׺u{{^׺lş-�j�ŗse/Sz?F[Kt'8=rx:z^χTm<>cudzhc]zMٰv)�ks�TSqUڳɏa՛磰=C 2t
    綶
    tꖟnnO])
    ,iOKL$H&Q̐H=T]>,ۏhUAy_	?9ob�NаIoml��}[O,{Ov�]bVv歇[o|)zu{޹?�"(ds|~m]:|&u�VOiu?�/�׿gY?�׺L�'Cߺ^�Id�֗�{^3�~{&Փ�Z_!{K�=u�VOiu?�/�׿gY?�׺L�'Cߺ^�Id�֗�{^3�~{&Փ�Z_!{K�=u�VOiu?�/�׿gY?�׺L�'Cߺ^�Id�֗�{^3�~{&Փ�Z_!{K�=tZ?�ܵo�^7:t��׺23�~{&Փ�Z_!{K�=u�VOiu?�/�׿gY?�׺-_7y?mo?N-Q{+?�/�׿gY?�׺L�'Cߺ^�Id�֗�{^3�~{&Փ�Z_!{|�טs6�It׺23�~{&Փ�Z_!{Wu퉘n=A݁K)Mؽݝ}VbM˿n}h?;7;ɼF!]QQ�?�/�׿gY?�׺L�'Cߺ^�Id�֗�{^3�~{&Փ�Z_!{K�=u�VOiu?�/�׿gY?�׺-_7y?mo?N-Q{+?�/�׿gY?�׺L�'Cߺ^�Id�֗�{^3�~{&Փ�Z_!{K�=u�VOiu?�/�׿gY?�׺L�'Cߺ^�Id�֗�{^3�~n
    ?OSMm+1˴vݛhn
    p92xʺJJz׺O?W!hn)vn˾{G{7bCrOok|e~ؼ
    n5m>7Jq43�~{&Փ�Z_!{K�=tX;<|Xڽi2x.o;k6oG+꿑wV?'z~rf
    ؘ϶aܙtZ|^*u�L�'Cߺ^�Id�֗�{^3�~{&Փ�Z_!{K�=tX;<|Xڽi2x.o;k6oG+꿑wV?'z~rf
    ؘ϶aܙtZ|^*u�L�'Cߺ^�Id�֗�{^3�~{&Փ�Z_!{K�=u�VOiu?�/�׿gY?�׺L�'Cߺ^�Id�֗�{^3�~1+~Ksgx?xի-{{^^׺u{{^׺u{{^׺u{{^5�|+�_mO:CV{#Q_&/RetVjk(ƳeO]#Pjʊ-y$v%Ǟ/alb(_ +_<"*A=3tжo/xI'wBdr5qf\e|5X;~'LC؝G7LOW0$<=>u/偭#CJd*h{g0:Xd=U`ݮ!w_51ۨaLpF>cUaRA�gbNѰIoml��}[O,{Ov�]bVv�Vz):N{{^�g�+/~AM7Y-Ge'\A7t݁�[�&-}պҞ?3i,
    ,6
    jfOu:_K_�d7w^{ޱ?n
    zw>E7훏_?{큥\d1lF&᩠^?_v6{c/L흙yAj`zmlfq]C骷P*)"9*1bu{ggu_w޿OQof�**Jocٛ{zgn[p9S
    KQj_uqڻ[|v
    s'�o*,wȓi2;ڝupg`=׺]|7޹__?�؟~Uv-(E+{mܵ[rӺ;k$)#5_k];_U'(7Qw%MG1�s==iQi}{aEr[SCAI5/K`]buw_
    u9�U{Ov\G޻dI޴NۍO3U0apw|{l'�_:;;8GJm=_dvXgq{f-pZ|dKK6蟈Rm?[ꎫ莯wcuG ۋ'H#]hvunwRzjs2T͡б/ɟU:+WN�e^_�3vsgƭ}�G}؛^Oc?ut~;ie3тܝ^;cjl~oQۻeeiY2>$r/TGoCwcyox{gg_0pl=k7miqn\FS&VIS9{'okQvg|tV+�=ɂ؝[mYYv}Ե9MozkzV&lOc(Sd1߼w7Suf>{{+.M}y~=geuY=*wlMi0hW%GOwL+#u.|{y_$msߝ45Kan߽~9o
    ~4>Lm�EojvW-xG!YGIf+}׺}}L_ע"v-?�?�?Ӟ;=5k^�G7e'?x3q7o{u`qޣ;p[fłz؛w;?c?Q>箤vdK;a-<yMAøTf
    T{w[Wv6?wRĺY>o�0nY{;���EَmڟxiM^|e/+WbtMO14KԻGoYf�bl=mh7Y1lG1t>!^Wcslzŝg2Cv|_sml۹ME&W	ei"*jH]A
    lb*w!wzx2ڛ+zlEju8Jib)1mO.On1M]A�ƝRӾw6;#˭]mҟ
    �Qt6c[qd[31.ai}C>=!�OPl7�x.;j|Ȭ'cu+m|W]E*m>XvIE.{�sO���ߺDO?1+:[צ�_1;nof�e'$[3۫sw7njkpVASVHhf׺-!/ʞw^*>}sؽz3'o/
    �['W]%n3ۇLK׺]fE_#U;&W?k;?j3[g7_TnTltNckfh)i;h=}{Mա|]d3|u�ފ>�t�Ҟ;׋W}׺}u~�"v/L~Q?G˯=עTO]{ff36o/]m;rm;ͺqcq~[xضeF+%K^=fj~o[vov̽w4Z�\ıl}ؒ#2?e[<֚){/Ŏ�erun?z?d5�kswa_{6n?+@�_fN:3flm}%TXe/KW~3j�pu/>y_`t��ǹ�d��y?-׺}=ӝG?�Lr|LuwK;uevq]Yε.8=Mfv}9E߻/^`Qݫ޸U8,EFmŐg	ɞmۖ+0XܫK
    &F	DJGs~�D_>׺>.G;2]
    ۟w7~f}S
    f׮ژ
    yX`c^XO{
    =[~6&m^Wv.rݍ{burT!7cn[wUNХ}@
    ݻW+~f\Tu_v}vC>q[+'lܟ
    ꝫ;7}=gK.R\^3qPn;
    /@Wo20s-]2[sNkfl8�wX>=rN휟xnR63M`aE;;݁KHgş]u�ç-n폙;gOn6+LC7`Ϟ}׺}O�cbN؟#&m8=3qa;<.{|×ow	D+q\J{u�wɜ2z;\ڛ�zO/Õ]bq_':͕{z=ڑjñ׺*-~Aoo�{җFtU?A_>HuWK,{Sp];+}bMqK^MܿcCOut O;G\vsW߻v{y�?|>G=1d頮^궷?ǭf~
    /l^?v6,_c/ߑwkv
    .o#zs_<bOu[&_�4lLf'n0忺[}%w`쎿\SbwzvWiS{L5Ěu]G>C.鏖*_ݿ
    av�D,�{wa|8?VtufuK;7۶wd]oW_�+�|_{^j�2'b��р׽u~{ߺ^A�4_?n�Oٽ%.M3
    r=F�̯Iiخ113EjJzX`^ٻ'iR_}]!7rv٩LΜ
    ~Xnr19*ȿ#ic'ڝmc9uoɟb`>'Jή^
    OC㉢>a:5QO]eoNXM+8p^;Od]&&ڽ1;pPom_w]sSxlG\|j>m˸3< ;ƲI*Դk]C80|o_3
    L:՝2oXsWWeWh>//̽Iouva~ߑ}##?_-K҇Z|�cwgݭǶlP�wŤI$u?wmnUb.߽
    TXO`۟{{/=#GW=qN8܏I|&'^g9!vWXm뾆_"e;Gsnc?>}'G嘆n܄q>K{ܟ[ѣ˼nܘ/[
    ktgv"w;
    I_o]݀M7Ǎ^gAdMX�=[>GwTb_NSfMɹz.]g-[}S쑛puc2Y
    |@Wk�3?qtEn,@]ŅNmٛCbn�滈
    ӰolN덩K9ieu~wNn確oݓ[[nw'f잛꟎}#zobn^3rn`a1xӝt=I&^u�ɝ]ѶV�e|lv۳l|y5~Hq0;jquFnnn|oM[ش1m	׾SJSvK30݇>|ߟ;�{o~MQ-'qc!{tk�sg8�~Jt%>ù:?{[['{o,iuwc*}�QY]oOuo%_('0?Gfv�_“n?'�nTG!UyF2l=6unm˭]vwpl}$~
    mսYً⪰_&1[#,m8t`q}׺;K~wEti/1'<N=7?g{['ß�!FYؼf[guw^b{;p{֒My�1;omK9�
    g|k;h>a?Ofve&Y[aoj&<&ޚi׺b_|U~>:6gha|
    >$w4m.?݅[wc;S'_SNC'^�-/lwowtq[>J}ՇsTu|a/O>YlӦ8Th6>ޟ_<˳+n8v?ZtW]
    �
    +o.wm#8UTe7${m~Z|凿W?qwº
    {f֝WU}+ᒓ%=-w_f2W0;`>׽_ɿ5龌`Pv1lݍC;%So+6&w	*!ђ_
    ؙ;nu~ˇ9כd2|\]r[cK#v
    .JEt43E_/hgwvnKFO՝c9?;HorW;7u4.6NGOi_DW\Dt�s+~fN+u_FWo
    - |l=KuSυؽ&^f;po<ٌ7_;~6fi]|v_ϼ$ۻxmۮ|폒z䎓b=4oy}׺2}1}ys-ٗ?|+|._|}_3ܽ
    7d|mݿw�,!{v-;PXn>\7]l;]G�eW/S`m+�?/.{t:^'gog}tu=u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽tٚ�>[Օ�/_m~!P�c�W[]�l@V�,ݗo��a�ȿQ�:��'?ҰIoml��}[O,{Ov�]bVv�Vz):N{{^GGo\q,1hОH_~+OPw޻+6ne[o
    6bswq`rWxi*bWDdbA?J'ߍ_]>1WA}?|ЯXuV{?_6'w/=>i5{tӿٮ_3f3['wc�Ym15^+	EM-\5DR(uv�нOћ7)9=ӻlw5n?UEUjXJ*ij䉪$6rF{tkW~ٹLV.[g#qMf,&*;WQSKW$MQ%=$10ܝ�:]�_u~v�нOћ7)9=ӻlw5n?UEUjXJ*ij䉪$6rF{tkW~ٹLV.[g#qMf,&*;WQSKW$MQ%=$10.OPw޻+6ne[o
    6bswq`rWxi*bWDdbA?J'ߍ_]>1WA}?|ЯXuV{?_6'w/=>i5{tӿٮ_3f3['wc�Ym15^+	EM-\5DR(t=Bw[+zٻ۷in]6;QmŁ=^+7妫Zzy^9>+~6yt]
    �BaYy؜_kkNO?fe|^͛nݏer;n*ʢbx%4rDSC9Hn	NX-W۴	seUxǦ;7e*MFC']QU;<H!:Y&=e:o_l~ٛ72d3e]۔XܮήWtdE^NZQ^Kuv�нOћ7)9=ӻlw5n?UEUjXJ*ij䉪$6rF{[_W;ivS]븪(MM6wxo-_UNwy׺BtkW~ٹLV.[g#qMf,&*;WQSKW$MQ%=$10{~'}]?/SfgjNOit9[bk7veQa1UyڼVZ"j)!Q^>?Pu^m/[[Jjzygr<w-_N[qfۧ{orչ35j*$^釧~'}]?/SfgjNOit9[bk7veQa1UyڼVZ"j)!Q^><m8^ާ؝Okwolp2]`_sZڟeI#^釧~'}]?/SfgjNOit9[bk7veQa1UyڼVZ"j)!Q^�k7t�_>w:~mo~;v~e>Ǧؙ[xՀ=uXv-p[9E,YIh:{.kk|Aܸ=??�Ox\AtW�B'%֝;=g'^^DoXJh|MU>ۻe/[?yl#t-۵5_sm>[{i2L+IM%]4TSTDF^Ǎ'֝;m�Zmퟱ6NZ?vX+w+U[S?=]L>$v>.;u�~{�Y��tM7'ǫǽwO薡$o?^߃/`uAt_.gej|礩{k|A�I�?�zޟ'_��(~׺Z-o=/ӿ'?c_N
    15]յ+;+QT'IS,/9OKI76-E�?�ul�K�3WO<_��G��oߺ^?	7;3gwWecN�=a67KpUͫߙNCtO\eJtL{�Y��tM7'ǫǽwO薡$
    3Vxl~ݻKtPn
    ;pc19X*ZjSy^9*Z{�=_.{ٝ�I}Wkl?+]d2�)>Y~!>/ƛsnӋ{}?_ ʍҳe7pؘNCHxjZZwCOѻ�q1V�@_۟W)N�D4#ǿ+ߛS_{ޝv�нOћ7)9=ӻlw5n?UEUjXJ*ij䉪$6rF{._lvW`|@۾nuۻKxPn}=Eޘ۸\o]oRAtZ|F:4+Dz|gd2ylo;[3鞠e7ȍK@n,eFJy(q;ƮVz͌)rOSc{z޶~
    �*|p�'ߺK N|OX-awWAt=֔�1}YGuS]nmU.:(}׺}?[n޽wn]Emnݻ/zknn;!rۋn{{+؛-5=UFw!$[Re^pۭ;/񏢱]w1a;۩`1u֛wblLnrhbI_S
    D#Uouh_�z+��~z_dzӧzbu?\m_޿M&W�v֋jj|G竩g${v~?:54ޯsGq?ZZD#>ߺF/�Y��׿;u�~{�Y��׿;u�~{�Y��O_F١_ :f󴻧c�fv4{hxL&+7[M\q-DtsFY{t	77=+bg;:yoh:uwVt;qbrYض&oC}e&fxOu}~
    l}ͷw_~F[k|k
    |qm'hep&V*Jib$б_	7k}߿ܿ?a?k�;
    >_gW=>.}N}qwz�6؛'c-_�ڻZ,VW;AYT;u+~6yt]
    �BaYy؜_kkOU?tp?0T[z1fsmIwMцp`壤Y''D^uO=ۛ[{z7;QWve?_sg횸75^ݑYE6*mᖎJJJi2jPt[~K+ލ�#ܩ�f.t[
    s}]v�6<Wm
    =wuwl縶Ew\vF;qt~{>қd)gtu;)wG>k5n4LRR{t,P�/3-gzwtt=3FjWŌSA͛[6'gUQq=.5fu_Ӹ?i1_=�K=A?76osP\8)MYܾeEQQGiIOo?WE`ٓ+_n_};9S3}߿՞M_u>u㸿_Y]CW�b|m߳kpT\o\қNJϑ�n߽Q}7?QC0֢bYjVI{q8|&+|v?}o\f#c7;ΓsmImgr*0<]%PC"{u@g}Uwf_cK6~٫qSUݭSo-h䤤)V?LX߄ix}~ؔ]ӽOxNk뮴Tbcp[#E#=.>JR!{tK3cwGm&+w'~?)zg fj];G);XlU^h*2tUH<i ^
    vjc2ً
    a�O?Wb`�J;�qZɫ|wK=˹j?Omn
    �_SsCY?^[1_fYJ(r]&zVTl]3cmX^ж7Ǎ�i?m7ozx��{|2|o?4mOן?Qd6v[> |m]w^tPlݑp+7άxmNݛ؜]AQPSRԼAkk*߃[sm벿-~wvomB-[w=4\&w	X)"I#uu{t�
    �d{[_?�&u;?#?<_}׺~'Cr}_,�C6olȨY}RaO,Fu?F'ߌ}-]pia18l.8<VVoH*eyZGt|x;S{ven؛kc~{v_6d
    Վ;*(_gI#CO㍊uo�e>�e|0'�oeW'_k�~u{Y}s:ۧwo`~{30Yf]otY,ζWk*M^2ZZQ^x{t,rw??w�~׺'s�γ�Wq�W{V;ʺ:ȼ50�$zOefO\NO^{^׺u{{^׺u{{^׺u{{^5�|+�_mO:C?!Ҷ,o�Y=/OM#e�s�~�u�9�NӰIoml��}[O,{Ov�]bVv�Vz):N{{^oﱾ׺1[uVm]Is;nojۇvmڸ->:-ܻ;6_vm^]K#}G@~E|_/sn}w쾚[Cq=GBz?.*|*Qo,ە;|
    ׺c|j�4Wۃ._;}|KU==(jw|`럍['3*H`aS̬A^A_ٙݿ�u̞_I-}^NM[K?Ia>?2!qƳd}}׺ŏx}A?}^�{替?ZlOٴwtoٵw^n^I#�혛uv{w6&rfq�GŏV>eï>Ioψ">K`w]w޺,f[zo?�O
    Eio~ 3]cO9Vw3;7=>=O�۩׽ki|G,'&O>2T\7rl\O^('ᅰ݁}|wM_6}6	?|}cnrnnLN"}׺7ŏ^uSmm'_=ǂ믑�౛�zoVݻC_s"de^c;Qg&N�fi|f�7C|\nd{}U3'9.:o&Sw}K�׾i\r|^}|�S!r}/[|m{?uuQwCvcw&fL%^/n{ucuVm]Is;nojۇvmڸ->:-ܻ;6_vm^]K#}GP?̾ңݿGYö쮪ܽOT4_KR|N7~`(pF<ÒVMSWW�c|aQ�ɟ'jp؟O/tx-݀\ݛ[[R<'5dvu":fnѿpbn?о؟'3=&']f75Oigw.wn
    �pm-7=-FC!KYVDs()=׺5~d_͛�u_zT=!z2?/O{^z5UhqM�?}kO[?obtz=ٻ6vOpͿZgJ<n}.Ʉu
    &m�E�n욞a7݋}mXW_[gjpURW*ji}׺՟͓!-uԛ;O#on|yl]u?P|@�@�u[?~a,SvRᷦkLԛs{pvO7b`|o�wMŶOo6c7bװRt?YVuޢa퓝#}RԘu׺5/w/b[{tݔ]W;}m~pYzͿYClTu2S3Sd_u7|m\N}5~N`|f[{#b~)Ktn{jJI*(qYzjm¯}O?qn??7۽q.w˶dr9m'B�>ʞSЛ;m</aN^~=q#vv*
    Yvk%i{>6CZ�5~_*V|<<[U?y;`l}:mg}DZi>He}?g_?wmlv$x]Uuݭ]?_K?F읙ژݷSvBNuGR{PK[n
    vnݓ=9VbG;kxv^2ݿ}z3��aLkqwvI[;c&n釧JuMDۯ	wUG2=iSՏ?ilNδ�z:˸:�f]n_ᙌ'bvͣ
    /k]IKYO4QȬ{ߺ^UK�d_9�~׺]7ϓ>gί[?FK!F>	1T7;O=IC7Okqv{UEf0Z�u_ {l/,�1/h|jݟ
    ?=7{GC�]M.{&q=7ehjje=׺OIݳٿ)>_{�oWw՝Uۿ/Wal?]EO@v?puT�Hܻ)ۑfL/B�7�k�~|O;6oO%�Kݯ߿?҃zܟ~fϙۃE7Gn/}qݿCϷ(Twcv@
    ׸2ǯ[Lԫl޻œKg6Q=׺qj㇦xٷۗI6[Se(i.Xm^Veq!਎H{ɋs�߃u]}7�	қ;�D/mv_IugdlO>d=%t�"3^y>bwf'$>2{|Xvv|Mcz[ok3#YC]sfKRvhZq*Na7.K{uGFݷ6??';o@f��./�bJY>Ad
    tڗ"''1[rAW^�O=?;�D&qY]s}=S;v6C?mv/_5t{rdoMI_1lgzпnG]N�6Gȝ_#ՃOwg~_vfBs?>=EwFwqxes[{7nLN+{u_ϼU�+#nOmҝ}wF
    ջU;C![c#w&N<}n-js0&+oT7tld۽lr�fgzҗo{?W#}<>�fmljK59*]Y%}׺()nNN{� :p`0=#G۱zO)ؿ'oln4GٴԻin7fޙ|yʸy7Fvfu6o^!vOi|ޝ)�<ɞ{V?NY
    y�-pm<D]jj}OD!^MWVOR>|obG|Qջ#{v߻ʯ\>xӻ)v%e]f6'nj^bXwf5E۽l_�?t]u&_=񓦻LPn?M.uJ,[;UNk҂{a�2C;^��s'1';wf|6쏐-ٛ>Pu.+ԳG_'o{nQ`}]
    {b{K}_YGf=ػf	}+vnmmG}ZJZ:&b5T:%�b/�~~{ߺ^׽u~U|i{>sBlp//T]9=GG?\/{õw΅Ӗnm6>+",df{>Gv	Иo(@|ڽt_ݬ?_w2tSv;ka[M_|g1׺Bk=mӝ=_OXOױŝ[{i|q{u|\ܻ:�%]ߵ?jUgtm1Zџ~#=zrؘgt_~vxs{[qnlo˸ve-}e5
    kc>(>=II>?uyؓi|x�&vȮKj6VW9YWbjf׺|Xc_a7gw~6`jq�YXnݿ>@u/h}Rl^wux�]G=G{t@3Ͳwy4 :b�>?3͹G#`|Xc;{LJÔZmmMЁ?a'b\߿/�Ά7Y[fugNu/{3WV:6Jo�ﯓ[o	O{lvCWX|uMn{ܺtn_'_|f`w-njGqϞ{nߋ;^㻃9򏷶~?Iq[!U)2ЁGv|%5o?,6*)3wvm:}opNCoۦ#ݔ9\{ZLUzUaS{�vw/]X;tv}w=sܵ]_	vv_v;]*8i<k׺1/ݭa{?'@_ܹ5u^^SokwomyWG-vu=׺꿚I�&�r.W�-]i]Rw-&�gvKs|l\tۗߺH
    ?9]} >O7Yn/?)>ۛxg>�H_+zvm
    \n
    WQ+ۮfr�?wŏ!mݟ?Y]n?uO�7`�^?ÿ͵pwu}pSOٿ>Shu-^Ǯ֛�r}Dug<ZMMՔcfkg^?|a{7o-?01ϜXnюMβ{=Q;o6L{3ʚ̯H}fcVu_zkn>}^};l.F]g;w69[.]?0cU]tu>I>@o>q=E?}ZvEn,ԝI~?ݽ/\/[<6{u_vGGthEE|g�E}6=O޳ݛB7|UTfŶ밙C�]c[wgrs9/;[]v?cM� Wm\{?IQwje>7>�ql^ovPX:q.�e'6W/n~<_ܘ́{t޿gl~Ŭϊ/�;[cw�6^
    '�%n\>?ҲnŸePRMZk;W;[?6f79X?^G?A|_~/vw_,F=un]_V7l9Y{G7e̟TWSve~m˴*Ewq
    GvmwN?om#y,fϬnJuůp|Wf6/]YNl
    rWasSvۧ;xmꜮQTb{O{'OmnO;�?~	nW,;Ư+KSmaػboA9^⫟a{tP64�a�qO
    <Ƨu'ԟ.?gJ^蝿~_vc'ȵZSԔ{z<>5пb
    7'gϽ>^t.e�Ǿ+zùvti>@l6-<e7ǻ7~:evGW|^.쭋;vOa�Zox\˶'1{poFBm
    .ԕ5OXE{ߺEW~\��}Ѫ׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^fk,oVW�,ۛ)ҟuCߴC_mwY[�{v_ҞG/�"G��Ws��W԰Ioml��}[O,{Ov�]bVv�Vz):N{{^oﱾ׺c`~쾭Z�[">v̖<W6d7ѤtX:[:jMTlyν~*Tm9Z1TAlqY{mݽ}-2�+:~u=nj>;hp]3�NZf(pnjw<Q;{m{>_gO|uug7Vvq:~S޲,
    -Nj2Sb {t t(:Wuvenٛ6냦S{?֝m_o;)qۏkjwWd1T�u݉=Y})X/GYw_.]O1lNۙ-_vC1^jk)9\{tX6j}/>:^γٛqxV8O_d}Yb햧sεyc׺:+WtwͿsv�uX}zϩ=N]?SI~ߔ5;xUTt\B�ll՝տ^_`^?ۿ^g#l9!4u\|c;kwp|ٝ>S[Qm^骍:9׽cOJ'94KS&*H1
    +1{1Aһ+uwGp|>}7o\5G#yl~
    4gH}[S犻%UGIt?6Gq]˷pl,wopؽ鶭fy:vmMɪru1bZ:s$@gE;Oqnݕ>sulM=]ۗ{_I|hM;;w'5+=NݩdC{t t(:Wuvenٛ6냦S{?֝m_o;)qۏkjwWd1T�u6&Ο4m-q
    [wbf0bv.cqTnwma[lR1UC1U{П3Ǽ?퓴u/
    gtt3`|靉6%~}_?Vmo.}䡧35u1OU{32uAbwWavV}cnn:kY>Gii6=ûWqvJK^_`؛`ny�Z<q�}۽Ush^
    GۙdԻIYQ,Zu!׳_{/>ZeVt^]Y{3un?|wjgIc7읽="Pݲy֣/5="wBAbwWavV}cnn:kY>Gii6=ûWqvJK^A?E�;
    w'a]ŏ?h&^-|܉mՏR撫7Y1Aһ+uwGp|>}7o\5G#yl~
    4gH}[S犻%UGIuvNv^.;O>Dmݎ703m`mѸiiOqD|s7^][;gqf퍹>=g[cǮn?tE\vڝ<U*:LU.?{;j=t|^;n� 6~@?7սtE2Yw~|ٴ݁S[vGUMPl/IW{t�vtnުܟ,_nߓ8)~'Sf38o,~;!?'?m/}m5Tȫ0ݣvC7{t��c]~7̦vb>Q]ܸT
    w-63q\um!)|#RDyT^|Uǥ3m#[wgi6ē}ͱ6u(llv'[m*�vҥRG)嬯zʏu�~{ߺEW/Y�u^ušw%{
    }˶(~cw^K>mg:�{e3;NKsꙶW]jpU>(!^Y>nm?ow7Sm:Gjgzfm1?%otTE)E^l̞'b.jϚ/ǧ 2(T?
    tw*]ܽ)�'z.3wQIQy׺?w@`?٣�d_D�ٯ�}W6V��?Wu߽{vݣ{꿏�foZ?D=�S*[z?c2cvM屾1_ܴgrG�ߺEW/Y�u^eΟp?6ϗ}>4nnnn~kh;A
    _w__G``9Yk=CwvEtӭu�%YGtM6̝caٟ*>]n�9ܧr-^?oH'{;�M~ݧ[1ܿ#/N̛wu6&k&WfǾh[32>;/e?QM?w�M|^[xPuQL_r&ʟfIU;6Y$^{~(v�ϪlOpwu-{>*[�aM۽ߏg|]lv~(fT
    Ucht4'YuwG/^]%�&u&b}Kk[{[`vvw~j4gv$Cg׺OԻp`G2lm{1/u|?ӟ8j]gTYzKhg{N}�䅶7F[O;>m�5zs}؟K]T)hf)ruO$UIq7F�>\Wo~9_il
    vO?f͔,v]G[,c)]:
    ۾'{ow.nIN;ߣ{Ǧ~GA(;K]sɶ1ko152m'T'�E8M 7WYu�7RE#>Y�|ߐXnvnۀ;rub#C&S<2 ?,Ô|��HG�{WW7_&_o�O׺?�~=&qk~vem.VM$slMJ0mJhԵQପjk+ަ{_&.��~Ѫ׽u~{ߺ^`mgʯ;iptuU۫۽go[g.
    ʜ,5�+�}[~w
    >O*o]?DlLV|ᱝß!+{vm7`T읥USn815>EUis
    ?f{r.:V;HvL	a]bLiu�­S=ϵk6rPT6c~�_	 REQw�ƚ6osuvOMoހܯ+ct7^?[k08.@;quGzø;[m>Yn}ߛ^?{7rZ;3f
    xZemnmg=N׺OWg|� >X/>_`q=?�蝻v�u,WܞtJ1�e_Q^V>[f>~|=C
    ;73GݛOk/;gZvג=Ɇoʗ9^`׺&]}YP
    N^�s~No8~_wvkv_.]3oeeRϜɔ܍^|T[{voCvGf,o?puQ+5=Iw`wڝٷ6fvoS7m}I[jt/?O?>Cezoz*,GfG;7gf0�~{)^n`0-CꊭKPr5t{oR+hk?8wnj;_~VdtWs?.?zŃr
    >Ѩ_{q�++bbӿV|}Q
    9}n\Kd۝֐}.�G]uvڵy7+Oslg^�*n=]؝kx�3|e}[ß8/7ht5:�~Ml{sfףPa(i"33�?˓ڻwv�ؿnϑݻݽNt]Kzmne?t]ո0Y
    ߇W`^ć:ۼ~@&�i~qn]03�3;7]m޸�m]0Y=W_ou�
    wt| 7avgo7''r|q>UkXۗwηAMq-KL)E%~vE_MyS}uu_@}u.k-Qmߒ;\ʞ0}5[iwfݸ
    ++V-12e3-׻\[֝��s\⏿o`n~Owz:[%YuW<|-6VլgqZ}Ӝgk=׺OStN[Oٛ-U[|ٻG7VyCkdm۝7fලڃ	CI%1u\(8wfw7o�~ܝEw~N|p|>]Կ;kv>-n>b՘7W?_b
    peUސuvzOvۻOab2ҝѸa^nmϜL^%h=׺'WF.;IO�'kVm�lvMwnj;n_){WNܘ==]+kh%&q{i�*۝߶18/oL&|ڻӹqVZmge)vl>CSL*FΈNm�;#Yo?SKo�/٘mnߟ.
    п.W`Wp�f^՝Yv~}lZ|&ۘOmw7>#qvdcs[g>M|߻ʯ	U}wwnfY=ڤ^@&Ĥo ;Cv|.q13 3;ad=eܞ\fv;Ln3ou^.�N~veV.M>9f2;wwS'嫥{+3,v_3ەxL.;{t߉5[Wbv-~hd1�s#8}df9#jrx4q)7wIC['{/>)nvktgYl[3;	>Uuۃ[5m͌\te=׺3Oջ:Sp_~ٽ[[kc7؝1Oh࿌,_pe�mE=?WUVTx,39^@U_)ߗ?A?dtju~{ߺ^׽u~{ߺ^׽u~{ߺ^׽tٚ�>[Օ�/_m~!P�c�W[]�l@V�,ݗo��a�ȿQ�:��'?հIoml��}[O,{Ov�]bVv�Vz):N{{^�g�+/~O9|;=`|ffso7QYG^[?fgwL+II&[-%DjL_w77VퟗU*{ÿo2w?FnLIjnόYVbݐa+0x)Mjw׿[~]U_6^ow1&{>1e[+vCUSa৓4y޶_^�gssunuW򫧰[y|;ۆy0?{S!gsfHv~ŕnl-
    V	MLDz1~]3+zbuwruvګ^yn;cTo?wM6?w:-Il]E>RjʺLoB}wѝzr7:{v6.>sdvYlP<O	ⰒIMm%<$!2/ECջg_ʮl-n}Lmћa!ڛUad5XJ%6
    y1Gk t,t/}vf͉{j{{pwYϼwslSMwL}4t}Ķl}&=uJɫ*1-ӗm؝\&/lQi76cq{[n]ųm6wpT´eؼbTL$�gssunuW򫧰[y|;ۆy0?{S!gsfHv~ŕnl-
    V	MLDz1~]3+zbuwruvګ^yn;cTo?wM6?w:-Il]E>RjʺLoFKtl,'kgwW	+kTmMͼ2}Ee۵{qlM0%$l/!I2{tEq�:?�~Ctfwgz/]Ӿۚl¾Nۋ|}pSҬrb_rc0-^b
    x*׺2]+>LEug�_[���xߟ?4?gƾ�'}^wtᏨm-łLy=ۛcl޻vQSMwg-_R3
    ~Ntxd}׺eg
    =xΛ3
    Rm}Aϭ>E�%ջ`}_�̘RÕj?u^ݙ}޽Y::bumUu/on<Ymi韏}nrؖ
    Ƕ.)Y5e]&7{n6Nޝya�m>Le6\kn;l39U&37O-6FP{tL[~]U_6^ow1&{>1e[+vCUSa৓4y޶_BBfon>^؝]ܝ]::x[pw64xMOιlKmcQOЯ]Ŷ~;gs޴9ܦΧ^ݸͭK[?1s;v-bx$ES[IO%C"4HLP�gssunuW򫧰[y|;ۆy0?{S!gsfHv~ŕnl-
    V	MLDz1~.ne7{uGo
    ='q0u�惹vcl.wv띿;m632墪qݹCOQl^?t/}vf͉{j{{pwYϼwslSMwL}4t}Ķl}&=uJɫ*1+�i��^Q6~O>M'\n.MSwcb:{en*}Sn[öխ9n:|l%l{/][-~blTt.gqü76U}1+3nئ[?-n4لM8h{j-0}p|
    SY>I0O}/|
    Ngi39:/P{tku~{ߺE�ȝ�7;ߺD`|3/Tᅭg�7Lᅭ;GwZ|oW>/TnO]5jgz'iTgS63i=׺}%ߝxό?jvo[|d|՝G;-]m[Nin\]isiE&SigqdR{|{}~8u?Vl%ouGɝ.3w-o+	WM6/7El,3aJ>1gO�E~�dw�_Xɗ(
    �'O^w�4AcvOw/otG�,._ k#-)snkT팎O)p{\&rmmm{awoVI{�odN�ɛ�{{Wvuצ/uWȼa'=~@m@�'5ۛ?l]bゥ5l[i1]9(j-GFJ2!Ӹ>zȌOtR.ϟ!{g	hwgqtY#f)UxETEU#${.xc2Kgъ}Uy=}atf}{*i}~')95^鋠n|f;/cv�+Eu{7go흊ڸ}ٜoMEqyݼD5r'ߺ^|T^v�JM=;/-vKIm[ݐm?[1yWixiqy:?u.ϰ3|E{btG8=cOϐvJßi=S(aeI!K4iЯO]Wr֓f۽ݴ8NӖ]ϗGlV7F+cqۊiS]OJI~=6LdvI>6-�>oxwFlW]}]cu;7x<;:>)fjOu_+AwJ�+W{+K7NQ 7Ecv۽_ 15.?ޒܔ(#Hj{tT)?gnmIOS{vu7ˈ;l,~:CMG]MOy|}~;'
    ]߭{p1X^g}W_2o!q}7KnYYvoy32n>񛾮*zO]g=?7>�KKC'u.J>1\%fG+/c!d׺]|]d3|u�ފ>�t�Ҟ;׋W}׺odN�ɛ�{{{{^׺u{O|gX|U~JŞ#^grKJv'g`YZZewFFc3<U6J^3na;:ogG?
    ~t߽?˥>4l|M+9%s:J6O2znQa}׺2_43lOe+?zbw}+"vfdw˫_LZwήrZ2l%]F?Яgl~O]ǝtC;u흅v_aI{;t2c)XNVjtpc{{>Dm�n/;U{{gnnj,~3-Yk+1Rgi1Y*i$j#F@[{쾝]qw{7v{'?-_�[[!egqUTU>	UK7Q2S7&	>{~6.Sm-_g.߻gIUY=yיݛݟr&G^ca^u0n�=O]Io>ӏܛ.o͑m6w�u`qY}QM3h{xc2Kgъ}Uy=}atf}{*i}~')95^؏7Qs}
    [zf#%{?sUϷi6=6ښ቎:JjCt,a{G.Z{bg_3+}NmBzOM|huPx*H{//==nvklXczxnjI5^ݑY!ٻ;MSII[5B>.JM0Our_(3ae_WEb%h_s`Pn<V'/eZwblLnrg I_M3#&ou_=o{[g޲ٽǂm;{Ϭ6fMY[	q[RjS|,TD_{ccvYv.?yWvwmͥޮ?2? !d(Mkuȿ�=:{?-Q~RnؾΈXHՙ7~W\vGEF殯p{u>nnmb?z{;w_Y~mn^/xufb}gq7Qdɸpnj2:ct:e@G@gV|mt6mmݙ~oQ
    I>⦫ۻ[+7D;7pgiv~Z9))+fGթ@i	Kl>쾴Wcįnl
    gs>콫U"Mn\ul|i+yDs`ԛgk|[7Mzvy=S6|V.+tc*M^2ZqO^t,ln>�N؝7nݙ[C!{g1?4IoOO/_\gڞ-sݥO}a7\6߻xCmntv~u\IO]cw׺w̿OYg{kfqFiw
    gz3fÖ4TmdUJhd>!;YSa{cwff2w6�4pkKryYN*̹ǵ08̮''9
    *zuZ^܇Nh"0Y=�Kػ>|y&١޹ӴqfpXUUQTHu/ݧ�F?"+�m�O�K_in_+=�om?776cw_}v?Pպn8z1wS~[4f򝁶3I}pL@V3nc:z?,f+Sq|wnC={g;oWwKo_93їܒSM>+Fة><tV2ӵ~QS_zODR�!j>9fct~W3:oa1s<y,x{нo:c[zsyvoS`ޡ-}{y>ulk[;)qf5䥧{Ğ׺Io��(~O~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~6fϖ�e)�[_}?�A:y�:Vś-�P'e)}|lb�/?	zְIoml��}[O,{Ov�]bVv�Vz):N{{^�g�+/~A
    �q?'w_�F3�_ޟ/3h{_}>^Z
    ?~L?f~,zquܿb;qQa<
    .n᩶׷>#~zU'y|e0=;wvkn]e~[V.Տ	IOKO!sVH1^?S|l3?eg>N|O؟fo�C?|	�\|T2︷Oʩ+3MUzYm+{o>aX.�{svQvn?8Slwe6m#KQS:O]U^/{`.cvWg|e~Fm_uY|Uv~?}nؗvOfvLTEQL17Y㯧_LT>L:={b|YO'ľٛ��3�f5~Bb/?7L-wE�SUClC^wy?1[ϪXwv?/݅7Tnnݛ+:>-M0grATμfUC^u|SN=~0nGO2o^=2{"{>ͦyb1`!pa޲
    :3G/AGV|3o;iNXߕ]AGݝ3[5/�}}yۖ(X(6{߄77@nnu}5<Uo{!3!y-llw>+ps7;3XV5G5l*n
    Mm,Y
    s{}DFݸ2_ʬPiwytI||]_8?"_^O�|p=|
    óI|X?6[Usr}Vy$#C?77pOf={<6FNɊ;ظM	+MȣC^g77nk;9^v_Ro><[fm>ڻ+6콿SbSA@}٩AGB{Qt�^2w�'k|`>$_z]јOݵWgw_>mn{3kunҮⶾf	EI5v7!GFKw]_M|m{{{[nnnvKv#'E|dGϊ\&dQtsf�I]lNǟ cFJollW-ݺ�G
    I\XLDpÙ{|?{_��Nv�}{/Nu?/z/nc5;2]aګrV4ouޭ5>+o?^o.ݛgzx|{wM|}ʾwy~LVǵڟO\k{ti^|0<//EwwRTcb{[-XۿdmlM_*fkpZ|gL?z׼
    y??n3:wvmn
    ?Q޽5*1[j|]>ކrQ/.v_7�߻aljٱ?;,.{}Opr; 6X}K3afܹu_:>Bw`uEtsTW;;3ntnI|o/޿ ҆+}.Bl_a׺i��^�1}�+emٴ_d[xPv7^w=
    �T-ذL6TwhGJS(s/_ʛk{walmbn
    =o�%{פ=OS?>[�M|ZqW#S'_w6sPn|fe(׺aw}ڽ]
    V�]łGo^[ms~>
    1W~}{n[ӛRQdDՒ^$]ֽ+Mٸ7�}FNLz[z'SG>uur$ӥuOFߺ^�2'b��sl9wO>e[~鿒C{N�kvf?ݝͿ6]ufm{[#[*#qdLxVAbܕL4ϵ׺aȚ/]v~%?ft?]}NcAIkHٕ=ǂ7ne_\M=QOE^tu%	zX_9y/^]7*Mdnoϖ=ۛrXg%\mOacY:ڙ1Քu>/RL��ewEW:,o��o�!�F�'_�o�~׺bA3_;ts@no]z,?Hc>?/^wwW=Ví!agz:<-կmv>ۻ+emٻ?KimlF?o흯v>ۻwa0XLU$TԔEOMOG*({sȝ�7;ߺUW?ɚ#)+ڟwV�_|f_=?wq�?opd�;^'�?ڸߍ5;`U|86i}v,Y|bx&+jvU.޴ۋntOo˻6e~Gwf׺~[[\/ouf~?u?_f*;#wߝ/[_i3[+t?f6Tl݇iI@{ޗV}ӁOb|W~6c\팇.{ћ7w*w]LJ52Tq${t,t7h�e'0,>s+=9K}fve^S1=gz?\f'6C+]KR,n~Gʘ?_oߍ#zi{+!ߝ5ӷ6oMي8tV-'ۙdpwOAF{`;im:<z�2>yk{vCNܙ,[zf|cj߉Un\6cCO[�̊Nݝ3�Pb<ftK؛>Dݻto_9mމkef憎%U_X?&~XQ|X_
    g�QPm%G�ݾ`|.A`?SC=׺	GȞu_Pg^|moO|d6Em۝1!vM1[uvwwgb-&
    ը%g)=׺>T?ZښύVeȺ?cdrٞ҃k|g}>Jvw>1Bםa۳[9Mϊ׺
    :?~=_,άJ7e�3?}ѽ++Uuk}I9X=TA[VK{3~|[>ؐv?EtWZ⛭7f'/;;3m\MxDGN>+-�̉ؿ3c}t`=u~{ߺ^׽tLvuoyL
    �o>Xo_'K]:lO[|쮚VwvezRbMiz3_0el6|0ߌK~`
    V1?*1][)9Jc{�wGswbgvw.jg|E{�mf`~.|yQ;6t1*=׺=_ȟ;3gEl_3<7>n9l|7#zz,
    C/?qSc|<GO=)>(|߻�'҅&
    %_+==/El{:3>-IW>c6nlJmŌG{+>w̿�_9
    ׀S3؟K]|U_||^}Ԭ\+ϝLaS]."zu^1?z[UVVkC|Wջ۷3D;Ϥc??͈9tu7jRM3mu}7Rd*z`m�Icn`wnl?1]weŕ쮧~#l{E;'-#QRnuoω&zjGttV_Rov�ݭ͏w{m]sQb|/펤pog[�9{tdono{wǏxo|ە"2񏻻
    C~wwɞ5ן4ݣy|5ym֛c&fc8\tw>ԥ].{·!MV`0ό{u(.ȯݝcjv2Uԓ<K/O]bq}vg3
    ?j/'qg%؛>5L{3b"E{w#y?uU?ˇsr|)[ef7tΦ.�Mj럗ٍA}ӕ_ }x哩~8[G.ՠLǺU߿+	JmΧ;GQtcng|˨||_�<fb~fryǕMݼ1݇>[+6NW3bo
    E>*|o9�(-=9-1]_QG}mouK=]vSmfξ1^^w_f|%]WþX{3z'N}uu4YMOrԽ\,Tu~\?&wctVkv_sҿ&{Ckplߓ?[6.ܽ9o~ٯG(
    ݳUWau]bq}vg3
    ?j/'qg%؛>5L{3b"E{w#y?uU?ˇsr|)[ef7tΦ.�Mj럗ٍA}ӕ_ }x哩~8[G.ՠLǺU߿+	JmΧ;GQtcng|˨||_�<fb~fryǕMݼ1݇>\Cs&+?ߎmOݟ$sv>Ϗ:=zN5[7uTe}^;&]%n]}$8_uX?&w6]v�f3b;N]Խ'pc�{3{{~_}4`屹)2{t]Wjqt7Z_K�=w
    ym7m\0[}wKٻ'=nNoKF;@WL*=E~[|?Wêo['`vɟ'kO�ϗc�w{ٛSWVc׺v<wxl-[nvl{=7Kp}_}#kShlڽK#o:uo>?s]vߙ+>AvW{kxn2;gۻ3Y^퍡S8(retؿi?WwG�a}cEr]iQt>_/>>w_mYnM~[Gmv�hs6&Mɱ1Kҿ?>yܛܛe﫶>?bO~jba+7fk{^/>Aޟvbgws?rwavۯl2l.fk;~&`]EeE>*ovq/{uh^׺u�{|�!�vwߺGSߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺMY_�no�JoA'?~G~Εfo~�Jzlqo_/�_﮹�s_޿װIoml��}[O,{Ov�]bVv�Vz):N{{^wE.Gĺ:ȼ$zWabO\NHG{^kݔ_['^{37ݛmͫT7ܻ1`G5UmmTSRD=׺�:ڽi3ۃ1-y'\vRvؿ'PlOivui7|5;w3Ot|T{>IQͫƓ=:}wmR|en'jnhuFggVwϏMYSs4WIQK׺ڽi3ۃ1-y'\vRvؿ'PlOivui7|5;w3Ot|T(:/=u?`c7	>}˴}^=>no/Ei|[#QUWKп)zam]˾Oo콓gvo70ۛWi]n˹wc)Gm"jک{t�u?={;xg\b:[oOs_W]uM߱~O>lnk*vf
    *08}׺Pt_s{~n
    }Ӱ;i{SwUu/}ݚv^,G{vR~ڻ}o{'e;vna6ڻsS;rR,EUSEMKM++0^�돒{3jvnt]T#纾'qۃ)IڛbC}?դlT<TaqRt+MT+$aPw.aGx_5�wq%Yl-GIW5^+#
    /Bw.Y=Nټwnm]v:1w.9#X9kj'WTVa5v|`�4vfms6�xLo
    ϵ[jplvIe~
    *6F?MJ8u'#? 6�?'oo�2KԟߏI/tou�N�g?ߺ@O[r;7Vɱ{wZM=/YAѮ4Rn:e%]|57^+MT+$aPw.aGx_5�wq%Yl-GIW5^+#
    /Bw.Y=Nټwnm]v:1w.9#X9kj'WTVa$(fIqm϶>Guu|O]uײR7~?:{`#MIǦ٬۹x+^A}W6WIN.ώ]MUԿ!?Wvkuyz,>LKZjVF_uKj]{e읗;xٹڻOjuNcp]˸sJ<FosUVM5-4O,{>IQͫƓ=:}wmR|en'jnhuFggVwϏMYSs4WIQK׺ڽi3ۃ1-y'\vRvؿ'PlOivui7|5;w3Ot|T(:/=u?`c7	>}˴}^=>no/Ei|[#QUWK{�gCo��_[}Ǘui׺4ܝ�:]_u�܇�U^?|Gvbp{
    )b\[sYڻkxS߻}q2)8rVc$\;!IK҃?Y�׿;cu�~{?Y�_gYoYYC橛k#߻$EPFp^ w3,V->i󟣺!]i^2MK)25٢˚OuYOqA@Pnݝe|\zφ9zjen=cn>Skip:+ܸ-\
    J׺PtG�#V/gugpPeͳW~_|uڻ#q}{3}|;Ǹ6%Nm^桦ʉhV{�8̖W?i?�/Z���~�߳ǿwuaRw~?[~l�nv
    S|ޝ5-7?NupnOٌRnm/WQ1d}׺;�ܝ�:]_u�=lz5L$sY1'*Z4>ߺBrvFt;`;L&##k03:>}Ez+su[)Epn2
    :I뢨ouN�g?ߺ^C�tt_v['ޛ
    6v{n=6Sf6[gvwY
    Um,USJ쌬}׺w.Y=Nټwnm]v:1w.9#X9kj'WTVa;=Y֝յ_ގٽ[0-s6w61^k)k)&9{t rv?w!�~׺�>C?ǿtwu?_{h~vjlMxmםU=C�ߺLC$M+1'FS#X~wepnMnGtkkmGC۫RdYj*at5>/#%7@a_{#=t]Iٿ*Ӵǯg|a}Bdu>':spu6n?3x?EH#b޳{3O+]ޝ?S~uun<uMR.ؗgemꝅt:Toc+-j9|U^nܻo2tU/u}Mع/>]7[OR|Jeqt{;=Y֝յ_ގٽ[0-s6w61^k)k)&9{t3,ηTI5z"Hţ@8}th?;cu�~{?Y�׿;cu�~{?Y�׿;cu�~�7Z#՝Yh�QZwXa}F;3ttGn
    }=ٛ[nmo_[Oi򼰉=׺Pt˟"7[
    ۾:�{/mbwFOۿ>4w6c0ԝ=>?릦XϾS{tg]pAS6Knc25[Wmovcpo#vR&[>GV*dd))}׺gY	wXyp}n<uFj]-Nm#amm:cggbGY}%WJN�g?ߺ^C�tNܽkt^{3;KkvuA]˴aOfmO]gd96;+ֽ5u<׺z32=Çø+2l^ٝי٘-wF.0Vs<c1_=^:A'uN�g?ߺ^C�uN�g?ߺ^C�uN�g?ߺ^C�uN�g?ߺE}';n
    vO\UF\wZml7n
    pl&jZ:jFO^{3O+]ޝ?S~uun<uMR.ؗgemꝅt:Toc+-j9|U^�N�g?ߺ^C�uN�g?ߺ^C�uN�g?ߺ^C�tδΎ-w/{|it3{Wp�kn]L){p7]<WEr6"bURE�܇�U^ܝ�:]_u'Ghw-7Dۂ{>{3--�>EvCSw`Ǻ76lܛo%︰k^?|-nf)o{cޛW#n_ۗ`bilmٽ+z6s+&=j7>ߏ%ת~o|/j-=gpfv?2;7;Eڽ=G{]_U[?vQ}π#ѿt_v['ޛ
    6v{n=6Sf6[gvwY
    Um,USJ쌬}׺Prv?w!�~׺./EK'Ҏ/
    4?$YY_+9<׺6׺u{{^׺u{{^׺u{{^׺lş-�j�ŗse/Sz?�{?t�t�6[+On7Scz��_��}u�~аIoml��}[O,{Ov�]bVv�Vz):N{{^oﱾ׺c�ve^[�u>m̖uw7Wc~>Dר{uL9>h/iyM;{
    ջS}l?+8Ω񟣷̾Mڻaong7|stUd|V{{{wV/WlGA�
    R>+ni㿙NS;>(vBźkJ+==>NZ^^*u~[ðN|]:Tu~o?ǽ�qnm/vz�55gԕ?q*VM(>'=粺qewOE뮹yǾN,>E;+�6Yu;d7)7EnnU->-^_j|/~0w_>|^랔3rT
    vWn|ݓ߮A-5V7\5=,T{to.m�]9�;iwoQ_%$��r
    ź-{/ۅ3ˡwRTm<�nY6tx˞
    ŗ?c:װ;3쮓PKenݓXܦsS]/Vܴ{轫]/:뮟ߛ?>vY[GG_:~A78Ev+cjr:E$5>ew̛z;o??Mw?O?'-`믐Yߒ=wv__woinwG`{+չZnjп5߿';jp-]m3~>d~*]q>Y]p~b$v;u59O󉆧mu�vn\vڻx)f#iRm=`9Jmv.qm'e\IJzJy$&^~-mߓ?ƍ_/?ef:vž޽YG�_/q뾡\`o~ߔ5tw_&;krT1nFߺF~]㺻'ooXwGߍ0|P܏rr={u|=\~TNr,5rF{w?_?�NZ�e�-j�p�O�׺+WGv?؞ݙ~L>{xwn=xc;콭dwy&nՏ/fwګ?'dn[{wߏ7W\oO{x=+/ǟ:Dg
    Ng5|a[c{�Y}O7-9MT}7/v{"tԻqh*4NM6-uLcgOuzuiG٤S=Ptynӭ۟<'::/*Z|W#3T&^_�4>S|ڻ#6Nn
    :#l滯gIN^?>BNik|ŸIC]SYE҃�FW=i<?hn-[#%w_
    m]Â5XZZ׺flx;ſNGiO
    ؽǵ:g~P핋tcqUu9Yy9rT0|*ݻO:�/�zPuGInOۏݸ-i_	v�^!0;VW;t9کayu�
    oߔ�0.�;Oev{N1;P+?{]ےٙw#3TY-繤C=׺2;j=uUb&7u.[>�[k`|/ǽcyq);[vߑavM;d󍦟
    X^f6ڛ{A�c}
    �R/>&|a%ܟ6랍뾃;pvy[C[+礪q7V�
    <6^@[>Za�9.f<7O6ڱ%凴bm<w6Ugb[Qt6J?+6]
    ^ep|ؽG}n/]?{b63�zs޿^e^qz6TQ'F�ߺ^UK�d_9�~׺kx!G^mٽfsOFufnkvlv_ww?D>^4ى7Sce7T[v{`7~ڟcWi?w~dP?K7ng_ͯ8Nljt{ʗ{}an=ԛheKo_S+~*w.过/J|M{Szgw?Cny|[\{U׺3�e7#��f�w	�A?�ߟn?)Ig}{^;O| ~5g/Ǹ�9�#:Oevg`n"Wvl^#6ٍٸ7_lݔVuoL/MC]7-&[/d
    SVVLJqIS3%-8^%�b/�~Pf⽂~O{߸?7VO-z@�!kvN~b6F1lݕQrSbcLU؆^?O~�%o*=E8o{حUu;-{vw}qUd׺;kzvq
    ?�;ux/]z `uX8;e۝}m>[cI]W}׺>}&�I/Z@1wo{qd{ncc?,gHu/Cuq[mpVtoxPS{t/koݭ;o/;zk|#7_L4.S6_�nV8};[yt٪
    39J>{o5֮{uؿsluNmv�L_zc[clݝ~9d6v{Zol`u~ڻlm67fjkv^s{cy|)v7&;zn1pz{tTbt=oݝd{ySG̬g	mش]_Kxg^[?`nd�6wVvV|/m�Eݕ
    >ߝ˗︱?imvT,uo�[i{+)s}}?ٟ/};k�qe}6p|N1)r9<9"mmp
    ݴ;'nc@G]K>Nu_L|URM�'1vuW_YlfW`w^ժ?h߻W6Dʿ5zkzu_>FoO󶻛:?|4d|4Iv{m6Bl9-n^ :ó5��vgB|�_nv	OUzKswB7N;v�]RRuwʒ;e|[hݻέ'}Fڻ:mgv7dݫq÷nխJ%ѬUTTЫɋs�߃tju~{ߺ^׽u\3?>w]I;uʌ'Jtwrڽ5fm؝qjuOSgrG44cyrU:ui%�)>_{kCe=/n퉹GU|T퟊}9;Wo}_);/2]Y{g?K[{=K_t^7޽}sU�͇g)ٿ>잸ͳS5|>cgm=7<9ݸh
    ouvmu[Q]?>n.;s>Im학쏏}vMmz٨)V奯b#{V/-/)hwp>-Evldv?tl
    ?
    �cwMEm=>G'WulU]g@�]_#uO\n?So�ޟ>]p>"lMj旹_?h�x֣Vҩۘ}׺ G_#nFgOn�폐{;vfV=EO|ワ
    }
    v{?՝c㭻;[[n\쿌>5.d]_W|w=6F&mM_Ve3^�m/N^czt\{y_sM+S
    ?pw/-۽6'z�-~Cm3TgoC%wF�$?TY_7OV%0?v'[o?iG6�LPn^O{762&-$�^ƭJn+z:Ɲ&uۭyR;/wo`wenJmқMcu0ou:n_+zGmlc�7VͲ+NV?!~]6?ooܟ<^=R\8.u?q|c=0[7ؕ_}uY_-vO\|�E�:wn_>؇!6^~N꿕_!o^)k�5.?.]t2}��:�d켇f{[xFksa7x֥uk�z�_N6anFm�]{O?;>@nM۹{fc5;^{ϗ7mbr'2i@|%{qx.?ŠQYߥdUV33@=iܽC_ 0_6[|�qwkbm޺o{mg_zu� :_}7^j\=.3*G~:`u?=>W=nᛛeW؝I~Bpl~}ٹ?x{֥3t
    p]})׺3~˺6?z?`6o*ٻ뮲;:[dm�ޞIu;#M}C
    [E;ctmQ_=G*C꽝ӛS/oj=A]o>]ds5�1uyOXoK^�/j_n
    j{ov?GU]c+c{/qso^n@r}S?E5$g@^s{uXK
    |trt�S濑�O�;]-t9:uugrO]	
    [k'︫=⏰*r՝۾;ww'L6y=}SǟV?MS꾟�1KbJ0yΞWEfˡTS%�g~PfGic�W�C݃ݛR_󃬺nG{tƧ]_n-ͺ;4tge>EQv_Ҙ==H)%xo;!:Ө�+Zn1_ݖjk2t{{p:Wdn?57Ylޝ|炟c/;6p`mm\Ë+c*.;&wkl׺O'>_;תvw{|{[>*v7]j;guwYvdY,6ho=Yq96tP6ľu=}g�W|{^~?/;1�)w^oϑ�1vwlu�Z﯁]y-Cf
    ~?]op|oϕ]_|`[zOy{.!	]0-vϊڻy,W#C]CM/GiKW;z#Otl\~'dv�Uԣ`تj(4׺*K�e;�('엿uWu{{^׺u{{^׺u{{^׺u3_gڲ�qeK�>ރO<�+k͖�
    œ۲
    >޾6?1?R�\�9_ѰIoml��}[O,{Ov�]bVv�Vz):N{{^wO?ȯ/u'_cb �9N-�I{&Փ�Z_!{K�=u�VOiu?�/�׿gY?�׺L�'Cߺ^�Id�֗�{^3�~{&Փ�Z_!{K�=u�VOiu?�/�׿gY?�׺L�'Cߺ^�Id�֗�{^3�~{&Փ�Z_!{K�=u�VOiu?�/�׿gY?�׺L�'Cߺ^�Id�֗�{^3�~-_>ן?ǿuL�'Cߺ^�Id�֗�{^3�~{&Փ�Z_!{K�=u�VOiuW
    ^c{{|:sOo%ӧook^�K�=u�VOiu?�/�׿gY?�׺L�'Cߺ^�Id�֗�{^|@?:7_ï;w4�]:|FuL�'Cߺ^�Id�֗�{^�E;bf:ۥ6`Pm,`o~Sv/~g{&}renii뢣oWTT{t?�K�=u�VOiu?�/�׿gY?�׺L�'Cߺ^�Id�֗�{^3�~{&Փ�Z_!{K�=u�VOiuW
    ^c{{|:sOo%ӧook^�K�=u�VOiu?�/�׿gY?�׺L�'Cߺ^�Id�֗�{^3�~{&Փ�Z_!{K�=u�VOiu?�/�׿gY?�׺L�'CߺA�iC;bgz۲vGinAs1m?r=ݴwf8}۱;bn=onn<%v?;3L2/u):m.
    lݛr.جܽ={/C[djq{Ҽ8u
    -?CL�'Cߺ^�Id�֗�{^3�~/!wV?xZn^-K7=&N덫{A(:n]մvOޟܙhv&?si&r(V;{??�/�׿gY?�׺L�'Cߺ^�Id�֗�{^3�~/!wV?xZn^-K7=&N덫{A(:n]մvOޟܙhv&?si&r(V;{??�/�׿gY?�׺L�'Cߺ^�Id�֗�{^3�~{&Փ�Z_!{K�=u�VOiu?�/�׿gY?�׺L�'Cߺ@Ed�|_}�yxv6^8j_^׺7׺u{{^׺u{{^׺u{{^׺lş-�j�ŗse/Sz?�{?t�t�6[+On7Scz���UH�Wt�WҰIoml��}[O,{Ov�]bVv�Vz):N{{^�g�+/~AM7Y-Ge'\A7t݁�[�&-}պҞ?3i,
    ,6
    jfOu:_K_�d7w^{ޱ?n
    zw>E7훏_?{큥\d1lF&᩠^?_v6{c/L흙yAj`zmlfq]C骷P*)"9*1bu{ggu_w޿OQof�**Jocٛ{zgn[p9S
    KQj_uqڻ[|v
    s'�o*,wȓi2;ڝupg`=׺]|7޹__?�؟~Uv-(E+{mܵ[rӺ;k$)#5_k];_U'(7Qw%MG1�s==iQi}{aEr[SCAI5/K`]buw_
    u9�U{Ov\G޻dI޴NۍO3U0apw|{l'�_:;;8GJm=_dvXgq{f-pZ|dKK6蟈Rm?[ꎫ莯wcuG ۋ'H#]hvunwRzjs2T͡б/ɟU:+WN�e^_�3vsgƭ}�G}؛^Oc?ut~;ie3тܝ^;cjl~oQۻeeiY2>$r/TGoCwcyox{gg_0pl=k7miqn\FS&VIS9{'okQvg|tV+�=ɂ؝[mYYv}Ե9MozkzV&lOc(Sd1߼w7Suf>{{+.M}y~=geuY=*wlMi0hW%GOwL+#u.|{y_$msߝ45Kan߽~9o
    ~4>Lm�EojvW-xG!YGIf+}׺}}L_ע"v-?�?�?Ӟ;=5k^�G7e'?x3q7o{u`qޣ;p[fłz؛w;?c?Q>箤vdK;a-<yMAøTf
    T{w[Wv6?wRĺY>o�0nY{;���EَmڟxiM^|e/+WbtMO14KԻGoYf�bl=mh7Y1lG1t>!^Wcslzŝg2Cv|_sml۹ME&W	ei"*jH]A
    lb*w!wzx2ڛ+zlEju8Jib)1mO.On1M]A�ƝRӾw6;#˭]mҟ
    �Qt6c[qd[31.ai}C>=!�OPl7�x.;j|Ȭ'cu+m|W]E*m>XvIE.{�sO���ߺDO?1+:[צ�_1;nof�e'$[3۫sw7njkpVASVHhf׺-!/ʞw^*>}sؽz3'o/
    �['W]%n3ۇLK׺]fE_#U;&W?k;?j3[g7_TnTltNckfh)i;h=}{Mա|]d3|u�ފ>�t�Ҟ;׋W}׺}u~�"v/L~	כkv}K[wy`yOWEQ�Qdi:劶`eR=eW[Y(eCFBA5*:{;�^GqZEI4&dF1$
    _N}я7Klssm
    ->Ms[_1WfY܄;~|nᒌ7%b/p}]3\zr�\l8bg-	cbAelÙgK?rdkx)un;D`;pۭ-;.ko:-ֻc{{Tc4콧19ml>|or{)di竨XqWIO6KRRG
    pdXYR+y!4~23e<~W6"�~lųm~qm;Ŧiwsk;nҶP@L˻ڃoc@7/˻Bo=ۼ1o3LE-E|5'KEv飷6QX"xP0RIWL.t;E;}/?~^o-չytHu\V3x]9c
    w~Nw_`j{q#./5wvLrArr[-ztW%xr7
    m=ZAY;i'&m:4JYk\ɯCc(s|<_wfyy-dPeG3G̛͖"Kv.!XnmlfDq)b񸏌18],9YIiԔT{Sdd8zbz2TT$wf#N(9OP�3Pyx$znx?{nw+.8C#&9$G(#@_�D_>ĝBRoyԝ~ooO�KciwϏ́E]߿3Y>[kg_kLFAv0@1{t,'=-M՛yදzo+[;SA9nd:i*wnΐ؛ñ7-[w}zhRcw^~n|ln+޿3~m�.*I>!l쭕vnOuNn񾂞).b7DK|{~{+7~[}ax.d-9{56d]SqogXnl]F'lvO7uCqz^v�0~[o~A%O3G.b�Ut7~Fv̝7A}ܛꋰgCԾ>'N�{_f'bewJlOy}fOjoOt~Ӿa;	[.n%CX=׺�̻]ܽ{S�QSmM}'8/f{}fj=Hw5f �K:*v/]IY^_$:sv.؝{wxϸ[fbzn_ȧVպWl[Ujwy'{~#s;g9+nݻw=n�Sez	HvN#2@WQu[[OzcSυ?M6/ro/;;spN[7ghl폅=v9X
    'B/X�wc6&vWo~r-woo>~;vG_.w);;+l=&ˇMgC#ݟ!B_}/|߅}vOpf�ʻ\m[:cﺳydr;V�{[^+vo��t5|[�f�p^{^׺u{{^�_ïݟv|vާ|V&썙߹
    WTymݴٌVnWuz
    ˜zWܘ̙ʵe%=,0{t[~Sݓ{gǾX.[_͛;lԦ[l}Nuφ,7WW9pd_^{PN1
    \R^
    0gWw}ouU0mߨAʮsvllf,&OTX|u8/uW'svRoU^(7__/cn)w#>5}N6^mY$XZj^釡c_>j7S/Mۆ{}]|clڙl9WxHݫwџsf^7K >I|ϒ_v~Ktlf6L8/NMߛ:O{ⱸ,n+xgrj34+ȶ+
    |t;ۯjc+l诉Z]ӟ Ÿ7n]'UUrT[v]6tYJ�u7>}YTޥ}8_ٰ;;xm>.k6yknݑS<:KnUB뱾Z|߲?Xn}ܛgͤaWEg|؝_}Qv7:km~_~~�'9f'�$vS:2]a�[b>2^_𭳄ff?[{_�tvWh㺟!m[!Ϭ|n{GSn%'oMI]Q#+RtL?w^;~'k?wmWtݿ_.Q&a˩Yg*xľʽU_{td0<;[^ēk&Y7~nmп;&`1;�?%�[d	:l
    }ݸ}L[S:'ٶn_:�`vrm9nh1^{zs/�9T,�lC:g!OܽU>5e&1tYuoW39]w]MY?Jw77�{j~9?/wu~ʯ^(!KCu,Ednʝݸzha^f#Я3dt}MӲamKs*;�^Vnݛݳhn?Cd;Ghc׺Eȏoa`fnOCozmmnjsl{;=)njUB$^꯾IChlޣ꿖W]4K-v9{Wvl\m^o:_w%~Ukm_{_Sɾad7'xvƽ&M=Inuvoۡ~wMϔbw�
    ~K�xO`ɺt-&37E7]p/u!?tOlܿlu~sbn_s~Y�/~؇dtB{/e>}kL*b骳1lgybr8؛"g펔oPosS~^݁O9/_2Q|B
    X:~Ʉݕ;p.G{_g./n}e;SUw37/;׻gz:ݛ&~+Ov;ڏ
    Vt,wOO=7~u>6C3n򯱾tyN?mpmtWTf�{{w]|On;kof)Ϝg?6Yvޛ^?'m]?♊
    �s_yo_<~>|/}GC1&
    <U{�۴[fT/Ya9MKKɅk}׺5�Ov2|aꎧߒݓɺwm>=o{a|쬧]Wl)#;훡zMvrSrpluN=׺:;�ٗ=q+![]oK7;mu?ɍ페MMI[hPdŻ{ͥu{Ɵt>*f]~3C>e{Z/zcVqGj̏cUf&dVe>lv[d|}
    񿡾8uF-[ڛvm<~{w^C1e37L=}񻹳ow>mͭһKyI|	۷wN]%4Ou'yQmL{siz&vTuk�ʮX3=Yߛct^w_ƞ%Y~!tF흷є'?kt6nu?k|xFL>uѽU6~*u[oD?^{^׺u{{^׺u{{^׺u{{^5�|+�_mO:C?!Ҷ,o�Y=/OM#a�su�u�:?NӰIomm��}[_,{Ov�]bVv歇[o|):u{k#^jӗ=qǫDzWHţBy#}t=Bw[+zٻ۷in]6;QmŁ=^+7妫Zzy^9>+~6yt]
    �BaYy؜_kkNO?fe|^͛nݏer;n*ʢbx%4rDSC9H׺wYw5+�B?FlܦvtN~-ոf&qW`vUWa(&E_uӿٮ_3f3['wc�Ym15^+	EM-\5DR(t,rw??w�~׺	wYw5+�B?FlܦvtN~-ոf&qW`vUWa(&E_uӿٮ_3f3['wc�Ym15^+	EM-\5DR(t=Bw[+zٻ۷in]6;QmŁ=^+7妫Zzy^9>+~6yt]
    �BaYy؜_kkNO?fe|^͛nݏer;n*ʢbx%4rDSC9Ht	gql벰[f_knݥiv;l}F'=w,x7)iixFF t~�eEt7
    XugWbp_?OWO;?;�z6nS;Ur{Kv?_j~3Y;*	ⰔTTIOIl"/K'g1;Ke`*;wM^3n&>so͗޻qTQl[-e5uET$I#{tgԛ7T/S<ݽ}�fnnɐqvF{nQcr:]ѓy9jFFMz%/׺wYw5+�B?FlܦvtN~-ոf&qW`vUWa(&E_u{wNbvm|U^wtfݥL}N/w⨣=54ἷ~[)Vj2:ꊩIF^	ӿٮ_3f3['wc�Ym15^+	EM-\5DR(uv�нOћ7)9=ӻlw5n?UEUjXJ*ij䉪$6rF{A'םyml)Mdܵ~;unŚnVwn#{v�нOћ7)9=ӻlw5n?UEUjXJ*ij䉪$6rF{z_dzӧzbu?\m_޿M&W�v֋jj|G竩g${v�нOћ7)9=ӻlw5n?UEUjXJ*ij䉪$6rF{g_;ͯ߱�-�e|?sG�_4t	77=+bg;:yoh:uwVt;qbrYض&oC}e&fxOurk+?s]\NK윗Ztku蟮3{mya*R7L;[Vn]lӴnsm}ͷl۹NѤ3L$U4tQMQI#{'֟6K/ZtSN덵Ki~8j_.bXܭUmOu2t?�uN�g�ߺEv~?:54ޯsGq?ZZD#>ߺF/�Y���>c�2�?n/ӵѲ�O�?�|>oG�+?\o_LYo9Sz%C'
    k?;p>O5*T/TYǚMI_<mYXc:UqƧjqeos%6;kV5[[x6ڡLgz`|@Z
    |%ǎNjSRu\Sd٨Ha$u1f1kZXe\hr-F$|b"` PXԪ5O:Ys什m7sTwݯ١,,!i.X4GW>=θ%:c??g_+;�}OyMXm;V-JjHi5hxTӉ7~s>}75]{sw<O$<8覽	V_[e0v(q|E
    &/ŶSICPO-
    ,I0ƋqU��="T*T
    P(��P0:
    ;۶}5u34;I,Y$ܖf%IM7'ǫǽwO薡$H}w޿>6
    ;c/[in
    wGy}F'=}UMWb1SO+%C#}׺b?[a@=?|�{k�={3?/j�m߹}˾_e'K/C{'o8nmqtWo|￐yg+QzVl޵	cpABQ_KQ^u	7a_7>}as
    �?�I>&1jktӿٮ_3f3['wc�Ym15^+	EM-\5DR(t??bm.wx.wio
    ϶p;gwkXXb#qSmH"OFuH{W/LO-#{tru3yivW
    œS_=E'xQ.I`U{t�B�/O_%O^w`7<?l..8'ҟ7/k(}=8MREO/|g}כ׮ |m[˨YePmmgrd7[qm޼`49]e{pTce$jL>~n{ue>1V+_bPuwN7:‡{u?Y93uRbMn\\i+aHsʭ�
    ?[?>8{a֟6K/ZtSN덵Ki~8j_.bXܭUmOu2t|N܏YGC榛h޻'KPHr{^�rw??w�~׺'s�γ�Wq�W{rw??w�~׺'s�γ�Wq�W{rw??w�~׺	Y4;+B?y^vt6ql~ݳX&qPwoIfi%hK ou?FOEv_clL�WS`uXo-YNnun,NK;ܸ-bqC4O]BOo_[?;;Kvo}6!O-L;ESIWM,U$=׺;?F񏢻gì;O~q9_Pjǧ{Z|x=/piӽO:6/_d?eWkEbrU>#3Gc~o/.+?W:ë?/;wח~4׺]~<mާؘ+%�ave{c{/%CcraDEt�*߃[sn--ἷw/wn?pnmѹB-[=5y\w7Yj*j%y$vv$t|҆Hffc�?aػ٩/<9|d#;(ڟ'L8[koN'a1[O31i76޴wti
    ylNZ:J2xJzhdOusR`{6&wϱ2}{{8'6k6�0.�Jϖ-+f}CwoJ׺p[`6+%�z1Xoh8޴/(�\a6�RC]祉"_u_|gl}'luf썤3{lf?=-8قV"jWQOa)47?FZv^#Eb%Wt`czì(wS+c:7U.&,ؘAKG<3{kOϹ7=ް́rmճ[upu.2[7vf[i*--OCƟgU݉{klM�閏b0g{3=ۿuS�'��qKlX�^u~ohu^]}y�GKzì7oYo߫{W?ݝ*H><^쿄1Wl`._Xu3h:عnh]M$A%ZX!׷g~߿k񏢷}�_gXu�M_яZ1�H�c?<:V{pۭ;/񏢱]w1a;۩`1u֛wblLnrhbI_S
    D#UouȿѽSwωgܛ}[Xvf96-�:tؙ-ӛ{cwf?3l4sa{Oo쪿n=ɵ&Gv~N=_�n
    trqXMC{t?~݇{wݯwLݟvCge<s]޸,WM&JZzZ>H^e�-o=ѽ]_'c_.쾂
    �4GպvW;RSyIM)8GO?>/!c> |mepޝ8lL&C;횭�qc+)1gz3f͉q2TmdKzh>{3??>6:|giN<GL7椟nn-xvnTLMP`BS{ܗ~on켿>?tlJ.uXWon<'eL2X-5%4/}׺]<m׽�OSMO�E?1�Sٿ,4tY_aFG^|x;S{ven؛kc~{v_6d
    Վ;*(_gI#CO㍊uo�e>�e|0'�oeW'_k�~u_N�g�ߺA*wtuxja�AH&&J7׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^fk,oVW�,ۛ)ҟuCߴC_mwY[�{v_ҞG+=G��Wt�W԰Iomm��}[_,{Ov�]bVv歇[o|):u{_S�^nmYw-&fgnٶ;jT꘶gr>Y}ٷyvze.wS_LUnQUA4۝͸>aïk>Amϸ~\tf럌':z`R]EnTY*>^ݍ+?]6_sn_˃e];hu.7uT|MI~5lO~)!GNs2秓/{k~L|i�#>�fgvf_2zG~]'Ǿi={u:7wMm/%�GWJ�Ma^>aVc2zo5nbi>f}Ѿۯfyz'blmבQMߚؚ-ɛTbvKi?X_V|@'ݿ> |/뭁}u_'z/mz�.%<5>8R	tw/ɏ?}[Gߌ�:OH/ˤ>�gn^魥?
    Sr8Yɲ[>q>{<>|WvW/M�ƽMߟ[6'~;7{uڻï7/A$�M;
    =ɻ[E3u8N^>P}zOݴ;cDsgoս[vpb%9|t){_G՟̛;;m
    r|{
    {s3wAKIV|̞|40;5pM{#ھ/w^߽rza�wNWOG7qv.tn�kUU	Gy
    ُܙ0xՏmYw-&fgnٶ;jT꘶gr>Y}ٷyvze.wS_LUnQUCNS2Jv�]e�۲r?MPx;OO/]I:*W߽/e`2U#CJ5Y5M]_C��F/FW&|b|R>俽vq�	vmo_n7#EK%UxGF~�BKb\ؘ|>؝uT=ܸmݸ6-f?YR⬠^~;|%6o�W;[y|QP�/_,6?ʊﺶ#0z`wUVr3Kǽ7C�n{AC>@wYl>vX�)f?ڹ>í>?6�Sj(!13&=׺?7؛3v�]j{K|vc[kcv.wiic]QnJ\D{WEI^,^r?,;V6L7{#?2֛'Rl<{m}峲}uA�q�il9MKޙ3Rmu�ƍۻ'?ߊ}޽Co�!6gw=tُ݋#7^êoIeYz#!Nv,g-yJGRc}׺>n^Ƚm?;v/vRkKuu_Te6f_uRQLαO}׺'Wߎs;oq;);ћKun,-_wt-~))$fwewѶ:<OL
    Ci/G>@v/�ǵ|0On
    c0t/�Iw.s+|vr{\:X0~�*{OBn;'�Kc;{3xoO37c�E]o?X56Ef٬b';j=t|bY}o}W�_%
    ͷ՟Ť!޳a�AXߒ%tvV{yvw@�m9/ײvgjc{v2]M;7	9J}C7/qn!7_ڛջvL|Y}Ûp۞{9v�Y�37m{Cm'Yl팛1)5n&
    Ud6ޡLwV?;ǫ:Ӻ;.]uf0-s6w67#}u%-e?DG"u~{ߺEW/Y�u^F�w>N|ݟ:@woe,_>>'sURk>$'pm?1n_MU^ϵk׺O|?<oWqv|G(3Cu4q;c!ݗ٪VR%^?'O{`{vfY�5we_O[;~'uVuWn]Yu?}?SF?"vgrnE0��/z@w�W?5Q�A?ٿo)?e/?�v~�{��ߺJ]r|=>gn>ktY?v�ڐ|_>Qޝ?,7^oo3Rz
    q-{-F^ﶞoMpQ7fn\]&{an\vwMܻ}a{
    jZNcAT9"_u_&.��~u ['Jl[3콵}%՝>r|D�hgWiyt-ݘ:̞$ʯu�c~4l}M5[35M]m{m|XeC#w`mϓX͛=-IX}j=Ǹ;31ܹ/ugv1�_q�ltN|r+eg`[*}ӗj\UoM^{<\[k?�?ievL΢acbnLؽ]E5%dųGBe�u;w"wpnϏCe|Vvޝ=߹}ٙ
    ##.lmt߹18u>=W̏_;/ޝ?WJu_,6VTQmܛo;R:1SOo҂|qns!>@m޷ݙJ]?i_8t�{뱪%/Gcwflo\^|gT=;;cg�
    ~dlm?n<b잷ٽ׻%ӿw_`ufRmjެݛCze;{q*p�]ٿ{3=ztoS׿&{3uZ�%;md6�Y&|J;yv	_5>N	\'{7˯][?=K#;~Aoɽ=GwV_ug~*sC>|\7Nؕt=SҴ؜.!{Aan
    ~?�=uԛ; ;O|N֝1AS7�](9lKPg1U9FJ
    u
    ˺wmǬ/Dϐ{@w̟dtwpޢm۲>B7fo~AԻR`m|YEt6u�-?~w_ig>4b_|'}Kٻ?^hi)h!8P{tɋs�߃tju~{ߺ^׽uTw	in	s9QtX9r? y>߿:wN[peqo@pWlڨ鑚uۿ˯'BaN3?OjJIv�~L|iߛW`]Oڿ/|N'oo~=6}`s^Nv/x~C>_}a>@w^?v'uoiM]sr.Yw~XUwK#2qajvF/νpV˸;3{Cb`zsN}KgnŹru+.ٔU5t}';ޫ@u&tX׶'m;cbO[=c_"�xm-�OKY\fS;E]^?/]cŎ}ݟޥ�ف;]�g]av�ԽKy]�uGE��6#Y~T|͋O�H~tc{ۺ*|Ͽ6썁cs鏊x3{w;SlPeiMU7B�iܝ%s~rܿ/::gQlM՝9_<,|ω][ })�NUm%>+lo}qU_ca4yu_rYkE~<|y}
    ܴ?2�>y廻~/ST{>N^%nZ|V뤧wB!Olſ[df s3|`\;u]ٴɽ9
    ֛cndvPrj1TuU9Ou�7/:;pu`}_'lacd|q_4.rve|%~֥ۘ}vwh`M]^ �<;ǯv ;[u�~*rg{{zsmOB
    ݿ	:]jjl<K^_k='czߋ�oϐGY^�KYumtVIܴ�`mN.aճ˱qn_~ *�Ǽ]udtwO|??vtPt]gzQ@cnnٟ$ϫ{!|=ٴ(s}q7_Fjl[n	t?e?Q�evx�g'3�su�ui�{?c�4ߝ�?+{u{Ol��6;=׺,W4>1.mO?f`O+GǪԵ{W?_[gZooꞹ03]i77VPmN"!{�1s^ݿ U�,7>saawF;7W:_}GT/8M{G~1*k2#Gq.Z)׺1/ݭa{?'@_ܹ5u^^SokwomyWG-vu=׺꿚I�&�r.W�-]i]Rw-&�gvKs|l\tۗߺH
    ?9]} >O7Yn/?)>ۛxg>�H_+zvm
    \n
    WQ+ۮfr�?wŏ!mݟ?Y]n?uO�7`�^?ÿ͵pwus&E�odS.űzC?5`S#\G0Y<㶽~rb76�z�4mk>)�>emoX۟1z::|*7Dt掻r>Jɻ
    }AI5j{tX;#^oc{1E`;cyk[=$~dLg=XZ,V'1wP}[ݳ{t?~kz7qg7lj헻2}S]Mٕ�!/.Ы=Ǹ*~Xuu;p䱛>+׺0m]O#mwctGae;k[c{37Ww^]MdonmᷪrIG]SQޱ?u;'p̓-AkcA~^E1{3Uy̍Mvߏde3㤩zN`c"uP0}S;}V|/Ҿ0|w>wz2wߟ4?L?$;kvMN'$]7nTWhmyr)ۇ{cWe|ޟˮpmLGNnku?Wimt|\osJ6XmV%DY?=k9 ?Ǽ>8?/偽;~n峷ɪ.ٹ8>`"ڛm2X:sl}{ԿS.{^{^׺u{{^׺u{{^׺u{{^5�|+�_mO:C?!Ҷ,o�Y=/OM#_�s�^?v:?NհIomm��}[_,{Ov�]bVv歇[o|):u{_S�^j퍁k�yl{2[w֛?^ڿ~
    y#3xF`돃ltg|[n;3נW{k|`-ם5Q]:i|qSd#ƔijdSc!f3uCgڿ#v}_p|׾f0աt>Wo;{oj{{EeF^jz,DuuWn?A׺uu[ڴ8.|X�'om-O{zȳ8x7l;uOEЁ]]>Fwfmۛ}O<�Zu?m|zMOpUn>᭩s]R׺cv'xgei`ev<ű;nd۹FzkXUq`:}7oweLΟ{:fnZL>,udY<Z:e槢A^@?Pt.]#;6�_lmMaQ>:=t�CuM&w~R*p9UQbq?ҿVv_V�}{W_-zq�sO`�|vKn�}zw}GWa_o?`o}׺,qwo펂}Sft
    OcoEz6^^??*vxҍ-Llu 68uJ33oݿptu|aӭkO7Tm{w";q
    mN*U&*�0ǵw.ݿbӦڵerٶ7ޛ&pmʙֲ<-zQj̐?EoH><upuG=Ÿ;[vWΚձ7W|ivwn^O}%6nܞT֌;vO
    
    Ё]]>Fwfmۛ}O<�Zu?m|zMOpUn>᭩s]R׺>؛;:ѴEn7im݉
    عSSչݵ;inKp
    KOVd0TqVRZuB(ψ�;N_uԿ+1x́�v&ؕq|[յW;㒆'Q=TY׺4][;gqf퍹>=g[cǮn?tE\vڝ<U*:LU.?{~}_bn큻7`n-h
    #ncqVRͣzR7�G{=nfRJ<e%eFV4j=׺,o^ϵ~FiY{}w]gYո<aݫC}'Ŏ߲v1CvSZX1][;gqf퍹>=g[cǮn?tE\vڝ<U*:LU.?{>8(7O޿^OM{w)w?{ؙx_3o;r&V?KHr;3JgIJ33oݿptu|aӭkO7Tm{w";q
    mN*U&*׺;Wۯ{'6>v;cڸv͵_F:go#tdNۢfѦfy=yYK{t(:Wuvenٛ6냦S{?֝m_o;)qۏkjwWd1T�u�\U{%{7�¬VMg˼>9ˢfvMnYuU6CYP%^v1ڿӭzgr|A~Ouk{xMlNG�E)[tRc"gv/?)U;mwcp_'/2MوGwr5S|7ܴRrմ|&4TKS{WoͶ`vV莿unݝM6ԣ
    Yڞ؝m�J
    KU
    ʪ:k*=׺u~_L]e�{֟dmܗY_/7W`veg.ءm]{˼{Cy.=[%8wE.cf۹\uvժTtyf3'NM#~ޛMl|H
    ASWko.ƦN9y2{tC->h||twiP6lM�#0wwrz)cԸfa޲,eE%F3^@�'w?ـ�f}ӷv�f�A_ZG��q_i�~ugvKT<w_hDOW%OĪEo?Ս7~Gr3�~_L]e�{ՖW;:~x+>__>ѹ
    '9_6e|}~fy.cLmUq�'Nog�{+M6ʗvS˘2w鍇Gf|O8�]vݸ�r^gxLv+{�m ~E7v�%/ovAo޳ۛrl;2n]לڻ.|ؙ]1n.ӟ;St?_ߏxE7Dt�KfZ{{#5{uo}C{1G2m�~H*}&Vˌf{u8:^�>=״Wڛan7n~?cv絲ŚSX)Vq{teO{At�V2{Ԙԙ.ɮinZo|c3}}Oҏ9CKEOsA^?oR=!Oɳu\v>l�N|vG+7CmQe2u/|>q:tg�wum<�]_Ϗ/MOb1.w_\Q�L<Vm�%3/{s9_/}7ۿ1>q6S;ۧvY;Kuo\Ō;9w((v?nt�-Uܻ[o'�58~.~0o,au&mtæ|;;lɴS;ַstStG7m]e�>@|0]Ku[wg%~@oMa;Vx]ٺnxՋliL{t�_�Q� ���%_ߟ_ޟߵ3�?�{^�Uǥ3m#[wgi6ē}ͱ6u(llv'[m*�vҥRG)嬯zʏu	옺�'?;ߺFߺ^׽u~{ߺE(>Zu*۝ӝORuWn,n? ;km*k*pR;gPt^;n� 6~@?7սtE2Yw~|ٴ݁S[vGUMPl/IW{tX7G[Ȼ�뿑[]!1%yvǍ3om�
    -N['>լۻeAS._'Utoi|$|IGߓ�jzkpv6Κ[m=5zr쮒Ӷx-nݬTw�Vc}׺W/ނ΂?mpwed{/W~nx˹h>8΋뽛7G]h1?ki3X;'^?_gm]3`w{cxفN#Svƍ֯_r{g[#oa+S?}FF{~XnNx6#f;#;?vm=ힻn
    i^H&?*^1{k)^`ug=Cڟ ):ʳ:{O|m;0}];#}|vʋ\P1:͕K>r'&Sr6s{SUn
    ]ٽ
     2Oe8�-0>GuGȯGhGM&}{jwf۝OiM''n-Wп�[?p,
    ʭ`ݝv?izN/*-C!{uQKܯ�'#cw_hr0�3w1Zkg0{_Sʢd6TF1uvwȭN�Y�._G77?D'ms-nvZCQt>hfs
    ۫jU3ܭ>e{'OtOiw'bvB*o~Xplݣӛ	X<56eٛp[^mAϺD|�.O_;jo;۷�ҿbkN΢]?'>Gvv8>UvSu._{k][wVd7~1_WAV{_n�Ko�mŹv&RTuz�_}27vdd]~'oW׺k6;c|ߝ>?oƌƌǴUVկOi`wKn^:޷OQ6x-027INq
    ]
    ԹQE~HOr_*{7 >Eoݛv7ܬXƐɔ^?sElLWZw�ϗϱr�ߊ>ٽ'/>Smls}e_C7Әn[V1iNs-^?M{{K;@vmou?foQUoxsfXN_ɭ3/nvݛ{j%
    $Xf}׺ r|ݛW{|q >Nݿ_rvu~9;{>I򮋰woR@XG!Vb\��W}7m]WwcWzC~>on<CmOJwF?{RE>q1x^_Ըu&>C=Y�vM50X?}we|m_ҟ:r`Krvԯ[L/S{unw~ϛtO^e02jNjo][i/
    h0LiM3:#ʧL:u[�g�
    7|O}-;fa:�%s~Oػ6B>[
    ]m]BS1{�_Vufa
    k;na?ٵX/ޕMm5#~*'YUddt;j{Ě`aJ|g0pdK|v}~<2{r{biqL2ݸ׺PnPnC0~LOLϵ{77?`d7c3o2ۓelr7.MG0%=frEOpO% 7>>[u7#`vE_\`.mtޭfW̝%WsՕ
    |ԙ=w{{or0FIg|00`/gCjOvl
    s|O/qɶ=G2V
    ;׶->>>m}|>'a/5[>m^ٿ'vo]&nHp}ٙ6-1׺�~^�s��}KߺFߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺMY_�no�JoA'?~G~Εfo~�Jzlqo_󫷿�|Ώ�~ְIomm��}[_,{Ov�]bVv歇[o|):u{WCgş�`u?tl,'kgwW	+kTmMͼ2}Ee۵{qlM0%$l/!I2{tE[~]U_6^ow1&{>1e[+vCUSa৓4y޶_^�gssunuW򫧰[y|;ۆy0?{S!gsfHv~ŕnl-
    V	MLDz1~{ջg_ʮl-n}Lmћa!ڛUad5XJ%6
    y1Gk t,t/}vf͉{j{{pwYϼwslSMwL}4t}Ķl}&=uJɫ*1
    [gFw?
    Clތ~-یԸ͑=e=Ch<&*;WK$U5T2,DȾw77VퟗU*{ÿo2w?FnLIjnόYVbݐa+0x)Mjwбнٛ۳;O׫6'Ww'WlNN=g>ͳ5M6=3toms[aS+&tdN_!bvw|ep,_F٤!VQmWwٴS
    RIbQ2h'DWջg_ʮl-n}Lmћa!ڛUad5XJ%6
    y1Gk t,t/}vf͉{j{{pwYϼwslSMwL}4t}Ķl}&=uJɫ*1-ӗm؝\&/lQi76cq{[n]ųm6wpT´eؼbTL$T-љݟ|OwN3ni
    +:kn-gwOJɉ}ɌW<Ty)㬫^t3�}՟k~Eo;+�~~.l���o{t,mӶw>-tb3kU_nm+zڊeEM49ݟ~')H*1:Y95^:uc7}:o7J9kpwY>3kVN݁Wnl~2byKW׺z3{vgiWzf=WIԽ;Ǭg;vƩ;Ǧ~>mM~>ub[l6>غ|dՕtuY;zu?1w3'!ۭrz[l\~ﭳ[`qT</C2�gssunuW򫧰[y|;ۆy0?{S!gsfHv~ŕnl-
    V	MLDz1~]3+zbuwruvګ^yn;cTo?wM6?w:-Il]E>RjʺLoB}wѝzr7:{v6.>sdvYlP<O	ⰒIMm%<$!2/ECջg_ʮl-n}Lmћa!ڛUad5XJ%6
    y1Gk tߒ=x,7|Sx�{={!ovN뿉/ۖcv
    =F"*{tнٛ۳;O׫6'Ww'WlNN=g>ͳ5M6=3toms[aS+&t���{Fﮌos>4qg7N핸~O1Mfo[V!<G{u}tfl{	Qл+']ۋeU֬CM;byl&MHf'4ziOuog}MW`d7O/=g]&e?
    п59٧迈ICAѯ׽u~�"v/L~rClQWm<|ڹ.ʨ{3plޝǝULՔu5QI奆Z6no;gZ͓ P׆6
    _VpA(Y~oi?t7myZ]Kȶ/'=$4 +wuxGq,v̕57-Vj
    8<ݓMG,Sm~RRN,Sm
    ~ǞbJSWE# Zjw%4po1@XB${w7+yymםbhڋ{y.a羅pX˲Ķ;nXȞ57-Vj
    8<ݓMG,Sm~RRN,Sm
    ~ǞbJSWE# kϷo<k{G̗F5@Mb|2E�^o^^ouX#Kw{#2-걛V2"pG7.V}ToMfm]5Eכ''janLd~,F|sTY1	۽glĆQ&B$&I!E?�Us{4,o{Unw\Z~V5ܞ=_,$J96v/Z]wd{7qlТ$7UU5BCKI<4ďp盈/n!۶n,i4{q9Y	&hYP$ͺ͹s?[?2mowbHctݺMfM4qYuPm񽅲6n]KWonM6R*xrTˈP*kQfX5Gu[c@ $PE�H+c_poKݦMgܮlxK4M-:F<dtF*AdSP"v/Lk:
    �γ؟,>1d'
    dA`4fsgˬ];p}&7+%
    U�^RFV:wGOW^;l6.0=lܥ6ZʈuDtۿ2 o}F[i|ۺ1TO{'{Ϭ3xn/sVc7EM4=O߯70t5G<2F1tό#:enؘ�p6%v访ܻ`Rvf3[W3
    ^I?>OD3{^ٯ؝_iIq}e|t-kq
    G>@vf/1v6o
    ./'SG׺[Yo"/plN�gbtgv}I`b]sm/~z\}%9$4if=׺*_zw?Sݿw۶v|g	ћrK
    >l|N;qM*aCPI9{鞣<ߐ^erGm͛>{K{qu>٣r5LJ}A!VS	.]etJ?oe~Iv;O~w;K&_>BTY}[QEOdi
    TUu',ͷ	6oi}/p]Φq{흅w]|z}h)To/}4_3dQ>w{t:ssn+,۽OwjCm6cu/}ë3;;ٿ-;&fMÇ3wOSQ{c)ˬ^'۟;o	cr(v/#;οsYq[F>ed8lK̟o"�_ܿ]G_??S|�v?°__?y<Q>-�̉ؿ3c}t`=u~{ߺ^׽tT>b|?:[ړc}0Pgv>D/U Zfe1Mwώ[{g.fOrl,͍[zuUܘL^
    +mh%S$ۻoc|!H1vɿYgnt�`av&7_ߛr�l/vkd㶶ؔ[qYwK*
    mGK/s
    �x>EtV?_́�O_�Я?ҟ?}�5tcF|j|-vlvNx-ɳ<	~Uerlɺ1KmrQFOh9&1ד_	vޱ&iݩ}`gvFc9n[#<fqXWA-E>ާJHܯBeYv_qv.~_]{oM1b?nӐ`_sZZ*o<b5I")^'?:!q=oXez;`c;ed6.썳޽wwڝ߻7mrZJՂ)I`Y{O_VWEV&�uz6Ofnoy7Çp>qOW\fc$۹:zIOY]xts?qbcLy>]86_soIYzge7YnLM=Xo't=Tq{t,{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^'gog}tu=u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽tٚ�>[Օ�/_m~!P�c�W[]�l@V�,ݗo��}�:?	zװIomm��}[_,{Ov�]bVv歇[o|):u{WCgş�`ug3_+�LMҏ�Cz~!?�ߺU~)d|@{k6S3s}{x|nn
    ;;r^iLG
    x4
    mX.^Wn3G#;OJ>ݻ׬>0eww-m[V<%%=->؆eNY {tMl�6'Ş9?b|K��?i[W&/qSt˾?*x0X5T9fɴ8u~7|lcuq`goc2�/ν[osuFMٸ@szNݱݔw$
    -ENM=vk+ET1xu}zptgɎ]K
    ~9nne�Vb]C? >Do
    S3EQE0ޝf
    ~1S|l3?eg>N|O؟fo�C?|	�\|T2︷Oʩ+3MUzYm+{o>aX.�{svQvn?8Slwe6m#KQS:O]U^/{M:3l;c79wi>Y##ߵx슍ﲻS6MǮK)qz(T[C7ɾpO;{Qc~Uu�K77vvnl|ȾfQ}mT;nZlN3`</u~\uߊ{7]W?!܇io2tWLT}mϸL?]aZlE
    ?GtnjMV#76/Q;qd6~hq`qvv|K*CWf*(i掆A'Uw~L9o}{?7}o}�87=%c?n	WYO.nnúko=x.CstfsuC[:+&*>|Wb6nvg&6k"{_v힣޸ݹP{}I/oݙwj['NvmMqk)f-y
    uEy_1�ܝkŀwFbq?v]uE|HA}ͭջJ%&.@܆/77@nnu}5<Uo{!3!y-llw>+ps7;3XV5G͛&evNꆟ;)q^,~7v§/+6&CsUb3ufuko;3�nE|O�gâ;_֟3ۃ:of쿙;5�ܿd1uj[a׺2_z׼
    y??n3:wvmn
    ?Q޽5*1[j|]>ކrkyû_nIQ%lUb{kkn6~kgwkgh
    Rf֫ji0}^ 6�S�Ѹΰٶqg7G+7zܫwWn>\{]tz־NJLgAGĿ	ڝ#'~M:ff_1xO=ÕlPl/a,pͅr׺]|K^	׽_Q_7nͻ;otv_=ѻ]%z�J.	;CE^j���{~쭗f/ioAy4�6f'P`+be2ۢ1SY)LptLE*oQ݅'6X_^=Olcopb5ko_wOäOH}MC]
    헄^u]Wjqt7Z_K�=w
    ym7m\0[}wKٻ'=nNoKF;VKK{3~|[>ؐv?EtWZ⛭7f'/;;3m\MxDGN>�~{ߺE�ȝ�7;ߺE_ϋ_ p7rs{뚍�e0}C4%NOF$4Z2nYa}`۶nd6$+@c0KcJH�RE8q+odwnsk_!]=m-o7Km…7X(
    '|==9C�7m}Bx娺>mTUc#Cs̻n6�l+<~-ɉ!Ts[.u=M^j䝯lF,
    ՎHEcܶoqsoĦ++Ғc|N{)xzr+�!CboTۻèuu~Qt7=[]3}~کtG_YUW6=d(ɜ˶obnSM.mG[\b0U@os[.u=M^j䝯lF,
    ՎHEcܶoqsoĦ++Ғ=~O[[w6o~v<x݃90=Buk.OoIGW!#K![V5ڷiGS'\
    !cD0+dH\
    F7ڽx=۷M;Cln6V\m1-75Z%Wh|{M67iOzwWokmmyz-euMN7	\w6.<6D!
    UWUM4R(A6{Fo
    Y[m1[Heaq0mʡD1=-r\k\s.�G=ߺ&߹mTxYn#I]$?]
    IfǓ{˴M4V}
    sC9||N=^
    =f"qOQF<"1S,[!]O=C,	ZpCӔ#myrbmpoDL	pM2LfXV`o0F[�f�pYoO}COe�
    s;`3/v~ݟ8�v�Ru{?ɸ2GZ{tUVGum\oShV||f�4d;x?1nWg{ܵ;*jZmŷ:g'ݛN#Tt^?-.ZxOܿ�3ou;ko{}۴?`uSd*6t{knôZ}QK�+>'۱u>_+ѿ~|~v1ʋvCn`vYvv꽃͛;;ZLcÅt{*8Uk=׺:ov[~uv_c9Hd~3;2{)Zz3s`!l)7?Y^?SL/7Iߑ=E_m�kvoۛ7ebwnl}Uϓef≲8f;{=~LW_Kco<eoGoC'KL{u޳`15n*7R.|mS1^'-�E'LΙ�(1Y3?~xMAi"v|Qź7Dm5edDdOuO?,(,Rn{sktzWez޳^﨨6I#rwQd0I> C]#Ob:{3>67'e2CFw6Θ?gۘ{kb;_rguMsr3ޞz*gvMg~+s2d]o9liAT�3ٟ%;k;՟fٰoomُ	gHsiu?dw/\VK�̾�\�*5O}>VdٜUW,[~*X {_%Խ?>-qSlH;+zWqM֛pom�D[˅֙.N|<?I룧Ju��D_>׺0׺u{{^׺;O/T?:{q_KKq`]u}yYл#knfl~n[D{7C켅En>Yv2<@WN|Sz6[_n"7ٹle:�Ǟػw}f/m-͹cX|`))X7>LSrQsU-G&~HwStT=Y+V){c3Wȸp;:j>�F?Ɏ3m/w_d7oQSf׺&_?][Bv~6vx>V|owXmϟ$~~zO*n\?swel6plGn|dfg{%oݹM7ƍ}Na.XL v;tOrl}9ڛewgTTȩpm> 	2sA{u=-?;{{Jf`|5coȿu\n8{+kd2#c!t:s��oFn>/ڽigDl�FkM/_;ֻGM�=r>j	vGck/A?b-#lްRb_o߱}7sl~w@o.}MW^<GZm貹
    C>ez6Cv/�/7^!s|3?1:Kh?==O;7^뺌V3uM(npP}׺~	oyw߂N۵wnY;[t? d&uٜƮ7lmw-.JO&C.OMW{׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^OoD?^{^׺u{{^׺u{{^׺u{{^5�|+�_mO:C?!Ҷ,o�Y=/OM#c�s�^�1�]s�߽аIomm��}[_,{Ov�]bVv歇[o|):u{s[Cs۵�umIW~̡�'O%-Kڮ,@ _{]{V۹AYI]L2XQ‡ma<жWM
    yp=d{?wv�X_7�mt�=4~Vv~jۖ2+k6cVmGnf/!Qb咂8+BMQEQOQ+q{iȒeؘ�̽])ST-M,e%H'mnhn�px8ْ�b7�m_OJ�׿ْ�bo1�k׿}�O%?�뻴�_c�~?+2M9�Yőݹj~WS:ug]Sk}ۓ-,02Pc*&+
    <2ܾr$1K3LQ%5�ҫ!f>8�u޷VeQt*M2HN:i_2.쭍�6Wa=v~k�۷GO}c�brં
    4p]Uѫx"2A�7'x⎤4zV%?�뻴�G7�m꿾OJ�׿ْ�bo1�k׿}�O%?�뻴�_c�~?+2A?r|�	ϲewf3lFMӼ)xpY֛?K2yiR|e%ja~m0% TSΔbwaBVAvxGr5�NDk�`gM=Ssϝ_fo^ nW=ҹ,w/Ql,gl,S
    M$d`nÑܥcO2аW.$ETUK
    TvJTqn�fK�wi�ٟ7�m{SwO?{7�m߾OJ�׿ْ�bo1�k׿}�O�ژ,{gmr9Ÿ폇`0Xz99|k/Sx^>Ijg8`6weU$7/R>Щ)ffpT5�$zݝV&Z;zv�fK�wi�۟_c�~?+2M80X]Ŏݹj|~Pjg`Q]Mkko-3di)k
    
    D1J^r$E2lL0%ҵԭ e>08 u޷UfSt*
    0G@F:v�fK�wi�۟_c�~?+2^�fK�wi�߿ֿ�U?o^We?̗t�g��#я\޽t�=4VvfGv1NG5]O
    םG5uL8]csnLMA4+3riȐ,ϱ1DRLLJ*qzYEЩ4ʠ"8=鿟GyݕXVmYǺvfEfg꿻'VO+iU%T1$yۭ$1,[^Du!LtT(2RM0I.Fr2<X�fK�wi��o1�k_OJ�'?#wJon�gm윍.޹6ظyfzVFo8qؼ7/R>Щ)ffpT5�$zݝV&Z;z[%?�뻴�o1�kֿ}�O�ژ,{gmr9Ÿ폇`0Xz99|k/Sx^>Ijg8`6weU$7/R>Щ)ffpT5�$zݝV&Z;zv�fK�wi�۟_c�~?+2^�fK�wi�߿ֿ�U?o^We?s�,{3j`[tvn'm흷>aYGOqxy'HݕTܾK<ByªRL�pO[]vvU[X�jO.��]ݧ�/n#я\޵t�="z`c.׏dMYa1Y
    ՞le)f-$m4QLu5ItB*5+HOmY
    L*(~юwO?{skZ{SwO?{7�m߾OJ�׿ْ�bo1�k׿}�O%?�뻴�_c�~?+2^�fK�wi�߿ֿ�U?o^We?̗t�g��#я\޽t�='tf흳1uT_T�1UUry*\mVP�7�m߾OJ�҃.��]ݧ�/~�ZF�V�{�)_�z2]�=O�^�F?q�[zR)�@d{?wv�XkZ{SwO?{7�m߾OJ�׿ْ�bo1�k׿}�O%?�뻴�_c�~?+2^�fK�wi�߿ֿ�U?o^We?̗t�g��#я\޽t�={.��]ݧ�/~�ZF�V�{�)_�z2]�=O�^�F?q�[zR)�@d{?wv�XkZ{SwO?{7�m߾OJ�׿ْ�bo1�k׿}�OXw/&7ʋ6
    *O%]T둭��ZF�V�{�)_�zP%?�뻴�_c�~?+2^�fK�wi�߿ֿ�U?o^We?̗t�g��#я\޽t�={.��]ݧ�/~�ZF�V�{�)_�z2]�=O�^�F?q�[zR)�@d{?wv�XkZ{SwO?{7�m߾OJ�׿ْ�bo1�k׿}�O%?�뻴�_c�~?+2^�fK�wi�߿ֿ�U?o^We?̗t�g��#я\޽t�={.��]ݧ�/~�ZF�V�{�)_�z2]�=O�^�F?q�[zR)�@d{?wv�XkZ{SwO?{7�m߾OJ�׿ْ�bo1�k׿}�O%?�뻴�_c�~?+2^�fK�wi�߿ֿ�U?o^We?̗t�g��#я\޽t�={.��]ݧ�/~�ZF�V�{�)_�z2]�=O�^�F?q�[zR)�@d{?wv�XkZ{SwO?{7�m߾OJ�׿ْ�bo1�k׿}�O%?�뻴�_c�~?+2^�fK�wi�߿ֿ�U?o^We?̗t�g��#я\޽t�={.��]ݧ�/~�ZF�V�{�)_�z2]�=O�^�F?q�[zR)�@d{?wv�XkZ{SwO?{7�m߾OJ�׿ْ�bo1�k׿}�O%?�뻴�_c�~?+2^�fK�wi�߿ֿ�U?o^We?̗t�g��#я\޽t�={.��]ݧ�/~�ZF�V�{�)_�z:�w.kw~�[c!)<it4�0SR㥦EM$>mv;75neu3ST1˖cVbrOPt0ڧ	mR:a:u{{^׺u{{^׺u{{^׺lş-�j�ŗse/Sz?�{?t�t�6[+On7Scz��W�}ueѰIoml��}[O,{Ov�]bVv�Vz):N{{^
    b{_�+�7^%�USv^Sg7f?/}u~F)ֻio\S;IO6%7+h {yZAR$x<l¢
    P~?i+';|U9;Kz[l\
    ۸]W`]>F'
    SN	yZx"{_Q4(ԂT8J+rcGRgH;FDUf1Gr׉l*(({1wn©�!wn}Ʈm۽[mkwuG0g6cls#
    >Oki^웝\^<$F ZLg_E;D'"qդ;$	VBXFnV[q9ܝN>BO||~0&u!=~ES�=r
    $ٙOًRˆٕ4nx/nܯ*^jkZRq΁(L/*zFhc2b#Px̥;AfETpzv>
    Yx/aRfoto֕N[+lSKݝ-⚃vn~k!lNiʍ|-eDYBEq12(�/$,t:bD^'T`�/W*V,c{JS8c0GrK=v^SIZR[
    :徆+1|1)ZJ5)*Zj]:EOR2?Nև˪[|M6ue~n.G>`mŃԛ{'X<D<MW`[IyhUs9F#/I "k[-VQI0C10ݤṞD`bGLŠY{!ƀjE-+(	lyb3-޿1s;o?ƽ]]c�{̖cc
    {nvWm׫Բ,xy#-(@d#&KțA$P^<hRR_єf|?KU.r&NWB:Cu-7nf{~~cmU{~9~9Ra[Gznܻ'ggjKtKCO]>
    ǸIn�i-4SKnm"&M- HP9FIL2JqHtPbY�0Okv6>DMӰ6;.%twgfs/>/7QQSOA4tF%-iyEvQmo%*fު7i2IE
    	T(FI.9BkP|ok}{_eȮż|v[bl=IKCJ,mUյL@uh**E+9vRԖ:KV+H2)%@ըR@<2
    3N=_:d;'7:CM{{wm
    1O}!{2<gcb)6K r`q˧}%g`^@M3H"Hhb@EA_1\hHVce]qUA#Q*RUUKO_�o�M��yٱ�gSo-y7Ͽ>�u?_�%�q#v<o<//
    o+xOݫ]>'<Oz-Z-|_Fk)^G2i'ƍwit콳6wN?n.CUN3Pjzy G`=]m=iF_
    n&8	 +U`"ZܬmHSDM@|>l/~ퟏ�?;s!~Ňl
    }C>+׾ԃ>Iv͞Hl9=VyhHpmrϹn
    dT!/߾cSƹ]q:AHk/N0:QcZ0&TZToY�yNߟ1w1;3~/vwm{E֔յAeR*gg=Vj6-XDrOC]2?Nug`cei@NF
    0c]w|5N>0hqFoRtr|.]f9i4)>-)61.͵ZIUWnV'>:oi
    U|
    ,\
    	^qQR3M;y0kcGE?n&U.-YͻsyNUlYbuY6<K{˞[ϩ],~^;fUn_dêH5j1KҧHAQ(S.=IA٪LPjO;gھ�04rwkLdAޛ_wMܻ?׃uEva<45y\-mn鷋#iyO$QYҖ؂A03h#H(muʐq!iSO[<=3;>w}UfSr=Qgf۽sc-!9RКE<$0⭂Y_Mot2I3N5L<q=Ј] PV^nm%x4N(3Zj/�]�?z?O�3Z?�xy>�[o5kJ
    kS]>/^I]okJSOJc$o2=Uیl=ٽvNï-ӽwN;[tw/v�>0SPNA`z	I$JHQY5*85y$)*h^
    H�T*jNiN$tHi7e&.;sqn_4M[;K}d:y0ۮ=j7UVu[[1τ;
    zHkzsƗ	2mryTjCWbmY!^0
    ݕ%
    TЍB Q=ZsOYM>]c_W2_,v=_)7FwBuB$Sng*Wgunn큔F
    p=6ƒ!h^!c.|&9meI`fE(бvh;75#ԫJ6~NSgYmۯguRm|wevBl'5?]򃫿9nm)rR7Geyr3mKwHI.I&/h[hBKjJ,s׌{e1h@HA],jJάGmu56w~fa\vmG,gSsYN,n.7t4̈́lU]PhxZV+V!MNj0Xg<Pھ]pHK#:4|=P_4;ݿKu>ԡe7~lFvVlڙ7Y&wm'1jLˏ-/V+5Ķ*ru\`C)*BUW "&ɥ
    dӢݲ|~]uN3v>쭣7'ams3	W[NGn#JlIC-KT5J
    KYGl<w$PE7>ƘhK6.
    s!R�5@J
    fpvhzs?G^Ϋ
    I#svvl|?|<W9m3(Kv=:C65*0RxݶDx[A!%5LbGw	"ҳ]?
    ~l3-uv7MM?9~Puw7-ͳsE6.J\}w1=FvW,6ܑ^$tĒDhj2f$-$t!7=PS4t+֤=W]?MS>Zv;#T&7]|1Z|M>OtA8mK3mV6*[g԰ԧRэ5[Jo!3�0pqp**Fuq߽�GŪϛG6VM;pmNIMޘU/-˹v~CsUΣuOYYp{bILLRӰrK;bbۜ{RY$	éYdX$p]R	M�CIէVWe-7nf{~~cmU{~9~9Ra[Gznܻ'ggjKtKCO]>
    (U%]opo�ZhۀD7SM&N[AsE&0!+Ɗʯ"SGkMA~Qdb9<w].[7N_8|Giݝ̼EEM>F
    Qrz/;vEtGzC(cڪߑΆ3X%('[Sdyq$OwE{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^Օ-_LV͟Gd�]ouh=~{ߺ^׽u~{ߺ^׽u~{ߺ^׽tٚ�>[Օ�/_m~!^*":_vCq&K!<B9"PK冏hdR%Oe՟ ֶWWȷY2BUL0?Dg#&*h[ȑ33jxϩ%69[TWr][)sco+pDF
    DuAa\<Pt{ƵUq$R�	E33=��W�7_ҰIomm��}[O,{Ov�]bVv歇[o|):u{d_7�֭};�yz*�u>UN[ScvV}ekgݻ[/7#I<'!?-,/⨂9Ί,-o{[hjjGPhAV��RG\p Ӷژ,.\N;omݻQXv#c8}<pSSApj�r((%HBU@U��LKRO}ON{ߺ^{ؽjdwv[ޝ:]{tQ|6T9ôq9]MLYqWUSU0$//%"Rkb1b$UyK�R `
    Tf:龽{Q:wc׹ɟߔ=yN%tK۾X62-SX6Zb/Ⱊ7H}.LzWSUN+ӑ4"ՠZₙt
    k^l�na?�d'
    yj'F1	kem6](EI&RI4$'<+9IgS{^=T=6S-0ۀZfdnSarP10nmY
    5}1!kSI44,o;eYmYCJ;#i>cRUXw)*A.K9T+ ��Gھ=쮣Rm~}A?C{+e㩳TэcTԤbdTG%aDn60@PY]C�@`Z+Ƅ>iabԥA ^I?>v��}?�p?g�3^?'O1/i}txZ|Mt�CѮuc::UOOi<N+ce?l{s|dqSv^�!Uk$hz[kWm4j"2 ЀGHn(H#0zI'vBmlv쪍Kͳfi}t<av.\Vm知gG<O>Rd5Utm0%D*
    )J
    1#PHb]L$GM@U03TkC"gnݝ7{W^ N;Y}Gjq[O{]_?R`ISY^ʹ;eO!c 3$$HGtd `t\Z!cC�[Ad=
    [V޽r-]s-pm=݌b3h\ye}}m6"l\9
    _Zvd4c=*C:	*V`C.jatH`4$dVКV P+CN^I?>v��}?�p?g�3^?'O1/i}txZ|Mt�CѮuc::UOOi<N+ce?l{s|dqSv^�!Uk$hz[kWm4j"2 ЀGHn(H#0zV{Q:u{jr`ZT4wjg`Q]MkkvsmPΫSA45*:+qJE#aYZTjV�qՙJ)A##۝WRݵ9Lݘm.~o&cs*k0n۟?{�?o?
    +,c+*^}-aܞYI#$RɨB4f)#PG $ԅYBZ!@EH,5qE
    @OkC"gnݝ7{W^ N;Y}Gjq[O{]_?R`ISYʝ9hw$$(C\AfHI$4@+0$sephQnri87n[z_mv̶vMv3ߘl.;wpT;Cuhg؊p)~iڦkHY̫'c$
    F:Y3U"ZBiZ@
    8tvݕanan�
    e6~!cઃ Eեk{mMHM"B #$ʸAƦް]_Z�<ӭޘ^?GAW24xm~̅NByELI䁨kEUۑ<Ɛ
    \pLa5$ii,I&I%|Dҟ:ҞtY+ce?l{s|dqSv^�!Uk$h?iu궚5tjUpMTh@#$F7u$=+=4sTy9aAl5Ƭy܎;qcy
    MFC,9Zj*z[UK(`2+)S�Ҡjie)*A6e*hix1Ϋ׽u~{+6Uw`
    vZlevwl=
    ܻpeܴ453<+
    Kmٮل{Q݋;h;vUT'q($HO?ڵm[Shm̴8
    ^tZ<&juc
    ػ-;SZ4:oOg-xۣi>$3D厐*EbB&Q"4"eaLԒ	jEMzvڝb^UźOZv^'GU;3ҹ,~m̅KL;%CUCOS}o]Zw	uA*J	!
    juddI":ԫp:I+i\Z4Bg[_5ܛgrbq<?QÑf|t')zj$]*)x%W2UR0A`edfVRxzvU׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^ʿ
    /_}{_t?y?ԃ.}o`zu{{^׺u{{^׺u{{^׺lş-�j�ŗse/Sz~N
    
    {/qUH@x{d:zHhǨ1.֯"ݱRSܶ2I"Dz$Eo(Imnn�MB$o~ƚMRbSN$tuR?q/52
    yɦmǑQ=KHd?b౽<8?e
    53H3�suv�z�}u'?ӰIoml��}[O,{Ov�]bVv�Vz):N{{^
    b{_�+�7^%�U.u{{^|wzGY�D�eه�AK)[?ݯ��3#;>�A7aO^t]tN~Gf:ujZWg^w,	>><gN�0?!~㪾NYWeg#z~GG
    Rlg`UC&7,/Ό),G-dHmV[S7A
    %
    XPZlMov3]M};7ylϝ;zvVm[V|>VmMŶڻ沯PdU5%Sz_}$wʋ+pHё$%@2c2[L/IPb�(A\Ozd'߿&l�_><vp'U&٢}~XoGu7vr-Ы6+%(c.hbu[$kyf)7+I$7ETkn3w842j:081PxIбso�=Ot?&I>2c/cdv6gF3_{h7:1))k#묂ːUϹ|3{O5Xm||!aHni>
    t?G;U5UYBe!;hi+_x.n|W>MT;\wc?0;}Bva?I0u~%Dv42Խ5NY$Qvk(}
    RG.䙢#jG
    )b֥xM)L�c
    RL_O3J8L?SoiY�K�2XQus}%ww;NY6𾗤~36oI,w;3�ż8w(\\sSId?fM:2RկhXh�
    `TdZ.o7~{G򛿺14Onn݅nzܽjw7R[fM[Q1{V>۹v##ڴ$+6Ws엿@KVi^-17BxSC8FVC94O}M59i_icv.{K[-A;(�ej7ӴG!ķ&ee]U/.tGTg4B%JSH{rxƕ5SMJg(Y�#zw.:~;[b_%_~}Kۗ]a}f~Uٷ}7֞DT|OCƂ&HCJ%+gH_B�
    tҵ4ֿ5D�lŝ۲gydg<W|m;[>*us&[ö|ɦ;G!6.礨|YKCpa3gw˱\[nݞC֨[Xfm38%PmĔeKx}-;UG5%KU=,%WCwǺO�6|ɽ^Y3>}uoe:qc6
    54;jvvW̓,Ktes
    dl
    '3aķZ,2E&%D0eiZAxL\7=$*C2V(\7CN)o^n}I:fKE66/zVEsUڽteݫ3~[Q"UJj"3w&NYۮ/mIpf2@A/q̈!XndǡѓNfWD;/ܬ
    ~7m|-ä:{7쮰n꽙ܔ4S!-U4R=T)	͚hdH:D*�Z	4=Wp`Up&aˤlЯ=û n|EoZ_co^x-+{wqo:~9ݯ؛frRR}ŒUG5mD89S>n-2]Z01#ʊJb𝔢#5%FR!p0
    IFP5j�Ԑ;OLN;'쿇'~wfnN_gmYmЯC,Cm:wa
    J^+]fs@dKKi#bWh#X,j^%mm�"
    KƠO�i;?|u?Wl#?1O0tW
    Yܟ:Gu^tN<Oi"|Xnš;<^ݥՅ1mGtZMZ[	-oqp4SJ%m.A&m%V)A	
    <,WLl
    ]jJa>=n
    C~MuٝY;{);iTl71e(2[+xk&edQ9
    u%fV+10
    5y/j'Y+J-:Op@D˨WZWp
    �;7kBɽz󩺋e&O.vؽYuWj~їv1luDWPk)aܙ9gna&3,2"㨅bْ#v+FM:ji\ydtr|5ݵ;g~wñ;޻+f;rPb;'kmLCf<::ETJR2s'6h	Xbu)"`�HXkT$]R)Vv`C,i}?.~_dtN�sمVߐ�c:}P]ۛ/+�k=ozr��,>oÏ06Z#J/x@di]2kX¡NVTu�Mv_l~Bo,]mzkvN~ܛ?oytxv֯4ۧh6wOXk)hv,3lv+m;r[bk2-y4PJ
    oGjH4z�pvP	}J2jn])?7�[k5;fugϮP,fmSnrߐ{xŔn~ᬚ-D{CL6xKEZ&H04佨f+H#鋀XH`Z&]Bp#
    Ѕˆ=�ˣ]Egݣ+v|&ڝ6NLfyNܻ?!9t]gQ8=ѱwb$K&)iwvŷ8XI!SԳ!#I2$H
    ;8#wH$ M4:�u
    'VXA^O\t辥�fѱVշMofקl?=77mh3n|sDVS?�X'KVV:Iz4ⶁx]4|n_Ki2F֨j4t=G~jƒa|I[v쾨}=IW`z|Nٵ9*\llSRScdP->Գ9&h,bXHHH!P$!ժ'+6�*BŅjƆMi'pu|px?$_!z/=ؿ~N؝i8+}l
    -O}YE`0XMGNzL2UVI7gٮb7$H3:X�F!4H=,4WsAxo@$BRw1ĵ@,ZvO�1z7O};She7'ǎkם:{O.z;hv(}<p׷iouac[|QqVBK[G
    ҉nt1K5IpGIePBBm(KUWZOuۂ�|m/ߓ{𽅶]c6gV|Nuljhv=f쯛-YJpɡY<No4imoYd9LL#M^Kډ`Ҵ:1l7=$*C2V(\7CN)o^n}I:fKE66/zVEsUڽteݫ3~[Q"UJj"3w&NYۮ/mIpf2@A/q̈!XndǡѓNfWD;/ܬ
    ~7m|-ä:{7쮰n꽙ܔ4S!-U4R=T)	͚hdH:D*�Z	4=Wp`Up&aˣhk,>؜i~j*9en,t3dvGo:	%"a
    Xܬ±`UZX$29c<5-U#K)#!XzyOy~!؉ka2}(]_);zlf-;oe}uhy)j0̕4է'uuKib;H%K$&4u&TC@|$`EVcTw)xҢA'z�+v*p흧j*~^|F=ոlfN|_pd{{#kv6Ϫ;x2;^/ܰS�ɹ5
    MnAib
    /4ud[O3Ap/ZI-㹂@d*�4j*:AFPk_J͵Wӝش..WΊ\B``ȷ_MCۛU?c[N+BMٴ,mSF'6}bZl,wٗDf?&(5Lj,SmAUNMwhS]-׌&kF�ϐiYŲ4?
    ]r)7fh~ƲhOlD木YE4-$W"MQ2
    +HK�</ExA+F?%rj2gmo-&�N]?vNk6
    ݛBhR3l7sRVQǍ'u{[h@P_
    HW+:@#2yHR.tI@uU�BM=%ݍ[6aEMs['>�}y>Ϥv_Ofcl.J\V7faͯb3
    :{ev7Iu=sR&h\IX3�
    HF8vS.3,h�@4#NK�|Nv[.;/&;{0XMQjvoVð-ͳ2;WKOv5
    :kˑʱ2KudRʢS\*(8c,*L
    4BU:5Z1jEE4o?g(8[vw.騢u7=ݽ>3Aɴڇ
    )v-)Q=#RB,get�qIAnHGAnфƴBWH`(o@z`55F�I:u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺�{�)j^^w�hu K�m�n^{{^׺u{{^׺u{{^׺u3_gڲ�qeK�>ވ>mwMTt}#%Z*LiJ7FVD~#@yBgMۋB[ުl,[1/8T-QViM~iKvcĒkogd0i)WnڵZn`2Y?AlM\8Y$!Qਊjy%潣ratBTxH. =j\cVOMw|&X}$t?W?1_Y/�_]aw	z԰Ioml��}[O,{Ov�]bVv歇[o|):u{G_0sli_?KƘ%��<?}_Kx:5h?KRҘzI}kkӪiB
    O^W7'?|{�
    9����7'?|{�g?ïV?1�CnO�c^cܟ����X�׿?�=�߿�
    9�{�/r�{�ǿs�\:c_?^����Ϗ~�_6?u?~QQ*M9^}A?C{+vQgih٪LFL}>Z:Lʁࣽr`y*j$�V#ϧ#abLJT)~/nO|?�Տ~�{��>=|?�׿��7'?|{�g?ïV?1�CnO�c^cܟ����X�׿?�=�߿�
    9�{�/r�{�ǿs�\:c_?^����Ϗ~�_6?u?~�
    ��a�lpՏ~�{��>=|?�׿��7'?|{�g?ïV?1�CnO�c^cܟ����X�׿?�=�߿�
    9�{�/r�{�ǿs�\:c_?^����Ϗ~�_6?u?~�
    ��a�lpՏ~�{��>=|?�׿��7'?|{�g?ïV?1�CnO�c^cܟ����X�Nc`8>-PzG>wur;tfPC.[rnl^FY]U5D\PHyMQ3Qn�3P[f%,I9'-3&e<t�
    ��a��_6?u?~�
    ��a�lpՏ~�{��>=|?�׿��7'?|{�g?ïV?1�CnO�c^c'>ݕa禰ke�i2?2>
    <[:+^Z@MHSB*0@<GWN\x<{WZlmLk~8۸,=8Fo*|~/54ƨ"("9MRPp@��[ٙbjIL{v����Ϗns�\:c_?^����Ϗ~�_6?u?~�
    ��a�lpՏ~�{��>=|?�׿��7'?|{�g?ïV?1�CӟX-ׂm}8ɶw&'#[w?tyQbr 9!YXܾ<R?)UVR(U`0z#+-
    A	}GNܟ���cZcܟ����X�׿?�=�߿�
    9�{�/r�{�ǿs�\:c_?^����Ϗ~�_6?u?~�
    ��a�lpՏ~�{��>=|?�׿��7'?|{�g?ïV?1�CnO�c^cܟ����X�׿?�=�߿�
    9�{�/r�{�ǿs�\:c_?^����Ϗ~�_6?u?~�
    ��a�lpՏ~�{��>=|?�׿��7'?|{�g?ïV?1�CnO�c^cܟ����X�׿?�=�߿�
    9�{�/r�{�ǿs�\:c_?^����Ϗ~�_6?u?~�
    ��a�lpՏ~�{��>=|?�׿��7'?|{�g?ïV?1�CnO�c^cܟ����X�׿?�=�߿�
    9�{�/r�{�ǿs�\:c_?^����Ϗ~�_6?u?~�
    ��a�lpՏ~�{��>=|?�׿��7'?|{�g?ïV?1�CnO�c^cܟ����X�׿?�=�߿�
    9�{�/r�{�ǿs�\:c_?^����Ϗ~�_6?u?~�
    ��a�lpՏ~�{��>=|?�׿��7'?|{�g?ïV?1�CnO�c^cܟ����X�׿?�=�߿�
    9�{�/r�{�ǿs�\:c_?^����Ϗ~�_6?u?~�
    ��a�lpՏ~�_�||}?>ίk>֯LE}޾vjMt3J ;X\ҕ'OFJu{{^׺u{{^׺u{{^׺lş-�j�ŗse/Szߙr]S]ti'7ԥ$XYSUJ<l/:3@ZVcE[4{6(oS_)e?Y{Im`&>&7ԴwM%ڵ4W[Tih!4mUxLӽfO&3,ZښyIvt{4h
    ')�suwݏu�W]b	z4=� ]yW#CzTjе>ݢT
    [^ޕ#.SW?No֢�[8oш_}6;#c6�C>:n&)g=pO$.Yk1^9+rucai+*c@ʊZs{"IR@h?OE߃�^mɗ+#S�g'/},Oޤqޏ!_?Xp;�ߺ0�@o_q?*}~0u�C(��z�zط'/zg|0auߩ_/[c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_rqJ|e6fX0/w.6~Ur\~~@5h8}9^EOpHf27WVO[Q6_rvVFFz̄s;6>&fu5ieiohmtF@Kp��m8P0bN$(ڬI%_3Đ	Y6W|Ős螝䰹C/fc/MSd7N[}c(IMQ"W*5<ڭ_ݐ:m2ԪYYAS[>OӉKm$"X�s(T54*hG̿/}0��W�9_8rG[|�oH{w7h�z߻];:�1S8W(7릨XojQdmڟxES-H<)iFhl79jiU1ٮl!HTJqe3a}66fն<*T3TOj]45zJorr6�cr9f#GpٵU5,usWmAC!r)23s K'236b-7x6M%�Mzs
    rrh�t
    :ٍ''{Ϣ#Gf?_|Gc+_}/Ӊf�TA>ќֽ9Ss
    m۟zu~7s�N׵�nA׺�TWߨ=:^�^S?_~{[o+{koM�}ӯum۟Pzu7s�N׵�nA׺�TWߨ=:^�^S?_~{[o+{koM�}ӯum۟Pzu7s�N׵�nA׺�TWߨ=:^�^S?_~{[o+{koM�}ӯum۟Pzu7s�N׵�nA׺�TWߨ=:^�^S?_~{[o+{koM�}ӯum۟Pzu7s�N׵�nA׺�TWߨ=:^�^S?_~{[o+{koM�}ӯum۟Pzu7s�N׵�nA׺�TWߨ=:^�^S?_~{[o+{koM�}ӯum۟Pzu7s�N׵�nA׺�TWߨ=:^�^S?_~{[o+{koM�}ӯum۟Pzu7s�N׵�nA׺�TWߨ=:^�^S?_~{[o+{koM�}ӯum۟Pzu7s�N׵�nA׺�TWߨ=:^�^S?_~{[o+{koM�}ӯum۟Pzu7s�N׵�nA׺�TWߨ=:^�^S?_~{[o+{koM�}ӯum۟Pzu7s�N׵�nA׺�TWߨ=:^�^S?_~{[o+{koM�}ӯum۟Pzu7s�N׵�nA׺�TWߨ=:^�^S?_~{[o+{koM�}ӯum۟Pzu7s�N׵�nA׺�TWߨ=:^�^ljvg6;Wmwm�̴��RO?i'9	zptǗc0!T;Xx92.:
    Z&,`X\{OK�qOK1_YS�_�X	z5ܥ>7A@ii?#էXwh+]`)<�W?kv>WU;cnm,6e.))wnBl26^lA{C MWuha}93l7Nc<mU0WXVE +pf/wmk{v**i
    >lQ,rκ)èhܕHR,f=CqD1C*Ezhzۛ�+j?/{<.amǎ?^=\ӛ{Ng:O;n:}	k�eFRn,}s톒up5#XO?魽zWׯxh?a?`�_^��+ׯU}zVko^UXO?zWׯxh?a?`�_^��+ׯU}zVko^UXO?zWׯxh?a?`�_^��+ׯU}zVko^UXO?zWׯxh?a?`�_^��+ׯU}zVko^UXO?zWׯxh?a?`�_^��+ׯU}zVko^UXO?zWׯxh?a?`�_^��+ׯU}zVko^UXO?zWׯxh?a?`�_^��+ׯU}zVko^UXO?zWׯxh?a?`�_^��+ׯU}zVko^UXO?zWׯxh?a?`�_^��+ׯU}zVko^UXO?zWׯxh?a?`�_^��+ׯU}zVko^UXO?zWׯxh?a?`�_^��+ׯU}zVko^UXO?zWׯxh?a?`�_^��+ׯU}zVko^UXO?zWׯxh?a?`�_^��+ׯU}zVko^UXO?zWׯxh?a?`�_^��+ׯU}zVko^UXO?zWׯxh?a?`�_^��+ׯU}zVko^UXO?zWׯxh?a?`�_^��+ׯU}zVko^UXO?zWׯxh?a?`�_^��+ׯU}zVko^UXO?zWׯxh?a?`�_^��+ׯU}zVko^UXO?zWׯxh?a?`�_^��+ׯU}zVko^UXO?zWׯxh?a?`�_^��+ׯU}zVko^UXO?zWׯxh?a?`�_^��+ׯU}zVko^UXO?zWׯxh?a?`�_^��+ׯU}zVko^UXO?zWׯxh?a?`�_^��+ׯU}zVko^UXO?zWׯxh?a?`�_^��+ׯU}zVko^UXO?zWׯxh?a?`�_^��+ׯU}zVko^UXO?zW׬_k2[ZdV}ׅP=V
    oꍓP?PEbolxuI?vSUUMOW[5ng(̔1ECt*<	'҃5I,^YS;9껮m6'b'HUiJU["U6hdE{WpJfkšiZlm()_O:Q��W�}uO�~Я�奺>t�*1#�vlڻrȻ9)y@�)ݾ?Qڵ^MYYc1>|NÐp|)}
    {AoPBoOVi�4�Ϧ�л{!~_c�皿>�xomm�}p;�>�B�?_Vm־>�4u]v?^[ݣ?5x?ƹS?U; z.�@uSW(�*^?;�ZS<WͿ
    ?kq;
    ?_���WͿ~s�fg?L(�O��u;�XS<WͿk־�z?L()^p�]�L�_6�ε�Mz?L()^p�]�L�_6�ν�Mz?L()^__�%�m�{/5?_^™QS�߿�u0K�e|�[:/_7k־�2�ϰ�Чy�~��`u_xn?l�}{�
    e�aE�O��~��/ol߸ٮ�Z�>‹�B���_+׿q}��]G)}_�Ͽ~��`u_xn?l�}{�
    e�_E�_�~��/ol߸�ٮ�@uO)}}��W�WͿ~�s�fg׿?__/?�_�L�_6�η�M^�™P�U?��uw0K�e|�[:/_7'vzL(*^]߿�%�m�{/�dg׿__/?�_�L�_6�ν�Mz?L()^_߿�%�m�k/5?_^™QS�߿�u0K�e|�[:/_7k־�3ϰ�Ыz~��`u_xn?o?/O�_�L�_6�ν�M�]ޟS7
    
    �W��	쯛g^��.�@u�>‹�B��_+ֿq}��]G)}?��WWͿ~q�fgkޏS/
    /
    �W��	쯛g^�v׿?__�/?�_�L�_6�ν�M^�™W�߿�u0K�e|�[:/_7?k{�
    e�_E�W�~��/ol߸�ٮ�@u�>�B��_+׿q}?�]ޟS'
    ?
    �W��	쯛g^�vO_/?�_�L�_6�ν�Mz?L()^__�%�m�{/5?_^™QS�߿�u0K�e|�[:/_7k־�2�ϰ�Ыy��`u_xn?l�}{�
    f�aC�W��~�/sol߸%?_^�™P�U?߿�uw0K�e\�[:/_7v׿?O_/?�_�L�_6�ε�M]�zL(�*^]_�%�m�{35?�2ϰ�Ыy�w~��`u_xnl�:�
    e�aE�O�뇽�`u_xn?l�}{�
    e�aE�O�뇿~�`u_xn?l�}{�
    e�aE�O��~�/ol߸ٮ�Z�
    d�aG�W��~�/ol߸�ٮ�@uO)}_��WWͿ~s�fgGt�™aEu/?�]�L�_6�ν?k{�
    f�aC�W��~�/sol%?_^�™P�U?߿�uw0K�e\�[:/_7v׿?o_/O�]�L�_6�ν�M�]ޟS/
    /
    �W��	쯛g^�vzL(*^_߿�%�m�{/5?�2�ϰ�Ыy�~�`u_xn?l�}{�
    e�aE�O��~�ol߸ٮ�Z�>‹�B��_+׿q}��]O)}_��WWͿ�pl�}{�
    f�aC�W��~�/sol߸%?_^�™P�U?߿�uw0K�e\�[:/_7v׿__�/?{��	쯛gZ�v׿__�/?{��	쯛g^�v׿__�/?{��	쯛g^�v׿__�/?�]�L�_6�ν�Mz?L()^_߿�%�m�{35?_^™QS�߿�uw!/ol߸ٮ�Z�>‹�B���_+׿q}��]G)}?��W�WͿ~�q�fgkޏS/
    /
    �W��	쯛g^�vޟS'
    ?
    �W��	쯛g^�vzL(�*^_߿�%�m�{35?™QS���uw!/ol߸ٮ�Z�>‹�B��_+׿q}?�]G)}?��WWͿ~q�fgkޏS/
    /
    �W��	쯛g^�v׿__�/?�_�L�_6�ν�Mz?L()^_߿�%�m�{/5?_^™QS�߿�u0K�e|�[:/_7k־�2�ϰ�Чy�~��`u_xn?l�}{�
    e�aE�O��~��/ol߸ٮ�Z�>‹�B��_+׿q}?�]G)}?��WWͿ~q�fgkޏS/
    /
    �W�%�m�{/5?_^™QS�޿�u0K�e|�[:/_7k־�2�ϰ�Чy�~��`u_xn?l�}{�
    e�aE�O��~��/ol߸ٮ�Z�>‹�B���_+׿q}��]G)}?��W�WͿ~�q�fgkޏS/
    /
    �W��	쯛g^�v׿__�/?�]�L
    �_6�ν�Mz?L()^_߿��m�{/5?_]�zL(*^__�%�m�{35?�2ϰ�Ыy�~��`u_xnl�:�>‹�B���_+׿q}?�]O)}_��V�WͿ�s�fg׿?__/?�[�L�_6�ν�M^�™QU�޿�uw!/ol߸ٮ�Z�>‹�B���_+ֿq}��]G)}?��W�WͿ~�q�fgkޏS/
    /
    �W�%�m�{/5?_^™QS�߿�uw0K�e|�[:/g7k־�2�ϰ�Чy�~�`u_xn?l�}{�
    e�aE�O��~�/ol߸ٮ�Z�>‹�B�~�/ol߸ٮ�Z�>‹�B�~�/ol߸ٮ�Z�>‹�B��_+׿q}?�]G)}?��WWͿ~q�fgkޏS/
    /
    �W��	쯛g^�v׿__�/?�]�L�_6�ν�Ml&�@�uO/���O&Wރo~i\3JI^<l_x|)�Vr
    �/o6�;J��'ۑ�yKo^.E$uiؾW�ez'_ar�y}_m>7G~u__0�WoWM:}AK�~_FT�././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000151�00000000000�011562� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/manual/images/chapters/appenders/dbAppenderLEProperty.gif������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/manual/images/chapters/appenders/dbAppenderLEProperty0000644�0001750�0001750�00000007354�11377016712�033574� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89aF������nnn���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������!��@�,����F��??	
    ҭkW*\^}CË3jȱDŽ0d˗0cʜIs&(Xa5TZlYѣH*]fΝ=\IիXjʵQ:y,	 ]˶۷pJPB
    <\3[]˸Lasͻߴ#KL˘'W/�|p3ӨS^Z5D:|q-ѥ[ͻM={+_μУ.gϝ}w�zzMv˟O|=!J�߁&`!FH�
    8DWv v^$pAO 	'\av$F4h#<vxbl*b1nH&$;2Pc+Y4�>U�\`bc~9b	fl&�,p
    ZrIW|k٦꧛"&)''9 [gv|fgoj虡f*
    ucR�
    GH�` lA[6,�d%kvm_-"
    ;mf+"o;...;F,ZgY�hqt2!q(' ۊ(\51*笳<r,Lr>,B/33XH;-mXgH)MGJkj7tHf~)�wwއ7{&�ȍHxA~-y~'rvc#*'Ν>9:-Ꝅ~p�o#|7|G	(B4\#|M/͗_o~П/_=�֧s
    X5Pg?qx:�x`@8"!W� +xlp
    
    :)̡KhB+	UxB0<LwCP4l2X̢H.Q>DÈ1~i#Db61@/1}@Ef"I=Q}# G@�
    Z�ר#qTJZR$i/q 1y@Q*YCF:l(Z'5SDe/kLNr$d.\*ҕ":̦6nr.
    jp\cvf�ۄ;IOȳ8iS@{bӠMB| ,'�{*ȨF7юvTv_hF[�:5(jQ0(�>St5UNsQ6)]lfRHMjRwQJTZS*Cx`
    XJֱB9AUle\J׺`=+Һ{]ū`KM,]W^*X&KZ,feєx"͚MjWrDҶͭnwVAlNjBMr:ЍtS!pXͮvzU @Mz^r|K׽ͯ~� L`Np;{+a23{&w-zU,_
    >0Hbx6Na ,vzc5q{*K8)N11{Y#,�2eF,1f1ynsӬ=yl3Ǽe+X}'GςH[zҘ1'+ҚiRGZ͜>|V7Ѩft|ζu!Z;׳f/[ZlW;βMe3ؒvk\7Bk͛5Lk_s{/ƶeZvώ|-n8wf=9�p<O:zfpy;@N!\ncxmj763cZVWN^,Iq<{7o<7O2,17{<]g;vur
    :շh?{+v̡_svmNxϻn~/A;'Oyh(Lj<7sO|uaa�h^AֿwFc{ȏ|Izi|I
    ^Wqy3_߽>݃ξ7__P}wzw}Χ	؀|}~|g{	~w}!(G{#8'}ȁ,]';>W)8zDH}+x~@+8PH~~].h}}X
    0(<GLXMXGgHnhvH
    ^]mF('A8uwyxxQXh(؆ ȂhW}ohH h%f(~ǀzX($8~x؊ȉdž7|(~E`ՠ،g
    
    yҸ\|Wx蘎긎{88MH}8XwLjy		iX|v^]ʘِhy7xw	Y~8eUy'{W~aHR
    ~HgGnh>iHR:MUY88
    h=HȖ=DŽ8tjhgHhYx"OXwuY|i];gYcIi9Y(}xٚF~)H~})Y
    ə)9I闾隹)U)yyɜ8(E虪9yٝ|iI霠ԙȞ-؋yOi ˹9Yiɝ٠؈h4ISx8ɔw{	9H^Y)(H?y͹[)Iy9+~ȡ1ɍsy|GY!Ф]PJK
    x%Zڥ`b:dZx�;������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000152�00000000000�011563� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/manual/images/chapters/appenders/dbAppenderLEException.gif�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/manual/images/chapters/appenders/dbAppenderLEExceptio0000644�0001750�0001750�00000007425�11377016712�033527� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89aF������nnn���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������!��@�,����F��??	
    "HPkG?	D]y3jȱǏ CIɓ!,xpX10d͛8sɳO"L`C
    `ϞA=4LOjʵׯ`ÊKٳ[5e@ݻxW„
    2h܋j]`†&˘3k̹ϠCMn5惠b˞M۸sKİÇX3t
    ;7ݽo
    УKNسkνw}w˔^sҫ_Ͼ�OϞ>G=&qg{m_F(Vhz^ }j (b:`_0(c�8c1^pT @	פh^@hd<B'GF)TViXVcGn`)Q[?SL4@@ts`gtPxit
    wh~
    װ&*)j`6BEZ駠*ꨤjꩨ
    Z(򹧪N
    謭šꭸ뮨"	db�@.l>V:k!pB
    ,\3yY[c߆�k+-bK-l7찾z/`h�lܱ1{\((#
    pTT).�32+HJ7lH'L795+<&W
    \wNsK򧝂�o p}Ht	*�-5f"v ~Gnt9r#Bug.ww/ki�@뭿밳>;n	(B4\ͫ޻?|
    qWogw}>[?~>O<Dǵx!�@G`/ 
    Qo A	RfGH(L
    WHP`1p,̡w 
    &薵h"%��Nl"'VщSd"o1A
    pp
    #&'Xb@0
    2oи:x̣>[b (H.T
    F:򑐌d1RL鑢LNz(GIJ�4
    rp
    Lz@
    ,(xTGɤ6)^0IbL2	LZRtB0�O̦6nnsm7[0�:5Yk* gϙu7D<~�
    @*NpډMBPӜT[ԼͨF7юz@#s\
    @Q!'MEWҚ8ͩNwӞ@
    PS․&u$/PTJժZe:yk,[MmV*^S:ֶp\J׺xͫ^
    ײr]uI0
    Y=b:+qZͬf7z�FKҚMjWrh_+ͭnw
    po+W=.j:ЍtK]e.tz
    xw{]ok�mZk#-}W{_֠zLҖoK{`6pmR
    y[^#-A[/oOw1yb4#&q{slyCquʽ-qy^(eN|'X+2e7yd9ce|0طsc9/{59Df3!Fӊh{ZĆ~CiGOƴJ a]k]є~][-N{iGG޴h^S̷63klw&U{]`#[>li:kxn3m;ۚџvwmY;)Rv\esզF%9ٞ|:xpo\'aU;#>re|-_6ji^|?o.[HOҥ;PԧNW=g{`ع!EdW;ܫ!w}xϻٲO��@6;k;ă<4*?etO]<>==Izgc{k@={_z>۹^x哃|E/O_o~NwϾx_ϼ~^'Aۏ_|_zȇY̧G{X{ɇ~ﷀ~
    8	8yg
    Ȁx(|u'~wgx$؁/85~*(6X4ȃ1X37'Z7|7xhYz?&~I(6H;{\7~]Ca}}ǃXׄcׂ'Zx_|LJVX:zX1{hzhYqXHbgh8hHWXȇ؈g(XYz7wu~駂9h~8z脿Hl8~Ȁ¸7`~9[z'R{v`7Lǎ討e
    ( p9huy
    ِ �|9Yq[gy9!ّ$Y{7xԈydyWvJy1YY):(|>{{ǔ+p'vuדPT~8(Y8ɘ}g)hnj8h8S)w`GTh\9nȉDyىkhhEyxOH8OٙHx	QhoxCɆxț/8)XzX,وXI[(xicȝə=HlIh螀)wIٜ膛8t_Y*U	}Y
    :)Y)[Hy)^x$7 Ǹ'CȊڙ+r8ٛ\؞ai}Cȸ	
    &J뗖(NHPx	'9&	XWbb:{ɥW_ZxyKǓߨkzxʂ|ڧ~z��;�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/manual/images/chapters/jmxConfigurator/��������������0000755�0001750�0001750�00000000000�12203357067�031006� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000146�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/manual/images/chapters/jmxConfigurator/mx4j_tomcat.gif���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/manual/images/chapters/jmxConfigurator/mx4j_tomcat.gi0000644�0001750�0001750�00000066011�11377016712�033564� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a���=fffݎ�KIP%eԷiL�Z3n(>RQeژDjCCzӌ�Xh�m�X梵
    1j///Ukl쩍rU$;U&�H{�U�S-*VYаb7hqCԮc" x[&\#k�\鲳CS�\~yb�kS d�;՛?Oڬ�Q䍞ȼੵ�'9n&`1YZ񚚙qn2vF6L\e{zzU�U\jO�`�T�XUҽʻ+�eX�`:&�1j\fZPPh_oJJK9�����,������M9h*/&kFI#681ŋ3jȱǏ CIɓ(S\ɲKbʜI͛8sɳϟ@
    JѣHhRJZuD:p#jʵׯ`ÊKٳhӪ]˶۷pʝKݻx˗/*UIԪ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺPap%$ZrͻNȓ+_μУKNسkνS6^(q󕆡M˟OϿ�(h&6%m$3x6mWA Ɉ$h(,0(4h87R@)DiH&L6PF)T6Xƅj({^RDޘdihlp)tix|矀*蠄i%P^6D*餔Vj饘f馜v駠*ꨤjꩨJ6꫰*무j뭸뮼+Ķz
    Gy4aʳDYfv+kk,m!4b
    !H"(P�>4�,l'j7GL,M#�!J5To	~T(,0,4\Y/1F!́
    
    c67PG-TWmթRG�0@
     ׂJ%K5L!LDʄ??D?qO?÷sv35CcyۍwDL"ߓ:wX.褗n:ZW
    5d)C*”37D:?| ,]Ev* CN8pBsMl{;5#/kDԿ<s
    ��@JkxG7@*`1@!AP?n`H
    ?нV`@~PC(G)vJs+(ս#$C+CUmv<0Sʓı:"8H*Z
    3B.^
    %+PT]	hXia
    vȣ0;	у;򐇼[hȹ	acC+l[4s"'0JM
    r*ȄNq#XJBn&1 $oDaIv*K]r
    #WZ̦6nz8IrL:v@ 
    .c*4?(w3D+`=8"a.[AyhHDxs[	b"^~C=Bѣ ; 	(M EHE#HR&4A;C'0ӗhM+Gֶp\:NY$P
    
    4襯70c[Q�wGGL*0jYp'sk'^eo|؀ID-lGfgնp!Fq'mc-
    ҵc%lUrpX!j0ՏI"T*e-t&tV)|Kͯ~ƓB#ڐ75
    "V2X@8Z4Cp 
    o@bkN&"j7ӻM؀dEc�ň,aXt[cm8c!6 k\cͭ362Qb*ߘƛi\]8N6pL:xγ>πy@1x	ڀ6BY=r4!#*,Iۏ~?
    PGZ3uB5zo_CoWz(PuO-ia@i-P`@UH!SSZqsmmz
    
    M6nmCq
    *Sw{Υ1mՑ(yMyۻ}�AOZ8+B4]tC8K D(G`fEPOXy
    Pk6F^C<n)[6ܜ;z9ҡHtMݙt|(,l%c>u7ݹB'I{Տt40BQ�;O;񐏼'O[ϼ7{(IBo@z7 
    8^w!ĸiS_*LBpav@C2Ew({?#ǀ;8n?۞A&9QG
    p =?rg׀~ٷ}
    QvM7tP؁ "8$X&x(*,؂.028(zg
    	}�@HPH
    P?PIH
    Hd5{HH|?ɀ`Ѕ
    @V?vT0R@gukd5HPMSLJ
    P?S@fM x|}؈X~8{('{XQ8Xx؋8Xƈ
    �r}
    �z0֨F8 ۈÀ찍(TH BӇ({؇((8(�)Ih舏9Yyia;h@F8$Y&y(#٥8*294Y6y8:<ٓ>4B9DYFyܰ-�Z Z`H9{R`W`b9dYfyhXm�	9{;Xvyxz|iؗ9Yy٘Y9Yyٙ9Yy
    W!PЌ
    } zٛ9yxpșʹٜ9Yyؙڹٝ)z,�5x
    :Þ�9Yyٟ�:Zz
    ڠ:*z\,Qၡ乡 ":$Z&z(*,ڢ.02:4Z8:<ڣ>@B:DZFzHJLڤ<j@N00TZVzXZ\ڥ^`[jdZfzhjXj:lZYZ707`tzxz|}:}z@
    JڨZ*Jj*꩟RЪ:Z	
    
    ʫ:zȚ*Ь:
    J֚JӪz.P. 暮:ᚮ*:j:z*P*bZ{
    koڰpz�n[�[rJv
    *z
    z*k,,[+k4ۨzz7K:j@jF{H;
    NMP;T;ڭZXW
    YڮZZz.l۶�˶|۷~aUʦ;[;-ڲ;zk[5 <K>B[DkIkKJZ]a_Y;쪶gdkʶ*r;uk;۽
    +
    ;dz{{,k"범:K9;+KA,۪R;ۻ|kǻb L֚kg̻qx[J2<<>|K[E#Kۨő۳l̩;
    ܺH;RP	{|Ǽ*#`k\JKϋ23L{ùak?lJI\@{z;s:UW
    \̨ŨƧ:`lƞlp,\Ҭa}̵́ȃܼ-l)
    x4u9,LW,`ɘLUjl{,SJ=FLLTf};ϱ ]*Ųk|ˀ)MVji2cj<mt|vrlZTLܬ|
    Vl-;,_mc
    ;;l	Mnͥ|qݷs}\曱M͸i:mʎшzѲt:,Ҷl-+
    /}13M5m79;?=ACMJگݫ,B=KM-Q-O
    SMz,XՄl^]a]c}_Mhvlbj<s
    o]u
    sMo]][ʋ۾rLnئ,ωs:"mm&
    ҙ>̿4
    6M8M<ڲڴBMEvUĪ{l٬\Ľjg;giۭp]�]�[>m]^n_ݦ
    
    nwJM>؂wnzz
    ٯ<Қ
    ᕭe៽ ."N$n&ӵ>I0^--⾫7|S
    lB]ma]M:ݔUY]Swm
    aZjmn
    ߨ}N{n}<lŌN�ōM^ڥݪ-(~nG
    2>Lݬ.;ܴnjܹG.I]>PN^ӾǮ7_TnDkMk߂|m爍
    .7N'-emO
    /ƹj/^ꥮ񣾬6n۲^%oYJe-3_l\b.=]͎q*DAOߠ<O?myX/ʧŇ^Ҽ_#ѿШjyʴ
    0z+ͻ8­!O:JȒ|;0
    W\N`ؐa? B؏bD-n|ȑŌ!^aË"1XdɏU0Tӡ/iѐ7z܉FD
    ݸSQNm:uӫURʔ~Vf
    +@v=V-kRWn[_ۗ2&ar'1_ǑJ0e̙5o3dY̙TfZխeϞvm۹uom7xxs]Lwa%luݵsovիoPLϧ_y܏1*?+DpA-zآPoh«DS$2ŒbqF)P-4ZK-6`{6 
    7$N8
    lR9z;﮳
    J=-l/2$FZM5߄>9K))'P(Z3C5t¯0ҷ⪔..P/S[KT c*FV[WqL3	G!e3Wߐ,n}2%)ʂK<j[2d Ҝs\r5<?ݥUPQz'%-
    Lt_P
    `D5[TUcFY7]Cր5Ra=XOnֹߜ+Lks{9o-(s6h'vPx
    lzF^z-*5FxOų6Lņ!vQ*;nj1mV9UEdLVd[Vcy[f6d9綠gq:hEs}=$zp`b^`E,sw{}11}11ޜZPgU*cYzq
    :{^Up7|3W}w}%P/<o~?\k"�6tS(m-lnA :Ȏu;#o3<=oy^Z=5k�
    FT|C +~C$bq~J�'FbhpyC[bE0Qc$cxF4QkdcF8QscxG<Q{cpC$d!
    yHD&Rdd#HHFRd%-yILfRd'=IPR$e)MHde+ҩnAHpv!Q. `@h;j1aP<5U-cxMm6w QyNt/Y";Nxr.+9JJ-(@M1_t-MQ0058SQ23L)HSTaX<#fi=ꐇ$gK]jtT\dxNJR}sQdJ02@h�0h`RZBzUfUv"zDc!1CYpȘ5yЃ4ֶ"s+[޵tW g|BzCNeu#-Hr۹esm55ig=Y�%miM{ZԦVemj:U0E -!1#b2P[1TV{\n50]B~fEcZ¹u̮\]jL4y/^WW-kWX/cb).دd++^g/"�e2fFX_k-|agA0 ([9!H0
    "p!qm|cXHn	6Ȍn[.v=d.S~2iƻ]'Uou
    cXj,3XnpDg'�)g@VÃ&t9L~ C^ pbEG`hHgZӛt==
    !ǣ*w!06Y|62oa^W3+kـ:s7_2IkfCy:<\mp&7k_;hDP5bwRN#չH/W㺿`xp7Ru]sl-&eNBffKЎ3-{Y:+x[xf@p\)w}>Z!
    Xt{[Lg�ƘFtG]SV<iOB[g.`TK00(B>�	WxY)�ZXsC&`0B0"�r:I |
    x'^g|xG^|-yg^|=yO^^їQ^g3Q(VzmߛDwujs
    "@3j�=jpBX*0db@`ۏߟS_�@I
    [(7,X@l@/Z=k@,~
    @k�ýWKV+[ҭX52^SـO�!X??)#8k'?/B@2,C3<C4LC5%/s:,x@:C5	C9\1!;DA+!=+ȀDLDۣ"`BAFZI*`X>خA9pG12j(Bg�^_H/"<2`BNpBdBX*\%X�($x808~>/Fk41\Cs<GtLGu\OjCx*;@zGC=!�8-~H~|@k`4=,H<A*Cp N8IIXO5t0�QSIG*
    (1X2Y
    L2"1"$1p~("dc
    gNHJdLJ*lFg\%p%
    pFll?ؾs�prdG,K<K,6S2ǁ4(! +F{4D$="h˄DĆ4'IpKtIȜTŌR`EIS1J)HlIYl ȇtZEQ`8|ƽ
    s8JId`F+<%\gRHlF[FؾKq$ǴNODhCCl~K9tD*xzK9ȂzĂ,ړk8LȜ9X:%NЅ*Ŕ$[QTS\*ˤ4M|XQM11dQͩ
    @
    f\\NWt�ehkn~N4&KR.R/=6~O(�O`?O9`3�P`0G9Ž1Z]
    ULI)
    ^\tt E�l|ٜtцQgx,pOB+%X#*@
    	khR'Fo?oJ+jTֱLVAVl$m%mRp
    Wq]pQL2@SuO`d
    9<]Wz-0W5yUW<?
    1e1,*8KhF.KUT])=
    OuPtI
    `-ٍSMUWu|(YثT^/*9ڠL@gPh؄MP'mVԾhV,Uj-mEZFGlAڈ۰VW].-yh xx[Mˀ|]v}W6W0XM1+=Ѓ%&K\K.+M]9YX61؃iL1�5Y0|�gX�dV}Yˇc�Z@{J]Ze`V/|V[8hR%$ZGڴU$C߱^e[m_tJ(2�e
    dP2(21\4ۻ5\9[u.K+ݲ+8SY$݌dV]]hE'h-֨]}Yg]NٙXP;E�9$Nޡ58)^Z3)N[0.Je)VZ%ۜ8lEclc2^cV62~4Ncc5v_=ct?eE_A>d#_Gm%S01K`:8ዥa>6�;he;H;PV$`a~Ua6a|(b�GH@~XU]^a�jVȄl<.F'<0L@�u檵c4^U5fZy^{>[<v]g>g^CE1FFdAI&Cvd.nJdL^�S
    DUQQQ\Ջ
    "hme2hi2T0�EY5b|0f] atXf`ds�0?hxRSs@F;q@.t|Fk>ng8V봆k~k?U>"G_
    Inh"k:J~l{6ٸ*9#�6J1SՑFT.cV�; +2heր-$|U$!iP(jbiۿUAujhFSp6h`6{fkw6$x6_[v.og<No6pX,@++ lN0:ދhSS9l	pp_O/(
    >H#p?�m1qO�
    ^mfmp
    ؃q
    e儯8U!;|P"?|P*gX|r0_xjPȄ,0mn'l?S)pu(f8^6f>?WgyoC?t6Dp,�`+hlGkGǂ2Nˀ["tR[ZN1Fu9@�"gcXY"q9bqh^pH�WXmvXծ!?W#Gtg_=0Ww//؄*b͇0H(fP.Lbw0^S ;s&6NuV76[gcgDx.)x:�u+yۥ[NyNǎW\\9{v
    _U9vgq^0ni(z(z;A]A< wrr&fF_X|8yR0sfhdpj4&냗Uߴo|7t熺t^`vQ'!IWve`OS"_}q̝\koWzU}z/qq}>_0!ȇ|r?{Kwur(Xݸ.p.PcjkdsldcP.�<+h B*l!Ĉ'R,"ƌ7r#Ȑ"G,i\Ni	L+DE#&0`Qt&K4oF
    LZф0m4ӨBтi*V`p+{K$r QFmՊ4ʉk%ۼ0|o6߀8 ׂ_b8,SP(xal̙3|PA)mq^Y>gNRJ@"82SYL7eZ&H$ҧSn:G\ٲH"Vir3h酤ש(D
    Rfa^q1ADFz5K^6ؖll0:]p�ܓDŽ^A3E^rL*:cl/]�=B$KxO�tAsYy%Yj%]bLrdNT{9M0uy'x_y#
    :*[Ц(&:Jz#"ik-�Xh6hk;:3�9Y�G"$eLys^{,*,I[Xez;^~DyH`
    ;.k
    Y5(2軋bخ(κ
    #L>	+p�@[|1k1{1!<2%|2)2-21d}&-=Tzxa}yHA/(25ګ(j
    ]{]Z&e5]Ekvo=7u}7y۷߁~8+879[~9旫*@9d^9	:sncn:訣:쑇^;~N3m5L9yBBEz"==Ҽ�1uR4O]6H�(whȪ5a+ K@o
    o< @jm#ܰ'	R&7
    rr\\ANt\Rw9]UBߥ4!	7 (-`k`FĂ5+p
    (=xyOPPְIo|"(F	0Qv+Ө5odt9ұs:~P 1#	e҄cmȺ/TvA)BBh<B�F)0Q{TO|/c|%,cI2fd#.sK)aD#23N,d)ta	{kFDo(e(LJ.YskѸyҳzeƿ�8o@Dj5Cr C3QfBn~G-ёzw%5Aҕ.a!bZt)jӝ>)!ԡF=*Rԥ2N}*T*թRVUխrujWհf=+ZӪֵn}+\V쀮Y^]쀯tk^+=,b2},dP,f3r,hC+ђ=-jSղ}�lҖ-ek궷-p+=.r2m.!Rֽ.vr.x+񒷼=/zӫ}/|+ҷ./,`0L`X~`x-`s0C,K.q~2}и61s>1,!F>2#N~2AQ2 [2,1f>3Ӭ5Xe3,9ӹv3.D~3-AІ?E3ю~4HSҖ43OzӞ4C-Q:5SUծ~5cXӺֶ5s]zּ5-ae3~F
    iS־6%ls6m>7kr~7-vdwI}u�G7rd-#
    cqBn\#x]ct %']r<xBpC|>y)gFCH'pOY$8!ȼ:BrWDQ)~mn<$Bo8!,#Fs׽:?s '_x4OKa:OS>M38Iyg^;8'=c?{ͷ^&/t{Bw#wWz'?߽>|?_>R?#:Cy~yϟG
    ֡	^
    `}]- 2&b`՝µY 5Ay`	 
    `Aù
     	_
    G_M^-M!aɟQB`a"ava�_֞ffz ө_A]Ҡ
    
    "Z6! "
    Jbv2bF@na(^!"q"*abF:`Vz*)!2D*!
    !a$Vb1"!#3z42% 5c4J!0.4 v^IJ`%=`Ya;8!Ɯ(c£8cڣ=R?cą!_e"#VbEfF
    a4b#.Ud	 bb!>Й$Dd߹1KfG',t4 CO-P%QQ%R&RO
    `SZ8F%UVU^L%Vn%WvW~V~X%Y~eX%ZZY[%\[[%]֥]>[^%__e%`&aa&	&b.&c6c>f)&dN&eVeZd^fn&gvfegh&i&fLzYij&kh&lƦlΦfiؙᦇ馈憩؄gQX'mrRXs6='~qBr*XuuunvnVgv'z?x&A~؉gIgN	I'J~Qo{w'yr'g{z
    gin|n槈񧕕h֧Q構(肞f}(Iq֘E(Zgufgv)'BjXJVBiNvg&鍭'Nfn)"XFjii)h)~¨֨"('֨96jj*ZjiV*~j^(&o.)zjªnJ'zjvvi**6++NRFwfk=~nꌂj긚(>ꡚkƫj.gӭ*kiVXn)
    +)&l+Nw*fƩ*ĊJ+Bv(˾V+Bjl&~k+~+-򬺊k,*Fm6mbkʚn-XnjR+v-V,blŬmيlˮmޭl
    .B*lF2.^R-QFh’p(+^łR,nB٪v-*nbl
    ߊ*Z"k6ޫ".jv/>oІovbo&*&.U!m6Y&a⯖R/��0/Yy.?0G9W_pQ0o0wpip/	0
    p
    0!?0
    װ
    00011'/17?1GO1W_q
    0o1w11111DZ1ױ;ӈq2!2"'"KqpMKr$[S2kc"2((27
    2$_1'_r{ 2+w2)ײ-2.)װ$r2s3s.'2/33rp/#07[35c5cr5r6s*w*[3 Os6{)K6os78ò93738:s<=r3?3@#.#3A{3B6=2?/5sC'sE+tD4AKFCrBwES3GC4EHI3Is@4LǴL@C4G2=HDF4PߴO[/4<uR&Ps2%CRS?L_5Vg(4N/tQN;46#PC3?uY{RsP[/<;5Q[Mo4;{4>sOӵV_suTO\5D^uGb35a3^34PuUv:Ga6bGw5`6hYcZg\i{vcuf4\5OSe3mTvlKN5k6pp?1iZijk;jOn?tqCuf?ou]'o7xxpqfvXtU4ZEr4}3oKy4XtKG|x88idzX3wvz4]5\c#>5TsOx|l7cEwxpsuV#,588Vx,縎U%c69y)0'/0?9owÈQyYaiq~uWؘcXיy/h>iě?ßyS9z빣W9cy[:)yM^y:s&B.9ާk"y{ئ;جXs:CXC:MzcYg#zSدز+p:=;W㹌m/:;/#;:_{{;;z;k{'{[Ŀ¿{£;S{:SW<;w{7Z&'j>r"V+fЧ
    J/s3w?|c{7S}֫y{{o=؏k=W=;ǽzۃ3k={=O3J.nWnj.<2>b;B7_}ݯۇ}o<}s|ث~{<gԟ~ӛ>>~s|=;=+;Ͻ%>Sm,nOBgB.~?r٦7;=Ŀn
    4x@	DhƒVtaĆ	1nQ#Ȋ#/rxF+9bǔxsL8Y)%MgyiRK6uèFjUvVY~z5YYюu;VY\㖕{lڻn}w)\N3lxi7C*X d#/vRe9'+ǒLq㕙A|0ꤩu&-[&˕1߮-΢yl$oEMkөW^_sWՎ;Zw^{\ӷgW<޳}5O5|}K'BLL)D'+Ԑ=-BI$0#emuܑ} "R$Tt*'OY4~ܒ.02<4\6|8圓:<ܓ>JB
    =D]F}H	0I-L5ݔN=5)5,RM=TU]V50\uP[qݕ^}V1uՒV?7Mf}`eeVQkݖnRZ0=v-m5bU]e]jetu^sэwZjwa]^}-%߆VwV
    Kmw]Aޒ)X[-%ˉ%sYueqޙe>iT9feYMgzǵ騽\A:ꏓ~/]Z^;muy>m\m.
    ][pNY-\OZkޜm=qM'<m[O!ǿugS[}ŧ}ڿK|ZUy9΍o)쵟t+-~r^}ZoW>ŇxǾ	/yasn3M}̈́A|g>.v9Nl	 h6Qb"/O}S+au6CU
    ucx`?A"b#E4&>[bB*^UE/~aXF3*bF7qXG1юyG?D
    )}J$AɐELJ"#Q&O<N~%1I$`$VV_fJ
    r.I%@T)QKU"L+̂DҖd3yHg.|$4Yn*e39m&8%Mov3Ѽ&4ݹu>{ٟ@!)CR!BzJ'bPDJyO HJs--ZT -'&Cҕ#4Rt)MUSt4
    *?ZT`64/}^(*̅/}jan'@yVr{XRJ<{zRy㼩8jMz
    ՜2iJSztmkOz֘zPZXҧv?UB~W'T2iU[
    ȎT!
    -ZZڝ5|-\Kښz%m-]ZҚְ=e![>/fؑW>E.eCL;~Vle-K	سֺҍ=V5EJZzӭg6KMʓ&3ZrzP\O(�GNg@rB%=
    9__xUOyaӦ!I\b)VYbx$ٸ2byc\
    \d#xGV򒙬$7QLOF7e/,j`V(fNR\n \'yzsXFPϫ]\hgCzwxfт6ְyjhK_m~ަ#
    9va1]jScKfB.i]k`U9V[5k4| m]lc+
    f^7iz{]R{~DMZeͨTd\}eKf+2$\	'cKWtk%x-OrLc!1q=r)W?I
    1/$qsp<ͪ"󴦲de^t{(P19(:\{y)_a�J,Oq)jvJݺ]ӛx1aLԝխnN>v]PM(cհ�]hB3:\ɻ󙨁"y�yGV?*E&{]ԯ֮؅Ky޸)JeP=۞ǃ+_we_o^zS^j
    }*~2u.'_som{_N
    uZooxЫO/HNJ
    R�P1L0*?*Oÿ8O7.Lb?XpDZn(oPJtp:0Hƚ	ņP
    cN	PCNp
    KPǐ
    P
    א
    
    PPaQQ�'+/3Qɰа7QPpOTQYQ+iQaqkosQ
    ?10pyQC
    dV|uKY1_S01QǑQ=Q
    CSW1qr  iQQ !	2!2 	"23R#7$q##$O$O$_%G<֑KEW%e'qm*"!Q))2QQR*r!2+Q)!#,%CqR'2&m'Q-c%sr'R'R%o-&y.2/Gr*R+*_+2!Q!10 )R22+33S3ِ,'ѱ/(#r4q(,Qq%E-I&Ys5kQ0
    *0s7!R/18!1799ђ.,E-s6/y:o6eas-[S:S-r;717S1i1)21{S"!*r1S>' ""?33;/;3$S2Q,YRA?-k:r(;%C#4<51=0*TDGD(D9DCE_FUlEgF52EFwF4GnzHHEHIYTc.NI
    IOJt
    KӤKϧNTK4ʰTMLhgPMYf"mFyOLYB&ۮo(QEljH(O#Β-OV(Qo8'}TRG5}F-NHҔTeqMվTkuLP\mUh~DVsڴ:uVNm}UxX5(ڠU"',mQ'TZUSes[L[m\&&(l(S]Xup`Ut\x]TߔUQ	_iS̵Vb/[$S(VO
    c?ʒxeJ-@ee[e_vJfgfkeW:~It6gmg)pZgEgdzp:hVA+6pihVlpP:LԮhev	>ʺ/nꝾ)knlI =7q)pp+-"?oq֌`to+^obku>JvvjxyomEeutvﴮx˶uDw07qK{3OjWZjpJFbOHwuQz|�Kpя|i/|g}V}_˞
    .z9.˼n'7|,fq4jrsj{]7x@CkuCψsjy	cX*x6wԊXC؋X0DqXטQsT8ps3
    =ۘ#&א/SS밎XDя#Y<㰒X[1y !?%1?3gO8C9"Oّ'YG4RBK$e2u37T%y0[6q%K4.C7RR8Q*Ky)yS2>0YsÙFrB/t@5B</Yy9Y;],?>S9S->Cl9ٛ'1wS44;T@k;١t.@;>[=٤z8cg3'4:<!:49<ERᙐ5A9M1?Փ?_Y9Y8]Q9Uک}9Ԣ;:A':(?ڬ;Aq:59Y؟P0ǑذZeϑ[։'+C$۲3[7)0)~@)K۰8<7iaɁNCMX"0ru<)D[wx$slPٮH/nOo*Hf»#8Ωye	O{Xs%{q٢r*ot
    nUéW-RO7[bWjo7>Ldw|m||k<Xܻݗ2n.I~֯VmSo\o	{wVؿ
    ̟hwo̯*/{/wP•})=8>~}i\tϹVͻw+8y
    wQiǕgз΅8[koٛQ}܋#xh{1p\{щjżS8}/ls17jLFΑCxXá\c{קDUv3HI0]=EqPoq7zC
    
    S
    q)㳑ޫ3O>UU^xpڌyg;yXE/˰)r)"z߳+:2(	Ӕڕ";Y?Z>+"^#-21>31C
    B=Ӭ9z级9Ҙ::)^7O-CT읲2cz?~?R>yi>1 /?a'ڟY5}ڣsZw::{_59wy"M>מ{83y?)^>ߥYk_?4%z4ږ_?&lhÂ+(QB)6bG$K<2Jr9>3iY3M:k,Π?U9ҞKIܙҩG&*iʠYӪVzӘlۺ}7ܹtb^#娑oH|x⍒9e˗ns#{3Vd?:iO,Uuղa>M;+nܡŢ-kkā;;unҴ{>򯙫[=N,wg|p<	s{yo}%Jnf0vʔF) t`\>Ha^veֆp	Hk&b*b.c2Hc6ވ"c>ߏ$)dcED"E,dN>	eRNIeV^eZne^~	fbIfffjfndIgvމgzg~	h#'Ai3h.h>
    iU#)C%\j%`~$Jjꓔ6)j楇~)Jk
    l:?Ŗ9
    ۥR
    mK:ijk"J.~Kі-oJĶZ.oƮ:/�{l/
    p/>f̱zr\q.1\̮̳:8
    A3>lQ^nBvl'k{b[wmUgtfeEZیoo@<?|j77R:
    %Ykl,{O5Z=_.Қڝ~z{zҞc$OR}*2n;w5G<.zpOvu<zM1ﲘdhzO~SGKcϟO%_z�
    p,*pq Jp/xbgBJ8zp$,	"j5rV23%|M ''8;B"
    p֑&ʼn?r)p\L`CD0jG'!c�ϘERsn#04!Oظ2*HGތE:ᡎG<DaMT--]d"Ga}"Χ<)#JXƔagLX,j#Uȱ*i2MI].yǢPA%yIX0FdU9iVnȜAgbҹNⲍp
    ^̱1
    ˁ
    3yKlK`'5QYdžKѨpF$~�CN*Y
    `;L<Jè*πj(CjTR̄P
    Re`.˪*E&UJŒ5.?Y뉘|42ciSִe-Oc#Uɹh@eN,GJ 7TCjLp:p$Ɉb9sX?[*'~N֜5i~ctK_O-amʡކ𷠽aq[
    Idsoԭu- !H|΋w2/{wbr/7;7Kk'^:5&^Q+઒TeϷ~i_zޕ*zULe_llHC_ΔE*YPٹۮ+S0zWȊ].tvS2^d%.cJaf/Obz6
    zg^߄063Lgk[05XXƱ!q&<Ђv2�=hn҉>&
    D8̜D缵h[
    uu4Ѱ:fwbhI{yWV\]hMљYU5ޯ}NK{,=ۮ�7=Ss`&kiJk+-6Yһk29Å\sE.8[jy{sSRg5f8-:>P]mxK#rѺ{(vkQA27﹇%3n9z6=;IJNf]fS[MK\4u1̽-ώvu}pҟ.t.=|x!ݷ.7-
    oxPRtd668W'=M8x	%itu{y�Y@MEO1)wNHԙx$$oܘQCZeMJvwkc4
    ?	>a-$Ft_Tr$<۹|r01e*WփEMQxQM}]UMXV	QDUw|$U'~xRR=4WTCVE'NQW$O}	yQTt5YGwU:}5QK(AO,8ZI$$.TK#hp#LEThXL<XX]P	LXdU[€ńy؄xENpEW|؁li\h,qV%}W僂e|OX5%}YYX}zX{5NrU[*4EQhSRJĊxG\xx@ˆ#("X^Ei'HԈ#@A"v(HQ刎騎v[u-((&ptRuZX)UV&Vb(6sxrh"cbvSucc(v_befb&鑐q6,{FmpBvJd,-bsaoSsHv8eo.rsbKVe]-�W8G6fhv/F#vgkffifq3g>pOt˓0Jq*voDe1yoh(iifhou-rG?4tG7fqpFg)qptw2k w@ve0ǒ5noVwislsie9rɗ�6mJ=I	ttSw#uv㘁=gnnӖ2gp)oV96p8Fpooi&	f<	Wg	kp=ji'1:elFscrjɒ6hIr)5	sF;gY2Cyaƣm<Dgvt:G3
    yQW:S.&Wez#','*
    r<V1*3J#(j
    (,ڢ.z?
    A=*EjGDeyhES@3DE1G_:bj\GKJiZKG4^Lj[
    Ef:Mu*yWTaդjl~񁽷z8YTk|G'IM7~4XjAHuDWQYzd:X7TJѧ\;~OJ8K'Om~N緅稱UMHhڧMoTxTAѱ28uUլȡ*OS88JJ\hV˪Tĩ*R8Ȁ%
    4eeKmY�x5EANxE~R-X+hZjZXbXUp(PTiTjM̈́T;h\uT@(w{ǡKAu7eT'Q;$تe8{Gph;~5BFU94J#Rj[_e*1S%[Jej #P:B{Kx|yWj!Dz׵`KKkd~G⹟Eh+(Kk)/JS2su\XRۓ-["Uv֑b!ٕȂ	aH&9ÏW)½{/
    Ic$?+%()y.AI.ɓd&`hЛl8ȩ)6ٓ@9B.[,ll2ih'ِy֔)̔]9G34V)j*\=2(؜h8	?1oϩ9Y5$(~i&j&tIpF/ǝ	[YoQq66I?<rsL9)\;hyiA<r"#rZv9֠793t{nf̛:`I*ũ;Ⱥ6VA)�֩rkȒSS&
    %p	p)il_	,`S|WßR;)rQrds:G6'tYltsϲhm)չ	6Mh1&
    ))yv4+/m)Җ+/
    ҼŤ1m.mux
    CǬa*Ԓ+]{|kq\[JL:Г;AzMGIKݺR{Ĩs:ՏzOxHtdJXHکbK738X7+W^MRII񇬴ttV+dAY*{gT?9[ږ7KEڱ''+N{V-m+DK֘ʰ'Y:Ge(۟״]IPj3ET(-x5S\ӗEzh
    {%<+L> ;TԍmILۅqۋVW+{ֱvmkTXn+jˉ
    ݋HƧY
    g
    E~{O[޴Z!;Zط帶([=]ZBNnR]~S^P]$W寛٠kmog sNunwy{}.Nn臎艮.N-.Nn꧎ꩮ.Nn뷎빮nNnǎɮ.Nn׎ٮ.Nn.Nn/Oo	
    /Oo!/#O%o')+-/1/3O5o79;=?A/COEoGIK�;�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000153�00000000000�011564� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/manual/images/chapters/jmxConfigurator/jconsole15_jetty.gif����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/manual/images/chapters/jmxConfigurator/jconsole15_jet0000644�0001750�0001750�00000023104�11377016712�033555� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a,���161U�=U&�%tYh"��K	:�\�F�l�C1�:8J�DL(�TO|c9�>BcCa`\:�Z�Sڲ� M$|bAj�&dDjL�My;floRU2r*S4�[2�)�7�`P%|qiA
    �F"�Kᚽ�\	.gH,�=Dέ;1R�6}hCw\TfG0Q-�U_>jc�H�T�`�U�X�e+�Se�Xj�M�\r�`=
    �X�Q?n�Y�[�Xl33f�Z�Pff]�^e�gt:�P�Q�_�Zߙ�s�^�}Ϊc�L�K1�G׿z`񁈿j[�Z���AR1�CLB]�>GY�!I�k	?c�mRI
    GNۀT���UYX㵺Vz333!�����,����,��	0aWPAbb3jȱǏ Cяɓ(S\ɲ˗0cd驦͛8sɳϟ@GYf۴	R`U$Hj/+
    1]	6-VI8]۷pʝKݻxe˷߿Lpa+^x.Ig#<9
    VlPEkX{RZװc˞M۸sͻN\ufǓ˼41(P@a-ՊV\i@
    ["}][_Ͼ˟O�(h&F
    x[-*	
    2aLЂEDP5PM-,ւ	q'3nac}<@)DiH&L6P"y9'*\%|"KB5c0�`›,vH+xD|矀*蠄j衂V袌6裐F*餔Vj饘f馘[dAXŪ^��+Y%v݉]P䩖+k&6F+Vk^e �5+#@D$�p>#.n�,l&7G,igw "C
    kPpB4@7�^UJBo7PG-TWm"g\w,Jɲ	&h11
    (pAԤL>-L
    	aT
    D*7GՔWny^g晏yUZ<vnǽr	)xІ?c?{,uHkхq*o'7<|#+El6<.;@ߞDP</oӇۀ?ֽKc ůpk<!r !	G<,!B8̡w<^a@\,Y7,pJh  8h!4w	.J�G
    x,/\YpF7ү8V@ۣIPb6eK@%A6O	A&c,c31,x?xU򕱤˂e!ImBU&7qP.d%)aU
    [Ca9lUW@%l<0IkG
    B(
    @{,cAIO �<!ЃsgB1ъ"'NqQt\4G!J`Ǡq
     0 (?R@
    PJԢHMRJC`L)l@.D3Ӽdr%H`#)鋲<g1ΙNb*Ӱt"3
    1pZ׻V@]
    p ne\1BXzk\׾&v`]xvDHv+၇`>${eJJ	J,Mrܥ幛5hv]@@	LJM<LчbDJ:˔+2J#\1v7,f$|닒뗿)_@'%knlX%e01\W<8>Lv@"
    =+%.pj&aKYӺ/C*PA|Yn'8Y5A)Q,\~~E,h:qN4%�M77ъsg	OX4h>?ZРGMRNWVհgMXypC	=q \.8 et` @0H�-fjcmRž6
    RܳD!�|6[⊛w_q2ewm i.
    s#\V .Tq	Fm>KSGN(OW.?\�5,Y\gՄa@-t`F
    fU/f(+!/`v…ȂʸY
    !kE~v-Nw;8|׿jggvJvm~򇷻nJG@Q\s}_<%x˻gOϽw+
    iA :CEqq@
    �:: t�LA�F%U, PG*3NqЃ@wf EPq�j%t020Ɛ7e0
    X`uVWׁȀ/t+thu$.%}$.8"-XFxHJhuЄNPR8TXVxXRx�xp$)P.sH@�Nt0}`}-}~e
    >�y	q~`:~ 
    W\GPz~ڐ�`藊؈_H	q@(8X�w؊q[[0fb_(Hؘڸ؍8Xx蘎긎옎NxA0C)P| l2dmMؐ9iBD.t
    Y@ّ "؄�$0I4s�nЏslvmT|H<PB9DYFyHJJ)Q`�_ P#YVyXX8@``Id	0Y4	�G�~!J7:ɇv	zz: ȗ9)(	p\٘YYN9t0mi	[0@>HuyَٚYyٛ؄wR.).p.X}Tu%":r#Wztڹ	{Z9S؝y9{W 	|FE60E6qɖvU@j*#6҃H
    ڠ:ZzRѡ ":$Z&z(*00#p�0
    /# �^8
    ^TƟp�UP@*B:DAJHJLڤNPB
    TZVzXZ\ڥ^`b:dZfzUlH�P�Zpr:tZvzxz|ڧ~:tp�Жlꦅڨ:ZZک:mZڪzZz*:JzȚ*ʨڧ:zjjƚmɭ蚮
    Zݺ::溧rگ�Z[{
    {۰;;ZrP۱[r#;%k(+t02;4[6!+'k')+{-7{H8Z@+O:wJ{X!:\_+z�j,V;Ykk{rk;Pu˧;sk{};a+JEl۶47|{
    z{;+Jsj{1K0K/kkkt+}뺭K_kkQ;+dDF[{+˶K[Kz˽wK۽k++;+;p3YAKܾu[L+:qZkћۿr:(,\&('<'lNJk ?2\ėK&\	<+P27*fo?LlQiV|13LolSX|:͛k ̿BDLu3|6t\"zŽ}\\WL<\^ʮ<ʰZʷ*˧,ʳYʮʰܵJ˵l˝L˽ˮ*̱<Z̪\Y̭*͹j\|<||.�=]}
    bϷ<=]}m|!=$]&}(@02=4]6}8:<4/\FJLNP}ECEY\-SUѺ"՗j]BϬqt
    l-pM%|hַȄ=m -e=#~}ؓ-٠܋zrzύM{}w"{\ڕ=ذ]ol~]óqTVXڶ竽	lМ=٭ۧύʽ--
    qJ#PĭׁͺMٕM=}ܜmύښ]ݷ
    `㭼[ڑ
    mtލl,ەmɮk[<}" ^N
    .=(
    Mޣ|ͷګ]^&=䈬ބ
    B)}57.D3^
    VޒKR^>]f_`݋M^]Lu=>Qnor^t^纪€meֻ>ݰ>.V!>꡾~ꨞꪾ>^~~6|n긾>^~Ȟ.>e^~؞Ny
    s֞ N۾.NɎ
    o?^~.�On>.!*_21O54o/00@3?6'?/M|HETGoOU_e=OSc?gi_Ns^/^/x.yJo-W?Y
    .tO{A/?~opO?ܽ/nnnOO]oM5_/ʿ^/oP>_~8Ԟ:_O__ߟE7 
    <x0aC*(B5nc}It82(eCČozWQÆ:HЊAZ)S7R*NFEZ+ƫW*(Yiy$93ʖ/c5YQA.4kv];"5p@E\61⪅>f8TÑ;bk
    rT
    !GO%K0kӴ	7೭}'^qL9Gmkߎow]/7-R=.ǧ_}Ѧ^np@4@TpAtA#pB
    +B3As?ޓn7K4DSTqE[tEcqFkjmG rH"4rF;sˮ#rJ*p&yK0sL2M˙Tbrz4M8sNєI.N>0|kPDUFAO“M\tRJ+Q-4RK;>1	I7AUuUVQS	VkVF;XW`=U^O5UaUVbef[ziR]stXhv\rCVoe
    rujK%qߵ^*UI_z6,ݒЁba#&Q`u}Xb3Q4I~5b}dKeVۖc7k{inq9Z+&⟋6hVzYW^i`jm檳njZUk}VՖNNzn;ϩͽ!EocW|w.xqȧlm#<_l/||Cwti4[q]}Eػv3OismwkOxQ8q~棗u+>3MqO='}~~g|Ov`X@�6Gw@~)9^pq`8}yVB
    ),
    Y5Pk1ahXCKCA(3#elÍD1s"٤ػUъ
    igWtC.zqY<c6zk_o6QigyEя9N7Ȣ񑍈Ld!=FёXd$?o=򉖼4%HNq5c(cJ*OJ:ѕ.eg)2Tn,˥w^z'1bᆔ<f�V6әT4c)M\>Z&ɴ)kvs2S)N%sD7%kڲR'89O{>ei@UPҳLhw=Mc9рVt(4jOv4[3.EϏԗ'IRi0iJ_JSeKCO}SUC%jQzT&UKejSTFUS(dXC[jWUc%kBڜtU[;;'zWU{k_WV%la
    {X&VeWs<i&,{YfVlg=YІV%miM{ZԦVeckbKI?fAVmo}[W%nq{\AU.r\FWkUG[v&dgۮU%oy{^WM^Wo}{_"	�"嶅 p
    |`'Xfp`GX
    {1agXp_%F	wݪ9z$-!\bX3qm|cX;+YC&r<c'$6=	W0bc|e,g?e0[90|#!f8Yss|g<Y{g@ZЃ&t<שY'qrϺŬ~w",}iLgZӛt=iPZԣ&\jTZիfu7:yxTqmo{\Z׻u}k`[&vl.[fv^úEeή[?Hϖ8Dmp[&w}nt[67nx[󦷸"jQ#%#'x
    ~p'\gxpG).qg\x~ĻvIU@\+gy]r\3ym~s\;y}s(tz]YUKgzӝtG]Sz_g][z׽u]9٦]kg{v]s{~w]{{wŢc
    x'^g|>Dz-yg^g&ӓjg)Gz'Gzq$Gt}}{_'~}_g-#ӧ~}g_~|_}1Bg~_?#__7ПG@@,@<@L@\G@>@Q@	@
    @@
    |@=wهDAA,A<ALA\D@>AQxAL|sAAAA B!B",A@>#AQHB&%L$BB+-D()}hB2,C3B$L'<C2\"et:C;tA;ԊDACey"
    @`~XDHFD|@QxIHDF4dADJ'ӊ3ESdUCTVE?Ul?XlWY\ESEaŸʧӊSFPƼh~hthFkFf??\FjFq>j$q#`1ӽӊ߃EGy~={{GCyǂ<ޫ}GQc(
    9H~+HHBƽȏȍIHRG`aGtII�ɞ~�ʛɟ$ʠɟɤIIkJF<Jʠ\JDʠID&RK,KK@~ d˵l˴˷\K˺l˳KD>KQ˸TKKL˿KJ\	K)ȌLɜԊRϤLӔL;MMLόMlMLTd[E˧LMNN,N<NLL@>MQhN<lNݴ0<(hN5+6QNaNbZΙLO\OlO|OOOOO$V1OzP-P=PMP]PkP@		P@CJ'LPPP
    QQ-QL@>MQ]QOVМQQQQQQ 
    R!Q]'KHR%]R&mR'}R(R)RK@>*R,R*-RU9҈+10$;34]ӌiS7ӑޤwS<ES;m=-=v	8TDMT:XTFmTG}THTITJTKTLTMTNTOTP
    UQUReH&ryhhUW}UYU[U\U]YU`
    VaU_-V_]5X
    VeUd}VhVamViVkVjVm1H&AWqWr-Ws=WtEXWvmWwut}vWy]tzW}5zWvWyWX-X=sW]X}e)8XXX!XXXXX
    YY-Y=YMّ
    �;������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/manual/images/chapters/jmxConfigurator/mx4j_jetty.gif0000644�0001750�0001750�00000064535�11377016712�033613� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a���Zjdee		kWcKP%�K➳ʹiLe2n�Z(Q>}DjCɌhڷCy�j
    1�X欨..0U�=e먊qU$㾾<T(�H{�U-�S\ѧb6q@Үa"123w]&]"k1ٮ㲳CS�ρyakS <sƿ�;d웾B�Qۼ�';l&`�&VZ񚚙q2KKKL
    [
    fxx|?��U�7W�UO�`�TUʻҽ+Y�e�`:&�1㮮hm9���,������	HpV%pBo<	41�hȱǏ CIɓ(S\ɲ˗0cʜI͛8s9ϟ@>)HT +Np䥑(QKǢիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻd=,�=<È+^̸ǐ#KL˘3k̹ϠCMӕd @l۸sͻNȓ+_μУKNhν�%:زg~}˟OϿ�(h&6@~@QylɖaF<($h(,"L
    p23¦alZP@)DiH&L6PF)TViXf\vd(xV^  hO?>Λp)tix|矀*蠄j(8$袌6裐F*餔Vj饘f馜v駠&Ѩb^CScf M2
    BD@뮼+k&,6;*(<1(H�	$�k覫+:,~PLDPm#@qO6G,Wlg3ae
    m(#2r2@*Hl8<`^7DD'>|+%0ko:oqϜy??@?yd
    T[=ND*Y'Qr?n',7㳠ꍾcFJO2@
    %?8&>?w-9{yO4OrάO7MD(~N.馃zx3_@M\Oxή/߼cA򊧯qГW06'H/Op5޴6
    3^,407!S4
    {r2@X3W�-X@?f7mLr8f=8̡%#QA"0fQG2@'5<kH )
    yb4@m\	xE6̎eLc(QkpB)( fƁь4?wER	$HE7R w#A4y3qm_[ψGtҎy#&OiK[GH̥.w^0IbL2L[DL_'S+X!#^C,p
    1=avgI8ZDF	vԈ@0{;C6`v(6SXHΊ@-xxURy6'A6O,Mh@Yt
    
    h/JjGԦ:PTLO#x6Q`
    [bD L`�dAa)8mC_`Q1�׼5�Zi(h)?VTOz_z!l#
    T�ME*WHZۚBzV#<*KY32ךHfRh?0NӖ΍.t+RͮRz#	*�@Cmت 9˵3ȚT" kQJX905 #k%JL`
    Q&-_
    QgF	x 
    }A8Ѐa
    XkhO,F;p=
    cİ&;PL*[Xβ.{`3'STDVӋ*KAms9J	@
    `�ߠ9_{52bv ݥDzv(]Jrlg1uh44ӟ64gBMӿc9MVzDlHcЎMj[Fn{2a1R`G'聊zb-1A-bmkgGk	>
    0z!D!ps]{Zwa�gWg+E#-a%£DJGv\{h[F/95.MC*l[XϺַ{`N}6sNm{1ysg
    Xs6lQ1h\܀MS#Fa(g^(xTԗנ
    yuzw;7>5PQG|(.*R1T;=7GE9y9o`{OOA)N/o 
     0
    pLQ=
    &�(� c�p>MЀ2=0
     �S~�ځ
    S가-(c0H0+=S �IXi;Q
    MTKx#0Q]^؃/Q(�K@ڱVHHD؆npr8tXvxxz|؇~ޱXxxCj'_'�^�|	 	Aܡݱ	{P_DځNHہЊA聺؋ځxȘʸ،phvሎ±7w
    8Xx!긎؎xc �.9Yy
    Ɏcfp
    H�脼ّ $Y&y(*,ْ.084Y6y8:<ٓ>@B9DYF9X&vvvVyXZ\u`b9dYfyhjlٖnpimgf0P{8o80Yy٘9Yyٙ9Yٚ隲9Yyٛ9Yșʹٜ9YyؙڹٝމAsL0Py虞깞ٞɞP;i鹟i99z
    Р:7pzz z$*(*$z,ڢ-�ZP6z8:<7:BDZ HIJJڤNP'0P:Vz'WT*X`0aZf:�jlڦnpr:r9xz|ɟ
    �)yJ٨:Zjک7Т*(
    4ڣzDCjEHʤzT:ZVgjpzjtvJ}zؚںZ*z�婠Zꚟڮj
    ڠZ"
    *2zJڢ@j*J	[ګY**]۬_JˬڱuCiZ&{٭ުj;z:z
    :k+ʯ$:L+jGz۰VKZ۵+
    f{[(l˶*-zڨvzk;۷ڳ*K&jꯥGM5zRU{
    Z\{Xda{!;!0lmڭpZv+Jx
    J[J{{;*Z@k?Yk`ʹK_iKະ˧k牿'KixZ[ẻ{;|k�;<˼J3Zҋ<;Q뤗;7<\:Rڥ륟+˾HWڦ
    N}:lVYܞ6;*˨*8+<z
    
    ‚;Z&l(.l5*0<í:<	Kۤê۫L_ZHM�KĠO\li\y[+[LŴ[˼\Xܻ,JiLonL ro{$<{}ܸ/-2lȬ=ȌȋSL盵Z`ɞiʠФlŭW,lT}ѯ=˷|aL0\|0\:͔?
    ۜ7"|Ή,,S-=J̽]OZ@쵙ğk
    O,Xʰ\˲,Ѹ"
    q}w׮Ye0-2]ӾDD@͛EMH
    x̩JRK\8
    VX9|⻹+РƊ
    =}nmp-؄yw]=]'9Ɗ-؏/-<#<˛7PLՅ<<Zۻ][}
    [{MjlM
    ϝZl|-ݺ]Ѝ}9:̊5MݠݮtH=L9p9 lCKz_>_ଊP;:ڤKj>:!>礻ez⥜l˱,˯|}ŁM3^m̿㍞)*ِ}̒ӖIn�Kn,ٝ=tLo|kY
    #acNj696[- N~#޾xA3	w*~<-8K*m>Gڠ.jǷn<+ik~o^]͞XCN*%kt;Jl**TN^󰚤:RˮLo;՞T_~=>$&閽b0o�>!J-;9;8uOQVZjLNPR/V;qk]_a/N2 jj*;J>ƞ|៻_^{\l!zZڜ2
    F`՛U-Oݣ/R_[[ēlW:?_k
    P`A�
    DaC!N4E5B,G!C#YdKLK1eΌiK9uOA%Z
    7r,M4iЧ9NZ*wYb1Ǵj!kXiM+íڲlm]2@j_}&Lfx03P�0e'&hΌyΡE&ÉӘOFݚꅱeϖXň#6mwqgys"Cz(@Nn'r%:ŏ'_yկg{ϧ_}�0?nTpAtA#pB
    +B3pC;CCqDK@RTqŜzEbqF
    hj
    )GʬˬK.-Zɻr2ʹ2²r1+1˾r-:#46mnsN:-ӷl36<'M8݈tІ3Q\qQF[jѠ`qRJ')vG ;Tȩ*#JwKrUWɲrƶ.s50$33CLa4XTsmPY;3ZSO(PAsnЏ\Ui
    \%_Ɨ|t&s_x`=uJa;MȬ"uTΰa+!)حF6d,d:L3cyfMXsY4J(3BzhUzimi04jZݕu4_7;7z_¨_n`6t㭐ȍ3xceUO.eSkeXwdim^sg;og:Ať6t-T
    c}iEr�s}%ypņ0g|@W᫷z~|{nJ<I;qE>oy%r.aNUn9&t!EP*:okvGjNwv~BW@P3̇
    е+P;a}CIB> 1);ߏ1E+h1c!Sw.Yxƙi
    d@7ё2c/.i t:}"aJWdC,<^>E/d%"Q^IMbR1gES&!	k<m1q#3F-myK\ҖZ13QQx̜g:q&A@fSiHiC$F!#i#z[NxS|';gx{"$ɹ=ઈ3B(�:W~L3YҖ<f4
    G)j!X,X089@A+eiK]RT3iMmzST;iO}SUC%Ni+stEST>E}peU[]|OZ{3b@M@	*RҊgh
    :�i-}DxcEa
    :!jG!jQ!"11fv]a;Xj
    &"miM{ZԦV=Ѻbr_Bmm{+\Mm`غ"mqkqd
    a,ҋꧪBTnBv4Ge»�N?B{@	r}ci_Z!Xcganvep.@ѲVp-|a@I+Y-Vļ/|�8bxVW$1B	,B(cQJL.Ӏ*1G(C`^-Kcȣxd?k_ ~`�XK 11(\!@0h1khB t-}iLgA|!nģ&}BNaV:Mqp{n
    :Jt:`	0D:aF0Ț zJAQ]~Y./`DP	hyÔ!E ^HbTdw%Xhv!ИpϺя&5}qg\ݰYjB%'*YU[D
    a"L22!F]Lֶt!iOOir ldnqo1_yP2I`Բ�ͪ!
    W� �x1C
    ($ЇFt.\8%qg^4]{X7?P軆`S?[zj`{_;yXLhC>,B|`Of͋Zm�&c6>nnc{0޸22]a;G?p 8?gxBcE<8ɣCg8λ@@
    NsY֫K`A㇮+Ac3`*7ArW >#-S	?˄L .5yhVm3;Pc`;ꑇ%i40PPx!�8�@9`�}C
    cL8	tADqDpDHII@LDL;Uҵ$EQlpplQ\P$tP\E<EU\EsE]EWP%_E_>9x	!$DBN�Fg|_2Flt-7p78g_C2HG?5e07t^XC,�9}ԇ}xjOPC3D+DTD4F<IHlhȎDD<I:H+E{	IR,|ȉ|x'ɘ1V$ES	7U\EA+$��\>�`lk?pJjF2 n.B`Grdzët<PCwt�ylzLfG 8<gHHc4D8H@4	HȒTL̏LDI<D\�2Ix"2耜}6iM2$pIY4EICNJ	Nc3K\((Nh.q;˳܀,G_
    UGe`v5ϻjKc?lGO|�P
    ixf(Ѓ3,VxVxЄ{O(FɑHILHѐQD5Q<,MlQL]tMMiMI߼A1M!R,Ri$AN|N*V:fR_$,a0
    o.LL	hOztGc�):U<eS<>-2؇}X<h��
    D%C[M4r8`	X�@ԈDeUMDRLUP|QXՎ[U
     \U1Q]5]ʇ`R_�#=R2[7buJHN+3Fl205s5Wȃ1-_TO4Mt<UzmGS9K;e</>
    ?݇*@ EdAp;,wTL]1TMWԏMRISX%͎TՔU}CXe,c"/#'ih,FfhlFm-࡞*�@`W<3.0,xW4
    x=<X/5�t]~<-lx'2>3\`i !pBc܊KOuNِMUQ]YTSHTWYm]]	Uڅ[5Q1]e]!51]z*`!=Zgm^饌%RN�łk!X�
    __Z3i(nZm8<[d0
    [iB(�EeSiXA?1AVxx`1øS�`�cHp �.`G\,V0�-8a!=NU5Ya-]\-bY})[݂_Mu⑋/-w�."b1\_pa^g݅^fp$u_<^7P_5p<v_H8d5@d`��c1�.`i0~5t(e_`fW`5*`u4e�(1 a�	xP]f��am-f]Q.PUmU5]]ff&b#fEbURV=^?b.b|T` q@cM5>ŌncJN9|ecc/&Es}FP_`ip~+p9p`X^	[1FyT&ch�jXCSa}AcXL<kfFIm[byf`-=19V\=j.3[{6~&_6CA_6C}kCsedH^)hS6~PP&Q	>eXVW.�@1`%4A�Vf j̢渣NjĥNE^w~4,I.N"lPړnU{g=%H�N9XLtE}o9f�oUG^J>x�()V:˺쒆Rx�D-e~V8~Pm^qG>F1u6N#@mgnnr"c^XcUh_)c!(o$x/]PXPDU�hl5?]RNwtQ:I[bG5pXNc([@t` NqnqE_C~f@ߢEQb'A#0.P-Fߣ$xxXuVgnV_�XuZu[u\1uC'[u`7s4;CCv`UOv˶MVκKex\`m7= �<*-w'/�hoDgtwwMstNc�iTjn6O+@_qQ/xixS/RLUZ\xx^dg~(7xBv`gufz6ximumt/*yyyyyD)wHO.w,5-"ozzG_]hxYxxzxeuf'�	{;e_d{SpyCoyoy؆{{{{{ouv?|O|_|o|o|˿||͗|Y|Y`ͷ|(}?}?wӏ}|}|}}_Q6�G_+ɤ2X2nz~"xzw~? ddrg_s1�{{1,h ƒ\Á@h"ƌ7r숱>C,i$JV
    2$˔$]diӤM.b	&P>UG(ҝ+2mRRz)rmj+|"n˖+jvˈUҭk	/.l0Ċh1Ȓw2˘7s&`0@9npӪWVF=Үmm#eǦ ?e	t%΢59ύ>U:wbxcKtM˷X7ܷ|
    ^?fـIYfM
    ~j=Yi%akjxki$E8"鶐o)KDכq%r/dth]HјA괝TWe4LdQD03D؆a%]z%a!lyaDEq	ќp䐝k	|\H'pZ衄&Z(LӚBJ:)A"r)S"Bi):*<z*DcΚgBjKs+
    ;kpJ+*,J;-Z{-j-z->喋.n;/{///*3|0	+0
    ;0K<1[|1k1_0<2%|)21<35|393=3A=wwI+4M;4QK=5U[}5Yk5]{5a=6e}6iY6q=7u}7y7}7>8~8T8;8K>9[~9晿ڝ{9衋>:饛⧫:뭻:˞~;{K?<<+<;<K?=[=k={=O}ST5>髿>>??k_??�(T! 2| gD 3
    ^p C(&L&.|!c(p!sp54{(!Fw%2N|bD(RV"xC,r^"A0f<c4n|9ұv4=y# )#q<$"]}0|$$#)IR$&3Mr$(C)Q<%*SU"_)YҲ%.s]򲗾e)c	a<&2e23G3)iRּ&6ygj&8)q~<':өu4;)yҳ%<}g>)Ё=f@Ѕ2dB*щR0LhԢ(HɉQFrt%-#QҎ.eiJ[
    FT$)']jI!)Pʑԧ:L!SLɥRRPխrTuRmTJNeYiӫuj%V*׹u^M*Xױ8eiYҢUnuXV/`׺R%iRk_ОbU)VQSvT7hcZ0F~}o_ذEn\uŝm+]vV
    iW\Вڍmw=v;mRaX״Q%h~=ö{+5
    fni28>s-|
    s	)y_W
    a�_fqc,cf~&m+rULbW8q*`V"18rd(ױ툫lװ+e폕,1גɹ$'իJ5n楙o4yu~3<8==,Aτ>4lD3^#-Bzl4k~U;>miǮҙ>eX.دAJSsU5Y]?Ʉ,}!YRs"&*{岭j̪SIu
    fT.[]+go6_aK\V$6)67I[}oo!7A:o>%l=\NG^5Ń<q3oCԅz|S>pcX9xf_9"BIr3σ.de_Mot
    9+a/2
    g-Su;Q?D+LZV1_q2r~%.?<YQ%<-
    ST*<C/zK>3?=3XԳ_/}=s~=# S>k"/;1??{h/\/??� &.]\B1 FN V8 Yn vj ~ 		  
      d 
    ֠
    ޠ !!&.!>!F҅N^!`f!v~!B`!㭡!!֡6ޡ!M!  ! U#6#>"$F$N"%V%RT&n"'v'~"((")b&"**)+b)","-z,","."""N%0#1^."2&#'2"36#4j3F#5N#5v5^c("T#88b?h9b6#):c95c<#<#76.8#?<<;
    d2#A"=A=c#DF$9B&$EB^$6ZF"GdFjcC7D$JCHvG$F~KcLJ"cMFH`>cJ$?L"dP~"PRdQjQ$LeNMIVc$%D&PRƤUdV^%V"eW
    dS:N~$R#TVz&%4e;?0%Xb]XS$#R%GZ%`&ae`6aK-&d"D"Gube9Mfe}if4V&'&*gn(>(hn"k:#gekn$m&,2%_I%$*`&cJbfp'b
    qd"izf]jne:V'CƦeb't%gfwg@RlNmyz,r'oCNa2b.gd_6qJ`s~yuk
    htRk')&2ht2({~bi"(f&WR&xz(h^fhjh6eh*脒n'e0'`~&f%qq$(k^胞(heJ'胒斂"n("vhh)nV)))~&"F)f$ލ^⑦#|g>wZ(xr.h~izr))jn*B'iꩶ*w奮jΩL)j*$jr2|&k~V*:sB$B)jh~釶hjbz'*驒k+^+)Vkyrkkjf
    a"icF*c>2r,~Z"*ҩzbjv*J찺ǂ,iŊʞgbj*V,Zl%FlΫҪuѾb'V,Ѳbiޫ뀆zӆlFm2bFϮ-$FΪkmxkDzhrl֪)֭m̊֫4li܂(ʍڲ-dX@.+We=.*;vn|n训e"^L®o#.KoK*o/.J%ޥVoA[bn.NoOroE*/.Xj/h~/>o6o>nGI/W�wij/7?0GO0WO^o0w0/0
    
    0c0
    װ
    0Cd001'?"/?1GopO_1gco1wc%:ZW11"111Fcqb-㱢
    'K˱ 2!/+l&2J.1$O2%!籲g"%Geqn2&(s2'#"+z2)#W2,Dz,qjr((1rqaq$/13)22+3/24G_r/226+'2.s6r*o0#734:o1556;f/3>cs8?0ǧ9:@O152+w83?)8D3D4Fg4.sD?Ds1E4ED3I?9kK4sB׳.AE33##4K4@J14Qust$31>4D7#2:wR?+QgV0R530qMt}9_v375?7>4/3Vǵ\;00\5^5u
    ߵ^5`q	`
    u`6b1_'6c7c3b?dO6^G6e_6fôeg6gw:?h6ii6jj6kk6lǶl6m׶m6nn6oo6ppwm6q7r'r/7s7s?7tGtO7uqW7vgvo7www7xw_x6GAyvzzv{7|Ƿ|7}7yv}){~?vv7'/87iK!x7vv38xr;how?xS88xvUphxxvz9j9Ocx'G8{Gyx/ysCyO㷗׹6kSy_Ciӹ73S:Ko:Ϸ/o9Cgy8:::z:w:s纫+pgx:9zz9ۺwyzm{wg;㺪[{S;O#;㻮?:y;<'|8U8ۻc˺;:K;k|+<ʧʟ[<[;c:c|C|s<{̳3:<'}|gǼ:K#z{y<O7:OzK:=+=۷=<{o<zS}kڋgy=|c;/>໽?3TC>gw#|o>v>뷾볶>׾>Ǿ>K<C2"?)*)2(:[B&wbbs[?dfz?&?2v"s?4J#?94xaB-tCFh"D		dbȁ#b܈ɅTRdRK2g>y˜wʂA[my͝	jT&1"Ueʤ)j]V!:L	b?h˲mVmVe9[\k/ϘuP-lAMV~J*VGع3zT+$_#K.tI]^tv68Ѹ?svʑǾَ~[gճ}φdS6@Խ?/}ϳ|2؃O?tZD=�lp@
    +/*쪨4
    .=;˻I,1ÊFV܎Tl;ҲmHw1FtQ5Q!i'q4ѻ'3IJ`blT,1@3dP6}B	3,P?3S|N
    K<;0*5F2I(6CO4!s<tE몓q$9PcqUH\ӊG5rJ;uFXi|uGQ_4$>2m15i	3BVȐAD*DF$WeRR)<Uqw3ek]Mtad]{,y##Ѽ}q EbId\dn5ﴓM<ێv[e=&Wpd̝
    Eܒ4TQNT5.;UY+iaݴh'EJז}XZhYq%up(
    ]opٿ'?n
    e\o5B	[Ovg!k.E]/(H+3rAa}*w6GQ&
    ?_襟ꭇ^\}cc
    ڽw9_域ߟ�	X@	:g>>)XA^9@f&*IXB)T
    Ut=1iXC9>E93(D"ITyB|@| XERъYȾ&:}XXьiTWE>'DEQxG>bhG)ޑ}tc)0$ 
    	HIr$$GEQ?$IYJSbЍ(Bc+iZ2"KVfr+sIYf҈%1dƲT.OYMk^\e.[
    3T3KKsTg9oћd$'ytγ'6OOp=GyVFR	PjbR|(:Z;@l(>
    :ˍ!HG5J*Onu<;Yϔό)LIPQ>IRu&}B?JQtrĩGeҌ3MզjU>ZVnQRUkWԇsojNJ˯ԩv^mץ:U<Y	[X$\&TJS\f5Qt&cLӭycZS66tͬaI["1EI^L4[xEX^նլ(zU-\ޘ%չѕnRN׆vEvwx{P]Sz^|;T~_o	\`	V>`0d
    A2
    o!p##	6[\R6hLSB@g4F
    l&n{.I&LJPCd2{XX1lY[r+e-,YB沗Ŭf8ϙb~3f6frg<Yɉ\̠qIӉ&ۤ)'51b grVV,g$3c
    Zׁ5e0#k`&vg
    fS?'듓8paq.+MC,~\Ȧ]3Sݪ_+rvAή7oA7kLwct,1kxmncR0n]o&iNs"|ȎWf89^tr.>nkO-o$WO~3^w>khWxhDnk;ltq-ܲ"7Qe o۶<C|@S&Lt
    zt^z|t_]K–i_{y{gI^='~K\>ч~{(}_}ߟi~?ռ(^~_SwgXOzPK�
    �Hkʚ�q(UI˵nj*Bk*01$*O+hi	|kK^/˪hS{PVPwJ[ajɊP�}
    pXЯV+*~4pKp"	0~p@+(С@
    PG
    0k	i0P*!j-ГrMі0q&6QgC1dg0IS4C0 i}5opHNokӑbr,Qr&q!F"r!"BPڣr!
    B K,!$<$YXl0Vl!6ެ.,;
    !,N$fm{$1.
    po0-[&O"o2*/`?4
    #L"m$Qr md2..mGN&q<FTFe6!
    qN�&rn-2�n&M2q4EO)./Vg"Ժ2@R3of-sS|3C9,6c/n./mFs4Ef9Z:os,s-\n.լ(?2(<r&.93 4
    ds)'"3&SL2w3>�L$BW"J7,:C?DBGT|0L4[rwE[E_FcTFgFkFoGsTGwG{GHTHHT^HTIIIJTJJJI{FKLTLǔLLtJsBF4vKa4NctNftKTOOP5HT*dFϔP"MQEUPwQ+R]MO[4S4GtS#TCUTGP)5G!R%U=dUIUFSUE=)huOO4WkNyVw5NW4WGV+WWXYV]UZJPuRM)PZ'[5\u\2ĕ\uQaQ]͕]U^[F^^euVOW`U``u`YVV
    6Oa%v`c36I^9^d5dQ;Vd5^ەcUMdKdC6ecf_Vdmve5PovfGVfR5W+WY'h`VbUb#ViVjUa-ViuVkVGQgeegfSZo[e?]iVeMVl߶fm}6VTg\_iWjpivstqqqjVr'QnVn{lskvomsgVn7wlvtrEWs׶o_`6`vv5awe\pYYvp7rWxW]rlO^y6zu_E7mK^nWexUy?_M{S7kS}WMUHWRݷI6qCWu~O[T~~aDX8>7#8#kBCr$%XOTt&-  4).8;>)R82|mP6<x(%/LCL؄UB=o"c!OK"0pQ%uS&{
    $݌&M8􄿎(&xX&
    M3e..4(MAO*!@)$%JӏŊ2ԆͲ22xӅmN')3.m8/$
    /-j6$pY6ómR}ؙ_N6'RKvM=.aNK5mAWL
    poӮ.<mܰ/r;9ӎ{N*Y79-8s.}z2#g';&f:9C9W3n:\9Ă'.m'yҥyZh͚s+vs?e?$?A25(
    p/ZA_rul:Bq'K?M.ρڮu-;ګlE۰G۱vt}ijE#taoC5_tWN1[Gw26QX{q_Ih`NkG]ERUk5V6[7g6FOGy۶4vet}3g;X?UqwSew';]6owf;LaFw5wkwwy5aXiw߻v{hre7
    V'6pp/p5yWPz7[u^zyyEQdՕg4{QĵfV_ATo^WW!<rTȉ3Ux+akw{qCʉ7kbVÃ;t=vzזd-r??|lg{;c;f]kۼρvwhhm7#i5[w|a!̱їˣсwp)jj!wӷz9^{OVzš7tK\C[o;s6s̋bQ=#}ɋ׶\pUb3c[̻ۛ]*a|j}q]|tͭlM{}ރQtLuy2y7}Wҧxgiwu-^ȕ6==ᅕ5qw9ӳ[x۱_uc~owd5Ľ{cga=\qC>}T՝I]S1V~7v;o;^Ǟ3t44^G8E4C8(0CMS411鋏m8!ދ}S(.stRjҍo3Ϻ:+	9,%m*nO=)9pA
    mm7!Δn!o$YfsZM9:吙[ y-,I19<y,[?,h …:|1ĉ+Z1ƍ;z`HF\82H!Mdy$K*Ol'J6gT2̜<51ҥkiԩT^dJU	z=5!؃bU,´ϒ[6\tڽ7޽u>-s߿~,a5#U8P+_Rf,6G:,Ԫ׮5Z!C`SȚ6m˼{
    ϒ>.J(0GvnN藇#M<Mw,~4gs͜zJ+ݥ]{>n:E'-oVMՖi`
    .`>!MHaZ6AB UHb&b*b.c2Hc6ވc:c>@IdFdJ.dN>	%BMV^Ib/je^~	&9#K-Ni"*".66dJe`Ti睂Rye3(=Y)^rg="mrz%Ui}6J㬖⭰s&biZ	*l[gugVImK-6[l^|;-N2kچ..^>(N0D.l2Lf'|0O<;gSo![LVe:`lx8[m7w3lkE;}G-H)Ip|(bWűm-w}vht=]%s=25Bn:gJs8ۼX5y;N낃vd
    {ޅͲ7+/8O$)N=OC:ksIlұW}Lo9߯u+myg.y3)p
    ^fR<殠NZ\e5DZs+!F}юs[a
    IŧPY
    VЇR˂@Lkb;w
    \<щ
    \&)$ϊ^|æ%kSw7D`|Rc;E<Q@
    r,!D*r=ElHir'?	PjWf̤(OTrl(,܅=-sK䲖e';`r?!e,2a
    nb,3)MisNsS9M&3q6'Ll*4;syOsꓛt05b8elȆ:Nd5ji<x¦63#
    %7AKn–x4,hI/zQ	gl"ѮT'xdğ:iOWSpu9/	N
    %3ɐuӟN?M+)4홋lZQt!K5:&piXYkY׆浪*
    U99Nc3*c+"~uN2c&s!eH
    V4LmPΕwUXڴ6ummB<}k*-+B57IvR\Df;ejb,7u3Ш5b9mo3Wr5]kcVВUrxY5omY6A~	<Fԕ.�׺Pi	v
    ӓ敵iMK-4
    k*_
    oB9:
    φ(gKfg1szCÕS:qem<8=>Tw<Od :V|bEyd.\Z.YЖ,ْt<Mz@F|Q|%zЌn*IAGWEv#7K(P73?vZҤ~I:dJtf}@luS'QX(^SH.Pi:\粆l5hVmAx.er#"0Tc梼,E*J3YFFzObVAk?'O?ޮr|ZVBvnl|;౟$܁o�X܋sA,|"Up.s30rz*7:jðG7רUA\�"Gő[VC{utAq3ߟ75K!)w`E0zm?`胞k^~/]vgٗP #oh{\+_&ϻg5#jCrmwRf4iDIo!#H_Dq#Ig	g(8Lv!eȁHoNkfa̤K4OM/hK,3(M#9LDPGKM(HM*Hde'HM$DX;8Uce
    WR.]hQPka%Q%Z%a_UR(vņjb.\DeW8T88T5`%TšTC]7Tu8vUJ6ebZy_4Vm%WSVe^Zm V#FWREba}KPYuY5ʵX_=\`>``fEak(V_H-RUWanU_Vefb^u(_I>dDf\X(XE`uYF`]ՌUH_V84bՊWՎyW_(J
    Fc\ 	y(9PhŨ\5U(lExbؑhb/U^u+6R	Ya!f丄!2c	6RT8QU-94HN;ŕX]H%1g4ad|nP)ezfǗ}}9r�y9ɘ6t	)	+9#?i%~*	BIF+l&[r~_kQFiI6i5r2%2pz$jIko6'FpĜ͉V+ŶjᷝWiʙ{m&{R;t&|m[s|SG{٦/:	4Lg{əS|-LCV"}p6o1KtoG4zSvou}7ǝxSpdzxsrH;TtVcq gxqB(:9>BW.>|:{X4vOduysrcs<g74wDwsbt$t!jiEm$:6tN#7{O:a
    q-[o:Bxx@r1zE<vsקvigZoO*=jTz
    x69>_?}>3xT>* ^?wzwR:}ʤQ
    w@NzVzz^vL"zB$wCWm*/m>BgoZk7|B(gB9[|OnַEz2dpT
    7v^}>7WGf~MҙE$-*#Y$
    gFMW	|˱r&B#K%;yN\bpKIiXUe8MƄsz>20^4bi3JI$8ODLFOA҄_cB!@Ղ%_R"eRZh2uXEWqHZaK9Rx+a)vV	N{>7hU;XU%]XوF&"q-X^HX%FI[eȑG)㸓+h\(ًOcy#'U_x[ވMN@XZ<;QbkVȎH8{kXUi9Sfi8	029"aI^ޘ)xϛu{'%ֆi|۳kXȒ%Y,]+S{Ѹ3ሄk8D9ٍk8Jb9l\{6hA;vw\EY[SŶ<T,+YP+XkJH.JqgM܃3zɟBə쁈9ʭʱ,˳WAY1˻˽h�,Llnjɬ,Ll׌٬,YT,Ll-Mm	�m"J
    -Mm
    !-#M%m')+-/
    +m"@5m79;=?
    A-CMEmGIKMO
    Q-SMUmQMY[B]_
    a-cMemgikmo
    q-sMumwy{}
    ؁-؃M؅%�;�������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000152�00000000000�011563� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/manual/images/chapters/jmxConfigurator/jmxConfigurator.gif�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/manual/images/chapters/jmxConfigurator/jmxConfigurato0000644�0001750�0001750�00000101245�11377016712�033733� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a��j�bone�ZO&kU.�KG3mtܠn	�<t푛ʔ3	/>eHCnQ֒�Zh�`Tu|U݁�X3}�=iFߞǺ*V|VCyqǙ(ο޵ҡ(�Hj�U�S;1|Gпφ1ٗyEbkAԾcf1ү#kJP5&x"�_{k�;m=,Y̹�Q踑�''`�&NZIX\
    feT�>Δz�4O꩚G�U~�TW+1jx�1uhQPo���!�����,������I!njaa"JHŋ3jȱǏ CIɓ(S\ɲeK0cʜI͛8sɳϟ@
    3#UӧNHBPi$0`ÊKٳhӪ]˶۷pʝKݻx˷߿L8/È:@Ttªu+Wa3k̹ϠCMӨS^ͺװc˞M۸s͛bL(4
    T0Na=NسkνËOӫ_ϾOϿ�(hPp]�2�q!:gs_d.*!(tsҕX"&݊,0(4h8<@)DiH&L6s6*T.
    )BP
    $rP>]#8XH.)tix|矀RMVf9lA* ʣ*@0ƙ0FDԧ*ꨤjꩨꪬ꫰*Ԑ?L밸#<J,sDZ#7DkdfiLRV+k覫^)k�,k'7G,WlqPLtq $�QBo!G0r'Q8`3<\2!pC)P&NGӳ01SXg\w`-dmvl
    :;젱KlLDH")($7vߝ|
    8#c3A#L 6|u #RA/DcLєz2.n枭;p/?3m8m?0ww<O^73l.
    F#m.GL� D->BpL��HL@�c	; Ƿ9Tz`6A5N7]gԳw4S
    K4
    јP-4@H"HL5X8Zeà*Xe
    dQ%h
    ,A|�@ƠTCpTnx|l@|X%\.;R-l]|)hB\$!Ec3]
    qD~k╷	piBp@6�ay@ZVɖc^$0K\1˜G1$1fҘt4IjLP>(2,>ԘMhqrr5RsKy6$nH{#ˠ?
    0;  TB?̰.CavjxAePBdB%
    nthFkTvVK_с=J3AUBG8ӚTM5`Tq	Ձ*zUnhĊtU'2>Q`8hEf"عN\B) a͓ <,XP�TXLZPKJR଺valִ"-j%T8,hE+Җ~K@$aϲSZӜkO(�H
    5e qe
    Mwӽp{;SZV\j=\-hW>\P{ \^:}$:'OFM8@,Ph<Єv`vj(B@~;.{8C
    ?t b\ _X?k!t!83Žqa ķݪ�bx06qwldgHNcVfMn%-]0o.Cf2LB׸?Pf
    и@3 0d2`(�=d I^HM�zMn@CAh\][>zաu7+[o̰jD4م0e"{t]=[?.|P[Vy|f>-݆N6CV>/L@+Vy!,uDq/�M<*Є
    PMD;R
    �P#\rT3?HP?!8
    \c0΅ZOUfWܭ~	LdļқZD>B֭kGjW)}HH1~@{nS4:1Psӯ�7D.=TeރYz:(:^aXb1~*6a25� \iTP/=	?{kǸ!CP?=~$o3?EtFb|Gv}B~TF|Tv~G|hT}'C&~~bGM
    0~6Dg5@v'"xp4X6x
    2
    wqc:71>X_ה3&qW35C�	T
    ]p�x9�G(`sB`r&s$eޠ@	ņPi	* HNfW��[7P U	w(eBpȆO}7kȇ~凇S&TP`(eH*\B8Y~htB	zh(eu
    f	x0Pxgxvxv`SVH2:PdsP=z꠆]8U�*@f�X\Hx1hn(fPP
    s(
    0v(ixI(ȑin7!TВ/ɈXbxv؆8gWp((xBNGAJ^0SupKi_OM;Ƅ+PX`C `"	
    01W%@!Px
     �4|)TBE7S9P|)sTRY�i)YuTS`}YƘ+6𗝉Śryy|9Y0c;�p)Y0,{)QP)	yiyɞJ4P9
    [9≘YYi�	yI:{
    )�e{z:$Z&z(JuNJYTM PI[iB+rQbio r``rq0l)cYw \ʥI}X�q@W:0_*�Olfu	8Pq@d*Ts*vj8NPr
    !ywfJymHoj8*8}whS8j!k{J*zЈxڧʏ{Sʍ}(%4PTS\|٫tjfz:P:z
    ʠɌʭ޺@	@W+;Ijڭ:ڞ!*T7*J�۞"aE}1<IWL.;\N<_E>HZ/lY88+"�AgyJFE{=yd5|`DLJ �Bŵ �(�WK^[{UT|�J%=	n˦5PM~e+T{j{SFLJ0з]+Tky_n[	5@ b[�)pc[`;P{uPYp[to�vAjnv_ۺ]+�˶ƻyɇlzkO[gY;͛{PK;_~ٽ߫e_{[[[[[fk{|0LpJ	׸1q:%<|_N>`+]�U�)�P:!
    pH|@a90!�&f@piЋ�t4 �A	U|m[ùkPT,T#jI+l<~+T2&S`Peu\�#JV\2+�dw		^kɈn�+gǜ|ۻ=2	+7"kP	
    @b]oa͌ʼl\gHɯ|ilmɚ,vj`	0cBʭf,˳LGZL#^͑0va+oX윸0LLΦű+y	PEbi.0ӻS)0*` V:=< BÆ`J! T]TI 1fP�Epia		@֒xqS0�n�a}i1x]�e=u	w=yW�>h
    ւ~z
    Nby֓M7s@<pFfـ]rڀmր]�}ا�ٖme0ڞm!T-`7؈&<PpFps=\ۂ
    ؘmp]mt}S=ՀM-j=ִn]ۦݣަ	=k	Mۂ{q	l}]zmםylg7.�	̻͝|Y�p*Au$82<ZK2=2/
    0p?An#\G_93;WJ;F@`b.`r0<pt�6sl^g.T~!!lx.�腾^^"~�Nj~阞~�V2	�7D_>HuGW冰K_0 1ԮyR0fPq퍤ޞw 
    [	0	
    �3_D*CLmL<ޡ ~1'~(*2>u6<�\D 5�`&L*ӢPqIM(
    RO%-b?dP]0]酰E0u�w??_o�f:N�+[PzI/)P\-#"%2y?_#_JY~ZL4R)(kG1HAPq؟ڿ?_	?@_ $8`A&daC%F8bE5"HGC>!YIo2dTADYBM7qOA%ZQI.eSQNZUYn:TTCo^
    z?iծe[qΥ[]y_&\aĉ/fm!7`=e̙5ogСE&-dfKfkرeϦ�u�9{;8nč==YumѥO^u�Q;8pw"O^L�jxwʛG>-Ï>R{J8@<{sA#pB
    [x8faC0Q7<q<MLE
    9D?DȜ
    1fH"!2
    JpI&tI(kJ<qF*R>üR,K4QP�@^y%O!@!JB5PD]?tL3\CFu;HrQ-ND:gq^*aUPEVEsuW^ESLCtSJսUv�MKSPKg	URGna3نRtqL]ub7-[mK^wբ{{w_~`bcYe-Z?<@<QSG22~
    I`%"y}+_H]Lw]{ec;�#>iExƚoaa`V҂{O-&b"dK怊3ƄE7tZlxװM{.u;]vӖ;enYmVyf;BjQ%O@8YwTpI6 w9&|
    *g&zw[_m}[sǝ>;~x'`+<gDޏ@| ok-ƣ)橠
    h	LI
    Xwnqv_?xd`3=gynGTz`}s*py�xȁ
    Bo~@\_sCN
    t`x@p>^72mz{^y&V+@yX*0$T#p|hC7.m{@PHchY\	hd"�DHGKV#+H
    &\P00x5Knc#ʆr;ns}K`%JMRzL$106A7/硈5~$g9h!"ZgH,$S|	jS=O	iɁ"TB=PNDoUQLԜIO<ΑtF&HY-v1iMA9`@;iOaѓQiXZODG
    iRZ͘(IjUJU<ç[jWy.)-iXŊRӬKDkQ)PyUsWՠu{q]X~^a:Ue,�	A",k5AAc#KY^?<Њ6
    hbZƖ6Ip֖7GnuFU%nq(\&W˅YT\FWӥnu{]fWnw]W%oy{^Weo{^Wu[Wo_�X&p
    |`'Xfp`GXv0r{agP0�+X#&qM|b.4+pa\@Dm|cX;1"RYW5=B$'YKfr%`+.|e,;YT6rely]s,*Ykv֑Ysq&,d<
    s}0!hB:|g:t-}iLgZӛt`<zÈ}N.'TZիfu]}Ԯui
    kYֻup=^տֵ}aOfv;Zڳ6"@Ѓ\,[&w}nt@nx;n}o|cwѽo{[W7l'ўv["
    n#m|mx=q\#y8P\+Qrǜ.wwe~󒟼8y[΁[]:lhKg
    6$4�n(6[B[z׽u0u]`'ݍvcj~}jo;wA'z?
    S:GtҙxH]
    H0_ԕAA/zЃ>]'}M~^$У+W}mzֻݰ=`Ao?Oz?Ͻc|_~o{+7yg&8`?/Oyc/Z
    z\?�@�l>wÿC?l4@@@+;@X?L@@\@	d@SA@˴>?ﻴԾŻK?l8,B88CZh~hB(|'tB'D*()L*B*\B(B,B+B+<C4B2B0=1C/35B5:77&14)CB=Cw9l2D9D)LCADC<dC;7̾>#̴ASDT�"X!LS�WdETzhB[~E_^E[a`$F`,Fa<Fa\0e,dFeFidf|F>EeF`nFiFgChGaFkGdrsq\GcidFl$eG[(GM>D>A;ET`XUlŇD$DB]\H\Iɏ4IIAIĀzȎI\ɔdəɜHIwIʝȕTIt1ɜɞ~ɓ$tQIɒ<J|I|JI<IɔJ<ʮɫĄAD\KCH[H@KT�ȻEM+KLL\TdLɔ<LʔL@z#LȜƌLϴL\IL$dL<,LMM݌՜Mt7tLlMM<L˷DP?Kȹμ`색H>d&3LXOttOOdt7OPDOO-lLz[P5PP=PPPE%LPMd<RNqQmU P�̀XO8#M$M%UR%}R$'E)R,RR,uR*
    $R)mR$R4R3eR&1uSyS(uR475R%
    <%S'R=:u;e2R?<e9UT9-TBEQƛT`H�$<RARR-US=UT
    T.EUVm5-UWT.U\-UU\U_uSHTa4Tcq@T>T!u#�kVlVmVnl=,jVr-Wko
    WwWsmvWqRwWnuWzW}VtVpaE8J=VqXh%0Vi\W%WIPW؉z،XWuyX
    f؂]YE8YYYYيzY
    ڝٟZ= ZwCZYEZٞ=Y]6eY݋i�Z
    [[-[=[M[][m[}[[۫Ѥ[[[[[
    \\-\ں]\m\}\ȍ\ɍܤ\˽\\\\čY\=]M]]]m]}]؍]]*]]]]
    ^UT8^M^]^m^}^^^^^^^^J
    _(^݇T\WH_]_m_}___^T^ 5_I]_f_.`>`_fM_FI;_�
    eC``agk`xN`
     K`Ka%a^6Va!%^bh(L��)�P+
    MW@b.&`.1.a5δⷀ�8H9:;!"6#4hhxb:(dC
    %
    pJ[_-3IJv^cM6<=Pcc}qp˅A41b,n/.GFcI^_G>0a>.cd6fdM`i98Fljl:jg:o.gso^kp&igygzg{g|g}g~gghh.h>~VSFehZ�~ȂWXbQ-ei&f&]KFi4fiug_``kfnlVvrjjnit&?rDJ5DE ؇X�b��iIfa^keViGf\6i~iVch涸ivlc>jn&jlj0h꧶`@�-퇊]jCl:&kJFkӦ6miVekkkNj&6lf#]4hE~p*@̦4%j
    enNi.mFmnnIFgmnoVž>*nۥ`* }n%nbfߵ>iFk`Vpae^pfd&akug8~gmowg&o>Fb&^b'4׀qq.H&c#o
    _Qq섫�[Vr,>!"?#O^rOvrKrM(k00s&s3ol4o5G8K{X{(tC{Os;ot<s6tM tOj؇jui(uiKcU_uVouU`WV7uZu[du]u^uV`!vavbvtdO8:==t#tevJ.v.3X6YvXvYuq^/w^-vu'cvjWfwv!v?vdte4.؍( m4poYq7wOtuox!hwwOvftynK
    x(bym4Wpu'7xZr7~0^_wMxs6xMOoOϦވJ+G`VH_y/u7ur7c/L'勯T@
    h8z1ȄW94vzpRzG`a{7{ F^ȏ|ɟ|ʯ|˿|||XSPerse;
    |
    V ��zt/bdWtYu}OSwy^OdzO0NG`W|glIhL~h`h>@n{mnݏi
    ( Ai&ǰC\Qt5ċ)#Ȑ"G,i*WTyRd2gҜd*vf'T@-j(ҤJ2m)ԨRRj*֬Zr*t2FAyȰ/LhѥZ yFągcaGVX1Vxqc-Ncș;fUp`*dº-SdMYƛg~6jY;'Оj8ʗ3o9_[lڵmnÁv9F.4i}(:u~2t6
    0σH!FXadmdidYFQ%[5)"+eɘn3O>5]t=#A
    9$?8N֙ZlJwY(.Ty^&C}wi�߁ƉRhxNLg.YU&y&z(-*"b#n5BGNG)z)Rudud-UM
    jmjkCe}fƟfuѩZutE8agg]^TWkʡXۢ($)Uz鎢"'
    "{///"\10|0	+0
    k8J<U&i*vMneE%@1Дp^|2&W<35 3|F3ЌEF-b+:)V!I\5]{5a=6e}6iuxGq˽ba̤vO.}%$1�	g2<3޼,]6<A[ޅyIyEMTBDs3ՏR":>;~;;;DD:׭dy*btFc=\_'1՗ˍI9_s猲_O{:P=7C�< 2| #(	PIPC2(
    Ucd"iT$,a5d=Ed|3G9Y!t_:?~A("��%2N|"()RV"rF"-Uz/&.g!684wX
    b$e',dR60|$$#)IR$&3M6bC1JczcT.8QcgsO{_I':@G@a ch4)iR&6MjeѼ7يn'-q�PE%<Cʌ
    ϠUBd=(Aeسi0i|	4P?Eu4&!LC6JSҕh)LQR1]LqZԦ.)P}S޴;x259dR=7ѩ"QD^}j~ tAB+d!Ná}kM
    PF#k2R\=,bqя2]clb'*%QE3M=-W>X>VXu0]Eƍ\>NkGO%--QZpn?ݺwty{WKz+W%/|^ҷͯ{ً_|ݵQJR"XQ XFmx^U	B۲6nCu&ws]
    ]K5SUs']fr>1}L!0d$Kv2d&GVnrd)SyRn2/ȫHh`y*p*\+Qh81Ɯ+;?݈U5f=+2VhN"WSTg@(G*B-QVS}Re.Gjԭ~uU
    kRZ׹^ukk[Eؾ>6j�
    6R;-ٞf4hA`�DZ=74pNtAu&\G5\1Wtt71	p#
    WxΏ;|1nq_3q<8G.r/ӼhFTiQ.y0H@ߍjx'T5' }o|CEtF1Q{?"1 ]͎}nW{َv}u{nw]r;>e';lB:u.FZxnVXU=^3v#6}z5TߥŅujݢ\n͏(v}?|_.WMg~;՟OO~}OidzD%+ayiJ/=%Z
    ZIݤC^̞D՞DݞMaU^ fn vy j =[9Mص
    _WʭJ:X)ZV9]HKHB
    žX]XsmIL!V^!fn!vva]|a@`1	J[
    llLɤ! NURA!4"."#68}!%V%^"&f"~bR#|\ ",
    r"b!"..$NjQx0#11#2&2.#363>0t"(VcQ:"dOh0n+"9,-ڢ-";.b@ԣ=#>>#??#@@$A֣"	$'Z#CFbEXcc
    P4F8AGc8:#EI<
    AA$LƤL$M֤M$NN$OK@4$CB!;*ϸcx$TBBLT7\%VfVfeUvW~%XX!ФEL֬Z%[[eش
    QZQNISXVTLXn`ne_a&baYruCJA $;\&fffn&gvg~&hz3&ii&jj&ke%\]]\R$SFoC0TB%�o<eb_L`rzCq6s>g Y&uVu>QJDe^fTMT''�'MCquzr`B'}{gtFt^'m_nbcLf%A(gLgagp1{a|',b+}']\^((T'~勒bc(6d,[(X@CT((4(PAA~l|+l)vvUfrz|~ni?pi)i?i˜)V'])zÚi)
    j6*"j? *ThtE`FevJ^)e)֙2DAUXAAA8j:ԕiVj)]pi]pii**j]i
    ҩ*fVv+&럂kj(.*+]6C]at2դ+܎BH4qۑ"2d@"ɰ.ff+j,V~7ll)nl~jriƬƬ`nrk"kzj웞롺h,'+Fm(kn*r]i$C ג4(yNZ@*bZlƖ,ɺll݆+Ά+-˾,*,z*Ю+"-:jc~.~\-Fx&l6�4NAJ,,b+m*z,̂.mFnlJ+"n*.Zk
    mўnҨ熮܌hj㘮UɕB"n~mZ+,&Ȓkjo2m[:0noz/mgc'0
    {z*궊6�&AIoªCAL,n.:RRk3l.kqoV03.70+npk]|/^.0cp
    1IB䥚Qնo(Ȕ5T),p>\Uvl#)VN&.#o2VZ'2&(r34>*ű*sp˔oNi 4T2#cEVb~
    s.'321/s24)3-B*+_363Om3,3,rY-C73n1C2;2ss2s'3>i4C4ph6@W6w)~</*C?4DG20t>WE1dFo4GoE41KHK'4J4v,Ab2HS43_5NOOsdYeQQQ'X24XJ?JkB˴L۴H24O5WPR5R+uX2W:5Tu@K+4bRҴZDc51k5Xv^WXu65XWZ*u}BuD{RrNt^uWA_WvW6bv
    +a2l}CCkC�NV[6PcvAiXsWzvUh6t+i@k+kvl?4d?rmg5e%nsnoow%pGp7yGqi&rәköskׅs,Ck܆1n5vgWvwwGexCx7Oy;zl?,s7|_xt;~.){8fQ8/tSs6jTBj\@?9xl|#9löy%#7wiEW^y󂿸gtBZC7y?yO9S0]/s9f44_?k8G'_9c繦)5:33[tp79+?_EC9gz4s>yzz1ówjLιϹc_'oukzOz*;:K}z;7;3cWD3o?rW󸗻S*XX*=Ӹ[S;C׹{/{'o;y;g{O<1W|g9ṛ<+z@?<=={�3<_|;*_=<T<Fw{t>ot?ٟ=ڧگ=۷}kp?>r?t؋ck*i{}E}=7㳽#j;~wti=觯Swk~G㷾=}'+C糩~>Wrgto@G/>;?Cw[?c?
    3F+7@C?1=|jch1?	4xaB6tbD)VxcFSd#0C](  1iygΛ4yCsAXҤH5ERbOBejөQzl؞Ȗ5{2kٶe+nܟ:{g*HF,<qbŋ7vrd
    9ɔ+[}Y1ϟsBE^ͩU֫aV:{jnJmn=:4[LJAr{v۹w|x.7}zYI$J,]39@k_h0fkÍ)p**tAj4T»ӯøS!OYn
    I䘑muܑqa0K"<$\&T(D=0o3JÀ$5\T66#l*|1,PC:.=)
    RDCt!$dH%GIP
    ͔>ϝ	,	@̛<p6qP^
    ,nXRU5Y�NZŁeT!$(ݖnyԱMhr%;):kc兦a𶪰zAf7B	G޵NXn8FbF{+V�3 jvdl۔Ua"t]R}:5č+<
    X^香3zꋩxMfl%Q앹m1i^~PYKxc}ga8kAP1/;#==qtEqtHN(;ZadRi7>zj}㑧8ieoStq,]ӾէMJ,_ő=t}]A~Wџ`�	8@Ryϋ%]<F(QR^f=v=ɘ/dS_4^~8E
    ʈZXĨ}pD'6�NXE*FE/na8FiT#2~q"A	:kDǣP)4	O'@BhآPz9W)v9g?~&ntIF9R,*	JQs<xG
    qrHw=e/.
    c8Al$MUS3$tf~gDX\IFV2p,gIu1g X5M0Pe6Kp@b#j01sM~nd'P<g?L)G!ue;	6s,X{Qrh6#3$hB**SG}fCPK3/*/'q`*FtBr~x1iUZڏhLq\1Wy]D~_kWUl`uvыfUOc0P~RPNV%6cQʾXWU(IъWխmEl]W
    `Xuʕ
    IVEHOն-՜\ZIh%ؒJʭmo{FU-g=-G�n+V?qM�x]K	g+`p{`#,s-<V׺>kvWR/CP6nKҖo~Eȿ+azذu-ql\27X;,CwW`[n:ݱaf7(ձyɞ9E=nI|3n}1hea(\V'dr5eOӕ›utk3-;jZsՊb/kd/ٿK4v˖v<,PnRԨ'b$YܳNOFgl-[)ʱq-5lHXFV0S	v*T[ .9) g}88-[Ϻs]X^e79#| K(8O5:ԩ^u<\Oֹu&\FwV·qos+wOWǦ\r'.vu{즙6os+\9D_z_~ﭘoz^<Iam7߷?yWS{߯_u۾eo	V~</}LI%h~>Ï~(*i��cM)60��O*hq*"PWp'ptcQO7:?phUo)	gS!))/[tF	p0	ǐio	k	n
    ia8
    O
    MNP
    P
    ۲QȮݘ	SI
    onPp$/K�pCQÎ $~
    cpo
    ?#1ge1_uv�ph	œAQQxqqG+c+Α*V '1ɱő_ ɱJG12##?Pj""KRq"!Q%!)QQr"$G�7&q2:${'=1w&$K&%r%]R!P"'&rt2y',kQH+(RQ!--
    2wq-i"ϒ2+2,0-B$+R-/)k&2#'$S//q3ݑŰ0CS4)03Ӯ(-S5-.M24
    053?P0G7s>R1QV8S^s/cS6k3Qt:G43";19%63's'?3S=C֔8Qz>????uA@@@A4A3pns=''ۓAO?7>CSACTDGA4A34Bs:)E?B=Co>C7CwtHGtAMPT$EcT8k44G!?y?D}TKTHH3BEwSIfnr?tttTO?4K@tLt1CCNOR	4SR7uKuPPǔUCQJMQM0N?hVRqJN-U:W15XOOXX9uSAUT/POQSZ!pUUNVmUJ%JRNuXNX\]\3Y�IUZMU_Z[5ZO_1>3Og\wWõW^USUY#]+]36OUP^mtELdReSVeWe[<$@fgfkvfQ`AgsVgwxgg6g[a6?[g[}6hgue65jYff4d6Ne k65`ke6g{hnVnni\6NihgіepScmkCSl,p+e6q65?sws'gkohiikg[t,e
    p3kWLET!wglWlee1kfQvjWyy?%N7GwyhpmwkqTu7_{|w7kW{eyW}׷t}s}zmϷf^w'%Z6xr=6qf7~8yׁ,~iMlͥulLl@BXGK؄OSX[؅_cXg8I3Ir7Tl|؁88?ς/Xf36ml؁X؋X8�@rv7l}55؎a+XK_2is\B!AA"Y'+ْ/3Y-r�peNG$ǷWW}8S~6%ECQ�٘YٙY@
    e9
    Pe؇Wff[ٕcypgv9=oyy|B.��ٟZڠj١XKewKsA7;zBZGKڤOSZIFڣ_:fkڦkڈaZwtCdz"_
    ZکZZ[#Zڒ'*zyy/r3ZA:[:zߚݺxsڮڮ}شDF"oa$,[<�eڲ/)zzɺrگ5ZQڭZڴO?\eZ_:g[Zّ/>jh?Wyn?8@([!J0W׳_=[ڴzλW;{߻?䛮ڵa;e۶E)+u
    A\#)-7:}.{&ī+	piuK{o[umܾk|s\ﻵZ[sq+q[[뻴ǃ<۽wSx{r,;ŝU|sL]g{yames{Ѳ\˃˹m̫]g#xH}9m?=?DLIQO?T]Y=cc}q=oC=WA\#?L\Oě/۵5T,H1ZK[ͻy{<Ž܉ܮi/wwW=OWa]?	>	}?>=+�Ҝś<řΕ=1;uϕWϖ9:;z]o}Y;ݍ|==1. Ꝿ~~꫞~뱾굞뭞^Ǿ>1�2^ة~yĩO~K㜫SŧGHV	̱	}۫#'}ҍޯ-B_G?AM1Q_[?YO_Sc]_ci_qG0^~ZM>C~sy[>y{Ω[Wܕ_㿿5}9Y@~;h B"tH`āFtP!C3b .2~*Wdfټ3Ν7iϡA4id2}
    5ԩTZrJ6(3Teȍxa_*Xlۺ}6ܹt΅7޽|8Z-
    >¡aF92bǃZ͹py:4hjK>m)R+ٴk_q{{"ċWYdT/6gf9!){Ϡ{)˛l`Œ5Vm zU[Ό??\z)7`Q`
    }ǖuhMtkeu^J@Hb&b*ϊ.#daT5utȣNBL7~HdWaUYiŠw1Hen!a)r)QaQ&ia?–RzF9n1މgz$40tC>#&ݡADg҆dWJd|PW_Vn~qIaf.Uififorh]p@k
    lKl)6Z>NK-)%=I嚜~H_㞊`*R?fm$B$opLpB8,O^lK.u)^[n9ݲnhNƆ1.tBMtFtJ/t9OM9_aq܎)b):n?R,̧՜!8c]8~
    xNxx!~q*ONy_yoxN\SǘU�rk~=ܩ)q>F;|?}O3_}o}7
    .d(G|?jq*gO*밗K?M~,	
    }lRK}꘥O~LS?1`L�Gxؑ"sH?`
    SXP<k@8EGD,Rks
    A36E,2_xΐ##`v4KAW8qY"ڇ5"(OX?"\awE./,bK(Є:l/nt'?	$ڑ}d8E\Y\EXYLsB4r?C	`
    sG^V~lg\E\td,yhT75!s,9mcLc*!CBTa<]0^s8%
    Y]s
    'MΉЄ*lb2N:S, dɿΰ%GdP-t$-Ǐ
    &<'O|jTPJoJt<QZ|()ƙ*u(N
    DyMUj墀W
    ְ~lb-Xgul,
    ׸m]jWBKN
    
    HTDRƬ�YkfRmeJj6,6ov^)WumkuvgMmˊVzm]wkYߦ=cRվvll+a},ujTswz5nc?6wsm{]Z7lx][$}*\z*x|oc+v)㿟,D2af&nEZ98&Ka/!/AcwIJ(1wY-v/`<(K5b+Z1ue# pȘ! FsRd2o%j7퀗8Ru:D+Uҍy+\"kj1Dg&49io|n5=h(/zִs/z赯
    _7<!3aLx^E?g3;ګtmA"#MiC[
    lo6f`;~e]|[zz.xkS˕vpJyiU/s{*,!7Me[.8Vl/;p'|?K]C^хrp+}=m/=$g:ӻ-:H5o]`<df{iqwveLUq[>tgiʻ>կt씯|U.כ[n~K/)Yw~.I~X'}x	7vGK	ȽAѿCfg//g}Aes].?4}f#pk6k_?7>ݽ?s^~~Et	pX}%�&pys5p�!(#H#(\+
    ]6|TvH]5h\n%$xͶւ.(XBGUgQo5oAroYp�_a(_8g�ekl+oq(nHRhF'8$p�b(WcHahl)8舏UwH͕VР
    %�lЇ J`ȅqUxXBWzHhq8u�
    ;
    t@ŘJp؊8(lh׈4(DkЀk(bZxȌ_xxzqtQ�!u|w|
    ~׆(Ix>э 6 	!)#I y')+ɒ-W�67ߨP
    @Y��H!`ga`KuNlIV9!pQIn[ٕGt
    Gei脒Ji7q)s8Iz4YV~�
    HOh�`NLOI'X#yuq7w8g]i/2΁#M!P!@5ɛ;Q9�
    3I'Ciǹ9Eɜ͉9a0'kȝt		oU9NP)tamTəW鞨b)QȚq#,QaI�	ʠ
    
    *ڠj 5@2y1
    HѡǗXUzJ5Z 9M9`Iz9YB
    J	ٟ9)�ȥ]_
    a*cJejaZP#m:#:s
    S\k
    U�{ʧV J@6z	WrɤFi	=x
    *<
    %Xo JJQ:r�zj
    m`ʫ꫿
    -k:s࡜ʬPRqj%V�ʭyo%׌jzb$
    ŀpڪ
     r
    
    +Kk	;``ӬV!ۛ%zXM$\p@%K}y*}ʲXwز`خ#j6k:-N!YOmq{Q 	iKjmTK(;bWA_@A0�gi{$
    ⪲qKe(3+5nʳFlG4RfQK>SkCrb?kA'SS;aZ+$$A(	H˺@됊n'quk	}+׷E}%TO'O4I$IBbP+KA(c;Y{rµ3m%yWD`	GWz*W׈˿6Dc'jj	,qdjLY@kBqC\5U?(*S#-;~g~j
    EkظziEaM*񩤤xM,M|$QRQٱp72@(b\a!L$ֱZägq8U:ĆGA뺏<J)cxɒ,Ʉ0k˛dlg,oLG11/;ép|臀Hzr5WlWl]ȊAAlLٜͺ޼L|L,C"L5p|.ʦ<(k|(qsL5J%@X"˅l`�!-!]kXoÀ)+҇lLz=6@<
    ?}=MÁ[\űʫϵ̽bLa5=L1-@|؝tp
    P-]# ]jx,+11m[5n4N8ؓM-յѡ+UM\\?;_,EW,Yuܗ5戎#Y(Jpp
    ]}z!
    "em݁ݲp2
    ćm6@!|'A"Mm"3O}Mʘm\`}m엵:ɓ>I }Ey­]ܔL P.ݤjf,fX3]uMLv+-'(£ޤ]46cߴ]ց9	DNڹ٘mO~᣺]/M=@a,ikĂ,0ΦޛrΛt?D-@Y`$HHĈ
    P~^VYN|]!lb̿k⑇Ô/0ꩮ0
    0qn!�놂'+ڢ/2ZyqW~oҚ~
    ^D;3L4N5Z<.A!|ڧ$ ѓ
    TnAMݗ-޾dޮf@zt	!/89Ή)_ʩ-c�
    ͉ڭƎs=rXN>)\݉=~d<ȣ<cWޣ[#>$
    "k&
    >@/[~_GOAeZϵA�@fOlk$(t~)H_àOG(-	˺ 	/א_o_e/T3@-
    DP
    )?`٭KCïVR*^ڿ؟�O@WDPaa
    >pD	,^ĘcD)~\?H!2UJ-]SL5męSN=}TPEd_*6Q@P/<2KULVA~uA0:AZmWܴnWo޳@-Pb;&F(2JUŜYfΝ=Ztg)2u
    U*UX=,y q`/uL_r߭/d悃lcs-J\rɓ-K^x͟2IONz5߇V,m
    5S"@1-~88~sKЮB9
    $HC :>H[%cE_1F{Rﴦ[->׶6 H|Sp-#|	tB2Ԑ9ĆB1/2qT1M5dM7U=3 1k,FjQPR|PEpPZ.K-K/s1,#i7o5W]wM%S{5Z.Ai;61 lSHPe\Qv[q]Uue]w߅XgW{7_}os91bkE6a?[@\Pn\s?Ƙcu2^OF9e9fgV+b1~$bfZ"#)dp;dꏭƶ䕷kk9ŗi&ls,	@bh`XA[+&ym-ѵk7qG9lZm/<zX* t[	{i3E/v >x>QVk<y'[mϾJ]~{.\oJW0)Lwx^͙?~tGCWCE>w>6kC$8A
    ~tްu�a�a?HЄ'DBc`e8C\=ٺ$u`H{{H)DbB&6qK/D
    8E*ĆßE.v P\8F2F4E6эc8G:G>,ud wG5ѐD$(HF6rb"%9ID.ґ$ GJvғmd&E9\mRDe*JRҕ32eU9KZ±x2+uK
    d-9LDfhbFb6ә˜LjV3m
    Lnv]ƴf8I#lf:pӝ29Ozg>yl3ٓ~Ӡg@Lc'}QPt'Ⰱ4QvԣiH=zԤ'EiJURv8P
    s<N,Ӡ؀H:TըGEjRT6ISδWM%+EN4%jEՉT-Vֲ<euDˮwk^W4`TְElbX6ֱUl2URh*W1+VBE+Y=zճ3A
    �ֵֶmle;[ֶ:շ.pHVָ[5;Z=-L>[Vw&"��]v׻ox;^W׽pGYWgUw.rߗ`m@p`7p%<e/|5Wo_.tK�v%	vo
    7quc9Ǐia`8mFrmLXOvbrjbxj]qWjg@/z2gFs4m^g9ׂ0L/%yٳ#eB0	4A{2яt%~Pzҗ+iNovz|ɠG?j?wtemK3-0LXk`�v-lPQf}ld'`̆lgO;][9ҵɗUr#վ]QY}Ѵ>-]`Ʒq}[߶7~[&8<w
    o/2UDn9*W5k#$J݀dUK?"B9gngt߼9	o0.u=:䶹lV|__Yc]RQ"rvnӎv(AI.-t%Vr֩rH:q˹6<oa]`Ǽqo^<1s^'UYo~o~}Oߏ'ٳχA%}F=gsۯ~_G{Qs{+9?9i|CjK#,3@dl=۫(.)0cߣT=~t!{y�tlAGd<,@Β@stA3'&%+,+`1(B#ԫ@!T4',"A(tC}:;<=>?C/024DWC&{E8HIJKLMNLT5$B<S<$Ed7t|a<ȁ#pZ[\]^_]0ETDFU4&<6lg')!)rklmLCw 
    q$rl,bF6tBhdG~xE|Q#pw {|}~{|ȁ$Ȃ4ȃDȀo2; Vl{GULƓdNJȏ$H42ɑ|<ɖTɯcIɪmVɚɈIIɞ$Jɠl,ʥ̜DJYSJʳqʧ$ʬ'JK}ʮ˳䕱$2Kt[Q˵4|˺\KʢK˼dLLTL0T\tLLLϠʤ̌uL4͡L<TnbMפ͜d(iMlᄉaNTi[ㄲ\N4N%NT%NND%Nڼa&JݔtϢ8OT"4tOTp8(ruP
    U)lК2˓k?\
    mTeuѥ*L5
    к2۲0l+c
    -2R
    L4+dd&.p4)*MAHQ:48";P-*RmZ-b6u78S�-:2'MF,UC-=.)#!,z242FuGHI
    B8<�H?*s.+RSC,D%UEM	VuWXYE0TTTϭRzU˯BMTQ
    SMUSu	fug1F1ij !+Č1VUUA5	-璨"*+d$
    1{3:}5|WW~{[UUo=4|^rsu\zm4NXO4XHX\؏
    ٍXM؃!,;5CBcR%ĜqO؄-
    ^KPq[mӶb{6k;6k6f+Zj6jEڣMMZlS6bsl6
    n Q+<DYs-)<z6838۽Esm܂E\[ۘSZ1۪@C5mۅx9[�9#ݝ9U]E9u9؝]Gҵ]c?ǽ8۸:^3dٲ	(h	^;_?›EފUޟX˼_`#c�.=V>`;_\dUԅ/s
    Y
    _u޸e>	n@[a3>#?3b~@[Y:#^k;U
    Na,a@vb\@-/0c#b8
    |	.d$|b()*.bA-|>c?A&dA)Mb<'cb;&ᷝF.LM-/4	5FF3tdHnIdnјC@YZ[DBSFW='V^M<&HOTeffvgPRe_nXbr%fW6fYpq&r6sva,cf8lfuzeѨƠz{|oR+G`>axyxzLJ舖~LȊ\Ȇ,\^6nё'xind%&B>;Nd.N*\FNi%jNh>Mjצhfe$|jjj,k�jm&N^ʱ^Djk&Jk2k^N>kI=kvI7*l>INj&~YlHʮll̶HlC�6.:mԆ^mjmv؎|mڎȾmVfi"wmF.q:nV^nlnȜn&&6FRcOno&#~Ofoo.OQnxHt˰w(`'7GWgwqp		
    $r6rᙗ&/}Xrr'*o)Sry.n-sZ+2wn12Gs+6n5"s:;<=o*st0r>tKt^4oG/JttEANHGIGnBpG'?s<uF>o|LMu&u[?sXuQuCu_bkUgsdcgvVv.6ihukjvvPpq'r7ú}Pugvwwxyz{|}~'7{�`5p'7GWgwxOX=`xP*'7GWgwyPy@Wgw'7GWg_{vq50|'7GWgwׇؗ٧ڷ!p`z!Pgw'7GWgw~Q(!p "Lp!ÆB(q"Ŋ/b̨q#ǎ?)r$ɒ&Hr%˖._Œ)s&͚6o̩s'Ϟ>
    *t(ѢF"Mt)ӦNs�;�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000154�00000000000�011565� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/manual/images/chapters/jmxConfigurator/jconsole15_tomcat.gif���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/manual/images/chapters/jmxConfigurator/jconsole15_tom0000644�0001750�0001750�00000023015�11377016712�033573� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a,��61U�=U&�%tZhj"��K	8�\�F�m�C1�:9ѪJ�DL(�TO|c9�>BcCa`\:�Z�Sڲ� M${bAi�&dDjM�1K�MyloSU2r*S4�\/�(�7�`O%|qiA
    �F"�Kᚽ�\	.VWgH,�>Dέ;1Q�6}hCw\TfH0Q-�U_>=jc�H�T�`�U�X�e+�Se�X�M�\r�`=
    �X�Q?n�Y�[�Xl33f�Z�Pff]�^e�gt�Q:�P�_�Z�^癙�s�}�Lc`�K�7�G1z�=́�Zj[���C�A1R䐟�>LB]I�!k�AG쀜cYmӪ�I
    GNW㐦Unv���Yz333!�����,����,��	ȭ 1bWCTMr5"3jȱǏ CQɓ(S\ɲ˗0cd)͛8sɳϟ@(HYf	IRaV$H"0+%1^)f-K@]۷pʝKݻxe˷߿Lpa+^x._Kg#<
    VnPukXRZװc˞M۸sͻN\ufǓ˼(QHaXmW`i@!,](}].]_Ͼ˟O�(h&RR
    xW
    ^-+2J
    6aMED5P-,ނ
    q'3zac<@)DiH&L6P"N:(J+ч\% RKB�5<p›,vt֩+6Q|矀*蠄jh%袌6裐F*餔Vj饘f饪ty)&&t5Ԅ̪9V&qVvubW+u+k&6F+Vyt*]0?+C8(�9 +x˧[r�,/'7G,`Vlgw w*0�q&0* /p.<25+g>R宓L7PG-TWpXg\k\*Br-@q	\A2v	�BT4Πn?CkCUIg7kWmטg9bwNp6Pq`
    0a<PKJ4k\Jo'7'K"		pAo20a]m;;/o/K:P(:L7Ac$V.} B7T<!`0SfH8̡wp?n6keW@g0	-QLdp>XP8ߵ&.!TZ9<piqfDXh_v4
    q
    s/1 7 Nn`.	!\/X`8PD&R}7q1F: RV~nW.	.:o0 Ztnp".@,	E)Vd+rP+Z
    T\)	0F#cX<{�6�D+:'{s<yӝthBz|c(F'jP>0:;%Qquh0CCG**4I%Ӟ@
    PJԢH!=�npSٸ�MhJJ؅ O(&0
    \(9521!#dC/7�uH#�e\늉13�s-Ep5oň`jWUok^zbtM#?QX^%&bZf
    c?
    pP
    e%.Mrz~©@u8Ni"�	[*&@TD0Q"%meJ@xy#c.:;k_7}}a@�E	?901
    bF?iحp,l
    x&8αwǂ�A\
    ju4�^H@E
    P`g–Ymg,ќ5qcs,ER@ΗL=s<h7}3CYбFߕJs?{ӠG=
    RԨNWVհ_=Y#&@5px?<@@	Tp$40QьҀC6K/A
    d;M}/!X?Ġppnݱ 1[S`f3q]++A{
    e/q{ GN(OWNrS/.5rBma{Ȟ<0g?
    T
    P�ґ4A0=ؠ{Ȁ?6BlhacD{,Bb'?̾h]\:^T%=z.y~%6sn9x#uOWֻgOg=v3(L|IW�?.Lh9P@^^V@4A=/
    `
    pAAKc,dhAg4b`4��PpES7u~PKw	:R:HgH7(SN@RRGЁ
    x*@B8DXSW	HJL؄NPR8T؄}W	}{
    Wq&27Ip�|�wҧl Z}@Q
    tp	Z0\t
    57\΀8~ޠP�Xt@WXX_x	u�H�`7XhXu^P^ibb艠X(xؘڸ8Xx蘎xIB/#*@6̧І7B4mM|ȇܸِ
    YBEP-$
    Z ّ Y��%I3u]|inHuvx䱓두@B9DYFyHJ ) �~TYVyX#9
    ��U`	%P�P>  85)rt4�͐wX?Yz^H{9`2_�iO8xln^ 0?uYyٚ9Yy㈄~n22
    }Ty%":r#YW~tڹzU9N؝y	{XP	 {C6D d1ɆYk`P50b;9a=ڠ:Zz  ":$Z&z(#zL"$@�/J3
    ݕey`:DZB*EJLڤNPR:AZVzXZ\ڥ^`b:dZfzhj֏�pr:tZvzxz|ڧ~:Zl٦oj:Zz::ZZꦦڪJʩzJک:tګJȚʺjʬ:~zؚ:p;⚮꺮J:p|jگ�P{
    ۰K;:zjٱiYJaÚZ02;4[6{ <K?ʲHJ;&
    BD/X0+R$۵
    SPڲqz47˶HkR˶tj}ZtJqʶt*c;Uko۶n[p:۷x+b˷p:p*Kj+u7۸[ᷯ|ku
    K;;ۻ۹C[Zi{6pkm5˺Zv݋˽ދۻs3{KtKڛu;|k,	<sʹ+˿++;<
    [{/°Krjܼ>;,F%|6$<0̾2<q9{lA<BG,JK|h,ÿKUkKnغ^켊;ѫ;2[UlIKx|o\0L;z[쫠lj6ȶ%d�ZŢʤj�Lʡ^+l˷ʾ,,ƼvˬӬˠ|[|<\`2�=]}
    =.\<]}}h;v$]&}(*2=4]6}8:<>]�-
    
    F}JLNPmB]M/mԟJ0m 0\gj`=0[-k]biuj±Kxj+\ؤzwnatM׈Mٹك-ܽ-x=e{;وNJ=ժmلƋǗ[ٞ-6Lی,Nj]բ}խ}ۛ۫͊ܔک
    	ܼ[Mm-x@f[{-حەmw
    ݩMҍߍ֢M-ܗ]ȗ,mߗ
    }௝k=m^+Nq:Mڐ}ޫv-}D]>jp^MFN؁{=ū=14۶}BK~ nj-
    :>Zv+;noa>^n}Չ.0>.Pꨞꪾ>^~n~秞>^~Ȟ^Sdm>~؞ھŮY1NNζ^>Nn>>
    ?.	>_N//_n0'749nDB?%B=<PCEu0Y(/L(oI.lmoo&=oL_nxol}/p?m^j6nOrO)y_2oo~_snYg?&O1oooOc?[p]Oѿq?/
    G.dC%Nϟ>}mH&XX@v2L–1)ۧ0L~Z"y'BAa3'AF.gRP*UU/4+S3Ŏ%[֡EQrrdɵU,3֡,VԋsjԂ>6ҫ]ÃOThcxנd”ܳNGnfYԩU3D1ƶ"I|=wYbw>}o
    {O=q[-CѮqӵo7\楏>{[5z3�p@4@TpAtA#pB
    ȵ@-04CCqDK4DSTqE[tE9
    SsqG{G tqƵ>r`C֚KH&tI(E"Q2rK.K0?+mO0TsM6LqL8tN<ԓK8ْ3tPBOSI
    uQH#E<E4RL3ICFtTRKeSE?M%MuUXPT?T5XsuWQTVuXbcU[/-vYfI=vdlvZj!}6Pv[=Vw\0]\aUwSg5LKew^z|6lwpx`=t	Vxaƕa#vXو+xby-x_y}dSUvY=~yfbcVsvftqMyFg=XvQ&iE9jHWӰmlD[7
    m|[m˻zo[7|ǖ1SbqeMݴ.r	su|Ss2CW\U]L=r=g׽ٺ݃~GYxQ:䛗w،_旟z?O^O/_폟}^l�ԝ�;΀Kr&
    ,99~r!HXBʏ~CaNBT7CmCv
    A4#hIT"ИD=4_6nV>."QY|1~~g\b5B6##(Gy[#غ:Tt8Ȣu"+ʯRe#$5H8Ze&(I^ϓ !GIP1$e*EI`Q3,IFK"uY1\f%1^+f,dљ\GRs2	1k"˛\X8_)MrDg:fNlҝ8ɯz\9Ov5cρ,MPz=]
    '-^T;i-)FkQf'gJU,+cHk9Sr4zu)NyS}45PaJTi&KejSTFUSjUzUfU[jWUrRUk}VUi+qVy:O%la
    {X&VelcXFVle-{Yf
    z& miM{ZԦVemk]ZVmmm{[VE:Գ!{\&Wens\FWӥs`^nw].
    -G<%:!n^^Wo}{/~_�Xʻij|_Cu؅p-|agXp=aX~1bX+fq3\#Ȃ`u4?c YC&r|d$'YKfr\b:YSr|e"xu'NӫcX.l|f4KHs2kyE2s7bcxƏEZЃ&t
    }hD'ZыfthEғt-}iLZ*3|g=vy{TZիfu]jXZֳum5Z׻u}VoM}6uB
    KRGz`vlhG[Ӧv}mlg[^mp[㎶Qie,?nx[w}o|[wf\'x
    Nosq3^x-~qg\x=q8I.r\+gy/p-|-
    /B;y}s]C'zэ~t']KgzӝtüD2W7I`lU[z׽u]c?:`]kg{v]z7]{{w^'|
    x'^g|x9U|-yg^|=ox;d'}Mzԧ^[#gԁyu_O}!{|
    ٛg~|G_ӧ~}X_Y-~\D~_g~H`}jb�@@,@;@\@<@}p
    @@@
    @@t@AlħFXAlA|AAAF>AA<AfIA!!B",B#<B$LB%\B&$kB(B)lB\ B>-*,+}B2,C3,'<C5\C"Bb>F99CA:C	ta	
    4LDD$$AD\D@H4㻺ԉ�DMONP4EL#PET<OdED^KӉEHE~aaFdDF_?e4cTFcLiF]Ŗ'ӉGFp~X>r4rGSþn,G軎pslqLGxlJD	,8ȁ*H,,Dž4Tȃ4ȆHF]F&II�(ɓ4~Pɐ<ɔtɕɔə,IIɛɖIIɘɡI\?ShJ|JlJ~0ʪʩʬJʯʨK><K˭ʵJʳ$K?:K˼ԉS$4DKK{L\̿LüLL̜LǜKXFQS},M<MLM\MlM{MٜM|M|0(rMt6MԶtN8NLN\NlN|NN>NNNS)΀NOO,O<OKOlOLO,&OOOOOOOO>�P-P�OROmP}PP	P
    PP
    PP5MQ-Q=QMQ]QmM>QQM	+>#>}$u Rr!R#]$M:&ͽ	'=(])%R}R--(S2-S<8S4MS5]S6mS7}S8S9S:S;S<S=S>S?S@ES,.xHTE]ThTG}TTITJTKGTTNTOTM
    UMKFTSTR]UVmUOMUWUYmUXU[U3P#iU_U`
    VaVb%8VdMVeUb]dmVg=bhVkhVdVgVoVp
    WqaVr=Wk
    	*@vmWw}WxWyWzW{W|W}W~WW
    XX-
    �;�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/manual/images/chapters/jmxConfigurator/multiple.gif��0000644�0001750�0001750�00000053745�11377016712�033346� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a���T-̕7ǸG1monf�Kn	vO%	/>e퀀oSC±ѐhƚlYx�Z􁈿ݶ^kο�Б{H�X�XVCzUm�=͢!r(kDЍ{z�HyD�Uп�Sj9Z1a{QB0ch@ffck1 w#_�\ek�;��\<1,Y澗֧�'�Q'`NJB�&d�NZyWrKnB�R[
    fU暽Oe�>�7F.}�U1jjWp`B�T+
    �`�e�X�`x�<\un]�}̿_1ZLcltYfێ����!�����,�������SLπň"!"FBŋ3jȱǏ CIɍR\ɲ˗0cʜI͛8sϟ@
    JѣH*]ʴӧPZ<6UUI
    fݢ׮[Z
    دABNΩ+pʝKݻx˷߿LÈ+^̸ǐ#Ke?~jjl
    pLMӨS^ͺװc˞M۸sͻNȓ̖sjsӧcPBp䤼ӫ_Ͼ˟OϿ�gĀh&6F(VFW%:2̇蔈H_P"@� }'ލ}##@)DiH&L6PF)TViXf\v%uO˙
    )
    )aPbh5z#Q":+*蠄j衈&袌6裐F*)Uj饘f馜v駠*ꨤjꩨꪬjCKuve�
    	(IE8f>.+QTF+Vkfv+PЁ?覫ЎOpK.a.fٰ1y,e6G,Wlgwg,$l(,0,ɴl8<@--lBBqL$vPG'NC-5V8`	lPG�A+Pp,߀
    4'7G.䔻<gw+G.ZGH
    }g:ӓ^?8HPvgv'�8DE4h#LFw/~o39*.ҧ?0_&?1('hz/�g+vby@�A 2�(L
    W0gHB�d7Eme¡M:]A ~-!8p7@Р5h]O�D0̆hL6p'&χP{_�NG#E
    TN1���ف4\0aa;�ǒc<?
    b$	_`VlI@eq]k.fLV6nzpL:׉NF̣gw$Xli@)AU⑯@$e1!`_|B*6!R@/?hL!6J2"KXIss*G!љttJ#Vj<vo#Q#&aȥ,v0@Ȩ?~UV4zEE̊1zLPAT5ևu|wX^?fO2
    jyD~njh	;
    m%+0"�'*	xDQeZV72p@Xms1 I6D]hq÷NWb()p*#�úݜD=FQb,|$1Խ(=wx<@L ~Ba.f@'EB�-Mx
    Qal<ȁ_d|!6A/g.S+@Wc�<PY8]1,K?`d'FcQ&CadGq9`<e%X
    
    ε/St\f�e>cT$Hs,5{
    4cB˘,PA\4K߽2Wo ֞ty<4s`гDŨ;1KCkzȦ%irL5[վ3nRGyԢ_
    Nk·1]mzNS"iN|0C;j
    ʖ#J&tBZ!c("X|RPMq!G CpK1X$Ȯ9Jpu: uaAuU,Ru]J4q_Ug]݋~ h:n,k�/]pF^G,44ݪ[/_偯YhDg4x2{cI/RڻeFu=(4ѓMī�Tq4]3:I2OB7f[tyG?Wa<~t1UuH~yg`G|~ng~~WwKv�57`cpF4(q HOuq.lSauAH�I[ 	AP
    000�0 �P�"2u]P
    t�
    	Q(R+j(\ KYUxu
    ROh([	@l(R5_\U'y^bHP(KmU{H.dЇe [`rX*+%w 'iHn[5[uxd t.jK]tP*Aw.s.d,ъX~,8sh( rs؍hx膵Q HFvh옇脂{eXr騊Hx؎YYx+O
    CJp?)$hDȑ 	1Ƃgq6dq	P0P'6*?Y� p00"2JQ.%fe|V[PPn\2@TayOYdy0`f	%wAkɖg9Jj[ٕh`�Mٖjٗ[ bnYXXh;�im뒖X.2"- K:mh))	yTRiyJI~ٖĉdYUٖ@kyɚficW)YI㙇ٞ4IDy@cl4#5
    v -@/`H`{,`
    'WpbZ0DHr�sFjU-.$U zf	,%5ʢf6,;>Um3@*DZK!.:K'#MUUj邤d`]5W^U@EJOdG�У?jp
    
    _`aI9\]dip
    IL&*I)ʘG~zuy`vjj٩Iԙ8JsyzIn2@ɘ6mi	9	J`ҟ|cP
    (l9	`JD&I!6-.jCauZ7%<rByBybЯ [;jh@I6}`	If {Z9"#rf!%	d�t+p[==ױ%:"pQɤ{@ d*P30.sKZ	3[ؗ\ŲP
    !aZGJۦ,*p<"˱JI�u۱fȴH[huv@,
    JijI]jdREK~yzD*[붅++۲r;kz�ZYWVjN۸IK=ۣfj۸^t@o[;"jCʶ۸%p뱎kU벿;ۣik�2P
    ({`KثتOzqA[ஆ@P	Z	*0п
    ZFP0;LYI`	AЯI;Q:6
    Q`&s%U0Q.K0³|9Z,ÿ0\á6 0KY'<0P	S|).9l	r5pTXl*3#lƖ
    MK]|1l{|&l	%unj.�k
    U
    R`ȈeGl	J<K8H{{,pT|V\Xɢ<K,L�*Fΐ,%i.ΰU<dU]h$l�ܬˬŜ˂+ҼLU|4ҟ̸DO=ly@62z
    Гѝ@ `#@\\0@#7+m-ҵU007Y8<0@	BK]LU;\U6CkJm8<,C
    4SݫV]_nmjN=׵pLm#`�CXtvM<[]Pq-W)QZԵ (8mk2`P6	IF`ֿ@d a
    ~4E`ҌMԼ<
    )rm+vam؈c0z	zð}
    CU=À=k]M 
    ]\	Y(=ٽ-ݿ-]MM.MM#؋0=O5\ᦠXjq
    
    p
    P6~7
    Q >@B>W˰pMDD.ۀJN~XZPnbFNa]>?lp.ktns^u05ԁ 
    0vG'8c0^⸼mn#5[ m2^<䴲NꨮL>
    \U>A~®>X^ƎI0	0	0P
    p
    l?N
    .N֎?�A6N+A@dpگr !@n	Pƈ	M>OoC.Î?vd&&?@0US"O(*%_5p<><-
    ݄!⡄rLR?T_VXZ\^`Yd_fhjn	ݯlr?t_vxz	'O- -`	 &z[:;X">!?Я?_?_?ď2
    2
    [DoFy+b
    &tbM_1_?_
    $XA	.dC%NdD HeW!
    "F(T4ReK1eΤYM9uOA%ZQI}RSM>UYnUkW_z%XiѮ)QC{":gLy_&\aĉ/fcȑ%O\e̙5ow&\iԩUfkرe_ٹuo{SWqǩ%9z?=omѸowS77g{,JR[|7Ï?y=O/n#+T8A#|PGƳB3pCbfDo?%80CqнWEI4qT+m4#Ө@tI(3
    />%>+2?K22;@nAN<]a<�aJ@tPB5
    .}LQeQ!U?F'AENkBfWyQ,~NkuUXcUCż7)QWrV%G9tY�Y`�0|xYgW'[ǾիUp*7ܽGYu1=cU^Gc#C ~mYfK}"i"[؍bqM\xCydу6,Ɠ
    Lwؖ}gF`O9xB'`
    bsݘۧz\~u&Lu[x?9&ymۖdޖW%df}5WSx`&TDb6iV;r:s&\tՎ̹v{u[Od\nF@e,�G5|Ah-	Yr?']Aеs_{uwE=b]wko3}?߁eh`0A��gQ\G|h 6g|_	M6n~Os;o63 ,/0ㆠ �Vz9Dpm|їP[t?О
    H	mgep8-$PD􎨭IZ$Ķe;"MwyMk\d%ieFKd&mI6``�&删d!>dkyK\BJN$&05L-
    1U-tBG54A`o24`.yNO0YLv2ӝ7g<4�P>g?5DtT:)c3BPS7,zQZ hG=쒗+<EBB#_IJOT3iHaL	SiNaԧ,Km&UKE?R+\ q*UqիZuXOTf[T/UUsD*SVBFԡu1W>Ǯxkr
    U%�&Va3XFVle-{YfVlg=YІV%miM{ZԦVemk]ZV=l_m{[Vmo}[W%nq{\&Wens\ӥnus#]벍*Zw]W@#Xp즗5UDWo}{_&	eA{k�A
    |`'Xf0
    
    p00|^
    wX	G|b_xo~]bf۠N@7TPXc>r1 Er[? Sr|e,gYT~[c0[X	
    fFl69q~y	)oY{s>00/PjA
    vA;Aғt-}iLgXHkZԣ4=
    jZի6!UǺԝvue}k\cys}g@ZЪBPXةwQhG[Ӧv}mj�~6kk&w-Ownx;�uE{{-DA
    
    d!`xpG\6рSS\1i=|']{Q)|Y(X@
    ݀p`z-G]Soz?>u^�@n]Y]LukW[lӡNw_3
    _s[4Ws~*Et
    ,oy5X/o(xJ{OCpzQv՗}giسx=sݧ}~}{{^6||cYWo
    }*h~A<
    '=/KŋOد~Ocbُ՛/?�?=ؿk4?:\??@[??k�,ӺSKc>}Aȳ飾삅>B#D4pp&�A''B('D*B++B,B->PkB/B.,.<C3B0S#C)C/d.-Cd1*>C?:T<tOC3,CBB:</dCA\?B=AC<|>>)A.XмX�Q<ER,:̓$D%'ZZE[[[E^ůFb�8YEeaFbT\FZ4T@<hF_amFfEjF\ellLGnFq<OKFiFg4g|`tF^\h|FjLMD`P.O\ Dņ\HOxň#+~~HH~HȎȏ,ɒI<ɒ,wLIIɔIIdjITɟɛ4ɏH<Dɚɢȡ$mᇣIJʙJɫʧIǀtLAO`;x˷L4ULX04|K0?R,,~LL4LlL*hlLDldLĤnjLL\LLMSL\MDOSKʴҬL\|LN4H{�p7KXxNXGK*N*O$ܖ\O*��<5N4ODODOlO$OL�OOOO$P(�ЯOOOL$Ν㴮Ds44-OQQ
    Q!RQX!M5R$UR'< }R*LE_S.p(�XH@ȿp4
    �6mS7}S8S9S75S<S�7S@
    T?
    TBA-TDMT7:5Q-}Ԃ|(�p4ET:C-85OTPQURS-TU}@,T>RI$DSk�_U`
    VaVb-Va-ȁS3VfmVcEVe4gVjUh]jaViVoVbYU=[z�u]WvmWw}WxWyWzW{W|W}W~WWr%~W-X=XMX]XmX}XuMt
    XXXXX7X
    YY-Yղq=Y}YYYYYY_KٕY
    ZZ-Z=ZYe|}ZZZZZZZZZ
    [[As]ѥ٦X]x[[[[[[MZ=Y8۴=εM:)=[]\m\[ٿ
    ܃ܽ,\�
    p=s\]=]ܼ\A̵H98HW[++ݻ]E]X֍
    0ֽ]؝2xgP+]	^	^*{[nхm
    _]_E_]}ߊՋ=Uť彋56gpgH5X`F
    <
    ~m߻```na.ajHaVa^6ݤ]aeaa_aa<	b!b"b@^Z"~IIÀ`<�/u
    `4E`
    ޖ8F~ anmIan=na[.Nd.bG~ >b�Jd%dd&V$_N_'dOJ>eTNeU^eVneW~eXeYeZe[e\e]eZ)b~#:�Ђ-6;Q}/6c8Ncecfim`n:oova>Fgufe_][C6dDfd5zaH"dSd&Mfb'd.hM偆bֹ�_n~F8`0���
    -	X�؆;45fkcngqNgttFafgE\Bg{E>j.gIgdP_fq輈Yg(dg[.�5 is6~0m؆~ l.ln~`fxnf3i[�jl~*Sj⦆km.mm%BmPfm}ejm6hj֡Q&k-`80X`/~|Vgn6lvl&onNonlwώo>m.vmfma؎_5پmmܮ.h^Vىk}s˷Tn]`up�+ppkcNn/lfmlcq9@j~.r#gRrWR^pkO8�nڸ}^^`kp	4Os4n6k9s:nľs<ss>s|q m!E$g$om,o٣Y�tL3�]X�PuP>sfHuU_uVf8uXliuZu[:u]uB7Ln_aEvmc`EW\Htt6H_nHkxXlV/rSuu]owwd`gxbwdefwvv.⦭wv
    G@xO\SwsTG>_uwwuxy_\}Grxw.t?a[lyny[@퇏uxsWzxx"&x[?yJ9)\`&z&�6^z^ys{/{/7o{l{{{'zŒzu&8H{goO{v{ʧ||{wipO}`_|7{oG>/>?ʧ||~
    |,зt0Wv^p0
    nׇ}U??uso}O_z7㏫_9/x9u2H}]HA
    )!Ĉ'JGqƌ2rH"E(7v,"3k*Wl̘2g4f&Μ6'^B-*TҤJ")ԨR*֬fW0^*k,ڴjײm-ܸrҭk.޼z+wlXn؂Cyoga&SfRV\/^0~Sf85eG.ع[kPvתsc]|8}?LJejZDrW*Uu,b=ӯo>?
    8 x`) Y
    7Xa%XcE
    0�ٔ
    .!%h p55PB 6XQr4jD\qX[#y#DAtMx@i7ewU^@=M}{9&dW&i&1f=Ha)Ƙc4e&c4&
    (Q c[92w=#l&oC6pшҒ59dӔUݕjUyOz&Ŏy*p9)B3%�@h3FD(xq.&dL?Kڋ/˯;~>+0[o6|0'Ϯ=a1{q!<2Q%GT-1;3U9뼳~7;&rJ{Z0S@E	dVX}ա,p`/b?E
    pd+[31',.`3l8=֜D'fؚC�GM@p:꨻:{6dj{JqOl{vkq|ȂLxJA_k,9>`?݋?~}W^@XG_;
    ?3*UV(@
    4@Tvռ]EɨW=X0;Wd&ռ'|;>7DŽ(|!wo}\Nr!&@�(D
    %.L|"+P"
    Ap[I(0fD!#Ѕ.aqBvdgx90ٰh	6T`<$"+hъ|#8/H*QWwa3fH?)NdkMJ5t#+89ֱq-xXʲi=MˏeIsk4c"|&4/	h\(K)=lfFN2>+g.K4ԥ.)O1r�R&sWIiF^[&8ЄћhD&CK)ҧ$!:	y.1
    \n&P=vϡByz!әҴX rE&̦2UP*ԡu87TN}*TMmVmH5JU2*Xxձz?Dtn}IIKwui\ڟ:k\^@Ĵ&jQ#+Y"5cMHT3TVͪ(زTEgJZ+_8ʻfz-Geֶ-kgHC3jk1D@IJDlj5]΂5J'ܙִmxgZ(seH
    ҋ@7zQַ6p	wi'?MDZb"Tꅩb׳,wz^wMoyE;ℤW}-w66_UbZ)f3"g^(t,�)SPr2V^2lj6f>3c9en3_:W�qǀucHXJ2L7әDx4񲔯LR~j-Sp/Okj1jRfs͐YHqKYȐ8D� D#2QP"HgΦ2%=MsVhlkTSj:">7ӭu~7-y7}wm=\\W۠'?p3Q*=gҰv
    j[.a:^{ܰ
    ab.Ӽ69s>?~.F?:ғsƵui-gk[3<r+]j8®~=Cdv]jG^{A:~}?yT2ZgQ3<#/S<3h<C/ѓ^L0ȚyҘ4i]3UմƵevTQw^{o>xR'?7|♮s>/>ҥC:x{߷f{M	]=}%N]N V^ fn v~ N	 		 
    
    `Š	%@6b!"Y)_5!M!&C vv~!jC@HF�FLРYK]
    @"QLb&[6#>"$!E"%V%^"&f&j$bma")~`"**b@l,�-?8ɮ	X_/jY#6A!!1V@!!f".##n3Jb=4N#5VcE_&~bpY*c*89c*?�,b-D?C.X!="#a2*2&b3Z&v"A$B&$'F'b6>7#Ez!9V$Ffd9;<ڢ
    ԣ/Y	l	@?$LL$MΤM$NޤN$OO$PP%QQ%R#j#{\ZEFTbDR%Tj$V^Ef%WvD~G)�[[-%]֥]%^^%__%``&a&]\*bJDBec>fTzeWndVe?XYeZ:]#d&f%	$A\B&h2
    a&m֦m&n`
    j*C:,\%dBfd^fVRq&rR`n@F�ȡa$heoe&d�>f"e]n҂yezze{'|Ҧgħ^"vbcN q.gE"heĠ^=>hji2 @"%� 9	\llyg^{%(fhzgb('`}a~^~'c
    9F <6z$(q
    XI(\c=C"f$\?\B#\%p=!e)}
    y\h])`\ڧVbypR7꧑6*W bI)Q)bjngbHA?&a&�
    �%*tC7,@h((i(*)z{ʨ)ikzk
    +F+JnN+-h"Z"(:d)8vfޡVejïaH?lHt@pA#jꚶ猒(Jfk6:2BNk&^B,v2hlf'z̖a+b,##.&⦪@j*
    @jNl>+*zj֖lƚb,mŲ-fvm]klS>m)!;,--#ϺO&vj5@?x6.�	jb�rn?\-ۺ-ڒ,-Ț6Ȃ-R^,jlۚ-Үe?t.-E,	r,%H£<Z甦ޮa	,!V!fB#*
    d,=j7A~.f6lFn//#p�7?0GO0W_0go0w00cXG#zZ"?=p\⪱Zm1#1qҮުnsb1n+&nI11/	1ױ1qjfHtNZP/c*Ώ
    `iyi#k@=�injg&'&�1(q2)DZ)*2+2s>t!V2//3�(n!3kR'0f'oln2:3nj|.53(27wbm(37:21
    r\	X0p0c6$C=�3W244AA'W5r6Fhs;CsDE(8?t)WF1G{GGXEFG1E1G#:K?R*岵,=3?3NqRQO5PP5Q5M&MrS?5TGTO5UWU_5\nM[s==#0/5YYYZ5[u5N/\Nc\r].5_ǵ^_5Zaa6b'b/6c/>cN_N14Rfo6gk61Cg_3@hfd]kk6kOh϶`lc6nn6ov<6vn/w/uZbFcaBsg;h?7u^˶^öv6vӶw`x7yy7p/,>2s9]v/SfsGiO7}uuwv77'/8{wIMn"/{S\N
    07iX{8/xh8Z8~~wh\Rv8vǁ78縎x?XX8Yki=Y)trLgW_91Hok5uϸM9Xxg׸z9ǹ9׹9繞99::`�h	VfpgDg8	3<ywgƧFCFz:sys9Ǻs68纮:a+z[![8K9z:g{wz][wyo:;c0zk4/4zKPX.[;;wyy/<K_O<7sǀo|4Ձˑt	tAʷ|?0<̿|#2|<<;7==S='=/=o9G}?}zW<gųYsk=MYi�;ʳ|׽<#CЛ6;}K>wo=G_;7kpٓ5՟lM
    ||=ݷ}̷F޳ߗ6>3}G=[oN>3]uWx >Oӽ_o~h>?w?>?c=� 	h@�4$,aB
    sbDa}HP`F3dHbI4y%H+YHb3igNb6yv_PA
    j�KUiSSVzkV[vlXc>c)SAYMXԙu)J	34D!\y#㈐)t|٥d={V̹OCFJ4YիYvvlY͢U-\z>pV6x95cHY0ߐWw-(~(H˷W<~�
    <\jKkފk.h;L:SE1D#U\E4!d4md�Kϴ"o&|(0z6	uź%o2]4\M3|7G�2H"{/I"\OB
    =4*2(dɄBɴL4hI8=E6EURMsRJ+HX3!\uuVmBL5L2KdSTh[FjW6Q=]վZ\7]^}xY,RIuHg,@�O\L`vguk!U~1bcc6o3[8GFq\+Ue9>uuztT.סg9i(dK.\h#"6-NSlN^~6M[35X-
    ?q鵭`g9̄~&%ʄ^s.fҩ(oE>;u[iE&{i[u4)9m	[
    Tyݕ׺n}k{=zՉ/~E|Vc+<_ՒB\a��-4shJmnkJ 87mvFA	BomӞG)yz%ȺBl۠چ1Aۚף93ANrz4VF,.IFЃ�V�:^+_@~nCH=P-\ø<MndC6n/b@N; 	6nK3ѧQ�4B!5	JGJx6M�*SJT2T#^W$ȷ^0f?QƒYTZ\>iR4
    B.Ԧɖ=8nF&TFġ0G*iL4s4pu
    (Lry-m	K"۳e.
    ʄPDA6&0g0O(f6u&5im)K7D 4hZvR/y.^B<VHV	uC
    ^HP
    9<.s#V[jUʪFM0IUZWU*,u)9N8`RDH4>Հ>K_fohdJǶme/+ʶEeEYӢrTrU$]ZצTh#Td?UdiOKޚmF/᦭q;N]cd"ծ cb}jMUq{}qA+_voօ)v1	\`	V`?)\a/(ݥl;^RUo{k5p6nji\c9ycA?\d#IV,"=c7e"Òm&x_@{6:󘮫2(2n\g:y?9UKZˉV=Y.?ґc?_w9iO*Q`lP�Fֱ6-i]k[:y�wPEæ�&�
    4jh\_٦m=w(Z>Pg&Vlb-8=huokV	>6nHp?ʹ=,[MFKў!5|	0~xYߢq!ߘykK+1&Ys_�U`vNTWA\?[ZYyu\f?Z|9߹}ss{
    eD/맍OjqY@d̅~|rYY\wfCZ0gp^:yew<o}c>n'F'T?_�6@O2H`wwE_v󘿼Ur/3zm6sOɊ*mФ)&)ҤO@o8o4HoُDo[M`ov�W�,xND�o͂.oK2ΜII(	C8:UPI\///�װ�mnj"M&$
    QQ
    5PԎ0ɏŮ.D|+LCҐz0rPLSQcp*)K%~qRoDQَeؐyP/xPephQ*lQݨA
    mz1)aUm?QؤE4�!R!4"'2q7-/R#pqQDA/$O%#%_"_,r#1g&؆$rM2Z`R(,b@)))*R***+++,R,2+s2vrk((.%.../R///0S001S11s0N-VM%G-2.33.c�:3?4CS4G4K4O5SS5W35_6cS6g6k6Y2PEh
    0֔487(o(ζ9S^�&ޖޤ2Qs<2<<=S=ד==>S>>?S??s>M@	�:/.-5n@HWѼSC)r<C;C;>?TDGDKD@!	x E#�F#`
    `ATǑ..'2GޚN;/2H*02JqC[NJ4>CKKKS:`64Ept7G@$(Pp4JcLdҳQTKQQS	!LϴET4$tGOd/-T31YPPcP
    QoCWwW5ER \XA4'$xN5O7/t_d[UVsuJPWU=u]ו]?4EXUXUF@Y4	itT%�
    Q5[?Z1[\Pkaub]b3Vc!X5FgtF5_uQq6O]5:I'ao΂b&Vb#bvc/vhh3E7�
    bF^iYK7a::դ1`gVg+lvW1mVc4i@? oщQՑ7PVpmll}mUmq@ &r+`nmЀ&k
     r!!/spOtPVbu\+quvkw]T@i2}8H%$U2u7Ҧv-vqz4RWRiFw6M|Ҏߔf7z|QTLɴR/5TS703ėa}vKStRR}3U{}HG{2W[y+WT^c5Y6|-,Z5|%[cbXgk؆osXw{؇X؈8R5^^G_E^jw:Ś_66B5˅_Xu'tXט؍iL�瘎؎؍SczE^Xsd_4BKteS"XPcL'+yؒ3Y779iiVdk4nMrz4�T-fUp!9V%Ya㈹h0Yٙ6Vj9t@tO؋ɰǹC#y๝Td9Y7r+WryW'Oyj@DKewќSCϜ74.CZGKڤOS:xS;wGY!ZOZ1Pf=TO3z6:p;:<9ڨ%2n__0`eqOZYf<%em
    Ze1SIڭP/C:I7S8`Vo!lUOZ'5wo
    !XmY*˱ZgW²/{9o@WtG!UXc[pA~[۸[?$嗶xSr)4]r\Z[,6{2*;[ar۽JכNM3[
    |[
    e'\/!<:;,C<l5A9\O|	n*V|H<Ggl@qo`M]Z\Tl)-LJx\Dȗъ!
    ɝ;ɫ\;l{Oʿo\#M=<lȜe)|\TG%%<\|ld}|]
    /<]'#3]T*];9G=]S]W[A(Agkos]w{؃]؇؋؏ٓ]ٗQ@ڧګگ۳]۷ۻۿ]ǝ]ם]2Ta{n^^#^'+/3^7;?C as�S^W[_c^gkos^w{^臞^ULgH-V꯾@뷞^Ǟ^מ^^	"Q4	
    _#_'+/3_7;?C_GKO�p_c_gkos_w{__1a0__ǟ_ן_�;���������������������������logback_1.0.13/logback-site/src/site/resources/manual/images/chapters/jmxConfigurator/statusList.gif0000644�0001750�0001750�00000106577�11377016712�033674� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a���ZoneP'�KFsT-2mº>eǸuMcn	�Z	/ɔ2C򯸻oR1|Ih��X橲m^
    {ǁ�=UkL<trVCzzǙο(�U۸�Hҡ(�Sj9\w:1п퀸TφhzHb1@Ծc!kOR91 x#_|_�k�;>,Y�Q躒�'{'`d�&lN̼ZnHU\eޔ{e�=�5OFT�U娚j�T�`+W�e�`1jx�1ujfPhNn���!�����,������!PB(	A@C<HHŋ3jȱǏ CIɓ(S\ɲ˗0cʜ͛8sɳϟ@
    JѣH*]ʴKP/A:5XkׁNrtJB!۷pʝKݻx˷߿LÈ+^̸ǐ#KLe2k.TH]Y
    ǃ#(P̪㌬װc˞M۸sͻNȓ+_μУKN9]j;u
    Wѐȃi˟OϿ�(h&6F(!jBThfv ($h(,B!}x1Ǡp�4ǎ�qc N=ȒL.yJKӞ{TViXf\v`)dihlp)tix|ֹ#٤ˠŠQBA+?n ĤI�gi5駠*ꨤjꩨꪬ꫰NP(Y-
    ++hnl&nJ(tU.+QSF+Vkfv+kC^n<$ckoWsI{o+>1b)':hF,Wlgw ,$lɵ,0,4l8<@DmH'L7PG-TWmu<QP-6 t"eu_S!e6&!`7
    7|'D-@0);9mgw砇.褗n._ꬷ.Ba	E5kG6Hڽ<O!d=4}~S�->h$	c	*(/o�HL
    .yˁ?how:!A4@4Ȅg=ݍoo
    |@x@@H"HL&:P]0$8(*ZXlqNoz;aROpXF2}AG_0�؂긏O IBL"HDR1w`(@_]	A T#5{-T!]bˆ08xA�/|EXX�@d,b&1)e&1dNl{ĆI,AWJL%;8ψb=?|›L':MBІ:D'JъZ}?�FmcFwIhRed=yŔmL-JW"8^QKNaEW2">fL7YXS2v!2R)fԭ*
    j!K@G_WR@UMUbkmkņ"EP?�ֈ`?,AbH\*v"cX/�8bbMjT7TRMF<�$Z4d(RvoH!l	t*`\l[BWpb"7eMf*X1ܐ2c-/Ȇ*xv.]BubJeC
    Z,7~靘i+˲#@l١I0\?	Q0a^z!ZvX(NI(N�e.kTdvo_7nD* Ӎ>p-`Sڤ]j.`vAEB2`?5`fBW�gfJ=`sDiqJB@.Kǹ+t3ܕ7Бvs']<9ѕ�/L,DЈMh8+44Bv\оtWdb6fR?ù~N.|u6w^ WW	?(mihǺPvMfM?{ЦhfKikxjkZG%f57@o1{	O=kWF5o+\V4btٕ5g\GO
    i0ӜNҗ;PԧN[XϺ֫Q,fql3&bQѣaqc-߄nT3a'2qWS8(ZqJ$G&i4n��%OƢz�/BqyC
    aˌ�8?}|UkVo
    	PA/P<>7h;K~qPX&UJ,aX4LϽ5�?P{棁U�,ӯ?2T6C�zu{7�W7@��e6% nx�`[rP�+@G
    W}elnpVl
    Jj8Th]qw�fnC)~,
    ?ȃw	BL8g``vp	JUJW18h$I8�N8rm=CWfG8h8xMP#xU|px@H~@V2i^m|;ux؉Hu&u0vlhacZD1v$Row=5\I4u	'eS0	(��$@xi] ZP
    	6��n_Y@
    Ђ̔`pi
    ``zi֎ШNuEW(؂L(fȍY)x)荎9w	
    8Tp.z Y~y{�@r)ygmwUxyGT�?`
    I%yXxC	ii0RSy'`)wF@`؈و�&3y,pY8
    blh^	)M{8ٓ7(+93aReAmCv Aewv_Êvlwwc�	`wJFSЋ'eg 2xX@#8(0TVC&י	nkU9TW`О)AWsVI:w.Y^ԉU)YN&.J^Q:�&Jz]!ҌiZ . *:.Dj{ՠ)gE`๟uMUZ_*(ʞW
    ABF-k
    yNHi*Km|ڧ~:ZzڢyETip	fE^a4R]}		H�	{pw�	�$ 9g0xxe #jXcCpCe#4ie
    pxzتܺ4:TGêY0T5zp麮fWgWz*zJ#Z0�㪕�۰4bz{z*XkWt%ٯnPH9K;YkW(:y`cZ'EpMɪiP
    ^=۞Q{9Oi@?[Wlʧ	yd7{xJ٨xz|۷~	^⩄` 	TTP	ivR|CdB
    {	axx
    *�^EPlzvp	zn(G vy思
    x)#+%X�G zTK[ݛ{[W7ۿClZ9	<P
    PL`�,׻p�,(CrC
    z&kL(cp�Kn!{ѠNApN4#z+8.\
    ̿='7xVSjZDGL#(7Xb|Iܿ^KlX7ۛ#`LTLV%0}NM<lEl@<t#U\Ȕ\ɖ|ɘɚɜɞɠʢ<ʤ|0
    I2
    X5]5ʠ8EV]7va Å�
    8Rg01
    g BPE X	vzgDWD  
    ې+p@<T|Nfϡ	Y<R <m`z
    G |gP0z6wfnӶЏ 
    TOy=T0%=ОPE`n7@�-=T|G:Ϋ 2$&-LΆuhmTL
    %K+Ymбkn`2L Lm+-Y`		T�H<,XknA	prMמPG
    wf) kF+vbرהmM ~*Jd2I1		шYcۺ=ت=۴}ȝܲ
    =]}؝ڽ}a⩕
    pMްYR|B 7EJw>1`
    Yv>m`! _P
    ^pu�@`u
    #^*1P/9.0^WE`uy~+.1~)n ~3A) MRnZ<6^:^K`;fn^᭐a.E}>THc>j.:~NIP䡰I6^jՉI>&� FP`|:N~Xq>�z>~yN;BPs~xᘾ2+᯾>3.bꡮs>b:nΑNd~>^�?_
    ʎʰ	pp6_
    Yd}r)T̢kJ&,m04_5/;<
    <2H_DoEI/p``~?/N#>O/#MToXhiZ_Fj?2.]?noCUK|v?t/ZOUg^~D~
    n<Jy??_.@&i_>_ȟʿP6 [2Xo4ci
    au�A"B$XA0)/nNX†#ZG	CɃT!D7,eΤYM9uOAiD?9Gb
    eSQNZ՚7:cŪDM*Y.rSׯbŎ5V?eXPxӧ?a@ڄ@$�P;Sx4Ce)(b%SC*tj7[ϖ�<ڤ_fo{
    W•/gs<Hru+rqBzIscR7<ŶC
    #Y2<q3x2Ӭ@PpAtA#pB
    +\y,p1CCQyQqE=i2cqFkFsqG{G kE H$TrI&tI(FxxJ,QJ-üyJ1dzč  ���<P`OG:�T(3PDUtQFuQH#tRJ+RL3tSNSPCuTRK5TTSUuUV[uUXcuVZk5NsuW^{W`hP0c@0Ugvl]AP$ Ѐr \9Uw]vu]xw^z^|w_~_x`6`Vxava#n	9b3$8H{bmKSVye[vecyfkfsyg{gzh6hVziviWƶgHv4gkk{l6lV{mvm{nn{oo|p<$|pk
    wq#|r+r3|s;W\A7tSW}u[wucw܊ms+0q׽v޳kZvW~ywy裷|z
    x ~{A^^٦k>|ɯ'>q�O^
    x@&Pd`x#٠w>)%HlX|95N$L:x[`6qC>�8AC QC$b60yB%Dq�}/R"
    ,zoJ	V<`0C/0kxG<Q{c+<|O#@
    {,d;2rJ5B`�2-lrvl`?gJ?Rde+
    Jr,ϧ�\Rb-/^C>/`qMT-ل6fJn-8aNWSdg;!H.2$&</\D>@0t$ԓ[x3:j
    sۼ~S;=QTHINb%Ţ ]Rdr\@4A91[88QlBRSʨ3f9mfU%+W9U5#ek["Ng!gB>�TBLxZ5@jW8R㰏-a?�3^fg5Y^=8*Ϧ]TڮUmm'>D�ASmaPݾAAq0B&
    wb
    '�fz~-+xZԚUiM^nsEm{_wrmnwRvo~_"eAq"0"^0Dbnh;Wı{Kجeq}bXr;\��MGX.xhl3@1t-\w8'ryQL[(qi9Y,Xc&s1po`fk>lS\ܫ32 >CPXSS-VV^]KU-{9c=iPj'<j<Χ fܹC.2Dp)an_Dš&vN([>lhϺvg7[^B>q`;&ܺ}JwǦwmd/N<5mg{.fexçx-|ƻoG;7h\(G.r\Koljgܿ8usZtC'zэN8:ϽGKD*-ԓ;|ԶЏu]j+P
    k_$oke?{7}q'Ѯv}|>]g<w<,
    okH$W]_=yЇr}Mzύ.`}]z^}m{^}}{_'~|'_g~|G_ӧ~?}W^~}_'~_g~_O}�?�4&$:@L@\@l@2Ȅ&@
    |@2@@AHx@	@L&(xAAAv|AA AAB#<,B$lBTtB)B!lT A,B-THTA0?182hA0CK5,CC6tC9<KCm@DADB,DC<�Lh1lDG,SmDJDKDLDMDS&MEQNDSETLEJ,EPTEWDOlWEZD؁CE]A/|D`Fh!X!h9ЄHp#iFjFkFk�
    x&xhFplnFq<Gt4mFoLGwu,o|GzGjFE}GBEFFHф%X:8Ȃ|qFxHHHHHl`NjHȌnH,ɇI4IHɕ|IȐGB@IG^GIa%lHkbhJ|JJJJ``GJʩʬƭ~ʮ,KJJ4ˮ˵tKKKDDIEIlD%PFl�eDzxL�lLʬL˄~L@vkL,MnMl<ϬՄMlMLȄ״MɜN<ͻ~\NKL_L?d9@98LN\)|XtOOOMOOOOO�O-�=\]O$PP
    U<Nd&t-BLlQ:@@DL=!8OjL
    Qk `Rl$fLvQ#mR%-$-R+R%R$}R|)ER"#R R`(&u7]R55S:5S60R.=R=}S1R, S9.BNEm]7QNÅ´ĜMFm�MT\8?fH~HUV]UUfxXWUWUXUXaGTYU`Ua
    V]^_mUfcUfUhm^}_]SXelVmUh-VjMSaUpgV]=Vo5m]jeTlT4QF}NGKWÅMTTLOQ\тRTXu؈XXXqm؇Y؍ؑؔuXnYٕ}؎kؔUٖeGUY5YY&؝}Yjٓ=ٌYإڊة凖|WmHWZ@QS�\8[UU@[U�R2S٦ZٙZؐMZ[%Y[=ٻ
    Z]]ܠXåۺu\}\ƭ\ۼ\
    
    ZGTHPD%[;8�ڥ@ص@]څLb~(^EM5]^E^+W}^}^^^u^5_^}^=_M]_u^%meU^ھ<`A|];>}d]P�}`}RmLl`a&aN^a6aaaafa6afG .bF'6bvbaa"a'$.baF`V`^㢃x&Fa=c>>^nc?d?a@c,&dE^d+DfdHCHJ6dEcMW6ӄP@Q9AOLaheW~eXeYeZ~eT8vdZe^v~[eeb.`F].fec~d^fhf_38MG5dms,TNUJiNZfVtfg\Fw~vgegvg}.fxklfrnsƤHh^hnh~hn[>�vh舞hhxnh~h>i&38�]聎COiiiiiijj.j>jNjviMG~jjjjjjjjjk3fjNk^knk~k6Dkkkkkkk,0sniNl^lnl~lȎlɞlʮl˾&l^Xllmm.m>mNm~m؎mٞmڮm۾mmmmmn6#i@>ZnnnnnnANnd^onono+GF`o8Xp/po9nn4o0XA4p
    Fﻑ!q?tpƑ@nxq D��'q?D&`&r!_o!$_rqVap�+!q-.g/Gq1#nnmP,yX8`Dp"$os
    ;'p(Om)*+,0i1#*$8Z3~h#XAt	oQ?;/%s's#g<wu=&?ru[r#ZOA?B?t8va/Dr.reGbWt,OgEvbWjvmvnvovpwqwr/ws?wtOwu_wvowwwxwywzw{w|nJn �L8OD3PPO	STUxYWuw^u
    kgE_ygvewvt?
    ݭ"w-IX
    �w7	�Pp�@sxYr\;zTzT/_7ykGyWyWtfd'vdyo{/l~e>(x@܆'TPzxxzsǗz{acoyk{_{7 y3?@3ػ~�,�DOoZxv|̇z˯̯w{GGW{/~/y}OJޥݯ	�_|u~	gP 2LH`CNpÌjq#Ȑ"G,i$ʔ*WL0YSM$N:
    SM7DJ4)ԨRRj*֬Zr+ذbǒ-k,ڴjײm˕?X~AAiˣnwɄ'&0nXE�
    qh2̙j3ИY.m4Ԧ]֔زgӮm6ܺw[rūʗ3oē$nz
    f;Z<ֳ_5ӯo:L	8 x 	* d5\]wW_W|bD
    x!
    T`D5ܥw"ޙZ)^7#kw#95#A
    9$EydZq&#|qB;TYF#ee;'ı-YފދA\m#qck"y'y'}yIx\r(7 y&ify)q5)(#lz**_Y&|dJ`kcNYe:싛r)*GZJ;-Z{퀯ka#|+fvG,ګb//Si;p�^ù>:Yg[y)/k߽%˙2-<MzY`	&CfW0^Aq,ESI+F4u8U[mu?Wk}u?x5a{uޡ{6fv0m36ܻ~37u}wݘl/7V̊Qe<n79
    đGCC=3LkQG[c-d}:՘7k:77|hS;?<<+<;<K?=[=k={='U3[֍	�cvW!n>O I}ҏMT?	h	r-c3rM\p
    vwx!c(Ұ6>!(!F<"%2N|"()6pU(q"32v6(`h�GnpuT(<vU'(Htc!H}Є!	#G-]vW
    P:$(C)Q<%*SUVb\(!.%q`?&Ѹ
    �ҸTA2cH@cq4=
    A4d#)6H',BL*)le
    ?	yҳ'>}S	w8`�@PF\XQȉȍOHGf23ѤGv?$)yf*Z8)	IsrSةhӞxI?*ԡF=*R$H70	>l`XB0:1L,enԙ=Diդ\CM)ҥ_#gJTW8
    sMsI=,b2J}EAᅖH(,f[LWɴr4YX>Ҵ
    bM8tmMDzS*`w:5_k¤4Rֽ.v6uwjf39uDt0}o^_tP/~h*VNve<,khJНaN803nb*(D#{߫2ul_(s#K1`\
    G¡|LC#oN~2K65\SMK^	ؽ33űGǗr&y`	h&fgEKXR~4#-&SVn+ۅe3,jun/j:΁5=9ɋhCYFt'-aE><Lgːrv<QY9fm/#60N.Y~sK$F-@cӻ);eˬBn+K3Ӧ6}l߇6-so$܌	&G(crx5rXgFxwpmۆ$ :45~y҃}S$Owr^E	ۙ"˄-}sv׀=qtgvՆw4/uf/a4g?Oojr.d=k==c_[,WnGg(yl̝G4zM]W}=}CòxO}	`'~=_W @@g"}<_>- 6`v1U}qQQ}	ìdWj~[_K�^
    	Ԡ
      `!!&.!6>!FN!V^!fBIֵt-	.m0Q01_n.ɖ}ӄ�`nRU
    "!!""&"?,#>"$F$N"%V%^"&f&n"'v'~"(("))"EJ7A!BCA-EA`k Haxaacbs}�363>#4F4N#5B?T#6f6n#7v7~#88#99#::#;;#<c*f
    HTMUU]UzVETh}@B.¡{!d/ڡZ
    "Ŵ`�c{@d*#Fn$Gv$pW^^fmfcw|Vhi�/aZCZdZPdEadP%QQeR.%S6S>%TFTN%UVU^%VfVn%WvW~%XX%YY%ZZTdWP
    ,yy_%`f
    &aa`\Ubc6fTLdP%fff
    eRng~&hh&ii&jj&kk&lƦlΦ?@d�[VYm]e"X؇X_&r%b.r&<s>t:dNfD\&mfgnw~'xx'yy'z'i?�;<�}�A	&Hv!\ʊ\R۩qC}Y$2'&vtfVfuZ<(hz^wn~((&{2�(̧?4%s覈,&g)N(dicVV>hN)V^)fP'-�hTÍƥT2)az橝2h)s2�*F͓hj)6>*F{CPr?ZZooƩZff*ON*j#\*%Pp*zjH(B
    کn
    *BA魪j鸖+鸾j;K++B*{r+d@ó)赞*�#�,(*|�4aC&Ʋ{nlr+*ɾƊl6軎&kƬ,,xg`lBJixڶBXl�&`xk>0\-n-vrvժ.gf׆
    ^D
    a--2'6m?-6--׶bm%..6>nmC$~fl.tCU*B&,mՎma.a.*`ozB.V^o'T�*vnix:.ղAoA\m�f--K$Lnl­oo��gV/bo~o
    �A	p-�N/0~zp@@ϊogVHk7X¯�	܁(ouo춭p!dB~jlf�/31Ƣ
    
    2 -qBo
    0$G$O2kT|l2qH/=/m.1@Ѷ2PLGĺX&1qBqD.&p�M`׮0� #/!62"Wn(S2::%s&W<w'K-2)j+A%7Pq&(4r1..7481Ot05[3D014q1F_s6r tJC"s#
    :״M0+<s(>W>RUaBV$t-B37sKtEw5	ZCsHGs.sVst4EgtX[\s3J4/Y{z3N5`vg	�}}ځb'޳SU:qId7 >5,/:\aJ4Dhhvhihvivjfh۶h�6?3cVoo5Cwlp6i6jk3#22:L6vgv�fBn:(c,g"ma0'=(d6g[0g}7~v~7~3n-xYvttu˴vO8W8@Xw
    eEҩ�fm~6xG38mv^_SAg撋f;y?XgDPy[a/_x~9Gy&n-[y#yii>040'9y빟97#oySҕQ:iBf[:k^wyx&g;@zWzzjze/:79.e宗({'|>|"6~yyz?}9öu˺z?wl;&z{k:iV:纸׻gy:{kįxyeyw/K{Ǫȷꭎ|9Kz#:|+:̏;?9?뼧<Ǽ}ͫ|s:|Q/zпs9W/s:z}=;|ý3|_}7z[۽}Л9RB΀f'gS<yCg|w<ɗgbQy|}<9ާ;gٟ;̳{~“>ٳz:<뫺/?>>_<?=ۼc/?׻@"{r(O|[c#&W>	XaB*4bD)JlxcEyQG8IVweJ+Ytre.y%Μ6aϗAy$Ϥ95ihT;B5iUG[r+ؤaZ}ZUԥZbͪWTt;δe%ߺgihQu&;+߸^\\ޭ9_grC.-UIA`I/b3~yrȉ7|YtөWW{wW|x7Zt~=ك~|?ߑd#e$d1̐jp1՚(Ӊ@'3Cp*)M܌.hr(PTp`0SPjL§J1D S<2D#4Tc5dۏ6pӍ7߀
    [0qNn<n.:8NĮ;c=uB8@?}ԟeR
    
    + =37kBb,TQU+FETI4 +#g02uI!W#Y]-tX$Xa!Qe%GӾHm^M6j-z-8D^놥n<.N9N.qO=X4anH$b->KR0؍AѳrqeG6ZMv1ِaKcUoyUΪg>6:Ic]ꥫ-ۊgvN6&1,L2ƹkY[&q4tDv2xƌ7}_8%w6-rlMm*O+MU"xJ=hw.}F}Pc?nnIq,Jt].-y	�8q$}7ߗ7ݿ.`QWtZGxVo^gbPX@M-owT@> DP4cpR6=zޖ.%p^]&
    /U�0׾Mn\W]J`(@/hMa)^Y"*xn`$iQ(z�gCцa:=·1"("ʈHGd7En$)YIK^0]4=JO:WvN9&
    l�qD'Wя/}
    C
    ]Ig>є4M~ѓa6B
    <(,PNsv=P'41wgSvŞXq'=9ϦP�1NBP>ZQ"TJb3Q~!)I0re7M98p.dueBdu9Nyw4|.ZuBIPCQ>ՠ
    Fm7R^YժGK|2JLJҗ61OֶUIZjQ5suj]*UF2[`	[X'
    kJj	9fV^+5:WV+پzdQI#{X׾mKMRO}+c#KZ6f;V*4w^[QRl[]^6qR!&d+[
    \T<zPpó=jr׹�b'UoխcIi{)^_ve-I\bx(IN8s,w!,yj^J825.l\k8=6(\e.,*ҿ!Uf5q<g dvƞg?y.33]hCх}fGSɀE>(]iK_ә9iOԡI]jSթVYjWֱij,4/E;l@ۏ:?i<SjSa%A!Gڿnw]o{߻ݷ23ػbc	W8Ov'CnnS;-mWT4I^r)WYr[cŸ ^v?Wc#TX6gpY{ԟ1.3֙qE!I\^viW.uI2}-p^d`(ƒNt9ـW/mW۞L<u@]:\߸]n9ywhw7'u>l
    _^
    Ik8<
    eH^7y(k^ї_}Z|ﻛq{›_}>/+?>
    =3_bƮ�P�9-&zN-*@$.
    �a=|:V[_OP]P&sPw&p.{RMl键)		{F-D)<K0	%
    
    h$zP
    א
    
    O溏#p},QO	
    Q0?/3q�(:@h(
    [q/!Sk0FNQNL0wKPy|`jkqrqTD.
    Q18;Iɛx۪Qq JCl2ّ!!RԊ1C187n1yJ!$GR$K$O$S%WR$q &{ %
    "w'{!1摥p#S&u
    a)*R*R*2 er&a+w&ɑQ'A),I,O--ղ|2ְ2../.[n-o//A-0G/m"),񌾰2[p&2MR373A2.2]04KS4G5apjPn..=c.lptSx|77rd38Q
    8q65.9937aրS;=m;C7oӻ15ϓMS=);=SS>?Wrm3609;@7-Ast֖B|S7-@ByB)
    &BU;a.SE(1-2i3Sb*u=73s>HSFTX3\Cϒ9RC=T/R6t6s0I%TJ8t/gIsKt@/8K:KôK3K46N3KMrJ_MTBI.3T@˔6t:AO4PTRN5mJBRTR2MtAI63NtTkSQMUrmvE/HQsHMGV2W{*k>WCsViHs5P5UT/t.Y9uROUO5N
    Y5[ORtZ\CJ\[ѕ\^9DQN3uCuY;]-M_D]4]_`Z\#va5\]Vu\u(]#y!FmdmWQ)Q6GO"Gq5eYveoUe=4k>UXE233'Y+RŕJZUZu^AU0vb	4/3TR!uL1_[:k%@Q'UlhuNYCtiS5lbOR]V^i[``-�<}<uv&qv2"eRGeesqwu>oqpguqzcŕhntEi6SWauhTi#]vuuswVu^ZUKyvtQ7վm	Vwl;mkWxvyb_wwͶPq3pOOcC6s%s2k|ӡ2}73rQqWfqfGmX/w 7wgQWzlewj6Cu@ݕav]vt/#{
    aWz'{ׁXt-vEz5RM8^w7	[xvI9^Lw^u1_TV۳ew]vq_euV)>-Έkn,vxw80KLSM5xݴYvI5j4L/UX7TU;USX.lCjR؎48G5Rw؍xD	u]:9ْKuNx]k7QCyXca+kٖko۷r7B>uY]I!HIsٶ'O-nAZcc˙G8fyf~Uvf'7ٜٞ97}ҚYsV{9cٜsyW'*U>Z7ڡفY��!Mٟ{SW
    ꑣck)GSwX;W,SZ<Ϩ{!ڜ%ڦ'ڢ9ڪ|<z@ګcڬQXRU$繪Z9ZZMazzQQ�[A�[#'۲)sz=۳
    K۴_.cyc[gk[_[9hOcuE:gw�
    ;m[ۺ{[~{I[Y;eٺyo۳{y[iΥS[ejd@+{	\ڽ'{Je%
    \�8\;;G<yS\ћZ_q'qA-
    )�;ǁ
    <ËI\wđWʣ[x\G|{u<ȕ<̿|\EL!\	ʑpa\aܢh7|<!o'+ݵ</(
    K}\M=ȓ[xgk0]5}KdBXɕ`I'W(=ّ}ٙڛ}٣ک٥=}ۻۿYaxd]_<{q霌)+٣ϥ}ߵ^ᡛ�
    #'^һ]7K׃>ͱĿ޳Y_c^惁k{$^){=㇞w>{o>ܛ_g^{^ws\ҍ^ǞiPE>{>汞~s~܉~EW^^#X/Eeθ_F^S_W#3sq[{y[Y_kxn_O4J�ZpA2}M?_??ٟ/>,Ÿ<0x-|1ĉ+Z1ƍ;z2ȑ$K<pPLpd#
    JD-^=4ҥL:}
    hT5ԫZ:رc=VjѺ}ڬQep3eV@!>8Ō;v<K+[d K}w3Ξ?]Zլf:\W~U+;\f-7q/.w6̝敹s翏
    =ܻ{~kV=&`Ѳ[Cns̾CPgrX6WYp	%-`Z_<OtDwׅ'WXxb? m,hx֘
    8KTNiJfav1ضZ`QiUNy\&p%gaSfnc&cfcMHat}8oHo*"DzbNhE:Ffw?EnhB*BҦjЪd#:ArFMFi	]^&VY涠[pZN*s>|aw蠯nZ{蘽k*�J*ayCk'ZƮm\iR%lU`:-&[qmel
    xjJGx裪("&ҁ]t
    R:4W3r.[jVM*4dC]jm*BwýgO
    xmOO]ڇ+`=5c-j$ofz͍
    ȰuVhM<{VN{>Uλ1-+;`,'k<G? //}~\Cv@[tM/xvv>	~3
    `
    8%psԇ@]2j)H@�n[-w4Q*9*HrDZtͮV$^t+W
     �+Dx[rٖ<dm	\HE,6o{KϨrh3aUσqg}[8?6Sk 	5R黣\A`CBK&0dWI!OHIq'kxvpa:tt:$
    ^D}¤mG4fX&V2ײLgOR,4/I	M%zK5h[6GoT<e+W	Mj!=iBv6pl;VS'
    :I"Z(	΀&%&Z)VB`DYG-}^glʨD$Nw4Mmt4r:oE'ֹqQCEΉsq)	j}ħGPZm ?^5jЋ5%&=JC
    4QuF9WbҪA8?=^.T]HiE.٪Ugi	}-Q7Zu|#R(CAuxc"ɹBЩo[E9V*5q6ѵ}KwH65՜'[:nk.w2s՜R7שޝ8Z];vo
    ,#uZ!bj˘vgSbjQ=-U|m侖RqaX8.qF\K"
    f;N8V
    p_۴.խI1%+L*1W8u30]L|B<'D'b/+"'CwЊV43bg^LkzӜPzԤO}joxn_
    V7cִoMXǺԢsUx
    R+zsk8�gn
    hK{0.)RT@v
    nS{Vk\{v5=pYw=|{mhf0p
    	/cݏvzXg-qV6bo1$/Or�;&{F8Qmngoo]qZW787>lU	FK}TzBV>WZEy^j{:6z{t:j7nsf:U|[}|߹ɶ|Al~j7VC푗mԎvcEtŇSvԫ~oL௭lA]MW8]_z=Ik}^g<ϯ;Q~tـC}'H}'r>sg
    aΗvlGG�ph!($('ng6/gMz1.GuoPW9;zhf+V;EHSVg|h|ȁ'H&xFdЂօFr35Z"ǃikXu>8x@_kaXx|_1shT(~!YEԅr8tcH<ch(`ȉ艟(HhȊ芯(Hh}AkCqHlGFǨ،=Ȉ+e(gtq(Hh爎{jWŸxT覂F&
    xb F>ɐ
    	)I:2R&x(1A$D8H&VĘ'y=!d'=sX79;ɓ=Ȏב0IdXKɌ*ȅ�`&bl?ɕ]_	a)	6k(qUYa#kILyNIYX&/ɖ&(>Y
    9IiY<vC|r	IS)pku8qjɚ	DVik雿I)f9@aɜ	yY	{BiYɝH�t%Y9乙ljН)IIx"趛&72	_a扂9ٞdhʡ	y{)6V
    z&	ڝk;ʣ= "Jjn$Z햛e7Oj
    0*+::Wj0:Y鞎>ik*@ژFjS٤K؄yT(~z
    :U9Yqlꨏ
    :nCnP*CȩЩcXW|ʢ*Vʥ_j'ɛfzrj**êZp0JjZZ:ZYZk�ʕ_jꚊJ^ډji:Ij͚њV٠j,*ʭ
    *j(ht (Xyz+.054:K<>:c
    a{Z_jڴ1ʰ
    K39(,۱"[i{j;Cۍn;:r[rKC{{p뷯8ۮE;8T}fYȊkZIj1j湵ڵ^Ja)jhx{@k˺A[{{q[7i+3ˮ˼?˱2gۻۺKۼK˻ڛ,;ˉ􋽝˻kAڹ`{4q㻾k+ k<ۼ#L;(l{\:,*?è[/|=FL@B<êlK<Dl.܋M\K,Vl{+̈j
    ,s<,
    a	cZ^̳4ƅY|>Ï뱈뾆k[JRĞlÌ<‹|OlƖlʄ\ʧL8,\lkˀʆ+:[`,Ǒ{n<ttlǼyjӷȄL\ƯŇ|*LcL<?l2lΞȐ|Lɛ\XL]lσƃϐg\_Œpq "�%m')m-/
    -5͌Nik[Ж;|ƭ,,GG\	
    d|E|DMM]W,λ	mDOϕjM^Ōjiӹ
    I*-؂Ӆm3׉9θ|lh�{kY,P];K|}]뼬mۖ}k;ɦM۵ܭ[ں-ɿݮϻپۧtz=ъj}"}=҆M.ߍ'<}ʚk)zDfYڝ
    m-]i4-ኽ<yGY೜)n/͔N40`<>n!#^8J<<R^›0N2mi(*
    -~n6I^kF'sNuZ6(ȥ%mb慾�,^U{NkmJ^v.7ڝ!cbB.>.+jҬ8b&nnǎ(Z}.Z|N^B!.C鮒.p^�.~U:n/>.O1X#OкN~'oNr^7n Q]ZX>'/0?9Y?;zy>
    ҵ}iQSOîŮsO0_dJolnuOwo^)Ie^؁/߃Omn^O\~4ȆOc2Ώ 
    *o/i(/a{Dˏȯ_N'OoQ׿/,o�O@
    DPB
    >k=F`9W
    Lca@hO$ jSN=}TP;#ETRM>_ҢU^ŚUkO^N*@ydeZmݾW\uśW^}RQ#G ɉ$)_+[9͟^2ШSzZ)hѣfFZ_Ê%lZٵmƝ[n޽}
    bƍ/|9XƎ]”I&խ쌔t۹G }]M]86ٿ_|+\p3W"26#/Į={3mB	-|B).B
    ?D$Ģ=NZ/>1FgFmԏ8Ž3NjN@Ȣ:,
    &I)7D&<
    I-DQE{F1$L3D3ÔS,Ǡlʶ2=ٳ+3J3B&tP�
    OG5T+MK/4SM7kMxלNEˤQQW\UP'lVTo.`S_6XatG7}39	,N\Qc'U_Vke5Pma=Yo3uűz\sE7]يmG8lLH:4#EPI|I#nEp/Lu8b'He$*ZKF`Wja^bgfb+͋yeYA|S^U_.h<IDžLuZϺfNZLmTEgf=I䥝	injm]42Gڻ!:{[+pWHv(<+c8e;>Ufu՗j.pe=
    s2vn/7xH!K7z|=(uj{_*{bEh's{}1z_}W?~};-C@2	/A)}`'Byd	
    T¼ꯅ/�?X0 �1B
    6xL�q&Bء8F%N|_/i)zZȅ X@Ў oG9ґyTHY~#{8r
    #v=#1)M‘L$CIQVr~!wBц$'QS$(/ٿI JdJb2a#Fhl\ʨdfi9=H}$g#8HOd<'9R<gp֐a*yOW34YP
    FМ|hD
    QD9C.%
    Pp~JE	iLdX9)'zJ6Q/Q8I7(QqDhI^H:Usznq,)ՌzTtjW=9};+U	:^eEp5b5kS:w2?Ac0Bb[tc4YM~dVÛ-x;?*\.fk!`N4l'_yUƖk,Voj)g궶[ݭA)
    օrj'\t5a׆h:+)DzidCΪu'lgYfi;y;!계3thRqlOCԟ	|†t'AX*x!I`~,N1#B>pa8OcX$!5I%r"8zEX7c[<M%;M+DCf*DlYDtVu`Ӫԟ7EQMqDő?Z04_@VOzʴE0BuZKꗝ$MOd603ze}N+)Yхݡ[#% 3Jao'>5ObJ]	qU?:o(܊Y=ZqQr'^luCƵQI8A%ag�]44/-nLUƖ_͒Jb}!nU.:m5qw|-Bg ~d)dldV8K};5Gn_|xЅ>t+x p`R0yCՏ08?)ڵ:O~ŴϿ	toѹJԽ�pcgh	ekvE=mN7>{?yrWmG#Z{k&iyַ.8{*Vъz|=WǦ0XG~}pbz`}{?2W?wiew�`XGbcGߋ\_7i�$4DTdt	
    
    @@={?𯶙[yAc=k !$"4#D$T%dBABf
    B(T
    CPAعrK
    &r"(;%b7l:;<=??A$;C<BTBDFE=+2�+KLMNOPQ$R4SDTTUdV9\(*3B).PP@0$Faàaߠ`Z):dZF`(klnopr4s4GmTGuv$GtGt\yFwlxr}qcȁibb)dRj[\&nȊ^�x.4bDA HIFߠZ+2H)Ǜɜ~Gɛpɡ\ǠGDmŲpʧʨʩʪʫʬʭʮʯ˰˱$KI",F){,+n8nHȂx
    (=?<IIޠJHIŒbJJ2ɤ~LJͬˬFͥKȆDTdtׄؔ٤ڴ<Md)IC,.T8~3H30KP�-N2}j6}358C39O˳|
    8/c\.�%85eu`J 
    
    %5EU%Dl4�L6~�8	΄� 9E59KRj۶Ts[ݠ
    +M2p1%UP-4U5G\789:;<=>?@A%B}SaR=	n N	�P�ɹ(Yj6CORnR\RݠEc4G~[&0&dz`a%֤ScEdUeef-hVgm3EPiVanumndbepsEtUuevuwxyz{|}~uE`erT*͓˝pT8>QxTLNTk
    S5QORmRXuY͍ZFak/Ec/pٜYWgٟVk=ОMV5Zi%Zf=ڥ֛eJڨکڪګڬڭڮگ۰۱%ۨ|+ǥa3Hn8I~�,	L΍�XOUQm3(M8kY%L2$>ÁӷFsٛe
    ݤ]VZ5U:]Z-Z5Z-Ͳڵݩ=[̝mۂQe^凊	X:=33;އ#3S\ѐ\<aYܠK`ܧ39m3FVF`	YI;+^G=zHH䉊}Nµ&ܩ1:W>;;süߍ !&"6#F$V%f&v'(&⽳+,-./01&263F4V5_ӻ.sΊ2�Ix>@0R)F
    ژ<゘aacIdFKvJILOnNfbPd)*6TVUfVvWXYZ[\]^VeXds9Q=XKQ	T
    Pgh~NACC~D
    ڈ=;|C;,)r6>tDG<uvtnDv>gw~gx.Im|}~^e:pcd
    T(#舖h#f0敥\9k>%36FVhpF1H+?iK0ؿ)00FVfv꧆ꨖꩦꪶFj&頎Bci0ߞ6䜖&6FVfvdžȖɦʶV詓<~Ίh!fv׆ؖ٦ڶ&6FVf^mCݫ^_dӎnr&6FVfoaQK' mu
    >_q'7GWgw	
    gp{뜠Kp^K˾F�\wqHgNNN-oX^BNUdq*+,-.qOnьR"Γ6\YXr/:;<=s︝TgLXTo:B>ϙ89JKLMs0хm؇XCH]9Ue\ttNYs\]^uF�`a'bg]seg+HۺۼȾEt=uMuV}s[yf'rNh'`vwwxyyMs}g[e%uMEv򂡒G_wqOm~oD(Deԑoo.x]ͯkrq86`5Xm'7'sh}w+
    <H=c?)KprγGWgw{Xp%y`fg濧f?u/wggwLJȗɗ|lp&@w{p}ҞkWAsbpׇؗ}wٷ}b۷}`|Y|ո7}4g~>'{~ϐ~`p�TJϮ㧿O( p LH0TN(q"Ŋ/b̨q#ǎ?)r$ɒ&Oa@hP$ js
    <T!TET@FHt)ӦNB*uңVbͪu+׮^
    {?
    "Dv-۶n+W'ͫ7o?|
    /a>w1f
    ΍,y2ʖ/{L%L4mi*,b*n-{ڶoέ+Yh1.|8u7K|y~ʝ7=9`ҡ[|; /~<5|sf͛9w&~7@GߓTlk
    H`NBYer\u%`4"$"?&[xX7jg}Oݔd7_UPF;)HO6)ۄSRY;Uυإ_b3"XO/	`+UAsYy^h;ucF	c
    L0W	F	6)Jʩ#ji^Yuڪ'եSZЊk뭹,j22kѝ{:uCBG9?$SKH)Q:`{KbY55#$̰-FO ;,zNO78ɐ>E9A�$(䥠;*o9oU[U
    0K3a=hSS]uٴ['rrD05tl-4z`r]u3&S^yex曷u>y$|
    h~266[sL7ϻ]DҜ#HuY޼C�+w$(߃:?j:/;8+*)֮3Qs	{`]`"0
    \ N�+8@q>}~' 
    };f(p]*
    Ђ2^]p9ܡ{0@L"Nx<
    ,e	@+b(N(S,^hFЉj,&@l r#h;1vB<1["辂
    T@\$#}1+4
    2?8'2%)KiSD64ʁrO`AE`[�${EKh|%1]%8و3gB3,5ikb3`"x$S,Ks38wUT'=iϬ3'?)y3g>iЃ"4(@P3T(E)Їb4hE;я)IOQ4*HKҗF+)Mk:ȕZ=%L{SԦB*Q[幝J]V�B5RAb5+ޅ0ԩ5b-NU%<}Z]+V85r+]j׻5z+_׿6,ak"6],cB6,^'rV^U[ς2Y7kڞv6]-kO2گ%ij[k"MkRgۆ6jw"%.s+Uf6ҭrk.wY]H�./vkh7]%J/IZ$~+27n]"\Ո}ߑ4�H{
    8Kϩ�}KF5qS,_x-n#ؾ1;Rt FLXO<RFe*_=2)d9EsILc3.YfV2l;910gTς4Ⱦ?#T&4*C6ђТmK{	ғ4ҌOL4cP:u[2V5kmY=˄χv5B%E˶Yc7^5cc$i2wXNl3c72,lk[َ4͓_Y6rMt{v7~<t-=~
    _8[p\N+n;1.i{<"9:5| O9[B~WN[%#8߹UbN>|6uNt>zr8Ozĥ.tZͩrK`yǞr{/^3;[N;Vy<q?p//Ug*7cUG-Go3UmWgTWngoۧ={?>o#?_>C\oc?>??o?_???o@`�
    �`"`*2`:B`JR`Zb`jr`z``		`�h$`A`
    
    ``a
    a"a*2a:BaJRaZbajNaaaaaaab 
     b!!"b"*"2b#&h9=-X%bb&jb&A'z'b((b))b**b++b,,b--b..b//c0
    0c11"l=@c4J4Rc5Z5bc6j6rc7z7c88c99c::c;;c<<c==c>=2"�d@
    @dAA"dB*B2dC:CBdDJDRdEZEbdFjFrdGz\GdHHdIIdJJ$KdLLdMMdNNdOOeP
    PeQQ"eR*R2eS:SBeTJTReUZUbeVd@��;���������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/manual/images/chapters/architecture/�����������������0000755�0001750�0001750�00000000000�12203357067�030307� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000155�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/manual/images/chapters/architecture/underTheHoodSequence2.gif��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/manual/images/chapters/architecture/underTheHoodSeque0000644�0001750�0001750�00000212742�11377016712�033635� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89aG��SnV�TV�P IM]�XLY84"#L	[�>!GF"Y>aT!�����,����G��	H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@
    JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻNȓ+_μh[(	QiӼ;sV|ŏwahyoʣ{@S:0D�xޥG'遧㩡|U!`x!E%M6a}.(2x7|]0X^!@{	ɟCb#dz]y{<^zZ]Xv_
    ) xlgԠ1~|MX{VSw~_zM7ߗ%Myh4AZ~%zYb$y-n'~_|9䠃:@?@Cw60 F	t3稣f*j b8Nj_FIjdb^y;V˪~x۶{wb;@PD)lB+JyF	/߇9:[m;6(~.>|h
    "w[.ݜ9^	x@gYy:ZKގ(sՐp5/:@[,4(4B\
    ,;Xfz[.ˬԎi-*#|8*O0ߔA
    !XEHS,qAxA~=/
    %D�
    6
    >
    y >Msac&ow'vsm#9R.
    =N_R(qziKڱC&<-=;4Pj}AC^ؠ->ڠé/yj}>%B.aZyWG:X }@BNY
    <\g(Ml{~C))rד5kASiFn�^Ր%v,ؗ/`)9}aPm+co%)dxJMI,+$3',g4T+r/a۪5;@:iL@N4
    ^PGW`BuЪJ9kqi\e ŭ|2y7E@:"/G`E)N1bu&U(W;,Sɣl@;hwP�U"(;^1ܡ=
    vhHC%-IQ*Օ;h@4J?zS)?ƉF"I|@CA}j`SRؠ@xGL4}NZR#HZ׺ml#*WmՒj+
    J
    נfMk
    r
    
    U)^@Xv=cqJR60+zՐQ6SP|cX'J۝2 z=,4nwi
    
    Ԡ&6
    jK[ݦ�Yul=]Zױ|eOKw]}K+Vֻ8+(C:hvi�֞2MͮMj]J6EN)[ r[~V6g
    STeSKXҹlOt)Co%	IdU4ipT~tHkw|].6vM ;Ea:`[=3N\Yky&PKb\,@øm	;b
    nqk4*
    Gje
    umu׺\R@Ήv
    NNv~II
    |R.a
    [yUV[Y봯vM,4V#p"A�4юKq?BVvLKJZVsP<+@#0
    X)MЎk?Mq%.rⲾjx
    nk&8֐vnG;#<LTf:L=@ŗN;w	&SñJ~q22/c<V1,ٹֶ^zᣁćB=OT~R/9쾲J0SSqq+Ϛ"{(n؄blf܍9Cmrڡy%o~UٙhÎ|._iCG%>uc:=-OƣsLl堆2jHk_n֑ۚ7ubltVW|gu>>Nr@AjR 3'sw}wx6xvWrxx|'yrvwy`|"x)`uDes<f Fxpg`JNPMSSXQZOJ(
    '`8 ЄzLxVTpR8\Hwr|{XX8wQhHF(
    N
    QǢ!P[xv؈OXv(Hkxc	Rհ'Rg
    kT(臭8hx8Z0	�	ޱ	j 0G4`
    F色xy\(x؎Xk(9P0]pj萦؇ɇ؊H95!IHlȐKH؇YHxXzp
    sq,uh) OC`I	�N	�IɔJ)R`OZ0J_Y1wbHOT��T�KywIFNi]ٕM	JٗxIi	{{iUa)N9iRٕRI\9	F�9٘YN9hK&dɘɘiYyi)Y9|	�y)T�; #0pW]Yv雿~9xziIi‰
    iω٠K9OV@ �c+	٢٢b9I`ɝ	)?:y,j9̩ڠYTPIT9	B;`GEJ)Ahڣ8ڦOyFz)zIFy'SjL)eZ^ɤ/j�**g	3F	TaHA:p
     N$@p�p
    *�*�p:�z�ʫ	�ʫZ0 �(
    `	M"ȃ�z@= r0
    :�A@�pz
    ZК: {jKJЬjkа
    K@�
    ppZ˫0۲˯<+0;*Z0�k@s"&yl2	TZ@{�غ뵹
    .
    :"{
    �`
    @Z=\y:*˱[+p
    +p0Vp
    %1 =|0ڪ1~볮Uj
    Pz{]:Yc˸;
    Ьк0R }* 'QUDWKz%۶`[j05"+�}[z
    `A\˲ۼ뺐K4k3k怫6۱%;%+Jq+װk@z [KMki)�RKw˫[,+b{p;r}[|,Pd˼k/\�
    0spՀ@;{{
    K32k
    Z,�J,�k+L5+<
    ]A+W:*`èʮ}K˵KL۬\\ЬAk	P �*[M09��Kpk
     �(P	Ūz�\p�	KĬ"<"!lK��̸%۰󋱙[}�*ɌMڬ]p+0�JkL;
    o�,ݷ۷˯
    
     ;%{BݷW
     0\+-D{20	H	V,)2{eHW";o: 
    M֠vݰL3,̽�
    l]0񺽋Q*XUrv#uWCL�Śϵm
    mjݡ^]؍v
    F]pұ
    cm<�0+=%[l]
    -	=�-0Ιn0zT0	~M)>M�@h
    ޓ\rl
    ҴkՕP]f�%Pnfˋƺ--@&�s؋,=Ƒ=B}}̹zCtзLN͸px< wa,#$
    p	D@=pL^	@
    LW�$p
    $p	p
    P$0zo�00� �Q�p
    [P�
    �
     Q@ޠk~qP�=`
    WWڌ^p
    `rͿ`LP,�`�*P�\$psp$@Wp	s@n|ھp�NpApp0~*	@A	pW0*�`
    ZPPP
    �
    npp`K"~K�=P�^Z`
    do
    W%_���=P
    PaOpXp$`P	=3&bZ	pE�\	Z	[p.Z@Z
     ZO$\p@n
    kK	א	�E0$A
    p
    0ά*@ܚ^�N*�~&pS�3 `ƌknT]DkZ.E¡k$P`֕%2%p	6l0`#H,Ro
    RV\QK+$L#.A#˕L4H)ZH4%k7>E)P<k
    pS`WAx&Y�K-a\uVXZ]R֕.ۣ�MW4sȜZD(k,fkTslZ:-Sd	E<T	6m={P�I,AkPҵ4Kr̭QNN=HPDQ�@% R9 p	hB9pb(θXs+2GĎ%: a
    sT`*8	79Թ#4Hԉ/T'6M衇AoCÛ7𱭄޸X8z@ukH-p)ʻ.<$A
    HwQ)Xrƙ6㼢889Ld0٘Q7KpFzs䀣:
    X2-Jț5@Z"ϻ&JQ!,b#M+ŀC4-
    HǺ>jQs -.
    `+(q%`&p҉'(R)*Ҋ+,R-.%-/*XykY0'*"
    (3B *|O9$lFS{n>VY²e]#B-(։L$sȸBst2Xm ppf7QT0 Dp4P5Ha�&6-(8
    ypTǖ�Ik2ĜCQi8`�*pZ�'(VpPi*2?T9*pX�P�ub0B0$tI�1Tz*7rBH">5`IYR�5�A�44$v(	Ƞs<&�u-U[(:"eH,x
    LR
    T7"
    Q	.)rlS
    |4s�+Ȅ:U0oP
    P 8~2:%0Ij$	]cB,*aMTBzTF9�	p
    -(e	)
    $I$b
    /0OADب��Pk5d̡PxD*U#%+iK0 E,8B
    V`-a_=p9C5v(ma0[(lEWclh.	�ў:"=xO
    $1(xruNaG^p\Xy[
     #Xw8+ 1S,`H
    |Z4Kx�0qH	YA,\HSD1,W(o�0&o	H'HAH6%k%W-p?+ʃVDZ1x5q
    5
    +8=UMM]* (X�SIΪm!E0jl[#DJ8ʑv,�͡-я	d,YCf
    d#!)IPY&y\PUd~X}x<~P|ܲ. ט1kP:9LA,1wS'>Op@zЄ.
    }hY0<XT(G=]L+") '%y	ek �aȈEҪ78Aׅ҃4e;=Ҷ4mu4S_[CYTs:,~b4(p�@ r`E! ߱Mc3�Ny9@
    3g.CV@�+&@75<>%(B`sԠ�2�<P}HB20x5 (Aq0-I^PxHD�19W0|tpu2Ea hT
    x`'R@ 04(]"
    76
    j ufBPG�1>{r 
    X݇sX`,Ѷ`k�$�©
    PڱVNȀ'!B6;;؁w[I0m.B"؍xBSeI DzqsP
    ԦБ�X]
    $W@ 
    َе\30(HG
    (Hр"
    n~"Dr-!A;(x^*Kz:PH#@8z xP<uk�#0�ށhh؀
    ' �@yJ7 Px9Py!B�xضߛ7E(�`@[;G �YVHuO7>�bA˟9>xVK �Q(DhqPe[8x>C{9
    >pxb	VRy;ji#MbB*rhH
    `_px?:!��D9ܪkC87"h> h�jg6>9[�?>8y�C<q8Xh+6s۶`A!Ex<Pؾ+j jsCF9~#E/4O=Q_+�Ejk�:췎#F@@7h۶D8PkQh<D0*8<= =0=+�sk=K#�==>#F9c>p>{>>껾쫁ӵ~Ÿܶ?*<<<p�S@0>@�ǭ‚8.L#O2HEtAADA <="#DB%�&tB);+�BP`B.L/sÄ	<t�y�&pRk�dEsӻ<eT{5=Q9vhjN+P�7
    YWkqɻIKB)9T	PQ> X97ß>l+
    8pq+8	(LpKy(HyiC!h$M�X!H{ B(7jB9(bk@C@�/:vCWH90ӛG	�H:L;{� �:>xD΅+(G777~{@Bs2pXa$eӹV�;u藘D|GEAp,T8D=l(=O8�;80cy$�G�6QpS6pFbl*
    �t>v]5|YTk:,Muн(6Q@}6|صCd#8;HVY>XQ{#9(G@h&ÑH|AXU �pQc4;;+Fi<cz<'~9"OP_Mv3&s56Tk@OHxŽG=>�^=A[~T>ƛYˀY^{Yb=M�8ST\V|_ixO 9l?$;	#I},i#`6h}}ά%L7TO<CV{T:C/Rld>({9dž�p8@R%c鼁$b+�Gpʅ�$HSM	WH{"87k+5XN��k֪֩pD(Wr"Huu!|j9z{%|]}u[X0؎T[)T׵pYkXD+:Qy uහ?UWW7\քͧZӡZ՗-qڟ�5c/+%e7OY�;+ 'Q|=&TJ/a>9	ݾ ҇lDO�i P5P7P" �,�b(`�%F)p#G
    3ŕ|D"?)(H0H�@$,UbP89PV�1R)h-؂=@�F�@)x�&�0>,
    &j08~�~hX@P�`|tpH`08xFNhA	�(G:H?h*X/h�0
    1^
    z)8y$5Ox�(VAZȀE\hpAܔ�ЛEX|�hp3@؅X@R%`0&l(Uh8$03
    X"X)�3H>"UFѮAႚj�&khHHkXH`*O�@1�$#k᧰j(pGrPH $ !
    P	.,ofGZD	GZp:X8f�8I`N@юu1( pꀐO~1p
    g8�)�f1bkT)/
    ~�88ϫv>0pp"@PP�(?=1W j.A`lWҖqJi#T@`&	
    .%>jN*mڂ�3X5OGtJW*KP
    XŬi)Bء({O?koobFHy.2OAxA SP�Y+=S`#q`)Xwx�	X֓vb0*;�A@GX
    hngxƀno%>osHnC80s* �?Ip`oH0$.`X?"֓8k.sbg"/87Ȗw"HJ�qtw,_�r͚'s3456wshI:w;?<>t@ɮf"A0PqH`H棻pWi@F
    jHj`
    :9g$ʔ*M'V
    %�<,P %V$?
    YS8HK78@�"DȂ:9L~ D")�J�%NH	)X#XH
    װ+>hNpT15u`&*h)+*¼A@qcvԦ<ݨ#lPbRDyB퀔g;y6("6�Ex8?{pU] x@ $D.lC@
    IX ,HU \A�K^R!DP>W�QEHVPEATO>:@Ss<%BmZQI�7`D{IyD�^B"s	&GBT+$T^wpXQ	`HCJhQ]QE=$O!ŝH9UNuZʱNA,�G:uFăt
    D㏾�H"[EVJ8IaAAiS(wDET!&yD҃
    RRӬN~~iSh5A'OGS]$O<D`Q))5\DPWEzim�%3:g ъ0[XjTJM@(8S3\UbfjiS^X4Os=
    DFT@/R茅`!J
    !X)054ڈx^O+OQޗPBE"g�\!l^vg d0-<ԋNEWH�3PN,裑Fi:j*jk`dGbS{j'ԝ\x5@'oRƸO"S	XU5@F4 "!JpH1`xF�p4Zi#ܨ�|+�YZʟ~"	f@Bb,Wb�,D.0	! 9Q<)t,p �\fCj
    IXA�1A OD0X2ZqS
    t�2xr]8{ 
    �|@R\ +7$��J YB(0"I
    Ha
    D@@Dbя^`%Up%@PB ^6FfHp-(n�@u;`DdL>8Ȁ6sa�F58<A�
    @Q`?Bpr˙}0(|ndNte'pYc)q�s OЀ $	
    p5I"
    v�`
    p'>A1A@$LG@0Н`ŤG(7LeKM!D4,rQIQ8�,B=$(G91�;I[�YphOQI,31Y01]F0a�;I
    %(>P&@\c/EUbD0,唠-S6�IP Ѷ
    OB1L-~Ҙ@Ʌ2`y 1.'
    =: p5$EHPAAPD�dpp
    D!
     "
    yYE,IX`$~*lإЌ舭$1A-)7B]H8)I);G7�>؅PN/y)a)HI1?h!Gs,p�ޠ! @�Bq^&!K8,@$	Ì¡KdS�jҏ 8a@4Oj�T AP)7D+&`<
    �Z-I�ԥ0
    LDS4�:e�7EAlnax
    YBfZ4sj9)R<ЄFԂjD(@bXW=O.hV5/hEKUXKvVsn_{pYa*
    .]	@-D3(6_5( I`ժQP\a- 4<.E@VG	A	Zq-bAFڅtDI[*oS[]q߈:5L`H0ah\~Q�|6w)BX(&|8#Nl �cCF)f�Rɷ=u5Cq$xtU3rxjK�2Թta*'@+!"qdG6ߚنoR87ih^
    
    <1
    ט{eڋ(ART,;-BB>!@?S@8DA
    AeuMH�8xCE)�H4|ڑ	],RPY$ѰCaD@ -<eP
    V\TF$LLR`؂�Rg݆b\˴�@D`FTaaba@c5s�3\V�Bx<1.aۥ-P|P9\)II|Y8ۙUU_%
    di	)"(4UAMIT_(T~H;/@,@p(X\QExY)F
    5	:|RgXEt!P$~<@HV$U]Db�IA	-_bC�t܉1WT
    Yim,N%Y�|50%6##%CbS-=dT|4=3F38AL@;
    >lt`z^	.	*a `�zޏDE`S"~B@
    b4AZDTYu RT0^:S`RT�\8
    OPbE"$#֓#EՅQ=%H&&F\'~'|`IpGD 9(Ub@$F
    @N�u+I4<]I]T]@WL@$@t@1R4
    rl!DB8|XT Q]kǍx(Fީ*HIRA@mݔK!΂BgYHwƛ(R�AH+hPN))WQ�B'`-N,L
    \DPU).IPDAS|),|C=܍�(p`*D}R=әI`؅PAi<D(p�(b(DXqpAT@bI?gh	G'ЏYUQR%O@"(3RdI ^Hӗtp{	ȥ3TSDA\|\PI.]�rE)F!9 D(Y	FB�	!P�[PC��ApE"}^'Ը@y]īSD\"(O<'Y9%U\$u<h^�	S{$fDDb""e;uoD	lP|k
    UCB�Xԁ;IdC6xDaxH<Vm<X]Ev/֋RZV٥HCmg
    'PUڑKPlzIVfS=0'JjJ$\V=mCo吿B[dFߐ֋rWOS+IA%\��j9jԪ⪸`V~	"D+S.bo92>]@>d/asPpua/JAu'@ķ^<ƅ̩*%A88Ar,x,Ⱥ6ߗ,Slz֬6nO,40g9JY$&^�U`,AlJ[d<D[L]~g5&fW/Is\&GaZ.^PމaUHHqm!)Ɛ	8 0'�l.Q|<M`<|\9@AMc#5~@)%u�	P\, FΥ
    9^,,l؏H1a/ZT$9[=@0XQ`X59H@ca,LBAdu\$3
    Bct~C&`/jodrEJ�DU
    ̂-(kuR
    ��A�EL]bF<8@ )yi&^Ya,<*,r&[)}(
    !|U4	PF]:dO$…	' +K#?+W5FKUUhC6^e-U#P4Ft6>nnR"ȇPXi\]a82euC>@cntT-m4lOOR�PֺЂ-G@�D4bi6uOz>ɫ&GxebVhF@(`XR�˞9ŵIAЉl.%A3GDE=(}܆9X@]!%l|p#DF+`k
    MISɢ"m|CXo6HjI/QPtTcO,Mtx-dvI4�	uDT9R6vܥE^q݆|bPcɎPc@FY\>
    ǰa�bbnO%EeemkwvJ^m^x�3\�/@c̀�S2|\,%bT,	q#Gձ5 :xpuV܆S :#J
    QB<+aTA�4h)Af!S$Q8,8Ի׈2C<<\m\8E.7hX^J<8ufD>he)R
    _,[RD&;#vtmŅKl8$wI;8<O<\O%ITYsHC<@P@MS<GAPZ<{8�Gk-ƈTwSW9$e׳K	`K;)HC^_�@8x2(kS0'`O6a˰�ct`XF){T-SEH%lVxbT`(`KA%KԊŴ|#RD̺Na
    5-4`6-HKv@8Հ�Ė�I
    A ^p P(=FD�RGa�
    (BKQ\:l	$@>%)RJ:|�,f0]J)BEՑCQڲR>��FЮ�R,�hG(
    HZEG9rڦ_9ݿ:h)@!"F
     ʕ0'�GX\`m`>u(C!u,aE27�$qaFfR�a|`9,"e%66L�@&�ņ
    (bRBċ(jrh8*$˧()#)D]@!K�
    Ôs>Q&y�|2h<,GSsɀ/)f1"|@S#$!(PB4r|@>j͝>I#	R0#	D#$Dh`|A
    kI�TCdDLX( DX
    Q`)P>>xpÍH1�,(�liYu0D9"!nO<J$$̙Vv!%X
    SbCH	B	DBPP!.!ᓄ?aN
    00�O"%1[F@
    Pl"xEO(�z/138%1ټ]v	_,H8"o&f)KI+H`PK>M4ҴQ{V`bN!	67ռ!z9"+JR⢈x%)l`IrhmqB0bB#�bD$/oBkR@H"J/tS`	gcvQDv)  hK
    mR}֦=VMknu?;S
    EPFKbv
    uCȊ̂@s	K2O1@�!a	ABW/W@eDgoU(x9,tVl0T85
    v@RgUaSFSb00MHJPPaPh,j:CȦE"SYxd5sZE
    B	11`>`I R4o",j6G!Er9R"N<VAT$XP?PQ�Br͒7Ią(gQHKD@Q9%}&4)Ֆ8[F7ny֠Y�Np�O,{NAI-Vҗ:)B).#*	yTY-\acG!"EG(,\j:XH@;PΗ"qF|A7?9&Hip
    0B)�2 ^J
    Ry!&$n�9DB	(H!,5f%X\D%5IQ4t-=vK+>^f9Y\02s*5"X<Z׾li[[6%`x
     ue+Tp[\,Ԥxb^ex'VԠFQ%=L
    Xv^T9rzvl4q_Z%$ q0eu_7u�*Y0$�hI'.`S$	4(nB0oJ`\MQ	~o,pb3DPBF(@=ô\ "`4/+eX9i(	:PD7$OfAZc1@nf\2IN Ǽq]L CRaPBb$Ǜ6o$őĬ7aśLX͉y1?=/40'F AsoP$칗vF[؄襢}@S0Ò%󮶧3r*[/??hq,fU8ck3
    x=xO:[	,hb!Rn6
    hH>~
    M'aKFc&;9A1;s"<F<ѝ%R4"X5{[fluzzH0s3=67J0όWۘޚ1eˍ>޴$hu0-l3Ov5W|bȁ!	BR+~l!Iw.$F AxlƏ><"4-J5"{'C?q$sV'N$M4̀N_-Vg*傺	n 
    / 8!XLH|lm�W-6m8łVxDH+K34-	
    MoJ6i:FN"	M,*Ȝp|\DM.y
    pBtXӊ~Y,n눬̌zǮ$TldL|N|phFFl^~ З$,*k4 ŭ�`AyTa�H܀a!@aj@�f��f`aP�v`@V2 `�(6k,&@�T
    T @A� �H�
    ���Q`A�`g
    H�Q�R
    a%͡Q�YrE.
    
    x'hH
    `l$]%Q>qfRYP@LQ =�a"P a%-@L̡+hT!Q
    n2sq%w&$@�Y!
    
    �AҔ22 ܱ!bP *c+A �X`�2�t!ST
    &+g`1%-*!Uހ@&r`DZ82r+@RR:($uP`a!.a�!+I?T`ۑ�R@#Q"aagacnFH {{dd
    @S0:ESs5:b'u:S 5
    czvT?́#fԁG�j$"D@��(a%(�ft>?.A8/E@L!2Ta=s:³LA?ρ
    3>WR
    T!- SRK�3!X�: V kYYn&A�k ��`�FM%S g
    L3Ӂc>PsX2O1Nr%׳2>-!!a!*
    [r
    qƁ8FRLQ%aR&`#QU*ayQa<aZ!FIaD5	t'Y2-2~tv&5
    V
     3F3-4
    UN4ST5Y�\6Yu6k6!7w77 88k8U
    3::wr&MYsbR‘M]N2h
    4H7'%&/RHYL!@<DEDDUfWT-QE
    ?eT)k4Eq\G}4tH_RLt:jgrjs<gT.AceZris?)W3c
    Kg@)l+^@dHe(h A"gy F�qx.!%yqS4<�HVlw1IJ1�vFFkJPEd P BtϡZ{wP@K
    U=e1hbas%6"ԃKe)kr<HR�n/wA" <wr&%u"c
    @!7u�`g2bQUk%/v�!)bms*K:5va3d4KAxgGb:՗y�*6J!V.r�355+R8Awh <5&cb#Pik`5hR&IWC=sictrW&k%`W;O*/U:Z@-ٴ>Ɣ.	JRew
    A	UqY
    `DmoS$C @Z>%cx-!5&XKy{4M1""zz.YRP_I8KI8\H a_ CӁ!E
    Pw2<=.9HcR%*5
    `4&>.SUL++wAmkS+t�ޠ&F
    a3kcTj2%2bux^T5w/!!S+C3%QժQ8ҝGX:.w?S&c wr�*
    q@I:ys@j&eYؔ%cR&ñLF2	eXel�Y�ٔ
    [2k9EYz+Y. ˴1&4#cA+FOuN!T1E>:5rH#cKQ[+w�E&eqِ;F9hiouUxbU!Ρ1ۇA7w�Mcr/ew:19s)%"ؔ8
    rvMryzW,0Lx{Qk6S@y᧻dA8̯a̗|˼˵@J
    $Hg@6ͭA{GGS:\zɹf/|̅Ga-9@!UZԻk6U\׸1y̭qS||c#6wSY}|:%{tA&aI:SK#ԅ]8{[=%[k]eAK]g|
    ҇܇׸kl}�$}�;AKϽ{xI#x@]=i=+}G~{ݭ] `QaRF́8cW`2	]�v}C^kk=]ܫ@R"=>Ma>߽7
    ~}ا|-'�rR]5�#?u1
    O=KUk<%gZaGs{j36:/Akzג/=%>AܻI&[1x<'	`ʣw#5Upw5k	LP2Z2mZlQ@H"!JT Aԩ[њĄ;܁@%
    4¡	p逊T).\8nP@"
    `@IgūW6�WAU+P.F׆Ҥ9tWMLs-.T*_rJ;C/_~5_Rv8:;8}}$>+j.TyÜРaW53.񾂋CWbNC'Uo9%7}T	'\XafMPA!P+BBapFy`C
    5%j8	6)vD-6MpigT7U=g UӁ�-TDLv�MpDau@~At@4i8U`1Pe,|H��9h{ZF8HvUr DY3T~~gpbVTE-aA5FaZMQ#VD	l;Δz|IՃb>[ISTNHD
    �
    $S|"k:<%M4$ƉmVS
    
    (MJ1Tw
    %E
    ld$DSZVnePGNSmI'Dn�wH	popݕ\Unav0U6`<ʂ ]vl.@,U&A6
    (T99i/STvRӐCrOݢ^/K)SY5WMSeZ'Q~g`[hZ@ _v7>u�zM#:S"]<R66#,o$ֶ>XTh&h[IFɅr^(jkuΒnZt2͑Qc<AY(a[y}kS_|,4D;v.kߞ&8i"V]r Ea9\$׬Բmu[J(
    @(?\aqe+/}u_	:(oL�K7fIbX*6)pcY[מ7ip`�iX`vjśŌ0ZMF>9NMk$Jl�hB|
    LfA#n�P�Jgo1ŋqc2־Faq.b*a�;'t]�pԭN|bKؚ9鐶
    ɻxR׸+oq
    cz@ޛ4=.N~t�ȯq>5nqY?7oT۠<	JQM<MtQ
    44Hۋ~(iq`KhK̒tlq
    %2'U!Ҩi
    I
    }ܥM	L>e0T"ΡMW_'Mn:2\hljM[φP8\B"hAL8S	Si|[_כ1|EEW)52Yu
    Z"Pd%!ZX&9*qDsYwXAJ-QhInp틼$r!X5Imu(Fo	yһJL�ͥ[]&NϊW7!nECqSG9+X=o[+Q�j#g8a|Nf%$ qlQ[ܶ5'~	/p]ƶ)T:+wRhzKc:Ӛ`7%@N-ӌkj>q{<5e-SQԁM;R@0ݼep<}Y%c2/kFݐl00�F׼i:,eZ;;R Xff�bX?
    L5d:xAe;j-vJɬq[lDqXvb lVXu{'&�4$I'˰̗LO}D_D<޳9kNFQYls�GSe]sפT]edD@?M{e럃]<IO9biҔ'%AJd!4,I7
    Sn`ҽA?Kmj4JR@\h<%,(	Z/P߶h-I,߽q#)#'84GRyz%GXWRHǺ.ǬǸ6_띂:+ށ_Go#G&O@@GW|ywKz0=O?z֭@לdļ5\]O{?z\=|ӅH>!|zpK`yt<"/dWu`mmp-9]Fjcwgy'E'/)w@7DvW$W{9̷|łE}W@g=9x�{g~Ҧ;_E@W5~G)|WB	kV*q׃'tWBg}Gyw9#6<t+a2G#|IT6u3ADA8sΰs�s?w8Gtfs�PBO7W$2~~	u_DvcWvpvivv)pwar:Ȳ8w7GwDxyH5};x{r9vcȳn"xz/zpzzsz{riPh{GV{[Xɇ|*XFG}'x|yG~g~v~yX|؇|@X$g}aјp>r8yMǍ2Jp @dچLցHiȂ'xﷂ}XO	|76)X6ꘃGT8,8B�5Ry*%s�K؄׏7U{=`]Ȃ_'@iaހᢆmCS(6art i	((}(h$?RU舆0SRhsR0@TU*Y@^ljU" �K`�q
    0�%q8rja~)Ii牞#�œK%Qe"B!O,	H@Y	p i*JT!rPU @QЛ̙/
    1JO=jv!ׅ�yՐⰟ)Ej,S+13@	{*9PGʥ
    
    W@
    V-d	B
    Z]Z<ٜ YYpٹt	Оp*J٣I
    	
    I<j2@	R
    l[z
    !:�&rʫ\J68:z<꣏
    :OP	Q
    
    S*
    ʭ{PcZfh-%�4`̉)*JZڜ	�!R�P( �P	CU˰
    +KzP﩯L"`�I')+K6,j�y
    �ʲ=?vADP�p :#	
    jAkWY9hXڙjGU #ѱ!;%[˶m++!Kj"p�麮 Юr涁!BNŴ7gQ{ۤ:˳˰tʯRJ�K} +KlPgkik+;.O0+46ˮ�K+1PGK۴$Aٛ"TKK]_a;кPhKk勲prtkjz{|~k[$8@K
    u!CO‰!
    ,LT\R*@)aT!YQ')+-/1LC!9!1*%avP
    $2lGI2N(]�y`|�	<�Ka,cC)=`1pvd{}<`	5b{<> D<LɕDZ$Y
    eZ^lɥLrS!<qʿr�!@`º,K5<7A<PM|OFU|`ŶŸLlހBq�koʾixllmо\ș(ȑ͓ĘL�ɠY|˹+]rʩ
    �˱ɛEOA-CԂr�|cń�)vcDY9DMUmWY[]
    Uwp(Z<
    ^-sMumWAv5Jvhʹ8M:�<>Lw؋؊E
    )"&:!a�jPNJ�ء-ڣMڥ5*B�Ij`0צۻjBv	UpG#�PM؆ؼܺ-KH!cֲ-6}9DMMFJ
    $O
    LQ=S-
    }`b
    d}fjgr N]Iׁ�މ]ߏM=$PbpӐ�٥i'ڪ}
    +M9N׾Eƍ]>:?-]%q؍Ѡ-2 x�IU{_tWA�g^|`W
     	#"�W	43ai.NAAwjNvApװ?-!~z��:駎	Kp=."yw
    S^W}0~ꈮW`~9j"N
    e!�)AN.nNikY9Ɯ�j nN�ΜUPcpn忀Z>fꯎ2ԝ*]Qn$r~畮y| [�pѐ
    sz@=�A }>IDNJ/^Gu`	HN
    'Ɠ@kSy*f_>	en	`
    `V+?a-N	@$N 
    �@$ Lj.5#@@zjc_?Ai}0*{/,o	f2 @`|
    ��O��@�ï0c'[6
    |x�T,B@QF=~RH%7RH/&]S$F`Cg0hFͅ;vARM+N<TTbʤ.:tlpl
    pBhU-TmTɒ[!%A!¿(xEIu?vr#Kȕ+	 RO>\gСE6\YFʩZ};c5A,Y4d˨rDBM'aխ_=Tg	ʑx͟G^=3X>3g,WȰ!`У>D0AdAA	'B/|
    Z`D )BWV3Eg4DZH(,<2H|H%$r FMR0>@qI/\%1<	@1N-K<1E3;Yq@=jA&sH3Qsp:.Lߡ1#rhȡ&UUWeUݡTPU[ou,F!,ZrY&1h&h2RpZk6j	 VBU[q%TI<"@瑟RHX&]5	S_\oVF8UcIX+0SOA@TRME5a%odj&x!h@Xp.U^},Lka
    �V}&gqF2$tz7_1h[RnO	u
    J=km&`ͅW{왆c2a+4E:(k4r/ǼrQ&?t]o
    %6c%{G0cn(to=wwZ
    vw'xhؕg5R0b7|~xU	='6,DƘbFo @>|vz8Vq(F1fV3jx`ə7A
    \WAO(Ҝe(A	G5a/~^)xJ+[BFcA=?
    y){Yh
    p{Xⴈ~@
    l=AcոF68]84" a@,lfA(P�:^1ְHF6ґГ8Z!d&//-UG'U@^fL!!14PC%ge.uP!?^a@F3ҙ3*Lj.
    RU &#*xTc5չNFQ%.9OjJ``"B3e
    Uꠕd;IKZ@X"�c(C0Fce,\C!O[:C"dRhyƢ\ش8|+,0GJ\TVr"HV5qU:GNԘNՁnՒΰO^>kZ9Q51pӐUX5acyl#U;hD
    $`(
    rLTm'\{VЖg4fFYuV;2k5,E݀C�?D72AjޢqmnQ</E@L1Sv׻a~׼Eozջ^V7;_׾ůz׿p^
    Fp+*0G~	SawX|CP^3{bXPIbؼ)^ucʘ:1<d-XA&rcYOx, �Pr}�ȗY3aF8o~@f%3|g"g泐}@:78lhF?xĄ	="ZєƴI)g4y?&uGM2W2|jZϗC2kjXCֻy|j8Ǿΰsmldcu<DWYCLWܞtCnrwn.7tnw~�9|cTֆ
    ekCo;^yovg\6qJ\$!rӚoy_s4OPAle+кx+3[69>i00_z먟L<\~ze8].z.�krvkf;uF
    _B}Wffi$zF'W'̗ε}K>S}sT+|i<1>Ÿ_LZ-f=_Oz'>R~wocŝq}ohz:μg+?4+_/ƷG]w~[x߾YΜ-{~+_?@;?s<#{?mx6?Hœzm@
    ,@�:�9Sq@L0F2o;55T[>d<[5|>̯EC%dr)į*T=,La?B106B3dY/'Sb:k"$҆UKC߻7X?,D�ۼ.LDZDDǃ/
    k{FDcsLK5ODb#QL3ES
    ;d:ETD/C\Z[EF=\cbõ9<4`,%ۆ{bFF8CF
    BsF:k$<WBoԣoTGvL/q>yLExKsGÓG1iGRi26Wą<>
    GzAK67FraH<2*9	\3\G{33cH;/{I{̳Iɓ켘-,,FSBlܰI
    5kJxJFL<4ʇsVcIԔg˵^JL6FTbC˖6C7lwK3KԢuK6K#+밸z88SGT9L밹oșK|Ѵ=x[IL
    M,;EN+7+ÄL*:̾Nݴ{˱|;;TλŔT=ż;H#k3K&TM3bDüͻ@ԻJT=LDOkIϪ=݋2,kiLeQcJ:d3ͻcG
    OЁ<[D?
    ѝLD?4@\uϵ{Q7N@I
    QM@!PMT"<AI$D7<d0t+/zATN"M@,SpL7Bs#1I/P4>=YDnз1(O-ECODIF<GEs1ӹR:+� 2BK1b/$Ь4-DSmmCW%PKU]9=l<5>+CC2;uƹMA47L|Dً-d0|{475[$T23LTVtDŠMUl֨W4=u-WrŕN/*ԫknTNUN4%6VE^T`ŒΉJU=;c/PmC^H4P%6APչ/CF̓Y{Go˟ٞY9;t6$RUo
    \ز{{nH!{;Q|Z4:!4"{HTzXۺۻۼ۹
    ll`\��{8l�Ȇ�[\�D`QX1PX<L�8),g%m6 MWClY;D+RM=�Z#"$Lȱ=dStȿ^^[]Tqe[fp0͆͆ɵ2Zɵ�_e`v[؁th
    mՅh</!@�@e0QE1&]<T,cġ/5fnWQHI\b3TY[4ʇUh-Wp](XgxhbthI
    3ƒ2Tcy#]4f-FٙO1BRByс�2a./0=mQc?#O>9s^d/8x?߅H JI-;=˞b;eH#踇:R#8Ϊ\¥GGf-F�yh+zJi1mpà>n?@&ZSG]�WKz<5>4bS6K̻^,s[9UM/ƢЩߟkѳSc(jg؇4lT`VTUh0i{iwvaii1=ʇ{J�C1I?@?.Yh(v�]0B>\9
    LxG}?5DE7AmՔ_˱V;FM>дerKh̵LˌE˞:T³Ti"֖eHi؁vlEU)9iY贂r,L&rv`t@H]@cd5l=FWkxyj<Pm;Em247zĎX?ƯƽVKLl4"\FN*,bgpj3Zov^-.,Bi! !0Ёhg`vȃơ]3^a#ncAp3D0 cAM	2tELܴ.DeV̷ȤQLy<ﺊTN�"3Vo\BeN-`eN,/Ng^@ځ
    Ѓ'0#
    }ȃv
    ;NZ+X;ʘ� M=5MA5{^]K۴8Mbi,M՜Ylc1S8UgVwWXYZ[X[
     s2�YVϸqٜF]]XodtCY%k:x.aC]^EI/Ŝj(1:-]Wi=lߴk˻wii@.`wx�		`0`vo*	@	ИQ;ZJ T؀]2#S#؂-uQSCX+SأoQ军@G'/
    l:4Xm
    U+2CGXz2}N"l;ۍtkK{hYh
    �H<+@o@
    `T d�i@2�6]hCMQH*m0@C%4gt$֭54=^t|zA7�8
    |#tڜ>"4oԇQ`ŭOP<{n0~!}~HbQ,}7V<~|{8{(9?`
    �>Е2˜�9ފ*B("DmX1�&M̸1$b0e:0]:t@RfSt�0Z0ₛ.<%%{>YS&+zWn!8vijݲ+w.ݺvͫwDnjw0†#NLƿC,yr]RάYۍ7=5N;wo4\-{6ڶoέ{7޾s+vZB\
    وЈѴ6i*0GյJ
    p
    @Flq(R.<fEt)Sj~#Ɗ�H`1SJW-@7
    J1yd^�MG%96n}''F!/ȗ6~%^7?3^f?8C%Y^4V tSRYWb[r٥_^Y=@3
    H &ALD2rH%@Ch`#aYX`_S74NGQRNCR@/;7U�l6~ EKjSdnhBd}&E-,iv4Lۮ[7hPb@N6`
    �j�* " ad4064bXQdgI~D?rtI8XT/QQ
    C(#e6Xx%_P+cO|DIM!}IAӚ4ˠӑQr"$_ֵ]clgv;lFcr.5ݷ^##AA
    :$$B ȡX�E#H`{;ROXGXOF¢^{M{uvWTx9[E=#g7P؁o!Gb߾TC;>+Voll9!�aCg& +h	L';0"!	?
    w�'`Ur �= 	#9Xv@Q6da%C6Q2�J MhMmWܢdhr?.Q/^@=2._DcX&Z` ��+�*z#=FPFpC"2\$#HD$7)�s`�
    $pd$H#1XB6lb(A5(BCTD�2xLbGLf*
    
    xshA�X3'9)N+X\';w3LYN
    h@
    j` !�4{؃Np-0Ȥ$$
    rXhiEAm^F;UΣD&̕hԴ9hr)O{ӟG'z5J]*SԧB5j':a'>1~8?
    PJPBfP@cp9(@PFaz-ljvPE,bCs
    !4UA`0g;ς6,* 
    iV]-k[6u-j9[Z!DZ
    |^jp!	V@8;ANC@]vV#
    x(^	k$/ucY.a	X/�; 0l]ۀC80+la/pӄ4A'8A;!|�/ @PaO�
    ֥�vK%',"E^xLX�|2d+Y\pG9У l39`6$Y>Zg#,�
    pQ k�8*q�Gx�8�D5A'k*#u:nQ򔣩ki+gy	ސΐI5;
    +|3{_;rl>$\笆:ߙ	@bp1T5!0Gl:@4 I[җndrBwk]vwD0Dpzž}x� u8n#<
    _8C<F5aL/|q
    dB
    �P:�5
    E:2;3ѐs-ܽIs^	F~	}�īnc=Z)ṋ
    �ٓ(r;(W9]4ׁncG?;JG~/?i簆5@=\t`<;σ>=Koӣ>;CS
    RA
    o\pr.�Pp=M8xĄ${> PHZ'"jJ}&??oֻ;�3&ڛ!	ɞ�9_
    ZO1LaTh`D<V]S~�
    ԑC`Ci0D <I=@%QAF$A aʳ3qEQX!`!IEL_mU	 `
    a
    iU9VabIAH(4"<e_ELӑ^A�P^~>hGEbb|QCvETCC4)"޿i�J+!I)El0*G# C(#ޝ` mC!u'.A("/-ca"id=h7Q�-C,b.-C.37>&ch3d#G	8De):097|	\'H?CLR8<I:Ck9@C?d	$8IJ$4LI*9;HRIRR%K$L"LTR6SCOn%U:JZ%QVjeRv%NN"�&.8
    ȁ\ZC5Ɛ>FdDO|f
    X�db"bNY#8^SBPC@ݑ>m@p-HDCNrJ:.Ѥ;C=i@8P7Lu!%%fP=0i&klm?nkfpgVgTdrf5s&�t*gp'5':vgwmb'tgor'uZ'z"@9|8	^e'&5c4&NN@(eH(J`S5v[BNb6q7@%x\4|Ct\@
    C>X2�;X\hv-�
    th5_8@-@Phh(;i;ii6$ZAbE)Liڨ=਎ޑv))*i>0i88)J)")Ʃ)֩iBiF\
    W&=BCKLcFtBޛj
    x!(MUBN@2T�EC>hX;,CiQWYC!T6S녀6)h@Al\e+;(+:貲ôV뵞v+~k"^k6덱k+Z++v6k.>kJ+rkk8EF	^t["ePH˂u͖_g89)MVe]VfPH-!Bނ(�-Bn]@•Bn!B2Pt)D4m.ĨFZ-j-׶ׂ
    -ٚ-&ڲӾmBA^A~mؖ-mڮmnm:.J.fnm-+ځ)B.�A
    �lI9CEd&a,/?]V`5Ƽ~%$$ Bz�-HTUU	-؅X(@d?DtBؕdooo�pF^�{o/Jo'/�0kp6p	C0
    p_gps{0+p&ف$%7�4!:6"H]ī4"Jy'A֞	؀
    4>&`A,~D82C;8Cq%Ǣ11" Sd!G"3!?
    D$[_r&Wrz2!2"r#)k*KQ4`r4q+o 2-/-C2"2'33/"@A8C�#eG72<Kz"s9ڔۜ*ci ڬZ&um$h@�4&Ǣ82Eq@r: `B#GCK'C7BDA3F384DKt%W'g.t@w4JtHrDO4E[Ft4MtBtC3EHӴI'́5c6788;f
    0%]5VÏO;#Lv5ۿidR@B+i%Ll_seW=5ZC*S<d`-C6,@6X
    k!KW;=PkD	,:C8h66\v6h<v;a#5`C__C`+nŅ-4)ʅ
    @e<|7b8%naQwwEbYcԥ3L;[\"Q*nuiow
    6R@n}>Ho=H66@6ЂdB5h=	;
    a頦[YCQAkCp}8~׸cͶ78OC74`AeUB%H7CC7C7/PO7˖g293A\y\	[q]8aƜO03#+<B�?L04C7q=0+
    ;;#3ٹM_񨏺C`]A~bd�5TWyvCFQ"P$IT:]K*fU5U!ث99z#:ܓiP9j�/ɝ	0,NaS:#h:\{f\�$@,":TÎ@m#�vKc
    ;_#Ct!)dfC3d.`NC.)T(Vm|hӷK�jhr`{�Cήm@C!035ä<=K	=o}=Q}ۣbҟFvA9@$@-�+38@!ZkwXyJ
    {Y>}E9hй ?X4i}�}]}=]kѧBu=˄_Q4J9DU@* Iľ3Dӟk}ǽӽʅi>4t*�>(A"$@9r=>>V(@`n&TaC!F8bE1ft`�59dI'#XeK/_fM
    -g7D9}fm|�A0P Z45j`СSnٲƕ;7;vS䱷^ީv˞M+nPN|�n:y :
    hQ�v>D`T:O<J7
    @޴�hnL]y]`ֲEwxkF$@w~=aɞ3gRMJP7I?m?P?�	LOiH)ԯZ42&*CTd9R1QEBkŵ: (�-e؁e$cGR+�R<L1Z2�쩃"ǹ)Fn,.GYBSMؤp\&$8CCd/+`I)iJ1Ԥ	G	5
    Uԇ8%QQ5WM	AXi(@`si*x�ai-c&R
    +C/!ƣ	Aȧٶn\nkeHW}Tl.x]5{cUN
    aVa5]{]`EcbegmGZ
    ԝY\VYmyr	wKeqFoexns3zZr@iꏮ:�9&բAAW^}6Qb!ة;Qѧr:�Ѧh/UR4d/GamB8BA݄N:_a/:tKq0O>B8`q&{F pmӳ&tŸB覾K.ZrBjS#ԍ_C>:�cr/9H 6(H
    4&7lT�G9J0X0nt'`PH8Si
    O^*t,)8xSNě�^PIr3]1>lD/y4Ah=Nc*$<PVLhB[\5/OpeڢыfKպ`ŀ*ȱAҊl	"iI+b$J&hyqyssFWPJUvete+PWR(;Lŏ 3q.]u/0;wǀl$jX4O>` .Y0k-'am14(I`gD,])KxgjO-J/'+VvΗX/UP!t
    HPAC+iQ iIB9JJZ*0|c}«8O=I
    h%BNkuu@
    PART2\jCXwj"	p
    HEWnР=bN @pTúveZQkh^W;!r_Y<Jċ`9�xVY0Y͖e*؇Cj%ܶtjZ>?UR*_3m
    Q(\.KQWH{[w]LՎ țrWu"KآaaTA2q
    *`WPiTHy]bֹ%	z[aVW	?i	2>V&/Π�t5񍻰=l8	06'$PLQ8$9UFy-e@aXC%̱_\SYR+)@3v@pLsE..+
    Aj	M	|6Wy
    Eb�;d"*ci38c0
    P-l$ZUX$ıvnfkaU�^g$3k@�B�@v!clʒ^itݨ@1#OB[ٷ>DjCOZuak'kwI
    	םa$Su#$c Ex^w*@a
     @AJ)Ph�kC#vj{e1}w݂ϓIni#t"k-S[lF%eD{Tlq_s$
    jBF/@bg�D�LB(/lp vKߨ7
    pR9Б9CKV.B<[eIJ:yN1;7±5EKPRAO[ɇOt|!ށC!
     
    Ob?M;|ϱtT>
    v|9i\Eh:ETiVŸhSew ݎS�e (ZB"'rb@&xKJ0#Nʺl
    $E l` ,
    aVXa*A,BZڏ,/0]V"0|zB
    I¬Z )]XBp#\nBz&:ܥa
    fER!dipp\T
    o_)| L
    @@�j�X�A 	uX&+O^gth
    q%s:nQ]<bke}F10G1'q2qveڥ\X@D~M[]amB&#/QzO&
     
    c~
    	av<=  `OwoXi8Ѕjf~\qq
    ]6 6'^-]f}F|u\"gCeg§_v $Ah){r""2'5j'ɘ�P&XE&A>�R 		//$d%ZSg(gKA^P NE#%#fgysrK#hhQ1ZF}2>VĊr}q2[-f+2!f)j,b/l4@젍!`Q.A.mU!E ]]?�	J/	B^~<2WB\#I[~bs�vF1wwQn2_-S#f>n {23 tDH4a/ʡN'1v!R3lZ2�2%J'@\LS�Gn\
    sem%0f1m4h&�A wƶi>q@IBlt+lƣ<4b,�!,X!L@YB+/C"mB ~ssjs4'6q;!.qi4dt2{#2h>@.(~t'(`\HSew3u't<u?xdTKJ؁"Ā aR b*kNW77k>ppP>EBPСUuAz
    Vmm>hJ!^	fU%-5B Jh@F(A:`@:&	!xbfjRYŇRZЈPfMes"*VT~FjR?h@݈_+ii6fE{h6I @>�c`*` ֊Y{sd!'=oiE[Zd Ň^�$>	
    ZEPHIgFqlTv>	j/0!4׻0ir?,bKuXЀA``wƀv VN\SN'qp˧`[쨟ekB`$� IGb_nrSHTo{U$31(ssIeB|b{5IxIHM
    ` Bd7v?ZAOq	ySw�ӈ8XR -%Swlw֍R,a@Bj(@0j>
    "(*T6ZҪ`k!PrrXlo!> v8 !*�*��,||A66*`жFn_h|zψt8?#pZaM{IJQ=:"F@H-XBYү,6t*b=2kʃ<a
    "e*Ҩ8a*Zi*<ҨOh%6@E#y9yZ$y#JC~!A6! /لh�wJ`ok(ay �&`	>@ Xv	N}LN@\W!L͋/`
    @6sfELj]_�iHD9DX99k3B"/J@=ш9(m@
    a5#bXn^}9;h; x7<d̘e,z;{	Qb!;%{)A#-A6 Y 	U'xX @�@oΠ6�Q	̴4�KaIb)ڡt{k6)	Sn _g0emk"[?BR!ٗ&EY{9.e	@Z4.+&,.X	–7`*!XXQJ]a<WPSQ*7V`K.b1{ȉȍȑ<ɕ|{dE<ʥ|ʩʭu!`jʋ=F zF49Y|<pa
    HT@z @~!6!v+@qT7@!Z" YBtʩ%\&uu|
    "f#�h2]|(S4xH["cu⿳!-K ؁ڦA-J=삚׃7FZ?#W"=ӯÿOơoYu
    bJY>~	
    ޻^V!>%~)>޻9bX^al |<uK<lP@�
    � 4u``l1֪Ot!,t`R#5^O'ξsT֭Lb^9uDG؂ے/3O悺z",lBqjPeE	@
    s@r-+9A C?rAMQ?UY]a?Seq?uy?ٌ{8B[W#@Y`X
    T!̡4`s@a6'/?f/ȣO:p `i/B$&06mAdm~T(A)!A*�"sɳAjԜ	u64€a#5a
    RH_2l鳫ׯ`ÊKY*��Cܸ&w/]�J]N�P1x\#KL92Bo.1"ӨS^ͺװcBvKͻM\7SK`(;mذ4Blj֐pvOHtҡXDTHP?5h #De?,>%ރF(x܄G=U�
    ݈IQHx'QC%C̨M�x"
    9�8~S%&418	 ;P9TOEUEΖ0BI4dT,9k�p�\p@p:A'
    p5{�p\	�{0�*ꡤ
    gr
    睰ƚ@&Q;A9c8TUk&6h #s4Lvv;PFe;E�tH	D�u	UsfKVB	5�Ox4\8dp9bHQCH6
    5HMIm7w
    0Hɠl1POL=Md,PJ0rP�!2NMI5":x#G<hsC9s7=7$>8M#!yPJ�"YI
    B"/p}V�,A]uޙ7
    x	xZ#
    I�`N|l
    Zh!np马z+6@#q: ԰JkT70�=v'4<4VXDF F+wTs,8WREeTEa7OY[R8a,xү0:IJ
    ~(L<Z�6
    m!I 7nda_5{441#!l@g?ml~]VXA:@t*PAԡlW88@<@KP1JdB	` �09<rSd�
    \B
     Lȁ=9P(\PnB:@ 	:׹ \WB(S-W A,'ux! CD&P05P6`ü1j,yЌ4IjZ̦ؐ�bSҦ8Ir|hr1?Ub1e
    }8X5⧇z֏�?l* 9H@zZOĤ
    
    F#HNCk7
    QС2
    !#݄
    1N5Tj5>`u#{! ~D@GabQhhh p8a
    p(�6�/XCR(�p9a�!*%r
    ԑ	o+ z0@	Ux@zdB�r8Tp
    Aǧ[(Cف�Ȁ lA 5n;laW/?uCPo
    LKa&wz:�NY!Mz;^1'(i,>
    vWOY8_!p?4A5тD#:q`g1Eqo@/%|JU4qwDzzqDMBӅI.R AUAD:e+T8.42GI_Š	i(*u̡%JD�!(G
    "4
    3BP\!A5P̀ u
    HuAр4@�k};5P9:(N6
    P	zXF*QJMrN}nˠ=vηw[vU4
    ~`C.
    h@kC4G"!_p/@ʃa	WDa0?OZBŞ@$$8GՎ	!"QnfdF!A>*8Q(IRхb<iB"4<
    |]64%yU037r(Ԙ'gpB>�@ЇAHB"`B7aP20D3�ᓠ2(R`,<A+X�B>>ٻA0sP݇h[ �
    (vZA@약lf_n�8Q	l�C_=oHO݅H^l 
    pqw'bSV/0p`W�UPrpwaP&vSV"(X?!%#9
    N#UTts0�-LCݐcFX6)R(@\!@Eܐ@q!`S ˠ;pc0~p`@S%PC*6
    EdtZI	Ip2P�E`#P".`np0�o`(R�&+H.p" 
     0rrU
    @`p
    3 @?P7/Jh. .��VI�PQA@ 
    P<�C(ppq`	�BQ=Sn'oԐ
    n긎8W/!/
    X�K]
    Rb(�8H`쀁PfѰ0Ё Q'5:fsqfR$&CT/
    8t
    A$84c"bost"'R1P<Gj w�	pc06exӐI5Ǒw@K[P3J5np
    .�p(o�)%bF["rp	3"m<W03r3"3Pi(2I3R	0#0X"R@(R"Ћ(	Q"�R��(Ҍ``X	
    qpe	+j
    Ȏ	x1�s19Ĺo
    
    @Ib`H"/sC_Epr`k0UQ�MUbQMdYA&@"B&\!T1
    7:!Cb„1B1!gERRT>b@*џ*/<j�;0q0(lpOA1)`g@P%	<P"ApM�X@
    po٤pPP�,pX8\�0h`�N mk` czG�fФPzp��0|@�	֨z	'W'0C@?p5:4U^2rp#!!0,paO5jV2J	I`);2aF!JsR!c9.b#sy�
    "903*-:
    &�X'p):0@	.*0jڮQz%3+P"	;z	sJdФ�ا7P9&Wc0cIsk`r0(7`fp 5dfpq{3CLڧ"਎\}0
    
    E^Hae0NE20
    FjZ,k[@P0xk9P۸;[{۹P@{{wиqPq0+g9 [}k@���3%P"�Q�|P`&HJ<&Hx	XP#hp`Hp0ȇ|<sz�
    �`0 W'�*pj%c)LF0saB1aVVNR>qӫ@	
    �'JLNPR<T\V|XZMmLpad\f|h\{lm{;02�+0
    @ͫ<L>h")8P�
    %%r
    tP"
    �%kQP���{(W)	~ՙ0�y	�/Ф�?�,aZ�߫H+\�@p7$	|5Wp
    u@p'pAb*#|{/0Ppۙ)$,7qT
    vp=]}
    }_=qOe
    (=`	Ppn2T�	cUHQa77�*�{"dF3("p%r3BW�	3
    w(r�3"�30#%�	&(vLY)o m}�k	+H5݁^2U]&3c!m!,@`c/>@F�pvѨڪڬ�epaڴ]۶- "M&۾H}Hps2 W`	
    @
    @�BpG�` ?Tph<>ԑ(<y?pJQdp	EDa pkp
    8�#	դ$I˸Y�P`x%GUPW{�jkp}+s5>!FB2\|	`=
    �m2R>T^V~XZ\^n�A_^f~hV>@A6@Pac`
    S�&ԠN>Ki[VH/90q�P�)nppsK0(YH
    �
    p�@gg� x
    `l�h 
    0W`j'9A@˕r~➄hp�x
    ` 	;`@>/2$4Z呝C!uS0}^z
    0=_,+Р?@y-;0!�@LNG��dهdf0��	PZBs`st{֢P.Y|*ߔv	^�l
    x8NPkF/J@@3'&i�qHp0H`;@0@a1EA)�Ôm٘j!j0	7?_oSa?ď7<@dN^#fl
    kmz�p
    f6&�
    A@8pgo)t^0mЀ
    8pЈX
    �A�:*PdXW
    y BFsT,$ܡ2	 H�A:
    r+^R^2
    >s.i!D dPb	kaԩ+RD?A+4htZUYnWaj/DU}bծe[i%wn]`mZhΜU6m]ĉn@cȑ%=Q
    ֬iY=#]iԩUfkرeϦ]6jl;Zoݭ:J
    3``	;lriQN
    n[5j
    Wf{OrE2K8Gbՙs&ިH A�)(
    (k8C+$7`@3bQsh
    uQ'a:"%
    EE8XJIbK0sm
    L4'ӧƜ/03,M<nZ <4 3kz|�A0"tRJ+RL3tSN;SPC/�$huUV[uUQCȱ5ҡ1Xd9裏,lhaPjk!*0iP\rp5s)\uU[T,Wo0m+0p5]NWu%\pA
    +z,<X>̉3γ1@|3+8	ଓ[CoLTFVsyg{thNg6:Vhf[qfW^j`-dmdâe68.&8{nn�лm滋1ذ>p^{.>qo>
    &&a8lr QIt#Kt7%39I%cyL@s]2A:TC]0wy裗~z꫷z~{�c{7|u}7l.*8gEL3"}N	Zg8ڇ�DP4L8QrXЂ�4@C@W rLhBn,,TQ�bj71r,(=J42g鈉abxŮO�SAOc$cxFB0Q#F8{_1?S@3�
    i!І3@3`5hBhA*rP!hIN00!
    {
    ZGy!|xH֝,Y'^dOp˰lM)"2q YZj(g@Ef7MpS$g9yNtS2BwSg=NR4:S/Ct$9
    =iL#t;p#?0JhGv`=QH+
    eRy _C')GAzSӨG	Sf:PCOĹ4ӨG˄8[W'6UՐД�iFac%kYzVzӝLk[Vv3V'@jv}HhJC("�2#9ACT
    ,4f ;֣͡gөS޴CkKi5*lڶeY*hf,HK/z\#@-h!�
    zs]fWnw]W%oy{^v;@5Z^W/zi4*9,H?ˠ`YbT5GYaF< VhG(gX|!dצh?n&]e!Sqa`we�; Wp),!?.7B8Q3"ɹS.8DwեF}e0Yc{kfs{_e8^ўcʾ#aw@Vlׂ<:[b
    >mcAG{Ex4USIϸ}저^>tʲޕcS�At�lesenv}m󶠽;8/	zpoMno;63r9܄rwVoˆ[7jzfN{nnd?@רfFa|+g9}&F:Zâa�[J0:JZke'=+FGҭ@a2J]Id^6qeF{-'{._5[Vs	p$ܽo7[mD{򨆺[�7nu/0;? nF[F6E�.l��>l(Wm\49νs@НAt]k}N|aFqus5W__'sBN@ئ;Bx~a3g&~nz*&@�H#?h8w
    4p�h@m@w?!wX+?;???e4`?�!EC`\ȀjRE�A#? ±[A頊sҕR55/@�웲(@>Ǡߢ*'+m%+A>>lB;C<'K@tZ�ФmZ@dL:
    ,?m"A\@r$DL@C�x[{?FDF<Exj�L?L�ğDA8APAdԁ<Fb8(Bh8:SB`Bsri`</+D�
    g]q"0	7%A)GA".2Q#|G}GGy�@gPGDG g镈(tH\ˆȇD�$ɉI< nЅH	IgpȒLɇIIt),xz�a31gtJI"!HGJ16xt镓끟�[
    4�h#v`(KxЇ2ǻ&`>ߚ&+1q63Gz#Lɜ	ȉ4H<�p̙d:뒍:ȉTHF@)ȃ,HDHP�d֜)M,$HtH,Iăl@aH̀,΢<tLJ{KK!B2Kr@K+PKU$e`�U̥HL	m`KG#2($J
    -E>g8MQ]Oi?@Ry�y|@GzrUI?r@Q  /2�HR*�(q�&hl@'R1]*
    /h&#H,Ũ}5ciH	�	p�J[`(8pAа @TL}"܀ozt(&[!O >hЕ4�x
    ]	ѥb:M{$CCbL]MTe]VfrPG1=yx(M,(T)SQ(V(:h5
    �*USR1V1 ]�6
    �2eh((,{e ~TR+yRnE.�`�p؊U|rx?WK1IHEF}TEpTtfYMO
    Uo(p8:Ti`U5rOYZ-^*Ū
    L	ʸDϨ -[=[M5[{�
    5{[d�8ņ04�5\m5�h[{�\\#Ӏ-�0M)
    :Ѐ: ŵuUܻeX][\K)U
    \M)M
    CCZ.�8suI؀
    h 
     :^^ڨ�6@LC{hEZ4S
    b)11]Lp51I HhZ\bv_=_3o>	Z̐PIj1``
    ```a
    ;`5Ԇ
    ԆʍȶȺUܾ\aL݈taˍ
    }f˥H`+F\}](n =0EZ$CK'8��C	^<!#a@dAdB
    `h<#X$f)C5Zbӱ^Q#?/eP&&cSأJI>c(F`f`FC:+'@B$Pr)`f4@|n?wb�fVnY%pf'q&n��fjfZѤffnz�<`fc&fxfVfj{椡gMZp6f<fn@Ni�N��'H=P�jFhani;,v`tzдs"Z	/Ҁi_0�XT[tYm8Хv`:VNWP[u]
    ])nk~kkkkzgzgPbLBe$@fnggMjnifx
    
    /Ji&lVMOgǾ�Dh>;83߆A�nc�Nn^nn	T BH@%&<8عr+P!hFU{X�tFr'G
    3$L`:N	9(s	7�`ppSn/PRI('+WM(|/}@m5nR�0
    qLQIQIyVr>Uנ_HQ*TnKVL2!v�vI@Nl-p7WD¨~$BU#,(l60�,Q؁^?ȡ�G"7p9ܱ>9tHGe6u=AFtXp\>*@N7ouWGQquJ19[%V';1n'vI
    6}
    WU/(2vRvaӎQPR"V!Wt_WK:3QDcsDVn`nxu7;J:Mɂ
    !Z0H
    Äo@]lP>
    
    yppVp-?R6yHs9$ɄJA8iyzz/z?zOz_zoz76?z{zzzGzz{{{_w'{כI_�601Nz||?!x1h?QzwxO=`=x=h6`R1vy^"CG{�G.ৌ
    _-�	_~~~~/?nGonqTҤ	 „4!
    'Fl81jĸ
    (uH.Ҍ1x+Ν[P	=%Ϝ)'РB-j(ңCiU‘,tXPD)٭;#ƹuZD+.Ͽrҭk.޼z/:MĊ3n,X۝֭lغM͙jզMlm]�5زg;Qa
    Ν[$^<�98m8]I~Z9nrڷǮpB\4jМ4Slغ_r@fN.Q(PXgacwx]0b:X`8'eiƙyVڃ-O�!t8"o':ő"#d1x^}W8w7`W
    ~!GrD_#]%(%}HlfYgiHZ8c\yg`&[ohx
    *jiܠBg?e(}4Did5aRHs~d@'<qSVɟ�%7ڬϡyag!Zcb+b8jsJ{bͣ:]^~ydVXa
    @f2&"#گlf8,ƵMp⟁B|1jY+\z%{M1`\BA|Z/;2м>A?q\V0n"1uk4'.Ru^sN͵	%[}QC$;=ЂbLBjJ6
    xt^to&pd ֋huk-9܄(ņdw';_Ԡu#z':{˷~! rsek6-PkKG9Y;OuvV6}_kF	b(NTXW+FMu_Z `d6.15= 8ǚa:Wb{LA|
    1 
    SFQx2 .f-2tQ#R
    ȜPl#_FHp*kRךxƼW>4j4G\06rsD|m
    h6;a6 %1~?$Ú=b/{dOS8q ;;JO
    A8JyO5cc
    y%l=yJLvd!.ct,%s.,)3JRaq6̽2ۼojVt&9K3k#9,2fuNEFv6Y5fC vĹϼt3dʇ&�@)ub\<IO*}ßFQɤtc#wЋA{ b`Jiވ{ Oe4s(/)Ҡ8Ԓf4jrl
    ԧC%HYsXKC%x]bp5Q"|Y4ԨB`U-#\紕m*ӧu,;[k*`O,b"3h@%6YpYEj]Sr4*:"sq[qZPcŞ-j؅oPfv-B4q\ךZxmlgKI䌈LW1ˊ4uwP<$99Hހ@fUksb
    fTڗ>@	_-rb&O_W5<I2Kf®l/<cfƎ˜Lƀ!q|6@&21�,g9�8
    ,ުbƱ0>.ËaY1URJ噹"Y^2	L!_sS
    F07[X<%+-JytbjtÅ(
    E85$3LѶld6Hgմ_8g!ڪجoWY-Uqm-[x6m RtEݼ2luӬ==|ҙ~δRٷƘjCߵ!Ho	kr8oDhBG3y[]dO?+YޏEAhQ
    S2PK $`ᄃ,?͙ztH.(s�L:m{kN.=kr�*`۟ \@U(Ge:ꦛi_Iu
    "5ٱʄ\L"V�s߁0%o\[
    z'[&|4?tiiڰhA:QDT3E:ґ/iS|QՇ﬇>LƠ+ϭp�jOqт1F}Z/ؗZ_\ޒ\o]L<4L:2ȟ1%}Q^�~\iX)
    0:,;
    dC6``t9XI]Gٛw
    ^�:O ^Ņ=aPi!_ӱ`P`^�T]Vt@.�gu!  "!hT"͍#h"V%%!&>b%B"&V&*"$$b%"* h3F͠db62qx/΅& Aaٝ2j!!4!:"7v!6"(J$$,"hhb#b5c)8)"_c;�"c)P7+b"Т-fCh?/E0*Q3ΜހҺ'M(ŞHtE]ݡnW.0+"z$NN$OO$!P
    ʠGQzRB�N*!ܤP22GT"ReT2%4BT*DeT�R�ASreQ$[%N
    "zڠ%4|IXu1BLdh*
    X-	I3%M-׍KڅK�L
    L$qؤ[~&hʼ<@�QBRnRWQ
    %dVRWvnW6%l%9&lqbJ\.\VC]]^lPF=d yuy	~xΈx&Seօ$@lpA$[X$~~'Z$8#8C�#03 �(qP�hekY:8(4(q4h
    3BB:# @=8(h<Vg?4܃(
    yg]l'`a(mYF5_2ޘΈћjʹ'|g<Ч}>V
    (0B1Änh� >(#i�)#Vhi`鄖bn6*~:C�bg䃏69iLALM
    PW	\ޕVam|eѧ^€xx++&b8C�DxDC<�hdC�DbB�G4pk6hdgk�g`C\*&R~@|*NѫbiY	i:Uaiժ!*&�
    Av+,*k9Űbzk�䫾l
    %J-Φ+kbg4N+,,
    ,537�:EQb,0`2 K*O\L)~BSFMa*ǧ1�06>.FNfP@�hh=`�h@=.66�-hL6n\�n~nn.Prb/>#ue	
    iB4@8PC*"hȅ>lƇD
    Ibhc/WJ
    hbEٿmP]ד{/UJaix.Ҥ\�؁f4?0GO0k=tn:boPnPjbzPb46h
    nb>nn�6P�Vp/$.z(tgd\!PÇb' f|?h\|/ŬWL46 Fa ]vmÈUAn]؁݂Fz҅T~ѧtF�q>rhB'4;
    %?(t!PC%C7tC%{2^;�({2Z*
    !t;@e'r'ژeW+%$gMA;H\	lI'vm�L(0$h|ȧfZo]<'qjr71c1۶-UπX;P3
    \72"W@}^4B'B/4C7Bw%,A2t'{2.eWSV2f&g4DMur%;eZISC4Lt;04
    A@'03S͛!x>X3Ǝz6F1qOߒj0*5M)=3F±˔= \ŞIѡ-�[)wl>PI40,3g`,& l[4k4l>6N+xA9LzFb/bl*`ct0$ V\ 46;ЀdC6y<.+S7&^]L&qdtq5VXgk(7\]:uwq>.^	nx^~'
    ̓JjϷ欰~f
    7xe(&̬nv",NhG:x4T+}۬gHlEIg;a`b\w֌hR6Dqx/w;AeZE%7?˅< 399y�0	9yù99ӹl999/:9|6wAV`6t'nU 폭dxNסlC7	FŚ*mՒޯCMy\T\d9|THERLQDLHAHHBt;[Ed;QX4HVTt{O.OP$щfG'7pN,"ǰ#Ʊ$\kZm\Ĝ˘/<e7Qa`:ЙKM5|{|%(��	
    ă�(P:P/,;l=LA�LC=H}rԓ=X4Bԓ(O=O#w=iL}�;D=#d}7L},}<<Sڐ:N;C gŮܺ2&`]]>[>žԍf</E2<\~~=Nwm۽OC�Ck=g:=}
    %5̺PrY4@Pr};OAPA�BޓߓS-�g$OCE?	4xaB*!Ё�
    )VxcF-NO߿I4yeJmeL3iRdM;ypB\4jаً͙3hЪUX\ҤA�A@aZ.ݦMVgZk)2`CG0`H1dHi\nZR%F4Zo#7if͛9ka/@4njh
    umbh<
    YWqZ�y(F]
    4h
    N#ݶhaJS{{t;ۏ;eŇgYM-b6G6-`(
    	|iIB-Eb1)O)**+",<.`$8?v:V&0SL2,v`tRL5	4n.5-b7:O+ӳ�~n̪.;丳»G=gt=܃/N>Dɱm""%RUS	:uXe-i	p\1lzX@(*>ūڪ	ۚRHvÎ:1f5҃%^9cP,HTv
    vFp&paC�8p�G@H3a!FB~Y28lh0/vډˊс*+nocE͖V`•3ZWUB['%mؤ4}j٩rhekޛm~mI&Bx孄^{7~X5WcgvU.G?S�YX�\1Xp}Ag<`ifv|$G9zY4j{)M NYm8'}b~.ķUY.VE#k}23A
    %
    ,�51d(5
    
    )Ta40!8}(AC�1hpC?a4r(047̆P$.(N<
    WBXRKL}fe[~D�-R#gGC5t
    jF@$UmjHP	R}cXH57HZ35#)
    ]A
    %sdA9ln"@Hm%<ay98CPXqC(12Yr<Sޜfh�SDɑEh@3q)8c6@{ZS!�dnhHp"Q6#ۆM]rkѳ0y7rR<HPpxK+t�y@:JXIURԥ#�4rR�LX*R-%ЅdaZ�.p}\I41`&P9{R#<رֱhL7�Zv+&YYT*-K46ũ�"'Fl\Qtny[Y2
    WÕq[.K.pd$c@%hխU5h,lkʩƱ{(YRq@-,ZQ
    ]B,HHF@Mmjb4eAt+^ILz 
    &PFS({1i\cX!OnLP`qstc[YAr'	LPe1zR$ R*�6s{
    SGQ!F@j
    uΚAg=?hL$"68x;;4$ٸp7a�|8(q$7L<p̈SjSթVY ?:AOc %?64 3i#0@<HPI(@w
    =2@iID
    nABtc47C'Եr@Fp}Y0',i=t%(Zq%zzP!
    #3q!INKFA.
    W�8;N	Jq'>  	V`.ݹ')^൹:]�0"yNGC_;"oZvt÷I9vx
    4{0' LC�w)_y_׼x{~7@DK@�Q6> 0@_`�/8tNٯڝ'	Ʉҷ>OiY+	].pu�,a	Z|�g(�J
    ,B,j^"-
    (/N.`V 
    A�`�@b�M`�.ģ[l*
    jMt"UnkA	c"mMJj 	ut&/σ~jP簩0P@f >/
    POL0
    2���aF@ ALi$"B$WE!D	c#L<b@  2a,�@x:�l@n'!="z`(LaLAZ�J*�0  1AEb)
    ώ$AN7܌0!
    V!
    d!#r#pbŠh2a�a2a&[`(2-A1)�sQ*^'>
    Q* y0.kϾ%;!B(a
    +{Lơ+"1[\Nv
    t	r  `,y%"q`(
    k(
    EE2Lxxx(
    P(21)7)CG/)BVJSUB P5Q4S5,/,a�\t@: `r`8`v``b6g/; 0ar00 1S
    Ө"s22233<' n }9b"T/>/&D,#>>,m(+<)zx!A
    �H~C=cRF@S":3&	FQ(@xME,`aTfab-3Q394Z5C	#2H!$"tIO"II6)"Aר#@J7dA
    6�
    p%4#>T0eDMt<PT
    TtEѳ^*!nr<y<}t=EH}rJD!4-SA\SRQ!I!~^b7Q4|.uM9ME'àh)B.TJFgFP2S);3)ts,a$!R]'55#U$5>9!<U
    N`$3Nn[-MS&kVsuWW);jX˂F5(ad(uYY545`^{"Z'/V>U?u!tlqr.|zx8Va%C:B<#l``+``uTYӓa?a}t"̿hV'lwcv CEV!HdmeeK `6)fjfe_E4̬h" Lkhh)v)-$(6'BR$Z%(W!nBrk ˢhltct,yvs
    ^q܂
    AfM7U=xf<uGwaaR  u +5$	[7&$7!wrKssK6EtT#
    U7>XzuPleA9q/`www"aiWiWqE>ku6yU7&ҡcxy7@Gt!,rEf~DfmsVa	a.HPnA<"^&ph	uY=)UFRͦW"l s+oiS
    ^R@ˀKx}e2,0n+nX`rwpp"qqG|G*;~#~ 8kǏ)8D,x.r!b()Z5z"btA,{0@@`l ȆEu7Y{xi5 rT�	M5x6 9f!$b
    !ouOD7@|!P
    $az.aUEY 8=qk!vtKyc;JT"$|QH�n.ٲYl.� vk2.n!͢}v�$ LZ.�LAxB:Z�¢m-8:t9JSz}_:;o'/:7iqQZM.8
    �
    C+a & . 0D|yi$$kz%	⠯��@�$%t`hxmHZ @٦QϩIIZ`"@BvPZ.�S:V[lz7Wۦ[5=EH[LSE9_
    
     1`�'|`z?%5`BK�Z
     2 $(!&/L$$2!!`if@zH�l ſ	ZLPV<a`N<R`l�oAw,2|ãçç)DM\A<#�0� Vo<�,�3v݇ܬQH\#l uLjI:9ضm9.,"llba<<;\Z`"�lQ̛((:aM`xX]mL՟5ɵA]}ԛ}T؅|.b/p ~AϑRϓW!i"
    rW
    -"U="}#>BMѽSxK\e&R.T,""Ȃ,
    
    ay
    k,lKHAb.|_` "G@BF,2hFk^VɁ-0~48~<)ILcT@o	zXeSԮ	nҍ5#WX|_5r$=haBf.|h)zp
    `tL,,#~!a\#�5˂TA_*_Nި!_\~/26p_U:�x�{%0�t,WU1ӿ
    Qb
    v"h8KML	+V@@j. С}(p:C< :ÃDT:sZ%MCgb:(Y3eIrρ:F)E9z)RI+["(-��`pc�"jnQ
    ֭l|FvZi[9͜;vOѤK>:jF^
    ;ٴk&ж{
    v?n	qѨAf{:7ܻZ	\v�H 11>/ڱsDH*pT7a4?<�:\uPу�a�RӁ	I@$ :C~SIXI: Thg2zJ*tV|`!cAdye6\f7n	ggڼ]vIgp*ǜsIu6f~.(jGyǞ7wHPFXVN`N8M+9z; Iس64b4JM6M�@ +9ЈABG1-Dz*ʪ:+7
    t#|H+eD}yeb56
    ^VoB
    OhIq͚IqxZ&hsEǥ}< L3Wywޥn)C:nLlI,X�~�Oԁʯ a�v÷�j.
    kM-h 8+I;0pgXedE^iddiS[ɡgk!ଢn躕{향,(ASu?3N<m7G3흰'd3ݠ2/*
    Lk6cuhL�L;SH�4@σ
    yJ� ;*ӳN=UmkRUTPg4U|U�frZJV<8 7!j
    nΆ<<NFp;ܭP.CT
    9$Jq4٤xvK5y	^5W=aڋ.
    T	azR/F�
    86[6@ G?[RA4cӈXi0!GP4B'L3Vh*rSI]YVs{>d4s˥,iIҗ"SZƻCFf*Jjg칆rlS]U�M/ Rs3s72Y-;9Bp; {X!VPl@,Y O' CϙuFa5gmM5~MChDeJɲ594EvtnSAe1uWd:lv+*<,^3&9oF?0Z7uRA9!88{nu6(06F~,(Έz% jEUUUaeG3GT>'mGJO`/\X8�bs*aִ7?8D&tmy+`CAEsd
    G>zTf
    E7FܴdF
    i#t1!@P`�9ћ4U.-'ә}>r68v̈́mWH`-2{:ö.5S&˥
    \p�=0&ȱv)'>x0N%^3ņ}
    4܃X_�Nk5pLK`s$fb.sDs<!y;kd[vYr`�� @*@ёt|PS۰/m.W;CHFj$wZ=X8}Nkzי1$1T@`Xa$VL9A
    ALc'-Y7,[8hn)24u7-L؛Q1L@Y	
    r
    @<`HE*@j`f܀4:F0ئZ<OcEսas&sQr>V@D١:
    r 6^#s<ż&M-58TNAMO{wN49mmDù7
    hnWC:hJ:͆OkMOS6&NIѣe]n}wWOcvpsF4c8^[8?,|^{heO}qu>wL{3ulz;eZЂ^LC؂A�bVj4Xf%'C2'ۇo|yH3~D y14Tg1Q~G,`)-\G`f20"w'&KqHv͔?
    WքL^Wu0�P*qgx?Cy'7Dȷ1W:Zq}x;D&a|хtڅe4`hӰ+
    uwnLea&0nH!DW/a08ͳE"*dexs#YvH$Jx6fk~hS芶rQP7	p㋄u 7Wq8E1Cӗg1i2QQ׍#(LT|AX6#A!uH?&|t1y6n�	!D-99&3@
    O#
    V9
    
    dHiL'9<)۰
    腊ZiW9ȍoV\	ND?;I哏*Uؕb9fƀrC=mɷ		Y2�g:eIUAy@$v)xzIdAXgaUyzBsbI:hHsy~3G$0IH22#<Љϙ8I!̴~4YPـC9Ïu(;?uݹ:3ўy9<Y1's(uIHChDwA1Io:{yOm5JzaiC}L桩!y/٢vziKY<L3ɉK4CSNƛvLEzsQ꣥q$Z55[Z[%hJ[Q6~ljsy6awj/I�syLcJj6lƢc	g3gYZZ'	
    K<:lʪ!njrw lثq(Kfor
    j:zD3gryu"
    5}Q\-s8Ϊb7ywگQyG	hiؑwwv
    릅yبz#{ygA#ZZr;E~${ح	~'~: }ϊ7빅w
    PۏcIY}G{$C/+<ek[K_wթ>+a9r{u(1o'rw;HT2`}4Ÿ79tu&JzPKZsK+*AӴR}[+QP[kV(<
    λ~ѹ�=ȵn�𛳋ݫzĚE	;kmCa;w딘j׷!?LvBkC0벉V|KvQ!kMx,1A*<lq76\ЫÉH¤'Aq7KĄMISLUܯR[z]̪ZcL`ebk>\X$qLulgl9y}<wxǶǁLȅnl`9ȉȍ|aȑLɕ|Slɳ8əɝC}ɡLʥ:lQ8ʩʭ0ʱL˵&l7˹˽˨LŬln7͜3LռoӌĦ,δjl\qϖ|aL϶e|T,Ƹp@q� BXR-Mm
    !-#
    ]Y{|M
    Ӟ|		!NM;=?
    A-CMBm&�1
    Օ,1`�1W=WX]_
    a-cMemgikmo
    q-sMu{ 
    9MMՁ  
    p}P]w-ٓMٕmٟٗٙٛٝ
    ڡ-ڣMڥmڧکګqvי%طm^FP]
    e�4@Ǎɭ
    -Mm׍٭
    -&	vPE+
    }	X
    
    r
    .Nn	
    .N
    _g47
    tS0 a
    +-/1.3N5n79;=?A.CNEn8&68ӃR!.l�@"ЎP]_a.cN96X!5oNysAwy{}.Nn臎艮Nd盾rt..Nn꧎ꩮNMU|^ղ>铔.Nnǎɮ.Ң$QMINnn|/(/Oo	
    /Oo7emo')+-/!ڎ_MR?A/COEUh/{O;G"FoWY[]HLucOeogikmoq/sOuowy{5�;������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000163�00000000000�011565� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/manual/images/chapters/architecture/underTheHoodSequence2_small.gif��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/manual/images/chapters/architecture/underTheHoodSeque0000644�0001750�0001750�00000055027�11377016712�033636� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a���ҷonYtئɵг©iŚqxxx쬬ݥ}rupǢëԕz՗xw`ʢmgfd~ڳvvmtlҫpѵXVLֽߦĕq#%̞|zOQҟ˜|uh[ȳl୍}𹙐l]`]NED6ƥ峳ЛѦtϤNRÑÛбϻ׿q$"rlg¥qslqzfeSֿªʭӱԟƩҷ}}ёmĽՓx}}}__^]]ٚyrrrnnn۾Ӱϫkkjev@@ţ\XקCD!�����,�������	H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@
    JѣH*]ʴӧPJJիXjʵׯ`l66dӦ]Iv`[oAƍ8ۺv+Sނ~mW,BWs`A	3|q_lU&_3pܶAJy4leb
    [7gz-!&\63|Yj(`Gf9T^"@lf̀mܟ/]Enؖ[~jUMrhmtC@�"R8FPCnub!Z4袋'RXa3r#)h;cP@45/$#nHKb1v3VX(TЃ5ae*(%\8RyefFhVA"Qƛsr99i(C0ayh(o`$/!=b0)aV2uPj#5JàYBE&0(lF+-"U�>\P6kn˦綛˃QC
    ֫lӮ[/λR+(:pCCF;.
    w|҂,pȔxH3e›#\#q%[lOr 0.;1<.^t0fcb\/�`C`ehPl"d@ 7zSc�57wo}Kиށ YdCzcNP8yߨl]M(Ocz5N
    7;wg<{N
    "Í_PCo9x^~-NÞww^
    N,Do]7ҭ|Ԙ<-L<mtq@@GL~8oB(:ʛָڝtX<uЂ!5q?!1\(4w;qPtEqςb`~=աw|`!0`L0@/\G͋Fqq>�&�0ѷnPF5ʱicנ8α	c85
    \8`3k5IqR8G5эD	p8qF5aK0%N
    f^7N!]"1p"AL]8p8l9±>j#�513\vR@H9pmc71^BНq	\ӘF3p(8qk089VSEݠ7^I6
    9jTr�v1fP'8C$	NXՓX4bmX5(4vnXb8zWf&ueq)C
    tA%?Y#P5N8n4aQq97qC44!KSݸ8.z
    ]*	9؀int֢	5c".i@ӹ݄8NA
    pv-5@.qDxw;!D`Ud%lC58N�]8qK<@j"Dypp7q N&8U|p`/8
    ٰ,p;#vg^XS)UG;DT	<N877-o6Mf^Í`rF.w�@7zp,�C4-Teo�E0�Bp+6Aw> AO(5<$	nhmب8ٺ1s<lk�1>�qw4.WM	T3od�]H86p
    Qj 7Da�n&4�?wߤ)>`}fC
    �6p#?PF$gpUޡx54(6s<х
    
    x{la-޶qI3nA!4* ߝMG@rAk썓mm=Եnv!b#750? r&(p@H!q(p*2@b=Puo?4◮x=f
    ~
    A
    #zLM
    5a>V:lcZR0B	 - ޶ΟѺm,`>o>ʗJ?o
    F3|	Np	A<z9jF~!0@�@$�;pxy�`p[`b�`[8hSF�v!�*�հP@-zpD�*Zw.a;�.0Zb@-P	$8z`dUxP�x`.* 
    x@a7@
    `p	{(
    08�d00'/@? �;�p
    x`�8 7a	#8p�dP
     	}7!0!PwP7}AW
    ph8d`
    �	7`@B	h
    wǎ@@ưk` 
    ՠ#0�}�	~pHϗ~!dp�i~~}`B�'y�8p0
    9*x3p	kP#`Qd��\h@~3`m7Pp�[xI~py		p�$�ZP
    ~)
    77Ԩ`$�!
    3
    7v;p\)	0z�̩.`� QY
    Q	l	a=fe�F�u*x ԰�pP*0m�H	�$Pw
    P;. }e~`�x.6d@.$
    a"huC�}@I8
    *pm.�`
    КQ9xH`
    }�i
    m$o[@m8`p� ip*hpPi-P�h2+h
    f6`
    PD7`
    Өl	Nz6p� `�?ZB
    uʚ`p�P a$@-�	>JS�
    zle7`7P7ڨ.`}	'x�@m'X
    	?p	0z@@șMʖx	 @z�`
    @p0uj ˯`p
    0p	-7g{�-Tz$p�	d@r`=YZ@�p	aEP0`8+@j [xpy�j$p8@PNZ` 14x�`=˱p�*�`L*a`
    P`kS`2`
    `@�$:m`8p-kP}\0EK�$结> 
    z �`
    Y
    �{k�m;kpkˆ*P@զfP$$];8ةx�|S{�6*tp�`pt�>p}x*8[0pz?`knft )
    �L)I×ך#}`-Z
    0b	i\dA3Z)hp�Kp{k`kpa�|*.p;i$ɻxLb7P
    knB'XI zan-:lиT9D�p;i1(E!Pm�G#< 7	]TtTks:Ü2�7PkrxD@ zX{PL�z�*#b00*t5[aH0WEfPxp*=zh5d#k?=k,I 
    ~-0- 
    ʖ0P|ep{!F\aM}8hΛ$p&:;pp�z.pbPPP#
    Q	0p0+`}@�{(ߜ9j##�	@-P\!p�oJ>`|
    Hq~�#PqPx0r[H-Њ޼h. <#	9x`�	p0RJ>˦p`*�#`8pq@[бjU9s8`{H|'[
    Z~mp{0'2mb�P6'Kken 
    @
    {܍ih
    뭗~sx�K]�֔:p$1
    c_飮2AZH@T9ྋ.0q@=:m*kNԍ	`i٨[@iDIׄa4�0v�qP0u*k`G{;@y.ඝHI`q`';ځF.L	~FiҨ[
    >dHD^
    bN|SI^}0=Aj+
    [$6|O`;$l$O+8$t`9l|/
    O;8@$ 
    ƀ{$?*8ÿ*{6}Oo{		@P?}Ÿz$ן/
    ̯;$Tc$H8hCUH~HMX~yJXؖO"qr	8`NTӡ;Dmyω[eGL
    ,gIRalG_uo;.(—"Tá	.7A6B4fL&nKvA	wDȲ؇]FI.8߿fͺraӈ6>qܮ=MwañuS!샋eI2YI-̔ꚶ
    pmxÄqoɳ_
    T7i~_3&௟
    0@$0$�j�$|0`	3B
    老�p
    �0@
    !Dtp
    4TP]tп
     O@0PA<RI)w@
    QG!TRH;RA.@LBب7xPd?Ntq2ܱZ\0B	 PQ+ьT4ŌЇ!h`FQI 1DQuTLV\E#eT5 qVU4SD4aAWTK\HluZSTUA?3pS)S1}9--R44ӀދXomfj�'1`fa߇!v0l
    {F=f)ىX`j8ykjfmZ^xn`x8f!8b'nFyo_8tr)%sFzl~ya^zK^zoe#㎛h\nŏa:kj4崫Qƨ曀E>qy{q#jeEqB!wlwXeCo}o<§ap{|fEFjTFoj	gy/[hO|
    9E=Q&xA,j[Xh0uh8	88F'2ֹ.} UpCĦŨTZ!Bl;!~ֺuC&%*r
    CZ0BdF5/D3H4k[
    pLPDP:&,e-k]EmaML
    xq9#8*)mcPIJQ̀Jɪ0%N*OF
    G
    A4!g8FWU0
    hPlK^RBTRĉR߽S?GN&
    Xa,$"YӐxrg\`
    XXIDÉmg|N(1Y`=dx0�Mg%2[,!=5l2B_z65%Dړ#rvI޳53@Vbef6TYLҙ&"*vG^Lxâ߱ QՈ*dFK7T0#\F7&wVe̜
    UM/z۫&T݀UF)zV
    ?�F
    `)?j
    3~,㦽iP6{L]5X;
    K�G5CT&O!d9^d:qdoUƹǥz7Ntz&۠U4gL.,`7BVM!u4rVo2/A=([0ʞMk+57Rx]p[n0V^rg7L%'&\o`.]Xjg~z?0[H_Zf3gw?*PJV
    ☬ +Eѳ!$-OyRݤ3:I>ц2@ܨ@~gXZ=MOԃ#g@8"P͇A"$`9Ѽc9cG5ֱ&uMRPZٙ;Pcxd1㩹م6ma[I,ԐÑu}r7V4J�Jl|@t
    5#qހ!;8\x簒OgC!Pȸ]ب4q8p0yav3#0*6
    ^aKg{+q87]nkkmdYFz ~P4F~
    ]{{6o57w'^g|xp\N(�kx|=yaA(w}]xqCY3j1};Db=op^W.�[|wz	{
    dB
    ַ@CtY~ xטP
    'p[x
    PSh{nL�JY@:q5Pn&`l
    
    J6c;;2A27nؘ
    2LA! B!	$8;5B&lB'|B(B)[3{&�QB/B0
    H[+0|C8i.8C>C)�ϸ31CDBJx>n`ZI%LDKdDS(A/P�PEQQR<Q�
    @}@EXEYEX4EZE\7{OEaE[Fc$EJ(n8FhbFcdGh4lЁg|FjZFpGQdC�;_NrEJvE/ЅRq/(
    ІcP(F�7pW�|H|H�MHH70f2Hdd,I<IHClILI||J@fxxIfIFXHW!l`Fp'`ȡ`ʞ�7�(H7JLI9\ˋIWpPxɜ'I4THWhFx2p;/zx'XȾtHM|'`kȼ.k�꾸P Ϥo
    l0\M|,Z֌M٤+x|Ɇ݄;I{&7
    NMMI〶{lN묏uέzM/.k� |٘d@BOϨ�ʬLbkM\MN
    
    ش<PMl0:(x},iCP
    U
    M;\Q�}mQ>QLNux-��;5R&eH&\R)$[p ,|gR/N;L`N4NPM+mS4!9e:S/M^S>mRL @
    �CE͎|.%QTTKTN!�X�J5
    'eUtU%(TZY8\eU;|3U;\\;PF-VTeeVgmP~�^\BuVSD-VnVpr5WlRkUW8uwxUL}u@�y=T
    }WϔUiXt5XlӄTh�pbc%PN!h֋}fm׍=jVu\WRMЍYՕUٕeMxٸiԆ
    T"WTUR]f(
    HR5ڸ՜]mG
    
    `؉WPhUڸdZdCZVu]f0Y{M[_MVHu[q%׸=ۼUeR}~׻5ZUG]]\Z`ѲSSĽ[:ZZv![׳XNETE=Y
    ]KEYWzZm]U\QMړ%՞ן]u
    ZY]eZuק=^/bU`SwXU^Z\א^l=[DžUo=]ɽX]zPeW5Wx]߾WmRe|ן]-\V�UM^fxU\XRt-C!hYZb1[%]M4_5:_X_�lQWMϠ9`^��&Sm]JM\׽NńNdp(?EaL Hg@U'S�h�Z
    ZHUEڽ[�@"Y3.@=a\0�;mw�b8c  COP5VVZ`HB5_@[U`U�QOdPdR=(�~vUx�w vHe[
    諀fxDlP̼Ʀ&8UF]=`gMfhD_-_Hk[Zd5bQqgr. w(�l[t8gkc0u8
    skx;lтf聹<d&f=ufeW*gqh
    W]MWc_H(n8`Sњ[|ii̦:�!jx9B?`DP�Ic UN]hc^YM|WS!fP-U[hhHd6J^OݘV0aNе;lkkkkPlPlZ!(lk*�%P&HPZF|,!paM(0d8bHg`a8uNP{MM|I[8 6\jTЄnnnnNɞQZaHUZ`v@U b��fHY>ZT^@`�oPY:�g8YHapdL8�b(7n7Rh2M5NN]iXКk~Ol6hBP�aZPb`zc�xR!8Z`"��=?v�[�xrr&8~xYfpznmc�8v`8?v$cqqC=6ZOmkLoPdSdkQuR/uS/SY b�pPP�Wg 	�sX]w?p8Fc _XX@�v@xpz@qhuxgha`cZ@`Dhmֵg=nCCLx/x?xOx_x7(xKb8{'Zp�;~�(t�p�[�xx>f=;-a�a@w�x�v p8^0=9bpt x:p^PchHfMi(�Z[�VcOU[N{_{_�PW;.ujPKxp;Ռj_NiZi;UPȁ~Sʋz`d9~VWUWԒ�0nlf}؏}ُ}klZ nO�Z*xP8t,Yu~ZmwW
    XBn~~Y�oYV)`XG.ZAi
    \H�XM,h „
    *lA�'R(ٿU,r ժuNj)W~?}JD˓eiNA*di~!mh
    bORb@լ![?`$$[IIk-ܸrҭk.޷ܸYQ!Q02RF,֚Ml)˚;fgb1!]l5oL
    5زgӮm6ܰņe3&nW@5+jz,,k1>�ַK1L;L!qFQ4V7Z=vg&(�uM5thZT-U>(F x5V)D쥵@BpoCq~4�oh܈+QVi;$aA2j+|\DISPM۔mEٖc\VeoX~^jie)eS9T	e_6S2N [0ЖA3hj@+bJU
    JmdrDd(S-!Ť	DAABaLAEBb1"DƐC2J+-*-Ы5*쬪k2k"W2a!@5�
    (~^:=K,R=JdzTB>^0PFhQ]ESqpD
    +0(\THqg|
    GrHhH4|Q�<3T|6J4N7ERD5;.&EZHi5R'M(LM398mp
    09#10r7Cxs7-q3>xw}xm7݂nw'5tL[Pte}:GκD޽C,z^zV#![C\Anj(5C\3̱r(|{}{0DLrj#N|g7|Gʛ8(5$74Z2a0%,tB9
    IQ@k0Mn
    1'.DA
    nQ�`@R�?i]xPM!
    g"q}C
    /Z6LWHCՎh$kk[d0qB݉=jFԬ8U@(q̗ԃ0x?h1&dPZCq!$1^iN	d#�ArG%B'FTD�P'bR )'1I.#
    ֨+a	K,g|1�bń!g`�*	5[,e9TS:|ALx0q΁
    @6;)r@)PQZy'׸2}iHh,75tBH?*z8�;b`,ၟ9<AbR� )LSZ9$T()K <
    OG4RSV\^-]I?.DbBq4�a#\Eိh'd*@Ԟj:=FrzFIR =юR1lJo¤LDDko	XSCeՃ[HNԝQy7?_#ΟBx
    Y{~%3A&FRl)xU6QZw4}tVou7T}ëܴ}Wd+݃TvlRIWf`x	8-	칳2-4kI<׃G	58	dӃ7vXU4>.u_P:r2Wd/v: HVulZZ6;mgkڥD,2NG_{f8H(ȡ!P$
    сH`@Y H%	h&	�
    *Pc�["Yd(c-_L\g!Ռ�F5I6/@PgP:>CȰ*jd�`
    1qh< �`,�h*$!u#=)-WƽPS�ws!'gc}b'73B+hw<1�cu`q9ȡ(3zQ�Ѱq�Xcx,nc�
    mBh1ŷ:!Hש_f*aGaz(eڸU�f!x3v�!�101uS<^  FzA!@`<?!x
    X(P_Ѵjx@StmOqb5A:C*on!#&V[�Nx c�8v?,5
    a?2LD9i65;Y̶�k]{V?#-e;c5`KЁ$�64OAWaD� 213HVWMFCgaJHM4,Ղ?4xY55BAVBSV9Y4jM9!A\XE(cy9a`h[m頀(A(*A>}
    s,`]a�BNkcE`�!QFlDXl9zDI`	p8IՌ5>17`ܐXoO
    adbRaD)][I^Ģ,Aþ".b.b>E0�\?IMH؁(‡A#DF?p5^#@rcɁn.EbalVX,]E,",uk`5ȁ6
    D@$A't`Q0A@dAV�0$C>$L@+An$GvG~$H?BI$JdHC;IP`adt#w5t l@T6$s$da0t]AA-�&(�tޤ!1�?8@
    <f"�IDH[[@\%]@'#te]_[>t-X�b&b.&c6c>&d؀B-&d^&fff^dB'Lf&0z$GhI_x+~H<5C F�<S<154*?F=;8<B,;	Qy%EoPP}T@$R�
    }""0g~2c}A~ҧ"02 }'}&.}(Â'~*B'T,K6f(v~('((:l@#|IcF4A$G[L>aD{ΒNZ	*,*?C/|;x�21Hݝ@0C:��n\=li:0!�FPCP	B|I>i��
    T8l#u54C9NL4l`(4lC7Cm5�8Z5~(B6j8C5LHr}.j^d?/Ҫ*d?�zeH"H|^\~|8XN?0p
    p3@B!�4,ܜ;10
    A/<�W9�U!*C@^%pA!6B\l�l9t,N@Ɔ@.@n555P(t�jNI%}m}N-&lL |+,+Ȫ^TYX1GQ4Vn.p4*�:CZp':�(?,g-�|�,qI4*D\Dc�)lp
    H`<,X`�@B $$̃@Bh,h@&<J>$@)CXnT6L25@onl	|042inT@|U26P=Pk[	uhPf PO!AH� Z:�(Vp4�!@F"�؁X1\@8%@�$1�/ȁ=<<�0$xBA؃)C=CH.@%JIGPgdД"EHz]J*Ʊ1ױ1'r|Brrq4C�­0l %@C	�=(KrA)H/<)؃=2	0�0=h786*�1>v)n0d`}WjlA`#::3;;3<3;ȳ=3>5�!=(b�p�	@<)@< 3 s@2@0&,#H#@`	
    K@,7L
    `AI_1El3lx3YծjٮN5UWXVh�@4�H4kC88l)H]o�550D*n�0"@),]׵xɎçNd9OR?PR1RjH_YQk/kV_lLJ1"0=܁uX8ՌB!\Y_858*^rA87LC>99(8Ԭt8x8\65x9l5~ @ `Dgh|"Di;D|k*c>)R7888Q&?8[df|#8o?԰^&]΀[rx8\vFI1LQO}cSqAqͶ9lś)"9ˆeC6�r*dF}HtX|9y5|yyԀhog|EoBx~kEkmz^D :Eu
    86x):Y$@
    t\0̈:Daьz][H~Z 4m?G�dhUN:
     7x#{**3r8{`D@$oӋ.PR6lTbX3ܛ)fosI*_pd
    [GH: E3@	v&C/J;7wARKRXAaݸk<$p|*|Hڤ)U,#@�5txz<@86ݔ0x'*-Z͎KĭbHID63\RHpO
    :G+Lާ]Q0
    ˽~a
    �$<FnSC8t@A ,E�w\P2rV5QgL2�\[u6(]]tsK<43t_:� @:3lSw�ÕB,B/'�,<C3C
    `?,:[C"\:
    iϗ~CKۅD3iҬ1a"�lښ5_D)VxcF9b
    bG#Irl8I5l(ď۝y'I
    +U;#A.5ziRK6uZG9׿v{Lb2,aR1럇ͅ7.`�f@`,=�� ﱢ*Ai 4'In/AV`xT[lL(
    ˜yoOr%.w~j݀
    e}{v۹w|xWso6`� ǯ8s R9`:nxr@VOd`@`hv`)�bnl
    �ۑCka@ zA"`z*#z,)R%Rˋ 
    0͔(jNV>8圓:<s7hqF :_�0i2aZY@8f=a�Xv!t�h�td@!t*Hg
    @^xTb>RL [[&N X*jBhZ;]%&!lI0\wtZi]*!f.(^|LjP@�
    .I~e2ti`t(.	L0G =9Yr	&qS"_E.I r8f9g�X
    j馝~ꨥꪭk'ꥁk(jZȖI&ATީov%߇0*f~vi||4(
    EM?U_=t`e]/l|w}hP="9]֋&uөKz	&q"lUO?Mc;JY<A$.
    z㮝%@8hA:l8QP8i 5<DH6 T4U	IbHdr!Y�SÌ|aA
    '
    
    xN%
    %]`,DLo5lF=~Oa^5VxMA9V aEpSld?;$8$ʨCtIXВ#9G"ڈMR0SDR굒"9ėDEt*wc
    ##69/=E1i#
    	J`$v{ט8IJ9J83RGHfH]$F�4r!hHxc
    h<cҜ}rĬ?)ŗ@+!	zieEޱj�.+*k%=&Pcp'3'zgѦk5Q35rdt
    eP%/T<\c:P[tS)RϜ"rӟiR.Jo0[
    Eu03j!
    L&x8H` &(W2]TPV5Xm<MP4<%F
    IJ?86#L+TNWV9+WqgcfYuv@@=`Vb+n1bUna_Wњ`=dew!ɹr-bd	:Αn
    zslhKm~OԆL?wcА+4h[u"լBuG"J34�@26~2ӠeQEEU20^р#iIVBx]Ac�-�XbLs!
    4Cȴ:fHBRqE|9ٻE$jLc<@eel!4NP�i̘1	 ,L>A=aV@nk(
    Zwk єk
    6o�lxsZr)61j�2MRg!)?w8;u0,3<p[#B?fa`֘F9X4nqcXc9;^ٽ#DpXum|LaI6O
    `1["r<2x@E1wy� 0qЕ�C:WA$Xc 8:`B}F2E{vk>um7.V�"pF,PPc�T&X!B�d0H`F*tDDI 4&A&qFq^R$wkӴdϕ+,]FC671I7<>Z1QT>�OJWJmKY5e ZUci~e^�
    �P'�
    
    P%0'!p).�QAp`V\aIPO6bzV!\8"a��}bb0/L7~JhLު|mVtP@PǐP@G	a
    `pbLRNa>-
    @{0�A@!WA
    �0&NRB zVe6>ktz/|,8Zh * NH�U!8��XU^0acEX!A4&W,ͬ1
    ǜJǀL
    !L_с!@`s�Fά\C O<ARMd %%H\^�Gl6p To"J_,	Z"ߪ쭆rkyK$J-"nHXX`Nd@D-E@h)1PNH'GЬq寴Nk*ߪ0
    R5ɪ(E`)(|P�ހn	\eh�)쏤J~>]*Z $"]/Q	cU?3N4 
    (D2U8hT(C_S(%;E4V(,8L	JԮ@<k\.I$5rHt@@@tCDKDOESDmAE[DeCeANp
    u@latY!3"L U,3j33/ o4@bج!@x@�:@LǔLLMTM
    Р	t@` `	h ?1hS(@kJp"RBQF6`j�‰6 a+�1~Jˬ."> @$
    ҠX0Pn@NSi!ASXt�dqJTF|?)AFVeHAHHQ1tԩ/t<j: AJ @ޠ3iZ50	I$NnH2]A5\?Ů\ϕ/sBx"DPk`$r DsG�&5V-\'ӿT	3@`^镺!."uece5J1
    s.M$b{v\1hؕA@XA)N	U0DTjkv"s $8,lc,UgyV\/lm2+QxuXv@2"&
    e'L5҇qq+6m'"4L2@Hi+*XoFѪ!!YNB]6]!(4zrXl#g)7h3I֒hA%ijdJbEUZA	HdbB!`
    x@ 8Xe"8L@8x;8c@`��z&(coD3dqt
    ȱP7@b *�؉;�j@> 8�8�X8،͘iiAH�@%rum]$T	}*"�|ؒ?R(\\##S:ͬLZX)Z*  4(OB?<ylZr�6g9 tm#n|wOܕWTcXG~pccf`I
    eId4a +ܬ@+��~s#"nǹ(ͅ_@Y`	͌;|ŇP77ՒoIb	u]3"΅h:(A�>@0(9z&t6f?B:F:X
    Q (	BJo׆됏$8wNJi!*#(y)+Ah"jֈ[^+!a+a�@t92]C\C%BB%vc)H؄sa˗җvH-PW"cCۤa5(!3ՄwHW!B $_3^"l!l
    [h4#۩7wwq9st؇Fۢ[kS$�AqR\a�*-ARD``<nwS2BOe$ºY!E۫9DY
    *SF&0oJE~S  p%B+1{]5<۩@;G)15P
    G'JPD8 "o.+JsJNr"7Z+[|Άwr$x:"*پr aY{Sd|�r9.HYͽș7Хs7KhDh^ANRM$7/.K9(%`~I78(<G$]載v]"(@Y=9-zHMߖ>;Q#JGylbNb|H;=g..U*#]XNd9|xǫ"@ZniahߪVu#
    Ձ	V]<=7ٌM%'<ȋ/ۗ#AVf_J^4FO;77oJ-HC=s=^B)z5У1G4*kf-	Ĉ\|sjɓ-M{ӝiih;6ՈVe2�lvש>|3z(WdΣfHU2ÉP>f:VzfL~ߜ_!#>+רnǭh?K�1%ؿ̽9^D>s'ݩ<0a55LDY،ƍ;zXcF$K~ѣ�
    h2fő2kԘ͝<kl3Ѓ9%!D:q=
    jѨTNKiUz
    6رd*L0Dlۺ%̷tڽ7/[Klܭ>8Yj*~Y`\#[9cL5{<yѤK6uCWf
    ;ةϾ5ݼ{;Q‹?8%3=zGҫtn=Է[=?o>zͲ^7*H>:�`H``
    .`>aJH'_EHb&b*b.c2Hc6~J=TPOdB$H#͑C.dTظ6@$WV^eZne^~	fbI&CI*dn$}H"Mvމgz'ּ!gIhihh>
    i`Fi	%~
    j$6qkR
    $圲Jkފkk
    l*5!.l>mNKm�;���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/manual/images/chapters/configuration/����������������0000755�0001750�0001750�00000000000�12203357067�030474� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000147�00000000000�011567� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/manual/images/chapters/configuration/appenderSyntax.png��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/manual/images/chapters/configuration/appenderSyntax.p0000644�0001750�0001750�00000010675�11377016712�033673� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR��������b|���gAMA��|Q��� cHRM��z%��������u0��`��:��o���PLTE������@@@   ������������������MMMhhh|||ǟMQS268@CE[^`ʭilm䒔vyz
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    ������������\�������������������d�������������������*�������a������������)��������'������������?��������(������������(�������`j������������[�������L������������e�������������������E��� �����������������pU��<IDATxb`�@;`@�@�F �4�hD�@;�  "A�hD�@1H�@�F �4@A*wxE@�
    TD`w�π*ŝ+"�hF�4*e&&DAK54�`dJaCtZ�`'4�)C�A#H9 KD<%z5<&�,+v끠.� IDmа�4ڳ$� Fǚ	�ш$� F#b��1KhG
    P�@1H�@�F �4�hD�@1H�@�F �4�@Gk^OD�ЀGe�ш$� F#b��k� F#b��A�h4"	�A"Lb AADR
    df`B2,# QDȈ101I GE & eXF@�
    �cYa	z2
    qd-2"�hE8<zD`0,# [D00Fˆ(�hE(4jD*k9T-2"�hD	ˈ�ш$� GhF�="w4"� F#b��A�h#0,# :"@@?	�hD�@1H�@�F �4"zfa�@1H�@�F �41
    �h#2OD�hD�@1H�@�
    ň�A�hE1g:ψ�ш$� MD1[2@WH00ȉ(T-2"�hD8xxB2,# MD9~&eXF@�
    ~eeXF@�
    Mկ
    Jj@&"`5dB2,# MD`ް�A�h4"	�ш$� F#b��A�h#bt+�@G.0�A�h4"	�ш$� CDP!�h4"	�ш$� F#b��A�h4"	�;N� �+�ш$� F#b��A�h4"	�ш$� F#b��B
    %Z5G#�@XT3k�@1H�@�F �D@ˤ�#[="VM�"?"|ba42 F#D@� l^FLAoA\@#=,(!ahDf@�a2r0
    z9 BPӸш  �(ˠ0Sn\G47N�š#Aa q:Gπ*%Є�[DQ�P
    zĵ3h�¦v0(aHh�H%52A(LB�|,wu&Np�#R`�@Ԏ߳6	4�АAN` A[X
    dDGDu@�F�{D<%zhш PGu5 F#DJA�@A50#=k�B㒳
    &7L+8^ш *"�h4"H�" :`I|HFP&@�
     F2B�a8@C6"CvG@�
    Ո Pr"A�!RVݒ*A hD� b+6ߊ0Aj�$�hFFbO{@ "	Ez ̅rD3	 ~D#`qeF`td6@�
    `}FJ`:!m+Dw8>#�(GX'A@$"0"%"0aqND i!G!P##"�hD0G`IlDc4�a"ػ$D.#p;�!rDޱ&8k�hD�}eD�"#k�hF|-)$!2"KɽF pD6sl^@C%"cƚg<54DbD5z�4#К&$A5z�4#06AOG@�
    H�4#wc`# zD*"�hDĠMZE@�FV@A"@:&HPA0}CAd@�FV@A"UD�PA�Ud@�FV@C%"
    UD��EF6C!UD�D5:*V@,!7h"V@.;x"�a.@�
    @DZ�Dq(T�4(#�hD�@C%"}�ЀFt�GD`imϡ];�=8#�Ј bE@�
    � F#b��1{�4�^%8ք<K&B5@�@9td@�
    H;<2# 3Cnj="0 :Y1WD�@K[E[>BA�"@:Gg@"i-� NZ~`KD��vH*a_r#�b�P)l@�FbI|y&P8#�hDrah!<<"$"#�hDd"J9�@�Fb+�4T�g
    @#>"A�4 �*A:b@A
    0]
    @C7"p量o&UH�h,g�ш0�IACe@�
    ;&;UD�A�4#oqA�4T"
    `L	`WefF@�
    ��:tC44l """HZ9LHi@0
    L@L)<(� JD#olgAL��I0r@�
     LLТIAL14 hFr*a1~F@�
    ݈@/Ю|EWdF�h{E'ܳ�!L9w	ΣJ9�@�
    و@]$I ."(R,�@C8"HB\DP|Y� hD71DbD{Y� jD"I,ȽR,�@C4"@�/bv#�hD`�4yDjF@�FvQ@C8"(*"�h4"3@GT�8@ň�ш@$@�F2�ш@�4`�# F#b@1Hш$hD�h4"a�40�AU@c�h$GĠ�4�hD�@1H�@�F �4�hD�@1H�@�F �4�hD�@1H�@�F �4�hD�@1H�@�F ��śS����IENDB`�������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000150�00000000000�011561� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/manual/images/chapters/configuration/lbClassicStatus.jpg�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/manual/images/chapters/configuration/lbClassicStatus.0000644�0001750�0001750�00000530271�11377016712�033610� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������JFIF��H�H��	Photoshop 3.0�8BIM������H�����H����8BIM
    ��������x8BIM��������8BIM�����	���������8BIM
    �������8BIM'�����
    ��������8BIM�����H�/ff��lff�������/ff���������2����Z���������5����-��������8BIM�����p����������������8BIM�������8BIM���������8BIM����������@��@����8BIM���������8BIM�����y�������������a������S�a�n�s� �t�i�t�r�e�-�1����������������������������������a����������������������������������8BIM������8BIM��������8BIM����������p���!��P��+P�����JFIF��H�H���Adobe�d�����			
    
    
    
    ��!�p"���?����������	
    ���������	
    �3�!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw�5�!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw���?�WePlcٶ?
    HR]Mh1yis}{>}y7y]>_gk-Z?LSF۷skG.6c_\'}R^;o.akjssAsn~8~cԏ3fVPkuphsٿu7uKl.~KC�6=jzž8=�S�U/sCLky%O7X/F7VX}rլmnz~O
    wX
    ,Ii(@m?R_{?_�J/_f7='>W?__�iy$z#CYϧK|+�ҟ_wk�+A/nzO|xmZC^ᴸq7nm}o^}{AN�5K|+�ҟ_wk���K�+A\bHo^Huɽ>�`LZF_}}�S�U+/_�
    wJa[eeN\tak]ݻH:AgKU7OkP6g9Vz/&ְC]g6|y�0rhq cZ]:|W~&#-{~wgj)6Ξ=/WmUo
    _ewc;zRtyyGakA1`wgk\r@ p=�|F
    bvٺ776+lOs^\ɩlcR
    {Iw*o;h!4on(G`{ù'RW93�NILm1\K:G[dKI�?xmM=B]'udiRs[rJ[thF6?7w?"mxAlrðZr.I)f2"l3-%Kkџz?�$�B:~FGfr��I6KHOgF;5%?S�_CTבNQ/#I$4S/#I%>4S/#I%>o6�ſRH)8BIM!�����}�������A�d�o�b�e� �P�h�o�t�o�s�h�o�p� �E�l�e�m�e�n�t�s����A�d�o�b�e� �P�h�o�t�o�s�h�o�p� �E�l�e�m�e�n�t�s� �1�.�0�.�1����8BIM���������!Adobe�d@�������������������a�[����������	
    �����������	
    ����	7 p!CD568
    P09@`"#$&12F'HIJ4����5	46!12Ҕ73w8 A⵶x0Qaq"%&vP#$'
    @`pbBuWȉrCg(XefG9I��	
    	��1!25367AՆpQaq"Brsu 0v#PR4tb$%FTE&����M6{c\~uk�����������������9����������������3P���������������Xyg7~d[}6imY3Ⱥ|`nهΟbw4g\}=Cvz?uR%/+lmX{A#ea>G{������������Ġ����������������X���������������?Zܹcr=9==y�#bύ,탩}rmɁl1U/cxm7;qzyg[(Hv������������>n������������������������������NrթL<->.@d_+o#]mw-w�P
    N!hLBN-#@GX*8P�B�/2pQH8^+.(p@O@^rc@ʝo_y^n_G!ɳwr<vQ=u!G(8|ܚү{b@։3igr`ys3ՖyjF,N/%h+-KLLu]nԾw,lƚNc_G1Ĩ9N&)|sj^4ģ^SH9B8*D|ĜMHM\q5!)x@0´8cIļ@_r"^-/M(8pq(ĩX~XɻSioN.5-af�F,.t Zt=6[M(t'}owڥ֕&ws5iΙVi;˶OSDiVsqo |ʔ%@Rq'Ή^dRq ps/�i5$y#KI$x-"^q\pYļʴp |0>eG+q\*B|p	5s'PRF^?}Kߗ?g=\u5rpp9�@�)�� ��p���/(8rp!H(�������%)
    N@8N)��T̛7/~9H������������������������������������������������������F;71Wn')'2~If؍pū#PYQԓSQͲ@OhƟȬ0\"1iʮ[RX*w
    Q8H�C�b=?E58o@ƈMϙ�������������������������������Q~S[|ɽީ9I75m(Ł6kM/;t4m�zy1=>6*)m̲$oBdm
    �:s1!_=n?=N5T3z[*F
    |��������������������������������هfF?B\)->d')�����
    LB&��b*#3w@�������P������������������������������������Tló#?.2zꓔ������������������������������������������������������Tló#?>2zꓔ@����������������������������������������������������0S>z̞z LJbxV\�|cnyk ��bGs@;Vmꀕp1Fn �ڵoW`��Fn �������������U�i9W����������������bGs{E8�0K^:~: LJbxV\�gu�_]|MPr+h��bGsw~.kyݏ᯲5C}׍ݶ@�
    q{NGψ'&z+�=r`��;]l�������������Ӣ4Lu>N^�;5ӛA~��������������ؾz �F;71O~'9H�?qF��3OWOLx��8G>=Ǐ? �Ol^t)z0�X۞g[h6o7Bۧ} �.-)z0�������������#L~Ǎ}qVSb{OR3��������������.-8@�
    voe'ŸrsfO^RrPJt 4FvY"整IԪ�P;R&D@dD
    	\:"
    %.h��u$@DvDLH(F
    Y#;ӽ;Ӣ:#:"''R4JNzDtGzk�������������������-��Tló#/>2zꓔ
    kĉLN%shF(EAz*MF*Y"X%̕ AGz[:0R	8��u%f 
    "s-bדT(Ύ4
    l1:@�������������������R[��هfF?B\)/>c')@̀������#U:�1C+DADg@����P������:#;%��'%�������������������(O�Q~S_|êNR�"0sƨ�]T�nx~_w�H%S\	�&X	~C`'@6>��QMH��c*0��ʾc�[��Ỳ>C@$@6>iC>lȀ�_\>O[��$0�-c�6>c`/H|%P��هfFB<()Fe')�QUL|�HW|>_wʀc%R>LTF_"|~`��Q
    WʀXߘ_̀~
    >_�2_##/*$"ߙ- �$ 1|@@L>t�ˀG_-�~c@&_10,�1ߕ/Q*�F;74GN3/9H�\������iҀӝ�;�9;�0S:�����������������������������t��
    voi#rtf_^RrPMxaKݹ
    6kh3Q3Pe,dT(ޙЃ;*ydԉȜ9d:e3ט)k3$5l
    ^hF`�������������������������-��Tló#O{2ꓔ
    VtKm:"וΉ`zNtE 'r]*@;Ӣ%'?8%0S:"u0C;X'PggBU`m3;Nm;X0S,�������������������������-0��Tló#O{2ꓔ@+Xg�ɀ�`25$ϝ%?
    Y�'&���%	   ��+gX*|�Vϕ`,�6~X>@�+gʀ[����������#RJ��
    voi#rtf_^Rr �H5Y&sƨ��l|�6J
    `ɀDji|	"ϔ|��jV�_+k@c1 2|	�|(5Wσ�.|
    `c@c@S?_/����������Q*�F;74GN3/9H�	������:%��ɀ�����0C;���������ɀ	?V2������	�@����������L�Q>QS|êNR�*	R`	`r:<|MkG|N'ö(;Ӣ3H`��u%H0SDKtA@&w<%''R@����������������������R[��هfFB(+.e')�
    KTX6kTkOkFvAE*yl(Ύ�*A-Е@ᤂɒ;.iEK$ADgEm%wzE�����������������������Io�f}	ܯ\ٓ׏T�B������1�a`��̀2���y�|����1?&���ɀɀ2�c��̀���������������%��هfF_B|)+6d')�QEJX&X@ox�~5d`rTߖ3SD$G@L�6<Tc�,�6��z,oP�HK�p�wM|>P|	o|H	����������������Q*�F;71On'9H�TX|`3`*�g�ɨJ|Tʀwd>H>||�L%?-Hw|ɀ
    �2�	|Y #X�ɀ.���������������*%P��هfF?B*-.c')�l@DvwN	`莈ΈSNAd̤2,T$w)ރ\Cd@������������������������������:ǀ�F;72O^s'9H�&H(ѰT^Tn15z
    :#k$jLzԖDΈ΋tE0B(-yޔ̽FNP;m|&m74l������������������������������Io�f	pܧ\׏T�V.�������	4@���P'S:���:sP'S:���������������������������������0K̾z *!S� $ϔ|@O@*Q*~d25#+ �d�TF~c@UO�>c@[_"�H~K@G�g-���������������������"U��
    voi'rsfo^RrTXX�m��%S\�-/5Ԭ?&`+�6~W|?.�k
    @|@~Tߚ/T@w.X>@.���������������������Q*�F;73GN/9H�������$�2��	���20����X������������������������8��Tló#/>2zꓔ
    P
    D^*
    ̔T͒;3QWY"$:6j!	sM|H�HHL莈M{3;ҶHdY"'0S0B!P0S: ٭`����������������-��Tló#/.2zꓔ
    T	`JdS"X'RK`Vӡ,i5	`\
    f$HΈ(NvY"�u%ft&v`DtDVY tD
    wvgDPgGzwzDgDw\™^.aT^
    m����������������Ԗ��*6aٿЗ
    }uϘxuIP$w�������i@�|`��������������������������������������|��Tló#?.{2ꓔ������������������������������������������������������Tló#.2zꓔ������������������������������������������������������Tló#.z^	O������@@8���
    9����(
    �����s@#��� ƪ"@�(�1	@���������������������������������������������������������#duEl.adWC"ȮEt2+]dWC"ȮEt2+]dWC"ȮEt2+]dWC"ȮEt2+]dWC"ȮEt2+]dWC"ȮEt##lllllllllllllllllllllll.GdxAGdxAGdxAGdxAGdxAGdxAGdxAGdxAGdxAGdxAGO:keXMJN&13N,Ű]:sSiyj.-mɗ*Is}4#:NZJyH*W|2lGrfeS&̐j,
    L>%m=̕J^zg.mª	:W5fnӴ:vN;ChtӴ:vN;ChtӴ:vN;ChtӴ:vN;ChtӴ:vJZ+ChtҴ:VJZ+ChtҴ:VJZ+ChtҴ:VJZ+ChtҴ:VJZ+ChtҴ:VJZ+ChtҴ:VBЀ@t :BЀ@t :BЀ@t :BЀ@t :BЀ@t :B�i-BS}aVYN[{6~q2co#n,"Dx՗]
    w%SHnSa+àqk`n%\	5khCXiBU$E\еPhp
    0҉2:(ڼY2pzCt:Ct:Ct:Ct:Ct:Ct:Ct:Ct:Ct:Ct:Ct:Ct:Ct:Ct:Ct:Ct:Ct:B0ѸѸѸѸѸѸѸѸѸѸѸѸѸѸѸѸѸѸѸѸѸѸѸ}6zl0aaM=6zl0aaM=6zl0aaM=6zl0aaM=6zl0aaM=6zl04Jv)4b
    :tUMS1釽,fEǖbO⁗._g׬+h"Ue6+"l<;l;l;k_{`G~
    |EůZZů@wׇ~-{~-xwׇ~MtwG~MtwG~mtwG~MtwG~mtwG~rѮDw~lw;kV;kcf;kCf;kcf;kbk6cWXW5qW5qWx�Z�j�5QV�5aV�QU�QU�Q 
    Py�jT@Z<A	yjcS@ǐ6
     mHyjCR@ڐ@ڔ6<5yjCS@ژ<( HyjC#R
    ԇf< F3QAAf;PAڀ<4!
    <yjCOBxǐ<4!!-8y
    iSNBZpӠ<4)!M4y
    icLBhGƘ<kuM�>r8@ѡ49]rnIgD~'SekYޜӘas
    ^BЈBGZ7ܢ_1qqFu~ :EF6l7|ox[k<1,XmFЅh:G=E{=E,b,ـ,ou쎽C`uF{7G^oDu={<c:cY#"7/쎵ǯf#dFײ#fׇQ0xQdzQQ#B"7c@uo׀F׳8#Yx@zDF:xb!7z"8q"#Du:xÌo:í:oǯq0hP:B#:x8\,.~"՗%^rN,ٵgٲ-b8GbmbhBYj&͈D[B}@MZaoC!ZcmYBx!g؄=dqE#pUaքG[ꎬTBFu:ր@u:[<:/`:Dox^و@u :Y#V/8 :u`:GRu8F7HYHu :Au!A:94m4o,@s@sk<cn?\G89hڀxDs@sB6xa6989:6a#j!6a97Ј}s{urT*q\e(E.Qp2\e(E0(>dqO>dqO>dqO>dqM>dqaM6daaM6daK.dQaFI&dQaFIdxAGdxAGdxAGdxAaEdX1`CdX1Ed81Cd8!Ad8!`Ad!`Ad!`Ad!`?4#OF?4iN
    ;w�4�ixӲeNƜ9/r^4ixӒ%NKƜ9.r^4ixrMˆ
    5.j\4ԸiprMˆ
    5-fZ4Դ7B~=Q?Xo>�~=Q?Xo>�~=Q?Xo>�~=Q?Xo>�~b}*؛y:DchfC4,*di<B�-ٙ"O1O?ѮE|h={U"4\b0F	Dn`0J
    ҏ?�O6a$ܮzJr|3}
    PMRFR�8HtpؠϦ7/fIZPT3,l=(eʬȌv:fفnHGduQ3:('*�!7'XnMKǵ`J©x&9Eŧ#^$CtK3}
    XOȄQj2;FGq5ƣ#dM`Jզ#̖9í
    -m@;FGq5ƣ#dwQj2U3)&{F5an,61|Bfn�v뜛fwQj2;FGq5ƣ"`6ɶ;Yzn&i)C˳K)\]\"!wQj2;FGq5ԙgq5ƣ#dwQj2;FGq5ƣ#dwQj2;FGq5ƣ#dwQj2;FGq5ƣ#dwQj2;FGq5ƣ#dwQj2&K8K(Tlr|n	an5ʾ۰koͭ&!7	/_NdwQj2;FGq5ƣ#dwQj2;FGq5ƣ#dwQj2;FGq5ƣ#dwQj2;FGq5ƣ#dwQj2;FGq5RԙS?�>}�66666666666*؛yDcMEcM�>}}}ǯT_>Ͽ?؛y؛y؛y؛y؛y؛yDcMDcM=28)Ǐ5dxVG5d]SXX:X:X:X:X:X:X:X:X:X9ՑY9ՑX:X:X:X:Y9ՑY9Ո
    Ь
    ЬάЬ
    Ь
    άάЬ
    Ь
    Ь
    Ьάάάάάά
    Ь
    Ьάά
    Ь
    άάЬ
    Ь
    Ҭ*ҬSXάά
    `xV`xV`xV`xVGudxVGudxV`xV`xV`xV`xV`xV`xV`xVudxVGudxV`<t+B<t+BY9ՑY9ՑX:X9ՑY9ՑY9ՑY9Ր$.'�}����8fٌ61wZ;;;;;;;;;;;;;;;;;;;;;;;<<<<<<<<<<<<<<<<<<<<<<<<ӝtC:9·Nt:sӝtC:9·Nt:sӝtC:9·Nt:sӝtC:9·Nt:sӝtC:9·Nt:sӝHɁH$Eei8%Sl|E&~k1[fA>GB*x$%
    zy!Q>bSNi+p̑,̥Bq#,-Y LSyOpM8be4Oo63#`\GqGqGqGqGqGqGqGqGshhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhha�PÐ\@k0:t'\6_
    f-Vz=b]<03,(ERI*(,H.ۃ?+LT+&2?%ų%.9N,p3g8p3g8p3g8p3g8p!9#@gPu@gPu@gPu@gPu@gPu@gPu@gPu@gPu@gPu@gPu@gPu@gPCsdg6Fsdg6Fsdg6Fsdg6Fsdg6Fsdg6Fsdg6Fsdg6Fsdg6Fsdg6Fsdg6Fsdg6Fsdg6Fsdg6Fsdg6Fsdg6Fsdg6Fsdg6Fsdg6Fsdg6Fsdg6A.a)TXN&W14Jeӌ<e*-¸WpKA~sOT/#mօYb;LTGiGi-R*<{KTiJ)RiGijGij1QZ;KTiJij)S*CHvҕ!RZ;JTiJJT;JTiJ%ScLvU1J;ITi*IT;HUi
    !T*LvNcTvUaDv4Z#\vUaB;IUi
    %Vô\vqB;HUhWu\vq:"ՈՁB;GUhX*edvՁ2;FVGhXY#UdvUCe`v4UchT*EPvA;CUGh
    U5TvQ;CUGh	VhJhjGhJBU;BUhjh*V*ô%XvЕa
    
    ;AUh*Vô\vq;@Uh
    +KyjOz,Lի,%+W|؁;EV F)\=*=13BG,xBDlHX16#1q1c1Oc?w-[Bc<,G,b9b8pxpX^1"8XF<,BÀDBa!Fb9b9cÖ<9"#[Q-hrb9m@r#G8Dp1hp8GCBG,G!h�"08DB#08F0"9b#�#p"!�p<xqDGB0b!_##B8"9D!"!VZ7xgr@t#`rAprBD.lFD,rF#cǔr98Y>Q~XQB80@pÇ(##FDG@rppcDapG(!"8DBpF#">8p8q88�8DF8!~Dp�jlF6mۍ?Z#ֈDu:h״:^Z{P{Cִ:^ڀ{Chu״:և^kChu״:^{Chu״:^{Chu״=E-QlzC[Ǩ=E-Qlzc[Ǩ=E-Qlzc[6ǩ7zc7#^Ux=UW^UyzzzzGzzGzGzGzGzGzGzGz/Gz/b=eQw֓o__oQ}ME5o__o~Q}?X}gqt9mB'x,�68_ϮG4nŻwLE	cw{MYl?E[�$mNeVol˲<?qRsS�cuynA)K	\q/HqXLmfWs1]c1&)U&['W)]}͛Vcp3<,[%3+.:I2.g<ӓ�qj/߀si21cGƏ1c<4ya%bqY[7]bFX1cGƏ1c<4yh2XR|EͻaF ӆ�M-ήd<4yh1cGƏ1ut\7g&atr\Z-H{oGƏ1c<4yhs5cGƏ1c<4yh1cGƏ1c<4yh1cGƏ1c<4yh1cGƏ1c<4yh1cGƏ1c<4yh*p _Hݢݸ1KL�l_Mc<4yh1cGƏ1c<4yh1cGƏ1c<4yh1cGƏ1c<4yh1cGƏ1c<4yh1cGl:No?_o~Q}ME5o__o~Q}ME5o__o~Q}ME5o__o~Q}ME5o?_oQ}�s~y&}
    ?ؚෟ�bj/߀޿s~z&}
    ?ؚ෯�bj/߀޿s~
    lpOL;!!!_d0!!!!!!!!!!!!!!!!!!!"""!!!!"""!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!S>,e8΍__���Lf\]^EQrͭ-----------------------------------------------[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[\|777777777777777777777777777777777777777777D`[ttX J褒Bt"B%MI˘ֈ-XY8v168&
    0WD2Sggk8pl!qFY5<a<Xb)SU[6DR.v&2 0_Ts#<VJ>Q9G(rQ9G(rQ9G(rQ9G(rQ9G(䀍pt:q8GN#ӈt:q8GN#ӈt:q8GN#ӈt:q8GN#ӈt:q8GN#ӈtY(*zNL#L)u'JDz\|͢һ1쟡{hLFm-?jdƇW&w}:U6;~ms(SDXAYto룞LYKRyM!=ӽwr{|t1oφy-
    1hiCLZb4š-
    1hiCLZb4š-
    1hiCLZb4š-
    1hiCLZb4š-
    1hiB^ݨi[ѥoFVi[ѥoFVi[ѥoFVi[ѥoFVi[ѥoFVi[ѥoFVi[ѥoFVi[ѥoFVi[ѥoFVi[ѥoFVi[ѥoFVi[ѥoDJfiѦoFfiѦoFfiѦoFfiѦoFfiѦoFfiѦoFfiѦoFfiѦoFfiѦoFfiѦoFf'4N4
    ^Hy4M	:/0U26tzfkfqVLf[SKBݯQ%*<JUHx+UV#ĵTx-UV#ĵTjQ%<KU@xx/UbĵTzO%^ĽSlj5N&*<L8xp&j
    MU:#Sp7T
    MU6#SUM&nSʦL'*<N0x`Iڇb0&*<LU$xH3TjRUH&<MU x@7TxUG'*<Mx89TarQʣF'j<NQGڣ@x0'j
    N#QGꢏE'<Ox ?TA~QD'₨PNJ
    5B
    PxHET⊩#R*uHITq⒨R:@xDGJҒ)*-QZF)j<SU#-QZE)<SUx(OTQ⢨EQGD**<TUPNJ5DSTA⪨cMPNJUC*<UUحJ+L5[mRI2:Levc־b`u$V5
    qWҠrLWw�Vk7ilž[w#Kf=UP3=/YE	6uM.Yw{~hEE>a3Aڪ՝R%KC1KQF;3Uq6ugM"LlL._W_}MHrUoD i,zXWI[5ߖ%*I-,SdX;am[RFSUU?cq6": =E,,={<}EEQdz"8<a-_:ou"/::D/0<#`uFY:ZXkdFcױ78V]XK7VonX[:cwǫ`Fu,ԱԱécR刎^؄#ydu,K78G=Xwǩb`u.R绀9=0=1:c`s؀1c=#w԰9#nG=`ss`s݈۲9@sٌ#j	o::z	a|XSn7�N<C6m2vfL$9E^ęia0CIOɻKX@ڱ0R(ON2%E$(k.2NY7K(3
    Te=B{L)*mƒn$6Sfh__
    f:)%8%ɏrdz39Lc=}ǯ#08C3f1f0G>0>�_>Gz#׈cf0:І><=x׏_tGzzph77}lx㇭Gz߻֏\=tG:[xc#wh!q8`##zb=`z_Z=Xqz@zc"8W#2Ȏ.z	
    o&9[NԼ#޼e|)7XXعPPXXTʆʆJFJFFʆʆJFJFJFJFJFJFJFJFJFJFJFJFFFFFJJJJJJJJJJIIIIIIIIIIIIFFFFɆFFIFFFFFIFIIIHHHHHHHHHHȆȆȆȆȆȆȆȆȆȆHHHHHHHHHHHHFHHFHFHFHFHGo#B;#�}lTȿ3N7?odu>Fz'󩓜y̵]%I)\ex5G�K&굨+5K*us-VAh;?/:EwՆ%Ն+2*p(:5˶*೬UWm2VڰĢ7SÕP2Y]WVU%65LU!qu}g!e	W~++
    9Wض5Z2i€ȑb|ȩCr"[F[fj~*B{鎔ޮNkõi[JK*`TQ\r}"J޵YO&/<ּuK'd$Z-.4O}is2U3hK,I5
    C+O0ʵ4(_'ړ%�u
    :,2yVwz]Aq)m^LŸ7'�!-S)^vh.EV5$nR)5ҍ
    OI]XhEܵ@RGtpR6ШƧQސo37<sTh[j]njU4;SUZjU͗Z}ӝG"3Z5KjE
    NǜVE	ZjYT"xuU Ş8~l &-\Vmbꁱe†X}-ٹ8&�@8
    HѯB"kK*.p,R_(Щ4+*<sEy!Lbzӯ�i$ĩ"2R7 ./�Ya=<-k	m̵϶\vO1ZE�g{m�;e-lToQ�'Os6%9T8Q)NUg֨7?o:�3N$SYGPoO:�ZH#Ah^Kf7Rj�P%/)BsqȊ/F_?~/r'Y4W3LIqDK{��ԗrA2xW66)ѥIM?
    :�[5qLj6^)+--!m3'Vo8rVo$ImmY`&RRp\'ӥ�%qE>L*u4[#\֔�K>c11Ib܂h<(F
    t񵜵) ̉SqO@?�Po߶CcNLx3P!fC@5ZqU.^yIEձ?iUlO
    )3P!fC@5&j<Lxe<
    {[/0gbT-<*Wv(35&j<Lx3P!fC@]U؎\.ꫥΏ(Kzʱ7C3)eQ@5&j<Lx|wx3P!fC@5&j<Lx3P!fC@5&j<Lx3P!fC@5&j<Lx3P!fC@5&j<Lx3P!fC@5&j
    Tʩyja5k=@~/XEZl{
    |m~*݉84.P	馘+<ϼLx3P!fC@5&j<Lx3P!fC@5&j<Lx3P!fC@5&j<Lx3P!fC@5&j<Lx3P!fC@5CPo׶A?ڷ-8'BogM	{d&fQ]:r/=x38'Bo`t2_+̤-8e)mŻ)Km
    +NS%Y.sgS,|Mb
    s%g3"t.OAᔕ�vUؚ[fŖHΉ*	Y'65gNƗqdzCli]R46ch	;U&[=)KWS\-*�﬙wʩ;z2p&\2Mwb
    4f6l&ʖ1~BtY<&̗su/7DُhEˢlzf#3whEi̔y6eA3=T)DْA^ĐL|tӻ41'2D٧gPF=6m<h3f>u;߹?]@^}�j$u5)�_&gȀ/5GYٖܽTꯞz}TꯞШ;2z}^dpS2nq
    ũ3xԦqjLެuUgڳyEV~f,[eVR^e}r5&b$ĵMaN"b8dJY>6Y
    oٻNA^r웺 \l_F)OrWHb΁/{M/KtՉZdNe)qVOF)3&蒧sˌcHGEj2cyVӊKÎcHRr*QU%JU|+쥓,ȣ_ۉmyi"BȫVDB4v
    MsG|;;TuH.ZlFIPcmW8'*8bfJdJgܟ?�Smf6m1clٍf6m1clٍf6+)Nlٍf6H:cl
    ,2t4F6$$1clٍf6m1clٍf�lٍf6m1clٍf6m1clٍ(x,3E&(x,n坳f6m1clٍvrͳf6m1clٍf6m1clٍf6m1clٍf6m1clٍf6m1clٍf6m1clٍf6m1bnLN]@^}Obt^j_Q#UIjJjdf^j}JPz5}DU%)/[]9T'&YtcP'X;~"NLƠN9}keU|_RT{ $ydlKdNJ{7bԼ%t6JA:N].;k|D:49#xlZʔUM,[*r3/9U%-K[ܢUmNvSL')G=iOPgy1`t<ԌS5[QD8ԄX:M,!pcSJY䯒IK:$2UM;K1&RNnU@>=j(y\526
    QIq|n/ȦiI|2rVVN+*xy'hک#&UV1%_f$IAU^RU0)e<8rɌH$z$+!1Yp]]݄y@CVuY28jB_kFTEì(P	L.<˘иBX;Ɋ
    
    :r}-e6aX­=#R)d'`]DqR|pJU#ydlSSV1B^pK$cLV�ɠ6"j,9[Ւ
    )]*gY<	: ˆs
    ԟmC
    REwPo濩׶B샄mDqɇQ0S5:
    =*{pC\UJq=ZqhtCmqW]58Tj6²mDqӜ1b
    Jٴ:u]]
    }/eޕ2<7/ed{޲jumʝ;V"䵦rښD}ø)5U?0QeMɁ+ob]jmeGV�<Ҧ':==d|)2.8VJj.rMSZaYILj0eMO”nGVR{C
    ʇ(KRD»6a
    5IYʯq5`^Μ;Ǜc<_[	Id/@沦teD*mPs1|4
    ڞ+ORH{~Ė\_ciO
    Ti*XO&V4Tf)8X`
    OpXqEU,h*/vAarrXU'%4]w+X겭$<^[=&WLIQbLԶ,zNՕP@LS2Bę&YU,:0/4Y]}}ꙇYftqئ<ӯBd3!HܒĠ4&:jfb$iЄWc_z&`=n+H){.g	j$
    eA_gCX"YH&a+X){.Q.U/HJ@%DR\H9\sm"M钾;n+놗$LaU3 ]9y?]@^}	c"Hwv7v7v7v7v7v7v7v7v7v7v7v7v7v7v7v7v7v7veJq.OLGYqӱӱӱӱӱ#Pf8VNNNN*P'&7v7v7v1~fiiiiíLYqcqcqcqcq`q7;տp&,͸ӱӱӱӱӰNrn4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4_(3i7_o[&Mɚɚ'$T$gM!(v';=Di^9$
    Ҍ_wnL	o3\*}#3LDfTFf(!F/gڳr
    *#ͩvZܥPBΚye_dW&bz`,)#YU&wU2bfw&[�y淥2|KMm߷ƀGqG&h52Tc^*IsCw~.IiqF7N)K]Շ#ss%a(zeCw/Q(h[\S,{ 9E07;G2V	Ø*B#76֥dٝrdrŴ⹥mAy⠿ܟ?Sm<cJ
    bʑ̱2}z3(-Ԫ)XR>3E;*Gף2J"冤L2}z3Md`2}z3+L5%Zɺ&TFe冤L)LX`Uƒ*GK.	bf	fMy"@I.sJs<Q`i/ؒlo=:deBndޜr'fIluL&e$)@2U=sS}KK2
    ^5NV�7Ekv2)ȧ`^ᥫu*--4y`-Bm63X'W,2Sr-YVl5' fMs/.R=#)ErJrĹPDd-dSNE;dSNE;dSNE;dSNE;dSNE;dSNE;dSNE;dSNE;dSNE;dSNE;dSNE;dSNE;dSNE;dSNE;dSNE;dSNE;dSNE;dS`?uЄ ލK[o
    ԵލK[o
    Ѩꛊ~䷆jZKxoFruM?]u3JMAky-Ѩ-o%7Q7vYZ<-;lUT%2UJ:b2tQk*EYV?x}˥g6b�bra].;L"@F݂zѦw@R"'#DOC5Y5	D*aKTvM5_fJPMWs,q;nSVïqK던@7W1^8ًAh�JTbrPQռ\XhqCuqKTW`]@^}OZUG	
    U1\
    )Mo]
    RBTOn{~5UiW
    $!9,sS9iEUT	jOMG-;?5*RB]
    RDVM<TFН:ʳKTL+*pj;{ܕS@NnLN9'Wf\[1(hޑ	P@ޢr2D8:AԢ"WԞ~`LeIco5U37X6!궆H'\Reb%%,Qk]9"Mxgt$e"FfpMRL@@%<}lN3I<MۤQNx2ꐓ%$[YU5,TM/!䱄iS4ZR7M
    RtN\aXh
    pKIb\O _hJ"Y?<ȖQ'I۔
    �dVة&X|ZX\	2)5 h%)*zR *rye%B�xxTFN4e8Y&7nE:f뙿+ڡ
    :FRyB/[,
    lXذ5`kbŁ[,
    lXذ5`kbŁ[,WD]Ł[,
    lXĭڣ[6R )ؑlXذ5`kbŁ[,
    lXذ5`kbŁ[&s!5`kbŁ[,
    lXذ5`kbŁ[,
    lXذaތ7DŁ[,
    lXذ5`%
    |6$k[5oi[7[,S%",
    lXذ5`kbŁ[,
    lXذ5`kbŀ
    =a&,
    lXذ5`7a>,
    lXذ5`kbŁ[,
    lXذ5`kbŁ[,
    lXذ5`kbŁ[,
    lXذ5`kb4d3Po濩׶A?ڷfUYtop̀3 gF:7f@0%0:7f@΍0W,qni,ȫ܊3sId0vnE\meqVvπRɉ痪,ǽe.|)򭘖ޱ'p
    buS& v,y,ΪXɤ۞ٴ_jyyxIܬNALK9|Z]v?Y7ظU,dON'Ud	~ۜ9dMXo2ri&RNRsgU2bS{2{|Z%p5 n@/W䠨TmT#fl@>2WU)̦g9ʫ͢O]�'7?o[O]sxm
    sY
    k!,l Vmg@~xYb+g6V3!'=y27fnX~t\57]z2Y>5s%מU
    zeH*9|̢joGLɥ_ku32Xզ`cS/=rM&FqMM[)ɑ̣.N pM_.c^Z[圝m-̔N%`K}j#2fw_*MډCkosfP[X.IɛO�r\6LA4ә2}3 ITٻ=,A=L
    W9klIj,&�}lfnfDYV;fT߹?]@?o.辉,
    X$4I`h%KD,
    X$4I`h%KD,
    X$&LJ)+D,
    X$4I`Je%;*,
    X$4I`h%Z¥Iv,
    X$T.%KD,
    X$4I`h(Jx閉,
    X$4I`a~0բKD,
    X$4I`0yKD,
    X$4I`py.\mtI`h%KD,
    X
    :V,QOknPKD,	6/1tI`haRaMKsX$4I`h%¥V,
    X$4I`h%KD,
    X$4I`h%KD,
    X$4I`h%KD,
    X$4I`h%KD,
    X$4I`h%KD,
    X$2uЄ!P<*8sP
    U9WLFUT
    0߂q6_rbQ|Uf2u*aq;I1"=	$q1ԀL@GDjj@j& NL.<�UoH<Ιz7RS�GaTUÖ8rѨ%ItF:yiK>ho
    )qXPX9
    5@]<O_<Yz}fdљIOUK[Kŋ:/}LVWѼ	DE'?g%Nv5i;%M*raSkzFI{BB^iy$pYNbS]/#"kjhS\N4Ч+1ԅXq925oHaO=8vjR6n&u꿤 U2vr(v_Z^3^;VW+*rPYJ[>_ӷ;3pU6rzSDGKuE1dPZƬWR7?o	AbbqTֶl)kfšt!3W
    Akfš#ol)GB5p#ofMSԺ{1ZٳxpSي͛Å58F.v@b!YIټu$EWA|5%i"J=r"wib'el,iLͱy1![ULdTbd!ura[N+luS,^,\wEޞ:uT,'bHRKHASw
    l*:I6u6T-XP'M=Ee:ڮ92#W)`m$M8p3D=O=,,zo2W:jy2}iTU1`lI{]qJiFZH{ZٳxpL4P@N!3suTte!˜@
    [bH&,nT͛Ae]D4 &_11b"H{`,,flU9ĺELfW")~Zʿ?]@^}	q(IT`e&i!Av	HfP]f(.3Iuz%3&i!Av	Hfq7W_\9e/`e&i![‚47W_(jQF@4')0΢(u-HS%rcS4+YM_$OiҬM6L%`}RjhT#Abt:6VSNζ3lguz%3lg	Ӂ+J9g5OɆMwXVqPS
    lg5kc8q[ƶ3lg5kc8q[ƶ3lg5kc8q[ƶ3lg5kc8q[ƶ3lg5kc8q[ƶ3lg5kc8q[ƶ3lg5kc8q[ƶ3lg5kc8q[ƶ3lg5kc8q[ƶ3lg5kc8q[ƶ3lg5X>"w
    :'WP]Ji,L%4J&j%laeK8>YQtƑw¥,�:pUy-3c"jE^M)NU
    #/
    ^ј2L^P2P5E"Y! %ف'y
    V3
    ʿ1ysJT2g5be`tt4.tM܂Б	`}p0՗S0\rG
    Y0-J[t<4]ɦ|tĹHMɅXJYp-]MśvS7&U3K8|)\c�W~u��Smԧ1;s;s;s;s;s;s;s;s;s;s;s;s;s;s;s;s;s;s;s;
    2[8"To8ۙۙۙۙۙؑngcngcngcngcngcngcngcngaZbFS6".mmmmmmmmngcngaZbFS6".mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm_'7_o	A˼);`9zz
    N9sO[aKvɚVÎ}l58ޞPRݲfs0.9w'lKvɚVodÎ_gWT©Ou:r/p\7z{޲jj&q8pjRST%v&(G
    K[ee{X3	Ӫn2D.ǡ*]R*jB'OMŬ'O<WR+p<)=T*QuMTM:DZP)Uv-a	pTYz`j;;=uSqMHZS*o,Kj#ˎ_Lg|�8Sq2yU5T2詥.8pj T%P
    o"XOȎ\b8TƲ'
    D
    'S;[q::U<rCuЄ fN�ܩ\9SvU.xeUI51<d;TJΠc\sSvU.xeP&N՜qӜ|y5tK3O1T.c8odo)T,\=6hfT-%-=qR{^FSJz t;U.;]&'Gv>}EG0E	n']8ݩ1gUH8''NU'M2O?w>
    qONM%(RޖTEsRX<4w8LQJzsZ<ONedӌc}]*f9xRܾdF
    Y8ޢf{[Ӣ/1la]GvW~)-\'i(nRR<p	lWTTYJ:Yf5%uvt�?]@^}	]"FH7H7H7H7H7H7H7H7H7H7H7H7H7H7H7H7H7H7H/MF?qqqqqNl)_H7H7H7H7H7H=U=gAAAAAAAAAA@S61[$$$$t}*ʻ$$$$$$$$$$$$$	hbhU vUi i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i 
    SoPo׶A?ڷ5_	ȿc3_1m6@64ۨUQZ.vwnVpM8ۂ":%g7%
    U3}UYمENb*ۂ":gڳyiInTZp\H]
    -f9+٨!eͮiHUe%UM%TV9rS"蛻֞f>ipM}Fd!$e٨!eͮd2ɳl#C-6FeK^"wC)ʡe;ꕪi-[HR328)j>!IKj0!+s'g2T.RGRYB	mUfD3	U\Ȧz&'lZ\^BFPEHUbKI'O1,?�3E�ͽaw2;h5[3|Q9%L!+aN<A	Jv^zْ�50o
    r}9s)lupJ	QLsEe痸f)+ɒ?r~�5N	լMrn	92B3-H4y�	94ˈQd'fZiJA2B3M	ŴKAQ0L[M (ϵgok!9/kpXu*[XĚ:YE%ݮͷ;T1oh3ᘵdi)3*+y*	F_Kl)pE{H\e2ۅVS0Hp):p[kV_R%Bs(24\KiV\"r&d[0,״0&i6PUa{H31k}ӖS.f9SӜU=WU24JRQ>}"ܳgeELWfoIs{{ĺɱl~k
    43v?%u,唍
    &d]')$iY,b9MO)0-LӦtYfN93-k5%=eD$!8s1wu߹?]@~}LYȤ"H2) Ȥ"H2) Ȥ"H2) Ȥ"H2) Ȥ"H1er?)bor) Ȥ"H2) /H./) Ȥ"H2) Ȥ"H2) Ȥ"H2) Ȥ"H2) Ȥ"
    c"H2) Ȥ"H2) Ȥ"H2) Ȥ"H2) Ȥ"H2) Ȥ"H2) Ȥ"H2) Ȥ"H2) Ȥ"H2) Ȥ"H2) Ȥ"H2) Ȥ"H2) Ȥ"H2) Ȥ"H2) Ȥ"H2) Ȥ"H2) Ȥ"H2) Ȥ"H2) Ȥ"H2) Ȥ"H2) Ȥ"H2) Ȥ"H2) b~�3N7?o:�3Czzq)m6zbi>T*Zn-7ʚMMSSp|>T*jn57ʚMMSSl|>T*jm56ʚcMMSSp|>T*zm=6ʞcMMRp|i>T*jm56ʚcKMRp|i>T*jn57ʚMMSSl|>T*Zn-7ʖMMSSp|i>T*Zn-7ʚ*jm56ʚcMMSSl|>T*jn57ʚMMSSl|>T*jn57ʚKMRp|>T*jn57ʖKMRp|i>T*Zn57ʚMMSSp|>T*jn-7ʖKMSSp|>T*jn57ʚMMSSp|>T*Zn-7ʖKMSSl|>T*jn57ʚMMRp|i>T*jn57ʚMMRp|i>T*Zn-7TZ[..6��?�m]_RdQ!F4J"$$IGJft.)1O<"EE:Q�S-%{ZJ#mLFڙi+܍2Wjer6I^mS-%{ZJ#mLFڙi+܍2Wjer6I^mS-%{ZJ#mLFڙi+܍2Wjer6I^mS-%{ZJ#mLFڙi+܍2Wjer6I^mS-%{ZJ#mLFڙi+܍2Wjer6I^mS-%{ZJ#mLFڙi+܍2Wjer.NzJ#m4ni/sM)xۚiK6J^!R
    4җmCm4ni/sM)xۚiK6J^!R
    4җmCm4ni/sM)xۚiK6J^!R
    4җmCm4ni/sM)xۚiK6J^!R
    4җmCm4ni/sM)xۚiK6J^!R
    4җmCm4ni/sM)xۚiK6J^!RJ6I=-$kL
    2Op6I=-$kL
    2Op6I=-$kL
    2Op6I=-$kL
    2Op6I=-$kL
    2Op6I=-$kL
    2Op6I=-$kL
    2Op6I=-$kL
    2Op6I=-$kL
    2Op6I=-$kL
    2Op6I=-$29ͦq3`h]9
    y28d}$InZC�|էY[yIzi鄾4RẤF%FQKh&u0PYZ]  "ZC$ҖN$RHV	?8D[=,MѺcռ0S8S&-x7RMy$l07M']&WgQVt$wj"OOLn|BO&˭}am.[Iu9
    MIJҕ!dJV"Q-%FG~bc*ȧoM9g�:bi2=퇐v"r-ZL#QEC,B"mFJ*RrK/?`eE"\|6Þ-0"yJ);��[C<an%1Q̢
    KF̝<ܽG`pt&#	58>IP̈[l!1fr*5	C%v>"v1C:[AnRR"$eADȸVX(#&3DCDs%[ۨ%GA[#%2>SгX52D&ؖa!VCS#JQ	Y&v2J[6v)*wzܦNYyF)iAe03Rb"u͡Q%kf)QdfDfDfFt
    l*7_}Ll+q	44RNkFЕPJ:Je23g<M.Gm/u	v')mxĪ-9LKYq4q0DĢ`
    f%L{y0Ciψ6TDg$LDT76n/{C{ˈdcbiztw$,Qq[(R4RrY)ev_<L*"\|6
    ,&%Nd;3x^<c1WU3x^<c1WU3x^<c1WU3x^<c1WU3x^<c1WU3x^<c1WU3x^<c1WU3x^<c1WU3x^<c1WU3x^<c1WU3x^<cH%h+2#):>8Ⲿp2j;_ft>τ#2Y8m1ɼ<;/NkЕ4%&I5$</Gi#m7<mԶJ&M>6JRMRJr*N*U
    qCI4ӈp7r<㤻D6>t}3m*o%n>e4DZL(A,d❗ʢ
    *{pdi�7QW*hwz*M7=
    (Ĩ;fdi.gѧG{M+%Lc
    \#41YEAJXG˰NJ<h&K.;ua,K|`z"Xn3K͜AZQ6;Ng"oHlDoC$4"!"S\+G`-)ԑÑ̺bc08ly;hr-ד(JS
    )/D(6Zeh(wlLEd},p<Y0푼T-F{ϣɭ=*D!.`|S7(C6YCOvЧZ:gj,,We'5Tl%!q;g+!8-vL<&OB0p캶il%N+! ea?gs0Wg,R\`r祧"mƊ&6tK(s-V*;6R3CD1yM3'#^:˭Sf:Q%sc"ۉ5me:J'aQDꑔRo(L]MK8r@x}㮬7}7m7DBXiD8ᡱj`zED\Y\K$6[\DC
    JBa&I,RՃ*`wX;V|U*`wX;V|U*`wX;V|U*`wX;V|U*`fxifxifxifxifxifxifxifxifxifxifxif�_ɾc1o7|>M&|ɾc1o7|>M&|ɾc1o7|>M&|ɾc1o7|>M&|ɾc1o7|>M&|ɾc1HLlQ6#K2&݉Ma$-ܔȈΕ8P"te&ؕ3í)a3IęM!T0?_6%�v`aYKt4[(qdKąD:9dI[J9DfA$]Ze{C>&gPkD,CYH^BpۨmJB')
    RE)Qu&q46RR"\4FFYFHN[y[&vnA&_(JTlL+Yk)
    PIäD7FLDfCC&ܧ򨪮C6
    g�YaxOE9_+%TR>4Ԉu75#Tz7̵oj#<2GX.ye?2GX.ye\|Q`:s-D]7̵oj#<2E7̵oj#<2GX.ye\|Q`:s-DS�\:s-Duz	7o#'<3GXNyg|Pa9:s=Duz	7o'<3XNyg|Pa:s=@uz
    7o7<3Xnyg|Pa:s=@uzBp�?�s@j#hMDsiM54	:s@j#4	:s@j#4	:s@j#4	:s@j#4	.4GXyk&k&7uo#<5GX.yk\|Q`:s]@u満7uo<5X.yk\|P`:s]@u満7uo'<5XNyk|Pa9:s]@u満	7uOBs]@u満	7uoG<5GXyktQb9鮢:s]Du盦7Mu#n#W<5GXyk\tQb鮢:s]Du盦�"鮢:smDu盦7M+nj"HymtQb鶢:smDu盦ڈ7M3nj#g<6GXymtQc9鶢:smDu盦ڈ7M3nj#g<6GXymtQcٶ:smDu盦ڈ6͵;nj":J?C!$xeRm,GȣЗ4M5F{m�K?"M0m⛉b:^C&%}H$]qmԡo|m
    Lc!D6!ȇa`\7<qD}q>ᛮPҝR&Ro�K?"Uj?ZA6K)*mM:-@H`7]Zq6h'ʴ*8J[mGtzmrGTTqT"zJGzL^.^۱Zma!i"
    QBr*Z)O.IJ}UmeB0
    ھ;W(.}Uτ\IS|  nX*h'>p�p;~x_៻b
    *+31h+E\cھd.
    +vIHvQE|\";W/Тھ;WjE2LvEھ.Q|v_4|w|\Eھ._ھ.|Qݤ{E|UvXE4Q_⢾***.VMFnVQ_QGt	.$(h.*fE$"J**
    3p#73hrp#730*3i#33p#73p#3ͻe$讞˥P??4A$ʋ�?ͪ"*�ꐥZ\BE"2:;_)*.KQt�pW]O=xT?GR}n]/vz?rYO;1IN0DPD^w;;tUA?xdPW;0%TX{OlV(&�`4{tܧd^I]˴REI=�v۴T}*EA_
    J8/'GM޹UvI<kG]wTA:jr3t]2qiWgI�pIPgAlL.]~rRF}U^
    ^kغ.P*
    hvъn+
    Jpx\(iT.{P*/bQњC4Q@BUUsW_H;SE@@?fP\!pS@T*BE
    h*7E|TTTC*!Q
    Qeվ{/TOe¨E$Ɖ%h]#]�_!GtIJiI8gop-ݾ[û|#vnG܎3r8wop-᝾[û|#vnG܎3r8gop-᝾[;|#vnG܎3r8gop-᝾[;|#vnG܎3r8gop-᝾[;|#vnG
    ܎+r8Wop-][»|+r8Wop-]Ep-]Ep-X8Gop,CvnG܎p,Cw!;X8Go!;|p,Cw!;Ep"8G~b#Hp,Cw!3ܾX|3ܾX{w!3ܾX{H/!,C=gw!,C=ߤX{H~b"3Egw!,C=ϤX{H>b}"3Egs!,C=ߥ}"3]~xg;9ߥ}.swsH>b}.swsK3]>xg99ϥ}.ϥ9ϥ·>xV
    ][K+swn}.ϥ·>xV
    ][K+swn}.ϥ>J]CvtOVU)o0|ʽ:
    px?ϛ}YWAo0:'o*7MFzGD�>me^ҝ�8I[hGD�>me^ҝ�8I[;g=X?99rZ}APgCNIlғQ)I#!7WO”BTL%,
    V]I!%JK))YMdI3*hQ9'GloCnS<+Kd3hf#TPҥ$يYZ6aJ%M)FP&\NZ%eۄ�ohXPJ"V4SéGA%XqUO4M*#JPWPKBd*"4*#2RTFFFFddddt	܆/.k.|a-n3BFJɩY'pEϧ{ĩ-y9kKik:Vĝt=H�"fDkޙuRM0Q4҃$j	R.
    wC+J4<DiQ+'%Wh32:&NS2u#m"(5JNV$ ԣ"?m�t7:
    p?ϛ}YW�\{N,ƕ&dEJJJmJ2"*̈1-6/%Q/ '5TRȎ22,ً^<RKƄ>D<RVM4fkWZALn
    _,3*iReq(g{6I"FkBa4%OGvdt[b7!ha(J,Ժ624/7o#?0B]4)jΊs2UUJ>)\UIjn7L`&RmKޔa9(A5584oMZv%)JM&	$Ob`Z".5o!b
    "-/JJ1P̷i,`!-#}Sk�ILhe3(ueI[DSҷFy
    K%Ij#>�o
    ӠNqkp,o3|q&Ң3>?-DlNp
    [Ru
    Ж/|Xy#t-xf}l!hm%)fv7
    {Αn._/[7o9[SL&Twi^Jm'gCA(6n6-M6(*w㡳Si^~?>C(IJQ%)"]3;WLYY	m}HKdsvfFdA݈ɥkVI?{>kIfLvVRքQDovř(&931Uw+dٌGť(ZAe
    BtQ)#|;ݹ"^&1eoš
    BzLI]|'U=I$6Ĕ%nFB2O�ntiЦ	IJDDIG)-k}xwS!aIPtm٩IIm;n.ajaq<ܴܘf!&kI26PqS.i	3},nklĖZHRr	('N~:�8I[;fW?YWJ7imLC .$Sk*
    DPdg/$Շ<;VHXs#a/$Շ<;VHX"}9JdD)ȔY%E$IREITf
    2H0ȖĩAYM%WJݺWS|\RHRޖD: j\FDd:Ȏ$	KIyؔB[K%iAR<IH*OSH8-ylS;44e*U4RtVc^Iyy$v9ڰ痒GjÞ^Iyy$v9ڰ痒GjYCi|^o~/N(ZUTtSAdd_?39t2_K
    ,ZIRIe*4D$H$RUCll< cI
    y&ZhRi:1
    7y36b[gE&
    Y&y%Ih*j!c�-zO}&m-rg2Ŗ0m	kYJk^I]HXs#a/$Շ<;VHXs#a/$ՁLؙ]8*"w+s2M7ܖĸ{ڍhT3Z2TY*3QPgH29eE"SnDKQ+'Tfp[Dk=*ʡQ-)QD&6[}졊U48|R#!MPfqM0ĝ
    >C;N 	"I'mJ,!Te$Je	Cm
    5(BD	L)%)JH)"""""*<;VHXs#a/$Շ<;VHX̿�^�+x?o{_/#{ee\HXs#a/$Շ<;VHXs#a/$Շ<;VHXs#a/$Շ<;VHXs#a/$Շ<;VHXs#a/$Շ<;VHXs#a/$Շ<;VHXs#a/$Շ<;VHXs#a/$Շ<;VHXs#a/$Շ<;VHXs#a/$Ճٽb*\m=jQ)9H\"%**HQ!
    r|)oyD7	FDrVdMIJAf"̥*NC_i$Ҭ	*NRTT̎ᘙAˣ%4!dBLKL%4DdQ)EQ1pr"\BBeq	CmD-Ĕ%jBȖ(Ң%!RDE%SgR`{٪|lnVK^n)ܙLnDBm/;pCY]I*@DXdˆg2̨j,㖥-KY*P$Uf^!cmfj<"TfgA&fu痒GjÞ^Iyy$v9ڰ痒GjÞ^Iyy$v9ڰ痒GjÞ^Iyy$v9ڰ痒GjÞ^Iyy$v9ڰ痒GjÞ^Iyy$v9ڰ痒GjÞ^Iyy$v9ڰ痒GjÞ^Iyy$v9ڰ痒GjÞ^Iyy$v9ڰ痒GjÞ^Iyy$v9ڰ痒GjÞ^Iyy$v--֗&/moql8AP)_EM&dG}�8I[;S	7awՕ{Jt&#=n#6iN$atOVU)o0|ʽ:
    p?ϛ}YWAo0:'o*7MFzGD�>me^ҝ�8I[|;S	7aoՕ{Jt&#=m#6iN$atOVU)o0|ʽ:
    p?ϛ}YWAo0:'o*7MFzGD�:me^ҝ�8I[MS	7aՕ{Jt&#=n#6iN$atOVU)o0|ʽ:
    px?ϛ}YWAo0:'o*7MFzGD�>me^ҝ�8I[|;S	7agՕ{Jt&#=n#6iN$aXӱC
    RӍyW xhI9E)(z±ZlwXV+M`
    iތ"æJ#+1eӦfX]:aeӦfX]:aeӦfX]:aeӦfX]:aeӦfX]:aeӦfX]:aeӦfX]:aeӦfX]:aeӦfX]:aeӦfX]:?CG(uat�E,.0P2E,.0P2E,.0P2E,.0P2E,.0P2E,.0P2E,.0P2E,.0P2E,.0P2E,.0P2E,.0P2E,.0P.E.0P.E,.0P2E,.0P2E,.0P2E,.0P2E,.0P2E,.0P2E,.0P.E.0P.E,.0P2E,.0P2El.m:Ͱ|YNz(uat釢YvNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNP6f]>?C(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(tsm"ery93$[OkhSCfMn!&"RTO5w�W�?�8b[EBN3+
    ":j3+Di# i(q>W].QB[b2v�Ų_YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYk!C9,s\Y渲qd3g5Ők!C9,s\Y渲qd3g5Ők!C9,s\Y渲qd3g5Ők!C9,s\Y渲qd3g5Ők!C9,s\Y渲qd3g5Ők!@R8_$BJMD}&3":)1e:>)ÇSi3-mDPFdFI!&dFAA"
    }(SZi2J"bZfFDI̎:]2x~e@-a"҅()8pYTNAĽKs%o-YNJtQUx#GB֐�l)qPNݡZ
    w)JB%Mrtve_Ger~/[y! ~504-"6]GA=tR
    z5S*} <LVK!Tft&
    #e0igiBDq0B)Mm*('^
    /)̓.cM(Cf3J^A&A(y$!36S8k"%o|Q%r5SAJDT"Rej	QF[KlE%PTRBS1OٖOʝm4물[rN┤-<fQqRel-qV˭е2$T:Ib}%ydf2*Qfq)3"5o=r]2uЄ*'%m:tRZ5dEgIK|j6k4\A"QHZmSq1a/+A,3Ɏ7#R<aSAAZ~2
    dD*HO:F_%^0;6Q)<.AfG/DYIsQҡ_K)f
    2SGWN	J"ږd[N%yYMI'|NJNQd*V+bXV+bXV+bXV+bXV+bXV+bXV+bXV+bXV+bXV+bXV+Xy,c<1w;Ōg3cxXy,c<1w;Ōg3cxXy,c<1w;Ōg3cxXy,c<1w;Ōg3cxXy,c<1w;Ōg3cxXy,bŰFFKwTjIekW.<T"ʦnVRHZ(Jüf_RdIQRDT(m@VL2UKSx6jYT""΂":.Ϣg0nI(uU-h[¢
    Geu*hm	;bA)}DCJtmm-&Ji
    jC͛1!W2f1EIFg
    w�p(R,>yqH4iQWK-4ϴFaiM:2 qr&QK%GLRLdR%COӳƻBW
    bɕ!(UJ|-š&XK(H~T>+5%L"'ƠpHޚ0(4)CVݘn0ģ!]DA'%UJZ23zA4Kꇄu4ePDQFNo]RW2-C6@xkqD=.=EàaKiWscd6=-4Y{D
    )8wR!UCivY$v_>TT0&!mPC$C�-({N-qpЦ-GnIumRRQj%etC1-&dԜwCFf'Ay6ڋV1Wbb^[.2T6D2,ɣQ%Փ6"K2j#[̗n&D1;IR,JKD7I֞a
    !\\g{qJmKi
    j2A8KSc-T;1
    _n8RhDKJQ8n-QŶMxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxb
    ϳ+>;
    ϳ+>;
    ϳ+>;
    ϳ+>;
    ϳ+>;
    ϳ+>;
    ϳ+>;
    ϳ+>;
    ϳ+>;
    ϳ+>;
    ϳ+>;
    ϳ+>	<B'W
    !^+xxO	<B'W
    !^+xxO	<B'W
    !^+xxO	<B'W
    !^+xxO	<B'W
    !^+xxO	<C
    jX{I-s3KOQf_WK49U9KBɵ	̣86ȲZ5OIWv.S=8;ȳt%w,2KRR
    Mkq$f(Ȯp�)C9Ij7|ܕTA)d!Dy*JTTdGIϢ|32Z'_q(n`'#
    *JbDOx;oͦqhn{;KnF)eV֣t>3)ęe.gO2Kde(vZcf},Q򲒃?ER:)VL4vzYOk"IuQbG
    >X|.(.6*8]`lDq؈uQb#G
    ?%E?o
    >X|.6"8]`lTq؈ub#G
    >X|.6*8]`lDq؈uAIb#G
    >X|&6"8M`lDq؈5kb#?#"8]`lDq؈5kb#G	
    >XF>Y|&.Ikc'O	JL>Y<|..Ik#c'FO	>Y<|&62xMdS2xMdld5Sk#c'FO	>Y<|&6*xMdlTة5Sk#bFO	"Yd5SBk#bFO	"Y:D&6*xMdlTة!5SBk#bHFN	"Y:D&6*tMdlDة!5SBk"SGD&6*tMdlD*d59hMhlZZֆ5hMhQG-	
    kCc&6?-	
    kCcz&6?/	
    BkCc&6?/~^ZֆrOCcz67/
    Ccz6?/
    Ccrzܼ67/
    Ccrzܼ67/
    Ccrzܼ67/
    BF剕`XRqlj7.gmN)Nd9IZd*!/e=IguW~S.Kf)B\AhBV呖O18VoDD4[mJCiiHA
    Y Y)"�8rK,ˢT|l6q8JRB
    	R҅(К$2W3zW,C!&T!*qQfHM	IPDI""""JH�e M%-0KG-%Rwyj)FddfW!Ie~CO�r&ݬGK?m"AG1pbA"b=�T*s٦tB}x\!wغ^&.bW.RD
    QTU@NHB
    h
    h.p.MFhQ@Wpњ*WUPT*.بT.)Er要P^W}{{
    =bPXڅø2RBYݤteW߅tzK_kq"QN1E'HM`"V.+~t~H]1p�jtWVBPY
    ú+twEb++tbtbX)جV.wh]}+n
    l\f٬WV)SH߱Y]L
    RPY'_>%7i U$w]QGK$fc18q3Nc18q3K18jp,8ia3S,8ia3S,8ia3K1XqÌfc4,8ia3K1XqÌf1XqÌfc4,8ia3K1XqÌfc4,8ia3K1XqÌfc4,8ia3K1XqÌfc4,8ia3K1XqÌQ$ÌfbÌTXq*,8E1QvwEE'3K*.註;*.註;gtT]QvwEEgtT]QvwEEgtT]QvwEEgtT]QvwEEb*.註;*.a;]Ìv;;]c;]gtv;;C;]vwGk;];]gtv;;C;C.otPrXgGt�_Fꯅ-}J[ѣWŽ}-ѿtzGK?k/iKu4oxQ'R~gGtw)nF3_
    :YY72~(hT:ԔSڠԒ3QRgt蠌>h̗אepD(Gn*;~,yfD}2*Jru1�gHmVj֕vIYWN"bm̂Q)'34$#;W(:?zaʇH*YmRJ.$GI] -&̌22F]N7Ced%w U:JHRo)SAREMfwLȪ#?aUe))/$I;tȂY`qIʓ*fUTARWF5J袄e#2$Et/t/h:=U𣥟O'IR~2|YzTy4E9Y'E$tTl7Q#JYJh4fjUEtJNJYtj+$epd	79lqmEfEM&djS$B&~c,IA8"황~>q""$%R2NW3̩õE	Fn8yF RdTT&na0$<){%Q̣5I\#eQ2VI4dYDdFGEddFG*�GJKGDDEQQUJ;v	;d-iגUA)'r5]27xD+GFtBY5[I^'MmVH%y+'riQ'{ԑ2"ZnGAeJ3"35Л?JR5DU#J5Y*ƺkΓR2QE4Mt 6KĪ%ADI62GKJ	e6wn"NddSTIXfmZ%Դ:ORPYr2ymEIpRw*3FI9~HRքfJ|##HT<<3FP&:J2KR;e'eACZJ&a+2̒QGn%+R.i;�C˿}�qnF3_
    :ZX" !7I)	KYBGQjFcgrnݍ5;kv6w(lQ7!ai*i:.tRDt{7~Bd	"KIw
    a\S&QAgIE&wLG05eQRQT6w(lQܣ[Fcgrnݍ5;kv#b בATRw:'I/�4<-:Vi}j;JWL5szRriUTI:.0aƲy	¦=�S~FEyYNuګX;DCAeyYtAPWnSڤlQܣ[Fcgrnݍ5;kv7�U/vfYu))yRT)'(:JWJyW]arPo$"Y$kQI*24͸K/c.H&~)##Ƚ)Q$gA%-à̩.љTf&fffffgtI3;kv6w(lQܣ[Fcgrn%�'-&rsQM=(;kv6w(lQܣ[Fcgrnݍ5;kv6w(lQܣ[Fcgrnݍ5;kv6w(lQܣ[Fcgrnݍ5;kv6w(lQܣ[Fcgrnݍ5;kv6w(lQܣ[Fcgrn݄*[I%AdRFeS:H(p";Gp]
    f#q*}*#*H2:ˏ6lA3I:Rf)EUmŶ2I3IPdGRDepȫ+M$T{[4{ԅD=ǽKRQNYW
    &].uy3U)興=ΐRUjSj集gplQܣ[Fcgrnݍ5;kv6w(lQܣ[Fcgrnݍ5;kv6w(lQܣ[Fcgrnݍ5;kv6w(lQܣ[Fcgrnݍ5;kv6w(lQܣ[Fcgrnݍ5;kv !їItRڒW:̊~~gGtw)nF3_
    :YYJ[ѣWŽ}-ѿtzGK?k/iKu4oxQ'R~gGt�_F꧆,}-ѿtzK?k/iKu4oxa'R~gGt�_F꧆,}-ѿtzGK?k/iKu4oxQ'R~gGt�_Fꯆ-}J[ѣWŽ}-ѿtzGK_kq>Җh:=U𣥯iKu4oxQ}O7ΏU<(k`>'R~gGt�_F꧅,J[ѣWŽ~_q>Җh:=U𣥟O7ΏU|(k`>'R~gGt�_Fꯅ,}-ѿtzEK›Je"RWn:fʤ3ƴ9htf5C1f-hs2hkCFcZ̴Z3eјև3-ƴ9hf5E1fZ-hs2hkCFcZ̴Z3eјև3-ƴ9hf5E1e-hs.hkCvFcZ̴Z3eјև3-ƴ9hf5E1fZ-hs2hkCFcZ̴Z3eјև3-ƴ9hf5E1fZ-hs2hkCFcZ˴Z3]јև2ƴ9hf5E1fZ-hs2hkCFcZ̴Z3eјև3-ƴ9hf5E1fZ-hs2hkCFcZ̴Z3eјև3-ƴ9hf5E1fZ-hs2hkCFcZ̴Z3eјև3-ƴ9hf5E1fZ-hs2hkCFcZ̴Z3eјև3-ƴ9hf5E1fZ-hs2hkCFcZ̴Z3eјև3-ƴ9hf5E1fZ-hs2hkCFcZ̴Z3eјև3-ƴ9hf5E1fZ-hs2hkCFcZ̴Z3eјև3-ƴ9hf5E1fZ-hs2hkCFcZ̴Z3eјև3-ƴ9hf5E1fZ-hs2hkCFcZ̴Z3eјև3-ƴ9hf5E1fZ-hs2hkCFcZ̴Z3eјև3-ƴ9hf5E1fZ-hs2hkCFcZ̴Z3eјև3-ƴ9hf5E1fZ-hs2hkCFcZ̴Z3eјև3-ƴ9hf5E1fZ-hs2hkCFcZ̴Z3eјև3-ƴ9hf5E1G"EFD0.BVKm&LJI#Q"T}�{K�?�;s۵ocu)\V/omNJQVmr籷dw}ӾV{>u=ښHnz빐U]w[;om}۫ڨ/~S}϶o}}Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    u}EϿm,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!~[mSgp^(wm}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=^:`[AU4X'?|aGW$X|Vʭlf쒫m{޺v~W}&NMw߮MN�HYZq%0g{g-ŢXࡨj6ls	_EWv3HL.:ظyI68uCu#4'>;1\VkӦUEڪ{ZnW{?u:NWM߷%p;:'sJA؈q/3Җ*u%+vܪid*MX@ڍ4$bXMuͥ틖RЁsMo۾uHlvdۻFQU;סL+=_ɜUm^@M۫oBrpJaT	S,Z%lH]`weu9pطrIToǗ=&}==G\Yw�odpdñg7OGQuw{t%:mwgHv-XڍPz]̮n*LD,[@exH-
    ñȳŋWUq5zJ'##&AYqt팫ʑ*HUaKM5][rяe/N9(
    uRd2'Qz&*hmk;_ݬPRDv�8L(.rZS;1&^dYv+v-kܦ[ Qc.@X(v*HMXiK[yA33PmZ}Qt`S961#~3Jǐ<V2!(0Gd&wFA)mJT'ؤ`I;:3#(e1ٛ峦>huhQFwUWR&8K]X&89#]*oDRԥbk7.SMUۦiޭ~krb&&@.6!<pMwtR:R"VݒS.7i[ѹ$$9f5\gu[\n^7>-)"QxSeiSMJoEWk.`	#*fxAs#	@HK_sH�jEqe4*M�[kz�+RwQa0$2VV'RPNJR)­XbYqK{;]](Jp`C7OLr=K=!7YdECc]J-47\ڿ{5m]ζxOȃ`
    \6f}$N
    Ԫ-^]]ڻt:׽5}{s^׽5}{s^׽5}{s^׽5}{s^׽5}{s^׽5}{s^׽5}{s^׽5}{s^׽5}{s^{[uo׵kw^{[uo׵kw^{[uo׵kw^{[uo׵kw^{[uo׵kw^{[uo��ow_{u
    }5w__{u
    }5w__{u
    }5w__{u
    }5w__{u
    }5w__{u
    }5w__{u
    }5w__{u
    }5w__{u
    }5w__{u
    }5w__{u
    }5LtfqM6M޲C/]ۮ{اm6߭ZSmNUꥢۮ�ke4v]=mjQ(hmkj,Qr(+ʏ|Kvo>sŲh)G],qUܳB޺mQ*}똓-}8AͶ7oSSԸfbp&EN^uTE."nCyjm-)ޫ:tQWY*nj9"Qu&ucdo*]nѧfBuM.B6Z'Fza.YتKTYi>ۼLyWWvӵ=^H&{
    mEwOku:GWvze~�[zwSiuH說jQ[EVZ}!rEG7VI8ǃlZf7M/i.Jː޷ԣ~bS"ɗ=:,1\?ڣj32}JNYUzKb4ъ2:>d32̹d.b2V!ԚPn˅h\ފ(�	6lʹNڃ'M.imM"qejX.TI.=y%(ƹ6zKLufu
    !1Q庻F;ERևg
    w{KMj7%GY9wӌ7OMWpK!�hsrRlTyo|VnT?$IgNARk10lMBۣt�b�,ˉ+kZwdd?di&1&%\G_G汊ZQٞ\N/nE�hnqDՃ�f<&=6Ōσe!K!JM
    lBvtxtx!eR{(&R6dիPwU)mZY¦W=e4_%93Lc.<SfXK4)|Kv˄ދW߿n>H:N€xp9lsDڂuZ^K=X{Wr6"(C=+_HfE;ӛ[~/C.loԄCB6^N̆;7Ƙ]rݍ]MjUZ2QGbL _}U=FhrVͮ6ߒN6g{u?s^~O׼߷S57{u?s^~O׼߷S57{u?s^~O׼߷S57{u?s^~O׼߷S57{u?s^~O׼߷S57{u?s^~O׼߷S57{u?s^~O׼߷S57{u?s^~O׼߷S57{u?s^~O׼߷S5ڊ}j:{k{k{k{k{k{k{k{k{k{k{k{k{k{k{k{k{k{k{k{k{k{k{k~߱mm=U?_{SU?_{SU?_{SU?_{SU?_{SU?_{SU?_{SU?_{SU?_{SU?_{SU?_{SU?_{SU?_{SU?_{SU?_{SU?_{SU?_{SU?_{SU?_{SU?_{SU?_{S#(>[ b-춽޺B5uUr*5|ܖ&d0&P}uxB$:ŭ
    \\曫~m7kW*|۩E[U
    ]O}``<.kb[UDoH\YݤN$n!2bJ$z\nv=}\;߮7ӷ^Ë5TKX|l*Je6u$/ǶG-9B懿ڻTص~]ܢ~H7G"SFbmRݎQ'YXRK։kڪ+[U4ӵuT1zg\h>htvE[Z@/36A|kJڶmX7ȴUt|%uojg?[B{Wٻ'S:}-b`fE7#pڛ-nc<+u+Mڬ]s+ĚzӾ9u=Soelnv}NT뮧ӷ;u}~}q޿D\u&}mI_[z~}q޿D\u*W뎾%\㯭~W?>o_UϮ:s뎾%\㯭~W?>o_UϮ:s뎾%c~W?>k]O]Ϧ;zs뎾%\㷭~w?>k_UϮ:s뎾%\㷭~w?>k_]Ϧ;zs޶%c~w?>k^%c{s޶%]1ֿDLv2mkKo[Z~}1ֿD˟Lw.mkL[Z.~}1ֿD˟Lw2lL[:.~|κd˟<w2l멾%9�.}kkKZ|qֶDq.}kkK/Z|qֶDr.}kkK/Z|qֶDr.kkL/Z.|qֶD˿r2kkL/Z.|1ֶD˿r2kkL/Z.|1ֶD˿r2jM?Z.?1֮D˿sgn|1֮beφ9w~u&c]~>W_mφ9w~u&c]~>W_m~9w~u&㟭]~=W]]6jMOZn{֮Dۿs:=j~'\=᎛mnJ6%zc~^?__צ;%zc~^x;_gמ;&}y㿬~^x;_gמ<z׳^x;]_gsǏY>vDϯ<x3=gkLǏY>vDϯ<x3=gkMǏY~nDϯ<x7=gkMǏY~nD߯,y7}fMǟY~nD߯,y;}fNǟYnD,y;}fNǟYnD,y;}fNǟY
    z7biͰ'�2i%kKp듘4waJo#=j}kz\?_�Iq7E+䂂
    3(2_eNVĪs)T6*Pu;%TF)45z"QlwlBDY5(7sjMT2k6zw۩0g]kI6E!gGM'io9Hririٴa);Z7;W^t(-Vk|.1O:qE29&I9QN]!(l6JOR$࣮R޿suQm5e߮]W_PH5YGe$�_zr+"Y(XpkmmV:oSUzS]^>̎n]읟wSY#qt{=Oi$�F;Q,,߱`<Y;ӿ%nvdh.zS) Y`2eQ#6(MFK�-uQDx@Z#|r^(y\l};+RPSH'J2ra7vΩU�Wcz@qֱ%pw2;|2�3X6}OL};Vn-ovKN:JKI>8+K#1C8;dD@Q"H,Tx*E|p:|tM;0lr0,d'd-h]l;TC6.$C7~]~SJ;007=q0=#Zn,  >FND*P;-oKM饠st4	^ߧ;Ѝ+
    
    Yrk/WC_0=:uB6LV$rq=5Y";y(|X8b'PפL/,Ș	Y87*PXMggT2qsl:ʁۑy[rUݕXSb~ڄl"HL.j2DlfI:)DQX(4?ϋ]-om„/T~f勜)i|gQB%l&]UpNa}JD,odbErnՎoѢdpVFo?e YXS&brcL@	ҡWttLt_pXbI~l&gP B1QHd8bᑉXb2c*w(=&yo/d%.j oMCO�5߼q	jU߷�6$~݈2>0f>0_<yoG0@=$qÏ&v=}	$&픿-<-
    O7H}44�U�@f(>Y'4V)'Z,JoP&(lUOGYS;ˍFQ=p9f:Xy쭽`󉏿ZVnKdInF9A;d&/eHbI.v*VqK7$|fV!H@rkEh#"}d{̑ܯFA:@J+BZH:+nuR\z$&|0n('!�ް2m,FGL!8!|V:_J1H^.Wj)٫Cø/ϙ\Asu$*!Y@TV.^TҍhݜS[]=N߷�6[ڜjxؔ[!,]&7Z )'XcHB_)fiXgk_B;ػkw+;;>/ K8xa&HrgQ'6IT죰
    oZs lV5,E31CL2C8K3D}rrP7Y
    nXOem-C	R5$*''Jޝr0fa0)SJƧt]mZuI߷r>߷�6@=Y%I=؃3ETϲI@Cwxw{{joO.q[ϓ<
    ew|)c̉3cO CC̾v;)3RXhhҋ0<TTS7MdLfS"ɲG!|9;#Uxۺ6n!jpRW5o�K5W�u5k�?�׵5�s^׻׽m�6�wk=ku=o:u={{mk׳~潯wmϿױ߷�6��6c�k]]u=Zu}�6׷o?s^~溽_{7oZj7m�k.�s^ncױ޽{}OmVO潽~潽5{{{�^o{;{uvߩ^o{}O>[o_5�{]S~o^[k�z}}k}�׾moիom}ofg�m{5{?ok{?kg׷g{u:{߱oW?�k{kmo}o5潊潍�^}O^m�uvo^u5{k{{uc}w*7׾}alЬb
    6ZM}-{[f7ݷ{4TTfDi]z$ooNSE[o:m7lޢ>]vWn1mV]=Zkw}~oCp<{[=GmcGsEshM:S<S !"Rb<{n<J2UmTܥX)S:\i,d2)cbz%t'kq#l|DBBPL(*WqdV\x 2.5|"x\B͐M7|"RLTZ.HCK#GWW�mLD|<3rr'lBA
    =K?XuiB{.m5Ҋ┆26!TB:˫g\;'[Yab8f&GIJ6EeW:.){Q~,cVx{cN:RIXxR&!cO	,YIM[ka#r8NE}Ќ$DEjM!X*BB7
    Gbnֻ܏HX!JDb&T�r%r11_=	*|eC%(Xs^T:rD8a
    RNnV`xwLEDZb*lz8
    C$q*HI]1l({/:1DxAB쏼GxؠA�ǜmVK}67|ݟ,<qgi^�]>ƪS9X2^m9cQ<NV)*&4hZvLgB(K1n؎]&hDcf%�'Ux88ecNaVhrA#bi{CěiP@U1춳Ydb=Kr<.*p#y=wƟ%yP>a	=ǒnr~)PisjJS4Z)u+`wNuR͹ӄ4ozd>yB,nǷ�Oc--b:(rOE
    O
    (T	əl*UGiD4fV崧H'﷾aH
    KJOL�qF4&h�L9F?~	+ȢSZ7Ь8/N[+
    #MrNYOLR\n
    c
    *lѮVݘ:?ģt^qiar4ځFnf9Ⱦr�goKhTN;Z^#0?LFXv^Ggg}1Y5RsWM>
    }'n*l#{,Y;E9>tN|uľCmwo[�,g0D0gYMe4qK|'Gضƞ(ѣ66[.^Hklu643=,GX	t,E
    c"1q_5?d(þiXFr6Qo͉BjkN'̲J'Wa:ȼcKb#8ѝ�uʒDc=Ըci9	DH(~~|eo^lq66T˲HAdrE9y":)sN:x�<bo9?뻏{ov::ooS !lWI}4F`Ő?HJ%ι)槌Y;]먓lvYOvUnPfϸSgq&DIr^7b@܅N
    U¶F6jһTH:M>4FwtD	FjPɶm!9JryBNA	x}N&ej4tw~nW?{|=+W?wo?woww}�]^�{co~~�o�^߻{~�g�_׷�^߻{;{=ogjc}o�z�}�׳Wo{{~׷�]N{{~guz~�~w77�^�K�]?{׷^7?_c�׷�^߻{׷׳V~�^~�׾7׾7O�om�_{{{mo�^~^_ooowo�oo�g�_Sk?o޿_oo߭�{�Z{?�K]Mk~g�ugoֽ�׳ku׷S[u=-~=ױ_>ֽ۩v?02qS5wKkkwn'ܻ]ue;K=wн[TbF=mަʐov*o}oE=]m�|f,ٷs͛VMۢ(,v})mmmV;ٸk5~2itzmugS:\t_枼?=ynя��4�F>jk˃�װnz�55�F>jks�|ז�-:1S^[-:1S^[tc榼?Mynя�55�F>jks�|ז�-:1S^[tc榼?Mynя�55�F>jkc�|ז�-:1S^[tc榼?Mylя�55�F>jkc�|ז�-:1S^[|tc榼>Mylя55F>jkc�|ז�-:1S^[|tc榼?Mylя�55�F>jkc�ז-:1S^[tg榼?Myl៚�?55�dž~jkc�ז�-<3S^Zxg榼?Myl៚�?55F>jkS�ז�-:1S^Z|tg榼>Myj៚?55�dž~jS�ז-O<3S^Z|tc榼>Myj៚?55�dž~jCז-<3W^Z|xg殼>]yh}៚?5uF~jCז-<3W^Z|xg殼>]yh}៚?5uF~jCזg,Ͼ:3S^Y|tg榼>]yf}џ?55F~jk3זg,Ͼ<3W^Y|tg殼=]yf}џ?5udžj3ߎזg,Ͼ<3W^Y|xk殼>]yf}៚?5udžj3
    |זg,Ͼ<5W^Y|xk殼>]yf}ᯚ_5udžj3
    |זg,Ͼ<5W^Y|xk殼>]yf}ᯚ_5udžj3
    |זG,Ͼ>5[]Ny||k涼>]yd}_5udžj1ݭ)׊
    i:%qF^*h7bIoj+~[ow�Uk(?ݼl
    fF/l_˷�vĹB90b-Ȗx":(i-AB4Wm]%(n0f#궺m-ULqѕ$A8?;&*/!I@RC&>'~fwVܬ bT3ݚ+c9@$Zfd+ci@T3^ݞFe3iuf^߳@WVֺ62Lʍ6&d>9g3iZ@\/@<H̍hRU~)~ׅ#:o	jY-"٬	}ᓴ2$4,LRznY7(Y@
    y7#c-&�GbZ挋s؈]w貮?X"UKngHٜ:|haPT7q#"7 V-FHGGBܞש
    fi-LS0]6&`nBre026;+dQ)W/\U
    46zceVkAD~I61(4}D7̌+hK;*즲fO^`)dƍ*P[#S)3FѶJ-u04G
    +#wJR	OJdd?FD8!6ͩUkDDHr-˗cCk[BX2	S
    R$VXB+:#X3=r{M}vj!9Ŧ9l
     d{AMDKE-p|(@*̡jU
    e-V!s^F�c>-17THRKl2yOsq!٧TFn
    ((辷NT^Hb
    36*	\1y0!y<0,c'+v-!JcBlWlK[n,	NK䁸o es_ƄbI4J}QUto^1U@lhך'R}8ܐ	ɰp¨)t5?<]jNB/fU9C=&\q
    ݲ@9/Q@p`}Q":iĴܮYXrbalrdxG0G(;Pgr\YG*PSmɛZH/\Cg]/y:1q"ESl`''@	8}�$"<XPBی.YCMwoыlϙ:$7?]>c_Ȧ0oe;H5uFճN8]'a:C-KxQD1>Z-AR3]Xs
    9TԥxQU{#R|8�985dHntJ]aF+7HMƧ$L�dG@Ä#wְ@F7qbWlٲ%c:[.+RQOԷ((XHX0pp3pਘrfqᡡtؚJ[6%MjVilz̸m5ǹA)/S.?G2,F3ķq}Uڛ7ՑYSrwnV.8'dN@tEs~=_آFbʏ&(j0w)|qе?{mRkO$<cwrf_%$Uқ)`M x.uTmLUvz49;"bZ4>#FFț--IR[6תx$ƌ\{}D)HCOduB0cIhh\+h]tLw{Epͯس3r.t;t:3FyMH1hyHIL*PxUcfՓ$]7ޡ׮uQc\RD7޲>y9COrQUe<"CŲ,kk'=	
    c_!0Ҽ874UX+[Ҷƪm&jh. (Z6Y%Jyc
    6JiK&X1rEh{]lߢ6D*"iĠeлEr^?HkˆCJwmLm-u3ՁGrHb*w3=9fT:[:[oq=n|ƩAH'q8qN.w
    74i|DMKEZ`lA|ŽUgb {B:5Ȋ"wWRz[&=SgmۺWdbileIΦ#
    (lVSi
    Cof
    rrWfҸ'G|<$rҜR*8+=vRaqVsj*5nM͢QXAK+Tl:|aANc"bvPctNHnFE	?-„-jgwh`,9
    :Yh+phmݾKjh)a}
    \@?o7ܹrCdq)Sd$@�dfqcI̛ A]58IG<9`v
    H)`E)!ZؔBۂW\Pԩz"Q45\1¾=n%ih~T>Rq:"tRyqhYwrEtMez̟RkTƷ-F?8Sf(	$lZ`hVF=*7ns&8pqŮC8mRH8Y^
    [/Nn
    .=!<Gqy*qIe\�aȉ+$*]DBf�mOOڭ̥jI<y:A`fd<4P-!h>AJkhDo�yJ5w%㟢�ʁ"Kv opdWgE<Z!{ػFo3B?8`A,'XksrJIF.y+A{42f7BaNiW1p{X4ly0Z}qӥs9_8'!mXGgcú[}m*^JGK6;="I*
    +،w`s`n8T9U{)Ffƺ{rNG,A()Neb<f	Ф oSxB=ԙ흎=@*[;%z;h}42C۲eE`8&5ptͬ*#=;4l	ߐlzp{ZNoCOF[M2ĵ%	0:*e\~jD8WW&.o2}n
    V挾F;�GGx)oAMVޞ4=XYTo)eBvC9&h�0#t3-*
    ,=;6%)mښۺ!8?fzZGCGGH :12GBjqj;YOս;�mDlf56�2sXf/TՋrW6Qѳ2W
    ]hZ5	Ekv#BRv;{adW!(Ƨ)t,:Ǧɲ	Ք:
    YY&cmW^WmUgx$$'n5j)nmY5n-$ȑPBw[z�˙%.DRrS(yD4_Sb?bF~> (6ņ+;ީF]f1|,da;+#E@�8{>JMBo7_V#X\ʵ.驲7ޏX<˲$F<&fs,6F	rQT.!KIتl׃-5?dHwP==eFRdZD8pjQK)P}dsEkg:8*!I͆%,�$Kv8Tt\P4|t~4]^U8YZe7l5ܟq'' żEcHyWΎ1Tf`AD*F])$v(pn_I_`c19E:l0sZ;f	j[;XTkȌH~v{K
    r:I1Ṫ&4l3NP.[ozfjtvW\s.cE?82j
    L!$<Q\4;XQ4PQc
    vRHf
    cLt~OyQ '`2ik,caA\CyR6[o)HH~}aJwSG1]+cnA=,2hQcq
    cʚI95d)kjvz-tVKV+=ܩ<y7f|1/IwK.
    I	S*W<EK!?@ЇH)ʌ`Ay,>0um5(JQT*کBkwSbZ&b~LJrh;$\\3AP/!3t2dAebˏ.]R{tbniKBnvDĒkaA̩a�R<p ]"80~ayMm+/Bjv+BNGM�ՖX,h(K0.A=K=pZJCKVol2NkY\ıl|bqOc;M	;ýYUҮ[}U4Jv�AeG+XzCi2UlcI0
    K!(zpHȹKq5jo^N+I�7ԋ`?F>|G${ug�C.%r~
    $L;DXõٌV%WU9+b
    ])C8ZK,dW9O#�?o$#r8EeU	c{	{bJ_jKN8A	[d\2HT[E�lD2Ie,cJ
    6+߰zт
    O2|vq*pL| 1*$m.׳UC23wV[[mEG_9ĉpW㜩8B2I嘶B)dCb)%^ٶhlq^zIMΗIerζI'32�)Nk"36؀^xiSr#{[Z[Q]4&N8#z8kp8AF'Oxp0S$O;Ls
    Q)Z]C2'iM[⋗='υm$L2bH
    \@.Q{vXFy!x4;&M,v9~�Ѷ:T
    aK>"JTMyLcY)Q^upVw$;\,898X&95wo>ZgW,F&+{}vn:%ph(Dt5M38\V
    ֙JeD娰HT86PV¶
    Tb[tgf�,BGCG�H|[7=C	/1hC4ErmBva{56:_}iA-8]%O! {,E9&Z<.+__f͡+R[eʨۥ?0/h/HN"l;; *g:C_wJ[$mr2wTKɑ<|D7_q0,NFE:az?51cV-h\Zزt&>eVe~#ǫdpKxPHz0)1ԯ}拄ԺG}۲CQd1#o(JYDFG1\'v+~XYmz6|3r"0'(j}cۯg5"H$RzLn䫊TUeK5yA1K lHJT�&HR=&`=;pMB1nMUf4(-׽t)6@d/%+P\.LdO/1a ZA(BZ5ݙEhm)}iz&Dor},aq2P|U/2 pԵEΧxp3;"D8T^ӳJ&csF~"G yNl&\;@,Ii26뎪6ښ�	T8w0GM2^KO3aa"uqVLys2~+@mkAb]Ž'Y|cY݌8|+!hU3C%nY`qR="2Z"Qj/7c,bޑ&樚KPZ)O/};ABn陪
    ^g#ѻ$8[;a?qP	c,8f`@'xpk/~R:K}tq1X7ͣcqV٦AT YMڔjyf\"KԿVœhQJQ.Bp~`O�1nr)ժn5+⵩\
    픡O��kߢFeQGب~JpËbPkɭ<d+wG38SrKz΅FWN\1p" l8l>c4ϒӑc39<Z6
    ǞixSMV-h3^Vhy\HL\%2RH3„fVE׌3 V֢]]JtZ7c>  ⒪L2\AD#$
    ,3zr͚X꒦MP)z
    >XWtu<4R0@@1Q*Z[J	 GӪ"*[Roaͦ�4p9 8tr콉$(zf.7Iٜ& 
    \UtHRRk5*5npfQy-Hl)ʪ
    Z^Ԟ+j"-	ܚ2PCvŻ)3k!B7-)cqTb<.N@L$Tfnaeڐs+`R#g~UL("jm>O�ÌKju+t*P[}0ZZ{ڻRUJS];n:�l%͙v�Tk(?ݼl.ƸXLr.NcQcČB@KCS^LҽbVT^-޻q``+V},#	R/&t5.i6p)J\$ݾnv
    �ZnGXń1 M61o4aЄ	H#,4L(bn7Y_e'dSxO$
    1Cbn G8�;$s`Bܟt;cT(ٟߝ=}E)'c˻fI�UUݙ
    ayuTku31]SwWml�%
    (EqsE+\b*	cN`Ƭ%j9>0<ZnMnhoouEg@?w߳#-pHxu5*�7M\ln6r?}zo�ٵK3)Px?ͯ荒_ٞ~➮N~W~57=,*w[;+*uvO	Q_Yv(*moF/l_˷�v'?S�z%T,n*jqʒ$YVѽo.j(U7jܽ͂3sZ""-HbR5GFNjնhYb{mW{i\{j'KoܱŪjD	VodyGqE*޻4+U{m7�2ƛ% v\Z-'oR+㱏z(UMJx¾MwumܮF3256
    uvm]YxSK֒{JSWw�~jܘkpG!!k}q12a6+Amz
    -ޱU7mUwW
    4$Pͭ8WnҤK*]nMw)ޚ}QԖ2;q:?#ņj'.\T즋_	?]Ym[1F9MxωYx͝x$қZ�o}m=uuSN�?"�mC8`{??_2Pm%M^GƐ_SJ}BU)SUvvmT?<֞qk7\ɞ]^
    wljwE;WFNL1C3kx*k}U&U]#m}"ZVh]?l2?%͙w�Uk(?ݼl�_i"{ѐڪ'rS!QUl#F۵[nUVS\eܡ-UdUsڔ7itTS}ub	+ꦚ.`'iUVU/L(c"hDfUMUUy4صgjEEP.IVio
    I[J
    7$M{-fշ"1�:;Lj驃l~s�]ԪghC*Wy5MÎT5Zjצ	�O_)k]j%bjY-([Ubڋ]w}e$|31ͧ\I&[2#fc鸳n7^ :^B{ğe\JFusrVX&UYurGANu!(XU{ĬRwdI&~\LfY*(Z%yə,DH+~	_\.bT9ilޓ*Z4RXܱ@$|ŜybkU,M}
    w٪_�iXȡ6(AؒV"iTD̩\fۧl(ƥ.\qj/98s$:,)j!e]
    9[Te߽:9LBEe&c@
    Nd&o*RΨjJժd4Qg16M
    $l<Lg&NZ
    XJET."F7r[W(MGR鱵7+i-Xe;nR5ȅh$)MX$(~\ґRʺ)i/&�"�mBF䊜XD+U,ZU,%H-._RMn]uնm_.^c]9<=7վ(~{CCR*TiBcw{
    og7ޚ/So]Nrf) 2)~([b̟B["glv]j/@9EV:mEѽ{):8.j$1D*5E%"Jw_؜nݹIZevR5PvKTҢ%u"cs&PJ&[!DЃ-\lQiBʷ_]-CpExD}!fNn۠Gu\ef;a7׮lE*]sMM5
    `ܰ3|g3<9J/NìCE[Zv.ݫ)\^ǎqvLG,d$C)UTϖ"RQFr{._EREi--ĎQóZRv%O͏#7Y@89K5QmM:Ҧ�S�fF/l_˷YAgN~8Ǟ8
    	8:<r
    ˞7ikeV*nU5O֤)_@?Z}}�jB
    z֤)_@?Z}}�jB3#יսϱ
    Qԡ~VoY}U{ڪuoNQNV!KW.Yq'An]OvV0GU]GV}l2K:�j75P4*u߮QF*}}+|C/uȈmiή
    ؖKWԽtSqMuڪ*U[Vϴ!;aBQr6-ٍ2?.YaOyYX)Q~֤)_@?Z}}�jB
    z֤)_@?Z}}�jB
    zԽ)ő:�9O�;"?aCnyhQg=uUMUyM�8LVB&(?*{$^֨TrnmeJrQz+]WT\}rV{0͑+F6|gV+-TȞ޺7ޝƁg~!ca-$NVwE;-}M&服�.:|37<�Hx7�gXEqgr_8JE�4&Y8M]Y;}�jB
    z֤)_@?Z}}�jB
    z֤)U5K"5nzd|rܮci6ojWeUo]]OBr0G$w"A.;lǣmfg~7fMm"s[}uNaKs&A'N3yX%wX'yy)5ӳ]'ڤک=ۖi7z2RKJ!|OdAz6LHN\7^ծAejX:ug~iuU_jHwnSS,bZLe_zݻ]UUVoԅ=cRHS>~!OXԅ=cRA^Sg�s?޽߿/
    z֤)_@?Z}}�jB
    z֤)_@?Z}}�jB
    z֤)_@?Z}}�jB
    z֤)_@?Z}}�jB
    z֤)_@?Z}}�jB
    z֤)_@?Z}}�jB
    z֤)_@?Z}}�jB
    z֤)_@?Z}}�jB
    z֤)_@?Z}}�jB
    z֤)_@?Z}7DaEM=DS|N8@蔶.yE>nYy=rbtUզv	DƒqL�gl;˫6shc!Uuz4׺)ܪiVn$uDj*޼j2[c]30fx7,7vTZwQ]=J}%wVWӰRPI]RqUqvk{Um[}ߝ7'&FaW*eCPzfvUa5v(O]VSUNȊX%vݙ_P6)kU{Oviu,Sk[u�磊Eqd)_2!7showP4DO/j}FͽѪdVr{fĥ
    PY9|EA.8m(eM6&HPn%	]ҫ]w{Ĩ' 0(wbB% ~t5I8;J
    akvʷպi۩M;m֤)_@?Z}}�jB
    z֤)_@?Z}}�jB
    z֤)_@?Z}}�jB
    z֤)_@?Z}}�jB
    z֤)_@?Z}}�jB
    z֤)_@?Z}}�jB
    z֤)_@?Z}}�jB
    z֤)_@?Z}}�jB
    z֤)_@?Z}}�jB
    z֤)_@?Z}}�jBrCp1~?㸼u:j^]�Os}}mU?ͯ荒_ٞoFL#GN "ZsBmFpRNJ\H6!'GѸŹjwVKQ$N?䉬|9g 7	L$$=@̍MU4N*kT_XeЭ:HX$s4@o"6vHH{$1-M٦:i9)UVˡ[u,5D;T�&Hqh$Dm2쐐I26bZ5WLtrSm85Q}c5MRTIO"k$wƈ
    DF.	d3#f%U{4M'%6ӊU3YtqXV}AO!$Y3j)2 >[Hz$UM-W/8[u,5D;T�&Hqh$Dm2쐐I26bZ5WLtrSm85Q}c5BX>j"v�$Mc88He!!dlĵ42jfqU[\jk.qXV}AO!$Y3j)2 >[Hz$UM-W/8F弄5zHH&s`F!K,6$TbU.1a~Npi-9t&g-|xA@d#bztp[m֩qNpi-9t&g-|xA@d#bztp[m֩qNtw#'SHl9@á68)kNf.r�$qӣhxbnLn;wqXV}AO!$Y3j)2 >[Hz$UM-W/8�'_-9�_5;
    ꚡm( $bi_hі?Zy~BXgLԾZǸZ;ASeD
    MN:lzuLJB[5HV3uh	Ѱ&/'\?y?!:.̍n3$6ȍkLrOvOv2#emcVD)c[kڶh\춧#\Ė!Y=ζ2HLa0ݦ4gĐ<J>&m<5tbl?']Adxs"#Ѽf7fR^j9`օZT}:;i߼5hb2RРXez{M]K#:)+{f"9Z�c0ni,*6E,9w~ڋeyKO%"~jS2* x	9y#Sq y>ov겟\zv�C|]kz3vz:<9ϾkË��PgLca#<`]p4iYX^>a-\P:/VNֈ"1\N/BmɖS :)W@ֆ)5Mh7ܐT
    [BnS&3MEmRX"RZ7Xdȁ2`kEy=5z5*`QPU@IQ7e.�Zv
    sgSJk `$i#:;{3j*T#OAQ7!E 4Z�%
    \,3:8vWq2]y*Dm2Jeq#I0&IGH6„.LOβ dJܭ&NC}UZ]y4})FwkVJq0BGR(^D,tӗ786շ^߫-M̬i!}),yIt$HS0�A(7!% vF5Vo59%1GmO<(m:ó"p
    0"eTd,&.qa@K;o|N2:j`a,4@EӜ`@2Q97va_J=mJ)H:ׅ)rzm XK	2LGYA&E<O13}蠗gT6ewpfHЂ
    aପyA~|Ɂ3(B#-8$Zākv#dM'dA&rp	kKܟ6qKaR} 3˔YK-.~aqw$av%G	< if&h2!PةNPG	ġsynZ|\*xFq9l?'a2_6`48䭣[2- pl{{m>bx\4ARtJI]FxEB]ú<
    ;@,ĩOx8Wm{vV2g22kKC47KXuI	Dm^^iZݐ7Rz#QZ)됊&Wĩ,MH3%9⼚[K073kV-uZ-__.�z?J'__o1
    HZDC1(KG+
    3)AKP_\%KN4WUT5۽Czcs[Yc&(H-s(g6hLئ&tEU9
    uVn E(ޠKȨ*<>o?e(督yx@,Mafm�~ظ_f[ߦxy8bPR	ȡKJUF,1&Lrⴈ'uo^&/1*
    4A\ӗ�5z,IމxgG{8W}nks+1ldq1	TQPHS!N5IyG܇�G̸�%}Y`3ʼn,}ͿYU{ef@!bt21s
    R-q&V$H\U+udm]R(z{r'%0Q'E-Ƃg
    N4JFx Re2GrPaj2*
    %ip�3B®x08dYÛ~MYTCᔽHvXcbP+҄nkEXT{BWi[YNܻuX/"Z9�3v,qx79ﹷb=}*h*Vxc}Z!dPiP&cv7S]Jnҥ(qKoZڼŹr60l-()J_q[,"#iRF;T[;rK)ړ{6|pa2�݈4X!7@KHTԐ] v%$mEʛ7CrhёPS4 a\�\m,Fn/O,h*#ӊv7HM.nکȇi{bN1J\چS7)CLnhDu5iSzwwFm[mK}�W�Kү89[z(g+1ʶ(ܦ&)0w&fcpb*X[:*:bk4E]Qz%6EAFy+rE;/,q*u0DAf(XTXL(MN"GL̇|Ú5bbQz%9ݪ)[�hO3k#d6gQ�v'?SEc_m1ױ
    u,CQ#%Aә;baC1�ABLHJzj11,ab'->:>0lx,bE3Y RH�A:tή:m[=j1D%gGF
    ŌC0軆k#]"
    I@2'P.غzGRqg
    V]cXL}>D9&IG34ĀN
    뒡r`n̲Q11ů\	5:nT-ya:oxƑ~
    :wJ\JbbGpS$jҟ%k9jwmލ[fp007eRc
    >m.w\)W,
    3YS-Nlhe<RGv[L\NۊfF7E;Ti.ݮ˕jAl]׋{4i$kZP6U=8Xゞ1 _֫Uv.YP0pnmF85(#ɀlg(ڗCQivT$RO`mX̍0N{ds>AH޹*,+.3ZɩPQ#gxYZ_x2�2Ι1
    ̌nv']]+ˬԃR\
    N<#l;jbr
    ?ʒ9_2bR<Hra;="
    v5?ʜN}g;pr`)�ݮr+E/
    ZՉhwgW;;
    ԳuVSH`ibl6mI|1FjCk(fi7o&/h^) #aD2Nf$`9C273#xI(qvGUHnjNQ>390JBc9OMO\j;Xr{jY:JQP)0Gt6	Fq>nޣ5!
    5É|hsuN34yD_XgxYZ_x2�2Ι1
    ̌nv']]+ˬԃR_?K=&V.88e*j[�9<d{LISdcc2Ҷln-=6ĹtHAmEb<hFJUy
    }T93DřYdjNtV}r|&Sf2p䦷#c3xm-
    $w@ٛ*m%1Xʠܪg$Ҭv&1	3&'&!B-L38D!$+'TʈIDӏ&;q#;T-"| ٚFwLO[SLW.1<}${ftuuК[y({@[XԓuC6#QvV-tj'[#X?)2c|_FH$|+qk^JRv˟/fl4ag%H.*90 ]]HC4H\7GӜ%(퓤:h0;IY-Aqt:2@ؠq̤{FL&IR*Y#c[~_A3$9.c}}HIg$e:cmcP ִ!,Dg1[nA>0CbEPMW"1!̩,(1(%OQS7k}t!"xD0[#1{8{E̙fXC%I5fw@z"'נ܍LjeqbX7kt:Y$y`>Zc8F9~f
    <!p3
    b_E]phis4M_cZ�qUCóK$l2ZҢѤ8IV!lOv([$;$21w8UM&IE(PEe.7[ęx4ye)'x#hc##9=a/Vȁ5VGۣj#4_-'yb8Ù,r&~aL3b&*+^}2LR8.vklJ3>
    :-\gƚyr<eN)ΫM&iugv)+"^,8vZ}Z?䌏lY\P(!i˨wЧ][
    Ȳ(L'QawG|i':ѺvY+Z缇N5?S*T3g33n9Vm"'	F~+F"g;\X#&'bMn)9BɀY	3kّ;J$!'1jd5.D(sAE?h�rljf<級�H0Fcr())wVdQ2G҅oL50M1@R,i$qJAN3X
    rAjc{G^[ֹd&U<h6Ŏ،ϊ:AW+;|3QGaX;|b54n|e+țF'Nfp-W[Gw
    uf)Zy2֚Zq ,o<INrŹm,42/rxRϸn
    CbXڀL$m68t2*4̎}SR*²&mrךs)cROaA^\	gr05mI>nT9Qb5ebFm%1|C_zBMe05 bf<eWvZ^يv2˥	+B]­d;efBd}d[-T@teVCׇ01;3Ryc:EqB0� { &DB,cBzč,EF7-gsf[VW<Mϡe38@h>!Ŭc(d2&/,M5],uC]ܫ|ǜ1;`)r͖%dT9!	cNV :)`)Dsb[ +\֗'7d^r73m ʼnb8`ӸIfx';HiIɘ7XkebXRŐ;9700@fhHû`Q)xRtʼnLx:.q]~CҙB1٪F.&7Ax[jWyxCZٝC
    %{2^%NB�cO8<e|�Ĉ
    Xwq8}tvB=RSg+"(0轜XКHo
    aò!(ّfQ$zvn@
    U&~TD6F'+�W4`2]X3FkuwYisK	k i*Zڲ[*M!CXY�	x(pL",d>cE-0D/D`$
    ,r�E.d=	X%w;Ψ%7݋kcqeV_F?sTh~!lݱ2" X:4
    Xa!v:B%oͬ}X2(Hپ"tOuQ;:97^R"촦M,!+�=ěH ,ɷ5ҡsS6̍Yܭ&HĮ9'q;Je(䔴նfqŅ~$8,eX!FL̒
    Ml1,_z`%bcdb@0to:ꜰVyy,5=qFUIbO#
    f9`o,VdѦyHxA8B0%9JIZ)!e[wb5w ͮ&wua5Jch}17Fec|`5.eA8ʡ.	專.vp=gT/l+.\d'Yu]$vqI/"(S,)4(H"ڝwCѵ,fjFL)aQ!2ј<34q!sT&NF)䜡AR.Ҍf
    ,?L(]hkf6KxۆrKO:bu5#lDwZ[Q$4ܥj1BpAKLH% C9.y
    e%kZ\JiQEvDo	P[mDlf56aecޝR>wX.wSٺN{zſ�[[~ooſ�[[~ooſ�[[~ooſ�[[~ooſ�[[~.d
    6̯_@er(m9\Wu%+j	^SU6zRƝ=7YSڱu݋vuzſ�[[~ooſIe%gi
    D6J廍Sը֪b[U7/ov,Qv#�'qb"f
    /äL.յ==+ZE6RvQUo8Í>)510m	_R7Fd42իEyEj5e!PH8.n~>T[f&5}uTO`oSv}u˕տ--?\r--?\r--?\r--?\K,iUPUmXyC=l. )bxUZ䛶Ow{6M^kk;nyooſ�[[~ooſ�[[~ooſ�[[~ooſ�[[~ooſ� TFNŢE"%$
    _H]j{b{jWu2m]N=ܢ*mcHtT'˛iqò~%٩_]U-S,[ݽ_]runDj4XHYddCKmOlOmJVMԧ]UE[x05QK;C.$[V.a
    Lԭ[S"$UܵRYU{j--?\r--?\r-ќN<(
    )p<e]$E)L`nDlEtF)|r--?\r--?\r--?\r--?\r--?\r--?\r--?\r--?\r--?\r--?\r--?\r--?\r--?\rV
    ٪ʥ"IC{j6ТmU]W۵hU_ͯ荒_ٞoFL7*?-3bUX�e
    Tŧ)ٖ<Y~
    %","!oU6n%Yq:RWY>=#dhsZ]LF%x٣0άRjkK_t2^N+0@�𙇤pSCb.qKBį4cqsF:ܹՊMM}IrKCnKUj\`al`O.1WH1Rg%bQ٢ h ba[RL7~zNEWY>=#dhsZ]LF%x٣0άRjkK_t2^NQp{̔"c)A4Q21b]A8x~	k
    ڕS)+0@�𙇤pSCb.qKBį4cqsF:ܹՊMM}IrKCnKUj\`al`O.1WH1Rg%bQ٢ h ba[RL7~zNE"}f>dYIO2	r 	hc#L+XhNԬmjXyOarI1~Hndu©VgX;*;.D+N=.ɃTM`\5	LA}I{eDmRRX<?S@6ݟo5^uڊ[*.HgC2ATs2q4
    䨭-$[-ARL/DD7{Jg:Ī�x햩NS-7͂x8
    H1 JDXDBުmJ$)fBtmk_Rh@i0Qr77T<3:4&ͷgWnl'K0?s̢hU>\q̜{
    1¶y*+hf	!PzԭS#
    #bl\=1%&ȘJyML%LXypN#C7gZEwcm#TryU!�]�C00E-xA15T
    I}DφɱQՑ	{@Wm^MX4ۚ?a2EXzazI稻LLTg
    zHD@jPf'*[T9qSq,G9�FQ�Fס]X%<)%MRMdQ/=̛\/(nbG+D0D<A	ԡxU+#nD9!2P.EƣjgZ)ovT;[pJCrK>q L}qegxyQ3! D!`#ݒ6'5omco;k6%fI hc&?=cI\ZJ5K!٩ҖwjZ]edI v	aj_,cn\T+<IF0&:-B0855WiKL\d-Eg;gkiM^eB�Z?:'8\^Il7R(E\/&�8v);'bLqO (`C
    b&ebݥ[ճ{+D6H0dBMrCED7Bn$;F3lOj]-j'6ﹴ1L3O_VȪ䡨nu
    4\X.^3)h{hٝgRw(D6fdk2q9 )qlq#C,=f1`"Jt2
    KK(j\rn׼u`4A{efG
    DY6"{2X(4d	̃[x#nlwtt7Vڪ?lݔ@:({?!oLY1>]ʱ(Zm@'쐅v=nK䌆ha<C1>7"ǎR²[#tSsdJqCLXE
    ˊ+EѷHP=?%Gk1h"CCMفQ8`+r<cg@e+Rw.@Q7L¥G/8ԺmՊ񴓴Es8?\PmڛRrCerW;~UZ?oM2TY6LK&OሙA4G<]cԚ4y2F$CHT5ڱBjp<W;fqS3^?b<	ϸ!f&CVޱ3	A�r%)sa遼Bdf�TEX�s#OYwӰ4d'wꁱ.@Fik'^n,yj2\T\%aHs1=ekVHO,IV.9(3c<B$z|ЕeJ/-L<r|9LW?ѕ˳,N+D4i(d(bש\|gFҕ�]+nT`p[?FY+d[\JyƧbaeZ7* СTFԎfPf"EG
    I`" |1bv9<}XY҈<4nR]#f#T8;y�3P8+~hc,
    lnQ=6Hէ([_YhApǖU&O"9C(0>Gy2c;d)+_rl®+Q0?5)AZCV.qulv*
    )_?="P8^M*4!qCP00SOL0ASk4T+s|k'-0M) >8q=֒XJ*K٤R�.HLq�A.fڌ
    !l,mpl`c	cGIѬII[D>:&%|
    )CzӸXӓ$y?Һ2XG1/a<!>12-j;26٥TD 笈KC^1:KK"X'\s z?B66Pq[U9=e6
    &טn׈c|dl5+|LEvΜӤ}r(;$XƁbɢ]Ïcj$ui!@IpŌN)ƯgDe/"QZ65E<t^Nbi$&SRĈ]֍1t/0UÄ`mjx?uEI<$'p]PjQT;G\!c`!x}vZ;83@T"Od�P\ȍjv'Fyb{6$7
    4Dn8|)_ʨtXera8bV {I
    EH"3,!g~cj&O2tH5/cӌms)R}br%S�L|$E^|a(</$/
    V;>jWTwnUuUVR~!y�#0F9aÓX>?GPjQfkcX"[,=ȶcYNm85!ΩdRf`)\zeʃa:*c|%@
    %{iZPJ;wrOc7xnPÊ\-6XYdNbD9"@(6\ni:*rkp3J͹)%y* iL^UXC/
    7ف4?[H{0	^P~H	 %6!GԷ�\T05()(&|}yC|H.׫shB <߯Kް+ǸgYA6@gXlVT
     LDzSz@ra%?7)˲9A4F2@ %^m]l#"[v4ݐ%i
    
    n<_9ʘF[č){xo7zJ%.oi{'�.}z'ӷoA?jcsӯ/K�~3Ouڊb^e� br6HVve,g$RM[Gn*oY-|W$#'l`sB0xhVy=t/1;67FB>$rNHUnVX~;b#'aR)!%$'hY~nd֢Xz:no12+nyT/yc\zO洺EI2gl9"HAxYYr]6b7HQ ' .O6W|<>wT5ȲAEw#rh$y4xR3F;{qbQhӢhٸRĻar+ir|y#} G#$K J.),Rf2~.M9�T?b<:0-J!^D>&?&f�I.:e+H+DYq#z{ώ$xx0`(TuT Kr S[H%@!ܰ,ő(7bXRBv4wQHU-bf	D29tS8nKNEr; $g=PUgLmLtwcD5
    C@{<
    %%ؽI H
    nߎ\(P8:b7+9y��[}D;DaC
    l>hۀk$?*
    qGrPeNj0cKL>qȡb%;!Ȱj@
    eI^5ݲO$c
    &?pDvƧke%rB2a>[Gq3'? A^bݘ+b^e� br6HVve,g$RM[Gn*oY-L['ϱ"Ưcl42V&K%,gY6mrm;/P	n۵RBJ3H�Z=-L�6XCcϱO$˥Q~RaX	if/ױ,V}ycStނ1)~X%B$-8g#Cx{
    UYts&zwA^^10C,[28xj"|ކ!7yA H.dwj!ud{aX><2� %|*-
    s<ڞlb'Zf}}Rɝ`]ݚP$phL�O"_le{t+L9I!F"n'"v@(i7YLRD"օjVW2ϳ�WH32yX-z{C[xݓ[/$6^tr˦n A
    ΫxsOFVgOMe-DH;E7
    Ȯ,�n͓DXXdlX?)ua"l#veyoC}C9Scz+ڒu+oJU2Ü_X-Dǒ0
    MF5[^<b)CȢd2|ZN$Y-ٚU`~[!֩phQ]V
    AlQȩKq\"q�iyjGb[@;)&yYg"ّ{QC
    11
    B@ys VAě#
    y6T>8iUrC$NnY+*騮ť뮕zky&2KŌ;!p&ohhru
    ;
    DNͫv馍O~BrghJ#G'f?X 	`d7쉑ŋc1�r�?ČXYio0WGYp?*@^MEl\z#Q*oS59aɰX�/떋�@"v-1:sx!tb>Åq@c4γ5ke% F.H]q}%fA8v.\diCE1EVߞFmuu"L,m53#goaf*,gB[!hDC)8 TOMJQ1"EuqΒrVtİ)IN+J&Q@AQJ	wgV62
    ψ)kT9qjLȣ$g~|6 MNKJwj55jħY@Y�	-bdzԳO=EbbP8kB"UJ1<WRڡ;b<226.Ğ)fQOx*j0Zh#pGByd{7Cs3Y['qV7X}3Ytf	JjM
    ,%h$tN-e@A^P/"%Zƺ07.Yl)7$=bn;s1fQbhP	GT2<1?z
    JgJ5 N1^@c�v?Y`.]:%<-Ffd=l.Ł*ʝ-нj6`{|[&MSNA?ig$a?hܔhqycz,jW
    S'N�<x9ԮKf;dhi*'}P6lqO}Yz8 "d=Y4	۸or;Dč5<32TCHgdߒ|Ol TZgx1aW()fv%Ly[Qia
    MlCNo7jx#  j,?q$S;[JoP*(eקa5
    8źN#aF'93A�	<\ł̋.YdG�ݎf5u<fFX!0sH͵ g1dHbA-	4Uc
    #Rt1ͱN4 &"i=xRX21JǛQtW>$cXA`㊽c>@1.Rag6^#2HDcc
    m(Kx~̉s,tiK:Gơt
    Q!GpՎ -dLsL`~klܨ͆ÚRrz9/0
    ϳ�)~S
    !Ɛ	Q#Wqw
    X~RCJQ/4bx=l 	b5WQd2wb9ϑxj?( \vysۛ.OzfQƹY?5xCw3F^Dg)&8}EaV`#Z~VOn3~r/qeQ92^zJYGHzV;4hȚ#1YgJ%lfv*�̄c66I3fz]�o?s0<(hu7ćHH-LNr
    ;HSy‰$y[kGDKwMCN^c�e$F$?B3b-F|q*M_}&bkSwbCjSr	~6	`,$dY{[%Ѣ.4eIR[-jxVm^]B|)�/d7!mUTHlFl!!\<z!GӾS^b&qg9dYKay�싉Y)܁ߊ!K
    .w4۷E;I0PDb�d<Z
    7ybgٰ-\%Kda,2n9#X,XerWkaL|	hZRux"<LJOby#,WZVtSZW[+nR{&	49"Xd\H:ǥŁNP>Б
    ^Qsѥfݺ)HX#�!W9#?Ńl)(X 3	dura`-KQC#e L#2-`9j
    0h͐v$+/R:(a}c\
    dn? 8LCBҖ'H	6<<}+̌|En?dҳhҺݯ[vr	~6	`,$dY{[%Ѣ.4eIR[-jxVm^N[B2*N8*J#0d
    3\sX5֤AmBmqC>C&D$DznN0dGRS,`u/6#)ԵF:tvX{#qH~4d܄ MQd:G(HJ!$tHĹ!YJWq;#m:B4F+P*DnKX6Tqb7Z,o9?c@B$2q89ILT^	Mנ`(RƩ]="ƹ@p,NgW)MlxyTV'r25ugNm;uu_IrOTQwNhX\c2h3d#8>Xm^2pjݝ"Wf
    WN9RhLdTw1Tc|=
    )沅+Gzo$ot yd_iLH|u`f6Clp4R4G8"v\;OUKV[ؾܓ&Jg3V|3L%ИIwa)}
    B婆ZU66VB̀7HLSa2@H¡˻(?
    a}:8b`Iu*�Ӷ7ä!!aQ\K8M²{"çrV؂M7j{X\
    NL(:LFJb{ay]B#F	Rfw&k'}^k
    Q0ɦD#g.W0T+B\!+? Φ~ndhnK$L+=WUphNODzr3aJ]pnæ H#x"܍LBUIjY\}DFԛ_h
    .7ɆLrMgj8'\ԉ%".)VG"IHL֧spбRb܇Bd<`r*Xn[ܬT*ˡSDRB@xSg
    Xb6-gi
    
    jkAr|/٣N4!8@q2!Lk5=CB;"hƖ֨DIύP.>MY?94Fb7}L]f/KL1>#؝!#~be?}�*󜏊0EC.d)6r_Svtל؆>̈zL%İy[A71ĔsFkd:zP$S^7lqktI�|F',ƗI32yZ0\blaɦ`Ҿ-l$yڱ
    {CECdI�"Ts+^5c;-z(cg	y"4NM6|R\fWoߕVBЬuq2@;:))a9ŝ68AZņ;R%N*d!c92gS50c+|0HpIy#
    (hm]viU58C$VKsm
    i7ɲ}p9[;?HG	eV9Ȓ@dAۮEkVBLT]@JqzS;5˄^
    _;*R'PK%٘[kgH;ΤKG&\ě|)W[h2LbQ?bK0{A!ݻ.NECt
    t[UаX#%>>xR,:V7Ũ.NйKA?v{#ryBHr|{�&W%-"JPwnQA6i"hXΨs6|2aǂx�t�
    O55mV$ἤ1
    ln˗
    R�(f;?#[hL7[XT!]v;Y	BU
    d[zٽ%>UIU,Ɂg�4pHH-()]"mLJ\	")qHs f�x�[X0^d i*wCq<
    FXCyc:Ǧ/=	fWi&d.i%zʼnaIZgv`kI[nH2d6t0>cqc:eDzyxѢ""hl@Syy*fuwTE8k-qvFlr*MDY%y5Buv@[ې7"y{T>ǘd^ӏc~58yЮM2E1EJIBWxhv8"
    aćDRDJ?ߕJĵ2qb;Ef-*
    )Ao~5&\Am1
    ׶:QOd2&q:ͩV\#|>6RΎuA[&c
    oQe8ݝ%,m̈U3�۫/xKY{#m�9	0$&,fbfg�n3_gI!y6_Fd{"MmV5]Ii{6Y.+>@aԝ͙$-:'\jDضv/Qe?}�*󜏊0EC.d)6r_SvtלO8$2P�ל<tmdܺM�ܱ)qVҾaB{4;xq.oG)�Y^bqc3PPB4J<;VUfҔmWjMT+YYs![pPV]H&r|D-g"{)X(ΘsFiPa[NuE;a1PXcq=:84WR}KI	jLÛ�$+0o!.WBAMX_+Fb!bR52#egŇaNFa=4ł-s*d\ʟ#Ya;YZuJ@/?!;GRW
    ǣTH[A^.VxMD+C,J+h_-Qdl 䐾I	(d<]]H�$2Cݶ3ncn-LrLsmH>,G\qoMMq^RHDg'')	z5k-yХȎ@?%�J\~#}�M1uC!L^c,kn"RMszȏ՛BX4XYGy~Y|Gqr[1;ƪQYseMJNCTǐ2b=S!_1eM|C FQm8jW6R4^?YBPFFt[:X!G#�@yNʂQ.%QZ(Tܩ)
    ڲڌr>Ac9d;jذ9#čIi%v@A68VD̝[$E9>	d=�a+̄p|%X|;ǁV(Ԡ{ko44,pgT9 1AN2ONQ	5*;6dܩ2%e
    fGf٥d8n//I))X.1d| ,ü@5ii}*%dyl‘|.VSRdZĵ<!D '!-'=URO!@xіbcai@(KȢK6F>Of(ŚenrKS(ٔ'kL)y&U
    VSo;~c�@sdLFN'.go	KS_o)qLUK7i\]>'=\L Y=(-@lbvR2Zl$lpjy20%2(*+L	CX#aH@?EEۨ؛\W]Nנ!ei'!d8�YFq`bאuIor|>_fĵ5ScB".Mʈ2
    hoLM
    Dn1,fK)FRԤx
    ?nP4eżDr
    X6I11.EG0_ECS.3ȸqr2Vp r	Xa-,-%(U\7b@K> `Dꢈ0^Hc9x)`Ѥ
    azd8nSiHX~+v$hL6–_Yy;'"4XJ/eؾ,ch2k)(4%6>@$7GfL4!xI	Ȟe	80CP<zIۆCd'zLb}�˚V2\c&yw0v:Ooa=4.B! Y3Q-<=-lLfրaj\\
    r?SL"#Fv_ό!<' `5NA!?%YnzG"4XJ/eؾ,ch2k)(4%6>@$7GfL4!xI	ȞG# LG#`04@Rt"w!Krt#dF4(/[;-z%f^\ Z%8{cÞXX'I`Y>bɉQg5Ql Pj1eS?C>鑲O#XBNn+<1�LDKT#[Rm7+?DRN6Nŧp귁�Y^5\Y-WJi*~FЩKUpaCaAoD"{xа(e/LKΓ6wFCqk[5CaKs"?kb6K7&(B9^ns@BL55<),>;:<٩7-q.Fȵ9(wo^x}$+d;:n!uKˁNAc) 1C12dDY{"1'l<ZD#-roV:cDQD;[s.cx\[4IizvUq]면ˊlhpCƨ0Idg=GIG/>d,Rf^,u\dZexrLx:'a̸̡\k"?fvb9v`m(G'7:]mȅg?q$O@xи4d^&''R&CP@?wJ+WE\#ib?`}uCb|V):~ϰFM]3:(񋺋o&2r	l`h!{-GJ>=ΆlL@BmTّkMVQcu	q)Z<͸}Dq`ϊ%ig2RL܅wg:!ѐ
    P#Eǀhne\oL0&dBcy4f55Ɣ0sH`KJ\cNhX\c2h3d#8>Xm^2pjݝ"Wf
    WN9RhLdTw1Tc|=
    )沅+Gzo$ot yd_iLH|u`f6Clp4R4G8"v\;OUKV[ؾ(QїYv^)SdI$bt`XDŽiY]ENXS<2$'ӦĸXHjCUÃ颙p[sӍd0E1&$aV\I3%{tʅaܭ=j3\QM֦߭(k7| =0JPyG<:|D [GeM
    jrW!X9ISic%'Ӹ\eˏxS%	MїU\:'$Or^Ie<?2ƃIBBǷ(1&Ę�ٴiMvy3|;oű?a|y]`8بe
    dR"
    3[@�F>dvҼnyuDaMGG8\`HV81k%I8BW3~AL^ܖH6V{e	y[�5]N8oAgZc|쟽im9ίѕ|F�y(<ϵ y6:dd%b0Z GrkTZ؅*?& bYy[p_!h c=8w5J)ɒ)pA3ZbP&Zi0F-5dk1
    Mѣ̄#D,v䐘VW./em&蕥蛨\T
    :Cp9's4}n(
    A&N)S[Ȯ(l5{;A)?.pF??U4p܏#nt>q%
    .r֢F7f?EHof@%Id	ىcR44]ٻgonWlH恡/ˈdI'lm$:H[[|܁W<cYR-`#2go=vʮ?WBd_$=/e9U"K([
    jM׵u oiMzζ߭}x+WhWõ]_ׂv|;^
    x+WhWõ]_ׂv|;^
    x+WhWõ]_ׂv|;^
    x+WhWõ]_ׂv|;^
    x+WhWõ]_ׂv|;GY(YqRw:2.[{(kbhwoV\UTvczdOeW)-u[Unߩԧoc^
    x+WhWõ]_ׂv|;^
    H{8lANispIE{qScV͕]Eknk)Wem+VЯkZBj
    v~Γ:ϼnxB>iy^c>]݆[]_ׂv|;^
    4+x
    Ld@DR$ݒgf&Ժ12&qWfiШxCntV<+VЯkZBj
    v’<2b)~Nn3 ɃKH
    j[XA7+j3fIk~
    x+WhWõ]_ׂv|;^
    H3V&ay}ջ\^͖q{ŭRNԡKb[�W[+WhWôI4#H1om鉁ɝGT,lvRyDU4*ߢ7-5IKwwL
    ZDmTP]T'\u5ZK[VЯkZBj
    v+VЯi''k&PI'-INDG\Ŋx+WhWõ]_ׂv|;^
    x+WhWõ]_ׂv|;^
    x+WhWõ]_ׂv|;^
    x+WhWõ]_ׂv|;^
    x+WhWõ]_ׂv|;^
    x+WhWõ]_ׂv|;^
    x+WhWõ]_ׂv|;^
    x+WhWõ]_ׂv|;^
    x+WhWõ]_ׂv|;^
    x+WhWõ]_ׂv|;^
    x+WhWõ]_ׂv|;^
    x+WhWõ]_ׂv|;^
    x+WhWõ]_ׂv|;^
    x+WhWõ]_ׂv|;^
    x+WhWõ]_ׂv|;^
    x+WhWõ]_ׂv|;^
    x+WhWõ]_ׂv|;^
    x+WhWõ]_ׂv|;^
    x+WhWõ]_ׂv|;^
    x+WhWõ]_ZЭuU7dtP~zFrj.;nm[ԉR]M'WoF/l_YAgN~ƿnCsf^1mf+eY96Gn,R|>
    *=Qliy}Q~"%l \crHWäضH
    '
    f%Jq*dTb֓m6:DKY`A:/c̸#G#H;lN8J�U;Ȩ
    ŭ'mUbm6md&Gdxl;DP39%7rǔћ5dN`Ӄ4t)kICQH~X:qo/039fjҁ/p:sWMԪ;hBEA~.mS1t�sZl:%TnmX,ŋ^fOƏtq0Β 	IEE&،L9!yJ`Ve!;kVWxF-ٗgT\(zC{|i4VIxKq8%HܭЧUwnQؕXfwKB,@蠉soaQ,
    p=+u�fje֖,X2~4}N!2<5$a2'?wtq(p;<g)$w֯G[;!KXJ$G3,2�dPk4_m,$<Ff[ }LBӽewh"ݙvuMe‚4+$wC\tcQOfRnS$;3dƱ3֭9ű:WJkl-NMJT'5XD>3H͈ň>2L҂rli6.Ve/%xI5D9r$w!#1C`7\]YY.	:LjZJ:
    2+
    bnulBf<0ـ=%a̱'&heOaEGJ6761#/ـZCR	V;8282D#b1b4ܭ[{Mu謶Iy&gMfQ4NdFCmc	0yHP
    %bpVVKN,֒̊G3,2�dPk4_m,$<Ff[ }LBӽewh"ݙvuMe‰/~e\rӟ�%YEDβGGHoQ{̉,tH3RRt	]Um
    )Tvj;vz11-EA&(D�A)KQK"cT|)aO9lҮgѾ/Ή71nʮ=+\|	s6	+\Œ.;$17LFHi:b^HžPD36>|a/	93M#0L'Xi&!jSo}y2T?\I2{-Hܗ"acNݛ0{6'`?4.b~:dXGkhM3Bڊ`¿9wHm>=,#Eɩr5q
    GJ!&
    }~$Gt	YU1SBSWg.h"X*wFhfv=vip(=5>Ć&7+Gxe:G[ҵ,"L{#ъciˬ{;tc)>2oa6lk/y#;GRœ}tdf9]Kq;]:ܦ
    g:6RwL%3l)H_dS,e|H(H{D.7[iP�')~@Ev$&b&㇩Ř!ZŁ"O+fi^*J<
    Gj؊\Y3x'6Gѣ$iq֍Ry
    HnaLn]&gpszl�RH-Ho14q\JdJv\cp'wj5,xD2{Bܘ 拡D9F!b$bLMrO&^x,jMq#e7RѪgZGvLJMR2C5"^#49Œ)jc<�˙9~sMGb1GdPi])+r9iY0t\Ԏ.l GL'8cv);
    r=4hhfMnҤꝍ,.dB&$NX.aQ4#K.g�p�ZP۔UU*?<4raQ?B˶
    
    ^ܫTnj}#{ʼnf惻{|Te24/	>%sϐpܭgLL4YN>
    Ć^E3"cʤY"#˝YءGQ{PPRtVCi�"xU#S%��~IQ87oQVgC~p+uu3!c"B\FII"eLp~<`vsubbT`NCuWJ婷5:Gɩ|*:%H17q{rWX(}x&G`{UZtm{,i:ƝE‘8dY9FQ\}Nr+Ch[X>+X3{/*)L(R�ؔ&S*Бgca`tL.*
    j@
    6e/OJb_9^t6X}O
    8uhyY�luגC�r^'XL1lՉN\	"d܂H͕!\EWݣ&)$#CF�O|vWu:j@)bSl2+HKHSVyzj[3&a	z
    72bEQvmzasO0d<:}Ur5"auSpr6w
    zz9+Y矒ǜ^x9Ĝs^t|.v��RlT;L631L|HhL($r�L){	_K'?KΜf;GΠ?m+?]YL2615	 O=!r9ǂҰ%bBސG7S"Iк6лy1'1;F21KM
    ۛdUIޫn-)XyEz('~(9Ǥ1ˑ;=?#(G./r]lz3̑%zs9|H3W}@}
    mL%.\lW/\E"R>
    xxaxe=і	^e
    	(e{H͔iqjvzZkv^nh
    y
    M*!V12NqN0SXe&Q<Io'^qdoe�TqN
     bCLAJNyT#60O=ӱ`FHT2ndk
    Ɗ^W4'@~foK3Px?@UaW%~km%[ѽvNM[o3SfE
    HGb(W(x$5X/yj\WcoMݭյ!-'G[LID	̮e!QxnHDTS`P /V(EM[kѓ$fWB2T7$"t*H^)(|rr"ӭQ!ʤA5'#xa)>7=
    'hxP$ˣ-hhN}HKdQDr|3+!pssCdTv^*:$/>@H9e9ՊSaSlȮtKJ#L˸%MۊMn2As,p,`̤\vuUSο':B['GFN$;\	 BPܐЩ!xA)^PNFG†D
    bڊDk*\H→L0*@+.qe:g_HrfEs6^Qe]-"nRl;tZcdgkwe$LW[*Z%ttdi("Az>9*;/
    
    l
     $m`+*CT4hx2oVdJr֣*Zݶe˝VށRd%ttdi("Az>9*;/
    
    l
     $mb"uq+yw<~@xRJяs,`M͗<5.	TƷڍ7YRCz#$BW1RP.
    \$r
    !-'G[LID	̮e!QxnHDTS`P /V(EM[k$9M"u/(2.7n)6T-̱3;2
    QqڦG+וVOLA#FJj2dSzڊ(mꪭm}8L}^MUSQW[rݺߩMLS̓j>x!){F
    ƛBę$إIK˚gFWw7eȖZ}\eL1ѕN}Q2#x]&h:sc"QSMֶn67'i?ۥPJL hhR\A\Cc<qpqTK[%iվߢמݫZԽm2FĔYQl=390?cBXR?rNu	ktqK,y:1qnD켈KIٱKגתqqTr
    .J/Y$oum+6JJ\S#]R;{zEuUWN'0
    0bw-)@2P2@ޡt
    'wS+HSݮ*q$NdPR{L&rplv~:VuXX$`ڝC#UVݺi.7pಘ"[i&4Ï.̮P<ks]Ds#+kJ
    RX%D~<ix-sEW>8۽Ο07+=|fg9ȸRyM&(i|ʙD ~xw()}R+'9s(̙CV>Dq^pfL4|s8Ǚ,r7}-P{*PhFBHo"jMPoNʜq
    7dqogOAviTd,(r3*1qr|X`d/%Wk7Jޝ*V>20LNi%,#YA�HM%؞�DFz5YpfBY4\޲4]f7"]Țo_>./"sWdBjb+Uy
    k[TZJ5:,z7@e\ps=(C"؃Z_c1#u@6)Ka
    G2Me`w%#a#*L^8NXI.zfpNH+7bS
    2p
    bsxHMJFA%cIOj'#jFޚihIdLOMl""yB@T�ҵM&pLmzS;mnz\gQiA}y*bg%͠2XsdfU/{P+=Kɲ!`l5-rzUte=6onC!gó)-<)Mki
    ՒD)Eҕ*\X[m"5r/3}\z:چ7P9!bUn"[kpIMv)J*Q^O:{_]^(ey33R ")	7nEJQ�T~reZݽBg5npZ,XKP/ci
    L.ͯRS}^=F=@k-S6Q+-awV6 A0DjI'љ|8%t	Y,#hA[txtȢuT}ǷRBfEK	ŕdFfT߾uAPJHgW4~S7N&gyx"Q`kϦ�wCj~ps\UkT4@_CɼK)M&44Ue84+X<ԭ~JժKyS[}CwLPcjGli1,DbaF$pMR*fCkR2"R>䉕MQT&M-͙{_y[wɇ&F[hFroD/KƑ|O(XE
    ι7}fvzw'%[i(G$mʅP7lq\D뎩o…+Oń')4�f$ ++X|b+}삑2cuٵjMEH0{rnbZC4 Tٶ϶ABB*؊X:U$2q}D@[,/{t4r5o\uqeQ*v؞Pxb cB'\4'wqdY$JqĖBI.!%kwm%Ɣyqd6HaIFeYy=n$Y.(S%7<N{_tr[~:FNpkEg1	^!"H:"\\_jݾ~	@ 1W4K⹓!aߤ'k$҇8ȚF=0NHmDŽ.<+F[h.pӰF8t%l
    9Hmh\BH,
    =.23>c8N̙m%r3}\zFu=_q#:둝~OWuο':g_r3}\zFu=_q#:둝~OWuο':g_r3}\zFu=_q#:둝~OWuο':g_r3}\zFu=_q#:둝~OWuο':g_r3}\zFu=_q#:둝~OWuο':g_r3}\zFu=_q#:둝~OWuο':g_r3}\zFu=_q#:둝~OWuο':g_r3}\zFu=_q#:둝~OWuο':g_r3}\zFu=_q#:둝~OWuݍdmjܕboKv(ۭ)[v$8/boM;޽n뫧m�W_$=/e9oUZ4*4JfNn,qX=^ւTӨ'Fު_"8L6'bw:U1 iw>̝XY-HzխQ)pN1CԍU`DpmENuxtb@t}):Zb{Z	S#NPRbשz|03y0T&TāS2ucqd#VFF8R6U`fa.;ZoLH]3'V7KR8AqukA*dij
    \P#oUX/o&|QBꓱ;EtdlW;үd6n?N?7	qnU*[oLH]3'V7KR8AqukA*dij
    \P#oUX/o&|QBꓱ;D*4JfNn,qX=^ւTӨ'Fު_"8L6'bwQ>/MFF<e~-*L:K;p.CfH#<q.^*_6H*`	�FB0K{*RC-
    _-;:"7*4JfNn,qX=^ւTӨ'Fު_"8L6'bw:U1 iw>̝XY-HzխQ)pN1CԍU`DpmENuåS{LՍŒԎ+G]ZJu>HVGɆPNQD]4G82v,
     dӏtF*[{Jر[stjt \]BEէڄҨMvQU5];UNo�S!1�!*,lp<1Td3!m�$1fOc88"@c;gA>
    nB*0hy~#fةG%#nPPs\O`<(I-"0GITĦqh�g-Y%RΕbeookt
    V.S
    _E]E15;ŷPvG2( I -ZF.v>yp}bo $ T
    )Ň)[fLknjvzVWքdP9!\ڽxyʹ}y٥ieŊmG7֢HRq(Ӹ,NOaZihrv	SVnw<	�;")H|q3xMh-9)x{{[}* 2b%t	K
    q%ev]lsMdbLԁJҤttOfۊGX2?.?f/sh)�_"&CWжM9rc+JChB`e"W"F1Xn_*�`2{d3@Sʝkr:ukN%5 lE[܇;Z]T#I[۷4o~˛VdZH%@QxsCKWV!vGR;P<s=?5�]Pq%F?s2[|P?o;agt'.}	@rb,x_΃K鱽j&N7>q|]Z/DeϼPA8QlZŏvIs[}67D>FN7#ޛP3$H?|&*$)Jʒff&}c7;ZT a*56p}y6@HDk.$>GȯsanN"R+^i֟M+7G-opLJ~;e0R-bV&5&
    
    ]QWu:KW,B>Ќ2`UĮ/$b
    +VXָLq0YeO
    Mu7
    Pcpl(lr<]pH|'_x} EvV+N-+?9* O+T
    8ȍ@P*J\|ɢtSKmnYNclԅcX~L2`
    D'2OT
    L
    J$lR>)Cu@JPݰN67¼w?$}?}#4V$(x_fX=U?~@}+f#u%2{Ɯ_AބDcY\q?[4WٓF(b	I4O3
    7F3>A6RD+wtw=KM&wW'UHܴW)"Iޙ&"WHTYV[e^W<@+zO-H*GGDm]:EDZX8jRAR
    TC=44N*im֖)9lrPYqQاjd4H*Hȩ⒃ؚrvSfӛj7lkwrFG짗V F 88q۝	&/f4Eq|kZ2`bU҂bAVqXkʭrb
    vjLNXlnzԋNݒMĪ�9B;A{
    }4mޟR2۷*LF]:EDZX8jRAR
    TC=44N*im֖)9lrPY(#5đ?&>@7dlG:q8H3BAoFHT[ujEw(oNb$TvbˊpmV(rnNkw6طsm)oF/l_YAgN~G^B6)C>Kp.2fķb|rM4E"yRB<ޘFDz*K�JC"?:(#l6qC&I¤y:<'G8>NVձL %u3Nu9+
    6laWD2d*G=#oqz(Lh-[nWS9Qmδw[x0'̖͜`6;TB[[a(
    Vqd	~S&/J2< BWS%?qg6e,&adQ>8|-TŚIkkV
    @耇p,]z$�19JZ1AԐeXZ.kPVuu'ը9+|4AS
    a\d(fG�48-t#7
    TΖ/W~l
    d G,ЌDvؙ<'wj_z#i-}rjtH]E^=˯Qd"f9g)R+T?1RU-jJ~q.dyٳ؇}<;R[tl%aJҎ>́8rDRWgԕhKkJl4MdT$˜k
    *'{@
    .<%#] +HMG,B3mߛMsCcluq;9?Jf#\wHgy!
    zRDž	魑b q.g7ҟ7yKK/GN+ή&ڔq<#'ݍ|ٲ3eB¢>QY)H.001w{Ԧe|j@E[Y-[](F>(~GpLؖ30OIZ#2FջȤO*ZHG]ظEI`O~83OY%ץG엣iq{sWwIJ8>lseaQ`\(ì$|\mjS2ZV5 "/G5qO&2|w^L5ˌ[=GŮ]v&]!JÅ6jͦOTQwt@�auM1#^ ?;d8F-9)K$î'ZR״&AѺgrZҟ٫2<W.2(1+dj]"*VHɢAgT,	[&?H9~*ESu)fbQT݈#ėd(mx]g~nmzkzVՙ3$Ya9	0vU?gʥ.[W刕GGE	x} ˜f3gI13|TvWI$5xrD-#-!Jtu'fq3
    E3,U&ɈB+bu34wkU#VXWzś&HrQFR?c3tUg`ظuK~ /s 61P_'[.PPTaH�KE||�ɝ'0xz^LQE#[F6*Oq뮳mrHz�f	fBv*"&Q_G!N$}v4rf0w-޿ln{|$9ҾQ�E:L( '�aGl[m;DWV4dkLаpO+zWډN.Oz.\#L[CH~Jmm1RZԧ~-r3?LRr_wpb<f:K%2IN\ϡ_O"wI۫	?If1ˎ;r!]CVR�,1%r9׃QbYS,ߍÎP xȐwΪU$A,G0:`1hۣc4&gGqoz(#;ロ0~ّKkKn/<HOq
    5aJ̱NO~!#C(;6͘?D37xqK+2\sg|<|o))&ȫ\
     �eeA%
    8D69qR 4/JL(NJ<q?ͨp1$x~BAqrjJz"6i=BA$@~'2~>q6(k'&3LIFMq"U&i(W_NߕVBѴi[#GB/OͥP+t@!H'[6ƆE1&IW!2su4R-umT%Ne�28`FX˜p	jHRo2JQ*9sOvfy)p*F^,ԡk!B<yЃŔDMC	#LB�	Q46*)EoZB:el"NFXL9	pBKp1&@bq`F
    zڒeRu1,!DLPsL .}q
    = Oo"5KcQ4#'A(%w&ba򤢝F}L=FJ�ߎPtt88挱H`L~mk+ܘR2::$mLb?DYzJ<CD~GNіH숤,z5m6P%Ey"H=#pExsLjd3qj=	0",]E[6TyC"KĐnoctM8`9dF
    n&SDS)ĩkL{`ub~z>\?�)H'_V*s'l~%f*XKԡ3e	d`#ז[畀1W #uс̕bFIuxq>D%	yC,XS)gX7
    r�P*/)Ic!yω4͙~Y|nr{Fr0RD9!!g.BUe.JCPJ$}"]psf8q}ƏX4La]ގpi`3tpJp<9ĝ$41HsVV
    #X�)	1JiUf"v
    P_neEJ~QLYj}k\pG3
    b=ȝ"qIOr#*Uˊ-)2BBy>?G1�f)Mig,zB%;yGH15[G,9 Jjcxlt+n2լ%{2~� >^Ec<gX
    #eq虤\gr@
    rdZ-l=`DvB9�&',{N'")ȉdhzL#`kt~[ Z(eӘ}Е!̾KX(ڋ9~s$Q,8:B3j1J~9!^Ҥ)C\ds[ɲ|}|n1 gyaV|d`͢+D_+hOXf$,(&%ɔ
    :!{huhE
    ՀKWY-X+98b;DY27+	>X#jTʙ#0|)\ߜ 1m	KK-2
    t>g8K�� NAQK(x8L8ًj$pK+4BU`ɱ0Ř)!σ9`Sio!܌tɘ7Y&ʼ)&?CdA5fVz?ϛxĠDA<D=4s}lhk)a@~4d
    9oH=CÎh6ɀ##bFbƠ\;%1KȞ:EF1|		9&=wī}gqS+1EfZm!�%	ڲ8k̙Fu}9:L[lJw	ɘ>ZpzSx/EC`4Ydw-dJL_+fz�;u$WW2E$`7UX*K2.t
    F<& l
    H8 ܧjTI#a_)_gnrÏX?Ǟ^5Ә=93#Վ8 �-eoOHYس}kRDz
    aEj!Xj{hbXqV̡8ˑkťya
    "PqLYFIdȗAbFqӥxe7'Fp @2urhu^-K<ReC&t@dwҪyPA+sn
    HD^?HxӴؐ-0Gy佡6'9˜>$g4Lj[IWM}hx
    ԆD,#ք"rܵlp :nCGVSd#!R;ǂInjqHvymqN>vX}L%nJ3YB$SG'	-SǬ-!	ڷG"u<Za<'&<$MPi!P/GT}m�d;,xC<�Jc%@F+_Z#WHiq2w!:{}:;sjKK #X[(#jhx;f`iZ(ʖLLk/6'ܱL8WA&Y b\9#ccf0#A FPJLcM[=-.cj*I.D̰$k	 ){)vy,Pg:HH 0Av!&%Z%\'0BB{qq1pt7ِF2X 59>\cm]J`l*3$8##9+d;?8_6Aɩ)苈%6{0d ccV"<Mbf	CE3N2d7tO"-ɳ(Ն$l
    -0 =NOh~_+db&h3nk$ksYbƀkP0͍8!z|N8`cGC^~1Gp )cU,߁ 0$dz>9ofxce(!m=Neueƣ4?`{$t	˲}!dr_"q$52JӔf":BF["]u/uvcGf!q6`@zAш~$Rq.2r3asRL\!,Q-Ja*rqt&街v\_bK8_f8w&C(]gQQ?H<�~Lv>۴k=#Ō"
    #_|H\y<4=*yv(K]2K"6e3A=H >mG3{)A#	GrYCo0Ia#'�&H/ ׻d4tXYtr|<\z&i2,Gܐ\#Vd[X@4II�KӾIȵr"Y#%ޓX]#Ytt%Hb#/
    *l729Fex*z$9ھER@zv״$zgP*0&lqr}aGvżc3hJ>t%E4	q2e_Zdp~0f5`p$KV7N',!G
    ybed}u=v!ڕ2H.> dW7(93bnbRfLe]86(h}@TjF*$1415tO�eѧ�A?WBd_$=/e9a3\KߦUwjFtXr۫nWkIÂkIÂkIÂkIÂkIÂkIÂkIÂkIÂkIÂkIÂkIÂkIÂkIÂkIÂkIÂkIÂkIÂkIÂkIÂjQk#vQѲ
    |
    
    
    9b[WT/dmbNeSkv6zo\{%.]߫n7޹OĜ8&OĜ8&OĜ8&OĜ8&OĜ8&"Oi/':+GBGW 9LZu6mĎWgk^wn٪))8ܖA(VyJs![*qIDcDc
    Z>֦3ǻwXm�v bb"q)'~HcMPk!iDf	Qa
    Tr8pMr8pMr8pMr8pMr8pMr8pMr8pMr8pMr8pMr8pMr8pMr8pMr8pMr8pMr8pML[=TPl}xrp\Х6+nv>׶j))))))))))))))))$
    $3 $E%'g4tNP81{I{%	F#k]ԝm
    (	?Hi_'wrSSĔZ%N5OK뵺r8pMr8pMr8pMr8pMr8pMr8pMr8pM!J$#wKdP89aqL;kGxvf-JѤjm=!~Ȝ~<Jg)I#bߺ4S46T>8ZQ)qvTXB2{\NRG$NjoV=/ϋ‡=o.pdnH[sw{ԯ{jS{IÂkIÂjdufPڑ~|N׳ZD'	I]$^QٽyuNIÂkIÂkIÂi`6D>MYyKE"n.R11>D}
    4ê_]Pg*
    		8*&*8ܙxhhyCB;)Q"KfdQjM4~$5~$5~$5~$5~$5~$5~$5~$5~$5~$5~$5~$5~$5~$5=I1‰)nL	%)It>Ih"}D^@BQ,behlx35'FB$OEܔpdq%jon)SS:nrN\N\N\NG*$
    )R̀;0; $ceG$oyGJT9Dmj[~$5~$5~$5~$5~$5~$5~$5~$5~$5~$5~$5~$5~$5~$5~$5~$5~$5~$5~$5~$5~$5~$5~$5~$5~$5~$5~$5~$5~$5
    [Fڔ+)$xeDAreԴ+iuJwMw\]^mDlf56aȬk\My]b<蜒q	2p BB~%L,-[}4͕2G;x20SʗQ=&c	'[mqI,ZybV2޾F3Уl]+̩!)7/2TpIg	u~m$VXՌwL([4WC*AHyC
    <m̩~!#f80ugbg-c!oq=
    8/U>Tx?RC*8Gpa3m?	6Œ+T,[jC;zq-^u|]d�tmqY
    S4St>l ۾8xFTx?RC*8Gpa3m?	6Œ+T,[jC;zq-^uy <!6Tʎ3L:nMd3ڱB7鞅Kfq]}Xz	;}3�?O0(".is3!ڦ|@3C{|qKJ\@ؤ&F(RN#A
    V!d`4)<0{\j~"
    f&&GSMHU#Xʒ$ժލ&ry]b<蜒q	2p BB~%L,-[}4͕2G;xo+lG4N3C3X&NHH\?<w$eūo8ƃ9Hu/X_NT6;$"5V:,b*HS;\H(lkVz6
    v8
    rI~fk�$[	;g2̰8mr6T.^NEL:c6,ȩ˚|烌Fv{6}RRK�SmS<p$r
    d́)ȈL#XXP@eqs&2*\i'H¸swލ8ySCr,|NN)\'
    |:Nn *@dtof&
    &ؤՌҴ6KfK/r?j
    ia5$xzV34XZR%k?7jGE.PA!^>sh]#q
    
    bgv!u| "V*[lv	%IolrjL#i0-arTa5W]+s+	1|YϾ%J%(|fc U
    H/7[dZZjCDrZv+.X?@GJ6W|+zbm:~
    G)y-K^n.8%`(buS0^6Fr4h
    {F#VйuqLTܥ	NiwGKds-cb	ɖ5p4@8G`vJijfAb%WJ8yҟ9N~z~ў9_G_eFi}3�la/s{'Y.RaDXdN33e$ƖI,8
    *b;5RnU8@-1CB9aRM W
    5MT^V aׅrl6t-RL蕖c4tyA:aa.	RlAp`ӵZQdvЉIůnX+9f(\؆MX(7uG*V|lrq-+sT
    pQ,cyS-;r{zUcZqb3FʄỌ
    HȕP0NDT'[,HƁRF>vZ_ߥQ.e#s4A@)SBx5�FDKw!A7x9bDr$2'0}&nc;L>\zL;5gƚ#wT%qll7aL2&6_LJiz
    /)cz$qV9iB8&aV�<uˍG.2iͼ:!~VMd2TdDH^]-^}d,i4q/\d	9
    3ove`Ebp6,ZXc|YX픷o\"c�?G2/�W��?�zth<[DD$cCT>qtc:9�Ve&&tAqRZw)xI1a_+eOJv^NW4D".y&;]hp<j8ٷ7s,bV'xT\5~rPrXl.b3jLTba}q3D*)@@MqtL20& ]cW
    L$z
    >Wdm"Uy}3O2e*6e|lȎQLՐ-Gn.Y'p$Z.Ecv]c	N戄W3$s뵑CPMN�U6eJ
    <%
    JYA#I\<o`Vi%"!	B)E)0$/[؜_(qhfbn
    F"xBj(\^@Ǒiiu0VI?C&T+z9PDQ=Io/1T]VdTc'q)g
    !PP>T;hPwckSydDg)$W#N 
    )lRTʹ{[k	m\GJM"
    O+#9M#1=2)
    )K�6|$t#feVJ(p;b/xVaC$ Rdg&ņaC!dO!jc+
    ^8ҭb틗zV攄ՉO>ō&9<t^}Wib@gt^~|l;޿a.k"BgϏäa삀VJ'<K
    *7H$|1nBH&\~b\Sv8?NDfEbBJdU>;g2Ѽ}lijW}*W۠ q>bbr$z$BLq&eprt/6$daY+C)�Em. eJZ:Zcl8(%Ft`ʇdMc)ҵ!}jgsq
    =1$49\}2$4xG,3m1=jp\">o*:r-?Unc4ɑo$Y藎;rWr'Y]r-s|)&L1T)ucH8kӮJݸJ!'bTֿ{hhw&&JXs˨8xPD5;d`ccDEv[Z+ꯨz?3r%͙y�T(?ݼl?X@qcV=GBr|~I2?pIF]1jmq�E}s:>osyntMPnra	q6?e-fHr0ڲ.n*U-<C<)
    L29yA50&WLFVB5eÝ\T
    Ǘ(y}^!55I-fN[P=bhVPLpu"R%#I4\n,7ޤj}Agr68*^%!܊*6u椽vUW޹=BcX�d^ɐ8LuhA4(rrً+T,i**VZ\}R1�p'5SI1A1;d8,B3SkkT[Cy4Umw�,_F眰M*i@ʗcHw"#ʍjx/~+UOaGX.V<,jkd}ZM#J7ܵ;vbJp5WThM`m7
    bCgiisᓖ/X.5S,56HIHpM/(A
    bq~?8`üb9>&(& lhX&wjmbmj?~uBo7Tfi/�ci9:	O�I(alM^NRg\1,T~U_!kl-NMJT'5XD>3H͈ň>2L҂rli6.Ve/z)
    נF+җS	;m9utrkT,GFѦs.2?mtt?qjǨTт3rNO/&CT9(+F-M gB]RՍo-BZNj܉|f%iś&0}djl\~ˮ_EeR)AW9/INvri֩.XZm9L<<0]eW~'c,;Nj,bbvpX+gv&֩뎷T)PuMVhێ_?K=&|h#O"Xv˔~l&cNDH
    Ӌefi־-8:Gy3u{$!/a3G"Xpyb۸b쵝%ǰQ9X
    Vn@_&X12_gSnSwFnM6mΪB &e fyOhL"!9dz3C(fLnmJ+V|D\z[Ib+p_&x8t<u|lg&%b!Ak_'~i#a晃
    �ᥨ$PH0$k1.aet)`4e[ZC.-([{evw$a^)'X GbC28͍l;MAod/ n}:{�I/JUc쁏f~z7RWhY~SɜlV45Jyk)C,Qd
     >8ˊ E}b.md<{rA&~\Ž]2},!4?$aɅV:"aN [DNbыmVNvSԞM軣}2b.TmdistjɬYjKG|G2Id;1Deʐ̙G(!z5�T+6-ZNe/ʫ[14G8T~n
    4Ix%lk
    ,wr5ťYi Lqv̖MCYks0fa"Х*J0LF
    T~ԝ@bЭ]7V#TAlh^l*:XfQV9Krr+7ukv'Gua^brľlӁkޞy%ꦤl7qCNc+[1`B)8\JiLƜ˼qX
    }wd)ZǻYz5H۸n!t|Hg+Ry	317[31x9V ZBUNmn�U,ZXB?3d)Nif)8)g&6PCS{XW'FWֆrL8,B&Q?}lydiF11s~}:;OCfdܥ;(™Cs7	fy;2޽!e*3bģ
    _bqU:C6Rgmܹ
    �?ڈpWv_]	1~g`:s2;_9sdvh5p|5OH;FffF~gl
    j(}mjE
    W\lz:IF6,tOŊ=G9o1U]*V_"bKt	kڌ5?	O�zDpd�J�DFmЬU0O'WsMl~@m(JEqIi&m
    ?0:F2<ef+K40AgȞa$=3PPՇ瘟eV]tOBСT@Ny+ŌI#zQX*Azpc&"t&6fHIn=dۛ(0l/*F2OvԅE+S/g{Trį9#X/r
    ({'#ѻ~@SDӅ]WV(GOa 磙3~Ĭ%P8pS�-Sy>+xXi2k V(2X˜.
    e(d$0¤Om8B.%5rb5BС[[GqnX*5HF.śVW8u%sR=+V*/`I<Z&	_r=9,NJg]9$G'x�mO	ݏqkƥ7Q#6feIg#+R)0=
    	A1<ٍvdM|3gOq]ntY|bp|{.BcE$*Ƀ/p7H-*bqn$:6Vij"qLmolΦ\3XcCn;"H1Lfn-aJem#jb[6ݾ�EN?k,X	Hd8j5j
    }RՏMZlu#OJMݛz8BXιE-d]rL&F9+2G5PpLv2Oi耂"VW%OtQxўHq%t0HрGD20E9e[iڲdꚗZzgʵ96]9U c,lC8W1o/
    JR<`y,=:c§蓨hgʦePVO&PJݠbiL%L{6AaGcxptcfym(ꭋ1qa@Ѿ6:j'5˔OG8vpfz
    |bSM(]Vd֡Ufl=gGICyH.-4%?:1l0h[v{}}=_z?3r%͙vk(?ݼl
    \"X5«]KT5ܦtoԮ[z_g\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/R+è598qӳg B>cW'uC'UnmX)vK]j-(Ktmɞ:ɞ:ɞ:ɞ:ɞ:r6ss3rvww+jY$i.\hxc:νO6(3\8^3\8^3\8^3\8^3\8^3\8^94# ,V4MrR"S+&@l8슪RBE[Qby3\8^3\8^3\8^<, HJMrҦ`PQ˝@hlFҊR:D\Q~պ3\8^3\8^3\8^3\8^3\8^3\8^3\8^3\8^Dc_iEowܕض:p]EM2]V>ϿwjnLLLLTcꍇƋCm|Tı8zӥNcO[߳BeYWڱ]uQMLLLLLLS1𰐱mDG:#hbbhGyRժZL5ݮ)3\8^3\8^3\8^3\8^3\8^3\8^<, HJMrҦ`PQ˝@hlFҊR:D\Q~պβ.^bmf3\7.nuxB4BtJаcCV[R߻MfTgprgprgprgprgprgprgpF faBpt,
    KT85RXԗtMVUKK]g^5gp8c-$
    aI`nTm*Bi6*z6,v6pzpzpz,gs}w L&tMYRQEP_R8@$ѝ%S[S5tѺuV.Wɞ:ɞ:
    }Qarbm1
    83Ztݬ|	+bhLK*V+j)X<>@L魘gGGItpPI;ŴK)djt\<uÅ<uÅ<uÅ<uÅ<uÅ#a_*b4q,g%ySXcVŷЙzUW]hSo<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ)aqs;smfpw+@hGr޽^ک`O~mѶ�ͯ荒_ٞ_FL7*?-lo&<k8bi;9tstʩ5u) )W!,Z;	6>8a^IR`w>2q$q/IC8:<XNIS@-%ZLح=q)1d&�|蠍'RGd9H8N[yx͊l;ݧ4	0EƷh1W2~"n"lX!'F7ZY&V$0{
    cw 0pz=qQxR1@;';t*u}䲛v%iٷ	1Iy !ֆC)9;H)VQ:AiܣoKݓiX<@KﱦW2遊;=ٯǭpѥ} ҪC2(cR@},/EƔkc-cw 0pz=qQxR1@;';t*u}䲛v%iٷ	1Iy !ֆC)9;H)VQ:AiܣoKݓiX<@KﱦWC'G|&ޱ \dzd-b=jqd[LH:X(FQP01Gg>}c54UHfX{bc# JHϽhҍu,{;A`8Y cD+%W72%gilYcTvjq%$"ΰ'hy}ѡaKI\XGi%VMcBY6,XRG'}͜7qq,S*d`|pC
    �vIJV;Izlo&<k8bi;9tstʩ5u) )W!,Z;	6>8aQ;C:\J8+H*"mhD_6Jqb֚p},6898o&>lEӋ_bP\ \|n;MTH5ЖFQP01Gg>}c54UHfX{bc# JHϽhҍu,{;D*�.�x%y?DG-CYhrU
    KGawKPըQ".lEnEF/(5RW�{Gt脵�$[!qS]V
    K:dhٺgscG.�e�D{WB` q\)F, Q7-*Pj*
    0vIҔw6
    b 6|dq�=0S@)LS7>KH
    nmt5O.kЏ&l&_☰!/Ƃ5^PGlIX6knbP}27N%::%	y,11,ynnRBJJBCB;ʖUzdWvtMUmU@t*&'NخfHR["f/R1}joS(:\jZHRϧ||piJx*MrlEGy_b�nLb5*{=Q<x0@O})!Q|zEo^:R8ܦL?s?+2
    ir;dU?IX6':&&DqTW+rT{r]ݸ9w#[{bk4Ꚍ><g�i�c~E��ߥ�'X�j�Mc'/G$Ӝ鱐Bbqj LaM0Rʞh9F5f"Dֱz[tu!Bc`YIjeDy=4ck+襤xgi7FLlm;LĔT鐩*	c<_'V-c~w7f`:ivs9@D�Sc3nA
    g�
    &?
    jtI=\
    $?иXs:CUqo_#I�q[*cřTtǑ97iIY	jD]٫k٘12,L 68;
    ٟ7kje,JU+G9P78:Kr$Y.8�L[Twї	�҇)R3z6WvKd�*̄7}8 #f�FR-88tv&&_t$BwVMD+ڭf4x3)G6+X3
    dɗx$A,3r8@>o)zLdnr,z)jM߷vKYD4G@FU@9F:6ҩDh\owdsQ'^lwp(&X1��Il>M)ndAX:TG'rm]-\qi}ʯ>M)	 `N#s\r!$,
    IMƃr͇F c&j(L%xm
    f"Ks	aR*O95;0F7cJTH^m9WZnJG;l\OEF<zkKE/-0 6%Db~nzٕxcmvX.y@׏h�ewCˬci8CPK]' K^ZI]lGdv IhpG94E`tYG2n%z/4ej@Kb^
    
    \{Dw9N	QMك
    lb>JJ,X5t>?FKn*dsbK	ר{wK^0e$Mwɥ⠢bx/i#oh`S?.Gs͡K‘&%YX/{HG@CQBG-Ejr9}d@dQ&6h$4 MNa}ݱz&܊ c2@B1:%C ~L3^5#C1Gqc\$sꘕ*3-#`	.6K+HJ.$5<:
    4G.ێR]uɒˌA1 ӌm2bcANSÄo1vOHٲbwT'ݓvKGDpŸ~^hȰ!	(3
    x3!W3~ga#\\1HxQ4lB@ud
    �]v~�)~!L< T݊l] ]cؙ4J/ȵ'PUۀw2\}o0*
    LR`a_'
    x,<oĐq=G&ec%/ze2ۣrLo~<	5a,\MN53yvos9gD�V]%~-x$}jTˈ"Ll>6Jу[a"4e,X|D݈K2܈ߝt|.B>t,Bs
    eR󌗂%ZI+;c#$41FRu-mӥNe6C;>0>-AvJB23M
    f62$̃&xm&ZSgN
    PHq2`z<8<!hLRbzԆQ+T˃(0["1f`O<Ǹn:	̊yǹ4<qFR{?Zqn@el5,A-o	˭tƁtJBtT5#ٗdaÂ':U&X\t]rfFbf?M�,W"(H%)1tuesdu :ͳA!S
    V9+Wy":1<rVѩ
    $(
    E+1+0M
    *eGnZo5	ը
    IH<;ӄ8ZQgLɚԥ #	Rə]U'pP:[&ky�cGʙ!cFhe;�L߄L*7H'6ф U[cBkL1B!E@cxVV
    d7zk8 L
    rNY%ى Lu%)ɨ^-`v 
    tJ\jqXU�2~4,6F8Su=e]㤰?*7Br�CK>tjj�*˹\s6ڨG[ͷv gc⎕$'fh�gs)a)>NҜcl6%.D#vrgVub]^};	ldXפY9ZfHcߥT0zF*gٹoJ`]B8~66%i*4Zq|V7cdLʓ4պXה'PCBFgIvP'#+;8~#I"@/0bm	!Hkl3tUA<k[�(C,wYkK)$j+0N8%!I92Q 7R/)M%x+	+(,%kQV\R`HamP"Z2Aիh2;W)'cb`0OqŐ6VlH D(yaZ^LEԙg̱Udl	?ÆbW)Fp.dq;.BDJP=izLH4H6jt񬱓lZY
    Əʱ.){юkI4}>HL3n_dXp�Ӑ?8�N
    ZX
    %1fsEUtum)=j I%46I̜cdͷ\SS)r2̰,`}f8_b2_By	2hE
    KGZv4r=*484|(2c1Wҫ
    ɭ<;z&OJP&W\�ʫ!2Xͯ荒_ٞn⎦L7*?-U5^y5?^	`d$~G 1c|XV#PSEK)fT8Ptr
    WD^FƧB!9;RHM	fbG!;뽥2q9j8."NBrv@#y8͔ďCJw{Kc
    LBAQ`p	3RUa}x g)oeQIi[+Ґ6]or[iU vw>0 ܧ-GzWЈNN=S`BDo'=iNih-^vmL[Nv5xNc!$R)5Q(x[ SӦT8Ptr
    WD^FƧB!9;RHM	fbG!;뽥l@F! 8j*><Jy32|R($Hq
    .uQJ$W[~=S&_8{^.bgXIJM~dTGJ=Vu:ʡ҆V_P8 45:	}GlH6S>'
    )]-t\$
    8%y孠~Wqji77Jc*;;JNnSY~=@+XD''a
    I!"7LH4}wT]{ >-x%/@XR͍R>Sb	XBN),O(ڍ) ,I+=b¡*IC,gykh=Um/ZFm=.Mҷʡ҆V_P8 45:	}GlH6S>'
    )]-eؿs/=Ư1	3d$@Z%&2*#bsy]jzfOTQw?L+d>I,y11e9KB"WW+ytP+AL&A䲜p&�B|.1ٱ?HZZV;(jJ؝OjH`̒@mlA�U_p	bl$'HWn.jЪiB2]kΌMVcJQH[ԄCrD&;DCy0k$ʥLQl!357WRWӹ�s7nnjկVEU
    �m;BI2"#@dsqMDr8|Zw!Ej؜zuIvځY{�wx%iqΡ *׸4FNR7z7Wud5JPV?92eUo9-)(H# ĥ/";3j*Gl/JՋ;;c,"q*ʑF	Y|11m$Jw+N@"w"-5]ls"aFpU:{ZN,'pQw7'zZꦷ?ʼBh2
    G$(P؜/E.WBi=be%>#R%bě1bb)QmR	.j֍|N}m#IeA-,/ Gd~?|o?$v5lأ`h-	c(ъ%shxXꭵZUnwXoi`_,*Ay\PTT+[*U.M0IZŤ-TVNN&R0Rt*gTڊlrwX}p|eݱ"
    	td	:@"ȭ⃸0f}SazA.GkFB	<;ZZ,E/ 5E[Kx�`D'KTZ?)FXHHkr@,)~WSߞ/-ǃɂ`ew8|:^WCFN;?ǪM0ARҞK
    KU֛?U;~UZ?oL֒@^$ JMil,Ư@oAjZũR=%P4赲*K88D˄KA$�Bt/clG[9+H"u<2'dyʌ#c d9M6@Em"�뱐KmMxu,q�*3eFGEy+6d܋$SpsړWK`H
    MK%2wS^�e74cP_f4
    ⣍i
     :ArU>	geBBdZrTUlFA~Q}(&a225,%*#z%l	 c?kD,
    HCG[qmK߫]dR 8Ӭ
    }2|NzȮ=:f|3rK9d4ekQz}o!b4Ř5Tͼj=Pь()
    *a|Lm;s0}dfۀD6nmqjK@ˌ
    
    	
    N#2"e&\^%"2}gpИ0dv4b<]ln~9 qgK}?'cҟ79/}O[o<Gf/@f�LiPxNUp5s㋑h>lcLc0K4HO/>z2ol#Vu>Bpt>H
    A<[q$5b*XMV-+wGgsW"U=S-_D)2=_dd<qTXbnjB6PIjЀͪsm#hQ$I@7Hd;^;.,)(<KU+{qJuj\ku(Ӑ}=}rfkq3Nk+?19Vl1Sa+"4�	�X`os_5@@L͜K;!c;$DR!%d,m
    $K	ޕ^TwM9�3!(|I	;띠̝fB�vWkqR\⨶1nIudN_g;^FlLcuɛ11>:3&js^Cd�H�DD`,:T%-XamKK1_&wPpJA|}ktSH\TTW7�A;6;KV]L3}U_]VII"
    79=&)`"Jh5X3j|
    ג2:IQn3H
    (mH6F'k
    -}" )+2V:7.Mr-lBXL.&(#h,+bJ͏\?W;<*%kwo[jn*|ACE�vomt}tTV{|X ]K݉T:\jŪbYdhSP4\'3$ _{sd؍
    7lO.+u-2q9j8."NBrv@#y8͔ďCJw{Kd(fk }ear�8
    bғ,(kvDgv}
    )D	2N@a)HSAKe1pLA|rYs$ɹsqnZ{*!@3YS+(ĐUe]Ņ!fGX$6S;_P޶U)OtkdkE$beF `ley@HU	(XǮ$f۫
    (;/~<ӒY9a{xby%2i_̹$ ܥ4=Zr�.Lo4�9O'UkyKƭ"&Dl%4qlz~b'�~:j}Z⓾Qr2<_f4j*&@ͬ|<>
    4D;@Qk,)&CnAZ!	ͫ ,3ic[)O0La<*EtᏑ4 +d]Q
    kW_e2*I+CdَR39G\+K-cąIGFV[Ji/+jn)3S#@/9aX
    a4æ @c'DM`gM$B
    (ӷ[HefB4>˔o[qШ? Dg0|f *E*Bn'zӋG}xb�b(4'~,xzS}5#LNwĎ|/D^&]hzǤH	#Z֐4DZgX[hexpH�ne0bd @œd*MkQ_cɃ0Y~6{3n
    deIt	!&Gw$v!tu!eͱBU_O#n])wEiRe
    JWHr8}q$}֭e-9Ii Q4HhŚ66N/
    3[k~C*y02"')IHzK/۔=Zu3g8@e1>Y >,8wc	B2TEi�K5$(D\Ԑ,hfkVXXTzT3Z$GO$fƄ%\TZj/r_TUwd&OK3Px?7{5QtzjEn.WVt=FRFSBqJ814;mu8}ԡ6-*QνE¥i'7څ)?&	pbiv7a#ZpKCbm6ZTe)mz[WJOLoD"R	~M*PPnFRۤlFR:7
    22jD0T&݄kk.
    HiR8u-m_)n+OQ<de1-H'a4MCMC	S]Jnҥ(qKoZڱfV&GSM\	F*HS;\H(lkVz69Oě&pZz#)hJA8	BjjHֶ>P؛t(C[}g^RFSBqJ814;mu8}ԡ6-*QνE?oi~5bdu8}P,} dk(0h{ĉ)Ƶjk	\;\	zC;|sL-jAud_vwa_YWSIj7
    22jD0T&݄kk.
    HiR8u-m\n+OQ<de1-H'a4MCMC	S]Jnҥ(qKoZھS&	*Vxc}Z!N#iP&cv56&#eJ6PYרb/ƬL$"5V:,eT>
    vv%7P֭Vma5==w8y3r.iVGAy=¢5u(Jn\š{v;}[_wSs~oZe|M;.3/c
    9Djg4lBOlQ"H)]�Ҩ�QؗffGunZKx
    ~OxYIcYً77ȖP[k"diդpw6W4;ײŅeĖ2DJH7r? Irk}nqT&Q+"Xk,@[†[	)}FY<-g2EN͎NJEJZJBNJZV@>SsTOnHBײ%`Zmwm輈FoxGE%mbѵ5U^+}V.DX)K{#z5BHo&MU)P.spQ~ubT)1i/X?�YWvQ8ߔRU"B6Kwnl}]xo+K`P؞C
    �,9P\u15^g|-^(+FX:̖�B@4B^nb7׃R7Ӫ{eTf{
    WYf`6bs/1W#eÀ&kSɭ)"twXq!ceRwJH8xCx=Q"LL =GELï'bRe)G)yOě&Z#$wIJVoqB9"E02R'mm)`M͗<YC
    j-_uK;CQMdM,"V`}M+Z5Z۽_))гK#`uCHU#YE$Cݝ$IM65UXMzM\MN1o51CyBat;%+j˼ڑ[u$Y޽l߸DjjjRZZR||d\d}C	]RZOj+wgv/X]њPہJ71fY}L>[([.|Ckor~$5~$5!XٮZ}z/"o/
    ovKWwnmWYM4ӍkJr?�/9Gz@:
    aa.joʺ
    P<-m?o?o)F}0vg{A7\)ꑉ#ږ[ޓ3ή崕VzS&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	w_qS~m� KH,vnv4UQ^}誺j^mDlf56�aȬk\M+|m,#5r,a3S�;# Ԗq*u& 1eDcⰑ{)6LNm&.0?0(L2
    `bk㣖-(.eR}tC&!,背`\V!woe&ɉ͵äݥ%	fYalM|trӓť̶Onv|.y>2cD8I6J؏
    10Ưιpi
    ̯
    CqŎ-TNlZP^w[&&}2nJI,S_{ܽZ[%HdΆXj
    D<m&Q�ĽNG-G([WQxDY.bq>'ԿR]Ll} 
    tTRj:Q&+SjrSwq<8ż*:_͝{+Ju`d/&M	\%Jk{KcV`V	Ly
    Ah獽>?8z>)ҙEs(bJ;W|.y>2cD8I6J؏
    10Ưιpi
    ̯
    5ѫ%R.'5:@ˢ�I0\ZY*$ݞjmY_rw
    
    k,9>ə&Yi/M6ǼϝejLVd/bU
    \b,x;pm`~Fr+ӽʙ]_]xi`O4553uH!"f18L8N�?*9G|>plļB&$'##hh@*VdJu6p?¹^go2|m-3\"3> 8L�
    #묽,:
    IjxBRb
    +0\K"ǃn�	Gg"ލ;ܩ׊tO]SS=T(c9#ӞowK)[bLr2=Vf
    ҥ`/I_CmY.bq>'ԿR]Ll} 
    tTRj:Q&+SjrS?2.9i�Ii"vXߣJdFǩ=f;:@d#Dk,)b
    DݞUvvJkaD#]zQfnj<]tl7w{dLcҭ*wr}O<m跐dHn/|%q1rc#yesE}Lx`>ڳq[$_Ҿ59lYg6@,<R(|\3+(0  2'qW>}@ĕ]/qD[l_(#Q�'cXa5WkbG!}{T2'Jus[ك
    �dd		Hg{F2[a M4Fhe.ФRŤ6ֹZD(L}>bT@?m\e<i4k`\XG_z7_MqRoMOO2fb�F#/nѻ<y̠31e֜6<FC]+6uDF[lɸLQm\2~,yNR0RȌٰe;ŏiPNvs:Ìmi+-Lr*
    \[<_.�Sf9ιڶ]f{d#'l[&p榛K"ݪ `L;s6LF#k30lo,Yrr73"r܅bqb'jiliRDu�㬀
    #MzWQFѾ&lD619
    dً-*nTF=\K9n,Ɏv(r[>胖efاlDjU$ONbŎ`HYYnl~eKAØ?t}b|洤3JJY12=�a`UߍY/Y,uxzn^@asK/g	oMJ%Q|F[ʹ6߬?IeNIeN>Ɍy~*`cOvqh54nH6F&
    6L-ǀҾE$>f8mx$P쎏#,W)[Hnp1Kn-uKfZ.\S""Y6|߳Gt%J!1*Zu4,hgyAlzؘ/8'2r3�r51>ʡ2!RbH$qL=%TUD2u6JGaRޣ9GAPC8c}ӟd6ǴAxumyAŘ,lw=�	)i:ܳdy蠗dth.l^,[$zn	9*tV7'Ƒf]9,H9I¸kP'H&HN,7?\R8NVF-^zCe,QzP,~qF;O=eFS dǞGSKhekZNxaZgbZI͢Eo-G1>ORz4q{CcG\/Y6�2`G`x`3]_f͠ݾ'o 8zfJ,X#p;dW?$s,Ih}٬J{X%N|)8f+.6b̌&$G/E\]dj§$'!m	&nr!":$FB[b2##L؜\wh}_(/L=&EobXHE�,SsTAH&lS:Ybqst%7O/^WT-3NQIe$f"'q\m)=N@`{R8}{\#pU�PfF/l_˿SFL*%VۇcR+޺]}=g[{ozƼ):ޯšz
    j):ޯšz
    j):ޯšz
    j):ޯšz
    j):ޯšzb#;e
    YXuM҉5Kw}ڦ42,~TwnĖŊmFZU
    j):ޯšz
    jNv9K$訸g:"_ԧoxSWoWuM]_ׅ5v|^xSWoWuM]_ׅ5v|Jf($e߁C(U<E &: <)IZ2GW}js\-kuƍCQN#GpD ¬n�15X+U)WܹUUM]_ׅ5v|^xSWoWuM]_ׅ5v|^xSWoWuM]_ԌCn2jP8_S[EEl6=[7<]
    *賽5mRV.S5v|^)|1G~ȡTA2e%hv&Gϲ]jG]:]p;7
    G8 i
    Tb|T]޻rUW5v|^xSWoWuM]_ׅ5v|^xSWoWuM]_ׅ5v|^xSWoWuM]_ׅ5v|^xSWoWuM]_ׅ5v|^xSWoWuM]_ׅ5v|^xSWoWuM]_ׅ5v|^xSWoWuM]_ׅ5v|^xSWoWuM]_ׅ5v|^xSWoWuM]_ׅ5v|^xSWoWuM]_ׅ5v|^xSWoWuM]_ׅ5v|^xSWoWuM]_ׅ5v|^xSWoWuM]_ׅ5v|^xSWoWuM]_ׅ5v|^xSWoWuM]_ׅ5v|^xSWoWuM]_ׅ5v|^xSWoWuM]_ׅ5v|^xSWoWuM]_ׅ5v|^xSWoWuM]_ׅ5v|^xSWoWuM]_ׅ5v|^xSWoWuxKme)8_1ӳ{{.{]NJW~yK3Px?�%QEN$v@Q~^fKQf<DM<|@5uxOg!A6lnkZ[7G-==ƓCQ8Ρ\ZLJ)<'$}rh@f9m*B̖KǞICh!gP-c󌔅fHRzlv>4 tfxќathBKq!CFEdp3WJB3I$)B=6;\:Y<h|[m0n4Ps%]=ƓCQ8Ρ\ZLJ)<'$}rh@f9m*B̖qG&J=CiK8Lj,W17CH.
    O#{^e(KEI^<LD9dVOG:qkd,4B#cɡ3ƌŶE
    2Xu/{&	
    2+'qB2RyNI!JЁ͙FsiUq,:z`Y"d+49!(oDƮst8j7[R]L\*&94Q} z	fw?6.Nڑ[w<0lx;<A�sGz}-E4�G	?G_]ٱjlyMdek�cDʞdWYG$!
    }vr[$fueqr֝I9|>`@xxS̀j##ᯮCqkdlnln<ZzǬc!H(@>
    HJ!Q,1y\! 7<Z0yWS=-/'?%RE;cP\>~|d7̌4fq
    29NAch~Ѷ9Z{ @`fuiZ\8-@ю RŲ<)Mp42'ҚqE-ynBTAdphYl;c 8	E'.?"pZhU&mQ6͋t./r؂CZ?e|OqX<5M=;w%DLа8ؕϭ48<.�a�*g;;@}2R$~eIe#!kqK	fU
    �mdnNG=CZAq[EcEFgMQKI,ZmT}2[i(=cQApRm$@yibI"*7K<cŗpr
    8N$RRUGmN~T6),,#*ā8xaq7T"uN[:%~՘}	8OcI*A)!R]�_FF<,858w)(Hh*|<`ܠrPq=qrVhmC
    (G)LT2TweYcYvpi8d:GʥªGGޚH)w,jK&*%Qfr/.6vJX5ϱLVT*՝	+xcK[nI)G~5]қr
    a�H$}XUEG&_ 4LFq(wRmzzsktKcI2GNg~o󧏽:w�DIw/n']:kFXZE?=A×K%Vhr?CSힾ˶XX-sʱ4Ca!k-g1m)\m_f?BN9GXsʃJrhzA@$Ѩ=,wN,N/znBx1`D�*RJ#VG@ViBVt^$U2cy+<L2f=a:;ivR<l	]2GC`bu4:\F}?PA0	!2լ)h9"goʫG!
    c2cɂ).1<gS<50d)+%G	HxH#
    ֱ5+HkmCvDj:,1̓(0d-Q>W+K+E֬ƛt;70pf"K+1?du"pX3c.H-]2ЧXF&Ezʪxn/?BOy1HEfrgQ$TF;2	D_f!)Q:IAr^*q+cy٪͚mGL>�	-XZXT+n'KD)^GEU?"xK:j4oZ)4d?G1H[9ߛ7}Gb
    ε4�F0bkY?Xfn@]P3W; \V⻍̊^%Xi>Adc,ÎgؤH)'q	g%G]ĨVYJZViŬ-lt2GKݝKDR #1w5ZSnU/om=ڨ"bTِEde�g,q+Yc@\?$S†.6Y]t4[CrYӛ-e7K$:Ξ>wq'1wd{�c HPV8TFSyLqbŜ#U)F4$\
    (\\o\(gvwX9?TeŹ"Dk8\:;ٟآ m"J5	u΄*\¢IU0)4U>da5ILGcOd
    L>@SX$)[!B;͟EW�hٿwڟO{>_�ٗ\'~?
    T=74?jVAT8y8Gr.ZM	g$ڗu԰ #aAΏ@9`2`IT<G`�`&#Xmw)qeh&:,	FH; d~CZ-rw7z8zR'i_qw)8"!P Nf$zᇧGp"
    RE;lWkަ_EÈWXXyй0btkWjbWv=fG_OVE
    #(>Qܖ"H@"6	kZ8B^2Yn)%waH%&2/Kr)t
    E^#Xs!A$.V׷䊛;�AYyJDfg]sU�$.%E.۷ƖYӄ>`Ci,-eY`iRBRaI[Z
    vGU5ﲫׅIȃUYaItGEC	9tQI2h
    q
    	7QG-Ԁ5^)K2�ȶ͞D3I
    l#ͷzF,bV?^
    k(Cάg-, <s7J!w�5q	Um8	cf?d<ΙU"tˉVa[KFc̊5}%z%Tj4WD83#^m(&(;3,Y"ő|&*J~Qchʃ<3
    %nTTҥ$cUwd&OK3Px?�%QEL1;Q\6OnDeMJjo<Rlbny#ehDWv'uȆ[	z*H%&�<:/XqBqΔ+伍I%HfSfS*yÏmE
    3z*H%&�<:/XqBqΔ+伍I%HfSfS*yÏmE
    x`K"dD?!>OyUpzRƳbm	Bg(<^*n2SKwwKBrw/bЬwv\D5&㵨827btXKg1c i#=WGd蠛=J`nG,`>،jË\i'"l]pI%ȁ,w,bl@grl@f?e4$Z 6ͬ.ʶ^]Kߧ>ش+]W8Mx=0I8j+*̍ǬX)&X@�FU:(&DZOEہw&?϶#;ڢ0x"W8^+șxOD@78$@甀ei>!T9}`K9XY	!Ŧ؀2؁8d
    ~hH@l-X]mSe."v.٩R�&x	*BB1#i.eۈWB?#S5P8NHc]a	N-􀵒@rs,E.Œ[5KKZ8}pW|'t}Zo;HY=H$O1d[;:xXH4O;]2оW!cwc5,m
    ܈ʚcߒyM&>FЉN
    HY$'1/[9Y%_wwGڹ.ącԁ JRDLE;j煌N 4A3,xa%|\`b\1|"I-6~'&k lMSBEralj,qtM?%RE.R
    cU-,ف&F/l@R*ښ\u`x$ikZѿ}hh@%4
    tu4?&VF^.D*[MM^.9=#9X1d^s?�~˙Zez	]y*ȂDe5q#iOgfg'[{gj̡3.Br`+˱P"*Ƭ~2(B́և16}h! wyRK˳cK-D)2I,\-˼oE16r7iqˋbXfK__6: kNH!Jt؈؂\|`Hi=qv*_#&/ҙx>0gWk]m٩v(k=\$ÆCNztvffR$~eI,FNDᏱ#S뜄pCCЃ=d@6q'
    8ኡjMEKqIYI}nRd3PAм%(>tztfX&8>KԦ!:z`ss&̀@xwwxpN-IJ\J,?k~Ʒ(^G]2߭N*/coɽ'=6F@Lg̕}<H$(/ͱօSqˉrWtlհ,͗G!\)"4H	OqJ8
    @
    8%,[;1PN(S3 [8K�0 4,sI9G_N2Īlkd>`bgJYؐ9q\ˍʰ %܍-cy9YJ	C,$L>m!y)Cl*^""1`xYƵ
    l8ePd+*Iq`-b!
    L炰2kpCSP㫞lU&l#kt)61\6$2ICH;őlk}]npє9 G2h@tg#-1#>\?*q([#Ȭ\hdnRt^GWMK*P`42VA^QHnXԌ5ۍKb	%z=$BAKtFz
    34<wLjǥ$G3MS�Rp
    쵆)43y*B7OLѱG+C
    ’�+zJU�N	i%|H7S:SRa픢OCzD`F* {s-*g]m؎`K;l~S*U8/C-x,qsHp8�l6̿Ei@QSq5v\xM'J
    g�ʡD a�Y�+JK`d҃Z$ZTgWTmV*&ba(xPI!3	JN7fUk^5='9q~<r83`݅a֢	HES81T,6d+tq56Ep\/rl(9%۠q(0rzt#ǐ$(,y EX0QА~J%:JD\ysRՅ&_@6:c-3\tU fd(m$} PvGcCelԊQV_KǑo	Jxt}g^+c<5)ą
    q$%D)dVV>Bx*R$r g�2J#o
    x1uϘ9Cdq]ȤrŘlوRV(;fK\r�9&*xq̿2dÌ-̢V;�ʑ*;+>/Wlvsdi`JT>D�_58\ؕKmsI
     	7qDzXL/	<r>?{ D;n_k+kKnczF�)`C\#gw#6'iܲ%!ؖlyBNO`-FV:9O&?q"l@`1L!bh2~P#[Y()yz7'7	[34}9�{_o�}9gÏ=.//}19s#Xfg#4]>+W>cQYTTWYcz;yM
    B@@B̥fƗr
    a#@øwp%~\161ok_flU;	6ijڳ=G
    %q(/˥)Dcg1'1t-DžBܖov(cXjouJi'`Ai`)IaYSm/9=BhVŰbd1ġ/+8եg" i3yN.qY)3HPO
    6Ci@kˬh%Bq*lGMŌM!*YoU)9>,#lߏzC�"sSXVj*h/.J	)] g +톘*n{۞	J�0gQ$g0CY!CfUd%&Zl#3IY>UK_-þH "IE!ѓ;@f<3*~;&#h**HZm#jPܣd'G@3"֗Ī>=ˋ"w/cerifwZL23bCo1 JQF_JS!,&>bNc2'&B[I:,ZQ0;׵m;=]Йd]Dnh:Ql1@!5^-!}ı'<,őG0:<e|\SjZily6-y[ַ	9-IeH0C$wX,&0ɕR)+%'H$%SlmJ:>9;[|΍+$X*@őG{f"XLS^2*EYU8-qD~�۾R1+'�ʫ!2Xͯ荒_ٞVL.].\4Ԛ݊ڊ[mmSfu:Og^
    px+hIõ஽'ׂ;^
    px+hIõ஽'ׂ;^
    px+hIõ஽'ׂ;^
    px+hIõ஽'ׂ;^
    px+hIõ஽'Ԅ1E#>egYﰯNTg=U_`ok~oWWԧp~bjolۿO[UVߩEͺZvu஽'ׂ;^
    px+hIõ஽'[$[<=Qmfʙ$ݮjwW*q^ֻɻwe+hIõ஽'ׂ;^
    px+hIõ஽'T)b)%M7=LG^c)8a2&^jtmv;6z^�j?)�)v;z@?�Ar#�ؼ^
    px+hIõ஽'ׂ;^
    px+hIõ஽'ׂ;^
    px+hIõ஽'Ԛd{$	ٽǴݖvf~mCzmػS]{BNu	8v״$W^Гh=!Ișq``rrQ狫GZ^J7S*MvWhw�\t#H%؁Qct)EbEKbhX@
    [nYMZn|״$W^Гk]{BNu	8v״$W^Гk]{BNu	8v״$W^Гk]{BNu	8v״$ړb,9X&lNf1hn gjNakh=.ȝlMg5vαEkpH4B]:BhV*Tq+*6&嚔LŪދ6]{BNu	8v״$W^Гk]{BNu	8v״$W^Гk]{BNu	8v״$W^Гk]{BNu	8v״$W^Гk]{BNu	8v״$W^Гk]{BNu	8v״$W^Гk]{BNu	8v״$W^Гk]{BNu	8v״$W^Гk]{BNu	8v״$W^Гk]{BNu	8v״$W^Гk]{BNu	8v״$W^Гk]{BNu	8v״$W^Гk]{BNu	8v״$W^Гk]{BNu	8v״$W^Гk]{BNu	8v״$W^Гk]{BNu	8v״$W^Гk]{BNu	8v[tpj(AiNϛSyGsv]d_$=._⎮L#zC	D#b8,{R^+$!C'(02BhH"W›mV(sw]}#6‡"љ5.\mM,Zv#9W~9˯V|fPX3?8f@#s-t%@.Dt z޷ybX8=nøئ| =4IFd3{1GTx]T\Iz*(z&,GqG^ED�pҁJLZՉ*ݞžΑMuQVk)@q$qQH\5kc<v>MIp<9b-ww{rBlhL"I.5RtJՇ95t!,bgVu8 nQř؟\[(KȨكP?qЩISW:Zط)z*-e<|$0ۣj1ƭpgG8r_).^6,Pbn}wn]hP1JlesB؞7AIlS>FyA2JY
    #SX|.o.$`Uʔ
    kdF~'SK}]&5agMh=1HK,>x9+N;-Dt_&aDKQM-r|p+!%b.6@.
    9yaO"ы>& }PРfx;}'e%6߈U+udLn*g=\DQ>GSGQtH		r\>nfޟ5&J=hlu+N7yZmG4_`!"|1c�w=T^J/铔NHas!Tf$Ei+M9#F,@CCB-FH~"duVĭՑ3-lsxIrJ^DOG`~E l$$[scXz|Ԙ+'sQԭ;2}kٵ`}dF~'SK}]&5agMh=1HK,>x9+N;-D?2.9i�Ix;j}\@HsnHH$y$FlRkhJv-Vg{jVJ
    tvR|y~bbI|ɲ:fBb')r3+--[y~gAxy7[Yk1H<Qh*qEyP<GR<Jl{|Mia3=JEa׼`˓^X`?KXln߆6;HQL:e3U/2$HȊvHVe"D`=$	Fe3rAől.O=хׇ+sV=lsT8&Cap|`RmV˨n[7ʰ?\Ũod8W<+Is!X
    \~'XFۊ@SD	�Gĝ/Jc3|4E632R)G;&!wDB]lű!OG꼤~uĨ;YZ3	"i	..m}e$`;[N*Ҳam$B+8'a;s܃3ϴOOI0諌9.)�i9|]-eR4|Jf䉉oH_,6;nzxQmJi<+aQS|9&ly2h2+M3q(cL#ڝc#/)^ȓ0%F8=jjzA:9:$i[
    `<X9\eӔ@U*RaZ֒<c~10hAҤ"DGd^~@|#1vN�%7
    L@m
    Y`[BVM3Nlq
    u}ܰ:*IضyZ]p7`R6(8s7Z24HŮ{'drUbj'edNo)7Fx2`[wXvP4OKj]Cwٸv`#6w0|r
    FMxm&ofڨMѺ5HyݕHI+#+VU<[`ٻ6D˞eZhtL}FAr]/Go,KΧ
    DCXY͒YO
    y8zfq)&gykѩunBbZ͎dx#ԭvi[W2 s-b%bgh'WG+LLXĪ0[uP}B7Z"Tk�,ZXS>@}t
    "yb-lJ޴f2x5~B:͑[궦KZR"{*Q)(sț"V '?8H8+s8iHK-
    b=PP4JMv]ݩr86oG&?'Ȓ$5=;5P48^nxPLʗ42U㲰Oaq$r;Lrns@QA4~�d
    d6-Ss݆Ggq=]2Dn;@J	g-L{CÇpvyy<|[WhV5ƲFsp	n
    |ɱ͂yv&m̈́^8֭ĝV
    ׉"{wl�Nĥ1Fw>")bD]
    #LvK!.kbSItJb\?xӉ4x1NeKN{;]9j؏}*XDvȠ:Bq 
    
    췐>6T#-ßʰ?\Ũod8W<+Is!X
    \~'XFۊ@SD	�Gĝ/Jc3|4E632R)G;&!wDB]lű!OG꼤~uĨ;YZ3	"i	..m}e$`;[N*Ҳam$B+8'a;s܃3ϴOOI0諌9.)�i9|]-eR4|Jf䉉oH_,6;nzxQmJi<+aQS|9&ly2h2+M3q(cL#ڝc#/)^ȓ0%F8,ŘW-PT53J'p9	z?DIFɒ`nWqc`CQх"{
    #wN5LHȼ`	=CsfH))l
    qIc+x"@vܯdeHv,\q(i+K&ӎH5p4cGNvd
    ovΎ΍^["v\`;]Ƅdߓqul|e>qX$A-ckn8#1ؾWn9b̟Q>LD,0G!4F�|fX<!IÕ0
    miu�+�%DRFS7+ଛBIɣ)O6lI/#'#+i4ͅ
    9g͹Sb~iEr:l,ciI\M[A0t2:o(BVd.1m
    J)zmG!eF<~ä3߸9Ay.Xa[)}52_GR<5qAؓ+储a.r%:vȖt_M>�a%c5=3n­
    u)kȸ*#G',r3VHWU`$Ou3kC1PABBURkN3$;}(&Lc_|Jz
    J[?MU%o{KRJfuzA'<kAZF3k*B$Kcre){-a!eLaFs@ƒYYP5ZPU6!Y9+5YDQdt,ĆlQJY)jtl41&L%$N/dqAkHè6qL
    zm
    l  #*sGr)2p�S'$Ar:M|gf>bw@Ce[T"qԦd8(F@eOԘ4�76LhUix}mnvd+jҍ`QI'Y J҄l=!==Ho.`RLdԑ%V
    dɭW:4!zG5qBL-h0~"1/k�!hu^-562p=[+vcI`�L?pW[&gQV9_-(y`X"IikyUKLr$[XVǰ916o>`#238'Ptlഛ^5/0,,>AY- du8ctæoMKh؅ͼJ-^Z4OKҿ𬬲 	aǤ썀#rYB 1yai{4wt|iN^fZ1\0voI dswű9
    ,*
    
    E5 µnM,!',u9~HY*84KPZ[Ѵ'f,x
    :۔n�*8kn2ohCUWK/c,QbX:v`8us3Bjc!I#Jr
    
    _6-u_t'@~foK3Px?"q6�XdREZ2gf~1O/ڭ`ZԜ8.6TVr[̋,�Kq;T!Qa$E16<2	bDf5ItSq9R:}5沷Xjv$Bq9/Hb)!Ylxdĉ4jghr[u6kcLFvt|sfKٷ	K]@+5_r	uA5oB&B,RsEo2,-PHG㝆r^cp4RB%i&Ӱ1MJ]lך	&X}iCeFZ,ENbɝ]#	+U0OU6[8ڴV"�-RN�dT|9g%67	cLE$+=X&Rl;NT{FyiNlp[66#<ir⫨fA.;#RƭV>BVޱc9BW%Zj eIA`:ъF[eRT!n)0S
    YSeӍE�Z�\sKln"ƘHV{"M3:v)VkXe/T;4'pxdرM׷TI^=[ʥw6t+4\pv)b qWpC>?}4q1qorB!(ɾ'KlZ1Xe<_bB_Oo['9"qA\le_GwvihN3y
    bïn:zqK;l-W[uk-th#PlS9àA7c9)tĮ-|~k[hbnO4h$tcPb1x1bіh:Hkg&t}t&w;9Tm=VTokj�'_-9�_5<c>DN3T,ڃUō1wx4N<;)]nPLȱY*KV!HґPNq @G]VC4lzEXfKs20勓(]Z.UL,<q<e."=1伌pL;DCY^"$k*Wn$f!y:Iޕ@1٦]vi@:(Tn-0$,pY6h6<*rB<s#"rwFdhFdg&ƧCxjldjVr$M[XGX[[ؘZW.ݥb
    Xw8vGY1rfHa.Y0S3Q%W.iDB[5%pOGf{L}nC1Z1B+9!D)ȘiPHV'*,3(b\=.1}z2(Us6p<reqW9)3NM}Cj(2[갦
    aQ2J%0L,)b1|	d9LJSDcÐRf9pi	
    bT*doyr!h]&:12L	#\HkӃ
    m&)Kd)M&̭
    2KkkpyqUZc'']Wl	RsORrM>^aIOa
    sTP~z,夘9.1w_@9!	Ç|RI5n`CJIgI9CxTY Icwk&-;D!py(;VuvTB4I9"%emA>D2/ȋ#g!qaHƥ
    ,t9vVZnOL$2JbGonzr>fca<uf!4D>`ѻΏݲ^shmVn2q@+Ň^
    0CbmG\ۨYy][ʗew$,_}r4VL#;DeHk1AtA(&AT*~եj1u];ef,lKl&3+Md~s�;Mdo6;>s:;{	Y|Nk	=ٌ&=D^	@]h$*5@OAֶViϏdoX<Jdx\?w#7ɋGL#.^'Gkw|YLࣼ\ֱ۶FL%bFSlH1 ؈팀4HPq<|MiaiȁEIҩ*V�VY6�2dDwP¨1O;
    2<wUS	5GQj֑ò_Ni-tXd~DN<I71\f^~2)2,#�bȀY6hmEJWW|C?e0.>fmts�>n;@/3ÝSc,SIX6ᨆ.,c<@ ,pbfeDk~] +5XzԽ*S_;!!,Ar2X
    o=.D"
    ~+VF&I"RWD`7myzpaBӜLNZ,Մ
    C,vQ5,Cz$]:QZ{48KPAy=:c
    θaBfɃE̲9F}3lD�J2LJ[:+{TV;Kf41>	du{8k\ZCVv@lJYSH
    U<\P>{&o-PT,BA"T\3iCl{IuٸYjq;j}k	jl<KLf-p?̊#b9\͜<\|UJ`ӓ_w{PC9l:)Te�LIcL6#
    eX_ BD/e.@S6TrF5+sXŰ6԰Yw9BCzXze
    Y12{j\D#WILD.(oB…EE$CrI+B1\A.ŕk!օIUT@n:ĶԜ{ϗRASXD'Cgy,\2Ti&KL]EBv0RM[(wPR}gRNyAP=HA&,0*wɻ|#KN<HeJռ+]q~{ݧfмlȉ.)੒cДm3r{G)Xv8woLUuq)24YN'RsVMKh#	A~.0z%ZE;u{ȕ^s3]]f\Ǽ05PՄ	15G,hHمQ1\SGPvJPEV/ 1H[$HrnI6ehQ[X[;ˈ زd:гU==`J
    TPؖӚzoyQqLMѫ34ImN9Ʉ
    <))P*4v-G+�̑�UPjolw!,mY!t\Sb\81ɩ_]lMcjXUizft&rM,0u&-o4&B�-̤);ڛ/7z´)дapċ,
    RD'oK.fN}e*/FıL|GyH{c5-d;nch"'P倇pl\Al}-AQQ:nY12$Pm%VY+lPD;匔1*f+b`{cx;D`"JLΕj1oڭ<8$`L8.ra3	W=FԌ^2'YjdfU` R8+ln:>Q4(P!#Lr4M,obd}ObG(xa*Gj"Nعs9	;I2L4T#K3{cSć!5625+}Vȅ&-#-LMl-mmhXdh$ۺVd	Md']ma4[Hf-;L=UCzMMVpy#;M/@l	2V'^*}jcQ*R�cݹnk	{,"9	I!7x]d5	V>!M?ߪ[\][R>AQ;D;*o$&EӅ.Y*6HOϡMHRItuJQSUzowW{b6M�Da*a}܌q>3,A4!Qf#W&ė ӳ#O{	fNdFx�n>'e*16#"0$
    	JƶK
    Z_S:)sT=@P>tDρ}1:|jL)/8(l@א6exNA+#'3*G9엇O]y3oxt9arqJHa1�]DfNXlM,=^)!yz(l#&lO$_!p>m}(>qD$,",]yX-,LL7eh<=#|;fL
    :ujbuTDEd)kvn<ȲT@"+vx
    DXI
    cc $IcT;GN7*wѳ^kxȲHiO?+vi	ڈeҗXy`}ݶ0l>,XjMнvx
    )4	!"t@?:Ήm8s:aӋZjNui:/:?3r%͙v~k(?ݼlԌ
    KK1Qo,qaJВŚWf\ݻvU[E;o#5|둚OIu_':fwr3W;\zNFj='q#5|둚OIu_':fwr3W;\zNFj='q#5|둚OIu_':Rp+SH)USn*)Oy=vof變ޚ}}WԶ7_[޾5۵E=u˖ꮮvnu5_':fwr3W;\zN㥊,1پG[+m[,ERC(z]SV3W;\zNFj='q#5|둚OIu_':fwr3W;\zNFj='q#5|둚OIu_':fwr3W;\zNvӱءz\QeЉ3m
    ;)[Cr+)_]skhNr3W;\zNFj='q#5|둚OIu_':fwr3W;\zNFj='q#5|둚OIu_':fwr3W;\zNFj='q#5|둚OIu_':fwr3W;\zNFj='q#5|둚OIu_':fwr3W;\zNFj='q#5|둚OIu_':fwr3W;\zNFj='q#5|둚OIu_':fwr3W;\zNFj='q#5|둚OIu_':fwr3W;\zNFj='q#5|둚OIu_':fwr3W;\zNFj='q#5|둚OIu_':fwr3W;\zNFj='q#5|둚OIu_':fwr3W;\zNFj='q#5|둚OIu_':Df6}6(_"WQnR(޾5of7߭^mDlf�u63k#d6gQ�v'?)_$=.Ꞧte*(3ʶڲ%g[̈dmk$cH_ּɏ5!_ZO&<ԅ}knNuz	›>SWבYA'^EePyiB~VPy
    zבYA)^Ee0yhžVPy
    zבYA)^Ee0yhžVPy
    zבYA)^Ee0yiBבy?'^E�PyiB~^O	בyA'^EPyiB~VPy
    zבYA)^Ee0yhž^Py
    zבyA)^EPyhžVPy
    zבYA)^Ee0yiB{בy?'^E�PyiB~^O	בYA'^EePyiB~VPy
    zבYA)^Ee0yhž^Py
    zבyA)^E0yiBVPy	בYA'^EePyiB~VPy
    zבYA)^Ee0yiB~VPy	בYA'^EePyiB^Py
    zבyA)^E0yiB^Py
    zבyA)^EPyhžVPy
    zבYA)^Ee0yhž^Py
    zבyA)^Ee0yhžVPy
    zבYA)^Ee0yhžVPy
    zבYA)^Ee0yhžVPy
    zבYA)^EePyiB~VPy	בYA'^Ee0yhžVPy
    zבYA)^Ee0yhžVPy
    zבYA)^Ee0yhžVPy
    zבYA)^Ee0yhžVPy
    zבYA)^Ee0yhžVPy
    zבYA)^Ee0yhžVPy
    zבYA)^Ee0yhžVPy	בYA'^EePyiB~^Py
    zבyA)^EPyhžVPy
    zבYA)^Ee0yhžVPy
    zבYA)^Ee0yhžVPy
    zבYA)^Ee0yhžVPy
    zבYA)^Ee0yhžVPy
    zבYA)Y
    dZ"f
    #1V4�:-{v.Q]oQgjʶڍ�wOo�kU���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/manual/images/chapters/configuration/basicSyntax.png�0000644�0001750�0001750�00000005606�11377016712�033501� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR��)������u���gAMA��|Q��� cHRM��z%��������u0��`��:��o���PLTE������@@@   ������������������hhhMMMв|||ጌǟMQS268@CE[^`ʭilm䒔vyz���?������������������\������������������d���	���������������*���
    ���������������(������������������\������������������.���
    ���������������\������������������d������������������*������������������)������������������?���������������������������������*������������������(������������������\������������������.������������������\�������������������d�������������������*�������a������������)��������'������������?��������(������������(�������`j������������[�������L������������e�������������������E��� �����������������z��IDATxb`�bh�@!E,�ѐ"�hH�hHI�)zZ@C:
    �h4@!Ą@�
    鐢�B�I!5,�
    )̌O7@�
    鐂aQ1`H3(&	I&0(T!
    )T+!@#@#
    4`dr2 A4L+!@C+pĥ<�2.q
    ŒB
     VHE
    D
    .Ad3IS�4<BARJI2C28`$de\bB
     VH11HCJAFF
    oxB*eKS�4C	pD)$R�4CB�!@C+0^Q�133!R?bB
     |HQ !@C+p}0PHА)&*)�!E-@�
    dC#RLTˀB
     AHH`B"aBx�@�
    Z2C
    H"x�@���@#:
    oH
    �4R�Y!E@�
    е@#7 35kR!v5
    )
    zH1R�4C4@#6H.�hhe@��hH�hh@�
    )b@�� VH
    kh4�4R�Z!5� FCX�@!E,�RZ�
    )b@�� VH
    $� b)j9)'$�V&6q[HN�4!>rTr"Y�~Rˉd@�[H/%!d5Dd�DZRy
    � b/& piNح -E"a*�@:yb*2j1c3B_X�d`;%;MN:(%-
    Gфa!Kf1�@�as$011Ҳ!%-
    AՄǣ-^dSQ!@(Em�@؜
    H9iO4Zy
    { q81CbH!k4RH᳌4EDH!y4@D>dZH22!l4j#!B>y;)ؠ�QKt䐂n|a!-
    G.iR8"Jt)ߠ�$313V ЛPt'$@�R"W$hF*@D2Đ Cl@zۦrn	v�4`!Eh,Wq!�@RYYa"��1ObP&2B
     P[4\W1Q^a@mKR�o�#`Nz'Z@�
    lH᷏O2B
     8YHbe:4C
     :pHkIr41�@�Ѵ£ 6I٠�hi1�@�"i6�RZ�
    )b@�
    b [�
    )�B�@#&H�ht`
    )\R$�h$ei
     FJHQ^N
    )|܎aRT�4R�Z!5ѐ"�hH�hh@�
    )b@�� VH
    kh4�4R�Z!5� FCX�@!E,�RZ�!EB3�@�
    퐢'�R@C:p<R$q�Z!$@�4C
    �m!ǥ,Oа
    )̄ÀJ
    �hh.�ْ
    1
    C
     tH!MK3v"m[ŢRkaPc2ffmrRhԐb$MА)8�s@�
    B)[�!EB;@�
    "m 6:@�
    "�hu>!@C:YC
     xH)�!E8:!@C;JE�4R�
    )b@�� |H
    �hH�h4�4R�
    )b@�� FCX�`�\p ����IENDB`��������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/css/�������������������������������������������������0000755�0001750�0001750�00000000000�12203357067�022062� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/css/anchor12.png�������������������������������������0000644�0001750�0001750�00000001160�11775511311�024200� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR���������Vu\���sBIT|d���sRGB����gAMA��a���	pHYs����+���tEXtSoftware�www.inkscape.org<��IDAT(S-;oAFϮ5qb%!QAZhi-
    ?AOJP*
    PFBPJH( ?wggg5fFsJ|ߌceLŰ2|wGvmlI7f%ic<͋7҆-($<(4]chKFӘ)ԺUY MQ33YdObD3u˲L2tbt
    'Z	X{G
    x`
    RfyqϐW'lz"TJ܉N̒s8rQXc)ν!.ܽT`6֨0s֯4xΈ丹 U:e79̸yIӫHW;ልX=D\H0Nc̻~Ƶs5^ij/ɪh<x؅˜LʥVք~HuĀTۧ_uߦb-
    ™7����IENDB`����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/css/anchor24.png�������������������������������������0000644�0001750�0001750�00000003136�11777573002�024217� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR���������}\���sBIT|d���sRGB����gAMA��a���	pHYs����+���tEXtSoftware�www.inkscape.org<��IDATHKMU[UUs93sIƴ!Tv%(|J("7%D}aeIDeSf9:̹}}sX{]Z)|?׻h)Z
    P�G,笠B*5+cʖR1FA
    ׿^^~bF"Okh{hN^ΜhrF
    纴?_+_3-(B9(ЛR]^)F_"W?QT]hT@"C[ڏ:r>v8#k8q-O
    *86h麈hH\)4/B. r(P\Wb+x3xa҄"3lA4"h 
    3brCVNRqz9N݊gΣĵ]v<F#EYlNZydۇkLMO{y:n^Wq*f
    v'=14RR~RCĔ4iT49,Y,F:/]ƫg(T8KQ&p`F)A@$&r_(I4wX/bdG<z:ţkȥ
    :Z#Pr HyxLNn^j:Ӏث ƢjӓX,C%-[{՛Pʘ4t"AҼnzģT/L=#4jFdv1WLLu皠 d皌:A!c 5P̚=zs)f`ЉGbKBk2N!tTtKHL\EbdRM]cY1biԦ-Lh&S
    42J 摚.~sܡazJFIEX˃F*v_3/Mrg$͆
    *12ĈG8k)<VQi-4~,NLKO{-zx U]fSHZ7o:N>keѤLTyRJ"RN6z5\mkW܅0=cf6׮7$2\͒s4[}d34Y^.`Pp 6\Du{h_C&MU&BLSc
    CW~Ƃ!uR &b^8}ǖ
    $J~nj1w/kl΀{jYd6kqMtf䷋!J/ËGǰC2`${IzhhXo&lc�BS W)j%DV�(
    ˇĞCga.e^u蘋MiJk^.Bmަ d4!75ٓ3m;LETQ([Ԯ˛S_Brr5)uϐruT5$6#0Mly)0<����IENDB`����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/css/anchor16.png�������������������������������������0000644�0001750�0001750�00000001661�11775511311�024212� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR���������a���sBIT|d���sRGB����gAMA��a���	pHYs����+���tEXtSoftware�www.inkscape.org<��IDAT8O]ˋUi{'q"FDVE!+A\)b"n.(DdH̘NOOg[uos}(2rk7LUEpfV)yY%SUtS<X)#>r`f13; b$Ùjf\0R<'DKR0!t#fS
    U|ݪ$"$gvSg42H(d?FeV9̕v%E;smN,Z5r@P	 Q[]Y,-/=z]x	G9RYeoV,
    {#ƻ;\:ߧVS,vXퟤ&DI+O|쉋jtY=fΜ)4I/
    3b?!CEբ,i5:
    .Pd^a;1SEq Sg6^2"jz*{@NӒ/Uݙr0`j\~y0
    =8%;sAZGIS|{.3F	N+j7y囫y8[ݪbFksmO~fM_x7_:w#PnިvD�OkLa�XgiIՐln|n}<jj6q+eiY}F_
    "wgjF"tƍmo!M[9R؟/RIN>o>����IENDB`�������������������������������������������������������������������������������logback_1.0.13/logback-site/src/site/resources/css/anchor20.png�������������������������������������0000644�0001750�0001750�00000002274�11777573045�024224� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR���������[���sBIT|d���sRGB����gAMA��a���	pHYs����+���tEXtSoftware�www.inkscape.org<��IDAT8O=TKh$U=J;IL1CDq5h$u\.;?	"(Lt)͸Q$Wuu_vU{=i>v: %*/sKS$Ե򮾤E\V|)
    !`:L%2a
    
    uŒef	f9BbI<,Flczh'pNŌ7,"Gf3M?$Y@]E
    2Pc3d^{vnÛ
    4*(E6IP	XiY	
    F24QC$|SxM\Qh#ka
    �
    �L�@EyD<svwO30DrJFt\*u6%HvT3|eBbjpبhvLBp)d*9-D0CR[Y|?\:n7Q%m5A8HJ ϋ0O y$`Rd}$E0ت&)<2[eIJ)69vLԫ|nԧlGB^sQ0%4NJ%PFQW}QN1Ye6|:vࠃpM*&hq|=>-lnQ*A@RHD5o\Csc7xrd9St w0�2euN|(
    8T՜R%@Ps=ře\c7/c+qC5I\�Kxw8X]ۀdr.IbYBUZ1/<Kq\	xtIs>Sujչ=,,B,Dd9xus!g;ϭAi5''.s�?}Q5geݾGON{}N
    Um>ۘBS35؎
    כwvJw>-T+''f6JwjԦi<ԞFζw"����IENDB`������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-site/pom.xml�����������������������������������������������������������������0000644�0001750�0001750�00000003422�12143153471�017037� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    
      <parent>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-parent</artifactId>
        <version>1.0.13</version>
      </parent>
    
      <modelVersion>4.0.0</modelVersion>
    
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-site</artifactId>
      <packaging>jar</packaging>
      <name>Logback Site</name>
      <description>logback-site module</description>
    
      <url>http://logback.qos.ch</url>
    
      <organization>
        <name>QOS.ch</name>
        <url>http://www.qos.ch</url>
      </organization>
      <inceptionYear>1999</inceptionYear>
    
      <licenses>
        <license>
          <name>Eclipse Public License - v 1.0</name>
          <url>http://www.eclipse.org/legal/epl-v10.html</url>
        </license>
    
        <license>
          <name>GNU Lesser General Public License</name>
          <url>http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html</url>
        </license>
      </licenses>
    
      <build>
        <resources>
          <resource>
            <directory>src/site/pages</directory>
            <!-- We're saving filtered html docs in a temporary folder-->
            <!-- and telling the site plug-in to get the docs there.-->
            <targetPath>../../../target/site</targetPath>
            <filtering>true</filtering>
          </resource>
        </resources>
    
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-site-plugin</artifactId>
            <configuration>
              <outputDirectory>${project.parent.basedir}/target/site
              </outputDirectory>
            </configuration>
          </plugin>
        </plugins>
    
      </build>
    
    </project>����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/��������������������������������������������������������������������0000755�0001750�0001750�00000000000�12203357067�016377� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/setClasspath.cmd����������������������������������������������������0000644�0001750�0001750�00000001020�12143164240�021503� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
    @echo off
    REM This script will add logback jars to your classpath.
    
    set LB_HOME=c:/SET/THIS/PARAMETER/TO/THE/FOLDER/WHERE/YOU/INSTALLED/LOGBACK
    REM echo %LB_HOME%
    
    set CLASSPATH=%CLASSPATH%;%LB_HOME%/logback-classic-${project.version}.jar
    set CLASSPATH=%CLASSPATH%;%LB_HOME%/logback-core-${project.version}.jar
    set CLASSPATH=%CLASSPATH%;%LB_HOME%/logback-examples/logback-examples-${project.version}.jar
    set CLASSPATH=%CLASSPATH%;%LB_HOME%/logback-examples/lib/slf4j-api-${slf4j.version}.jar
    
    REM echo %CLASSPATH%
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/����������������������������������������������������������������0000755�0001750�0001750�00000000000�11506604174�017165� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/�����������������������������������������������������������0000755�0001750�0001750�00000000000�11506604175�020112� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/������������������������������������������������������0000755�0001750�0001750�00000000000�11506604174�021032� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/���������������������������������������������0000755�0001750�0001750�00000000000�12136042273�022637� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/receivers/�����������������������������������0000755�0001750�0001750�00000000000�12136042273�024626� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/receivers/socket/����������������������������0000755�0001750�0001750�00000000000�12203357067�026123� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/receivers/socket/appender4.xml���������������0000644�0001750�0001750�00000001276�12136042273�030530� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <!-- ==================================================================== -->
    <!-- Sample SSLServerSocketAppender configuration.                        -->
    <!-- ==================================================================== -->
    
    <configuration debug="true">
    	  
      <appender name="SERVER" 
        class="ch.qos.logback.classic.net.server.SSLServerSocketAppender">
        <port>${port}</port>
        <ssl>
          <keyStore>
            <location>${keystore}</location>
            <password>${password}</password>
          </keyStore>
        </ssl>
      </appender>
    
      <root level="debug">
        <appender-ref ref="SERVER" />
      </root>  
    
    </configuration>
    
    
    
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/receivers/socket/ReceiverExample.java��������0000644�0001750�0001750�00000003206�12136042273�032042� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.receivers.socket;
    
    import org.slf4j.LoggerFactory;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    
    /**
     * This application loads a configuration containing a 
     * receiver component and logs events received from the remote
     * appender according to the local configuration.
     */
    public class ReceiverExample {
    
      static void usage(String msg) {
        System.err.println(msg);
        System.err.println("Usage: java " + ReceiverExample.class.getName() +
          " configFile\n" +
          "   configFile a logback configuration file" +
          "   in XML format.");
        System.exit(1);
      }
    
      static public void main(String[] args) throws Exception {
        if (args.length != 1) {
          usage("Wrong number of arguments.");
        }
    
        String configFile = args[0];
    
        if (configFile.endsWith(".xml")) {
          LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
          lc.reset();
          JoranConfigurator configurator = new JoranConfigurator();
          configurator.setContext(lc);
          configurator.doConfigure(configFile);
        }
    
        Thread.sleep(Long.MAX_VALUE);
      }
    
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/receivers/socket/receiver2.xml���������������0000644�0001750�0001750�00000001564�12136042273�030534� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <!-- ==================================================================== -->
    <!-- Sample SSLServerSocketReceiver configuration.                        -->
    <!-- ==================================================================== -->
    
    <configuration debug="true">
      
      <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
          <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
        </encoder>
      </appender>
      
      <root level="DEBUG">
        <appender-ref ref="CONSOLE" />
      </root>
    
      <receiver class="ch.qos.logback.classic.net.server.SSLServerSocketReceiver">
        <port>${port}</port>
        <ssl>
          <keyStore>
            <location>${keystore}</location>
            <password>${password}</password>
          </keyStore>
        </ssl>
      </receiver>
      
    </configuration>
    
    
    
    ��������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/receivers/socket/receiver3.xml���������������0000644�0001750�0001750�00000001454�12136042273�030533� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <!-- ==================================================================== -->
    <!-- Sample SocketReceiver configuration.                                 -->
    <!-- ==================================================================== -->
    
    <configuration debug="true">
      
      <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
          <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
        </encoder>
      </appender>
      
      <root level="DEBUG">
        <appender-ref ref="CONSOLE" />
      </root>
    
      <receiver class="ch.qos.logback.classic.net.SocketReceiver">
        <remoteHost>${host}</remoteHost>
        <port>${port}</port>
        <reconnectionDelay>10000</reconnectionDelay>
      </receiver>
      
    </configuration>
    
    
    
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/receivers/socket/appender3.xml���������������0000644�0001750�0001750�00000001053�12136042273�030520� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <!-- ==================================================================== -->
    <!-- Sample ServerSocketAppender configuration.                           -->
    <!-- ==================================================================== -->
    
    <configuration debug="true">
    	  
      <appender name="SERVER" 
        class="ch.qos.logback.classic.net.server.ServerSocketAppender">
        <port>${port}</port>
      </appender>
    
      <root level="debug">
        <appender-ref ref="SERVER" />
      </root>  
    
    </configuration>
    
    
    
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/receivers/socket/appender2.xml���������������0000644�0001750�0001750�00000001411�12136042273�030515� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <!-- ==================================================================== -->
    <!-- Sample SSLSocketAppender configuration.                              -->
    <!-- ==================================================================== -->
    
    <configuration debug="true">
    	  
      <appender name="SERVER" class="ch.qos.logback.classic.net.SSLSocketAppender">
        <remoteHost>${host}</remoteHost>
        <port>${port}</port>
        <reconnectionDelay>10000</reconnectionDelay>
        <ssl>
          <trustStore>
            <location>${truststore}</location>
            <password>${password}</password>
          </trustStore>
        </ssl>
      </appender>
    
      <root level="debug">
        <appender-ref ref="SERVER" />
      </root>  
    
    </configuration>
    
    
    
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/receivers/socket/receiver4.xml���������������0000644�0001750�0001750�00000001705�12136042273�030533� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <!-- ==================================================================== -->
    <!-- Sample SSLSocketReceiver configuration.                              -->
    <!-- ==================================================================== -->
    
    <configuration debug="true">
      
      <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
          <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
        </encoder>
      </appender>
      
      <root level="DEBUG">
        <appender-ref ref="CONSOLE" />
      </root>
    
      <receiver class="ch.qos.logback.classic.net.SSLSocketReceiver">
        <remoteHost>${host}</remoteHost>
        <port>${port}</port>
        <reconnectionDelay>10000</reconnectionDelay>
        <ssl>
          <trustStore>
            <location>${truststore}</location>
            <password>${password}</password>
          </trustStore>
        </ssl>
      </receiver>
      
    </configuration>
    
    
    
    �����������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/receivers/socket/appender1.xml���������������0000644�0001750�0001750�00000001160�12136042273�030515� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <!-- ==================================================================== -->
    <!-- Sample SocketAppender configuration.                                 -->
    <!-- ==================================================================== -->
    
    <configuration debug="true">
    	  
      <appender name="SERVER" class="ch.qos.logback.classic.net.SocketAppender">
        <remoteHost>${host}</remoteHost>
        <port>${port}</port>
        <reconnectionDelay>10000</reconnectionDelay>
      </appender>
    
      <root level="debug">
        <appender-ref ref="SERVER" />
      </root>  
    
    </configuration>
    
    
    
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/receivers/socket/receiver1.xml���������������0000644�0001750�0001750�00000001341�12136042273�030524� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <!-- ==================================================================== -->
    <!-- Sample ServerSocketReceiver configuration.                           -->
    <!-- ==================================================================== -->
    
    <configuration debug="true">
      
      <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
          <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
        </encoder>
      </appender>
      
      <root level="DEBUG">
        <appender-ref ref="CONSOLE" />
      </root>
    
      <receiver class="ch.qos.logback.classic.net.server.ServerSocketReceiver">
        <port>${port}</port>
      </receiver>
      
    </configuration>
    
    
    
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/receivers/socket/AppenderExample.java��������0000644�0001750�0001750�00000004301�12136042273�032031� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.receivers.socket;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    
    /**
     * This application loads a configuration containing some form of 
     * socket appender and then allows the user to enter messages
     * which will be relayed to remote clients via the appender.
     */
    public class AppenderExample {
    
      static void usage(String msg) {
        System.err.println(msg);
        System.err.println("Usage: java " + AppenderExample.class.getName() +
          " configFile\n" +
          "   configFile a logback configuration file" +
          "   in XML format.");
        System.exit(1);
      }
    
      static public void main(String[] args) throws Exception {
        if (args.length != 1) {
          usage("Wrong number of arguments.");
        }
    
        String configFile = args[0];
    
        if (configFile.endsWith(".xml")) {
          LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
          lc.reset();
          JoranConfigurator configurator = new JoranConfigurator();
          configurator.setContext(lc);
          configurator.doConfigure(configFile);
        }
    
        Logger logger = LoggerFactory.getLogger(AppenderExample.class);
    
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    
        while (true) {
          System.out.println(
            "Type a message to send to remote clients. Type 'q' to quit.");
    
          String s = reader.readLine();
    
          if (s.equals("q")) {
            break;
          } else {
            logger.debug(s);
          }
        }
        
        ((LoggerContext) LoggerFactory.getILoggerFactory()).stop();
      }
    
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/layouts/�������������������������������������0000755�0001750�0001750�00000000000�12203357067�024344� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/layouts/exceptionEvaluatorConfig.xml���������0000644�0001750�0001750�00000000704�11377016712�032076� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    
      <evaluator name="DISPLAY_EX_EVAL">
        <expression>throwable != null &amp;&amp; throwable instanceof chapters.layouts.TestException</expression>
      </evaluator>
    
      <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
          <pattern>%msg%n%xEx{full, DISPLAY_EX_EVAL}</pattern>
        </encoder>
      </appender>
    
      <root level="DEBUG">
        <appender-ref ref="STDOUT" />
      </root>
    </configuration>������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/layouts/callerEvaluatorConfig.xml������������0000644�0001750�0001750�00000000775�11377016712�031352� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    
      <evaluator name="DISPLAY_CALLER_EVAL">
        <expression>
          logger.contains("chapters.layouts") &amp;&amp; message.contains("who calls thee")
        </expression>
      </evaluator>
    
      <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
          <pattern>%-4relative [%thread] %-5level - %msg%n%caller{2, DISPLAY_CALLER_EVAL}</pattern> 
        </encoder>
      </appender>
    
      <root level="DEBUG">
        <appender-ref ref="STDOUT" />
      </root>
    </configuration>���logback_1.0.13/logback-examples/src/main/java/chapters/layouts/highlighted.xml����������������������0000644�0001750�0001750�00000001275�12143151241�027340� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration debug="true">
      <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- On Windows machines setting withJansi to true enables ANSI
             color code interpretation by the Jansi library. This requires
             org.fusesource.jansi:jansi:1.9 on the class path.  Note that
             Unix-based operating systems such as Linux and Mac OS X
             support ANSI color codes by default.  codes.-->
        <withJansi>true</withJansi>
        <encoder>
          <pattern>%date [%thread] %highlight(%-5level) %cyan(%-15logger{15}) %X - %msg %n</pattern>
        </encoder>
      </appender>
      <root level="DEBUG">
        <appender-ref ref="STDOUT" />
      </root>
    </configuration>�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/layouts/htmlLayoutConfig1.xml����������������0000644�0001750�0001750�00000000700�11377016712�030434� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
      <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
          <layout class="ch.qos.logback.classic.html.HTMLLayout">
            <pattern>%relative%thread%mdc%level%logger%msg</pattern>
          </layout>
        </encoder>
        <file>test.html</file>
      </appender>
    
      <root level="DEBUG">
        <appender-ref ref="FILE" />
      </root>
    </configuration>����������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/layouts/PatternSample.java�������������������0000644�0001750�0001750�00000003020�12136042273�027754� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.layouts;
    
    import org.slf4j.LoggerFactory;
    
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.ConsoleAppender;
    
    public class PatternSample {
    
      static public void main(String[] args) throws Exception {
        Logger rootLogger = (Logger) LoggerFactory.getLogger("root");
        LoggerContext loggerContext = rootLogger.getLoggerContext();
        loggerContext.reset();
        
        PatternLayoutEncoder encoder = new PatternLayoutEncoder();
        encoder.setContext(loggerContext);
        encoder.setPattern("%-5level [%thread]: %message%n");
        encoder.start();
        
        ConsoleAppender<ILoggingEvent> appender = new ConsoleAppender<ILoggingEvent>();
        appender.setContext(loggerContext);
        appender.setEncoder(encoder);
        appender.start();
        
        rootLogger.addAppender(appender);
    
        rootLogger.debug("Message 1");
        rootLogger.warn("Message 2");
      }
    }����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/layouts/MySampleLayout2.java�����������������0000644�0001750�0001750�00000003153�12136042273�030213� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.layouts;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.LayoutBase;
    
    public class MySampleLayout2 extends LayoutBase<ILoggingEvent> {
    
      String prefix = null;
      boolean printThreadName = true;
    
      public void setPrefix(String prefix) {
        this.prefix = prefix;
      }
    
      public void setPrintThreadName(boolean printThreadName) {
        this.printThreadName = printThreadName;
      }
    
      public String doLayout(ILoggingEvent event) {
        StringBuffer sbuf = new StringBuffer(128);
        if (prefix != null) {
          sbuf.append(prefix + ": ");
        }
        sbuf.append(event.getTimeStamp() - event.getLoggerContextVO().getBirthTime());
        sbuf.append(" ");
        sbuf.append(event.getLevel());
        if (printThreadName) {
          sbuf.append(" [");
          sbuf.append(event.getThreadName());
          sbuf.append("] ");
        } else {
          sbuf.append(" ");
        }
        sbuf.append(event.getLoggerName());
        sbuf.append(" - ");
        sbuf.append(event.getFormattedMessage());
        sbuf.append(CoreConstants.LINE_SEPARATOR);
        return sbuf.toString();
      }
    }���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/layouts/mySampleConverterConfig.xml����������0000644�0001750�0001750�00000000623�11763477741�031710� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    
    	<conversionRule conversionWord="nano" 
                      converterClass="chapters.layouts.MySampleConverter" />
    	
      <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
          <pattern>%-6nano [%thread] %level - %msg%n</pattern>
        </encoder>
      </appender>
    
      <root level="DEBUG">
        <appender-ref ref="STDOUT" />
      </root>
    </configuration>�������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/layouts/TestException.java�������������������0000644�0001750�0001750�00000001304�12136042273�027776� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.layouts;
    
    public class TestException extends Exception {
    
      private static final long serialVersionUID = 8326547927308399902L;
    
      public TestException(String message) {
        super(message);
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/layouts/sampleLayoutConfig.xml���������������0000644�0001750�0001750�00000000542�11377016712�030674� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration debug="true">
    
      <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
          <layout class="chapters.layouts.MySampleLayout" />
        </encoder>
      </appender>
    
      <root level="DEBUG">
        <appender-ref ref="STDOUT" />
      </root>
    </configuration>��������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/layouts/CallerEvaluatorExample.java����������0000644�0001750�0001750�00000002745�12136042273�031613� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.layouts;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.util.StatusPrinter;
    
    public class CallerEvaluatorExample {
    
      public static void main(String[] args) {
        Logger logger = LoggerFactory.getLogger(CallerEvaluatorExample.class);
        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
    
        try {
          JoranConfigurator configurator = new JoranConfigurator();
          configurator.setContext(lc);
          lc.reset();
          configurator.doConfigure(args[0]);
        } catch (JoranException je) {
          // StatusPrinter will handle this
        }
        StatusPrinter.printInCaseOfErrorsOrWarnings(lc);
    
        for (int i = 0; i < 5; i++) {
          if (i == 3) {
            logger.debug("who calls thee?");
          } else {
            logger.debug("I know me " + i);
          }
        }
      }
    }���������������������������logback_1.0.13/logback-examples/src/main/java/chapters/layouts/log4jXMLLayout.xml�������������������0000644�0001750�0001750�00000000653�11377016712�027670� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
      <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>test.xml</file>
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
          <layout class="ch.qos.logback.classic.log4j.XMLLayout">
            <locationInfo>true</locationInfo>
          </layout>
        </encoder> 
      </appender> 
    
      <root level="DEBUG">
        <appender-ref ref="FILE" />
      </root>
    </configuration> �������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/layouts/ExceptionEvaluatorExample.java�������0000644�0001750�0001750�00000003120�12136042273�032333� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.layouts;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.util.StatusPrinter;
    
    public class ExceptionEvaluatorExample {
    
      public static void main(String[] args) {
        Logger logger = LoggerFactory.getLogger(ExceptionEvaluatorExample.class);
        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
    
        try {
          JoranConfigurator configurator = new JoranConfigurator();
          configurator.setContext(lc);
          lc.reset();
          configurator.doConfigure(args[0]);
        } catch (JoranException je) {
          // StatusPrinter will handle this
        }
        StatusPrinter.printInCaseOfErrorsOrWarnings(lc);
        
        for (int i = 0; i < 3; i++) {
          if (i == 1) {
            logger.debug("logging statement " + i, new TestException(
                "do not display this"));
          } else {
            logger.debug("logging statement " + i, new Exception("display"));
          }
        }
      }
    }������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/layouts/MySampleLayout.java������������������0000644�0001750�0001750�00000002333�12136042273�030130� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.layouts;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.LayoutBase;
    
    public class MySampleLayout extends LayoutBase<ILoggingEvent>  {
    
      public String doLayout(ILoggingEvent event) {
        StringBuffer sbuf = new StringBuffer(128);
        sbuf.append(event.getTimeStamp() - event.getLoggerContextVO().getBirthTime());
        sbuf.append(" ");
        sbuf.append(event.getLevel());
        sbuf.append(" [");
        sbuf.append(event.getThreadName());
        sbuf.append("] ");
        sbuf.append(event.getLoggerName());
        sbuf.append(" - ");
        sbuf.append(event.getFormattedMessage());
        sbuf.append(CoreConstants.LINE_SEPARATOR);
        return sbuf.toString();
      }
    }�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/layouts/sampleLayoutConfig2.xml��������������0000644�0001750�0001750�00000000675�11377016712�030765� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    
      <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
     
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
          <layout class="chapters.layouts.MySampleLayout2">
            <prefix>MyPrefix</prefix>
            <printThreadName>false</printThreadName>
          </layout>
        </encoder>
      </appender>
    
      <root level="debug">
        <appender-ref ref="STDOUT" />
      </root>
    </configuration>�������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/layouts/TrivialMain.java���������������������0000644�0001750�0001750�00000003235�12136042273�027424� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.layouts;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.util.StatusPrinter;
    
    public class TrivialMain {
      public static void main(String[] args) throws InterruptedException {
        Logger logger = LoggerFactory.getLogger(TrivialMain.class);
        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
        
        try {
          JoranConfigurator configurator = new JoranConfigurator();
          configurator.setContext(lc);
          lc.reset();
          configurator.doConfigure(args[0]);
        } catch (JoranException je) {
          // StatusPrinter will handle this
        }
        StatusPrinter.printInCaseOfErrorsOrWarnings(lc);
    
        for (int i = 0; i < 6; i++) {
          if (i % 5 == 0) {
            logger.warn("a warning message " + i);
          } else if(i % 3 == 0) {
            logger.info("hello world number" + i);
          } else {
            logger.debug("hello world number" + i);
          }
        }
        logger.error("Finish off with fireworks", new Exception("Just testing"));
      }
    }�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/layouts/SampleLogging.java�������������������0000644�0001750�0001750�00000002605�12136042273�027735� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.layouts;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.util.StatusPrinter;
    
    public class SampleLogging {
    
      public static void main(String[] args) {
    
        Logger logger = LoggerFactory.getLogger(SampleLogging.class);
        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
    
        try {
          JoranConfigurator configurator = new JoranConfigurator();
          lc.reset();
          configurator.setContext(lc);
          configurator.doConfigure(args[0]);
        } catch (JoranException je) {
          // StatusPrinter will handle this
        }
        StatusPrinter.printInCaseOfErrorsOrWarnings(lc);
    
        logger.debug("Everything's going well");
        logger.error("maybe not quite...");
      }
    
    }
    ���������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/layouts/MySampleConverter.java���������������0000644�0001750�0001750�00000001624�12136042273�030624� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.layouts;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.pattern.ClassicConverter;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    
    public class MySampleConverter extends ClassicConverter {
    
      long start = System.nanoTime();
    
      @Override
      public String convert(ILoggingEvent event) {
        long nowInNanos = System.nanoTime();
        return Long.toString(nowInNanos-start);
      }
    }
    ������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/onJoran/�������������������������������������0000755�0001750�0001750�00000000000�12203357067�024252� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/onJoran/newRule/�����������������������������0000755�0001750�0001750�00000000000�12203357067�025673� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/onJoran/newRule/NewRuleCalculator.java�������0000644�0001750�0001750�00000004261�12140150757�032131� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.onJoran.newRule;
    
    import java.util.HashMap;
    import java.util.Map;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.ContextBase;
    import ch.qos.logback.core.joran.action.Action;
    import ch.qos.logback.core.joran.action.NewRuleAction;
    import ch.qos.logback.core.joran.spi.ElementSelector;
    import ch.qos.logback.core.util.StatusPrinter;
    import chapters.onJoran.SimpleConfigurator;
    import chapters.onJoran.calculator.ComputationAction1;
    
    /**
     * This example illustrates the usage of NewRuleAction which allows the Joran
     * interpreter to learn new rules on the fly.
     * 
     * <p>This example relies heavily on the code from the joran.calculator
     * package.
     * 
     * @author Ceki G&uuml;ulc&uuml;
     */
    public class NewRuleCalculator {
      public static void main(String[] args) throws Exception {
    
        Context context = new ContextBase();
    
        Map<ElementSelector, Action> ruleMap = new HashMap<ElementSelector, Action>();
    
        // we start with the rule for the top-most (root) element
        ruleMap.put(new ElementSelector("*/computation"), new ComputationAction1());
    
        // Associate "/new-rule" pattern with NewRuleAction from the
        // org.apache.joran.action package.
        // 
        // We will let the XML file to teach the Joran interpreter about new rules
        ruleMap.put(new ElementSelector("/computation/newRule"), new NewRuleAction());
    
        SimpleConfigurator simpleConfigurator = new SimpleConfigurator(ruleMap);
        // link the configurator with its context
        simpleConfigurator.setContext(context);
    
        simpleConfigurator.doConfigure(args[0]);
    
        // Print any errors that might have occured.
        StatusPrinter.printInCaseOfErrorsOrWarnings(context);
      }
    
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/onJoran/newRule/newRule.xml������������������0000644�0001750�0001750�00000001306�11377016712�030036� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!-- 
      This file is intended to be executed by NewRuleCalculator. 
    	Note that the rules for adding and multiplying are learned on 
      the fly, while parsingthis file.
    -->
    
    <computation name="toto">
      <new-rule pattern="*/computation/literal" 
                actionClass="chapters.onJoran.calculator.LiteralAction"/>
      <new-rule pattern="*/computation/add" 
                actionClass="chapters.onJoran.calculator.AddAction"/>
      <new-rule pattern="*/computation/multiply" 
                actionClass="chapters.onJoran.calculator.MultiplyAction"/>
    
      <computation>
        <literal value="7"/>
        <literal value="3"/>
        <add/>
      </computation>   
     
      <literal value="3"/>
      <multiply/>
    </computation>��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/onJoran/newRule/readme.txt�������������������0000644�0001750�0001750�00000000303�11377016712�027665� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
    This directory contains an example showing how Joran can 
    learn new parsing rules on the fly.
    
    For further documentation please see
    
      http://logback.qos.ch/manual/onJoran.html#newRule
    
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/onJoran/implicit/����������������������������0000755�0001750�0001750�00000000000�12203357067�026064� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/onJoran/implicit/PrintMeImplicitAction.java��0000644�0001750�0001750�00000002621�12140150757�033134� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.onJoran.implicit;
    
    import ch.qos.logback.core.joran.spi.ElementPath;
    import org.xml.sax.Attributes;
    
    import ch.qos.logback.core.joran.action.ImplicitAction;
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    
    /**
     * 
     * A rather trivial implicit action which is applicable if an element has a
     * printme attribute set to true.
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public class PrintMeImplicitAction extends ImplicitAction {
    
      public boolean isApplicable(ElementPath elementPath, Attributes attributes,
          InterpretationContext ec) {
        String printmeStr = attributes.getValue("printme");
    
        return Boolean.valueOf(printmeStr).booleanValue();
      }
    
      public void begin(InterpretationContext ec, String name, Attributes attributes) {
        System.out.println("Element [" + name + "] asked to be printed.");
      }
    
      public void end(InterpretationContext ec, String name) {
      }
    }
    ���������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/onJoran/implicit/readme.txt������������������0000644�0001750�0001750�00000000254�11377016712�030063� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
    This directory contains an example illustrating implicit actions.
    
    For further information, please refer to 
    
      http://logback.qos.ch/manual/onJoran.html#implicit
      ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/onJoran/implicit/NOPAction.java��������������0000644�0001750�0001750�00000001731�12136042273�030516� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.onJoran.implicit;
    
    import org.xml.sax.Attributes;
    
    import ch.qos.logback.core.joran.action.Action;
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    
    
    /**
     * No operation (NOP) action that does strictly nothing. 
     *  
     * @author Ceki G&uuml;lc&uuml;
     */
    public class NOPAction extends Action {
      
      public void begin(InterpretationContext ec, String name, Attributes attributes) {
      }
    
      public void end(InterpretationContext ec, String name) {
      }
    }
    ���������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/onJoran/implicit/implicit1.xml���������������0000644�0001750�0001750�00000001072�11377016712�030501� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<foo>
    
      <!-- These elements will print due to the implicit rule -->
      <xyz printme="true">
        <abc printme="true"/>
      </xyz>
    
      <!-- This element has no associated rule and no implicit rule 
           applies for it because the printme attribute is not set. -->  
      <xyz/>
    
      
      
      <!-- This element will not be printed even if its printme 
           attribute  is set because implicit rules are invoked only 
           if no explicit rule matches the element. The */foo rule
           matches the following element.
           --> 
      <foo printme="true"/>
    
    </foo>����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/onJoran/implicit/PrintMe.java����������������0000644�0001750�0001750�00000004014�12140150757�030301� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.onJoran.implicit;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.ContextBase;
    import ch.qos.logback.core.joran.action.Action;
    import ch.qos.logback.core.joran.action.ImplicitAction;
    import ch.qos.logback.core.joran.spi.ElementSelector;
    import ch.qos.logback.core.util.StatusPrinter;
    import chapters.onJoran.SimpleConfigurator;
    
    /**
     * This example illustrates the usage of implicit actions.
     * 
     * <p>Keep in mind that implicit actions are not associated with any specific
     * pattern. Moreover, they are added directly to a Joran Interpreter instead of
     * a rule store.
     * 
     * @author Ceki G&uuml;ulc&uuml;
     */
    public class PrintMe {
    
      public static void main(String[] args) throws Exception {
        Context context = new ContextBase();
    
        Map<ElementSelector, Action> ruleMap = new HashMap<ElementSelector, Action>();
    
        // we start with the rule for the top-most (root) element
        ruleMap.put(new ElementSelector("*/foo"), new NOPAction());
    
        // Add an implicit action. 
        List<ImplicitAction> iaList = new ArrayList<ImplicitAction>();
        iaList.add(new PrintMeImplicitAction());
        SimpleConfigurator simpleConfigurator = new SimpleConfigurator(ruleMap,
            iaList); 
    
        // link the configurator with its context
        simpleConfigurator.setContext(context);
    
        simpleConfigurator.doConfigure(args[0]);
        StatusPrinter.printInCaseOfErrorsOrWarnings(context);
        
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/onJoran/helloWorld/��������������������������0000755�0001750�0001750�00000000000�12203357067�026365� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/onJoran/helloWorld/HelloWorld.java�����������0000644�0001750�0001750�00000003102�12140150757�031274� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.onJoran.helloWorld;
    
    import java.util.HashMap;
    import java.util.Map;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.ContextBase;
    import ch.qos.logback.core.joran.action.Action;
    import ch.qos.logback.core.joran.spi.ElementSelector;
    import ch.qos.logback.core.util.StatusPrinter;
    import chapters.onJoran.SimpleConfigurator;
    
    /**
     * 
     * A hello world example using Joran.
     * 
     * @author Ceki Gulcu
     */
    public class HelloWorld {
      public static void main(String[] args) throws Exception {
        Map<ElementSelector, Action> ruleMap = new HashMap<ElementSelector, Action>();
    
        // Associate "hello-world" pattern with HelloWorldAction
        ruleMap.put(new ElementSelector("hello-world"), new HelloWorldAction());
    
        // Joran needs to work within a context.
        Context context = new ContextBase();
        SimpleConfigurator simpleConfigurator = new SimpleConfigurator(ruleMap);
        // link the configurator with its context
        simpleConfigurator.setContext(context);
    
        simpleConfigurator.doConfigure(args[0]);
        StatusPrinter.print(context);
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/onJoran/helloWorld/HelloWorldAction.java�����0000644�0001750�0001750�00000002115�12136042273�032433� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.onJoran.helloWorld;
    
    import org.xml.sax.Attributes;
    
    import ch.qos.logback.core.joran.action.Action;
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    
    /**
     * A trivial action that writes "Hello world" on the console.
     * 
     * See the {@link HelloWorld} class for integration with Joran.
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public class HelloWorldAction extends Action {
      public void begin(InterpretationContext ec, String name, Attributes attributes) {
        System.out.println("Hello World");
      }
    
      public void end(InterpretationContext ec, String name) {
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/onJoran/helloWorld/hello.xml�����������������0000644�0001750�0001750�00000000037�11377016712�030212� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<hello-world>
    </hello-world>
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/onJoran/helloWorld/readme.txt����������������0000644�0001750�0001750�00000000262�11377016712�030363� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������The example illustrates the minimal plumbing required for using Joran.
    
    For further explanations, please refer to 
    
      http://logback.qos.ch/manual/onJoran.html#helloWorld
    
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/onJoran/SimpleConfigurator.java��������������0000644�0001750�0001750�00000003574�12140150757�030737� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.onJoran;
    
    import java.util.List;
    import java.util.Map;
    
    import ch.qos.logback.core.joran.GenericConfigurator;
    import ch.qos.logback.core.joran.action.Action;
    import ch.qos.logback.core.joran.action.ImplicitAction;
    import ch.qos.logback.core.joran.spi.ElementPath;
    import ch.qos.logback.core.joran.spi.Interpreter;
    import ch.qos.logback.core.joran.spi.ElementSelector;
    import ch.qos.logback.core.joran.spi.RuleStore;
    
    /**
     * A minimal configurator extending GenericConfigurator.
     * 
     * @author Ceki G&uuml;c&uuml;
     *
     */
    public class SimpleConfigurator extends GenericConfigurator {
    
      final Map<ElementSelector, Action> ruleMap;
      final List<ImplicitAction> iaList;
    
      public SimpleConfigurator(Map<ElementSelector, Action> ruleMap) {
        this(ruleMap, null);
      }
    
      public SimpleConfigurator(Map<ElementSelector, Action> ruleMap, List<ImplicitAction> iaList) {
        this.ruleMap = ruleMap;
        this.iaList = iaList;
      }
    
      @Override
      protected void addInstanceRules(RuleStore rs) {
        for (ElementSelector elementSelector : ruleMap.keySet()) {
          Action action = ruleMap.get(elementSelector);
          rs.addRule(elementSelector, action);
        }
      }
    
      @Override
      protected void addImplicitRules(Interpreter interpreter) {
        if(iaList == null) {
          return;
        }
        for (ImplicitAction ia : iaList) {
          interpreter.addImplicitAction(ia);
        }
      }
    }
    ������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/onJoran/calculator/��������������������������0000755�0001750�0001750�00000000000�12203357067�026403� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/onJoran/calculator/calculator3.xml�����������0000644�0001750�0001750�00000000520�11377016712�031336� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!-- This file is intended to be executed by Caculator2. 
         It is not suited for Calculator1 due to nested computation 
         elements.
       -->
    
    <computation name="toto">
      <computation>
        <literal value="7"/>
        <literal value="3"/>
        <add/>
      </computation>   
     
      <literal value="3"/>
      <multiply/>
    </computation>��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/onJoran/calculator/ComputationAction2.java���0000644�0001750�0001750�00000006432�12136042273�032770� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.onJoran.calculator;
    
    import java.util.Stack;
    
    import org.xml.sax.Attributes;
    
    import ch.qos.logback.core.joran.action.Action;
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    import ch.qos.logback.core.util.OptionHelper;
    
    
    /**
     * ComputationAction2 will print the result of the compuration made by 
     * children elements but only if the computation itself is named, that is if the
     * name attribute of the associated computation element is not null. In other
     * words, anonymous computations will not print their result.
     * 
     * ComputationAction2 differs from ComputationAction1 in its handling of
     * instance variables. ComputationAction1 has a simple <Code>nameStr</code>
     * instance variable. This variable is set when the begin() method is called 
     * and then later used within the end() method. 
     * 
     * This simple approach works properly if the begin() and end()
     * method of a given action are expected to be called in sequence. However,
     * there are situations where the begin() method of the same action instance is 
     * invoked multiple times before the matching end() method is invoked. 
     * 
     * When this happens, the second call to begin() overwrites values set by
     * the first invocation to begin(). The solution is to save parameter values 
     * into a separate stack. The well-formedness of XML will guarantee that a value
     * saved by one begin() will be consumed only by the matching end() method.
     * 
     * Note that in the vast majority of cases there is no need to resort to a 
     * separate stack for each variable. The situation of successive begin() 
     * invocations can only occur if: 
     * 
     * 1) the associated pattern contains a wildcard, i.e. the &#42; character
     * 
     * and
     * 
     * 2) the associated element tag can contain itself as a child 
     *  
     * For example, "&#42;/computation" pattern means that computations can contain
     * other computation elements as children. 
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public class ComputationAction2 extends Action {
      public static final String NAME_ATR = "name";
    
      Stack<String> nameStrStack = new Stack<String>();
      
      
      public void begin(InterpretationContext ec, String name, Attributes attributes) {
        String nameStr = attributes.getValue(NAME_ATR);
        // save nameStr value in a special stack. Note that the value is saved
        // even if it is empty or null.
        nameStrStack.push(nameStr);
      }
    
      public void end(InterpretationContext ec, String name) {
        // pop nameStr value from the special stack
        String nameStr = (String) nameStrStack.pop();
        
        if (OptionHelper.isEmpty(nameStr)) {
          // nothing to do
        } else {
          Integer i = (Integer) ec.peekObject();
          System.out.println(
            "The computation named [" + nameStr + "] resulted in the value " + i);
        }
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/onJoran/calculator/AddAction.java������������0000644�0001750�0001750�00000004103�12136042273�031065� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.onJoran.calculator;
    
    import java.util.EmptyStackException;
    
    import org.xml.sax.Attributes;
    
    import ch.qos.logback.core.joran.action.Action;
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    
    
    /**
     * This action adds the two integers at the top of the stack (they are removed)
     * and pushes the result to the top the stack.  
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public class AddAction extends Action {
      
      public void begin(InterpretationContext ic, String name, Attributes attributes) {
        int first = fetchInteger(ic);
        int second = fetchInteger(ic);
        // Push the result of the addition for the following actions.
        ic.pushObject(first + second);
      }
    
      /**
       * Pop the Integer object at the top of the stack.
       * This code also  illustrates usage of Joran's error handling paradigm. 
       */
      int fetchInteger(InterpretationContext ic) {
        int result = 0;
    
        try {
          // Pop the object at the top of the interpretation context's stack.
          Object o1 = ic.popObject();
    
          if (o1 instanceof Integer) {
            result = ((Integer) o1).intValue();
          } else {
            String errMsg =
              "Object [" + o1
              + "] currently at the top of the stack is not an integer.";
            ic.addError(errMsg);
            throw new IllegalArgumentException(errMsg);
          }
        } catch (EmptyStackException ese) {
          ic.addError(("Expecting an integer on the execution stack."));
          throw ese;
        }
        return result;
      }
    
      public void end(InterpretationContext ic, String name) {
        // Nothing to do here.
      }
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/onJoran/calculator/LiteralAction.java��������0000644�0001750�0001750�00000003606�12136042273�032000� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.onJoran.calculator;
    
    import org.xml.sax.Attributes;
    
    import ch.qos.logback.core.joran.action.Action;
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    import ch.qos.logback.core.util.OptionHelper;
    
    /**
     * This action converts the value attribute of the associated element to an
     * integer and pushes the resulting Integer object on top of the execution
     * context stack.
     * 
     * <p>It also illustrates usage of Joran's error reporting/handling paradigm.
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public class LiteralAction extends Action {
      public static final String VALUE_ATR = "value";
    
      public void begin(InterpretationContext ic, String name, Attributes attributes) {
        String valueStr = attributes.getValue(VALUE_ATR);
    
        if (OptionHelper.isEmpty(valueStr)) {
          ic.addError("The literal action requires a value attribute");
          return;
        }
    
        try {
          Integer i = Integer.valueOf(valueStr);
          ic.pushObject(i);
        } catch (NumberFormatException nfe) {
          ic.addError("The value [" + valueStr
              + "] could not be converted to an Integer", nfe);
          throw nfe;
        }
      }
    
      public void end(InterpretationContext ic, String name) {
        // Nothing to do here.
        // In general, the end() method of actions associated with elements
        // having no children do not need to perform any processing in their
        // end() method.
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/onJoran/calculator/calculator2.xml�����������0000644�0001750�0001750�00000000315�11377016712�031337� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE computation>
    
    <computation name="toto">
      <literal value="7"/>
      <literal value="3"/>
      <add/>
      <literal value="3"/>
      <multiply/>
    </computation>�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/onJoran/calculator/readme.txt����������������0000644�0001750�0001750�00000000362�11377016712�030402� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������This directory contains the the calculator example. It shows how Actions can 
    collaborate in order to accomplish a simple computation.
    
    For further information, please refer to 
    
      http://logback.qos.ch/manual/onJoran.html#calculator
    
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/onJoran/calculator/calculator1.xml�����������0000644�0001750�0001750�00000000104�11377016712�031332� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<computation name="total">
      <literal value="3"/>
    </computation>
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/onJoran/calculator/ComputationAction1.java���0000644�0001750�0001750�00000003717�12136042273�032772� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.onJoran.calculator;
    
    
    
    import org.xml.sax.Attributes;
    
    import ch.qos.logback.core.joran.action.Action;
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    import ch.qos.logback.core.util.OptionHelper;
    
    
    /**
     * ComputationAction1 will print the result of the compuration made by 
     * children elements but only if the compuration itself is named, that is if the
     * name attribute of the associated computation element is not null. In other
     * words, anonymous computations will not print their result.
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public class ComputationAction1 extends Action {
      public static final String NAME_ATR = "name";
    
      String nameStr;
    
      /**
       * Store the value of the name attribute for future use.
       */
      public void begin(InterpretationContext ec, String name, Attributes attributes) {
        nameStr = attributes.getValue(NAME_ATR);
      }
    
      /**
       * Children elements have been processed. The sesults should be an integer 
       * placed at the top of the execution stack.
       * 
       * This value will be printed on the console but only if the action is 
       * named. Anonymous computation will not print their result.
       */
      public void end(InterpretationContext ec, String name) {
        if (OptionHelper.isEmpty(nameStr)) {
          // nothing to do
        } else {
          Integer i = (Integer) ec.peekObject();
          System.out.println(
            "The computation named [" + nameStr + "] resulted in the value " + i);
        }
      }
    }
    �������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/onJoran/calculator/Calculator2.java����������0000644�0001750�0001750�00000004402�12140150757�031416� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.onJoran.calculator;
    
    import java.util.HashMap;
    import java.util.Map;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.ContextBase;
    import ch.qos.logback.core.joran.action.Action;
    import ch.qos.logback.core.joran.spi.ElementSelector;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.util.StatusPrinter;
    import chapters.onJoran.SimpleConfigurator;
    
    
    /**
     * This examples illustrates collaboration between multiple actions through the
     * common execution context stack.
     * 
     * It differs from Calculator1 in that it supports arbitrary nesting of 
     * computation elements.
     * 
     * You can test this application with the sample XML file <em>calculator3.xml</em>.
     * 
     * @author Ceki G&uuml;ulc&uuml;
     */
    public class Calculator2 {
      public static void main(String[] args) throws Exception {
        Map<ElementSelector, Action> ruleMap = new HashMap<ElementSelector, Action>();
       
        
        // Note the wild card character '*', in the paterns, signifying any level 
        // of nesting.
        ruleMap.put(new ElementSelector("*/computation"), new ComputationAction2());
    
        ruleMap.put(new ElementSelector("*/computation/literal"), new LiteralAction());
        ruleMap.put(new ElementSelector("*/computation/add"), new AddAction());
        ruleMap.put(new ElementSelector("*/computation/multiply"), new MultiplyAction());
        
        Context context = new ContextBase();
        SimpleConfigurator simpleConfigurator = new SimpleConfigurator(ruleMap);
        // link the configurator with its context
        simpleConfigurator.setContext(context);
    
        try {
          simpleConfigurator.doConfigure(args[0]);
        } catch (JoranException e) {
          // Print any errors that might have occured.
          StatusPrinter.print(context);
        }
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/onJoran/calculator/Calculator1.java����������0000644�0001750�0001750�00000003670�12140150757�031423� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.onJoran.calculator;
    
    import java.util.HashMap;
    import java.util.Map;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.ContextBase;
    import ch.qos.logback.core.joran.action.Action;
    import ch.qos.logback.core.joran.spi.ElementSelector;
    import ch.qos.logback.core.util.StatusPrinter;
    import chapters.onJoran.SimpleConfigurator;
    
    /**
     * This examples illustrates collaboration between multiple actions through the
     * common execution context stack.
     * 
     * @author Ceki G&uuml;ulc&uuml;
     */
    public class Calculator1 {
    
      public static void main(String[] args) throws Exception {
        Context context = new ContextBase();
    
        Map<ElementSelector, Action> ruleMap = new HashMap<ElementSelector, Action>();
    
        // Associate "/computation" pattern with ComputationAction1
        ruleMap.put(new ElementSelector("/computation"), new ComputationAction1());
    
        // Other associations
        ruleMap.put(new ElementSelector("/computation/literal"), new LiteralAction());
        ruleMap.put(new ElementSelector("/computation/add"), new AddAction());
        ruleMap.put(new ElementSelector("/computation/multiply"), new MultiplyAction());
    
        SimpleConfigurator simpleConfigurator = new SimpleConfigurator(ruleMap);
        // link the configurator with its context
        simpleConfigurator.setContext(context);
    
        simpleConfigurator.doConfigure(args[0]);
        // Print any errors that might have occured.
        StatusPrinter.print(context);
      }
    }
    ������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/onJoran/calculator/MultiplyAction.java�������0000644�0001750�0001750�00000003651�12136042273�032223� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.onJoran.calculator;
    
    import org.xml.sax.Attributes;
    
    import ch.qos.logback.core.joran.action.Action;
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    
    import java.util.EmptyStackException;
    
    /**
     * 
     * This action multiplies the two integers at the top of the stack (they are
     * removed) and pushes the result on top the stack.
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public class MultiplyAction extends Action {
    
      public void begin(InterpretationContext ic, String name, Attributes attributes) {
        int first = fetchInteger(ic);
        int second = fetchInteger(ic);
        ic.pushObject(first * second);
      }
    
      /**
       * Pop the Integer object at the top of the stack. This code illustrates usage
       * of Joran's error handling paradigm.
       */
      int fetchInteger(InterpretationContext ic) {
        int result = 0;
    
        try {
          Object o1 = ic.popObject();
    
          if (o1 instanceof Integer) {
            result = ((Integer) o1).intValue();
          } else {
            String errMsg = "Object [" + o1
                + "] currently at the top of the stack is not an integer.";
            ic.addError(errMsg);
            throw new IllegalArgumentException(errMsg);
          }
        } catch (EmptyStackException ese) {
          ic.addError("Expecting an integer on the execution stack.");
          throw ese;
        }
        return result;
      }
    
      public void end(InterpretationContext ic, String name) {
        // Nothing to do here.
      }
    }
    ���������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/filters/�������������������������������������0000755�0001750�0001750�00000000000�12203357067�024314� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/filters/accessEventEvaluator2.xml������������0000644�0001750�0001750�00000001320�11473465116�031245� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
      <statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />
    
      <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
          <evaluator name="Eval404">
            <expression>
             (event.getStatusCode() == 404)
               &amp;&amp;  <!-- ampersand characters need to be escaped -->
             !(event.getRequestURI().contains(".css"))
            </expression>
          </evaluator>
          <onMismatch>DENY</onMismatch>
          <onMatch>ACCEPT</onMatch>
        </filter>
    
       <encoder><pattern>%h %l %u %t %r %s %b</pattern></encoder>
      </appender>
    
      <appender-ref ref="STDOUT" />
    </configuration>
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/filters/GoMDC.java���������������������������0000644�0001750�0001750�00000002625�12136042273�026050� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.filters;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.slf4j.MDC;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.util.StatusPrinter;
    
    public class GoMDC {
    
      public static void main(String[] args)  {
        Logger logger = LoggerFactory
            .getLogger(GoMDC.class);
        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
    
        try {
          JoranConfigurator configurator = new JoranConfigurator();
          configurator.setContext(lc);
          lc.reset();
          configurator.doConfigure("mdcFilter.xml");
          
        } catch (JoranException je) {
          StatusPrinter.print(lc);
        }
    
        logger.debug("I know me " + 0);
        MDC.put("key", "val");
        logger.debug("I know me " + 1);
        
        StatusPrinter.print(lc);
      }
    }�����������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/filters/basicEventEvaluator.xml��������������0000644�0001750�0001750�00000001062�11377016712�031003� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration debug="true">
    
      <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
          <evaluator>
            <expression>message.contains("billing")</expression>
          </evaluator>
          <OnMismatch>NEUTRAL</OnMismatch>
          <OnMatch>DENY</OnMatch>
        </filter>
        <layout>
          <pattern>%-4relative [%thread] %-5level %logger - %msg%n</pattern>
        </layout>
      </appender>
    
      <root level="DEBUG">
        <appender-ref ref="STDOUT" />
      </root>
    </configuration>������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/filters/thresholdFilterConfig.xml������������0000644�0001750�0001750�00000001036�11377016712�031326� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?>
    
    <configuration>
      <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    
        <!-- deny all events with a level below INFO, that is TRACE and DEBUG -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
          <level>INFO</level>
        </filter>
        <encoder>
          <pattern>%-4relative [%thread] %-5level %logger{30} - %msg%n</pattern>
        </encoder>
      </appender>
    
      
      <root level="DEBUG">
        <appender-ref ref="CONSOLE" />
      </root>
    
    </configuration>��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/filters/sampleTurboFilterConfig.xml����������0000644�0001750�0001750�00000000665�11377016712�031636� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    
      <turboFilter class="chapters.filters.SampleTurboFilter">
        <Marker>sample</Marker>
      </turboFilter>
    
      <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
          <pattern>%-4relative [%thread] %-5level %logger - %msg%n</pattern>
        </layout>
      </appender>
    
      <root>
        <appender-ref ref="STDOUT" />
      </root>
    </configuration>���������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/filters/evaluatorWithMatcher.xml�������������0000644�0001750�0001750�00000001257�11377016712�031205� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration debug="true">
    
      <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
          <evaluator>
    
            <matcher>
              <Name>odd</Name>
              <regex>statement [13579]</regex>
            </matcher>
            
            <expression>odd.matches(formattedMessage)</expression>
          </evaluator>
          <OnMismatch>NEUTRAL</OnMismatch>
          <OnMatch>DENY</OnMatch>
        </filter>
        <layout>
          <pattern>%-4relative [%thread] %-5level %logger - %msg%n</pattern>
        </layout>
      </appender>
    
      <root level="DEBUG">
        <appender-ref ref="STDOUT" />
      </root>
    </configuration>�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/filters/FilterEvents.java��������������������0000644�0001750�0001750�00000003532�12136042273�027567� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.filters;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.slf4j.MDC;
    import org.slf4j.Marker;
    import org.slf4j.MarkerFactory;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.core.joran.spi.JoranException;
    
    public class FilterEvents {
    
      public static void main(String[] args) throws InterruptedException {
        if (args.length == 0) {
          System.out.println("A configuration file must be passed as a parameter.");
          return;
        }
        
        Logger logger = (Logger) LoggerFactory.getLogger(FilterEvents.class);
        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
    
        try {
          JoranConfigurator configurator = new JoranConfigurator();
          configurator.setContext(lc);
          lc.reset();
          configurator.doConfigure(args[0]);
        } catch (JoranException je) {
          je.printStackTrace();
        }
        
        for (int i = 0; i < 10; i++) {
          if (i == 3)  {
            MDC.put("username", "sebastien");
            logger.debug("logging statement {}", i);
            MDC.remove("username");
          } else if (i == 6) {
            Marker billing = MarkerFactory.getMarker("billing");
            logger.error(billing, "billing statement {}", i);
          } else {
            logger.info("logging statement {}", i);
          }
        }
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/filters/turboFilters.xml���������������������0000644�0001750�0001750�00000001276�11377016712�027530� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <configuration>
    
      <turboFilter class="ch.qos.logback.classic.turbo.MDCFilter">
        <MDCKey>username</MDCKey>
        <Value>sebastien</Value>
        <OnMatch>ACCEPT</OnMatch>
      </turboFilter>
    
      <turboFilter class="ch.qos.logback.classic.turbo.MarkerFilter">
        <Marker>billing</Marker>
        <OnMatch>DENY</OnMatch>
      </turboFilter>
    
      <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
          <Pattern>%date [%thread] %-5level %logger - %msg%n</Pattern>
        </layout>
      </appender>
    
      <root level="info">
        <appender-ref ref="console" />
      </root>
    </configuration>����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/filters/mdcfilter.xml������������������������0000644�0001750�0001750�00000001325�11377016712�027010� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    
      <appender name="STDOUT"
                class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
          <Pattern>%-4relative [%thread] %-5level %X{testKey} - %msg%n"</Pattern>
        </layout>
    
        <filter class="ch.qos.logback.core.filter.EvaluatorFilter">  
          <Name>myFilter</Name>
          <OnMatch>DENY</OnMatch>
          <Evaluator class="ch.qos.logback.classic.boolex.JaninoEventEvaluator">
            <Name>mdcEvaluator</Name>
            <Expression>mdc!=null &amp;&amp; "val".equals(mdc.get("key"))</Expression>
          </Evaluator>
        </filter>
      </appender>
    
      <root level="debug">
        <appender-ref ref="STDOUT" />
      </root>
    </configuration>
    
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/filters/SampleFilter.java��������������������0000644�0001750�0001750�00000001677�12136042273�027554� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.filters;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.filter.Filter;
    import ch.qos.logback.core.spi.FilterReply;
    
    public class SampleFilter extends Filter<ILoggingEvent> {
    
      @Override
      public FilterReply decide(ILoggingEvent event) {
        if (event.getMessage() != null && event.getMessage().contains("sample")) {
          return FilterReply.ACCEPT;
        } else {
          return FilterReply.NEUTRAL;
        }
      }
    }
    �����������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/filters/sampleFilterConfig.xml���������������0000644�0001750�0001750�00000000550�11377016712�030613� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    
      <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="chapters.filters.SampleFilter" />
    
        <encoder>
          <pattern>
            %-4relative [%thread] %-5level %logger - %msg%n
          </pattern>
        </encoder>
      </appender>
    	
      <root>
        <appender-ref ref="STDOUT" />
      </root>
    </configuration>��������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/filters/basicConfiguration.xml���������������0000644�0001750�0001750�00000000526�11377016712�030652� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    
      <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
          <pattern>%-4relative [%thread] %-5level %logger - %msg%n</pattern>
        </layout>
      </appender>
    
      <root level="DEBUG">
        <appender-ref ref="STDOUT" />
      </root>
    </configuration>��������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/filters/SampleTurboFilter.java���������������0000644�0001750�0001750�00000003001�12136042273�030547� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.filters;
    
    import org.slf4j.Marker;
    import org.slf4j.MarkerFactory;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.turbo.TurboFilter;
    import ch.qos.logback.core.spi.FilterReply;
    
    public class SampleTurboFilter extends TurboFilter {
    
      String marker;
      Marker markerToAccept;
    
      @Override
      public FilterReply decide(Marker marker, Logger logger, Level level,
          String format, Object[] params, Throwable t) {
        
        if (!isStarted()) {
          return FilterReply.NEUTRAL;
        }
    
        if ((markerToAccept.equals(marker))) {
          return FilterReply.ACCEPT;
        } else {
          return FilterReply.NEUTRAL;
        }
      }
    
      public String getMarker() {
        return marker;
      }
    
      public void setMarker(String markerStr) {
        this.marker = markerStr;
      }
    
      @Override
      public void start() {
        if (marker != null && marker.trim().length() > 0) {
          markerToAccept = MarkerFactory.getMarker(marker);
          super.start(); 
        }
      }
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/filters/levelFilterConfig.xml����������������0000644�0001750�0001750�00000001007�11377016712�030437� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?>
    
    <configuration>
      <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
          <level>INFO</level>
          <onMatch>ACCEPT</onMatch>
          <onMismatch>DENY</onMismatch>
        </filter>
        <encoder>
          <pattern>%-4relative [%thread] %-5level %logger{30} - %msg%n</pattern>
        </encoder>
      </appender>
      <root level="DEBUG">
        <appender-ref ref="CONSOLE" />
      </root>
    </configuration>�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/filters/accessEventEvaluator.xml�������������0000644�0001750�0001750�00000001053�11473465041�031163� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
      <statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />
    
      <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
          <evaluator>
            <expression>event.getStatusCode() == 404</expression>
          </evaluator>
          <onMismatch>DENY</onMismatch>
          <onMatch>ACCEPT</onMatch>
        </filter>
    
       <encoder><pattern>%h %l %u %t %r %s %b</pattern></encoder>
      </appender>
    
      <appender-ref ref="STDOUT" />
    </configuration>�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/filters/duplicateMessage.xml�����������������0000644�0001750�0001750�00000000715�11377016712�030320� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <configuration>
    
      <turboFilter class="ch.qos.logback.classic.turbo.DuplicateMessageFilter" />
    
      <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
          <Pattern>%date [%thread] %-5level %logger - %msg%n</Pattern>
        </layout>
      </appender>
    
      <root level="info">
        <appender-ref ref="console" />
      </root>
    </configuration>���������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/�����������������������������������0000755�0001750�0001750�00000000000�12203357067�024625� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/ConfigurationTester.java�����������0000644�0001750�0001750�00000003616�12136042273�031467� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.appenders;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.slf4j.MDC;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.util.StatusPrinter;
    import chapters.appenders.sub.sample.Bar;
    
    /**
     * 
     * This class can be used to check the result of a configuration file.
     * 
     * @author S&eacute;bastien Pennec
     */
    public class ConfigurationTester {
    
      public static void main(String[] args) throws InterruptedException {
        Logger logger = (Logger) LoggerFactory.getLogger(ConfigurationTester.class);
        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
    
        try {
          JoranConfigurator configurator = new JoranConfigurator();
          configurator.setContext(lc);
          lc.reset();
          configurator.doConfigure(args[0]);
        } catch (JoranException je) {
          je.printStackTrace();
        }
        // After we've called Joran, let's print information about the
        // internal status of logback
        StatusPrinter.print(lc);
    
        logger.debug("**Hello {}", new Bar());
        MDC.put("testKey", "testValueFromMDC");
        MDC.put("testKey2", "value2");
        for (int i = 0; i < 10; i++) {
          logger.debug("logging statement " + i);
          Thread.sleep(100);
        }
        Bar bar = new Bar();
        bar.createLoggingRequest();
      }
    }
    ������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/socket/����������������������������0000755�0001750�0001750�00000000000�12203357067�026115� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/socket/client2.xml�����������������0000644�0001750�0001750�00000001440�12136042273�030171� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <!-- ==================================================================== -->
    <!-- Sample SocketReceiver configuration.                                 -->
    <!-- ==================================================================== -->
    
    <configuration debug="true">
    	  
      <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">    
        <encoder>
          <pattern>%date %-5level [%thread] %logger - %message%n</pattern>
        </encoder>
      </appender>
    
      <root level="DEBUG">
        <appender-ref ref="CONSOLE" />
      </root>  
      
      <receiver class="ch.qos.logback.classic.net.SocketReceiver">
        <host>${host}</host>
        <port>${port}</port>
        <reconnectionDelay>10000</reconnectionDelay>
      </receiver>
      
    </configuration>
    
    
    
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/socket/client1.xml�����������������0000644�0001750�0001750�00000001244�11377016712�030177� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <!-- ==================================================================== -->
    <!-- Sample SocketAppender configuration.                                 -->
    <!-- ==================================================================== -->
    
    <configuration>
    	  
      <appender name="SOCKET" class="ch.qos.logback.classic.net.SocketAppender">
        <RemoteHost>${host}</RemoteHost>
        <Port>${port}</Port>
        <ReconnectionDelay>10000</ReconnectionDelay>
        <IncludeCallerData>${includeCallerData}</IncludeCallerData>
      </appender>
    
      <root level="debug">
        <appender-ref ref="SOCKET" />
      </root>  
    
    </configuration>
    
    
    
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/socket/ConsolePluginClient.java����0000644�0001750�0001750�00000007225�12143151241�032673� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.appenders.socket;
    
    import org.slf4j.LoggerFactory;
    
    import ch.qos.logback.classic.Logger;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.net.SocketAppender;
    import ch.qos.logback.core.status.OnConsoleStatusListener;
    import ch.qos.logback.core.util.StatusPrinter;
    import static org.slf4j.Logger.ROOT_LOGGER_NAME;
    
    /**
     * Created with IntelliJ IDEA. User: ceki Date: 27.06.12 Time: 19:35 To change
     * this template use File | Settings | File Templates.
     */
    public class ConsolePluginClient {
    
    	static String LONG_TEXT = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum lectus augue, pulvinar quis cursus nec, imperdiet nec ante. Cras sit amet arcu et enim adipiscing pellentesque. Suspendisse mi felis, dictum a lobortis nec, placerat in diam. Proin lobortis tortor at nunc facilisis aliquet. Praesent eget dignissim orci. Ut iaculis bibendum.";
    
    	static String LOGGER_NAME = "com.acme.myapp.foo";
    	static String UGLY_BETTY_LOGGER_NAME = "com.acme.myapp.UglyBetty";
    	static long SLEEP = 1;
    	static long RUN_LENGTH = 200 * 1000;
    
    	static public void main(String[] args) throws Exception {
    		// Create a SocketAppender connected to hostname:port with a
    		// reconnection delay of 10000 seconds.
    		String hostname = "localhost";
    		int port = 4321;
    		SocketAppender socketAppender = new SocketAppender();
    		socketAppender.setRemoteHost(hostname);
    		socketAppender.setPort(port);
    		socketAppender.setIncludeCallerData(true);
    		socketAppender.setReconnectionDelay(10000);
    
    		LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
    
    		socketAppender.setContext(lc);
    
    		lc.reset();
    
    		lc.getStatusManager().add(new OnConsoleStatusListener());
    		// SocketAppender options become active only after the execution
    		// of the next statement.
    		socketAppender.start();
    
    		Logger rootLogger = (Logger) LoggerFactory.getLogger(ROOT_LOGGER_NAME);
    		rootLogger.addAppender(socketAppender);
    
    		org.slf4j.Logger logger = LoggerFactory.getLogger(LOGGER_NAME);
    
    		UglyBetty ub = new UglyBetty("ugly-betty-thread-234");
    		ub.start();
    		for (int i = 0; i < RUN_LENGTH; i++) {
    			if (i % 3 == 0) {
    				logger.warn(i + " is divisible by 3");
    			} else {
    				toto(logger, i);
    			}
    			Thread.sleep(SLEEP);
    		}
    		ub.join();
    
    		StatusPrinter.print(lc);
    	}
    
    	/**
    	 * @param logger
    	 * @param i
    	 */
    	/**
    	 * @param logger
    	 * @param i
    	 */
    	static void toto(org.slf4j.Logger logger, int i) {
    		logger.debug("this is message number " + i);
    	}
    
    	static class UglyBetty extends Thread {
    		org.slf4j.Logger logger = LoggerFactory
    				.getLogger(UGLY_BETTY_LOGGER_NAME);
    
    		public UglyBetty(String name) {
    			super(name);
    		}
    
    		public void run() {
    			for (int i = 0; i < RUN_LENGTH; i++) {
    				if (i % 23 == 0) {
    					logger.warn(LONG_TEXT);
    				} else if (i % 47 == 0) {
    					logger.error("this is an exception", new Exception("test"));
    				} else {
    					count(logger, i);
    				}
    				try {
    					Thread.sleep(SLEEP);
    				} catch (InterruptedException e) {
    					e.printStackTrace();
    				}
    			}
    		}
    
    		void count(org.slf4j.Logger logger, int i) {
    			logger.debug("Betty counts to " + i);
    		}
    	}
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/socket/ssl/������������������������0000755�0001750�0001750�00000000000�12203357067�026716� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/socket/ssl/keystore.jks������������0000644�0001750�0001750�00000004170�12136042147�031271� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback-classic-ssl-test��=\���00
    +*�.6Z>6abjx!seC"7vneR\"f"Tb'!CXjE|=\196>
    ~S@'B"
    J1}3Pxn	b[BF--'U'bZdxO�<
    \+r
    
    #?V:~**SL@(Ni:9|IU8VMk</ %Ѹf$*/Oc2%ʽhU%'O~u-oϲ?lH*<.]g
    m?SRm\m`}I)̎T9ܠ#5(k޺1%M}o}`$$<ZbYE$('eX\Gbs-b3DM UQ{n+[D44Ҿij\˭7Z
    3x-$S(7=Yܸ@l~uJbz*a.)eݕ<P
    B\~s[<PJspKCYE|F_rƌv2;bM66my*v1/Uր%	,uKmX0Ԋ앃U�B	YݤպE%	R"�i&LZYV+*3"A[âm)j[^Sӆhm(@v[nC:fe3~F`cȢŭ%hSZ_ltd3}0#mɋ&l-?I2A
    gҚFszR`0y=c8ڿLs	[4?]r5gG5dʔ�beVqʝk0BFf(LYu/lƭlDI$0CDfϓ-xo)C|f:T ~M[K (G9V1!_ONO9"µjV
    %:xq od\B&ud_0`އw'TJED>ldk
    ;=6`od%T`/5E#i[Z$j;+áP
    ؏g7i;		:\%wdk@;ץaf$SAݩ{4芶5_{:
    ܔg6{, Ն}}e hUV5}(1#֑ƬKAoDʝ|55;P����X.509��00	�q0r10
    	*H
    �0#1!0Ulogback-classic-ssl-test0 
    130324200226Z21000303200226Z0#1!0Ulogback-classic-ssl-test0"0
    	*H
    ��0
    �3XʽTehyZ‹OonY?FB={
    /e0Q:O^LuÇdY'/e{-Z"!!kjH#wF.{2	s3~,;;݁`@Z;G JmڿdE_;ӽnjSa]F/>EF:3󭀺]zyT#J5SXd3/p(W4
    k
    [cPF�ȡĂ�P0N0U7gW٠ {kک?e0U#07gW٠ {kک?e0U00
    	*H
    ��(=lA)tc;ʫy-?>$ÆOu�Ydu~$nMӬk;2}7 uh澱=?[2.b65iv37|-w6M|0{\qESM3
    WcU1P$\ppQ&paƔP&/ T9)<z _~A5.	2 ̙O=dj('6r06Wª~n`��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/socket/ssl/truststore.jks����������0000644�0001750�0001750�00000001535�12136042147�031664� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mykey��=kL�X.509��00	�q0r10
    	*H
    �0#1!0Ulogback-classic-ssl-test0 
    130324200226Z21000303200226Z0#1!0Ulogback-classic-ssl-test0"0
    	*H
    ��0
    �3XʽTehyZ‹OonY?FB={
    /e0Q:O^LuÇdY'/e{-Z"!!kjH#wF.{2	s3~,;;݁`@Z;G JmڿdE_;ӽnjSa]F/>EF:3󭀺]zyT#J5SXd3/p(W4
    k
    [cPF�ȡĂ�P0N0U7gW٠ {kک?e0U#07gW٠ {kک?e0U00
    	*H
    ��(=lA)tc;ʫy-?>$ÆOu�Ydu~$nMӬk;2}7 uh澱=?[2.b65iv37|-w6M|0{\qESM3
    WcU1P$\ppQ&paƔP&/ T9)<z _~A5.	2 ̙O=dj(]ޤ2!TKU�������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/socket/ssl/client.xml��������������0000644�0001750�0001750�00000001411�12136042273�030706� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <!-- ==================================================================== -->
    <!-- Sample SSLSocketAppender configuration.                              -->
    <!-- ==================================================================== -->
    
    <configuration debug="true">
    	  
      <appender name="SOCKET" class="ch.qos.logback.classic.net.SSLSocketAppender">
        <remoteHost>${host}</remoteHost>
        <port>${port}</port>
        <reconnectionDelay>10000</reconnectionDelay>
        <ssl>
          <trustStore>
            <location>${truststore}</location>
            <password>${password}</password>
          </trustStore>
        </ssl>
      </appender>
    
      <root level="debug">
        <appender-ref ref="SOCKET" />
      </root>  
    
    </configuration>
    
    
    
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/socket/ssl/server.xml��������������0000644�0001750�0001750�00000001147�12136042273�030744� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <!-- ==================================================================== -->
    <!-- Sample SimpleSSLSocketServer configuration.                          -->
    <!-- ==================================================================== -->
    
    <configuration debug="true">
    
      <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
          <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
        </encoder>
      </appender>
      
      <root level="debug">
        <appender-ref ref="CONSOLE" />
      </root>
      
    </configuration>
    
    
    
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/socket/SocketClient2.java����������0000644�0001750�0001750�00000004163�12136042273�031430� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.appenders.socket;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    
    
    /**
     * This application uses a SocketAppender that log messages to a
     * server on a host and port specified by the user. It waits for the
     * user to type a message which will be sent to the server.
     * */
    public class SocketClient2 {
      static void usage(String msg) {
        System.err.println(msg);
        System.err.println("Usage: java " + SocketClient2.class.getName() +
          " configFile\n" +
          "   configFile a logback configuration file" +
          "   in XML format.");
        System.exit(1);
      }
    
      static public void main(String[] args) throws Exception {
        if (args.length != 1) {
          usage("Wrong number of arguments.");
        }
    
        String configFile = args[0];
    
        if (configFile.endsWith(".xml")) {
          LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
          JoranConfigurator configurator = new JoranConfigurator();
          lc.stop();
          configurator.setContext(lc);
          configurator.doConfigure(configFile);
        }
    
        Logger logger = LoggerFactory.getLogger(SocketClient2.class);
    
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    
        while (true) {
          System.out.println(
            "Type a message to send to log server. Type 'q' to quit.");
    
          String s = reader.readLine();
    
          if (s.equals("q")) {
            break;
          } else {
            logger.debug(s);
          }
        }
      }
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/socket/SocketClient1.java����������0000644�0001750�0001750�00000005027�12143151241�031421� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.appenders.socket;
    
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    
    import org.slf4j.LoggerFactory;
    
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.net.SocketAppender;
    
    
    /**
     * This application uses a SocketAppender that log messages to a
     * server on a host and port specified by the user. It waits for the
     * user to type a message which will be sent to the server.
     * */
    public class SocketClient1 {
      static void usage(String msg) {
        System.err.println(msg);
        System.err.println("Usage: java " + SocketClient1.class.getName() +
          " hostname port\n" + "   hostname the name of the remote log server\n" +
          "   port (integer) the port number of the server\n");
        System.exit(1);
      }
    
      static public void main(String[] args) throws Exception {
        if (args.length != 2) {
          usage("Wrong number of arguments.");
        }
    
        String hostName = args[0];
        int port = Integer.parseInt(args[1]);
    
        // Create a SocketAppender connected to hostname:port with a
        // reconnection delay of 10000 seconds.
        SocketAppender socketAppender = new SocketAppender();
        socketAppender.setRemoteHost(hostName);
        socketAppender.setPort(port);
        socketAppender.setReconnectionDelay(10000);
        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
        socketAppender.setContext(lc);
    
        // SocketAppender options become active only after the execution
        // of the next statement.
        socketAppender.start();
    
        Logger logger = (Logger) LoggerFactory.getLogger(SocketClient1.class);
        logger.addAppender(socketAppender);
    
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    
        while (true) {
          System.out.println("Type a message to send to log server at " + hostName +
            ":" + port + ". Type 'q' to quit.");
    
          String s = reader.readLine();
    
          if (s.equals("q")) {
            break;
          } else {
            logger.debug(s);
          }
        }
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/socket/server1.xml�����������������0000644�0001750�0001750�00000003055�11377016712�030231� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <!-- ==================================================================== -->
    <!-- This config file is intended to be used by a SocketServer that logs  -->
    <!-- events received from various clients on the console and to a file    -->
    <!-- that is rolled over when appropriate. The interesting point to note  -->
    <!-- is that it is a configuration file like any other.                   -->   
    <!-- ==================================================================== -->
    
    <configuration>
    
      <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
      
        <layout class="ch.qos.logback.classic.PatternLayout">
          <Pattern>%date %-5level [%thread] %logger - %message%n</Pattern>
        </layout>	    
      
      </appender>
    
      <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>rolling.log</File>
        
    		<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
    			<FileNamePattern>rolling.%i.log</FileNamePattern>
    			<MinIndex>1</MinIndex>
    			<MaxIndex>3</MaxIndex>
    		</rollingPolicy>
    
    		<triggeringPolicy
    			class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
    			<MaxFileSize>8KB</MaxFileSize>
    		</triggeringPolicy>
    		
        <layout class="ch.qos.logback.classic.PatternLayout">
          <Pattern>%relative %-5level %logger - %message%n</Pattern>
        </layout>	    
      </appender>
    
      <root>
        <level value ="debug"/>
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="ROLLING" />
      </root>  
    </configuration>
    
    
    
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/socket/server2.xml�����������������0000644�0001750�0001750�00000001600�11377016712�030224� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <!-- ==================================================================== -->
    <!-- This config file is intended to be used by a SocketServer that logs  -->
    <!-- events received from various clients on the console. The interesting -->
    <!-- point to note is that it is a configuration file like any other.     -->   
    <!-- ==================================================================== -->
    
    <configuration>
    
      <!-- Notice the %file and %line patterns in the Pattern. -->	  
      <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
          <Pattern>%date %-5level [%thread] [%file:%line] %logger - %message%n</Pattern>
        </layout>	    
      </appender>
    
      <root>
        <level value ="debug"/>
        <appender-ref ref="CONSOLE" />
      </root>  
    </configuration>
    
    
    
    ��������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/sub/�������������������������������0000755�0001750�0001750�00000000000�11506604175�025416� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/sub/sample/������������������������0000755�0001750�0001750�00000000000�12203357067�026677� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/sub/sample/Bar.java����������������0000644�0001750�0001750�00000001754�12136042273�030250� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.appenders.sub.sample;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    public class Bar {
      Logger logger = LoggerFactory.getLogger(Bar.class);
      
      public String toString() {
        return "test 123";
      }
      
      public void createLoggingRequest() {
        subMethodToCreateRequest();
      }
      
      //this is done to create a stacktrace of more than one line
      private void subMethodToCreateRequest() {
        logger.error("error-level request", new Exception("test exception"));
      }
    }
    ��������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/mail/������������������������������0000755�0001750�0001750�00000000000�12203357067�025547� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/mail/EMail.java��������������������0000644�0001750�0001750�00000004146�12136042273�027401� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.appenders.mail;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.core.util.StatusPrinter;
    
    /**
     * This application generates log messages in numbers specified by the
     * user. 
     * */
    public class EMail {
      static public void main(String[] args) throws Exception {
        if (args.length != 2) {
          usage("Wrong number of arguments.");
        }
    
        int runLength = Integer.parseInt(args[0]);
        String configFile = args[1];
    
    
        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
        JoranConfigurator configurator = new JoranConfigurator();
        lc.reset();
        configurator.setContext(lc);
        configurator.doConfigure(configFile);
        
        Logger logger = LoggerFactory.getLogger(EMail.class);
    
        for (int i = 1; i <= runLength; i++) {
          if ((i % 10) < 9) {
            logger.debug("This is a debug message. Message number: " + i);
          } else {
            logger.warn("This is a warning message. Message number: " + i);
          }
        }
    
        logger.error("At last an error.", new Exception("Just testing"));
        
        StatusPrinter.printInCaseOfErrorsOrWarnings(lc);
      }
    
      static void usage(String msg) {
        System.err.println(msg);
        System.err.println("Usage: java " + EMail.class.getName() +
          " runLength configFile\n" +
          "   runLength (integer) the number of logs to generate\n" +
          "   configFile a logback configuration file in XML format." +
          " XML files must have a '.xml' extension.");
        System.exit(1);
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/mail/mailWithMarker_Janino.xml�����0000644�0001750�0001750�00000001354�11465030757�032515� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <configuration>
      <statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />  
    
      <appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
        <evaluator class="ch.qos.logback.classic.boolex.JaninoEventEvaluator">
          <expression>
            (marker != null) &amp;&amp;
            (marker.contains("NOTIFY_ADMIN") || marker.contains("TRANSACTION_FAILURE"))
          </expression>
        </evaluator>
        <SMTPHost>${smtpHost}</SMTPHost>
        <To>${to}</To>
        <From>${from}</From>
        <layout class="ch.qos.logback.classic.html.HTMLLayout"/>
      </appender>
    
      <root>
        <level value ="debug"/>
        <appender-ref ref="EMAIL" />
      </root>  
    </configuration>
    
    
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/mail/mail1.xml���������������������0000644�0001750�0001750�00000001112�11466176513�027274� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    	  
      <appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
        <smtpHost>ADDRESS-OF-YOUR-SMTP-HOST</smtpHost>
        <to>EMAIL-DESTINATION</to>
        <to>ANOTHER_EMAIL_DESTINATION</to> <!-- additional destinations are possible -->
        <from>SENDER-EMAIL</from>
        <subject>%logger{20} - %m</subject>
        <layout class="ch.qos.logback.classic.PatternLayout">
          <pattern>%date %-5level %logger - %message%n</pattern>
        </layout>	    
      </appender>
    
      <root level="debug">
        <appender-ref ref="EMAIL" />
      </root>  
    </configuration>
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/mail/mail2.xml���������������������0000644�0001750�0001750�00000000665�11465767355�027322� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <configuration>
    	  
      <appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
        <SMTPHost>${smtpHost}</SMTPHost>
        <To>${to}</To>
        <From>${from}</From>
        <Subject>%logger{20} - %m</Subject>
        <Layout class="ch.qos.logback.classic.html.HTMLLayout"/>
      </appender>
    
      <root level="debug">
        <appender-ref ref="EMAIL" />
      </root>  
    </configuration>
    
    
    ���������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000150�00000000000�011561� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/mail/mailWithMDCBasedDiscriminator.xml�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/mail/mailWithMDCBasedDiscriminator.0000644�0001750�0001750�00000001402�11413355407�033334� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
    <configuration>
      <appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
    
        <SMTPHost>ADDRESS-OF-YOUR-SMTP-HOST</SMTPHost>
        <to>EMAIL-DESTINATION</to>
        <from>SENDER-EMAIL</from>
    
    
        <discriminator class="ch.qos.logback.classic.sift.MDCBasedDiscriminator">
          <key>req.remoteHost</key>
          <defaultValue>default</defaultValue>
        </discriminator>
    
        <subject>${HOSTNAME} -- %X{req.remoteHost} %msg"</subject>
        <layout class="ch.qos.logback.classic.html.HTMLLayout">
          <pattern>%date%level%thread%X{req.remoteHost}%X{req.requestURL}%X{req.queryString}%logger%msg</pattern>
        </layout>
      </appender>
    
      <root>
        <level level="DEBUG"/>
        <appender-ref ref="EMAIL" />
      </root>  
    </configuration>
    
    
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/mail/gmailSTARTTLS.xml�������������0000644�0001750�0001750�00000001365�11377016712�030570� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>	  
      <appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
        <SMTPHost>smtp.gmail.com</SMTPHost>
        <SMTPPort>587</SMTPPort>
        <STARTTLS>true</STARTTLS>
        <Username>YOUR_USERNAME@gmail.com</Username>
        <Password>YOUR_GMAIL_PASSWORD</Password> 
        
        <To>EMAIL-DESTINATION</To>
        <To>ANOTHER_EMAIL_DESTINATION</To> <!-- additional destinations are possible -->
        <From>YOUR_USERNAME@gmail.com</From>
        <Subject>TESTING: %logger{20} - %m</Subject>
        <layout class="ch.qos.logback.classic.PatternLayout">
          <Pattern>%date %-5level %logger - %message%n</Pattern>
        </layout>	    
      </appender>
    
      <root level="debug">
        <appender-ref ref="EMAIL" />
      </root>  
    </configuration>
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/mail/Marked_EMail.java�������������0000644�0001750�0001750�00000004426�12136042273�030665� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.appenders.mail;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.slf4j.Marker;
    import org.slf4j.MarkerFactory;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.core.util.StatusPrinter;
    
    /**
     * This application generates a number of message many of which are of LEVEL.
     * However, only one message bears the  "NOTIFY_ADMIN" marker.
     * */
    public class Marked_EMail {
      static public void main(String[] args) throws Exception {
        if (args.length != 1) {
          usage("Wrong number of arguments.");
        }
    
        String configFile = args[0];
    
        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
        JoranConfigurator configurator = new JoranConfigurator();
        lc.reset();
        configurator.setContext(lc);
        configurator.doConfigure(configFile);
        StatusPrinter.printInCaseOfErrorsOrWarnings(lc);
    
        Logger logger = LoggerFactory.getLogger(Marked_EMail.class);
    
        int runLength = 100;
        for (int i = 1; i <= runLength; i++) {
          if ((i % 10) < 9) {
            logger.debug("This is a debug message. Message number: " + i);
          } else {
            logger.error("This is an error message. Message number: " + i);
          }
        }
    
        Marker notifyAdmin = MarkerFactory.getMarker("NOTIFY_ADMIN");
        logger.error(notifyAdmin,
            "This is a serious an error requiring the admin's attention",
            new Exception("Just testing"));
    
        StatusPrinter.printInCaseOfErrorsOrWarnings(lc);
      }
    
      static void usage(String msg) {
        System.err.println(msg);
        System.err.println("Usage: java " + Marked_EMail.class.getName()
            + " configFile\n"
            + "   configFile a logback configuration file in XML format.");
        System.exit(1);
      }
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/mail/gmailSSL.xml������������������0000644�0001750�0001750�00000001354�11377016712�027747� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    	  
      <appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
        <SMTPHost>smtp.gmail.com</SMTPHost>
        <SMTPPort>465</SMTPPort>
        <SSL>true</SSL>
        <Username>YOUR_USERNAME@gmail.com</Username>
        <Password>YOUR_GMAIL_PASSWORD</Password>
        
        <To>EMAIL-DESTINATION</To>
        <To>ANOTHER_EMAIL_DESTINATION</To> <!-- additional destinations are possible -->
        <From>YOUR_USERNAME@gmail.com</From>
        <Subject>TESTING: %logger{20} - %m</Subject>
        <layout class="ch.qos.logback.classic.PatternLayout">
          <Pattern>%date %-5level %logger - %message%n</Pattern>
        </layout>	    
      </appender>
    
      <root level="debug">
        <appender-ref ref="EMAIL" />
      </root>  
    </configuration>
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/mail/mailWithMarker.xml������������0000644�0001750�0001750�00000001316�11465030757�031215� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <configuration>
      <statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />  
    
      <appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
        <evaluator class="ch.qos.logback.classic.boolex.OnMarkerEvaluator">
          <marker>NOTIFY_ADMIN</marker>
          <!-- you specify add as many markers as you want -->
          <marker>ANOTHER_MARKER</marker>
        </evaluator>
        <SMTPHost>${smtpHost}</SMTPHost>
        <To>${to}</To>
        <From>${from}</From>
        <layout class="ch.qos.logback.classic.html.HTMLLayout"/>
      </appender>
    
      <root>
        <level value ="debug"/>
        <appender-ref ref="EMAIL" />
      </root>  
    </configuration>
    
    
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/mail/customBufferSize.xml����������0000644�0001750�0001750�00000001042�12136177166�031572� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>   
      <appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
    
        <Subject>TESTING: %logger{20} - %m</Subject>
    
        <SMTPHost>${smtpHost}</SMTPHost>
        <To>${to}</To>
        <From>${from}</From>
        <layout class="ch.qos.logback.classic.html.HTMLLayout"/>
    
    
        <CyclicBufferTracker class="ch.qos.logback.core.spi.CyclicBufferTracker">
          <BufferSize>1</BufferSize>
        </CyclicBufferTracker>
      </appender>
    
      <root level="DEBUG">
        <appender-ref ref="EMAIL" />
      </root>  
    </configuration>  ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000151�00000000000�011562� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/mail/mailWithMarker_GEventEvaluator.xml������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/mail/mailWithMarker_GEventEvaluator0000644�0001750�0001750�00000001306�11465030757�033550� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <configuration>
      <statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />  
    
      <appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
        <evaluator class="ch.qos.logback.classic.boolex.GEventEvaluator">
          <expression>
            e.marker?.contains("NOTIFY_ADMIN") || e.marker?.contains("TRANSACTION_FAILURE")
          </expression>
        </evaluator>
        <SMTPHost>${smtpHost}</SMTPHost>
        <To>${to}</To>
        <From>${from}</From>
        <layout class="ch.qos.logback.classic.html.HTMLLayout"/>
      </appender>
    
      <root>
        <level value ="debug"/>
        <appender-ref ref="EMAIL" />
      </root>  
    </configuration>
    
    
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/mail/CounterBasedEvaluator.java����0000644�0001750�0001750�00000002757�12136042273�032661� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.appenders.mail;
    
    import ch.qos.logback.core.boolex.EvaluationException;
    import ch.qos.logback.core.boolex.EventEvaluator;
    import ch.qos.logback.core.spi.ContextAwareBase;
    
    /**
     * A simple EventEvaluator implementation that triggers email transmission after
     * 1024 events regardless of event level.
     */
    public class CounterBasedEvaluator extends ContextAwareBase implements EventEvaluator {
    
      static int LIMIT = 1024;
      int counter = 0;
      String name;
      boolean started;
    
      public boolean evaluate(Object event) throws NullPointerException,
          EvaluationException {
        counter++;
    
        if (counter == LIMIT) {
          counter = 0;
    
          return true;
        } else {
          return false;
        }
      }
    
      public String getName() {
        return name;
      }
    
      public void setName(String name) {
        this.name = name;
      }
    
      public boolean isStarted() {
        return started;
      }
    
      public void start() {
        started = true;
      }
    
      public void stop() {
        started = false;
      }
    }
    �����������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/mail/mail3.xml���������������������0000644�0001750�0001750�00000001453�11465767435�027316� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <!-- ============================================================= -->
    <!-- Sample SMTPAppender configuration using the HTMLLayout and a  --> 
    <!-- custom triggering policy.                                     -->
    <!-- ============================================================= -->
    
    <configuration>
      <appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
        <Evaluator class="chapters.appenders.mail.CounterBasedEvaluator" />
        <SMTPHost>${smtpHost}</SMTPHost>
        <To>${to}</To>
        <From>${from}</From>
        <subject>%logger{20} - %m</subject>
        <layout class="ch.qos.logback.classic.html.HTMLLayout"/>
      </appender>
    
      <root>
        <level value ="debug"/>
        <appender-ref ref="EMAIL" />
      </root>  
    </configuration>
    
    
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/IO.java����������������������������0000644�0001750�0001750�00000012647�12136213375�026007� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.appenders;
    
    import org.slf4j.Logger;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.FileAppender;
    import ch.qos.logback.core.encoder.EchoEncoder;
    
    public class IO extends Thread {
      static String msgLong = "ABCDEGHIJKLMNOPQRSTUVWXYZabcdeghijklmnopqrstuvwxyz1234567890";
      static String msgShort = "Hello";
      static boolean scarceCPU;
      static int numThreads;
      static long l;
      static boolean longMessage;
      long len;
      boolean buffered;
      boolean immediateFlush;
      Logger logger;
      LoggerContext context;
      double throughput;
    
      public IO(boolean _buffered, boolean _immediateFlush, long _len) {
        this.len = _len;
        this.buffered = _buffered;
        this.immediateFlush = _immediateFlush;
        context = new LoggerContext();
        logger = context.getLogger("logger-" + getName());
    
        // A FileAppender is created according to the buffering and
        // immediate flush setting of this IO instance.
        FileAppender<ILoggingEvent> fa = new FileAppender<ILoggingEvent>();
    
        if (longMessage) {
          PatternLayoutEncoder pa = new PatternLayoutEncoder();
          pa.setPattern("%r %5p %c [%t] - %m%n");
          pa.setContext(context);
          pa.start();
          fa.setEncoder(pa);
        } else {
          fa.setEncoder(new EchoEncoder<ILoggingEvent>());
        }
    
        fa.setFile(getName() + ".log");
        fa.setAppend(false);
        fa.setContext(context);
        fa.start();
        
      }
    
      public static void main(String[] argv) throws Exception {
        if (argv.length != 4) {
          usage("Wrong number of arguments.");
        }
    
        l = Integer.parseInt(argv[0]);
        numThreads = Integer.parseInt(argv[1]);
        scarceCPU = "true".equalsIgnoreCase(argv[2]);
        longMessage = "long".equalsIgnoreCase(argv[3]);
    
        // ----------------------------------------------------
        // first test with unbuffered IO and immediate flushing
        perfCase(false, true, l);
    
        // ----------------------------------------------------
        // Second test with unbuffered IO and no immediate flushing
        perfCase(false, false, l);
    
        // ----------------------------------------------------
        // Third test with buffered IO and no immediate flushing
        perfCase(true, false, l);
    
        // There is no fourth test as buffered IO and immediate flushing
        // do not make sense.
      }
    
      static void usage(String msg) {
        System.err.println(msg);
        System.err.println("Usage: java " + IO.class.getName() +
          " runLength numThreads scarceCPU (short|long)\n" +
          "   runLength (integer) the number of logs to generate perthread\n" +
          "   numThreads (integer) the number of threads.\n" +
          "   scarceCPU (boolean) if true an additional CPU intensive thread is created\n" +
          "   (short|long) length of log messages.");
        System.exit(1);
      }
    
      static void perfCase(boolean buffered, boolean immediateFlush, long len)
        throws Exception {
        IO[] threads = new IO[numThreads];
        Counter counterThread = null;
    
        if (scarceCPU) {
          counterThread = new Counter();
          counterThread.start();
        }
    
        // First create the threads 
        for (int i = 0; i < numThreads; i++) {
          threads[i] = new IO(buffered, immediateFlush, len);
        }
    
        // then start them
        for (int i = 0; i < numThreads; i++) {
          threads[i].start();
        }
    
        // wait for them to processPriorToRemoval, compute the average throughput
        double sum = 0;
    
        for (int i = 0; i < numThreads; i++) {
          threads[i].join();
          sum += threads[i].throughput;
        }
    
        if (scarceCPU) {
          // setting the interrupted field will cause counterThread to processPriorToRemoval
          counterThread.interrupted = true;
          counterThread.join();
        }
    
        System.out.println("On average throughput of " + (sum / numThreads)*1000 +
          " logs per microsecond.");
        System.out.println("------------------------------------------------");
      }
    
      public void run() {
        String msg = msgShort;
    
        if (longMessage) {
          msg = msgLong;
        }
    
        long before = System.nanoTime();
    
        for (int i = 0; i < len; i++) {
          logger.debug(msg);
        }
    
        throughput = (len * 1.0) / (System.nanoTime() - before);
        System.out.println(getName() + ", buffered: " + buffered +
          ", immediateFlush: " + immediateFlush + ", throughput: " + throughput +
          " logs per nanosecond.");
      }
    }
    
    
    class Counter extends Thread {
      public boolean interrupted = false;
      public double counter = 0;
    
      public void run() {
        long before = System.nanoTime();
    
        while (!interrupted) {
          if(counter % 1000 == 0) {
              Thread.yield();
          }
          counter += 1.0;
        }
    
        double tput = (counter * 1.0) / (System.nanoTime() - before);
        System.out.println("Counter thread " + getName() +
          " incremented counter by " + tput + " per nanosecond.");
      }
    }
    �����������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/CountingConsoleAppender.java�������0000644�0001750�0001750�00000003363�12136042273�032260� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.appenders;
    
    import java.io.IOException;
    
    import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.AppenderBase;
    
    
    public class CountingConsoleAppender extends AppenderBase<ILoggingEvent> {
      static int DEFAULT_LIMIT = 10;
      int counter = 0;
      int limit = DEFAULT_LIMIT;
      
      PatternLayoutEncoder encoder;
      
      public void setLimit(int limit) {
        this.limit = limit;
      }
    
      public int getLimit() {
        return limit;
      }  
      
      @Override
      public void start() {
        if (this.encoder == null) {
          addError("No encoder set for the appender named ["+ name +"].");
          return;
        }
        
        try {
          encoder.init(System.out);
        } catch (IOException e) {
        }
        super.start();
      }
    
      public void append(ILoggingEvent event) {
        if (counter >= limit) {
          return;
        }
        // output the events as formatted by the wrapped layout
        try {
          this.encoder.doEncode(event);
        } catch (IOException e) {
        }
    
       // prepare for next event
        counter++;
      }
    
      public PatternLayoutEncoder getEncoder() {
        return encoder;
      }
    
      public void setEncoder(PatternLayoutEncoder encoder) {
        this.encoder = encoder;
      }
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/sift/������������������������������0000755�0001750�0001750�00000000000�12203357067�025572� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/sift/SiftExample.java��������������0000644�0001750�0001750�00000003232�12136042273�030651� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.appenders.sift;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.slf4j.MDC;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.core.joran.spi.JoranException;
    
    public class SiftExample {
    
      public static void main(String[] args) throws JoranException {
        if (args.length != 1) {
          usage("Wrong number of arguments.");
        }
    
        String configFile = args[0];
    
        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
        JoranConfigurator configurator = new JoranConfigurator();
        lc.reset();
        configurator.setContext(lc);
        configurator.doConfigure(configFile);
       
        
        Logger logger = LoggerFactory.getLogger(SiftExample.class);
        logger.debug("Application started");
        
        MDC.put("userid", "Alice");
        logger.debug("Alice says hello");
        
        //StatusPrinter.print(lc);
      }
    
      static void usage(String msg) {
        System.err.println(msg);
        System.err.println("Usage: java " + SiftExample.class.getName()
            + " configFile\n" + "   configFile a logback configuration file");
        System.exit(1);
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/sift/access-siftingFile.xml��������0000644�0001750�0001750�00000001224�11377016712�032015� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    
      <appender name="SIFTING"
        class="ch.qos.logback.access.sift.SiftingAppender">
        <Discriminator>
          <Key>id</Key>
          <FieldName>SESSION_ATTRIBUTE</FieldName>
          <AdditionalKey>username</AdditionalKey>
          <DefaultValue>NA</DefaultValue>
        </Discriminator>
        <sift>
          <appender name="${id}" class="ch.qos.logback.core.FileAppender">
            <File>byUser/${id}.log</File>
            <layout class="ch.qos.logback.access.PatternLayout">
              <Pattern>%h %l %u %t \"%r\" %s %b</Pattern>
            </layout>
          </appender>
        </sift>
      </appender>
    
      <appender-ref ref="SIFTING" />
    </configuration>����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/sift/byUserid.xml������������������0000644�0001750�0001750�00000001226�11377016712�030103� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
      <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
        <discriminator>
          <Key>userid</Key>
          <DefaultValue>unknown</DefaultValue>
        </discriminator>
        <sift>
          <appender name="FILE-${userid}" class="ch.qos.logback.core.FileAppender">
            <File>${userid}.log</File>s
            <Append>false</Append>
            <layout class="ch.qos.logback.classic.PatternLayout">
              <Pattern>%d [%thread] %level %mdc %logger{35} - %msg%n</Pattern>
            </layout>
          </appender>
        </sift>
      </appender>
    
      <root level="DEBUG">
        <appender-ref ref="SIFT" />
      </root>
    </configuration>
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/conf/������������������������������0000755�0001750�0001750�00000000000�12203357067�025552� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/conf/logback-RollingSizeBased.xml��0000644�0001750�0001750�00000001360�11377016712�033074� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    
      <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>test.log</file>                                        
        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
          <fileNamePattern>test.%i.log.zip</fileNamePattern>
          <minIndex>1</minIndex>
          <maxIndex>3</maxIndex>
        </rollingPolicy>
    
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
          <maxFileSize>5MB</maxFileSize>
        </triggeringPolicy>
        <encoder>
          <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
        </encoder>
      </appender>
    	
    	<root level="DEBUG">
    		<appender-ref ref="FILE" />
    	</root>
    </configuration>
    
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/conf/logback-JMSQueue.xml����������0000644�0001750�0001750�00000001005�11377016712�031326� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    
    	<appender name="Queue" class="ch.qos.logback.classic.net.JMSQueueAppender">
    		<InitialContextFactoryName>
    			org.apache.activemq.jndi.ActiveMQInitialContextFactory
    		</InitialContextFactoryName>
    		<ProviderURL>tcp://localhost:61616</ProviderURL>
    		<QueueConnectionFactoryBindingName>
    			ConnectionFactory
    		</QueueConnectionFactoryBindingName>
    		<QueueBindingName>MyQueue</QueueBindingName>
    	</appender>
    
    	<root level="debug">
    		<appender-ref ref="Queue" />
    	</root>
    </configuration>���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/conf/logback-fileAppender.xml������0000644�0001750�0001750�00000000713�11377016712�032273� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    
    	<appender name="FILE" class="ch.qos.logback.core.FileAppender">
    		<file>testFile.log</file>
    		<append>true</append>
    		
       <!-- encoders are assigned the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
    		<encoder>
    			<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
    		</encoder>
    	</appender>
    	
    	<root level="DEBUG">
    		<appender-ref ref="FILE" />
    	</root>
    </configuration>�����������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/conf/logback-SMTPWithHtml.xml������0000644�0001750�0001750�00000001201�11377016712�032132� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    
      <appender name="SMTP" class="ch.qos.logback.classic.net.SMTPAppender">
        <layout class="ch.qos.logback.classic.html.HTMLLayout">
          <pattern>%relative%thread%mdc%level%class%msg</pattern>
          <throwableRenderer class="ch.qos.logback.classic.html.DefaultThrowableRenderer" />      
        </layout>
        <from>sender_email@host.ch</from>                          
        <SMTPHost>mail.host.ch</SMTPHost>
        
        <subject>Last Event: %-10logger %nopex</subject>
        
        <to>recipient_email@host.ch</to>
      </appender>
    
      <root level="debug">
        <appender-ref ref="SMTP" />
      </root>
    </configuration>
    
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/conf/logback-timestamp.xml���������0000644�0001750�0001750�00000001241�11377016712�031675� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    
      <!-- Insert the current time formatted as "yyyyMMdd'T'HHmmss" under
           the key "bySecond" into the logger context. This value will be
           available to all subsequent configuration elements. -->
      <timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"/>
    
      <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <!-- use the previously created timestamp to create a uniquely
             named log file -->
        <file>log-${bySecond}.txt</file>
        <encoder>
          <pattern>%logger{35} - %msg%n</pattern>
        </encoder>
      </appender>
    
      <root level="DEBUG">
        <appender-ref ref="FILE" />
      </root>
    </configuration>
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/conf/logback-syslog.xml������������0000644�0001750�0001750�00000000545�11377016712�031220� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    
      <appender name="SYSLOG" class="ch.qos.logback.classic.net.SyslogAppender">
        <syslogHost>${syslogHost}</syslogHost>
        <facility>${facility}</facility>
        <suffixPattern>%-4relative [%thread] %-5level - %msg</suffixPattern>
      </appender>
    	
    	<root level="DEBUG">
    		<appender-ref ref="SYSLOG" />
    	</root>
    </configuration>
    
    �����������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/conf/logback-RollingTimeBased.xml��0000644�0001750�0001750�00000001151�11377016712�033056� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    
       <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
       <file>logFile.log</file>
       <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
         <!-- daily rollover -->
         <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>
    
         <!-- keep 30 days worth of history -->
         <maxHistory>30</maxHistory> 
       </rollingPolicy>
    
       <encoder>
         <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
       </encoder>
     </appender> 
    
     <root level="DEBUG">
       <appender-ref ref="FILE" />
     </root>
    </configuration>�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/conf/logback-HtmlToConsole.xml�����0000644�0001750�0001750�00000001077�11377016712�032433� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    
      <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
          <layout class="ch.qos.logback.classic.html.HTMLLayout">
            <cssBuilder class="ch.qos.logback.classic.html.UrlCssBuilder">
              <url>path_to_StyleFile.css</url>
            </cssBuilder>	
            <pattern>%-4relative [%thread] %-5level - %msg%n</pattern>
          </layout>
        </encoder>
      </appender>
    
      <root level="DEBUG">
        <appender-ref ref="STDOUT" />
      </root>
    </configuration>
    
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/conf/logback-async.xml�������������0000644�0001750�0001750�00000000636�11761477231�031022� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
      <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>myapp.log</file>
        <encoder>
          <pattern>%logger{35} - %msg%n</pattern>
        </encoder>
      </appender>
    
      <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
        <appender-ref ref="FILE" />
      </appender>
    
      <root level="DEBUG">
        <appender-ref ref="ASYNC" />
      </root>
    </configuration>��������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000151�00000000000�011562� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/conf/logback-timestamp-contextBirth.xml������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/conf/logback-timestamp-contextBirth0000644�0001750�0001750�00000001341�11517502017�033544� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    
      <!-- Insert the logger context bith date formatted as
           "yyyyMMdd'T'HHmmss" under the key "bySecond" into the logger
           context. This value will be available to all subsequent
           configuration elements. -->
      <timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss" 
                 timeReference="contextBirth"/>
    
      <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <!-- use the previously created timestamp to create a uniquely
             named log file -->
        <file>log-${bySecond}.txt</file>
        <encoder>
          <pattern>%logger{35} - %msg%n</pattern>
        </encoder>
      </appender>
    
      <root level="DEBUG">
        <appender-ref ref="FILE" />
      </root>
    </configuration>
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/conf/logback-sizeAndTime.xml�������0000644�0001750�0001750�00000001517�11465032276�032115� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    
      <statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />
    
      <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>mylog.txt</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
          <!-- rollover daily -->
          <fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
          <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
            <!-- or whenever the file size reaches 100MB -->
            <maxFileSize>100MB</maxFileSize>
          </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder>
          <pattern>%msg%n</pattern>
        </encoder>
      </appender>
    
    
      <root level="debug">
        <appender-ref ref="ROLLING" />
      </root>
    
    </configuration>
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/conf/access/�����������������������0000755�0001750�0001750�00000000000�12203357067�027013� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/conf/access/logback-DB.xml���������0000644�0001750�0001750�00000000710�11377016712�031420� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    
    	<appender name="DB" class="ch.qos.logback.access.db.DBAppender">
    		<connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
    			<driverClass>com.mysql.jdbc.Driver</driverClass>
    			<url>jdbc:mysql://localhost:3306/logbackdb</url>
    			<user>logback</user>
    			<password>logback</password>
    		</connectionSource>
    		<insertHeaders>true</insertHeaders>
    	</appender>
    
      <appender-ref ref="DB" />
    </configuration>��������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/conf/access/logback-SMTP.xml�������0000644�0001750�0001750�00000001032�11377016712�031714� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    
    	<appender name="SMTP"
    		class="ch.qos.logback.access.net.SMTPAppender">
    		<layout class="ch.qos.logback.access.html.HTMLLayout">
    			<Pattern>%h%l%u%t%r%s%b</Pattern>
    		</layout>
    
    		<b>
    			<Evaluator class="ch.qos.logback.access.net.URLEvaluator">
    				<URL>url1.jsp</URL>
    				<URL>directory/url2.html</URL>
    			</Evaluator>
    		</b>
    		<From>sender_email@host.com</From>
    		<SMTPHost>mail.domain.com</SMTPHost>
    		<To>recipient_email@host.com</To>
    	</appender>
    
    	<appender-ref ref="SMTP" />
    </configuration>������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/conf/logback-SMTP.xml��������������0000644�0001750�0001750�00000001011�11377016712�030450� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    
      <appender name="SMTP" class="ch.qos.logback.classic.net.SMTPAppender">
        <encoder>
          <pattern>%-4relative [%thread] %-5level %class - %msg%n</pattern>
        </encoder>
        <from>sender_email@host.ch</from>                          
        <SMTPHost>mail.host.ch</SMTPHost>
        
        <subject>Last Event: %-10logger %nopex</subject>           
        
        <to>recipient_email@host.ch</to>
      </appender>
    
      <root level="debug">
        <appender-ref ref="SMTP" />
      </root>
    </configuration>
    
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/conf/logback-RollingFixedWindow.xml0000644�0001750�0001750�00000001320�11377016712�033446� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
      <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    
        <file>testFile.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
          <fileNamePattern>testFile.%i.log.zip</fileNamePattern>
          <minIndex>1</minIndex>
          <maxIndex>3</maxIndex>
        </rollingPolicy>
    
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
          <maxFileSize>5MB</maxFileSize>
        </triggeringPolicy>
        <encoder>
          <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
        </encoder>
      </appender>
    	
      <root level="DEBUG">
        <appender-ref ref="FILE" />
      </root>
    </configuration>����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/conf/logback-MDC.xml���������������0000644�0001750�0001750�00000000463�11377016712�030302� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    
      <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
          <pattern>%-4relative [%thread] %-5level %X{testKey} - %msg%n</pattern>
        </encoder>
      </appender>
    
      <root level="debug">
        <appender-ref ref="STDOUT" />
      </root>
    </configuration>
    
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000152�00000000000�011563� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/conf/logback-PrudentTimeBasedRolling.xml�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/conf/logback-PrudentTimeBasedRollin0000644�0001750�0001750�00000001142�11377016712�033452� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
       <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
       
       <!-- Support multiple-JVMs writing to the same log file -->
       <prudent>true</prudent>
       <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
         <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>
         <maxHistory>30</maxHistory> 
       </rollingPolicy>
    
       <encoder>
         <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
       </encoder>
      </appender> 
    
      <root level="DEBUG">
        <appender-ref ref="FILE" />
      </root>
    </configuration>������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/conf/logback-Console.xml�����������0000644�0001750�0001750�00000000635�11377016712�031302� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    
      <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- encoders are assigned the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
        <encoder>
          <pattern>%-4relative [%thread] %-5level - %msg%n</pattern>
        </encoder>
      </appender>
    
      <root level="DEBUG">
        <appender-ref ref="STDOUT" />
      </root>
    </configuration>
    
    ���������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/conf/programmatic/�����������������0000755�0001750�0001750�00000000000�12203357067�030237� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000151�00000000000�011562� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/conf/programmatic/LogbackOnConsole.java������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/conf/programmatic/LogbackOnConsole.0000644�0001750�0001750�00000003645�12133756451�033434� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.appenders.conf.programmatic;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
    import ch.qos.logback.core.ConsoleAppender;
    import org.slf4j.LoggerFactory;
    
    /**
     * Created with IntelliJ IDEA.
     * User: ceki
     * Date: 10.09.12
     * Time: 17:27
     * To change this template use File | Settings | File Templates.
     */
    public class LogbackOnConsole {
    
      public static void main(String[] args) {
        LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
        loggerContext.reset(); // optionally forget previous configuration
    
        PatternLayoutEncoder patternLayoutEncoder = new PatternLayoutEncoder();
        patternLayoutEncoder.setPattern("%-4relative [%thread] %-5level %logger{35} - %msg %n");
        patternLayoutEncoder.setContext(loggerContext);
        patternLayoutEncoder.start();
    
        ConsoleAppender consoleAppender = new ConsoleAppender();
        consoleAppender.setContext(loggerContext);
        consoleAppender.setName("CON");
        consoleAppender.setEncoder(patternLayoutEncoder);
        consoleAppender.start();
    
        Logger root = loggerContext.getLogger(Logger.ROOT_LOGGER_NAME);
        root.setLevel(Level.DEBUG);
        root.addAppender(consoleAppender);
    
    
        Logger testLogger = loggerContext.getLogger(LogbackOnConsole.class);
        testLogger.debug("hello world");
      }
    }
    �������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/conf/logback-JMSTopic.xml����������0000644�0001750�0001750�00000001006�11377016712�031321� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    
    	<appender name="Topic" class="ch.qos.logback.classic.net.JMSTopicAppender">
    		<InitialContextFactoryName>
    			org.apache.activemq.jndi.ActiveMQInitialContextFactory
    		</InitialContextFactoryName>
    		<ProviderURL>tcp://localhost:61616</ProviderURL>
    		<TopicConnectionFactoryBindingName>
    			ConnectionFactory
    		</TopicConnectionFactoryBindingName>
    		<TopicBindingName>MyTopic</TopicBindingName>
    	</appender>
    
      <root level="debug">
    		<appender-ref ref="Topic" />
    	</root>
    </configuration>��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/countingConsole.xml����������������0000644�0001750�0001750�00000000567�11377016712�030530� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <configuration>
    
    
      <appender name="CUSTOM" class="chapters.appenders.CountingConsoleAppender">
        <layout>
          <Pattern>%date [%thread] %-5level %logger - %msg%n</Pattern>
        </layout>
        <limit>5</limit>
      </appender>
    
      <root level="debug">
        <appender-ref ref="CUSTOM" />
      </root>  
    </configuration>
    
    
    
    �����������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/IOPerformance.java�����������������0000644�0001750�0001750�00000011722�12136213375�030162� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.appenders;
    
    import java.io.FileWriter;
    import java.io.IOException;
    
    import org.slf4j.Logger;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.FileAppender;
    import ch.qos.logback.core.util.StatusPrinter;
    
    public class IOPerformance extends Thread {
      static String MSG = "ABCDEGHIJKLMNOPQRSTUVWXYZabcdeghijklmnopqrstuvwxyz1234567890";
      static String LOG_FILE;
      public static String PARALLEL_FILE;
    
      static int NUM_THREADS = 1;
      static long l;
      long len;
      boolean immediateFlush;
      Logger logger;
      LoggerContext context;
      double throughput;
    
      public IOPerformance(boolean _immediateFlush, long _len) {
        this.len = _len;
        this.immediateFlush = _immediateFlush;
        context = new LoggerContext();
        logger = context.getLogger("logger-" + getName());
    
        // A FileAppender is created according to the buffering and
        // immediate flush setting of this IO instance.
        FileAppender<ILoggingEvent> fa = new FileAppender<ILoggingEvent>();
        fa.setName("FILE");
        PatternLayoutEncoder pa = new PatternLayoutEncoder();
        pa.setPattern("%r %5p %c [%t] - %m%n");
        pa.setContext(context);
        pa.start();
        fa.setEncoder(pa);
    
        fa.setFile(LOG_FILE);
        fa.setAppend(true);
        fa.setContext(context);
        fa.start();
    
        ((ch.qos.logback.classic.Logger) logger).addAppender(fa);
    
        StatusPrinter.print(context);
      }
    
      public static void main(String[] argv) throws Exception {
        if (argv.length != 3) {
          usage("Wrong number of arguments.");
        }
    
        l = Integer.parseInt(argv[0]);
        LOG_FILE = argv[1];
        PARALLEL_FILE = argv[2];
    
        // ----------------------------------------------------
        // first test with immediate flushing
        perfCase(true, l);
    
        // ----------------------------------------------------
        // Second test with no immediate flushing
        perfCase(false, l);
    
        // There is no fourth test as buffered IO and immediate flushing
        // do not make sense.
      }
    
      static void usage(String msg) {
        System.err.println(msg);
        System.err.println("Usage: java " + IOPerformance.class.getName()
            + " runLength logFile otherFile\n"
            + "   runLength (integer) the number of logs to generate perthread\n"
            + "   logFile path to a logFile\n"
            + "   otherFile path to a second file\n");
        System.exit(1);
      }
    
      static void perfCase(boolean immediateFlush, long len) throws Exception {
        IOPerformance[] threads = new IOPerformance[NUM_THREADS];
        OtherIO otherIOThread = new OtherIO();
        otherIOThread.start();
    
        // First create the threads
        for (int i = 0; i < NUM_THREADS; i++) {
          threads[i] = new IOPerformance(immediateFlush, len);
        }
    
        // then start them
        for (int i = 0; i < NUM_THREADS; i++) {
          threads[i].start();
        }
    
        // wait for them to processPriorToRemoval, compute the average throughput
        double sum = 0;
    
        for (int i = 0; i < NUM_THREADS; i++) {
          threads[i].join();
          sum += threads[i].throughput;
        }
    
        // setting the interrupted field will cause counterThread to processPriorToRemoval
        otherIOThread.interrupted = true;
        otherIOThread.join();
    
        System.out.println("On total throughput of " + (sum)
            + " logs per microsecond.");
        System.out.println("------------------------------------------------");
      }
    
      public void run() {
    
        long before = System.nanoTime();
    
        for (int i = 0; i < len; i++) {
          logger.debug(MSG);
        }
    
        throughput = (len * 1.0) / ((System.nanoTime() - before) / 1000);
        System.out.println(getName() + ", immediateFlush: " + immediateFlush
            + ", throughput: " + throughput + " logs per microsecond.");
      }
    }
    
    class OtherIO extends Thread {
      public boolean interrupted = false;
      public int counter = 0;
    
      public void run() {
        long before = System.nanoTime();
        try {
          FileWriter fw = new FileWriter(IOPerformance.PARALLEL_FILE, true);
    
          while (!interrupted) {
            counter++;
            fw.write("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
            fw.flush();
          }
        } catch (IOException e) {
          e.printStackTrace();
        }
    
        double tput = (counter * 1.0) / (System.nanoTime() - before);
        System.out.println("Counter thread " + getName()
            + " incremented counter by " + tput + " per nanosecond.");
      }
    }
    ����������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/db/��������������������������������0000755�0001750�0001750�00000000000�12203357067�025212� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/db/append-and-share-with-jndi.xml��0000644�0001750�0001750�00000002402�11764133561�032736� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <!-- WARNING -->
    <!-- WARNING BindDataSourceToJNDIAction is both untested and undocumented.  -->
    <!-- WARNING Just ignore this configuration file. -->
    <!-- WARNING -->
    
    <configuration>
      <!-- We create a joran rule that will instance and bind the appropriate
           data source instance to JNDI. -->
      <newRule pattern="configuration/bindDataSourceToJNDI"
               actionClass="ch.qos.logback.core.db.BindDataSourceToJNDIAction"/>
    
      <bindDataSourceToJNDI/>
    
      <appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
        <connectionSource class="ch.qos.logback.core.db.DataSourceConnectionSource">
    
          <dataSource class="${dataSourceClass}">
            <!-- Joran cannot handle element names which are variables themselves. In order to let  -->
            <!-- the property name vary, we use the <param> element.-->
            <param name="${url-key:-url}" value="${url}"/>
            <serverName>${serverName}</serverName>
            <databaseName>${databaseName}</databaseName>
          </dataSource>
    
          <user>${user}</user>
          <password>${password}</password>>
        </connectionSource>
      </appender>
    
      <root>
        <level value="debug"/>
        <appender-ref ref="DB"/>
      </root>
    
    </configuration>
    
    
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/db/append-with-datasource.xml������0000644�0001750�0001750�00000001523�11377016712�032305� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    	  
    <configuration>
    
      <appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
         <connectionSource class="ch.qos.logback.core.db.DataSourceConnectionSource">
           
           <dataSource class="${dataSourceClass}">
           	 <!-- Joran cannot substitute variables
           	 that are not attribute values. Therefore, we cannot
           	 declare the next parameter like the others. 
           	 -->
             <param name="${url-key:-url}" value="${url}"/>
             <serverName>${serverName}</serverName>
             <databaseName>${databaseName}</databaseName>
           </dataSource>
           
           <user>${user}</user>
           <password>${password}</password>
         </connectionSource>
      </appender>
    
      <root level="debug">
        <appender-ref ref="DB" />
      </root>  
    </configuration>
    
    
    
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/db/append-with-drivermanager.xml���0000644�0001750�0001750�00000000747�11764132056�033010� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <configuration>
    
      <appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
        <connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
          <driverClass>${driverClass}</driverClass>
          <url>${url}</url>
          <user>${user}</user>
          <password>${password}</password>
        </connectionSource>
      </appender>
    
      <root level="debug">
        <appender-ref ref="DB"/>
      </root>
    </configuration>
    
    
    �������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000152�00000000000�011563� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/db/append-toMySQL-with-driverManager.xml�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/db/append-toMySQL-with-driverManage0000644�0001750�0001750�00000000767�11377016712�033277� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <configuration>
    
    	<appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
    		<connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
    			<driverClass>com.mysql.jdbc.Driver</driverClass>
    			<url>jdbc:mysql://host_name:3306/datebase_name</url>
    			<user>username</user>
    			<password>password</password>
    		</connectionSource>
    	</appender>
    	
    	<root level="debug">
    		<appender-ref ref="DB" />
    	</root>
    </configuration>
    ���������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000146�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/db/append-with-pooled-datasource.xml���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/db/append-with-pooled-datasource.xm0000644�0001750�0001750�00000001716�11764132450�033413� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <configuration>
    
      <appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
         <connectionSource class="ch.qos.logback.core.db.DataSourceConnectionSource">
           
           <dataSource class="${pooledDataSourceClass}">
             <!-- Joran cannot handle element names which are variables themselves. In order to let  -->
             <!-- the property name vary, we use the <param> element.-->
             <param name="${url-key:-url}" value="${url}"/>
             <serverName>${serverName}</serverName>
             <databaseName>${databaseName}</databaseName>
             <user>${user}</user>
             <password>${password}</password>
                    
             <initialConnections>10</initialConnections>
             <maxConnections>10</maxConnections>
           </dataSource>
    
         </connectionSource>
      </appender>
    
      <root>
        <level value ="debug"/>
        <appender-ref ref="DB" />
      </root>  
    </configuration>
    
    
    ��������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/db/append-via-jndi.xml�������������0000644�0001750�0001750�00000000637�11764131726�030713� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration debug="true">
      <appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
        <connectionSource class="ch.qos.logback.core.db.JNDIConnectionSource">
          <!-- please note the "java:comp/env/" prefix -->
          <jndiLocation>java:comp/env/jdbc/logging</jndiLocation>
        </connectionSource>
      </appender>
      <root level="DEBUG">
        <appender-ref ref="DB"/>
      </root>
    </configuration>�������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000163�00000000000�011565� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/db/append-toMySQL-with-datasource-and-pooling.xml��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/db/append-toMySQL-with-datasource-a0000644�0001750�0001750�00000001100�11764132050�033213� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    
      <appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
        <connectionSource class="ch.qos.logback.core.db.DataSourceConnectionSource">
          <dataSource class="com.mchange.v2.c3p0.ComboPooledDataSource">
            <driverClass>com.mysql.jdbc.Driver</driverClass>
            <jdbcUrl>jdbc:mysql://localhost:3306/logbackdb</jdbcUrl>
            <user>logback</user>
            <password>logback</password>
          </dataSource>
        </connectionSource>
      </appender>
    
      <root level="debug">
        <appender-ref ref="DB"/>
      </root>
    </configuration>����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000147�00000000000�011567� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/db/append-toMySQL-with-datasource.xml��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/db/append-toMySQL-with-datasource.x0000644�0001750�0001750�00000001127�11377016712�033262� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    	  
    <configuration>
    
    	<appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
    		<connectionSource	class="ch.qos.logback.core.db.DataSourceConnectionSource">
    			<dataSource class="com.mysql.jdbc.jdbc2.optional.MysqlDataSource">
    				<serverName>${serverName}</serverName>
    				<port>${port$</port>
    				<databaseName>${dbName}</databaseName>
    				<user>${user}</user>
    				<password>${pass}</password>
    			</dataSource>
    		</connectionSource>
    	</appender>
        
    	<root level="debug">
    		<appender-ref ref="DB" />
    	</root>
    
    </configuration>�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/appenders/db/append-with-c3p0.xml������������0000644�0001750�0001750�00000001330�11764132554�030717� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    	  
    <configuration>
    
      <appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
         <connectionSource class="ch.qos.logback.core.db.DataSourceConnectionSource">
           <dataSource class="com.mchange.v2.c3p0.ComboPooledDataSource">
             <driverClass>${driverClass}</driverClass>
             <jdbcUrl>${url}</jdbcUrl>
             <serverName>${serverName}</serverName>
             <databaseName>${databaseName}</databaseName>
             <user>${user}</user>
             <password>${password}</password>
           </dataSource>
    
         </connectionSource>
      </appender>
      
      <root>
        <level value ="debug"/>
        <appender-ref ref="DB" />
      </root>  
    </configuration>
    
    
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/migrationFromLog4j/��������������������������0000755�0001750�0001750�00000000000�12203357067�026361� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/migrationFromLog4j/log4jTrivial.properties���0000644�0001750�0001750�00000000266�11377016712�033055� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������log4j.rootLogger=DEBUG, TRIVIAL
    log4j.appender.TRIVIAL=chapters.migrationFromLog4j.TrivialLog4jAppender
    log4j.appender.TRIVIAL.layout=chapters.migrationFromLog4j.TrivialLog4jLayout������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000146�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/migrationFromLog4j/TrivialLogbackAppender.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/migrationFromLog4j/TrivialLogbackAppender.jav0000644�0001750�0001750�00000003236�12136042273�033436� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.migrationFromLog4j;
    
    import java.io.IOException;
    
    import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.AppenderBase;
    
    public class TrivialLogbackAppender extends AppenderBase<ILoggingEvent> {
    
      PatternLayoutEncoder encoder;
      
      public PatternLayoutEncoder getEncoder() {
        return encoder;
      }
    
      public void setEncoder(PatternLayoutEncoder encoder) {
        this.encoder = encoder;
      }
    
      @Override
      public void start() {
        if (this.encoder == null) {
          addError("No encoder set for the appender named [" + name + "].");
          return;
        }
        try {
          encoder.init(System.out);
        } catch (IOException e) {
        }
        super.start();
      }
    
      @Override
      protected void append(ILoggingEvent loggingevent) {
        // note that AppenderBase.doAppend will invoke this method only if
        // this appender was successfully started.
        try {
          this.encoder.doEncode(loggingevent);
        } catch (IOException e) {
          // we can't do much with the exception except halting
          super.stop();
          addError("Failed to write to the console");
        }
      }
    
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/migrationFromLog4j/logback-trivial.xml�������0000644�0001750�0001750�00000000500�11377016712�032150� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?>
    
    <configuration>
      <appender name="TRIVIAL" class="chapters.migrationFromLog4j.TrivialLogbackAppender">
        <layout class="chapters.migrationFromLog4j.TrivialLogbackLayout"/>
      </appender>
      <root level="DEBUG">
        <appender-ref ref="TRIVIAL"/>
      </root>
    </configuration>������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/migrationFromLog4j/LogbackMain.java����������0000644�0001750�0001750�00000003034�12136042273�031366� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.migrationFromLog4j;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.util.StatusPrinter;
    
    /**
     * A minimal application making use of logback-classic. It uses the
     * configuration file logback-trivial.xml which makes use of
     * TivialLogbackAppender.
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public class LogbackMain {
    
      static Logger logger = LoggerFactory.getLogger(LogbackMain.class);
    
      public static void main(String[] args) throws JoranException {
        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
    
        JoranConfigurator configurator = new JoranConfigurator();
        configurator.setContext(lc);
        lc.reset();
        configurator.doConfigure("src/main/java/chapters/migrationFromLog4j/logback-trivial.xml");
        StatusPrinter.printInCaseOfErrorsOrWarnings(lc);
        
        
        logger.debug("Hello world");
      }
    
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/migrationFromLog4j/TrivialLog4jLayout.java���0000644�0001750�0001750�00000002106�12136042273�032726� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.migrationFromLog4j;
    
    import org.apache.log4j.Layout;
    import org.apache.log4j.spi.LoggingEvent;
    
    
    /**
     * 
     * A very simple log4j layout which formats a logging event
     * by returning the message contained therein.
     * 
     * @author Ceki G&uuml;lc&uuml;
     *
     */
    public class TrivialLog4jLayout extends Layout {
    
      public void activateOptions() {
        // there are no options to activate
      }
    
      public String format(LoggingEvent loggingEvent) {
        return loggingEvent.getRenderedMessage();
      }
    
      @Override
      public boolean ignoresThrowable() {
        return true;
      }
    
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/migrationFromLog4j/TrivialLog4jAppender.java�0000644�0001750�0001750�00000001650�12136042273�033212� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.migrationFromLog4j;
    
    import org.apache.log4j.AppenderSkeleton;
    import org.apache.log4j.spi.LoggingEvent;
    
    public class TrivialLog4jAppender extends AppenderSkeleton {
    
      protected void append(LoggingEvent loggingevent) {
        String s = this.layout.format(loggingevent);
        System.out.println(s);
      }
    
      public void close() {
        // nothing to do
      }
    
      public boolean requiresLayout() {
        return true;
      }
    
    }
    ����������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/migrationFromLog4j/TrivialLogbackLayout.java�0000644�0001750�0001750�00000001714�12136042273�033315� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.migrationFromLog4j;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.LayoutBase;
    
    
    /**
     * 
     * A very simple logback-classic layout which formats a logging event
     * by returning the message contained therein.
     * 
     * @author Ceki G&uuml;lc&uuml;
     *
     */
    public class TrivialLogbackLayout extends LayoutBase<ILoggingEvent> {
    
      public String doLayout(ILoggingEvent loggingEvent) {
        return loggingEvent.getMessage();
      }
    }
    ����������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/migrationFromLog4j/Log4jMain.java������������0000644�0001750�0001750�00000001771�12136042273�031011� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.migrationFromLog4j;
    
    import org.apache.log4j.Logger;
    import org.apache.log4j.PropertyConfigurator;
    
    /**
     * A minimal application making use of log4j and TrivialLog4jAppender.
     * 
     * @author Ceki G&uuml;lc&uuml;
     *
     */
    public class Log4jMain {
    
      static Logger logger = Logger.getLogger(Log4jMain.class);
    
      public static void main(String[] args) {
        PropertyConfigurator.configure("src/main/java/chapters/migrationFromLog4j/log4jTrivial.properties");
        logger.debug("Hello world");
      }
    
    }
    �������logback_1.0.13/logback-examples/src/main/java/chapters/architecture/��������������������������������0000755�0001750�0001750�00000000000�12203357067�025326� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/architecture/sample-config-3.xml�������������0000644�0001750�0001750�00000001321�11377016712�030731� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <configuration>
    
    	<appender name="STDOUT"
    		class="ch.qos.logback.core.ConsoleAppender">
    		<layout class="ch.qos.logback.classic.PatternLayout">
    			<pattern>%-4relative [%thread] %-5level %class - %msg%n</pattern>
    		</layout>
    	</appender>
    
    	<appender name="FILE"
    		class="ch.qos.logback.core.FileAppender">
    		<layout class="ch.qos.logback.classic.PatternLayout">
    			<pattern>%-4relative [%thread] %-5level %class - %msg%n</pattern>
    		</layout>
    		<File>sample-log.txt</File>
    	</appender>
    	
    	<logger name="chapters.architecture" level="info" />
    
    	<root level="debug">
    		<appender-ref ref="STDOUT" />
    		<appender-ref ref="FILE" />
    	</root>
    </configuration>
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/architecture/sample-config-2.xml�������������0000644�0001750�0001750�00000001227�11377016712�030735� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <configuration>
    
    	<appender name="STDOUT"
    		class="ch.qos.logback.core.ConsoleAppender">
    		<layout class="ch.qos.logback.classic.PatternLayout">
    			<pattern>%-4relative [%thread] %-5level %class - %msg%n</pattern>
    		</layout>
    	</appender>
    
    	<appender name="FILE"
    		class="ch.qos.logback.core.FileAppender">
    		<layout class="ch.qos.logback.classic.PatternLayout">
    			<pattern>%-4relative [%thread] %-5level %class - %msg%n</pattern>
    		</layout>
    		<File>sample-log.txt</File>
    	</appender>
    
    	<root level="debug">
    		<appender-ref ref="STDOUT" />
    		<appender-ref ref="FILE" />
    	</root>
    </configuration>
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/architecture/MyAppWithConfigFile.java��������0000644�0001750�0001750�00000002650�12136042273�031777� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.architecture;
    
    //Import SLF4J classes.
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.util.StatusPrinter;
    
    public class MyAppWithConfigFile {
    
      public static void main(String[] args) {
        Logger logger = LoggerFactory.getLogger(MyAppWithConfigFile.class);
        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
    
        try {
          JoranConfigurator configurator = new JoranConfigurator();
          lc.reset();
          configurator.setContext(lc);
          configurator.doConfigure(args[0]);
        } catch (JoranException je) {
          StatusPrinter.print(lc.getStatusManager());
        }
        logger.info("Entering application.");
        Bar bar = new Bar();
        bar.doIt();
        logger.info("Exiting application.");
    
      }
    }
    ����������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/architecture/sample-config-1.xml�������������0000644�0001750�0001750�00000000605�11377016712�030733� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <configuration>
    
    	<appender name="STDOUT"
    		class="ch.qos.logback.core.ConsoleAppender">
    		<layout class="ch.qos.logback.classic.PatternLayout">
          <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    		</layout>
    	</appender>
    
    	<root level="debug">
    		<appender-ref ref="STDOUT" />
    	</root>
    </configuration>
    ���������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/architecture/Bar.java������������������������0000644�0001750�0001750�00000001314�12136042273�026667� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.architecture;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    class Bar {
      Logger logger = LoggerFactory.getLogger(Bar.class);
    
      public void doIt() {
        logger.debug("doing my job");
      }
    }��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/architecture/SelectionRule.java��������������0000644�0001750�0001750�00000003374�12136042273�030750� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.architecture;
    
    import ch.qos.logback.classic.Level;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    /**
     * @author Ceki G&uuml;c&uuml;
     */
    public class SelectionRule {
    
      public static void main(String[] args) {
        // get a logger instance named "com.foo". Let us further assume that the
        // logger is of type  ch.qos.logback.classic.Logger so that we can
        // set its level
        ch.qos.logback.classic.Logger logger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger("com.foo");
        //set its Level to INFO. The setLevel() method requires a logback logger
        logger.setLevel(Level.INFO);
    
        Logger barlogger = LoggerFactory.getLogger("com.foo.Bar");
    
        // This request is enabled, because WARN >= INFO
        logger.warn("Low fuel level.");
    
        // This request is disabled, because DEBUG < INFO.
        logger.debug("Starting search for nearest gas station.");
    
        // The logger instance barlogger, named "com.foo.Bar",
        // will inherit its level from the logger named
        // "com.foo" Thus, the following request is enabled
        // because INFO >= INFO.
        barlogger.info("Located nearest gas station.");
    
        // This request is disabled, because DEBUG < INFO.
        barlogger.debug("Exiting gas station search");
    
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/introduction/��������������������������������0000755�0001750�0001750�00000000000�12203357067�025365� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/introduction/HelloWorld1.java����������������0000644�0001750�0001750�00000001417�12136042273�030362� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.introduction;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    public class HelloWorld1 {
    
      public static void main(String[] args) {
    
        Logger logger = LoggerFactory.getLogger("chapters.introduction.HelloWorld1");
        logger.debug("Hello world.");
      }
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/introduction/HelloWorld2.java����������������0000644�0001750�0001750�00000001763�12136042273�030367� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.introduction;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.core.util.StatusPrinter;
    
    public class HelloWorld2 {
    
      public static void main(String[] args) {
        Logger logger = LoggerFactory.getLogger("chapters.introduction.HelloWorld2");
        logger.debug("Hello world.");
    
        // print internal state
        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
        StatusPrinter.print(lc);
      }
    }
    �������������logback_1.0.13/logback-examples/src/main/java/chapters/configuration/�������������������������������0000755�0001750�0001750�00000000000�12203357067�025513� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/configuration/sample1.xml��������������������0000644�0001750�0001750�00000000752�11377016712�027603� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <configuration debug="true">
    
      <appender name="STDOUT"
        class="ch.qos.logback.core.ConsoleAppender">
        <!-- encoders are assigned by default the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
        <encoder>
          <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
      </appender>
    
      <root level="debug">
        <appender-ref ref="STDOUT" />
      </root>
    </configuration>
    
    ����������������������logback_1.0.13/logback-examples/src/main/java/chapters/configuration/includedConfig.xml�������������0000644�0001750�0001750�00000000556�11377016712�031160� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <included>
    
      <appender name="includedConsole"  class="ch.qos.logback.core.ConsoleAppender">
        <!-- encoders are assigned by default the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
        <encoder>
          <param name="Pattern" value="%d - %m%n" />
        </encoder>
      </appender>
    
    </included>��������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/configuration/variableSubstitution3.xml������0000644�0001750�0001750�00000000570�11377016712�032544� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    
      <property file="src/main/java/chapters/configuration/variables1.properties" />
    
      <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>${USER_HOME}/myApp.log</file>
        <encoder>
          <pattern>%msg%n</pattern>
        </encoder>
      </appender>
    
      <root level="debug">
        <appender-ref ref="FILE" />
      </root>
    </configuration>����������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/configuration/MyApp1.java��������������������0000644�0001750�0001750�00000001536�12136042273�027465� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.configuration;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    
    public class MyApp1 {
      final static Logger logger = LoggerFactory.getLogger(MyApp1.class);
    
      public static void main(String[] args) {
        logger.info("Entering application.");
    
        Foo foo = new Foo();
        foo.doIt();
        logger.info("Exiting application.");
      }
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/configuration/variableSubstitution1.xml������0000644�0001750�0001750�00000000537�11377016712�032545� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    
      <property name="USER_HOME" value="/home/sebastien" />
    
      <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>${USER_HOME}/myApp.log</file>
        <encoder>
          <pattern>%msg%n</pattern>
        </encoder>
      </appender>
    
      <root level="debug">
        <appender-ref ref="FILE" />
      </root>
    </configuration>�����������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/configuration/additivityFlag.xml�������������0000644�0001750�0001750�00000001141�11377016712�031176� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    
    	<appender name="FILE" 
                class="ch.qos.logback.core.FileAppender">
        <file>foo.log</file>
        <encoder>
          <Pattern>
            %date %level [%thread] %logger{10} [%file : %line] %msg%n
          </Pattern>
        </encoder>
    	</appender>
    
    	<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    		<encoder>
    			<Pattern>%msg%n</Pattern>
    		</encoder>
    	</appender>
    
    	<logger name="chapters.configuration.Foo" additivity="false">
    		<appender-ref ref="FILE" />
    	</logger>
    
    	<root level="debug">
    		<appender-ref ref="STDOUT" />
    	</root>
    </configuration>�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/configuration/sample0.xml��������������������0000644�0001750�0001750�00000000734�11377016712�027602� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <configuration>
    
      <appender name="STDOUT"
        class="ch.qos.logback.core.ConsoleAppender">
        <!-- encoders are assigned by default the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
        <encoder>
          <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
      </appender>
    
      <root level="debug">
        <appender-ref ref="STDOUT" />
      </root>
    </configuration>
    
    ������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/configuration/multiple.xml�������������������0000644�0001750�0001750�00000001151�11377016712�030066� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    	<appender name="FILE" class="ch.qos.logback.core.FileAppender">
    		<file>myApp.log</file>
        <!-- encoders are assigned by default the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
        <encoder>
    			<pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</pattern>
        </encoder>
    	</appender>
    
    	<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
          <pattern>%msg%n</pattern>
        </encoder>
    	</appender>
    
    	<root level="debug">
    		<appender-ref ref="FILE" />
    		<appender-ref ref="STDOUT" />
    	</root>
    </configuration>�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/configuration/restricted.xml�����������������0000644�0001750�0001750�00000001242�11377016712�030404� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    
    	<appender name="FILE" class="ch.qos.logback.core.FileAppender">
    		<file>myApp.log</file>
        <!-- encoders are assigned by default the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
        <encoder>
    			<pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</pattern>
        </encoder>
    	</appender>
    
    	<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
          <pattern>%msg%n</pattern>
        </encoder>
    	</appender>
    
    	<logger name="chapters.configuration">
    		<appender-ref ref="FILE" />
    	</logger>
    
    	<root level="debug">
    		<appender-ref ref="STDOUT" />
    	</root>
    </configuration>��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/configuration/variables2.properties����������0000644�0001750�0001750�00000000123�11377016712�031657� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������USER_HOME=/home/sebastien
    fileName=myApp.log
    destination=${USER_HOME}/${fileName}���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/configuration/MyApp2.java��������������������0000644�0001750�0001750�00000002225�12136042273�027462� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.configuration;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.core.util.StatusPrinter;
    
    public class MyApp2 {
      final static Logger logger = LoggerFactory.getLogger(MyApp2.class);
    
      public static void main(String[] args) {
        // assume SLF4J is bound to logback in the current environment
        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
        // print logback's internal status
        StatusPrinter.print(lc);
        
        logger.info("Entering application.");
        Foo foo = new Foo();
        foo.doIt();
        logger.info("Exiting application.");
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/configuration/variableSubstitution2.xml������0000644�0001750�0001750�00000000444�11377016712�032543� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    
      <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>${USER_HOME}/myApp.log</file>
        <encoder>
          <pattern>%msg%n</pattern>
        </encoder>
      </appender>
    
      <root level="debug">
        <appender-ref ref="FILE" />
      </root>
    </configuration>����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/configuration/onConsoleStatusListener.xml����0000644�0001750�0001750�00000001112�11377016712�033101� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <configuration debug="false">
    
      <statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />
    
      <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- encoders are assigned by default the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
        <encoder>
          <pattern>
            %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
          </pattern>
        </encoder>
      </appender>
    
      <root level="debug">
        <appender-ref ref="STDOUT" />
      </root>
    
    </configuration>������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/configuration/sample4.xml��������������������0000644�0001750�0001750�00000001032�11377016712�027576� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <configuration>
    
    	<appender name="STDOUT"
    		class="ch.qos.logback.core.ConsoleAppender">
        <!-- encoders are assigned by default the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
        <encoder>
    			<pattern>
            %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
          </pattern>
        </encoder>
      </appender>
    
    	<logger name="chapters.configuration" level="INFO" />
    
    	<root level="OFF">
    		<appender-ref ref="STDOUT" />
    	</root>
    
    </configuration>������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/configuration/scan1.xml����������������������0000644�0001750�0001750�00000000731�11377016712�027243� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?> 
    
    <configuration scan="true">
    
      <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
        <!-- encoders are assigned by default the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
        <encoder>
          <pattern>%d [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
      </appender>
      
      <root level="debug">
        <appender-ref ref="STDOUT" />
      </root>
    
    </configuration>���������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/configuration/variableSubstitution4.xml������0000644�0001750�0001750�00000000572�11377016712�032547� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    
      <property file="src/main/java/chapters/configuration/variables2.properties" />
    
      <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>${destination}/myApp.log</file>
        <encoder>
          <pattern>%msg%n</pattern>
        </encoder>
      </appender>
    
      <root level="debug">
        <appender-ref ref="FILE" />
      </root>
    </configuration>��������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/configuration/variables1.properties����������0000644�0001750�0001750�00000000031�11377016712�031654� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������USER_HOME=/home/sebastien�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/configuration/sample3.xml��������������������0000644�0001750�0001750�00000001140�11377016712�027575� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <configuration>
    
    	<appender name="STDOUT"
                class="ch.qos.logback.core.ConsoleAppender">
    
        <!-- encoders are assigned by default the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
        <encoder>
    			<pattern>
    				%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
    			</pattern>
        </encoder>
      </appender>
    
    	<logger name="chapters.configuration" level="INFO" />
    
    	<logger name="chapters.configuration.Foo" level="DEBUG" />
    
    	<root level="DEBUG">
    		<appender-ref ref="STDOUT" />
    	</root>
    
    </configuration>��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/configuration/containingConfig.xml�����������0000644�0001750�0001750�00000000363�11377016712�031516� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <configuration>
    
      <include file="src/main/java/chapters/configuration/includedConfig.xml" />
    
      <root level="DEBUG">
        <appender-ref ref="includedConsole" />
      </root>
    
    
    </configuration>
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/configuration/MyApp3.java��������������������0000644�0001750�0001750�00000003357�12136042273�027472� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.configuration;
    
    /**
     * Demonstrates programmatic invocation of Joran.
     * 
     */
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.util.StatusPrinter;
    
    public class MyApp3 {
      final static Logger logger = LoggerFactory.getLogger(MyApp3.class);
    
      public static void main(String[] args) {
        // assume SLF4J is bound to logback in the current environment
        LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
    
        try {
          JoranConfigurator configurator = new JoranConfigurator();
          configurator.setContext(context);
          // Call context.reset() to clear any previous configuration, e.g. default
          // configuration. For multi-step configuration, omit calling context.reset().
          context.reset();
          configurator.doConfigure(args[0]);
        } catch (JoranException je) {
          // StatusPrinter will handle this
        }
        StatusPrinter.printInCaseOfErrorsOrWarnings(context);
    
        logger.info("Entering application.");
    
        Foo foo = new Foo();
        foo.doIt();
        logger.info("Exiting application.");
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/configuration/AddStatusListenerApp.java������0000644�0001750�0001750�00000002521�12136042273�032414� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.configuration;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.status.OnConsoleStatusListener;
    import ch.qos.logback.core.status.StatusManager;
    
    public class AddStatusListenerApp {
    
      public static void main(String[] args) throws JoranException {
        
      
        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); 
        StatusManager statusManager = lc.getStatusManager();
        OnConsoleStatusListener onConsoleListener = new OnConsoleStatusListener();
        statusManager.add(onConsoleListener);
    
        Logger logger = LoggerFactory.getLogger("myApp");
        logger.info("Entering application.");
    
        Foo foo = new Foo();
        foo.doIt();
        logger.info("Exiting application.");
      }
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/configuration/Foo.java�����������������������0000644�0001750�0001750�00000001346�12136042273�027100� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.configuration;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    
    public class Foo {
      static final Logger logger = LoggerFactory.getLogger(Foo.class);
    
      public void doIt() {
        logger.debug("Did it again!");
      }
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/configuration/scan2.xml����������������������0000644�0001750�0001750�00000000573�11377016712�027250� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?> 
    
    <configuration scan="true" scanPeriod="30 seconds">
    
      <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
        <encoder>
          <pattern>%d [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
      </appender>
      
      <root level="debug">
        <appender-ref ref="STDOUT" />
      </root>
    
    </configuration>�������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/configuration/contextScopedVariable.xml������0000644�0001750�0001750�00000000546�12013540202�032512� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    
      <property scope="context" name="nodeId" value="firstNode"/>
    
      <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>/opt/${noteId}/myApp.log</file>
        <encoder>
          <pattern>%msg%n</pattern>
        </encoder>
      </appender>
    
      <root level="debug">
        <appender-ref ref="FILE"/>
      </root>
    </configuration>����������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/configuration/duplicate.xml������������������0000644�0001750�0001750�00000000617�11377016712�030213� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    
    	<appender name="STDOUT"
    		class="ch.qos.logback.core.ConsoleAppender">
    		<encoder>
    			<pattern>
    				%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
    			</pattern>
        </encoder>
    	</appender>
    
    	<logger name="chapters.configuration">
    		<appender-ref ref="STDOUT" />
    	</logger>
    
    	<root level="debug">
    		<appender-ref ref="STDOUT" />
    	</root>
    </configuration>�����������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/configuration/insertFromJNDI.xml�������������0000644�0001750�0001750�00000001074�11377016712�031034� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?>
    
    <configuration>
      <insertFromJNDI env-entry-name="java:comp/env/appName" as="appName" />
      <contextName>${appName}</contextName>
    
      <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <!-- encoders are assigned by default the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
        <encoder>
          <pattern>%d %contextName %level %msg %logger{50}%n</pattern>
        </encoder>
      </appender>
    
      <root level="DEBUG">
        <appender-ref ref="CONSOLE" />
      </root>
    </configuration>
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/configuration/sample2.xml��������������������0000644�0001750�0001750�00000001267�11377016712�027606� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <configuration>
    
    	<appender name="STDOUT"
                class="ch.qos.logback.core.ConsoleAppender">
        <!-- encoders are assigned by default the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
        <encoder>
          <pattern>
            %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
    			</pattern>
        </encoder>
    	</appender>
    
    	<logger name="chapters.configuration" level="INFO" />
    
    	<!-- Strictly speaking, the level attribute is not necessary since -->
    	<!-- the level of the root level is set to DEBUG by default.       -->
    	<root level="DEBUG">
    		<appender-ref ref="STDOUT" />
    	</root>
    
    </configuration>�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/configuration/contextName.xml����������������0000644�0001750�0001750�00000000530�11377016712�030520� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    
      <contextName>myAppName</contextName>
    
      <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
          <Pattern>%d %contextName [%t] %level %logger{36} - %msg%n</Pattern>
        </encoder>
      </appender>
    
      <root level="debug">
        <appender-ref ref="STDOUT" />
      </root>
    
    </configuration>������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/mdc/�����������������������������������������0000755�0001750�0001750�00000000000�12203357067�023407� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/mdc/mdc1.xml���������������������������������0000644�0001750�0001750�00000000664�11377016712�024763� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <configuration>
    
      <appender name="CONSOLE"
                class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
          <Pattern>%-4r [%thread] %-5level C:%X{client} N:%X{number} - %msg%n</Pattern>
        </layout>	    
      </appender>
      
      <root>
        <level value ="debug"/>
        <appender-ref ref="CONSOLE"/>
      </root>  
    </configuration>
    ����������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/mdc/simpleMDC.xml����������������������������0000644�0001750�0001750�00000000545�11745030734�025751� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <configuration>
    
    	<appender name="CONSOLE"
    		class="ch.qos.logback.core.ConsoleAppender">
    		<layout class="ch.qos.logback.classic.PatternLayout">
    			<Pattern>%X{first} %X{last} - %m%n</Pattern>
    		</layout>
    	</appender>
    
    	<root level="debug">
    		<appender-ref ref="CONSOLE" />
    	</root>
    </configuration>
    �����������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/mdc/NumberCruncherClient.java����������������0000644�0001750�0001750�00000004715�12136042273�030335� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.mdc;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.rmi.Naming;
    import java.rmi.RemoteException;
    
    
    /**
     * NumberCruncherClient is a simple client for factoring integers. A
     * remote NumberCruncher is contacted and asked to factor an
     * integer. The factors returned by the {@link NumberCruncherServer}
     * are displayed on the screen.
     * */
    public class NumberCruncherClient {
      public static void main(String[] args) {
        if (args.length == 1) {
          try {
            String url = "rmi://" + args[0] + "/Factor";
            NumberCruncher nc = (NumberCruncher) Naming.lookup(url);
            loop(nc);
          } catch (Exception e) {
            e.printStackTrace();
          }
        } else {
          usage("Wrong number of arguments.");
        }
      }
    
      static void usage(String msg) {
        System.err.println(msg);
        System.err.println("Usage: java chapters.mdc.NumberCruncherClient HOST\n" +
          "   where HOST is the machine where the NumberCruncherServer is running.");
        System.exit(1);
      }
    
      static void loop(NumberCruncher nc) {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        int i = 0;
    
        while (true) {
          System.out.print("Enter a number to factor, '-1' to quit: ");
    
          try {
            i = Integer.parseInt(in.readLine());
          } catch (Exception e) {
            e.printStackTrace();
          }
    
          if (i == -1) {
            System.out.print("Exiting loop.");
    
            return;
          } else {
            try {
              System.out.println("Will attempt to factor " + i);
    
              int[] factors = nc.factor(i);
              System.out.print("The factors of " + i + " are");
    
              for (int k = 0; k < factors.length; k++) {
                System.out.print(" " + factors[k]);
              }
    
              System.out.println(".");
            } catch (RemoteException e) {
              System.err.println("Could not factor " + i);
              e.printStackTrace();
            }
          }
        }
      }
    }
    ���������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/mdc/NumberCruncherServer.java����������������0000644�0001750�0001750�00000011350�12136042273�030356� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.mdc;
    
    import java.rmi.RemoteException;
    import java.rmi.registry.LocateRegistry;
    import java.rmi.registry.Registry;
    import java.rmi.server.UnicastRemoteObject;
    import java.util.Vector;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.slf4j.MDC;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.core.joran.spi.JoranException;
    
    
    /**
     * A simple NumberCruncher implementation that logs its progress when
     * factoring numbers. The purpose of the whole exercise is to show the
     * use of mapped diagnostic contexts in order to distinguish the log
     * output from different client requests.
     * */
    public class NumberCruncherServer extends UnicastRemoteObject
      implements NumberCruncher {
    
      private static final long serialVersionUID = 1L;
    
      static Logger logger = LoggerFactory.getLogger(NumberCruncherServer.class);
    
      public NumberCruncherServer() throws RemoteException {
      }
    
      public int[] factor(int number) throws RemoteException {
        // The client's host is an important source of information.
        try {
          MDC.put("client", NumberCruncherServer.getClientHost());
        } catch (java.rmi.server.ServerNotActiveException e) {
          logger.warn("Caught unexpected ServerNotActiveException.", e);
        }
    
        // The information contained within the request is another source
        // of distinctive information. It might reveal the users name,
        // date of request, request ID etc. In servlet type environments,
        // useful information is contained in the HttpRequest or in the  
        // HttpSession.
        MDC.put("number", String.valueOf(number));
    
        logger.info("Beginning to factor.");
    
        if (number <= 0) {
          throw new IllegalArgumentException(number +
            " is not a positive integer.");
        } else if (number == 1) {
          return new int[] { 1 };
        }
    
        Vector<Integer> factors = new Vector<Integer>();
        int n = number;
    
        for (int i = 2; (i <= n) && ((i * i) <= number); i++) {
          // It is bad practice to place log requests within tight loops.
          // It is done here to show interleaved log output from
          // different requests. 
          logger.debug("Trying " + i + " as a factor.");
    
          if ((n % i) == 0) {
            logger.info("Found factor " + i);
            factors.addElement(i);
    
            do {
              n /= i;
            } while ((n % i) == 0);
          }
    
          // Placing artificial delays in tight loops will also lead to
          // sub-optimal resuts. :-)
          delay(100);
        }
    
        if (n != 1) {
          logger.info("Found factor " + n);
          factors.addElement(n);
        }
    
        int len = factors.size();
    
        int[] result = new int[len];
    
        for (int i = 0; i < len; i++) {
          result[i] = ((Integer) factors.elementAt(i)).intValue();
        }
    
        // clean up
        MDC.remove("client");
        MDC.remove("number");
    
        return result;
      }
    
      static void usage(String msg) {
        System.err.println(msg);
        System.err.println("Usage: java chapters.mdc.NumberCruncherServer configFile\n" +
          "   where configFile is a logback configuration file.");
        System.exit(1);
      }
    
      public static void delay(int millis) {
        try {
          Thread.sleep(millis);
        } catch (InterruptedException e) {
        }
      }
    
      public static void main(String[] args) {
        if (args.length != 1) {
          usage("Wrong number of arguments.");
        }
    
        String configFile = args[0];
    
        if (configFile.endsWith(".xml")) {
          try {
            LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
            JoranConfigurator configurator = new JoranConfigurator();
            configurator.setContext(lc);
            lc.reset();
            configurator.doConfigure(args[0]);
          } catch (JoranException je) {
            je.printStackTrace();
          }
        }
    
        NumberCruncherServer ncs;
    
        try {
          ncs = new NumberCruncherServer();
          logger.info("Creating registry.");
    
          Registry registry = LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
          registry.rebind("Factor", ncs);
          logger.info("NumberCruncherServer bound and ready.");
        } catch (Exception e) {
          logger.error("Could not bind NumberCruncherServer.", e);
    
          return;
        }
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/mdc/NumberCruncher.java����������������������0000644�0001750�0001750�00000001550�12136042273�027170� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.mdc;
    
    import java.rmi.Remote;
    import java.rmi.RemoteException;
    
    
    /**
     * NumberCruncher factors positive integers.
     */
    public interface NumberCruncher extends Remote {
      /**
       * Factor a positive integer <code>number</code> and return its
       * <em>distinct</em> factor's as an integer array.
       * */
      int[] factor(int number) throws RemoteException;
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/mdc/SimpleMDC.java���������������������������0000644�0001750�0001750�00000006403�12136042273�026025� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.mdc;
    
    import java.net.URL;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.slf4j.MDC;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.ConsoleAppender;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.util.Loader;
    import ch.qos.logback.core.util.StatusPrinter;
    
    public class SimpleMDC {
      static public void main(String[] args) throws Exception {
        // You can put values in the MDC at any time. Before anything else 
        // we put the first name
        MDC.put("first", "Dorothy");
    
        // configure via the configuration file "chapters/mdc/simpleMDC.xml"
        // which ships with the examples
        configureViaXML_File();
        
        // For educational purposes, the same configuration can 
        // be accomplished programmatically.
        // 
        // programmaticConfiguration();
        
        Logger logger = LoggerFactory.getLogger(SimpleMDC.class);
        // We now put the last name
        MDC.put("last", "Parker");
    
        // The most beautiful two words in the English language according
        // to Dorothy Parker:
        logger.info("Check enclosed.");
        logger.debug("The most beautiful two words in English.");
    
        MDC.put("first", "Richard");
        MDC.put("last", "Nixon");
        logger.info("I am not a crook.");
        logger.info("Attributed to the former US president. 17 Nov 1973.");
      }
    
      static void programmaticConfiguration() {
        // Configure logback
        LoggerContext loggerContext = (LoggerContext) LoggerFactory
            .getILoggerFactory();
        loggerContext.reset();
        PatternLayoutEncoder layout = new PatternLayoutEncoder();
        layout.setContext(loggerContext);
        layout.setPattern("%X{first} %X{last} - %m%n");
        layout.start();
        ConsoleAppender<ILoggingEvent> appender = new ConsoleAppender<ILoggingEvent>();
        appender.setContext(loggerContext);
        appender.setEncoder(layout);
        appender.start();
        // cast root logger to c.q.logback.classic.Logger so that we can attach
        // an appender to it
        ch.qos.logback.classic.Logger root = (ch.qos.logback.classic.Logger) LoggerFactory
            .getLogger("root");
        root.addAppender(appender);
      }
    
      static void configureViaXML_File() {
        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
        try {
          JoranConfigurator configurator = new JoranConfigurator();
          configurator.setContext(lc);
          lc.reset();
          URL url = Loader.getResourceBySelfClassLoader("chapters/mdc/simpleMDC.xml");
          configurator.doConfigure(url);
        } catch (JoranException je) {
          StatusPrinter.print(lc);
        }
      }
    
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/src/main/java/chapters/mdc/UserServletFilter.java�������������������0000644�0001750�0001750�00000004514�12136042273�027702� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package chapters.mdc;
    
    import java.io.IOException;
    import java.security.Principal;
    
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    
    import org.slf4j.MDC;
    
    /**
     * A simple servlet filter that puts the username
     * found either in the Principal.
     * 
     * <p> The value is removed from the MDC once the request has been
     * fully processed.
     *
     * @author S&eacute;bastien Pennec
     */
    public class UserServletFilter implements Filter {
    
      private final String USER_KEY = "username";
      
      public void destroy() {
      }
    
      public void doFilter(ServletRequest request, ServletResponse response,
          FilterChain chain) throws IOException, ServletException {
    
        boolean successfulRegistration = false;
        HttpServletRequest req = (HttpServletRequest) request;
        Principal principal = req.getUserPrincipal();
        // Please note that we also could have used a cookie to 
        // retrieve the user name
        
        if (principal != null) {
          String username = principal.getName();
          successfulRegistration = registerUsername(username);
        }
        
        try {
          chain.doFilter(request, response);
        } finally {
          if (successfulRegistration) {
            MDC.remove(USER_KEY);
          }
        }
      }
    
      public void init(FilterConfig arg0) throws ServletException {
      }
      
      /**
       * Register the user in the MDC under USER_KEY.
       * 
       * @param username
       * @return true id the user can be successfully registered
       */
      private boolean registerUsername(String username) {
        if (username != null && username.trim().length() > 0) {
          MDC.put(USER_KEY, username);
          return true;
        }
        return false;
      }
    
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/pom.xml�������������������������������������������������������������0000644�0001750�0001750�00000006472�12143153471�017721� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    
      <parent>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-parent</artifactId>
        <version>1.0.13</version>
      </parent>
    
      <modelVersion>4.0.0</modelVersion>
    
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-examples</artifactId>
      <packaging>jar</packaging>
      <name>Logback Examples Module</name>
      <description>logback-examples module</description>
    
      <url>http://logback.qos.ch</url>
    
      <licenses>
        <license>
          <name>Eclipse Public License - v 1.0</name>
          <url>http://www.eclipse.org/legal/epl-v10.html</url>
        </license>
    
        <license>
          <name>GNU Lesser General Public License</name>
          <url>http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html</url>
        </license>
      </licenses>
    
      <dependencies>
    
        <dependency>
          <groupId>ch.qos.logback</groupId>
          <artifactId>logback-core</artifactId>
        </dependency>
    
        <dependency>
          <groupId>ch.qos.logback</groupId>
          <artifactId>logback-classic</artifactId>
        </dependency>
    
        <dependency>
          <groupId>ch.qos.logback</groupId>
          <artifactId>logback-access</artifactId>
        </dependency>
    
        <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-ext</artifactId>
          <version>${slf4j.version}</version>
        </dependency>
    
        <dependency>
          <groupId>log4j</groupId>
          <artifactId>log4j</artifactId>
          <version>1.2.14</version>
        </dependency>
    
    
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>servlet-api</artifactId>
          <scope>compile</scope>
          <optional>true</optional>
        </dependency>
    
        <dependency>
          <groupId>org.fusesource.jansi</groupId>
          <artifactId>jansi</artifactId>
          <optional>true</optional>
        </dependency>
    
      </dependencies>
    
      <build>
        <resources>
          <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
          </resource>
        </resources>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
              <source>1.5</source>
              <target>1.5</target>
            </configuration>
          </plugin>
    
          <plugin>
            <artifactId>maven-antrun-plugin</artifactId>
            <executions>
              <execution>
                <phase>package</phase>
                <configuration>
                  <tasks>
                    <mkdir dir="lib/"/>
                    <property name="slf4jJAR"
                              value="${settings.localRepository}/org/slf4j/slf4j-api/${slf4j.version}/slf4j-api-${slf4j.version}.jar"/>
                    <echo>Copying ${slf4jJAR} to lib/</echo>
                    <delete>
                      <fileset dir="lib/" includes="slf4j-*SNAPSHOT.jar"/>
                    </delete>
                    <copy file="${slf4jJAR}" todir="lib/"/>
                  </tasks>
                </configuration>
                <goals>
                  <goal>run</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </project>������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/lib/����������������������������������������������������������������0000755�0001750�0001750�00000000000�12203357067�017145� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-examples/setClasspath.sh�����������������������������������������������������0000644�0001750�0001750�00000000737�12143164240�021370� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh
    
    ##
    # This script will add logback jars to your classpath.
    ##
    
    LB_HOME=/SET/THIS/PARAMETER/TO/THE/DIRECTORY/WHERE/YOU/INSTALLED/LOGBACK
    
    CLASSPATH="${CLASSPATH}:${LB_HOME}/logback-classic-1.0.13.jar"
    CLASSPATH="${CLASSPATH}:${LB_HOME}/logback-core-1.0.13.jar"
    CLASSPATH="${CLASSPATH}:${LB_HOME}/logback-examples/logback-examples-1.0.13.jar"
    CLASSPATH="${CLASSPATH}:${LB_HOME}/logback-examples/lib/slf4j-api-1.7.5.jar"
    
    export CLASSPATH
    
    echo $CLASSPATH
    ���������������������������������logback_1.0.13/pom.xml������������������������������������������������������������������������������0000644�0001750�0001750�00000034604�12143163210�014471� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    
      <modelVersion>4.0.0</modelVersion>
    
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-parent</artifactId>
      <version>1.0.13</version>
      <packaging>pom</packaging>
      <name>Logback-Parent</name>
      <description>logback project pom.xml file</description>
    
      <url>http://logback.qos.ch</url>
    
      <organization>
        <name>QOS.ch</name>
        <url>http://www.qos.ch</url>
      </organization>
      <inceptionYear>2005</inceptionYear>
    
      <licenses>
        <license>
          <name>Eclipse Public License - v 1.0</name>
          <url>http://www.eclipse.org/legal/epl-v10.html</url>
        </license>
    
        <license>
          <name>GNU Lesser General Public License</name>
          <url>http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html</url>
        </license>
      </licenses>
    
      <scm>
        <url>https://github.com/ceki/logback</url>
        <connection>git@github.com:ceki/logback.git</connection> 
      </scm>
    
      
    
      <modules>
        <module>logback-core</module>
        <module>logback-classic</module>
        <module>logback-access</module>
        <module>logback-site</module>
        <module>logback-examples</module>
      </modules>
    
      <properties>
        <!-- target JDK version == source JDK version -->
        <jdk.version>1.5</jdk.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <!-- slf4j.version property is used below, in
             logback-classic/pom.xml and in setClasspath.cmd -->
        <slf4j.version>1.7.5</slf4j.version>
        <junit.version>4.10</junit.version>
        <javax.mail.version>1.4</javax.mail.version>
        <janino.version>2.6.1</janino.version>
        <groovy.version>2.0.7</groovy.version>
    
        <consolePlugin.version>1.1.0</consolePlugin.version>
        <tomcat.version>7.0.21</tomcat.version>
        <jetty.version>7.5.1.v20110908</jetty.version>
        <jansi.version>1.9</jansi.version>
    
        <maven-compiler-plugin.version>2.3.2</maven-compiler-plugin.version>
        <maven-jar-plugin.version>2.3.1</maven-jar-plugin.version>
        <maven-surefire-plugin.version>2.14.1</maven-surefire-plugin.version>
        <maven-license-plugin.version>1.9.0</maven-license-plugin.version>
        <findbugs-maven-plugin.version>2.5</findbugs-maven-plugin.version>
    
      </properties>
    
      <developers>
        <developer>
          <id>ceki</id>
          <name>Ceki Gulcu</name>
          <email>ceki@qos.ch</email>
        </developer>
    
        <developer>
          <id>hixi</id>
          <name>Joern Huxhorn</name>
          <email>huxi@undisclosed.org</email>
        </developer>
    
      </developers>
    
      <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>${junit.version}</version>
          <scope>test</scope>
        </dependency>
        <dependency>
          <groupId>org.easytesting</groupId>
          <artifactId>fest-assert</artifactId>
          <version>1.2</version>
          <scope>test</scope>
        </dependency>
      </dependencies>
    
    
      <dependencyManagement>
        <dependencies>
          <!-- Project modules -->
          <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>${project.version}</version>
          </dependency>
    
          <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>${project.version}</version>
            <type>test-jar</type>
          </dependency>
    
          <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>${project.version}</version>
          </dependency>
    
          <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-access</artifactId>
            <version>${project.version}</version>
          </dependency>
          <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
          </dependency>
          <dependency>
            <groupId>org.codehaus.janino</groupId>
            <artifactId>janino</artifactId>
            <version>${janino.version}</version>
          </dependency>
          <dependency>
            <groupId>org.codehaus.groovy</groupId>
            <artifactId>groovy-all</artifactId>
            <version>${groovy.version}</version>
          </dependency>
          <dependency>
            <groupId>org.fusesource.jansi</groupId>
            <artifactId>jansi</artifactId>
            <version>${jansi.version}</version>
          </dependency>
    
          <dependency>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
            <version>${javax.mail.version}</version>
          </dependency>
          <dependency>
            <groupId>dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>1.6.1</version>
          </dependency>
          <dependency>
            <groupId>hsqldb</groupId>
            <artifactId>hsqldb</artifactId>
            <version>1.8.0.7</version>
          </dependency>
          <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.2.132</version>
          </dependency>
          <dependency>
            <groupId>postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>8.4-701.jdbc4</version>
          </dependency>
          <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.9</version>
          </dependency>
    
    
          <dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-catalina</artifactId>
            <version>${tomcat.version}</version>
          </dependency>
    
          <dependency>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-server</artifactId>
            <version>${jetty.version}</version>
          </dependency>
          <!--
          <dependency>
            <groupId>org.mortbay.jetty</groupId>
            <artifactId>servlet-api-2.5</artifactId>
            <version>6.1.1</version>
          </dependency>
          -->
          <dependency>
            <groupId>org.apache.geronimo.specs</groupId>
            <artifactId>geronimo-jms_1.1_spec</artifactId>
            <version>1.0</version>
          </dependency>
          <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
          </dependency>
        </dependencies>
      </dependencyManagement>
    
    
      <build>
        <extensions>
          <extension>
            <groupId>org.apache.maven.wagon</groupId>
            <artifactId>wagon-ssh</artifactId>
            <version>2.0</version>
          </extension>
        </extensions>
    
        <plugins>
    
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>${maven-compiler-plugin.version}</version>
            <configuration>
              <source>${jdk.version}</source>
              <target>${jdk.version}</target>
            </configuration>
          </plugin>
    
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>${maven-surefire-plugin.version}</version>
          </plugin>
    
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-source-plugin</artifactId>
            <version>2.1.2</version>
            <executions>
              <execution>
                <phase>package</phase>
                <goals>
                  <goal>jar</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
    
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>${maven-jar-plugin.version}</version>
          </plugin>
    
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-eclipse-plugin</artifactId>
            <version>2.8</version>
            <configuration>
              <downloadSources>true</downloadSources>
              <downloadJavadocs>true</downloadJavadocs>
              <sourceIncludes>
                <sourceInclude>**/*.java</sourceInclude>
              </sourceIncludes>
            </configuration>
          </plugin>
    
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.1</version>
            <configuration>
              <descriptors>
                <descriptor>src/main/assembly/dist.xml</descriptor>
              </descriptors>
              <finalName>logback-${project.version}</finalName>
              <appendAssemblyId>false</appendAssemblyId>
              <outputDirectory>target/site/dist/</outputDirectory>
            </configuration>
          </plugin>
          <plugin>
            <groupId>org.apache.felix</groupId>
            <artifactId>maven-bundle-plugin</artifactId>
            <!-- avoid "Duplicate entry" warnings -->
            <version>2.1.0</version>
          </plugin>
    
          <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>findbugs-maven-plugin</artifactId>
            <version>${findbugs-maven-plugin.version}</version>
            <configuration>
              <threshold>High</threshold>
              <!--<trace>true</trace>-->
              <excludeFilterFile>findbugs-exclude.xml</excludeFilterFile>
            </configuration>
          </plugin>
    
          <!-- ================ site plugin ==================== -->
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-site-plugin</artifactId>
            <version>3.0</version>
            <configuration>
              <reportPlugins>
                <plugin>
                  <groupId>org.apache.maven.plugins</groupId>
                  <artifactId>maven-jxr-plugin</artifactId>
                  <version>2.3</version>
                  <configuration>
                    <aggregate>true</aggregate>
                    <javadocDir>target/site/apidocs/</javadocDir>
                    <linkJavadoc>true</linkJavadoc>
                  </configuration>
                </plugin>
    
                <plugin>
                  <groupId>org.apache.maven.plugins</groupId>
                  <artifactId>maven-javadoc-plugin</artifactId>
                  <version>2.8</version>
                  <configuration>
                    <aggregate>true</aggregate>
                    <!--<linksource>true</linksource>-->
                    <links>
                      <link>
                        http://java.sun.com/j2se/1.5.0/docs/api
                      </link>
                    </links>
                    <groups>
                      <group>
                        <title>Logback Core</title>
                        <packages>ch.qos.logback.core:ch.qos.logback.core.*
                        </packages>
                      </group>
                      <group>
                        <title>Logback Classic</title>
                        <packages>
                          ch.qos.logback:ch.qos.logback.classic:ch.qos.logback.classic.*
                        </packages>
                      </group>
                      <group>
                        <title>Logback Access</title>
                        <packages>ch.qos.logback.access:ch.qos.logback.access.*
                        </packages>
                      </group>
                      <group>
                        <title>SLF4J</title>
                        <packages>org.slf4j:org.slf4j.*</packages>
                      </group>
                      <group>
                        <title>Examples</title>
                        <packages>chapter*:joran*</packages>
                      </group>
                    </groups>
                  </configuration>
                </plugin>
    
              </reportPlugins>
            </configuration>
          </plugin>
    
        </plugins>
      </build>
    
      <distributionManagement>
        <site>
          <id>pixie</id>
          <url>scp://pixie.qos.ch/var/www/logback.qos.ch/htdocs/</url>
        </site>
    
        <repository>
          <id>sonatype-nexus-staging</id>
          <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
    
          <!--<id>pixie</id>-->
          <!--<url>scp://pixie.qos.ch/var/mvnrepo/</url>-->
        </repository>
    
      </distributionManagement>
    
    
      <profiles>
        <profile>
          <id>testSkip</id>
          <properties>
            <maven.test.skip>true</maven.test.skip>
          </properties>
        </profile>
        <profile>
          <id>license</id>
          <build>
            <plugins>
              <plugin>
                <groupId>com.mycila.maven-license-plugin</groupId>
                <artifactId>maven-license-plugin</artifactId>
                <version>1.9.0</version>
                <configuration>
                  <header>src/main/licenseHeader.txt</header>
                  <quiet>false</quiet>
                  <failIfMissing>true</failIfMissing>
                  <aggregate>true</aggregate>
                  <includes>
                    <include>src/**/*.java</include>
                  </includes>
                  <useDefaultExcludes>true</useDefaultExcludes>
                  <useDefaultMapping>true</useDefaultMapping>
                  <properties>
                    <year>1999</year>
                  </properties>
                  <headerDefinitions>
                    <headerDefinition>src/main/javadocHeaders.xml</headerDefinition>
                  </headerDefinitions>
                </configuration>
              </plugin>
            </plugins>
          </build>
    
        </profile>
    
        <profile>
          <id>javadocjar</id>
          <build>
            <plugins>
              <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-javadoc-plugin</artifactId>
                <version>2.8</version>
                <executions>
                  <execution>
                    <id>attach-javadocs</id>
                    <goals>
                      <goal>jar</goal>
                    </goals>
                  </execution>
                </executions>
              </plugin>
            </plugins>
          </build>
        </profile>
    
    
        <profile>
          <id>sign-artifacts</id>
          <build>
            <plugins>
              <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-gpg-plugin</artifactId>
                <version>1.1</version>
                <executions>
                  <execution>
                    <id>sign-artifacts</id>
                    <phase>verify</phase>
                    <goals>
                      <goal>sign</goal>
                    </goals>
                  </execution>
                </executions>
              </plugin>
            </plugins>
          </build>
        </profile> 
    
    
      </profiles>
    
    </project>
    ����������������������������������������������������������������������������������������������������������������������������logback_1.0.13/README.txt���������������������������������������������������������������������������0000644�0001750�0001750�00000001316�11377016711�014657� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
    Thank you for downloading logback, the reliable, generic, fast and
    flexible logging library for Java.
    
    The Logback documentation can be found under the docs/ directory.
    
    Building logback
    ================
    
    Building logback is documented at:
    
      http://logback.qos.ch/manual/introduction.html#BuildingLogback
    
    In case of problems
    ===================
    
    In case of problems please do not hesitate to post an e-mail message
    on the logback-user@qos.ch mailing list.  However, please do not
    directly e-mail logback developers. The answer to your question might
    be useful to other users. Moreover, there are many knowledgeable users
    on the logback-user mailing lists who can quickly answer your
    questions. ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/��������������������������������������������������������������������������������0000755�0001750�0001750�00000000000�12203357067�014111� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/index.html����������������������������������������������������������������������0000644�0001750�0001750�00000014065�12143164237�016112� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Logback Home</title>
        <link rel="stylesheet" type="text/css" href="css/common.css" />
        <link rel="stylesheet" type="text/css" href="css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="css/_print.css" media="print" />
    
      </head>
      <body>
        <script type="text/javascript">prefix='';</script>
        <script src="templates/header.js" type="text/javascript"></script>
        <div id="left">
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="templates/left.js" type="text/javascript"></script>
        </div>
        <div id="content">
    		
    		<h2>Logback Project</h2>
    
        <p>Logback is intended as a successor to the popular log4j
        project, <a href="reasonsToSwitch.html">picking up where log4j
        leaves off</a>.
    		</p>
    
        <p>Logback's architecture is sufficiently generic so as to apply
        under different circumstances. At present time, logback is divided
        into three modules, logback-core, logback-classic and
        logback-access.
    		</p>
    
    		<p>The logback-core module lays the groundwork for the other two
    		modules. The logback-classic module can be assimilated to a
    		significantly improved version of log4j. Moreover, logback-classic
    		natively implements the <a href="http://www.slf4j.org">SLF4J
    		API</a> so that you can readily switch back and forth between
    		logback and other logging frameworks such as log4j or
    		java.util.logging (JUL).
        </p>
    
        <p>The logback-access module integrates with Servlet containers,
        such as Tomcat and Jetty, to provide HTTP-access log
        functionality. Note that you could easily build your own module
        on top of logback-core.
    		</p>
    
        <h3>Sister projects</h3>
    
        <p>The <a href="http://audit.qos.ch">logback-audit</a> project is
        designed for processing logging events having long-term business
        significance. Logback-audit is based on logback-core.
        </p>
        	
    
        <h3>Projects known to rely on logback</h3>
    
        <p>Here is a non-exhaustive list of open-source projects known to
        depend on logback, in alphabetical order:
        </p>
    
        <table border="0">
          <tr>
            <td valign="top">
              <ul> 
                <li><a href="http://doc.akka.io/logging">Akka</a></li>
                <li><a href="http://incubator.apache.org/airavata/">Apache Airvata</a></li>
                <li><a href="http://camel.apache.org/">Apache Camel</a></li>
                <li><a href="http://cocoon.apache.org/3.0/">Apache Cocoon 3</a></li>
                <li><a href="http://jackrabbit.apache.org/">Apache Jackrabbit</a></li>
                <li><a href="http://incubator.apache.org/openmeetings/">Apache OpenMeetings</a></li>
              </ul>  
            </td>
            <td valign="top"> 
              <ul>
                <li><a href="http://incubator.apache.org/s4/">Apache S4</a></li>
                <li><a href="http://incubator.apache.org/syncope/">Apache Syncope</a></li>
                <li><a href="http://myfaces.apache.org/tobago/">Apache Tobago</a></li>
                <li><a href="http://www.jfrog.org/products.php">Artifactory</a></li>
                <li><a href="http://cia.sourceforge.net/">Citizen Intelligence Agency</a></li>
                <li><a href="http://www.dcache.org/">dCache</a></li>
              </ul>
            </td>
            <td valign="top">
              <ul>            
                <li><a href="http://dropwizard.codahale.com/">Dropwizard</a></li>
                <li><a href="http://www.geomajas.org/">Geomajas</a></li>            
                <li><a href="http://www.gradle.org/">Gradle</a></li>   
                <li><a href="http://grinder.sourceforge.net/">Grinder</a></li>   
                <li><a href="http://www.eclipse.org/gyrex/">Gyrex</a></li>   
                <li><a href="http://wiki.yoshtec.com/jaob">JAOP</a></li>                 
              </ul>
            </td>
          </tr>
          <tr>
            <td valign="top">
              <ul>
                <li><a href="http://jmxmonitor.sourceforge.net/">JMX Monitor</a></li>                 
                <li><a href="http://jwebunit.sourceforge.net/quickstart.html">JWebUnit</a></li>
                <li><a href="http://liftweb.net/">Lift</a></li>
                <li><a href="http://metrics.codahale.com/">Metrics</a></li>
                <li><a href="http://www.opengda.org/">OpenGDA</a></li>   
                <li><a href="http://www.openrdf.org/doc/sesame2/2.3.2/users/ch06.html">OpenRDF</a></li>
                <li><a href="http://opentsdb.net/overview.html">OpenTSDB</a></li>
              </ul>
            </td>
            <td valign="top">
              <ul>
                <li><a href="http://www.playframework.org/">Play Framework</a></li>
                <li><a href="http://www.red5.org">Red5</a></li>
                <li><a href="http://scalate.fusesource.org/">Scalate</a></li>
                <li><a href="http://www.scalatra.org/2.0/book/">Scalatra</a></li>
                <li><a href="http://shibboleth.net/">Shibboleth</a></li>
                <li><a href="http://sonar.codehaus.org/">Sonar</a></li>
              </ul>
            </td>
            <td valign="top">
              <ul>
                <li><a
                href="http://static.springsource.org/s2-dmserver/2.0.x/user-guide/htmlsingle/user-guide.html">SpringSource
                dm Server</a></li>  
                <li><a href="http://www.streambase.com/developers/docs/latest/index.html">StreamBase</a></li>
                <li><a href="http://www.eclipse.org/virgo/">Virgo Web Server</a></li>
                <li><a href="http://xtrememp.sourceforge.net/">XtremeMP</a></li>            
                <li><a href="http://www.xuggle.com/xuggler/">Xuggler</a></li>
                <li><a href="http://www.xwiki.org/">Xwiki</a></li>
                <li><a href="http://www.zabbix.com/">Zabbix</a></li>
              </ul>
            </td>
    
          </tr>
        </table>
        <script src="templates/footer.js" type="text/javascript"></script>	
        </div>
      </body>
    </html>
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/dependencies.html���������������������������������������������������������������0000644�0001750�0001750�00000012366�12143164237�017433� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Logback Dependencies</title>
        
        <link rel="stylesheet" type="text/css" href="css/common.css" />
        <link rel="stylesheet" type="text/css" href="css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="css/_print.css" media="print" />
        
      </head>
      <body>
        <script type="text/javascript">prefix='';</script>
        
        <script src="templates/header.js" type="text/javascript"></script>
        <div id="left">
          <script src="templates/left.js" type="text/javascript"></script>
        </div>
        <div id="content">
    	
    	
    		<h1>Dependencies per module</h1>
    
        <p>As of version 1.0.12, logback requires JDK 1.6 to build,
        however, it is inteded to run under JDK 1.5 (with the exception of
        SSL related functionality).</p>
    
        <p>Each logback module has a different set of dependencies. These
        are listed below in a separate table per module.</p>
    
        <h2>logback-core</h2>
    
        <table class="bodyTable striped">
          <tr>
            <th>Component</th>
            <th>dependencies</th>       
          </tr>
    
          <tr>
            <td>Overall</td>
            <td><ul><li>JDK 1.5</li></ul></td>       
          </tr>
    
          <tr>
            <td>ch.qos.logback.core.net.ssl.*</td>
            <td><ul><li>JDK 1.6</li></ul></td>       
          </tr>
    
          <tr>
            <td><code>JaninoEventEvaluatorBase</code> and derived classes</td>
            <td>
              <ul>
                <li><a href="http://janino.net">Janino</a> version 2.6.1</li>
              </ul>
            </td>
          </tr>
    
          <tr>
            <td><code>SMTPAppenderBase</code> and derived classes</td>
            <td>
              <ul>         
                <li><a
                href="https://glassfish.dev.java.net/javaee5/mail/">JavaMail
                API</a> version 1.4,
                </li>
                <li><a
                href="http://java.sun.com/products/javabeans/jaf/index.jsp">JavaBeans
                Activation Framework (JAF)</a> version 1.1
                </li>
              </ul>
            </td>
          </tr>
        
        </table>
        
        <h2>logback-classic</h2>
    
        <table class="bodyTable striped">
          <tr>
            <th>Component</th>
            <th>dependencies</th>       
          </tr>
    
          <tr>
            <td>Overall</td>
            <td>
              <ul>
                <li>JDK 1.5
                </li>
              </ul>
            </td>       
          </tr>
    
          <tr>
            <td>Overall</td>
            <td>
              <ul>
                <li>logback-core, and by transitivity logback-core's
                dependencies.
                </li>
              </ul>
            </td>       
          </tr>
    
          <tr class="a">
            <td>Overall</td>
            <td>
              <ul>
                <li><a href="http://www.slf4j.org">slf4j-api</a> version
                1.7.5
                </li>
              </ul>
            </td>       
          </tr>
          
          <tr>
            <td>ch.qos.logback.classic.selector.*</td>
            <td>
              <ul>
                <li>servlet-api version 2.5
                </li>
              </ul>
            </td>       
          </tr>
    
          <tr>
            <td>c.q.l.c.boolex.JaninoEventEvaluator</td>
            <td>
              <ul>
                <li>Depends on <code>JaninoEventEvaluatorBase</code>, and by
                transitivity on <code>JaninoEventEvaluatorBase</code>'s
                dependencies.
                </li>
              </ul>
            </td>
          </tr>
    
          <tr class="b">
            <td>SMTPAppender</td>
            <td>
              <ul>
                <li>Depends on <code>SMTPAppenderBase</code>, and by
                transitivity on <code>SMTPAppenderBase</code>'s
                dependencies.
                </li>       
              </ul>
            </td>
          </tr>
    
    
        </table>
    
      <h2>logback-access</h2>
    
        <table class="bodyTable striped">
          <tr>
            <th>Component</th>
            <th>dependencies</th>       
          </tr>
    
          <tr>
            <td>Overall</td>
            <td>
              <ul>
                <li>JDK 1.6
                </li>
              </ul>
            </td>       
          </tr>
    
          <tr>
            <td>Overall</td>
            <td>
              <ul>
                <li>logback-core, and by transitivity logback-core's
                dependencies.
                </li>
              </ul>
            </td>       
          </tr>
    
          <tr>
            <td>Overall</td>
            <td>
              <ul>
                <li>servlet-api version 2.5
                </li>
              </ul>
            </td>       
          </tr>
    
    
          <tr>
            <td>ch.qos.logback.access.jetty.*</td>
            <td>
              <ul>
                <li><a href="http://jetty.mortbay.org">Jetty</a> version 7.5.1.v20110908
                </li>
              </ul>
            </td>       
          </tr>
    
          <tr>
            <td>ch.qos.logback.access.tomcat.*</td>
            <td>
              <ul>
                <li><a href="http://tomcat.apache.org">Tomcat</a> version 7.0.21
                </li>
              </ul>
            </td>       
          </tr>
        </table>
    
        
        <script src="templates/footer.js" type="text/javascript"></script>	
    </div>
    </body>
    </html>
    	��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/beagle/�������������������������������������������������������������������������0000755�0001750�0001750�00000000000�12203357067�015330� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/beagle/index.html���������������������������������������������������������������0000644�0001750�0001750�00000015447�12143164237�017336� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Logback-beagle</title>
        <link rel="stylesheet" type="text/css" href="../css/common.css" />
        <link rel="stylesheet" type="text/css" href="../css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="../css/_print.css" media="print" />
        <link rel="stylesheet" type="text/css" href="../css/prettify.css" media="screen" />
        
      </head>
      <body onload="prettyPrint(); decorate();">
        <script type="text/javascript">prefix='../';</script>
        <script type="text/javascript" src="../js/prettify.js"></script>
        <script type="text/javascript" src="../templates/header.js"></script>
        <script type="text/javascript" src="../js/dsl.js"></script>
        <script type="text/javascript" src="../js/jquery-min.js"></script>
        <script type="text/javascript" src="../js/decorator.js"></script>
    
        <div id="left">
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="../templates/left.js" type="text/javascript"></script>
        </div>
    
        <div id="content">
    
        <img style="float:left; margin-right: 1em;" src="images/sailing-ship-128x128.png" alt=""/>             
          <h1>Logback-beagle</h1>
    	
    
          <script src="../templates/creative.js" type="text/javascript"></script>
    
    
    
    
    
    		<h2 class="doAnchor">Logback-beagle: an Eclipse plug-in for
    		viewing logs</h2>
    
    
        <p>During the development process, it is common for developers to
        print logging events on the console. Typically, the developer will
        also customize the format of the log output by setting an
        appropriate layout pattern.  Logback-beagle is intended as a
        replacement for viewing logs via the console. It offers several
        advantages over the plain-old console:
        </p>
        
        <ul>
    
          <li>Events of level WARN and ERROR are marked by an orange flag
          and respectively a red flag.</li>
    
          <li>Quickly jump to the class and line where a given logging
          request originated
          </li>
    
          <li>Easly view and jump to the callers of any log statement upto
          eight levels deep</li>
      
          <li>Change the output format on-the-fly</li>
    
          <li>quickly filter-out events by setting the level of existing
          loggers</li>
    
          <li>Measure the time elapsed between any two lines of log</li>
        </ul>
    
    
        <h2 class="doAnchor">Plug-in Installation</h2>
    
        <p>The logback-beagle plug-in requires the Nebula Grid plug-in
        which must be installed first.</p>
    
        <dl>
          <dt>Step 1: Nebula Grid</dt>
          
          <dd>
          <p>The Nebula Grid plug-in which can be installed from
          <b>http://download.eclipse.org/technology/nebula/snapshot/</b>. Only
          the "Nebula Grid Feature" needs to be installed.</p>
          
          <p><img src="images/nebulaFeature.png" alt=""/></p>
          
          </dd>
    
          <dt>Step 2: Logbak-beagle</dt>
          
          <dd><p>The logback-beagle plug-in can be installed from
          <b>http://logback.qos.ch/p2/</b>. You need to select "Logback",
          "Logback Beagle" and "SLF4J" bundles for installation as shown
          below.</p>
    
          <p><img src="images/beagleFeature.png" alt=""/></p>
          </dd>
        </dl>
            
        
        <p>Restarting Eclipse should load the plugin. To access the Beagle
        View, either type A"lt-Shift-Q, Q" or select: <em>Window &gt; Show
        view &gt; Other... </em>. You should see the <em>Beagle</em> view
        nested in the <em>Logback</em> category. Selecting this view will
        add it to your workspace. It shouls looks as follows:</p>
    
        <p><img src="images/beagleView0.png" alt=""/></p>
    
        <h3>Configuring the client (logback.xml)</h3>
        
        <p>A single additional configuration line in <em>logback.xml</em>
        is sufficient to send log events from your application to
        logback-beagle.
        </p>
        
        <pre class="prettyprint source">&lt;configuration debug="true">
      &lt;!-- sends logs to logback-beagle --&gt;
      <b>&lt;consolePlugin /></b>
    &lt;/configuration></pre>
      
    	
       <p>Under the hood, <code>&lt;consolePlugin></code> element creates
       a <code>SocketAppender</code> which will send logging events to a
       TCP socket on <code>localhost</code> port
       <em>4321</em>. Logback-beagle launches the corresponding server
       listening on this port on localhost.
       </p>
    
    
       <h2 class="doAnchor" name="using">Using logback-beagle</h2>
    
       <p>Logback-beagle displays the events it receives in a table
       according to the layout format chosen by the user. Here is a screen
       shot of the Beagle View containing logging events.
       </p>
    
       <img src="images/beagleSample.png" alt=""/>
    
       <p>Clicking on any log line will scroll-lock (freeze) the
       view. Double clicking on that same line will release the scroll
       lock (unfreeze) the view. You can also release the scroll lock by
       clicking on <img src="images/play_doc.gif" alt="" style="display:
       inline;"/>. This icon becomes active (clickable) when the view is
       frozen.
       </p>
    
       <h3 class="doAnchor" name="using">Jump to caller/Expand caller data</h3>
       
       <p>Right-clicking on any line will reveal the following menu:</p>
       
       <p><img src="images/menu.png" alt=""/></p>
    
       <p>Selecting "Jump to caller" will move the edit cursor to the file
       and line number whence the logging statement issued.</p>
    
       <p>Selecting "Expand caller data" will reveal the stack trace of
       method calls upto eight levels deep. Here is a sample
       screen-shot:</p>
    
        <p><img src="images/callerData.png" alt=""/></p>
    
        <p>Not only are the callers of the log statement revealed, it
        becomes possible to jump to any of the listed callers. Right-click
        on a caller line. A menu will appear. Select "Jump to caller" in
        the menu to jump to the caller of your choice.
        </p>
    
        <p><img src="images/callerData-jump.png" alt=""/></p>
    
        <p>Caller data can be collapsed by selecting "Collapse caller
        data" from the said menu.</p>
    
        <h2 class="doAnchor">Preferences</h2>
        
        <p>Logback-beagle preferences can be found under the "Beagle"
        label nested under "Run/Debug" category. You can customize the
        output pattern to best suit your preferences. Changes take effect
        immediately.
        </p>
    
        <p><img src="images/preferences.png" alt=""/></p>
    
    
        <p>You may also change the font type and size used for displaying
        the log events via the Eclipse's preferences dialog as shown
        below:</p>
    
         <p><img src="images/font.png" alt=""/></p>
        
        <script src="templates/footer.js" type="text/javascript"></script>
        </div>
      </body>
    </html>
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/beagle/images/������������������������������������������������������������������0000755�0001750�0001750�00000000000�12203357067�016575� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/beagle/images/beagleView0.png���������������������������������������������������0000644�0001750�0001750�00000004055�12143164146�021436� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR������A���ٵ8]���sRGB����gAMA��a���	pHYs����od��IDATx^kLWG4i&KhjUTJE@㣨Ե
    TH+E]Z>X*A&ܙ;̲NN&g{͹s
     c`_v젺hTW�
    젺0x?G젺lEk`f)�MlXh~QFMj182J7R =Oeut{GuS)Lz7>НN7Ix)tkRS[b57,3n3U2NTl[f2:�mo!5u7[ZHCȇYmJ˩8)LC6]^[&X�M,sWwǠ`Ap!OuLqH꥘7ƽ	�Ŋ\SjpK�L+%ˑX+:0QElX_2Q!)R�]9pg3g)_pydjil^-4tdWTS�xWCi&io?(0W|RM3cny�pҞ>)]`o-l>6h!*rNHtmu{�vBc]`b])\"6Vc?r]rW0GC2I:=�
    ؄3(x]t%@Z�\k;d}Q5׶s1:
     �&ޕ%hކ*7hEhYɉQl-k:)l7x0K
    QAt1W$g|;İDtڱ%CQ{Gw}%*z_ٲ-1*7HрEP.�.6ﷻLWۉ
    w>`<Ἵ!,BKSb'8v}T!8ώlO\mD{]o\1J8Ufav\B=�PP+6ЄR]j@NlPؼ`*Jpctc\M>
    `88hjSN7/B?e_:ȎeݯWKCM#b�ĉzpDmVꖬ.B#cn]֬<�~sWzs[V~"R?Jx/.H*�pCΘj`>m>p7JW+I=Js0`kyi,!wF26ĉ(=(Bőd)68tM^�dp.qLKQ)]0`XǸ/6utdn	kWY�-.KvuDR]fh+[aON	G؛ƒC]QqXy!E*C㏀p+\g]lm'=h܆jXp*nb-XvVKqo-Uڔ<p_՜R2KPr\"aqΙd|inxVEq竰Q7鮧ɳ3LC{ޠ&/dLW@bC,O>A҃jaL6_mtHX9wi喲祿Vɂ	[ilX-Ab`MY(ɞcņq;O,xLF<N~A5I7`Hc2d%tDrpJCaVi5u--o	0_pњXG҈<[NCTJYch:`)	{zWxI!\<
    C8x<ϘÄ
    ?Ba<i`_::::::::rX����IENDB`�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/beagle/images/nebulaFeature.png�������������������������������������������������0000644�0001750�0001750�00000126550�12143164146�022073� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR��t�����z���sRGB����gAMA��a���	pHYs����od��IDATx^wǕ&cf\˨̜#yl=VqMuu[rnղ],,rSɂLQ(UA-Ip7pL$X"HȌ-wBT"3_,_ܛq@�� f.U0\'KnZ@aAd.#xBL ���D|Dw|97Ry~43@	��@^ri3	ARؼJ*Z	u�@��B@O7}_|l?PjA@�� PkHr]?-gGofS4tLթL<}K/S81v}іw𫓃Gr?y ZL�@�r;s@>č PLADq9JmVP W
     Wt? ��er%ּw@2Ѓ[Ay
    h9
    ,+RaZtrͽźŗr+i*G((_B#XPd"WR@��#`+)Ħw_ſ\I%~5TXAd+J&"kUgּɢ/{2@��/Jrj+Kr2\rrȦ>PVƮ|
    h14׈,%=^zɫ)2@�� Pt͕Q	~,+WiA)40+ȕ7Ts9tR41f7VYfjc:w2۔bǙ20Uza�/ZQɒB}!C �$>r*)V(2,6=M\s+i{$Έ82Ѩ*Vt}EqD;Nƻ`j%
    .\+qQRj(
    #59Pi �@.-)5\Ş&Ss-	r}͡*432IňH;ʍkF:%1kDpM((S,
    ꫂ{Š@��Uk.Hs5vm\A꽫nI!Wgd~,Xm8bۄWq
    ^,utdTXa%K:rk*@��R
    5wn
    Mw WJ*\t67,C<\=k=cr)T+:W ؕtVc9*5y<Pw �@Qkq?!rCmi/:8҈s'ȯ/63rr*:dD޽RaD\k(!w;udv1d�X{r%S\ 71;isH>)#Th;*FLkSsuEI$bsWwnt2߹*:(To4cSvƶQa ��'WuC߹}r~
    GG(Ohg'4i<ȕ|ҥ\gŸkq �@	0ȕRRT9U<J1)[+DM/N߽6O'�r-a'@@�� P\Ifa\/8%@rrg'9SGB*ZFGn@�� PZFFF%s2\d
    a&,\98DkSIO*ȵM܁��@Jj Ng1IsN$WbVAK\YAnh��C@-L/A/9:%JL%p@rCȵ|퍒��@J|)F&%J7Y?~Ax$' 2/�@��2#gD£YbJN5EAp*OV&TaAcG<Dk �@quyyiyDu>[tX`)pJNiy| W3}"r-n#7 ��(S,vQhܵ92gdzZ QM
    BTUqP fGJr\	P�@�Fg
    O\"S޺xnh	AįJW
    N*޶_
    U "60@��r" րVJoXq
    
    +{~}
    *N\R멂S*vKf\mQ�@�bV_I'~}2;<;B3混onƿ{bhd&_ilj$
    WaZ&G@�� PR"f
    ݻ~H{u`OG.\w`Ɵ`oPO%
    %ItPXE[Y<r-i#s ��(5SbV
    `+!<smIk{=>{s祇z^LLYhx*UpAYMlkX)]@OCwUL2Z\x )PU}eċCx-&R"V T@޳
    bWIsǂ)f%r7I6ɡ+d6ؔDJ9Uj-#ĪOxIȕO+pW0@I,LDMYhJ_PH@ya&GzckJ52ϝu{V؄*]v_iS1%$w/8æ=o:Pw.W%̤+ 0h^l%de>%ϭ,s_VPE� C 2Eq
    J\
    U0+-ݧ]ě~.ٖ'gGfsConH.٧8>nZ~,ٸō\#/H>r"[#ZI{G˖nqSMEI:	ftQKrzFHýv"LtQr"`\mÍ W̿@`!֎KDg~mMaJ#rf5}A’KwH{@SqA_;tO(mZ.%_eSx\2
    _N̤N6%MI_mב<{ZYF\zg+[$SC|DEYfB_hx'4+l/[f<ڱfQ{tz:Pޗ)Չ�kI*}KC}g_n}h=_Μ9q}o5X*D?_^t!啌dIj-Ʒ7ӿ~R\O_Ng+M
    t!R*sKPF :#WƞjfbSNXLO
    (Nj"1=%"xV$1CޚvTrkuN
    &L&dpX޾}\ODJ(U*qgKKKwɄK+.ALAv $$6P邜`Nد~}=$Zq-uя?LΕ>;R*TkL2q.	7b!V),x,#٦Xt)2UvQ\cbmar-@u"me"-|_
    HvZW:{jKDg;|zwOK'KP7קF7 WfauʙyNoRkp$ڌ5z>ʈ#*nK({8#Ⱥ&,,:fwW<A35QF⢓V'Il(4	gU��X=+1+}Jav}lC;?rVH&_
    t!ݤS#Art6Dc_xoIoorM撊l2J;i2e<faSi{"ta
    x$~_RWfɓ##M:ld8Y;yRI1_h2:ܵDuc.2\H;؜
    vr�Տ@D=Dw>]w>pkSK(SRX[&uȕ(^R ~7ش%r}?_>ȗͅ)
    /L ޕal.0\2%!qL �V"WO"N2R DԊtMHrS#D+uC/i:ÿσ\WtU̲8W� Pd"rc~ڔ$m@۔Hs=}=+m!3m8,LbB+7h73\ܤNFI PI;WM:7˳3As!
    kHGW+m3ZRsi+yMwO7ѧ;fi/#a2N|C]%QE@�� vnJ?Nzg9!fpvdVzJJcIl?Fلz\VJrɓ85uwd� PM#s+TTI`‘CĬ}4QC.J<J\9[)q01+@bN
    &|pؗX>%B6	͵d@��&:RJZ%fU=
    dnsB+AĬĩ;N•6	t8BDAI᏿,\_;ۃ-T2t_|j01`Vk\L
    rE7@��D@v,e]DGWGFF)ц1,&!P[n,щK@>a
    ta+AS U0U|S=	R ��G@H[J)HfbVRNbȕv_JG}6Jf)=Mu,%K}Y?u71+鬁5X(S;W] ��Jy3P[M%\*v$V0KGuda6ҒΪ)SLt&	��i擻'+Yb҇f+ѪN?Hwxh(99}فIav`q<� �P^stia6a:@V2:\7cN'&�@FЪ8䚭i��@@ W2~IVa6Uv@;g1G}s$ǿYƭE0aHaTڧ
    \A��@ |WįOR qDJ͕7KV:\dV\
    k,pׁ@�� CNΉ;ɺܭ[]D\Qt0*_9ھD:u?8i||xxR:	C1y'"^q-��@ 0ơQzJar
    y@,{jV<8J}6CP@C	
    N;q㷓7>@fa� �&Z|;9"95i/1%%ɲDFc
    ~+	~J;R+U+umC� PkV	*<
    K[b>z,v4KmDE0ۇRJهS,:�X.&A(~zwQ`_nJnr]KAl[mдf{ *�AY}Jc27 Od`p
    !T	� �8YA@�� �UV\u/@�� �@]і� ��� ��(* ע‰̀��@�́\��@�kEv@�� �@@�� ��ȵȀ"; ��� W ���EF�Zd@�@��+��@��"#�r-2� ��}�� �@�Pd��@�>���@\(@�� �rE�@�� Pd@E ��Xz֣'}o/�@�AL9SO}w
    BbM\? ��ȏ�͙	?^ش_\Z?>@P$Z!]	1��@!$'|rzzzaaQ	:!��!$W2ʺ5:@P\A)D@�,uqq֚ 9z犁��!@r
    \g]k9^##~vAI2%g&Sydupeu92.aaUH_t"ph3
    Xr%w{]F|B̿S\\xA^VjEYyuݺu|T'rRLO%O<g䶲+KU9N"\T/*g$@<oLg+@Aʐ^)xե}Jynuuɞ>vf3&Vgb<1mgrVGs]װO͑+|mMVveԥ8
    B*4~IH/y]x-x+QiT\?͠j\#BMͭs+drk66	v
    beЩStإ<e~P.	![
    khPpUkU혝up�ڇ)lz`ܒfcY9rKuHd^_O9Z}RLyn*c
    ]v>Tz뮮&$s2q!Z0Lau}J)m{;'u'ΛjU`S26h/!#tnHre8poq'Lo)۫oX=x>p	RUk<U[+el%Z"iE׭*pS7Ueb�&RFSZWnZMB$2O
    }^ގ.d|ףy1pZ[EUA;9kaC;7"kY%0})}>4<RD4oKbw 5KTdfrr\r)zf&TsJYܙ\%Hf1l܌foC1_1dnŮ\'D)xS<Z:S5Ve %	֔8f@@	]&NR
    L8p`Qz'yŸ`Aݎ&KuK*Y#i=>¹c7s>uM6>_d+E,J%5u;GPW,f2j;wJ;ǂZWoDwDR͓@X;WI1
    SFa4X]ۓh2cki422]ܖWL6'׈]GI~rMq@PCh;պe6�75}-FQ2U0n K7d1+#ʴNI:+#(ʪ2W[r͕wGȘJu<Y,|GܧkLr5dWSojPCs"r|lk`
    cR ~ʑY(Z"B2)SM S3ӛt]90IkM)+7♘5hDKh,.<dƷmV7mƻg#:Af	jθ<U(0ӗA"+:#^U
    "~uL ׾viTJk@Qq'y"%Xr
    h/0w*
    oji
    ȔQ1uf[168Hp%ZV}-H#>Nr	|T`l6E30fKf~Ng[
    }! 6;Ʒ8&IX*Q]p\#XF"ΨHBm]g#ZNȧjs:kv{Î7Y*qVJ{_":V#ޢxl?選
    nE|7E2/3"JM ,5>pPi#vbgF.'2Br]jiآcة*Hd]bfaGC<yʝQθD힝]5v$W%_b`MS\SPjM%%β|r׵4/:̮ݫޥ&\/j5Wn]r�V[ޥdj@XܩZJsob|\SrPp&4AZ$�#@]kr
    8a� Pn|sh rI@
     $'|rddh
    A`1˺7N@_G��AL'nڴ饗^#mAufѩ@�� 9ϓFF5ɪݚ\h��@X\$@�� !�rEW�@�� Pd@E ���� ��(2 "��@�\��@�kEv@�� �@@�� ��ȵȀ";?{[/]x)~6e+P9*g
    hBugc
    }7Wu"\]<Ņs>Jr8[W~<j�VC+!B|MPP6V( u!Y:VpISh+xοP%4}L<4$~ȏ}\ފ9o>G8;om|D*G&XT|0R'a/X
    C&m`5}",K1mjzaW׃ſ6IJ:b*e]^$
    *KcQt -χvng
    ,=3̯awAqY<yKW1yr
    uN!VA#ifVĭ&Ay8YJUɢHA-RȣU6"H	C,&j,oʛ)QD7bzEBg
    WN?cŤ62 KFQs aLތui
    TRUd!^GAyMu;|ծ\H"J3�O!g,sBw
    >v3=yXyf{:0-oP W_`cDn<.G
    ;M0+9{<3b#ZBtTzV2AI~'čtRy+Ձ|D2eŀ*)$$oVcUyqjl&B_2cT[oqw,^Ko8dLN׽Zn#R5!ğJ$U)f,yFOVaq93H<2<3'ȵlԂxhY"*|صŪc\SFO͊6cHXqP#.cJG31ΉK C<4[E3%=L$)V*^yOm1EgHtuy:4Qq~<C3V^b]!~ծIo8KeoED)ttHu+0&wmt:yhsݗ\ki
    +UHbA!W#!&DuCs\%|-cá3sbE"2Bc vu]ܖg
    $yirrMjS̤g$KY*lR*SZ9&( r4:w,^oRW!ø9IҘCHO󐫣/i!	r͇
    5Yeզ vdˡһfJbGő ^Yx"ꑇ8%QD^L`2ULeu%qlVi-1㚛thqL~2fu'Vo9o{BmvdE5t8`G^IxLHN;|[Ɯ;yE6Jo"6-$ עQ2ʇ@x74E]Ϝ;[~"5V͗UBDWܩ_uL|n0
    ؊2ɫɕ1\fJ@C՝Ϩzcz1�"ad5ޕ>ڱ6wpd|hk"e
    ;#TԄp˰-K6`ݽF$
    1/ӂ=i}䚏T14SAQ	U<QaVц@xh+,=>wp]vX�V@�UMʂU:;lYDA!D�v@�� �ʌ�e �@#�r6F
    ��@\8@��G�Zm �@�p���ȵ5@��2#�r-3(� �jk1j��eF�ZfQ�@�> oc� �ʌ�ȵ̀8 ��}@ƨ!�@�kGq@�� P{{��@��  W
    r]� ��("ck!:�@��D@ @�� ��ȵȀ"; ���%s~?x|[? ���YE r-.Ժ,beYm]
    ��Aj+ ׊t
    ��D =
    n>qbs$Fb&(SSUn!
    oI9,Hݹ"/ ��X'WR227:ߡۮ+0k+Χ1f&!0J �ʂJɕTę]E$4NWՑMg!%vN �C`hboQrh,؂\]@k@��#rr
    ٕ{J/P?fRk%F|Np;J@�E
    "אtӪ)d�^&$؁e6u@�� P2]M[JD� �*ȕn
    k
    rZC^ ��(
    +#War5vۂ\KD� �5k@�� �ʈ�ȵ`( ��X!Wz���@�\W�@�� ��ȵ(0" ���
    +z�@��"#�r-2� ��}�� �@0ɵНQ��@�$E;um|Z ��(& b��o&kltT�!�r-TȵZ� Ps\kISU
    &D@�[n,!Rek P\J#ȵ4"W �@�umvlw�2!@;$SM\g;rT3�jΘ6;װn
    *en:@jA@U#pM|:[ny9?...}<Zŭ_^wzh� XZw}r1?_͟zMeqMVѠ*ȵgG뾰r"Wݣwݽн"BvᓠzXV;S͌
    T\\*_à^͖dL>Js&͍A2FMq?7'[SS„SRҝOa}aK7ݴ/dL( KAKa r1SDC�	��D]K[ ;RH}Q{2;l|t796ʡ{>f�1n2)5Ƞ>]G&	zi'F@-�X=	z@븼b1'C6O?
    E%1U|~RAAϠe̲3Vߛ�@JwSs#h}A\Ml]POV\|Q/7/Vx'|
    E"[zRB'�@ c,ݻ7:6Etj~dOTL	S>
    R!2hs7fB5"J{B?\E;hBl �@22%U0G͢&})T= J.#R݅���"@\G0["O.w��@P\
    b-b��(! ׬OG.<�@�еO11IE|z"� �@,.-
    
    c-b��(! ׬OE= ���HE �JX#$[c"W8@�� �
    B ˹Cd ���@�>���@\KiB��@�o}9tp
    tA/UkSș'QnYאsbȈ&fXtD(rF+L@|u^d,1@�M2BsCG[̾SDQhut6u8\},^NU0.6_ŕ
     �. pRoOon`\7=Qz?Mg'''o~>rm߰Nu9TR%[Ǵ�()#׎]=}ѱ|hvzu
    tA(}>>ͳG~#Wf)|ţ^rZL2L>"&o9lT&kZ~
    gVV $Hh;V/2~84v#s �@�vt^}JV\NXKM[_7J ׈8W4
    4$;A
    9GF
    1*ɛ.lMgd	9$HhȯRDE]g=%Bza� �@)(79p}C8uvvFlw^~˯U~_h7D7l(ot_"JC)uRw2f|8n#VYgAx_n
    U,+F&EyRI	�<&׃I_y?0h_ţ!]~®~|'{|'{kSa&
    ̫6#WGڂՒP{\iYpCoܚ`nG�(9&#OOMMJJ:??O[7>-
    џo>Й;0Jo6Z1_Lŷ
    ߱8
    ,H\cU٩:P'!��~M'O:77Glz'MLLFof
    tAU[{߹]'׈^c^@؅Xq
    [4bfa(ύWiӐ-!KeH][?Gv$0��@Dz|{wwO.mxx陙Yojj&W4Cej@@�� P\h2J*%ȵRȣ\ �@\qp\W �ʋ@ȵBi@�� �*�ȵbУ` ��U@ڲ�@�TkŠG@�� P\keQ/ ��#4[)N:
    @��!PVrM>D❎A.t0I Nh:rܤS ED	_%MLu<h_)lVԁߺu`}aiO]saꄬR:ǫRC@�r뮽rcm6>o/)<'B|?VGgnSґ~Ҥ%dq,cŦj!88 l,)HwxJ?eݝZKTG4 �
    zdx<Бc׶Sglrׇ'޼6Fz?Mg'''o~>ru~qN?K;((8MV+:uj+8i߄'{)TB㧬;5%P@vt^
    ~M?7(Arg7~\z5<3gIچtprw9ZW_kRRgK#(/+s3qixIQ#G?*)^Q54Λyʃ,MhU<ҚSbA@]J"CzY!o7Q�Cyb+9RXW'&kz{GMCl'Z^-/]hhۛ%+HGb=%WF~8{8*TزG1rvM @0{)Q(O/+۷~W_[W[Lj\[%ĵT֐T͒{ՂvQ(�#Pnrsف
    Β9u\;
    g/邠ٽ&M4͟?7J?
    Y?]}dƽE(Q>Oo5SbBG dV3IgT&BFܲ*iT$V1](95rU[JӶl-"n
    D �ʎ@`qWǧo޼Iů`&׿G;A/~3Bf4:]/O:3O!׈Chu%U-fReT	5W(`QObm\oj5ekU.VF&sT
    $הx!vf4l}@ �*@c_:q*<;<2bvn׾·J4?G>@g@gGRP?a@X# Gs5gg#fԲgӊȬ"'LٔDt3e<5nMܬXsa⨸oc[4W[&	vR(CWoX{UqB�(3&ד
    f#6&&&lr}u7z3 \w~yww@U#ݎ[,Eݪ7h1	e&>2sTc\VS+ӴYXm&7Qdhq%F@F5}zRlVa۫# PQMηwwr׆'_mr(2(|Ex+ʫW$U%"@z(7&҄gLzeUO*k$@x`M,o
    BrFE@(� �@U!�r0@�� P\kQ ��*@U� �jk-"���U@5Va|SU� �(+&j"Nlj
    ߠ@T=:ܤS'49En)Ѕ9>O2fZ;X?xeggv8NpSmƏ!qYq� �J@ً~7#[߽s6>o/)<'Uh>
    tAܦ@r]Ny&q-MzH8,0}P4r	]V@ٕGL]uQ��+G~tjc/=wglrׇ'޼6FU<~nwON
    N}++ajN?k9ה2MV+h٦iQhB+>P(w<	U8� P8e'olkSSƋw~?o]^~]P{?+cQ/tGdzuY;8=<?2:9RT_S55WIB|}+a Ë:Ȳ"~.p
    29S~gm$M]ŅdE\?@Qg:f(| �@ 
    &?zx}cc_.7~~qw޿z&׿|gwSeZ^-/]hhۛ%5̢p"=ugaLB:qB}
    ũ՝DTJ.+=\,QP%	1oQɆ�yMF5+[)~*�H@qo?~p?zt?~6~>:]Pvo{MtA~ROtOW5~nD?AZ©Q6R&=\*PL
    %pr1J&?8FuIhbzlbUd
    I,)Lr�"	�(r'Smr_x?zw_ߣ?ޣ=Czɞ<rQ~6_t+jG%Ttڏ-sA׼V@~$mM@VKdWf+*^r501U�>T� r}qo{O<ΫK/Mڹe_
    zc+U>49:s:^~>r"+[L9Ӛfd)B=a48&Yy16KJNR".roΦ\+,CXad/ҏ@�DOwj?6'Ѻ]P}w~yww@0rbl1&J17!8<fP,ŏBS#+s)Թ$2vr28[XJt=Dldj~Tx
    MQVtoK9B
    � M|wcϿ?%B
    º04I{�@(7&҄T<	 P\/\@^EEm/j� rG+)��@�d
    k �@�f #�@�d
    Z&2dQ ,�@�d%׽
    ɟg
     �@u#rMօ7)zush{Yvt@�� aA_&9߮2~g==MvN~‘xf> 1YF3qv˜:cD5^睄TjstE6
    ϛʘ1avFY,'?[{-[m=&['E{SNx?\.z@!tWnJ#{n鸅
    Ь$<~rU8(@NjɁa/DR-oPNuq*1c\R<o*c,Y.{܌,sve9XӔ1Y,zdx?70vM6~yfDv'AiAo53e0FIP�ٳ@+"y)Y楤)JETdּ sb
    zBg#׎]=}ѱ|hXo|8uS͍t:
    tэȭյel!̴|k GkVꆒ]Ņ	3tb9^;tM(Ọ(>QH�KLݐi9Y	/O*wBmB/f!>\eE>&yb+9RXW'&&'';:lr8~va~t4LAP@z/5CWc$h"#h.V,*;Xݑ!FSA*Gf\7O;=_nEu>y7_99h@iTd5QDcI]ySZh6ߝ&9SpR-WM.%c\8Bvkãĩ7_we\R־-okjJddS{_]ؖ l3Q\\ʈ+̇űua*dE)H<LY-fG)G%Gc|S;JdY5Wf
    
    ^T:aK<ӄ\CbC&_\+z8c7o޼mr}|ۑ0kϞwBׁ{|F
    V|믑U;WOa#z=;K+ȵc	eV5ޞzٕJlQN.ReD\?9:6>55E*+<;<2bCO@
    Sۏ:Г#PjB3-m0DY?"h/޶P2^nlդZ@0{RkԌOޛښ!/kgUt
    )J9O)M4/%Ɠ+a9sح(TVd
    k,5!kf鳂YMĿ	\e%/?Po^Xڲ8:
    y-~ 	E{bKhW˯H;nWN#s&fn.9ozźvl"6 qWdHehK I_с
    I>Ƙ>'Q-GQ'=M*1	Y3yg<%\U$3z|{wwO.mxx陙Yojj:\	]vEzB_QLO�� �!Cy#օMouk\eqo6@��G xV֛&���! W�@��l!�rV{AZ ��� 4D@��l!PfU -�@�d%׽߽7g �@#rMUtօ7)zush{|ҫ �@�T5 \ۗeXY̷8/	??Dl
    JF4]B)V},[q@P#8Ɉy$G+YqaF*u:N
    OVw87+N7;rrcmnrurYׅU?mmecWIFV4]!u23ή)Th4E @8띾=gG^L
    #7DgGZ?E<Pr(WQJk~\feFs%Z=Q/:rvM6~yfDv'AiA/D<;Ԝ&f
    )Ӧ&HY(ˊQ(]{m?MeEؠ3_#^ۓSR<X}J7Yz޾RRsy77zL;6{ S75^AM:ݤptI3ŏgsӎ3v=UZT3+	+)X8lC9[X"	u@1Cף*.HfhcUev̸pl#\z4{6WѠqNAB-ȗʝP!ҒNbfdIsrj)ī5&ׁoPך/MKO&WVs$uGAF[1&scpUҙWU³{W^!(Gc!W.$Q>vJNf\Fd{*Zs;	R.m>Kx$,4o*Coz4/Z"ABssف
    Β9u\Up*sMW\lZlz׶R9;4ر3hn,U>'(f"hN+/h%޽vΊu5h{F)\/Gk:]R\ٲgVkx锕{sv݉؛Z[\'}ul||zz͛/]mr}|ۑ0kϞwBׁ{|F
    V>!>5r:rQ;[7-)(}yt59/%czzf	G<S@3D>%
    审E6]Yd,q_3՞!#OĩDȈM=*)Om?Ds[CO.B+}ϴl۷M$WRPue3"Zа.ķa3w;[L�jQlIbe>VUλRv̊7px4<ba,M
    C^Gv#W>^hџ3s&YӇkdqfjRg\O>+unnNHpvݍzЖšOQ7kq'w1ۋ_l1w�7DrYkT^G\x[O„t7veEKD=/N$qRXUӄ$(GVZ>SĀk7M†2R6ȥ=?ăXb9`GOˉȈ	nTAS1s6iN!sۻ{rkׯOSS	J&O;v]^]:
    n1H\fd$@��d\i2?'N}X{SڏfkΨ!�E xVf)ܶ_UD
    ZD u@��,#�rrAv ��J@U,
    � �@-+w6@�� 1j\~~Ɵk%��B f)SoR3lѶW|+~gj=��U@65#Weg);
    gֹE-
    >&$:E$g)Ki=;̎]k*KII *zw.vB>jpE6͛ʘEوS68SQ9xΫdGt#4n9tX\o\u!.;Dr].8_6L5¦X4t&NkX~Td*I 9^wqާRu?hjEv?(\r3Ee9;ʲR,xM}hV]HU8K^@G]N/hus~d83-t?]\>UOib&旦4q
    Y$sQlVJRhk@,"*іLڡQ46|}cJO*•	e
    EeY~.kiJjՎ]=}c>s,7a>Gn&H"לq=O鏙XsV79İ	yG)U<=+wn</Ҫ"N -DkF#5E,ArCm9;oU7
    J�SL|cw
    q3CxyR	-<}KK:5:KkG畋WHa%^ 6^|0|nXn (vu}2 HZmû\d(St5y5P_q`ܐ_
    `	+1cDbڙ\ÖzFBmQHArN ryc \rkE΄ySY4ִ3]Skz\8Bvkãĩ~~=mrJny\SU?'&µmǶak?Wަ5f%؈lbf$9:,Yr70[U<".wSzcVd(Dsc#L6?H[EjH^reAѩ\^r=zձ7otmGzcL={ޝ
    ]o})X+8|̅2؊.w/ˑ\!zzf>p;0Ks- P0[n=_dsL,eBUWO2c>rظNJ:??O"N7?d+Lˆ}Drqk@O5cEV,;s2r,nas1C%eE5Sjr5	Ŗ)
    /kUMmVyp,/~n BR>B"tSky4	<}V0711,Kc6쥋š-Cn
    (.\_/�1R0^#{UJ
    ^{$QYVQfP�\R#i9Ddl[`gCSV;@ ȑ))LOզi~|cj&=9Q&z;,fM3Cηwwr׆'_ȕ:yrݱҎWOQx\#r{k&�@f5&C2ĩ/ua[𗞉egBx	�d\/ТD`et@��D2@hA ���B�䚭@�� @h$��Bɕ;pV@Z ��45K{{?oL@��*G f)SoR3lѶW|+~gU^� �2@65#Weg);
    o	o?+}L]JE%nuh$P	*ΊGbxՋgn9省q	krxy$G+YjŒT(]]ŧHiǾG(eL9<a
    }r%Fhn9rh67:,C]Dwn¸mlJ4i*otT>E4/#<ƯT[A ?Ԩ>s8pQ+YBb%<h
    8vΎT"\lYn,p.K䁎:c͟_+ꆝ(pfZ~;w8⧟ĬȜ7JɕQ(].vÝ>< ,X#qPDȾё*bR	eũ?q_9lkG实`1}z0#Nxasc]7tэ$k8i>W%fbdiޫ䵺$'[XuLOїQbYij[ 2ϲ6$`j"wb.".(]^<@-\ʐ:c]tUh"{/O*ܪOWvwY:1#vt^}JV	a˷{(k͗^of
    bZ'+O.?H
    0iܓy͝(M]=T
    !W}
    kxC:ScrIcM{~i?cn|(uZ\΄yS/wwT S,}ρ#d6<J:;;Ks&Wȟ떷5^sqii뽯.\vlK]&s59g(2ܚ:X?En-.%3+Hay.ru]g
    אә&78oB	j-J|7G0[k.GXiG]4>.=oyqYr|\+7l=N͛7_#ah=1&מ=}N7{Ł\kդ�zE 8wV1+ւ#9T4 f*B˷ڃWyd8J^HU]FlTqs%Ӷo*5v19~rtl\K'N%BGFlr}VHa}j]'zuq
    ]M_Y{eCݾ
    uo"7l5^akAV,;OߵE[-IU)yA�-7kLHĵ4WG|b 
    "[Φ'=3ShM3"CenMTF{Q̄G?ZceǑ_sF 4ub<}V0y'MLL$8KcC{bqh(+Z]{W_"N}^:Jb+^|n:6N
    n:dRHsPD64ǑTb0Fclg
    %M8(y &tfxt<3Hp3Mhسyz>v'="3=\קgfffg鿩r!O;v]^]:
    nNf-@Q��+G 3|Hq!ǃ8.lzcKFg^AJ �@" 4'Thu1n5] ܼA�( 򁁒��@�k1PD@�� � Wt ���EFɕ;p-2l� �%׽߽]� �@�*l|C:ԛ:۹um=㊬ߙkF@�� V&v>߾,2~g=Y:?B%MyB!'RF]H}YD(k94pvE6Us}R=]nl?vu;8|vG4׹u!]{pˡzw9t	'uy=H:h*}Cx_n^(?	"tQ434D'"Zc(tTLxrhWzΎT"\R`IkuGz9vm;u&S?<W
    ;Q ̴ v"rŢl*GD^R<reJ&a	Y(Y?/�2sDqDȾaJ[|>�,�g~R[vt^
    ~MǞ{`y19M67vЅpN7)@tĚ$ރ,$^V+\MO'<_W%U\Ȯ/�8q6N4a|&u**S}^YUCyRRe/5E|³vt^}JV	a˷{(k͗^of
    bZ'>Xsy$
    7E7ZHW"u7�-[mŢ'm}=R\yY=FU#R*=)@G>]a.\B2gM7KVHFk\8Bvkãĩ~~=mrJny\SU?'&µmǶak?W6"\Jǥo
    :ߘƗz\P8xFqYm|DOUބ@ P|5XbCt"YJ׮OȵrR㤯OOO߼y_Mo;c2|P:PxcϾ[HolAw]Zs5?*x)IsdmQiJ"۶zzlPk0M(T	>%Ȱk[/YRloy5W	p,xWI#3f#OĩDȈM=*)Om?Ds[CO.B+}ϴl۷M$W]jaFl=;ʌDO.Hb+$Opg)_TC9&̙zP0XWraLxd"Dg*DeՌ͵r}]h'O:77Gމ	ҿ/?Po^Xڲ8:
    
    w
    MᦡrYkn
    P[Yd\Wp(^l*1
    Q,jӱlچ&Mnyu)*@Rj[ڻsFZ1n܈	rH*ʇmclٴl	+H.<3=\קgfffg鿩r%|ȓ]vEzªAj4}J8y" �@&d8.lzcMKgHox_Y#? �@9^8vյͬRW(S#� �J@ȵF@�� �J�ȵ"k ��X\f@�� PBj\B��@�,Ɵ@�� �J@5VaSYޤpgέmWd\K5r@��@65#Weg);aK.Cco[JLb'R	V#깖~.ǿ}KGWdP5ą}gQ3AW5|fȕpˡzw9t	'�䪟C#8'syjWӝ3
    )hEf[u  ^1*98xhyCr*>Ԋ,-͟5I<sfYTn(J%5ԯ[|v`b
    g"\Kȱk۩36噽"nyBaqܿ�Og&*fqB浉sB`39$<�ӆ+	yrI-?Pծocg
    p^ 'UjG实`1}z0#Nxasc]7tэ$kv5NS7Kj%	snfZ?6˜w;wADn	Grj8Ԥg<~^%D\rX_@prO89:CxyRQm	*-kG!>J.e"KkG畋WHa%^ 6^|0|nXn (vu}2M*7pvOc2KsM P߈mͱAr'J%'6X$M#?\32o@Y'2)J2/мn''M7;Y"AETf%4=(q,_we\R [>z.ɦɦpm۱-uAؚh~-N`7CFt]&$W'ZB7S04q@@X}Ӑmϥ7ؓT>r嶕ȭީewH"g	KRmBxSk"nQ2l=N͛7_#ah=1&מ=}N7{Ł,xR|\U&LQUSđ䚶5~l
    VƲ]kB2"S"놆]_dЕQJ^|{5bj_2L9~rtl\K'N%BGFlr}VHa}j]'zuq
    ]M_Y{eCݾ
    uo"Jre8	H44-8yid籍QiǑr
    5b-ӖHzUR˗0O+n<Հ"џraZBژklҮOMFnV)Cf鳂YMĿg_zlx`/],mYt?pŝ&nH0,_}AzGA:קlIgFU1Jƚ{㺹KE.G(;[=+Y_V&H*@x5drBG1q%M(!ј/g,CjzcV[Q!sۻ{rkׯOSS	J'.x.~DD@�� �"rM>8מ8.lzcmKO!� �V@65	XYWW�@�D 䚲&��@J�VIC@ ��@Ӗ	�@�T	L܁k
    1��@`- P3\M: �@�*l|C:ԛ:۹um=㊬ߙk �@ 
    ru~駟޽{Njr;Ko_aqf3ߞ,pnpe0S'8"3g<)3qQ mzE7Of,%<s\&HM#DgYGCWH^Xڙ!Wï/w'z1:d\oC歓n]p^l2ΝQdNru^dCb P->5<gq-o0f`EY(4*&[<7rɀ#gGYV*s΀e>;}TK"GU8K~ocoC/j͟_+ꆝ(pfZ~;!Rlʏ.&W Q�߬f�s2HxC7S&AJb68Uࡹ+6?WR[vt^62|o~zI,|0#Nxasc]7tэ$k%%fbmUZTC/rk6t@	X3t-#.a"RîX/B@prs	,V˓=UZNG'N4מC#2o~r\M/ ¯5_z.)h]L7;zohu
    	I_E7Z1sݥEPJlD0afLAfEK�\tO$+Axjtd5Q�%YhT.82ʲRE2<r=_4֮o|ᶞ^M{zz.*8s֫tA.N6-M6uՅkێmDF+OSӺBܣ">L5.f~"Z6%ɻehdp@d P|*q3P0Ig>)Ry^ Gojl>
    \Yx?~=ͧA\v$':dڳu~ƞ}/߷8U޺;g3Ѳ|\rՍ:2B2USHę/îe=}rE6]Y*ͮ&}^%mpXgFsspxꡯJ7~zwhuxd&ׇh֧u'[G^gZ6PG&Ea~
    H44NrʌDA.SCv!su*[1(f#\uCtrMT.\͈	
    zڦ(g\~xnzvnÿWxC#׉g_zlx`/],mYt?|ŝ$n
    H0n	~W_V}NQ-cIm7$58jgQ>L@#,/}\8P߉
    hoLj	
    5.V{,йdGfԶ7qo޸133;55@Yȓ]vEzB\T� �*@fUDEJd|Q%N}ꀿJw6�X+d\/bD`ֵңQO �@ r �@���� ��H�5
    J��@�j\ AT ���Cfuw4@�� @5Va۟ԛ:۹um=㊬ߙ+�@��"
    r埴:ۗeXY̷':K-ľC2mqBSfVȂR"E!	>3j|eE* vpDx:;*9\JqaF*6c=L:P%,g*1ӘLk?W#4n9tX}BS@NFu!guuDr].8_6SU[C=;Pk0r$ᰕ㏝,nצPr-4~@HOjx8qw
    a9+Wl /*QJdk3`No3MDY/cP۩36噽"nyBaqܿ>e't~ZO=Sj"WFtY@5K"#
    C$ P.�dZ"[_>*bR`vsN(+^q~Nj"=rכ;6{ S75^AM:ݤptI<%%fbiޫT$1$	%prh۶h+lm[\.3%}cK؞xsv
    Nnm(�A6@D89up#Ǔ<O*>(a*-//Vs%pG畋WHa%^lu=AK7wt3A5]k.lÙ]
    eCqVwtsqWkH·9Ƽ#L*o}#Xq96ӫsǾ]P]hx^[8\%stJgySN%W+U$#ȵrZG?tmx8uv6
    N@\}*]ПMKM]}uڶc[ꂰ5џL=i=C">t-4WF81<7Y%Z+ghg*}."RX?UD,wto9_ދ@E;}]G6N}ZlTnT4,kקgTFVnr=zձ7oގ6>HZOtgO߻C@=^oq`#fð޴<ڑ
    JيEq
    bvMEhn:'p	a-ɐ^^G7ߎ@(yH0TLT.[^U$bk{M4c@W*Yf޹9~rtl|jjU"V~'ZE wonőW(t5}e
    u6ѿ*K޲OY
    yJrU(1!ۉm^m&fhb"Z:ٕ>ʶ}e0ҽ7]0WjA+CQO"bT#|uȜUPVjF溲STBs=y`ֹ9NHpvݍzЖšOQZIJ&Ѐ bjLmH5ܷC\tgdF!*^!xy.65a5"Lc.9oZE\_" PL
    bpEc˞x7R鏢(o'Ojm_{9 a*RL˜Wf4sۻ{rkׯOSS	Jh'.x.~D2C\[yR%fţ� �@d\i2Nh�օMou_zblz.FՐ�@hd\/�	*H]hn.R
    �@d\^gd��@\K
    /2@���u-:��%Eɕ;p-)� ��Gfuw4D'�@�� P:2@i
    ޤpgέmWd\K5r@��@65#Weg);aK?IiJp&wXfErQK.kk@%PߘYGyci$Y>F0΅!gI'g*1j(̐+3BsCG[e^r"O$u4$WvXYiXO~V|e*9l P|7DggRA3-[ZCTuʟU]s0i(+gYXӔЗ/,zdx<Бc׶Sglr=3{E Zݰ_?La'"7.?Gl&&&j:*_YZM5T3ƈ`|}&<"`rI>J>PV*�gY`֎]=}c>s,7a>Gn&H"^bQb&Gp)L4Պ,T:h!r0 /hUgr+.+YY]Y#
    CzFY	t+(C_dI%T[u#i_z9;KkG畋WHa%^ 6^|0|nXn (vu}2dP0v2P//!\V7\BlܩM[b|mŘ2boVH�\PKȰxrCvFǛ:	jblegqR_.^jA^rRE\+]%N%slT
    uZ8ٴ4Wm;.[OCg}3*bU6!p?LBeG6'cJXr $χ3C@08ٮ[c:[MʳS@^rRIZnUHn\'}ul||zz͛/]mr}|ۑ0kϞwBׁ{|F
    ,)w(@۹iroKV:c8YUK hNG#yrB
    fLjgs#Q
    Q_dsꅤMxMlkO3Ӻ19~rtl\K'N%BGFlr}VHa}j]'zuq
    ]M_Y{eCݾ
    uo"»\㒸qau-HPlRX0[aufc-UHy(5肸@cGfMI|,9:&*Q+-y!5s%g+e\O>+unnNHpvݍzЖšOQkq'Y*]9ᦡ,,S{5	b\xq*~Pl-Z*r:HrLlc;@*	$3
    0HlM+}<Q#Ǯ=u8'xҤ!1/g,eՎGr;ݓ_~}zfffvN WjcץuůrW_/w�X;d\i2?G[6QCKĂ%v&� !
    rMspBrnq1ȵx"7 �. ׵89�@�dk6
    R �@#�rƁh@�� Mj\l@��L"P1d[Ah �� 4[OqHg]zWg;{\;sHAL ��bAϷ/˰8LߙoOtnJWT!,SPJD3IhiVŃ�#=Su`4vE6UJ\HrP~&d�]g>8V]bfuCFhn9rh67:,C]Dwn]I�\Nrb:/q]QszZhUwsd�	`hQ5<gq-oND8,vgqp<OdGm.esveYhqIXMV,Y"W,]z9vm;u&S?<W
    ;Q ̴ v"Ȥ]hb`E<8,,_`-d�(`	xmEȾʧaŸsBYz8~nVrVAzzs|hXo|8uS͍t!ܤM
    G7>D9^bQb&&^%Me I˭Arz<u1hy$*.z耀uZ83h>P:
    @=ΩC	݌CxѸOYzT>3%Wi2;KkG畋WHa%^ 6^|0|nXn (vu}2Hz 2!׸ܤ2ӵIƉKţ-VJft'FL6航R9S=f?Vb7qv%{o\ie\q۬{$)Me˚n\T NRuρ#d6<J:;;Ks&Wȟ떷5^sqii뽯.\vlK]&s5_i`Ü3\fPix/uPZCN(+Uxס<dcRǙn:EnjgqZN|\�5E*Ϯҵ13̣Tr�Vr=zձ7otmGzcL={ޝ
    ]o})X5-XIFvdd.VSDh;<4BruYClիe*\}+׫P20>%v0ab}0",WspJP;3f#OĩDȈM=*)Om?Ds[CO.B+}ϴl۷M$W[B5֌I8B2nuXe+Tm8faeU\%FlLvqk\aΦ
    <׀S3~*<?#d3V-]uCtrLTvՌ͵rXh'O:77Gމ	ҿ/?Po^Xڲ8:
    
    we8  r(_}[^8mE6{^Fui5Qd*]c,icWd{$FQ}RTފ@~bֈƫ=?D;Xo*}c'&U49Ŝ˖\ώeʏd5Ȍz|{wwO.mxx陙Yojj:\	zcץuůPQzʥ5%� ��̐k!MX޺魎S&rUK@��"
    rMspBYc|JJ(# �V@uCR ���@�ZQ$�@�6 n_� �*@-+wZhQ$�@�Uj\~~ަƟkQo ��( 4[OqHg]zWg;{\;s-(� �jlkGng2,,SwÖ$|˖41y3d-2ֳd_dEA~	.g0KHadQ۹0>#3I=6�˙*ou52+3J\rcmnrurYׅuݺ~9~I2qɏ:54Rd8M?PTK0Ӂ_ޝ4ЭzzB@ ˃Q:xir  ]a
    GP?o*&[<s9Kesve:6{l_!uU8K^@G]N/hus~d83-t?(�*u8Zt(.7N1e ,
    8[J&<l}}79UĤּWv	e!r/#{y77zL;6{ S75^AM:ݤptI3~)1knxr028Z,SNĻD&vWJdždWq!	0k<sF
    pF/r4NqNRO'hX^Tr2ъ?-/f	>3|>%rrj)ī5&ׁoPך/MKO&Wq#!(CqI1肪E/BzOϩ4[fˣ*WH{6e1�ɀ@%\R_2OLV.~/󒫕**
    Z'.8Bvkãĩ~~=mrJny\SU?'&µmǶak?WuH!h=Cѕ"F4:T=Jf4.NͳB+ǩwnJU5W;ʍ�\էQmH;qn@,
    "gZv7Υ\'}ul||zz͛/]mr}|ۑ0kϞwBׁ{|F
    +VQeӺTf{P'Q'۰|.WK'CMΏX1>%I%a-u#/YRloy5Wt"d�GPhG҉S<;<2bCO@
    Sۏ:Г#PjB3-mUzVR]HtGcMǝFv/M񎾐cmWWWh<+
    vJ=)@ЈlҕZә1QjiSэC
    th'O:77Glz'MLL$8KcC{bqh(ϵY^l-bI,S{5R
    :tY"WǶ %X1lH:quKΛTP$bֈF=?D0G$D*㝐z 4|جdp#;gϸeKX$+Mf\333tuǮK;뢋_=QGBPniv뉚 �"rM>8מ8.lzv1x)� Pd\/@D`bw`:T�@ d\3-@��5�u6<
    ��C�Z:l3�@�Qj\5ڼ6�@�T%׽߽iY	Q&�@�2@i
    κ0&;Cvnm[u"wV@��!
    rM,}}Yře
    |{t~p_T'nL#O~:T4Qi"93w_>b�2"<\~f�iAl>3RG|IҮqdzGW!]{pˡzw9t	'uyr\QG=╂"4)gή_^h@d sQ38	'GZe?-7\p^yʲsveYXK~L/FG=2\Kȱk۩36噽"nyBaqܿ�Og3u(ɩR䩤.(rA]H93
    C$* s԰yh#^7TSELj;a&;焲gjr_9Z5Gzzs|hXo|8uS͍t!ܤM
    G7>D9>g^bQb&Gps$'%EOhYlVC."{Jo<33QÉ4Ol]Ņdw%dRkjV5C1o:l|9!_>yR	-VӒNbH򜋴RΔ%rrj)ī5&ׁoPך/MKO&W֟d{_?:{vZ9.Ev<sGvmv4Owʖ5C̢cN^bT%U0(!š@Gr/O@";T%^dg)!**
    Z.9p}C׆GSggg{.*8s֫tA.N6-M6uՅkێmDF+MzzI@J}❅LJwfYb'NYҶԵ`cZZqM.Gf8	݌7_Nkgi\AW\u(+/G@";
    "ctl=N͛7_#ah=1&מ=}N7{Ł,xc`s:dvb�tjrM:bıkEW;DdA:S"\Ún^-0#WȕHE@=g#:ᑦ~(WUyB|E֣|J-WOo(BK(̘?9:6.ӿ##6>D>m=ٺ8
    ,=Ӳn߆:7\a}ԠDX.5WyOYu$4:Âj'9krCP&s1U]}lʝӛ&YD	M{<ʱh/Ȧ$WdCuhTDURM~U\bgџwD/=ˏn<x.,mn~_LOemA
    i‰nǯ5P:cg95Z0J Ziu|%Љ],8L0U'K+jc$3֧XmCCizk"? @4^RMSk8(LJNF>v%ɖ0(3=\קgfffg鿩r!O;v]^]:
    n1HӤ&
    � �@f5&Cqo]VT}Fo75@65	D
    fNW6XJ@�T% ת
    B ��"�rE�@�� Pd@E ��er\@�� �ʆ@͒A4,(� �  4[OqHg]zWg;{\;s]}�U@��"#
    rM,}}Yře
    |{sKi#d3E'-ytf7ʪ[G)x>`<8(o8OYKH5WdP5'ą9IysIgl8}.>Q{-[m=&['E{]xȡNx?\׭LT
    'pȨT
    ?geU;LR p	QhA/@8mL܄GXP+BbW.8}y1Z9;ʲR,r
    tltK]\D?^@G]N/hus~d83-t?<uXɵaT>;9s$(хTh9
    bj;?Mx7FSELjWv	eӵ}dd\;:/wCcg?&c=<q;BIn| \sqzbbmUZT$)1
    5=	LŚ{F4,]r/U\1/Lڨtur0#R:yOFb
    5_dI嘔&Y+i_\ڵDvt^}JV	a˷{(k͗^of
    bZ'8karM^EqQ%$SLBR:dCR⎯ZvVE%j1xQZ՘%릢8UL*|*Wn&YhTƂ?^jqJr\.8Bvkãĩ~~=mrJny\SU?'&µmǶak?W]qOq>4΋]9J+d٬Bm!}~_Nrg:!螑~wS׋\Κr
    %
    |2:운l(4E*ϾMҵ3Tr\嬂l=N͛7_#ah=1&מ=}N7{Łyc`is#JħQM;Ug8,Ta"kE^r
    e'cRW<RCVd '`ڄG=O6f_ek2'Rv/]x19~rtl\K'N%BGFlr}VHa}j]'zuq
    ]M_Y{eCݾ
    uo"W>o`LAMMA*S688[žlf+O%|5tn}EٔK	,lT7+5P.H@Ɂȸ5Ȧ$Wd˞lgt=6Bs0gџwD/=ˏn<x.,mn~BfcC  r}K.w$
    B.Y8,_,d7e$ZOYiC>c贽KΛV5Xmb(D#ZȳIm{cc,	ryC	K*J){rɗYd~\333tR'.x.~Dl޴q8P} �̐k!Ml޺K>XX$]H2@�lkp#Z_4E 7 �@1�� �@�c���kkpT� �J@-+wZz$Q�@��%׽߽7'� �@�*l|C:ԛ:۹um=㊬ߙkF@�� V&v>߾,2~g=Y:?lB¹zKS"2ߑRy%?K&o)*V	_ljH}*N<o*Y";MS_wʏ1/3C2BsCG[e^r"O$u=*"6yu%?ݏTd5<NA1W pN]VHVHO\xbċg-gGYV*E΀%a<Kz.^%tص\Om^V7<G!O0B8_ؽɁ)"]̘4UD3mzP(_6	r
    *_"[ PnB_[hxQYIe^6cBC}NrHkH	eũ
    p^'*rWO_on0>vmr=Anj.tI5mv5IWkuSH\Jh@mzVH~82	pQ$%Yl37òu4ʄ�Ln?؎Ʈs
    ʦk}';.,TE5w4׎+v_ɑJ:>1A^;:lr8~va~t4LAP@dreA%iCqɫH%B1`ҡq?f;XFn^zD~`rg]e#QXlW1	Hּ	8I6}*㵳%W+U$#uE}(]%N%slT
    uZ8ٴ4Wm;.[ͯVi=#Umv	2s72s\")"V>U{YqD\$ۢtd\cA"Qle~e<šilJ{cevkQy\eZ*`qWǧo޼Iů`&Ƿ	C뉎1{wz(t_g-l`U*d\b1Ȇ	R1YDH(a	c:_;C"[tu~Y#G{To2rqPB@B(tXܢ=0Rloy5W4Zҧj'GƅtT"ywxd&ׇh֧u'[G^gZ6PG&\HU!|5
    2zw>	Z7$",6lW. Lz2:wf"/~3xtm+Yx鲌*g,jsao`�?rY=2ܙ!ד
    f#6&&&_~lwƃt8eqhsuZÌUᆠ%nǶT-@NcfLHS$ s66tXTi*EEsJ:Zr"2Df-1oEp ڂA![e,Xvlw̐=\קgfffg鿩r!O;v]^]:
    nlI`VE -�@2Cɇ4rS_x¦:/Q8" �@u#
    rMspD`2CN]Q�@
    �VJ� �@\�Q��@�A�%@�� P� BT ���i�A	q��@�@5͎߄/j
     ��(e%oU 8PWO.#gF.\fT-bɝvNhG@��R!Pnr%Fhn9rh6\ٷsbٿ� Zl]ПD3)EYȵz(z$)UD@��L#Pr>ExɑֶSglrׇ'޼6F(z?Mg'''o~ LB�1*Fzzs|hvzu
    tA}>>ͳG~#Wf)|ţk5>ι~8XZЯo-V#)w~n>?[d,S#3돨�@&�vt^}JV	r~a_bP;	햗`itA~{C?CkLKO^X8N
    8Tܵ_KfWnDD%��5@uρ#d6<J:;;K^s&46_B~_h7D7l(ot_jqyMcXC=[J2''T\'o5Q! �@m Pnr=zձ7os/~_P_.
    NaG>G{>=.T-PM W+UQ FD-��5@c9q*<;<2bvn׾·Jȿ4?G>@g@gwa~ʩ8ZfaK=1ת4fa?9ھڜ\D��5@鳂YMĿ	\hͿL.mwG|G(Ѕ-3i	Ze
    LrR(J077bsC}m,*[nők@��Cz|{wwO.mxx陙Yojj&׬b|@n ��(rk!Mqm-Y�� �@Y5™6f*� �V@uur"5�@�� �rLSAP ��
     ׬@�� �rLSAP ��
     ׬@�� �rLSAP ��
     ׬@�� �rLSAP ��
     ׬@�� �rLSAP ��
     ׬@�� �rLSAP ��
     ׬@�� �rLSAP ��
     ׬@�� �rLSAP ��
     ׬@�� �rLSAP ��
     ׬@�� �rLSAP ��
     ׬@�� ;b˖����IENDB`��������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/beagle/images/preferences.png���������������������������������������������������0000644�0001750�0001750�00000113744�12143164146�021613� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR����+���H_���sRGB����gAMA��a���	pHYs����od��yIDATx^y}[wWr]77%$67XMlx7<L<bA`l-qb0f,A<5V[RkA=[cuNNUY?:U{SSߞvڵf͚_~;;P�
    @(?woի?*{^_9ul̇IfΔĦ|N3n:A6ylvncYlDϜ`>;yԙ1FDggF'Ok<G8=2qe.?߲bDupۣefش6槙ޏO)ML!IfL8vvbF>73g3s|Po~&	
    W\vDabmO+/>''Ϝ>=$;"}IeSG#S5u$R鳉.uNvc´O0}´qfm.6.uְ}N0WXӚGw51%mdWFv48.mmdNn%;*lxgw
    nnap!M6r`ځ
    wl]}?^ڞ=k׭mվU5]AkNVa{:n׶lwcڗj3m鮶;Z=dg+d'x	fZw5g6)-._Ki6UT
    pB^MkӗH_k6iChٟvެPjm7J}T#V)ose_[K~ﶶ[Zؑ}tKCu1ªuџյts]Ւ?ד'ڰ/l߹sc]ag禺.{@vk{`uo!;{m
    =
    Nj7bhG~ac58.lx|ǟ9=8=O:vrװS;־rYתeݫ^l0Kǘ-XxrF'%t!]>ӡԆV/)^K];:}(L,&"N3HzыΕ|79Ls\͓BR1<czzе&x7t
    `ƁMlxo#4gwnfyYóIhgIQ³mM<rC3iw[8<`fY_WOw_5k
    
    k9-]1`vTsH{9MDY
    l-68 8텴8H:f4s:,JFxp A<͈$ğZ:@9킴Fl]vۀ/5%
    HS-'֦~Ӟ'K&֜ZSE^# Pִ֜f'!N
    Dlij+m>Ͱ}@rA54[sz@Cׁu0}&rKHI9MV&Hf#Gڗ-s[f797ǸMh*2JZҤ{ItE]{p DdO3HG?"*	n	f^fr7*N7fdyD<Ϫ "dj4syg3#tl3#r5ɍVzʁl>i:܎,̇nffʇ>-!}hp0ҟ1ޘpJxiWuP4s9.5.ߙѺ6l^Ikzoҫ.Pp%%Q-(h0:HS1	r}4C8mfsWߋjOt9%f^jǫ&9n^_K.5=^u=jN^ANTH'MvsO;.hKMǞ H9.g
    naW|W;~W~WyeW.~e6NK;Pd2Ot)_ʽk4	@DdW_ }EQe`0[ZkqBlR\xaKiT@3)߈3[Sߔ0*3[xZ$0Eh	x({X7q3BK<K7uvY{'
    qQ{'Gb݇ɆȈЛM#TxnXegpVD	-!-iW[fūE}Ao�DC"̓L8ڥ&~;Ao+pE�_Ddӌ
    }k"vzՅVw@[DmAoMnϯL.W-"�nrZ[:W-C:.Q-hg`8sSp2ͼjf̫Xb73-iRoF&Z6-DzNj=ʭ#N(w|ExqD|l鯯;M//j!{eQ+_Ynn܆^]4#>;c~uvz%ty:}*YJri}HR۷_}gMHшDgi6:uy!q	lu&	Y!ylp-Bn~\` nf&Mȥ>D9) }@{g	o\!o+<H7{GNj<{	͝Mdn0?|l}Dh7>0Ó;.j_;K۟vOCqp~ZQm<EmeTYW	iwQ7twGU+
    }iՎWm8֝|n~U׫G4EG5KM.U^jQ턾EGjWyC>ognFÚ:
    ?0i!2%,ËN7m`t޷og:SǙ=ݲYۢ=ݵEO.zSZ'9nsD.=EIu[y.>M9{gg]e5zmĴC3dC:Ouf3:'Q"٬}2ofG*0[Z:ų}ꘔ==Ċ=cdڈok6moȻ޳ғδ3R2mn;u48HqZY	:adeTB:3qd̙fMGĽo_;EmGtQdC
    sfӞ.r6OGR;~5wQQvQ{٘2h2EJoiNb5q:�ռCe̟&NP-m+ؖ!qdO9269U{jW[z|pDk鎾cX{.;pYcdM]d?߿`fnma }cT]vz_?yb'b~x'Xp‡{=ؿٓ?ӧ>~]N־ᶅX0O?s|z~ۆ]W&)MSꄖCôMΨƳN2hȌJE֨&E{Ye/5z'1LƷyp[t?K9Њ<sd³ŭ:@n,cbVѢOC9̌h!Lx3TCoiOsZm^5vA:[kkwKffȘnqow[tQ^|Z%swQ
    ,]ԶޢU߭owHCjTkilK@^5L
    (D9=^P&P-FHQ\jgnCt[C-5
    'vD}Oe=x}
    i3sk^#ނtάٱ}[jGV?#6=zoˣ>vocv=vo7^e:B9|.'k!{I)S
    {hc݂k߲vW>9@}8=;o-=\slHWj⹋LzF=r*в=3G^6jFk'EiG;3mN
    3M4go;+e[0;,	W
    67sAzhA2,,6[O򼑳$V'Z8]KϥEGfN.j5vwQ~[~tIYZyա):-|0'2otQfgQߖ!ߙG}hc&E-NjgJN˱czV~jKCnz5rkǚYC&;<^5CU[j-"P-zNkw{3YB5Mbqo΁]M4R@aͻ:`3C{54wˇzGcEo8Ɉ:Atqoztlyow<p{};=tч:M2wv̿s]6Xg!r#=F'хm<&4)eJCwx}i^<!Xٳscf}wogշdoYݹ;<>r^z~}6"t<ﱫޛyj2[z4.if-9Mq2=;l6 xx!n9KhOp[ķmxfVf3sIV)<H3N>3͍zݓ+,6??'5ּf.vV@ܛ
    YvHQl4:HHxZgE]H:ާW&!4	Zo+SftY!js}:-c1δ]4QyuM'jftDBkWc-2lxBPꀱ._^+^]!^Y_w}߾ WWmy7V3۾#͝oFvT :Y~ג
    6Gڦ={6
    o?o?_ϯ}7}_ogw~峻ٚ~=rۯJg!r#9<JgW>KiRʛu_/~~Y{Muw4
    +/	[޹ykyʯgw.K6뇖9Ol{{߶S~׎FNf3?{3g%C3=E0di5Z.TсHY[=x&NkYCvQniKkDv4Ihi6XLœ68^τ5t0]Ԋap9ڷ^V.jbUYԙW;Q@Ǻ.j'><lu3E-gO&˚'eOypZ_�;s:/+,j)]ͽjWiz|Zv帺55jvmUfr
    Nvj[sN0P;o>̆jv~eOGv{~&m/,dO-z>"uv3s]W1oio=_[-o0Jt/[gݎw$#]zf⿙/k.Y._=W\T{EuW\t_W"
    @iwE.)+.>O/OylV74/?аeuk?ݷ
    Bs#B_?O> 
    tl{AӱW}ӦY ,@O�Yi< M4#럡qHO3H˞ii1Mˇ۶x#4:,0-ggNh@gƳM=x:}.BWp7ܙLL˰S.j{;C}m2tjX&St,jDZv&Z=>,dYs˞xBƢi2`Mma2ׂ'Κ'K夬YԮ|_9[yƜiUsZl5ƖafmzܱfG$殶ڤB(o3�tWz26)NӒiZ;ꎽdi/.L!mA>|omhxmfjog|	v,f޹mƻ?6;}ve]}fYϬ§ӛ0㋳v~q/ͪҬ/:O	[
    Fh=}*NҬ=_dImY]1k_ieX.^_!/H/p5/_rE5޳ܜ_y%DO~n~VvFW~_McH/ϟd?UW>z?3o?5^}.яQȝ&_nt*23[8)ccdӫr³ͽg-	Vnt!6{Vx>IoVZ˘7H{Iғ韖r<=A]ԖO�xT}7/D�<WZm[$Q-h2uDj&	}=mu.jҡ}`"YXz[WP-3&BUW=Vvy<ܡӇV8͆9^%FGG\DΨf^uf=
    {i{O/z}Wqm뎓Sq<++-r*3Hg;__Uۄ1)CZ:Ћ^luE7^YK|_dW/YK]y+/|%[dǕ=߸]uɁ>/̑y|sDV%W]RK)W^K߿W^Kt.]K%_tS]!5yݻvg˷t.yMmo}emZ]]ùO؊ v+ḰMoh>B)#q&t?�}9)qY{\ <_sUݻh쭆ykHoꓖ냊9Оa=:,+Zrt{f[fp>MH=z\ҒӞX.`cԁĠ/.jע1eH.ͼꀵdɄ^=M:;c\k}g.jgwd~{zj<zǑECew߫&HjLKUk?[W-,�ќfpBX^TpZ)Sqoj=5[?]Ҳ/-žyuoo}MaϼՕ_[%Uɶn?|[kw#w
    56,ٸo}{px˯Ҋ9_Z5Kk|iݜ/sv
    _qv}Bw-:>#t;WЅd{nb
    Wl-ߺ뿸9_^3˫|yŜ/|ịWR7zݵϿS~/~y8n9%q?c6	cNuqIoAo~3׋M~o &LC5,F6PZD,ʐV@nvyGNK惴vMBbZT8קx+=.IYYW;	Z;:Brx,;scoE_ioo۳6mY@5;Ri¥ɼkg1eETa~õ5@7S~S1p�gnëVlkT}ռڍj˫ÿ]=NGMoW]zv&mvZwI[
    eom[kh۱pіNXba1۰okɖ1ۿlYVl[._GW.Yk|]{n]e޵nf-嚚^SoU~tա]uGWY#�Z5{]\krl7gޜj[n{KIT[yy|nt+͆>]s4K휠g	鯼Az)zbFX4ҕ"j1i2(n0{Xe�Wo<m쐡wY/Q	Gw3NgAhcmp,1͈<9XLԳ}Vkk]r%ђ(tN6gQoԷoa2'GΚ'oRŇMU<EkW!0솴nSCsyBr=^x[Q]S&Ƒ9өՀ2i>; }t{MwlslaK7YlSU؞VlgaCo`a͖[m;Y#v֭y~:o̶m`m?uk~߯wp͇kGGdw]A?R)#fo{n]ʏq8Hq<as;7r_~wGVg8ƠȆ_)}Wx1gwW=\c~j@{/x1=<Mr5jibtcRTwH%Bb|쐮3 6'Ye :Sm{3g+790795+Zιb+;z&r r'{u9ZPY=9DGF;hE3wQ}M.lwn]j^oQwE-'hɁgy?<v;~{R;h
    Rr}],Pm=oIi)>bv{2j6Io:Ȍ5͕OT@uk'w\-W@}ö4Ұʰ[l[!l쾖ۏ(;Zغv[v5m$lad
    }>ݍ[~-ٶ_޺[w{owz[=_Od~"[dv6<<mܶ{/ο=෯3vY<TWf'޻}(7^ߝy
    9ҧ\EjmӮ{ztz&z)0O*c]^>b-;6DY[
    sb~ڋg49htXx<@pep{.Hk ͧGLm}vͰQ9,WuNgY6H}Z,x"Q۔Ԑ.lgm2Z.jk;h"؎:66Q!}{Q<[[6i͢f{RF֮*:UK~KTsf;MT1cx۵z|-ƁC_g;2_'I:lfM>;ɭr|R3$a'3;Ffأ`zm+1\k݊
    7-#ܴl۰cˇ7M7-ַqyVv[.lӺ+_ꩯMJ	b궞f'7.?K̇嫟xAaͽՑrĜg}~؊cʍJ&lqSܘZD,ͺR܍%,i,Q�m4x=yVrW+ijf=<3ki9s
    IR'QXqilsj,9A5:Yadj:˫.d0r8.Y
    9NP|\Z6F}KT]n{:vEm~4 +{P29ֺZavwQ+PxՒtčj1?s̙Z̫6·f^znϾ~N\h0Zc}׮׸}oeƵU97^}n̾}O7~k_2/d_u?ǿ}>!\ǿE?u|ڿ5g??o_s쿓࢏?=rXHe}VҞ~+?yy/?kbkw<Ďrni{P~s0k<5Lپ l
    7@zjX-&]|ۙotex-�Ϝ4Z=<Gi1Uz7vՈ̐qD}C쐶Žڶw.3y-d,]dH[
    {F}뮓B:Y
    
    ܎ڶJOygJ6ν	^5#U{;W TO϶z*gj);ϫfoW[%sh??Nә'eD3a3Ƥ
    86~jH	NO>)lҴ3s󈶩3#6:cYڟ*g>K YE`v=i2Zi1gwY%9#h-מZfY|Εg'MPkn"ֱVrij
    -Yy&5h-f"<̐DfXC4pme]터-&̡vYLf+W;aAoxY~+NC&sϢf;sdZ/x6U"-$CXS=d˓Y]2Mfnf޿ܘX+TM#U3z/AbF@4f,7:3[|pg@YPMĶlo~zLгc;$;ڷKرŽa6YM}dd-' k%%'k>v@u6AfƢMRBY&e|GZ)irF[WvE=(5)6iI~ˌ
    nzn/-\>t=!oퟝ%
    9=Ltd:{wݮ3mtf،(\Rvp#˶}י־g82Үik{\2g:qd.Pk%Y.&pzQBQR;k}e5l_lI[˓PM;iiij7ܥxO#�.im/k(Ǘg2=̜a?_fFje2c#ݜwP7YFN3HKNsP}Tsz@pz4G5j铜,.	p:)#4t̄jD <!m60)&(3(F72ŵ~‹&ShVۧ|\o4	7"{[eԖз+f@x5e>UrꢖgEٙ#h{,DZ.`/jE~{fQsfjKbj=,pGjWwwaAڌp{G9(<TU"�ɭP-i8pa+N:\뉚^5Y崳ZUԳXi6;?ݻC@ϫ.tfZqDߟpi3?!D NзjQ-h-JJA}r7,;ݤIcT惷l&7SQ5h`Bgp˅gm섶rZ;=l|BDUgZɷ-GΡoBցYfQ{\:l}[ǑY[UPA|&vGcޖC*k>EvRLH:x[q5L2]j1GE[z·V^576�8C55[^ke*(?}^ڣ}Rn?�Ԗw3}f;(CY .,$`zOY(mfat:vRx̬qb`33sY&Zy ~.N"o{9{vv7RaXZB0tX3ٳߥNm.oY}.jYݐ6{B7(i
    oFK}X,ܨoJVU
    ijgo@˫vq�whU̜8q:�jv�gP_L,bNK\jO[f5G5뢶vT.+U5럎:<G~?yG5j޿H!OAwnlC&)+xTh1�}PYMRĂ%ˇܶI`&B;l6i9;m}s܌5950ZWgQg>˵IE:x@[]b+,%&s-ʲmer!j޵œE]
    9RȺirYۘ잮~rP=gZZAZz
    5uGUD=Z2Qͣj9L~.jaKm:tyBj43L&dwQg}!H茜v~Sh#òx
    Sڱ,`Ǥ2%V=dJ́!4!zt <mAo>W~9x8`g~[Ep:{uNgw gv9qdGfμ)>$iK{
    Qˈq'ZM&REm>OU
    %3e.c9d_G(3fQchuj'n|Qͺd.T{5sAy885ČGcZ/#HkNg~el^5MᚣUOөƗ
    yjw.j5Lv&uQQܟ.uơd.jMB834`Q]><~&NgmpN*;M7ij'[S+Ê+5U\Ӹ\aalhfC3u$|68T[Le0vRĉ~e}'o۸z[w<71nvm
    Qn#k1ltBZ՗Z11[`ߋm:_yH;fq_W?<HJ
    GK3qzdu|*l
    qZԴqфi;vLtZkhcCA3<鶩af'Mqa6)
    I58q5酴/[nA(��Vt&HM/(M^zN
    @(�
    PK5`HwN؄ϥtw%.P�
    H$d݀4 R@mPpH+N mCC"
    ҅ߜH
    @(41 
    A@Pp�"�	I�9P�aK� 
    @(PE⥫a@f҅ߜH
    @(PLH#CTG�i4P�
    @R+P*H_GiXB3Bҥ3>P�s~F�@@)�DP�
    @|,}V=vcݛ9KF>:>[՛gχiF@ضu+YT
    Y<֐f.KPJmf׫#.1ONp ÙP�
    dVHyrA\YU=xCZxϦ�ҋV^sf=M\f�QAr*+?0CvՄOj	5Ez3\ӫN^:5qf^DJ3%T`Y$^Z]ZYx%tUua~YJ@9 F>=-lղDٴΟ>e*҇:&ni
    wpP;\E
    
    iw1V	lINkTo3[_hӋT"'K).
    w{MJ�iJH/ 	Pl
    23[?sev5o2s͑
    s/tMB|w_upc}ψtՕSNٍ=InfY(-ksК/{h!=i#.]`wX]O)x O-=s�(񱡬5323=11GQ?.'2OZAci"t!VeЕpK3m~]%|ax6Bl~nޞbԋz!E(P
    OdɴwUsE29BZH6LȰUk\:7OLYjgt%wgt)!-++e񇛫Mv))tԲ8
    @*@klY!ME"N)%٘d>GTӹZC`OZ:WHSیZ?eF1_9]yk.8Vc2t;(]&t8
    @(`sF?p2mo9(,$V8B	(
    w
    it)=dGIyґB=dv|=o2\@ 4v&+5#L!t޲IH$.
    y[S`ٜUm='mK-B(PD)dR@cJi˳5]A
    )@lU()g7YS]l'^8pt%	NP
    @wi^|ה =0v^B8t@
    qVs
    qfq'Z@(�Jth0@:hObiL*]�(ҭdӞLV9
    d~bx饗脨~.HctT#(�Jt4t0;28'%B	2P�
    Et?
    Ҵ7˂(C|�r?#S(�R�'9Gș>YcA 
    Ƽ$tZ
    T
    @( !r8} =H( ]B(2Gf7o9IFANYK@(P8Os'b蓎9cU<@,32P e
    ptmL3OiV
    6bE
    �)k)P(�ʢk9OT@b� ]B(2}#5̓9�X.�y+ !4X89&n^x%DUfP²8ii�P64qpVϛW]H\HD\SsCu�(ғni4DVp7CtI 
    HCP�
    @
    0H&BK+?30ډs.'m;m<
    4 >P�
    @(  S)X
    ¢Xxh+6hZ=ռvީ|:5@.˭L� H␖:'5]nQs(dא%U&>7΀P�
    dS@@z=H9),L<I_OWuOsba']@:ۭϡ�p ؿq`oc�Œ&Q?f\3Yiw]qr3'8
    @(POo#
    zѱh -DŽ^az`ciF!]<DI~FP�
    L&NO:knᡮ	fz%DJ\ x^jo1Jm-3{b0{uud
    s(�H=KhtwTA>%U GHf]3t(#g]Bzl"M$q.Hwcǘy!M>tK$yBf(`\
    uq8C{9G0�$*>i@:*;<!m҂y%5Q9,PQne
    feXOv-cNY?E_q\ՕKE/_/0Tnb\}`-(B>&hIIkO:W.GHNi
    .^<B7,Su%F<ӱtgrt?Yc֓GuѼ~pPE<0<4=byҶD6==y4"9
    (H!NsT9B	{t|iS8ٚ3M,g\LPx^g0:nky\fɍZ/sGCa mF2O^i=QR(%!
    OKybyBÙV(ҜB mİҩjb8.n:"료ʝWQ@Czﱾl,tAC<!3ܖ(rP,Zu&xwgpxep/(m5ܭsOUsj	w{.dzHi݂it:`i27Jj?pLAz.* !
    YRsSz�ScQZ&89PAlOTX-7gt܇J'\n<+YWuFg^am3)Ŕ^|X?O^t
    ?H&dvOZ̖ly�nFZ\ ]%Spۖ~X\(F"I#-QYqP
    *i,F3td[U
    /ʝ肕#Eo"-.ϕydvGZ޴ȬS(MEa
    OZQel-D@:<7#=3HEe#Ȣes3G']6}kRXCD4VtvQx!ًo"xΞY$2A(�Ҝ
    6Ei&9jxyY3�"ޥH
    
    @U4s}?Ԅ&֒K=ڽytYL}
    �ۦP�
    QibiV:Mo" +
    H'Y�.]�X<}pt/
    H{P�
    T'ǎ
    78Ia<]L̊VHc83Ó.ErXw-^@qO =2EisSg?<=IƝi,3Ƹ8t) 580<EP nn
    ~a>iuO�k_yW%tPc(PA
    d4yvHOZX}u4 7J@�5
    h>}/fo@4J*STQ)(PRam-V+H<
    �i@:R ҵҌd^H$C;]&HeoB_RвLi17Ǧ?@!l<_9z^P_.TP6p.Xző
    ,KS	U!_Wu,H-z
    ϘTkQIɛfɓnm$y=G8IIWeti>R" ]=O#P>#1CK!s	6L@Yȕ2ͻؠ}gnSO>BץYĨv*N.J%
    rl.i<|tIұZX(@:>5 %d#i(3UvHg,sg
    |Dt=~lIzp	I5*偐>~np
    HKKfBpb1upsf/3ᦝZ:yBfg;j\	hl̛2Kp\J>{
    5miT$d/4rL:ذt6[̞¦:m]{u:&xDs}Vo2ͯhvtF7s`i,SRIg~]_%W%|a_wP^Az ?ɓV	b@\(ҌNs0U*Υu',Y:Y2KPeU҅)F{#hy㹏L&POAu'|ulF=UK;	
    f*!AŔnlg[¸o.2|E֯v~᭒#r_9(@"Lį2�FmTJdɱ__\[Jn4C?=u[ ]7P1iH%?U?<iA
    ]9w)3L5>iKA׹YI@f鄹@W>jk4+Io^^C\{dH?dXz4C+g+#JĽT/.Rfרb,ckFatKƅɴh<g0__%VirZMBXI
    ?9ƐDV	~F�i[gз+VS:uj
    lcyy⭐}T85+jhe'$=v@)H)O<Q <򕹢&sd'$5Y/\T3VHL׵iAAZ컠"dz+NsvegH DE&a"֙\Qwσsu0e4oXM&+2O	Sb%
    FDd50W6Jzk`@Ev=EZXLo#n~9<=3мu~ k` )ACzC�OwKGiwO@|Pp}
    iXs԰Y3.r}8/3Ǫ0YY
    ~8GEiϱTQ;c:Au
    /C2\$1 >,/1yo1C:ߝ++kxKkY
    #.rYG̲HfR4? y	$ӕPʾn{eYh?3@eϲ{L]~OE{{D\A]ayNܯ^c['O:'%ǵq5~6V>Nu+H[.X¼cz&O7mL)^הv& zdކ!ԘgxAN<yҽSxt!G
    QKJ�8u6.�%CkĶadH	 Q]nH$g
    �!YN-B<BzptZ 7/'Mc#tK/#\J@P_�NP i
    m،v֜ēOW@:?Ju ]
    H
    t
     �Ht{<!趓NΜ9wP]E:ac
    w
    @:?Ju ]
    H#M(�*MmÇ!}C<iLؓ.ln~
    �ҕ֔P�
    B4]4Ao8
    ΏXx ]iB(Pi
    Hj{ɸ?=<
    $Z
    HWZSB(P
    $	'N6ғo@:8-M�RܮH
    @JSAz| >BwO5JKC
    H)9zqӻ/]
    P }
    Mt7ApIinncF.BbU`�R@+VB+GyC9ҜFJig
    &M~W3+) ]"HW	Նu1a4-I+g:HvXfXAZxV
    HfhTQK(PL }SBhϓ&HNSib׮Nxf83|"j 
    H7@+飝sx6ZpIs-9og+yζbv6ޤ0ڻ>XLE,o +! 
    Hׄ@(`ĩc]|9lh9}9~,3rhTB׳5n[=/|i=~]n,}Hd[_r{X)֖#riL.X@}D*KP�
    ''N;5ʬ{Yst7y3Dhn%8*y膴
     eP븤<fXz(9BZR0�ˊ([TBY؜!O'Ŭ@z!;z;A4*�ǻy!:H6VvHoEʳVnAvdN
    &Q+3e*
    ZId6<!ű4X,Ff%+�% ːq?i5~sm~GNP 
    X!=2yLnavϜmpF[L -8'+@:n턳yx]En\ǟ[2MEE-'\yDg/X#ҭe.x	ܱΥc&<',jojӦ׫K~DҽRשf~&H[ӳCľ1C@tSϸ2Co\cXU=k޼�Oh{&g);llL5qcpwjIkZ O8x.#KuX=HS%7BxH0dϷ(oV~H?	
    ^Lott4LGINcJW'._X`҆;~An9:-N^%O[J<lt'؍ÓN*U H3AfC:
    H~ffht,L6൬Җg:v|0N8}Ҟqa)�C@H(Cz}H yIv<iN:C8V~6iK_:De&nUHyA<ر2T:^
    X!=:yZY/14#P=xI@Ӥh9l.S3}U
    w;}2GDԜtn;I[ÑιOOqrr1r"#}
    
    @Cz4DkדfH|]sUv/f)fUq1T
    O Hy!9<m|&L'{%(nvPf~u�JPJR
    鱩D6ag+<鮓gՀt%Z
    k!9	.G@Czq/T?g}}rFXə	xұcR@@cF1@Bz|Ldd7?Ou61s[n-Ql�K4NP(�twAZ>9-䩨 iʉҥH(
    @*@ ǘ<)iCSnOCZh<i@.&P a
    Hw
    MiBwT4@:P�
    Rt4+fþSdգYBõ݅	K.FQBF\cyPP�
    $L陳H{>eSew�P	k	P\(�b�Azrlim.Hh:yJ띡lli=A!�cyPP�
    $LSg{GfwsH5}{;rgco)%U�NXKB(K{Gy!=0vZ:"H븵~hmlwyg9%� P a
    hOodF
    ӥwccz?3FzNR*�H'%@q�SgGy!=HVK	t,w
    
    @) !3NQ.9	k	P\(�b�Azف1scCgHH~G�HҧęIG
    $gH'%@q�ЃiftiX(	S@@ZZg͔~tw$Af%S�NXKB(KOiKJJBA(0LH2TvCT䙙3,ZI4Ki]鄵(.T '῟:mtAJjS@:;
    @ RGim\U%<iLG'la,=VW¢`d|/
    .v:@:a-@,Pi
    tscϪ
    6nlU�kd33.hȊrfcyPP�
    $L,`M`8VfFL*%ls/2Y	kP\(�b�1VrF
    v366m<$}hܐ".γG[kY#mUܹv۵HXmzmn%>qs~Y5meuP)$DD~FFоH@~&tlw
    @)@m]W׻o]}Y7P`lgOiy5LH mN2[9LN8Jc9K~QQw'%@q�kV+B!3P$9:n|q#?yNj֔8G_JW^Ko*}% P a
    pHO5-!KݐQm[x6p,O!/z'zXŷsNXKB(Kx{o-wք
    (VSwjxi}،]H%犱nct
    <oP� {P�
    V
    ii/$'-{`y1-{x
    ]!gƙ
    ޺:t>r="-,ų&%\`X'B(�@!w7(IS՞.wVGy�H2]WvO c%Wڋ$2(3P :LHAH`FK$:T"�IT ǦU;@gHGWdMP�
    Mtﯮ#yҀt6sLM@(݀4 H&P�
    O
    i0ײ'GpU	�wS#g(�ң@nn`IG� F5P|
    0HNaa<i@:2%=#@|75rP =
    j0׮3KnXJ-:i|^H@M�(!蓎ē6`߲zZ҅ټ.M�HDhxgٵukر!Z:%v$Hps4	S@C8-l|y_@mpC8E
    i=цrk
    +a
    .T`<`O*um~ 
    @(kq =E/F/kfLgGsHm۶z?&egM08˹#dH&P�
    O@OAZq{n6	bjsoIzיrؙuH tnj@z
    }VrꅨeGK35íyHp4	S ;WrO[Đ6k@ٍi;;[{ZG܂Qvx
    HFP�
    G	oյӭy#͛aei/wwKyĸ1cNW_.l>i4	S NSʬ&N2O:
    H"ǀDnZ%ֳ
    @(''K?p,I͓TRNO#@(P>�<H
    D/wS#g(�ң􆃃ڼUzWnifSbUNO#@(P>@Gs.R ]9C(@zt}ixz㝝MѾ(G7-tz	
    @)ҌqO<5==}QHR`,廩3Q@Az'<L
    ҭ'N9}̙_/nR;@:=j@0 Mf8!-m_ MAs7ʗr/c.M�H!BCo"V	gϝ;%_+,.VpRjypŔ/ 9NO#@(P>Cc	3gNp[qsgmLqiffݹ
    @P >sfJ\5C<@]4 ]*	@H<7zbr۲VA~w<~2%%Uaq9yD%bK|i@|w.rP"if7}iLSk\OzsN/
    ;Q@ҀtE4$S ;%9c8p`[<Z#񚻘}J'ʗ:G]?7�̣1p|75rP =
    ^F114+B7UzV}xVMo;s#t?_NDRrR(_x&P�
    R>CQni4n^އftPιPK'CҀt,oj
    
    @(]+J'=999(_oSU>)}7ߟOԥzA:>R|i@:=-j@,H<'&&f{y#D/ 
    HF�Hitoo_oWU}!1p,=�j@\H6[[[IX
    >yk!)_=oR;-rA($|[Uz7ؠcf[UvvjtDR/D;I:
    @ H
    N}*gXC A-#{8B#ܝEP a
    $҅dqm@;a-@,�KǩNBA(0X`PhƸtZ
    @X*`@8P
    H}) P a
    0HLftH7/X-0vSz^UI-~I˚" �ŅP 
    (HkN'.F,@:t,w
    
    @)@n'HKN'C$�P	k	P\(�bt]tb!F\Qv<Wk<yZЅ";=*$@:;
    @`\8]GοHREN}1yL{g1Xy$vP՟'tNAW=Ԟg@:a-@,^Ws:ɐFVg6󅆓ٓ͜ұQ((��AAGsz,4>[XF s �ŅP 
    pHO&H3M\HbآϘDYm3*\3_>E;Ҁt,w
    
    @) 7z_7k
    i`.NhZSiO_E|S5 �ŅP 
    [Wt1Tx<+v+j雠9ҖE@:;
    @`_SsdՀtYL鄵(.T ;bOt�9$,ecyPP�
    $L
    i5]cSgyg.) �ŅP 
    H/NK�$b1^ecyPP�
    $L鞱eڈՀth�	k	P\(�bҝeb1^cyPP�
    $LtҝetX�	k	P\(�b�֥̙n'X0Ʃt,w
    
    @) }bɎܟnM.â»M0C3=U	k	P\(�b�tғ:;+Პ(s-ycyPP�
    $Lt#t3@:4�@�鄵(.TCzmҜө4B`z1>k<:](07poVN:AoB?7D@:;
    @Pn~g[t!01O7ƔǼsY_ݥZ4$=[^L$|[-@:a-@,`y{+kzVt~n2
    ں6w<a8Ӡ(.	A|dԻ\%zj@:;
    @*!MvCz,t_5һCŃDB=j@:a-@,Аt 9qUA_m_9C?ĥ9t9�X(	S@Â=iLޓ}j=pL!jAI3͎db^ͼS�shuI# �ŅP 
    &N3yDYK$]ڛ‰� P a
    4q[K? ]ͩtZ
    @X*@>5=i@:'@BA(4$4mn@QxIk
    P^(�⨀t[[Lkw,EhsTEHvG�HtEtP�
    Q'MonKG
    J2A(4ݬ[AU%bVNZSB(G<SӀt1YUiqQ&(�@ 'U@iKX٤#@:iM@,ft:ZZ�qQ&(�@VK�|P�
    QC�ZnTaE\8Oha_OcvQhCtnxLP�
    $MCZōfq<bTw6rC_o%O˜;9@:i�(iJ7HnggA{O]A:[IFP�
    CTCef8 P
    ҚD)^'WI3ڈ#];rP�
    $MAZy.V:�>oe8f@z'
    KڭB(�ʯ@ ]X|W[β#]%P 
    0HwmdO4hsI?noP(�ʯ4qzk$.TEL�(W�7[:@:j�@Bz<r1VsP�
    $_)pw`�oP(�ʯ� T
    Ƽ܀ton�
    @+�HvI- 5P
    �I`
    HF	�HwJn@kɈi_N4#;@:j�@^:ِkF*c� ]%P 
    #0s�it�
    @+tKj
    swgg/*m�|Y[>N{KļKuvxWB|.sP�
    $_"HnǭǹkMo]ur
    8;ISzK[@В�oP(�ʯ@ wT5ϖAJ179Kşe?LS{F
    Ec|sP�
    $_Aǻ,@u"ξՕB]lm6c@�8P�
    _CnK72KqԈ;$o2.-b[7pJ+	 ]%P 
    0H.qYj]|nVgϘ2֒
    'bJu4}dORd
    c8P�
    _%Ҝ8V80p
    e
    ton�
    @+�HXӨ)R@CZ:O.*9!x)j%P(�ʦ	i4Y%CZe1)R�.2P�NQ+@(P68ǖl]4[$�
    @)@n[JVFHd�
    eS�ltid@�KNNQ+@(P64)-Iw\˿gN@
    KS+R~WT|OvO#c(�RUٕzO%yB]sS@K.dm='YOSH@U�()^%Y$ÜHw�P EnxD#BӑY8Olsyd&N-[l=(^K	jGڕ܋<D($	P@AMI'9 IT	iKßxǓQ%q>x{k`;eֹ,'8we)Dc1("	P@BzWRCJAvkou\\J:{_<H=9Qp}	QD(�b2inSg9p@bV)!-T Aw!T8ͷ̆HC�А&NK,*Re8'ͣānK.k
    W+'5(\O:=�UCz\:ɐ]etJ?8A4p̓yjKS3POpAٵ͓)<N3p,sIn(	RAw|{ҥ	.E&LNP+B([�L4b֩$i	+HG�H3>ǘq2U* !@:A�
    @lp Mon+�" {P A
    H/ݮ
    .=* @:A�
    @l�+�" {P A
    (Hw.қ' V�EP 
    HH!HCtze�(	R ;bO6IGɲH'@Q�遴w+^!4OIy쎕g=A( i`d@2K
    vm?]`\Wi
    P�
    VAڵg%]fi;+iqEO=A(�H֑.?ڀܛ؆CQQGCN[X9vsمw[U6Bʝ|`U�#E
    $OPp;0pLmiƺ5M]\1iV,}eBʡ<m]7t>Rly?wDdk=|҅ߜH
    @( 7ro
    eI-	jV1\[rWilB 
    .}i�zeߦ:
    Jh\�+!MN2e%q /N˦*p-<hxM
    t};:;!y̧@gݼ}҅,H
    @(H
    iekrE=(@7	*Y3a$]n.[j2Ŷ^HG}k!?(�@
    
    Ҿցc؜Emw&Ae.8bzz1T\
    8&
    "H^<z"w~s"(��uK']22aK(E6 
    @(Pt$ʘ	q}q�҅ߜH
    @( !]ӵr4x҅) ur 
    @(P}j`09Pi4 o%t4(�@
    !=6u/ T?gW?I$(f9�9P@A[Gr-5yh\�+ ?z_7*.@:5,gE�oN��0!8]
    HmF�(\AZ-åJԀ8SE�oN��Bzyg0p,굦+VF�(\)=6
    HGfH~s"(��}=bX!%pO%1}EL�i4.P�
    @ HOY-,l(ڌR`sK6Q�zFTD@)@(�4%2m.t-dz9YYA;<F(dHqP�
    @  @)@(�LHg:4]]UfiP�
    @*4q:&*~ycI@�\B:~ArQ�^FP�
    P	kjI?�+  V@qX"@:{B(B�$0eSZJP�
    D� �%t22P 
    �I$`H@�\
    i-)X	A@:{B(BLH�i
    �)l-P%(�"W�._@:{B(B�i$
    �)l-P%(�"W�.	( �HSk'C4Z$�+  ]MV"a#!)T�lt
    [T	
    @pA;KJJ^FP�
    P
    ix+%+ UP r�a#!)T@AteCصSZJP�
    D�AFw3cFؼ�ed@
    ^WO&P
    HW$T]i@:@
    >{P]EN]G[K$]PP@:{B(B�2USZJP�
    D� t22P 
    0HN@7)eH@�\	tp|ed@
    �Ȳ
    Nak*A(3e\
    �HG~/#C(�Rd븍Ϝ4`u�SZJP�
    D	ij@tKIt22P 
    dٕ5=&X$%-}5�+ =(h'!9
    Hn)^FP�
    P0t
     FP
    @:@
    ���#!)T@BzX<iLaJ$nuSZJP�
    D�A`	HsBzEM7@uKvʃXx	 �Ha!-P
    HW n2 UP r7fXUWґ
    @*�HW,FK[q@:@
    �ҥeUŦHG~/#C(�R� ]-m+�HU: �HC4pl>cbVNak*A(nH3TdUŦHG~/#C(�R� ]-m+  nKK
    I^FP�
    PՀt`SZJP�
    D� ]ZVUlt22P 
    �VNak*A(tiYUґ
    @*�HW,FK[q@:@
    �ҥeUŦHG~/#C(�R� ]-m+{fd-}tAi[w
    �ed@
    
    3+ҊӀt*�E%�+!=#1.fHGHG~/#C(�R@hHsgthZ)l-P%(�"W VHh)L^FP�
    P	|kwS[Ct
    qZ*)l-P%(�"Wati Ted@
    �N2Nak*A(t led@
    �N2Nak*A(t led@
    �N2Nak*A(t led@
     Hwвz4`Nak*A(қatDKw6t22P 
    �fejH@�\@lKwƀt22P 
    �fejH@�\@lKwƀt22P 
    �fejH@�\@lKwƀt22P 
    �fejH@�\@lKwƀt22P 
    �fejH@�\@lKwƀt22P 
    �fejH@�\@lKwƀt22P 
    �fejH@�\@lKwƀt22P 
    �fejH@�\@lKwƀt22P 
    �fejH@�\@lKwƀt22P 
    �fejH@�\@lKwƀt22P 
    �fejH@�\^k	l
    ?2Nt22P 
    4 Jt
    [T	
    @�fHG~/#C(�R@XHgtZZz)l-P%(�"W t-W֌>,	ґ
    @*#{1p,P-v�+�HNH+�HG~/#C(�R� 
    D@:@
    �%A#!)T�OK� UP r� 
    ґ
    @*�H%Q�Nak*A(tIDed@
    �Ӓ(�H@�\@$Bt22P 
    t=ҚN@:@
    �ᘃrT�^FP�
    P@:Gp
    �)l-P%(�"W�t22P 
    
    q Wt
    [T	
    @�+^FP�
    P@:`Ubt
    [T	
    @�+^FP�
    P@:`Ubt
    [T	
    @�+^FP�
    P@:`Ubt
    [T	
    @�+^FP�
    P@:`Ubt
    [T	
    @�+^FP�
    P^cNf{:{XKCt
    [T	
    @	it xFU@:{B(BrnxQ!.�)l-P%(�"W�N>cY@:{B(Brtc	8
    Nak*A(t	2ґ
    @*�H�q UP r�8.e#!)T�NX@:@
    �q$\
    HG~/#C(�R�  Ʊ
    t
    [T	
    @�H	^FP�
    P@:@c�+�HǑp)( �Ht
    *�)l-P%(�"W�#RP&@:{B(B��1U�SZJP�
    D� G¥Lt22P 
    �)�b�H@�\@:KA�ed@
    �S�8VNak*A(t	2ґ0.
    ,\;'ib$S�8V1PhX_= 5HRU@1)Dt	2ѢEo}ppٳx)H
    ҄~IPt   Ʊ
    t\rD�x1=
    &bB �8.eErs΍V4�i(FjIH�q h*  m	-+P#R\&@w4ңx
    iHq SX%V MN:or^7m|[W͔87IftAسInbEօU+Os`({{ed;Ț{82etYc
    Ҋd9Xx0US@҉g/m ]Y74+ÄU8u
    t �1eUb[7VzFm7N
    f.<4ƷW䑣$Y!yJ5&sO${rO3
    @:TY��T!o^xS/l֍7Roj:{3KyH}(<LGo<%+
    Ŋ
    +uzp/%CCA""pwP�1eUb333'k^:L?__S~Tޫ'qvI“+wu;Ȯ
    Q_OGi[iOڭ!^o;^l[O ިT@
    ,(<HP}d=蓎/cU2@,@1U@@y=w]Յlnn|υU='Ƌ#<RWɓՅwjFsH^DO{Y5"2㬐6+[U[%TUSYnE*/ +0tLbX&&&FHjsI-@d8WAܩ4%ut{Qy$+}b~y	ͺh!B8`�H! ]b *@>%H߽Aq
    w_\U5Y~},zOyHPeىKxW!M2݊k_B.팺TXEf3G|9yIpwЖ�1eUb2BΡ%q,e罆'XI7`4E&g&t	Q%Ni}^F;Kn^}AMeV3唄Ҁtz�%fGr+
    ̵U޵ޓ:gJXL@:hKO!2*驩xydї4.bu5UڣqN_TT$B;=\UM��TCx
    oV}k<ZsD|%E.2 +0tLbXA
    &<i(FjIO:,K
    �To~K)@j&;bSC3Ϝ;aFLIYhL2*կxnr
    	)ce('	mXq,,c�WwH]ib$4g
    HǗ!(Q�N3)X7@:9�J
    @|0'-fAolQF%+k@:7=J@rmK5ɢJ[�4()U�.ҟ) ߛ%P 9
    �eYjH'@I�@_�P�
    @R+!S(��@>o\�%P�
    @("�}
    P�
    K@:]'j�)R�Nї@(�@�}6P�
    @("�}
    P�
    K@:]'j�)R�Nї@(�@>4˷F@m�P�
    T@:_�P�o�
    @(�@LpAWbA(�@)�HW7B(�@b�UP�
    @(Pi
    k6_^{JSP M
    k{WVQI…UDˏk7忼ɳuX/ fڐEiP�
    @(=Қˎ}PF'He~OP/>@RF
    ߾zx|̙d^O&~߅):΁P�
    Gp龉8:6UF'Ho$l_T}D=yτ瞾\wCџtPM&(��/;AdUD )
    r]U'H0,<dg;ۚ{0zY~Dhpw^_ctKp߾迾GF
    @(PONNTQBܹs"&oHS?4EE}ɞXXS3G>t||k2�,"2P�
    X;1
    c/Q$?Sy䅞pR|P�
    @D(@ZNNUQInhſG릦D0~dttC5uGő#|;?'
    P�
    H7
    
    Dh̭RYU֋o~QfWU]MY!MæNU,-õEN훪f7QVnʫOX7䴷w؜ęLS7P�
    _2@cioͭ2]@k~X/�i4 MyZaxS>ⱗ�M(!�A=88:4pvՍoyΟUuӛ,wȓ~vtónz'PInr"yhVՍo3E_ZoX5롚bfQtOPHS7sp|[${5SFFF~苀4?(��GODa8]y>8k(wC~bDSUD
    "rF$ʗ!ytC{E,	'z(| M>kźbY}iEKk;�D4O($D<DWc[$?y&W^d՜)pUDi<Q{'^JAoފwtXg+#E*9P><{⦭'›kWo2w>P 
    i8v"{3ɋzrڪzNFgT}!+|υU=gM+}=[1/gGKۼ8El߼I?HE>4źWn迾P�
    Hj8mU׼`.QgX/]Suѝ}HDFb6T<K9L.g4{c_mIϼ8E7[B5{4'r
    G='G'>;
    @(}`zGc[CSkDcdv/^SU{YĊ.ڨD'2{4xq_ϲgU@6}|Qz8>PpI{{xqZ^~gw?R8S<w&
    	�4qZyN?8&NQq<$ֱmXgpΜbK^];Mg@ M`@{rb&;ڴFϢ 	Z=(��tc'6VQIъtVOnWM#'Ovt{52:N 6P�
    O⺩GUQI̐pſHⅻw.!+`1~5=[i5oSh7WGkz#ʍ
    @$*  ~C#kT0>TbBz4t~+y7Li
    2b3yϿ}iƦ$ޜ(3P ٺw5;|bO"d)hz_$B<CZ̄jZMLp(�@
    >t}UQI"諼;;;i:O}$I-Mo<4lx|y_GU?#K09P�
    @(>;>bO"Aگ~'x[S\o$IҚE	w)΁P�
    $NE}_ֳUM*ը$B/nDRb_T}!;,dtHYqP�
    @�)@(��(tIdEP�
    @(�
    W�.\C��P$
    �%B(��(\@p
    P�
    @(�HDV$
    �Pp�5D
    P�
    @(�J� ]Y(P�
    @�)@(��(tIdEP�
    @(�
    W�.\C��P$
    �%B(��(\@p
    P�
    @(<̫t
    
    @(��(}鍇>dG0ڪrKC/q6,5Eb=Zxs"m7hIM)lL&g<y?Ms6:`Ytn64ݞd#Bמ3!M\>>裪.^T߽dit~&yOfmKvJ[-"նtW{~lW{
    {Bޮ{VȺWVtsa.ʬ?E(5V*UzW]Uۻfk	[[ׯln;0hC
    rCCbc&nxiLtfw_\;V,Hڵ_#NGl@:39ʏhj}J6=]Ӓ;*Hm:]c�<,.!.K_b^Wjt;?Cܼj#q	e{:M+RcUKNXzEt-4\<stg:41�H$|u1H׿hKN[tQny9֑A"`;uAZ?>JUx
    _`A=ANJ'EwA^Sq:<w7M,&" AzѢE, Nɿ~WF&όL.QN¦Ό’ѩQX(FٱB
    !G/QX+?]w [ow#N_O`P�
    @(�@
    \/\}7$B?<>A0+W]����IENDB`����������������������������logback_1.0.13/docs/beagle/images/beagleSample.png��������������������������������������������������0000644�0001750�0001750�00000112142�12143164146�021662� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR�������^ͧ:���sRGB����gAMA��a���	pHYs����od��IDATx^	ŕ[k|_͛yy~vc
    1ccc
    ,e0F47Fcb)!"$@"v@P*I(_܊XN̛/Uy/NDf޺]ݽx������@$J�����@B @�@�@�@�@�"Pg(�hٰ%A�@�$-!Ԛ!Fj[TҩǛעt	6J͜}ӹ~8@�@^B!!*Xy-m^un'phd(9s,7Vo&#6ht�0nG=]+_mo̹zƗ^M4MnM|G1��T"FIC?t_1{~W}NbꌩSg3y3=5cUkߟ&+6-y?97>l^}6ַQr|
    /X~ٝwkh،kQ.9�TrnUASI߯oȜ#3^q\o‘mƶlaBWpԺgOϏ?WԺuy~?9D7<bHN҄#;sObksO/]RB'ym;e>ُ|i)7g�4δMjag*,0+&⍥K=E{~Kbk""+Ѣ?csOy*ٳB9$S$G2|#~}%&/c+jEoL\5ŖS})*XOڤ~xuK^^mlg̙,[BB<f~rKv:MnG~@[l&ӶGfo"Kw[:K.٣BZb{<{oN?E$<l@@MoDw<	~Wcw^Y%M=?)p\6ЛlY~^gBEmpGܺ=ٴmdrݾe!!~??wڭM| /a+!÷n[6v6x|*5(ϷWzgB/P}u!JwyP
    J�C3ؿ.ыW>$mbK-!v	q۶'ú+?WmoI5JgR?l8.<4-F+_;vڜoIA67j*s0)E7M#BS))glN4#=npXӗarCA
    	/U:3�Y.>SL8?OM^<כmv<5,	釁AKM/#]S-%=[rk=b[[B?UHUs#k+2Nt>{F#vdv܋(
     �3۸uæ}Z?7m3E=l
    8/{XSobke{Ib% $w#KB\{N2
    Ayws4,H>4fd_%Mok/Xm^%!rOimp]ycO_ݸ+v]
    &[Żp]a?>WjuXBh/mY=MݚNҨvZ4ܠܚC5AJg_WMsXq@7Ϛ}8($*ߙ1kά3>u6ծԬ諈\ԭmO \Q@�lN?w?;g&߹D{o=gJ>X.8{g>w!zlYeKwHB\.YBt[޵寮 VM.x_N$UԻO>~/]9m㗕,)!^_^!~{֖Im[r_3~z!!۰Elkmmcn%XQAH[{ئH|Aꇍ.q�ئ%Wz.yCnBB-}_P;_̔v!z48Z
    ,�I`ͧZl
    4^VPK{5w=-}nT(#Tokg̘ዞKNzb
    x"U^Rk\u+|+/EM숇$(Fgp<d1Ǐ<#S?n	 wD8^;̕5urHgYjquay]ie&dZG Ԏ8(d Y%Y5ݚ\BBo+G}ȴ+uv3$s܅8da']&BmS9oW9O܋XnO
    OӌI!_c>6Gwէ0
    ^:>-GSP}./sv]wkpoJ	yPHUs>sv.a*yi;=ó2;}ڰ͚epXKį[^	Pm]a@n=]^M,!KPo۶aV 9aS?'I SkքÃ˺9mXŴ1Wx¡%;}BB/%"BhrAG}5`3BKM(2Z G		!~"@8[!Cjv<V	:҈'o	q%wL2uj򋣒w̳/B?nKkݒ\sqgF6Ccp0Uz({_sH8+xؑN?ta9|'afR??>:o΃μΛg\z#RMH
    3:_z1ՌRB<۳6Ij"V|KHyPH}b?^?ep,2(~g_Ovzu\*3t
    YY%,YFphjv�~Uێ>C9cyb?sw#	!x~I|BPBBl޶mփLza_t~i[KG%Afk5.Wz|a)ə<u!yŜsM)&!$X9HU^2|Da鞏)C(ȧN/^؄;o?Wa*?;ڬhpߺ3Z8{V{훌9$9#~}oKvxbobBEe˦ΐ ۸}$!!^7Ϟjk1g]ɃsH7$}cSH>$<Cswִ^?i9X]+fH,{k#/Yw}M6q\HSm"f־/TqʌGf׎<h^vwj
    ɗ98-Vy{ruTcw
    xh6].ărA?cBs=WEB!R~R	!>]e.v!!%9*Ϊ(<'g5?w#G_jA?*^R%HFr@7[É$y}iŚ~	!~ʛroijWf~Wh |0%ᇇɻ-!~;?tkvk^{y_\]eŰGFba	l=$WN$tޏξfL~7]<;s*ttƧ}bz|_Jrccݛ6oBb]sяwOu-K.M)ѵ|,vIkߓt#GDȧNt22c[\;"h@E0@�@@|kM{?Nmu/RE߱G]?+.W#EFV}돑x3uUwL߃ק߼߮{e䇪Q
    qAVx둊VgK!#OHѢsu"&YƶųVGG0ld\ecT38>Ȥ}�fGH^~so}@5ɚ-?׋NvJ	
    fREU葃ZHxgG7\.ʝ)~e1<x1L>}=R!I7$ל7>ک7]yC@BL?WUxY?}9M޶K	17nzySsJo,ޮܽkǃо8?w}>yVǷNFN,*q@:huG PH@�@II}mum7{B9{8´پb2}_!WBbϊQS)ĶJN9 ȳ
    O+&j}?իraZ}Pd2~z>Ng&-Qf]o]}
    rҔ%!S`TqCO(p283w@Zno߸J#OV2CV:qBbEZrbKw/unbYoWx롴BCD#.=zϛ&Ma܂iDI|kԸB|xgvKK&v;oy?Fu_	:!;ba0\윽e;섯vɃ𻦅a>K7U(+n	&P[a@Ix˫6}[r?nܸ=Cs=q"dXB8dzo0g2u/"֥IXq~WѢ|O/_vo[PGĶs{>_U/}O?~JsHmT>C?ξvWim,-QjF~Ð~O4c %]_8kڎBEBBqp	vm_9֣nkМl*w<TD	A*A�F+.13o}Wr8#l*{^HYm8#Zy	SKoLIc>,剞}[s6
    5OE= _~s)!DlgBHd<$wۑ!6';+Un㋂D PB6|ߕ騣B,]Ӯ&_y9м$"!|We؜|f=Weg*8Qm"QnGͶy>P:Ur_TDc
    Ձ�@$Dj+>kQPlc}%%HNuʔt�JTwduX֖>84m"?(=ݻLlRHDS�@a !
    C]DE	6JJ˪;g?-7h|g?X�b%ӱ � $ y5	@�@�*B@h.kI�����p߅hX#�����PGP����@-H	Q΂ � � � � P>H�����@@BԨ*����O�> � � � � P#bڭwbk0=vL4
    @�@�@�@O7i$DWC	02$DCf����p	)Hˑׯ7_,%*q	uvI;ѢhFP5n9W0 CXTOq+VZvuK%E#ZW		!<oܸqml"QTFmU}I0K`9f1sA@'ЌjF+*\j{tb !W^""*	q3o]~}M]ꁗ{g[oӏ}rsb#4		=EAՌVT<,�c
    7QB<uV!"
    DuR%!.]tŏ}#.Z87lmZ#/Zx]W?BB<uhFP5Q@x5=X:Mhزu׌CF^>,…˴7o24hR%%z;g_9;s{'?J֌5x r;!Љ
    nB$-7mf<3/v~r<>e-PDu8eCf|3v_ߘڝb8|c !-!4mF%@%cPR/"br
    8`)JSzhxuOv>i~rp-81n~Qns^MlW7z=AB[Bqa̜Y^F^+ HWAgމ"p67dz*96*Hk\K/!6l [$y)
    ~ܵyK[/;Kv,Fe %//}vĦ~owî݅w,!E
    Hk;U*0
    ^/UT 1
    
    N (!dDaC)!ouQE	!> |M;3}ؒ;<~pš[#͓Euo?O''8(.DBE$	8Jˤ/	o9al!!TLjUn|M&ُh::<BDgrNB0cLDvxuB9Bꇿi8�"**!mژ?dK#LGrUxkaZ\b~6e$E1H%1iV'y)yN}@l_[s!d`+ˤX&B r$zBFV{a0A	F/fƌĉR}2NaPQBꇏַN<ċ.sϕ*Bx&mu];Z]<\D7tx4w!ߜvcf !JĥP$
    XDHuA
    &/뽙džQc2'J-!j�;"tK}j7+BnE (!D{W_}mvw?gǫ(!'Եُ_}uԑ2#Z|oFS}Ib3beI:1,y=ة&\B;WC+[pHA.̙ORKu
    `}mS`|=S*8 ؛W (!]Uѻ­Mu}dž~yύ&~tpq?VN=،$D7Nмy[:?#;*blE;$DllFժdwtevJ<EBӔ/|:aT vsbK+vuU!;.lb3vip !-!|1ى}y0	HF$W5XJn}>F|J6Li94ꠃ'L3,1fc@֝7t2ٳ(@	۫
    	S>~=3x?bhEw.H"Oid[\-PWb,!&"YG;|ۅDE:Q̆*3wY_oo_~ov&!! !8_t_9ЌVpZZb|!.n]\zX^ALEv%!JZ曢KF}C~DJBaYvPBB}h\ci7.< Cu`רɍ"+	">PKTC(I_v*:fU3ZQwPC5_bŪUDz>K-?H]SNpqb	8%<@�@�@�@�jJ�)t݅ȅ@�@�@�@�
    &�	K*#^)$ĆukEggc.F5T � � �  )dȟ@
    	?2y+m_6}ۥ;>n^7읅 � � �?iE@PBlAls>?IIߪd~so8Kʑw\oC()ꍲ#;]._Qv/6#	ȗ~̿zuvն'FKz&slS~bh<5+)j
    vb'`-dY+]�$J-=Y4)yIɋ$o.LNV-mYxvZ
    NdIYWp<1s|s&K?֎]>AY-Ƽo0Ncт б:vz9's`Us~NZ^mste?	4%D;o-	qÞ{$s,6y}~#{3ĝ^}8
    3T;mrvLӜ3p IHt!g"%:=3Gh<ADz(!>9!!	95t$=k	
    .^f0%Īzɢ)?Hn7ydɔ'w'_.kw
    	!gs.'}'^ZBptz|R:wY855`hRszVÆH:ajs&:`g1~u.}~ǝU9}f΅7727
    IJ
    #WcSÕS7Q^bpΜSTB'eParnKY(%1L (!޺o%dAɃ$ܒZ䅻ϼ,7'{]{TC~ĀdU4^Qc$%?F?CO=}3{p%svO,7cQ8k/O5u??fUINr!5viTiN)[Ptg_"ş=EJq:ScpNG. !!4-0|A}DhBoCCJn=$a[ɽ$Oߜ:o\SSNbi<t|	AOIķ&^}S^6e#QGln
    d^yoe2JOfGT?fqfg+h׿]KC*kקĄ-b؝EĒ>1c6j8h;ƙm[p~4zd'DN첯9$}[sN?=L=vq$$D{NPB\~<y}N/Lu\}t5{]OB&I$24쟓G,i53{l:qؙ?y01W~_6IKH|4NaXeNs8~:Dž/;f9Ӹ[ç2Ћ]_�B-799#ڑ@g0R�$DԃLBDX|өϟ_dI5מw!ł91V+vff	'J{팚 '}oI49v|0r)&cF^xsi`F|NaNl}N/;by+YrfKC9W=E	N'RX
    O9<Ȇ?0>N|xIIv%{JluyPg>;oQӎ^sb"89=]pҤ9CM<(&!8ί={I
    /F舖fw|Fԣ˞Tf;{O}PCpkBv\P>ek7շ8T7.|^>AP�	e˿%!3IF NhP[h	e{CBd7ۃ,B<$}cc@�@
    [뻥� 9Ne@B4;/u%`eD��@(?nY$=W$nD !:mnB{A�@�@�*K�	|"!����WXjժk׮^7S֯_#)(3qRuww.|}nK蚦hjϢ] � � �  @B '�	?SX���LW4Hu& � � �&HD\b-Dy'FّFىm(;7Gّj~sA%ܶ2x+%T
    5(y^#|D69*$D}k-K}0wSuc?oW'Ϡ,!8s@c	pMmo#�܀j5`	IOKfPNrq0;oʖ.9?>m
    QF<Da4颩L !г0pu1w!P �$DUv"啣=żI߉iYo0O!c8M#
    wƷq
    TΧ*j(JJ]=\)Ax+qS|
    sӃcכӀ#\8puy1�΁kujsnZSF_c~tw wp5;]Xc=#}"70|`v]<v/Me1Qd	#]&4tqFzw*tfY9ն`WmL7|?z9n]WЌun,ERaC _b;kV|sLONY= X0M_}N/UaO;8s	Ai/9N('X|ba
    .zkbc p`l8E'I]t;ݚAg]'AR-50
    ZU<K١m>7cY(EBǡs9L:3'`v'=J; =OOY^eչ:]R_Ì.284|ݗ0b:uBpqv^,yW2uIL#J۸a[sF=0AbnDLv#n,Įzlf"zS8c?d !2L##!1hWS[QdrO-^B2:$@Kh>
    N7Dre)8Ei/G'uyHj?9؍,93UQ\~h锯i"zi?E~2s#g"ԫ㔬`81`j<`I>?1Ù}0r
    `F"!4K*Ι^c**y+E1z`[BJ79902V2otxob!&g:]B霡A̍ !rigrA)fgRˌ1E]oAN
    cb_R,
    )4()".D1x| z:yGu#1/)K{P1,;N'ٶ}
    NxY/ӎ|:;=Yz)U}\%!"oJuJF+ϏF(51&
    #Zcr{6vG'1y=)@kDd5%-K~rʫ'bG
    Z?x})9դȑ!!RO!2vz=$Пej
    %D.ĉU#Цdj̈́? Pw+ɷPwV
    oHvPth?@C	:>
    *~u4']1$DABՂ���@ !iu@BtZ � � �E�BBՀ���@ !ʠ:*!6n � � � P0=hz:_FRH
    y#nw>lvشƼdтG��� !H;bٖ}ɢ3o[7sBE@B`���	@BtR:_F[br;|xƏhɶI&/>*YDy߼r$m[P$;mzNWĶWortHk59Ṫ>@E5g[]5aU!b%Bn)†o.N@(#:bMLL6鞔Oxa2gvliU]>n]|;A	`swu-:叞y.ؓ'9D4:N8VERΤ9pzp̢@ҍk~06l9G.
    .:Pއt%DoϷ$ďL#9
    &'=\u	L?qn'>aObQyC
    [T6cxŗ>8mSsߜ'J=sh	<ΎNg;J9%!8Q
    	yɃ3
    DƆ
    8K0ԐedYgPBw֯L:9ɘ}Ln<D2WNw^TH9mkqq,G$/6 @g,K]P[5L5 T$tހ43CѮg:XWM&=T!Q1@vSĎ;l}~c>4'Gä2ёy}J.˒sNM~ЃIfܒZ޻^qsYoN:v5sՊ9УvI!\
    zBϷ׷2d/veY7"QF쥅Kvf]0	"NrWlPwD!+gƲjHz-	POgP5!8;;}iiDTuNh,Gg\4Ō 2_O91I3gO(0vT5{l.fOe0N^G_J^eQkQF`	
    J;nRuJryn;d󃄄q.|!_Bhpzƺ|˪>7٦ܔ	=i}#fF_8)'4X>5/$;i,TQs&~!	!]/pzߘ7|}d`}bǚ'13	Az9**P
    'm~OB8;K%jl:Ybqp,:S"7v+RZrPȬ_bgXChl|e'SON>{;?q_zaW}c]v^Wo>)!ÛSÕXJiisI&rZw֛e
     N{=;[6Q0.fFzk(0GusHBÖNmPF_<9afVd7Ytu[4`}b_0g|7r#zB59F7G7tL%dգ%mI`!f1{Jt(16Ff⠄X|Gz#w?O93:S.X|[y$83oj	g3LS\cÄcǙ&z[fd}Blb˧w^\Wy02%05dio!d''괟b#,fP*`vIsǗsFbg]%8K36At8g`{9QQJHbj6=w[BȟGnR΃%46(!rg+!|K:nAvڗs|qF8]/a0sFRqC3Eڍպe-$qP-Op@׫q;D>v|X~TO}t'"RߏF9O218{ndmXM{)7lD8cƈ(;)ABU܅; FU~fg%46xn_(	QAu#WuZ3Xp~0J-mKk,^o(�$D	Yuyi#uAkNKhl	!_။11N9!2 �AV`yh0`]]f^u`/KgEqYzX1l%dձUZ6{΃5P>~̸3Z � � P#9d511_=\}!~o샄ѴWA�@�@�M�6򙥑X	���h;+VZjڵWooMTUD[wKt[b_h{PAI<ty���@p"@&iT � � �&�	)?Að � � �(@YB|$\eS̡H@�@�@@Ȕ $D)û٨Hӛy( � �5%�	́Q HN
    %%VD?yik8��K�"S~\rHx55`	?ۣ-quP_J0Q'$U^5]SJAƼf諸|-cT'u;v��(�$D~rr;
    Ы%:OJd1l*6v:-.‘y]"o*(THbK;8@�@�A�? !fZJ⪳SBÞ.ۮȿ{&6S z3ANPI6cG+@�@�@ eZK֭/0v蛭ewhvĮ	1luH{iؑNu£,pNDrOm9Y5'_vV4;6>v"8KJAS(� � �C�?|K!0䭃šH?(]1h àDH]\~D3=;Δ܅8EW,h)�� !B7F~UX4ё[h[Y`%gW]qľ̼U]a(
    c6q^	r 8経4x���@BW(0CHR6\hoF
    w!j:cv4
    >]	 � � �$D~Y}ZO 
    pyzis4ر#*\w!h+!En,sKw,P/��@5	@BY8Pݚސ@4+Ld?%ʺQ@�@�@�@ !Le=^a $D	4@�@�@�tdU4b?BFUBsg����EŊVZv:+~?k}}}===j#Ee&Z*n%//m}a"6t	"џqċe@�@�@�@�'h$�	QF � � � V2h�q���(�$D'	@Bأ]rŏXG\}*v&>n?Q֢děNW꾿N%c{RefM.'yhԖE$D.i.F䒣ftֱ)|:(un^WGɷg *c^ݎS?\|	-ɥRb)OѥhS!!Rd9E3{wv+>Wׯ\yæl.~\i+,eQ8E!!c582#
    %S;~6;P.v@xVlՔ_oσ}ZAAK~T]'qHYqsN+9K9a<5NlkmGnK:bS/{$9eLm1۱w
    #^Ҩ']S#CWynwFur8եDdL,tNtvrkTg85(i_sxׇswKD7=667U=rb7Г>93c6뛯T+9|2%<!!jEgBE?8=OɏOydS[N~'GxGI# ~|{Ʊ3!(5W?s94L_ljz9-MŶW>ѹُGavd/)jz`:bMpt8-&17 ޜ}Alы
    ?D
    -3$s
    Γt(v^{Ds#$DM%DK@y
    >a}sfmlۢpb8#?G:JB)NpPP"GK,<iJO%57mㆇe6Bq&v)W$|޴Qp6K/%UU.i(:g{aW2,X_Q=r02oND.,s|kG0ވ`F:s`>N51%}91~tk>y>u-Y"
    A*8?~q̬&v<voYPHz
    &
    N.|O8sI^D-]%$6t篵&8O׽)N!T,?DG)c@GpB@Qs1N̏c$78(0f?9p&X	i$'}?m$	gZ!}'ȭ	BtnW&v)ExB.~@BS0ыn&f+;S`"9Ь|i3WKC7fw\.u͏N
    s3\?]JkWx~_,ЙGz:NS#fJ:qbEN!Ǡ)t"J9z8F=?g! "<낄Ȗ˗v~B{%p4+?}ܮ__~~U	!grf&{1,뫔^sƱZ^c]4Kd�z38>E O{
    vJ.!'Β'8IB:Uy uCtDיљyg�+ho-+zvbm7:<btNg8#q>YpUgek)H	QV&!ZaރxUP7rrSbSCOO*uh{5	gtNҲ
    
    wZ46ɨ…U*
    RȖɗvvn{^yrxb wU(kx]rw]G]J3KkZ9lK0(ҙxE:U)x+3@B&UL<$H2zP7gm
    &v/XJD1HW, � � �$�	-/iڟir>N?S6qcꏺrҿ9( ABTp�%���(�$Di"
    U]~8>bU`@�@�@�@	XbժUk׮]z{{oz_Gv[b⬥b]?=a<Nl(	QbOj���&HjK`tK_kz7{ٿnrɮ_K_XCB'`@�@�@�I�k
    Uwp)C � � �%�	QٮcKj㢘xFLwGzNWĶWo!M#	ȗQǃCq\dW�2vKE[^.PSPpP5F,am20,!wf߹Ne	^?z;O^vLJ-(?ǜ9vт б:9ulx6sH:a}.XBpSgIp|Sv^K}s	!9	^P P N8Z*&lr*HvE !*$5żt\YW24y_㝈}U8[pt>N8Ɖ"]ʺlo׫H1X
    y\'̄1v-¾OߠS1bX?7Q>Qga*L
    pL@6r/;)b2Oc~t9*v{֨˹⁎܅H1qJ@Yˆu߰ѳ`J4ySQ@V®^zMsD|;i]_ɘc)`\{wf3ㇿB=8p2z[}5s:Ň!-c꠳
    b z^7-uH:E{+~&0رì7F8c <7|ct.'0ҎnM 1!!*>oҽR$Dp:LgMLO%zLdŃ93[̞5>%_&mĺX'(>5ZA&Db%šS|ѽ1b:u
    ?Nzw;3	L[3bΠbOh'y=Nz=0R6Ƥ/Dg:|QÇqsbtHzM#x	r"sw.1K	!
    0ۥ<ag,7_dk8\qҗ(	
    :kdbx酓'	a?En--tYEM_v|`STƩB3m3'ceC18+Qu0%hD	#P⾕ƹ1[YcJUo)3geuI838+w`F#ú#:;:H͍)Pcſ=/3?"$86ƛ='$DB%vLѱ'U/_sZp-UˇNW1)RHN)x	aOj0ƶ}%ͶW$^c8C4?8%qN:8۞`0#Dq64$:蹑SkguhrօѢHzdG]`Lnv:fyObfӵǡ13*&S)t,98*&cMhFHc&
    K,\>hWS|FS:!!*>iҽ%D-i6%Ӏ
     /P[sXLv;$D;vMHN�@DY;{FG=U-k
    $D;CBT[���C�"@<���@	@B4sKkOB	 � � � Pk
    )!���@	@B48/iN	A]/]sΉGynwy'vgc~9_ϭ � � � $0$Diyv+Nq❓l=\}m޺yݜw*ICm���hp&_Zӂw!>7/gxއ6gɶG/MzOV%+HX0oV{џ댩aj˶Lw(;(;eLj?(;|Z4NB^]mi
    9ɜoS~ԃH֦֬(}Nte.ȱ�BK?@ x؅'&%O\<>)yͅɪ#/|N+?	F>0gb֕;
    
    &�Ƿ5&3,}|86wa*Z1�%Ю#=BDUЉ=nAnN.D3Lw!vϝa=N_>?ydkn9f;t8qءOO"b|Kz.?8~Op=gvƉ x>CpEFN:1�;*p3HB x​[9~dɔ$7<pfdJǯ|.kw
    	!gsptLs76gyh,*H5҇H?E/r1DO߾Og>?Wm?.!:="盦wĆ<9'_f!"pwr^bpsV.=HVg?~C%dAɃ$ܒZ䅻ϼ,7O<d`1z%$s}3oYgn'zE̹QvX91C'Ag{±oV||;KÚ0ߊgG%$X^;<ji}i1w/zic<St:b
    Æ6<fȉyD_>ͥBޅ?0]SoN^eQktOM9QHrY6ztNNv6<ŸkzcJ!&V_偯|~T'">}XhLWbD+t掜a-p|Bvg|in-897$�=pts3e_so\bUÇNZ8؋)Ω3ޅx7_پɓ'OŃ?q'u\}t5{]O95xJjΔnUKsIY
    .
    0ۥ<
    7zIg-6Ky9W<tv5jMM>nC5:юy~sAmơ
    jD/dB9DIδh}bC>(jwMvU^܅Ww!N9%3?Yv_]|~j<|W)qAh$V8c$Lٜ"X&XvCΆ#\b3\FCR"]ۋ9˗YXDyN; V0!!D09S=X=Eqӝopϥ@::hϨw!D3]"|ܹwk`dA3 )\oK,>a"'&&)vRqCӭW]f5ߥ
    WghěrBDKija߸#`0:řQNQ%yv(G;i+AS2£kᏓQp9oQ1sɨ}cK}Z.8]b$;Qj
    &`gMD�U_IAxM|܅!c	@%~9A�@�E|P|m4X͓ӫVw!@RBL?tY���p-9trǜ$T0DA�@�@�@�F�w!:<oWKԇ � � � �u'J;ٮSBt2@�@�@�D�IY@BT'����$DvIH����h2H&nYm+^B
    h(fv|$S4Et5Nl(?Ri?)D/l#FԻq.*kR0F
    Պ@_8hy^˲$EmR3Q],K}0w.-kGOC9ܙmrOYfS5`63SԯDñHg/	:yNƴr恄hLpV!KNzL=3^I7,cpm7U0,?byⷑ�>ԍR)2xXW@<p !
    	VRL�'o6HFLgZexp^N1%2)2R/~stSЕVABWlo׫R3
    y"evz}vΪKsp6͉Bc\p:vQe15{2Ȍ:m^{1CƐtYD	 Pp5c#8llvt$LhoĴdOž|-.g8fcKlFynx*ڟz;0baS˞
    |$X+uW4:ǯ>%qzc2Ř"g
    N>ξlo,BwˈPq5BBkH8413*=ULJO%r_Eװh;wz9gݎ'}{1!*՗
    3AP'V2=C#jFӈڞ:|icAH67R̍|>T-88#N)fvDĤz˞cD"X]1yC}/fǃCBp/(^B2<QC6_\b]bY/\K:֗+fao֝88q[2%gATN�'dFLCD/'9S&5NuJ0;M1)gx".8;gڟ҃h3O
    UĎUTOSDV:/t\x8цo}^'#:"2V2[Kr^H[pTv	jdk#dF2<"8d_mAD1ESv*Cp@Ä'8Ni@h!^H=-^Bӄ-8*8F׫
    "F|sX;8	ȏy{I$8Ms|v.$`ĿrB:a~4gE'z̨H[mCҳ1s}Y`$FSx
    by?c!fTLr8_ΙN[9ƈod{4V}PV;XrHx~1sf{HOt`	QKFpEΟ	@CWo͇K#xkGABjۄ@A�JsY,ϹP~hVqjN.#G � � � PHXwNMh)��@No{!!ڎ���@y !cܚ*!6n � � � P0=uhn"_^ !
    Ҩ@�@�@�M�3jh}���(�$Dg$嵲x	v1|E1=Q(;(;ef(;|Z4NBϹ>ύʾ}\˨
    ^ͯ?pQ jV$PLDT(ַƹkp3j.XB̾s}YWp睼_#5veǞm>%A8N*
    @+'#@_^XǶt`jӹvs۝	|y,XBpSg
    gN3=5'J}
    4Wާ782 �sAB4sod[ !K;fH>	2'35On;4Zi=v{)=*?E(r\u<Ntnǘ+췘Gd}A3koD8թĢ줈ɨ1e51F|Gǃ
    r�:PFk̸G~$v߮3ZY0Fo1OUJOnF~pwg"η#K:1Qog|gzp`X"r[ wD*ѫ&zD>xJ*]=oFr~W:ǯ>,:߼Тb2Řr3Dqg{튈u6X5�{V˖y\(/Kȟ=yGO
    M%Fε3W\W盂c]2sRbFG)<7VM_y.1SgOqLjDe|p|BļY@kykvCMΠ
    L㜴Qqz.uҗ0&vbc7+#/X1TH}#J:OtF	|y,^B22u\y?8j'^:DOi)3ɓ#}kIiK2A[3ơpG>=fmfl:^z^^kC3p3'c�k~ePtν?HgԜ$K*[i12Ι4{|<9='ݣc:KќǙ)W�gh;Y>zUgdFi*Nt`$&
    ۸ӷr5vJ!;u
    	(w̱fLWEtS;NY}=Ylpi~{	/!iBv:֘jK>4EOyJ||~fY}$+3߹)bld[N*Œ-ٳ'rڧ7
    =6hS~09ְC
    냯2x0՞@3=Fd3ƌ=>Ӫy`(#bho
    K؉+K Us8E?T}%:
    ,&BB o/H*�@.gWUgYp !ڛ@:$DCՁ���@	@B o/Hva���	@B7J���(@+VZvuګW&~zzzF(LTlbK'_b_D-G#�	> � � �(�$D;M���a	@BA�@�@�@2 !*
    rx	vAw\oȉIQoYjvꍲc|͍pI@|v'NG^]mhS/0߫tC?L$}osmwb"mwy\|+8+±UI
    $DTף0@B};X[zc<9p|`RY;iW^vl	}AY8(ΰF]~A_aK
    pQb@O&B&N$'V^nmW%sw6X)g텄BI.%'=d>;pqRtvR,Ěʙ8kX>N9IJʤVc℟RO1$94
    3BBY$�$DKGe,?DIHHoˍ69c%%!
    ]"^YO5$d3*
    "Iy܀k&^~L"81F\vgDxJQ!pY�kc$X/:$+=9Ce !J:P,9#+T\9vH˩
    &36
    $E
    ĥ8>[3|vb#]agDssVO:`C *sʼn1	G16D9f`㔧'fAf_LζpE]QDt1I;@{ΰ0Ǧo`\Uɞ#L)	QhH|Jh7g,`ĜeDVDx\n.v1#T_,xlcO
    mͺ!"3
    INs=i`R_f)ը}YO`>Q/3Ύ
    gyz-{U%c}(w3tfoىi*>w)	QΪx	.06Y⬎\`
    NC-TcǷvp|b=t.6Cg]
    ahiE6!'y&B1vI3pfGΞRSt/y+6F>A>}a,1ՊZzZn8s>,[XN/I#]T=iSIH6hK<Ʊc?7X?_!bŇH8Ki\b-t>mdWpP̥tLQ@v&b*XB}by+K0;w,v.k99R؎1\8by:.8֜-3<*	Q&[-!긑O8Ӗ>%Y3vN_tvhz1H{m߾dUj	>"!뿯<O:C,j:Q2eԪ@m* )8[:ϠgX"*]LĀllX=m#E!b/g^|! !M,!:qCۜb}m(g/Y$`[7o__;dYr|^٭Χy !ק> '༂H�]R$M(;[̷s˪7Vp:QQ !J:�	NE@�@�@�@`�$b!3E���HtEhPg) � � � `@LO�" � �4ϱ-zcφhlז0Hj��phjۮ''HF !g
     � �IH}|9/gNS?SsTy={_?; !b|�$DJ��@$#VAO
    )u*n_W鵯^##bE~uޅ @9c3΅hF?Vx � P[t0ʷ[BxO#wL	I`	r%DmçCBnǚخGA�@�r$`?cMT;U}.'w'$CJ9O2lLyHte	Q΀+ � �%]B839qH<A&B9kJ;	?SX@��@.grTFWw!<ݩxFH+bӝeߨݸ5aCx	#o}@BԷ9$Du��h|�r @B '�	?SX���LW4Hu& � � �&HD !g
     � � � P9	ѠDS@�@�*M	؏7ĖNqgąRr!!w}@�@�G�r	JR ! � � PQ
    ։v]V!!jIp@�@|KqFa=A~7EY#%gꕅmUiW>BBTo$D}��TlB0|v)Fyf
    ?csKCBFF@@��@.WߙFu@7Y$}§
     !r	BH\ːh9�@~|R�	_vC'!b,	_0 !Ƕs-CBtnߣ � �(KB FeĂ0T	'*$Dz8M� � �/}츔B '%-p"c|BBd ! � � P)4,[YL_/$D~BBԯ1�@s	0*qwȪQW. !r#@B  @�@�@�@ !ܹ5
    4@�@�@�O�;Hs@�@ ̏#gO)>`Dvt	..%@G � �M$)z#JWWaNS뒐:	Qю[ � �u#�	Z"A�	FE� � �I,ߓ`$l}lZTBo΅.}Bo_1Q-58K:@BmZܾGA�@�&`Lڙ3ob}yv&VE~	*jB)Ye(.'I'|C	Q$NSz�h?0F\Ɂc}l]Y$D̛_#$D-�(�.틝6RB8;!G	k�ڬ(I$H.\$DJ% � � @="6nw>
    I`jo;
    ~r@8@ߵO[$D[vqHx4@�@=/t~9oMe#k׏8)."v9pƸS5
    .=
    	Q:M��ȃ�nO$	@BY$��@ nU	$D;ABԲ4���@B8THZ( � � �5#�	Q&8	 � Hg~~^g^H*N]}ko��F@݈nt# !*=5uA�@�A�XV@BTw$D]{~��T/.0v~À%BYU H4]N?
    8
    zJâo鄏R;RH
    @B D@�@�@ Pofy]f8*{FT.NCiZD04맡ĈP׮\i}l;2$D=Z � +%3w^}";;qNdܗ]>)eoVt,c,L(E�"
    
    ��@^Be4yׂ{`dtu%BX	+~	c0!	;RL ! � � ^ד]__A	i6!3NBX9wN
    ك";CX0	@B &@�@�@ Ƴ+FB,sG=%;:)^y>EᴋnQ<uT[?uك";CX@��@[RMF;%n^HU.Dc
    �("wQU'	Q8:M��\k9$D2���N�.h
    T4	@�@<mz 'Ks蟄5ڸ
    	Q � � "Q0d<=]o֕/)H|yZ�$�@�@�C c^1Y.�$D;
    Hr4@�@=oP_>j6 q%R<']6A'ʱϯXQԖ)#?QQs/>QD…,,L( � �<vC*̌zlu!ز$xz�'7TanW-
    Awg)q2T3rYH
    gQ ! � � #AA6ND(qr}獅3R'i}}I)�H��H  (Xa$|>	+!>@S:ߢ(4c„$D.1�#@B  @�@�@ GK.A0U*@<oc#bJY,(~ʇshHQ1US~BBY$�$ʁ���Ix`Fz_xvWջ-=[q^g^=ak¨<$h6z͓0׿m[mۡ!!:l��	D%e;kL�ƝWY!!*5p@�@W^4D%olՐZ4@�@�@�Q?H"���T�$DeA@B43��'7.Ϛ_zx	Q~ � �M$PVZVyaϋ$E � � +R^ϋ$E � � 'T6/y'uf"ΩW7W	}^}N<_7!`rVLHb8wV-h-�@{i5NFZ8O.Jzmi`+.u?W|nqV!!x4�$ʀ��@5FeΫ(l\kϥ^UN+!&>;?>Q !�� 	,̭Q2]fo`q-ݽ]?g-:"wD !ڳh�@9(-!9qv	螥^rJ,Zu6}}MB$ݺuzڿ~HE1) !X[$Du��Ԋ�+xyaD]ׯٹ0Qz˸kr"rk-R29l)Y@BtV � � �F�:BB���@9 !ZSH
    <|ő=|aǦ]0%s
    ���]beW.ھlKw|Ooݼn;QE���$E5(!o}6^}h9x֟l{ҤoUfuy7N-k � �#.Ԫ}K7>\O-炢F !Am%ĖM,<qm{7&g',q;|th?��*W|dr!Jr"
    
    %D;o-	qÞ{$s,6y}~#{3ĝ^}8>��&,c۹bmtdɔ$7<pfdJǯ\~y}OBA�@�	_`KYިYxWYӻ~	ZKK|Rot6"
    $D;x\wjrˏi%<sKksZ<&wߜt��(|ǚ5D}gABp'zmNCA!E (!Oۻxo%<}sm&?pOM9QH*��t2t~UP2ovHn.mjmGW#A%t{)Ebl_''ovwz?a=/{|ˮ_|v
    2@�@�,}Ђ|cmvH:jgǙ;](f`ޅV׾c۹bM>߾{Gz~'S^{fUJ܅!:7r��AeI7ԃ^LNKIy"ZlH
    gQ8)qƮ0��٧ziL2aHa1<evWEyF!O2a	I!EBL<z/$	@�@�r$y&Lq|㔉FH
    P]"!KB?<p7]0 ����n@iFEݍ
    (H&b_X02��� H
    vJ]"!$q#BW{h����4�$D{6eeA�@�@B|-EEU{?֟ǥ±ޛ)H
    @B D@�@�@ ;n9
    KS4')H*B|hZ= � �exZqb{,EsRUeCBTkj$D;��T/C1q>d{`{n*B 6/_	8G !x4�$ʀ��@�sU"K<dgR!<buP/|W 8AIMel`:P0`H
    vJ]} � �$Tλ
    >m	ھSsnq:q!?rJ%|+k !kU=@�@�I (!TĝyB?O!!|8Ȱ-!0K #$DCBԠ"�@	pLr>q9tu<ĔAPDu쵪	Q � �5!`<H{ă"S-^8`ϼ;K' v|+D?"&QrFUW!!jUp@�@3xF3ʚv
    $D< !קh�@}	7x^F	ѨDc@�@�@�@`4HDD !g
     � � � PBB,ZhGJq@T[n')booYK-%{&*L�"g0 � 
    +5}^l%3Iyfl{BBrMïk׮Yg=oxꩧoVHXX{m�h3	n8KA?s4˥|ʡoCX믿ʫ+K^<e[ !rC	C � � 0L cv%~ɠ9
    RB;6l]{}w+|=g[zD܅hp$4H<i�@~/&X^O/RLAlo7S::I~*]y%!~Xz_~.]K,X4o%KBBTC+!$D%N��Ԝa;n#K, ?,èU?DA1Ai'>OZE`Ѧmf!!:x��dtBZ	INB|_wE]dflABTSj$D
    ���H̔BW;[>	+f*} !G~}A�@�G GP+LA7)!2>TN,XJHBBT#$D�(A-q)2U:rZ?cAlgnr[ДAwmʊY5CB4o2���"TY?CBV$D8 � � Q_
    !FwY/oXE|x		N���jB|)WZVa',x?: !ݓUJ_@�@�@�@ gBBL:uʕ~w͚wōW^y_^K/^X[4eʔၑ"NTlbK'_b_a"\e@BT+�@c	p>\E >΍s8KH!yބ~3g$D]@
    T4	@�@z*bL�1|Km
    [!!VXjժk׮^>Ms nSAB#eQ݉ƀ��T@2ҝ)H) !:aT/Hw�1vҬ00ȜXcCyV]3Ns+at;,>w!RÉ^��ȅ�`}]T23luDeh'`Q(d,w3|}qZDtk.!4	b !"`(��	Jg
    ˉƵlp^Oy5LkatQINՔO&0ς`BP@�@�r>AH}0
    ^2vl9�_2ޅ:Ӗag)�	u@d��@.I02?u@
    	K3	΢@B >@�@�@ ă7*Ɏ+,Uz9ES?80,_i*UE^DP8rͶGQ\,HpJ�$B@�@�r!̡sF@ �$D,13B	��Яʇ}(�$D;2Hh4@�@�@3	@BtfՐ � � � P*HR7rHv, � PΧ[Ohd؀!!Љk$D��ԙ�?eєe'(PV~!!6^6lX~xGxbg-[wwɗؗ#rGhS`tw��h~/䓣)H 0$OwO|رc/"qv[ÐG � �M$`gUM:n~p)Y"&ȁ#Ɠfo
    _yz]>L
    wMkqu��0TP٧,IV$!X^1n]z8`ƪu;ľ]C,؊
    ؟2W/^,xw!b|;c@�@@ՙ*IΦ%!KYR3N܈�S68:_{;JJ	;{
    B30}t !6!!۵h�@/!ܗ)$8}	yٱ;l4T	f͚u։oڴITG	!-q2f		Q � �&P*{h'hIt.!S"^B?@Bfi=��D@HCl±9^yLJg
    '
    g4
    Tg)ƎK?'@;
    H	!S2ăP]vBlBB4G���H	a@	@B���ԖTmW8$DQ���M@J!/"~W}/x � � �GB+ؚJ@`6] � � � �QQOTlbK'_b_g_A�@�@�@�@�:�$D'> � � � � !����dh;����DF@�@�@�@�@Ξ0Ilgvi^~06qs/[	QfϬU@�@�@�@y 7k(3d !ʤA�@�@�@H	!^v$ٸemz:`	Qf@BIu���@8cuM!<У~zO߹k'E%qpژ.6^&H���@="} Ӊ\']`3M<2()ƌv	!dJ-U
    $D0@Q�@�@�@�@ GGv[=O0-[aյUB"H2MH4p���@Zvx6oٲq/Bn=	Q h;2
    yI'GʋoaF$Q֓RCM @BU���@wYBBlܼe=#]vM<`qK	1l[>?4OBhǧiiq`UfCZQŌJ,�	Q"|T
     � � �H_Z7
    lۼI	!~HĒp=?{=
    bGʨ[ʲVŠٺ|0"(� � � � #C9%o?ܤ*"X]b%ϖ'G}%![,i=#G � � � B0۴amCSB9̿GE !: uƌY%N]!H
    w\���ّ'
    M3<:sB)![PE#
    2X}DHW2
    f#RCFF>\]
    h���TC:#WB0BE]YlbG!nDt}nAz	QI25s
    fwA�@�@�@~#		-IV{KۤC/~� !jp@�@�@�@�ׁ%$Q/|Q"q����(m{!xw!J=T � � � �%jup@�@�@�@� �	Qu	 � � � �%�	Qۮ � � � � PH2N����-Hv����2@BAu����@m	@BԶ8����A ,!d	l � � � � � tww%/@ � � � � � $(^ � � � � � $кQƓT@�@�@�@�@ !s@�@�@�@�J!ԑ!	����IENDB`������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/beagle/images/callerData.png����������������������������������������������������0000644�0001750�0001750�00000025140�12143164146�021336� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR�����j���(-���sRGB����gAMA��a���	pHYs����od��)IDATx^kmWUɕOD1M"DL *cj	(QD@*T6[˻-R(-ϋsY099\k9g97c̱w{^y:HHHHH`N<y7?~;;{=qæI~�	�	�	�	�	4@$@$@$@$@$bW7pB$@$@$@$g8s'    X@|7OK;-gL]?%..|'-j
    V<Oޖχ]8DNԦiYc'~VC_Jx8C#a_V"y<S4|r[Bc|X@VdkU2ΥWs?!leδ;&%I"5RM5X4ި{EуZS2} ׄ1Q@VrO]�0]ak5Q,nGN\nWrN;H7"EܵBDtKc֠NxG@7`zzG3:';.@,yҩ.G7>FBTibW=VǏ?&Ԍ[7wduv>s_/Gڞj:<1OgȬ^o_Kê|g@H~s
    }HIՆ0IpA-4sB+%\R_Ky-u1?wQw,;ZͶ]3lCQZ7s=B
    eWŹU!
    iL\;US�f^ƅ
    38XK%=Ga[ǁs,>\!X˕XH)Z;}/ɲ6
    /#jެm\.!.u@JG;)>\pW:
    |6-
    Rq҈ukmԏ/kC
    ֎ޏ:LzM)9mC".}GzWe]`Bp:ɿ:ֵ*$/+8t0rՑJ?>#PXQLZe.RPw&ײYoB6SなgFR>\?ȁsTU{KA{H(ϱ[c\VeZe0rF5\w4Tv.|zpJ>0XA70"QS5?ݕzL"\'?9)[W'	$A{-D]MZVv[uY+k{(o}UG7#)&W-R?myo$:+j$<,Ќ."X3
    (WU:Es*:*S~9]E]6GCHCP+B|hiՅtk5onWkQzcrnSϷ٩R5n/q:䋅@j]B=4*kX#\-�\5//ow0.YVKQ{V/NԣAR~($.qJ+]]+DIrewΩ-g"<V+POzs];K@Uu]V_^VŸjKb/\{WM΋Z%uژ#@OjZ8RJm+0e:toާx�9ЯH4ۗqzJ>xX?ÕJclvJοxos|#�Fρ=	�	�	�	�	�'o9n'   7"    h"0@K_Kxg3^pAD$@$@$@$@$oG8٧nԗOo/vgHHHHH	L2П:ut}Ϲ5?|߫~+~~Ͽ~s57\O}7+'^ivIHHHH&8?ͥo\%o|.\+zr|o^']9H—xz]}	ce]/P1]S
    !/>j5eΖ~a$7"W󕵔	SUxe%%U%xEcWXkzxTE-3d8W9\eo͍n.;>k{?G\Fϡd9gq޴{\B-nS)ɗ#yC\cފP	 ̈́$I{j焎HsKx[~7kIW}{ҳ6`7_8wsk?~Mzo\ԁ:ñLAbO2, "jv2'WsӌHq6-c6魚�r!w"}1Nam$?Eo|{hso>߳ul>p֗~E[og❱WA퐚We|kouzD5!G#Ct'5_"p@>mmK�{ѧ?}CѢQЬw8T@)vD9׃l/RťGV[~RIKN@3I{{l|7W{O=x;Nӳni~kPMFVUkUٵu["UyQsC?,)ޒC]W9QGH�I%$G`NZKeXmiwx7!shŇ;ί~7n-i3ΰrs~Eo\q抳O];^_9n/wg?ӗ/nxm̰R^<zsliSU5<bqjGU \SxĜqmD+xD[gcn9?l>LՎYa[jV<Rlԝ/4DbE2eeBZ=lR ]d]]sc8׾)/l?wzhʂW%`~V@x*u.Nd
    ~^QxEB~voġ`n:B:USeg&萗’,ۚhP$�趜:2@P}k	6TclbH! GL2;>}W3#wO(*B;+/rgsWC-Ƿ{
     ^.[Xmi/yGX?>e[K/Jct-
    szE(J
    tbJEU^KrL_9,jޑ-;VT5ZV8O}U'.UyLv	Ö!p¶`&'Wͻˢ�(No8RiunCS}RO'Zn&_~H>5	SU}ÊWɫ־5Ǿ3΁͂sNxo'Ϛ�8j'8I7Z[8(1XXé+]%ff;H9["I¬8X5_:(ľ2e\$@$@$@$@$0A$@$@$@$@$p&<:o^}WHHHHH`:o?>cە'	�	�	�	�	LG�M׵lew?x]G_$@$@$@$@$c{9N2o9Ox䱪\L$@$@$@$@$%0@jNX`=.۾TW}S׋�?]rgpr-`~qV_<1x[>\O,Ow!!j![5#jKV	9+{骋34
    Qͺ/vZ;QTm'V>ذ~K?m&Z^gA%{\K#R\kh3A('I}迿y֖S^>Y.GD;ۅ@m_-okm-F!b#2L5cHFk=b? q;c4M[T!,6r
    @t` ?:XÁlWNFI+\3eUQ Dc.vBs>5S
    st7+'뷉I+~x0;ޟs-OzU{Ӗp}zD~ÜWWnP8Q׫ΨƭCOGSFX/9υ}+qY2(S7£uF
    MZum),؜ˎCD%J%sԆ⌜۠̽b%nWs{jy-bK<!V۩[9-sI뼄(#䋓Wqw*/*\5d^8D՗TUW bѹ_2A} 0eN2ǁs}+Nsj/lbIV- vuMf%:n~Ҭەn\\[rBi,uO[}o貛*1ۄUǎa}}NiPoV,~?v8;�=,+Y~~
    MZU-}=W5Lw_r ,WSꑜVuEd1
    zI=6[{gT?̖}#ȹGV30+]=5(5SOSSvS+	sY<jΣ{ro\n	iTIWs㲬񪡅 q9[ŚYipi`r3B<G
    cy^1mF|y䓣EPd1WK|Bum7.s];wsZSAXq)KD}[B诿+Sdž[yyط\rY֖&?Z/O"GjCE; oM_c
    /(WU*aПksXW9DooU1\p6GC
    .0Զgc8Ra5x@V2N-LkoAj
    lSϷٱEMkD;@;.Fw?FKcrL],?t*.U'.a<'k>0.z`!UiGQJԉׯG'VyN[Zd]~\XywP*bNZ"TWLEi8Z
    MǕ*-	G,[2motWkʼ6,~褵2wluCjUzj=/6s7+gw{'ꝜBvgOGV\ķCXC)bd{.3@$)c|=r5uTXU"ّZ꺊ۡjx#c4)vM}kn{k?Ƕ+O    �8k$;z7]Wv&    $<7	�	�	�	�	@|/A$@$@$@$@+&~kx-$@$@$@$@{F=z    X1=7S{opp?nΤp;atUUfqsz[.ەϾe`KbWJkX_>BsUgK4oRH]hj	R}Xc
    >Wm)G@>E4'F+X㔚W"{egR;N4;<~]GdUڙb%
    xkHv]poHn4߂pqoTp@c.d!f7k/1�IθfNYë#Ҿ0"+іT>) v7<72
    -zqvN_F(njS,1lKjэ,ЌM+'NS:Y^WIٺ'Ց}Յs?EZGV(Q<QS H\\C9Y./J㉸V5dUU:YÜ4^[)$oGX'T+t/ݻ3ȭ`Yj@e$a%
    {L}gYL.بY_%Dܧj;u"?1ЧzhK0D[SPwl+Q-j%=ɗ4+a0{HU59ǎu[qE^uBNJ7hճ$8=wPJ7A*4&\EaX_
    wNT_ƐN-R5mm:^o[^e㜋ȫa3Tŧv:
    1Zou^?MwZပ{4x\)҃S`k;V^4)^M?!6jUqk>y%lB8	ڜĩ/f)<�zO	'ADKi~Qu#,lEhA9tY"yozdnSxD_[D<n;S_c$AA9WqrZpvCtU$TUQ?(WPv11a BNWQX|7K82a
    CjYNS^r~XLPоH}9PLe~~?`!O)t569^C>D6Q*nV\aK	Z,F.Rv	0.u:N~:_VoqUW;X_D.Gk֪j|N˟Z_,X:ƜqA+b:7P9nkZ"U8%4җ�Slmn,k̰s-πG%|[bչ͡Tfٸ
    W*M$@$@$@$9Г�	�	�	�		p_q󾐞�	�	�	�	�z$@$@$@$@$bW]$@$@$@$@!rCOHHHH@.?_ݟ
    pw'щ]E]턲 Se?\KRT֋к֪Pysi�	po軴.Fv4JXc
    >Wm)G9sU/|1Ny%WvzQ8o/gZƻCfQ[:wI	p@N`Ri|Ʒ+qU+qv87,$ˍ^yAf{�]^+?H-gsx	sJ}0ΦN~r\[[?er[A	WSR'"G4ҥ
    ϵ?[ܵNޅ_}ɕU](rgzuLˮ6\HQS&<ҳ
    rԟ˾"u>&H8K^&~Gf;ByԮ(B'ivtԹ&QX�ôT{|sP0|,/-g@FR
    ?N̔"gv٢M9(qr_uea"װ*q*"3_irn!<O\Ь?nkɩqGKUml`U	2u7diޔΈ Jy?TǺ3玟jҔx;x^e W4\fm>x\~9;t8+Z%c!YPi>>pA9i$'|`^(zrxx/saX@?u T9(W�qgixTw8|5WVP)"?.AxXX%x0e,*=8A'pP�
    %֠Za5/:K![;Ǒ֋0#aN˚
    ąG3xCGk!ڋ9y	HiIT^6Mq.2x*^gpWR}3뭼pT'*'X̄=nUk90MHkӧWXV.0:GRԱOezzZԜѤ/:t8O嵧Vc0ͯjqm$ozG[EiJP1|ι֡^WN9@Y*β9T3w)Tk9R98.BAYW~@YUs,?Y۔ߢS˭j=E|ꫵˎZJr1@"]n+p	+\ui-/'	Pc8b1C;+w9c޻ćЃHHp4ЫXɞmZ
    ESwu<(,4?*
    �FD$@$@$@$@cp_'c2ͽ$@$@$@$@{I`_$@$@$@$@$@M87a&    X     &蛰q	�	�	�	�	,'L	DK%Og
    _]/0k]>'mk,j|0GTFBBnc5%QW녰Lk2W 0ݽv/;`\,Wk.|q}.Yg5=^dTBuKz		byW g9Zki .MF�յ3#KH_2}!Omm|!<�<`?=H7�cy;_6;qX2O'@&Iu:tl`0҇٬6L'&Jsʷ!7HX3l,jո@'j\ϴ%6i_pyu%]Jѧ&<%$*^fQKɛŭ_Y%4SEJͻZ\iQMUqHxӠoBZj'KbQ;FV1.wQ忪tXyK!vp{Uy)M\P{ֹNI!T-W�RxM>Ö4j~Uc5_QKWp([#$
    lK5Y)/kD!*7kbQAYCi֪w$yHzB.eL,tɆJ#aB3g>tlLsnJUzVq:iukVM�2US-1T}պK?^\V"
    p\
    z4`*'Z;ugLAg?z@:m8l2%*ڂ`Q{\!@mP>7.QզN_S$Q4?
    }悵@nq^.A;~x8s3Hf&^Uin70g%hG~|2\Aa5`+imlh>h{zA
    %7H
    qߐH^P[�H\?q,$HB8YP=G+}7U@#0U`sp.lh|ya^6y+17
    ZἪ
    [zWI~{G~"lM_Ș*jF|H>92)"[sZJsPs87ĥj:GUaU^S&n8˾E-ZʲHVYjSYN!yO'T]nT7\8K#^*鼲D.EZ/DVW=pA{^ppw#Ӻw*=׺]νo5u$zZSYuo-:v|q!59}w 8ˣI`UO	!2�u`$a	t!布5`SIHHH�}"c    8XI~�	�	�	�	�	4@$@$@$@$@$bW7pB$@$@$@$gjHH����IENDB`��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/beagle/images/font.png����������������������������������������������������������0000644�0001750�0001750�00000157726�12143164146�020270� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR��>��c���BS���sRGB����gAMA��a���	pHYs����od��kIDATx^y}vϽw}997'yc$ld'cA`' M%1D`@
    -BHhhI 4R5K-<hcUVZkZjo=?DZowvܹaÆ_~'P�
    @(�@B~gY|^xaɒ%]?_pl'i/`c>.~<l?F.~iWF.Xl_fCWqnc.F/.
    Vʹ28ve,ꥋ)P`p]}^5Kyԫa|G}wO8x|W2~Kt#0#<#Hя~O+U˖-#nw^կF.;6n!;"}ѶeGr#m:z$nUIveÇZjk>xNZPpvc6yh3dd{ZڞSN
    2k"-wSvgvَI~o1f2%hdG{p/mu{m=ؽQۍ]ڶ4v1;еb:7q/>/dymþoP׷l]=m=m.k[fkakZn]ٝO|s9OkZ<Mkno7[닁]! H]r
    ]6 ݛh㵃=[joɶdr_7	;km,k;bho}ՙLCvl^m{勤1;nq\XvmΫVv䀴]w)iu
    ֝f/=kN`r=#.iƎvGnfC㋟%1{9zyd-oѺuot0[íoݪf+֭^r$<G:Ny>[U3"rwžG[	U	zb&ӻqcn;>yr#UðnF<"l`psqn3sЭo%NW:)6vw)xC7ŝyqBHbsC[϶C=*FЦ]4z�6azts~f
    4qh3M0
    b&vlG%ƥ2	vg8FoYp%Αf\�ܺ=m^	.Co1c�09s6psS&ns0#&.l&Ρ7b@+"b`�Gj(}\vg�^MoNЛp9,psM�xIo#n&t(pnAE?zFCo&&{W;Vڵ՞7�,MEF9P>o<)կR)-DQtǞ[}SٮB5{grmDi,kmgvBX
    c'2cd}D5AEx�m!6lfv覝mfBC7lƈM6&ЍmG<6#`767ih|5*7p"FA7+&x7yz-t#sh0+v\f^G.7w͕CF9@ӛfsI	gC7)+\&z+9Fp^\V[<F<ҿG<g'=py<p'{<7r�; 8IS1%p.tsl
    [$zc9-XRVƦ/Yrϭxe˭+^>厕˺V.f
    6v>)tbϡ{2ʐrsD*Jع/~^ؾW}0jqR
    :\fZS)eTJD;5hF:g(:NvPVr0݄iAUp3n>nQ'HꁶT#B6e폐j
    ~M
    g0
    ryh#nc6ͤ7)h/Hx̴AIfF-ػu+itȍ*݈޸r@7~S",x"<.7́6AXpqx<Г.
    n:gj5#a7+{LQC8B5	ynS!Tg�?@~kpO7F9x6G8۩cl@Wco~o1JNo?ԝؿزgO,{gϼlϞ{Vnܺ_y_W~9ѾSĞWWRTYT._ŸFS6¶*=AM~8w�Hx$1P?C=\D;m7
    xQ�wueD?;̌ѭMqơ͍n6Zm£rG'' B)t	n;rq76'ARo=x6MlxĊstؔ{Ln!fZЮo'7z]4k!F<�y1S87wȷ7en:q<oੈrY.'>'Oe-)B5oIo;.*^7l}Ï,ixSkLj&B7J?2o}٧>1nM1;S=S=St=W\MsO
    3KpJN?WCY9楜TR-޹O趯'͈k:mfDEib;3Nv¹-҄e\P
    7Jy]Ta6Upo{k<G&o
    966"l6drS<mm}t_g\6Krc&̉M[cd/78.n
    ]ݦ-݄S+1Sn2%;;,†/[Sᲈ0dBozB>]4	־73xa8=v[pQ0%hBºyo?izc;qzG7a3F0dip[0=xy>HHs٩�kj??]}Ç<g~XO;';cO?SO?O?mO>n5?j8}Ki?B'dOܚxΔ?r5Rӛ6~bL.^T69A;qM	\kcj"MьjElG�wLv=?zT6e@1S6mgC7&ߦ\nӶA6
    mrLб~9"K`6t73.w>mHC$	ts�09T)Ǜ{cCMŐ@ 1}04!tBj	fiu}{84fy*/$3CS_׷z=L]̑
    R�\GlG0.npÅDe�g??
    @?n-
    [Dk0vkn}pނ!#4EcH)عc{͟𽽏?LqÇ%;pEs=xn-rkWiDz:N'k"[)6\*i[_39ۉ#<
    <cu}9#ۘ˄VmDl4|
    ‰-D^7puS;'荆2PTL&Ѝ¦%#8n6mMo]o ڈcB7IըRg1:R7fxcSl%ӃI< 9`8=K6}$Etw}3YS1`Ǩ,f!kةyj9S*:<%bsF*+*[-ƮoF.S@\sw3-|&p\T5H�)=߷ٽGβ
    ?zV8?4ni&k h'89p֮_{gO'3yi|tG}tΉsN>69g9ǭհ'_tѢ'/vY:@Yxt1ʙdN#sz*~bOn'םmoh'l}ǵ?}w3~G7Qߦmͯ|Jo_YLvfoG5INz_vu7	zcTe7nC!2נz2Aong!mw7	3Qiu>q£h񴹦1d/7>@@hc&͜Dyy35QLM޸ͅnN4Cx
    pŘ-oH
    b(lTO?.ìoYu}3j7=[]
    2uH܎7/]629u
    qFf-yC64-8}Qyy)&�gO !u3ꏜYyM^߼K؋{{g/X6;xf=x}bN0quP~[c>Ɨ>ϭsoƛmi՟Wu_~__?ܢӑƯ\�R___]_]Ηt˗Q)_ܛ_/}g>GƎ:;;_9w_>ſ?ouX69!n.p'^8?p1m_[UJ|&<aa^=979$bsҴ4u9vfh/BC]N]m&=m2N#j$)Gλ%Hc]1fDK 6"6n<zmΘM̘LxF7_6WȔori/<j!Kt+ެoEW;
    -S!BX7MoNdᲡ71t]pd:?v2[:rE}ϵB9.,S뉟
    ts;o0>n̲{
    1JƏ^]
    }?ˬ#Zoچ/ɈZ"k_a>e/gS^)|ʛ>?'oogŤo/'I{rҾ`_[](ETdu<'(gʟJYSV9+Jߵ?CMkzԮmp٧wPp]cm7O=>7Tkng935kU:h-~'#Yf0+iK6Q"7[;L<b~M-6EorlsMMfn3&U2O\4sAloBMtt3Pۦi�18ӛ377YMt*{6N-ϮoO3,.ʔo-o[uo!^{Jj.@uQy]p&~K/cCO3"@${zMRa+jӈd�o]?w	t;tUjn;4njM#`:Q6n}Ɨ_\g7g7?//_S78'o~iG7M}7Mw䆛>+f٧oEĺ&i>ޗ>)gʟJYD*J߽=
    6yKyM'-qψۮRfynj-:EDm@MnXb	k|Ux2{q}6}$n3﷪~8QЖ%cu{bmblB71=nvh;CmIJBy6ާMG=6mtc"XpUjpkP[.nAMCXC7n&q)t3{|1.ZԳVacwbtfN/3]pO+¦w,eG;:h2uHo)@i.ehJpeGZ<pr"Z!S|\qkhggi>/_~]Ykw$۴sn_qZf+dF	Vlܡmdƻ꯾+_x+_X//~[_{_~aWk_
    7NY"}#"?}@Y}/l9o6~E%RT
    _o*daJ}󏽾6:qGmkoyc۹[_|敍g^Zw깵'xyRvڿaNAco )g3�񜑒[ޑ�ø15dQj00.ߪz[w:1TLb&X}䒦bBѹEH|,1AlGH>
    &eWu,6=mr65t!@L	DiZW)unV{	`z3'
    ެ]<+b4m|Z⡷,
    q
    >-[-`S1oj_nکeV~oE{eE]I1(jlpoGe"e|O=|{Vl"l3M{_\Q˗WٗW3{eK+k_߲W潯mٳ@w~B7QVrs<?TjVn
    '>o5}۾/Mݴyo޸7ݍe1]Ot';y߼;n|/}MTF^"K]RF�.lr|ݟ̦moQ~}mۍ7>/<>iß9{Ofa$	36~p	׍pz%sm8maSaQ ҵƑm>tckM"(&#hKحF$nmFTCG'gћ\Tm};	bK](,;e,l*1.5LC¦^ԂDXݲ=io|ްOCol߰So75UXor[A<-.i!͎|CW\--m1lǢpQ�p;pA}2YAN�xj;V_Yê0l;
    a2G6nl8;_6F[7fZmWw]۷}oߺn~PYz?w`;tڧSt]|colGVpk-/wc^~W7M@\sEN^7>[+`(37,7'Itm>t
    n19#aeːNLO)[-Ŗ7S)_AmqncЦLE0#8F69idT.i"=m~hSSseR'ۨ+tWX8ނ:v}X^{_-j~o8쩹b\pͥb-K/dyZue_B<U�W}2h308"2LdΙ=$C|}G78G؆lٿꏴ~?9u??`}n;}nq>7O:Q~|{?n{?~;~;;gpw
    #M>t}<7ʓr 2Qʿ۸ZM6o\wh;~o'ƟIgW~ǟ,ZiC%6(["r£9X=]`"$NpЭCiLܪ(0.h91T£V#uA¦hV^>0[M,q۰&z6mNyƐR	g64dWFR5g8kzQM@0MPȈn)y}Ԏ;*r>ˢ[&>
    ]rG7gnK=[кbSsX^?a:<:3=gKM7'~qɬ|]HŹClp턳Bu{w?�OY[Ém{lujӮ&aۖ]<Sov_?>w7;[vѾv"8x)W7{s{?t{޽mxGf?c3=d'~S6vYGC<f,gCf\WX#߼=ݨozr۬WqVo<-|rrnqtB7_Moy@>#Lń l_o_lS.1jA,$
    ط>;KnrB+fzGXT~5ul{Rhx)sqt=MpF񡺵9R
    㷝nmlPh�"m_lt\T޴.FoQI̹r%96j!S9jd~)~.dq̽jz#~�G/*tcR9+.$
    2[!t}LoyC<s:(kjˁdsGN}?șSNrӆ9?^<0|i:*HgşkOo\{fZfj״Ԯi̬d]o֓Yt,[({׭uSǟ>~x &	_mN~~S?OV_CS򪕯/1nҵl'i飯VSP.7ZTbMWҫhi3M"N϶Amv(ukz4w_$#2B|#^Nb7MrEKK΋#Nit0!`^K׷U2!-K
    ӳ9{NZz^&+>hnv}d7]hoNsYe j8VrE
     '8?uƟoN9?e!Ff-ϸ7w}vAOίUnO7>^oߟG?O7?5HJVao6O't?|oSC}n'Q~$t#zkhعq+Wn\G<?э^5EXo^^eq/oiSkLhVaK
    X:(MHpMsG'ItSQ&Ɛ۴[[}ڈ.7n|v7	pME&:3vzsO<I'9f[,
    {wSZ4Y,zoz5]O3<coYӋ.0wsF1\p7c"꜑!/nz>x<aof}sM[HLgz%.hI}F9/==u{\Spe<,-h7\5o8"6|}#n#{#=)ǠSҋ'	ArB7CN-?Oxbgy726ʋE:iaڴ9l 9qRLmߙAmb]?&%<ʧ}ژv8a׍;m.to55!gV^pR
    x_(fa#_w}sy¦|s-]E	O_{hb<?e?ůe=fBoܳg}FNůo-`8W;�_&tu}!NЛm$u}sA!TN0p݄e5Z^rYO6rV]FG
    ԟ)nO1ˬϱjT0y7qSm7Ȭ
    u[+OvIolN渢bb],2rhXId8]ӳ6*eTebzyӹIՐR<⶟wqp3ynmAFƌڡMzaa-ڂB
    z,s%݂Qq/x{o/x7…<-{tsoQ^~O].\7CoսQ;-P7W﷈cҹiXWzE
    b8U1pʰbpOf{IқF76plG0Лћp,mAƎIoDݨo>8opv;c8?	N+Te4rLФ0Q9&%hc9l gqR>gI*lwkS6l*x?6UAkcHRowI5\3ˋu|-8喩[yC<y-z傧12fU:5Owr@7fosu:?-t]pӅh(̸vVFӐoJ>{H.?#5UE5.)|Y<g}%7zA3D7g\9B}o\0`qo26+iz3o	{d[+<D%RF4F;?vRى4@UR,-Ɛۨ!|6i3Ɠ1h6<oI:B68¨Oӭ@R3ՃIC+N_7?9&1͉tT\63B|\fY4]rNojzO�g*/~׼!rE]~S3ob>7z;F7.iF-뛳B{NHow1d1^1zs.,~z}n7SBOt:|2W<
    E0 tfߎeY`8al
    ڧޕ9L;6bGPwI!OS1bDl#4)g^&YCMGО6!5m&&sis;&)+%RJ{~gp
    yCPxLnoΌ!Pw6gAqK'99goG-
    f7؅]ߜufYw5xvz-ȒY&ŁqiapԻb}#Oue,B(f
    p{'U;pP\q]Lot\~`z]̈́6u@|32Hd8oL񓇫qc˽zLA5!$kqFPoFkDl|5!Ė%5mrڶR1"A;Ihcf&ЍA^4WP7g^7G?9C'
    Ff.`˼d-ioZ2BN8Yszy}EXnAV�gio6oHGz{E[p{VAtb}$ްbzaudo0z3pwy.#FBot6SHNV[ifn5ҵε6Wi8v\h8arxWA
    7ɕIt,LgnKD_.ƚ2BR!&M`i&m[97}r
    rY*GbZ0C9Oz¹Y*{pj-ET.xM7B-m0*M%\@c׷Hk*zK`׷pD|߬k1CP�no삋9&z)ȩ7xg䩫[ z	asLjRz.ޡ3t1u]ne]:6pӳ산y$&a3ޢ\x;㵳=c̺ZJI;}q$u5mLW9zk#g:V;d)Rcl|vc(;׆q͹i햑7jY ³+͕W\%-2*֩5Un\|g^mkW4c~u/;.V?izw淃:2x}G<	GJ&No0<o|?A(��P�
    D~CoF36(Ie˖QAlP�
    @(�@
    t2	Ϥ�-A(��
    t3.�2	Ϥ�
    (��R@7[&0�vEP�
    @(�LtKi2	Ϥ�
    O(��R�	C}
    �
    t"[(��@gdR�'P�
    @)	h`T VUt+l�P�
    0twV_hsun1| H�P$
    t)�ʇbk	Э$*
    P�
    @(@
    D@7{Hx46.@FW�gP�
    @R)ESAq5.O<Y(F_R(
    @(�^Q-	i}l?:$v[[?@(�@xw#+~5>[\{<ȡN*q)$ݢ`H	�9(#?>s87S._dzKl@`+�jFM]?)g֌RM#6'z (�@)siݒLo biS/RqIC(d.6'7ob3'y3aX"'"ˋdJ]pE
    nP%	Z&JP?.y8"<jں7	tK,yu5]Ofn';۬2S7^Tݔ^ZP^PaOr5Be
    @(O.d$=8;Bc٦kPam!56j[q$
    u;S	vD!HL̮m͒r9[.z$YKfU' -d.`Uv5#u{~N>cAhԏnaU*96!ʝ4P�
    @+'{q;эZ職6e-~zmZ+݈@7YcC8ЉA-y3DA7[pX6Ftb!7W7qL$2- ܩ|Ey2$miFTOA>tЄ(
    P�
    $]5?/mž7ghz`bqȂve,Q'0-+nuܖqvfwŜZClA/4DF7G3L$Hו	x~X@04{wnѪDT#zE*"%T`ǝ+?\q
    C83JmDoPbᖑDADoQJ4z˖\5LAs[ƁtVCܡQ3vE]7{O5W\qnxz@ˏݔ7%ћG/_;Y>G+G
    
    lN@Aio/l.H�(>{ُ۞]5?G/p2a
    ?wTܖs"o3pu#Ǜg?	c_zʧquLMP{0[2J	E7s{ҌR|`s>g`O�H+🯜gJ;ůZq-݌nnnSύl|iYuS)[^eSNx_71q	Sr[;@Zx_ӕӏҿů@Bi^0'`B#=#4nǯ|j/
    ?bb_* korݜz{
    y\(�ңOdůozb&,^tˇpnB݊kD(��T@Ln	VΛP�
    @rP3%o^7z*Gp\l%(mP�
    @(0|)Lύ]	tJIS�薰ՁP�
    @Q 9
    4BJl}n@K�P a
    dB7m
    ]-v:P�
    @(P>
    DDa[(-P�
    @)uc˘rsO¼nȺuK81%z@P�
    攼y.JAEn@K�P a
    ptPߩ>aC@RtKm@(�@( t?yݼ覣%\![<!(��H&3%@Rr&Ѝ�P�
    ī@"ѭf-i5MDP'8knؠ�P�
    @`6xa~ag.~|T>>2H1nsx6F;
    ".	s:P�
    @(P>
    Ht;ӿOšUn@(��
    $B͉
    US
    ڒUWS�EM!
    V	9��[}g$4`Jूgj!a=u_Nt͌@(�@%(nKtcVjtsKZ$1vaAB3E_JxvP�
    @(P;3ovtkl)BX7d.pẢjnK[Inf
    �<motkl*Mp/3Æn<";g+
    V	9�壀<(lA* cZ73f*hH3,,>G0-Lu+'Z�	S IJCB.٣SO]?&Y5*\B鈳BLuYC蟱f2^I	C(
    ݆1%ϔjz[1,89`@H)K͊nٽ;2ZHQªJŝS"l9. t[P
    wk{+|sp宀@ۄMqneTEjD6覼KߎJnWw2^?l_2>Z)4)MP�
    Snѭ{".ŤY,-܌ zoǀog.<k	v/xLS<>6K:H++=>Nˉ
    "ԭO
    yU2E~'UMBunTϬI'o}Lq<0eJsܮw'󅄲��CiL2EafbAݥ١=ޅm2߂odevZy9e:{G7dPmU\9+p3HQT%\B[j嫎u~qUlMt{ЬEǫIfsT`G(�Yn
    gsLeݬ)B/o醵f7hX'jXI7dЀ'T	+c8D=tb0DY@`zKȚ"=cd�q?>x%#BIG$P
    6tAaBtvYMn<эG\('[kDJ}nAtp*AĖr,![xx-g`P�
    D覹vndћ
    Io'<CpĖDbY߸NSKzj}ZNͽ &¤0Rnԗ̏G`QVY͘mH?>2	݌PJeH@y+`EK6^̂Mkh5,8m¿ubaQ9!0[majTJJO6RWO=SEV "NG,uzZ<s~>Aػ!2ƀ#}G5P�
    C9&-�g
    |ه-Y4,q~
    duKǝRZZ@Zsgʵp#k(�ҫ3%B7Ӵ׋\e
    8!.݌n!k]|)!LDPNz4F6P�
    A0m:@C.ۡsd4o*eV$BO
    7ᾎXG4, '=Y1
    ג~A~P !
    )-M#L؍L_[3GYNL8K˘+9zۚy|}r$tKj@(�@)4!68_	b$:hqS'\zo%9}Rl"e ߓ-P�
    @(@F\P9[4Ef%OçMO;x7XfVط*ݬ%ه}݀n	Q
    (��(?tv׭eXʛyr8MJe;hg,o5e=[=)"(��H"`*(-)h28lCQzPiuaOr0սRbYV薐ՀP�
    @S@u%sMmIyM?X1lw35c΄#^w#1G;1r.:Z�@QTIZ$5zP.:o_,=JHY-svH�W$S~ʀB7׍CԮa
    t+t+(
    @(lnqA6[d薬P�
    $@[`~L6mI떀kUp�jP�
    @@э@7|+ t^޾v65lP�
    @(P<n1Ƈ)F~|uXXjrhh$6	)}U~ ]DeeuJVW9@(��-Ft^Ffnf}oe0kmmrc�iBʐ>yIB7
    ϋӡ�(�t+1zUW_SEўrB3O_xҥ6I'8'WtMb-8-=􍌂2Y0Tf؜8y,̈́/(c]S,/j8
    @(Fnr*˾n$r
    ̯�)CPݨX#H.'G]YmoYe<j덀iNP�ŋn"TJݨKu n&`Jhrʕڧ7,9;Ua_B鈳[!R&)f2$2IDre]gvmnLe�N(@>
    �
    na
    n!*]Yr.ɥ˗ǥZLz_;k]uC*O52K$ݘgM
    UdC'I++tgn!@	S�Vt;xuG-FFvpԪo>e߮`q%O52K$8Q3bN-!69ݘ̈́nS0MػՁP 1
    �bF-L׍;ކ{/׍x
    0k$r
    1~S|US6-}7D6.T'seodHѨK9u}
    54T[WtYLIэ;Cf2,o&jNa*<<mIP�
    @[C^tэx+'tg4LA~0ƌo4U";o,<ْ5?J&vto*o	j+gLi81*7_-P�
    �-~t
    SS9R(RDF3Vt_E$.?8-%d	DRFyM|d	"7ߑqN1εU2Yfts[,Od�(@ѭeƖ SSIncQ枥gVؔVO+iS̺ʝ-t,#yЩJL$euHM[	(
    @(@MFKv#md	hAVIr
    n|ώʃu]:8e~]oTqt,ONbɟ%)\[QaqtL2-2P�
    @(�tTԃni#L ###Vdwlu+>ڝUj?[J(;_4;'<}Gu
    Yc,3z*I�ݒC=�e�-ftm>a]	c6\>
    wvv
    2EF7aP�
    @(P	
    .MAKnk9@FΟ(2UC(��VnbZuQB7V&9sd@ylnHRC}
    lWP�
    @(P
    Ѥ<T*u㾷raJ.[[Zrb&t�U@&|F9}:ua3 M6^P�
    ]nl}yxLFDش\)R�C(�@bFvS=´mTy݀n	50(��C骘׍
    $KAi0aZЭЕAP�
    @(OEH-CauSK^n*F7Lp駢@TL$P 7.^AݣX>Ch)
    ł:`*ѭmuc7{+StV~FIC9gXLnigf^%D]KV!_(�@e+�trˇ%*%0=>BV^(X%Mi`W][=b=YwmOm|,xQ�P2jjj̙3[҄@-x\ԅn۔閴z_*v%楽KZ?{bݽ3
    @(�2+#-X𩧞[҄!}]K3ѣ*(`9%hq$%bb&eB	ݼCM|j*讧_SS#ùtyfIn-\/iT:)�Q Ft5k|2uf*@2݆.hv}MM{Gdy_�mmX[Ϳns
    *߅ͬ8)(aTf0(
    }8jflLB桉\�U Ft !9�mVH'vQS0=v~ymDonFӏkc-
    |c#
    ES̜2
    ێ;FGG3>/:ѳمs@_46)qMF(�@IB1WF&W\'N%md4 ymusX覾t\˄nLnŌȕ٣�/-_|ŊOm'Ofbi/o}trft3й'mxI(
    @(PhF~#??6-"6вʌnr7?ό¦}0կck&ZwnF1f1`筶&֜oэ?|[[[H6ϽnyⶋN}hO4?MOW%7l
    r
    'B(�Ң)Soiznp
    6nvtNonהpn|p3$P9G3`U@dĀjB0k>!;QMFäO<T_;qrg~n#Ѝv&ڏ~fR'$/
    ㇴ6s
    'B(�Rޗ??.-
    Q|ڷʻiVZ)X}__cSN26R&(`JMLOp2ET&)d!Ѝ$͛ocͬk&gM^hǎ~cg?)~—7v]Н2'Fu�d<Fv뭷<d/oiӦ{'	BLCl#%pt;&Q6v'':F*Fͪ@7i½nTC><o"p�GCULӬ$PLz<[tU
    j=A
    O_ʪ3y \vc\ЭLn"4#vtMً͜mM6"6J@;߲Ԧ5"йw؂g\jL"B(
    @(NBBo܅͟SWߊd\Qen#Q62)z-yxqj[.̬Pgz྿d~7(��Gxm||tp"+{^WUumg5)	FPnu[Ip@|.:7^t8[BUB(�R vtk*U|('9,ptC9mו^I'Njn+'/9@(�*Hэf(tBF![[N}\CxS]c:^O+DSsU ik;pP�
    Xhpo=,TM*NfV2ASX\ṫnDoƀn#)�t$A(�ҩ@:&!&=;nPfnt;5
    [@t	�(n{}7uo=߿Vġ=ƿtyȷtM0eեulsyt{b]϶rI'W:VF/!ZrlEz(���q-NH&ft	8{z{ϟ8{܁W^n+)OL`TE73t6gJe
    {zF5)k_P, t{g4
    
    
    =rٓ'O7<]yz 6MF𡛊&ݜEu_P%JKzt$g宗ƛ6.i`uN81k�݄L;};qu|nэrhfS	
    ^:gtt12xL0r3'yh:b+Wd|YzSSƖ{~~#*djX)%	22`z3ن6Geͱq8
    @W@uu8yȑ㍍kܵknfjii MHA]nɺFiJ99F7pIG7{6J6(H$i.?,	,Mbf\2gg59s[SğS.y^2tp"BMVo6�Zm…O>$u#6S҄!}6vY"^m.t;=Ƭg'f_r@:Y͗IWWt=<=pfw%Qt۾hDzfYg}طx%D}�Sэ'E
    &]&bFʆ0J*tSY8YYF
    c{gglU t{Jo?y7cM~y8}3 ;3ӋXF/
    @(PE7+`nl"(JFaR'`Js=’n%a	xuĀ-J1= eotK-CրiEw)g>)R
    ^7ѼtbqŋhdC'u[bF!:5~t'^_C(�T�VZ覹͋nRn	ico\>	~W5).sRyXhct=Bnnt['Mx?F;hgbGn
    5r|dt(�@�țv{n-چ+g!*U%^;#̺fqD%x衝byagJpgF%)C(bnI@7ӹBqm@gŭzfr[8QZo_vn265W�n;npNSw!PP
    �ݒnnn(<cD7@6p;{@[CFF',^(d3K[E	‡)k}dl@(��Э6~
    U%IEbD{m
    
    u�KgSb.R9H�(@$&\l]I[߸6[io^Zt-[2ǝ}^2GP�
    @(/̙3y MHyZƹ] s[;G7|BSH
    ʚ$
    DTtq薏ސj>y\(�@*,\SOuvv~ͭ�iBʐ>yhO@0[*$T2iMP(�@(#њݗ/_V4!e0p?6Mq}1r
    W6WR8n9C(�J@FQBr6۬
    2FHF`@?9@.)@*O݃}7Nà�Ht#L7uJfvʕ!l6Ht;?pQCL݌G%0nN2!/QEJhHm޸	Vnd.僯ʎJ;`3y:.jxGxҽn|kFrXA!r^դL-^{o쓾1VndNñ\;
    `)	ݤgk)d[sj�[@7s(Fᡡ=)49djשׁ^sv\(ݨ?~jc磑0dN]+S*`*lFn2ASuG%xrr3'ǑwFS$r#lkbZ)tUz?'K
    ^M#b=tSߴUMNTfsu&UUwF;E7)4)"DY2GOpQ
    
    vE_uoVWMvhtlJ"n9rn&t9ps+`%}IbsM):ߛeu9iszrF3g*2'̿[DǰoAG^%n6zR]U:G<ME*(*!ZDטW)won^n?#;:ۊ;ߣ?{>	v?7sl瓏0txE@:ƕ%{i}\Ҍ42=T`M{2KG,566>2mdj>[Ukw&,1;.7z٫'dFJAu8SQ;LsuV_p܊loFm>]mWAF^P`JK1RҟeJU~
    ?ya__padQjLOazc@=cGgS?uѝ+:̂P
    y2Kڛ3?g,ߛ{*逸O6_3Ձnct
    ^vaj[‡)[x0Ü,QEȋ&ej҈T]tn-.u,{M0G[O׫|Τe[sl2YM?R:XO_vR+W>|\"z>*Eht2XTSa#JX
    f}<uV)U0:˽:V4vO;ۋwT]7w>xў;xmscO;yq
    Q32vYBwNCzXDMy2Q9{OٗLP_7nCu]Bc	ij5*.iLkT3̿e^7V]ɍL%9/Wމ̽jw(앍qqՋh>od"USꮪ;^j飯LϡǛ)O颞f&jIojTVi룻BI3+o9+OF L:2`=҉/$az~S\uR@O3-vgƎnMU|GVypRl`vy
    e"RpۓK
    lV)h_ꩼ(ȩ5߹MMэMnW>n].&@ԇP0pҷ8nw	ĕgiG3|>+n[^iwMoY;;{_T+i^{>+h|짋zOҧlJn~S魳E
    Yt`JW3+GAa9OdUb^1mϏȸB@=cGζIܪ>ӧ/gqt׮N%2ug|a:(Ԓҵ/5SZr9=y24yMswasc[)$ݨibez(=mOGdNl4=H/u}UW3jڃu<ggvzU8s_ՁRN:<]$HpZa&ordWO*K5JP$V-d򥴷ȦK)~@=ұK5^`UDVփΕ8	W5ng[^�qc{
    ϙny`Le~O< O>NiUNũf䦿LGo"S3>Z#cqR&$`n]Ru+eCAސ'Ѝ_Ȃzʷ
    Nb&M5H㶦';n^߾i-VU<WӎT)N7kvMT%I6*tYt0dl]	hf@婞skO\%tGk/c4^ebo&f5WUG{M]t;by6Fɤv#k1B9#qrDޜA73pt0=x^(-zZ&tʨ(Oܦ?j#
    﫮})bb$)m}?t%yoVu۳/&2e.t#bt0=?q<@
    4͙<mΎel+Y[\nE{ċnf=0uwj\{O.iLHTsЭgBEa@i/(-Fà�(v;,aP2
    u_o䲶+UW_SEjb-aEAH=Ώv@ng#<$EFl6Ha
    9^KW>ima;:<~	#Lc+ Tۦ=k5u0gXi8
    @D)@72uW5Mf͚BJ5`s+@2F.\9?p|f'6rc]ƀni_Te~og(P 
    ЍL3ԉ:IcD>mmmaf*@2h=]X5	[ܩC@2
    ܌T[5@P�
    @U Ft#.yɷDAl	)6:B0v{@7&f=CW$\ZyNagikqy㨙84I:*aJn\
    h(�@+/YC`5[no	ٜxta2$j<ZɟB3?e䲠P�
    @P�VZ}Vv%楽KZ?{bݽ%j�H@t1&2yjjeT$32,%_8+اiTBpDo-Uu \P2%R�t#z#;tt/){`&©]ltJ-νn|4[2tp"ЍcbM55tzT	E2lP�
    @JR�dtƎ3nnf&v^֞ݐc)^t۱c(틦Ngvz6W,}s_:8c e�
    {ƈn"X_+^t[|+hr͟<eot}Yx\	H@Y*�tra[ǐ0VEԺL3ݺy0Dsh^:1|ŅdSuf2ڡOo~@t`1cWPL/a4
    @0EM[ٰi0S҄	-xrtLu_7?H;LA
    D,bO^'OeN\41x@teu~7vQظ=.K
    @(RbD6n~ΡᏱ MHǺBȼn)B^YB)1o޼~jkf]38koEs<v[>3IatjyE�1ۛkG\B}
    &t=W
    n}}}^7j[sw7
    @FFF
    -*pߪw)O'(ŸPIS Ft!9�mVH'[tħL=4ivE'vtM+~f^Lܶn
    q%oYӺ!x	7/`Eh<�Э8Inww-S]{fhkh3=mp_.f<(��`
    �ݒn#tý[y݂-[v
    Dj(�@%+�tU_mHL:_rP�
    T)D?l(z[Jxl#+W]}M%|!cФ[4C�Q ̶Rr7:Y/e>?
    	zsj'`
    tKMUJP�
    @)ntc3~snfVCfG77aP۠r@(�Lҍn&}l{FQ}ˆ"ћt3$%~Ȕv-^[U@P�
    @2U 9e@܁י#̗ /]6fF7xDo}Itf:mJng~lFà�U ƃ̭qqL'H 7)hݰ0Qq_{i%A7r]zlyioXw鄣$:@(�Ү@эÛ3�6wI,)K3T&Ù8rsιRvJHKncLo	WAMUj@(P2Rn|7w:`A?AmӁMG7ZgX][AI*r8R
    .
    }8j)fynewAP�
    d@э{!Q9lAU~L&)0qt76zifi:*ˍQ6Mj[8'm
    ċnWSؾhDzfYg}77݁n�tRnYH	!4	ߛήI�.}iǚLĿAS叫{2Njn˗/'31ִӷ>:9uoD#m*2yWN9@(�J@XIM!29Mt7*8GQ[uإ
    RjϷ(yuK']vLF;t|]%byU9ݜ?#8[.7*^ԡ[)ZptسMSntO9L/bO1bG7VoooMMɓ'k'N.< Ѝv`Yя"'-qb�
    \
     ϥ\�H@`Ft֘VtbȄ,)i!Ѝ*1o޼~k̺fqD%x衝bya/nwggt$(�ҩ@+WRT
    iBʐ>&٥nm\^7٦OGd4T9',{ݨDo}x/DF;7wq+�
    E7-돹G3Ӝ @ު##l�l	)CnDoҏn".G"Ďn===V;{@[CFF	h[νW7lYeTW;Pk@(PDbD7⒵7oi0S҄s!?-!^2B"^ו]Te5LO+U>J :PP
    ċnV:0tFaSoVk|"$Fоn1lC["rP�
    N[iR-dހn+%x-D4[%Xs
    o.PQ
    @(PDn	B7No@"^eZTЭLeF�Q�,t;t+͍PVDc�nnI@EnGU�薯8
    @(`Lt#jk;rOӊ8ԚGԔxʦt׍M[JэOZg,T9IE(!Zrb6eA(�*G/|nڴ|͙#쩚k45Mt^t6m	o!\"ހpls`M_-^R2+{{p&P�
    
    xЭeRۻᄏg[M림nbtʓ|+-p"
    E7r]zlyioXw鄣}<{�P 0-Eə{ݚL^3Ɖ[̘7Xԝ^ˌEV}rȳ|xރfGlu.~ZKxՇ[z3g?l"ιɎ�Q�(U4
    zX1JjAi+Z%SOnή*aZJκ|t?\^7\JsEPklΏЇnn!k]'C9�T�aY
    t怩JPbRPMb4oUF24^0vA^hy*O8-l\.Wc*E)l_4ug=,ֳbi[�wЩ|P�
    F¥vMXnn5lNEp~uvE*u@<u֊nĎnw=Eċn˗/'31ִӷ>:9KrW']	P�
    ˢ{4zn$*AU3d,>-CM0 Q%w[rE?cCB	ϷyuK']vLF;t|]nJV�4n~x$P2#l Զk׮F0a!t;3P/CCno}Q�Z`4	`.2;XiH`�FN(t|BTKݡa1a?[h՛Y.ϡэ*[SSsɠ
    ډ&<tn31@~h^7	&8
    @(P6
     `ruV٠[АB1o޼~Fkf]38koEs<vN0Zޗǩt+mP@
    `! ,|LtLt}"\({ݨDo}x/DF;7wq+�{Hu>[.;΁PB>gΜ
    &2ۮo
    y}RWuf@ӓt9{1qۚ5mDlvei`ӌFG
    ΅P�
    \m…O=Tgg
    &㧷v]dހn)׊W-Sݼ{fhkh3=mp_xB$(�@9*#͚5]|y[҄!}rF7Fo@rҦx-nA-׭ : S(�@Y*#QM6t+˛(qott˿��E+Wa)@�**qKn%C(�K-eЭdP�
    @6ͦ@v<FuW@R(�*PxэOwYZINNy)bǾ2	Ii3$2QuԒߓ2yLnƼ.m_*{j	mג뵥W@
    @(dJnL
    RAf>T\ž
    2EbcJ@79V	[z0B3?eV1A
    @("bG7Z0ӶΪ)kM>g;Wس/z>%s함 tsY{t#g宗ƛ6.i`uN8/Հ"�e@Fg8չS{[U۝+s<**v9]||~xљgRY�^>Z,yX-[\ݛݑF 0%k*9{+\6w{In-ހes!P�
    Vxm||t;nwҳ#bo몪MYoAv8|OJޚ- eʾ?`jk׌CΉscWڧծ/+#Mao^2tp"ԀnEP e@֔y{Ic{Iړʂo&wJ$7QmĢ3ПMjjJn'U5
    Aspи4Ϩ@[/:ѳمs@_4ns%P�
    Tdn[t[[;ʡjq)ouf>BJ@7e,'!|s39DE7F"tj8]^>q_	8|QۮNjn˗/'31ִӷ>:9
    9Qp4C(�@666v<[ttjsȖk&ož<]s7N׻퉢SEZ+fo?)S)S6£ųH켬9D
    (c4ur.Iwf>uh	-V^7ѼtbqŋhdC'uQM		lJP�
    Rňmx@FKIX	$9ɍbnY:C]oP3	z&,>AWMLK@V8L2뷉觠555O
    Eю@7ڙl k?Q$ts~31e;T
    @(;fSn_p䯡̡FYwtt̛7Z5h5ѷ{ɢ9;zhX{^FoA]�4�A(P
    ċncڴ,J
    )So[hpMzx܇Mds}7ѿ_KSwظ'mM~
    @(hbGl
    �2@EM׍*MWً͜mM6"6J@;߲qOfsA'mMUP�
    ZxmddMR^T)i|e螙5LOK+P y
    Ĉnfjii
    &3۾zWsښQ]BQ"FL}'#*�H1…|I@<LLHR%.(Zŋn#a/9@(�*Fэ'E
    &Hۚ[ܕ64io{p>P�
    
    ċnV:}WM]5[q΍�-PH�H@ҒettKU:J$<P�
    C[Ѝo~[J-	0]Hۮ%k˱8
    @(�B�%:`j.TSÖamO5|̱18
    @(�
    �nkڤ%
    BYɴ�%A7r]zlyioXw鄣JmP�
    Z[m2D_ܻܻSK΋8ղE͹}KABpq?!W~%2sV9QHAR(�R�
    e*K~^mc.W\RTęl^eOmÉPD7K=OkDPVaMl-
    P`b"^t̙I<
    &Lмn a
    kZ)f*oR7Y&w9.Md
    ̗ τ!+^tES'z3pb=+ƺY$OFt[ԋ
    �(1ۂzΏ MHǺCr^7+1;Ց$Q9B{@ˣamL5-=~Nh'nu}3n9;o_εG˿*|}Ǵu>:tebxYi"cD1eyvv[UYC(P4bD7Z3
    &L݈޸&Цm8k֨W~cy^Kyy_qU[[#Ŏnt>[(^7ѼtbqŋhdC'u9]=)fzy}NW5*:}|3\FO9n{JUWkUP@FQBr6۬
    2O-fB>ifԌN#&="c"ȿ;9KQ'Ok'N.< Ѝv`Yя2T]mWEvMkQu!`ds9篭jiv-@ݮ\2ͦ�)S껠*_t#:::͛okͬk&gM^hǎ)֞Fч($nA09m3GiV.DNt*rўV vt+Ėt/{ݨDo}x/DF;7wq+�a[#ɉyLx#`ĝlSO9i]4XKA(PbGl6nz]ѭ'c_7]{g/6sb5ukۈ(\R[._F|QuwN[]m prpfmvNq
    ;s@nv	(suz̾nF59!V	ц^Ip@(P&
    ċn8?6EX}s"&Zyι*C"mHkL `Z&L;Eaegf:F�%/ j�HA7m�뮕,:3)9fϾRQ;ynIʭn[y݂D[hP nbG7i3J՝+2~Ϊ)D9˝2yr)ٝtE~
    ċn+-/�9@(�*Iэzd8YNA"0%ˡN`E;ygY;dj4ЭR5iVj=P>POgܶͽx2D&>xGU//T"!}DO)9xS[+`	61wJ޷2%oYo-?!��V vtkʸप_pp{դijrf&NBu'%Or]
    f	"7s5oIj
    ǒ�-I�Yэ[ϴ0XmN>n%:LGqVtN>c͓҉LW�b&t]1_]	mג뵕hP
    ċnccc#l[TU599"QGY
    @rM%SﲢE*Ωfmݙ60{ڴTG05icެ3\FdW*t[?Se#/�(%A7Ib:<q3,T6Ata)eBK>Y"wOJ9MnUL
    ݈z<SB7iFU(}o%A7r]zlyioXw鄣xܠ�@vMrG7&gAz`Τ|6x: -P]	̩$Vjumb>܂͵\HCigRC(P
    ċn3mHn=)!`^e:Fj^B*mK75!9a]msd6Dereb٦/G8@);fSq126uk?n9OJ2%\ngVq5틦Ngvz6W,Mؖ-eh1@622҈ͦ�)S^7yHBZl M[wemݖ/_e
    m'Ofbi/o}trVp	1e�H1۬YZZZhŨlnHRm)ytB(~L
    sgtqr?WbG-9yuK']vLF;t|]qUdKP .bD>x'6S҄!}0w3}n} k_&4zҡ[S vt0_;qrg~n#Ѝv&ڏ~9׋-ia6mq_r ^
    @d*#<[ 6S҄s)[ѯnPFutt̛7ZYL4Κ۽d=S=/VMs_j2g7HPB(�
    @fQ�5nn½nT#><o"p�GFB7
    rHe
    h\ 9W8	
    @t(�t+-YݲOK10bG}tXًԭ!n#bs-Ka0qvܹg�Dl,P 5
    �݀nXQш
    ĎnQF3F[CCi#u[dP�
    @(`U�\tnoD/+I
    ċnu@[nIuP�
    $U-&ꕫ[pL/9@(�*BЭ".jdЭGc�V�t+5�Э؊<(�@�Nwx"^(*
    �ˡP�
    @
    �݀n.(I|%D9Dil˖N<sK8z	mג,NP�
    @n@8nsiZ3:DOGUYRKS*t[?S/׏|��
    -`=eU[A_vv%楽KZ?{bݽP�%ݶ+W]}M-}XXmy6G^	M|/`[HyM
    ȝ^OϾ੿yW	k)Z|SoIɴG~Pl>܂Q^y/a(w^GB(�@1�%
    ݈RntʗH+٤1MOV\3Ú.^,ĕ$#v+R2'ɒU.|jiu8uЇ񖭟2 =%d?
    @(dn@XO~:~A)q̓ni*U($F{(k)fG:rF
    ܡr'"}ԉ.X	bA7Q5C:(�@j�bX՛Ntb<"	^xqn&֩amQ06Do&ƚqG'gnNؓ~͵CB,g翅/X fx�U/d�622288uC64ܻwuOwwwh,)-M4Sٞ1-Ko-S2"7N/{=j6RN9j;> QTRW
    B)3TZMo~)bЍn-䉹yuK']vLF;t|]
    :ĕ.K#|,i*S9i`鎵u�Ƌ
    @(FGGuuuwttw:tXmo]|}>�+PlFg7Qy!c0U';D>j0vi <s_
    \Sp?tC?a>v&
     qFZԜ<y2k'N.< Ѝv`Yя@7I\A^7k:sh\6ϫ9F^P�
    Tn?KӧϜ<yɦO=zuu{_}UxABv*heRy}(`*1o޼~kf]38koEs<vN0Z>@Dmf:6bb@7Ex>$bkUP 
    ڵ荂FܶuVЭ5-;n}}}^7"[sw7
    @FFF
    #wmGWhvL9Ρ -`'Dj(�@n4=�>BnaЭ-;cG}tXًԭ!n#bs-K͘iu
    
     L#y?K:
    9r2t�0)d#"5P H[(mnތ_-S݌{fhkh3=mp_.0GP@q5)�tMtYa
    ċnuF}JP�ŋbt;f9VU'y)�tMןז5L
    qr
    $
    mrP�
    T@xQ,܀n~@ȊL�P�-lś薌jt+P�
    �ŋbЭ{lKc^khUW_SE
    ]NKԙe]]A/<&XUBt۵zmYɡ�P @la+nݜIR^sigUeFtSazHT~̚z>f$P�
    @@xQ,݌5iM*g/
    \^Yw|IЍm^"o^۸'k:h
    @(@la+nզ's"*ᬖhyts--y3-3Nj*]γJOmb>܂8<R	ܫVUJpjL_RB*�tŲM26Mg8V7Z6҅b2F6˛|uAbc,MUDA˝>E&=JnCNZYҿUrgkE"A_@\(
    $^[ozݺ77$w9RsMI"6fv|ottUGw:ZeV߹a"}ԉ.Xnkx?F(mz[~KX[(mnMuDxXk?m&t&\~<Pk'�RO=<
    E˗GYtkZ{Fw q8Ex[Rpd)<r׺cz5yf*,E2U,J_,|X),; =].a 2][o	ה~ט5)E@!uScX*$qy;B-9yuK']vLF;t|]flXGOdRR^>΅TvKoWq S3[db[J
    @�ŋbMFKufᗭ3US~p!
    RJ>>n̋n+V~{ݨ⽽555'Oj8hb3?@7F;
    dG?
    @&U??7p~th/w{z QdVgёT:Uyʣ+gn#�-[؊7DݛX_L{W\
    n$bGGǼyuD㬉KC;h5z[*n趀ȸSA{*2p:T=CR�/e@M8+Ic
    n}}}^7j)[sw7
    @FFF
    pmB#q-W|CF	lίR{s5Z<|.]IN
    @
    �ݲxӻn@gdzzz2u;{@[CFF	h[HW\;QzWuu{ߘ蠇8$OS0FA7\km}d�+P�
    V[(mnF7{-7Sb*;Ea[m
    
    u�K%F'T
    @(JnVum: (Y"$FL}ݒ!j�Htm###CCC-@mydAMS1t뢾nۀnSTx-ixGKAP�
    @
    Qnm^{ӟ?y?)/	HtcS[wmfЭEP�
    @
    Su[W_}u+QjuT^d�(n"f:k֬+Wn#Ȁ׭mM[ؕa_NwP^.(=
    �R3P�
    @Imj4!V#b{74
    m6q72/	K2Wq&u,]Օ~V	mגUπC(�
    @7i``jzaBǼn81xRnΚtW<(-[T~6x><d�lMCC66[&nn:6'cNt3�vkZ~gE&7sʾ'o}IЍm^"o^۸'k:h?!(��F64flKoF5MoF4'nd.}4%{ԺTka"~sOŒl{NT}mb>܂-sݾ/sZ}A(PY
    tSJ	_t+�h<#ߛ$%tTN$㉓K
    .
    tskta]_bM I
    XY2KnCNZd	<~A�Ht;;׼&mߙptK
    $8oI6X}
    ^7:±]\ؑOys\x-j
    MY9lXE=#ieL�t‰P�
    $Bnd77VS(j7;$"	^mt\k˛Z9;UM#vs.lߎnk$^tKă
    P�
    @�Ŏn/&[d#L8n:Hg̈j>ө?jeSrvVF73
    @(�*Aإ^7=njnhqq&U;�Ai`]нch5̘i8ࢣ[~h>P�
    @lnoz2hBѭ>l0:	}P�
    @(�"*эM�-nQiC2(��*A77-*e{"=P�
    @
    ~kO0[ԂI[ɠ�P�
    d݈u}�-�P�
    DT�/|@A(��VL^+�t>Dz(��{FϋRBsT t[5.Gp3$ۿ`j̢f
    @(�@^
    t[[תG*�r4q*+:TPl@$P�
    @(݈ބ%ݼ!�R@68|`E`7[Ld�EWn*ƚhiQlPs])L*pnrEv&`we5cDu|g̊ڌ-بSGԕ:_џS(
    @(�݆ˍ{Jnbw{`y"]^7fѪƘLAMtSG3Lr%R*tdnxB(�@ tk:?fw0-1)fsj˼;
    2WЍӗ�~7~f	s?[Jwa)Kwd(��݈8^+w{Cl&qPe-T;i~
    &rA7}
    >(��Ht#z+1FʣfR鐤JGi{h`T&sh/JTNm)0MP�
    IC7#*kWJLfLרw@)wp`WãmP�
    UnDukԅ/in>ܳ	gZa�EU@ۛΑ�0%tSvkw)v s@٠;EAQP�
    @&	s[mC"[bKA7<.�P�
    $M[^
    $	ݒvǡ>P�
    @(�R@7yrP�M�P�
    +a)-p)@7<s�P�
    H=LA[nWd�Pn@�dP�
    @(P 0hů@tt;zw?\z=
    @(��(@HzQz? ;�P�
    @lj>tõQpB7M\
    @(�@WdͿBBXô[@T?)Py(��H@8ge�-!<�V�5�IC(�@BH?&SS+VӔpସ�%G5�P 
    $0flLt"xcbIC(�@BFaZT襫R)y)8.7ws{ݔ
    R)�tK=j@(�@E5x!pt Jm\[<P�
    $DzBJKm@P�
    _Ǧ6XsyݪpuK-P�
    @+
    ZK-7ܼVnQ(��H@B
    (�tK-P�
    @+uAghDb
    nYnQ(��H9[q@(�@��Э;j��W�V$pA1@?.(��(@70U�vG
    �P 
    �݊.(Z��W�*@P�
    _ t;1_3%^ZrUa_e*L)})lBZOq@(�@A8݌PK8B-%ذc?Э;j��W�qMr
    tǹq@(�@Hqͫ|u-%0g>4y̅hzxZ_VΫ%k.[%:A)<V5P�
    @+n3) al>jeILffuE6c쥣:<Y#xn\P�
    @(PzRnvy^ӕ-B-zdI P}&})	t+@(�@H?jg$GQ::_[X*q@(�@(t3N8723gN'9u/4~ɄN\tz9Rs6Э;j��W f
    tPS0҃sȬ|&,]1i8Tl/T@XW~q@(�@HgG)`PȪ]@P�
    _
    G|t=%-�
    @(�J�-"�"
    V5P�
    @+�t˗Hp~Dn\P�
    @(PzF+t*;50*Y[ow�
    @(�ү@F&�V4Uہn\P�
    @(PznY�Э;j��W�;̬�q@(�@
    zD}ݲMt+@(�@݈ޘ07GZ��W�z$JKnQ(��H@O	tK-P�
    @+>tS;̻/Iz)�JP�
    @(~҇n
    bT7b7cWB!-�
    @(�J@
    qq3n8&7}(ASUvG
    �P 
    
    ݚjIP=ebٗ2i)Qq@(�@H	ȧa<jڪqS&QSvG
    �P 
    �xS=jhkĥ$5Z��W 	ktTCWdŝ7I�Э;j��W�
    ݺz/g@(��(|ރOu+nѭk��P�
    Xe&tkCpSeDG;(��EUu#tnMVoЭ71
    P�
    @JR�VpnA[�P
    �*
    d[Qob��ЭS�*B(�@QG놾nZq7VԛA(�@%)ࠛS;%Hk&`u	`*B(�@Qq{¥uIyV0Ҋ=c[Qob�@\Q[u5!b
    d@JzP�
    @(PT'^&kNy	XJu:Z^_5L0`lЭ71
    P�
    @JR@L#+10O:GߪD;e*,[%=CV(��(	E7MsƔMf7igl)gگ0*VsnEQP�
    TIE7nr
    xД Wx9@JzP�
    @(PTnS*rfS_2j
    nf8ҩt_0*ss*'A(��(	F7M3iL2Vx1SLmz$uJ@P�
    @("nEX�	:68h&BU�P�
    O[ȥ͘1j*;Nl}G&a`>WbJNCG{Π$(��M[sV
    ݌)�:j;1Nf:Mpb:6ޙ
    \lOd�ER�V�r,D7=NA{Ӭ^4wsMnp4,*l܊t(��*�tx*�YA7'@*.~_hV@}=c-'2P�
    @"+�t+�T|qf`E}^:KbΠܮ"r(
    @(�@>
    ݛ4wQYX -C
    #	ϓB(�@E1nހn)٠[.|�P 
    ܊_䠛g?7,j
    �@ƾn"`C%`ְ.@*Pp/mUsP 9V7�e�Αu{ۅm`UW_SE
    n0Wz<YR[=( (��Ha&)0k`V4t3W'eAV]MH9삾*@ߨP�
    Ѝ\ЭZZILDE٪*2RځbW�Vv
    4
    @(�(f
    AXbuc.4ܵf@
    JcAWbdh*�tKz@(�@)G1	݊n4je4W"슸jVv
    4
    @(�@(ѼnMMVĀ)gZrs:vQx1эRbP�
    @(�B0cbэA1j3G2D
    ^"[V薔bP(��S^9ފ0eA{~kBxtK޽A(�@*	 Ś$^P='|)k$C[*4P�
    $OЭ+ܼUD<"*�tK޽A(�@*66t2>SztcLUD@�JC(�@8%bcdTPnɻQ#(��H@2
    �Rx@�P y
    dnYTL0CT۪bwFP�
    @(�٢;7qP<MCUUz_05^tczqPÅnNABP�
    @(PF
    ;�EB1x~xэ̓'Q٠xK+EB(�@�}^-nǕ:Btg)tqy3~@Zyy
    ӅKxAyP�
    @(G7Z
    Yו[Xk!kCNQgSpg-tksY7]?:N]oo�@趏LO|[2ʽU6yM @lΔ6^t 9@e58=�Lb84[>{EP�
    @(9b[;kn@L89?ӗV&/tD7;#[0uC
    9B(�[ЭCp[	͡)LD>_5ƪ 3M,6s<e<r;1ŇarJ;q<
    DF)pL^~VT1`#[
    @(�R kt[MۙL=݂.ǝf.@n,/N̠CvHDFYG89@7	՛	=	ր1$@'KݓΕkN{ni
    ܔhbu2 q=ʐPRB{)|TW
    t0
    n{ݼ\̀)?=!\)up0WU݈vB(��Ȩ@.X^7^#EG7X0;-"@@"@(��@V߱lE
    j&'X`38itssG9ESGU\G҂E4ݢ܍H�P V߾l/3Wt]yn܊n^grPA`qyM`S3LA�˭Z]pu_a
    f�
    @(�@
    [:c+򘁰FiHυ-{gB(��0ݴ(^4Q?욦@7<v�P�
    Ģ@FFvs)(j'%ntr%<r,#*nm/$HzrmkhKpu@P�
    @t;&
    V^pUn:/e"Iaq+omjߊ$Tv',W׌~ġGqK
    @Vt;9:n@bM%3} ^x5Jn@hHU8A7jrV$0|tOųu%+U]⛹yȇ:;d3 U78[=)(ˋO3FRg�
    +{YMsōPjarfzހ]ذG_hA)�t+=TB
    n
    okFLoVxD9XގnY/d&qxnP|3'ʪbf$aYyz\yc+HTmflG7rVNr?D9kbB,>^|.EQRͪ0j3J~Q 6ԟ'Cરm,�VzEa|!9/f}3	.IܡԩG[3-`-a
    	4M ͤgPѻ{d@vD?咀6?k5 P$
    
    :aaZX)܋n_3C7y@f,X*<X<pt#F$UF&.
    V^CAY6ݢ_n_W?RfK9[KBP.`:0v-(}\@\Iv
    Jטbd&$VAd
    ,Ca~*[�b3fPfqeugu̯tꩾaYp?bP元�
    ͑/E+-ય&#Rj(<k>הsצߛh:(IG7cEQ0[+ntD[goBog&ox7f^*ٽIfnPb^^7Vpn±#'\Q6jĥ|"W^TǏfqY1 mQng14y.EFTk{G)8ڛŅ@e+49EK N_7mo15'͛#A
    v{t
    VlfٱSJGφƛwĩP�
    8
    n3V|,a wB΁i55by:π6tNqB)
    -#Gtw4B(nJ^uvxayX[F1g9%`*D[9?sP^^-n9^"PPWd6sl)NPT nG7sPRS|]l4ԙk	�2P�
    @T)03uK׍s=[	,H[,P�
    $W@tݔy)ƣ8v1ݒ{ˡfP�
    @(�Q YVS{>6:SCV]
    [-{p.P�
    @+nbABXz58L!y0e�EQ P�
    эfwsaj['6y
    �VA(�@Ȉna^7[)5FP�
    @(P
    }a
    r-jVA(�@B:8u `<J[nEQ P�
    @AP:t+Z�EWn]&oTk[om��-ISuP�
    @+n׍o/Re@(
    @(�S0t#zVZt_Zzsߨe(Lu
    @|~UP�
    @(Ptѭs~an8ƹ7%2]qlsi
    B-rM$OFP�
    @(P
    D@n1F]A²M`+<<
    
    @(�@N
    ݜ@ ,'ީK/I_SS4Dy/wF\d)WdBnFUUֆn5%̶ۃKt{$(��^ЭVFKY4^7Sd #|V[{n
    Uc>WjƐK֝S1[)Nj_$Cڲ
    br
    (��(nDonIpP\xK1˓.Ԃn
    A}毪%Cͅb<L�P�
    $+7a�W-Z6?g,j	`,]UW(��@эw&3_>a_j+i
    MӴlTH!a	zȩYL=A%+x*Q�P Rn枾LN@40:%gAU>vY6fSW9h<WwPQS'V�_P�
    T@"Y#
    �*Q�P *̐kD@x�s"(��xG2;90w||YeS +tؠ�P�
    @ <J0vkS{rnޒnٱRTVMA�(��)@5	VṔn݅H
    �P wJu׭�,"߀H�P ;S1C4w3n݅H
    �P ۘM0
    d7DB(��)ЭkS0ۀnɆd]P�
    @(�"+,t	Aj.0^17;XJ6@7 B(��Nd-[4K+2%@BP�
    @(Yu
    ]k?Mwt+RԵU0ݒiz�"߀H�P ;lvtוw^WR2^4pD/r^^~[S-֨eN%-�P�
    DV iMpa˺##.q$%:8牣%ft|"!P�
    @H)viis︒
    tsEi52C.;few"5P�
    @
    0ttdhSBNa&8l-D[v4Uj[	�P�
    d@э>/W4pi؉!S%QWxݲ"	[vw!RC(��@эYM@v:y	Ns)OTa
    V\"RH�P
    t,J0͎:
    V{yC(�@E+эMx%EP�UCP�
    @B*Э{a@(-
    �
    y"o(��h$5`)�t
    �T,u-	#Ly"o(��l|֍n`|׭*h=P�
    Pݔ
    /|[oYd
    �@-(rBw(Q[e?Uz(��(t#zs>nDo@ȂB[oYd
    �an6tSVtU*T|sa .K9/,YOqeYLsRO@~P�
    @(P@t_7Mo>[эњf%^/Jߔ
    LNƉ%[ʹٴ2ine5P�
    T:`u#nVh[]C	/\qe8&rE/K_[e?Uz(��(f_7+uJtWnϙ;5ӤqE9t*�jx>6ϲN:+GUN˩@Q*͂6V[YC(�@e+q"uPqc_njps*g4x(VaMUDtb8=n&Э*h=P�
    Pn=[y$)8eKm.uUUJw5ijjE7:}Džf8d_;Y~q!49�
    x"k(�R@MM͜9sfbS
    I/	B$wr'()(&t&`[]}&Wiu
    tKUPP
    ,X𩧞R MHPt
    (y&;fn1`j|0BL`z+sq[Xx
    DP�
    @)0k֬˗/cS
    	)c"QA:FW5s7|b\E}<#Gf@K[PP
    P(6	)c	$J"0�z _(�R�ȕ+W MB
    ZA݊2V-/T
    @B) ЭP6ߌږVq[SItEFP�
    _n
    dD7t+)TX@k(�bSЍ9ʻ	Zi|S]WS+S͐̀N4		Y֬uϢW:H"L+\[l|d@, ".h0h1YTNa<smKnMr]S"2+b9�݊,(+�tK-P 6:ۊ;#>Fng;WȡD}Js3[x3rZL$s30tr_Pԫ)~ү�-G>2P 
    tq6㟍ݞ:(ݹ}g~tj~)S)"e:DQWLmŎdD7Cw2AϰBmX1ƚ{Ȁn釦d�w
    Z�@l
    vvNj0n6;pGu6:yt*]b_\%u2O}Do
    Y&!}܊K͕wxvn=|Q˳ X_1nuK@
    @+ Э^j҃45प_پa~:K&V'/Own*FWs^nRz߿#f4DbUUK]-iY"m)A7*_@_
    [ UytK-P 6tme2nR{U_0]J@/@s?$/s5yS%*},h<|bلf[
    !_0rnVbaȨXU!ZnTXpʳhOt푏�Hncccǝ9BzvF[S{ΪOE_]o][`>,O.+Ndlj6[ji0u+nAΟL\mw3}q
    InlScqt]+kwʨ@k(�bS 89,|Be'&!MibSF:OɍNLtw&N`9ũ!G7/9ɾ!
    s͛o=YL8aLAa0x6͈rl�)@
    @+ (6ѭ={[դ7{
    t=[jFFL9X*-ttK-P 6FGG'cR_;$$`Zł̭UΩh`=hsXuHL͍nuvsR\P伱T[~\�GFP�
    _nȈnEl7SHaāSbrzM?jDV+;9.91*�tK-P 6FFF MBnP
    (i^7X]$dǕ
    ň[qft푏�HfjiiՎ)H
    ҄Pt
    (gS3-B1h:t
    ݜk j@*�tK-P 6.\OP MHP,\FLEK@
    @P'O	H
    $䷅b!en]ET A*�t+w
    �IT�G.@$P�
    @@Q�P�
    @$*�t#H][u	
    @(�B[t Aʨ
    �F@(�@v(h5500RnIQ'(��(t#zZTL"'FoelP�
    @(��%Q ktt�P�
    @)5P�
    @(�@*�gC�P�
    @T�V;Z
    �P�
    R[*6T
    @(��LnP�
    @(�@*�gC�P�
    @T�V;Z
    �P�
    R[*6T
    @(��LnP�
    @(�@*�gC�P�
    @T�V;Z
    �P�
    RBs=[EZ~>D�P�
    @(P
    &mhUW_SE
    ]ްSۙQJ]F#�P�
    @(JnPi(��P2G+wqcnՏh|ieme�h5P�
    ˶ɷ?[k|!'3g
    ި$Bn35n讙~ph;jƈF2(��	WwMkw\䓊5j>@RX.|ꩧ:;;?O"Q.uk,nO/[O?Evҥ񱱱gh/%#D7@(��H_bˤnx]5j>@RXf&gpo|rIg@Q4t#n#ϒ6͚6H	z!
    P�
    $\
    orO"A?IV&N"Q.F3>ۈw~}ctTsEOXty#
    P�
    @* K+֨ʕ+C	B7FqR$}7adO>FáN6?H)]x{bP�
    @(�Hn]n]
    Lv=due۝MgZ}E/wtGoZ
    @(�@z趶bH5?mۢپttTr>;g^qȉ3{q|u]Qs(��nS|bTm#ܵ_u#D5<r}UkS%j>׍:ſ?6E	1_yWU̙I	uttw߻d?'{eՖo=qC(��H%@7m.DS+8S8ݵRZcxэfkk]mݖyO|z+]ҧ
    �99\;<(aoJg6®WX[Pxz̟Ru8sΪ)YDnn}ݷ:r]tw%{qc'$s
    gP�
    Wn?Yqch&@UySبGUS,NeT)|!c'ƭ-C.9͗G̯S',&zu8* tvb!֞:s֓sSdj�+^yPc`1lk>p?[_S髾Aը$B8Q/1n^wmaxGHA;UUwҲ]G˯U:=K4Ts!)}ٯ~POs{B/Q-T@_ᶇP�
    @(^Wmցb_Nv*WM+@|,QI΃n+ۤߡYccy'Sۆw/ȋ&6k%omٱx]Qs(��ݞoo(U7b!_j>.ϏɨQdVB/rtޤRc%?x t[b4.ٝw`w<yh_?ԁGpC(��Hn4^}Ee̞ŭZU?MS}UcCS{|uD'½n4xsK69}:8-tl>DG-_YvT@'0[nw~ȳ}Doz{"`T¬WQs(��@	ЍћܾL#nDoO~hVt|mxYM?u*;'Mm<d]Wd}^3>⶿­ѳ0/yP�
    @(P
    0t;p};{+֨$BFъntgM++дmt\K{gW"Cw2xZ	P�
    @( npcXF`p7!AS}j5iUM	0ip-{m)xA(�@( G{>hXGA%nb8Z<mO/{es!P�
    @(�SG;UF'½nykDHMpR6P�
    @(�O?om9]F'Hw֬Y---4DCo|r|?<3P+W]}M78ve.mg(uL
    @(��xC}ëwk|.\O۩b7j>@RDknQTB(��(փ7t3+֨$Bv?89(\X5Dx"
    dP�
    @(��(@P�
    @(�"*�t(A(��P
    �JP�
    @(���-PH�P�
    @+	6)B09H.�
    @(��l2[2[e_&h=P�
    @(nP(��P�
    DP�A$$P�
    @(�@2n,lnP(��Pr�UoC(��S�薺P�
    @(�*W[h9P�
    @(:nPa(��PrNŋ+P�
    @(�@IxW+Oum=ԫmhUW_SE
    ]J4@FLgTBZ΂ةΑ ˦Dg:G-.3=XsĻ̪|;͵T<bNuņNu:?T8kj*
    6Gٚ;gJ3NwL|^+c] g?SvgFVfD76ng{/We62sپ3[W(;ޘA%h23aul)VˬbkmR;#t'*ڴ
    58~kFf?ןm/-k][kYeέux;;ּzG{cG3o7Rw
    c:KJkv1'xlY:moP~þulQYMH|{s#-=[>ؓ}`2P۱P%4@FV|?ˆnj,c"�\1M�D!FPXlt#nJ1΃nΝKK&0N#}$I$Wt#6Oj|>m|bdlM@�NқĂq:ø\$g7ќhFW]*Do'�88�'[[7mŸ	`XM`IЭwꯪ~uzpdz㫝MoC7ӟW(ht8A7~.c:9zO
    nm\=i/]GH\<Fn8-+t3r0..z;}oe�8{|o{$ބ/U�z^XvmPo~}ߡC{)r;y")MO9eߌX!$rjD-㋜LǛ..NO�H:lSmnFT]BYfd�^7[7~1$o9
    n:x"ЍN牜*ߛ8k^'xo:~<pfFN�iYRK-n$A7L~Dor{W\z4
    ]h+4v9Ņm$bbitmKs}؊إ
    K?rɰ#f&f,\<8姿24-1Ԥ 0#<#H#n9sC=TbŊgy{;h
    @(��P !
    tMvCŋ"����IENDB`������������������������������������������logback_1.0.13/docs/beagle/images/sailing-ship-128x128.png������������������������������������������0000644�0001750�0001750�00000044233�12143164146�022630� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR���������>a��HbIDATx]Ү{9qAPbUD$H (A@.p94ᯞ;}:
    }I9ڄFM]v,^^pKGN60v]^{#y	^la{EW@ӯsS[bb6WzZ~?\&>:$�RoykJߧps,mSTP
    ɢUNV&ϽzpyOYj~GJ4=V>J?VQqs4>Kz?vU?�^~|m0fXZqϙWXPB
    &7QMQW(̳B㜧4|qc?U39{CW�hG=O7ihढ़E/+<0D;/Vd\(y4�2�T^\)7uafDXVV~8_U*Gb_}=֮;j?�w/_[X:S3wC};z)l�@+�j%,vY/;Qra)G)cp
    jB4yI֡}](�XE%6SA~[^rBtyCp%$#�NtN/8y(ŞٌIfFr;dCvsNS;ov}�՛å)(b4Գo4,1u[&7sp%�� E��P�;Άk+:z
    :3C6.SN04O=Q9ϲt2w/v4�XʶX+,b{oʨ{{ghz6ݹ\j;jYoM;u-�ʞ{uFXYg@M4*uJ@)@�Y)^g)m%)Ntx+VO],�Y^t⩊W
    n�hF:0mq<c?ęWF&��sWYG_]Dz(q<`8T:Ov~,�ƣ@A\ڣO|n[%ߌ9�ܷ;:j|lׯa}zV(&
    aCYu[*,[?Ƕm
    |e9Kb+*^:{[щaKgkA:(X�
    6	:k0?�<ke/*{Nˈ0N@רTc_ZnWT=H�dw~o~:6Z2wvJ~~ފjɵ4|N닼Nh|j';+r)NS'vTW'�w)=jqڵIm[@Nj
    A
    <l>~kC+wܓ3ۼg&]3D>fTΦ6xުZ?WU�ۘJƝ6YUM{gԃ:_䑢i 	O@`2ۑ9Z<^bY㹣ZPE݊wwޞcu]d4mY:UxS[Y?MhGFHi
    lvTl}¤[{GxWҧx[/}�j8XR>wj|RzɲA!!>
    Iq<P|߯9kNY}kj]GMVms]]&w[n~{^C6iUZ KV%ܐk=ONFGBK+eɷNǽ^YoE,t)󻯎}_�͑Tpȱ'X<!q:|B!91H&!^Lt`H!B'repw[KYS^x-ioѮ[1͝s
    �WLb3d%Yϭhc3cc`l0IH0諜Gs7umv;>=z
    vtzV>8i+6s{O鱦bk�p%ëQ>&xչJ(}+jvXf߆ԈkZ2h1GST@ɯHAp\Xnc*O>?-ɬIn攞6j˕,W�WliW|}q:&)4}3!-X5DѨ&<2KS
    ƭb됔0`Ccm|!a}h1򹯏rϾ8VnYdwov{y &n}0
    	鈟'*}>J곬:~̆}<F5l}c/5sCM{�.WlpiyeQfݒF~
    ADht^q?O=UWX
    3~'KsypO7#�h>g_i�{zHi,{[XMa\uEQCLLD{e!Jco*#gcOf�v6g_)�g3S1nw#͛jb%)j*&;=%6_uɶyԴ-;Lwiw#?:m}v�{�h)Z?zHfC!:p4!Gv~k*R3	Vy/|yZ5vy_S춞E{WhᅟZ.+�z.XbDžeZS:;5*b@gk
    4jj""Vu51wT+KˍGp3}hr_GֽxoŠۚ;.<kc/Zy_
    ֋h>wP/"5~R'$:H>`_Iﶱ3ni]M1mZ?�3�.[ץEF4l@h(`0|$z=b/LJ!YHKYz,f<P0U>OyVǂwk"�[sQ.�>^ùR"
    
    |O#8<)u	gC:M-[;2k4u߼\�&}mֹ:4'xy)BH(:OK!:/v8aܺy^vs76g28+9YQ>5�V_٧^߫oIױ5(FB".^eRo-\~ڭ?NkCӦj]z^^k�^9ommU$xU=GBL.tVYH۔eƶnVu>͙-J`O?k|go_D}6{3bx? Y�'=e!&	f&lS@?ܾUcVxy�$�N�•ڙW8Lyۇ3{hZ.U_i|po۽
    pF�y'�*2_6|&g=	1#;)F5{n'E;*>~]iQ_oz)φ{'+e��Ε(k7_8SO	1AXO#L`+9FpQBCJ❇e#�&
    r44,ϸ@crU-�ƴk]C/h0Dy<<χ|5`	˾q
    Xyψ#s]Tz0\�@Y_=}g0쌟nH_B|"wnJ&$ǾV8svtWOY1O̞>~x^lY6z>s,#K45I?;sk1k
    \?RSD^/#dTןsIvn;n3&αm?jP]YCh}teEquJ%OGeWfܬx&ֵI`ᫍ0;*$'⦔>_>[bs/6e^x桉PM9юK�c~�З??ERm4?H"~G}%㫱⾓efrDj5?Ы'=ֶmY>qG;+&X!M|6K}s} $p\NϠ9>p_p	qcO=q+no{J%�>S>,:"Nj+*x`4\(dEXu)bBB!$PIyܻGϽZ
    t̰_WkT�c{�Ă^|1QcN̘ ̪<SUa:($,?|||RVv{%|n8PZ@�p"1!�>*ҥV�LZɰЉ-3S=Tq^@Q_V�yo67BuK˕�d5`*\qѕ*J+/>;PC	�RW_]q!PBSՌ#gYzbϰ`c;٘a3Y�ϖ�jv
    �ba>xУaZHzW]9R&_͔xd1zf3|{];|զxe|zX;�7nXI!J�{yG?|IJ'QA@^r\6秔jx}+<hSe;0[ZD�p[w߂^@Qj٬c2VC+l_dFoME>EpÐϾ"seMf>=`-k��xp;vr`f/T93tp
    O
    #?J-vk0{<r~t�}%7o̘Y5�LX~Sɝ3x|?e\\.�_)I#_:d �\, l�)w?*tۄ{ᒜ-+Qj@%(,-zxgI
    S@\F B-CЋH`8_f�͛kݯ{'nSw��Ϯk��3'<ܥtF鴚jl²ȏlv
    =Y%&�M=zaփ_3F�\o))6}v.,ϭF
    �-zgHoԾeUÿH�~@Wi|
    Nj*`ȲA0롏_F7>S'sI@A{U(C¸všb+p
    ݃p7e0`Ш'?в�=}EI9LRɛ{pY:[	W'
    oF
    �Bx}<UK$PI|~P+i �VWЦ71Xzp5�tفs:E7pH��/ɨF?x-b�Tw~SI,O-7 �3�.;_N,*+|dacq
    r(GeQ!m!|0/0zwz^tmf%fҦP{̊0f:T۱݂O*@2*d$x@m9_V'�zw4PR	kS6.ZqY0yf=s*/;Vᳫ_i]I3ySFZ>zHxKq-F�LZQY4l^Ŋ\.W
    ŀH!`7b7p&h6 E�gR֛~Z?7?jV	N/#>S3|yt%adjT{Z-t]ٽ>pY\H0ԏ(:4ry&_3Vj+7,!n5U7Il$
    S&F=3-~oVt	�8^9s"4tZVdw6RtSz
    9_"8פֿ7!-d�1ƱQa(4dR
    ߂/bCpۡq9ĜQCX;oLM㹜5XT�ܵ|L|D5<MlPЌ@�ۈi�rAցsLVjo_#�VoU]o$)�_6e,ZY�ߣ;&4@JAKDaEE@:*&q1|X*%2$Ust7$>`Ņ
    ȩasVE%mSv'^3xNzd9M1N'~6>JUk^N>ZZA)Ucq\i[I.G!Ƨpȟ$%cț5d긶ѩǛw$�||9SeE=V;Q?72ahfqNcE.#YA)|]@d+ue~YO:�#4U\vizZ.-=F@
    N-mssR;ˡ`p�zI%.k}N6�Щ:آS1�`�{豑/Σ\3'1:sX074HA>2 U�VN8Jt8nAhWhK/FEBXWvҫZpg:u.o+Fsm/<LYQHsySPcr}^'l{xlgwtL�IiT9z}hPM|(52굷5 #t0
    
    	>
    �P
    _a
    50~G+,[+RJSST;fο½K�|=iF%&9K++qDikB>xg	[޴a|?</:a-u=lM^W�$gQӿvTpAAl%M�@Ap �q,'yt	xҘZE�a'S:]:XYן>^q!ȏE K%~'
    +"X~$mV1CKVw#miVL_^R^YÍ
    
    \3fA	g'^Et@xtbUp�Dž[ x6%
    +lcXw<"Q><KB˯twY8:%_GuԸv{Њe07@˕F
    AvU["O&_;lOOsߴö{dMڨMT�]6."Pr|Ccg>VQqYJ'Xb(H)!=:f/oS#0#<;兺q5f:39okT?}HMA^6�S)B["kJ;kpj[
    >M �lLjqn0~w-V>}͸[Rhމh1fGP8P9ޑʼn=Dd;HX^Xa'lײ^x}QR5x^y|f]O?VfM]k4	/gq#@!ixP0޾z#Yl?s]_%$j6!k-WmqܰxkM}>=kއ:%#rE$0H; |i\
    ^bj]_g�/lo;CBH0񃉉1}>MjߐU0]5b-UxS|q`u7]*H�D!�Ws|z_CՏ
    ڗ
    v233h®"JdENH)�H4,/
    ��<s~
    >fi银O[<3hJ3oB aH1e~�o2=($Mg`7?ӒqϚ�xa-/8&�`s\_cZ�Po΢&4vs}հaCѣZnߔF=K0?TT&Xr܎�
    qM@т7(w{H~�V@VQ7ui{RqqBW i[i_l�E}<`ZS|QK[U!�z �L-^߿i[
    L4ʵ*ׯLo+-M,
    =RF|Zg<h%=Vlzut�ְZHK>	#jAh?``Ԡ�.iZ~R@ghg{lXŮe
    ƵGygvo�uU[~=|U-tvW�aEvad`Ðmwn>!a'u}Co>*Bup`X},Le`?<0zIO4qY�~)[,�×|]V}P]`ĈW�;4k֬Ρ0/�FÁ΀/3V^^|֎?w"uwA
    W6Ҫ"mK_Ty`~uw)L|O/WvF�뗹vT6xhLd͙3p*l~HJ1*3A%8#(M�?>|^<'z|^9JPj1/lVs|lfo"-+6:RX_B+.ŷj$7_aã[e_qPϾ:A~�h2}ζꞡvNjlC@h>|8|嗠+4]p|2*4Nj�`p0`Ϡ}^V�ƲpfvG룐*BVvwS/a�ܵll4yg3NL,puZ+ɡ=LTp
    ɷ)%?h^o
    �~,
    Oi㎲=o�N4
    /UQ.Np(>F߽wyyy<O>ɿUqqR
    YA.F�<>aq<2~nna�
    O1�t.qxa7^7׉̺L2nn03u	e_i?M.pu-m?8(`JB2u'jH/ wv۝닥X_Տ(�5Lfو">Ґɯ[Ʒi
    i`۶m4rUy˗U)ab;
    +,	�zE kY0Q /%{e|`bc!nEl[pd=7݋W/u]; \! JVХ)'pm\S !v6=ed .lbj9�b{݉4<Έ񷚢AE&k6IIĠy7駟$<p�o߾>qlˊ]�[:~,.jd=�E N-\[@1i�5¸T,7yEW+sFukԻNkReqC%J=uԴNmQSj/NZK[Hv
    ZBCWJdJs>(8N4P3MECzr<DEZv6m5ݻwCjjj}<*lhB4.	ݫx	C;pSV
    1�h"3	Ӽl͏*fZٖ<XZm'R=4{##ʌCmXiE%{YvMztDFCo|R&#E`0aeib_@]3$�ȓP	nmh\VV]vCK>}`Æ
    Q$fG@ͽERLI9d%tvEPq5E�zѳ/so?1U?-)xSAg:js=>qos}2;QZV]P4_%vď&.)YN''I$ˆ$HI\. &I�pBHo:λevs1M%i$VhҦ+ߤ]WQNpxZBDz!Xpa?Var,.=NБy!v*!؜ 3iL`b5tue<}JTX�tÁ�v\GN]jz4W-ltF"،xU*<uAHhcBI32+؏I򂠗`[,t&�(Z	FX&h)y&2NB3āGD'ŧJ7CѢE{_
    Pb
    UhW6n,N4&8[aҿ8Vt"|^Xx�[s%%lꞟ;_SCK$'v;|~8":
    1%H%EEɅ'$'CHSv$YA RZʯ#1` .A&i]+_򼓠F.P?1
    ˭�c#Hԍwɪ9(Hg_f+]v	ahA
    `u'zlEỜ>(0W2(Z>g'ς`ΈD|ٗ\�gk,~ŏm�n\y܂6N8V8\d2GOڅ!N{
    8j j5aȸcU1K]dL*MbQ'AqZFmր_-=wy8C�2�>!x[Yqa
    KrTpNR<t`g6xoswK$|7n/4&M`:gP�pzQ"[�_l{ޮϧf�+ja|pŠ] M=k th,႐@U[OUh媋0b*-lo"�Zo`Qѭ+Ր�ٛ)HMĐ[WZ9rEVoж@h٥/6hs|m4C�PóKtq	3z&e�&_/|IДS/PA+pYXe_m:y8zTF*PW6@hb-V>両�#F.�
    OQR4q:A*]E@qjZHG#aZ&R+@A0C9}H
    i~"6lG@cQA^1%
    Y)??X+W8_"DL
    :ة20c8Kbz$,97�xs	@]juUӝuϿȩ{:Y<4*$n.%\X}]Z2S)UU-5YC5Iml:&21iNJc3Z"FJBA	!p&;W��`ID'X=Oi1W`f<lPU,q
    (82Gp+IZ��^/�M$߯.AB-Ÿ?KG;w5ƺRm](;nI
    /HHI%d@UreV;K]6BAL-$J0&f�GP80g 8:"T\F_\벂fH~G	� o!fJRn1@ɳK2lE
    nm�昆GJQ�\�xNxVſ):g�O*$$q^p5thK40�7.K$*@I�
    E CXa}qЕUex#dXRN)ģ5AKF*-JE S
    )0>7>L
    X81l8<BQӂU*JRQeI`-[.ʼnZnIs\#63Ro9�p��%O.A_EZ86p1
    CL@kմ�{a8a꾇;yeBs%9A%	^0�m^%Tl�}.??!w
    ]}�$p~BLjݮx1U̝+'#H1ǀ+"	 L+/Zj)�>
    Zo@ZO̾/OC̽|8Iѣjv󙷗ԋxtD7j*gLAn eHʲ6Nl/Vmy@!;Ms1È͢
    G$LT>^>,Bw*B%Rt7YUiC9cik\ט�.3*
    ,QB�xi-*$-~��߀KG2�BWB۔683F늴7{>~)aϼ^Rq'#}z5
    4K?<[^� |˯	 b/<U"[Y|
    \s(rh-s^H"(7i=#E-3b5*GS|ErT@}H=ʧ4iL1w(J'\ᄬ| ySz?1[Wxi.�bpcy2{AV�BV0R~P9h~Lz5Hu`8a$G=6W@=p3qAOGRgD-;�.ph']ӯuhb5'> @P7-m^t|!@|^/h1hUh*�vk"/	R9߀sYB7/
    xN&r,�l1Zs!Ï@kM~ZWrH֤p0lW
    7eet`԰d f#Q"m�6Ryr:|7	4|ct.[=(Zi򩂙'.B`AB(
    ʜJ*͸"U[|sp9ψ9}TςL
    t>-1#,WDz
    ^pxE=$ǿ�`[ExK&}MU:vX;aтcThwU	Zٳ}+![	'ӯUtq@ mSX�ҤsX.�APj".�/p*^2sٺ!Ϡ|`e(ޑ(hq
    =[%|GR"j%XpENQ9UN
    v<xtLK}BII	;vLLR DH@�9EEm$րo aBV=�Jra$oZJ
    :lйZ|-\pOE"e}걂WjfӺ}GST|?Z^WWLnV&[/[paUVa*dU$ZsNN}EV
    _!H6foR2�x%+*oX�D2RA
    h$,C�I@z^"qJQnxyލjG5Q(2&P |Z U>*};Z_#�H}iy}F)pmڵk!##CObCfJCn
    <jo*H&q	"k9Wŗ#sBI`]:\8d$0Y0:E<:YPEB!npR^2BҌZƧZ}K}X�`a[ERln%CIW1�	B6m2�D!p
    UBa=X%�B<Jq51\<ω#u)i+CvBʖ*5{*”`5<ZO uj~
    �Rn.%ɏa,n8Z\)6CAb�=e/T8>V>NPs\FX++3xߠCJ0z/
    _\Â5*-wg.pq$;G'zFéֹߜTjAi:Qa2Y#ݗoaФeF�%
    CdVu21ShqU"tiHJ*I69g)`H..K	d6pъ]#Nh7INr-S�HʞTt/}gw4!`x5htOȒ΢<Թjݓ0rЉݦ{V
    B%:+JbM8HfԒ3EM\R\YHG)ɘ dOL�DėTDt,Pz^h#dUL=`D%MVfNk3.j�R&Do< `T
    C5myXpXdtd bFHJKB	kP:P}=Cxyv�hǐ$Ί"`)$BmFxq`HcMـE!c*.
    R:YT�rͪ?av_WxuPOFo͂oMb/VVw>4pHpv3}A$!���Wl"lJ@`5 )`@JI;z^l fɘCBH2T$!uXrAM{TVqh)5O]zGG!7	cٺ2f}dB'rO5"J^/PB>Pm'ɲDL|?WEC!mYBy@H>W`6PB7RLfB!v7 !x^r@-
    |
    h(z}5E^+�R&zsϘ]ەߦ-x|h+>(Z
    )(cqP19
    țEsejU@+ J§l>6�Rk*D2Gh4UY.gR\<.<Nb":?,* 	@|>H2@.dOGj4iizi+&?�Rn_Y%n&i'(ͼ[;/:߼8}9[.X\�%=QZhzzjЪ(1QWhNd67
    ϋ.J;f
    \WPwFR�2?)F<cq*s0rl^YmPƿVQ1{eğ�R-Jw<q
    8_Z|ٿ%B6ҢբC<V+ R}8q6Y4F-ES ޠu**wFh(6!�<p0ݐ˂vK\[;Xpy̨r4�y
    *2
    5
    �r9I^(
    D19jV}fyyz�R2T<BVRN'ӛyudtQ5=dbEؽ'*H:I8%k!49@}a%G+
    ݥF&RV
    /gHR&9	4$IR%U2B;[\+j:I8ZEϏhgON�H/J?bX#m9ng4Zm-{
    Ȏ2=L^otMn+\pr.��DMD0(7.?O_f1 d\'HCc`[doDi5)z~%7%�P﵏:77tyeV-YeV0αPlu�A䎐//1.Tz}@v	q194bQ�Mzt] ROA5ڈ
    RЭPIFBU	VPmBE_::dsSjoMV?mqWTlJ00fWILxhٟ9Ƹ *JL7ef/wʳe+"OD5NH8qDPK-҄//o,\fi.(Q&(}ԭ<$]E݌_׾oPy/
    �&o1M崳K,Mת>s_IN|t #zXY�aߜC;ZN�/5	~٘BȈ).E($erV;bߟ
    q1C|{P'[/7Q.pV->4hTE9ڂd�$Ξm]G۳DkZT뇜?j�x
    8_a
    Xa?f[fY�5O4b@( 1q - א_!%"SϻY<YvQʨVBz.?__}c;IɰEPjsñ?/!.>ޟ"h&=[E{@HPݽA�!\|DII8D~ӿ@|Y3o)-ruPԩ~)4hTHsdwa<@Ry܈ ć2C;fp	!m'4'1�Zjeja!ެ3u2z�o&d"FƴXGXydjT �a|Nʁ0l~$*[�x@fa7+KН*7#@AoL0F29J5y)�K7RC_pyjJ;=IiRG#@t:ӴT��G) +݃(6j(ɢ~rRt"L v%(7W@IKwekcuƒM\2�S/SEC	qM1\AbH-&[);BN5$)jdxOۛe\>JBA)<Kz*!LҀ䛺)Fw^0Vqʑ6;D@|9S%ťlUQSZGv%>:]�@.~;`lnD9$?XJf,	F0X.Z0A+5#s�l^/
    ͅ6;X[�~~TVmM[ES_m@YF|5Ө4`\]@::^mp>�GiņКH!hid|$1yyؠVӪu%r\1�\LiѪ(꣐hQ:ă!G
    m
    kAso'yW?Qٿ?6]eo1����IENDB`���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/beagle/images/callerData-jump.png�����������������������������������������������0000644�0001750�0001750�00000035260�12143164146�022313� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR��:������Ljm���sRGB����gAMA��a���	pHYs����od��:EIDATx^}	WuJjRa&d)2&RAC	a&a<`</l8ظ&,cFF*k[,[l[y$/Z}_lɲs[{w9~_tuns}}Z'v9p_
    UɯHyD	im>{ə]|#6#9&)KB2==^٫zZkU$rnSpGw%=.PY4=]~y9׸ԊV7Kr&jCO_/'#y_HfN!I⦜g+,f.tdC@XD^dpq-1$8HܽbZ1ABBj,|<#CXFEVl1D	A[QSrB6v\
    'N^, ̍(/D-r!�l[RLn*!$k<Y©8{P#y(%)$3/@Q_tڤ~#c}I]׶kOq\C	7YQѮ*I�xkOEA"#8#s]	+GJYc
    ! %qfXB~[_\ݵEh"A}S$L%H`&!ŋG3;/E(͒ŵlJ/Zk$Ҳ¹+'f.o$#aE߸x"BvIUеTz:NhAF;>S "MaBOp|H%gY3W!}JԢT>еT8fl8QO(:oj-OCΊ'1St
    �cѺ[-ν-mC<VB=
    gbB19AdrI!eφxc@ZvLHV!N9
    li:B�CsmDh/nRE�#9ڝ`gX\HWQפ2nU0LIH6Z៻
    tA66FՅkm7vtYNњ$ŭL3IM0魏gjZnx^	VNQER4/V;Ynv!I%5LĺJYB
    	mS.9_1I2KaW.'ՙOm뷬dTa//Bj05G�$†Ju3^weZ5udElNt$gcw%)EO}|fOGMTKCDRI'=cIWtMPE@PZ#t7""("F =>E@PE@P:5e"("kOhn("(E@5E@PE@Pj@ҵ[э0vfwt2wUwIU&ؓ?jm(IgY3%alX%gkPѤ1tJQeIJI)i9lN$GR*v&\]sl߮0RnIBRBSG h?]ࠕTU\].ߦCuLF(QDM$s
    ܀.!V"x	;FYqA&qWZ0*	hVx&T
    l˂N~VwDea˄׋'Iv-)֜\:pv[m2>%nGҒT= !8\i:Ynd]d
    %
    gD?!dq
    fq7Bƺ&(Cɟ~JZ}>@F3rXÚdW\pFYh\!)/GD>Z5uF[WIً9KFnhb݇¾$>//?u
    �Z4B&׾=<YѢEݑMA|:7@!*@:¹%N?d>
    {v7+[G=w7͖lloz}	t+!
    ;xOe*hJZN'~tm7oB(J+N~!^d[@΍
    Go#"
    1x/Z`|C_Τ$VSqpF):rs痀\8Ȕ\!RBj}fP`?D[#uZ[dkhJZ.Ɍ[7 I/R<d$'kYD=+c)Wpe{;0ȜNn&|AqP
    ]|]EKVt0	.5h~FӀWpY'm-htGOrty"maHX
    FVB2_7i<#ޥ$nE�JGph(2c5=o=E>nCZsA@ij
    W3#H$JJl\/p�Hd:?2pN&H֗e!qg@�&zmǤFS<|8;A|89zĽDΒ$9j!&%.8Qܒ𑑗CZwI	c_У0HǏ
    W'춈z	/!! AnYD:\d4ryRRKgasM ZwP1DIt
    پY2d7MI cAr)bMTS,%(Q%}F#J?:A#VW8;b"@e/{U{W''bn#0534:JP֙L]E@PE@PtMPE@PZ#0pfˆ_Ч"("(@XrϽ#ő-_0"("(�ΦpɁڸZ\X%E@PE@P 0`o}DjU"("(5D7__iӵCv| !bMɾ]kig1w;;;wEzzTen=Iֆ$2٢6SKtF!zK֋I\
    *iӵZ;4V6R)EIfҭx.񄓮-G|;N\Oq"$>8J%ˊNYzBS;ޮ'	~ɡS~C~
    U16]P_D޸uFcJQ[�X.Mt<%dY!x+֪(b!]D~
    N9i]Ta"ZSP<Ra|(ns[4nTVivW[T٫QOON+Jz[sv"~YN~(>UZ&1CO2d\2!z&翛9^E'L~rA)�	MM<2a)	}c\>)@scH+/qi
    9La}l^q}X3>/5"uZ^
    w~*Ӧk	Ϸ�"oF*vǍ	%J`N. bTy[#l;IS@NO]wc-D|L~E㛅		PaEF*,dhDl$hrszy:ChxFS0_�BP\NUN6hG{,"Ӧk;[વ@?n=I*owPg6
    ]dH%kم`ITyJMTL̎gk`n_2CBd"rP
    =v+.!<$]k.~Ef]Z/nB&r\"zN+DM-q+KN`Y#}56nZYD=c׽<+l%0[r5pzL%/GᕒzM�|O+
    ;0WIU:Z#^Ƈq	YBCBM6EixbÀgփP*+K䢱l/
    q+.V> VXYt_k9/h|Z Gq76ྡ;t,yY?/^#_\Fnk!V`72̓H(+rTIZ/rFȜEfxbd</wl_T|ڧk[VLxy$"V;ZπUd;W.f]mܾk@h/(M>n!>_dR)!<B%`5H+T/F^r~E
    ݍNOr?hIzSA6%Ff	y֋WkrAMu2yaN^\YoӵZO(i
    
    8;bRBM�q%M~۷\֭(eF8߮Lg]'Vh=}a"֫2]Nl5WpWCqpf,{׊9@aWPI}TIyn!)\r_gŞhSP#tMI>E@*.֭ƭCho3)Ք!tv!Q~C@ZU*]WA@"TҵjP[vȑcǎk'O<uTUɧz t!R3E@ZUZaÆ[ㆱ)]WP5[oCn݈ByR.`)dFf4A.Ai@Bף;*pj@Flaݼ{iMVoܙ}?ܶ':U붬&oٵjU5-][`ec3+怭Oj;@4e$mE8g,NȾ)KOP"I`8(w?!lG
    NepBfg?q9F>{E,]qǚ?SWyw|G+m&ҵjUZ-]>}aliEDI2
    z!6962BDҋRw~!"R(MDs&2t
    O�j^)}'K?}.X8~K7=O\~ϝ{yWi)tmhp`j9GIڭ
    떮M:uxxxڵ&'N(%<%D*PFӂriMx',)"47'^`q_
    mdPԾJn1S϶*YMttmpCVZ|K#gֿi^3W\O,^жeֆ˫3?X.ĭo+UoԎ!%p%0)l%WKCΝrNׄN&aVcϩ<;/RFQ=傛#n[r6D5,SȩEܛ.Imau#v={S{wӦMŐ}mܸе˕=Ԫtmʔ)CCCk֬1z>WH�˖,|Dom#c$awggdcYFxHܙ0pn$>̣t$$5.	Aи/)-%*@ǕGlƺe~rF!]uKϜSCA9][dsY~+V0BM7}o홗kIsɓNvpi1wUKcsy؋O
    /g_?*MM4R;ԆXm,d<S=\]qM9ǽȔ�LJ&kRFP?M,H ]hIt/З(\Mjӂ(>DIJFtmfxwmٳ3foJFi4J?;*[m3'cpP$4iBF{-kgҦkZc
    9S2]gqbِc
    5V%EZt-
    rT !g	
    J(ox7H庨U1!];}w{ի3/gf[hk߾;R%?7C-6ї(?^lXs\m~Z!T(]pvH'Hc'2<*e|3{x'¢$ꃝtIsi/1/rtYؗp&7T2CdzN!#=36\]zQ&ҵ3.2t-;]۹skfZnk0fN^G{ӟ^%rtm\IkMϞkn}{]ɕcN%U
    W�7_>oC;IqS�Hu6;6΋+1̡!kg|,:-3ԗ^zlͿW7ɗ8qED;H	7C=Bn},]sj"Hxs^ fhVS8E,B}Mu٫6ɿwƥMU=_|û}ݻ>_?>k�;7~BײGU_5 ?]}`Ng[=s6s34E^iU(]mh0E_.xϷ|7?y9 ]+SWvU&e ?VѯS?{k=FuBh2!]{-<]s٩?z'ɘKZKYmdvTED?1~Y%p[oZlҵ]~ٳWٵ{ϑoJh"Jה}*@@H\jZdE+]k"P;ҵ.XPj5eik5V5[(]S(]F@5k"oS(Jק=u#f^
    I(IyЁ1(ŞR/c/֭zfc{2n-d"+SSc5kkrj
    v_uZgĿ]s>3ܵBؗ}K{J˵9=#pR􃱳b^u+"2`+*I$1Ĕ)]0]^ %߂uڬ˹y!xQs5Rd(_GRx&GR-GArѓ/.!v"d> sYEERуS"){>Jה)]ʭORBL1(]CWNd3\" JzVJ׌rw#oUɥUEʓܑTm*X'*0ny*]S57I/߫MȱE
    7uֵ{{kJ>aidRKUmH{&s%q@R⍟h78*-\ؗ
    ig\֦x4d$CrS7̇H2z=d9F&h	>7i9|/o;9gҥ_DH~3TU$fX^Ҳ|m{	I?`OW%еTa}xȷJт I&e#*JHSpjavHm[tG0o,& dЏR9k;v8s8{`֝KW{bߖ,YelJMq&9YH򿬷adQ_$2nk=n˧kxs&y("	*o1DIΨ1_ȾxtKSutcQ �KUhO'I~7ma/lٶfV޹{al36kk_5@|oVE]st4Ifnk7i5]VRkN~mH&[ۆx*[&qTGwٜx88]#a$[36 5vIzضs5?v9{Mxr/nߵy}Qግk#'mؿ7?<Uu!7vfhV#5Yษ~Ÿԣ\Z3+<ȼII?UOf?N~a_7$AvwO>,Eΰ*ͶP՟#B"XNl9ң=݈?q	w=ܻYok6lza7o?n:t4U##'۟}RQ
    OJ`*h)ft^L57OW
    uWZWQ;f{^+Bz> fz8⒝Apt+s_\շ/z'2p)tMƹZJ“!#T\VɸN\ܺ־z\mĿB+I0XnŢ>tm?`KZ7
    \?wdw.2k\wC]ؚstt,>FN\:kT*Xp(EsF\4ipp¹a{1I'<}we46=lw='ë=AVuk_~<J׺!GE@Fk󇆟Z}eo>;W|cn]k>fIk,šVp40J	'x&9=
    ;uyg]C=]jRkJEptmc+n=kͽ\=xƭ}GsY3wP2]#N<u[4=;}(Uy9k_29oaB]q62
    .8kҷ0q'Q$ӵϺ"(2,]?韟?nYw=;}E{j͆yi&E|v
    kb
    <iS7r9c{NtMvx:bFktmʔ)CCCk֬1M<q"(]P#ѵ~wqu~heOi9Of=H;]pVPfhzpfa:w!5;Y	n[lޭM%u3Tx,ܤ)]~AD@Z-âF)�G׾+fߵhȚK~poѕӿbs_<y䜹=A{o]
    oڏSӟwswo_m4ҍ`lWfcmX@ҵ~*}5k	`"T@Hv??o-3si7;rڌ+~|Fz ;uԬ9sе2H>_uҥtS=@Qfa1R OLʻ_&wTK'32{Kz޺=\\p-	rB\΁1dB/}KW>s#[nݼyMEsYoU޵҉ҵ!0]KP=c4eH$q' WS=eJ$	L=qmlE|	fpk!]{~߻+߾j]8t|صOmҵSWummnѵ	9Ƨ= F#p˔4Gf䦡HT&JlG'~	h5$	{?>]p_Ӽ|\3|D7PVu~ktqZ QdF$RTByNCY7[BxEO8~6D]6z/W݌x|p%j 0%O+c/VWzܺ|4 ׯW=\m?עɹ̩9&?)tMQMԇ|IN¦=BNm%ZTIq	9edHkp[k2#_rtD!]3B9K՗=u2tqm؅>{ZG1!ͤ]\x?^xHt#U$>9#&sĻT%4'*Fs6}yfR-<.ҵnH	lw0v'=\vM%B?rz#j~&G8wB֒$ͪJZ.HrĥU*QpCfih@ĈDkeOLOךX9:si+gQA3(N.WY !XNՖDB3rC
    B22J:N껡ҵs}'�I[t;M䡢R]%L͆%IuiG\r~
    ~Hؗq|pHs*,.e&K5y嚑dR}z_u(]/{eW
    r8ͿdT3�ĐE!SK!W۾YzKz;k[o߾gϞF8*a/6zVZUJBRzՕ(tm_kl߶m޽{MZ	*d㼿+)*#ttHU"!@5C.^xرcᒅ/l~,t:)]8*aZZn"+(]H@c 隹y݇_>"k#'L<R(boMlOV3? J[jx$ӵק"(%"ѵ9W#FMNS1>12y9?Ȯ,{kA$OЙdaK׾w3g^jd=G^>Zb*E(]S(]FkA.5p(&k\-? ,{kA$ǪЙdҵ.`KڬtMDP�Gθ9]wE{_yE|'wEQ&5;cFoC9	<g]O(ty˧ŭ?L}L_7hԟű'MvzևDD]FPAIeF@8]3tF{W4k%>s̍7&5(i“E氹u.}#Z~BkmVG/۽\͖w)]At;	nKAE{pS_=@p%\s=p=Szz^!?90٫ȵѵg~+q}7߼aÆF
    N&x~0ml1FC>qps-Ytmk%zmSƏ2C'7n|?FUZkqzBt͝dsjƾ+^]rS_9)<j;]H9TDlU]CH$_=lhyػWDGM7ݴ~zyfiIō9P߉Ѫ]j5H5^kIj_}j_	W]!{kȨP\Aу_' zŔ`b'B{d/^�N¨b)){>3ywG)ZvW4{њlf=>c"ݻ;?	]Jfj3`
    Dff㻷$O'۵6	y-\�ҵpR=)EiRE淼)B[ZEIgfTMz]3yj2Hyܦ%,Bz\I%U;|:uOi3tm�?5do?\吻	k	@
    v_ha*eoz_ۯl^mr%}oSE]:n٭7W7{l)S^9=	^i%\`˞np.).2] 5~!倛9QHl%ѼEZAF<ŋi?Ivms=gkf=]C.tz},W+h%uXxnhͽVsq!ZjqUD6(Ɂ
    Y<\Q:Ֆ"
    G$4aە['٦,9@r�
     ^vBs1
    UZk럻vwE͍Q4wH>C3}YkI!L֒bN&^BƕuYuF[\CdH?9x#SW5|?OxH"X)H* !jIø}6YN8 ;,v3s|77iA{8SZh?I,37=_2̜2gΜ͛7wew;k/�ɱhIVDl]dʵVuFgk/	pt+0
    5<ʃ
    4DCE&~mH|q!>rLkݑѓ4z6g+z#t-dᩱݨ隹iضlbN̗@݇Y1\mǎ5LJE7C+ZdFgG/	
    g+ܺ/E@.2f$¾~ol+{n\"a%703ջ`M!pQjI DABޮD7`3/Kk$C?^*Pe"`際'6rׅPeŒpiuObDBKL[>	vI6~AkQ(p�q覥kf+*.cd\'.YJ
    WmѷZǬԍ zC3 طnp2JךͰJ^ks*ʻUGڷ8½+]	V/KײQEU{״E@5E@2Jהy(][Rs$ӵϺ"(2f6C2e-k֬1_+9q"t{oV\sgy\`"9aÆL>}ԩfl079`2ɓ';x"PgڌڶԚW}7W>x$ڦ(cǶnݺl23>}&}RkQEN:yο<z~~痏~N,g]ֶU-~ݙIUE�A^3̜6'+k׮5ч0`ԩSH樌"vثbzkͭ[zֆZ;n<~߹푫oyg%n݈p=~Ёa+ŞR$jnuWص06[!=aW2y(W`N9J1ڜ`ȯíZM9ѵyI<DC292phצ6]mn-Vkͭ͏,i𗇿<||mvqRgzq(2r}8G+p#N()fʹ6?.g~!mAMR90<̐6y_:H�Y2"wʀ$iFW
    ;YZqckk=tiYZ_ޟnZx1I\h1Ah
    ^�X_Hq	E!B׬%xܣWeɉo &!oNM>֢[j
    z;[6_Zʿ3rُ'ӂ(	8ۓ"**Lg`SRZ>9{Wwio1
    'Z*,ۤR\Sx+筻/Q8=:(dH׸f8rqJ޳KyD4H6s~z$S}|Ps?k=wg6[~Y_5tK#)$hc^G$ŅfZf$ijV˄0᪚ӳr{S="%:BĶffj{J&Es:	wίjwr^pM[S(5OI;:^O-5r[kdƩ5w8Ԟ7qMş?+г'q= a`#Tv}*n_t3}#L
    i95F4_Ԁ@#I%۟j{W#&\t6I<CF*L9!MRk'b^4i'T9_{
    _WiشVs&|pJKKN/S$l7#hOdDW6.a%k-i_#~&7\=H;6*td#S.:fɸlPP;S
    m?ҟ~$ZѤ|@א΂u3)]<mU=
    k*: W^ 	,l*&_)]ëI%SKhn.<]hPEKOVGW�Gstޑ'ɅY>efG+COHyw1ZeWE=uHOI03E
    uKDB%W'rZrRD#A-tr=\QMV@jsn!Zq$򚪻9[rߋIrx!7+Z|hʼ#j!ĻjCW_Tg98HG@2yhs0* *PtmZv׵
    uOVUaEC@*z�&"bE@k5sf=~Hs=TE@PE@h49s2����IENDB`������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/beagle/images/sailing-ship-16x16.png��������������������������������������������0000644�0001750�0001750�00000000762�12143164146�022457� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR���������a��IDATxcd �d`%ψKbӦM2Spg]�d~OSW�6qV4cSSSQǎc8ǥHLLLفLӧO?
    %ƀǁLK߿gn*'x a+O5‡/^F ̙3ᗲdwn, Clmm988w9_&9ٞ-K`ĚĿp᳓t|fpRgpZvԕQ,K?}0gdǩ[O?dx'+#ý�3|KgϿ߿tc `h[Bdcp?>%
    g�	tL����IENDB`��������������logback_1.0.13/docs/beagle/images/sailing-ship-32x32.png��������������������������������������������0000644�0001750�0001750�00000004344�12143164146�022453� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR��� ��� ���szz��IDATxڭ	TT;̰ɰ((Rڪjj)5mFA
    QOՄcc₢Gb5&5n*HD\ؙY߼y}r,sޙϻoC#e^nxV]Va?<1GwaqǘFc9)l΃u;^d>\\�;jw|^jjx<Y%qTc1l1wHo�Ë#B>s|=vTJÍ=veoxQ|m\VURYkT+dhVjxȊy#3Mn5umNKyPRLo~+OPe)WF̙28�!F=؜eཫ7KO^RXqs*99(dSBd`�R8ĠF	Nur&]r_<<Q{2"rz-hJ@pW=Z]1V{d<jOT*ժ$wvͭS3&mdӒno7Xwmӻ=4QUZ+
    `_͙YBhfn�/̀  "b8zr^Ύ~́sr$E8"v^;ks?7w^iX=ZD2Y_H.,~n\L(N�>ثX>v/wd,@~&,H-x~_�bߣ]7!3,g�hI(_.\xkT1»`d�)#C8n��wƒyU(uxLy|l[7
    �HĹ;kg:HC63pF9=�UIկNaZ
    <,"/6AX:Vۮ4z|k˹^Wh(8(ow^F0_U=<z첉/qcD1Q^R44)Txveݒ}<\?iQSMʈpʱǠ& %^(:=o֟ȫl.5%ԉh4ɓk
    ՚;eMŰσ Ʉ]G~i2NA zI9`tra;jүRϞ_QipvvXL H/^NhtM�\4^u֝S-Q-C[~>vb @FC ժYIH[uv8Rs+m
    rV4hպQCv+5Cm4X$tZ6d~ɺPn渡"֮LGItѨ"fI8MoČ)XY2=Ze6fp~|ЊNނ(aKI`ZR:xi XjNIF%8l-phC񈀥#m
    2B#�mhOڝ#m衣8v[6dڼoG3'?1B5cAk�t#AЄ!JΖoq]JVmX#=h0AeEG0R=&x.ti?	ʌO1&ܨs"١2<'s!쵷7Cy0#CN`�.PK�7PfFl�^d5a{*u
    W6)#ZJ=[�VCBB4q;-8$51(uu{,`HO,[}U,>rJf%րR-8190}� � uEqA'"ȍ1ϭ`7x,dܮ#qL_ްrq#k�QjTCNFB!�iZ,453ă`@9fXiz3'E[QD
    VcfBc@N^`EL{yhQpX('H(yᢟ8=e z6,mӰGmޛ_6OBIHN(c^$U O]9`ls<rOms_qm,pKPc7f2NDDc.6VU
    bum~.@m: ȐF5hZW)CI֐x--nO/spEci/B
    y����IENDB`��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/beagle/images/sailing-ship-48x48.png��������������������������������������������0000644�0001750�0001750�00000007751�12143164146�022476� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR���0���0���W��IDATxYxTն^LI	1CҹJ	b>l>D|XU.(@D"!H!}9gNoIh^0{N__k3n].vGBE&0o;y!^G|fU;i&^_^=XpZ9BSbdf^�DlyZgh9OKw:?{M'0
    5Aa~=)(_;AexY36Qk 5󁄢Ȉ[T:yJi3suP+G(J_%7qSs).inJZYqIAkU<VDB99 Ls^yg~ ܹo'Wasv_EPUPe
    xM->RcÌ)uܦ5$%ƀ@P+;|l?,	p	{'82ִ?J!6	�nO�4Jm|줧g͢7=vv۰[$wֶ5{0E63E	k=@|=`)n*rg"f
    6$mR *1=QVV@QU
    
    ښON4..f˽vipXiL=hy*gسM!m13Rdwd6"#q߸bݽMM!0;9^݄Vр z5ދU5n{R|QtޝO<l6 ȮAbF7z%8bH&:~a6`r<upy]: #UBG,(<c3s9h
    %pwO# :`߇CM
    #knSfܵ=z\EQeE8zl!~}ޱu	txFi)P:պ`97@k~3yt_GFpMh|aJ*`GFzlJȈڕ3!SjslOg`݉&
    C	tZ'Ep}t\v6J3bO3ΛyAm<pخI@U5*IrOSǔPw?NY#ʖRv$h(vcZCn |і)c~pR}HWΐ~QN0a'a'=p'UR8-_gFd5 n4e18Wx86.L}xI%VWm~h̲6Y-d`.4z,E~cf;&a[=SSUdYL^[!BPtCAu==R]_w+puI鍿*Whҷ6<3n%VFc|-!	�$fja~ѱ;9>I]5"3}vT͚DĄCȲ"!$I!"<OVT挝Wkn׾
    /GV<@؍
    !v8#ä82mk
    ٲ{{阜t`E%RD`mypU\|냕bQ4"NPj�۳y"z#os	Eᵹ5d7i^^tgߩI~yΈ,Ć=wuҊggE{o'trD4d4)!Fwqs؇,a	f3_(ɣmǭyxHTMM
    MMMŖ{ݻ_:)&7`D$t-k_2ɢk`+s/V
    o->!>ۊ+IR
    8XYoa\?{lJp;Y?7aVaC7ncƌџ$@neE'Bx	jEr[
    `UZF)/#h݋V`s3HqX٘.0h9H-wvP޲arӧO@˖-\'RA;
    H|(=*Sf+0@۟D:zf<sFᠾY-`#إ^VhWp	`azB2ZP#ۯrĠR E*اǏC–-[wr7O~߃+gOg/PlvAL`e	isOoS5-U dlyKtJn;6xlg:֩#;z$Bcqrkdžt˞sџTRKj"y%@*(N8|�yIM9cޓf}!%8e9IE8Q`90ё$kDd3&{5첐y>S@N~-,%QveӚMUP,;t"w9ɩ*z
     8g#h^R)&u>_D+o{t?Ã	ɪB+~5?D+p.…
    ƘV`DhLzЀIѮޯIvlPل4^[ĶgR;6Qb""buNXPwV]BݞCyTr'4W@O)<hjP%BL)$&s*Tb5832+z5K
    &;%x"R
    "$k^nT'C;jLhi5OgD*Ʉ2Uup{qQtS-!&S`5u�-!h,7F>KHRRT�ԆC@0CR(VP+
    >?AU^ŕw/gAAZr`7`Ѻe(Je(q"10z[:{5
    ы!Q#b*e2xJB8<,>嬳ʚvxF=kpKj"aVy4^\%	@*H*L2|-l}[́P	JZjT@ETTX<δyK|
    ahX=!uk*==q< RglѮؙf$]Su͐ʮk+.tߟۦm~}@/o
    V>tya+
    hTRSRi:s
    `eodj%z}nh
    yNRp!#Ht@8+imfrU]^lhG	*+edj$F)x/ƃy*Lf	Qۦ[>yоp{GQ�&8bL8Lv10	_+AP>?}hYQ+6RRJF4Ǟ
    <-�.Է>5(I;_H.# gg9K*=
    AOg@&@Iª!e7c`AlJHNwyB9_}k_@0hj\'f?u+w38$I̤U'1&~lʁ<]"W%휻Ɨ/82;tx,hB,SR$f9N9r_ WDT%и2gisGٝdE`ƪ6S!zUmt9P.;>wxOht]_LqZZ`@On25a4dvSG%)(
    S����IENDB`�����������������������logback_1.0.13/docs/beagle/images/menu.png����������������������������������������������������������0000644�0001750�0001750�00000014167�12143164146�020255� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR��X���������sRGB����gAMA��a���	pHYs����od��IDATx^]kTGv(RVJQ6RJ6J%RQv6mqٱxa6`1,xa^=�f0/0c,3<f3̋af0]u{oW{=uԩ:U}:1ͲDYoxstx
    u%c$K.6K2e"-vYrMY'a
    9^/Hv*BQyDFj$7St�A�9<05ED@<@ "9@ uDߑqЄ*-pa4"a=D/xpVhDB'ę,7i-׫~	S*uR˺rS)qxohPACbAN0]93OHHoGעA"8^Ee:y3R]-bzB-])A) V~O�vJXx"p7uy!Tv%$PY;vCqweٴ.mYfVLiDVZAѶJv0,.DbA%DĒk,)INecN!U_q!0=0r{6x@ĉ!lt$c
    2&h�<a@=x@=9/_�y HLNM )䁘{ )כ$Iʙ<uOܮ?T+Ĵ+}
    Yd)_-`^3ml\?m1I3:L`X
    }Hä8W?4%15ūS['/zU7I"3JoEY./v~J\Ht5I*dze*躒r"EJa6VI9Qo44I.w"3:;EU:
    2x뮮PjaM<3̬}e];cJpʏp^+z$*d+x/Msu)AN;%3nW4Ny}߂Oj[`j:_ULUoWt%`GRԏ鋤`xNj4vb.ft6]{{Ɔb} 5N|drFk~+ѕG:1IWyDfH5=쩤/f\Q49LA2iCX776/Onq(9?Uٯ,g]Iy-ĩ90Iy@�L	۳'拹m$=늬?=:/_8\+Io/|}�cC
    #pO@DPVPk,'/Eabs"qg}v֭۷oOpKAYAծ:;;{{{a\@DH(g0swuN;y҉?sݺ:#Y;9444477@	>)"pA'�<O?_rAmUǞzBW<[f-L~Z(TjDf`@D"{C{M0N"xM>1!n޼sX}3'\<sBɊĴvgssS]Dlٲv?$#>RAC@Ǐ?zhSS,w\9rȑ{!/}7CCEl`ҥd6�QKE3D�z;vfHWWWyZDDt!M}Y4!$H))MvFjo@CDp!X;::`;v[?%_D korᴴɱKHKf({AMx*Ǖ{̞gUҴ
    WBh7h2DW1'T^D�r AUU#ϟ?D[ߙ{IA }^he)LJ
    dѩTeĿS˙hfAώ "8}4#	vjD8!C$bJ
    鹇dBr!!D,9@&JD
    *	z/H@7n<s(׾WT�DSD m
    {<Yz~n	&ߵo
    oKgK_~~/w@90(@ZbU7l
    $�;jr m\g(bAl ^BwpӋ[ɵw<,ZtߟS˒?zw<o=w<+_YsD>6<~�Cp./ar/fzMD�yFą\ap]%g..ݿ/~gH"(D5'A[ PRVJD9{G9#_DbIu؆[xc}8xO{G/]Axj2 /!0 %Oom�{UVUo,w%ʽE⅛DDDDD9Dvkބ:IXWĐ1xjׇB]	b`*`^s(Z6"""@=g9>%$#{͝;9s~0{6|n"}XB[# *R];rqAٳGF
    
    v^n:V}/0|1ٕ|J)W2TQW{}⥶ή-/DDdzoyD -Nx_rI'2WiCor[ʪ?~~&IdU&"h״f,U ƹkEWE
    
    PFi"48|eǮ>:PWl\=Z:/\;sgB/?pR4k6jD"[̢59?"m[[ \zo>|xxe75?x}3bD$D%Nn6QwOQ1bk Z"1G@o4,}u':jZ;-`D 	`$#IB$daHv<BxDʹŪE)Nu5删P,LD0֠.Yɧw5?{ȼ]5mX85@)IqD4*%"8eI[Y+L "(YТ!	|ju3*w=Zcp~vu;gU}6�j)a5]s;-5[f!A
    v6-%[Nb+tu3gN>d[gmU"bה_8�0mf+"Q2(ِjj:bUo666;r
    欪[@y[ȡWwE~aq7V6xJD`l~<⪭ͭmϽu[-+6ߋW~*;/٩`HRl/Ȇԇ\A+vnqR	a`f(�PmwIp=y[WZrw֭Y_zex5u	؆[x;_ۓϾMv~IOO2_ƺ
    ^>G
    "W "/Pm[$;{׳x7jf̜M""j'"
    7fsMD;7oOUŝԚwxDOāl7EI%5lͧ~"b.#"	TՐD }[,7"PB4FFO"pʰ]9JPJD#fA(jDymODjDθ(MG$[wMJ޾WRȑ@CDS?&"`�ʕ+L^7ޣ.]vJ^ZLAD! J"�/5~
    v]o
    ?<zDDAea֠,ۮM/z"ȥS+
    z&&l|†NNTNڔAE0rj"H�ꕺZ.^V3ubzbC'	UG!3E{	A#:="gRPY#"G`;m
    >q%ۅlFH^Fy%U.�y)1וBΧ4)@#%eAaK:J&,&)Twc}DG`0-x啕]]]@3+3fi`#\$BgFc%8Zgs*$KE!WEp9 U'" "1iG`SX�GFF@9,?k�2!2&"lV3vʅˁ2L߯ķ)|ڵX"H/@]%䤿yPʡ53j&&tk
    <>tїٹasv$+gb܇]
    uUt#xڜOl!@G"$wk E׹,33�N`Sv*A~ͼlAzQ0Xe09`m`p
    e8{1"�:rD 9wxNj|'FޜOTJgyꭁ#$F8寳rq'
    :1 8wk[ `ppܹs|vF�~�;QJcBF/rֽ()?'*R?GHUx[ڜ`�75(_~ٳggx^0ʪC+V<cU	<%h91	ld0xAIuu5d:/x8GkD%iytۼO%D٣CLDaDj (x"xA	.9}zK*J[<wWID 6a"p;P5*bhM IEUkm[|l
    bE%`̀XaPod:MUw)䥱%BTzD<NlE)I	"c%Xsp\:]đDr>Mxg%K`BC�䍂/?EVX9
    677744G芡`aL]í['D2[0 @{{{]�>	0n߾yu`||b{�FbC	0<(`s6d.㈀}aXDSNُMMP"Hƃ<8+4q!;rqӁ֢qp٩0:;r1PW)5ʻ+7^O~�=DАX̬DWA$)=ѵ(j^K$%d1p.Ŕؠt+'�;W`Wy%
    <AȺHS*BE	E%5"puF_CԠjyGDq(b9�OE'"`/qo,g%"\#dIxOuvtvfxȣ.E0	 m./D1=PD\y0Ń:O1ދLA4zA0
    dyÄEβB͑<@Dk
    Պ䁛D4	af$+?1QCܮT%4-}
    YdRuKΥH����IENDB`���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/beagle/images/play_doc.gif������������������������������������������������������0000644�0001750�0001750�00000001126�12143164146�021053� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a��I��]�'3>}Q\e%�F�z�
    `ju~r~ȄpzS]gN'kufjutdmwnxq9^hqJS]PZe`hqyYcleoyhs~w^it[cm\dm̂fp{������������������������������������������������������������������������������������������������������������������������������������������������������������������!��I�,�������IGI�@�;-�":16,%$�	4I�5
    39��*>	#'�&A��F�E+
    Դ8� .!ߴH�/=)7��!�8<G@"B$ti<8L`,IP�Hɓ&l�;������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/beagle/images/beagleFeature.png�������������������������������������������������0000644�0001750�0001750�00000040752�12143164146�022043� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR��!��]���Z}*���sRGB����gAMA��a���	pHYs����od��AIDATx^{Ǚd'3?̄`<yf23?3Y3;;86^1I%/00`#vVam~Yꜣs)Vwu-ooUw7|{}�	�	@ܾ0;w
    ԘQeJ$@$PnZzc~,5+O$@i9=uH
    Ԙ2 SgC229@j�	@Ippu2zyvSLH*K`dlT{gCGg2_ 0ԘʶN$@$�yoa;ro}rޣ2@)eZ$@$Pq95&.[۟h5⍁  PK_8Ԙ_Q&G$@C@i̷m֝^0|p:/^>oTĉc]cmF9>ԥOO
    }x|aϑ]mw"7tڸo[5zKB$@VD4f`WF&oM81E:"<(741+ג�	@h+lWpJot9q~\Y64ʚ1]khp~w*pkSpl7&#Y2ub$AnSN3D,<H,h
    ȿJip@dF4d&bЈ4~3ׅL5&,09C,
    % 	z!QL\c 3i44.+xcns_hr#c<P*ѵvm-R\E̻ D b:ێEf8Ok2eD4�EcևF0
    Y )J^f+ٵ']
    w45WP~w]^$diUpZ&,u5&KuI IcDf҈)d]vL`_Vz>&ޘ6FlISd/;^r'kAdȠ%;55yJBE$N`]$VHD Eck&]cd_-k614F{7X2|ԋiBvyi39(b$tC8+sqNrÑ>%b$U!d%H
    !,,/;&@۹<=d^-͓	ccR0'R<Z#{hF+F\gwuWb2W![iia<H	D!X9>c"cJ1&Q#֊wh{Ȇ~cjm]11NDd`b8֌)&@߮T]u'@ IcOɔv24F^eVԻd(="D6>ml=/:+nQx:*nC%m-(mI�	x.Î-՞,`&].ȣLKx~Ԛa>e]<,a)
    o\	T%$b%sԴXc t۔|TDeC1pY+W1<%ue]2?38>o-۸LHhdC["DcYT%cW39Q8:saxtϐ1vS' Dc`RW;PZߕ]c71+0gטK8Ec3M N|^.~KqW//+KcLݎi"5Ug$@$PQ"aTzQ4#yr\c 0Ԙ\nB$@e% #0AЅĸE},򄿼tYW1jΟSKHHl"	1)u20EcpFLĎ`ʨ1ëHFmhVܯ`$}hY.-w#o*6Uj&5l�	U,,/,H|zboȽI$2S)V%.Ƨ/Ecԇ1?}LjKIH\_X002}I7{a,e-C\WpiilZFoÄ(QĤƔ3 G@OWn:{'?WuM^(Kȳ/*ĥED;Fij͔IH<|qE&f_C.2?wf!h(Ȍ<Q|GYZDZvdJ`L7b1̅HC�G]~!<hѡO}0_߸zoV?ۆFOt]\aS0]T""K_�B$@x#}<]!1c83ݐ}"Ɗ1Yꂧ|C`^yc3Y (EAsadcEcju
    =j 3燆+"-!(G|o+Č̝V<_T+S93)RrVE*QD$P9`>ocQrxjjyم@`1-kX=7/YDT
    ĭ.-jKᖮfk)~q[eTEza,5cr/"r/&wAZ>:rDf)ʮzm\ebH6l63ـ	1<xzL1DVԽ<5-Xq/m2fJ)-vx^2 0G
    "DdFˮ1bD`:؏fO`xW`pbRiesrĈsMTS٥{HtHrsj=IDps|AK`h[\ o/]m@]	}vSA
    9LЅj(O\R57ə&zk棻[1hLdQKH 0buqVGd3XZy
    }cʈ鎉/@X2wX>8$GeˠR㵛6cv#r6ܝN`/Q",'}R}+Oਪᦔl%hE_*{�OVxV<i]!xo2T*ZΤH1T1x0td#N3<q{vȞ?Z;\d|L]]bjavzac$^{¿7Kz/Nl=?zֲ]e9[~8IkrA\|+[ӀlXs]|qS5&&sJHj_8gT#B;sfDepyǥ(4ؾ]i' 0Phe~Z0el&	+�̀r@T/txnN6d[Fl]2Yct
    ݘ5$Oq<qxIP8Y^D+^pnrXErm L)f,H."e=-Ӡq>ԘjXfas@WK!64"p^AfvCi<}tezDlͥ\Pۧ1(qyRF;9%n?Sו# Wf\kwJ	^HYx,NTǃ'NMpriRLh w*yɚ\4Ө-*F'!4>kWI< HƟ}W {`'v	L#@`C&X'|ϓ{)3U64402O1R~^ DËH]>VkrLӏPI"IVRP)M@6H\Xu]"ԍMsthYfSԽ).|O\ZhДsc^%ix;47NMca0zph4HcO	ӵoӿ=?K
    xiؕ˳#n4Fg.TZ\C*
    �	d%hT;r/T7#đe1xRRјv_1WldV,^
    �	1x%^y{	X|1#ਲcLO�ǔ`C4"6c>/SXeIt첰8$P|,8\Y\[t˕&c`&ijF/hfe<ŌیϾ8,7Px*=^VghZ
    ^y_x2K  o],<>)"r}UkZ2YT`2LtpA1xEs1HBx?,ۺ`vM$@UH@ކ|r9HRC- 5Ahiv%Æ1.3ڑː"�1ͯ;=J
    =!\S-E" ?El.o�w{|$ e]i0d2'9JynAD̉6g
    t\8w#+>45
    H@0%S;3"0PjKE'KG.3XG1Ϭ
    f>(e؈k;%@cD`D]vʛG$@:u2Շ (Ƅ<?4dF1bZ3YQW%0xGLs>̱C!0`/#|>mHk]Ц1!*Jceʈ`31p3!oo v΅2_FjU,-	�	(w0d.2((@]"27lkFz/BT$)9Ec?5H)1eyLx=J񒉣/%l|/Wƻ/"5$%fDnM[3K0WuPcibIH@2k^jr21(hL `_eXo9:1/a
    W$eЛ&o*ư�	@-};<1ѡO 3x9?c $X�bJ`"4;1k
    $@$D�/ABz$~Ûʠ+Z3C}}3Q&3|2
    _H;]f$ $�efv&Q 	B^bOi98}댱A=DgqŞCF1<1�__팵"Ox?c1Z/dA
    $䐨tEQI~1q(g;dIj�&b(5#(Aw�O?iW'CK$DEw 8V:f~f[+F$P0/FmhLP|9%`bGei>_`9m8	@-$ih"3*@oTЅ1WA]/b溲ZnL	�	D`1l$@$@'PƈhhǼ	�	�	X o-~)�	�	GcG$@$@Pc,@e$@$@.j	�	-[d.	�	�5mHHj-LHH6@$@$`�5YK$@$@a  Ec,% ư
    �	�	"@E�	�	PcHHl"tIH1l$@$@Pcle$@$@1gIe  0n`0JEss>B֋_/ӑ�	@^0ntŇ'|@"3u1y5,F& !`ԘPPca! 520u/^(1ԘzO!Hc0] PcтH0IvW.xm1M
    M/~hl*|nʉ8M+TWscCR9cY_i%Ӝ$G(e9VH_U(ޟdT)*,
    )'RJ
    /g,@h)s%И
    [Z%%Kzt=/fl21MN?jne)Csn4=Yj%N^XKЩ1ȒGZE:w[U曎fHRNv[y"xOXmYаlKB8ANk}e8~0/MpR@aФLS`R&;Fԥ5),2=]SVFa7aȒGZEάK1Tu
    ,^$=Br9#4,
    dXԘǗ,YlI\Hdh1єW?k2K̕Dvlln{VpWwbt-u2un){ҹc)u9+a;F)LwSDA28@3dF
    yTzpCS&JngWYb%j;V2]XAh$4ĩN&I1v~[)i1S>-R1(F3p\F~cѕ˱;`#	ђtȑ2ȘqO	vwxyM	0cwSq7
    *199:xz]ߏAPR+fFs
    ~Ht!$^AlZ"LZ"eu"ԯHe.ߪŊj'u1czO
    0~~ƌYrؘ/qc9wZ)9ђhR#mҜKD"mjǵR4Z;G22?]%	7]7pznW4'M&X_[ݤ1.P|Qv
    N֛oE T%`sƺ`hMbQIQYMs"֗lҘQRO156ZHDR<%5"3d4͛m>x7~
    
    øFcz x~g{i_:qD%1b1i~4F5oթI#QBM='o	 ï7%NT&N2,ᾇSsk78F)1!/ax"gSf]c|'VUc4[DGįtYy+_yh$olޮ
    hpУd4!Lc}&qE&j(EL#GhW5tZlxBF$ѼHq)kא~cpœr
    5[+i[Xox!#CK+Q|5&PYfШ@NIp̆d2|.XJ\2,oÝQݝnGyv{!qg鋔b47jYHbD|e?j\OKs8^65dj[ޮМ;|Jhs"p/$:\hj̮1ñ`4uW:Wnoi	=c'I=YMjjƙW(G	
    qژ]Xe6Y2hۦ	X
    A22TJTZfn(ջ004V?0kn\S4fjjl@>~+HvOp+d㬳ˋSPiE-a2w$`L(	,%ϲnLO:M ޼@#Fco?D@`%T~dY"wKN,)Kən(BWnԘ(qU}'?	Ȱ3.-Ac2>7Y2nji>	E#^TL׭+c,Gu|+zaS4%cJV^iL3(gqQN^\\r&ث]EĻF9ʪ17n8]_x[|J W($Ә%,-	@'GtSl?$P4'cz@ߏ1.wm�	Fy'׮];00�)
    ^ybkRɋ#HH _=իqOQP}@HEc�	�	�5<	�	@@@$@$`�5YK$@$@a  Ec,% ư
    �	�	"@E�	�	PcHHl"5yipi%9JUH}bYX^d4{L)-޿AZַ5ȯN=KN4e#3JlCSPD{h~/(vHR3_Юr)0ۧQclP̹j}i5[3/Ad<y1M3^
    +9$y-h3|ٳz_Rurh6YiE+KP`W`O&\c
    ˙W95F%1G\uT-YXL=+V6\Ko3a<jeプnv_qqSZ[T\H-Hd1i^$)QpJ)Vk#HL%d5˿K-f5b8֌7أ+W󪩁5aq(qN5LsxN)Ғ=jC1
    NwKn,'=\EDSpxJ9Rx.5^EOV	M|8&GB1ј+Èhd\`˽qg{M'OHӼԵW&8%ecԹH?z8)6\SҒ0a�JŢkX\u2_%Qte
    U+UL]]gZNKK.^OoYQЬ?FByGxYPҠUJ:ܘ擻vu_בsmӃrԘh4&6^fIo\F?j|hѴI/q?m:U3	M]I)C,5ٗXUpUc).]Fca]0|DM^y(2"/ݳ-|kvfqdFqmߔQHa-vaEpJkŖP$ܚRp]hy5S9zV_m#|0jL!M0/êP>2%A:jW$
    z'3Ȥ3+'.AS4Ɠ;SI".8o8O?.OQ|Hl暟'쳊NCcMZ@tI]3&
    |yi(#g[^p.I|16x#T)8dy
    @]Q94a!JESnKcGIFBrDHČ1 %,K-?ܚNNHP2hHM;
    Cg~\1Ұ1!Kjck31b3_T9F'UzN\#@[BfH5%ԎFj^}_\ZE$\$̜BUiQ£Z—HjL5$WjL08~F5
    [uߛ+)HHx;Xà!D,2iBW')R\N-2Kcz'_0x">]N*]9;x#&Qe|)JAttwY虡xb	5Ju4U.a!>5&"b f:P:*o[U1XWuٓGYb*(ѹP2YOk7N@kԘ*!,	}aHi"$@YE&  *Y�	@fHH1ϬIH	Pcjz$@$PAԘ
    g$@$P15~Y=  jL3k qԘ	�	T�55	�	8jL_`VH*HSA̚Hj�5/0G$@$@ |fM$@5N1-xHH
    &Ӭ1�	�	@ALԘ$  \18	�	@1y$@$@TZc
    n{ʋ]	�	&ƔV�Yw8BPeQ@^yW}Yz kLdT%0S (=4F[o6qsyu`iLDZܓ8׭Cª87",cf$@$PҘd	Fjx7Q^,uaEVQG|M<%V妯.<+M$PFEh>X{<?�ҧ_2k!Bh;")#1+ #P8j}wxg4obDdzjLr֘HRWd0'LEefqlg,ƘOR-�	#|5Կ;n<|eἢgSB,RLERןu& ֘Ha�f$@$@@qMŸJEqYH (5FPuYԘ2]6fC$@@(jB�	�	T�57	�	6S5y"	�	�	}S	�	�	C++|K$@$@I1l$@$@Pcle$@$@  [$@$@$P%Yf۬	�	=7S&Eڵk,-	@{.Cư@VeYx$P4jL�	�58X	Pc*|=	D\zLHf=IWV3
    Nz	О6jmLvPcjZ&.e髮
    45M�˶XԪ{l@5&w_d(mWs#NNRZ1Jl$b4QMWW/,*HL+%jј/g
    w<Kל{#'	]55K-jF*W-<8t	7ݙDiݶan+4;ߊwC$wgO?{Dϝc\{'GL}㙥Nv6oNY--9E~Y4ߋvm
    	A@sh|LnҧOCJCZnsg:ms$TtvzGI%fM�}fN=T-MIcW
    /.
    E.cƳ/"kH{u
    Tq�N2
    =uӝ_/@UHјh-TK8{MZ Q^?엻.'2ބ@=/
    ;]o~\R'1w-k@nv>MFiLQƍ2Z-ԘVgHҞƎ9n8<%wmw$;;%ٸnɔ@ߺuq`h"}V
    Ǜt˸
    g^r6NY-Ti
    
    {:oW1QvEʤ1ңw߶WgLH*rjIk]F[U#{8jմKcffnL}@L�znTwiذWv7H	+^ȾPm.Ep@V{#S.?*ӘkקH	^f_PP=#`^j|1=s
    gs=}jҞa^
    '	d%@71.iHH$ՎH`nnOGB�vΪ1umVHHX_l&<HH.	Pc$@$Pe՘֮RqfB$@$`@57===33sMr䣟܈
    ?'_Kl=Op0·
    XXX9y	�	T/
    hwwPo~ށt~ں.:?.Ǯ!`S%#W%ИϏKh;11y7zaׇaD47څ~Kb}k'?+=×CjLK8$@$PN%ИM6m޼y||<g#sDDžvڷ^{pW6"`x˷&߾|`Ǻ/{930pY5NMSw.V/aS27n-'F  Z#P}W(i?wl7_O;sߖuǻ_E:$?qkt6=Oұ{ڕMcq]vZ6*%$crO}�	I4La477wvv@4f#փŴ{{G\c}@Ku
    36?flϕ輈4&<C
    `enz2Q8)4`t )%PtҪU&''\G~?zvtk^_ċ?x9$?{a?Wzwo{=+VcSc|%	%Ƹ"C+z
    +C$PiDF;ȱ=}#wׯl=.}q
    AZ|s=kZ\[;Nt8ѹm4Fsi&H3d<dI`ZsHH&FcƲ8xxt3/e//muBkW6�lYG[~|̶gzh+64ƟY\i75yq}D
    u�!!*h^	@(䵮m]#Ͼ~ƽ׮kL/M�	2hLȓx?y>{7̎H@	4&{=2Ù엓1IH jL8	�	@MdeHHPcr0$@$PS15u9Y *Ԙ,	�	jL++ʐ�	@(w0jf#HLST/ưW�	T;hLw0uU(^!O['G$	@cL\Tv~>R>Nk{dIj@i4ZCw0!	,-f9!NN&n6z&kAA4 RQ_>@/-͔/u[+Zh٬	@5(Ơ2{Ew7ϠĿ6sh?Y
    e (;eɎM	gfҗ:_$`&F~S]9mĻ|&+oNOuj\,	Bi4,_S*5+,s"s%И|w0isRg1x.	@	@cZWV/aV$@uDSG\YU  R#	�	�		dco{r;y  H!�d@8:4潶G&M/0�	�	@
    $‘Uc31uk	�	�	X@2 Y56酱ņʊψ)�	�	T�$‘\baz;zF[|wdK
    gmŋZgtzWC'`OS]^:Ήz('S  $�Oc&o.\VlL=n04:O[7`?T'6'5lw
    Mbk^{lKCczE{pkݍ_
    4F+HH	�	T!HF30x>xIGJc>?.x;}|]y&^0ڏy	wO޾v?3|?4M
    y؎T^7ᘦh	@` aSyjz66<?Ah̑ykz_KðrGO灭mDx˷&߾|`Ǻ/{930p[׫CzE{~ח#$@$P 1pN6}W$őJcϝl?}ׯ_~ӎn=;*[a{k|~tǭ<KzyjWB]?[L|wRo64^	~N55,kŌ$�	@d1Ώï6n¡#]?[ݼpgR4ȡc;o;Dc}@Ku
    ?|kh36[t^DX|n+fߑzxD쏟$$	y
    	�	HF~a9r&9tҽjL)s?lcWX1}G4F?{Eo}O^FğA{ϊU$e*w?α;:W$?9~b"(	�	<HF~3pë9&:xnǛw~֙
    Ec;7wwC`YS
    Ǿ4|ϚG?=֎];Nt.{x!7|P6|Ѯ3#){Lljj)U! C4asxM;_~ј_ymNٸ{WB㱘-hs3w=$w=
    
    ]WMSqsQ m4orԐ94Ǔ"1?oy7vȨhLtHH	@281d;?FQ}LcCq$8$@$@UK�<E++2N$@$PAH#vD譚_
    �	�	I�b~$gn(^�	�	@:$‘Վ7DIHH�Y@<HH1l$@$@Pcle$@$@  [12]  j�	�	-[d.	�	�5mHHj-LHH6@$@$`�5YK$@$@a  Ec,% ư
    �	�	"@E�	�	PcHHl"tIH1l$@$@Pcle$@$@  [12]  j�	�	-[d.	�	�5mHHj-LHH6@$@$`�5YK$@$@a  Ec,% ư
    �	�	"@E�	�	PcHHl"tIH1l$@$@Pcle$@$@  [12]  j�	�	-[d.	�	�5mHHj-LHH6@$@$`�5YK$@$@a  Ec,% ư
    �	�	"@E�	�	PcHHl"tIH1l$@$@Pcle$@$@  [12]  j�	�	-[d.	�	�5mHHj-LHH6@$@$`�5YK$@$@a  Ec,% ư
    �	�	"@E�	�	PcHHl"tIH1l$@$@Pcle$@$@  [12]  j�	�	-[d.	�	�5mHHj-LHH6@$@$`�5YK$@$@a  Ec,% ư
    �	�	"@E�	�	PcHHl"tIH1l$@$@Pcle$@$@  [12]  j�	�	-[d.	�	�5mHHj-LHH6@$@$`�5YK$@$@a  Ec,% ư
    �	�	"@E�	�	PcHHl"tIH1l$@$@Pcle$@$@  [12]  ]c?9nl@����IENDB`����������������������logback_1.0.13/docs/logback.ppt���������������������������������������������������������������������0000644�0001750�0001750�00000715000�12143164146�016240� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ࡱ����������������>��	���������������]������������������Z��[��\�����n��͒^bEN凙=UPNG
    
    ���
    IHDR���������I*Zr���sRGB����	pHYs����od��IDATx^$yvFdDddw/weNx%�bH
    \]@%DEJgE`%Q%	 f`{]UwF?2etz@yU7w/]{ߏouCӴN~;yYgϻͻn;<z4^E2tnY>ϻdUo''ڑ
    w	3#Qw^Uy?;轔gmޗ*Wx6'>nO{q#<#=bg}=W9:>6Spijj-*l{;lN9;^m[Ƅ?ZCC[zk{gy+kӏ|]|uOQR(}^4Lqhiʷed|HVp~w:7]VHnCbg3X0VF1MZDVUeթwdYC')u^3nyxHzS<l`GyC=ΞMZ%N7�gx"kM#oDT6Im2ݺvu,R\/3_]EWepQPO[_lqxש^=ڔ=y9+.<=Eݨ{Nw=gj3G6A=X
    DS٩7&6;roQ=MwO6>G6m^nNe6bw^M0/zרWJ;}Dasbx2meއO>NQzFF2L=l䮆y$m+&Q
    O=a|˃/3K7	,BMI2#?><o w,
    57o~q`T\[O~*s~0n1,xJ[{>ݔ*ʼaK)ٷ%meoceQy<tsp>98[թUR! cJbnRj=oYTWϭQ1͘MHu㢔ẸGe)68+Iɟ0!WovxL|M<Եfְ ;b}c XDvhmC{@@Fq>-cWSg™a7(%>*GL~lCt:~dn,Tϳ6l
    2}]f$iуpk=+IFϞ22s
    K
    ~\:=byR54h]inL-~�?gF*uTrǾ}ePofaw<dat1ŗx*F`I@Kսw?{nힲmu[ԑ=^Ws'`N<b%-f9>o؜^$.=;Q{yz+}|ϻa"-[޹
    KS0u)񬧯u5V\<YͭtViu]mXV%J	|{^{@6B;M	'M4&/#UZ
    oY~C'N߇mKƬ;acm:гtHR!0NbZL]"FD.u%uCm=Ѝ^3|֠5\uZn34:Ų*;V\_+ Jv{p8f=ihV
    ﶿ	l_\d31{*_NIs6!%?*Ie#>ZWfyDչst:+{6}<;MG.mD$5Ļ*&Ye
    /zU]705>àg"wm;Mw0zoZZQ(VsFT-+;09 m7i
    BNKo޶,;>KrvoX&0?ɐZJ>?0gmQ:~y:&:8]Mnr	GMrr
    9`%kS˫<zfw7L) F6Q	'uɰhhu15͕كr)_HA(D"`�_71zdn@ �ZJQA@$=bus@$
    \lj*03ӁKAxfY|L/?w7oã!
    k}pssՁIau;xՁw9
    9qtF=%uFnP<ݞ&"[iȺz~,o:͵zƙI'ⱅT<<vcW/ԓAzSb͵VkP.^nBPM˞\~d!֬`v>rFz4hM~8V,=ޯ3DR	kSIk{ۆay򏘵-o~ȅ7ziɁT5'ws1M~J=w>|skgk}kk{R)WWWϝ=x$bJB/g}}ŐƭdbTʁMWk)fYV
    ѻZ1
    J٭T1?>{ꆃiXD
    a)>LQ:DcQS?)k#aM9HO$}1a6q
    M(ksbm-$YV+㧺rue}A V䅼E}˥[kwv{Z88?lx4ÓZCfvzd~|a`GF=+#Aq)H[;Ϗ3kkMn60u⠿8!⯁ch4~{-jVgO})-e-DV0l6-c]sc(HoTFMrGZ48ގznIomw lHȚpV=39*dC8^7p[DK}P
    ^c@	ZbPV׳l$[Y\J0^`^bd_h~Nf	x-6[wzZBh7lj16^k4{V4nܾ+地Ep#WVw>rf9DҜ-BFkAzc\B8Wc>ZGߓ#(3r
    5"@
    RzM,Ur_I|wjs66h6I>S7p/u^hz?9ɨ1d:hf^(C~Z-p\_Ƒ9mFB�08msg"WaD_4zCxi~K	N|00UqP<&b.v @7|ܓbԌԂX^jӶ*:MeЫ)/YTGYwahi$)ᘋy/1fm癨tGȃ%l89$rMcG:6IUōjCV*Uxf7;3X}#Ɲuײf}`%N+`zjN4+n
    bbԞ'uVFk6Z1bjڵ@ءt-JeQjq[̛>_[YAݜ-iu%
    o!DŽgu?nKv;'ו;t\ (yX
    $(Q6\M|qN+@
    0REmtME YDk]ngvrVtZFt`,(U`L/
    X_׍Ya/	kF&	c~\Y^Žfn״fAh%_xxFbM�NiuJ0p8Wڪaڭ"gj+'c魍
    ӫg-dA_"bm +tS
    GSU@8'�>t8`ǀ}eZ!N6^Pe^\U`ki=aSH
    %pcZZ?]2wVWp09+bv
    %CfOrЎܢ
    m`ǜ<Yokz26Ө9N(Ddoij]cF<XŴA[ީԋ.߸uExl:kPĒ	nX\H
    z˯q#ȇ\r"F,M-�iQ̂<UM%oK>u:JrHė
    hQKjnsQ9S!rGT$q7I,8"D(<|J=}"vzzI1΀cլ0j]\%w̰rY_(PCv)5uPRž+
    !ﴻ|៚oSlW]cKSAVY5Jf0Mď-vО/433ӅRjEQ\Q @7^%Fsϛ76vӏ=3O=o(Q>U\\0$Fυ	œu]	x}`rS
    ki|!o<c\@61h)ib4HF2$![>nldk<^�};D2CDChIMҫV
    ^6}MQ[==ۑjZAJFim0vEiIj(GZ4+^ѪmolltNj:](猀83NՀ?H@N\.NMM67k~'+Uk4j
    ~$kESo^璟G}vǶd*02%&@cR�#_KSڢ%FxZ^T‹2I/,p#eCA&YÒT$dqȾ"16Yx2\"~_ȯE˅1V(sHH܋n5۵hm)	񦜔55.�_�VSY*V1AnC7mB*}efg-|d\:?ʅAGY,cWoӃQ73_(z/_}X<U6IKyH(F%ԉR(@K㛲�Zn-	WvB+'y'Z18džUJPueh$hŀ(Nוj#uܠm"E
    ~/,"�ewI7	m-t�E3
    thS}Ap{z
    fFN1֮-6}~\rRU)J2an3:V(SߑrfI3Z	<gC*Y+r idBzz*h0d#z"n>٩9;
    F.mi	Gl?sxsK+'v=_sr>x,DZF'*QUAma܎uTWpNSKNFw!#�g+;9�	&$g(!~	>?nLP,>jUi5	U̠+(YoWu_,!3
    JaV<6ӶMˏwiSɈOG9(W%(
    >VWá)ADq'.OKkhNϿqK/^CB9SӔKTxff.OIo{M,^7-#Tjd
    c�FcF$OѴ2ZrnA#�doa{}cm1?Lu:[_9(QNUjB1[	tcx,k"6$&UB2AѡdAN6%lLE`4|
    	cesX(ި>R޽R	p8vGu%9ĒcM=pܙk P-
    iJ
    3N�ƻ]#z[VhyZKJK+Bi'N~?t֭ǏB,MRQ(>P$:-B<p6w`.OR(qN/6X~tbAT$ɄTҳR]>N#>Y*ǗLBXqMPR3.\W]ЁAnTm\%cFL%>2mx2<n7`ٷa42?y1=r(6>&~opuSL\©kvXzsTkۅ˧3ٕp8`A3rH&]_=ߪ-s285:^5}N
    j^gfQo'BViZ\z7_muOȧ)vo}!Hhk<{氰2O~tf&Tc~ٔf;$~"E<߼t!Q:V*e\h@K6pbe	`m//>\;6+];#ߦ豒[
    A7Z8<l׺P{PSĢHOM/@KLՌ{*�HZ#!,SX)UR^ՎQ)ԷBY|"Wo\m!<;c'9䩕'<9×1P8}@U皀UF 8pL=g783BN,�4(i	=dl<~A2 
    h<Hݍ߲TR!"z\~j',
    BH0@KK3iBl<Nuxؖ;P&aƤ ^C2T
    !{momʁ\r$Pqg97/LBr-\|[n狭C!M:=3$otmF)l2o	09F{]nE6[Z-}$M׀(wr~S^Ȓfny`+av/qVHyff͟p(wh̚7lhmK&\H%E9g`$tڨM'rtRkRP�t4sJtb!:tċq.[\]r`h4t±	d:3I%߰k6==?133ݒ$OǧNr%s<iMZFְ)"<25	ێMUޗixTo״VNe[Nڽpوw:q{?
    \N_p+:4�a$5:Z7];Z5(77sF֫R:X*z#LO$'
    Nt1`Ek6%Ri0*t»lGdӛ&IXZڬ:C&C)Not)&MM%RA+
    tjj:])6wwvg33SߑP2۳()% Ttg?iZaycߥ:FY=8'nu_!K?	"6T]kS.ۧS, 
    pXSSڰ{P�%4k=
    vѲEy,fA)cs25;FXfX;v頴.6#0R 
    v8Kgs\D&1g&OVܭq;RBf#t#N`K7
    6٦٫5kvğک2!c]@]'`]䉽Fߤ^mv%O1$<$fQKdԸC.fLMOŦH-NHqy8A~}X(ŢRB'lP
    V1&I-Z'`HM*&%iy
    {]D`֦xT
    mȎ%@zۯ\ۯ7zA۠_.Y#klҺֻ:IX+cs%:Er
    X#@:Sa
    ܻVd::
    F'1{X0'b3o*2FNJp0qݱY|fDSz'ъlt(4u1qZ�&RG)J�be7JfRg##�iGHԡ}gO
    ͑le2";ljEk\O0_]]Ds
    	}=3B~-D2dyMeG0p}UUM4m(gP({?]gvFB�N[	NUPWk*_=hux:A`?G'o0;m)D*QGLs@�"ܪvh0	zRL3 VQ61
    p|
    ^E�`25/%Hw .4mܖ0#iһ\K.;u|@.4Wֳ
     MIx[ݍF#s帞Q+i#Ϡ~lUekRrJ&YLr1z&[}0ޏ֦ܥW:d�ζ[^' f%)Hb1K
    vK)-BܬmtcGCNma'8GvIō_p&zWmZ=!04=|emIFXkltڎjY-54ilGM+=ܿ-[V.&j7dxAs�܍>8sHfl@F	ĤylqGz1L:ޱ$Q
    nfX߼U0P,V2ґTܚЈ6P\{ڻ|)S%)d5& 6!Œ> .D͵bX*ƠҬ1KE�D2=deX	DAAmh%F<mnQSD\ax}wK&"&
    xBpխVWiVEҼ
    SWr,Llu*4|`go}{oszdЪ@+`!x5dhv,}\>&kPPGcapFz;C%jM;Z2D>զ"TxR!GR<Ǽ`.O+]P7DD2w0?(&|O7ŽqSm5¡x8oջP1Ib8۴i2pshFeHȌSO]gʙJVL!2-0Q_8sHjC1dWQ>`U"ڤ+"؁AS!ꕊvX#:7ȕLmʁ%ij,ʤ3|fnnGb:I`Ȋtr	nZbYU@PlR!H͆蝦i`ba[(-g<O{Hn&8tHVadPHޔJ](5a>8EHD\Rpq
    -X0ʮ5QhtmHihh`#a;ft.܌V;1Z!HGC:)etAX'+>atz>I1b-W_^\gN$T0O%JV#�|+6
    ҭX0
    vtA`r};#a9:rF:+Q֪]<}\
    Gb]@6�SЄ`ԤH!-cߒZo*H=�0YA!!%!e
    XHJfm[½GLDh$�!-
    \`\ȱL$ʕ\U溋Gm~H:lG|aå[`t~4^@ЧRD<_dQ],49]6juAU:FxcJ܉Vgd);n>"Bzoo+ؠ/OEfp9�HmSDnoqg'�JEC2ңFV?rK0j 3dvܔhI7�#P
    ,^'Wi<	i*&Z
    U\R{RvZxw3"8raP"x%2Mwl:Nr}i)~ÉFiZ&EM^BFWNt/GI!XAb)enDEo@}iL|yXI*�#`8IX9~lq5KIgm~}lRl5kn21C㥾ei$:}x@mfx@`0*GU3)v2XZJWK
    QBu1mfC1Q?82&g2T|*A8qI^*4vY5jBHr6~6a!IZ6WZVHZ6U%>
    rW>W9�Hj4+._LI-x0]mp2''bNQ m3T*I.X$@;$WEy+iTBmPPrڍ[XL&5wr'HD2ek|XSh)UXCX6nz〫hR(N-c‘t*GOVԩP Ie!r
    YѰ} !q׫1lx"\r~8	$JE@M4Ճ|amwr$M*oK"=UnQ|菘ar|`4MOO
    @pT4\>Wzh
    L'Qa'A(rń4kRLRZKB&>L{T[jaA6᠈nVЃ[ƂXh	(ry19wAT\_vkow{wc0h.I1b*)<ޗi?U*qQT|X%4Ÿ()B$oc<sp4@WW]7dxx¬bk#�58uM uZGv5\Aj;UxG'6's(iu|[-$)"pI{f> FϙM/gvGh): i_ë,c!]#R<T\&|!0C6ļL?Et&{Y�rFWoZ`<<E6&(uMjw"Ug.Oߡ
    R3gN>2\"w"%u,m,
    ņ[h?+
    `x=#4=r1MROq2XSP0
    _}'4O6׶.;.uWJz-\%WZQoѪB֎h}M"XgjV=\
    ;HfFKH|Ht
    oY(V	昴x,IEлżZa*.j
    %u:'-äL#s_Phh"7Vڭs&jER-ҥ.4r�dE]wmZ`@bN <_Z9{ģss+TI:rpqd]NQȈq-P]x
    J8`1z"󴙎d2]-ht\i1.4�p,EzmqKErRF/1P>J+gBQ:7t2ي0)u֎8[M	)_c_=25J^?v?jVzSBRun9&t-['ȕԁ<B%88HA}.} oJ/6@ƴtXa
    Y=l&cQ;FE4n^PZx1jhf#Z_;pۥf#:!?Kz�
    ~,I?d.]`=t܄g:RIa_tZrv+S(<&|`vJA.1{ڞ䠘 rBA]@B|P"W
    ZP !v*=|X2Bj)T@d</?z:!#b
    
    LHuG=WzܻݵSHCX&Ӕ%I3,x4^6OŎ'-
    @쀿us?=(YJ[1ٴo~!:Z03gSgԌ53XbAաD/TrکRF@na9F`$[Ѵ:|\rh>CMwX^$g@:XEcAjM\iZZ:(}@kd1+*JCMԻ6Z@E.LXR!j&Yl
    G!\B]Y}"
    	�9)Ap~a^2z;ɓ�0Hja(6pvۃ~7j9rLlH*'ec*P=R H{]r>4V@y	HeAaêG)O:u+b&SfG}is#'?<h_`'ꄗ($zԉyDL�y+bHج0AڑzN[-=X٫STN`�79o?=}9+s9̈́^H Tv'3;5G$6|qMjQ_d0;R`S2໽q-R>[VjcN4UJ]K~xFC	"`&R1|sh![,}UXUŕ΍·@ٶMJn]R ւo?2G;BֆglguigqE32Di>wЪa)C
    �jKm Kē$.œQ3= {ϘL͇SɁ9g9v/jT`ERk-L"o
    
    gb24kszdfME`}*3$;wB]fpʐr9$_nԪfjѻVuTnC!hDBvK#U\ݔFTN%1 Qm0	OC
    cvZKWyVwv23/ƈ]_O1:O2fnBLԫpǔNg^-g:4M !By:BJZ/Z`پ-lmo4'-f[.&WNPp#&2Icihaxgixf\DAV_>*,
    ,ԃ7_X+ǴZ:'Rw#	EV3խ8Un6,hu}Cjœ'_d2j5K/ꇭrY#p๋ۛff6@QU}}Ւd9x,qs|pia= )k_^}ҧ|lq[;;wOx'fu;j^vSDG";O׷;y:vb47ix9kfS3?Ȥ7~ֿa2>{?W\͟[<|@"ti*^ZK^~ӟJ:q^}K1#'g2M0.Pɲ-IX5/- _)T D|}kKk|.5쏥@V
    @BL!C7IbG+H	%6kw}/wkBh6 k7povoJf{qR1	
    
    Ӥgo.6봌Hi(~k/z᫹+&Ыif׆T[eQꗲ\vSغ~kkc)Xsqț#W+|Ր@rn3ON%ֿzyۮww>Ak8laBq-1/\W7V6wӏW{z,o
    T9+pslP[
    ]# .U2AuRnR%sU,VL9sFFʐMEǾ'&cB:EW.Œ.0:$z~=/OFլ[n]!A~2&GJgĞVSuc_oӺJp"*9hwie[zW]gkko+nbZr!}B/ԵW]sSn9m6S PKLT{R۬a5cvfяv[jqң:șNЋ`K[x40)F\4e^EXB鐹ЫA>2ժ~P1	4FP6ŻHb5zkr2f16L!s2C_fiAkhrPZC+}j{vukW;l5ʤ+tV-DHP*)Jyݗ_ȍWK<UH�mRГ]V!p
    f24piP*uUGXiѡ#HY<d/ewbn3__X˿ovkK߸^jTg;FN6\3	_){}n`ZL?k;_޸[ÃR$Jk|G>YWwoE q3t"ף	g>�Is]6"(k[ d6˜@xhl2JL'3fߎ3ۛ뗢Z$hS'msk,GNٺ)ݥf}>t5$.{ju*l]+|KHt3!ȯtv
    ZH,φZ`Y*6%h$aL}
    /R6@VT;i�ecZWܚ2?Ǎ`Xgx3/hQz>T�7_zw*Rj[_(G??7?G|K߾t+0HmG7hʗʸ2Wv׏
    +'r~Ͷ{꣟OGCOϝ}ʞ^,֌HbE Z9Ocɩ̔3$R;3X82`/&l}q_yK+˙PS	<8HLO2q>kQObֆFe^�ϊs91HxM~>Nd4\,Ni+ӲZ\ppX]+54@nt\1n@4iV39@qg=L|署6oxm!/M<QI(K JoxKg&nQjZ*M`8z]nο#|&[ȶڏ?B
    WX\?w?/gVS\[{Q;aLƍa_SoW^]kFWo->pZ
    Fm_߼p-$"BBB+%qEr._OC~F߼wn^
    Cq6PhuɨdZ^EV(A(!+]F%Ԍk׷80o9+UK%	Lvtz:q)%Rfu<^Ǡۇ!`ڔhhF')cTɰ^FБJFT%k	(,za-?]#$|NO43]BQPR
    7DX/>-!^O{#΀t28Q59{?p/|yV,8Vۿ;	q_TocK'hȏ2u![aI/z/~jg>̢`Jd%e
    ˍ~|=@0
    [‹wO,1II8+am렺Xp&
    10jw]
    2اH;?۷1Z/Ǧ"/_ˤ-�51z fC@W%X+5՞\-bj�5݃}qd>ժݭ}e"3'2'A鍨NAIUI\=m"}WV;pғR,J,7$2)P(2eC(Rw_4\qi'jS~nI,V:g6aMkЯnЪ3?7y,^ntJF5d[߽B6;Vn^-]9YRk5.:>@XReI5|J@O>)/}=!tvOiD)Ifl/rͭ[ۅm'˫fS#�^mH[Kz3"o1Ck4Y9DM
    QF{m5=X]_%pi[~~e^|oܾ}7v?zJ	@T)Ȝp.6($*%GnSGWtx vȘ
    =f#Sqr`0(tY|X0 Y\~ɟ1-nbjΥovWj-_gAџm颅Ͷ#Zb~a}3/tF͆aSbkVUJ@jvۇ@'.Eڨ{۷Z]>XDA:;…oZs'OOˮ΢Fb6CY
    (¸eHL'TcjmdC:m_KoP`LI1SEyQ@Q
    |vu!R`7HR'._H&p(..[^0X}3J&
    !lZ*:2/ev!Q.6-QGKxU0%[!1[ı	
    AޔRҔPQȢ[ԯt_%kjZ
    O|6|lyVFв+͍ն]\o9
    n?&8N`>ѡKZ03"[	ٛۗrd	 ZmШu\fSK>FyNV_[PX<@ۭҔ[LK-DI
    7^VdPMƮo]Dv=	@ĉtC`LV-zt"]LFR(\}QVFأ͝]\F_7IK؄�T(2Ctbus}ͤfpܟK.nexUSd#.㧓QQc O[CMNmaJl+	i~19UIw[\CˇFd$BrHA22]+7Tn\МB24;eSRcy{-
    _>#_ AGtս~ɷ iMGrXZY8d)2`9ԆvPpu.7.˵,-։Hլ›/+{R7p#OrPڃKLPB31=: 61 .?eGowwUJ%D4Y`;4:8}fX{aۈEr	Vʵ:;Hcj2Ut$6N&X1h7}<s6a}4JH8!5C\io=t(z`22y-E$1SbIzOUȨ
    VD!@(t.%CZzkHӹ~$531atf	m#)T8!mƨ&?'hJ׀_xfD`WɘrP#~$Lt5
    kB
    iv\Z޼v	c| g7ݺƂBOu3=OcSΉ`D$jH2ҶRa'Uw G$S1Ø-{ qxKy2Oudxۭ[\fcsLe-?D72gVӧŸ1E
    <	i%*"J${N)>{UJTTnojaY9UpI4T4BJҮ+;vqA-/Q0z3YNrm`%) }13i5wPy](ڲ?|k$':s
    #Ժo\]Ы٬V?~7"ZYWX%Gv:Yhw-ް}S{@L򭦝0:mŒ
    E!+s4'S3zK&sgS'T4N;S`&9Jf:f1{Jh0~S[޸uO;kĂ|pv ?cDLwFXBfPETWk"h“`V.dWMÞz~:Ed5;0L,J50a?3ptȂCPDS�0XȐCm&ۅ}wgQl͐pxDŽoT< <gp%o{oo.vϓ?uLPո*<H9cc@ZE&)
    WzM/݋feClΐ	ph`s=_ǙNftLci91/dcc3 lQxpڐlI9*"*}Lֻ6HA^3o<mG5,i7+g2�6kKǵ@eKxt)Ī
    5V^b1*=	VzU
    Dj`h=HB	Q
    ~\hǸ2FvE/&" XS291i:NJd+_T_^‹@DN9 &R2#xn +p~*eA+Wi"ˤEK'h<RSf7qpo*.Y
    <<=?sgo
    fbL772=#%V*|K8.7GXKYIMO$^FyD籎R"dI4?`NJ"
    UX7lX<9+{2ciP?0Nh` ̩U0aT?~X<Ll,3G5Ϧ޽|0kϘ?pl!Cw_됨=ulkuc4~?ۙǺ]*P4S-!%{i3-*(ضب̘& {gLA?KNPa(іf˳ń1M6`_^vc),|gщ݄G&btHSNxԡV
    ð:
    og<s=yBm;mr;G~^eC4'`hDep0Y"h;l#9V@R2;MI%o)}p{͔z=%;yZp!#A,OL<2^Ƭ$#vf$Ԡ֍^{WU43&HU݀UVR(ۇ~:˒Rt)D,5i8fjBLnBA'f"ˬ׃jtFBV;I靠b&3	Җ}1˟z6bhɳIm/U_wymհkڃX;ًzMN	z18aRS
    S�Ql8A?.f,I(_~:Bn,k0g
    Vtp)Y&ox"LJ~KϷݚ4;F,&L1ohɁ5o8VtJIX.}43~<Y}|xܹ}z翠%S҇@Uul9A
    us	1;FޫBC/T 	;LZQ
    >oP
    FQHL4KDb~4iHLWS2a{	qDm3L|猭1q({plbvBDs,?YUA4ǖL$~#8`^|:y>8z&@)cm@2!5`2ƺ,ǭ+Ǯ޸X#uQ_ Itg5vJ";g-B/Tڙ̈́~əՓ>𱄵ZfZb*]ax}iWWj*
    -zdGA
    7˹;4e|pIAC?0S:S]O:g]FPe0}di~y>sl6z2cĈH+a2:$DZ�/4?%R],`S2P2&ɴϥy"sF_.^2" m'IPo3M	s҇u�~GGI
    QʕאA669RZd+1 j`s.miN~6ǽ`
    M'Ϭ>Cxt_	/-X_+_ztlEHo\|&Z[x̹ϲyp13e״vA˯8jF/GSc/M;t,slyfS0(6H+$w|FO_Wm.uՒi=0|t:1;[
    hbN@v}Ah$FCnIQe*1uT z/O+ۅ_;/2tx^Ŋ2؃_m٬,B
    )b_d%0ڭ
    ٤
    x(-]/=,IkTՐڲbI
    305=\sV0ҳReXp7o;oVi1MX՗+_K_|g_k$25텯Uo/[[^0cӾ)rMuzHL##n,EX(d3SBMS9C+i:ѴcMO1@R{NQ("]?'ޅJx}#jt+�/em!c4k5{,B{Bb^:-r]cBwjl#KƆ4D[;JR$:O5clŚ#sQJ#>̂4NZ>>H+'EJ/_zwoW_yn7/қVv{F0ktr(@Tzӌb8s\
    9}KS[6ҹ<ёLͳy?&=P9%APGGg1XdjLJMƾ[c>)
    NN6uC,4oa8=>ZHTDE(=jdϜ>M3&^.9-:RM8&F||&<ЙG75h*elӥF6"2'+[2@gZ
    RJ4|FդM>荚!4YY-0l{1TkBsM=D|J2٧a#Q|_d'_5¡r:c\j2عs[(/\v/3t\WB2b̊/&Ptb
    1% ;6GH2ӽRyWBpٴ$_huا^S6܋|t|.rn2]VcgcC~-|I( 7|11b>ןf5B4(tjp=(O{a<z0~8DfʥBg\mjZdܬkrͶ;{6]åFPu{ƀ+Ad
    4:}]⺐/W	Y<SXߎ⛤t{#O 
    O:}UhG[BDzӉ#|*ZW.eP}ӛJKN}$8wG`,}jMEFw45p?F*4&&JiZ5jP\rvPDfjƍ[,'2Ox
    om[ ;a|W2E'i՘;B[rmV/Tl +K
    2Ӭ
    ZM>10EkȎ;s7r77[_o=|}}aRXQrоZ4J]3qU
    oBy^B͵;@n#)v!$AX�(ڶcVOM%x(GcoE!"}&pIB"<r/MRmNFL@)@?
    a7{Sީ"QI-h%p_Nk8~wZ8g[R% F)(TXOD/̳>Zlf@_o~_?SZ|~'>Z{ҿ~~'3rl-mQ4oTሷN[Ǣ]v6(2涘\3}ߤf6a#r6{Y�mzr> B
    U	
    XH输lu4hnvӁ,$<90Hnf{sNs:\
    ԫH/T].O'?c5ٯs>'r7oZz_z'_Ee-7Bޔk2'p屯;45{P?LNjNؑzIӃ&/aGJR�!Ai=4EiMtp
    fCX\v䣍|LS(͍ZVϒ)$Q
    kcK]bN^O>:`"V6.|j
    xb̈lqK/}Cnhng:4{F;Pv=1 Cdn{TEk`"M+j+^+Ԭ.f$io~ʍ3ZzQZRh!l}۶hyignU,5Or.
    -cHfzò1K'>o9ݽJPlYK|:$ fV�%}wx"<S'~+D*{6F@aܙxrWw&UWx!;ߊ§"8NDhШ5EÕ`cH7ZIғ2J:cxsaq/i-
    (_o}ǞD$驕lݺi
    +z[W*{svV؉v'b`2e20>Gy9"KaѕW`ĨZFj&nS/h
    ZmV{Ӥlu``Q*aAKM}ⶓp{~Xv#4�,(Z_f,i=ƌ~%M%‰t<2
    Χ:C'4aǿw(FwovXPi(5ɟ)es$AW)w_jnIsm
    7.DڝG;gam	ZPuob6V9`;瓙s䔉c7sZvo_W#ይ\,O~ͽdDbs՗m^3%R,{11KɥB tz퀵[a(0=ּZͽ~]tFYw7ۗ._o|WnoTC]R:FQ{G+sc{mkfشdc0I=c.DMA0R6!b>{叅SgN=7b)k2 ߪ"a?qlU"M["[5<m&M{ی/_ �}VEHs4s'(n^ޢ	-Ieٵҩj͖
    рY+?9h	hѥɤWڎunZu4�DŨi(R-ow_ڷv>6Wnoԟ9KjNYޭΈ*. UOF5z%_@TP;25ǵx7{.ʭl+^gnKk	s8ࠫ#ﻷ]~&Ies0>zÞW6v7ork=(<qؽu[ٛQFhGb4~Txno\ciDS'fCtEEvt	w86 =a{tLGd)z@k$X<! sCT!+uhSW׿jfa�ɈYjьD0JX@-@,5ףR'ܚYxOHkcƕ?sy!xed<FOwlmw>;{Goa1S=K]g[U8Pbih}3Nj0tov7Zpݴŏ?ת/}�-7Kdb@IpqXc칏}Cy~A=~yk/6e;ʊy'lj{7~_';pwT3: [6fƲW_7~ᯒ fg.
    BN2a<-e3csWxо۸VxPk3AHXh%|�[
    �nnv5wCl*^mce4*Z.nC~CXHg+G镳O~W^?XuF=Ul7s{՝mTFɊ[$@lKh8c˫_o~FRd%]nN)[[7.֯:c.Wz!CG?+ҫW_~+N*zmP92Rp-D HYmdjvr7iw`͊,<vA5Um		L|1n&l޺]Z 
    /0s3Ujܦkb$jlb	A|Ȗ!ƷoGzT9ݶ0O%\thg,+BaYo,fOtf?tu=Uג5-Zᙚh,G/b/]X2�:*y,M""sivڡ?7~J?hځqFtp'믮|n曇7:땎,AA3ч7ʴ۵Ћk7kDQ֛O|3d
    ln~~W߸|n{ T2Hg)Ik]}5p,?d{)ձ s:rG@e$(T�509v
    AуX41_3&CK0ٍQz~2%8mBV!~}K7ƐaQEa
    y^}9hgD(`YO`ᩏK6ݿ	\6%cF
    "(_i?OfOCݣg!^st<G�gXos89럟
    exSA _(/Xvwg?w/U}I?c?ʫ7FU$yӏ9b3S9Яŭj&oʯ?ߚ2'?:}D~Sf+*ըdN>s~pi|-v OSOW-vwT"־_yO҉3OէN}3zAh?b=|g,>Btِm
    %!傆4잂]+߾qu	�".VM(\?PZvj<G?	Yty}w_.wVE&v:}H`ng'?]aNe
    rb6X�&K†k,n\_W__YwJ&jt*>t3FӳH2ỷKO>
    Kg{qXxX(XD
    Xaf~s:vS܇|x¥/>k>btj
    6j]5[m^X&[X25VkݿtjPNoU,>K/  9WߊV+kj<%LsBfk\1<H*`Z2/m>]1n=U-՛M"1U*
      JWFLA@D	w<eȜSC}Q߹˒=53rj"<TAne;זJ8Ȝtٱ?	젻鵊
    &Xfd|6zaĮ!ko[Na'_m^Yr7tr^2uS'_8y
    m94"HmYafܼ|LrM1a[/?%~J+?W;ՃJ',J4ytaʣ'ztnv`U2tIuY=/AC<3ךj>yFG$'hlFG(f/Iz;DpQJ~AF^tFq:dioK*$EBa7ARozJ_uxeƶC9W&rÙLV)oo>>qf#_ڮ?q蕎?6ѹz^|m9=7�MQ]wk~f+Wdۨm6oDl$n{`|"ܩS̏2{EShBHVq?;Nvn:ZZ5v	zK%AwͲd%,֕fPyfǧCyztTaS~Ͻ=ș~`;{"i?{08655QXE-bᕥЍ	ҰS,|Pbyl-"m2]`v2D)qOR=1aPu1YB5o5lewD~^JƵkdX*`ڦ:_f`SY+?w+;vI{,m
    ={Pra'khhܬ
    b.@O\YMƦND_�5[]6_yVy^n6$VoEnZo<dp
    7a<+Ϟx2
    Vq<,HB6Rwڽ
    wjF|dofm`N'(ͯ@mHr2Y)/)TTQ:<&Rp|>Etd-'(%x&դE*EEhdz*^xeܛ74D,ME^JKSp׮rjo1(Vj݂nRՊH1d[~/]{		sݭZ}c"<έo^QhT).6?ҧ?ӟ<}x3B5^xnl
    3Z7_7_4tV~wKkӟ
    oUZwlygsgKI@y! OƲh5ʃjrm{2\+}4)A&QINEOT>9)ʇRF"(B´-e*	+Ad8pdU.xev
    7/`nDہld7o<yؕ1Rgx8NiMC5iLдS_ukr,J98`ZTS,<|C=̹㙙(6SI{P)
    \y[lt\k_s
    QσJa7p3(]v`fqT؟dփZF$.<_Psoe;:yN
    ${!]
    )ﵾ7kәSm!`HC^@=OP0Z2Q)o-,o1WvQI-ŘfF~?  }Dto2m
    ;lm_3ɰn1z8(ʯbp@Dt{s֕?Z
    L$v1/+Ӟjc?ou�10:s^
    np<)WRE6�N@:;Om֙
    ]'SV?WW/.Fa!ųg?ɩ_ϵ.n^Gܩb7^{݅ɔ]@.l9\6^8IEQ}/zlNR*atx(qD(q%e$47F =y"N|X+YfM<*TœxH*P	q&Si4eVA,RhCR!tRg+h7~{L^lwk7wPYZ\?-na,^]۟ǧr=FZ~F\;cǎ|LO%evPb٩Y&FmByc`wg^orKK!kAB;Hh2
    [Eu־*g,!*z浝K}vdS\G3JLO98j&
    -vCpez\Dh0RBN$Ah4|0jǷm\zͫ1 y|I/tZCDUTU3ܸ0SV+'V.nۓk;fb^I^U
    3_fƻW.\?4wz&I&Cn-_=¥??3Oj{{uf0-{ss0?vd4vz&QXLLͳx%RIQŤ
    6`߶"SVñI?Ȥ} 1h~>8L&>|!5D|ބ2\$:l}Wo_9=sLl-ُ8ȴPpR'E-w Ɲw4O\w|~㋿+񼴺|a{Y08
    λAz,BAY>Cp{-3`ܾ~-9r>L;{rŋ.]&WgRY{ЌoN(N7_y ZL4td4cxm*j?35F$(ͬk!jB	u@ABl_xkWvvJ.t0q:O-;xNm%ZխYuڥOXesSOLYi"#}-\
    swC[z£Ba·7by+Q`/=rgґ'$)$RAԜ,2;dW^xzJ&Tn5nX>;Dvwpzlen~_TѓO> }T2KzM!ٵh).lz!H-N9Q'ۺ8R|V{;jREZBԳ<}$k[EVIxb:;mZ/_|i|04fO2,sq.9bV|cw렿{ڇU!hGw|uwGWN|`m$JNX[2qzaeIW.mlٲEs/]^g$3(|̓}'`s3o,"P,B
    >JZPAak|yx<>w7>?X
    M"aEPvWVfvŗ^fxꙐ{f8G9׈_G$ϋLb=;P g>mqCk{`_=C]Oz~X�=r{v>rj{71v#S+nQ�{V*[kϤSI\P<qLD"�ym)	
    (N23F+gO_c]J@5*yβ-;`cjݯr
    =ʵsOcn"񼔫<f-?9g/#Q-%tk~׍;ܓ")-gANXۃo2ھ+6iawu]	=C-7-guu:O/4BڇYXHxvyf~q7o3)^&NݛC,Hh6@F
    ݓFUaZJ#+<|^vP84Ǟ?sO鸙uDĈf	$o-"8>",Ms7гZqkr}1sʆ!PP*qٽř}Gk{(x;ߩ|
    S$f,V)@)9g[Y|d=ytee/e[_7v3AnTEa'AX
    T09=3&NQmfC1劅Bfe:67\>T8[Pm@yddzؼTZ2CD崐wF-vi:Kʫovǖӫh)6peJNCO7S;gr~YI~Kphn*4Ɩ-͵w6kggՏďŧh2-j7RSw0,Yv?j�$aՁӪ`]VQK./g<x0e"'`8Bi&:NJq<Pҟ"_vzZJN!?�c�@=T<*<sfBoqkkNljAڭݯܺ<}gW>vv̅ya@ bPP.]=ZC~M{*9),XHC]Zݎit?+7/w]hu_{Kg:5;i2x(n^'kޘL/-%BDd:iעNjxw;!A4lDoYh#6e
    嘍ԑf-b3Eh[Z9SBQPF>3Ek޽ƅ/ljgйn.ʆ YrhrqPEs{i^9Cyg6tFj@d' ˍoKk{7=AgÃٹ"xģOl)lnXB<*;"-m
    WEޑFR \փ�jj`m2.%ʅCQ|qфP!RE͐w*
    <hnkÃ/}[/g_xd@?la$ >hx5{Q\+oW׻[~̑2!~6
    DabVMB
    SP;`:3UV~Wg?CV|WSh1ċЬ	NE|頖k	
    SȦƞ�ےzu6bZMBDvLٽ,WKa\Bp*­2Ď ?½v[źy
    ko\fkOO[y*KcQ	OIʕjJM~UD'v
    x6]!2y	}g&DuLū) J
    ;-lgwG?l~s\kYeB,
    #O"k!3gIgRJp=a(%F+mJMrl;h
    Vw"4aY"ڀ.kRj\uo<wsG=#?<);K+׃FPEVQ;5(?_`TZ,!^~1t
    =7{/r雃POZ8✓^_csѥl.^3!4RAcҪe~_.
    c�Hd<b͒>nQrx_!}
    q:8\l4DkR~zpǬW/xK|+|O/[
    Nˍaˇ*~e!o_Is*K^~N5Qkh,TW;>omãXMI�4#s:tj.7*_^v]iU;�,V%#S_̠/~*b--vۂwf9+,(ţN	=	7f)ኄSl6;xM,MV}Fv\e7ϣ+3\15557<u'[Sv`\-hb}x#k2CŅ@)jH枯<Ǽ#khƦ晗ϱy7>ͷE#G.pQ"!jr]\ΥU;˅͝
    $D,uHӴ):	g36\M!S삔!fK}\7	tvx4ah,<О#XBd,6GBray(<fv6{><h,Ǟx'Ӂ%e|!-a@8N8M+CAl%Btm,KN6xȪ^t|%bm'^k?z)`x-lFNd7j$qhzzq~y-VQ*7ja`-茢苽";F$Y~_UCFڍ&Y;W D|a*Qb
    q$*4
    Pf+je
    ּ~mWϭf3|yd1D+f]YP*GDgh!\BW`I;`z/ET<4ae𯞼6	&x}m\%|ͷ<8	XSU7q-t*on~ۯt̆dQvvJOM;v^dډVnG:ZlFv	Eו.zYx.`QѴf~(,ndPf;V6߼Fݘ[J̲ı3gfë6pGszʇԬgwh%
    E
    >BetȦr#o7;>΀٩c+�'+{K2ЬA(QfrühctA]M+BXte|?Т#.lmcfjff=Z0[jem##4`l84ᐨK@Јdی\t\ccv5_9r^7/,GVyetla5s:
    vCXi`T2JSV4@=Gʔ<x彄h%acچ׀zsm2'*sej3CUT͸Ui}`dFcVv6<l;H=~̩3@k%#ݰRG@oGyDyO#t&	25A{ue"!27aF+v4Z]8::9Famz3D(Ô˳9,F6u+k(ߦnF^sˎ32wR
    �G6GFfÇһ̞ڤ>�"sBh7o!Riir7.ں-^za}}=
    %cH$ٝ<yܙ8jLفQ<u>b{Eȃe%H9h\YGip(#�78s1]3*2S{vutd/JቘUȾ|z*.�5ᴋw%3SvsZR=4"<6E'jއFj1;mld#[>	SC'_.׍2#-ՑP7FHCJv0n.™^zn^37O<8LӠL`JH$R0؎S>x8B3G4AD
    Vp/·عO=DR
    EoŃ~Yg(I3i{n2|@y2P8*֨A{V84⑵yyû弣E϶Oahy2]iÕ*~9,1="Tdj0_a_W/|ߪ5H83%f2lvsVF\*,woӬ@XtBVF3	A-ӫVFPނkt?yEP< Zۂȝd!9榀fqFqyHvpHpd=#TmbwZ؇0Q@6iM0y*bҸ29m/^f n]|_9
    Ff�igikZ{~雯j݌%SVMXCm-'J<'|8di(&'je$;C{ؙtb`a%lZ!;*m/ Ց~RNm,Fذ~Wұ'WgUPa<iOh{o(7CU	iS)(ѐPC4R:XD	<L;ɷfi}kʕ{M_ēa�^,f{K8i8KEX}>b6u/Vn
    l3ᢰ^^:1?Fl%WT<`f
    %&ፇpc(_ 6`	g+ㄉ_+�K)zU(87%䣬np\Y0m0:[}črĕm490nrCj&JG@{p厴"8l%rD@Ծ+rZ(&MN
    f@DXڬ#˦,d8V(hbx+Y;KFGx(HӀT<};TQɭ>C,Dg
    O|񭞵!룾g|i$]a%qdzM\'ߤgc6DCe!IkSry�Č1l){l.-
    DDj=�]NtAu4Ԋ:>12!ÌљU>��/(;DkXU^T-*1FGqpF둩+LLݮ>(>^D06g"=k[ۤFƧ26emkҷyFOQvx6Y,`&&U-18D5‘a`%V'[Ad?=<-l^77XD?Q$^[đ
    Ds*hL\CjꚜVs>6+KV qem_?uaUJTBekJë%FuyQ:i@w>&/45y?\d'GLq$9^^06IiIn2%ۂGDIYH{9H4v˜䮘E	K PLQ"5܂{C�Nna{ʟԢF5"Q_hJgLX349BFUKC8ϯ{=y
    yw|pKSim#+FO/o[]G.L.M"|qeYi)Tz`)w:B/—=(!2Iőz5ELP9yNxiSlE!@g*6j?	c'ܞ͍$&zwkSJQ0n7v"U;iGcʒDI[:Hp_@"wI
    CS)#x
    *V-"˟WLga액?L!:
    lT3StKٱj7E؛?Oj8U᭟UYz#‘	wmH:3ɽø/!nQo@TE:J%'?'yHs{Ik08y۟wR
    e86jbmXhMQo?BA{;RM9sUr9[ XHE)zFgv&=a
    SRZԫXN(5BʮClxdN6)RU)bou;L|h6q+!M>w÷y׸UPE+Fٛ<D@O(q*ցn+`m,NXj[JDS8ӆW
    WLEe2LU\p.r
    :,∀Uh
    ]Ѱgl{*_4d=ڥؒ竔:<Ucʷytu4$UyX,}dmLc\FpDy]S%e[yZ-	anIpqؤb#{OVc_޼ $y<{./Տ%C<{FtΦVXyg9DZKoG}ɘX8m"DU-/Mޕ4�Yo۳I/<j1U</_Gwd{h¾=qgGҋ1=7MqJJqh:?5n_fl<˜ N><$(I޹=6m܏ͽRD,L,kɍ6cbck;_^L2y_1Bd6<
    ;exz	;udbRG(y&>|`7|c9p'm{z·M^jiУxFU0(K`<qjφ5*cjhmC&<Q�H=v?}ңbϰ?OpQB6JSɡ
    ]=zM;򶱃EUE:$x12a#=q#kQGTxN=b#H[#_l:Ҕxy(IKsy
    ݞdXTY&y9( amܑKxa;2 Fp38R
    O%Ƈl)6w/�щmepc`alvq̝}^&cLٴN|M䣛lxQ}<S=U=hXeCbؼ+gCR6ivSRLCI3a֪C;2##@P{.ebo=9Wy;
    a?Z8<#3W<2T^Vv%59V gL<:Vc˓Z:U:-FpS=z~n4m4t٤yvԝ#x_=7Crx\hG.г3ew<z	tct‘{"ǀT$FmՍzwէ^tn!Y1FQxhRwɏ{B�am"qL0S9Cӛ@|+;BC2ByQ7y%wߚxz;==]]{sԓ'mޙ3MܻeT3NǚI"mh	V/4a,&>~7B&zw:3q<>=/Ϧ����IENDB`�n��LMJm /!PNG
    
    ���
    IHDR��������@\���sRGB����	pHYs����+��EIDATx^$u.\\ü̼bf8'vs؉)f[f-iayzVR{%+?jW3={ú˼z<&eq.0\eòK"^'ȽO{pu,"2P/^;2wu&[+*S]*P7/+o~GhH[ckn>Øfc)/Mm°Ԣt)!o`I<~?zuӋL..29w)rˏx/.e~1q4wdYDMC~[yY'=`?],-;9x0{y_V66n5bT(N,:P}ZUIJ3zi<G2<VWP
    pr)왶F֤8[>|C{f=x+*ӝJP̗Ν>P~"Nmiʽz^weex^͈Z% lWUlnIHk{H40y<yܬ[;}$8NQ;;v!˻GJT%rNeeh\c+;oH9#"Z5W7Ip3<2<x/
    G0;*:nΎ,=Ȏ1#@q(`[_L?G2<s91\븪v5DW,k
    NE3<g2<gI6MWn&(2F.y*Ȃ;@	*9A|\
    _|!=fȟv]sCgO7$_dRrd*[&4wrHTixxY0
    gv/1p?>p78{ =Bh=mx~#A?2xLO7IjE\q@�#"`ɣ{hzAH?ոI΋uyY	,#@$.ûm.EŽc2oLΡ	?/xn֋|/݁'"I2bgsc̑#nqs6y <*-%g|cFJ4y!no7{BɋMH16;/:LZN:gq˚K}FBCtTlc~Lq,/''?Gg;@t1;Ȏ!v	>n[.@ ۮ;h*>
    rJ_7:cȴkQvMDYk3,V
    Vw7u_:vm&' N/b2Eh׋|ÑX2I:-1#QA!=CQ6mIy/�4z[_?3k3r?W"6g!KĿ!$pq?HVkp|p4dFqDbmG9Wa|,cq&ʷ<X>vY=OQ!"OVdqG9<rx~KρH3>=y@^D1StiE$'",$*D~RMuv9L'`uթnQh8pLkL
    Bcl,HzU(,bmIe-pt+`xGw,Ԝ15jխيXNilgh1Uvb%ïZxDiB	5<n<"䧞XxZQ\= a&cEƐXeOd7U
    ܴ[fS!.h8p
    9U=dpFͭnMpy͵ᨎs29gN`%1n
    2gLNdnmޜ*imXQj{qQ٩A+NV,Ǫ͜9keëhnt-.<+h	Bz0?&CPq,HUZ<O!@kTuDoLXZ_4Ys\=_8:vh6׎jkn9v[;jƙ*XN[`%gB.$ƶlDds}+xZ7M`JH"vfi0N)E~Nug!`v(\le!f|>!cQ.vܐ
    ?WHI/{ޝ݋'15Ϥu
    hBA]�e`#몫j-nIgV*˜&Aqk61$Bѐ@/YmJk*'W9;SKLJqMWpDFiLm~!)u'j7N?R-)Ҷ܆]]6%Ϫ3uS
    Bs~r&cp;~9y�|Q;/s|./¥8E2hiEtљ&B2ͳtN7*l!
    $5Ra
    9{qL;6I.Ʊ}GwfL̕eFjWR}rg2.&cBwI)bk
    ),lMKG.iTp\p7j)ڒ+5m~ΧRyPG*j9-6J%h4j)7J|p^B\T	$	n2swٳyqWtNdŪ[?猱987suVEihe+HMbmFh&ՓJảFX(2ژg\"ԜZ)-jE#^DWJNlxǔ)*EE&WȬVa4kis婹,(f	XZc"	",GBL	%zI(3mK-|5Ӟ>2:|(oGR9C&XuE0-螧_"d̄uhvb3Uh0
    2c~ҪFQqN2F�acD蕣SGۢa%(gٕROLdr|*\vZikLyv_:T{HWr՚Vw(f[>_ S/+mժP"Uݺ$&NdPKEzO~>uX8TXN-F)/)BR!$;V´5:9}4~Z(5ea,DBƚ^3N>m!,nQ0ҧܨ](-LXn&ZA,$$^޵PS['Sc&42mC
    $s%nHR'?%!sMgT3}VP=cϺSO={w.y􏬈}CG-ĺc[L6ZS93=WZb`4F7 D|X[\[]6jӕ)P#$rb9h9PdkAaGw\`g+L8ԩice|?:	e5RBgLL
    u9C͂c!9z2#)z"VmߛBpU8T0ȓNjΞCqIelZcpw=lw{9mܸP=*W>
    E5i
    vq:S4vM?q1˙|+2gM-THw4L2'39$);,*Ԍ;O]=˝>]?)5=2\cɶNK$fkqu3Oie<}{z8==ZvH{@VDPA.:wƜ=4;AzbzKydMfW9n֮!GHx/WՊ#g
    NaBE)SjWZ@öv	ũʘA>e64STc\.Q0P|֮<+&$/ 
    8H`gpYPیoEc.G}10K1S<W\NK$/Z:jiUN#Iţ)0bbb_A5zg	R+Or:)h78e"d%iӒwyC0H0D?p'h)kUDS,4#q,nO׫>q˿Z�*q܋ڢy_GadG4uU0L8ΕWgNLAĩऌY3}j<s62;u5۴$KqޑO}}wQ+pӚ?L-@95x9h)B8ЃKf(~U#u%08H+sm/%?r^VXBԂ>J E3foSYuMr'׎6n[۱Q;ţ
    Pb@PaP<"5(./0<#ˬ'& cvZd+YCxX%=2*E:[/ 	htq)@NDB@Rz>YNX}vL\36Λ/8(M_(#phHӤ"D6B%;
    u?`AXԸB|e˛p
    =:?pޕ|_ʳ,*k滯.+ߛ>ߔ>.]^{&F.AuqQx}uOwFU,nx%~%]%cy/#>gύUY\ 2&Fi|f(;ml/i-ؽ<G#0ҨL'jfuYh
    =
    DOxd[l̹L3oLrsb?F>S(ٰ`TuKwQjnfEn!.flU-[g6@c/k_	1z\7+ 9QBPHS5S,/ay!1嶡rBȑNa&¤#Z^ۚoN3شi3ZS>8	katmGnǧ_;PIK]ԲvfXW)]O=U'
    `GOhPQFKv?\ƿ:U;UbjгEX~v/Yj("�gд_B\S\/NJ@v
    I'
    # YPBU{?}7O>ke]q<DMg237gNf\!Sӫl!
    s!`l63;Uy5:Q4kbrڢf!.*9YT9VlGX2VlfcMSJ[.Ud0:qtmGz;rBJǬjݨ ;bQizT4˙@,+4"M:%AJI"b %H*nZ\-m@.\|4gGi"^*j,>9*UN
    דzza礇+g#9b}7N0ӼauoafSE(La
    k|ifa91Ɨ}hyo
    " xu7
    ^ؼdYq�Έs`pH>WSs̭޷u|6_>(,#TПI~hi/Qq4$!NǻyKw{=1Ò*JI xbT\9TMVYs�-0i"mڢ>_#y{]"n"2l̮dN_Lsy3?٘l9.Z{m!%T&̍kԛf#Sj9뚎+j%FB�W1ڢH|$$?pa}0vl1GM/:s;w3T|jwIrΟçҋ{ފ4�zQ
    a근'G$D^ں[f-:J}_7OtDT$!r<p]kaYRkن?Eۅ `=}]I"aRH=D+�ߦ$LdR@�O;!h:K9)2`;"C܊AD|L	zu==0C,MjMxMKA[u(^FM$r煺 m<'kXɅլZl͈?V
    ^rja1ZR=Zk\,E�:btAF	9:7dUC-yゖGi'tSY6a4Ŭ6ֵJ)\Ej0,'~EI/ODI4!!p>Y}AQD)I�GÀr(̹f^3%g!Lff/5b4
    s1:[ȏv-az1"qH"Y $za{fy@5G\m4|xQ8U_Ч7do]^eOb8S{p"<,_cxBB|aΎobVyA.2l_�3N chi,
    42k{=iz䤦ϜKD1<cHavdz'n;Hqa(̛̾
    d4n9dj˜Xi21ެ-f-SxEVmjWd)("\OKFa^%P2"m0(;@/0O&
    UR@Qd$819Ix3$d(QEQIRb
    1,_D}	DrRYsxcߨyꈾd#9k2Ѩ35m4: {l^%5-. $2SY-9gbS�rl.d`F"Otp:7p!G1,|U׾;0
    uK&"/j}i@BB!ztQPJ%)ecmPĹm_J'-9hi~f{jړ_J7jtdgI/rp"nyQ{_?|wok/|G<5ߣc-d=AJ;^;V6ᬅc+}`d>,B`(4JVnv(64jY6k&Aj9N"(Sz	`TOt*
    b$kA$jQ}Sx
    sj@JP[P8;dVU^>&
    #/ֶzr0 b\/pk%>٧@[D1,�zj15ۜB:>[=[ϟ:S<=\;>N#8u4Pc%2LN{ي[q.3Ms427̙â 5
    3FWdѶ#O:J="v}-i+7D*�ءzW
    H,!=Ծ*q_`P<{JXUw6]t-`qL:u}߷JQgmo7
    b:C"r>ǫ?{S)J!ybtqkH4	ش劾D
    l5׼Sla_Lw\u_(t9)Q4-1d_ըIMjOtLF=,sIg+	.SR`jA|8@D5CDUJf
    G]I5#a}:9B:JJt c1.cn�#>w4YQ%_`9j͹t/Ջ\6;[gfն-
     _7nzrfNUsе7:ђk}yK-^w'8Q*ysզKmŞX@)a/4ʒ[L-RLǐrJ!|O&S$m;>*
    'fFZuL򊉵{m%3:M3Vu$7O/xWG;=!JѺ|4pY㦯/5_Dm⍿aiCFYO3{P;GWr뻯r<po}r4H jEĀ8vRO2.|[F/$Q))ZlIx
    }P֑$D(@|BdK8;cr>0Ia?9#Dl+TJ0$ևG�eQL>z9WϘjSSJ\,ͦ1CJFڴA%4N1h:fZ.kN|:XrVY+OzEHDlTޞ$5״)ὁv"M>r
    y�xZwf$Y
    i#^`޷< .Isisژs}N{j|BjSfHe_#|MEoÎe>4X}+ޤZֲv8rvD5s0пZմ(IL7FWeKp?ul񯮹}ZRO=O{a<|ނiK/)r"Vkl7N5FRb{<L
    ]ml[E\I+gڅH]}Ņkbv:k5.{$Jr]x>bp\jYar8>|% ^LB
    La:E �
    M$1h(!nE,:7g4Z\M=,~F@ԂzV7y=oe>dWp$+5L
    hL_KY&BDqˀ#iA$Wy!w֧ ]8>eu-ڞh{Vs=_kçNEQӋ5!)-޼#_Zc);;]	_xeӴMHh3[g?y[u%.;L3Ge'J?}>tsU}@(h:.)Tkڒ>8N<WC^O{M~_k
    (kvl	LJqCoY4L.'pbeKz|+!D8Ltrmׯ[wp\ɻ|~&sQt< (X8b!":+Ċ@	鞑{ȢAHllV2=!^
    Cnpy(UKxX|)!4{CD4<Xk	;fO5
    Ts+�'o[cDL(<WLЪxRM >_,tɕ
    "4G%5[ǛwY=hIGHDHDz1US)(o}#Zc-<3]v_w<9|^Ht&+mA2'♡Y'C;J!z`N荿++4E9V# &$3;HaP' w>(#$`8?JEgBj.NrjNa]|w{-ݰALKN'L3U
    R lh~G1UM1b.&OMŰѠq
    xDبLP_HXpd-lҴ <
    Loʑ"gƗhI?�Zn*~z
    ޫ=1<В/6ȳCHA/ B%J&S?kJ3U!'&*[":	9D*eԊ(Z)VHme}WHa=D,bJ![DC%._m[+%WU\!ၔo4&J/$w}r}7|!W"ʗ4y=p0�rC~,3{cwhO}Icw𢂆aa $k/1Efw"il)5eӤf&O?`=O<sOw|4#'�yn6
    l̹v?<3p@e!{"7^ILSMy4Ie벵`dg+)be+ͪilv
    ֜&Ƙ*Ě:b6P(|/(6p$G"$#[CHcxo754Zw @`bY'/k_4mZSHn'L3%/)M^[42E:S+)Vqo�C^iA	!vzF@Ӳ:Deo niiCZw]]	71/^M2Xa/haPS"ڔ#:W_E&3_@Şd�bFNT?`P>[34d	tնpO*E+]ysޛCt
    .uU{<'ɋe\ca>im"JGnZLp?X˘DvFMBr ATM)Q_?vmrK5Ĭ5ac7aINF@6N�lKo84U'dJx4A@a# Fь0b
    	8La>,8#LIlZlvqKɛ0j-/|3uokW7_Ug֋_$, 
    Ax#=PO[ő	{?-<-ܸb!QGh(Mϖ(B/sx_Pm-۾Zl[ɇECC/EKQVjH@O%՞,"
    \Aon!Ў?í;ȸr1tdX[ߥ\W+ES =uj&3"j@>{-0յCT+Ʈ;E
    ewחz1^I
    "fa70,`NHpPY+M
    嬅E
    TޤDlm-H4V6#R;sxCi(RbIKm2?n$ctȷ9l#h$NTDP@?kc`*esë~ JekWJ
    ;Uvw8-֬nز:az(6ef9DƷw<C7:<gf8v/|G<)'Ϙs}Zu0"%S'01]
    0a!E &֌e!dt�oT$>Q;sfj8bZ	Ql`tD;LH}8I	]?;xV*5ˮĹ)>[>sL[O6㧻j;+CߗdvCZ8	bQ?>
    N
    '2vu�z	3҈gyqc.kGSx�>m%Mj܍X4pObB]Sa aVD'(Vjp~Y-Q}JG
    mim$ZCa<6&ִ0%ty�I
    hӒ7h�>".[E]'J[J}?tFDݑdS\;F:ߘH哓 2+М|W|TahLO
    0F$Ad~ʉGMqQi@@ۊ:>&3HJw#
    Ҷ`A^ZSͣnD/2(e
    �{+B9MNԶ B-zHMS/ƴř=H9ndՇ.^n_4J7%I:a̭FhaDE�=:䙸i=,6MAW@Hkcte�S717ý4\$gͨ/jiRPVԍ*)xH4gYng3)x�-!bW`Y d{xHш>@։�jtÏA2a�LF%<d*H” &ϐ1h/|&B\,%l;2xB(]~qYr%NTDQ XMgF	hZ/\~M5	w&"jQSd/V
    m]O]O<IP~fB j#K?S]UWc+?ڪQU;={SA$$ E{\C-)Qby"uZo fz0@fKNlp:^FݘYT=l{)
    ȣY@o"&FA1ܟ
    4g1B@J$
    т�pXp/9Ӕ.N{wؚ=ܗ?](V@N./ aV4.#�
    #\cU4tU-;TIy! )A"QʔP쵛NGL$X2@(P-1$&:qdR�D2�
    -Ad:3WlK7$TK<zbԹGO)Q_X+N:LWYbT衼K+W|𜞁(F/?22`wrW㶡p݀sgxzr #5D#?7O=|y]*` Zp;||bX7wK-,
    Mw@ֻV@S9LX:8P(ۑUkq`!ZrBqxĕx 0ߍCmBjx#N{Vh @i^P"y|GwCY&6SO
    D
    8	
    U
    xwGEW*؆6)rFqEll2Zs)F<E^!JO-,	
    4о, fK,D`n
    ։LԛD$RHBܑgOl#Ϧ12-L뤜IOQ=_KA؍h
    (boZuHVLމBL~pE/;g�<=msb)9fn`"șGGg'>'". @1pq>׶R*I?05{ˇ'eP#؞V8KHFs9psw|Z/re}	U=pג(/J`ErTh(hny$\#	~>%<ݻsA~
    
    $A"<JDގDzK%_A9nn.fm15`5̀ak.6L0G}b�sLO45bk`犍"N9OXt6[seL+'88abi~@Ye'_BtiRAm鋎LQK;!^¸$36}l`tTHAP74Wvd@"P~9v$98G)gΌQ&ʞO;NW_+އE"gHwq	5mՁW~R-3p44<o~\=Ro�;168+D$@2Z!};axdlJ]qj>GIFC-ьǢ
    aM=:=|]Ia%m<^P_F7?nzl%J;_=|o5<iݘCԉBI-m{FM	R_GFJ4bpb/Ƨՙ&[:n
    =4h-[|_F_T:-8<Ѭ4
    >
    =!:@B
    :GgJ2(bH*`V`uZ!YCЁ&O4j76I|fcB�bU[F_i]SKBрDŽNzZI#!A
    :32p0 W+_8mmQClP>"j/x\Q{xvk>‰N\}qd2]#5F�muD_;7Ox	7g}\v#fa"fIJ]H)XM鴖D^dt^bwq&NakT8(1V`v?LNa1I͕Sw<v&8igO8QڀOB)|
    ?jV{T:mx$j}<+ێ
    |Ek9+Z 66	rE?-³}bۻRJn՚QoXHT\'?�4-Y2h;!P0D猰
    x$bѬ̍.͸x,@5Pv	h҆@4P0/փhz.&HKPKZ5W/)4I2:!%$"h;q&T,q=H_5Ļ$juHU=]Ulfܸ`\v-Nk;;j&őA7U ߈4G33\M&koOЄ
    :H35G_ªWX A)ɕY&;/p24Zfh1%q;lՐ5ɮZm['nO˥OZ9$7+~{I2C;(^'^oZه>>	ueu':r&G@@ZNx>#v :"moIĝ#Bq49C|`v"qzŧ?¹2+z{n;yqWMX`NcF)J1]8
    M'<?Cd:
    7;=T6ʞa֗D~0stYxiZw9U11Md0	X'pX@xr"�bh�qPL%)6z5qOZ}Vk܈ʄY<8Li|>l?RI\5Gjx�qrN^]U!_B[qT$WcnXj,Z<9Cabvbܽm-B"!H}MYIwS*kq̍0S`3aSz#=fy:zŗt:QZ{BICѣA%Vg9S^vvn|Kb+\jZr'vF=	$$A8awv9q0)XVqX͉ƕ̲K}l `yZE99kAn|x9Y|fA:uT{rJ젲/DV҅<+w0N�5E3HP(܁1Fy*:(C%QFI1)<p@aU\d
    VgQԝrՕ醸6J_6z䴾l	K~5@ړ]æw	aJGD RBK"!5SՋj=#I ܑQ/fw8T
    Zb)BHK#g`n@*]4YCuD2(@:J"BR=RzVD3pĊ D:@b+zVW2Ip1NL0zS/RoJBv:l@΋I+:i�=-@H|4^AO(0CBlL`52 U#b?H&"޵yi[Kwnb0~PoBl JV$-�ȶߐx_F7򗳟*5+/#3_~|6(|l[‘ʉ"kq!#uO{EkяMԎZ>yp͜=2k2"7K,N8e̎|[[l>$wW1?bePgU}73͑%%2 X&J9]HiCﭛӺ?�tL0Sٹ<Px(ޕ8/y
    ~]2%Ή~M~6HBS3G=+I*ȒqH^RoàU
    u"~h/٧N1BNAٞ)vHϨ,FY̟D>koS@si0r9ETWI8_0X8	$H/(%xҚwcJWnzgz.%-`M949ܨ>ɩB~B=+HUT�0H-zh<wQ_uM[vk~7;@uv넜kVёh2slɬE_7LcZۀ>RFXC(&x$,[~U+02[CDe#"dU)2
    iE'ABhlAYE=yOrI
    hc�WlVU0fK}F?B۲�W9zCKT&e؉S㤵bSo
     Y= E+dk{'mr;ADCmI#G;d̴\m&"ez>4"ކ!rVC)y
    ZWޔ	u^'%~S
    :Lpip}Hi~@6HLlRo}zjHsjF8Lč2vg7/h~FFf24k04tØ5&Ks)Sг¼5R`|9-aeID7F;�pB0	υRp@CUU8I[Jv@\-LꄼNz
    `d+
    I݀B[gk4IIehaꁕ
    1T\gtm(L~vF)?&YZꝱ'(C}A6=5AM׮d*@馺I<O,*Rzs-szo#E/Q$qsaA
    0a]<l&8hcT)R!ͶV<K
    9.b=@Ϟ3pN(5ܥG>@9/^"w{N>qwT <"$a1Dž@lgc\=cqNS=V8`5p]F(mv_0dCgZ]@.cgkFSŝ1�@ze֜POdVTZZ-h\3/ԦWw,*'Z]xg7j4ۉrGAܷd
    B͙u	R
    G�H]?^-1T³]Щݤ>gj<A;[>1[jS&RKo$-MS5qXb$<%NWK'<
    :bDx1N}#چC
    M4X'*Jaܒ1i!j:mj{KO$Qb94w!zD~)?\BzTATII/'9EKM$*l,ػSYlIo)?is\Tu`G`L.VFͬ7�gB*"9:W#g'LTc0"¡љSg?8~jqx8:U@4jݗ~trn}tnRa@Sձ$h*T-Ic	)g̝T"CѰIH"�n
    CyKIRK>Mµ>N<r
    
    Ds@eВcZ!Io
    .3I,H]%'*DAECx-ˢ6nKp)h&Hu`?֨ YN(>ĻpB-/'&>ꥼAwC[HFr@ۨ{4#B&yWJt\ 9SS#R;ݴ* 6hw;@q A1Cv`o`yƞ?\؏s”tm[""4L
    y&=QYW3JPLZ)m,3Ŵo2JRAG,Vڨh$3թc'#	,(-NjU܃ZQW'Xюv^Ӫ1O2F.a!v`ETz@v|2x["A_ݎ6	x8ׁ#u޳'7(zc_ԁQĐhH%|]zLuA{=N3ZBK=d{K+<总LO41-␥_n0
    "B-Vzjšp%nijPM$ݳTYs9ʅpnR`T<%ŧk�c&Ao Kx87Ҧ}ѠCB2ȫL}
    L[CUH%GK'3˺JVT-:7=;)/RMr^e+\%xlݤ(6j^5j~EH%{1/ 7Mn!+f9$B	|T1Xm+ڼ({3PJx!|)c2GiBu?xLzH8
    Pk镚u:ևqLUlM۞z/('[Ǡ=nD=sz6L;r>|9|'#'|뮧vșggr&^0yIXS_?E/k~잺ט/v1Sz%^5eIlҙ˓DV}K悝Bjliղ(i[S! <#@uֲHa
    aT!oY~^=eëp'-rAl`<ҲK#i8s|Bwʫ/~AvϨ-R|BtsrxH8Dzے煹:~pv(@Yx%'7WZt*2ٕb/O4Lf0܈S0/
    H^[neЖTGW{(l.7%tJXd[VmqV&FTV
    4
    z:Bcvò+s[ =
    xq#<:sGP]'UTSkvndp^m_
    YC7˶քܖu
    yBq`)Կ]&Hā*ˤ4D?.ΡCE$ֿvm	s5ʚ+lgb\<K]JϼphRG#4J0Ɯ/J߀CDu-oRX18UXՂJeK'W,_6\QP]τDtP:6pl?6=fdќ{Ad@Rl/s@mR!V)nϙ#+O `%HP ++$[/
    `[VD^UG,bDD"TI�.}xC\Ѩvv;֧6mq\oj'#[6Ml
    +ql%މynp�ݴq`ֽJpuFҬf-!C}'#!j1YAUjUƾ5†v>	w.ո[1Q%!%M Cw(ߌ*:庿_7k[v!bj
    QY'!Y$PbIR9|~ǵ>.
    \}WC_
    + ,D)sM˥")qҋYZxZWdƐx:;+>y×uYB~:iA>8r]l<hdM_P=08KPT_E7>|W؎}F2B20Ox'vdmK؁`T<?Z
    
    !@Z2
    YfȲbiT}c[F[|Ù>`
    Z:"[wtQk6oi	[56Uh&�33MҐbg==c3*pڢI+0<k#[:^H99;Ъz'ڱ&4,c7WJDRb|}xN[щ#wnVgpE9_.2?6>)v`XxV	iժ.^0Bǜ;}%=2
    mCLiF뷼Y?]RAHkҗnwiT%w	'.>Yc2\Ŏ]~ucW;{hS_,N1]>_WG+?yGAoCǾ*?@?+:/i<B}q}fv
    NEN%Cv-}oY=Cl@�{X3?c=Ifpԙ;W>`լ8O.gT5*Sv ŷ(-zѶ`FM*wL,�VOy|	jFf
    ڷtᦶ㫶'.>pb9;|>CeAl`us5,%4Zrtf"qΗkJ#7WkupUf}3ܟײfq6%0PVUBa7'-$m׷:
    rw0>^~cZmv&IW(Uun%#ڻmc7Jڝ,Yz3^$oDLlDط+0xMvtGUOݫ<`a=CvOm;] .&R`n]/6~'{pĎ[{]cI/sGGoEV~($]4#`wv'>9ʼy~άjI/nۆ`֑I',@Niva#ZeUniwÿLe^{XMsZYo3fO>-og`;7YavJSv=/&ݵמ>`};	X+'`\U|\hJ1l=x|Fp>`4Tʵ,g
    ;/wa0g|wްcI>1ךZ^\9OtLJf㶣JEpĥU�F5q�Ǘe(*W+"5}}fls3J3*GeVE3{$ ?Sd hMx*#'GIlNwG_쏏.@ xfk#@V]csrkFe$<#gxe8#ROc֭$F׹p)w
    En߱O]?]lN۪໾'sn w^?^8/to%	6\:S
    *ldsscf?̉|SYw#"S]]+ -`ԋgAcwDf`ϫo^|-tgBo-M/
    n89Y6w}>7;N{9vöLqxi
    ls{V;|?)[ovmUASOwoz7cɲY[BNJơG~ςw8mJrCk`.M=n2yXþpT׭xc$U(͋mo6st̂{x}jBcnJ("GP-=Z8
    u#n 4]Ǭ&
    (ŕ
    FU'By'
    1X̟ݲՑ1ym:3	K[,鼅m2HCCahZldd.Ք3={80j2jR}`_߹ Ao4Qq޼Wuq mfEfn֝8uݔ/%Kqqhu6@9v0QSa%#Y}5lp׼.GHNJvODTpЅ7kg;S^8f՟.D=᥍ޯO _+糱,iηv~pq?$4'm!&]ʲ;X*ef#Ɓ7>(m~+f4@lE{ߧCo�9を;W9g1fO/M甀[`c/T֓_7JjwqTU)<̣)uw}>T m%&%,pS]bǧ	݉nj*:/Rb㺡;*}=x(ǒbA!Z0#/:
    UC̽Jd	FR( 1tDq\{|ӕhEx"ʵ*D!t6F\IvE56ŊCVL}9<-ړ<3en73xΆZH| B:hY2돆n[NҡVT
    {!n+,.5&2H]H?sN#~&ϔ?*|x1بṰIg9VmW^SZtm~,7k V#Q:!IvD⣨Iʬ(x[Yx;|%eOny?R(a酎x<NӾy)NI0AduƩcI775JŠwҝ=d/v0);?Z5g[ʚOcT7JqR7{y.̩!m�ҡm ,g33Q&rХAxopV rߚR5@Tژ/ϝ*bC|Gs&?m4՞^m{0CnjbC*2kP&Ym~CGn0&1p_1-dUچ䖑Xbaaj~̙G|PMYҴtTRr;66	\Jrk{<b\&Ql
    D=/839wAu6uKR$v+Yr|
    MJ,B|yנ@A}>׹Bel۬a&[q;%EFb
    -Ck?H(k~ՑK7)tG	aiЕBs,b:N_M[.T.c,.0m+8E
    GrFC5JA^D8QJ֟@e#'Ʋ8hUb=ʫ>y`Ү׳#xlqJLۖ}F4~©h:qFaM\|0+lC>^ԂOf9
    mVz.�ٚ]Z+lQjW7Cݏ<xS2xi@)P^ӶH;HuEWCEh-U{"b&<(aܻ>(R"5AF"WQυTv6ȡ)B욟z䠧Ah,,p
    L0_<Dt.=>ܰgW֭By8dtȎ@1VuZ;=n-؋c&"XM`=xir8gsR8>9@d4_3ku7x@.3l۪tkgg	⣰y\0	JV�9gҏFl\N;n\	qExZMsG)䒱I.j^\꺀
    _@ n~fQaYZ]Zs<ۥ< KD)N
    MHMR|	`qixq.K?/_Һ`);QW@d5
    ^sCn#P'3yGP\2ajibj>IW;]eq[qne̅mzz1XU7D7_`zS#SCPdn|];mړ{tAܽ},sѱx",fb8}W4W
    9QTNCj2@@؆5nR&}y|eY
    vaU }}W\֗
    )�6J%iwucOP8<T-!^~2c<hj6"
    ްtThi+6HD3)zqVUi:g\?<yMg315R'rV:p;8_!&90eW6ϴ	ek	k1<Ҹڮoz
    k7w'}&Ɠ_l4R.͌>bChYM."jin|7o(;q{n?1;7	$?BTh>i<j7s*?ptQtުӱAIxxǻaO͎a		>yߧ?c|NPܘ?% c#VHFyzqmV8)` ~YVȗ}n;^oS5&Dlw̜8];6}YVʾݣ-wF$_8T`Fr泳IZһT:]F3Y
    R0M/+-ӐP B!$#HE@5}I`kR0(&G@PZտ"$F'J+Xleԁ2;TFvÿ4PR(Vh[y`ՅusLUNV|#=tV&db0+&amL**2Fvb5٩[<ND)m.tWJ$
    =[n 2'(kF@Y| Noy]_TV!9DmWfemqqEaOݫu]V.pL["�o܇H,tAsIOwGoeu[A"/ #
    r$Yg<qq._NyѥK>"<)Mj{|Rt%;ك\o{5w8a5n|52M`E?y1K\~Uq.x #{<zqjݹCʖ63#'BM܍ם2,.4lX38	I@!}2zd}mz`*\۱
     FcX">Q_eJjQ	jZ0͞H_-[' <$)9ÍA(<FF)ɲT] XFft4pC+m㧎
    
    "[\W*U,uWv#t_}ȥ݃G;gt{SU,6_kX�hإYu$!%lQ	vBN,VSoWHriΟd^nFt 0�Z9L^	03JmжKgɮ)ⓚ%Ԃ8VJ`<$'94yW1GA4Ыbj.̝AE̜KAm%$ώ&�%䁝xA5#v#H!,+1ٸo1 	KEdRR"̊Ծ҆K,f)AńQq&f͚?йCL9m%>1�B&
    +F㻘ݛ-+Z~Db[+j!^JkW~\Xt%+ܑŅ9>S6T<r/43S%cu}7y=~"w,Ldk@wT<3w&\5BEegwgd QBa4@͕}4Z,-_Nӳne|3&O&c7\حHw,͎Ώ
    i
    PUObWWgOjrU+/k.cWmpfM`å6Oc{y)H2Lb<(\QJRKN;cq`ʧ=Ch�9SJLGȒ̗yhdot!AxNg	.ѷVWLj/fJAlH<o5ނjӱ(S"%	!=ml[	xFSªk+"WG,A_(oy;!>n17j{L~_F95w|2x<*zMbg
    WO_0R<~*p[b=5MWyTcɦjGZlF}Cφ:�KW
    ;/F"_TWvS} Mi͘⟪E!F	Efc]fb@EA\.l|({`+uKisÉ@e;:q%_Aws~e^Cˏ?@U
    ~)pvŻf7_^gnWyX[/�,;~L>+5Vł])2:X<8#Ө`ƀnĨtCsIThFG$2KDbI߸xQ&y/Rp&^JpzFu2i>o$
    !ci~N2i$"=&Θ9 Dmo萫7(D
    HM4z	zvy%'!/Cͦ;yypmxlyuכL;宱pP]9{խ,1IR6X[4)e_C�6aS/|e&7Jq	fm0XSL7\\W"U6{zQubФΥr9hqkz{8][b!tT¼ofwt]pfO~Z�<w}Ӈ_mkܟDu+_Vս[O	m}{W=^;ӟ_ln/~sv/]f] O];.w:k-�.]3l=&'L�`I`Ɏ9FMszg݉?h�qM(=	Ld3֭[^\2Yz7JdwSOL8PM9/0Ӏ)iRvUDR<(U	[tJQ33bt#Fˉ~9|zXk;W!c;I'`u-OxG"zQߍG%?Nr�R<;,"LK+F_vFq4{h<0rWW7r,Ct%h5ODSk!ӵ!G^sD*
    f%ƍ%Fg�
    :	WnEۺsÏfV)L+OݞI41us0ppeOyEꆰvzv+:ا*v,7εrctop֝8d<^Kf骉>I	#9eo-!aj눳I,vJ;w=W[gtwӘzj!H""-_Shs!Iilw)wp^_l:qRO	y3^Aq|6,ΚSby2Œ͙!vf1DzGR.S)9,`ta(m:R*;o~ǩN΍@̭hv\qA_߹-;G5~Mҟdl\I
    B
    r}+&FaT~m)%InC_`1|x
    zUEGZ[\vo 9FȊw^Јt#k_y~3Vn%k֊۲ܓGGcW7dsVF*\վ<e{x7Z6]:$50?N#?
    =
    g1~GJ=C+!3K(M$hނdzqBgF6L*{fӸՖ{Ё;/4uVʙSsz_zG2Q,1cb> lV'6EϻuؕK:}C+uxujmy'n3ۘl^}͡NlkPېF\~X.'‰v 5ԕgrF{רTK]ճS;I?{Ƈ2j1
    `O֯41;JtOE^8mB3Γc)y-Lv6նx0,Jl!t7њM}KeAM}X=6wZͣU_'ՠoűy\=xxNamW,;8X7H)}{Dd)l—g%*kd,'!!dN|C)',ߋ+SՂ<&I[{hܤc-8"o=t	
    O5f
    3}|Q%kuHژ8H}ߓ/8®(Pl
    U'ǃE	+һ JveVEdMo?;{wE"[18W꺪r*
    n聙X{O\Jw`{pva#Ky"ԇ�iOzp'}>-Ĝ;.cт@~)Y7>}j{nMloj[\۰ѷ}ptD=m/med$uc
    [Ggw+㛱[ȶ%K\&[ܶ:AaSޱکl3QoE-q�eFkTjU`m7"	*t,K.LjjV
    =?F<2�캦�]m̊3s\	R"E4&A?A^6?3I/mH_@KS2iJańr'oLr$鼳0kN=1$|k^Դ=_.e5~S_66_u46]9ؿW5{?xWp7}}fu^xr=SF4;}3?uܼqkEr%uUCiWc>h-W&:=2$xhuda"iHBEٶx
    9maE+A֬VH@08-v�aF" H{
    LbW,YmL\cq9sCdko(/^ͅ
     J<}pGا3]G+O"[_!zހ4+3Ιu	Ɛ[Ŕ:yR8<噢S=՟}J<xe,7,@ICa/mV߬e"OQ	ٓ=%=4cŶfnK	_yl!~ϛUƉāOѕgZ.C\Ȕ2xɧiuJ3v|h~Mn.7۾ud>qyI6Xة+1b3 r;my̩ӟǧ06;=W-V5+~dX.)J?$e:X.T�gI0bIrV‚c,Xh	=zmP
    6;Hm^pN=`^:RzV)yK(qT &p-H"�ʦD%FCGk'mZ[zdy72%~.>~Z;2kŤy^
    A!4"3q7(,fٲ[=b?Š	Z^%k>Kv{yeMS
    k6P|OM<]On_2$vmYoe"rp+D}pN�:`qD9:/vek5R)ƭbfOqCԽEAE=p}(_YwIjh8??oƂ'āYn?BŽAM6	;𡲙 ޲PaL_d00NH}jNpz$2zHhD
    =BOEzTA訰(	GFHJpf3CD]m" Q	cτ
    #(FJ*N|ɕɵq!Z.bpʐXTQ˯	mWLO[4=Ork7G/Q'GK:Vq<Yhuv*
    و:<n)mlIK32~j{xR6cBd8}/ضp~Xvkk=EvcL5#-o_|鑓KFloy"ocVk}4tOTJHʌտN>z"Rkc}IkT;bmzMY_uul{_WRv;Z4V湾m*_n[.G~(NbY'}tw3{PM_XfJ1X[ĒYW+@Zijhm^UUWTJUV##Qv&WzKM2CF	khiM>t1H lx>|C+}nԸR)�8b`;PmAei!WU7/H
    DBB=?8#1)KRWmW䱃ic5<i"]-3O0`wWtMCmx➙7)V6t(=�x)M7O#x"^?Np)ڧm-knxoK=#$	
    CrOu_�dͅuюL䳀ZyVvzXtcS"+8up<]Vd=jFgHK%^]u`=s$i+͵?f9#Gܙ.qeFT9Mr|[@||p.:8t[a`ubpЭᵴ#咫/ݩYLPpbIsC4;>喵-ZidL0NJt.
    La :Lu0LvŰWTtȡ#FY3t?d'%wPt<VBq͔
    F=wǻ:{ȑuR=خFV	a;;%l:=
    5tF
    0	XV
    'ML=Re7Z?]n8]lِŸѩwͯ|թ%ʩÏD5z;>7wt)=ux9x_+yBiI )Ė<XäE`VU>lny䔁)wQԲ9:ɎqNj;|n@XXCwOf߲+u]0/?݁j-IHO}})qyǛ}kk$3-n䝎/`na扇ӷ+o|X@o]Ɍ]['bOQN?9̑@q'L't_erJqsk_Gn
    .t:俀|q;M<\vK2չ̴0=c-}mnV4*afDtU`-;n)tjA)8
    "A<H,	%1�bGTd:.+HD҆aQp�d92eE]j:qA?~|S[xnj=;DW
    W"A@S-(d2T}N/8kS(|M/t}_$dzF6]n0{V/ƪ(fdO)*[})75|O 8ob8Y w�4s>/n`Cto8b0Wa)5zP{/o5Bc&IBΝ61֑ٗ??Ŷ}Sw}`SYb>96]o2C?r]\n9SO{]u.J-qRl	]$oo-CkgNú'Bm=BI.]]6( glEX(P>0ٷfG6-ZV<f§IjZG��yA4&%/='D
    @	Ƈ
    DY*(1pP&y!73$0\vkWa>d1KL\FT芀b=pIҟhEwFj҈5<Ȃ:n<9\=M4Jo+.pqKWp>kjS%SqO^/9ee6g~om7K?#	\e7al7oz6>R?8/x{@qgk5H
    4RNu߷՟n1xf6r/>e78x3Ǧw6g%/B&SNm7fUf7}ڇ'X'dwGN_Ҹ#ZCIh]c0�ZU]HP_⊵#'ĸ?<pE@R*恦|Bf(EHH
    ~+⑹Rx
    "J$<yF
    :z˵bXoh0�A-pǠIRiD"�JD!P96jZekydɊb!?_R֨rD
    ٗ,i~RS1|QD0c\-ki*}AF6x"rs]rtqfw{??Z]xeE_^UM>WCWoߛxAe-e6s4AF_ʀمcw'^Ld)_ЅUꮯ`Ůu\rũ0-UBǾtyHM*+]3ٙ�G~]2k4'	v\0jjHtV3ВM]\�?msQBԿIĶs{칅
    ťui{-;N'pAK>BZv
    Q^Eq:MO9]9yz(H#Ps|UkwF|х`
    +6D~9U`MFA,HTtLt:/aN-H2VF0$~y4Á1	F{ÃB]zqqwgz
    21`=~ހoEnMD6(¢賂6.F$7B9srQ0l'q=cѽ՞P%5Ly:y~ژs~wLxx#N,ⶇXT&6:SG-Vb'l}+Ͱǭ#&Peҟ+E`\z3v {6؂v15%3($B
    kl_\{#Aaak]' MViM7 ߥjDNIBNUl |էnn\5>eS_|Gn.yg!y~;QKqʎk~Ka W?V_U	$1e[O6DG4RНZ},!c/XTkr,	t5
    G�rl	&6Ɨ-VfP }HR
    V�t.V,kY�㛈HL5Ԅ
    
    /ʍon3#SC.n.51�b)H
    WvJ0>}ˬmc:;B=\)ҕ&:sRPҾ
    ]6?Y=Drs5†(Wh$6bgaPv9ujWG>py�e'2()_z~2.^.+
    7TEV#~Cx-y^/0mm[2HIѮ>}BS?+]~?C.>؁qmw1KX
    k&zcY+b|)gDј;j<8;7Pdډ_{׾sF>qv�k=$Jɗia/߷fhoK>5k 	D;C<r2}pT!Ucljp,7[_dy}Ԃe`ͣYILUoVsVwϞ&Y^Wzs<ݴϔXV6V`VFY)i�|Z@W*4C/O#'& 5t
    ]LobC;TؔOs3`Σrdsεm#"B"|4o|
    vsLtc
    [IA%zѲ_3%`h@Y͚s|{@EcZ
    pCU[_[c	oSO3gQOh[K)T0_eFdo|!0g6N:D{|ouᅴXq?aV_05~ه@wcwfKfFI}Nnӵ!bPcO#?[bm0*5S-߹i?�D/jf}wnivzGcwbčt8Ckf_%טfM\|v=<x	k=d>{!O|2̯$$-a/c+E7;oO;YM;fg�O4~*yÙG:5?4]˱
    d		3:h<i8"5߃m#Aa\h̤Γv}Xj`n䱉p1=y[[EG(,~妜YPVښ[b;CVy>h`nTXReY(-3.%SBrySI^2T
    820i}2ce1@HR;p-+kۄ.?𱸛9�h:gaIE4r@.m֓%dU̓lr"lG1aچ@fG1i#Hy|ykQb+.dCO7`EF*蝫zs@І?c$0xнq7Jt5~`+0|JF.xFyGJ[+v%r2z 0;_7K~>^330Lȁ_'90޵x	l+m_|E|5Н}U{<f[NԔǏA߶×<Z$
    lksTuq%c~(7ObDžҘKRΰ8mP
    !\Fɇ
    n(zG-Hm|!
    '~WGAC}ވ[	#�".WSFՙȇf2܁TvB"9f@KV2oK+U"ζzf*=)5HY<}=
    -}XH%G'`:&eog1Kh&Ns|y:@_)jMZD¤DVUzp|D<Yg.I+AL"*x"]%%�>3 K&@5)ȝB#Veg}|*s
    v浑_侽wzY`p U@Ӎ'rG&c*j
    %YGBWv.V'+#࿫;D0`
    C;[BYƓ-HXL10(>.$o N
    ˆ@zA&R#Z,60b;ccꀍ'AJEU &aXZ'J#5Qۻ/BʹMQڙ:2
    oi>
    6-\]v׆w"\PN%0Ʈ1(0ٜ;2 [p(hslxiBsA)0
    S#1t煩ù#<,	<upAm~zFtYtSsGvIMҤ--.	,f.99V?60/ʁ(6@ x-95GMzYoX
    Wu%6V6&L}XP6hvf&; �ޞ|7pqh$m;[CgPn	:-ԦgV"OV_su-d#PKVܒ8`!VloBx#:]_;O5.[Ro
    l1,Dۊ@D[Vq>s dI
    FI�@PM@+`P�T^m5�`|YЀ
    :	B*SZ8ϙ|@4Kz0gs*Ҹ7D9'@F%bd$ٜ'A/n^	QXRoYlg5Ykj`Y@}z锝Pu4;`;Q;wer&V1ݖ"Ɓ#4OqEh&RWP^uQ屔Tw9;}\7}A-gh>'KU0;Pw.XHCyПXӻp˒ϗ4)sBDͅdlq8Wɪ bCDFXPD9D|ZXAMTH5zrwJQrj m[W7ĸP>m@	baMELN&r>.2ӧ絅־cп*ŵg[!#X00"Zetc#42+V1og@D•^zH7ʀS00HI:.t5 T$aq_[ 2Bfi-$kR0:sy*@(c"F5F9[-VD<k͈R%oz4{$ifuyc~JD*׉φ`9	!x״S5܆؈\2ϩvN%{+#B쨂>&\([V\D5:-l
    ԫǮr;LHjɲ_0$ۄye'ˏ<tD#;d*cYkL"M:ОAR0�HpOnUHmJcfS
    Cⶈ輁[6%/"r"f+ҏ
    +2x~\NB'c3I=z9fLHPq!	Jp"؊�zqMXuk&1-c\_	aM&vi`ygΙy\rdۉV=	<k<
    S?DMZ "J<$ϣDK	ӆ+
    lL)9N]ZzE&'Ti_Ue90kqq)!:
    gs=L-.4bEcA^_shU|I!.o]&]; gߟ^.tPZxKHs@>|?&sS㥳f|XUXNLci \BV3qE �\2:he৽>T32;]!.ټ?Mpјygn<:xvH\qxiF	R %dGJ\h1p.M40'/B{<@'(DKV~ќ3OC
    	
    g
    	o&=>^V,JM)mpSNhq^(RPCxzi:sw9<-sy7[j>
    @it%8dv.!D#\<*D>"KZ7:.x ՘XhE}Ÿ\g/]4PpSbWF7~M1�rF+N/ o/_¾G96dmy0]'vQ[lΝM*/B3
    u}[Nˑ7+|9ە0@b冶-(AO^S>5gb7TGc{	&4
    ćٓaBxbvg5VCQGD@q.r2(("2c[P"DڰɪSnM(bh4ƺQaeWvXetGz=2HSw	-gs.jן2l-tpOߗj>t/DK<zTYR'_h_'#HK/s[Jk~Kqh`Gk8DLWͭMgzK@SQU{FnG*0$R:F+Fhl7UF54LDA8Tk1Y̻tnK1ʭ],yfz7`f2K	"Y
    . pjJts|Xy+~6Ps{&zEuuePw8:G-\Z*jmUۚ$L4j%$QY,``:$6%}	4
    .e1	{zKz>L#$U-u!&2!g}Bic
    GF7:eYt\r]]|Ŭ;a%$d@Q'x3uPn
    P-&.FLۗL("\ۆsyп^~V.o-_ыa5ɳ'%ߤeXBᒩD3g}#ӽ9(^@o[m/
    GKy*$kI(EW!	m)/;?pw@PIjQ
    䧴EFBUipw1ְǘLBoqOۤ !|6h!J,9>H*hѹ:<ZCPM%7̯<}{~Qᣳ
    Oܼle~V dDTA^S^0Ȇq_׉ï`2;O-hR0YqD|шND
    ZtcAOK8KבBP,PD]<gJ\qb:xBPX:~_({d=ccR9x}sv?&&PxWU苭#G)m'WB|4aFr>�}9UX$k€4
    Mtn5(\wIPr%dy
    ?2PbHc|_훯	\׾K?DND+D;{ƤJMϏh=Z!ulOF*b˫ZESsKZFEEճ{?ﻭXm:21BO3uZxD8B:
    2M-r-ZM_�E=TmOU-Rr9cVjHOLiy0*ۯ07WCyW=Z;A&Vt]^<D]5ͦmiMA]<`8d^c0'
    ߶J]=W;[=
    7s؎X4ЗxpYnՅu]$`Ҳ[Yg!
    !^2dmbrCrB1b[)IRJO)7U+k!H|.2e̴1Cn_@>h%YQ|Aوi\7LVױ\̮T�ba<rW4�RĐaUo?yP<g	nл~N6@l'hv@(L!ʵ2nTZ8
    جz3u-lk=(	%1ίStOKn27=橇ٽYq#V"7pʍs(l۹.H(*ncJl\ri)Nq$S<_Nv$[r%V,-./w``T#ǾwqmI.f˯$\
    P˰1ͦ޻˺FWKJD_~nx|?cV'*s>SthIs؊ЅU}
    `Xa{am4;qaC	'*s' `@/^,^>L֝:Xa>
    ~oY&NLU[;(Mai;cLb}i8{԰׉͕#?W8UǿIqcȜBP	l"7AJjfL \2N&3nI&P,w
    @;>$-)-S9Ys@K4䇭&j\JnoG7=#=Bfù͌m2=�N^ufU)Ga�Ķ�Vd`(
    "
    
    
    s­3v\D"S*ajLەRJr�uh_U8hpa䑋jt9*r-H[k$vK+Fr�_@H#<c&!b;x4	#L2ty'+TALn?O])Z},0XaϯvGO!A0
    (wSS5[WIXbf^Qs/*G.=kc)#?tf<NrӇTS(c\SPTj_y�RiQ,EK~Jj懿CϝL
    ]MR=l=@RG\Cnk\˶~GlMO2	IG
    f/;x̗tçq)w?ul'~A	-̝{W?&?3>`
    K=V4}+{և{7kdؒ/®ua,H)qz,> Oh!,dӱսz-}19sRW*Zs<i_5'vnҘb1_{'[JY6
    'vK֦—1uhuuG|K
    ,p4iC.y(kjf6
    bG5!.NG' ss͝6l+d؇U	X()J)ɴJX.7rfpѢDH:Y;VIbqA*zP'~KOZ?nGQK_(^2E]_fO?´b;nrP/?
    r5~P~
    �\y	KpoX
    Lf_',PuHMUN~�-{GQ%X\GMWs/+6u(ׄ}&blI	\4l~,ȯm٬]f-Ъoe	dӊكƦ _~ZhƤc_hoCN쉙~~Z?cN۪yc)l(䱯oXa)=_لb
    P+6Jʰe}HMBhEp
    >w?w%>Q3h4ҭm`tXz2W66ϧg|t]0Q洒E+[Ha}z:5oq!y1?|RbGRcT?ZYk΍!	�(\*n?93(-&x묓X:;;z
    _,N_AFW%3*K4Hn73]|w7ǷԲlwhhbꄺFc߲شq{]uW=ꆡJс:lbPքh֬K *_]	:ENCV븅]f<%~Z8k1xEGYG%?öyu͝դ$n͍<~;%n篒hZ֋}IRl&fv]lNtᡯsb3,[ySKD^b伭(1U/[ȇCZ2+BĖ9[[Um
    a_RN^gY{v4cJmyRe(kQa!ƠG{A]3Vt),{(E(S?(t`z0қ,7ǟ%UKucθLW4Cgu}砓mn1wuWl|X"67j>we 6@(Tj	W
    &-S~VdS;?xt*tk/.έ{a)
    A9iߧ[ J"]OZѵ{-0 :|!NJlnr*6Q&kɌfZMIEE҅FKW6
    C	&7*QTS!$&V\_0V�S 腧XjKꍝ@k\JQ4Ob/~m:n-xAd)ΛMw\?rTL3Gɲv_%*mc{A.=s9ۛɎ>ÛܠL8ؼ*٭7ތ-..SaX|�xco=6r#KG}RdVˆ,}	$L-+:5�!dVo7cOTw9x�Atߞj2;fSdL	t-4|0&$_Xޜٜ|شJ=
    YEstxl\I޳ճҤ5iǍqn-lw(&ЫX*^nѬ^ΎQ}oibՉ
    {곲&M͞ʋW*$8s
    C A?nL66eR&]0.-KɕL=u}yssDBչpr2索\jL�dB!9I,]Ki$Pb H:yJvۜfJj2b|%o*ȇHȑH|@dT2"|2 i[F]Gz>4һN.~¤@/q)D:A4Z,{y`r}0r
    /�^&TTw>U͟μ7,VYK
    d`954ثK,2A�dфgC\덤APM%�؜~zE`v^b9@\8'zi#=&o3K	ɦbwPcPŻ)*
    G#i~u?xA)#>kPlpv۴xu}B<0;$E&؊F<Rcm8P‡EʃY<!ջZ΀T*3epܴ'!l.~NG8ww86OħLْ߭S6uCZ.B+b['Wuv˶
    sEaz.qOԉkc|j$u6�.Ig,K11~$) X
    -T�,2Khtɪ>,?8.�X3(FTs4,	G7sM -X1�Ev<s[vQ@
    ^:}` e
    ^{~
    %aoICA>x!궀4™<OSD]&spb6D+Q?
    5B:QD뢬g!2q6+g'*Q/3LXDTi耼?82+FNƱC23~DYOĶOak+t ghixL͛oC~lvy	
    tpU*DZayn!zϸY5Ϙv~J	MR&7?kW0uow?÷ZrrbFGJ!ƱFmjdgS'sCAWVCϮ=FIi7
    ӧWJbQUň=etvr~.#"k=|mw#}al"n3
    ޚ_9@e=Zȋz9vߍ6hc*~yTU`CADZNa	- L=FmE
    U\qYRi&ʬXaY1fx1O`!U.m%!xkhV6h<1%j$1sI$Zx<Z:="A9197~K
    q?H*kqc�*07|0{<"ڡ	#XA0rg
    <5ʱPD}ұ}e(ч !0t>\2�]xcҫ_c-Ś^m0f؋5Jί-f-e-03*
    CZA;̹O7QIi$l lr]g`,xW}g~6[T8?\dP8cpxa	O*v]ۭ63I3L
    Vd"É@Ϻ
    +@\\x6=gfE_Q58`޻2?q5,!CR w{!:)+t<(ɩ&ܚ;9=3~h<{'sF
    UiRңZa^)bIٕe{Z;|J(d�UP823p'l~9ASTX+@%eB5/Dqqih"Fo3O*\~S%tr]jؼ~?/,0BE
    jE3VCKʎG=yN<92-@/d$JxpS]0+BVP&^rYd	6LUĉ|;[ҫA)A2#s(alzS槫ਆ>/
    eLmR O`|/ݶ?UM?VnbUy1l5YתQa'h$3R{B<Z!@Y\;fUkqxc�)")yڒpҠX,z۟uZwLӁT0u
    &hYCWa6>h|;EǎY}_SbԚv39|<Kf�BvvvBO`5p#aJ5
    χ=}}Lz6ЋA5űKbiCiw0+,wV'X.
    )"CЂ죝"68G,כ2q̴	
    VVc҅h8֒a!ps%_J.FA]J֊>
    
    D*%5YuHm4tC_<
    Vo/M\	
    ا(AAKil#$[}_1?H>Ciw_~%GTp=ɓ/ywMn9a(MK/c@T\]:yɗ}a vf\ +l$ɄՙXG7{`˟x%?8I}1{+Ě7گ^ίtϠȏ>gIWP3Ǥ%VoVwpF)Fڞm]=jj!yiakvm{u玙<5X'_)s)[͈(NvCUkKrxo#|O}!zz&:2zZ`qASsKy$5Mռٚ7 h ~˶eyTxuێ4?|iy_ӢS҅ʅ;-!�
    T 2]r&q
    `IsGE +"GA%mwpDh@^/
    �||$&A1NEAk�
    c8
    4FO؁0wjLȪ',O�saLQanH+Iz^W,Aon߅Vʌ6XVTBa_ytZ&?yF]:g+"dԴr7{ߩ	']tDlL'sA\cǿCo//&^8-2"-!pICե?Y;r7Pe8:	IĕW8@DX\:рiwu3ĵDu޼۹N֯[^b>P^/DSH:"v;Nƌ=}[E7GqY%p:zd dك�!:(6	�X^t=T%Pɉ)7(dl>ky
    *-N3䏼\eE-T (J#jD[�uS.w?ZO`ہH|y.9hkq!Hy
    A_97(F;.
    Ba\Ndf@7cWiPqZ=&'-J2X bAYEF!�g
    _µ1�B	oPG� /*.+S~SU?|ȯtbO/V�cY"qӊ1(;ͿotL	S&[aㅥ׿%2"~0o˟֍6>[7XOYcOK5¢	.rҀ|n4~:/p@<O A@YI-v-2<ĐFE\ڊV2+g猲RY2aed%Fܝ�n`и@b%	y=0>)&bb4yaZyjwvM(@�CbD)eRH;J:tqdж+Ϊ}^ ՠVkgF#$)[j0&\S`@O$(S%x\U:}UL~`݀{2S4CSL5CQ%A
    ŢX_5[YHFd8m^,yee(z$t,M'p+}
    f%k6Y(iC{LG5�ԭ1QwΜ�l.fSi^7C(4oOJbSgYv3}5q%؅ӗ"Te|o$tm,kd4A>,
    $x:[ɯOQ9yb.?d]4	@+*0skԅoд@
    
    :BSsD79kM4K"^pc`|e%B#Y-pѐ;ˍ3^@_ZdEK)BR6jPnT#S*iѼ�+]iqw՝fŜu.ƎG!3
    V)(Бdk�pW9oJM	9jc8csbi-V᪯uBkx/C
    dBJ(@U	Rs+P2;jPс~wZ ݂T+F"8iiLНֿu}\\2cL7i-tlc}'gD/1zDoPtf&ٜIvT+uBӒR0SEe˺~]39=Jq֔Sk4(2oB(eH.Il<T[l>*AHGRSl[lU|M~mI[Q&<$6ro⠭X
    9}Six+LNcec'4
    +Sς*Tju�飝p8v~̘	0q^<%`�2çk-
    u|;~5㩓m!xhS|BKl{*l1b`R$ة@57ė[PLb"gTijscGlF|ˑUyObGfhZ*P
    &-%rk[
    (iA0mp�82<Qy(@ kMҪ(@)	\
    w:tP\뛯~9_\FHrM&oEZ:y08RA@23W2#\2nmjqTF.k4yf(tzG[jpVנ>O%Q(,nVO\2ӑIt7\�jX[q'#ݹϨXmAF>XݠLh\5wLBR!g\=!@`f#R_^Lcs5LpRR6O@:-RtBeYkeXdkM!!B(,lu
    DF'ug7Gp ߆Q!D$xXS]^2wX=8@ys|%iX-=u|#:}J<.5#v7A~h@q-<	dWAKI:FLaHy\Z2Vm߶^U	XW<6U ̮fs}7;^*�@ѣAfE_8?B{"x˱jkFMuQ#3>suV6{|,-Hq+VwK_<[ݽ"^d6]t#JҼTHmZScJ|,>ftEi^SgK3	Tȁ	Z4,JA0ЧMiYr0X&$察:MrQܥå�Ō1
    skL!J#"g5|bIWhт%b)gP-Չ˱scP}ksnn\|ZK\
    
    -m&W.2em9z]mw*P^sPt>X}HTZduCLfVz<BB;ZԂ�0ǯmh qxaq[	QR5|eui]z;iv2|	(vwGD:0nrt້xt鼖Fh2qVs*	9,c9^k@GaQ2I.!1":×;$lH{{dY#\bB"ĸ"1,g0})3́SptFf2mM1ZM}zYBgM[<#ҧT.]F;
    8w(`~	;WWVՕPX/Ek
    <JHqSq%2!t?!cQ/4\}Ɗl:OW9h m1{!xwT&O%	-0B<˅xPC2
    }Ėڛl`Wh6ʮlu2SchSRqmMϘ̎L%FՀaLLeYLJ[9k�a h'@p`Љm^I̶J`5XNJRd5M`xPnˮwgKN(e-QdMXD#]YM-G٪f
    >sw	1=o]M[F1 ̔:6\墲]0pqm7uKel4R2qoP"JP̮meNkik`GB
    ))_!Ժ _</wRl@Rf4]voo \Xẅ)lZ-"[ƹlL<7aK^W1볨N'Ce,R[O
    ^"|zf+c! lWbCL!qmMfQ9zs~^@hڔCQޕ*k/pDt֯s@Jr-XL-]==`t-7o7z7ZpiZ(CR87Л;0)qixF	d8Aפii~:40٣X#d5n_D/zE^0%׉)tᥱ~Z-0TjX>KUn&'W-;(IM3sb*TH
    aZ9Z[�iC3P@qCOgp68$~rVIL)"`Cj-H
    }k~2XX	병v
    D!.�@-d&q&opcWj&Q`lQ3Їz{Euv$:]n4tڸt.žrDdE
    VYXo64Anub+lY>2T]PD{CVA=`3bԚF[LI ;
    /Hi	AJ=&_TSN4EBQ.<4
    Pev
    H`.C"_W"dAy)+7c5JRX.qFYg
    %6�oY*	--Q$}2$<Ra-
     0$ԜYwYv'S3pnWeH~8EKj|3e_+ڹnrcVr
    ӉX0F%mVFT4}OQiӸ{`.~dE7$Հ^7-nګ
    !ő$8Bueń9<`V@\BJk3DL`0V\ޫq9(7jڍz0u^WJAKDe2Dhe5_Cl(lx
    "2*px}MX@.WgScka{ѳ4A/^_j0lj7leT<ymi(
    [[!
    kןA>cȀ~>yH0ZI Pgœ!ōo	,N�w�	)juwa:qV\*x	o#dȨ5;[A�BH*L[0H\
    藎|cKG6"J`|>%/zk:N^WOkptq+iCC	@/!3H/rQ-)9vg&=\pث;jmBX9
    yݞ;NQMN^3z>yjIh:WBL`8KUt;j( 1 J4M<iS�ᭂ@fhtB/`)aPnP;'{8 }+`iF4-[;x$>|S>@]*}C6;Oxn1{tpL1idLf4)cH蚭iT̩|j54+STH$][T
    pz[Lz!9
    np͚5'ǏG_4CmήZ
    XwwPݎ~(9:"dZ�<}pR@4?C@h1O81GIWCBXgI a	0msj`l5`TB	*O"E: nmwERJ:	?QZz7o|ai'2�PbD5�*ˈ
    JM30b ͪX`=X5,G_)QX	H?ܼ[+V0XxF5F (M&
    M0УpHnPX:sf@~
    p)2b/hz|uSjZ5"q6B=PHڂT<LiC!LLj-A[Ӈkw
    s$x=~A-K:.�@#VH_BM4
    q
    )U̦
    	Y>
    ~dZ/F=4h
    |)hu!II{ cǡHS}�hP�䉂묎'B:]և 7rw9'UmǛF5`	@([v$[b@(TefAxOx~lMPAgu=~1݉/@GV#H%vK$@	YRL(hdB9)I2
    `)5]֛GbN0*8 zu"z�o`LJ	^P@'y 
    a!O<k>~hAafnR#231qɄ_N10
    tH_z\F0(]$]LxS.{O|O3B _ 陃nIQրk4 樰YSX[k
    )b-[`0̫+kS.H'r`/e$#-ѱa7<VFdx0@<Np-p: 0	hd4ʶχ3XzL>)OCωPQ+wAzἾ&m	_V-KE{)t54	T.+9E8CX3*Ώjq0j* g"PoB#3CLBe@u5v<!!0"�τ܆#�iBm�/:~'G�O$K
    >F_$I˔EVAKq8^u^V9:|@ )}ِ(3I@CRDb"x7/,9BVIc36y.Uu.[?ӮRK!1"(P>ޱxۥssZ?˾)0kɊ_zA6cF�xz<\[~.7켜|y
    -_WX(opKf^<L\n
    ~,o?o9.DHd
    V:QG:Ѵ<fA^dN]?A z.51C]׾/]?~a7VVO6_L�|#$
    ǀmݳ֏Aww'j0=<
    K7Eεa0_vQ3����IENDB``!9��wlֲ;|����������K�����/�@f����xڽXklT{,C\l$nBD
    "*X2^6^`b
    @)	)(?h)!FjJK|s3@|y̙9s]F9o&A>;-5sf[LEMMTUQ^8I,:82l	Q]5sXB<WF	b1V(q]2iH֓'"x/u,#?;fo
    ͢:R?QշQ'ۉL}x>J{è+,:r>iI=>-
    v'-3-u:Llŋ?}UG['nJ4ʹ]&6i?7R"~C`t$'9Wj<EmnEwOuqgg'+E{Þ;h{w…
    iA}zJu�gP>`3P\='fQϩ#
    u0FIL+fSZ
    GYC92#qJ_OYvRkgbCŽ}&{ȔZOo*||zQ/y2Avu岻#1+#UF}Ug}2rstU&*TSUM;g4D-p쪷6=gXq60/I2Syz5zǝ(;N8R'KY?\}I|BkkKPsLڳ\sFΕ\Z˳b919-rcҏߖ}XE?o\촬ڭ6\{^|\ >ò[</aWn XcL'˸P_YFσ
    
    5?=٩guȵßB9z='=H_cRDb7E13@ڕtuuʇ�>tÃ07(wƛX{K-#on8PD1D5>%䚝(MG
    [_%nǷm!×+q=]�aG_2_|Dzk~/�yЗ|O:ey::Yߘ!QA_rdop|8gϿf%&?<]^aeJ>~%	ܠ䣀cJ~CJ^ܬQऒK)XJ>x_ܡ7*yf%E'oS);|*J>E~xG/>SON7yPaEJTWߧ*yQ	W&ǁW*y#ps?�F^K7("MJ^ܩ|*|#򚀿¾2@:+޷*tt~xs]PC^n((cGw>U7gso{`wfseF*ͭ퓪52-G167Jks1V/{妈7(jiK[״;O{}5ɻy3l{k-Cg=Q>ak{6~k|;^mcvh'#m~HmOӲ9:ӬlXˋP]0Æb]OPnؠ'ܹc+XΧPbɠһ͆ܪ{5Oz>=TS긣đ^n^#xJzT=tF{-6v Ue;as59F}uTom:"Y<w
    [}%h?;UMޅ[eX,nrFw0?akq49l+׉[6Qpp4:Z%sgUVVn%m.AiYFĊ_	wmn)bpQ[H	n>=)DDqKh"=ݱ8fmp[ps6ҧuП[K[MK%==D'5Nn1qdZz-c]]nǺrxv,^~i$?"w���������������������C���(��������������
    ����������������	����
    �������v�������������&���l�o�g�b�a�c�k�-�u�s�e�r�@�q�o�s�.�c�h��4���m�a�i�l�t�o�:�l�o�g�b�a�c�k�-�u�s�e�r�@�q�o�s�.�c�h��t�������������,���h�t�t�p�:�/�/�l�o�g�b�a�c�k�.�q�o�s�.�c�h�/��,���h�t�t�p�:�/�/�l�o�g�b�a�c�k�.�q�o�s�.�c�h�/��b�������������"���h�t�t�p�:�/�/�s�v�n�.�q�o�s�.�c�h��$���h�t�t�p�:�/�/�s�v�n�.�q�o�s�.�c�h�/��h�������������&���h�t�t�p�:�/�/�j�i�r�a�.�q�o�s�.�c�h�/��&���h�t�t�p�:�/�/�j�i�r�a�.�q�o�s�.�c�h�/��D��/����0��������|����D���A�r�i�a�l���r� �N�e�|�|�
    ��0��������z[	0�����D���T�i�m�e�s� �N�e�w� �R�o�m�a�n�����0��������z[	0��� �D���W�i�n�g�d�i�n�g�s���R�o�m�a�n�����0��������z[	0��0�D���A�r�i�a�l� �B�l�a�c�k���m�a�n�����0��������z[	0���"@�D���C�o�u�r�i�e�r� �N�e�w���m�a�n�����0��������z[	0���1������@�����������.��������
    �������	��@�n����?���" ��d������d���������@���������������������  �������@@�������``������������\����T������`�Y������8�����������������������������������������������������������*�������*�������������������������������������������������������������������������������������������
    �������
    ������������������������������������������ ������!�������������#������$��������������������'������(������)������*������+������,������-������.������/������0������1������2������3������4������5�������������7������8���������������������������9������:������;������=������<�������������?�������������A������B������C����������������������������������D������E������F������G������H������I������J���X�����������������K������L������M������N������O������o����$��������������������������������������b�$���͒^bEN凙=U���������������$��������������������������������������b�$���LMJm /!�������������$��������������������������������������2�$���wlֲ;�A�����q������0��������A��������A��������P����������f����@��������������8�����������������������������	����������������������������cP;	�ʚ;S1�ʚ;���g������������4���d���d���d���d�����������z[	0��������j���p��������p��p�������@���<�����4���d���d���d���d���@�	0|�X
    ���������������������������������������<�����4���B���d���B���d������@�<	0|���������������������g������������4���}���d���}���d�����������z[	0��������������p��������@��p�������p���8����0��������_�_�_�P�P�T�1�0��������
    ���������?�����������-�O���������
    �=��*6�������������������������������������Logback project��������������������������� �������������Ceki Glc & Sbastien Pennec�����������������������8��������������������������������������������������������������������������������~ ���������������������������������No revolution, only evolution.
    The same basic plumbing only done better. 
    Faster, smaller, higher gas mileage, and generally more bang for the buck.�����-�����������������������������Modular architecture������������logback-core
    	Joran, Status,
       Context, pattern parsing
    logback-classic
    	developer logging
    logback-access
    	container (access) logging
    ��V���
    ��������Z�,��������Z���������Z���������Z���������Z���������Z�������������#�����������������������������Access Logging������������Definition: Access log
    		The log generated when a user 	accesses a web-page on a web server.
    
    Logback-access integrates seamlessly with Jetty and Tomcat
     ��<�����������Z�F��������Z�<��������Z���������Z���������������������������������������0���logback-classic speaks SLF4J (as mother tongue)�����1���������1������(�������������Logback offers a native implementation of the SLF4J API => Logback exposes its logging API through SLF4J.
    SLF4J can delegate to log4j, logback, java.util.logging or JCL
    SLF4J can bridge log4j, JCL and j.u.l.
    ��,�����������������(�������������������������������������������������������Joran: a bowl of fresh air�����������G�i�v�e�n� �r�u�l�e�s� �(�p�a�t�t�e�r�n�s� �&� �a�c�t�i�o�n�s�)� �i�t� �c�a�n� �c�o�n�f�i�g�u�r�e� �a�n�y� �o�b�j�e�c�t�.�
    �J�o�r�a�n� �c�a�n� �l�e�a�r�n� �n�e�w� �r�u�l�e�s� �o�n� �t�h�e� �f�l�y�.�
    �W�i�t�h� �i�t�s� �i�m�p�l�i�c�i�t� �r�u�l�e�s�,� �y�o�u� �d�o�n� t� �e�v�e�n� �h�a�v�e� �t�o� �w�r�i�t�e� �r�u�l�e�s�.� �
    �I�t� �c�a�n� �d�o� �p�a�r�t�i�a�l� �r�e�p�l�a�y�.�
    �I�t� �i�s� �g�e�n�e�r�i�c� �(�c�a�n� �b�e� �u�s�e�d� �i�n� �y�o�u�r� �o�w�n� �p�r�o�j�e�c�t�s�)���&�����������Z�d�������<�������M�����������������������������������������Configuration example:��������������������(������������
    <appender name="FILE"
         class="ch.qos.logback.core.rolling.RollingFileAppender">
      <File>logFile.log</File>
      <rollingPolicy
    	   class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <FileNamePattern>
               logFile.%d{yyyy-MM-dd}.log.zip
        </FileNamePatter>
      </rollingPolicy>
    
      <layout class="ch.qos.logback.classic.PatternLayout">
        <Pattern>
          %d{HH:mm:ss,SSS} [%thread] %-5level %logger{22} - %msg%n
        </Pattern>
      </layout>
    </appender>��6����������P�5�������,����������v�������������#�������/����������������������������
    ��������������2���������������������
    �����������������������������������
    ��������������$���������������������$��������������(������������<�����������������������������Logback-access configuration��������������������(����������x��<appender name="FILE"	    
                class="c.q.l.c.r.RollingFileAppender">
      <File>access.log"</File>
      <rollingPolicy
            class="c.q.l.c.r.TimeBasedRollingPolicy">
        <FileNamePattern>
          access.%d{yyyy-MM-dd}.log.zip
        </FileNamePattern>
      </rollingPolicy>
    
      <layout class="c.q.l.access.PatternLayout">
        <Pattern">combined</Pattern">
      </layout>
    </appender>��4���y�������P������������������������������.���������������������
    ��������������
    �������������� ��������������������������������������������������������
    ���������������������=���������������������	��������������������Another example:��������������������(������������<testShell name="test1">
      <period>5 minutes</period>
      <!-- we need to configure a totally new test 
           object for each run of the test -->
      <test class="com.wombat.myTest">
        <DataSource class="c.w.JNDIDS">
          <url>jndi://com.wombat/ds"</url>
        </DataSource>
      </test>
    <testShell>
    
    <testShell name="test2">
      <period>60 seconds</period>
      <test class="com.wombat.myTest2">
        <file>c:/wombat/foo.properties</file>
      </test>
    </testShell>��4����������P�������������������������������������	����������������������������
    ��������������
    �������
    �������������������������������������������������
    �������
    �������	��������������	�������[���������������������	�������������������8�����������������������������Is Joran for me?���������a���
    Joran is ideal for building frameworks which need to support arbitrary user-developed plug-ins.
    �����a������������������b���������������������
    ��������������������Internal error reporting���������~���Who shall guard the guards?
    
    Logback modules cannot use logging to report their own state.
    
    Something more generic is needed.
    ��(���������������������b���������������������0�����������������������������Errors in action������������
    Internal state available via StatusManager
    
    Exceptions and status messages accompanied by references, i.e. URLs, to external documents������������
    �������]������������ ��������������������������
    ���Documentation�����
    ��������������������������M�a�j�o�r� �a�r�e�a� �o�f� �e�f�f�o�r�t�.�
    �
    �C�o�m�p�l�e�t�e� �m�a�n�u�a�l�,� �w�i�t�h� �o�v�e�r� �1�5�0� �p�a�g�e�s� �o�f� �d�o�c�u�m�e�n�t�a�t�i�o�n�,� �i�s� �a�v�a�i�l�a�b�l�e� �f�o�r� �f�r�e�e�
    �
    �A� �s�h�o�r�t� �i�n�t�r�o�d�u�c�t�i�o�n� �t�o� �a�c�c�e�s�s� �l�o�g�g�i�n�g� �w�i�t�h� �l�o�g�b�a�c�k�-�a�c�c�e�s�s� �a�n�d� �J�e�t�t�y�
    �
    �j�a�v�a�d�o�c�,� �F�A�Q�,� �e�r�r�o�r� �c�o�d�e�s�,�& 
    �����������������������������������������������������=���������������������������$���Filters, Filters. Filters everywhere�����%���������%������(�������������Filters attachable to any Appender
    Evaluator filters
    Janino filters for evaluation based on java expressions
    TurboFilters for optimized global processing��,���5��������������2��������������!������������!���������
    ��������������������EvaluatorFilter & Janino��,���������������������������������������������<appender name="CYCLIC"
              class="c.q.l.core.read.CyclicBufferAppender">
      <filter class="c.q.l.core.filter.EvaluatorFilter">
        <evaluator name="loggingTaskEval">
    	    <expression>
    		  logger.contains("LoggingTask") &&
            message.contains("Howdydy-diddly-ho") &&
            (timeStamp-loggerContext.getBirthTime()) >= 20000
    		</expression>
    	 </evaluator>
    	 <OnMatch>DENY</OnMatch>
      </filter>
      <MaxSize>512</MaxSize>
    </appender>��4����������P�����������������Z������������
    �������������������������$����������������������������������!�����������������	����������������������������������������������������������������������������������������������������������������������������������������$���������!��������	�����������������������������������������������������������������������������������������������������������;������������������������������TurboFilters�������������������������������<turboFilter
         class="c.q.l.classic.turbo.MDCFilter">
      <MDCKey>userid</MDCKey>
      <Value>sebastien</Value>
      <OnMatch>ACCEPT</OnMatch>
    </turboFilter>��&���9��������Z�`������������������������������������
    ���������������������������������������������������������������	���������������������	����������������������������������������>������������������������������Parameterized logging������������Integer entry = new Interger(50); 
    logger.debug("The entry is "+entry+".");
    
    can be optimized as:
     if(logger.isDebugEnabled()) {
     logger.debug("The entry is "+entry+".");
    }
    
    or better yet:
    logger.debug("The entry is {}.", entry); 
    �������������Z�0���������������������������������K�������������������������������
    �����������������P���#��������������/����������������������������*��������������������������"�������������������������� ���Markers for specialized handling���������V���Markers are metadata for logging statements, coloring them for specialized processing
    �����V������������������W������������L���������������������������/���SiftingAppender or the appender-making appender�����0���������0������(������������� ���������������������������Sift logging according to runtime attributes
    E.g. separate logs according to user sessions, so that the log file generated by every user go into distinct log files, one log file per user. 
    Works with any appender, not just FileAppender�����-��������������������������������	���������������������������������������������������	��������������������������	�����������������-��������.��������������������M���������� ��������������������SiftingAppender (continued)��������������������(��������������������������������������� <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
        <discriminator>
          <Key>userid</Key>
          <DefaultValue>unknown</DefaultValue>
        </discriminator>
        <sift>
          <appender name="FILE-${userid}"
                    class="ch.qos.logback.core.FileAppender">
            <File>${userid}.log</File>s
            <Append>false</Append>
            <layout>
              <Pattern>%d %level %mdc %logger - %msg%n</Pattern>
            </layout>
          </appender>
        </sift>
      </appender>
    ������������P�P�������������������������fG�������������������������f�����������������fJ�����������������f�����������������f�������������������������������������+�����������������
    ���������
    ����������������������������������������������������������������������������
    �������������������������������������������	������������������������� ��������������������������6������������������������������������������������������������������������������������������������������������������������������������$������������������������������JMX���������S���
    Logback configuration can be reloaded via JMX
    
    Statistical results exposed via JMX��������������S���������T������������%�����������������������������Tested & Ready���������J���Battery of over 450 unit tests
    
    Tests written concomitantly with the code
    ��4���������������������*������������������K������������I�������������������������� ���Package versions in stack traces�����!���������!������(����������n��java.lang.NullPointerException
     at com.xyz.Wombat(Wombat.java:57) ~[wombat-1.3.jar:1.3]
     at com.xyz.Wombat(Wombat.java:76) ~[wombat-1.3.jar:1.3]
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native) ~[na:1.5.0_06]
     at java.lang.reflect.Method.invoke(Method.java:585) ~[na:1.5.0_06]
     at junit.runners.TestMethod.invoke(TestMethod.java:59) [junit-4.4.jar:na]
     etc..��^���o��������B��������������������������������������������������������������Q�����������J������������������������������logger name abbreviation�����,���������������������������
    ���Odds and ends���������H��RollingFileAppender automatic file compression the background
    FileAppender and RollingFileAppender allow for the same log file to be written to by instances located in different JVMs
    10 fold improvement in the speed of transporting logging events over the wire 
    SMTPAppender now does TLS and SSL, subject line in outgoing email
    �����I�������Z�I��������,�����������������P�������"��������!������������N����������!��������������������Odds and ends II�����������������������������]���%() in pattern strings can do magic
     %-50(%d %level [%thread]) - %m%n
    DuplicateMessage filter��d���$���������"������������������%���������������f���������������f����������������8���B������������������������������������������������O����������"��������������������Odds and ends II�����������������������������]���%() in pattern strings can do magic
     %-50(%d %level [%thread]) - %m%n
    DuplicateMessage filter��d���$���������"������������������%���������������f���������������f����������������8���B������������������������������������������������H���������������������������
    ���Conclusion�����
    ������������������������"���Logback is the successor of log4j.�����&���������������������������
    ���Questions?������������
    read the docs at http://logback.qos.ch/
    study the code at http://svn.qos.ch
    write to us at  logback-user@qos.ch
    file a bug report at http://jira.qos.ch/
    chat with us at irc.freenode.net#qos
    talk to us at +41 21 312 32 26��������������������������������d�������������������������������������������������������������������������������� ��������������������������U
    0��������(����������������������U
    0�����;���L����������������������U
    0�����]���p����������������������U
    0��������������������������������
    U
    0�����������/�������������������������������
    ���������������������������������������������������������������������������������������������������	����������������������
    �����������'����������������������(�����������
    �����������)����������������������*����������������������+����������������������.����������������������1����������������������5����������������������6����������������������7����������������������9����������������������D����������������������E����������������������F����������������������G����������������������K���������������������������������	��������������`� �����f���f��f�33������`� ���3KI�����3������ff�`� ���33���f�������f�`� ���/����������p�`� ���3����%����*�3��|�`� ���Jy��3f���ff3�f������`� ��������3��������f��f3��̙��`� �����3��3f��������f��33����`� ��������D�D������yq�3f��`� ��������������̙��3��n�`� ��������w�����3���ff��`� ����������}�������ff����>����?���" �d�������d���������@������������,�����������?��n��K������d�������@������������ ���������P���� ������n�A����@�������F����`��������d�������� �n����?���" ��d������d��������@���������������������  �������@@�������``�����������P�R��������������"��	���� �����	����@�����	����`�����	��������`��������������2�p�>���������������������������������������������������>���������������������������������������������������������������<���.���(����	��������������������
    ����<����������
    ���<���
    ���6�������t}��������������	���#�"�����`���������``�������������
    \����������������*��������������������������������������������������������T����	�������������X���
    ���<�������������"���������������X�����
    ���<��
    ���N��������������������������d������������#�"�����`��������������������P���
    H���������������������0������������������������������������
    ���<��
    ���6������������������d��������#�"�����`�����������U��������
    F���������������������0������������������������������������
    ���<��
    ��S���������<��������"�������������U���Y������
    @������������������������������������������������������
    ���<��
    ��c�$��������ċ������������"�����������Y��������W����
    @������������������������������������������������������
    ���	<��
    ��c�$��������4������������"�����������Y��U���������
    @������������������������������������������������������
    ���
    <��
    ��c�$��������������������"����������������������
    @������������������������������������������������������
    ���<��
    ��S����������������#�"�����`���������S���V����������
    F���������������������0������������������������������������
    ���<��
    ��S�����������������"����������������Y�����
    @������������������������������������������������������
    ���
    <��
    ��c�$��������������������"������������������X���
    @������������������������������������������������������
    ���<���
    ���<�������������������������	���#�"�����`���������  `���������������
    T�������������� ���Click to edit Master title style�����!�������
    ���!���������$���
    ���<���
    ���0�����������������	����"����������� `p��������������
    �������������R���Click to edit Master text styles
    Second level
    Third level
    Fourth level
    Fifth level�����!�����
    ��������
    ����������
    ���S�������������
    ���<���
    ���6�������X��������������	���#�"�����`���������^ P�������������
    X����������������*����������������������������������������������������H����
    ���<������0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���
    07���+��������D=�����' ����������������������������=
    ���@B���	����+���� �
    ���P�i�x�e�l�����������	�������������������������@���3���(����	��������������������
    ����@������j	���T����	����������������
    ���@�������������"����������p��P
    �����
    ���@��
    ���T��������h������������������d������������
    ���#�"����� ���������������������
    H���������������������0������������������������������������
    ���@��
    ��c�$��������k�������
    ����"����������9��)����e
    ���
    F���������������������0��������������������������������^���b����	�����������e
    ���
    ���@����#��������������"������������������e
    �������
    ���@��
    ��S���������o��������"����������i������e
    ���
    F���������������������0������������������������������������
    ���@��
    ��S���������s��������"����������9��)�������
    F���������������������0������������������������������������
    ���@��
    ��S���������u��������"����������������0���
    F���������������������0������������������������������������
    ���	@��
    ��S�����������������"��������������?��e
    ���
    F���������������������0������������������������������������
    ���
    @��
    ��S�����������������"������������)�������
    F���������������������0������������������������������������
    ���@��
    ��S������������������"��������������?��G���
    F���������������������0������������������������������������
    ���@��
    ��S�����������������"����������������o��G���
    F���������������������0������������������������������������
    ���
    @��
    ��S�����������������"����������9������G���
    F���������������������0������������������������������������
    ���@��
    ��S���������h��������"����������i��A�������
    F���������������������0������������������������������������
    ���@��
    ��S�����������������"������������A��?�����
    F���������������������0������������������������������������
    ���@���
    ���6���������������������	���#�"�����`���������` `�������������
    X����������������*��������������������������������������������������������
    ���@���
    ���6���������������������	���#�"�����`���������`������������	�
    @����������������������������������������������������
    ���@���
    ���6�������!��������������	���#�"�����`���������``�������������
    d����������������*������������������������������������������������������������
    ���@���
    ���0�������[�����������	����"�����������`0	���������������
    T������������� ���Click to edit Master title style�����!�������
    ���!�������������
    ���@���
    ���0�������\����������	����"�����������P
    p��������������
    W�������������#���Click to edit Master subtitle style�����$�������
    ���$���������H����
    ���@������0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���
    07���+��������D=�����' ����������������������������=
    ���@B���	����+���������������
    0������P����������*���(����	��������������������
    ��������������
    ������
    ���0������������������	������������P �������������
    �
    X����������������*��������������������������������������������������������
    ������
    ���0�������V����������	����������	 ��������������
    Z����������������*����������������������������������������������������d����
    ������
    ��c�$��������������	�?������� 
    �����������������
    ������
    ���0�������4����������	��������
    0�������������
    �������������R���Click to edit Master text styles
    Second level
    Third level
    Fourth level
    Fifth level�����!�����
    ��������
    ����������
    ���S�������������
    ������
    ���6�������x,��������������	��������_��P������������	�
    X����������������*��������������������������������������������������������
    ������
    ���6�������1��������������	��������_	�������������
    Z����������������*����������������������������������������������������H����
    ���������0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���y`g���������0������L������(����	��������������������
    ����L����������
    ���L���
    ���0�������l����������	������������P �������������
    �
    X����������������*��������������������������������������������������������
    ���L���
    ���0�������<����������	����������	 �������������
    Z����������������*��������������������������������������������������������
    ���L���
    ���6�������P��������������	��������_��P������������	�
    X����������������*��������������������������������������������������������
    ���L���
    ���6���������������������	��������_	�������������
    Z����������������*����������������������������������������������������H����
    ���L������0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���@Z����������������������������������-������� ����������0���(����	��������������������
    ����������x����
    ����� ��c�$�������������TH������@�������`0	���������������
    �������������x����
    ����� ��c�$�������������(I������@�������P
    p��������������
    ������������H����
    ���������0���������޽h������	���?��� ��������������33������������������_�_�_�P�P�T�1�0���i�����.���3���+��������D=�����' ����������������������������=
    ���@B���	����+�����]���������
    ������������������������-��`���X��@�������������(����	��������������������
    ����������x����
    ����� ��c�$�������������<ʎ������<�������`�P �������������
    ��
    �������������x����
    ����� ��c�$�������������dގ������<�������
    ��������������
    ������������X���
    ������
    ���0���A������������������?��������0	�X���
    ������
    ���0���A������������������?���������H����
    ���������0���������޽h������	���?��� ��������������33������������������_�_�_�P�P�T�1�0���i�����.���xPLK���+��������D=�����' ����������������������������=
    ���@B���	����+��������������
    �����������������������-�������@������������(����	��������������������
    ����������r����
    ����� ��S���������ه������<�������  `�������������
    ��
    �������������r����
    ����� ��S���������ڇ������<���������@��������������
    ������������X���
    ������
    ���0���A������������������?��������B 
    �	�H����
    ���������0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.������+��������D=�����' ����������������������������=
    ���@B���	����+��������������
    �����������������������-����������������$���(����	��������������������
    ����������r����
    ����� ��S���������D������<�������  `�������������
    ��
    �������������r����
    ����� ��S���������������<������� `p��������������
    ������������H����
    ���������0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���`:���+��������D=�����' ����������������������������=
    ���@B���	����+��������������
    �����������������������-������� ������H���$���(����	��������������������
    ����H������r����
    ���H�� ��S���������������<�������P�0�������������
    ��
    �������������r����
    ���H�� ��S���������:������<������� ` ��������������
    ������������H����
    ���H������0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���y@1���+��������D=�����' ����������������������������=
    ���@B���	����+��������������
    ��������	���������������-�������p������\���$���(����	��������������������
    ����\������r����
    ���\�� ��S���������������<�������  `�������������
    ��
    �������������r����
    ���\�� ��S���������6������<�������� ��������������
    ������������H����
    ���\������0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���w���+��������D=�����' ����������������������������=
    ���@B���	����+��������������
    �����������������������-�������������t���$���(����	��������������������
    ����t������r����
    ���t�� ��S���������������<�������  `�������������
    ��
    �������������r����
    ���t�� ��S���������h������<�������0����������������
    ������������H����
    ���t������0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���C`c	���+��������D=�����' ����������������������������=
    ���@B���	����+��������������
    �����������������������-���������������$���(����	��������������������
    ���������r����
    ���� ��S���������\������<�������  `�������������
    ��
    �������������r����
    ���� ��S���������������<�������`�P��������������
    ������������H����
    ��������0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���3���+��������D=�����' ����������������������������=
    ���@B���	����+��������������
    ��������
    ���������������-�������������|���$���(����	��������������������
    ����|������r����
    ���|�� ��S���������8������<�������  `p�������������
    ��
    �������������r����
    ���|�� ��S���������������<������� `��������������
    ������������H����
    ���|������0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���C���+��������D=�����' ����������������������������=
    ���@B���	����+��������������
    �����������������������-����������������$���(����	��������������������
    ����������r����
    ����� ��S��������� ������<�������  `�������������
    ��
    �������������r����
    ����� ��S���������m������<������� `p��������������
    ������������H����
    ���������0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���0#���+��������D=�����' ����������������������������=
    ���@B���	����+��������������
    �����������������������-�����������������$���(����	��������������������
    ����������r����
    ����� ��S���������<������<�������  `�������������
    ��
    �������������r����
    ����� ��S���������T!������<������� `p��������������
    ������������H����
    ���������0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���DO���+��������D=�����' ����������������������������=
    ���@B���	����+��������������
    �����������������������-�������p���������$���(����	��������������������
    ����������r����
    ����� ��S���������&������<�������  `�������������
    ��
    �������������r����
    ����� ��S���������'������<������� `p��������������
    ������������H����
    ���������0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���0HN���+��������D=�����' ����������������������������=
    ���@B���	����+��������������
    ��������
    ���������������-�������p���������$���(����	��������������������
    ����������r����
    ����� ��S���������Pr������<�������  ``�������������
    ��
    �������������r����
    ����� ��S���������ln������<��������0��������������
    ������������H����
    ���������0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���8���+��������D=�����' ����������������������������=
    ���@B���	����+��������������
    �����������������������-������� ��������$���(����	��������������������
    ���������r����
    ���� ��S���������������<�������  `�������������
    ��
    �������������r����
    ���� ��S����������������<������� 0��������������
    ������������H����
    ��������0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���:kM���+��������D=�����' ����������������������������=
    ���@B���	����+��������������
    �����������������������-����������������$���(����	��������������������
    ����������r����
    ����� ��S���������������<�������  `0�������������
    ��
    �������������r����
    ����� ��S���������Ȋ������<�������`�P��������������
    ������������H����
    ���������0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���j���+��������D=�����' ����������������������������=
    ���@B���	����+��������������
    �����������������������-���������������$���(����	��������������������
    ���������r����
    ���� ��S���������������<�������  `�������������
    ��
    �������������r����
    ���� ��S���������������<�������`��������������
    ������������H����
    ��������0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���iP탩���+��������D=�����' ����������������������������=
    ���@B���	����+��������������
    �����������������������-�������0��������$���(����	��������������������
    ���������r����
    ���� ��S���������8������<�������  `��������������
    ��
    �������������r����
    ���� ��S���������������<����������������������
    ������������H����
    ��������0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���>LB���+��������D=�����' ����������������������������=
    ���@B���	����+��������������
    �����������������������-����������������$���(����	��������������������
    ����������r����
    ����� ��S���������������<��������0 �������������
    ��
    �������������r����
    ����� ��S���������������<������� `p��������������
    ������������H����
    ���������0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���|���+��������D=�����' ����������������������������=
    ���@B���	����+�����$���������
    ��������������������������T��$���(����	��������������������
    ����T�����r����
    ���T� ��S���������������<������� `�������������
    ��
    �������������r����
    ���T� ��S��������������<������� `p��������������
    ������������H����
    ���T�����0���������޽h������	���?��� ����������}�������ff���8����0��������_�_�_�P�P�T�1�0��������.���l@�$���������
    ��������������������������X��$���(����	��������������������
    ����X�����r����
    ���X� ��S���������df������<�������P�0�������������
    ��
    �������������r����
    ���X� ��S���������g������<�������``���������������
    ������������H����
    ���X�����0���������޽h������	���?��� ����������}�������ff���8����0��������_�_�_�P�P�T�1�0��������.���mqK����������
    �����������������������-����������������$���(����	��������������������
    ����������r����
    ����� ��S���������������<�������  `�������������
    ��
    �������������r����
    ����� ��S���������������<������� `p��������������
    ������������H����
    ���������0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���~ǩ���+��������D=�����' ����������������������������=
    ���@B���	����+��������������
    �����������������������-����������������$���(����	��������������������
    ����������r����
    ����� ��S���������������<�������  `�������������
    ��
    �������������r����
    ����� ��S���������@������<������� `p��������������
    ������������H����
    ���������0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���@D���+��������D=�����' ����������������������������=
    ���@B���	����+�����}���������
    ������������������������@��$���(����	��������������������
    ����@�����r����
    ���@� ��S���������tB������<�������  `�������������
    ��
    �������������r����
    ���@� ��S���������[������<���������`p��������������
    ������������H����
    ���@�����0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���Ic���+��������D=�����' ����������������������������=
    ���@B���	����+�����{
    ���������
    ��������������	���	��������WD��"	���(����	��������������������
    ����D�����x����
    ���D� ��c�$�������������P������<�������  `�������������
    ��
    �������������j�������	��������0��
    ���
    ���WD����������#�"������������ ��0��0��������0
    �����������������
    ���FD�
    ���6�����������������������?�������� ��	��0��
    ���
    p����������������m.s.sample.Bar�������������������������������������������������� @`�����
    ���ED�
    ���6��������([��������������?�����������	�� ��
    ���
    Q����������������%logger{15}������������������������������� @`�����
    ���DD�
    ���6��������hd��������������?�������� ����0��	���
    |����������������mainPackage.sub.sample.Bar�������������������������������������������������� @`�����
    ���CD�
    ���6����������������������?������������� ��	���
    O�������������	���%logger 
    �����
    ���������
    ����������������� @`�����
    ���BD�
    ���6����������������������?�������� ����0�����
    j����������������Displayed logger name
    ��"������������������������������������ @`�����
    ���AD�
    ���6��������8 ��������������?������������� �����
    ^����������������Conversion specifier������������������������������� @`�`���B
    ���GD�
    ���0��������o������
    ���?����������������0�����Z���B
    ���HD�
    ��s�*��������1���
    ���?����������������0�����Z���B
    ���ID�
    ��s�*��������1���
    ���?��������������	��0��	���`���B
    ���JD�
    ���0��������o������
    ���?��������������
    ��0��
    ���`���B
    ���KD�
    ���0��������o������
    ���?�������������������
    ���Z���B
    ���LD�
    ��s�*��������1���
    ���?����������� ���� ��
    ���`���B
    ���MD�
    ���0��������o������
    ���?�����������0����0��
    ���H����
    ���D�����0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���L���+��������D=�����' ����������������������������=
    ���@B���	����+��������������
    �����������������������-�������0���������$���(����	��������������������
    ����������r����
    ����� ��S���������B������<�������  `�������������
    ��
    �������������r����
    ����� ��S���������x=������<������� ``��������������
    ������������H����
    ���������0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���v@o���+��������D=�����' ����������������������������=
    ���@B���	����+�����}���������
    ��������������������������\��$���(����	��������������������
    ����\�����r����
    ���\� ��S���������,������<�������  ``�������������
    ��
    �������������r����
    ���\� ��S���������ݎ������<��������
    ��������������
    ������������H����
    ���\�����0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���D@+���+��������D=�����' ����������������������������=
    ���@B���	����+��������������
    ��������������������������`��0���(����	��������������������
    ����`�����x����
    ���`� ��c�$��������'������<�����������  ``�������������
    �'�
    �������������x����
    ���`� ��c�$��������'������<������������
    �������������'�
    ������������H����
    ���`�����0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���D@+���+��������D=�����' ����������������������������=
    ���@B���	����+�����}���������
    ��������������������������<��$���(����	��������������������
    ����<�����r����
    ���<� ��S���������Tp������<�������  `�������������
    ��
    �������������r����
    ���<� ��S���������q������<������� `p��������������
    ������������H����
    ���<�����0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���| 5\���+��������D=�����' ����������������������������=
    ���@B���	����+��������������
    �����������������������-����������������$���(����	��������������������
    ����������r����
    ����� ��S���������������<�������  `�������������
    ��
    �������������r����
    ����� ��S���������k������<�������  ���������������
    ������������H����
    ���������0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.�������+��������D=�����' ����������������������������=
    ���@B���	����+�����_���������
    0������`����������o���(����	��������������������
    ����������X����
    ����� ��C������������������ 
    ������������������
    ����� ��S����������������������
    0��������������
    q��������������Faster: Certain critical operations, for instance determining whether a log statement should be logged or not, has been significantly improved. This operation takes about 3 nanoseconds in logback versus 30 nanoseconds in log4j. Logback also creates loggers faster : 13 microseconds instead versus 23 microseconds for log4j. More importantly, it fetches an existing logger in 94 nanoseconds versus 2234 nanoseconds for log4j, a 23 fold improvement. The improvement over JUL is also far from insignificant.
    Smaller: Each logger instance uses up about 40 bytes of memory version 160 bytes for log4j.
    More bang for the buck: Logback does a better job of presenting logs, has much improved filtering and evaluation capability. In short, it does everything that log4j does and more, but better. ��@�������������������������������T����������������������H����
    ���������0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���ypg�����������
    0������@������P��� ���(����	��������������������
    ����P������X����
    ���P�� ��C������������������ 
    �������������������
    ���P�� ��S���������`�����������
    0��������������
    "���������������������������H����
    ���P������0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���A\�Z���������
    0������`������X���j���(����	��������������������
    ����X������X����
    ���X�� ��C������������������ 
    ������������������
    ���X�� ��S���������@Q�������������
    0��������������
    l������������6��As a logback user, the vast majority of your will depend on SLF4J, not logback. Thus, if you later want to switch to JCL, JUL or log4j, you can do so with relative ease.
    
    SLF4J acts as a universal logging API bridging between the various logging systems. Logback is designed to support SLF4J API from the start. In practice, it is a little less convenient to log directly through logback instead of (indirectly) with SLF4J. For example, logback's documentation always uses SLF4J. (There are no examples in logback docs that use logback directly.)�����������	�������i��������H����
    ���X������0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���A\����������
    0�J���B��������x������(����	��������������������
    ����x������X����
    ���x�� ��C������������������ 
    ���������������B���
    ���x�� ��S����������������������
    0��������������
    �������������\���c.q.l is an abbreviation of  ch.qos.logback
    c.q.l.c.r stands for ch.qos.logback.core.rolling�����]���������]���������H�������������������������������	�����������������������������H����
    ���x������0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���C`\�q������
    ���
    0������������������(����	��������������������
    ����������X����
    ����� ��C������������������ 
    ������������������
    ����� ��S���������b�������������
    0��������������
    ������������o��logback-core modules cannot log because it has no notion of a "logger". 
    Loggers are defined in logback-classic.
    
    But, more generally, a logging system which uses itself for its own logging is extremely difficult to design and to maintain. It can be done but a the cost of non-negligible complexity. 
    
    Instead logback relies on Status object to report its own state.
    �H����
    ���������0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���E r{A�[���������
    0������0���������k���(����	��������������������
    ����������X����
    ����� ��C������������������ 
    �������������������
    ����� ��S���������m�������������
    0��������������
    m�������������7���An example with MultiFileAppender might be interesting.���������������������������H����
    ���������0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���E�P������	���
    0������@���������`���(����	��������������������
    ����������X����
    ����� ��C������������������ 
    ������������������
    ����� ��S���������>�������������
    0��������������
    b������������,��As mentioned previously, we've used Joran (part of logback-core) to implement a monitoring framework. 
    
    We needed to recreate sophisticated test object anew each time we needed to perform a verification. Joran's unique capability of selectively replaying parts of a configuration was a perfect match.�������������������Z��������H����
    ���������0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���E����������
    0������������������(����	��������������������
    ����������X����
    ����� ��C������������������ 
    ������������������
    ����� ��S���������?�������������
    0��������������
    ����������������Contrary to log4j, where we wrote many regression tests, in logback, we have learned our lesson. We write many more unit tests and fewer integration tests.�H����
    ���������0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���uC
    ����������
    0� �����������������(����	��������������������
    ����������X����
    ����� ��C������������������ 
    ������������������
    ����� ��S���������7�������������
    0��������������
    ����������������We consider code ready for distribution only after it is properly documented, which is the main reason why logback carries a 0.x version stamp instead of 1.x.�H����
    ���������0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���uu����������
    0����������������#���(����	��������������������
    ����������X����
    ����� ��C������������������ 
    �������������������
    ����� ��S���������,�������������
    0��������������
    %����������������Show JMX counter.�H����
    ���������0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���up�/������
    ���
    0���������������?���(����	��������������������
    ����������X����
    ����� ��C������������������ 
    �������������������
    ����� ��S���������s�������������
    0��������������
    A�������������-���- Turbo filtering example based on user login�H����
    ���������0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���ub����������
    0������ ���������'���(����	��������������������
    ����������X����
    ����� ��C������������������ 
    �������������������
    ����� ��S���������O�������������
    0��������������
    )����������������NO_EXCEPTION example
    �H����
    ���������0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���vo�#���������
    0������P���������3���(����	��������������������
    ����������X����
    ����� ��C������������������ 
    ������������������
    ����� ��S���������,�������������
    0��������������
    5������������!��The logback-core module forms the foundation upon which the other two modules are built. Interestingly enough, logback-core has no notion of "logger." We have recently built a monitoring framework on top of just logback-core (without logback classic or access).
    
    Logback-classic relies on logback-core for basic services. It natively implements the SLF4J API.
    
    Logback-access integrates with servlet containers, in particular Jetty and Tomcat. Thus, the capabilities of a fully-fledged logging system can be leverages in servlet containers. 
    
    
     �H����
    ���������0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���PY�f���������
    0���������������v���(����	��������������������
    ����������X����
    ����� ��C������������������ 
    ������������������
    ����� ��S���������h�������������
    0��������������
    x��������������- ajouter une classe XYAppender, ajouter la config ncessaire dans logback-YY.xml et montrer que la config est faite toute seule, sans modifier quoi que se soit.
    - configuration: configurer un fichier xml avec une erreur (pas de TriggeringPolicy dans un RollingFileAppender) et montrer l'effet des status objects et le lien vers la page codes.html. Logback se manifeste lorsqu'il y a une erreur et fourni une piste  suivre pour la rsoudre.�����������������������������������������������������
    ������������������������������������������
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������
    ���������������������
    ����������������������������	����������������������������������������������������������������������	�������
    �������
    �������	��������������	�������������������������������������������������������������������������������������������	����������������������H����
    ���������0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���n����������
    0��������������� ���(����	��������������������
    ����������X����
    ����� ��C������������������ 
    �������������������
    ����� ��S���������"�����������
    0��������������
    "���������������������������H����
    ���������0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���a`T"F����������
    0��������������� ���(����	��������������������
    ����������X����
    ����� ��C������������������ 
    �������������������
    ����� ��S���������$Ӕ�����������
    0��������������
    "���������������������������H����
    ���������0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���aN����������
    0��������������� ���(����	��������������������
    ����������X����
    ����� ��C������������������ 
    �������������������
    ����� ��S���������䅔�����������
    0��������������
    "���������������������������H����
    ���������0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���aPY����������
    0�/���'��������������(����	��������������������
    ����������X����
    ����� ��C������������������ 
    ���������������'���
    ����� ��S���������9�������������
    0�d�������������L����D��������_�_�_�P�P�T�9���&�����������������������������������
    m��������������
    Given that 
    
     Joran can configure any component via setter/adder methods, 
     can be easily adjusted to process configuration elements via user-specified actions,
    
    Joran is really ideal for building frameworks which need to support user-developed extensions.��<���������������������" ��_����������" �������������������������H����
    ���������0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���0#�e���������
    0������@������,��u���(����	��������������������
    ����,�����X����
    ���,� ��C������������������ 
    �������������������
    ���,� ��S���������Pٔ�������������
    0��������������
    w�������������A���Logback-access configuration is very similar to logback-classic. �����0����������������������H����
    ���,�����0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���xdPN����������
    0������P������0�� ���(����	��������������������
    ����0�����X����
    ���0� ��C������������������ 
    ��������������/�����
    ���0� ��S���������0/�����������
    0�������������/�
    "���������������������������H����
    ���0�����0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���xdO����������
    0������`������4�� ���(����	��������������������
    ����4�����X����
    ���4� ��C������������������ 
    ��������������������
    ���4� ��S���������+������������
    0���������������
    "���������������������������H����
    ���4�����0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���xdH ����������
    0������p������8�� ���(����	��������������������
    ����8�����X����
    ���8� ��C������������������ 
    �������������������
    ���8� ��S��������������������
    0��������������
    "���������������������������H����
    ���8�����0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���xd` �@���������
    0������������P��P���(����	��������������������
    ����P�����X����
    ���P� ��C������������������ 
    ������������������
    ���P� ��S���������p�������������
    0��������������
    R��������������At the end of each stack frame, logback will add a packaging information for the corresponding class. Packaging information consists of the containing jar file and versioning information. The inclusion of packaging information shortens the time it takes to identify software problems.����� ����������������������H����
    ���P�����0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���%hd��r����������o���P�q��[d��^��C��T���0�z��}j����������:}���P���?����7����� ����� ��i����f��x��W����ſ��E������������u����0� �Ќ��.��5�P�����������;�@�4��l����͙��D������ ��8�@������P���+��*���������"��?
    ���������O�����E���(������������������������������������Oh�+'0�����
    ������p������x���������������������������	������������
    �����������
    �������� �����(�������������Slide 1�������*Unrestricted*��������Ceki �tr������Pixel�tr������ Ceki�tr������191�������Microsoft PowerPoint��P�@���@FhQ��@���@3@���0^Y�����G���X������g���	��$�������������������������������������-��������������-����@	!������������������������-����-�����'�������-������������-����-����@	!���������k������-����-�����������������-����-����@	!���������k�����-����-�����������������-����-����@	!���������k�1����-����-�����������������-����-����@	!��������
    �k�@����-����-�����������������-����-����@	!���������k�M����-����-�����������������-����-����@	!��������
    �k�Y����-����-�����������������-����-����@	!��������	�k�c����-����-�����������������-����-����@	!��������	�k�l����-����-�����������������-����-����@	!��������	�k�u����-����-�����������������-����-����@	!���������k�~����-����-�����������������-����-����@	!���������k�����-����-�����������������-����-����@	!���������k�����-����-�����������������-����-����@	!���������k�����-����-�����������������-����-����@	!���������k�����-����-�����������������-����-����@	!���������k�����-����-�����������������-����-����@	!��������	�k�����-����-�����������������-����-����@	!���������k�����-����-�����������������-����-����@	!��������	�k�����-����-�����������������-����-����@	!��������	�k�����-����-�����������������-����-����@	!��������
    �k�����-����-�����������������-����-����@	!���������k�����-����-�����������������-����-����@	!���������k�����-����-�����������������-����-����@	!���������k�����-����-�����������������-����-����@	!���������k�����-����-�����������������-����-����@	!���������k����-����-�����������������-����-����@	!�������� �k�(���-����-���������-����'�����������}������-����-����@	!��������������-����-�����'�������������������-����-����@	!��������/�6�q5����-����-�����'�������������������-����-����@	!��������/�5������-����-�����'�������-����-����@	!��������.�7������-����-�����'���������������}������-����-����@	!��������/�7�qk����-����-�����'�������������������-����-����@	!��������/�7������-����-�����'�������������������-����-����@	!��������/�7�k����-����-�����'���������������}������-����-����@	!��������/�7����-����-�����'�������������������-����-����@	!��������/�5�����-����-�����'�������������������-����-����@	!��������/�6�C5����-����-�����'�������������������-����-����@	!��������/�7�Ck����-����-�����'��������������@�"Arial Black������������������������-����.��������	���	���2
    ���1�����.���������������"System���������D�������������-�������������������@��Arial������������������������������-����.��������	���2
    [%���Logback project�&�'�&�'�&�#�#��&��&��&�#�����.�����-�������������������@��Arial������������������������������-����.��������	������2
    ����Ceki Glc & S"���
    �
    �%��
    ���
    � �
    �����.�����-�������������������@��Arial������������������������������-����.��������	���	���2
    ��������.�����-�������������������@��Arial������������������������������-����.��������	������2
    ���bastien����
    �
    ������.�����-�������������������@��Arial������������������������������-����.��������	������2
    ���Pennec���������.�����-�������������-�������������������������������������������������������������e�r�@�q�o�s�.�c�h��4���m�a�i�l�t�o�:�l�o�g�b�a�c�k�-�u�s�e�r�@�q�o�s�.�c�h��t�������������,���h�t�t�p�:�/�/�l�o�g�b�a�c�k�.�q�o�s�.�c�h�/��,���h�t�t�p�:�/�/�l�o�g�b�a�c�k�.�q�o�s�.�c�h�/��b�������������"���h�t�t�p�:�/�/�s�v�n�.�q�o�s�.�c�h��$���h�t�t�p�:�/�/�s�v�n�.�q�o�s�.�c�h�/��h�������������&���h�t�t�p�:�/�/�j�i�r�a�.�q�o�s�.�c�h�/��&���h�t�t�p�:�/�/�j�i�r�a�.�q�o�s�.�c�h�/��D��/����0��������|����D���A�r�i�a�l���r� �N�e���0.�8� �0�������8�z[	00�����D���T�i�m�e�s� �N�e�w� �R�o�m�a�n���8� �0�������8�z[	00��� �D���W�i�n�g�d�i�n�g�s���R�o�m�a�n���8� �0�������8�z[	00��0�D���A�r�i�a�l� �B�l�a�c�k���m�a�n���8� �0�������8�z[	00���"@�D���C�o�u�r�i�e�r� �N�e�w���m�a�n���8� �0�������8�z[	00���1������@�����������.��������
    �������	��@�n����?���" ��d������d���������@���������������������  �������@@�������``������������l����d������h�[������:�����������������������������������������������������������*�������*�������������������������������������������������������������������������������������������
    �������
    ������������������������������������������ ������!�������������#������$��������������������'������(������)������*������+������,������-������.������/������0������1������2������3������4������5�������������7������8���������������������������9������:������;������=������<�������������?�������������A������B������C����������������������������������D������E������F������G������H������I������J���X�����������������K������L������M������N������O������P������Q������o����$��������������������������������������b�$���͒^bEN凙=U���������������$��������������������������������������b�$���LMJm /!�������������$��������������������������������������2�$���wlֲ;�A�����q������0��������A��������A��������P����������f����@��������������8�����������������������������	����������������������������cP;	�ʚ;S1�ʚ;���g������������4���d���d���d���d����������P�z[	0�����������p��������p��p�������@���<�����4���d���d���d���d���|�	0�.����������������������������������������<�����4���B���d���B���d������|�<	0���������������������g������������4���}���d���}���d����������P�z[	0��������������p��������@��p�������p���8����0��������_�_�_�P�P�T�1�0��������
    ���������?�����������-�O���������
    �=��8�������������������������������������Logback project��������������������������� �������������Ceki Glc & Sbastien Pennec�����������������������8��������������������������������������������������������������������������������~ ���������������������������������No revolution, only evolution.
    log4j is no longer being actively developed
    The same basic plumbing only done better. 
    Faster, smaller, higher gas mileage, and generally more bang for the buck.�������������Z�������������8���������������w������������-�����������������������������Modular architecture������������logback-core
    	Joran, Status,
       Context, pattern parsing
    logback-classic
    	developer logging
    logback-access
    	container (access) logging
    ��V���
    ��������Z�,��������Z���������Z���������Z���������Z���������Z�������������#�����������������������������Access Logging������������Definition: Access log
    		The log generated when a user 	accesses a web-page on a web server.
    
    Logback-access integrates seamlessly with Jetty and Tomcat
     ��<�����������Z�F��������Z�<��������Z���������Z��������������������������������������� ���logback-classic implements SLF4J�����!���������!������(������������Logback offers a native implementation of the SLF4J API => Logback exposes its logging API through SLF4J.
    If you are using logback, you are actually using SLF4J
    SLF4J can delegate to log4j, logback, java.util.logging or JCL
    SLF4J can bridge log4j, JCL and j.u.l.
    ��>���{��������������E��������������(�������������������������������������������������������Joran: a bowl of fresh air�����������G�i�v�e�n� �r�u�l�e�s� �(�p�a�t�t�e�r�n�s� �&� �a�c�t�i�o�n�s�)� �i�t� �c�a�n� �c�o�n�f�i�g�u�r�e� �a�n�y� �o�b�j�e�c�t�.�
    �J�o�r�a�n� �c�a�n� �l�e�a�r�n� �n�e�w� �r�u�l�e�s� �o�n� �t�h�e� �f�l�y�.�
    �W�i�t�h� �i�t�s� �i�m�p�l�i�c�i�t� �r�u�l�e�s�,� �y�o�u� �d�o�n� t� �e�v�e�n� �h�a�v�e� �t�o� �w�r�i�t�e� �r�u�l�e�s�.� �
    �I�t� �c�a�n� �d�o� �p�a�r�t�i�a�l� �r�e�p�l�a�y�.�
    �I�t� �i�s� �g�e�n�e�r�i�c� �(�c�a�n� �b�e� �u�s�e�d� �i�n� �y�o�u�r� �o�w�n� �p�r�o�j�e�c�t�s�)���&�����������Z�d�������<�������M�����������������������������������������Configuration example:��������������������(������������
    <appender name="FILE"
         class="ch.qos.logback.core.rolling.RollingFileAppender">
      <File>logFile.log</File>
      <rollingPolicy
    	   class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <FileNamePattern>
               logFile.%d{yyyy-MM-dd}.log.zip
        </FileNamePatter>
      </rollingPolicy>
    
      <layout class="ch.qos.logback.classic.PatternLayout">
        <Pattern>
          %d{HH:mm:ss,SSS} [%thread] %-5level %logger{22} - %msg%n
        </Pattern>
      </layout>
    </appender>��6����������P�5�������,����������v�������������#�������/����������������������������
    ��������������2���������������������
    �����������������������������������
    ��������������$���������������������$��������������(������������<�����������������������������Logback-access configuration��������������������(����������x��<appender name="FILE"	    
                class="c.q.l.c.r.RollingFileAppender">
      <File>access.log"</File>
      <rollingPolicy
            class="c.q.l.c.r.TimeBasedRollingPolicy">
        <FileNamePattern>
          access.%d{yyyy-MM-dd}.log.zip
        </FileNamePattern>
      </rollingPolicy>
    
      <layout class="c.q.l.access.PatternLayout">
        <Pattern">combined</Pattern">
      </layout>
    </appender>��4���y�������P������������������������������.���������������������
    ��������������
    �������������� ��������������������������������������������������������
    ���������������������=���������������������	��������������������Another example:��������������������(������������<testShell name="test1">
      <period>5 minutes</period>
      <!-- we need to configure a totally new test 
           object for each run of the test -->
      <test class="com.wombat.myTest">
        <DataSource class="c.w.JNDIDS">
          <url>jndi://com.wombat/ds"</url>
        </DataSource>
      </test>
    <testShell>
    
    <testShell name="test2">
      <period>60 seconds</period>
      <test class="com.wombat.myTest2">
        <file>c:/wombat/foo.properties</file>
      </test>
    </testShell>��4����������P�������������������������������������	����������������������������
    ��������������
    �������
    �������������������������������������������������
    �������
    �������	��������������	�������[���������������������	�������������������8�����������������������������Is Joran for me?���������a���
    Joran is ideal for building frameworks which need to support arbitrary user-developed plug-ins.
    �����a������������������b���������������������
    ��������������������Internal error reporting���������~���Who shall guard the guards?
    
    Logback modules cannot use logging to report their own state.
    
    Something more generic is needed.
    ��(���������������������b���������������������0�����������������������������Errors in action������������
    Internal state available via StatusManager
    
    Exceptions and status messages accompanied by references, i.e. URLs, to external������������������������	���
    ���������
    ��������������������������������������������������������� ���!���"���#���$���%���&���'���(���)���*���+���,���-���.���/���0���1���2���3���4���5���6���7���8���9���:���;���<���=���>���?���@���A���B���C���D���E���F���G���H���I���J���K���L���M���N���O���P���Q���R���S���T���U���V���W���X���Y���Z���[���\���]���^���_���`���a���b���c���d���e���f���g���h���i���j���k���l���m���n���o���p���q���r���s���t���u���v���w���x���y���z���{���|���}���~����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������	��
    ������
    �������������������������������������� ��!��"��#��$��%��&��'��(��)��*��+��,��-��.��/��0��1��2��3��4��5��6��7��8��9��:��;��<��=��>��?��@��_��B��C��D��E��F��G��H��I��K��L��M��N��O��P��Q��R��S��T��U��V��W��X��Y����^��`��a��b��c��d��e��f��g��h��i��j��k��l��m��n��o��p��q��r��s��t��u��v��w��x��y��z��{��|��}��~����R�o�o�t� �E�n�t�r�y�������������������������������������������������dO��)������������ gcY��������P�i�c�t�u�r�e�s���������������������������������������������������������������������������������������������y�����C�u�r�r�e�n�t� �U�s�e�r����������������������������������������������������������������������������������/��������S�u�m�m�a�r�y�I�n�f�o�r�m�a�t�i�o�n���������������������������(�������������������������������������������A��������P�o�w�e�r�P�o�i�n�t� �D�o�c�u�m�e�n�t���������������������������(����������������������������������������>������D�o�c�u�m�e�n�t�S�u�m�m�a�r�y�I�n�f�o�r�m�a�t�i�o�n�����������8������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
    ����������������	����
    �������v�������������&���l�o�g�b�a�c�k�-�u�s�e�r�@�q�o�s�.�c�h��4���m�a�i�l�t�o�:�l�o�g�b�a�c�k�-�u�s�e�r�@�q�o�s�.�c�h��t�������������,���h�t�t�p�:�/�/�l�o�g�b�a�c�k�.�q�o�s�.�c�h�/��,���h�t�t�p�:�/�/�l�o�g�b�a�c�k�.�q�o�s�.�c�h�/��b�������������"���h�t�t�p�:�/�/�s�v�n�.�q�o�s�.�c�h��$���h�t�t�p�:�/�/�s�v�n�.�q�o�s�.�c�h�/��h�������������&���h�t�t�p�:�/�/�j�i�r�a�.�q�o�s�.�c�h�/��&���h�t�t�p�:�/�/�j�i�r�a�.�q�o�s�.�c�h�/��D��/����0��������|����D���A�r�i�a�l���r� �N�e���0.�8� �0�������8�z[	00�����D���T�i�m�e�s� �N�e�w� �R�o�m�a�n���8� �0�������8�z[	00��� �D���W�i�n�g�d�i�n�g�s���R�o�m�a�n���8� �0�������8�z[	00��0�D���A�r�i�a�l� �B�l�a�c�k���m�a�n���8� �0�������8�z[	00���"@�D���C�o�u�r�i�e�r� �N�e�w���m�a�n���8� �0�������8�z[	00���1������@�����������.��������
    �������	��@�n����?���" ��d������d���������@���������������������  �������@@�������``������������l����d������h�[������:�����������������������������������������������������������*�������*�������������������������������������������������������������������������������������������
    �������
    ������������������������������������������ ������!�������������#������$��������������������'������(������)������*������+������,������-������.������/������0������1������2������3������4������5�������������7������8���������������������������9������:������;������=������<�������������?�������������A������B������C����������������������������������D������E������F������G������H������I������J���X�����������������K������L������M������N������O������P������Q������o����$��������������������������������������b�$���͒^bEN凙=U���������������$��������������������������������������b�$���LMJm /!�������������$��������������������������������������2�$���wlֲ;�A�����q������0��������A��������A��������P����������f����@��������������8�����������������������������	����������������������������cP;	�ʚ;S1�ʚ;���g������������4���d���d���d���d����������P�z[	0��������f:���p��������p��p�������@���<�����4���d���d���d���d���|�	0�.����������������������������������������<�����4���B���d���B���d������|�<	0���������������������g������������4���}���d���}���d����������P�z[	0��������������p��������@��p�������p���8����0��������_�_�_�P�P�T�1�0��������
    ���������?�����������-�O���������
    �=��7�������������������������������������Logback project��������������������������� �������������Ceki Glc & Sbastien Pennec�����������������������8��������������������������������������������������������������������������������~ ���������������������������������No revolution, only evolution.
    log4j is no longer being developed
    The same basic plumbing only done better. 
    Faster, smaller, higher gas mileage, and generally more bang for the buck.�������������Z�������������-�����������������������������Modular architecture������������logback-core
    	Joran, Status,
       Context, pattern parsing
    logback-classic
    	developer logging
    logback-access
    	container (access) logging
    ��V���
    ��������Z�,��������Z���������Z���������Z���������Z���������Z�������������#�����������������������������Access Logging������������Definition: Access log
    		The log generated when a user 	accesses a web-page on a web server.
    
    Logback-access integrates seamlessly with Jetty and Tomcat
     ��<�����������Z�F��������Z�<��������Z���������Z��������������������������������������� ���logback-classic implements SLF4J�����!���������!������(������������Logback offers a native implementation of the SLF4J API => Logback exposes its logging API through SLF4J.
    If you are using logback, you are actually using SLF4J
    SLF4J can delegate to log4j, logback, java.util.logging or JCL
    SLF4J can bridge log4j, JCL and j.u.l.
    ��>���{��������������E��������������(�������������������������������������������������������Joran: a bowl of fresh air�����������G�i�v�e�n� �r�u�l�e�s� �(�p�a�t�t�e�r�n�s� �&� �a�c�t�i�o�n�s�)� �i�t� �c�a�n� �c�o�n�f�i�g�u�r�e� �a�n�y� �o�b�j�e�c�t�.�
    �J�o�r�a�n� �c�a�n� �l�e�a�r�n� �n�e�w� �r�u�l�e�s� �o�n� �t�h�e� �f�l�y�.�
    �W�i�t�h� �i�t�s� �i�m�p�l�i�c�i�t� �r�u�l�e�s�,� �y�o�u� �d�o�n� t� �e�v�e�n� �h�a�v�e� �t�o� �w�r�i�t�e� �r�u�l�e�s�.� �
    �I�t� �c�a�n� �d�o� �p�a�r�t�i�a�l� �r�e�p�l�a�y�.�
    �I�t� �i�s� �g�e�n�e�r�i�c� �(�c�a�n� �b�e� �u�s�e�d� �i�n� �y�o�u�r� �o�w�n� �p�r�o�j�e�c�t�s�)���&�����������Z�d�������<�������M�����������������������������������������Configuration example:��������������������(������������
    <appender name="FILE"
         class="ch.qos.logback.core.rolling.RollingFileAppender">
      <File>logFile.log</File>
      <rollingPolicy
    	   class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <FileNamePattern>
               logFile.%d{yyyy-MM-dd}.log.zip
        </FileNamePatter>
      </rollingPolicy>
    
      <layout class="ch.qos.logback.classic.PatternLayout">
        <Pattern>
          %d{HH:mm:ss,SSS} [%thread] %-5level %logger{22} - %msg%n
        </Pattern>
      </layout>
    </appender>��6����������P�5�������,����������v�������������#�������/����������������������������
    ��������������2���������������������
    �����������������������������������
    ��������������$���������������������$��������������(������������<�����������������������������Logback-access configuration��������������������(����������x��<appender name="FILE"	    
                class="c.q.l.c.r.RollingFileAppender">
      <File>access.log"</File>
      <rollingPolicy
            class="c.q.l.c.r.TimeBasedRollingPolicy">
        <FileNamePattern>
          access.%d{yyyy-MM-dd}.log.zip
        </FileNamePattern>
      </rollingPolicy>
    
      <layout class="c.q.l.access.PatternLayout">
        <Pattern">combined</Pattern">
      </layout>
    </appender>��4���y�������P������������������������������.���������������������
    ��������������
    �������������� ��������������������������������������������������������
    ���������������������=���������������������	��������������������Another example:��������������������(������������<testShell name="test1">
      <period>5 minutes</period>
      <!-- we need to configure a totally new test 
           object for each run of the test -->
      <test class="com.wombat.myTest">
        <DataSource class="c.w.JNDIDS">
          <url>jndi://com.wombat/ds"</url>
        </DataSource>
      </test>
    <testShell>
    
    <testShell name="test2">
      <period>60 seconds</period>
      <test class="com.wombat.myTest2">
        <file>c:/wombat/foo.properties</file>
      </test>
    </testShell>��4����������P�������������������������������������	����������������������������
    ��������������
    �������
    �������������������������������������������������
    �������
    �������	��������������	�������[���������������������	�������������������8�����������������������������Is Joran for me?���������a���
    Joran is ideal for building frameworks which need to support arbitrary user-developed plug-ins.
    �����a������������������b���������������������
    ��������������������Internal error reporting���������~���Who shall guard the guards?
    
    Logback modules cannot use logging to report their own state.
    
    Something more generic is needed.
    ��(���������������������b���������������������0�����������������������������Errors in action������������
    Internal state available via StatusManager
    
    Exceptions and status messages accompanied by references, i.e. URLs, to external documents������������
    �������]������������$������������������������������JMX���������S���
    Logback configuration can be reloaded via JMX
    
    Statistical results exposed via JMX��������������S���������T������������ ��������������������������
    ���Documentation�����
    ��������������������������M�a�j�o�r� �a�r�e�a� �o�f� �e�f�f�o�r�t�.�
    �
    �C�o�m�p�l�e�t�e� �m�a�n�u�a�l�,� �w�i�t�h� �o�v�e�r� �1�5�0� �p�a�g�e�s� �o�f� �d�o�c�u�m�e�n�t�a�t�i�o�n�,� �i�s� �a�v�a�i�l�a�b�l�e� �f�o�r� �f�r�e�e�
    �
    �A� �s�h�o�r�t� �i�n�t�r�o�d�u�c�t�i�o�n� �t�o� �a�c�c�e�s�s� �l�o�g�g�i�n�g� �w�i�t�h� �l�o�g�b�a�c�k�-�a�c�c�e�s�s� �a�n�d� �J�e�t�t�y�
    �
    �j�a�v�a�d�o�c�,� �F�A�Q�,� �e�r�r�o�r� �c�o�d�e�s�,�& 
    �����������������������������������������������������=���������������������������$���Filters, Filters. Filters everywhere�����%���������%������(�������������Filters attachable to any Appender
    Evaluator filters
    Janino filters for evaluation based on java expressions
    TurboFilters for optimized global processing��,���5��������������2��������������!������������!���������
    ��������������������EvaluatorFilter & Janino��,���������������������������������������������<appender name="CYCLIC"
              class="c.q.l.core.read.CyclicBufferAppender">
      <filter class="c.q.l.core.filter.EvaluatorFilter">
        <evaluator name="loggingTaskEval">
    	    <expression>
    		  logger.contains("LoggingTask") &&
            message.contains("Howdydy-diddly-ho") &&
            (timeStamp-loggerContext.getBirthTime()) >= 20000
    		</expression>
    	 </evaluator>
    	 <OnMatch>DENY</OnMatch>
      </filter>
      <MaxSize>512</MaxSize>
    </appender>��4����������P�����������������Z������������
    �������������������������$����������������������������������!�����������������	����������������������������������������������������������������������������������������������������������������������������������������$���������!��������	�����������������������������������������������������������������������������������������������������������;������������������������������TurboFilters�������������������������������<turboFilter
         class="c.q.l.classic.turbo.MDCFilter">
      <MDCKey>userid</MDCKey>
      <Value>sebastien</Value>
      <OnMatch>ACCEPT</OnMatch>
    </turboFilter>��&���9��������Z�`������������������������������������
    ���������������������������������������������������������������	���������������������	����������������������������������������>������������������������������Parameterized logging������������Integer entry = new Interger(50); 
    logger.debug("The entry is "+entry+".");
    
    can be optimized as:
     if(logger.isDebugEnabled()) {
     logger.debug("The entry is "+entry+".");
    }
    
    or better yet:
    logger.debug("The entry is {}.", entry); 
    �������������Z�0���������������������������������K�������������������������������
    �����������������P���#��������������/����������������������������*��������������������������"�������������������������� ���Markers for specialized handling���������V���Markers are metadata for logging statements, coloring them for specialized processing
    �����V������������������W������������L���������������������������/���SiftingAppender or the appender-making appender�����0���������0������(������������� ���������������������������Sift logging according to runtime attributes
    E.g. separate logs according to user sessions, so that the log file generated by every user go into distinct log files, one log file per user. 
    Works with any appender, not just FileAppender�����-��������������������������������	���������������������������������������������������	��������������������������	�����������������-��������.��������������������M���������� ��������������������SiftingAppender (continued)��������������������(��������������������������������������� <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
        <discriminator>
          <Key>userid</Key>
          <DefaultValue>unknown</DefaultValue>
        </discriminator>
        <sift>
          <appender name="FILE-${userid}"
                    class="ch.qos.logback.core.FileAppender">
            <File>${userid}.log</File>s
            <Append>false</Append>
            <layout>
              <Pattern>%d %level %mdc %logger - %msg%n</Pattern>
            </layout>
          </appender>
        </sift>
      </appender>
    ������������P�P�������������������������fG�������������������������f�����������������fJ�����������������f�����������������f�������������������������������������+�����������������
    ���������
    ����������������������������������������������������������������������������
    �������������������������������������������	������������������������� ��������������������������6������������������������������������������������������������������������������������������������������������������������������������%�����������������������������Tested & Ready���������J���Battery of over 450 unit tests
    
    Tests written concomitantly with the code
    ��4���������������������*������������������K������������I�������������������������� ���Package versions in stack traces�����!���������!������(����������n��java.lang.NullPointerException
     at com.xyz.Wombat(Wombat.java:57) ~[wombat-1.3.jar:1.3]
     at com.xyz.Wombat(Wombat.java:76) ~[wombat-1.3.jar:1.3]
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native) ~[na:1.5.0_06]
     at java.lang.reflect.Method.invoke(Method.java:585) ~[na:1.5.0_06]
     at junit.runners.TestMethod.invoke(TestMethod.java:59) [junit-4.4.jar:na]
     etc..��^���o��������B��������������������������������������������������������������Q�����������J�����������������������������logger name abbreviation�����,���������������������������
    ���Odds and ends���������d��RollingFileAppender automatic file compression the background
    FileAppender and RollingFileAppender allow for the same log file to be written to by instances located in different JVMs
    10 fold improvement in the speed of transporting logging events over the wire 
    SMTPAppender now does TLS and SSL, subject line in outgoing email now based on PatternLayout
    
    �����e��������e��������>�����������������P��������������C�������
    �������������������N���������!��������������������Odds and ends II�����������������������������]���%() in pattern strings can do magic
     %-50(%d %level [%thread]) - %m%n
    DuplicateMessage filter��d���$���������"������������������%���������������f���������������f����������������8���B������������������������������������������������O����������"��������������������Odds and ends II�����������������������������]���%() in pattern strings can do magic
     %-50(%d %level [%thread]) - %m%n
    DuplicateMessage filter��d���$���������"������������������%���������������f���������������f����������������8���B������������������������������������������������P����������#��������������������Plans for the near future���������l���Finer threading model leading to less contention
    Better documentation
    Eclipse plug-in to visualize your logs�����H���������������������������
    ���Conclusion�����
    ������������������������b���Logback is the unofficial su����������������������������J����������������������������������������������������������������������������������������������������������������������ccessor of log4j, as the latter is no longer being actively developed.�����&���������������������������
    ���Questions?������������
    read the docs at http://logback.qos.ch/
    study the code at http://svn.qos.ch
    write to us at  logback-user@qos.ch
    file a bug report at http://jira.qos.ch/
    chat with us at irc.freenode.net#qos
    talk to us at +41 21 312 32 26��������������������������������d�������������������������������������������������������������������������������� ��������������������������U
    0��������(����������������������U
    0�����;���L����������������������U
    0�����]���p����������������������U
    0��������������������������������
    U
    0�����������/�������������������������������
    ���������������������������������������������������������������������������������������������������	����������������������
    �����������'����������������������(�����������
    �����������)����������������������*����������������������+����������������������.����������������������1����������������������5����������������������6����������������������7����������������������9����������������������D����������������������E����������������������F����������������������G����������������������K����������������������Q������������������������]���������
    ������������������������-��`���X��@�������������(����	��������������������
    ����������x����
    ����� ��c�$�������������+������<�������`�P �������������
    �+�
    �������������x����
    ����� ��c�$�������������+������<��������������������+�
    ������������X���
    ������
    ���0���A������������������?��������0	�X���
    ������
    ���0���A������������������?���������H����
    ���������0���������޽h������	���?��� ��������������33������������������_�_�_�P�P�T�1�0���i�����.���xPLK���+��������D=�����' ����������������������������=
    ���@B���	����+��������������
    �����������������������-������� ������H���$���(����	��������������������
    ����H������r����
    ���H�� ��S���������t<R������<�������P�0�������������
    �R�
    �������������r����
    ���H�� ��S���������H=R������<������� ` �������������R�
    ������������H����
    ���H������0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���y@1���+��������D=�����' ����������������������������=
    ���@B���	����+��������������
    �����������������������-�������0���������$���(����	��������������������
    ����������r����
    ����� ��S���������������<�������  `�������������
    ��
    �������������r����
    ����� ��S���������ܤ������<�������� `��������������
    ������������H����
    ���������0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���v@o���+��������D=�����' ����������������������������=
    ���@B���	����+�����}���������
    ������������������������\��$���(����	��������������������
    ����\�����r����
    ���\� ��S���������p������<�������  ``�������������
    ��
    �������������r����
    ���\� ��S���������D������<��������
    ��������������
    ������������H����
    ���\�����0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���D@+���+��������D=�����' ����������������������������=
    ���@B���	����+��������������
    ��������������������������h��V���(����	��������������������
    ����h�����x����
    ���h� ��c�$��������D_������<������������`�������������
    �_�
    �����������������
    ���h� ��c�$��������_������<����������� ��������������_�
    2�������������������P���Q!pT�H����
    ���h�����0���������޽h������	���?��� �������������XXZ�>������������������_�_�_�P�P�T�1�0���i�����.���SH���+��������D=�����' ����������������������������=
    ���@B���	����+�����}���������
    ��������������������������<��$���(����	��������������������
    ����<�����r����
    ���<� ��S���������������<�������  `�������������
    ��
    �������������r����
    ���<� ��S���������X������<������� `p��������������
    ������������H����
    ���<�����0���������޽h������	���?��� ����������}�������ff���������������_�_�_�P�P�T�1�0���i�����.���| 5\���+��������D=�����' �����������������������������=
    ���@B���	����+��������������
    0������������P��)���(����	��������������������
    ����P�����X����
    ���P� ��C������������������ 
    ������������������
    ���P� ��S����������������������
    0��������������
    +��������������At the end of each stack frame, logback will add a packaging information for the corresponding class. Packaging information consists of the containing jar file and versioning information. The inclusion of packaging information shortens the time it takes to identify software problems.
    
    Logback tries hard to give you the correct packaging information. However, if for any reason it is unsure, it will prefix packaging information with a ~.��$���������������������������������,��� ������������������������������������H����
    ���P�����0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���%hd�������!���
    0�q���i���������d�����(����	��������������������
    ����d�����X����
    ���d� ��C������������������ 
    ��������������_�i���
    ���d� ��S���������@�������������
    0�������������_�
    ���������������%() can be used to group parts of your logging output. Try it out!
    
    DuplicateMessageFilter will automatically filter out message if they repeateded over and over again.
    ��>���D��������������/�������
    �������������������������������H����
    ���d�����0��������޽h�������	���?��� ��������������33������8����0��������_�_�_�P�P�T�1�0��������.���0벭��rD��������M���Q�,��S�H��v[�K��]�N��:V�P� �X�b��������?
    ��e����Q������E���(��������������
    ����������������	����
    �������v�������������&���l�o�g�b�a�c�k�-�u�s������������������������	���
    ���������
    ����������������������������������������������������������������������՜.�+,D���՜.�+,�������������������������������������������������	������
    �����������������������������������
    ��������^�������������On-screen Show��������CG�s���>�����������������������������������A
    
    �������������������������������$������Arial����Times New Roman�
    ���Wingdings����Arial Black����Courier New����Pixel����Logback project����~ ����Modular architecture����Access Logging�!���logback-classic implements SLF4J����Joran: a bowl of fresh air����Configuration example:����Logback-access configuration����Another example:����Is Joran for me?����Internal error reporting����Errors in action����JMX����Documentation�%���Filters, Filters. Filters everywhere����EvaluatorFilter & Janino�
    ���TurboFilters����Parameterized logging�!���Markers for specialized handling�0���SiftingAppender or the appender-making appender����SiftingAppender (continued)����Tested & Ready�!���Package versions in stack traces����logger name abbreviation����Odds and ends����Odds and ends II����Odds and ends II����Plans for the near future����Conclusion����Questions?������������Fonts Used�������������Design Template����������
    ���Slide Titles�������������������(������X������`�����������������_PID_HLINKS�������Without Tagging������A���������������������������������������m�a�i�l�t�o�:�l�o�g�b�a�c�k�-�u�s�e�r�@�q�o�s�.�c�h����������������������������������������������h�t�t�p�:�/�/�l�o�g�b�a�c�k�.�q�o�s�.�c�h�/����������������������������������������������h�t�t�p�:�/�/�s�v�n�.�q�o�s�.�c�h�/����������������������������������������������h�t�t�p�:�/�/�j�i�r�a�.�q�o�s�.�c�h�/�������������������1�th��������������������������������������������������������������������_���� Ceki��� �C�e�k�i�������������������������������������������������������������������������������������������������������������������������������������������������� documents������������
    �������]������������$������������������������������JMX���������S���
    Logback configuration can be reloaded via JMX
    
    Statistical results exposed via JMX��������������S���������T������������ ��������������������������
    ���Documentation�����
    ��������������������������M�a�j�o�r� �a�r�e�a� �o�f� �e�f�f�o�r�t�.�
    �
    �C�o�m�p�l�e�t�e� �m�a�n�u�a�l�,� �w�i�t�h� �o�v�e�r� �1�5�0� �p�a�g�e�s� �o�f� �d�o�c�u�m�e�n�t�a�t�i�o�n�,� �i�s� �a�v�a�i�l�a�b�l�e� �f�o�r� �f�r�e�e�
    �
    �A� �s�h�o�r�t� �i�n�t�r�o�d�u�c�t�i�o�n� �t�o� �a�c�c�e�s�s� �l�o�g�g�i�n�g� �w�i�t�h� �l�o�g�b�a�c�k�-�a�c�c�e�s�s� �a�n�d� �J�e�t�t�y�
    �
    �j�a�v�a�d�o�c�,� �F�A�Q�,� �e�r�r�o�r� �c�o�d�e�s�,�& 
    �����������������������������������������������������=���������������������������$���Filters, Filters. Filters everywhere�����%���������%������(�������������Filters attachable to any Appender
    Evaluator filters
    Janino filters for evaluation based on java expressions
    TurboFilters for optimized global processing��,���5��������������2��������������!������������!���������
    ��������������������EvaluatorFilter & Janino��,���������������������������������������������<appender name="CYCLIC"
              class="c.q.l.core.read.CyclicBufferAppender">
      <filter class="c.q.l.core.filter.EvaluatorFilter">
        <evaluator name="loggingTaskEval">
    	    <expression>
    		  logger.contains("LoggingTask") &&
            message.contains("Howdydy-diddly-ho") &&
            (timeStamp-loggerContext.getBirthTime()) >= 20000
    		</expression>
    	 </evaluator>
    	 <OnMatch>DENY</OnMatch>
      </filter>
      <MaxSize>512</MaxSize>
    </appender>��4����������P�����������������Z������������
    �������������������������$����������������������������������!�����������������	����������������������������������������������������������������������������������������������������������������������������������������$���������!��������	�����������������������������������������������������������������������������������������������������������;������������������������������TurboFilters�������������������������������<turboFilter
         class="c.q.l.classic.turbo.MDCFilter">
      <MDCKey>userid</MDCKey>
      <Value>sebastien</Value>
      <OnMatch>ACCEPT</OnMatch>
    </turboFilter>��&���9��������Z�`������������������������������������
    ���������������������������������������������������������������	���������������������	����������������������������������������>������������������������������Parameterized logging������������Integer entry = new Interger(50); 
    logger.debug("The entry is "+entry+".");
    
    can be optimized as:
     if(logger.isDebugEnabled()) {
     logger.debug("The entry is "+entry+".");
    }
    
    or better yet:
    logger.debug("The entry is {}.", entry); 
    �������������Z�0���������������������������������K�������������������������������
    �����������������P���#��������������/����������������������������*��������������������������"�������������������������� ���Markers for specialized handling���������V���Markers are metadata for logging statements, coloring them for specialized processing
    �����V������������������W������������L���������������������������/���SiftingAppender or the appender-making appender�����0���������0������(������������� ���������������������������Sift logging according to runtime attributes
    E.g. separate logs according to user sessions, so that the log file generated by every user go into distinct log files, one log file per user. 
    Works with any appender, not just FileAppender�����-��������������������������������	���������������������������������������������������	��������������������������	�����������������-��������.��������������������M���������� ��������������������SiftingAppender (continued)��������������������(��������������������������������������� <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
        <discriminator>
          <Key>userid</Key>
          <DefaultValue>unknown</DefaultValue>
        </discriminator>
        <sift>
          <appender name="FILE-${userid}"
                    class="ch.qos.logback.core.FileAppender">
            <File>${userid}.log</File>s
            <Append>false</Append>
            <layout>
              <Pattern>%d %level %mdc %logger - %msg%n</Pattern>
            </layout>
          </appender>
        </sift>
      </appender>
    ������������P�P�������������������������fG�������������������������f�����������������fJ�����������������f�����������������f�������������������������������������+�����������������
    ���������
    ����������������������������������������������������������������������������
    �������������������������������������������	������������������������� ��������������������������6������������������������������������������������������������������������������������������������������������������������������������%�����������������������������Tested & Ready���������J���Battery of over 450 unit tests
    
    Tests written concomitantly with the code
    ��4���������������������*������������������K������������I�������������������������� ���Package versions in stack traces�����!���������!������(����������n��java.lang.NullPointerException
     at com.xyz.Wombat(Wombat.java:57) ~[wombat-1.3.jar:1.3]
     at com.xyz.Wombat(Wombat.java:76) ~[wombat-1.3.jar:1.3]
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native) ~[na:1.5.0_06]
     at java.lang.reflect.Method.invoke(Method.java:585) ~[na:1.5.0_06]
     at junit.runners.TestMethod.invoke(TestMethod.java:59) [junit-4.4.jar:na]
     etc..��^���o��������B��������������������������������������������������������������Q�����������J������������������������������logger name abbreviation�����,���������������������������
    ���Odds and ends���������d��RollingFileAppender automatic file compression the background
    FileAppender and RollingFileAppender allow for the same log file to be written to by instances located in different JVMs
    10 fold improvement in the speed of transporting logging events over the wire 
    SMTPAppender now does TLS and SSL, subject line in outgoing email now based on PatternLayout
    
    �����e��������e��������>�����������������P��������������C�������
    �������������������N���������!��������������������Odds and ends II�����������������������������]���%() in pattern strings can do magic
     %-50(%d %level [%thread]) - %m%n
    DuplicateMessage filter��d���$���������"������������������%���������������f���������������f����������������8���B������������������������������������������������O����������"��������������������Odds and ends II�����������������������������]���%() in pattern strings can do magic
     %-50(%d %level [%thread]) - %m%n
    DuplicateMessage filter��d���$���������"������������������%���������������f���������������f����������������8���B������������������������������������������������P����������#��������������������Plans for the near future���������l���Finer threading model leading to less contention
    Better documentation
    Eclipse plug-in to visualize your logs�����H���������������������������
    ���Conclusion�����
    ������������������������b���Logback is the unofficial successor of log4j, as the latter is no longer being actively developed.�����&���������������������������
    ���Questions?������������
    read the docs at http://logback.qos.ch/
    study the code at http://svn.qos.ch
    write to us at  logback-user@qos.ch
    file a bug report at http://jira.qos.ch/
    chat with us at irc.freenode.net#qos
    talk to us at +41 21 312 32 26��������������������������������d�������������������������������������������������������������������������������� ��������������������������U
    0��������(����������������������U
    0�����;���L����������������������U
    0�����]���p����������������������U
    0��������������������������������
    U
    0�����������/�������������������������������
    ���������������������������������������������������������������������������������������������������	����������������������
    �����������'����������������������(�����������
    �����������)����������������������*����������������������+����������������������.����������������������1����������������������5����������������������6����������������������7����������������������9����������������������D����������������������E����������������������F����������������������G����������������������K����������������������Q������������������������]���������
    ������������������������-��`���X��@�������������(����	��������������������
    ����������x����
    ����� ��c�$�������������,������<�������`�P �������������
    �,�
    �������������x����
    ����� ��c�$�������������P,������<��������������������,�
    ������������X���
    ������
    ���0���A������������������?��������0	�X���
    ������
    ���0���A������������������?���������H����
    ���������0���������޽h������	���?��� ��������������33������������������_�_�_�P�P�T�1�0���i�����.���xPLK���+��������D=�����' ����������������������������=
    ���@B���	����+������r�����e���w��������?
    �ae�ܮ����Q������E���(��������������
    ����������������	����
    �������v�������������&���l�o�g�b�a�c�k�-�u�s�e�r�@�q�o�s�.�c�h��4���m�a�i�l�t�o�:�l�o�g�b�a�c�k�-�u�s�e�r�@�q�o�s�.�c�h��t�������������,���h�t�t�p�:�/�/�l�o�g�b�a�c�k�.�q�o�s�.�c�h�/��,���h�t�t�p�:�/�/�l�o�g�b�a�c�k�.�q�o�s�.�c�h�/��b�������������"���h�t�t�p�:�/�/�s�v�n�.�q�o�s�.�c�h��$���h�t�t�p�:�/�/�s�v�n�.�q�o�s�.�c�h�/��h�������������&���h�t�t�p�:�/�/�j�i�r�a�.�q�o�s�.�c�h�/��&���h�t�t�p�:�/�/�j�i�r�a�.�q�o�s�.�c�h�/��D��/����0��������|����D���A�r�i�a�l���r� �N�e���0.�8� �0�������8�z[	00�����D���T�i�m�e�s� �N�e�w� �R�o�m�a�n���8� �0�������8�z[	00��� �D���W�i�n�g�d�i�n�g�s���R�o�m�a�n���8� �0�������8�z[	00��0�D���A�r�i�a�l� �B�l�a�c�k���m�a�n���8� �0�������8�z[	00���"@�D���C�o�u�r�i�e�r� �N�e�w���m�a�n���8� �0�������8�z[	00���1������@�����������.��������
    �������	��@�n����?���" ��d������d���������@���������������������  �������@@�������``������������l����d������h�[������:�����������������������������������������������������������*�������*�������������������������������������������������������������������������������������������
    �������
    ������������������������������������������ ������!�������������#������$��������������������'������(������)������*������+������,������-������.������/������0������1������2������3������4������5�������������7������8���������������������������9������:������;������=������<�������������?�������������A������B������C����������������������������������D������E������F������G������H������I������J���X�����������������K������L������M������N������O������P������Q������o����$��������������������������������������b�$���͒^bEN凙=U���������������$��������������������������������������b�$���LMJm /!�������������$��������������������������������������2�$���wlֲ;�A�����q������0��������A��������A��������P����������f����@��������������8�����������������������������	����������������������������cP;	�ʚ;S1�ʚ;���g������������4���d���d���d���d����������P�z[	0�����������p��������p��p�������@���<�����4���d���d���d���d���|�	0�.����������������������������������������<�����4���B���d���B���d������|�<	0���������������������g������������4���}���d���}���d����������P�z[	0��������������p��������@��p�������p���8����0��������_�_�_�P�P�T�1�0��������
    ���������?�����������-�O���������
    �=��8�������������������������������������Logback project��������������������������� �������������Ceki Glc & Sbastien Pennec�����������������������8��������������������������������������������������������������������������������~ ���������������������������������No revolution, only evolution.
    log4j is no longer being actively developed
    The same basic plumbing only done better. 
    Faster, smaller, higher gas mileage, and generally more bang for the buck.�������������Z�������������8���������������w������������-�����������������������������Modular architecture������������logback-core
    	Joran, Status,
       Context, pattern parsing
    logback-classic
    	developer logging
    logback-access
    	container (access) logging
    ��V���
    ��������Z�,��������Z���������Z���������Z���������Z���������Z�������������#�����������������������������Access Logging������������Definition: Access log
    		The log generated when a user 	accesses a web-page on a web server.
    
    Logback-access integrates seamlessly with Jetty and Tomcat
     ��<�����������Z�F��������Z�<��������Z���������Z��������������������������������������� ���logback-classic implements SLF4J�����!���������!������(������������Logback offers a native implementation of the SLF4J API => Logback exposes its logging API through SLF4J.
    If you are using logback, you are actually using SLF4J
    SLF4J can delegate to log4j, logback, java.util.logging or JCL
    SLF4J can bridge log4j, JCL and j.u.l.
    ��>���{��������������E��������������(�������������������������������������������������������Joran: a bowl of fresh air�����������G�i�v�e�n� �r�u�l�e�s� �(�p�a�t�t�e�r�n�s� �&� �a�c�t�i�o�n�s�)� �i�t� �c�a�n� �c�o�n�f�i�g�u�r�e� �a�n�y� �o�b�j�e�c�t�.�
    �J�o�r�a�n� �c�a�n� �l�e�a�r�n� �n�e�w� �r�u�l�e�s� �o�n� �t�h�e� �f�l�y�.�
    �W�i�t�h� �i�t�s� �i�m�p�l�i�c�i�t� �r�u�l�e�s�,� �y�o�u� �d�o�n� t� �e�v�e�n� �h�a�v�e� �t�o� �w�r�i�t�e� �r�u�l�e�s�.� �
    �I�t� �c�a�n� �d�o� �p�a�r�t�i�a�l� �r�e�p�l�a�y�.�
    �I�t� �i�s� �g�e�n�e�r�i�c� �(�c�a�n� �b�e� �u�s�e�d� �i�n� �y�o�u�r� �o�w�n� �p�r�o�j�e�c�t�s�)���&�����������Z�d�������<�������M�����������������������������������������Configuration example:��������������������(������������
    <appender name="FILE"
         class="ch.qos.logback.core.rolling.RollingFileAppender">
      <File>logFile.log</File>
      <rollingPolicy
    	   class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <FileNamePattern>
               logFile.%d{yyyy-MM-dd}.log.zip
        </FileNamePatter>
      </rollingPolicy>
    
      <layout class="ch.qos.logback.classic.PatternLayout">
        <Pattern>
          %d{HH:mm:ss,SSS} [%thread] %-5level %logger{22} - %msg%n
        </Pattern>
      </layout>
    </appender>��6����������P�5�������,����������v�������������#�������/����������������������������
    ��������������2���������������������
    �����������������������������������
    ��������������$���������������������$��������������(������������<�����������������������������Logback-access configuration��������������������(����������x��<appender name="FILE"	    
                class="c.q.l.c.r.RollingFileAppender">
      <File>access.log"</File>
      <rollingPolicy
            class="c.q.l.c.r.TimeBasedRollingPolicy">
        <FileNamePattern>
          access.%d{yyyy-MM-dd}.log.zip
        </FileNamePattern>
      </rollingPolicy>
    
      <layout class="c.q.l.access.PatternLayout">
        <Pattern">combined</Pattern">
      </layout>
    </appender>��4���y�������P������������������������������.���������������������
    ��������������
    �������������� ��������������������������������������������������������
    ���������������������=���������������������	��������������������Another example:��������������������(������������<testShell name="test1">
      <period>5 minutes</period>
      <!-- we need to configure a totally new test 
           object for each run of the test -->
      <test class="com.wombat.myTest">
        <DataSource class="c.w.JNDIDS">
          <url>jndi://com.wombat/ds"</url>
        </DataSource>
      </test>
    <testShell>
    
    <testShell name="test2">
      <period>60 seconds</period>
      <test class="com.wombat.myTest2">
        <file>c:/wombat/foo.properties</file>
      </test>
    </testShell>��4����������P�������������������������������������	����������������������������
    ��������������
    �������
    �������������������������������������������������
    �������
    �������	��������������	�������[���������������������	�������������������8�����������������������������Is Joran for me?���������a���
    Joran is ideal for building frameworks which need to support arbitrary user-developed plug-ins.
    �����a������������������b���������������������
    ��������������������Internal error reporting���������~���Who shall guard the guards?
    
    Logback modules cannot use logging to report their own state.
    
    Something more generic is needed.
    ��(���������������������b���������������������0�����������������������������Errors in action������������
    Internal state available via StatusManager
    
    Exceptions and status messages accompanied by references, i.e. URLs, to external documents������������
    �������]������������$������������������������������JMX���������S���
    Logback configuration can be reloaded via JMX
    
    Statistical results exposed via JMX��������������S���������T������������ ��������������������������
    ���Documentation�����
    ��������������������������M�a�j�o�r� �a�r�e�a� �o�f� �e�f�f�o�r�t�.�
    �
    �C�o�m�p�l�e�t�e� �m�a�n�u�a�l�,� �w�i�t�h� �o�v�e�r� �1�5�0� �p�a�g�e�s� �o�f� �d�o�c�u�m�e�n�t�a�t�i�o�n�,� �i�s� �a�v�a�i�l�a�b�l�e� �f�o�r� �f�r�e�e�
    �
    �A� �s�h�o�r�t� �i�n�t�r�o�d�u�c�t�i�o�n� �t�o� �a�c�c�e�s�s� �l�o�g�g�i�n�g� �w�i�t�h� �l�o�g�b�a�c�k�-�a�c�c�e�s�s� �a�n�d� �J�e�t�t�y�
    �
    �j�a�v�a�d�o�c�,� �F�A�Q�,� �e�r�r�o�r� �c�o�d�e�s�,�& 
    �����������������������������������������������������=���������������������������$���Filters, Filters. Filters everywhere�����%���������%������(�������������Filters attachable to any Appender
    Evaluator filters
    Janino filters for evaluation based on java expressions
    TurboFilters for optimized global processing��,���5��������������2��������������!������������!���������
    ��������������������EvaluatorFilter & Janino��,���������������������������������������������<appender name="CYCLIC"
              class="c.q.l.core.read.CyclicBufferAppender">
      <filter class="c.q.l.core.filter.EvaluatorFilter">
        <evaluator name="loggingTaskEval">
    	    <expression>
    		  logger.contains("LoggingTask") &&
            message.contains("Howdydy-diddly-ho") &&
            (timeStamp-loggerContext.getBirthTime()) >= 20000
    		</expression>
    	 </evaluator>
    	 <OnMatch>DENY</OnMatch>
      </filter>
      <MaxSize>512</MaxSize>
    </appender>��4����������P�����������������Z������������
    �������������������������$����������������������������������!�����������������	����������������������������������������������������������������������������������������������������������������������������������������$���������!��������	�����������������������������������������������������������������������������������������������������������;������������������������������TurboFilters�������������������������������<turboFilter
         class="c.q.l.classic.turbo.MDCFilter">
      <MDCKey>userid</MDCKey>
      <Value>sebastien</Value>
      <OnMatch>ACCEPT</OnMatch>
    </turboFilter>��&���9��������Z�`������������������������������������
    ���������������������������������������������������������������	���������������������	����������������������������������������>������������������������������Parameterized logging������������Integer entry = new Interger(50); 
    logger.debug("The entry is "+entry+".");
    
    can be optimized as:
     if(logger.isDebugEnabled()) {
     logger.debug("The entry is "+entry+".");
    }
    
    or better yet:
    logger.debug("The entry is {}.", entry); 
    �������������Z�0���������������������������������K�������������������������������
    �����������������P���#��������������/����������������������������*��������������������������"�������������������������� ���Markers for specialized handling���������V���Markers are metadata for logging statements, coloring them for specialized processing
    �����V������������������W������������L���������������������������/���SiftingAppender or the appender-making appender�����0���������0������(������������� ���������������������������Sift logging according to runtime attributes
    E.g. separate logs according to user sessions, so that the log file generated by every user go into distinct log files, one log file per user. 
    Works with any appender, not just FileAppender�����-��������������������������������	���������������������������������������������������	��������������������������	�����������������-��������.��������������������M���������� ��������������������SiftingAppender (continued)��������������������(��������������������������������������� <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
        <discriminator>
          <Key>userid</Key>
          <DefaultValue>unknown</DefaultValue>
        </discriminator>
        <sift>
          <appender name="FILE-${userid}"
                    class="ch.qos.logback.core.FileAppender">
            <File>${userid}.log</File>s
            <Append>false</Append>
            <layout>
              <Pattern>%d %level %mdc %logger - %msg%n</Pattern>
            </layout>
          </appender>
        </sift>
      </appender>
    ������������P�P�������������������������fG�������������������������f�����������������fJ�����������������f�����������������f�������������������������������������+�����������������
    ���������
    ����������������������������������������������������������������������������
    �������������������������������������������	������������������������� ��������������������������6������������������������������������������������������������������������������������������������������������������������������������%�����������������������������Tested & Ready���������J���Battery of over 450 unit tests
    
    Tests written concomitantly with the code
    ��4���������������������*������������������K������������I�������������������������� ���Package versions in stack traces�����!���������!������(����������n��java.lang.NullPointerException
     at com.xyz.Wombat(Wombat.java:57) ~[wombat-1.3.jar:1.3]
     at com.xyz.Wombat(Wombat.java:76) ~[wombat-1.3.jar:1.3]
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native) ~[na:1.5.0_06]
     at java.lang.reflect.Method.invoke(Method.java:585) ~[na:1.5.0_06]
     at junit.runners.TestMethod.invoke(TestMethod.java:59) [junit-4.4.jar:na]
     etc..��^���o��������B��������������������������������������������������������������Q�����������J������������������������������logger name abbreviation�����,���������������������������
    ���Odds and ends���������d��RollingFileAppender automatic file compression the background
    FileAppender and RollingFileAppender allow for the same log file to be written to by instances located in different JVMs
    10 fold improvement in the speed of transporting logging events over the wire 
    SMTPAppender now does TLS and SSL, subject line in outgoing email now based on PatternLayout
    
    �����e��������e��������>�����������������P��������������C�������
    �������������������N���������!��������������������Odds and ends II�����������������������������]���%() in pattern strings can do magic
     %-50(%d %level [%thread]) - %m%n
    DuplicateMessage filter��d���$���������"������������������%���������������f���������������f����������������8���B������������������������������������������������O����������"��������������������Odds and ends II�����������������������������]���%() in pattern strings can do magic
     %-50(%d %level [%thread]) - %m%n
    DuplicateMessage filter��d���$���������"������������������%���������������f���������������f����������������8���B������������������������������������������������P����������#��������������������Plans for the near future���������l���Finer threading model leading to less contention
    Better documentation
    Eclipse plug-in to visualize your logs�����H���������������������������
    ���Conclusion�����
    ������������������������b���Logback is the unofficial successor of log4j, as the latter is no longer being actively developed.�����&���������������������������
    ���Questions?������������
    read the docs at http://logback.qos.ch/
    study the code at http://svn.qos.ch
    write to us at  logback-user@qos.ch
    file a bug report at http://jira.qos.ch/
    chat with us at irc.freenode.net#qos
    talk to us at +41 21 312 32 26��������������������������������d�������������������������������������������������������������������������������� ��������������������������U
    0��������(����������������������U
    0�����;���L����������������������U
    0�����]���p����������������������U
    0��������������������������������
    U
    0�����������/�������������������������������
    ���������������������������������������������������������������������������������������������������	����������������������
    �����������'����������������������(�����������
    �����������)����������������������*����������������������+����������������������.����������������������1����������������������5����������������������6����������������������7����������������������9����������������������D����������������������E����������������������F����������������������G����������������������K����������������������Q�������������������������r�������������?
    ��
    ����Q�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/js/�����������������������������������������������������������������������������0000755�0001750�0001750�00000000000�12203357067�014525� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/js/jquery.cookies.2.2.0.js������������������������������������������������������0000644�0001750�0001750�00000026220�12143164237�020473� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Copyright (c) 2005 - 2010, James Auldridge
     * All rights reserved.
     *
     * Licensed under the BSD, MIT, and GPL (your choice!) Licenses:
     *  http://code.google.com/p/cookies/wiki/License
     *
     */
    var jaaulde = window.jaaulde || {};
    jaaulde.utils = jaaulde.utils || {};
    jaaulde.utils.cookies = ( function()
    {
    	var resolveOptions, assembleOptionsString, parseCookies, constructor, defaultOptions = {
    		expiresAt: null,
    		path: '/',
    		domain:  null,
    		secure: false
    	};
    	/**
    	* resolveOptions - receive an options object and ensure all options are present and valid, replacing with defaults where necessary
    	*
    	* @access private
    	* @static
    	* @parameter Object options - optional options to start with
    	* @return Object complete and valid options object
    	*/
    	resolveOptions = function( options )
    	{
    		var returnValue, expireDate;
    
    		if( typeof options !== 'object' || options === null )
    		{
    			returnValue = defaultOptions;
    		}
    		else
    		{
    			returnValue = {
    				expiresAt: defaultOptions.expiresAt,
    				path: defaultOptions.path,
    				domain: defaultOptions.domain,
    				secure: defaultOptions.secure
    			};
    
    			if( typeof options.expiresAt === 'object' && options.expiresAt instanceof Date )
    			{
    				returnValue.expiresAt = options.expiresAt;
    			}
    			else if( typeof options.hoursToLive === 'number' && options.hoursToLive !== 0 )
    			{
    				expireDate = new Date();
    				expireDate.setTime( expireDate.getTime() + ( options.hoursToLive * 60 * 60 * 1000 ) );
    				returnValue.expiresAt = expireDate;
    			}
    
    			if( typeof options.path === 'string' && options.path !== '' )
    			{
    				returnValue.path = options.path;
    			}
    
    			if( typeof options.domain === 'string' && options.domain !== '' )
    			{
    				returnValue.domain = options.domain;
    			}
    
    			if( options.secure === true )
    			{
    				returnValue.secure = options.secure;
    			}
    		}
    
    		return returnValue;
    		};
    	/**
    	* assembleOptionsString - analyze options and assemble appropriate string for setting a cookie with those options
    	*
    	* @access private
    	* @static
    	* @parameter options OBJECT - optional options to start with
    	* @return STRING - complete and valid cookie setting options
    	*/
    	assembleOptionsString = function( options )
    	{
    		options = resolveOptions( options );
    
    		return (
    			( typeof options.expiresAt === 'object' && options.expiresAt instanceof Date ? '; expires=' + options.expiresAt.toGMTString() : '' ) +
    			'; path=' + options.path +
    			( typeof options.domain === 'string' ? '; domain=' + options.domain : '' ) +
    			( options.secure === true ? '; secure' : '' )
    		);
    	};
    	/**
    	* parseCookies - retrieve document.cookie string and break it into a hash with values decoded and unserialized
    	*
    	* @access private
    	* @static
    	* @return OBJECT - hash of cookies from document.cookie
    	*/
    	parseCookies = function()
    	{
    		var cookies = {}, i, pair, name, value, separated = document.cookie.split( ';' ), unparsedValue;
    		for( i = 0; i < separated.length; i = i + 1 )
    		{
    			pair = separated[i].split( '=' );
    			name = pair[0].replace( /^\s*/, '' ).replace( /\s*$/, '' );
    
    			try
    			{
    				value = decodeURIComponent( pair[1] );
    			}
    			catch( e1 )
    			{
    				value = pair[1];
    			}
    
    			if( typeof JSON === 'object' && JSON !== null && typeof JSON.parse === 'function' )
    			{
    				try
    				{
    					unparsedValue = value;
    					value = JSON.parse( value );
    				}
    				catch( e2 )
    				{
    					value = unparsedValue;
    				}
    			}
    
    			cookies[name] = value;
    		}
    		return cookies;
    	};
    
    	constructor = function(){};
    
    	/**
    	 * get - get one, several, or all cookies
    	 *
    	 * @access public
    	 * @paramater Mixed cookieName - String:name of single cookie; Array:list of multiple cookie names; Void (no param):if you want all cookies
    	 * @return Mixed - Value of cookie as set; Null:if only one cookie is requested and is not found; Object:hash of multiple or all cookies (if multiple or all requested);
    	 */
    	constructor.prototype.get = function( cookieName )
    	{
    		var returnValue, item, cookies = parseCookies();
    
    		if( typeof cookieName === 'string' )
    		{
    			returnValue = ( typeof cookies[cookieName] !== 'undefined' ) ? cookies[cookieName] : null;
    		}
    		else if( typeof cookieName === 'object' && cookieName !== null )
    		{
    			returnValue = {};
    			for( item in cookieName )
    			{
    				if( typeof cookies[cookieName[item]] !== 'undefined' )
    				{
    					returnValue[cookieName[item]] = cookies[cookieName[item]];
    				}
    				else
    				{
    					returnValue[cookieName[item]] = null;
    				}
    			}
    		}
    		else
    		{
    			returnValue = cookies;
    		}
    
    		return returnValue;
    	};
    	/**
    	 * filter - get array of cookies whose names match the provided RegExp
    	 *
    	 * @access public
    	 * @paramater Object RegExp - The regular expression to match against cookie names
    	 * @return Mixed - Object:hash of cookies whose names match the RegExp
    	 */
    	constructor.prototype.filter = function( cookieNameRegExp )
    	{
    		var cookieName, returnValue = {}, cookies = parseCookies();
    
    		if( typeof cookieNameRegExp === 'string' )
    		{
    			cookieNameRegExp = new RegExp( cookieNameRegExp );
    		}
    
    		for( cookieName in cookies )
    		{
    			if( cookieName.match( cookieNameRegExp ) )
    			{
    				returnValue[cookieName] = cookies[cookieName];
    			}
    		}
    
    		return returnValue;
    	};
    	/**
    	 * set - set or delete a cookie with desired options
    	 *
    	 * @access public
    	 * @paramater String cookieName - name of cookie to set
    	 * @paramater Mixed value - Any JS value. If not a string, will be JSON encoded; NULL to delete
    	 * @paramater Object options - optional list of cookie options to specify
    	 * @return void
    	 */
    	constructor.prototype.set = function( cookieName, value, options )
    	{
    		if( typeof options !== 'object' || options === null )
    		{
    			options = {};
    		}
    
    		if( typeof value === 'undefined' || value === null )
    		{
    			value = '';
    			options.hoursToLive = -8760;
    		}
    
    		else if( typeof value !== 'string' )
    		{
    			if( typeof JSON === 'object' && JSON !== null && typeof JSON.stringify === 'function' )
    			{
    				value = JSON.stringify( value );
    			}
    			else
    			{
    				throw new Error( 'cookies.set() received non-string value and could not serialize.' );
    			}
    		}
    
    
    		var optionsString = assembleOptionsString( options );
    
    		document.cookie = cookieName + '=' + encodeURIComponent( value ) + optionsString;
    	};
    	/**
    	 * del - delete a cookie (domain and path options must match those with which the cookie was set; this is really an alias for set() with parameters simplified for this use)
    	 *
    	 * @access public
    	 * @paramater MIxed cookieName - String name of cookie to delete, or Bool true to delete all
    	 * @paramater Object options - optional list of cookie options to specify ( path, domain )
    	 * @return void
    	 */
    	constructor.prototype.del = function( cookieName, options )
    	{
    		var allCookies = {}, name;
    
    		if( typeof options !== 'object' || options === null )
    		{
    			options = {};
    		}
    
    		if( typeof cookieName === 'boolean' && cookieName === true )
    		{
    			allCookies = this.get();
    		}
    		else if( typeof cookieName === 'string' )
    		{
    			allCookies[cookieName] = true;
    		}
    
    		for( name in allCookies )
    		{
    			if( typeof name === 'string' && name !== '' )
    			{
    				this.set( name, null, options );
    			}
    		}
    	};
    	/**
    	 * test - test whether the browser is accepting cookies
    	 *
    	 * @access public
    	 * @return Boolean
    	 */
    	constructor.prototype.test = function()
    	{
    		var returnValue = false, testName = 'cT', testValue = 'data';
    
    		this.set( testName, testValue );
    
    		if( this.get( testName ) === testValue )
    		{
    			this.del( testName );
    			returnValue = true;
    		}
    
    		return returnValue;
    	};
    	/**
    	 * setOptions - set default options for calls to cookie methods
    	 *
    	 * @access public
    	 * @param Object options - list of cookie options to specify
    	 * @return void
    	 */
    	constructor.prototype.setOptions = function( options )
    	{
    		if( typeof options !== 'object' )
    		{
    			options = null;
    		}
    
    		defaultOptions = resolveOptions( options );
    	};
    
    	return new constructor();
    } )();
    
    ( function()
    {
    	if( window.jQuery )
    	{
    		( function( $ )
    		{
    			$.cookies = jaaulde.utils.cookies;
    
    			var extensions = {
    				/**
    				* $( 'selector' ).cookify - set the value of an input field, or the innerHTML of an element, to a cookie by the name or id of the field or element
    				*                           (field or element MUST have name or id attribute)
    				*
    				* @access public
    				* @param options OBJECT - list of cookie options to specify
    				* @return jQuery
    				*/
    				cookify: function( options )
    				{
    					return this.each( function()
    					{
    						var i, nameAttrs = ['name', 'id'], name, $this = $( this ), value;
    
    						for( i in nameAttrs )
    						{
    							if( ! isNaN( i ) )
    							{
    								name = $this.attr( nameAttrs[ i ] );
    								if( typeof name === 'string' && name !== '' )
    								{
    									if( $this.is( ':checkbox, :radio' ) )
    									{
    										if( $this.attr( 'checked' ) )
    										{
    											value = $this.val();
    										}
    									}
    									else if( $this.is( ':input' ) )
    									{
    										value = $this.val();
    									}
    									else
    									{
    										value = $this.html();
    									}
    
    									if( typeof value !== 'string' || value === '' )
    									{
    										value = null;
    									}
    
    									$.cookies.set( name, value, options );
    
    									break;
    								}
    							}
    						}
    					} );
    				},
    				/**
    				* $( 'selector' ).cookieFill - set the value of an input field or the innerHTML of an element from a cookie by the name or id of the field or element
    				*
    				* @access public
    				* @return jQuery
    				*/
    				cookieFill: function()
    				{
    					return this.each( function()
    					{
    						var n, getN, nameAttrs = ['name', 'id'], name, $this = $( this ), value;
    
    						getN = function()
    						{
    							n = nameAttrs.pop();
    							return !! n;
    						};
    
    						while( getN() )
    						{
    							name = $this.attr( n );
    							if( typeof name === 'string' && name !== '' )
    							{
    								value = $.cookies.get( name );
    								if( value !== null )
    								{
    									if( $this.is( ':checkbox, :radio' ) )
    									{
    										if( $this.val() === value )
    										{
    											$this.attr( 'checked', 'checked' );
    										}
    										else
    										{
    											$this.removeAttr( 'checked' );
    										}
    									}
    									else if( $this.is( ':input' ) )
    									{
    										$this.val( value );
    									}
    									else
    									{
    										$this.html( value );
    									}
    								}
    								
    								break;
    							}
    						}
    					} );
    				},
    				/**
    				* $( 'selector' ).cookieBind - call cookie fill on matching elements, and bind their change events to cookify()
    				*
    				* @access public
    				* @param options OBJECT - list of cookie options to specify
    				* @return jQuery
    				*/
    				cookieBind: function( options )
    				{
    					return this.each( function()
    					{
    						var $this = $( this );
    						$this.cookieFill().change( function()
    						{
    							$this.cookify( options );
    						} );
    					} );
    				}
    			};
    
    			$.each( extensions, function( i )
    			{
    				$.fn[i] = this;
    			} );
    
    		} )( window.jQuery );
    	}
    } )();��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/js/decorator.js�����������������������������������������������������������������0000644�0001750�0001750�00000005236�12143164237�017051� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
    
    //   <h3><a name="LoggerContext" href="#LoggerContext"><span
    //    class="anchor"/></a>Logger context</h3>
    
    function decorate() {
      var anchor = findAnchorInURL(document.URL);
      decoratePropertiesInTables(anchor);
      decorateDoAnchor(anchor);
      decorateConversionWordInTables(anchor);
    }
    
    // ----------------------------------------------
    function findAnchorInURL(url) {
    
     if(url == null) return null
      var index = url.lastIndexOf("#");
      if(index != -1 && (index+1) < url.length) 
        return url.substr(index+1);
      else 
        return null;
    }
    
    // ----------------------------------------------
    function decoratePropertiesInTables(anchor) {
    
     //if(1==1) return;
     var elems = $('tr td:first-child span.prop');
    
     for(var i = 0; i < elems.length; i++) {
       var e = elems[i];
       var p = e.parentNode;
       if(p == null) continue;
    
       var tmpHTML = p.innerHTML;
       var propName = e.innerHTML;
       var nameAttr = $(e).attr('name')
        
       if(nameAttr == null) {
         var containerAttr = $(e).attr('container')
         if(containerAttr != null) 
           nameAttr = containerAttr+capitaliseFirstLetter(propName);
         else 
           nameAttr = propName;
       }
       
       p.innerHTML = "<a name='" + nameAttr + "' href='#" + nameAttr +
                    "'><span class='anchor'/></a><b>" +tmpHTML +"</b>";
       scrollIfMatch(p, nameAttr, anchor);
     } // for 
    }
    
    function decorateConversionWordInTables(anchor) {
     var elems = $('tr td.word');
     for(var i = 0; i < elems.length; i++) {
       var e = elems[i];
       var tmpHTML = e.innerHTML;
       var nameAttr = $(e).attr('name')
       if(nameAttr == null) 
         continue;
       e.innerHTML = "<a name='" + nameAttr + "' href='#" + nameAttr +
                    "'><span class='anchor'/></a>" +tmpHTML;
       scrollIfMatch(e, nameAttr, anchor);
     }
    }
    
    
    function decorateDoAnchor(anchor) {
       var elems = $('.doAnchor');
       for(var i = 0; i < elems.length; i++) {
         var e = elems[i];
         var tmpHTML = e.innerHTML;
         var nameAttr = $(e).attr('name')
         if(nameAttr == null) {
           nameAttr = camelCase($.trim(tmpHTML))
         }
         e.innerHTML = "<a name='" + nameAttr + "' href='#" + nameAttr +
                    "'><span class='anchor'/></a>" +tmpHTML;
         scrollIfMatch(e, nameAttr, anchor);
       }
    } 
    
    function scrollIfMatch(element, nameAttr, anchor) {
      if(anchor != null && nameAttr.toString() == anchor)
         element.scrollIntoView(true);
    
    
    }
    
    function capitaliseFirstLetter(str) {
      return str.charAt(0).toUpperCase() + str.slice(1);
    }
    
    
    function camelCase(str) {  
      var res = str.trim().replace(/\s\w/g, function(match) {
                  return match.trim().toUpperCase();
                });
      return res;
    }
    
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/js/jquery-min.js����������������������������������������������������������������0000644�0001750�0001750�00000271170�12143164237�017171� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*! jQuery v1.7.2 jquery.com | jquery.org/license */
    (function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cu(a){if(!cj[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ck||(ck=c.createElement("iframe"),ck.frameBorder=ck.width=ck.height=0),b.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write((f.support.boxModel?"<!doctype html>":"")+"<html><body>"),cl.close();d=cl.createElement(a),cl.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ck)}cj[a]=e}return cj[a]}function ct(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function cs(){cq=b}function cr(){setTimeout(cs,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function ca(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function b_(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bD.test(a)?d(a,e):b_(a+"["+(typeof e=="object"?b:"")+"]",e,c,d)});else if(!c&&f.type(b)==="object")for(var e in b)b_(a+"["+e+"]",b[e],c,d);else d(a,b)}function b$(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function bZ(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bS,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=bZ(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=bZ(a,c,d,e,"*",g));return l}function bY(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bO),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bB(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?1:0,g=4;if(d>0){if(c!=="border")for(;e<g;e+=2)c||(d-=parseFloat(f.css(a,"padding"+bx[e]))||0),c==="margin"?d+=parseFloat(f.css(a,c+bx[e]))||0:d-=parseFloat(f.css(a,"border"+bx[e]+"Width"))||0;return d+"px"}d=by(a,b);if(d<0||d==null)d=a.style[b];if(bt.test(d))return d;d=parseFloat(d)||0;if(c)for(;e<g;e+=2)d+=parseFloat(f.css(a,"padding"+bx[e]))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+bx[e]+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+bx[e]))||0);return d+"px"}function bo(a){var b=c.createElement("div");bh.appendChild(b),b.innerHTML=a.outerHTML;return b.firstChild}function bn(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bm(a):b!=="script"&&typeof a.getElementsByTagName!="undefined"&&f.grep(a.getElementsByTagName("input"),bm)}function bm(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bl(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bk(a,b){var c;b.nodeType===1&&(b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase(),c==="object"?b.outerHTML=a.outerHTML:c!=="input"||a.type!=="checkbox"&&a.type!=="radio"?c==="option"?b.selected=a.defaultSelected:c==="input"||c==="textarea"?b.defaultValue=a.defaultValue:c==="script"&&b.text!==a.text&&(b.text=a.text):(a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value)),b.removeAttribute(f.expando),b.removeAttribute("_submit_attached"),b.removeAttribute("_change_attached"))}function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d<e;d++)f.event.add(b,c,i[c][d])}h.data&&(h.data=f.extend({},h.data))}}function bi(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function U(a){var b=V.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function T(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(O.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?+d:j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c<d;c++)b[a[c]]=!0;return b}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){if(typeof c!="string"||!c)return null;var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b,c){var d;if(b){if(H)return H.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h,i){var j,k=d==null,l=0,m=a.length;if(d&&typeof d=="object"){for(l in d)e.access(a,c,l,d[l],1,h,f);g=1}else if(f!==b){j=i===b&&e.isFunction(f),k&&(j?(j=c,c=function(a,b,c){return j.call(e(a),c)}):(c.call(a,f),c=null));if(c)for(;l<m;l++)c(a[l],d,j?f.call(a[l],l,c(a[l],d)):f,i);g=1}return g?a:k?c.call(a):m?c(a[0],d):h},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test(" ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g={};f.Callbacks=function(a){a=a?g[a]||h(a):{};var c=[],d=[],e,i,j,k,l,m,n=function(b){var d,e,g,h,i;for(d=0,e=b.length;d<e;d++)g=b[d],h=f.type(g),h==="array"?n(g):h==="function"&&(!a.unique||!p.has(g))&&c.push(g)},o=function(b,f){f=f||[],e=!a.memory||[b,f],i=!0,j=!0,m=k||0,k=0,l=c.length;for(;c&&m<l;m++)if(c[m].apply(b,f)===!1&&a.stopOnFalse){e=!0;break}j=!1,c&&(a.once?e===!0?p.disable():c=[]:d&&d.length&&(e=d.shift(),p.fireWith(e[0],e[1])))},p={add:function(){if(c){var a=c.length;n(arguments),j?l=c.length:e&&e!==!0&&(k=a,o(e[0],e[1]))}return this},remove:function(){if(c){var b=arguments,d=0,e=b.length;for(;d<e;d++)for(var f=0;f<c.length;f++)if(b[d]===c[f]){j&&f<=l&&(l--,f<=m&&m--),c.splice(f--,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.length;for(;b<d;b++)if(a===c[b])return!0}return!1},empty:function(){c=[];return this},disable:function(){c=d=e=b;return this},disabled:function(){return!c},lock:function(){d=b,(!e||e===!0)&&p.disable();return this},locked:function(){return!d},fireWith:function(b,c){d&&(j?a.once||d.push([b,c]):(!a.once||!e)&&o(b,c));return this},fire:function(){p.fireWith(this,arguments);return this},fired:function(){return!!i}};return p};var i=[].slice;f.extend({Deferred:function(a){var b=f.Callbacks("once memory"),c=f.Callbacks("once memory"),d=f.Callbacks("memory"),e="pending",g={resolve:b,reject:c,notify:d},h={done:b.add,fail:c.add,progress:d.add,state:function(){return e},isResolved:b.fired,isRejected:c.fired,then:function(a,b,c){i.done(a).fail(b).progress(c);return this},always:function(){i.done.apply(i,arguments).fail.apply(i,arguments);return this},pipe:function(a,b,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[b,"reject"],progress:[c,"notify"]},function(a,b){var c=b[0],e=b[1],g;f.isFunction(c)?i[a](function(){g=c.apply(this,arguments),g&&f.isFunction(g.promise)?g.promise().then(d.resolve,d.reject,d.notify):d[e+"With"](this===i?d:this,[g])}):i[a](d[e])})}).promise()},promise:function(a){if(a==null)a=h;else for(var b in h)a[b]=h[b];return a}},i=h.promise({}),j;for(j in g)i[j]=g[j].fire,i[j+"With"]=g[j].fireWith;i.done(function(){e="resolved"},c.disable,d.lock).fail(function(){e="rejected"},b.disable,d.lock),a&&a.call(i,i);return i},when:function(a){function m(a){return function(b){e[a]=arguments.length>1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c<d;c++)b[c]&&b[c].promise&&f.isFunction(b[c].promise)?b[c].promise().then(l(c),j.reject,m(c)):--g;g||j.resolveWith(j,b)}else j!==a&&j.resolveWith(j,d?[a]:[]);return k}}),f.support=function(){var b,d,e,g,h,i,j,k,l,m,n,o,p=c.createElement("div"),q=c.documentElement;p.setAttribute("className","t"),p.innerHTML="   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=p.getElementsByTagName("*"),e=p.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=p.getElementsByTagName("input")[0],b={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:p.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,pixelMargin:!0},f.boxModel=b.boxModel=c.compatMode==="CSS1Compat",i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete p.test}catch(r){b.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",function(){b.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),i.setAttribute("name","t"),p.appendChild(i),j=c.createDocumentFragment(),j.appendChild(p.lastChild),b.checkClone=j.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,j.removeChild(i),j.appendChild(p);if(p.attachEvent)for(n in{submit:1,change:1,focusin:1})m="on"+n,o=m in p,o||(p.setAttribute(m,"return;"),o=typeof p[m]=="function"),b[n+"Bubbles"]=o;j.removeChild(p),j=g=h=p=i=null,f(function(){var d,e,g,h,i,j,l,m,n,q,r,s,t,u=c.getElementsByTagName("body")[0];!u||(m=1,t="padding:0;margin:0;border:",r="position:absolute;top:0;left:0;width:1px;height:1px;",s=t+"0;visibility:hidden;",n="style='"+r+t+"5px solid #000;",q="<div "+n+"display:block;'><div style='"+t+"0;display:block;overflow:hidden;'></div></div>"+"<table "+n+"' cellpadding='0' cellspacing='0'>"+"<tr><td></td></tr></table>",d=c.createElement("div"),d.style.cssText=s+"width:0;height:0;position:static;top:0;margin-top:"+m+"px",u.insertBefore(d,u.firstChild),p=c.createElement("div"),d.appendChild(p),p.innerHTML="<table><tr><td style='"+t+"0;display:none'></td><td>t</td></tr></table>",k=p.getElementsByTagName("td"),o=k[0].offsetHeight===0,k[0].style.display="",k[1].style.display="none",b.reliableHiddenOffsets=o&&k[0].offsetHeight===0,a.getComputedStyle&&(p.innerHTML="",l=c.createElement("div"),l.style.width="0",l.style.marginRight="0",p.style.width="2px",p.appendChild(l),b.reliableMarginRight=(parseInt((a.getComputedStyle(l,null)||{marginRight:0}).marginRight,10)||0)===0),typeof p.style.zoom!="undefined"&&(p.innerHTML="",p.style.width=p.style.padding="1px",p.style.border=0,p.style.overflow="hidden",p.style.display="inline",p.style.zoom=1,b.inlineBlockNeedsLayout=p.offsetWidth===3,p.style.display="block",p.style.overflow="visible",p.innerHTML="<div style='width:5px;'></div>",b.shrinkWrapBlocks=p.offsetWidth!==3),p.style.cssText=r+s,p.innerHTML=q,e=p.firstChild,g=e.firstChild,i=e.nextSibling.firstChild.firstChild,j={doesNotAddBorder:g.offsetTop!==5,doesAddBorderForTableAndCells:i.offsetTop===5},g.style.position="fixed",g.style.top="20px",j.fixedPosition=g.offsetTop===20||g.offsetTop===15,g.style.position=g.style.top="",e.style.overflow="hidden",e.style.position="relative",j.subtractsBorderForOverflowNotVisible=g.offsetTop===-5,j.doesNotIncludeMarginInBodyOffset=u.offsetTop!==m,a.getComputedStyle&&(p.style.marginTop="1%",b.pixelMargin=(a.getComputedStyle(p,null)||{marginTop:0}).marginTop!=="1%"),typeof d.style.zoom!="undefined"&&(d.style.zoom=1),u.removeChild(d),l=p=d=null,f.extend(b,j))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e<g;e++)delete d[b[e]];if(!(c?m:f.isEmptyObject)(d))return}}if(!c){delete j[k].data;if(!m(j[k]))return}f.support.deleteExpando||!j.setInterval?delete j[k]:j[k]=null,i&&(f.support.deleteExpando?delete a[h]:a.removeAttribute?a.removeAttribute(h):a[h]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d,e,g,h,i,j=this[0],k=0,m=null;if(a===b){if(this.length){m=f.data(j);if(j.nodeType===1&&!f._data(j,"parsedAttrs")){g=j.attributes;for(i=g.length;k<i;k++)h=g[k].name,h.indexOf("data-")===0&&(h=f.camelCase(h.substring(5)),l(j,h,m[h]));f._data(j,"parsedAttrs",!0)}}return m}if(typeof a=="object")return this.each(function(){f.data(this,a)});d=a.split(".",2),d[1]=d[1]?"."+d[1]:"",e=d[1]+"!";return f.access(this,function(c){if(c===b){m=this.triggerHandler("getData"+e,[d[0]]),m===b&&j&&(m=f.data(j,a),m=l(j,a,m));return m===b&&d[1]?this.data(d[0]):m}d[1]=c,this.each(function(){var b=f(this);b.triggerHandler("setData"+e,d),f.data(this,a,c),b.triggerHandler("changeData"+e,d)})},null,c,arguments.length>1,null,!1)},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){var d=2;typeof a!="string"&&(c=a,a="fx",d--);if(arguments.length<d)return f.queue(this[0],a);return c===b?this:this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f.Callbacks("once memory"),!0))h++,l.add(m);m();return d.promise(c)}});var o=/[\n\t\r]/g,p=/\s+/,q=/\r/g,r=/^(?:button|input)$/i,s=/^(?:button|input|object|select|textarea)$/i,t=/^a(?:rea)?$/i,u=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,v=f.support.getSetAttribute,w,x,y;f.fn.extend({attr:function(a,b){return f.access(this,f.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,f.prop,a,b,arguments.length>1)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(p);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(o," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(p);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(o," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.type]||f.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.type]||f.valHooks[g.nodeName.toLowerCase()];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c<d;c++){e=i[c];if(e.selected&&(f.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!f.nodeName(e.parentNode,"optgroup"))){b=f(e).val();if(j)return b;h.push(b)}}if(j&&!h.length&&i.length)return f(i[g]).val();return h},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h,i=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;i<g;i++)e=d[i],e&&(c=f.propFix[e]||e,h=u.test(e),h||f.attr(a,e,""),a.removeAttribute(v?e:c),h&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(r.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(w&&f.nodeName(a,"button"))return w.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(w&&f.nodeName(a,"button"))return w.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,g,h,i=a.nodeType;if(!!a&&i!==3&&i!==8&&i!==2){h=i!==1||!f.isXMLDoc(a),h&&(c=f.propFix[c]||c,g=f.propHooks[c]);return d!==b?g&&"set"in g&&(e=g.set(a,d,c))!==b?e:a[c]=d:g&&"get"in g&&(e=g.get(a,c))!==null?e:a[c]}},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):s.test(a.nodeName)||t.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabindex=f.propHooks.tabIndex,x={get:function(a,c){var d,e=f.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},v||(y={name:!0,id:!0,coords:!0},w=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&(y[c]?d.nodeValue!=="":d.specified)?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.attrHooks.tabindex.set=w.set,f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})}),f.attrHooks.contenteditable={get:w.get,set:function(a,b,c){b===""&&(b="false"),w.set(a,b,c)}}),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.enctype||(f.propFix.enctype="encoding"),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/(?:^|\s)hover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(
    a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler,g=p.selector),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||"").split(".").sort(),s=f.event.special[m]||{},m=(g?s.delegateType:s.bindType)||m,s=f.event.special[m]||{},o=f.extend({type:m,origType:l[1],data:e,handler:d,guid:d.guid,selector:g,quick:g&&G(g),namespace:n.join(".")},p),r=j[m];if(!r){r=j[m]=[],r.delegateCount=0;if(!s.setup||s.setup.call(a,e,n,i)===!1)a.addEventListener?a.addEventListener(m,i,!1):a.attachEvent&&a.attachEvent("on"+m,i)}s.add&&(s.add.call(a,o),o.handler.guid||(o.handler.guid=d.guid)),g?r.splice(r.delegateCount++,0,o):r.push(o),f.event.global[m]=!0}a=null}},global:{},remove:function(a,b,c,d,e){var g=f.hasData(a)&&f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&&!!(o=g.events)){b=f.trim(I(b||"")).split(" ");for(h=0;h<b.length;h++){i=A.exec(b[h])||[],j=k=i[1],l=i[2];if(!j){for(j in o)f.event.remove(a,j+b[h],c,d,!0);continue}p=f.event.special[j]||{},j=(d?p.delegateType:p.bindType)||j,r=o[j]||[],m=r.length,l=l?new RegExp("(^|\\.)"+l.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(n=0;n<r.length;n++)s=r[n],(e||k===s.origType)&&(!c||c.guid===s.guid)&&(!l||l.test(s.namespace))&&(!d||d===s.selector||d==="**"&&s.selector)&&(r.splice(n--,1),s.selector&&r.delegateCount--,p.remove&&p.remove.call(a,s));r.length===0&&m!==r.length&&((!p.teardown||p.teardown.call(a,l)===!1)&&f.removeEvent(a,j,g.handle),delete o[j])}f.isEmptyObject(o)&&(q=g.handle,q&&(q.elem=null),f.removeData(a,["events","handle"],!0))}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){if(!e||e.nodeType!==3&&e.nodeType!==8){var h=c.type||c,i=[],j,k,l,m,n,o,p,q,r,s;if(E.test(h+f.event.triggered))return;h.indexOf("!")>=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l<r.length&&!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,"events")||{})[c.type]&&f._data(m,"handle"),q&&q.apply(m,d),q=o&&m[o],q&&f.acceptData(m)&&q.apply(m,d)===!1&&c.preventDefault();c.type=h,!g&&!c.isDefaultPrevented()&&(!p._default||p._default.apply(e.ownerDocument,d)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)&&o&&e[h]&&(h!=="focus"&&h!=="blur"||c.target.offsetWidth!==0)&&!f.isWindow(e)&&(n=e[o],n&&(e[o]=null),f.event.triggered=h,e[h](),f.event.triggered=b,n&&(e[o]=n));return c.result}},dispatch:function(c){c=f.event.fix(c||a.event);var d=(f._data(this,"events")||{})[c.type]||[],e=d.delegateCount,g=[].slice.call(arguments,0),h=!c.exclusive&&!c.namespace,i=f.event.special[c.type]||{},j=[],k,l,m,n,o,p,q,r,s,t,u;g[0]=c,c.delegateTarget=this;if(!i.preDispatch||i.preDispatch.call(this,c)!==!1){if(e&&(!c.button||c.type!=="click")){n=f(this),n.context=this.ownerDocument||this;for(m=c.target;m!=this;m=m.parentNode||this)if(m.disabled!==!0){p={},r=[],n[0]=m;for(k=0;k<e;k++)s=d[k],t=s.selector,p[t]===b&&(p[t]=s.quick?H(m,s.quick):n.is(t)),p[t]&&r.push(s);r.length&&j.push({elem:m,matches:r})}}d.length>e&&j.push({elem:this,matches:d.slice(e)});for(k=0;k<j.length&&!c.isPropagationStopped();k++){q=j[k],c.currentTarget=q.elem;for(l=0;l<q.matches.length&&!c.isImmediatePropagationStopped();l++){s=q.matches[l];if(h||!c.namespace&&!s.namespace||c.namespace_re&&c.namespace_re.test(s.namespace))c.data=s.data,c.handleObj=s,o=((f.event.special[s.origType]||{}).handle||s.handler).apply(q.elem,g),o!==b&&(c.result=o,o===!1&&(c.preventDefault(),c.stopPropagation()))}}i.postDispatch&&i.postDispatch.call(this,c);return c.result}},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode);return a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,d){var e,f,g,h=d.button,i=d.fromElement;a.pageX==null&&d.clientX!=null&&(e=a.target.ownerDocument||c,f=e.documentElement,g=e.body,a.pageX=d.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=d.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?d.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0);return a}},fix:function(a){if(a[f.expando])return a;var d,e,g=a,h=f.event.fixHooks[a.type]||{},i=h.props?this.props.concat(h.props):this.props;a=f.Event(g);for(d=i.length;d;)e=i[--d],a[e]=g[e];a.target||(a.target=g.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey===b&&(a.metaKey=a.ctrlKey);return h.filter?h.filter(a,g):a},special:{ready:{setup:f.bindReady},load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=f.extend(new f.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?f.event.trigger(e,null,b):f.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},f.event.handle=f.event.dispatch,f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!(this instanceof f.Event))return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?K:J):this.type=a,b&&f.extend(this,b),this.timeStamp=a&&a.timeStamp||f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=K;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=K;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=K,this.stopPropagation()},isDefaultPrevented:J,isPropagationStopped:J,isImmediatePropagationStopped:J},f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c=this,d=a.relatedTarget,e=a.handleObj,g=e.selector,h;if(!d||d!==c&&!f.contains(c,d))a.type=e.origType,h=e.handler.apply(this,arguments),a.type=b;return h}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(){if(f.nodeName(this,"form"))return!1;f.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=f.nodeName(c,"input")||f.nodeName(c,"button")?c.form:b;d&&!d._submit_attached&&(f.event.add(d,"submit._submit",function(a){a._submit_bubble=!0}),d._submit_attached=!0)})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&f.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){if(f.nodeName(this,"form"))return!1;f.event.remove(this,"._submit")}}),f.support.changeBubbles||(f.event.special.change={setup:function(){if(z.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")f.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),f.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1,f.event.simulate("change",this,a,!0))});return!1}f.event.add(this,"beforeactivate._change",function(a){var b=a.target;z.test(b.nodeName)&&!b._change_attached&&(f.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&f.event.simulate("change",this.parentNode,a,!0)}),b._change_attached=!0)})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){f.event.remove(this,"._change");return z.test(this.nodeName)}}),f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){var d=0,e=function(a){f.event.simulate(b,a.target,f.event.fix(a),!0)};f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.fn.extend({on:function(a,c,d,e,g){var h,i;if(typeof a=="object"){typeof c!="string"&&(d=d||c,c=b);for(i in a)this.on(i,c,d,a[i],g);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=J;else if(!e)return this;g===1&&(h=e,e=function(a){f().off(a);return h.apply(this,arguments)},e.guid=h.guid||(h.guid=f.guid++));return this.each(function(){f.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,c,d){if(a&&a.preventDefault&&a.handleObj){var e=a.handleObj;f(a.delegateTarget).off(e.namespace?e.origType+"."+e.namespace:e.origType,e.selector,e.handler);return this}if(typeof a=="object"){for(var g in a)this.off(g,c,a[g]);return this}if(c===!1||typeof c=="function")d=c,c=b;d===!1&&(d=J);return this.each(function(){f.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){f(this.context).on(a,this.selector,b,c);return this},die:function(a,b){f(this.context).off(a,this.selector||"**",b);return this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,"**"):this.off(b,a,c)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f._data(this,"lastToggle"+a.guid)||0)%d;f._data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),f.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}if(j.nodeType===1){g||(j[d]=c,j.sizset=h);if(typeof b!="string"){if(j===b){k=!0;break}}else if(m.filter(b,[j]).length>0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}j.nodeType===1&&!g&&(j[d]=c,j.sizset=h);if(j.nodeName.toLowerCase()===b){k=j;break}j=j[a]}e[h]=k}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},m.matches=function(a,b){return m(a,null,null,b)},m.matchesSelector=function(a,b){return m(b,null,null,[a]).length>0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e<f;e++){h=o.order[e];if(g=o.leftMatch[h].exec(a)){i=g[1],g.splice(1,1);if(i.substr(i.length-1)!=="\\"){g[1]=(g[1]||"").replace(j,""),d=o.find[h](g,b,c);if(d!=null){a=a.replace(o.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},m.filter=function(a,c,d,e){var f,g,h,i,j,k,l,n,p,q=a,r=[],s=c,t=c&&c[0]&&m.isXML(c[0]);while(a&&c.length){for(h in o.filter)if((f=o.leftMatch[h].exec(a))!=null&&f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.length-1)==="\\")continue;s===r&&(r=[]);if(o.preFilter[h]){f=o.preFilter[h](f,s,d,r,e,t);if(!f)g=i=!0;else if(f===!0)continue}if(f)for(n=0;(j=s[n])!=null;n++)j&&(i=k(j,f,n,s),p=e^i,d&&i!=null?p?g=!0:s[n]=!1:p&&(r.push(j),g=!0));if(i!==b){d||(s=r),a=a.replace(o.match[h],"");if(!g)return[];break}}if(a===q)if(g==null)m.error(a);else break;q=a}return s},m.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)};var n=m.getText=function(a){var b,c,d=a.nodeType,e="";if(d){if(d===1||d===9||d===11){if(typeof a.textContent=="string")return a.textContent;if(typeof a.innerText=="string")return a.innerText.replace(k,"");for(a=a.firstChild;a;a=a.nextSibling)e+=n(a)}else if(d===3||d===4)return a.nodeValue}else for(b=0;c=a[b];b++)c.nodeType!==8&&(e+=n(c));return e},o=m.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!l.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&m.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&m.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(j,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}m.error(e)},CHILD:function(a,b){var c,e,f,g,h,i,j,k=b[1],l=a;switch(k){case"only":case"first":while(l=l.previousSibling)if(l.nodeType===1)return!1;if(k==="first")return!0;l=a;case"last":while(l=l.nextSibling)if(l.nodeType===1)return!1;return!0;case"nth":c=b[2],e=b[3];if(c===1&&e===0)return!0;f=b[0],g=a.parentNode;if(g&&(g[d]!==f||!a.nodeIndex)){i=0;for(l=g.firstChild;l;l=l.nextSibling)l.nodeType===1&&(l.nodeIndex=++i);g[d]=f}j=a.nodeIndex-e;return c===0?j===0:j%c===0&&j/c>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));o.match.globalPOS=p;var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var u,v;c.documentElement.compareDocumentPosition?u=function(a,b){if(a===b){h=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,i=b.parentNode,j=g;if(g===i)return v(a,b);if(!g)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return v(e[k],f[k]);return k===c?v(a,f[k],-1):v(e[k],b,1)},v=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h<i;h++)m(a,g[h],e,c);return m.filter(f,e)};m.attr=f.attr,m.selectors.attrMap={},f.find=m,f.expr=m.selectors,f.expr[":"]=f.expr.filters,f.unique=m.uniqueSort,f.text=m.getText,f.isXMLDoc=m.isXML,f.contains=m.contains}();var L=/Until$/,M=/^(?:parents|prevUntil|prevAll)/,N=/,/,O=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,Q=f.expr.match.globalPOS,R={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(T(this,a,!1),"not",a)},filter:function(a){return this.pushStack(T(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?Q.test(a)?f(a,this.context).index(this[0])>=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d<a.length;d++)f(g).is(a[d])&&c.push({selector:a[d],elem:g,level:h});g=g.parentNode,h++}return c}var i=Q.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(i?i.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/<tbody/i,_=/<|&#?\w+;/,ba=/<(?:script|style)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp("<(?:"+V+")[\\s/>]","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*<!(?:\[CDATA\[|\-\-)/,bg={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){return f.access(this,function(a){return a===b?f.text(this):this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f
    .clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){return f.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1></$2>");try{for(;d<e;d++)c=this[d]||{},c.nodeType===1&&(f.cleanData(c.getElementsByTagName("*")),c.innerHTML=a);c=0}catch(g){}}c&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bd.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,function(a,b){b.src?f.ajax({type:"GET",global:!1,url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bf,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)})}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof j=="string"&&j.length<512&&i===c&&j.charAt(0)==="<"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone||!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test("<"+a.nodeName+">")?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g,h,i,j=[];b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof l=="number"&&(l+="");if(!l)continue;if(typeof l=="string")if(!_.test(l))l=b.createTextNode(l);else{l=l.replace(Y,"<$1></$2>");var m=(Z.exec(l)||["",""])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement("div"),q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+l+n[2];while(o--)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m==="table"&&!s?p.firstChild&&p.firstChild.childNodes:n[1]==="<table>"&&!s?p.childNodes:[];for(i=t.length-1;i>=0;--i)f.nodeName(t[i],"tbody")&&!t[i].childNodes.length&&t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&&X.test(l)&&p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p&&(p.parentNode.removeChild(p),q.length>0&&(r=q[q.length-1],r&&r.parentNode&&r.parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&&typeof (u=l.length)=="number")for(i=0;i<u;i++)bn(l[i]);else bn(l);l.nodeType?j.push(l):j=f.merge(j,l)}if(d){g=function(a){return!a.type||be.test(a.type)};for(k=0;j[k];k++){h=j[k];if(e&&f.nodeName(h,"script")&&(!h.type||be.test(h.type)))e.push(h.parentNode?h.parentNode.removeChild(h):h);else{if(h.nodeType===1){var v=f.grep(h.getElementsByTagName("script"),g);j.splice.apply(j,[k+1,0].concat(v))}d.appendChild(h)}}}return j},cleanData:function(a){var b,c,d=f.cache,e=f.event.special,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeName&&f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b&&b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.handle);b.handle&&(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&&i.removeAttribute(f.expando),delete d[c]}}}});var bp=/alpha\([^)]*\)/i,bq=/opacity=([^)]*)/,br=/([A-Z]|^ms)/g,bs=/^[\-+]?(?:\d*\.)?\d+$/i,bt=/^-?(?:\d*\.)?\d+(?!px)[^\d\s]+$/i,bu=/^([\-+])=([\-+.\de]+)/,bv=/^margin/,bw={position:"absolute",visibility:"hidden",display:"block"},bx=["Top","Right","Bottom","Left"],by,bz,bA;f.fn.css=function(a,c){return f.access(this,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)},a,c,arguments.length>1)},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=by(a,"opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bu.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(by)return by(a,c)},swap:function(a,b,c){var d={},e,f;for(f in b)d[f]=a.style[f],a.style[f]=b[f];e=c.call(a);for(f in b)a.style[f]=d[f];return e}}),f.curCSS=f.css,c.defaultView&&c.defaultView.getComputedStyle&&(bz=function(a,b){var c,d,e,g,h=a.style;b=b.replace(br,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b))),!f.support.pixelMargin&&e&&bv.test(b)&&bt.test(c)&&(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.documentElement.currentStyle&&(bA=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f==null&&g&&(e=g[b])&&(f=e),bt.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),by=bz||bA,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0?bB(a,b,d):f.swap(a,bw,function(){return bB(a,b,d)})},set:function(a,b){return bs.test(b)?b+"px":b}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bq.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bp,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bp.test(g)?g.replace(bp,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){return f.swap(a,{display:"inline-block"},function(){return b?by(a,"margin-right"):a.style.marginRight})}})}),f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)}),f.each({margin:"",padding:"",border:"Width"},function(a,b){f.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bx[d]+b]=e[d]||e[d-2]||e[0];return f}}});var bC=/%20/g,bD=/\[\]$/,bE=/\r?\n/g,bF=/#.*$/,bG=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bH=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bI=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bJ=/^(?:GET|HEAD)$/,bK=/^\/\//,bL=/\?/,bM=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bN=/^(?:select|textarea)/i,bO=/\s+/,bP=/([?&])_=[^&]*/,bQ=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV,bW=["*/"]+["*"];try{bU=e.href}catch(bX){bU=c.createElement("a"),bU.href="",bU=bU.href}bV=bQ.exec(bU.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bR)return bR.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bM,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bN.test(this.nodeName)||bH.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bE,"\r\n")}}):{name:b.name,value:c.replace(bE,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b$(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b$(a,b);return a},ajaxSettings:{url:bU,isLocal:bI.test(bV[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bW},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bY(bS),ajaxTransport:bY(bT),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?ca(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cb(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bF,"").replace(bK,bV[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bO),d.crossDomain==null&&(r=bQ.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bV[1]&&r[2]==bV[2]&&(r[3]||(r[1]==="http:"?80:443))==(bV[3]||(bV[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bZ(bS,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bJ.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bL.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bP,"$1_="+x);d.url=y+(y===d.url?(bL.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bW+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bZ(bT,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g,a[g],c,e);return d.join("&").replace(bC,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cc++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=typeof b.data=="string"&&/^application\/x\-www\-form\-urlencoded/.test(b.contentType);if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cd,l),b.url===j&&(e&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n);try{m.text=h.responseText}catch(a){}try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,co,cp=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cq;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(ct("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),(e===""&&f.css(d,"display")==="none"||!f.contains(d.ownerDocument.documentElement,d))&&f._data(d,"olddisplay",cu(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(ct("hide",3),a,b,c);var d,e,g=0,h=this.length;for(;g<h;g++)d=this[g],d.style&&(e=f.css(d,"display"),e!=="none"&&!f._data(d,"olddisplay")&&f._data(d,"olddisplay",e));for(g=0;g<h;g++)this[g].style&&(this[g].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(ct("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){function g(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o,p,q;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]);if((k=f.cssHooks[g])&&"expand"in k){l=k.expand(a[g]),delete a[g];for(i in l)i in a||(a[i]=l[i])}}for(g in a){h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(!f.support.inlineBlockNeedsLayout||cu(this.nodeName)==="inline"?this.style.display="inline-block":this.style.zoom=1))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)j=new f.fx(this,b,i),h=a[i],cm.test(h)?(q=f._data(this,"toggle"+i)||(h==="toggle"?d?"show":"hide":0),q?(f._data(this,"toggle"+i,q==="show"?"hide":"show"),j[q]()):j[h]()):(m=cn.exec(h),n=j.cur(),m?(o=parseFloat(m[2]),p=m[3]||(f.cssNumber[i]?"":"px"),p!=="px"&&(f.style(this,i,(o||1)+p),n=(o||1)/j.cur()*n,f.style(this,i,n+p)),m[1]&&(o=(m[1]==="-="?-1:1)*o+n),j.custom(n,o,p)):j.custom(n,h,""));return!0}var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return e.queue===!1?this.each(g):this.queue(e.queue,g)},stop:function(a,c,d){typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]);return this.each(function(){function h(a,b,c){var e=b[c];f.removeData(a,c,!0),e.stop(d)}var b,c=!1,e=f.timers,g=f._data(this);d||f._unmark(!0,this);if(a==null)for(b in g)g[b]&&g[b].stop&&b.indexOf(".run")===b.length-4&&h(this,g,b);else g[b=a+".run"]&&g[b].stop&&h(this,g,b);for(b=e.length;b--;)e[b].elem===this&&(a==null||e[b].queue===a)&&(d?e[b](!0):e[b].saveState(),c=!0,e.splice(b,1));(!d||!c)&&f.dequeue(this,a)})}}),f.each({slideDown:ct("show",1),slideUp:ct("hide",1),slideToggle:ct("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue?f.dequeue(this,d.queue):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a){return a},swing:function(a){return-Math.cos(a*Math.PI)/2+.5}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,c,d){function h(a){return e.step(a)}var e=this,g=f.fx;this.startTime=cq||cr(),this.end=c,this.now=this.start=a,this.pos=this.state=0,this.unit=d||this.unit||(f.cssNumber[this.prop]?"":"px"),h.queue=this.options.queue,h.elem=this.elem,h.saveState=function(){f._data(e.elem,"fxshow"+e.prop)===b&&(e.options.hide?f._data(e.elem,"fxshow"+e.prop,e.start):e.options.show&&f._data(e.elem,"fxshow"+e.prop,e.end))},h()&&f.timers.push(h)&&!co&&(co=setInterval(g.tick,g.interval))},show:function(){var a=f._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=a||f.style(this.elem,this.prop),this.options.show=!0,a!==b?this.custom(this.cur(),a):this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f._data(this.elem,"fxshow"+this.prop)||f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b,c,d,e=cq||cr(),g=!0,h=this.elem,i=this.options;if(a||e>=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||f.fx.stop()},interval:13,stop:function(){clearInterval(co),co=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=a.now+a.unit:a.elem[a.prop]=a.now}}}),f.each(cp.concat.apply([],cp),function(a,b){b.indexOf("margin")&&(f.fx.step[b]=function(a){f.style(a.elem,b,Math.max(0,a.now)+a.unit)})}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cv,cw=/^t(?:able|d|h)$/i,cx=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?cv=function(a,b,c,d){try{d=a.getBoundingClientRect()}catch(e){}if(!d||!f.contains(c,a))return d?{top:d.top,left:d.left}:{top:0,left:0};var g=b.body,h=cy(b),i=c.clientTop||g.clientTop||0,j=c.clientLeft||g.clientLeft||0,k=h.pageYOffset||f.support.boxModel&&c.scrollTop||g.scrollTop,l=h.pageXOffset||f.support.boxModel&&c.scrollLeft||g.scrollLeft,m=d.top+k-i,n=d.left+l-j;return{top:m,left:n}}:cv=function(a,b,c){var d,e=a.offsetParent,g=a,h=b.body,i=b.defaultView,j=i?i.getComputedStyle(a,null):a.currentStyle,k=a.offsetTop,l=a.offsetLeft;while((a=a.parentNode)&&a!==h&&a!==c){if(f.support.fixedPosition&&j.position==="fixed")break;d=i?i.getComputedStyle(a,null):a.currentStyle,k-=a.scrollTop,l-=a.scrollLeft,a===e&&(k+=a.offsetTop,l+=a.offsetLeft,f.support.doesNotAddBorder&&(!f.support.doesAddBorderForTableAndCells||!cw.test(a.nodeName))&&(k+=parseFloat(d.borderTopWidth)||0,l+=parseFloat(d.borderLeftWidth)||0),g=e,e=a.offsetParent),f.support.subtractsBorderForOverflowNotVisible&&d.overflow!=="visible"&&(k+=parseFloat(d.borderTopWidth)||0,l+=parseFloat(d.borderLeftWidth)||0),j=d}if(j.position==="relative"||j.position==="static")k+=h.offsetTop,l+=h.offsetLeft;f.support.fixedPosition&&j.position==="fixed"&&(k+=Math.max(c.scrollTop,h.scrollTop),l+=Math.max(c.scrollLeft,h.scrollLeft));return{top:k,left:l}},f.fn.offset=function(a){if(arguments.length)return a===b?this:this.each(function(b){f.offset.setOffset(this,a,b)});var c=this[0],d=c&&c.ownerDocument;if(!d)return null;if(c===d.body)return f.offset.bodyOffset(c);return cv(c,d,d.documentElement)},f.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);f.fn[a]=function(e){return f.access(this,function(a,e,g){var h=cy(a);if(g===b)return h?c in h?h[c]:f.support.boxModel&&h.document.documentElement[e]||h.document.body[e]:a[e];h?h.scrollTo(d?f(h).scrollLeft():g,d?g:f(h).scrollTop()):a[e]=g},a,e,arguments.length,null)}}),f.each({Height:"height",Width:"width"},function(a,c){var d="client"+a,e="scroll"+a,g="offset"+a;f.fn["inner"+a]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,c,"padding")):this[c]():null},f.fn["outer"+a]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,c,a?"margin":"border")):this[c]():null},f.fn[c]=function(a){return f.access(this,function(a,c,h){var i,j,k,l;if(f.isWindow(a)){i=a.document,j=i.documentElement[d];return f.support.boxModel&&j||i.body&&i.body[d]||j}if(a.nodeType===9){i=a.documentElement;if(i[d]>=i[e])return i[d];return Math.max(a.body[e],i[e],a.body[g],i[g])}if(h===b){k=f.css(a,c),l=parseFloat(k);return f.isNumeric(l)?l:k}f(a).css(c,h)},c,a,arguments.length,null)}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window);��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/js/prettify.js������������������������������������������������������������������0000644�0001750�0001750�00000163433�12143164240�016733� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Copyright (C) 2006 Google Inc.
    //
    // Licensed under the Apache License, Version 2.0 (the "License");
    // you may not use this file except in compliance with the License.
    // You may obtain a copy of the License at
    //
    //      http://www.apache.org/licenses/LICENSE-2.0
    //
    // Unless required by applicable law or agreed to in writing, software
    // distributed under the License is distributed on an "AS IS" BASIS,
    // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    // See the License for the specific language governing permissions and
    // limitations under the License.
    
    
    /**
     * @fileoverview
     * some functions for browser-side pretty printing of code contained in html.
     * <p>
     *
     * For a fairly comprehensive set of languages see the
     * <a href="http://google-code-prettify.googlecode.com/svn/trunk/README.html#langs">README</a>
     * file that came with this source.  At a minimum, the lexer should work on a
     * number of languages including C and friends, Java, Python, Bash, SQL, HTML,
     * XML, CSS, Javascript, and Makefiles.  It works passably on Ruby, PHP and Awk
     * and a subset of Perl, but, because of commenting conventions, doesn't work on
     * Smalltalk, Lisp-like, or CAML-like languages without an explicit lang class.
     * <p>
     * Usage: <ol>
     * <li> include this source file in an html page via
     *   {@code <script type="text/javascript" src="/path/to/prettify.js"></script>}
     * <li> define style rules.  See the example page for examples.
     * <li> mark the {@code <pre>} and {@code <code>} tags in your source with
     *    {@code class=prettyprint.}
     *    You can also use the (html deprecated) {@code <xmp>} tag, but the pretty
     *    printer needs to do more substantial DOM manipulations to support that, so
     *    some css styles may not be preserved.
     * </ol>
     * That's it.  I wanted to keep the API as simple as possible, so there's no
     * need to specify which language the code is in, but if you wish, you can add
     * another class to the {@code <pre>} or {@code <code>} element to specify the
     * language, as in {@code <pre class="prettyprint lang-java">}.  Any class that
     * starts with "lang-" followed by a file extension, specifies the file type.
     * See the "lang-*.js" files in this directory for code that implements
     * per-language file handlers.
     * <p>
     * Change log:<br>
     * cbeust, 2006/08/22
     * <blockquote>
     *   Java annotations (start with "@") are now captured as literals ("lit")
     * </blockquote>
     * @requires console
     * @overrides window
     */
    
    // JSLint declarations
    /*global console, document, navigator, setTimeout, window */
    
    /**
     * Split {@code prettyPrint} into multiple timeouts so as not to interfere with
     * UI events.
     * If set to {@code false}, {@code prettyPrint()} is synchronous.
     */
    window['PR_SHOULD_USE_CONTINUATION'] = true;
    
    /** the number of characters between tab columns */
    window['PR_TAB_WIDTH'] = 8;
    
    /** Walks the DOM returning a properly escaped version of innerHTML.
      * @param {Node} node
      * @param {Array.<string>} out output buffer that receives chunks of HTML.
      */
    window['PR_normalizedHtml']
    
    /** Contains functions for creating and registering new language handlers.
      * @type {Object}
      */
      = window['PR']
    
    /** Pretty print a chunk of code.
      *
      * @param {string} sourceCodeHtml code as html
      * @return {string} code as html, but prettier
      */
      = window['prettyPrintOne']
    /** Find all the {@code <pre>} and {@code <code>} tags in the DOM with
      * {@code class=prettyprint} and prettify them.
      * @param {Function?} opt_whenDone if specified, called when the last entry
      *     has been finished.
      */
      = window['prettyPrint'] = void 0;
    
    /** browser detection. @extern @returns false if not IE, otherwise the major version. */
    window['_pr_isIE6'] = function () {
      var ieVersion = navigator && navigator.userAgent &&
          navigator.userAgent.match(/\bMSIE ([678])\./);
      ieVersion = ieVersion ? +ieVersion[1] : false;
      window['_pr_isIE6'] = function () { return ieVersion; };
      return ieVersion;
    };
    
    
    (function () {
      // Keyword lists for various languages.
      var FLOW_CONTROL_KEYWORDS =
          "break continue do else for if return while ";
      var C_KEYWORDS = FLOW_CONTROL_KEYWORDS + "auto case char const default " +
          "double enum extern float goto int long register short signed sizeof " +
          "static struct switch typedef union unsigned void volatile ";
      var COMMON_KEYWORDS = C_KEYWORDS + "catch class delete false import " +
          "new operator private protected public this throw true try typeof ";
      var CPP_KEYWORDS = COMMON_KEYWORDS + "alignof align_union asm axiom bool " +
          "concept concept_map const_cast constexpr decltype " +
          "dynamic_cast explicit export friend inline late_check " +
          "mutable namespace nullptr reinterpret_cast static_assert static_cast " +
          "template typeid typename using virtual wchar_t where ";
      var JAVA_KEYWORDS = COMMON_KEYWORDS +
          "abstract boolean byte extends final finally implements import " +
          "instanceof null native package strictfp super synchronized throws " +
          "transient ";
      var CSHARP_KEYWORDS = JAVA_KEYWORDS +
          "as base by checked decimal delegate descending event " +
          "fixed foreach from group implicit in interface internal into is lock " +
          "object out override orderby params partial readonly ref sbyte sealed " +
          "stackalloc string select uint ulong unchecked unsafe ushort var ";
      var JSCRIPT_KEYWORDS = COMMON_KEYWORDS +
          "debugger eval export function get null set undefined var with " +
          "Infinity NaN ";
      var PERL_KEYWORDS = "caller delete die do dump elsif eval exit foreach for " +
          "goto if import last local my next no our print package redo require " +
          "sub undef unless until use wantarray while BEGIN END ";
      var PYTHON_KEYWORDS = FLOW_CONTROL_KEYWORDS + "and as assert class def del " +
          "elif except exec finally from global import in is lambda " +
          "nonlocal not or pass print raise try with yield " +
          "False True None ";
      var RUBY_KEYWORDS = FLOW_CONTROL_KEYWORDS + "alias and begin case class def" +
          " defined elsif end ensure false in module next nil not or redo rescue " +
          "retry self super then true undef unless until when yield BEGIN END ";
      var SH_KEYWORDS = FLOW_CONTROL_KEYWORDS + "case done elif esac eval fi " +
          "function in local set then until ";
      var ALL_KEYWORDS = (
          CPP_KEYWORDS + CSHARP_KEYWORDS + JSCRIPT_KEYWORDS + PERL_KEYWORDS +
          PYTHON_KEYWORDS + RUBY_KEYWORDS + SH_KEYWORDS);
    
      // token style names.  correspond to css classes
      /** token style for a string literal */
      var PR_STRING = 'str';
      /** token style for a keyword */
      var PR_KEYWORD = 'kwd';
      /** token style for a comment */
      var PR_COMMENT = 'com';
      /** token style for a type */
      var PR_TYPE = 'typ';
      /** token style for a literal value.  e.g. 1, null, true. */
      var PR_LITERAL = 'lit';
      /** token style for a punctuation string. */
      var PR_PUNCTUATION = 'pun';
      /** token style for a punctuation string. */
      var PR_PLAIN = 'pln';
    
      /** token style for an sgml tag. */
      var PR_TAG = 'tag';
      /** token style for a markup declaration such as a DOCTYPE. */
      var PR_DECLARATION = 'dec';
      /** token style for embedded source. */
      var PR_SOURCE = 'src';
      /** token style for an sgml attribute name. */
      var PR_ATTRIB_NAME = 'atn';
      /** token style for an sgml attribute value. */
      var PR_ATTRIB_VALUE = 'atv';
    
      /**
       * A class that indicates a section of markup that is not code, e.g. to allow
       * embedding of line numbers within code listings.
       */
      var PR_NOCODE = 'nocode';
    
      /** A set of tokens that can precede a regular expression literal in
        * javascript.
        * http://www.mozilla.org/js/language/js20/rationale/syntax.html has the full
        * list, but I've removed ones that might be problematic when seen in
        * languages that don't support regular expression literals.
        *
        * <p>Specifically, I've removed any keywords that can't precede a regexp
        * literal in a syntactically legal javascript program, and I've removed the
        * "in" keyword since it's not a keyword in many languages, and might be used
        * as a count of inches.
        *
        * <p>The link a above does not accurately describe EcmaScript rules since
        * it fails to distinguish between (a=++/b/i) and (a++/b/i) but it works
        * very well in practice.
        *
        * @private
        */
      var REGEXP_PRECEDER_PATTERN = function () {
          var preceders = [
              "!", "!=", "!==", "#", "%", "%=", "&", "&&", "&&=",
              "&=", "(", "*", "*=", /* "+", */ "+=", ",", /* "-", */ "-=",
              "->", /*".", "..", "...", handled below */ "/", "/=", ":", "::", ";",
              "<", "<<", "<<=", "<=", "=", "==", "===", ">",
              ">=", ">>", ">>=", ">>>", ">>>=", "?", "@", "[",
              "^", "^=", "^^", "^^=", "{", "|", "|=", "||",
              "||=", "~" /* handles =~ and !~ */,
              "break", "case", "continue", "delete",
              "do", "else", "finally", "instanceof",
              "return", "throw", "try", "typeof"
              ];
          var pattern = '(?:^^|[+-]';
          for (var i = 0; i < preceders.length; ++i) {
            pattern += '|' + preceders[i].replace(/([^=<>:&a-z])/g, '\\$1');
          }
          pattern += ')\\s*';  // matches at end, and matches empty string
          return pattern;
          // CAVEAT: this does not properly handle the case where a regular
          // expression immediately follows another since a regular expression may
          // have flags for case-sensitivity and the like.  Having regexp tokens
          // adjacent is not valid in any language I'm aware of, so I'm punting.
          // TODO: maybe style special characters inside a regexp as punctuation.
        }();
    
      // Define regexps here so that the interpreter doesn't have to create an
      // object each time the function containing them is called.
      // The language spec requires a new object created even if you don't access
      // the $1 members.
      var pr_amp = /&/g;
      var pr_lt = /</g;
      var pr_gt = />/g;
      var pr_quot = /\"/g;
      /** like textToHtml but escapes double quotes to be attribute safe. */
      function attribToHtml(str) {
        return str.replace(pr_amp, '&amp;')
            .replace(pr_lt, '&lt;')
            .replace(pr_gt, '&gt;')
            .replace(pr_quot, '&quot;');
      }
    
      /** escapest html special characters to html. */
      function textToHtml(str) {
        return str.replace(pr_amp, '&amp;')
            .replace(pr_lt, '&lt;')
            .replace(pr_gt, '&gt;');
      }
    
    
      var pr_ltEnt = /&lt;/g;
      var pr_gtEnt = /&gt;/g;
      var pr_aposEnt = /&apos;/g;
      var pr_quotEnt = /&quot;/g;
      var pr_ampEnt = /&amp;/g;
      var pr_nbspEnt = /&nbsp;/g;
      /** unescapes html to plain text. */
      function htmlToText(html) {
        var pos = html.indexOf('&');
        if (pos < 0) { return html; }
        // Handle numeric entities specially.  We can't use functional substitution
        // since that doesn't work in older versions of Safari.
        // These should be rare since most browsers convert them to normal chars.
        for (--pos; (pos = html.indexOf('&#', pos + 1)) >= 0;) {
          var end = html.indexOf(';', pos);
          if (end >= 0) {
            var num = html.substring(pos + 3, end);
            var radix = 10;
            if (num && num.charAt(0) === 'x') {
              num = num.substring(1);
              radix = 16;
            }
            var codePoint = parseInt(num, radix);
            if (!isNaN(codePoint)) {
              html = (html.substring(0, pos) + String.fromCharCode(codePoint) +
                      html.substring(end + 1));
            }
          }
        }
    
        return html.replace(pr_ltEnt, '<')
            .replace(pr_gtEnt, '>')
            .replace(pr_aposEnt, "'")
            .replace(pr_quotEnt, '"')
            .replace(pr_nbspEnt, ' ')
            .replace(pr_ampEnt, '&');
      }
    
      /** is the given node's innerHTML normally unescaped? */
      function isRawContent(node) {
        return 'XMP' === node.tagName;
      }
    
      var newlineRe = /[\r\n]/g;
      /**
       * Are newlines and adjacent spaces significant in the given node's innerHTML?
       */
      function isPreformatted(node, content) {
        // PRE means preformatted, and is a very common case, so don't create
        // unnecessary computed style objects.
        if ('PRE' === node.tagName) { return true; }
        if (!newlineRe.test(content)) { return true; }  // Don't care
        var whitespace = '';
        // For disconnected nodes, IE has no currentStyle.
        if (node.currentStyle) {
          whitespace = node.currentStyle.whiteSpace;
        } else if (window.getComputedStyle) {
          // Firefox makes a best guess if node is disconnected whereas Safari
          // returns the empty string.
          whitespace = window.getComputedStyle(node, null).whiteSpace;
        }
        return !whitespace || whitespace === 'pre';
      }
    
      function normalizedHtml(node, out) {
        switch (node.nodeType) {
          case 1:  // an element
            var name = node.tagName.toLowerCase();
            out.push('<', name);
            for (var i = 0; i < node.attributes.length; ++i) {
              var attr = node.attributes[i];
              if (!attr.specified) { continue; }
              out.push(' ');
              normalizedHtml(attr, out);
            }
            out.push('>');
            for (var child = node.firstChild; child; child = child.nextSibling) {
              normalizedHtml(child, out);
            }
            if (node.firstChild || !/^(?:br|link|img)$/.test(name)) {
              out.push('<\/', name, '>');
            }
            break;
          case 2: // an attribute
            out.push(node.name.toLowerCase(), '="', attribToHtml(node.value), '"');
            break;
          case 3: case 4: // text
            out.push(textToHtml(node.nodeValue));
            break;
        }
      }
    
      /**
       * Given a group of {@link RegExp}s, returns a {@code RegExp} that globally
       * matches the union o the sets o strings matched d by the input RegExp.
       * Since it matches globally, if the input strings have a start-of-input
       * anchor (/^.../), it is ignored for the purposes of unioning.
       * @param {Array.<RegExp>} regexs non multiline, non-global regexs.
       * @return {RegExp} a global regex.
       */
      function combinePrefixPatterns(regexs) {
        var capturedGroupIndex = 0;
    
        var needToFoldCase = false;
        var ignoreCase = false;
        for (var i = 0, n = regexs.length; i < n; ++i) {
          var regex = regexs[i];
          if (regex.ignoreCase) {
            ignoreCase = true;
          } else if (/[a-z]/i.test(regex.source.replace(
                         /\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi, ''))) {
            needToFoldCase = true;
            ignoreCase = false;
            break;
          }
        }
    
        function decodeEscape(charsetPart) {
          if (charsetPart.charAt(0) !== '\\') { return charsetPart.charCodeAt(0); }
          switch (charsetPart.charAt(1)) {
            case 'b': return 8;
            case 't': return 9;
            case 'n': return 0xa;
            case 'v': return 0xb;
            case 'f': return 0xc;
            case 'r': return 0xd;
            case 'u': case 'x':
              return parseInt(charsetPart.substring(2), 16)
                  || charsetPart.charCodeAt(1);
            case '0': case '1': case '2': case '3': case '4':
            case '5': case '6': case '7':
              return parseInt(charsetPart.substring(1), 8);
            default: return charsetPart.charCodeAt(1);
          }
        }
    
        function encodeEscape(charCode) {
          if (charCode < 0x20) {
            return (charCode < 0x10 ? '\\x0' : '\\x') + charCode.toString(16);
          }
          var ch = String.fromCharCode(charCode);
          if (ch === '\\' || ch === '-' || ch === '[' || ch === ']') {
            ch = '\\' + ch;
          }
          return ch;
        }
    
        function caseFoldCharset(charSet) {
          var charsetParts = charSet.substring(1, charSet.length - 1).match(
              new RegExp(
                  '\\\\u[0-9A-Fa-f]{4}'
                  + '|\\\\x[0-9A-Fa-f]{2}'
                  + '|\\\\[0-3][0-7]{0,2}'
                  + '|\\\\[0-7]{1,2}'
                  + '|\\\\[\\s\\S]'
                  + '|-'
                  + '|[^-\\\\]',
                  'g'));
          var groups = [];
          var ranges = [];
          var inverse = charsetParts[0] === '^';
          for (var i = inverse ? 1 : 0, n = charsetParts.length; i < n; ++i) {
            var p = charsetParts[i];
            switch (p) {
              case '\\B': case '\\b':
              case '\\D': case '\\d':
              case '\\S': case '\\s':
              case '\\W': case '\\w':
                groups.push(p);
                continue;
            }
            var start = decodeEscape(p);
            var end;
            if (i + 2 < n && '-' === charsetParts[i + 1]) {
              end = decodeEscape(charsetParts[i + 2]);
              i += 2;
            } else {
              end = start;
            }
            ranges.push([start, end]);
            // If the range might intersect letters, then expand it.
            if (!(end < 65 || start > 122)) {
              if (!(end < 65 || start > 90)) {
                ranges.push([Math.max(65, start) | 32, Math.min(end, 90) | 32]);
              }
              if (!(end < 97 || start > 122)) {
                ranges.push([Math.max(97, start) & ~32, Math.min(end, 122) & ~32]);
              }
            }
          }
    
          // [[1, 10], [3, 4], [8, 12], [14, 14], [16, 16], [17, 17]]
          // -> [[1, 12], [14, 14], [16, 17]]
          ranges.sort(function (a, b) { return (a[0] - b[0]) || (b[1]  - a[1]); });
          var consolidatedRanges = [];
          var lastRange = [NaN, NaN];
          for (var i = 0; i < ranges.length; ++i) {
            var range = ranges[i];
            if (range[0] <= lastRange[1] + 1) {
              lastRange[1] = Math.max(lastRange[1], range[1]);
            } else {
              consolidatedRanges.push(lastRange = range);
            }
          }
    
          var out = ['['];
          if (inverse) { out.push('^'); }
          out.push.apply(out, groups);
          for (var i = 0; i < consolidatedRanges.length; ++i) {
            var range = consolidatedRanges[i];
            out.push(encodeEscape(range[0]));
            if (range[1] > range[0]) {
              if (range[1] + 1 > range[0]) { out.push('-'); }
              out.push(encodeEscape(range[1]));
            }
          }
          out.push(']');
          return out.join('');
        }
    
        function allowAnywhereFoldCaseAndRenumberGroups(regex) {
          // Split into character sets, escape sequences, punctuation strings
          // like ('(', '(?:', ')', '^'), and runs of characters that do not
          // include any of the above.
          var parts = regex.source.match(
              new RegExp(
                  '(?:'
                  + '\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]'  // a character set
                  + '|\\\\u[A-Fa-f0-9]{4}'  // a unicode escape
                  + '|\\\\x[A-Fa-f0-9]{2}'  // a hex escape
                  + '|\\\\[0-9]+'  // a back-reference or octal escape
                  + '|\\\\[^ux0-9]'  // other escape sequence
                  + '|\\(\\?[:!=]'  // start of a non-capturing group
                  + '|[\\(\\)\\^]'  // start/emd of a group, or line start
                  + '|[^\\x5B\\x5C\\(\\)\\^]+'  // run of other characters
                  + ')',
                  'g'));
          var n = parts.length;
    
          // Maps captured group numbers to the number they will occupy in
          // the output or to -1 if that has not been determined, or to
          // undefined if they need not be capturing in the output.
          var capturedGroups = [];
    
          // Walk over and identify back references to build the capturedGroups
          // mapping.
          for (var i = 0, groupIndex = 0; i < n; ++i) {
            var p = parts[i];
            if (p === '(') {
              // groups are 1-indexed, so max group index is count of '('
              ++groupIndex;
            } else if ('\\' === p.charAt(0)) {
              var decimalValue = +p.substring(1);
              if (decimalValue && decimalValue <= groupIndex) {
                capturedGroups[decimalValue] = -1;
              }
            }
          }
    
          // Renumber groups and reduce capturing groups to non-capturing groups
          // where possible.
          for (var i = 1; i < capturedGroups.length; ++i) {
            if (-1 === capturedGroups[i]) {
              capturedGroups[i] = ++capturedGroupIndex;
            }
          }
          for (var i = 0, groupIndex = 0; i < n; ++i) {
            var p = parts[i];
            if (p === '(') {
              ++groupIndex;
              if (capturedGroups[groupIndex] === undefined) {
                parts[i] = '(?:';
              }
            } else if ('\\' === p.charAt(0)) {
              var decimalValue = +p.substring(1);
              if (decimalValue && decimalValue <= groupIndex) {
                parts[i] = '\\' + capturedGroups[groupIndex];
              }
            }
          }
    
          // Remove any prefix anchors so that the output will match anywhere.
          // ^^ really does mean an anchored match though.
          for (var i = 0, groupIndex = 0; i < n; ++i) {
            if ('^' === parts[i] && '^' !== parts[i + 1]) { parts[i] = ''; }
          }
    
          // Expand letters to groupts to handle mixing of case-sensitive and
          // case-insensitive patterns if necessary.
          if (regex.ignoreCase && needToFoldCase) {
            for (var i = 0; i < n; ++i) {
              var p = parts[i];
              var ch0 = p.charAt(0);
              if (p.length >= 2 && ch0 === '[') {
                parts[i] = caseFoldCharset(p);
              } else if (ch0 !== '\\') {
                // TODO: handle letters in numeric escapes.
                parts[i] = p.replace(
                    /[a-zA-Z]/g,
                    function (ch) {
                      var cc = ch.charCodeAt(0);
                      return '[' + String.fromCharCode(cc & ~32, cc | 32) + ']';
                    });
              }
            }
          }
    
          return parts.join('');
        }
    
        var rewritten = [];
        for (var i = 0, n = regexs.length; i < n; ++i) {
          var regex = regexs[i];
          if (regex.global || regex.multiline) { throw new Error('' + regex); }
          rewritten.push(
              '(?:' + allowAnywhereFoldCaseAndRenumberGroups(regex) + ')');
        }
    
        return new RegExp(rewritten.join('|'), ignoreCase ? 'gi' : 'g');
      }
    
      var PR_innerHtmlWorks = null;
      function getInnerHtml(node) {
        // inner html is hopelessly broken in Safari 2.0.4 when the content is
        // an html description of well formed XML and the containing tag is a PRE
        // tag, so we detect that case and emulate innerHTML.
        if (null === PR_innerHtmlWorks) {
          var testNode = document.createElement('PRE');
          testNode.appendChild(
              document.createTextNode('<!DOCTYPE foo PUBLIC "foo bar">\n<foo />'));
          PR_innerHtmlWorks = !/</.test(testNode.innerHTML);
        }
    
        if (PR_innerHtmlWorks) {
          var content = node.innerHTML;
          // XMP tags contain unescaped entities so require special handling.
          if (isRawContent(node)) {
            content = textToHtml(content);
          } else if (!isPreformatted(node, content)) {
            content = content.replace(/(<br\s*\/?>)[\r\n]+/g, '$1')
                .replace(/(?:[\r\n]+[ \t]*)+/g, ' ');
          }
          return content;
        }
    
        var out = [];
        for (var child = node.firstChild; child; child = child.nextSibling) {
          normalizedHtml(child, out);
        }
        return out.join('');
      }
    
      /** returns a function that expand tabs to spaces.  This function can be fed
        * successive chunks of text, and will maintain its own internal state to
        * keep track of how tabs are expanded.
        * @return {function (string) : string} a function that takes
        *   plain text and return the text with tabs expanded.
        * @private
        */
      function makeTabExpander(tabWidth) {
        var SPACES = '                ';
        var charInLine = 0;
    
        return function (plainText) {
          // walk over each character looking for tabs and newlines.
          // On tabs, expand them.  On newlines, reset charInLine.
          // Otherwise increment charInLine
          var out = null;
          var pos = 0;
          for (var i = 0, n = plainText.length; i < n; ++i) {
            var ch = plainText.charAt(i);
    
            switch (ch) {
              case '\t':
                if (!out) { out = []; }
                out.push(plainText.substring(pos, i));
                // calculate how much space we need in front of this part
                // nSpaces is the amount of padding -- the number of spaces needed
                // to move us to the next column, where columns occur at factors of
                // tabWidth.
                var nSpaces = tabWidth - (charInLine % tabWidth);
                charInLine += nSpaces;
                for (; nSpaces >= 0; nSpaces -= SPACES.length) {
                  out.push(SPACES.substring(0, nSpaces));
                }
                pos = i + 1;
                break;
              case '\n':
                charInLine = 0;
                break;
              default:
                ++charInLine;
            }
          }
          if (!out) { return plainText; }
          out.push(plainText.substring(pos));
          return out.join('');
        };
      }
    
      var pr_chunkPattern = new RegExp(
          '[^<]+'  // A run of characters other than '<'
          + '|<\!--[\\s\\S]*?--\>'  // an HTML comment
          + '|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>'  // a CDATA section
          // a probable tag that should not be highlighted
          + '|<\/?[a-zA-Z](?:[^>\"\']|\'[^\']*\'|\"[^\"]*\")*>'
          + '|<',  // A '<' that does not begin a larger chunk
          'g');
      var pr_commentPrefix = /^<\!--/;
      var pr_cdataPrefix = /^<!\[CDATA\[/;
      var pr_brPrefix = /^<br\b/i;
      var pr_tagNameRe = /^<(\/?)([a-zA-Z][a-zA-Z0-9]*)/;
    
      /** split markup into chunks of html tags (style null) and
        * plain text (style {@link #PR_PLAIN}), converting tags which are
        * significant for tokenization (<br>) into their textual equivalent.
        *
        * @param {string} s html where whitespace is considered significant.
        * @return {Object} source code and extracted tags.
        * @private
        */
      function extractTags(s) {
        // since the pattern has the 'g' modifier and defines no capturing groups,
        // this will return a list of all chunks which we then classify and wrap as
        // PR_Tokens
        var matches = s.match(pr_chunkPattern);
        var sourceBuf = [];
        var sourceBufLen = 0;
        var extractedTags = [];
        if (matches) {
          for (var i = 0, n = matches.length; i < n; ++i) {
            var match = matches[i];
            if (match.length > 1 && match.charAt(0) === '<') {
              if (pr_commentPrefix.test(match)) { continue; }
              if (pr_cdataPrefix.test(match)) {
                // strip CDATA prefix and suffix.  Don't unescape since it's CDATA
                sourceBuf.push(match.substring(9, match.length - 3));
                sourceBufLen += match.length - 12;
              } else if (pr_brPrefix.test(match)) {
                // <br> tags are lexically significant so convert them to text.
                // This is undone later.
                sourceBuf.push('\n');
                ++sourceBufLen;
              } else {
                if (match.indexOf(PR_NOCODE) >= 0 && isNoCodeTag(match)) {
                  // A <span class="nocode"> will start a section that should be
                  // ignored.  Continue walking the list until we see a matching end
                  // tag.
                  var name = match.match(pr_tagNameRe)[2];
                  var depth = 1;
                  var j;
                  end_tag_loop:
                  for (j = i + 1; j < n; ++j) {
                    var name2 = matches[j].match(pr_tagNameRe);
                    if (name2 && name2[2] === name) {
                      if (name2[1] === '/') {
                        if (--depth === 0) { break end_tag_loop; }
                      } else {
                        ++depth;
                      }
                    }
                  }
                  if (j < n) {
                    extractedTags.push(
                        sourceBufLen, matches.slice(i, j + 1).join(''));
                    i = j;
                  } else {  // Ignore unclosed sections.
                    extractedTags.push(sourceBufLen, match);
                  }
                } else {
                  extractedTags.push(sourceBufLen, match);
                }
              }
            } else {
              var literalText = htmlToText(match);
              sourceBuf.push(literalText);
              sourceBufLen += literalText.length;
            }
          }
        }
        return { source: sourceBuf.join(''), tags: extractedTags };
      }
    
      /** True if the given tag contains a class attribute with the nocode class. */
      function isNoCodeTag(tag) {
        return !!tag
            // First canonicalize the representation of attributes
            .replace(/\s(\w+)\s*=\s*(?:\"([^\"]*)\"|'([^\']*)'|(\S+))/g,
                     ' $1="$2$3$4"')
            // Then look for the attribute we want.
            .match(/[cC][lL][aA][sS][sS]=\"[^\"]*\bnocode\b/);
      }
    
      /**
       * Apply the given language handler to sourceCode and add the resulting
       * decorations to out.
       * @param {number} basePos the index of sourceCode within the chunk of source
       *    whose decorations are already present on out.
       */
      function appendDecorations(basePos, sourceCode, langHandler, out) {
        if (!sourceCode) { return; }
        var job = {
          source: sourceCode,
          basePos: basePos
        };
        langHandler(job);
        out.push.apply(out, job.decorations);
      }
    
      /** Given triples of [style, pattern, context] returns a lexing function,
        * The lexing function interprets the patterns to find token boundaries and
        * returns a decoration list of the form
        * [index_0, style_0, index_1, style_1, ..., index_n, style_n]
        * where index_n is an index into the sourceCode, and style_n is a style
        * constant like PR_PLAIN.  index_n-1 <= index_n, and style_n-1 applies to
        * all characters in sourceCode[index_n-1:index_n].
        *
        * The stylePatterns is a list whose elements have the form
        * [style : string, pattern : RegExp, DEPRECATED, shortcut : string].
        *
        * Style is a style constant like PR_PLAIN, or can be a string of the
        * form 'lang-FOO', where FOO is a language extension describing the
        * language of the portion of the token in $1 after pattern executes.
        * E.g., if style is 'lang-lisp', and group 1 contains the text
        * '(hello (world))', then that portion of the token will be passed to the
        * registered lisp handler for formatting.
        * The text before and after group 1 will be restyled using this decorator
        * so decorators should take care that this doesn't result in infinite
        * recursion.  For example, the HTML lexer rule for SCRIPT elements looks
        * something like ['lang-js', /<[s]cript>(.+?)<\/script>/].  This may match
        * '<script>foo()<\/script>', which would cause the current decorator to
        * be called with '<script>' which would not match the same rule since
        * group 1 must not be empty, so it would be instead styled as PR_TAG by
        * the generic tag rule.  The handler registered for the 'js' extension would
        * then be called with 'foo()', and finally, the current decorator would
        * be called with '<\/script>' which would not match the original rule and
        * so the generic tag rule would identify it as a tag.
        *
        * Pattern must only match prefixes, and if it matches a prefix, then that
        * match is considered a token with the same style.
        *
        * Context is applied to the last non-whitespace, non-comment token
        * recognized.
        *
        * Shortcut is an optional string of characters, any of which, if the first
        * character, gurantee that this pattern and only this pattern matches.
        *
        * @param {Array} shortcutStylePatterns patterns that always start with
        *   a known character.  Must have a shortcut string.
        * @param {Array} fallthroughStylePatterns patterns that will be tried in
        *   order if the shortcut ones fail.  May have shortcuts.
        *
        * @return {function (Object)} a
        *   function that takes source code and returns a list of decorations.
        */
      function createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns) {
        var shortcuts = {};
        var tokenizer;
        (function () {
          var allPatterns = shortcutStylePatterns.concat(fallthroughStylePatterns);
          var allRegexs = [];
          var regexKeys = {};
          for (var i = 0, n = allPatterns.length; i < n; ++i) {
            var patternParts = allPatterns[i];
            var shortcutChars = patternParts[3];
            if (shortcutChars) {
              for (var c = shortcutChars.length; --c >= 0;) {
                shortcuts[shortcutChars.charAt(c)] = patternParts;
              }
            }
            var regex = patternParts[1];
            var k = '' + regex;
            if (!regexKeys.hasOwnProperty(k)) {
              allRegexs.push(regex);
              regexKeys[k] = null;
            }
          }
          allRegexs.push(/[\0-\uffff]/);
          tokenizer = combinePrefixPatterns(allRegexs);
        })();
    
        var nPatterns = fallthroughStylePatterns.length;
        var notWs = /\S/;
    
        /**
         * Lexes job.source and produces an output array job.decorations of style
         * classes preceded by the position at which they start in job.source in
         * order.
         *
         * @param {Object} job an object like {@code
         *    source: {string} sourceText plain text,
         *    basePos: {int} position of job.source in the larger chunk of
         *        sourceCode.
         * }
         */
        var decorate = function (job) {
          var sourceCode = job.source, basePos = job.basePos;
          /** Even entries are positions in source in ascending order.  Odd enties
            * are style markers (e.g., PR_COMMENT) that run from that position until
            * the end.
            * @type {Array.<number|string>}
            */
          var decorations = [basePos, PR_PLAIN];
          var pos = 0;  // index into sourceCode
          var tokens = sourceCode.match(tokenizer) || [];
          var styleCache = {};
    
          for (var ti = 0, nTokens = tokens.length; ti < nTokens; ++ti) {
            var token = tokens[ti];
            var style = styleCache[token];
            var match = void 0;
    
            var isEmbedded;
            if (typeof style === 'string') {
              isEmbedded = false;
            } else {
              var patternParts = shortcuts[token.charAt(0)];
              if (patternParts) {
                match = token.match(patternParts[1]);
                style = patternParts[0];
              } else {
                for (var i = 0; i < nPatterns; ++i) {
                  patternParts = fallthroughStylePatterns[i];
                  match = token.match(patternParts[1]);
                  if (match) {
                    style = patternParts[0];
                    break;
                  }
                }
    
                if (!match) {  // make sure that we make progress
                  style = PR_PLAIN;
                }
              }
    
              isEmbedded = style.length >= 5 && 'lang-' === style.substring(0, 5);
              if (isEmbedded && !(match && typeof match[1] === 'string')) {
                isEmbedded = false;
                style = PR_SOURCE;
              }
    
              if (!isEmbedded) { styleCache[token] = style; }
            }
    
            var tokenStart = pos;
            pos += token.length;
    
            if (!isEmbedded) {
              decorations.push(basePos + tokenStart, style);
            } else {  // Treat group 1 as an embedded block of source code.
              var embeddedSource = match[1];
              var embeddedSourceStart = token.indexOf(embeddedSource);
              var embeddedSourceEnd = embeddedSourceStart + embeddedSource.length;
              if (match[2]) {
                // If embeddedSource can be blank, then it would match at the
                // beginning which would cause us to infinitely recurse on the
                // entire token, so we catch the right context in match[2].
                embeddedSourceEnd = token.length - match[2].length;
                embeddedSourceStart = embeddedSourceEnd - embeddedSource.length;
              }
              var lang = style.substring(5);
              // Decorate the left of the embedded source
              appendDecorations(
                  basePos + tokenStart,
                  token.substring(0, embeddedSourceStart),
                  decorate, decorations);
              // Decorate the embedded source
              appendDecorations(
                  basePos + tokenStart + embeddedSourceStart,
                  embeddedSource,
                  langHandlerForExtension(lang, embeddedSource),
                  decorations);
              // Decorate the right of the embedded section
              appendDecorations(
                  basePos + tokenStart + embeddedSourceEnd,
                  token.substring(embeddedSourceEnd),
                  decorate, decorations);
            }
          }
          job.decorations = decorations;
        };
        return decorate;
      }
    
      /** returns a function that produces a list of decorations from source text.
        *
        * This code treats ", ', and ` as string delimiters, and \ as a string
        * escape.  It does not recognize perl's qq() style strings.
        * It has no special handling for double delimiter escapes as in basic, or
        * the tripled delimiters used in python, but should work on those regardless
        * although in those cases a single string literal may be broken up into
        * multiple adjacent string literals.
        *
        * It recognizes C, C++, and shell style comments.
        *
        * @param {Object} options a set of optional parameters.
        * @return {function (Object)} a function that examines the source code
        *     in the input job and builds the decoration list.
        */
      function sourceDecorator(options) {
        var shortcutStylePatterns = [], fallthroughStylePatterns = [];
        if (options['tripleQuotedStrings']) {
          // '''multi-line-string''', 'single-line-string', and double-quoted
          shortcutStylePatterns.push(
              [PR_STRING,  /^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,
               null, '\'"']);
        } else if (options['multiLineStrings']) {
          // 'multi-line-string', "multi-line-string"
          shortcutStylePatterns.push(
              [PR_STRING,  /^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,
               null, '\'"`']);
        } else {
          // 'single-line-string', "single-line-string"
          shortcutStylePatterns.push(
              [PR_STRING,
               /^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,
               null, '"\'']);
        }
        if (options['verbatimStrings']) {
          // verbatim-string-literal production from the C# grammar.  See issue 93.
          fallthroughStylePatterns.push(
              [PR_STRING, /^@\"(?:[^\"]|\"\")*(?:\"|$)/, null]);
        }
        if (options['hashComments']) {
          if (options['cStyleComments']) {
            // Stop C preprocessor declarations at an unclosed open comment
            shortcutStylePatterns.push(
                [PR_COMMENT, /^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,
                 null, '#']);
            fallthroughStylePatterns.push(
                [PR_STRING,
                 /^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,
                 null]);
          } else {
            shortcutStylePatterns.push([PR_COMMENT, /^#[^\r\n]*/, null, '#']);
          }
        }
        if (options['cStyleComments']) {
          fallthroughStylePatterns.push([PR_COMMENT, /^\/\/[^\r\n]*/, null]);
          fallthroughStylePatterns.push(
              [PR_COMMENT, /^\/\*[\s\S]*?(?:\*\/|$)/, null]);
        }
        if (options['regexLiterals']) {
          var REGEX_LITERAL = (
              // A regular expression literal starts with a slash that is
              // not followed by * or / so that it is not confused with
              // comments.
              '/(?=[^/*])'
              // and then contains any number of raw characters,
              + '(?:[^/\\x5B\\x5C]'
              // escape sequences (\x5C),
              +    '|\\x5C[\\s\\S]'
              // or non-nesting character sets (\x5B\x5D);
              +    '|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+'
              // finally closed by a /.
              + '/');
          fallthroughStylePatterns.push(
              ['lang-regex',
               new RegExp('^' + REGEXP_PRECEDER_PATTERN + '(' + REGEX_LITERAL + ')')
               ]);
        }
    
        var keywords = options['keywords'].replace(/^\s+|\s+$/g, '');
        if (keywords.length) {
          fallthroughStylePatterns.push(
              [PR_KEYWORD,
               new RegExp('^(?:' + keywords.replace(/\s+/g, '|') + ')\\b'), null]);
        }
    
        shortcutStylePatterns.push([PR_PLAIN,       /^\s+/, null, ' \r\n\t\xA0']);
        fallthroughStylePatterns.push(
            // TODO(mikesamuel): recognize non-latin letters and numerals in idents
            [PR_LITERAL,     /^@[a-z_$][a-z_$@0-9]*/i, null],
            [PR_TYPE,        /^@?[A-Z]+[a-z][A-Za-z_$@0-9]*/, null],
            [PR_PLAIN,       /^[a-z_$][a-z_$@0-9]*/i, null],
            [PR_LITERAL,
             new RegExp(
                 '^(?:'
                 // A hex number
                 + '0x[a-f0-9]+'
                 // or an octal or decimal number,
                 + '|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)'
                 // possibly in scientific notation
                 + '(?:e[+\\-]?\\d+)?'
                 + ')'
                 // with an optional modifier like UL for unsigned long
                 + '[a-z]*', 'i'),
             null, '0123456789'],
            [PR_PUNCTUATION, /^.[^\s\w\.$@\'\"\`\/\#]*/, null]);
    
        return createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns);
      }
    
      var decorateSource = sourceDecorator({
            'keywords': ALL_KEYWORDS,
            'hashComments': true,
            'cStyleComments': true,
            'multiLineStrings': true,
            'regexLiterals': true
          });
    
      /** Breaks {@code job.source} around style boundaries in
        * {@code job.decorations} while re-interleaving {@code job.extractedTags},
        * and leaves the result in {@code job.prettyPrintedHtml}.
        * @param {Object} job like {
        *    source: {string} source as plain text,
        *    extractedTags: {Array.<number|string>} extractedTags chunks of raw
        *                   html preceded by their position in {@code job.source}
        *                   in order
        *    decorations: {Array.<number|string} an array of style classes preceded
        *                 by the position at which they start in job.source in order
        * }
        * @private
        */
      function recombineTagsAndDecorations(job) {
        var sourceText = job.source;
        var extractedTags = job.extractedTags;
        var decorations = job.decorations;
    
        var html = [];
        // index past the last char in sourceText written to html
        var outputIdx = 0;
    
        var openDecoration = null;
        var currentDecoration = null;
        var tagPos = 0;  // index into extractedTags
        var decPos = 0;  // index into decorations
        var tabExpander = makeTabExpander(window['PR_TAB_WIDTH']);
    
        var adjacentSpaceRe = /([\r\n ]) /g;
        var startOrSpaceRe = /(^| ) /gm;
        var newlineRe = /\r\n?|\n/g;
        var trailingSpaceRe = /[ \r\n]$/;
        var lastWasSpace = true;  // the last text chunk emitted ended with a space.
    
        // A helper function that is responsible for opening sections of decoration
        // and outputing properly escaped chunks of source
        function emitTextUpTo(sourceIdx) {
          if (sourceIdx > outputIdx) {
            if (openDecoration && openDecoration !== currentDecoration) {
              // Close the current decoration
              html.push('</span>');
              openDecoration = null;
            }
            if (!openDecoration && currentDecoration) {
              openDecoration = currentDecoration;
              html.push('<span class="', openDecoration, '">');
            }
            // This interacts badly with some wikis which introduces paragraph tags
            // into pre blocks for some strange reason.
            // It's necessary for IE though which seems to lose the preformattedness
            // of <pre> tags when their innerHTML is assigned.
            // http://stud3.tuwien.ac.at/~e0226430/innerHtmlQuirk.html
            // and it serves to undo the conversion of <br>s to newlines done in
            // chunkify.
            var htmlChunk = textToHtml(
                tabExpander(sourceText.substring(outputIdx, sourceIdx)))
                .replace(lastWasSpace
                         ? startOrSpaceRe
                         : adjacentSpaceRe, '$1&nbsp;');
            // Keep track of whether we need to escape space at the beginning of the
            // next chunk.
            lastWasSpace = trailingSpaceRe.test(htmlChunk);
            // IE collapses multiple adjacient <br>s into 1 line break.
            // Prefix every <br> with '&nbsp;' can prevent such IE's behavior.
            var lineBreakHtml = window['_pr_isIE6']() ? '&nbsp;<br />' : '<br />';
            html.push(htmlChunk.replace(newlineRe, lineBreakHtml));
            outputIdx = sourceIdx;
          }
        }
    
        while (true) {
          // Determine if we're going to consume a tag this time around.  Otherwise
          // we consume a decoration or exit.
          var outputTag;
          if (tagPos < extractedTags.length) {
            if (decPos < decorations.length) {
              // Pick one giving preference to extractedTags since we shouldn't open
              // a new style that we're going to have to immediately close in order
              // to output a tag.
              outputTag = extractedTags[tagPos] <= decorations[decPos];
            } else {
              outputTag = true;
            }
          } else {
            outputTag = false;
          }
          // Consume either a decoration or a tag or exit.
          if (outputTag) {
            emitTextUpTo(extractedTags[tagPos]);
            if (openDecoration) {
              // Close the current decoration
              html.push('</span>');
              openDecoration = null;
            }
            html.push(extractedTags[tagPos + 1]);
            tagPos += 2;
          } else if (decPos < decorations.length) {
            emitTextUpTo(decorations[decPos]);
            currentDecoration = decorations[decPos + 1];
            decPos += 2;
          } else {
            break;
          }
        }
        emitTextUpTo(sourceText.length);
        if (openDecoration) {
          html.push('</span>');
        }
        job.prettyPrintedHtml = html.join('');
      }
    
      /** Maps language-specific file extensions to handlers. */
      var langHandlerRegistry = {};
      /** Register a language handler for the given file extensions.
        * @param {function (Object)} handler a function from source code to a list
        *      of decorations.  Takes a single argument job which describes the
        *      state of the computation.   The single parameter has the form
        *      {@code {
        *        source: {string} as plain text.
        *        decorations: {Array.<number|string>} an array of style classes
        *                     preceded by the position at which they start in
        *                     job.source in order.
        *                     The language handler should assigned this field.
        *        basePos: {int} the position of source in the larger source chunk.
        *                 All positions in the output decorations array are relative
        *                 to the larger source chunk.
        *      } }
        * @param {Array.<string>} fileExtensions
        */
      function registerLangHandler(handler, fileExtensions) {
        for (var i = fileExtensions.length; --i >= 0;) {
          var ext = fileExtensions[i];
          if (!langHandlerRegistry.hasOwnProperty(ext)) {
            langHandlerRegistry[ext] = handler;
          } else if ('console' in window) {
            console.warn('cannot override language handler %s', ext);
          }
        }
      }
      function langHandlerForExtension(extension, source) {
        if (!(extension && langHandlerRegistry.hasOwnProperty(extension))) {
          // Treat it as markup if the first non whitespace character is a < and
          // the last non-whitespace character is a >.
          extension = /^\s*</.test(source)
              ? 'default-markup'
              : 'default-code';
        }
        return langHandlerRegistry[extension];
      }
      registerLangHandler(decorateSource, ['default-code']);
      registerLangHandler(
          createSimpleLexer(
              [],
              [
               [PR_PLAIN,       /^[^<?]+/],
               [PR_DECLARATION, /^<!\w[^>]*(?:>|$)/],
               [PR_COMMENT,     /^<\!--[\s\S]*?(?:-\->|$)/],
               // Unescaped content in an unknown language
               ['lang-',        /^<\?([\s\S]+?)(?:\?>|$)/],
               ['lang-',        /^<%([\s\S]+?)(?:%>|$)/],
               [PR_PUNCTUATION, /^(?:<[%?]|[%?]>)/],
               ['lang-',        /^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],
               // Unescaped content in javascript.  (Or possibly vbscript).
               ['lang-js',      /^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],
               // Contains unescaped stylesheet content
               ['lang-css',     /^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],
               ['lang-in.tag',  /^(<\/?[a-z][^<>]*>)/i]
              ]),
          ['default-markup', 'htm', 'html', 'mxml', 'xhtml', 'xml', 'xsl']);
      registerLangHandler(
          createSimpleLexer(
              [
               [PR_PLAIN,        /^[\s]+/, null, ' \t\r\n'],
               [PR_ATTRIB_VALUE, /^(?:\"[^\"]*\"?|\'[^\']*\'?)/, null, '\"\'']
               ],
              [
               [PR_TAG,          /^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],
               [PR_ATTRIB_NAME,  /^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],
               ['lang-uq.val',   /^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],
               [PR_PUNCTUATION,  /^[=<>\/]+/],
               ['lang-js',       /^on\w+\s*=\s*\"([^\"]+)\"/i],
               ['lang-js',       /^on\w+\s*=\s*\'([^\']+)\'/i],
               ['lang-js',       /^on\w+\s*=\s*([^\"\'>\s]+)/i],
               ['lang-css',      /^style\s*=\s*\"([^\"]+)\"/i],
               ['lang-css',      /^style\s*=\s*\'([^\']+)\'/i],
               ['lang-css',      /^style\s*=\s*([^\"\'>\s]+)/i]
               ]),
          ['in.tag']);
      registerLangHandler(
          createSimpleLexer([], [[PR_ATTRIB_VALUE, /^[\s\S]+/]]), ['uq.val']);
      registerLangHandler(sourceDecorator({
              'keywords': CPP_KEYWORDS,
              'hashComments': true,
              'cStyleComments': true
            }), ['c', 'cc', 'cpp', 'cxx', 'cyc', 'm']);
      registerLangHandler(sourceDecorator({
              'keywords': 'null true false'
            }), ['json']);
      registerLangHandler(sourceDecorator({
              'keywords': CSHARP_KEYWORDS,
              'hashComments': true,
              'cStyleComments': true,
              'verbatimStrings': true
            }), ['cs']);
      registerLangHandler(sourceDecorator({
              'keywords': JAVA_KEYWORDS,
              'cStyleComments': true
            }), ['java']);
      registerLangHandler(sourceDecorator({
              'keywords': SH_KEYWORDS,
              'hashComments': true,
              'multiLineStrings': true
            }), ['bsh', 'csh', 'sh']);
      registerLangHandler(sourceDecorator({
              'keywords': PYTHON_KEYWORDS,
              'hashComments': true,
              'multiLineStrings': true,
              'tripleQuotedStrings': true
            }), ['cv', 'py']);
      registerLangHandler(sourceDecorator({
              'keywords': PERL_KEYWORDS,
              'hashComments': true,
              'multiLineStrings': true,
              'regexLiterals': true
            }), ['perl', 'pl', 'pm']);
      registerLangHandler(sourceDecorator({
              'keywords': RUBY_KEYWORDS,
              'hashComments': true,
              'multiLineStrings': true,
              'regexLiterals': true
            }), ['rb']);
      registerLangHandler(sourceDecorator({
              'keywords': JSCRIPT_KEYWORDS,
              'cStyleComments': true,
              'regexLiterals': true
            }), ['js']);
      registerLangHandler(
          createSimpleLexer([], [[PR_STRING, /^[\s\S]+/]]), ['regex']);
    
      function applyDecorator(job) {
        var sourceCodeHtml = job.sourceCodeHtml;
        var opt_langExtension = job.langExtension;
    
        // Prepopulate output in case processing fails with an exception.
        job.prettyPrintedHtml = sourceCodeHtml;
    
        try {
          // Extract tags, and convert the source code to plain text.
          var sourceAndExtractedTags = extractTags(sourceCodeHtml);
          /** Plain text. @type {string} */
          var source = sourceAndExtractedTags.source;
          job.source = source;
          job.basePos = 0;
    
          /** Even entries are positions in source in ascending order.  Odd entries
            * are tags that were extracted at that position.
            * @type {Array.<number|string>}
            */
          job.extractedTags = sourceAndExtractedTags.tags;
    
          // Apply the appropriate language handler
          langHandlerForExtension(opt_langExtension, source)(job);
          // Integrate the decorations and tags back into the source code to produce
          // a decorated html string which is left in job.prettyPrintedHtml.
          recombineTagsAndDecorations(job);
        } catch (e) {
          if ('console' in window) {
            console.log(e);
            console.trace();
          }
        }
      }
    
      function prettyPrintOne(sourceCodeHtml, opt_langExtension) {
        var job = {
          sourceCodeHtml: sourceCodeHtml,
          langExtension: opt_langExtension
        };
        applyDecorator(job);
        return job.prettyPrintedHtml;
      }
    
      function prettyPrint(opt_whenDone) {
        var isIE678 = window['_pr_isIE6']();
        var ieNewline = isIE678 === 6 ? '\r\n' : '\r';
        // See bug 71 and http://stackoverflow.com/questions/136443/why-doesnt-ie7-
    
        // fetch a list of nodes to rewrite
        var codeSegments = [
            document.getElementsByTagName('pre'),
            document.getElementsByTagName('code'),
            document.getElementsByTagName('xmp') ];
        var elements = [];
        for (var i = 0; i < codeSegments.length; ++i) {
          for (var j = 0, n = codeSegments[i].length; j < n; ++j) {
            elements.push(codeSegments[i][j]);
          }
        }
        codeSegments = null;
    
        var clock = Date;
        if (!clock['now']) {
          clock = { 'now': function () { return (new Date).getTime(); } };
        }
    
        // The loop is broken into a series of continuations to make sure that we
        // don't make the browser unresponsive when rewriting a large page.
        var k = 0;
        var prettyPrintingJob;
    
        function doWork() {
          var endTime = (window['PR_SHOULD_USE_CONTINUATION'] ?
                         clock.now() + 250 /* ms */ :
                         Infinity);
          for (; k < elements.length && clock.now() < endTime; k++) {
            var cs = elements[k];
            if (cs.className && cs.className.indexOf('prettyprint') >= 0) {
              // If the classes includes a language extensions, use it.
              // Language extensions can be specified like
              //     <pre class="prettyprint lang-cpp">
              // the language extension "cpp" is used to find a language handler as
              // passed to PR_registerLangHandler.
              var langExtension = cs.className.match(/\blang-(\w+)\b/);
              if (langExtension) { langExtension = langExtension[1]; }
    
              // make sure this is not nested in an already prettified element
              var nested = false;
              for (var p = cs.parentNode; p; p = p.parentNode) {
                if ((p.tagName === 'pre' || p.tagName === 'code' ||
                     p.tagName === 'xmp') &&
                    p.className && p.className.indexOf('prettyprint') >= 0) {
                  nested = true;
                  break;
                }
              }
              if (!nested) {
                // fetch the content as a snippet of properly escaped HTML.
                // Firefox adds newlines at the end.
                var content = getInnerHtml(cs);
                content = content.replace(/(?:\r\n?|\n)$/, '');
    
                // do the pretty printing
                prettyPrintingJob = {
                  sourceCodeHtml: content,
                  langExtension: langExtension,
                  sourceNode: cs
                };
                applyDecorator(prettyPrintingJob);
                replaceWithPrettyPrintedHtml();
              }
            }
          }
          if (k < elements.length) {
            // finish up in a continuation
            setTimeout(doWork, 250);
          } else if (opt_whenDone) {
            opt_whenDone();
          }
        }
    
        function replaceWithPrettyPrintedHtml() {
          var newContent = prettyPrintingJob.prettyPrintedHtml;
          if (!newContent) { return; }
          var cs = prettyPrintingJob.sourceNode;
    
          // push the prettified html back into the tag.
          if (!isRawContent(cs)) {
            // just replace the old html with the new
            cs.innerHTML = newContent;
          } else {
            // we need to change the tag to a <pre> since <xmp>s do not allow
            // embedded tags such as the span tags used to attach styles to
            // sections of source code.
            var pre = document.createElement('PRE');
            for (var i = 0; i < cs.attributes.length; ++i) {
              var a = cs.attributes[i];
              if (a.specified) {
                var aname = a.name.toLowerCase();
                if (aname === 'class') {
                  pre.className = a.value;  // For IE 6
                } else {
                  pre.setAttribute(a.name, a.value);
                }
              }
            }
            pre.innerHTML = newContent;
    
            // remove the old
            cs.parentNode.replaceChild(pre, cs);
            cs = pre;
          }
    
          // Replace <br>s with line-feeds so that copying and pasting works
          // on IE 6.
          // Doing this on other browsers breaks lots of stuff since \r\n is
          // treated as two newlines on Firefox, and doing this also slows
          // down rendering.
          if (isIE678 && cs.tagName === 'PRE') {
            var lineBreaks = cs.getElementsByTagName('br');
            for (var j = lineBreaks.length; --j >= 0;) {
              var lineBreak = lineBreaks[j];
              lineBreak.parentNode.replaceChild(
                  document.createTextNode(ieNewline), lineBreak);
            }
          }
        }
    
        doWork();
      }
    
      window['PR_normalizedHtml'] = normalizedHtml;
      window['prettyPrintOne'] = prettyPrintOne;
      window['prettyPrint'] = prettyPrint;
      window['PR'] = {
            'combinePrefixPatterns': combinePrefixPatterns,
            'createSimpleLexer': createSimpleLexer,
            'registerLangHandler': registerLangHandler,
            'sourceDecorator': sourceDecorator,
            'PR_ATTRIB_NAME': PR_ATTRIB_NAME,
            'PR_ATTRIB_VALUE': PR_ATTRIB_VALUE,
            'PR_COMMENT': PR_COMMENT,
            'PR_DECLARATION': PR_DECLARATION,
            'PR_KEYWORD': PR_KEYWORD,
            'PR_LITERAL': PR_LITERAL,
            'PR_NOCODE': PR_NOCODE,
            'PR_PLAIN': PR_PLAIN,
            'PR_PUNCTUATION': PR_PUNCTUATION,
            'PR_SOURCE': PR_SOURCE,
            'PR_STRING': PR_STRING,
            'PR_TAG': PR_TAG,
            'PR_TYPE': PR_TYPE
          };
    })();
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/js/popup.js���������������������������������������������������������������������0000644�0001750�0001750�00000004614�12143164237�016231� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/***************************/
    //@Author: Adrian "yEnS" Mato Gondelle
    //@website: www.yensdesign.com
    //@email: yensamg@gmail.com
    //@license: Feel free to use it, but keep this credits please!					
    /***************************/
    
    //SETTING UP OUR POPUP
    //0 means disabled; 1 means enabled;
    var popupStatus = 0;
    
    //loading popup with jQuery magic!
    function loadPopup() {
      var surveyCookie = $.cookies.get("SURVEY");
      if(surveyCookie) {
      	popupStatus = 0;
        return;
      }
    	//loads popup only if it is disabled
    	if(popupStatus==0){
    		$("#backgroundPopup").css({
    			"opacity": "0.7"
    		});
    		$("#backgroundPopup").fadeIn("slow");
    		$("#popupContents").fadeIn("slow");
    		popupStatus = 1;
    	}
    }
    
    function getDateInSixMonths() {
      var date = new Date();
      date.setDate(date.getDate()+180);
      return date;
    }
    
    //disabling popup with jQuery magic!
    function disablePopup(){
    	//disables popup only if it is enabled
    	if(popupStatus==1){
    		$("#backgroundPopup").fadeOut("slow");
    		$("#popupContents").fadeOut("slow");
    		popupStatus = 0;
        $.cookies.set("SURVEY", "NO", {expiresAt: getDateInSixMonths()});
    	}
    }
    
    //centering popup
    function centerPopup(){
    	//request data for centering
    	var windowWidth = document.documentElement.clientWidth;
    	var windowHeight = document.documentElement.clientHeight;
    	var popupHeight = $("#popupContents").height();
    	var popupWidth = $("#popupContents").width();
    	//centering
    	$("#popupContents").css({
    		"position": "absolute",
    		"top": windowHeight/2-popupHeight/2,
    		"left": windowWidth/2-popupWidth/2
    	});
    	//only need force for IE6
    	
    	$("#backgroundPopup").css({
    		"height": windowHeight
    	});
    	
    }
    
    
    //CONTROLLING EVENTS IN jQuery
    $(document).ready(function(){
    	
    	//LOADING POPUP
    	//Click the button event!
    	$("#button").click(function(){
    		//centering with css
    		centerPopup();
    		//load popup
    		loadPopup();
    	});
    				
    	//CLOSING POPUP
    	//Click the x event!
    	$("#popupContentsClose").click(function(){
    		disablePopup();
    	});
    	//Click out event!
    	$("#backgroundPopup").click(function(){
    		//disablePopup();
    	});
    	//Press Escape event!
    	$(document).keypress(function(e){
    		if(e.keyCode==27 && popupStatus==1){
    			disablePopup();
    		}
    	});
    
    	$("#announce").click(function(){
        $.cookies.set("SURVEY", "YES", {expiresAt:  getDateInSixMonths()});
        window.location='http://www.qos.ch/mailman/listinfo/announce';
    	});
    });
    
    ��������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/js/dsl.js�����������������������������������������������������������������������0000644�0001750�0001750�00000002103�12143164237�015637� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
    var asGroovyURL='http://logback.qos.ch/translator/dsl/asGroovy';
    
    function asGroovy(id) {
    
      var form = document.getElementById('aForm');
      if(form == null) {
        form = document.createElement("form");
        document.body.appendChild(form); 
      }
      var p = document.getElementById(id);
      
      var inner = p.innerHTML;
      //alert("==="+inner);  
      inner = inner.replace(/&lt;/gi, '<');
      inner = inner.replace(/&gt;/gi, '>');
    
      inner = inner.replace(/<span class="?\w{3,5}"?>/gi, '');
      inner = inner.replace(/<\/span>/gi, '');
      inner = inner.replace(/<br>/gi, '');
      inner = inner.replace(/&nbsp;/gi, '');
      inner = inner.replace(/<b>/gi, '');
      inner = inner.replace(/<\/b>/gi, '');
    
      form.setAttribute("method", "post");
      form.setAttribute("action", asGroovyURL);
      
      var hiddenField = document.createElement("input");
      hiddenField.setAttribute("type", "hidden");
      hiddenField.setAttribute("name", "val");
      hiddenField.setAttribute("value", inner);
      form.appendChild(hiddenField);
    
      //alert("==="+inner);  
      form.submit();
      return false;
    }
    
     
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/.htaccess�����������������������������������������������������������������������0000644�0001750�0001750�00000000336�12143164237�015707� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Redirect permanent /jmxConfig.html http://logback.qos.ch/manual/jmxConfig.html
    Redirect permanent /joran.html http://logback.qos.ch/manual/onJoran.html
    Redirect permanent /consolePlugin.html http://logback.qos.ch/beagle/��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/deadlock.html�������������������������������������������������������������������0000644�0001750�0001750�00000010120�12143164237�016535� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
    
    logback-core/src/main/java/ch/qos/logback/core/AppenderBase.java:  
      public synchronized void doAppend(E eventObject)
    
    logback-core/src/main/java/ch/qos/logback/core/BasicStatusManager.java:  
      locks: 
         Object statusListLock
         Object statusListenerListLock     
      exposition: to derived classes
    
    logback-core/src/main/java/ch/qos/logback/core/status/StatusBase.java:
      locks: this
      lock exposition: this
    
    logback-classic/src/main/java/ch/qos/logback/classic/selector/ContextJNDISelector.java:        
      locks: synchronizedContextMap
      lock exposition: none
    
    
    logback-classic/src/main/java/ch/qos/logback/classic/Logger.java  
      locks: synchronizedContextMap
      lock exposition: none
    
    logback-classic/src/main/java/ch/qos/logback/classic/LoggerContext.java
      locks: logger, 
             loggerCache should be syncronzied but is not
      lock exposition:
    
    logback-classic/src/main/java/ch/qos/logback/classic/Logger.java:   
       * synchronized on 'this' (Logger) protecting against simultaneous  
       * only within addAppender which is synchronized <p> 3) all the other methods
      public synchronized void setLevel(Level newLevel) {
      private synchronized void handleParentLevelChange(int newParentLevelInt) {
      // this method MUST be synchronized. See comments on 'aai' field for further
      public synchronized void addAppender(Appender<LoggingEvent> newAppender) {
    
    
    logback-core/src/main/java/ch/qos/logback/core/joran/GenericConfigurator.java:    
      locks: context
      lock exposition: none
    
    
    
    
       * only within addAppender which is synchronized <p> 3) all the other methods
      public synchronized void setLevel(Level newLevel) {
      private synchronized void handleParentLevelChange(int newParentLevelInt) {
      // this method MUST be synchronized. See comments on 'aai' field for further
      public synchronized void addAppender(Appender<LoggingEvent> newAppender) {
    
    
    
    
    logback-core/src/main/java/ch/qos/logback/core/FileAppender.java:  public synchronized void openFile(String file_name) throws IOException {
    
    logback-core/src/main/java/ch/qos/logback/core/net/SMTPAppenderBase.java:  synchronized public void stop() {
    logback-core/src/main/java/ch/qos/logback/core/net/SocketAppenderBase.java:          synchronized (this) {
    
    logback-core/src/main/java/ch/qos/logback/core/WriterAppender.java:  public synchronized void stop() {
    logback-core/src/main/java/ch/qos/logback/core/WriterAppender.java:  public synchronized void setWriter(Writer writer) {
    
    logback-classic/src/main/java/ch/qos/logback/classic/net/JMSQueueAppender.java:  public synchronized void stop() {
    logback-classic/src/main/java/ch/qos/logback/classic/net/JMSQueueAppender.java:    // The synchronized modifier avoids concurrent append and close operations
    logback-classic/src/main/java/ch/qos/logback/classic/net/JMSTopicAppender.java:  public synchronized void stop() {
    logback-classic/src/main/java/ch/qos/logback/classic/net/JMSTopicAppender.java:    // The synchronized modifier avoids concurrent append and close operations
    
    
    logback-core/src/main/java/ch/qos/logback/core/status/StatusBase.java:  public synchronized void add(Status child) {
    logback-core/src/main/java/ch/qos/logback/core/status/StatusBase.java:  public synchronized boolean hasChildren() {
    logback-core/src/main/java/ch/qos/logback/core/status/StatusBase.java:  public synchronized Iterator<Status> iterator() {
    logback-core/src/main/java/ch/qos/logback/core/status/StatusBase.java:  public synchronized boolean remove(Status statusToRemove) {
    
    
    logback-classic/src/main/java/ch/qos/logback/classic/net/SimpleSocketServer.java:        synchronized (socketNodeList) {
    logback-classic/src/main/java/ch/qos/logback/classic/net/SimpleSocketServer.java:    synchronized(this) {
    logback-classic/src/main/java/ch/qos/logback/classic/net/SimpleSocketServer.java:    synchronized (socketNodeList) {
    logback-classic/src/main/java/ch/qos/logback/classic/net/SimpleSocketServer.java:    synchronized (socketNodeList) {
    logback-classic/src/main/java/ch/qos/logback/classic/pattern/DateConverter.java:      // the AppenderBase.doAppend is synchronized, we are should be
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/templates/����������������������������������������������������������������������0000755�0001750�0001750�00000000000�12203357067�016107� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/templates/left.js���������������������������������������������������������������0000644�0001750�0001750�00000003526�12143164240�017375� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
    document.write('<div class="menuGroup">');
    document.write('<p class="menu_header">Logback project</p>');
    document.write('<p class="menu"><a href="' + prefix + 'index.html">Introduction</a></p>');
    document.write('<p class="menu"><a href="' + prefix + 'download.html">Download</a></p>');
    document.write('<p class="menu"><a href="' + prefix + 'documentation.html">Documentation</a></p>');
    document.write('<p class="menu"><a href="' + prefix + 'license.html">License</a></p>');
    document.write('<p class="menu"><a href="' + prefix + 'news.html">News</a></p>');
    
    document.write('<p class="menu_header">Support</p>');
    document.write('<p class="menu"><a href="' + prefix + 'mailinglist.html">Mailing Lists</a></p>');
    document.write('<p class="menu"><a href="' + prefix + 'bugreport.html">Bug Report</a></p>');
    document.write('<p class="menu"><a href="http://github.com/qos-ch/logback">Source Repository</a></p>');
    document.write('<p class="menu"><a href="' + prefix + 'volunteer.html">Call for volunteers</a>');
    document.write('<p class="menu"><a href="http://www.qos.ch/shop/products/professionalSupport">Support offerings</a>');
    
    //document.write('<p class="menu"><a href="http://www.qos.ch/shop/products/training">Training</a>');
    
    document.write('<p class="menu_header">Sister projects</p>');
    document.write('<p class="menu"><a href="http://audit.qos.ch/">Logback-audit</a>');
    
    document.write('<p class="menu_header">Online Tools</p>');
    document.write('<p class="menu"><a href="http://logback.qos.ch/translator/">log4j.properties Translator</a>');
    document.write('<p class="menu"><a href="http://logback.qos.ch/translator/asGroovy.html">logback.XML to Groovy</a>');
    
    document.write('</p>');
    document.write('</div>');
    
    document.write('<p/>');
    
    document.write('<div class="jobadd"><p><a href="'+prefix +'job.html">Your career<br/>@QOS.ch</a></p></div>');��������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/templates/right.js��������������������������������������������������������������0000644�0001750�0001750�00000002142�12143164240�017551� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������//document.write('<p class="menu"><a href="'+prefix+'10reasons.ppt">10 reasons for migrating</a>')
    
    document.write('<p class="menu_header">New and noteworthy</p>')
    
    document.write('<p class="menu"><a href="http://stubbisms.wordpress.com/2008/07/15/some-serious-logging-niceness-logback-with-eclipse-plugin/">Logging niceness</a>')
    
    document.write('<p class="menu"><a href="http://wimpi.coalevo.net/2008/04/logger-name-based-filtering-in-logback.html">Filtering by logger name</a>')
    
    document.write('<p class="menu"><a href="http://out-println.blogspot.com/2007/09/slf4j-and-logback.html">SLF4J and Logback</a>')
    
    
    document.write('<p class="menu"><a href="http://wizardforge.org/pc?action=showVersion&id=72">Configuration Wizard</a>')
    
    document.write('<p class="menu"><a href="http://xhab.blogspot.com/2007/03/new-logging-experience.html">A new logging experience!</a>')
    
    document.write('<p class="menu"><a href="http://javablog.smilehouse.com/blog/default/Java/2007/02/02/Writing-rotated-and-compressed-access-logs-with-logback">Writing rotated and compressed access logs</a>')
    
    
    document.write('</p>')
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/templates/footer.js�������������������������������������������������������������0000644�0001750�0001750�00000001740�12143164240�017735� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
    document.write('<table class="footer" border="0">')
    
    document.write('<tr>')
    
    document.write('<td valign="top">Copyright &copy; 2013  <a href="http://www.qos.ch/">QOS.ch</a></td>')
    
    document.write('  <td rowspan="2">');
    document.write('    <a href="http://twitter.com/qos_ch">');
    document.write('      <img alt="Follow @qos_ch" src="http://www.slf4j.org/images/follow_us.png" />');
    document.write('    </a>');
    document.write('  </td>');
    
    
    document.write('</tr>')
    
    AAT = '@'
    DOOTT = '.'
    document.write('<tr>') 
    
    document.write('<td align="left" colspan="1">') 
    document.write('We are actively looking for volunteers to proofread the documentation. Please send your corrections or suggestions for improvement to "corrections' + AAT +'qos'+DOOTT+'ch". See also the <a href="http://articles.qos.ch/contributing.html">instructions for contributors</a>.');
    document.write('</td>') 
    document.write('  <td>&nbsp;</td>')
    document.write('</tr>') 
    
    document.write('</table>')
    ��������������������������������logback_1.0.13/docs/templates/creative.js�����������������������������������������������������������0000644�0001750�0001750�00000003243�12143164240�020241� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������document.write('		<table style="margin-left: 0em; padding-top:0ex" cellpadding="0" ');
    document.write('           cellspacing="0" width="70%">');
    document.write('      <tr>');
    document.write('        <td>        ');
    document.write('          <p class="author">');
    document.write('            Authors: Ceki G&#252;lc&#252;, S&#233;bastien Pennec, Carl Harris');
    document.write('          <br/>');
    document.write('          Copyright &#169; 2000-2012, QOS.ch</p>');
    document.write('        </td>');
    document.write('        <td>');
    document.write('            <a rel="license"');
    document.write('               href="http://creativecommons.org/licenses/by-nc-sa/2.5/">');
    document.write('        <img alt="Creative Commons License"');
    document.write('             style="border-width: 0; margin-left: 1em"');
    document.write('             src="http://creativecommons.org/images/public/somerights20.png" />');
    document.write('          </a>');
    document.write('        </td>');
    document.write('      </tr>');
    document.write('      <tr>');
    document.write('        <td>');
    document.write('          <p>');
    document.write('            This document is licensed under a');
    document.write('            <a rel="license"');
    document.write('               href="http://creativecommons.org/licenses/by-nc-sa/2.5/">');
    document.write('              Creative Commons');
    document.write('              Attribution-NonCommercial-ShareAlike 2.5');
    document.write('              License');
    document.write('            </a>');
    document.write('          </p>');
    document.write('        </td>');
    document.write('        <td></td>');
    document.write('			</tr>');
    document.write('		</table>');
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/templates/setup.js��������������������������������������������������������������0000644�0001750�0001750�00000000624�12143164240�017577� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
    document.write('		<p class="highlight">');
    document.write('      In order to run the examples in this chapter, you need');
    document.write('      to make sure that certain jar files are present on the');
    document.write('      classpath.');
    document.write('    	Please refer to the <a href="../setup.html">setup page</a>');
    document.write('    	for further details.');
    document.write('    </p>');
    ������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/templates/header.js�������������������������������������������������������������0000644�0001750�0001750�00000000551�12143164240�017666� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������document.write('<table width="100%" border="0"><tr>');
    document.write('<td><a href="http://logback.qos.ch/">');
    document.write('<img src="' + prefix + 'images/logos/lblogo.jpg" alt="" border="0"/>');
    document.write('</a></td>')
    
    document.write('<td>&nbsp;</td>');
    
    document.write('</tr></table>')
    
    
    document.write('<div id="headerLine"></div>');
    
    
    �������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/access.html���������������������������������������������������������������������0000644�0001750�0001750�00000057507�12143164237�016254� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Logback-access</title>
        <link rel="stylesheet" type="text/css" href="css/common.css" />
        <link rel="stylesheet" type="text/css" href="css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="css/_print.css" media="print" />
        <link rel="stylesheet" type="text/css" href="css/prettify.css" media="screen" />
      </head>
      <body onload="prettyPrint()">
        <script type="text/javascript">prefix='';</script>
        <script type="text/javascript" src="js/prettify.js"></script>    
        <script src="templates/header.js" type="text/javascript"></script>
        <div id="left">
          <script src="templates/left.js" type="text/javascript"></script>
        </div>
        <div id="content">  
    	
        <h2>HTTP-access logs with logback-access, Jetty and Tomcat</h2>
    
        <div class="author">
    			Authors: Ceki G&#252;lc&#252;, S&#233;bastien Pennec
    		</div>
    
    
        <script src="../templates/creative.js" type="text/javascript"></script>
    
    		<h1>Introduction</h1>
    
        <p>The logback-access module, part of the standard logback
        distribution, integrates with Servlet containers such as Jetty or
        Tomcat to provide rich and powerful HTTP-access log functionality.
        </p>
    		
    		<p>Logback was designed as a modular framework from the
    		start. Making logback-core reusable under different circumstances
    		without much recoding was one of our main goals. In accordance
    		with this strategy, logback-access builds on top of logback-core
    		and can thus provide much of the functionality of logback-classic
    		but in the scope of HTTP-access logging. </p>
    
        <p>It should be noted that while logback-access requires
        logback-core, it is independent of logback-classic as well as
        slf4j. Just as importantly, logback-access artifact must be
        installed at the container level, not at web-application level. It
        does not make sense to bundle <em>logback-access.jar</em> at the
        level of a web-application.
        </p>
    
    		<h1><a name="tomcat" href="#tomcat">Logback-access under Tomcat</a></h1>
    		
    
    
       
    
    		<p>To use logback-access with Tomcat, after downloading the
    		logback distribution, place the files
    		<em>logback-core-1.0.13.jar</em> and
    		<em>logback-access-1.0.13.jar</em> under
    		$TOMCAT_HOME/lib/ directory, where $TOMCAT_HOME is the folder
    		where you have installed Tomcat.
        </p>
    
        <p class="highlight">Deploying recent versions of logback-access
        on Tomcat 6.x (instead of Tomcat 7.x) is likely to cause the
        server to crash.</p>
    
        <p><span class="label notice">Tomcat 7.x</span> This version of
        logback-access has been tested with Tomcat version 7.0.21. It will
        not work with Tomcat 6.x.
    		</p>
       
        <p><span class="label notice">Tomcat 6.x</span> Logback-access
        version 0.9.30 will deploy on Tomcat 6.x.</p>
    
    		<h2>LogbackValve</h2>
    
    		<p>The <a
    		href="xref/ch/qos/logback/access/tomcat/LogbackValve.html">
    		<code>ch.qos.logback.access.tomcat.LogbackValve</code></a> class
    		extends Tomcat's <code><a
    		href="http://tomcat.apache.org/tomcat-5.5-doc/catalina/docs/api/org/apache/catalina/valves/ValveBase.html">
    		ValveBase</a></code> class. Valves are usually associated together
    		to form a processing pipeline.
    		</p>
    	
    		<p>To configure Tomcat in order to use <code>LogbackValve</code>,
    		add the following lines to the tomcat server configuration file,
    		namely <em>$TOMCAT_HOME/conf/server.xml</em>:
    		</p>
    		<pre class="source">&lt;Valve className="ch.qos.logback.access.tomcat.LogbackValve"/></pre>
    
    		<p>This line is usually nested within an <code>&lt;Engine></code>
    		or <code>&lt;Host></code> element.
    		</p>
    
    		<p>By default, <code>LogbackValve</code> looks for a configuration
    		file called <em>logback-access.xml</em>, in the same folder where
    		<em>server.xml</em> is located, that is in
    		<em>$TOMCAT_HOME/conf/</em>. This configuration file contains
    		directives for configuring logback-access components. It is used
    		to specify appenders where the logging requests will be
    		sent. Please refer to the <a href="#configuration">logback-access
    		configuration section</a> further below.
        </p>
    		
        <p>In order to help with troubleshooting, by default, the
        <code>LogbackValve</code> will print its internal status at its
        initialization. Typical output would look as:
        </p>
        
        <p class="source">21:56:09,921 |-INFO in c.q.lb.access.j.a.ConfigurationAction - Ignoring debug attribute.
    21:56:09,921 |-INFO in c.q.lb.core.j.a.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
    21:56:09,921 |-INFO in c.q.lb.core.j.a.AppenderAction - Naming appender as [STDOUT]
    21:56:10,000 |-INFO in c.q.lb.core.j.a.NestedComponentIA - Pushing component [layout] on top of the object stack.
    21:56:10,015 |-INFO in c.q.lb.core.j.a.AppenderAction - Popping appender named [STDOUT] from the object stack
    21:56:10,015 |-INFO in c.q.lb.core.j.a.AppenderRefAction - Attaching appender named [STDOUT] to ch.qos.logback.access.tomcat.LogbackValve[Catalina]
    21:56:10,015 |-INFO in c.q.lb.access.j.a.ConfigurationAction - End of configuration.</p>
    
        <p>It is possible to override default status printing by specifying
        the "quiet" attribute in the <code>Valve</code>
        element. Similarly, it is also possible to set the filename for
        the logback-access configuration file. Here is an example.
        </p>
    
       <pre class="prettyprint source">&lt;Valve className="ch.qos.logback.access.tomcat.LogbackValve"
           quiet="true" filename="c:/my-logback-access.xml"/></pre>
    
        <h3><a name="viewingStatusMessages"
        href="#viewingStatusMessages">Viewing status messages</a></h3>
    
        <p>Logback-access ships with a servlet called
        <code>ViewStatusMessagesServlet</code>. This servlet prints the
        internal status messages of the <code>LogbackValve</code> as an
        HTML table. Here is sample output.
        </p>
    
    
        <a href="images/lbAccessStatus.jpg">
         <img src="images/lbAccessStatus.jpg" alt="click to enlarge" width="90%"/>
        </a>
    
        <p>To add this servlet to your web-application, add the following
        lines to its <em>WEB-INF/web.xml</em> file.</p>
    
        <pre class="prettyprint source">  &lt;servlet>
        &lt;servlet-name>AccessViewStatusMessages&lt;/servlet-name>
        &lt;servlet-class>ch.qos.logback.access.ViewStatusMessagesServlet&lt;/servlet-class>
      &lt;/servlet>
    
      &lt;servlet-mapping>
        &lt;servlet-name>AccessViewStatusMessages&lt;/servlet-name>
        &lt;url-pattern>/lbAccessStatus&lt;/url-pattern>
      &lt;/servlet-mapping></pre>
       
        <p>The <code>ViewStatusMessages</code> servlet will available
        under the URL <code>http://host/yourWebapp/lbAccessStatus</code>
        </p>
        
        
    		<h1><a name="jetty" href="#jetty">Logback-access under
    		Jetty</a></h1>
    
    		<p>After downloading the logback distribution, place the files
    		<em>logback-core-VERSION.jar</em> and
    		<em>logback-access-VERSION.jar</em> under $JETTY_HOME/lib
    		directory, where $JETTY_HOME is the folder where you have
    		installed Jetty. Versions of logback-access 0.9.31 and later
    		target Jetty versions 7.x and 8.x. Logback-access versions 0.9.30
    		and earlier target Jetty version 6.x.
    		</p>
    
    		<h3>Logback's implementation of
    		<code>org.eclipse.jetty.server.RequestLog</code> interface</h3>
    
    		<p>The <a
    		href="xref/ch/qos/logback/access/jetty/RequestLogImpl.html">
    		<code>ch.qos.logback.access.jetty.RequestLogImpl</code></a> class
    		implements Jetty's <code><a
    		href="http://download.eclipse.org/jetty/stable-7/apidocs/org/eclipse/jetty/server/RequestLog.html">RequestLog</a></code>
    		interface. Jetty delegates the management of access logging
    		functionality to implementations of this interface.
    		</p>
    
    		<p>In logback, a logging destination is called an "appender" which
    		can be directly attached to a
    		<code>ch.qos.logback.access.jetty.RequestLogImpl</code> instance.
    		</p>
    
    	
    		<p>In order to configure Jetty to use logback-access's
    		<code>RequestLogImpl</code>, please add the following lines to
    		Jetty's main configuration file, namely
    		<em>$JETTY_HOME/etc/jetty.xml</em>:
    		</p>
    		<pre class="prettyprint source">&lt;Ref id="RequestLogHandler"&gt;
      &lt;Set name="requestLog"&gt;
        &lt;New id="requestLogImpl" class="ch.qos.logback.access.jetty.RequestLogImpl"&gt;
        &lt;/New&gt;
      &lt;/Set&gt;
    &lt;/Ref&gt;</pre>
    
        <p>Please note that the above jetty configuration snippet makes
        reference to "RequestLogHandler". Check your jetty.xml
        configuration file and add a <code>RequestLogHandler</code> if it
        has not been already added. Here is a configuration snipped to set
        you on the right tract.</p>
    
        <pre class="prettyprint source">&lt;Set name="handler">
      &lt;New id="Handlers" class="org.eclipse.jetty.server.handler.HandlerCollection">
        &lt;Set name="handlers">
          &lt;Array type="org.eclipse.jetty.server.Handler">        
            &lt;Item>
              &lt;New id="Contexts" 
                   class="org.eclipse.jetty.server.handler.ContextHandlerCollection"/>
            &lt;/Item>
            &lt;Item>
              &lt;New id="DefaultHandler" 
                   class="org.eclipse.jetty.server.handler.DefaultHandler"/>
            &lt;/Item>
            <b>&lt;!-- add a RequestLogHandler --&gt;</b>
            <b>&lt;Item></b>
              <b>&lt;New id="RequestLogHandler"</b>
                   <b>class="org.eclipse.jetty.server.handler.RequestLogHandler"/></b>
            <b>&lt;/Item></b>
          &lt;/Array>
        &lt;/Set>
      &lt;/New>
    &lt;/Set></pre>
    
    
        <p>By default, <code>RequestLogImpl</code> looks
        for a logback configuration file called
        <em>logback-access.xml</em>, in the same folder where
        <em>jetty.xml</em> is located. This configuration file contains
        directives for configuring logback components such as appenders
        and layouts.
        </p>
    	
    		<p>As long the path is specified, you can place the logback
    		configuration file in any location. Here is another example of a
    		Jetty configuration file, including the path to the logback-access
    		configuration file here named <em>myaccess.xml</em>.
    		</p>
    		
        <pre class="prettyprint source">&lt;Ref id="RequestLogHandler"&gt;
      &lt;Set name="requestLog"&gt;
        &lt;New id="requestLogImpl" class="ch.qos.logback.access.jetty.RequestLogImpl"&gt;
           &lt;Set name="fileName"&gt;path/to/myaccess.xml&lt;/Set&gt;
        &lt;/New&gt;   
      &lt;/Set&gt;
    &lt;/Ref&gt;</pre>
    
       <p>For embedded Jetty, it is helpful to lookup for the
       logback-access configuration file as a class path resource. This
       can be accomplished by setting the <em>resource</em> property to
       the file name to look up on the class path.
       </p>
    
       <pre class="prettyprint source">&lt;Ref id="RequestLogHandler"&gt;
      &lt;Set name="requestLog"&gt;
        &lt;New id="requestLogImpl" class="ch.qos.logback.access.jetty.RequestLogImpl"&gt;
           &lt;Set name="<span class="bold">resource</span>"&gt;as/classpath/resource/myaccess.xml&lt;/Set&gt;
        &lt;/New&gt;   
      &lt;/Set&gt;
    &lt;/Ref&gt;</pre>
    
      <h1><a name="configuration" href="#configuration">Logback-access
      configuration</a></h1>
    	
    	
      <p>Although similar, the format of <em>logback-access.xml</em>
      configuration file is slightly different than the configuration file
      format logback-classic.  Appenders and Layouts are declared the
      exact same way. However, in the access module there is no notion of
      loggers and consequently logger elements are disallowed.
    	</p>
    
    
        <h3>Example 1: basic logback-access configuration</h3>
    		<p>
    			Here is a small but fully functional <em>logback-access.xml</em>
    			configuration file:
    		</p>
        <pre class="prettyprint source">&lt;configuration&gt;
      &lt;!-- always a good activate OnConsoleStatusListener -->
      &lt;statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />  
    
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"&gt;
        &lt;encoder&gt;
          &lt;pattern>%h %l %u %user %date "%r" %s %b&lt;/pattern&gt;
        &lt;/encoder&gt;
      &lt;/appender&gt;
    
      &lt;appender-ref ref="STDOUT" /&gt;
    &lt;/configuration&gt;</pre>
    		<p>
    		It declares a <code>ConsoleAppender</code> which prints its output
    		on the console.  The <code>ConsoleAppender</code> contains an
    		<code>Encoder</code> object responsible for formatting output. The
    		log format is specified by the "%h %l %u %user %date "%r" %s %b"
    		pattern which incidentally corresponds to the Common Log Format
    		(CLF). This format is recognized by log analyzers such as <a
    		href="http://www.analog.cx/">Analog</a> or <a
    		href="http://awstats.sourceforge.net/">AWStats</a>.
    		</p>
    
        <p>The words "common" or "clf" are interpreted as shorthands for
        the said pattern. Thus, the following are all equivalent:
        </p>
        
        <pre class="prettyprint source">&lt;pattern>%h %l %u %user %date "%r" %s %b&lt;/pattern&gt;
    &lt;pattern>common&lt;/pattern&gt;
    &lt;pattern>clf&lt;/pattern&gt;</pre>
    
      <p>The so called "combined" format is also widely recognized. It is
      defined as the '%h %l %u %t "%r" %s %b "%i{Referer}"
      "%i{User-Agent}"' pattern. As a facilitator, you can use the
      "combined" as a shorthand. Thus, the following directive
      </p>
    
      <pre class="prettyprint source">&lt;encoder&gt;
      &lt;pattern>%h %l %u %t "%r" %s %b "%i{Referer}" "%i{User-Agent}"&lt;/pattern&gt;
    &lt;/encoder&gt;</pre>
    
      <p>is equivalent to:</p>
    
      <pre class="prettyprint source">&lt;encoder&gt;
      &lt;pattern>combined&lt;/pattern&gt;
    &lt;/encoder&gt;</pre>
    
    
        <h3>Example 2: RollingFileAppender</h3>
    
    		<p>The configuration file below configures a daily rolling
    		<code>RollingFileAppender</code>. Note that due to the
    		<em>.zip</em> suffix included in the value for <span
    		class="option">fileNamePattern</span> option, the log files are not
    		only rolled daily, but they are also automatically compressed.</p>
    
    
     <pre class="prettyprint source">&lt;configuration&gt;
      &lt;!-- always a good activate OnConsoleStatusListener -->
      &lt;statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />  
    
      &lt;appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"&gt;
        &lt;file&gt;access.log&lt;/file&gt;
        &lt;rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"&gt;
          &lt;fileNamePattern&gt;access.%d{yyyy-MM-dd}.log.zip&lt;/fileNamePattern&gt;
        &lt;/rollingPolicy&gt;
    
        &lt;encoder&gt;
          &lt;pattern&gt;combined&lt;/pattern&gt;
        &lt;/encoder&gt;
      &lt;/appender&gt;
     
      &lt;appender-ref ref="FILE" /&gt;
    &lt;/configuration&gt;</pre>
    		
        <p>These two examples should give you an idea of the possibilities
        offered by logback-access. In principle, most if not all of the
        features available in logback-classic are also available in
        logback-access.
    		</p>
    
        <h3>PatternLayout</h3>
    
    		<p>Logback-access ships with an http-specific implementation of <a
    		href="xref/ch/qos/logback/access/PatternLayout.html">
    		<code>PatternLayout</code></a>. For detailed instructions on how
    		to use the <code>PatternLayout</code>, please refer to the <a
    		href="manual/layouts.html#AccessPatternLayout">corresponding
    		chapter</a> of the logback manual.
    		</p>
    		
    		<h2>JMX Components</h2>
    		
    		<p>Logback-access integrates with JMX servers to publish
    		information about its components.
    		</p>
    		
    		<p>Both <code>RequestLogImpl</code> and <code>LogbackValve</code>
    		expose data and can be updated via JMX. A special filter, covered
    		further down this document, publishes statistical data on access
    		logs.
    		</p>
    		
    		
    		<h3>Configuring Tomcat for JMX</h3>
    		
    		<p>In order to configure Tomcat for JMX, please add the following
    		lines to the <em>$TOMCAT_HOME/bin/catalina.sh</em> shell script
    		(or its MS Windows equivalent):
    		</p>
    		
    <div class="source"><pre>CATALINA_OPTS="-Dcom.sun.management.jmxremote"
    CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.ssl=false"
    CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.authenticate=false"</pre></div>
    
    		<p>After you launch Tomcat, you can access the MBeans exposed by
    		Tomcat via the JConsole application, which can be started with the
    		following command:
    		</p>
        <pre class="source">jconsole</pre>
    
    		<p>If you prefer MX4J to access your components via a web-based
    		interface, here is a short summary of the steps to follow. After
    		<a href="http://mx4j.sourceforge.net/">downloading MX4J</a>, place
    		the <em>mx4j-impl.jar</em> file in the <em>$TOMCAT_HOME/bin/</em>
    		directory, and the <em>mx4j-tools.jar</em> file in the
    		<em>$TOMCAT_HOME/common/lib/</em> directory. Once that is done,
    		add the following lines to the
    		<em>$TOMCAT_HOME/bin/catalina.sh</em> shell script:
    		</p>
    
    <div class="source"><pre>&lt;!-- at the beginning of the file -->
    CATALINA_OPTS="-Dcom.sun.management.jmxremote"
    CATALINA_OPTS="$CATALINA_OPTS -Djavax.management.builder.initial=mx4j.server.MX4JMBeanServerBuilder"
    
    &lt;!-- in the "Add on extra jar files to CLASSPATH" section -->
    CLASSPATH="$CLASSPATH":"$CATALINA_HOME"/bin/mx4j-impl.jar</pre></div>
    
    		<p>Finally, declare a new <code>Connector</code> in the
    			<em>$TOMCAT_HOME/conf/server.xml</em> file: </p>
    		
        <pre class="prettyprint source">&lt;Connector port="8050" 
      handler.list="mx"
      mx.enabled="true" 
      mx.httpHost="localhost" 
      mx.httpPort="8082" 
      protocol="AJP/1.3" /></pre>
      
      	<p> Once Tomcat is started, you should be able to reach your JMX
      		components by pointing your browser at the following URL:
      	</p>
    
        <pre class="source">http://localhost:8082/</pre>
    
    		<h3>Configuring Jetty</h3>
    		
    		<p>
    			Configuring Jetty to publish JMX components requires a few modifications to the
    			<em>$JETTY_HOME/etc/jetty.xml</em> configuration file. Here are the elements that need to be
    			added:
    		</p>
    
        <pre class="prettyprint source">&lt;Call id="MBeanServer" class="java.lang.management.ManagementFactory" name="getPlatformMBeanServer"/>
    &lt;!-- initialize the Jetty MBean container -->
    &lt;Get id="Container" name="container">
      &lt;Call name="addEventListener">
        &lt;Arg>
          &lt;New class="org.mortbay.management.MBeanContainer">
            &lt;Arg>&lt;Ref id="MBeanServer"/>&lt;/Arg>
            &lt;Set name="managementPort">8082&lt;/Set>
            &lt;Call name="start" />
          &lt;/New>
        &lt;/Arg>
      &lt;/Call>
    &lt;/Get></pre>
    
    		<p>Once Jetty is started with this configuration, all available
    		components can be reviewed at:
    		</p>
        <pre class="prettyprint source">http://localhost:8082/</pre>
    
    		<p>Logback-access' <code>RequestLogImpl</code> should be
    		available, including its <code>start()</code> and
    		<code>stop()</code> methods.
    		</p>
    
    
        <h2><a name="teeFilter"
        href="#teeFilter"><code>TeeFilter</code> <span class="small">(a servlet-filter)</span></a></h2>
    
        <p>In order to diagnose bugs in a web-application, it is often
        handy to capture the client's request as well as the server's
        response. The <code>TeeFilter</code> was designed precisely for
        this purpose. It should be noted that <code>TeeFilter</code> is a
        regular <a
        href="http://download.oracle.com/javaee/5/api/javax/servlet/Filter.html">servlet
        filter</a>. Like other servlet filters, it needs to be declared in
        your web-application's <em>web.xml</em> file:
        </p>
    
        <pre class="prettyprint source">&lt;filter&gt;
      &lt;filter-name&gt;TeeFilter&lt;/filter-name&gt;
      &lt;filter-class&gt;ch.qos.logback.access.servlet.TeeFilter&lt;/filter-class&gt;
    &lt;/filter&gt;
    
    &lt;filter-mapping&gt;
      &lt;filter-name&gt;TeeFilter&lt;/filter-name&gt;
      &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
    &lt;/filter-mapping&gt;</pre>
    
      <p>We have tested <code>TeeFilter</code> to the best of our
      ability. However, since it duplicates the input stream of the
      request and the output stream of the response, it may interfere with
      your application. Moreover, for large input or output sizes, it will
      add measurable latency. Although we have already fixed all currently
      known bugs, <code>TeeFilter</code> has broken otherwise correctly
      behaving applications in the past. Thus, in case of doubt, do not
      hesitate to disable <code>TeeFilter</code>.  
      </p>
    
      <p>Once <code>TeeFilter</code> is installed, the <a
      href="manual/layouts.html#AccessPatternLayout">PatternLayout </a>
      converters <code>fullRequest</code> and <code>fullResponse</code>
      will output the full contents of the request and respectively the
      response.
      </p>
    
      <p>Here is a sample logback-access.xml configuration file which will
      output the full contents of the request and response on the console.
      </p>
    
      <pre class="prettyprint source">&lt;configuration&gt;
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"&gt;
        &lt;encoder&gt;      
          &lt;pattern&gt;%fullRequest%n%n%fullResponse&lt;/pattern&gt;
        &lt;/encoder&gt;
      &lt;/appender&gt;
    	
      &lt;appender-ref ref="STDOUT" /&gt;
    &lt;/configuration&gt;</pre>
    
      <p>Here is the output generated when accessing the <a
      href="demo.html">logback-demo</a> application configured as shown
      above:</p>
    
      <p class="source"><b>GET /logback-demo/index.jsp HTTP/1.1</b>
    Host: localhost:8080
    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8) Gecko/20070312 Firefox/1.5.0
    Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8
    Accept-Language: en-us,en;q=0.5
    Accept-Encoding: gzip,deflate
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
    Keep-Alive: 300
    Connection: keep-alive
    Referer: http://localhost:8080/logback-demo/login.jsp
    Cookie: JSESSIONID=15c7tqi9ehlwk;  OID324nkzcmr=null; OID32862zgoa=null; 
    
    
    
    <b>HTTP/1.1 200 OK</b>
    Content-Type: text/html; charset=iso-8859-1
    Expires: Thu, 01 Jan 1970 00:00:00 GMT
    Set-Cookie: JSESSIONID=bgebt99ce9om;path=/logback-demo
    
    
    &lt;html&gt;
    &lt;head&gt;
            &lt;LINK REL=StyleSheet HREF="css/pk.css" /&gt;
    &lt;/head&gt;
    &lt;body&gt;
    
    &lt;h2&gt;Logback demo center&lt;/h2&gt;
    
    [snip, so that text is reasonably sized]</p>
    
      <p>&nbsp;</p>
    
    
      <p>As mentioned previously, while extremely useful during problem
      hunting, <code>TeeFilter</code> can introduce new problems.
      Consequently, we do not recommend having <code>TeeFilter</code>
      active in production systems. In order to avoid shipping different
      code for test and production environments, <code>TeeFilter</code>
      supports <code>includes</code> and <code>excludes</code> parameters.
      <code>TeeFilter</code> will be active if the current host is listed
      in the includes list and absent in the excludes list. By special
      convention, an empty includes list is interpreted as to contain all
      possible host names in the universe.
      </p>
    
      <p>To enable <code>TeeFilter</code> only on the hosts named "orion"
      and "gemini" and disabled elsewhere you would write:</p>
    
      <pre class="prettyprint source">&lt;filter>
      &lt;filter-name>TeeFilter&lt;/filter-name>
      &lt;filter-class>ch.qos.logback.access.servlet.TeeFilter&lt;/filter-class>
      &lt;init-param>
        <b>&lt;param-name>includes&lt;/param-name></b>
        <b>&lt;param-value>orion, gemini&lt;/param-value></b>
      &lt;/init-param>
    &lt;/filter>  </pre>
    
      <p>To enable <code>TeeFilter</code> on all hosts <em>except</em>
      hosts named "orion" and "gemini" you would write:</p>
    
      <pre class="prettyprint source">&lt;filter>
      &lt;filter-name>TeeFilter&lt;/filter-name>
      &lt;filter-class>ch.qos.logback.access.servlet.TeeFilter&lt;/filter-class>
      &lt;init-param>
        <b>&lt;param-name>excludes&lt;/param-name></b>
        <b>&lt;param-value>orion, gemini&lt;/param-value></b>
      &lt;/init-param>
    &lt;/filter>  </pre>
        
    
      <script src="templates/footer.js" type="text/javascript"></script>
    </div>
    
    </body>
    </html>
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/cla.txt�������������������������������������������������������������������������0000644�0001750�0001750�00000016023�12143164237�015411� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������                            QOS.ch
             Individual Contributor License Agreement ("Agreement") 
    
    This agreement is an adaptation  of the Apache Software Foundation ICL
    agreement where  references to  ASF have been  replaced by  QOS.ch. We
    thank the ASF for allowing QOS.ch to make use of their ICL agreement.
    
    Thank  you  for your  interest  in QOS.ch.  In  order  to clarify  the
    intellectual  property  license granted  with  Contributions from  any
    person  or entity, QOS.ch  must have  a Contributor  License Agreement
    ("CLA") on file  that has been signed by  each Contributor, indicating
    agreement  to  the license  terms  below.  This  license is  for  your
    protection as  a Contributor as well  as the protection  of QOS.ch and
    its  users;  it   does  not  change  your  rights   to  use  your  own
    Contributions for any other purpose.  If you have not already done so,
    please complete and  send an original signed Agreement  to QOS.ch, rue
    Enning  4,  1003  Lausanne,  Switzerland. Please  read  this  document
    carefully before signing and keep a copy for your records.
    
      Full name: ____________________________  E-Mail:    ___________________
    
      Mailing Address: ______________________  Telephone: ___________________
    
      _______________________________________________________________________  
    
      _______________________________________  Country:   ___________________
    
    
    You accept  and agree to the  following terms and  conditions for Your
    present and  future Contributions submitted QOS.ch.  In return, QOS.ch
    shall not  use Your  Contributions in  a way that  is contrary  to the
    public benefit.  Except for the  license granted herein to  QOS.ch and
    recipients of  software distributed by QOS.ch, You  reserve all right,
    title, and interest in and to Your Contributions.
    
    1. Definitions.
    
       "You" (or  "Your") shall mean  the copyright owner or  legal entity
       authorized  by the copyright  owner that  is making  this Agreement
       with QOS.ch.  For legal entities, the entity  making a Contribution
       and  all other  entities that  control, are  controlled by,  or are
       under common control with that entity are considered to be a single
       Contributor. For  the purposes of this  definition, "control" means
       (i)  the power,  direct  or  indirect, to  cause  the direction  or
       management  of such entity,  whether by  contract or  otherwise, or
       (ii) ownership  of fifty percent  (50%) or more of  the outstanding
       shares, or (iii) beneficial ownership of such entity.
    
       "Contribution"  shall   mean  any  original   work  of  authorship,
       including any modifications or  additions to an existing work, that
       is intentionally  submitted by You  to QOS.ch for inclusion  in, or
       documentation of,  any of the  products owned or managed  by QOS.ch
       (the  "Work"). For  the  purposes of  this definition,  "submitted"
       means any form of electronic, verbal, or written communication sent
       to  QOS.ch or  its representatives,  including but  not  limited to
       communication  on  electronic mailing  lists,  source code  control
       systems,  and issue  tracking systems  that are  managed by,  or on
       behalf of, QOS.ch  for the purpose of discussing  and improving the
       Work, but  excluding communication that is  conspicuously marked or
       otherwise designated in writing by You as "Not a Contribution."
    
    2. Grant of Copyright License. Subject  to the terms and conditions of
       this Agreement,  You hereby  grant to QOS.ch  and to  recipients of
       software   distributed   by    QOS.ch   a   perpetual,   worldwide,
       non-exclusive,   no-charge,  royalty-free,   irrevocable  copyright
       license  to  reproduce,   prepare  derivative  works  of,  publicly
       display,   publicly  perform,   sublicense,  and   distribute  Your
       Contributions and such derivative works.
    
    3. Grant of  Patent License.  Subject to the  terms and  conditions of
       this Agreement,  You hereby  grant to QOS.ch  and to  recipients of
       software   distributed   by    QOS.ch   a   perpetual,   worldwide,
       non-exclusive,  no-charge,  royalty-free,  irrevocable  (except  as
       stated in  this section)  patent license to  make, have  made, use,
       offer to sell, sell, import, and otherwise transfer the Work, where
       such license applies only to  those patent claims licensable by You
       that are necessarily infringed  by Your Contribution(s) alone or by
       combination  of Your Contribution(s)  with the  Work to  which such
       Contribution(s)  was  submitted. If  any  entity institutes  patent
       litigation against You or any other entity (including a cross-claim
       or counterclaim  in a lawsuit) alleging that  your Contribution, or
       the  Work to  which  you have  contributed,  constitutes direct  or
       contributory patent infringement,  then any patent licenses granted
       to that entity  under this Agreement for that  Contribution or Work
       shall terminate as of the date such litigation is filed.
    
    4. You  represent that  you are  legally entitled  to grant  the above
       license. If  your employer(s)  has rights to  intellectual property
       that  you create  that includes  your Contributions,  you represent
       that you  have received permission to make  Contributions on behalf
       of that  employer, that  your employer has  waived such  rights for
       your Contributions to QOS.ch.
    
    5. You  represent that  each of  Your Contributions  is  Your original
       creation (see section 7 for  submissions on behalf of others).  You
       represent  that  Your  Contribution  submissions  include  complete
       details of any third-party license or other restriction (including,
       but not  limited to, related  patents and trademarks) of  which you
       are personally aware and which are associated with any part of Your
       Contributions.
    
    6. You  are not expected  to provide  support for  Your Contributions,
       except to the extent You desire to provide support. You may provide
       support for  free, for  a fee,  or not at  all. Unless  required by
       applicable  law   or  agreed  to  in  writing,   You  provide  Your
       Contributions on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
       OF  ANY  KIND,  either   express  or  implied,  including,  without
       limitation,   any   warranties  or   conditions   of  TITLE,   NON-
       INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE.
    
    7. Should You wish to submit  work that is not Your original creation,
       You  may submit  it  to QOS.ch  separately  from any  Contribution,
       identifying the complete  details of its source and  of any license
       or  other  restriction  (including,  but not  limited  to,  related
       patents,  trademarks,  and license  agreements)  of  which you  are
       personally aware, and conspicuously  marking the work as "Submitted
       on behalf of a third-party: [named here]".
    
    8. You agree to  notify QOS.ch of any facts  or circumstances of which
       you become  aware that would make  these representations inaccurate
       in any respect.
    
    
    Please sign: __________________________________ Date: ________________
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/project-reports.html������������������������������������������������������������0000644�0001750�0001750�00000012154�12143164130�020132� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <!-- Generated by Apache Maven Doxia at May 10, 2013 -->
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
      <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>Generated Reports</title>
        <style type="text/css" media="all">
          @import url("./css/maven-base.css");
          @import url("./css/maven-theme.css");
          @import url("./css/site.css");
        </style>
        <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
        <meta name="Date-Revision-yyyymmdd" content="20130510" />
        <meta http-equiv="Content-Language" content="en" />
            
            </head>
      <body class="composite">
        <div id="banner">
                        <div id="bannerLeft">
                    Logback-Parent
                    </div>
                        <div class="clear">
            <hr/>
          </div>
        </div>
        <div id="breadcrumbs">
                
            
                    <div class="xleft">
            <span id="publishDate">Last Published: 2013-05-10</span>
                      &nbsp;| <span id="projectVersion">Version: 1.0.13</span>
                          </div>
                <div class="xright">                    <a href="./" title="Logback-Parent">Logback-Parent</a>
                  
            
          </div>
          <div class="clear">
            <hr/>
          </div>
        </div>
        <div id="leftColumn">
          <div id="navcolumn">
                 
            
                                              <h5>Modules</h5>
                      <ul>
                      <li class="none">
                              <a href="logback-core/index.html" title="Logback Core Module">Logback Core Module</a>
                </li>
                      <li class="none">
                              <a href="logback-classic/index.html" title="Logback Classic Module">Logback Classic Module</a>
                </li>
                      <li class="none">
                              <a href="logback-access/index.html" title="Logback Access Module">Logback Access Module</a>
                </li>
                      <li class="none">
                              <a href="logback-site/index.html" title="Logback Site">Logback Site</a>
                </li>
                      <li class="none">
                              <a href="logback-examples/index.html" title="Logback Examples Module">Logback Examples Module</a>
                </li>
              </ul>
                           <h5>Project Documentation</h5>
                      <ul>
                                                                                                                                  <li class="expanded">
                <strong>Project Reports</strong>
                      <ul>
                          <li class="none">
                              <a href="xref/index.html" title="Source Xref">Source Xref</a>
                </li>
                          <li class="none">
                              <a href="xref-test/index.html" title="Test Source Xref">Test Source Xref</a>
                </li>
                          <li class="none">
                              <a href="apidocs/index.html" title="JavaDocs">JavaDocs</a>
                </li>
                          <li class="none">
                              <a href="testapidocs/index.html" title="Test JavaDocs">Test JavaDocs</a>
                </li>
                  </ul>
            </li>
              </ul>
                                 <a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy">
            <img class="poweredBy" alt="Built by Maven" src="./images/logos/maven-feather.png" />
          </a>
                       
            
                </div>
        </div>
        <div id="bodyColumn">
          <div id="contentBox">
            <div class="section"><h2>Generated Reports<a name="Generated_Reports"></a></h2><p>This document provides an overview of the various reports that are automatically generated by <a class="externalLink" href="http://maven.apache.org">Maven</a> . Each report is briefly described below.</p><div class="section"><h3>Overview<a name="Overview"></a></h3><table border="0" class="bodyTable"><tr class="a"><th>Document</th><th>Description</th></tr><tr class="b"><td><a href="xref/index.html">Source Xref</a></td><td>HTML based, cross-reference version of Java source code.</td></tr><tr class="a"><td><a href="xref-test/index.html">Test Source Xref</a></td><td>HTML based, cross-reference version of Java test source code.</td></tr><tr class="b"><td><a href="apidocs/index.html">JavaDocs</a></td><td>JavaDoc API documentation.</td></tr><tr class="a"><td><a href="testapidocs/index.html">Test JavaDocs</a></td><td>Test JavaDoc API documentation.</td></tr></table></div></div>
          </div>
        </div>
        <div class="clear">
          <hr/>
        </div>
        <div id="footer">
          <div class="xright">
                  Copyright &#169;                    2005-2013
                            <a href="http://www.qos.ch">QOS.ch</a>.
                All Rights Reserved.      
            
                      </div>
          <div class="clear">
            <hr/>
          </div>
        </div>
      </body>
    </html>
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/reasonsToSwitch.html������������������������������������������������������������0000644�0001750�0001750�00000032365�12143164240�020137� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Reasons to prefer logback</title>
        <link rel="stylesheet" type="text/css" href="css/common.css" />
        <link rel="stylesheet" type="text/css" href="css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="css/_print.css" media="print" />
    
      </head>
      <body>
        <script type="text/javascript">prefix='';</script>
        <script src="templates/header.js" type="text/javascript"></script>
        <div id="left">
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="templates/left.js" type="text/javascript"></script>
        </div>
        <div id="content">
    		
    		<h2>Reasons to prefer logback over log4j</h2>
    
        <p>Logback brings a very large number of improvements over log4j,
        big and small. They are too many to enumerate exhaustively.
        Nevertheless, here is a non-exhaustive list of reasons for
        switching to logback from log4j. Keep in mind that logback is
        conceptually very similar to log4j as both projects were founded
        by the same developer. If you are already familiar with log4j, you
        will quickly feel at home using logback. If you like log4j, you
        will probably love logback.</p>
    
    
        <h3><a name="fasterImpl" href="#fasterImpl"><span
        class="anchor"/></a>Faster implementation</h3>
    
        <p>Based on our previous work on log4j, logback internals have
        been re-written to perform about ten times faster on certain
        critical execution paths. Not only are logback components faster,
        they have a smaller memory footprint as well.</p>
    
        <h3><a name="tdd" href="#tdd"><span class="anchor"/></a>Extensive
        battery of tests</h3>
    
        <p>Logback comes with a very extensive battery of tests developed
        over the course of several years and untold hours of work. While
        log4j is also tested, logback takes testing to a completely
        different level. In our opinion, this is the single most important
        reason to prefer logback over log4j.  You want your logging
        framework to be rock solid and dependable even under adverse
        conditions.
        </p>
        
        <h3><a name="slf4j" href="#slf4j"><span
        class="anchor"/></a>logback-classic speaks SLF4J natively</h3>
    
        <p>Since the <code>Logger</code> class in logback-classic
        implements the SLF4J API natively, you incur zero overhead when
        invoking an SLF4J logger with logback-classic as the underlying
        implementation. Moreover, since logback-classic strongly
        encourages the use of SLF4J as its client API, if you need to
        switch to log4j or to j.u.l., you can do so by replacing one jar
        file with another. You will not need to touch your code logging
        via the SLF4J API. This can drastically reduce the work involved
        in switching logging frameworks.
        </p>
        
        <h3><a name="docs" href="#docs"><span
        class="anchor"/></a>Extensive documentation</h3>
        
        <p>Logback ships with detailed and constantly updated
        documentation.</p>
    
        <h3><a name="DSL" href="#DSL"><span
        class="anchor"/></a>Configuration files in XML or Groovy</h3>
    
        <p>The traditional way of configuring logback is via an XML
        file. Most of the examples in the documentation use this XML
        syntax. However, as of logback version 0.9.22, <a
        href="manual/groovy.html">configuration files written in
        Groovy</a> are also supported. Compared to XML, Groovy-style
        configuration is more intuitive, consistent and has a shorter
        syntax.
        </p>
    
        <p>
        There is also a <a
        href="http://logback.qos.ch/translator/asGroovy.html">tool to
        automatically migrate your logback.xml files to
        logback.groovy</a>.
        </p>
    
        <h3><a name="autoScan" href="#autoScan"><span
        class="anchor"/></a>Automatic reloading of configuration
        files</h3>
    
        <p>Logback-classic can <a
        href="manual/configuration.html#autoScan">automatically reload its
        configuration file upon modification</a>. The scanning process is
        fast, contention-free, and dynamically scales to millions of
        invocations per second spread over hundreds of threads. It also
        plays well within application servers and more generally within
        the JEE environment as it does <em>not</em> involve the creation
        of a separate thread for scanning.
       </p>
    
        <h3><a name="grace" href="#grace"><span
        class="anchor"/></a>Graceful recovery from I/O failures</h3>
    
        <p>Logback's <code>FileAppender</code> and all its sub-classes,
        including <code>RollingFileAppender</code>, can gracefully recover
        from I/O failures. Thus, if a file server fails temporarily, you
        no longer need to restart your application just to get logging
        working again. As soon as the file server comes back up, the
        relevant logback appender will transparently and quickly recover
        from the previous error condition.
        </p>
        
        <h3><a name="maxHistory" href="#maxHistory"><span
        class="anchor"/></a>Automatic removal of old log archives</h3>
    
        <p>By setting the <span class="option">maxHistory</span> property
        of <a
        href="manual/appenders.html#TimeBasedRollingPolicy">TimeBasedRollingPolicy</a>
        or <a
        href="manual/appenders.html#SizeAndTimeBasedFNATP">SizeAndTimeBasedFNATP</a>,
        you can control the maximum number of archived files. If your
        rolling policy calls for monthly rollover and you wish to keep one
        year's worth of logs, simply set the <span
        class="option">maxHistory</span> property to 12. Archived log
        files older than 12 months will be automatically removed.
        </p>
    
        <h3><a name="compression" href="#compression"><span
        class="anchor"/></a>Automatic compression of archived log
        files</h3>
    
        <p><a
        href="manual/appenders.html#RollingFileAppender">RollingFileAppender</a>
        can automatically compress archived log files during
        rollover. Compression always occurs asynchronously so that even
        for large log files, your application is not blocked for the
        duration of the compression.
        </p>
    
        <h3><a name="prudent" href="#prudent"><span
        class="anchor"/></a>Prudent mode</h3>
    
        <p>In <a href="manual/appenders.html#prudent">prudent mode</a>,
        multiple <code>FileAppender</code> instances running on multiple
        JVMs can safely write to the same log file. With certain
        limitations, prudent mode extends to
        <code>RollingFileAppender</code>.
        </p>
    
        <h3><a name="lilith" href="#lilith"><span
        class="anchor"/></a>Lilith</h3>
    
        <p><a href="http://lilith.huxhorn.de/">Lilith</a> is a logging and
        access event viewer for logback. It is comparable to log4j's
        chainsaw, except that Lilith is designed to handle large amounts of
        logging data without flinching.</p>
      
        <h3><a name="conditional" href="#conditional"><span
        class="anchor"/></a>Conditional processing of configuration
        files</h3>
    
        <p>Developers often need to juggle between several logback
        configuration files targeting different environments such as
        development, testing and production. These configuration files
        have substantial parts in common, differing only in a few
        places. To avoid duplication, logback supports <a
        href="manual/configuration.html#conditional">conditional
        processing of configuration files</a> with the help of
        <code>&lt;if></code>, <code>&lt;then></code> and
        <code>&lt;else></code> elements so that a single configuration
        file can adequately target several environments.
        </p>
    
    
        <h3><a name="filters" href="#filters"><span
        class="anchor"/></a>Filters</h3>
    
        <p>Logback comes with a wide array of <a
        href="manual/filters.html">filtering capabilities</a> going much
        further than what log4j has to offer. For example, let's assume
        that you have a business-critical application deployed on a
        production server.  Given the large volume of transactions
        processed, logging level is set to WARN so that only warnings and
        errors are logged. Now imagine that you are confronted with a bug
        that can be reproduced on the production system but remains
        elusive on the test platform due to unspecified differences
        between those two environments (production/testing).
        </p>
    
        <p>With log4j, your only choice is to lower the logging level to
        DEBUG on the production system in an attempt to identify the
        problem. Unfortunately, this will generate large volume of logging
        data, making analysis difficult. More importantly, extensive
        logging can impact the performance of your application on the
        production system.</p>
    
        <p>With logback, you have the option of keeping logging at the
        WARN level for all users except for the one user, say Alice, who
        is responsible for identifying the problem. When Alice is logged
        on, she will be logging at level DEBUG while other users can
        continue to log at the WARN level. This feat can be accomplished
        by adding 4 lines of XML to your configuration file. Search for
        <code>MDCFilter</code> in the <a
        href="manual/filters.html#TurboFilter">relevant section</a> of the
        manual.
        </p>
        
    
        <h3><a name="sift" href="#sift"><span
        class="anchor"/></a>SiftingAppender</h3>
        
        <p><a
        href="manual/appenders.html#SiftingAppender">SiftingAppender</a>
        is an amazingly versatile appender. It can be used to separate (or
        sift) logging according to <b>any</b> given runtime attribute. For
        example, <code>SiftingAppender</code> can separate logging events
        according to user sessions, so that the logs generated by each
        user go into distinct log files, one log file per user.
        </p>
        
        <h3><a name="packagingData" href="#packagingData"><span
        class="anchor"/></a>Stack traces with packaging data
        </h3>
    
        <p>When logback prints an exception, the stack trace will include
        packaging data. Here is a sample stack trace generated by the <a
        href="demo.html">logback-demo</a> web-application.</p>
    
        <pre>14:28:48.835 [btpool0-7] INFO  c.q.l.demo.prime.PrimeAction - 99 is not a valid value
    java.lang.Exception: 99 is invalid
      at ch.qos.logback.demo.prime.PrimeAction.execute(PrimeAction.java:28) [classes/:na]
      at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431) [struts-1.2.9.jar:1.2.9]
      at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236) [struts-1.2.9.jar:1.2.9]
      at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432) [struts-1.2.9.jar:1.2.9]
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) [servlet-api-2.5-6.1.12.jar:6.1.12]
      at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:502) [jetty-6.1.12.jar:6.1.12]
      at ch.qos.logback.demo.UserServletFilter.doFilter(UserServletFilter.java:44) [classes/:na]
      at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1115) [jetty-6.1.12.jar:6.1.12]
      at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:361) [jetty-6.1.12.jar:6.1.12]
      at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:417) [jetty-6.1.12.jar:6.1.12]
      at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230) [jetty-6.1.12.jar:6.1.12]</pre>
    
        <p>From the above, you can recognize that the application is using
        Struts version 1.2.9 and was deployed under jetty version
        6.1.12. Thus, stack traces will quickly inform the reader about
        the classes intervening in the exception but also the package and
        package versions they belong to. When your customers send you a
        stack trace, as a developer you will no longer need to ask them
        to send you information about the versions of packages they are
        using. The information will be part of the stack trace. See <a
        href="manual/layouts.html#xThrowable">"%xThrowable" conversion
        word</a> for details.
        </p>
    
        <p>This feature can be quite helpful to the point that some users
        mistakenly consider it a <a
        href="http://www.jetbrains.net/devnet/message/5259058">feature of
        their IDE</a>.
        </p>
    
        <h3><a name="logbackAccess" href="#logbackAccess"><span
        class="anchor"/></a>Logback-access, i.e. HTTP-access logging with
        brains, is an integral part of logback</h3>
    
        <p>Last but not least, the logback-access module, part of the
        logback distribution, integrates with Servlet containers such as
        Jetty or Tomcat to provide rich and powerful HTTP-access log
        functionality. Since logback-access was part of the initial
        design, all the logback-classic features you love are
        available in logback-access as well.</p>
    
        <h3><a name="inSummary" href="#inSummary"><span
        class="anchor"/></a>In summary</h3>
    
        <p>We have listed a number of reasons for preferring logback over
        log4j. Given that logback builds upon on our previous work on
        log4j, simply put, logback is just a better log4j.</p>
    
        <script src="templates/footer.js" type="text/javascript"></script>	   
        </div>
    
      </body>
    </html>
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/faq.html������������������������������������������������������������������������0000644�0001750�0001750�00000030710�12143164237�015545� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Logback FAQ</title>
        <link rel="stylesheet" type="text/css" href="css/common.css" />
        <link rel="stylesheet" type="text/css" href="css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="css/_print.css" media="print" />
    
      </head>
      <body>
        <script type="text/javascript">prefix='';</script>
    
        <script src="templates/header.js" type="text/javascript"></script>
        <div id="left">
          <script src="templates/left.js" type="text/javascript"></script>
        </div>
        <div id="content">
    	
        <h2>
          <a name="top">Frequently Asked Questions</a>
        </h2>
          
        <h3>Logback project</h3>
    
        <ol>
          <li><a href="#why_lgpl">Why is logback distributed under LGPL
          and not the Apache Software License?</a> </li>
    
          <li><a href="#dependecy">What are logback's dependencies, i.e.
          JDK version and third-party libraries?</a>
          </li>
        </ol>
      
                          
        <h3>Logback Classic</h3>
        
        
        <ol type="1">    
          <li>
            <a href="#logger_serialization">Are logback loggers
            serializable?</a>
          </li>  
          
          <li>
            <a href="#auto_config">How does the automatic configuration
            work?</a>
          </li>  
    
          <li>
            <a href="#configFileLocation">Where should the configuration
            files such as <em>logback.groovy</em>,
            <em>logback-test.xml</em> or <em>logback.xml</em> be located
            on the classpath?</a> </li>
    
          <li>
            <a href="#sharedConfiguration">Is it possible for multiple JEE
            applications to share the same configuration file but without
            stepping on each other's toes?
            </a>
          </li>
    
          <li>
            <a href="#overrideFromCL">
              How can I disable logging from the command line?            
            </a>
          </li>
    
          <li>
            <a href="#setup_jetty">How can Jetty be instructed to use
            logback-classic as its logging implementation?
            </a>
          </li>
        </ol>
        
        <!-- =============================================================== -->
        <!-- =============================================================== -->
        <!-- =============================================================== -->
        <!-- =============================================================== -->
      
            
        <div class="section">
          <h2>Logback project</h2>
          
          <dl>
            <dt>
              <a name="why_lgpl" href="#why_lgpl">Why is logback
              distributed under LGPL and not the Apache Software License
              (ASL)?</a> </dt>
            
            <dd>
              <p>The logback project is dual licensed under the LGPL and
              the EPL for two main reasons. For one, the different
              license emphasizes that the fact that logback is a related
              but <em>different</em> project than log4j. 
              </p>
    
              <p>Both the LGPL and EPL are reasonable and widely-accepted
              licenses. In contrast to the ASL, both the LGPL and he EPL
              require that derivate work be licensed under the same
              license. While there might be debate about the exact
              definition of derivative work, we find such reciprocity both
              justified and morally appealing -- that is the second
              reason for our choice of the LGPL &amp; EPL
              dual-license. The subtly more liberal approach embodied in
              the ASL is not necessarily wrong. It is the expression of a
              different balance.
              </p>
              
            </dd>
          </dl>
    
          <hr/>
    
          <dl>
            <dt><a name="dependecy" href="#dependecy">What are logback's
            dependencies, i.e.  JDK version and third-party libraries?</a>
            </dt>
    
            <dd><p>This question is answered on a <a
            href="dependencies.html">separate page</a> dedicated to the
            question of dependencies.</p>
            </dd>
          </dl>
    
    
        </div>
        
        <div class="section">
          <h2>Logback-classic</h2>
          <dl>
            
            <!-- ========================================================= -->
            
            <dt>
              <a name="auto_config" href="#auto_config">
                How does the automatic configuration work?
              </a>
            </dt>
            <dd>
              <p>This question is answered in the <a
              href="manual/configuration.html#auto_configuration">relevant
              section</a> of the logback manual.
              </p>        
              <hr/>
            </dd>
            
    
            <!-- ========================================================= -->
    
            <dt>
    
              <a name="configFileLocation"
              href="#configFileLocation">Where should the configuration
              files such as <em>logback.groovy</em>,
              <em>logback-test.xml</em> or <em>logback.xml</em> be located
              on the classpath?</a>
            </dt>
    
    
            <dd>
              <p>Configuration files such as <em>logback.groovy</em>,
              <em>logback-test.xml</em> or <em>logback.xml</em> can be
              located <b>directly</b> under any folder declared in the
              class path. For example, if the class path reads
              "c:/java/jdk15/lib/rt.jar;c:/mylibs/" then the
              <em>logback.xml</em> file should be located directly under
              "c:/mylibs/", that is as "c:/mylibs/logback.xml". Placing it
              under a sub-folder of c:/mylibs/, say, c:/mylibs/other/,
              will not work.</p>
            
              <p>For web-applications, configuration files can be placed
              <b>directly</b> under <em>WEB-INF/classes/</em>.</p>
    
              <hr/>
            
            </dd>
            
            <!-- ========================================================= -->
            
            <dt>
              <a name="logger_serialization" href="#logger_serialization">
              Are logback loggers serializable?</a>
            </dt>
            <dd>
              <p>Yes. A logback logger <em>is</em> an SLF4J logger and SLF4J
              loggers are serializable. This means that an object
              referencing a logger will be able to log after its
              deserialization.
              </p>
              
              <p>The deserialized logger instance will be generated by
              <code>org.slf4j.LoggerFactory</code>.  Thus, it is possible
              for a logback logger to be deserialized as a log4j or j.u.l.
              logger, depending on the deserialization environment.</p>
    
              <hr/>
            </dd>
            
    
            <!-- ========================================================= -->
       
            <dt>
              <a name="sharedConfiguration" href="#sharedConfiguration">
              Is it possible for multiple JEE applications to share the
              same configuration file but without stepping on each other's
              toes?</a>
            </dt>
            <dd>
              <p>Yes, it is. Using <a
              href="manual/configuration.html#variableSubstitution">variable
              substitution</a>, it is possible to have a single
              configuration file to output logs to different destinations
              for each JEE application. Here is a sample
              configuration file designed for this purpose.</p>
              
              <p class="source">&lt;configuration>
      &lt;appender name="FILE" class="ch.qos.logback.core.FileAppender">
        &lt;!-- "application-name" is a variable --&gt;
        &lt;File><b>c:/logs/${application-name}.log</b>&lt;/File>
        &lt;layout class="ch.qos.logback.classic.PatternLayout">
          &lt;Pattern>%d %p %t %c - %m%n&lt;/Pattern>
        &lt;/layout>
      &lt;/appender>
      &lt;root level="debug">
        &lt;appender-ref ref="FILE"/>
      &lt;/root>
    &lt;/configuration> </p>
    
              <p>Assuming each JEE application loads a different copy of
              logback classes into memory, if we can somehow inject a
              different value for <code><em>application-name</em></code>
              each time an application starts, logs will be output to
              different files. We just need to initialize logback with the
              above configuration file while injecting a different value
              for <code><em>application-name</em></code> variable. Here is
              sample code that programmatically configures logback. It
              should be invoked during the initialization of your JEE
              applications.
              </p>
    
              <p class="source">  LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
      JoranConfigurator jc = new JoranConfigurator();
      jc.setContext(context);
      context.reset(); // override default configuration
      // inject the name of the current application as "application-name"
      // property of the LoggerContext
      <b>context.putProperty("application-name", NAME_OF_CURRENT_APPLICATION);</b>
      jc.doConfigure("/path/to/the/above/configuration/file.xml"); </p>
    
              <hr/>
            </dd>
            
    
            <!-- ========================================================= -->
    
            <dt>
              <a name="overrideFromCL" href="#overrideFromCL">
                How can I disable logging from the command line?
              </a>
            </dt>
            <dd>
              <p>Logback does not allow logging to be disabled from the command
              line. However, if the configuration file allows it, you can
              set the level of loggers on the command line via a Java
              system property. Here is such a configuration file.</p>
    
              <p class="source">&lt;configuration>
      &lt;appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        &lt;layout class="ch.qos.logback.classic.PatternLayout">
          &lt;Pattern>%d [%thread] %level %logger - %m%n&lt;/Pattern>
        &lt;/layout>
      &lt;/appender>
      &lt;root level="<b>${root-level:-INFO}</b>">
        &lt;appender-ref ref="CONSOLE"/>
      &lt;/root>
    &lt;/configuration></p>
    
    
              <p>Making use of <a
              href="manual/configuration.html#variableSubstitution">variable
              substitution</a> as well as <a
              href="manual/configuration.html#defaultValuesForVariables">default
              values for variables</a>, if the <span
              class="variable">root-level</span> system property is set to
              <code>OFF</code>, then all logging will be turned
              off. However, if it is not set, it will assume the default
              value of <code>INFO</code>.  Note that you can set the <span
              class="variable">root-level</span> system property to any
              level value of your choice. The value <code>OFF</code> is
              just an example.
    
              </p>
              <hr/>
            </dd>
    
    
            <!-- ========================================================= -->
            
            <dt>
              <a name="setup_jetty"  href="#">
                How can Jetty be instructed to use logback-classic as its
                logging implementataion?
              </a>
            </dt>
            
            <dd>
              <p>The Jetty application server uses SLF4J for its internal
              logging.
              </p>
              
              <p>Logback jar files must be present on Jetty's class
              path. These files are
              <em>logback-core-1.0.13.jar</em> and
              <em>logback-classic-1.0.13.jar</em>. These files
              should be placed under the <em>$JETTY_HOME/lib</em>
              directory.
              </p>
    
              
              <p>Since Jetty uses an older version of SLF4J internally,
              we recommend that the old version be replaced by
              <em>slf4j-api-1.7.5.jar</em>. This file can be
              downloaded from the <a
              href="http://www.slf4j.org/download.html">SLF4J</a> project.
              </p>
            
              
              <p>For automatically configuring logback-classic, you can
              place the file <em>logback.xml</em> under the
              <em>$JETTY_HOME/resources</em> directory. You can find
              sample configuration files in the
              <em>logback-examples/src/main/java/chapters/appenders/conf/</em>
              folder shipping within the logback distribution.
              </p>
    
              <hr/>                    
            </dd>
            
    
            
            
            <!-- end of definitions -->
          </dl>
          
          
        </div>
    
      <script src="templates/footer.js" type="text/javascript"></script>
      
    </div>
      
    
    	
    
    </body>
    </html>
    ��������������������������������������������������������logback_1.0.13/docs/dist/���������������������������������������������������������������������������0000755�0001750�0001750�00000000000�12143164243�015047� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/setup.html����������������������������������������������������������������������0000644�0001750�0001750�00000025606�12143164240�016140� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Setup</title>
        <link rel="stylesheet" type="text/css" href="css/common.css" />
        <link rel="stylesheet" type="text/css" href="css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="css/_print.css" media="print" />
        <link rel="stylesheet" type="text/css" href="css/prettify.css" media="screen" />
      </head>
      <body onload="prettyPrint(); decorate();">
        <script type="text/javascript">prefix='';	</script>
    
        <script type="text/javascript" src="templates/header.js"></script>
        <script type="text/javascript" src="js/prettify.js"></script>
        <script type="text/javascript" src="js/jquery-min.js"></script>
        <script type="text/javascript" src="js/decorator.js"></script>
        
        <div id="left">
          <script type="text/javascript" src="templates/left.js"></script>
        </div>
      
        <div id="content">
    	
    	
        <h2 class="doAnchor">Classpath Setup</h2>
    
        <p>In order to run the examples provided in the documentation, you
        need to add the following jars to your class path:
        </p>
    
        <ul>
          <li>logback-core-1.0.13.jar</li>
          <li>logback-classic-1.0.13.jar</li>
          <li>logback-examples-1.0.13.jar</li>
          <li>slf4j-api-1.7.5.jar</li>
        </ul>
        
        <p>The <em>logback-*.jar</em> files are part of the logback
        distribution whereas <em>slf4j-api-1.7.5.jar</em> ships
        with <a href="http://www.slf4j.org">SLF4J</a>, a separate project.
        </p>
        
    
    
        <h3 class="doAnchor" name="commandLine">Running from the command
        line</h3>
        
        <p>Assuming your current directory is
        <em>$LOGBACK_HOME/logback-examples</em>, where
        <em>$LOGBACK_HOME</em> stands for the directory where you
        installed logback, you can launch the first sample application,
        <em>chapters.introduction.HelloWord1</em> with the following command:
        </p>
    
        <p class="source">java -cp lib/slf4j-api-1.7.5.jar;../logback-core-1.0.13.jar;\
     ../logback-classic-1.0.13.jar;logback-examples-1.0.13.jar\
     chapters.introduction.HelloWorld1</p>
    
       <p>It is more convenient to set the CLASSPATH environment variable
       once and for all before running the examples.
       </p>
    
       <p>The <em>setClasspath.cmd</em> script located in the
       $LOGBACK_HOME/logback-examples folder will configure the class path
       for the MS Windows platform. For Unix, you can use
       <em>setClasspath.sh</em>.
       </p>
    
       <p>Please edit the script in order to adapt the <em>LB_HOME</em> variable 
       to match your local environment.</p>
       
       <p>Please be aware that many examples will launch Java classes
       along with configuration files. To access these files by using the
       same commands as written in the documentation, you will need to
       issue the commands from within the
       <em>$LOGBACK_HOME/logback-examples</em> directory.
       </p>
    
       <h3 class="doAnchor" name="SMTP"><code>SMTPAppender</code> requires
       JavaMail API</h3>
    
       <p><code>SMTPAppender</code> related examples require the JavaMail
       API version 1.4 or later. Once you <a
       href="http://java.sun.com/products/javamail/downloads/index.html">download
       JavaMail</a>, you need to place <em>mail.jar</em> on your class
       path.</p>
       
       <p>Here is the corresponding Maven dependency declaration for your
       convenience.</p>
    
    
    
       <pre class="prettyprint source">&lt;!-- The javax.activation:activation:1.1 dependency will be --&gt;
    &lt;!-- automatically pulled in by Maven's transitivity rules --&gt;
    &lt;dependency>
      &lt;groupId>javax.mail&lt;/groupId>
      &lt;artifactId>mail&lt;/artifactId>
      &lt;version>1.4&lt;/version>
    &lt;/dependency></pre>
    
       <h3 class="doAnchor" name="groovy"><code>GEventEvaluator</code> and
       <em>logback.groovy</em> configuration files require the Groovy
       runtime</h3>
       
       <p><code>GEventEvaluator</code> depends on the Groovy runtime. It
       was tested with Groovy version 2.0.7. Similarly, as the
       name indicates <a href="manual/groovy.html">groovy
       configuration</a> files require the groovy runtime to be present on
       your class path.
       </p>
       
       <p>Here is the corresponding Maven dependency declaration for your
       convenience.
       </p>
    
    
       <pre class="prettyprint source">&lt;dependency>
      &lt;groupId>org.codehaus.groovy&lt;/groupId>
      &lt;artifactId>groovy-all&lt;/artifactId>
      &lt;version>2.0.7&lt;/version>
    &lt;/dependency></pre>
    
    
       <h3 class="doAnchor" name="janino">Conditional processing and
       <code>JaninoEventEvaluator</code> require the Janino library</h3>
       
       <p><a href="manual/configuration.html#conditional">Conditional
       processing</a> in configuration files requires the <a
       href="http://docs.codehaus.org/display/JANINO/Home"><b>Janino
       library</b></a>. Moreover, the evaluator examples based on
       <code>JaninoEventEvaluator</code> require Janino as well.  Once you
       download Janino, simply place <em>commons-compiler.jar</em> and
       <em>janino.jar</em> on your application's class path.
       </p>
    
       <p><span class="label notice">Don't forget</span> As of Janino
       version 2.6.0, in addition to <em>janino.jar</em>,
       <em>commons-compiler.jar</em> needs to be on the class path as well.</p>
    
       <p>Here is the corresponding Maven dependency declaration for your
       convenience.
       </p>
    
       <pre class="prettyprint source">&lt;!-- The org.codehaus.janino:commons-compiler:2.6.1 dependency --&gt;
    &lt;!-- will be automatically pulled in by Maven's transitivity rules --&gt;
    &lt;dependency>
      &lt;groupId>org.codehaus.janino&lt;/groupId>
      &lt;artifactId>janino&lt;/artifactId>
      &lt;version>2.6.1&lt;/version>
    &lt;/dependency></pre>
    
    
    
       
        
    
       <h3 class="doAnchor" name="ide">Building with an IDE</h3>
       
       <p>If you wish to contribute to the project or just hack for fun,
       you will probably want to import logback as a project into your
       favorite IDE. Logback uses Maven as its build tool. Logback offers
       a Groovy-based configurator so there is a dependency on the Groovy
       language. It follows that your IDE should have plugins for Maven
       and Groovy in order to <em>build</em> logback from your within
       IDE. The Groovy dependecy just mentioned is a <em>build-time</em>
       dependency. The only mandatory logback dependency at runrime is the
       JRE, unless of course you wish to use the Groovy configurator in
       which case Groovy runtime will be a required dependency as
       well. Also note that building from the command line is fairly
       trivial, the command 'mvn install' given from $LOGBACK_HOME folder
       should suffice. </p>
    
       <p><span class="label">ask for help</span> Notwithstanding the
       instructions below, if you have trouble building logback from the
       sources, just ask for help on the logback-dev mailing list.</p>
    
       <h3 class="doAnchor" name="idea">Building logback with IntelliJ
       IDEA</h3>
    
       <p>Assuming you have the latest version of IntelliJ IDEA installed,
       no additional plugin installation is necessary. IntelliJ IDEA
       supports Maven as well as Groovy out of the box. You can import
       logback into IDEA by selecting File&rarr; New Project &rarr; Import
       from external model&rarr; Maven, then select $LOGBACK_HOME as the
       Root directory. The import should finish successfully in a few
       seconds.</p>
    
       <h3 class="doAnchor" name="eclipse">Building with Eclipse</h3>
    
       <p>Building logback under Eclipse is a little trickier. Here are
       instructions for building logback under Eclipse in 61 easy steps.
       </p>
    
       <p>The author does not wish to unduly disparage
       <code>m2eclipse</code>. However, as of this writing, that is
       October 2011, it appears that the key to building logback under
       Eclipse is to avoid using <code>m2eclipse</code>. If you have
       <code>m2eclipse</code> installed, you can disable it by removing
       the Maven Nature for a given project. In later versions of Eclipse,
       m2eclipse is installed bu default. As of logback version 1.0.7, the
       <em>pom.xml</em> file for logback-core now deactivates m2eclipse as
       explained in <a
       href="http://wiki.eclipse.org/M2E_plugin_execution_not_covered#ignore_plugin_goal">M2E
       plugin wiki</a>.
       </p>
    
       <p>And without further ado here are the steps:
       </p>
       
    
       <ol>
         <li>Install Eclipse</li>
    
    <!--     <li>in <em>eclipse.ini</em> file modify the parameter "mx",
         i.e. change -Xmx384m to -Xmx1384m</li>
    -->
    
         <li>Install the Groovy plugin for Eclipse. 
    
           <ul>
             <li>
               <p>You first need to determine the update site appropriate
               for your version of Eclipse. The list of available update
               sites is available from <a
               href="http://groovy.codehaus.org/Eclipse+Plugin">Groovy
               project documentation</a>.
               </p>
               <p>For example, for Eclipse 4.2 (Juno) the URL of the
               update site is
               "http://dist.springsource.org/release/GRECLIPSE/e4.2/".
               </p>
             </li>
             
             <li>In Eclipse, select Help &rarr; Intall new Software &rarr;
             Work with the update site you chose in the previous step and
             then Select "Groovy-Eclipse Feature". Installation of other
             plugins in particular "m2e Configurator for Groovy-Eclipse"
             is <b>not</b> necessary
             </li>
           </ul>
        </li>
    
    
    
         <li><pre>cd $LOGBACK_HOME</pre>
    
         where $LOGBACK_HOME stands for the location where you cloned the
         logback project from github </li>
    
         <li>In case they exist, remove <em>.settings</em>,
         <em>.classpath</em>, <em>.project</em> folders (again if any)
         under $LOGBACK_HOME and its sub-folders. Somehow, this step seems
         to be crucial.</li>
         
         <li>From the command line, run <code>mvn eclipse:eclipse</code>
         in $LOGBACK_HOME</li>
    
         <li>In Eclipse, import the logback project: Import&rarr;
         General&rarr; Existing Prokects into Workspace, select
         $LOGBACK_HOME folder for the import
         </li>   
         
         <li>In Eclipse, remove the
         logback-classic/target/generated-sources/groovy-stubs/main
         directory from the list of source folders (logback-classic&rarr;
         project properties &rarr; Java Build Path)
         </li>   
    
         <li>In Eclipse, clean all projects in Eclipse (Project &rarr;
         Clean)
         </li>   
    
         <li>In Eclipse, select logback-classic project and convert it to
         "Groovy project" (right click on logback-classic project &rarr;
         Configure &rarr; Convert Groovy to Project)
         </li>   
         
       </ol>
    
    
       <p>The above listed procedure has been last tested by the author
       using Eclipse Juno on April 4th 2013.</p>
    
       <script src="templates/footer.js" type="text/javascript"></script>
    </div>
    </body>
    </html>
    ��������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/repos.html����������������������������������������������������������������������0000644�0001750�0001750�00000003524�12143164240�016123� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Repository</title>
        <link rel="stylesheet" type="text/css" href="css/common.css" />
        <link rel="stylesheet" type="text/css" href="css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="css/_print.css" media="print" />
      </head>
      <body>
        <script  type="text/javascript">prefix='';</script>    
        <script src="templates/header.js"  type="text/javascript"></script>
        <div id="left">
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="templates/left.js"  type="text/javascript"></script>
        </div>
        <div id="content">
    	
    	
    		<div class="section">
    			<h2>Source Repository</h2>
    		</div>
    
    		<p>We store the project's source code in a revision control system
    		called Git. Developers have write access to the repository,
    		enabling them to make changes to the source code. Everyone else
    		has read-access to the repository. Thus, anyone can check out the
    		latest development version of the software. Note that the latest
    		version in the repository may not work as expected. It may not
    		even compile. If you are looking for a stable release, then
    		download an official distribution.
        </p>
    
        <p>The official logback source repository is located on github at
        <a href="http://github.com/qos-ch/logback">
        http://github.com/qos-ch/logback</a>.
        </p>
        
        <p>Anyone can clone logback's source repository. All you need is a
        <code>git</code> client. </p>
            
        <script src="templates/footer.js" type="text/javascript"></script>
        </div>
    </body>
    </html>
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/logback-2011.ppt����������������������������������������������������������������0000644�0001750�0001750�00001046000�12143164146�016617� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ࡱ����������������;��	���������������#����������������������������������"��������������	���
    ���������
    ��������������������������������������������������������� ���!���"���#���$���%���&���'���(���)���*���+���,���-���.���/���0���1���2���3���4���5���6���7���8���9���:���;���<���=���>���?���@���A���B���C���D���E���F���G���H���I���J���K���L���M���N���O���P���Q���R���S���T���U���V���W���X���Y���Z���[���\���]���^���_���`���a���b���c���d���e���f���g���h���i���j���k���l���m���n���o���p���q���r���s���t���u���v���w���x���y���z���{���|���}���~���������R�o�o�t� �E�n�t�r�y����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������	���
    ����������
    ��dO��)���MS PowerPoint 97��������������������������������������������������������������������������������$������_�����Current User����������������������������������������������՜.�+,D���՜.�+,\�����������������������������0������t������|��������������������
    ���_PID_GUID�������_PID_HLINKS�������Without Tagging��������A���N���{�D�B�1�A�C�9�6�4�-�E�3�9�C�-�1�1�D�2�-�A�1�E�F�-�0�0�6�0�9�7�D�A�5�6�8�9�}�����A���0���������n��:����t!D��PNG
    
    ���
    IHDR���������I*Zr���sRGB����	pHYs����od��IDATx^$yvFdDddw/weNx%�bH
    \]@%DEJgE`%Q%	 f`{]UwF?2etz@yU7w/]{ߏouCӴN~;yYgϻͻn;<z4^E2tnY>ϻdUo''ڑ
    w	3#Qw^Uy?;轔gmޗ*Wx6'>nO{q#<#=bg}=W9:>6Spijj-*l{;lN9;^m[Ƅ?ZCC[zk{gy+kӏ|]|uOQR(}^4Lqhiʷed|HVp~w:7]VHnCbg3X0VF1MZDVUeթwdYC')u^3nyxHzS<l`GyC=ΞMZ%N7�gx"kM#oDT6Im2ݺvu,R\/3_]EWepQPO[_lqxש^=ڔ=y9+.<=Eݨ{Nw=gj3G6A=X
    DS٩7&6;roQ=MwO6>G6m^nNe6bw^M0/zרWJ;}Dasbx2meއO>NQzFF2L=l䮆y$m+&Q
    O=a|˃/3K7	,BMI2#?><o w,
    57o~q`T\[O~*s~0n1,xJ[{>ݔ*ʼaK)ٷ%meoceQy<tsp>98[թUR! cJbnRj=oYTWϭQ1͘MHu㢔ẸGe)68+Iɟ0!WovxL|M<Եfְ ;b}c XDvhmC{@@Fq>-cWSg™a7(%>*GL~lCt:~dn,Tϳ6l
    2}]f$iуpk=+IFϞ22s
    K
    ~\:=byR54h]inL-~�?gF*uTrǾ}ePofaw<dat1ŗx*F`I@Kսw?{nힲmu[ԑ=^Ws'`N<b%-f9>o؜^$.=;Q{yz+}|ϻa"-[޹
    KS0u)񬧯u5V\<YͭtViu]mXV%J	|{^{@6B;M	'M4&/#UZ
    oY~C'N߇mKƬ;acm:гtHR!0NbZL]"FD.u%uCm=Ѝ^3|֠5\uZn34:Ų*;V\_+ Jv{p8f=ihV
    ﶿ	l_\d31{*_NIs6!%?*Ie#>ZWfyDչst:+{6}<;MG.mD$5Ļ*&Ye
    /zU]705>àg"wm;Mw0zoZZQ(VsFT-+;09 m7i
    BNKo޶,;>KrvoX&0?ɐZJ>?0gmQ:~y:&:8]Mnr	GMrr
    9`%kS˫<zfw7L) F6Q	'uɰhhu15͕كr)_HA(D"`�_71zdn@ �ZJQA@$=bus@$
    \lj*03ӁKAxfY|L/?w7oã!
    k}pssՁIau;xՁw9
    9qtF=%uFnP<ݞ&"[iȺz~,o:͵zƙI'ⱅT<<vcW/ԓAzSb͵VkP.^nBPM˞\~d!֬`v>rFz4hM~8V,=ޯ3DR	kSIk{ۆay򏘵-o~ȅ7ziɁT5'ws1M~J=w>|skgk}kk{R)WWWϝ=x$bJB/g}}ŐƭdbTʁMWk)fYV
    ѻZ1
    J٭T1?>{ꆃiXD
    a)>LQ:DcQS?)k#aM9HO$}1a6q
    M(ksbm-$YV+㧺rue}A V䅼E}˥[kwv{Z88?lx4ÓZCfvzd~|a`GF=+#Aq)H[;Ϗ3kkMn60u⠿8!⯁ch4~{-jVgO})-e-DV0l6-c]sc(HoTFMrGZ48ގznIomw lHȚpV=39*dC8^7p[DK}P
    ^c@	ZbPV׳l$[Y\J0^`^bd_h~Nf	x-6[wzZBh7lj16^k4{V4nܾ+地Ep#WVw>rf9DҜ-BFkAzc\B8Wc>ZGߓ#(3r
    5"@
    RzM,Ur_I|wjs66h6I>S7p/u^hz?9ɨ1d:hf^(C~Z-p\_Ƒ9mFB�08msg"WaD_4zCxi~K	N|00UqP<&b.v @7|ܓbԌԂX^jӶ*:MeЫ)/YTGYwahi$)ᘋy/1fm癨tGȃ%l89$rMcG:6IUōjCV*Uxf7;3X}#Ɲuײf}`%N+`zjN4+n
    bbԞ'uVFk6Z1bjڵ@ءt-JeQjq[̛>_[YAݜ-iu%
    o!DŽgu?nKv;'ו;t\ (yX
    $(Q6\M|qN+@
    0REmtME YDk]ngvrVtZFt`,(U`L/
    X_׍Ya/	kF&	c~\Y^Žfn״fAh%_xxFbM�NiuJ0p8Wڪaڭ"gj+'c魍
    ӫg-dA_"bm +tS
    GSU@8'�>t8`ǀ}eZ!N6^Pe^\U`ki=aSH
    %pcZZ?]2wVWp09+bv
    %CfOrЎܢ
    m`ǜ<Yokz26Ө9N(Ddoij]cF<XŴA[ީԋ.߸uExl:kPĒ	nX\H
    z˯q#ȇ\r"F,M-�iQ̂<UM%oK>u:JrHė
    hQKjnsQ9S!rGT$q7I,8"D(<|J=}"vzzI1΀cլ0j]\%w̰rY_(PCv)5uPRž+
    !ﴻ|៚oSlW]cKSAVY5Jf0Mď-vО/433ӅRjEQ\Q @7^%Fsϛ76vӏ=3O=o(Q>U\\0$Fυ	œu]	x}`rS
    ki|!o<c\@61h)ib4HF2$![>nldk<^�};D2CDChIMҫV
    ^6}MQ[==ۑjZAJFim0vEiIj(GZ4+^ѪmolltNj:](猀83NՀ?H@N\.NMM67k~'+Uk4j
    ~$kESo^璟G}vǶd*02%&@cR�#_KSڢ%FxZ^T‹2I/,p#eCA&YÒT$dqȾ"16Yx2\"~_ȯE˅1V(sHH܋n5۵hm)	񦜔55.�_�VSY*V1AnC7mB*}efg-|d\:?ʅAGY,cWoӃQ73_(z/_}X<U6IKyH(F%ԉR(@K㛲�Zn-	WvB+'y'Z18džUJPueh$hŀ(Nוj#uܠm"E
    ~/,"�ewI7	m-t�E3
    thS}Ap{z
    fFN1֮-6}~\rRU)J2an3:V(SߑrfI3Z	<gC*Y+r idBzz*h0d#z"n>٩9;
    F.mi	Gl?sxsK+'v=_sr>x,DZF'*QUAma܎uTWpNSKNFw!#�g+;9�	&$g(!~	>?nLP,>jUi5	U̠+(YoWu_,!3
    JaV<6ӶMˏwiSɈOG9(W%(
    >VWá)ADq'.OKkhNϿqK/^CB9SӔKTxff.OIo{M,^7-#Tjd
    c�FcF$OѴ2ZrnA#�doa{}cm1?Lu:[_9(QNUjB1[	tcx,k"6$&UB2AѡdAN6%lLE`4|
    	cesX(ި>R޽R	p8vGu%9ĒcM=pܙk P-
    iJ
    3N�ƻ]#z[VhyZKJK+Bi'N~?t֭ǏB,MRQ(>P$:-B<p6w`.OR(qN/6X~tbAT$ɄTҳR]>N#>Y*ǗLBXqMPR3.\W]ЁAnTm\%cFL%>2mx2<n7`ٷa42?y1=r(6>&~opuSL\©kvXzsTkۅ˧3ٕp8`A3rH&]_=ߪ-s285:^5}N
    j^gfQo'BViZ\z7_muOȧ)vo}!Hhk<{氰2O~tf&Tc~ٔf;$~"E<߼t!Q:V*e\h@K6pbe	`m//>\;6+];#ߦ豒[
    A7Z8<l׺P{PSĢHOM/@KLՌ{*�HZ#!,SX)UR^ՎQ)ԷBY|"Wo\m!<;c'9䩕'<9×1P8}@U皀UF 8pL=g783BN,�4(i	=dl<~A2 
    h<Hݍ߲TR!"z\~j',
    BH0@KK3iBl<Nuxؖ;P&aƤ ^C2T
    !{momʁ\r$Pqg97/LBr-\|[n狭C!M:=3$otmF)l2o	09F{]nE6[Z-}$M׀(wr~S^Ȓfny`+av/qVHyff͟p(wh̚7lhmK&\H%E9g`$tڨM'rtRkRP�t4sJtb!:tċq.[\]r`h4t±	d:3I%߰k6==?133ݒ$OǧNr%s<iMZFְ)"<25	ێMUޗixTo״VNe[Nڽpوw:q{?
    \N_p+:4�a$5:Z7];Z5(77sF֫R:X*z#LO$'
    Nt1`Ek6%Ri0*t»lGdӛ&IXZڬ:C&C)Not)&MM%RA+
    tjj:])6wwvg33SߑP2۳()% Ttg?iZaycߥ:FY=8'nu_!K?	"6T]kS.ۧS, 
    pXSSڰ{P�%4k=
    vѲEy,fA)cs25;FXfX;v頴.6#0R 
    v8Kgs\D&1g&OVܭq;RBf#t#N`K7
    6٦٫5kvğک2!c]@]'`]䉽Fߤ^mv%O1$<$fQKdԸC.fLMOŦH-NHqy8A~}X(ŢRB'lP
    V1&I-Z'`HM*&%iy
    {]D`֦xT
    mȎ%@zۯ\ۯ7zA۠_.Y#klҺֻ:IX+cs%:Er
    X#@:Sa
    ܻVd::
    F'1{X0'b3o*2FNJp0qݱY|fDSz'ъlt(4u1qZ�&RG)J�be7JfRg##�iGHԡ}gO
    ͑le2";ljEk\O0_]]Ds
    	}=3B~-D2dyMeG0p}UUM4m(gP({?]gvFB�N[	NUPWk*_=hux:A`?G'o0;m)D*QGLs@�"ܪvh0	zRL3 VQ61
    p|
    ^E�`25/%Hw .4mܖ0#iһ\K.;u|@.4Wֳ
     MIx[ݍF#s帞Q+i#Ϡ~lUekRrJ&YLr1z&[}0ޏ֦ܥW:d�ζ[^' f%)Hb1K
    vK)-BܬmtcGCNma'8GvIō_p&zWmZ=!04=|emIFXkltڎjY-54ilGM+=ܿ-[V.&j7dxAs�܍>8sHfl@F	ĤylqGz1L:ޱ$Q
    nfX߼U0P,V2ґTܚЈ6P\{ڻ|)S%)d5& 6!Œ> .D͵bX*ƠҬ1KE�D2=deX	DAAmh%F<mnQSD\ax}wK&"&
    xBpխVWiVEҼ
    SWr,Llu*4|`go}{oszdЪ@+`!x5dhv,}\>&kPPGcapFz;C%jM;Z2D>զ"TxR!GR<Ǽ`.O+]P7DD2w0?(&|O7ŽqSm5¡x8oջP1Ib8۴i2pshFeHȌSO]gʙJVL!2-0Q_8sHjC1dWQ>`U"ڤ+"؁AS!ꕊvX#:7ȕLmʁ%ij,ʤ3|fnnGb:I`Ȋtr	nZbYU@PlR!H͆蝦i`ba[(-g<O{Hn&8tHVadPHޔJ](5a>8EHD\Rpq
    -X0ʮ5QhtmHihh`#a;ft.܌V;1Z!HGC:)etAX'+>atz>I1b-W_^\gN$T0O%JV#�|+6
    ҭX0
    vtA`r};#a9:rF:+Q֪]<}\
    Gb]@6�SЄ`ԤH!-cߒZo*H=�0YA!!%!e
    XHJfm[½GLDh$�!-
    \`\ȱL$ʕ\U溋Gm~H:lG|aå[`t~4^@ЧRD<_dQ],49]6juAU:FxcJ܉Vgd);n>"Bzoo+ؠ/OEfp9�HmSDnoqg'�JEC2ңFV?rK0j 3dvܔhI7�#P
    ,^'Wi<	i*&Z
    U\R{RvZxw3"8raP"x%2Mwl:Nr}i)~ÉFiZ&EM^BFWNt/GI!XAb)enDEo@}iL|yXI*�#`8IX9~lq5KIgm~}lRl5kn21C㥾ei$:}x@mfx@`0*GU3)v2XZJWK
    QBu1mfC1Q?82&g2T|*A8qI^*4vY5jBHr6~6a!IZ6WZVHZ6U%>
    rW>W9�Hj4+._LI-x0]mp2''bNQ m3T*I.X$@;$WEy+iTBmPPrڍ[XL&5wr'HD2ek|XSh)UXCX6nz〫hR(N-c‘t*GOVԩP Ie!r
    YѰ} !q׫1lx"\r~8	$JE@M4Ճ|amwr$M*oK"=UnQ|菘ar|`4MOO
    @pT4\>Wzh
    L'Qa'A(rń4kRLRZKB&>L{T[jaA6᠈nVЃ[ƂXh	(ry19wAT\_vkow{wc0h.I1b*)<ޗi?U*qQT|X%4Ÿ()B$oc<sp4@WW]7dxx¬bk#�58uM uZGv5\Aj;UxG'6's(iu|[-$)"pI{f> FϙM/gvGh): i_ë,c!]#R<T\&|!0C6ļL?Et&{Y�rFWoZ`<<E6&(uMjw"Ug.Oߡ
    R3gN>2\"w"%u,m,
    ņ[h?+
    `x=#4=r1MROq2XSP0
    _}'4O6׶.;.uWJz-\%WZQoѪB֎h}M"XgjV=\
    ;HfFKH|Ht
    oY(V	昴x,IEлżZa*.j
    %u:'-äL#s_Phh"7Vڭs&jER-ҥ.4r�dE]wmZ`@bN <_Z9{ģss+TI:rpqd]NQȈq-P]x
    J8`1z"󴙎d2]-ht\i1.4�p,EzmqKErRF/1P>J+gBQ:7t2ي0)u֎8[M	)_c_=25J^?v?jVzSBRun9&t-['ȕԁ<B%88HA}.} oJ/6@ƴtXa
    Y=l&cQ;FE4n^PZx1jhf#Z_;pۥf#:!?Kz�
    ~,I?d.]`=t܄g:RIa_tZrv+S(<&|`vJA.1{ڞ䠘 rBA]@B|P"W
    ZP !v*=|X2Bj)T@d</?z:!#b
    
    LHuG=WzܻݵSHCX&Ӕ%I3,x4^6OŎ'-
    @쀿us?=(YJ[1ٴo~!:Z03gSgԌ53XbAաD/TrکRF@na9F`$[Ѵ:|\rh>CMwX^$g@:XEcAjM\iZZ:(}@kd1+*JCMԻ6Z@E.LXR!j&Yl
    G!\B]Y}"
    	�9)Ap~a^2z;ɓ�0Hja(6pvۃ~7j9rLlH*'ec*P=R H{]r>4V@y	HeAaêG)O:u+b&SfG}is#'?<h_`'ꄗ($zԉyDL�y+bHج0AڑzN[-=X٫STN`�79o?=}9+s9̈́^H Tv'3;5G$6|qMjQ_d0;R`S2໽q-R>[VjcN4UJ]K~xFC	"`&R1|sh![,}UXUŕ΍·@ٶMJn]R ւo?2G;BֆglguigqE32Di>wЪa)C
    �jKm Kē$.œQ3= {ϘL͇SɁ9g9v/jT`ERk-L"o
    
    gb24kszdfME`}*3$;wB]fpʐr9$_nԪfjѻVuTnC!hDBvK#U\ݔFTN%1 Qm0	OC
    cvZKWyVwv23/ƈ]_O1:O2fnBLԫpǔNg^-g:4M !By:BJZ/Z`پ-lmo4'-f[.&WNPp#&2Icihaxgixf\DAV_>*,
    ,ԃ7_X+ǴZ:'Rw#	EV3խ8Un6,hu}Cjœ'_d2j5K/ꇭrY#p๋ۛff6@QU}}Ւd9x,qs|pia= )k_^}ҧ|lq[;;wOx'fu;j^vSDG";O׷;y:vb47ix9kfS3?Ȥ7~ֿa2>{?W\͟[<|@"ti*^ZK^~ӟJ:q^}K1#'g2M0.Pɲ-IX5/- _)T D|}kKk|.5쏥@V
    @BL!C7IbG+H	%6kw}/wkBh6 k7povoJf{qR1	
    
    Ӥgo.6봌Hi(~k/z᫹+&Ыif׆T[eQꗲ\vSغ~kkc)Xsqț#W+|Ր@rn3ON%ֿzyۮww>Ak8laBq-1/\W7V6wӏW{z,o
    T9+pslP[
    ]# .U2AuRnR%sU,VL9sFFʐMEǾ'&cB:EW.Œ.0:$z~=/OFլ[n]!A~2&GJgĞVSuc_oӺJp"*9hwie[zW]gkko+nbZr!}B/ԵW]sSn9m6S PKLT{R۬a5cvfяv[jqң:șNЋ`K[x40)F\4e^EXB鐹ЫA>2ժ~P1	4FP6ŻHb5zkr2f16L!s2C_fiAkhrPZC+}j{vukW;l5ʤ+tV-DHP*)Jyݗ_ȍWK<UH�mRГ]V!p
    f24piP*uUGXiѡ#HY<d/ewbn3__X˿ovkK߸^jTg;FN6\3	_){}n`ZL?k;_޸[ÃR$Jk|G>YWwoE q3t"ף	g>�Is]6"(k[ d6˜@xhl2JL'3fߎ3ۛ뗢Z$hS'msk,GNٺ)ݥf}>t5$.{ju*l]+|KHt3!ȯtv
    ZH,φZ`Y*6%h$aL}
    /R6@VT;i�ecZWܚ2?Ǎ`Xgx3/hQz>T�7_zw*Rj[_(G??7?G|K߾t+0HmG7hʗʸ2Wv׏
    +'r~Ͷ{꣟OGCOϝ}ʞ^,֌HbE Z9Ocɩ̔3$R;3X82`/&l}q_yK+˙PS	<8HLO2q>kQObֆFe^�ϊs91HxM~>Nd4\,Ni+ӲZ\ppX]+54@nt\1n@4iV39@qg=L|署6oxm!/M<QI(K JoxKg&nQjZ*M`8z]nο#|&[ȶڏ?B
    WX\?w?/gVS\[{Q;aLƍa_SoW^]kFWo->pZ
    Fm_߼p-$"BBB+%qEr._OC~F߼wn^
    Cq6PhuɨdZ^EV(A(!+]F%Ԍk׷80o9+UK%	Lvtz:q)%Rfu<^Ǡۇ!`ڔhhF')cTɰ^FБJFT%k	(,za-?]#$|NO43]BQPR
    7DX/>-!^O{#΀t28Q59{?p/|yV,8Vۿ;	q_TocK'hȏ2u![aI/z/~jg>̢`Jd%e
    ˍ~|=@0
    [‹wO,1II8+am렺Xp&
    10jw]
    2اH;?۷1Z/Ǧ"/_ˤ-�51z fC@W%X+5՞\-bj�5݃}qd>ժݭ}e"3'2'A鍨NAIUI\=m"}WV;pғR,J,7$2)P(2eC(Rw_4\qi'jS~nI,V:g6aMkЯnЪ3?7y,^ntJF5d[߽B6;Vn^-]9YRk5.:>@XReI5|J@O>)/}=!tvOiD)Ifl/rͭ[ۅm'˫fS#�^mH[Kz3"o1Ck4Y9DM
    QF{m5=X]_%pi[~~e^|oܾ}7v?zJ	@T)Ȝp.6($*%GnSGWtx vȘ
    =f#Sqr`0(tY|X0 Y\~ɟ1-nbjΥovWj-_gAџm颅Ͷ#Zb~a}3/tF͆aSbkVUJ@jvۇ@'.Eڨ{۷Z]>XDA:;…oZs'OOˮ΢Fb6CY
    (¸eHL'TcjmdC:m_KoP`LI1SEyQ@Q
    |vu!R`7HR'._H&p(..[^0X}3J&
    !lZ*:2/ev!Q.6-QGKxU0%[!1[ı	
    AޔRҔPQȢ[ԯt_%kjZ
    O|6|lyVFв+͍ն]\o9
    n?&8N`>ѡKZ03"[	ٛۗrd	 ZmШu\fSK>FyNV_[PX<@ۭҔ[LK-DI
    7^VdPMƮo]Dv=	@ĉtC`LV-zt"]LFR(\}QVFأ͝]\F_7IK؄�T(2Ctbus}ͤfpܟK.nexUSd#.㧓QQc O[CMNmaJl+	i~19UIw[\CˇFd$BrHA22]+7Tn\МB24;eSRcy{-
    _>#_ AGtս~ɷ iMGrXZY8d)2`9ԆvPpu.7.˵,-։Hլ›/+{R7p#OrPڃKLPB31=: 61 .?eGowwUJ%D4Y`;4:8}fX{aۈEr	Vʵ:;Hcj2Ut$6N&X1h7}<s6a}4JH8!5C\io=t(z`22y-E$1SbIzOUȨ
    VD!@(t.%CZzkHӹ~$531atf	m#)T8!mƨ&?'hJ׀_xfD`WɘrP#~$Lt5
    kB
    iv\Z޼v	c| g7ݺƂBOu3=OcSΉ`D$jH2ҶRa'Uw G$S1Ø-{ qxKy2Oudxۭ[\fcsLe-?D72gVӧŸ1E
    <	i%*"J${N)>{UJTTnojaY9UpI4T4BJҮ+;vqA-/Q0z3YNrm`%) }13i5wPy](ڲ?|k$':s
    #Ժo\]Ы٬V?~7"ZYWX%Gv:Yhw-ް}S{@L򭦝0:mŒ
    E!+s4'S3zK&sgS'T4N;S`&9Jf:f1{Jh0~S[޸uO;kĂ|pv ?cDLwFXBfPETWk"h“`V.dWMÞz~:Ed5;0L,J50a?3ptȂCPDS�0XȐCm&ۅ}wgQl͐pxDŽoT< <gp%o{oo.vϓ?uLPո*<H9cc@ZE&)
    WzM/݋feClΐ	ph`s=_ǙNftLci91/dcc3 lQxpڐlI9*"*}Lֻ6HA^3o<mG5,i7+g2�6kKǵ@eKxt)Ī
    5V^b1*=	VzU
    Dj`h=HB	Q
    ~\hǸ2FvE/&" XS291i:NJd+_T_^‹@DN9 &R2#xn +p~*eA+Wi"ˤEK'h<RSf7qpo*.Y
    <<=?sgo
    fbL772=#%V*|K8.7GXKYIMO$^FyD籎R"dI4?`NJ"
    UX7lX<9+{2ciP?0Nh` ̩U0aT?~X<Ll,3G5Ϧ޽|0kϘ?pl!Cw_됨=ulkuc4~?ۙǺ]*P4S-!%{i3-*(ضب̘& {gLA?KNPa(іf˳ń1M6`_^vc),|gщ݄G&btHSNxԡV
    ð:
    og<s=yBm;mr;G~^eC4'`hDep0Y"h;l#9V@R2;MI%o)}p{͔z=%;yZp!#A,OL<2^Ƭ$#vf$Ԡ֍^{WU43&HU݀UVR(ۇ~:˒Rt)D,5i8fjBLnBA'f"ˬ׃jtFBV;I靠b&3	Җ}1˟z6bhɳIm/U_wymհkڃX;ًzMN	z18aRS
    S�Ql8A?.f,I(_~:Bn,k0g
    Vtp)Y&ox"LJ~KϷݚ4;F,&L1ohɁ5o8VtJIX.}43~<Y}|xܹ}z翠%S҇@Uul9A
    us	1;FޫBC/T 	;LZQ
    >oP
    FQHL4KDb~4iHLWS2a{	qDm3L|猭1q({plbvBDs,?YUA4ǖL$~#8`^|:y>8z&@)cm@2!5`2ƺ,ǭ+Ǯ޸X#uQ_ Itg5vJ";g-B/Tڙ̈́~əՓ>𱄵ZfZb*]ax}iWWj*
    -zdGA
    7˹;4e|pIAC?0S:S]O:g]FPe0}di~y>sl6z2cĈH+a2:$DZ�/4?%R],`S2P2&ɴϥy"sF_.^2" m'IPo3M	s҇u�~GGI
    QʕאA669RZd+1 j`s.miN~6ǽ`
    M'Ϭ>Cxt_	/-X_+_ztlEHo\|&Z[x̹ϲyp13e״vA˯8jF/GSc/M;t,slyfS0(6H+$w|FO_Wm.uՒi=0|t:1;[
    hbN@v}Ah$FCnIQe*1uT z/O+ۅ_;/2tx^Ŋ2؃_m٬,B
    )b_d%0ڭ
    ٤
    x(-]/=,IkTՐڲbI
    305=\sV0ҳReXp7o;oVi1MX՗+_K_|g_k$25텯Uo/[[^0cӾ)rMuzHL##n,EX(d3SBMS9C+i:ѴcMO1@R{NQ("]?'ޅJx}#jt+�/em!c4k5{,B{Bb^:-r]cBwjl#KƆ4D[;JR$:O5clŚ#sQJ#>̂4NZ>>H+'EJ/_zwoW_yn7/қVv{F0ktr(@Tzӌb8s\
    9}KS[6ҹ<ёLͳy?&=P9%APGGg1XdjLJMƾ[c>)
    NN6uC,4oa8=>ZHTDE(=jdϜ>M3&^.9-:RM8&F||&<ЙG75h*elӥF6"2'+[2@gZ
    RJ4|FդM>荚!4YY-0l{1TkBsM=D|J2٧a#Q|_d'_5¡r:c\j2عs[(/\v/3t\WB2b̊/&Ptb
    1% ;6GH2ӽRyWBpٴ$_huا^S6܋|t|.rn2]VcgcC~-|I( 7|11b>ןf5B4(tjp=(O{a<z0~8DfʥBg\mjZdܬkrͶ;{6]åFPu{ƀ+Ad
    4:}]⺐/W	Y<SXߎ⛤t{#O 
    O:}UhG[BDzӉ#|*ZW.eP}ӛJKN}$8wG`,}jMEFw45p?F*4&&JiZ5jP\rvPDfjƍ[,'2Ox
    om[ ;a|W2E'i՘;B[rmV/Tl +K
    2Ӭ
    ZM>10EkȎ;s7r77[_o=|}}aRXQrоZ4J]3qU
    oBy^B͵;@n#)v!$AX�(ڶcVOM%x(GcoE!"}&pIB"<r/MRmNFL@)@?
    a7{Sީ"QI-h%p_Nk8~wZ8g[R% F)(TXOD/̳>Zlf@_o~_?SZ|~'>Z{ҿ~~'3rl-mQ4oTሷN[Ǣ]v6(2涘\3}ߤf6a#r6{Y�mzr> B
    U	
    XH输lu4hnvӁ,$<90Hnf{sNs:\
    ԫH/T].O'?c5ٯs>'r7oZz_z'_Ee-7Bޔk2'p屯;45{P?LNjNؑzIӃ&/aGJR�!Ai=4EiMtp
    fCX\v䣍|LS(͍ZVϒ)$Q
    kcK]bN^O>:`"V6.|j
    xb̈lqK/}Cnhng:4{F;Pv=1 Cdn{TEk`"M+j+^+Ԭ.f$io~ʍ3ZzQZRh!l}۶hyignU,5Or.
    -cHfzò1K'>o9ݽJPlYK|:$ fV�%}wx"<S'~+D*{6F@aܙxrWw&UWx!;ߊ§"8NDhШ5EÕ`cH7ZIғ2J:cxsaq/i-
    (_o}ǞD$驕lݺi
    +z[W*{svV؉v'b`2e20>Gy9"KaѕW`ĨZFj&nS/h
    ZmV{Ӥlu``Q*aAKM}ⶓp{~Xv#4�,(Z_f,i=ƌ~%M%‰t<2
    Χ:C'4aǿw(FwovXPi(5ɟ)es$AW)w_jnIsm
    7.DڝG;gam	ZPuob6V9`;瓙s䔉c7sZvo_W#ይ\,O~ͽdDbs՗m^3%R,{11KɥB tz퀵[a(0=ּZͽ~]tFYw7ۗ._o|WnoTC]R:FQ{G+sc{mkfشdc0I=c.DMA0R6!b>{叅SgN=7b)k2 ߪ"a?qlU"M["[5<m&M{ی/_ �}VEHs4s'(n^ޢ	-Ieٵҩj͖
    рY+?9h	hѥɤWڎunZu4�DŨi(R-ow_ڷv>6Wnoԟ9KjNYޭΈ*. UOF5z%_@TP;25ǵx7{.ʭl+^gnKk	s8ࠫ#ﻷ]~&Ies0>zÞW6v7ork=(<qؽu[ٛQFhGb4~Txno\ciDS'fCtEEvt	w86 =a{tLGd)z@k$X<! sCT!+uhSW׿jfa�ɈYjьD0JX@-@,5ףR'ܚYxOHkcƕ?sy!xed<FOwlmw>;{Goa1S=K]g[U8Pbih}3Nj0tov7Zpݴŏ?ת/}�-7Kdb@IpqXc칏}Cy~A=~yk/6e;ʊy'lj{7~_';pwT3: [6fƲW_7~ᯒ fg.
    BN2a<-e3csWxо۸VxPk3AHXh%|�[
    �nnv5wCl*^mce4*Z.nC~CXHg+G镳O~W^?XuF=Ul7s{՝mTFɊ[$@lKh8c˫_o~FRd%]nN)[[7.֯:c.Wz!CG?+ҫW_~+N*zmP92Rp-D HYmdjvr7iw`͊,<vA5Um		L|1n&l޺]Z 
    /0s3Ujܦkb$jlb	A|Ȗ!ƷoGzT9ݶ0O%\thg,+BaYo,fOtf?tu=Uג5-Zᙚh,G/b/]X2�:*y,M""sivڡ?7~J?hځqFtp'믮|n曇7:땎,AA3ч7ʴ۵Ћk7kDQ֛O|3d
    ln~~W߸|n{ T2Hg)Ik]}5p,?d{)ձ s:rG@e$(T�509v
    AуX41_3&CK0ٍQz~2%8mBV!~}K7ƐaQEa
    y^}9hgD(`YO`ᩏK6ݿ	\6%cF
    "(_i?OfOCݣg!^st<G�gXos89럟
    exSA _(/Xvwg?w/U}I?c?ʫ7FU$yӏ9b3S9Яŭj&oʯ?ߚ2'?:}D~Sf+*ըdN>s~pi|-v OSOW-vwT"־_yO҉3OէN}3zAh?b=|g,>Btِm
    %!傆4잂]+߾qu	�".VM(\?PZvj<G?	Yty}w_.wVE&v:}H`ng'?]aNe
    rb6X�&K†k,n\_W__YwJ&jt*>t3FӳH2ỷKO>
    Kg{qXxX(XD
    Xaf~s:vS܇|x¥/>k>btj
    6j]5[m^X&[X25VkݿtjPNoU,>K/  9WߊV+kj<%LsBfk\1<H*`Z2/m>]1n=U-՛M"1U*
      JWFLA@D	w<eȜSC}Q߹˒=53rj"<TAne;זJ8Ȝtٱ?	젻鵊
    &Xfd|6zaĮ!ko[Na'_m^Yr7tr^2uS'_8y
    m94"HmYafܼ|LrM1a[/?%~J+?W;ՃJ',J4ytaʣ'ztnv`U2tIuY=/AC<3ךj>yFG$'hlFG(f/Iz;DpQJ~AF^tFq:dioK*$EBa7ARozJ_uxeƶC9W&rÙLV)oo>>qf#_ڮ?q蕎?6ѹz^|m9=7�MQ]wk~f+Wdۨm6oDl$n{`|"ܩS̏2{EShBHVq?;Nvn:ZZ5v	zK%AwͲd%,֕fPyfǧCyztTaS~Ͻ=ș~`;{"i?{08655QXE-bᕥЍ	ҰS,|Pbyl-"m2]`v2D)qOR=1aPu1YB5o5lewD~^JƵkdX*`ڦ:_f`SY+?w+;vI{,m
    ={Pra'khhܬ
    b.@O\YMƦND_�5[]6_yVy^n6$VoEnZo<dp
    7a<+Ϟx2
    Vq<,HB6Rwڽ
    wjF|dofm`N'(ͯ@mHr2Y)/)TTQ:<&Rp|>Etd-'(%x&դE*EEhdz*^xeܛ74D,ME^JKSp׮rjo1(Vj݂nRՊH1d[~/]{		sݭZ}c"<έo^QhT).6?ҧ?ӟ<}x3B5^xnl
    3Z7_7_4tV~wKkӟ
    oUZwlygsgKI@y! OƲh5ʃjrm{2\+}4)A&QINEOT>9)ʇRF"(B´-e*	+Ad8pdU.xev
    7/`nDہld7o<yؕ1Rgx8NiMC5iLдS_ukr,J98`ZTS,<|C=̹㙙(6SI{P)
    \y[lt\k_s
    QσJa7p3(]v`fqT؟dփZF$.<_Psoe;:yN
    ${!]
    )ﵾ7kәSm!`HC^@=OP0Z2Q)o-,o1WvQI-ŘfF~?  }Dto2m
    ;lm_3ɰn1z8(ʯbp@Dt{s֕?Z
    L$v1/+Ӟjc?ou�10:s^
    np<)WRE6�N@:;Om֙
    ]'SV?WW/.Fa!ųg?ɩ_ϵ.n^Gܩb7^{݅ɔ]@.l9\6^8IEQ}/zlNR*atx(qD(q%e$47F =y"N|X+YfM<*TœxH*P	q&Si4eVA,RhCR!tRg+h7~{L^lwk7wPYZ\?-na,^]۟ǧr=FZ~F\;cǎ|LO%evPb٩Y&FmByc`wg^orKK!kAB;Hh2
    [Eu־*g,!*z浝K}vdS\G3JLO98j&
    -vCpez\Dh0RBN$Ah4|0jǷm\zͫ1 y|I/tZCDUTU3ܸ0SV+'V.nۓk;fb^I^U
    3_fƻW.\?4wz&I&Cn-_=¥??3Oj{{uf0-{ss0?vd4vz&QXLLͳx%RIQŤ
    6`߶"SVñI?Ȥ} 1h~>8L&>|!5D|ބ2\$:l}Wo_9=sLl-ُ8ȴPpR'E-w Ɲw4O\w|~㋿+񼴺|a{Y08
    λAz,BAY>Cp{-3`ܾ~-9r>L;{rŋ.]&WgRY{ЌoN(N7_y ZL4td4cxm*j?35F$(ͬk!jB	u@ABl_xkWvvJ.t0q:O-;xNm%ZխYuڥOXesSOLYi"#}-\
    swC[z£Ba·7by+Q`/=rgґ'$)$RAԜ,2;dW^xzJ&Tn5nX>;Dvwpzlen~_TѓO> }T2KzM!ٵh).lz!H-N9Q'ۺ8R|V{;jREZBԳ<}$k[EVIxb:;mZ/_|i|04fO2,sq.9bV|cw렿{ڇU!hGw|uwGWN|`m$JNX[2qzaeIW.mlٲEs/]^g$3(|̓}'`s3o,"P,B
    >JZPAak|yx<>w7>?X
    M"aEPvWVfvŗ^fxꙐ{f8G9׈_G$ϋLb=;P g>mqCk{`_=C]Oz~X�=r{v>rj{71v#S+nQ�{V*[kϤSI\P<qLD"�ym)	
    (N23F+gO_c]J@5*yβ-;`cjݯr
    =ʵsOcn"񼔫<f-?9g/#Q-%tk~׍;ܓ")-gANXۃo2ھ+6iawu]	=C-7-guu:O/4BڇYXHxvyf~q7o3)^&NݛC,Hh6@F
    ݓFUaZJ#+<|^vP84Ǟ?sO鸙uDĈf	$o-"8>",Ms7гZqkr}1sʆ!PP*qٽř}Gk{(x;ߩ|
    S$f,V)@)9g[Y|d=ytee/e[_7v3AnTEa'AX
    T09=3&NQmfC1劅Bfe:67\>T8[Pm@yddzؼTZ2CD崐wF-vi:Kʫovǖӫh)6peJNCO7S;gr~YI~Kphn*4Ɩ-͵w6kggՏďŧh2-j7RSw0,Yv?j�$aՁӪ`]VQK./g<x0e"'`8Bi&:NJq<Pҟ"_vzZJN!?�c�@=T<*<sfBoqkkNljAڭݯܺ<}gW>vv̅ya@ bPP.]=ZC~M{*9),XHC]Zݎit?+7/w]hu_{Kg:5;i2x(n^'kޘL/-%BDd:iעNjxw;!A4lDoYh#6e
    嘍ԑf-b3Eh[Z9SBQPF>3Ek޽ƅ/ljgйn.ʆ YrhrqPEs{i^9Cyg6tFj@d' ˍoKk{7=AgÃٹ"xģOl)lnXB<*;"-m
    WEޑFR \փ�jj`m2.%ʅCQ|qфP!RE͐w*
    <hnkÃ/}[/g_xd@?la$ >hx5{Q\+oW׻[~̑2!~6
    DabVMB
    SP;`:3UV~Wg?CV|WSh1ċЬ	NE|頖k	
    SȦƞ�ےzu6bZMBDvLٽ,WKa\Bp*­2Ď ?½v[źy
    ko\fkOO[y*KcQ	OIʕjJM~UD'v
    x6]!2y	}g&DuLū) J
    ;-lgwG?l~s\kYeB,
    #O"k!3gIgRJp=a(%F+mJMrl;h
    Vw"4aY"ڀ.kRj\uo<wsG=#?<);K+׃FPEVQ;5(?_`TZ,!^~1t
    =7{/r雃POZ8✓^_csѥl.^3!4RAcҪe~_.
    c�Hd<b͒>nQrx_!}
    q:8\l4DkR~zpǬW/xK|+|O/[
    Nˍaˇ*~e!o_Is*K^~N5Qkh,TW;>omãXMI�4#s:tj.7*_^v]iU;�,V%#S_̠/~*b--vۂwf9+,(ţN	=	7f)ኄSl6;xM,MV}Fv\e7ϣ+3\15557<u'[Sv`\-hb}x#k2CŅ@)jH枯<Ǽ#khƦ晗ϱy7>ͷE#G.pQ"!jr]\ΥU;˅͝
    $D,uHӴ):	g36\M!S삔!fK}\7	tvx4ah,<О#XBd,6GBray(<fv6{><h,Ǟx'Ӂ%e|!-a@8N8M+CAl%Btm,KN6xȪ^t|%bm'^k?z)`x-lFNd7j$qhzzq~y-VQ*7ja`-茢苽";F$Y~_UCFڍ&Y;W D|a*Qb
    q$*4
    Pf+je
    ּ~mWϭf3|yd1D+f]YP*GDgh!\BW`I;`z/ET<4ae𯞼6	&x}m\%|ͷ<8	XSU7q-t*on~ۯt̆dQvvJOM;v^dډVnG:ZlFv	Eו.zYx.`QѴf~(,ndPf;V6߼Fݘ[J̲ı3gfë6pGszʇԬgwh%
    E
    >BetȦr#o7;>΀٩c+�'+{K2ЬA(QfrühctA]M+BXte|?Т#.lmcfjff=Z0[jem##4`l84ᐨK@Јdی\t\ccv5_9r^7/,GVyetla5s:
    vCXi`T2JSV4@=Gʔ<x彄h%acچ׀zsm2'*sej3CUT͸Ui}`dFcVv6<l;H=~̩3@k%#ݰRG@oGyDyO#t&	25A{ue"!27aF+v4Z]8::9Famz3D(Ô˳9,F6u+k(ߦnF^sˎ32wR
    �G6GFfÇһ̞ڤ>�"sBh7o!Riir7.ں-^za}}=
    %cH$ٝ<yܙ8jLفQ<u>b{Eȃe%H9h\YGip(#�78s1]3*2S{vutd/JቘUȾ|z*.�5ᴋw%3SvsZR=4"<6E'jއFj1;mld#[>	SC'_.׍2#-ՑP7FHCJv0n.™^zn^37O<8LӠL`JH$R0؎S>x8B3G4AD
    Vp/·عO=DR
    EoŃ~Yg(I3i{n2|@y2P8*֨A{V84⑵yyû弣E϶Oahy2]iÕ*~9,1="Tdj0_a_W/|ߪ5H83%f2lvsVF\*,woӬ@XtBVF3	A-ӫVFPނkt?yEP< Zۂȝd!9榀fqFqyHvpHpd=#TmbwZ؇0Q@6iM0y*bҸ29m/^f n]|_9
    Ff�igikZ{~雯j݌%SVMXCm-'J<'|8di(&'je$;C{ؙtb`a%lZ!;*m/ Ց~RNm,Fذ~Wұ'WgUPa<iOh{o(7CU	iS)(ѐPC4R:XD	<L;ɷfi}kʕ{M_ēa�^,f{K8i8KEX}>b6u/Vn
    l3ᢰ^^:1?Fl%WT<`f
    %&ፇpc(_ 6`	g+ㄉ_+�K)zU(87%䣬np\Y0m0:[}črĕm490nrCj&JG@{p厴"8l%rD@Ծ+rZ(&MN
    f@DXڬ#˦,d8V(hbx+Y;KFGx(HӀT<};TQɭ>C,Dg
    O|񭞵!룾g|i$]a%qdzM\'ߤgc6DCe!IkSry�Č1l){l.-
    DDj=�]NtAu4Ԋ:>12!ÌљU>��/(;DkXU^T-*1FGqpF둩+LLݮ>(>^D06g"=k[ۤFƧ26emkҷyFOQvx6Y,`&&U-18D5‘a`%V'[Ad?=<-l^77XD?Q$^[đ
    Ds*hL\CjꚜVs>6+KV qem_?uaUJTBekJë%FuyQ:i@w>&/45y?\d'GLq$9^^06IiIn2%ۂGDIYH{9H4v˜䮘E	K PLQ"5܂{C�Nna{ʟԢF5"Q_hJgLX349BFUKC8ϯ{=y
    yw|pKSim#+FO/o[]G.L.M"|qeYi)Tz`)w:B/—=(!2Iőz5ELP9yNxiSlE!@g*6j?	c'ܞ͍$&zwkSJQ0n7v"U;iGcʒDI[:Hp_@"wI
    CS)#x
    *V-"˟WLga액?L!:
    lT3StKٱj7E؛?Oj8U᭟UYz#‘	wmH:3ɽø/!nQo@TE:J%'?'yHs{Ik08y۟wR
    e86jbmXhMQo?BA{;RM9sUr9[ XHE)zFgv&=a
    SRZԫXN(5BʮClxdN6)RU)bou;L|h6q+!M>w÷y׸UPE+Fٛ<D@O(q*ցn+`m,NXj[JDS8ӆW
    WLEe2LU\p.r
    :,∀Uh
    ]Ѱgl{*_4d=ڥؒ竔:<Ucʷytu4$UyX,}dmLc\FpDy]S%e[yZ-	anIpqؤb#{OVc_޼ $y<{./Տ%C<{FtΦVXyg9DZKoG}ɘX8m"DU-/Mޕ4�Yo۳I/<j1U</_Gwd{h¾=qgGҋ1=7MqJJqh:?5n_fl<˜ N><$(I޹=6m܏ͽRD,L,kɍ6cbck;_^L2y_1Bd6<
    ;exz	;udbRG(y&>|`7|c9p'm{z·M^jiУxFU0(K`<qjφ5*cjhmC&<Q�H=v?}ңbϰ?OpQB6JSɡ
    ]=zM;򶱃EUE:$x12a#=q#kQGTxN=b#H[#_l:Ҕxy(IKsy
    ݞdXTY&y9( amܑKxa;2 Fp38R
    O%Ƈl)6w/�щmepc`alvq̝}^&cLٴN|M䣛lxQ}<S=U=hXeCbؼ+gCR6ivSRLCI3a֪C;2##@P{.ebo=9Wy;
    a?Z8<#3W<2T^Vv%59V gL<:Vc˓Z:U:-FpS=z~n4m4t٤yvԝ#x_=7Crx\hG.г3ew<z	tct‘{"ǀT$FmՍzwէ^tn!Y1FQxhRwɏ{B�am"qL0S9Cӛ@|+;BC2ByQ7y%wߚxz;==]]{sԓ'mޙ3MܻeT3NǚI"mh	V/4a,&>~7B&zw:3q<>=/Ϧ����IENDB`�n������l$1��PNG
    
    ���
    IHDR��������@\���sRGB����	pHYs����+��EIDATx^$u.\\ü̼bf8'vs؉)f[f-iayzVR{%+?jW3={ú˼z<&eq.0\eòK"^'ȽO{pu,"2P/^;2wu&[+*S]*P7/+o~GhH[ckn>Øfc)/Mm°Ԣt)!o`I<~?zuӋL..29w)rˏx/.e~1q4wdYDMC~[yY'=`?],-;9x0{y_V66n5bT(N,:P}ZUIJ3zi<G2<VWP
    pr)왶F֤8[>|C{f=x+*ӝJP̗Ν>P~"Nmiʽz^weex^͈Z% lWUlnIHk{H40y<yܬ[;}$8NQ;;v!˻GJT%rNeeh\c+;oH9#"Z5W7Ip3<2<x/
    G0;*:nΎ,=Ȏ1#@q(`[_L?G2<s91\븪v5DW,k
    NE3<g2<gI6MWn&(2F.y*Ȃ;@	*9A|\
    _|!=fȟv]sCgO7$_dRrd*[&4wrHTixxY0
    gv/1p?>p78{ =Bh=mx~#A?2xLO7IjE\q@�#"`ɣ{hzAH?ոI΋uyY	,#@$.ûm.EŽc2oLΡ	?/xn֋|/݁'"I2bgsc̑#nqs6y <*-%g|cFJ4y!no7{BɋMH16;/:LZN:gq˚K}FBCtTlc~Lq,/''?Gg;@t1;Ȏ!v	>n[.@ ۮ;h*>
    rJ_7:cȴkQvMDYk3,V
    Vw7u_:vm&' N/b2Eh׋|ÑX2I:-1#QA!=CQ6mIy/�4z[_?3k3r?W"6g!KĿ!$pq?HVkp|p4dFqDbmG9Wa|,cq&ʷ<X>vY=OQ!"OVdqG9<rx~KρH3>=y@^D1StiE$'",$*D~RMuv9L'`uթnQh8pLkL
    Bcl,HzU(,bmIe-pt+`xGw,Ԝ15jխيXNilgh1Uvb%ïZxDiB	5<n<"䧞XxZQ\= a&cEƐXeOd7U
    ܴ[fS!.h8p
    9U=dpFͭnMpy͵ᨎs29gN`%1n
    2gLNdnmޜ*imXQj{qQ٩A+NV,Ǫ͜9keëhnt-.<+h	Bz0?&CPq,HUZ<O!@kTuDoLXZ_4Ys\=_8:vh6׎jkn9v[;jƙ*XN[`%gB.$ƶlDds}+xZ7M`JH"vfi0N)E~Nug!`v(\le!f|>!cQ.vܐ
    ?WHI/{ޝ݋'15Ϥu
    hBA]�e`#몫j-nIgV*˜&Aqk61$Bѐ@/YmJk*'W9;SKLJqMWpDFiLm~!)u'j7N?R-)Ҷ܆]]6%Ϫ3uS
    Bs~r&cp;~9y�|Q;/s|./¥8E2hiEtљ&B2ͳtN7*l!
    $5Ra
    9{qL;6I.Ʊ}GwfL̕eFjWR}rg2.&cBwI)bk
    ),lMKG.iTp\p7j)ڒ+5m~ΧRyPG*j9-6J%h4j)7J|p^B\T	$	n2swٳyqWtNdŪ[?猱987suVEihe+HMbmFh&ՓJảFX(2ژg\"ԜZ)-jE#^DWJNlxǔ)*EE&WȬVa4kis婹,(f	XZc"	",GBL	%zI(3mK-|5Ӟ>2:|(oGR9C&XuE0-螧_"d̄uhvb3Uh0
    2c~ҪFQqN2F�acD蕣SGۢa%(gٕROLdr|*\vZikLyv_:T{HWr՚Vw(f[>_ S/+mժP"Uݺ$&NdPKEzO~>uX8TXN-F)/)BR!$;V´5:9}4~Z(5ea,DBƚ^3N>m!,nQ0ҧܨ](-LXn&ZA,$$^޵PS['Sc&42mC
    $s%nHR'?%!sMgT3}VP=cϺSO={w.y􏬈}CG-ĺc[L6ZS93=WZb`4F7 D|X[\[]6jӕ)P#$rb9h9PdkAaGw\`g+L8ԩice|?:	e5RBgLL
    u9C͂c!9z2#)z"VmߛBpU8T0ȓNjΞCqIelZcpw=lw{9mܸP=*W>
    E5i
    vq:S4vM?q1˙|+2gM-THw4L2'39$);,*Ԍ;O]=˝>]?)5=2\cɶNK$fkqu3Oie<}{z8==ZvH{@VDPA.:wƜ=4;AzbzKydMfW9n֮!GHx/WՊ#g
    NaBE)SjWZ@öv	ũʘA>e64STc\.Q0P|֮<+&$/ 
    8H`gpYPیoEc.G}10K1S<W\NK$/Z:jiUN#Iţ)0bbb_A5zg	R+Or:)h78e"d%iӒwyC0H0D?p'h)kUDS,4#q,nO׫>q˿Z�*q܋ڢy_GadG4uU0L8ΕWgNLAĩऌY3}j<s62;u5۴$KqޑO}}wQ+pӚ?L-@95x9h)B8ЃKf(~U#u%08H+sm/%?r^VXBԂ>J E3foSYuMr'׎6n[۱Q;ţ
    Pb@PaP<"5(./0<#ˬ'& cvZd+YCxX%=2*E:[/ 	htq)@NDB@Rz>YNX}vL\36Λ/8(M_(#phHӤ"D6B%;
    u?`AXԸB|e˛p
    =:?pޕ|_ʳ,*k滯.+ߛ>ߔ>.]^{&F.AuqQx}uOwFU,nx%~%]%cy/#>gύUY\ 2&Fi|f(;ml/i-ؽ<G#0ҨL'jfuYh
    =
    DOxd[l̹L3oLrsb?F>S(ٰ`TuKwQjnfEn!.flU-[g6@c/k_	1z\7+ 9QBPHS5S,/ay!1嶡rBȑNa&¤#Z^ۚoN3شi3ZS>8	katmGnǧ_;PIK]ԲvfXW)]O=U'
    `GOhPQFKv?\ƿ:U;UbjгEX~v/Yj("�gд_B\S\/NJ@v
    I'
    # YPBU{?}7O>ke]q<DMg237gNf\!Sӫl!
    s!`l63;Uy5:Q4kbrڢf!.*9YT9VlGX2VlfcMSJ[.Ud0:qtmGz;rBJǬjݨ ;bQizT4˙@,+4"M:%AJI"b %H*nZ\-m@.\|4gGi"^*j,>9*UN
    דzza礇+g#9b}7N0ӼauoafSE(La
    k|ifa91Ɨ}hyo
    " xu7
    ^ؼdYq�Έs`pH>WSs̭޷u|6_>(,#TПI~hi/Qq4$!NǻyKw{=1Ò*JI xbT\9TMVYs�-0i"mڢ>_#y{]"n"2l̮dN_Lsy3?٘l9.Z{m!%T&̍kԛf#Sj9뚎+j%FB�W1ڢH|$$?pa}0vl1GM/:s;w3T|jwIrΟçҋ{ފ4�zQ
    a근'G$D^ں[f-:J}_7OtDT$!r<p]kaYRkن?Eۅ `=}]I"aRH=D+�ߦ$LdR@�O;!h:K9)2`;"C܊AD|L	zu==0C,MjMxMKA[u(^FM$r煺 m<'kXɅլZl͈?V
    ^rja1ZR=Zk\,E�:btAF	9:7dUC-yゖGi'tSY6a4Ŭ6ֵJ)\Ej0,'~EI/ODI4!!p>Y}AQD)I�GÀr(̹f^3%g!Lff/5b4
    s1:[ȏv-az1"qH"Y $za{fy@5G\m4|xQ8U_Ч7do]^eOb8S{p"<,_cxBB|aΎobVyA.2l_�3N chi,
    42k{=iz䤦ϜKD1<cHavdz'n;Hqa(̛̾
    d4n9dj˜Xi21ެ-f-SxEVmjWd)("\OKFa^%P2"m0(;@/0O&
    UR@Qd$819Ix3$d(QEQIRb
    1,_D}	DrRYsxcߨyꈾd#9k2Ѩ35m4: {l^%5-. $2SY-9gbS�rl.d`F"Otp:7p!G1,|U׾;0
    uK&"/j}i@BB!ztQPJ%)ecmPĹm_J'-9hi~f{jړ_J7jtdgI/rp"nyQ{_?|wok/|G<5ߣc-d=AJ;^;V6ᬅc+}`d>,B`(4JVnv(64jY6k&Aj9N"(Sz	`TOt*
    b$kA$jQ}Sx
    sj@JP[P8;dVU^>&
    #/ֶzr0 b\/pk%>٧@[D1,�zj15ۜB:>[=[ϟ:S<=\;>N#8u4Pc%2LN{ي[q.3Ms427̙â 5
    3FWdѶ#O:J="v}-i+7D*�ءzW
    H,!=Ծ*q_`P<{JXUw6]t-`qL:u}߷JQgmo7
    b:C"r>ǫ?{S)J!ybtqkH4	ش劾D
    l5׼Sla_Lw\u_(t9)Q4-1d_ըIMjOtLF=,sIg+	.SR`jA|8@D5CDUJf
    G]I5#a}:9B:JJt c1.cn�#>w4YQ%_`9j͹t/Ջ\6;[gfն-
     _7nzrfNUsе7:ђk}yK-^w'8Q*ysզKmŞX@)a/4ʒ[L-RLǐrJ!|O&S$m;>*
    'fFZuL򊉵{m%3:M3Vu$7O/xWG;=!JѺ|4pY㦯/5_Dm⍿aiCFYO3{P;GWr뻯r<po}r4H jEĀ8vRO2.|[F/$Q))ZlIx
    }P֑$D(@|BdK8;cr>0Ia?9#Dl+TJ0$ևG�eQL>z9WϘjSSJ\,ͦ1CJFڴA%4N1h:fZ.kN|:XrVY+OzEHDlTޞ$5״)ὁv"M>r
    y�xZwf$Y
    i#^`޷< .Isisژs}N{j|BjSfHe_#|MEoÎe>4X}+ޤZֲv8rvD5s0пZմ(IL7FWeKp?ul񯮹}ZRO=O{a<|ނiK/)r"Vkl7N5FRb{<L
    ]ml[E\I+gڅH]}Ņkbv:k5.{$Jr]x>bp\jYar8>|% ^LB
    La:E �
    M$1h(!nE,:7g4Z\M=,~F@ԂzV7y=oe>dWp$+5L
    hL_KY&BDqˀ#iA$Wy!w֧ ]8>eu-ڞh{Vs=_kçNEQӋ5!)-޼#_Zc);;]	_xeӴMHh3[g?y[u%.;L3Ge'J?}>tsU}@(h:.)Tkڒ>8N<WC^O{M~_k
    (kvl	LJqCoY4L.'pbeKz|+!D8Ltrmׯ[wp\ɻ|~&sQt< (X8b!":+Ċ@	鞑{ȢAHllV2=!^
    Cnpy(UKxX|)!4{CD4<Xk	;fO5
    Ts+�'o[cDL(<WLЪxRM >_,tɕ
    "4G%5[ǛwY=hIGHDHDz1US)(o}#Zc-<3]v_w<9|^Ht&+mA2'♡Y'C;J!z`N荿++4E9V# &$3;HaP' w>(#$`8?JEgBj.NrjNa]|w{-ݰALKN'L3U
    R lh~G1UM1b.&OMŰѠq
    xDبLP_HXpd-lҴ <
    Loʑ"gƗhI?�Zn*~z
    ޫ=1<В/6ȳCHA/ B%J&S?kJ3U!'&*[":	9D*eԊ(Z)VHme}WHa=D,bJ![DC%._m[+%WU\!ၔo4&J/$w}r}7|!W"ʗ4y=p0�rC~,3{cwhO}Icw𢂆aa $k/1Efw"il)5eӤf&O?`=O<sOw|4#'�yn6
    l̹v?<3p@e!{"7^ILSMy4Ie벵`dg+)be+ͪilv
    ֜&Ƙ*Ě:b6P(|/(6p$G"$#[CHcxo754Zw @`bY'/k_4mZSHn'L3%/)M^[42E:S+)Vqo�C^iA	!vzF@Ӳ:Deo niiCZw]]	71/^M2Xa/haPS"ڔ#:W_E&3_@Şd�bFNT?`P>[34d	tնpO*E+]ysޛCt
    .uU{<'ɋe\ca>im"JGnZLp?X˘DvFMBr ATM)Q_?vmrK5Ĭ5ac7aINF@6N�lKo84U'dJx4A@a# Fь0b
    	8La>,8#LIlZlvqKɛ0j-/|3uokW7_Ug֋_$, 
    Ax#=PO[ő	{?-<-ܸb!QGh(Mϖ(B/sx_Pm-۾Zl[ɇECC/EKQVjH@O%՞,"
    \Aon!Ў?í;ȸr1tdX[ߥ\W+ES =uj&3"j@>{-0յCT+Ʈ;E
    ewחz1^I
    "fa70,`NHpPY+M
    嬅E
    TޤDlm-H4V6#R;sxCi(RbIKm2?n$ctȷ9l#h$NTDP@?kc`*esë~ JekWJ
    ;Uvw8-֬nز:az(6ef9DƷw<C7:<gf8v/|G<)'Ϙs}Zu0"%S'01]
    0a!E &֌e!dt�oT$>Q;sfj8bZ	Ql`tD;LH}8I	]?;xV*5ˮĹ)>[>sL[O6㧻j;+CߗdvCZ8	bQ?>
    N
    '2vu�z	3҈gyqc.kGSx�>m%Mj܍X4pObB]Sa aVD'(Vjp~Y-Q}JG
    mim$ZCa<6&ִ0%ty�I
    hӒ7h�>".[E]'J[J}?tFDݑdS\;F:ߘH哓 2+М|W|TahLO
    0F$Ad~ʉGMqQi@@ۊ:>&3HJw#
    Ҷ`A^ZSͣnD/2(e
    �{+B9MNԶ B-zHMS/ƴř=H9ndՇ.^n_4J7%I:a̭FhaDE�=:䙸i=,6MAW@Hkcte�S717ý4\$gͨ/jiRPVԍ*)xH4gYng3)x�-!bW`Y d{xHш>@։�jtÏA2a�LF%<d*H” &ϐ1h/|&B\,%l;2xB(]~qYr%NTDQ XMgF	hZ/\~M5	w&"jQSd/V
    m]O]O<IP~fB j#K?S]UWc+?ڪQU;={SA$$ E{\C-)Qby"uZo fz0@fKNlp:^FݘYT=l{)
    ȣY@o"&FA1ܟ
    4g1B@J$
    т�pXp/9Ӕ.N{wؚ=ܗ?](V@N./ aV4.#�
    #\cU4tU-;TIy! )A"QʔP쵛NGL$X2@(P-1$&:qdR�D2�
    -Ad:3WlK7$TK<zbԹGO)Q_X+N:LWYbT衼K+W|𜞁(F/?22`wrW㶡p݀sgxzr #5D#?7O=|y]*` Zp;||bX7wK-,
    Mw@ֻV@S9LX:8P(ۑUkq`!ZrBqxĕx 0ߍCmBjx#N{Vh @i^P"y|GwCY&6SO
    D
    8	
    U
    xwGEW*؆6)rFqEll2Zs)F<E^!JO-,	
    4о, fK,D`n
    ։LԛD$RHBܑgOl#Ϧ12-L뤜IOQ=_KA؍h
    (boZuHVLމBL~pE/;g�<=msb)9fn`"șGGg'>'". @1pq>׶R*I?05{ˇ'eP#؞V8KHFs9psw|Z/re}	U=pג(/J`ErTh(hny$\#	~>%<ݻsA~
    
    $A"<JDގDzK%_A9nn.fm15`5̀ak.6L0G}b�sLO45bk`犍"N9OXt6[seL+'88abi~@Ye'_BtiRAm鋎LQK;!^¸$36}l`tTHAP74Wvd@"P~9v$98G)gΌQ&ʞO;NW_+އE"gHwq	5mՁW~R-3p44<o~\=Ro�;168+D$@2Z!};axdlJ]qj>GIFC-ьǢ
    aM=:=|]Ia%m<^P_F7?nzl%J;_=|o5<iݘCԉBI-m{FM	R_GFJ4bpb/Ƨՙ&[:n
    =4h-[|_F_T:-8<Ѭ4
    >
    =!:@B
    :GgJ2(bH*`V`uZ!YCЁ&O4j76I|fcB�bU[F_i]SKBрDŽNzZI#!A
    :32p0 W+_8mmQClP>"j/x\Q{xvk>‰N\}qd2]#5F�muD_;7Ox	7g}\v#fa"fIJ]H)XM鴖D^dt^bwq&NakT8(1V`v?LNa1I͕Sw<v&8igO8QڀOB)|
    ?jV{T:mx$j}<+ێ
    |Ek9+Z 66	rE?-³}bۻRJn՚QoXHT\'?�4-Y2h;!P0D猰
    x$bѬ̍.͸x,@5Pv	h҆@4P0/փhz.&HKPKZ5W/)4I2:!%$"h;q&T,q=H_5Ļ$juHU=]Ulfܸ`\v-Nk;;j&őA7U ߈4G33\M&koOЄ
    :H35G_ªWX A)ɕY&;/p24Zfh1%q;lՐ5ɮZm['nO˥OZ9$7+~{I2C;(^'^oZه>>	ueu':r&G@@ZNx>#v :"moIĝ#Bq49C|`v"qzŧ?¹2+z{n;yqWMX`NcF)J1]8
    M'<?Cd:
    7;=T6ʞa֗D~0stYxiZw9U11Md0	X'pX@xr"�bh�qPL%)6z5qOZ}Vk܈ʄY<8Li|>l?RI\5Gjx�qrN^]U!_B[qT$WcnXj,Z<9Cabvbܽm-B"!H}MYIwS*kq̍0S`3aSz#=fy:zŗt:QZ{BICѣA%Vg9S^vvn|Kb+\jZr'vF=	$$A8awv9q0)XVqX͉ƕ̲K}l `yZE99kAn|x9Y|fA:uT{rJ젲/DV҅<+w0N�5E3HP(܁1Fy*:(C%QFI1)<p@aU\d
    VgQԝrՕ醸6J_6z䴾l	K~5@ړ]æw	aJGD RBK"!5SՋj=#I ܑQ/fw8T
    Zb)BHK#g`n@*]4YCuD2(@:J"BR=RzVD3pĊ D:@b+zVW2Ip1NL0zS/RoJBv:l@΋I+:i�=-@H|4^AO(0CBlL`52 U#b?H&"޵yi[Kwnb0~PoBl JV$-�ȶߐx_F7򗳟*5+/#3_~|6(|l[‘ʉ"kq!#uO{EkяMԎZ>yp͜=2k2"7K,N8e̎|[[l>$wW1?bePgU}73͑%%2 X&J9]HiCﭛӺ?�tL0Sٹ<Px(ޕ8/y
    ~]2%Ή~M~6HBS3G=+I*ȒqH^RoàU
    u"~h/٧N1BNAٞ)vHϨ,FY̟D>koS@si0r9ETWI8_0X8	$H/(%xҚwcJWnzgz.%-`M949ܨ>ɩB~B=+HUT�0H-zh<wQ_uM[vk~7;@uv넜kVёh2slɬE_7LcZۀ>RFXC(&x$,[~U+02[CDe#"dU)2
    iE'ABhlAYE=yOrI
    hc�WlVU0fK}F?B۲�W9zCKT&e؉S㤵bSo
     Y= E+dk{'mr;ADCmI#G;d̴\m&"ez>4"ކ!rVC)y
    ZWޔ	u^'%~S
    :Lpip}Hi~@6HLlRo}zjHsjF8Lč2vg7/h~FFf24k04tØ5&Ks)Sг¼5R`|9-aeID7F;�pB0	υRp@CUU8I[Jv@\-LꄼNz
    `d+
    I݀B[gk4IIehaꁕ
    1T\gtm(L~vF)?&YZꝱ'(C}A6=5AM׮d*@馺I<O,*Rzs-szo#E/Q$qsaA
    0a]<l&8hcT)R!ͶV<K
    9.b=@Ϟ3pN(5ܥG>@9/^"w{N>qwT <"$a1Dž@lgc\=cqNS=V8`5p]F(mv_0dCgZ]@.cgkFSŝ1�@ze֜POdVTZZ-h\3/ԦWw,*'Z]xg7j4ۉrGAܷd
    B͙u	R
    G�H]?^-1T³]Щݤ>gj<A;[>1[jS&RKo$-MS5qXb$<%NWK'<
    :bDx1N}#چC
    M4X'*Jaܒ1i!j:mj{KO$Qb94w!zD~)?\BzTATII/'9EKM$*l,ػSYlIo)?is\Tu`G`L.VFͬ7�gB*"9:W#g'LTc0"¡љSg?8~jqx8:U@4jݗ~trn}tnRa@Sձ$h*T-Ic	)g̝T"CѰIH"�n
    CyKIRK>Mµ>N<r
    
    Ds@eВcZ!Io
    .3I,H]%'*DAECx-ˢ6nKp)h&Hu`?֨ YN(>ĻpB-/'&>ꥼAwC[HFr@ۨ{4#B&yWJt\ 9SS#R;ݴ* 6hw;@q A1Cv`o`yƞ?\؏s”tm[""4L
    y&=QYW3JPLZ)m,3Ŵo2JRAG,Vڨh$3թc'#	,(-NjU܃ZQW'Xюv^Ӫ1O2F.a!v`ETz@v|2x["A_ݎ6	x8ׁ#u޳'7(zc_ԁQĐhH%|]zLuA{=N3ZBK=d{K+<总LO41-␥_n0
    "B-Vzjšp%nijPM$ݳTYs9ʅpnR`T<%ŧk�c&Ao Kx87Ҧ}ѠCB2ȫL}
    L[CUH%GK'3˺JVT-:7=;)/RMr^e+\%xlݤ(6j^5j~EH%{1/ 7Mn!+f9$B	|T1Xm+ڼ({3PJx!|)c2GiBu?xLzH8
    Pk镚u:ևqLUlM۞z/('[Ǡ=nD=sz6L;r>|9|'#'|뮧vșggr&^0yIXS_?E/k~잺ט/v1Sz%^5eIlҙ˓DV}K悝Bjliղ(i[S! <#@uֲHa
    aT!oY~^=eëp'-rAl`<ҲK#i8s|Bwʫ/~AvϨ-R|BtsrxH8Dzے煹:~pv(@Yx%'7WZt*2ٕb/O4Lf0܈S0/
    H^[neЖTGW{(l.7%tJXd[VmqV&FTV
    4
    z:Bcvò+s[ =
    xq#<:sGP]'UTSkvndp^m_
    YC7˶քܖu
    yBq`)Կ]&Hā*ˤ4D?.ΡCE$ֿvm	s5ʚ+lgb\<K]JϼphRG#4J0Ɯ/J߀CDu-oRX18UXՂJeK'W,_6\QP]τDtP:6pl?6=fdќ{Ad@Rl/s@mR!V)nϙ#+O `%HP ++$[/
    `[VD^UG,bDD"TI�.}xC\Ѩvv;֧6mq\oj'#[6Ml
    +ql%މynp�ݴq`ֽJpuFҬf-!C}'#!j1YAUjUƾ5†v>	w.ո[1Q%!%M Cw(ߌ*:庿_7k[v!bj
    QY'!Y$PbIR9|~ǵ>.
    \}WC_
    + ,D)sM˥")qҋYZxZWdƐx:;+>y×uYB~:iA>8r]l<hdM_P=08KPT_E7>|W؎}F2B20Ox'vdmK؁`T<?Z
    
    !@Z2
    YfȲbiT}c[F[|Ù>`
    Z:"[wtQk6oi	[56Uh&�33MҐbg==c3*pڢI+0<k#[:^H99;Ъz'ڱ&4,c7WJDRb|}xN[щ#wnVgpE9_.2?6>)v`XxV	iժ.^0Bǜ;}%=2
    mCLiF뷼Y?]RAHkҗnwiT%w	'.>Yc2\Ŏ]~ucW;{hS_,N1]>_WG+?yGAoCǾ*?@?+:/i<B}q}fv
    NEN%Cv-}oY=Cl@�{X3?c=Ifpԙ;W>`լ8O.gT5*Sv ŷ(-zѶ`FM*wL,�VOy|	jFf
    ڷtᦶ㫶'.>pb9;|>CeAl`us5,%4Zrtf"qΗkJ#7WkupUf}3ܟײfq6%0PVUBa7'-$m׷:
    rw0>^~cZmv&IW(Uun%#ڻmc7Jڝ,Yz3^$oDLlDط+0xMvtGUOݫ<`a=CvOm;] .&R`n]/6~'{pĎ[{]cI/sGGoEV~($]4#`wv'>9ʼy~άjI/nۆ`֑I',@Niva#ZeUniwÿLe^{XMsZYo3fO>-og`;7YavJSv=/&ݵמ>`};	X+'`\U|\hJ1l=x|Fp>`4Tʵ,g
    ;/wa0g|wްcI>1ךZ^\9OtLJf㶣JEpĥU�F5q�Ǘe(*W+"5}}fls3J3*GeVE3{$ ?Sd hMx*#'GIlNwG_쏏.@ xfk#@V]csrkFe$<#gxe8#ROc֭$F׹p)w
    En߱O]?]lN۪໾'sn w^?^8/to%	6\:S
    *ldsscf?̉|SYw#"S]]+ -`ԋgAcwDf`ϫo^|-tgBo-M/
    n89Y6w}>7;N{9vöLqxi
    ls{V;|?)[ovmUASOwoz7cɲY[BNJơG~ςw8mJrCk`.M=n2yXþpT׭xc$U(͋mo6st̂{x}jBcnJ("GP-=Z8
    u#n 4]Ǭ&
    (ŕ
    FU'By'
    1X̟ݲՑ1ym:3	K[,鼅m2HCCahZldd.Ք3={80j2jR}`_߹ Ao4Qq޼Wuq mfEfn֝8uݔ/%Kqqhu6@9v0QSa%#Y}5lp׼.GHNJvODTpЅ7kg;S^8f՟.D=᥍ޯO _+糱,iηv~pq?$4'm!&]ʲ;X*ef#Ɓ7>(m~+f4@lE{ߧCo�9を;W9g1fO/M甀[`c/T֓_7JjwqTU)<̣)uw}>T m%&%,pS]bǧ	݉nj*:/Rb㺡;*}=x(ǒbA!Z0#/:
    UC̽Jd	FR( 1tDq\{|ӕhEx"ʵ*D!t6F\IvE56ŊCVL}9<-ړ<3en73xΆZH| B:hY2돆n[NҡVT
    {!n+,.5&2H]H?sN#~&ϔ?*|x1بṰIg9VmW^SZtm~,7k V#Q:!IvD⣨Iʬ(x[Yx;|%eOny?R(a酎x<NӾy)NI0AduƩcI775JŠwҝ=d/v0);?Z5g[ʚOcT7JqR7{y.̩!m�ҡm ,g33Q&rХAxopV rߚR5@Tژ/ϝ*bC|Gs&?m4՞^m{0CnjbC*2kP&Ym~CGn0&1p_1-dUچ䖑Xbaaj~̙G|PMYҴtTRr;66	\Jrk{<b\&Ql
    D=/839wAu6uKR$v+Yr|
    MJ,B|yנ@A}>׹Bel۬a&[q;%EFb
    -Ck?H(k~ՑK7)tG	aiЕBs,b:N_M[.T.c,.0m+8E
    GrFC5JA^D8QJ֟@e#'Ʋ8hUb=ʫ>y`Ү�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������׳#xlqJLۖ}F4~©h:qFaM\|0+lC>^ԂOf9
    mVz.�ٚ]Z+lQjW7Cݏ<xS2xi@)P^ӶH;HuEWCEh-U{"b&<(aܻ>(R"5AF"WQυTv6ȡ)B욟z䠧Ah,,p
    L0_<Dt.=>ܰgW֭By8dtȎ@1VuZ;=n-؋c&"XM`=xir8gsR8>9@d4_3ku7x@.3l۪tkgg	⣰y\0	JV�9gҏFl\N;n\	qExZMsG)䒱I.j^\꺀
    _@ n~fQaYZ]Zs<ۥ< KD)N
    MHMR|	`qixq.K?/_Һ`);QW@d5
    ^sCn#P'3yGP\2ajibj>IW;]eq[qne̅mzz1XU7D7_`zS#SCPdn|];mړ{tAܽ},sѱx",fb8}W4W
    9QTNCj2@@؆5nR&}y|eY
    vaU }}W\֗
    )�6J%iwucOP8<T-!^~2c<hj6"
    ްtThi+6HD3)zqVUi:g\?<yMg315R'rV:p;8_!&90eW6ϴ	ek	k1<Ҹڮoz
    k7w'}&Ɠ_l4R.͌>bChYM."jin|7o(;q{n?1;7	$?BTh>i<j7s*?ptQtުӱAIxxǻaO͎a		>yߧ?c|NPܘ?% c#VHFyzqmV8)` ~YVȗ}n;^oS5&Dlw̜8];6}YVʾݣ-wF$_8T`Fr泳IZһT:]F3Y
    R0M/+-ӐP B!$#HE@5}I`kR0(&G@PZտ"$F'J+Xleԁ2;TFvÿ4PR(Vh[y`ՅusLUNV|#=tV&db0+&amL**2Fvb5٩[<ND)m.tWJ$
    =[n 2'(kF@Y| Noy]_TV!9DmWfemqqEaOݫu]V.pL["�o܇H,tAsIOwGoeu[A"/ #
    r$Yg<qq._NyѥK>"<)Mj{|Rt%;ك\o{5w8a5n|52M`E?y1K\~Uq.x #{<zqjݹCʖ63#'BM܍ם2,.4lX38	I@!}2zd}mz`*\۱
     FcX">Q_eJjQ	jZ0͞H_-[' <$)9ÍA(<FF)ɲT] XFft4pC+m㧎
    
    "[\W*U,uWv#t_}ȥ݃G;gt{SU,6_kX�hإYu$!%lQ	vBN,VSoWHriΟd^nFt 0�Z9L^	03JmжKgɮ)ⓚ%Ԃ8VJ`<$'94yW1GA4Ыbj.̝AE̜KAm%$ώ&�%䁝xA5#v#H!,+1ٸo1 	KEdRR"̊Ծ҆K,f)AńQq&f͚?йCL9m%>1�B&
    +F㻘ݛ-+Z~Db[+j!^JkW~\Xt%+ܑŅ9>S6T<r/43S%cu}7y=~"w,Ldk@wT<3w&\5BEegwgd QBa4@͕}4Z,-_Nӳne|3&O&c7\حHw,͎Ώ
    i
    PUObWWgOjrU+/k.cWmpfM`å6Oc{y)H2Lb<(\QJRKN;cq`ʧ=Ch�9SJLGȒ̗yhdot!AxNg	.ѷVWLj/fJAlH<o5ނjӱ(S"%	!=ml[	xFSªk+"WG,A_(oy;!>n17j{L~_F95w|2x<*zMbg
    WO_0R<~*p[b=5MWyTcɦjGZlF}Cφ:�KW
    ;/F"_TWvS} Mi͘⟪E!F	Efc]fb@EA\.l|({`+uKisÉ@e;:q%_Aws~e^Cˏ?@U
    ~)pvŻf7_^gnWyX[/�,;~L>+5Vł])2:X<8#Ө`ƀnĨtCsIThFG$2KDbI߸xQ&y/Rp&^JpzFu2i>o$
    !ci~N2i$"=&Θ9 Dmo萫7(D
    HM4z	zvy%'!/Cͦ;yypmxlyuכL;宱pP]9{խ,1IR6X[4)e_C�6aS/|e&7Jq	fm0XSL7\\W"U6{zQubФΥr9hqkz{8][b!tT¼ofwt]pfO~Z�<w}Ӈ_mkܟDu+_Vս[O	m}{W=^;ӟ_ln/~sv/]f] O];.w:k-�.]3l=&'L�`I`Ɏ9FMszg݉?h�qM(=	Ld3֭[^\2Yz7JdwSOL8PM9/0Ӏ)iRvUDR<(U	[tJQ33bt#Fˉ~9|zXk;W!c;I'`u-OxG"zQߍG%?Nr�R<;,"LK+F_vFq4{h<0rWW7r,Ct%h5ODSk!ӵ!G^sD*
    f%ƍ%Fg�
    :	WnEۺsÏfV)L+OݞI41us0ppeOyEꆰvzv+:ا*v,7εrctop֝8d<^Kf骉>I	#9eo-!aj눳I,vJ;w=W[gtwӘzj!H""-_Shs!Iilw)wp^_l:qRO	y3^Aq|6,ΚSby2Œ͙!vf1DzGR.S)9,`ta(m:R*;o~ǩN΍@̭hv\qA_߹-;G5~Mҟdl\I
    B
    r}+&FaT~m)%InC_`1|x
    zUEGZ[\vo 9FȊw^Јt#k_y~3Vn%k֊۲ܓGGcW7dsVF*\վ<e{x7Z6]:$50?N#?
    =
    g1~GJ=C+!3K(M$hނdzqBgF6L*{fӸՖ{Ё;/4uVʙSsz_zG2Q,1cb> lV'6EϻuؕK:}C+uxujmy'n3ۘl^}͡NlkPېF\~X.'‰v 5ԕgrF{רTK]ճS;I?{Ƈ2j1
    `O֯41;JtOE^8mB3Γc)y-Lv6նx0,Jl!t7њM}KeAM}X=6wZͣU_'ՠoűy\=xxNamW,;8X7H)}{Dd)l—g%*kd,'!!dN|C)',ߋ+SՂ<&I[{hܤc-8"o=t	
    O5f
    3}|Q%kuHژ8H}ߓ/8®(Pl
    U'ǃE	+һ JveVEdMo?;{wE"[18W꺪r*
    n聙X{O\Jw`{pva#Ky"ԇ�iOzp'}>-Ĝ;.cт@~)Y7>}j{nMloj[\۰ѷ}ptD=m/med$uc
    [Ggw+㛱[ȶ%K\&[ܶ:AaSޱکl3QoE-q�eFkTjU`m7"	*t,K.LjjV
    =?F<2�캦�]m̊3s\	R"E4&A?A^6?3I/mH_@KS2iJańr'oLr$鼳0kN=1$|k^Դ=_.e5~S_66_u46]9ؿW5{?xWp7}}fu^xr=SF4;}3?uܼqkEr%uUCiWc>h-W&:=2$xhuda"iHBEٶx
    9maE+A֬VH@08-v�aF" H{
    LbW,YmL\cq9sCdko(/^ͅ
     J<}pGا3]G+O"[_!zހ4+3Ιu	Ɛ[Ŕ:yR8<噢S=՟}J<xe,7,@ICa/mV߬e"OQ	ٓ=%=4cŶfnK	_yl!~ϛUƉāOѕgZ.C\Ȕ2xɧiuJ3v|h~Mn.7۾ud>qyI6Xة+1b3 r;my̩ӟǧ06;=W-V5+~dX.)J?$e:X.T�gI0bIrV‚c,Xh	=zmP
    6;Hm^pN=`^:RzV)yK(qT &p-H"�ʦD%FCGk'mZ[zdy72%~.>~Z;2kŤy^
    A!4"3q7(,fٲ[=b?Š	Z^%k>Kv{yeMS
    k6P|OM<]On_2$vmYoe"rp+D}pN�:`qD9:/vek5R)ƭbfOqCԽEAE=p}(_YwIjh8??oƂ'āYn?BŽAM6	;𡲙 ޲PaL_d00NH}jNpz$2zHhD
    =BOEzTA訰(	GFHJpf3CD]m" Q	cτ
    #(FJ*N|ɕɵq!Z.bpʐXTQ˯	mWLO[4=Ork7G/Q'GK:Vq<Yhuv*
    و:<n)mlIK32~j{xR6cBd8}/ضp~Xvkk=EvcL5#-o_|鑓KFloy"ocVk}4tOTJHʌտN>z"Rkc}IkT;bmzMY_uul{_WRv;Z4V湾m*_n[.G~(NbY'}tw3{PM_XfJ1X[ĒYW+@Zijhm^UUWTJUV##Qv&WzKM2CF	khiM>t1H lx>|C+}nԸR)�8b`;PmAei!WU7/H
    DBB=?8#1)KRWmW䱃ic5<i"]-3O0`wWtMCmx➙7)V6t(=�x)M7O#x"^?Np)ڧm-knxoK=#$	
    CrOu_�dͅuюL䳀ZyVvzXtcS"+8up<]Vd=jFgHK%^]u`=s$i+͵?f9#Gܙ.qeFT9Mr|[@||p.:8t[a`ubpЭᵴ#咫/ݩYLPpbIsC4;>喵-ZidL0NJt.
    La :Lu0LvŰWTtȡ#FY3t?d'%wPt<VBq͔
    F=wǻ:{ȑuR=خFV	a;;%l:=
    5tF
    0	XV
    'ML=Re7Z?]n8]lِŸѩwͯ|թ%ʩÏD5z;>7wt)=ux9x_+yBiI )Ė<XäE`VU>lny䔁)wQԲ9:ɎqNj;|n@XXCwOf߲+u]0/?݁j-IHO}})qyǛ}kk$3-n䝎/`na扇ӷ+o|X@o]Ɍ]['bOQN?9̑@q'L't_erJqsk_Gn
    .t:俀|q;M<\vK2չ̴0=c-}mnV4*afDtU`-;n)tjA)8
    "A<H,	%1�bGTd:.+HD҆aQp�d92eE]j:qA?~|S[xnj=;DW
    W"A@S-(d2T}N/8kS(|M/t}_$dzF6]n0{V/ƪ(fdO)*[})75|O 8ob8Y w�4s>/n`Cto8b0Wa)5zP{/o5Bc&IBΝ61֑ٗ??Ŷ}Sw}`SYb>96]o2C?r]\n9SO{]u.J-qRl	]$oo-CkgNú'Bm=BI.]]6( glEX(P>0ٷfG6-ZV<f§IjZG��yA4&%/='D
    @	Ƈ
    DY*(1pP&y!73$0\vkWa>d1KL\FT芀b=pIҟhEwFj҈5<Ȃ:n<9\=M4Jo+.pqKWp>kjS%SqO^/9ee6g~om7K?#	\e7al7oz6>R?8/x{@qgk5H
    4RNu߷՟n1xf6r/>e78x3Ǧw6g%/B&SNm7fUf7}ڇ'X'dwGN_Ҹ#ZCIh]c0�ZU]HP_⊵#'ĸ?<pE@R*恦|Bf(EHH
    ~+⑹Rx
    "J$<yF
    :z˵bXoh0�A-pǠIRiD"�JD!P96jZekydɊb!?_R֨rD
    ٗ,i~RS1|QD0c\-ki*}AF6x"rs]rtqfw{??Z]xeE_^UM>WCWoߛxAe-e6s4AF_ʀمcw'^Ld)_ЅUꮯ`Ůu\rũ0-UBǾtyHM*+]3ٙ�G~]2k4'	v\0jjHtV3ВM]\�?msQBԿIĶs{칅
    ťui{-;N'pAK>BZv
    Q^Eq:MO9]9yz(H#Ps|UkwF|х`
    +6D~9U`MFA,HTtLt:/aN-H2VF0$~y4Á1	F{ÃB]zqqwgz
    21`=~ހoEnMD6(¢賂6.F$7B9srQ0l'q=cѽ՞P%5Ly:y~ژs~wLxx#N,ⶇXT&6:SG-Vb'l}+Ͱǭ#&Peҟ+E`\z3v {6؂v15%3($B
    kl_\{#Aaak]' MViM7 ߥjDNIBNUl |էnn\5>eS_|Gn.yg!y~;QKqʎk~Ka W?V_U	$1e[O6DG4RНZ},!c/XTkr,	t5
    G�rl	&6Ɨ-VfP }HR
    V�t.V,kY�㛈HL5Ԅ
    
    /ʍon3#SC.n.51�b)H
    WvJ0>}ˬmc:;B=\)ҕ&:sRPҾ
    ]6?Y=Drs5†(Wh$6bgaPv9ujWG>py�e'2()_z~2.^.+
    7TEV#~Cx-y^/0mm[2HIѮ>}BS?+]~?C.>؁qmw1KX
    k&zcY+b|)gDј;j<8;7Pdډ_{׾sF>qv�k=$Jɗia/߷fhoK>5k 	D;C<r2}pT!Ucljp,7[_dy}Ԃe`ͣYILUoVsVwϞ&Y^Wzs<ݴϔXV6V`VFY)i�|Z@W*4C/O#'& 5t
    ]LobC;TؔOs3`Σrdsεm#"B"|4o|
    vsLtc
    [IA%zѲ_3%`h@Y͚s|{@EcZ
    pCU[_[c	oSO3gQOh[K)T0_eFdo|!0g6N:D{|ouᅴXq?aV_05~ه@wcwfKfFI}Nnӵ!bPcO#?[bm0*5S-߹i?�D/jf}wnivzGcwbčt8Ckf_%טfM\|v=<x	k=d>{!O|2̯$$-a/c+E7;oO;YM;fg�O4~*yÙG:5?4]˱
    d		3:h<i8"5߃m#Aa\h̤Γv}Xj`n䱉p1=y[[EG(,~妜YPVښ[b;CVy>h`nTXReY(-3.%SBrySI^2T
    820i}2ce1@HR;p-+kۄ.?𱸛9�h:gaIE4r@.m֓%dU̓lr"lG1aچ@fG1i#Hy|ykQb+.dCO7`EF*蝫zs@І?c$0xнq7Jt5~`+0|JF.xFyGJ[+v%r2z 0;_7K~>^330Lȁ_'90޵x	l+m_|E|5Н}U{<f[NԔǏA߶×<Z$
    lksTuq%c~(7ObDžҘKRΰ8mP
    !\Fɇ
    n(zG-Hm|!
    '~WGAC}ވ[	#�".WSFՙȇf2܁TvB"9f@KV2oK+U"ζzf*=)5HY<}=
    -}XH%G'`:&eog1Kh&Ns|y:@_)jMZD¤DVUzp|D<Yg.I+AL"*x"]%%�>3 K&@5)ȝB#Veg}|*s
    v浑_侽wzY`p U@Ӎ'rG&c*j
    %YGBWv.V'+#࿫;D0`
    C;[BYƓ-HXL10(>.$o N
    ˆ@zA&R#Z,60b;ccꀍ'AJEU &aXZ'J#5Qۻ/BʹMQڙ:2
    oi>
    6-\]v׆w"\PN%0Ʈ1(0ٜ;2 [p(hslxiBsA)0
    S#1t煩ù#<,	<upAm~zFtYtSsGvIMҤ--.	,f.99V?60/ʁ(6@ x-95GMzYoX
    Wu%6V6&L}XP6hvf&; �ޞ|7pqh$m;[CgPn	:-ԦgV"OV_su-d#PKVܒ8`!VloBx#:]_;O5.[Ro
    l1,Dۊ@D[Vq>s dI
    FI�@PM@+`P�T^m5�`|YЀ
    :	B*SZ8ϙ|@4Kz0gs*Ҹ7D9'@F%bd$ٜ'A/n^	QXRoYlg5Ykj`Y@}z锝Pu4;`;Q;wer&V1ݖ"Ɓ#4OqEh&RWP^uQ屔Tw9;}\7}A-gh>'KU0;Pw.XHCyПXӻp˒ϗ4)sBDͅdlq8Wɪ bCDFXPD9D|ZXAMTH5zrwJQrj m[W7ĸP>m@	baMELN&r>.2ӧ絅־cп*ŵg[!#X00"Zetc#42+V1og@D•^zH7ʀS00HI:.t5 T$aq_[ 2Bfi-$kR0:sy*@(c"F5F9[-VD<k͈R%oz4{$ifuyc~JD*׉φ`9	!x״S5܆؈\2ϩvN%{+#B쨂>&\([V\D5:-l
    ԫǮr;LHjɲ_0$ۄye'ˏ<tD#;d*cYkL"M:ОAR0�HpOnUHmJcfS
    Cⶈ輁[6%/"r"f+ҏ
    +2x~\NB'c3I=z9fLHPq!	Jp"؊�zqMXuk&1-c\_	aM&vi`ygΙy\rdۉV=	<k<
    S?DMZ "J<$ϣDK	ӆ+
    lL)9N]ZzE&'Ti_Ue90kqq)!:
    gs=L-.4bEcA^_shU|I!.o]&]; gߟ^.tPZxKHs@>|?&sS㥳f|XUXNLci \BV3qE �\2:he৽>T32;]!.ټ?Mpјygn<:xvH\qxiF	R %dGJ\h1p.M40'/B{<@'(DKV~ќ3OC
    	
    g
    	o&=>^V,JM)mpSNhq^(RPCxzi:sw9<-sy7[j>
    @it%8dv.!D#\<*D>"KZ7:.x ՘XhE}Ÿ\g/]4PpSbWF7~M1�rF+N/ o/_¾G96dmy0]'vQ[lΝM*/B3
    u}[Nˑ7+|9ە0@b冶-(AO^S>5gb7TGc{	&4
    ćٓaBxbvg5VCQGD@q.r2(("2c[P"DڰɪSnM(bh4ƺQaeWvXetGz=2HSw	-gs.jן2l-tpOߗj>t/DK<zTYR'_h_'#HK/s[Jk~Kqh`Gk8DLWͭMgzK@SQU{FnG*0$R:F+Fhl7UF54LDA8Tk1Y̻tnK1ʭ],yfz7`f2K	"Y
    . pjJts|Xy+~6Ps{&zEuuePw8:G-\Z*jmUۚ$L4j%$QY,``:$6%}	4
    .e1	{zKz>L#$U-u!&2!g}Bic
    GF7:eYt\r]]|Ŭ;a%$d@Q'x3uPn
    P-&.FLۗL("\ۆsyп^~V.o-_ыa5ɳ'%ߤeXBᒩD3g}#ӽ9(^@o[m/
    GKy*$kI(EW!	m)/;?pw@PIjQ
    䧴EFBUipw1ְǘLBoqOۤ !|6h!J,9>H*hѹ:<ZCPM%7̯<}{~Qᣳ
    Oܼle~V dDTA^S^0Ȇq_׉ï`2;O-hR0YqD|шND
    ZtcAOK8KבBP,PD]<gJ\qb:xBPX:~_({d=ccR9x}sv?&&PxWU苭#G)m'WB|4aFr>�}9UX$k€4
    Mtn5(\wIPr%dy
    ?2PbHc|_훯	\׾K?DND+D;{ƤJMϏh=Z!ulOF*b˫ZESsKZFEEճ{?ﻭXm:21BO3uZxD8B:
    2M-r-ZM_�E=TmOU-Rr9cVjHOLiy0*ۯ07WCyW=Z;A&Vt]^<D]5ͦmiMA]<`8d^c0'
    ߶J]=W;[=
    7s؎X4ЗxpYnՅu]$`Ҳ[Yg!
    !^2dmbrCrB1b[)IRJO)7U+k!H|.2e̴1Cn_@>h%YQ|Aوi\7LVױ\̮T�ba<rW4�RĐaUo?yP<g	nл~N6@l'hv@(L!ʵ2nTZ8
    جz3u-lk=(	%1ίStOKn27=橇ٽYq#V"7pʍs(l۹.H(*ncJl\ri)Nq$S<_Nv$[r%V,-./w``T#ǾwqmI.f˯$\
    P˰1ͦ޻˺FWKJD_~nx|?cV'*s>SthIs؊ЅU}
    `Xa{am4;qaC	'*s' `@/^,^>L֝:Xa>
    ~oY&NLU[;(Mai;cLb}i8{԰׉͕#?W8UǿIqcȜBP	l"7AJjfL \2N&3nI&P,w
    @;>$-)-S9Ys@K4䇭&j\JnoG7=#=Bfù͌m2=�N^ufU)Ga�Ķ�Vd`(
    "
    
    
    s­3v\D"S*ajLەRJr�uh_U8hpa䑋jt9*r-H[k$vK+Fr�_@H#<c&!b;x4	#L2ty'+TALn?O])Z},0XaϯvGO!A0
    (wSS5[WIXbf^Qs/*G.=kc)#?tf<NrӇTS(c\SPTj_y�RiQ,EK~Jj懿CϝL
    ]MR=l=@RG\Cnk\˶~GlMO2	IG
    f/;x̗tçq)w?ul'~A	-̝{W?&?3>`
    K=V4}+{և{7kdؒ/®ua,H)qz,> Oh!,dӱսz-}19sRW*Zs<i_5'vnҘb1_{'[JY6
    'vK֦—1uhuuG|K
    ,p4iC.y(kjf6
    bG5!.NG' ss͝6l+d؇U	X()J)ɴJX.7rfpѢDH:Y;VIbqA*zP'~KOZ?nGQK_(^2E]_fO?´b;nrP/?
    r5~P~
    �\y	KpoX
    Lf_',PuHMUN~�-{GQ%X\GMWs/+6u(ׄ}&blI	\4l~,ȯm٬]f-Ъoe	dӊكƦ _~ZhƤc_hoCN쉙~~Z?cN۪yc)l(䱯oXa)=_لb
    P+6Jʰe}HMBhEp
    >w?w%>Q3h4ҭm`tXz2W66ϧg|t]0Q洒E+[Ha}z:5oq!y1?|RbGRcT?ZYk΍!	�(\*n?93(-&x묓X:;;z
    _,N_AFW%3*K4Hn73]|w7ǷԲlwhhbꄺFc߲شq{]uW=ꆡJс:lbPքh֬K *_]	:ENCV븅]f<%~Z8k1xEGYG%?öyu͝դ$n͍<~;%n篒hZ֋}IRl&fv]lNtᡯsb3,[ySKD^b伭(1U/[ȇCZ2+BĖ9[[Um
    a_RN^gY{v4cJmyRe(kQa!ƠG{A]3Vt),{(E(S?(t`z0қ,7ǟ%UKucθLW4Cgu}砓mn1wuWl|X"67j>we 6@(Tj	W
    &-S~VdS;?xt*tk/.έ{a)
    A9iߧ[ J"]OZѵ{-0 :|!NJlnr*6Q&kɌfZMIEE҅FKW6
    C	&7*QTS!$&V\_0V�S 腧XjKꍝ@k\JQ4Ob/~m:n-xAd)ΛMw\?rTL3Gɲv_%*mc{A.=s9ۛɎ>ÛܠL8ؼ*٭7ތ-..SaX|�xco=6r#KG}RdVˆ,}	$L-+:5�!dVo7cOTw9x�Atߞj2;fSdL	t-4|0&$_Xޜٜ|شJ=
    YEstxl\I޳ճҤ5iǍqn-lw(&ЫX*^nѬ^ΎQ}oibՉ
    {곲&M͞ʋW*$8s
    C A?nL66eR&]0.-KɕL=u}yssDBչpr2索\jL�dB!9I,]Ki$Pb H:yJvۜfJj2b|%o*ȇHȑH|@dT2"|2 i[F]Gz>4һN.~¤@/q)D:A4Z,{y`r}0r
    /�^&TTw>U͟μ7,VYK
    d`954ثK,2A�dфgC\덤APM%�؜~zE`v^b9@\8'zi#=&o3K	ɦbwPcPŻ)*
    G#i~u?xA)#>kPlpv۴xu}B<0;$E&؊F<Rcm8P‡EʃY<!ջZ΀T*3epܴ'!l.~NG8ww86OħLْ߭S6uCZ.B+b['Wuv˶
    sEaz.qOԉkc|j$u6�.Ig,K11~$) X
    -T�,2Khtɪ>,?8.�X3(FTs4,	G7sM -X1�Ev<s[vQ@
    ^:}` e
    ^{~
    %aoICA>x!궀4™<OSD]&spb6D+Q?
    5B:QD뢬g!2q6+g'*Q/3LXDTi耼?82+FNƱC23~DYOĶOak+t ghixL͛oC~lvy	
    tpU*DZayn!zϸY5Ϙv~J	MR&7?kW0uow?÷ZrrbFGJ!ƱFmjdgS'sCAWVCϮ=FIi7
    ӧWJbQUň=etvr~.#"k=|mw#}al"n3
    ޚ_9@e=Zȋz9vߍ6hc*~yTU`CADZNa	- L=FmE
    U\qYRi&ʬXaY1fx1O`!U.m%!xkhV6h<1%j$1sI$Zx<Z:="A9197~K
    q?H*kqc�*07|0{<"ڡ	#XA0rg
    <5ʱPD}ұ}e(ч !0t>\2�]xcҫ_c-Ś^m0f؋5Jί-f-e-03*
    CZA;̹O7QIi$l lr]g`,xW}g~6[T8?\dP8cpxa	O*v]ۭ63I3L
    Vd"É@Ϻ
    +@\\x6=gfE_Q58`޻2?q5,!CR w{!:)+t<(ɩ&ܚ;9=3~h<{'sF
    UiRңZa^)bIٕe{Z;|J(d�UP823p'l~9ASTX+@%eB5/Dqqih"Fo3O*\~S%tr]jؼ~?/,0BE
    jE3VCKʎG=yN<92-@/d$JxpS]0+BVP&^rYd	6LUĉ|;[ҫA)A2#s(alzS槫ਆ>/
    eLmR O`|/ݶ?UM?VnbUy1l5YתQa'h$3R{B<Z!@Y\;fUkqxc�)")yڒpҠX,z۟uZwLӁT0u
    &hYCWa6>h|;EǎY}_SbԚv39|<Kf�BvvvBO`5p#aJ5
    χ=}}Lz6ЋA5űKbiCiw0+,wV'X.
    )"CЂ죝"68G,כ2q̴	
    VVc҅h8֒a!ps%_J.FA]J֊>
    
    D*%5YuHm4tC_<
    Vo/M\	
    ا(AAKil#$[}_1?H>Ciw_~%GTp=ɓ/ywMn9a(MK/c@T\]:yɗ}a vf\ +l$ɄՙXG7{`˟x%?8I}1{+Ě7گ^ίtϠȏ>gIWP3Ǥ%VoVwpF)Fڞm]=jj!yiakvm{u玙<5X'_)s)[͈(NvCUkKrxo#|O}!zz&:2zZ`qASsKy$5Mռٚ7 h ~˶eyTxuێ4?|iy_ӢS҅ʅ;-!�
    T 2]r&q
    `IsGE +"GA%mwpDh@^/
    �||$&A1NEAk�
    c8
    4FO؁0wjLȪ',O�saLQanH+Iz^W,Aon߅Vʌ6XVTBa_ytZ&?yF]:g+"dԴr7{ߩ	']tDlL'sA\cǿCo//&^8-2"-!pICե?Y;r7Pe8:	IĕW8@DX\:рiwu3ĵDu޼۹N֯[^b>P^/DSH:"v;Nƌ=}[E7GqY%p:zd dك�!:(6	�X^t=T%Pɉ)7(dl>ky
    *-N3䏼\eE-T (J#jD[�uS.w?ZO`ہH|y.9hkq!Hy
    A_97(F;.
    Ba\Ndf@7cWiPqZ=&'-J2X bAYEF!�g
    _µ1�B	oPG� /*.+S~SU?|ȯtbO/V�cY"qӊ1(;ͿotL	S&[aㅥ׿%2"~0o˟֍6>[7XOYcOK5¢	.rҀ|n4~:/p@<O A@YI-v-2<ĐFE\ڊV2+g猲RY2aed%Fܝ�n`и@b%	y=0>)&bb4yaZyjwvM(@�CbD)eRH;J:tqdж+Ϊ}^ ՠVkgF#$)[j0&\S`@O$(S%x\U:}UL~`݀{2S4CSL5CQ%A
    ŢX_5[YHFd8m^,yee(z$t,M'p+}
    f%k6Y(iC{LG5�ԭ1QwΜ�l.fSi^7C(4oOJbSgYv3}5q%؅ӗ"Te|o$tm,kd4A>,
    $x:[ɯOQ9yb.?d]4	@+*0skԅoд@
    
    :BSsD79kM4K"^pc`|e%B#Y-pѐ;ˍ3^@_ZdEK)BR6jPnT#S*iѼ�+]iqw՝fŜu.ƎG!3
    V)(Бdk�pW9oJM	9jc8csbi-V᪯uBkx/C
    dBJ(@U	Rs+P2;jPс~wZ ݂T+F"8iiLНֿu}\\2cL7i-tlc}'gD/1zDoPtf&ٜIvT+uBӒR0SEe˺~]39=Jq֔Sk4(2oB(eH.Il<T[l>*AHGRSl[lU|M~mI[Q&<$6ro⠭X
    9}Six+LNcec'4
    +Sς*Tju�飝p8v~̘	0q^<%`�2çk-
    u|;~5㩓m!xhS|BKl{*l1b`R$ة@57ė[PLb"gTijscGlF|ˑUyObGfhZ*P
    &-%rk[
    (iA0mp�82<Qy(@ kMҪ(@)	\
    w:tP\뛯~9_\FHrM&oEZ:y08RA@23W2#\2nmjqTF.k4yf(tzG[jpVנ>O%Q(,nVO\2ӑIt7\�jX[q'#ݹϨXmAF>XݠLh\5wLBR!g\=!@`f#R_^Lcs5LpRR6O@:-RtBeYkeXdkM!!B(,lu
    DF'ug7Gp ߆Q!D$xXS]^2wX=8@ys|%iX-=u|#:}J<.5#v7A~h@q-<	dWAKI:FLaHy\Z2Vm߶^U	XW<6U ̮fs}7;^*�@ѣAfE_8?B{"x˱jkFMuQ#3>suV6{|,-Hq+VwK_<[ݽ"^d6]t#JҼTHmZScJ|,>ftEi^SgK3	Tȁ	Z4,JA0ЧMiYr0X&$察:MrQܥå�Ō1
    skL!J#"g5|bIWhт%b)gP-Չ˱scP}ksnn\|ZK\
    
    -m&W.2em9z]mw*P^sPt>X}HTZduCLfVz<BB;ZԂ�0ǯmh qxaq[	QR5|eui]z;iv2|	(vwGD:0nrt້xt鼖Fh2qVs*	9,c9^k@GaQ2I.!1":×;$lH{{dY#\bB"ĸ"1,g0})3́SptFf2mM1ZM}zYBgM[<#ҧT.]F;
    8w(`~	;WWVՕPX/Ek
    <JHqSq%2!t?!cQ/4\}Ɗl:OW9h m1{!xwT&O%	-0B<˅xPC2
    }Ėڛl`Wh6ʮlu2SchSRqmMϘ̎L%FՀaLLeYLJ[9k�a h'@p`Љm^I̶J`5XNJRd5M`xPnˮwgKN(e-QdMXD#]YM-G٪f
    >sw	1=o]M[F1 ̔:6\墲]0pqm7uKel4R2qoP"JP̮meNkik`GB
    ))_!Ժ _</wRl@Rf4]voo \Xẅ)lZ-"[ƹlL<7aK^W1볨N'Ce,R[O
    ^"|zf+c! lWbCL!qmMfQ9zs~^@hڔCQޕ*k/pDt֯s@Jr-XL-]==`t-7o7z7ZpiZ(CR87Л;0)qixF	d8Aפii~:40٣X#d5n_D/zE^0%׉)tᥱ~Z-0TjX>KUn&'W-;(IM3sb*TH
    aZ9Z[�iC3P@qCOgp68$~rVIL)"`Cj-H
    }k~2XX	병v
    D!.�@-d&q&opcWj&Q`lQ3Їz{Euv$:]n4tڸt.žrDdE
    VYXo64Anub+lY>2T]PD{CVA=`3bԚF[LI ;
    /Hi	AJ=&_TSN4EBQ.<4
    Pev
    H`.C"_W"dAy)+7c5JRX.qFYg
    %6�oY*	--Q$}2$<Ra-
     0$ԜYwYv'S3pnWeH~8EKj|3e_+ڹnrcVr
    ӉX0F%mVFT4}OQiӸ{`.~dE7$Հ^7-nګ
    !ő$8Bueń9<`V@\BJk3DL`0V\ޫq9(7jڍz0u^WJAKDe2Dhe5_Cl(lx
    "2*px}MX@.WgScka{ѳ4A/^_j0lj7leT<ymi(
    [[!
    kןA>cȀ~>yH0ZI Pgœ!ōo	,N�w�	)juwa:qV\*x	o#dȨ5;[A�BH*L[0H\
    藎|cKG6"J`|>%/zk:N^WOkptq+iCC	@/!3H/rQ-)9vg&=\pث;jmBX9
    yݞ;NQMN^3z>yjIh:WBL`8KUt;j( 1 J4M<iS�ᭂ@fhtB/`)aPnP;'{8 }+`iF4-[;x$>|S>@]*}C6;Oxn1{tpL1idLf4)cH蚭iT̩|j54+STH$][T
    pz[Lz!9
    np͚5'ǏG_4CmήZ
    XwwPݎ~(9:"dZ�<}pR@4?C@h1O81GIWCBXgI a	0msj`l5`TB	*O"E: nmwERJ:	?QZz7o|ai'2�PbD5�*ˈ
    JM30b ͪX`=X5,G_)QX	H?ܼ[+V0XxF5F (M&
    M0УpHnPX:sf@~
    p)2b/hz|uSjZ5"q6B=PHڂT<LiC!LLj-A[Ӈkw
    s$x=~A-K:.�@#VH_BM4
    q
    )U̦
    	Y>
    ~dZ/F=4h
    |)hu!II{ cǡHS}�hP�䉂묎'B:]և 7rw9'UmǛF5`	@([v$[b@(TefAxOx~lMPAgu=~1݉/@GV#H%vK$@	YRL(hdB9)I2
    `)5]֛GbN0*8 zu"z�o`LJ	^P@'y 
    a!O<k>~hAafnR#231qɄ_N10
    tH_z\F0(]$]LxS.{O|O3B _ 陃nIQրk4 樰YSX[k
    )b-[`0̫+kS.H'r`/e$#-ѱa7<VFdx0@<Np-p: 0	hd4ʶχ3XzL>)OCωPQ+wAzἾ&m	_V-KE{)t54	T.+9E8CX3*Ώjq0j* g"PoB#3CLBe@u5v<!!0"�τ܆#�iBm�/:~'G�O$K
    >F_$I˔EVAKq8^u^V9:|@ )}ِ(3I@CRDb"x7/,9BVIc36y.Uu.[?ӮRK!1"(P>ޱxۥssZ?˾)0kɊ_zA6cF�xz<\[~.7켜|y
    -_WX(opKf^<L\n
    ~,o?o9.DHd
    V:QG:Ѵ<fA^dN]?A z.51C]׾/]?~a7VVO6_L�|#$
    ǀmݳ֏Aww'j0=<
    K7Eεa0_vQ3����IENDB`p!S��%����7VbD3� %����7VbD3� |����������"����/�i����xXklT>sa{Iq1ik <%4m W^BMAHӀH	)(?Ph6
    /6RkU
    ];wg@{W3w<Μ3ήk7+ńGK|Y)2ԱD>׌41X>4cSWUY+sJ7ԭ:Z&$^$2YOOLQw+�;3Q#݅{~G{J5uwt>:ec3b;T_͈gs._ixO/8G~RsM޷>|&J%|;/>/>{/kU
    zP&c_??s}Ϸ'4M|E|Y]R?6CqP9wD"wkB9D6(
    (.0GgNqF˓BVS5ͧS';( \ID`qn?1oLŵ<)+ʏT-
    C&vQ*M)}"U7}Z'x517zn&]&XMkb2Kՙ:'a g?-No&Ӽ9>&Տm`<\\ G~_&t^Y?,Ɲ,;Q8RG'o6o8~zSL'svN
    ռo\{>Wk9rȹ\k|; x9;#<&}n?ؓM̌KT]Fk\#	}k"vy˹ϵa>>#['_?IZyWQ1Jl.
    ɗeK(cmYtڅZ?N+AǏjG_BMg7+s%IN9?>3R_M|P+*J.'
    3]WWpC矠ʇ0(wPRʯhn#(Eaj|+2\UY_(~K4]Mc_P'_^t1
    zc"g|b^}y8^b<eo(L
    K8ͱ`G]_r
    /&uW
    /SJ%/~@K|pBo~Xˀ۔<Vr>s%�N'oP/w+$-J^M'oW;|n%oWoE~3>jY΃[O7G*y
    %_|w�?i%pR[SJ^-JεJ z%x�ެK*ypޡJHF~o{!ky|uCeqBϿnޤ
    %ܟ775o;39ؑ*MiZhl+Z!1a@o-V15k5V{ev,.n[]=?ޙHv
    a?C؋(~F>Z䷣e`<oʒM]W
    Q>Us,6~
    |ˇ*OJ<E51F2Wq0>L%!`o%XG}[W
    c[s'vPc]DZĒE__c7Vgtvl2|zҙ֖U5uɐ"GQD=<o|*S+ht�
    Ai+rmKU]]m	joHVc{x/X9HƝa7[$꽸%WVJ$6g}>Y<H^ۅa;Kr=UZn+wNm?w[KnfR.IۄkAX!pNV ,e%pqяU(n9m,ۍ3jI	~/PnpppzW4-\Fp	zCfp)Vk-5!,@X|`zvڱaw^.Jtm}MH/��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������b���(�������������������������������	����
    �������t�������������,���h�t�t�p�:�/�/�l�o�g�b�a�c�k�.�q�o�s�.�c�h�/��,���h�t�t�p�:�/�/�l�o�g�b�a�c�k�.�q�o�s�.�c�h�/���������������4���m�a�i�l�t�o�:�l�o�g�b�a�c�k�-�u�s�e�r�@�q�o�s�.�c�h��4���m�a�i�l�t�o�:�l�o�g�b�a�c�k�-�u�s�e�r�@�q�o�s�.�c�h��h�������������&���h�t�t�p�:�/�/�j�i�r�a�.�q�o�s�.�c�h�/��&���h�t�t�p�:�/�/�j�i�r�a�.�q�o�s�.�c�h�/��p��/����0�������������D���T�i�m�e�s� �N�e�w� �R�o�m�a�n��������������������������������������D���A�r�i�a�l���������������������������������������������������������� �D���M�i�c�r�o�s�o�f�t� �Y�a�H�e�i��������������������������������������0�D���L�u�c�i�d�a� �S�a�n�s� �U�n�i�c�o�d�e������������������������������@�D���W�i�n�g�d�i�n�g�s�������������������������������������������������P�D���A�r�i�a�l� �B�l�a�c�k��������������������������������������������� `�D���C�o�u�r�i�e�r� �N�e�w���������������������������������������������1������f����������
    �������	��@����?��" ��d������d���������������������������} �� ��d������d����� �������������} ��" ��d������d�����@�������������} �� ��d������d�����`�������������} �����d������d����������������������������(���D������C������������������	���������������������������������	������
    ������������������
    ������������������������������������������������������������������������������������������������������������������ ������!������"������#������$������%������&������'������(������)������*������+������,������-������.������/������0������1������2������3������4������5������6������7������8������9������:������;������<������=������>������?������@������A������B������C����������b�$���:����t!D�����������������b�$�������l$1���������������2�$���%����7VbD3� ��[�����q�����c�$�����������������@�������������8�������������������������������������������������>�����������������������g������������4���U���d���U���d���U���d���U���d�����
    �����p��������p��p�������@���<�����4�����������������������������
    ������g�����������4���;���d���;���d���;���d���;���d�������(���p��������@��p�������p��?���������
    �%�O���������
    �=����������������������������������������������������������������������������������������������	���������������������
    ���������������������������������������������������������������
    �������������������������������	���������������������
    ���������������������������������������������������������������
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ���������������������!���������������������"���������������������#���������������������$����������������/��������%����������������������&���������������������'���������������������(���������������������)���������������������*���������������������+���������������������,���������������������-���������������������.����������	�����������/����������
    �����������0���������������������1���������������������2����������
    �����������3���������������������4���������������������5���������������������6���������������������7���������������������8���������������������9���������������������:���������������������;���������������������<���������������������=���������������������>���������������������?���������������������@���������������������A���������������������B���������������������C���������������������D�����������������P���������������������������������������������������������������������������������������������������������������`� ��������������̙�33���`� ���������������������`� ��������ff3���33�����3�f�`� ��������333�������MMM��`� �������������f�������`� ���������������f�������`� �������������3����������?��" ��d������d���������������������,������} �� ��d������d����� �������,������} ��" ��d������d�����@�������,������} �� ��d������d�����`�������,������} �����d������d������������,����������?��" ��d������d������������������ ������} �� ��d������d��� �������������} ��" ��d������d���@�������������} �� ��d������d���`�������������} �����d������d���������������� ����?��" ��d������d��������������������������} �� ��d������d���� �������������} ��" ��d������d����@�������������} �� ��d������d����`�������������} �����d������d�����������������@����?��" ��d������d���������������������������} �� ��d������d����� �������������} ��" ��d������d�����@�������������} �� ��d������d�����`�������������} �����d������d������������������P�������}���" ��d������d����������"�����}��� ��d������d��� ����"�����}���" ��d������d���@����"�����}��� ��d������d���`����"�����}������d������d�������"����`�������}���" ��d������d�������������,�����}��� ��d������d����� ����,�����}���" ��d������d�����@����,�����}��� ��d������d�����`����,�����}������d������d���������,����p�������}���" ��d������d������������ �����}��� ��d������d���� ����������}���" ��d������d����@����������}��� ��d������d����`����������}������d������d��������������������}���" ��d������d������������ �����}��� ��d������d���� ����������}���" ��d������d����@����������}��� ��d������d����`����������}������d������d����������������������������� ���(����	������������
    ����������8���
    ������
    ���Z�������$0z��_����_���������������������������	��������`_�����������������
    ����������������*�����������O����d������ �����������������������	����6�����������@�������	��@��
    �������@����������8����	�������������W���
    ����������������W�~����
    �����
    ���N����������������������������������	�?�������������������O���~����
    �����
    ���N����������������}��������������������	�?����������U��������r����
    �����
    ���B����������������33�������������	�?����������U���X������r����
    �����
    ���B����������������33�������������	�?��������Y��������V����r����
    �����
    ���B����������������ff3�������������	�?��������Y��U���������r����
    �����
    ���B����������������33�������������	�?�������������������r����
    ���	��
    ���B�����������������}��������������	�?��������S���V����������r����
    ���
    ��
    ���B����������������ff3�������������	�?�������������X�����r����
    �����
    ���B����������������ff3�������������	�?���������������W������
    ������
    ���Z�������0z��_����_���������������������������	��������  _�����������������
    z��������������F���C�l�i�c�k� �t�o� �e�d�i�t� �t�h�e� �t�i�t�l�e� �t�e�x�t� �f�o�r�m�a�t������$�������
    ���$������������
    ���
    ���
    ���Z�������1z��_����_����������������������������	�������� _o����������������
    ��������������C�l�i�c�k� �t�o� �e�d�i�t� �t�h�e� �o�u�t�l�i�n�e� �t�e�x�t� �f�o�r�m�a�t�
    �S�e�c�o�n�d� �O�u�t�l�i�n�e� �L�e�v�e�l�
    �T�h�i�r�d� �O�u�t�l�i�n�e� �L�e�v�e�l�
    �F�o�u�r�t�h� �O�u�t�l�i�n�e� �L�e�v�e�l�
    �F�i�f�t�h� �O�u�t�l�i�n�e� �L�e�v�e�l�
    �S�i�x�t�h� �O�u�t�l�i�n�e� �L�e�v�e�l�
    �S�e�v�e�n�t�h� �O�u�t�l�i�n�e� �L�e�v�e�l�
    �E�i�g�h�t�h� �O�u�t�l�i�n�e� �L�e�v�e�l�
    �N�i�n�t�h� �O�u�t�l�i�n�e� �L�e�v�e�l���6���&���������������������������������������
    ������������8���
    ������
    ���Z�������d2z��_����_���������������������������	��������^ O�����������������
    ����������������*�����������O����d������ �����������������������	����6�����������@�������	��@��
    �������@�������N����
    ���������6�������������h������	���?��� ��������������̙�33�������������������������������`� ��������������̙�33���`� ���������������������`� ��������ff3���33�����3�f�`� ��������333�������MMM��`� �������������f�������`� ���������������f�������`� �������������3����������?��" ��d������d���������������������,������} �� ��d������d����� �������,������} ��" ��d������d�����@�������,������} �� ��d������d�����`�������,������} �����d������d������������,����������?��" ��d������d������������������ ������} �� ��d������d��� �������������} ��" ��d������d���@�������������} �� ��d������d���`�������������} �����d������d���������������� ����?��" ��d������d��������������������������} �� ��d������d���� �������������} ��" ��d������d����@�������������} �� ��d������d����`�������������} �����d������d�����������������@����?��" ��d������d���������������������������} �� ��d������d����� �������������} ��" ��d������d�����@�������������} �� ��d������d�����`�������������} �����d������d������������������P�������}���" ��d������d����������"�����}��� ��d������d��� ����"�����}���" ��d������d���@����"�����}��� ��d������d���`����"�����}������d������d�������"����`�������}���" ��d������d�������������,�����}��� ��d������d����� ����,�����}���" ��d������d�����@����,�����}��� ��d������d�����`����,�����}������d������d���������,����p�������}���" ��d������d������������ �����}��� ��d������d���� ����������}���" ��d������d����@����������}��� ��d������d����`����������}������d������d��������������������}���" ��d������d������������ �����}��� ��d������d���� ����������}���" ��d������d����@����������}��� ��d������d����`����������}������d������d��������������l
    ���d
    �� �������������(����	������������
    ����������T���8����	�������p��O��
    ���
    ������������p��O
    �~����
    �����
    ���N����������������������������������	�?������������p��f��
    ���r����
    �����
    ���B�����������������}��������������	�?����������6��O��]	������@����	�������0��
    ��]	���
    ����������������0��
    ��]	���r����
    �����
    ���B����������������ff3�������������	�?��������6��Q��m��]	���r����
    �����
    ���B����������������33�������������	�?����������6����C���r����
    �����
    ���B����������������33�������������	�?����������0��
    ��:���r����
    �����
    ���B�����������������}��������������	�?��������i��Q����]	���r����
    ���	��
    ���B����������������ff3�������������	�?����������6��
    ��C���r����
    ���
    ��
    ���B����������������33�������������	�?��������i��@����I���r����
    �����
    ���B�����������������}��������������	�?������������@��:��I���r����
    �����
    ���B����������������ff3�������������	�?����������@����I���r����
    ���
    ��
    ���B����������������33�������������	�?��������6��F��m��T���r����
    �����
    ���B����������������ff3�������������	�?��������i��F����T������
    ������
    ���Z�������$3z��_����_���������������������������	��������` _�����������������
    |����������������*���&�����������l�-����������#��������������������������	����������������X���
    ������
    ���0������������������������	�?��������`����
    ������
    ���Z�������3z��_����_���������������������������	��������`_�����������������
    t����������������*���"��������O��d��d�������#�����������������������������
    �������������
    ������
    ���Z�������4z��_����_���������������������������	��������`/	�����������������
    z��������������F���C�l�i�c�k� �t�o� �e�d�i�t� �t�h�e� �t�i�t�l�e� �t�e�x�t� �f�o�r�m�a�t������$�������
    ���$������������
    ������
    ���Z�������d5z����������������������������������������������	�������� _����������������
    ��������������C�l�i�c�k� �t�o� �e�d�i�t� �t�h�e� �o�u�t�l�i�n�e� �t�e�x�t� �f�o�r�m�a�t�
    �S�e�c�o�n�d� �O�u�t�l�i�n�e� �L�e�v�e�l�
    �T�h�i�r�d� �O�u�t�l�i�n�e� �L�e�v�e�l�
    �F�o�u�r�t�h� �O�u�t�l�i�n�e� �L�e�v�e�l�
    �F�i�f�t�h� �O�u�t�l�i�n�e� �L�e�v�e�l�
    �S�i�x�t�h� �O�u�t�l�i�n�e� �L�e�v�e�l�
    �S�e�v�e�n�t�h� �O�u�t�l�i�n�e� �L�e�v�e�l�
    �E�i�g�h�t�h� �O�u�t�l�i�n�e� �L�e�v�e�l�
    �N�i�n�t�h� �O�u�t�l�i�n�e� �L�e�v�e�l���6���&���������������������������������������
    ������������N����
    ���������6�������������h������	���?��� ��������������̙�33�����������������R���J��0�������������(����	������������
    ����������p���"�
    ������
    ���H�����������G������������������������	�?�������������&���
    ������
    ���Z�������$6z��_����_����������������������������	������������O�������������
    ����
    ����������������*���&�����������l�-����������#��������������������������	���������������X�� ���(���
    ������
    ���Z�������6z��_����_����������������������������	����������	�����������������
    ����������������*���(����������l�-�����������#��������������������������	���������������X�� �������
    ������
    ��#l�������7z��_����_���������������������������$�����	�	��������
    �����������������
    ����������������
    ������
    ���Z�������d8z��_����_����������������������������	��������
    /�����������������
    ������������&���
    ������
    ���Z�������$9z��_����_���������������������������	��������_��O~�������������	����
    ����������������*���&�����������l�-����������#��������������������������	���������������X�� ���(���
    ������
    ���Z�������9z��_����_���������������������������	��������_	~�����������������
    ����������������*���(����������l�-�����������#��������������������������	���������������X�� ���H����
    ���������0��������޽h��������	���?��� ��������������̙�33����|����������
    ������������������������������������������-�������@����������(���(����	������������
    ����������N���
    ����� ���Z����D:z��_����_����������������������������	�?����������`0	�������������
    ����
    �����������������L�o�g�b�a�c�k� �p�r�o�j�e�c�t�����������O�
    ��d��������2�������������	����6�����������@�������	��@��
    �������@����������
    ����� ���Z����:z��_����_�����������������������������	�?����������P
    p����������������
    ������������:���C�e�k�i� �G��l�c�� �&� �S��b�a�s�t�i�e�n� �P�e�n�n�e�c���.��������Oh
    ��K����������������������������*����������	������������������	����:����������@�������	��@��
    �������@�����������N����
    ���������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+��������������
    ������������������������������������������-�������P�������������(����	������������
    ����������0���
    ����� ���Z����;z��_����_����������������������������	�?����������`�P �������������
    ����
    �����������������~� �����������O
    ��d����������������������	����6�����������@�������	��@��
    �������@�������T���
    ����� ���Z����d;z��_����_�����������������������������	�?��������������������������
    �������������N�o� �r�e�v�o�l�u�t�i�o�n�,� �o�n�l�y� �e�v�o�l�u�t�i�o�n�.�
    �l�o�g�4�j� �i�s� �n�o� �l�o�n�g�e�r� �b�e�i�n�g� �a�c�t�i�v�e�l�y� �d�e�v�e�l�o�p�e�d�
    �T�h�e� �s�a�m�e� �b�a�s�i�c� �p�l�u�m�b�i�n�g� �o�n�l�y� �d�o�n�e� �b�e�t�t�e�r�.� �
    �F�a�s�t�e�r�,� �s�m�a�l�l�e�r�,� �h�i�g�h�e�r� �g�a�s� �m�i�l�e�a�g�e�,� �a�n�d� �g�e�n�e�r�a�l�l�y� �m�o�r�e� �b�a�n�g� �f�o�r� �t�h�e� �b�u�c�k�.�����������p
    ��n�K���}Z����,�����p
    ��n�K���}Z����+�����p
    ��n�K���}Z����K�����p
    ��n�K���}Z�����������,�������+�������K���������8����������	��,�������	��+�������	��K�������	����6������>��~������>��~
    ������>��~��������j���
    ������
    ���B��������������A�������������������	�?��������0	�j���
    ������
    ���B��������������A�������������������	�?���������N����
    ���������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+�����p���������
    ������������������������������������������-�������`�������������(����	������������
    ����������R���
    ����� ���Z����;z��_����_����������������������������	�?����������  `�������������
    ����
    ��������������(���M�o�d�u�l�a�r� �a�r�c�h�i�t�e�c�t�u�r�e�����������O�
    ��d���������������������	����6�����������@�������	��@��
    �������@����������
    ����� ���Z����$<z��_����_�����������������������������	�?������������L����������������
    v�������������l�o�g�b�a�c�k�-�c�o�r�e�
    �	�J�o�r�a�n�,� �S�t�a�t�u�s�,�
    � � � �C�o�n�t�e�x�t�,� �p�a�t�t�e�r�n� �p�a�r�s�i�n�g�
    �l�o�g�b�a�c�k�-�c�l�a�s�s�i�c�
    �	�d�e�v�e�l�o�p�e�r� �l�o�g�g�i�n�g�
    �l�o�g�b�a�c�k�-�a�c�c�e�s�s�
    �	�c�o�n�t�a�i�n�e�r� �(�a�c�c�e�s�s�)� �l�o�g�g�i�n�g�
    ���^��
    �����p
    ��n�K���}Z���������x
    ��n�K���}��Z���������x
    ��n�K���}��Z���������x
    ��n�K���}��Z���������x
    ��n�K���}��Z���������x
    ��n�K���}��Z���������x
    ��n�K���}��Z���������x
    ��n�K���}��Z����
    �����������������������������������������������������������������������������������������
    �������	���������	���������	���������	���������	���������	���������	���������	���������	���������	���������	���������	����6������>��~������>��~
    ������>��~��������j���
    ������
    ���B��������������A�������������������	�?��������B 
    �	�N����
    ���������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+�����v���������
    ������������������������������������������-�������p����������"���(����	������������
    ����������F���
    ����� ���Z����<z��_����_����������������������������	�?����������  `�������������
    ����
    �����������������A�c�c�e�s�s� �L�o�g�g�i�n�g�����������O�
    ��d���������������������	����6�����������@�������	��@��
    �������@����������
    ����� ���Z����<z��_����_�����������������������������	�?���������� `p����������������
    �����������4��D�e�f�i�n�i�t�i�o�n�:� �A�c�c�e�s�s� �l�o�g�
    �	�	�T�h�e� �l�o�g� �g�e�n�e�r�a�t�e�d� �w�h�e�n� �a� �u�s�e�r� �	�a�c�c�e�s�s�e�s� �a� �w�e�b�-�p�a�g�e� �o�n� �a� �w�e�b� �s�e�r�v�e�r�.�
    �
    �L�o�g�b�a�c�k�-�a�c�c�e�s�s� �i�n�t�e�g�r�a�t�e�s� �s�e�a�m�l�e�s�s�l�y� �w�i�t�h� �J�e�t�t�y� �a�n�d� �T�o�m�c�a�t�
    � �����������p
    ��n�K���}Z����F�����x
    ��n�K���}��Z���������x
    ��n�K���}��Z����;�����x
    ��n�K���}��Z���������x
    ��n�K���}��Z���������������������������������������%��������������;����������������~����������	���������	���������	���������	���������	��%�������	���������	��;�������	���������	����6������>��~������>��~
    ������>��~��������N����
    ���������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+��������������
    ������������������������������������������-��4���,��������� ������(����	������������
    ���� ������l���
    ��� �� ���Z����D=z��_����_����������������������������	�?����������P�0�������������
    ����
    ��������������@���l�o�g�b�a�c�k�-�c�l�a�s�s�i�c� �i�m�p�l�e�m�e�n�t�s� �S�L�F�4�J������!�����O�
    ��d��!������(������!�������	����6�����������@�������	��@��
    �������@����������
    ��� �� ���Z����=z��_����_�����������������������������	�?���������� `����������������
    p�������������L�o�g�b�a�c�k� �o�f�f�e�r�s� �a� �n�a�t�i�v�e� �i�m�p�l�e�m�e�n�t�a�t�i�o�n� �o�f� �t�h�e� �S�L�F�4�J� �A�P�I� �=�>� �L�o�g�b�a�c�k� �e�x�p�o�s�e�s� �i�t�s� �l�o�g�g�i�n�g� �A�P�I� �t�h�r�o�u�g�h� �S�L�F�4�J�.�
    �I�f� �y�o�u� �a�r�e� �u�s�i�n�g� �l�o�g�b�a�c�k�,� �y�o�u� �a�r�e� �a�c�t�u�a�l�l�y� �u�s�i�n�g� �S�L�F�4�J�
    �S�L�F�4�J� �c�a�n� �d�e�l�e�g�a�t�e� �t�o� �l�o�g�4�j�,� �l�o�g�b�a�c�k�,� �j�a�v�a�.�u�t�i�l�.�l�o�g�g�i�n�g� �o�r� �J�C�L�
    �S�L�F�4�J� �c�a�n� �i�n�t�e�r�c�e�p�t� �l�o�g�4�j�,� �J�C�L� �a�n�d� �j�.�u�.�l�.�
    ������j�����`
    ��n�K���}���7�����`
    ��n�K���}���?�����`
    ��n�K���}���*�����`
    ��n�K���}��������`
    ��n�K���}���j�������7�������?�������*����������������F���j�������	��7�������	��?�������	��*�������	���������	����6������>��~������>��~
    ������>��~��������N����
    ��� ������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+��������������
    ������������������������������������������-��������������$������(����	������������
    ����$������^���
    ���$�� ���Z����>z��_����_����������������������������	�?����������  `�������������
    ����
    ��������������4���J�o�r�a�n�:� �a� �b�o�w�l� �o�f� �f�r�e�s�h� �a�i�r�����������O�
    ��d���������������������	����6�����������@�������	��@��
    �������@����������
    ���$�� ���Z����d>z��_����_�����������������������������	�?����������� ����������������
    V�������������G�i�v�e�n� �r�u�l�e�s� �(�p�a�t�t�e�r�n�s� �&� �a�c�t�i�o�n�s�)� �i�t� �c�a�n� �c�o�n�f�i�g�u�r�e� �a�n�y� �o�b�j�e�c�t�.�
    �J�o�r�a�n� �c�a�n� �l�e�a�r�n� �n�e�w� �r�u�l�e�s� �o�n� �t�h�e� �f�l�y�.�
    �W�i�t�h� �i�t�s� �i�m�p�l�i�c�i�t� �r�u�l�e�s�,� �y�o�u� �d�o�n� t� �e�v�e�n� �h�a�v�e� �t�o� �w�r�i�t�e� �r�u�l�e�s�.� �
    �I�t� �c�a�n� �d�o� �p�a�r�t�i�a�l� �r�e�p�l�a�y�.�
    �I�t� �i�s� �g�e�n�e�r�i�c� �(�c�a�n� �b�e� �u�s�e�d� �i�n� �y�o�u�r� �o�w�n� �p�r�o�j�e�c�t�s�)������>�����p
    ��n�K���}Z����&�����p
    ��n�K���}Z����>�����p
    ��n�K���}Z���������p
    ��n�K���}Z����1�����p
    ��n�K���}Z����>�������&�������<���������������������1���������T���>�������	��&�������	��<�������	���������	���������	��1�������	����6������>��~������>��~
    ������>��~��������N����
    ���$������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+�����
    ���������
    ������������������������������������������-��������������(���4���(����	������������
    ����(������X���
    ���(�� ���Z����>z��_����_����������������������������	�?���������� `�������������
    ����
    ��������������,���C�o�n�f�i�g�u�r�a�t�i�o�n� �e�x�a�m�p�l�e�:�����������O�
    ��d��������(�������������	����6�����������@�������	��@��
    �������@�������	���
    ���(�� ���Z����$?z��_����_�����������������������������	�?����������0������������������
    �������������
    �<�a�p�p�e�n�d�e�r� �n�a�m�e�=�"�F�I�L�E�"�
    � � � � � �c�l�a�s�s�=�"�c�h�.�q�o�s�.�l�o�g�b�a�c�k�.�c�o�r�e�.�r�o�l�l�i�n�g�.�R�o�l�l�i�n�g�F�i�l�e�A�p�p�e�n�d�e�r�"�>�
    � � �<�F�i�l�e�>�l�o�g�F�i�l�e�.�l�o�g�<�/�F�i�l�e�>�
    � � �<�r�o�l�l�i�n�g�P�o�l�i�c�y�
    �	� � � �c�l�a�s�s�=�"�c�h�.�q�o�s�.�l�o�g�b�a�c�k�.�c�o�r�e�.�r�o�l�l�i�n�g�.�T�i�m�e�B�a�s�e�d�R�o�l�l�i�n�g�P�o�l�i�c�y�"�>�
    � � � � �<�F�i�l�e�N�a�m�e�P�a�t�t�e�r�n�>�
    � � � � � � � � � � � �l�o�g�F�i�l�e�.�%�d�{�y�y�y�y�-�M�M�-�d�d�}�.�l�o�g�.�z�i�p�
    � � � � �<�/�F�i�l�e�N�a�m�e�P�a�t�t�e�r�>�
    � � �<�/�r�o�l�l�i�n�g�P�o�l�i�c�y�>�
    �
    � � �<�l�a�y�o�u�t� �c�l�a�s�s�=�"�c�h�.�q�o�s�.�l�o�g�b�a�c�k�.�c�l�a�s�s�i�c�.�P�a�t�t�e�r�n�L�a�y�o�u�t�"�>�
    � � � � �<�P�a�t�t�e�r�n�>�
    � � � � � � �%�d�{�H�H�:�m�m�:�s�s�,�S�S�S�}� �[�%�t�h�r�e�a�d�]� �%�-�5�l�e�v�e�l� �%�l�o�g�g�e�r�{�2�2�}� �-� �%�m�s�g�%�n�
    � � � � �<�/�P�a�t�t�e�r�n�>�
    � � �<�/�l�a�y�o�u�t�>�
    �<�/�a�p�p�e�n�d�e�r�>����������Op
    ��K�P���������Op
    ��K�P����>�����Op
    ��K�P���������Op
    ��K�P���������Op
    ��K�P����@�����Ox
    ��K���P���������Ox
    ��K���P����*�����Ox
    ��K���P���������Ox
    ��K���P���������Ox
    ��K���P���������Ox
    ��K���P����8�����Ox
    ��K���P���������Ox
    ��K���P����?���������������	��
    ������
    �������������������������������������� ��!��"��#��$��%��&��'��(��)��*��+��,��-��.��/��0��1��2��3��4��5��6��7��8��9��:��;��<��=��>��?��@��A��B��C��D��E��F��G��H��I��J��K��L��M��N��O��P��Q��R��S��T��U��V��W��X��Y��Z��[��\��]��^��_��`��a��b��c��d��e��f��g��h��i��j��k��l��m��n��o��p��q��r��s��t��u��v��w��x��y��z��{��|��}��~����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Ox
    ��K���P���������Ox
    ��K���P���������Ox
    ��K���P���������Ox
    ��K���P����������������������������9��������������������������������������������������������<������������������������������������������������������������������������������������������������,��������������������������
    ����������������9��������������������������������
    ���������������������������	���������	���������	��9�������	���������	���������	���������	���������	���������	���������	��<�������	���������	���������	���������	���������	���������	���������	���������	���������	���������	���������	���������	��,�������	���������	���������	��
    �������	���������	��9�������	���������	���������	���������	��
    �������	���������	����6������?��������?��
    ������?���������N����
    ���(������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+���������������
    ������������������������������������������-��"
    ���
    ���������,���	���(����	������������
    ����,������d���
    ���,�� ���Z����?z��_����_����������������������������	�?���������� `�������������
    ����
    ��������������8���L�o�g�b�a�c�k�-�a�c�c�e�s�s� �c�o�n�f�i�g�u�r�a�t�i�o�n�����������O�
    ��d��������(�������������	����6�����������@�������	��@��
    �������@����������
    ���,�� ���Z����?z��_����_�����������������������������	�?����������`�P����������������
    f�������������<�a�p�p�e�n�d�e�r� �n�a�m�e�=�"�F�I�L�E�"�	� � � � �
    � � � � � � � � � � � � �c�l�a�s�s�=�"�c�.�q�.�l�.�c�.�r�.�R�o�l�l�i�n�g�F�i�l�e�A�p�p�e�n�d�e�r�"�>�
    � � �<�F�i�l�e�>�a�c�c�e�s�s�.�l�o�g�"�<�/�F�i�l�e�>�
    � � �<�r�o�l�l�i�n�g�P�o�l�i�c�y�
    � � � � � � � � �c�l�a�s�s�=�"�c�.�q�.�l�.�c�.�r�.�T�i�m�e�B�a�s�e�d�R�o�l�l�i�n�g�P�o�l�i�c�y�"�>�
    � � � � �<�F�i�l�e�N�a�m�e�P�a�t�t�e�r�n�>�
    � � � � � � �a�c�c�e�s�s�.�%�d�{�y�y�y�y�-�M�M�-�d�d�}�.�l�o�g�.�z�i�p�
    � � � � �<�/�F�i�l�e�N�a�m�e�P�a�t�t�e�r�n�>�
    � � �<�/�r�o�l�l�i�n�g�P�o�l�i�c�y�>�
    �
    � � �<�l�a�y�o�u�t� �c�l�a�s�s�=�"�c�.�q�.�l�.�a�c�c�e�s�s�.�P�a�t�t�e�r�n�L�a�y�o�u�t�"�>�
    � � � � �<�P�a�t�t�e�r�n�"�>�c�o�m�b�i�n�e�d�<�/�P�a�t�t�e�r�n�"�>�
    � � �<�/�l�a�y�o�u�t�>�
    �<�/�a�p�p�e�n�d�e�r�>����������Ox
    ��K���P����3�����Ox
    ��K���P���������Ox
    ��K���P���������Ox
    ��K���P����2�����Ox
    ��K���P���������Ox
    ��K���P����$�����Ox
    ��K���P���������Ox
    ��K���P���������Ox
    ��K���P���������Ox
    ��K���P����.�����Ox
    ��K���P����"�����Ox
    ��K���P���������Ox
    ��K���P���������Ox
    ��K���P������������������������������������'������������������������������������������������*����������������������������������������������������������������������������������������,��������������������������������
    ������������������z���������	���������	���������	���������	��'�������	���������	���������	���������	���������	���������	��*�������	���������	���������	���������	���������	���������	���������	���������	���������	���������	���������	��,�������	���������	���������	���������	��
    �������	���������	����:���������?��������?��
    ������?���������N����
    ���,������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+��������������
    ������������������������������������������-�����
    ���������0���
    ���(����	������������
    ����0������L���
    ���0�� ���Z����D@z��_����_����������������������������	�?����������� `�������������
    ����
    �������������� ���A�n�o�t�h�e�r� �e�x�a�m�p�l�e�:�����������O�
    ��d��������(�������������	����6�����������@�������	��@��
    �������@�������	���
    ���0�� ���Z����@z��_����_�����������������������������	�?���������� `����������������
    b�������������<�t�e�s�t�S�h�e�l�l� �n�a�m�e�=�"�t�e�s�t�1�"�>�
    � � �<�p�e�r�i�o�d�>�5� �m�i�n�u�t�e�s�<�/�p�e�r�i�o�d�>�
    � � �<�!�-�-� �w�e� �n�e�e�d� �t�o� �c�o�n�f�i�g�u�r�e� �a� �t�o�t�a�l�l�y� �n�e�w� �t�e�s�t� �
    � � � � � � � �o�b�j�e�c�t� �f�o�r� �e�a�c�h� �r�u�n� �o�f� �t�h�e� �t�e�s�t� �-�-�>�
    � � �<�t�e�s�t� �c�l�a�s�s�=�"�c�o�m�.�w�o�m�b�a�t�.�m�y�T�e�s�t�"�>�
    � � � � �<�D�a�t�a�S�o�u�r�c�e� �c�l�a�s�s�=�"�c�.�w�.�J�N�D�I�D�S�"�>�
    � � � � � � �<�u�r�l�>�j�n�d�i�:�/�/�c�o�m�.�w�o�m�b�a�t�/�d�s�"�<�/�u�r�l�>�
    � � � � �<�/�D�a�t�a�S�o�u�r�c�e�>�
    � � �<�/�t�e�s�t�>�
    �<�t�e�s�t�S�h�e�l�l�>�
    �
    �<�t�e�s�t�S�h�e�l�l� �n�a�m�e�=�"�t�e�s�t�2�"�>�
    � � �<�p�e�r�i�o�d�>�6�0� �s�e�c�o�n�d�s�<�/�p�e�r�i�o�d�>�
    � � �<�t�e�s�t� �c�l�a�s�s�=�"�c�o�m�.�w�o�m�b�a�t�.�m�y�T�e�s�t�2�"�>�
    � � � � �<�f�i�l�e�>�c�:�/�w�o�m�b�a�t�/�f�o�o�.�p�r�o�p�e�r�t�i�e�s�<�/�f�i�l�e�>�
    � � �<�/�t�e�s�t�>�
    �<�/�t�e�s�t�S�h�e�l�l�>����������Op
    ��K�P���������Op
    ��K�P����0�����Op
    ��K�P����+�����Op
    ��K�P����#�����Op
    ��K�P����$�����Op
    ��K�P����'�����Op
    ��K�P���������Op
    ��K�P����
    �����Op
    ��K�P���������Op
    ��K�P���������Op
    ��K�P���������Op
    ��K�P���������Op
    ��K�P����$�����Op
    ��K�P����*�����Op
    ��K�P����
    �����Op
    ��K�P����
    �����Op
    ��K�P������������������������������������.����������������$����������������!���������������� ����������������!����������������������������������������������������������������������������������������"����������������&������������������������
    �������������������	���������	���������	���������	��.�������	���������	��$�������	���������	��!�������	���������	�� �������	���������	��!�������	���������	���������	���������	���������	���������	���������	���������	���������	���������	���������	��"�������	���������	��&�������	���������	���������	��
    �������	����6������?��������?��
    ������?���������N����
    ���0������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+�����:���������
    ���������	���������������������������������-��\���T���������4������(����	������������
    ����4������J���
    ���4�� ���Z����Az��_����_����������������������������	�?����������  `�������������
    ����
    �������������� ���I�s� �J�o�r�a�n� �f�o�r� �m�e�?�����������O�
    ��d���������������������	����6�����������@�������	��@��
    �������@�������\���
    ���4�� ���Z����dAz��_����_�����������������������������	�?���������� `p����������������
    ��������������
    �J�o�r�a�n� �i�s� �i�d�e�a�l� �f�o�r� �b�u�i�l�d�i�n�g� �f�r�a�m�e�w�o�r�k�s� �w�h�i�c�h� �n�e�e�d� �t�o� �s�u�p�p�o�r�t� �a�r�b�i�t�r�a�r�y� �u�s�e�r�-�d�e�v�e�l�o�p�e�d� �p�l�u�g�-�i�n�s�.�
    ���l��������`
    ��n�K���}���`�����`
    ��n�K���}��������`
    ��n�K���}����������`����������������*����������	��`�������	���������	����6������>��~������>��~
    ������>��~��������N����
    ���4������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+�����N���������
    ���������
    ���������������������������������-��p���h���������8������(����	������������
    ����8������X���
    ���8�� ���Z����Az��_����_����������������������������	�?����������  `�������������
    ����
    ��������������0���C�o�n�f�i�g�u�r�a�t�i�o�n� �i�n� �G�r�o�o�v�y� ������������
    �����������������������	����6�����������@�������	��@��
    �������@�������t���
    ���8�� ���Z����$Bz��_����_�����������������������������	�?����������n�#����������������
    �����������:��S�h�o�r�t�e�r�,� �m�o�r�e� �c�o�n�s�i�s�t�e�n�t� �s�y�n�t�a�x�
    �
    �A�n� �i�n�-�l�a�n�g�u�a�g�e� �D�S�L� �=�>� �m�o�r�e� �e�x�p�r�e�s�s�i�v�e� �p�o�w�e�r�
    �
    �A�u�t�o�m�a�t�i�c� �t�r�a�n�s�l�a�t�i�o�n� �t�o�o�l� �f�r�o�m� �l�o�g�b�a�c�k�.�x�m�l� �t�o� �l�o�g�b�a�c�k�.�g�r�o�o�v�y� �a�v�a�i�l�a�b�l�e� �o�n�l�i�n�e�
    ������ ����� 
    ��n�K���}������ 
    ��n�K���}�,����� 
    ��n�K���}������ 
    ��n�K���}�O����� 
    ��n�K���}������ 
    ��n�K���}� ��������������&���������������������O����������������b��� �������	���������	��&�������	���������	���������	��O�������	���������	����6������>��~������>��~
    ������>��~��������<����
    ���8�����c�$����������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' ������������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+�����	���������
    ������������������������������������������-��������������<������(����	������������
    ����<������^���
    ���<�� ���Z����Bz��_����_����������������������������	�?����������  `�������������
    ����
    ��������������6���E�x�a�m�p�l�e� �l�o�g�b�a�c�k�.�g�r�o�o�v�y� �f�i�l�e������������
    �����������������������	����6�����������@�������	��@��
    �������@���������
    ���<���
    ���T����Bz��_��ȯ���_��ȯ����������������������������	�?���������C
    �
    ^��������������i�m�p�o�r�t� �c�h�.�q�o�s�.�l�o�g�b�a�c�k�.�c�l�a�s�s�i�c�.�e�n�c�o�d�e�r�.�P�a�t�t�e�r�n�L�a�y�o�u�t�E�n�c�o�d�e�r�
    �i�m�p�o�r�t� �c�h�.�q�o�s�.�l�o�g�b�a�c�k�.�c�o�r�e�.�F�i�l�e�A�p�p�e�n�d�e�r�
    �
    �i�m�p�o�r�t� �s�t�a�t�i�c� �c�h�.�q�o�s�.�l�o�g�b�a�c�k�.�c�l�a�s�s�i�c�.�L�e�v�e�l�.�D�E�B�U�G�
    �
    �a�p�p�e�n�d�e�r�(�"�F�I�L�E�"�,� �F�i�l�e�A�p�p�e�n�d�e�r�)� �{�
    � � �f�i�l�e� �=� �"�t�e�s�t�F�i�l�e�.�l�o�g�"�
    � � �a�p�p�e�n�d� �=� �t�r�u�e�
    � � �e�n�c�o�d�e�r�(�P�a�t�t�e�r�n�L�a�y�o�u�t�E�n�c�o�d�e�r�)� �{�
    � � � � �p�a�t�t�e�r�n� �=� �"�%�-�r� �[�%�t�h�r�e�a�d�]� �%�-�5�l�e�v�e�l� �%�l�o�g�g�e�r�{�3�5�}� �-� �%�m�s�g�%�n�"�
    � � �}�
    �}�
    �r�o�o�t�(�D�E�B�U�G�,� �[�"�F�I�L�E�"�]�)���P��;����������(��������������������1��������������������!������������������������������"����������<����������������������������������������;�������(��������������1��������������!������������������������������������������ ��������������8����������������������������������������;�������	��(�������	���������	��1�������	���������	��!�������	���������	���������	���������	���������	���������	�� �������	���������	��8�������	���������	���������	���������	���������	����6�����������@�������	��@��
    �������@�������<����
    ���<�����c�$����������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' ������������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+��������������
    ������������������������������������������-��<���4���������@������(����	������������
    ����@������Z���
    ���@�� ���Z����DCz��_����_����������������������������	�?����������  `�������������
    ����
    ��������������0���I�n�t�e�r�n�a�l� �e�r�r�o�r� �r�e�p�o�r�t�i�n�g�����������O�
    ��d���������������������	����6�����������@�������	��@��
    �������@�������,���
    ���@�� ���Z����Cz��_����_�����������������������������	�?���������� `����������������
    ��������������W�h�o� �s�h�a�l�l� �g�u�a�r�d� �t�h�e� �g�u�a�r�d�s�?�
    �
    �L�o�g�b�a�c�k� �m�o�d�u�l�e�s� �c�a�n�n�o�t� �u�s�e� �l�o�g�g�i�n�g� �t�o� �r�e�p�o�r�t� �t�h�e�i�r� �o�w�n� �s�t�a�t�e�.�
    �
    �S�o�m�e�t�h�i�n�g� �m�o�r�e� �g�e�n�e�r�i�c� �i�s� �n�e�e�d�e�d�.�
    �����������`
    ��n�K���}��������`
    ��n�K���}���>�����`
    ��n�K���}��������`
    ��n�K���}���"�����`
    ��n�K���}��������`
    ��n�K���}�����������������>��������������"����������������T����������	���������	��>�������	���������	��"�������	���������	����6������>��~������>��~
    ������>��~��������N����
    ���@������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+��������������
    ���������
    ���������������������������������-�������������D���d���(����	������������
    ����D������J���
    ���D�� ���Z����Dz��_����_����������������������������	�?����������  `�������������
    ����
    �������������� ���E�r�r�o�r�s� �i�n� �a�c�t�i�o�n�����������O�
    ��d���������������������	����6�����������@�������	��@��
    �������@����������
    ���D�� ���Z����dDz��_����_�����������������������������	�?���������� `p����������������
    8�������������
    �I�n�t�e�r�n�a�l� �s�t�a�t�e� �a�v�a�i�l�a�b�l�e� �v�i�a� �S�t�a�t�u�s�M�a�n�a�g�e�r�
    �
    �E�x�c�e�p�t�i�o�n�s� �a�n�d� �s�t�a�t�u�s� �m�e�s�s�a�g�e�s� �a�c�c�o�m�p�a�n�i�e�d� �b�y� �r�e�f�e�r�e�n�c�e�s�,� �i�.�e�.� �U�R�L�s�,� �t�o� �e�x�t�e�r�n�a�l� �d�o�c�u�m�e�n�t�s�����������`
    ��n�K���}���+�����`
    ��n�K���}��������`
    ��n�K���}���[�����`
    ��n�K���}����������+��������������[���������8����������	��+�������	���������	��[�������	����6������>��~������>��~
    ������>��~��������N����
    ���D������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+�����.���������
    ������������������������������������������-��P���H�� ������H������(����	������������
    ����H������0���
    ���H�� ���Z����Dz��_����_����������������������������	�?����������  `�������������
    ����
    �����������������J�M�X�����������O�
    ��d���������������������	����6�����������@�������	��@��
    �������@�������j���
    ���H�� ���Z����$Ez��_����_�����������������������������	�?���������� `p����������������
    ��������������
    �L�o�g�b�a�c�k� �c�o�n�f�i�g�u�r�a�t�i�o�n� �c�a�n� �b�e� �r�e�l�o�a�d�e�d� �v�i�a� �J�M�X�
    �
    �S�t�a�t�i�s�t�i�c�a�l� �r�e�s�u�l�t�s� �e�x�p�o�s�e�d� �v�i�a� �J�M�X�����������O`
    ��K����.�����`
    ��n�K���}��������`
    ��n�K���}���$�����`
    ��n�K���}����������.��������������$���������8����������	��.�������	���������	��$�������	����6������?��������?��
    ������?���������N����
    ���H������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+�����
    ���������
    ������������������������������������������-��,���$��0������L������(����	������������
    ����L������D���
    ���L�� ���Z����Ez��_����_����������������������������	�?����������  ``�������������
    ����
    �����������������D�o�c�u�m�e�n�t�a�t�i�o�n�����������O�
    ��d�������������������������6�����������@�������	��@��
    �������@�������2���
    ���L�� ���Z����Ez��_����_�����������������������������	�?�����������0����������������
    �������������M�a�j�o�r� �a�r�e�a� �o�f� �e�f�f�o�r�t�.�
    �
    �C�o�m�p�l�e�t�e� �m�a�n�u�a�l�,� �w�i�t�h� �o�v�e�r� �1�5�0� �p�a�g�e�s� �o�f� �d�o�c�u�m�e�n�t�a�t�i�o�n�,� �i�s� �a�v�a�i�l�a�b�l�e� �f�o�r� �f�r�e�e�
    �
    �A� �s�h�o�r�t� �i�n�t�r�o�d�u�c�t�i�o�n� �t�o� �a�c�c�e�s�s� �l�o�g�g�i�n�g� �w�i�t�h� �l�o�g�b�a�c�k�-�a�c�c�e�s�s� �a�n�d� �J�e�t�t�y�
    �
    �j�a�v�a�d�o�c�,� �F�A�Q�,� �e�r�r�o�r� �c�o�d�e�s�,�& 
    ���0�������`
    ��n�K���}��������`
    ��n�K���}���M�����`
    ��n�K���}��������`
    ��n�K���}���E�����`
    ��n�K���}��������`
    ��n�K���}��������`
    ��n�K���}��������`
    ��n�K���}�����������������M��������������E������������������������������p����������	���������	��M�������	���������	��E�������	���������	���������	���������	����6������>��~������>��~
    ������>��~��������N����
    ���L������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+��������������
    ������������������������������������������-��(��� ��@������P������(����	������������
    ����P������t���
    ���P�� ���Z����DFz��_����_����������������������������	�?����������  `�������������
    ����
    ��������������H���F�i�l�t�e�r�s�,� �F�i�l�t�e�r�s�.� �F�i�l�t�e�r�s� �e�v�e�r�y�w�h�e�r�e������%�����O�
    ��d��%������(������%�������	����6�����������@�������	��@��
    �������@����������
    ���P�� ���Z����Fz��_����_�����������������������������	�?���������� 0����������������
    \�����������2��F�i�l�t�e�r�s� �a�t�t�a�c�h�a�b�l�e� �t�o� �a�n�y� �A�p�p�e�n�d�e�r�
    �E�v�a�l�u�a�t�o�r� �f�i�l�t�e�r�s�
    �J�a�n�i�n�o� �f�i�l�t�e�r�s� �f�o�r� �e�v�a�l�u�a�t�i�o�n� �b�a�s�e�d� �o�n� �j�a�v�a� �e�x�p�r�e�s�s�i�o�n�s�
    �T�u�r�b�o�F�i�l�t�e�r�s� �f�o�r� �o�p�t�i�m�i�z�e�d� �g�l�o�b�a�l� �p�r�o�c�e�s�s�i�n�g������#�����`
    ��n�K���}��������`
    ��n�K���}���8�����`
    ��n�K���}���-�����`
    ��n�K���}���#��������������8�������-���������8���#�������	���������	��8�������	��-�������	����6������>��~������>��~
    ������>��~��������N����
    ���P������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+�����
    ���������
    ������������������������������������������-��@���8��P������T���
    ���(����	������������
    ����T������p���
    ���T�� ���Z����Gz��_����_����������������������������	�?����������  `0�������������
    ����
    ��������������0���E�v�a�l�u�a�t�o�r�F�i�l�t�e�r� �&� �J�a�n�i�n�o��� ��������O�
    ��d�������������������������������������	����6�����������@�������	��@��
    �������@�������	���
    ���T�� ���Z����dGz��_����_�����������������������������	�?����������`�P����������������
    x�����������r��<�a�p�p�e�n�d�e�r� �n�a�m�e�=�"�C�Y�C�L�I�C�"�
    � � � � � � � � � � �c�l�a�s�s�=�"�c�.�q�.�l�.�c�o�r�e�.�r�e�a�d�.�C�y�c�l�i�c�B�u�f�f�e�r�A�p�p�e�n�d�e�r�"�>�
    � � �<�f�i�l�t�e�r� �c�l�a�s�s�=�"�c�.�q�.�l�.�c�o�r�e�.�f�i�l�t�e�r�.�E�v�a�l�u�a�t�o�r�F�i�l�t�e�r�"�>�
    � � � � �<�e�v�a�l�u�a�t�o�r� �n�a�m�e�=�"�l�o�g�g�i�n�g�T�a�s�k�E�v�a�l�"�>�
    �	� � � � �<�e�x�p�r�e�s�s�i�o�n�>�
    �	�	� � �i�f�(�l�o�g�g�e�r�.�c�o�n�t�a�i�n�s�(�"�L�o�g�g�i�n�g�T�a�s�k�"�)�)�
    � � � � � � � � �m�e�s�s�a�g�e�.�c�o�n�t�a�i�n�s�(�"�H�o�w�d�y�d�y�-�d�i�d�d�l�y�-�h�o�"�)� �&�&�
    � � � � � � � � �(�t�i�m�e�S�t�a�m�p�-�l�o�g�g�e�r�C�o�n�t�e�x�t�.�g�e�t�B�i�r�t�h�T�i�m�e�(�)�)� �>�=� �2�0�0�0�0�
    �	�	�<�/�e�x�p�r�e�s�s�i�o�n�>�
    �	� �<�/�e�v�a�l�u�a�t�o�r�>�
    �	� �<�O�n�M�a�t�c�h�>�D�E�N�Y�<�/�O�n�M�a�t�c�h�>�
    � � �<�/�f�i�l�t�e�r�>�
    � � �<�M�a�x�S�i�z�e�>�5�1�2�<�/�M�a�x�S�i�z�e�>�
    �<�/�a�p�p�e�n�d�e�r�>����������Op
    ��K�P����8�����Op
    ��K�P����5�����Op
    ��K�P����'�����Op
    ��K�P���������Ox
    ��K���P����'�����Ox
    ��K���P����1�����Ox
    ��K���P����:�����Ox
    ��K���P���������Ox
    ��K���P���������Ox
    ��K���P���������Ox
    ��K���P���������Ox
    ��K���P���������Ox
    ��K���P���������Ox
    ��K���P������������
    ��������.����������������3����������������#������������������������
    ��������������������������������#����������������)����������������2������������������������������������������������
    ����������������������������������������
    ���������������������������������������������
    ���������.������������������3������������������#���������������������������
    ������������������������������������#������������������)������������������2������������������������������������������������������
    ���������������������������������������������
    ��������������������������������������6������?��������?��
    ������?���������N����
    ���T������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+��������������
    ������������������������������������������-�������`������X���>���(����	������������
    ����X������B���
    ���X�� ���Z����Gz��_����_����������������������������	�?����������  `�������������
    ����
    �����������������T�u�r�b�o�F�i�l�t�e�r�s������
    �����O�
    ��d��
    ������������
    �������	����6�����������@�������	��@��
    �������@����������
    ���X�� ���Z����$Hz��_����_�����������������������������	�?����������`����������������
    �����������0��<�t�u�r�b�o�F�i�l�t�e�r�
    � � � � � �c�l�a�s�s�=�"�c�.�q�.�l�.�c�l�a�s�s�i�c�.�t�u�r�b�o�.�M�D�C�F�i�l�t�e�r�"�>�
    � � �<�M�D�C�K�e�y�>�u�s�e�r�i�d�<�/�M�D�C�K�e�y�>�
    � � �<�V�a�l�u�e�>�s�e�b�a�s�t�i�e�n�<�/�V�a�l�u�e�>�
    � � �<�O�n�M�a�t�c�h�>�A�C�C�E�P�T�<�/�O�n�M�a�t�c�h�>�
    �<�/�t�u�r�b�o�F�i�l�t�e�r�>������
    �����Op
    ��K�Z����,�����Op
    ��K�Z���������Op
    ��K�d���������Op
    ��K�d���������Op
    ��K�d���������Op
    ��K�d����
    ����������������'���������������������������������������������������������������������
    �������	���������	��'�������	���������	���������	���������	���������	���������	���������	���������	����6������?��������?��
    ������?���������N����
    ���X������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+�����d	���������
    ������������������������������������������-�����~��p������\������(����	������������
    ����\������T���
    ���\�� ���Z����Hz��_����_����������������������������	�?���������� `��������������
    ����
    ��������������*���P�a�r�a�m�e�t�e�r�i�z�e�d� �l�o�g�g�i�n�g�����������O�
    ��d���������������������	����6�����������@�������	��@��
    �������@�������|���
    ���\�� ���Z����Hz��_����_�����������������������������	�?�����������~����������������
    �������������I�n�t�e�g�e�r� �e�n�t�r�y� �=� �n�e�w� �I�n�t�e�r�g�e�r�(�5�0�)�;� �
    �l�o�g�g�e�r�.�d�e�b�u�g�(�"�T�h�e� �e�n�t�r�y� �i�s� �"�+�e�n�t�r�y�+�"�.�"�)�;�
    �
    �c�a�n� �b�e� �o�p�t�i�m�i�z�e�d� �a�s�:�
    � �i�f�(�l�o�g�g�e�r�.�i�s�D�e�b�u�g�E�n�a�b�l�e�d�(�)�)� �{�
    � �l�o�g�g�e�r�.�d�e�b�u�g�(�"�T�h�e� �e�n�t�r�y� �i�s� �"�+�e�n�t�r�y�+�"�.�"�)�;�
    �}�
    �
    �o�r� �b�e�t�t�e�r� �y�e�t�:�
    �l�o�g�g�e�r�.�d�e�b�u�g�(�"�T�h�e� �e�n�t�r�y� �i�s� �{�}�.�"�,� �e�n�t�r�y�)�;� �
    �����#�����Op
    ��K�Z����)�����Op
    ��K�Z���������Op
    ��K�Z���������Op
    ��K�Z���������Op
    ��K�Z����*�����Op
    ��K�Z���������Op
    ��K�Z���������Op
    ��K�Z���������Op
    ��K�Z����*�����Op
    ��K�Z���������Op
    ��K�Z����#��������
    ���������������������������������������������������������������)�����������������������������������������������
    ���������������������#�������	��
    �������	���������	���������	���������	���������	���������	���������	���������	��)�������	���������	���������	���������	���������	���������	��
    �������	���������	����6������?��������?��
    ������?���������N����
    ���\������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+��������������
    ������������������������������������������-��4���,��������`������(����	������������
    ����`������j���
    ���`�� ���Z����DIz��_����_����������������������������	�?�����������0 �������������
    ����
    ��������������@���M�a�r�k�e�r�s� �f�o�r� �s�p�e�c�i�a�l�i�z�e�d� �h�a�n�d�l�i�n�g������!�����O�
    ��d��!������������!�������	����6�����������@�������	��@��
    �������@����������
    ���`�� ���Z����Iz��_����_�����������������������������	�?���������� `p����������������
    r��������������M�a�r�k�e�r�s� �a�r�e� �m�e�t�a�d�a�t�a� �f�o�r� �l�o�g�g�i�n�g� �s�t�a�t�e�m�e�n�t�s�,� �c�o�l�o�r�i�n�g� �t�h�e�m� �f�o�r� �s�p�e�c�i�a�l�i�z�e�d� �p�r�o�c�e�s�s�i�n�g�
    ���H���V�����`
    ��n�K���}��������`
    ��n�K���}���V�������������������V�������	���������	����6������>��~������>��~
    ������>��~��������N����
    ���`������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+��������������
    ������������������������������������������-�������������d���:���(����	������������
    ����d���������
    ���d�� ���Z����Jz��_����_����������������������������	�?���������� `>�������������
    ����
    ��������������^���S�i�f�t�i�n�g�A�p�p�e�n�d�e�r� �o�r� �t�h�e� �a�p�p�e�n�d�e�r�-�m�a�k�i�n�g� �a�p�p�e�n�d�e�r������0�����O�
    ��d��0������(������0�������	����6�����������@�������	��@��
    �������@�������p���
    ���d�� ���Z����dJz��_����_�����������������������������	�?���������� `p����������������
    �������������S�i�f�t� �l�o�g�g�i�n�g� �a�c�c�o�r�d�i�n�g� �t�o� �r�u�n�t�i�m�e� �a�t�t�r�i�b�u�t�e�s�
    �E�.�g�.� �s�e�p�a�r�a�t�e� �l�o�g�s� �a�c�c�o�r�d�i�n�g� �t�o� �u�s�e�r� �s�e�s�s�i�o�n�s�,� �s�o� �t�h�a�t� �t�h�e� �l�o�g� �f�i�l�e� �g�e�n�e�r�a�t�e�d� �b�y� �e�v�e�r�y� �u�s�e�r� �g�o� �i�n�t�o� �d�i�s�t�i�n�c�t� �l�o�g� �f�i�l�e�s�,� �o�n�e� �l�o�g� �f�i�l�e� �p�e�r� �u�s�e�r�.� �
    �W�o�r�k�s� �w�i�t�h� �a�n�y� �a�p�p�e�n�d�e�r�,� �n�o�t� �j�u�s�t� �F�i�l�e�A�p�p�e�n�d�e�r���l���-�����`
    ��n�K���}��������`
    ��n�K���}���/�����`
    ��n�K���}���-��������������/���������*���-�������	�����������/�������	����6������>��~������>��~
    ������>��~��������N����
    ���d������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' ������������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+�����z���������
    ������������������������������������������-�������������h���&���(����	������������
    ����h������b���
    ���h�� ���Z����Jz��_����_����������������������������	�?�����������0�������������
    ����
    ��������������6���S�i�f�t�i�n�g�A�p�p�e�n�d�e�r� �(�c�o�n�t�i�n�u�e�d�)�����������O�
    ��d��������(�������������	����6�����������@�������	��@��
    �������@�������
    ���
    ���h�� ���Z����$Kz��_����_�����������������������������	�?����������``�����������������
    	������������� �<�a�p�p�e�n�d�e�r� �n�a�m�e�=�"�S�I�F�T�"� �c�l�a�s�s�=�"�c�h�.�q�o�s�.�l�o�g�b�a�c�k�.�c�l�a�s�s�i�c�.�s�i�f�t�.�S�i�f�t�i�n�g�A�p�p�e�n�d�e�r�"�>�
    � � � � �<�d�i�s�c�r�i�m�i�n�a�t�o�r�>�
    � � � � � � �<�K�e�y�>�u�s�e�r�i�d�<�/�K�e�y�>�
    � � � � � � �<�D�e�f�a�u�l�t�V�a�l�u�e�>�u�n�k�n�o�w�n�<�/�D�e�f�a�u�l�t�V�a�l�u�e�>�
    � � � � �<�/�d�i�s�c�r�i�m�i�n�a�t�o�r�>�
    � � � � �<�s�i�f�t�>�
    � � � � � � �<�a�p�p�e�n�d�e�r� �n�a�m�e�=�"�F�I�L�E�-�$�{�u�s�e�r�i�d�}�"��
    � � � � � � � � � � � � � � � � �c�l�a�s�s�=�"�c�h�.�q�o�s�.�l�o�g�b�a�c�k�.�c�o�r�e�.�F�i�l�e�A�p�p�e�n�d�e�r�"�>�
    � � � � � � � � �<�F�i�l�e�>�$�{�u�s�e�r�i�d�}�.�l�o�g�<�/�F�i�l�e�>�s�
    � � � � � � � � �<�A�p�p�e�n�d�>�f�a�l�s�e�<�/�A�p�p�e�n�d�>�
    � � � � � � � � �<�l�a�y�o�u�t�>�
    � � � � � � � � � � �<�P�a�t�t�e�r�n�>�%�d� �%�l�e�v�e�l� �%�m�d�c� �%�l�o�g�g�e�r� �-� �%�m�s�g�%�n�<�/�P�a�t�t�e�r�n�>�
    � � � � � � � � �<�/�l�a�y�o�u�t�>�
    � � � � � � �<�/�a�p�p�e�n�d�e�r�>�
    � � � � �<�/�s�i�f�t�>�
    � � �<�/�a�p�p�e�n�d�e�r�>�
    ���x��L�����Op
    ��K�P���������Op
    ��K�P���������Op
    ��K�P����+�����Op
    ��K�P���������Op
    ��K�P���������Op
    ��K�P����'�����Op
    ��K�P����:�����Op
    ��K�P����$�����Op
    ��K�P���������Op
    ��K�P���������Op
    ��K�P����=�����Op
    ��K�P���������Op
    ��K�P���������Op
    ��K�P���������Op
    ��K�P���������Op
    ��K�P���������Op
    ��K�P������������K�������������������������������������������������f����������������%�����������������������������������������f�������������������������f����������������*���������������������������������f	��������������������������������	��������
    ��������3����������������
    �����������������������������������������f��������������������������"�����������K������������������������������������������������������������������������%������������������������������������������������������������������������������������������*������������������������������������	������������������������������������	���������
    ���������3������������������
    ��������������������������������������������������������������������������6������?��������?��
    ������?���������N����
    ���h������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' ������������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+�����:���������
    ������������������������������������������-��\���T��������l������(����	������������
    ����l������F���
    ���l�� ���Z����Kz��_����_����������������������������	�?����������  `�������������
    ����
    �����������������T�e�s�t�e�d� �&� �R�e�a�d�y�����������O�
    ��d���������������������	����6�����������@�������	��@��
    �������@�������`���
    ���l�� ���Z����Kz��_����_�����������������������������	�?���������� `p����������������
    ��������������B�a�t�t�e�r�y� �o�f� �o�v�e�r� �4�5�0� �u�n�i�t� �t�e�s�t�s�
    �
    �T�e�s�t�s� �w�r�i�t�t�e�n� �c�o�n�c�o�m�i�t�a�n�t�l�y� �w�i�t�h� �t�h�e� �c�o�d�e�
    �����������`
    ��n�K���}��������`
    ��n�K���}���*�����`
    ��n�K���}��������`
    ��n�K���}�����������������*����������������8����������	���������	��*�������	���������	����6������>��~������>��~
    ������>��~��������N����
    ���l������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+�����4
    ���������
    ������������������������������������������-��V���N��������p������(����	������������
    ����p������l���
    ���p�� ���Z����DLz��_����_����������������������������	�?����������  `�������������
    ����
    ��������������@���P�a�c�k�a�g�e� �v�e�r�s�i�o�n�s� �i�n� �s�t�a�c�k� �t�r�a�c�e�s������!�����O�
    ��d��!������(������!�������	����6�����������@�������	��@��
    �������@�������4���
    ���p�� ���Z����Lz��_����_�����������������������������	�?������������`p����������������
    �������������j�a�v�a�.�l�a�n�g�.�N�u�l�l�P�o�i�n�t�e�r�E�x�c�e�p�t�i�o�n�
    � �a�t� �c�o�m�.�x�y�z�.�W�o�m�b�a�t�(�W�o�m�b�a�t�.�j�a�v�a�:�5�7�)� �~�[�w�o�m�b�a�t�-�1�.�3�.�j�a�r�:�1�.�3�]�
    � �a�t� �c�o�m�.�x�y�z�.�W�o�m�b�a�t�(�W�o�m�b�a�t�.�j�a�v�a�:�7�6�)� �~�[�w�o�m�b�a�t�-�1�.�3�.�j�a�r�:�1�.�3�]�
    � �a�t� �s�u�n�.�r�e�f�l�e�c�t�.�N�a�t�i�v�e�M�e�t�h�o�d�A�c�c�e�s�s�o�r�I�m�p�l�.�i�n�v�o�k�e�0�(�N�a�t�i�v�e�)� �~�[�n�a�:�1�.�5�.�0�_�0�6�]�
    � �a�t� �j�a�v�a�.�l�a�n�g�.�r�e�f�l�e�c�t�.�M�e�t�h�o�d�.�i�n�v�o�k�e�(�M�e�t�h�o�d�.�j�a�v�a�:�5�8�5�)� �~�[�n�a�:�1�.�5�.�0�_�0�6�]�
    � �a�t� �j�u�n�i�t�.�r�u�n�n�e�r�s�.�T�e�s�t�M�e�t�h�o�d�.�i�n�v�o�k�e�(�T�e�s�t�M�e�t�h�o�d�.�j�a�v�a�:�5�9�)� �[�j�u�n�i�t�-�4�.�4�.�j�a�r�:�n�a�]�
    � �e�t�c�.�.���d�������Op
    ��K�d����9�����Op
    ��K�d����9�����Op
    ��K�d����H�����Op
    ��K�d����D�����Op
    ��K�d����K�����Op
    ��K�d���������Op
    ��K�d��������������������"����������������������������������8����������������G����������������C����������������7��������������������������������������������	���������	��"�������	���������	���������	���������	��8�������	���������	��G�������	���������	��C�������	���������	��7�������	���������	���������	���������	����F������?��������?��
    ������?������������H�����N����
    ���p������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+��������������
    ������������������������������������������-�������������t���T���(����	������������
    ����t������Z���
    ���t�� ���Z����Mz��_����_����������������������������	�?����������  `�������������
    ����
    ��������������0���l�o�g�g�e�r� �n�a�m�e� �a�b�b�r�e�v�i�a�t�i�o�n�����������O�
    ��d���������������������	����6�����������@�������	��@��
    �������@����������l����	��������/��
    ���
    ���t�����������#�"��������������.��.��������0
    �J���
    ���t��
    ���T����dMz��_�����_���������������������"""��������	����������� �����
    �������������(���C�o�n�v�e�r�s�i�o�n� �s�p�e�c�i�f�i�e�r���&��������Op
    ��K�]��������������������������	����6�����������@�������	��@��
    �������@����������
    ���t��
    ���T����Mz��_�����_���������������������"""��������	������ ����0�����
    �������������,���D�i�s�p�l�a�y�e�d� �l�o�g�g�e�r� �n�a�m�e�
    ���L��������Op
    ��K�]���������Op
    ��K�]������������������������������������	���������	����6�����������@�������	��@��
    �������@�������d���
    ���t��
    ���T����$Nz��_��G��_�����������������������������	����������� ��	���
    ����������������%�l�o�g�g�e�r� �
    ���H���	�����Op
    ��K�]���������Op
    ��K�]����	�������������������������	�������	���������	����6�����������@�������	��@��
    �������@�������V���
    ���t��
    ���T����Nz��_��hN��_�����������������������������	������ ����0��	���
    �������������4���m�a�i�n�P�a�c�k�a�g�e�.�s�u�b�.�s�a�m�p�l�e�.�B�a�r���&��������Op
    ��K�Y���������������������������	����6�����������@�������	��@��
    �������@�������6���
    ���t��
    ���T����Nz��_��G��_�����������������������������	���������	�� ��
    ���
    ����������������%�l�o�g�g�e�r�{�1�5�}���$��������Op
    ��K�]��������������������������	����6�����������@�������	��@��
    �������@�������>���
    ���t��
    ���T����DOz��_��hN��_�����������������������������	������ ��	��0��
    ���
    ����������������m�.�s�.�s�a�m�p�l�e�.�B�a�r���&��������Op
    ��K�Y���������������������������	����6�����������@�������	��@��
    �������@�������T���B
    ���	t��
    ��c�$���D�������p5���
    �?���������������� �����T���B
    ���
    t��
    ��c�$���D�������p5���
    �?����������� ����0�����T���B
    ���t��
    ��c�$���D����������
    �?���������������� �����T���B
    ���t��
    ��c�$���D����������
    �?����������� ����0�����T���B
    ���
    t��
    ��c�$���D����������
    �?��������������	�� ��	���T���B
    ���t��
    ��c�$���D����������
    �?����������� ��	��0��	���T���B
    ���t��
    ��c�$���D�������p5���
    �?��������������
    �� ��
    ���T���B
    ���t��
    ��c�$���D�������p5���
    �?����������� ��
    ��0��
    ���T���B
    ���t��
    ��c�$���D�������p5���
    �?����������������������T���B
    ���t��
    ��c�$���D�������p5���
    �?�������������������	���T���B
    ���t��
    ��c�$���D�������p5���
    �?��������������	�����
    ���T���B
    ���t��
    ��c�$���D����������
    �?����������� ���� �����T���B
    ���t��
    ��c�$���D����������
    �?����������� ���� ��	���T���B
    ���t��
    ��c�$���D����������
    �?����������� ��	�� ��
    ���T���B
    ���t��
    ��c�$���D�������p5���
    �?�����������0����0�����T���B
    ���t��
    ��c�$���D�������p5���
    �?�����������0����0��	���T���B
    ���t��
    ��c�$���D�������p5���
    �?�����������0��	��0��
    ���N����
    ���t������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+��������������
    ������������������������������������������-�������������x������(����	������������
    ����x������D���
    ���x�� ���Z����Oz��_����_����������������������������	�?����������  `�������������
    ����
    �����������������O�d�d�s� �a�n�d� �e�n�d�s�����������O�
    ��d���������������������	����6�����������@�������	��@��
    �������@����������
    ���x�� ���Z����Pz��_����_�����������������������������	�?����������� ����������������
    b�������������R�o�l�l�i�n�g�F�i�l�e�A�p�p�e�n�d�e�r� �a�u�t�o�m�a�t�i�c� �f�i�l�e� �c�o�m�p�r�e�s�s�i�o�n� �t�h�e� �b�a�c�k�g�r�o�u�n�d�
    �F�i�l�e�A�p�p�e�n�d�e�r� �a�n�d� �R�o�l�l�i�n�g�F�i�l�e�A�p�p�e�n�d�e�r� �a�l�l�o�w� �f�o�r� �t�h�e� �s�a�m�e� �l�o�g� �f�i�l�e� �t�o� �b�e� �w�r�i�t�t�e�n� �t�o� �b�y� �i�n�s�t�a�n�c�e�s� �l�o�c�a�t�e�d� �i�n� �d�i�f�f�e�r�e�n�t� �J�V�M�s�
    �1�0� �f�o�l�d� �i�m�p�r�o�v�e�m�e�n�t� �i�n� �t�h�e� �s�p�e�e�d� �o�f� �t�r�a�n�s�p�o�r�t�i�n�g� �l�o�g�g�i�n�g� �e�v�e�n�t�s� �o�v�e�r� �t�h�e� �w�i�r�e� �
    �S�M�T�P�A�p�p�e�n�d�e�r� �n�o�w� �d�o�e�s� �T�L�S� �a�n�d� �S�S�L�,� �s�u�b�j�e�c�t� �l�i�n�e� �i�n� �o�u�t�g�o�i�n�g� �e�m�a�i�l� �n�o�w� �b�a�s�e�d� �o�n� �P�a�t�t�e�r�n�L�a�y�o�u�t�
    �
    ������>�����`
    ��n�K���}���y�����`
    ��n�K���}���O�����`
    ��n�K���}���]�����`
    ��n�K���}��������`
    ��n�K���}��������`
    ��n�K���}���>�������y�������O�������]�����������������������T���>�������	��y�������	��O�������	��]�������	���������	���������	����6������>��~������>��~
    ������>��~��������N����
    ���x������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+��������������
    ������������������������������������������-�������������|���d���(����	������������
    ����|������J���
    ���|�� ���Z����dPz��_����_����������������������������	�?����������  ``�������������
    ����
    �������������� ���O�d�d�s� �a�n�d� �e�n�d�s� �I�I�����������O�
    ��d���������������������	����6�����������@�������	��@��
    �������@����������
    ���|�� ���Z����Pz��_����_�����������������������������	�?�����������
    ����������������
    8��������������%�(�)� �i�n� �p�a�t�t�e�r�n� �s�t�r�i�n�g�s� �c�a�n� �d�o� �m�a�g�i�c�
    � �%�-�5�0�(�%�d� �%�l�e�v�e�l� �[�%�t�h�r�e�a�d�]�)� �-� �%�m�%�n�
    �D�u�p�l�i�c�a�t�e�M�e�s�s�a�g�e� �f�i�l�t�e�r������$�����`
    ��n�K���}���"�����`
    ��n�K���}��������p
    ��n�K���}d����$����������������������f���������������f�����������������������p���$�������	���������	���������	���������	���������	���������	���������	���������	����6������>��~������>��~
    ������>��~��������N����
    ���|������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+��������������
    ������������������������������������������-�����������������d���(����	������������
    ����������J���
    ����� ���Z����$Qz��_����_����������������������������	�?����������  ``�������������
    ����
    �������������� ���O�d�d�s� �a�n�d� �e�n�d�s� �I�I�����������O�
    ��d���������������������	����6�����������@�������	��@��
    �������@����������
    ����� ���Z����Qz��_����_�����������������������������	�?�����������
    ����������������
    8��������������%�(�)� �i�n� �p�a�t�t�e�r�n� �s�t�r�i�n�g�s� �c�a�n� �d�o� �m�a�g�i�c�
    � �%�-�5�0�(�%�d� �%�l�e�v�e�l� �[�%�t�h�r�e�a�d�]�)� �-� �%�m�%�n�
    �D�u�p�l�i�c�a�t�e�M�e�s�s�a�g�e� �f�i�l�t�e�r������$�����`
    ��n�K���}���"�����`
    ��n�K���}��������p
    ��n�K���}d����$����������������������f���������������f�����������������������p���$�������	���������	���������	���������	���������	���������	���������	���������	����6������>��~������>��~
    ������>��~��������N����
    ���������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+�����b���������
    ������������������������������������������-�����|��������������(����	������������
    ����������\���
    ����� ���Z����Qz��_����_����������������������������	�?�����������`�������������
    ����
    ��������������2���P�l�a�n�s� �f�o�r� �t�h�e� �n�e�a�r� �f�u�t�u�r�e�����������O�
    ��d���������������������	����6�����������@�������	��@��
    �������@�������r���
    ����� ���Z����DRz��_����_�����������������������������	�?���������� �����������������
    ��������������F�i�n�e�r� �t�h�r�e�a�d�i�n�g� �m�o�d�e�l� �l�e�a�d�i�n�g� �t�o� �l�e�s�s� �c�o�n�t�e�n�t�i�o�n�
    �B�e�t�t�e�r� �d�o�c�u�m�e�n�t�a�t�i�o�n�
    �E�c�l�i�p�s�e� �p�l�u�g�-�i�n� �t�o� �v�i�s�u�a�l�i�z�e� �y�o�u�r� �l�o�g�s���l���1�����`
    ��n�K���}��������`
    ��n�K���}���'�����`
    ��n�K���}���1��������������'���������*���1�������	���������	��'�������	����6������F������	��F��
    ������F����������N����
    ���������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+��������������
    ������������������������������������������-������� ���������x���(����	������������
    ����������>���
    ����� ���Z����Rz��_����_����������������������������	�?����������  `�������������
    ����
    �����������������C�o�n�c�l�u�s�i�o�n�����������O�
    ��d���������������������	����6�����������@�������	��@��
    �������@����������
    ����� ���Z����Sz��_����_�����������������������������	�?���������� `p����������������
    X��������������L�o�g�b�a�c�k� �i�s� �t�h�e� �u�n�o�f�f�i�c�i�a�l� �s�u�c�c�e�s�s�o�r� �o�f� �l�o�g�4�j�,� �a�s� �t�h�e� �l�a�t�t�e�r� �i�s� �n�o� �l�o�n�g�e�r� �b�e�i�n�g� �a�c�t�i�v�e�l�y� �d�e�v�e�l�o�p�e�d�.���$���c�����`
    ��n�K���}���c������������c�������	����6������>��~������>��~
    ������>��~��������N����
    ���������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+��������������
    ������������������������������������������-��������0������������(����	������������
    ����������>���
    ����� ���Z����dSz��_����_����������������������������	�?����������  `�������������
    ����
    �����������������Q�u�e�s�t�i�o�n�s�?�����������O�
    ��d���������������������	����6�����������@�������	��@��
    �������@����������
    ����� ���Z����Sz��_����_�����������������������������	�?����������  �����������������
    j�������������
    �r�e�a�d� �t�h�e� �d�o�c�s� �a�t� �h�t�t�p�:�/�/�l�o�g�b�a�c�k�.�q�o�s�.�c�h�/�
    �s�t�u�d�y� �t�h�e� �c�o�d�e� �a�t� �h�t�t�p�:�/�/�g�i�t�.�q�o�s�.�c�h�
    �w�r�i�t�e� �t�o� �u�s� �a�t� � �l�o�g�b�a�c�k�-�u�s�e�r�@�q�o�s�.�c�h�
    �f�i�l�e� �a� �b�u�g� �r�e�p�o�r�t� �a�t� �h�t�t�p�:�/�/�j�i�r�a�.�q�o�s�.�c�h�/�
    �c�h�a�t� �w�i�t�h� �u�s� �a�t� �i�r�c�.�f�r�e�e�n�o�d�e�.�n�e�t�#�q�o�s�
    �t�a�l�k� �t�o� �u�s� �a�t� �+�4�1� �2�1� �3�1�2� �3�2� �2�6���$�������O`
    ��K����(�����`
    ��n�K���}���$�����`
    ��n�K���}���$�����`
    ��n�K���}���)�����`
    ��n�K���}���%�����`
    ��n�K���}��������`
    ��n�K���}�����������������������ff�������������ff�������������ff�������������ff%��������������������������������������������)������������������������������]���q������������������������������������������������	���������	���������	���������	���������	���������	���������	���������	���������	��%�������	���������	����6������?��������?��
    ������?���������N����
    ���������6�������������h������	���?��� ��������������̙�33����Z���R�������_�_�_�P�P�T�1�0���2����.���]0G���+��������D����' �����������������������������=
    ���@B���	����D�����' ���������������������������������=
    ���@B��������A��������������������?�%,�����(������	������������<�����+������O�%,�����(������
    ������������<�����+�������+����������������������������=�������@������������(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    ��������������������
    ������
    ���0������������������������	�?��������
    0����������������
    ������������H����
    ���������0���������޽h������	���?��� ��������������̙�33����b	����������������������=��	���	��P������������(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    �������������������
    ������
    ���T����$Tz��_����_�����������������������������	�?��������
    0����������������
    j������������*��F�a�s�t�e�r�:� �C�e�r�t�a�i�n� �c�r�i�t�i�c�a�l� �o�p�e�r�a�t�i�o�n�s�,� �f�o�r� �i�n�s�t�a�n�c�e� �d�e�t�e�r�m�i�n�i�n�g� �w�h�e�t�h�e�r� �a� �l�o�g� �s�t�a�t�e�m�e�n�t� �s�h�o�u�l�d� �b�e� �l�o�g�g�e�d� �o�r� �n�o�t�,� �h�a�s� �b�e�e�n� �s�i�g�n�i�f�i�c�a�n�t�l�y� �i�m�p�r�o�v�e�d�.� �T�h�i�s� �o�p�e�r�a�t�i�o�n� �t�a�k�e�s� �a�b�o�u�t� �3� �n�a�n�o�s�e�c�o�n�d�s� �i�n� �l�o�g�b�a�c�k� �v�e�r�s�u�s� �3�0� �n�a�n�o�s�e�c�o�n�d�s� �i�n� �l�o�g�4�j�.� �L�o�g�b�a�c�k� �a�l�s�o� �c�r�e�a�t�e�s� �l�o�g�g�e�r�s� �f�a�s�t�e�r� �:� �1�3� �m�i�c�r�o�s�e�c�o�n�d�s� �i�n�s�t�e�a�d� �v�e�r�s�u�s� �2�3� �m�i�c�r�o�s�e�c�o�n�d�s� �f�o�r� �l�o�g�4�j�.� �M�o�r�e� �i�m�p�o�r�t�a�n�t�l�y�,� �i�t� �f�e�t�c�h�e�s� �a�n� �e�x�i�s�t�i�n�g� �l�o�g�g�e�r� �i�n� �9�4� �n�a�n�o�s�e�c�o�n�d�s� �v�e�r�s�u�s� �2�2�3�4� �n�a�n�o�s�e�c�o�n�d�s� �f�o�r� �l�o�g�4�j�,� �a� �2�3� �f�o�l�d� �i�m�p�r�o�v�e�m�e�n�t�.� �T�h�e� �i�m�p�r�o�v�e�m�e�n�t� �o�v�e�r� �J�U�L� �i�s� �a�l�s�o� �f�a�r� �f�r�o�m� �i�n�s�i�g�n�i�f�i�c�a�n�t�.�
    �S�m�a�l�l�e�r�:� �E�a�c�h� �l�o�g�g�e�r� �i�n�s�t�a�n�c�e� �u�s�e�s� �u�p� �a�b�o�u�t� �4�0� �b�y�t�e�s� �o�f� �m�e�m�o�r�y� �v�e�r�s�i�o�n� �1�6�0� �b�y�t�e�s� �f�o�r� �l�o�g�4�j�.�
    �M�o�r�e� �b�a�n�g� �f�o�r� �t�h�e� �b�u�c�k�:� �L�o�g�b�a�c�k� �d�o�e�s� �a� �b�e�t�t�e�r� �j�o�b� �o�f� �p�r�e�s�e�n�t�i�n�g� �l�o�g�s�,� �h�a�s� �m�u�c�h� �i�m�p�r�o�v�e�d� �f�i�l�t�e�r�i�n�g� �a�n�d� �e�v�a�l�u�a�t�i�o�n� �c�a�p�a�b�i�l�i�t�y�.� �I�n� �s�h�o�r�t�,� �i�t� �d�o�e�s� �e�v�e�r�y�t�h�i�n�g� �t�h�a�t� �l�o�g�4�j� �d�o�e�s� �a�n�d� �m�o�r�e�,� �b�u�t� �b�e�t�t�e�r�.� ����������O`
    ��d����\�����O`
    ��d���������O`
    ��d��������!��������!�������!����T�����!�������!���������!�����T����������	��������	���������	��T�������	���������	���������	����6�����������@�������	��@��
    �������@�������H����
    ���������0���������޽h������	���?��� ��������������̙�33��������������������������=�������`���������H���(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    �������������������
    ������
    ���T����Tz��_����_�����������������������������	�?��������
    0����������������
    ������������B��T�h�e� �l�o�g�b�a�c�k�-�c�o�r�e� �m�o�d�u�l�e� �f�o�r�m�s� �t�h�e� �f�o�u�n�d�a�t�i�o�n� �u�p�o�n� �w�h�i�c�h� �t�h�e� �o�t�h�e�r� �t�w�o� �m�o�d�u�l�e�s� �a�r�e� �b�u�i�l�t�.� �I�n�t�e�r�e�s�t�i�n�g�l�y� �e�n�o�u�g�h�,� �l�o�g�b�a�c�k�-�c�o�r�e� �h�a�s� �n�o� �n�o�t�i�o�n� �o�f� �"�l�o�g�g�e�r�.�"� �W�e� �h�a�v�e� �r�e�c�e�n�t�l�y� �b�u�i�l�t� �a� �m�o�n�i�t�o�r�i�n�g� �f�r�a�m�e�w�o�r�k� �o�n� �t�o�p� �o�f� �j�u�s�t� �l�o�g�b�a�c�k�-�c�o�r�e� �(�w�i�t�h�o�u�t� �l�o�g�b�a�c�k� �c�l�a�s�s�i�c� �o�r� �a�c�c�e�s�s�)�.�
    �
    �L�o�g�b�a�c�k�-�c�l�a�s�s�i�c� �r�e�l�i�e�s� �o�n� �l�o�g�b�a�c�k�-�c�o�r�e� �f�o�r� �b�a�s�i�c� �s�e�r�v�i�c�e�s�.� �I�t� �n�a�t�i�v�e�l�y� �i�m�p�l�e�m�e�n�t�s� �t�h�e� �S�L�F�4�J� �A�P�I�.�
    �
    �L�o�g�b�a�c�k�-�a�c�c�e�s�s� �i�n�t�e�g�r�a�t�e�s� �w�i�t�h� �s�e�r�v�l�e�t� �c�o�n�t�a�i�n�e�r�s�,� �i�n� �p�a�r�t�i�c�u�l�a�r� �J�e�t�t�y� �a�n�d� �T�o�m�c�a�t�.� �T�h�u�s�,� �t�h�e� �c�a�p�a�b�i�l�i�t�i�e�s� �o�f� �a� �f�u�l�l�y�-�f�l�e�d�g�e�d� �l�o�g�g�i�n�g� �s�y�s�t�e�m� �c�a�n� �b�e� �l�e�v�e�r�a�g�e�s� �i�n� �s�e�r�v�l�e�t� �c�o�n�t�a�i�n�e�r�s�.� �
    �
    �
    � ����������O`
    ��d���������O`
    ��d����a�����O`
    ��d���������O`
    ��d���������O`
    ��d���������O`
    ��d���������O`
    ��d���������O`
    ��d��������!��������!���a�����!��������!��������!��������!��������!��������!�����p���������	���������	��a�������	���������	���������	���������	���������	���������	����6�����������@�������	��@��
    �������@�������H����
    ���������0���������޽h������	���?��� ��������������̙�33��������������������������=��V���N��p������������(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    �����������������N��
    ������
    ���T����Tz��_����_�����������������������������	�?��������
    0����������������
    �������������"���S�h�o�w� �J�M�X� �c�o�u�n�t�e�r�.��� ��������O`
    ��d���������!���������������	����6�����������@�������	��@��
    �������@�������H����
    ���������0���������޽h������	���?��� ��������������̙�33����	����������������������=����������������B���(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    �������������������
    ������
    ���T����DUz��_����_�����������������������������	�?��������
    0����������������
    ��������������A�s� �a� �l�o�g�b�a�c�k� �u�s�e�r�,� �t�h�e� �v�a�s�t� �m�a�j�o�r�i�t�y� �o�f� �y�o�u�r� �w�i�l�l� �d�e�p�e�n�d� �o�n� �S�L�F�4�J�,� �n�o�t� �l�o�g�b�a�c�k�.� �T�h�u�s�,� �i�f� �y�o�u� �l�a�t�e�r� �w�a�n�t� �t�o� �s�w�i�t�c�h� �t�o� �J�C�L�,� �J�U�L� �o�r� �l�o�g�4�j�,� �y�o�u� �c�a�n� �d�o� �s�o� �w�i�t�h� �r�e�l�a�t�i�v�e� �e�a�s�e�.�
    �
    �S�L�F�4�J� �a�c�t�s� �a�s� �a� �u�n�i�v�e�r�s�a�l� �l�o�g�g�i�n�g� �A�P�I� �d�e�l�e�g�a�t�i�n�g� �t�o� �v�a�r�i�o�u�s� �l�o�g�g�i�n�g� �s�y�s�t�e�m�s�.� �L�o�g�b�a�c�k�� �i�s� �d�e�s�i�g�n�e�d� �t�o� �s�u�p�p�o�r�t� �S�L�F�4�J� �A�P�I� �f�r�o�m� �t�h�e� �s�t�a�r�t�.� �I�n� �p�r�a�c�t�i�c�e�,� �i�t� �i�s� �a� �l�i�t�t�l�e�� �l�e�s�s� �c�o�n�v�e�n�i�e�n�t�� �t�o� �l�o�g�� �d�i�r�e�c�t�l�y�� �t�h�r�o�u�g�h� �l�o�g�b�a�c�k� �i�n�s�t�e�a�d��� �o�f��� �(�i�n�d�i�r�e�c�t�l�y�)��� �w�i�t�h��� �S�L�F�4�J�.�� �F�o�r��� �e�x�a�m�p�l�e�,� �l�o�g�b�a�c�k�'�s� �d�o�c�u�m�e�n�t�a�t�i�o�n�� �a�l�w�a�y�s� �u�s�e�s� �S�L�F�4�J�.�� �(�T�h�e�r�e� �a�r�e�� �n�o� �e�x�a�m�p�l�e�s�� �i�n� �l�o�g�b�a�c�k� �d�o�c�s� �t�h�a�t� �u�s�e� �l�o�g�b�a�c�k� �d�i�r�e�c�t�l�y�.�)�
    �
    �I�t� �i�s� �a�l�s�o� �p�o�s�s�i�b�l�e� �t�o� �i�n�t�e�r�c�e�p�t� �c�a�l�l�s� �m�a�d�e� �t�o� �J�C�L�,� �l�o�g�4�j� �a�n�d� �j�.�u�.�l� �A�P�I�s� �a�n�d� �r�e�d�i�r�e�c�t� �t�h�e�m� �t�o� �S�L�F�4�J� � �w�h�i�c�h� �w�i�l�l� �t�h�e�n� �d�e�l�e�g�a�t�e� �t�o� �t�h�e� �f�i�n�a�l� �l�o�g�g�i�n�g� �f�r�a�m�e�w�o�r�k� �s�e�l�e�c�t�e�d� �b�y� �t�h�e� �u�s�e�r�.�����������O`
    ��d���������O`
    ��d��������O`
    ��d���������O`
    ��d���������O`
    ��d���������!��������!�������!��������!��������!�����F����������	���������	��������	���������	���������	����6�����������@�������	��@��
    �������@�������H����
    ���������0���������޽h������	���?��� ��������������̙�33��������������������������=����������������2���(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    �������������������
    ������
    ���T����Uz��_����_�����������������������������	�?��������
    0����������������
    �������������n���A�n� �e�x�a�m�p�l�e� �w�i�t�h� �M�u�l�t�i�F�i�l�e�A�p�p�e�n�d�e�r� �m�i�g�h�t� �b�e� �i�n�t�e�r�e�s�t�i�n�g�.��� ���8�����O`
    ��d����8�����!��������8�������	����6�����������@�������	��@��
    �������@�������H����
    ���������0���������޽h������	���?��� ��������������̙�33����r����������������������=�������������������(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    �������������������
    ������
    ���T����Vz��_����_�����������������������������	�?��������
    0����������������
    z���������������c�.�q�.�l� �i�s� �a�n� �a�b�b�r�e�v�i�a�t�i�o�n� �o�f� � �c�h�.�q�o�s�.�l�o�g�b�a�c�k�
    �c�.�q�.�l�.�c�.�r� �s�t�a�n�d�s� �f�o�r� �c�h�.�q�o�s�.�l�o�g�b�a�c�k�.�c�o�r�e�.�r�o�l�l�i�n�g���D���,�����Op
    ��d�d����1�����Op
    ��d�d����,�����!���1�����!��������,�������	��1�������	����6�����������@�������	��@��
    �������@�������H����
    ���������0���������޽h������	���?��� ��������������̙�33����
    ����������������������=����������������F���(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    �������������������
    ������
    ���T����dVz��_����_�����������������������������	�?��������
    0����������������
    ���������������L�o�g�b�a�c�k�-�a�c�c�e�s�s� �c�o�n�f�i�g�u�r�a�t�i�o�n� �i�s� �v�e�r�y� �s�i�m�i�l�a�r� �t�o� �l�o�g�b�a�c�k�-�c�l�a�s�s�i�c�.� ��� ���B�����O`
    ��d����B�����!��������B�������	����6�����������@�������	��@��
    �������@�������H����
    ���������0���������޽h������	���?��� ��������������̙�33����<����������������������=����������������x���(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    �������������������
    ������
    ���T����Vz��_����_�����������������������������	�?��������
    0����������������
    D������������X��A�s� �m�e�n�t�i�o�n�e�d� �p�r�e�v�i�o�u�s�l�y�,� �w�e�'�v�e� �u�s�e�d� �J�o�r�a�n� �(�p�a�r�t� �o�f� �l�o�g�b�a�c�k�-�c�o�r�e�)� �t�o� �i�m�p�l�e�m�e�n�t� �a� �m�o�n�i�t�o�r�i�n�g� �f�r�a�m�e�w�o�r�k�.� �
    �
    �W�e� �n�e�e�d�e�d� �t�o� �r�e�c�r�e�a�t�e� �s�o�p�h�i�s�t�i�c�a�t�e�d� �t�e�s�t� �o�b�j�e�c�t� �a�n�e�w� �e�a�c�h� �t�i�m�e� �w�e� �n�e�e�d�e�d� �t�o� �p�e�r�f�o�r�m� �a� �v�e�r�i�f�i�c�a�t�i�o�n�.� �J�o�r�a�n�'�s� �u�n�i�q�u�e� �c�a�p�a�b�i�l�i�t�y� �o�f� �s�e�l�e�c�t�i�v�e�l�y� �r�e�p�l�a�y�i�n�g� �p�a�r�t�s� �o�f� �a� �c�o�n�f�i�g�u�r�a�t�i�o�n� �w�a�s� �a� �p�e�r�f�e�c�t� �m�a�t�c�h�.���`���g�����O`
    ��d���������O`
    ��d���������O`
    ��d����g�����!��������!��������!�����*���g�������	���������	���������	����6�����������@�������	��@��
    �������@�������H����
    ���������0���������޽h������	���?��� ��������������̙�33����������	����������������=��:���2��������������(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    �����������������2��
    ������
    ���T����$Wz��_����_�����������������������������	�?��������
    0����������������������������_�_�_�P�P�T�9���n�����f����������������������������������������������������������������������������������������������
    ��������������
    �G�i�v�e�n� �t�h�a�t� �
    �
    � �J�o�r�a�n� �c�a�n� �c�o�n�f�i�g�u�r�e� �a�n�y� �c�o�m�p�o�n�e�n�t� �v�i�a� �s�e�t�t�e�r�/�a�d�d�e�r� �m�e�t�h�o�d�s�,� �
    � �c�a�n� �b�e� �e�a�s�i�l�y� �a�d�j�u�s�t�e�d� �t�o� �p�r�o�c�e�s�s� �c�o�n�f�i�g�u�r�a�t�i�o�n� �e�l�e�m�e�n�t�s� �v�i�a� �u�s�e�r�-�s�p�e�c�i�f�i�e�d� �a�c�t�i�o�n�s�,�
    �
    �J�o�r�a�n� �i�s� �r�e�a�l�l�y� �i�d�e�a�l� �f�o�r� �b�u�i�l�d�i�n�g� �f�r�a�m�e�w�o�r�k�s� �w�h�i�c�h� �n�e�e�d� �t�o� �s�u�p�p�o�r�t� �u�s�e�r�-�d�e�v�e�l�o�p�e�d� �e�x�t�e�n�s�i�o�n�s�.����������O`
    ��d���������O`
    ��d���������O`
    ��d����>�����o`
    ��d�������V�����o`
    ��d������������o`
    ��d�������_�����o`
    ��d������������!�������!��������!��������!����=����!��������!����U����!��������!����_����!������~����������	���������	���������	���������	��=�������	���������	��U�������	���������	��_�������	����6�����������@�������	��@��
    �������@�������H����
    ���������0���������޽h������	���?��� ��������������̙�33����������
    ����������������=�������������������(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    ��������������������
    ������
    ���0������������������������	�?��������
    0����������������
    ������������H����
    ���������0���������޽h������	���?��� ��������������̙�33��������������������������=�������������������(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    ��������������������
    ������
    ���0������������������������	�?��������
    0����������������
    ������������H����
    ���������0���������޽h������	���?��� ��������������̙�33����z����������������������=��&������������������(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    �������������������
    ������
    ���T����Wz��_����_�����������������������������	�?��������
    0����������������
    ��������������l�o�g�b�a�c�k�-�c�o�r�e� �m�o�d�u�l�e�s� �c�a�n�n�o�t� �l�o�g� �b�e�c�a�u�s�e� �i�t� �h�a�s� �n�o� �n�o�t�i�o�n� �o�f� �a� �"�l�o�g�g�e�r�"�.� �
    �L�o�g�g�e�r�s� �a�r�e� �d�e�f�i�n�e�d� �i�n� �l�o�g�b�a�c�k�-�c�l�a�s�s�i�c�.�
    �
    �B�u�t�,� �m�o�r�e� �g�e�n�e�r�a�l�l�y�,� �a� �l�o�g�g�i�n�g� �s�y�s�t�e�m� �w�h�i�c�h� �u�s�e�s� �i�t�s�e�l�f� �f�o�r� �i�t�s� �o�w�n� �l�o�g�g�i�n�g� �i�s� �e�x�t�r�e�m�e�l�y� �d�i�f�f�i�c�u�l�t� �t�o� �d�e�s�i�g�n� �a�n�d� �t�o� �m�a�i�n�t�a�i�n�.� �I�t� �c�a�n� �b�e� �d�o�n�e� �b�u�t� �a� �t�h�e� �c�o�s�t� �o�f� �n�o�n�-�n�e�g�l�i�g�i�b�l�e� �c�o�m�p�l�e�x�i�t�y�.� �
    �
    �I�n�s�t�e�a�d� �l�o�g�b�a�c�k� �r�e�l�i�e�s� �o�n� �S�t�a�t�u�s� �o�b�j�e�c�t� �t�o� �r�e�p�o�r�t� �i�t�s� �o�w�n� �s�t�a�t�e�.�
    ������I�����O`
    ��d����(�����O`
    ��d���������O`
    ��d���������O`
    ��d���������O`
    ��d����A�����O`
    ��d���������O`
    ��d����I�����!���(�����!��������!��������!��������!���A�����!��������!�����b���I�������	��(�������	���������	���������	���������	��A�������	���������	����6�����������@�������	��@��
    �������@�������H����
    ���������0���������޽h������	���?��� ��������������̙�33����D������
    ����������������=�������������������(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    �������������������
    ������
    ���T����Wz��_����_�����������������������������	�?��������
    0����������������
    L������������t��-� �a�j�o�u�t�e�r� �u�n�e� �c�l�a�s�s�e� �X�Y�A�p�p�e�n�d�e�r�,� �a�j�o�u�t�e�r� �l�a� �c�o�n�f�i�g� �n��c�e�s�s�a�i�r�e� �d�a�n�s� �l�o�g�b�a�c�k�-�Y�Y�.�x�m�l� �e�t� �m�o�n�t�r�e�r� �q�u�e� �l�a� �c�o�n�f�i�g� �e�s�t� �f�a�i�t�e� �t�o�u�t�e� �s�e�u�l�e�,� �s�a�n�s� �m�o�d�i�f�i�e�r� �q�u�o�i� �q�u�e� �s�e� �s�o�i�t�.�
    ��-� �c�o�n�f�i�g�u�r�a�t�i�o�n�:� �c�o�n�f�i�g�u�r�e�r� �u�n� �f�i�c�h�i�e�r� �x�m�l� �a�v�e�c� �u�n�e� �e�r�r�e�u�r� �(�p�a�s� �d�e� �T�r�i�g�g�e�r�i�n�g�P�o�l�i�c�y� �d�a�n�s� �u�n� �R�o�l�l�i�n�g�F�i�l�e�A�p�p�e�n�d�e�r�)� �e�t� �m�o�n�t�r�e�r� �l�'�e�f�f�e�t� �d�e�s� �s�t�a�t�u�s� �o�b�j�e�c�t�s� �e�t� �l�e� �l�i�e�n� �v�e�r�s� �l�a� �p�a�g�e� �c�o�d�e�s�.�h�t�m�l�.� �L�o�g�b�a�c�k� �s�e� �m�a�n�i�f�e�s�t�e� �l�o�r�s�q�u�'�i�l� �y� �a� �u�n�e� �e�r�r�e�u�r� �e�t� �f�o�u�r�n�i� �u�n�e� �p�i�s�t�e� �� �s�u�i�v�r�e� �p�o�u�r� �l�a� �r��s�o�u�d�r�e�.���L��������O`
    ��d��������O`
    ��d���������!��������!�������!�����*����������	���������	��������	����6�����������@�������	��@��
    �������@�������H����
    ���������0���������޽h������	���?��� ��������������̙�33��������������������������=������� ������������(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    ��������������������
    ������
    ���0������������������������	�?��������
    0����������������
    ������������H����
    ���������0���������޽h������	���?��� ��������������̙�33��������������������������=��p���h��0�������������(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    �����������������h��
    ������
    ���T����DXz��_����_�����������������������������	�?��������
    0����������������
    ������������<��W�e� �c�o�n�s�i�d�e�r� �c�o�d�e� �r�e�a�d�y� �f�o�r� �d�i�s�t�r�i�b�u�t�i�o�n� �o�n�l�y� �a�f�t�e�r� �i�t� �i�s� �p�r�o�p�e�r�l�y� �d�o�c�u�m�e�n�t�e�d�,� �w�h�i�c�h� �i�s� �t�h�e� �m�a�i�n� �r�e�a�s�o�n� �w�h�y� �l�o�g�b�a�c�k� �c�a�r�r�i�e�s� �a� �0�.�x� �v�e�r�s�i�o�n� �s�t�a�m�p� �i�n�s�t�e�a�d� �o�f� �1�.�x�.��� ��������O`
    ��d���������!���������������	����6�����������@�������	��@��
    �������@�������H����
    ���������0���������޽h������	���?��� ��������������̙�33��������������������������=�������@������������(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    ��������������������
    ������
    ���0������������������������	�?��������
    0����������������
    ������������H����
    ���������0���������޽h������	���?��� ��������������̙�33��������������������������=�������P������������(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    �������������������
    ������
    ���T����Xz��_����_�����������������������������	�?��������
    0����������������
    �������������Z���-� �T�u�r�b�o� �f�i�l�t�e�r�i�n�g� �e�x�a�m�p�l�e� �b�a�s�e�d� �o�n� �u�s�e�r� �l�o�g�i�n��� ���.�����O`
    ��d����.�����!��������.�������	����6�����������@�������	��@��
    �������@�������H����
    ���������0���������޽h������	���?��� ��������������̙�33��������������������������=�������`������������(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    ��������������������
    ������
    ���0������������������������	�?��������
    0����������������
    ������������H����
    ���������0���������޽h������	���?��� ��������������̙�33��������������������������=�������p������������(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    ��������������������
    ������
    ���0������������������������	�?��������
    0����������������
    ������������H����
    ���������0���������޽h������	���?��� ��������������̙�33��������������������������=�������������������(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    �������������������
    ������
    ���T����Yz��_����_�����������������������������	�?��������
    0����������������
    �������������*���N�O�_�E�X�C�E�P�T�I�O�N� �e�x�a�m�p�l�e�
    ���@��������O`
    ��d���������O`
    ��d���������!��������!���������������	���������	����6�����������@�������	��@��
    �������@�������H����
    ���������0���������޽h������	���?��� ��������������̙�33��������������������������5�������������������(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    ��������������������
    ������
    ���0������������������������	�?��������
    0����������������
    ������������H����
    ���������0���������޽h������	���?��� ��������������̙�33��������������������������5�������������������(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    ��������������������
    ������
    ���0������������������������	�?��������
    0����������������
    ������������H����
    ���������0���������޽h������	���?��� ��������������̙�33��������������������������=��j���b��������������(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    �����������������b��
    ������
    ���T����dYz��_����_�����������������������������	�?��������
    0����������������
    ������������6��C�o�n�t�r�a�r�y� �t�o� �l�o�g�4�j�,� �w�h�e�r�e� �w�e� �w�r�o�t�e� �m�a�n�y� �r�e�g�r�e�s�s�i�o�n� �t�e�s�t�s�,� �i�n� �l�o�g�b�a�c�k�,� �w�e� �h�a�v�e� �l�e�a�r�n�e�d� �o�u�r� �l�e�s�s�o�n�.� �W�e� �w�r�i�t�e� �m�a�n�y� �m�o�r�e� �u�n�i�t� �t�e�s�t�s� �a�n�d� �f�e�w�e�r� �i�n�t�e�g�r�a�t�i�o�n� �t�e�s�t�s�.��� ��������O`
    ��d���������!���������������	����6�����������@�������	��@��
    �������@�������H����
    ���������0���������޽h������	���?��� ��������������̙�33��������������������������=��4���,��������������(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    �����������������,��
    ������
    ���T����Yz��_����_�����������������������������	�?��������
    0����������������
    ������������n��A�t� �t�h�e� �e�n�d� �o�f� �e�a�c�h� �s�t�a�c�k� �f�r�a�m�e�,� �l�o�g�b�a�c�k� �w�i�l�l� �a�d�d� �a� �p�a�c�k�a�g�i�n�g� �i�n�f�o�r�m�a�t�i�o�n� �f�o�r� �t�h�e� �c�o�r�r�e�s�p�o�n�d�i�n�g� �c�l�a�s�s�.� �P�a�c�k�a�g�i�n�g� �i�n�f�o�r�m�a�t�i�o�n� �c�o�n�s�i�s�t�s� �o�f� �t�h�e� �c�o�n�t�a�i�n�i�n�g� �j�a�r� �f�i�l�e� �a�n�d� �v�e�r�s�i�o�n�i�n�g� �i�n�f�o�r�m�a�t�i�o�n�.� �T�h�e� �i�n�c�l�u�s�i�o�n� �o�f� �p�a�c�k�a�g�i�n�g� �i�n�f�o�r�m�a�t�i�o�n� �s�h�o�r�t�e�n�s� �t�h�e� �t�i�m�e� �i�t� �t�a�k�e�s� �t�o� �i�d�e�n�t�i�f�y� �s�o�f�t�w�a�r�e� �p�r�o�b�l�e�m�s�.�
    �
    �L�o�g�b�a�c�k� �t�r�i�e�s� �h�a�r�d� �t�o� �g�i�v�e� �y�o�u� �t�h�e� �c�o�r�r�e�c�t� �p�a�c�k�a�g�i�n�g� �i�n�f�o�r�m�a�t�i�o�n�.� �H�o�w�e�v�e�r�,� �i�f� �f�o�r� �a�n�y� �r�e�a�s�o�n� �i�t� �i�s� �u�n�s�u�r�e�,� �i�t� �w�i�l�l� �p�r�e�f�i�x� �p�a�c�k�a�g�i�n�g� �i�n�f�o�r�m�a�t�i�o�n� �w�i�t�h� �a� �~�.���z�������O`
    ��d���������O`
    ��d���������O`
    ��d��������!��������!��������!�������!���������!�����F���������	���������	���������	���������	���������	����6�����������@�������	��@��
    �������@�������H����
    ���������0���������޽h������	���?��� ��������������̙�33��������������������������5�������������������(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    ��������������������
    ������
    ���0������������������������	�?��������
    0����������������
    ������������H����
    ���������0���������޽h������	���?��� ��������������̙�33��������������������������=�������������������(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    ��������������������
    ������
    ���0������������������������	�?��������
    0����������������
    ������������H����
    ���������0���������޽h������	���?��� ��������������̙�33����d����������������������=�������������������(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    �������������������
    ������
    ���T����$Zz��_����_�����������������������������	�?��������
    0����������������
    l������������R��%�(�)� �c�a�n� �b�e� �u�s�e�d� �t�o� �g�r�o�u�p� �p�a�r�t�s� �o�f� �y�o�u�r� �l�o�g�g�i�n�g� �o�u�t�p�u�t�.� �T�r�y� �i�t� �o�u�t�!�
    �
    �D�u�p�l�i�c�a�t�e�M�e�s�s�a�g�e�F�i�l�t�e�r� �w�i�l�l� �a�u�t�o�m�a�t�i�c�a�l�l�y� �f�i�l�t�e�r� �o�u�t� �m�e�s�s�a�g�e� �i�f� �t�h�e�y� �r�e�p�e�a�t�e�d�e�d� �o�v�e�r� �a�n�d� �o�v�e�r� �a�g�a�i�n�.�
    ������C�����O`
    ��d���������O`
    ��d����e�����O`
    ��d���������O`
    ��d����C�����!��������!���e�����!��������!�����8���C�������	���������	��e�������	���������	����6�����������@�������	��@��
    �������@�������H����
    ���������0���������޽h������	���?��� ��������������̙�33��������������������������5��������������������(����	������������
    ����������X���
    ������
    ��C���������������?�������� 
    ��������������������
    ������
    ���0������������������������	�?��������
    0����������������
    ������������H����
    ���������0���������޽h������	���?��� ��������������̙�33��������������������������5������������������(����	������������
    ���������X���
    �����
    ��C���������������?�������� 
    ��������������������
    �����
    ���0������������������������	�?��������
    0����������������
    ������������H����
    ��������0���������޽h������	���?��� ��������������̙�33��������������������������5������� �����������(����	������������
    ���������X���
    �����
    ��C���������������?�������� 
    ��������������������
    �����
    ���0������������������������	�?��������
    0����������������
    ������������H����
    ��������0���������޽h������	���?��� ��������������̙�33��������������������������=�������0�����������(����	������������
    ���������X���
    �����
    ��C���������������?�������� 
    ��������������������
    �����
    ���0������������������������	�?��������
    0����������������
    ������������H����
    ��������0���������޽h������	���?��� ��������������̙�33�����r���@����j��`&��,=��D��JJ��NR��Z��Db��^j��Pr������Ԙ����l��6��X����N��`��n����.������J��
    ��J�0�9�@�^G�M�S�\�j^�g�o�r�{�~� �2�v���ܔ�^���^�F�0�����д��~����J�2�����������
    ���������D������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Oh�+'0���$��������`������h������x���������������	������
    ������������������
    �����������������������Slide 1�������*Unrestricted*��������Ceki ��������� Ceki���������191�@����P��@�����������@����93@���#BYG���0�����(������x����������������������������ېf�:ې:8������^���6���Շ6daѮ66d׊89������f��f���99�ېff:��f���ff���::�ېf��:���ff�:f��f���f����:���ې:f�:::��ې:���::�f:��:���fff��fې:��:���ې:fېېf:f��:���ې:fېېffېېf��:���ې:��f���f448ӄ58`·da�aa։6d׊8ed���9efې:f���f:f:ffې::fې:�fې�fff::fې:ff:fffې::fېff:ffې::fېfېېf:f:fېfېېffېېf:fې:f:f8]�`������`��ad��d׊8e֌�8���9��؎ېff:��fېېff:::ېf��:ې:�f������f�fې:f��:���ې:��:���f:ffې:�f������f�fېېf:������:��ې�f������f�fېېffېېf�f������f�ff8]8`·`68ad66d׊8e֌f؎ېff���ff:fېېf:f����::��ې:fېf::ې:f:fې::fې:ffې::fېf::ffې::ff::fېf::ffې::ffې::fېf::ff:]48ӄ5��68��·dad6�d׊8ed�9f99؎ېff:��f���ffېېf:f۶f::ffې:��::��ېf:ff���f:������ff���:��ې��ff��fې:��::��ېf�::���f:ff:��::��ېf�::���ff�::���f��::��ې��f���f8������^�dad׊89������e�efېfې:ffې�f���f��f���f��ff�fې:ffې::������:��ې̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}����}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��:�}�:}��}��}��}��}��}��}��}��}��}��}��}��f�}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}����ې}:}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��:�}�:}��}��}��}��}��}��}��}��}��}��}��}��}��:�}�:}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��:�}��:}f}��}��f�}f:�۶}��}����ն}f}��:�:f}�:f�}�:}��}��}��:�۶}��:�}�:}��}��:}f}��:�}�:}��f�}��}��:��f}�:}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��:�}�:}��}��}��:�}�f��}:��}:��}f:�}f��ې}f}��f�}��f�}:��}:}��f��:}:}��}��}��}��:�}:��ې}f:�}�:}��:�}�f��}::�}�::�}:��ې}f��}:}��f�}�:}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��:�}�:}��}��}��f�}��}��f}f:�}�:}��f}f:�}�f}��:}��f�}�f��}::�}�:}��}��:�f}��}��}��}��}��:�}�:}��::�}�:}��f�}��}��f}f:�}�:f�}��}��}��}��:�}�:}��}��:�}�:}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��:�}�:}��}��}��f�}��}��f}f:�}�:}��f}f:�}�f}��:}��}��:�}::�}�:}��}��:�}�f}��}��}��}��}��:�}�:}��::�}�:}��f�}��}��f}f:�}�:f�:�}�:}��}��:�}�:}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��:�}�:}��}��}��:�}�f��}:��}:��}f:�}f��ې}f}��:�}�:��}�f��}:}��:f:}��}��}��}��}��:�}:��ې}f:�}:}��:�}�f��}::�}�::�}�:}��f}f��}:}��:}�:}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��:�}�:}��}��}��}��:}��}��f�ꐐ}f:�۶}��}��}��:}��}��:�:f}�::}��}��}��}��:�۶}��:�۶}�f:}��:�}�:}��f�}��}��:�}�:}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��:�}�:}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��:�}�:}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��:�}�:}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��:�}�:}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��:�}�:}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��:�}�:}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��:�}�:}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��:�}�:}��}��}��}��}��}��}��}��}��}��}����۶}�:}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��̙̙̙̙̙̙̙̙̙}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}��}����������������	��
    ������
    �������������������������������������� ��!��$��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������h�t�t�p�:�/�/�l�o�g�b�a�c�k�.�q�o�s�.�c�h�/����������������������������������������������m�a�i�l�t�o�:�l�o�g�b�a�c�k�-�u�s�e�r�@�q�o�s�.�c�h����������������������������������������������h�t�t�p�:�/�/�j�i�r�a�.�q�o�s�.�c�h�/�������������������1���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������R�o�o�t� �E�n�t�r�y��������������������������������������������������dO��)�����������������������@�������C�o�m�p�O�b�j�������������������������������������������������������������������������������������������������9��������O�l�e���������������������������������������������������������
    ������������������������������������������������C�u�r�r�e�n�t� �U�s�e�r����������������������������������������������������������������������������������������,�������P�i�c�t�u�r�e�s������������������������������������������������������������������������������������������z�����P�o�w�e�r�P�o�i�n�t� �D�o�c�u�m�e�n�t���������������������������(�����������������������������������������������*������S�u�m�m�a�r�y�I�n�f�o�r�m�a�t�i�o�n���������������������������(����������������������������������������T�������D�o�c�u�m�e�n�t�S�u�m�m�a�r�y�I�n�f�o�r�m�a�t�i�o�n�����������8�����������������������������������������t������logback_1.0.13/docs/slf4j-slides.vsd����������������������������������������������������������������0000644�0001750�0001750�00000323000�12143164146�017125� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ࡱ����������������>��	��������������������������������������2���R�o�o�t� �E�n�t�r�y�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������R�o�o�t� �E�n�t�r�y�������������������������������������������������������������F������������yIwd���@������V�i�s�i�o�D�o�c�u�m�e�n�t�������������������������������������������������������������������������������3���}<������S�u�m�m�a�r�y�I�n�f�o�r�m�a�t�i�o�n���������������������������(����������������������������������������������S�������D�o�c�u�m�e�n�t�S�u�m�m�a�r�y�I�n�f�o�r�m�a�t�i�o�n�����������8����������������������������������������������������	���
    ���������
    ��������������������������������������������������������� ���!���"���#���$���%���&���'���(���)���*���+���,���-���.���/���0���1���4���5���6���7���8���9���:���;���<���=���>���?���@���A���B���C���D���E���F���G���H���I���J���K���L���M���N���O���P���Q���R���S���T���U���V���W���X���Y���Z���[���\���]���^���_���`���a���b���c���d���e���f���g���h���i���j���k���l���m���n���o���p���q���r���s���t���u���v���w���x���y���z���{���|���}���~���������V�i�s�i�o�I�n�f�o�r�m�a�t�i�o�n���������������������������������"����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������	���
    �������������������������������������������������������������������������������������������՜.�+,D���՜.�+,@����������`������h������t���������������������������������������
    ���������������������������������������$���Lombard Odier Dareir Hentsch & Cie������������������������������������������Page-1�b���Page-2�b���Rectangle�d ���Title block contemp.�eir���Note box triangles�.���Note box contemp.��.���Dynamic connector��.���3-D box����Shadowed box�cto���Border small�cto���Title block classic����Border neon������������Pages���������������Masters����
    �������������0������|������������������������������_PID_LINKBASE�������_VPID_ALTERNATENAMES�������_TemplateID�������A��������������������������TC010492811033������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Oh�+'0���S��������`������h������t��������������������������������������
    ��������(���������������������������������Ceki Glc�������������������������<���C:\Program Files\Microsoft Office\Visio11\1033\BASICD_M.VST�������Ceki Glc��������Microsoft Visio�@���@kIwdG���\R�������������������E���a�������������	�� EMF���TR�����������l�������������Q����������������h$��V�I�S�I�O���D�r�a�w�i�n�g�������L���Q����������E���a�����������F���b��� ������������?����������?�������������d���(������(Q��(���F���b���������(Q������������������������������������������������������������������`_^??>??>??>??>??>??>??>??>??>??>??>??>poo������������������}N.ϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙu{L�����Lj]��>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<Lj]��ϿLj]��Lj]��Lj]��ϿLj]��>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<Lj]�����Lj]��������������������}N.ϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuLj]�����������������������������������������ת߻Lj]�����߻߻Lj]��`_^??>??>??>??>??>??>??>??>??>??>??>??>poo߻߻Lj]��߻߻Lj]��߻߻Lj]��Ͽ|vl��HGG??>??>??>??>??>??>??>??>??>??>??>??>POO���>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=</.-???��������]ZX蹲??>��������������H-߻߻߻߻߻߻߻߻߻߻༥������������ä߻߻߻߻z]ZX���蹲??>��������������T4߻߻߻߻߻߻߻߻߻߻޸������������ä߻߻߻߻yl]ZX������蹲??>��������]ZX蹲??>�������������������������������������� ���{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt/-,{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt]ZW??>������������������������������������������������������������������������������������ �������������������������T4߻߻߻߻߻߻߻߻߻߻߻߻߻߻߻߻߻߻��������������������H-߻���߻���߻���߻���߻���߻���߻���߻߻߻ϙu߻�����߻߻�� ������������������������������������0//߻߻��߻߻��߻߻��������������ݶܴ׿��������������������������������������������������>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<��{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt{wt�������������������������������������������������������}N.ϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuΖp������������fϙuϙuМx����������������������������������>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<�����������Ͽ`__??>??>??>??>??>??>??>??>??>??>??>??>POOPOO??>??>??>??>??>?=<=:8??>??>??>??>??>POO��������ߺܴ��߻߻��Ͽ߻߻��>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<>=<߻߻��������߻߻�����������ϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuϙuLj]Ῠ������������������������������������������������������`_^??>??>??>??>??>??>??>??>??>??>??>??>poo�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Visio (TM) Drawing
    �������}<������O5;�H��R�����wf���� %7`
    ,�o7p
    0%7��5�7p
    0%77����*������8��� �������!��fff�MMM�333�Iy�Fw��������ͩ������|�����o�ݡ�������Hx�����������������������������������������������������������������������UPT���������������������������/���L��
    ���C���������U"J:D�T5I[1hX�T@��.	
    
    /U�bW�##_b��0zGz?L�\&B1r&b%U&	!�oM$d )
    P?;H$,Q,
    &#&J,
    5&?D#//?M?\.? ��CA
    ~,,,'q/%P6$Y6	(}k?�l)?"U
    U%A3#
    o	>S@#B:_�a�_ReUUeUeUeUeUeUePONODN`_ReUUeUeUeUeUUeUeUU/b	SR%;5OM�%>Qiq;RR�RRgg	Rqh>Qj  /A^F' %p3:|bFpT#|	|
    |vi?=Os<34x,,,/RQmeY q]U@QvovL__q_�___OO_OOTYA`,X@L&/d2?ɖQ3YҨsUΡ̦�xΟ@$"Jʼ& ͥ*@d2A??ϟJ[D!�	f:45ŧ5ŷ5@00D$#	
    Q#b	;
    C�hߠ
    �Y
    ,00JDNrq(NN㊮NN(NN&&NDhuc7XXKvvFN&KD#KD#-�BD#KHGHDHB$NzDKq%��iz4
    }1T,Eu9fdhT,W'�0΢Uܮ5E0	fI$[O�mOC%ߑE##HZߪ
    E,3Y&4JY&5&6<s9FaBaj+h88?&!3"DE=T;ܯ?w?@??8&t,'5UR^LY Y7akKt//BJhuipsĝa.1DTcAcpvOpM
    KKuhdX(GNiXIT[EEh.D#E,ah-50zG#zpvb
    aHGmc/QP
    K{\Hp_hd? pA?%?7?I?[;<t5j!
    OO*FQ///F�/K]SEn%cO@OOlE$g�\Ey[EO_!_�3_E_W_i_{___�__VB506,�HM.`e^M�Ia,>PbQaƒ2q?
    a%oXIoQ�fdooo�SEX_O-OF�6EDi66Oҟm2H�g;pbӏ�_
    ,X7R[,<WbӤ69sc Rba2T^<�C=ACoor<G5C+=Oaﲶ2T}R`�PL6;�]ї匒<ұwr!�1r��/Ma�&3@M�)ZQg#��P$!y"7A*%#႑�4�$"WA;Z`Яܯ�u[/�lsx0aq&Iy$6H̻UxB�z;b�bt�b}JmM8~{Fw�ƿK@Xu�b{_ߴߠXEU"	5GPH]�&;-?MW,GH<WW][EM%qYq3~O贁NkѼt6M$%RWYlm%O+1C&Lmu!` EOUdK@U/'n /2/D/jR>Vv�u//?Q/Xj�|?C?	qvy?C�_|�C??"<�WyJj�bJ�\OO_'_/K_�]_o_[/ӣ___�___o!o3oEoWoio{oq-w_ooU�o42�b@�b2~q�bGYk}�
    2�%7I[m�Ǐُ!3Ed �!gy&urW�b2{Ar侟�П*<N�`rᚯЯ�*<N`�rf2b�߿5C.}A�SewωϛϭϿ�#5G�Yk}ߏߡ߳
    1̶"�#Ugy2{.�bL�bݬ�*<N`r
    �'9K]oxR$ͩP8u12#�5GYk}/ /2/�D/V/h/z////////
    ??i%�&C?U?g?0R0?�b>E�bۚ???�???OO*O<ONO`OsOOOOOO�OO__'_9_K_]_o___@'�(___sϒ�bd ,s�bo#o5oGoYoko@}ooooooo�o 2DVhz�
    zq)7P2DV0Rވ�&ŏ׏ 
    1Cas�͟ߟ�'9K]o@*|�+󨯺̯k�{bsj�b܈�*<N`rͿ߿�'9K]oρϓϷ.9,�-x&8gq�b[yu�bk}ߏ�߳
    1DVhz�
    .@Rd.9�.0I&�8J\nnA'9K]o&81!d=�b;�bn(U/�0//&/2-�b@�b[3?�bD�bY/k/P}///*m)o4///?MF"b�HaS7?I?[?m??�???????O~!O?39O<KH@I�b]O2NSOOO}a1B[OO_�_*_<_N_`_r____\____o�o+o=oOoaosoooo
    so,o4=`"#5	9ji2B�hz 
    iXL^�pʏ܏��$6HZ~5�6ߞŸVLpV@+�=Oas�Xܯ�$6�HZl~ƿFwKH	{"qi:�L5(+ϛϭϿ�Ϻ//+?fxߊߜ߮�,>Pj7H!x2.|�0BTϊ>P}$);�M_q	3&DO贁NkFFY6
    u(tq0??6?\.? ��7A%&T|36|2LLG$o'E//&/nF|2	F
    jKO]O\ŕ({G=F03kRGF�7FJ<_{k$__\E(GyG_/�q/Fi1Tm////�//?!?3?E?W8�h?z???p??_�?
    OO.O@O__vO�OOOOOOO�'*_<_W_`_r___�p__ڏoo$?o!�~oooooooo
    -zz1ҪG� 7IWŬb15G�ȭa!G�Yk}'9Kׯ�
    :;M_ ZTx�b�"sK;"ErdSscu�ϙϫϽ�);M_q߃ߕ�߹Ɓ�q:
    !4nPbVɟp�fEqt"9G�Q-:s�	#ad�
    .@Rdv�
    //1/C/U/�t1CcJ0zEX4FXj|�%UFDf�P
    h>$/�T6D
    UUF~@x<?F
    BP(?43P?� �J+1:{
    b�j/b��::I!H??҉^ 	01`b�o�x�,�r�e�c�t�a�n�g�lS ,�bY s�iU |e^
    {%k�Ui//X''W�0U32!0u ��P��(:��{�W_q�D�r�a�g� �t�h�uesa�pWo�nodw�i�pe�. �c�uT�m)�zdb�yg*aT�Xslci n!�z:������bL&d2鿸\.?P?hHKMD?l?~4
    5DHD"
    #	B=hZ,>TE=��cA��UF~?M&d2?F\.?QR6iu�` ?7u�B
    bq*z	zBAD`A�MJڍU5
    �L/��@%'#a!f$5	`?C�o�p�y�r�i�gT�t� �(�wc�) 2�0 3 M c o�%s f"!r !ua i n�. _ �A�l  (Us"e e v d q/`V s�_�S�b . h�m�!�#�4�5�7+02p-l'/m#	m'?9	
    	&H?LUl>0>Uh�h11E!4�	a+�!B'E'@JT3FSF>zbTrF{
    BMBO(4MD]OoAtO�I"A?5NOwIA�EETF_oO7[E21PO>rA
    �RSI"q]o?
    "VJ�@=ll1n"> 8mSYL aM,k?Ne�EfWi]8|CCeR%�,nEn0Yoko|] a�?5,eU\gwonWoi\jLo8EPiC;'g@QT=7
    bTA&!&#O(STC&@
    �2H'�+�򪠄���~L)����uE/>F[��_���#$P7��JB�
    M]�za@]�@��T]�MaLV?L��XP
    #�)
    +T,'-4U/A1NU2[	5h�UFDf�P
    h,�TYY��BU?Y,b'@?#H$ @Fx<?F
    BP(?|	P?7C� �
    b�3b��Y'�GMש c @3�b 2;G3(;9 
    FL&d2?-ɗ(\.Yҩ(.sU!&/:dH?$?66?	[�`2Bqw( 	0`Pc�o�n�t�e?�m�p�.\�;_o�r�a0y\�t�i0l0,�b0o0k2e�x01o0,�f2m279c0pT21,0a0e0>Ae�g0n�db%e^E	UYG�]5ha�h
    Mu ��1����??�EwwEUbqpg���T�U����D�r�a�g� �t�h�uesa�pWo�nodw�i�peS�.
    ai%l?n!� a8I DsNcGB VNr5s)�z7������b@ jZ??Y08!O?h|*?HF1Q׿|>"H$47D<
    UG
    D�
    #	h8.�T	 YTYUi��U@|>@@"H$@F@ �@FjZ??ֻ?P}	��^�**&
    *':(q
    �F��B$�F$$$%(
    /%(F$։u�`h?"u�)b%&	!*]r�33‰U;?
    ��"�/�-"9%)1!$/$h�/'񄄉53,2&L��@#253ADKK-`V�i�s�_�S�E�.�cP�m�!�#�4�9�2@7!2`?C�o�p�y�Ur@gP�tg�(@])g�2�0@3g�M@c@o@o�IfBAr@Qa@i@n@ g�A�Ul)P Hs-Re@e@v?Pd@1D453|	]CJD&l  	G?hEH@L&d2?]X\.˳
    h^sU0a .f3PoSF	HL+5Ue!a !e	*":�Ha�Ud&ked*kedvggY	azET$t,2%t<B&tpB't[RDADAŴ)8{s6A�c@�&qTC�4Ov66vTh�rq�oEdEq<E[sFx<NQ!q)B.d?rq�b'�pE]0^KjqU?
    !_b�	oa
    ^b�*_[U9ftQ0tRҔ3u2&@Ē,2mx<E}sz
    ,5sAUI�	`�@c%'7'#CAn@eĶ@Ur@ v`TP�ࡡa_2`*C)Pa@sRB;RܯyE)Pue@a#;�N@&pPdR?Pt$B%#2d@hal]I,5:�81䅭h1@hf�4jӆ2bB5tt1vrc>d@ j@񓺑F=d@	ѐ0t!K]o	u7
    373,55:T83>�b�솟~`@m22bXj
    2҂�%�PW&8J\c)8sIh	(EMSF1CZW&�z?P @og�f@A&x@ f2v�`
    SBQA.�X@��~d@V�Y#&!Bh!a�uJ-Zpr`9UHPuD�"
    #	%>h-(JTEQMU:M��UF@ �@FjZ?ҷQM�NuQ�`b��Ao��@uA�RN5A
    N	m>JitifNtb	ft�DJNU!
    $�`?C�o�p�y�r�i�g\�t� h�c�)? 2�U0K 3? M7 c5 o�s/ f=".!r1 j!a= i/ n�}.?  �A�l U 5(s"e] e5 v d} `N`!N##0zGz?jH@	�R2#0L&J�cSV
    l$JUp5
    UI	&!	1	Na2a#;#Fm6f;�N 1?tr(:4�8??=5QM?_? q????04cK??@C2{"?>MU�A1zE_OqOOOOO_$]I*J)O<@UHXuD�
    #	U>ih]0JT x]]I	>UUM��UF@ �@FjZ?QNtQ�`A�o�@Nt�Rb?�BNr$�bo� -�r%K
    Z0'2JMuu(0N0l	0J#NU0zGz?@4Q#&�N=-#'�(�Iy�;$(P?$$-#$"LT-#!$+"`?C�o�p�y�r�i�gd�t� �(�c�),0]2p�0�3,0M$0]c"0o�s0f*2R1r0W1a*0i0n�.,0 �A�Ulr0 "8sv2eJ0e"0v0dj0 N`1>2-#0LQ&J�S%lJmUx	U1K$�]	Na�YB_@%6;pJ1qJO�7!(`1#G[�V<BH,"
    �F$"[(B!O$OC�U%(^A_S_WU�(U_O_U<6O��rMlNc#1Q(�GU
    ?M1,PRaP�!bFAIOq.dx<?Fz^ H!aT_3p1CQvQv
    *Qv[(e.d!w	v3EtB!#"~q%[~Hh�}gAu'NTQccP$"JJ^"!(Ұ
    ?��FZsQVr�dsQ6#JMns Q^#rM#NqBc"Dԁ^%ZV8�""rJ�6evoooooooKCbGXܫ,Wx�tץO�ө1gy6�:L^px
    �AW
    9K�必ɵǿ�;M6]
    .@�RdvψƮuVϒv ߣ�Vhxߛ!�"UHPuD�"
    #	%>h-(JTPE=M0M��UF@ �@FjZ?QM�NtQ�`b��A�7�@tA�W�
    >tJNu`fpup1fU
    N	iJNUr$�`?C�o�p�y�r�i�g\�wt� h�c�)5 W2�0A 35 M- ]c+ o�s% f3"R$!r' `!a3 i% n�.5  �A�Ul{  +(s"eS e+ v ds RN`!2 LI�SR#0zGz?H)@Q'lJA$JUp5
    UI	h!1%�	Na2a�/pC1�='<Fx<�p�2%ޮ4�_(>:4�Nv ??35QC?U?g?y????:DNt?X#D<NM�U71ErOOOOOOO:E_WZI*Z"J<OO@�HD:�
    $	T=h4>T]]9	tA��UF@ ?FjZ?@i
    nPh?@߾3?Pt�` ?A��@�t�
    *uL'bd�p&�-QYDV._>uju&zb��U
    	J^0zGz?I@L%"+%+@#�G@# 9 N$(	?A�i+4@#/3?M?\._?*�RN <62<<7%"b4+%@#d14*� `?C�o�p�y�r�i�gT�}t(�c�)W2�04@3M @]c@o�s@f&BRAr@SAa&@i@n�. �A�Uln@ HsrBeF@e@v@df@, `12`$@@M="S_�@R."l>0>Uh�hE
    	A]$�	a-#AJa�U&U&44R x(nU_p_V�%^_YQU7�n^o_9kn__soVi[&,eEV+[@#7/'�2U=r<6AP{r6	7�@AL$~Rb�;A
    b�Azpv�%!$#+!45!%3<v2'MqM(@#/U3v0=sDVh@XB rNjAle7;Ib'<?!3[�1XJr<A>??;,i?�8%"1BFk0B!$h#�+%he�T @tn@eh 
    J@w^I	JQ*(;L].+@�eɟ?��?b�KSzE,ZAe�ܞ?!1vT{�<2B1�>�}�8��H?��u�+�_���y(����KH �Fl[���#SD��B�
    TTD4��xaԠ@o�@��To�]aG~d[
     b�P܂^O&��O$[(z��;^?-��n,^:0Z'UFDf�P
    h,�TPYYB)��U?Y,b'@?#H$ @Fx<?F
    BP(?4|	P?7� �
    b�3b��`
    �NNN
    NNNNY'l鷅U  1@&t3�b ;D!)&Q#JX,X,X'3; R"
    X,X'BFL&_d2?-(\.	8.sU/1-6O?&:ȍH=4??6?	�V2(Z% 	0`<t�r�i�a�n�gO�l�e\�Ms\�n�o)@&Ab?@xR'Bi)@$Cc@pOBo@,B>CaaHc?@m@e@t%e^	(A>#UYGT6 ��qp��'9K]D�z~@�OO�O�������OD�3
    ��8	'H�yDD�r�a�g� �t�h�uesa�pWo�nodw�i�pe�.umt)�clO�yiK�zdf)�te�x:T	8������b@ @\.�Gz�?TW~@Y?j6ks4
    ;UGD�
    #	h>4�T6D
    ����U@?j6@@ks@F@ @F\.?FP}	�r�u֌�` u|�$?v��	�P\�`|uE	]
    ]`]]�
    
    (?
    ƕL\��X�x$|$!)�$<!)L!)\!)l!)-b56	1U2L!L�K�@23I1�D;-`V�i�s�_�S�E�.�}cP�m�!�#\�9�2�5:@0`?C�o�_p�y�r"@gP�wt�  c�)_@W2�0k@3_@M"@ucU@o$@o�f]BRNArQ@Aa]@iO@un,@ _@A�l@U UHsBe$@eU@%v@d,@4`C4L!0 	G?%f3!88@L&d2?c]tX҆Xd^sUQV3_6 d<5UeL!H^0L!C	@!<!2�U	)a~g5d�k5d!kEd�kUdkKUd�<!kd%e~gEd�\!k,Udl!kh�khk|edgnUdXada&7�TPTa!!28T9%DO81C}RBi�&�z@ ]@o_@f"@^Atһ@x]@0fv�yn5p`
    SwBܔA/A.�X<@��Ӏ~0�Y365p@Yd*<N`8⪓Fx<ޞ	�14sba�GBA1!	t7C2`MO@Aͅ/Aa@gʂf@AuB ‚ɁB2"	}e%"TԖr&2dXa%a(,]]T`�Ԕ?@%"@%&_UbrΗb-SRt!]Xa@{bIrg>uz`Q\!0b�q]o=It77�R̿�۹}KBK&}Ǹ25!S0"Tû#Rٍp}%��Y@rX@?Q�22A'B11	8Iӗ�'T`{|ώ7�6ob#6+R#"7cva
    P{b`272626B62#B6B6R6�TR7R6R6b6�b7Jb6b6`@#B 5ね;KE<%?
    _b�	h$�B22EAA(�tQ"Rp5ح՘U&@Ҹ2BXTW`΄J8uHD:�
    #	;ih,>T!9
    A��UF@ ?F\.?@QZt`b�A��@t� ?#9>uX�5nxu9#Ub
    	UJU5
    �L
    BG#'�(�IOy�?]&P?A�Kb<#a @#;#SR
    *-##I!$5J`?C�o�p�y�r�i�gT�}t8(�c�)8W2�0:038M&0]c$0o�s0f,2R1r 0Y1a,0i0n�.8 �A�Ult0 $8sx2eL0e$0v0dl0`1l>n0>Uhhnn1$�]	a�BE	@J1DF�~[�XBjAh2
    �hFMB@0>DNO?lOhCE%NOO2W�EEEF_`O@_Eb2>O;�rAS HD:�
    #	;ih(>T9
    ZA��UF@ ?F\.?oF��@v??Q"t`p%�A��@tH� ?2Glw>uf�|uG#b
    	jJU5
    �SLB<#T @Y#;�~b�S8;#J#!$5X`?C�o�p�y�r�i�gT�tF(�c�)F2�0 3FM c o�s f"!r 	1a i n�.F �A�l$0 (s(2e e v:0d0 `J1l*>0>Uhh�e1e1!$�	a+�250JT16�Q0BAv�|
    k):FMB@4??OCTE�dN}OOGTEdE@6OOOTE52?;�rA�Ss HD:�
    #	;ih(>T9
    JA��UFx<?F}>?"Qhp%�A��@u`b��" ?2$u�`b1,!tb?Ql>$#/
    	/JGU'�(�(Iy�I?'&Ps?A�b(B<
    #n @s#;L#f\t+S
    #!$5q`?C�o�p�y�r�i�gT�t~(�c�)~2�003~M c. o�s f"!r #1a i n�.~ �A�l>0 (sB2e0eJ vT0d60`d1l>p�UhH~!
    #@�	Wa�250BJn1�*0Ba ?�
    k)PFMB@DqOF!2K�G@jEzE9O0MGjE2OE�rAIS HD�
    #=h4>TB]]9	A��UF@ ?@9*?@*IQ6u�`b�A��@"tp%�+t� ?5u7`PuF`u.	#�Ax~M
    #u>F�.3b*&	 J-U0zGz?@L2"8%7M#5
    �#LGM#"�#��Iy�[$(P?A�v+B&C?|W `bd�L @2$x9��]?n""*M#AD5`?C�o�p�y�r�i�gT�tE(�c�)E2�0@3EM@c@oK�s@fBAr@Aa@i@n�.E �A�l@ HsRe@e@vRPd@9 `#QR2M#IP@M="F=S17#l>
    0>Uhh :U
    	A$U@RUPJb!@1b&�>�*b35h(eV6 o7?>oPk%fn_5oo�gVeEno2ooVe@oxo8oi(Phe(b*T@t@eu HDB
    
    #=h4>TB]]9	EA��UF@ ?Fv5?FTn?@!拮Q6u�` ?A��@th7p%�b
    �ku`@)	*@	�u`buޔ�`b�tA�`g�t.E
    f>#�$3b.*<&	< J=U0O贁NkM?	@L~T"b	�u&]"fo#27q ?/&?\.+?43T"Z%đ@?1&>quLdU�@&Fb-h�2�<  P<&-1B'"E+o#1B@G72Bo#AD5`?C�o�p�y�r�i�gT�t)(�c�))2�0P3)M@c.@o�s@fBAr@ Qa@i@n�.) �A�l;P Hs?RePeJ@vQPd3P[ I`aQ2o#P@M3BM!Sh@]"Ul>,>Uh@E
    mEAUf�aba�&c-`J6o#F?�7C�Q#4]"(9JdNY>�7@yo48n$g9od"�&fmEa9#P3(bD@u�b;PeR0c;PQk)t@qy@e)
    1Po@RQ4SSrTQqcJB"pi@q"s\Qqqhr,Qs.
    �jAl emE9	Yb!xyD$l��!30[ C!w
    ?4$BZ%i$6UyD
    '�$ 6	
    V"R]"HD:�
    #	;ih(>T9
    JA��UFx<?F@ ?"Qhp%�A��@u`b��" ?2$u�`b1,Qtb?Gnl>$#S/
    U	/JGU'�(�(Iy�?'&P?A�b(*B<
    #n @s#;L#fe\t+SS
    #I!$5q`?C�o�p�y�r�i�gT�}t>(�c�)>W2�003>M ]c o�s f"R!r #1a i n�.> �A�Ul>0 (sB2e0e vT0d60'�`d1l>.p�Uh ~!
    #@�]	a�25	0Jn1�*?j0Ba ?�
    kPFMB@DqOF!2KG@jEzE9 O0MGjE2OEF�rAIS� HD:�
    #	;ih(>T9
    JA��UFx<?FbX?"Qhp%�A��@u`b��" ?2$u�`b1,tb?@Hl>*$#/
    	/JGU'�(�(Iy'�?'&P?A�bU(B<
    #n X@s#;L#f\t+S
    #!$5q`?C�o�p�y�r�i�gT�t>(�c�)>2�003>M c o�s f"!r #1a i n�.> �A�l>0 (sB2e*0e vT0d60%`d1l>.p�Uh ~!
    #@�]	a�25	0Jn1�*?j0Ba ?�
    kPFMB@DqOF!2KG@jEzE9 O0MGjE2OEF�rAIS� HD:�
    #	;ih(>T9
    JA��UFx<?F$D"?"Qhp%�A��@u`b��" ?2$u�`b1,tb?@Hl
    >*$#/
    	/JGU'�(�(Iy'�?'&P?A�bU(B<
    #n X@s#;L#f\t+S
    #!$5q`?C�o�p�y�r�i�gT�t>(�c�)>2�003>M c o�s f"!r #1a i n�.> �A�l>0 (sB2e*0e vT0d60%`d1l>.p�Uh ~!
    #@�]	a�25	0Jn1�*?j0Ba ?�
    kPFMB@DqOF!2KG@jEzE9 O0MGjE2OEF�rAIS� HD:�
    #	;ih(>T9
    JA��UFx<?F2L&?"Qhp%�A��@u`b��" ?2$u�`b1,tb?@Hl>*$#/
    	/JGU'�(�(Iy'�?'&P?A�bU(B<
    #n X@s#;L#f\t+S
    #!$5q`?C�o�p�y�r�i�gT�t>(�c�)>2�003>M c o�s f"!r #1a i n�.> �A�l>0 (sB2e*0e vT0d60%`d1l>.p�Uh ~!
    #@�]	a�25	0Jn1�*?j0Ba ?�
    kPFMB@DqOF!2KG@jEzE9 O0MGjE2OEF�rAIS� HD:�
    #	;ih(>T9
    A��UF"H$�@Fx<?QQ9@hp%�A��@ju_`b��,it+ ?u�`b1"HZ]afl#A$
    	/JGU'�(�(Iy'�?%&P?A�bU(B<#l X@q#;J#pf?S#!$5{`?C�o�p�y�r�i�gT�tG(�c�)G2�003GM c. o�s f"!r !1a i n�.G �A�l<0 (s@2e0eJ vR0d40`b1l>9�UhH~!#@�	Wa�250BJl1�*0Bk ?�#
    k)NFMB@DqOD!0K�E@hExE9O.MGhE2OE#S�rAARGS� HD:�
    #	;ih(>T9
    A��UF"H$�@FjZ?Fx<Q9@hp%�A��@u`bW��,t+ ?vu�`b1"HP.allAJ$
    U	/JGU'�(�(Iy�?%&P?A�b(*B<#l @q#;J#pf?ST#ҿ!$5{`?C�o�p�y�_r�i�gT�tG(�c�)G2�U003GM c o�s f"!r !1a i n�}.G �A�l<0U (s@2e0e vR0d40`b1l>9�Uh~!#@�	a+�250Jl1C�*H0Bk ?hk
    kNFJMB@DqQOC"0KE@�hExE9O.MGhE2OE#�)rAARGS �HD:�
    #	;ih(>T9
    A��UF"H$�@F\.?Fx<Q9@hp%�A��@u`bW��,t+ ?vu�`b15"H@Q]anl>$
    	/JGU'�(�(Iy'�?%&P?A�bU(B<#l X@q#;J#pf?S#!$5{`?C�o�p�y�r�i�gT�tG(�c�)G2�003GM c. o�s f"!r !1a i n�.G �A�l<0 (s@2e0eJ vR0d40`b1l>9�UhH~!#@�	Wa�250BJl1�*H0Bk ?�
    k)NFMB@DEqOC"0KE@hExE9O.MGhE2OE#�rAAR�GS _��H�+�H �lҮ
    ����9E!'F[5���#]7��B�
    CUߌ8��qaW@o�@��T9��RaG$7^S�lP^?��OĈ^IB�^D��^:�<^vJ��,�^N��̍^*Q^S�Vl^X��{L�[��,^]��OUFDf�P
    h,�TPYYBU?Y,b'@?#H$ @Fx<?F
    BP(?|	P?7� �
    b�3b��Y'�GMש c @3�b 2;G3(;9 
    BFL&d2?-(\.,(.sU!&L/:ȍ2H?$?66?	�`28w( 	0`Cc�o�n�t�e�m�p�+�E�4�1�5\�;o�r�a0y\�n\01,�b0x\�Wt�i0l2c0p21,0n4aH1m0e2c$e^	)UYG& ��U��'9?@�?
    �piwwv�|r		?�_��O��u���D�r�a�g� �t�h�uesa�pWo�nodw�i�pe�.umt)�clO�yiK�zdf)�te�x:T	8������bjZ濰??ֿwd0	v?�:F?HF1Q׿Y,b#H$4F
    "=
    UG	D�
    #	h4^�TYY��U@Y,b@@#H$@FjZu??P}	�r�u�` n?u�J$��P	`�Y	\�
    }(�L�/g$)\+$b%&	!҉U"L��@"Ԓ#!$+-`V�i�s�_�S�E�.�cP�m�!�#\�9�2�5�8~!`?C�o�p�y�r0gP�t� c�])O02�0[03O0M0cE0o0o�IfM2>1rA0z1aM0i?0n0 O0A�Ul0 E8s2e0eE0v0d0$	3$!  	M'?%#	*11(@L&d2?SMdH\.˳vHTNsUA F3O&dH,%5e,^;E	E,"�UHXQ�%dTYo[%dT	o[�5dTo[EdToWgYdaoz\11�T%Hd"&Ud"'bd2!԰!(AcFx<?!M0%
    X
    Ycbb
    ,D!EKaQc;E�w�r	{e%Ac%dB	TbZvff^sKsea�=%?
    u_b�	h{
    b�u#v595|btQ"tRr!NsXa`as:u&@r"d%aM,%H�C%[Crb}�B%&%d?-@@%^Ίscb�1NswL	svt!Òl@酀>  v rpß՟= qt779p"K�"p	ok,o��AAc"(%lF?�!4�72HA!rssa)C"`)M?01 M0oO01a0gf01u:2 0i�z024Cfr!cnЯ(Ac)h4/Z(1
    3R2iW`汼f0N1t0xvbfv�^%`
    Sg211'.�X,0;~ ͭ�Y#
    &%jVhaPE	{G6!30D4$03J2~MJqEr!a�}/No0'HD:�
    )#h	<>T$]]9	JB|A��UFjZ?Q6t�`~A��@ctM�3�] ?,#Au`�#u$Ab
    Z	.J&AR>&A�>#U0zGz?@4F&�)+P#J&'*MJKP# s';!S3�\P#2q50?4?F6G#?\.?Ae.R7/[�3^$E$I=P#'�(�Iy�Q366PW4� @~>3?@Ie@?IFdF�vbJRHuAڭD&uLAd�pA�@*	O@-F""" ">RRIF7BP#AQ17;R`?C�o�p�y�r�i�gT�}t@(�c�)@W2�0P3@MP]cPo�sPfRRQrPQaPiPun  @A�lPU XsbePePv`d"`1d#e%59	,�P#Fx<?e&Af1`#e@?@3�`r>R�s>!
    b�j0@r%Cb�)S6IWI@CAoob8yej~(helJ0>Uh}57Q4\P  D(EpEK9CZ\Z_�~(:�~d9BCoM6O%5�JN^5EWi�̏P%	TAqq>"D(2d?&�DRw�sBt2i>oPoX7'�0\E!4qw;	k8ޟ=5#T
    �HD:�
    #	=h8>T ]]9	z<A��U@FjZ??FQ6u�`b�A��@0tZt�`C$,A>{q{&uDL
    	J#U0zGz?xč7#5
    ~L{p^#(�"Iy�$(P?A�j&�u#0@3;�bM�h".aSK%l@~2?t7�
    N)ud `bd�-B1>2
    #.6"x'F08"l�B\#/OM?\.+?l�Q!N,#IAD5W`?C�o�p�y�r�i�gT�}tk�(�c�)k�W2�05P3k�M!P]cPo�sPf'RRQrPTQa'PiPn�.k� �A�UloP XssReGPePvPdgPR`Ql>0>UhhEQ7QlI!%4	VWa�JB#Fx<οR�p%�O7l:(_?>mb3l#?ko}k%GmBc! oa2_il`e1%I;mgUo�gc-R6:oLo^ooj:(he(e�
    PA@#e1%9	6a	llMi�P8HD:�
    #	Uh	<>T$]]9	QJBTA��UFjZ?QZ6t�`A��@tM� .?,#=7@u`F�u$A\#b
    	J,A>eA�>-U0z_Gz?X@#b	�%+(#BMJa� @%=P#8US2@Z"z(#2q0??6?\.?A24P#E6l3s<%s<s7%7l/[�3*4\>G(#'�(��Iy�366PQ?A�Q$4@3?@I@?pFF�vJRHuADuLAd�.!	E' D"eBm1eBEpFB(#Q17;R`?C�o�p�y�r�i�gT�t@(�c�])@2�0P3@uMPcPo�sPIfRQrPQaPiPn�.@ �WA�l
    ` XsbUePePv `d`J`1db%9	)(#FOx<?=&A91Ce@?	P2`=reB�>!
    b�j=r%�b�iDVWIC AoobEy	u!jKo]o!o$)O6!3r05�!4P6K?O$5l(>Uhm1yP	Q4\UPŅŀB(DpGcK@OCypW�`(RplK9CG8M:d9BCrgheDa'�qq"(#Td?)wDA
    EsptZ"iUo$'r5%r"O6	&m2Z"!ko+e�
    �UHD��
    #	hz8�T YY:��E<��U@FjZ?@?[?FQ}u�`mb�A�rA*�$	G^X+�t�`Zuh�`UG[�#ul�
    	J#U0zGz??FwM�7#xUL!QFU=#"��7Iy$�?&-P?\#2q ?/&?\._?h�	!~ќ="Ix<?@h?FS]6�]6<"fp%�h?B+U*%u` `bd�2&3-0({A&J.9F*B#ADH+f`?C�o�p�y�r�i�gP�tg�(�c�)g�2�0@3g�M@c@oK�s@fBAr@
    Qa@i@n�.g� �A�l(P Hs,Re�Pe@vR>Pd P`NQR2#tP,&^�tpS9A#�CAida_j6((__(^uT@t(Pe�
    JP^%	|Ye#f4?h@ho�|9b�4@#�`2>0a
    b�j @8K3�*w7kK8_otHD�
    ##=ih,>T!9	3#��U@FjZ?@۪1?@~?Xk[?uP>.[
    >>mu�`b�A�$&u3�`bu3u..nu |15&tf5J7U5
    WL7Hp6	@�*u`bd�p&�-DJ 5k!,�$&�,e�%{1@@J^j6H0L:rt-FS!{115`?C�o�p�y�r�i�gT�t� �(�c�)02�0030M0c0oK�s0f21r0Aa0i0n�.0 @0l@ 8s!Be0e0v3@dV@��l>0>UhhE~13\1��J*9'W!B#H
    (E2&OG?O[3�^;%0_B_WUN�_O_UO)__M_
    (bD0ul3@-0lJ2k0t0ay0e0
    @o04ACQSb6Aac2"x`	i0a"c>AaahbAc.iF��bzMI	JXw'�o0qhp?!TWA5	.v3j"FJov!3 wv��@1}yozva?�?a2`BCEkZFJJ0_F��H'�����qCs*����gADzd[aw���#?]cV�B�
    U1d��qa@o�@�}+4To�\aG^?e��P$^j��j�^Eo��4^r��^}w��hT^z��UFDf�P
    h$�TYYU?~@ǿx<?F
    BP(?E	P?C� �Zȅ2H?Se?C| 	0O`"l�i�n�e�,�cs�oc�tWo�rrub�a�sc$o^
    6%f2�:Y�`	C.M`"
    /"e:/L/J
    IiV(/?XE_'�0U2-!0ED� ��^���� � �-}|5p`I`V�?}`xa�833��ސ���]���3σ3��u����33?,	�?Gxpx�^��&�
    �D�r�a�g� �o�n�ut h�e]pe�,nqdd�sb�l�u	x� < ;�hRp	�<(e#�w �i7i�cUtecn	�c]i)�.lu
    e��b\.[?D?�HD
    #	=h	<>T$]]9		#FA��U@bX?\.uP6
    u
    ��`ub�A��@Wu
    ):/*PAh@�u	�` ?hjt~u�JKaJU
    @)-?nDxK'$nU-t'(�2rq?@I ?$v%?
    @�	j
    2*ALA- b�r@	]�l
    2m<2u. 
    228F
    2u9h�LH/MR#AD5/`V�i�s�_�S�b�a�.�cT�m�!�#�4�5�7�6�8%`?C�o�p�yL0i�gT�t� �(G@)x@2�0@3x@M9@cL0o;@o�fvBgArj@Aav@ih@nE@ x@A�l@ nHsBe*;@eL0v@dE@\@bBF0	l	C	G?9K#CG�03A0E+4z'e8
    &g_K8	p@?l�Uh�5	_AY�J48$Ie�14AbC�2$4hb(Be[kT ljaiAeE9	]UjTg'�2"qV!TQQ!E	m&pO2ĄWB81e�@2ghekJTAt	(81ap&@DQRHu��K���g$R}���
    �l_JFD[H�����#]΀w��7O�B�
    YD��do�@{�+T1sDVo�PUFDf�P
    h>$/�T6D
    U8��UF~@x<?F
    BP(?3P?x� �*+1:
    b�jb��::.Z*(	$!HU?&?V2"d: 	07`b�o�x�,�r�e�c�t�a�n�g�l ,�b s�i ,+�3e!^
    %k+�UGi//XO''�0Uy2!0u ��H��B�,23�?wO�P\nВWD�r�a�g� �o�n�ut h�e]pe�,ndy	�l9�o�w!imda#�j�u�	s"e
    �XNUoittE�.v	�rclf9�i
    �sBQc�tfpsc������UGDF�
    P#	h>8/�T 6D
    UUň��UFU*JR@F~?FM&d2?F\.?Q�U�[u�`h7?u�*�
    bZ	bYzzA	u^tvz
    /'"M"M"M"%\lU"/L��@"!"/%\
    b)#1	4+`?C�o�p�y�_r�i�gP�tg�(�c�)g�2�U0G03g�M30c10o�s+0f92*1r-0f1a90i+0n�}.g� �A�l0U 18s2eY0e10v0dy0Y/`V30s�_�S�bo0.?0h�m�!�#�4�5K�704X$!) ��Iy�3i?8FP?�lA%��-/3	78F& ~O&~
    �e$^=%%,\�U	H5Q�%ATL[%ATLWpda_'UT(T"(TFx<gf�1�\+bZ;fl#�t `r1�2tV[dcg�Sjk&Cw"`A0j�uY0:1D0p90hg�aw0dg�P2sB-0e?0r11}$dB^	MACohmh]C{�rQ	�^BsRbtF�rv/"cRq,^E%Y\DUt@YA2	  �&$1<0`%t`CWY�k�|b%��Z`rCl%ÎXޏ y 9@@M_qg _$yYS@11"!!"(b�Th?'rW`�]btR[d�ts"á%s&ե&@ߢ"B�a�|!ml'M7HD
    #	;hj4>T]]9	B%A��UFM&d2?F\.?Q6#�t` ?M�t�
    ]b�2 Cu\Su!b��A��@
    2	A�J#U0O迴Nk?=@L�B1!6$5`?C�o�p�y�r�i�gT�t(�c�)2�0t 3M` c^ o�sX ff"W!rZ !af iX n�. �A�l  ^(s"e* e^ v d %`2 @&>SI$k�L��I/y�>#?6MP?A�-=#	E='6A42l>
    0>Uhh@=	d5O!4w�	a�lBrEr@JTFF��HbxF
    BBM�Ba�OADM�E%^_IDE�45UF^_O[d5$ڞO3�rA
    �5c"HD
    #	;hj4>T]]9	TB_A��UFM&d2?F_x<[??Q6t�` ?;rb��
    t
     A[��@u�`AEb_� ӀEOuu.x�(O 
    2	(AMJ#U0O贁Nk?<@L�<+#k @p#;�dZ�SyQ*B+#!$5`?C�o�p�y�r�i�gT�t(�c�)2�003M c oK�s f"!r  1a i n�. �A�l;0 (s?2e0e vRQ0d30`ii �L+# �!�Iy�#9#9PI?A�-+##	'H6Ax2l>0>Uhh=	5!D�	a�BET@JZ+#F��F"
    R
    &ReY(/D�R�rA
    "@QEIDt:N?Fs�hW �!GR
    M@Qx52DX �SrU~Y5UOezRgzYdAlePx59	O&]U5o?�pHx5awP$V)wR#b�RHD
    #	;hj4>T]]9	TB_A��UFx<F\.ߗ???Q6;r�b��
    t�`A[��@u�`A6+t} ?M+5Ab�ƑuJuBJd�5
    	Y]AJ#U0O贁Nk?<@L�<+#pk @p#;�i}:Se7B+#!$5<`?C�o�p�yi�gT�tI(�c�)I2�003IM coK�s f"!r  1a i n�.I �A�l;0 (s?2e0evRQ0d30`Ui J�L+# �!�Iy�#9#9PI?A�-+##	'H6Ax2l>0>Uhh=	5!D�	a�BET@J]+#F.��F-:\i
    \
    B%VMY(@!�9G\HASE/P]3{�r
    �jR"CQx58MA? WAQWUV52OElTbPd�Alex59	O&P[F5Io?�px5	wP$V)wR4RR4RlcbN&d2鿸\.?L?jHKMD?XiB?Ƚ7U*JR~{T5=_��H��0ׄ���5A��Y@
    	F[���#CX}��RB�
    ,]]�a@q��@�Gܞ^u��<^?)��^��h$^K��f+T��b�aUFDf�P
    h>$/�T6D
    UUF~@x<?F
    BP(?43P?� �J+1:{
    b�j/b��::I!H??҉~ 	0Q`#r�e�c�t�a�n�g�lK ,�b�o�ux[ sP�a�d_ wc,ek \!ae iHM |e^
    %k�Ui//X''�0US2!0u ���E�G�+?>�M�߄SYk}
    �hD�r�a�_g� �tesa�po�nodw�i�pe�.d�w9D������HD"
    #	B=h50>ThP]]9	E)A��U@~?FM&d2?F\.?]P6	�u�` ?u�&
    Wb��GNN	N8AvV�pvMJGU��?Iy�@�a?&	?A�Hb�d5
    �_L��@="J!$5`?C�o�p�y�r�i�gT�t� �_(�c�) 2`�W0�3 M c o�s f"!rԲ !a i n�}.  �A�l0U (s
    2e e v0d O/`V s�_�S�b . h�m�!�#�4�5K�7S03,1g��-O/#	'Q&A	B&p?L7
    l>]U�hz!f"S W�	Ba<#JTFiF�"N8F
    BMBC(4cDsOAO�="Az%NOIA�EEjF)_OM[E2cO;BrA
    �RSR="qD,bPEO\J@[d1"�f S'C'2eM�Fi[mboth'bFN2eF%RCon�0okf"Cfz%dfRm4wGyHA0��dg9g{wf ?CbvBw(e�P[@nT[g1ex'BTAN!N#C(ST'&@oa2bL&d2鿸\.?P?hHKMD?\iB?Ƚ7~645DH'��6���Dp=#����4�GJˣF[ݘ��n�����tHPK��OB�
    #V]�d̥W@]�@^]�P+<To��VaUFDf�P
    h,�TPYYBUF"H$ @FY,b'@Fx<?F
    BP(?|	P?7� �
    b�3b��uY'�X^ c @XW
    $'BFL&_d2?^-o(\.ҁ(_.sU!&/&:ȍH$?/6?	�82!R% 	0`Hb�o�r�d�e0,�t�i0l0,�1x\�f0a�m27b0o�c�k2e0t\�n01,�s01bT01c0p2o0,0a0e0AeK�g0n0;$e^	,3�UYG&O ��Ad����!3Eo��W�?�/y�}
    
    �[-oD�r�a�g� �o�n�ut h�eqp
    �a�d� �s�ml/�,r	�s�iK�zb/�
    bur�e �w=�T$t	�x /�Be/�.8e{������b\.?฽Y?#|>U*JR47T=UGD"�
     #		h4^�TYYU@|>@@U*JR@@\.o?P}	uz�`3?Su�V22Y<L^Yd
    �.*.88L�L��@Ա-`V�i�s�_�S�E}cP�m�!�#\�9�2\�2`?C�o�p�y�r gP�t� �(* )[ 2�0g 3[ M cQ oN  o�fY"J!rM !aY iK n} [ A�l  Q(s"e  eQ v d}#l? "	'?3-8Bd(
    5P8@L&d2%?=ɟ8ұ8>sU16?_8e#a(=J
    I
    H XAdDYoGd@ha5	Hf?@3O3�tYb�gdaN_+T'T&T	9|S3;?�.Q�!SQtRTQjԺ_PKrQ�=3?
    %e_b�	h
    ,Q�d%eSL"QELd
    g&@RB8Qa�l,klFᏊ\tHD�
     #	=h,>TBE>NA��U@\.?@|oh�@@
    ںQ6
    t�`b�?A��@63?
    t�R6/6r�^Ҕ	
    u4 u7m>b�I�J=U)��Iy#��?/&P?M#l!q$51`?C�o�p�y]i�gT�t(�c�])2�0 3uM c]o�s If"!r !a i n�. �WA�l  (s"Ue e]v d /��`1酉##0z߮Gz/#@2#o0@M=3�Sul>8>U�h3319	�D!	l22J1�QC�=B3?6
    �RoFMZ(9#MfQ H=OOA^�"#8T#DE)G'ITQ ]WD6h^^�"AE9BC^^EEZ#DFWIt!f@L,_>[.B�]3O[SOeAE5h4)OVA
    0DbB3Z(`d
    0Ab9	w9M~3þ?3&3xB@1Q(-DT!?b�$
    CLjF
    ~B
    2rssr1}CwsHD:�
     #	=h8>TA3[]9	EEA��U@\.?@f�Q6
    5֍t�`uL
    -��@!	'A'
    3?3Ft�3cuH�u_Wb�Q&b�p�.0jdDAE)5
    
    
    #
    $"IbeQ"W&X3J#U0zGz?<@: =#)��IyM#��#)PK?$#I)1.45Y`?C�o�p�y�r�i�gT�}tk�(�c�)k�W2�0l03k�MX0]cV0o�sP0f^2RO1rR01a^0iP0n�.k� �A�Ul0 V8s2e~0eV0v0d0��K`1
    2#0@M=�
    SH09#+#
    A2'2B
    E�XsXĎm�sU�g9O#�XD.&LR"o/ҁ$\#2qP?_VM??#�D48:@l>0>UhhE�		G18A#�J19qH11P?b$S3KS"'�LR'"M(!}oHaoa8VndFF'IȏT@_L_rS!C_Q(-DT!;?- @)sa%6nd|Ch�Ge
    _jz+uTtoTxQ"�rA
    0Q"�v�X0'herJ8bTX0t0e %h׏k)HƏ _��Hu������"g^���&Lu1F~Ĥ[b�#]b��B�
    TM]�}a@_@�+ϩTc�BB�Gy^�P^��p^?7��ܩUFDf�P
    h,�TPYYBU?Y,b'@?#H$ @Fx<?F
    BP(?|	P?7� �
    b�3b��Y'�GMש c @3�b 2;G3(;9 
    BFL&d2?-(\.,(.sU!&L/:ȍ2H?$?66?	�`28w( 	0`Bc�l�a�s0i�Uc\�t0t0e\�b0o0k2e�x01o0,�f�r0m279c:0p2o�n\�1ub0l!Be�g0n�db%e ^	UYG&u �� <>w???
    
    ���(��
    ��:��>�B��{Mh���8��3<�(�i�D�r�a�g� �t�h�uesa�pWo�nodw�i�peS�.
    ai%l?n!� a8I DsNcGB VNr5s)�z7������b@ jZ[??Y,bw4>=vUG
    D�
    #	h8^�T YYy��U@Y,b@@>=v@F@ �@FjoZ??w?P}	�f^�( *�+J�V(�2JJ�։u�`h?u�b	
    ]r##�‰UK/
    ����)!UFkJh�񄄉E#<"JL��@3"E#14[;-`V�i�s�_�S�E�.�cP�m�!�#�4�9�_2�5�1"`?C�o�p�Wy�r0gP�tg�u(0)g�2�00U3g�M0c0o0o�11r0Aa0i0n0 g�A�l9@ 8s=Be*0e0vO@d0A43Z4J 	7?h�|	]U8@L&d2?MX\.˳XNsU@Q >V3`_c6dHX<;%Ee^kE	5L5I8�UHgYda#ozET$Xd<"%edL2&rd2'dkBT1T1Ŵ9(IQch1�Rh�r[a�.ct5aL52QcFx<?c"F�cp	�b�f5jt]"s5s6vw&fKca{�h?
    ub�	Q
    b�J
    ufkE9R||uab�tQ tR(?wL"f&@
    <"m oL5@mQc*[j9(Qc1El9�	`�@�x[ask�C`C9@a0s	B_`TP�e0Q_"`*;Bn0;"Er0;ʾ0lO@g'@`;�N0bp'@dYRO@t
    Bp3"d�haM<%e:t?,h1@hf-uhaq�^A"x"(rk{}t!r(s9>t0vz0p=&t0' t$ӭĥ' ,#7#<%E*d('o]B�b[�rۣc	t0ۥr[bp#twsp�l~pp<"%9(	z
    FY�14I#At15r$5r" aC"`SM0XA 0og�1~gfO@(Au
    MB %zO@^BwBC~ƕ3"nV*(<N`ȩ9(Qc9@h	5=c610&&'f01bx0�v�}2`
    SB(A1.�Xr~t0<M�YaJBڳa�OHaAj˯HD:�
    $	T=h4>T]]9	tA��UF@ ?FjZ?@i
    nPh?@߾3?Pt�` ?A��@�t�
    *uL'bd�p&�-QYDV._>uju&zb��U
    	J^0zGz?I@L%"+%+@#�o 9 N$(	?A�n!4@#/8?M?\.?J*�N A6*2<<7%"Wb4+%%@#14*� `?C�o�p�y�r�i�gT�t(�c�)2�09@3M%@c#@o�s@f+BAr@XAa+@i@n�. �A�ls@ #HswBeK@e#@v@dk@, `12$@@M="SH_�3l>0>UhhE
    	tA$�	a-#Ja�U&U&44Rx(sU_p�_V%^_YQ�U7s^o_>ks__xoVi[&,eE(V+"[@#'�2UBrՠA6QU{w6	77�@AL$Rb�;A
    b�Azpv�%!b$#+!45!%"3Av2'MqM@#4z0BsI[m@X: r�~G."jAle7;I'A?!m3`�10]Ow<F>??;i?=%"1BBFk5GT&$h#�+%he�T%@ts@eh 
    O@xQ*(;L].+@�JΟ?�5�PSz5,ZAe�?!6vT{�<>7B1�>�}8��H?����_L���f~]m����!AN]7eF[ɭ���#M��B�
    ZDn��xa@o�@�+𬯪To�AaGg^+��6P�+=Oas^a���UFDf�P
    h,�TPYYB��UF"H$ @FY,b'@Fx<?F
    BP(?4|	P?w� �
    b��$YCw=CCf[]�Y'%�=U  @/0}3�b �32!?#\F'3b4$f!BFL&d2?-ɥ(\.Yҷ(.sU!&/:dH$?2?D6?	[�n2q(H% 	0W`&b�o�r�d�e0,0d�g0,�m�a0g�iS�n\�1u0d2y\�f0a01n0o0:eN��^	,#UYG6u ����	?؟ߍ~ߏ�.	*���w_��o��	��t���w^
    D�r�a�g� �o�n�ut h�eqp
    �a�d�-�s�i�z	�"br�eR.hn�l	�src6. �cYt	������bz^
    |>@@V% @@"H$Y,bD4
    ;UGDF�
    P#	h=4�T3
    YY��UF"H$@FY,b@Fz^@F|>%]
    @P}tS��`b�r7�wtTu�` n?5u�j@
    box	x6&�	���Y@	&r��^	�J)J)!J)rJ)6!J)G,	+vO$��$$&&$(!)-A<2�A)p2HN!*U27v�(5~��@=6=�7AO"G@M`	E�v�e�n�tr�o�p��JC!WL0Jԭ3AD;-`V�i�s�_�S�E�.�cP�m�!�#\�9�2�3v\=2`?CB]y@i�gP�tJ0u(@)J02�0.PU3J0M@cBs@If RQr@MQa@i@n@ J0A�UlhP XslRe@e@Ad@o񤀍C4!o2	MG?A3E	8:��8@L&d2?&m7h\.gIh'nsUoaAmfo6d<5UeYk}r�UH3q5?taJ{�E?tJ{U?t!J{�U?trJ{e?t6!J{?t!JwntqaPd0GrTq(e28Ѐ^UAAVO8Xrr6Ia&`H@d@ +�&DPo@tR@#`SP�o{�w�+8ȄDž02q%xxgt!p&!I��R^%2ȁȁB RՁՁR'۔	E8^Fx<?I"ŀh	�Gjr'B
    bC'&76R%Eaa3!�aahǧj;r6!]2U@M:dSqrՁ$æ�7'U0`A±KƒޑA?
    6b�	q#
    +�J!8ȥ	>r2Be9@nbƣ'V4QD	t
    BBE&s&@2,%cxAV3Tۏ텍A"4TXj8FC�A4a�=2LրAPA‹2! qC}`M@A @oJ0AaJ@gf@WQu|R @i�z@RǢT&BBxb`,,G7H|aHD:�
    #	;h(>T#P9
    RA��UFz^
    @FWj%@@Fx<?Qt`b�A��@p%�b	� 5?,t�H[?cuM)udb6
    	l[>�J7U0zGz?Fw�@	A�bU�B<#f @k#;5:#S	>@N"J#!$5^`?C�o�p�y�r�i�gT�tL(�c�)L2�0 3LM c o�s f"!r 1a i n�.L �A�l60 (s:2e0e vL0d.0`\1l>]�U#�"!v`%�	a2a�30J'!�q�y?B- )@B5Ou0+O�=JRN9mOMGBE?HOHHD:�
    ;h0>T@h]]9
    7A��UFz^@F|>%@F/g�xW<?Qt`A��@t� y_y?" ?p%�>unb�`urb
    	m>J#U0zGz?@L�eB5
    �'L
    ='�(�IyC�
    $(Pw?��
    < @#;�r}S
    &Z#J145`?C�o�p�y�r�i�gT�t� �(�c�)Q02`�0�3Q0MI0cG0oK�sA0fO2@1rC0|1aO0iA0n�.Q0 �A�l0 G8s2eo0eG0vR0d0`1l>]Uhz819$�	a�5B;E;@J1gF�mK�"{BH�K
    �FMB!qOG?�OCEd%NO_�UWE%EhF?_Oc_E2aO;�rAS HD:�
    ;h0>T@h]]9
    TA��UFz^@FNt%@F/g�xw<?
    ?Qt`A��@,tt� ?p}%� yy?" (]ub�U#ubwb
    	>J#U0z_Gz?@ZL�B#65
    �>L
    醑=#'�(�?Iy�t*$(P?��<#p @#;�MS
    =w##71<45`?C�o�p�y�r�i�gT�t(�c�)2`�0�3Mf0c.d0o�s^0fl2]1r`01al0i^0n�. �A�l0 d8s2e0eJd0v0d0I`1l>]UhzU1V$�	a�RBXEX@J1F� �BA�,
    �FMB1!O?OCE%N�
    __rWE%EF\_O_E2~O;#�rAc0�HD:�
    ;h0>T@h]]9
    AA��UFz^
    @@*I?@Fx<
    @FQt` ?A��@t�`b�"p%k�u,�u"b�)
    		>J#U0zGz?@L�B	#5
    �1IL=	#'�(�Iy�$(P;?��<	# @#;k�?S�d#J	#$1)45`?C�o�p�y�r�i�gT�t
    (�c�)
    2`�0�3
    MS0cQ0o�sK0fY2J1rM01aY0iK0n�.
     �A�l0 Q8s2ey0eQ0v0d80&�`1	l>]UhzB1-C$�ʏ0?BE@1X6^7J1�q�BH>BK
    �FMB`!�Os?O�CEn%N	__nW�E%EFX_O|_Eb2zO;�rAc HD�
    #	=h8>TB# ]]9	B��MA��UFz^@F\.e%@@i
    nPh?@*I?Qt�`A��@,t�p%�l?u?ul�O{ub�au rVb
    -	$A>JMJ-U0zGz?FwHL7#MLfB#?/&$W?l�A'L%4 ,"��Iy64/�P?A�K!	#??r*F `bd'M&. @1W1m.6mEaLr] 'T2#ADg+`?C�o�p�y�_r�i�gT�tk�(�c�)k�2�U0P3k�M@c@o�s@fRAr@1QaPi@n�}.k� �A�lLPU HsPRe$Pe@vbPdDP`TrQB2#P@M=�E
    S1L|3l>
    0>U##@
    Aa$w�	a�3b%9e9`J2!812&� GlCyb9ChU(0^e6oog?ok�%n5oo3we7�^noAe5^ooHoU(T
    �jA b7;Y!d$I?!3XQ�D!d4a*,=E#bBi,>ra'7'�2UB[,&	7VZK&!d'(;L].+@�vŏ?�n5�x"�Czz5Abn؏!�T{�<R1�>�}�wHD:�
    !!#	T=h	<>T$]]9	EB:A��UFz^@@@Я?@*?I?UQt�`ۀA�b:u&gu 4uob�Hu�I`#\##
    	#l]ARe��J#U0zGz?Fwh�L�7#ML)\#?/&M?\.W?D&2&4f "��Iy4/�PI?A�#jEH/2	~3C3R*hp6�3Y3??-f `bd�-�>ATC.'FT,i�H3YDY}k"
    z'k"Bc2#A~17;`?C�o�p�y�r�i�gT�t� �(�c�)2P2�U0>P32PM*Pc(Po�s"Pf0R!Qr$P]Qa0Pi"Pn�}.2P �A�lxPU (Xs|RePPe(PvPdpP�`{1B2#pP@2&>�k!KS'A6l>
    0>Uhh�5
    Q&@J"U\fP_be`2?J19LGDbeCh<(e�oE1ok%n5	�nwe7nXo|ec5o&P<(e�07a,Pe2P
    �j(he$iAb7(;YXl77_'�0U�&6H#D1a+	7BˊfxK'$@�Y%+zK8._"�zW5k8u$
    ,Ab0YUa@TQc4P08P��HDB
    !#	=hj8>T ]]9	RjA��UFx<?F\.e%@@�s?@JdS?@Q6p%�b	�A�,t�`
    l?uL^(bd�-�jRu(k.`u�`bC�~u'bT
    	>,$X�J#U0zGz??Fw�L�K:#5
    S@z�
    '
    "�\:#?/&M??l�L4SI"��IyS4/�P&?A�B?? L^py�!~uul�
    ''E:#AD5!`?C�o�p�y�r�i�gT�tk�(�c�)k�2�0P3k�MPc.Po�s@f
    RAr@7Qa
    Pi@n�.k� �A�lRP XsVRe*PeJPvhPdJPI`xQ2:#P@^&>�tSHAu3l>0>Uhh
    At$�	a�9b?e?`J190GlbIChh(de6uog?ok%noo�9we@5dn#oGe@Edoooh(bTPtRPe�
    �j(heHiAe@59	YXt'/'�0Uɂf63Q;	W_r��H'�09���!j	J�����=5@
    F[¼���#Sw��B�
    U]��}pa\@o�@�+CTo�SaG^$��PD^��w\^Y�<^��˻^��}���!�^��^��+�����������������t4�"H$ @Y,b'@dnBQ��
    AJ-D3�[7U#$U%&'(���������t4"H$ @Y,b'@[��C-4nB*7�
    AU%&'()���������t4"H$ @Y,b'@dES��C-$nB2*7�
    AU%&'(+���������t4"H$ @Y,b'@DS��C-nB*7�
    A�����,������������t4�"H$ @Y,b'@nB��
    A~-TmB8U(-.���������t4"H$ @Y,b'@/LT��}C-īYe7�
    A�����/������������t4�"H$ @Y,b'@DmB��
    AJ-$3�7U&'1��t4"H$ @Y,b'@0L_��C-|@%7�"AU$%U&'(2���������t4"H$ @Y,b'@[o��C-mB*7�
    AU"%&U'(567���������t4"H$ @Y,b'@[��C-mB*7�
    A�������������������������@���H`e��D���R�������������������@���F`��N���R�@���tG`<��N���R�@���G`��N���R�@���G`
    ��G���R�@���$F`o��M���R�@���D`��D���R�@���F`'��H���R�@���DE`��N���R�@���C`	��N���R�����H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(�������������������������E���I`=��
    ���R�������������������E���H`J��
    ���R�E���TH`W��
    ���R�E���\F`d��
    ���R�E���|E`q��
    ���R�E���E`~��
    ���R�E���E`��
    ���R�E���E`��
    ���R�E���D`��
    ���R�E���C`��
    ���R�����_z��(FT
    
    ܂V��ݞS�4OIBB!<V4��/"K�f`��*VVg~��SԄV]��S}o���Seo�.�l���Sܷ���SLVX��/?SWv�P�Dt�(�U	3������������������������������������������������������������������]��
    ����*?&d2@RT*$@W�g(�	"*0^p?4	��[�����	#�5GYk}D
    C�:�\�P�r�o�g�a�m� �F�i�l�We�s�M�c]s�f�t�OUfe�V�s�o�1"\"0�}3,\�B�A�K�G�R�_�5.SF��[����7���"4FXj|
    D
    C�:�\�P�r�o�g�a�m� �F�i�l�e�s�M�cs�f�t�Ofe�V�s�o�1"\"0�3,\�B
    R�D�E6_�.SF��Y������"4FXj|
    ��C�:�\�P�r�o�g�a�m� �F�i�l�e�s�M�cs�f�t�Ofe�V�s�o�1"\"0�3,\�B�A�S�I�_�.S6��՜(h*DP��^C!4]$��/]=�/T$`s��/U`���,?\.r
    @:NӇi@	L��FDN�TyB@
    uh$�TB�UF"H$ @FY,b'@Fx<?8F
    ?BP(?JP
    a_�<�k
    //+/J4,,'p*^"p/2.U2-q?-(s>#nu` N#6F"2u�,9#@L&ɯd2?~=ɏ8#ҡ8>sU1 6?'nPO	!P"(!/�TxD-6PwAE-`C�o�&�l@r� �S�c�e�m@s�.B��`C@��Q CGBgO#O5OGMaT"((rqCE{A�CD@f�a�u@tUoSE?>f#EmE@UC	An@e@ItBEBb
    %oT7beT|dQpa	dQu	
    A
    "1TQ Q>!a#Hq%t�{t{tQ�{UtLA{dQxdQ�{tu{axa�{axa{axa�{axA{Ax�{ta{axa�{axa{ax>!�{eta{axa�{axA{x"1�{"1xa{ax�{)UtQ{Qx{xpawMQuPaP`3mQQQac8a9a:a1;>!Bȡ"aA22"1AQ@��paLAqa�Qs%dQ/�E
    =Y!E$i4F?@1"@@M2?@#??(@(5o8RJzrA,ƾ#${A`~@a%-1S�Ll�4�J@cPlJ@s`lu0�ʒ)]u	Qu	.Ŋ(A/Teߨ﵀mUT޻߬uTq�hAdUW/|@f%aߨ12�ǪOOȪYJfv-醴v�eU8PVQJ __D_IFT aczTu<?k��浺2?MQ��iĸ__NXXo7'�28ȃ!E	f1tf5?Qcuϻ"?H$ �,>łTÅ&&^pςϔϦ*l@gPc�y@JL*�<r߄ߖ?�ߟ?&8J�\n/'((�L^p!O_�O�$6HZ�wi�);�]o~ϻ@ %#/5/G/Y/ k/}%01JΆ01/////./
    7l;�oI`4�j?+?�=?O?a?s??COUO?�??.OO'O9O�]OoOOOOOO+o�OO_#_Ώ�&o___l_x�_п#o2GoYoko}o�oo0oou
    �o*<N`r�M|0"!3}4M p|}=
    AUF<@@q"@Ft:N?@Lo??Pu`uޝ`A#<Hx<?@pX,]
    �)phpl�@z3fl~4fpt<
    `(0u;q0:<W�sp!=tNhzs<P2rq?@IK@I0#0O贁Nk?_Fw�F�KdX<4""qu
    .uğU�ޟ	.�%ϩϻϩrܥ�٨&8J\nG�`0@dP!@F|>@@ G?4b3!BuG�`u)
    h="H$ @FpC_@@rbP<1LF�fRC4GOpq%V_/X._�#5GYkFV�BV;qMbS?@;f<ASew�u<1uqX7:�>/P/b//u68644,%1�F///�//2}?+$8?J?\?n?��8N 1??Ƶ?U@1@AK$@@h4F@@0D"Ǒ迂0ؿO$O6OHOZOF2%@@@p80#FE&�&DFfg:_fx񹦂__pŶ&�_jߗt____�v	DS%_�o o
    CnXo$?Vjsoooooo�I%EGY�k}-�#5G)k�}3ssɵȏ�3g	''/*/U&yF\FM:?@JZ?:?G?Q1$oeq|�`}X11_S-c,"305GAי4d4RO%FWXe4F֨&Q��f
    I%r&%?/CՏ&$y
    S�L�F0JPkE�f((Ey
    _ y1ۤQ?9?�?A7CS59�(?2'9K]# ɵ3@ħKtiB��G(C)4XC/'�2%Q!.f	C4ث[KU�ڏ"4FXFvk5?+?*d2e{˳Dܔ3fݟz^5@`0�5[*g`tᔥfίook�Cr+C
    O.�@Rdvk#�[ҿt�);=nXj|ώϠ��C7ψ[�*�u?q�Ef߅+l?O�)O;O{QS\S�qnS˛u 5 c/AS|IZ@@H$%@@
    ?@ƿx<?r;Qclb^up`T?b²u̹ 5!zGz}7quEA^LuƘu\2q?X}?PpP!`0'Vϔ�//C/<4HWb²�ȹg�²"XՀiʷհߛɕމ�-=X{;=X߁߉,J+i�n�t�e�r�cpdPb�yPl�oP4�j	�b!i�g*.?a!
    PA푥OOOOMü__(_xrj7qQaaMqu/Q}\!3x�qu>S`uE 5Q�en]BkĤdv+/qSQQS\�sϯ߯ɕcǟ_d9C>@@-5) @@#@@[?$?$�Qν&�/ASe�+=O߽�K&O)BOfL%�}OOUgO0OO@OxO8_ORt0jPl�104Ao�vR-�sf=PV!:�j#//> 2/nPz@@z^#@@% c/V!�/νv?!6qp?�???????�O�n___OZOf!O�EOi#_G___�ҏ6\_~>_R&[g-Sp[@P`D
    {tw$002\5
    �6e<oGc{أ?/Q/c/u/Ef4F?@`0@@M&d2?@Č锵#?QPgy5tf00a�r��-йz	zSNdS�L�F=JMcSlpsYqh1Pm?[�ōO&ޖ b>qt,1?ŹϲȒ*ץt\4@6
    edRߪ?66^ar@
    h57H�M{5v=g4r�TVa(sqsqh2(<1ޥ??i
    <Xзi'�28�Ȋf	iq�ůפ2*<N`rP(
    `ÿ տ�1,&�1P);M*`lPugݐcRJ�Co�xϊϜϮϢ�,>n?t߆�G?/f�(L^p,/�Om?�9O]*_O�q0�iRdv�	q1�Iu%|{Q5[I!4pa~I"H!+q
    DU@:@@t:NuL?$,?ɖcđuz`up`-Azđ-hH꿄x<X,
    @@�)ĒpOƇ�I @z3jƏ؏Xp*1b*QBbdn(A�`!!S,N.BiBN!q!WZg3m/) ntYNdzsjNHBW!t82rq_?@IϚѣGx#0O贁Nk?Fw�
    6LaE||d3|%k"zg5?U7?9@c?�+۵_oo'o9o�QMmn�X2@@b2L&@@|>@@(?HRGYk{u`uI f
    ;`!H$@@%B@.ݏp%?+I�H]Qn+"b+"�Sㄟ̝_�>#"'9K!Wi{bX,?@;f<ѯ�Rj)�;%ALa$e
    A�i9:ݿI=ISH!�Ѣ( 2DV�tD!!u3#�.%A%Ecbrg5y~@@vn!@@< a@4F##9qϹtbBu�` ?c62u 9ECaBw!ULՇX\2q??6C?0�i}'%v�$VXL%qa0BONgU�vQHb2�9N`279A)gE&xO70OI%N%O�O<W)egN&_OJ_�)PegOO_O絹Rll�ob�a�c�k�-2`l0`s.i2`.K�j0`r)ooL`eFha!oooom3&!xjo/\H\HX7fo!3rgf��@ijV1>`k{oox,_Bu�u/)/;/	X-1R//U@SFwI@@23?e ,?11?6R3�~K?]?o=?O�O(O:OLO^O___�O?V8_z_�#ǯ_d_h(_Gpԯ
    j&s�fj6`a�pr`Gg
    rwoWr{evωy�u?=sUZ�Zkqq%`/r///~߷  `0@@M&d2?@տjZ??Q3S=B:"!"2:@:J1-=m4	q*q,2tq(�s d sT瓁3D~:R=a֫sV( 1x�tV("LC�f<ſi
    J`LNb~؟� Z9᥿"�Tem@T&TsgU55/N/:C�T-(#<2tպ2
    ?)sa
    - ?ϟoom�soooE#ZqZ�t8ߪ;&Yq8'}́q=
    ́	m
    ߡ!P(
    B@@ՁHL?JVD^E<Aup`u%@`Aȑ_FCq:z^@@մZVտй�)pbEG;�p@z3ȑBAO
    ^x"NSBpр*QkV_j_|^q - 6SUq�
    `J1IՀr.@B\eb̅WÐmΠBtNbzsBFbcqDiN2r#?@WIp	uuIyKӅ"DX1#0O贁Nk?Fw
    z!=$X14$t?Б.U3�.sDfsU;@`Aj?KnMWF/1/�_U/g/bHұ�lOM_q߃*O!H$ Hُ.or~6>fe:DQ>DQ:m}Oo�8Bbto�1L�f}8ǪWTh}2N"�fL+o=S�F�4��Z%70�md�/ݏi/�{/W//.Q//�//?#?5?G?Y?k9�Ađ<a~�ȕuӟ9C>@@"@@謿#@@rq[?.?7yFg1.Quz`?au�kDSADRAquMuz?GzcB!a-LLEѽ�	44Ba�gd v}![%//it/�.8??i7.S?�/w?//?!?Ri�n�t�_e�r�c[@pYB]db�yj_@l�1* 4o�]v[B-�sf]jD`j�a]@
    A�ki
    �Z!{e2	U@.P>@@ko@@9H>lSHZl~�Vf"<	//�-/?/Q/c/u//?O�O&?/lVoe?o2?�l????Yo�}?o+Oft،G-s@d�ky@4Hjbrh{Wˏ!356-
    ?(kkJ�EiaOaEf4F?@	@ʹ?p?QٙbZ5_ͲvHد׵J�L*c@ls]a�*o<oٟ`oro-|�cuHqєR,�ֱșRR>B m4΋ߏȵd׿3ſ?*ŜͿ�֗	�׺ߔu�d&8J�\ngJ87.@R R�OoQޗRQ4șNY6FYsX,@@|>U�fl@@эh?`5jVDuĐ`;u
    hpAau
    f
    0x<p�
    ~@@'
    BG@� RuR()CpJD�@z3a>DVbpWA`ɩCtNhpJzG�@&","5#f՘@ 
    '2ruR?@I ?y$R%ؓx#0O贁Nk?Fw<E
    DE=30B�E`XrQʡ\e.qؒUKd4CqJ�dqBV.!o,Ϣ*U`7O�νa#-?QcuK]Ak,_b͟ߟ@Lt�"t:N&S8JS!?BB92	S6&f%b6V3Df6>c/�ʯKWi? mV߀ghVP~Do=2#v�Y}&ouGw߀\s}ܡjeD^l�o@b�c�k�Q%oIOm�%OmOKQ�`ǟ$jOOOO�OU←A
    1d�>PbteNUJUU,389U:;?@ABC���������t4"H$ @Y,b'@L
    �>}C-nBF7�
    AU.U,3CUNOPQ���������t4"H$ @Y,b'@LJ`
    �'CtnB7�
    
    A���n����������������������@���k`P
    �M���R�������������������������������������������������������@���I`
    �K���R�����H<(H<(���n����������������������E���m`�
    ���R�������������������������������������������������������E���<G`�
    ���R�����U`���,�*?&d2@RT*$@	L��FD�TyB
    tuh��$/�TUF"H$ @FY,b'@Fx<?8F
    BP(?(JP[�<d @L#?\.ϗsU!&)/ś 2h-?xz-o(su6` """u�))eH0P	uU	
    T1#	1�^7p4{;p4�{;p4u{;p4D1�{;D1l8H1{;H1l8\1{;\5p4
    x>L1l8P1�{;P1l8T1{;T1l8X1 {;X1l85o	&f >Q>QX0`	C@njPe�c�t@rX1_R
    e_wRUPP1TFQOQussD13�aH1#Q
    a\1uuFP1C'a�	1=E}u\3�D1E
    EeU!Eb$`0?@$"@@M#?[@?tu?
    af5Hhb"u;6RzB-4Ty
    	s~�$!`wS�Ll�4�Jp_c�a�lsS0qlH11�Ua@aH1.E0?GnJYub/�veu 
    EqdD1�d+D1
    E=1)pi/|wDd֏|22wqr@u}vr-̟�gcg@dBp[Q3a�T_Q_S(
    H`&/k��u?xoiE4O
    _X'�286ȃ!6	�6lIo[4jo|oo�oooook'܏@4FXjtetsR~*{l gpc�y
    J*`L
    1�CUg%7�	?Q�cu
    ϟ�7nQ�uJVᯮ�);M_q�Y%	)Y!ֿ�0BTf9i@ӗ�;
    EX14+!nOA�EzpAAE*ٓU@
    pL&@@	ut:N?@LQ?45?Qu`uW@`A�63&uU*JR@w?7�)pF%JG�|P@z�`@EDBJO\O2pQ|AFOON1F"BC{8W�
    `S_Ra.l~xdRBdRs1WS02tYN0F!zs6RH"aSd2м=2rq_?@I)`e'e;Ӆx8#S0O贁Nk?Fw�
    P$Pvg)ٰ�$d�?SeUӼz5S�e6_uu�–//??�(?:?L?^?p?)Pw)AL
    @@@ P!@@}>2A%@ ?̄?@(ׂ??@uF%P`u5M
    F JGi4F_@@r`@FCwpOCuaOp�xEÖ̟͘JuEF"B8�__,_>_P]xS�____U__/܁bX,?@;f<o1oCoUogoygo6-oo�Sc6�.@ạ͆͆ׄ
    u�&r(:L��8,'\֗U@_z]aK$@@hX0D"Ǒ`%@jؿ&8$AĂ%&DL@@p8׀#AG#%|A؟BIV�V=vDa|A�&�H/u�Rdv�TYdSwxSwͯ�߯U#!!a6HVjŰdvxo�п%�7I[mϑk}�at/a%?�I[m%{Q'�߅;i2o3J`0?Mb?@?D%EC?Q9R"Lڵ5Z au61-aIڳ	!ڵ(l�o 4�jc�al
    :Dd=:�')-9/[	W/i/T/UG_NW ^_Ռ_*qF${1,�78a)F_'�+8DW6@k.OtGDeڵd_;CeXGaM,re�n'Fmo5e�lwYp{o�-6/??)?;?"ՐBYtE?%:i$F齔,qXaG'�28CDt!uD3b5
    	q�4w?�$6WcU@~@@"@@(ELFB?ppzY'y4a9d3zf&f2�$I!iQ�iD/Z[�*<N`yB/=eeƵO@
    �6HZl~F�?/7"�??صf_O/6o|/�8ewd9Ko�Y2V?>?????i%hF(Z.H@ORKW`yBVU"!B%@ZQ:e�wÖOOOQgco�uooono'x@FsXoX�F^Du^n�e5(w�"j/4<-AYHS�L�FPJT3_1_U_�(y_L____�_>O0o?�Bկ�	Y+=PCJ\n_3�س	_&U,qb;5Yk}ODWD\ur	@@-5) @@#@@&q?d?dGցAuذ`?bu3i_Ѻf|2[Ѣ5gzGz}PC;صAEcL�˥љ=?O?\os??@9!ZOb�ici+=ufge4<Ue�nӇM~!@FMg'<R;i�n�t�e�Wr�cŐpÒd
    b�y
    jɐl�u1 4�o�vŒW-�sf.0j^j�aǐ
    {q�\[c__o6U(mرD>wIsoU@Ntw@@s!@@b#e`֣oo�oo{y:r�as�_qK֦�Ϗ6ϜZ{8�'Mo/ߠE-o$t@1}P�j0'_9_HlH{eV9!3UWV<&V�ZV%QGa�HGe-?Q:oLo0^oLʠ?t:N&SeB:D:|�.,/5+׮*-�+/.%�'P/5Dy/%�//.??�3?ҿ??�???>?O>?�NO$?rOOOOO�22O_2_�U_g_y____Y
    !3EWi{@"srG@@f.	#ԯ
    �i=QyifSw�////?�u߇ߔOaKϗ�ϥ-QK0Y{,&a͐iߟO�O-_Qcu����v������������������������Ow��~%������kK����B�?���$S�v���P�D���S�v���P����S'���������������U1(�UO"D&aUAUNj	)h"�T}
    	)��U	|
    |�
    '�--	(
    TW
    ((((#(.C+Pɉ&!Q-
    -H*=(�X?#Q)
    - '--o)EQ//?�p(�0O贁Nk?%@+fe��A�r�i�a�l� �U�nc�o�d�eM�iS6?/?`4R$f��S�y�m�b�o�l$67f��W�i�n�g�ds*�7
    fE��A�r�i�a�l"�z�@D�/R$fG��S�wi�mu�n{�a ��( R$fG��P�M�i�n�g�LU{�a ��( R$fG��M�S� �P�G�o�t�h�i�c{�a ��( R$fG��D�o�t�u�m|"�{�a ��( R$fE��S�y�la�e�n��� 
    �$fE�s�t�r�a�n�g�e�l�o�U d�sa@`�9$fG��V�r�i�n�d�a{ ��( R$fE��S�h�r�u�t�1i$�&�<fE��M�_a�n�gl$$%>fE��T�u�n�g�aH"@&>fG��S�e�n�dy�a{ ��( R$fE��R�av�i"&5<fG��D�h�e�n�u|"�{�a ��( R$fE��L�a�t�h#��&�<fE��G�a�u�tm�i &�<fG��C�o�r�d�i�a� �N�e�w{�� ��( R$fG��M�S� �F�a�r�s�i{{�� ��( _R$fG�u�l�i�m"�{�a ��( R�$fE��T�i�m�e�s� �NwR�oa�nz�@D�$�������������������������������������������������S!�E���B����|S!�.���B����S"�%���B����lS4"�5���B����Si"�9���B����\S"�=���B����ԂS"�C���B����LS"#�9���B����ăS[#�7���B����<S#�=���B����S#�8���B����,S$�'���B����S.$�"���B����SP$�#���B����Ss$�9���B����S$�"���B����S$�9���B����S%�&���B����tS-%�'���B����ST%�C���B����dS%�>���B����܉S%�8���B����TS
    &�G���B��������G�u�i�d�e���T�h�e�D�o�cP�a�g�e�-�1"G�e�s�t�u�r �F�om�
    a��R�e�c�t�a�n�7g�l��S�c�h�e�mN�
    a��V�i�so� �9�0C�o�}ne�c�trV�i�}so� �0���V�i�so� �0�1V�i�so� �0�2V�i�so� �0�3V�i�so� �1�0V�i�}so� �1���V�i�so� �1�2V�i�so� �1�3V�i�so� �2�0V�i�so� �2�1V�i�}so� �2���V�i�so� �2�3V�i�so� �5�0V�i�so� �5�1V�i�so� �5�2V�i�so� �5�3V�i�so� �7�0V�i�so� �8�0���B�a�s�i�c���B�a�s�i�c� �S�hd�o�wL�o�c�a�l�Rw�0v�i�s�V�e�ri�o�nR�e�c�t�a�n�wg�l.�1R�e�c�t�a�n�wg�l.�2&B�o�r�d�e �Ugau�td(B�o�r�d�e �A�n�o�t�a�in&T�i�t�l�e� �}Bo�c�k5Tx��.T�i�t�l�e� �}bo�c�kc�ne�m�p���T�h�e�m�e���M�a�r�g�i�nA�n�t�i�S�c�a�l�e���S�c�a�l�e������R�o�w�_�1���*N�o�t�e� �bxt�r�i�a�n�g�ls>B�o�r�d�e �Tx�tr�a�n�s�p�Urn	Lf	���(N�o�t�e� �bxcnm�p�.(D�y�n�a�m�i�c� �on�e�t�r3�-�D� �b�o�xS�c�a�l�e�Fc�t�o�rS�h�a�d�o�w�]e �bxB�o�r�d�e �D�akB�o�r�d�e �s�m�a�l	���,T�i�t�l�e� �}bo�c�k]ca�s�i���R�e�c�t�a�n�wg�l.�3B�o�r�d�e��B�o�r�d�e �5no���S�h�o�w�Fo�t�e�rP�a�_g�e�Mri�nR�e�c�t�a�n�g�l.�1�3R�e�c�t�a�n�g�l.�1�4.D�y�n�a�m�i�c� �on�e�t�r1�5.D�y�n�a�m�i�c� �on�e�t�r1�6������������.D�y�n�a�m�i�c� �on�e�t�r2�0R�e�c�t�a�n�wg�l.�2	���R�e�c�t�a�n�g�l.�2�5R�e�c�t�a�n�g�l.�1�9R�e�c�t�a�n�g�l.�2�7����������������������������������������P�a�g�e�-�2,D�y�n�a�m�i�c� �on�e�t�r�.�4,D�y�n�a�m�i�c� �on�e�t�r�.�6,D�y�n�a�m�i�c� �on�e�t�r�.�9���T��<�����������R���R�������3���lL((����E�3���L8(����G�3���LM(����G�3���dKb(�%���G�3���dKS(����G�3���KS(����G�3���KS(����G�3���KS(����G�3���KS(����G�3���LS
    )����G�3���$LS#)����G�3���DLS<)����G�3���dLSU)����G�3���LSn)����G�3���LS)����G�3���LS)����G�3���LS)����G�3���MS)����G�3���$MS)����G�3���DMS*����G�3���dMS*����G�3���MS6*����G�3���MSO*����G�3���MSh*����G�3���MS*����G�3���NS*����G�3���L*����E�3���dK*�"���G�3���$NS*����G�3���DNS�+����G�3���dNS+����G�3���NS<+����G�3���H[+�&���G�3���ԸH+�)���G�3���H+�(���G�3���O+�.���G�3���L�,����E�3���L,����G�3���NS%,����G�3���LA,����E�3���LQ,����E�3���4Ha,�-���G�3���lR,�:���G�3���dH,�'���G�3���H,�)���G�3���,L-����G�3���NS0-����G�3���dKO-� ���G�3���NSo-����G�3���eK-�"���G�3���ĹH-�.���G�3���OS-����G�3���DL-����G�3���$OS.����G�3���DOS/.����G�3���dOSL.����G�3���4eKh.�"���G�3���\eK.�"���G�3���4O.�/���G�3���lO.�/���G�3���@
    /����A�3���$@/����A�3���\@/����A�3���O/�/���G�3���eKE/�"���G�3���eKg/�"���G�3���eK/�"���G�3���$fK/�"���G�3���d@/����A�3���l@/����A�3���t@/����A�3���|@/����A�3���@/����A�3���@/����A�3���@/����A�3���@/����A�3���@/����A�3���@/����A�3���\L/����G�3���H
    0�.���G�3���$H80�.���G�3���THf0�.���G�����������������������������	���
    ���������
    ��������������������������������������������������������� ���!���"���#���$���%���&���'���(���)���*���+���,���-���.���/���0���1���2���3���4���5���6���7���8���9���:���;���<���=���>���?���@���A���B���C���D���E���F���G���H���I���J���K���L���M���N���O���P���Q�������UvU	
    U
    UUU U!"*04���������t4"H$ @Y,b'@P7�_C-lB#8�
    A�����������%t4lB_}8�
    A-@7�A���J���������������������������������������������������������������������������������������������������������������@���B`-8�P���R�������������������������������������������������������������������������������������������������������������������������������������������������@���|o`8�6���R�����H<(H<(���J���������������������������������������������������������������������������������������������������������������E���dD`9�
    ���R�������������������������������������������������������������������������������������������������������������������������������������������������E���o`9�
    ���R�����{��
    	g"4FX�,υ�,h(Z@(;L].+�~#hcK��zPB�X |TO`�.WS6P	Og��Ҕv�O��R�$��x!)S_��Y'CO �~O1$Od5T&�P�250�,2�?[8�*'"D[:H%a!���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/news.html�����������������������������������������������������������������������0000644�0001750�0001750�00000276213�12143164240�015756� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>News</title>
        <link rel="stylesheet" type="text/css" href="css/common.css" />
        <link rel="stylesheet" type="text/css" href="css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="css/_print.css" media="print" />
        <link rel="stylesheet" type="text/css" href="css/prettify.css" media="screen" />    
      </head>
    
      <body onload="prettyPrint()">
        <script type="text/javascript">prefix='';</script>
        <script type="text/javascript" src="js/prettify.js"></script>
        <script src="templates/header.js" type="text/javascript"></script>
        <div id="left">
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="templates/left.js" type="text/javascript"></script>
        </div>
        <div id="content">
    	
        <h2>Logback News</h2>
      
        <p>You can receive logback-related announcements by subscribing to
        the <a href="http://www.qos.ch/mailman/listinfo/announce">QOS.ch
        announce</a> mailing list.</p>
    
    
        <hr width="80%" align="center" />
    
        <h3>May 10th, 2013 - Release of version 1.0.13</h3>
      
        <p>In logback-access MANIFEST file, imports of Jetty and Tomcat
        are now optional. This fixes <a
        href="http://jira.qos.ch/browse/LOGBACK-300">LOGBACK-300</a>
        reported by Christian Brensing who also provided the appropriate
        pull request.
        </p>
    
        <p>Logback will now correctly parses variables with a default
        separator string nested within accolades, e.g. "{a:-b}". Such
        strings resemble variable references but lack the $ prefix, e.g
        "${a:-b}". This fixes <a
        href="http://jira.qos.ch/browse/LOGBACK-859">LOGBACK-859</a>
        reported by Yoni Moses.</p>
    
        <p>In <code>InterpretationContext</code> class replaced code using
        JDK 1.6 API with code using JDK 1.5. This fixes <a
        href="http://jira.qos.ch/browse/LOGBACK-860">LOGBACK-860</a>
        reproted by Bas Stoker.
        </p>
    
        <p>Updated the "org.fusesource.jansi:jansi" dependency to version
        1.9.</p>
    
        <hr width="80%" align="center" />
    
        <h3>April 26th, 2013 - Release of version 1.0.12</h3>
        
        <p>A new <code>SSLSocketAppender</code> extends the basic 
        <code>SocketAppender</code> providing the ability to deliver 
        logging events over the Secure Socket Layer (SSL).  The 
        corresponding <code>SimpleSSLSocketServer</code> extends the classic 
        <code>SimpleSocketServer</code> as a basic logging server 
        application that receives logging events from a 
        <code>SSLSocketAppender</code>.</p>
          
        <p class="highlight">Receiver components are configured in
        logback.xml just like any other logback component.</p>
    
        <p>While <code>SimpleSocketServer</code> (and its new SSL-enabled
        counterpart, <code>SimpleSSLSocketServer</code>) provide an 
        easy-to-use standalone logging server application, a new component
        type known as a <em>receiver</em> allows <em>any</em> application 
        to receive logging events from remote appenders over a TCP/IP network 
        connection, using Logback Classic.  Receiver components are 
        configured in <em>logback.xml</em> just like any other logback 
        component.</p>
          
        <p>A receiver can either listen passively for connections from
        remote <code>SocketAppender</code> components acting as clients, 
        or it can assume the client role, initiating a connection to a 
        remote appender acting as a server.  The receiver components 
        shipped with Logback include full support for logging event 
        delivery over the Secure Sockets Layer (SSL).</p>
    
        <p>All of the new socket-based receiver and appender components were 
        contributed by Carl Harris.  See 
        <a href="manual/receivers.html">Receivers</a> in the Logback Manual 
        for more information on configuring receiver components.  See 
        <a href="manual/appenders.html#SocketAppender">SocketAppender</a> and
        <a href="manual/appenders.html#serverSocketAppender">ServerSocketAppender</a>
        for information on configuring appenders as event sources for
        receiver components.</p>
    
        <p><code>RollingFileAppender</code> will now detect when <span
        class="option">file</span> property collides with <span
        class="option">fileNamePattern</span>, emit <a
        href="codes.html#rfa_collision">an error message</a> and refuse to
        initialize. This was requested in <a
        href="http://jira.qos.ch/browse/LOGBACK-796">LOGBACK-796</a> by
        Karl Pietrzak who also provided a patch.
        </p>
    
        <p>In configuration files, the <code>&lt;include></code> element
        now admits the <span class="attr">optional</span> attribute. This
        fixes <a
        href="http://jira.qos.ch/browse/LOGBACK-230">LOGBACK-230</a>
        reported by Attila Kiraly. Many thanks to Tommy Becker who
        contributed a patch.</p>
    
        <p>In response to <a
        href="http://jira.qos.ch/browse/LOGBACK-829">LOGBACK-829</a>,
        serialization of <code>Logger</code> instances has been
        significantly simplified and much unnecessary bloat removed. As an
        added bonus, the new serialization of <code>Logger</code> objects
        is also compatible with serialization streams using older Logger
        instances. <code>Logger</code> instances serialized by logback
        1.0.11 and earlier can be read by logback version 1.0.12 and later
        and <em>vice-versa</em>.
        </p>
    
        <p>The code detecting whether Groovy is available on the class
        path deals with the case where logback binaries are installed as
        endorsed libraries. This fixes <a
        href="http://jira.qos.ch/browse/LOGBACK-831">LOGBACK-831</a>.
        </p>
    
        <p class="highlight">Groovy configurator no longer supports
        <code>SiftingAppender</code>.</p>
    
        <p>In response to <a
        href="http://jira.qos.ch/browse/LOGBACK-244">LOGBACK-244</a>, <a
        href="http://jira.qos.ch/browse/LOGBACK-724">LOGBACK-724</a> and
        in particular patches provided by Tommy Becker and David Roussel
        component tracking code has been simplified and completely
        re-written. <code>SiftingAppender</code> now supports the <a
        href="manual/appenders.html#siftTimeout">timeout</a> and <a
        href="manual/appenders.html#siftMaxAppenderCount">maxAppenderCount</a>
        parameters. As a direct consequence of modifications to component
        tracking code, the groovy configurator no longer supports
        <code>SiftingAppender</code>.</p>
    
        <p>SiftingAppender now propagates properties defined elsewhere in
        the configuration file into the configuration process of nested
        appenders. This fixes <a
        href="http://jira.qos.ch/browse/LOGBACK-833">LOGBACK-833</a> with
        David Roussel providing the appropriate patch.
        </p>
    
        <p>As all other actions affecting properties,
        <code>TimestampAction</code> now inserts the user-specified
        property into the local scope by default. The property was
        inserted into the context scope in earlier versions of logback.
        This fixes <a
        href="http://jira.qos.ch/browse/LOGBACK-835">LOGBACK-835</a> with
        David Roussel providing the appropriate patch.
        </p>
    
        <p>Logback is now able to retrieve the name of localhost when
        running under OS X and Java 7. This issue was reported by <a
        href="http://jira.qos.ch/browse/LOGBACK-749">LOGBACK-749</a> by
        Oliver Schrenk with patches provided by Ralph Goers and Pavel
        Valodzka.
        </p>
    
        <p>The <a href="manual/layouts.html#mdc">mdc</a> converter can now
        handle default values. This feature was requested in <a
        href="http://jira.qos.ch/browse/LOGBACK-246">LOGBACK-246</a> by
        Michael Osipov with Denis Bazhenov providing a patch.
        </p>
    
        <p><code>DBAppender</code> in logback-classic module no longer
        assumes that caller information is always available. This fixes <a
        href="http://jira.qos.ch/browse/LOGBACK-805">LOGBACK-805</a>
        reported by Daris Cooper who also provided a corrective patch.</p>
    
        <p>In order to simplify our build, several unit tests have been
        ported from Scala to Java. It follows that logback no longer
        depends on Scala, not even during the test phase of the build.</p>
    
        <h3>25th of March, 2013 - Release of version 1.0.11</h3>
    
    
        <p>Under Unix*, the basic/quick file rename method supplied by
        Java does not work if the source and target files are on different
        file systems. This problem was reported in <a
        href="http://jira.qos.ch/browse/LOGBACK-108">LOGBACK-108</a> by
        Daniel Potter. In order to deal with this issue, logback now will
        perform rename by copying if the source and target files are on
        different file systems and the host JDK is version 1.7 or
        later. See also the related <a
        href="codes.html#renamingError">error code</a>.</p>
    
    
        <p>The "cn" conversion word now correctly maps to
        <code>ContextNameConverter</code> class. This fixes <a
        href="http://jira.qos.ch/browse/LOGBACK-463">LOGBACK-463</a>
        reported by Michael Osipov with Mark A. Ziesemer providing the
        appropriate patch.
        </p>
    
        <p>Added gray to the list of <a
        href="manual/layouts.html#coloring">ANSI colors supported by
        logback</a>. The relevant pull request was kindly provided by
        Craig P. Motlin.</p>
    
        <p>The <code>discoverConnectionProperties()</code> method in class
        <code>ConnectionSourceBase</code> no longer leaks
        connections. This fixes <a
        href="http://jira.qos.ch/browse/LOGBACK-798">LOGBACK-798</a>
        reported by Sayevskiy Viacheslav. Many thanks to Ivan
        (Wee-Willie-Winkie) who contributed the appropriate fix.
        </p>
    
        <p>In logback-access, more correct determination of whether
        contents of an <code>HttpServletRequest</code> are URL encoded or
        not. The <a href="https://github.com/qos-ch/logback/pull/71">bug
        fix</a> was submitted by David Schneider. The same issue was later
        independently reported by Grzegorz Kuligowski in <a
        href="http://jira.qos.ch/browse/LOGBACK-814">LOGBACK-814</a>.</p>
    
        <p>Both <code>SocketAppenderBase</code> and
        <code>SimpleSocketServer</code> now use a socket factory to create
        sockets. These changes were asked in <a
        href="http://jira.qos.ch/browse/LOGBACK-815">LOGBACK-815</a> and
        <a href="http://jira.qos.ch/browse/LOGBACK-816">LOGBACK-816</a> by
        Carl Harris who also contributed the relevant patch.
        </p>
    
        <hr width="80%" align="center" />
    
        <h3>15th of March, 2013 - Release of version 1.0.10</h3>
    
        <p>Upgraded the (optional) groovy dependency to version 2.0.7
        (from 2.0.0).</p>
    
        <p>The logger cache field in <code>LoggerContext</code> now uses a
        <code>ConcurrentHashMap</code> instead of a regular
        <code>HashMap</code>. This dramatically improves the speed of
        logger retrieval and incidentally fixes <a
        href="http://jira.qos.ch/browse/LOGBACK-142">LOGBACK-142</a>.
        </p>
    
        <p>In <code>SyslogAppender</code> allow <a
        href="manual/appenders.html#syslogSuffixPattern">suffixPattern</a>
        to begin with literal text. This issue was reported Bruno Polaco
        in <a href="http://jira.qos.ch/browse/LOGBACK-782">LOGBACK-782</a>
        who also provided the relevant patch.
        </p>
        
        <p>In order to reduce unnecessary boilerplate several common types
        and packages are now <a
        href="manual/groovy.html#AutomaticImports">imported
        automatically</a>. This feature was contributed by Joris
        Kuipers.</p>
    
        <p>Computation of caller information now takes into account Groovy
        frames (if nunning under Groovy). This fixes <a
        href="http://jira.qos.ch/browse/LOGBACK-811">LOGBACK-811</a>.</p>
    
      
      
        <hr width="80%" align="center" />
    
        <h3>December 5th, 2012 - Release of version 1.0.9</h3>
    
        <p>Removed an erroneous compile-time dependency on Tomcat in the
        logback-classic module. This issue was reported by Arnaud
        Heritier.</p>
    
        <hr width="80%" align="center" />
    
        <h3>December 4th, 2012 - Release of version 1.0.8</h3>
    
        <div class="breaking">
          <h4>logback-classic updated to use SLF4J version 1.7.2 instead
          of version 1.6.6.</h4>
          <p>The logback-classic module now uses SLF4J version 1.7.2
          instead of version 1.6.6. This only impacts projects running
          under an OSGi platform as SLF4J versions 1.7.x and 1.6.x are
          100% binary compatible.</p>
        </div>
    
        <p>Fixed incorrect <code>BufferStream</code> assignment after
        recovery in <code>ResilientFileOutputStream</code>. This issue was
        reported in <a
        href="http://jira.qos.ch/browse/LOGBACK-765">LOGBACK-765</a> by
        David Markwick.
        </p>
    
        <p>Fixed incorrect parsing of variables in case of colon character
        followed by a dollar character. This issue was reported in <a
        href="http://jira.qos.ch/browse/LOGBACK-744">LOGBACK-744</a>.</p>
    
        <p><code>SyslogAppender</code> now sends out the header line of
        stack traces. This issue was reported <a
        href="http://jira.qos.ch/browse/LOGBACK-411">LOGBACK-411</a> and
        separately as <a
        href="http://jira.qos.ch/browse/LOGBACK-750">LOGBACK-750</a>.</p>
    
        <p>A <code>StatusListener</code> implementing
        <code>LifeCycle</code> interface was not started if specified via
        the <code>logback.statusListenerClass</code> system property. This
        issue was reported in <a
        href="http://jira.qos.ch/browse/LOGBACK-767">LOGBACK-767</a> by
        Adam Sokowicz.
        </p>
    
        <p>In order to avoid duplication, automatic status printing will
        be disabled if the user explicitly registers a status
        listerner.</p>
    
        <p>Added <code>OnErrorConsoleStatusListener</code> to print status
        messages on the error console, i.e. on System.err. This feature
        was requested in <a
        href="http://jira.qos.ch/browse/LOGBACK-292">LOGBACK-292</a> by
        Abraham Lin. </p>
    
        <p>Added <code>NopStatusListener</code> class which simply drops
        incoming status messages. By <a
        href="manual/configuration.html#logback.statusLC">explicitly
        registering</a> a <code>NopStatusListener</code> listener,
        automatic status printing can be turned off.
        </p>
    
    
        <hr width="80%" align="center" />
    
        <h3>24th of August, 2012 - Release of version 1.0.7</h3>
    
        <div class="breaking">
          <h4>Janino library upgraded to version 2.6.1.</h4>
    
          <p>As of Janino version 2.6.0, in addition to
          <em>janino.jar</em>, <em>commons-compiler.jar</em> needs to be
          on the class path as well. Please see the <a
          href="setup.html#janino">Janino setup</a> instructions.</p>
        </div>
        
        <p>
        </p>
    
        <div class="breaking">
          <h4>Groovy dependency upgraded to version 2.0.0.</h4>
    
          <p>Please see the <a href="setup.html#groovy">Groovy setup</a>
          instructions.</p>
        </div>
    
        <p>The code handling variable substitution has been completely
        re-written. As requested in <a
        href="http://jira.qos.ch/browse/LOGBACK-729">LOGBACK-729</a>,
        variables can be now be nested arbitrarily, even within the
        default value section. For example,
        <code>${a${b:-c}:-${d:-e}}</code> is now a valid logback variable
        expression yielding "e", assuming variables with the keys 'd', 'b'
        and 'ac' are undefined. The new variable substitution code is
        designed to be backward compatible with existing configuration
        files.
        </p>
        
    
        <p>Substitution properties are now correctly recognized by <span
        class="attr">scan</span> and <span class="attr">scanPeriod</span>
        attributes of <code>&lt;configuration></code> element in
        configuration files. This fixes <a
        href="http://jira.qos.ch/browse/LOGBACK-396">LOGBACK-396</a>
        reported by Oh Chin Boon</p>
    
        <p>The color-related conversion words now set the default color
        correctly. Xu Huisheng provided the relavant patch.
        </p>
        
        <p>Fixed a race-condition in <code>AsyncAppender</code> and its
        worker thread. This issue was reported in <a
        href="http://jira.qos.ch/browse/LOGBACK-720">LOGBACK-720</a> by
        Arnd Hannemann who also supplied the relevant patch.</p>
    
    
        <p>If a <code>PropertyDefiner</code> implements
        <code>LifeCycle</code>, then its <code>start()</code> method will
        now be invoked.</p>
    
        <p>Added the <span class="prop">includeCallerData</span> property
        in <code><a
        href="manual/appenders.html#smtpIncludeCallerData">SMTPAppender</a></code>
        to precompute caller data before storing events for future
        transmission. This property adresses <a
        href="http://jira.qos.ch/browse/LOGBACK-734">LOGBACK-734</a>
        reported by Patrick Hogarty.
        </p>
        
        <hr width="80%" align="center" />
    
        <h3>7th of June, 2012 - Release of version 1.0.6</h3>
    
        <p><a
        href="manual/appenders.html#SMTPAppender"><code>SMTPAppender</code></a>
        now supports the retreival of a <code>javax.mail.Session</code>
        resource from JNDI. This feature was requested in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-332">LBCLASSIC-332</a>
        by Hrotko Gabor.</p>
    
        <p>Listeners passed to <code>statusListener()</code> method in
        <code>GafferConfigurator</code> (the groovy configurator) are now
        correctly started.</p>
    
        <hr width="80%" align="center" />
    
        <h3>6th of June, 2012 - Release of version 1.0.5</h3>
    
        <p><a
        href="manual/appenders.html#ConsoleAppender"><code>ConsoleAppender</code></a>
        can now activate the <a href="http://jansi.fusesource.org">Jansi
        library</a> for ANSI color code support on Windows
        systems. Unix-based operating systems such as Linux and Mac OS X
        already support ANSI color codes by default.</p>
    
     
        <p><code>PatternLayout</code> now supports <a
        href="manual/layouts.html#coloring">composite conversion
        specifiers for coloring</a>.</p>
    
        <hr width="80%" align="center" />
    
        <h3>31st of May, 2012 - Release of version 1.0.4</h3>
    
        <p>Added <code>AsyncAppender</code> for asyncronous invocation of
        nested appenders. This was a long standing and popular request as
        attested by <a
        href="http://jira.qos.ch/browse/LBCLASSIC-177">LBCLASSIC-177</a>,
        <a href="http://jira.qos.ch/browse/LBCORE-92">LBCORE-92</a> and <a
        href="http://jira.qos.ch/browse/LBCLASSIC-242">LBCLASSIC-242</a>.</p>
    
        <p><code>SMTPAppender</code> now admits the <span
        class="prop">asynchronousSending</span> property, set to 'true' by
        default. However, it can be set to 'false' for syncronous email
        transmisison. This property was requested in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-323">LBCLASSIC-323</a>
        by Patrick Houk.</p>
    
        <p>It is now possible to set a system property called <a
        href="manual/configuration.html#automaticStatusPrinting">"logback.debug"</a>
        in order to force printing of internal status messages on the
        console regardless of the value of the <span
        class="attr">debug</span> attribute found within the
        <code>&lt;configuration></code> element. This behavior was
        requested in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-225">LBCLASSIC-225</a>
        by Aaron Digulla with the relevant patch kindly provided by Antony
        Stubbs.
        </p>
    
        <p><code>MarkerFilter</code> now correctly recognizes nested
        markers. This issue was reported in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-295">LBCLASSIC-295</a>
        by Paolo Mazzoncini who also provided the relevant patch.</p>
    
        <p>Fixed invalid multiple configuration warning when deployed
        under Weblogic. This issue was reported in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-159">LBCLASSIC-159</a>
        by Hontv&aacute;ri J&oacute;zsef and with the appropriate patch
        provided by Derek Mahar.
        </p>
    
        <p><a
        href="manual/appenders.html#SyslogAppender"><code>SyslogAppender</code></a>
        now admits the <span class="prop">throwableExcluded</span>
        property allowing the exclusion of throwable data if so
        desired. This solves <a
        href="http://jira.qos.ch/browse/LBCLASSIC-327">LBCLASSIC-327</a>
        reported by Don Faulkner.
        </p>
    
        <p><a
        href="manual/appenders.html#SyslogAppender"><code>SyslogAppender</code></a>
        now admits the <span class="prop">stackTracePattern</span>
        property allowing the customization of the string appearing just
        before each stack trace line.  This fixes <a
        href="http://jira.qos.ch/browse/LBCLASSIC-333">LBCLASSIC-333</a>
        reported by Ingebrigt Berg who also provided the relavant patch.
        </p>
    
        <p><code>DBAppender</code> now supports SQLite. This feature was
        requested in <a
        href="http://jira.qos.ch/browse/LBGENERAL-53">LBGENERAL-53</a> by
        Tony Trinh who also provided the relevant patch.</p>
       
    
        <h3>4th of May, 2012 - Release of version 1.0.3</h3>
    
        <p><code>PatternLayoutEncoder</code> class now admits the <span
        class="prop"><a
        href="manual/encoders.html#LayoutWrappingEncoder">immediateFlush</a></span>
        property (set to true by default). By setting this property to
        'false', logging throughput can be quintupled, although your
        mileage may vary. This enhancement was requested in <a
        href="http://jira.qos.ch/browse/LBCORE-243">LBCORE-243</a>.
        </p>
    
        <p>In order to facilitate parsing of log files, logback can now <a
        href="manual/encoders.html#outputPatternAsHeader">output the
        pattern</a> used for the log output at the top of log files as a
        header. This feature was requested by James Strachan in <a
        href="http://jira.qos.ch/browse/LBCORE-234">LBCORE-234</a>.
        </p>
    
        <p><code>SMTPAppender</code> failed to transmit messages under JDK
        1.5. After some investigation, Dave dicovered that this was due to
        setting the <code>corePoolSize</code> parameter of the relavant
        <code>ThreadPoolExecutor</code> to 0. Setting
        <code>corePoolSize</code> to a higher value, e.g. 1, under JDK 1.5
        solves the problem and fixes <a
        href="http://jira.qos.ch/browse/LBCLASSIC-323">LBCLASSIC-323</a>
        reported by Lutz Huehnken.
        </p>
    
        <p><code>LevelChangePropagator</code> now retains references to
        j.u.l. loggers whose level it sets. This fixes garbage collection
        issues reported in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-256">LBCLASSIC-256</a>
        by Samuel Stanojevic who also provided the appropriate patch.
        </p>
        
    
        <h3>26th of April, 2012 - Release of version 1.0.2</h3>
    
        <div class="breaking">
    
        <h4><span class="label">Breaking change partially reverted in
        1.0.3</span><br/>By default <code>PatternLayout</code> will now output
        its pattern at the top of log files</h4>
    
        <p>This feature, although still available, is no longer enabled by
        default. See release notes for version 1.0.3 for details.
        </p>
    
    
        </div>
        
        <p><code>ReconfigureOnChangeFilter</code> will avoid excessive
        syncronization in case of CPU intensive applications. This fixes
        <a
        href="http://jira.qos.ch/browse/LBCLASSIC-234">LBCLASSIC-234</a>,
        a recalcitrant bug reported by Uri Unger who also provided the key
        steps for reproducing it.
        </p>
    
        <p><code>RollingFileAppender</code> now creates missing
        directories for compressed archive files. This fixes <a
        href="http://jira.qos.ch/browse/LBCORE-169">LBCORE-169</a>
        reported by Tomasz Nurkiewicz with patches supplied by Paulo
        Andrade and Mats Henrikson.
        </p>
    
        <p><code>SizeAndTimeBasedFNATP</code> will now remove files with
        indexes higher than 99. It will also correctly compute the highest
        index value when an application is restarted. This fixes bug <a
        href="http://jira.qos.ch/browse/LBCORE-221">LBCORE-221</a>
        reported by Dieter Mueller and Dawid Chodura.</p>
      
    
        <hr width="80%" align="center" />
    
        <h3>7th of March, 2012 - Release of version 1.0.1</h3>
    
        <p>Setting the debug attribute to true in the
        <code>&lt;configuration></code> element now registers a
        <code>OnConsoleStatusListener</code> with the
        <code>StatusManager</code>.  Thus, problems occurring during the
        lifetime of your application, well after logback is initialized,
        can be reported when the <span class="attr">debug</span> attribute
        is set. This behavior is closer to what users expect.
        </p>
    
        <p>Added new property the <span
        class="prop">cleanHistoryOnStart</span> to <a
        href="manual/appenders.html#TimeBasedRollingPolicy">TimeBasedRollingPolicy</a>.
        By setting this property to <code>true</code>, history removal
        will work as expected even in the case of short lived
        applications. This fixes <a
        href="http://jira.qos.ch/browse/LBCORE-226">LBCORE-226</a>
        reported by Bruce E. Irving.
        </p>
    
        <p>It is now possible to specify multiple %d tokens in the file
        name pattern of <a
        href="manual/appenders.html#TimeBasedRollingPolicy">TimeBasedRollingPolicy</a>. Auxiliary
        %d tokens must be marked as such by passing the AUX
        paramater. This feature was requested in <a
        href="http://jira.qos.ch/browse/LBCORE-242">LBCORE-242</a> by
        Thomas Corte.</p>
    
        <p>Logback now supports suppressed exceptions introduced in Java
        7. This fixes <a
        href="http://jira.qos.ch/browse/LBCLASSIC-276">LBCLASSIC-276</a>.
        </p>
    
        <p><code>SMTPAppender</code> clears the relevant cyclic buffer
        before asynchronous transmission. This corrects <a
        href="http://jira.qos.ch/browse/LBCLASSIC-221">LBCLASSIC-221</a>
        as reported by Chris Cheshire.
        </p>
    
        <p><code>SiftingAppender</code> will consider stale and
        consequently remove nested appenders which are closed or
        improperly started. This caters for the use case described in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-316">LBCLASSIC-316</a>
        by Guus Bloemsma.</p>
    
        <p><code>RequestLogImpl</code> can now lookup for the
        logback-access configuration file as a class path resource. This
        feature was requested in <a
        href="http://jira.qos.ch/browse/LBACCESS-26">LBACCESS-26</a> by
        Marshall Pierce.
        </p>
    
        <p>Updated the Janino dependency to version 2.5.16. In addition,
        the code checking for the availability of Janino on the class path
        was updated to take Janino 2.6 into account, thus fixing <a
        href="http://jira.qos.ch/browse/LBCORE-210">LBCORE-210</a>.
        </p>
    
    
        <hr width="80%" align="center" />
    
        <h3>1st of November, 2011 - Release of version 1.0.0</h3>
    
        <p>The logback-access module now targets Tomcat 7.x and Jetty 7.x
        &amp; 8.x as its servlet container platforms. This fixes <a
        href="http://jira.qos.ch/browse/LBACCESS-17">LBACCESS-17</a>
        reported by Grzegorz Grzybek.</p>
    
        <div class="breaking">
    
        <h4>Breaking change: properties are no longer automatically
        inserted into the context</h4>
        
        <p>Properties now have a scope. Previously, the definition of a
        property added it to the context. As of version 1.0, properties
        are local, i.e. transient by default. For further details, please
        refer to the <a
        href="manual/configuration.html#variableSubstitution">documentation
        on properties</a>.</p>
        </div>
    
        <p>Environment variables are now looked up during property
        substitution. This feature was requested in <a
        href="http://jira.qos.ch/browse/LBCORE-212">LBCORE-212</a> by
        Alexandre Garnier.
        </p>
    
        <p><code>SMTPAppender</code> now sends emails asynchronously.</p>
    
        <p>Investigation of <a
        href="http://jira.qos.ch/browse/LBCORE-224">LBCORE-224</a>
        reported by Cesar Alvarez Nunez points to bug in the JVM rather
        than in logback. A workaround has been found by using
        <code>CopyOnWriteArrayList</code> instead of the apparently buggy
        <code>ReadWriteLock</code>.</p>
    
        <p>In STARTTLS mode, "mail.smtp.auth" property is no longer set
        automatically. This fixes <a
        href="http://jira.qos.ch/browse/LBCORE-225">LBCORE-225</a>
        reported by Mark Woon.</p>
    
        <p>Logback-access now supports conditional configuration. This
        fixes <a
        href="http://jira.qos.ch/browse/LBACCESS-27">LBACCESS-27</a>
        reported by Marshall Pierce.</p>
    
        <p>Logback-access now supports inclusion of configuration
        files. See the <a
        href="manual/configuration.html#fileInclusion">chapter about
        configuration</a> in the logback's online manual for more
        information. </p>
    
        <p>Added <code>ch.qos.logback.core.read</code> to "Import-Package"
        declaration in logback-classic's manifest file. This fixes <a
        href="http://jira.qos.ch/browse/LBCLASSIC-131">LBCLASSIC-131</a>
        reported by Michal Prihoda and Thomas Jaeckle.</p>
    
        <p>Fixed infinitely recursive calls in
        <code>AccessConverter#addError</code> methods as reported in <a
        href="http://jira.qos.ch/browse/LBACCESS-25">LBACCESS-25</a> by
        Pierre Queinnec.
        </p>
    
        <p>Fixed incorrect switch fallthrough while selecting between the
        H2 and HSQL dialects as reported in <a
        href="http://jira.qos.ch/browse/LBCORE-218">LBCORE-218</a> by
        Pierre Queinnec.
        </p>
    
        <h3>September 21st, 2011 - Release of version 0.9.30</h3>
    
        <p>Archive removal can now deal with prolonged periods of
        application inactivity and application stop and restarts. The
        issue is described in <a
        href="http://jira.qos.ch/browse/LBCORE-147">LBCORE-147</a>
        reported by Rafael Diaz Maurin.
        </p>
    
        <p>Logback-classic now supports printing stack traces "root cause
        first" instead of the standard "root cause last". See the
        documentaiton for <a
        href="manual/layouts.html#rootException">%rootException</a>
        converter for further details. The <code>%rootException</code>
        converter was contributed by Tomasz Nurkiewicz in relation with <a
        href="http://jira.qos.ch/browse/LBCLASSIC-217">LBCLASSIC-217</a>.
        </p>
    
        <p>In the <code>ILoggingEvent</code> interface the
        <code>getMDC</code> method is now deprecated and replaced by
        <code>getMDCPropertyMap</code>. The latter method was already part
        of the <code>ILoggingEvent</code> interface in prior versions of
        logback-classic. Furthermore, the value returned by
        <code>ILoggingEvent.getMDCPropertyMap</code> can now be an empty
        map but never null.</p>
       
    
        <p><code>LoggingEvent</code> no longer assumes that
        <code>LogbackMDCAdapter</code> is the only possible implementation
        of the <code>MDCAdapter</code> interface. This fixes <a
        href="http://jira.qos.ch/browse/LBCLASSIC-275">LBCLASSIC-275</a>
        reported by Chris Dolan.
        </p>
    
        <p><code>LogbackMDCAdapter</code> now synchronizes over its thread
        local map. This prevents
        <code>ConcurrentModificationException</code> from occuring while a
        child thread copies the map from the parent. This fixes <a
        href="http://jira.qos.ch/browse/LBCLASSIC-289">LBCLASSIC-289</a>
        reported by Josh Oddman.</p>
    
        <p>It is now possible to specify multiple destination addresses
        separated by commas in the the <span class="prop">to</span>
        property of <code>SMTPAppender</code>. This fixes <a
        href="http://jira.qos.ch/browse/LBCORE-213">LBCORE-213</a>
        reported by Alexandre Garnier who also provided the relevant
        patch. In previous versions of logback multiple destination
        addresses could only be specified by using multiple <span
        class="prop">to</span> properties. As of version 0.9.30 both
        comma separated addresses and multiple <span
        class="prop">to</span> properties are supported.
        </p>
    
        <p>When debug attribute is set to true within the
        <code>&lt;configuration></code> element, status messages are
        printed on the console after Joran (re)configures
        logback. Previously, all status messages were printed. With this
        release, only status messages created during (re)configuration are
        printed. This change fixes <a
        href="http://jira.qos.ch/browse/LBCLASSIC-273">LBCLASSIC-273</a>
        reported by Joern Huxhorn.
        </p>
    
        <p>Single quotes within a date conversion specifier in filename
        patterns are now handled correctly. This fixes <a
        href="http://jira.qos.ch/browse/LBCORE-214">LBCORE-214</a>
        reported by Derek Libby.
        </p>
    
        <hr width="80%" align="center" />
    
        <h3>June 9th, 2011 - Release of version 0.9.29</h3>
    
        <p>Fixed <a
        href="http://jira.qos.ch/browse/LBCLASSIC-254">LBCLASSIC-254</a>,
        a performance issue in <code>LogbackMDCAdapter</code> as reported
        by Michael Franz.</p>
    
        <p>Given that events reference a snapshot of the current MDC map,
        the snapshot should not be cleared upon invocation of the
        MDC.clear operation. This issue was reported in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-253">LBCLASSIC-253</a>
        by Tommy Becker and independently fixed by the changes designated
        to fix LBCLASSIC-254.</p>
    
        <p>As reported by Deepak Vadgama in <a
        href="http://jira.qos.ch/browse/LBCORE-199">LBCORE-199</a>, the
        entry in every zip file created by
        <code>FixedWindowRollingPolicy</code> had the same name. The issue
        was solved by adding a timestamp to the name of the entry in the
        zip files as suggested by a Benoit Xhenseval.</p> 
    
        <p><code>ConfigurationWatchList</code> no longer emits an error
        message when it encounters a configuration file placed in a jar
        file, fixing <a
        href="http://jira.qos.ch/browse/LBCLASSIC-246">LBCLASSIC-246</a>
        as reported by Joern Huxhorn. This release also fixes <a
        href="http://jira.qos.ch/browse/LBCLASSIC-247">LBCLASSIC-247</a>
        reported by Michael Franz.
        </p>
    
    
        <p>Logback now emits a clearer error message in case a conversion
        pattern misses a closing parenthesis or if an opening
        parenthesis is misplaced. This fixes <a
        href="http://jira.qos.ch/browse/LBCORE-193">LBCORE-193</a>
        reported by B. K. Oxley.</p>
    
        <p>Fixed thread safety issue in LRUMessageCache reported in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-255">LBCLASSIC-255</a>
        by C&eacute;sar &Aacute;lvarez N&uacute;&ntilde;ez.
        </p>
    
        <p>The AccessEvent class in logback-access module now implements
        the <code>IAccessEvent</code> interface. This fixes <a
        href="http://jira.qos.ch/browse/LBACCESS-12">LBACCESS-12</a>
        reported by Joern Huxhorn.</p>
        
        <hr width="80%" align="center" />
    
        <h3>January 25th, 2011 - Release of version 0.9.28</h3>
    
        <div class="breaking">
     
          <h4>Breaking change: In the Context interface, the previously
          misspelled property <code>bithTime</code> is now renamed as
          <code>birthTime</code>.</h4>
          
          <p>In the <a
          href="apidocs/ch/qos/logback/core/Context.html">Context</a>
          interface, the previously misspelled property
          <code>bithTime</code> is now renamed as
          <code>birthTime</code>. This is a backward-incompatible
          change. All pre-existing references to "bithTime" property now
          need to referenced as "birthTime".</p>
        </div>
    
        <p>Fixed <a href="http://jira.qos.ch/browse/LBCLASSIC-238">issue
        238</a> reported by Robert Elliot. <code>GEventEvaluator</code>'s
        start method now correctly sets the state of the instance.
        </p>
    
        <p><code>JaninoEventEvaluator</code> now expects Java blocks
        instead of boolean expressions. For even moderately complex
        logical statements, blocks can be more convenient to read or to
        write compared with boolean expressions. To ensure backward
        compatibility, existing boolean expressions are converted into
        blocks on the fly.
        </p>
    
        <p>Corrected handling of null valued arguments by DBAppender. This
        fixes <a
        href="http://jira.qos.ch/browse/LBCLASSIC-239">LBCLASSIC-239</a>
        reported by Artyom Kalita.</p>
    
        <p>It is now possible to use the context birth time as the time
        reference for the <a
        href="manual/appenders.html#uniquelyNamed"><code>&lt;timestamp></code></a>
        element in configuration files.</p>
    
        <p>Logback can now scan for included files as well. This solves <a
        href="http://jira.qos.ch/browse/LBCLASSIC-245">LBCLASSIC-245</a>.
        </p>
    
        <hr width="80%" align="center" />
    
        <h3>December 22nd, 2010 - Release of version 0.9.27</h3>
    
        <p>Added a new section in the documentation about <a
        href="recipes/index.html">real-world inspired recipes</a>.</p>
    
        <p><code>PatternLayout</code> now supports compound conversion
        words of which <a
        href="manual/layouts.html#replace">"%replace"</a> is one
        example. This change involved a significant re-write of the
        pattern tokenizer, the pattern parser and the pattern
        compiler. However, the changes should be backward compatible as far
        as users are concerned.
        </p>
    
        <p>The <a href="manual/appenders.html#smtpTo"><span
        class="prop">to</span></a> option of SMTPAppender now admits a
        pattern and is evaluated dynamically.</p>
    
        <p><code>TeeServletInputStream</code> no longer chokes on input
        over 8K in size. This fixes <a
        href="http://jira.qos.ch/browse/LBACCESS-10">LBACCESS-10</a> as
        reported by Augusto Rodriguez.
        </p>
    
        <p><code>TeeFilter</code> now takes include and exclude parameters
        so that it can be enabled or disabled by host. This solves <a
        href="http://jira.qos.ch/browse/LBACCESS-15">LBACCESS-15</a>.</p>
    
        <p>Fixed <a
        href="http://jira.qos.ch/browse/LBCLASSIC-231">LBCLASSIC-231</a>
        as reported by Jeff Skjonsby. When configuring
        <code>SizeAndTimeBasedFNATP</code>,
        <code>GaggerConfigurator</code> (Groovy) will no longer throw a
        <code>NullPointerException</code>.
        </p>
    
        <p>Every context now returns its own name when asked for the
        property <code>CONTEXT_NAME</code>. This fixes <a
        href="http://jira.qos.ch/browse/LBCORE-178">LBCORE-178</a> as
        requested by Michael Osipov.
        </p>
    
    
        <h3>20th of October, 2010 - Release of version 0.9.26</h3>
    
    
        <p>Fixed <a
        href="http://jira.qos.ch/browse/LBCLASSIC-183">LBCLASSIC-183</a>
        as reported by Anthony Whitford. Upon application restart, Tomcat
        should no longer complain about ThreadLocal variables created
        internally by logback.
        </p>
    
        <p><code>SMPTAppender</code> now lets users to set a custom buffer
        size for the outgoing messages. This fixes <a
        href="http://jira.qos.ch/browse/LBCORE-170">LBCORE-170</a> as
        requested by Peter Royal.
        </p>
    
        <p>When stopped, <code>RollingFileAppender</code> now calls
        <code>stop()</code> on its policy objects, fixing <a
        href="http://jira.qos.ch/browse/LBCORE-114">LBCORE-114</a>
        reported by Anders Wallgren.</p>
    
        <p>Added mapping for OFF and ALL levels in <code>JULHelper</code>
        as requested in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-226">LBCLASSIC-226</a>
        by Christian Brensing.
        </p>
    
        <h3>October 13th, 2010 - Release of version 0.9.25</h3>
    
        <p>Logback-classic now supports <a
        href="manual/configuration.html#LevelChangePropagator">propagation
        of level changes from logback-classic onto the
        j.u.l. framework</a>. This significantly reduces the performance
        impact of disabled log statements making it reasonable for
        real-world applications to use the <a
        href="http://slf4j.org/legacy.html#jul-to-slf4j">jul-to-slf4j
        bridge</a>.
        </p>
    
        <p>The <code>&lt;appender-ref></code> element now supports
        <a href="manual/configuration.html#variableSubstitution">variable substitution</a>, thus fixing <a
        href="http://jira.qos.ch/browse/LBCLASSIC-224">LBCLASSIC-224</a>
        as reported by David Harrigan.
        </p>
    
        <p>As reported in <a
        href="http://jira.qos.ch/browse/LBCORE-164">LBCORE-164</a>,
        <code>SizeAndTimeBasedFNATP</code> would cause previous logging
        files with indexes over nine to be overwritten on application
        restart. This complex bug was reported and precisely diagnosed by
        Dieter Mueller. He has also proposed a fix which was subsequently
        adopted as is.</p>
    
        <hr width="80%" align="center" />
    
        <h3>June 30th, 2010 - Release of version 0.9.24</h3>
    
        <p>Fixed NullPointerException thrown by
        <code>MDCBasedDiscriminator</code> in case the MDC map is
        null.</p>
    
        <p>Fixed issue with <code>SizeAndTimeBasedFNATP</code> in presence
        of application stop/restart and non-null file property. This issue
        was reported by Tom Liu in <a
        href="http://jira.qos.ch/browse/LBCORE-131">LBCORE-131</a>.</p>
    
        <hr width="80%" align="center" />
    
        <h3>June 29th, 2010 - Release of version 0.9.23</h3>
    
        <p>Fixed Groovy runtime dependency problem with
        ReconfigureOnChangeFilter, i.e. the auto-scan filter, when using
        non-groovy configuration files. This problem was reported in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-214">LBCLASSIC-214</a>
        by Alvin Chee.</p>
    
        <p>Fixed <code>MDCBasedDiscriminator</code> so that it supports deferred
        processing. This issue was reported in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-213">LBCLASSIC-213</a>
        by Torsten Juergeleit.</p>
    
        <hr width="80%" align="center" />
    
        <h3>June 21st, 2010 - Release of version 0.9.22</h3>
    
        <p>Logback now supports <a href="manual/groovy.html">configuration
        files written in Groovy</a> which are more convenient than
        configuration files written in XML. We have also developed a tool
        to <a
        href="http://logback.qos.ch/translator/asGroovy.html">automatically
        migrate your logback.xml files to logback.groovy</a>.
        </p>
    
        <p>Inspired by the functionality offered by
        <code>SiftingAppender</code>, <code>SMTPApppender</code> now can
        <a href="manual/appenders.html#smtpDiscriminator">track multiple
        buffers according to selection information returned by a
        discriminator</a>.
        </p>
    
        <p>Fixed synchronization issue in <code>ConsoleAppender</code> as
        reported in <a
        href="http://jira.qos.ch/browse/LBCORE-158">LBCORE-158</a> by
        David Roussel who also supplied a corrective patch.</p>
    
    
        <hr width="80%" align="center" />
    
        <h3>May 8th, 2010 - Release of version 0.9.21</h3>
    
        <p>SLF4J dependency upgraded to 1.6.0</p>
    
        <p>Fixed concurrency problem in <code>SiftingAppender</code> as
        reported in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-203">LBCLASSIC-203</a>
        by Ellen Strnod.
        </p>
    
        <p>Added <a
        href="manual/filters.html#GEventEvaluator">GEventEvaluator</a>
        which processes boolean expression written in the Groovy language.
        </p>
    
        <p>Fixed rollover problem occurring when the target directory was
        missing as reported in <a
        href="http://jira.qos.ch/browse/LBCORE-151">LBCORE-151</a> by
        Torsten Juergeleit. A closely related problem was reported in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-167">LBCLASSIC-167</a>
        by Rick Janda.
        </p>
        
    
        <hr width="80%" align="center" />
    
        <h3>April 2nd, 2010 - Release of version 0.9.20</h3>
    
        <p>Fixed issue related to charsets in
        <code>LayoutWrappingEncoder</code> not being recognized in config
        files.</p>
    
        <p>Logback now supports <a
        href="manual/configuration.html#conditional">conditional
        processing</a> of configuration files.</p>
    
        <p>A new extension point for <a
        href="manual/configuration.html#definingPropsOnTheFly">defining
        properties on the fly</a> has been added. The code for this
        enhancement was provided by Aleksey Didik in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-182">LBCLASSIC-182</a>.</p>
        
        <p>Logback now provides <a
        href="http://logback.qos.ch/manual/loggingSeparation.html">an
        answer</a> to the longstanding logging separation problem for
        static logger references in shared libraries. This fixes <a
        href="http://jira.qos.ch/browse/LBCLASSIC-166">LBCLASSIC-166</a>
        and <a
        href="http://jira.qos.ch/browse/LBCLASSIC-87">LBCLASSIC-87</a>.
        </p>
     
        <p>Removed the previously deprecated <code>getFirstFilter</code>
        method in <code>FilterAttachable</code> interface.</p>
    
        <!-- ============================================================== -->
    
        <hr width="80%" align="center" />
    
        <h3>March 24, 2010 - Release of version 0.9.19</h3>
    
    
        <div class="breaking">
    
        <h4>Breaking change: FileAppender now expects an Encoder</h4>
    
        <p>In response to <a
        href="http://jira.qos.ch/browse/LBCORE-128">LBCORE-128</a>,
        <code>WriterAppender</code> has been renamed as
        <code>OutputStreamAppender</code>, <code>FileAppender</code> now
        sub-classing the latter. <code>OutputStreamAppender</code> and
        sub-classes now take an <code>Encoder</code> instead of a
        <code>Layout</code>. 
        </p>
    
        <p>Contrary to layouts which simply transform a logging event into
        a String, an encoder is responsible for writing the actual event
        or more accurately the representation of the event onto the output
        stream. The role of the enclosing appender is now limited to
        managing the output stream (opening/closing) but not writing
        actual contents onto the stream. This change will require <a
        href="codes.html#layoutInsteadOfEncoder"> modifications to
        existing configuration files</a>. We hope to make up for this
        inconvenience with cool new features which are only possible using
        encoders. <b>During a transition period, layouts passed as
        parameter will be automatically wrapped by an encoder so that
        configuration files in the old format (using a layout instead of
        encoder) will continue to work unmodified.</b>
        </p>
    
        </div>
    
        <br/>
    
        <div class="breaking">
    
    
          <h4>Breaking change: DBAppender in logback-classic expects four
          additional columns
          </h4>
          
          <p>Instead of lumping log request arguments into a field,
          <code>DBAppender</code> (in logback-classic) now outputs up to
          four arguments in the logging request in separate columns, named
          <code>arg0</code>, <code>arg1</code>, <code>arg2</code> and
          <code>arg4</code>. This solves <a
          href="http://jira.qos.ch/browse/LBCLASSIC-187">LBCLASSIC-187</a>
          reported by Greg Thomas.</p>
    
          <p>Existing databases can be migrated to the new table structure
          by altering the existing tables. Here is how it would be done
          in PostgreSQL and MySQL.</p>
    
          <pre class="prettyprint">ALTER TABLE logging_event ADD COLUMN arg0 VARCHAR(254);
    ALTER TABLE logging_event ADD COLUMN arg1 VARCHAR(254);
    ALTER TABLE logging_event ADD COLUMN arg2 VARCHAR(254);
    ALTER TABLE logging_event ADD COLUMN arg3 VARCHAR(254);</pre>
    
        <p>In Oracle:</p>
    
        <pre class="prettyprint">ALTER TABLE logging_event ADD arg0 VARCHAR(254);
    ALTER TABLE logging_event ADD arg1 VARCHAR(254);
    ALTER TABLE logging_event ADD arg2 VARCHAR(254);
    ALTER TABLE logging_event ADD arg3 VARCHAR(254);</pre>
    
          
        </div>
        <p><code>FileAppender</code> and derived classes can now
        gracefully deal with IO failures and recover quickly after the
        original cause of the IO failure is corrected. For example, if the
        log file is located on a <a
        href="http://en.wikipedia.org/wiki/Network-attached_storage">network-attached
        storage (NAS)</a>, and the connection to the NAS server is lost,
        <code>FileAppender</code> and derived classes will recover quickly
        after the connection to the server is re-established.
        </p>
    
        <p>The packages under <code>ch.qos.logback.classic</code>
        namespace no longer depend on <code>org.slf4j.impl</code>. This
        fixes <a
        href="http://jira.qos.ch/browse/LBCLASSIC-184">LBCLASSIC-184</a>
        reported by Gunnar Wagenknecht.
        </p>
    
        <p>Fixed <a
        href="http://jira.qos.ch/browse/LBCLASSIC-193">LBCLASSIC-193</a>.
        <code>SyslogAppender</code> will no longer shutdown when messages
        over 256Kb cause an <code>IOException</code>.
        </p>
    
        <p>Added <a
        href="manual/appenders.html#OnMarkerEvaluator">OnMarkerEvaluator</a>
        which evaluates to true in the presence of user-specified
        markers. When used with <code>SMTPAppender</code>, it can trigger
        an outgoing email message when an event matches user-specified
        marker.</p>
    
        <p>Request header names in AccessEvent (logback-access) are now
        stored in a case insensitive way as specified in RFC 2616.  This
        prevents compatibility issues, in particular with recent versions
        of Tomcat which store request header names in lower-case.</p>
    
    
        <p>Fixed <a
        href="http://jira.qos.ch/browse/LBCORE-134">LBCORE-134</a>
        reported by Michael Franz. While reading configuration files (in
        XML), the event handler will correctly process body text, in
        particular spaces, even when delivered in multiple chunks. The
        previous behavior of trimming leading and trailing white space has
        been preserved. Moreover, body text consisting of white space
        surrounding child elements is ignored.
        </p>
        
        <p><code>SiftingAppender</code> now exposes its
        <code>AppenderTracker</code>. Moreover, the
        <code>stopAndRemoveNow(String key)</code> method was added to
        <code>AppenderTracker</code>, allowing immediate removal of a
        nested appender.
        </p>
    
        <p>Fixed <a
        href="http://jira.qos.ch/browse/LBCORE-130">LBCORE-130</a>.
        <code>FileNamePattern</code> no longer treats parenthesis as
        special.
        </p>
    
        <p>The <span class="prop">CharsetEncoder</span> property in
        <code>SMTPAppender</code> can now be accessed and set from
        configuration files. This fixes <a
        href="http://jira.qos.ch/browse/LBCLASSIC-194">LBCLASSIC-194</a>.
        </p>
    
        <p>Instead of sending its output to the System.out/err reference
        that was effective at initialization, <code>ConsoleAppender</code>
        will now seek the most current System.out/err reference and send
        its output there. This fixes <a
        href="http://jira.qos.ch/browse/LBCORE-143">LBCORE-143</a> as
        reported by Tom SH Liu.
        </p>
    
        <p>DBAppender now outputs exception class and message. It will
        also output root causes, fixing
        <a href="http://jira.qos.ch/browse/LBCLASSIC-170">LBCLASSIC-170</a>
        reported by Tomasz Nurkiewicz.
        </p>
    
        <p>You can now override table and column names in DBAppender. This
        feature was requested in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-188">LBCLASSIC-188</a>
        reported by Tomasz Nurkiewicz.
        </p>
    
        <p>Fixed missing EVENT_ID column problem on PostgreSQL as reported
        in <a href="http://jira.qos.ch/browse/LBCORE-126">LBCORE-126</a>
        by Brian Edwards.</p>
    
        <p>Event id values in DBAppender are now 64bit instead of 32. This
        change was requested in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-198">LBCLASSIC-198</a>
        by Michael Lynch.
        </p>
    
        <p>Added Sybase SQLAnywhere support in DBAppender. This feature
        was requested by Michael Lynch in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-197">LBCLASSIC-197</a>.
        </p>
    
        <p>Added H2 support in DBAppender.</p>
    
    
        <p>Fixed <a
        href="http://jira.qos.ch/browse/LBSITE-36">LBSITE-36</a> reported
        by John Jimenez.</p>
    
        <hr width="80%" align="center" />
    
        <!-- ======================================================================== -->
    
        <h3>3rd of December 2009 - Release of version 0.9.18</h3>
    
        <p>After a very long investigation resulting in somewhat a better
        understanding of licensing issues, logback is now <a
        href="license.html">dual-licensed</a> under the EPL 1.0 and LGPL
        2.1.
        </p>
    
        <p>Due to a clerical error <a
        href="http://jira.qos.ch/browse/LBCORE-26">LBCORE-26</a> has
        re-raised its ugly head. It has now been tamed for good.</p>
    
        <p>Fixed Private-Package and Export-Package sections in
        logback-classic.jar MANIFEST as reported in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-165">LBCLASSIC-165</a>
        and <a
        href="http://jira.qos.ch/browse/LBCLASSIC-121">LBCLASSIC-121</a>
        by applying the relevant patches supplied by Hugues Malphettes.
        </p>
    
        <p>Made the OSGi import declarations for Janino and javax optional
        as proposed by David Varnes in <a
        href="http://jira.qos.ch/browse/LBCORE-101">LBCORE-101</a>.</p>
    
        <p><code>ReconfigureOnChangeFilter</code> did not pick up changes
        for configuration files containing spaces. This issue was reported
        in <a href="http://jira.qos.ch/browse/LBCORE-119">LBCORE-119</a>
        by Anders Wallgren.
        </p>
    
        <p>Added tests cases which run logback artifacts as bundles within
        Felix. This should solve a series of problems related to OSGi.</p>
    
        <p>When ill-formed configuration files fragments were included in
        another configuration file, the included file was not closed
        correctly. This issue was reported in <a
        href="http://jira.qos.ch/browse/LBCORE-122">LBCORE-122</a> by
        Michael Franz.
        </p>
    
        <p>JaninoEventEvaluator now passes the throwable associated with
        an event as a <code>java.lang.Throwable</code> instead of an
        <code>IThrowableProxy</code>. This fixes <a
        href="http://jira.qos.ch/browse/LBCLASSIC-155">LBCLASSIC-155</a>
        as reported by Hontv&aacute;ri J&oacute;zsef. See <a
        href="manual/filters.html#evalutatorFilter">EvaluatorFilter
        documentation</a> for more details.</p>
    
        <p>The name of the log file nested within .zip archives was
        incorrectly set to be that of the tmp file logback creates during
        compression. Anders Wallgren reported and posted an appropriate
        patch for this problem in <a
        href="http://jira.qos.ch/browse/LBCORE-98">LBCORE-98</a>.  The
        nested file is now named after the zip archive file. Analysis
        showed that this was an appropriate strategy in all the cases we
        considered.</p>
    
        <p>Fixed <a
        href="http://jira.qos.ch/browse/LBCLASSIC-149">LBCLASSIC-149</a>. The
        ContextNameConverter now correctly uses the context name of the
        event instead of its own context name.
        </p>
    
        <p>When a logger is named after an inner class, the '$' is used as
        a separator, instead of the usual '.'. This fixes the level
        inheritance issue described in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-102">LBCLASSIC-102</a>
        and as reported by Joern Huxhorn.</p>
    
        <p>Fixed deadlock issue observed with appender which invoke
        loggers as reported in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-154">LBCLASSIC-154</a>
        by Andrew Perrine and debugged by Ralph Goers who also proposed
        the relevant patch.</p>
    
        <hr width="80%" align="center" />
    
        <h3>9th of August 2009 - Release of version 0.9.17</h3>
    
        <p><code>PackagingDataCalculator</code> now correctly deals with
        <code>NoClassDefFoundError</code> thrown by class loaders. This
        fixes <a
        href="http://jira.qos.ch/browse/LBCLASSIC-125">LBCLASSIC-125</a>
        reported by Roland Klein and independently by Didier Besset.
        </p>
    
        <p>In configuration files, all tags names associated with explicit
        actions are now case-insensitive. This should diminish
        case-related errors users may make when writing configuration
        files. Tag names associated with implicit actions which are
        closely linked to the actual Java class being configured, still
        need to follow the camelCase convention. If you are unsure which
        case to use for a given tag name, just follow the camelCase
        convention for tag names which should be correct in most
        cases. </p>
    
        <p>It is now possible to create <a
        href="manual/appenders.html#uniquelyNamed">uniquely named files by
        timestamp</a>. Such files are appropriate for log files associated
        with batch applications. This enhancement fulfills <a
        href="http://jira.qos.ch/browse/LBCORE-91">LBCORE-91</a> as
        requested by Rick Beton and Szel Zoltan.
        </p>
    
        <p>Append mode is now mandatory in
        <code>RollingFileAppender</code>. This was already the default and
        truncation mode is unreasonable in most cases. For example, in
        truncate mode when an application stops and is quickly re-started,
        any pre-existing log file for the current period will be lost.</p>
    
        <p>The <code>activeFile</code> field in
        <code>RollingFileAppender</code> is now properly updated, fixing
        <a href="http://jira.qos.ch/browse/LBCORE-90">LBCORE-90</a> as
        reported by Valery Shorin.</p>
    
    
        <p>The <code>TimeBasedTriggeringPolicy</code> has been heavily
        refactored. It is now possible to trigger rolling simultaneously
        by <a href="manual/appenders.html#SizeAndTimeBasedFNATP">time and
        by size</a>, fixing <a
        href="http://jira.qos.ch/browse/LBCORE-61">LBCORE-61</a>.
        </p>
    
        <p>Fixed <a
        href="http://jira.qos.ch/browse/LBCLASSIC-145">LBCLASSIC-145</a>
        reported by Joern Huxhorn. The <code>LoggingEventVO</code> class
        now correctly populates its callerData field if the original
        <code>ILoggingEvent</code> already has it.</p>
    
        <hr width="80%" align="center" />
    
        <h3>15th of July 2009 - Release of version 0.9.16</h3>
    
        <p>In addition to nifty new features, this release contains
        several important internal changes. Given the importance of some
        of those internal changes, <em>this release may be less stable
        than previous logback releases</em>.</p>
    
        <p>In logback-classic, <a
        href="xref/ch/qos/logback/classic/spi/LoggingEvent.html"><code>LoggingEvent</code></a>
        now implements the <a
        href="xref/ch/qos/logback/classic/spi/ILoggingEvent.html"><code>ILoggingEvent</code></a>
        interface. All logback-classic components expect to process
        <code>ILoggingEvent</code> instances. Moreover, events which sent
        to a remote host are now of type <a
        href="xref/ch/qos/logback/classic/spi/LoggingEventVO.html"><code>LoggingEventVO</code></a>.
        </p>
    
        <p>Logback-classic will now <a
        href="manual/configuration.html#autoScan">automatically
        re-configure itself</a> when its configuration file is
        modified. This enhancement was requested in <a
        href="http://jira.qos.ch/browse/LBCORE-59">LBCORE-59</a> by
        Michael Osipov.</p>
    
        <p>FileAppender and its derived class RolllingFileAppender are now
        based on a finer-grain synchronization model. This change is aimed
        at reducing various synchronization related bugs, namely <a
        href="http://jira.qos.ch/browse/LBCLASSIC-135">LBCLASSIC-135</a>
        and its various sub-tasks.
        </p>
    
        <p>Fixed a bug in the localLevelReset() method in the
        <code>Logger</code> class which inadvertently used the DEBUG_INT
        value in the org.slf4j.spi.LocationAwareLogger interface instead
        of the DEBUG_INT value in ch.qos.logback.classic.Level class. The
        issue was first identified by Andy Ruch <a
        href="http://qos.ch/pipermail/logback-user/2009-February/000955.html">in
        a message</a> to the logback-user list
        </p>
    
        <p>If the logger name had 12 or more segments, a the logger
        conversion specified would throw an
        <code>ArrayIndexOfBounds</code> exception. Lukas Zapletal has
        kindly reported this problem in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-110">LBCLASSIC-110</a>
        and provided a test case.
        </p>
    
        <p>A new discriminator class called "ContextBasedDiscriminator"
        allows SiftingAppender to separate logging based on the context
        name. This fits nicely with the requirements expressed in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-117">LBCLASSIC-117</a>
        by Rick Janda.
        </p>
        
        <p>When a context is reset, then its object and property maps are
        now cleared. This fixes <a
        href="http://jira.qos.ch/browse/LBCORE-104">LBCORE-104</a>
        reported by Johan Bos.
        </p>
    
        <p>Fixed <a
        href="http://jira.qos.ch/browse/LBCORE-105">LBCORE-105</a>. Configuration
        files placed in jar files will no longer lock the jar file. This
        issue was initially reported for log4j in <a
        href="https://issues.apache.org/bugzilla/show_bug.cgi?id=47465">bug
        47465</a> Mark Thomas.
        </p>
    
        <p>Fixed <a
        href="http://jira.qos.ch/browse/LBCORE-94">LBCORE-94</a>. While
        configuring a RollingFileAppender, if the File property is
        declared after any rolling or triggering policies, then logback will
        now generate an error status message.
        </p>
    
        <p>Fixed <a
        href="http://jira.qos.ch/browse/LBCLASSIC-134">LBCLASSIC-134</a>
        reported by Darryl Smith. <code>DuplicateMessageFilter</code> will
        now behave correctly when invoked via
        <code>Logger.isXXXEnabled</code> methods.
        </p>
    
        <p>Fixed <a
        href="http://jira.qos.ch/browse/LBCORE-107">LBCORE-107</a>,
        incorrectly set context information for the
        <code>NestedBasicPropertyIA</code> instance in Joran, reported by 
        L&oacute;r&aacute;nt Pint&eacute;r.
        </p>
    
        <p>Fixed <a
        href="http://jira.qos.ch/browse/LBCLASSIC-109">LBCLASSIC-109</a>,
        reported by Andrew Ruch when a logger context was reset, the trace
        level was erroneously enabled.
        </p>
    
        <hr width="80%" align="center" />
    
        <h3>12th of February 2009 - Release of version 0.9.15</h3>
    
        <p>When the reset() method in <code>LoggerContext</code> is
        called, registered turbo filters are first stopped before being
        unregistered. This fixes <a
        href="http://jira.qos.ch/browse/LBCLASSIC-89">LBCLASSIC-89</a>
        reported by Alexis Morillo.
        </p>
    
        <p>Added a servlet for viewing internal status messages as an HTML
        table. Two separate implementations are available; one for <a
        href="manual/configuration.html#viewingStatusMessages">logback-classic</a>
        and the other for <a
        href="access.html#viewingStatusMessages">logback-access</a>.</p>
    
        <p>Added the <code>clear()</code> method to the
        <code>StatusManager</code> interface. After reconfiguration, it
        may be desirable to clear the status list maintained by a
        <code>StatusManager</code>. This change was requested by Alexis
        Morillo in <a
        href="http://jira.qos.ch/browse/LBCORE-77">LBCORE-77</a>.
        </p>
    
        <p>Fixed problem <a
        href="http://jira.qos.ch/browse/LBCLASSIC-104">LBCLASSIC-104</a>
        related to loss of MDC information in deferred logging events.
        </p>
    
        <p>Fixed issue <a
        href="http://jira.qos.ch/browse/LBCLASSIC-101">LBCLASSIC-101</a>. Logback
        jar files now include full OSGi bundle information in their
        manifests. This information is automatically added by Apache
        Felix' Maven bundle plug-in. The generated manifest files contain
        an appropriate Bundle-RequiredExecutionEnvironment directive,
        fixing <a
        href="http://jira.qos.ch/browse/LBGENERAL-8">LBGENERAL-8</a>.
        </p>
    
        <p>The setter and getter methods for the layout property in
        <code>AppenderBase</code> class now have reasonable default
        implementations, instead of nop previously. This change was
        requested by Thilo Tanner in <a
        href="http://jira.qos.ch/browse/LBCORE-56">LBCORE-56</a>.
        </p>
        
    
        <p>Added <em>log4j.dtd</em> compatible <a
        href="manual/layouts.html#log4jXMLLayout"><code>XMLLayout</code></a>
        as requested in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-22">LBCLASSIC-22</a>.
        </p>
    
        <p>New chapter <a href="manual/onJoran.html">on Joran</a>.</p>
    
        <hr width="80%" align="center" />
    
        <h3>29th of December 2008 - Release of version 0.9.14</h3>
    
        <p>Corrected a serious dead-lock problem occuring during
        configuration. It was reported in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-81">LBCLASSIC-81</a> by
        Holger Mense.</p>
    
        <p>Corrected thread leakage observed with
        <code>TimeBasedRollingPolicy</code>'s
        <code>AsynchronousCompressor</code>. This bug was reported in <a
        href="http://jira.qos.ch/browse/LBCORE-78">LBCORE-78</a> by Szel
        Zoltan.</p>
    
        <p>Added <a
        href="manual/filters.html#DuplicateMessageFilter">DuplicateMessageFilter</a>,
        a turbo filter which detects duplicate messages, and beyond a
        certain number of repetitions, drops repeated messages.</p>
    
        <p>Added a new appender called <a
        href="manual/appenders.html#SiftingAppender"><code>SiftingAppender</code></a>. As
        its name intimates, a <code><code>SiftingAppender</code></code>
        can be used to separate (or sift) logging according to a given
        runtime attribute. For example, <code>SiftingAppender</code> can
        separate logging events according to user sessions, so that the
        logs generated by each user go into distinct log files, one log
        file per user.
        </p>
        
        <p><code>BasicStatusManager</code>'s internal buffer is now split
        into two parts, the header part and the tail part. The header part
        stores the fist H status messages whereas the tail part stores the
        last T messages. At present time H=T=150, although these values may
        change in future releases.</p>
    
        <p>Fixed <code>NullPointerException</code> thrown when calling
        <code>setContextMap</code> on a fresh MDC. <a
        href="http://jira.qos.ch/browse/LBCLASSIC-98">Issue was</a>
        reported by Francois Terrier.
        </p>
    
    
        <p>Evaluators are now wired into an appender automatically
        (implicit rules) without the help of
        <code>EvaluatorAction</code>. EvaluatorAction is now only needed
        for global evaluator elements.  It follows that name attribute is
        necessary only for global evaluators. Embedded evaluators no
        longer need a name. This change fixes <a
        href="http://jira.qos.ch/browse/LBCLASSIC-100">LBCLASSIC-100</a>. In
        addition, <code>EvaluatorAction</code> has been modified to accept
        evaluators of any type and not just instances of
        <code>JaninoEvaluator</code>.    
        </p>
    
        <p>Logback-classic default configuration process will now
        automatically print status data on the console in case of warnings
        as well as errors. Previously, status data was printed only in
        case of errors.</p>
    
        <p><code>ContextInitializer</code> will now print the url of the
        configuration it is using. This should help reduce confusion when
        multiple config files are found on the class path.  This change
        resolves <a
        href="http://jira.qos.ch/browse/LBCLASSIC-55">LBCLASSIC-55</a>
        reported by Anton Tagunov and Henric Larsson.
        </p>
    
        <p>In case multiple configuration files are found on the class
        path, <code>ContextInitializer</code> will now emit a
        warning. This fixes <a
        href="http://jira.qos.ch/browse/LBCLASSIC-85">LBCLASSIC-85</a>
        filed by Szel Zoltan.
        </p>
    
        <p><code>HTMLLayout</code> now honors custom conversion words,
        thus fixing <a
        href="http://jira.qos.ch/browse/LBCORE-74">LBCORE-74</a> as
        reported by Natan Cox.</p>
    
        <p>Fixed <a
        href="http://jira.qos.ch/browse/LBCORE-69">LBCORE-69</a> as
        reported by Andrey Rybin. <code>SMTPAppenderBase</code> now has
        support for charset encodings so that email messages can contain
        characters beyond US-ASCII.
        </p>
    
        <p><code>SMTPAppender</code> in logback-classic now defaults to
        <code>OnErrorEvaluator</code> instead of a janino-based
        evaluator. Thus, by default <code>SMTPAppender</code> no longer
        depends on Janino.</p>
    
        <p>Added UnsynchronizedAppenderBase class based on Ralph Goers'
        contribution in <a
        href="http://jira.qos.ch/browse/LBCORE-58">LBCORE-58</a>. Note
        that <code>AppenderBase</code> remains unchanged. Appenders which
        need to handle synchronization on their own can do so by deriving
        from <code>UnsynchronizedAppenderBase</code>.</p>
    
        <h3>5th of December 2008 - Release of version 0.9.13</h3>
    
        <p>A <code>NullPointerException</code> was being thrown when a the
        level of a logger was set to null. The logger in question had to
        have children. This problem was reported in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-91">LBCLASSIC-91</a>
        by Mateusz Jedruch.
        </p>
    
        <h3>4th of December 2008 - Release of version 0.9.12</h3>
        
        <p>Fixed <a href="http://jira.qos.ch/browse/LBCORE-26">bug
        LBCORE-26</a> reported by Tsutomu YANO and independently by
        Hontv&aacute;ri J&oacute;zsef and Gamaliel
        Amaudruz. <code>RollingFileAppender</code> when used in conjunction
        with <code>DateBasedRollingPolicy</code> will rollover existing log
        files at initialization if their timestamp warrants it.
        </p>
    
        <p>Added support for file appending in <a
        href="manual/appenders.html#prudent">prudent mode</a>. Thus,
        multiple <code>FileAppender</code> instances running on multiple
        JVMs can safely write to the same log file. With certain
        limitations, prudent mode extends to
        <code>RollingFileAppender</code>.
        </p>
    
    
        <p>Fixed <a
        href="http://jira.qos.ch/browse/LBCLASSIC-83">LBCLASSIC-83</a>.
        It is now possible to set the level of a logger to null, even if
        it was previously set to a non-null level. Previously, a
        <code>NullPointerException</code> would be thrown.
        </p>
    
        <p>In response to <a
        href="http://jira.qos.ch/browse/LBCLASSIC-61">LBCLASSIC-61</a>, <a
        href="http://jira.qos.ch/browse/LBCLASSIC-33">LBCLASSIC-33</a>, <a
        href="http://jira.qos.ch/browse/LBCLASSIC-14">LBCLASSIC-24</a> and
        <a href="http://jira.qos.ch/browse/LBCLASSIC-24">LBCLASSIC-14</a>
        <code>JMXConfigurator</code> has been redesigned.
        </p>
    
        <p>Fixed <a
        href="http://jira.qos.ch/browse/LBGENERAL-22">LBGENERAL-22</a>. The
        <a href="http://logback.qos.ch/translator/">log4j.properties
        translator</a> web-application has been significantly refactored.
        </p>
    
        <p>Fixed improvement request <a
        href="http://jira.qos.ch/browse/LBCLASSIC-59">LBCLASSIC-59</a>
        relation to StatusListeners, originally submitted by Anton Tagunov.
        </p>
    
        <p>The logger and class name converters now consider zero as
        having special meaning, and will return the simple class name,
        removing the package name prefix. This feature was asked by
        Silvano Maffeis.</p>
        
        <p>In response to <a
        href="http://jira.qos.ch/browse/LBCLASSIC-54"> LBCLASSIC-54</a>
        support for turbo filters has refactored. The present code is safe
        under concurrent access while still offering good performance.
        </p>
    
        <p>Fixed <a
        href="http://jira.qos.ch/browse/LBCORE-43">LBCORE-43</a> reported
        by Bruno Navert. Configuration files can now look up property
        files from classpath resources.
        </p>
    
        <p>Fixed <a
        href="http://jira.qos.ch/browse/LBCLASSIC-86">LBCLASSIC-86</a>
        related to <code>AccessControlException</code> thrown when run in
        a JVM with a <code>SecurityManager</code>.
        </p>
    
        <p>Invoking the <code>LoggerContext.reset()</code> method resets
        logger levels to their default value, that is <code>DEBUG</code>
        for the root logger and <code>null</code> for all other
        loggers. This was requested in <a
        href="http://jira.qos.ch/browse/LBCLASSIC-90">LBCLASSIC-90</a> by
        Mateusz Jedruch.
        </p>
    
        <!-- ======================== minor ================== -->
    
        <p>Fixed <a href="http://jira.qos.ch/browse/LBCLASSIC-69">bug
        LBCLASSIC-69</a> reported by Anton Tagunov. The
        LevelToSyslogSeverity now correctly handles the TRACE level.
        </p>
    
        <p>Fixed <a href="http://jira.qos.ch/browse/LBCLASSIC-57">bug
        LBCLASSIC-57</a> reported by Anton Tagunov. SyslogAppender could
        overwhelm the Syslog server with very large messages. SyslogAppender
        now limits its message size to 256K.
        </p>
    
        <p>Logback now supports <a
        href="manual/configuration.html#contextName">setting the logger context
        name</a> as well as inserting variables <a
        href="manual/configuration.html#insertFromJNDI">stored in JNDI</a> as
        properties.
        </p>
    
        <p>Fixed issue <a
        href="http://jira.qos.ch/browse/LBCLASSIC-49">LBCLASSIC-49</a>
        reported by Oliver Lietz. The getLogger() method in
        <code>LoggerContext</code> class will now throw an
        <code>IllegalArgumentException</code> when invoked with a null
        argument.
        </p>
    
    
      <hr width="80%" align="center" />
    
      <h3>28th of October 2008 - Release of version 0.9.11</h3>
    
      <p>Fixed <a
      href="http://jira.qos.ch/browse/LBCLASSIC-77">LBCLASSIC-77</a>
      reported independently by Gianni Doe, Yannick Haudry and Yossi Shaul.
      The childValue() method of <code>CopyOnInheritThreadLocal</code>
      class part of MDC code no longer throws a
      <code>NullPointerException</code>.
      </p>
    
      <hr width="80%" align="center" />
    
      <h3>27th of October 2008 - Release of version 0.9.10</h3>
    
      <p>In case of errors during initialization, logback-classic now
      <em>automatically</em> prints out its internal status. This has been
      a frequently requested feature.
      </p>
    
      <p>The LogbackValve in logback-access (ensuring integration with
      Tomcat), will now systematically print its internal status upon
      initialization, unless told to be quiet. This greatly helps
      troubleshooting the configuration of logback-access under Tomcat.
      </p>
    
      <p>Fixed <a href="http://bugzilla.qos.ch/show_bug.cgi?id=147">bug
      147</a> which occurred when the user inadvertently attempted to set
      the layout of a <code>SyslogAppender</code>.  The code now actively
      prevents this. Documentation has been updated to reflect the change.
      </p>
    
      <p>Fixed <a href="http://jira.qos.ch/browse/LBCLASSIC-56">bug
      LBCLASSIC-56</a> originally reported by Michel Colette. Backslash
      characters are now correctly interpreted in filename patterns.
      </p>
    
      <p>The TurboFilterChain in a LoggerContext is <a
      href="http://svn.qos.ch/viewvc?view=rev&amp;revision=1678">now
      cleared</a> when the <code>reset</code>() method is called. This
      problem was reported on May 1st, 2008, by Julia Hu on the logback
      developers list.
      </p>
    
      <!-- ========================== LB CORE ================== -->
    
      <p>Fixed issue <a
      href="http://jira.qos.ch/browse/LBCORE-48">LBCORE-48</a>.  During
      rollover, compression of large files would bring all logging to a
      halt. In this latest release, the rolled over file is first renamed,
      which is a relatively fast operation, and only then is the renamed
      file compressed asynchronously (in a separate thread).
      </p>
    
      <p>Fixed issue <a
      href="http://jira.qos.ch/browse/LBCORE-11">LBCORE-11</a>.  It is now
      possible to instruct TimeBasedRollingPolicy to delete old files,
      thus controlling then number of archived log files.</p>
    
      <p>Fixed issue <a
      href="http://jira.qos.ch/browse/LBCORE-42">LBCORE-42</a>. If the
      parent directory of the log file does not exist, then FileAppender
      will create it, including any necessary but nonexistent parent
      directories.
      </p>
    
      <p>Fixed <a href="http://jira.qos.ch/browse/LBCORE-15">LBCORE-15</a>
      reported by Klaus Unger and others. DBAppender should now work with
      Oracle 9, 10g and 11g, regardless of the JDBC driver type used.
      </p>
    
      <p>Fixed issue <a
      href="http://jira.qos.ch/browse/LBCORE-17">LBCORE-17</a> reported by
      Thorbj&oslash;rn Ravn Andersen. Logback now relies on Geronimo JMS
      API specifications instead of Sun's JMS API specification, the
      latter requiring manual installation. With Geronimo JMS, logback can
      be built using Maven without needing to manually install any
      dependencies.
      </p>
    
      <p>Fixed issue <a
      href="http://jira.qos.ch/browse/LBCORE-23">LBCORE-23</a>. In
      PatternLayout, parenthesis can be used to group conversion
      patterns. It follows that the '(' and ')' carry special meaning and
      need to be escaped to be used as literals. This is now properly
      documented.
      </p>
    
      <p>The location of the default configuration file can be specified
      by a system property. This feature was requested in <a
      href="http://jira.qos.ch/browse/LBCORE-32">LBCORE-32</a> by Ted
      Graham, Matt Fowles, Ivan Biddles and Ralph Goers.
      </p>
    
      <p>Fixed issue <a
      href="http://jira.qos.ch/browse/LBCORE-55">LBCORE-55</a> reported by
      Natan Cox. <code>WriterAppender</code> now outputs its presentation
      footer and file footer in the the correct order.
      </p>
    
    
      <p>Fixed issue <a
      href="http://jira.qos.ch/browse/LBCORE-27">LBCORE-27</a> reported by
      Peter Royal. <code>SMTPAppender</code> now outputs its presentation
      footer and file footer in the the correct order.
      </p>
    
      <!-- ========================== LB CLASSIC ================== -->
    
      <p>Fixed issue <a
      href="http://jira.qos.ch/browse/LBCLASSIC-67">LBCLASSIC-67</a>
      reported by Alessandro Fustini. SMTPAppender now correctly
      configures the layout used to format the subject line of the
      outgoing email. It no longer appends a lengthy stack trace to the
      subject line.
      </p>
    
    
      <p>Fixed issue <a
      href="http://jira.qos.ch/browse/LBCLASSIC-68">LBCLASSIC-68</a>
      reported by Gili Tzabari. In environments where the TCCL (Thread
      Context Class Loader) was not set, logback was unable to located its
      default configuration files. Logback now uses the class loader that
      loaded logback itself to locate its resources instead of the
      TCCL. This approach is simpler and deemed to cover more
      environments, i.e. more widely applicable.
      </p>
    
    
      <p>Fixed issue <a
      href="http://jira.qos.ch/browse/LBGENERAL-24">LBGENERAL-24</a>
      reported by Hung Tang. SMTPAppender now supports plain
      username/password authentication as well as both the STARTTLS
      command and SSL connections.
      </p>
    
     
      <p>Fixed issue <a
      href="http://jira.qos.ch/browse/LBCLASSIC-48">LBCLASSIC-48</a>
      reported by Peter Royal. SyslogAppender now correctly outputs hours
      as 0-23 and not as 1-12 as previously.
      </p>
    
      <p>Added a new TurboFilter called DynamicThresholdFilter which can
      filter events depending on MDC values based on a variety of criteria
      such as company name, product or the end user. This filter was
      contributed by Ralph Goers in <a
      href="http://jira.qos.ch/browse/LBCLASSIC-53">LBCLASSIC-53</a>.  
      </p>
    
      
      <hr width="80%" align="center" />
     
    
    
      <h3>26th of March 2008 - Release of version 0.9.9</h3>
      
      <p>MDC data in now inherited by child threads. This behaviour was
      already specified in the javadocs. The issue was raised by Martin
      Benda in <a href="http://bugzilla.qos.ch/show_bug.cgi?id=64">bug
      64</a> and independently by Peter Huber.
      </p>
      
      <p>Logback no longer includes retro-weaver generated jars for JDK
      1.4. There seems to be little interest in JDK 1.4 builds. Calling
      retro-weaver increases logback's build time by a few seconds each
      time &ndash; seconds in which we can do more productive things.
      </p>
    
      <p>Fixed <a href="http://bugzilla.qos.ch/show_bug.cgi?id=104">bug
      104</a>, silly but but nonetheless serious copy-and-paste errors in
      the c.q.l.classic.Logger class, reported by Joern Huxhorn.
      </p>
    
      <p>Having been replaced by <code>SimpleSocketServer</code>, the
      <code>SocketServer</code> class has been removed.
      </p>
      
      <p>Fixed <a href="http://bugzilla.qos.ch/show_bug.cgi?id=105">bug
      105</a>, sockets created by <code>SocketAppenderBase</code> is now
      closed, reported by Joern Huxhorn. More generally,
      <code>SimpleSocketServer</code> is much more careful to track open
      client connections and to close them.
      </p>
    
      <p>Fixed <a href="http://bugzilla.qos.ch/show_bug.cgi?id=110">bug
      110</a> in relation with the <code>requestParameterMap</code> field
      in <code>AccessEvent</code> - reported by Joern Huxhorn.
      </p>
    
      <p>Fixed <a href="http://bugzilla.slf4j.org/show_bug.cgi?id=66">
      SLF4J bug 66</a> in relation with caller data when using
      log4j-over-slf4j - reported by Frnack Routier.
      </p>
    
      <p>Fixed <a href="http://bugzilla.qos.ch/show_bug.cgi?id=129">bug
      129</a> reported by Michael Franz. As a result, Joran now supports
      nested as well as multiple file inclusions.
      </p>
    
      <p>Fixed <a href="http://bugzilla.qos.ch/show_bug.cgi?id=100">bug
      100</a> reported by Joern Huxhorn. At serialization time, object
      array passed as parameter, when the LoggingEvent is are now
      serialized as strings.
      </p>
    
      <p>Fixed <a href="http://bugzilla.qos.ch/show_bug.cgi?id=109">bug
      109</a> reported by Joern Huxhorn. There should no longer be any
      NullPointerExceptions thrown by deserialized
      <code>AccessEvent</code> instances.
      </p>
    
      <p>Fixed <a href="http://bugzilla.qos.ch/show_bug.cgi?id=8">bug
      8</a> reported by Sebastien Pennec. The documentation has been
      updated to reflect the fact that that in the context of conversion
      patterns the percent sign carries special meaning, in order to
      include the percent sign as a literal, it must be escaped with a
      backslash.
      </p>
    
      <p>Fixed <a href="http://bugzilla.qos.ch/show_bug.cgi?id=52">bug
      52</a> reported by Kenichi Masuko. The bug has been fixed on March
      8th, 2007. Starting with this release, Joran will support the
      injection of any enum type, not just <code>FilterReply</code>.
      </p>
    
      <hr width="80%" align="center" />
    
    
      <h3>22th of August 2007 - Release of version 0.9.8</h3>
      
      <p>This version of logback synchronizes with SLF4J version 1.4.3. In
      particular, logback now natively supports SLF4J's MDC API introduced
      in SLF4J version 1.4.1. If you are using SLF4J version 1.4.1 or
      later please make sure upgrade to logback version 0.9.8 or later.
      </p>
    
      <p>Fixed a number of documentation related bugs, in particular <a
      href="http://bugzilla.qos.ch/show_bug.cgi?id=90">bug 90</a> reported
      by Luc Maisonobe and <a
      href="http://bugzilla.qos.ch/show_bug.cgi?id=90">bug 88</a> reported
      by Sebastian Davids.
      </p>
    
      <p>It is now possible to include configuration file fragments (in
      XML) as a resource. Previously, it was only possible to include a
      file by specifying a path to a file or a URL.  This feature was
      requested by Michael Newcomb in <a
      href="http://bugzilla.qos.ch/show_bug.cgi?id=89">bug 89</a>.
      </p>
    
      <p>Fixed caller data extraction problem as reported in <a
      href="http://bugzilla.qos.ch/show_bug.cgi?id=78">bug 78</a> by Hans
      van der Meer.
      </p>
    
      <p>The LoggingEvent class' constructor now correctly takes into
      account the argument array passed by the user. This problem was
      reported in <a href="http://bugzilla.qos.ch/show_bug.cgi?id=85">bug
      85</a> by Robert Christian.
      </p>
    
      <hr width="80%" align="center" />
    
    
      <h3>29th of May 2007 - Release of version 0.9.7</h3>
    
    
      <p>This release corrects packaging bugs <a
      href="http://bugzilla.qos.ch/show_bug.cgi?id=75">75</a> and <a
      href="http://bugzilla.qos.ch/show_bug.cgi?id=76">76</a> related to
      the migration of logback to SLF4J version 1.4.0. There are no other
      changes.
      </p>
    
    
      <hr width="80%" align="center" />
    
      <h3>23rd of May 2007 - Release of version 0.9.6</h3>
    
    
      <p>Logback is now aligned and compatible with SLF4J version 1.4.0,
      thus correcting <a
      href="http://bugzilla.qos.ch/show_bug.cgi?id=73">bug 73</a> as
      reported by Andy Gerweck.
      </p>
    
      <p>Fixed <code>NoClassDefFoundError</code> problem when running
      under JDK 1.4 <a
      href="http://www.qos.ch/pipermail/logback-user/2007-April/000206.html">as
      reported</a> by Brian Suksomwong.
      </p>
    
      <p>Fixed <a href="http://bugzilla.qos.ch/show_bug.cgi?id=63">bug
      63</a> as reported by La Canea Rosario. Calling log4j (bridge) with
      the trace level will no longer cause an IllegalStateException to be
      thrown.
      </p>
    
      <p>Fixed <a href="http://bugzilla.qos.ch/show_bug.cgi?id=70">bug
      70</a> as reported by Dirk Ooms. The %throwable conversion word is
      now recognized as documented in the logback manual. Moreover, the
      manual now mentions the %nopex word which can be used to force
      <code>PatternLayout</code> to ignore the exception contained in the
      logging request.
      </p>
    
      
      <p>As in most releases, the documentation has been improved.</p>
    
      <hr width="80%" align="center" />
    
    
      <h3>April 2nd, 2007 - Release of version 0.9.5</h3>
    
      <p>Fixed methods <code>isInfoEnabled</code>,
      <code>isWarnEnabled</code> and <code>isErrorEnabled</code> methods
      in <code>ch.qos.logback.classic.Logger</code> class which failed to
      work correctly. This bug was reported today by Pavel Kral on the
      slf4j-user list. 
      </p>
    
      <p>Contrary to previous versions of logback, the various
      Logger.isXYZEnabled(Marker) methods now take into account the marker
      information passed as parameter.
      </p>
    
    
      <p>As discussed in <a
      href="http://bugzilla.qos.ch/show_bug.cgi?id=54">bug 54</a>, during
      automatic initialization, it makes better sense to first check for
      <em>logback-test.xml</em> file and only if that fails, to check for
      <em>logback.xml</em>. Maven2 will guarantee that the
      logback-test.xml file, if places under test/resources will not be
      included in the artifact it produces.
      </p>
    
    
      <hr width="80%" align="center" />
      
      <h3>March 29th, 2007 - Release of version 0.9.4</h3>
        
      <p>Significant bug fixes made to <code>c.q.l.access.TeeFilter</code>
      and Co. Images and other binary files are now intercepted and
      replayed correctly. As for "x-www-form-urlencoded" post requests,
      their input buffer is left untouched. In a best-effort attempt, the
      input buffer for "x-www-form-urlencoded" post requests is later
      reconstructed through the request parameters. However, it may differ
      from the original buffer.
      </p>
        
      <p>The logback team released today the first version of a plugin for
      Eclipse that allows developers to visualize logs generated by a
      running application.  It offers several nice features. Please check
      the <a href="consolePlugin.html">console plugin-in guide</a> for
      more details.
      </p>
    
    
      <h3>March 20th, 2007 - Release of version 0.9.3</h3>
      
      <p>Includes in configuration files are now supported by Joran,
      logback's configuration framework. A file can contain an
      <em>include</em> element that has a <em>file</em> or <em>url</em>
      attribute pointing to a configuration file.  See the <a
      href="manual/configuration.html#fileInclusion">chapter about
      configuration</a> in the logback's online manual for more
      information.
      </p>
        
      <p>Corrected bug 53 reported by Wilkins Poe. There is now a <a
      href="dependencies.html">dependencies page</a> that shows the
      requirements of each of logback's modules.
      </p>
        
      <p>After a <a
      href="http://www.slf4j.org/pipermail/user/2007-March/000297.html">
      discussion on the SLF4J mailing list</a> started by Franck Routier,
      a correction has been made when logging using the
      <em>JCL104-over-slf4j</em> module. Logback now correctly shows the
      caller location information.
      </p>
        
      <p>As in most logback releases, the documentation has been improved.
      </p>
        
    
      <h3>March 5th, 2007 - Release of version 0.9.2</h3>
      
      <p>The documentation is now in the <em>docs/</em> directory to allow an
      easier access to the logback manual and website for offline viewing.
      </p>
      
      <h3>March 5th, 2007 - Release of version 0.9.1</h3>
      
      <p>Logback-class now depends on SLF4J version 1.3.0 instead of
      1.2.</p>
      
      <p>Numerous improvements to the documentation.</p>
      
      <p><a href="http://bugzilla.qos.ch/show_bug.cgi?id=46">Bug #46</a>
      reported by Mark Renyolds has been fixed. The
      <code>TimeUtilTest</code> should now run fine under any time
      zone.</p>
    		
      <p><a href="http://bugzilla.qos.ch/show_bug.cgi?id=45">Bug
      #45</a>, also reported by Mark Reynolds, has been fixed. There
      should be no <code>ClassCastException</code> thrown anymore when
      passing an <code>Object</code> to the printing methods using the
      log4j-bridge module. </p>
      
      <hr width="80%" align="center" />
      
      <h3>January 31st, 2007 - Release of version 0.9</h3>
      
      <p>This version contains a new component, namely the
      <code>ContextSelector</code>, that provides context separation and
      management when logback is used by several web-apps running under
      the same server. A <a href="manual/contextSelector.html">new
      chapter</a> was added to the logback manual to detail the use of the
      <code>ContextSelector</code>, along with its associated components.
      </p>
        
      <p>The <code>JMXConfigurator</code> has been improved. It now shows
      the context's Status objects, which lets users check the internal
      state of logback.
      </p>
        
      <p>The logback manual's chapter 2, about <a
      href="manual/architecture.html">logback's architecture</a>, has been
      updated with two sections: Under the hood and Performance.
      </p>
      
      <hr width="80%" align="center" />
      
      <h3>January 23th, 2007 - Release of version 0.8.1</h3>
      
      <p>This version contains new components in the Access module,
      allowing users to display the full HttpServletRequest or
      HttpServletResponse of an access event.
      </p>
        
      <p>The documentation section has been updated. The short
      introduction was split into the chapter 1 and chapter 2 of the
      logback manual. The chapters about Appenders and Layouts have been
      updated to document new components of logback.
      </p>
        
      <p>A demonstration webApp presenting logback's major components is
      available.  A document explains how to run it, and provides a
      step-by-step visit of the demo.
      </p>
      
      <p>A first translation of logback jars to JDK1.4 is present in
      this release.
      </p>
      
      
      <hr width="80%" align="center" />
      
      <h3>January 12th, 2007 - Release of version 0.8</h3>
      
      <p>This version contains a whole new chapter, namely Chapter 3,
      about logback configuration. Several other documentation pages
      have been improved.
      </p>
      
      <p>Logback now uses Generics in many components.
      </p>
      
      <p>Several new components have been added to logback. A JMX
      Configurator now allows users to see and modify loggers or reload
      configuration among other possibilities.  A <a
      href="jmxConfig.html">document</a> about this configurator is
      available in the <a href="documentation.html">corresponding
      section</a> of the site. We'd like to thank Sebastian Davids for his
      ideas and contributions to this component.
      </p>
    		
      <p>A JMSTopicAppender and JMSQueueAppender are now available, as
      well as two new filters: LevelFilter and ThresholdFilter. A
      refactoring was done in the filters objects to ease the
      implementation of custom filters.
      </p>
    		
      <hr width="80%" align="center" />
    
    		
      <h3>December 19th, 2006 - Release of version 0.7.1</h3>
      
      <p>Version 0.7.1 of logback has been released.
      </p>
      
      <p>This version contains more detailed information about logback
      access module, and its JMX components. A <a
      href="access.html">dedicated page</a> explains how to configure and
      use logback access in Tomcat and Jetty, and access some of its
      components via JMX.
      </p>
    		
      <hr width="80%" align="center" />
      
      <h3>December 18th, 2006 - Release of version 0.7</h3>
      
      <p>Version 0.7 of logback has been released.</p>
    		
      <p>Logback now ships with a new module: <em>log4j-bridge</em>. This
      new module can be used to intercept log4j calls and redirects them
      to logback components.  More information about this module can be
      found in the corresponding <a href="bridge.html">documentation
      page</a>.
      </p>
    		
      <p>The documentation has been vastly updated. Two new chapters,
      namely Filters and MDC, are available in the manual section.
      </p>
    
      <hr width="80%" align="center" />
      
      <h3>November 30th, 2006 - Release of version 0.6</h3>
      
      <p>Version 0.6 of logback has been released.
      </p>
      
      <p>Logback classic now supports automatic configuration, allowing
      test and production environment
      configuration. <code>TurboFilters</code> make their first appearance
      in a logback release. They provide ultra-fast filtering
      possibilities.  The logging context now supports listeners which
      will be contacted each time the context is reset or
      started. <code>SMTPAppender</code> allows for much more flexible
      configuration than before.
      </p>
    		
      <p>In logback access, new Appenders are available, namely
      <code>SocketAppender</code> and <code>DBAppender</code>.  Logback
      access now supports filtering and event evaluations. A
      <code>CountingFilter</code> has been added. It provides statistical
      views of server access, reachable via JMX.
      </p>
    		
      <p>The documentation has also been improved. A complete new chapter
      has been added about Appenders, the short introduction to logback
      classic has been updated and a new module, containing many
      configuration examples has been added.
      </p>
    		
      <p>Logback now uses continuous integration in its development.
      </p>
    		
      <p>Tests have been improved, many new have been added.  This release
      also provides some bug fixes.
      </p>
    
      <hr width="80%" align="center" />
      
      <h3>October 26th, 2006 - Release of version 0.5</h3>
      
      <p>Version 0.5 of logback has been released.
      </p>
    		
      <p>This release offers a important improvements in Joran. In
      particular, Joran can now replay configuration elements.
      </p>
    
      <p>As in the previous release, a major area of work is the
      documentation which is being continuously improved.
      </p>
    
      <hr width="80%" align="center" />
      
      <h3>October 9th, 2006 - Release of version 0.4</h3>
      
      <p>Version 0.3 of logback has been released.
      </p>
    		
      <p>This release includes an improved access module, with specific
      implementations for the Jetty and Tomcat servers. Documentation was
      also added to show how to integrate logback-access with Jetty.
      </p>
    
      <p>As for the classic module, several appenders and layouts have
      been added or improved.  The error reporting of logback has also
      been enhanced, presenting the user with a link to an online page
      explaining possible reasons for the error.
      </p>
    
      <p>Joran documentation was added, with examples in the core
      module.
      </p>
    	
      <hr width="80%" align="center" />
      
      <h3>September 8th, 2006 - Release of version 0.3</h3>
      <p>
        Version 0.3 of logback has been released.
      </p>
      
      <p>This release offers several new Appenders, support for Mapped
      Diagnostic Context, improved tests and documentation<br />
      </p>
    
      <p>In response to a bug report by Rickard Nilsson on the logback
      mailing list, a bug affecting parametrized logging was fixed.
      </p>
    
      <p>We also released a <a
      href="http://logback.qos.ch/translator/">PropertiesTranslator</a>
      webapp that converts <em>log4j.properties</em> files to joran
      configuration files (in XML format).<br />
      </p>
    	
      <hr width="80%" align="center" />
    		
      <h3>August 23th, 2006 - Release of version 0.2.5</h3>
      
      <p> Version 0.2.5 of logback has been released. </p>
    
      <p>This release offers better documentation, with a number of
      corrections made in the short introduction to logback-classic.
      </p>
      
      <hr width="80%" align="center" />
      
      
      <h3>August 15th, 2006 - Release of version 0.2</h3>
      
      <p>Version 0.2 of logback has been released.</p>
    
      <p>It offers better tests, some more functionality, and enhanced
      documentation.  We also improved the site design to make it simpler
      and more efficient.
      </p>
    
      <hr width="80%" align="center" />
      
      <h3>July 26th, 2006 - Release of version 0.1</h3>
      
      <p>Version 0.1 of logback has been released.</p>
      
      <hr width="80%" align="center" />
      
      <h3>February 9th, 2006 - Logback web-site goes live</h3>
      
      <p>The logback web-site goes live on the 9th of February. At its
      present state, it is pretty primitive but updates will follow.
      </p>
      
    	
      <script src="templates/footer.js" type="text/javascript"></script>
    </div>
    </body>
    </html>
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/volunteer.html������������������������������������������������������������������0000644�0001750�0001750�00000013076�12143164240�017021� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Volunteers</title>
        <link rel="stylesheet" type="text/css" href="css/common.css" />
        <link rel="stylesheet" type="text/css" href="css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="css/_print.css" media="print" />
      </head>
      <body>
    	<script type="text/javascript">prefix='';</script>
    
      <script src="templates/header.js" type="text/javascript"></script>
      <div id="left">
        <noscript>Please turn on Javascript to view this menu</noscript>
        <script src="templates/left.js" type="text/javascript"></script>
      </div>
      
      <div id="content">
      
        <h2>Call for volunteers</h2>
    
        <p>We are looking for volunteers in the following areas.</p>
    
        <ol>
          <li><span class="label">top priority</span> <b>logback in 10 minutes</b> 
          
          <p>We are looking for a volunteer, preferably a native English
          speaker, to write a short document describing logback for
          beginners, entitled say "logback in 10 minutes". This document
          is likely to be the most widely read document of the
          project. Writing such a document is an excellent opportunity to
          learn logback. Obviously, there would be plenty of editorial
          help and guidance coming from the logback developers.
          </p>
          </li>
    
          <li><span class="label">high priority</span> <b>Proof reading the documentation</b>
          <p>We are always looking for volunteers to proof-read the
          documentation. Suggestions as to the design and look-and-feel of
          the site are also welcome.</p>
          </li>
    
          <li><span class="label">medium priority</span> <b>Decoder:
          parse log files and transform them into logging events</b>
          
          <p>This effort has been started under the <a
          href="https://github.com/qos-ch/logback-decoder">logback-decoder</a>
          project but has stalled. This problem is technically
          interesting, has a well-defined scope and mostly independent of
          the logback framework.
          </p>
          
          </li>
    
          <li><span class="label">medium priority</span> <b>Maintain the
          groovy configurator</b>
    
          <p>The Groovy configurator, aka Gaffer, although pretty cool, is
          not getting the attention it deserves. The amount of code
          involved, altough not completely trivial, is far from
          insurmountable. We are looking for a volunteer to take over
          Gaffer.
           </p>
          </li>
    
          <li><b>Improve OSGi support</b>
          
          <p>We are looking for an OSGi expert to review our current
          practices and improve OSGi support in logback.  </p></li>
          
          <li><b>Fixing bugs</b>
    
          <p>We are looking for volunteers for fixing logback
          bugs. Volunteering to solve bugs is a good way to learn about
          any project.
          </p> 
    
          <p>For those looking for highly technical challenges with
          limited scope, have a look at various build failures observable
          on <a href="http://logback.qos.ch/jenkins/">our Jenkins
          instance</a>.
          </p>
    
          <p>Our build is quite stable but failures occur from time to
          time on our Jenkins instance hosted on a relatively old
          computer.</p>
    
          <ul>
    
            <li><a
            href="http://logback.qos.ch/jenkins/job/logback/149/">build
            #149</a> with test faulure in <a
            href="http://logback.qos.ch/jenkins/job/logback/ch.qos.logback$logback-classic/149/testReport/junit/ch.qos.logback.classic.joran/JoranConfiguratorTest/levelChangePropagator1/">JoranConfiguratorTest.levelChangePropagator1</a>
            probable cause: parallel execution, j.u.l. shared-state
            overridden by levelChangePropagator0 while levelChangePropagator1 is running
            </li>
    
            <li><a
            href="http://logback.qos.ch/jenkins/job/logback/298/">build
            #298</a> with test faulure in <a
            href="http://logback.qos.ch/jenkins/job/logback/ch.qos.logback$logback-core/298/testReport/junit/ch.qos.logback.core/AsyncAppenderBaseTest/workerShouldStopEvenIfInterruptExceptionConsumedWithinSubappender/">AsyncAppenderBaseTest</a>
            probable cause: race condition
            </li>
    
    
            <li><a
            href="http://logback.qos.ch/jenkins/job/logback/91/">build
            #91</a> with test faulure in <a
            href="http://logback.qos.ch/jenkins/job/logback/ch.qos.logback$logback-classic/91/testReport/junit/ch.qos.logback.classic.net/SMTPAppender_GreenTest/testMultipleTo/">SMTPAppender_GreenTest</a>
            probable cause: race condition, GreenMail server not running
            at time of message transmission</li>
    
    
          </ul>
    
          <p>These build failures are quite hard to reproduce. If you
          intend to work on these problems, you will probably first need
          to make changes to logback code so that the problem becomes
          easily reproducible. One the problem is identified and
          reproducible, solving it should be much easier.
          </p>
    
        <h3>Setting up the project</h3>
        
        <p>If you wish to contribute to the project or just hack for fun,
        you will probably want to import logback as a project into your
        favorite IDE. See the instructions for <a
        href="setup.html#ide">building logback in Eclipse or IntelliJ
        IDEA</a> for details.</p>
    
        <script src="templates/footer.js" type="text/javascript"></script>
      </div>
      </body>
    </html>������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/bugreport.html������������������������������������������������������������������0000644�0001750�0001750�00000006337�12143164237�017017� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Bug report</title>
        <link rel="stylesheet" type="text/css" href="css/common.css" />
        <link rel="stylesheet" type="text/css" href="css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="css/_print.css" media="print" />
      </head>
      <body>
        <script type="text/javascript">prefix='';</script>
    
        <script src="templates/header.js" type="text/javascript"></script>
        <div id="left">
          <script src="templates/left.js" type="text/javascript"></script>
        </div>
        <div id="content">
    	
    	
    	
    	
        <h2>Before you report a bug</h2>
    
        <p>The logback community consists of those who use logback and its
        modules, help answer questions on discussions lists, contribute
        documentation and patches, and those who develop and maintain its
        code. Those who assist on a day to day basis resolving
        bug reports do this for a wide variety of reasons, and almost all
        of them do this on their own time.</p>
    
        <p>Many bugs reported end up not being a bug in logback, but are
        due to misconfiguration, problems caused by installed
        applications, the operating system, etc.
        </p>
    
        <p>Before reporting a bug please make every effort to resolve the
        problem yourself.  Just reporting a bug will not fix it. A good
        bug report includes a detailed description of the problem and a
        succinct test case which can reproduce the problem.
        </p>
    
        <h3>Review the documentation</h3>
        
        <p>Review the documentation for the version of component you are
        using.  The problem you are having may already be addressed in the
        docs.
        </p>
    
        <h3>Search the mailing list archives</h3>
        
        <p>It is very likely you are not the first to run into a problem.
        Others may have already found a solution.  Our various mailing lists
        are likely to have discussed this problem before.
        </p>
        
        <h3>Search JIRA</h3>
        
        <p>Please search the bug database to see if the bug you are seeing
        has already been reported.  The bug may have already been fixed
        and is available in a later version.  If someone else has reported
        the same bug, you could add supporting information to help
        reproduce and resolve the bug.
        </p>
        
        <ul>
          <li><a href="http://jira.qos.ch/secure/IssueNavigator.jspa">Search
          for logback bugs</a></li>
        </ul>
        
        <h3>Reporting a bug</h3>
        
        <p>Only after you have exhausted the aforementioned steps, should
        you file a formal report in JIRA, our bug tracking system.
        </p>
    
        <p>Please make sure you provide as much information as possible.
        It is hard to fix a bug if the person looking into the problem
        cannot reproduce it.
        </p>
        
        <ul>
          <li><a
          href="http://jira.qos.ch/secure/CreateIssue!default.jspa">Report
          new logback bug</a></li>
        </ul>
        
        <script src="templates/footer.js" type="text/javascript"></script>
    </div>
    </body>
    </html>
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/codes.html����������������������������������������������������������������������0000644�0001750�0001750�00000055775�12143164237�016115� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Logback Error Codes</title>
    
        <link rel="stylesheet" type="text/css" href="css/common.css" />
        <link rel="stylesheet" type="text/css" href="css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="css/_print.css" media="print" />
        <link rel="stylesheet" type="text/css" href="css/prettify.css" />
        <style type="text/css">
          h3.doAnchor {
            border-top: 2px solid #888888;
            /*color: #333;*/
            padding-bottom: 1ex;
            padding-top: 1ex;
          }
        </style>
      </head>
      
      <body  onload="prettyPrint(); decorate();">
        <script type="text/javascript" src="js/prettify.js"></script>
        <script type="text/javascript">prefix='';</script>
        <script type="text/javascript" src="templates/header.js"></script>
        <script type="text/javascript" src="js/jquery-min.js"></script>
        <script type="text/javascript" src="js/decorator.js"></script>
        
    
      <div id="left">
        <script src="templates/left.js" type="text/javascript"></script>
      </div>
      <div id="content">
        
      <h2><a name="top">Logback error messages and their meanings</a></h2>
      
    
      <h3 class="doAnchor" name="null_CS">The contextSelector cannot be
      null in <code>StaticLoggerBinder</code>.  
      </h3>
    
      <p>An <code>IllegalStateException</code> is thrown when no
      ContextSelector could be set for logback's
      <code>StaticLoggerBinder</code>. In principle, this error can only
      occur when the context selector is expressly specified by the user,
      and when that context selector cannot not be instantiated correctly.
      </p>
    
      <p>It should not happen when you are using the default or JNDI
      context selectors.
      </p>
      
    
      <!-- =========================================================== -->
      <h3 class="doAnchor" name="layoutInsteadOfEncoder">This appender no
      longer admits a layout as a sub-component, set an encoder instead.
      </h3>
    
      <p>As of logback version 0.9.19, the <code>WriterAppender</code>
      class has been renamed as <code>OutputStreamAppender</code>, with
      <code>FileAppender</code> now sub-classing the
      latter. <code>OutputStreamAppender</code> and sub-classes now take
      an <code>Encoder</code> as a sub-component instead of a
      <code>Layout</code>.
      </p>
    
      <p>In practical terms, this means that configuration files need to
      be changed</p>
      
      <p class="red bold">from (DEPRECATED)</p>
      
      <pre class="prettyprint source">&lt;appender name="FILE" class="ch.qos.logback.core.FileAppender">
      &lt;file>testFile.log&lt;/file>
      ...
      &lt;layout class="ch.qos.logback.classic.PatternLayout">
        &lt;pattern>%msg%n&lt;/pattern>
      &lt;/layout>
    &lt;/appender>   </pre>
    
      <p class="red bold">or the shorter equivalent (DEPRECATED)</p>
    
      <pre class="prettyprint source">&lt;appender name="FILE" class="ch.qos.logback.core.FileAppender">
      &lt;file>testFile.log&lt;/file>
      ...
      &lt;!-- layout are assigned the type ch.qos.logback.classic.PatternLayout by default -->
      &lt;layout>
        &lt;pattern>%msg%n&lt;/pattern>
      &lt;/layout>
    &lt;/appender>   </pre>
    
    
      <p class="green bold">to (GOOD)</p>
        <pre class="prettyprint source">&lt;appender name="FILE" class="ch.qos.logback.core.FileAppender">
      &lt;file>testFile.log&lt;/file>
      ...
      &lt;encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        &lt;pattern>%msg%n&lt;/pattern>
      &lt;/encoder>
    &lt;/appender>   </pre>
     
      <p class="green bold">or the shorter equivalent (GOOD)</p>
    
       <pre class="prettyprint source">&lt;appender name="FILE" class="ch.qos.logback.core.FileAppender">
      &lt;file>testFile.log&lt;/file>
      ...
      &lt;!-- encoders are assigned the type 
           ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
      &lt;encoder>
        &lt;pattern>%msg%n&lt;/pattern>
      &lt;/encoder>
    &lt;/appender>   </pre>
    
    
      <p>For layout type other than <code>PatternLayout</code>, for
      example <code>HTMLLayout</code>, your configuration files need to be
      changed
      </p>
    
      <p class="red bold">from (DEPRECATED)</p>
    
      <pre class="prettyprint source">&lt;appender name="FILE" class="ch.qos.logback.core.FileAppender">
      &lt;file>testFile.log&lt;/file>
      ...
      &lt;layout class="ch.qos.logback.classic.html.HTMLLayout">
        &lt;pattern>%msg%n&lt;/pattern>
      &lt;/layout>
    &lt;/appender> </pre>
    
    
      <p class="green bold">to (GOOD)</p>
        <pre class="prettyprint source">&lt;appender name="FILE" class="ch.qos.logback.core.FileAppender">
      &lt;file>testFile.log&lt;/file>
      ...
      &lt;encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
        &lt;layout class="ch.qos.logback.classic.html.HTMLLayout">
          &lt;pattern>%msg%n&lt;/pattern>
        &lt;/layout>
      &lt;/encoder>
    &lt;/appender> </pre>
      
      
    
      <p>We hope to make up for this inconvenience with cool new features
      which are only possible using encoders. <b>During a transition
      period, layouts passed as parameter will be automatically wrapped by
      an encoder so that configuration files in the old format (using a
      layout instead of encoder) will continue to work unmodified.</b>
      </p>
    
      
      
    
      <!-- =========================================================== -->
    
      <h3 class="doAnchor" name="socket_no_host">No remote host or address
      is set for <code>SocketAppender</code>
        
      </h3>
    
      <p>A remote host or address is mandatory for SocketAppender. </p>
      <p>You can specify the remote host in the configuration file
      as follows.
      </p>
      
      <pre class="prettyprint source">&lt;appender name="SOCKET"
      class="ch.qos.logback.classic.net.SocketAppender">
      ...
      &lt;remoteHost>127.0.0.1&lt;/remoteHost>
      ...
    &lt;/appender&gt;</pre>
    
    
      
    
      <!-- ============================================================= -->
    
      <h3 class="doAnchor" name="socket_no_port">No remote port is set for
      <code>SocketAppender</code>    
      </h3>
        
      <p>A remote port is mandatory for SocketAppender.</p>
          
      <p>You can specify the remote port in the configuration file
      like this:
      </p>
          
      <pre class="prettyprint source">&lt;appender name="SOCKET" class=&quot;ch.qos.logback.classic.net.SocketAppender&quot;&gt;
      ...
      &lt;port>4560&lt;/port>
      ...
    &lt;/appender&gt;</pre>
    				
    
    
      
    
      <!-- ============================================================= -->
    
      <h3 class="doAnchor" name="smtp_no_layout">No <code>Layout</code> is
      set for SMTPAppender
      </h3>
    
      <p>A <code>Layout</code> is mandatory for
      <code>SMTPAppender</code>. It allows SMTPAppender to format logging
      events before sending an email.
      </p>
          
      <p>You can specify the <code>Layout</code> in a configuration file
      as follows:
      </p>
          
      <pre class="prettyprint source">&lt;appender name=&quot;SMTP&quot; class=&quot;ch.qos.logback.classic.net.SMTPAppender&quot;&gt;
      ...
      &lt;layout class=&quot;ch.qos.logback.classic.PatternLayout&quot;&gt;
        &lt;pattern>%date [%thread] %-5level %logger - %msg%n&quot;&gt;&lt;/pattern>
      &lt;/layout&gt;
      ...
    &lt;/appender&gt;</pre>
          
      <p>SMTPAppender is known to work well with <a
      href="manual/layouts.html#ClassicPatternLayout">PatternLayout</a>
      and <a
      href="manual/layouts.html#ClassicHTMLLayout">HTMLLayout</a>.
      </p>
    
    
      
          
      <!-- ============================================================= -->
    
      <h3 class="doAnchor" name="sbtp_size_format">Specified number is not
      in proper int form, or not expected format.    
      </h3>
        
      <p>When you specify the MaxFileSize to be used by the
      SizeBasedRollingPolicy, logback expects a rather precise
      format:
      </p>
      
      <ul>
        <li>The number has to be an integer</li>
        <li>You can add 'KB', 'MB' or 'GB' after the number.
        </li>
      </ul>
          
      <p>Here are some correct values: 500KB, 15MB, 2GB.</p>
      
      
          
      <!-- ============================================================= -->
    
      <h3 class="doAnchor" name="rfa_no_tp">No
      <code>TriggeringPolicy</code> was set for the
      <code>RollingFileAppender</code>.
        
      </h3>
        
      <p>The <code>RollingFileAppender</code> must be set up with a
      <code>TriggeringPolicy</code>. It permits the Appender to know when
      the rollover must be activated.
      </p>
      
      <p>To find more information about <code>TriggeringPolicy</code>
      objects, please read the following javadocs:
      </p>
      
      <ul>
        <li>
          <a
           href="manual/appenders.html#SizeBasedTriggeringPolicy"><code>SizeBasedTriggeringPolicy</code>
          </a>
        </li>
        <li>
          <a
          href="manual/appenders.html#TimeBasedRollingPolicy"><code>TimeBasedRollingPolicy</code>
          </a>
        </li>
      </ul>
      
      <p>Please note that the <code>TimeBasedRollingPolicy</code>
      is a TriggeringPolicy <em>and</em> and
      <code>RollingPolicy</code> at the same time.
      </p>
          
      
          
      <!-- ============================================================= -->
    
      <h3 class="doAnchor" name="rfa_no_rp">No <code>RollingPolicy</code>
      was set for the <code>RollingFileAppender</code>.    
      </h3>
      
      <p>The <code>RollingFileAppender</code> must be set up with
      a <code>RollingPolicy</code>. It permits the Appender to
      know what to do when a rollover is requested.
      </p>
        
      <p>To find more information about <code>RollingPolicy</code>
      objects, please read the following javadocs:
      </p>
        
      <ul>
        <li>
          <a href="apidocs/ch/qos/logback/core/rolling/FixedWindowRollingPolicy.html">
            <code>FixedWindowRollingPolicy</code>
          </a>
        </li>
        <li>
          <a href="apidocs/ch/qos/logback/core/rolling/TimeBasedRollingPolicy.html">
            <code>TimeBasedRollingPolicy</code>
          </a>
        </li>
      </ul>
      
      <p>Please note that the <code>TimeBasedRollingPolicy</code> is a
      <code>TriggeringPolicy</code> <em>and</em> and RollingPolicy at
      the same time.
      </p>
      
      
      
    
      <!-- ============================================================= -->
      <h3 class="doAnchor" name="tbr_fnp_not_set">The <span
      class="option">FileNamePattern</span> property is mandatory for both
      <code>TimeBasedRollingPolicy</code> and
      <code>FixedWindowRollingPolicy</code>.    
      </h3>
    
      
      <p>The <span class="option">FileNamePattern</span> property for both
      <code>TimeBasedRollingPolicy</code> and
      <code>FixedWindowRollingPolicy</code> is mandatory.
      </p>
      
      <p>Please refer to the documentation of <a
      href="manual/appenders.html#TimeBasedRollingPolicy">TimeBasedRollingPolicy</a>
      and <a
      href="manual/appenders.html#FixedWindowRollingPolicy">FixedWindowRollingPolicy</a> for
      examples.
      </p>
    
    
      
    
      <!-- ============================================================= -->
      <h3 class="doAnchor" name="rfa_file_after">The <span
      class="option">File</span> property must be set before any rolling
      policy or triggering policy.
        
      </h3>
    
      <p>The <span class="option">File</span> property, if present, must
      be placed before any rolling policy or triggering policy. Thus, in a
      configuration file, the <span class="option">File</span> property,
      if present, must be declared declared before any rolling policy or
      triggering policy declarations.
      </p>
    
      <!-- ============================================================= -->  
    
      <h3 class="doAnchor" name="rfa_collision"><span
      class="option">File</span> property collides with <span
      class="option">fileNamePattern</span>. Aborting.
      </h3>
    
      <p>When the <span class="option">file</span> property matches the
      regular expression defined by <span
      class="option">fileNamePattern</span>, there is a risk of
      collison. A collision occurs when the active log file as defined by
      the <span class="option">file</span> property has the same path as
      an existing log archive. Such a collision will result in the log
      archive being overwritten.
      </p>
    
      <p>As such, in case <span class="option">file</span> property
      matches the regular expression defined by <span
      class="option">fileNamePattern</span>, in order to avoid data loss,
      <code>RollingFileAppender</code> will emit an error message and
      refuse to start.</p>
    
      <!-- ============================================================= -->
      <h3 class="doAnchor" name="renamingError">Failed to rename file [x]
      as [y].</h3>
    
      <b>On Windows</b>
    
      <p>On certain platforms, e.g. Windows, a log file cannot be renamed
      if there are handles referencing it. For example, when the file is
      read by another process such as <code>less</code>,
      <code>tail</code>, etc. During application hot-redeployment, the old
      instance of the application will have open references to log files
      until the old instance is completely shutdown or until the
      <code>stop()</code> method on its <a
      href="apidocs/ch/qos/logback/classic/LoggerContext.html"><code>LoggerContext</code></a>
      is invoked.
      </p>
    
      <p>On the Windows platform, <a
      href="http://technet.microsoft.com/en-us/sysinternals/bb896653">Process
      Explorer</a> can help you locate the processes which reference a
      given file (Find -&gt; Find Handle or DLL). On Linux, you can use
      the <code><a href="http://www.manpagez.com/man/8/lsof/">lsof </a>
      <em>pathToFile</em></code> command to find which process has the
      file given by <em>pathToFile</em> open. </p>
    
      <p>In practice, it can be hard to ensure that there are no file
      handle references to log files. It can be easier to avoid file
      renaming altogether. As a first step, let us note that for
      <code>TimeBasedRollingPolicy</code>, the <span
      class="option">file</span> option can be omitted. If omitted, no
      file renaming will be performed during roll over. Thus, in order to
      avoid file renaming errors just leave blank the <span
      class="option">file</span> option of
      <code>RollingFileAppender</code>, as shown in the next configuration
      snippet.
      </p>
    
      <pre class="prettyprint source">&lt;appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
      &lt;!-- <span class="option">file</span> option left unset/blank -->
      &lt;rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        &lt;fileNamePattern>mylog.%d{yyyy-MM-dd}.log&lt;/fileNamePattern>
      &lt;/rollingPolicy>
    
      &lt;encoder>
        &lt;pattern>%relative [%thread] %level %logger - %msg%n&lt;/pattern>
      &lt;/encoder>
    &lt;/appender></pre>
    
       <p>Note that for <code>FixedWindowRollingPolicy</code>, the <span
       class="option">file</span> property is mandatory.
       </p>
     
       <h4 class="doAnchor" name="renamingErrorOnUnix">On Unix-*</h4>
      
       <p>On the Unix flatform, the basic/quick rename method supplied by
       the JDK does not work if the source and target files are located on
       different file systems. In order to deal with this contingency,
       logback will resort to renaming by copying if all following three
       conditions are met:</p>
    
       <ol>
         <li>quick renaming fails, </li>
         <li>source and destination files for the rename are on different
         file systems,
         </li>
    
         <li>the host JVM platform runs Java 7 or later.</li>
       </ol>
    
       <p>The code for determining the file system of a file requires Java
       7. No rename by copying will be performed on Java 6 or earlier.</p>
       
    
      <!-- ============================================================= -->
      <h3 class="doAnchor" name="fwrp_parentFileName_not_set">The <span
      class="option">File</span> property must be set before
      <code>FixedWindowRollingPolicy</code>    
      </h3>
    
      <p>The <span class="option">File</span> property is mandatory with
      <code>FixedWindowRollingPolicy</code>. Moreover, the <span
      class="option">File</span> option must be set before the
      <code>FixedWindowRollingPolicy</code> element.
      </p>
          
      <p>Refer to the logback manual on
      <a href="manual/appenders.html#FixedWindowRollingPolicy">
        FixedWindowRollingPolicy </a> for more information.
      </p>
    			
      
      <!-- ============================================================= -->
      <h3 class="doAnchor" name="tbr_fnp_prudent_unsupported">Prudent mode
      is not supported with <code>FixedWindowRollingPolicy</code>.
      </h3>
    
      <p>Given that <code>FixedWindowRollingPolicy</code> performs
      multiple file rename operations during roll over, and that these
      operations cannot be guaranteed to be safe in a multi-JVM context,
      prudent mode is not allowed in conjunction with a
      <code>FixedWindowRollingPolicy</code>.
      </p>
    
      
      
      <!-- ============================================================= -->
      <h3 class="doAnchor" name="syslog_layout">SyslogAppender does not
      admit a layout.
      </h3>
    
    
      <p>Given that the format of a syslog request follows strict rules,
      you cannot freely specify the layout to be used with
      SyslogAppender. However, you can use <span
      class="option">SuffixPattern</span> option instead to influence the
      contents of the message sent to the syslog daemon.
      </p>
      
      <p>For more information on SyslogAppender please refer to the <a
      href="manual/appenders.html#SyslogAppender">its documentation.</a>
      </p>
    
      
    
      <!-- ============================================================= -->
      <h3 class="doAnchor" name="1andOnly1">Only and only one appender can
      be nested the &lt;sift> element in
      <code>SiftingAppender</code>.</h3>
      
      <p>SiftingAppender admits one and only one nested appender. 
      </p>
      
    
      <!-- ============================================================= -->
      <h3 class="doAnchor" name="ifJanino">Could not find Janino library
      on the class path. Skipping conditional processing.
      </h3>
      
      <p><a href="manual/configuration.html#conditional">Conditional
      processing</a> in configuration files requires the <a
      href="http://docs.codehaus.org/display/JANINO/Home">Janino
      library</a>.  See the <a href="setup.html#janino">setup
      instructions</a> for adding Janino to your class path.
      </p>
    
      <!-- ============================================================= -->
      <h3 class="doAnchor" name="block">As of logback version 0.9.28,
      JaninoEventEvaluator expects Java blocks.
      </h3>
    
      <p>As of logback version 0.9.28, JaninoEvaluator expects Java
      "block", i.e. the body of a method. In previous versions only
      boolean expressions were allowed. For backward compatibility
      reasons, whenever logback sees a boolean expression it will attempt
      to convert it to a block by prefixing the expression with "return"
      and suffixing it with a semicolon.
      </p>
    
      <p>Boolean expressions can quickly become hairy. For example, the
      following boolean expression is rather difficult to grok.
    </p>
    
      <pre class="prettyprint source"> !logger.startsWith("org.apache.http")
      ||
      ( logger.equals("org.apache.http.wire")  &amp;&amp;
           (mdc != null &amp;&amp; mdc.get("entity") != null
             &amp;&amp;
           ((String) mdc.get("entity")).contains("someSpecialValue"))
           &amp;&amp;
         !message.contains("someSecret")
      )</pre>
    
      <p>whereas as its Java block equivalent is considerably easier to
      follow.</p>
    
    <pre class="prettyprint source">if(logger.startsWith("org.apache.http"))
      return true;
    
    if(mdc == null || mdc.get("entity") == null)
      return false;
    
    String payee = (String) mdc.get("entity");
    
    if(logger.equals("org.apache.http.wire") &amp;&amp;
      payee.contains("someSpecialValue") &amp;&amp;
      !message.contains("someSecret")) {
      return true;
    }
    
    return false;</pre>
    
       <p>
       </p>
       
       <!-- ============================================================= -->
       <h3 class="doAnchor" name="missingRightParenthesis">In a conversion
       pattern, opened parenthesis must be closed.
       </h3>
       
       <p>In conversion patterns, <a
       href="manual/layouts.html#Parentheses">parentheses are special</a>
       because they are treated as grouping tokens. If a parenthesis
       character needs to be viewed as a literal, it needs to be escaped
       by preceding each parenthesis with a backslash. As in,
       <b>\(</b>%d{HH:mm:ss.SSS} [%thread]<b>\) </b>.
       </p>
      
    
       <!-- ============================================================= -->
       <h3 class="doAnchor" name="appender_order">Appenders must be
       definied before they are referenced.
       </h3>
       
       <p>In a configuration file, at the point where an appender is
       referenced by name, it must be defined earlier in the configuration
       file. Referencing an appender defined later in the file is not
       allowed. Below are examples of correct and incorrect order of
       definition and referece.
       </p>
    
    
      <p>Below is an example of a correct ordering, where appender
      definition precedes references made to it.
      </p>
    
      <p class="green bold">CORRECT ORDER</p>
      <pre class="prettyprint source">&lt;configuration>
      <b>&lt;!-- definition of appender STDOUT --></b>
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        &lt;encoder>
          &lt;pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;!-- appender referenced after it is defined -->
        <b class="big">&lt;appender-ref ref="STDOUT"/></b>
      &lt;/root> 
    &lt;/configuration></pre>
    
      <p>Below is an example of an incorrect ordering, where appender
      definition follows references made to it.
      </p>
    
       <p class="red bold">INCORRECT ORDER</p>
       <pre class="prettyprint source">&lt;configuration>
      &lt;root level="DEBUG">
        &lt;!-- appender INCORRECTLY referenced before it is defined -->
        <b class="big">&lt;appender-ref ref="STDOUT"/></b>
      &lt;/root>
    
      <b>&lt;!-- definition of appender STDOUT --></b>
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        &lt;encoder>
          &lt;pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    &lt;/configuration>
       </pre>
    
      <!-- =========================================================== -->
    
      <h3 class="doAnchor" name="remote_no_host">No remote host or address
      is set for <code>SocketRemote</code>
        
      </h3>
    
      <p>A remote host or address is mandatory for SocketRemote. </p>
      <p>You can specify the remote host in the configuration file
      as follows.
      </p>
      
      <pre class="prettyprint source">&lt;remote class="ch.qos.logback.classic.net.SocketRemote">
      ...
      &lt;host>127.0.0.1&lt;/host>
      ...
    &lt;/remote&gt;</pre>
    
    
      
    
      <!-- ============================================================= -->
    
      <h3 class="doAnchor" name="socket_no_port">No remote port is set for
      <code>SocketRemote</code>    
      </h3>
        
      <p>A remote port is mandatory for SocketRemote.</p>
          
      <p>You can specify the remote port in the configuration file
      like this:
      </p>
          
      <pre class="prettyprint source">&lt;remote class=&quot;ch.qos.logback.classic.net.SocketRemote&quot;&gt;
      ...
      &lt;port>4560&lt;/port>
      ...
    &lt;/remote&gt;</pre>
            
    
    
      <script src="templates/footer.js" type="text/javascript"></script>
      </div>
    </body>
    </html>
    ���logback_1.0.13/docs/demo.html�����������������������������������������������������������������������0000644�0001750�0001750�00000050505�12143164237�015726� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Logback Demo</title>
        <link rel="stylesheet" type="text/css" href="css/common.css" />
        <link rel="stylesheet" type="text/css" href="css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="css/_print.css" media="print" />
      </head>
      <body>
        <script type="text/javascript">prefix=''; </script>
    
        <script src="templates/header.js" type="text/javascript"></script>
        <div id="left">
          <script src="templates/left.js" type="text/javascript"></script>
        </div>
        <div id="content">
          
    	
        <h2>Logback Demo</h2>
    
        <p>Welcome to the logback demo! This document will take you through
        a tour of some of logback's major features.
        </p>
        
        <h3>Installation</h3>
    
        <p> First, please download the logback demo. You will need to
        install a <a href="http://git-scm.com/">git</a>
        client and issue the following command on a console:
        </p>
      
        <p class="source">git clone git://github.com/qos-ch/logback-demo.git logback-demo</p>
    
        <p>This will retrieve a copy of the logback demonstration
        web-application to a directory called <em>logback-demo</em>. The
        logback demo can be packaged as a <em>war</em> file and deployed
        to an application server. We strongly recommend the use of <a
        href="http://maven.apache.org/">Maven</a> to accomplish this task,
        since it takes a single command in order to compile, package and
        run this demo.
        </p>
    
        <p>	Using Maven, let's package the files and run the demo for the first
        time.  From the <em>logback-demo</em> directory, issue the following
        command:
        </p>
    
        <div class="source"><pre>mvn package jetty:run</pre></div>
        
        <p>Then, visit <a
        href="http://localhost:8080/">http://localhost:8080/</a>
        to view the main page of the logback demo.
        </p>
    
        <h3>Logback-classic</h3>
    
        <p>By default (or as packaged), logback-demo configures
        logback-classic with two appenders: a <code>ConsoleAppender</code>
        and a <code>RollingFileAppender</code>. The
        <code>RollingFileAppender</code> sends logging events to a file
        called <em>logFile.log</em> and will rollover the active file
        every minute. The old file will be renamed and compressed to a
        <em>zip</em> file. The <code>ConsoleAppender</code> will output
        the logging requests to the console, and shorten the logger names
        to gain space on the console window, without loss of
        legibility. For example,
        <code>ch.qos.logback.demo.prime.NumberCruncherImpl </code> will be
        abbreviated as <code>c.q.l.d.prime.NumberCruncherImpl</code>.
        </p>
    
      <p>We highly encourage you to study the <em>logback.xml</em>
      configuration file located under the <em>src/main/resources/</em>
      folder. You might want to keep this file open in an editor window,
      since we will modify its contents throughout the demo.
      </p>
    
      <p>Let us now visit the <em>ViewStatii</em> page, via the navigation
      menu on the left hand side of your browser's window. This page
      contains the content of the <code>Status</code> objects that were
      created up until now. <code>Status</code> objects are a part of
      logback's internal reporting framework. They allow you to see what
      is going on inside logback, and check that a configuration file has
      been parsed correctly, or that rollovers occur as expected.
      </p>
    
      <p>You should be seeing log messages printed on the console and the
      contents of "logFile.log" file rolled over every minute.
      </p>
    
      <p>If you visit the <em>View logs</em> page (by clicking on the link
      located in the menu on the left), you should see it has no content. Let
      us change that by uncommenting <strong>two</strong> parts in the
      config file.</p>
    
      <p>Remove the comments around </p>
    
      <p class="source">&lt;!-- Basic Cyclic buffer
    &lt;appender name="CYCLIC" class="ch.qos.logback.core.read.CyclicBufferAppender">
      &lt;MaxSize>512&lt;/MaxSize>
    &lt;/appender>
    --&gt;</p>
      <p>and around</p>
    
      <p class="source">&lt;!-- Part I: Basic Cyclic buffer
    &lt;appender-ref ref="CYCLIC" />
    --&gt;</p>
    
      <p>The <code>&lt;appender-ref></code> element found at the
      end of the configuration file links an appender to a given logger,
      in this particular case the root logger.
      </p>
    
      <p>A <code>CyclicBuffer</code> keeps track of the incoming logging event
      stream in a <a
      href="http://en.wikipedia.org/wiki/Circular_buffer">circular
      buffer</a> for later display. After having removed the comments
      around the two element/s shown above, reload the logback-demo
      web-application by exiting the previous "mvn" command with
      <em>CTRL-C</em> and issuing it again:
      </p>
    
      <p class="source">mvn package  jetty:run</p>
    
      <p>This time the <em>View logs</em> page should have contents.</p>
    
      <img src="images/cyclicView.png" alt="view logs"/>
    
    
      <p>By virtue of <code>CyclicBufferAppender</code>, this page can
      fetch the last events and present them through a servlet. We see
      that every ten seconds a line is added to the logs. The formatting
      of this page is made with a <code>HTMLLayout</code>. This component
      creates a table containing logging events, based on a pattern that
      describes the information you wish to see in the table.
      </p>
    
      <p>Having the logs cluttered with repetitive
      <em>Howdydy-diddly-ho</em> messages is wasteful. We can get rid of
      them with an appropriate filter. Uncomment the block entitled
      <em>Cyclic buffer with Evaluator</em>. You should then comment the
      block entitled "Basic Cyclic buffer" that we uncommented
      earlier.</p>
    
      <p>Let's take a look at the filter we've just added: </p>
    
    <p class="source">&lt;filter class="ch.qos.logback.core.filter.EvaluatorFilter">
      &lt;evaluator name="loggingTaskEval">
        &lt;expression>
          <b>logger.getName().contains("LoggingTask") &amp;amp;&amp;amp;
          message.contains("Howdydy-diddly-ho") &amp;amp;&amp;amp;
          (timeStamp - event.getStartTime()) >= 20000</b>
        &lt;/expression>
      &lt;/evaluator>
      &lt;OnMatch>DENY&lt;/OnMatch>
    &lt;/filter></p>
    
      <p>The <code>&lt;expression></code> element uses the familiar
      Java language syntax. It checks that the name of the logger contains
      the String <em>LoggingTask</em>, but also that its message contains
      the string <em>Howdydy-diddly-ho</em>.  Moreover, in order to be
      sure that the <em>Howdydy-diddly-ho</em> task actually works, we add
      a last condition which checks that that at least 20 seconds have
      elapsed after application launch. The variable references in the
      expression, namely (<code>logger</code>, <code>message</code> and
      <code>event</code>) are implicitly made available by logback.  The
      <code>&lt;OnMatch></code> element lets the user specify the filter's
      behaviour once the expression matched (evaluated to true).
      </p>
    
      <p>After a restart, the <em>View logs</em> page will shows the
      <em>Howdydy-diddly-ho</em> logs, but only for the first 20
      seconds. If you wish to see new logging events to be shown on the
      "View logs" page, then visit the "Prime number" page.
      </p>
    
      <h4>Turbo Filters</h4>
    
      <p>Logback supports a special category of filters called
      TurboFilters.  <code>TurboFilter</code> objects are ultra-fast,
      context-wide filters. They can be very useful by setting
      context-wide (i.e. global) conditions for enabling or disabling
      logging events.
      </p>
    
      <p>Remove the comments around the block entitled "TurboFilter: MDC
      value".</p>
    
      <p class="source">&lt;turboFilter class="ch.qos.logback.classic.turbo.MDCFilter">
      &lt;MDCKey>username&lt;/MDCKey>
      &lt;Value>sebastien&lt;/Value>
      &lt;OnMatch>ACCEPT&lt;/OnMatch>
    &lt;/turboFilter></p>
    
    
      <p>This <code>&lt;turboFilter></code> element adds a
      <code>TurboFilter</code> to the logging context which will enable
      events if the MDC contains a key named "username" set to the value
      "sebastien". The logback-demo application contains a <a
      href="http://java.sun.com/products/servlet/Filters.html">servlet
      filter</a> which will set the MDC key "username" with the name of
      the currently logged in user.</p>
    
    
      <p>For the purpose of this demo, let us disable all logging by
      setting the root logger's level to <code>OFF</code>.
      </p>
    
      <p class="source">&lt;root>
      &lt;level <b>value="OFF"</b>/>
      ...
    &lt;/root></p>
    
      <p>Now restart the server as before.</p>
    
      <p>Once on the main demo webpage again, perform a number of actions
      (e.g. calculate a few prime numbers) and visit the <em>View
      logs</em> page. The table should be empty.
      </p>
    
      <p>Now login to the logback-demo web-application with the
      username <em>sebastien</em> and perform a few prime
      computations. The <em>View logs</em> page should show the logging
      events that were generated. Moreover, each logging event will have
      an MDC field associated with the name of the logged in user, in this
      case, sebastien. Please log off before continuing the demo, using
      the <em>logout</em> button on the left.
      </p>
    
     <img src="images/turboFilterForMDC.png" alt="mdc filters"/>
    
     <h4>Parameterized logging</h4>
    
     <p><a
     href="http://www.slf4j.org/faq.html#logging_performance">Parameterized
     logging </a> is not a logback feature per se. It is part of
     SLF4J. Usually, a logging request is issued as follows:
     </p>
    
    <div class="source"><pre>logger.debug("Hello, my name is" + username + ", I am " + age + " years old.");</pre></div>
    
      <p>In the above call, the cost of constructing the message of type
      String is borne even if the log request is disabled. 
      </p>
    
      <p>SLF4J offers the following alternative:
      </p>
    
    <div class="source"><pre>logger.debug("Hello, my name is {}, I am {} years old", username, age);</pre></div>
    
      <p>In this alternative, the final log message will be formatted only
      if the log statement is enabled.
      </p>
    
      <p>At present, let us see what kind of gain we can expect from this
      alternative approach. First, go to the <em>Prime number</em> page
      and compute factors for integers of your choice. Check the time it
      takes to compute the results. To see a clearer difference between
      the two formatting methods, you might want to try the two big
      integers that are listed below the prime number textbox. Jot down
      the time it takes to compute the result.
      </p>
    
      <p>Now let us edit the <code>NumberCruncherImpl</code> class in
      order to use parameterized logging.  You will find this class in the
      <em>src/main/java/ch/qos/logback/demo/prime/</em> directory. Comment
      line 54 (doing unconditional message concatenation) and uncomment
      line 55 (parameterized logging). Restart the server with <em>mvn
      package jetty:run</em> and re-run the factorization you tried
      beforehand.
      </p>
    
      <p>The time required to complete the computation should be much lower
      this time. Remember that we have turned off all logging in the
      previous step of this demo. In the initial version, we were
      constructing the message (<em>"Trying "+i+" as a factor."</em>) each
      time a factor was tested.  With the parameterized logging, the
      construction of the message was postponed and, since logging was
      turned off, never done. Thus, parameterized logging can
      significantly reduce the cost of disabled log statements.
      </p>
    
      <h4>Markers</h4>
    
      <p>You can color log statements with <em>markers</em>. Markers are
      part of the SLF4J API. If you look at the LoggingTask class (part of
      logback-demo) which includes the <em>Howdydy-diddly-ho</em> log
      statement, you should see that it is bound to a marker named
      <code>HOWDY</code> marker.  If you wish to drop log statements
      bearing the <code>HOWDY</code> marker, you can use this
      <code>TurboFilter</code> to do so:
      </p>
    
      <p class="source">&lt;turboFilter class="ch.qos.logback.classic.turbo.MarkerFilter">
        &lt;Name>HOWDY_FILTER&lt;/Name>
        &lt;Marker>HOWDY&lt;/Marker>
        &lt;OnMatch>DENY&lt;/OnMatch>
    &lt;/turboFilter> </p>
      
      <p>After you have set the root logger's level back to <em>DEBUG</em>
      and uncommented the MarkerFilter block in <em>logback.xml</em>,
      restart the server.
      </p>
    
    
      <p>The logs bearing the <em>Howdydy-diddly-ho</em> message should no
      longer appear as they are associated with a HOWDY marker. You can check
      that by visiting the <em>View Logs</em> page.
      </p>
    
      <h2>Logback Access</h2>
    
      <p>Access logging is another important feature offered by
      logback. By default, the logback-demo web-application is configured
      so that each time you access it, an access log is printed on the
      console. The details of access logs are configured by the
      <em>logback-access.xml</em> file located under the <em>src/etc/</em>
      directory.
      </p>
    
      <p>Here is a rather minimal configuration for logback-access:</p>
    
    <div class="source"><pre>&lt;configuration>
     
      &lt;appender name="STDOUT"
        class="ch.qos.logback.core.ConsoleAppender">
        &lt;layout class="ch.qos.logback.access.PatternLayout">
          &lt;Pattern>%h %l %u %t \"%r\" %s %b&lt;/Pattern>
        &lt;/layout>
      &lt;/appender>
      
      &lt;appender-ref ref="STDOUT" />
      
    &lt;/configuration></pre></div>
    
      <p>Note that logback-classic and logback-access are configured via
      different files: <em>logback.xml</em> and
      <em>logback-access.xml</em> respectively. If you wanted to turn
      off logging for logback-classic by setting the level of the root
      logger to OFF, logback-access would be unaffected by this change.
      </p>
    
      <p>To see the logs produced by logback-access, just visit a few
      pages and look at your console. The information contained in each
      line has been specified in the configuration file. The
      <code>ConsoleAppender</code> named <em>STDOUT</em> contains a
      <code>PatternLayout</code> component.  This layout component is
      used in logback-classic to display either the message, logger name
      or level of the request, but in logback-access it is used to display the
      request method, requested page, status code and many other fields.
      </p>
    
    <p>Here is a sample output for this appender.</p>
    
    <div class="source"><pre>127.0.0.1 - - 22/01/2007:14:35:40 +0100 GET /logback-demo/ViewStatii.do HTTP/1.1 200 3660
    127.0.0.1 - - 22/01/2007:14:35:41 +0100 GET /logback-demo/index.jsp HTTP/1.1 200 2389
    127.0.0.1 - - 22/01/2007:14:35:42 +0100 GET /logback-demo/lastLog/ HTTP/1.1 200 948
    127.0.0.1 - - 22/01/2007:14:35:42 +0100 GET /logback-demo/index.jsp HTTP/1.1 200 2389
    127.0.0.1 - - 22/01/2007:14:35:43 +0100 GET /logback-demo/prime.jsp HTTP/1.1 200 1296
    127.0.0.1 - - 22/01/2007:14:35:44 +0100 GET /logback-demo/index.jsp HTTP/1.1 200 2389
    127.0.0.1 - - 22/01/2007:14:35:45 +0100 GET /logback-demo/lottery.jsp HTTP/1.1 200 1209
    127.0.0.1 - - 22/01/2007:14:35:46 +0100 GET /logback-demo/index.jsp HTTP/1.1 200 2389
    127.0.0.1 - - 22/01/2007:14:35:48 +0100 GET /logback-demo/reload.jsp HTTP/1.1 200 1335
    127.0.0.1 - - 22/01/2007:14:35:49 +0100 GET /logback-demo/index.jsp HTTP/1.1 200 2389
    127.0.0.1 - - 22/01/2007:14:35:54 +0100 GET /logback-demo/login.jsp HTTP/1.1 200 1214
    127.0.0.1 - - 22/01/2007:14:35:55 +0100 GET /logback-demo/Logout.do HTTP/1.1 200 1000</pre></div>
    
      <h4>Filtering</h4>
    
      <p>In this next part, we are going to add some information to the
      console.  Let us imagine that we want to log the numbers that are
      tried on the <em>Lottery</em> page. We will need a second
      <code>ConsoleAppender</code> that will only print a given information
      (e.g. the guessed number, along with some hints about the player). The
      appender will also have to print that information only when a certain
      page is accessed.
      </p>
    
      <p>The necessary configuration lines are listed below.
      </p>
    
      <p class="source">&lt;appender name="STDOUT_LOTTERY"
      class="ch.qos.logback.core.ConsoleAppender">
      &lt;filter class="ch.qos.logback.core.filter.EvaluatorFilter">
        &lt;evaluator name="lotto_eval">
          &lt;Expression>
            url.matches(event.getRequestURL().toString())
          &lt;/Expression>
          &lt;matcher name="url">
            &lt;regex>Lottery.do&lt;/regex>
            &lt;caseSensitive>false&lt;/caseSensitive>
          &lt;/matcher>
        &lt;/evaluator>
        &lt;OnMatch>ACCEPT&lt;/OnMatch>
        &lt;OnMismatch>DENY&lt;/OnMismatch>
      &lt;/filter>
      &lt;layout class="ch.qos.logback.access.PatternLayout">
        &lt;Pattern>
          LOTTERY: %A [%r] Guess=%reqParameter{guessed_number}
        &lt;/Pattern>
      &lt;/layout>
    &lt;/appender></p>
    
      <p>This appender will use a <code>PatternLayout</code> to format its
      output.  The <em>%reqParameter</em> conversion word is used to
      extract the guessed number from the request, and print it.
      </p>
    
      <p>It also uses an <code>EvaluatorFilter</code> that will prevent
      the appender to display anything when the access' request url does
      not match the given expression. You can see that it is easy to
      specify a RegExp, name it and use it in the expression that will be
      evaluated. In that case, we only entered the name of the
      <em>lottery.do</em> action.
      </p>
    
      <p>Let us uncomment the two elements with the <em>Lottery to
      Console</em> comments and restart the server. Now, try to play the
      lottery. You will see more lines in the Console that you've seen until
      now. At every try, logback will produce a log as shown below:
      </p>
    
      <p class="source">LOTTERY: 192.168.1.6 [POST /logback-demo/Lottery.do HTTP/1.1] Guess=321</p>
    
      <h4>Sending emails</h4>
    
      <p>Logback-access provides several components that are usually used
      by the classic module. For example, a <code>SMTPAppender</code> can
      be used to send an email when a specific event occurs. Here, we will
      contact the lottery administrator each time a winner is detected. To
      achieve this, we will add a <code>SMTPAppender</code> to the
      existing configuration. Please uncomment the part of
      <em>logback-access.xml</em> named <em>Lottery to Email</em>. Do not
      forget to uncomment the <em>appender-ref</em> element at the end of
      the configuration file that references the <em>SMTP</em> appender.
      In the appender element, notice the use of a
      <code>URLEvaluator</code>. This evaluator allows us to specify
      one or more URLs that are to be watched. When one of them is
      accessed, an email is sent.
      </p>
    
      <p>A reload of the configuration has to be done before we can test
      this new component. Once done, try to play the lottery with the
      number <em>99</em>.  You should see a "congratulation" message but,
      most importantly, the specified recipients should have a new mail in
      their mailbox. The content of the email is a nicely formatted HTML
      table with information about the accesses that occurred before
      the triggering event.
      </p>
    
      <h3>JMX</h3>
    
      <p>Logback publishes several components via JMX. This allows you to
      see the status of certain objects, and change several configuration
      parameters.  Publishing logback's components via JMX is possible
      with Jetty and Tomcat. For more information about the JMXConfigurator
      please refer to the <a href="manual/jmxConfig.html">relevant
      chapter</a> in the manual.
      </p>
    
      <p>Let us test setting levels using the configurator.
      The <em>Prime Number</em> page requests two types of logs. When the
      calculation checks if a number is a factor, a <em>DEBUG</em> log is
      displayed. When the calculation has found a factor, a <em>INFO</em>
      log is displayed.
      </p>
    
      <p>Let us first set the level of the logger named
      <em>ch.qos.logback.demo.prime</em> to <em>DEBUG</em>. Run a prime
      calculation directly, without restarting the server. The <em>View
      logs</em> page should show the <em>DEBUG</em> and <em>INFO</em> logs.
      </p>
      
      <p>Now, if you set the level of the <em>ch.qos.logback.demo.prime</em>
      logger to <em>INFO</em>, and run a prime calculation again, you should
      not see the <em>DEBUG</em> level logs anymore.
      </p>
      
      <p>This demo of logback is now over. Do not hesitate to play around
      with the configuration files.  You might want to check the <a
      href="http://logback.qos.ch/documentation.html"> logback documentation
      page</a> for more information about any component you'd like to test.
      </p>
    	
      <script src="templates/footer.js" type="text/javascript"></script>
    </div>
    </body>
    </html>
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/images/�������������������������������������������������������������������������0000755�0001750�0001750�00000000000�12203357067�015356� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/images/icon_info_sml.gif��������������������������������������������������������0000644�0001750�0001750�00000001136�12143164146�020661� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a�������r	'SG]}]yVpOgLcJ`EYxCWtI^~FZyehgjlmpXltvdyw|~wunzw…ǘƂ˦ΩЭҬџ԰ӵָؼݲ@TpAUqy}ŞɧŹ���������������������������������������!��r�,�������r`fg`l\d
    LG^qqopnQmbj.MObhNgr\oP6[ig%dmE4k_^eL	PRahYcHBjfV<JD@>
    F`\-5Z=97D`]
    I'130@KICA@,"�c
    $XA ?tr兊!8h2†@Pab
    �;����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/images/collapsed.gif������������������������������������������������������������0000644�0001750�0001750�00000000065�12143164146�020011� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a����������!
    ��,�������D`c5
    �;���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/images/icon_success_sml.gif�����������������������������������������������������0000644�0001750�0001750�00000001736�12143164146�021404� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a�������Χμc~w˗éSq*/%(#8='*!37,/(CH'AF&>B/2*,)FI"!PrkjtŲFcO7G;ȝȣ֩۴߲2B.ᥳ⦷㫸䬸䭺导屏€㩲ࢲࣜΈޘܙٗۗ]B΅ԋۑ̈́՗]>Ԅሻfrmjb7Jw*U0W2im;Ag$r?o=e8f8b7Z2Y1S.Jt)Qy1WYuQeFcE{{hGv@u?k:h7`3Jr(E^3Q|,S~-Dh%}DEi&QŢIm&Qx+Ot)Mo(Ll&Ig%Gc$������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������!���,��������	HA!,XE
    aCF5pAƏ*01#"NT0�A=Y& 	NRI1bJ':o8b3-e˓у>|¥(qŋ4hԱ(ЋmT"J;*d("4lp	,P( �;����������������������������������logback_1.0.13/docs/images/expanded.gif�������������������������������������������������������������0000644�0001750�0001750�00000000064�12143164146�017632� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a����������!
    ��,�������j
    �;����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/images/plugin/������������������������������������������������������������������0000755�0001750�0001750�00000000000�12203357067�016654� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/images/plugin/filterWindow.gif��������������������������������������������������0000644�0001750�0001750�00000026547�12143164146�022033� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a��ѬꙙqkҾT[IpKKji㺼̼bdjcchaԉ䥤ǵY^{v"SGHL薶̺,/z{ȀzroVX]G]`ĺˣܵst{}}̄ެɦ9Dh˗KMP\^cff~^]=>�<t׼wwޱセΤiK|<UİV|^ſݴ %qlmsɶܷghnҷ~���!�����,������/觠*\ȰÇ#JHŋ3jȱƁ,(S\ɲ˗0cʜI͛8sɳϟ9
    h)/~@*eDӧPJJիXjʵׯ`ÊK,X#c4)&#ƎMqDݻx˷߿LÈ+^̘cz9ZGIӨϠCMӨS^ͺװc˞M4nC5Rȓ+_μsc 6vN(iνËOӫ_Ͼ箥ײ	;lֱQɀh&6F(VhfPň$: PlXŒ4h8<@)DiH&5P TN	eehɗ`)dihlp)tib:ÓUX%j!>=4
    F%F*餔Vj饘f馜v駠*ꨤ
    j+gE@*jʆd4z@k&*[@*RV[HBKq*ï�#+rkoA<B<l«p
    pWlgwT!_+R@!iK,ְ =ȌNDmtAI+]#b00#0<B/5ҏ\-tbl1-tmx|=1gPF<2&2ed-1�SN�+:CSt褗覧.zשO}'@-^n{娇^N/o'N9|P�d=:t>0!>$}A�  	{dBApǾ1o^챏j#	.8`vmal>}Ux�ɏ~ꋡgH8̡we!Ve8	8Qlܹ8�F$.]# G!#dž8Gȃ
    0p6"h#%@yk@a05<A	�F7._dDE:^&$4R>k|ҘJ6<񕰌,gIZN.w^0K.AW!z�O
    ҄XӚ|0״f©B| ~�euS`�TN>t-H
    `p &c;)rxBUA8IQ$(D+tZ^HGJҒ(MJWҖ'-IMKz@BلCMj.tUsXCz &!hMj=!%QM#>41!hP*T,45V̚.v#1׹g
    XVjuavxjׄ@ؠ	VgUJ:d'KZͬf7zcJX>N2U( !
    v @p+jCXBmo+QTCר?dAaU@\v-ASK]d<EDfwDGX!5.wKjk"(nפߠ7A{.N;'L
    [ΰ7SA
    T qe-Nkb4D
    qհ�C*!cp457�z-ۘ@І\=C~8\@]^0xMqצ|k�Ǫ?;:h3E=YHMBЈNF;ш.
    Tĩ#C¤c)d
    QbQuqdC
    
    O(@L;1LG<puR;6
    7lOF
    ji7]sƺ�~tc;ki�NONpIO	"#ik(\T QrkA
    )kuC\ake㮐?dWL!"C5x.@D0H],"Cԁ~u7opG�TL!JOE*&w}"{~o.OO;񐏼'O[@9%݀I{WA�r �`�^]�(��;O=};ЏO}ehC}777
    2SpX'S0_ȿs@PkXx
    ~"P؁ 8$X&xX~P}01e~7
    FFP
    `A<E@hLуNN݀"�XZ\؅^Y
    b8dXfH�Tmpnpr8gvxxz|؇~hB(<؈H	A8�`؉Ox`O�	8Xx؋8Xx8	8Xxؘڸ؍8XxȌ~	8Xx؏�9Yy`�9Yyّ "9$Y&yi	*,ْ*6y8:<ٓ>Bɒ0)~@@JLٔN69RY3ِPyXy_6ɕ^\)CIGiaj	`#ٖncI.iHx$	P_ٕz	~sIDUYɘ;9&ɗ&	%I٘!	)Yyٙٚə	鑤9 	IYiih9~iiٚYٜiֹ)ɜ99yy)iiיi橝y	өiiٟI"JZ
    
    *t)ʟ癞̹:*	j).ɚ(Z,J$
    _piw	Iʡ9H
    %'*.ZrCiG
    ڢ-*JZ9]ڟO:gKVz\h١^Z3Qڧu=꣨	ٙ9zڹ8lڦy9*䩞_zo:Zꨍ`: ʪ)SAꪸJڦꟲZZ:ZL)ڬ:Zzؚںڭ:z蚮Ю:Zzگ�;[
    ;[{۱ ";$[&{*,۲*2;446{Y:@\BD[eqVH۴NJ_RT;L[Zx\{^UPb{hdOl+n;o[vwkq˶{kyZi+h۷s{+Kt봍˵E{˹x~빁[ˉ[+[;{+s[ۻ;[{țʻۼ;Ի{bO˹K{;[
    ۴{j[ۿz˿;Q1Ua|,
    @KP뽐+l:7\L
    ;32(%K4\6|8:<{/|,C,.[ĦG)NJU|SW]܉RŵŮQbf|aƥKƛǚnvLuLkltuǀrܵ,Z\ȭ{F><ɔ\ɖ|ɘəƌŐ<yL̺l,YǣɅɜʃʌw˷ȩ,ʻxKlȲ츴ܾll,ό<Lܳƌl\͟˵y{dac1ÚïLΰΩ+L~lҬ|ϲ{�ڌ\+
    蜾<ў]߬ }|X1%ݽ$œ
    .-<>Ә6--=
    LӋ7Jm5\{T}"/lZMU-֪Lejf
    X_tvLyMqxF@؊،+Ԅlh
    ̑Mԁ
    ʃ}^lٜ]ƙѕ=ΡēѠ}ڈ<ڳڬmʞ
    ץϱٮҵϷdz]װ#}ܢgז܏&
    4؝ڽݖ
    
    r
    	YSc
    z
    mcߘ=�Ns]C{
    ^m^V-ػ$^&~.K~{1=
    +6~!:TV
    AXF8>Bn!TV[mM`P}W1>廋prjlh^]aIM|>wn3SX~|G{N-NARL.`
    =Nڦ~ꡛOmn:=纾뼾uߜÞN~쭞	e쓞5.~O/뮮ž>R]~W>ɿnӰ>^ݴ־]m+N-Oa~K>KE>"o$>/1Έ8:-+?OoEoGO&|ʎ IP_5?WYACcoe__OaOk/]߹t_v=ioOqo[?߁o?/}g3mܕ/o/ޥ#~8-KoĞ%'U?..>NNOɯޝ?ݏίЯǟ4.ߝ"NP$XA	.dC%NXEȏ@8WI)UdK1eΤYM9usA$QI.eSQNZUYnի@;~9Wiծe[q
    JYy_t5aĉ/V+Xh٢%O\r^v_7UڴiUeȍ	G]mOt�oEbΦ@FS1ʆwr&ם]{*}Wo@ʔSpv�ppBoA	5~
    1~F\DP35qEcqKDOJExDǣLү!uL WNI'JSC)RɶtJHRK%p4A35\ʣcsԲE=NL1D4A-P?<C,OC+4RBBPB'TQAAP4J+}?FIk=2I\<4W]oXk}UYOa]2?iZkUV?5Y!>YX!=WYca]AceUK5]_g/8P&xmr{WyEWixoyߌdymc2=BOR'e=YeF:kyu{bcthw\c:jDzj}oŔؚ=6I좹QM-Ҳ9Td~zzjDqjpζOBLw~\pM0W\q3stʱt[wuKƭS%Dzwch'w䓿b&xg1U׾m8e$6QR?`0"xP\Q�
    xd`S@B'XA6G49M=P�qv4ePB89_VxL:>1uSC31OopbCeHON?&:Q'KqcDxFCJ
    (*/lY("Q{tQh(Q5:
    KTEɪd{R,Gj,*qĤ8$'hJ$e)Bi*UuI\%*g6'U)eS8KWNLl"yL7$W"IVRg<Z5er!u&.M6mPT2UIQ
    Uf.Kz-uz
    mnc?o9M]7[hEjW--h™S-lY+VIj}bɺ&Ljf')Q4u$4`X}iETH,NfEU`SSC҅43sJSXֲ
    [Mzyu:P7̡5ifR
    2e.׼zZ}+ӝ~i%qMERF_/֬g%-㚴weoUH{Z
    ,
    f~WWQHzKs[!ӑ[Yu*j3IŌo|+QiZղVb|Nhߨ$IN%x[~wE]{W`w_u.}.z&0W<6^W`Goz/-̕0W*swO+.?XƖm<Xlj}XȁA!�xd$'YKfrlD[#&?|e,gY[m+�?�qbG�\duYss/
    Ih,b8ތEoYыft/uBCKL=iP_A݂\.?ޱ6FԳum
    `-xŪ}WΝu}l;Yק~ELV�
    }ml3h26mt[76pcފ}o|$_/-{}p_߸njWy~qӚߺEqq2y3~r3?EAb\cGem~9e^uѬS<yэ<@Kg5djS:m!@Bù
    !=HInnY]sg*faȢ'`
    U$ _ELw'vǻw'-u}}{sܺ|驞ys>+w<=?y\O9yɃ&}{^o>Ka|;g}[{ǽ^W>b}_f_>�4+;@\\>:K@t?9C?@-@<A'=L;=c|TA!3@A!	@!L™(:BTB(	&
    B+l)*B.D,-B1©C1B2
    3<C+LXC6B7
    8$çC;B<t
    =Cr(DCCTAD\
    E\DlDxDH@IJCL=ԽLKL0EQ>ADBST(
    |WE0323[6BE[ԳI4#4CAa4_4LMCSF$5SCT�6_FT]knFGGxT^7zATen{7]fol7^k6xGyOl>\6{F+R\H�{x8HP8ÅxʼndEDsEGǕ99KǚLc:tsL�::DJ�;;S;s;!J Dʷ2˯�K,˫"L˙=l&BK-JK?KK LL,L̻K"	t2HV lL&{AT
    LT2LĿl L$LGLp,8M#"I4MF:BdMpͽT$QRML2$ET(暔)g:$EYθN,ὉTNʚ%b((Μ8+L#̲|,sy-R'쥧XO	\*,ϚڴR*
    ϚP̚:бO"XRŊЙPDAa"2r*QOP	M}mQ %R0R|R(R)҈&K$K,K-ҶR/MK0
    ӲR4MS5]SRDR%	&}S�uS;P<J=ST\"IR@
    AE:Mڊ_M@T@<mTJ$Gm
    KSLeNr'r"u:IJW}frNU;A:Pjk"Q;o8UF]EO^EBeUeUU$cURdu#@rUlPtVRS,D
    
    eV*i2PBk%lMs*^iUO\zQs=W]TmL]t=:}XeXbS
    YY%Ӽ4SJM٬\Y2}YY1YY1Y *"H
    5@(XڠepZZUZj!0!@
    "۪ME[!([ !۵Ee22B$#C)@ܿ5
    m2Ɲ[B"4*J
    ʭ\\UL3]**.2]-]ֵ\]mR(]
    ƅ]=5]#>:<E^ݖ]^M^­)AR)Q^
    %(y%%
    ZP-%Jҭ5Qd_d_݄d޵&_d_yBQ'Siz'RƧT	'Ƨ.a
    ‘)a6)m`l"R)m9DyYb`*C*+~`$*Zb)vbIX`9㿂4ޫ3,(yb㾪)+ҫ6N86N2.BD.DVdCd.BdFIvBGH~hd..ePT>OYVMn./]ee_<eb&[f/e^f]fg&`Yzfj~c^/m/m*y�gsƯn&ޔkg90w0x\vg|~g]Bt0A
    6vFhU۷}!3Nhh臆O{+i[1+26QN~闎NiiMZ~#1*j"N&Ra#Yjjj"Jj2kk1>kKk1n{k0k/ڦZk
    l!-!堿Nll!mڶhʮl!
    lΞheYpV(m>mNm^mnm>m!աbܥ<v
    mmmnnH"*U
    YЀ
    ^�\۝n"e%j9n3]-o#f8,Vnni.^�p&?E~F?Q(p	RpRJ_._w_OqG'WGq~׌v`q ?' /r# #Ǒ`'`yZrq(q`r.!/r1Rs1>)fFs2cBHb<s=s.=s@OR=&.DWtD71s7j@tLd:LtOtRtL=c?3(q;7dXuYOu[uPYWeLu^uV	WwaOvTd\_]ovCyXdUnb/(fpwqo(RwtOw]nj~wxw)wRw{wefw.o?gwq>
    x?xtgȞ֝xxxxxx}6[yfhx}F0&qf VHy_yoyyyWy0nygyglhOzirfZ;zzo~z7{mkN{ko{~{9 {!{{ {
    
    | /|¢X|o||ȏ|ɟ|ʯ|˿|||||}?}O}_}o}}؏}ٟ}گ}ۿ}}}D}}~/~?~O~_~o~~~~~~~7~~~/��;���������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/images/plugin/buttons.gif�������������������������������������������������������0000644�0001750�0001750�00000002446�12143164146�021044� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a����het?R%~Ո|Ű}hv^xPC?Qܦߜɶ!#$ᕐu35ѕ]I)0RO}x[8cjXFǤE*/KnU`lvza[09HX{ؽmn^G>(b|8{ ,'r=:˲ckdk=9r6>HX|Ϭ'~ck6>~ǤDjG? +qtмªsjlsućɬڈG?XFp,3DŽc|j׎WFT`,4~Ļrt|stqod������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������!�����,��������3	H*\ȰÇ#‰Hŋ3jȱǏ C~@I/\2!˗R\)2
    
    *a`a�@
    4KLH<R:+r
    Tg	�@@,�d0҅nbzZp&M#8R<tA�	+NP25"+nJzTN@nDrFkB=�^}kU+,Q"
    '	i|˘m?ʌth‰bHh4a@Ly"pDɑsXlB
    Lh0AMuE1BIdPRod@Ft@	5"E`F0�WLP�
    p]H�$Hh#rHA(<F4@NB�XYE C$"ip|^D9A	&|T �fpqH>B"찃|`E!4 jJ꫰W@�;��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/images/plugin/stackTrace.gif����������������������������������������������������0000644�0001750�0001750�00000020562�12143164146�021431� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a���Ʋz$�o5]m̹νf*bSj\\\M)o```)kEvRRRlǵqv+X+[rrrݬTBWppp\uꞛԲiiznnnu*W*fwSln*h>+\+_ڝ��OOOqod翿įTdxxxFs׈rI+Wfnƿˠ:NZhhhWgпɶdt~`5X􆚾�>�R'Z\HyW`wڽ|0tJ`]us2]rdddʁy\TqǿX~~~r˪_sp}QȏFwŴsttt���!�����,�������	H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜpO8sɳϟ@
    JѣH*]ʴӧPJJիXah	G1K`W:hӪ]˶۷pŹAew߿.o=hcߕO&iSǐ#xqEˀb̹Ydi6^ͺװc˞M`!޻ۤ =Wt?ѣþ}2uУKw]G4nrN`;jWsժ,ȟO߂Ǿzy{Gh` 4$ GW*!
    Vh!BfhyyMuX⊌X`0(4h#Ȑ$d$
    -(>KS>.@,hH` Ev#bnxPdi&AdI{zc/*c0ѩ=$	"@4$	I‹.IceBx򩪟u O0@03@jXAmR_4EslCfdSBA	h+Anhm"ZҲ�&7bHH
    *v龒tC`p�j	(4m:Z<p7#=,p=TgZ&l3K4LᕳE<-4aM{
    \af]ѢjnB4P>/KmAF++Q`%zW�T��,nJ�&j1ZE@
    )҇4t"1u:+3((uk6*6
    +t_]D~D-Ġ1dPb5szZw606DlI"볂	oMA6HS&*ǐ%ysV6T@ 71h#` 2r=^x#ZΎEšNxvk@~@PmF3!wBMY2le؏ۭ05,amBgs5eL\īiы_(F0r8XC$az:!|D$m1T!
    Q(Hpx#+$FJ3Ha8ĕ�8="iEnr.za
    8Rb*�l ,e) x6\Y	k i=98<$(eʑg}2HjnDd5f634Mp(Fvvql'<vsidiӘ݌YM147e:Sv$p F7:4cX@jQ(Mi2BIR.dD9	<P8t@}#)G:F4#!ήiH1q@zZ6I5ȅeHZ9.pg<1^
    YE~Q^
    ªР!U=@#.Vd*)qP 	i(pV"8A2RZ*g]Zj $Ѓ`ef賯.?Ш.mhB
    ;Jө
    hv+B	;'w[�wuz^9зVׯ۝ {TjFurEHAYD6Ȗ'h1&-nG[s8!%o	;cZ2Hw<u ꀁV6W=hZq)Ը^?]RB`U@	Ʒ=4Mwԝ2aU}jvLe$y#0eh >p%7~x�RJ At
    j�*0c3%,"LհFa�#7lR^=dSKőask=1҄:S.s{WV:WH6~k@6v=6vyhle[5>")B%Ƭ@(|a;H3 aH�I"*/T�kg[#'`NpBhG__Q`%8'vs&8ЇNHO,Kw%77<
    g Ⱥ1�+xbJȂD	+4D<߹?j�CD `z;ġyHl;|ծ31c7$FOҏ%H"`m1G9%LHCdA>*'JDoO[Ͼ{/yd(_"_u`~,6Oۿ_~�G,'scw
    htG~�xLYQxx؁ "8$X&x*,؂.0l4X6x8:<؃>@B8DXFxHJ؃mNPR8TXVxXZȃM`b8dX]hjl؆n{3.u4apz|Hr#l@X:G4x؇؈'ʥLV۳;؉C(mJco}DhHf>nhXx8MPҴoȊ|`d/
    &XhgՅ،؆ȋg8hLkFGee8XthUy8X]5UhHZvGMBveoȸeِ)T<$H6/4mql "8&y(P*ْ.Ȓ094Y1:<ٓ>@B98tHJLٔNPR9TYVyXZ\ٕ^`b)&yLF9jlٖnpr9tYvɕyz`	w٘9Iy��	�|
    Yٚo�YIp9Yl}	@}|`@I`�rZ]ɝQy؉[Iiٞd~Йˉ}�i.X	I)bBcbKމ٠癠
    ZxzɟЅ%:�jH
    -z(0d/*y%BDJ5:-ڣ2)5)3eC&W*&UZc`Zyzzy�F3pZibn:j?vGYrEzsڧ|)RJHX:ڥayiy~@l:s1~*z}Zt:꨾	*
    L
    ک:4ؚPg}p~0$ꧯʬ:ڬzڔ,*:HZ
    ҺԚښ
    [y9ୡ)~~	jʮo
    ۬ ):C:$%+z[
    ֺ+5B+yHPi?OQ*z6[ۤIJZۣʧ[;*sZe;::KX+T+X=Y5^
    iC;+EΙk�
    :[ZL+	ۅ0ۺ;[{ʕʹPP	0	;;Kkp껾��K;[˔apliedb f{
    <|	̿Lؽ*<%,,\6|ÿ<"l&(l+TIWiV˻k*b	V8:,!\$|PM\M)6+:e2cw	2m+0_i|l[|K\|ۥKclȂƓ|֊Ē8۲LڤȺz9AQy<3ܪ7{;ɜ||ȑ̳ƓlԪƆL\μ{Ō�˔/뱱j3˳\ø2}Ί͙\n7kż(zSVWr|
    1$Jjfkl"m!(\$
    ϳ
    rLǴl7~˒˜8;<;ҔJmkҒ.MX	
    *͠'KUkֳ<}\,Ƞ\ח?kךW}Uןʗʢ<~ȣLv~=d]`t[*qʧ쪖
    km¹΀b漚5=Ӻ-[yк۾۳ϸm4<ȝ2ŭѭq}ح
    ܛݢ
    ;}
    ͹}=};sĹsɫ\m^[ٯ
    	.Vl]߬y֭,p5ݱ
    ^.J,u�^ɌԙؙH}؉˄O=9ڦl{
    S3Zʓ=֟_k,'ã=p'ܳJ͈L%Ԝj-}G-I)mei{Lt֎J誨ujf%^,[r啙KU(�n޷g~1+ ֩q;m{Tٰj
    ݲ)aNsfQgМq.lMƮ]ZhK~0s	@Z>)0n[t^~`-1j4&{n
    n@n秮>߆׎؏]>"tt{|̑]Q{o\˶2FQHoN
    \ni¹X9Lʑ]fhor?	txv|_}\_qV?_ݕ___/o_ᷟ޻޿_ȯǟ/oԏ_n=k}?,}]q__o$XA	.dC%NXE5nG!ED4i֔iCF1fÏ_~95IOA%ZQI5R%K0eҴS'O~KnWaŎ4ʖ/cRΝ=Υ[]yv54Tnĺaĉ/f/ڨk*e̙5ol1TSV[iԩUf}_ɣ)mܹu}Yҵw'^C&]9+rѥOqScwyNJݜvϧ=߿
    4@-;tAS"BO=2C0C4DARtE;,Ю[psqGVđG  H$c,$t%;|rJ**Ԓ+[K0041TsM	g7X$M:,M;33<O܄l9PD3QFuLKG+TE/tSF
    tTR3ʴTTSuTU[u V_5XgZoյ\w^v`5bUduvfvhjlVIHakD/5WnUp,u1]y}^{-_}ݏ_`6`aa#nHǕSbl
     ydD&dLFyeTf\yfdfE7urq9<%%wΟfV
    i.i
    jjkƈkÞl^5h4{юSm~wE^&l<ph>x&p/\=hCYDGIDC?hAHq@
    	EYtk@@ uqvۋ>Pg@y>⍷P}y@Q?(?y=h?F�cBc< 8C0�`bG@P[
    r`%x
    "L	BbA@0\$Fs!?
    wX]z`Cap;DB Lazp"q:,c[ PD�kSG@ҏa d!
    yHD&Rdd#HHFRd%-yILfRd'=IPR$e#yJ@Ẻ3Re-myK\Re/}K`S$f1yLd&Sdf3LhFSlHXyV/r09y
    $g9yNtSdg;NxSg=yO|Sg?OTe'$G9].s\"yMЕt[]^UAhG=QT#%iIMzRT+eiK]RT3iMmzST#DQ=oe%rw�^`FUSjUzUfU[jWUUc%kYzVUkek[VfGTuK$yOz$XCa
    {X&VelcXFVle-{YfVlg=YІV%min
    	Ji/_PVmo}[W%nq{\&Wens\FWӥnu{]j+%ӟw?Aeo{^Wo}{_Wo_�X&p
    |`'X.y@/:]?iP;�<aX#&qM|bX+fq]bX3qm|cX;q}|b"}ax	gb`ASr|e,gY[re0Yc&s|f4Ykfsf8Y[-8npIDHB)I
    }hD'ZыfthHGZғt-}iLgZӛt=iPZԣ&祖)3^(C<7`m}k\Z׻u}k`[؛c@HN}>PD<}mlg[vmp[&w}nt[fwnx[wm=xfOL)-gxpG\x-~qg\x=q\#'yM~rx
    9| b/qz*y}s]C'zэ~t5bF16rBctg][z׽u}Ug[=48ʑwcXJ]s{~w]{&>G]֜lrx'^g|xG^|-yg^|=yЇ^'}Mz	g}]z^}m{KAM}}O{_'~|'_g~|G_ӧ~}g_~g_'~_g~_�;����������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/images/plugin/createFilter.gif��������������������������������������������������0000644�0001750�0001750�00000030761�12143164146�021760� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a��ꙙqk̹ҾT[KKji㺼̼eflgމccє҉䥤xY^{v$U٪薶,/z{ٺȀzroVX]˨G]`ĺֻ֣ܵst{IpӨ}}FFK̄鶰IJNɦ9DdzhΜLMP벵\^cff~^]=>�<t׼ww⼼ޱȽ藍MK@iL}<UİU}ʶݲ %qlmsܷп٪ĵקدƎM}җ~���!�����,������18*\ȰÇ#JHŋ3jȱƁ,�(S\ɲ˗0cʜI͛8sɳϟ9	x)1TvDӧPJJիXjʵׯ`ÊK,#d4#UDݻx˷߿LÈ+^̘pd|IZOQIy3ϠCMӨS^ͺװc˞M7sa FMȓ+_μs&Ũ5sQ2iνËOӫ_ϾE=kɡɀh&6F(Vhfƈ$9 rhŒ4h8<@)DiH&5L TN	ejШaɗ`)dihlp)tib:ÓUiX%jh#nC(*餔Vj饘f馜v駠*ꨤjjj�ÞEPj:qChR@&k&6@�HEjm"mF#	N0
    [H!0RB	K6[ث/%$
    %A&ϛOlgwC-N12"6FAo$0!=Nԃ>H43'h`H'4J74MgAAE\\/M	`0B]+Mvlpw=tmx|75=jP@%?#B' ,`X>8<pDn飗,'X6_跗{o''_ЗЫ1:<c?
    oOt
     KA>H,W
    w10l{8@
     =_kǽP_п)@~fH8̡w@̡D@=Aҷp!P"}8A6aDA	40aD�%X F1$(,@D;	(F
    :'�܇3j|#IAplɯVp1Dh>5Q
    r,gIZ̥.^0Ib^HD-Eh.
    =5(Plh̦Fk	O!X<N$	Nqs'=O΁[ :#j3D[6Qx6=M|'JE0LgJӚ7-NwӞ@
    PrjjHB3
    8jQOIPK	cP*|xtZCzU(heE>)a%PP+%H 3hhժX(.5n6zc(@ͫ^VXʵaz8׆Yig[ҚMjWֺlgKi٤JSA~U5hu(H@"
    zB
    p,fC`BsKYV׬0taYH;^~D	dHm/NІדE>׻+߰_J/${ GL;(NW0Ol*XMj\iwQmP*HHvtŰ@2&e9`nHhX΂(,s@0qc[X1OkhfA5f	̎#1g*K@>'4|.Ҙδ7N{ӠGMN/H‼%j2
    (xh^o}XJzv	AFq`	ws`v+q@ �;v m-�~Afm䁭q-.�pn<;_#vMfÎ'N[ϸ7{FuDj /PPbxe.|1r	!v=`6dsbU(	@
    X_^TAWE1':5N[�_c/+^|?<}�~O;|N[ϼ7ʟGЫa (8!Va
    x}Y
    a8E7`{؟VL;Џ
    Ͼ|{OOY{߯A
    ?GAЊP
    
    H
    
    ؁ "W&x(hx.028(86x8:؁H�
    j7DHhwppN
    G@
    L0GPb mpp cl؆nprȆPvxxwXgz8p؈8XuM	A؉G	@
    f؊q	P��8XxȘʸ،8Xxhw08Xx蘎긎؎8Xx8@��9Yy
    ِ9Yy	 "9$Y&y(*,ْ.0294Y6y8y<ٓ>P9yHJLٔNPY?9=C9EZ\ٕ^`yT9VIhji0kym9ٖcIeg)zQ|I~2IuwY�n!*IYBiFYЙɔ)yəy9iI)ْ	Iy@x9))Y/Y9ʩƹ陔yI֩9ɝy)ݩYi9ډyY!IiziZ:zI!y�Zzy
    ٝZ$
    ١#穣
    &: ڣEZ:WI*-4i3IV@:BJ_az>#u&
    DLʥyh
    @ڦi.FJ<*jlOQ*ʞ¹	ڧ~ɟY		
    ꩜:t[*
    rJ)0ɪ~:vYZڕJ	ڭ:Zz蚮꺮ڮ::4pzZ	�;[{
    ۰;[[z	 ";$[&{(*,۲.02;4[6{8{S<۳>
    C[D{FHJ۴LNP;R[T{VXZ\Z`^+f;g+ADpr;t[v{xz|۷~r[뷄{tZѶ"˸{KY@+k{s	r;[˻;xkX+{۽˹[ۼ[{k+˶:O[kܫ{;[,狾۽�콘ܻ{k{{	
    ™+�L0ܾK̿*<l&웷L9ć+8|,+BlL$JU'N<"RlCJ|ƁdL1?‹[8<
    ;[;Xkt!ܿƆU̼e7l+<Ă
    ZL\l̻_S,Ƈ{˿b<'\ʀۼŅlx|z춢|˸\ț|˼[\\|Ȭz;[E<\|؜ڼ<\|Ψ;<Ϊl\_�<\
    }U
    ]d
    N!ѵ Z M,*SaҚ4M0]7M25"
    
    EFG-BDIL
    O	,XT[=V`-]
    c_h
    `]lpr=t]v}x}|mky}=ثlZ3M،]]Ϗ-֊Ӎ]a=EmٞMЀg٤ϡ-գ]ڪҧ
    թڰѭԯ۰\۶ںY۽Mڿ-=ܞ}ܰܯ]݊n؝ڽ{ݍ]ݬHޅN-޾=I
    ==m=Fׁm-=h]}\
    N>.5}n}~n>~+*,4^6~8s/1!|]`AB<=m^K~NmY娍\X.,ace.giN`G-\A[rok^yv>LҁnZ:M.?x^C}%~Ҟ@s>.⩎顮}^81ԼjfN~Od꒞ھԞ̾m>~Q= n^}Nnﳞ^n^|lOUo&(
    !_}2/4_7#6BFLD/	.?n�_\^1Q>fXpr?k_hw?jE]S焏P^/퐿=moo/ZOI{/t*/oѤ?Oڟ?CЏ_/.J=|O?$O܏$XA	.dC%>7ʼn1nPA
    t(Ѡ)Ud%/e.9ӦC,yOA%ZQI.eSQNZի;IDyWa=K	z[8.Fro߼!'/flpc!ㄘd̙#Jfɖ;&tϙCܪѩ1˞'_عg6͛CѾ
    xcۭ/g8狓m^ݹ腧lvWfMLOϧ_}W
    ?Z<30%J\;KB\B93p
    CF,qŃNtųTdqF`$FdE;q
    \HL/H\HtC'R!K0sL2LJ,J4!r7eb|N�|B:TS9ϖe)PA3tEUB4Eσ΄tPJa{R3}mSNQ낲P4PS]sZu5R#U.uW^{W,oGaE53YuYNuYbQZ>}XnA"pZmV5lõVnBOMO!7]tSyWoŗZ2vur`a#x1	V]}}kF.aw_$
    UdGxeuy[{9ڙs^(yFgMwZգΘf~mu^ܩ;&ݫk{,κ¤övm{nn{oo|p	7=#q#\3|sΕC}t?qSW}u^Msc}\Wvs]tHw_exW-wwyȿ0z쳷^FH>jz˗X&"gq{?i|_WUdc":d Fy˽u#`ECd`,b�-xA"#�
    #$U4P�7Pr!QjPL'D}C &цNa}'Q+JQe:(/~1cWDъH2"%nb
    <ychƟo㛣HC"7T!x&:R!BR$'+yIGL&KYL2NX
    X,&g	K@VS*E,vPe1yb2\&2KgSpl%if|f+tBR')YNrR6Qv2df2IFړԤ;MJjr6ADxћ9)>hDչ1h<9z擣QL5Y'>C$"KMrtL(lt8iN/Zz$JRTCMI?ɥtKЙR儎j?UGx_ɏV,3-yQ-UW~/Wf5?[*&įr.V;Xle-ZvFl Y՝%miQn6eO	VmBζV.W.4tܮv-2:piW:}�@={Q7w2a`WHE}+f4!$"P:�&0\`	fp`z<gwpWa<wp$=W+'bXƃMZҾ31}򷿗5k\PKVa{FYW9!Ajw[6ef\gꥻ`af8P#ng?Ma{n=7)-
    Aʳg65wS_HFLgZsfHv(T9)h<Ԡ֦ZQY)}G>ڏ9?UmkVg|*Kf٨6ASxm5HUgs+i9KY֒N,my_YJ虫qE
    e_Oӗ$
    "<D**_XDg9iNg|8)}g:fjEhoT	W̓HeY^s2ڔ;"s5DQ}o|
    mT.*#NpGu9aNyӷT;{s:/ZfA>r;ܩ@ԣ|}9T}f>=yGi=9PD}U|:gܖt}HV5}E(}Eذ"4Լ;/Df,OM6~/]-j~gQ^K[_k\䢾?
    .K骮벿|@c1
    2/T.|@r///ALү'$
    lA00YA
    AA
    T!\h#B&d\T]Ȁcc�kP$臉&,'TP%�6dC`�#"$ ÈCH0CL
    C?,C4y]P6�`x^8,:>;1,=t2DJDJCB'5LFS<HHIACWDĆE[D\!yHDSFTTŪBON?;@$[@DfEDmB*DXE
    lE@CeG?FOdYTFjEk'<6FzB+o,F%TcNlǃxŨ[?|GxyEmz̀8G0rLFdGKDǀLG@LƃH,'�`7zHpԲIGrqITsęɐL�؅|)�ZBG0I4]X]h*¡}Jtʧ<kǕʣ|BkBSG,B$:�KKkTK˸\J(^K%(8bxLȄtP$tKIKX�[\P�DC8MX0%L<CHMdEdMqMM$
    0MTM~M]M4NANߔM۔ʢNBNMJ,CTdN|N\NlNΩNOOOO==L\Pl�OO	O
    =PeP
    N�E=QQMPQ}}OEP Q!
    5ғA-R&'о(U)-QRQP*=L.mR/RS,-QMS5,QӋ7S;-<ES=S|S%%R@S6='-T9= MTEA}%}TgTTJKm
    LTWTTO
    P]
    QK)U!TTTFS-O(mUPդ8UZ[E
    \6)#tT_M'Ÿµ.a3LQlÓ9lVgCVEdDGHVH	EnR<ŽW$DF_Fu%XYu׸WZ``{H:P|}WdHZJeցՂ5XTXlz{mسE,Iz*ʀ5QE|Hؐґu�PJWd<ؖ�ʭ®JYY)1KYdBeX3KBוեZ\Tڪ]dLnjȜʬA5U"=[]([[5|[[ե[[][۳[A,\*]\m\}ܿ9
    -ځh�M\˭[\\\ ݢ\21>4
    Z%M3
    ʛD1'i|fH	ݡݵ[:]d4HH=E^4
    Kilka[#%^^mՖƻ97໦j[9YS
    Er|_HH_<Tߚ9z`yR8|c
    eGwfuT`d`w"`�:B�N
    ]Ea$a[Ӄఋܝ`[
    HE|_M[$K6nc-=6:F$>g|a'&b]حZ56j}c>]ԥc\҅c݂\@dAdBϭc%5N]dFA}
    dI~@JBdMdN>F8c<Mce,eQ><Eeו0囅e{u^O}3
    ]FS\X]f
    *bfc^d.[+bg?8+66?$HBbbzCfbaE[g}I5Y<"~a;7f
    |b#%hyb>}.b6b`ኦTfn~;&[aRfHfV&eK*]pZ+3/$f>cOne6^iWݞNe=㭎嬖ݯd>kVJKn{kf?kk2)k>2l1.l01flqlĞl0vl&D@v&m3mNm~~A"EY	;m۶mmmЮmi	!S.侉L202'
    ¾nnnCno*o>of\(\^k&So3?On3"4K!Mp2*##ϴok
    Ǥ#L3qp\=55
    #qq]tXZZ:ruKY#o$%r\q67+$b7%&G!A�r2':s#c3p7?6_s{s,k8:Ǹ9s78/)*t${(D(,:K:|::IglG/CttJ/";;Ruk*3usFn;W?Z;Q(ʼk`'+UaavbtǼr>`<dublW䃾cv@+_r*wm_ow{p{wO }zGw(+xpOw.?x(xx?xx-<@?O@/loyO(;yc@
    
    yyy?y(цm@Pz//lz՞~|$/&{7{O09lĮ0{o0{/0ġN|_|o|Ƿ\
    |@ʯ||̿?||>}.}ҟ2?#K}1o{ͮl9mڷ}0~l}vm_~
    o~gz.~|X~~~~ȱϟ
    A„
    2l!Ĉ
     6A
    t( "G,i$ʔ*Wl%̓)m&Μ:w'Л6,q͠J2ehI=i*֬Zr]jMǒuf_ŖmӴ$v+޼z5;pnFXjȒ'Sߧ̚7s3Т3FvѪWǚ3㹎ޭl6n_	7‡gw?ė3k37~z؅Ivw׳o/{P㷯o?Q߿O? ~]) )}U?H8!Zha?fzh?5Zz!IhX.awΖ`9W>C
    A
    9$D3$EÈk5TRYeS2Y#FB#e
    &m)qpy'%jx)g֙蠅"~	Ebf&?Xz)ji?v馡|V:jzz)ꪨ@Jz+-#+
    ۏ:b*Fj2lkbKҚэc:.Ojk\.,Vk]ދ,Z.
    x0
    ;0K<1k1<!?|2)2-
    35|>*2Ϸ	A=4E}4I-*4QKTӲMcYG.*x5a=6e}غ@<6q=7u}7qCvcW5:.Ӂr8+8;83
    ~4yk9Gs}?s+.Ȱ뭻:>;KX�n;<+H00cA0K?=[O}*k={4Q1<׫>߻>ыOX+?Wβ?Vљ@
    p|`	R` 3hj$?(N&$<!
    b.qTGb(Ұ6!s>!(!F<"(D0N|"()RV"-r^"(1L!Ҩ5n|#(9ұv#=~# )5*<$"E2,b@��;���������������logback_1.0.13/docs/images/plugin/sampleLogs.gif����������������������������������������������������0000644�0001750�0001750�00000026205�12143164146�021453� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89av��hfRLfVEXILThpzsS’b[G;tyɭ򎕢WYJ3<wXK&ovn]S87yzjsUjًfbt~㈖B;YP9"S[?Rrt[Q~ckG?U`jc| ,���坞ܷqod?==봴etħ~Ո|LcŰ}&Hhv^xC[^q[otqߜɶqpSgzkܦ9RƆKnĸz)0ѕa[$*/n^~ǤEx[޳<ؽm̰ouȪչ饨ϺܬH@Q8м˲ϬĻչ뤢ٞ}YaHOnh,4vrⷭέҬ~ªs���!�����,����v��	H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0c͛8sɳϟ@
    JѣH*]ʴӧPJJ*R?
    i5fז_eIҪ]˶۷pʝKMb͊bMizԻI/Tǐ#KL˘3k|kϠ-,P`N
    5Gib˞M۸sͻġw8zӞ].vf4УKNسk=zË/x"#~c{4ȟOϿ6^h"DƂ6P`{
    axpiJ4!jA	0(4hc17 GpIAPB4bFmIȤ[ND[Q%
    aI4!<5B"3p)tio2sx؎h9	.0B#2BSUA69!{0jAvQzqI*B4!-9ͬ+lkVJgI
    8@�-Ђ(h҈.qT@[/C"oeE�KZp!Lp\Q4aŵRL:'xk*\|q?"l2$r%L2*|qZ*	
    *[펗PC
    ?4l"vQlu:-l%`+
    ?Ly
    ko]7= 	'0q`noxG~8i!y8Κ(G裃@	Că.OsD^*}on{؛>
    Ƨ=s|=;߰ӓ_|qA!?)g-/?ヽ/"`(@1<`
    b 2<9{@! h7J_(�
    
    l�a<yP|;b=zCb־P\G)Z|ObXEqS86鹍U4ըwcc=`qc՘=ΡxH?)F^T#_C0syI!1 .V)B;ΒKjQ=1/zY-
    Y0兯]l_Kc<	B=xS)2@�2Aoz; Ozs=Yx'@oΎM;'E6ԗ%@VS7dэlCP.ЈE
    a,齝$GƗ^yIlh.̱ESڌ,S+ZO<}C9͠&vjTXWAqHUjXֱڡ`=kZͪVUmj\*WҌfukTEB4*:
    ̢(B2aRd"D&vXֲs,o'~5%bꅘ,զhZ&ө"eAN ᷿C+ �n֐:~0׹u.t R׺ӽv]n7[7mXb4H,)XR$p*�m;xv5uL<1ԛm|R|,'1&|憽HGx_>f;K<h9ЀXcNjw/=;.2\%+9;fP*g&㇉ވTbH@fDp@6~Q
    D-P`r5&adP$F;x'MJ[ҎkED8/+V 5A`�Xb!"4B(Bg|ima	B26C�b:f;uF0Pԣ=1]}fGB1Mzη-oM)a%>L`ɳUD'N[ϸ7W|17G6s"'Uކ0gN8Ϲwsw$zz<+g:S;PԧN[XϺ>}䟲N?pNwGwOƒOƇfkui?&O[ϼ7{GOқOWֻgu%lwOr;ЏO[?r{Ogi90շw?+�Hy~7yK7'WHzhy~wz~7*(~}g((؀hw:y&y?(W8HB+LX}-|1QJxXXGZ؀
    =2]/U؃kh6c0׆_jH^xz8a{8f؄~x}hhRx3ȇ(aw(x3H؉7x؉\H8Wh5HXxhh~s{؅xȊthH`芕Xʨ~8xkH؊؍H8Xy(D؋}h똅8ȏyTY؎ָ((ؑYzy88ɨ)
    ɏx8Xx*<Y98DYWʗxK&I8҈%	2((SITӈ،]YhbZjI_9FYEu~zi|{xIwEzWs!y�HrǙWyٚ9Yyٛ9Yytȹٜ9yؙڹٝ	Ijў9oi/ɟk9~Z/y)
    �J%j(j*z.ʠ*Z6ʡH}1z/Z#Jp �zI-
    j
    ZHzEjʤSz>_
    )/J*
    bڦOZ7r
    JAڤG:cC\zjU
    y@Jʥꨒdڨ
    vʨj::YʣZzlzʩXo%z*Y:
    ~JZa,J:i	zʤDZ:Dj<
    ʭъʮh
    *Jiڤ:jʨʩˮJ:;ڮኡ [9nnʬ'ۚfjz
     ZAڪ]/z묻"*
    
    !Lyz{Q۴3
    SKX۴OkKz
    d[fjlKh۶pr;iyxz{zv~}[{;{eȃ9~Y~۸zVY	xYyXpG8rۺ}#{4If	wx˻<hK냴{yˎ
    {^	[8ekdؽx[k	jٖ8틾kbH[(8쨋k{0	@R9+|xt>ɖBɉ9xˋȈ6)K	53,ȿ.#1܌X	²[$=,i�.h:U|,Y5\y.ILJD,gܒܓMOYllX\x3|`"̒9f̖agp\˔kI[kȆzhHǠܕܫdY:\o	ĉPÆH~;W’ˌ,L|{\,<|oK<L\,]W˵UKHڳ+z	͚r1BKsbK<O[�{
    m(ڭ;ҧ:ёjjz@ۥ7hj9[ڰ%K,ۧ+D\Wk=h+
    zj&}6k+0Ⱥ	:ڊd=-:e=?|zЁm<+y뺰&[Vjj|]=-a1Պ}֋
    N<}@}<M$6؜]J5کM]7>=UCؾݼ
    {۝:]z
    x:�Մ*iВ[z=Y
    ?;9ݕmjͲbګ>~k;Ͼ	ӱi"*$ޛM/2>4~86<lBθ@>F~L"L[NRP{KkS7Wٖh,?<XCx͛Zmty}Dl4<Lko\u‹9lì̾6	_ÇFɈ~+PƋ.ŲH{ณ,l.缮Cmɨ^^,hYl0Ƞl똘F
    \1y<n|.ɞ_ܒ[Hɿ~BIw߮/^+YalnJlˡ|ə
    ߔe΍]|~f'9t^'8O5_|μqAFGL>_MR|;VX\U`!b_f?d_`lݧo,}M^T/ݩJk
    ܬ{};-*]x!miƽ=*@
    4-j_صvͳG=.k}J([Q>UmX]J|OIZ{.L޻
    -ͫ-ޣO៱ݧK?ӟӎm/-#8ATp†>LH`Enh1D !jlG'Ef,PDYœ3KOA%ZQI.eڴ(?~AJtN8YԹcْͮ(^J&[nzzU؞Y+/טZ&\aĉ'ڸҷu7.xc&r2'}ui{kaW^\mܹuvL)̖n9|epuIGv^=8WF|nezC_Yϧ_voϟ4@@T7[v;(0B;ÆqDK4DST'WtEcqF}j(rqG{G rH"4H$TrI&tI(rJ*J,FK0sL24L4TI.ZM8sN:N<l<O@tPBs(9%(
    RQ,uIŬKtSN;e3*ǒ3iSOIU-UE3URփvUJIlKoM2U]GHWuc=UvYBUhku^elt`]i\b3YfuNg][k}W\WVIwXiUHZ`vXq~`%a8aa7bXKN`t~we([-Q6ztbu97bogzwYg}6fn:h|y.ꇕVjV[˗T{g>cXm\Yjv]9[jNi:g?ǖ|r)y}FOjCϺOg5=Y\pk	_{H{jm=u7W>j;'}s!}n_<ua]u^ؑ|sI_UÛלT5vCFe-za)42X(e0I.siI*ExB*%I,#03ߏT6CH+l}C qP<TxD$&LDQD(FQOUxE,fQ[E0QclxF4QZ46TeC8q{bH8!O S'cR(DrI@ҒwP&9>)mOkh4Qe$HSy1%-/	ItRAD1	*Yˑ;A22ghY mB͊;AJPMd(2ypnV
    9p^琳f=mTEf7 D<rqʺ._Y%[*\S)hPĆ(r&QCƕ$Qy˃T/(EѓoDhRQ\8d?A:$<:e*_DԖ0eJϒFFJ}QRUYugKf5AOCC#=+wlzM&
    EMTjR|2Dj,櫒{R<4HS،t.ѮE%TZ?NӚLg3MUаӛbO 
    [(SsM[Uixy3f5;gdztVG^W.}hqMx[We/^W{_Io_%&pE(`'X^Ӵh	Pp \+MCp:\#֠/cX:p./G8KRe(?1%Ld[GC氕NSc,e(99d
    /YXJ2|'u_>3|\9NV3#yz2
    O4
    e8X4e?;:ŋ&t5GFu|bP7`!
    S+ӘjFCYw3h_y˟wiOҜ.u==2'{g~bhs:_8¶ejsܴuیm]Z־u_,ie:}ume|moW{.6k{uYT6mEq6ywŌ/<wIMlOV3Cg;x9nuӛЍ~{Qȡ^t#$8u*A]2utv[ZV;Вn{UvRWjfu^o+8g*oCH|'vQic=88֞g}ةO^i{܏P (@_ç/w
    `0	|G7\@	�d_~oC!/@0}_,2~IxSBBy'?b�@ @1@@\(
    =Sk?@	@
    ???�\4�\@T?
    <
    $@d,
    S>?A#,B#A	@A<žhBP+\B*|B"$
    +l/\,l?��>.B$B$T-A
    B
    LA!@8B4;;C!DD;?>C=@C<,7$DFBI@H6G@ADLO@QdMRC2+.DUCLCG7<#B:|BO^<DE8Lb%U|Fic4D"Fj$A:F)FGHlFd<G\lq@c6FyCaGjFkD|}nD[GGp\FqEj4FgmlallTBDd<DNBDHHlȉtTٽ=1Cz,FeƗ<HHbGɋIgZƛHIM\ȁdHtHBI0$	[SJIdəǟ\ʂJO,Kƣ4G|IʳKtJtģJo\ʮ$Bm˶DG4\C�ؾ*CJTȈ=CPL
    ,Dm4ˀG[d,ʝM@DMrD̈́TLDDS|ŒDCLKJTE?Z$>#?̍,Ԯ輍<'z/N$#NN,NO,OLO9OlO|O�OO
    OOOPM
    �P=P{=BPm(PPP	PPP
    P
    QQ-$QMQDQmQdQQQQQQQ
    RR!-R"R#MһBR%mR{bR'PR)R5R+1R-R.R/
    +S1-4C3M#S5muDS7bS9SS;S=S?
    TTA-T TCMT@TEmTހSG/bTITKԥTMTRбTQNUSR=UUUT]UUmUW5UXUQUZT[LU]T^HU`mTaDmAHVe]VfMV-xVhViVjVkVlVmVnVolMqWr-Ws=WtMWu]WvmWw}WxWyWzW{W|W}}mV]	ЁH(X-X^(X_NhXXXXXXXXf'(Y=YMY]YmY}YYYYYYYYY%؃5؄99ZZZZZZ
    [[-[=[M[][m۶UZ%
    &[[[[[
    \\-\=ܾ9m\}\ȍ\ɝ\ʭ\˽\\\\\
    ]]-ҕ[X]
    e]E]+]ڭ]۽]]]]]
    ^U\(8^M^]^m^}^^^^^^^^^_}]p]5ŝGX
    e ^__+_]m`.`>`N`^`n`~``	`
    ```
    
    F]u@[]ە_:C~a>aaaaa/  b!#N6'~b("ba+a&,&Oť0c1c2.c3>c4Nc5^c6nc7~c8c9c:c;c<<6v_MHddCdfa*.+nd-~dbIE%Vb-bM~JFbHeb/)8eTNeU^eVneW~eXeYeZe[e\e]e^e_e`f=dBvCdPE]@�^fgvfI?fkkNmfnfAfppFr.gs>glNguNKFxgyfqo^guf}f{srqE\>hNh^hnh~hhhUg^f^fdvuai:BNi^ini~iN钞iiv>⛦Bi韎ijv钾}^jnj~jjjjjjjjjkhv鍮"~&i.jki霎6ik.+8jU^lnl~lȎlɞlʮl˾lllllmnkk^k@6hanmڮm۾mھmm;`n.nmܾ؃n~nn>n&mnnoo.oVlvm؎6PmHnﺕ<8<ooo΃EpW?pOCXpop	opp
    pOp7Cpŭ?qOq_qoqqqqqqqqqמo["ok%_r&or'r(r)r*r+)W#r.r/r0s1s2/s3?s4Os5_s6os7s8s9s:s!?"d<m?s@tAtB/tC?tDOtE_tFotG't-sItJtKtLtMtN;?r9.e-XuVouWuXuYuZu[u\u]Xqt`vavb/vc?v1uS/uTo'�,vivi�`vmvnvovpwqwr/ws7w~]wvowwwxwywzq}p
    ~wwxx/x?xOx_xoxxxbxxxxUxyy/y?yOy_y xyyyyyyyyyzz/z?zOz_zoz燀��;�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/images/plugin/prefs.gif���������������������������������������������������������0000644�0001750�0001750�00000021072�12143164146�020461� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a����ٱ񵜟jiԼdd綯쎡͉efmфZ_{v٬䖶GHL-0{yz|roT\˧WX^%SGkgg^`ֻ֔st{EEÙԫẍ́}|뙋x{☙|u؛ɦ9D􍂍ǴޏҬlmtUZY^hΜ۱KMOvh\]bIpXWsnb_ON;=Ǩww⼼ϬĤ�<t꺼궸i?==<UL}!&q㷹ݱطU}ˑȁƎ濿ΖHMRUghM}ݷff~���!�����,��������	*\ȰÇ#JHŋ3jȱǏ CL8	Zɲ˗0cʜI͛8sɳϟ@
    JѣHWKP`U2IիXjʵׯ`ÊKٳhӪ]˶V\7"\!Pķ߿LÈ+^̸ǐ#KL˘38ܵV%ˢӨS^ͺװc˞M۸sͻNt*<'8YHOEВJNسkνKh)TXCҫ_Ͼ˟OϿ�([$&zTQLyd0bfv ($h(,0(cl@8
    :\HƄH&L6PF)TViXf\v`)d^hl[$x|矀*蠄j衈&袌6裐F*餇n
    _<|qyY!jHB0!C;,`*무j뭸뮼+k&체nApV+>1k% ~\+֋.7oۖڭ!t"3�AZ`a. |"O!
    S"3DB ,g0#2%5DB%DR%L08s7w"DmH'L7P7
    TWmXg48#0PoT[!fL-B'1
    W`'x/;nN$fCA$nwy	Ԁ柗nuꬷ.n{9P@7?e&3EAp�3:{n߃�Nρ귏=Ch@yW>@ПH@L:'H
    J̠7z|	$P"o %,p=칣 +0	W0!8ġ<"
    1a¹G@,D#D;20 e008 0))N@:$.!GWqet1D*fqlc)FYb6X-<'IJZ̤&7Nz(GIRL*WVt%h03	.B"ΰ9L&CbFf@8�
    h!P0C$p�'#Y$
    wHУeE$&@zlQ4#Q%Bf8
    DpJ<6- ?0&Pkfsg9-Q&7/p,j(%JWҖ0LgJӚԦ(ͩNwӞ@
    PSh#$a
    w\2`$�
    BrCXU'V"YxbZ鎎dY`�Dk%b]B$.7•gM+�"ұ YV�X@^�4M-`;ֺlgKͭnok
    pKMr\X݂HT,_Z  xū=PLcf0p]#%$o$ʡpoi�Wub_zh @$0
    
    g1_k0A,Z@NW0gL8αwcK
    ta2;@huP x9sgX"1
    �`z>pa̋Aa_fce8S*Hs#f9}.srs37 ӠGMRԨNWVZ˰gMZָεw^{:[t}0U.ͅЎl$Ty}#~hpޖ0~	0,@5MOrG~㝍�`w1C${C`?sK8s�7ͭor[`?3'rc܅3Gq(OW0gN8ʷ`y&6|6l}p6'41Yhb:`e	`5w*ЌkqJ;
    apllEhFfafs@$=@=1p�~@&oHpuiWgOϽw{NOO|?L:{=/ѹ`'O+@?:
    @:wП2Xч
    OsDf?z
      ~~z@v
    'P'P~~��Ѐ	800P8x	'䷂nX	8:<؃>@B8DXF86JL؄NPR<jsZl`FW~/Pt	]peHߐ	0	߀tpxw5 p$z8XxzX8؈8Xp؉8XXdv[1pl8ptPnp	p	�p	 	(88
    fg0vw@؍H3x긎؎8Xx؏،
    xnP0i	R1IuБ u@3p((yڠ294Y6y89<ٓ8i	@B9DYFyHJLٔNR9TYVyXZ\ٕ^]ɑPyhj
    	nQvyxz|ٗ~u9
    f  0
    %	!	И9Yyٙ9Yyɚ)	9Yyٛ9Yyșʹٜ	 	Kyؙڹٝ9Yy虞깞ٞ9޹Iٟ�:Zz
    ڠ:ZzpP":$Z&z(*,*ڡ-:4Z6z8:.ʡ<B:DZFz$?
    HڤNPRJ@:X\ڥ^`b:dZfzhjlڦnphU*Yz&|ڧ~vtVʤxzڨʨڟuzZʟj:zJjd{i`ZÚZǪzɪ)
    ʠj:*ڊIJj_ѫZ:Zca
    ʧ{ɬʟ	۠⚠
    ;+Iڮ[bKa"$˱Z(,k+ jajK)=˫
    AZ>B{HKIڭK;*;˴V;?K<z	j;05ۯz+;3khگZlKk+:ڷdh˷|-kuky}+z;k!븏[8:۳;ZU˳]뺲K+Ya�Jt/[{K,;['[0uۼ[z۶kț+*KڹKzJۭ뾧K:;Y;N[[]+j/&ʶjs
    {‹r{,ҋK+
    ̯[n[#L–k|/[û[>˺:L>k;l6 LpZ\U\^||2‰,]\j拸We%qßkNĭ+HK,ȩ{Āܺ,}Ȁl,oƛ{ƔK3<Sof3{݋R;ɟʜ^\ǔLJ+
    {ȿl,Cœ̽x۲+Ƙ+1<Lb<l5׼~Kތj[rn΅k[5|TAˢzQ6[LdϖH*	:'|ZwnUѲz}*,]깵2=-]6}ea3,>@B=D]Fͦ/<LNR=T]VZ\\`2b]f}QJh
    Gnpr=`8Yj8|:R}=؄
    l]؊}؈ؒ=|؏=ٜ|J۠츪mǝڮ}l3JF̠
    Lүی8>lnj\Nkl¾
    7ZȡMȌlEl˪+<H彵⪱Ԝj-mÝČ{Н"<
    v<
    �
    {M,mͮ]5MݸkN+;ݰ-%,6$N۾W_ͺ<~T+C;~P9>Ӷm,Q1@VXdNS~::e~Fl>,}p~tz|sw>ք~~膞舽֐>~R]^>^~ꨞꪾ^"t^c뺞`� W]'J.CP
    [Q
    CjC..o^aqKHNΞ	XJ~>NN
    @4po	/=#%~m.o.0A
    I]=\ML\�n^`T/S_P6O8;ȉL,^D-JðϬQ/ToWOR[ߣ0.)=οEklɄ^_sO_x�Cȅ?Ȇ߰=Sm?ƪ׎ZsZ>^⦏b/⩏ݣŜȟ?~+I̷l䉟_Kkܷ,S\͎}̿߬
    |A	.dC%NoX5nh@!E$YI)UdRC#thK9u'ʂ%ZЋfSQ{”IӦTYnWa:BYi[qSRY\y:_9Ra`رSV>\#̙5ogСE&]̖U>.kرeϦ]jWoosO^qɕsѥm>uٵH~ŏ'_yկg{ϧ_}!/_`�p@4/~.#pB
    +[P2BCqD%p:[tE<
    _S;cqG{lhR~,2~NJ1G(B R%W9)s̱+H\ML6/sO>#2*$,АTBT>#?$NЬdM4F=eΐ4ISUJ9t+M#$S\uW^al5WYitQQA^u_6*MGUT;봕T8K}gh/ֹ&Uw�=Wtٕwޯ}xw_T{˗_Fހoava#x4a37+7c8dK6OVyeKJec6efsyg{6bWkm`aW#hE:i˖nzp2֚Wl?UWzk'zCN1\S[lIpOoTN{p6lFZōɝu
    rf	לJNUk5Vщ=]BD7Îueq9Ա!//>77aAw~[b}痏~橿?OYde)O7pIQ{yg{c^x#^)>~3`W=9
    `�y+!Z_Ⱦ/^f?FC!k!(C("(y*_rg=펇c;у"f5Nt%7-pۛxǣMcRr6<2BzX2G�R!E2Rq#If2,$\|IPR;yJTfde+JWR,myKᜉe/YSK_S\0yLdfVLhFs$ϔf5IMkff7Mog9]INsTg;NwrA=yO|SE?OT'-seBPu2	M9D	6DG=QT#%iIM] IF7zRT1MJ+]^Th+|SUC%jQzTڠ	,O0KtLZ�[jWUUc%Wmd5c
    Ys@?qWU{k_W2B2WVe,cQطz.;Xfֱ^
    jVc=KxN6ilhIZm*ha{њ6S-/YkYRW%nq{\&Wmg?FWt[Z?N]W%)~e)炄mzT4]_ p
    |`'^p)GX~o|k	O07a
    [X$0UX+fq[X.q[\a
    d61_\IF
    2Wc#oqSr|+Z.e,"|e-i^sf.K6{C{s?ς.
    }h@d/-@It&B;tN|gH9&uM}SԪf5]S+ѠUjRzԺ5kjNɟ%Q	d'[fvgW"nvlY̠lj?;VeF&-nxHЦwڛn
    ~O{7a?@pG\x-~q?3q<'IpB+gy]r\3W;Ns\;'yMJBC'zэ~t']K͵=_G]SzsWaz׽u]c'{DEv]s{y}9#'|
    x'^g<mpy-y_>y3%}gRj ]z^ٽQd!HF}{_E|'_}7Â}/_g~}^*͏_Iݿ__ɩ/?@Ԋ<@	|@@	@
    @@@
    @@@AA,A<ALA39|AAAAAAAAA B!B",B#<B$LB%\BxB(B)B*B+B,B-B.B/B0C1C2,C3<C4LC5\C6|C8C9C:C;C<C=��;����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/images/helpEMAIL.gif������������������������������������������������������������0000644�0001750�0001750�00000002517�12143164146�017547� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89aX�������			
    
    
    
    
    
       !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~,����X��@�	H*\pa*_$h\JČJQCX㿚Y+xv+x1.':VcÃ$
    EKv!D&)ӯ_6q4ۂd
    MYU	'jjrU:K+T"͝Nf<E61MLt%4٧^ߊM:Crw$h-OqKQYk+ܩj-RԪu,Ź]nd[n;ëWyI>3w1yb	T4zfW\S
    4_ih&V-D2.ĕ$`BFR	O
    3&3Xx|6\T~3|ݕX@|c!S<M#ZZYGZi4M($6R^d'N0e%xed
    zd}֤e|UWQSCYP5ֆJeN	[	ae3I~5x@h'FWƅvVqQHt 4Ѩ('FdXy$b&Ԕ@V[݇\儉u�;���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/images/icon_warning_sml.gif�����������������������������������������������������0000644�0001750�0001750�00000001100�12143164146�021362� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a�������b`awr}~j|fsη⣴[M@K?
    kTN
    GJ$wsrpiffecb_[ZTQOJ
    EDE?i2	nm]XWVH
    A=h2	]-bz{z&Zi&i(j&127m-D2%p4BI|Du@Ya\}R׈[v[mI:2̓`vّs=.()+*砅.!ӗ<,&餍5&!:*%y*vp묜*,-~zǟ���������������������������!��v�,�������v	oaed][sv
    iT
    u^PW\ZMIgXUGADSRQ?4VONK)#CnJHFE0=7'6*vB@%+8,l !5"9.:/Lt"$&(-3:cYf3cđ#
    ;��;����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/images/myjob.png����������������������������������������������������������������0000644�0001750�0001750�00000004644�12143164146�017211� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR������;���%���sRGB����gAMA��a���	pHYs����od��	9IDATx^]oG?edQ
    ÝpHn[D+XH 4RB
    
    ,
    2H@ 2\fv>cvgf߮חg!Eo~Y2k'4 �rz< Fp>+bؾTt_7yWȰ}?}:uiF\ 1p.	\ظT|iа[Cga˥o{><`Dm؇
    Q`NLO.��f50{kQD`ka&ZtNRQ[קsк;,.]Y	׭L^m΀A
    凉v崴yu]	?ZV6UFS崊ܖa5IU5)rҟHN+nm7ޜohn쿊[zVox:tlQJ {O+._{wvdof}!._#9
    'JD@eF҄ЗWMTy65!t-n6qp+Ӏ߹+nfB37=_QGJsf	7eZ,4 O>8|(ãc[s+ʀ9>WF%hr԰-$ɴEC&4_zI.}yق5<2X}NΕJbhEkqrG(PwD(>LI$EY6u.>&2߂[$lI).ݎ*P`cԳ1P
    OΙ
    OiYc9KJ?
    t0#7W,w=c1lVu{El=SZj:	�!N\t2$yFdWX
    z&@aUcP͡>;ϊTp56ʹ66ẎIJƜf70Rύ\8Bk;!GW6sx(m۸"ibks;hEp̤;yܯNhb*aAH< ,	iP&+U;LKfA<)$M�bxFi{#6M2V;&qԯ5F+kX
    'gvǷS0O.|"F�mvQN=&6ѢMc2K+e,Z"YqLz@*e5ESf%,M V2(9>d=Ď_90!ZtM{ƛMC@M})\UL>{5~VdH3YIA[tUL6>A8]{+c{n6IbɌ2BhM'"#\䯘
    2JPNˋ(e<Ҍ/j=57(i+c!ਃ."wuC+^lNqYHhC@$uӞWE~]ms`iߝq5<`cIy1mB-?+jě4tӈK:΁T8zQbZM;
    ׯξFxV#19KI߅Wh.h/ѕKbi;}WxBTbEV4mBvQV+1:	]Ӗt|fϺp1t|pH!jǸ)*I�i!]*J
    )m	լ9.Ni-SjZX.e`d:U:z{xN}gW|RDTZU.4b1f8eĐngQ-C3U=i_47q8a'yM<mɊ4zpȺ_BC1T.ͫaYB 0nBŦݼ/h1>Py.4`keiiw3"B3d+bo�2:}?}*wSK	2c%:]v3;7=U#,{__.:¬CF$2́@)]x!	W]h2Afvf}JiQ+pDAam܀oeZ"rQ
    _Vű+46j /ΓסV8dOj$x'"|p9<u5ct"H)bJNSt#:?yG]tD�96<ʻ�r0l^yӕw.#`ؼ +"\#iGy@NWE@Gӎa#pm@@����IENDB`��������������������������������������������������������������������������������������������logback_1.0.13/docs/images/cyclicView.png�����������������������������������������������������������0000644�0001750�0001750�00000112067�12143164146�020171� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR�������*-\;���gAMA��|Q��� cHRM��z%��������u0��`��:��o��IDATxb?p32�=+o~hbl
    J	fdhQ0
    F(`|� X�3o?N샊(e6\~Q0
    F(`�bhC+܇WwBòؕ`Q0
    F(�xe,�_+sjH<xpU?hADzQ0
    F(`f�@#
    Z
    ](*dx/oD(`Q0
    F�4"Zl!A[A\ǯknX~:
    F(`Q0@�&
    ޒZ=ƭev/6~(vQ0
    F(`j�@#
     3K*~c7\)Y`Q0
    F(�Јh2Nb9ɐMӇ{_liQ0
    F(`�	|N( S 0>Z,=.K	`C fA5aXIX@&% ^q?.?@@?Q0
    F(`Q@
    �sA hh؇E؇q8	Jhy(v^/K~1ĝR^\ZkìX՛#&\g%c1r+֬ZpΧYng<w<z.]p\Pe
    w0K^L2ZSl35((/O;_a w[n$(<	AxafC,u]
    >Qu\;a胸:*ﶼ+sGR_H!XM�n 8sXSۑt{D^.;~=,Qe%!k#P'7TPZ}Hƈ,iiuBs�TF	e$cvC/f00�읱
    0sMŶNVDuY(.8TӦmR[!d	>{Xjjh0kT޹�UQiCs믺/|FmH~\bC)ȴLH)ioaNz.R
    bm荘vwb]F�K3?Fd5`;s  HK�vXawCJ%4P*LĊx":r6qܜ9!&7SEU9MSq�jH,όu<iF:;hoMOF'^lrT:y>כih1yhk!L>ey_Us9_<>m_lqwP;̲bmMЮkS()`NJg4om^瓂JN.X^rKAAK�_av�AH,,,``ea	xRleGPSJڀSR1tom'yY&7:JCd3&	zi0	k۲}So-�^U
    Xtb`c~.M0<|U]ʨ"ԛ~iVc	K[<ljV>L®q"2$U9 wQ9qrQ$,Y]ӬW3*>s]-ܡs @`/~`y�
    b420qpwpsq"q%!$^^KRut
    @DO.l-JwF3t\8<E*ɻwdxƣ(lճʾ-}3&>qfǏq2fSpو#Hzlv<ZA�kij/34\xIHrjfxlLmχeui)%27<X et 	30͂VHS>
    V
    "_AA[�n% T&	It	Q-ttAuuTUi%?6g<03sHRYƸv4>�Um[rnOMwԵb|RvQeb?`[UwL&Ocδtܚ,Fַ�B\F
    :kOgꊫN(1M@o]y?{g~A ˧�57s4\PB8a)V�,&3F֬&)"d$ݵr> @Mi+R	>lH@F6·չ!,B̯A7t*bn*$p/+@?w,
    aN.i\l#iH`pұSg7G?v{
     . BcmKO$kcG?=q9K@O~+¿	y{kP>7*,;BxFJgp]UKSw5c[lc靚9
    (QjX̟e(&_+@|5%:%ފ&[<aV<Td
    ԳAu}[er݅a[~.}kթfEy#{B&2Qe?^F ;A뫒a [af9*	hK37`C.S3<lXfSgJP(
    s:
    P4$mU̝:10	1 !uPR78!iӁ7ґ,Op9m)EO㳫feQB<wԆuw?NeԸ4.n;j)+0rt	�4\u)`jLIiXAiWuzyEMj6;c̔b)OB\W)E3mGWjC~
    Kg}:^zVR}WYPloh臃ƙ8b7tGal�fhE!%!eT&Q(%+|5p/YpAB
    VUAA�"}TކT@ 6
    $aRZ.0Hp3(qtF�+tqSGbZU(PM\o||G^fX}76;qت,ib[q@zӰ躲{hZ)J#,*S?|AD1
    3zI܆}9
    JJ9+j%NtpVًnx+Ґ_ېpUTu=׋=Xb>LӐ1
    (x?vU,RLWt@48|,T#,ك{G!hkaBUc41J
    k&Sk,@?\	 @ -�{g0GmZM6ET)n>>O* H-RۤLZ~ᶃ?#N
    ,u?[SS>>yVp>G=isy~	ñu0N]_`+=VZ�Pnj
    Mv3^'GC-*W6`pU5tҮޤBm/)5oJBayhOwz	B./gSgeIy#Ggqa3j6<Mc7(E$dT12&)%^,UPAA 1(#SazԵG#hk
    ?,+DŽⶬ`0/_w>DQsgn3iPM	.Z,,�6X2<6"MHAatӹj$V^;9/|gg_[f|*�~Yr_?'4uQdAe#	cAT/Ƹ\=C
    8&D琙D֋!uF~j6u_.08@x\L '[Ǘz<nER,eSC_Aa.]'C99e
    3'ΜB?hէgm{?nk~kp,o�*܍lWʙ[j.2M1cc9`PȌ\C"խQ5�QdT)
    !QQ@CV _`q(IC~AP	1�R7�\�#p�biRb*Jihq"$<(7H%V!n)_mUq'Arq*XhחBg^~ţ3RapMٲoam[Xȩ.>[%i@k'8+i"$wy,<Z5~40@Eӊ7+FuTi+K)H,5r<2z&foms9h(!Ҁ>t  2
    &SKI-&8`z&!�dG]eѿo
    @ sicv>ı-H !v"ˠD@P
    
    $((H" Gl94S\w}Ө,." ǃY7,ts .x4�<r-Fo9th
    ˣ|.uDD?^<['9qC--
    Srw<i&[ƠdfjitVQ"nW[c=<~l�Y!;[3Yg<.a;U<D
    4jr("C
    &:�fb
    tLʉV$NL%G+yX,nc[Su*MA7~~BP(
    ?[�Ο'a wז!Đ@LBH4
    _A?@h-w޵n&{{q A˗8HSѯS*>X@@iLifPlY_*2M#D "2g].K9ӳCd=6;DZdΙP<fTPE4W/r#,*nK59=ju*P0V2>֜:fBLHO؛@,l`:UinOKIDDš{
     zP}"D�&ءmbfţɒUEa(,ŵMVPKm6Y})AOй_gN^F7EDHHHOysi°/mZJ(Z1"!<��R&ѦVml:1tuG'>#@*RY m#Irj)\:Z;GO~B{f%}a)25rݟU	Uk^.LP&эp~yk)L\M;ek[0	u z Cs.#Dr`*lЌdK;YD[| 	uؕ!0I|XIxC1qmn�K/mJ#9Ր
    4e��ۄYXtP�
    3ӅLVxjѶzvXQ|\F繮;ޙ	-=^Je4#bŊsYiL2)IFTfQnJ7)E.\*к4ӼfI+w*ȁ	pܫȪWp*R3w*IS�u'*c
    a)0=x{p/.7ַԥb&̜ޜSVDq[f1I2ey賫#t4,@3gEA@4|Y+-V``'%Ā8p\O⼶iV^E h8,edE٨ͫS#N3�UQܐgB.LքRY$KXjH2,""=FgX`Pam| CR5iC]t8k_Ʋ_Nv~{y3gi lbn<h0B<
    iZE"?^P11nfYN}~4|X`ofUl.r|komUWŗ2s)Bu)I捓SX3mHѳ+㩣ł.ܖ2
    }T=kx
    H?-
    dһKw%73�DXhmjO_ܔw>]o<!.Œ�8BG#t5>Oѥo/LZ&jef[YrtxҼ!O%NaoJYt!<KIĖW./
    `RY`(W{+#�gWˇ4M(i~R^hHt?nDX,ۧH$[/& k^331ccy|b]m~S]+&XI3>[yQu/_{(!0MIϜݹ'dȇ,9ԅE12cfeW}O+?XUrnnvV9#VJ~VSfYY}SQD]۝ӷCLREծ2,N|٥ÿ&c`bD̪nkޯb,-׋ߌ19'o>vnf
    
    ~Wffdϧ#=oߠSﯟo�6m75`�3p,'_fV;3kQp֭ٳgܼy3^||*r%@K&@4Mre?~b
    .ů�S=ȣG։_
    D3�_d.g7
    F(D�]oA@WC`Ij1޸w
    9G;'
    \Li-EEwzy3f&|<>n%ş_'!)MUxSeBvgjƢoĉknItw_?Q.g̶HbpP[CQ$5qk~O.)b"4/Byl<PG66n!#ʹ}+3r-L[{"Ocע+_ȿFyk}W)BXOFD˘}Bq	3+@Sx0VݗЯ!ҦC:�['̜r穁[15aJ)Ąo6/3JǗ0p<+nZk�JӭVlJ$@^AfrlȕJe1Z.8ӿ8a	 zm4\d>hK\e4uC UB׿gK-L&qKttdݮjV(ܟ0JP*t]z \;2f_uW]<,_߿?!e'bBi绂#@Z
    &!/6nĈ8x&
    n7#n!AV%]v^FsA�_ΔK?^觝쌜_}Ke-I	F?֋nWЬq]6Jv:7\�a &ip޻n)	)_~|J~}aQ`ceЅ@'mt-~汔wR``b`FoS8%DYMM
    
    [`HLLѣG@+d<|PNNH\\.l˦>|)܌Hn%Bh��
    i===jmm-
    ;A:WDQ0
    F( �`V0Mb	r*_|_E(xi =[[D&$;ݝ1P{k~B,|;*v}TMmުʦY8
    TEB~E&3v/!"jV?2=s	 }Ԅk˪z,&ȆSӮH-\f#m㔱LIb:aY䚦vfU8زp8i2L2},]we_h0<L/m[d)WRSa5PlR\_U
    L+ kB;s^Ku<�Z-2ޤ$]}""T$_ZɤvMFVvѐa~|=g+Tӧ�]J@Xŋ,}^}$ћ%XRVmL15d7n6QB!eA \x!F>]1S(	O4R&(4zeX�3?UY%xWp@0e$	J]c]łB&ŃEİG1 %D@�<O/ ft!i;n̰OZLۋ)	AL#26Qkv3e%Y<i^է34}]`ԻcG/ٓ;(>^˶w+]{#0x~.f¦nHP.(-
    @L͑#GboCVKT~-h4@rLsm|U?ۂOKcOU*Du~4Za=ˑ#Û�K`ǟͽBM
    "ФBtI:ts
    Y<ud(TҒ9g뙫ҭ}a{x>;ʙrwdŤU]뛀2nz&jFCtt->}UD4,ծ)tm	c?1uY:55�N++t80]5i/y%;mDKlskb�PK@R~ER_
    9DEc|G
    b[jq࡝H (IP$ɴȪ(w(>29ADA`cl*!IQgfIօza:#~WVau.M7dllrl6d,"L<oOR|M!(^28ppzӊdrgccxm㸝)(YڵL&�QqOs?@&ā8©'mF[B3-۲/iظ628-?Y>XXdm~¸c5y+/ԥη"wc	"`v7E2| z)k$>G\hm&d@=N`J@R5L}H\
    ',I/8!#+pMo5J?S
    .'86I)J}큫E<Ofp++hh#s(рڀj1vͯV9iI ]%rB\"Lj"ӡ#y}9Z>^WX΢GwTz&+-SA^n
    [jRL柦QnJf-ADUq)RH(˵Z"eSTZVx�Vټ_Js_y^'N?eZVClpIGۉj|@ovw0qGϓ?na}uw\Ym>u]!WH?xsϮ};[&1>>u _~=s_3	HKE߿obdddUu�bp8847fiW7M׫Ka7
    ԟ}fRgY_^j~ǭy<`L_|x?qKj︴E7z"w?ܲLcg''+#;쏟Tezs7_s_IXG4(NXAiŗ_e~\EKMQ�;##3xIMo߾CR£LgCd۰swѬY-IKc+ ~Ac@oooII	3�mS%A2Q0
    F( �x#xOb?+Ū`Ǝwrڤ12,r,R?~r.=:_uy313ďkxa~>1>l'[y'9gSV}qEE2>=`ǿWP?ɿ@yj)%8x`&c_׏?~`dᅯE~ce~_01?t귫Ll=c__>^r}|7ۗ^qrq2gW_\n;Qn&&NvY>%!Uf&.Q>vN̯c}ޏ_5�[`X`Sf„	..%z		(\Za@Ef9s怳ӧc 	* j3 ;hkL-,, `J	d�G(`�kAwiւҴxHEecRDDxI	?Crǀ m Rvvdef:`[%~`ax<wyCj$`I!O/$)$jHRop6?{B}4L
    ZD/Auʫ =z31]}u}}%.=g$O4lRΜ\ϙX=h}:;mt2;6\XVhB(5
    @%,>h-MOm-r:kD׶|'Oq={茼۲ٞlo'MDf3*C`qc۶ӭ^d(4M,�DvT1ʷ5WM2}9s>{I.Kdኂ6m
    sesG_cbN<{EZBK$hQUP}S*zhphECaGtJt!JT.ɢZҟRD]"\š#Qqw-MQtl(EݴTjq(U!X!AP7,-C~
    $P% (aҐG_{$"Zg1Fwlx<
    &L'^z@I("q~yM\$,hN%6;%ۀ#.޵kb/Ƈ9UsNp~_D*M�{M`!�(#L^n=Ba-p鞨&6%[D硝v0wK 42W3}:0ąZV笖P(K)}Q}M>8t5fsZ^CEV"/P"8LL4#mB+vfר!3.GX9?ۍߏLz5Oq$Rq6x+%Mo,7
    RS4N=~骂=%|0]_t^9(bng\.�ÔJ6QkJŻufZ(˔.h7]6EPJ8atѱn5rٱ+JX,Ѹd2Md4n7⸍ @�kAg&3nF⶚D1*hxR={[{oZ"ك{PۍF%PmIvvgi< 9>
    ߪ}ܭ;)<to%51"4Gf`I#%R
     
    ޏSHɫwA͝%A10\NۅR9I._V)|jB|[W镻(egaa>t d&�=IMk/=:X<''jK{X_ۦ7j[
    byfpfDa�:aQ pw�'BJfOtF:эi/^u#;{qƻ8TN䭓{f+>nH"`"
    R?Q@{bb9b3
    iO!�{gH|LøʸREzv*x?={\EmuNd3z^EyN	yISxBUyU)yQb+aBӑGZoMKU'!R&ǝ<ޛVIW+EE$LB0Q�Euc-`Sr˟b}2i,7?E0=ZA94#B|qx%2zUFFdr
    Q`Ѧw]ۃ}Jug$v'7t仵?,˛,nϏ/]#(<Ӓ^v	4:Fk4	z^tW>4w&6V{+l5"nT-(uE.X~6B^
    ޘ0 ۪!}ݶ';{(|--$"qqфqt!FI@#Җ~k\tg}M=J1JZҊ*Ȅ4W,_S?RGYZHR+LNB!4U,eZ,GIb}bR,NR!\b-jIU䅵jOl4SaԲk11a3=$&HXz6		DAeyY"}7o#oztwa.T!$[ϓ?c؍	!kӄ0vptb!hBL0tuUJEh)/z.d=vJ̨#[oҀ9gI4(}Y=^pv/7'''_%�{g `df7/>GeYȜqA[r1|IM۴O,,\Z``6֟"p.MKanʔ^i<ˁVjM`[6<~s#ct?XCݣ2r4SJW#iI>F:mv;+b/)M߯Uܘc,f:fu\,Ba	 *.H(C36Ucq 
    睋ëa쫢	뵺``(@A5C-@(P&q{J_lf;+gG6bQ5kסw,rY4a˄-[QQQsILC
    @	6vwC&5F&-*SiٺѸg=sgL^SONA !s9*IF
    )	~M%u/Fcm�pCeع�Vm<Bv1@`1oBL3xvJ}e3J9$Tgx;T![jSwEbBnU1{3RVY$( db~σx1tކX嬒nea3bLgL/?P>5| ]jMkJ%]gp.)
    և_cb˲:v^ZH+K+>`u�kJĤZAL:Qct1.puttrprYEA)kږWpn`ʧfK烵{�*ߋxX]&>2䖤qh
    _QúGŗ~nj_}m)Ų;Rrܾ7;Fv\ܸצ[S }.ZgB*.[M(nز- @#w~!A4&$ђ(J+dt*#=%I)%'`dA.LB<$,Tl܁&yUฅZu]SDCM;f2"ye,
    + LRyP(
    _{gi �|{ټ.9QEb@6jaB
    Ę1eZ
    ì_^�yx@Ky+4
    j|;rZ	o2`.YS{�XvMB}
    1ȭ>L!+UZ}h첪uxX�|>BᵽkN8l\6L߬ۨm[6c4dX+�D0EHfWcT@mҳ{Y<
    gҎop6HfGmn:R:%𜂊HҖWÜ&MGJQv$!,E▩Iq*ItC1a#쟵,@3Ip3mGd)	j1W71<zb $ZQZhigWf뿜ÿNwuZ]1g4{J/z<~:`PP0騃֛p'biK)%7tmvG_oJqY-6I(B`㉓/RnYmf?+`^4+[8S]e\t}o{+3c,Q.�8@H7fb3q)_$L
    wSijB4G쯽3Jp6[LL!F4ih�?S9XLl>$�bC0}|| YJHHHHHH$a�iB.77'/pј7gFAL (ЖrN9ހ}{,~?`Z=i3\
    gv6	ȼ9d]HՈ6lP;U2l *r2޳CQc5>]]`7YM;EnSx%o
    <dӾX&Zp")_Vj\Se*5-S`b+R=uV@FdnPJĕde\zԅ6*ff٘LvLY&Aul 3"@& jB-I,IO<^^y<;_w7+	DQ̝;#B+*rчB6eE-z=BD h"Ȱ#B	iMq>L3k~pp8O' +2]va=wSYv-b02IZ#9#Z("^2?^geeD9c&5:0BQ+ľV:|ye|!غl.XjbG1HZaYvyt
    Y(ULJb1KN=x,UU{�x9i".ҿO{il{d|>Kh42RNi+t-˄dSԡ~ʄBi*=0
    ։Tn@ݐ!b(/68+p8ػ{(-$DHjDM&~dtcv3WI+JK{jg=g~?4?;Ĭ!D�ngק�n܄fI#A1»K�λ-0>R=Y|HVv(	b}.vIiA:Su
    !ZޠT%kAUKys^Y,*ǺVD))IiyUDbL;=s5i[S-YZNgHz*,#ЍYOa$BraH2D{}={-Juy3|觖,\JRT*}ν$D\Z)p+
    &l$MWRO„Qbl\-~M_4쳴^9j
    PPCH&W=\nY@ȴ\`&iq!(5s
    t[ȮN
    P^wgsE썛}:mU?'	lQZ=)VpO$Yɘzq- [7,wK"?	
    4#yn0Y4`e2˶-4%ERi׺T۫B\�2"-W#E(TH01i KVi5 =:әk3 Dz0�dkL&d_;w � qDB?%Zh4146"Bq	ʔ7KUogˋm@4
    N D	Š60u@Ft`!ހʓ}J٦`Qe]G~Z^1N'cn]wgVwQz9A
    =M4
    ~Q]j,t=3xuP%diW\!O&D!KaČ[<f;kzt?y4dch>"(y뜙/ѐGx.<eVi1I32ۏ5i2)%F[d6HB&D"H/?w.
    `N|\QEŏI":;*"hhJ{-w&Ĥ<o?3d׮;I-V-Z	aSЯdUZd9vdnx2P´v,m8TZ=V鋾=Նk\;#z~+T)\#E?Qm|((Kڔ$HA7߂kV	ƠQq%
    8^|v9]fee-U
    kB"ޮmS9lMoڤ[c,1CTԦiRY[{3ד\?Qrfs;zձO
    @ /; gL6-oz{'*ZJM66٫\f==ü?-<ݵ*S]}0םu%}ط[YUA΀n8%$U((9̶]ZZvZin۷m9\]kFGB)^gTM�vq3όѫzSh~
    Ɛ9CMS w.OM$>!:!X[A:xEF3uNx+Y855w,p(Z(C8۠^g{P]Jb@Gƶk$D"̗�MK@;iRM-5*"(HR
    	6IΚWqX==[«ޕGu6% +-=^w6FNj\MkWE嵄UA(?L?[1"xt)?*V!ԑl"e8@ ,TpAyFalzOŁhB"W%,%ݵrvܿCFiڿ
    N.\*]$4sy2&=#Gl6.?&fs-^/z_30B
    Yb*ȤF]$sDI!#i?|iQ}ʜ`\V0$[kQ\t^}$ŕO#xA{A[Wt2q3t3"dB?_j]ݵ~~EZ4̒PNa,CE,yFFNU7WЙhP!K9+7"R6kT&hBa5f%ck^4kM
    7?
    ޫŖvia	8d"ajAFNC?jǷ=sZ9;.ߝW7r?giz2yGZlҜNqB6,hs7;~Զz%`"	l" LϕJkĠP2ޘ*AO)'x؏;, 
    )[yjBrbdddddddd_;& _
    H@h�K4A$DN\03x͋'/	I1GEUMl{޸%0$sff2_j-5`	/Laz7p԰AxDՙ
    ]=
    KjSi=V6+z-څ;j8x0\,3z .-;{2vYT[}^X҅5|m'zbڸNjeWթ֧+A?IV{!3Nn7x»;mRN%*�Tcc H6R(鐏gVIs Q)qd	X;IL<2_ci(BN3ʿۧ/Ԭ*%6UJ!b<+j!Q249C~8֖-"RF
    kNNNNNN_ط&83CPEY	U<>o!&xHn1APRҮݙݙY	><w&ټξY,\�y&my7{mal*k\y>]yqHy6h>g>V|1?wBa~+!sb
    ķA2w>_y~:9燬4[6Z_&Wkf$`Ŷ^(G{a1{lL	NY Z%K^e&'=q$qJku0R0x	=3<k=k+hΨ
    f-jG_C.;HE.8.q$uc~ά2Tl
    \dVɣݲ2[	߼SU%FP(
    �KKa[4siPPMQD[P(ŭ_]7 -R41$Lf:3ߵI_8l4,"+'wa,!လK*mH36^/ocH
    p&+ɪH O]Y4-A25Gg�޹(XJuh&nؓC{
    `<۟+O�[�Pm_=Rٮ]h<ŗaYԝ[p/>k|ֶvA1RGPJ8
    SAlEmnY$mxa�qN$	gHV1:iZ4	@)h,o|H-j,9O˨_*�N4ƑҏRH}x@}*ϔT[Cxŀ"rrrrrrr,`z8{n]׵SBh&&}01<ģUh0Ys.Dܠ۴㶽[sr>6E"d>d0WE"sDkω}*)|yz:Yocg~ASޫN ch{ے]>~4q\돠U/^sk%7K7B@VwvYu9|A1OKA)fVA
    {gq
    sWIiֆON>n~7|@ulPkfi7p-ItVOJ{sx6+br^vKwkHR2i\0l#e*YBPx/	]f֏Lرx4nKS�:qoWك8l9O
    Mq`y]#H$\`^v0�؞qBE*`D7xJ,X -65jUZQZhJ&؞lѷ8~Ua<"t<,byGBOh yUwliG^qƩ;6pν{>{R%CjasQ?@QnrAIlbyz6
    Tonl&R	 l
    :MzU=No;ëmR
    _VOYۨŻ#ϋL[
    gECS BNhn'~Y-UhW
    jN>EI),8\)jGa~NHLg+	2/Ɠ랯[~L"L�;]C]3EAQJ3P5ޟExbXw'�;8p\b[Ď2M7
    ܁pf^|qx
    QD(R$Jo]L+99)c+XFk;}Ӛ"	mq
    Cϱޜ`$mYX+U2rtq%$^"u+&Cj_@d
    ^o\^DpJRvP)#'c٨V8hJ,|A1
    @}I4}0xv2}52Y8ۿGwETܬUͣ*QϨ{#:
    k!|靭f6�G*]:h빺;EeCpylx3
    e$@.�C.rE*j`q<'QLD[YVfM7$ɊLnMwiæRT*O}޹$DtfZJk)W\)~_bb\sa4bbxKmg=f�,N"Aܑuk;@7Wb4ޢ9(NŊ,
    p4RK]l7o6r7xIZ~'Vsܻ1}V![WM+�ܟf4\q0TFEeXs�^+cI$$j+wVs T02m0iW9|Np*R-áYTf%
    鯟O 2E\cuQr?&0
    ֻc 2`7�rYm?sЖ5q/L	cB/Q,
    <dxMHHHHHH
    $q66`ɓ77?&c!р4�adm)K'o`@nzQ+IjMۄR	
    bxH	`2EQ+dl`5Z�&(Vc~Ea|n|"dK ø.aAΩ1{߳\rj{R- j>kg`س8VO2O?7�"di0I\hW
    (.52ͱ3z
    D5ĆSe$M\;M1X1VD01V:KP~ߙԶRE5'c=lx9Am'鶖ܕ9VKH^Zp8ɟ�MO0׭^xQI@"	yۦҵ>д͓O'@	j+)	|Nf'Q)[͓'CRy](A,M0iN<m֟�t.i1{7ojVtyl˝	N8/8/]
    g`?%}?mfg>ɓ=~v/tv"!X˦uF!؂N;^bIgj^4^x1&2]d7;IxA.=i'E,,fheل$2׻vG]gزZU'TB1Y**.{)h4Fskip65֍tN˴(]kA:P=76=0ehn>^x̫T|ʋ-PfmPTݯE
    -/cwrw\`e1ƍy囷yOIzT
    dM"?
    _iYWݢxdHP%|l3x,4Q2,'˕tG5Fxuwսimxele~e(	=Ѭ8	uE]l pcux?*яT!X$A+@"ZJ^7*H$-�{0E<4GC
    4V0؍T44cmG[mY=:t
    }}uzQ`»\䴋ϧVn{`S\g>8dAaZ[k|#Tb=xEQF}l(7aǦpe<\ZXʾ	*T=J>%Ƶ	̜B\kwMsy\ވNJ_e'	1$KBą7c6.jq	WLe16ӢN-vuQ&|9�)]h"JTB;;ȵKX,`0~`V0�ν[b4
    l(޼n:1t;aܥ9a]#Z雊saҏ֦9Zd	ۊy\,.b\~b`uj.\/_>z[7Cn[\E02yK-L|u7}piHa,r?B$,3,Vph&*	<�%wU_Ϡp����M0؎IFR\Ā:;RJibPu/ttw"4:6΃j <iEz*N^Z&}>U,Vٜb=N5pe)'mc+Mt7~")#0zz}67(\YJ^'Ғ"uN|Nk\2bfnje'[/x����*�;w0@aI#*č?ҍ(5%iKD[w|l~s2H<8$	o,(fΪF>45LT0l[VUﱹ[[�K)^u"1D0>E8S?>QS
    dW5(Mܩڨ6qꨁ`|-4�	EfH|EU4MӴ{A0m+JI\s'	M#.\x�N񧙙yT1jK5o>NdɧBhmקq6Z[%뺉XIpnд5A4`P9:M/m6}z3_k	^dI-J	GWZZu|iU4e@_=\����-�{粂0DѴi*
    W	~A
    b*5ϱƽ0g;dnyxlX'UX'91W7={+v2W{y<_N2)yS)Bάn,wl\JHqe-.[]yVˠ40skJ  7o;wA�C_*#N|HO -]My5̢KrdYA>s18UZc= 涩/>mBTHŦnb_:vG˸HfiCܯ*Y~9Rpy
    Ym%EQEQs	�0Ϥ8vV@�L,VyU֨e..>3^JkP췕a̵ Mv,u煮,kTd̮����y`Q�A ?m9{v,$pCA[^o8ɦԤU@&md3v*VebfV���W�ց��� {|E?��l$�bhQ0
    F(`Q@,�(`Q0
    F(2� F`Q0
    F(`��mQ0
    F(`!�h:
    F(`Q0
    �(`Q0
    F(2� F`Q0
    F(`��mQ0
    F(`!�h:
    F(`Q0
    �(`Q0
    F(2� F`Q0
    F(`��mQ0
    F(`!�h:
    F(`Q0
    �(`Q0
    F(2� F`Q0
    F(`��mQ0
    F(`!�h:
    F(`Q0
    �(`Q0
    F(2� F`Q0
    F(`��mQ0
    F(`!�;�� 
    >B̮Vǽ$Elٖ}��0hD+())Q@<XzhuQ0
    F(�`H����ݎ@w
    ���mQ0
    F(`!�h:
    F(`Q0
    �(`Q0
    F(2� yv# hWQ0
    F(`��z٧_-Ry
    4rF(`Q0
    F-�@�
    QYW_~d<SN֛-�b<]4bDb[i*9yQ0
    F(`P
    �yq yW޻ƾ]d:
    >ԙɒ"@)Ȋo "'}wG(`Q0
    F
    �!xdnFa&d\7j
    JW7xD~o�Efz	DpDp闸h:${<屚j˂@-tDreZz}Q0
    F(`0�PjeG`j}ۯ	GɗULHxlY3iD2:vdj@"Q0
    F(`B� ҚWHk[]%۠r\y֛V);#.E۬lL "/fBD?k(FQ0
    F(`Q@!�x]v5TD$fIHQe?�Ӵ3^�f41}G.8N`	`	�PjJN ߾BT /.r@A`rV2d!dE,D=!4pJ8ȵD3F_	b
    %(`Q0
    �zw=%%%zHupw-dwv(`Q0
    F�@Ciu,f/3u(`Q0
    F�4Np`alЗXnjQ0
    F(`@�@#$b[ћF(`Q0
    �׮][z5-`Q0
    F(�7lQ0
    F(`Q@6�����y�`#DeݣTp5v(`Q0
    F�@ak:իG`Q0
    F(� FO`[o
    t`s:I&Bڋ1XD
    aׂiIkxM
    Q0
    F`�-c�@nH)0FN*~Sb</(_LbV/=)n\b:G
    _ẏdN4%:O,
    !Ds�ݰ5
    FHd7Y(o`@)IW#KyG|˘(`�mR
    jw?[t}]1|�#`Ĕ¥8$h bL5h.t@ZLьůF1Óhڋ5F F=M|I(`��b-ŖOOy_yH6=K-#05Ɉ1̆Vh7\:R
    uXĀB3L6"rI�0Xe tv(`�4G^?Ku3Q"ۣK#[F83
    U
    1
    "+xb&|I2L<N?
    i%Ã*86TůQ'IBMQ0
    F��4ͮr۬ l [t=s] =|c1 0;l2[oc_��g�5B fՠB3-x0
    0֊?1΀MIZ�Bт�W`'�;~`!�@Cl�&|=gl r}`S/$7Y{`{QQEK5'^.[x �ϸrG
    ~C6.NQ@)f
    *`(�@Clx7YxXf&ΌZMqȌe_3VX̴wB3H[xaU/Dx Vbt*%@dT3I~DjA$h2<@`�o9�0LNzx'QHHֺxN&#%ؗuvq1-[on3?J	Cg;f
    )zFVʲa6ш=	u[gY\FMa>%'{ӴUaq$C'iQ-R</&)$oD1D#~�QYJ<\5"Ֆc`VR_.VX׸c#ޝD\,AL4\(<f2$+3LF\E(`�@Cikːy8njS/3ğ~qy4@!QdH!*5jP$7b*�/q7ز{%h1^`Q0
    F(� =Ut=%%%z3`Suo6|Vx�W0
    v
    @@"<FkQ0
    Fu@�
    W PDQ@W0�r`4F(`�kR2EY`Q0
    F(L�@#::d;
    F(`Q0@�ѻzڵիWQ0
    F(`Q0<�@�v���@tn?��6@�
    s^G(`Q0
    FH�4x`Q0
    F(C�huQ0
    F(`�@Q0
    F(`Q0d�@�6^G(`Q0
    F�4x`Q0
    F(C�huQ0
    F(`�@Q0
    F(`Q0d�@�6^G(`Q0
    F�4x`Q0
    F(C�huQ0
    F(`�@Q0
    F(`Q0d�@�6^G(`Q0
    F�2�kQ0
    F(`Q@sl&�`H����ݎ@gh^�H�4x`Q0
    F(C�huQ0
    F(`�@Q0
    F(`Q0d�@�
    
    [`\$
    Y
    h�kpUT	q(@@SW@Po6eS
    ōtxDX?{ͯ_
    VR$iu� FG^G}Vusio;�:fp.MQŊq(G$/ %Bͻp.$�D鏬,VF[0-j/Sve9}3P1ywsC>`˕Q0
    F�(>X6Q
    
    �נ.}=u(@pʍ,u74"}Ί5H`[,/J	/
    ny2@G(x�@�.wJpFZ8$hqS~`Uն{aIB+9H ?N_ NR3]9Ҧz@PU|Jgq`y;	\uI
    @5p.ࢧmM%؁~>pْTY
    e..Nf4]_Q�Ga&`RHsH+#Pf:H�&$ۗ`7a~\.lX;8򇌔<
    F�y4&@;d )ƶfk Xo.>?24ȜE$PDeu<r~[|
    4%󀊁CK7<w`T2M@Zx.6\D@cH@D)H/wx( naAV׃'?H20lաI!GS/MdHSrWR8򇼔<
    F�mz<+
    \R_31|o`#L,XBv]�mz<hPVYnTٔO.C8?�YY!
    Y<EYK]`W5%NB#u5%whgRl<XK�x"3h=eO$!Haͳaכ?_PG(?�e�ymEzde5Le܂pa
    >!/hD_ʈQՅ>3G�
    6( @9U*{(-!/xIB5Emwb8?tL�@Q@o@ _x�?I
    Y^/=Cۏ4Qu~ZPT.!u;d
    `\<w~'(ȴ�xYd'RTݏ'	56OyY(]%Mɣ`(�ڵ(r�>v^1�<tE"JʈckG}	L|I_XaE;+rd֩!y;	{/~Ydh䑑	}OZُI5~RՓ?!xT礒3q2܏5	ezl`yy+VqhJC�huw�.^uCSMU4ˁKP`q€@p�]`m}'"u _
    n"<sCȺXbdw#]y|<*�rR|!z2%r~<IXE@;_Q0@�. U*Wf"M:	%X0x!|0Gj<A_ jؙ|Q/4kMx=�j֝xr8E9>.H	؈s0O|~YZnDt6ǣbΘ	�r,Pvz,~@w`Jӡ~wAF0EkOB@~{U.
    X?)yE�@h7.tl"EK6&�}@qV_VF:<
    η|�>12{GK~?}^ 6]bE.
    .s+KGmeh$CAY%~o3=F`|2CbP
    s?DlMtOox?Q0
    (OhuQ0
    �`H/KKwQ@M0GW�]60
    F(X2}o[B�d(CQ0@�n`,QR�7qa6ȶ3`0GP�4l`Q0
    �gkAٴ]ې|Q`є<
    (_6�@Q0
    F(`Q@'@y �v@��� vCm��huQ0
    F(`�];$���`Կ+L^@.���; ���u;y�`#4x`Q0
    F(C�%``j@&&hp-pq"E*
    ڋG�30F@ID;VdHŤEQ$Hg
    "pï}�[9� bBM=)BYyer슻j*xy,<"Hr_f5$9ͭQ@
    z,3Қ}m_?
    .Ds;尶LhTB	b t|�ԍW<UԲ9$O95o/ى`0IR?
    	(Rq0	s>p%	
    %ڱ%@*&rZ"=K|!j� �{֖0vSc	1PhllP	xugQA�
    dWh:tJpguF\&z!iuz($,75g&FRpI[tCɟ4M\(Ėon)�f PeӑYF^Ge,BN=ko_tediHھkpeU$YzD._3i=,	\4
    q%`!p9}kI(A6)E7#jRIo*0ǸdRo+9Alk%=FÁurdD]Ż3Qb2"	$pl9zKWDU(#E17ͣA1)sO�
    +qÇEX0a^'.YL@a{QIaaGw*WF(֦Z5fm4$
    gԈudP�`o.֩e,yAӠ�$6-ԑWF�fl4YcZn@@E"@�
    K
    mbaJjGnQ5srsx�Y[&kYRZqHSG$Ȏb�KvZh0<ک,xdкQ@6��@jo=0̂&Z>AWlkuk
    >{Ks+gkGȏkZGԲό|פ̌J8aZ9}zB-7]Zkb/X2Ųܣ�.jFKb}+`ТB0K`IY1t1ɤm/-uu0Q0
    F(r� Q0lh`Q0
    F(T�4x`P@Q0
    F(�h60
    F(4`Q0@�
    ׯ	`Q0
    F(@TTB�k$����nG;��H�4x`Q0
    F(C�huQ0
    F(`�@b+ &&azԲQeq\`$Ix'I2ـ>rxS\E*
    ڋG�OM)qUxD5�2*)z)ty#1T
    +JR� �ղ0m!
    -hv'@I6;] _lr_[˸~x=Nu_COyA&6+.ZPn_#`YܧPI^Y9L%o0\ȕC@zP/R_VqjCQ-<	Q0*,&Sء h/]xP?QQh#ݴGc(q?U?��°;3Ra4:ㄬ[;3Pʘiɼ6z@{@#OZf!.ѓ6jHQx'IDз$@0Zn%d,<t	11K[uvDSYBr:D^rE`r�a?`1f)ݺ1ES)ҹЬleDwɃ~B#DchPQ�U4UTjXRL-H1lx3]Pq[g2^6TފNc(a2!Lq/hCvvLp
    ~�fK)KLb"?^rx%ז!YBl1yHl>;Hck(^C5ԇ&њ$ܚ Z^)=̈́$I],*y1?l#F+qad=$ KQt_;<!5Nh7^iJe,y/{ZTOWM"*`ÈHGx
    Y.
    Μ9�ALgO
    (S*		+�Axb
    +%t&Ε\`fhPihT.!"
    5r!)=sr� �;W0
    ԂRL#Dd5H-�wɖA5/�$+O,ιXvj|ޚVLS'U p-b]
    
    bXA y-/N3e6\S26% �]+Ia@/(3#-]2.>Rl~ŝR6=x'h5)$1<�VNC皇,rJ]B[bց/#^m{5"Bzv±vMB$t,zB޴)jd"M
    (`䂁VQ@%T$갌Z7^h/`Q0
    F(��htuQ0B|(*sF@j2bS>
    @Q0
    F(`Q@'@y EuQ0
    F(`b�@�v���@t+��	(`Q0
    F(2� F`Q0
    F(`��###6ZԲQeq\`$Ix'I2ـ>rxS\E*
    ڋG�OMpeS=(/\?
    �AxEN`S^<d>H۔gR}M6-7U!\p6z\*hxP~2*l<xm"@$
    Z\bTω[RQ�@zP/RVqjCQ-<qgs 
    %qGaZx\Gi``Sy͘%	Zǘa�k9� lÀd.Y"
    ckc_*G30r(~~-SUg		N7!N5ȓn|+mhr‰C*k ̪TiAXǼlᎭ!=>U]6w�ZA ޮK[
    D΂Bk]d,W©A$<c=M/H⓺@p\0u5JB.!P\#/;#Ȟn6 sO\H@q8c{2f#N+H�a]DனZ}м֥�%_#Tj"x'+j|,˱QH6x['_MtWXQW'In-	hրPvXWx*q,5*/+L4K
    2<sOu`]v	
    z	(6^EFJ"yJ-1jf. /Ay}P�Рް5h.
    6Zf~jz?0PȀO
    6͘
    Т}6L |]F@"%Il悡�k;� n; }bbV2�d^PƸ礅?Gؿ46Q0<O<{[3(6Sg46<RŶ/]ZzNOL`r�A _.44؀{ۖmW2
    ZLOgc%XGD5alPE9LSD,0,Ie/WGͭ|vW8K(2Ap-F`FKF$FCi{c�@z(`Q0h[s@�Q0
    F|`0�!56i{o�@Q0
    F(`Q0d�@�
    ^~=N`Q0
    F(4�]; ���u;ݡ
    �Fh:
    F(`Q0
    �Al`A^zE,y*rn0vAh`ȊUX@]"$M&LF!I{`F%u#\#Vd)
    Fc$'a�h7^q?jS^FaT18.C0EG=}™Ε"~YҜ"vZ؈@ڬoۯEbL)W<D(lG(L.20ޠQIȥCDFb5.H4*�hP7^q?je/sH2sk$^R66%™"$PmTWxv-9!8N<BZf!O|\P@byxKG( �`R�a?Hmb͗ȴW%GWѧ>;Uw5<mnE3I[^m @Hvݹ1|/?4`䤞7aej mA=ƟTt1hEQ]YDسA_k3Z&0ٓAP	.^:xjŁn`#:#ZCgcItmEPn\ɺȍjXŋRιC>1C</jTn9f0so8m„3@-s64C1^<U:(/8E9@sV!/~gOz> [H]`DT$ovBT4*qijZ7
    F1� +eqL-:B9Wcڋu\ U=Aeuň"F
    ~YSmx[;\clx"�Y0Iu,%(�x]{Zƒgi, =b3tXJ]a-`/Q@$_a[JU? I4
    ڂ>!
    �hP/El-WR^5|72p`ONPl	#9n# я-_^@-Ĝ!i-&nBKxBx5#KhT�3�A!'j5yrCnYJÑs6MlGQ'+A?ԛL>T*Qr.�d5ZLl`fɅ̅wiw<R	mH{һ`ǫ7+&K9:4)qٳ")E�ԍQ0l�ChC`p0KHm2GـDhȀ+@�
    e`؀bkQ0
    hF[`�y`x$-X}A΀4< }xdQ@u@+@�6^G(`Q0
    F�W�	�����6@�
    Q0
    F(`Q0
    �ر����A_#W��6@�6^G(`Q0
    F�4د*+d!\6W6�SP])Q˃!_ֱvQLt6g�bkh1j�#0R"k�VA jt-(7	HhRU~/MG #oTKdIS&ieFGԇ$I&߅	arOl*Q\5Z@z䕘6cIa~Kj¥*P+m!5H$?Z�-hk�A{a`=
    w4v	�gF9� ޟtJ0無b9:y-w]YҦ\7P
    Yk];'Z%
    |dPu`VZn)QbR)m?()u1f$�Y�_ͬN{2S*3W	z3
    ݴx]_Y?YXg[jg)x
     |3lnQ*
    Znq9 f;jmf $^Pl)x0։dU�MS3\.$ƑXg
    1�)YMY!VגYjYdh4]h4R1Kdˎ�Bk
    ՜¯-Fʽ�Մ�Y �4g?\2L-#k`-@b\epFZ-?9׆X-\;Jⷋ( D2S fBLGM@�
    +j/jK9:
    �Y0R$uoFBύF�5`D`H�4/)B
    +".2YI*46m]?1g9
    $:FRB?+<k#KR'f 2Rm\"#e@bj"
    >Z� �֖0vSϐ4.1_ṆOPH3ǀk3KT&<yI/'1{yd4F*sP6T룟QZbuVXxl_;fC.xZ\񨸨%(@|<g;H21s%^44jQ0o
    ~Zx)l)#ʳ#
    �Р^60
    
    -/F(`Q@�@Q0
    (Z0
    .w:�#*RFgG�(`Q0
    F(2� �v@��� vCm��huQ0
    F(`�@Q0
    F(`Q0d�@�6^G(`Q0
    F�4x`Q0
    F(C�huQ0
    F(`�@Q0
    F(`Q0d�@�6^G(`Q0
    F�4x`Q0
    F(C�huQ0
    F(`�@Q0
    F(`Q0d�@�6^G(`Q0
    F�4x`Q0
    F(C�huQ0
    F(`�@Q0
    F(`Q0d�@�6^G(`Q0
    F�4x`Q0
    F(C�huQ0
    F(`�@Q0
    F(`Q0d�@�6^G(`Q0
    F��4A����IENDB`�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/images/turboFilterForMDC.png����������������������������������������������������0000644�0001750�0001750�00000063611�12143164146�021364� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR��������-���gAMA��|Q��� cHRM��z%��������u0��`��:��o��gIDATx�18CýQ& $_F
    ƾ! zjcOsV*稐Jum[QG/,˲,|[8� X4qpt.rLk?; e*cT_ꐏ/۱XɈ}XR皅B)QdQ0
    F(#�@;`Q0
    F( F[$`Q0
    F(x�@-Q0
    F(`<�(`Q0
    �hdQ0
    F(�hE2
    F(`�4"`Q0
    F�mQ0
    F(`@�HF(`Q0� F[$`Q0
    F(x�@-Q0
    F(`<�(`Q0
    �hdQ0
    F(�hE2
    F(`�4"`Q0
    F�mQ0
    F(`@�޽{s(�k׮+F(`��DBhQ�WmQ0
    F(� FgmF(`Q0� F[$`Q0
    F(x�@-Q0
    F(`<�(`Q0
    �=Z$UxQ�At(`Q0
    �2F͊5@4(`Q0
    � vRZp.-䢵6Q0M`Q0
    F`�D1CA\mbh&@4h\<
    F(`�	|€hB9F%@8N`hP__?NC�fm(odhsa,`Q0t�@�ѯE(_wi2
    F(`~�@'R{6Cz|]1
    F(`��#:`Q0
    4�a"mQ0
    F(C�`9!mQ0
    F(#�	c$׮][z52
    F(`�`Q0
    F(4�4:k3
    F(`�D¬ͽ{hQ�hWQ0
    F(��6<!
    V^M	###1 ss@Ϝ َ!`i8.Eֈ?*IU,KbC+Ti>;`Z�@d(
    @N!D2dAD֝h!F1ZۅlŘnǥYa`b�@HF( ZWoIHl$9؃VR)%Nգ`a�hE2#``MqGZ5!XMC3bL7:
    p[2B@pNLn�0R`+z� FgmF`=͈cXԅWU1q9ff52<F16\ES<#ځ�@	iNH6>`5[KV(� h"A-=W*�^¹e.eڱpNM;;֖1)[-$8BukӐ�Oj/yG%(�`
    юfL6,p}@!0Egba`�y2b*F!2|aE@S&<2ON-@L
    'haXQ+IF	x8/P„Jj�D/X#Q
    $Pddi2
    �ػ�AjMWd5\V6<nxvks9$ȗUoOd*9A˵OPM筏l1L2]>ՉPFc>5֐o'`t-G4@"#&	I6.w�D>s+ ((vصAlNXs*mO>(/3\Ī%!7*v=omnG!;Dq
    Oai
    v &`RHT6t}n!((}\J%wh,us.2) `0&n>;<%m,p|#ɶj.0H$svaxx4"/;Рh\0	46֮0.Cpɓ"FzYʈwy_^C<; d"
    !c!ׯ??~�ٿ!p??r F;.{�k�"	�;P;detd�k(�@-La$l0@I5s8	&��7"sW
    =DܚHN4z0Gwa5aԒuVs*%m^æ}3Xh#,/eΏ;PZHʓߗU'XqRlK"qH&.GxB;AMRJM3
    Z'"N	C	6DBx=2L&v(`P3?!ɟ>F6G$6ğ?#x
    |+?x6`䕐2
    6`cytA( �`Q�a(Z)J):4])op|ka|jJgLr1".垎H"E<"sxŌ+PTw
    a^Wȍ	%k.7c�A+!,D`�'/cf+%Bstxpz/Qzu.9dʪݿ
    4ߘ4ZkpF5oRJع�A 1Rh7J.ڵhg냣Q$iBX~76M2�lN{4Db{X~r['kI85,qL׵̖8GoP!)JN9w�a 5IH܏ب`74fyHr)���w*Gj][!r,D3m]\d
    k&V[YDNm\v;cATP?b
    W-t˛"hp<3P$WQEQIUܬ9הhfM|2ú=vXsdѫ%ӎ*inqqo,cȆRmr Ҥ(Ϝw+�0ec`R S`yAs I=q\?�"2j
    f&R
    ""V7Iܼy
    Jejۣ9ʾ>ޣrLDžA&#�;g0`?E-Az\!=zm*B1fU9bıFEսZjYrdv$EF2%{6V,
    :#zO
    U&I"CȗG�]@`@Bad&p0��'mXClQV_	"Q\ZU,DD, Ca	uo~=1`yrϚǜFG$T9f3Tk�1
     E⠃x*HQ
    )B)=@!D1AQ�ɾS|:Q
    .h^-P
    a!7a$pnE81oKߐYxKJt5..Ńb$P"|p	�0d;q8diFIE$$I{`Ng=(׷w{4l Zs) <7^71ӱIн6fu=:H=]IIP"}j
    ޹�A4j#$0~p%;;#�_2%kTb46NƲҬΑ!p{xCCwCD%C!VktZr15
    R-�{ P?+Iq##ߔ#<##B_`�"0YZo+ `X+;U?E:Ǔ|I֥Vr"&eCJH섚(*\w:�@?%H9Z)!ke3.1;0Gk4CYJ)dʑw/.{0u7e\iFd0DIP$w$k["c.;A"P{Q="lz*Y&&2!� 6[ɦ5KG\lwz
    $k=ͺǠ܃Gן0f$snnϹmlH|K2�1VE?So+akZd*BD\"SZ{kHDu̿?fהy`s!%˴9"SLX]UJ`ލa0�ǖS0#e	fa	F܅Wbǖlbฤ'>N54R9,˲oT"$Jp)Ӗ悶Ud"1 PN?VC@AtuH!R]}T>0W;RaPFT_`\R
    a(J[:[hM%tR!#a7 ?:BħX|k<d;&IrZo"g:7aʥA&֖d̎ddXg>g)0�+[I!4i,+!R-jAJd2/28)b"iڞUTnDFluH6X�FPZMwXd>U}4
    61`6؎J0
    唷W�v BRtdjEO<,&~WˣDD"viKg1mχH!ᙇe\eܤ_N"$ 9JRV5RnMaMIe*(bl8͟]s(Զ1Ѩ+ڟ=CMx e0ccׄMGt佻`k}"7M ^%%RHȻ\čF_a%쮦\>MY]
    jow:xvD7#(�ڨkp)L©乐>nTAhϠE$RV`3t<hvP
    >ii^		n8j'=g`d@$eJx]tK4ximUn~^)9T~n@o2٨H`co%@T+.%$3cyCv	;GS�4:o7
    �XKv;^@.M)w6A#g,}6
    K?VH@[>1nfF #@5s22|aB$lg2y;	N6>TRqa[A|"v? dc
    z1'L~ӽ?{ULтbN(� F[$�+~F	Z0S>`hF2�U1pu4Y+#d"4pӷyxfdbf0�7GMl׿@ظn['"d\-UafrovBAF	3+dͿ_hK~4
    `u(� F[$�' QB;7#8
    F
    , a-e6rprNZ􂙅EIyӯ$;-W>I#WQ4rWd5'.|ӌFL=8!-$`d/н%??ݻKUV:EE;G��4dК&U
    F�`T8}3۸j+'grtLH{x] j""=GCbp-�VWo`'uR*yp:
    2@[,)ƎX9h!7�ȟLHHps7P&<,N6L_H4//>!~'KA	d/R�7{31c`c`�c{11Āv[$̿<IV=!Hd@}9	2X݉+@Vh7&
    Q@�@c$X�:9
    .7]w�c>W"+,z*CSe7�tľcRr7`	Xd[@�n6A8V7cQ@dOбc#0CV`|�	hc-#`\S8܀?h|UlvlxNFa@>!/̿>[CUc˝rLZ:xqz(�1Q@, %Ay.Zq	"KATZUT܄0x0J^z5C-#^s
    ؙ҇
     =KÀdGh9>GЂP|
    v_P:4Sz33(U€XtN`U@'30@�_,۶?4t�z;q߿ZF<|VA\4<
    �hE2
    h1$52ϲΆl/|@AU8{}	}&!`J�z`<d/dt#	hA+F&ЂVZ
    >Y7؁ZO_TUKx/ aP*%BHy~[6	 |]ngg:4"&L؁|7�'~wb-޺	qAaUGM�hE2
    pE!"LEo,T"/@)�62$!.*t5a!#
    M<6\�X�{@ ϩ)�׀.:|Wp[=ˏw@3t?hs|
    V Tuȧ:"Q idh�vbWDS1{
    np6Adx߿34%dX8Yj1`;WW6�&EH \?�(@�hM]KI"9)O@zu<x[o2D\Azڡaj`I,y6B�TbmgeiTw< !7Y%0o WBĩ@?FG{Psg_S6fa:*	eB=dqx<D <57|)+i+PPٗ1<�b/3'?>xHCBϟZ,ʅKo߾pNwJQ*VA\~4
    8� }Vd6([=u9;Fn"^/!`I}gc^`o1|	yEX(9FTu1nõMA7gs\TtI
    ?޲~Dl^|i<؅p!vDд	` Cv�Z& }L~1晭)\=)@eG?ho_@+oSgebaa9(LJ>ɲtM7Ԃ5�={` \OR�4"`�=Em5nd9\uݰ�ɯ^#YrAցce�6D~s[$@Y@7cf@;l�%#E_}{	l�&
    ӿ_pU$~qK)|903=}1h�:Q0
    F	@Ms뾷~3e
    Ȕ
    <4jVЁ6$2
    ḣ�o
    T`4D/d?x3L4<� F[$`{mL=g/( 
    @o'$4ߟ}\Co>�VŤ-b\|k6279r'Z0?]}3�hdQ@@^iK( ؀fY?Y@XNh:0	|_КV^BQnкQPs6@2�h'F?yF"M{( �4"`�C@gf2F9}	F\Az*xtbנ~`OdwB΂O&(l� �;w x&i6	zF(q11^as.[,˲o	1OR-"Fkע�!H7p0.H
     GykRZ-暦]c]푾o֌Qc8m)-*&ze%�;g0C&M).BHޠ
    !$$؎8ޖ6Za!d6\D";FC@r"Iybջ]sԉ~UO]sI$9Cj1kc7zlj]BFHR̉DWБ;ƃ]ZkTYzkw'Y6HF`v"^A+fYP$1l1&V8U*"*ĥz.
    ߂S|]Q"%q()4rLxa/n&%eX-&y%2/lgg!(Igo}Hh'Hx=(5BRq,{TydGuBh%Os8�y\swůlo;0ed^_=x:X1إjDJTԼNqؿpqp]Q:~j:?ΉU\J`ѻd�VqpQE"5xsZm"@=Ą] <}#"--PHe)<ck%HnZ#"8vBi"RTg5@4i(!2 r9EPfbZa;`PH@:>Fl&t
    �	??h	!$kЄl	jl
    	`C4:
    luIDgnpkP�`
    V�ahue 50А6m:֡-wI,WhN9`#2HQHONSfd˥_' cRd=H|9ZXAfU15B2.Nx@$['#-)09(tdEpUdh[ʦKЋ+C#(r"o~̹8@m �[Q
     u0Bo6l?&6fhҪh>ZMKĠq߷68SӮACsV?Qv<}.&%BsCU}5CDl"鍜I#A&uR
    NrZ08ko!oߤZ뾇M}ΑTnI\AF�Y1]w}8HB~OGBPbX{uJ-K8P! (E9
    VtV�Ah{EdVv`>DYHv.!.):&9n^V99[&49r7MYa
    5]lu||wֹ<N6cBW6\&&HER{*_Hت<A
    <RɄT�No�跴\ٺVs)z44im/[�p
    <C-c3Aq<�nbb9ZWrLL`7fzׯмƿM(l<<1v_vvfF=+̑E\�vB!:_Y9d
    �`Oٰrp~0F)I3%(Hw'fP):�{mha2B
    TsP<x3 �7@R21CX{rZ+�iew:]LTN7J�7G k?A.abTؠF	x29eÀb#S$ՋǙ||#гҀ)..um?W Fí ;fIPP"Ɓ=_�aj&/,~}njܔ.
    xE4iZ[�}u.Z|=SǞ_[\2�oE$+Jt	~a	/̈́Xib.$J&usbjRbjx8Ǔ"w޻>q3h[k1r__pYQQԐ:ґe8u!z=jn#Fn;S((H(RYYXRk%h"h\RSA\ɗTX -&^AW4w	\&vK1
    C�Z?c$G$Qj 0133�"G|h
    gH&dqWH@}[}ԔKH_ZZ@^^XQ_Frl/
    >pH3>A("eV
    Mmb&)li�w)�@\
    Viٛi`m̊1e/H"2#	IJXrk\D^E6ůDQ`ҨYvUyK3;xy$`H<r@p&@:AI #:2ZCaoi:OE="7J~w/he,*0:C2fQf
    (`he!6]5TLNmO쀮�`0S4G;c!gBl196'r/_|c�	Z5>
    >Ab̢Z{yA�htfQ0
    A34�\=#3Eue`k~m??~tO�J1BieggcԵ^�9A
    |+EjeYwޡ1+sUN_4Ɯضݹ0RJL	cdP=f[K˲s`mj2IQux*8gb.!aP<Z$Z%/4:F2
    F(g�/"L@K C!5=�] r(>*ctK3h+3=
    ƃw� �;g�b\M/[\d	m#!*#HJQԠ}5Z?j|c-3gX٨JH"C$c&'\DbbbƫWh!N-{x@́+2  ">~2Lk࢝K S
    `*1]'Ȏ\Z0@#h>me<u0)a�3+Ak.@7|t0.pjC>
    B.Bmw|ۿ{)--RR(�&-@6cI5@Àwxœ܉UdĻb10f.$R5H6qJ3Xl [^1G0BZ$LL7lp|ʆpc@
    :<1{?#_Bn
    2[$<<ɴ9sN=!%%d@Rj!#_ )�D!�Ck@-2W8f0 &h.$@@gע`Hi\0r7d'QW98ב@@!>_>99� װ@{l0��4:i7�JjtkL1!t+n*9`48YLAӅ5mlApn�r%$$EX0ۏ=
    ۿ5k 	܌$V3Ĥ$%`D_?�;??;/![њY܃+p6Q&iFe�5V@�@mQVC,9d(t~spM`o~k2dMGd<UTt?<XpcXc`JaN
     Oȥ9FN0S#Sێ$•zâŋ끂lj'CB&L�?E
    kh Z?}
    ts-- #hE^.:3H_))+K@gǀ:;DF%r`-apUIO�bHL*9� hxf+Alt#h9ha^!deXÄHpC{b"GIUxp)b`pYyDbadg~28sd)KKKS<-%lqfja7 232^|OLLլׯ5[l G�h/7__clgS�Dý64g"P*�zOk`-.@RӇHT9HʨV'`|o0&Q\c`v�&�a*;
    _६ɏ adbl@cbeƔ
    FcT4(
    �&6ZaV*d
    |ԑи+3~@dbvjIO (
    Ec@.
     �i!+Ȭ
    y e*Z"DXAV׷o|db>z"-hae-hec!xf(42
    >,@�Qt'Sꆒ*7TCЌ?I-sdFQ+Z`r
    \ErM[$]_NpC#W.4[x_hce0N!Xe!h;H$�f7/?x7-_^$oNkKCǎ}7!7OF&&+߿1LGb `!(_gVRTdadt<lkZD7dKDWJGR[LKHKAE؈I)"aٟ'q<@�ѤE2
    
    c0mA28d_~/>>zɓooصܜWR_NWZGLꂾ΅-߯_~}_>AC_#Ѡprr	"0x&VVbnANKTLW42v-�Q0h.F�rf+|*t~K1-+B#b`^_Q}]@Z*>>AA 6@S6vdȠ<[e�(�yy2;;hPaΝLL'O*�w#d,r??@GA
    ds
    t9Z)()$-"a�O`%Q@	�(`)0xGc�JalPm\6492<	h׿~fsi5++77hs
    E"(TFaO֐4@B5P�٬0Aä/BخfN90af~r$_\AҕSJ8[XcsUB]F;5e&'y#%,<4Xm+"ʘ-ڶ8}Ӑ~g&$';cAR\*APPOqjRhcS%oAtKr(?l^##ΘQ`@	IW"V
    
    Wjk֎ZRZG
    QNX!F3dC؝9+$ʋG�X`DСwI[ЭG9BÝUBP\Tw2Ό3c,	K콏.`Sg3[GkpH	#YCN)VIHb5쎤V!�{W0.9"ll KFC/xi5qFp8j9k
    Z55wj$j*%D5e}IDz'+aƴM1Cd~"'k,?Yc54l6c$A	9Ȥ\/oZ$1P]Z7
    S񀘃9Ⱥ	g<w*-v &5XD/nŔ>ht-W’
    GI@)<
    dr#?/p('/"�aUM$+@lئb?B`
     "ߐ蔔?
    _@k/_Κv+عAc!<<Q<<lY#ȭ(M'I>r�@�%AĂnB[wuƻ.D|0Ԥ
    B2LyN~I]IQV 8	~#lyp<!٥U(VZ#8puˍfU%a8rکH 5,R2)%ݎ7Hi}KN,f8Y]y4Ryyw8ciF6wݽq[U<.:Q
    s!J]̔%R&>	rII鈯\([S9+\Iju{w߶.;BG?JpNcDR	ՔJ9ftOr|yoVyֈa
    ޶)^]_D`k /40׬8c{jP,q,qiZY,V4�C-]G|5hn	tf+QeE4dj4-aWI,V#3dj`co2\`CSh1݃9Ā	WBť8Xmkhk?rOę38�H>>}
    l֊%+Lsa3RҐȳgπ\i)) q01}QCEc�x‚'%?|6\C7_Ĵcf'Gǽ?0,k:C@7$\Q|-n`X#3	F`1U 0	Vd TF� n0dq09dhhj2VR
    DS��kPDI\G1XFX3)+	F4S%3Hr\ϟ?윜=eiν{,,.;l%􉇙ӳg@ɓO�['?ŗ/zkFo߫ݹz<a5Yٛ.�ׯ-#u{۴ãG::kjKKIdf铛`otm@GN5sܹ|'.^oEEYK #7dlŌ4"95WZ%$%a�c$,Za*	Zl$sb7Y0!4\x`N5%,qi!Q_1c
    \#"'^Y3i>H,_߿C*{v^GEA&JH7/'q8@+6#ll@[pYX6ntpV`C& ؔ.YGfe2
    {Y`CdNvv iظ#*ߴ}:LX|*wj:D2b2yai�Dý64
    YjK9oN*mEo�}|4l@RӇHT9X(<0?S@�X6ߟ?l?>}9 ”<3!OԒ+:�[!<�m:٪#V޹h=Pppt
    �m>+.ϟs
    @nTP/<I!9`6sкlʰbԌ<� h2k3hk)
    6Pj%n\#:.JLF.ze1CjUxGIh!F\
    ũh9y201Z-_A'}իOϟzÓ'=z0zakyGjYX><|lv�R55@
    fos21.UCL?:��WB>+)	6S$ KqA&afآל<
    J\EEӆ1� zX+-\D9fQ\x\q9xspA(j+Z€aẌ8pE=3;@;1
    k,VJv\lGȦ1pD[r"�+57;#+WlV͟_ÇǏCdtttF!k5�&r
    HHnܴ	bx@@�dVhƍ@TW}v@�;9|c20`FL|<l^ 4&@[䔕WM+CX1€1IM00<jp8\%>1cOS�@#ϣx0s`v0�d@qkח/wgHƷw@WA�e5DP&J3A耉ù
    >p+	ݗ4(YHLQh
    D8�@�h~�
    |x+)?QQ&A#llwNN6?~
    :�֪�
    NaƢ"wHKt
    zYgl�IH6A@'�"}4 uGsdu�@<
    $ u:o(!߿̌LL7/]=hOw߿3Qz9n&`JM^fߤa|`6A1[i@gCN<6hp/:F�;w�al%QBr$$C[v>R$BToͼ0ci72T1\xwD-F%J\ca713z_r
    ޹�Pǀ-7m3:"<rmRJoCAPKL]جEi=�w[ζ֣5ok5(
    >FgH9/r)t#A4-fߗ x7@HF(`x<`䄏#?~� ~_b`	;|^K@2@.V<azQ0@��UtuUN`n_GBE1`ZKADiqedn!ƅDFªaa1/W3i&�UDLLx-ĩe/~09pŘZd]Ą3{;$	Mkdg,h"pXp0],5QR#M=iT-41AOae2>x?il��	tC
    dI>abb=<#l.iAs/0)II쓤q
    9� h"AN+`S^<d>a]9|<U2.wbUIyi7dɰMI3Aǥp~)bԓ8 RڄI çasI		f66ȪVV_Ⱦ_XcH h7UUYyx@MFJxkCO[hn"5+H5is� h"!+mQhRZj9Ϳ�XK"mlѡQB]@yld^Xgu) mc@e#Ȱk2@�^Q@	VAIꄼVGc
    \"v3&S4@r8cq<!M=hF71~w-"h;#
    x' d-eЕ0IJKK�aCfjהHJJJHHވ#NAM*L.11b8	F12 4
    J��A/Obxus""1}GY
    OV1V4l'y	>ZFd7F2,QMh[4UQh$nFA%90/
    f[r^Km;1tYO)QO]�3r9iAf{b-H@2.�f0A &-'cŋomO1t!qgEαjLDTѯSH{a~)<蝽W`KH_"+5)W`[ȃ*;73'P4cW<~zM#h׆F!K-c3�R݃I
    MQҥF3H#�Z:�hC�"WLQ�Mfmm-E9Bč2zZc5-+3b</P"Ǔ$hg8O@1RvqUDIR>ت^bFw@d9Bi�̝A {k0b头]q#ث-z;:+zW8\ghhth%Wk883RC	\Q"H_VJK[
    #|:Դ[5
    'Dryi6C遈#k,f>&sY" HF9Wf
    0HG&
    =L@d5\Fq�-�;
    <
    F(p0ڶ!� FHFN�;;Cd
    A#(`Q0
    h�(`Q0
    �Ec$`Q0
    F(T�4:F2
    F(`�4"`Q0
    F�] ik(^Q-O&E͹6BQQs9T;8N853˩*F:&뷰1Cϖ5u#RGl߮T7mƚ҅ARߐN#VjYaW0b5[|K=*IDQG.e']�ŸƑx/;.QӍOCEYo+yYLkc47	u,ԔQ96⬲,:TO
    @y-G�df0*> P=l%)+Uc
    ٵȣ`�:D
    խMH�ص�BOsӬCDG;znpy18	+9VsdAaFĺP,0ˆXFmBH7AĕQ/!fG
    ]Z$|&/2Ei^nu.�f0z>`C+1t~liYx^(N/Y5V\?zدW~1K9]uPLjq-o
    (մ$ra؍A**U t*[
    y]̶r#Ygx ׌u�A !LE51$ާ$G-J5*GgBZnX {sؙRDiNѾҒR�n;ެ*Fyz5aj4ٶ�^
    %7GHuZg67{j`}H6A
    dt	H_FQ�̑E\�cuLkg;
    �Mfmm-E9B̃Rdwc5-+3~@dbvjIO (
    O@1Rvq5&4`[39� �u֖ u}S~岠
    "'MZꞳ)?ּ|
    )lP[6M5klf~gR9`VyָAe<k*4,b~8!mS%`p*=>,K^tJ[a7ET)[u%`($`w1n
    0HG&
    Q02@�h8
    F(>� F[$`HF潁vhPFCoX�@c`Q0
    F(x�@}51
    F(`aDEEI@6`Q0
    F(x�@-Q0
    F(`<�(`Q0
    �`q�A7J,B\ Rpy"fWՍ|	)Opt։Aݘ*D4rܵb<cyڳ\B&ħwM
    A4r&
    n3M7O�h_C":r6RJt$>ߊ+�Ʊ|cw�g9J2:H	' :!%+5!1`э>t&b-6!N8so,?%h2k3C`sh
    \6^R|CСfP0cBh�`
    R�AX_?uMS':Ҋ1ҲgnvYc6M0^{97ՄPSZL|\mw{ōto92-͑gGPGGqiP(_sE(٤G;3JaGc0jRuU-1kj?Gxg$y+Sa=wKOלel^/�ݚȅI>$[>TbO(Re�*f "f#Z4(	{M]Lzkq@�@?;CDY5_iEzz'k	8
    v!q"XLHLKS\{2W;K_du՚JlJ
    x #	(Egy.@4kCC}�AlQpOG&(TRH_FQ�7d6[�Hjp
    9 䔆{īx�@�dfR:l#Jܸ!G@X<V"IP2C!*r<Iv$.
    h*xkt`;Oh0�x$A_[,rRAԃG?mutW.L4n
    o>{>s5أu-䬝]oa[00!IqL̚b+vdJ/G6h%|ҡh:
    ,]+hԥ9`yZ2x n]jv	d
    Ӟ"XS\&-Q0l`m�ő	FC&h
    `@@F Fw|`4?Q0
    -F�1Q0$y$@a%`4:Fp�2H�hE2
    F(`*2Z$�DQdQ0
    F(*� FבQ0
    F(`@�HF(`Q0� �9W@?=q[I]FD]tBYY<rfrZIkSR;|m&Vt#ʇ=é҂=mIƞ
    "+NJn(g$F*I�IC"e4e#[6p(lOW8b8:Loؐk0b%EC9pN�lh'l9`I%t7fcƲ`tDYNXZj9ͿĀq31%`Es!j,:Wy@H	� �V@ºbxnC{9#H~]/N=/G3z42ªbcN,(l҈Xʳ^\\˨Qf920$]ŒskSK$YfRH5
    ˭N`V�a v:cAfƙ5p5RUcs~<z=7CgZV 8oyk@%[
    nRyuT-
    b�ASql
    gUĀȖ~l\3X h{[Dv=rٺ&:'	ؕ{HrԠYs928z#w|c]?vI(H>?+V$+-)5(	ඃͪbWs[ۨ/j_9s#h׆F1G-c3�R݃٢
    X)RMP]jrQ:�sd@aB]7َ�DYA[KQ谁jP+2T30]XM$A_8P)!ZR-“$H5lC0B*#*v\	"$!A(Y
    9�=+Iaս:@ʉR>!;lKg5O>‘=Oge#ܥ5YDz^]h2sʓ;FӍ/!X|ȷMK}I,?p:(E
    %m`o΋#T%ې\h4G>0s`v0�d@qd#�Q`Q0
    �hE2
    $`mhO@a%`4F�4:68
    F(`�4:F2
    F(`�Dy$_;F(`Q0l(Z�htdQ0
    F(�hE2
    F(`�DS W^BZ7
    SWe@AEL8SIr�dFv6\1ͿR�S\Z<E]DfA(YT2%sADxꔡ� �e@X0{,W`3$/q*]|9-pi^vq(tWoNM4N^ָq'Vu
    X#sڱ
    &2DY4�Ck@-2g0 n&f H(�P,c�]G2�
    D2tL1C*)`AX"
    #}ȂWF|6pwX=KT܃�?/_t\jtce/Xbu.abf4.obX�Y+a{B
    aqdJa8Ͼ\n.Blhk8Ŋp>o/YȔx~nj뭐||v[kT"6NS+3:sր
    6:80}&V᳼G!'EE
    >S!fYcv�ADJLk0pخ?[mE{5j8B؊}IqT?<%<cz]+Kpk<g`,~J"=U
    X
    ?!yӦsd6rP	 We,yп9B@{:[qS#<Eհ	j"M<6r_{l< N{@.ZAO�ɬ͠:l#2Tq<V"IPw�_p$%38IExF*C|!iIkC>@{E8 l@�@�%`5Xee?[s	ۆ~;aYk|N-q|J&4g]GW$D)yujCwJCYXI7� I}HavstLޱxB0jZoᴩ9/(N
    OW�ѤE2
    
    Ab`v0�h쌂a	F6	@�h`Q@�@-Q0$(:0xGcgK0i
    �htfQ0
    F(Td�E-Q0
    F(`��`Q0
    F�mQ0
    F(`@�HF(`Q0� �5@Q-LA1R?Oxyf
    NՏG͓py	CN%bGO}:/١Ca^,oeRf@s2M:hq6QEO˿idF*VE
    uR՘.ht +k&rTтM-{a`Ve`@0'
    .hZAG*[Dy(Ow%`xF
    �MfmzXZjO_�s B[Т`8(`0�سA_0[vX+tnP92s_AGN	{;fDX\\{C3*07xL(-RѣAN*_4($b&l<[(kS#-͖9ң.eC�n-`G!8M31Fk.:ڣӱgKX_'3CSnqG^<@C"Mu-2PT/4Q.ۂwb4�hP2ˋpT*PrFC98rx{?Pc9� ڛ!@;+LN͂Xz/a%?yH8vb\*N&U5K	O+]%kMQIWԡ'KgO[>HtQw"k(mAb;=P4s?)z{mhe#Cis}0t
    #D+1d8�"ض #LֿJ"qF C� h2k3h%
    6PjIC2vmjͧu=M2B)w1>-Hd<0FR_p&jǣxp[-#qF? 
    �@�0i3-
    2ߥbR<3rigf)=PַT92z~RpA&njFbrWh}j~9`,џMА\{kKb7Q-L�26zSY)s	Hh" owtt	A:1
    	 Jn`4xhh
    E0l"q{ FOKУ`Q0
    (�׆a30$`D@�HF(`Q0� FgmF(`Q0� F[$`Q0
    F(x�@-Q0
    F(`<�(`Q0
    �hdQ0
    F(�hE2
    F(`�4"`Q0
    F�mQ0
    F(`@�HF(`Q0� F[$`Q0
    F(x�@-Q0
    F(`<�(`Q0
    �hdQ0
    F(�hE2
    F(`�4"`Q0
    F�mQ0
    F(`@�HF(`Q0� �(t����IENDB`�����������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/images/newwindow.png������������������������������������������������������������0000644�0001750�0001750�00000000334�12143164146�020102� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR������	���Ӻ&���gAMA��7���tEXtSoftware�Adobe ImageReadyqe<���PLTEuuu��8���tRNS�@*���FIDATxb`fff�f�b�@ � 8@�!
    @`6��L��&�^����IENDB`����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/images/lbAccessStatus.jpg�������������������������������������������������������0000644�0001750�0001750�00000434514�12143164146�021013� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������JFIF��H�H��
    Photoshop 3.0�8BIM������H�����H����8BIM
    ��������x8BIM��������8BIM�����	���������8BIM
    �������8BIM'�����
    ��������8BIM�����H�/ff��lff�������/ff���������2����Z���������5����-��������8BIM�����p����������������8BIM�������8BIM���������8BIM����������@��@����8BIM���������8BIM�����y�������������>��6����S�a�n�s� �t�i�t�r�e�-�2��������������������������������6��>����������������������������������8BIM������8BIM��������8BIM����������p���!��P��+P�����JFIF��H�H���Adobe�d�����			
    
    
    
    ��!�p"���?����������	
    ���������	
    �3�!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw�5�!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw���?�,ٜnV,W]+?G~㨀LlwO:}')Dz]^cƬ=*rluMZHuCbh]s Ikw8z�+n3ԝ]qkK}/?F�f�̱&J莀:2[2k0ksEu]C:?k{ֶH3u73z?{�L~ޫ?~ϫ_{4ZYen}�N�Y3�"3/C+wq`26kTW&}x#h;7�_wks��//So�^_�ȫo*Xa`d�>mK\*�W�s?)o�^W�ȭ/[>�z(fѹaѬ67Gk}<7�}�ߧ�ܬ�K�|s?+Kޑ澝�z_z�TƇ꽌4�|?&WԼzppU2t~oگz�]պ_OT6>=9nWݿv�K0;�8qqF?caի齛.~ZqLbWu'
    85špc:"s>
    H?'O痙DvMw&Ү7
    ۿ;}-Nv1Ǥ
    v6?CFobs	t=
    lo(g8Rƶz&\Mx�sRu
    Nʜ(o+W۾]'Fr{?ML#{5{�V-%sȀ}XY�M%9EإvE,s7󓑇!@k@_<k2&]w?Q*?fm@!αޛ}i?ysΙC[R6l{{K?w/<8=% e}>Sc!p)WF%Nc&	ןr/M�zcIK��v�YG)}O(tܦ?5$c0Ч5U�1IxK\Zt$gIxI)t$gIxI)t$gP�r�8BIM!�����}�������A�d�o�b�e� �P�h�o�t�o�s�h�o�p� �E�l�e�m�e�n�t�s����A�d�o�b�e� �P�h�o�t�o�s�h�o�p� �E�l�e�m�e�n�t�s� �1�.�0�.�1����8BIM���������!Adobe�d@�������������������>6�O�����������	
    ����������	
    ����	
     p670!589:P"`1&@A)#*��
    
    	�5	47!12Ӕ6֧3w8 Aq"%v0Qa#&P$pb'x9
    @`rWLjBdg()��
    	��1!2Ҥ56A3Ӕ"7pQaBrs q#0P$tuRbC4Tւ%Uef�����g[ͣyX���������������P��������������f ������������!`2w[>Q{-mmI7xI[wZه]./p9b2T{[A|
    n9q#ea9tw@��������������������������������������;3[tce<卂'!jcr<rftfgM�?垰y/ܘ�rn1U2n�cXyg!nQ:����������8_X���������������]|P������������p_0m�ӏtzrzR''G9conwo9OWa-wwY
    )xT 8)�8QājN-_@yNprp p@�p€8
    @8N�pG1�8prp8Tr)Grg1o#CfzŅї~z_9GʎQe5_"Vy-s)jg2NmIԂ%$ee6mikS=҈wKo;Ҟ"2^!/q/|[Ι4G̼R|/:oA~F
    /q5ps+|Jĥi0ļG8Kpox^4"RG
    $"0ӣ7Okߓj[Ev֞h[Mg>wg}.J/֢I,h&Yٶ_gZ-m:]1:fؾoq^	U>FDZgW:g18q/(~h4/:\5q4JpBpsG48Mx]\@B8RQƛ p#G+ ip_ȿ'ʗmy#jgy�8�P@�/	8@��8�@��8^SN))
    B��B����rp�8(
    @�  �_ unN�������������������������������������������������_P:$הZº%b5`G-YI1<%?yCѵ"k<]-TshDd���������������������������������9.|&񴢗q4{G4	ґ$\Nx1&C!{$5Bj#Q##`ڀ���������������������������������<bY'7'i�����
    LB&��
    SH��������������������������������������_Pz$氾| �������������������������������������������������xNkN�:�����������������������������������������������y/);H�˴��p?X۟r'~/��
    w:oPZ��	js|�>f68g��b#d�����������T紲k��������������]>K]>L�uJ=xyIPDV]�MKqvV��Gsw\ϵwc|5CGͮn ��nĹzlluu뻚5 �~�����������KܑovC~GߧE-L-�����������E#E#�]dׇ�ywQ|ڠ�i�OL1�tx9�6	nO~?l^R�=hճZ?6��Gs`�����������~�~=~/h%M-0�����������V�xVoN�*	Y$S \Ҷ!sJwVJDPޖHD
    KzwNKvAGBggzKz�Rv3W0S:0S:+h'S3L	`��������������������e��]dׇ�T^$Ne'Ru(+B5AF*AFAnk8%X,u0C;:#:*:d(聰r�ԝN΄.iБA+ v��������������������(�_P:%f< ������~JT�(e`0BX�����PN
    'P����������������������:j�/txo^RvT5@X0s +�J
    pg@MDk� ,�`
    @Y_��Q*"ߑg	��%�1k`+�dR�|$1!?1@1$�k#�%�1@6�����Q*IY7);H�c>W@$�1�k�
    %R>LTF +|΀ʀY 36��*3SL$H~ZX̀
    _'ߘߝ\5d�#@+?6>G@C>]?1 $?!�%�3o�΀͟����TJ�xVo
    N�+A�������at�tp��;���tp�:#��@"rX��������������������}8�1}@뤕z򓴀
    kĭ5\X5w|ݹEH(nPI-d$]CH3;X(r(:k��:<B:#0Bu:#0C%%H�Kzj9�����������������e��]$ׇ�T3X+itKP;u+iޓ=%Ҥ:"X2r0R,Ѓ3.h��ʠ%r,ސQނX0RW"3�����������������bX �<bI+7'i�Q>V 'ϐ||%�̀|(~GV?�* ~d�glIF
    ̀���Ȁ~@�! 2ς  �����������jI@�xVkN�"^�	�>ZXnxX
     sƈAU5kL*X
    Rς>Hc1 )G6RJJV@#�WWk`*`
    + <~5Bcߍ`g͏"$@+�߀�����������T�Ia}xI@ H������(�����	|��|�'� �?�>L���������������1}A묓򓴀
    T�9X-ylN^:<4uԲDvztFvT,<`��:4^';ӽv`KD`vE*yz^k9HRu5Y# ̝J\u����������e��]d׏�T 3X*y,S`9'6QR
    6j<&]eP-x%| 3_`3
    .iS`AFttF���u'ljA$;⧗4ztE"rEH(ftY"4,!<H3"shEO"s-:e,s@���������hY@�<bzY+5'i�"������`~@�00��c@�1 ��<����1 ��c~L���>d�2�����>d�̀0�Gc>wD�_Pz$氾| *(X�6>k�k�
    )D I*4[|Fjh	Ǎ@_1.�EDy1�>Rϗ|X�|
    ]c�6>k�d�.|H		�˾k�)Oɀ|~c*`
    V�?@�]d׏�ED*d�ɀ>[0�	@O@J|Tʀwd>L~d>L@W ,?P|�^5BH!>@~d|@WWˀc>G#X01@!`2?,  +  Q*I97);H�f�%'3"pKD`tGDgGD
    tGB&e'*ysL$0Sz��qؚ6ADU׀S"`t���������������������ɼ�Ia}xI@A52A@΍'R%sv晈(ޡ74h4&RfN]Bω,0BX)d\
    wp�:<̃'S;;'+i)+I ��������������������hY@�<bY'5'i�������1rB:P�?	N`�����~���QR�����������������������?a.Y/);H�������������������������������������������������1}@묕z򓴠������������������������������������������������Y/);H�������������������������������������������������1}@묕򓴀������������������������������������������������3\mΨXh����s�q@r�P89��@8P9��r���-� ���@s����i'/���nmoe7,<#fAsdWC"ȮEt2+]dWC"ȮEt2+]dWC"ȮEt2+]dWC"ȮEt2+]dWC"ȮEt2+]dWB2+lllllllllllllllllllll
    2< #2< #2< #2< #2< #2< #2< #2< #2< #±:Qv&WFՄP[QTS,{ig,U>g:uWAR刽YgB=SU-.3/4؜dsQdP:a+idVr(ŌS9tмKnPLҼ5tӴ:vN;ChtӴ:vN;ChtӴ:vN;ChtӴ:vN+ChtҴ:VJZ+ChtҴ:VJZ+ChtҴ:VJZ+ChtҴ:VJZ+ChtҴ:VJZ+ChtBЀ@t :BЀ@t :BЀ@t :BЀ@t :BЀ@8eS\`ivxN)cщ0Q<}*dF-]+
    TJ4v
    y^W#AZ+n
    :JK,k2(Ї!5$I3g^ja57duJQx2e#.Bt.Bt.Bt.Bt.Bt.Bt.Bt.Bt.Bt.Bt.Bt.Bt.Bt.Bt.BBFtnFtnFtnFtnFtnFtnFtnFtnFtnFtnFtnFtnFtnFtnFtnFtnFtnFtnFtnFtnFtn0xaM=6zl0aaM=6zl0aaM=6zl0aaM=6zl0aaMu.p:>2LdiUv4hK%ˌEP10&
    J6Q,Kh->vhY}
    ȃl0}w}E�G~
    |w~
    |A5k5נ;kÿ&;k&;k6;k&;kF;kF"~pw;kV;kcf;kcf;kcf ՘m`wm`w\w\w;jaբ;j;jÿ;j�QU�QU@�G<A -NT@&<51	 MNR@ڐԇ6<( mHFmJ#RAG6<1
     J#RAԄj
    `<5yj#3Q3Pv<! @yiCOBxǐ<!!-<y
    iSNBZpӠ<4)!M4y
    icLBlƙ�vz)khgYvQշ818wbK޷*CmD)P!bsDFZȅ"!}F{#7Ќ:8@Fȳy7Xވc1o8q^/GZوX0Zȳj6/90װ#EEֲ:G!:a݈7"#}fױ׳<cduFcײ:Do:׀xDu!xq0Y׀" =@7׀ =Dou{1xb : =EGuBx\u:î#z#ׇ#:~~xb:?�aᏌn-ϯ�uNqfͫ>͑k>Gb&!<q6l8XhBŜM80q0-8Y浉.\"=gqd #~:WfxǯXp#|:7XxZր@u`#{ԀÏV^و@u :ـՀBԄVՀYAA":HDsx8uR##6ǚ7G4-xBDmp<<=ds@s@B 99#jG<-F㛈DsG0Ќchsa9h"Wޛ0?v8.Qp2\e(\@e(E.QFdqO>dqO>dqO>dqO>dqaM6daaK6daFK&dQaFI&dxAGdxAGdxAGdxA`EdX1CdX1`Cd8!Cd!Ad!`Ad!`Ad!`?4#OF?4ipO`
    ;w�4i�ӲeNKƜ9/r^4ixӒ%NK9/n\4ܸiprᦥMK
    7.n\4ܸipRѦMKb'/z~k�^|�Dc,�֪'!g�ƵQ?X?5fC4,*di<B�/2E,b\zél0/dfn4(M|(4?�A]0EvQ#�Dch�m5B6?1HƩJsa"Qb>~r2L`҂faC,
    UfD`-c5q2a18eL#UwPHpoM>7g*ytޒ<܊}?%uϣe
    xXy	=*f#�Dcn~D$Qj2;FGq5ƣ"n7V6&d6hn<tko2j2;FGq5ƣ#dwQII31pa0u\ص&s53dwQj2;FGq5ƣ"p
    %an]/q2\}cSZbe~/ọFGq5ƣ#dwQ-I35ƣ#dwQj2;FGq5ƣ#dwQj2;FGq5ƣ#dwQj2;FGq5ƣ#dwQj2;FGq8DC*Y
    ly
    ko2\mx8eƣo&$6Hj2;FGq5ƣ#dwQj2;FGq5ƣ#dwQj2;FGq5ƣ#dwQj2;FGq5ƣ#dwQrbO�z~k�^|�Dc,�ת'!g�ƽQ?X?5Y�TO>B�z~kU�Z|�Ec,�ת/!g�ƵQX?5Y�T_>B�z~k�^|�Dc,�ת'!g�ƽQ?X?5Y�&�6i3p?3k?3k?3k?3k?3k?3k?3k?3k?3k?3k?3k?3k?3k?3k?3k?3k?3k?3k?3k?3k?3k?3k?3k?3k?3k?3k?3l??3k?3k?3k?3k?3km5ov���^#c:l]V,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,rO$rO$rO$rO$rO$rO$rO$rO$rO$rO$rO$rO$rO$rO$rO$rO$rO$rO$rO$rO$rO$tc:9·Nt:sӝtC:9·Nt:sӝtC:9·Nt:sӝtC:9·Nt:sӝtC:9·Nt$yai!T,F):ˈj$mO6Oi6CWa<vLLՔR$4YTDQ$(S
    0sIXۀ$&df>e-0o eajbp{i/%x{|L8᱘8#8#8#8#8#8#8#8a999999999999999999999999999999999999|Lp)1&ygc=K0cq
    rȮ"%؞ޞf{Srg(w.]QU-x9`f)B/*IQFbEvf!_7Rf*)Y50\	1e.-y)qq`(p3g8p3g8p3g8p3gB9u@gPu@gPu@gPu@gPu@gPu@gPu@gPu@gPu@gPu@gPu	͑͑͑͑͑͑͑͑͑͑͑͑͑͑͑͑͑͑͞	%)>@ea0lǥ6FK:0˰*L6\7ʳ1CVͭ[)_5|h굡aVab;LTGi-Rijij)Riji)R\;LTGij)SCLv@vҕ!R;KTiJ)SiJGiJ%ScN#LvU1J;ITJJB;HUi*i*HU";ITB;JUGi*%V*\vUaB;IUi
    %V*㴅\vqB;GUhW㴅\vѕE*u`vxѕ2;FV";FVhhX#Udvefe`v4EWhT*EPvq
    UETvQ;CUGhj
    U%XvЕa;BUhjh*V*ô%XvUa;AUh*Vô\vq
    -j&Mb$Un\8hYJۋ
    v[n>ԆMC(GU13rLJ,xrFG$G$x#v9cc8^0<HF9c6x_˔r###!p9xXY!r#D`9xÖ<8Z1,GX<ychpG-XB#,GXB8Z-"xj"�ˌl1�4c�(1"0k?18Da1b!<cC#cDŽxCF�!GD!p-DBpGF#jՋ<Q	#܃w 9!rBrY9 #v98ǐBF9a!rDrQrDF(9G'B"#f#BG,,lrrXXQx@p!C9G/ !@p?( !ÀQGDr!D!8aFx~b1#Äb!G(8È8QrG^Gp�1G�pqo͞XHr
    lXGZ#ֈ{ChuG^Zh״:^{Chu״:Z{Chu״:^{Chu״:^=E-Qlzc[Ǩ=E-Qlzc[Ǩ=EmSlzmSlzc6ǩ!W^Ux=UW^Ux=UW^Ux=UW^Ux=UW^Ux=UWޏUz=UW^Wz=]wޏWz=]wޏWz=]wޏWz=ewޏWz=]wޏWz=]wޏWz=]^Y|=]ޏY|$Wo?S}�o?S~�!d_?Y}OEo_S}�o_S�~<.-Yx,�68_ӟ1X+}u_a/	?�#yo(KlY-`?'�~�rHFUf#c'1`%8[8}G1 %xQ8&6+s1)`q7.x,^aF
    яξ2lamMs;b3TJWV1|cJaqS[sw;_?oͦ-c<4yh1cGl[V.K5e} nōc<4yh1cGƏ1!nue't^8ۻ*.Fn
    8oKcGƏ1c<4yh1-^8rcxm&<^
    z<4yh1cGƏ1nuh1cGƏ1c<4yh1cGƏ1c<4yh1cGƏ1c<4yh1cGƏ1c<4yX)N":oF6˧x	a	s;A`يcGƏ1c<4yh1cGƏ1c<4yh1cGƏ1c<4yh1cGƏ1c<4yh0Le?�~"7Eo_S~�!d_?Y}OEo_S~�!d_?Y}OEo_S~�!d_�!d_�!d_?YOEo_S~�!d_?Y}OEo?S~�!d_?Y<}<ᑯ#_DDDDDDDDDDDDDDDDDD2%dN�dN�dN�dKȗ/"_DDDDDDDDDDDDDD2'�2'�2'�2'�2'�2'�2'�2'�2'�2'�2'�2%dKȗ/"_D2%dKȗ88888888888888888888888888888888888888888/"_D	\`���XLr#suzl_-E677777777777777777777777777777777777777777%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{.!/KwfÂI
    ^PK澽aioRf_6I.O܂lyDMS%=vƳmՓZKQnk3Ն!0O1Xi!ichE"'jpc*G?"3ϑdSrQ9G(rQ9G(rQ9G(rQ9G$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$nǧӈt:q8GN#ӈt:q8GN#ӈt:q8GN#ӈt:q8GN#ӈt)9,S	!4%˧DdU*#4LY7'N
     %}n-@I3%]F_PD T̡NQLÍbs;u[eѿza1e-I6NGOIREӷƬNe>昴4š-
    1hiCLZb4š-
    1hiCLZb4š-
    1hiCLZb4š-
    1hiCLZ
    +z4ҷJލ+z4ҷJލ+z4ҷJލ+z4ҷJލ+z4ҷJލ+z4ҷJލ+z4ҷJލ+z4ҷJލ+z4ҷJލ+z4ҷJލ+z4f7Lލ3z47Lލ3z47Lލ3z47Lލ3z47Lލ3z47Lލ3z47Lލ3z47Lލ3z47Lލ3z4hдR%:WQ%MK<]Z!/%vU2EMW9ŷ)}Bg8]˫&`i3Ul-Ҋօ%j)+UQ%*<JDx-U>%<KUDFQ-UZĵTj^%<LU?zOb%<K<xp3TbSj&j<MU8FUM7TfS`<MU4BUM7TnSʦL9TjuLgRG3Tb#RUH&j<MU x@5TjRx87TqrQʣF'j<NUx(;Tav<NBE=T^>'<Ox ?TA~QD'PUQ
    CCT!QU#*UI(<QU x@ITq⎩(<RUx8ITq⒨<Rx0KTaSU-QZҚ)<SUx(OTQ⢨EQGE**<UUxSTH5D*<UUxUT0Sʪ
    {vqty7欸Xل-0Gs/3avqPك?ԃbgΓ_k5.wP3<TB)pF|,zT:9SMBhLg1؈ruI4"mOU;AڲՙR%KC)MQF<3U9mOSjcr49mC~!''ICK+uz5⼶)-l[fԡ%H6YNGb,uQdGdCdZ#duYE#dz#dBk1{: :GZֱǯ`uo@F؍ԻX[b#`ul@un/lp݈^[`u,X/,K"7R]=wul؍终刎k{{Kv#nDmو0pm`sF݁`sKdsXEr1;/�ړn5!Ν)xld-1<?	3|eV5!>{'87?&.OibC7jffF`)'q}jIBR9S,t&@I*2[yvFu!<MNiecI7)II{	q[)5PGVus1ؤM)O4-).L}
    jiHr)kM 3B03C<f�xFaf8#DG^3^=x\=oc_0"8C>zz֏[z/Z=pz@z؏[C]#GG=lGz_c֏X#X=`pȏX=d! #p!#pepHɷIdrM�kFm
    
    DlTlTl\l\l\lTlTlTlTlTlTlTlTlTlTlLb#bebe#be#bebeb%b%beb%b%b%b%b%b%b%b$b$b$b$b$aab$aaaaaaaaaaaaaaadadadadadadad%%%%%	%	$$	$$	$$$$$$$$$$$$##$#######"""""""""""""""""""!"!!!!Gov�!Go􃁥=:m=_mΆG^AC4g{|dcs-Wp~_W=ex5G�K&굨+5K*us-VAh;?/O#M3_VVӬ.`αTbM]`E[jOUBOhdIu][ڐ}VVQ)!8%>єzKO.U/L*5*eVhŖ>8F/E,OoICkeVhŖ*,KW<ΪA9%'JNҫSI[:	W6hߞӯygtij뾓ד۶<Zn1E-ɘS_\YQ)^Lh/DVʻ4|\jHܥRkhTzNS۶ЛpMy^x[H
    FX5
    ;fuqfGqCpʞ
    KmSUk�׌U4;tNY/xՕ4Zsf<j N#wZet|}1٤ OYANvRHou>5)*vQJOl,q<;٣jPm=]f:m1RɾG�u'8AI}N|4oioE; 
    ?u$Gϋ\ /%w՛Q'?Ri�7mV,*KqD
    \{EIUMƬilS?5~#G*f\N16iMS2eu%=d7KskmYȑ$EeLyIKpN~bth5)((Iy,ƥl5'sj2		w&/2tgn©|#G(fN4v픵*\BY=(?ߴXrӯ5&j<Lx3P!fC@UFKF5WRQaulOZ{Uf|[<ª|<Lx3P!fC@5&j*O7p"EĆ*+@O
    %UݿD)J@5&j<Lx3P!f@N%CQ|bUt)R%C	PzQ5&j<Lx3P!fBtx(c3P!fC@5&j<Lx3P!fC@5&j<Lx3P!fC@5&j<Lx3P!fC@5&j<Lxʣ%ٹo<*j*Nص^V	VynlLU<Tƒݪ93P!fC@5&j<Lx3P!fC@5&j<Lx3P!fC@5&j<Lx3P!fC@5&j<Lx#Lp-w4oioŻ)Km	퐛=x38'Bo`	WNKpOl	퐛(9LMWNKy]jFeU֤mF^;}Op9TlUݹ:R VJ�VeNdKϑ*gDٌažD1jQym̝fCqe?tMX$fY۵$t[#@H2cC2#l̬i,?
    ܐL͍MI*
    $ee!{BachqbVK)!e=ِwRl]ym�(+`f86ͤw[-^RꖱAH~|&:mռIjS"�Lϑ�_&j{,m_=iqf+m_=iqQw/vef+-nq1]w6G>s&l``y
    1Ϊ́(5gYyEV~f,[eVR^e}r5&b$kGLˊ2+1W;*(l£Y_~=JN+4ڳ+=ɺD`xm_vиr"rh[S7w=is0=Bt*Ŕ+&X7ڛ;kLxR`CIB#˳Jis
    ]Vĸ)B 
    j5	)[WK*"l `ҮJSW䮐SڔCS4oio,'{lٍf6m1clٍf6m1clٍ
    s%6q31clٍ"fm1cl
    ,(9Cglٍf6m1clٍf6m17&`d'm
    [bLւJhؓ4\clَ[6m1cldL1clٍf6m1clٍf6m1clٍf6m1clٍf6m1clٍf6m1clٍf6m1clٍf6m1clٍy&:m!?dJ5=WFԔA5/^jKRSS#5|_RT_ʦU9ɖ]"IBreH/�SP0.do6,\MpTޢIl8IITfTxeOiEWЕl#fn*XN/8&~B	9JљuSiqYT{+IҥOR梉fhK'W-%IwPOIk,%U;eu0VS[koJz`rLWOTcn0U9F+cz5:6+JLR?U4Y28``rLUQLUGTSV&+)UA9pV^Ϊ/	URPxR}+ˤ*fUVQ8IaƬՒ
    )]*gY<	: ˄pv�'5:4m*j]]<Ip{U4dqQD8zX}4v^E؎ڐ!$2uTɑ}+ocSj`b>B
    )p:/ǔ}M?uB~8FGy58S@N`Sق'N=ٴ:u]TWۅ@T;fu0S5NpƫmqW]58TjbGQ\I@\7N$_czToW˜н>4}],}-Ē㉨O|z-
    *Y)0ư㈎:uGtߴqiB]Sܵ*e\M_\lYuS}]%j87T:QV9%=c3N=!R0v=9TNWQTdj߳?.Pܚ?bc0S،r=h RicꙇYftqئ<SeV41ְeb3
    a~B'gPaYI3VR{MɁ ʜ5f/47}1*nZrt4
    bTIU+DS6$ޙ+îSX$63Mem
    a6boJ9S93LN!S}I)6]-`ʙlS6!Vv*x-*S&<nugNWclq/ǔ}M?uMMCӱӱӱӱӱӱӱӱӱӱӱӱӱӱӱӱӱӱӰ*Srzb:eƝƝƝƝƝ1ƚv7v7v7v7v7v~/iii1-B|qcqcqcqcqcqcqcqcqcqbAN;;;;u_n4n4n4n4n4n4n4V!_ӱӱӰ<wv7v7v7v7v7v7v$mƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝƝ	cPO}	�jߩ2le7nL7nL^9$';=DiF/-$	9*&H%Enb*ɾ s0t7J1}ݺ-0$; s03픢
    YlVgo*dS6ۙkrB3:j&զIdY60)&.s%v7wKMQfgD	~ө[]Jә29|#xfpvbo̭w$*2>oX1d)`a;PF5sqOCE0)&.s%v7wKMQfgD	~өzCFF	8B^>�&'.,*^MaRدLȝ[3:+4Tؓ0{:j͉'�`M?u#f8ġZa*Ц,L^*Gף2J"#љya+;dS2}z3(-Ԫ)^XjJ*Gף4?N
    I\beHf5"+$FEtd8fǦLb3R>G@
    HYpK0MW2hIp?3EuiRUR
    2JN̤U9[.a%B&d(o7+1Kj^5|ӲWNV)ȧc"v2)ȧc"v,P2)&0t<\[CPJ|Y4ҁc-'P͝V)m9[33"ELpjӪa6)'NV�IilЉݕ#
    5"*^5lx)2Ԉija*[r|XHFe#љtnW &ܿdSNE;dSNE;dSNE;dSNE;dSNE;dSNE;dSNE;dSNE;dSNE;dSNE;dSNE;dSNE;	lq/R~O}[o
    ԵލK[o
    ԵލAky-NZKxoF䷆j'TSky-7vQt)5~Fd_.YZ<-;lUT%2UJ:b2tQk*EYV?x	'iMy$!)j.QսX19(K?
    N:gml&$OfJP'3Uv	ѣ?4X
    {2\j
    _
    MEܩ@q޽y�hpYUEG
    
    NNlL0ؓUP*DIB	@1	ӍɞV?x&:m!?d*I'+UG	MnbU"S߁
    lZ'"keЪ[QPHBr5@L3rӺ+T^ϥO@ulɮ'ٓ]tO�]Q0*MlDm	Ӭ4D²�
    f3GN&46!4FpW\GF%hEk%i1ů MJhKe^5XvI	bjx124\VsFN4e8v-=Q-e/O\;O1_)M1EY:RR4CL0Nc!P&JDݳ>ܦxW'H0ٜZ*HL$fdR
    *jN787$FDM\0$%Wvβ̽aIr,KK)їeӂ.T#IgM"-/[h|/DdfBV
    *8T_̛ԝ\5HIy
    	x_EΖ'[׬`]XARLH=('NqBgO	G�_ml'"ذ5`kbŁ[,
    lXذ5`kbŁ[,
    lXذ5`kbXyK4HحlXذ5`kbŁ&m:ذ5`kbŁ[,
    lXذH{58lXذ5`kbŀцӈذ
    9Ъ\[s!`kbŁ[JsmH[,
    lXa\v,
    lXذ5`.2K*`kbr{wif,
    lXذ5`jqذ5`kbŁ[,>CV,
    lXذ5`kbŁ[,
    lXذ5`kbŁ[,
    lXذ5`kbŁ[,
    lXذ5`kbŁ[,
    lXذ5`kbŁ�_mڷfUYtop̀3 gF:7f@0%0:7f@΍0W,q4Y/0`Kar3AsK%y~ae_?jS2by.k;qYcK)-J|f%Fe.hk1:V;PngU,dO{mlS/ߵL
    BY\<M$V'po%\|-wvnGHeIk#rF5*w fOcUʼn h)QPnbW*w fTI2M6p.9&uS&!%;H]4{n{gMZZΛU`:Jar96N}buSP{:(dž=$e*1	A[Sೌ` $gnhT6F|-uB
    OФ)1-=#
    8$gT ;j`}	~{N|�nm=wE5d3<6g/X;9BO]fRي@!X΁,|ژTɾ s0w<,rFgkJ2g+`㕞?jSW2]yZpT=M\&6t̚\vw`KZLjq2ǿNI\)}0W;2>eTN	,kK|٤7~Hbl,b4jtwL_T2̽ϻ+SÌoS`57~-&u9ff50q.u-\PdE>j(j+s.yC350145soH=+1j
    6s35s.*m#O]jLHTL)QYLAO4O
    iVluC\C2)6$sObK|2KLMcGVm8 xe&t#fZWP ,jK]%G~TTx#o76fhAg�M?uF˲y/KD,
    X$4I`h%KD,
    X$4I`h%KD,DI&xҼc%KD,
    XINʇKD,
    X$4I`y]KD,	ʞˋ.,
    X*_5h%KD,
    X$2ӢKD,
    X$XT.)RWD,
    X$4I`hRD,
    X$4I`haRaLˢKD,
    X$4I`hNI`h%Z¥Iv,
    X$18Tj%9¥Ɏ,
    Xl*^c%KD,
    X$4I`h%KD,
    X*_5h%Z¥Iv,
    Xl*^cl%K�cASQK�مKETƂ$B,S>G}
    #
    "5
    QÚpjϤeUI+hu*aq*OGoX8E_n}#*_rePLq&S1ݺINq&a'A*NK�UoH<Ιz7RS�ōaTUÖ8rѨ%ItF:yiK>ho
    )qXRm%Rr9xϰZvr{EU@peMV%MD|*wxWGRc-s\YX:򎾶"YV/Ή91,GtURz4ra67Ƭ+T䊜ե.DU8ʦ=uBh=WNh=U:}IJ6&'l	#I=&.E
    Sklbt;n/) Vי))8WN^KqVWKebt께SmWESwNgkp(Voӷ,Ptar2e#UӼJpުqC}W[$2-o@^33>z,؞R"[K[ @
    oM~ޮ):X5זwN/}L.}MkӪaKz@di:l-/cjԸʙv,ǞE,�RPN84EI(W1yHVY3�Rn_e4�n�	}N|OSZٳxp7
    jQЄ\57
    jp]ZٳxpLPp]͛Å5NKR1vk[6o9-K ؒ'bDr
    "v$E3Cx!7bH9kgjKR".D}r"wib'el,iLͱy1![ULdTbd"b͛0ɩdMሶ{O]r6o6I3c4CAlI{T?qЫ-[U	/a(eሶ{(TGFU"+sUukB7UH)tkO͛e'4h"&nu[Utfd0LfDӓpܕ2TP(͛z5#"Bim1"?8]D(&m3fލF&đr*/7|eTYPđ7Pef޲tg6zj<711s=%ܷ
    '%Sl"$ND8SŠؒ%\"3D+))�͛eӑekbH=r3ۉu:ڮO,$l&,n[=D*fT[U)˜#�"hŮ|*1t{'%FKb-܂%:ڪxUQٳxS
    oϺk:ګ5Y#=L(Oѿl]T�(ߴAv	HfP]f`e&i![‚47W_kc8P]f`mlguz%4ͭnD0<r^5%z$zdA{.A"Rԅ2W&53BŔLlƘ*H]LУQp8]3oV[5kc8/.q:p8`iWG,ӽ[ƶ3lg5kc8q`l[Z
    `3T}cq[	�[ƶ3lgaz5kc8q[ƶ3lg5kc8q[ƶ3lg5kc8q[ƶ3lg5kc8q[ƶ3lg5kc8q[ƶ3lg5kc8q[ƶ3lg5kc8q[ƶ3lg5kc8pS�i~ӯ?]CWtf)Q3TY(,eGgqӂjE
    p|8U͌,,i|5F002LTX.^6wnJp&
    )s\.r՟go[]w/Un+Hc;p�&4~c1ݛ@r1ș́-qa#rU14uHܱ*Ԝ\0ndrcfKzIb.>JV:K\s$Rd¬S%z,޶fa*|J͉ja>fl(	̭߬ZZ!uhҙ.ƛ\fBG4pUT̠-u[%+OEl;L	}N|B$�mmmmmmmmmmmmmmmmmm1b%Mf󍹝2_?O6v6v6v6v֯^5Q6ŔvELyrJ`ۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙۙ"gh~ӯ!Mw)}N|4oioIUg0m[5ojw>ﱪ}cT{ƨ}Q5Gjw=߃T{~
    Q5Ojw>}߃T~
    Q5Gjw>}߃T{}Q5Ojw>}cT}
    S5Gjw>}߃T
    >ﱪ}cTƩ}Q5Gjw>}CTƩ~
    S5Ojw>}߃T{ƨ}Q5Ojw=cT{ƨ}Q5Gjw=߃T{Ʃ}S5Gjwﱪ=cT{~
    Q5Gjwﱪ=cT{ƨ}Q5Gjw=߃T{ƨ}Q5Ojw>ﱪ}cT~
    S5Gjwﱪ=cT{ƨ}Q5Gjwﱪ=cT{ƨ}Q'VW�?�˶~	r>cA<μL-L
    ]iPpZC%QuҸ}GM?0x3iD(
    u2y#]LFuu2+eW5ˬ$kY^HS.]ey#]LFuu2+eW5ˬ$kY^HS.]ey#]LFuu2+eW5ˬ$kY^HS.]ey#]LFuu2+eW5ˬ$kY^HS.]ey#]LFuu2+eW5ˬ$kY^HS.]ey#]LE?Φ}ey#]:
    w4K5ӭ.sN]:
    w4K5ӭ.sN]:
    w4K5ӭ.sN]:
    w4K5ӭ.sN]:
    w4K5ӭ.sN]:
    w4K5ӭ.sN]:
    w4K5ӭ.sN]:
    w4K5ӭ.sN]:
    w4K5ӭ.sN]:
    w4K5ӭ.sN]:
    w4K,ͦt�H.y[L
    m2'5ˬ@.y[L
    m2'5ˬ@.y[L
    m2'5ˬ@.y[L
    m2'5ˬ@.y[L
    m2'5ˬ@.y[L
    m2'5ˬ@.y[L
    m2'5ˬ@.y[L
    m2'5ˬ@.y[L
    m2'5ˬ@zy{M1INRx(minx(i-ŝ$iK'�DU{\&$Q$=PDEJMaM)#R
    ("3^	Fv(i&I߈m4,D
    'ǟvT,CmKRRFe%vڪP0渗S袜$!YA0p**L_Ωg|eWhpar15N!3ZH6MDCdMͨh$"bKq-n4(JR%{AإvGŰNdC0.EkBۉj!ȨeDCMEJN]4{
    TR(eaal9	0I8؂'d\S
    y/�P׳
    G27Q.32v6ZnqϷr!5ç_qlJ{&ZogJjq
    }vmBbFTj4%	TjyJ|D!lc-uĶ}%c!fEH9{{ADȸVX(#&3DCDs\[GAKgVDO,
    o)LQ-.	6%xUҨuC)BVkIl|mN.-ؤqPmgpm<S)eII͡Q%kf)QdfDfDfFtc&S
    BM
    (Śft%dT(ҎҥLfvszPbpz9?o%Pn)b\Jͫ	hr&%W܏C1*e|[ɇuNSNxjQ~*`la9$bgPޓjjٰ-
    o."7ђ_/ящ)[shAE">lBlK҂uIQ`!$&xTE3QC9m(YL8KA-XhQ<1ɝ1ɝ1ɝ1ɝ1ɝ1ɝ1ɝ1ɝ1ɝ1ɝ1ɝ1ɝ1ɝ1ɝ1ɝ1ɝ1ɝ1ɝ1ɝ1ɝ1ɝPG|b*w"G|b*w"G|b*w"G|b*w"G|b*w"G|b*w"G|b*w"G|b*w"G|b*w"G|vU*66shʐ8be+;<Y8;~deM$>"<	lfrXbe
    !HL֗&%a2QH%!.ŲD_*1ZRRcP~<	)%6УZLAI$ltvLIv⍔,RJ$8QDpPDFRIT
    KRS-/ٙaaRJRԓΖiFgI`]^ŷŕk\2#>?cl;JMBJ,""q*$BVD|).g٧g}pG&1.R푚TCE"xIQ
    L#ڋe'a%P<h$&K.;
    M{	pP0Oo@DKЂSiy3KJ&Vi4,Qm`s kz'0̡	ʝR\J=dIiNeطcGٌ?bqٛv4[&P?"R^^qlPؙFE@llwc$:K,,4AE6VL)&do0Q"3k'[Q	ٚJyOfG>xIy3j5$4a
    uӦ{Q9^O%kmqǺ"KOC)v!(ϋV*q	I]۽mVHQ&Ví9B͝i`!,'cI^*X&(KN1	5:Dۍ;M<m"P0+jv`jآE@!κmL!m>h7]hJ4?Jcoc"ۉ5ma:J'aQDꑄRq(L]MK8sg =">qVO;JҶZ!,4lpژv1hA?2KyKkw!IHL>dC%
    RxEW<"UUs*\xEW<"UUs*\xEW<"UUs*\xEW<"UUs,pbw)pbw)pbw)pbw)pbw)pbw)pbw)pbw)pbw)pbw)pbU[1m6}f>FُlѶc1m6}f>FُlѶc1m6}f>FُlѶc1m6}f>FُlѶc1m6}f>"WQ%�?	fIٵ]r[SiTu	Rxꐻ-m#fFQJi'fN:F:kJLp"C P+&w;*Ez/QsHȶR͚M*&V)>v{yc?*d݀q\PJ6(IILYNvC*3 .j>T%L\omWWiJȜ.7ƪ+c�8ȗv~"2
    -)+qn܆5MNY{sc4zLO䨨-(goW?oaQf8$XS`W�C
    4ЏzZZZϙh#ϙh#ϙh#ϙh#ϙh"?=)�.{>e=====(>\|A\|A|A'=3G'=3G'=3G'=3'=3G'=3G'=3'=3'=3'=3М|@|@|@|@|@|@�7=37=37=37=37=3g
    �sM4u	7Ρ4F�&:AMoBixu	=9&Ph#Bi9&P#Bkxu	=9============9=9=9=9=9=9=9=9=9=9=9,���糦糦糦糦糦9鮂=9鮂,糦糦#Κ#+Κ#+Κ#+Κ"糦糦糦糦糦糦糦糦糦糦糦糦糦糦糦糦糦糦糦糦糦糦糦ffYڜt$L<Bb!`f!+B^ak8-.:ZxG^�A?fT.D_l̆EO(6dqk'cxEʢ爟$X/!Iݶ�vBva[S_dAR
    mb!QX5N4iU
    
    /ݪ�a	ephNp*}&xI$+
    ̌ҾӶo$cC�]K1LqH:RN+JZHIEIRCa}=W/'^I�/�,SG9?vOISJ?eB.8l)**#ttb?	�xTwV
    3cH$TX/(*SE4ئűQ[b3,QʋuV�w|Tl"{ˆ͟SAQE5ب8-l[lp[h>o8-T,
    Nb+!fcرEMc,,[U,lp[Mcآ
    ?xElTVQ[]tTVQ[]]]]]
    設(
    VŒ+bn(1.[褓tY"1n	,ыtbETw87AF-eF-M�M=tbX[l~tbF-щtbx:SgeJe6UYwIa`z0K&T3.�64ا�c?s)
    #Qw/|DPtSEO)௻u^593%|*HZ`utVd;p~,#kExxPti]EbDeA?`l2$hMfd_)xL̼{<6,>.œViutPFfvEGޯ l%TM6W3M*m"'GM5<*`<N6x8hYA_!PDDvسV	?'�#O$�VO˄L/_%	IiIX"JχTB
    eBɋ*
    G*M~ؤUT*!1E4
    
    (|X?P,|ET*Q`T(T*,
    
    _bH
    ~
    �D* Xn)°~N�=+/Dphx?/w8HuKe%BpTaEFEZe5GYe9wmHݶY#vd]e9wmH坶Y",˻lG,$r,;lG,$r,;lG,$r,;lG,$r,;lG,$r,;lG,$r,;lG*$r,ʻlG*$r,ʻlG*$r+ÕvdUexr,;lQexr,;lG(W*W*W(W(9Gm;lQ(QexrExrExrExrExrExrExr+Ôw+exrExclw-岼1ܶW;Q^[+(w-W;Q^ExcW;Q^ExcW;Q^yExcF}b1s+(w<1+1+1+1+1(g<�sg<�sg<�sg<�s
    <�s
    <�++s
    <�++s
    <�++s
    <�y^R|6wG;'o*/[R;̫`oK62m.ʾ!ֿT;'o*/[R;̫`oK62ٝ��η,Aе$xN;N
    $qd)59Lnqp,\)D!EJXiХaԚOr/ PH
    4IQd2FStc:$?rΙZ\s&ϊj:mDx<jT1[ѳ
    Q*iL6
    HGT2pH>-ř,,&$��02s7B;DE>&%0< ?I<Pg6"`
    jA8DiZN!hY%m6дT(ȼ	ǎt`,GA8#Ԝ*v>I/?jm^+BʅEe%M$dgzoD[Y$!n,$fdJqTҥJRj2!2٩dO6_ahԛ(}t)
    JHTT*2#=9ڒ4a04Sq(RTam!.!Kqk$6$�#vs��~zd�^me_;�~=)9,iRfDTĤFDEYl91AOl[%	yY%I%,3#-gf6g/nz$!C	R}Êy1h֯jO0kj)Xg="PlD*ք-iTJ3Rdt[[}1j0BT%RMȖP]lpYALB`DN.RgE8**ʊHJ}NԮ+f?é-@-GpR]1
    	|R6o8SIL$PSSGqQ
    ub\B>=Tn0Jjzp\jCDZ_xbnXFBZGE&A2̢;;aI%mGNKJJ%).8&%��o3@K:	p2ICTaҒQR#́;/nk-&Cl>9ZvfSPjm]Hf[pW9vfnp!(K&f)uJRx&iVvqQ3#\6 JL\L+BY&a]ݵ}63tũ0'O8[dS&St6g56eJxݙ)I=7'ŒP..%x($	$Tta^:(JZg2H<553ZpqQfX\Kh"QdB
    hJ1oEqdjK,(KE
    $QS	ŷ7ۅ-dr+[ICQ녂=1
    8JR_N˶kwqpITP{1!v]m従W6[.;j"y)fnAA:%P1”3QщK7mF`v?frKO5OGA h̞.)iZlvy`ܸ!a<)yd6,a2RmLG"*
    Dr՜CKR16(JtK%V��?_>?כ}W%W?YWJ8imLC .$Sk*
    DPdgYv74цf0,;FGh|HoiAϧ0iY,<YK$*Q"RFIؕ>2	$X;6Jr*q/Z	
    [ȇTMKQHȌgA`54A53CIi/"[RRHKiq0dm("JPGI"I@E4̍G3SAN5SE'Ef74цf0,;FGh|Hoi
    #aYv6kgi}oc~ah:PQMA$~sA)d"
    $rY0$Uil)JHI"$"ll< cźI
    x&ZhRi:1
    ię~-{3G<E45���?W؟H_Kxܟ`vK0[K(4=,ICl`5i^
    k+#|Hoi
    #aYv74цf0,;FGhX834&"]$ΊM$&t&TSA|I/vJ\!L6ҠʹRG+v&\6gWkC'Qa4ei$ȇC)2JU^%=m:^#D
    RIHΘx6$2'u+Bd
    L	)*J*###"2:B3X5,mA)5[JMFFT%%MC|Hoi
    #aYv74цf0,;FK=7~-Goa0B(̈4цf0,;FGh|Hoi
    #aYv74цf0,;FGh|Hoi
    #aYv74цf0,;FGh|Hoi
    #aYv74цf0,;FGh|Hoi
    #aYv" 6A!-
    #JҤ&d�-rY9*}j6\`m/RFf?*o;},,/lľi"5Hy%82ZDQҢ#;$#-eqr`.`
    IxR,Q@AG@5	tK"R͗R2K9f'2)\_-mRW<MejA)M
    6J)k
    x¹̺nukBԧQ֣$qdD#J#I SX(#Yb_
    FDFCpNIS`f0,;FGh|Hoi
    #aYv74цf0,;FGh|Hoi
    #aYv74цf0,;FGh|Hoi
    #aYv74цf0,;FGh|Hoi
    #aYv74ц3KOLXo|MaqkŦ,IS;\yٕ|ClpvOfU
    ^?כ}W6zd�^me__\yٕ|Cl~pvOfU
    ^?כ}W6zd�^me__\yٕ|Cl~pvOfU
    ^?כ}W6zd�Zme_\iٕ|ClpvOfU
    >?֛}W6zd�Zme_\yٕ|ClpvOfU
    ^?כ}W6zd�^me_\yٕ|Cl~pvOfU
    ^?כ}W6z̯5aEN"ab'2pzY|v,nyOH7;ڞnw= ,jzAYpg{S
    OH7;ڞnw= ,jzAYpg{S
    OH7;ڞnw= ,jzAYpg{S
    OH7;ڞnw= ,jzAYpg{S
    OH7;ڞnw= ,jzAYpg{S
    OH7:ڞnu= ,jzAYpg{S
    OH7;ڞnw= ,jzAYpg{S
    ζmOH7:ڞnw= ,jzAYp{S
    OH7;ڞnu= ,jzAYpg{S
    OH7;ڞnw= Ypg{S
    OH7;ڞnw= Ypg{SOH7;ڞnw= ,jzAYpg{S;OH7;ڞnw= ,jzAYpg{S
    OH7;ڞnw= jzA9psg{S
    OH,w= ,jzAYpg{S
    OH,w= ,jzAYpg{S
    OH7;ڞnw= ,jzAYpg{S
    +12]3'	~9/heM�?�KmiaR|Z7ԅpԥRBM-(#IFJR?%).�X[%UhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhUhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhQhv1c5͐k!6Cl3\fsd1c5͐k!6Cl3\fsd1c5͐k!6Cl3\fsd1c5͐k!6Cl3\fsd1c5͐k!6A\TFt`!$IIR-kRP$kRRP<R_I5Ii3YJ40S(JxM0<:i'	efX4(R$�預exB#n8⡶TJ)Ga$fd&2|',f	4P#
    `X=
    ?4*O]h=SCl#RʢȨ+43i61)2:
    4PdgXRN»+ͱI/fߜ8̩uulŮϥEA:Lò vNL)kDGq0P	[/DRa{И6&һpKgiBDq0B)Mm*('^
    /	̓/cMCf3J_A&ÅA(x$q)fZ͵m(۸M%xDTdf)a2
    ۨ
    6x"BRi*H!)DbIBhu%Nu^KFNqJRphO4\T|q0*|mt-g8q*23UDIc ^Y1ʔEYJLȸLm96&Q8+i[Ԉ(Ѭ",S:H[+-٬qdAE!kC>;o›Q;i|m)Z	eIt.܎Ji}N4N'		ik"%&RBy4pr,:)q=xH7	%�4drtFLۘE
    \xXK6h%9Xx%d d-iIմ[78x	
    "bXV+bXV+bXV+bXV+bXV+bXV+bXV+bXV+bXV+cv;E|c1_hsW9+v;E|c1_hsW9+v;E|c1_hsW9+v;E|c1_hsW9+v;E|c1_`*d?NZ_:tY0M(wR|;4V~y$I;?A+hv2f3.ԔL#E#/FE`ΚFL6.uӊtp\a0$FgB*?"26vŊ.`|6KTU)lm0fg
    0!.R̸TKKm#o8lH3'fN3gp/u$I
    mCnC3;~144zC?'O3n)4-:J4afuDfFD2.D¼J4PIr
    IT*RXDovxװD%qM f,_P뤧1=BZ"eT>{+5%L"'ҠpHa*Q!PiZSݘ÷xGQa *‰Juhm	-`^`!f01u
    za-Q7œA%T̍gl6'i=a91z\|t"A6ßE/_mX{scd;C_T,U;)q4M;NqK`D!նMA
    v$(q?KJ<]vQ-EBP;EC>%VKJۥFѨS]b*[9"-%,LɅ84*8	OfN8Bvgjf;ev*%%IChDC+"l5]Y0n)ZTc!f5(fVd3v\>4J JšfLR\\!Ld܎xy+MrC)s	-[Y)-6_I-NmT;1
    ^"qf7Ѥp[FKmJ#%R
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    i+>³
    ϻ+>³
    ϻ+>³
    ϻ+>³
    ϻ+>³
    ϻ+>³
    ϻ+>³
    ϻ+>³
    ϻ+>³
    ϻ+>³
    ϻ+>»xWt
    ]Ӽ+wwN;»xWt
    ]Ӽ+wwN;»xWt
    ]Ӽ+wwN;»xWt
    ]Ӽ+wwN;»xWt
    ]Ӽ+w(H�ݥEq\t,D1
    !fе(2xIQgUE0fGdF8Q)lM-DiAt{)O�Cэ?"[JڅePNZAJ#*lt]PϺpJڗ6CC!*$QJ۴6ھ'QmmJD4Ix8Ԃym!NTڍaFn]ڡv,cl F
    gRjj88͓$x*(V6TCMdzf,6QU𰒃?PtR2h]$PR?
    'ARG?
    J~H�%G?2Ts@ԨtG?
    H~H�%E
    J~H.5"9] jTs@ԈtR#G?
    H~H.5"9] jDs@"9] jDs@ԈtiR#G?
    H~H&5"9] jDs@$G?
    H~H&5"9M jDs@Ԉ4bF~I&))"yM jd@4OdHtOdH4i#RFO?	'FO?	L~I<&5*yM$jTHԩ4Si#RFO?	J~I<&5*yM$jTM$XE*yM$jTHԩHԩHԩ4S!4S!4S!4GTM$jTM$S=bI=bI=bI=bI%OXE*z&5*z&5"z&
    9SPzJBiCSM(j=	
    ?YM(j?	
    O4&5?҆P~JiCSM(j?	
    O45?҆zP~JCS=(j?
    ?y=(j?
    O5?҆zP~JCSy=(jo?
    M57҆zPT[!aq4/9^iFn%1V4-BЕiRH#O޿�pپ0>5.'͞9DZoG>!8	f9fgq-xHRx+gM?z�5(pqjBHztJI2{_ٴbZT:1mF|Ш33,#”EE&	ht:؍BK0hwњ0(c0̪1\g|K)6xi#5Cq'K%I;�tȗk?}"AGV>qMB`V(Eؠ|+,Ȥ"ɊȠSXSM?X,
    J,|`t|)
    8"d4
    
    BHQE1l(Wc1EB
    @
    
    B,`dB|+|TرUdT>oU?,
    B|,"QH&zTzm־EEb"SMGdVc+"E"+|]WdV,Eٰ+8?,P+!X;"LY?IPtR87E6Y&8)X�b4__R)V+k4XH!W`R5T`I(mϪVGYČB|b&񈛷"n|b&񊛷*n|bv+)]1v+)]1JWoR|bv+)]1JF	]1Sv+)]1JWoR|bv+)]1JWoR|bv+)]1JWoR|bv+)]1JWoR|b=N	]1SvOw|TWoQ]*+Ew|TWoQ]1S*.*.*.*.*.⢻|T]QwwEw|T]Qwww|pwwpwww|p]8;・8;・8;⢴8;・8w|pwww|pwww|T]8D8�r?_PC8m_[}CmǪZge�
    jk?{/8m_P;YÉۏU�'n=W~_q?
    ̟
    Qx(,5$T:(#r63%୵X2Q!J4I?,xfD|eE%OT?%%�e1�GHmV*֕f5QÂGAY;^0	DA		'A"AeN.2z:KRE%4dRɡ:,deIFd"bn:JЛt'G,Sx/J:)"2FeQ2
    I2IYdȈS3"*ۘJJBUSYT
    gĤNkm4fFDJQ(Β2""΢?<�7-lv0na)"*OZ3Bs^"x.
    *L袜,:B*6^XNqaI	,%4L35*D{&Ҡĸҵ(#}#YX3Y(Mz&[QFّqƓF		$:I,"_Lɴ".5:-TߛCn7Y&IT̓XDfTڇ"#7Sc<#RpIRPFJRdTT&na0$<)ˋ%Q#5	X#eQ"2V	4dXDdFGEddFGU
    o?d`e'HRW♕&eEf	TՔLԕ%4ai22$ЪKSec\c35iQ*""t6HHaȄqD.̋7[C̬a%M*!jTPmRI(B줎a`#4&ta!*;&fuK~�Q7!a^hMCA`gIRAJ3KumvjOjLS$Ґe(K2%qI+'hU*)##Iބ?F\[mtO4gJՌI$"ILB(k$
    M_N*<"I	l-)409$NjYIz!'\7
    )ոDIJfTDXEAY";0.4hq\b\IqhQ`!FvL_DȊ�_ۏU�'X&<$&-gE
    QF\
    ]55wk,j8XqYcWyƲNPfI`褜##!ĥV HmGI_BH堜+?8S25&
    &:L̍)3g]6B=)
    *KEEPqYcWyƲƮe]55wk,j8XÇ^SCiIR#+$9X](y[u8tvN9Jk0ҪlI֓$tY#a~ÍaWO¦|K�cFxXf5X;DCFaxXdAPVlSHqYcWyƲƮe]55wk,j8XRqf}!q-bTTX5X*π@iCۦfBVj.2O}8ZsJʂRhB\Mi3t̎͐TBQBLA#T3EAmGEpΊLΏƮe]55wk,j8XqYb
    ..tgE-%a*3ȬqYcWyƲƮe]55wk,j8XqYcWyƲƮe]55wk,j8XqYcWyƲƮe]55wk,j8XqYcWyƲƮe]55wk,j8XC\I22]$dvHR>R|g~*+.T:
    |=884QуE(wXqPIJh*
    bT7P
    M/UM8EKMJ!i8)3O3rhy
    QJTDGӂtteKCZ5$KTj3̀NC-(ڎpΏj8XqYcWyƲƮe]55wk,j8XqYcWyƲƮe]55wk,j8XqYcWyƲƮe]55wk,j8XqYcWyƲƮe]55wk,LC|g%TӊJ+[q꿖;ZÉۏU~O6z孎~_q?q꿖;YCmǪZge�
    kcO6z孎~_q?q꿖;YCmǪZge�
    >jk?{/8m_P;YCmǪZk`?'n=Wk_{q?s꿖v
    kc8m_P;ZÉ۟UO6~!-@ge�
    kcO6z孎־~!-@ge�
    kcO6zbg;\L1ʨ<x)G�nl]эͥl]эe~sYn@ߜ[75c~3YoF75c~3YoF75c~3YoF75c~3YoF75c~3YoF75c~sYn@ߜ[75
    e~sYn@ߜ[75c~3YoF75c~3YoF75
    e~sYn@ߌ[эeߌ[эeߜ[75
    e~sYn@ߜ[75
    eߌ[эeߌ[эeߌ[эeߜ[75
    e~sYn@ߌ[эeߌ[эeߜ[75
    e~3YoF75c~3YoF75
    e~sYn@ߌ[эeߌ[эeߌ[эeߌ[эeߌ[эeߌ[эeߌ[эeߌ[эeߌ[эeߜ[75
    e~3YoF75c~3YoF75c~3YoF75c~3YoF75c~3YoF75c~3YoF75c~3YoF75c~3YoF75c~3YoF75c~3YoF75c~3YoF75c~3YoF75c~3Yn@ߜ[75
    e~sYn@ߜ[75
    eߌ[эeߌ[эeߌ[эeߌ[эeߌ[эeߌ[эeߌ[эeߌ[эexh}%v'{d0GhES
    X>)!�?�vRg$tXb.IyCWշHt޲ū{{Qj*2\6Zfw}ޝޏݏG,۵޺n4Wm~m[mT[տc	goC݊?E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=E"Z=>K"	g�y>D2^E"}^k"ϑׯ5gȆ_kךȳC/dY!,zY|ey>D2^E"}^k"ϑׯ5gȆ_kךȳC/dY!,zY|ey>D2^E"}^k"ϑׯ5gȆ_kךȳC/dY!,zY|ey>D2^E"}^k"ϑׯ5gȆ_kךȳC/dY!,zY|ey>D2^E"}^k"ϑׯ5gȆ_kךȳC/dY!,zY|ey>D2^E"}[#m;4vv�^zk͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S͌S�eFE.Ȁj4mXy%^JdiWnOp5tdYGm}Ḿ}wVfhۻe.	[_cj)۷z{5Uv6*}4PeX\z4;iZ쥭b4rlosz}%߱U7kN;jtV9_-Yk۰pUtv%%~]wVVUZTQm~:*Vn&X_n0(I$rm*]ݯvUvwKf] jz>|Fxiy,KCR+3�3I
    --T֝%mMUܤ{"p>Ԅ97%;ֵ2N5/((B{6RZJªgj(cr]Wq[л]n
    ܻ,mFըOvUrfWfWevd"@e-[2ߤdՆYŋWUq5{)J'##&AYqt팫ʑ*H^–j[&^ZrQ^9B]	l&e3o|NMod*Uf=.v]X��p UQP\ᨦ=2wwfcLpȳWZZףM[ٻX@>\:$PUx6Җkf(fuշڴ^{U/Ħs~lb"F"f y\eBQ0;`WL*6Sa*P�rd1%WLU?CfoΚ@PʒաD?aSoW]]*ohY.&vvMuc[dRt[KSRܹM5Wnz};I9d.˔�X(G\zc+.Y66HH[wKmNhDAo'FĐٚXgPqqlzqqx>xEMdAM5*m]9'	̌%#o,.cD=}m#GŖЩ7[G |Ec�\0|C(Uebu%e "*OE+ŗ٭Ku҄W=tg#ty9DT9=^`V;eԢCuo
    'Vi߳'l6A+8fjxD؝KMmJRߵ5ݫOs}MzS^׭5}MzS^׭5}MzS^׭5}MzS^׭5}MzS^׭5}MzS^׭5}MzS^׭5}MzS^ץKW^-]z[uoץKW^-]z[uoץKW^-]z[uoץKW^-]z[uoץKW^-]z[uoץKW[�uv?ïkt�a:O?ïkt�a:O?ïkt�a:O?ïkt�a:O?ïkt�a:O?ïkt�a:O?ïkt�a:O?ïkt�a:O?ïkt�a:Oʗ}c0}vi.[jڝncJ'Uw6SѾv}K
    .oqkW,ߧ~5~ޖKoR\]jee7kQ{uMҪvK|sRf֥�ի
    ꚠ"uj׵+56=)jD]f2ǣYJc&H4(|'۽~VUXV]۽Nin6hG%	ꢎN{SiVm;oaF2ws&5BӲTP̑-l+KeF(K4+,B#4/xNz"/&^QK{~[[IrwzM/V3ٷnF׽;EUtq�}~b{oY_i]ĈK~J-QjuU飯ҋT׶o1H7f66q{}mY,F֩%Xr]oWrqJbX$Q2gT'Y]Se+Tm_&fOI[iK*Q	l[@1[fGW왞aXSZ #LBlFJ#[!V
    7sޔp\]ET??V͙W#[PdA	CE-cB~,mK׶ݩ:v'6zx&IiB׎CD46"#2Wb(|@|Z">]/iiF"ĨK'=9 j\.|1Id Z
    nU~B
    o-۶UⳉyF2YקyԸZw2q0P3�{2Fg�͵u[y2e2b24e	[ǘYk.G㣁qXL-(n{P�b78"j3yT�LZVD\b˂UPJmV6lpRvtxtx!eR{(&R6dիPwU)mZY¦W=e4_%93Lc.<SfXK4)|Kv˄ދW߿nNH:N€xp9ltDڂuZ^K=X{Wr6"(C=k_XfE;ӛ[~/C.loԄCB6^N̆;7Ƙ]r]MjUZ2QGbL _}U=FhrVͮ6ߒN6gz?s^~O׬߿S57z?s^~O׬߿S57z?s^~O׬߿S57z?s^~O׬߿S57z?s^~O׬߿S57z?s^~O׬߿S57z?s^~O׬߿S57z?s^~OmFݟkշ~Ol׭{fmS5mzٯ[kz^k=^שOl׭{fmS5mzٯ[kz^k=^שOl׭{fmS5mzٯ[kz^k=^שOl׭{fmS5mzٯ[kz^k=^שOl׭{fmS5mzٯ[kz^k=^שOl׭{f۹oޅwmoGm}OT-}OT-}OT-}OT-}OT-}OT-}OT-}OT-}OT-}OT-}OT-}OT-}OT-}OT-}OT-}OT-}OT-}OT-f}T0wimpᵽ�}kGd	//x+FH򕇀IÆ,SwqS޽^=JhYv\\>v)^Wxty6+v/ߦHum[�{Z}g߱M5m_UVmVѧBɲ޸rr,ٟL)Ȇmj5޳WMms$F(dayQAʔJqjcձUЎ«Vm[w66~6uVBնU5fzxE`2PK!yXPP6۹i]k؉s],J[穠:oyzj&-wj(Mwhke{ָUmlmmuޝ.ǥKKocD?DQAM2e%`Jƪ]JB.tvmv<voMMuvGi;ތ7_elnv}T붧ӷo;c�ev�bUϮ:mI_~7?>*~%\޻dˮ:mJ_~W?>*~%\޿D\us뎿[Z~}qo^%\ֿD\ucsto~W?>*%cֿD\us[Z~}1k_]Ϧ;}mkKo~w?>.]Ϧ;}mkKo~w?>.&\cֿDLvs[Z~}1k^&\cֿD˟Lws�[:.~}1g_eϞ;lL~?>x.o��<RkKmv>w{?qw?Z|q[_]ώ9}kkK/m~w>8.~%ֶDrw_Z.|q[_eώ9}kkL/m~>2&]cֶD˿rw_Z.|1[_eφ9kkL/m~>2u&]c֮D˿sס>6u&c֮DۿswZn|1W_mφ9jM?]~=6u&֮M?]~=6>u']֮D뿞tK߱;3;c;m'__Ӧ;gKt~N/&}9vDϧ<x�Y1;_gӞ<}gkLs~Nx3vDϧ<xY>;_gӞ<}gkLsǏ~Nx7>&9v?dϧ<xY~;_oӖ<fMrǟ~NX7~u&9cnD,y?Y7_wӖ<fNrǟ~NX;~u'}9cnV'1vb'�3D@Ez5CVf&)wgD2'VRuV-^(k֚~3cmmz7OS&5߱e~j{
    :o&ثnQ]zUSﶎ7J2qit�ٳ9P+L[<E^Kjݩv'vѳq!}=Mmc:~�zLhԧ^&S$	.S}X1p(м4nBk֪dFC׹U>PN'5%L1MEG(mN\2{ܼ-;ӿS2v}qϡ߬wU:#={2<uҘQ\y03Mʶܾ2-趩%VUYzB,sWۇ$˵lgI'Ah-oN;o6u[dgcc}?Pc
    {;Y1�C<1=1Òpvth-zlE)`i`22eQ#(6(MƻKT�-uQ@xA5\FQfWB<Na%e(pc$o۝SQy�{nF;[Ė?-Sefo0fCb,;˿Jۻ{c1R1lO
    ÒLk<DN)}(e�R
    2E2ʇdkD-8_;zǢAoΡ0{YpWL8.nw7x1eY1KZ1}ճˉG*N{߼@`{3�GXA[C&@<|NU3zv1uZޖK`I#ia?J~n9ބl`yU0PT>xۓYzT4F/ikb9%e0<KA6IoC"ĦQ�21:"aygDDL̉UUJb{:B񔚃h0&T)ɹ'Kc\%trʬ)gwBQ6Aq$&5D	"6L,"(qijzZZŮaBDThr3rl4>3auNISz|Όt*nxS'0x>xl%i{OQ1Xzj7i72B8/#SRK
    }DY,Li(ڡ:T8JaY�/d^*DhTЬ#j8G
    GR,^CZ1˕fkA=6/<d%5a7Ch~�sx
    ~�4`O܄{wNW3ypc/R<y# `R9qǐ{{u{v{zHM(~ZxZ2
    n8hh$)�P<|Ni11!ROY]PޡLQثOIAR)<wAB{seuH[{ے)y^iv}/ͱ&.8c?law!te'/v*VqJoH̭A	cN,zo@8#2GRMFL+PjA	i "F譹JV+r
    :<ɻ,蜆?ްd5VL#{+t/M$/l,|!qhvg܀.z <[p
    #	 *+o/*iF`PFȩǡ5gѩah<}EBـc}
    u9,tq$ 1bqVdqՆqv)J󽋶x#,mR	d{yK<P'2jHa}e&usk4N;5�gHacXDQ311K,;A!ㄳ3Pۇ.%XuZV8\ҙ#QK9bBrRt'#	6f3~U4jw@ѽFTw-ӷ~g5&@36r$);'x6!C8'bt2QP[={7˗Hgɞ;mqC'Ob!ޡ8f`<r),j4EiEw*oqI+Dy)ōL&t&@^3)1d#FľxP,qm}W8)Ov�?k��Fkw)cZ}^ƿsC�goz_�g~m�^�F5z?;zmk�kSGc_ݶ�~v;>^sOOOOs^�zzmg7۱V;k߳z^c�kѫoWkn߹]g~}�ޏzZ5z-bףgŶ
    �km~~mzަv{mcg�ޏo5km=�~�s^o-^^�s[�n?u^[z*gv=KG]mzs}z}?5޾o5uMgj/CO�}=]7סc�^o�ٯ]o]�ů_o5U]w*7߾CWDD?u-룱oz{Kos}wEuSL:GJўX]v;=ǻ�}vjѐ\fKeƍnҎmުiuV~Q]C}{us:mﶲ+ng?__2;�o8+>SBNТei-"&&!ȼǾ
    7RD̅Um੭KsCRu~03Yʼn:k�eSF&LM6F:A8PT3c|ʰA e\lA`𸅛!Q ɓ~K1Qk{귴#=
    ,7> %%h<?
    )&W6n'VW]q=KJOqu+l!W6#X`6%0r1Ո][:>0H{
    gt4=JQ/*1qKڋ7ǣ#\&"g38I$acTRH!ƶՎ=<&#\e%7oeϡV߷ާ0By)#FFpfF$m"IIj5de&xDY!XJL$wt7k]܏HXaJDb&Tr%r11_=	*|eC%(Xs^T:rD8a
    RNnV`wwLEb*lz8
    CHbT+&9*bbP_c0û?Ty<mҰ\Mo7z~oI.TC !<?G\G>S8X2^m9I4NV))'4hZvLgB(K1n؎.]&hDcV%�'Ux88e[NaVhrA#bi{CěhP@U1춳Ydb<Kr<**_GKWz:>J<|u{%ZRԔhr^T;I'J)	
    Yv!HBgdyd;˽ۡkc~�,B(X2/s'ܣ*̇@׶*chtAQf+G~SPe߱0%#§&N�84C�fru|FQ)Oq{VZtHXB.MY.ƛ)
    )0<ǗU/7j"].0uGӗpːL3s6!.E[�ynv.<aSC:D(k|r-z(
    13�V=m)c`9�dk+(H[: |:NU&0"&Iýط#wi{j9|0A!
    ݾ
    kJ!�H12ɲƃIo:<ݘXeZ4fbc-`힅[cbg+c.!dF80xv2=KXpFު7;hZ]MidID9&Q)x5D`93TJc$֥žSO
    ]
    6]:4JIA܏B͏@&V
    fleL<*ZڌG,4Zn	#c3x@E8#23I	?{5Ύߵ߱uB2XJ�l*vbjF9Ȫ㚞Rg*DKfò̂{B20&}¨@<7=%HٗR#v@T®1VdΕڢAi8s* HB3RMniŜrOeCv7+Wq�z~;}z~o�^}z{�c?>v�}v{;^G�G}v{?=z~=?��z�z}z?_>
    w^~z߳�Oo>=wzק��ק�z{mo�7?�^�OogW}_Cz?{?>wo}z~^=ݏo_C};z~=w_׮OoCzwo>:w}�]�]ڟ6}?�>�c�}Oo>?Wo�Oo>[kk}vk�kmz^__Z�_k�zZ{=z_k/G�?v�=C/eǣ;=_ס�Z_jZ^۷c
    65
    *sv?yM[nj�{0*brrp~߶ۺvڣ44=ZB[_fm+oNۢڏ0bG�ؾ#K7&iW�]
    &N۸]NӴvv{oC�ݢ�4�݂�4�ݢ�4�ݢ�4�ݣ55�݂�4蛟c榾;c榾;c榾;c榾;c榾;c榾;c榻7=1S_1S_1S_1S_1S_1S_1S_1S_1S_1S_1S_1S_1S_1S_1S_1S_1S_1S_1S_1S_1S_1S_1S_1S_1S_1S_1S_1S_1S_1S_1S_1S_1S_3S_1S_1S_1S_3S_3S_3S_3S_O3S_3S_O3S_3S_O3S_O3S_O3S_O3S_O1S_O3S_O3S_O3S_O3S_O3W_O3S_O3S_3S_1S_O3W_3S_3W_3W_3W_3W_3W_3W_3W_3W_3W_3W_3W_3W_3W_3W_3W_3W_3W_Ͻ3S_Ͻ3S_Ͻ3W_Ͻ3W_Ͻ3S_}3S_Ͻ3W_Ͻ3W_Ͻ3W_}3W_Ͻ3W_Ͻ3W_Ͻ3W_Ͻ3W_Ͻ3�º}ᯚ}ᯚ}џ}џ}ᯚ}ᯚ}ᯚ}ᯚ}ᯚ}ᯚ}ᯚ}ᯚ}ᯚ}ᯚ}ᯚ}ᯚ}ᯚ}ᯚ}ᯚ}ᯚ}񯚺}}}񯚺}ᯚ}ᯚnv7�ᯚ�a�v
    Co.�^K�o6�X2s��ч�56�X2sX(G /E}O]sT
    <"(Fb
    ڤtVRE:w(<|R{ۥED)(Xwdp;2Nԙ;J&{Ewu6HWӓslqL~m(Jx۳v6 Fm5c[ZhUզ{_	QY,,m+B٨EHǒIW*ѥ=oݚt'Q
    !-B:5Z5a=\2vDFX"jOM+4X:\~/&4Ole$ lK]nb[�#㫲,-Hg"۪86g$9>8&oT,<MHȪM+qU`ђХ554'b5vBCS)c@w͉&[9&\cw!uJj~n¥
    ^o!~i= 9frkbM@,+aQ'ƴ#
    ƅ56r]
    vSY\'C0u2qFe(q)I#Gnh%#OJ۩\lh2	#y"lqkfԪ5Ţnh"$VW{Bӱۡ…Onvy@)]\,!
    P|_WT9iᦄvw};WcLr6iK2=t
     VW%c8Udy ifP*]J#�1˛I*G${%n<rӍp*#7Xt_[*/$hfYEPC{јSi	z1QH%CV1KUbf+w6me]-`CGㄧF}e@7ZI9``�kB1LawnJ}QUto^^1U@lhך'R}8ܐ	ɰp¨)t5?<]jNB/fU9C&\q
    ݲ@9/Q@pp}Q":iĴܮYXrbalrdxG0G(;Pgr\YG*PSmɛZH/\Cg]oy:1q"ESl`''@	8}�$"=XPBی.Y‡u,ٟ߫B-tHnh}ƿ)eM:a*vj/{m�f8tXrd`A/]Eh(UYHua(悻JSR㷩EWItd�="#pa&pH"+Mv>4߭"572{oZŀz)f+.^24fa:D{>=/NX]U]eb3EΉ
    v=;r)L;[N
    Em#{_٥"rɋ櫐@/P
    H+=N$s%*Z{f[c/1Ʋ?2(&,cm&󥄖Hqh.RjZ(w2XUmWy2+%ƌƐrHBg.֕e8pءNZ5יTU8J>ac9[am1T5cUV.fbsf]Xv8Q#XavZi<%Cuʐ
    WA:[xi7UJ}P^|+9*'w!pWskche5wGIJ08cov%4
    4+Q޽ը�!41Lq+LJC;ނ4̼OuQ҈]IHZ4SNf.sd{ظ.퍄d`"!RejS^"c2us-aiwnjYOnت*%sŸSHH0ڈ0RA*
    _m1^sm.,JmiԊ|J;-4!H+ ؝-]SZ4>UFN\E7ı<@ɲ(PxĹ4z,D11SQUct[qvvڪK°̢W3Y!Cetl9e2#
    DEKM\FWrEVL,4K%xŹܐIA:Pmq 0`hHд64RН6lX6+J4<aFKYpm=*]՚^$4kjP6;J]Rm5}X͈'z˙`DwL(7I{R:V\U@{!bZkR(dPHӈeQtwkhbɾDCWݴނrxb;ko�{w_[?֟aPF�'5b%MX!Eyso*jZ;:c%pUօZz,@QƷb4+'ksO}l,<P?EXՑY6B�!0:@ C+#dޓ,|m=q,9cd-ƭO#8-۹+4F?!A
    Ť2^jQnz+uoU?X>HY!*1x=~TCEU6#$nW0n߱ܬXnz+ec~=fF�²4T�M m#XHd&h%b5LR+S{�͍?c@aq/bIi
    ˍ`g;:mo h`)BԚMmfx={ݑY�<cNDqFTe(EK#udU
    G4V{#s*IqaR
    ^=Hd>gcGI%GLAyel_sU_czzΣ\}x'r~"aL[yV4gUxLCFf
    $4Bj\B2Kne9fv3^3x8<AVj/eHj4G9wg+0ި#zĚ3i/MAj`1<*k]
    nB庆f7Gez
    2<^C#&LtѬLKECmAu
    E0кWh+`;W~q&&>Oe7#j%򔉐4Y-\ԧqU9�xEֶ1ȣɢ-`'f<xil:@3Zk(VBkщw"ݰa7UnDbʓǓvgˑtIeI!*vvU@RGz5'E0UyQ388%X!β6S1<i@**[U68(SmnlP¿k]d^|O`]bMbQ#h5Er&tΆLh,:,Yqe뾶SonLM>h^MȘMl(90 
    P'BdGFÌ 6)weYZXNvHR)zŘC�s3Me	}ݖ036Ig�IHw4y*wwfTpIk+ؖ-LN#iNEkNYUҮ[|"�ibi;m�AeG+XzCi2UlcI0
    K!(zpHȹKq5jo^N+I⿳GKԋ`?>W}
    'Dv>c]N1	c|(2cBh[+�DWK#bG{f1[h\aTgU7mt!Ƽ9�rE@2/r?
    )p*ގhv2[)T7u+rj+?ʟn>Hf�c{g w�lN^iC�4o3)1psl:70GU"f>Y5Vk٩NOzSs1(^O�S퓰bE)4�PXEŷm!fFvZK^?uW
    	<oQ|gAiJH#ٕwoe7x'BɪpRb,F%ބvUՊC*OMٟ.Gb"{%P$W}+Ivԟl
    &[)]\"3JH1hKHAK=nSה%k˝x-9TaRr^OX/C31,N9Gvgk>&qз^g-I=ldKSxNe6rLLQh@jV~Vы -5_hِp\މkV?!nDօ~dp\Ʃu^R,M7f߬ĻБn0"ZYvIɻ3DY|Os$�;;Ey#TBM%:K$\<&iY1~c8i?igBjc`Pښmys^YO'q"US4<pA$X(v/%Cdg+Hkc٩K3rުRYsr>%LglwX$xB;fiilg'&0ļ:<oΩ.ajtE4/gW@]IN9W*X?Hx#v%2=odz;PE%/˔'_of6RƈBB 	0P�tWDz4,kFc[kVp?%5-iXrR3DC"bF-qZÒL<u,]Licçjuƶ(+
    `jr鍵բl{j`Wy}b7V6lpihX֯�azXk79�,k)/?;*,Hȑ,D5;5+ۈY%oyuMMPFαZao8p*`wKSYg
    .o5M\qFp?yЖHg+qLFQ%WX1IC: ꎗGE4YdBr ⢹q8ZI	 /I=5j7uu+8^eTQU,۷�֘jz}eo9�hi�eo?s,Čk)SsB7kuGez\](nv{So�c*�eo?s8�"�hKƨX݋,Uy "͕$IKs"!O{M.]v7.QfvnA{#Sf浚EV$EZ7Vuo0jJ3߫mвŝiNP-ҹjNߡcUNɔ-mLTUvhWfkoW�eR8dr>#kE:JE|v1SRKئ׻K6WOY#ușt	hsP:V6.@uv{)ZkI]・)_�i#8l
    "Qّ,f罾YJ$5}o-*oު6)[@%VW]Ԯe~gYWMh(OUw-ExLO(\Η:v}S5kgg^UvM]=õw:7ڭIl]6Ze6wL*xKK;kWk]5S�jRG�Z]nRK
    T)R͌,m{N-ztVR-#l]{n*
    3fz+zv#%o./{_ttS^PBzrսɬ슬%BՋZڽUTW_�Q�56?q_�q?Eы'	
    {7/ܥ2yjQj4i]^vQUUo;oq)̰@a_[ܰ5Q	]6EW=CyEE7P/ݰުiqb	AmRvXZ%j%Y]A"T΋2&@DFjeTإY:WSM[w{u[X%	�jN(쯎9d_n{ԞŴrIjgMm[~#pxޚ6ȇ0
    
    Jp&2w_8CZꕦzjPD�)k]j%bjY-([Ubڋ]w}e$|31ͧ\I&[2#fc鸳n7^ :^B{e\JFusrVX&UYurGAN!(XU{ȬRwdI&~\LfY*(Z%yə,DH+~	_\.bT9i)lޓ*Z4RXܱ@$|ŜybkU,M}
    w٪_�iĕa*-/Yoolo)rNmvrP]N)Mʮ[:'Y
    ]\l0`4VgvA-ݥ/vӸP7qEZˉ4KZ8
    R'e#'w'Vs.vrLDGdF,X:w}'X,ba"77t(UK\]ɡ
    "	)Su>'gIRrxI1=|PDnɄUJ	*oݾŗ*jot{"Ţ0,+nEMKʵ~۔jw~gD�O)#�Gx`]~q}&@Cf7SKm8
    RTn6`|zSnإ}B5׹ccxsJ+N	�GA4TNQwMw6zW^NBlR"1z6mdBpP"Tƥm"5w,yW~N/iF:!ȡݫQa<ZtgndžhOɑߴX9	cةo6LwS̒~@jR:y"QA6l];TlRڮ	,b7qv@EוAɑIqYKLniIn=֦sW-`#y,^D&L(FE"lr2N|Jdn4Q}-݅,"89HvSiK?Z'ȘdΗӐ{g{	ߺ�2�ar0�ZᆿYAN4BqMEZqpux9+.xTKKX\n&;jWuvz|*BX
    }cҤ)0?J>*BX
    }cҤ)~i?,nέ}D]4(RmCz7]Wl[zwwڶ	
    \=brی:Pr{_OrɅr:Xnz;4Nm%faY/腨G%�Qv‡YISftWz6U5նXcxDG#kHWup VIJZ֥so+WUʪ޺v}a
    sningeÓ,)V{;JkTvvߵRטHS^`~!O}yT>RטHS^`~!O}yT>/JqdCҀ2rONȑxPaCnТ~QU5U#?>VB&(?*{$^֨TrnmeJrQz+]WT\}rV{0͑+F6|gV+-T޺7ޝƁg~!ca-$;)XM:/vkmmg7Do%'_V9C7�}N<~NXA؈M	fHfSEr#,Jޝ*BX
    }cҤ)0?J>*BX
    }cҤ)0?J>OcsX	R{+K
    UڱUյ;WcO+ $'oZtr헷4UiIV_%cn&]B %ɀ4NɩDVdj_;::6}mުvhݡد9$]59AB6�haM-lVMu\;WQ)s;#Z9<49ɩյl}s;ٿbڻj}L$WmY=OsVV-ԝȂVpYaM{ZmNWVT>RטHS^`~!O}yT>RטHSQ)=�./{<&/.�Os}U>`~!O}yT>RטHS^`~!O}yT>RטHS^`~!O}yT>RטHS^`~!O}yT>RטHS^`~!O}yT>RטHS^`~!O}yT>RטHS^`~!O}yT>RטHS^`~!O}yT>RטHSMDGylwgwlSikkS)2(bjM[Uꛅf"Sp(B^h$1)f2ͩ$u[E;miG:П0oDz#ɜndnr7
    vtP~H+]6x
    ;ȷaqT3v-p{6ꢞ;ﶘTDI-^{ɰW[־[
    -UW'ڭU{Wo~|^_-h-$#aUojo,`Vh}WgmM$=%ԭ8*#m	)n"5X\nUB{Wܵz5ǃDN3d d(:267:D°:Vfj7]Uw,+W,YmnulId"(l5}8ǛMۛmSWv,^{տgҤ)0?J>*BX
    }cҤ)0?J>*BX
    }cҤ)0?J>*BX
    }cҤ)0?J>*BX
    }cҤ)0?J>*BX
    }cҤ)0?J>*BX
    }cҤ)0?J>*BX
    }cҤ)0?J>*BX
    }c!|t>I-rF|rB@;t~Ҿ1�56?aȬk\MGr8bu4Ӝ:j3▾\Tvb  G!	=:8Fdž-TfrX>j"v�$Mc88He!!dlĵ42jfqU[\jk.l/1԰|DSH#q|p˲BC$ىjhd^1IM⪶E]
    ^c`$ڧ5G;D"#idHɪciUmqh:HX$s4@o"6vHH{$1-M٦:i9)UVˤ2³}xb
    }homw"ɞ[WILޱHjG֡"ijy>^c`$ڧ5G;D"#idHɪciUmqRTIO"k$wƈ
    DF.	d3#f%U{4M'%6ӊU3Yt2³}xb
    }homw"ɞ[WILޱHjG֡"ijy9[u,5D;T�&Hqh$Dm2쐐I26bZ5WLtrSm85Q}c5M@,+>ȇ׆ ֈF},tDnA֭yZ]j*ݦSCAr܎C`E$$
    œMr#%Ֆ[*p1*zmV٨Ydڜ(WK.2M#(\FF&F/NOEƥR$
    ejr$\RGY/˓7 Qs{8:.Z=[MJ+�'_-9�_5;
    ꚡm( $bi_hі?Zy~BXg$LԾZǸZ;ASeD
    MN:lzuLJB[5HV3uh	Ѱ&/'\?zS?!:.̍n3$6ȍLk/7!X1FY^'9e[d3	OGL˱.ƬS8>;R+m#lйmOG_F	,CG{ij{em!re"aSMLhc x}dMYxkc}0~O_뜻)k/c[ԓұUG}$V4^XP(pK{u+lBц`(S<-#0$�27,y)Hc0hP9*Vg'V֘	fTl__#K@嫁_Yx|8?$eP0Q<ՉLRyDns٩KQH
    X'2riҭo),l]dy3'8MI1Q#~2;"o2k3&ׂXدI+ȜgFM;ke!bG%.EDfҽߑEE_]y)R=5V
    !Ks,/c!YiAŠF\AvUVЭ]7$"_(Q�'ښY_Y,UQ@F"V,%ozkUU
    J�8DLN@bG9Yo2*>MR&덏
    -Qn.,Ȩ*KE$\�2	&
    GWHohfw,ȠpK]#BGv^ȥBNԩ~pV[g(%'&g;s`,$=)l^.*\tŜVOq9V1=8�o)FǠͷߚY%!#coj:ӳ}{Rm+	e6@Q;0= ehd5
    v%6Ld
    Ӵ9w5q30ԃ"oLz+-$�dOK$Y Yy+Ws\)vP*QiAHhy�@zwf!
    ڞ؞ڕRZkSOv몊7+bAȼCbHy:PҼlf6y#G"R	JKqs cVtwP
    .U~ˮr3;ܣ~ZyEDZ40rRsHyhDߧ,fw膛T3PB% ȡҡ5M5$o
    6&#eJ6Piۨe*binIJt4mŮ&9&bcC2.']yszEl+tZE#=J)&r}	RYKZ,/\/QBEv/\OYʷad2KI,4)
    O&2`ƴCb^HUDfGOchMb!Rs'oshKT:pUVZY6On䭋.Kȹf
    Lׂ~>&I@t**rXhQ$oK}Gf˷۪IsH`W
    dv#i3dE->NagݼU%(m&q/A*
    4!]�y,>S9(N8^~ʾ{Z
    1K+1yHR,q10=u&#v…&V_C蒤[(o
    ok777
    x22jD<0T&݄RۤlFR;uc
    5(DAq4
    40IbxMeM۸m}^¹% $11�R%Bcb# ,6v>xe	uHS+8k$9Ђ
    $pܰ+q;eIb2dT
    MXZQ*U_qw0[yYd)L7-s+F`i!ڋ֦jJ8t/=ޘ-~Ty
    }gFi
    &7~BW.8Σ"c"jkGuW'hTa�
    ~79G+�Wi&SAbF‰,e
    \͜H	s
    Ɉ
    bdow gjFP쎫Q6fc>mYfqc�z.HD&˦uv.Ԝ}jCUlab'->:0lx,bE3Y RH�A:tή:m[=j
    FRc'=2J9	$po\KstneB@-~RIwl]דxiӨHi@ګWXc,Hab;
    yDjUSXMg-@ŽյklԠ_&j^ppBK"
    yhFdnxLb>@Sz[bO$_㝠V&!♑N7ZdKkyui[<buF45ZP6U=XXゞQ _ګUv.YP0pnmF85(#ɀlg(ڗCfwxHžE}>љ`5K	Ȝ$(|&㘐	rT.Y,ѹW1
    &>#q\0f8KS&GWf!N:'(4I(e9eo2b)q;n)SuNDv.WYeqQ܅`T=X#2"oX~+kLOxIJ a;{Qj,tbRSiӵnL<�%gwkzKOMO\;Xr{jY:Kf!N:'(4I(e9eo2b)q;n)SuNDv.WY
    ]$y3G$w$:>%rdghy>ÂvzD&+kl"9F;XvSVyvȭTʬNCՇ'Yn󪴱\1K0
    CILȈrd$36#8qrN@LH_Rs.,:`*!}&3"!˹WhγC\؏T4ze;뚵hQ2X}!}K%O̿Zs�пk/mX|テRv]cGٔɍ6N63-+la\"cWwؗ".;-(G9mՐ2J!OJ&w<0+ ?P-OiҀX
    ONO]jlYt_.loم{eMdx5TRTUQ0;A8x5?0:Zչũv<$6^dyQri vZqa`"gj$O3^V򩝹jri
    �\T ıRN
    $͑1^G??1HαMoɚ0'rSivnReN8', ͤҽ�4ˌ410p۔8%i&jmdvQpț֒`vȬ¶vsU̱<He
    oHc6T4zJШgߪ0DeFo&qBVl!&jV[ihG6!v	cL]Q
    $7@qp#s|Nb!,:-PW,O'Qu(J5HDp̰EfgPŖLv	#b&ƶd?lWﺴwMIi]l0d~>dl%@HO8j'o
    GY$8dSɊLY1L5:CqNuN2,G_WhnslKR$3)Y2զ˘PYr&%o"Vo _eo ih62qz"M5	N#	)nJ*~ٍϷLT/"M=\gg'}T,x-:L "62\J	$sxҞɍgWF6#n9D$s$Z,f	7bm\>b:(lvXy"
    V\~IfS$&J˖OP4i6dbG]|eWAV)R}?Sl _uMH(<¥ɓ$%A-`4R\&;@q:F,gT>dVRL%1Ww-/K8T5͌}.I]T3.)|`t3zgAVIc2W$a$
    ן'B\0s;e/8Kl	nVHh	$lSc,lY!W:ѐ̚nk];'(@ɣv;
    \25$)�&vp	20˄%*K;5*ӽ.WPz7+cTֿR8Uv8F)!@m8:RC5Ĝ:zWG3
    3f
    ?XMȏ8@3#Gy|c1Xg
    -O!|Z\$5[x[KikE81^ńRrʐQgMTsDW[#[+9Ѕ_PWOr.W(<;9ce|M&T(Q/ws*؞tۓ(+Xڟ6Ocޫb<2n.B8zkؑ+K
    _?G[hWUZ9=#̝[@sM
    +.Fn#r%r3(qIrQrY|1_>ehzvVl4L̈Dœacn\yB@J:2Sb!4T֫Վ2YNHhe LbL(^	EaD`#)>PeMjBV')*nuux咬ktD&SokNFx{-A–7]Èn4:1>GOZel9b`X!Y7/YXj&B@#_NR7T6{ܥö86'ľ	*3EgU7䴏:ʧdV6S{C"/Lm%�RTD[zdlG΁fg_h2ZIQ/F֡_RrsdãRFuumCd¶S$Dv̸8?G-%F#,8!d:+¥y}3ytDpel(B&m0շ/ë;Zo8exߐKemX!##Nm!l=Ϫ1Po#'2G�1x0,u,Ydg,5! e)*u^b=դ8IV!lOv([$;$21w8UM&IE(PEe.7[Ģ)%^-APA)Q/"^AJ̆J[QSya[[ZR6�o"?֟aPF�'?S,	ܡ/s߶	ncޞ
    
    
    
    
    
    
    
    
    KR@jxvW.wQPڝbi{vP5\me.\Oq�3iSڱkg5�\o�\o�RK-w\-}=HR!W-oM/-VET^U'ݪ{{g
    
    (;ihHy�@z&kڞ؞ڕL"WSOvw(uX�`kꢗ1(v(\I4"\[궦DIjnս翃}�{7翃}�{7翃}�{7翃}�{7翃}�{7翃}�{7翃}�{7翃}�urwTo <XlLVU.JܴU׋UvnҪnݭEʯZ翃}�b#^M%a/Jvubu֤Sw{;֯QܷE[2Ɛ$O
    rGc?	`e*-SW*ZXթzߞ
    
    D o�D@<|R^N__�=s�=s�ьBTy2H} -B RaKHt񁹼-8j5ŵ{S^o�\o�\o�\o�\o�\o�\o�\o�\o�\o�\o�\o�\o�\o�\o�\o�\o�\o�\o�\o�\o�\o�\o�\o�\o�\o�\o�\o�\o�\o�\o &k+mR!NsBjTRk֪OfZU7/ovl0aPF�'?S
    JFXV?Cq1i|}6eOa2	H[MۉAyE,hN+Va83HআY*\㖗hc^6h6usb>'?<&aث#EKrbb1+@цζ7.ubS_R\� ۡwZ!`[KqLUThcXcvh#?h:bԦS-߾6ӑk+Va83HআY*\㖗hc^6h6us\=1%&ȘJyML%LXypN#C7gZEwcm#Tr}eb>'?<&aث#EKrbb1+@цζ7.ubS_R\� ۡwZ!`[KqLUThcXcvh#?h:bԦS-߾6ӑkY)0DRŜhei*b$q%0=w
    /S+i{SWBzkb٬xS2ވ$G~,@,nPr`q`]*R16Ɉ/4 R4uLQRSK�hUf۳ηQ[QSzEXEG|I&:dE+IS(A$Ǎ(G)VzXH;ܰ.0c鳈',wS+HHv?Twj\fWxwR{]6Udj+k\B#LYʈۑ%1yѠ~5Vm>njue98U1`? ș^ű1LtSҁ1q�ٶN
    4rNKwҸ0c~A27'9+ctcy?7)blic—StqhayM*�.�|" C	Gn̊>ȢI~~gdبȄԠz۫m^MX4ۚ?ܴa2EXzaz稻LLTg
    yHD@jPf'*[T9rSq,G9�FQ�Vב]X%<)MRMdQ/M̛\/(nbG+D0D<A	ԡxU+#nD9!2P.EƣjgZ)ovT;[pJCrKNq L}qegxyQ3! D!`#ݒ6'5omco;a<YW/WۇgU,N#VAWwfmq*gC^᜿$dn1\_XD*u+Iqn;6>'T$aXjd0F@@ gH!%f1|b d:Tu^Xmrw@;	#4
    `h
    os`[HN14f/eR}e=֫䶌KMV"#B2�= .]
    _.d/�X;+@r6H&O6G.<c<g]`3-	viȸ9Gd�cdǶ*!jI-8dlJPN<ełS2!񦁋J]vu-WqbLm.Cfh[[Z\EL3əcCK ՜aD׸KԨhKʎP=QJ	܀B?0X!'xA#F2&MzX4T!^貋<$-F-t]!,OxVCIBDȦ{&ޤAq)tR{3�^E$d@ A&Yb.�X#XOhF)U5w|Ey6O�NK8,cX*12-Z_'n`n,JOULmmhGq"|:2^G&eg!
    ,Vr2j#^1.R/*8-CLlE9N[̈́IOL"E#`C3)ph~DpΑQise)o{ƓH<cl=ᨋ!OzK! <qݫobM
    
    ٱ~EL/c\c+t 1'W*ԠSӻ*uiedr�mŕMwCGAD)0>O/m
    ,/f[`v,5t:7c$Gy/0cI d@;3a|s,xnW&elw8zq�M3)<4|`=tVl,{ɍ3zrMb"lpO8w!ib
    A->~$DZWo}9-!//9")m?q|X5?1=U@'IjnM&c.fؑ<6a!X^ח6qqgi2R%')_x'P7
    JFLIʅ{9B&d68C'qa	a41X۠I?ȒX"NL-+	mܾ◘W#o'Gރ7¶dqQ	iɹ\n}Aڟ6ݨKgV׆R~!y�#0F9aÓX>?GPjQfkcX"[,=ȶcYNm85!@dzG)Ga0NZ@tyQ2ma}YR:2>
    $-Aّx5+9\5OoL£ʍ{X,"dv.ocv;㍌dC3Ł)�۳CthȪ\dxSX-�d�Dc:2E.9d\Nk8` DtNJh
    ;tySx
    l*M!rӏX".d/tcY˾N.ZًMo#H#с#X}!80HheCmb$OI,~f'&Ac_NBKHKKWpV'9pq+fV`ʇ_sj_`y}b�(cH561l^m{i"G<44mj^y;`Gf'(fiVMfMDLҍ4R^p1ULED
    $DʏnjtỶͣΛiDJ[އQM2>Qq(7P ','\6L~J7f:"1Sb8KKC6aC8?3
    Ģꝣì
    GU8F<kg1CR#tyÄ2خs=HR$& +S7
    Py4O
    L6o
    7d2+(3d)ia;9MV;&s؄lU	J{v@^gEj?(K50ԉ+Rx$	BZA۹"O[W4D`	|NI
    N3.=
    uzg4"@qĉh~ԉ1:EaeJZwz.QOi0/d?Q;
    ?E"�G5LnDDA#<7$h%׎Rܟ
    ]3CkaV^,Ñek=<\U<Zxn0_nw@Hhu0KfXt("bT-C1<688n[I%/-
    =em)c魂$!IYb$_dNiјe /E
    آQ*~븵&I!@`:]jX#L
    (LHS3%OT=^T$i)Ist3Xbs,v}f"r"$@1GS•
    7qb@KNrt}8DG)7zMβk0ˆ위qy'!J�g.MXb?fEz[#nNG*:<FX!0tHѵ g1dHbA-	4Uc
    #Rt1ͱN4 &"i=xRX21JǛQtW>$cXA`㊼c>@1.Rag6^P#2HDcc
    (Kx~̉s,tiK:ơt
    Q!GpՎ -dLsL`~klܨ͆ÚRrz9P-܁L[Cm �rܰwDbrEJ	Fu"K]T7-Zq'I_c35̡°9Pd{8<Ol;$(iW	@3U#;Y?;)["4ӏq`x̦FGa|ibҗfv]KUXCːٚ!%m&"d#u:'MR5]cckm֭;9)S#?S'CP|$dTQZ$ 1<m@ˋ+OtaH␜&3`bѶ
    `,q2ǭ84j$v>4
    6Pq+ݻ7935k:ln?&#ђ,Uq"sYC&I$rSDV!ۥ#ʛ�VK`p\W:?4G259sLp9MҸoIGFܝv`'x
    bsr$@Вw+ǘ2*d	!ljV$0'Aт2.Mh"};]Vʷd,vzK #z0"bk*b>[RdLy,@RHVk<R']R]*Z6\?a.1([4}iѴ+Ån	Έ#h�
    YxDi&qNdٟjHoI@8@C&;VPɇܚ6V1;e6q@4�厌bˎY'>)2H$}$)T([
    H\%4qYysor9b`ꮈŢ>H/t`H(D",Fd!3,7|f+t2yKIɐexX-Ӑ<R+oJU2Ü_X-Dǒ0
    MF5[^<b)CȢd2|ZN$Y-ٚU`~CSd<4z"ׇg\�($cڐJW;'<I۞3"
    M�H$*HZڸto�%PvTa%__gN~GΰFiE	.Ar£
    tp3#Q$#"B;+ym}qbH葉sbBr	~6	`,$dY{[%Ѣ.4eIR[-jyVm^nV!59yeđT�8[/cd4Aƌ7}KeO!ߡ
    ӽQC#e L#2-`9j
    0h͐v$+/R:(awJk@$ҎL,)cL/ r#;x7.;;@BD)xB[VhmۢZE(K"1�-Otbgٰ-\%Kda,2n9#X,XerWkaL|	hZRux"<LJOby#,WZVtSZW[+nR{&	4:K"Xd\:˥ŁN>Б
    ^F՚;[vi Fc
    Ȍ@lS]&Xvl`IF'K'L8HÖ;Vj\]B|)�/d7!mUTHlFl!!\<z!GXS#qyb:E^7O!SXdc+q ֕;E֕}%۶MCN^c�e$F$?B3b-F|q*M_}&bkSwbCjBwGG)RtiČVRT& lo鮵 XJjsnƹ@p,NgW)MlxyTV'r25ugNm;uu_IrbPl9Yp<IO�u9KQD0\hʓ{IZڽ;Нd
    T!yq}q#T"Fa7D%,*gpkH7҂څۙΣ`klJLe
    L#<\I2
    4y2,Yq<LSajˈF8yvsX ǹ6[&e¡S&RL�b<z̼K\@++TZ+nxݩdHdN
    NF!513*8B98A饁au} z%voP޵{㜕&AGy
    F7O.pk(R~_	ǡFBMh\ĉwwYn?xhq#d;?E.sJ|H2(emQdiE2nΐ4z c9Egs4ARY0J=	$p)t ZeSck+d+
    |LtT?I: s),*컿"0gs&^/;?Ho;h"L#i|%fr$ Rqϑ-�>;]XI.:&kR߿lآ&ƉC`MG/*bCɞE
    )`ZG|ҀcQn㓎JJE�	c6f$u1;Fc/JyE)9H/)ezv1ڙ1[%ŶT89r|UW4fAn8ːhH^+&٭? ѥ)xJ$\>Pd٥d3Y:l`NgHTƘtk-א,99s}7҅Xh.+*^XB>ķ(bwT>uʚ/P3`8%ΜOAz7șO@%ȳ#zQ
    +:[&.6	j#dbH>';h?3651RӶsrU/Mdm;Eq҉!LIƅ#kjDԩtrf rku큽v|(XEmT2Cd3'Mlzfi˘|:c!Ƀ1E{=%#a#=h&挗%Ly2ꑡoGSJ!bȏ1)/71RTgf;Ŷ|3YVFŅ[b5-FFZoBla~#{;|gsݐÃf?fIhtvR,q[Wڷ̜ςpk$!\<ՋR-u)7h1r9=lOɗ)NI~؜kDUw�b&R*yLBX4h*U}MPr'rzZؕJWbuJynR,^yn@c}7N/+`m bcH}&v1DQvG9wL`o,\#ưVGo9fLf9ZZ\_e^a$69>7C5d4l-^fW,cM1uv-28bvJ[܆0�d9B)	G
    QO@t1�l@*dd9H
    =\d6nplEQ|V8؁7		蔅bgUj`g41dG"c.%ؠ	$e6'[$
    sdO%
    cXV)(?Q
    T5+A>X"Q|$*&]""VRumoZ[Z),أ >fv0nm?f
    bv8ZkJ-|VeJ$ԒXkռ6(�U"TAiU{ydU@
    ™׌R,8	&怨nXWdw#^'O�$c	ϬĘW0i H	|uB}ybmcA|`~;-X+!*6p9_X[G7(ʔI$F׫xlP;
    4fD~2s�']%~K;f|#"@@:ģT!kOzzfg37Τ,qoˉW,A[OYwr"lh`:bΥҁCm7e~=2|\W
    Rd&b#
    IDl'�sS%tMSSh.X}\OD[ѕ\1k'KCz$b<k]�q*x�)s2(w*4tݓpcBcSxg/YN5{qŗެkDlرb#$VGoȐἕ#Qd(Hk^?.@.ٜwyB]W)�d?jgc/4*ۍ(cEo$c㸁3 <)ʚht%JkQ@YE:]ty*
    wakI8 zʞA\Dg*g8+ᜊMxT\|[$FcOYƮ9@coyBQB¬o<0/:L@>)
    R>ŭnD
    e,m̈U3�۫/xKY{#m�9	0$&,faO#fGٓ8XnMhh9L}ޛ6*}zR5tXetTo2?''b`6ņBxYw,] ]P}�j?+7r=>A@!8CEtt�"poz@
    ܞhnU­ڲҗUqF%uZLur[w�c<g-(H/9ĝD+t F@lYMv1f<D!v=r>#o@1OMl$egV2fP"2`	BaKqȾlvGq>w{[jPM7H83UL1oI7!H:eR1R>LZI\#G.ݑ$v&l5]LK]*$!!́�gl!`eybXnr/ux*oma
    &1[Ⱦ�yGg"BZk2p)Fr_%cwt
    פ&H#Ͱ&?Lwc!Ҩc yXvd2ѼܷXF9U-5wEMB7< tU,plS;beI4AN |~;"JIʅt4^mM{rt�ţ#@"wۆ6KR [84WL$bI1S3/U$J@qH�2'ξ٬񍉞QdR|>4T0,{huJ{յeD&,p^8PqbJKrp,g:!,33Tl8a]V<<�k'!p;#-380%?y#lr=e_-
    5o#FU2>{),鑒ԖɊ'XhlɯQkbeoƒQ~dG셢X33₧hO&J`C,{#(C o&Hk!@k+GeSdՓ)6ӃF2
    Bd8{#氲Bb[	\=wVv;nq+4OXs(fDIH	<BҔ@o3:|r6NŸi$'Jٵ{D[ZA"x֨*cQ؆vB[	*ZzDA"dJnIf>[XAxC9W
    H'3	k`U3aoiG#ۼB]ضQ(#J1R0ŇdTA�(SZ{E
    {\ZXʬn?҈>LPBŒ,Y&U@~=lO[;IZVMNɟ^ZX9Q؏ Z3&UxR(یF?RxS/EOwהDRs1?̤ذhO`}v5YfpB0[yzN͡ib'
    8! >p	a!\qzd~EC@*hqHynÔ_3A( 211D2-~"d0ُx<|Z;#.\mpV
    
    E9`#ӊ
    ^	<Gx)|#_ġj_"S5,eGNt׈	_р@#G-9E5+Hj2i0d%\!	c\Fi!k[lJ=[05EsHCj	q<Ey,ϓ >
    *
    aY׏ir|/8?.˸l6g&]PF=~J@%;ڙƯ
    z~Jūr[ b/268k<B2	RűeQNW]J4]ZDr~�9g"y=%}:=<I>Ǒ*=�gyq0aCaAoD"{xа(e/LKΓ6wFCqk[5CaKs"?kb6K7&(B9^ns@BL55<),>;:<٩)ya$	67Yk#hŠvWnCH$H~0ɱpkT
    ke֖!JtJᆿYAL*%W-܇c5TںZm=kgo{>+VkZ¾=j
    +VkZ¾=j
    +VkZ¾=j
    +VkZ¾=j
    +VkZ¾=І,ک{;	_
    NRm4w;mZ{;vt2vW)-v[Un߱اoC^
    x+WxWǵ]_ׂw|{^
    H8lANispIE{qScV͕]Eknk)Wum+VkZ¾=j
    +ViCiCRGґenc;X5!.*e
    hT%En[Z¾=j
    +NZ.ԭXY#F$AC9&MyȁKZJjClQrvVkZ¾=j
    +VkZ¾=j
    +VkZ¾=[8o&nV'm][]-wil%w{ZwN
    x+WxWǵ]_ׂw|{B/-$"5V:,c$Cݝ$IM65UXMz
    x+WxWǵ]_ׂw|{^
    x+WxWǵ]_҇a'҆"\-&&w
    5PJk/C]UVШK~wܷOw|{^
    x+WxWǴ %J
    t}J,[1
    C.$[ݑ~5&djVjI-ݩE/\sz|+VkZ¾=j
    +VkZ¾=*Va(c}Z!O	BjjHɛ]Niu(lMFJl-ӷQkj+VkZ¾=j
    +VkZ¾=j
    +VkZ¾=j
    +VkZ¾=j
    +VkZ¾=j
    +VkZ¾=j
    +VkZ¾=j
    +VkZ¾=j
    +VkZ¾=j
    +VkZ¾=j
    +VkZ¾=j
    +VkZ¾=j
    մ&,^(Xٽu7TSFiՊj{JᆿYAL#܆+V̼/&c=
    "VrmX*0}&T{h:{sh2:KY`A:c̸#G#X;lN8J�U;Ȩ
    ŭ'mUbm6muIu^Ǚq#^FGw7b (p7!)�vPZNڪŶl;pL
    `"w'(grJ*o))7
    j(iuR6k	u}`4oJ%øw$nVSΪnQܕXfwKB,@ꠉsoaQ,
    p<v�fje֖LX2~T}Nt�N2H(5/6f`xT->!iZ4V֑n̻:C~R×Ƙ@MUi@dwN^
    y9WWMԪ;hBEA~T.mS1t�tZl:%TnmX,ɋ^fOʏd&Gdxl;DP39%7rǔћ5dN`Ӄ4t)kIC&a%@8
    `&M'2rB(dCw֬[.ΩQI'Z~ϸ*9ƅPAxY&:eM1l`#SNrDK195+}Pc##$J;6# L`x3JձعZ\kW3,2�dPk4_m,$<Ff[ }LBӽewh"ݙvuMe‚4+$wC\tcQOfRnS$;3dƱ3֭9ű:WJkl-NMJT'5XD>3H͈ň>2L҂rli6.Ve/+>RcJY
    r'!A1>fK
    5%2q}r;bvhjD0mCA:k,V/ň)1c,놹d^b%h8];45"XP5s+I/㖜�/b(b'~u:0tZDszFdIc*@4X#؈M"ꯧsliJQ۳Չj*	1G'1HZ\d68XKx=fwl=e.!|tH1u~`UrZ8K0I^Ze/Iq؁$P(ю@-)b0@;IT[C3cO7M,B�c43bxb 6E1jfד)YC5ͮ'ԍr&4ٳ&tg1fK<ߎw!`7Sx"L5?']xh{IiiKxȸzg"'e	]RZOj+wjGP%98Vyٳa|Rd$	#Fp+B7X܌6VRXKq>ϖܰ<+�c)~'ɘ'r=UGxpfEpQí\U"<`+=TYptk
    ?ٔcY神_ш]֔mɗ'fx綶AS4:S*2Kb9WLr"X`S1<Y۫{~@?w"[humbU6}F
    F~_|�)_f_/;�F?�Ơ,^ĬlK#NqoApy0pN7uGQt%V3%܀mJ�iZ;V)mc	?2SI	Fˈ'_
    [F
    odóKYGR6ƊnCAUHK\+Lm6V鎰10:"|pHrhŞWI
    tS0$&~I˹FEG ǂ�fD1.azKEw[L,mkY.KbX'Dj.#~,ѱi(1g7sRf.$hc,3G
    aɰ>612lJO(1JϸFn3\J05=\l[
    %qRj!c%%9'|RT#O9*
    ŦOouD"�PWH%
    !<lQ$`=x`ݶD2^G cmے¬ŜI0Fq3Io2g)TrLQ핏	\OcucG�NES-XX*H	$E
    "Cqq0Dp3d&͔H_'#'ɺ\za;TcFTy1e_Y	bizVy\"zeX	=4
    K(#U"466$۝rSJ,Ƙ'XfCF_'9SL[^.f6M}�cGg;4iVUWnME\
    cg\]G2K 'udQͱ]b']	Y[xCp4\C%ƸgnXg�1o\mF9*<}83"ո(IݪdEǰQG	Ǭ:5otGD1,rs/�h.J6˓\s[ D)%1hi+c&C9?,0)rwս?u ;[r{o-:*>ܣ}~_b/I��y/E�#yVopcP/bV6%'^ӷR<c8X'̋#(:o@6hح{ܶuKe1j
    )#en/i#ֲha٥#cEܷh!ѫhpg'ew\1_(Lpi;%:A,2; l+F$p2'ég1&Q*c>@E�8,F /
    i@fuMIɳ@4Jۜu�T�ޱ=glQ	19ɹS	H՗V>6mn!HY#RX;VzVUk<L14"aWXRC(6f !0b-Hz*NjI!q0A]d$M01C1vVVgBYny.[SiN\_HG1BXꚌ;78Bo7ڡxFP	cKȩ*K=BNV32b4Fsg4>ƌ8ݡӃz-'}egrAL1-hബLt|2Q醆ò
    =LfDe1/HJʞ]kn_m[fF.[ǯK+srӻrdIHl {{{_JJ%IUeᏱ<
    'oSHt17%o:РW04֦My륤'f¥"Cm7&O/JᆿYAL%u"F긙-S^i*ލnvjj~ǧm)2(jG^';BGx !2D}/RJ~nn	l::bJ Hx^ep$.nhc,
    CrB'B	,!zB*l=:XNm1%$H<w/G2741@Ge⡹!RBMCSX6mʏ/U$7*	1=
    $#	IaUY;C'V]k@FuοNѓ$fWB2T7$"t*H^)(|rr"ӭّ])FGpKH$*eXYiI(mS#ʫCڧ!-'G[LID	̮e!QxnHDTS`P /V(EM[k#rC"1KE"CI
    ʂk.Ol$FCIR}&nzVNIFZ8Ѳs3~ӠSlȮ݋J#L˸%MےMn2As,p,`̤\uUS҄Nm1%$H<w/G2741@Ge⡹!RBMCSX6msXeeH{&mC	\NRpKQBެ6Ysz\[*L!mҘ۱x	DiywrIҦQh.eR29]n=zPѓ$fWB2T7$"t*H^)(|rr"ӭk}PDm}[!+ZX\[Zj(Sv[՗.v9[OKzIcɈrPZ,v%)vm;["zS	e+z$R+zkn$LޅƋ[.@Eb1mJnGȁ^FJމJޚۉ=qː"QbBBujHRJXWN2{)}EEQUVmワolpQf	^MUSQWkrݺ߱ݍLS̓j>x!){F
    ƛBę$إIK˚gFWw7eȖZ}\eL1ѕN}Q2#x]&h:sc"QSMֶn67'i?$ۥPJL hhR\A\Cc=qpqTK[%iվߢמݫZԽm2FĔYQl=390?cBXR?rNu	ktqK,y:1rnD켈KIٱKגתqqTr
    .J/Y$oum+6JJ\S#]R;{zEuUWNCP?$Ҕ}YT7_KpsTöZnX]=Alȥ?g>z#}<ݖݍ?1$u!ZGw<:Ѻg=3pn:dM>T(¦6ࠁ`ՔZVIgjci,Үt[2@㔞ߍ/20Id3K3Pԥ\r,YTa	d Ɯw!D)i"ehnD4:޾|]:_D
    2V.ֶTA,6NIr3*K+åv0qX26,[AŘ16r*m2b	ٵJoKdzhG`ufAaԶP[J8e@@�"
    Ɨɐ#MX*)fHnr܂ژ*nTSR$[
    W@[2VJLN'O'U!]%)4k	>lPZ7xǘSiJa%
    3*%+E,v~\r'lu3|RP\8ڑ5T<pG;dr	&'jMݠA]De*t*3ͩ-,sbVU Z_J,ɐ K,*‘cj�tJWU:8
    Yq'%ye!soJ�+S6bUN8=a5Vl
    ng_\=_뙝s3~ӮfuuοNzi3:W:V6ÇnJ1ooKv(ۭ)[w$8/boM;޽nmziԷM�R:y`+ L*;~Lfe2#P?88r[.sj:ydl\odXtf;ԿF|5Z
    9]
    ~WrFJƲH"[og1	6E\r-IXT]P0=~7oo"]!D:9f{M.=(dX{협MB	+iHdKMvR3LkV"c䗐ő>>Y<G
    Ϡ*\3osoX0ٽV[n|)cxH#㙽c~QM8H7̨>}%Lܔ)mrC\hl6u|}/#IdfU%G˜u&@j[,)4IlZ[MvieKǸlpsvw&r*LdSOP@l-+_\$Q1eW]iWPH- xOolJ$|jR9DCc,R0OgbcN`Sw"ZBY4\޲4]f7"]Țo_>./"sWdBjb+Uy
    k[Tt*ms'CRh%ƁIarlw}8
    U\~bQM[}uf6q1%7%ٴi#Vy:3m [(-b6FqѐaOAwٙN14GX<`}n٨amjUEo,Q J
    ܳdd%}Iy*TҜoHjV?[Lj%hB')*	ƀ,DӮM	M5><IAd R;
    f`E[Kk'HcI;Na>2P2A;+:
    gwVYWR
    U^]VC-7Wɾ:ϖ@ ́�
    >`"vhNm_r9rPRSgj@7F,fZnzą>,{5i;ջ{\:@lȦ84"r.IHJS4@s,hWJG)-J9Wo[ko2T$rb)%
    /ir=o;o=GQ&8܉Q}]H(ss)ssZBk޺!6dQH)^Q<]H[Jle1`.,5HC#u
    B:%ttdi("Az>9*;/
    
    l
     $ma/
    ={cҩ"7p!W~Q�yf"wF;!YEJTXt(2θ IgT0qC&qtAdjӔY1>ϧglQSzt\RTgs3~ӮfuuοNzi3:W:g_\=_뙝s3~ӮfuuοNzi3:W:g_\=_뙝s3~ӮfuuοNzi3:W:g_\=_뙝s3~ӮfuuοNzi3:W:g_\=_뙝s3~ӮfuuοNzi3:W:g_\=_뙝s3~ӮfuuοNzi3:W:g_\=_C\
    rDK T*M钨j*!䞻QZEmJᆿYAL7*?-oLH]3'V7KR8AqukA*dij
    \P#oUX/o&|QBꓱ;D*4JfNn,qX=^ւTӨ'Fު_"8L6'bw:U1 iw>̝XY-HzխQ)pN1CԍU`DpmENuxtb@t}):Zb{Z	S#NPRbשz|03y0T-7J$
    .Gҙ%V W245.	(}zȎ7
    (uI؝|h26q+lWeYہwB7Z@Uru*qP-7J$
    .Gҙ%V W245.	(}zȎ7
    (uI؝oLH]3'V7KR8AqukA*dij
    \P#oUX/o&|QBꓱ;E˦#gRܾ|P%t!uq|H[w'Rw	RoLH]3'V7KR8AqukA*dij
    \P#oUX/o&|QBꓱ;E˦#gRܾ|P%t!uq|H[w'Rw	RތAK]/L$0HRR	\Gߍ!bp|%ܽ)!х/V⊛t!Ҥ1q<fRAz&΂wu޹Bk-5$X涤N3HC	I/c[O7y2̥HM7r.[njHmIP-VWslXɺ5:^Ek.F."jmBUiT[w(讝}m�ɍy�F[	68c@ImSTxŪH2Āp['رU
    uW] Vα frPDąalxQ!
    dD4}?GY�TP#e7(UE(PE'0	e[GY`#$ުHf}bS84[EʒgJ2M/"tq."Ĩ;#ÙNJ$ÐĈz`v#}Gu
    ǻ
    Fռ>7
    
    *Ôrd3&55;=FK+KB2mm^<L<@><ubQz)W8L'IU{zv^M;Wv֩}FM2J IBPD~�)	Ŵ\;w$Il$IVKqH]Fc @pY3𸰊um5) 2A#H:՛uZ̍M+GG-opLJ~w8aZXD 46pҍ
    IjzXT@Xі
    Ď X5dK]Uk lL۳RdptDcsԗ?e<5̤ϵN1ŇÎN(�M4U=7r{1@,.ndv[]`גAUvG[
    ۂb˝LJSm/[\]jY-umאA2lZcw'ņ]LE*!DH9z2J\ЪKqj=<:k@@$
    نw^sN%"K)%T6N7ILŹCaG&)rcWq9l7A	Y?T|ۥzeu%!g =wbyykR*ŭJ"cJΉBRJ4WZSzJksMѤ$8~j8K/Rt{Gt#\kjUNtYeZD@z?eXqV
    6*G~9K*5&"f^RLҹF(Kv+JJu@a:,JvѯjhX&6sjw6۷Qf.8N26wds}3`rSͰQŞ9Vku%$O9<TH*07dڕK|M-6X\U#OrێMBv)LtʼnpVRUiDЉ4 lbŌ	5/XJXlqY"t}@Lxws
    E\mICg
    (pt_TF3V*U9+ch,KCNŗER;vX޻L׌<#丶GK$y@xeYJL2Z?q;;8͕^q3^?�A/pxS;z:R\G2QCj#bQw(RZ7ˑdt!X\91ᣃҙ))1pWŷz/&*u#[8BK]~':o v	a.k1kJܸV+z:!oBаcCh*\55QMhޫ<ӝq$#Cضf#B$"f&'4Є?&EH*
    Zе"od-S@P0KLk u#-1qnۭή.,]?؍1TADFԒ
    3t.q6\Am43;RDՠuB:R+f`|iH
    bWENJK-<]F>Ѝc.\Wؾ4
    8>y6@HDk.$>GȯaN"*vV+N-+>1W ضRoDŽ;w#I9D#)qυ7\VQ]ZuV,4{Q>0NoRH+hVVVǨ*fHq7w7'IV}ׅ
    c�N.,W[j8(^BsDΝbtW{
    קkKEӵwhMjktmb�kѼlѫ](F>(~GpLؖ30OIZ#2FջȤO*ZHG]ظEI`YHs$W0;Um®8d8T!\zǚP'G)Z)sV۝iٞu2Es~uPFm*㈆LHuǬy:N:E	q}"b-@Jg5j-֝tdyٳ؇}<;R[tl%aJҎ>́8rDRWgԕhJ
    d GLЌDvܙ<'pj%|Ik7,֭GX $+Il$YܺHb-Vcr"Lc ʰ(]R֡7lOQusZWdh'ʧy%\QQ8̏�itp/)ZZGbo?ae,8_Cm)؁J93B2MGrgo˲(XL>E-T5Dw%ܳZ`o&T;drY eYYT1~*ԡwKZ;ߤK>E(Y?dl!Ob"	ER N81zT�%DhG뫚Ҹ'D>U;/pBdx-K|	HH.;}.LampͲuD_ *G`�,g4G61+6VȾP#cĩ͛qtNJ2'(ˡ
    ޑy,W'藓r+ҮF�'Gi\m扢*䗸S
    r!ED2<hqkeiHRt}
    ڸf\)byeORrywBq,ީBrzkdX~'(ˡ
    ޑy,W'藓r+ҮF�'GP,?p+0aj0*$	s6Y\!}¬|c ;#'U
    =-֑(fQP,?p+0aj0*$	s6Y\!}¬|c ;#'U
    =-֑(fQ2~J?ꋿ3?
    Rlٌ9@ZI$1iV%1HBY&q8קu
    7$V28;֔�6\qv)Aw-q]%FcWX.?WZFM
    ?eJY1FiTP?_"(2&O3$(ED!G]kHZ;;vk[Ҷy# 	H#q@Ŝf.<nƨU-drzO,Du::/HH?�X\4	8Iq#3I ɬ;Dnr!iym@fU
    �[mgЌ|Z}űܮvTw+34l:TZ%HUmHڑuz&Rp'"�d~qRՇD+jG0@% '@NDnm xQIEK&I!^oՖdn_EО<-c1dA$ EyjQ7:d	~uM$Il̙,vldʌO)j/r˗KS}5kW'ul0aCp~.{	b<uY
    =g6<J؟JһLdS>Vt]^dKufQ(+${{&~|*%SS(%lnC
    lTrYt0pC�
    _!q`$�c(?2Ç㴃'
    z
    T~r?"DG5C4~9M17Gh܅:9tՖ7coS/udIDdn2f䔛,*	rDR7J#cRe\*:!X�:N/A_]\
    .r?SHK+p^]hqba=נCf2"Le!|K6OGHL9O*g_,eH1~Q[Z?NTuSzzq4R'LmIg,J;aT'c'
    	@ӹMBv灛t:|XsuѴc!4ɋ0)s܊ (%5l.myxBp6@q%_bG?K)UaxtOV+"}!9El#_X6ic+h32
    706a`^\9#qtHQY"g$lmB9�&gl{N'")ȉdhz#`kt~[ Z(eӘ}Е!̾KX(ڋ9~sX$Q,8:B3j1J~9!^Ҥ)C\ds[ɰ8ͯ~o`Fw\,Z;J#k6rH9K\{#Mvv0vРĚӦ_KJda.dfOS݃]]&mNki-=T_,VOҌ=;^kbx͋RxnR%cQb~nژpMM2IPMPx5�g%B&
    ƣ^6qU818$HJQĝ3=$-DΖA?W!2`Qs})m˹f~Ƹ>?0Bo)aWȶU/9SZ6z b_Z�X+m�
    CX݈cL1|;@Hc#w
    @mAwy9ɫ2ϐNNg&>xC5mMQl`:r_O2.)Xږ!Mq=jL�:K؆2Y4btԾ2tь0Dtq.x&{*WaCLS/r GEAycX
    O9uAQāhٕ4K\&
    6qb!ˋ_q�fLxc! Dr,W)fA}_%GOKf3ֱpFᮈ_yyQy|G>*>OxE=یS鋃l̅6|vvbi�}ѩ5[#l'BSd�F�YTY%5)]['�N17d"X�h.0MIOD\F-78ߡg,\N
    sVXAYᰌ{_Z2h攰1Œ40kGC
    +A*焃C7K">VUu2u�r$t&
    fHd|,5JrR[7N//]o]gH}H_&_`hpF3i12{SQ2:ڲQ|=`M:RPž9k|/\s%i3zD!#[Ȉъ-.Q;1~l729Vex*y$9ھER@zv״$zgP*0&i1
    œ<T2ʪrJg<X^shwM$ADf_a,&./[ܰ^iќ#maطpF_51B}Y^ly*-}(<COsqb;D
    $GZq`ppM}[taYfcT79$MY|ʥ"\`麤}>.}#=>R&:e;KNr r$6.jAy=J3$
    ?qfTx9ch2>Sʼn(/bX0@?#9\,4|3F]—T2pك!2[4pv%N	XB_/✽/N2D;錠–$#miZ)�E
    Vq'3}UUU=qcrCw'E>2xqqHفC]cyYLRY),k*yLA`R;\pAmN(EvE1_/<+uu1,b}bJΉv]b~rOȘf=U@cIYԘXjc؊@(/>�S%,sŌt44#+"׈+A$e	KrLJ;W;D.N	* .yΖ1+ԢBOOt,|1?JPkƐrk7Ll]Ő$sq{6M�'UM߫[۝Q#I@X}pp_R?&a?OKܥӦ\oޖtr(uȵc8)_x96B/o];�JɪdM[6mۻvkdH_#",@ʟ!c`CNQ;y`sH
    Ku}_?:"ޯqPqPnz@%u"\R9K?&LUlaG&-%d:U(UA19Lr^NxZD,Q'&ĕK˝MJUj$pK+4BU`ɱ0Ř)!σ9`Sio!܌tɘ7\0I8?# c܋82_#|S"joR36!*jH~dY}XwmJ3uY1)e>VgA3{,,hcS;	[c%ӼL
    Q_8џ^AÙ	#	J Y-c͠}WB|duO	݄+:I[4odV, =c`D{:R,|xEx_&Q	yG<emǢ
    j)69cH71c5s,JNE[Xw漧[$Edw/U=r:K J9;H!^8W
    
    P̵Q=*H\~Ԯ(Pt얈
    cc$|%$.	̜pr6<w
    mz%	\?c412RjlŸ!l�%`#y/
    $8Xd DCK,c.ce!C@#",,{c19f=≎'y(c"R V?nW*{^{ڈY	U
    �[oFWՆk(?x�8,c]ڨQ5v,\nv۱?p?p?p?p?p?p?p?p?p?p?p?p?p?p?p?p?p?p?p⚔ZHݳtlw_*BeNiX$K;{X~SinuMӺ[.vh߳n7Ĝ8Ĝ8Ĝ8Ĝ8Ĝ8"Oi/':+GBGW 9LZu6mĎWgk^wn٪999999999u*$
    آ?.A[Uf'8Q*SsbʝW,REwwZs')s')s')s')s')Q  ~
    'D,>N䧋's(LKU+{qJuj\ku(?p%x| FX>4L+srFWXL;3 unS
    (ݻFѲ^ɯ( xux xp%,..,%Zw .{##{\FZ(~$5~$5
    [Fڔ+)$xHeDAreԴ+iuJwMw\]?p?p?p?p?p%:l4	4y1,،TTK9(ZƇօDʓ]*1`*6Z>M!yKB®-OCQNJ2f>h:ШJXnЮڒ8qMs8qMs8qMH`̢@m_A�U_p	bla!^Bu
    Qwkϯ?p?p?p?pt݈]�.[3ҨBQ)	$@TKZQލ뢡wcMjJ717&kBqikÂW;֡Z.\Tb[!@F! 8jᜤ*><Jy32|R($Hq
    .uQJĜ8Ĝ8IDp#@tqMD8Ui܇bq֥%ۖkIÊkIÊkIÊkIÊj:slQEέ|Á(p	t͹ZNë)XȢbg9999999Ԝt%ic9JP*_a+C^*c0KZ*VIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊkIÊhѵ"뎢Ner-̊-,QRq
    omZkݪwUO05Ѽm?XFyA9$?H35dA䄅rJfX
    Zich9}C*dwRueH)1Hay/2zL8N۬lY"LŶd3}:gG"٥W_gR
    CRn)h^eK18$HS<m_d#{QȶizTx?RC*8Gpa3m?	6Œ+T,[jC;zr-^u}L!)7/2TpIg	u~m$VXՌwL([4WCy	;}3�?/)0(".s3!ڦ}@3C{%R
    CRn)h^eK18$HS<m_d#{QȶizTx?RC*8Gpa3m?	6Œ+T,[jC;zr-^u}b$[$�t3kl'Θ8̄gj.׹a�
    #\TL!)7/2TpIg	u~m$VXՌwL([4WC/LL\	FE$Cݝ$IM65UXMzy	;}3�?/)0(".s3!ڦ}@3C{%�HLQ;9F1$#2B!:ɲhSpxa"$,D;]o/LL\	FE$Cݝ$IM65UXMzȬ1H2ܒFoʒ[ܥs\O:WB:a+אamwdV$dnIA#eIr?KgRծ'dF+PAq0k~̗?29i�BoI
    xIj0əSb-.FH}M!"dT: us6Nq<=[|q5#-c9%EpX#RNIcuIƝDv@T>0Lf"L=DZIinlͲ_~4ÎH[zC$fi.ʴJ}i<~oԏK\&(&Cɒ}NF,13PB@DjU-l8K"+25 ]-+ԙLG#S0ta5Z@kNLW.�bVrcq(g$񙌁T*I"'yn;Iijgqu1k۴$bۂ�%Z_,w6ô/X鉶v4g*{YT.y6XNB89zxpi*l[BƏʭ3Rr{%9#ai/A1̵Ɉ&g&X¸!�IBϕ)qi^_m(*}%;.y.yFyL�M|}<w3䎈r@Ҟ=s:\
    "L%*q,V9%F04Oi`VT[޾ޏ.swJŲXmي/0@
    FRiph^'rj
    "%	[-@t+ei:?L- ~<əf('L,%EFT\&!VY+]"Rqk[$ǣ9NA�89!r;
    *
    r犬/yjqKCl-`ܦ<XƢXLﲡ4nj5q%r:7S6=Io/1T]VdTc'q)g
    !PP>T;hPw<d"E%;
     1"9b>71P=&^Khj	Pܭ\<8NXVEF/ν׬mW#D-L_n%9R|9˅$u^PCԟn@#Ha%i~EF2xIpNcwpJ|�{MNm&IAWZݜжDSY03~‡/-(-Ju^My?"*VK462çX+(:0 "ua"K+^Z[EŊOt V,f,!=	C51!x= 7n6h.BHC0'aFb4/j,i`(*Y6>q8P˲Ec3޵Un픪B%'bJ^Hz3	sb7 Mco)xYǞжs<,'{&dt`v'
    /"Ӳb{4<6RrUnmIEŊOt V,f,!=	C51!x= 7n6h.BHd,i4q/\d	9
    3ove`Ebp6,ZXc|YX픷o\"c@-tV¤4n2;t\$ 25hȀ
    $fpONiܽC:$_eReS-Y$,0b'
    MW\H863icTM<#@R($,R&A?YOǀ2Yӣ{زE
    *Vͱ2jcIWb&HEʑd+Jc #ɓ'n@HؑP흽t~wA)z9;]dy=v3(t3Ifܸ<вX8¤讯(@BPHW'O#B!iȈBoc&"h
    L,;AFG'$,Jd	
    OEo9*CF\#^JeIr S]f�Ivn7
    x]nS)'tw!s3gGk=ӿ&$tC:.)S%@IuQT\59=EtDd0"5|VW:*yz̗by2(,Z<x+bsh߈#7w<9/m.vJdF:i6'W؃XH9ye	CJ@rrYGxw"j|!^WJkn]`g*մ1v
    Ѥ;n2J`1F,K^m*pf{D.mU,n'NA;?&J&F#rUd	/H-[2-kp{Tuc[艙8IĂM'^M&9:e7:/(ؘm%#QyʧT/0[ef'\CP	yFrQ|&,0'd`{Pɰ[+ecr^=
    9j2+Au]IFzc){K{8+3X+J52dM�dmį,A<HtdPq,;F Q1[ٹMkdYܐY@Ɋ`\(Dq\`�}6YWu:i]t̓O,qK`oZLq+CFps#gȓ^a=ȢEPC
    ks%|1(/vUY>0X&"&K8Q;cr&W$o76/TKq@D0t&Ȧ6Daym1\.8RȤ!!۪Z]*o&f}T,N:h
    {ɛTd*OW6"Hޡ{{j.8"S$ep<w:.JŜm-yˎ$;5l8G 6}h-$QetDB+癒c̡(&'�#ƪӍrwB%b|
    ('yQ�&~L?(<t|?�׸�M//y
    Ge	5l2
    6gi+X<dcB'vdU/ maF,}aAϤbD	@cyrA&¹$<!y0o"!(@ Ů}
    !JM䠩.	YdJrАLq:Bݛ:? o|hW}W'Rs1dQk2e|q14JᢜNN
    ѧ=(d;+ p	(O8>b|II)!ƒ.c)	FX.p#\m[Վ XŐ~2BL?<_rlHC`ԑS
    HPVJtʯf
    ,WRo%Hpf_	pJ&Sc
    Fح)Q{BҼ5VKGo0f}MA34Kld~_Ű{́"G"c )%1ӫhaliKlRD^<hb�LqJ`cHі?d0!PYwQ['SBm7XFO0(?x�"q6fzM#9w$̒d0uK!ḓRb:�t,.}X5":!<#S�l~p[t1a!d+V\9U9Oe@[<rٲy$Sz'Td'rj`M"Kn7$6}pjˇ;ۊ)Kg.Pv0Bkik[;KLS7~zwh`᩶D*JF"i~YB
    oH&`�ɼ9iy䦔y4r(8m֧u]T~"\e
    ǘ%R~LcB	iC<nY^cIQP2N7TFm_6㄰99NOɊ	1'q`�IڛXZtO:PB5Yn;H&`�ɼ9iy䦔y4r(8m֧u]T~"\e
    ǘ%R~LcB	iC<nY^cIQP2N7TFm	RHql-37Nx2r:Eݢe۩)Nqe7aN/LqXwLY''퓸
    �V$MMS'OnR
    ꚬUJXL0i%O
    gW4A,9/̜6@ɝ H<(NAlQ%H'&ow"pdpdZGqfb	o&iAqZ4+_Ympq7%yTŒr|>LPLA;�аbL;q*n[q_
    �s)Gct%3�G�PÔؚLιi+bbXBd5VeLBZNj܉|f%iś&0}djl\~ˮ_Ee*^9R[}&rXA$Ô!.AG²~.uXH V7{Ilq.`dFdS;a
    guڷh~hqa"GXdqNzMe<<GD)L✈Il	q:7}ɧo
    	-}kZp*="tg?*=EL	HC^fD_l++
    q4k:ce7H'nK`r=?܀L&bd4$;$;N9268ٷ:caV,;q?0R:G΁trW1*G[so%%|rL#8񱜘F0ѭ~rJޠۃͦ	f+stnÆtC z3=#aФi1mjlvO8YTaܑx"R3cL͉366˰M7ZCHj$jv4lk[!x\t0zrM&gyE/uv/EGu<ecC_DIw
    񦲙Z
    l2ʘIPڂ	_cٻjb;Wn"fCӗW(m|e('ܒI9M#A@ȖX@y<aH鋨!Ft	պDZl	&)6udl
    U=Iћ^C&"XL6i*F:;FlŚ	/Ƥu|gɔs,u<6CiAXɔrPuM,Ci/6R뎥D{#+GK
    gVƻЪXJKbx(#\Z[5nli4Ѽ:E_G=3
    Fk6-
    ]`y GIй/-
    }umϙ,R<D,�88V N?ݎQW&n+uqJ)nNE~ۦy9znbά+A.X
    p-{д$wTԙ-n^Hiֵwkf,@>GS~m2IXәw y.?KA`Y, e4Zu+/VI_w
    .wO!&t&"pcq/5?1^jS=Jͭ<Ood=9%domrB\ehWNI_Dem[}:7ijH%2(3q;,3G<& 6!I[HG2	#ͩHA Bki|QK^QҞ6!ΠȄ>7pM=$3ѰU,BR~8F6?.sT+hb
    q)8S}P$-7d`Tf:b.Ϲ>#ZfHp~M{"ty%Ē=skK
    Pv \9
    wAUzFxJQ<Cq(FF=^qMB'Fp9H	af;ܓ	F@2%7eOOdXTNB%i0<$S90ČT~A.0T{"5fsX>XLipE{Xψ|uՑlr&@f*]RsНBhI^d7QScK0$Jx cN7udPnU#,&aRv@T1uQ@LNBV{aS_عdp2umG9
    H c1>c:_0*0xµVRmWM~ж-)z\}^YdI㢞"ydIvhwFdۋ.yZ,_rؔXn _I5S//)bC,+
    Ō0EP4=k@|xM4;44pU,Q؝[Rg2GR-GMen
    #;lDSAَ!)3VBiq=Jwmu,L'J<tzrK,efDdu .˘g򰻠1Ndj--I_;Y!DM77MdvY)BTͶ(J0ul<uewN4qķuq7rY3r.
    a-ؓS	|^Y=^p}'q`,IW(SMZFw}XTaMymiBx&@DIedG)gghW5H._n+V]mU)ٓMz.^TۍO¹:.RM`d	 (B'̆7Ȃ_ÓڭSS5Z#(JqB)7 kE1;d@	!1I8\`GP'G'A_h߰دyX?'y_!Ȝ;�.hU, 'i{N'ô&EDFdd	ͤ"tp0{Jics{q&8F88DR93͹'' M&5bNH15I+*Qe2
    B؊})3 p"䪹1ᱚ(',MXVT	^63٥{ks`A_bUqJXA FqgLĀɓH qLvJS=;;T60ޙK[2vՐuL\r"Í٦R`X
    .V1T-rh7(W}+zN]X❬[ru~5
    "b0
    0޲"gv,va"~iP])u:hnmDQN8͝`O97!ć"D$Ӂ
    He-yZk(ͽlO$oDs^~MLdU)m0CՐ
    Yp{qW7=lnf˾bz,dcHrv_b)}{&/E~C+.7ÇlGt:a6!ي!UI$FX
    pjF*5ZqvO{n\O;v3Q,v[9)�%G,@bWJFYf=LRPXTe9Akά(4E)~l1^pז#(x]"މF`-"ZN8tdg;@H&r}
    l*0
    &rw1_xpKL|AÁ>t1垐SSlkG"=DdU<ò~:gl
    >Q9\>{X:B#6VeS*yX8+ S9	pkۅts�&:D@nR8RYN2xKٗ+✍7S dc9Hb�/.PmdLJƆX*]yV7aYA*)S&<28
    kH^SЩeW"LK|E4%R|Lϓ.̀qn򵁌$c77?6y~yQu)wP\r*8J+M.dd\l^AM1
    y344c5pw:`&(RmU'>N^;/2TkqyS\2;ܐYXWjKGc;N=DLa ͸S0dy4'"/SZTlQRu2we2M_9Q
    v79aK>z;M|!UŪESOkb7Wr=ϣl7l7l7l7l7l7l7l7l7l7l7l7l7l7l7l7l7l7l7_[Y9iٳ!pTߺڪwMUjv}WV,Cݔ;mjZQEoCm/<uÍ<uÍ<uÍ<uÍ<uÍm0UHߕܮdvrsCkvxi^Sbۛ<uÍ<uÍ<uÍ<uÍ<uÍ<uÍKscB25nD>%**y:RRkfÎȪe-Ψ$QE.ۧ<uÍ<uÍ<uÍOe} GԖ/2\h**dq[cS\ɨҲd<uÍ<uÍ[Sb1R$X*}qg1%fKW5,֙Eks<uÍ<uÍ<uÍ<uÍ<uÍ<uÍ<uÍ)avV9~|}ׂK{Cj=kE<7mofpzpzpzpzpzR>XЌM[6ϭJANktT�Y;*Ks	QmE:s4	4f,1&،TT3(;ƇօU"Zʓ]ꢪjߛ<uÍ<uÍ<uÍ<uÍ<uÍ<uÍ[Sb1R$X*}qg1%fKW5,֙Eks<uÍ<uÍ<uÍ<uÍ<uÍ<uÍ#a_*b4q,g%ySXcVŷЙzUW]hSl} A,ۤ*Ҥ[Ã3ܶb)쎪keV7<uÍ<uÍ<uÍ<uÍ<uÍ<uÍ<uÍN~T6)`l#*ā8x`q7T"uN[;t<uÍ<uÍ<uÍKscB25nD>%**y:RRkfÎȪe-Ψ$QE.ۧ<uÍ<uÍ<uÍ[Sb1R$X*}qg1%fKW5,֙Eks<uÍM}H+[6n&HIN	\aIPyM
    M+F߹G6x6xc8a3bmBʖ
    $,BA&,ʚڝӪrl7l7l7l7l7l7l7l7l7l7l7l7l7l7`UncMKm`T-Mĕz.nI\سZd
    ^Z]OMl7l7/cպ
    lܔiJEI83":PEXnl7l7q1p"gMl:8,:H4X#
    M-YM5;#WMUb|oBxC/CYz>	ySATv	U+%6#J-ŨMEU^%o\o\oK<G<5?mdQ*RZ]|Acצ-_jʨ]<&o͞:Jtt>>XbbXMਘrRRDmCM*ZUI]۵E5U
    GdQ}b�^yM}ߒU\ݳ_krtj\FNO|W)^A*ij5\NT5սjxk^mbLa�
    ~79oUTZ4Ly�יqSwŀrwZSj,?+cR@R"CXvel|qY1ƽe&,}Td
    H^#Q̇"qtx1cұViZKo/Z{m'y{Rb*LnAfN0%21r'G8=+	!jqH+IBwN9!#>h
    aToXѐc2dD=H2DٖaCcFO
    LnL$Ipa>EY~@;ɜ{gR
    cLw$NvUɎnQܕfX$%/ꀇsZlt TYDrwO`;G%.oƛ_/*('ϢwfFuJlLdd	I԰mQgth}܀w9A-ϩG+)Jƙ2(HЫ%H+O~;I2K�_v&2N)@�xJNy^e;J&1vJ\}7*_8=0H?&OMԃ$Mkd6?d>@P$ߺ`DzF遊;=ٯǭpѥ}_`ҪC2(cR@},/EƔkc-2uD )8�,B9O`̦G726B/\�AI[tbNd!JN0B)<8
    *J#țZ24Ƅ͒lX5)_qB
    =YECBuָh>iU!b1퉌) [>ږ
    J5ԱÍҠ.O~c=fu`^+^TTr
    !x~/fQK9SeĔ8t:xaF
    S.y%qbqTZG6"di/%goرckMK8Rq'r?ŬyY+2$nE!vCE) ݐNEV(+)f*Ka=Lg<,D7";!R"Д\?'DWZ%lɓU!�T]�K.WN[+%c 0Ahԡ3P:ET]N؊ݎ_Qk�(	kIc B2T!Җu1cumQ>\�˞_9(NA4⹞RC	Y^@@nZTUb`(7fo(~ypN`crx)M�tz,1L@m/; )ҤQ<B>;`Q�2v'@~)
    0{h#U~;&$3ovF%	ljikC!JtSQ𰐱ǖQ1Q/$/
    Q14#jW&JwnMVQ(d�)X~QBbtvd*e9`r,
    bU Q6k1bƫߕ%(,w�6-tnD&ȄTp8\
    ɑFOyez>Tr(2^7,=PZHT_ޑB:W7)aLvCZAo%|ORV
    	f6ܕǩ�q4ܫWwn ]7V^ؚck
    .:)�k�Dy|��yߕ�['x�J�E5XNr@}	#i,146s@iK*zݣ֑Z)
    m@*]	zQg%$>ɩC=0я	9ᝤ3S-3P]SxL(+`c+AZ}½aq*漪nb'6:/G\Ә5V%P
    .lK(;Axq� !\zx:J`)Afk GFcHƸHGE*bTJHSdȹ//0oH B`/V
    C2U>d)xpHN''leKMU@u*&'NخfHR["f/R1}joS(:\jZI&J#Hr28 *dȜfYGBYnl)Z9J9B<U]FSQ./d]&Tudf-%`	'xCD'FsCDSn&N]TvK0 bH͡U×N*hHTY+2n 7]*Rڤ�؃47Zn1BYxWR0Gn+|K"Eq$\qǜf)b$|8QH6
    N
    [q0OULtTL|W1e/|`?;H0p4
    9"1
    re>GS+2"hE\74=p~/0'QMU_GlY-l.V{ᤏl90Ø3r&<	ytK?~ccIb7+LQό1jiW #zc*t"KvAJ0PL4)}Y,Ҵd$#`X�['cQ`6UOg92jY'86ƤZ,EznZ6u1 0FPoTuXzh&;Y"P(1QPJש.Xep�%,@$֜R+ƉfxhUۈC2c=t='n#nOv(R
    `u�?-0]̡(
    ף+jr@z,cbU5$o
    n1aN3d%MWmFؖBR߄0@+2y))0’\]kPR#o$`q޶5c2ȢdgQ6&^D
    `WF*L'm;mʮHPqǩC8_vo)kƲ}f?=k䎔t_%D `q
    
    Q9IPNQ!M#0pU`TY`֗\m%(:U	<^9Ń}]9 #9I#F\\{s㉃ʋ #\ߟ?QMo"8*l+*=R�|iW֮Aohн5Z]XuMF-+<&.HyAȉ'FcߑWJ^nVL6�C;QCvfL=tci$$tbˬB@.:
    U+b;HsA.p!,Ğzgl-2wW*Q.d%án^Ѐ6<_1�hjL5H<:g̵JT??47C48}@zJteC%SVvN_ʋ�$|Upv2(:`s M~T#uyAt!CwR%qK
    ,=`h|SZd=,osُ#29 2@H<5Q}Hmus˧�~WN^H?"y$mrt;^mȎx�c!#<Ɍ'O! (kI4d5qفBSfkZZ|`w!@c¨4n|M1ؘ,}\ީ;S—G+n	'spc�QV_f̘>)wC,#bT҈n?!*^%eTc~s^\rʼn)|#99C =H; lT;uDib�q=Z	/Y
    $1h%M}܃AS1Xog@l֨*K$ON=JMoMuFu7Eb}[t*5!ݗtFИcz&RF"ʮ(kCrBFI;o#ۥtՂ&�\~j6@A$HCoi쑿r}ܫ+>‘kE(-M֠&"$N>Н?
    \RϷvʪ~D~yՁeOuEk"&4=e.yvv�@)oWZ`)r,MƹZ WA\4zMA�;,rAlɉ,#
    mW:O1jiW #zc*t"KvAJ0PL4)}Y,ҴfY_f<E#p=f('_~J2ّcx* %5]M:7HPFds֔p83c*-p+cTA/
    kM&aUAdmi� PַOqԊOdA\T{Ht
    ۍropR	\@KL	d{=exB<ibjVOϫ�%=fu
    lfH|akmHM	[V^dKCѻٽ)/Sa%uQE줌e<N?a4Ȱ'E9Is6KsQ�
    wXiB/^ؠͧdY=a.ZE$E=NM!䔶b&]lI'n 6+8͜%egCg}YTty*['>b[\+d<<:5Ej]ĕ&\H$J�p�5FMs @~kЮUɜ7Zȷ0?�Lcs!l7$[W[uUf$r~m8.Z˞]͞�c	)pz8($́R=ZL,eS[2�ªvV‰LeYQUm]yqa
    fOxc'IM)s'X3m﫯T<6:fجU"D>Ωcs.)R/ZZٯ5PqǩC8_vo)kƲ}f?=k䎔t_%D2p>vSC<Y
    ЌOTVhǎ$f9~ACih
    50=jܷYv/70,UcC	Э/$k!qo)K&8N`ܐ%L4@QK'dܥ?Vdx3Bfγ9`53&hǂMMXPQmk+-`�>dm,~4piOw;#7.2
    Ҡ?q;hjOKUyWBiO dCfR`҂W񸲸zNIٷh'vj_Tv:Rԭv3\'AOl-h:@1J�"FKɳ4<P(W٠0BDjJF爣1<ąYYlw
    ߪ>T`82vcxEK5"R'Β279@
    vZ#D}6_f)4pٝ?Kı-,
    ht2{Z6Ok^,QjEhM ؾ-5_x'<|KpGE<[s/)tm<vJfIq<6}%9
    )'PM�#]A
    I*eg$
    6rP븋=5aL8cFk׬/NjQLihT<Qf[[Y0s!?}?12%7sQ*21*2hr!%#SJN݇Pt>0Ū\1E[{l.§a(áBY2hbЧn!,^%dGJђ^P;en6LK;va7n|xBfCR.]
    D�V2ֽJfi񖌭M2ƁmN%8O<١$830b6䵨nTX:^	1l_0#'{oaOl% "/b$}^F[B]z%E�c]@}"H^]\5̱UYmˣ&w%C>[vۘ~)7 +eYdd{
    c{Ra]@XiR&r0jBD%3uKP>JQב4Ez\ y.;{:L>mВ*9]
    hܸ/M6SѦJf(d~;3V�OJ3Ɇ%S:ډrD~>Pѻ:[.`3c~[SdQxn2eEe)Xn4Y,gp�5	"hUMECYc'ش?fb]R(͆&h"|fܿMbk!N@HWD78
    Ep>(➪aHTH_Y`LYHDgQRE"PPMNK.1L|WN2-M8RzLxDjs
    =#fɊmPvM-~wMY5cDibv-xXX*]lEi޸x)g}*}qipԍ��[Ss#RNߪ?֯aPF�'?S
    JFMeײ�^MpׂX/12�:D	%E,:#= !TRnnټU vw>0 ܧ-GzWЈNN=S`BDo'=iNiky@h}(a:ANZe#AcS)$zN3e1#zҝĶCk #STX5pBnԕXq}%<[d>)m|ZV8
    f:ܨVo1C'H7)QqutAh,jt"$Tl$|OBSZ$Wk~=S&_8{#^.bgXIJM~dTGJ]Vu;TU vw>0 ܧ-GzWЈNN=S`BDo'=iNilb[!H*,!7FjJ8D-LA6	-+ezRB˳mTRm2l_ߏTŹcW2E -_҇U9l=-2q9j8."NBrv@#y8͔ďCJw{KD) ,I+=b¡*IC,gykh=Um/ZFm=.Mҁ2l_ߏTŹcW2E -_҇U9l=-2q9j8."NBrv@#y8͔ďCJw{KD) ,I+=b¡*IC,gykh=Um/ZFm=.MҳZIx)5ɲxw[%�}YHQjHܕBҾsШNMi$L2�D֚:&!jld!FZ#rUJځ΋[/oB<*�.�ؚlڠ4&2Tyf=aлX0s)|u\@ Bru.Ex<Ar	"X<SD`hRo&;6:!IKJe
    IZҟRi,HM~#Mc# 
    ,M	
    UZM#V&X^}xsyѝ3�!j`<\X*)kquxq[r'uCo9Ru9T6>$?w&@@JX\\XJZw .{##{\FZ(!JthRtI ;D\>H6A0gw~{5y(܀? %VqZ'jR]a=vVi@*3p�be`vbGPJGk#'sy}ӽYud5JPV?92eUo9-)(H# ĥ/";3j*Gl/JՋ;;c,"q*ʑF	Y|11mItrW#V"D E[k滼E<9ᐪ'>tXN%B?nNvMo&
    	'遪~:-Ky\ъefpHP9N5^\+9X+mx
    6xzņmK}Gڤ	JKopʼn6b#SScD]&aNF$4u[H'h8 ؎ lrbdcltuw#ջP>.qv*zb	8i0&<^WHTjBfIM)؈ۭ&5,qpFE/ :y:[Sy�D:˳ZA)Y�mO	NҬaWKY"טItfegAV"4őO1GkGlMVik j66L
    #_fn~ L^^VH| IR{Mddo/#zwu.S;0'6ͥl-<A2ӆ>Dl�wvgD5]~'ʜW¤&`"EQ\5$Dze E>
    vo	4XhV ;lh69Ae0kCd*l='IPz]uSԓ$̀RMdv'9BB1x(J!fGK+Cfָ3Rt*�Bd(s’m#N
    >)k\hp,eUTٝrPEݦZ{L|	eAR₢XTtlvهBJ-'ioHBwzvwQZI81dNLdNqDiSqRxML,)|Tم*˨*GrH-3MdNCOH!{q)[JD31nRtG*{^F\R[+۵/#|P#"<-B@I�"gbe- ,�TACնȧiV0el,$E-OjںZJ&YٹɮZ6SkjQ])+$QbJ	_ȱ0f@Q#"n՞8}&lL=yEͽ
    LGayɽsӉ!2KAa.Y�-fu.#\]#l-+oZ/c JX*J!D2`RVV-ci~")BbF5X<94k1{X?̷23bn2A;1dX6I53ɠ #P/	&*\Xo:,;"1bLr)0l))$,)#'|@O3FN$
    Ua0i8Afnh9i6,3'ICNY#b2\q -y	(W|'yX^S^Q;,=c�*3a?tIWJHQIak)Dd8'13
    Ѹb%Q$
    YP1??06$N'y-Ms_52(9̦mpwQ=-󧵤w	*/WyrwB&fئV' 
    Q .
    )1
    B͒dIlwjmЪRRS%,Zmy\s~\C=10L	uEr=L<}vtpX50 ?5uU2G2+O_k[
    o\w9k&@H9Gk?#
    rҌxNaQgK	JREʆ"^9@r̓5EaC,buc?gkD
    : ̍CuČ6QlS磘-8&jAHژ&y@J;4n\bvn6#l( |ЂZFiLmV7~*BY5C
    CmY*뭛kQٴfWU%p1]HI)R8Aqjt_,t\P#lo&cOZ4ZE=I1I)nL	%)It6Ih"}$#(ׂ od(dt26mk35'F&Ӑd9aR|לb%ۄK}!p+˛F!Oz{)RH
    \`X&rٙ9"XYk$(M?/Z6еrj؝XV+Iy[SuQYτ
    
    NO)zL<*Tű,/˥'2@,<ƅkӊv֔mnB;T@t}P`BINZb{Sdbשev03y0zԝ(,RHͱD~]:͓c#p!Np	t͹ZNë)XȢbgYd\9Ȱ3p\q*IO+fr#挗jRQn\r~GapCH#hՉi[2B. 7>RAuM_6]Hd`b&̍Y^ࠊk!)FM?ZHrj\_]$Ie[Ig	1hhB�̞?%te:of`0n^L.LpTzKV:S|;Ɯ $_5\icyL9{FBt|ʍγ%])"AaX9ŭR|6
    EgR8	ddشMnZ nJc4D~iɩWBaS�<zdPNAO=*SFO
    =ʠ)0TeMQ:+w,d!3Bo^e9h=G!%F;RBtLAiC7^ꑸYUHbAcv.1BHLaIiM2"@w3'EJܕVy$@.I2	"Vq8HF9-D;[7d>s!5*abŧB-ԓc+ c	ZAq7X6me<
    ɂ)uL)|ÌH&`3Agbrt uE].iI?$%6[`X.CҘ4{bs^$sz$ܢ2Qlb#?o,w	<>@L{Q+yob7-bb|tgonLm9w@GG(rFk,N?fr|g'A99-D;Jz,;v#ӔctE)
    M`vT\rvcҍ5#BY5#wjݾ?iM%1fkMSaLߐ
    zELDR*@^V]HRgGȁ(^s$±a&-<KYH547?<Nm#ӵg	1hhB�̞?%te:of`0n^L.LpTzKV:S~Dތ2 妲s2n+OY05,cxlCqsHgTmqCS]lL	$< 9NDdvw$8F7gYB&2#ciZ[R9hFBI8ûl2 aw	A1IrL)*_]"9jJjaēZ!ض$@͙&b'k"|Ƙ`i($(^|dFK[8u3dw =� n NJblqxU0d2cDU!EuKKͫMw4l[dXༀfUL%�!&ٲw1?Fag/"Kr	#gA֫ajW]yJ0Hifܩ<×ٍ6X0!t̻>[//e[*5
    ̤\PL"BZc1Ry1Bu)#lND|
    Dt0?SZ!
    *٨C/ ق`5S9cG&Ut!Rj@dٶl$H $RQwaF7VkШ*�`ž2$y.#IMޱmڇdѢ}3(y}r	޸1eYr@Z? =V!̒	OKAɒ8
    !}i84ЅZ�L"PP\zVӞ,
    Mmά|=rTD&CmNGHl}vؙ%ToNA?! $c3F2JnqF�* dSSUﲶ{ȡގ4  _;K+aJ2};凾TlFu,'*I*3e%~b`2k7ѕ_
    GHBK6FCWT_}IvtscyWI9�!1ʬXXg=qwϜW-"y6S˧CX&& 3UʙWiS0526E�
    `ŜI0(LچkcaD,?PdJe9kʣpZ@f8}0sJ,8P2H2n(glAc|jS<@ŜhRxGe")i`%2,QdS:{r6UJi^yyXm�!>TGӯ)d*e/(TӎYg(B�K;I?4c%0L�ɒD9W*]!E."ΑfSd^c0)ѽY2i.;+U:FȁR'w^f&Q0N5}t!)cNG>:=j܆[bZqugt&Mì_ecsȮJ%:ȱT*2g
    TW1SЩE9Z,qh~<VTG2-ͭq,'X L8Rz8ZuHڋP4uA
    @"xlhe)r9{9u*X@|9Y=vC%X@˭3ZXM(ĝ	Y9�w7H31GIOEdʗ(hݪލ�%PvTa%__gN~L޳ٮGKwvV꫶b{vhNݎcn+OQ<de1-H'a4MCMC	S]Jnҥ(qKoZڸ*Vxc}Z!N#iP&cv56&#eJ6PiۨqT=DPB% Gҡ5M5$k[]Niu(lMFJl-ӷQkjpZz#)hJA8	BjjHֶ>P؛t(C[}n7MFRFSBqJ814;mu8}ԡ6-*QNEi~5bdu8}P,} dk(0h{ĉ)Ƶjk	\Ij7
    22jD0T&݄kk.
    HiR8v-m\n+OQ<de1-H'a4MCMC	S]Jnҥ(qKoZھs&)fV&GSM\	F*HS;\H(lkVz6#pZz#)hJA8	BjjHֶ>P؛t(C[}n7M42:>
    lwT>`LdX5YR@4=DQCcZ[ѵ׮P.X<�NHCĺs&Aܿudܟwwq_iWcIi;iRaddJԓ4XBdןL489N/޷nŦBJE9*doRLpL:c	^}02 @֒P:[\zݺڞ+8y3rNi׷V�qP{EjnQUv;mݝ55
    dw;^=�u=w7ܯ}�
    X]';d#<f9~ӐYk$@+>fsF(+Z$2<-*i|&k
    wh1q(K[Ql腪jD`$'10Ř-s{X̉aI91)vFZGsesC{-m]a<XZ_,ImS$N:qW#G&AeH-(hu\e]}+)^atTX$$k1�$ch78J**]{V�զm/"&/r�F’ovhښzMMXC؝KKJUv~""~v#S##RKUSvtWrtND6I>\}z',Us&�d�mS#-b
    V+jFBul7MH[Ѩ'..A %O\LMWdITK6\7q$Ld<;ÚjFQQBsD\4Ӄ7Rm
    [^s7Ms7Ms7M;-q!+ (3RwʃsHAS"ΌNL֭rK-87Ms7M8弾w(Ƌr
    mɅ^[V]ԎhRE%}-7;oPDDBFF&FTVڮ额݆KF!tf-2@RY"G&V_CVq{J˩Zܬ7Ms7Ms7Ms7Ms7Ms7Ms7ME�';<-	cI�Ŏ~ݍ-TWrwz*ěvi$ED`S0")83bE憆D7ܢs&)RAR9"#k@/&ƇtnzlOwe܌S|%fkt?ol)QM]
    G/-0(NCJϰQ%	KJ]BIԹ
    l-V0*IkIkIjL	dyyt+ӌi	67]uIgHE"
    	7sfm
    MS\MS\MSD	CK}
    ;E$�}wWx9�6Gy}=nbJ,?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o?o:dvqm˫jn^'$vݓ&
    N<uQGqѵ;^~/�ZᆻYAL#rύe`[$fE!f|@*p�GcW#ׁYzX$uy;DN"…NW]ac&!,ꃌ`\V!woe&ɉ͵ìݥ%	fYalM|trӓť̶Onv֔VD0e}PqD.19u3,7́ZrxIq<2'ÆLh	:F[|X;&4X.7<3{m6aa[wq<8ɽ*:_͝{J`d_n*Lpm)ܽZ[eHdΦXj
    D<&Q�NG-G([WQxDY.bq>'ԿR]Ll}`
    TRj:Q&+SjSwq<8ɽ*:_͝{J`d_n*Lpm)ܽZ[eHdΦXj
    D<&Q�NG-G([WQxDohg!s$hNVx8Vɍ)u5}fuˇMDo6dfexVᮭY.bq>'ԿR]Ll}`
    TRj:Q&+SjSd>GmGI	'
    3gKoOLB:U=kGL8/+I}Xv-QhvȮNTLMKL{׺z'ݮ˪E]Z\"|O#SH	, 19hժ
    uRMV՚;e(y.`jBXq><@sA왘e*J&\l{]TUiFJpZ%\+En
    <%kQz4LԴǸ
    _m{}ꚙ캤UGr``l¹<?O,bYmD.&솂؟b|L;FjRÉj%iK
    (<c/edGܛ
    7b}0uIHBH/&R_?&g]c~)P�!X5xY6]vyV		U)Շ$w/uiB*vn}1Fj8R3q28vIޱeS.1JZT`Y;y>A!#wpb@%%1jlP]J捱fr'ƴ@l 9Hp̯¬D\̞I_DdQUwԽVnY81)Dog2|f5_Ev.rKyC"tW1:5-?']J@K&afBj|\}ew!FD뉍_XczF&TϊP	^ x.C^.31O!/j_NډQ#Qp;Ӯ[԰4J&Y,͊zV~OnVF(ۆq)Q@%9<Zncj(\
    GaVKqXFr_AdV^& 6-g>ܭXяosv5Hl0δ.}`>\Ҋ1|ӿȖlU<&aL15C\`,ExE9Y,6ްr]cܨjԐRG\N/CǟJI#
    dVr&gkcIXy:@v6Γ	.HmX¬bPi(!:d$16"w#Ncs"W9,2fP+L%p~NYz#A`;L,X$/OU4)`l jt	8PA<c],j">ua6n?sGO_~CA:D#\sdeH2+Fꮄba,eYY:n8@LE3'⼒Gcݔ!ԍL*?ÉV|z̹Ԏ,#omz}oQ#!1>iϺc : {6;t`�sy
    G�$޴SnY[PN[PKVvBr:c4irvi6/e-=7`ȜyDp:VY+HI.ݖ$H}ONUu$N\m5W	$NLk׮e)'`+D#h~/Da(=hGЖ?8eyמֲvܩ\qbcRWx#)҅¥Ŵ2n'b0-3NQIe$f"'q\m)=N@`{R8}{\#pUOoֺ͘%aE[1H6P8c<$6.>ɚmlw_R6HWӾrM>)nBuub;7(56!!M3f|h&kSBs!W$/#`)uE]82W	a৫"BH.?b'5mQ=(ZA"+[%SyS#Q�V0@myxsA8 4X(^&ŝgv_C!tr&Լޓf[vwȤ7q?l_k
    &.�Wf]Le=HgGԍ,H5˽,LNrK&%q
    fSؤH'?([؎![q=e(k1𤢆‡fT
    ]R7EvÕL9Ճ)&a( n	wʃ7@^8PFdg׉!8Wwl7L16SP	օ﫤ܢJL 0(Ć"PZ4ϤY񠙬jM	؆\QX(8}kb|?CTfLA{0ɒR*B/3loɋ_mrE<mdNX+̌B);dì8O}03e�Jcf(U1>|}@5i4ϋ!~ybz&	F6:gDxrY$Qkbh@J+a2wCKfLQvSbyԿYK{PKRh5_)IFFw,eEA.zaˁywumIػ5	uS.о\/; l싔GiVGqF,W>p߳Wt%J!1*Zu4,hgyAlzؘ/8'2rRrgQȼr|۷ Dld?$b&M|u8R@B8Y'hTazXk沃79:4iܛ^-B:$Vu^L5귷rͩEjvmxSWWuM]_ׅ5w|G^xSWWuM]_ׅ5w|G^xSWWuM]_ׅ5w|G^xSWWuM]_ׅ5w|G^xSWWuM]_ׅ5w|GEW1Z\@.Ȏ.Tҭ{k~	mފ+jv߱NXC}Tp~қTwnŊjmFݚU
    j):š#
    jg@zEjePӫŔENNUʪUMmNSWWuM]_ׅ5w|G^9GO
    ^}4'p"FOFeXCyesw'4>$D½C}	E|D&<f @9^b\Ms8>GQ#Bd[AK\$Jؙ5w|G^xSWWuM]_ׅ5w|G^xSWWuM]_ׅ5w|G^xSWWuM]_ׅ5w|G^xSWWu?9[xM@Mm[EG'+)p$][\;YU[SE^xSWWuM]_ׅ5w|G^xSWWuM]_ׅ5w|G^xSWWu
    W0Hf2�eT=j3ǎ]#AgSGob-<30-9p(ݓxSWWuM]_ׅ5w|G^xSWWuM]_ׅ5w|G^xSWWuM]_ׅ5w|G^xSWWuM]_ׅ5w|G^xSWWuM]_ׅ5w|G^xSWWuM]_ׅ5w|G^xSWWuM]_ׅ5w|G^xSWWuM]_ׅ5w|G^xSWWuM]_ׅ5w|G^xSWWuM]_ׅ5w|G^xSWWuM]_ׅ5w|G^xSWWuM]_ׅ5w|G^xSWWuM]_ׅ5w|G^xSWWuM]_ׅ5w|G^xSWWuM]_ׅ5w|G^xSWWuM]_с-"򫊭*vW١=%UUQsz�S?_gN0�ZᆿYA�4_
    v79�hi�eo?s��ч
    ~4}XqgoVwlT_,[n}RKݶ4Nǚj~Wud:MO^i]Ց�x͆�*ok͆�*~5uaכƞ?^l?z�
    yiaՇ͇OVכƞ>?6=X|^l?_Շǵk_Vכ
    UuayWVכ
    UuayjaՇ͇OVכ
    UuayWVכ
    UuayiaՇ͇OVך�ƾ>=5�}X|{^k�~5uayWVכ
    UuayjaՇ͇OVכ
    UuayWVכ
    Uuaz1uayWVכ
    UuayWVכƞ?^l?z�
    yi�5͆�*o͆�*m͆*m͇WVכƮ>?6]X|^l?~4ayiaՇo]X|^l6UՇo]X|^l?z~4a�aՇ�xk͇OV6=X|^l?z~4ayiaՇ͇OVכƮ>?6]X|^l?~4ayiaՇ͇OVכƞ>?6=X|^l?z~4ayiaՇ͇OVכƞ>?6=X|^l?z~4ayiaՇ͇OVכƞ>?6=X|^l?z~5uayjaՇF]X|^l?~5uayjaՇ͇OVכƞ>?6=X|^l?z~4ayi�5כƞ?^l?z~4ayiaՇ͇OVכƞ>?j֛cigUBݫŅJNjjػVU)S߱������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/images/icon_error_sml.gif�������������������������������������������������������0000644�0001750�0001750�00000001762�12143164146�021064� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a�������
    q	
    x
    v
    m;@GJf46_
    i
    [
    ~
    }
    s	q	p	n	XVL
    
    
    v
    l	~"",9?6;{6:df島$')OWͱ-/*"4"3s}%8&:(=*@+A*?5H=MM\+B.F/G0I2M3O2N<S5R6S7Uނ:Y:Y<\;[=^?a@bBeH 1K"4H!3F 1I"4g1Lm9Xr@bxHn>%9J.FprN3Ovx{@-EL6RO8V08G3O1:bGm3=4>7 C5AgOx?2ME7TmW|d}gu^V������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������!���,��������;	H AJ�gN޴Yc*
    FrM/]HIh $5iΌ
    %BT0P8$2,ㅋ,Z(DL@;G�k$<Hd
    >`'�!\2?vhp
    u@
    .X=	q0	)f$Tp"FQGr̉C�;��������������logback_1.0.13/docs/images/external.png�������������������������������������������������������������0000644�0001750�0001750�00000000346�12143164146�017706� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR������	���Ӻ&���gAMA��7���tEXtSoftware�Adobe ImageReadyqe<���PLTEuuu��P���tRNS�@*���PIDATxb`&& @P6#@`�X�Ć2 d@�A3 (��*�t����IENDB`������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/images/qoslogo.gif��������������������������������������������������������������0000644�0001750�0001750�00000003141�12143163323�017520� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89aj����̙̲3L̸lř0y̿<ε̟&?ƿY̅ױxR_̥$H,ž̳aӳۮl9зǺȻ̬߭a˸̒F߬`λý̹/زy#G1ʷְwʹ=ޫ_SGI٭jUT;ʷڭk»Ѳۯlݱnc0Ҳ=Ź$�f������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������!���,����j����'	8@
     X�a‚JHŋ3jx`
    #>`ႈ$˗0+& C䬰"JL8ѣ4p�EʏHPFM�Djݚ.VHUOX]+ANʅJ%�,-
    sQa0HAI#K*p A�ϟ� C? !ƾ"@L[rTH2D]{�#qIfC.y&:��سgY5O^�X�$!`R�V.)0PqIbwuA
    �\p}'"UdUx Q*W�֑`@@p!HEeB&V)'3TH@2
     hcr)* $-4$I tI刁_F$VD%e^h$|vt!0SEeBIfNtD$ߍ!~!/hm@}XTFʉ&;�Pѩx7Pd,0#6$_	fDP`j:ldĬ.$0mx
    t@HT"@<CVظf;J7ɕZuDgL	P$A.-K_>�gd:B
    xgE@Dcs8TOt�#H4YVP@PmqBaU-@DρAu!lf_-u+9\>Ptn$/E`B)D܂@$,@p�B4�;�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/images/logos/�������������������������������������������������������������������0000755�0001750�0001750�00000000000�12203357067�016501� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/images/logos/build-by-maven-black.png�������������������������������������������0000644�0001750�0001750�00000004366�12143164146�023102� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR���Z������#/���	pHYs��.#��.#x?v���tIME�IDATXXiLTY>*
    (
    JBZ@%?h?"jbQd~(d\A$&21"R`UJ-Z8m4ɴNǩs}~sɚTWWzxxQ(bYU&⥣f_غu+!6<<|8˲NNNΝKMM~~~1118�`rrRT@IID"$www???t޶m[JJJ^^�_^__q܅eǏ
    ϟ_J5gϞ---(++;;;@TTTxxx@@={ݍKjOOOooﴴ4�%0#
    vh၁'Or3&`0LOO<O
    
    
    /^hiisNVV0yh4z�wJ�a�enn`XPZ;wj4ZX#8`6u:l
    
    )))+	!)QINNH$R4>>իWҥKo�
    czz:;;;>>�<PQQQUUhZ[[ggg
    !dppn777`P*>|�ܽ{Í� 
    
    
    :;;~_ߘZ9q@#iiike�@~~~___ppma̯svvvssC]B<==V<2R&''Yp|y܀jݻwgv;!2<<'J^j2h2nll}ZVHG-3~;ueH/A:3{CK7lk׮eC,ˢ?G[lXʹ%>5MSSӇnh4>}ZL&H$'ms<-_f˗Ye^z{{ZVMNNx"lCCCtJQQNvӧjo޼V???Á+q^.{{{7n܈)DX8*CthnnYGAKPP<!daa!**
    �233b1B,Khh(z9ʕ+SQ߼yiL>~�6fq``˷Z~։zXx,rTʾ:X<33P(oeH$r122;vѣh["=..[#""CWWҋ,5&r1}@.f7BE`II	�:u�jkkcF�		d�0322�@R2zu twwF1ߍ=prwc3{ƶeKKK1͉D"@)(((((XBΝ;tvvRPT*2##̃{.�3ckM|ĸ�ccceY\{n<ϗ/_D"]Y,'OB-U*أ$4\R@oݺFVukFͿ'9�`3cAaUuV!<yyyac4׭[l+8n``�N/			42
    tcᅩEGGe kv,
    �ھ]뛐1^:²lllkJKKsC;vXɩ^Yk(F2D~aq>݋M@,�0;;[TTD<_VVQbtuuc,p344DW{{;
    <Ͽ{hFׯi<R�4o%�"`vx[  5###xfO8AP(yӕJ%8PP(qupra'J,
    vZsŘ�@E;+$:mc+�4:̶	,JR)	պr1DPlڴ㸙a�lNk
    RPRdM˾6
    ����IENDB`��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/images/logos/maven-feather.png��������������������������������������������������0000644�0001750�0001750�00000006402�12143164146�021730� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR���Z������#/���	pHYs��.#��.#x?v���gAMA��|Q��� cHRM��z%��������u0��`��:��o_F��xIDATxb`H� 
    FF�blnڳg!߿?x8ߟ? XQtƍ.[LL,##CAAM'O\WW7eooog o߾1cFuu5ABCC&=qߟ7j%7<Ճ Jϟ?yfZZZJJ
    ''gpp0666mmm c߾}o޼ٰaCoo/\۷oh'.33�366^zW<{sb['>>׌}'|vJzdt9&^=bp�E@@*;;ɓ'@ٳg_~ȸz…1y]>�ucǎMO}}ŋդI._sUU߿֭[@`&F˖-Ѽ}OgU:̪M͟"oo3.?Ú)Jz֝Uݽ?
     XTwΝV8P^^2555sa`dxyyZtuu&>}:77䘘ٵk׳gϘ
    /ԁ&&&	7lxɞ[1K3+J2>eggaA3|~9gǚ37Va㖕e$)8�QWW:9s$&&QT#**
    2pXXT`vww[...(,b`\|1g]*˟y|?';#?FAvVN=\JzK_`r|y9
    y0*rKrp&@�!!!'=
    ~a4)))`2??s;y>/~œO}]_EҜ;q֏,_~:ZGpYGLL"R&X
    
    �"68~ X@�=y`Vd@a?~@9w܃�T_\\,**rttQUU&+XX@V%=ygO}{;vo/q?Blߘ$lY[{ET8u/NW*pGQ9X*))S{zzX�X��nnnSS	&ܹR�kߜ`1
    �SBl?~rr2<8]>5[V:rn_bz΢U1w?`M=%C.?2~3o=cS@J%+*l71~
    `
    Lu}ߏot?#+'3'&.&L,18 .9}$,f.qfIvvF~t@�
    X#}݅ÃT~߽~ϯ9}9Y/A2L?M}a]X!�DQp�Q`'<%
    
    ?.�"T/|ݛ?~{˯nN%A/lls1?l\\<4t3@�AM$]VM/`
    X.B`kXpk޼yR	{:��"!8�Ab	6sssC+u31~QtH#0W	,�Ae� bh0Zʅr6"„NSTOr?]PXm;8pKm6{0XbDغ
    FLKK�&R`T4
    XkC2`O08��	t1#+}@.0^|		c",M7Bv
    "2<܁l`O!|`[˗/ 
    `Kn.ЕGkY`2`ߙ1>	eC�`]N3,]UH:t*�)$Kxǧ(@ĉᝫOB[l[80??{Ύǖ6$0Ctmذȝ9s&AAğ AjRRDWcc#XHKx=� b9`At+&&owK
    `3¾r
    ydx).`xoG€'Q
    @C�l?{,d��0YjTi'	ϹV�@,D>'OB
    FV¿_�AVQΐ[)~102@ԫ[&MD ةb �`ρU;$tAvҒO�۷oGͭϣ	""$0!xW2002x~"E^Q�'+**Acٲeh-1HR0D@�5L	ρ5Ç	ϯ_G`8FED
    tk.`�3	#I…!UVeҥKAQXtApg!9L,l<_߃s-4!##4dD5d=
    oBBTWbqqq`:@dgF<� J@C�х @q 0*DF̬L>lNΧϮ3Z32rqt1;�&
    H
    &-THsF0cyyypM^w"(hkkKL }	'ƒ]I@G':`={`Tpr3|~,|HKH`|\v
    H=	,V^V+*HA<`vY8� P@�4P�@�Z':vr����IENDB`��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/images/logos/lblogo.jpg���������������������������������������������������������0000644�0001750�0001750�00000130423�12143164146�020461� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������JFIF��H�H��vPhotoshop 3.0�8BIM������H�����H����8BIM
    ��������8BIM��������8BIM�����	���������8BIM
    �������8BIM'�����
    ��������8BIM�����H�/ff��lff�������/ff���������2����Z���������5����-��������8BIM�����p����������������8BIM����������@��@����8BIM���������8BIM�����m��������������������l�b�l�o�g�o���������������������������������������������������������������������8BIM������8BIM��������8BIM����������p���<��P��N�����JFIF��H�H���Adobe�d�����			
    
    
    
    ��<�p"���?����������	
    ���������	
    �3�!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw�5�!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw���?�TG~˼}�԰Yo1h?gM2HmJ	@w6RU԰ʬ7ͿqSYaDL�aZpqn�S;R54W�tI+)}qcƟs""PA)4;Cik/Xr{r"{E%¡c}GYcıUe7cQ�sC\w7^XǵEe�<RYxDo[]'u}Vj?v5\\zp[\`3(7}�{zEnjh>\?4�Pc&㤨a1Q7%@�pIc_�k-.s1Y{ܰ#~>c|3㜸bufI$eKKOQvl!#)Z]5;5^qYꆆv5nд1�ٲwHʩ}f�ּg#28`Ȏ+z5Lkf+:SWh!RZڿV=s,]nP0vo9۾vn)k4klu?=FzOw~z3
    P@f;׵~DDAQO"x#3W.MΫ-QvrIJ8M;nc�nCgRCE?F3TŞ?ws�Jf
    %;Gls[�H;hŭᾭ!-%�c,
    B>^.&�VI_kuW'�_dDvϥTfV.Ev?'$:^/q"ϣfUnm~k`ewӎ!9ӣ}ofYK;c\Eu8MI7QDLJ}D	_L)zet2)n6K@}Θ!qFEe:׾̆[[V�QO'^`m|Qٹ�?λ,.q`sGc6=Bgt:Y3WV x`xore+ӭtC+V5V,07G%[�[UfnvRv@sᵻhyou!x4>_�XcC]^e{Z+kI')'v:}�KcVde&F׿{(l+),c^ pG
    Sz[A{oʮp4??:!K,p!oݻcO,`bh$EtVMtc>vYcƴ$�8g�tLѺW I5w�Y�ޫk.l<{cppl~ճ'5Xn)ccdz|:6(g!%ǧ,Љr_f}�g\znNB+۱kkh{v{ߗҙslqYdmkc~/
    U[stg5ٷ]Oq2SQ<fJ~Yh>@Lf+l`,􍵷W_Y}Om[<4_A~W	&CI{=*b3!."jhVmڛ^($	7pgb8՟ҳ/<͹W/sv{e~JEʿyl\ih/a/`e7llm{+oE:Ňͩ649U&K,sڭfX
    7<IN�l":]Xmf<~}o?B�`tq66[dZc9u˄EdCCs'|7@q
    �ciqЉNsPo_3#: 0D]ssX9$cΰ;
    !!8|qw<|hHn;an?cP]0u	opsg]IE?f
    wx[,=<U|i:^m`6Z;_䢳Tڃ}kZ;hùGo#$}U/waӰ-:˜=ӱ}P$zL=M�$k>"^#Aq8n[:g*6˱n
    춧T�4G/>C|~~�V|==_Gys42qW�Ͽ0wvO?h�=/Ff{MXns^>n�mklnؘz~Fgj	}�59:Kq-NR׷{	p~#c[c?TևB#�gn5ODzRr(F<^x_N'Eq-~c-2)X>cֻYB5�g_8BIM!�����}�������A�d�o�b�e� �P�h�o�t�o�s�h�o�p� �E�l�e�m�e�n�t�s����A�d�o�b�e� �P�h�o�t�o�s�h�o�p� �E�l�e�m�e�n�t�s� �1�.�0�.�1����8BIM���������!Adobe�d@����������������������������������	
    �����������	
    ������ 	@!01A7P"#$%8&��
    ��!1A"Qa#2 R0@PqB3bCv	rs$4%5E'x�		�!1AQ"aq2#BR b3C0@rS$P%uҳTt£4U7����������������
    RUշh����������������������.zh9P����������������������}H*z/x�v��������9������<IOICGS}OH-3yoۺ&@���+QiUU)lKml+3Y]nN˞.xLN`vu*=4k/F_F"5}mf=�
    N۵/2WVw{Jຎ/>ښգֱC`dWq|�֭h<_2eV5Mc[PNiX5EAJ{d`lm�+=nPzwM:,7jL=Ukn.f]f-v6]f귟;`ӷz[w܍h-
    FW:}ޤ8xhFz+90�
    *U4VUNVәWYyI/%-1o-c9pvOVsLŠ>>^Oo<4`|) �<sXfz(ЂSJEκAkTvFlW;*'˵%VE	31:y%]ykpU`a믠Ob�U]|פL3ݙ[ں˳G
    >YnQXLee6/^kX2晧653\sWk93q{FԲlMuݠ.݀���VĠ⠳WCjZ.PX
    T"3PHx.;37gn^C;tW;4*2&ol,kY���q=OjiA_3m_Kh4⃽2=ZPni8Z4abp<\yeiY=o⊶+1%bn[m<1^-ِ0q<982}|qk϶U<uL:BSuA^ŜU6{ݚ.#
    
    a6eY:KT1mllvNk#EwnEJ!f_EMni*<UgzWʦU8*;ܺf,fq"OzK&Wkh%4T//#dd-n38Q[)~~TV}˿hIRܩi8Y)f*Kn&Ɏˈ*1'j+
    lL?.}~
    5܁:;5	#hCt��C���nACkS5vCFwyW'}2%X9/	Iuul	cj>?u?#����������p
    E
    Jӕ#,C['wS2JλK͖3&ܘ|x������������t/nޙG9bNq3>�����Idz1�Zؒ/@ెa+]a|yc;c2qc}q!`bl' W^!I,ܕ
    b69rq�^>pHm8uNOY֠Xܘ\Ek{?c*XwK2,�rGjHq=}B_oep<2Xx'hPYql\pݺBi%	IFa0B3|TWQ_\yQav1j�y<`ğOt>ctԎEo|p?4`]z 
    gΕ@Tv7$J!S`,Aq
    %XиFS	*hdGŦ@x@c& #qS0-QYέf`
    "?/7'vYAaܩdƈc\7TJzڵeAmWaKS֤Pfw68y^tQKbF4ntZ`SmtHW$Ɉ̹!=Bb^)>|QPQC*%NZ'h	/&jw&OV	
    lzRXPZLPS+4J4T\eoHƛtfD7PY$,�\"!TsalN^DW(0Xˏ3\
    ~&',osk쀈߹'dJ!hCﲵGT$62%ÚnwPRJO핺!mF_a]"ѻ9;1vGi!124BfZ>pJvF45]WU8K>7DyZsy6E>\`-6R+:ҩ$auj\ذ1WIO'd‚W`	tfWƞ12FV:",af: W֢a9it
    M0e(<=sia?5C#8BmZFP1!
    	o^eǜϟ/*GT1׫\/;H#ͣ}ٍLe@8$ 	]i@րeωpRF&J\1Ip\9ZK"dߦoȘaX<zc1a;C2[<%ĢexDЫشG/<{8>|2ӎk(1CH1:yq;'8^qil#87vлbSBWpOC<qnMn(B@V^\$hY'؛AJ!|}}ؿmkYF&SOgY#L2eallۧ7X�ݖ3!ưo?C=T5
    Lf瘫(4Gr\q џ[=zDPxwaN$N}|O;گtɋV‡OUWVЕ)YarUW-eA<O&#ZNhٸZܚV
    .e̗ASE&>RVRU҅Gv̸4եxmU?'B^Z<]q>==,pF|LԾ_DXS7"1-x&gܼῙ1
    o(a|X|{y{x+7]<^9˜]M|oU۶]
    �t=muY>+A,HvLN"RRMD�@a:H=e|>o|~>cs=?3���u=�b??T:esW||q9~X<ٳ
    Xxd&;ƻq=XXHgbd99{$o ]tS1О';^�]R֤-7&v-K)
    M]dًEEv^EBnZc	b!ClF>n榥l5?2!88#p
    @yQlhտzR>aemLk"H'r'տn=y⌙.=GȊz%IJQQbeOxCsaci
    5kYQ-Ua(R։V�defkɃA'):5F;ÅX4`$vH4>u=7_[t"u3]A"ɉ@캛
    #k-O�P#
    "[x_+jv˾^űW_dm%ܶ=_'UX9vcېMQu@qp`mfS#Ug$bD@7s?9k
    
    +֥PVݺ6
    1lG),cf6LY71bb"Gp^dtjocô)Z^'Y;mn#~l	p?tE׹1ʓDVKr1yr]JW~y@x2f]<W]Fvm!QgvS@cnµƐZS9uѣ%nS~CÔOF4^Zw
    KBhz$Á8paMpفdsWQDu#;BдT^bhJ1_с$1 5|biW./!-Eh5k#ZQE"t|7j]nlY;!B!
    l3䕕Ƽ'IyV_FV:d} "Sخ"Vx,B!B|5rrniFYd%|z{vZ#rVɛa:['.ugI8:Xc#F/t1.8xue1H.zHj_fZ2Ӱ~;d`09#&.)2u+Nr]CC	'5tf->	DI
    8珗<z3y ?%J	C͊a^(B6ZI/@m*�<|̏M^6ݖ$7琇r̗+~dvl`
    M%XaaLE@X͸@F�T`Y9`:OqM2BW\RQX_!cb`
    :=lNk]4\O)TW)Qek-`kSn'd*AH,0wV)}Xv.ڔZhI5K#DSdHܷ+Dcy9F7QlRcs2*)#4<m%i"6mb;[
    lxf`A1*E<K
    '7-Mx60..4{o$@[d
    2LhMA0Ih=0KH|iظ(x&nju$0q9#"S쫳zȬj|L	f@ qr1Nf"t7
    h%pׯV??.梽{Y۶ul\l5�JČl?'!]V	q�?9}z=8}??���_^�q~_I;=L]1G}<<81qqe_^8}}ѭ+fVٺvRR{VHUź3DŽb@<k;k+nֿ[[1~[AԝNN狚Ğ˃K6֧n9Y;٪"wS.=뼛
    r.	8VV\ژw<fLՑ^ZF?wdzp+\yI,--lAl=Rk"ѝQƙY@�x(ʋU$it!d>ܖT$g|c;Ϸ!j4I}k߶Wb
    U=,)^b�XOz0+8v5uOH/[^
    	"2:̫ӡ,o>h4nکuo^wZ[[Uo>/=:3gJ	$HOzU]mĺ<}̻K.(�W{{7Eݔq{Vtg풑ʮ@P:Zf{]yغˬfYT?ڬLa<M\]fBs]Rھd+/;/sn*mzK@]J">q:ay`fJ	k0+	ĘW5>;ZQu;6Mqͫz]bw5֍:Sm)0uCOiP
    :Gas]`&M^_Akʢb�~G<~<օjDZRng<ۥ빭=Z1{9p7$4'j\SN'@ܖiW8՜".gnj3b\T]ѽ47`mFvl5dtdTˆ¤FooWb=sK@VB.a>7o_c͠e׎Y7*W[:pۨts9}Љkޡ)ە!ƃҧ["@\zru5/x�ؼ,贫v9hnݩd7my`@B?^Y%__+:"]D1E	v~^v^ͱmX0bXH"HVyoX,[ʢkCɌtLE
    BcڇdUtB-(gdy{,Yq<tm-yO(p1Asůh]<8/}	$}:Ϊ`>'Nt:NJ'`VWifXf�7AII.ۅzXN$$(QcL]`L(g9$9uFC*J0v
    dWO
    Hu̎{wԠ~>h*6Tb@0gWB0l8+pus72;vXqZ|4Zk,	/V2)ZA*ʵyRE
    4UAƭ6.٩ګ8pG�6n|`�ßVڗ.ݻ*kiVgenMc;ddz{z"'~X;4lc'jolE5v%y}d"ؔVU�ȨsD:e!.eQ[uz<G�+jJ@a{*#
    |kTu4`}xL]06T}aWEPTB/3V]ZL6\h1ZumwV$E1V4</)+X">E:
    QPXk:;	6QX6Glpiz%?ӏ=8zq"FWU֌ɷut1znp2rdU2[3.`
    AM`C5|p{6mm7W؃W0zף<h]e9NGjoʽO:Nq]mQ+�z٢&XgOSm<ZH
    z
    |a88>g|IBz\~濥y�?��1:vҪn,):�/xaos*ݧ>xX6PW1+FA0c9MQϧ)myxS~o*hV?Hӧ?M�,/mn$;L=�hMobZzM
    ψ54M.)Eȯ!COHw_ln.y@zWGX+Xą4Ѹ1u]<F-ϳrEߥ<:&5d)󈧹ˍ@_
    C"Aj _
    ?pA1*Huڤztխ`�߫:Z:j
    _c/%$9/]He?Acr\%r$}@,K1�j!^"zRzPFT>Mc[o8<7T3b˾],ݱyvR@>ۡX�GXO;涮©,ӑBFy_]3',6WuWiQtڣs';)K0]9՟w-UTwIyom OᢣGol1ڜR|-#[,#qQ Ɣ7OUƯ>ٛ14~�s/խg^EuE,@׽ފD~$kIs_"%%ԑ^RЊ*|K_1j+znjuq#4>6h;!�+lGՃZe)X}ENz%C_j*Xo}8Wj߷3CAӭv�x,~ؠ$l1c
    ni�5{"@5=7>?oR:Ն6$hT~I-ߡЖUx~�u���.Ofqk3}Ϫ*Cj|ٯP^l
    <t)yYk.CԠi#N)+3{f>^CJCN՗b3C$\f@JUn	m1P\KћjJMȻ;ka&vHgfD&VUvAe+9-d1oJ^m묮3!s]K-\*bNUz
    HOݝpV7w5yRʲh	$uqkA/.%[+!+m1ZFSǕUR-Gq
    i-Q"R6fR#7Kzh@kNRt++Z17�2A؅
    }7_Q37anк-c#a�#Za^2E1`t�(ٯZen^m<>5=Co
    XcZEsa t%*~'WhܿQn"&%Nf=ȸdޢ,uՏT|C۬qhXD/NHUpq>@O߾OEQ$|MF~ٙ%y-<P*|֋Ө8{r@FGJG�f#gO9.LmJgE%hLҐK6 FLֹ.ЎTCS	<DtVW?-յ̩,(BcV^'Ŕ+\seHks(aVe_A,TebnF.3OncvcT,RV,LÈ8
    E|J	KT'Y&e%:_2^XCBm'%EH$|u%[!2LkJ(.(,v'쳶. ჳ7X/NJ	[U5=RCopsN*
    Y4c!5${䆀
    yؠFiޝ+]^Gs|u�gzE=a
    ȅxز,6wȏ*2JcW$!bTv鯮Pferkɶfy9$z(ꢕۻ>A�۠59Qh!2AźkoyA�b<E|wR^ۏ’/իlW_^l.V8}�Q>�#=?Kdx#F�O&[:ďݷS\?wvl~|uFڰ&"HWuwXBƄ7WHZ2ހBv+JX;�2	KMp']Nz��ݝ6nUVS#RJ=	$jLpvU5iP4.h92jO԰lXMq�ڐxе<i!5x\`E F^=5XU? Z2viXXk%A}G-tkJʠQFm%�nv>>:J# rGYqI"Cej4#q]+ܥY?�wkaf0xN悴WiZ_ޣ$2xr&m]{	gP:TMT;3	5Uc_K==^;r^
    74"TVH*vYkg#	�_Pqom2j<ͬ<9}k{}uy<,&]Sx*+Y^X[-8RR,,iJu|߹h,mrHQ@WQ.ott;z_=
    ʟbag	c]I9
    tu/$gnğ7.acuھ<AXJSJ>1TuG٬7d}@qq}w�LZdik["R%?j[kɐs%T=ʜtWI\ ou5khY%Q\9
    c͏HJ04P3ᶷ
    ,Ґ8T5nk M6{ߘԐ=VњIYQX'|mOVĤS%Y(K+b> Ե_ck+Ń\@(\OsIJ*ǝ$*̶ݜjjh`IZHg6�,ErV85295`Z^;q")aI-Y.eV[47\3h\'o.3%0]"_DAƢ;'/+81xYnI%`":8ʵ<+woKUf&Ib	0.$0�;!u6Q>A"o^^AW;�Mv?3HREPr|ZDNj]Pk|']
    M{|}n(,
    Up$,;h$6#p65J|ݽKkŗj%d$oG2IƏw=XrOW(	;,iHhZ=נ=u9<X.џu
    @Fn55sȨ2!H;TJ3H�"EkKujjݫOT~5մ6YF53LM*ch)s)4D7j6
    O.cH-%s�J1FSJ-*ڃZYeFoJ&,zA:;Vj˂ZZWc@,f"j9o7H/,--l1#O9zTkh91^RL=c)Wz{jXi{g�$wIr{23RIAדpbڹg*`fhfdaъ<n?5vQp̦91[cviR)G")']׋[b0عv(r4VA*B~3_լw#w$q?ƓE"q,1b`\Ely%AE a�*~ZbrY[	KJQwAB@;=-U2Q,Qj*]2WVXLbƭ0DPdps?'kvb"ױܿ:REa~B)VH_%9CRv[3fQHW]'ywoubm#}iDG
    P\i8*EP1]&
    t6<֢[s^xFGrJ\'D{=!q3^*4sN dlb(#,z/+8AWI5)T-j:Qռ&+DY
    K :v4ՕܶD	Y֧
    Ȥ<ƌeQT$_tV hEjZMN~(VK+eK(GO+O wf;Q3)գw*Ny[Z$E''\)WW7q8kkEAdZn1#F=%]|en[j	(o.KĞ_K?~4Һ0(EA_2}ڝk+8..Hq~j&"2w}Ş3<ep1ZPTҕ,!	#.Eq*R֚%xGF)Gd%K)�Ԥ_{blf%cVH=V�f*,ge2(,TL
    X@7$k{O3<|i5W4$J,unBd&h]Vc^1z<cMC@u_}$.!FW,qEf:l]sPK+YbĞD=H䴭ccI{u_5s4[\5-iu'[1܆hvuo(#Șњw$"Xԝ[Èp$x@G(j,o^,׏P
    xTOқK#̰5r5p`7jEz�GΉmI<j|Oi|<5mnՒ$�
    	`D5Y.XԵd4r)jیA>{/j8F}6Kw2HN%V.Ң)2҂ٴ؂uڢ͝Ez( bq}H%Ws#fM֔'�!]י3ovRFx,tp\ib<lY^<eRzUYd&
    8FzP~"Mn"x(֗Uȍ7Pe64=lŌ\ƒ5_lK4I
    9$ʐFqݐ]o
    x~򏛸v&R0+<b%~Dy{QmFIeYٍ-`쎁II
    hmG˫f>j4I>ى*$]w6-D6ؔlZK}Քwu#3HQKnads2MO}o-6P~^4B?!.Ǵgdeo9, HqidaBIKBTk7}�|t6ɐ[.Ў[dwk/#TQhc$2$8ªU%%iR}D3umizoar	,�>W6n$ZYlM]Eoe"_TcViBti*q_H  n)*)C]_�nbS
    xAuo-IA>,ƻq
    #+MM17sġ�ƣ4<E|CtK';v>@a]ǧcTA(@e25Ie1"F>YUdEPX{+k8ȱJ(S^jK#Jyפ_I*5:Ȓ1tMV/i=J+E*|9ßsZr^\kiJZ�2>RUy$!R(H��Iܚw'=tAa
    D\E�9��c~:+f+"	mrUאbը!kQ+m_H�o:1㌸j,hj=G%Aʝi^M%>F_’�[QK6%%k^5Nk-!~BR:О2
    *=5"3+ԴvM4$T3YK:�7	L>[YȂS}QZeKɎNrle!KꯇMl<.B~RTZ»4+VW(&`-]Sb!ԐV7
     V*E)ZW"7?Zt7zPZ֝*I@$ю|I4
    T>Aڞ[)o�%6V<`yjFTAZw=i0W:r8NKR�
    ҧ
    ]=!̶TuY%ڴ@-;m}fŠ
    N�#Z~+rFMPiw6<�g[qK)dn6V�/v-ƣWa7�JY/؜>ӱ[YKndVݧVIq!*%9V7/a%c{iQ)R6Q�ՏzvncIl'ȃ8evD}rƈ>CƠ7|'FF\!WK.B
    YN[eyBdEϓf.KHS_Y\pnE[a2[y8++ɀCʅE|u\�H.&LSXMWks-QMuطiaW?n"&Ye]bcIgi6ߕc1нFNd4:
    ܚNò$Ō8.Q#;w(ƫ<hfA HcX͒y*h"XC-DW{1�[[nd9~R[&b+xcVgƣY+t
    ^	L\ȶV3_[
    g3R	$0M6sm#IܘrJ/{ϴrqcakcdmld.\q"',϶0$/lK�n]#DnxĂňH\Pm5{K)H3?p?Rs@9*nUCYV"5`2ŵ24WE=ʐ)QAFW6qf/ O&
    @'MCkqVDyrO$FoDE#(#	9	
    #olK,d2T"YʙY,�G5>^b
    B
    j[b*LF	(|AOP׉rVT庘S٫e*$#aOKw4ah ݛsI[n$Қ"Ӿ3�mMH}KFkE~'
    Ҕ#Mh?VTx�'s`dl_w<kme 2M@4;
    @ڇiRYl$[¯%Ư*4f0"ASY[0$2*FUFy	wV@[\wl7vu01#I(TbKLdh$]NxHG*mE[mwD%I-kxDH' =�m2rBX[9?"SVLVh0[@Enc?#&ͯs_bnOnMi-n=v̬a'PGGQPkNy[ۭjM`by;3N{yr}@NP/,;n#^L
    ^w3}-QfH&1<M,>@ej-+!]ήSd4,*3Fv
    +͎A^|ĩIqG02]j,wrOq"-5]N{nݻqŠ�v]ɛ,'k[3 EiL/"jJ	#UCzM蕂c#_O^2"k&[HBdKTjVP'*31g
    R+5aLq	
    j)ű&MG#$׷LA7
    YذV"8ImX[w$XY[CH&(nlGv+H/#AN8|J'nM*>E<q1MW )FJ\!I)$iљT*^1RO#7U&N�@5
    <{osoLd,Xz0*T|XGO-=[l$x^ԯJ]uIɠSvgs&j<sdOxܶnčEia
    *P)ji,"J٧vU|B WoaT+
    U<�a{=P[.ܟهOujw+#D:	I%s']v[kuq&%!')QH܆E0gӅ4@$jF^ܞWe܊r]Wշ V1HM(x>:{KqM RR@ڀBC7lgovPVHGQPQsY1@$uDϡiỺYoc'BcxŢŠ{lzu~Kuo.S8+"Пk
    d�h!T-oҳ?ց@6k"ccpMnmvw^GK]Yn5Z3W`jw:(&!3!FsR|5ǦZ! 7`WQȊHCb@:�K'-v;omS�$IbOZIؼVIM8(#OoxAY`
    
    o&ksO&5�
    H'o{oo/K;j:l	:5m6~zMoW�u4[tZ�]u_��?��2Ԓ-]n,):�-
    	[uMyl*u
    iqh;K(yfܥwJ~l5zLޓYmy/#ouLOk#_/??=c4>=d<אqQO?ofZzQRܨ(�Fm~kދn!^1>VЪÕ`nhBn7#W$(xdPL7!+r dE}P:
    SXU@7Fzҵ>5uH ]I j@s6Pt܍Z߃PE+5o[WTWԫlkm"@Dh1QRM�ueVl2MJP!ŘSߦثsgyOLy9rT4<cBr]7jZvȠi`~#~H8�Gi!*F^36y4xnETPY˪%e_D0}96Ŗx[C㾚0f{QJh*zq>'c]2Wv%RIځ@`<݃�LxܽͼmyOaR@Yy3!UVv'ܰ)*>Wo=|anŗOfN꣦r?ƌg#a=߻$m�#Es࠙bdt]X)Eݍu?~83zkXƴ�	sS㫉	(�h&(@
    ᰆ֓y--Hu~cXd
    u�j.V�`NޒAR:2nbbj1&vp`"Z}s;4sO=O1EVh@c1BO>;,ܱYM�PSaQMy"'i>tSX}EWMkA[{Ctߧmw�Tlh1ʨi@�i}骖$f$J$8Xؠ07NecAʝK?שP|5,Q4R?]7EBy/Wi̦[rgp5Bjµխ|fqs$EH$?=c5Q|[B=m<YN)m6n[dy1(LKٽDt
    CNj퉦A4REHIR+G
    eDADTt@dTAA>}!{Kxƒ\M,0%Mq@uYn㲑6"c`QPI}}@{sJb
    ,ՈM~67FJ򕤷Q3 䱱}*cOز4,��2+צv6P6/q
    ٶ qcķzI +]_wq:g,|kmKX\7I@5~ɭF0z'ՁhY,?xE�@QUW
    b1YSCQcg<A;j68#"BWN{oAZxj,ETDl:WЏƁ$SU`g�A)܍:k128*pF#WO;olwsĂUK8E _ӹk[xeha:KrوAԟX@خD@ۖYJ!T(']oIw.vÖ1ӓDbzxKa	YXN+­>0VTőPkhu/5+F[X@XMu{`1ƾRňUyaJ$P\YEن�^fJeJcSey/\u[hcqaH}RX5ٽ൵M϶%xMݙc.WH^L7RV)"`l;Ke2�X(uRxS}}q\CX	n`Xጣ7P81/fdQ�ܖQ$8NκiݱD$eKڳO7e%_nXm�E_i˔G@Aj<
    ̿_@IeQO(5؆o�2�NC`�׫z6CZ+nA&>Du+xҺX8�BEEz5b-#SSʼnZVCjFjtڣY--r%9#
    +Q]A!2�[!)`@:xy]ǏAʋU_亾(j#	kDS_52) 
    An;7Ͽ]V;	(JG}}
    A,R(xzvI칵+3,Kg5b#P,{ol[FBH©ɁV\M(4rF]t*˸�NtlzɍeJHcTg߯"Aw>^[ءX Ɵ6aSJu[XPT"9*> Tuo�W%p1	"Q*GRH-{75ಋڃ q>zWzk+wv%s$|Z�):/�U['?~�M�Ʒ>PL%7`	=vvʦ"**:&n.T% *:S]$M aO[ij:G[㷹v
    !o1MyK a]f	e jeӐJ/{w(PS
    '+LTu.k=5cmO4=OY.9o6tAi_<UTY}ט`LGdb*+uI3sĨ2]
    qcc!-Vܯ\C
    [NA<M@X;<uXdSܖ*$я|=[6~b3һ I$�1+�zIUYCI$Qj+'zڿec
    X&5k(my(+gn�oE[4KЋ&Z#l0b5w*>ΆeIb㸔l[%	*ul;x۵k}w>\kMvG8]wmOJ^gth dM7{,V)uvimm򹐩+gcf%H=ka\^Moeo"T׉03r]]k7taFY"Ie Ku䱼`T2jw7,oqBflܓVI-@ci1"Ѣay{;t[""K"=̍N@,GԎʇB()B�}&75@|O[s�) 4ЄuF+N[q!hgHٝD@F6k!oi"s(bB{jކ�H>f8ĦݫO=e>ݜo!i^)ҕv=.9-d&c6܂O]܁E71Wђ9kݎ(jRIJU&xhupE�	^>L}9"7;&9/<'p1׏龻D7m%&OD'K^enc<mആFiF{ |)y][vz}b7]Z[Bʫ,3BõT2HQJ}GXc-G&!kWUS$l
    w?lO1sdF$(ʆ",AB禗,3\$qح\H:2I*{Ggxeb
    *ug6Oy{%C-ai6!D;))f㰶F)AogM=H;S:ז鹒dx$	l"C0-_IF=%vu<]4L$7^EM^^QELhZ`cnYcK+{{dfݙy&N&X%EnT
    Z&~1LdDV3CG:~n_|%@%r
    ^C9ewqu2W[9Yfʱ0!(˱9>o'[m}
    S돷No띕PHDP:'9T\cagy|۰tqC?^mgMT5P@<XJܪ+,ܤʦI,6A]^-xnqQVp椠^G"6#VWofJ/rV2H$ROOh6g;*�?#Q]=;Ԭ
    �nC,A u򦥒)4wڛ sб'Ң
    :Wcy&Nz"sթ!<ǕLӓOE- Smy.
    oM #bGFA-{hO7PVڵđо?(ԺZԑ%SJ7;a{w<'MrpF^*uE;N/‹&	J9W5YLLjeBֻR-4u0tW\z栒`Fw,fHZHH%Oʍ\V`50~:k'$PDBQ@5=�:.wNJJlB1		R6k\_vUmEZZd.J�ڐ[,R-E,
    *2f(ٸZPk,gY~C I"F<`NWٙHb5c>o x_nx~e!%ƈ)2]2[9-ې3W(
    T-T$[LnoR2ԤhFQc+Y-+ҵ�Vtӵ̮b
    v`TѶ@g$�@B>'o<xI2[TF	ZP׮m_gh
    ozAZSRƲXHN7r^70q'VVy[=I^rv	-*tEff],}+V׀+"X[b
    Oۨ%F�Ε?!.${s)BPхЅjSYq}۸ۥckHDM<h4r*%dH11M/>W[,5ͳ-/0uPRn]jl#yLɊG{JxEPoC.l7nO3O #bY㊼%IkM}VY1V?3-:8'з#2WG*6)U"Re.0+[+8%|M#0#Ҭ6r<t]}g{WvחY_D[dℎؤ0E|~86o<(OHıuO�wwped'8rwYf5ۍ:0^{YK6H$Y1!
    QbيGr'u34sM%pHX$b}
    G2�j15յ</O}‡Ԝ֚ZPzc<T񯚣u+}q5JMA:Tt5Aj
    ?Vt![-O@(z
    ڵ?9qGc_M#+תK1%
    cē^;$l)I,}
    ]ǧ]CV
    BT
    hvRI&'M?PUԴPϏP]W
    qݬ7_߱՘5MN!"B| ~$᫅Kq>(*+N|=':W*qMִRHr#4nEК敝�I4oxig,IAI&Gjy[EPѱDJFT-(ASJk殮o[3mI;xo;$V#zI'VI5Zt6]cgo,Ih!s+FI]tٮ]y:^c&OM�ښn;J=At=<(\!aJSA %@e}F9}KαIpŁ[Y`P7,7cjBt{hQC(jTq! Vv﩯/1Ʌ=Z7>-X(
    j
    I7q ^2
    %bOE<@*~4oצ6>&iQ־Z_d3Scv	RZI ޶ł+5SH=N(:[E<9-Ha0?bؖB,ڢ9Cm$tX-taoϖH?}E%I)&7)m]<(߱iXsoKpDVպl6(z/n@~c#q}u看kHϞGcq{8Yș#,�^2X|K0[α3m1,,EjKK{w&ly$XqC{;}o౲rX.r=G${k[+H}֙(;@l6^ᑠIxQ۪O;bxƤ`c0x	=''RȢx8֦X^W-l$TZ3{CV]]Io.JwhVn$r[	T%휄aY	b6S4*JZ/5}Y?!=d\Z7XN<mb2ri73I![m.fzp(ZXF;~~۵ۑ.@?(eM5)ҕ�?uxKVhYKgfK_`%5HPeq=.ڞI4<PԧE+Hv]s>,ƚotD4k9iY
    MEo[lf%ngq"_CHV-ƀFyԓok�Σ\?ʀx̖hHGިY/p1H& Y\?]s<GV2*U`2Kcf�T:;PsQԼ\q*&d�mCu)G5dD종=A�/d[81FA#+/!vԷNтMǁsaXx-ƒăjgߤAje$6O|4rǓkB03tAV>-\N6[kE5K!y-?W^)B? QZB?>dk�VٿV0#\^}jTdBʼnf<jISe,0ue^(JH3 @&1)vJ"Gv,`\JLe/VgTO[PT{#ܝ>G'hEmrq}}$-գK=LrlY(/QZFQVՎ/rv<Y|sZ[-W6+A)) wկxbC^-ζjܐ~%W9𢡊F/uqq{k-P	@Ouv9[[;,w6)U`%bc;'kOysp22ypUET�
    }5/kNڊvv}En4Go;/)6QIr#yKl,S{eʂӕu/2zC.`&P҄O8<.k͌P3r`X�<R#(Jj1=KIr]m6h"+8~e%qXԒIu5؛^նMrӵ+ˋGc!f/Pj{۳olRHKRLÚŠW*9eѪ@r[XD֤HVm@R[XBOHSv,!1dYmnRvk3Σr䐭DJ[VPAw#XX亸4ypOre<2;=O#1Hoq92|8}@rib{~ƄRP>:1U*w,rDUH2�@?<4n2L(^ex2I
    M{!"#Z @uqKih?G<֡$n_y*݈FT�@=J$BJ~çe �<jmi[QNH">fFOVV9LN7%ӟ݋τS
    8+OxcgH$XW6JP�Lؙg\my"
    ӈM^\fHDaQgs@SSҢjGI}rJ^D7a=⚒| %¼!7GO5'Mon	/Lj_t6 z75upq=g!TPCSZZPǗAcs(cQZ1FjxnDQU׆UF-xo"ǷqMsrqO!ׯZܤhO'k_/
    	=՞SA#Ptua+np=GC~\0_=ףX\IY]l@ohVؤIՅ[d<880IeHx
    EjKu%,N߶[ǵL�I$|$6/4NC_VWsOt5ʃ!ƮT�hɗ̑]ɭ
    EjOO/ӡ5o;1J}Xl#GWTosW_ׯW_kO
    mOա^�?���?~?</�Zξ2duhʉ2:;qJxSO@O�ӏ7	-MK#TnUȟ[>D_Xh+!KA4s\T_�CK]d;$kprQYVmS^Zb[
    ok>Ӭrc=͚zAYgy2ZOtj=�ȞS	
    q"��zc?}~W"�W/&GCkc4�,dg抟_oW=iOga]V_Rïٺ8a@Sh$Ij3Lrǣku.'i1)ggQ/�{8JUNc
    SQb)އ?1+@7pwQ=U}\Y׀E^Zh
    z[d!il!mKQ^S܈)鞵i,gSQ`VX@+6.s М_QZ	U*]t}<LS8~#8/HbLs5f4#A?GyѮj*/=XTV6m~~ݎW(,z1]75QZHSdi?h9hΎjH\orzj+f3ċ'i9}?++KKz|dYA1ZÝȎTc/MY[;B=k ȨHU›k&Tww?%Dն3,Qeh!#%ֆ`ȱ@s'ȔDO;̭u["g^c2OI2<Ӑp€ef{?`&<aH#cV:4֏)3ϥ!ÃAcH.-gڒ,#|՚.5cw-]{3R⭽&o	0Bz9`8<yF?t=	wh(dicǕm
    Ls8
    &$=WV߹l\Ζǭu5wNzIJXDLX\Fg]u9<O`::[SiP:y=啍l8f5Eb+pӟۜ*;\T?c1,$I+%(/g	Qgp	7岩Cs-D"?XHM~R{{+ʪ]3q`B'KJ3Ě8^x5QZG5Ȩr*rf]Zo2'E?!>ވ?~N5֊$kH2ND7q�9_�/> Nh*ٯR	G(!@Tl+;KXCXTVSmx3#bDE!)351iEmaV	(Y9 ìmhiVlCf_%FD0Ԅ-ZKL\BPYO[=$I8\�5�"Hs|,h+ĸh!!#Xk9TTwzѺwRXl@95�DzV;'5^<͍ZkQֻ~UO6Ĩ2Nza	pHЫ#
    <Oj)X+r}	ήPLtk419qV+lFlj4r1IhLOǖ'H'F*_TuWpz4*T*|Sc\"(0r*5}zc<y
    ȩ~w��__XJV\aX+S&fkQ==f5b=IJ*)kքjP1'j:0R"~Ih;*ױWݤIG§t"#di{y
    Yfβ"Kӧj"L{:1*̱?XКe_ߧ=٘7dlq٤-TU@)k:	NV@q깘+	IR6P-l6(?׉�{zd6[>uVӔhOu^|B)7CVCuy[픪M]ea	Y`'؁kneK,vm]>
    ,
    Zy]~]RMa9bmT̘6q_7x§Nsgg^ǸII2m<@R<:;'p%Eh6V2MumΑ/bQŻ^BPLb.1ѢkJ͖sT<eEB}~[bydIhb=ƩSYY!,mڷҎi76=e<D\/ňrqGX[Q0*bȦh#'Im@Y]kFv9NXtU{ЄTkeJrϊ}B
    e|gu-%*\+:Ƣ=xVD}2A<Ma8u6r5Gh=誾A�u�T
    .Z8a|!Vz1ֵrC%9F9F>VJrWn=~i[Aޏ @zxǟ2Gy;s
    >&2#W͎֫=U.EO4@S֒qBLw\ow9yTO]2	c浮s%:9<U{ŷA&̓<mtL>W~dr	zso^ge+ Ud3
    д/
    ;NNDkV&Y	TkZ^\IϯQV/-#ZsQ;�be�zo,u̞z;檰=C؊,ӈ΅1rx}N!=ӿUmxcQ[)%4kS9\YM#f}4Sag_KkdQI@7XWza+9dv
    m|G%#C6-/=#[oma'wItY}=m&\ :aUQʮU,+aoiN2\dfږ_:\
    L?0>s~nJ5:O2Җpg,u?	`s!O/j
    m_e$;h5Gכdfs#ĈRb9NyTXnz&UTCsǒKi"
    TjvGڥ#H5Ư<#_g]ݽFtg=,-p՟rƸoB'f
    *-v	Bh՛GqMT�V6fSQz ]>_J琼1w뵿m){&òlv
    -}[o!WVn1WΈ[hW>e(K9X7Pd{wYio?yU֖Kyd6ʊ{$|O_&D؋5.lYz]dT%A qq C֡n%ݨZ~WE7?nZdX<5w3eJ5T渲Fsܟ}T}�QY~dOtlz-̈́-f5Q(¼in03ǓOwI}dV�S! y5%k6Ȏr51L#Q7q;gZtjbyoҀHO%XmP|)~(Wp/>K"9Wx>;xTDž+q[nw*H/]"?=T5G/<>"V*ߧJ|68Q<Q8UDE>D8&7( e{<-s�nV*,E;yRJ3YllOB/֣ӞU�2)y6ZDkcՎs}>wFb\kK뮬uC30
    E=h,fUYDgɝX<y}eyrm'L'jiYUyz򼯿랳g\E]z/{2wdn{FF#}$TYx$F9V
    Dks\ESѬmz[Hdӡ
    N|Ɇ^Wu<M%'a6SVLK+/SX ףZªz>:ҋG$972_`	"A9lvQƼ5=ElC-!Mms	O{HxF=QZo
    ֪Xt6Φ(fkF*{rDTQ}zc72lIc-/)L	8̨{{']X`S72k%OL#ײiA&-Y3c#m{/iG"'<9Fj"!8Oo_ݽoִ%7Ne~:;WI_a*1&Rz*^Pe+YNV4AF[C�n_խauoQm#"A+s\S#dU1
    'rQZload,HGEK#Tʫ˘{�]}wyCGLqAFdɥp8r(Ǣ<}KVC4ؐ5{Zֹhڈ+ە^"7fu6}v
    	>39'NDE}gɣ
    fS=Q*:m{Qj2Fsxj=yzܮ))u~ &sL;;HUU08VvW>辠m7X֧E;O*dD`S�SW]:,?l*9r:t⩡0R6eY¼UV5|]K;1iwWVb^
    #_�
    6)'!LTwo(Y דOʔ#Ō799RXmeLAں4S_$TU<xPEϲQ]/{g7͋"/ྲQM<˺Qt^ֻ|(0ARLUc}1[ì%lWYys*O&k/9Z6늤vn$^"f)C"	c̴j;G
    ޸
    &YV,YE}G(o#=X6inR#}t_QYnA25%|Tב"{ܬW+q4;z~-}=j~HL[sw65|VAeUV6D~.1UQqv=(Ւsךg_SyE
    ej*Ft--C<3ԑ r*1Sr<Զ^ޢV=,/QKkfW
    bkNÂYrB1HV}@_VW.Ǝ;Za2|X%ð+厾3\"'ӟʊgm];~56PNHDIU
    NHwvMޏaKK_7;A]m+{rԧM`	F#ק
    ν;(ޞu=E,\'ȵZh_p'+A5z'[_Ukm{4:߰7uh)bM-M{F/hsY".4v|vg?O'Wzks']sh@{߸NIqwKBR\ϏEXlFa\D�U=D~K~VBWg6Xռ$zG;:ZDcؾ:Yٗvg!bfc<@dv7UzJӴm3W}˥�mGT)&FՓDc\ꈾW=A*5P8UW!ʎ,SA~7WƵYX)زFCBNr{"/P:ζ9iX<NǬ�pSWֈ/si䯊rTU1*rQا-dv.nxOiOdnȷU[]a%[=ZTZ1%`ڪS1{Waj:6*J;_CHP|x=Wb2´J|\%&|.'2[?ZEkTylaQNvF$S`ˍ[|4:kQB!q-UsנЌ䊞*w(?nO=Qǧbq(Lw-vn5ڢcaqyʨޱ=>QF{ݗ%þc]]ء4LD{=g M5.-Fm\ESBbIQLXjGzI!Ucv7ό2/׭WrM_duCy4JM;_\TUH(
    I#XC$es9S]=մYnuW\Zp6ƾ=h!承NºnKM[vkTB~a[K=A4yХF\A#էot>IquV3M941"F,X#iWlr3ѻk3_f]_Qyī.{EiQo9pImx&	Ī"DO]Kؑ?9d+hlUQN<sg*#!G0hΜɍV;OkVHGX>i+R@@h`Wp[7^tMK
    굳i YLrhV˜)Axr#Q5(I-|1¹voc_
    qAMKkx9=:w1{{H8׃;U[H׾\聤,6Tc&5?KVuW\s[CQ>2|}b5V8VKW\\!#f`t`œ"'leG/VVV֊dwI:%sֹ[Wgk*{BL2TbY>�粒%P%r9[FI$7;A`{</ff'w]VKPGD+'BaE0[شRO3v%-rm]yb:Mb5uO08؝DSYjbclʑV}	U|>=m[%U~?W>DeM()jbKFQfI>""jQ8{>O20b{vӯcI0\HQG=	9<]#QJ9p
    d>]u{3'^Ӫo59GWrGXTݰ'cfm6$9]^׼U/i]
    f@Шk#CyEi y
    �Ouw4EqnA5)jrǬ~.`"fv8+'5(@6NDsQG%O#F7+|hfs°/Sdg>xZYXRx,8<*>Bz6mV$gõ
    VH75z#-sUQQS�:$ES1AOvދ!
    ZST&�u$€/z7fNu)wϜǑ{�-Z1Ĭð'1t΄V+?7<{5^`h F:s#5|1D'R185sW%]6'ؓÒ$~n﫪ĬlvFWzKmwYg3!..)4Xc62{|Zʪ'}GJşoړ$vFRxChx,f*{6DiKTK{G5"#`Kc_Z5xpde}S(r7VWV2al4q%	bWz	EȎvҨ̝e[P[*jKYlz>An{]5WJM7Ct]Lz\\رi<Z9"%XBlv"*lRYX]q(p+!^Q$a6֕Y*m9~_v\hkvNtaH;-�[z[|;F4E
    "h)&(DTRq:1|d5<|㄃cTljJeΪ].ގ1?aF8-&Eas\	G{`✎߈d
    
    UUF'<z1bTƙ`c/H9^\usD==>%g?w(^r'>ꦫGmhzpϾ(m0m
    ey2
    24U*63<Uqn/1x631{<(.|j"O=yWty9QrM__"%Ln*q:KZAX,IJI+`G=ՈU`QlbßQfDq_S%T	:ږoV+Y_
    EOʕ*o|޵죈E''\XɵQ#Oӑ8W^l@w
    41XOWG45p9ʈ<P4:Ed|;˜>ǐOt
    [0mF@UU痯D{Đ)6HCrDTW"�?I12Qm^iW^
    GQg0aGli[N'
    TNUyL
    {G{+R֑֩$[ݜʧ5HX΃2Hb/3=ci5޾Q6a͐
    kV<,k^"l=kme~(+f^춓.{{eo*Cw=tec΍z>~so4QVnK:GJ:{l`E0#;ǞmL&
    kYi3cFvzfHfJ:d˴rrMc2y=`n#Wwn脲tsWH#F=߶] g=)0)zXյR@w6JI2h;}mj�trz|@uwZkB7"rԼGdm:.Χ{8wm麚P<k%^k,?I2Q'\u.=vgٵy+
    XI?Ą+}ͩd-1
    �1ߥc֎{G~{˳@GIMfSnk
    BDդ#q2Uj<ӛ^*Tﰛ
    0)+&#Qj.ysv%/_ˍo(KY	"XͶ
    |R#P?t{]sqma22c%[evF3Z=v�Nik=lBGbD*VcI?4K@"1#!8EV5Eyo0W_h%0#rPB<D^=>wmm
    &<W4D155TYJ]	o#q5	o_I6K0D靍Rk}&SC3D{ߣ";f0|zg4L
    sUG!&(@W':_:+Jt:ȂWGsYn~q?̦wUZzD"˩!Zy1vbTDTN_\*q"Ǭ5cqa/e<s|0"
    ]lMW}h;jfP|'
    @SՐ`) ԭ5q[!VG�A-RO'o܁g		)_۞}'?N=NcEg^	q6ĆGH!_6|o}zpGq3�,yLy
    kW˗}<JzO#D92[UkՄڎ)p3dC΅s"+ʨϯy
    $x9:�ـ1r/UBCcq:XT0cHUWy7ek-P6Rp9nOZǣJJ5TR"Uı<*J nT
    kU}3%OO^aP`,ϹdC&Fq5>|yIt	$;X8RF*x{'<\S5~S\kZdja
    wW՗ae]ړ{Jxʨh:D;(B�!F{HvZSO={C$j/B-L	C'/Re$s#Ƌ D8/Q[vǯ={<n{HCRnm\LSVcywX؊yZ6VƗ%Y[:$><^I-U3@r:ryP2$nL`]&
    N)'G!S}9m1�v9//Z$11EPfҽ[`<	AC�
    X
    JI@9/F^QcjqNG<Ysa7k*>CDw$ `|hcT}X@iԦ9r WېzDvʪ<g9a*к@	|hDs^бlMnyq={e7'֧9OBa+<x/yqz1UE,zec>_Rn4I39|^;~IRRLQWdg
    ElL8xu@
    Z_&1gO7no)G4/-I$_l@'7aU(<'�'cpG]s԰e9�
    x+|f܉^SS7wu-%Fez4K)yZ+2�6jRʇ$rxGPs}f;g;uflr5y15{LHbrqeEQxnKCWaSiY"-hj'H"1⌃C;̍7\crz^>ܤ#=[[%ʽ*,ɞl (Drևg^]rbrm\M&m+f%Q$!Ӑj=yw^]0{Σ/*aOYg|M@Q]Un.Z]u\i:YbYh1BwpEs
    ]ZFRa17`k\j;pxl\"KdT{M4Mo=ڝI3:w:kvf�>!G*X9:|UEjlHVPf\6BJ[(UX}bFt8ϱqP,k::`]
    l̑H'i;kgiC_T+=<C$Y25*
    q#*6KhH{'B8k4ЂUs/Ym
    $2q|bsٍki+whr4V7k4EGez[:
    "=Y_dzDڛUqY>\ˮ=oC%%>LtSbWN3/OA4cȮwLNYݓ8{8ji|͊�E=YFUKf
    o_q
    {.8IG=~a gF]ә821I[կɅV:Lx{GE9eWqH	#rY2֟rM:km
    䳌"ǰknT~D()ՋлU繆Z=	&,G9&jOQL+jZ9-}|uge_Ɋ2eed`;2Ioqz
    ƓRZ̄quwV.gJzQRX6®H+W.RfJ]ijz/&zp�WM"'sʍ,GU\vV2|k9DYn,_籷ml'VsA3/-#cc/*j|)]]<LRxޞ^ȉ˟K02ע"8a+2{ާS	ɴO>BDqOСG�֣޼rD�ߏ9�&#|N^mtqr}}dZ߫[-udaF&|#c}WLֿ}s-0$`e#εz1bXYtM+@)
    ׹;=-Ծmc:oB5|o|~ccG*15.北,%ֿdR2^c3nʻ,bj$T0LGtRȭcsZ
    ,r626K:03F	>3pcSi}3]sNJ
    jhE_wp][pZVFP,ںxI6=Fr=BZTargN8M}Z9~Q,vɕmiOgX}M~_8mX:,<C*\Y1[R&\TiQ_Y;xjDub.J,9af�z9W*tv#.e3!'Fq/Q}Zus0TȹSd<kbUJ=N¢e}-G	#A"*ۻ*].LƲK|ZAʒͰ@`ːYeR4N\|փ?T=MZU4
    ~m<swZzliETdq$V
    z?XaʿBʡc?ZSh%+#SL>kD`uز󅪯w
    cOuqz93q?DeG~=c5W9d<lJ7C%TcEs7k+,{	7!*S54+܍|)HF$
    8 i%Ãkir@z6o"X1X$F*8#>\ce@6r+[3wm<!ȲHEV.W9Hl%ךdge&]P$)Hܖ*GW5b0C|T)
    k\d!msR%o<'>Ҡ{NK:YdWޚEqaMOi( AETTW36S# : ;x[cd�)�%tG9>?e5`쪦j9	c^ۚ2xʣ}KGߕ͋o">gkYb%Mxq$7r<}HbTvt1PLiNR3N>G9yS48ҷyV5e/=#U%8Q>EK
    lVVY6?:kxVu^	O5F
    b{T?)�i(76@Fv+\׌Q}&4Qf WYKxQQ~Q${{5C~\';?ZceqSAt:49#yR$1Fp6y~e
    TMeUD\L4ֺl㰰�^G**rؚv~:Nmx<_,˫�?M+xDQQOǝd0^R<#qբ}ul~ZI6\I)jl]nֱ$
    tY\:1x۱{HTA[YҮf¥Y&5F+iT/&9+[»D
    ̽&qu'@TJgq9U.4Iж�YTpۼ2 nlRĈŕ¡>3#A9TG}%ȡȉmK�_/4IT0h`	 sj*>%}X-kIO{#|^ڱHj¿F9^KQf+L",Y9KͫKk"o%^!2z.U [=qQF-2r9$V9hJ"Ń2@ӖUkF+
    c1,lF
    !={#y&,ֵ֢{)zD'��E,eO+Uisus. 3CG)jpy4}o+?
    Ŷ1Gw4MQGɆkfܐqJŔbؠbBƣo0e$?<1ViDq'-ⒶS>/�n%QlArܫ3@TĄϝM_i-cS U1ʽ|SHΣ]{#(#)GǙ7Ay=dI#ǷUsu	7v:+!5F7 '8z[LʺaG^�5D:ZW~f'v.»OŇ$eHߞ<i*EUgNG:t[IfUq4I%	5:9=y(t"HUƣYª}Q?^=5<8TNȟ8={7|}�z"~O?~??\<s?>s��nsۏs/ǿx~^?q{x=~_?y^=78<Ƿ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/images/logos/lblogo-200.jpg�����������������������������������������������������0000644�0001750�0001750�00000050612�12143164146�020761� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������JFIF��H�H��BExif��MM�*�����������������������\�������d(��������������l�������������H������H����C�		
    
     $.' ",#(7),01444'9=82<.342�C			
    
    2!!22222222222222222222222222222222222222222222222222��U�!������������	
    ����}�!1AQa"q2#BR$3br	
    %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz��������	
    ���w�!1AQaq"2B	#3Rbr
    $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz���?�(�
    (�
    (�=+NcoˋsA%=cR$T(Q@�Q@�Q@�Q@�WK9t_X2ڐ
    ?:ENKusb&_l	E*Sjo5?+xԋIse8|	?(IVXQ@zako\7n~oX!V>uSo�ۂ_k3f;k_M,`dQF)xՍv1"N֥qSoVpjS{MXlE6;UAyu-i*Hc|͂zUJXj4~۹z^B
    
    U#AMN*K88Iu V5<(CEa�QKPdEs2\5c2@άͩg,rJ)SOpFG^]l[+bF&v^&%RU{f7oֺG}Ci~V4m'9.[IRQUC#0fPwTeG)=9L%')v)hȻʌՠ}9Ej{V1O�JOJ@K2r0O\6%��ܑGg3GLb_�Q*Y Sጀv?J+_?E?:SR,mj_ϭdvדke}Rn݆qڢ~ڤ.WW'cNvj:jji\&'͓sA2	VْK9%k`YExNߖƞpsU}Q1FHJ/.OIf^E1W-*ER	w
    ru+Nl堗VVvjha+)92)\Ȇ3B}QЊTc|H֛KQmu/-W1clյ}7Mn؃5iAI5J*M|�{KxAMf#@ȷqX%c$'"]d<VMRXo>rXiBxyfkN3-ΨR׶{^[j[=Đ4.	*ѭ.LO\^SkC,rK	Tm=,u8IEir3Z!Z/i~\zd\f6Kv=8QqmRItKMw?lmщdS
    rxB*8(Ż*ݭ$X?̭֛gڦ'Ud, JM4n4fW뮿inc[�8⭍.5KEELh^#JP?j=;-O9}7޵
    >)I (w=p=cc]>T7kJn=?Sr}26ΏrKr9ʲtZEV/~=~^,?mk1|2rZ3Y6ZjɀXJLeUJǤX]۽EgW#e(|`۔$+3T15-zP!iHpO3X׶\:a#4ႯS:*�wa^Y%'m,Mљ26GA%_YW(Xy8j%)zkgqPmKf/-e謑/v9'MT[e˷p<@>^猁Y%M?ռ=Ik^fsh.8S2XqYFSm0@C<llⴭ+J^�^TycxQK[[%#R	<g�qP_<S@ev+*`/$zpsl_oBkR
    J{Ʋy.&2
    d8$>F`X1\՛Ngf+mO8d}:zʹ	#{7G=7}VC<j!pr'9bQos;,BO.2^S9?jI${j1[1
    'ݻ?J=>MZH%GO:z]4袤ltW˓ӱ,5UHߩѪF[V.M=]U=L.B<QPMc` زbB2p3sOYLi!IaW8zV+hnK+AUx#�~XCukiı,Y[zQ,S]܋sY_{WkQ9`zv@ ޲+l$MH<P@bNsku)s5��9k7)O_B@%Ŭ̲)<G<tǾk֑'b;ڸ-6=Qtj=2^
    3;ӏj,h zm=$	a)`?!>[YF9u	>ejir<'N6�gBNdu.O"`+#�.n7Xuwa-[w;h{-ܹ$m$)}gkzTmʬ7�{$}G]
    
    <]q=j;k2kpҺo'?aMNjBKm9F#
    vɦ$["Jer{y<<!ImFu1u:?fwX##!N;=jTr?G!x\rRsK3[25u{]	2.HbU5}UxRZ'.gDy:g9Ko0u+'P=R�u)#hg"g}	ŦlU⃔0;WOZؼ1tٵm-C[^F[V@?S0X5FܖH6#%*;)Z,l <줿|cTj$A#̉W*'}S5=$(T@:ZRwʟseקgHnJ\$c>Zy�[N3ͦ_+ˀpĖ'=+MlNԧ/U-1CNsNX"-Hܣ{:mZ4N�%ʭ8T_5V=<PNzNqQˤQ#&h* \zZ_ZQq,rbMaܞ)yRL-0.͌|7Ws^Eק^g{6^Q"*#^~jEr)7u3VLDȥ,J	1\#ʣ"F@;ddpMq%꡾FRɮE
    CDZ�
    S%upՐA<V>H7δ>ُؐFuOs+sHӬ徕g!cm\WQڡ@*s{
    ݓR�:j:qK,���jZ�(
    \
    :ƚRJp?O.3\?8kєe)F[qpQڿë́N<Y}Tz/ֱ=6׌ٔ5yc
    FqhXnkp̀eL`c۽uR]e+cy%wRK{{<ow$}ߑkj%c�ҷ�[Z|ͺi?!ɫ)ITT5OHB \WKgh)�Q@�Q@9͢ұ-kOR5ӟČF$To\�zоql5+	It3XJKb-vя
    \KhA[Fѧ|(cQO�QrQ@�vPhotoshop 3.0�8BIM������H�����H����8BIM
    ��������8BIM��������8BIM�����	���������8BIM
    �������8BIM'�����
    ��������8BIM�����H�/ff��lff�������/ff���������2����Z���������5����-��������8BIM�����p����������������8BIM����������@��@����8BIM���������8BIM�����m��������������������l�b�l�o�g�o���������������������������������������������������������������������8BIM������8BIM��������8BIM����������p���<��P��N�����JFIF��H�H���Adobe�d�����			
    
    
    
    ��<�p"���?����������	
    ���������	
    �3�!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw�5�!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw���?�TG~˼}�԰Yo1h?gM2HmJ	@w6RU԰ʬ7ͿqSYaDL�aZpqn�S;R54W�tI+)}qcƟs""PA)4;Cik/Xr{r"{E%¡c}GYcıUe7cQ�sC\w7^XǵEe�<RYxDo[]'u}Vj?v5\\zp[\`3(7}�{zEnjh>\?4�Pc&㤨a1Q7%@�pIc_�k-.s1Y{ܰ#~>c|3㜸bufI$eKKOQvl!#)Z]5;5^qYꆆv5nд1�ٲwHʩ}f�ּg#28`Ȏ+z5Lkf+:SWh!RZڿV=s,]nP0vo9۾vn)k4klu?=FzOw~z3
    P@f;׵~DDAQO"x#3W.MΫ-QvrIJ8M;nc�nCgRCE?F3TŞ?ws�Jf
    %;Gls[�H;hŭᾭ!-%�c,
    B>^.&�VI_kuW'�_dDvϥTfV.Ev?'$:^/q"ϣfUnm~k`ewӎ!9ӣ}ofYK;c\Eu8MI7QDLJ}D	_L)zet2)n6K@}Θ!qFEe:׾̆[[V�QO'^`m|Qٹ�?λ,.q`sGc6=Bgt:Y3WV x`xore+ӭtC+V5V,07G%[�[UfnvRv@sᵻhyou!x4>_�XcC]^e{Z+kI')'v:}�KcVde&F׿{(l+),c^ pG
    Sz[A{oʮp4??:!K,p!oݻcO,`bh$EtVMtc>vYcƴ$�8g�tLѺW I5w�Y�ޫk.l<{cppl~ճ'5Xn)ccdz|:6(g!%ǧ,Љr_f}�g\znNB+۱kkh{v{ߗҙslqYdmkc~/
    U[stg5ٷ]Oq2SQ<fJ~Yh>@Lf+l`,􍵷W_Y}Om[<4_A~W	&CI{=*b3!."jhVmڛ^($	7pgb8՟ҳ/<͹W/sv{e~JEʿyl\ih/a/`e7llm{+oE:Ňͩ649U&K,sڭfX
    7<IN�l":]Xmf<~}o?B�`tq66[dZc9u˄EdCCs'|7@q
    �ciqЉNsPo_3#: 0D]ssX9$cΰ;
    !!8|qw<|hHn;an?cP]0u	opsg]IE?f
    wx[,=<U|i:^m`6Z;_䢳Tڃ}kZ;hùGo#$}U/waӰ-:˜=ӱ}P$zL=M�$k>"^#Aq8n[:g*6˱n
    춧T�4G/>C|~~�V|==_Gys42qW�Ͽ0wvO?h�=/Ff{MXns^>n�mklnؘz~Fgj	}�59:Kq-NR׷{	p~#c[c?TևB#�gn5ODzRr(F<^x_N'Eq-~c-2)X>cֻYB5�g_8BIM!�����}�������A�d�o�b�e� �P�h�o�t�o�s�h�o�p� �E�l�e�m�e�n�t�s����A�d�o�b�e� �P�h�o�t�o�s�h�o�p� �E�l�e�m�e�n�t�s� �1�.�0�.�1����8BIM���������C�		
    
    
    
    	
    �C��k�"������������	
    ����}�!1AQa"q2#BR$3br	
    %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz��������	
    ���w�!1AQaq"2B	#3Rbr
    $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz���?�(�(�(�(�(�(�~ D ZH`yHW)sS83MŤyKhe4屸kK+ӫWڌL)Ʃ]Vr&ק#2�_˜A,/<>/[$S_5*Q|%:(>(4�QE�QE�QE�WU?z�O٨j>ֵMPaOܴ%8ܧ8;y~YG4�`p*a=ta(ۺZ_j+�6_.Kx+ᇆn
    il"զ >Nf$IVj<:gOk335]Y\ɂFU.
    �ج{/7Kk۟ܝo[j{ioks[>8E||S>kO�y"}G_̣)aU`ݪcUC:6O*+KyMyJ$EmD9ۿ#+
    ˟^SqMwٺ19,,y1­i6VR}owF[Gk?xC|N
    Ze[1Ԏ7f *?x:wuxwڔZmޑ.d"3#rRX
    S/e>TߖJDxck/i*n¹k-y>%~?.Xjm`<9! b9=k+u-j<;|5̰k
    N]H$U]F8-_S&`�yďml�-El>3**q_4�O>-e	xzzyIW2+FHeN+$nMyY0jΌRtx)+GTկyYøMjP	SKN.rѻ'{t~g<?l'O<8ש,Tԡ3Ctc
    }ri�skDN6+"RFUR3A/)9æk9gwI.k+
    lG|'ay;I4Off{:>	%YW8lW_ꔣ=/i}uDB+]6Zfg�T_++{f7%~"H(4|d#gQK_ 7a6º0`+=7L݃h7q<=b%߁gvw+OُKF	|G}BPl6`l_u~mM<wF.iBi'V_#1ڴ%Z|?M�ihm!Xuڈ%y>gXA4љuk~N*<ut#_Sľ)X,>g	<gzC oa^y?Zv;LzDBrv[E{,CXiE~LQ7ҏlk[s*Yw5B
    `>q;Aj!b5>2O[p"]=p}7/L6tMnp${ׁ.3(*mٞ$8R_F~z
    EJL21Wk<Ux7tu8�PNK8ߚP|H(�`}~ٖqN1UbetV2b>ֽ
    (>O�ŏ!�_�Iɻ@]P?+f�jn]PPиy<7]1qs\߳(t&lM�-dF
    pG8\WUbiԧZ4qtw_^cJ]!Nte6ԕMnչa%Ӻ8$>i'�Q%ĈeRT&qP<cgO༑mF-cfvF=GMv}3ℾ7yx1lYN-6ӐI9M}#MG_\mEK,u <k`o�mb'>Od>ϒܮissr_KSX̲ksUN7+v\Ky/V_#kjoip+!oV:4?<]|BtX�S0_nrk>4ZOúީGڎr'�LHPp8_AKxڞk[˸Msҹke9E*3shө
    1i;'5	_x_Use%U
    ԧ:nRM(ۛisEFyCc/nrOY@{d+f6"l1U<;q�uį;` R,m/d#3a=ok|D/^*MSupXީ2y�&q1{
    ؊ĭ�o}<;:]tvq22"}⋻p[!VtU]uRy{<mI[n%(U%Ate5gdqw٧i5|9>Yu2Yc
    P1X�px?]%aC5K4c&	
    %s}JZh
    gCKĖRӅ`r.=V"+]֧^xGm:.R&Wfy2sBc d㝞[bs5kGuu>HP8$w6-1̲6_Vs–)Ft56ĕ˧/[(<M&uZKq
    )DqT&Eb�^4M~ݽ6/*;#cʀrNq,{<=u[^?šV'sX%
    
    w**,�_�bMž&.iz̚b)K+B$eUX0z'iS ǎөs'Y87q|^W1SϿU)S|O*Q-'/?)26V&BT}c̋l2A7c#t*N
    V,?�/FY"=�u�W/kǿh%5|!�Al'2bȅ`2AGSF<7_Q7֦ž'v_.X�$|zWE\
    XR-z~<K?,uWZ;/<\a:oR%-&gvzWL֣voh8{.Va|SW�:;#tTI(X�1]U׊|)a=&>隤PJ_&FOGl>︸
    x{ڂAץFi5n]	3)S_bi5oL�񝟏+K-JS^֤/,18m�F
    pY!cxScpk>g�L
    yPCwk%y9;z>0i?Ig-ՌmgT1PH{~93ּzx:FI'(:zo6GSPX8Ө4	~�?S^w닫|YgH%9�Fj~,ZMB:3}ýy_C.ЋlS.ɟ^fJXxsF?J`�N76[DM<
    CjlA?Z|[*F:j*[XC݉鷶sܚ?0�{xc
    -m'kxȸb9>xcdpEzo0x{[<i~ֺҼ<OdХDBB+<R]F_QMuVի8Š(`J#t[Ho4'�]h+Y{cz7~=	xQ^2}>Oo}YDmz3koZKB.F2==<o4rI"c,aI>_cV'R/',sM'hiGfl-9*ROhKڼ=l?nU_Aq6k15hTo5|!7vI&PK8g_5|^6.aXEjڄ#J36oSʱ�dOH&Z.]0*
    @C,Y42wS&yşS]!5s:բXI/bFfM4r(e.edc	cŸkr#v_c^JJRJO|%̣nmӂi+/ºV/)To>~e"O@J5+Z?`67RFxH4Vc$cb	nKWID5힇Hӵ8[k)i#(-U–?d
    A5K6
    DZyRG"˱ёX2*Hq7OE+%'y4ܚ#8iJprNחZ)5nOvF5KIm=歭Ivzmt,32ym?[grqI%p[Be!~6+._,+_ZY5m^N77Eb.\8#¨(9'~Ӽhsd%ıIry<(l*`ӓ[>	µZQ\ISRm[m7-읢`:Tٷ77U+$[]> ^xDVZ޳md6pLaXqy΁\j>		}ޢR`P%eK_05@vJWou{B�#s+ۘY,Usֹ'NѼhbZݢ[r-4J[+m db<u<[gked'3w蓻(140VC{٫.:\-Yڲվ+@nZ3\k:^jI-#B:AUUW-
    Tu|MmA{^.՞EmofV 
    5/~[mS{ĚTbƒLgڦ2
    yDt<
    k-R8-{<FV؃,0ZoS:(ѯVRZvqz.VE+i+iN:+Wdh&o߶񎥭;#EZ%Ψ[E*eC#څ0>|<H4_i-Vk\
    vhf�|$M{WJuo}_DT$|^7“˵<d+#jH^ZjKi#M5coPZ_,pJyL|0x;c+s5'k%w}iZ%nSl,ro~kKlխ/�[i:}{+ybJ3?s,J_o'q׵^k/֍\kh$XfOHi1մ5<9mBHNm 1nJe
    $pG�cs“Ǥj\ڏaBۤ͌mUTm!Sm|/=y6Zk%�#�7m]ӢK柣Ժ֡Ow.x,>y%s*ֱJsJ)>կ4h$h6]KMMy$HE'4|xl>/Cڄ6<Ʃy@qгy<W-~Bct'yWZiՔm]Jm_O|)'N걭VM"-GTrR�=S~xCJ[m-dؖ H˹9Ԑlq^Qg|%B%y!cfG?�P:]h+Vjjz[TF#XrIF3'Om	E-MA|v>n]ZBAm28isyݾzRY9{(a�$D
    <]c�鷺λBlt_0%Q?夫_O|=Z%
    }HI3g.	\#K'jGv6j辦iMYݽvٷo7TEߋ>|?eiXcE�`qע*Adc|yu5KO,cm8~
    |j]/V9vIVPހ|6z7ΓIYv]>GOΛIYz5*+K$F܎SE}i%U]~nn`rʲъV�8`Ae~^rs[Bf)ڿ]пggI$ZnmFMp
    {_9+j|]fMN]>D-ayt	a|DYNb4Tq$^lOpA*_	xďj
    =iq*q;pyͲ|V*",To{͵$M];59No*kNVԓMZ_vm;=S=S/VM~?솘k۫Lc̢7id1Kk^)x)o߈~(ҧ0DOhR3;,C1+g|"<Oi7_AjP&bg��{࿆|OZu6 ʼn3&vr8?785¤+C
    Rkv8rxfߡ_6Btf1OqW}j6\֕Jx_GMAҭdIwI[Km5FglIIr[_Qz7y/| ־$vc{&ۄ
     PJ& )lxl~[LmׇK8;|TXg8rOS\=SpnlRKbycr㍲9A\9ieu*EJQJuֆU8/իNn%yǓ-$wrnmf|^#+tq\_mco�􋛻fD6O&5~HEc8�UcZ(|=u~&e+KH
    ̈\9n.B_ospB?Aۣe*cD\BVo];BSt>[X`[^`ҙYn-BHFf!،jV֪T[Zӛ[pqXeSNqprPrYY%fe>6߈dž,eԵ=6mwb<!T-,Lēx?X٥񾊐]EL/g"XiA[aBf€_7qxPby'igݼ4)h`$�g揁~?k:,7
    EKN 8"$P8q%9sάNѩ;xvq0uRaRm--,i|qkm%TWw:1s)	oh1FF+
    .xm;Of7ZfXexF=2,K)ez`/c-N/4pڸ76
     8;qyG'S{si+쳪2ƣ3ScrZJ2Zg{5w򊔪J3]l4FkmԎN׎6kuxHB7	JO5o:]3*6@Ԃ8�fףM+L.2v Ҽ_ԿOk1kNكXD<VipO/ſ.&.0L%a0snymw[h	59,~UOO>_A_gFO#Kg80	\+n=Oץ}>YүV
    q|]yz}]:`'UG]S^&ycd<(ECF54WmЪ.di$ㅕmuo4YZeRG4u�Г]<w[L6$㎠P?l{WG_VXi?'}UUnOGu;&Pl@"!Uneax>ԭmdK׵`l)y4<CP[ SUobwΰq̻uxu9 /]H
    ϫ]>P+/'knfϣ(<ڿf}>3idYG #Nh|m a%\��VEw?Mʔ7ÍZs4|�>+|Vм7ᇂshm.Zjp	m|D|+|rr>]`UG֝$EɐJGCv,*bjj(r2T_T>+0jNjnZh2]_>0վ>']lwLሴ\~˨^S>J#x21 䑍
    E^7no0XNU+LH`)|<SC}~!Z_.6&B
    0°v8W^EZ}k֒jqɏ0 m6Xk	.|tWmѕ?xY?'2ڻYo(zkk>qO4ͨuQiknagddԮ 3|_c?t
    ~Q>*|suj9JgmXL4$AsÖsd5\6fGNaxmnUnkp%w^|T
    2NI<WGqqT+SM9]ᵾ/7WuT(i._ͭKSo?H4�-nb}nNe6%a޳~-N?O^"]64D2M;�vO֟cT.рst<0̠}3o_k:|q-?4̵[.[j‡RNju%}>c~WuŦ|[ȵ�zk=.h,RTL?󷖤e=�>%uO
    _xny)յ{-KʬJ	(\[9f
    3Dqca,(IHfE'/4jLlNI{Uɦͦ:(oyUAitwV$OK_jVf-
    7^mj/7b�$0$yT~(j|9KK}NK)m`y 9`DpM"kR]W×mɭwh.deV\MyN}7r^0"h./6(39ڠw~X%liaug+{|TwչYɶ?FYqYj{NYɸnm{E{n?;kO7!HИ-(X\.[~ڻ*ÿg[
    JX|෻CE\IԴӯ+˙ΥaYGtu\IFyEVXA7X漧_uumY(m�30I
    	rFϛUQ2vMs%v*⺹Q%KPoN
    6vWxVޘr_
    I<Qd(\۽yόK"t}v)qhb##?LuyO[}Qc)5+͍JmHPzVozڇk1=ml#;n28Cy<�y.֗=Ϗ/	W%sΟ\HPG)7?וAߴ+Bd;ŧ|=}V\I<)640ʌ1UHAE`Crv`kҾ6]jڵqiZ.#�ZSVTn!|$gt+$q(PGʹN0+ݧ3oytF_ܭeR{﷙Wc_ԯRL*<mR<H\q>=^%{W0y'^'~hǚ,ZTPʳZDKGbWz) `ZZOmSU޺A-N-QG;&WnzI$rFpeРRJwow׽&w6?hv5S_Z[/47Iigw%ˏz-VZ$g-gh?<?j۝CIu}/^,5~XGlI՗<o<oq
    Nּ5NڛJOxa}J3|ukK{{ҿkG݊[k+-*Tm6U{k-"ڻ#~:b]JGbluItz~jKӱ1_KrP	Ȗ^"P'!k@f-
    T`ڽ
    εXsm<zcI|0I}捔WjT־X
    -E(�(�(�(�B;㿅^=Y%e5ttV5ӭ(]WJ:ROWGx";xkĺχ.ֵ:Fav9BkrKƅHxs2R<T{I9oWσ*\g*Oi}[9Wp7M�vM/|&𿍬u;|5!-Gn勰gXq>VUY	4Hrt
    }�u&EX3ȪS.%g[ݻg'Ҿ7\\,JD+cqݛ֬��u/X~noCʱޠH_�c?qy秽I{TTe_D g(puml|,߳_Mq.G+�#�w�O�|j-G[(qCyA<}}*VцhL<':⓶J
    *⓷ܬyKF7Gxlb;uW|)#8p�UjE<t5B1s
    B
    +R3U(QZ7s�(����������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/images/logos/lblogo-40.jpg������������������������������������������������������0000644�0001750�0001750�00000021014�12143164146�020675� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������JFIF��H�H��rExif��MM�*�����������������������\�������d(��������������l�������������H������H����C�		
    
     $.' ",#(7),01444'9=82<.342�C			
    
    2!!22222222222222222222222222222222222222222222222222��(�K!������������	
    ����}�!1AQa"q2#BR$3br	
    %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz��������	
    ���w�!1AQaq"2B	#3Rbr
    $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz���?�(�
    K|I-Ӄ~u*�?G7gQ�_-fxʃ)"8ʰasTJqnɏg=`/9#0�v2B4fƬٓ'b!!nv3\3[~,5m_E;VRd{8y2:1!p<wx⸑a&�U+||"%$[;Ock_A=?-by.4YyѻƑ6
    4&ԴL(.XpOA�ؚR|�fEp),k*!*#�>Aq~T"];iѤyWEYEMT8RGVte6b`1G_F~uvS炗s֧>x)w2obKߴZ6 ' qSo_&-6c<wd}Ce%Q7hQi^CGݴ@v�4N\{r<O^s^__R|BWJ8p3ۡ\̨fXHfl�S#q^v&yH)EҕH<CwiK8iԩ�fvDuKq"ѵJtT`qГL}뒕Y*Y:�κ}Z;yף;׽j=o
    +GZkx$),HqqQU.oDp6I2?\IL9y"-$>3`G�px9栜 x/LDIo۠?3+|:Sfo\;p|iY+J9
    F	c xȮkWy$$(LN0o'9>WJNjˡQS<0<=r
    d	&߀?IMe-ϘyWh^s2zΖi9H)vfG[vƣ=ϵu�pz]60b?Z4[d
    7rGg8nҲda1Mv01Cґm\soq@#AMӃ'9w2eaoXSi:8X#>0+0ČzJTNWGV5m邃œrv?a>U?
    ߼dwo1`}t{}TMh,~`ZIq#; bAAY�vPhotoshop 3.0�8BIM������H�����H����8BIM
    ��������8BIM��������8BIM�����	���������8BIM
    �������8BIM'�����
    ��������8BIM�����H�/ff��lff�������/ff���������2����Z���������5����-��������8BIM�����p����������������8BIM����������@��@����8BIM���������8BIM�����m��������������������l�b�l�o�g�o���������������������������������������������������������������������8BIM������8BIM��������8BIM����������p���<��P��N�����JFIF��H�H���Adobe�d�����			
    
    
    
    ��<�p"���?����������	
    ���������	
    �3�!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw�5�!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw���?�TG~˼}�԰Yo1h?gM2HmJ	@w6RU԰ʬ7ͿqSYaDL�aZpqn�S;R54W�tI+)}qcƟs""PA)4;Cik/Xr{r"{E%¡c}GYcıUe7cQ�sC\w7^XǵEe�<RYxDo[]'u}Vj?v5\\zp[\`3(7}�{zEnjh>\?4�Pc&㤨a1Q7%@�pIc_�k-.s1Y{ܰ#~>c|3㜸bufI$eKKOQvl!#)Z]5;5^qYꆆv5nд1�ٲwHʩ}f�ּg#28`Ȏ+z5Lkf+:SWh!RZڿV=s,]nP0vo9۾vn)k4klu?=FzOw~z3
    P@f;׵~DDAQO"x#3W.MΫ-QvrIJ8M;nc�nCgRCE?F3TŞ?ws�Jf
    %;Gls[�H;hŭᾭ!-%�c,
    B>^.&�VI_kuW'�_dDvϥTfV.Ev?'$:^/q"ϣfUnm~k`ewӎ!9ӣ}ofYK;c\Eu8MI7QDLJ}D	_L)zet2)n6K@}Θ!qFEe:׾̆[[V�QO'^`m|Qٹ�?λ,.q`sGc6=Bgt:Y3WV x`xore+ӭtC+V5V,07G%[�[UfnvRv@sᵻhyou!x4>_�XcC]^e{Z+kI')'v:}�KcVde&F׿{(l+),c^ pG
    Sz[A{oʮp4??:!K,p!oݻcO,`bh$EtVMtc>vYcƴ$�8g�tLѺW I5w�Y�ޫk.l<{cppl~ճ'5Xn)ccdz|:6(g!%ǧ,Љr_f}�g\znNB+۱kkh{v{ߗҙslqYdmkc~/
    U[stg5ٷ]Oq2SQ<fJ~Yh>@Lf+l`,􍵷W_Y}Om[<4_A~W	&CI{=*b3!."jhVmڛ^($	7pgb8՟ҳ/<͹W/sv{e~JEʿyl\ih/a/`e7llm{+oE:Ňͩ649U&K,sڭfX
    7<IN�l":]Xmf<~}o?B�`tq66[dZc9u˄EdCCs'|7@q
    �ciqЉNsPo_3#: 0D]ssX9$cΰ;
    !!8|qw<|hHn;an?cP]0u	opsg]IE?f
    wx[,=<U|i:^m`6Z;_䢳Tڃ}kZ;hùGo#$}U/waӰ-:˜=ӱ}P$zL=M�$k>"^#Aq8n[:g*6˱n
    춧T�4G/>C|~~�V|==_Gys42qW�Ͽ0wvO?h�=/Ff{MXns^>n�mklnؘz~Fgj	}�59:Kq-NR׷{	p~#c[c?TևB#�gn5ODzRr(F<^x_N'Eq-~c-2)X>cֻYB5�g_8BIM!�����}�������A�d�o�b�e� �P�h�o�t�o�s�h�o�p� �E�l�e�m�e�n�t�s����A�d�o�b�e� �P�h�o�t�o�s�h�o�p� �E�l�e�m�e�n�t�s� �1�.�0�.�1����8BIM���������C�		
    
    
    
    	
    �C��(�K"������������	
    ����}�!1AQa"q2#BR$3br	
    %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz��������	
    ���w�!1AQaq"2B	#3Rbr
    $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz���?�nW}bX>'KK6@Mhs唪Y^ ;W׶][RiYZR2$?i>Ѱ$@ȓm??[(\˺Q_/uG9YßslJ-e]Vߴ$چk$t\ssi=olneH:j.ݑ!�xW?ۢCVgk-+R,֡ddw9'bd+m Qċ	-e宽kvҧJ:禝׾j{Kx<Kмi`5]28
    9ye,�q
    x%c<CmW_״1^iZEYEp
    (VkfX`?O|kIKx\g麅rIxgr8
    @U83n*8ZRzn./ic8qhR&DӲiݥ}ϊG+.c:~>jquLRUc%žmYGƒg/}+"}G4sM7joxdړRhpBTB؀p~}4x޻ӥ<;T-U.10:]SۢW2>|Z7U[cgqrD3$PH9�ξ]%t}OJ5;J򟉾6sþҵPɉ)f%fhV@$v-wg
    &+OqXgmo0C#]!cpҮBT;]?|O<%Im-İ3+k:p> qz=L̫"Yq@pY	w	VO6ۚ+^Tݛ#谳>Uy'kU-&Ѷu/Ï>2E[C_0`,IJ+;+i4awG9[4e*2H1߹BFXYhv$W5ytO4@D,E(q7θ,4z%֑;{V$6Z/lc{HV<
    ¯M>n".zMFu=])Ԓ|=t&|{׺+xWz>#k%kl]tlf'o1e�ڛ-&i&kMW{#�U;);<·dmp+/E%ky/lR	"XXnH@*t-~i�b=f{u{jj
    * .QK2F-@yX)t1巒?=j)J7m-g|QP6i;)_v}W
    ~'wcRӯ<E}qO}eu:G7BM&YWl�+1AK)OsܸZMUeHNf
    C :h^|5M6g#KƬx=i?<3ۈuHu(Jbڀ[per$$V7UV%)C[ꚾ7ߢn~K%Ub4Tzlo~
    ZΥ}s%ޱ
    ]+*H 2TpkQ-VHodX[Ys�uϧh6P\H%Q�	xGWVK݂Vw׿Wg
    &ZK݂V}gx_<a$jzw=yrN�8�p{
    ӿgiZ=K}Dlf(v$cBPqhX<:qo�.C^]~mTdty$Ț9QQG9�RMO_uD>f59H.ݻ$Q
    ]0((IYm,EVs<A7h
    ɵ|‹m#$+b3O#~#iG`ZP_[(Čh)k0Wi*MlO2zrgRw[{׷'8>|j,H|Ё6y\/pS~O;OW񶣩^k=&[X溻mB#/EϘ9<�Q^' Zm�]|eȨJue)z|}7h~<Mqj<`ґU@HJ�NkcX((R8SV_shaч/��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/images/logos/lblogo-150.jpg�����������������������������������������������������0000644�0001750�0001750�00000040335�12143164146�020766� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������JFIF��H�H��Exif��MM�*�����������������������\�������d(��������������l������a�������H������H����C�		
    
     $.' ",#(7),01444'9=82<.342�C			
    
    2!!22222222222222222222222222222222222222222222222222��P�!������������	
    ����}�!1AQa"q2#BR$3br	
    %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz��������	
    ���w�!1AQaq"2B	#3Rbr
    $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz���?�(�
    (�
    (XG4ا\[^9~XӨ9EQ9NQ}?(B�(�(�(�(,BF\�AQvڞl`RyZT)rIb%w}v
    �צfδUc*ƬȫHeBg𰢬1R^lWlBIr0sNֵy4momQz\ҭ%v_;~jkk@@b^Nis0Vmp[{`AXj^Nn-޺nk쨸my{ukk-ޫ跷W2ZM$X0;}uR*孮-41GBc13sNukBVmikZk(ң8'I릿sisn/Eg_VgD?f�~uҫ|֒w9zs /.XC2aY"/{3BܫsrZ2]Օw'	ѣ̣+)]mY!^~ED/X.>V?#^T9i=Qr湤:-DO2!	,NOr*1y1۶*J-+(חvY`ܞ9W)o#?kRnosLHӓs{QȒ`G״jM]s:~,UiIf85st\J[G1yaP?y'$VSeZEjv͢=%Ԃ81rHT5qօ}7#;Vr
    Rs_Krq/r[[ọyu3KC}%ռpXxXt?D,f2jbTi<oF1WjzIz'{鷻5I�"Zf98#=@e:*xNK>°�q\d.}ˏҪU96su"4a6k4jG$n#G\fmZjVuy<a}�_%Uo_kq׍2]J~gX]y|��QS�ghUu=ıN-$SlE=6VZL'_/i55sFbGhO͘`u&)i>9O$xav{F~Jm5�Y^Mҳw`;>Ev
    S\`jGTrii%B7#j\z@
    哥u_=N�yt!vIhs޼⤕{@3܄,82z~tӣoge!j"c$LaXe]\/^;@5Х!/ss:Q͇MI[M-iu}FcMn.ly4*̪$dRpZo*	aV \!7*xt8�?1Խ7քom[-V,*ˏ`_Jf6}o1". hçEIptLS*rn>9-m/'PȤY'QUe	;idpРm9pkXm*ņ@\�Gxle9?wr@}osk+ةm�kkpZ8dP7u=k*k|ǧ!RmLBے2 N]jlN3O8cky�u~(㴯ym[rGVeχ2ILvm9AAkC촵#N/<’B1xݜrsSÍb@?*H�J�'rѽ;[.Zv.R׽QdHVw,ٌs8$g5g&kkٯ,;DZ#x��?Lpn
    -KF~~^DzQ9<PfB`ź8Hxu)_FK,{qN
    \o#m�&.#r.%/	oh`'F--턌YR.
    H�0RWwKLk^�>mԯaqoq
    f� gdAPsc!)9pv*1r3:;CU	5m2]\cқfF*H#z˭ٷY.n|Z#kՏ`�{wӼ5u%ڣa<V5wCm<=}ZS%\݃GQ:2RMlz4줚ҊPZ(�VKɬDBG2G0YV,3Z2QߟdHFQb%︃i
    bOF;XŸ0Np8\Y^Jݿt}۝ҍ(n�H6d"B`qZ[\ıo,6+0@dwsR5+[e[
    Rw߮
    nc?Dr|{A' 
    .#yV1%gitr VITV}<EHcIZiϿqR$@Y;͜*9	^wkWDYwmn`?gּ'|Dӓ()s#9Vv"%]qsY]؄oLw<'!_9>tbnq]S鱽84F3l`Ÿ?)#=1EZ?�nA8_p+[ݤRwgM	}rУ R*F|2
    6Ru 3lȬWTޫT:G܄xy2ynC)
    rG\О36]�|gch�ԥgCKH%B4̆\mݒy\piFhenp1n�?[EK_[�ZZ>$ŭOS^.$
    M8QXVBg[,Q-Wyh[cMTH.ѻ�ty88b/cO-ƲJ<~I#ڰ(ۿ1W,j_vwdѨ1*� G?5\hK<hn6URnR2@Cs,[(ԤqYtX7Bv"Z[oZS�%y۞�]J<PΩÖ*Yvb6eR)І4V�8ypj<X[N^AJ
    +JǨvzb\QCxn''0'\<*]vtS(Y-WA;#ģH 䃎<U	D#BoRmǣYGŮi,d$/56q0Fu8S%&DI ܈B899ykzn<Z*)s'kcΛhP(ё9a6*6跱`0<ҔkZ*yZa
    5Ä	F00Qu	uE<)0Hɯ>~O8:M$]88m.F=q"}jMxc
    ۩tГQ	{T ֘"G'?V}a2$H ƻ%]$jo])a| ~yQ|"~	=	%~}LmXW!p+!c'$Ѧ']Kt.(αPE�PE�G,1OIcWS0Ȭ;j^=61>\ЫϹ\<jkQEX}RډyŔtQYuOԬm#9x^{3^EuL g֑[^=^za}8S3VզmhE
    'V>g:)w/,`vb:?�vPhotoshop 3.0�8BIM������H�����H����8BIM
    ��������8BIM��������8BIM�����	���������8BIM
    �������8BIM'�����
    ��������8BIM�����H�/ff��lff�������/ff���������2����Z���������5����-��������8BIM�����p����������������8BIM����������@��@����8BIM���������8BIM�����m��������������������l�b�l�o�g�o���������������������������������������������������������������������8BIM������8BIM��������8BIM����������p���<��P��N�����JFIF��H�H���Adobe�d�����			
    
    
    
    ��<�p"���?����������	
    ���������	
    �3�!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw�5�!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw���?�TG~˼}�԰Yo1h?gM2HmJ	@w6RU԰ʬ7ͿqSYaDL�aZpqn�S;R54W�tI+)}qcƟs""PA)4;Cik/Xr{r"{E%¡c}GYcıUe7cQ�sC\w7^XǵEe�<RYxDo[]'u}Vj?v5\\zp[\`3(7}�{zEnjh>\?4�Pc&㤨a1Q7%@�pIc_�k-.s1Y{ܰ#~>c|3㜸bufI$eKKOQvl!#)Z]5;5^qYꆆv5nд1�ٲwHʩ}f�ּg#28`Ȏ+z5Lkf+:SWh!RZڿV=s,]nP0vo9۾vn)k4klu?=FzOw~z3
    P@f;׵~DDAQO"x#3W.MΫ-QvrIJ8M;nc�nCgRCE?F3TŞ?ws�Jf
    %;Gls[�H;hŭᾭ!-%�c,
    B>^.&�VI_kuW'�_dDvϥTfV.Ev?'$:^/q"ϣfUnm~k`ewӎ!9ӣ}ofYK;c\Eu8MI7QDLJ}D	_L)zet2)n6K@}Θ!qFEe:׾̆[[V�QO'^`m|Qٹ�?λ,.q`sGc6=Bgt:Y3WV x`xore+ӭtC+V5V,07G%[�[UfnvRv@sᵻhyou!x4>_�XcC]^e{Z+kI')'v:}�KcVde&F׿{(l+),c^ pG
    Sz[A{oʮp4??:!K,p!oݻcO,`bh$EtVMtc>vYcƴ$�8g�tLѺW I5w�Y�ޫk.l<{cppl~ճ'5Xn)ccdz|:6(g!%ǧ,Љr_f}�g\znNB+۱kkh{v{ߗҙslqYdmkc~/
    U[stg5ٷ]Oq2SQ<fJ~Yh>@Lf+l`,􍵷W_Y}Om[<4_A~W	&CI{=*b3!."jhVmڛ^($	7pgb8՟ҳ/<͹W/sv{e~JEʿyl\ih/a/`e7llm{+oE:Ňͩ649U&K,sڭfX
    7<IN�l":]Xmf<~}o?B�`tq66[dZc9u˄EdCCs'|7@q
    �ciqЉNsPo_3#: 0D]ssX9$cΰ;
    !!8|qw<|hHn;an?cP]0u	opsg]IE?f
    wx[,=<U|i:^m`6Z;_䢳Tڃ}kZ;hùGo#$}U/waӰ-:˜=ӱ}P$zL=M�$k>"^#Aq8n[:g*6˱n
    춧T�4G/>C|~~�V|==_Gys42qW�Ͽ0wvO?h�=/Ff{MXns^>n�mklnؘz~Fgj	}�59:Kq-NR׷{	p~#c[c?TևB#�gn5ODzRr(F<^x_N'Eq-~c-2)X>cֻYB5�g_8BIM!�����}�������A�d�o�b�e� �P�h�o�t�o�s�h�o�p� �E�l�e�m�e�n�t�s����A�d�o�b�e� �P�h�o�t�o�s�h�o�p� �E�l�e�m�e�n�t�s� �1�.�0�.�1����8BIM���������C�		
    
    
    
    	
    �C��P�"������������	
    ����}�!1AQa"q2#BR$3br	
    %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz��������	
    ���w�!1AQaq"2B	#3Rbr
    $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz���?�(�(�(�(�qHX
    �o?nM֠)ˣlGew0�9lg#Jrk?m٢\I.86w|a]�ls|p͏8
    "VIT�2_/O0ܪ%8՟7OS
    	UsSoI)�n^RƼ_dž8Sg_^,4H=cvDhhz➅.ص+go@ʷf@C)whb֔ԽhiUW%/GqQEnlQE�xƟcGl#ӛI-4,ӨݤO-pʷ??F^
    ^<ik߰hsR+yh;U~Zm~WskmosL#}Y�dr+ړ7;MW^m;ZnpS\縅?ӆ.ז^<_dkFOD}*RxY{.kќgiJ*vݾX^՝?ſ_?e&52ƺ嶗ay]3J(RF,vɻz?oŚb
    YKMfn[Pb;{thPs2ʭO㞁w<{E,|G,t]?NKSB7LdC}xߌuA麍ܐ	mvGg;6Ll8}__}_MR)ak[Og�?}Vv{rrW=?ogx^~DzteWi`0zqw_YxW~uKcccI|Pi`ʮyW?!<axA摣qܕ2F܊˴�A#?>uIu/-mgQ[=aH%.m4[ ۆwVu}	J0F~ޭ9:JqY5(5NnI5iN=VԴ>;Lj%ҵ{Lԭ"
    ?&A5.oXt3G°H`+'#�Ŀ:őNP<3q6~BPeU4	mv$`rK;;/BG�-s2]_  s]
    UOXf\]QU8^I5ʒOfܗ3m'jY$1DŽP'%%6OZ/$'>Tv+?ɳu�/whV5r֢M9J৞%i~#𧊚]IWkxVvfh``L0?ĺ.#l/ۋ{O-$yݳ~3qty-S�wA/˭rfMY"a`RO;sBl5:r:kܭ)$ޮ֋ջ'QUKG;^'ʯ&e{Y$ܕ?	~ZF).R(I$Mf.6I<�74OSмVkЈ.KDOq<+wseҮkjؒTQQ[~΃avM	,/mūXI4^2}TӕNO;\hbtTNn7wgu'+⿉o5HtBH-F2<ѫ`D#}Gĭ3\v`I�cfdO	x<Xo`m^)kZ(T}i!?WE\LBS%5R4NIP2JJ;E/sV\1x32džg{(Z/L"VK2v�iSֳbyd4'ofs^	4zo~:ީ`#k 4JrF<*=8jeAM}j0թ,
    n3譶V})V尚d3Jr*9c-jWk]m)U8$W<9,	^Y&]_a}/,iQ^ǕƑᓭxLGff{H,@B&I8>tKzt~/l[{I5n+0($8滯	?<6gE&rc<Ḏf#O8x=+|oWɹ|B&e\Gэd.6yu<S`z-S{+vݭua
    ^-]5{=5faziυ|9/B7L.
    K30ANHDpZxM1+	i%ݪDJ8
    WqQ[4ލZiwdM.Ym.#9}Y7ĤHl/G׼K-n㾾i//	f13ħl{qƄUfPKqCI^Ryt⤤dgvI۵F᳥hRJm!"_$>Yf7pvlx^?�^ϤxAUQ[+pd:` ~88帗_ok;n7qq2B7G,]i�8c]o@|S]KFVZS<vQG)P`]Ăۀ69淅IڮvM|VN]N˙_^d_G?R,|pEox6w:^mqqkmj;TA$``�)6ï	x)|?SH%V-=1$.U"	qoNq7/Oj4#qeix$K|jS7mcw.iK|-u+ϵVpFUTFr6j̝ڻ[%DO*O7ՓK;ڽL|>sA4kk"Fnĉ),t+b|p/)_Zg_k:+*h庘[Cv~o΀뼎kͼM^OjyvߧiF)'0;	q|^�<Mjv9-/"Gcu.pʃhVMᐸ	\mzsFz6iYi[n7l"Jsp\6{gL/Kþ
    ߍlkV,J_6畸Ldryt"U
    I䥤H-\ʫ$R�zMxu(P&ȡH̅AC3ZĽ>Dk6zmm!!A 2�r6sTn]w611TlZB~:ot{%^.J,XHL{G�gڽ7WMnI^p8uW|$c=[=h{?x/ڮ3@b0bI1=OA!~-Xer?:ԫ9P[9>+q
    {ۻon<B^n�<B-B{+G-#AuZ<Y/#QˑJ/i֕9&բY&daSw.{kK8|WQs2Vӭ/u0fؐħ4ǃ!ɏ
    ~"޴|Y}>D,l7,ڑP
    rǗ_AYeW-f~+pqa%'{٥hg_NKQcQ#fsm>^׆_KG�s/i!%̌im�RO'iz ?h [mu'!ʽ=Oƞ[A`+Y6Mɯ'XLBM~_m<j I3W5Ss#sZ$^	Lsl	ڌk/3xS_K94fPF#dKXԸbVRGpyVo~_+0^+:1Z�3k~?x:�6
    kgԯ[PĬVG,a12N,9Ԛ:OlJfx@%ħrHD{ƅŸ.u]3ZHcU4iEo<lvw}^uY)'o϶ٞ%p})k7wѫM:Z-zlLm�BQnRG͘GtڃxoԼS-LjE}\^^XrW0#:ȱ
    pz=cXNhg>hdqJZf]AV͓m?kK+]IWQLqwV6bu2	f%"CcJۂ(a ک*WW+'O4<$bԵ{J-ޫUɣ3{_<#"sg}<ZA
    q DQD]r5	xzemFmY#0Q/au2.d?"VXog- � vş3j>"[{1?d
    ˬ0S"|yMy~X|G<d}+i쿙'btѶ.gk[-{H]KMa;-tft9md*LvM9+0
    0Y&_k(LM)Oz,♡ȐmUDxXyH6WC6Ӵ)K`^{"#|&|3pvl-t0ռ:hj:uuc[{Yf
    !YT*(߉@$[UyYJek\;s<8_^2p
    OwddxZ%i>_Ʊj7֫s*VHaӮƩ,Y'ВG_xOӭUͼ_;S	##LުTMQW&|>lm*k&E@nbt!T<kͶ-m.?!UtB<TL嫷>?-|jm|?5^ꤝWoO~mKNQŃ1v?E#379(�ܕ^|i%0#R�i6گRHӬf^yɏ;C
    +a:My4ܮx|9ʚkWr8ُy^irmB̳g"2ѓJm;9�{+|<�W+dKHP2)ns+gEz<9mC춎 [X#P¹*5|A~)LӬ|;oqՑf.�ƎIe+**0+꭮[.(NN9e}Uk5!\q-˜gQk,r̋8YgJS?.8;#v<_ڢL~>sVK[[l=efhZvE6VqC k& ׹=ZXgNWV8Jg-e-"~Gu9uoXM7.)<cԚ+SÖhz=8
    TK
    u$0tN)ݤ 񯀴߈vjIrcrou-ʪ^6Vïz<Q+h:Ɨ?i7"MZKN4,di+;#!Ez/)nҌѻk{\VQKe}>пbNk;*4+b`g2U`Rdfq,JX`WMٿEegioa4Dn5N.&Vh++T-KtFcioߦ-W*#VunkK?�h1yr9v^֘.n$w<IYYhqiao-P9\HlHwp_%Xn<sEu*2I謖�ܻ#fQ֍Y)6kWv�ݜ1>%`OeM:}p	=xK7PvF^֘/.f]bIiG]��`6
    m*QZZ$k=լ5qعҕ/m4{R[{Ϗm"*ͮZ֟4+DA;A#fu[]moIpѷf&HYaqG>{vܬp+cOV
    F
    yoc
    ]z11DN88|]nݨ(ԏ>;!OLLFk6̟wײQ_][-Q.X+2fjڕ. IV%ϖU.5<a2I7㔱N*>F]*�vqyɼBnv1Mfǀ@a9$e^Ѝ*Zie$-)}ߦ%K/0:se$-'~ENLyv
    ̀ni'@EszslۣdlD"}*]DVڒ)Ai/mlӾFEr%K,B[=A9LWC~2[뛛ZSۋiƕ$A[(pING!?J¤TU9?ҏ;Tsj%	�ۥ/CO#
    "s7n0CyѴL¢>/C
    >%<du'UN}5'kDd@Ts=FM{?>�Gi6VA@HSYG,Nn1{O_$9KVK�g̿�<q<	�Ykos0$\y~|'ue#y1?vvB[qW z8<^{gl$Sgḽmlb_lQ]Wv{���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/images/logos/qosLogo.png��������������������������������������������������������0000644�0001750�0001750�00000006452�12143164146�020636� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR������@������sRGB����gAMA��a��� cHRM��z&���������u0��`��:��pQ<��IDATx^SGU-RlJJ65WEyCDAT7AKS0sLHSS=g|s=zOh
    J@BB%Fk uk-h
    MiBׯ_onn|rqgf&''&&b1q;g8_)CIollp-5MZh͛W^%X\^~`8>>6Q-͘p߿YZЅ奵U6MgHPmӸ8?7	2:(^=]\\\]]hH"謱KKK	''wk&EI@1n4MfH\w(rcce勅x|*+h4;>5Ɉ&cM
    \#Z5%//-bjI[(_l=)5eL.gffe b2ƦEW`H	 8$u͡LIx52xɡ|Gd<>Uenh.g"p@=F.G$2/"aF"l3cƲ@B	x1:2D
    CUawESlj"FwA	G8{]>ڒ=Ussġ s*==O.jV]P<1*.�&/ڔr7˯ڨӎfVU,%2Fީz4;(1t%SS?G
    ejjf}048ǙC
    C'I~{Z+Ad&y?t7-fh||*xNVP1>6ʬ&z<t;uSwP
    3|to-�RX>xyv%#�շ݁r{4$"q|L煯T;(m,7<=o,:WwY*2{c΂+ZbW(qr1Kc2P<Snpx_o9r!}/<R̳WW:\&ɽ%
    ٙ4$ÐPRîLM_oCp)c/՟0J|d(4KEΣuCIH833=5)[AAP�Hc;8ԟ455ʴBKyU B$
    Ot;*(Xq;a8@5UTdLP君N׃Ξ/B%$zpC#gx ,K1=t%"Oת+Rp!{xh3
    JAJO\xF	,}rsA[__[kˣӟ
    JB6$	چ+E>H*O`9C(q	pKwnJA R!^`2}RJ+8byc^7x9Ojn
    !HlH|qR}|>-H),P65}G08p4QE*dC DEp)H6jB$9@P:@PvWP sft
    4~mA|EBg%&Ur?(4`,TyZLaƘRR=2ySz"#U} F		H'v7ūc7)wsQNwb*c)	OeN##&tS0'Np{X Zq�t?BBLqkUW''vqnqJߘEMkjRšڄnOf:
    kn\vFGg)yRyl'T$u)s7:!ÐMwH2
    9D1| !!Rݵy{RsOuᡂ5#Kvsӏe2PU{۷Se	90R4k)C Rd.Oy̿Z?C8H<S65e(U!(YdM_P_Wr=]b쑣$suubQr	ʝ5:SimsJ݌X*/_kv"_>޸؏5epuչPY7H.{>+ta!ΏAgYV3!CS5H
    z/LLCTFۆ/ze1K,|}š&4Hl`2S_aZZzCժj`,ΚcGKK*,'Hwh棇]j\檁]{	.
    CClIP_[sByFU;h#0\pƍ?${	QQ]ȭd5ɋtwۮW_;_XH"h/46Z)*8WE]|TYMSqWVVXsjUYiIQaS%|$Ȓi(J._mnnjmmq_[`e
    0N�2KWcYgO4=3LMXgXv'_1+#lb(L5m<s2NPlQ_~5%\wtq"O?ɜv4 ܜl!G4_r;LO3-GL"m۹S's.cGIIs2cD|h('<}vg/hw̷֖}N!1֖�&o`g,'+?i8~n`8v3.*ƻ<'&JoA"DؒCD%QCt1+MY<dUV\T|lټ~8s|p
    aLMs53Hf%ŷr\
    C:}D! y䇳nʏWQV*~YeA%RٙSH\)(onLdI.pJr}W$幊kz' xRLV}v6;"i-Vg8>r6O#xyy	Aڴ!
    JCVH6k7$a!EWPPugSyiBiSO8cDg8_Qv1@A<U(pZC
    !{v4){Pzn'4x{����IENDB`����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/images/logos/build-by-maven-white.png�������������������������������������������0000644�0001750�0001750�00000004324�12143164146�023140� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR���Z������#/���	pHYs��.#��.#x?v���tIME5Ba��sIDATXY}LS[{_b6(_i _ڠA+
    D+*5وp
    dQyFC$XkX\*R>
    VDOj
    G>|a?Ι3̙sJ!`&^`/&)--{h�W^1;2j0~!pwtt>|СC"hݳu|~`` �<x`hh,''r6T*
    HNNgϞ@[[[QQj}%Vz;w4
    `ӷmv5P^^^kk+�0sIe/\m鲲222SSS�z{{>|8::ZRR%ɖ-[WXA,hܚ�JY֯^
    R߰aåKFg\]]RD"!իW%&&VWWڵݻ[n%$$�cǔJׅ~zr<66uuu�slll.B!fx<EQnnn*؁�Di***fS5>>>]mX***֭[�			))))Fo�D0L\\\\\ٳg
    ERRRaa.]G,TVVV=عsg{{}Ε+WH2jl6fQe9! }}}aaa3t.zqUUU``{ω/mccc|>Ņ(,Z(Lfo8>s,A֖޽{-˗hi:44}S?L!55uƍ$F02á	3{l/n&'S˲1CBCC7Z
    aFquwwJD1e{6wO+l.@
    !͛hJc6KU*J*..BVg\.%R$z||\VT覦'Nxzz:99)ʊyd23&&wRh4Vupp ;UvT6Noooݍc^^^&	!t9wtt$9rOimmi�hdWeddd~ਫ#v˱O:E�ؾ}dpqĽ~޾^z}2VY|9U__9(({^RR~:v5**
    CVSS#�UPP@z߭[>}:22DN8rss?m4ׇoB^Ȍ
    1M+v-8nŃj*++C]x?n޼8j}'8p�:s6`4?\\}}=f/^Ln5BBB0SҞ!{BOQ
    fHtL&|]$
    ϟ?OQTcc#YVIx28Ÿ!sDzlcc#WZEǏcӓ`D+W�oad(
    ܃)_+lQ+fz}^^^OO�*V�ݝ�GHPH.3s5/^</Vyp:#S02�;zfT7�_yuFt444`#
    "--3QQQ7nܘ:@ss3`XG=z4w8tklldYv烃_i&FQ}A`b@�(並qWUUe4)&$aM&͛7###-|#斖GDDOthZ̈D"Y1Zf
    fzzzzGpAF�
    Sn0�)XlH$b/ZޱcشiSeebٿE"(Bhɒ%
    pt:|i ftbX,l,tvv–P0[�`=?"~2w�CC???@ qY%e8))	,ˎP%ˏ?C BGCCk׮1t{b	GFFp4Bux"c%,}`и~cC{{`s700˜\.30�E;-@�w����IENDB`������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/recipes/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�12203357067�015543� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/recipes/index.html��������������������������������������������������������������0000644�0001750�0001750�00000003017�12143164240�017531� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Logback Recipes</title>
        <link rel="stylesheet" type="text/css" href="../css/common.css" />
        <link rel="stylesheet" type="text/css" href="../css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="../css/_print.css" media="print" />
    
      </head>
      <body>
        <script type="text/javascript">prefix='../';</script>
        <script src="../templates/header.js" type="text/javascript"></script>
        <div id="left">
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="../templates/left.js" type="text/javascript"></script>
        </div>
        <div id="content">
          
          <h2>Real-world inspired logback recipes</h2>
          
          <div>
            <p>Here is a list of logback-related recipes inspired by
            real-world use cases:</p>
    
            <ul>
              <li><p><a href="emailPerTransaction.html">Triggering an
            email containing the isolated logs of selected
            transactions</a></p></li> </ul>
    
    
            <ul>
              <li><p><a href="captureHttp.html">Capture incoming HTTP
              requests and outgoing responses</a></p></li>
            </ul> 
          </div>
    
          <script src="../templates/footer.js" type="text/javascript"></script>	
        </div>
      </body>
    </html>
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/recipes/captureHttp.html��������������������������������������������������������0000644�0001750�0001750�00000025154�12143164240�020733� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Capturing HTTP communications</title>
        <link rel="stylesheet" type="text/css" href="../css/common.css" />
        <link rel="stylesheet" type="text/css" href="../css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="../css/_print.css" media="print" />
        <link rel="stylesheet" type="text/css" href="../css/prettify.css" media="screen" />
    
      </head>
      <body onload="prettyPrint()">
        <script type="text/javascript">prefix='../';</script>
        <script type="text/javascript" src="../js/prettify.js"></script>
        <script src="../templates/header.js" type="text/javascript"></script>
        <div id="left">
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="../templates/left.js" type="text/javascript"></script>
        </div>
        <div id="content">
          
          <h2>Capturing incoming HTTP requests and outgoing responses</h2>
    
          <p>Logback ships with a module called logback-access which
          integrates with Servlet containers such as Jetty or Tomcat to
          provide rich and powerful HTTP-access log functionality.
          </p>
    
          <p>When diagnosing issues in a web-application, it is very
          helpful to be able to capture incoming HTTP requests and the
          outgoing response. This is particularly true for a
          web-applications offering web-services using <a
          href="http://en.wikipedia.org/wiki/SOAP">SOAP</a>. Having access
          to the "raw" SOAP message makes it much easier to diagnose
          errors caused by misspelled namespaces or missing fields.
          </p>
    
          <p>Certain Web-Service stacks can be easily configured to log
          SOAP traffic. For instance, with JBoss' Web-services stack, you
          can set the level of the
          <code>org.jboss.ws.core.MessageTrace</code> logger to
          <code>TRACE</code> in order to enable SOAP message tracing as <a
          href="http://community.jboss.org/wiki/JBossWS-Log4j">documented
          in the Jboss wiki</a>.
          </p>
    
          <p>If you are using a different Web-Services stack, e.g. Metro,
          it might not be very convenient to enable SOAP message
          tracing. In that case, and assuming your application is deployed
          on Tomcat, you might want to enable <a
          href="http://tomcat.apache.org/tomcat-7.0-doc/config/filter.html#Request_Dumper_Filter">RequestDumperFilter</a>.
          Unfortunately, not only is <code>RequestDumperFilter</code>
          rather hard to install, it does not dump the payload of the
          incoming request nor the outgoing response.
          </p>
    
          <p>With the help of <a href="../access.html#teeFilter">
          logback-access its TeeFilter</a> you can capture the full input
          and output for each request as explained below.
      
          </p>
    
          <h3><a name="capturing" href="#capturing">Capturing</a></h3>
    
          <p>The <code>TeeFilter</code>, as any other servlet filter,
          needs to be declared in your web-application's <em>web.xml</em>
          file. Here is the declaration to add to your web-application's
          <em>web.xml</em> file.
          </p>
    
        <pre class="prettyprint source">&lt;filter&gt;
      &lt;filter-name&gt;TeeFilter&lt;/filter-name&gt;
      &lt;filter-class&gt;ch.qos.logback.access.servlet.TeeFilter&lt;/filter-class&gt;
    &lt;/filter&gt;
    
    &lt;filter-mapping&gt;
      &lt;filter-name&gt;TeeFilter&lt;/filter-name&gt;
      &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
    &lt;/filter-mapping&gt;</pre>
    
          <p>The <code>TeeFilter</code> requires the logback-access module
          to be installed in your web-server. The installation of
          logback-access is explained <a
          href="../access.html">elsewhere</a>. Once you have installed
          logback-access into your Servlet container, e.g. Tomcat or
          Jetty, you can configure logback-access according to your wishes
          with the help of a configuration file named
          <em>logback-access.xml</em>.
          </p>
          
          <p>Here is a sample <em>logback-access.xml</em> configuration
          file which will output the full contents of the request and
          response on the console.
          </p>
    
      <pre class="prettyprint source">&lt;configuration&gt;
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"&gt;
        &lt;encoder&gt;      
          &lt;pattern&gt;<b>%fullRequest</b>%n%n<b>%fullResponse</b>&lt;/pattern&gt;
        &lt;/encoder&gt;
      &lt;/appender&gt;
    	
      &lt;appender-ref ref="STDOUT" /&gt;
    &lt;/configuration&gt;</pre>
          
         <p>For the list of conversion words supported by logback-access'
         <code>PatternLayout</code> please refer to <a
         href="manual/layouts.html#AccessPatternLayout">its documentation</a>.
         </p>
    
         <p>Here is the output generated when accessing the <a
         href="../demo.html">logback-demo</a> application configured as shown
         above, yields:</p>
    
         <p class="source"><b>GET /logback-demo/index.jsp HTTP/1.1</b>
    Host: localhost:8080
    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8) Gecko/20070312 Firefox/1.5.0
    Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8
    Accept-Language: en-us,en;q=0.5
    Accept-Encoding: gzip,deflate
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
    Keep-Alive: 300
    Connection: keep-alive
    Referer: http://localhost:8080/logback-demo/login.jsp
    Cookie: JSESSIONID=15c7tqi9ehlwk;  OID324nkzcmr=null; OID32862zgoa=null; 
    
    
    
    <b>HTTP/1.1 200 OK</b>
    Content-Type: text/html; charset=iso-8859-1
    Expires: Thu, 01 Jan 1970 00:00:00 GMT
    Set-Cookie: JSESSIONID=bgebt99ce9om;path=/logback-demo
    
    
    &lt;html&gt;
    &lt;head&gt;
            &lt;LINK REL=StyleSheet HREF="css/pk.css" /&gt;
    &lt;/head&gt;
    &lt;body&gt;
    
    &lt;h2&gt;Logback demo center&lt;/h2&gt;
    
    [snip, so that text is reasonably sized]</p>
    
    <p>&nbsp;</p>
    
          <h3><a name="disabling" href="#disabling">Disabling
          <code>TeeFilter</code> in the production environment</a></h3>
    
          <p>Due to its intrusive nature, <code>TeeFilter</code> can slow
          down performance. Moreover, although we have fixed all currently
          known bugs, <code>TeeFilter</code> has broken otherwise
          correctly behaving applications in the past. Thus, while
          extremely useful during problem hunting, we do not recommend
          having <code>TeeFilter</code> active in production systems. In
          order to avoid shipping different code for test and production
          environments, <code>TeeFilter</code> supports includes and
          excludes parameters. <code>TeeFilter</code> will be active if
          the current host is listed in the includes list and absent in
          the excludes list. By special convention, an empty
          <em>includes</em> list is interpreted as to contain all possible
          host names in the universe.
          </p>
          
          <p>Assume we wish to capture HTTP traffic on all hosts except on
          orion and gemini, the hostnames of the the production systems,
          we would write:</p>
    
            <pre class="prettyprint source">&lt;filter>
      &lt;filter-name>TeeFilter&lt;/filter-name>
      &lt;filter-class>ch.qos.logback.access.servlet.TeeFilter&lt;/filter-class>
      &lt;init-param>
        <b>&lt;!-- exclude captures on production systems --></b>
        &lt;param-name><b>excludes</b>&lt;/param-name>
        &lt;param-value>orion, gemini&lt;/param-value>
      &lt;/init-param>
    &lt;/filter>  </pre>
      
          <p>If it is easier to explicitly name the integration machines,
          you could list them in the includes list and omit the excludes
          list.
          </p>
    
          <h3><a name="filtering" href="#filtering">Filtering captured
          requests</a></h3>
    
          <p>Let assume that our web-application is deployed in a
          cluster. The cluster is located behind a load-balancer which
          probes each member of the cluster once or twice a second to
          check whether it is alive. Whenever a member becomes unavailable
          the load-balancer will immediately (well, after at most one
          second) divert traffic from that member.
          </p>
    
          <p>While such a load-balancing strategy will ensure
          high-availability of your web-application, it will also
          seriously pollute the access-logs with the contents of each
          probe made by the load-balancer.
          </p>
    
          <p>We need to a way to filter-out these probes so that they no
          longer contaminate the log output. In other words, we need to
          distinguish probes emanating from the load-balancer from other
          requests. The contents of the probes can give us clues about
          possible distinguishing criteria.</p>
    
          <p>Here is a sample probe as logged by logback-access:</p>
    
          <pre class="source"><b>HEAD</b> /myapp/<b>probe</b> HTTP/1.1
    connection: Close
    host: 192.168.1.1
    
    HTTP/1.1 200 OK
    Expires: Thu, 01 Jan 1970 01:00:00 CET
    X-Powered-By: Servlet 2.4;
    Cache-Control: no-cache
    Pragma: No-cache </pre>
    
          <p>From the above, we can see that the load-balancer probes
          employ the <a
          href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.4">HTTP
          HEAD method</a> instead of the usual GET or POST. We can also
          see that the request URI for the probes contains the string
          "probe".</p>
    
          <p>Here is a <em>logback-access.xml</em> configuration file
          which will deny any <code>AccessEvent</code> where the method is
          HEAD. Note that events are evaluated using
          <code>JaninoEventEvaluator</code> which requires Janino.</p>
    
          <pre class="prettyprint source">&lt;configuration>
      &lt;!-- always a good idea to install OnConsoleStatusListener -->
      &lt;statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />
    
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        &lt;filter class="ch.qos.logback.core.filter.EvaluatorFilter">
          &lt;!-- in the absence of a class attribute the &lt;evaluator> element 
               defaults to ch.qos.logback.access.boolex.JaninoEventEvaluator --&gt;
          &lt;evaluator>
            &lt;expression><b>event.getMethod().equals("HEAD")</b>&lt;/expression>
          &lt;/evaluator>
          &lt;onMismatch>NEUTRAL&lt;/onMismatch>
          &lt;onMatch>DENY&lt;/onMatch>
        &lt;/filter>
    
        &lt;encoder>
          &lt;pattern>%fullRequest%n%n%fullResponse&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;appender-ref ref="STDOUT" />
    &lt;/configuration> </pre>
          
          <script src="../templates/footer.js" type="text/javascript"></script>	
        </div>
      </body>
    </html>
     ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/recipes/images/�����������������������������������������������������������������0000755�0001750�0001750�00000000000�12203357067�017010� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/recipes/images/factorEmail0.png�������������������������������������������������0000644�0001750�0001750�00000144700�12143164146�022027� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR��8��G���du���sRGB����gAMA��a���	pHYs����od��UIDATx^{mGuzGN|mICrMN}tt
    X6En;Ǐn1K
    )G~@`@CBdI 7 !s^欚VתYs~sVoZ{@�� ��X$
    F ���@�<x ���@�,	 ���@�,� ���@B�D
    	��@��"�, ���@�!��@�� P@8qē[ꫲp@PWa
    t@
    v0� .w~wο\ꫲ3w�2<]k9u; jI{�� ˿Ν/.UVYXٙJ;�B5:=@��IB$0peaeg+	I	b<]k9u; jI{�� P}k.UY8-߯$%VAktp6b6ɞ@��$LO2`6μ{E^I
    ?z%6t}#|_/u1l34cAԦZ��#{+կ#&B*Sn]9_Zk$NPr_EɫZWAWbI6L* K~N=/O>tgvL1)�@ !jWf>|/~L%LN`F~_WW\aN@U9}^vԪ+$3;Hmҧ?悯]7?<Tx|K^ӟG?:t"5T �Zm{믿/Y_RU?яVtDWxFkG>n!W뮻n@#Ӫ7+ӯJ8Ɍv6<p_W}ᖯ῿Lg'՜d=wГ/ÿ]z=CU7}~_fYwɓۺ`�@`2_Ռws.[oU4gΜ+*BC5
    LԨҊʯ}_Ї~UfV�9̪_?t\>AcwW*Փ4׫[#_ClS4/QO|⭿wqΑ;ϸq?{X8%AԶK �VO*U|]s3\׼>.|榛*XVSGs׎&VCs~>o꫿{7=%]_zaEY=tox_z#ޯ+O2K~'s\Fg#j~;]p'Ϳ;.>=^=s^0xQS	DmU7@`V5'כ7/xWUUo|_^	WX%L.!gBC~%[ۏןɟTTfx/|w/*r7S9X\6(n <*zk_#!j+OW7Y
    /yw=[gG^/|W_2εncFm^zw諾zU	}O]^ **B.|c??YzF~7VbUwg^y?xpp+U?}+i߽5B]ej,K"{{{Dȏ>5O?z}}|sį;~jH^G>i5,,x+7
    7tupᏜ\k>;+|CO??,tS7+.W_=kCo?z%C/zC/|'q-xN+뗝m4L͝=7ozף{uy_O'TrJv}kRS<
    Tw"՝i*�$ F9K^[u*6S=g?
    !7_|x?zu]3G9tٳݧ͵+~1_X?
    {+CuvovOU7sz~'^vڇ7\3֏U~UWKEcEmg+~1իF85w;aN@}WVׯ~?O=x{~"jiw#1	ϊF݀O-OГz[^}ߞ{VK>;9ר_4]םmXk["jW]]O~Re
    Iv}u^Kwv#MK' jka@upP}:@`i:gE^-o1,sgڳ;?O~O	xg};ѿ
    Z?P]iuR	�x7=exn}oU7>vĴ뢋.B=T
    _v+%3y'mz U?z!oux?OǞ?dSڙsw}׹=Oc/jg7ȷ1e&jv8>}ϟ؇>ׇ_9G^G|3u>FCJ.;X_I6w>u
    g{GQzx_Q:3?Y[_#'L`}: jka]wַ<Yճ-�C/Ǐ۫3+vw{Y7S
    ׿>GϺO~sſx55ȪJAD.|ʋW~?~^}sW~x?핧|;V}<TC?5y+::ڛ=OZeՏ?}=U5^Qq:J4jaQbwiI'o<o跿+y7zsW7~,Q;z-zVu~goow7}_{<W@;(g ϕ3^wsu+e{ѵô40Ix#QS~EoG@nwT[nq~Š֫/W`W\Q]>3C<C$O}گU[gշ~/ӯ{o[~S/7=_@~/:jO\߸W.JU^ֈCyihtW5߯K{;7}s]ӫo]OW׍ի32{@T?ɀhͻm$VܫjUUɽ+o;~{Qw|wT–{QSMLDwy_<ڿG^_=y߹x撟إe&Iܡ]t~%w׾\ss#~P1$:X|k_gIn2xl$XM1{M.zg/azgg/gV?RTAwݫ[TMB 0
    Vgd쫺񪫟;|koG}Ʌ~~7<oo//ݧ|smwaTo:僉ԟg=^w~%|#oo?	wb=p'?BÜ_qU^U=MO}?;V2\unY3yՁwӋBS7+?ҷ<oXo/o|=.<o{|/C.ĶΕ?E;Nm:IT/|~{/Wa_W<&"j/}m_F"2xl$X]v!?{EꙚcWR~#Y/*)S.ZEќWuje6dTDM˯^{ëK~?^puηUgH`Kw'$Wp@G-W5mv5!ݗGH Uﻺ:¾ᆏvyŻo_|17^7xו梅DOQ?_Ư?o-oqr)6Tix#??ߟ׿3is<WV'ۗ
    /9۵nmm'[.ȕpr,Wc/=-^֜u4g2/pse3]m1s8`VL8{CZ14B"wy:i:ko_%%j귋/MVUdF J\GTQ;GsDn"~?c#<oToy?)/}O?ǟc*6vj>|'-?y߾_w|xox?臯g`l^\D?L!pvVV5j:j;V36s=16#S;4[d[#v'jnW
    /KvtGBI%`M-X3ޙ'Bݘ)6X)P[W<%j2RS"`Zu}>	uQIY_y[~v:M_3—9Aؚ>z?rOe>o/ہ|uܥ?__T&}>!32f֒9uo0auO=fӧt~Ja}몧
    }K;sNc[X3Zzް+j<7)	rTf/pgy?k*^}1Ҳ/1X2Ռcj5NJԪo}e/>B7Ȍ@EԾ/U_>W5:Fp96(HZvгqfjSY
    R;*9e)ް,17촕ƐfF3U|ի^#T'7{VTo6G@/>㺥**+;X_Ix@(5:FY3%Qs>Mw-SG֭C�H2g,Fx_Qո]lf4go5
    /g'Gm]L@馛w'H~Azd	U	~~~up_L/UVYXٙJB;�B5:ߝI2{)6)JH
    y+|kC;',J3=!}kwceξ&2{
    kot>p뭷V1?x[Q.VTN ooV]mʶ(-ܯ$ \́B0'kOZAπ)*8��@`KbA^ j. �(ѯ\NìKܒl�Q[R4`�@�@aD ���@`m>���@�� T@Ԗ��@�lͧ���@�� ��R#��@��#���@�� �R�Q[jd`�@�� y@6��� ��X* jK@�� �fEw''KXDmd@�� �2ܩԅ^2k/ehV?~7akMNԮ}s^[moa.NiaS;%=25׳h";͜\'$P��@`TOb%^vc/co*ŠQV]cDGj,P#�^NFZ75ڋ.: jii ���]J+U-]t펚F55oɳsp$jbـ��@�LRUø"D9i=Skvc-~ų.~_c䔳s'+o1<%ؽJ7X'=:c^xs:uvê6c'ͥRq-Vٴc^СphZ'��@�F`WJ@zjDeTD:ёV2DI"jϺWZhMn=u5۱G
    YiIKv'"Rss1>F7iU8wb��@`s΁fK؇5S{"n$QaT5C*2ַY3]Zkj/𭪦DO*)|qݴ+׬X5{VhvH[cCG1b@�� �R m8lG>Dꤌ$j\gCv2ԧe{%j"!jkUI.QkZ_D_o_:jB� �@5B~g}fɩw$*Dᠻ~@*֝Z<lwyq̚[Oѧs93WG"M&5uwI0GXcT` jz��@�Q۱1{�ݕ7
    [xPaLP}^LQP9gG{ʬ~pmpIz~|jaHo?A|b9
    ��@�lQLEŜцH
    8
    ��@�� f4
    J@�� 1& j<TjcmJnA@�� �@L@J	> ���@`~@3 ���@@�
    & ���@`~@3 ���@@�
    & ���@`~@3 ���@@�
    & ���@`~@3 ���@@�
    & ���@`~H玛|FcF ���@�("Q~>Kf%L@�� �l{7_G;sϿ=O3 ���@@:Zϖ?k{w}>~re}W+/>ﶫx5/W*
    ^@�� �fG%pEIDŽs)TOԮ}s^[Qj5XM;]}ڽ{^q/9k|gξW4z ��@�̂�%gSl%Dzi<\_}_yK'*v<?˛ً@�� �@f@vLԪvڳ.6>ʼW^]0M={׼چ^|?W>p;ێgU}g]��@��%nA9-uq)Z?ʰ؅Vz@_#V͸ĵsK.VAf&j;玷5l"GVEsly,{7>]ߝ_{'!@�� �2!)͓c,]XsgQK$Z}<3\mKf9{]G
    -i^S^
    ZDv߽wO}og~?L5@�� �@"iYv]#5[f5mȃުڒYڈ�=us7v~~5?_w|Ĝ8�@�� 	NQ땷_FNjoLQ8ɓ'$G}wM	ӓ4]7?ݷnzE7碛?~4gP��@�A-Yw?s90w!?Kk~@u}@^�'8v/vo[+|gsw|w>Sos}">@�� �&C+M=w4	g+AЎ1秌U}tDiD-��@��r�Q+7� ��X9 j+ @�� �E�D3 ���@`<0� ��(rcπ��@��#��| ���@\@ʍ-<@�� �V���@��r�Q+7� ��X9 j+ @�� �E�D3 ���@`XDix ���@�,=�@�� �by��@�� ��bBC��@�� `#��@�� �B�Q[h``�@�� �@Ԑ@�� ��X( j
    @�� ��r�� ���E�DmY@�� ���QC� ���@`��@�� 0
    W^yUD�@�� �D"j, ���@�V4p� ���E�DmY@�� ���QC� ���@`-400� ��� j ���@�,f ���@�D
    9���@��"�, ���@�!��@�� P@��@��5��@�� ��B��@�� ��@�� �B�Q[h``�@�� �@Ԑ@�� ��X( j
    @�� ��r�� ���E�DmY@�� ���QC� ���@`-400� ��� j ���@�,-Q;}艳uуcW`Ip)^cQsfKSZ<3yE1)̨	hn;LҀ,� ��ڠOFȘHBM#bkx0
    4;#k"hFAR^Ľ6Z7pB$��[C<6K$67S	j&8biNl.cCgY jv!Iv$z �K
    ̅iAFˬ0wѩْ%Q)#*v44U\<gs!36cp?{}]gz`< d}IJi|$5FymjUDJDGBd,QCԂbv[&@�̋(f$zNKT>~#
    5D9M꩘uDFg5{kibB,No;'cQ=1g0J#YO5/<΄DcQ8'y$erxIH"jgw>6ـ��C`Qc;tC@xI<OB"O~	QDXF,9V
    tZRd b&jO"3$bpʥ&#&U>m� \FF%z%MjUċ_ͤ.b\W̮\95Qsu0:Q4Ѱ׍y<
    ,wC=ޠ(m⁙6"%Qn� &"jvɃk֕{`iDѧUU]T9)D-3D{$DX裼53DZ)a~$-R^a,'U>l� lF5rvnNyvD$'aDjs]!#DͯadTi0lg̫#
    *fZK\5h<َ$jc 0첷JX�#Ziy
    5S,Z!V<O0VSFEԄ)ߝŹ~UӥJnEyTIr	?Zㅸ:l>Lf
    x<Ң'	G.\"~[y̦?MY܀∓!ۿԄp? f@�,f4)H]Tбp%xy辵V1QbCGkKg6W;pQkncO7Ho"e߼NB5 i>d:v>L`rgL�dW+n_~-p񷿎"%Z")ID�XZd4@Ւ@�� ��*5ùV~ ���5=(%QN`0�@�� �JD`*V"V	� ���"�6+ܘ� ���z@XA� ���"�6+ܘ� ���z@XA� ���"�6+ܘ� ���z@XA� ���"�6+ܘ� ���z@XA� ���"�6+ܘ� ���z@XA� ���"�6+ܘ� ���z@XA� ���"�6+ܘ� ���z@XA� ���"�6+ܘ� ���z@XA� ���"�6+ܘ� ���z@XA� ���" u~,Q8%PX
    Myd.o25b(lHyQȇ�Qo"-72Q1U#IͺDlwD
    D&i3S6qdɀg@�:Ș �VŔbA)$j]w j j%ДE-SL(Ƒ&
    $lPc"55X~xZ|GP6@w(@SfX*"ߜ}uyWg|Dmnz4+z~YKOf/>b҅ �6?{5eömnS Yq?;vMDm)2a j ji	)L;Ja5k2(Q4+!jw>r{?t)l/>W_|vQQ�QQQôRWT?4eD-Z}!�hV\E><f@د^yͺg7VAH@@Fє"WESaf35	[)	DooikHi{n]uyۇ,dyVۧQF9
    |tWɇ.(9)K!͊reg-bօ.Yz`Js[nryTnPΣd̍�9}ܯB}GmI./juq}ƹ&gm*M35ր8OK"j>qA/o\_oc$="\J6&&tvpΣd̍�9WQVZT7}yu{j۾Bεm-(W_혯ᱛrH#jݝ�9M4M%$ejxΣd̍�9iE;jSl>�ƚh8̂2w}Zje:מ{9s\X͊9ON?-6f;g]t;х917 j js\a~'jz4eCEԄi֜~Z5&6prF9Yz~֚o㎁G@6hVK>ty}Od]Q9шw j jXulLsaiޞQcR�?|~
    2prߊZQQ'{IMa2Qsү}'s<>] S{%PlOU7?{X>	MPu~=FW]i"''jI7>(7~j͊srFҰ;e{(mGɝzvnh`
     j jXu% )<QV|Cu?
    ,)si~[MOjπ
    YqI@F̹yYyFmP#8os|(k"a! j jg^Z3ה
    $'v`-H20_G}ǣ3ˏ#y~mtѬ8/ۋ	tjܐX<7t:V]	h7:T-`>t}REH0QiV<`5 j j=% Y9#
    'jZu-.QA2_w̢D�D
    D
    k^6
    k:Gs	Gʝb[C`DI<8gD
    De1ZD+NS>ն`=ܶ܀S P,)@eb82xSU D]E0D
    DRjE1eGDc�u1*B}sxLI>>A#Dc �PŔb)!�1 j j%&bF1Ll^�Ha+&m%Q#eC"fC�D
    DmdD"PL(Ƒ	
    @� l5z~S6fshVHbQX)%,'k~gw6>&A o٠ԙGikF`'d^G}ܩ_qfב�ʍ8-�B8R|dvR䢉	L
    dV
    RqDmD+mNX+y)I3`Q!/#̺gΩ~쌖}!jUOMjF>rs6u$൲qxk	xMWirnmD̈́kD-rN8 jF<оN</#̼ENotI"vOe3Jߣ5</3>V9lglDQ.Q;rxX"j&:yY-QK
    WNխx#jISAE ܈+(Y#jyNՂ~[tKD'\ȝKD'%aJ!|T?4JMSKOԌ4+Q;~?GLG߃LM4q*OLzS
    r.P\5ز>n0Zeyy`NfO3bÀ%!DHTPN%#^lhބB;#c%n#JvfG@RlD
    D/5
    
    r.;$IO@Hّ1ouvO£I,g:b)8uW& Txhq0ܳ59X^=&GO,V'}+Ƽ 'Hʴ
    %j焙 MNxu㈚=.Է5+:�7]ąoDmDR_'ܻwz%SdE	fEmuy~z5s\F7DD-ڑn45bN&ZV2QzW僈ڤ xA,	Aڠ̘݀DLJ,|ǬrZ*R]Ʋ\zү1z6FC4Y=,먹۩WҘw(`X}Dl@XBv
    jRt!/D`Q4$\40 4OF(Cj˹qnʒAԦO2ԛ	WDFҾ1ilT?)
    -J݀M!ܟ҈Z
    hX0u;QKJDc /5ڇu	m7Jq<
    Dm
    5Hjxf+z&&|,<Kxm44/>Iot;jܞmH+p:jޣ8ù1#ORgkfYP&П C"}j:7ot$HQmwq7!lG(AџM*EiT>btt4cO+U,!DX%.WFFRm;j[<}ϚsĮ~�Ŗyݟ ~%jf	Ei3j^!2?6̦څDcA:.2Aݾ6s
    R]Aj~#=ɛQA~>ơfnW=v@-ͯZ~n.pzg9IuGB-l>muI7,Oc*~n*A,nTkdnx4QoY3a2K}~j+HƻVw/P6]<G"n"zԒs# 
    Y0xD-T(T;פF@ &z3a)+^<B
    ڐ0h
    -{8#K'j? }&uǖJO2}T]/̰tɨ,yg`iK_h}$jhLC[#fw]xmad/mKRU#I^Cxu QW=ŔbAv�.;5E%$@1eGV�u%*L}̍YKD\#%f|@"fC`Sɶo}fLT<Ŭb)>6 u	0J69Ss͊@1+Gf
    ?&$owM%vxϋY8R|mA$`N7l jsbVr1~L6;H!J6&zgscT`FJ,U%ꤙ3Kf6mm*@0nyW2RgOvZ6=qwۚs^GF+&7&ؑFRxRNEChڙ`[-mh#=^àiA;+FÄ&Jb^Q몞t>K͢'΀1F$0^OOQ8S\l$3Jfu5~K}Aב,JQ˲Î4u5Y'j|5Cyx5^fːeI+mWܻr@:y~
    NotnjHaSYh(Х
    T`_a;d=vjq[k|"Z̑Дxl)b|%Bw
    L :Al|\
    QK-Fm;%,Id&a4|$&QU=QhDY}27ݬ5[9Tӻ9@i%zt+=G?}NH2$cX棝P%alK;x;X:-{pe~Du&kLZ)dwTC+:qR2=N~j%DmƧB,{t.UC*Q2#Ih�QiʻURx5Kc>AwyB@i;pt0^JQ+򶛐𭦬wԩ][BqGY:͵ yӳ|${ft9JhFqD
    𖰽bջ?~L꧇-X(l=ٴ5;IޕL$JĊLAR`cI~8wʬݐ@|@ "w"y!c[[%7fR"OɻNud=UzN7".Ž[neX_tnd􄑴Y$$jT~)֏I{ŢɶDڴ2J"BIʥ'M_c$jt$UmZw=<J ݽۛuԢ{ke==Kd%}ͅ%JT @$7>'Q#rt,
    �Y`hVz!ik#}{IQ-KȻ/;Ǟ5@x/@Dք9W[.jE~vyWD9z=fƢ_zIȵHY%5S\#:j5r "=g j5(t[
    Q$jz2$aTfRzMNX4zQku~GMq7<"[2i]݁S^dW"!GOZ	@MyP_"`[�"r
    G7YR4):jҳd55]wO|ʰzR;O|.=e^/,
    t$UIzg%}T鉖)vZ@Sf.s{֤#MOI4~2A}D>Nn+
    a=j4)J2C8xclvq
    D=?j{[}nEf˱G	hk
    VgP(S~QL6Zf]d8$N)<^Avc⌦L?jP`Zw%ZDJ5N<v]'"ߐlB"dug82<]AH\e8c"I*1鋇$/EAsQlcxhE,oGMxFo5qդLDmo9&a1Zc'Yt̬ؔ
    Dmf1|(|ƌ)#,c;A1A̞lU;ܻjK7'=ٖ ڒF!PJȘbDjG%'"0&9u&z6D|1zc'ےaQ[rt`(YSAF%ɍڴi9iM	s1_S$b�Q[lh`XY826lˎOQm*@Ԋ]8C(f%lewQm*@{0&'Ŭb]ZHŤX6l#j0+9})Ƒ}G�:=ƘA�Dm?K0/dT1/-
    $"R= j j\+lȆo"Q78
    ìy(lHB@.-"VpzoȵbF1l(6*uaߏ j j<̚bl:<88<R,gRU)!LV͖fΜw/ŲӮ4Qe%3Di:3ǏJΝ]syEv#Q(Jl(ŤI-9Fb#ZRQEC`)Mjhǥz4_o]DmD+lNJ+#?RgѓjgJC_FuY!\q	+`g~6ok]wxiZ=*:H=[Yڕbf׼58lwUD8JQ=BdLvٚ?叴=DmDc2PE0U+GWYh1|.sj|d>VvNQDZ=ArW?
    aeUڑCQ5hFg~tAb|%ިBeF@'en4*@lY}UmR!w֊46¬Ei.UCGS$kyYɶ6}DѲu䒞u+FQG*AO~R5ݦ\W`
    JE&N)Q1,\FyNUzo6Ѕi0cYXIM
    b`iߎV
    )	o
    l(&ܧ옹ې0~h4Ctu:ݭpμXatfE^
    tD\|/ݽhF1uQ"Dm OKtԡ_ꍞ�wHc/*Q+򶛐۴9+fs.ޣ{,fjeP;K/Oi
    c7~GW夙kR:^ZĖ>@i``^q!M]]\r'l!+Ϻ	0z%Δ'RaJz:k쐀_s5j:u?m[Bdpa50�w$3H}
    Zv
    S|(`7ŗH5D8̤~%jl&IN2kP2v&qIC$$ZQ.;jK)OnwIJ%_�=k=qpMRhZw=<Z6+P[Q;T$֡%G۰ק(J<D.A6땜<Q%j6BDUzs5o8f#Qy'M1խPF_T3va%y\=D+@JY5?s0'XaI?mE-MCQ3kYEтASGL0:u@.r*~Ԇ="lO6-nvԜE.$K>2N+ثd]Zcp1& fԏWnC j-3ͺOK\C"L4w0Dԃrp\9Fdy}&;'~*K1i
    `]#0Q덑⹎nCԆ}$1Qs{=Iׄw~PEvlho':yFP30%^A*&`EwM	[:j3DgpۀOZn>*2l&U%cؒC:R*Jzg;*=5i3ĉۻYGrF?{jZxHWvE5[
    ƻo[_>5'F-^|ǨzIv=P9v<I0^Ekpqtř obJ
    5wY2IҊM?#8899k{Ygb"聥
    GFKZJ?rdB.me3qXQG ynB#jpڳp9jO5ՕQL$\OM@bޣ/4/Pƞӹ(=$a|D-QwzF^::.]Owܥߓ0{O!9=:DH;CiĬԦVQ@iͺϼ%ڶ߬d,kƧ 0&YugHqГd�:jx`|y)@1ݑ18.-ʶgLs&@~;}, Z,;zO6"/7;b2*#c1>(9&7%(~ek4|hʷ1(&qdYe[̾Ы|X3'zQ8R|mA$`NAMXsf*&qdYe[̾Ы|=l$"PLFlewQm*JjY8tQQ M%Z!PJ.Ƒťʊ�5+PB`SP,Ŭb)6X�0J6
    ͍@1+G�7/HylJ6MzgscYT`FJ,U%ꤙ3Kksm*@V0qѕfyY2i:頳'JΟ]syEv#GE+jPH#VgYϢ!~0QJQ&Q/eF϶+.59I+#值,zRcTqH.X<>.,nѕ۪{^eC׺^]zuԑ\[+"D͢ykp6zR\=#§}V)5G@4cTYvnGڞ&eT&2Oj5D0p�;LʧF<B5ᅹ|dovNQfQVO\裎h(+R,DԎ;f!1f4o&{5vC$KģDA_5
    yD$==4[[%a&QU=QHT%=QW
    ܙTt8v'.nS+0%"'t(.h*T=aD7bHo%:lOnRtFv(jH	^7
    K}ʡKNM'CG'`{,#ِ/L;DMRPәT
    D-@|0;D'գ5e-!jyZW,+NR7;7!"nL;ܙ+bJ+DFmWnBM
    Ũ(tfs.=
    {m0U*;K/2޶B#n쾩NH:H uQum#.>@6{?۞lm^G٪.HHlx)#jwYf訍a$]RD*$u:I&8wvclvJ]sVGzlIDͺ|u4DKQN!jBiոw Ab'?hΰfSDm$n3:3ftik5UoV*jsE%?Tl74+#jK)O.[\zU5FHFNRpP
    GW@9w3n2݉$"6uG۰W҈aV"fɒӢ%j6BDUzs5o8HrTex2蘣l
    )fꋈ-y\3x+P&-`Қ[Q?P%Nު^SQJf@+wHz_!j#x;斉AGL0
    MɵDQbƓ=2mҎ(څP쑹wj_:C/p1& Fa%3rQ@3d5DM
    $ 2T
    uI*WaiJҖu5�#LYWX?qgf.=J~mn5Z<&yڐOQ'"jڂf*cg$-)A[TEԤ!)r
    zKoi>|Nu:Ɲ"tXH4oVziw,b	'ɞ~~%ѕl!f5\w+t_uJ,#9cQkR
    ݵv~2+f=>2+Mc+^,QqbwI`GOQ_)K0^Ekpqtř jEĕ"*jb38d]&6	iYLg]ggk*dɶ8 0h$8]-Ah)ȑͯ
    M{K-c_K:B�)/PHNW29jO5ՕQL$\jRc}ܮaGALn$Mf,>OC'jNAuGѬf
    Qk4tu\dL͡s[D̎
    iCiL`ۭ"w@Tǂ͏9f	ɒdw߸GZvJ脒YugH33.ɖ: js#fCݑ18Ζ0$? 3Q49�-B\9m񠀨->D0p(ŬLĨ&R;471A̗Sc*'MS:|ɶAV$8bVr1#F$Z"UJ62.qZ6HԲ(6l j=bVr1.t-$bREJsxLI>>A#Dc �E%b2Gږ�ui)5{CS6qdCɷIW~QQOaּS6q$o|mi QQQ+87Z1eG6|tɰi5df͋@1ec6GNFA)3*XQfK	X~)?uZO�ڄճ!lн#^_k7Fۏ?eH�h%6cbDQdH#
    VfYϢ!~4Q"KY%";9
    A؞7-BZWXK+#?1ReѓjgJC_FuY(T|qM!j]GޑG{Φ,%EDSxPسEI~6|^NHPX65vJ8#IYԦ2y%5KlG
    	T=|mlLғjO4>Yb/߸DᡵNjE^GAԂi&*cc@(Q93d۠\ %56%	e(9MHj0Wñ
    ^J?#j蓹+(8BNө^uOyĪhd-;E?#q݌a2ʛvBvO}i\4!oٓ(&j:5U>cc&W	v:;gv?ySKAZ0ÈFӚT&^7~hDͪ䊎nͣRp'Hu!$g3Ýy8UkbMʠQUK򶛐J2LW{tϡfpܗocXhܢ*5i1XM ]|	o[%dIeBuiQ.ڢ	R|ΓDhYDz2 jIԳdrҐ�Q|-I}fAy-[RBVCDы5u"_!gM6#a<5`M2�)M+iDSL"1(pBlc^<k}?mNDmD-ܹuXBC*j'M|eG*K!`h`3$*hوExjQ]JFLmtԆT.XrE9J'DMHd'zs5oDWQ5uƲ6n֗s=ŋS&n j%j^`͉Q
    [phI55~EۊIޱچ-JDܑܟ55!ًKF;dB-/W|;!DM:L9-Y[6QѿLڳQ["Q$jǰ0N2\>i"-IHԚgq~Gܞ?8W_16pdsx`7ĈpFm�ϽF6iְ=5PH芓iP2h3kjJ[J"(%VQ[(Q嘏؋4,uR;OS1w	π$=It:A[lh	8-~;7D~D5Hk~R2ַ3z2+f=MsZxu6@i>V>yclvPۿ{ƒ̖cǻ`<4b0UcZO~Дl[urK~~Y/8+.wK`u"ImIDmDmKXI1XDF Qk%j44BvgߐlB"du8-J#5FxǗo-dIAS&
    *ɶj؉|Tkpf~f
    $r#Qm~mid[ݛj{nFoKڶQQ+7䙂߬Dϰ2a`01{s�|)Sy33uI	bD]0eY-+#a0)SAԆeZFɍ쉺`͟u1?Ŕbch\H%Ep[@@
    OWL(Ƒ$fDn6;6aS6q$qI QmQ'QܘDY8Rb$*a66l'O1;Ѧp/*Ƒ$fDn6;dQ?0Lqdc=!D[vS߈ŬbHmM$fC?J63΄@1+Gf
    <H=i7l j[L\J͑R,gRU)!LV͖fΜw/ŲӮ̵dQ[AFaDWrK6gLf\Ξ8z`+9~w݆k٥fRLrCiW#[f1>DS*Eɟ$m6)qŸv%`&68z%V}BEOc*=I~aepQH0+yW:z^eC׺^WxiZ=bs:HDYڕbf5xn.υ>ѓ,J5{
    t=KMTO(i1l]
    QZf:5\$SQ{4б:5Dqx8FWY;
    (Q'H.QG4kd])"jGU؉Fit7K=K3IDtإHQbJW,F1֐#϶GGa4|$L$'j5Sj(a:rIO:#jw#MUnX3߬OLeL?iGyt:v~FodL(o>ک
    CO%FC�ٱ#x˞$ܤ F&Q} O Tgb\˒rrLo?C;NXnR{-؉ْ.LDM0 of&Fr5g-!jydYq_ꍾٹ	q``<P"f'tbkIpLW0\:s*zv[ܗomcXhܢjF9iZ,<"E%|%Bʺk؁lvJsٷ'&ijބɶ7N>TNLX^O:1dHe+@tuz|CJEW2CFmwM'53ښ9!c,:\GG;	6w NHbm(p~2f$n]#;RSRhKf?
    ]D@2 +[26kVF½(M%4wS\zN!`a=
    'b)w܌dsfeM
    L"jb-i%"Da (J5[ЛY$┧F"JD7U:s&*%.2kl&K6,Wq87C	˝+Aѹh!ڧ@t{ߧq^Qc;jG$UpH"jÚaLNOԢj+!i-5sl[3Q3=qIUd 2\^ BQbƓ=p,v!9T&@(Gީ}Ễ{?V& fvmz@r=[
    QT}&Q"iP
    AOrq0Neu:Ӊ׉w6LYWX?qgf.Ŝ=ڿ0:C12\<&yڐOQ'"j*8}$fyt4$eYn#<ut{yDԤNOwK2;o@?Jϥ47%:UIz&u[t%{uYm:B/:o}%f1Ϩ]ƆZ[}O@Kivj
    bYk8n!qbwI_mCcǟ%5,
    qT6;@Ļ߶ĕ"*jbvg,̈́>emBhn+3.d{3j/MnqX
    Q[4}8Jn	BGlWhzXj5'/]j47U%B]wӞz!?VW1pwI㩁
    -=Be4J}wQʢIT!c E,kșq:$r&c$6hqv4ii&ChuP(r~b,.3QpL7
    ~31cfHҔC3b|vFDagd
    "5_Z~Lq!;2;څFĜ:9o7-3C"PJȘb641nLnKTY$GMKo5m. H0qŬbGZHԵD�;7l jd,\(f%2lewQm*@{0&'Ŭb]ZHŤX6l#j0+9})Ƒ}G�:=ƘA�Dm?K0/dT1/-
    $"R= j j\+lȆo"Q78
    ìy(lHB@.-"VpzoȵbF1l(6*uaߏ j j<̚bl:<88<R,gRU)!LV͖fΜw/ŲӮ4Qe%3Di:3ǏJΝ]syEv#Q(Jl(ŤI-9Fb#ZRQEC`)Lw	*qŸh9(]Ī
    KiEOc*=I~aepQH0fW:z^eiou>]zuԑ\۳+"D*9kp6zR\=#ΊÉZќI]tDU9i{eLDFKoti"vOeJߣK)</SO:>cx{s0zBuDFFb!vBbTb'iљ,MF,%j:tR j:+DFECV<vJ"XM^h0	kipx?LOb䒞u+F#`ozvvpRrCKb*	Aã<:;E?7J2(o>ک
    u-<aD7bHo%:lOnRWv(jH	^gUS]d6^'Cs[:k6ˀY:(H>?Q2H#t+5{Q
     "jP
    i9u藥zovnBDv3W:x	DmWڮ^݄�Q�!at
    {m0UAm,|kSx[4Q('\$Guב)0 0+@6{?Dڼ_6YQ[4Qs@j'&oI"4O"@z=
    $){''_lĉVGzlIDͺOc4=J)DMh9{u'?hΰfSDm$nuf?5RI?}"7+=gjsE%PQ[.QpMg	
    -,Pvr.T(t4HeC jۼQμ)IDPM@đ646x`E񟇨Y$⴨G�5"QDMV+N$j6w[q2h|l
    `w@"btK9h0ъ@h/j0Qfatꨆp-DkctJh0"-H4I#Dp>LzG?b2ԩCvd+:2GmCOl6iGYBrL #T3N5j@~rQmiփɓ'gS&\4=9x1a�Jr0WO5m5ұD-~Ñ	.9B~mn5Z<&yڐOQ'"jڂfw~PEv	>O쫼A@ICRVwAKMD|ا:j!lQ&uz$�aЋN#c(yv$UIzwo$5i3ĉZj)y+<k?3ٓVMݧ_ LY紌nDW^?gчXĨŋ4GR=Eg|!THY*Z[+,LQ(=fG]*!;޺,̈́>eIiYLg]ggo
    DmDmp81pihxme%-9yb_uYjYgcQG C
    qשXڳy^C5'(?&5Le>xN$>O-{.*2~8Q;<%1ؘQ$5T^::.Mzs޿fU\D
    f!ҝiCiiRK~u5GY*7l
    eX>&aIx&R;0h#0&YugHqУG{A�oܸ|/I@1ݑ18.+JfLs&@~;Ezm?qk蜋|;
    Oeɨ쎌) je1/Qg=0,@7-	
    Z[I5:)dT1Ln(;HԽ`;#\CGcogi1U#$꾐 jCָqX\l\LFȤ#D{c�85tp
    % PLFHB B+ZMT-9֚5{yqdy9r"D͉&tTa5@1+GM58V#DE"̆
    DmDs#PJ.Ƒ3�͋�u^7=ۦ
    Dmӹ^Ŭb);90J6
    ͍@1+y6GN;88v:'XTϤ0RB`G-Q'͜9 _e7]+kSnl6ˣ'ΒOԹN=qVr
    +KG?*ZdU48FI'">KEb|%.AꯧT2MtpZI~Cg隈ZXr@^
    I=v18$eYz,E!).]y{^z]}^CnQGrm%Ү5NS3^7\{B߹Im0
    DjX$K9=F#mOd2U*mƧZFKotiHaSYhecujBqdovNQfQ68D QVPX=v*j;H#fi0gi&ɂ�7PQ=:FIEFi
    ] ju^jEZCV<vJ"XMFh0	kipx?LOe%=QncDmu
    k[1ӱ;;8@%1muvEGyt:v~Fod9Gˡb	7b ;vf,=IIA,MұV
    )	o
    zFTO9[͋Y8IW	Mj;5[eɶt7tpF$�!40bҤh_NFB6ʲ1.}s"!Ýy8:ءDN jJdv&ݤ�XBg8	+uVk۪l,|kSxv:i",<"E_enb\!e݅5a@6{?omO6/|̫IBdKҹX5*vbzjIa$D*_ǧ�u3Q d9DD#N$fF[s>:"d%C(h5jɻN[ 4gX)DUz}67Yjtřuxgq3DM~THiSYw\>SP+(dby0eiT-_feD-܋
    wk:yZvY 
    4ƹD&$5|
    KFW@9x3}?t'->u.K8݆F(7:A6KD(Q+&@$	x:Df#QyhSL]x!W_FR؅[避8 L,a55ﱣ9\SÈ�I!}q[&j'N1xt\'Z/!
    GmCOl6iGYBrL dxΓrK̏UŘD}?4VSl5DMQN9$uI44W=J}jy}xGn]*
    -?6b".QC]ѣ0Q덑⹎4CԆ}c"F
    {Gn.aH8	w	UDmgq}˙Ll5&
    IYEhp'(a#jw|PUǰPm`T~IU${:1:lqP/wТh{J]a׷	\1Q1Ә+,Kxcx񌹞A?)*iDHY*Z[>b,nQ(=fG.4V2žK\z?oq0q!nCG<0dSj[j:jHѕ
    <G,콽3qAګ#Q!DȸTe,Y<wΡ|Mmuk	x?I@8S߰i}ܮQ0G}wQ	3VɇNԎU)EI[.En]/.-A"s
    f!miCfvk#K(IPIΪ4#0'R; fMTUnj!4&ҜsQ[z``YSH	bDo"@C@d[(ŇEݑ1Dmh>cܘȗdiHT+%[{QrY82O1˾@
    λdQ`obVr1l%'u߃ߛJ6=dbVr1w̲/B~n*G2!`Vr&eTS#sO�uz1C�~99`^ɨb_h[HԥE`{@@
    N
    VL(Ƒ
    %&]En2qD
    Dm?Y"PL(Ƒ񅶥!D]ZD
    D
    DސkŔbPmU$&þA@y5/Ŕ9uxppx*XTϤ0RB`G-Q'͜9 _e7]+D
    Dmi
    DFK6gRv3uAg9;n5QGP(QI6[Ns()FIZf1>DS*Eɗ$-qWӌ8T-uISz%V}t@^Z�Y0ƨf]x	|7f۟Z/
    QGX5!]Gɵq+KR,B,4PгEI>f!|7(VgEGڞrDFot"vOeJߣ,</SO:>	7^g*f7̢D "D QvX9<U؉Fit7K=K3IDt
    ]{y�
    Q["Q֐#϶GGa4|$L$'j5fg0{'j;sԑ*7oV'OvvpRNKb+	Aã<:;E?7J2cP1]bM1t	;3Ku؞$ܤ F&Q}XO6xo^DCpмF@⤫srkuI`'fK^ޛ3&vRZCzR=@vedV5[(BDGNu蛝7%^QU"Wm7&bT4fs.ѹ^afjeP;K/2޶B#nl83I3Igi.*vhUVYwat
    Ay;Ђ͞Y˾]V=ڼ_6UQ[4Qs@jKcI7]He+J$nN;y�k@-qFmՑ^'tQ?9s
    2ƒÅizڒBԄf�ɻN[ 4gX)DUz}67YjtʼnD:wftipq1aw\5񹢋}TKQ[.QpMg	
    -,Pvr.TӜIf^	9n]t'RDԺHԿ646x`E񟇨Y$⴨G�5"QDMV5Iʻ8mitm8uv8AvasI:h0ъ@@[Ť`Q
    y:jQcĈEM_aע*sÉY;eɖ!f8wF&j#O1x]TpʥDQbƓ=۴MQsE*/;٭7`;-ǪbL@"~VvmDm?eYh_'OiNap5$jz2$H-چNwhQ:񎚽݆_#*KbƯҌu( 9B~mn5Z<&yڐO{LDԨc;	9.,>汕c/g2:4&
    IYEh7CGm?-JԤNOwݡ>I*tt4c(y){TΙ*dOgR,0E'fb6m8Qk:B/:o
    YGr<v]V/_&pŬG҇sZx7Mc+^,QqbwI_mCc?R`$3[AԺ/+ETb7FYɸ,̈́>eoK`>C_^LlE01 jK$jAn$5x--Ahȑͣ
    M{dR20g⌓|R J7$_wꯌ=9TC~|c"PTv(cOALn$Mf,>OC'j hV5T^::.Mzs̿S[
    f!Yf<ɐNݚ(rM~XYWs9`c6Dj%J1kF]Cl6v+bB�oܸ|AS@1ݑ18͉+9 Lԁ<y}͘585ttE^db©Dɨ쎌) ji21/QU覭,您
    Z[@Cpɨb)<6u)0� jX6f*&qdy]/ۍ잃
    ZaϞOXLFH	yO��QGCA¸ɨbIDW�uA[ɛJ<Zv/bVr1,/G`QN9ф J65b(f%HjHT͖WhnY82w`y@΋gTm:v\#eC"fC`S6[^a(f%cNGT`FJ,U%ꤙ3Kksm*@V0qѕfyY2i:頳'JΟ]syEv#GE+jPH#VgYϢ!~0QJQ2'el%r4_(Bl]q	PuN^U(䥐dѓjgJC_FuY!\0&Qt%v~6ok]7xiZ=*:HDYڕbf5x<lwUD8JQ=BL{r-QHSlb>W&[z[b3]4\$SQ{4;б:5DqxcѕuΩ"jv,J	}
    eUc,$F,vF҄atϲPN%͒JkШQD*F֐#϶GGa4|$L$'j5fg0{'j;sԑ
    arßNNL?iGyt:v~FodQ|S*{"M17ƌeb'	7)QI~;Rv~Z5z/3ў%0*).U8
    6~h4Cq:ݭfC^2ٖB5
    Js@Mg.LR5�7TƩJf0ٱUDϨ
    i>Ɨ"?**M"Y^QU"Wm7meS2n8CYsg4mU+Y}&:6lF}3('\˝GuݴPuFs3Vhf6C[:ڸ7!e;9 <I&$דѯ(CF[;ev>D0DD#NHGJ[Eß֜Ϲc4=J= )DMh9{uk?yAs5[BT7C۴)d+N$jqIO]&Bj?i*.*9LoV@Dx	I((drg^2ٖi|U+#j),eNR.=( )	 
    QsH[ԣ0;+Y j϶GDS
    ZD:#mӈaVr%E=Jl0	$j>ު8HrT~7TEԬ^6m:GhCyS;T ܬ<p[a+m!֎4cMD-ڋLԢ Fjg<+QsƯkO5lgtFW2-MC[Q3m`f;z4!x[^ B؏5	ئmҎ(څPQkxW?˧| HŘD
    wmDMY)iIԒU
    AJ0(5tu5{
    SFU:bKv1wG_xbD7F:GwԆ}?:QMv
    FaN8K"j;O4Ɏ+w<S&6ĵM?$eYn[#{nktJ'Oױ0NtX)u\X�av$\z1/e*БT%uwet%(=i3qt_u
    ڏ.Gј#zîo6EfL@żXԕWc5�'F-^|ǨA޼6l9v	ƫh
    Kpy?tKfq+ZE5ctߐ1s4?-em&)#|3Xhn?f`I|fW&[L:>_MGmpJBYH$[~}K-{oLxХ/PcoH@BԨXڳpڱӽsՐ3+5kCM*SYcl751ID:/~1{ʇNAڢ$vIA΄Kך5H>F{t|jRH7,4i.vudVQ@FQ{`T(TӛbDj%J1k0>zpAl_dM}9DMV@1+9#cq 
    &R[c3Q)ҳ
    'L;2
    u}3	;աfF/|ɶ<<@V$8bVr1#F$Z"UJ62.qZ6HԲ(6l j=bVr1.t-$bREJsxLI>>A#Dc �E%b2Gږ�ui)5{CS6qdCɷIW~QQOaּS6q$o|mi QQQ+87Z1eG6|tɰi5df͋@1ec6GNFA)3*XQfKI3gN;Hbi
    QQ[A(ѲfyLtЙGl%p}"tԑ(Jh%6zbҤJJFRVgYϢ!~0QJQ2'	5]rO;/c7/P6'EXy)I3`Q!/#̺c.
    Iq	8BaGnwhz#ݮڴ])!j}\dzx7\HY#j
    ws&pUk5EGڞ"�DFKot"vOeJߣ1<o(١[*W4Q~uΩ"jv,J	}ԑhҮ#j;H#f",JDtiʮXv.%5eQiDL%z1lh@zkH[XdHe(a:rIO:#jw#JoVvvpRNKbԟ
    Aã<:;E?7J2(o>ک
    CO`fS]95_R$&14oGO{jωUSvܭV؈O?4!N:NX\Fx@Y557-N_F3jFl0uQ"Dm OK<=uz'$g?Ýy8:ءDK jJdv&$|6gNʸKgtwi۪Vԑܰ=9pc+wtřQN;H EDaiV0 07$@6{Rq!M..@vFLQ[4Qs*NK.aJRD*l,$Zuv+ZTlĉVGzIDͺ|u4DKQkK
    Qmp';A"o]?OpвSBT7C۴)z8Y$a&Ì.Qc3(z:X]D@2@3/SDmD-\•X_Iʥ'0RqNHFgLR6OeC j	GD'"6uG۰WW҈vЛճZ,YqZDͮC�Jo|N&m+'5Iʻ8mi`mXPJLc#n/ϛ)fꋈKo=D{tV
    -?Rj:Bp6FCQtzJȖ!)Lj56Z0Q39~S'څS^ B؏5+lO6-nvԜE.$K>2N+&k6*n,ɏUŘXR~rQmiփɓ'gS&\4=F`0`tHU[׉wGfWJdCKϵ$|`p.ksCO	๎hO6S~]
    &jw-acj)3qw	UDm7Tkxb#h*&
    IYEhp퇰E;]$�aЋ""c،yD39T%I1>O@Q=Fӽ&f1Iih3HΘgڮTC)km>eWz/}8?eWDW^)m>>5-x񌹞h$S~BmchGWњ?]qf)ZEqJ솚ؘ{"tS&waYKo3RCp^LlҰI jK$jAb%hxmWe%-6O+4u\,,s&}+@oH@!2:_K{>s$_S[]eD:C16\=B?Jct.Jw ~ŒU!SbGQ4ZCa/
    Gvߣ+DHpe&C:Hn/)r~u5GY*7l
    YX4&R;,OA`L&*۪{kcBqX
    e}e]KK*سɨ쎌)Ɓ@Nv)1gis�
    4As.rAȘb6$3fLnKT1) [P5n\E¤ PLFA!D]P0J7Dm:5dT1̝o^@ԆRq7&p*Ƒ	B�`n
    85tp
    % PLFHB B+ZMT-9֚5{yqdy9r"D͉&tTa5@1+GM58V#DE"̆
    DmDs#PJ.Ƒ3�͋�u^7=ۦ
    Dmӹ^Ŭb);90J6
    ͍@1+y6GN;88v:'XTϤ0RB`G-Q'͜(ߡ]+r!&jƦ
    Dmds"]VGO%;s:{聭5wWd+:h%6)$-9y5H:Yf(qqLT=IbVO:Kd綒qѳK�nMD+lpJG9 /$T;Uz2¬z=ᢐ,Fyt%JGϫܿ?է5Dau$V,JQc<x7\{Bb|%Iҳ1ۘzd{OkV(Wk.g]qw³R[b3".`zXT֨=[yG5RUqdoCGQfQf׀h#ZE19eiWch5d1kß4(U/G؟,JDF�m	{F%>vE5)O#Wd",caC!maz#ɗ1+%=QcDmuB,͊^Tᒘ6
    ԠdQdbmQ1,\Fy΀PalK;mx;X:-{pe~DmrՎ/%JF\
    )A6uװj,v8]X؈F4!N28OUX\@e˼󂨩\;Q2#C^5DV?:L6eQ"Dm OK<=}/KnNH@Ίi;ptC@vƨyMHVcϜzߕq39\a=wNF̟r_:Ҏ
    c7vߌ83I3rgit{ݜgFˢѺA˫V!炭nvRɶsٱ>T1M::z%UJ|"AJ�K2V2E;y%Qꏮ8Q6H8[7"h1dpa&45qD޺~5UO
    UIi-Ehѯ`CYI&wkĩ]D dbdݮI&\Qpe9-lWvr鉆:=Q4$jt$U>ehGW@aڣLwIDs!ZK"DZoO#jQڻyZN %K"Nyj'-ϓD"7>'Q8Eu`]Wvk3zpk"9\w%=DѾɶ/λ&hHͪM=q
    $*3�$lh^[Jm֒Q3kYEʂAGLd_"T%5'`97Qb7WGީ}IG5d˲"燱aL">Ao%;0{AҨ鵭izZ;jQ5JQ
    =ۣo:8#D(AkOݎ7\gɲ}҂jGK
    )QksCOT7F\G8CԆ}:QL{]BQ
    3pYCdK|5iH\$O&-	DL~55]w8I^#I>CqKCJX4�g\
    ѕlo!fSD͡^.vp3HNp9bOZMYks?Ѓ,cE}+,~5'F-^<c'*ǎ?EM0^EkXDmv�-&QPs9E:%m$|iXhfq0q<Э CgC.rj"уQC!z1ѕj|~##sZ9TV0NHߐlns{m}=;;P
    IF+_clH;Ԥ25ƆGkTYeW~2ӹ(	SɇNA5XKCQǥHm'wZm?(NV*fђJ<NAHDExjx%}iDm?c(f%gwD`$cc2ڱfa|
    c5Qwna~�=)AvdM=؟4%Z\^Ŭ쎌)ƁHrn	bDo"?@ 3)C"PJȘb641nLnKQ>D7mjedKy j{�S΃@1+G;fH}!y7l j\J.ƑdVDn5{{SÔ PJ.ƑyY�u_opM%9@&JΤljqd b@N1fh�Q;"̋@1U#ymKC�lZ!׊)8ۤHM}?N'0k^)87ж4KHrQ#JMDd4~2E1#OET`FJ,U%ꤙ;bE.Y�QQ50DDF6;g)\?r`+9wnwkkي0ZDJ1ɪ{iq^4NnE|,J\_O<$SG2S5JT7#P6'Xy)ɳI3`Q!/#̺c.
    Iqaq4Gͮtl{^z]}!jE#6geiWEUFƻ޻T<DO(G4fNv3&fTrUڹ1}Y@ԖHhV-.4\$SQ{t
     \O:>JD7ކfm*f7̢D G QvX9<U؉Fit7K=K3IDt)[,GJF%~(̄o5dŬD$=YIZa8H:u|m=|Q.o
    \yň7HS7+S;;8@i%1m#mP(21NN?(ɘQ|3 T<afS]d5x˞$ܤ F&Q} O T7|Gfq.:2͋~08<Ua5Ie缾Y	a@r;kLdNgӣTԨb
    ;Ǽ1hhF4:LB6Ksԡ׻y="Ti;puC@vƨyMhIpLW0\ԮrXEnZR˷6ѱa{,4rVhQN;H uQ	w
    D.>><cZ[4}'-|o粵yka@$m7=ڢSS	JX>$@' ~Mè:؍>hو5:
    :ً|+HCLQ-O!jBa�{'HgX?yAs5[BT7C۴)R+N$jqk:\&Bj?i|n(Qb[^@M|z%�1DmD-kIt\AIʥ'8$@MJ깚40eC j䰁GDS
    ZQT#ѽӈa~V"fɒӢ%j|bKϚ{D^7>'Q$GwCUDj3EFI´qk_,8Av͹C$D|֢	-E{QZ4עSG5TDe赱iUюZٷ }<BG{eD͠w)#&"M	/*:CQ㋨P6!DMiD=c@5"Bru'NziV06tUdA?4;~MYWeMOkN'C^0t&jy}xGSZBmRŭ8R.9B~mnS<PȅSVkeK!jC>y'̍TOT=Qkqw	UDmi$jJ)\@ICR9J5=Ƞ	u˪s4ļG
    êZa3M/J%_@QHԬC̦ljC\&sA[hѽ2=iޕ{z(^p~N>t|}؋%j1NZx"ROҠzoQd;5xI-{Dmw5-=fGٛ5JLvia}Ai]ȀUNI"OR`|$5Lͨ }׽R;`Q!DȸTe,Y<wΡ|MmukIUpE<OsQAf?UEWY	{i<t/)FF	!mQ,Z@92y<MY=Oc&})Mecdw$EDjǘ	bDac@G-	LTuϜ3nQSHs\1giS@g
    <QKdXs.,(&;2FDůSMtLXL+QME^f^«TɨbI ׅ�u]Z j+8/&qdI2"D&T�Qļ`ceE*Ƒ񅶥!D]ZD
    D-ae0dT1 _F�Zv|ݦmq?ϱT1F\#N'E�TJYŬbY\ Q	e80фDMdV@1eGVF0Z�U
    "dQ.XY8TaY@fJ4l*@4)U"PJ͑[)3*XQfK	X~)?uZObm
    AԦ@:@ޕL'z[{}n?zlIW"#D+&%{FIm5K=b|%.A^Y*dlPinRC�7K\P4`c6DԺx/]Ī|Y0ƨf])
    g*g�>,+!j5~wb&#K!j2zYL4=Y'j3%hSn43ƣ䆯6g j$F튩y1j
    ʿ%6"vOeJߣ7Lr
    >Qc^(
    _ޕǎU;jQNjE^GAԂi&*cc@(Qx)W)T-{4%Ͷ+.5Hm;%,#QƐd>-4-M\O$|`&"F&Jډi'=dn=490ŀ
    :\WN
    �79[v
    @^ζ1,\FyP)RM1t	PsD5x˞$ܤ FB4Q'֩(7qT,a 9
    xa1HA|}(C2leԻɓ'w=AQN<P+=ehA}Fi2!jV%WtB{p%E(Nu;G	q022wptlpmQm7m'e03C&)Mf7kYYtk(F%MT+CVI%+yw]X$#Zj/B=0 j8}r}Thi:=bT*T)R^O O܁!,u%Ѳ4̈Dpp
    "'"j=3"d:\+J)DMn1Y o]?w,"r0'j#qS|$FTKWD!F/6cUhm̋
    ܖɦԳ
    RRKlg*J=Q5F`љ7ImyW2OԚUU.Q)�oO#jQ6O!julKt	QH
    dHdDAygI)D8_%!je{|rxaf-[F lJ=[Qr	DtjM-XQS4~mvi9f{FmDEoHm35˭W%1{Q;3a{iqQO8
    $jV07S5a
    ;8I7W-<145'QKV0NG
    
    +YUFVweđwOy_8Sbm0Q덑⹎pb
    9Nk"F
    r芓;jSdAɠMxg)ylXe/%5%&R*VQtzJ:PVOjIϥP}a)O@U${ISN]E>o!˘#MOIZ}<[Od[_64iiuRǗBi!im"նVO?cj>7D!ݢ%j}K_lv-:ը٫2I)p_^qEv)S4ٔzV!
    4afF'+w%Z(Q#gR8byߺ	H!jG7n'9h
    NRJtDp0n0½ld;MÉ=+ĝ$9kQ't+VD=vL*=no4Q-c𦹞]q=,Q!W@1+9#O6D`L'H_0`6l jg]+f%gwdL1dDj?&u^1ۚT)5akŬ쎌) jII:1=QW
    M%lyF\#sg�$xozM%ڦslY8Rv;$*r`66l j&bVr1̝o^6l#j0+9})Ƒ}G�:=ƘA�Dm?<K0/dT1/-
    $"R= j j\+lȆo"Q78
    ìy(lHB@.-"VpzoȵbF1l(6*uaߏ j j<̚bl:<88<R,!0[pCrpD
    Ds-t;sG8M}tNg(T83"7�P͖\w[܀\4Q̟ǑYLF,(jj4DmD+mNXy)I3`Q!/#̺CRU>Ѳi0Dڵ<Wz_#9:#`D])=<ui(Ad`jW6;JB^\yw݅i)f-ʿ%6E^C 0U+G)Hx^:V1/t|hɸDUgTDu\$##j&{xYSڳ!%%ƄzȃYoK&ѥDFæ!+R[HN0>~hɍf0)G Udjl$YgNzp0Er?hpI^9|˥>UAbe9Ϲ"oIey,GL+aƇ@ܡIsތ9ay6'Crw,
    .,1y#KX�x{ډd?{\|WTj֐-hH*QA.ꈥԡO)U1%	Ýy8mDc{*,6t󩍭[jռuc-}IK`gBIiU85Q)Bf_n!j;ܕk9smZDpRN
    #or;aUA^�uQ[4Qs
    3})ayi
    0p@g+&W '0dѲTXF^#p"[j*w¾nQ÷hi[Tne=rf'(+#8JoRڭJ8⚂ݬ>T@])@CijrT~~!<rg0L(E;D|'9Dp
    'bV-Q%BwFv5wʏtg_<\09Бgƍ!Dͦ~B	encb%0)+]qc#޴@-佘z<Q[!$-,6iZhDmD{쨍j�IDmX3,P<[Q37GrcgHԄ}دCZ;(1~/i4,55LJjsO}RFqu5%5{AzߞIQ%5MOepG-=i49
    AOrq0NeuQn*h5JP#q)W1cq.Iy_ SNZ&_J=T\pt sX۰;:Ё:U([ppOHG̈́H4-̎B+TܕGNI>ӈ2/h:g$=It;6e#5%Qo}_E,sN`u|d=hL&M7+;D}rh*-E:ArhKJ
    }Xej}pHȬz276w1h	=g[s#H}l,QB.42PDmDm{KE JRJѲ4kS/_&OrQ!|l
    *!jp?<wϹn
    Ì>ۤOcxDͬ5Y	Y3NUnBׯ
    /a9@CVrcm9vuXnz
    -$4z˫:wˍ~{w,PwZfHD
    D-Cx(B-wDa"TQl&QQ˛Qж1AfLv_cTYqk:4(e@@"PLD5c"0Xf#=QK#o4A@fbF1'0\ QB4O>ɓnMEŗb2Gږ�ui)tCذ^T{q*Ƒ&
    $lPc"}̍YKD\#%f|@"fC`SɶŒG\#ŧDn<tS6gjaY(f%Ȭd#DNdQny1+GO;Dx
    Dm\"PJ.ƑYÏfG�:;۝pSD/bVl>vppt41bQ=(0܊qg0`kSV#.yW2PΞ8-NS_k4ݿ~p޼gFy	$rTI�P͖\w[܀\4Q¢l3,.9VJ+#ߥ=v18$eYz(QJG?QI5yD5I#9:#`Sz옮{x~'LCҘSGsIlQfY9-ʿ%6Y!vOeJߣ	B5ᅎ-:=vj%\EԸ
    9E:0vJ%Kyzx7#j(RM4Q3pܛ5EϰGDtm;%,#tG
    [I뉚LRgs8vңOQq8v*ہMĪpBhhslE@:97Q-<bH5T5Iph9>6=tMpҭ{Blmlda	's`g֠f3z4٢V$gD-L4Yc.>;Z5$i0¼+!jV3HQY~:ꈥ1 ;cS(
    r``<A	UmISۮlmZh1(FZ֎'Ÿ旝#k&~Ce>h6FOXQY�]6(@26^eQdjXS%Ҧ>I�gJU0RF5`d?Jf׼DD-ڑ@1-#ႜUM٣Tf4vow(%:ɴ`yBUyE!k[g@f EiC8Y7a6UGAԦLM	vȔ"t(JDgz	k$NR6;]<Q37;ya*iMu-	X|Q3�EO
    :Ŋv,@gbrD4cDIDf'qfjD;MDW=:~Db2zZam!_sԘ1~9MJ5q"Nu]Q3<sp3ȡD-[hPy;+Ģ+̢OSժiFB	冪6&2tCA5MOESHBx0ԃ#UID06Z6"(r;j6mˈ#q.IyߏT욼Z0R>}y:jbGmR_LxghJ	gIy&jWVRQN\Xkri3nytXQ7N|^|^0vc،y
    /bpR\0!jgeP[#Fe΂"	mIMOIj/i}> YO!2Dmr1LhԺAMS3:ACԤ[KR4]&,:k9d;w�;f
    .mmw
    jS|)ZcbTVC*l
    "%X˻\A"P7(1ϼvE$Dȸdn> 5 !y4Rxnp ZGO4Qz}6wuM<;jh(NF"9i	';w4?ޅp$i4t-^Dm!C(f%gwd"0ڡǸȞs;0z>,jl*@Դi!PJDd"K=QW$l!T͖WhnYLv|CȞC
    8,٠T͖WhnY82w`y@΋gTm:v\#eC"fC`S6[^a(f%E�:/ޛmSɶ 餃@�� ���QCR� ���@`-400� ��� j ���@�,f ���@�D
    9���@��"�, ���@�!��@�� P@��@��5��@�� ��B��@�� ��@�� �B�Q[h``�@�� �@Ԑ@�� ��X( j
    @�� ��r�� ���E�DmY@�� ���QC� ���@`-400� ��� j ���@�,f ���@�D
    9���@��"�, ���@�!��@�� P@��@��5��@�� ��B��@�� ��@�� �B�Q[h``�@�� �@Ԑ@�� ��X(+k
    h����IENDB`����������������������������������������������������������������logback_1.0.13/docs/recipes/emailPerTransaction.html������������������������������������������������0000644�0001750�0001750�00000043704�12143164240�022375� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Email per transaction</title>
        <link rel="stylesheet" type="text/css" href="../css/common.css" />
        <link rel="stylesheet" type="text/css" href="../css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="../css/_print.css" media="print" />
        <link rel="stylesheet" type="text/css" href="../css/prettify.css" media="screen" />
    
      </head>
      <body onload="prettyPrint()">
        <script type="text/javascript">prefix='../';</script>
        <script type="text/javascript" src="../js/prettify.js"></script>
        <script src="../templates/header.js" type="text/javascript"></script>
        <div id="left">
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="../templates/left.js" type="text/javascript"></script>
        </div>
        <div id="content">
          
          <h2>Triggering an email containing the isolated logs of selected
          transactions</h2>
          
          <p>Let Dave and Carol be software QA engineers working at a
          company called Fooware.com. As you might have guessed,
          Fooware.com sells foos. Yes, foos... Let <em>Buscrit</em> be a
          business critical backend system running at Fooware.com. Buscrit
          is called by a number of applications to make business-critical
          transactions of various types.
          </p>
    
          <p>We would like to allow Carol to access the logging data
          generated by Buscrit as conveniently as possible. We could
          assume that Carol has access the log files directly on the
          server where Buscrit runs. However, let us assume that accessing
          the log files is somehow impractical because one or ore more of
          the following conditions holds true:
          </p>
    
          <ol>
            <li>Buscrit runs on multiple hosts and it is difficult to
            identify the host where a particular transaction was
            executed</li>
            <li>Carol does not (or does not wish to) have access to the
            hosts where Buscrit runs
            </li>
            <li>Buscrit is tested by multiple testers, e.g. Dave and Carol
            and others, simultaneously so that it is hard to identify and
            track an individual transaction in the log files
            </li>
          </ol>
    
          <p>Given the above circumstances, let us create a logback
          configuration so that Carol receives an email message at the end
          of every transaction. We will iteratively refine this
          configuration so that Carol will receive an email containing the
          logs of each transaction in isolation and only for the
          transactions she explicitly selects.
          </p>
    
          <h3>Triggering an email message at the end of each transaction</h3>
    
          <p>We will be using <code>SMTPAppender</code> to generate emails
          containing logging data. Please refer to the <a
          href="../manual/appenders.html#SMTPAppender">appropriate section
          of the manual</a> to familiarize yourself with
          <code>SMTPAppender</code> and its properties.
          </p> 
    
          <p>The <a href="demo.html">logback-demo</a> project contains a
          Struts action called <a
          href="http://logback-demo.qos.ch/xref/ch/qos/logback/demo/prime/PrimeAction.html"><code>PrimeAction</code></a>. It
          can factorize integers. Here is the pertinent structure of
          <code>PrimeAction</code>'s code:</p>
    
          <pre class="prettyprint source">package ch.qos.logback.demo.prime;
    
    import org.apache.struts.action.Action;
    ...
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class PrimeAction extends Action {
    
      Logger logger = LoggerFactory.getLogger(PrimeAction.class);
      static Marker SMTP_TRIGGER = MarkerFactory.getMarker("SMTP_TRIGGER");
    
      public ActionForward execute(ActionMapping actionMapping,
                                   ActionForm actionForm, HttpServletRequest request,
                                   HttpServletResponse response) throws Exception {
    
        PrimeForm form = (PrimeForm) actionForm;
    
        Long number = form.getNumber();
        try {
          NumberCruncher nc = new NumberCruncherImpl();
          Long start = System.currentTimeMillis();
          Long[] result = nc.factor(number);
          Long duration = System.currentTimeMillis() - start;
          logger.info("Results computed in {} ms", duration);
    
          ...
        } finally {
          <b>logger.info(SMTP_TRIGGER, "Prime computation ended");</b>
        }
      }
    } </pre>
    
          <p>In a real world application, a transaction would involve
          systems external to the application, e.g. a database or a
          messaging queue. For the sake of this example, let us consider
          each factorization request as a <em>transaction</em>.  At the
          end of each factorization request, i.e. each transaction, the
          logger of the <code>PrimeAction</code> instance is invoked with
          the SMTP_TRIGGER marker and the message "Prime computation
          ended".  We can capitalize on this logging request to clearly
          identify the end of every transaction in order to trigger an
          outgoing email message.
         </p>
    
         <p>Here is a configuration file which uses
         <code>JaninoEventEvaluator</code> to trigger an outgoing email
         for logging event marked with SMTP_TRIGGER.
         </p> 
    
        <pre class="prettyprint
         source">&lt;configuration scan="true" scanPeriod="3 seconds">
    
      &lt;!-- always a good idea to have an OnConsoleStatusListener -->
      &lt;statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />
    
      &lt;appender name="SMTP" class="ch.qos.logback.classic.net.SMTPAppender">
        &lt;smtpHost>NAME_OF_SMTP_HOST&lt;/smtpHost>
        &lt;to>...&lt;/to>                                         
        &lt;from>...&lt;/from>
        &lt;subject>Prime - %mdc{number} by %mdc{userid} &lt;/subject>
        &lt;layout class="ch.qos.logback.classic.html.HTMLLayout">
          &lt;pattern>%date%level%logger{24}%msg&lt;/pattern>
        &lt;/layout>
        
        <b>&lt;evaluator class="ch.qos.logback.classic.boolex.JaninoEventEvaluator"></b>
          <b>&lt;expression></b>
            <b>marker != null  &amp;&amp; marker.contains("SMTP_TRIGGER")</b>
          <b>&lt;/expression></b>
        <b>&lt;/evaluator></b>
      &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="SMTP" /> 
      &lt;/root>
    
    &lt;/configuration></pre>
    
          
    
       <h3>Transaction isolation</h3>
    
       <p>While the previous configuration file will trigger an outgoing
       email message whenever an event is marked with "SMTP_TRIGGER", the
       contents of the message will contain events generated by different
       transactions. With a little effort, we can actually separate events
       belonging to different transactions so that the outgoing email
       triggered at the end of the transaction contains logs from that
       transaction and only that transaction.
       </p>
    
      <p>To isolate a given transaction, there must first be a way to
      distinguish it from other transactions. Typically this would be
      accomplished by putting the unique identifier of the transaction
      into the MDC.
      </p>
    
      <pre class="prettyprint source">String transactionId = ...; // extract id from transaction 
    MDC.put("txId", transactionId); </pre>
    
      <p>In the <a
      href="http://logback-demo.qos.ch/xref/ch/qos/logback/demo/UserServletFilter.html"><code>UserServletFilter</code></a>
      class, this is done by retrieving the id of the session and putting
      it into the MDC under the key "txId".</p>
    
    
        <pre class="prettyprint source">public class UserServletFilter implements Filter {
    
       public void doFilter(ServletRequest request, ServletResponse response,
                           FilterChain chain) throws IOException, ServletException {
    
        HttpServletRequest req = (HttpServletRequest) request;
        HttpSession session = req.getSession();
        MDC.put("txId", session.getId());
        ...
        try {
          // invoke subsequent filters
          chain.doFilter(request, response);
        } finally {
          // always clear the MDC at the end of the request
          MDC.clear();
        }
      }
    }</pre>
    
    
      <p>By setting an appropriate discriminator in SMTPAppender, you can
      can scatter incoming events into different buffers according to the
      value returned by the discriminator. Given that each request session
      is placed under the MDC key "txId", we can use an MDC-based
      discriminator to isolate the logs generated by each transaction.
      </p>
    
      <pre class="prettyprint source">&lt;configuration scan="true" scanPeriod="3 seconds">
    
      &lt;statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />
    
      &lt;appender name="SMTP" class="ch.qos.logback.classic.net.SMTPAppender">
        &lt;smtpHost>NAME_OF_SMTP_HOST&lt;/smtpHost>
        &lt;to>...&lt;/to>                                         
        &lt;from>...&lt;/from>
    
        &lt;smtpHost>NAME_OF_SMTP_HOST&lt;/smtpHost>
        &lt;to>name@some.smtp.host&lt;/to>
        &lt;from>testing@...&lt;/from>
        &lt;subject>Prime - %mdc{number} by %mdc{userid} &lt;/subject>
        &lt;layout class="ch.qos.logback.classic.html.HTMLLayout">
           &lt;pattern>%date%level%logger{24}%msg&lt;/pattern>
        &lt;/layout>
    
        &lt;evaluator class="ch.qos.logback.classic.boolex.JaninoEventEvaluator">
          &lt;expression>
            marker != null &amp;&amp; marker.contains("SMTP_TRIGGER") 
          &lt;/expression>
        &lt;/evaluator>
    
        <b>&lt;discriminator class="ch.qos.logback.classic.sift.MDCBasedDiscriminator"></b>
          <b>&lt;key>txId&lt;/key></b>
          <b>&lt;defaultValue>default&lt;/defaultValue></b>
        <b>&lt;/discriminator></b>
      &lt;/appender>  
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="SMTP" /> 
      &lt;/root>
    &lt;/configuration> </pre>
    
       <p>After starting the logback-demo web-application with the above
       configuration file (with <span class="option">smtpHost</span> and
       <span class="option">to</span> options adapted for my environment)
       on localhost and then visiting the <a
       href="http://localhost:8070/logback-demo/prime.jsp">Prime
       number</a> page to factorize the number 123, I received the
       following email:
       </p>
    
       <img src="images/factorEmail0.png" alt="selective email0"/>
          
       <p>Note that the above email contains the logs generated by the
       factorization of the number 123, without log pollution from any
       other "transaction".
       </p>
    
      <h3>Selective triggering &amp; recipient addressing with transaction isolation</h3>
    
      <p>In a real world scenario, receiving isolated transactions is not
      enough. You would need to trigger outgoing emails only for certain
      users, typically QA engineers such as Dave and Carol. Moreover, you
      would want the emails generated by transaction made by Carol to
      Carol's mailbox and those generated by Dave to Dave's mailbox.</p>
    
      <p>Selective triggering and addressing are two distinct
      problems. Depending on the exact circumstances, there are many ways
      of tackling these two issues. However, for the sake of simplicity,
      let us assume that the SMTP server at Fooware.com accepts <a
      href="http://en.wikipedia.org/wiki/Email_address#Address_tags">address
      tags</a>. Such an SMTP server treats an incoming message sent to
      username+xyz@fooware.com as if it were addressed to
      username@fooware.com, effectively stripping the +xyz part.</p>
    
      <p>Let us further assume that we can somehow extract the email
      address of the user from the contents of her transaction, via a
      database lookup or perhaps some other means. The extracted email
      addressed is placed into the MDC under the key "txEmail".
      </p>
    
      <p>Upon a logging event marked as SMTP_TRIGGER, the following
      configuration file will trigger an email message addressed to the
      value of "%mdc{txEmail}" but only if it contains the string "+log".
      </p>
    
      <pre class="prettyprint source">&lt;configuration scan="true" scanPeriod="3 seconds">
    
      &lt;statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" /&gt;
    
      &lt;appender name="SMTP" class="ch.qos.logback.classic.net.SMTPAppender">
        &lt;SMTPHost>NAME_OF_SMTP_HOST&lt;/SMTPHost>
        <b>&lt;to>%mdc{txEmail}&lt;/to></b>
        &lt;from>&lt;/from>
        &lt;subject>Prime - %mdc{number}&lt;/subject>
    
        &lt;layout class="ch.qos.logback.classic.html.HTMLLayout">
           &lt;pattern>%date%level%logger{24}%msg&lt;/pattern>
        &lt;/layout>
    
        &lt;discriminator class="ch.qos.logback.classic.sift.MDCBasedDiscriminator">
          &lt;key>txId&lt;/key>
          &lt;defaultValue>default&lt;/defaultValue>
        &lt;/discriminator>
    
        &lt;evaluator class="ch.qos.logback.classic.boolex.JaninoEventEvaluator">
          &lt;expression>
            <b>(mdc != null &amp;amp;&amp;amp; mdc.get("txEmail") != null &amp;amp;&amp;amp; </b>
                <b>((String) mdc.get("txEmail")).contains("+log") )</b>
            &amp;amp;&amp;amp;
            (marker != null  &amp;&amp; marker.contains("SMTP_TRIGGER") )
          &lt;/expression>
        &lt;/evaluator>
      &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="SMTP" /> 
      &lt;/root>
    &lt;/configuration>  </pre>
    
         <p>If your particular SMTP server does not handle address tags,
         you can still use them within the evaluator but remove them in
         the recipient address with the help of the <a
         href="../manual/layouts.html#replace">%replace</a> conversion
         word. Here is the relevant configuration snippet:</p>
    
         <pre class="prettyprint source">&lt;appender name="SMTP" class="ch.qos.logback.classic.net.SMTPAppender">
      &lt;to>%replace(%mdc{txEmail}){'\+log', ''}&lt;/to>
      ...
    &lt;/appender></pre>
    
         <p>This replaces any occurrence of the string "+log" within the
         string returned by %mdc{txEmail} with the empty string,
         effectively erasing +log from the recipient address.</p>
    
         <h3>Buffer management in very busy systems</h3>
    
         <p>The solution described so far provides an amazingly flexible
         solution to the initial problem. Indeed, any QA-engineer at
         Fooware.com, say Carol, can have the logs generated by requests
         she makes to Buscrit sent to her automatically by email. All she
         has to do is to suffix the user part in her email address with
         "+log" when she registers with Buscrit.
         </p>
    
         <p>By default <code>SMTPAppender</code> will cap the number of
         buffers it maintains to the value of the <span
         class="option">maxNumberOfBuffers</span> option (64 by default)
         and automatically discards buffers untouched for at least 30
         minutes. While this approach will work nicely in a test
         environment with few transactions, in a very busy production
         system, these buffer management mechanisms will cause Carol to
         receive <a
         href="../manual/appenders.html#bufferManagement">truncated log
         buffers</a>.  </p>
    
         <p>To deal with this problem, we instruct SMTPAppender to discard
         apprioate buffer at the end of each transaction. This is done by
         logging an event marked as "FINALIZE_SESSION". Here is a modified
         version of <code>PrimeAction</code> which marks the end of a
         transaction with "FINALIZE_SESSION".
         </p>
    
         <pre class="prettyprint source">package ch.qos.logback.demo.prime;
    
    <b>import static ch.qos.logback.classic.ClassicConstants.FINALIZE_SESSION_MARKER;</b>
    
    public class PrimeAction extends Action {
    
      Logger logger = LoggerFactory.getLogger(PrimeAction.class);
      static Marker SMTP_TRIGGER = MarkerFactory.getMarker("SMTP_TRIGGER");
      static {
         // markers can hold references to other markers
         <b>SMTP_TRIGGER.add(FINALIZE_SESSION_MARKER);</b>
      }
    
      public ActionForward execute(ActionMapping actionMapping, ... ) throws Exception {
    
        Long number = form.getNumber();
        try {
          ...
        } finally {
          <b>logger.info(SMTP_TRIGGER, "Prime computation ended");</b>
          MDC.put("txId", null); // clear txId asap to avoid accidental rebirth
        }
      }
    } </pre>
    
    
       <p>Not that at the end of each transaction the appropriate buffer
       is discarded, we can increase the value of <span
       class="option">maxNumberOfBuffers</span> as shown in the next
       configuration file..
       </p>
    
       <pre class="prettyprint   source">&lt;configuration scan="true" scanPeriod="3 seconds">
    
      &lt;statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" /&gt;
    
      &lt;appender name="SMTP" class="ch.qos.logback.classic.net.SMTPAppender">
        &lt;SMTPHost>NAME_OF_SMTP_HOST&lt;/SMTPHost>
        &lt;to>%mdc{txEmail}&lt;/to>
        &lt;from>&lt;/from>
        &lt;subject>Prime - %mdc{number}&lt;/subject>
    
        &lt;layout class="ch.qos.logback.classic.html.HTMLLayout">
           &lt;pattern>%date%level%logger{24}%msg&lt;/pattern>
        &lt;/layout>
    
        &lt;discriminator class="ch.qos.logback.classic.sift.MDCBasedDiscriminator">
          &lt;key>txId&lt;/key>
          &lt;defaultValue>default&lt;/defaultValue>
        &lt;/discriminator>
    
        <b>&lt;cyclicBufferTracker class="ch.qos.logback.core.spi.CyclicBufferTracker"></b>
          <b>&lt;maxNumberOfBuffers>512&lt;/maxNumberOfBuffers></b>
        <b>&lt;/cyclicBufferTracker></b>
    
        &lt;evaluator class="ch.qos.logback.classic.boolex.JaninoEventEvaluator">
          &lt;expression>
            (mdc != null &amp;amp;&amp;amp; mdc.get("txEmail") != null &amp;amp;&amp;amp;
                ((String) mdc.get("txEmail")).contains("+log") )
            &amp;amp;&amp;amp;
            (marker != null  &amp;&amp; marker.contains("SMTP_TRIGGER") )
          &lt;/expression>
        &lt;/evaluator>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="SMTP" /> 
      &lt;/root>
    &lt;/configuration>  </pre>
    
        <p>With these latest changes, we can selectively send isolated
        logs for selected transactions to the concerned recipient, even in
        very busy production systems without excessive memory consumption.
        </p>
    
         <script src="../templates/footer.js" type="text/javascript"></script>	
        </div>
      </body>
    </html>
     ������������������������������������������������������������logback_1.0.13/docs/support.html��������������������������������������������������������������������0000644�0001750�0001750�00000003677�12143164240�016520� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Professional support</title>
        <link rel="stylesheet" type="text/css" href="css/common.css" />
        <link rel="stylesheet" type="text/css" href="css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="css/_print.css" media="print" />
        
      </head>
      <body>
        <script type="text/javascript">prefix='';</script>
        
        <script src="templates/header.js"  type="text/javascript"></script>
        <div id="left">
          <script src="templates/left.js"  type="text/javascript"></script>
        </div>
        <div id="content">
          
        <h2>Professional Support</h2>
    
        <p>Although the quality of support in the various open source
        project mailing lists is quite good, these are operated on a
        best-effort basis. If you require authoritative responses and
        guaranteed response times, then you should consider our
        professional support package.
        </p>
    
        <p>As the founders and/or current maintainers of the slf4j, log4j,
        logback and <a href="http://cal10n.qos.ch/">cal10n</a> projects,
        we can offer you timely and competent support. Choosing our
        professional support service is a good way to leverage our
        expertise. Moreover, if you require custom development we are
        likely to be of help.
        </p>
    
        <p>For more information about Professional Support do not hesitate
        to contact us. We will be happy to discuss your needs.</p>
        
        <table>
          <tr>
            <td>email:</td>
            <td><img align="left" src="images/helpEMAIL.gif" alt=""/></td>
          </tr>
          <tr>
            <td>telephone:</td>
            <td> +41 21 312 32 26</td>
          </tr>
        </table> 
        
        </div>
    
      </body>
    </html>�����������������������������������������������������������������logback_1.0.13/docs/job.html������������������������������������������������������������������������0000644�0001750�0001750�00000005116�12143164237�015552� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=utf-8" />
        <title>Carrer at QOS.ch</title>
        <link rel="stylesheet" type="text/css" href="css/common.css" />
        <link rel="stylesheet" type="text/css" href="css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="css/_print.css" media="print" />
    
        <script type="text/javascript">
    
          var _gaq = _gaq || [];
          _gaq.push(['_setAccount', 'UA-9228687-3']);
          _gaq.push(['_trackPageview']);
    
          (function() {
          var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
          ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
          var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
          })();
        </script>
    
      </head>
      <body>
        <script type="text/javascript">prefix='';</script>
        <script src="templates/header.js" type="text/javascript"></script>
        <div id="left">
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="templates/left.js" type="text/javascript"></script>
        </div>
    
        <div id="content">
    		
    
    		<h2>Software developer</h2>
    
        <p>QOS.ch or Quality Open Software is a software development
        company based in Lausanne, Switzerland.</p>
        
        <p>We have extensive experience building mission-critical
        enterprise software in the Java language. We are also founding
        contributors of several open source projects, namely log4j, slf4j,
        mistletoe, cal10n and logback.
        </p>
    
        <p>We are looking for software engineers with superb software
        development skills.
        </p>
    
        <h3>Required qualifications</h3>
    
        <ul>
          <li>University graduate</li> 
          
          <li>Strong analytical skills</li> 
          
          <li>Good experience in object-oriented programming, preferably
          Java</li>
    
        </ul>
        
        <p>We offer excellent working conditions with many opportunities
        to improve your software development skills.
        </p>
    
        <script type="text/javascript">
    AAT = '@';
    DOOTT = '.';
    document.write('<p>Please send your application by email to <b>hr'+ AAT +'qos'+ DOOTT+'ch</b>. If applicable, ');
    document.write('do not forget to include a list of software projects to which you have contributed.</p>') 
        </script>
    
        </div>
      </body>
    </html>��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/mailinglist.html����������������������������������������������������������������0000644�0001750�0001750�00000011207�12143164240�017304� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Mailing lists</title>
        
        <link rel="stylesheet" type="text/css" href="css/common.css" />
        <link rel="stylesheet" type="text/css" href="css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="css/_print.css" media="print" />
      </head>
      <body>
        <script  type="text/javascript">prefix='';</script>
    
        <script src="templates/header.js"  type="text/javascript"></script>
        <div id="left">
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="templates/left.js"  type="text/javascript"></script>
        </div>
        <div id="content">
    	
        <h2>Project Mailing Lists</h2>
    
    		<p>A mailing list is an electronic discussion forum that anyone
    		can subscribe to. When someone sends an email message to the
    		mailing list, a copy of that message is broadcast to everyone who
    		is subscribed to that mailing list. Mailing lists provide a simple
    		and effective communication mechanism. With potentially thousands
    		of subscribers, there is a common set of <a
    		href="http://www.shakthimaan.com/downloads/glv/presentations/mailing-list-etiquette.pdf">etiquette
    		guidelines</a> that you should observe.
    		</p>
    
        <h3>Respect the mailing list type</h3>
    		
        <p>The "User" lists are where you can send questions and comments
        about configuration, setup, usage and other "user" types of
        questions. The "Developer" lists are where you can send questions and
        comments about the actual software source code and other issues
        related to development.
    		</p>
    
        <p>Some questions are appropriate for posting on both the "user"
        and the "developer" lists. In this case, pick one and only one. Do
        not cross post.
    		</p>
    
        <p><span class="label notice">Note</span> <b>Only subscribers can
        post to the logback-user and logback-dev mailing lists.</b> If you
        are subscribed and your posts bounce, make sure that the address
        you post from matches your subscription address.</p>
    
    		<table class="bodyTable">
    			<tr class="a">
    				<th>Name</th>
    				<th>Volume</th>
    				<th>Subscribe</th>
    				<th>Unsubscribe</th>
    				<th>Archives</th>
    			</tr>
    			<tr class="b">
    				<td>QOS.ch announce List</td>
    				<td>Low</td>
    				<td>
    					<a
    						href="http://qos.ch/mailman/listinfo/announce">
    						Subscribe
    					</a>
    				</td>
    				<td>
    					<a
    						href="http://qos.ch/mailman/options/announce">
    						Unsubscribe
    					</a>
    				</td>
    				<td>
    					<a
    						href="http://www.qos.ch/pipermail/announce/">
    						qos.ch
    					</a> 
    				</td>
    			</tr>
    			<tr class="a">
    				<td>Logback User List</td>
    				<td>Medium</td>
    				<td>
    					<a
    						href="http://qos.ch/mailman/listinfo/logback-user">
    						Subscribe
    					</a>
    				</td>
    				<td>
    					<a
    						href="http://qos.ch/mailman/options/logback-user">
    						Unsubscribe
    					</a> 
    				</td>
    				<td>
    					<a
    						href="http://www.qos.ch/pipermail/logback-user/">
    						qos.ch
    					</a> |
    					<a
    						href="http://marc.theaimsgroup.com/?l=logback-user">
    						MARC
    					</a> |
    
    					<a
    						href="http://www.nabble.com/Logback-User-f16252.html">
    						Nabble
    					</a>
    				</td>
    			</tr>
    			<tr class="b">
    				<td>Logback Dev List</td>
    				<td>Medium</td>
    				<td>
    					<a
    						href="http://qos.ch/mailman/listinfo/logback-dev">
    						Subscribe
    					</a>
    				</td>
    				<td>
    					<a
    						href="http://qos.ch/mailman/options/logback-dev">
    						Unsubscribe
    					</a> 
    				</td>
    				<td>
    					<a
    						href="http://www.qos.ch/pipermail/logback-dev/">
    						qos.ch
    					</a> |
    					<a
    						href="http://marc.theaimsgroup.com/?l=logback-dev">
    						MARC
    					</a> |
    					<a
    						href="http://www.nabble.com/Logback-Dev-f16253.html">
    						Nabble
    					</a>
    				</td>
    			</tr>
    
          <tr>
            <td>Logback Notifications List</td>
            <td>High</td>
    				<td>
    					<a
    						href="http://qos.ch/mailman/listinfo/logback-notification">
    						Subscribe
    					</a>
    				</td>
            <td>
              <a
    						href="http://qos.ch/mailman/options/logback-notification">
    						Unsubscribe
    					</a> 
    				</td>
            <td>
              <a
    						href="http://www.qos.ch/pipermail/logback-notification/">
    						qos.ch
    					</a>
            </td>
          </tr>
    
    		</table>
    
       <p>&nbsp;</p>
    
    	
      <script src="templates/footer.js" type="text/javascript"></script>
    </div>
    </body>
    </html>
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/manual/�������������������������������������������������������������������������0000755�0001750�0001750�00000000000�12203357067�015366� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/manual/index.html���������������������������������������������������������������0000644�0001750�0001750�00000010227�12143164240�017355� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Logback Manual</title>
        
        <link rel="stylesheet" type="text/css" href="../css/common.css" />
        <link rel="stylesheet" type="text/css" href="../css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="../css/_print.css" media="print" />
        
      </head>
      <body>
        <script type="text/javascript">prefix='../';</script>
        <script src="../templates/header.js" type="text/javascript"></script>
        <div id="left">
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="../templates/left.js" type="text/javascript"></script>
        </div>
        <div id="right">
          <script src="menu.js" type="text/javascript"></script>
        </div>
        <div id="content">
          
        <h2>The logback manual</h2>
    
    
        <p>The complete logback manual documents the latest version of
        logback framework. In over 150 pages and dozens of concrete
        examples, it covers both basic and advanced logback features, including:
        </p>
    
    
        <div>
          <ul>
            <li><p>the overall logback architecture</p></li>
            <li><p>discussion of best logback practices and anti-patterns</p></li>
            <li><p>logback configuration scripts in XML format</p></li>
            <li><p>appenders</p></li>
            <li><p>encoders</p></li>
            <li><p>layouts</p></li>
            <li><p>filters</p></li>
            <li><p>mapped diagnostic contexts</p></li>
            <li><p>Joran, logback's configuration system</p></li>
          </ul>
        </div>
    
      
        <p>The logback manual describes the logback API in considerable
        detail, including its features and design rationale. Authored by
        Ceki G&#252;lc&#252; and S&#233;bastien Pennec, the main
        contributors to the logback project, the logback manual is
        intended for developers already familiar with the Java language
        but new to logback, as much as for experienced logback users. With
        the aid of introductory material and many examples, new users
        should quickly come up to speed.
        </p>
    
      
        
        <div>
          <p>Without further ado, here are the contents of the manual:</p>
          
          <ul>
            <li><p>
              <a href="introduction.html"><b>Chapter 1: Introduction to logback</b></a>
            </p></li>
            <li><p>
              <a href="architecture.html"><b>Chapter 2: Architecture</b></a>
            </p></li>
            <li><p>
              <a href="configuration.html"><b>Chapter 3: Configuration</b></a>
            </p></li>
            
            <li><p>
              <a href="appenders.html"><b>Chapter 4: Appenders</b></a>
            </p></li>
          
            <li><p><a href="encoders.html"><b>Chapter 5:
            Encoders</b></a></p>
            </li>
      
            <li><p>
              <a href="layouts.html"><b>Chapter 6: Layouts</b></a>
            </p></li>
    
            <li><p>
              <a href="filters.html"><b>Chapter 7: Filters</b></a>
            </p></li>
            
            <li><p>
              <a href="mdc.html"><b>Chapter 8: Mapped Diagnostic Contexts</b></a>
            </p></li>
    
            <li><p>
              <a href="loggingSeparation.html"><b>Chapter 9: Logging Separation</b></a>
            </p></li>
            
            <li><p>
              <a href="jmxConfig.html"><b>Chapter 10: JMX Configurator</b></a>
            </p></li>
    
            <li><p>
              <a href="onJoran.html"><b>Chapter 11: Joran</b></a>
            </p></li>
    
            <li><p><a href="groovy.html"><b>Chapter 12: Groovy
            Configuration</b></a></p></li>
    
            <li><p>
              <a href="migrationFromLog4j.html"><b>Chapter 13: Migration from log4j</b></a>
            </p></li>
    
            <li><p>
              <a href="receivers.html"><b>Chapter 14: Receivers</b></a>
            </p></li>
    
            <li><p>
              <a href="usingSSL.html"><b>Chapter 15: Using SSL</b></a>
            </p></li>
    
          </ul>
        </div>
    
        <script src="../templates/footer.js" type="text/javascript"></script>
        </div>
      </body>
    </html>
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/manual/architecture.html��������������������������������������������������������0000644�0001750�0001750�00000104447�12143164240�020740� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Chapter 2: Architecture</title>
        <link rel="stylesheet" type="text/css" href="../css/common.css" />
        <link rel="stylesheet" type="text/css" href="../css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="../css/_print.css" media="print" />
        <link rel="stylesheet" type="text/css" href="../css/prettify.css" media="screen" />
      </head>
      <body onload="prettyPrint()">
        <script type="text/javascript">prefix='../';</script>
        <script type="text/javascript" src="../js/prettify.js"></script>
        <script type="text/javascript" src="../templates/header.js"></script>
        <div id="left">
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="../templates/left.js" type="text/javascript"></script>
        </div>
        <div id="right">
          <script src="menu.js" type="text/javascript"></script>
        </div>
        <div id="content">
    
       <h1>Chapter 2: Architecture</h1>
    
       <div class="quote">
          <p><em>All true classification is genealogical.</em></p>
          <p>&mdash;CHARLES DARWIN, <em>The Origin of Species</em></p>
    
          <p><em>It is difficult, if not impossible, for anyone to learn a
          subject purely by reading about it, without applying the
          information to specific problems and thereby forcing himself to
          think about what has been read. Furthermore, we all learn best
          the things that we have discovered ourselves.</em>
          </p>
          <p>&mdash;DONALD KNUTH, <em>The Art of Computer Programming</em></p>
       </div>
    
    
       <script src="../templates/creative.js" type="text/javascript"></script>
    
        <h2>Logback's architecture</h2>
    
        <p>Logback's basic architecture is sufficiently generic so as to
        apply under different circumstances. At the present time, logback
        is divided into three modules, logback-core, logback-classic and
        logback-access.
        </p>
    
        <p>The <em>core</em> module lays the groundwork for the other two
        modules.  The <em>classic</em> module extends <em>core</em>. The
        classic module corresponds to a significantly improved version of
        log4j. Logback-classic natively implements the <a
        href="http://www.slf4j.org">SLF4J API</a> so that you can readily
        switch back and forth between logback and other logging systems
        such as log4j or java.util.logging (JUL) introduced in JDK
        1.4. The third module called <em>access</em> integrates with
        Servlet containers to provide HTTP-access log functionality. A
        separate document covers <a href="../access.html">access module
        documentation</a>.
        </p>
    
        <p>In the remainder of this document, we will write "logback" to
        refer to the logback-classic module.
        </p>
        
    		<h2>Logger, Appenders and Layouts</h2>
    		
    		<p>Logback is built upon three main classes: <code>Logger</code>,
    		<code>Appender</code> and <code>Layout</code>. These three types
    		of components work together to enable developers to log messages
    		according to message type and level, and to control at runtime how
    		these messages are formatted and where they are reported.
    		</p>
    
    		<p>The <code>Logger</code> class is part of the logback-classic
    		module. On the other hand, the <code>Appender</code> and
    		<code>Layout</code> interfaces are part of logback-core. As a
    		general-purpose module, logback-core has no notion of
    		loggers.
    		</p>
        
        <h3><a name="LoggerContext" href="#LoggerContext"><span
        class="anchor"/></a>Logger context</h3>
    
    		<p>The first and foremost advantage of any logging API over plain
    		<code>System.out.println</code> resides in its ability to disable
    		certain log statements while allowing others to print
    		unhindered. This capability assumes that the logging space, that
    		is, the space of all possible logging statements, is categorized
    		according to some developer-chosen criteria.  In logback-classic,
    		this categorization is an inherent part of loggers.  Every single
    		logger is attached to a <code>LoggerContext</code> which is
    		responsible for manufacturing loggers as well as arranging them in
    		a tree like hierarchy.
    		</p>
    			
    		<p>Loggers are named entities. Their names are case-sensitive and
    		they follow the hierarchical naming rule:
    		</p>
    
    		<div class="definition">
    			<div class="deftitle">Named Hierarchy</div>
    			<p>
    				A logger is said to be an ancestor of another logger if
    				its name followed by a dot is a prefix of the descendant
    				logger name. A logger is said to be a parent of a child
    				logger if there are no ancestors between itself and the
    				descendant logger.
    			</p>
    		</div>
    
    		<p>For example, the logger named <code>"com.foo"</code> is a
    		parent of the logger named <code>"com.foo.Bar"</code>.  Similarly,
    		<code>"java"</code> is a parent of <code>"java.util"</code> and an
    		ancestor of <code>"java.util.Vector"</code>.  This naming scheme
    		should be familiar to most developers.
    		</p>
    
    		<p>The root logger resides at the top of the logger hierarchy.  It
    		is exceptional in that it is part of every hierarchy at its
    		inception. Like every logger, it can be retrieved by its name, as
    		follows:
    		</p>
    		
        <pre class="prettyprint source">Logger rootLogger = LoggerFactory.getLogger(<a
        href="http://www.slf4j.org/apidocs/constant-values.html#org.slf4j.Logger.ROOT_LOGGER_NAME">org.slf4j.Logger.ROOT_LOGGER_NAME</a>);</pre>
    
    		<p>All other loggers are also retrieved with the class static
    		<code>getLogger</code> method found in the <a
    		href="http://www.slf4j.org/api/org/slf4j/Logger.html">org.slf4j.LoggerFactory</a>
    		class. This method takes the name of the desired logger as a
    		parameter. Some of the basic methods in the <code>Logger</code>
    		interface are listed below.
    		</p>
    
    		<pre class="prettyprint source">package org.slf4j; 
    public interface Logger {
    
      // Printing methods: 
      public void trace(String message);
      public void debug(String message);
      public void info(String message); 
      public void warn(String message); 
      public void error(String message); 
    }</pre>
    
    
    
        <h3><a name="effectiveLevel" href="#effectiveLevel"><span
        class="anchor"/></a>Effective Level aka Level Inheritance
        </h3>
    
    		<p>Loggers may be assigned levels. The set of possible levels
    		(TRACE, DEBUG, INFO, WARN and ERROR) are defined in the
    		<code>ch.qos.logback.classic.Level</code> class. Note that in
    		logback, the <code>Level</code> class is final and cannot be
    		sub-classed, as a much more flexible approach exists in the form
    		of <code>Marker</code> objects.
    		</p>
    
    		<p>If a given logger is not assigned a level, then it inherits one
    		from its closest ancestor with an assigned level. More formally:
    		</p>
    
    		<div class="definition">
    		
          
    			<p>The effective level for a given logger <em>L</em>, is equal
    			to the first non-null level in its hierarchy, starting at
    			<em>L</em> itself and proceeding upwards in the hierarchy
    			towards the root logger.
    			</p>
    		</div>
    	
    		<p>To ensure that all loggers can eventually inherit a level, the
    		root logger always has an assigned level. By default, this level
    		is DEBUG.
    		</p>
    
    		<p>Below are four examples with various assigned level values and
    		the resulting effective (inherited) levels according to the level
    		inheritance rule.
    		</p>
    
    		<em>Example 1</em>
    		<table class="bodyTable">
    			<tr>
    				<th>Logger name</th>
    				<th>Assigned level</th>
    				<th>Effective level</th>
    			</tr>
    			<tr class="alt">
    				<td>root</td>
    				<td>DEBUG</td>
    				<td>DEBUG</td>
    		  </tr>
    			<tr>
    				<td>X</td>
    				<td>none</td>
    				<td>DEBUG</td>
    		  </tr>
    
    			<tr class="alt">
    				<td>X.Y</td>
    				<td>none</td>
    				<td>DEBUG</td>
    		  </tr>
    			<tr>
    				<td>X.Y.Z</td>
    				<td>none</td>
    				<td>DEBUG</td>
    		  </tr>
      </table>
    
    		<p> In example 1 above, only the root logger is assigned a level.
    		This level value, <code>DEBUG</code>, is inherited by the other
    		loggers <code>X</code>, <code>X.Y</code> and <code>X.Y.Z</code>
    		</p>
    
    		<em>Example 2</em>
    		<table class="bodyTable">
    			<tr>
    				<th>Logger name</th>
    				<th>Assigned level</th>
    				<th>Effective level</th>
    			</tr>
    			<tr class="alt" align="left">
    				<td>root</td>
    				<td>ERROR</td>
    				<td>ERROR</td>
    			</tr>
    			<tr align="left">
    				<td>X</td>
    				<td>INFO</td>
    				<td>INFO</td>
    			</tr>
    
    			<tr class="alt" align="left">
    				<td>X.Y</td>
    				<td>DEBUG</td>
    				<td>DEBUG</td>
    			</tr>
    			<tr align="left">
    				<td>X.Y.Z</td>
    				<td>WARN</td>
    				<td>WARN</td>
    			</tr>
    		</table>
    
    		<p>In example 2 above, all loggers have an assigned level value.
    		Level inheritance does not come into play.
    		</p>
    
    		<em>Example 3</em>
    		<table class="bodyTable">
    			<tr>
    				<th>Logger name</th>
    				<th>Assigned level</th>
    				<th>Effective level</th>
    			</tr>
    			<tr class="alt" align="left">
    				<td>root</td>
    				<td>DEBUG</td>
    				<td>DEBUG</td>
    			</tr>
    
    			<tr align="left">
    				<td>X</td>
    				<td>INFO</td>
    				<td>INFO</td>
    			</tr>
    			<tr class="alt" align="left">
    				<td>X.Y</td>
    				<td>none</td>
    				<td>INFO</td>
    			</tr>
    			<tr align="left">
    				<td>X.Y.Z</td>
    				<td>ERROR</td>
    				<td>ERROR</td>
    			</tr>
    		</table>
    
    		<p>In example 3 above, the loggers <code>root</code>,
    		<code>X</code> and <code>X.Y.Z</code> are assigned the levels
    		<code>DEBUG</code>, <code>INFO</code> and <code>ERROR</code>
    		respectively. Logger <code>X.Y</code> inherits its level value
    		from its parent <code>X</code>.
    		</p>
    
    		<em>Example 4</em>
    		<table class="bodyTable">
    
    			<tr>
    				<th>Logger name</th>
    				<th>Assigned level</th>
    				<th>Effective level</th>
    			</tr>
    			<tr class="alt" align="left">
    				<td>root</td>
    				<td>DEBUG</td>
    				<td>DEBUG</td>
    			</tr>
    
    			<tr align="left">
    				<td>X</td>
    				<td>INFO</td>
    				<td>INFO</td>
    			</tr>
    			<tr class="alt" align="left">
    				<td>X.Y</td>
    				<td>none</td>
    				<td>INFO</td>
    			</tr>
    			<tr align="left">
    				<td>X.Y.Z</td>
    				<td>none</td>
    				<td>INFO</td>
    			</tr>
    		</table>
    
       
    		<p>In example 4 above, the loggers <code>root</code> and
    		<code>X</code> and are assigned the levels <code>DEBUG</code> and
    		<code>INFO</code> respectively. The loggers <code>X.Y</code> and
    		<code>X.Y.Z</code> inherit their level value from their nearest
    		parent <code>X</code>, which has an assigned level.
    		</p>
    
        <h3><a name="basic_selection" href="#basic_selection"><span
        class="anchor"/></a>Printing methods and the basic selection
        rule</h3>
    
    		<p>By definition, the printing method determines the level of a
    		logging request. For example, if <code>L</code> is a logger
    		instance, then the statement <code>L.info("..")</code> is a
    		logging statement of level INFO.
    		</p>
    		
        
        <p>A logging request is said to be <em>enabled</em> if its level
        is higher than or equal to the effective level of its
        logger. Otherwise, the request is said to be <em>disabled</em>. As
        described previously, a logger without an assigned level will
        inherit one from its nearest ancestor. This rule is summarized
        below.
      </p>
    
         
    		<div class="definition">
    			<div class="deftitle">Basic Selection Rule</div>
    
    			<p>A log request of level <em>p</em> issued to a logger having
    			an effective level <em>q</em>, is enabled if
    			<em>p&nbsp;&gt;=&nbsp;q</em>.
    			</p>
    		</div>
    
    		<p>This rule is at the heart of logback. It assumes that levels
    		are ordered as follows:
    		<code>TRACE&nbsp;&lt;&nbsp;DEBUG&nbsp;&lt;&nbsp;INFO&nbsp;&lt;
    		&nbsp;WARN&nbsp;&lt;&nbsp;ERROR</code>.
    		</p>
    				
    		<p>In a more graphic way, here is how the selection rule works. In
    		the following table, the vertical header shows the level of
    		the logging request, designated by <em>p</em>, while the
    		horizontal header shows effective level of the logger, designated
    		by <em>q</em>. The intersection of the rows (level request) and
    		columns (effective level) is the boolean resulting from the basic
    		selection rule.
    		</p>
    		
    		<table width="80%">
          <tr> 
            <td class="lgray_bg" rowspan="2">level of <br/>request <em>p</em></td>
    				<td style="border-top: 1px solid #DDDDDD;"
            align="center" colspan="6">effective level <em>q</em></td>
    			</tr>
    			<tr align="left">
    				<th  style="border-bottom: 1px solid #DDDDDD;">TRACE</th>
    				<th  style="border-bottom: 1px solid #DDDDDD;">DEBUG</th>
    				<th  style="border-bottom: 1px solid #DDDDDD;">INFO</th>
    				<th  style="border-bottom: 1px solid #DDDDDD;">WARN</th>
    				<th  style="border-bottom: 1px solid #DDDDDD;">ERROR</th>	
            <th  style="border-bottom: 1px solid #DDDDDD;">OFF</th>    			
    			</tr>
    			<tr align="left" >
    				<th class="lgray_bg">TRACE</th>
    				<td><span class="greenBold">YES</span></td>
    				<td><span class="redBold">NO</span></td>
    				<td><span class="redBold">NO</span></td>
    				<td><span class="redBold">NO</span></td>
    				<td><span class="redBold">NO</span></td>
            <td><span class="redBold">NO</span></td>
    			</tr>
    
    			<tr align="left">
    				<th class="lgray_bg">DEBUG</th>
    				<td><span class="greenBold">YES</span></td>
    				<td><span class="greenBold">YES</span></td>
    				<td><span class="redBold">NO</span></td>
    				<td><span class="redBold">NO</span></td>
    				<td><span class="redBold">NO</span></td>
            <td><span class="redBold">NO</span></td>
    			</tr>
    			<tr align="left" >
    				<th class="lgray_bg">INFO</th>
    				<td><span class="greenBold">YES</span></td>
    				<td><span class="greenBold">YES</span></td>
    				<td><span class="greenBold">YES</span></td>
    				<td><span class="redBold">NO</span></td>
    				<td><span class="redBold">NO</span></td>
            <td><span class="redBold">NO</span></td>
    			</tr>
    			<tr align="left" >
    				<th class="lgray_bg">WARN</th>
    				<td><span class="greenBold">YES</span></td>
    				<td><span class="greenBold">YES</span></td>
    				<td><span class="greenBold">YES</span></td>
    				<td><span class="greenBold">YES</span></td>
    				<td><span class="redBold">NO</span></td>
            <td><span class="redBold">NO</span></td>
    			</tr>
    			<tr align="left" >
    				<th class="lgray_bg">ERROR</th>
    				<td><span class="greenBold">YES</span></td>
    				<td><span class="greenBold">YES</span></td>
    				<td><span class="greenBold">YES</span></td>
    				<td><span class="greenBold">YES</span></td>
    				<td><span class="greenBold">YES</span></td>
            <td><span class="redBold">NO</span></td>
    			</tr>		
    		</table>
    		
    		<p>Here is an example of the basic selection rule.</p>
    
    		<pre class="prettyprint source">import ch.qos.logback.classic.Level;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    ....
    
    // get a logger instance named "com.foo". Let us further assume that the
    // logger is of type  ch.qos.logback.classic.Logger so that we can
    // set its level
    ch.qos.logback.classic.Logger logger = 
            (ch.qos.logback.classic.Logger) LoggerFactory.getLogger("com.foo");
    //set its Level to <span class="blue">INFO</span>. The setLevel() method requires a logback logger
    logger.setLevel(Level. <span class="blue">INFO</span>);
    
    Logger barlogger = LoggerFactory.getLogger("com.foo.Bar");
    
    // This request is enabled, because <span class="green bold">WARN</span> &gt;= <span class="blue">INFO</span>
    logger.<span class="green bold">warn</span>("Low fuel level.");
    
    // This request is disabled, because <span class="green bold">DEBUG</span> &lt; <span class="blue">INFO</span>. 
    logger.<span class="green bold">debug</span>("Starting search for nearest gas station.");
    
    // The logger instance barlogger, named "com.foo.Bar", 
    // will inherit its level from the logger named 
    // "com.foo" Thus, the following request is enabled 
    // because <span class="green bold">INFO</span> &gt;= <span class="blue">INFO</span>. 
    barlogger.<span class="green bold">info</span>("Located nearest gas station.");
    
    // This request is disabled, because <span class="green bold">DEBUG</span> &lt; <span class="blue">INFO</span>. 
    barlogger.<span class="green bold">debug</span>("Exiting gas station search");</pre>
    
        <a name="RetrievingLoggers"></a>
    		<h3>Retrieving Loggers</h3>
    		<p>
    			Calling the <code><a href="../apidocs/org/slf4j/LoggerFactory.html#getLogger(java.lang.String)">LoggerFactory.getLogger</a></code>
    			method with the same name will always return a reference to
    			the exact same logger object.
    		</p>
    
    		<p>For example, in</p>
    		<pre class="prettyprint source">Logger x = LoggerFactory.getLogger("wombat"); 
    Logger y = LoggerFactory.getLogger("wombat");</pre>
    
    		<p>
    			<code>x</code> and <code>y</code> refer to
    			<em>exactly</em> the same logger object.
    		</p>
    
    		<p>Thus, it is possible to configure a logger and then to retrieve
    		the same instance somewhere else in the code without passing
    		around references. In fundamental contradiction to biological
    		parenthood, where parents always precede their children, logback
    		loggers can be created and configured in any order. In particular,
    		a "parent" logger will find and link to its descendants even if it
    		is instantiated after them.
    		</p>
    		<p>Configuration of the logback environment is typically done at
    		application initialization. The preferred way is by reading a
    		configuration file. This approach will be discussed shortly.
    		</p>
    		<p>Logback makes it easy to name loggers by <em>software
    		component</em>.  This can be accomplished by instantiating a
    		logger in each class, with the logger name equal to the fully
    		qualified name of the class. This is a useful and straightforward
    		method of defining loggers. As the log output bears the name of
    		the generating logger, this naming strategy makes it easy to
    		identify the origin of a log message. However, this is only one
    		possible, albeit common, strategy for naming loggers. Logback does
    		not restrict the possible set of loggers. As a developer, you are
    		free to name loggers as you wish.
    		</p>
    
    		<p>Nevertheless, naming loggers after the class where they are
    		located seems to be the best general strategy known so far.
    		</p>
    
        <a name="AppendersAndLayouts"></a>
        <h3>Appenders and Layouts</h3>
    
    		<p>The ability to selectively enable or disable logging requests
    		based on their logger is only part of the picture.  Logback allows
    		logging requests to print to multiple destinations. In logback
    		speak, an output destination is called an appender. Currently,
    		appenders exist for the console, files, remote socket servers, to
    		MySQL, PostgreSQL, Oracle and other databases, JMS, and remote
    		UNIX Syslog daemons.
    
          <!--It is also possible to log asynchronously. -->
    		</p>
    
    		<p>More than one appender can be attached to a logger.</p>
    
        <p>The <code><a
        href="../apidocs/ch/qos/logback/classic/Logger.html#addAppender(ch.qos.logback.core.Appender)">addAppender</a></code>
        method adds an appender to a given logger.  Each enabled logging
        request for a given logger will be forwarded to all the appenders
        in that logger as well as the appenders higher in the
        hierarchy. In other words, appenders are inherited additively from
        the logger hierarchy. For example, if a console appender is added
        to the root logger, then all enabled logging requests will at
        least print on the console. If in addition a file appender is
        added to a logger, say <em>L</em>, then enabled logging requests
        for <em>L</em> and <em>L</em>'s children will print on a file
        <em>and</em> on the console.  It is possible to override this
        default behavior so that appender accumulation is no longer
        additive by setting the additivity flag of a logger to false.
    		</p>
    
    		<p>The rules governing appender additivity are summarized below.
    		</p>
    		<div class="definition">
    
    			<h4 class="deftitle"><a name="additivity"
    			href="#additivity"><span class="anchor"/></a>Appender
    			Additivity</h4>
    
    			<p>The output of a log statement of logger <em>L</em> will go to
    			all the appenders in <em>L</em> and its ancestors. This is the
    			meaning of the term "appender additivity".
    			</p>
    
    			<p>However, if an ancestor of logger <em>L</em>, say <em>P</em>,
    			has the additivity flag set to false, then <em>L</em>'s output
    			will be directed to all the appenders in <em>L</em> and its
    			ancestors up to and including <em>P</em> but not the appenders in
    			any of the ancestors of <em>P</em>.
    			</p>
    
    			<p>Loggers have their additivity flag set to true by default.
    			</p>
    
    		</div>
    		The table below shows an example:
    
    		<table class="bodyTable">
    			<tr>
    				<th>Logger Name</th>
    				<th>Attached Appenders</th>
    				<th>Additivity Flag</th>
    				<th>Output Targets</th>
    				<th>Comment</th>
    			</tr>
    			<tr>
    				<td>root</td>
    				<td>A1</td>
    				<td>not applicable</td>
    				<td>A1</td>
    
    				<td>Since the root logger stands at the top of the logger
    				hierarchy, the additivity flag does not apply to it.
    				</td>
    			</tr>
    			<tr class="alt">
    				<td>x</td>
    				<td>A-x1, A-x2</td>
    				<td>true</td>
    				<td>A1, A-x1, A-x2</td>
    				<td>Appenders of "x" and of root.</td>
    			</tr>
    			<tr>
    				<td>x.y</td>
    				<td>none</td>
    				<td>true</td>
    				<td>A1, A-x1, A-x2</td>
    				<td>Appenders of "x" and of root.</td>
    			</tr>
    			<tr class="alt">
    				<td>x.y.z</td>
    				<td>A-xyz1</td>
    				<td>true</td>
    				<td>A1, A-x1, A-x2, A-xyz1</td>
    				<td>Appenders of "x.y.z", "x" and of root.</td>
    			</tr>
    			<tr>
    				<td>security</td>
    				<td>A-sec</td>
    				<td class="blue"><span class="blue">false</span></td>
    				<td>A-sec</td>
    
    				<td>
    					No appender accumulation since the additivity flag is set to
    					<code>false</code>. Only appender A-sec will be used.
    				</td>
    			</tr>
    			<tr class="alt">
    				<td>security.access</td>
    				<td>none</td>
    				<td>true</td>				
            <td>A-sec</td>
    				<td>
    					Only appenders of "security" because the additivity
    					flag in "security" is set to
    					<code>false</code>.
    				</td>
    			</tr>
    		</table>
    
    
    		<p>More often than not, users wish to customize not only the
    		output destination but also the output format. This is
    		accomplished by associating a <em>layout</em> with an
    		appender. The layout is responsible for formatting the logging
    		request according to the user's wishes, whereas an appender takes
    		care of sending the formatted output to its destination. The
    		<code>PatternLayout</code>, part of the standard logback
    		distribution, lets the user specify the output format according to
    		conversion patterns similar to the C language <code>printf</code>
    		function.
    		</p>
    
    		<p>For example, the PatternLayout with the conversion pattern
    		"%-4relative [%thread] %-5level %logger{32} - %msg%n" will output
    		something akin to:
    		</p>
    
    		<div class="prettyprint source"><pre>176  [main] DEBUG manual.architecture.HelloWorld2 - Hello world.</pre></div>
    
    		<p>The first field is the number of milliseconds elapsed since the
    		start of the program. The second field is the thread making the
    		log request. The third field is the level of the log request. The
    		fourth field is the name of the logger associated with the log
    		request. The text after the '-' is the message of the request.
    		</p>
    
    
    		<h3><a name="parametrized" href="#parametrized"><span
    		class="anchor"/></a>Parameterized logging</h3>
    
    		<p>Given that loggers in logback-classic implement the <a
    		href="http://www.slf4j.org/api/org/slf4j/Logger.html">SLF4J's
    		Logger interface</a>, certain printing methods admit more than one
    		parameter. These printing method variants are mainly intended to
    		improve performance while minimizing the impact on the readability
    		of the code.
    		</p>
    
    		<p>For some Logger <code>logger</code>, writing,</p>
    
    		<pre class="prettyprint source">logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));</pre>
    
    		<p>incurs the cost of constructing the message parameter, that is
    		converting both integer <code>i</code> and <code>entry[i]</code>
    		to a String, and concatenating intermediate strings. This is
    		regardless of whether the message will be logged or not.
    		</p>
    
    		<p>One possible way to avoid the cost of parameter construction is
    		by surrounding the log statement with a test. Here is an example.
    		</p>
    
    		<pre class="prettyprint source">if(logger.isDebugEnabled()) { 
      logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
    }</pre>
    
    
    		<p>This way you will not incur the cost of parameter construction
    		if debugging is disabled for <code>logger</code>.  On the other
    		hand, if the logger is enabled for the DEBUG level, you will incur
    		the cost of evaluating whether the logger is enabled or not,
    		twice: once in <code>debugEnabled</code> and once in
    		<code>debug</code>.  In practice, this overhead is insignificant
    		because evaluating a logger takes less than 1% of the time it
    		takes to actually log a request.
    		</p>
    
    		<h4>Better alternative</h4>
    
    		<p>There exists a convenient alternative based on message
    		formats. Assuming <code>entry</code> is an object, you can write:
    		</p>
    
    
    		<pre class="prettyprint source">Object entry = new SomeObject(); 
    logger.debug("The entry is {}.", entry);</pre>
    
    		<p>Only after evaluating whether to log or not, and only if the decision
    		is positive, will the logger implementation format the message and
    		replace the '{}' pair with the string value of <code>entry</code>.
    		In other words, this form does not incur the cost of parameter
    		construction when the log statement is disabled.
    		</p>
    
    
    		<p>The following two lines will yield the exact same output.
    		However, in case of a <em>disabled</em> logging statement, the
    		second variant will outperform the first variant by a factor of at
    		least 30.
    		</p>
    
    		<pre class="prettyprint source">logger.debug("The new entry is "+entry+".");
    logger.debug("The new entry is {}.", entry);</pre>
    
    
    		<p>A two argument variant is also available. For example, you can
    		write:
    		</p>
    
    		<pre class="prettyprint source">logger.debug("The new entry is {}. It replaces {}.", entry, oldEntry);</pre>
    
    		<p>If three or more arguments need to be passed, an
    		<code>Object[]</code> variant is also available. For example, you
    		can write:
    		</p>
    
    
    		<pre class="prettyprint source">Object[] paramArray = {newVal, below, above};
    logger.debug("Value {} was inserted between {} and {}.", paramArray);</pre>
    
      
      <a name="UnderTheHood"></a>
      <h3>A peek under the hood</h3>
    
      <p>After we have introduced the essential logback components, we are
      now ready to describe the steps that the logback framework takes
      when the user invokes a logger's printing method. Let us now analyze
      the steps logback takes when the user invokes the
      <code>info()</code> method of a logger named <em>com.wombat</em>.
      </p>
    
      <h4>1. Get the filter chain decision</h4>
    
      <p>If it exists, the <code>TurboFilter</code> chain is
      invoked. Turbo filters can set a context-wide threshold, or filter
      out certain events based on information such as <code>Marker</code>,
      <code>Level</code>, <code>Logger</code>, message, or the
      <code>Throwable</code> that are associated with each logging
      request.  If the reply of the filter chain is
      <code>FilterReply.DENY</code>, then the logging request is
      dropped. If it is <code>FilterReply.NEUTRAL</code>, then we continue
      with the next step, i.e. step 2. In case the reply is
      <code>FilterReply.ACCEPT</code>, we skip the next and directly jump
      to step 3.
      </p>
    
      <h4>2. Apply the <a href="#basic_selection">basic selection
      rule</a></h4>
    
      <p>At this step, logback compares the effective level of the logger
      with the level of the request. If the logging request is disabled
      according to this test, then logback will drop the request without
      further processing. Otherwise, it proceeds to the next step.
      </p>
    
      <h4>3. Create a <code>LoggingEvent</code> object</h4>
    
      <p>If the request survived the previous filters, logback will
      create a <code>ch.qos.logback.classic.LoggingEvent</code> object
      containing all the relevant parameters of the request, such as the
      logger of the request, the request level, the message itself, the
      exception that might have been passed along with the request, the
      current time, the current thread, various data about the class that
      issued the logging request and the <code>MDC</code>. Note that some
      of these fields are initialized lazily, that is only when they are
      actually needed. The <code>MDC</code> is used to decorate the
      logging request with additional contextual information. MDC is
      discussed in a <a href="mdc.html">subsequent chapter</a>.</p>
    
      <h4>4. Invoking appenders</h4>
    
      <p>After the creation of a <code>LoggingEvent</code> object, logback
      will invoke the <code>doAppend()</code> methods of all the
      applicable appenders, that is, the appenders inherited from the
      logger context.
      </p>
    
      <p>All appenders shipped with the logback distribution extend the
      <code>AppenderBase</code> abstract class that implements the
      <code>doAppend</code> method in a synchronized block ensuring
      thread-safety.  The <code>doAppend()</code> method of
      <code>AppenderBase</code> also invokes custom filters attached to
      the appender, if any such filters exist.  Custom filters, which can
      be dynamically attached to any appender, are presented in a <a
      href="filters.html">separate chapter</a>.
      </p>
    
      <h4>5. Formatting the output</h4>
    
      <p>It is responsibility of the invoked appender to format the
      logging event. However, some (but not all) appenders delegate the
      task of formatting the logging event to a layout. A layout formats
      the <code>LoggingEvent</code> instance and returns the result as a
      String. Note that some appenders, such as the
      <code>SocketAppender</code>, do not transform the logging event into
      a string but serialize it instead.  Consequently, they do not
      have nor require a layout.
      </p>
    
      <h4>6. Sending out the <code>LoggingEvent</code></h4>
    
      <p>After the logging event is fully formatted it is sent to its
      destination by each appender.
      </p>
      
      <p>
        Here is a sequence UML diagram to show how everything works. You might
        want to click on the image to display its bigger version.
      </p>
    
      <a href="underTheHood.html">
        <img src="images/chapters/architecture/underTheHoodSequence2_small.gif" 
             alt="underTheHoodSequence2_small.gif"/>
      </a>
    
      
      <h3><a name="performance" href="#performance"><span
      class="anchor"/></a>Performance</h3>
    
      <p>One of the often-cited arguments against logging is its
      computational cost.  This is a legitimate concern as even
      moderately-sized applications can generate thousands of log
      requests. Much of our development effort is spent measuring and
      tweaking logback's performance.  Independently of these efforts, the
      user should still be aware of the following performance issues.
      </p>
    
      <h4>1. Logging performance when logging is turned off entirely</h4>
    
      <p>You can turn off logging entirely by setting the level of the
      root logger to <code>Level.OFF</code>, the highest possible level.
      When logging is turned off entirely, the cost of a log request
      consists of a method invocation plus an integer comparison. On a
      3.2Ghz Pentium D machine this cost is typically around 20
      nanoseconds.
      </p>
    
      <p>However, any method invocation involves the "hidden" cost of
      parameter construction.  For example, for some logger <em>x</em>
      writing,
      </p>
      
      <pre class="prettyprint source">x.debug("Entry number: " + i + "is " + entry[i]);</pre>
    
      <p>incurs the cost of constructing the message parameter,
      i.e. converting both integer <code>i</code> and
      <code>entry[i]</code> to a string, and concatenating intermediate
      strings, regardless of whether the message will be logged or not.
      </p>
    
      <p>The cost of parameter construction can be quite high and depends
      on the size of the parameters involved. To avoid the cost of
      parameter construction you can take advantage of SLF4J's parameterized
      logging:
      </p>
    
      <pre class="prettyprint source">x.debug("Entry number: {} is {}", i, entry[i]);</pre>
    
      <p>This variant will not incur the cost of parameter
      construction. Compared to the previous call to the
      <code>debug()</code> method, it will be faster by a wide margin.
      The message will be formatted only if the logging request is to be
      sent to attached appenders. Moreover, the component that formats
      messages is highly optimized.
      </p>
    
      <p>Notwithstanding the above placing log statements in tight loops,
      i.e. very frequently invoked code, is a lose-lose proposal, likely
      to result in degraded performance.  Logging in tight loops will slow
      down your application even if logging is turned off, and if logging
      is turned on, will generate massive (and hence useless) output.
      </p>
    
      <h4>2. The performance of deciding whether to log or not to log when
      logging is turned on.</h4>
    
      <p>In logback, there is no need to walk the logger hierarchy. A
      logger knows its effective level (that is, its level, once level
      inheritance has been taken into consideration) when it is
      created. Should the level of a parent logger be changed, then all
      child loggers are contacted to take notice of the change. Thus,
      before accepting or denying a request based on the effective level,
      the logger can make a quasi-instantaneous decision, without needing
      to consult its ancestors.
      </p>
    
    
      <h4>3. Actual logging (formatting and writing to the output device)</h4>
    
      <p>This is the cost of formatting the log output and sending it to
      its target destination. Here again, a serious effort was made to
      make layouts (formatters) perform as quickly as possible.  The same
      is true for appenders. The typical cost of actually logging is about
      9 to 12 microseconds when logging to a file on the local machine.
      It goes up to several milliseconds when logging to a database on a
      remote server.
      </p>
    
      <p>Although feature-rich, one of the foremost design goals of
      logback was speed of execution, a requirement which is second only
      to reliability. Some logback components have been rewritten several
      times to improve performance.
      </p>
    
        
      <script src="../templates/footer.js" type="text/javascript"></script>
    </div>
    </body>
    </html>
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/manual/menu.js������������������������������������������������������������������0000644�0001750�0001750�00000002746�12143164240�016671� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
    document.write('<p class="menu_header">Chapter Index</p>')
    document.write('<p class="menu"><a href="introduction.html"><b>Ch1: Introduction to logback</b></a></p>');
    document.write('<p class="menu"><a href="architecture.html"><b>Ch2: Architecture</b></a></p>');
    document.write('<p class="menu"><a href="configuration.html"><b>Ch3: Configuration</b></a></p>');
    document.write('<p class="menu"><a href="appenders.html"><b>Ch4: Appenders</b></a></p>');
    document.write('<p class="menu"><a href="encoders.html"><b>Ch5: Encoders</b></a></p>');
    document.write('<p class="menu"><a href="layouts.html"><b>Ch6: Layouts</b></a></p>');
    document.write('<p class="menu"><a href="filters.html"><b>Ch7: Filters</b></a></p>');
    document.write('<p class="menu"><a href="mdc.html"><b>Ch8: Mapped Diagnostic Contexts</b></a></p>');
    document.write('<p class="menu"><a href="loggingSeparation.html"><b>Ch9: Logging Separation</b></a></p>');
    document.write('<p class="menu"><a href="jmxConfig.html"><b>Ch10: JMX Configurator</b></a></p>');
    document.write('<p class="menu"><a href="onJoran.html"><b>Ch11: Joran</b></a></p>');
    document.write('<p class="menu"><a href="groovy.html"><b>Ch12: Groovy Configuration</b></a></p>');
    document.write('<p class="menu"><a href="migrationFromLog4j.html"><b>Ch13: Migration from log4j</b></a></p>');
    document.write('<p class="menu"><a href="receivers.html"><b>Ch14: Receivers</b></a></p>');
    document.write('<p class="menu"><a href="usingSSL.html"><b>Ch15: Using SSL</b></a></p>');
    ��������������������������logback_1.0.13/docs/manual/configuration.html�������������������������������������������������������0000644�0001750�0001750�00000240566�12143164240�021130� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Chapter 3: Configuration</title>
        
        <link rel="stylesheet" type="text/css" href="../css/common.css" />
        <link rel="stylesheet" type="text/css" href="../css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="../css/_print.css" media="print" />
        <link rel="stylesheet" type="text/css" href="../css/prettify.css" media="screen" />
    
      </head>
      <body onload="prettyPrint()">
    
        <script type="text/javascript">prefix='../'</script>
        <script type="text/javascript" src="../js/prettify.js"></script>
        <script src="../templates/header.js" type="text/javascript"></script>
        <script type="text/javascript" src="../js/dsl.js"></script>
        <div id="left">
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="../templates/left.js" type="text/javascript"></script>
        </div>
        <div id="right">
          <script src="menu.js" type="text/javascript"></script>
        </div>
        <div id="content" class="chapter">
          
          <h1>Chapter 3: Logback configuration</h1>
          
        <div class="quote">
          <p><em>In symbols one observes an advantage in discovery which
          is greatest when they express the exact nature of a thing
          briefly and, as it were, picture it; then indeed the labor of
          thought is wonderfully diminished.</em>
          </p>
          <p>&mdash;GOTTFRIED WILHELM LEIBNIZ</p>
        </div>
    
    
        <script src="../templates/creative.js" type="text/javascript"></script>
    
    
        <p>We start by presenting ways for configuring logback, with many
        example configuration scripts.  Joran, the configuration framework
        upon which logback relies will be presented in <a
        href="onJoran.html">a later chapter</a>.
        </p>
    
    
        <h2><a name="auto_configuration" href="#auto_configuration"><span
        class="anchor"/></a>Configuration in logback</h2>
        
        <p>Inserting log requests into the application code requires a
        fair amount of planning and effort. Observation shows that
        approximately four percent of code is dedicated to
        logging. Consequently, even a moderately sized application will
        contain thousands of logging statements embedded within its
        code. Given their number, we need tools to manage these log
        statements.
        </p>
    
        <p>Logback can be configured either programmatically or with a
        configuration script expressed in XML or Groovy format. By the
        way, existing log4j users can convert their
        <em>log4j.properties</em> files to <em>logback.xml</em> using our
        <a
        href="http://logback.qos.ch/translator/">PropertiesTranslator</a>
        web-application.
        </p>
    
        <p>Let us begin by discussing the initialization steps that
        logback follows to try to configure itself:
        </p>
    
        <ol>
          <li>
            <p>Logback tries to find a file called
            <em>logback.groovy</em> <a
            href="../faq.html#configFileLocation">in the
            classpath</a>.</p>
          </li>
    
          <li>
            <p>If no such file is found, logback tries to find a file
            called <em>logback-test.xml</em> <a
            href="../faq.html#configFileLocation">in the
            classpath</a>.</p>
          </li>
    
          <li><p>If no such file is found, it checks for the file
          <em>logback.xml</em>  <a
            href="../faq.html#configFileLocation">in the
            classpath</a>..</p>
          </li>
          
          <li><p>If neither file is found, logback configures itself
          automatically using the <a
          href="../xref/ch/qos/logback/classic/BasicConfigurator.html"><code>BasicConfigurator</code></a>
          which will cause logging output to be directed to the console.
          </p> 
          </li> 
    
        </ol>
    
        <p>The fourth and last step is meant to provide a default (but
        very basic) logging functionality in the absence of a
        configuration file.
        </p>
    
    
        <p>If you are using Maven and if you place the
        <em>logback-test.xml</em> under the
        <em>src/test/resources</em> folder, Maven will ensure that it
        won't be included in the artifact produced. Thus, you can use a
        different configuration file, namely <em>logback-test.xml</em>
        during testing, and another file, namely, <em>logback.xml</em>, in
        production. The same principle applies by analogy for Ant.
        </p>
    
    
        <h3><a name="automaticConf" href="#automaticConf"><span
        class="anchor"/></a>Automatically configuring logback</h3>
    
        <p>The simplest way to configure logback is by letting logback
        fall back to its default configuration. Let us give a taste of how
        this is done in an imaginary application called
        <code>MyApp1</code>.
        </p>
    
        <p class="example">Example: Simple example of
        <code>BasicConfigurator</code> usage <a
        href="../xref/chapters/configuration/MyApp1.html">(logback-examples/src/main/java/chapters/configuration/MyApp1.java)</a></p>
    
        <pre class="prettyprint source">package manual.configuration;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    public class MyApp1 {
      final static Logger logger = LoggerFactory.getLogger(MyApp1.class);
    
      public static void main(String[] args) {
        logger.info("Entering application.");
    
        Foo foo = new Foo();
        foo.doIt();
        logger.info("Exiting application.");
      }
    }</pre>
    
      <p>This class defines a static logger variable. It then instantiates
      a <code>Foo</code> object. The <code>Foo</code> class is listed
      below:
      </p>
    
      <p class="example">Example: Small class doing logging 
      <a href="../xref/chapters/configuration/Foo.html">(logback-examples/src/main/java/chapters/configuration/Foo.java)</a>
      </p>
    
      <pre class="prettyprint source">package chapters.configuration;
      
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
       
    public class Foo {
      static final Logger logger = LoggerFactory.getLogger(Foo.class);
      
      public void doIt() {
        logger.debug("Did it again!");
      }
    }</pre>
    
    
        <p>In order to run the examples in this chapter, you need to make
        sure that certain jar files are present on the class path.  Please
        refer to the <a href="../setup.html">setup page</a> for further
        details.
        </p>
    
        <p>Assuming the configuration files <em>logback-test.xml</em> or
        <em>logback.xml</em> are not present, logback will default to
        invoking <a
        href="../xref/ch/qos/logback/classic/BasicConfigurator.html"><code>BasicConfigurator</code></a>
        which will set up a minimal configuration. This minimal
        configuration consists of a <code>ConsoleAppender</code> attached
        to the root logger.  The output is formatted using a
        <code>PatternLayoutEncoder</code> set to the pattern
        <em>%d{HH:mm:ss.SSS}&nbsp;[%thread]&nbsp;%-5level&nbsp;%logger{36}&nbsp;-&nbsp;%msg%n</em>. Moreover,
        by default the root logger is assigned the <code>DEBUG</code>
        level.
        </p>
    
        <p>Thus, the output of the command <em>java chapters.configuration.MyApp1</em>
        should be similar to:
        </p>
    
        <p class="source">16:06:09.031 [main] INFO  chapters.configuration.MyApp1 - Entering application.
    16:06:09.046 [main] DEBUG chapters.configuration.Foo - Did it again!
    16:06:09.046 [main] INFO  chapters.configuration.MyApp1 - Exiting application.</p>
    
    
       <p class="highlight">Except code that configures logback (if such
       code exists) client code does not need to depend on
       logback. Applications that use logback as their logging framework
       will have a compile-time dependency on SLF4J but not logback.
       </p>
    
       <p>The <code>MyApp1</code> application links to logback via calls
       to <code>org.slf4j.LoggerFactory</code> and
       <code>org.slf4j.Logger</code> classes, retrieve the loggers it
       wishes to use, and chugs on.  Note that the only dependencies of
       the <code>Foo</code> class on logback are through
       <code>org.slf4j.LoggerFactory</code> and
       <code>org.slf4j.Logger</code> imports.  Except code that configures
       logback (if such code exists) client code does not need to depend
       on logback. Since SLF4J permits the use of any logging
       framework under its abstraction layer, it is easy to migrate
       large bodies of code from one logging framework to another.
       </p>
    
       <h3>Automatic configuration with <em>logback-test.xml</em> or
       <em>logback.xml</em></h3>
    
       <p>As mentioned earlier, logback will try to configure itself using
       the files <em>logback-test.xml</em> or <em>logback.xml</em> if
       found on the class path. Here is a configuration file equivalent to
       the one established by <code>BasicConfigurator</code> we've just
       seen.
       </p>
    
       <p class="example">Example: Basic configuration file
       (logback-examples/src/main/java/chapters/configuration/sample0.xml)</p>
       <span class="asGroovy" onclick="return asGroovy('sample0');">View as .groovy</span>
    
    
      <pre id="sample0" class="prettyprint source">&lt;configuration>
    
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        &lt;!-- encoders are assigned the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
        &lt;encoder>
          &lt;pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;root level="debug">
        &lt;appender-ref ref="STDOUT" />
      &lt;/root>
    &lt;/configuration></pre>
    
       <p>After you have renamed <em>sample0.xml</em> as
       <em>logback.xml</em> (or <em>logback-test.xml</em>) place it into a
       directory accessible from the class path. Running the <em>MyApp1</em>
       application should give identical results to its previous run.</p>
    
       <h4><a name="automaticStatusPrinting"
       href="#automaticStatusPrinting"><span class="anchor"/></a>Automatic
       printing of status messages in case of warning or errors</h4>
    
       <p class="highlight">If warning or errors occur during the parsing
       of the configuration file, logback will automatically print its
       internal status messages on the console.</p>
     
       <p>If warnings or errors occur during the parsing of the
       configuration file, logback will automatically print its internal
       status data on the console. Note that to avoid duplication,
       automatic status printing is disabled if the user explicitly
       registers a status listener (defined below).</p>
    
       <p>In the absence of warnings or errors, if you still wish to
       inspect logback's internal status, then you can instruct logback to
       print status data by invoking the <code>print()</code> of the
       <code>StatusPrinter</code> class. The <em>MyApp2</em> application
       shown below is identical to <em>MyApp1</em> except for the addition
       of two lines of code for printing internal status data.</p>
    
        <p class="example">Example: Print logback's internal status
        information <a
        href="../xref/chapters/configuration/MyApp2.html">(logback-examples/src/main/java/chapters/configuration/MyApp2.java)</a></p>
    
      
    <pre class="prettyprint lang-java source">
      public static void main(String[] args) {
        // assume SLF4J is bound to logback in the current environment
        <b>LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();</b>
        // print logback's internal status
        <b>StatusPrinter.print(lc);</b>
        ...
      }</pre>
    
      <p>If everything goes well, you should see the following output on the console</p>
    
       <div class="source longline"><pre>17:44:58,578 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback-test.xml]
    17:44:58,671 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - debug attribute not set
    17:44:58,671 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
    17:44:58,687 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [STDOUT]
    17:44:58,812 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Popping appender named [STDOUT] from the object stack
    17:44:58,812 |-INFO in ch.qos.logback.classic.joran.action.LevelAction - root level set to DEBUG
    17:44:58,812 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [STDOUT] to Logger[root]
    
    17:44:58.828 [main] INFO  chapters.configuration.MyApp2 - Entering application.
    17:44:58.828 [main] DEBUG chapters.configuration.Foo - Did it again!
    17:44:58.828 [main] INFO  chapters.configuration.MyApp2 - Exiting application.
    </pre></div>
    
      <p>At the end of this output, you can recognize the lines that were
      printed in the previous example. You should also notice the
      logback's internal messages, a.k.a. <code>Status</code> objects,
      which allow convenient access to logback's internal state.
      </p>
    
       <p>Instead of invoking <code>StatusPrinter</code> programmatically
       from your code, you can instruct the configuration file to dump
       status data, even in the absence of errors. To achieve this, you
       need to set the <span class="attr">debug</span> attribute of the
       <em>configuration</em> element, i.e. the top-most element in the
       configuration file, as shown below. Please note that this <span
       class="attr">debug</span> attribute relates only to the status
       data. It does <em>not</em> affect logback's configuration
       otherwise, in particular with respect to logger levels. (If you are
       asking, no, the root logger will <em>not</em> be set to
       <code>DEBUG</code>.)
       </p>
    
    
       <p class="example">Example: Basic configuration file using debug
       mode
       (logback-examples/src/main/java/chapters/configuration/sample1.xml)</p>
       <span class="asGroovy" onclick="return asGroovy('sample1');">View as .groovy</span>
    
       <pre id="sample1" class="prettyprint source">
    &lt;configuration <span class="big bold">debug="true"</span>> 
    
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
        &lt;!-- encoders are  by default assigned the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
        &lt;encoder>
          &lt;pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;root level="debug">
        &lt;appender-ref ref="STDOUT" />
      &lt;/root>
    &lt;/configuration></pre>
      
       <p>Setting the <code>debug</code> attribute within the
       &lt;configuration&gt; element will output status information,
       assuming that:
       </p>
       <ol>
         <li>the configuration file is found</li>
         <li>the configuration file is well-formed XML.</li>
       </ol>
         
       <p>If any of these two conditions is not fulfilled, Joran cannot
       interpret the <span class="attr">debug</span> attribute since the
       configuration file cannot be read. If the configuration file is
       found but is malformed, then logback will detect the error
       condition and automatically print its internal status on the
       console. However, if the configuration file cannot be found,
       logback will not automatically print its status data, since this is
       not necessarily an error condition. Programmatically invoking
       <code>StatusPrinter.print()</code> as shown in the <a
       href="../xref/chapters/configuration/MyApp2.html"><em>MyApp2</em></a>
       application above ensures that status information is printed in
       every case.</p>
    
     
       <p><span class="label">Forcing status output</span> In the absence
       of status messages, tracking down a rogue <em>logback.xml</em>
       configuration file can be difficult, especially in production where
       the application source cannot be easily modified. To help identify
       the location of a rogue configuration file, you can set a
       <code>StatusListener</code> via the "logback.statusListenerClass"
       system property (<a href="#logback.statusLC">defined below</a>) to
       force output of status messages. The "logback.statusListenerClass"
       system property can also be used to silence output automatically
       generated in case of errors.
       </p>
    
       <h3><a name="configFileProperty" href="#configFileProperty"><span
       class="anchor"/></a>Specifying the location of the default
       configuration file as a system property</h3>
    
       <p>You may specify the location of the default configuration file
       with a system property named
       <code>"logback.configurationFile"</code>. The value of this
       property can be a URL, a resource on the class path or a path to a
       file external to the application.
       </p>
    
       <p class="source">java <b>-Dlogback.configurationFile=/path/to/config.xml</b> chapters.configuration.MyApp1</p>
    
       <p>Note that the file extension must be ".xml" or ".groovy". Other
       extensions are ignored. <a href="#logback.statusLC">Explicitly
       registering a status listener</a> may help debugging issues
       locating the configuration file.</p>
    
    
       <h3><a name="autoScan" href="#autoScan"><span
       class="anchor"/></a>Automatically reloading configuration file upon
       modification</h3>
    
       <p class="highlight">Logback-classic can scan for changes in its
       configuration file and automatically reconfigure itself when the
       configuration file changes.</p>
    
       <p>If instructed to do so, logback-classic will scan for changes in
       its configuration file and automatically reconfigure itself when
       the configuration file changes. In order to instruct
       logback-classic to scan for changes in its configuration file and
       to automatically re-configure itself set the <span
       class="attr">scan</span> attribute of the
       <code>&lt;configuration></code> element to true, as shown next.
    
       </p>
      
       <p class="example">Example: Scanning for changes in configuration
       file and automatic re-configuration
       (logback-examples/src/main/java/chapters/configuration/scan1.xml)</p>
    
      <span class="asGroovy" onclick="return asGroovy('scan1');">View as .groovy</span>
    <pre id="scan1" class="prettyprint source">
    &lt;configuration <b>scan="true"</b>> 
      ... 
    &lt;/configuration> </pre>
    
    
       <p>By default, the configuration file will be scanned for changes
       once every minute. You can specify a different scanning period by
       setting the <span class="attr">scanPeriod</span> attribute of the
       <code>&lt;configuration></code> element. Values can be specified in
       units of milliseconds, seconds, minutes or hours. Here is an
       example:</p>
    
      <p class="example">Example: Specifying a different scanning period
      (logback-examples/src/main/java/chapters/configuration/scan2.xml)</p>
      <span class="asGroovy" onclick="return asGroovy('scan2');">View as .groovy</span>
      <pre id="scan2" class="prettyprint source">
    &lt;configuration scan="true" <b>scanPeriod="30 seconds"</b> > 
      ...
    &lt;/configuration> </pre>
    
       <p><span class="label">Note</span> If no unit of time is specified,
       then the unit of time is assumed to be milliseconds, which is
       usually inappropriate. If you change the default scanning period,
       do not forget to specify a time unit.
       </p>
    
       <p>Behind the scenes, when you set the scan attribute to true, a
       <code>TurboFilter</code> called <a
       href="../xref/ch/qos/logback/classic/turbo/ReconfigureOnChangeFilter.html">ReconfigureOnChangeFilter</a>
       will be installed. TurboFilters are described in a <a
       href="filters.html#TurboFilter">later chapter</a>. As a
       consequence, scanning is done "in-thread", that is any time a
       printing method of logger is invoked. For example, for a logger
       named <code>myLogger</code>, when you write
       "myLogger.debug("hello");", and if the scan attribute is set to
       true, then <code>ReconfigureOnChangeFilter</code> will be
       invoked. Moreover, the said filter will be invoked even if
       <code>myLogger</code> is disabled for the DEBUG level.
       </p>
    
       <p class="highlight">When a configuration file changes, it will be
       automatically reloaded but only after several logger invocations
       and after a delay determined by the scanning period.
       </p>
    
       <p>Given that <code>ReconfigureOnChangeFilter</code> is invoked
       every time <em>any</em> logger is invoked, regardless of logger
       level, <code>ReconfigureOnChangeFilter</code> is absolutely
       performance critical. So much so that in fact, the check whether
       the scan period has elapsed or not, is too costly in itself. In
       order to improve performance,
       <code>ReconfigureOnChangeFilter</code> is in reality "alive" only
       once every <em>N</em> logging operations.  Depending on how often
       your application logs, the value of <em>N</em> can be modified on
       the fly by logback. By default N is 16, although it can go as high
       as 2^16 (=&nbsp;65536) for CPU-intensive applications.
       </p>
       
       <p>In short, when a configuration file changes, it will be
       automatically reloaded but only after several logger invocations
       <em>and</em> after a delay determined by the scanning period.
       </p>
    
       
    
       <h3><a name="joranDirectly" href="#joranDirectly"><span
       class="anchor"/></a>Invoking <code>JoranConfigurator</code>
       directly</h3>
    
       <p>Logback relies on a configuration library called Joran, part of
       logback-core. Logback's default configuration mechanism invokes
       <code>JoranConfigurator</code> on the default configuration file it
       finds on the class path. If you wish to override logback's default
       configuration mechanism for whatever reason, you can do so by
       invoking <code>JoranConfigurator</code> directly. The next
       application, <em>MyApp3</em>, invokes JoranConfigurator on a
       configuration file passed as a parameter.</p>
       
       <p class="example">Example: Invoking <code>JoranConfigurator</code>
       directly <a
       href="../xref/chapters/configuration/MyApp3.html">(logback-examples/src/main/java/chapters/configuration/MyApp3.java)</a></p>
    
    <pre class="prettyprint source">package chapters.configuration;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.util.StatusPrinter;
    
    public class MyApp3 {
      final static Logger logger = LoggerFactory.getLogger(MyApp3.class);
    
      public static void main(String[] args) {
        // assume SLF4J is bound to logback in the current environment
        <b>LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();</b>
        
        <b>try {
          JoranConfigurator configurator = new JoranConfigurator();
          configurator.setContext(context);
          // Call context.reset() to clear any previous configuration, e.g. default 
          // configuration. For multi-step configuration, omit calling context.reset().
          context.reset(); 
          configurator.doConfigure(args[0]);
        } catch (JoranException je) {
          // StatusPrinter will handle this
        }
        StatusPrinter.printInCaseOfErrorsOrWarnings(context);</b>
    
        logger.info("Entering application.");
    
        Foo foo = new Foo();
        foo.doIt();
        logger.info("Exiting application.");
      }
    }</pre>
    
       <p>This application fetches the <code>LoggerContext</code>
       currently in effect, creates a new <code>JoranConfigurator</code>,
       sets the context on which it will operate, resets the logger
       context, and then finally asks the configurator to configure the
       context using the configuration file passed as a parameter to the
       application. Internal status data is printed in case of warnings or
       errors. Note that for multi-step configuration,
       <code>context.reset()</code> invocation should be omitted.</p>
    
       <h3><a name="viewingStatusMessages"
       href="#viewingStatusMessages"><span class="anchor"/></a>Viewing
       status messages
       </h3>
    
    
    
       <p>Logback collects its internal status data in a <code><a
       href="../xref/ch/qos/logback/core/status/StatusManager.html">StatusManager</a></code>
       object, accessible via the <code>LoggerContext</code>.
       </p>
    
       <p>Given a <code>StatusManager</code> you can access all the status
       data associated with a logback context. To keep memory usage at
       reasonable levels, the default <code>StatusManager</code>
       implementation stores the status messages in two separate parts:
       the header part and the tail part. The header part stores the first
       <em>H</em> status messages whereas the tail part stores the last
       <em>T</em> messages. At present time <em>H</em>=<em>T</em>=150,
       although these values may change in future releases.</p>
    
       <p>Logback-classic ships with a servlet called
       ViewStatusMessagesServlet. This servlet prints the contents of the
       <code>StatusManager</code> associated with the current
       <code>LoggerContext</code> as an HTML table. Here is sample output.
       </p>
       
       <a href="images/chapters/configuration/lbClassicStatus.jpg">
         <img src="images/chapters/configuration/lbClassicStatus.jpg" alt="click to enlarge" width="90%"/>
       </a>
    
       <p>To add this servlet to your web-application, add the following
       lines to its <em>WEB-INF/web.xml</em> file.</p>
    
       <pre class="prettyprint source">  &lt;servlet>
        &lt;servlet-name>ViewStatusMessages&lt;/servlet-name>
        &lt;servlet-class>ch.qos.logback.classic.ViewStatusMessagesServlet&lt;/servlet-class>
      &lt;/servlet>
    
      &lt;servlet-mapping>
        &lt;servlet-name>ViewStatusMessages&lt;/servlet-name>
        &lt;url-pattern>/lbClassicStatus&lt;/url-pattern>
      &lt;/servlet-mapping></pre>
       
       <p>The <code>ViewStatusMessages</code> servlet will be viewable at
       the URL <code>http://host/yourWebapp/lbClassicStatus</code>
       </p>
    
       <h3><a name="statusListener" href="#statusListener"><span
       class="anchor"/></a>Listening to status messages
       </h3>
    
       <p>You may also attach a <code>StatusListener</code> to a
       <code>StatusManager</code> so that you can take immediate action in
       response to status messages, especially to messages occurring after
       logback configuration. Registering a status listener is a
       convenient way to supervise logback's internal state without human
       intervention.
       </p>
    
       <p>Logback ships with a <code>StatusListener</code> implementation
       called <code><a
       href="../xref/ch/qos/logback/core/status/OnConsoleStatusListener.html">OnConsoleStatusListener</a></code>
       which, as its name indicates, prints all <em>new</em> incoming
       status messages on the console.
       </p>
    
       <p>Here is <a
       href="../xref/chapters/configuration/AddStatusListenerApp.html">sample
       code</a> to register an <code>OnConsoleStatusListener</code>
       instance with the StatusManager.
       </p>
    
       <pre class="prettyprint source">   LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); 
       StatusManager statusManager = lc.getStatusManager();
       OnConsoleStatusListener onConsoleListener = new OnConsoleStatusListener();
       statusManager.add(onConsoleListener);</pre>
    
       <p>Note that the registered status listener will only receive status
       events subsequent to its registration. It will not receive prior
       messages. Thus, it is usually a good idea to place status listener
       registration directives at top of the configuration file before
       other directives.</p>
    
       <p>It is also possible to register one or more status listeners
       within a configuration file. Here is an example.</p>
    
       <p class="example">Example: Registering a status listener
       (logback-examples/src/main/java/chapters/configuration/onConsoleStatusListener.xml)</p>
    
       <span class="asGroovy" onclick="return asGroovy('onConsoleStatusListener');">View as .groovy</span>
       <pre id="onConsoleStatusListener" class="prettyprint source">&lt;configuration>
      <b>&lt;statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" /></b>  
    
      ... the rest of the configuration file  
    &lt;/configuration></pre>
    
       <h3><a name="logback.statusLC" href="#logback.statusLC"><span
       class="anchor"/></a>"logback.statusListenerClass" system property
       </h3>
    
       <p>One may also register a status listener by setting the
       "logback.statusListenerClass" Java system property to the name of
       the listener class you wish to register. For example,
       </p>
    
       <p class="source">java <b>-Dlogback.statusListenerClass</b>=ch.qos.logback.core.status.OnConsoleStatusListener&nbsp;...</p>
       
       <p>Logback ships with several status listener implementations. <a
       href="../xref/ch/qos/logback/core/status/OnConsoleStatusListener.html">OnConsoleStatusListener</a>
       prints incoming status messages on the console, i.e. on
       System.out. <a
       href="../xref/ch/qos/logback/core/status/OnErrorConsoleStatusListener.html">OnErrorConsoleStatusListener</a>
       prints incoming status messages on System.err. <a
       href="../xref/ch/qos/logback/core/status/NopStatusListener.html">NopStatusListener</a>
       drops incoming status messages.</p>
       
    
       <p>Note that <a href="#automaticStatusPrinting">automatic status
       printing</a> (in case of errors) is disabled if any status listener
       is registered during configuration and in particular if the user
       specifies a status listener via the "logback.statusListenerClass"
       system. Thus, by setting <code>NopStatusListener</code> as a status
       listener, you can silence internal status printing altogether. </p>
       
       <p class="source">java <b>-Dlogback.statusListenerClass</b>=ch.qos.logback.core.status.NopStatusListener&nbsp;...</p>
    
       <h2><a name="syntax" href="#syntax"><span
       class="anchor"/></a>Configuration file syntax
       </h2>
    
       <p>As you have seen thus far in the manual with plenty of examples
       still to follow, logback allows you to redefine logging behavior
       without needing to recompile your code.  Indeed, you can easily
       configure logback so as to disable logging for certain parts of
       your application, or direct output to a UNIX Syslog daemon, to a
       database, to a log visualizer, or forward logging events to a
       remote logback server, which would log according to local server
       policy, for example by forwarding the log event to a second logback
       server.
       </p>
    	
       <p>The remainder of this section presents the syntax of
       configuration files. 
       </p>
    
       <p>As will be demonstrated over and over, the syntax of logback
       configuration files is extremely flexible. As such, it is not
       possible to specify the allowed syntax with a DTD file or an XML
       schema. Nevertheless, the very basic structure of the configuration
       file can be described as, <code>&lt;configuration></code> element,
       followed by zero or more <code>&lt;appender></code> elements,
       followed by zero or more <code>&lt;logger></code> elements,
       followed by at most one <code>&lt;root></code> element. The
       following diagram illustrates this basic structure.</p>
    
      
      <p align="left">
        <img src="images/chapters/configuration/basicSyntax.png" 
             alt="basic Syntax" title="Basic configuration file structure"/>
      </p>
    
    
        <p class="highlight">If you are unsure which case to use for a
        given tag name, just follow the <a
        href="http://en.wikipedia.org/wiki/CamelCase">camelCase
        convention</a> which is almost always the correct convention.</p>
    
        <h4><a name="caseSensitivity" href="#caseSensitivity"><span
        class="anchor"/></a>Case sensitivity of tag names</h4>
       
    
        <p>Since logback version 0.9.17, tag names pertaining to explicit
        rules are case insensitive.  For example, <code>&lt;logger></code>, <code>&lt;Logger></code> and
        <code>&lt;LOGGER></code> are valid configuration elements and will
        be interpreted in the same way. Note that XML well-formedness
        rules still apply, if you open a tag as <code>&lt;xyz></code> you
        must close it as <code>&lt;/xyz></code>, <code>&lt;/XyZ></code>
        will not work. As for <a href="onJoran.html#implicit">implicit
        rules</a>, tag names are case sensitive except for the first
        letter.  Thus, <code>&lt;xyz></code> and <code>&lt;Xyz></code> are
        equivalent but not <code>&lt;xYz></code>.  Implicit rules usually
        follow the <a href="http://en.wikipedia.org/wiki/CamelCase">camelCase</a>
        convention, common in the Java world. Since it is not
        easy to tell when a tag is associated with an explicit action and
        when it is associated with an implicit action, it is not trivial
        to say whether an XML tag is case-sensitive or insensitive with
        respect to the first letter. If you are unsure which case to use
        for a given tag name, just follow the camelCase convention which
        is almost always the correct convention.
        </p>
    
        <h4><a name="loggerElement" href="#loggerElement"><span
        class="anchor"/></a>Configuring loggers, or the
        <code>&lt;logger></code> element</h4>
    
        <p>At this point you should have at least some understanding of <a
        href="architecture.html#effectiveLevel">level inheritance</a> and
        the <a href="architecture.html#basic_selection">basic selection
        rule</a>. Otherwise, and unless you are an Egyptologist, logback
        configuration will be no more meaningful to you than are
        hieroglyphics.
        </p>
    
        <p>A logger is configured using the <code>&lt;logger></code>
        element. A <code>&lt;logger></code> element takes exactly one
        mandatory <span class="attr">name</span> attribute, an optional
        <span class="attr">level</span> attribute, and an optional <span
        class="attr">additivity</span> attribute, admitting the values
        <em>true</em> or <em>false</em>. The value of the <span
        class="attr">level</span> attribute admitting one of the
        case-insensitive string values TRACE, DEBUG, INFO, WARN, ERROR,
        ALL or OFF. The special case-insensitive value <em>INHERITED</em>,
        or its synonym <em>NULL</em>, will force the level of the logger
        to be inherited from higher up in the hierarchy. This comes in
        handy if you set the level of a logger and later decide that
        it should inherit its level.
        </p>
    
        <p class="highlight"> Note that unlike log4j, logback-classic does
        <em>not</em> close nor remove any previously referenced appenders
        when configuring a given logger.
        </p>
    
        <p>The <code>&lt;logger></code> element may contain zero or more
        <code>&lt;appender-ref></code> elements; each appender thus
        referenced is added to the named logger. Note that unlike log4j,
        logback-classic does <em>not</em> close nor remove any previously
        referenced appenders when configuring a given logger.
        </p>
    
    
    
       <h4><a name="rootElement" href="#rootElement"><span
       class="anchor"/></a>Configuring the root logger, or the
       <code>&lt;root></code> element</h4>
    
       <p>The <code>&lt;root></code> element configures the root
       logger. It supports a single attribute, namely the <span
       class="attr">level</span> attribute. It does not allow any other
       attributes because the additivity flag does not apply to the root
       logger.  Moreover, since the root logger is already named as
       "ROOT", it does not allow a name attribute either. The value of the
       level attribute can be one of the case-insensitive strings TRACE,
       DEBUG, INFO, WARN, ERROR, ALL or OFF. Note that the level of the
       root logger cannot be set to INHERITED or NULL.
       </p>
    
       <p class="highlight">Note that unlike log4j, logback-classic does
       <em>not</em> close nor remove any previously referenced appenders
       when configuring the root logger.</p>
    
       <p> Similarly to the <code>&lt;logger></code> element, the
       <code>&lt;root></code> element may contain zero or more
       <code>&lt;appender-ref></code> elements; each appender thus
       referenced is added to the root logger. Note that unlike log4j,
       logback-classic does <em>not</em> close nor remove any previously
       referenced appenders when configuring the root logger.  </p>
    
       <h4>Example</h4>
    
       <p>Setting the level of a logger or root logger is as simple as
       declaring it and setting its level, as the next example
       illustrates. Suppose we are no longer interested in seeing any
       DEBUG messages from any component belonging to the
       "chapters.configuration" package. The following configuration file
       shows how to achieve that.
       </p>
    
       <p class="example">Example: Setting the level of a logger
       (logback-examples/src/main/java/chapters/configuration/sample2.xml)</p>
    
       <span class="asGroovy" onclick="return asGroovy('sample2');">View as .groovy</span>
       <pre id="sample2" class="prettyprint source">&lt;configuration>
    
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        &lt;!-- encoders are assigned the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
        &lt;encoder>
          &lt;pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      <b>&lt;logger name="chapters.configuration" level="INFO"/></b>
    
      &lt;!-- Strictly speaking, the level attribute is not necessary since --&gt;
      &lt;!-- the level of the root level is set to DEBUG by default.       --&gt;
      &lt;root level="DEBUG">		
        &lt;appender-ref ref="STDOUT" />
      &lt;/root>  
      
    &lt;/configuration></pre>
    
      <p>When the above configuration file is given as argument to the
      <em>MyApp3</em> application, it will yield the following output:
      </p>
    
    <pre class="source">17:34:07.578 [main] INFO  chapters.configuration.MyApp3 - Entering application.
    17:34:07.578 [main] INFO  chapters.configuration.MyApp3 - Exiting application.</pre>
    
      <p>Note that the message of level DEBUG generated by the <a
      href="../xref/chapters/configuration/Foo.html">"chapters.configuration.Foo"</a>
      logger has been suppressed. See also the Foo class.</p>
    
      <p>You can configure the levels of as many loggers as you wish.  In
      the next configuration file, we set the level of the
      <em>chapters.configuration</em> logger to INFO but at the same time set the level
      of the <em>chapters.configuration.Foo</em> logger to <code>DEBUG</code>.
      </p>
    
      <p class="example">Example: Setting the level of multiple loggers
      (logback-examples/src/main/java/chapters/configuration/sample3.xml)</p>
      
      <span class="asGroovy" onclick="return asGroovy('sample3');">View as .groovy</span>
      <pre id="sample3" class="source prettyprint">&lt;configuration>
    
      &lt;appender name="STDOUT"
        class="ch.qos.logback.core.ConsoleAppender">
        &lt;encoder>
          &lt;pattern>
            %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
         &lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      <b>&lt;logger name="chapters.configuration" level="INFO" /></b>
      <b>&lt;logger name="chapters.configuration.Foo" level="DEBUG" /></b>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="STDOUT" />
      &lt;/root>
    
    &lt;/configuration></pre>
    
      <p>Running <code>MyApp3</code> with this configuration file will
      result in the following output on the console:
      </p>
    
    <p class="prettyprint source">17:39:27.593 [main] INFO  chapters.configuration.MyApp3 - Entering application.
    17:39:27.593 [main] DEBUG chapters.configuration.Foo - Did it again!
    17:39:27.593 [main] INFO  chapters.configuration.MyApp3 - Exiting application.</p>
    
       <p>The table below list the loggers and their levels, after
       <code>JoranConfigurator</code> has configured logback with the
       <em>sample3.xml</em> configuration file.
       </p>
    
       <table class="bodyTable">
         <tr>
           <th>Logger name</th>
           <th>Assigned Level</th>
           <th>Effective Level</th>
         </tr>
         <tr>
           <td>root</td>
           <td><code>DEBUG</code></td>
           <td><code>DEBUG</code></td>
         </tr>
         <tr class="alt">
           <td>chapters.configuration</td>
           <td><code>INFO</code></td>
           <td><code>INFO</code></td>
         </tr>
         <tr>
           <td>chapters.configuration.MyApp3</td>
           <td><code>null</code></td>
           <td><code>INFO</code></td>
         </tr>
         <tr class="alt">
           <td>chapters.configuration.Foo</td>
           <td><code>DEBUG</code></td>
           <td><code>DEBUG</code></td>
         </tr>
       </table>
    
      <p>It follows that the two logging statements of level
      <code>INFO</code> in the <code>MyApp3</code> class as well as the
      DEBUG messages in <code>Foo.doIt()</code> are all enabled. Note that
      the level of the root logger is always set to a non-null value,
      DEBUG by default.
      </p>
    
      <p>Let us note that the <a
      href="architecture.html#basic_selection">basic-selection rule</a>
      depends on the effective level of the logger being invoked, not the
      level of the logger where appenders are attached. Logback will first
      determine whether a logging statement is enabled or not, and if
      enabled, it will invoke the appenders found in the logger hierarchy,
      regardless of their level. The configuration file
      <em>sample4.xml</em> is a case in point:
      </p>
    
      <p class="example">Example: Logger level sample
      (logback-examples/src/main/java/chapters/configuration/sample4.xml)</p>
      <span class="asGroovy" onclick="return asGroovy('sample4');">View as .groovy</span>
      <pre id="sample4" class="prettyprint source">&lt;configuration>
    
      &lt;appender name="STDOUT"
       class="ch.qos.logback.core.ConsoleAppender">
       &lt;encoder>
         &lt;pattern>
            %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
          &lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      <b>&lt;logger name="chapters.configuration" level="INFO" /></b>
    
      &lt;!-- turn OFF all logging (children can override) -->
      &lt;root <b>level="OFF"</b>>
        &lt;appender-ref ref="STDOUT" />
      &lt;/root>
    
    &lt;/configuration></pre>
    
      <p>The following table lists the loggers and their levels after
      applying the <em>sample4.xml</em> configuration file.
      </p>
    
      <table class="bodyTable">
        <tr>
          <th>Logger name</th>
          <th>Assigned Level</th>
          <th>Effective Level</th>
        </tr>
        <tr>
          <td>root</td>
          <td><code>OFF</code></td>
          <td><code>OFF</code></td>
        </tr>
        <tr class="alt">
          <td>chapters.configuration</td>
          <td><code>INFO</code></td>
          <td><code>INFO</code></td>
        </tr>
        <tr>
          <td>chapters.configuration.MyApp3</td>
          <td><code>null</code></td>
          <td><code>INFO</code></td>
        </tr>
        <tr class="alt">
          <td>chapters.configuration.Foo</td>
          <td><code>null</code></td>
          <td><code>INFO</code></td>
        </tr>
      </table>
    
      <p>The ConsoleAppender named <em>STDOUT</em>, the only configured
      appender in <em>sample4.xml</em>, is attached to the root logger
      whose level is set to <code>OFF</code>. However, running
      <em>MyApp3</em> with configuration script <em>sample4.xml</em> will
      yield:
      </p>
    
      <div class="source"><pre>17:52:23.609 [main] INFO chapters.configuration.MyApp3 - Entering application.
    17:52:23.609 [main] INFO chapters.configuration.MyApp3 - Exiting application.</pre></div>
    
      <p>Thus, the level of the root logger has no apparent effect because
      the loggers in <code>chapters.configuration.MyApp3</code> and
      <code>chapters.configuration.Foo</code> classes are all enabled for the
      <code>INFO</code> level.  As a side note, the <em>chapters.configuration</em>
      logger exists by virtue of its declaration in the configuration file
      - even if the Java source code does not directly refer to it.
      </p>
    
      <h4><a name="configuringAppenders"
      href="#configuringAppenders"><span class="anchor"/></a>Configuring
      Appenders</h4>
    
      <p>An appender is configured with the <code>&lt;appender></code>
      element, which takes two mandatory attributes <span
      class="attr">name</span> and <span class="attr">class</span>.  The
      <span class="attr">name</span> attribute specifies the name of the
      appender whereas the <span class="attr">class</span> attribute
      specifies the fully qualified name of the appender class to
      instantiate. The <code>&lt;appender></code> element may contain zero
      or one <code>&lt;layout></code> elements, zero or more
      <code>&lt;encoder></code> elements and zero or more
      <code>&lt;filter></code> elements. Apart from these three common
      elements, <code>&lt;appender></code> elements may contain any number
      of elements corresponding to JavaBean properties of the appender
      class. Seamlessly supporting any property of a given logback
      component is one of the major strengths of <a
      href="onJoran.html">Joran</a> as discussed in a later chapter. The
      following diagram illustrates the common structure. Note that
      support for properties is not visible.
      </p>
    
      <p align="left">
        <img src="images/chapters/configuration/appenderSyntax.png" 
             alt="Appender Syntax" title="Appender element syntax"/>
      </p>
    
      <p>The <code>&lt;layout></code> element takes a mandatory class
      attribute specifying the fully qualified name of the layout class to
      instantiate.  As with the <code>&lt;appender></code> element,
      <code>&lt;layout></code> may contain other elements corresponding to
      properties of the layout instance. Since it's such a common case, if
      the layout class is <code>PatternLayout</code>, then the class
      attribute can be omitted as specified by <a
      href="onJoran.html#defaultClassMapping">default class mapping</a>
      rules.
      </p>
    
      <p>The <code>&lt;encoder></code> element takes a mandatory class
      attribute specifying the fully qualified name of the encoder class
      to instantiate. Since it's such a common case, if the encoder class
      is <code>PatternLayoutEncoder</code>, then the class attribute can
      be omitted as specified by <a
      href="onJoran.html#defaultClassMapping">default class mapping</a>
      rules.
      </p>
    
      <p>Logging to multiple appenders is as easy as defining the various
      appenders and referencing them in a logger, as the next
      configuration file illustrates:
      </p>
    
      <p class="example">Example: Multiple loggers
      (logback-examples/src/main/java/chapters/configuration/multiple.xml)</p>
    
      <span class="asGroovy" onclick="return asGroovy('multiple');">View as .groovy</span>
      <pre id="multiple" class="prettyprint source">&lt;configuration>
    
      &lt;appender name="<b>FILE</b>" class="ch.qos.logback.core.FileAppender">
        &lt;file>myApp.log&lt;/file>
    
        &lt;encoder>
          &lt;pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;appender name="<b>STDOUT</b>" class="ch.qos.logback.core.ConsoleAppender">
        &lt;encoder>
          &lt;pattern>%msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;root level="debug">
        <b>&lt;appender-ref ref="FILE" /></b>
        <b>&lt;appender-ref ref="STDOUT" /></b>
      &lt;/root>
    &lt;/configuration></pre>
    
      <p>These configuration scripts define two appenders called
      <em>FILE</em> and <em>STDOUT</em>.  The <em>FILE</em> appender logs
      to a file called <em>myApp.log</em>. The encoder for this appender
      is a <code>PatternLayoutEncoder</code> that outputs the date, level,
      thread name, logger name, file name and line number where the log
      request is located, the message and line separator character(s).
      The second appender called <code>STDOUT</code> outputs to the
      console.  The encoder for this appender outputs only the message
      string followed by a line separator.
      </p>
    
      <p>The appenders are attached to the root logger by referencing them
      by name within an <em>appender-ref</em> element. Note that each
      appender has its own encoder. Encoders are usually not designed to
      be shared by multiple appenders. The same is true for layouts. As
      such, logback configuration files do not provide any syntactical
      means for sharing encoders or layouts.
      </p>
    
      <h4><a name="cumulative" href="#cumulative"><span
      class="anchor"/></a>Appenders accumulate
      </h4>
    
      <p>By default, <b>appenders are cumulative</b>: a logger will log to
      the appenders attached to itself (if any) as well as all the
      appenders attached to its ancestors.  Thus, attaching the same
      appender to multiple loggers will cause logging output to be
      duplicated.
      </p>
    
      <p class="example">Example: Duplicate appender
      (logback-examples/src/main/java/chapters/configuration/duplicate.xml)</p>
    
      <span class="asGroovy" onclick="return asGroovy('duplicate');">View as .groovy</span>
      <pre id="duplicate" class="prettyprint source">&lt;configuration>
    
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        &lt;encoder>
          &lt;pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;logger name="chapters.configuration">
        &lt;appender-ref ref="STDOUT" />
      &lt;/logger>
    
      &lt;root level="debug">
        &lt;appender-ref ref="STDOUT" />
      &lt;/root>
    &lt;/configuration></pre>
    
      <p>Running <code>MyApp3</code> with <em>duplicate.xml</em> will
      yield the following output:
      </p>
    
    <p class="source">14:25:36.343 [main] INFO  chapters.configuration.MyApp3 - Entering application.
    14:25:36.343 [main] INFO  chapters.configuration.MyApp3 - Entering application.
    14:25:36.359 [main] DEBUG chapters.configuration.Foo - Did it again!
    14:25:36.359 [main] DEBUG chapters.configuration.Foo - Did it again!
    14:25:36.359 [main] INFO  chapters.configuration.MyApp3 - Exiting application.
    14:25:36.359 [main] INFO  chapters.configuration.MyApp3 - Exiting application.</p>
    
      <p>Notice the duplicated output. The appender named <em>STDOUT</em>
      is attached to two loggers, to root and to
      <em>chapters.configuration</em>. Since the root logger is the
      ancestor of all loggers and <em>chapters.configuration</em> is the
      parent of both <em>chapters.configuration.MyApp3</em> and
      <em>chapters.configuration.Foo</em>, each logging request made with
      these two loggers will be output twice, once because <em>STDOUT</em>
      is attached to <em>chapters.configuration</em> and once because it
      is attached to <em>root</em>.
      </p>
    
      <p>Appender additivity is not intended as a trap for new users.  It
      is quite a convenient logback feature. For instance, you can
      configure logging such that log messages appear on the console (for
      all loggers in the system) while messages only from some specific
      set of loggers flow into a specific appender.
      </p>
    
      <p class="example">Example: Multiple appender
      (logback-examples/src/main/java/chapters/configuration/restricted.xml)</p>
      <span class="asGroovy" onclick="return asGroovy('restricted');">View as .groovy</span>
      <pre id="restricted" class="prettyprint source">&lt;configuration>
    
      &lt;appender name="FILE" class="ch.qos.logback.core.FileAppender">
        &lt;file>myApp.log&lt;/file>
        &lt;encoder>
          &lt;pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        &lt;encoder>
          &lt;pattern>%msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;logger name="chapters.configuration">
        &lt;appender-ref ref="FILE" />
      &lt;/logger>
    
      &lt;root level="debug">
        &lt;appender-ref ref="STDOUT" />
      &lt;/root>
    &lt;/configuration></pre>
    
      <p>In this example, the console appender will log all the messages
      (for all loggers in the system) whereas only logging requests
      originating from the <em>chapters.configuration</em> logger and its
      children will go into the <em>myApp.log</em> file.
      </p>
    	
      <h4><a name="overrridingCumulativity"
      href="#overrridingCumulativity"><span class="anchor"/></a>Overriding
      the default cumulative behaviour</h4>
    
      <p>In case the default cumulative behavior turns out to be
      unsuitable for your needs, you can override it by setting the
      additivity flag to false.  Thus, a branch in your logger tree may
      direct output to a set of appenders different from those of the rest
      of the tree.
      </p>
    
      <p class="example">Example: Additivity flag
      (logback-examples/src/main/java/chapters/configuration/additivityFlag.xml)</p>
    
      <span class="asGroovy" onclick="return asGroovy('additivityFlag');">View as .groovy</span>
      <pre id="additivityFlag" class="prettyprint source">&lt;configuration>
    
      &lt;appender name="FILE" class="ch.qos.logback.core.FileAppender">
        &lt;file>foo.log&lt;/file>
        &lt;encoder>
          &lt;pattern>%date %level [%thread] %logger{10} [%file : %line] %msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        &lt;encoder>
          &lt;pattern>%msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;logger name="chapters.configuration.Foo" <b>additivity="false"</b>>
        &lt;appender-ref ref="FILE" />
      &lt;/logger>
    
      &lt;root level="debug">
        &lt;appender-ref ref="STDOUT" />
      &lt;/root>
    &lt;/configuration></pre>
    
      <p>This example, the appender named <em>FILE</em> is attached to the
      <em>chapters.configuration.Foo</em> logger. Moreover, the <em>chapters.configuration.Foo</em>
      logger has its additivity flag set to false such that its logging
      output will be sent to the appender named <em>FILE</em> but not to
      any appender attached higher in the hierarchy. Other loggers remain
      oblivious to the additivity setting of the <em>chapters.configuration.Foo</em>
      logger.  Running the <code>MyApp3</code> application with the
      <em>additivityFlag.xml</em> configuration file will output results
      on the console from the <em>chapters.configuration.MyApp3</em> logger.  However,
      output from the <em>chapters.configuration.Foo</em> logger will appear in the
      <em>foo.log</em> file and only in that file.
      </p>
    
    
      <h3><a name="contextName" href="#contextName"><span
      class="anchor"/></a>Setting the context name</h3>
    
      <p>As mentioned <a href="architecture.html#LoggerContext">in an
      earlier chapter</a>, every logger is attached to a logger
      context. By default, the logger context is called
      "default". However, you can set a different name with the help of
      the <code>&lt;contextName></code> configuration directive. Note that
      once set, the logger context name <a
      href="../apidocs/ch/qos/logback/core/ContextBase.html#setName(java.lang.String)">cannot
      be changed</a>. Setting the context name is a simple and
      straightforward method in order to distinguish between multiple
      applications logging to the same target.
      </p>
      
      <p class="example">Example: Set the context name and display it
      (logback-examples/src/main/java/chapters/configuration/contextName.xml)</p>
    
      <span class="asGroovy" onclick="return asGroovy('contextName');">View as .groovy</span>
      <pre id="contextName" class="prettyprint source">&lt;configuration>
      <b>&lt;contextName>myAppName&lt;/contextName></b>
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        &lt;encoder>
          &lt;pattern>%d <b>%contextName</b> [%t] %level %logger{36} - %msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;root level="debug">
        &lt;appender-ref ref="STDOUT" />
      &lt;/root>
    &lt;/configuration></pre>
    
      <p>This last example illustrates naming of the logger
      context. Adding the <a
      href="layouts.html#conversionWord">contextName conversion word</a>
      in layout's pattern will output the said name.</p>
      
      <!-- =============================================================== -->
     
    
      <h3><a name="variableSubstitution"
      href="#variableSubstitution"><span class="anchor"/></a>Variable
      substitution</h3>
    
      <p><span class="label">Note</span> Earlier versions of this document
      used the term "property substitution" instead of the term
      "variable". Please consider both terms interchangeable although the
      latter term conveys a clearer meaning.
      </p>
    
      <p>As in many scripting languages, logback configuration files
      support definition and substitution of variables. Variables can be
      defined within the configuration file itself, in an external file,
      in an external resource or even computed and <a
      href="#definingPropsOnTheFly">defined on the fly</a>. 
      </p>
    
      <p class="highlight">Variable substitution can occur at any point in
      a configuration file where a value can be specified.</p>
    
      <p>Variable substitution can occur at any point in a configuration
      file where a value can be specified. The syntax of variable
      substitution is similar to that of Unix shells. The string between
      an opening <em>${</em> and closing <em>}</em> is interpreted as a
      reference to the <em>value</em> of the property.  For property
      <em>aName</em>, the string "${aName}" will be replaced with the
      value held by the <em>aName</em> property.
      </p>
    
      <p>Variables have a <a href="#scopes">scope</a> (see below).</p>
    
      <p>As they often come in handy, the HOSTNAME and CONTEXT_NAME
      variables are automatically defined and have context scope.</p>
    
     
      <h4><a name="definingProps" href="#definingProps"><span
      class="anchor"/></a>Defining variables</h4>
    
      <p>Variables can be defined one at a time in the configuration file
      itself or loaded wholesale from an external properties file or an
      external resource. For historical reasons, the XML element for
      defining variables is <code>&lt;property&gt;</code> altough in
      logback 1.0.7 and later the element <code>&lt;variable></code> can
      be used interchangeably.</p>
    
      <p>The next example shows a variable declared at the beginning of
      the configuration file. It is then used further down the file to
      specify the location of the output file.
      </p>
    
      <p class="example">Example: Simple Variable substitution
      (logback-examples/src/main/java/chapters/configuration/variableSubstitution1.xml)
      </p>
    
      <span class="asGroovy" onclick="return asGroovy('variableSubstitution1');">View as .groovy</span>
      <pre id="variableSubstitution1" class="prettyprint source">&lt;configuration>
    
      <b>&lt;property name="USER_HOME" value="/home/sebastien" /></b>
    
      &lt;appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <b>&lt;file>${USER_HOME}/myApp.log&lt;/file></b>
        &lt;encoder>
          &lt;pattern>%msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;root level="debug">
        &lt;appender-ref ref="FILE" />
      &lt;/root>
    &lt;/configuration></pre>
    
      <p>The next example shows the use of a System property to achieve
      the same result. The property is not declared in the configuration
      file, thus logback will look for it in the System properties. Java
      system properties can be set on the command line as shown next:
      </p>
      
      <p class="source">java -DUSER_HOME="/home/sebastien" MyApp2</p>
    
      <p class="example">Example: System Variable substitution
      (logback-examples/src/main/java/chapters/configuration/variableSubstitution2.xml)
      </p>
      <span class="asGroovy" onclick="return asGroovy('variableSubstitution2');">View as .groovy</span>
      <pre id="variableSubstitution2" class="prettyprint source">&lt;configuration>
    
      &lt;appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <b>&lt;file>${USER_HOME}/myApp.log&lt;/file></b>
        &lt;encoder>
          &lt;pattern>%msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;root level="debug">
        &lt;appender-ref ref="FILE" />
      &lt;/root>
    &lt;/configuration></pre>
    
      
      <p>When multiple variables are needed, it may be more convenient to
      create a separate file that will contain all the variables. Here is
      how one can do such a setup.
      </p>
    
      <p class="example">Example: Variable substitution using a
      separate file
      (logback-examples/src/main/java/chapters/configuration/variableSubstitution3.xml)
      </p>
      <span class="asGroovy" onclick="return asGroovy('variableSubstitution3');">View as .groovy</span>
      <pre id="variableSubstitution3" class="prettyprint source">&lt;configuration>
    
      <b>&lt;property file="src/main/java/chapters/configuration/variables1.properties" /></b>
    
      &lt;appender name="FILE" class="ch.qos.logback.core.FileAppender">
         <b>&lt;file>${USER_HOME}/myApp.log&lt;/file></b>
         &lt;encoder>
           &lt;pattern>%msg%n&lt;/pattern>
         &lt;/encoder>
       &lt;/appender>
    
       &lt;root level="debug">
         &lt;appender-ref ref="FILE" />
       &lt;/root>
    &lt;/configuration></pre>
    
       <p>This configuration file contains a reference to a file named
       <em>variables1.properties</em>.  The variables contained in that
       file will be read and then defined within local scope. Here is what
       the <em>variable.properties</em> file might look like.
       </p>
    
       <em>Example: Variable file
       (logback-examples/src/main/java/chapters/configuration/variables1.properties)</em>
    
       <pre class="source">USER_HOME=/home/sebastien</pre>
    
       <p>You may also reference a resource on the class path instead of a
       file.</p>
    
      <pre class="prettyprint source">&lt;configuration>
    
      <b>&lt;property resource="resource1.properties" /></b>
    
      &lt;appender name="FILE" class="ch.qos.logback.core.FileAppender">
         <b>&lt;file>${USER_HOME}/myApp.log&lt;/file></b>
         &lt;encoder>
           &lt;pattern>%msg%n&lt;/pattern>
         &lt;/encoder>
       &lt;/appender>
    
       &lt;root level="debug">
         &lt;appender-ref ref="FILE" />
       &lt;/root>
    &lt;/configuration></pre>
    
    
       <h4><a name="scopes" href="#scopes"><span
       class="anchor"/></a>Scopes</h4>
    
       <p>A property can be defined for insertion in <em>local scope</em>,
       in <em>context scope</em>, or in <em>system scope</em>. Local scope
       is the default. Although it is possible to read variables from the
       OS environment, it is not possible to write into the OS
       environment.</p>
    
    
       <p><span class="label">local scope</span> A property with local
       scope exists from the point of its definition in a configuration
       file until the end of interpretation/execution of said
       configuration file. As a corollary, each time a configuration file
       is parsed and executed, variables in local scope are defined
       anew.</p>
    
       <p><span class="label">context scope</span> A property with context
       scope is inserted into the context and lasts as long as the context
       or until it is cleared.  Once defined, a property in context scope
       is part of the context. As such, it is available in all logging
       events, including those sent to remote hosts via serialization. 
       </p>
    
       <p><span class="label">system scope</span> A property with system
       scope is inserted into the JVM's system properties and lasts as
       long as the JVM or until it is cleared.
       </p>
     
       <p class="highlight">Properties are looked up in the the local
       scope first, in the context scope second, in the system properties
       scope third, and in the OS environment last.
       </p>
    
       <p>During substitution, properties are looked up in the local scope
       first, in the context scope second, in the system properties scope
       third, and in the <a
       href="http://docs.oracle.com/javase/tutorial/essential/environment/env.html">OS
       environment</a> fourth and last.
       </p>
    
       <p>The <span class="attr">scope</span> attribute of the
       <code>&lt;property></code> element, <code>&lt;define></code>
       element or the <code>&lt;insertFromJNDI></code> element can be used
       to set the scope of a property. The <span class="attr">scope</span>
       attribute admits "local", "context" and "system" strings as
       possible values. If not specified, the scope is always assumed to
       be "local".
       </p>
    
       <p class="example">Example: A variable defined in "context" scope
       (logback-examples/src/main/java/chapters/configuration/contextScopedVariable.xml)
       </p>
    
      <span class="asGroovy" onclick="return
      asGroovy('contextScopedVariable');">View as .groovy</span>
      <pre id="contextScopedVariable" class="prettyprint source">&lt;configuration>
    
      &lt;property <b class="big">scope="context"</b> name="nodeId" value="firstNode" />
    
      &lt;appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <b>&lt;file>/opt/${nodeId}/myApp.log&lt;/file></b>
        &lt;encoder>
          &lt;pattern>%msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;root level="debug">
        &lt;appender-ref ref="FILE" />
      &lt;/root>
    &lt;/configuration></pre>
    
       <p>In the above example, given that the <em>nodeId</em> property is
       defined in the context scope, it will be available in every logging
       event, even those sent to remote hosts via serialization.</p>
    
    
      <h3><a name="defaultValuesForVariables"
      href="#defaultValuesForVariables"><span class="anchor"/></a>Default
      values for variables</h3>
    
      <p>Under certain circumstances, it may be desirable for a variable
      to have a default value if it is not declared or its value is
      null. As in the <a
      href="http://tldp.org/LDP/abs/html/parameter-substitution.html">Bash
      shell</a>, default values can be specified using the <b>":-"</b>
      operator. For example, assuming the variable named <em>aName</em> is
      not defined, <code>"${aName<b>:-golden</b>}"</code> will be
      interpreted as "golden".</p>
    
       <h3><a name="nestedSubst" href="#nestedSubst"><span
       class="anchor"/></a>Nested variables</h3>
    
       <p>Variable nesting is fully supported. Both the name,
       default-value and value definition of a variable can reference
       other variables.</p>
    
    
       <h4>value nesting</h4>
       <p>The value definition of a variable can contain references to
       other variables. Suppose you wish to use variables to specify not
       only the destination directory but also the file name, and combine
       those two variables in a third variable called "destination". The
       properties file shown below gives an example.
       </p>
    
       <p class="example">Example: Nested variable references
       (logback-examples/src/main/java/chapters/configuration/variables2.properties)</p>
    
       <pre class="source">USER_HOME=/home/sebastien
    fileName=myApp.log
    <b>destination=${USER_HOME}/${fileName}</b></pre>
    
        <p>Note that in the properties file above, "destination" is
        composed from two other variables, namely "USER_HOME" and
        "fileName".
        </p>
        
        <em>Example: Variable substitution using
        a separate file
        (logback-examples/src/main/java/chapters/configuration/variableSubstitution4.xml)</em>
    
        <pre class="prettyprint source">&lt;configuration>
    
      &lt;property file="variables2.properties" />
    
      &lt;appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <b>&lt;file>${destination}&lt;/file></b>
        &lt;encoder>
          &lt;pattern>%msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;root level="debug">
        &lt;appender-ref ref="FILE" />
      &lt;/root>
    &lt;/configuration></pre>
    
    
       <h4>name nesting</h4>
    
       <p>When referencing a variable, the variable name may contain a
       reference to another variable. For example, if the variable named
       "userid" is assigned the value "alice", then
       "${${userid}.password}" references the variable with the name
       "alice.password".</p>
    
       <h4>default value nesting</h4>
    
       <p>The default value of a variable can reference a another
       variable.  For example, assuming the variable 'id' is unassigned
       and the variable 'userid' is assigned the value "alice", then the
       expression "${id<b>:-</b>${userid}}" will return "alice".
       </p>
    
    
      <!-- ==============================================================
           -->
      <h3><a name="hostname" href="#hostname"><span
      class="anchor"/></a>HOSTNAME property</h3>
    
      <p>As it often comes in handy, the <code>HOSTNAME</code> property is
      defined automatically during configuration with context scope.</p>
    
      <!-- ============================================================== -->
      <h3><a name="context_name" href="#context_name"><span
      class="anchor"/></a>CONTEXT_NAME property</h3>
    
      <p>As its name indicates, the <code>CONTEXT_NAME</code> property
      corresponds to the name of the current logging context.</p>
    
      <!-- ============================================================== -->
      
      <h3><a name="timestamp" href="#timestamp"><span
      class="anchor"/></a>Setting a timestamp</h3>
    
      <p>The <em>timestamp</em> element can define a property according to
      current date and time. The <em>timestamp</em> element is <a
      href="appenders.html#uniquelyNamed">explained in a subsequent
      chapter</a>.</p>
    
      <!-- ============================================================== -->
      <h3><a name="definingPropsOnTheFly"
      href="#definingPropsOnTheFly"><span class="anchor"/></a>Defining
      properties on the fly</h3>
    
      <p>You may define properties dynamically using the
      <code>&lt;define></code> element. The define element takes two
      mandatory attributes: <span class="attr">name</span> and <span
      class="attr">class</span>. The <span class="attr">name</span>
      attribute designates the name of the property to set whereas the
      <span class="attr">class</span> attribute designates any class
      implementing the <a
      href="../xref/ch/qos/logback/core/spi/PropertyDefiner.html">PropertyDefiner</a>
      interface. The value returned by the <code>getPropertyValue</code>()
      method of the <code>PropertyDefiner</code> instance will be the
      value of the named property. You may also specify a <a
      href="#scopes">scope</a> for the named property by specifying a
      <span class="attr">scope</span> attribute.
      </p>
    
      <p>Here is an example.</p>
    
      <pre class="prettyprint source">&lt;configuration>
    
      &lt;define name="rootLevel" class="a.class.implementing.PropertyDefiner">
        &lt;shape>round&lt;/shape>
        &lt;color>brown&lt;/color>
        &lt;size>24&lt;/size>
      &lt;/define>
     
      &lt;root level="${rootLevel}"/>
    &lt;/configuration></pre>
    
      <p>In the above example, shape, color and size are properties of
      "a.class.implementing.PropertyDefiner". As long as there is a setter
      for a given property in your implementation of the
      <code>PropertyDefiner</code> instance, logback will inject the
      appropriate values as specified in the configuration file. </p>
    
     
    
      <p>At the present time, logback does ships with two fairly simple
      implementations of <code>PropertyDefiner</code>.  
      </p>
    
      <table class="bodyTable striped">
        <tr>
          <th>Implementation name</th>
          <th>Description</th>
        </tr>
    
        <tr>
          <td><a
          href="../apidocs/ch/qos/logback/core/property/FileExistsPropertyDefiner.html"><code>FileExistsPropertyDefiner</code></a>
          </td>
          <td>Set the named variable to "true" if the file specified by
          <span class="prop">path</span> property exists, to "false"
          otherwise.
          </td>
        </tr>
        <tr>
          <td><a
          href="../apidocs/ch/qos/logback/core/property/FileExistsPropertyDefiner.html"><code>ResourceExistsPropertyDefiner</code></a>
          </td>
          <td>Set the named variable to "true" if the <span
          class="prop">resource</span> specified by the user is available
          on the class path, to "false" otherwise.
          </td>
        </tr>
      </table>
    
      <!-- ============================================================== -->
    
      <h3><a name="conditional" href="#conditional"><span
      class="anchor"/></a>Conditional processing of configuration
      files</h3>
      
      <p>Developers often need to juggle between several logback
      configuration files targeting different environments such as
      development, testing and production. These configuration files have
      substantial parts in common differing only in a few places. To avoid
      duplication, logback supports conditional processing of
      configuration files with the help of <code>&lt;if></code>,
      <code>&lt;then></code> and <code>&lt;else></code> elements so that a
      single configuration file can adequately target several
      environments. Note that conditional processing requires the <a
      href="../setup.html#janino">Janino library</a>.
      </p>
    
      <p>The general format for conditional statements is shown below.</p>
    
      <pre class="prettyprint source">
       &lt;!-- if-then form -->
       &lt;if condition="some conditional expression">
        &lt;then>
          ...
        &lt;/then>
      &lt;/if>
      
      &lt;!-- if-then-else form -->
      &lt;if condition="some conditional expression">
        &lt;then>
          ...
        &lt;/then>
        &lt;else>
          ...
        &lt;/else>    
      &lt;/if></pre>  
    
      <p>The condition is a Java expression in which only context
      properties or system properties are accessible. For a key passed as
      argument, the <code>property</code>() or its shorter equivalent
      <code>p</code>() methods return the String value of the property.
      For example, to access the value of a property with key "k", you
      would write <code>property("k")</code> or equivalently
      <code>p("k")</code>. If the property with key "k" is undefined, the
      property method will return the empty string and not null. This
      avoids the need to check for null values.</p>
    
      <p>The <code>isDefined()</code> method can be used to check whether
      a property is defined. For example, to check whether the property
      "k" is defined you would write <code>isDefined("k")</code>
      Similarly, if you need to check whether a property is null, the
      <code>isNull()</code> method is provided. Example:
      <code>isNull("k")</code>.</p>
    
      <pre class="prettyprint source">&lt;configuration debug="true">
    
      <b>&lt;if condition='property("HOSTNAME").contains("torino")'></b>
        <b>&lt;then></b>
          &lt;appender name="CON" class="ch.qos.logback.core.ConsoleAppender">
            &lt;encoder>
              &lt;pattern>%d %-5level %logger{35} - %msg %n&lt;/pattern>
            &lt;/encoder>
          &lt;/appender>
          &lt;root>
            &lt;appender-ref ref="CON" />
          &lt;/root>
        <b>&lt;/then></b>
      <b>&lt;/if></b>
    
      &lt;appender name="FILE" class="ch.qos.logback.core.FileAppender">
        &lt;file>${randomOutputDir}/conditional.log&lt;/file>
        &lt;encoder>
          &lt;pattern>%d %-5level %logger{35} - %msg %n&lt;/pattern>
       &lt;/encoder>
      &lt;/appender>
    
      &lt;root level="ERROR">
         &lt;appender-ref ref="FILE" />
      &lt;/root>
    &lt;/configuration></pre>
    
      
      <p>Conditional processing is supported <em>anywhere</em> within the
      <code>&lt;configuration></code> element. Nested if-then-else
      statements are also supported. However, XML syntax is awfully
      cumbersome and is ill suited as the foundation of a general purpose
      programming language.  Consequently, too many conditionals will
      quickly render your configuration files incomprehensible to subsequent
      readers, including yourself.
      </p>
    
    
      <!-- ============================================================== -->
    
       <h3><a name="insertFromJNDI" href="#insertFromJNDI"><span
       class="anchor"/></a>Obtaining variables from JNDI</h3>
    
       <p>Under certain circumstances, you may want to make use of
       env-entries stored in JNDI. The <code>&lt;insertFromJNDI></code>
       configuration directive extracts an env-entry stored in JNDI and
       inserts the property in local scope with key specified by the <span
       class="attr">as</span> attribute. As all properties, it is possible
       to insert the new property into a <a href="#scopes">different
       scope</a> with the help of the <em>scope</em> attribute.
       </p>
    
       <p class="example">Example: Insert as properties env-entries
       obtained via JNDI
       (logback-examples/src/main/java/chapters/configuration/insertFromJNDI.xml)</p>
    
       <pre class="prettyprint source">&lt;configuration>
      <b>&lt;insertFromJNDI env-entry-name="java:comp/env/appName" as="<span class="green">appName"</span> /></b>
      <b>&lt;contextName><span class="green">${appName}</span>&lt;/contextName></b>
    
      &lt;appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        &lt;encoder>
          &lt;pattern>%d ${CONTEXT_NAME} %level %msg %logger{50}%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="CONSOLE" />
      &lt;/root>
    &lt;/configuration></pre>
    
      <p>In this last example, the "java:comp/env/appName" env-entry is
      inserted as the <span class="variable">appName</span> property. Note
      that the <code>&lt;contextName></code> directive sets the context
      name based on the value of the <span class="variable">appName</span>
      property inserted by the previous <code>&lt;insertFromJNDI></code>
      directive.
      </p>
    
      <h3><a name="fileInclusion" href="#fileInclusion"><span
      class="anchor"/></a>File inclusion</h3>
    
      <p>Joran supports including parts of a configuration file from
      another file. This is done by declaring a <code>&lt;include></code>
      element, as shown below:
      </p>
    
      <p class="example">Example: File include
      (logback-examples/src/main/java/chapters/configuration/containingConfig.xml)</p>
    
      <pre class="prettyprint source">&lt;configuration>
      <b>&lt;include file="src/main/java/chapters/configuration/includedConfig.xml"/></b>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="includedConsole" />
      &lt;/root>
    
    &lt;/configuration></pre>
    
      <p>The target file MUST have its elements nested inside an
      <code>&lt;included></code> element. For example, a
      <code>ConsoleAppender</code> could be declared as:
      </p>
    
      <p class="example">Example: File include
      (logback-examples/src/main/java/chapters/configuration/includedConfig.xml)</p>
    
      <pre class="source"><b class="green big">&lt;included></b>
      &lt;appender name="includedConsole" class="ch.qos.logback.core.ConsoleAppender">
        &lt;encoder>
          &lt;pattern>"%d - %m%n"&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    <b class="green big">&lt;/included></b></pre>
    
    
      <p>Again, please note the mandatory
      <code class="big green">&lt;included></code> element.</p>
    
      <p>The contents to include can be referenced as a file, as a
      resource, or as a URL.</p>
    
      <ul>
    
        <li><b>As a file:</b><br/> To include a file use the <span
        class="attr">file</span> attribute. You can use relative paths but
        note that the current directory is defined by the application and
        is not necessarily related to the path of the configuration
        file.</li>
    
        <li><p><b>As a resource:</b><br/> To include a resource, i.e a
        file found on the class path, use the <span
        class="attr">resource</span> attribute.</p>
    
        <pre class="prettyprint source">&lt;include resource="includedConfig.xml"/></pre>
        
        </li>
    
        <li><p><b>As a URL:</b><br/> To include the contents of a URL use
        the <span class="attr">url</span> attribute.</p>
    
        <pre class="prettyprint source">&lt;include url="http://some.host.com/includedConfig.xml"/></pre>
    
        </li>
      </ul>
    
      <p>If it cannot find the file to be included, logback will complain
      by printing a status message.  In case the included file is
      optional, you can suppres the error message by setting <span
      class="attr">optional</span> attribute to <code>true</code> in the
      <code>&lt;include></code> element.</p>
    
    
      <pre class="prettyprint source">&lt;include optional="true" ..../></pre>
    
      <!-- ==================== ContextListener =================== -->
      <h2><a name="contextListener" href="#contextListener"><span
      class="anchor"/></a>Adding a context listener</h2>
    
      <p>Instances of the <a
      href="../xref/ch/qos/logback/classic/spi/LoggerContextListener.html">LoggerContextListener</a>
      interface listen to events pertaining to the lifecycle of a logger
      context. 
      </p>
    
    
      <p><code>JMXConfigurator</code> is one implementation of the
      <code>LoggerContextListener</code> interface. It is described in a <a
      href="jmxConfig.html">subsequent chapter</a>.
      </p>
    
      <h3><a name="LevelChangePropagator"
      href="#LevelChangePropagator"><span
      class="anchor"/></a>LevelChangePropagator</h3>
    
      <p>As of version 0.9.25, logback-classic ships with <a
      href="../xref/ch/qos/logback/classic/jul/LevelChangePropagator.html">LevelChangePropagator</a>,
      an implementation of <code>LoggerContextListener</code> which
      propagates changes made to the level of any logback-classic logger
      onto the java.util.logging framework. Such propagation eliminates
      the performance impact of disabled log statements. Instances of <a
      href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/logging/LogRecord.html?is-external=true">LogRecord</a>
      will be sent to logback (via SLF4J) only for enabled log
      statements. This makes it reasonable for real-world applications to
      use the <a
      href="http://www.slf4j.org/legacy.html#jul-to-slf4j">jul-to-slf4j</a>
      bridge.
      </p>
    
    
      <p>The contextListener element can be used to install <code>LevelChangePropagator</code> as shown next.</p>
      
      <pre class="prettyprint source">&lt;configuration debug="true">
      <b>&lt;contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"/></b>
      .... 
    &lt;/configuration></pre>
    
      <p>Setting the <span class="option">resetJUL</span> property of
      LevelChangePropagator will reset all previous level configurations
      of all j.u.l. loggers. However, previously installed handlers will be
      left untouched.</p>
    
      <pre class="prettyprint source">&lt;configuration debug="true">
      &lt;contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
        <b>&lt;resetJUL>true&lt;/resetJUL></b>
      &lt;/contextListener>
      ....
    &lt;/configuration></pre>
      <p>
      </p>
      
    
    
      <script src="../templates/footer.js" type="text/javascript"></script>
    </div>
    </body>
    </html>
    ������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/manual/filters.html�������������������������������������������������������������0000644�0001750�0001750�00000141700�12143164240�017717� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Chapter 7: Filters</title>
        <link rel="stylesheet" type="text/css" href="../css/common.css" />
        <link rel="stylesheet" type="text/css" href="../css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="../css/_print.css" media="print" />
        <link rel="stylesheet" type="text/css" href="../css/prettify.css" media="screen" /> 
    
      </head>
      <body onload="prettyPrint(); decorate();">
        <script type="text/javascript">prefix='../';</script>
        <script type="text/javascript" src="../js/prettify.js"></script>
        <script type="text/javascript" src="../templates/header.js"></script>
        <script type="text/javascript" src="../js/dsl.js"></script>
        <script type="text/javascript" src="../js/jquery-min.js"></script>
        <script type="text/javascript" src="../js/decorator.js"></script>
    
        <div id="left">
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="../templates/left.js" type="text/javascript"></script>
        </div>
        <div id="right">
          <script src="menu.js" type="text/javascript"></script>
        </div>
        <div id="content">
    	
        <h1>Chapter 7: Filters</h1>
    
        <div class="quote">
          <p><em>Have lots of ideas and throw away the bad ones. You aren't
          going to have good ideas unless you have lots of ideas and some
          sort of principle of selection.</em></p>
          
          <p>&mdash;LINUS PAULING</p>
        </div>
    
        <script src="../templates/creative.js" type="text/javascript"></script>
    
    		
    		<p>In the preceding chapters, the <a
    		href="architecture.html#basic_selection">basic selection rule</a>,
    		which lies at the heart of logback-classic, has been presented. In
    		this chapter, additional filtering methods will be introduced.
        </p>
    	
    
        <p>Logback filters are based on ternary logic allowing them to be
        assembled or chained together to compose an arbitrarily complex
        filtering policy.  They are largely inspired by Linux's iptables.
    		</p>
    
        <script src="../templates/setup.js" type="text/javascript"></script>
    
    		<h2>In logback-classic</h2>
    
    
    		<p>Logback-classic offers two types of filters, regular filters
    		and turbo filters.
    		</p>
    		
        <h3 class="doAnchor" name="filter">Regular filters</h3>
    
    		<p>Regular logback-classic filters extend the <a
    		href="../xref/ch/qos/logback/core/filter/Filter.html"><code>Filter</code></a>
    		abstract class which essentially consists of a single
    		<code>decide()</code> method taking an <code>ILoggingEvent</code>
    		instance as its parameter.
    		</p>
    		
    
    		<p>Filters are organized as an ordered list and are based on
    		ternary logic. The <code>decide(ILoggingEvent event)</code> method
    		of each filter is called in sequence.  This method returns one of
    		the <a
    		href="../xref/ch/qos/logback/core/spi/FilterReply.html"><code>FilterReply</code></a>
    		enumeration values, i.e. one of <code>DENY</code>,
    		<code>NEUTRAL</code> or <code>ACCEPT</code>.  If the value
    		returned by <code>decide</code>() is <code>DENY</code>, then the
    		log event is dropped immediately without consulting the remaining
    		filters. If the value returned is <code>NEUTRAL</code>, then the
    		next filter in the list is consulted. If there are no further
    		filters to consult, then the logging event is processed normally.
    		If the returned value is <code>ACCEPT</code>, then the logging
    		event is processed immediately skipping the invocation of the
    		remaining filters.
        </p>
        
        <p>In logback-classic, filters can be added to
        <code>Appender</code> instances. By adding one or more filters to
        an appender, you can filter events by arbitrary criteria, such as
        the contents of the log message, the contents of the MDC, the time
        of day or any other part of the logging event.
        </p>
        
    		<h3 class="doAnchor" name="yourOwnFilter">Implementing your own
    		Filter</h3>
    		
    		<p>Creating your own filter is easy. All you have to do is extend
    		the <code>Filter</code> abstract class and implement the
    		<code>decide()</code> method.
    		</p>
    		
    		<p>The SampleFilter class shown below provides an example. Its
    		<code>decide</code> method returns ACCEPT for logging events
    		containing the string "sample" in its message field. For other
    		events, the value NEUTRAL is returned.
    		</p>
    		
        <em>Example: Basic custom filter (<a
        href="../xref/chapters/filters/SampleFilter.html">logback-examples/src/main/java/chapters/filters/SampleFilter.java</a>)</em>
        <pre class="prettyprint source">package chapters.filters;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.filter.Filter;
    import ch.qos.logback.core.spi.FilterReply;
    
    public class SampleFilter extends Filter&gt;ILoggingEvent> {
    
      @Override
      public FilterReply decide(ILoggingEvent event) {    
        if (event.getMessage().contains("sample")) {
          return FilterReply.ACCEPT;
        } else {
          return FilterReply.NEUTRAL;
        }
      }
    }</pre>
    
    		<p>The configuration files shown next attaches a
    		<code>SampleFilter</code> to a <code>ConsoleAppender</code>.
    		</p>
    
        <em>Example: SampleFilter configuration
        (logback-examples/src/main/java/chapters/filters/SampleFilterConfig.xml)</em>
        <span class="asGroovy" onclick="return asGroovy('SampleFilterConfig');">View as .groovy</span>
        <pre id="SampleFilterConfig" class="prettyprint source">&lt;configuration>
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    
        <b>&lt;filter class="chapters.filters.SampleFilter" /></b>
    
        &lt;encoder>
          &lt;pattern>
            %-4relative [%thread] %-5level %logger - %msg%n
          &lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    	
      &lt;root>
        &lt;appender-ref ref="STDOUT" />
      &lt;/root>
    &lt;/configuration></pre>
    
    		<p>With the help of Joran, logback's configuration framework,
    		specifying properties or sub-components to filters is also
    		easy. After adding the corresponding setter method in the filter
    		class, specify the value of the property in an xml element named
    		after the property, nesting it within a <code>&lt;filter></code>
    		element. 
    		</p>
    		
    		<p>Often, the desired filter logic consists of two
    		orthogonal parts, a match/mismatch test and a response depending
    		on the match/mismatch. For example, for a given test, e.g. message
    		equals "foobar", one filter might respond ACCEPT on match and
    		NEUTRAL on mismatch, and another filter might respond NEUTRAL on
    		match and DENY on mismatch. 
        </p>
    
        <p>Taking notice of this orthogonality, logback ships with the <a
        href="../xref/ch/qos/logback/core/filter/AbstractMatcherFilter.html">
        <code>AbstractMatcherFilter</code></a> class which provides a
        useful skeleton for specifying the appropriate response on match
        and on mismatch, with the help of two properties, named
        <em>OnMatch</em> and <em>OnMismatch</em>. Most of the regular
        filters included in logback are derived from
        <code>AbstractMatcherFilter</code>.
        </p>
    		
    		<h3 class="doAnchor" name="levelFilter">LevelFilter</h3>
    		
    		<p><a href="../xref/ch/qos/logback/classic/filter/LevelFilter.html">
    		<code>LevelFilter</code></a> filters events based on exact level
    		matching. If the event's level is equal to the configured level,
    		the filter accepts or denies the event, depending on the
    		configuration of the <span class="option">onMatch</span> and <span
    		class="option">onMismatch</span> properties. Here is a sample
    		configuration file.
    		</p>
    		
        <em>Example: Sample LevelFilter configuration
        (logback-examples/src/main/java/chapters/filters/levelFilterConfig.xml)</em>
        <span class="asGroovy" onclick="return asGroovy('levelFilterConfig');">View as .groovy</span>
        <pre id="levelFilterConfig" class="prettyprint source">&lt;configuration>
      &lt;appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <b>&lt;filter class="ch.qos.logback.classic.filter.LevelFilter">
          &lt;level>INFO&lt;/level>
          &lt;onMatch>ACCEPT&lt;/onMatch>
          &lt;onMismatch>DENY&lt;/onMismatch>
        &lt;/filter></b>
        &lt;encoder>
          &lt;pattern>
            %-4relative [%thread] %-5level %logger{30} - %msg%n
          &lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
      &lt;root level="DEBUG">
        &lt;appender-ref ref="CONSOLE" />
      &lt;/root>
    &lt;/configuration></pre>
    
        <h3 class="doAnchor" name="thresholdFilter">ThresholdFilter</h3>
    
    		<p>The <a
    		href="../xref/ch/qos/logback/classic/filter/ThresholdFilter.html">
    		<code>ThresholdFilter</code></a> filters events below the
    		specified threshold. For events of level equal or above the
    		threshold, <code>ThresholdFilter</code> will respond NEUTRAL when
    		its <code>decide</code>() method is invoked. However, events with
    		a level below the threshold will be denied. Here is a sample
    		configuration file.
    		</p>
    
        <em>Example: Sample ThresholdFilter configuration
        (logback-examples/src/main/java/chapters/filters/thresholdFilterConfig.xml)</em>
        <span class="asGroovy" onclick="return asGroovy('thresholdFilterConfig');">View as .groovy</span>
        <pre id="thresholdFilterConfig"  class="prettyprint source">&lt;configuration>
      &lt;appender name="CONSOLE"
        class="ch.qos.logback.core.ConsoleAppender">
        &lt;!-- deny all events with a level below INFO, that is TRACE and DEBUG -->
        <b>&lt;filter class="ch.qos.logback.classic.filter.ThresholdFilter">
          &lt;level>INFO&lt;/level>
        &lt;/filter></b>
        &lt;encoder>
          &lt;pattern>
            %-4relative [%thread] %-5level %logger{30} - %msg%n
          &lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
      &lt;root level="DEBUG">
        &lt;appender-ref ref="CONSOLE" />
      &lt;/root>
    &lt;/configuration></pre>
    
    
        <h2 class="doAnchor" name="evalutatorFilter">EvaluatorFilter</h2>
    
        <p><a
        href="../xref/ch/qos/logback/core/filter/EvaluatorFilter.html"><code>EvaluatorFilter</code></a>
        is a generic filter encapsulating an
        <code>EventEvaluator</code>. As the name suggests, an
        <a
        href="../xref/ch/qos/logback/core/boolex/EventEvaluator.html">
        <code>EventEvaluator</code></a> evaluates whether a given criteria
        is met for a given event. On match and on mismatch,
        the hosting <code>EvaluatorFilter</code> will return the value
        specified by the <span class="option">onMatch</span>
        or <span class="option">onMismatch</span> properties respectively.
        </p>
    
    
        <p>Note that <code>EventEvaluator</code> is an abstract class. You
        can implement your own event evaluation logic by sub-classing
        <code>EventEvaluator</code>.
        </p>
        
    
        <!-- ======================== GEventEvaluator ========================= -->
    
        <h3 class="doAnchor" name="GEventEvaluator">GEventEvaluator</h3>
        
        <p><a
        href="../xref/ch/qos/logback/classic/boolex/GEventEvaluator.html">GEventEvaluator</a>
        is a concrete <a
        href="../xref/ch/qos/logback/core/boolex/EventEvaluator.html"><code>EventEvaluator</code></a>
        implementation taking arbitrary Groovy language boolean
        expressions as the evaluation criteria.  We refer such Groovy
        language boolean expressions as "groovy evaluation
        expressions". Groovy evaluation expressions enable hitherto
        unprecedented flexibility in event
        filtering. <code>GEventEvaluator</code> requires the Groovy
        runtime. Please see the <a
        href="../setup.html#groovy">corresponding section</a> of
        the setup document on adding the Groovy runtime to your class
        path.
        </p>
    
        <p>Evaluation expressions are compiled on-the-fly during the
        interpretation of the configuration file. As a user, you do not
        need to worry about the actual plumbing. However, it is your
        responsibility to ensure that the groovy-language expression is
        valid.
        </p>
    
        <p>The evaluation expression acts on the current logging event.
        Logback automatically inserts the current logging event of type <a
        href="../apidocs/ch/qos/logback/classic/spi/ILoggingEvent.html">ILoggingEvent</a>
        as a variable referred to as '<em>event</em>' as well as its
        shorthand referred to as '<em>e</em>'. The variables TRACE, DEBUG,
        INFO, WARN and ERROR are also exported into the scope of the
        expression. Thus, "event.level == DEBUG" and "e.level == DEBUG"
        are equivalent and valid groovy expressions which will return
        <code>true</code> only if the current logging event's level is
        identical to DEBUG. For other comparison operators on levels, the
        level field should be converted to integer with the
        <code>toInt()</code> operator.
        </p>
    
        <p>Here is a more complete example.</p>
    
        <span class="asGroovy" onclick="return asGroovy('GEventEvaluator');">View as .groovy</span>
        <pre id="GEventEvaluator"  class="prettyprint source">&lt;configuration>
        
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <b>&lt;filter class="ch.qos.logback.core.filter.EvaluatorFilter">      
          &lt;evaluator class="ch.qos.logback.classic.boolex.GEventEvaluator"> 
            &lt;expression>
               e.level.toInt() >= WARN.toInt()
                 &amp;amp;&amp;amp;  &lt;!-- Stands for &amp;&amp; in XML -->
               !(e.mdc?.get("req.userAgent") ~= /Googlebot|msnbot|Yahoo/ )
            &lt;/expression>
          &lt;/evaluator>
          &lt;OnMismatch>DENY&lt;/OnMismatch>
          &lt;OnMatch>NEUTRAL&lt;/OnMatch>
        &lt;/filter></b>
        &lt;encoder>
          &lt;pattern>
            %-4relative [%thread] %-5level %logger - %msg%n
          &lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="STDOUT" />
      &lt;/root>
    &lt;/configuration></pre>
    
    
        <p>The above filter will let events of level WARN and higher go
        through onto the console unless the error is generated by Web
        crawlers associated with Google, MSN or Yahoo. It does so by
        checking whether the MDC associated with the event contains a
        value for "req.userAgent" matching the
        <code>/Googlebot|msnbot|Yahoo/</code> regular expression. Note
        that since the MDC map can be null, we are also using Groovy's <a
        href="http://groovy.codehaus.org/Null+Object+Pattern">safe
        dereferencing operator</a>, that is the ?. operator. The equivalent
        logic would have been much longer if expressed in Java.
        </p>
        
        <p>If you are wondering how the identifier for the user agent was
        inserted into the MDC under the 'req.userAgent' key, it behooves
        us to mention that logback ships with a servlet filter named <a
        href="mdc.html#mis"><code>MDCInsertingServletFilter</code></a>
        designed for this purpose. It will be described in a later
        chapter.
        </p>
    
        <!-- ==================== JaninoEventEvaluator ======================== -->
        
        <h3 class="doAnchor"
        name="JaninoEventEvaluator">JaninoEventEvaluator</h3>
        
    
        <p>Logback-classic ships with another concrete
        <code>EventEvaluator</code> implementation called <a
        href="../xref/ch/qos/logback/classic/boolex/JaninoEventEvaluator.html">JaninoEventEvaluator</a>
        taking an arbitrary Java language block returning a boolean value
        as the evaluation criteria. We refer to such Java language boolean
        expressions as "<em>evaluation expressions</em>". Evaluation
        expressions enable great flexibility in event
        filtering. <code>JaninoEventEvaluator</code> requires the <a
        href="http://docs.codehaus.org/display/JANINO/Home">Janino
        library</a>. Please see the <a
        href="../setup.html#janino">corresponding section</a> of the setup
        document.  Compared to <code>JaninoEventEvaluator</code>,
        <code>GEventEvaluator</code>, by virtue of the Groovy language, is
        significantly more convenient to use, but
        <code>JaninoEventEvaluator</code> will usually run (much) faster
        for equivalent expressions.
        </p>
    
        <p>Evaluation expressions are compiled on-the-fly during the
        interpretation of the configuration file. As a user, you do not
        need to worry about the actual plumbing. However, it is your
        responsibility to ensure that the Java language expression returns
        a boolean, i.e. that it evaluates to true or false. </p>
    
    
        <p>The evaluation expression is evaluated on the current logging
        event. Logback-classic automatically exports various fields of the
        logging event as variables accessible from the evaluation
        expression. The case-sensitive names of these exported variables
        are listed below.
        </p>
    
    		<table class="bodyTable">
          <tr>
            <th>Name</th>
            <th>Type</th>
            <th>Description</th>
    			</tr>
          <tr>
    				<td>event</td>
    				<td><code>LoggingEvent</code></td>
    
            <td>The raw logging event associated with the logging
            request. All of the following variables are also available
            from the event. For example, <code>event.getMessage()</code>
            returns the same String value as the <em>message</em> variable
            described next.
            </td>
    			</tr>
    
          <tr class="alt">
    				<td>message</td>
            <td><code>String</code></td>
            <td>The raw message of the logging request. For some logger
            <em>l</em>, when you write l.info("Hello {}", name); where
            name is assigned the value "Alice", then "Hello {}" is the
            message.</td> </tr>
    		
          <tr>
    				<td>formattedMessage</td>
            <td><code>String</code></td>
            <td>The formatted message in the logging request. For some
            logger <em>l</em>, when you write l.info("Hello {}", name);
            where name is assigned the value "Alice", then "Hello Alice"
            is the formatted message.</td>
    			</tr>
    		
          <tr class="alt">
    				<td>logger</td>
    				<td><code>String</code></td>
    				<td>The name of the logger.
            </td>
    			</tr>
    
          <tr>
            <td>loggerContext</td>
    				<td><a
    				href="../xref/ch/qos/logback/classic/spi/LoggerContextVO.html"><code>LoggerContextVO</code></a></td>
    				<td>A restricted (value object) view of the logger context to which the logging event belongs to.
            </td>
    			</tr>
    
    
    			<tr class="alt">
    				<td>level</td>
    				<td><code>int</code></td>
    				<td>The int value corresponding to the level. To help create
    				easily expressions involving levels, the default value
    				<em>DEBUG</em>, <em>INFO</em>, <em>WARN</em> and
    				<em>ERROR</em> are also available. Thus, using <em>level &gt;
    				INFO</em> is a correct expression.
    				</td>
    			</tr>
    
    			<tr>
    				<td>timeStamp
    				</td>
    				<td><code>long</code></td>
    				<td>The timestamp corresponding to the logging event's
    				creation.
    				</td>
    			</tr>
    			<tr class="alt">
    				<td>marker</td>
    				<td><code>Marker</code></td>
            <td>The <code>Marker</code> object associated with the logging
            request. Note that marker can be null and it is your
            responsibility to check for this condition in order to avoid
            <code>NullPointerException</code>.
    				</td>
    			</tr>
    			<tr>
    				<td>mdc</td>
    				<td><code>Map</code></td>
    				<td>A map containing all the MDC values at the time of the
    				creation of the logging event. A value can be accessed by
    				using the following expression: <em>mdc.get("myKey")</em>. As
    				of logback-classic version 0.9.30, the 'mdc' variable will
    				never be null.
    
            <p>The <code>java.util.Map</code> type is non-parameterized
            because Janino does not support generics. It follows that the
            type returned by <code>mdc.get()</code> is <code>Object</code>
            and not <code>String</code>. To invoke <code>String</code>
            methods on the returned value, it must be cast as
            <code>String</code>. For example,
            <code>((String)&nbsp;mdc.get("k")).contains("val")</code>.
            </p>
    				</td>
    			</tr>
    
          <tr class="alt">
    				<td>throwable</td>
            <td>java.lang.Throwable</td>
    				<td>If no exception is associated with the event, then the
    				value of the "throwable" variable will be null. Unfortunately,
    				"throwable" does not survive serialization. Thus, on remote
    				systems, its value will always be null. For location
    				independent expressions, use the <code>throwableProxy</code>
    				variable described next.
    				</td>
    			</tr>
    
    			<tr>
    				<td>throwableProxy</td>
    				<td><a
    				href="../xref/ch/qos/logback/classic/spi/IThrowableProxy.html"><code>IThrowableProxy</code></a></td>
    				<td>A proxy for the exception associated with the logging
    				event. If no exception is associated with the event, then the
    				value of the "throwableProxy" variable will be null. In
    				contrast to "throwable", when an exception is associated with
    				an event, the value of "throwableProxy" will be non-null even
    				on remote systems, that is even after serialization.
    				</td>
    			</tr>
    
        
    
    		</table>
    
        <p>Here is a concrete example.</p>
    
        <em>Example: Basic event evaluator usage
        (logback-examples/src/main/java/chapters/filters/basicEventEvaluator.xml)</em>
    
        <span class="asGroovy" onclick="return asGroovy('basicEventEvaluator');">View as .groovy</span>
        <pre id="basicEventEvaluator" class="prettyprint source longline">&lt;configuration>
    
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <b>&lt;filter class="ch.qos.logback.core.filter.EvaluatorFilter">      
          &lt;evaluator> &lt;!-- defaults to type ch.qos.logback.classic.boolex.JaninoEventEvaluator -->
            &lt;expression><span class="green">return message.contains("billing");</span>&lt;/expression>
          &lt;/evaluator>
          &lt;OnMismatch>NEUTRAL&lt;/OnMismatch>
          &lt;OnMatch>DENY&lt;/OnMatch>
        &lt;/filter></b>
        &lt;encoder>
          &lt;pattern>
            %-4relative [%thread] %-5level %logger - %msg%n
          &lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;root level="INFO">
        &lt;appender-ref ref="STDOUT" />
      &lt;/root>
    &lt;/configuration></pre>
    
    		<p>The bold part in the above configuration file adds an
    		<code>EvaluatorFilter</code> to a <code>ConsoleAppender</code>. An
    		evaluator of type <code>JaninoEventEvaluator</code> is then
    		injected into the <code>EvaluatorFilter</code>. In the absence of
    		<span class="attr">class</span> attribute in the
    		<code>&lt;evaluator></code> element specified by the user, Joran
    		will infer a default type of <code>JaninoEventEvaluator</code>
    		for the evaluator. This is one of the <a
    		href="onJoran.html#defaultClassMapping">few occurrences</a> where
    		Joran implicitly infers the type of a component.
        </p>
    
        <p>The <em>expression</em> element corresponds to the evaluation
        expression just discussed. The expression
        <code>return message.contains("billing");</code> returns a boolean
        value. Notice that the <em>message</em> variable is exported
        automatically by <code>JaninoEventEvaluator</code>.
        </p>
    
    		<p>Given that the <span class="option">OnMismatch</span> property is
    		set to NEUTRAL and the <span class="option">OnMatch</span>
    		property set to DENY, this evaluator filter will drop all logging
    		events whose message contains the string "billing".
        </p>
    
        <p>The <a
        href="../xref/chapters/filters/FilterEvents.html"><code>FilterEvents</code></a>
        application issues ten logging requests, numbered 0 to 9. Let us
        first run <code>FilterEvents</code> class without any filters:
    		</p>
    		
    <div class="source"><pre>
    java chapters.filters.FilterEvents src/main/java/chapters/filters/basicConfiguration.xml
    </pre></div>
    		
    		<p>All requests will be displayed, as shown below:</p>
    
    <div class="source"><pre>0    [main] INFO  chapters.filters.FilterEvents - logging statement 0
    0    [main] INFO  chapters.filters.FilterEvents - logging statement 1
    0    [main] INFO  chapters.filters.FilterEvents - logging statement 2
    0    [main] DEBUG chapters.filters.FilterEvents - logging statement 3
    0    [main] INFO  chapters.filters.FilterEvents - logging statement 4
    0    [main] INFO  chapters.filters.FilterEvents - logging statement 5
    0    [main] ERROR chapters.filters.FilterEvents - <b>billing statement 6</b>
    0    [main] INFO  chapters.filters.FilterEvents - logging statement 7
    0    [main] INFO  chapters.filters.FilterEvents - logging statement 8
    0    [main] INFO  chapters.filters.FilterEvents - logging statement 9</pre></div>
    
    
    
    		<p>Suppose that we want to get rid of the "billing statement".
    		The <em>basicEventEvaluator.xml</em> configuration file listed
    		above filters messages containing the string "billing" which is
    		precisely the desired outcome.</p>
    
        <p>Running with <em>basicEventEvaluator.xml</em>:</p>
        <p class="source">java chapters.filters.FilterEvents src/main/java/chapters/filters/basicEventEvaluator.xml</p>
        <p>we obtain:
    		</p>
    		
        <p class="source">0    [main] INFO  chapters.filters.FilterEvents - logging statement 0
    0    [main] INFO  chapters.filters.FilterEvents - logging statement 1
    0    [main] INFO  chapters.filters.FilterEvents - logging statement 2
    0    [main] DEBUG chapters.filters.FilterEvents - logging statement 3
    0    [main] INFO  chapters.filters.FilterEvents - logging statement 4
    0    [main] INFO  chapters.filters.FilterEvents - logging statement 5
    0    [main] INFO  chapters.filters.FilterEvents - logging statement 7
    0    [main] INFO  chapters.filters.FilterEvents - logging statement 8
    0    [main] INFO  chapters.filters.FilterEvents - logging statement 9</p>
    		
    
        <p>Evaluation expressions can be Java blocks. For example, the
        following is a valid expression.</p>
    
        <pre class="prettyprint source">&lt;evaluator>
      &lt;expression>
        if(logger.startsWith("org.apache.http"))
          return true;
    
        if(mdc == null || mdc.get("entity") == null)
          return false;
    
        String payee = (String) mdc.get("entity");
    
        if(logger.equals("org.apache.http.wire") &amp;amp;&amp;amp; &lt;!-- &amp; encoded as &amp;amp; -->
            payee.contains("someSpecialValue") &amp;amp;&amp;amp;
            !message.contains("someSecret")) {
          return true;
        }
    
        return false;
      &lt;/expression>
    &lt;/evaluator></pre>
    
    
     	  <h2 class="doAnchor" name="matcher">Matchers</h2>
    
        <p>While it is possible to do pattern matching by invoking the <a
        href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html#matches%28java.lang.String%29">matches()</a>
        method in the <code>String</code> class, this incurs the cost of
        compiling of a brand new <code>Pattern</code> object each time the
        filter is invoked. To eliminate this overhead, you can predefine
        one or more <a
        href="../xref/ch/qos/logback/core/boolex/Matcher.html">Matcher</a>
        objects. Once a matcher is defined, it can be repeatedly
        referenced by name in the evaluator expression.</p>
    
        <p>An example should clarify the point:</p>
    
        <em>Example: Defining matchers in an event evaluator (logback-examples/src/main/java/chapters/filters/evaluatorWithMatcher.xml)</em>
        <span class="asGroovy" onclick="return asGroovy('evaluatorWithMatcher');">View as .groovy</span>
    
        <pre id="evaluatorWithMatcher" class="prettyprint source">&lt;configuration debug="true">
    
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        &lt;filter class="ch.qos.logback.core.filter.EvaluatorFilter">
          &lt;evaluator>        
            <b>&lt;matcher>
              &lt;Name>odd&lt;/Name>
              &lt;!-- filter out odd numbered statements -->
              &lt;regex>statement [13579]&lt;/regex>
            &lt;/matcher>
            
            &lt;expression>odd.matches(formattedMessage)&lt;/expression></b>
          &lt;/evaluator>
          &lt;OnMismatch>NEUTRAL&lt;/OnMismatch>
          &lt;OnMatch>DENY&lt;/OnMatch>
        &lt;/filter>
        &lt;encoder>
          &lt;pattern>%-4relative [%thread] %-5level %logger - %msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="STDOUT" />
      &lt;/root>
    &lt;/configuration></pre>
    
        <p>Running with <em>evaluatorWithMatcher.xml</em>:</p>
        <p class="source">java chapters.filters.FilterEvents src/main/java/chapters/filters/evaluatorWithMatcher.xml</p>
        <p>we obtain:
    		</p>
    		
        <p class="source">260  [main] INFO  chapters.filters.FilterEvents - logging statement 0
    264  [main] INFO  chapters.filters.FilterEvents - logging statement 2
    264  [main] INFO  chapters.filters.FilterEvents - logging statement 4
    266  [main] ERROR chapters.filters.FilterEvents - billing statement 6
    266  [main] INFO  chapters.filters.FilterEvents - logging statement 8</p>
    
        <p>If you need to define additional matchers, you can do so by
        adding further <code>&lt;matcher></code> elements.</p>
    
    
    
    
    
        <!-- ================================================================ -->
        <!-- ===================== TURBO FILTER ============================= -->
        <!-- ================================================================ -->
    
        <h2 class="doAnchor" name="TurboFilter">TurboFilters</h2>
        
        <p><code>TurboFilter</code> objects all extend the
        	<a href="../xref/ch/qos/logback/classic/turbo/TurboFilter.html">
        	<code>TurboFilter</code></a> abstract class. Like the regular
        	filters, they use ternary logic to return their evaluation of
        	the logging event.
        </p>
        
        <p>Overall, they work much like the previously mentioned
        filters. However, there are two main differences between
        <code>Filter</code> and <code>TurboFilter</code> objects.
        </p>
        
       	<p><code>TurboFilter</code> objects are tied to the logging
       	context. Hence, they are called not only when a given appender is
       	used, but each and every time a logging request is issued. Their
       	scope is wider than appender-attached filters.
       	</p>
       	
       	<p>More importantly, they are called before the
       	<code>LoggingEvent</code> object creation.
       	<code>TurboFilter</code> objects do not require the instantiation
       	of a logging event to filter a logging request. As such, turbo
       	filters are intended for high performance filtering of logging
    	events, even before the events are created.
        </p>
    
       	
       	<h3 class="doAnchor" name="yourOwnTurboFilter">Implementing your
       	own TurboFilter</h3>
        
        <p>To create your own <code>TurboFilter</code> component, just
        extend the <code>TurboFilter</code> abstract class. As previously,
        when implementing a customized filter object, developing a custom
        <code>TurboFilter</code> only asks that one implement the
        <code>decide()</code> method. In the next example, we create a
        slightly more complex filter:
        </p>
        
    <em>Example: Basic custom <code>TurboFilter</code> (<a href="../xref/chapters/filters/SampleTurboFilter.html">logback-examples/src/main/java/chapters/filters/SampleTurboFilter.java</a>)</em>		
    <pre class="prettyprint source">package chapters.filters;
    
    import org.slf4j.Marker;
    import org.slf4j.MarkerFactory;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.turbo.TurboFilter;
    import ch.qos.logback.core.spi.FilterReply;
    
    public class SampleTurboFilter extends TurboFilter {
    
      String marker;
      Marker markerToAccept;
    
      @Override
      public FilterReply decide(Marker marker, Logger logger, Level level,
          String format, Object[] params, Throwable t) {
    
        if (!isStarted()) {
          return FilterReply.NEUTRAL;
        }
    
        if ((markerToAccept.equals(marker))) {
          return FilterReply.ACCEPT;
        } else {
          return FilterReply.NEUTRAL;
        }
      }
    
      public String getMarker() {
        return marker;
      }
    
      public void setMarker(String markerStr) {
        this.marker = markerStr;
      }
    
      @Override
      public void start() {
        if (marker != null &amp;&amp; marker.trim().length() > 0) {
          markerToAccept = MarkerFactory.getMarker(marker);
          super.start(); 
        }
      }
    }
    </pre>
    
    		<p>The <code>TurboFilter</code> above accepts events that contain
    		a specific marker.  If said marker is not found, then the filter
    		passes the responsibility to the next filter in the chain.
    		</p>
    		
    		<p>To allow more flexibility, the marker that will be tested can
    		be specified in the configuration file, hence the getter and
    		setter methods. We also implemented the <code>start()</code>
    		method, to check that the option has been specified during the
    		configuration process.
    		</p>
    		
    		<p>Here is a sample configuration that makes use of our newly
    		created <code>TurboFilter</code>.
    		</p>
    		
        <em>Example: Basic custom <code>TurboFilter</code> configuration
        (logback-examples/src/main/java/chapters/filters/sampleTurboFilterConfig.xml)</em>
    
        <span class="asGroovy" onclick="return asGroovy('sampleTurboFilterConfig');">View as .groovy</span>
    
        <pre id="sampleTurboFilterConfig"  class="prettyprint source">&lt;configuration>
      <b>&lt;turboFilter class="chapters.filters.SampleTurboFilter">
        &lt;Marker>sample&lt;/Marker>
      &lt;/turboFilter></b>
    
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        &lt;encoder>
          &lt;pattern>
            %-4relative [%thread] %-5level %logger - %msg%n
          &lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;root>
        &lt;appender-ref ref="STDOUT" />
      &lt;/root>
    &lt;/configuration></pre>  
    
       	<p>Logback classic ships with several <code>TurboFilter</code>
       	classes ready for use.  The <a
       	href="../xref/ch/qos/logback/classic/turbo/MDCFilter.html"><code>MDCFilter</code></a>
       	checks the presence of a given value in the MDC whereas <a
       	href="../apidocs/ch/qos/logback/classic/turbo/DynamicThresholdFilter.html"><code>DynamicThresholdFilter</code></a>
       	allows filtering based on MDC key/level threshold associations. On
       	the other hand, <a
       	href="../xref/ch/qos/logback/classic/turbo/MarkerFilter.html"><code>MarkerFilter</code></a>
       	checks for the presence of a specific marker associated with the
       	logging request.
       	</p>
       	
       	<p>Here is a sample configuration, using both
       	<code>MDCFilter</code> and <code>MarkerFilter</code>.
       	</p>
       	
        <em>Example: <code>MDCFilter</code> and <code>MarkerFilter</code>
        configuration
        (logback-examples/src/main/java/chapters/filters/turboFilters.xml)</em>
    
        <span class="asGroovy" onclick="return asGroovy('turboFilters');">View as .groovy</span>
        <pre id="turboFilters" class="prettyprint source">&lt;configuration>
    
      &lt;turboFilter class="ch.qos.logback.classic.turbo.MDCFilter">
        &lt;MDCKey>username&lt;/MDCKey>
        &lt;Value>sebastien&lt;/Value>
        &lt;OnMatch>ACCEPT&lt;/OnMatch>
      &lt;/turboFilter>
    	
      &lt;turboFilter class="ch.qos.logback.classic.turbo.MarkerFilter">
        &lt;Marker>billing&lt;/Marker>
        &lt;OnMatch>DENY&lt;/OnMatch>
      &lt;/turboFilter>
    
      &lt;appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        &lt;encoder>
          &lt;pattern>%date [%thread] %-5level %logger - %msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;root level="INFO">
        &lt;appender-ref ref="console" />
      &lt;/root>  
    &lt;/configuration></pre>
    
    		<p>You can see this configuration in action by issuing the
    		following command:
    		</p>
        
        <p class="source">java chapters.filters.FilterEvents src/main/java/chapters/filters/turboFilters.xml</p>
    
    		<p>As we've seen previously, the <a
    		href="../xref/chapters/filters/FilterEvents.html"><code>FilterEvents</code></a>
    		application issues 10 logging requests, numbered 0 to 9. Except
    		for requests 3 and 6, all of the requests are of level
    		<em>INFO</em>, the same level as the one assigned to the root
    		logger. The 3rd request, is issued at the the <em>DEBUG</em>
    		level, which is below the effective level. However, since the MDC
    		key "username" is set to "sebastien" just before the 3rd request
    		and removed just afterwards, the <code>MDCFilter</code>
    		specifically accepts the request (and only that request). The 6th
    		request, issued at the <em>ERROR</em> level, is marked as
    		"billing". As such, it is denied by the MarkerFilter (the second
    		turbo filter in the configuration).
    		</p>
    		
    		<p>Thus, the output of <code>FilterEvents</code> application
    		configured with <em>turboFilters.xml</em> file shown above is:
    		</p>
    
        <p class="source">2006-12-04 15:17:22,859 [main] INFO  chapters.filters.FilterEvents - logging statement 0
    2006-12-04 15:17:22,875 [main] INFO  chapters.filters.FilterEvents - logging statement 1
    2006-12-04 15:17:22,875 [main] INFO  chapters.filters.FilterEvents - logging statement 2
    2006-12-04 15:17:22,875 [main] DEBUG chapters.filters.FilterEvents - logging statement 3
    2006-12-04 15:17:22,875 [main] INFO  chapters.filters.FilterEvents - logging statement 4
    2006-12-04 15:17:22,875 [main] INFO  chapters.filters.FilterEvents - logging statement 5
    2006-12-04 15:17:22,875 [main] INFO  chapters.filters.FilterEvents - logging statement 7
    2006-12-04 15:17:22,875 [main] INFO  chapters.filters.FilterEvents - logging statement 8
    2006-12-04 15:17:22,875 [main] INFO  chapters.filters.FilterEvents - logging statement 9</p>
    			
    			
    		<p>One can see that the 3rd request, which should not be displayed
    		if we only followed the overall <em>INFO</em> level, appears
    		anyway, because it matched the first <code>TurboFilter</code>
    		requirements and was accepted.
    		</p>    
    		
    		<p>On the other hand, the 6th request, that is an <em>ERROR</em>
    		level request should have been displayed. But it satisfied the
    		second <code>TurboFilter</code> whose <span
    		class="option">OnMatch</span> option is set to <em>DENY</em>.
    		Thus, the 6th request was not displayed.
    		</p>
    		
    
    
    		  
        <h3 class="doAnchor"
        name="DuplicateMessageFilter">DuplicateMessageFilter</h3>
    
        <p>The <code>DuplicateMessageFilter</code> merits a separate
        presentation.  This filter detects duplicate messages, and beyond
        a certain number of repetitions, drops repeated messages.
        </p>
    
        <p>To detect repetition, this filter uses simple String equality
        between messages. It does not detect messages which are very
        similar, varying only by few characters. For example, if you
        write:
        </p>
    
        <pre class="prettyprint source">logger.debug("Hello "+name0);
    logger.debug("Hello "+name1);</pre>
      
        <p>Assuming <code>name0</code> and <code>name1</code> have
        different values, the two "Hello" messages will be considered as
        unrelated. Depending on user demand, future releases may check for
        string similarity, eliminating repetitions of similar but not
        identical messages.
        </p>
    
        <p>Note that in case of parameterized logging, only the raw
        message is taken into consideration. For example, in the next two
        requests, the raw messages, i.e. "Hello {}.", are identical, and
        thus considered as repetitions.
        </p>
    
        <pre class="prettyprint source">logger.debug("Hello {}.", name0);
    logger.debug("Hello {}.", name1);</pre>
      
        <p>The number of allowed repetitions can be specified by the <span
        class="option">AllowedRepetitions</span> property. For example, if
        the property is set to 1, then the 2nd and subsequent
        occurrences of the same message will be dropped. Similarly, if the
        property is set to 2, then the 3rd and subsequent occurrences
        of the same message will be dropped. By default, the <span
        class="option">AllowedRepetitions</span> property is set to 5.
        </p>
    
        <p>In order to detect repetitions, this filter needs to keep
        references to old messages in an internal cache. The size of this
        cache is determined by the <span class="option">CacheSize</span>
        property. By the default, this is set to 100.
        </p>
    
        
        <em>Example: <code>DuplicateMessageFilter</code> 
        configuration (logback-examples/src/main/java/chapters/filters/duplicateMessage.xml)</em>
    
        <span class="asGroovy" onclick="return asGroovy('duplicateMessage');">View as .groovy</span>
        <pre id="duplicateMessage" class="prettyprint source">&lt;configuration>
    
      <b>&lt;turboFilter class="ch.qos.logback.classic.turbo.DuplicateMessageFilter"/></b>
    
      &lt;appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        &lt;encoder>
          &lt;pattern>%date [%thread] %-5level %logger - %msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;root level="INFO">
        &lt;appender-ref ref="console" />
      &lt;/root>  
    &lt;/configuration></pre>
    
      <p>Thus, the output for <code>FilterEvents</code> application
      configured with <em>duplicateMessage.xml</em> is:
      </p>
    
        <p class="source">2008-12-19 15:04:26,156 [main] INFO  chapters.filters.FilterEvents - logging statement 0
    2008-12-19 15:04:26,156 [main] INFO  chapters.filters.FilterEvents - logging statement 1
    2008-12-19 15:04:26,156 [main] INFO  chapters.filters.FilterEvents - logging statement 2
    2008-12-19 15:04:26,156 [main] INFO  chapters.filters.FilterEvents - logging statement 4
    2008-12-19 15:04:26,156 [main] INFO  chapters.filters.FilterEvents - logging statement 5
    2008-12-19 15:04:26,171 [main] ERROR chapters.filters.FilterEvents - billing statement 6</p>
    
        <p>"logging statement 0" is the first <em>occurrence</em> of the
        message "logging statement {}". "logging statement 1" is the first
        <em>repetition</em>, "logging statement 2" is the second
        repetition. Interestingly enough, "logging statement 3" of level
        DEBUG, is the <em>third</em> repetition, even though it is later
        dropped by virtue of the <a
        href="architecture.html#basic_selection">basic selection
        rule</a>. This can be explained by the fact that turbo filters are
        invoked before other types of filters, including the basic
        selection rule. Thus, <code>DuplicateMessageFilter</code>
        considers "logging statement 3" as a repetition, oblivious to the
        fact that it will be dropped further down in the processing
        chain. "logging statement 4" is the fourth repetition and "logging
        statement 5" the fifth. Statements 6 and beyond are dropped
        because only 5 repetitions are allowed by default.
        </p>
    
        <h1 class="doAnchor" name="logbac-access">In logback-access</h1>
        
        <p>Logback-access offers most of the features available with
        logback-classic. In particular, <code>Filter</code> objects are
        available and work in the same way as their logback-classic
        counterparts, with one notable difference. Instead of
        <code>LoggingEvent</code> instances logback-access filters act
        upon <a
        href="../xref/ch/qos/logback/access/spi/AccessEvent.html"><code>AccessEvent</code></a>
        instances. At present time, logback-access ships with a limited
        number of filters described below. If you would like to suggest
        additional filters, please contact the logback-dev mailing list.
        </p>
    
    		<h2 class="doAnchor"
    		name="countingFilter"><code>CountingFilter</code></h2>
    		
    		<p>With the help of <a
    		href="xref/ch/qos/logback/access/filter/CountingFilter.html"><code>CountingFilter</code></a>
    		class, logback-access can provide statistical data about access to
    		the web-server. Upon initialization, <code>CountingFilter</code>
    		registers itself as an MBean onto the platform's JMX server. You
    		can then interrogate that MBean for statistical data,
    		e.g. averages by minute, hour, day, week, or month. Other
    		statistics such the count for the preceding week, day, hour or
    		month as well as the total count are also available.
    		</p>
    		
    		<p>The following <em>logback-access.xml</em> configuration file
    		declares a <code>CountingFilter</code>.  </p>
    
        <pre class="prettyprint source">&lt;configuration>
      &lt;statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />
    
      <b>&lt;filter class="ch.qos.logback.access.filter.CountingFilter">
        &lt;name>countingFilter&lt;/name>
      &lt;/filter></b>
    
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        &lt;encoder>
          &lt;pattern>%h %l %u %t \"%r\" %s %b&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;appender-ref ref="STDOUT" />
    &lt;/configuration></pre>
    
        <p>You can examine the various statistics maintained by
        <code>CountingFilter</code> on your platform's JMX server via the
        <code>jconsole</code> application. </p>
    
    
        <img alt="CountingFilter via jconsole" src="images/chapters/filters/countingFilter.png" />
    	
    
        <h3 class="doAnchor" name="access_EvalutorFilter">EvaluatorFilter</h3>
    
        
        <p><a
        href="../xref/ch/qos/logback/core/filter/EvaluatorFilter.html"><code>EvaluatorFilter</code></a>
        is a generic filter encapsulating an
        <code>EventEvaluator</code>. As the name suggests, an
        <a
        href="../xref/ch/qos/logback/core/boolex/EventEvaluator.html">
        <code>EventEvaluator</code></a> evaluates whether a given criteria
        is met for a given event. On match and on mismatch,
        the hosting <code>EvaluatorFilter</code> will return the value
        specified by the <span class="option">onMatch</span> or
        <span class="option">onMismatch</span> properties respectively. Note that
        <code>EvaluatorFilter</code> has been previously discussed in the
        context of logback-classic (<a href="#evalutatorFilter">see
        above</a>). The present text is mostly a repetition of the
        previous discussion.</p>
    
    
        <p>Note that <code>EventEvaluator</code> is an abstract class. You
        can implement your own event evaluation logic by sub-classing
        <code>EventEvaluator</code>. Logback-access ships with a concrete
        implementation named <a
        href="../xref/ch/qos/logback/access/boolex/JaninoEventEvaluator.html">JaninoEventEvaluator</a>.
        It takes arbitrary Java language boolean expressions as the
        evaluation criteria. We refer to such Java language blocks as
        "<em>evaluation expressions</em>". Evaluation expressions enable
        great flexibility in event
        filtering. <code>JaninoEventEvaluator</code> requires the <a
        href="http://docs.codehaus.org/display/JANINO/Home">Janino
        library</a>. Please see the <a
        href="../setup.html#janino">corresponding section</a> of the setup
        document.
        </p>
    
        <p>Evaluation expressions are compiled on-the-fly during the
        interpretation of the configuration file. As a user, you do not
        need to worry about the actual plumbing. However, it is your
        responsibility to ensure that the Java language expression returns
        a boolean, i.e. that it evaluates to true or false. </p>
    
    
        <p>The evaluation expression is evaluated on the current access
        event. Logback-access automatically exports the current
        <code>AccessEvent</code> instance under the variable name
        <b><code>event</code></b>. You can read the various data
        associated with the HTTP request as well as the HTTP response via
        the <code>event</code> variable. Please refer to the <a
        href="../xref/ch/qos/logback/access/spi/AccessEvent.html"><code>AccessEvent</code>
        class source code</a> for the exact list.
        </p>
        
        <p>The next logback-access configuration file illustrates
        filtering based on the <a
        href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.5">404
        (Not Found)</a> HTTP response code. Every request resulting in a
        404 will be printed on the console.</p>
       	
    <em>Example: Access Evaluator (logback-examples/src/main/java/chapters/filters/accessEventEvaluator.xml)</em>
    <pre class="prettyprint source">&lt;configuration>
      &lt;statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />
    
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <b>&lt;filter class="ch.qos.logback.core.filter.EvaluatorFilter">
          &lt;evaluator>
            &lt;expression>event.getStatusCode() == 404&lt;/expression>
          &lt;/evaluator>
          &lt;onMismatch>DENY&lt;/onMismatch>
        &lt;/filter></b>
       &lt;encoder>&lt;pattern>%h %l %u %t %r %s %b&lt;/pattern>&lt;/encoder>
      &lt;/appender>
    
      &lt;appender-ref ref="STDOUT" />
    &lt;/configuration></pre>
    
    		<p>In the next example, we still log requests resulting in 404 errors,
    		except those requests asking for CSS files.
    		</p>	
    
    
        <em>Example 6.10: Access Evaluator (logback-examples/src/main/java/chapters/filters/accessEventEvaluator2.xml)</em>
        <pre class="prettyprint source">&lt;configuration>
      &lt;statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        &lt;filter class="ch.qos.logback.core.filter.EvaluatorFilter">
          &lt;evaluator name="Eval404">
            &lt;expression>
             <b>(event.getStatusCode() == 404)</b>
               <b>&amp;amp;&amp;amp;</b>  &lt;!-- ampersand characters need to be escaped -->
             <b>!(event.getRequestURI().contains(".css"))</b>
            &lt;/expression>
          &lt;/evaluator>
          &lt;onMismatch>DENY&lt;/onMismatch>
        &lt;/filter>
    
       &lt;encoder>&lt;pattern>%h %l %u %t %r %s %b&lt;/pattern>&lt;/encoder>
      &lt;/appender>
    
      &lt;appender-ref ref="STDOUT" />
    &lt;/configuration>
        </pre>
    	
        <script src="../templates/footer.js" type="text/javascript"></script>
    
      </div>
    </body>
    </html>
    ����������������������������������������������������������������logback_1.0.13/docs/manual/.htaccess����������������������������������������������������������������0000644�0001750�0001750�00000000256�12143164240�017157� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Redirect permanent /contextSelector.html http://logback.qos.ch/manual/loggingSeparation.html
    Redirect permanent /joran.html http://logback.qos.ch/manual/configuration.html
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/manual/underTheHood.html��������������������������������������������������������0000644�0001750�0001750�00000000764�12143164240�020643� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">  
      <head> 
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>under the hood</title>
      </head>
      <body>
        <h2>Under The Hood Sequence Diagram</h2>
      
        <img src="images/chapters/architecture/underTheHoodSequence2.gif" alt="underTheHoodSequence2.gif"/>
    
      </body>
    </html>
    ������������logback_1.0.13/docs/manual/loggingSeparation.html���������������������������������������������������0000644�0001750�0001750�00000055107�12143164240�021730� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Chapter 9: Logging separation</title>
        <link rel="stylesheet" type="text/css" href="../css/common.css" />
        <link rel="stylesheet" type="text/css" href="../css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="../css/_print.css" media="print" />
        <link rel="stylesheet" type="text/css" href="../css/prettify.css" media="screen" />
      </head>
      <body onload="prettyPrint(); decorate();">
        <script type="text/javascript">prefix='../';</script>
        <script type="text/javascript" src="../js/prettify.js"></script>
        <script type="text/javascript" src="../templates/header.js"></script>
        <script type="text/javascript" src="../js/jquery-min.js"></script>
        <script type="text/javascript" src="../js/decorator.js"></script>
    
        <div id="left">
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="../templates/left.js" type="text/javascript"></script>
        </div>
        <div id="right">
          <script src="menu.js" type="text/javascript"></script>
        </div>
        <div id="content">	
    	
        <h1>Chapter 9: Logging separation</h1>
          
        <div class="quote">
          <p><em>It is not knowledge, but the act of learning, not
          possession but the act of getting there, which grants the greatest
          enjoyment. When I have clarified and exhausted a subject, then I
          turn away from it, in order to go into darkness again; the
          never-satisfied man is so strange if he has completed a structure,
          then it is not in order to dwell in it peacefully, but in order to
          begin another. I imagine the world conqueror must feel thus, who,
          after one kingdom is scarcely conquered, stretches out his arms
          for others.</em></p>
    
          <p>&mdash;KARL FRIEDRICH GAUSS, Letter to Bolyai, 1808.</p>
    
          <p><em>Style, like sheer silk, too often hides eczema.</em></p>
          
          <p>&mdash;ALBERT CAMUS, <em>The Fall</em></p>
    
        </div>
    
        <script src="../templates/creative.js" type="text/javascript"></script>		
        <script src="../templates/setup.js" type="text/javascript"></script>
    
        <h2>The problem: Logging Separation</h2>
    
        <p>The chapter deals with a relatively difficult problem of
        providing a separate logging environment for multiple applications
        running on the same web or EJB container. In the remainder of this
        chapter the term "application" will be used to refer to either a
        web-application or a J2EE application interchangeably.  In a
        separated logging environment, each application sees a distinct
        logback environment, so that the logback configuration of one
        application does not interfere with the settings of another. In
        more technical terms, each web-application has a distinct copy of
        <code>LoggerContext</code> reserved for its own use. Recall that
        in logback, each logger object is manufactured by a
        <code>LoggerContext</code> to which it remains attached for as
        long as the logger object lives in memory. A variant of this
        problem is the separation of application logging and the logging
        of the container itself.
        </p>
    
        <h2 class="doAnchor" name="easy">The simplest and easiest
        approach</h2>
    
        <p>Assuming your container supports child-first class loading,
        separation of logging can be accomplished by embedding a copy of
        slf4j and logback jar files in each of your applications. For
        web-applications, placing slf4j and logback jar files under the
        <em>WEB-INF/lib</em> directory of the web-application is
        sufficient to endow each web-application with a separate logging
        environment. A copy of the <em>logback.xml</em> configuration file
        placed under <em>WEB-INF/classes</em> will be picked up when
        logback is loaded into memory. 
        </p>
    
        <p>By virtue of class loader separation provided by the container,
        each web-application will load its own copy of
        <code>LoggerContext</code> which will pickup its own copy of
        <em>logback.xml</em>.</p>
        
        <p>Easy as pie.</p>
    
        <p>Well, not exactly. Sometimes you will be forced to place SLF4J
        and logback artifacts in a place accessible from all applications,
        typically because a shared library uses SLF4J. In that case, all
        applications will share the same logging environment. There are
        various other scenarios where a copy of SLF4J and logback
        artifacts is necessarily placed at a spot where it can be seen by
        all applications making logging separation by class loader
        separation impossible. All hope is not lost. Please read on.
        </p>
    
        <h2 class="doAnchor" name="contextSelectors">Context
        Selectors</h2>
    
        <p>Logback provides a mechanism for a single instance of SLF4J and
        logback classes loaded into memory to provide multiple logger
        contexts. When you write:
        </p>
    
        <pre class="prettyprint source">Logger logger = LoggerFactory.getLogger("foo");</pre>
    
        <p>the <code>getLogger</code>() method in
        <code>LoggerFactory</code> class will ask the SLF4J binding for a
        <code>ILoggerFactory</code>. When SLF4J is bound to logback, the
        task of returning an <code>ILoggerFactory</code> is delegated to
        an instance of <a
        href="../apidocs/ch/qos/logback/classic/selector/ContextSelector.html">ContextSelector</a>. Note
        that <code>ContextSelector</code> implementations always return
        instances <code>LoggerContext</code>. This class implements the
        <code>ILoggerFactory</code> interface.  In other words, a context
        selector has the option to returning any
        <code>LoggerContext</code> instance it sees fit according to its
        own criteria. Hence the name context <em>selector</em>.
        </p>
    
        <p>By default, the logback binding uses <a
        href="../xref/ch/qos/logback/classic/selector/DefaultContextSelector.html">DefaultContextSelector</a>
        which always returns the same <code>LoggerContext</code>, called
        the default logger context.</p>
    
        <p>You can specify a different context selector by setting the
        <em>logback.ContextSelector</em> system property. Suppose you
        would like to specify that context selector to an instance of the
        <code>myPackage.myContextSelector</code> class, you would add the
        following system property: </p>
    
        <p class="source">-Dlogback.ContextSelector=myPackage.myContextSelector</p>
    
        <p>The context selector needs to implement the
        <code>ContextSelector</code> interface and have a constructor
        method admitting a <code>LoggerContext</code> instance as its only
        parameter.
        </p>
    
    
        <h3 class="doAnchor"
        name="ContextJNDISelector">ContextJNDISelector</h3>
    
        <p>Logback-classic ships with a selector called
        <code>ContextJNDISelector</code> which selects the logger context
        based on data available via JNDI lookup. This approach leverages
        JNDI data separation mandated by the J2EE specification. Thus, the
        same environment variable can be set to carry a different value in
        different applications. In other words, calling
        <code>LoggerFactory.getLogger()</code> from different applications
        will return a logger attached to a different logger context, even
        if there is a single LoggerFactory class loaded into memory shared
        by all applications. That's logging separation for you.
        </p>
    
        <p>To enable <code>ContextJNDISelector</code>, the
        <em>logback.ContextSelector</em> system property needs to be set
        to "JNDI", as follows:</p>
    
        <p class="source">-Dlogback.ContextSelector=JNDI</p>
    
        <p>Note that the value <code>JNDI</code> is a convenient shorthand
        for
        <code>ch.qos.logback.classic.selector.ContextJNDISelector</code>.</p>
    
        <h3 class="doAnchor" name="settingJNDIVariables">Setting JNDI
        variables in applications</h3>
        
        <p>In each of your applications, you need to name the logging
        context for the application. For a web-application, JNDI
        environment entries are specified within the <em>web.xml</em>
        file. If "kenobi" was the name of your application, you would add
        the following XML element to kenobi's web.xml file:</p>
    
        <pre class="prettyprint source">&lt;env-entry>
      &lt;env-entry-name>logback/context-name&lt;/env-entry-name>
      &lt;env-entry-type>java.lang.String&lt;/env-entry-type>
      &lt;env-entry-value>kenobi&lt;/env-entry-value>
    &lt;/env-entry></pre>
    
        <p>Assuming you have enabled <code>ContextJNDISelector</code>,
        logging for Kenobi will be done using a logger context named
        "kenobi". Moreover, the "kenobi" logger context will be
        initialized by <em>convention</em> by looking up the configuration
        file called <em>logback-kenobi.xml</em> as a <em>resource</em>
        using the thread context class loader. Thus, for example for the
        kenobi web-application, <em>logback-kenobi.xml</em> should be
        placed under the <em>WEB-INF/classes</em> folder.
        </p>
    
        <p>If you wish to, you may specify a different configuration file
        other than the convention, by setting the
        "logback/configuration-resource" JNDI variable. For example, for
        the kenobi web-application, if you wish to specify
        <em>aFolder/my_config.xml</em> instead of the conventional
        <em>logback-kenobi.xml</em>, you would add the following XML
        element to web.xml
        </p>
    
    
       <pre class="prettyprint source">&lt;env-entry>
      &lt;env-entry-name>logback/configuration-resource&lt;/env-entry-name>
      &lt;env-entry-type>java.lang.String&lt;/env-entry-type>
      &lt;env-entry-value>aFolder/my_config.xml&lt;/env-entry-value>
    &lt;/env-entry></pre> 
    
        <p>The file <em>my_config.xml</em> should be placed under
        <em>WEB-INF/classes/aFolder/</em>. The important point to remember
        is that the configuration is looked up as a Java resource using
        the current thread's context class loader.
        </p>
        
    
        <h3 class="doAnchor" name="jndiTomcat">Configuring Tomcat for
        ContextJNDISelector</h3>
    
        <p>First, place the logback jars (that is
        logback-classic-1.0.13.jar,
        logback-core-1.0.13.jar and
        slf4j-api-1.7.5.jar) in Tomcat's global (shared) class
        folder. In Tomcat 6.x, this directory is
        <em>$TOMCAT_HOME/lib/</em>.
        </p>
    
        <p>The <em>logback.ContextSelector</em> system property can be set
        by adding the following line to the <em>catalina.sh</em> script,
        catalina.bat in Windows, found under <em>$TOMCAT_HOME/bin</em>
        folder.</p>
    
        <p class="source">JAVA_OPTS="$JAVA_OPTS -Dlogback.ContextSelector=JNDI"</p>
    
    
        <h3 class="doAnchor" name="hotDeploy">Hot deploying
        applications</h3>
    
        <p>When the web-application is recycled or shutdown, we strongly
        recommend that the incumbent <code>LoggerContext</code> be closed
        so that it can be properly garbage collected. Logback ships with a
        <code>ServletContextListener</code> called <a
        href="../xref/ch/qos/logback/classic/selector/servlet/ContextDetachingSCL.html"><code>ContextDetachingSCL</code></a>,
        designed specifically for detaching the
        <code>ContextSelector</code> instance associated with the older
        web-application instance. It can be installed by adding the
        following lines into your web-applications <em>web.xml</em>
        file.</p>
    
        <pre class="prettyprint source">&lt;listener>
      &lt;listener-class>ch.qos.logback.classic.selector.servlet.ContextDetachingSCL&lt;/listener-class>
    &lt;/listener></pre>
    
        <p><span class="label notice">Note</span> Most containers invoke
        the <code>contextInitialized()</code> method of listeners in the
        order in which they are declared but invoke their
        <code>contextDestroyed()</code> method in reverse order. It
        follows that if you have multiple
        <code>ServletContextListener</code> declarations in your
        <em>web.xml</em>, then <code>ContextDetachingSCL</code> should be
        declared <em>first</em> so that its
        <code>contextDestroyed()</code> method is invoked <em>last</em>
        during application shutdown. </p>
    
        <h3 class="doAnchor" name="betterPerf">Better performance</h3>
    
        <p>When <code>ContextJNDISelector</code> is active, each time a
        logger is retrieved, a JNDI lookup must be performed. This can
        negatively impact performance, especially if you are using
        non-static (a.k.a. instance) logger references. Logback ships with a
        servlet filter named <a
        href="../xref/ch/qos/logback/classic/selector/servlet/LoggerContextFilter.html">LoggerContextFilter</a>,
        specifically designed to avoid the JNDI lookup cost. It can
        be installed by adding the following lines to your application's
        web.xml file.</p>
    
     <pre class="prettyprint source">&lt;filter>
      &lt;filter-name>LoggerContextFilter&lt;/filter-name>
      &lt;filter-class>ch.qos.logback.classic.selector.servlet.LoggerContextFilter&lt;/filter-class>
    &lt;/filter>
    &lt;filter-mapping>
      &lt;filter-name>LoggerContextFilter&lt;/filter-name>
      &lt;url-pattern>/*&lt;/url-pattern>
    &lt;/filter-mapping></pre>
    
       <p>At the beginning of each http-request,
       <code>LoggerContextFilter</code> will obtain the logger context
       associated with the application and then place it in a
       <code>ThreadLocal</code> variable. <code>ContextJNDISelector</code>
       will first check if the <code>ThreadLocal</code> variable is
       set. If it is set, then JNDI lookup will skipped. Note that at the
       end of the http request, the <code>ThreadLocal</code> variable will
       be nulled.  Installing <code>LoggerContextFilter</code> improves
       logger retrieval performance by a wide margin.
       </p>
    
       <p>Nulling the <code>ThreadLocal</code> variable allows garbage
       collection of the web-application when it is stopped or
       recycled.</p>
    
    
       <h2 class="doAnchor" name="tamingStaticRefs">Taming static
       references in shared libraries</h2>
    
       <p><code>ContextJNDISelector</code> works nicely to create logging
       separation when SLF4J and logback artifacts are shared by all
       applications. When <code>ContextJNDISelector</code> is active, each
       call to <code>LoggerFactory.getLogger()</code> will return a logger
       belonging to a logger context associated with the calling/current
       application.</p>
    
       <p>The common idiom for referencing a logger is via a static
       reference. For example,
       </p>
    
       <pre class="prettyprint source">public class Foo {
      <b>static</b> Logger logger = LoggerFactory.getLogger(Foo.class);
      ...
    }</pre>
    
        <p>Static logger references are both memory and CPU
        efficient. Only one logger reference is used for all instances of
        the class. Moreover, the logger instance is retrieved only once,
        when the class is loaded into memory. If the host class belongs to
        some application, say kenobi, then the static logger will be
        attached to kenobi's logger context by virtue of
        <code>ContextJNDISelector</code>. Similarly, if the host class
        belongs to some other application, say yoda, then its static
        logger reference will be attached to yoda's logger context, again
        by virtue of <code>ContextJNDISelector</code>.
        </p>
        
        <p>If a class, say <code>Mustafar</code>, belongs to a library
        shared by both <em>kenobi</em> and <em>yoda</em>, as long as
        <code>Mustafar</code> has non static loggers, each invocation of
        <code>LoggerFactory.getLogger()</code> will return a logger
        belonging to a logger context associated with the calling/current
        application. But if <code>Mustafar</code> has a static logger
        reference, then its logger will be attached to the logger context of the
        application that calls it first. Thus,
        <code>ContextJNDISelector</code> does not provide logging
        separation in case of shared classes using static logger
        references. This corner case has eluded a solution for eons.</p>
    
    
        <p>The only way to solve this issue transparently and perfectly
        would be to introduce another level of indirection inside loggers
        so that each logger-shell somehow delegated work to an inner
        logger attached to the appropriate context. This approach would be
        quite difficult to implement and would incur a significant
        computational overhead. It is not an approach we plan to pursue.
        </p>
    
        <p>It goes without saying that one could trivially solve the
        "shared class static logger" problem by moving the shared classes
        inside the web-apps (unshare them). If unsharing is not possible,
        then we can solicit the magical powers of <a
        href="appenders.html#SiftingAppender"><code>SiftingAppender</code></a>
        in order to separate logging using JNDI data as separation
        criteria.
        </p>
    
        <p>Logback ships with a discriminator called <a
        href="../xref/ch/qos/logback/classic/sift/JNDIBasedContextDiscriminator.html">JNDIBasedContextDiscriminator</a>
        which returns the name of the current logger context as computed
        by <code>ContextJNDISelector</code>. The
        <code>SiftingAppender</code> and
        <code>JNDIBasedContextDiscriminator</code> combination will create
        separate appenders for each web-application.
        </p>
    
        <pre class="prettyprint source">&lt;configuration>
    
      &lt;statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />  
    
      &lt;appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
        &lt;discriminator class="ch.qos.logback.classic.sift.JNDIBasedContextDiscriminator">
          &lt;defaultValue>unknown&lt;/defaultValue>
        &lt;/discriminator>
        &lt;sift>
          &lt;appender name="FILE-${contextName}" class="ch.qos.logback.core.FileAppender">
            &lt;file><b>${contextName}.log</b>&lt;/file>
            &lt;encoder>
              &lt;pattern>%-50(%level %logger{35}) cn=%contextName - %msg%n&lt;/pattern>
             &lt;/encoder>
          &lt;/appender>
         &lt;/sift>
        &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="SIFT" />
      &lt;/root>
    &lt;/configuration></pre>
    
    
       <p>If kenobi and yoda are web-applications, then the above
       configuration will output yoda's log output to <em>yoda.log</em>
       and kenobi's logs to <em>kenobi.log</em>; this even works for logs generated
       by static logger references located in shared classes.</p>
     
       <p>You can try out the technique just described with the help of the
       <a
       href="http://github.com/ceki/logback-starwars">logback-starwars</a>
       project.
       </p>
     
     
       <p>The above approach solves the logging separation problem but is
       rather complex. It requires the proper installation of
       <code>ContextJNDISelector</code> and mandates that appenders be
       wrapped by <code>SiftingAppender</code> which is a non-trivial beast
       in itself.
       </p>
     
       <p>Note that each logging context can be configured using the same
       file or alternatively different files. The choice is up to
       you. Instructing all contexts to use the same configuration file
       is simpler as only one file has to be maintained.  Maintaining a
       distinct configuration file for each application is harder to
       maintain but allows for more flexibility.</p>
     
       <p>So are we done yet? Can we declare victory and go home? Well, not
       quite.</p>
     
       <p>Let's assume the web-application <code>yoda</code> is initialized
       before <code>kenobi</code>. To initialize <code>yoda</code>, visit
       <code>http://localhost:port/yoda/servlet</code> which will invoke
       the <code>YodaServlet</code>. This servlet just says hello and logs
       message before calling the <code>foo</code> method in
       <code>Mustafar</code> which not-surprisingly logs a simple message
       and returns.
       </p>
     
       <p>After <code>YodaServlet</code> is called, the contents of
       <em>yoda.log</em> file should contain</p>
     
       <pre class="source">DEBUG ch.qos.starwars.yoda.YodaServlet             cn=yoda - in doGet()
    DEBUG ch.qos.starwars.shared.Mustafar              cn=yoda - in foo()</pre>
     
       <p>Note how both log entries are associated with the "yoda" context
       name. At this stage and until the server stops, the
       <code>ch.qos.starwars.shared.Mustafar</code> logger is attached to
       the 'yoda' context and will remain so until the server is stopped.
       </p>
    
       <p>Visiting <code>http://localhost:port/kenobi/servlet</code> will
       output the following in <em>kenobi.log</em>.</p>
    
       <pre class="source">DEBUG ch.qos.starwars.kenobi.KenobiServlet          <b>cn=kenobi</b> - in doGet()
    DEBUG ch.qos.starwars.shared.Mustafar               <b>cn=yoda</b> - in foo()</pre>
    
       <p>Note that even if the
       <code>ch.qos.starwars.shared.Mustafar</code> logger outputs to
       <em>kenobi.log</em> it is still attached to 'yoda'. Thus, we have
       two distinct logging contexts logging to the same file, in this
       case <em>kenobi.log</em>. Each of these contexts reference
       <code>FileAppender</code> instances, nested within distinct
       <code>SiftingAppender</code> instances, that are logging to the same
       file. Although logging separation seems to function according to
       our wishes, FileAppender instances cannot safely write to the same
       file unless they enable <span class="option">prudent</span>
       mode. Otherwise, the target file will be corrupted.</p>
       
       <p>Here is the configuration file enabling prudent mode:</p>
    
        <pre class="prettyprint source">&lt;configuration>
    
      &lt;statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />  
    
      &lt;appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
        &lt;discriminator class="ch.qos.logback.classic.sift.JNDIBasedContextDiscriminator">
          &lt;defaultValue>unknown&lt;/defaultValue>
        &lt;/discriminator>
        &lt;sift>
          &lt;appender name="FILE-${contextName}" class="ch.qos.logback.core.FileAppender">
            &lt;file>${contextName}.log&lt;/file>
            <b>&lt;prudent>true&lt;/prudent></b>
            &lt;encoder>
              &lt;pattern>%-50(%level %logger{35}) cn=%contextName - %msg%n&lt;/pattern>
             &lt;/encoder>
          &lt;/appender>
         &lt;/sift>
        &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="SIFT" />
      &lt;/root>
    &lt;/configuration></pre>
    
    
       <p>If you were able to keep up with the discussion thus far and
       have actually tried the logback-starwars examples, then you must be
       truly obsessed with logging. You should consider seeking <a
       href="http://www.qos.ch/shop/products/professionalSupport">professional
       help</a>.</p>
    
    
    
       <script src="../templates/footer.js"
       type="text/javascript"></script> </div>
       
       </body> 
    </html>
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/manual/appenders.html�����������������������������������������������������������0000644�0001750�0001750�00000542766�12143164240�020251� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Chapter 4: Appenders</title>
        <link rel="stylesheet" type="text/css" href="../css/common.css" />
        <link rel="stylesheet" type="text/css" href="../css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="../css/_print.css" media="print" />
        <link rel="stylesheet" type="text/css" href="../css/prettify.css" media="screen"/>    
      </head>
      <body onload="prettyPrint(); decorate();">
        <script type="text/javascript">prefix='../';</script>
        <script type="text/javascript" src="../js/prettify.js"></script>
        <script type="text/javascript" src="../templates/header.js"></script>
        <script type="text/javascript" src="../js/dsl.js"></script>
        <script type="text/javascript" src="../js/jquery-min.js"></script>
        <script type="text/javascript" src="../js/decorator.js"></script>
        <div id="left">      
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="../templates/left.js" type="text/javascript"></script>
        </div>    
        <div id="right">
          <script src="menu.js" type="text/javascript"></script>
        </div>
    
        <div id="content">
    
        <h1>Chapter 4: Appenders</h1>
    
        <div class="quote">
    
          <p><em>There is so much to tell about the Western country in
          that day that it is hard to know where to start. One thing sets
          off a hundred others. The problem is to decide which one to tell
          first.</em></p>
      
          <p>&mdash;JOHN STEINBECK, <em>East of Eden</em></p>
        </div>
    
    
        <script src="../templates/creative.js" type="text/javascript"></script>
        <script src="../templates/setup.js" type="text/javascript"></script>
        
        <h2><a name="whatIsAnAppender" href="#whatIsAnAppender"><span
        class="anchor"/></a>What is an Appender?</h2>
        
    		<p>Logback delegates the task of writing a logging event to
    		components called appenders.  Appenders must implement the <a
    		href="../xref/ch/qos/logback/core/Appender.html"><code>ch.qos.logback.core.Appender</code></a>
    		interface.  The salient methods of this interface are summarized
    		below:
    		</p>
    		<pre class="prettyprint source">package ch.qos.logback.core;
      
    import ch.qos.logback.core.spi.ContextAware;
    import ch.qos.logback.core.spi.FilterAttachable;
    import ch.qos.logback.core.spi.LifeCycle;
      
    
    public interface Appender&lt;E> extends LifeCycle, ContextAware, FilterAttachable {
    
      public String getName();
      public void setName(String name);
      <b>void doAppend(E event);</b>
      
    }</pre>
    
    	<p>Most of the methods in the <code>Appender</code> interface are
    	setters and getters. A notable exception is the
    	<code>doAppend()</code> method taking an object instance of type
    	<em>E</em> as its only parameter. The actual type of <em>E</em>
    	will vary depending on the logback module. Within the
    	logback-classic module <em>E</em> would be of type <a
    	href="../apidocs/ch/qos/logback/classic/spi/ILoggingEvent.html">ILoggingEvent</a>
    	and within the logback-access module it would be of type <a
    	href="../apidocs/ch/qos/logback/access/spi/AccessEvent.html">AccessEvent</a>.
    	The <code>doAppend()</code> method is perhaps the most important in
    	the logback framework.  It is responsible for outputting the logging
    	events in a suitable format to the appropriate output device.
      </p>
    
      <p>Appenders are named entities.  This ensures that they can be
      referenced by name, a quality confirmed to be instrumental in
      configuration scripts. The <code>Appender</code> interface extends
      the <code>FilterAttachable</code> interface. It follows that one or
      more filters can be attached to an appender instance. Filters are
      discussed in detail in a subsequent chapter.
    	</p>
    	
    	<p>Appenders are ultimately responsible for outputting logging
    	events.  However, they may delegate the actual formatting of the
    	event to a <code>Layout</code> or to an <code>Encoder</code> object.
    	Each layout/encoder is associated with one and only one appender,
    	referred to as the owning appender. Some appenders have a built-in
    	or fixed event format. Consequently, they do not require nor have a
    	layout/encoder. For example, the <code>SocketAppender</code> simply
    	serializes logging events before transmitting them over the wire.
    	</p>
    	
    	
    	<h2 class="doAnchor" name="AppenderBase">AppenderBase</h2>
    	
    	<p>The <a href="../xref/ch/qos/logback/core/AppenderBase.html">
    	<code>ch.qos.logback.core.AppenderBase</code></a> class is an
    	abstract class implementing the <code>Appender</code> interface.  It
    	provides basic functionality shared by all appenders, such as
    	methods for getting or setting their name, their activation status,
    	their layout and their filters.  It is the super-class of all
    	appenders shipped with logback.  Although an abstract class,
    	<code>AppenderBase</code> actually implements the
    	<code>doAppend()</code> method in the <code>Append</code> interface.
    	Perhaps the clearest way to discuss <code>AppenderBase</code> class
    	is by presenting an excerpt of actual source code.
    	</p>
    	
    <pre class="prettyprint source">public synchronized void doAppend(E eventObject) {
    
      // prevent re-entry.
      if (guard) {
        return;
      }
    
      try {
        guard = true;
    
        if (!this.started) {
          if (statusRepeatCount++ &lt; ALLOWED_REPEATS) {
            addStatus(new WarnStatus(
                "Attempted to append to non started appender [" + name + "].",this));
          }
          return;
        }
    
        if (getFilterChainDecision(eventObject) == FilterReply.DENY) {
          return;
        }
        
        // ok, we now invoke the derived class's implementation of append
        this.append(eventObject);
    
      } finally {
        guard = false;
      }
    }</pre>
    	
    	<p>This implementation of the <code>doAppend()</code> method is
    	synchronized.  It follows that logging to the same appender from
    	different threads is safe. While a thread, say <em>T</em>, is
    	executing the <code>doAppend()</code> method, subsequent calls by
    	other threads are queued until <em>T</em> leaves the
    	<code>doAppend()</code> method, ensuring <em>T</em>'s exclusive
    	access to the appender.
    	</p>
    
      <p>Since such synchronization is not always appropriate, logback
      ships with <a
      href="../xref/ch/qos/logback/core/UnsynchronizedAppenderBase.html"><code>ch.qos.logback.core.UnsynchronizedAppenderBase</code></a>
      which is very similar to the <a
      href="../xref/ch/qos/logback/core/AppenderBase.html"><code>AppenderBase</code></a>
      class. For the sake of conciseness, we will be discussing
      <code>UnsynchronizedAppenderBase</code> in the remainder of this document.
      </p>
    
    
      <p>The first thing the <code>doAppend()</code> method does is to
      check whether the guard is set to true. If it is, it immediately
      exits. If the guard is not set, it is set to true at the next
      statement. The guard ensures that the <code>doAppend()</code> method
      will not recursively call itself. Just imagine that a component,
      called somewhere beyond the <code>append()</code> method, wants to
      log something. Its call could be directed to the very same appender
      that just called it resulting in an infinite loop and a stack
      overflow.
    	</p>
    	
    	<p>In the following statement we check whether the
    	<code>started</code> field is true.  If it is not,
    	<code>doAppend()</code> will send a warning message and return.  In
    	other words, once an appender is closed, it is impossible to write
    	to it.  <code>Appender</code> objects implement the
    	<code>LifeCycle</code> interface, which implies that they implement
    	<code>start()</code>, <code>stop()</code> and
    	<code>isStarted()</code> methods.  After setting all the properties of
    	an appender, Joran, logback's configuration framework, calls the
    	<code>start()</code> method to signal the appender to activate its
    	properties.  Depending on its kind, an appender may fail to start if
    	certain properties are missing or because of interference between
    	various properties.  For example, given that file creation depends on
    	truncation mode, <code>FileAppender</code> cannot act on the value
    	of its <code>File</code> option until the value of the Append option
    	is also known with certainty. The explicit activation step ensures
    	that an appender acts on its properties <em>after</em> their values
    	become known.
    	</p>
    	
    	<p>If the appender could not be started or if it has been stopped, a
    	warning message will be issued through logback's internal status
    	management system. After several attempts, in order to avoid
    	flooding the internal status system with copies of the same warning
    	message, the <code>doAppend()</code> method will stop issuing these
    	warnings.
      </p>
    
    	<p>The next <code>if</code> statement checks the result of the
    	attached filters.  Depending on the decision resulting from the
    	filter chain, events can be denied or explicitly accepted.  In
    	the absence of a decision by the filter chain, events are accepted
    	by default.
    	</p>
    	
    	<p>The <code>doAppend()</code> method then invokes the derived
    	classes' implementation of the <code>append()</code> method. This
    	method does the actual work of appending the event to the
    	appropriate device.
    	</p>
    	
      <p>Finally, the guard is released so as to allow a subsequent
      invocation of the <code>doAppend()</code> method.
      </p>
    
    	<p>For the remainder of this manual, we reserve the term "option" or
    	alternatively "property" for any attribute that is inferred
    	dynamically using JavaBeans introspection through setter and getter
    	methods. </p>
    	
    	<h1>Logback-core</h1>
    	
    	<p>Logback-core lays the foundation upon which the other logback
    	modules are built. In general, the components in logback-core
    	require some, albeit minimal, customization. However, in the next
    	few sections, we describe several appenders which are ready for use
    	out of the box.
      </p>
    
    
    	
    	<h2 class="doAnchor"
    	name="OutputStreamAppender">OutputStreamAppender
      </h2>
    	
    	<p><a
    	href="../xref/ch/qos/logback/core/OutputStreamAppender.html"><code>OutputStreamAppender</code></a>
    	appends events to a <code>java.io.OutputStream</code>.  This class
    	provides basic services that other appenders build upon.  Users do
    	not usually instantiate <code>OutputStreamAppender</code> objects
    	directly, since in general the <code>java.io.OutputStream</code>
    	type cannot be conveniently mapped to a string, as there is no way
    	to specify the target <code>OutputStream</code> object in a
    	configuration script.  Simply put, you cannot configure a
    	<code>OutputStreamAppender</code> from a configuration file.
    	However, this does not mean that <code>OutputStreamAppender</code>
    	lacks configurable properties.  These properties are described next.
    	</p>
    	
      <table class="bodyTable striped">
        <tr>
          <th>Property Name</th>
          <th>Type</th>
          <th>Description</th>
        </tr>
        
        <tr>
          <td><span class="prop" name="osaEncoder">encoder</span></td>
    
          <td><a
          href="../xref/ch/qos/logback/core/encoder/Encoder.html"><code>Encoder</code></a></td>
    
          <td>Determines the manner in which an event is written to the
          underlying <code>OutputStreamAppender</code>. Encoders are
          described in a <a href="encoders.html">dedicated chapter</a>.
    			</td>
    		</tr>
    	
    	</table>
        
      <p>The <code>OutputStreamAppender</code> is the super-class of three other
    	appenders, namely <code>ConsoleAppender</code>,
    	<code>FileAppender</code> which in turn is the super class of
    	<code>RollingFileAppender</code>. The next figure illustrates the
    	class diagram for <code>OutputStreamAppender</code> and its subclasses.
    	</p>
    	
    	<img src="images/chapters/appenders/appenderClassDiagram.jpg" alt="A UML diagram showing OutputStreamAppender and sub-classes"/>
    	
    
    	<h2 class="doAnchor" name="ConsoleAppender">ConsoleAppender</h2>
    	
      <p>The <a href="../xref/ch/qos/logback/core/ConsoleAppender.html">
      <code>ConsoleAppender</code></a>, as the name indicates, appends on
      the console, or more precisely on <em>System.out</em> or
      <em>System.err</em>, the former being the default
      target. <code>ConsoleAppender</code> formats events with the help of
      an encoder specified by the user. Encoders will be discussed in a
      subsequent chapter. Both <em>System.out</em> and <em>System.err</em>
      are of type <code>java.io.PrintStream</code>.  Consequently, they
      are wrapped inside an <code>OutputStreamWriter</code> which buffers
      I/O operations.
    	</p>
    	
    	<table class="bodyTable striped">
    			<tr>
    			<th>Property Name</th>
    			<th>Type</th>
    			<th>Description</th>
    		</tr>
    		<tr>
    			<td><span class="prop" container="conApp">encoder</span></td>
          <td>
            <a href="../xref/ch/qos/logback/core/encoder/Encoder.html"><code>Encoder</code></a>
          </td>
    			<td>See <code>OutputStreamAppender</code> properties.</td>
    		</tr>
    		<tr>
    			<td><span class="prop" container="conApp">target</span></td>
    			<td><code>String</code></td>
    			<td>
    				One of the String values <em>System.out</em> or 
    				<em>System.err</em>. The default target is <em>System.out</em>.
    			</td>
    		</tr>
    
    		<tr>
    			<td><span class="prop" container="conApp">withJansi</span></td>
    			<td><code>boolean</code></td>
    			<td>By the default <span class="prop">withJansi</span> property
    			is set to <code>false</code>.  Setting <span
    			class="prop">withJansi</span> to <code>true</code> activates the
    			<a href="http://jansi.fusesource.org/">Jansi</a> library which
    			provides support for ANSI color codes on Windows machines.  On a
    			Windows host, if this property is set to true, then you should
    			put "org.fusesource.jansi:jansi:1.9" on the class
    			path. Note that Unix-based operating systems such as Linux and
    			Mac OS X support ANSI color codes by default.
    
          <p>Under the Eclipse IDE, you might want to try the <a
          href="http://www.mihai-nita.net/eclipse/">ANSI in Eclipse
          Console</a> plugin.
          </p>
    			</td>
    		</tr>
    
    	</table>
    	
    	<p>Here is a sample configuration that uses
    	<code>ConsoleAppender</code>.
    	</p>
    
    
    
      <p class="example">Example: ConsoleAppender configuration
      (logback-examples/src/main/java/chapters/appenders/conf/logback-Console.xml)</p>
    
      <span class="asGroovy" onclick="return asGroovy('logback_Console');">View as .groovy</span>
    
      <pre id="logback_Console" class="prettyprint source">&lt;configuration>
    
      <b>&lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        &lt;!-- encoders are assigned the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
        &lt;encoder>
          &lt;pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender></b>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="STDOUT" />
      &lt;/root>
    &lt;/configuration></pre>
    
       <p>After you have set your current path to the
       <em>logback-examples</em> directory and <a href="../setup.html">set
       up your class path</a>, you can give the above configuration file a
       whirl by issuing the following command:
    	 </p>
    
       <p class="source">java <a
       href="../xref/chapters/appenders/ConfigurationTester.html">chapters.appenders.ConfigurationTester</a> src/main/java/chapters/appenders/conf/logback-Console.xml</p>
    	
    	
       <h2 class="doAnchor" name="FileAppender">FileAppender</h2>
    	
       <p>The <a
       href="../xref/ch/qos/logback/core/FileAppender.html"><code>FileAppender</code></a>,
       a subclass of <code>OutputStreamAppender</code>, appends log events into
       a file. The target file is specified by the <span
       class="prop">File</span> option.  If the file already exists, it
       is either appended to, or truncated depending on the value of the
       <span class="prop">append</span> property.   
       </p>
    	
       <table class="bodyTable properties striped">
         <tr>
           <th>Property Name</th>
           <th>Type</th>
           <th>Description</th>
         </tr>
         <tr>
           <td><span class="prop" container="fileApppender">append</span></td>
           <td><code>boolean</code></td>
           <td>If true, events are appended at the end of an existing
           file.  Otherwise, if <span class="prop">append</span> is false,
           any existing file is truncated. The <span
           class="option">append</span> option is set to true by default.
           </td>
         </tr>
         <tr >
           <td><span class="prop" container="fileApppender">encoder</span></td>
           <td>
             <a href="../xref/ch/qos/logback/core/encoder/Encoder.html"><code>Encoder</code></a>
           </td>
           <td>See <code>OutputStreamAppender</code> properties.</td>
         </tr>
        
       
         <tr>
           <td><span class="prop"
           container="fileApppender">file</span></td>
           <td><code>String</code></td>
           <td>The name of the file to write to. If the file does not
           exist, it is created. On the MS Windows platform users
           frequently forget to escape back slashes.  For example, the
           value <em>c:\temp\test.log</em> is not likely to be interpreted
           properly as <em>'\t'</em> is an escape sequence interpreted as
           a single tab character <em>(\u0009)</em>.  Correct values can
           be specified as <em>c:/temp/test.log</em> or alternatively as
           <em>c:\\temp\\test.log</em>.  The <span
           class="prop">File</span> option has no default value.
    
           <p>If the parent directory of the file does not exist,
           <code>FileAppender</code> will automatically create it,
           including any necessary but nonexistent parent directories.
           </p>
           </td>
         </tr>
       
    
         <tr>
           <td><span class="prop" name="prudent">prudent</span></td>
           <td><code>boolean</code></td>
    
           <td>In prudent mode, <code>FileAppender</code> will safely
             write to the specified file, even in the presence of other
             <code>FileAppender</code> instances running in different
             JVMs, potentially running on different hosts. The default
             value for prudent mode is <code>false</code>.
    
             <p>Prudent mode can be used in conjunction with
             <code>RollingFileAppender</code> although some <a
             href="#prudentWithRolling">restrictions apply</a>.</p>
    
             <p>Prudent mode implies that <span
             class="prop">append</span> property is automatically set to
             true.
             </p>
    
             <p>Produdent more relies on exclusive file locks. Experiments
             show that file locks approximately triple (x3) the cost of
             writing a logging event. On an "average" PC writing to a file
             located on a <b>local</b> hard disk, when prudent mode is
             off, it takes about 10 microseconds to write a single logging
             event. When prudent mode is on, it takes approximately 30
             microseconds to output a single logging event. This
             translates to logging throughput of 100'000 events per second
             when prudent mode is off and approximately 33'000 events per
             second in prudent mode.
             </p>
    
             <p>Prudent mode effectively serializes I/O operations between
             all JVMs writing to the same file. Thus, as the number of
             JVMs competing to access a file increases so will the delay
             incurred by each I/O operation. As long as the <em>total</em>
             number of I/O operations is in the order of 20 log requests
             per second, the impact on performance should be
             negligible. Applications generating 100 or more I/O
             operations per second can see an impact on performance and
             should avoid using <span class="prop">prudent</span> mode.
             </p>
    
             <p><span class="label">Networked file locks</span> When the
             log file is located on a networked file system, the cost of
             prudent mode is even greater. Just as importantly, file locks
             over a networked file system can be sometimes strongly biased
             such that the process currently owning the lock immediately
             re-obtains the lock upon its release. Thus, while one process
             hogs the lock for the log file, other processes starve
             waiting for the lock to the point of appearing deadlocked.
             </p>
             
             <p>The impact of prudent mode is highly dependent on network
             speed as well as the OS implementation details. We provide an
             very small application called <a
             href="https://gist.github.com/2794241">FileLockSimulator</a>
             which can help you simulate the behavior of prudent mode in
             your environment.
             </p>
    
    
           </td>
           
         </tr>
       </table>
    	
       <p><span class="label notice">Immediate Flush</span> By default,
       each log event is immediately flushed to the underlying output
       stream. This default approach is safer in the sense that logging
       events are not lost in case your applicaiton exits without properly
       closing appenders. However, for significantly increased logging
       throughput, you may want to set the <span
       class="prop">immediateFlush</span> property of the underlying
       <code>Encoder</code> to <code>false</code> . Encoders and in
       particular <a
       href="encoders.html#LayoutWrappingEncoder"><code>LayoutWrappingEncoder</code></a>
       are described in a separate chapter.</p>
    
       <p>Below is an example of a configuration file for
       <code>FileAppender</code>:
    	 </p>
    
       <p class="example">Example: FileAppender configuration
       (logback-examples/src/main/java/chapters/appenders/conf/logback-fileAppender.xml)</p>
    
       <span class="asGroovy" onclick="return asGroovy('logback-fileAppender');">View as .groovy</span>
       <pre id="logback-fileAppender"  class="prettyprint source">&lt;configuration>
    
      <b>&lt;appender name="FILE" class="ch.qos.logback.core.FileAppender">
        &lt;file>testFile.log&lt;/file>
        &lt;append>true&lt;/append>
        &lt;!-- encoders are assigned the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
        &lt;encoder>
          &lt;pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender></b>
    	
      &lt;root level="DEBUG">
        &lt;appender-ref ref="FILE" />
      &lt;/root>
    &lt;/configuration></pre>
    
       <p>After changing the current directory to
       <em>logback-examples</em>, run this example by launching the
       following command:
       </p>
    	
       <p class="source">java chapters.appenders.ConfigurationTester
       src/main/java/chapters/appenders/conf/logback-fileAppender.xml</p>
    	
    	
       <h3 class="doAnchor" name="uniquelyNamed">Uniquely named files (by
       timestamp)</h3>
       
       <p>During the application development phase or in the case of
       short-lived applications, e.g. batch applications, it is desirable
       to create a new log file at each new application launch. This is
       fairly easy to do with the help of the <code>&lt;timestamp></code>
       element. Here's an example.</p>
    
    
       <p class="example">Example: Uniquely named FileAppender
       configuration by timestamp
       (logback-examples/src/main/java/chapters/appenders/conf/logback-timestamp.xml)</p>
    
       <span class="asGroovy" onclick="return asGroovy('logback-timestamp');">View as .groovy</span>
       <pre id="logback-timestamp" class="prettyprint source">&lt;configuration>
    
      &lt;!-- Insert the current time formatted as "yyyyMMdd'T'HHmmss" under
           the key "bySecond" into the logger context. This value will be
           available to all subsequent configuration elements. -->
      <b>&lt;timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"/></b>
    
      &lt;appender name="FILE" class="ch.qos.logback.core.FileAppender">
        &lt;!-- use the previously created timestamp to create a uniquely
             named log file -->
        &lt;file><b>log-${bySecond}.txt</b>&lt;/file>
        &lt;encoder>
          &lt;pattern>%logger{35} - %msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="FILE" />
      &lt;/root>
    &lt;/configuration></pre>
    
    
       <p>The timestamp element takes two mandatory attributes <span
       class="attr">key</span> and <span class="attr">datePattern</span>
       and an optional <span class="attr">timeReference</span>
       attribute. The <span class="attr">key</span> attribute is the name
       of the key under which the timestamp will be available to
       subsequent configuration elements <a
       href="configuration.html#variableSubstitution">as a
       variable</a>. The <span class="attr">datePattern</span> attribute
       denotes the date pattern used to convert the current time (at which
       the configuration file is parsed) into a string. The date pattern
       should follow the conventions defined in <a
       href="http://java.sun.com/j2se/1.4.2/docs/api/java/text/SimpleDateFormat.html">SimpleDateFormat</a>. The
       <span class="attr">timeReference</span> attribute denotes the time
       reference for the time stamp. The default is the
       interpretation/parsing time of the configuration file, i.e. the
       current time. However, under certain circumstances it might be
       useful to use the context birth time as time reference. This can be
       accomplished by setting the <span class="attr">timeReference</span>
       attribute to <code>"contextBirth"</code>.
       </p>
    
       <p>Experiment with the <code>&lt;timestamp></code> element by
       running the command:</p>
    
       <p class="command">java chapters.appenders.ConfigurationTester src/main/java/chapters/appenders/conf/logback-timestamp.xml</p>
    
       <p>To use the logger context birth date as time reference, you
       would set the <span class="attr">timeReference</span> attribute to
       "contextBirth" as shown below.</p>
    
    
       <p class="example">Example: Timestamp using context birth date as time reference
       (logback-examples/src/main/java/chapters/appenders/conf/logback-timestamp-contextBirth.xml)</p>
    
       <span class="asGroovy" onclick="return asGroovy('logback-timestamp-contextBirth');">View as .groovy</span>   
       <pre id="logback-timestamp-contextBirth" class="prettyprint source">&lt;configuration>
      &lt;timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss" 
                 <b>timeReference="contextBirth"</b>/>
      ...
    &lt;/configuration></pre>
    
       <h2 class="doAnchor" name="RollingFileAppender">RollingFileAppender
       </h2>
       
       <p><a
    	 href="../xref/ch/qos/logback/core/rolling/RollingFileAppender.html"><code>RollingFileAppender</code></a>
    	 extends <code>FileAppender</code> with the capability to rollover log
    	 files.  For example, <code>RollingFileAppender</code> can log to a
    	 file named <em>log.txt</em> file and, once a certain condition is
    	 met, change its logging target to another file.
       </p>
         
       <p>There are two important sub-components that interact with
       <code>RollingFileAppender</code>. The first
       <code>RollingFileAppender</code> sub-component, namely
       <code>RollingPolicy</code>, (<a href="#onRollingPolicies">see
       below</a>) is responsible for undertaking the actions required for
       a rollover. A second sub-component of
       <code>RollingFileAppender</code>, namely
       <code>TriggeringPolicy</code>, (<a href="#TriggeringPolicy">see
       below</a>) will determine if and exactly when rollover
       occurs. Thus, <code>RollingPolicy</code> is responsible for the
       <em>what</em> and <code>TriggeringPolicy</code> is responsible for
       the <em>when</em>. </p>
    	
       <p>To be of any use, a <code>RollingFileAppender</code> must have
       both a <code>RollingPolicy</code> and a
       <code>TriggeringPolicy</code> set up. However, if its
       <code>RollingPolicy</code> also implements the
       <code>TriggeringPolicy</code> interface, then only the former needs
       to be specified explicitly.
       </p>
    	
       <p>Here are the available properties for <code>RollingFileAppender</code>:</p>
    	
       <table class="bodyTable striped">
         <tr>
           <th>Property Name</th>
           <th>Type</th>
           <th>Description</th>
         </tr>
         <tr>
           <td><span class="prop" container="rfa">file</span></td>
           <td><code>String</code></td>
           <td>See <code>FileAppender</code> properties.</td>
         </tr>	
         <tr>
           <td><span class="prop" container="rfa">append</span></td>
           <td><code>boolean</code></td>
           <td>See <code>FileAppender</code> properties.</td>
         </tr>	
         <tr>
           <td><span class="prop" container="rfa">encoder</span></td>
           <td>
             <a href="../xref/ch/qos/logback/core/encoder/Encoder.html"><code>Encoder</code></a>
           </td>
           <td>See <code>OutputStreamAppender</code> properties.</td>
         </tr>
         <tr>
           <td><span class="prop" container="rfa">rollingPolicy</span></td>
           <td><code>RollingPolicy</code></td>
           <td>This option is the component that will dictate
           <code>RollingFileAppender</code>'s behavior when rollover
           occurs. See more information below.
           </td>
         </tr>	
         <tr>
           <td><span class="prop" container="rfa">triggeringPolicy</span></td>
           <td><code>TriggeringPolicy</code></td>
           <td>
             This option is the component that will tell 
             <code>RollingFileAppender</code> when to activate the rollover
             procedure. See more information below.
           </td>
         </tr>	
         <tr>
           <td valign="top"><span class="prop" name="prudentWithRolling">prudent</span></td>
    
           <td valign="top"><code>boolean</code></td>
    
           <td  valign="top">
             <a
             href="#FixedWindowRollingPolicy"><code>FixedWindowRollingPolicy</code></a>
             is not supported in prudent mode.
    
             <p> <code>RollingFileAppender</code> supports the prudent
             mode in conjunction with <a
             href="#TimeBasedRollingPolicy"><code>TimeBasedRollingPolicy</code></a>
             albeit with two restrictions.
             </p>
    
             <ol>
               <li>In prudent mode, file compression is not supported nor
               allowed. (We can't have one JVM writing to a file while
               another JVM is compressing it.)  </li>
               
               <li>The <span class="prop">file</span> property of
               <code>FileAppender</code> cannot be set and must be left
               blank. Indeed, most operating systems do not allow renaming
               of a file while another process has it opened.
               </li>
               
             </ol>
    
             See also properties for <code>FileAppender</code>.
           </td>
         </tr>
       </table>
    	
       <h3 class="doAnchor" name="onRollingPolicies">Overview of rolling
       policies</h3>
    	
       <p><a
       href="../xref/ch/qos/logback/core/rolling/RollingPolicy.html"><code>RollingPolicy</code></a>
       is responsible for the rollover procedure which involves file
       moving and renaming.</p>
    	
       <p>The <code>RollingPolicy</code> interface is presented below:</p>
       
       <pre class="prettyprint source">package ch.qos.logback.core.rolling;  
    
    import ch.qos.logback.core.FileAppender;
    import ch.qos.logback.core.spi.LifeCycle;
    
    public interface RollingPolicy extends LifeCycle {
    
      <b>public void rollover() throws RolloverFailure;</b>
      public String getActiveFileName();
      public CompressionMode getCompressionMode();
      public void setParent(FileAppender appender);
    }</pre>
    
       <p>The <code>rollover</code> method accomplishes the work involved
       in archiving the current log file.  The
       <code>getActiveFileName()</code> method is called to compute the
       file name of the current log file (where live logs are written
       to). As indicated by <code>getCompressionMode</code> method a
       RollingPolicy is also responsible for determining the compression
       mode. Lastly, a <code>RollingPolicy</code> is given a reference to
       its parent via the <code>setParent</code> method.
       </p>
    
       <!-- =================
            ================= -->
    
    	
       <h4 class="doAnchor"
       name="TimeBasedRollingPolicy">TimeBasedRollingPolicy
       </h4>
    
       <p><a
       href="../xref/ch/qos/logback/core/rolling/TimeBasedRollingPolicy.html">
       <code>TimeBasedRollingPolicy</code></a> is possibly the most
       popular rolling policy. It defines a rollover policy based on time,
       for example by day or by month.
       <code>TimeBasedRollingPolicy</code> assumes the responsibility for
       rollover as well as for the triggering of said rollover. Indeed,
       <code>TimeBasedTriggeringPolicy</code> implements <em>both</em>
       <code>RollingPolicy</code> and <code>TriggeringPolicy</code>
       interfaces.
       </p>
    
       <p><code>TimeBasedRollingPolicy</code>'s configuration takes one
       mandatory <span class="prop">fileNamePattern</span> property and
       several optional properties.
       </p>
    
       <table class="bodyTable striped">
         <tr>
           <th>Property Name</th>
           <th>Type</th>
           <th>Description</th>
         </tr>
         <tr>
           <td><span class="prop" container="tbrp">fileNamePattern</span></td>
           <td><code>String</code></td>
           <td>
             The mandatory <span class="prop">fileNamePattern</span>
             property defines the name of the rolled-over (archived) log
             files. Its value should consist of the name of the file, plus
             a suitably placed <em>%d</em> conversion specifier.  The
             <em>%d</em> conversion specifier may contain a date-and-time
             pattern as specified by the
             <code>java.text.SimpleDateFormat</code> class.  If the
             date-and-time pattern is omitted, then the default pattern
             <em>yyyy-MM-dd</em> is assumed. <b>The rollover period is
             inferred from the value of <span
             class="prop">fileNamePattern</span>.</b>
    
    
             <p>Note that the <span class="prop">file</span> property in
             <code>RollingFileAppender</code> (the parent of
             <code>TimeBasedRollingPolicy</code>) can be either set or
             omitted. By setting the <span class="prop">file</span>
             property of the containing <code>FileAppender</code>, you can
             decouple the location of the active log file and the location
             of the archived log files. The current logs will be always
             targeted at the file specified by the <span
             class="prop">file</span> property. It follows that the name
             of the currently active log file will not change over
             time. However, if you choose to omit the <span
             class="prop">file</span> property, then the active file
             will be computed anew for each period based on the value of
             <span class="prop">fileNamePattern</span>.  The examples
             below should clarify this point.
             </p>
    
             <p>The date-and-time pattern, as found within the accolades
             of %d{} follow java.text.SimpleDateFormat conventions. The
             forward slash '/' or backward slash '\' characters anywhere
             within the <span class="option">fileNamePattern</span>
             property or within the date-and-time pattern will be
             interpreted as directory separators.
             </p>
    
             <p>It is possible to specify multiple %d tokens but only one
             of which can be primary, i.e. used to infer the rollover
             period. All other tokens <em>must</em> be marked as auxiliary
             by passing the 'aux' parameter (see examples below).</p>
           </td>
         </tr>
         <tr>
           <td><span class="prop" container="tbrp">maxHistory</span></td>
           <td>int</td>
           <td>The optional <span class="prop">maxHistory</span>
           property controls the maximum number of archive files to keep,
           deleting older files. For example, if you specify monthly
           rollover, and set maxHistory to 6, then 6 months worth of
           archives files will be kept with files older than 6 months
           deleted. Note as old archived log files are removed, any
           folders which were created for the purpose of log file
           archiving will be removed as appropriate.
           </td>
         </tr>
    
         <tr >
           <td><span class="prop" container="tbrp">cleanHistoryOnStart</span></td>
           <td>boolean</td>
           <td>
             <p>If set to true, archive removal will be executed on
             appender start up. By default this property is set to
             false. </p>
    
             <p>Archive removal is normally performed during roll
             over. However, some applications may not live long enough for
             roll over to be triggered. It follows that for such
             short-lived applications archive removal may never get a
             chance to execute.  By setting <span
             class="prop">cleanHistoryOnStart</span> to true, archive
             removal is performed at appender start up.</p>
           </td>
         </tr>
       </table>
    
    
       <p>Here are a few <code>fileNamePattern</code> values with an
       explanation of their effects.</p>
    
      
       
       <table class="bodyTable striped">
         <tr>
           <th>
             <span class="prop">fileNamePattern</span>
           </th>
           <th>Rollover schedule</th>
           <th>Example</th>
         </tr>
         <tr>
           <td class="small">
             <em>/wombat/foo.%d</em>
           </td>
           <td>Daily rollover (at midnight). Due to the omission of the
           optional time and date pattern for the <em>%d</em> token
           specifier, the default pattern of <em>yyyy-MM-dd</em> is
           assumed, which corresponds to daily rollover.
           </td>
    
           <td>
             <p><span class="prop">file</span> property not set: During November
             23rd, 2006, logging output will go to the file
             <em>/wombat/foo.2006-11-23</em>.  At midnight and for the
             rest of the 24th, logging output will be directed to
             <em>/wombat/foo.2006-11-24</em>.
           </p>
    
             <p><span class="prop">file</span> property set to
             <em>/wombat/foo.txt</em>: During November 23rd, 2006, logging
             output will go to the file <em>/wombat/foo.txt</em>. At
             midnight, <em>foo.txt</em> will be renamed as
             <em>/wombat/foo.2006-11-23</em>. A new
             <em>/wombat/foo.txt</em> file will be created and for the
             rest of November 24th logging output will be directed to
             <em>foo.txt</em>.
           </p>
    
           </td>
         </tr>
         
    
         <tr>
           <td class="small">
             <em>/wombat/%d{yyyy/MM}/foo.txt</em>
           </td>
           <td>Rollover at the beginning of each month.</td>
           <td>
             <p><span class="prop">file</span> property not set: During
             the month of October 2006, logging output will go to
             <em>/wombat/2006/10/foo.txt</em>.  After midnight of October
             31st and for the rest of November, logging output will be
             directed to <em>/wombat/2006/11/foo.txt</em>.
             </p>
    
             <p><span class="prop">file</span> property set to
             <em>/wombat/foo.txt</em>: The active log file will always be
             <em>/wombat/foo.txt</em>. During the month of October 2006,
             logging output will go to <em>/wombat/foo.txt</em>. At
             midnight of October 31st, <em>/wombat/foo.txt</em> will be
             renamed as <em>/wombat/2006/10/foo.txt</em>. A new
             <em>/wombat/foo.txt</em> file will be created where logging
             output will go for the rest of November. At midnight of
             November 30th, <em>/wombat/foo.txt</em> will be renamed as
             <em>/wombat/2006/11/foo.txt</em> and so on.
             </p>
           </td>
         </tr>
         <tr>
           <td class="small">
             <em>/wombat/foo.%d{yyyy-ww}.log</em>
           </td>
           
           <td>Rollover at the first day of each week. Note that the first
           day of the week depends on the locale.</td>
           
           <td>Similar to previous cases, except that rollover will occur
           at the beginning of every new week.  
           </td>     
         </tr>	
         <tr>
           <td class="small">
             <em>/wombat/foo%d{yyyy-MM-dd_HH}.log</em>
           </td>
           <td>Rollover at the top of each hour.</td>
           <td>Similar to previous cases, except that rollover will occur
           at the top of every hour.
           </td>
         </tr>
         <tr>
           <td class="small">
             <em>/wombat/foo%d{yyyy-MM-dd_HH-mm}.log</em>
           </td>
           <td>Rollover at the beginning of every minute.</td>
           <td>Similar to previous cases, except that rollover will occur
           at the beginning of every minute.  
           </td>     
         </tr>
    
    
         <tr>
           <td class="small">
             <em>/foo/%d{yyyy-MM,<b>aux</b>}/%d.log</em>
           </td>
           <td>Rollover daily. Archives located under a folder contaning
           year and month.
           </td>
           <td>In this example, the first %d token is marked as
           <b>aux</b>iliary. The second %d token, with time and date
           pattern omitted, is then assumed to be primary. Thus, rollover
           will occur daily (default for %d) and the folder name will
           depend on the year and month. For example, during the month of
           November 2006, archived files will all placed under the
           /foo/2006-11/ folder, e.g <em>/foo/2006-11/2006-11-14.log</em>.
           </td>     
           
         </tr>
       </table>
       
       <p>Any forward or backward slash characters are interpreted as
       folder (directory) separators. Any required folder will be created
       as necessary. You can thus easily place your log files in separate
       folders.
       </p>
    
    
     	 <p>Just like <code>FixedWindowRollingPolicy</code>,
     	 <code>TimeBasedRollingPolicy</code> supports automatic file
     	 compression.  This feature is enabled if the value of the <span
     	 class="prop">fileNamePattern</span> option ends with <em>.gz</em>
     	 or <em>.zip</em>.
       </p>
    
       <table class="bodyTable striped">
         <tr class="a">
           <th><span class="prop">fileNamePattern</span></th>
           <th>Rollover schedule</th>
           <th>Example</th>
         </tr>
         <tr>
           <td><em>/wombat/foo.%d.gz</em></td>
           <td>Daily rollover (at midnight) with automatic GZIP compression of the 
           archived files.</td>
           <td>
             <p><span class="prop">file</span> property not set: During
             November 23rd, 2009, logging output will go to the file
             <em>/wombat/foo.2009-11-23</em>. However, at midnight that
             file will be compressed to become
             <em>/wombat/foo.2009-11-23.gz</em>.  For the 24th of November,
             logging output will be directed to
             <em>/wombat/folder/foo.2009-11-24</em> until it's rolled over
             at the beginning of the next day.
             </p>
             
             <p><span class="prop">file</span> property set to
             /wombat/foo.txt: During November 23rd, 2009, logging output
             will go to the file <em>/wombat/foo.txt</em>. At midnight that
             file will be compressed and renamed as
             <em>/wombat/foo.2009-11-23.gz</em>.  A new
             <em>/wombat/foo.txt</em> file will be created where logging
             output will go for the rest of November 24rd. At midnight
             November 24th, <em>/wombat/foo.txt</em> will be compressed and
             renamed as <em>/wombat/foo.2009-11-24.gz</em> and so on.
             </p>
           </td>
         </tr>
       </table>
       
       <p>The <span class="prop">fileNamePattern</span> serves a dual
       purpose. First, by studying the pattern, logback computes the
       requested rollover periodicity. Second, it computes each archived
       file's name. Note that it is possible for two different patterns to
       specify the same periodicity. The patterns <em>yyyy-MM</em> and
       <em>yyyy@MM</em> both specify monthly rollover, although the
       resulting archive files will carry different names.
       </p>
    
    	 <p>By setting the <span class="prop">file</span> property you can
    	 decouple the location of the active log file and the location of
    	 the archived log files. The logging output will be targeted into
    	 the file specified by the <span class="prop">file</span>
    	 property. It follows that the name of the active log file will not
    	 change over time. However, if you choose to omit the <span
    	 class="prop">file</span> property, then the active file will be
    	 computed anew for each period based on the value of <span
    	 class="prop">fileNamePattern</span>. By leaving the <span
    	 class="prop">file</span> option unset you can avoid file <a
    	 href="../codes.html#renamingError">renaming errors</a> which occur
    	 while there exist external file handles referencing log files during
    	 roll over.
       </p>
    	
       <p>The <span class="prop">maxHistory</span> property controls the
       maximum number of archive files to keep, deleting older files. For
       example, if you specify monthly rollover, and set <span
       class="prop">maxHistory</span> to 6, then 6 months worth of
       archives files will be kept with files older than 6 months
       deleted. Note as old archived log files are removed, any folders
       which were created for the purpose of log file archiving will be
       removed as appropriate.
       </p>
    
       <p>For various technical reasons, rollovers are not clock-driven
       but depend on the arrival of logging events. For example, on 8th of
       March 2002, assuming the <span
       class="prop">fileNamePattern</span> is set to <em>yyyy-MM-dd</em>
       (daily rollover), the arrival of the first event after midnight
       will trigger a rollover. If there are no logging events during, say
       23 minutes and 47 seconds after midnight, then rollover will
       actually occur at 00:23'47 AM on March 9th and not at 0:00 AM.
       Thus, depending on the arrival rate of events, rollovers might be
       triggered with some latency.  However, regardless of the delay, the
       rollover algorithm is known to be correct, in the sense that all
       logging events generated during a certain period will be output in
       the correct file delimiting that period.
       </p>
    	
       <p>Here is a sample configuration for
       <code>RollingFileAppender</code> in conjunction with a
       <code>TimeBasedRollingPolicy</code>.
       </p>
    	
       <p class="example">Example: Sample configuration of a
       <code>RollingFileAppender</code> using a
       <code>TimeBasedRollingPolicy</code>
       (logback-examples/src/main/java/chapters/appenders/conf/logback-RollingTimeBased.xml)</p>
    
       <span class="asGroovy" onclick="return asGroovy('logback-RollingTimeBased');">View as .groovy</span>
       <pre id="logback-RollingTimeBased" class="prettyprint source">&lt;configuration>
      &lt;appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        &lt;file>logFile.log&lt;/file>
        <b>&lt;rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
          &lt;!-- daily rollover -->
          &lt;fileNamePattern>logFile.%d{yyyy-MM-dd}.log&lt;/fileNamePattern>
    
          &lt;!-- keep 30 days' worth of history -->
          &lt;maxHistory>30&lt;/maxHistory>
        &lt;/rollingPolicy></b>
    
        &lt;encoder>
          &lt;pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender> 
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="FILE" />
      &lt;/root>
    &lt;/configuration></pre>
    
        <p>The next configuration sample illustrates the use of
        <code>RollingFileAppender</code> associated with
        <code>TimeBasedRollingPolicy</code> in <span class="prop">prudent</span>
        mode.
        </p>
    
       <p class="example">Example: Sample configuration of a
       <code>RollingFileAppender</code> using a
       <code>TimeBasedRollingPolicy</code>
       (logback-examples/src/main/java/chapters/appenders/conf/logback-PrudentTimeBasedRolling.xml)</p>
    
      <span class="asGroovy" onclick="return asGroovy('logback-PrudentTimeBasedRolling');">View as .groovy</span>
      <pre id="logback-PrudentTimeBasedRolling" class="prettyprint source">&lt;configuration>
      &lt;appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <b>&lt;!-- Support multiple-JVM writing to the same log file --></b>
        <b>&lt;prudent>true&lt;/prudent></b>
        &lt;rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
          &lt;fileNamePattern>logFile.%d{yyyy-MM-dd}.log&lt;/fileNamePattern>
          &lt;maxHistory>30&lt;/maxHistory> 
        &lt;/rollingPolicy>
    
        &lt;encoder>
          &lt;pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender> 
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="FILE" />
      &lt;/root>
    &lt;/configuration></pre>
    
    
       <h4 class="doAnchor"
       name="FixedWindowRollingPolicy">FixedWindowRollingPolicy
       </h4>
    
       <p>When rolling over, <a
       href="../xref/ch/qos/logback/core/rolling/FixedWindowRollingPolicy.html">
       <code>FixedWindowRollingPolicy</code></a> renames files according
       to a fixed window algorithm as described below.
       </p>
    
       <p>The <span class="prop">fileNamePattern</span> option
       represents the file name pattern for the archived (rolled over) log
       files.  This option is required and must include an integer token
       <em>%i</em> somewhere within the pattern.
       </p>
    	
       <p>Here are the available properties for
       <code>FixedWindowRollingPolicy</code>
       </p>
    	
       <table class="bodyTable striped">
         <tr>
           <th>Property Name</th>
           <th>Type</th>
           <th>Description</th>
         </tr>
         <tr>
           <td><span class="prop" container="fwrp">minIndex</span></td>
           <td><code>int</code></td>
           <td>
             <p>This option represents the lower bound for the window's
             index.
             </p>
           </td>
         </tr>
         <tr>
           <td><span class="prop" container="fwrp">maxIndex</span></td>
           <td><code>int</code></td>
           <td>
             <p>This option represents the upper bound for the window's
             index.
             </p>
           </td>
         </tr>
         <tr>
           <td><span class="prop" container="fwrp">fileNamePattern</span></td>
           <td><code>String</code></td>
           <td>
             <p>This option represents the pattern that will be followed
             by the <code>FixedWindowRollingPolicy</code> when renaming
             the log files. It must contain the string <em>%i</em>, which
             will indicate the position where the value of the current
             window index will be inserted.
             </p>
             <p>For example, using <em>MyLogFile%i.log</em> associated
             with minimum and maximum values of <em>1</em> and <em>3</em>
             will produce archive files named <em>MyLogFile1.log</em>,
             <em>MyLogFile2.log</em> and <em>MyLogFile3.log</em>.
             </p>
             <p>Note that file compression is also specified via this
             property. For example, <span
             class="prop">fileNamePattern</span> set to
             <em>MyLogFile%i.log.zip</em> means that archived files must be
             compressed using the <em>zip</em> format; <em>gz</em> format
             is also supported.
             </p>
           </td>
         </tr>			
       </table>
       
       <p>Given that the fixed window rolling policy requires as many file
       renaming operations as the window size, large window sizes are
       strongly discouraged. When large values are specified by the user,
       the current implementation will automatically reduce the window
       size to 12.
       </p>
    
       <p>Let us go over a more concrete example of the fixed window
       rollover policy. Suppose that <span class="prop">minIndex</span>
       is set to <em>1</em>, <span class="prop">maxIndex</span> set to
       <em>3</em>, <span class="prop">fileNamePattern</span> property
       set to <em>foo%i.log</em>, and that <span
       class="prop">fileNamePattern</span> property is set to
       <em>foo.log</em>.
       </p>
    	
       <table class="bodyTable striped">
         <tr>
           <th>Number of rollovers</th>
           <th>Active output target</th>
           <th>Archived log files</th>
           <th>Description</th>
         </tr>
    		<tr>
    			<td>0</td>
    			<td>foo.log</td>
    			<td>-</td>
    			<td>No rollover has happened yet, logback logs into the initial
    			file.
    			</td>
         </tr>		
         <tr>
           <td>1</td>
           <td>foo.log</td>
           <td>foo1.log</td>
           <td>First rollover. <em>foo.log</em> is renamed as
           <em>foo1.log</em>. A new <em>foo.log</em> file is created and
           becomes the active output target.
           </td>
         </tr>
         <tr>
           <td>2</td>
           <td>foo.log</td>
           <td>foo1.log, foo2.log</td>
           <td>Second rollover. <em>foo1.log</em> is renamed as
           <em>foo2.log</em>.  <em>foo.log</em> is renamed as
           <em>foo1.log</em>. A new <em>foo.log</em> file is created and
           becomes the active output target.
           </td>
         </tr>
         <tr>
           <td>3</td>
           <td>foo.log</td>
           <td>foo1.log, foo2.log, foo3.log</td>
           <td>Third rollover.  <em>foo2.log</em> is renamed as
           <em>foo3.log</em>. <em>foo1.log</em> is renamed as
           <em>foo2.log</em>.  <em>foo.log</em> is renamed as
           <em>foo1.log</em>. A new <em>foo.log</em> file is created and
           becomes the active output target.
           </td>
         </tr>
         <tr>
           <td>4</td>
           <td>foo.log</td>
           <td>foo1.log, foo2.log, foo3.log</td>
           <td>In this and subsequent rounds, the rollover begins by
           deleting <em>foo3.log</em>. Other files are renamed by
           incrementing their index as shown in previous steps. In this and
           subsequent rollovers, there will be three archive logs and one
           active log file.
           </td>
         </tr>
       </table>
    	
       <p>The configuration file below gives an example of configuring
       <code>RollingFileAppender</code> and
       <code>FixedWindowRollingPolicy</code>. Note that the <span
       class="prop">File</span> option is mandatory even if it contains
       some of the same information as conveyed with the <span
       class="prop">fileNamePattern</span> option.
       </p>
    	
       <p class="example">Example: Sample configuration of a <code>RollingFileAppender</code> using a 
       <code>FixedWindowRollingPolicy</code> (logback-examples/src/main/java/chapters/appenders/conf/logback-RollingFixedWindow.xml)</p>
    
       <span class="asGroovy" onclick="return asGroovy('logback-RollingFixedWindow');">View as .groovy</span>
       <pre id="logback-RollingFixedWindow" class="prettyprint source">&lt;configuration>
      &lt;appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <b>&lt;file>test.log&lt;/file></b>
    
        <b>&lt;rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
          &lt;fileNamePattern>tests.%i.log.zip&lt;/fileNamePattern>
          &lt;minIndex>1&lt;/minIndex>
          &lt;maxIndex>3&lt;/maxIndex>
        &lt;/rollingPolicy></b>
    
        &lt;triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
          &lt;maxFileSize>5MB&lt;/maxFileSize>
        &lt;/triggeringPolicy>
        &lt;encoder>
          &lt;pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    	
      &lt;root level="DEBUG">
        &lt;appender-ref ref="FILE" />
      &lt;/root>
    &lt;/configuration></pre>
    
    
        <h3 class="doAnchor" name="SizeAndTimeBasedFNATP">Size <b>and</b>
        time based archiving
        </h3>
    
        <p>Sometimes you may wish to archive files essentially by date but
        at the same time limit the size of each log file, in particular if
        post-processing tools impose size limits on the log files. In
        order to address this requirement, logback ships with a
        sub-component for <code>TimeBasedRollingPolicy</code> called
        <code>SizeAndTimeBasedFNATP</code>, where FNATP stands for File
        Naming And Triggering Policy.</p>
    
        <p>Here is a sample configuration file demonstrating time and size
        based log file archiving.</p>
        
      <p class="example">Example: Sample configuration for
      <code>SizeAndTimeBasedFNATP</code> 
      (logback-examples/src/main/java/chapters/appenders/conf/logback-sizeAndTime.xml)</p>
    
      <span class="asGroovy" onclick="return asGroovy('logback-sizeAndTime');">View as .groovy</span>
      <pre id="logback-sizeAndTime" class="prettyprint source">&lt;configuration>
      &lt;appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
        &lt;file>mylog.txt&lt;/file>
        &lt;rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
          &lt;!-- rollover daily -->
          &lt;fileNamePattern><b>mylog-%d{yyyy-MM-dd}.<span class="big">%i</span>.txt</b>&lt;/fileNamePattern>
          <b>&lt;timeBasedFileNamingAndTriggeringPolicy</b>
                <b>class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"></b>
            &lt;!-- or whenever the file size reaches 100MB -->
            <b>&lt;maxFileSize>100MB&lt;/maxFileSize></b>
          <b>&lt;/timeBasedFileNamingAndTriggeringPolicy></b>
        &lt;/rollingPolicy>
        &lt;encoder>
          &lt;pattern>%msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="ROLLING" />
      &lt;/root>
    
    &lt;/configuration></pre>
        
        <p>Note the "%i" conversion token in addition to "%d". Each time
        the current log file reaches <span
        class="prop">maxFileSize</span> before the current time period
        ends, it will be archived with an increasing index, starting at
        0.</p>
    
        <p>Size and time based archiving supports deletion of old archive
        files. You need to specify the number of periods to preserve with
        the <span class="prop">maxHistory</span> property. When your
        application is stopped and restarted, logging will continue at the
        correct location, i.e. at the largest index number for the current
        period.
        </p>
    
    		<h2>
          <a name="TriggeringPolicy" href="#TriggeringPolicy">Overview of
          triggering policies</a>
        </h2>
    		
    		<p><a
    		href="../xref/ch/qos/logback/core/rolling/TriggeringPolicy.html"><code>TriggeringPolicy</code></a>
    		implementations are responsible for instructing the
    		<code>RollingFileAppender</code> when to rollover.</p>
    		
    		<p>The <code>TriggeringPolicy</code> interface contains only one
    		method.</p>
    	
        <pre class="prettyprint source">package ch.qos.logback.core.rolling;
    
    import java.io.File;
    import ch.qos.logback.core.spi.LifeCycle;
    
    public interface TriggeringPolicy&lt;E&gt; extends LifeCycle {
    
      <b>public boolean isTriggeringEvent(final File activeFile, final &lt;E&gt; event);</b>
    }</pre>
    
    		<p>The <code>isTriggeringEvent()</code> method takes as parameters
    		the active file and the logging event currently being
    		processed. The concrete implementation determines whether the
    		rollover should occur or not, based on these parameters.
    		</p>
    
        <p>The most widely-used triggering policy, namely
        <code>TimeBasedRollingPolicy</code> which also doubles as a
        rolling policy, was already <a
        href="#TimeBasedRollingPolicy">discussed earlier</a> along with
        other rolling policies. </p>
    		
    		<h4><a name="SizeBasedTriggeringPolicy"
    		href="#SizeBasedTriggeringPolicy">SizeBasedTriggeringPolicy</a></h4>
    
    		<p><a
    		href="../xref/ch/qos/logback/core/rolling/SizeBasedTriggeringPolicy.html">
    		<code>SizeBasedTriggeringPolicy</code></a> looks at the size of the
    		currently active file. If it grows larger than the specified size,
    		it will signal the owning <code>RollingFileAppender</code> to
    		trigger the rollover of the existing active file.
    		</p>
    
    		<p><code>SizeBasedTriggeringPolicy</code> accepts only one
    		parameter, namely <span class="prop">maxFileSize</span>, with a
    		default value of 10 MB.
    		</p>
    
    		<p>The <span class="prop">maxFileSize</span> option can be
    		specified in bytes, kilobytes, megabytes or gigabytes by suffixing
    		a numeric value with <em>KB</em>, <em>MB</em> and respectively
    		<em>GB</em>. For example, <em>5000000</em>, <em>5000KB</em>,
    		<em>5MB</em> and <em>2GB</em> are all valid values, with the first
    		three being equivalent.
    		</p>
    
    		<p>Here is a sample configuration with a
    		<code>RollingFileAppender</code> in conjunction with
    		<code>SizeBasedTriggeringPolicy</code> triggering rollover when
    		the log file reaches 5MB in size.
    		</p>
    
        <p class="example">Example: Sample configuration of a
        <code>RollingFileAppender</code> using a
        <code>SizeBasedTriggeringPolicy</code>
        (logback-examples/src/main/java/chapters/appenders/conf/logback-RollingSizeBased.xml)</p>
    
        <span class="asGroovy" onclick="return asGroovy('logback-RollingSizeBased');">View as .groovy</span>
        <pre id="logback-RollingSizeBased" class="prettyprint source">&lt;configuration>
      &lt;appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        &lt;file>test.log&lt;/file>
        &lt;rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
          &lt;fileNamePattern>test.%i.log.zip&lt;/fileNamePattern>
          &lt;minIndex>1&lt;/minIndex>
          &lt;maxIndex>3&lt;/maxIndex>
        &lt;/rollingPolicy>
    
        <b>&lt;triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
          &lt;maxFileSize>5MB&lt;/maxFileSize>
        &lt;/triggeringPolicy></b>
        &lt;encoder>
          &lt;pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    	
      &lt;root level="DEBUG">
        &lt;appender-ref ref="FILE" />
      &lt;/root>
    &lt;/configuration></pre>
    
    	
        <!-- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx -->
    		<a name="Classic"></a>
    		<h2>Logback Classic</h2>
    				
        
    		<p>While logging events are generic in logback-core, within
    		logback-classic they are always instances of
    		<code>ILoggingEvent</code>. Logback-classic is nothing more than a
    		specialized processing pipeline handling instances of
    		<code>ILoggingEvent</code>.
    
        </p>
    
    		<h3 class="doAnchor" name="SocketAppender">SocketAppender and
    		SSLSocketAppender
        </h3>
    		
    		<p>The appenders covered thus far are only able to log to local
    		resources.  In contrast, the <a
    		href="../xref/ch/qos/logback/classic/net/SocketAppender.html">
    		<code>SocketAppender</code></a> is designed to log to a remote
    		entity by transmitting serialized <code>ILoggingEvent</code>
    		instances over the wire.  When using <code>SocketAppender</code>
    		logging events on the wire are sent in the clear.  However, when
    		using  <a href="../xref/ch/qos/logback/classic/net/SSLSocketAppender.html">
    		<code>SSLSocketAppender</code></a>, logging events are delivered over
    		a secure channel.</p>
    
        <p>
    		The actual type of the serialized event
    		is <a
    		href="../xref/ch/qos/logback/classic/spi/LoggingEventVO.html"><code>LoggingEventVO</code></a>
    		which implements the <code>ILoggingEvent</code>
    		interface. Nevertheless, remote logging is non-intrusive as far as
    		the logging event is concerned.  On the receiving end after
    		deserialization, the event can be logged as if it were generated
    		locally. Multiple <code>SocketAppender</code> instances running on
    		different machines can direct their logging output to a central
    		log server whose format is fixed.  <code>SocketAppender</code>
    		does not take an associated layout because it sends serialized
    		events to a remote server.  <code>SocketAppender</code> operates
    		above the <em>Transmission Control Protocol (TCP)</em> layer which
    		provides a reliable, sequenced, flow-controlled end-to-end octet
    		stream.  Consequently, if the remote server is reachable, then log
    		events will eventually arrive there. Otherwise, if the remote
    		server is down or unreachable, the logging events will simply be
    		dropped. If and when the server comes back up, then event
    		transmission will be resumed transparently.  This transparent
    		reconnection is performed by a connector thread which periodically
    		attempts to connect to the server.
    		</p>
    		
    		<p>Logging events are automatically buffered by the native TCP
    		implementation.  This means that if the link to server is slow but
    		still faster than the rate of event production by the client, the
    		client will not be affected by the slow network
    		connection. However, if the network connection is slower than the
    		rate of event production, then the client can only progress at the
    		network rate. In particular, in the extreme case where the network
    		link to the server is down, the client will be eventually blocked.
    		Alternatively, if the network link is up, but the server is down,
    		the client will not be blocked, although the log events will be
    		lost due to server unavailability.
    		</p>
    		
    		<p>Even if a <code>SocketAppender</code> is no longer attached to
    		any logger, it will not be garbage collected in the presence of a
    		connector thread.  A connector thread exists only if the
    		connection to the server is down.  To avoid this garbage
    		collection problem, you should close the
    		<code>SocketAppender</code> explicitly. Long lived applications
    		which create/destroy many <code>SocketAppender</code> instances
    		should be aware of this garbage collection problem. Most other
    		applications can safely ignore it.  If the JVM hosting the
    		<code>SocketAppender</code> exits before the
    		<code>SocketAppender</code> is closed, either explicitly or
    		subsequent to garbage collection, then there might be
    		untransmitted data in the pipe which may be lost. This is a common
    		problem on Windows based systems.  To avoid lost data, it is
    		usually sufficient to <code>close()</code> the
    		<code>SocketAppender</code> either explicitly or by calling the
    		<code>LoggerContext</code>'s <code>stop()</code>
    		method before exiting the application.
    		</p>
    		
    		<p>The remote server is identified by the <span
    		class="prop">remoteHost</span> and <span
    		class="prop">port</span> properties.
    		<code>SocketAppender</code> properties are listed in the following
    		table.  <code>SSLSocketAppender</code> supports many additional
    		configuration properties, which are detailed in the section 
    		entitled <a href="usingSSL.html">Using SSL</a>.
    		</p>
    
        <table class="bodyTable striped">
          <tr>
    			<th>Property Name</th>
    			<th>Type</th>
    			<th>Description</th>
          </tr>
          <tr>
            <td><span class="prop" container="socket">includeCallerData</span></td>
            <td><code>boolean</code></td>
            <td>
              <p>
                The <span class="prop" container="socket">includeCallerData</span> option takes a boolean value. 
                If true, the caller data will be available to the remote host. 
                By default no caller data is sent to the server.
              </p>
            </td>
          </tr>
          <tr>
            <td><span class="prop" container="socket">port</span></td>
            <td><code>int</code></td>
            <td>
              <p>
                The port number of the remote server.
              </p>
            </td>
          </tr>	
          <tr>
            <td><span class="prop" container="socket">reconnectionDelay</span></td>
            <td><code>int</code></td>
            <td>
              The <span class="prop">reconnectionDelay</span> option takes a 
              positive integer representing the number of milliseconds to wait between 
              each failed connection attempt to the server. 
              The default value of this option is 30'000 which corresponds to 30 seconds. 
              Setting this option to zero turns off reconnection capability. 
              Note that in case of successful connection to the server, there will be no 
              connector thread present.
            </td>
          </tr>
          <tr>
            <td><span class="prop" container="socket">remoteHost</span></td>
            <td><code>String</code></td>
            <td>
              The host name of the server.
            </td>
          </tr>		
          <tr>
            <td><span class="prop" container="socket">ssl</span></td>
            <td><code>SSLConfiguration</code></td>
            <td>Supported only for <code>SSLSocketAppender</code>, this
                property provides the SSL configuration that will be used by
                the appender, as described in <a href="usingSSL.html">Using SSL</a>.
            </td>
          </tr>
        </table>
        
        <h4>Logging Server Options</h4>
        <p>The standard Logback Classic distribution includes two options
        for servers that can be used to receive logging events from
        <code>SocketAppender</code> or <code>SSLSocketAppender</code>.</p>
        <ul>
          <li><code>ServerSocketReceiver</code> and its SSL-enabled 
          counterpart <code>SSLServerSocketReceiver</code> are receiver
          components which can be configured in the <em>logback.xml</em> 
          configuration file of an application in order receive events
          from a remote socket appender.  See <a href="receivers.html">
          Receivers</a> for configuration details and usage examples.
          </li>
          <li><code>SimpleSocketServer</code> and its SSL-enabled counterpart
          <code>SimpleSSLSocketServer</code> both offer an 
          easy-to-use standalone Java application that is designed to
          be configured and run from your shell's command line interface.
          These applications simply wait for logging events from 
          <code>SocketAppender</code> or <code>SSLSocketAppender</code>
          clients.  Each received event is logged according to local server 
          policy.  Usage examples are given below.
          </li>
        </ul>
        
        <h4><a name="simpleSocketServer"></a>Using SimpleSocketServer</h4>
        <p>
        The <code>SimpleSocketServer</code> application takes two command-line
        arguments: <em>port</em> and <em>configFile</em>; 
        where <em>port</em> is the port to listen on and
        <em>configFile</em> is a configuration script in XML format.
        </p>
    	
        <p>
          Assuming you are in the <em>logback-examples/</em> directory, 
          start <code>SimpleSocketServer</code> with the following command:
        </p>
        
        <p class="source">java ch.qos.logback.classic.net.SimpleSocketServer 6000 \
      src/main/java/chapters/appenders/socket/server1.xml</p>
    
        <p>where 6000 is the port number to listen on and
        <em>server1.xml</em> is a configuration script that adds a
        <code>ConsoleAppender</code> and a
        <code>RollingFileAppender</code> to the root logger.  After you
        have started <code>SimpleSocketServer</code>, you can send it log
        events from multiple clients using <code>SocketAppender</code>.
        The examples associated with this manual include two such clients:
        <code>chapters.appenders.SocketClient1</code> and
        <code>chapters.appenders.SocketClient2</code> Both clients wait for the user
        to type a line of text on the console.  The text is encapsulated
        in a logging event of level debug and then sent to the remote
        server. The two clients differ in the configuration of the
        <code>SocketAppender</code>. <code>SocketClient1</code> configures
        the appender programmatically while <code>SocketClient2</code>
        requires a configuration file.
        </p>
    	
        <p>Assuming <code>SimpleSocketServer</code> is running on the
        local host, you connect to it with the following command:
        </p>
    	
        <p class="source">java chapters.appenders.socket.SocketClient1 localhost 6000</p>
    
    		<p>Each line that you type should appear on the console of the
    		<code>SimpleSocketServer</code> launched in the previous step. If
    		you stop and restart the <code>SimpleSocketServer</code> the
    		client will transparently reconnect to the new server instance,
    		although the events generated while disconnected will be simply
    		(and irrevocably) lost.
    		</p>
    
    		<p>
    			Unlike
    			<code>SocketClient1</code>, the sample application
    			<code>SocketClient2</code> does not configure logback by itself. 
    			It requires a configuration file in XML format. 
    			The configuration file <em>client1.xml</em>
    			shown below creates a <code>SocketAppender</code>
    			and attaches it to the root logger.
    		</p>
    
    		<p class="example">Example: SocketAppender configuration
    		(logback-examples/src/main/java/chapters/appenders/socket/client1.xml)</p>
        <span class="asGroovy" onclick="return asGroovy('client1');">View as .groovy</span>
    <pre id="client1" class="prettyprint source">&lt;configuration>
    	  
      &lt;appender name="SOCKET" class="ch.qos.logback.classic.net.SocketAppender">
        &lt;remoteHost>${host}&lt;/remoteHost>
        &lt;port>${port}&lt;/port>
        &lt;reconnectionDelay>10000&lt;/reconnectionDelay>
        &lt;includeCallerData>${includeCallerData}&lt;/includeCallerData>
      &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="SOCKET" />
      &lt;/root>  
    
    &lt;/configuration></pre>
    	
    		<p>
    			Note that in the above configuration scripts the values for the 
    			<span class="prop">remoteHost</span>, <span class="prop">port</span> and
    			<span class="prop">includeCallerData</span> properties
    			are not given directly but as substituted variable keys. The values for the variables 
    			can be specified as system properties: 
    		</p>
    	
        <p class="source">java -Dhost=localhost -Dport=6000 -DincludeCallerData=false \
      chapters.appenders.socket.SocketClient2 src/main/java/chapters/appenders/socket/client1.xml</p>
    
    		<p>This command should give similar results to the previous
    			<code>SocketClient1</code>
    			example.
    		</p>
    		
    		<p>Allow us to repeat for emphasis that serialization of logging
    		events is not intrusive. A deserialized event carries the same
    		information as any other logging event. It can be manipulated as
    		if it were generated locally; except that serialized logging
    		events by default do not include caller data. Here is an example
    		to illustrate the point. First, start
    		<code>SimpleSocketServer</code> with the following command:
    		</p>
    
        <p class="source"> java ch.qos.logback.classic.net.SimpleSocketServer 6000 \
      src/main/java/chapters/appenders/socket/server2.xml</p>
    
       <p>The configuration file <em>server2.xml</em> creates a
       <code>ConsoleAppender</code> whose layout outputs the caller's file
       name and line number along with other information. If you run
       <code>SocketClient2</code> with the configuration file
       <em>client1.xml</em> as previously, you will notice that the output
       on the server side will contain two question marks between
       parentheses instead of the file name and the line number of the
       caller:
    		</p>
    
        <p class="source">2006-11-06 17:37:30,968 DEBUG [Thread-0] [?:?] chapters.appenders.socket.SocketClient2 - Hi</p>
    
    		<p>The outcome can be easily changed by instructing the
    		<code>SocketAppender</code> to include caller data by setting the
    		<span class="prop">includeCallerData</span> option to
    		true. Using the following command will do the trick:
    		</p>
    
       <pre class="source">java -Dhost=localhost -Dport=6000 -DincludeCallerData=true \
      chapters.appenders.socket.SocketClient2 src/main/java/chapters/appenders/socket/client1.xml</pre>
    
    		<p>As deserialized events can be handled in the same way as
    		locally generated events, they even can be sent to a second server
    		for further treatment.  As an exercise, you may wish to setup two
    		servers where the first server tunnels the events it receives from
    		its clients to a second server.
    		</p>
    		
    		<h4><a name="simpleSSLSocketServer"></a>Using SimpleSSLSocketServer</h4>
    
        <p>The <code>SimpleSSLSocketServer</code> requires the same
        <em>port</em> and <em>configFile</em> command-line arguments used
        by <code>SimpleSocketServer</code>.  Additionally, you must provide
        the location and password for your logging server's X.509 credential
        using system properties specified on the command line.
        </p>
        
        <p>Assuming you are in the <em>logback-examples/</em> directory, 
        start <code>SimpleSSLSocketServer</code> with the following command:
        </p>
    
        <p class="source">java -Djavax.net.ssl.keyStore=src/main/java/chapters/appenders/socket/ssl/keystore.jks \
        -Djavax.net.ssl.keyStorePassword=changeit \
        ch.qos.logback.classic.net.SimpleSSLSocketServer 6000 \
        src/main/java/chapters/appenders/socket/ssl/server.xml
        </p>
    	
        <p>This example runs <code>SimpleSSLSocketServer</code> using an
        X.509 credential that is suitable for testing and experimentation, 
        only.  <strong>Before using <code>SimpleSSLSocketServer</code> in a
        production setting you should obtain an appropriate X.509 credential
        to identify your logging server</strong>.  See 
        <a href="usingSSL.html">Using SSL</a> for more details.
        </p>
        
        <p>Because the server configuration has <code>debug="true"</code>
        specified on the root element, you'll will see in the server's
        startup logging the SSL configuration that will be used.  This is
        useful in validating that local security policies are properly
        implemented.
        </p>
    
        <p>With <code>SimpleSSLSocketServer</code> running, you can connect
        to the server using an <code>SSLSocketAppender</code>.  The following
        example shows the appender configuration needed:
        </p>
          
       	<p class="example">Example: SSLSocketAppender configuration
    		(logback-examples/src/main/java/chapters/appenders/socket/ssl/client.xml)</p>
        <span class="asGroovy" onclick="return asGroovy('sslclient');">View as .groovy</span>
    <pre id="sslclient" class="prettyprint source">&lt;configuration debug="true">
    	  
      &lt;appender name="SOCKET" class="ch.qos.logback.classic.net.SSLSocketAppender">
        &lt;remoteHost>${host}&lt;/remoteHost>
        &lt;port>${port}&lt;/port>
        &lt;reconnectionDelay>10000&lt;/reconnectionDelay>
        &lt;ssl>
          &lt;trustStore>
            &lt;location>${truststore}&lt;/location>
            &lt;password>${password}&lt;/password>
          &lt;/trustStore>
        &lt;/ssl>
      &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="SOCKET" />
      &lt;/root>  
    
    &lt;/configuration></pre>
    	  
    	  <p>Note that, just as in the previous example, the values for
    	  <span class="prop">remoteHost</span>, <span class="prop">port</span>
    	  are specified using substituted variable keys.  Additionally, note
    	  the presence of the <span class="prop">ssl</span> property and its
    	  nested <span class="prop">trustStore</span> property, which specifies
    	  the location and password of a trust store using substituted
    	  variables.  This configuration is necessary because our example
    	  server is using a self-signed certificate.  See 
    	  <a href="usingSSL.html">Using SSL</a> for more information on 
    	  SSL configuration properties for <code>SSLSocketAppender</code>.
    	  </p>
    
        <p>We can run a client application using this configuration by
        specifying the substitution variable values on the command line as
        system properties:
        </p>
        	  	
        <p class="source">java -Dhost=localhost -Dport=6000 \
        -Dtruststore=file:src/main/java/chapters/appenders/socket/ssl/truststore.jks \
        -Dpassword=changeit \
        chapters.appenders.socket.SocketClient2 src/main/java/chapters/appenders/socket/ssl/client.xml
     	  </p>
     	  
     	  <p>As in the previous examples, you can type in a message when 
     	  prompted by the client application, and the message will be delivered
     	  to the logging server (now over a secure channel) where it will be
     	  displayed on the console.
     	  </p>
     	  
     	  <p>Note that the <em>truststore</em> property given on the command
     	  line specifies a file URL that identifies the location of the
     	  trust store.  You may also use a classpath URL as described in <a
     	  href="usingSSL.html">Using SSL</a>.
     	  </p>
     
        <p>As we saw previously at server startup, because the client
        configuration has <code>debug="true"</code> specified on the root
        element, the client's startup logging includes the details of the
        SSL configuration as aid to auditing local policy conformance.
        </p>
     	  
     	  
        <h3 class="doAnchor" name="serverSocketAppender">
          ServerSocketAppender and SSLServerSocketAppender</h3>
        
        <p>The <code>SocketAppender</code> component (and its SSL-enabled
        counterpart) discussed previously are designed to allow an
        application to connect to a remote logging server over the network
        for the purpose of delivering logging events to the server.  In
        some situations, it may be inconvenient or infeasible to have an
        application initiate a connection to a remote logging server.  For
        these situations, Logback offers <a
        href="../xref/ch/qos/logback/classic/net/server/ServerSocketAppender">
        <code>ServerSocketAppender</code></a>.
        </p>
        
        <p>Instead of initiating a connection to a remote logging server, 
        <code>ServerSocketAppender</code> passively listens on a TCP socket
        awaiting incoming connections from remote clients.  Logging events
        that are delivered to the appender are distributed to each connected
        client.  Logging events that occur when no client is connected are
        <em>summarily discarded</em>.
        </p>
        
        <p>In addition to the basic <code>ServerSocketAppender</code>, Logback
        offers <a href="../xref/ch/qos/logback/classic/net/server/SSLServerSocketAppender">
        <code>SSLServerSocketAppender</code></a>, which distributes logging events
        to each connected client using a secure, encrypted channel.  Moreover, the
        SSL-enabled appender fully supports mutual certificate-based authentication,
        which can be used to ensure that only authorized clients can connect to
        the appender to receive logging events.   
        </p>
       
        <p>The approach to encoding logging events for transmission on the wire 
        is identical to that used by <code>SocketAppender</code>; each event is 
        a serialized instance of <code>ILoggingEvent</code>.  Only the direction 
        of connection initiation is reversed.  While <code>SocketAppender</code> 
        acts as the active peer in establishing the connection to a logging server,
        <code>ServerSocketAppender</code> is passive; it listens for
        incoming connections from clients.</p>  
    
        <p>The <code>ServerSocketAppender</code> subtypes are intended to be
        used exclusively with Logback <em>receiver</em> components.  See
        <a href="receivers.html">Receivers</a> for additional information on
        this component type.</p>
        
        <p>The following configuration properties are supported by 
        <code>ServerSocketAppender</code>:</p>
        
        <table class="bodyTable striped">
          <tr>
          <th>Property Name</th>
          <th>Type</th>
          <th>Description</th>
          </tr>
          <tr>
            <td><span class="prop" container="serverSocketAppender">address</span></td>
            <td><code>String</code></td>
            <td>The local network interface address on which the appender
            will listen.  If this property is not specified, the appender
            will listen on all network interfaces.</td>
          </tr>
          <tr>
            <td><span class="prop" container="serverSocketAppender">includeCallerData</span></td>
            <td><code>boolean</code></td>
            <td>
              <p>
                If true, the caller data will be available to the remote host. 
                By default no caller data is sent to the client.
              </p>
            </td>
          </tr>
          <tr>
            <td><span class="prop" container="serverSocketAppender">port</span></td>
            <td><code>int</code></td>
            <td>
              <p>
                The port number on which the appender will listen.
              </p>
            </td>
          </tr> 
          <tr>
            <td><span class="prop" container="serverSocketAppender">ssl</span></td>
            <td><code>SSLConfiguration</code></td>
            <td>Supported only for <code>SSLServerSocketAppender</code>, this
                property provides the SSL configuration that will be used by
                the appender, as described in <a href="usingSSL.html">Using SSL</a>.
            </td>
          </tr>
        </table>
        
        <p>The following example illustrates a configuration that uses
          <code>ServerSocketAppender</code>:
        </p>
    
        <p class="example">Example: Basic ServerSocketAppender Configuration
        (logback-examples/src/main/java/chapters/appenders/socket/server4.xml)</p>
    <pre id="SocketReceiver" class="prettyprint source">&lt;configuration debug="true">
      &lt;appender name="SERVER" 
        class="ch.qos.logback.classic.net.server.ServerSocketAppender">
        &lt;port>${port}&lt;/port>
        &lt;includeCallerData>${includeCallerData}&lt;/includeCallerData>
      &lt;/appender>
    
      &lt;root level="debug">
        &lt;appender-ref ref="SERVER" />
      &lt;/root>  
    
    &lt;/configuration>
    </pre>
        <p>Note that this configuration differs from previous examples using
        <code>SocketAppender</code> only in the <em>class</em> specified for
        the appender, and in the absence of the <span class="prop">remoteHost</span>
        property &mdash; this appender waits passively for inbound connections 
        from remote hosts rather than opening a connection to a remote logging
        server.
        </p>
        
        <p>The following example illustrates a configuration using
        <code>SSLServerSocketAppender</code>.</p>
            
         <p class="example">Example: Basic SSLServerSocketAppender Configuration
        (logback-examples/src/main/java/chapters/appenders/socket/ssl/server3.xml)</p>
    <pre id="SocketReceiver" class="prettyprint source">&lt;configuration debug="true">
      &lt;appender name="SERVER" 
        class="ch.qos.logback.classic.net.server.SSLServerSocketAppender">
        &lt;port>${port}&lt;/port>
        &lt;includeCallerData>${includeCallerData}&lt;/includeCallerData>
        &lt;ssl>
          &lt;keyStore>
            &lt;location>${keystore}&lt;/location>
            &lt;password>${password}&lt;/password>
          &lt;/keyStore>
        &lt;/ssl>
      &lt;/appender>
    
      &lt;root level="debug">
        &lt;appender-ref ref="SERVER" />
      &lt;/root>  
    
    &lt;/configuration>
    </pre>
       
        <p>The principal differences between this configuration and the
        previous configuration is that the appender's <em>class</em> attribute
        identifies the <code>SSLServerSocketAppender</code> type, and the
        presence of the nested <span class="prop">ssl</span> element which
        specifies, in this example, configuration of a key store containing
        an X.509 credential for the appender.  See <a href="usingSSL.html">
        Using SSL</a> for information regarding SSL configuration properties.
        </p>
        
        <p>Because the <code>ServerSocketAppender</code> subtypes are designed
        to be used with receiver components, we will defer presenting 
        illustrative examples to the chapter entitled 
        <a href="receivers.html">Receivers</a>.</p>
        
       <h3 class="doAnchor">SMTPAppender</h3>
       
       <p>The <a
       href="../xref/ch/qos/logback/classic/net/SMTPAppender.html"><code>SMTPAppender</code></a>
       accumulates logging events in one or more fixed-size buffers and
       sends the contents of the appropriate buffer in an email after a
       user-specified event occurs.  SMTP email transmission (sending) is
       performed asynchronously. By default, the email transmission is
       triggered by a logging event of level ERROR. Moreover, by default,
       a single buffer is used for all events.
       </p>
    		
       <p>The various properties for <code>SMTPAppender</code> are
       summarized in the following table.
    	 </p>
    		
    		<table class="bodyTable striped">
          <tr>
            <th>Property Name</th>
            <th>Type</th>
            <th>Description</th>
          </tr>
    
          <tr>
            <td><span class="prop" container="smtp">smtpHost</span></td>
            <td><code>String</code></td>
            <td>The host name of the SMTP server. This parameter is mandatory.</td>
          </tr>
          
          <tr>
            <td><span class="prop" container="smtp">smtpPort</span></td>
            <td><code>int</code></td>
            <td>The port where the SMTP server is listening. Defaults to
            25.</td>
          </tr>
          
          <tr>
            <td><span class="prop" name="smtpTo">to</span></td>
            <td><code>String</code></td>
            <td>The email address of the recipient as a
            <em>pattern</em>. The pattern is evaluated anew with the
            triggering event as input for each outgoing email. Multiple
            recipients can be specified by separating the destination
            addresses with commas.  Alternatively, multiple recipients can
            also be specified by using multiple <code>&lt;to></code>
            elements. 
            </td>
          </tr>
    
          <tr>
            <td><span class="prop" container="smtp">from</span></td>
            <td><code>String</code></td>
            <td>The originator of the email messages sent by
            <code>SMTPAppender</code> in the <a
            href="http://en.wikipedia.org/wiki/Email_address">usual email
            address format</a>. If you wish to include the sender's name,
            then use the format
            "Adam&nbsp;Smith&nbsp;&amp;lt;smith@moral.org&amp;gt;" so that
            the message appears as originating from
            "Adam&nbsp;Smith&nbsp;&lt;smith@moral.org&gt;".
            </td>
          </tr>
          <tr>
            <td><span class="prop">subject</span></td>
            <td><code>String</code></td>
            <td> 
              <p>The subject of the email. It can be any value accepted as
              a valid conversion pattern by <a
              href="layouts.html#ClassicPatternLayout">PatternLayout</a>. Layouts
              will be discussed in the next chapter.
              </p>
              
              <p>The outgoing email message will have a subject line
              corresponding to applying the pattern on the logging event
              that triggered the email message.
              </p>
    
              <p>Assuming the <span class="prop">subject</span> option
              is set to "Log: %logger - %msg" and the triggering event's
              logger is named "com.foo.Bar", and contains the message
              "Hello world", then the outgoing email will have the subject
              line "Log: com.foo.Bar - Hello World".
              </p>
    
              <p>By default, this option is set to "%logger{20} - %m".</p>
            </td>
            
          </tr>
          <tr>
            <td><span class="prop" container="smtp">discriminator</span></td>
            <td><code><a href="../xref/ch/qos/logback/core/sift/Discriminator.html">Discriminator</a></code></td>
            <td>
              <p>With the help of a <span
              class="prop">Discriminator</span>,
              <code>SMTPAppender</code> can scatter incoming events into
              different buffers according to the value returned by the
              discriminator. The default discriminator always returns the
              same value so that the same buffer is used for all events.
              </p>
    
              <p>By specifying a discriminator other than the default
              one, it is possible to receive email messages
              containing a events pertaining to a particular user, user
              session or client IP address.
              </p>
            </td>
          </tr>
          <tr>
            <td><span class="prop" name="smtpAppender_Evaluator">evaluator</span></td>
            <td><code><a
            href="../xref/ch/qos/logback/classic/boolex/IEvaluator.html">IEvaluator</a></code></td>
            <td>
              <p>This option is declared by creating a new
              <code>&lt;EventEvaluator/></code> element. The name of the
              class that the user wishes to use as the
              <code>SMTPAppender</code>'s <code>Evaluator</code> needs
              to be specified via the <span class="attr">class</span>
              attribute.
              </p>
              
              
              <p>In the absence of this option, <code>SMTPAppender</code>
              is assigned an instance of <a
              href="../xref/ch/qos/logback/classic/boolex/OnErrorEvaluator.html">OnErrorEvaluator</a>
              which triggers email transmission when it encounters an
              event of level <em>ERROR</em> or higher.
              </p>
    
              <!--
              <p><code>EventEvaluator</code> objects are subclasses of the
              <code>JaninoEventEvaluatorBase</code> which depends on
              Janino. See the <a href="../dependencies.html">dependencies
              page</a> for more information.
              </p>
              -->
    
              <p>Logback ships with several other evaluators, namely <a
              href="../xref/ch/qos/logback/classic/boolex/OnMarkerEvaluator.html"><code>OnMarkerEvaluator</code></a>
              (discussed below) and a powerful evaluator called <a
              href="../xref/ch/qos/logback/classic/boolex/JaninoEventEvaluator.html"><code>JaninoEventEvaluator</code></a>,
              discussed in <a href="filters.html#evalutatorFilter">another
              chapter</a>. The more recent versions of logback ship with
              an even more powerful evaluator called <a
              href="filters.html#GEventEvaluator"><code>GEventEvaluator</code></a>.
              </p>
    
            </td>
          </tr>
    
          <tr>
            <td  valign="top"><span class="prop" container="smtp">cyclicBufferTracker</span></td>
            <td><a href="../xref/ch/qos/logback/core/spi/CyclicBufferTracker.html"><code>CyclicBufferTracker</code></a>
            </td>
            <td>
              <p>As the name indicates, an instance of the
              <code>CyclicBufferTracker</code> class tracks cyclic
              buffers. It does so based on the keys returned by the <span
              class="prop">discriminator</span> (see above).
              </p>
              <p>If you don't specify a <span
              class="prop">cyclicBufferTracker</span>, an instance of <a
              href="../xref/ch/qos/logback/core/spi/CyclicBufferTrackerImpl.html">CyclicBufferTrackerImpl</a>
              will be automatically created. By default, this instance
              will keep events in a cyclic buffer of size 256. You may
              change the size with the help of the <span
              class="prop">bufferSize</span> option (see below).</p>
            </td>        
          </tr>
          <tr>
            <td><span class="prop" container="smtp">username</span></td>
            <td><code>String</code></td> <td>The username value to use
            during plain user/password authentication. By default, this
            parameter is null.  </td> 
          </tr> 
          <tr class="alt">
            <td><span class="prop" container="smtp">password</span></td>
            <td><code>String</code></td>
            <td>The password value to use for plain user/password
            authentication. By default, this parameter is null.  
            </td>
          </tr>
          <tr> 
            <td><span class="prop" container="smtp">STARTTLS</span> </td>
            <td><code>boolean</code></td> 
            <td>If this parameter is set to true, then this appender
            will issue the STARTTLS command (if the server supports it)
            causing the connection to switch to SSL. Note that the
            connection is initially non-encrypted. By default, this
            parameter is set to false.
            </td> 
          </tr>
          <tr>
            <td><span class="prop" container="smtp">SSL</span></td>
            <td><code>boolean</code></td> <td>If this parameter is set to
            true, then this appender will open an SSL connection to the
            server. By default, this parameter is set to false.  </td>
          </tr>
    
          <tr>
            <td><span class="prop" container="smtp">charsetEncoding</span></td>
            <td><code>String</code></td>
            <td>The outgoing email message will be encoded in the
            designated <a
            href="http://java.sun.com/j2se/1.4.2/docs/api/java/nio/charset/Charset.html">charset</a>. The
            default charset encoding is "UTF-8" which works well for most
            purposes.
            </td>
          </tr>
    
    
          <tr>
            <td><span class="prop" container="smtp">localhost</span></td>
            <td><code>String</code></td>
            <td>In case the hostname of the SMTP client is not properly
            configured, e.g. if the client hostname is not fully
            qualified, certain SMTP servers may reject the HELO/EHLO
            commands sent by the client. To overcome this issue, you may
            set the value of the <span class="prop">localhost</span>
            property to the fully qualified name of the client host. See
            also the "mail.smtp.localhost" property in the documentation
            for the <a
            href="http://javamail.kenai.com/nonav/javadocs/com/sun/mail/smtp/package-summary.html">com.sun.mail.smtp</a>
            package.</td>
          </tr>
    
          <tr>
            <td><span class="prop" container="smtp">asynchronousSending</span></td>
            <td><code>boolean</code></td>
            <td>This property determines whether email transmission is
            done asynchronously or not. By default, the <span
            class="prop">asynchronousSending</span> property is
            'true'. However, under certain circumstances asynchronous
            sending may be inappropriate. For example if your application
            uses <code>SMTPAppender</code> to send alerts in response to a
            fatal error, and then exits, the relevant thread may not have
            the time to send the alert email. In this case, set <span
            class="prop">asynchronousSending</span> property to 'false'
            for synchronous email transmission.
            </td>
          </tr>
    
          <tr>
            <td><span class="prop" container="smtp">includeCallerData</span></td>
            <td><code>boolean</code></td>
            <td>By default, <span class="prop">includeCallerData</span> is
            set to <code>false</code>. You should set <span
            class="prop">includeCallerData</span> to <code>true</code> if
            <span class="prop">asynchronousSending</span> is enabled and
            you wish to include caller data in the logs. </td>
          </tr>
    
          <tr>
            <td><span class="prop" container="smtp">sessionViaJNDI</span></td>
            <td><code>boolean</code></td>
            <td><code>SMTPAppender</code> relies on
            <code>javax.mail.Session</code> to send out email messages. By
            default, <span class="prop">sessionViaJNDI</span> is set to
            <code>false</code> so the <code>javax.mail.Session</code>
            instance is built by <code>SMTPAppender</code> itself with the
            properties specified by the user. If the <span
            class="prop">sessionViaJNDI</span> property is set to
            <code>true</code>, the <code>javax.mail.Session</code> object
            will be retrieved via JNDI. See also the <span
            class="prop">jndiLocation</span> property.
    
            <p>Retrieving the <code>Session</code> via JNDI can reduce the
            number of places you need to configure/reconfigure the same
            information, making your application <a
            href="http://en.wikipedia.org/wiki/Don't_repeat_yourself">dryer</a>. For
            more information on configuring resources in Tomcat see <a
            href="http://tomcat.apache.org/tomcat-6.0-doc/jndi-resources-howto.html#JavaMail_Sessions">JNDI
            Resources How-to</a>. <span class="label">beware</span> As
            noted in that document, make sure to remove <em>mail.jar</em>
            and <em>activation.jar</em> from your web-applications
            <em>WEB-INF/lib</em> folder when retrieving the
            <code>Session</code> from JNDI.
            </p>
            </td>
          </tr>
    
          <tr>
            <td><span class="prop" container="smtp">jndiLocation</span></td>
            <td><code>String</code></td>
            <td>The location where the javax.mail.Session is placed in
            JNDI. By default, <span class="prop">jndiLocation</span> is
            set to <span style="white-space:nowrap">"java:comp/env/mail/Session"</span>.
            </td>
          </tr>
    
    		</table>		
    		
    		<p>The <code>SMTPAppender</code> keeps only the last 256 logging
    		events in its cyclic buffer, throwing away older events when its
    		buffer becomes full.  Thus, the number of logging events delivered
    		in any e-mail sent by <code>SMTPAppender</code> is upper-bounded
    		by 256. This keeps memory requirements bounded while still
    		delivering a reasonable amount of application context.
    		</p>
    		
    		<p>The <code>SMTPAppender</code> relies on the JavaMail API.  It
    		has been tested with JavaMail API version 1.4.  The JavaMail API
    		requires the JavaBeans Activation Framework package.  You can
    		download the <a
    		href="http://java.sun.com/products/javamail/">JavaMail API</a> and
    		the <a
    		href="http://java.sun.com/beans/glasgow/jaf.html">JavaBeans
    		Activation Framework</a> from their respective websites.  Make
    		sure to place these two jar files in the classpath before trying
    		the following examples.
    		</p>
    		
    		<p>A sample application, <a
    		href="../xref/chapters/appenders/mail/EMail.html"><code>chapters.appenders.mail.EMail</code></a>
    		generates a number of log messages followed by a single
    		error message. It takes two parameters. The first parameter is an
    		integer corresponding to the number of logging events to
    		generate. The second parameter is the logback configuration
    		file. The last logging event generated by <em>EMail</em>
    		application, an ERROR, will trigger the transmission of an email
    		message.
    		</p>
    
    		<p>Here is a sample configuration file intended for the
    		<code>Email</code> application:
    		</p>	
    		
        <p class="example">Example: A sample <code>SMTPAppender</code> configuration (logback-examples/src/main/java/chapters/appenders/mail/mail1.xml)</p>	
        <span class="asGroovy" onclick="return asGroovy('mail1');">View as .groovy</span>	
        <pre id="mail1" class="prettyprint source">&lt;configuration>	  
      &lt;appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
        &lt;smtpHost>ADDRESS-OF-YOUR-SMTP-HOST&lt;/smtpHost>
        &lt;to>EMAIL-DESTINATION&lt;/to>
        &lt;to>ANOTHER_EMAIL_DESTINATION&lt;/to> &lt;!-- additional destinations are possible --&gt;
        &lt;from>SENDER-EMAIL&lt;/from>
        &lt;subject>TESTING: %logger{20} - %m&lt;/subject>
        &lt;layout class="ch.qos.logback.classic.PatternLayout">
          &lt;pattern>%date %-5level %logger{35} - %message%n&lt;/pattern>
        &lt;/layout>	    
      &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="EMAIL" />
      &lt;/root>  
    &lt;/configuration></pre>
    
    		<p>Before trying out <code>chapters.appenders.mail.Email</code> application
    		with the above configuration file, you must set the <span
    		class="prop">smtpHost</span>, <span class="prop">to</span> and
    		<span class="prop">from</span> properties to values appropriate for
    		your environment. Once you have set the correct values in the
    		configuration file, execute the following command:
    		</p>
    		
    <div class="source"><pre>java chapters.appenders.mail.EMail 100 src/main/java/chapters/appenders/mail/mail1.xml</pre></div>
    
    		<p>The recipient you specified should receive an email message
    		containing 100 logging events formatted by
    		<code>PatternLayout</code> The figure below is the resulting email
    		message as shown by Mozilla Thunderbird.
    		</p>
        
        <p><img src="images/chapters/appenders/smtpAppender1.jpg" alt="resulting email"/></p>
    		
    		<p>In the next example configuration file <em>mail2.xml</em>, the
    		values for the <span class="prop">smtpHost</span>, <span
    		class="prop">to</span> and <span class="prop">from</span>
    		properties are determined by variable substitution. Here is the
    		relevant part of <em>mail2.xml</em>.
    		</p>		
    
        <pre class="prettyprint source">&lt;appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
      &lt;smtpHost>${smtpHost}&lt;/smtpHost>
      &lt;to>${to}&lt;/to>
      &lt;from>${from}&lt;/from>
      &lt;layout class="ch.qos.logback.classic.html.HTMLLayout"/>
    &lt;/appender></pre>
    		
    		<p>You can pass the required parameters on the command line:</p>
    		
    <div class="source"><pre>java -Dfrom=source@xyz.com -Dto=recipient@xyz.com -DsmtpHost=some_smtp_host \
      chapters.appenders.mail.EMail 10000 src/main/java/chapters/appenders/mail/mail2.xml
    </pre></div>
    
    		<p>Be sure to replace with values as appropriate for your
    		environment.
    		</p>
    		
    		<p>Note that in this latest example, <code>PatternLayout</code>
    		was replaced by <code>HTMLLayout</code> which formats logs as an
    		HTML table. You can change the list and order of columns as well
    		as the CSS of the table. Please refer to <a
    		href="layouts.html#ClassicHTMLLayout">HTMLLayout</a> documentation
    		for further details.
        </p>
        
        <p>Given that the size of the cyclic buffer is 256, the recipient
        should see an email message containing 256 events conveniently
        formatted in an HTML table. Note that this run of the
        <code>chapters.appenders.mail.Email</code> application generated
        10'000 events of which only the last 256 were included in the
        outgoing email.
    		</p>
    		
        <p><img src="images/chapters/appenders/smtpAppender2.jpg" alt="2nd email"/></p>
    
        <p>Email clients such as Mozilla Thunderbird, Eudora or MS
        Outlook, offer reasonably good CSS support for HTML email.
        However, they sometimes automatically downgrade HTML to
        plaintext. For example, to view HTML email in Thunderbird, the
        "View&rarr;Message&nbsp;Body&nbsp;As&rarr;Original HTML" option
        must be set. Yahoo! Mail's support for HTML email, in particular
        its CSS support is very good. Gmail on the other hand, while it
        honors the basic HTML table structure, ignores the internal CSS
        formatting. Gmail supports inline CSS formatting but since inline
        CSS would make the resulting output too voluminous,
        <code>HTMLLayout</code> does not use inline CSS.
        </p>
    
        <h3 class="doAnchor" name="cyclicBufferSize">Custom buffer
        size</h3>
    
        <p>By default, the outgoing message will contain the last 256
        messages seen by <code>SMTPAppender</code>. If your heart so
        desires, you may set a different buffer size as shown in the next example.
        </p>
    
       <p class="example">Example:  <code>SMTPAppender</code> configuration with a custom bufer size (logback-examples/src/main/java/chapters/appenders/mail/customBufferSize.xml)</p>	
        <pre class="prettyprint source">&lt;configuration>   
      &lt;appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
        &lt;smtpHost>${smtpHost}&lt;/smtpHost>
        &lt;to>${to}&lt;/to>
        &lt;from>${from}&lt;/from>
        &lt;subject>%logger{20} - %m&lt;/subject>
        &lt;layout class="ch.qos.logback.classic.html.HTMLLayout"/>
    
        <b>&lt;cyclicBufferTracker class="ch.qos.logback.core.spi.CyclicBufferTracker"></b>
          <b>&lt;!-- send just one log entry per email --></b>
          <b>&lt;bufferSize>1&lt;/bufferSize></b>
        <b>&lt;/cyclicBufferTracker></b>
      &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="EMAIL" />
      &lt;/root>  
    &lt;/configuration>    </pre>
        
    
        <h3 class="doAnchor">Triggering event</h3>
    
        <p>If the Evaluator property is not set, the
        <code>SMTPAppender</code> defaults to an <a
        href="../xref/ch/qos/logback/classic/boolex/OnErrorEvaluator.html">OnErrorEvaluator</a>
        instance which triggers email transmission when it encounters an
        event of level ERROR. While triggering an outgoing email in
        response to an error is relatively reasonable, it is possible to
        override this default behavior by providing a different
        implementation of the <code>EventEvaluator</code> interface.
        </p>
    		
    		<p>The <code>SMTPAppender</code> submits each incoming event to
    		its evaluator by calling <code>evaluate()</code> method in order
    		to check whether the event should trigger an email or just be
    		placed in the cyclic buffer.  When the evaluator gives a positive
    		answer to its evaluation, an email is sent out.  The
    		<code>SMTPAppender</code> contains one and only one evaluator
    		object.  This object may manage its own internal state. For
    		illustrative purposes, the <code>CounterBasedEvaluator</code>
    		class listed next implements an event evaluator whereby every
    		1024th event triggers an email message.
    		</p>
    
        <p class="example">Example: A <code>EventEvaluator</code> implementation
    that evaluates to <code>true</code> every 1024th event (<a href="../xref/chapters/appenders/mail/CounterBasedEvaluator.html">logback-examples/src/main/java/chapters/appenders/mail/CounterBasedEvaluator.java</a>)</p>
       
       <pre class="prettyprint source">package chapters.appenders.mail;
    
    import ch.qos.logback.core.boolex.EvaluationException;
    import ch.qos.logback.core.boolex.EventEvaluator;
    import ch.qos.logback.core.spi.ContextAwareBase;
    
    public class CounterBasedEvaluator extends ContextAwareBase implements EventEvaluator {
    
      static int LIMIT = 1024;
      int counter = 0;
      String name;
    
      <b>public boolean evaluate(Object event) throws NullPointerException,
          EvaluationException {
        counter++;
    
        if (counter == LIMIT) {
          counter = 0;
    
          return true;
        } else {
          return false;
        }
      }</b>
    
      public String getName() {
        return name;
      }
    
      public void setName(String name) {
        this.name = name;
      }
    }</pre>
    
    		<p>Note that this class extends <code>ContextAwareBase</code> and
    		implements <code>EventEvaluator</code>. This allows the user to
    		concentrate on the core functions of her
    		<code>EventEvaluator</code> and let the base class provide the
    		common functionality.
    		</p>
    
    		<p>Setting the <span class="prop">Evaluator</span> option of
    		<code>SMTPAppender</code> instructs it to use a custom evaluator.
    		The next configuration file attaches a <code>SMTPAppender</code>
    		to the root logger.  This appender uses a
    		<code>CounterBasedEvaluator</code> instance as its event
    		evaluator.
    		</p>
    
        <p class="example">Example: <code>SMTPAppender</code> with custom 
        <code>Evaluator</code> and buffer size (logback-examples/src/main/java/chapters/appenders/mail/mail3.xml)</p>
        <span class="asGroovy" onclick="return asGroovy('mail3');">View as .groovy</span>	
        <pre id="mail3" class="prettyprint source">&lt;configuration>
      &lt;appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
        <b>&lt;evaluator class="chapters.appenders.mail.CounterBasedEvaluator" /></b>
        &lt;smtpHost>${smtpHost}&lt;/smtpHost>
        &lt;to>${to}&lt;/to>
        &lt;from>${from}&lt;/from>
        &lt;subject>%logger{20} - %m&lt;/subject>
    
        &lt;layout class="ch.qos.logback.classic.html.HTMLLayout"/>
      &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="EMAIL" />
      &lt;/root>  
    &lt;/configuration></pre>
        
    
        <h3 class="doAnchor" name="OnMarkerEvaluator">Marker based
        triggering </h3>
    
        <p>Although reasonable, the default triggering policy whereby every
        event of level ERROR triggers an outgoing email may result in too
        many emails, cluttering the targeted user's mailbox. Logback ships
        with another triggering policy, called <a
        href="../xref/ch/qos/logback/classic/boolex/OnMarkerEvaluator.html">OnMarkerEvaluator</a>. It
        is based on markers. In essence, emails are triggered only if the
        event is marked with a user-specified marker. The next example
        should make the point clearer.
        </p>
    
        <p>The <a
        href="../xref/chapters/appenders/mail/Marked_EMail.html">Marked_EMail</a>
        application contains several logging statements some of which are
        of level ERROR. One noteworthy statement contains a marker. Here
        is the relevant code.
        </p>
    
        <pre class="prettyprint source">Marker notifyAdmin = MarkerFactory.getMarker("NOTIFY_ADMIN");
    logger.error(<b>notifyAdmin</b>,
      "This is a serious an error requiring the admin's attention",
       new Exception("Just testing"));</pre>
    
       <p>The next configuration file will trigger outgoing emails only in
       presence of events bearing the NOTIFY_ADMIN or the
       TRANSACTION_FAILURE markers.
       </p>
    
       <p class="example">Example: <code>SMTPAppender</code> with 
       <code>OnMarkerEvaluator</code> (logback-examples/src/main/java/chapters/appenders/mail/mailWithMarker.xml)</p>
    
       <span class="asGroovy" onclick="return asGroovy('mailWithMarker');">View as .groovy</span>	
       <pre id="mailWithMarker" class="prettyprint source">&lt;configuration>
      &lt;appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
        <b>&lt;evaluator class="ch.qos.logback.classic.boolex.OnMarkerEvaluator">
          &lt;marker>NOTIFY_ADMIN&lt;/marker>
          &lt;!-- you specify add as many markers as you want -->
          &lt;marker>TRANSACTION_FAILURE&lt;/marker>
        &lt;/evaluator></b>
        &lt;smtpHost>${smtpHost}&lt;/smtpHost>
        &lt;to>${to}&lt;/to>
        &lt;from>${from}&lt;/from>
        &lt;layout class="ch.qos.logback.classic.html.HTMLLayout"/>
      &lt;/appender>
    
      &lt;root>
        &lt;level value ="debug"/>
        &lt;appender-ref ref="EMAIL" />
      &lt;/root>  
    &lt;/configuration></pre>
        
        <p>Give it a whirl with the following command:</p>
    
        <pre class="source">java -Dfrom=source@xyz.com -Dto=recipient@xyz.com -DsmtpHost=some_smtp_host \
      chapters.appenders.mail.Marked_EMail src/main/java/chapters/appenders/mail/mailWithMarker.xml</pre>
    
    
      <h4 class="doAnchor" name="marker_JaninoEventEvaluator">Marker-based
      triggering with JaninoEventEvaluator</h4>
    
        <p>Note that instead of using the marker-centric
        <code>OnMarkerEvaluator</code>, we could use the much more generic
        <a
        href="filters.html#JaninoEventEvaluator"><code>JaninoEventEvaluator</code></a>
        or its even more powerful cousin <a
        href="filters.html#GEventEvaluator"><code>GEventEvaluator</code></a>.
        For example, the following configuration file uses
        <code>JaninoEventEvaluator</code> instead of
        <code>OnMarkerEvaluator</code> but is otherwise equivalent to the
        previous configuration file.
        </p>
    
        <p class="example">Example: <code>SMTPAppender</code> with 
       <code>JaninoEventEvaluator</code> (logback-examples/src/main/java/chapters/appenders/mail/mailWithMarker_Janino.xml)</p>
    
       <span class="asGroovy" onclick="return asGroovy('mailWithMarker_Janino');">View as .groovy</span>	
        <pre id="mailWithMarker_Janino" class="prettyprint source">&lt;configuration>
      &lt;appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
        &lt;evaluator class="ch.qos.logback.classic.boolex.JaninoEventEvaluator">
          &lt;expression>
            (marker != null) &amp;&amp;
            (marker.contains("NOTIFY_ADMIN") || marker.contains("TRANSACTION_FAILURE"))
          &lt;/expression>
        &lt;/evaluator>    
        ... same as above
      &lt;/appender>
    &lt;/configuration></pre>
    
        <h4 class="doAnchor" name="marker_GEventEvaluator">Marker-based
        triggering with GEventEvaluator</h4>
    
        <p>Here is the equivalent evaluator using <a
        href="filters.html#GEventEvaluator">GEventEvaluator</a>.</p>
    
        <p class="example">Example: the same with 
       <code>GEventEvaluator</code> (logback-examples/src/main/java/chapters/appenders/mail/mailWithMarker_GEvent.xml)</p>
       <span class="asGroovy" onclick="return asGroovy('mailWithMarker_GEventEvaluator');">View as .groovy</span>	
    
       <pre id="mailWithMarker_GEventEvaluator" class="prettyprint source">&lt;configuration>
      &lt;appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
        &lt;evaluator class="ch.qos.logback.classic.boolex.GEventEvaluator">
          &lt;expression>
            e.marker?.contains("NOTIFY_ADMIN") || e.marker?.contains("TRANSACTION_FAILURE")
          &lt;/expression>
        &lt;/evaluator>    
        ... same as above
      &lt;/appender>
    &lt;/configuration></pre>
    
        <p>Note that since the event may lack a marker, the value of
        e.marker can be null. Hence the use of Groovy's <a
        href="http://groovy.codehaus.org/Null+Object+Pattern">safe
        dereferencing operator</a>, that is the .? operator.
        </p>
    
    
    
        <h3><a name="smtpAuthentication" href="#smtpAuthentication"><span
        class="anchor"/></a>Authentication/STARTTLS/SSL</h3>
    
        <p><code>SMTPAppender</code> supports authentication via plain
        user passwords as well as both the STARTTLS and SSL
        protocols. Note that STARTTLS differs from SSL in that, in
        STARTTLS, the connection is initially non-encrypted and only after
        the STARTTLS command is issued by the client (if the server
        supports it) does the connection switch to SSL. In SSL mode, the
        connection is encrypted right from the start.
        </p>
    
        <h3> class="doAnchor"name="gmailSSL">SMTPAppender configuration
        for Gmail (SSL)</h3>
    
        <p>The next example shows you how to configure
        <code>SMTPAppender</code> for Gmail with the SSL protocol. </p>
        
        <p class="example">Example:: <code>SMTPAppender</code> to Gmail
        using SSL
        (logback-examples/src/main/java/chapters/appenders/mail/gmailSSL.xml)</p>
    
        <span class="asGroovy" onclick="return asGroovy('gmailSSLExample');">View as .groovy</span>	
        <pre id="gmailSSLExample" class="prettyprint source">&lt;configuration>
      &lt;appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
        <b>&lt;smtpHost>smtp.gmail.com&lt;/smtpHost></b>
        <b>&lt;smtpPort>465&lt;/smtpPort></b>
        <b>&lt;SSL>true&lt;/SSL></b>
        <b>&lt;username>YOUR_USERNAME@gmail.com&lt;/username></b>
        <b>&lt;password>YOUR_GMAIL_PASSWORD&lt;/password></b>
    
        &lt;to>EMAIL-DESTINATION&lt;/to>
        &lt;to>ANOTHER_EMAIL_DESTINATION&lt;/to> &lt;!-- additional destinations are possible -->
        &lt;from>YOUR_USERNAME@gmail.com&lt;/from>
        &lt;subject>TESTING: %logger{20} - %m&lt;/subject>
        &lt;layout class="ch.qos.logback.classic.PatternLayout">
          &lt;pattern>%date %-5level %logger{35} - %message%n&lt;/pattern>
        &lt;/layout>	    
      &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="EMAIL" />
      &lt;/root>  
    &lt;/configuration></pre>
    
    
        <h3 class="doAnchor" name="gmailSTARTTLS">SMTPAppender for Gmail
        (STARTTLS)</h3>
    
        <p>The next example shows you how to configure
        <code>SMTPAppender</code> for Gmail for the STARTTLS protocol. </p>
    
        <p class="example">Example: <code>SMTPAppender</code> to GMAIL using STARTTLS (logback-examples/src/main/java/chapters/appenders/mail/gmailSTARTTLS.xml)</p>
    
        <span class="asGroovy" onclick="return asGroovy('gmailSTARTTLSExample');">View as .groovy</span>	
        <pre id="gmailSTARTTLSExample" class="prettyprint source">&lt;configuration>	  
      &lt;appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
        &lt;smtpHost>smtp.gmail.com&lt;/smtpHost>
        &lt;smtpPort>587&lt;/smtpPort>
        &lt;STARTTLS>true&lt;/STARTTLS>
        &lt;username>YOUR_USERNAME@gmail.com&lt;/username>
        &lt;password>YOUR_GMAIL_xPASSWORD&lt;/password>
        
        &lt;to>EMAIL-DESTINATION&lt;/to>
        &lt;to>ANOTHER_EMAIL_DESTINATION&lt;/to> &lt;!-- additional destinations are possible -->
        &lt;from>YOUR_USERNAME@gmail.com&lt;/from>
        &lt;subject>TESTING: %logger{20} - %m&lt;/subject>
        &lt;layout class="ch.qos.logback.classic.PatternLayout">
          &lt;pattern>%date %-5level %logger - %message%n&lt;/pattern>
        &lt;/layout>	    
      &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="EMAIL" />
      &lt;/root>  
    &lt;/configuration></pre>
    
    
        <h3 class="doAnchor" name="smtpDiscriminator">SMTPAppender with MDCDiscriminator</h3>
    
    
        <p>As mentioned earlier, by specifying a discriminator other than
        the default one, <code>SMTPAppender</code> will generate email
        messages containing events pertaining to a particular user, user
        session or client IP address, depending on the specified discriminator.
        </p>
    
        <p>The next example illustrates the use of <a
        href="../xref/ch/qos/logback/classic/sift/MDCBasedDiscriminator.html">MDCBasedDiscriminator</a>
        in conjunction with the MDC key named "req.remoteHost", assumed to
        contain the IP address of the remote host accessing a fictitious
        application. In a web-application, you could use <a
        href="mdc.html#mis">MDCInsertingServletFilter</a> to populate MDC
        values.
        </p>
    
        <p class="example">Example: <code>SMTPAppender</code> with
        MDCBasedDsicriminator
        (logback-examples/src/main/java/chapters/appenders/mail/mailWithMDCBasedDiscriminator.xml)</p>
    
        <span class="asGroovy" onclick="return asGroovy('mailWithMDCBasedDiscriminator');">View as .groovy</span>	
        <pre id="mailWithMDCBasedDiscriminator" class="prettyprint source">&lt;configuration>	  
      &lt;appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
        &lt;smtpHost>ADDRESS-OF-YOUR-SMTP-HOST&lt;/smtpHost>
        &lt;to>EMAIL-DESTINATION&lt;/to>
        &lt;from>SENDER-EMAIL&lt;/from>
    
        <b>&lt;discriminator class="ch.qos.logback.classic.sift.MDCBasedDiscriminator"></b>
          <b>&lt;key>req.remoteHost&lt;/key></b>
          <b>&lt;defaultValue>default&lt;/defaultValue></b>
        <b>&lt;/discriminator></b>
    
        &lt;subject>${HOSTNAME} -- %X{req.remoteHost} %msg"&lt;/subject>
        &lt;layout class="ch.qos.logback.classic.html.HTMLLayout">
          &lt;pattern>%date%level%thread%X{req.remoteHost}%X{req.requestURL}%logger%msg&lt;/pattern>
        &lt;/layout>
      &lt;/appender>
    
      &lt;root>
        &lt;level level="DEBUG"/>
        &lt;appender-ref ref="EMAIL" />
      &lt;/root>  
    &lt;/configuration></pre>
    
        <p>Thus, each outgoing email generated by
        <code>SMTPAppender</code> will belong to a <em>unique</em> remote
        host, greatly facilitating problem diagnosis.
        </p>
        
        <h4 class="doAnchor" name= "bufferManagement">Buffer management in
        very busy systems</h4>
    
        <p>Internally, each distinct value returned by the discriminator
        will cause the creation of a new cyclic buffer. However, at most
        <span class="prop">maxNumberOfBuffers</span> (by default 64)
        will be maintained.  Whenever the number of buffers rises above
        <span class="prop">maxNumberOfBuffers</span>, the least recently
        updated buffer is automatically discarded. As a second safety
        measure, any buffer which has not been updated in the last 30
        minutes will be automatically discarded as well.</p>
    
        <p>On systems serving a large number of transactions per minute,
        allowing only a small number for <span
        class="prop">maxNumberOfBuffers</span> (by default 64) will
        often cause the number of events in the outgoing email to be
        unnecessarily small. Indeed, in the presence of a large number of
        transactions, there will be more than one buffer associated with
        the same transaction as buffers will be killed and re-born in
        succession for the same discriminator value (or transaction). Note
        that in even such very busy systems, the maximum number of cyclic
        buffers is capped by <span
        class="prop">maxNumberOfBuffers</span>.
        </p>
    
        <p>To avoid such yo-yo effects, <code>SMTPAppender</code> will
        release the buffer associated with a given discriminator key as
        soon as it sees an event marked as "FINALIZE_SESSION". This will
        cause the appropriate buffer to be discarded at the end of each
        transaction. You can then safely increase the value of <span
        class="prop">maxNumberOfBuffers</span> to a larger value such as
        512 or 1024 without risking running out of memory.
        </p>
    
        <p>There are three distinct but complementary mechanisms working
        together to manage cyclic buffers. They ensure that only relevant
        buffers are kept alive at any given moment, even in very busy
        systems.</p>
    
        <!-- =========================================================== -->
        <!-- =========================================================== -->
    
    
        <h3 class="doAnchor" name="DBAppender">DBAppender</h3>
    		
    		<p>The <a
    		href="../xref/ch/qos/logback/classic/db/DBAppender.html"><code>DBAppender</code></a>
    		inserts logging events into three database tables in a format
    		independent of the Java programming language.
    		</p>
    
    		<p>These three tables are <em>logging_event</em>,
    		<em>logging_event_property</em> and
    		<em>logging_event_exception</em>. They must exist before
    		<code>DBAppender</code> can be used. Logback ships with SQL
    		scripts that will create the tables.  They can be found under the
    		<em>logback-classic/src/main/java/ch/qos/logback/classic/db/script</em>
    		folder. There is a specific script for each of the most popular
    		database systems.  If the script for your particular type of
    		database system is missing, it should be quite easy to write one,
    		taking example on the already existing scripts. If you send them
    		to us, we will gladly include missing scripts in future releases.
    		</p>
    
    		<p>If your JDBC driver supports the <code>getGeneratedKeys</code>
    		method introduced in JDBC 3.0 specification, assuming you have
    		created the appropriate database tables as mentioned above, then
    		no additional steps are required. Otherwise, there must be an
    		<code>SQLDialect</code> appropriate for your database
    		system. Currently, logback has dialects for H2, HSQL, MS SQL
    		Server, MySQL, Oracle, PostgreSQL, SQLLite and Sybase. </p>
    
    		<p>The table below summarizes the database types and their support
    		of the <code>getGeneratedKeys()</code> method.
    		</p>
    
    		<table class="bodyTable striped" border="0" cellpadding="4">
    			<tr>
    				<th>RDBMS</th>
            <th>tested version(s)
            </th>
            <th>tested JDBC driver version(s)
    				</th>
            <th>
    					supports
    					<br />
    					<code>getGeneratedKeys()</code>
    					method
    				</th>		
    
            <th>is a dialect <br/>provided by logback</th>
    			</tr>
    
          <tr>
    				<td>DB2</td>
            <td>untested</td>
    				<td>untested</td>
    				<td>unknown</td>
            <td>NO</td>
    			</tr>
    
          <tr>
            <td>H2</td>
            <td>1.2.132</td>
            <td>-</td>
    				<td>unknown</td>
            <td>YES</td>
    			</tr>
    
          <tr>
            <td>HSQL</td>
            <td>1.8.0.7</td>
            <td>-</td>
    				<td>NO </td>
            <td>YES</td>
    			</tr>
    
          <tr>
            <td>Microsoft SQL Server</td>
            <td>2005</td>
            <td>2.0.1008.2 (sqljdbc.jar)</td>
    				<td>YES</td>
            <td>YES</td>
    			</tr>
    
          <tr>
    				<td>MySQL</td>
            <td>5.0.22</td>
            <td>5.0.8 (mysql-connector.jar)</td>        
    				<td>YES</td>
            <td>YES</td>
    			</tr>
    
    			<tr>
    				<td>PostgreSQL</td>
            <td>8.x</td>
            <td>8.4-701.jdbc4</td>
    				<td>NO</td>
            <td>YES</td>
    
    			</tr>
    		
    			<tr>
    				<td>Oracle</td>
            <td>10g</td>
            <td>10.2.0.1 (ojdbc14.jar)</td>
    				<td>YES</td>
            <td>YES</td>
    			</tr>
    	
          <tr>
            <td>SQLLite</td>
            <td>3.7.4</td>
            <td>-</td>
            <td>unknown</td>
            <td>YES</td>
          </tr>
    	
    			
          <tr>
            <td>Sybase SQLAnywhere</td>
            <td>10.0.1</td>
            <td>-</td>
            <td>unknown</td>
            <td>YES</td>
          </tr>
    
    		</table>
    		
    		<p>Experiments show that writing a single event into the database
    		takes approximately 10 milliseconds, on a "standard" PC. If pooled
    		connections are used, this figure drops to around 1
    		millisecond. Note that most JDBC drivers already ship with
    		connection pooling support.
    		</p>
    		
    		<p>Configuring logback to use <code>DBAppender</code> can be done
    		in several different ways, depending on the tools one has to
    		connect to the database, and the database itself. The key issue in
    		configuring <code>DBAppender</code> is about setting its
    		<code>ConnectionSource</code> object, as we shall discover
    		shortly.
    		</p>
    		
    		<p>Once <code>DBAppender</code> is configured for your database,
    		logging events are sent to the specified database. As stated
    		previously, there are three tables used by logback to store
    		logging event data.
    		</p>
    		
    		<p>
    			The <em>logging_event</em> table contains the following fields:
    		</p>
    		<table class="bodyTable striped">
    			<tr>
    				<th>Field</th>
    				<th>Type</th>
    				<th>Description</th>
    			</tr>
    			<tr>
    				<td><b>timestamp</b></td>
    				<td><code>big int</code></td>
    				<td>The timestamp that was valid at the logging event's creation.</td>
    			</tr>
    			<tr>
    				<td><b>formatted_message</b></td>
    				<td><code>text</code></td>
    
    				<td>The message that has been added to the logging event,
    				after formatting with
    				<code>org.slf4j.impl.MessageFormatter</code>, in case objects
    				were passed along with the message.</td>
    			</tr>
    			<tr>
    				<td><b>logger_name</b></td>
    				<td><code>varchar</code></td>
    				<td>The name of the logger used to issue the logging request.</td>
    			</tr>
    			<tr>
    				<td><b>level_string</b></td>
    				<td><code>varchar</code></td>
    				<td>The level of the logging event.</td>
    			</tr>
    			<tr>
    				<td><b>reference_flag</b></td>
    				<td><code>smallint</code></td>
    				<td>
    					<p>This field is used by logback to identify logging events
    					that have an exception or <code>MDC</code>property values
    					associated.
    					</p>
    
    					<p>Its value is computed by
    					<code>ch.qos.logback.classic.db.DBHelper</code>. A logging
    					event that contains <code>MDC</code> or <code>Context</code>
    					properties has a flag number of <em>1</em>. One that
    					contains an exception has a flag number of <em>2</em>. A
    					logging event that contains both elements has a flag number
    					of <em>3</em>.
    					</p>
    				</td>
    			</tr>
    			<tr>
    				<td><b>caller_filename</b></td>
    				<td><code>varchar</code></td>
    				<td>The name of the file where the logging request was issued.</td>
    			</tr>
    			<tr>
    				<td><b>caller_class</b></td>
    				<td><code>varchar</code></td>
    				<td>The class where the logging request was issued.</td>
    			</tr>
    			<tr>
    				<td><b>caller_method</b></td>
    				<td><code>varchar</code></td>
    				<td>The name of the method where the logging request was issued.</td>
    			</tr>
    			<tr>
    				<td><b>caller_line</b></td>
    				<td><code>char</code></td>
    				<td>The line number where the logging request was issued.</td>
    			</tr>
    			<tr>
    				<td><b>event_id</b></td>
    				<td><code>int</code></td>
    				<td>The database id of the logging event.</td>
    			</tr>
    		</table>
    		
    		<p>
    			The <em>logging_event_property</em> is used to store the keys and values
    			contained in the <code>MDC</code> or the <code>Context</code>. 
    			It contains these fields:
    		</p>
    
    		<table class="bodyTable striped">
    			<tr>
    				<th>Field</th>
    				<th>Type</th>
    				<th>Description</th>
    			</tr>
    			<tr>
    				<td><b>event_id</b></td>
    				<td><code>int</code></td>
    				<td>The database id of the logging event.</td>
    			</tr>
    			<tr>
    				<td><b>mapped_key</b></td>
    				<td><code>varchar</code></td>
    				<td>The key of the <code>MDC</code> property</td>
    			</tr>		
    			<tr>
    				<td><b>mapped_value</b></td>
    				<td><code>text</code></td>
    				<td>The value of the <code>MDC</code> property</td>
    			</tr>				
    		</table>
    		
    		<p>
    			The <em>logging_event_exception</em> table contains the following fields:
    		</p>
    		
    		<table class="bodyTable striped">
    			<tr>
    				<th>Field</th>
    				<th>Type</th>
    				<th>Description</th>
    			</tr>
    			<tr>
    				<td><b>event_id</b></td>
    				<td><code>int</code></td>
    				<td>The database id of the logging event.</td>
    			</tr>
    			<tr>
    				<td><b>i</b></td>
    				<td><code>smallint</code></td>
    				<td>The index of the line in the full stack trace.</td>
    			</tr>		
    			<tr>
    				<td><b>trace_line</b></td>
    				<td><code>varchar</code></td>
    				<td>The corresponding line</td>
    			</tr>				
    		</table>
    		
    		<p>
    			To give a more visual example of the work done by <code>DBAppender</code>, here
    			is a screenshot of a MySQL database with content provided by <code>DBAppender</code>.
    		</p>
    		
    		<p>The <em>logging_event</em> table:</p>
    
    		<img src="images/chapters/appenders/dbAppenderLE.gif" alt="Logging Event table" />
    
    		<p>The <em>logging_event_exception</em> table:</p>
    		
    		<img src="images/chapters/appenders/dbAppenderLEException.gif" alt="Logging Event Exception table" />
    
    		<p>The <em>logging_event_property</em> table:</p>
    		
    		<img src="images/chapters/appenders/dbAppenderLEProperty.gif" alt="Logging Event Property table" />
    
    		
    		<h4>ConnectionSource</h4>
    		
    		<p>The <code>ConnectionSource</code> interface provides a
    		pluggable means of transparently obtaining JDBC connections for
    		logback classes that require the use of a
    		<code>java.sql.Connection</code>. There are currently three
    		implementations of <code>ConnectionSource</code>, namely
    		<code>DataSourceConnectionSource</code>,
    		<code>DriverManagerConnectionSource</code> and
    		<code>JNDIConnectionSource</code>.
    		</p>
    		
    		<p>
    			The first example that we will review is a configuration using
    			<code>DriverManagerConnectionSource</code> and a MySQL database.
    			The following configuration file is what one would need.
    		</p>
    		
        <p class="example">Example: <code>DBAppender</code> configuration (logback-examples/src/main/java/chapters/appenders/db/append-toMySQL-with-driverManager.xml)</p>
        <span class="asGroovy" onclick="return asGroovy('append-toMySQL-with-driverManager');">View as .groovy</span>	
        <pre id="append-toMySQL-with-driverManager" class="prettyprint source">&lt;configuration>
    
      <b>&lt;appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
        &lt;connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
          &lt;driverClass>com.mysql.jdbc.Driver&lt;/driverClass>
          &lt;url>jdbc:mysql://host_name:3306/datebase_name&lt;/url>
          &lt;user>username&lt;/user>
          &lt;password>password&lt;/password>
        &lt;/connectionSource>
      &lt;/appender></b>
      
      &lt;root level="DEBUG" >
        &lt;appender-ref ref="DB" />
      &lt;/root>
    &lt;/configuration></pre>
    
    		<p>
    			The correct driver must be declared. Here, the <code>com.mysql.jdbc.Driver</code>
    			class is used. The <span class="prop">url</span> must begin with <em>jdbc:myslq://</em>.
    		</p>
    		
    		<p>
    			The 
    			<a href="../xref/ch/qos/logback/core/db/DriverManagerConnectionSource.html">
    			<code>DriverManagerConnectionSource</code></a> is an implementation of
    			<code>ConnectionSource</code> that obtains the connection in the
    			traditional JDBC manner based on the connection URL.
    		</p>
    		<p>
    			Note that this class will establish a new
    			<code>Connection</code> for each call to
    			<code>getConnection()</code>. It is recommended that you either
    			use a JDBC driver that natively supports connection pooling or
    			that you create your own implementation of
    			<code>ConnectionSource</code> that taps into whatever pooling
    			mechanism you are already using. If you have access to a JNDI
    			implementation that supports <code>javax.sql.DataSource</code>,
    			e.g. within a J2EE application server, see <a
    			href="#JNDIConnectionSource"><code>JNDIConnectionSource</code></a>
    			below.
    		</p>
    <!-- 
    		
    		HAS TO BE TESTED
    
    		<p>
    			If you do not have another connection pooling mechanism built
    			into your application, you can use the
    			<a href="http://jakarta.apache.org/commons/dbcp/index.html">
    		  commons-dbcp </a> package from Apache:
    		</p>
    
    <pre class="prettyprint source">
      &lt;connectionSource
        class=&quot;ch.qos.logback.core.db.DriverManagerConnectionSource&quot;&gt;
        &lt;param name=&quot;driver&quot; value=&quot;org.apache.commons.dbcp.PoolingDriver&quot;/&gt; 
        &lt;param name=&quot;url&quot; value=&quot;jdbc:apache:commons:dbcp:/myPoolingDriver&quot;/&gt; 
      &lt;/connectionSource&gt;
    </pre>
    		
    		<p>
    			Then the configuration information for the commons-dbcp
    			package goes into the file <em>myPoolingDriver.jocl</em> and is
    			placed in the classpath. See the
    			<a href="http://jakarta.apache.org/commons/dbcp/index.html"> commons-dbcp </a>
    			documentation for details.
    		</p>
     -->
     
    		<p>Connecting to a database using a <code>DataSource</code> is
    		rather similar.  The configuration now uses <a
    		href="../xref/ch/qos/logback/core/db/DataSourceConnectionSource.html">
    		<code>DataSourceConnectionSource</code></a>, which is an
    		implementation of <code>ConnectionSource</code> that obtains the
    		<code>Connection</code> in the recommended JDBC manner based on a
    		<code>javax.sql.DataSource</code>.
    		</p>
    	
        <p class="example">Example: <code>DBAppender</code> configuration (logback-examples/src/main/java/chapters/appenders/db/append-with-datasource.xml)</p>	
    
    
        <span class="asGroovy" onclick="return asGroovy('append-with-datasource');">View as .groovy</span>	
        <pre id="append-with-datasource" class="prettyprint source">&lt;configuration  debug="true">
    
      &lt;appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
         <b>&lt;connectionSource class="ch.qos.logback.core.db.DataSourceConnectionSource">
           
           &lt;dataSource class="${dataSourceClass}">
           	 </b>&lt;!-- Joran cannot substitute variables
           	 that are not attribute values. Therefore, we cannot
           	 declare the next parameter like the others. 
           	 -->
             <b>&lt;param name="${url-key:-url}" value="${url_value}"/>
             &lt;serverName>${serverName}&lt;/serverName>
             &lt;databaseName>${databaseName}&lt;/databaseName>
           &lt;/dataSource></b>
           
           &lt;user>${user}&lt;/user>
           &lt;password>${password}&lt;/password>
         &lt;/connectionSource>
      &lt;/appender>
    
      &lt;root level="INFO">
        &lt;appender-ref ref="DB" />
      &lt;/root>  
    &lt;/configuration></pre>
    
    		<p>Note that in this configuration sample, we make heavy use of
    		substitution variables.  They are sometimes handy when connection
    		details have to be centralized in a single configuration file and
    		shared by logback and other frameworks.
    		</p>	
    		
    <!-- TO BE TESTED 
    
         <p>The connection created by
         <code>DataSourceConnectionSource</code> can be placed in a JNDI
         context by using <code>BindDataSourceToJNDIAction</code>. In that
         case, one has to specify the use of this class by adding a new
         rule to Joran, logback's configuration framework. Here is an
         excerpt of such a configuration file.  </p>
    		
    <div class="source"><pre>&lt;configuration>
      ..
      <b>&lt;newRule pattern="configuration/bindDataSourceToJNDI" 
               actionClass="ch.qos.logback.core.db.BindDataSourceToJNDIAction"/>
      	    
      &lt;bindDataSourceToJNDI /></b>
      ..
    &lt;/configuration></pre></div>
    
    		<p> The <em>newRule</em> element teaches Joran to use specified
    		action class with the given pattern.  Then, we simply declare the
    		given element. The action class will be called and our connection
    		source will be bound to a JNDI context.  </p>
    
    		<p>This is a very powerful capability of Joran. If you'd like to
    		read more about Joran, please see the <a
    		href="onJoran.html">chapter to Joran</a>.  </p>
    		
    		-->
    
        <h4 class="doAnchor"
        name="JNDIConnectionSource">JNDIConnectionSource</h4>
    
    		<p><a
    		href="../xref/ch/qos/logback/core/db/JNDIConnectionSource.html">
    		<code>JNDIConnectionSource</code></a> is another
    		<code>ConnectionSource</code> implementation shipping in logback.
    		As its name indicates, it retrieves a
    		<code>javax.sql.DataSource</code> from a JNDI and then leverages
    		it to obtain a <code>java.sql.Connection</code>
    		instance. <code>JNDIConnectionSource</code> is primarily designed
    		to be used inside J2EE application servers or by application
    		server clients, assuming the application server supports remote
    		access of <code>javax.sql.DataSource</code>.  Thus, one can take
    		advantage of connection pooling and whatever other goodies the
    		application server provides. More importantly, your application
    		will be <a
    		href="http://en.wikipedia.org/wiki/Don't_repeat_yourself">dryer</a>
    		as it will be no longer necessary to define a
    		<code>DataSource</code> in <em>logback.xml</em>.</p>
    
        <p>For example, here is a configuration snippet for Tomcat. It
        assumes PostgreSQL as the database although any of the supported
        database systems (listed above) would work.</p>
    
    <pre  class="prettyprint source">&lt;Context docBase="/path/to/app.war" path="/myapp">
      ...
      &lt;Resource <b>name="jdbc/logging"</b>
                   auth="Container"
                   type="javax.sql.DataSource"
                   username="..."
                   password="..."
                   driverClassName="org.postgresql.Driver"
                   url="jdbc:postgresql://localhost/..."
                   maxActive="8"
                   maxIdle="4"/>
      ...
    &lt;/Context></pre>
    		
       <p>Once a <code>DataSource</code> is defined in the J2EE server, it
       can be easily referenced by your logback configuration file, as
       shown in the next example.</p>
       
       <p class="example">Example: <code>DBAppender</code> configuration
       by <code>JNDIConnectionSource</code>
       (logback-examples/src/main/java/chapters/appenders/db/append-via-jndi.xml)</p>
    
        <span class="asGroovy" onclick="return asGroovy('append-via-jndi');">View as .groovy</span>	
     
    
    <pre id="append-via-jndi" class="prettyprint source">&lt;configuration debug="true">
      &lt;appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
        &lt;connectionSource class=&quot;ch.qos.logback.core.db.JNDIConnectionSource&quot;&gt;
          <b>&lt;!-- please note the "java:comp/env/" prefix --&gt;</b>
          <b>&lt;jndiLocation>java:comp/env/jdbc/logging&lt;/jndiLocation></b>
        &lt;/connectionSource&gt;
      &lt;/appender>
      &lt;root level="INFO">
        &lt;appender-ref ref="DB" />
      &lt;/root>  
    &lt;/configuration></pre>
    
    		<p>
    			Note that this class will obtain an
    			<code>javax.naming.InitialContext</code>
    			using the no-argument constructor. This will usually work
    			when executing within a J2EE environment. When outside the
    			J2EE environment, make sure that you provide a
    			<em>jndi.properties</em>
    			file as described by your JNDI provider's documentation.
    		</p>
    		
    		<h4 class="doAnchor">Connection pooling</h4>
    		
    		<p>Logging events can be created at a rather fast pace. To keep up
    		with the flow of events that must be inserted into a database, it
    		is recommended to use connection pooling with
    		<code>DBAppender</code>.
    		</p>
    		
    		<p>
    			Experiment shows that using connection pooling with <code>DBAppender</code>
    			gives a big performance boost. With the following
    			configuration file, logging events are sent to a MySQL database,
    			without any pooling.
    		</p>
        
        <p class="example">Example: <code>DBAppender</code> configuration
        without pooling
        (logback-examples/src/main/java/chapters/appenders/db/append-toMySQL-with-datasource.xml)</p>
    
        <span class="asGroovy" onclick="return asGroovy('append-toMySQL-with-datasource');">View as .groovy</span>	
        <pre id="append-toMySQL-with-datasource" class="prettyprint source">&lt;configuration>
    
      &lt;appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
        &lt;connectionSource class="ch.qos.logback.core.db.DataSourceConnectionSource">
          &lt;dataSource class="com.mysql.jdbc.jdbc2.optional.MysqlDataSource">
            &lt;serverName>${serverName}&lt;/serverName>
            &lt;port>${port$&lt;/port>
            &lt;databaseName>${dbName}&lt;/databaseName>
            &lt;user>${user}&lt;/user>
            &lt;password>${pass}&lt;/password>
          &lt;/dataSource>
        &lt;/connectionSource>
      &lt;/appender>
        
      &lt;root level="DEBUG">
        &lt;appender-ref ref="DB" />
      &lt;/root>
    &lt;/configuration></pre>
    
    		<p>With this configuration file, sending 500 logging events to a
    		MySQL database takes a whopping 5 seconds, that is 10 milliseconds
    		per request. This figure is unacceptable when dealing with large
    		applications.
    		</p>
    
    		<p>A dedicated external library is necessary to use connection
    		pooling with <code>DBAppender</code>. The next example uses <a
    		href="http://sourceforge.net/projects/c3p0">c3p0</a>. To be able
    		to use c3p0, one must download it and place
    		<em>c3p0-VERSION.jar</em> in the classpath.
    		</p>
    
        <p class="example">Example: <code>DBAppender</code> configuration
        with pooling
        (logback-examples/src/main/java/chapters/appenders/db/append-toMySQL-with-datasource-and-pooling.xml)</p>
        <span class="asGroovy" onclick="return asGroovy('append-toMySQL-with-datasource-and-pooling');">View as .groovy</span>	
        <pre id="append-toMySQL-with-datasource-and-pooling" class="prettyprint source">&lt;configuration>
    
      &lt;appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
        &lt;connectionSource
          class="ch.qos.logback.core.db.DataSourceConnectionSource">
          <b>&lt;dataSource
            class="com.mchange.v2.c3p0.ComboPooledDataSource">
            &lt;driverClass>com.mysql.jdbc.Driver&lt;/driverClass>
            &lt;jdbcUrl>jdbc:mysql://${serverName}:${port}/${dbName}&lt;/jdbcUrl>
            &lt;user>${user}&lt;/user>
            &lt;password>${password}&lt;/password>
          &lt;/dataSource></b>
        &lt;/connectionSource>
      &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="DB" />
      &lt;/root>
    &lt;/configuration></pre>
    
    		<p>With this new configuration, sending 500 logging requests to
    		the aforementioned MySQL database takes around 0.5 seconds, for an
    		average of 1 millisecond per request, that is a tenfold
    		improvement in performance.
    		</p>
    
    		<h3 class="doAnchor" name="SyslogAppender">SyslogAppender</h3>
    
    		<p>The syslog protocol is a very simple protocol: a syslog sender
    		sends a small message to a syslog receiver.  The receiver is
    		commonly called <em>syslog daemon</em> or <em>syslog server</em>.
    		Logback can send messages to a remote syslog daemon. This is
    		achieved by using <a
    		href="../xref/ch/qos/logback/classic/net/SyslogAppender.html"><code>SyslogAppender</code></a>.
    		</p>
    		
    		<p>Here are the properties you can pass to a SyslogAppender.</p>
    
    		<table class="bodyTable striped">
    			<tr>
    				<th>Property Name</th>
    				<th>Type</th>
    				<th>Description</th>
    			</tr>
    			<tr>
    				<td><span class="prop" container="syslog">syslogHost</span></td>
    				<td><code>String</code></td>
    				<td>The host name of the syslog server.</td>
    			</tr>
    			<tr>
    				<td><span class="prop" container="syslog">port</span></td>
    				<td><code>String</code></td>
    				<td>The port number on the syslog server to connect
    				to. Normally, one would not want to change the default value
    				of <em>514</em>.
    				</td>
    			</tr>
    			<tr>
    				<td><span class="prop" container="syslog">facility</span></td>
    				<td><code>String</code></td>
    				<td>
    					<p>The <span class="prop">facility</span> is meant to identify 
    						the source of a message.</p>
    					<p>The <span class="prop">facility</span> option must be set
    					to one of the strings <em>KERN, USER, MAIL, DAEMON, AUTH,
    					SYSLOG, LPR, NEWS, UUCP, CRON, AUTHPRIV, FTP, NTP, AUDIT,
    					ALERT, CLOCK, LOCAL0, LOCAL1, LOCAL2, LOCAL3, LOCAL4,
    					LOCAL5, LOCAL6, LOCAL7</em>. Case is not important.</p>
    				</td>
    			</tr>
          <tr>
            <td><span class="prop" container="syslog">suffixPattern</span></td>
    				<td><code>String</code></td>
    				<td><p>The <span class="prop">suffixPattern</span> option
    				specifies the format of the non-standardized part of the
    				message sent to the syslog server. By default, its value is
    				<em>[%thread] %logger %msg</em>. Any value that a
    				<code>PatternLayout</code> could use is a correct <span
    				class="prop">suffixPattern</span> value.
    					</p>
    				</td>
    			</tr>
    
          <tr>
            <td><span class="prop"
            container="syslog">stackTracePattern</span></td>
    				<td><code>String</code></td>
    				<td><p>The <span class="prop">stackTracePattern</span>
    				property allows the customization of the string appearing just
    				before each stack trace line. The default value for this
    				property is "\t", i.e. the tab character. Any value accepted
    				by <code>PatternLayout</code> is a valid value for <span
    				class="prop">stackTracePattern</span>.</p>
    				</td>
    			</tr>
    
    			<tr>
    				<td><span class="prop" container="syslog">throwableExcluded</span></td>
    				<td><code>boolean</code></td>
    				<td>Setting <span class="prop">throwableExcluded</span> to
    				<code>true</code> will cause stack trace data associated with
    				a Throwable to be omitted. By default, <span
    				class="prop">throwableExcluded</span> is set to
    				<code>false</code> so that stack trace data is sent to the
    				syslog server. </td>
    			</tr>
    
    
    		</table>
    		
    		<p>The syslog severity of a logging event is converted from the
    		level of the logging event.  The <em>DEBUG</em> level is converted
    		to <em>7</em>, <em>INFO</em> is converted to <em>6</em>,
    		<em>WARN</em> is converted to <em>4</em> and <em>ERROR</em> is
    		converted to <em>3</em>.
    		</p>
    		
    		<p>Since the format of a syslog request follows rather strict
    		rules, there is no layout to be used with
    		<code>SyslogAppender</code>. However, using the <span
    		class="prop">suffixPattern</span> option lets the user display
    		whatever information she wishes.
    		</p>
    		
    		<p>Here is a sample configuration using a
    		<code>SyslogAppender</code>.</p>
    		
        <p class="example">Example: <code>SyslogAppender</code> configuration (logback-examples/src/main/java/chapters/appenders/conf/logback-syslog.xml)</p>	
        <span class="asGroovy" onclick="return asGroovy('logback-syslog');">View as .groovy</span>	
        <pre id="logback-syslog" class="prettyprint source">&lt;configuration>
    
      &lt;appender name="SYSLOG" class="ch.qos.logback.classic.net.SyslogAppender">
        &lt;syslogHost>remote_home&lt;/syslogHost>
        &lt;facility>AUTH&lt;/facility>
        &lt;suffixPattern>[%thread] %logger %msg&lt;/suffixPattern>
      &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="SYSLOG" />
      &lt;/root>
    &lt;/configuration></pre>
    
    		<p>When testing this configuration, you should verify that the
    		remote syslog daemon accepts requests from an external
    		source. Experience shows that, by default, syslog daemons usually
    		deny requests coming via a network connection.
    		</p>
    		
    
        <h3 class="doAnchor" name="SiftingAppender">SiftingAppender</h3>
    
        <p>As its name implies, a <code>SiftingAppender</code> can be used
        to separate (or sift) logging according to a given runtime
        attribute. For example, <code>SiftingAppender</code> can separate
        logging events according to user sessions, so that the logs
        generated by different users go into distinct log files, one log
        file per user.
        </p>
    
    
        
        <table class="bodyTable striped">
    			<tr>
    				<th>Property Name</th>
    				<th>Type</th>
    				<th>Description</th>
    			</tr>
    			<tr>
    				<td><span class="prop" container="sift">timeout</span></td>
    				<td><code><a
    				href="../apidocs/ch/qos/logback/core/util/Duration.html">Duration</a></code></td>
    				<td>A nested appender which has not been accessed beyond the
    				<span class="prop">timeout</span> duration is deemed stale. A
    				stale appender is closed and unreferenced by
    				<code>SiftingAppender</code>. The dfault value for <span
    				class="prop">timeout</span> is 30 minutes.</td>
    			</tr>
    			<tr>
    				<td><span class="prop" container="sift">maxAppenderCount</span></td>
    				<td><code>integer</code></td>
    				<td>The maximum number of nested appenders
    				<code>SiftingAppender</code> may create and track. Default
    				value for <span class="prop">maxAppenderCount</span> is
    				Integer.MAX_VALUE.</td>
    			</tr>
      </table>
    
        <p><code>SiftingAppender</code> achieves this feat by creating
        nested appenders on the fly. Nested appenders are created based on
        a template specified within the configuration of the
        <code>SiftingAppender</code> itself (enclosed within the
        <code>&lt;sift></code> element, see example
        below). <code>SiftingAppender</code> is responsible for managing
        the lifecycle of child appenders. For example,
        <code>SiftingAppender</code> will automatically close and remove
        any stale appender. A nested appender is considered stale when no
        accesses it beyond the duration specified by the <span
        class="prop">timeout</span> parameter.
        </p>
    
        <p>When handling a logging event, <code>SiftingAppender</code>
        will select a child appender to delegate to. The selection
        criteria are computed at runtime by a discriminator. The user can
        specify the selection criteria with the help of a <code><a
        href="../xref/ch/qos/logback/core/sift/Discriminator.html">Discriminator</a></code>. Let
        us now study an eaxample.
        </p>
     
        <h4>Example</h4>
    
        <p>The <a
        href="../xref/chapters/appenders/sift/SiftExample.html">SiftExample</a>
        application logs a message stating that the application has
        started. It then sets the MDC key "userid" to "Alice" and logs a
        message. Here is the salient code:</p>
       
        <p class="source">logger.debug("Application started");
    MDC.put("userid", "Alice");
    logger.debug("Alice says hello"); </p>
    
        <p>The template for the configuration file illustrates the use of
        <code>SiftingAppender</code>.</p>
    
    
        <p class="example">Example: <code>SiftingAppender</code>
        configuration
        (logback-examples/src/main/java/chapters/appenders/sift/byUserid.xml)</p>
    
        <span class="asGroovy" onclick="return asGroovy('byUserid');">View as .groovy</span>
    
        <pre id="byUserid" class="prettyprint source">&lt;configuration>
    
      <b>&lt;appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender"></b>
        &lt;!-- in the absence of the class attribute, it is assumed that the
             desired discriminator type is
             ch.qos.logback.classic.sift.MDCBasedDiscriminator -->
        <b>&lt;discriminator></b>
          <b>&lt;key><span class="green">userid</span>&lt;/key></b>
          <b>&lt;defaultValue>unknown&lt;/defaultValue></b>
        <b>&lt;/discriminator></b>
        <b>&lt;sift></b>
          <b>&lt;appender name="FILE-<span class="green">${userid}</span>" class="ch.qos.logback.core.FileAppender"></b>
            <b>&lt;file><span class="green">${userid}</span>.log&lt;/file></b>
            <b>&lt;append>false&lt;/append></b>
            <b>&lt;layout class="ch.qos.logback.classic.PatternLayout"></b>
              <b>&lt;pattern>%d [%thread] %level %mdc %logger{35} - %msg%n&lt;/pattern></b>
            <b>&lt;/layout></b>
          <b>&lt;/appender></b>
        <b>&lt;/sift></b>
      &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="SIFT" />
      &lt;/root>
    &lt;/configuration></pre>
        
        
        <p>In the absence of a class attribute, it is assumed that the
        discriminator type is <a
        href="../xref/ch/qos/logback/classic/sift/MDCBasedDiscriminator.html">MDCBasedDiscriminator</a>.
        The discrimating value is the MDC value associated with the key
        given by the <span class="prop">key</span> property. However, if
        that MDC value is null, then <span
        class="prop">defaultValue</span> is used as the discrimating
        value.
        </p>
    
        <p>The <code>SiftingAppender</code> is unique in its capacity to
        reference and configure child appenders. In the above example,
        <code>SiftingAppender</code> will create multiple
        <code>FileAppender</code> instances, each
        <code>FileAppender</code> instance identified by the value
        associated with the "userid" MDC key. Whenever the "userid" MDC
        key is assigned a new value, a new <code>FileAppender</code>
        instance will be built from scratch. The
        <code>SiftingAppender</code> keeps track of the appenders it
        creates. Appenders unused for 30 minutes will be automatically
        closed and discarded.
        </p>
    
        <p><span class="label notice">Variable export</span> It is not
        enough to have different appender instances; each instance must
        output to a distinct target resource. To allow such
        differentiation, within the appender template, the key passed to
        the discriminator, "userid" in the above example, is exported and
        becomes a <a
        href="configuration.html#variableSubstitution">variable</a>. Consequently,
        this variable can be used to differentiate the actual resource
        used by a given child appender.
        </p>
    
        <p>Running the <code>SiftExample</code> application with the
        "byUserid.xml" configuration file shown above, will result in two
        distinct log files, "unknown.log" and "Alice.log".
    		</p>
    
        <p><span class="label">local-scoped variables</span> As of version
        1.0.12, properties defined in local scope within the configuration
        file will be available to nested appenders. Moreover, you can <a
        href="configuration.html#definingProps">define variables</a> or <a
        href="configuration.html#definingPropsOnTheFly">dynamically
        compute</a> variables from <em>within</em> the the
        <code>&lt;sift></code> element. Combining a variable from parts
        defined outside and within the <code>&lt;sift></code> element is
        also supported.
        </p>
    
        <h4 class="doAnchor" name="siftGettingTimeoutRight">Getting the
        <span class="prop">timeout</span> right</h4>
    
        <p>For certain types of applications, it may be difficult to get
        the <span class="prop">timeout</span> parameter right. If the
        <span class="prop">timeout</span> is too small, a nested appender
        might be removed just to be created anew a few seconds later. This
        phenomenon is called <em>trashing</em>. If the <span
        class="prop">timeout</span> is too long and appenders are created
        in quick succession, you might run out of resources. Similarly,
        setting <span class="prop">maxAppenderCount</span> too low might
        cause trashing as well.
        </p>
    
        <p>In many case, it may be easier to pinpoint a location in your
        code after which a nested appender is no longer needed. If such a
        location exists, even approximately, log from that location using
        the <a
        href="../apidocs/ch/qos/logback/classic/ClassicConstants.html#FINALIZE_SESSION_MARKER">FINALIZE_SESSION</a>
        marker. Whenever SiftingAppender sees a logging event marked as
        <code>FINALIZE_SESSION</code> it will end-of-life the associated
        nested appender. Upon reaching its end-of-life, a nested appender
        will linger for a few seconds to process any late coming events
        (if any) and then will be closed.
        </p>
        
        <pre class="prettyprint source">import org.slf4j.Logger;
    import static ch.qos.logback.classic.ClassicConstants.FINALIZE_SESSION_MARKER;
    
      void job(String jobId) {
       
        MDC.put("jobId", jobId);
        logger.info("Starting job.");
    
        ... do whather the job needs to do
        
        // will cause the nested appender reach end-of-life. It will
        // linger for a few seconds.
        logger.info(FINALIZE_SESSION_MARKER, "About to end the job");
    
        try {
          .. perform clean up
        } catch(Exception e);  
          // This log statement will be handled by the lingering appender. 
          // No new appender will be created.
          logger.error("unexpected error while cleaning up", e);
        }
      }
    
    </pre>
    
        <h3 class="doAnchor" name="AsyncAppender">AsyncAppender</h3>
    
        <p>AsyncAppender logs <a
        href="../apidocs/ch/qos/logback/classic/spi/ILoggingEvent.html">ILoggingEvent</a>s
        asynchronously. It acts solely as an event dispatcher and must
        therefore reference another appender in order to do anything
        useful. In order to avoid loss of logging events, this appender
        should be closed. It is the user's responsibility to close
        appenders, typically at the end of the application lifecycle.
        </p>
    
        <p><span class="label notice">Lossy by default if 80% full</span>
        AsyncAppender buffers events in a <a
        href="http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/BlockingQueue.html">
        BlockingQueue</a>. A worker thread created by
        <code>AsyncAppender</code> takes events from the head of the
        queue, and dispatches them to the single appender attached to
        <code>AsyncAppender</code>. Note that by default,
        <code>AsyncAppender</code> will drop events of level TRACE, DEBUG
        and INFO if its queue is 80% full. This strategy has an amazingly
        favorable effect on performance at the cost of event loss.
        </p>
    
        <p>Here is the list of properties admitted by
        <code>AsyncAppender:</code></p>
    
    		<table class="bodyTable striped">
          <tr>
            <th>Property Name</th>
            <th>Type</th>
            <th>Description</th>
          </tr>
    			<tr>
            <td><span class="prop" container="async">queueSize</span></td>
            <td><code>int</code></td>
            <td>The maximum capacity of the blocking queue. By default,
            <span class="prop">queueSize</span> is set to 256.
    				</td>
    			</tr>
          <tr>
            <td><span class="prop" container="async">discardingThreshold</span></td>
            <td><code>int</code></td>
            <td>By default, when the blocking queue has 20% capacity
            remaining, it will drop events of level TRACE, DEBUG and INFO,
            keeping only events of level WARN and ERROR. To keep all
            events, set <span class="prop">discardingThreshold</span> to
            0.
    			</td>
    			</tr>
          <tr>
            <td><span class="prop" container="async">includeCallerData</span></td>
            <td><code>boolean</code></td>
            <td>Extracting caller data can be rather expensive. To improve
            performance, by default, caller data associated with an event
            is not extracted when the event added to the event queue. By
            default, only "cheap" data like the thread name and the <a
            href="mdc.html">MDC</a> are copied. You can direct this
            appender to include caller data by setting the <span
            class="prop">includeCallerData</span> property to true.
            </td>
          </tr>
        </table>
    
        <p>By default, event queue is configured with a maximum capacity
        of 256 events.  If the queue is filled up, then application
        threads are blocked from logging new events until the worker
        thread has had a chance to dispatch one or more events. When the
        queue is no longer at its maximum capacity, application threads
        are able to start logging events once again. Asynchronous logging
        therefore becomes pseudo-synchronous when the appender is
        operating at or near the capacity of its event buffer. This is not
        necessarily a bad thing. The appender is designed to allow the
        application to keep on running, albeit taking slightly more time
        to log events until the pressure on the appenders buffer eases.
        </p>
    
        <p>Optimally tuning the size of the appenders event queue for
        maximum application throughput depends upon several factors. Any
        or all of the following factors are likely to cause
        pseudo-synchronous behavior to be exhibited:</p>
      
        <ul>
          <li>Large numbers of application threads</li>
          <li>Large numbers of logging events per application call</li>
          <li>Large amounts of data per logging event</li>
          <li>High latency of child appenders</li>
        </ul>
    
        <p>To keep things moving, increasing the size of the queue will
        generally help, at the expense of heap available to the
        application.
        </p>
    
        
        <p><span class="label notice">Lossy behavior</span> In light of
        the discussion above and in order to reduce blocking, by default,
        when less than 20% of the queue capacilty remains,
        <code>AsyncAppender</code> will drop events of level TRACE, DEBUG
        and INFO keeping only events of level WARN and ERROR. This
        strategy ensures non-blocking handling of logging events (hence
        excellent performance) at the cost loosing events of level TRACE,
        DEBUG and INFO when the queue has less than 20% capacity. Event
        loss can be prevented by setting the <span
        class="prop">discardingThreshold</span> property to 0 (zero).
        </p>
    
        <p class="example">Example: <code>AsyncAppender</code>
        configuration
        (logback-examples/src/main/java/chapters/appenders/conc/logback-async.xml)</p>
    
        <span class="asGroovy" onclick="return asGroovy('asyncAppender');">View as .groovy</span>
    
        <pre id="asyncAppender" class="prettyprint source">&lt;configuration>
      &lt;appender name="<b>FILE</b>" class="ch.qos.logback.core.FileAppender">
        &lt;file>myapp.log&lt;/file>
        &lt;encoder>
          &lt;pattern>%logger{35} - %msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      <b>&lt;appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender"></b>
        <b>&lt;appender-ref ref="FILE" /></b>
      <b>&lt;/appender></b>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="<b>ASYNC</b>" />
      &lt;/root>
    &lt;/configuration></pre>
      
    
    		<h3 class="doAnchor" name="WriteYourOwnAppender">Writing your own
    		Appender</h3>
    
    
        <p>You can easily write your appender by subclassing
        <code>AppenderBase</code>.  It handles support for filters, status
        messages and other functionality shared by most appenders.  The
        derived class only needs to implement one method, namely
        <code>append(Object eventObject)</code>.
        </p>
    
        <p>The <code>CountingConsoleAppender</code>, which we list next,
        appends a limited number of incoming events on the console. It
        shuts down after the limit is reached.  It uses a
        <code>PatternLayoutEncoder</code> to format the events and accepts
        a parameter named <code>limit</code>. Therefore, a few more
        methods beyond <code>append(Object eventObject)</code> are
        needed. As shown below, these parameters are handles
        auto-magically by logback's various configuration mechanisms.
        </p>
        
        <em>Example 4.<span class="autoExec"/>:
        <code>CountingConsoleAppender</code>
        (logback-examples/src/main/java/chapters/appenders/CountingConsoleAppender.java)</em>
        <pre class="prettyprint source">package chapters.appenders;
    
    import java.io.IOException;
    
    import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.AppenderBase;
    
    
    public class CountingConsoleAppender extends AppenderBase&lt;ILoggingEvent> {
      static int DEFAULT_LIMIT = 10;
      int counter = 0;
      int limit = DEFAULT_LIMIT;
      
      PatternLayoutEncoder encoder;
      
      public void setLimit(int limit) {
        this.limit = limit;
      }
    
      public int getLimit() {
        return limit;
      }
      
      @Override
      public void start() {
        if (this.encoder == null) {
          addError("No encoder set for the appender named ["+ name +"].");
          return;
        }
        
        try {
          encoder.init(System.out);
        } catch (IOException e) {
        }
        super.start();
      }
    
      public void append(ILoggingEvent event) {
        if (counter >= limit) {
          return;
        }
        // output the events as formatted by our layout
        try {
          this.encoder.doEncode(event);
        } catch (IOException e) {
        }
    
        // prepare for next event
        counter++;
      }
    
      public PatternLayoutEncoder getEncoder() {
        return encoder;
      }
    
      public void setEncoder(PatternLayoutEncoder encoder) {
        this.encoder = encoder;
      }
    }</pre>
    
    		<p>The <code>start()</code> method checks for the presence of a
    		<code>PatternLayoutEncoder</code>.  In case the encoder is not
    		set, the appender fails to start and emits an error message.
    		</p>
    		
    		<p>This custom appender illustrates two points:</p>
    		
    		<ul>
    
          <li>All properties that follow the setter/getter JavaBeans
          conventions are handled transparently by logback
          configurators. The <code>start()</code> method, which is called
          automatically during logback configuration, has the
          responsibility of verifying that the various properties of the
          appender are set and are coherent.
    			</li>
    
    			<li>The <code>AppenderBase.doAppend()</code> method invokes the
    			append() method of its derived classes.  Actual output
    			operations occur in the <code>append</code>() method.  In
    			particular, it is in this method that appenders format events by
    			invoking their layouts.
    			</li>
    		</ul>
    		
    		<p>The <a
    		href="../xref/chapters/appenders/CountingConsoleAppender.html"><code>CountingConsoleAppender</code></a>
    		can be configured like any other appender.  See sample
    		configuration file
    		<em>logback-examples/src/main/java/chapters/appenders/countingConsole.xml</em>
    		for an example.
    		</p>
      
    
    		<h2 class="doAnchor" name="logback_access">Logback Access</h2>
    		
    		<p>Most of the appenders found in logback-classic have their
    		equivalent in logback-access. These work essentially in the same
    		way as their logback-classic counterparts. In the next section, we
    		will cover their use.
    		</p>
    		
    		<h3 class="doAnchor" name="AccessSocketAppender">SocketAppender
    		and SSLSocketAppender</h3>
    		
    		<p>The <a
    		href="../xref/ch/qos/logback/access/net/SocketAppender.html">
    		<code>SocketAppender</code></a> is designed to log to a remote
    		entity by transmitting serialized <code>AccessEvent</code> objects
    		over the wire.  Remote logging is non-intrusive as far as the
    		access event is concerned.  On the receiving end after
    		deserialization, the event can be logged as if it were generated
    		locally.
    		</p>
    		
    		<p>The <a href="../xref/ch/qos/logback/access/net/SSLSocketAppender.html">
        <code>SSLSocketAppender</code></a> extends the basic 
        <code>SocketAppender</code></a> allowing logging to a remote entity over 
        the Secure Sockets Layer (SSL).
        </p>
        
    		<p>
    			The properties of access' <code>SocketAppender</code> are the same as those available
    			for classic's <code>SocketAppender</code>.
    		</p>
    
        <h3 class="doAnchor"
        name="AccessServerSocketAppender">ServerSocketAppender and
        SSLServerSocketAppender</h3>
        
        <p>Like <code>SocketAppender</code>, the <a
        href="../xref/ch/qos/logback/access/net/server/ServerSocketAppender.html">
        <code>ServerSocketAppender</code></a> is designed to log to a remote
        entity by transmitting serialized <code>AccessEvent</code> objects
        over the wire.  However, when using <code>ServerSocketAppender</code>
        the appender acts as a server, passively listening on a TCP socket awaiting
        inbound connections from interested clients.  Logging events delivered
        to the appender are distributed to all connected clients.
        </p>
        
        <p>The <a href="../xref/ch/qos/logback/access/net/server/SSLServerSocketAppender.html">
        <code>SSLSocketAppender</code></a> extends the basic 
        <code>ServerSocketAppender</code></a> allowing logging to a remote entity 
        over the Secure Sockets Layer (SSL).
        </p>
        
        <p>The properties of access' <code>ServerSocketAppender</code> are
        the same as those available for classic's
        <code>ServerSocketAppender</code>.
        </p>
        
    	 	
    		<h3 class="doAnchor" name="AccessSMTPAppender">SMTPAppender</h3>
    		
    		<p>Access' <a
    		href="../xref/ch/qos/logback/access/net/SMTPAppender.html">
    		<code>SMTPAppender</code></a> works in the same way as its Classic
    		counterpart.  However, the <span class="prop">evaluator</span>
    		option is rather different.  By default, a
    		<code>URLEvaluator</code> object is used by
    		<code>SMTPAppender</code>. This evaluator contains a list of URLs
    		that are checked against the current request's URL. When one of
    		the pages given to the <code>URLEvaluator</code> is requested,
    		<code>SMTPAppender</code> sends an email.
    		</p>
    		
    		<p>
    			Here is a sample configuration of a <code>SMTPAppender</code> in the access environment.
    		</p>
        <p class="example">Example: <code>SMTPAppender</code>
        configuration
        (logback-examples/src/main/java/chapters/appenders/conf/access/logback-smtp.xml)</p>
    
    <pre class="prettyprint source">&lt;appender name="SMTP"
      class="ch.qos.logback.access.net.SMTPAppender">
      &lt;layout class="ch.qos.logback.access.html.HTMLLayout">
        &lt;pattern>%h%l%u%t%r%s%b&lt;/pattern>
      &lt;/layout>
        
      <b>&lt;Evaluator class="ch.qos.logback.access.net.URLEvaluator">
        &lt;URL>url1.jsp&lt;/URL>
        &lt;URL>directory/url2.html&lt;/URL>
      &lt;/Evaluator></b>
      &lt;from>sender_email@host.com&lt;/from>
      &lt;smtpHost>mail.domain.com&lt;/smtpHost>
      &lt;to>recipient_email@host.com&lt;/to>
    &lt;/appender></pre>
    
    		<p>This way of triggering the email lets users select pages that
    		are important steps in a specific process, for example.  When such
    		a page is accessed, the email is sent with the pages that were
    		accessed previously, and any information the user wants to be
    		included in the email.
    		</p>
    
    		<h3 class="doAnchor" name="AccessDBAppender">DBAppender</h3>
    		
    		<p><a
    		href="../xref/ch/qos/logback/access/db/DBAppender.html"><code>DBAppender</code></a>
    		is used to insert the access events into a database.
    		</p>
    
    		<p>Two tables are used by <code>DBAppender</code>:
    		<em>access_event</em> and <em>access_event_header</em>. They both
    		must exist before <code>DBAppender</code> can be used. Logback
    		ships with SQL scripts that will create the tables.  They can be
    		found in the
    		<em>logback-access/src/main/java/ch/qos/logback/access/db/script</em>
    		directory. There is a specific script for each of the most popular
    		database systems.  If the script for your particular type of
    		database system is missing, it should be quite easy to write one,
    		taking as example one of the existing scripts. You are encouraged
    		to contribute such missing scripts back to the project.
    		</p>
    		
    		<p>The <em>access_event</em> table's fields are described below:</p>
    
    		<table class="bodyTable striped">
    			<tr>
    				<th>Field</th>
    				<th>Type</th>
    				<th>Description</th>
    			</tr>
    			<tr>
    				<td><b>timestamp</b></td>
    				<td><code>big int</code></td>
    				<td>The timestamp that was valid at the access event's creation.</td>
    			</tr>
    			<tr>
    				<td><b>requestURI</b></td>
    				<td><code>varchar</code></td>
    				<td>The URI that was requested.</td>
    			</tr>
    			<tr>
    				<td><b>requestURL</b></td>
    				<td><code>varchar</code></td>
    				<td>The URL that was requested. This is a string composed of the request method,
    				the request URI and the request protocol.
    				</td>
    			</tr>
    			<tr>
    				<td><b>remoteHost</b></td>
    				<td><code>varchar</code></td>
    				<td>The name of the remote host.</td>
    			</tr>
    			<tr>
    				<td><b>remoteUser</b></td>
    				<td><code>varchar</code></td>
    				<td>
    					The name of the remote user.
    				</td>
    			</tr>
    			<tr>
    				<td><b>remoteAddr</b></td>
    				<td><code>varchar</code></td>
    				<td>The remote IP address.</td>
    			</tr>
    			<tr>
    				<td><b>protocol</b></td>
    				<td><code>varchar</code></td>
    				<td>The request protocol, like <em>HTTP</em> or <em>HTTPS</em>.</td>
    			</tr>
    			<tr>
    				<td><b>method</b></td>
    				<td><code>varchar</code></td>
    				<td>The request method, usually <em>GET</em> or <em>POST</em>.</td>
    			</tr>
    			<tr>
    				<td><b>serverName</b></td>
    				<td><code>varchar</code></td>
    				<td>The name of the server that issued the request.</td>
    			</tr>
    			<tr>
    				<td><b>event_id</b></td>
    				<td><code>int</code></td>
    				<td>The database id of the access event.</td>
    			</tr>
    		</table>
    		
    		<p>
    			The <em>access_event_header</em> table contains the header of each
    			request. The information is organised as shown below:
    		</p>
    
    		<table class="bodyTable striped">
    			<tr>
    				<th>Field</th>
    				<th>Type</th>
    				<th>Description</th>
    			</tr>
    			<tr>
    				<td><b>event_id</b></td>
    				<td><code>int</code></td>
    				<td>The database id of the corresponding access event.</td>
    			</tr>
    			<tr>
    				<td><b>header_key</b></td>
    				<td><code>varchar</code></td>
    				<td>The header name, for example <em>User-Agent</em>.</td>
    			</tr>
    			<tr>
    				<td><b>header_value</b></td>
    				<td><code>varchar</code></td>
    				<td>The header value, for example <em>Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1) Gecko/20061010 Firefox/2.0</em></td>
    			</tr>
    			</table>
    
    		<p>All properties of classic's <code>DBAppender</code> are available
    			in access's <code>DBAppender</code>. The latter offers one more option,
    			described below.
    		</p>
    		
    		<table class="bodyTable striped">
    			<tr>
    				<th>Property Name</th>
    				<th>Type</th>
    				<th>Description</th>
    			</tr>
    			<tr>
    				<td>
    					<b>
    						<span class="prop">insertHeaders</span>
    					</b>
    				</td>
    				<td>
    					<code>boolean</code>
    				</td>
    				<td>
    					Tells the <code>DBAppender</code> to populate the database with the header
    					information of all incoming requests.
    				</td>
    			</tr>
    		</table>
    
    		<p>Here is a sample configuration that uses <code>DBAppender</code>.</p>
    
        <p class="example">Example: DBAppender configuration <em>(logback-examples/src/main/java/chapters/appenders/conf/access/logback-DB.xml)</em></p>
        
        <pre class="prettyprint source">&lt;configuration>
    
      &lt;appender name="DB" class="ch.qos.logback.access.db.DBAppender">
        &lt;connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
          &lt;driverClass>com.mysql.jdbc.Driver&lt;/driverClass>
          &lt;url>jdbc:mysql://localhost:3306/logbackdb&lt;/url>
          &lt;user>logback&lt;/user>
          &lt;password>logback&lt;/password>
        &lt;/connectionSource>
        &lt;insertHeaders>true&lt;/insertHeaders>
      &lt;/appender>
    
      &lt;appender-ref ref="DB" />
    &lt;/configuration></pre>
    
    
        <h3 class="doAnchor"
        name="AccessSiftingAppender">SiftingAppender</h3>
       
        <p>The SiftingAppender in logback-access is quite similar to its
        logback-classic counterpart. The main difference is that in
        logback-access the default discriminator, namely <a
        href="../xref/ch/qos/logback/access/sift/AccessEventDiscriminator.html">AccessEventDiscriminator</a>,
        is not MDC based. As its name suggests, AccessEventDiscriminator,
        uses a designated field in AccessEvent as the basis for selecting a
        nested appender. If the value of the designated field is null,
        then the value specified in the <span
        class="prop">defaultValue</span> property is used.
        </p>
    
        <p>The designated AccessEvent field can be one of COOKIE,
        REQUEST_ATTRIBUTE, SESSION_ATTRIBUTE, REMOTE_ADDRESS, LOCAL_PORT,
        REQUEST_URI. Note that the first three fields require that the
        <span class="prop">AdditionalKey</span> property also be
        specified.</p>
        
        <p>Below is an example configuration file.</p>
    
        <p class="example">Example: SiftingAppender configuration (logback-examples/src/main/java/chapters/appenders/conf/sift/access-siftingFile.xml)</p>
        
        <pre class="prettyprint source">&lt;configuration>
      &lt;appender name="SIFTING" class="ch.qos.logback.access.sift.SiftingAppender">
        &lt;Discriminator class="ch.qos.logback.access.sift.AccessEventDiscriminator">
          &lt;Key>id&lt;/Key>
          &lt;FieldName>SESSION_ATTRIBUTE&lt;/FieldName>
          &lt;AdditionalKey>username&lt;/AdditionalKey>
          &lt;defaultValue>NA&lt;/defaultValue>
        &lt;/Discriminator>
        &lt;sift>
           &lt;appender name="ch.qos.logback:logback-site:jar:1.0.13" class="ch.qos.logback.core.FileAppender">
            &lt;file>byUser/ch.qos.logback:logback-site:jar:1.0.13.log&lt;/file>
            &lt;layout class="ch.qos.logback.access.PatternLayout">
              &lt;pattern>%h %l %u %t \"%r\" %s %b&lt;/pattern>
            &lt;/layout>
          &lt;/appender>
        &lt;/sift>
      &lt;/appender>
      &lt;appender-ref ref="SIFTING" />
    &lt;/configuration></pre>
    
    
        <p>In the above configuration file, a <code>SiftingAppender</code>
        nests <code>FileAppender</code> instances. The key "id" is
        designated as a variable which will be available to the nested
        <code>FileAppender</code> instances. The default discriminator,
        namely <code>AccessEventDiscriminator</code>, will search for a
        "username" session attribute in each <code>AccessEvent</code>. If
        no such attribute is available, then the default value "NA" will
        be used.  Thus, assuming the session attribute named "username"
        contains the username of each logged on user, there will be a log
        file under the <em>byUser/</em> folder (of the current folder)
        named after each user containing the access logs for that user.
        </p>
    
    
        <script src="../templates/footer.js" type="text/javascript"></script>
    
    
      </div>
      
    </body>
    </html>
    ����������logback_1.0.13/docs/manual/jmxConfig.html�����������������������������������������������������������0000644�0001750�0001750�00000035636�12143164240�020205� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
    
        <link rel="stylesheet" type="text/css" href="../css/common.css" />
        <link rel="stylesheet" type="text/css" href="../css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="../css/_print.css" media="print" />
        <link rel="stylesheet" type="text/css" href="../css/prettify.css" media="screen" />
    
        <title>Chapter 10: JMX Configuration</title>
      </head>
      <body onload="prettyPrint(); decorate();">
        <script type="text/javascript">prefix='../';</script>
        <script type="text/javascript" src="../js/prettify.js"></script>
        <script type="text/javascript" src="../templates/header.js"></script>
        <script type="text/javascript" src="../js/jquery-min.js"></script>
        <script type="text/javascript" src="../js/decorator.js"></script>
        
        <div id="left">
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="../templates/left.js" type="text/javascript"></script>
        </div>
        <div id="right">
          <script src="menu.js" type="text/javascript"></script>
        </div>
        <div id="content">
    	
        <h1>Chapter 10: JMX Configurator</h1>
        
    		<p>As its name indicates, <code>JMXConfigurator</code> allows
    		configuration of logback via JMX. In a nutshell, it lets you
    		reconfigure logback from the default configuration file, from a
    		designated file or URL, list loggers and modify logger levels.
    		</p>
    		
    		<h3>Using the JMX Configurator</h3>
        
        
    		<p>If your server run on JDK 1.6 or later, then you can just
    		invoke the <code>jconsole</code> application on the command line and
    		then connect to your server's MBeanServer. If you are running an
    		older JVM, then you should read the section on <a
    		href="#jmxEnablingServer">JMX enabling your server</a>.
        </p>
    
        <p><code>JMXConfigurator</code> is enabled by a single line in
        your logback configuration file, as shown below:
    		</p>
    
        <pre class="prettyprint source">&lt;configuration>
      <b>&lt;jmxConfigurator /></b>
      
      &lt;appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        &lt;layout class="ch.qos.logback.classic.PatternLayout">
          &lt;Pattern>%date [%thread] %-5level %logger{25} - %msg%n&lt;/Pattern>
        &lt;/layout>
      &lt;/appender>
    
      &lt;root level="debug">
        &lt;appender-ref ref="console" />
      &lt;/root>  
    &lt;/configuration></pre>
    		
        <p>After you connect to your server with <em>jconsole</em>, on the
        MBeans panel, under "ch.qos.logback.classic.jmx.Configurator"
        folder you should see several operations to choose from, as shown
        in the figure below:
        </p>
        
        <h3 class="doAnchor" name="jmxConfigurator">Screen-shot of
        <code>JMXConfigurator</code> viewed in <code>jconsole</code></h3>
    
        <img src="images/chapters/jmxConfigurator/jmxConfigurator.gif" alt="jmxConfigurator"/>   
    
    		<p>Thus, you can</p>
    		
    		<ul>
          <li>Reload logback configuration using the default configuration
          file.</li>
    
          <li>Reload the configuration with the specified URL.</li>
          <li>Reload the configuration with the specified file.</li>
    
    			<li>Set the level of a specified logger. To set to null, pass
    			the string "null" as value.</li>
          <li>Get the level of a specified logger. The returned value can be
          null.</li>
    			<li>Get the <a href="architecture.html#effectiveLevel">effective
    			level</a> of a specified logger.</li>
    		</ul>
    		
        <p><code>JMXConfigurator</code> exposes the list of existing
        loggers and a status list as attributes.</p>
        
        <p>The status list can help you diagnose logback's internal
        state.</p>
    
        <img src="images/chapters/jmxConfigurator/statusList.gif" alt="statusList.gif"/>   
    
        <h3 class="doAnchor" name="leak">Avoiding memory leaks</h3>
    
        <p>If your application is deployed in a web-server or an
        application server, the registration of an
        <code>JMXConfigurator</code> instance creates a reference from the
        system class loader into your application which will prevent it
        from being garbage collected when it is stopped or re-deployed,
        resulting in a severe memory leak.</p>
    
        <p>Thus, unless your application is a standalone Java application,
        you MUST unregister the <code>JMXConfigurator</code> instance from
        the JVM's Mbeans server. Invoking the <code>reset</code>() method
        of the appropriate <code>LoggerContext</code> will automatically
        unregister any JMXConfigurator instance. A good place to reset the
        logger context is in the <code>contextDestroyed</code>()
        method of a
        <code>javax.servlet.ServletContextListener</code>. Here is sample
        code:</p>
    
        <pre class="prettyprint source">import javax.servlet.ServletContextEvent;
    import javax.servlet.ServletContextListener;
    
    import org.slf4j.LoggerFactory;
    import ch.qos.logback.classic.LoggerContext;
    
    public class MyContextListener implements ServletContextListener {
    
      public void contextDestroyed(ServletContextEvent sce) {
        <b>LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();</b>
        <b>lc.stop();</b>
      }
    
      public void contextInitialized(ServletContextEvent sce) {
      }
    } </pre>
    
    
        <!-- ============ Multiple web-applications  ================== -->
    
        
        <h2 class="doAnchor" name="multiple"><code>JMXConfigurator</code>
        with multiple web-applications</h2>
    
        <p>If you deploy multiple web-applications in the same server,
        and if you have not overridden the default <a
        href="contextSelector.html">context selector</a>, and if you
        have placed a copy of <em>logback-*.jar</em> and
        <em>slf4j-api.jar</em> under the <em>WEB-INF/lib</em> folder of
        each web-application, then by default each <code>JMXConfigurator</code>
        instance will be registered under the same name, that is,
        "ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator". In
        other words, by default the various <code>JMXConfigurator</code>
        instances associated with the logger contexts in each of your
        web-applications will collide.
        </p>
        
        <p>To avoid such undesirable collisions, you simply <a
        href="configuration.html#contextName">set the name of your
        application's logging context</a> and <code>JMXConfigurator</code>
        will automatically use the name you have set.
        </p>
    
        <p>For example, if you deploy two web-applications named "Koala"
        and "Wombat", then you would write in Koala's logback
        configuration
        </p>
        
        <pre class="prettyprint source">&lt;configuration>
      <b>&lt;contextName>Koala&lt;/contextName></b>
      &lt;jmxConfigurator/>
      ...
    &lt;configuration></pre>
    
        <p>and in Wombat logback configuration file, you would write:</p>
    
        <pre class="prettyprint source">&lt;configuration>
      <b>&lt;contextName>Wombat&lt;/contextName></b>x
      &lt;jmxConfigurator/>
      ...
    &lt;configuration></pre>
    
        <p>In jconsole's MBeans panel, you would see two distinct
        <code>JMXConfigurator</code> instances:</p>
    
        <img src="images/chapters/jmxConfigurator/multiple.gif" alt="multiple.gif"/>   
    
        <p>You may fully control the name under which JMXConfigurator is
        registered with an MBeans server with the help of the "objectName"
        attribute of the <code>&lt;jmxConfigurator></code> element.</p>
        
        <!-- ============ JMX enabling your  server ================== -->
    
        <h3 class="doAnchor" name="jmxEnablingServer">JMX enabling your
        server</h3>
    
        <p>If your server runs with JDK 1.6 or later, your server should
        be JMX enabled by default.</p>
    
    		<p>For older JVMs, we suggest that you refer to the JMX-related
    		documentation of your web-server. Such documentation is available
    		for both <a
    		href="http://tomcat.apache.org/tomcat-6.0-doc/monitoring.html">Tomcat</a>
    		and <a
    		href="http://docs.codehaus.org/display/JETTY/JMX">Jetty</a>. In
    		this document, we briefly describe the required configuration
    		steps for Tomcat and Jetty.
    		</p>
    
        <!-- ================ Configuring Jetty ================== -->
    
    		<h4>Enabling JMX in Jetty (tested under JDK 1.5 and JDK 1.6)</h4>
    		
    		<p>The following has been tested under JDK 1.5 and 1.6.  Under JDK
    		1.6 and later, your server is JMX enabled by default and you can,
    		but do not need to, follow the steps discussed below.  Under JDK
    		1.5, adding JMX support in Jetty requires a number of additions to
    		the <em>$JETTY_HOME/etc/jetty.xml</em> configuration file. Here
    		are the elements that need to be added:
    		</p>
    
        <pre class="prettyprint source">&lt;Call id="MBeanServer" class="java.lang.management.ManagementFactory" 
          name="getPlatformMBeanServer"/>
    
    &lt;Get id="Container" name="container">
      &lt;Call name="addEventListener">
        &lt;Arg>
          &lt;New class="org.mortbay.management.MBeanContainer">
            &lt;Arg>&lt;Ref id="MBeanServer"/>&lt;/Arg>
            &lt;Call name="start" />
          &lt;/New>
        &lt;/Arg>
      &lt;/Call>
    &lt;/Get> </pre>
    
        <p>If you wish to access the MBeans exposed by Jetty via the
        <code>jconsole</code> application, then you need to start Jetty after
        having set the "com.sun.management.jmxremote" Java system
        property.
        </p>
    
        <p>For a standalone version of Jetty, this translates to: </p>
    
        
        <p class="source">java <b>-Dcom.sun.management.jmxremote</b> -jar start.jar [config files]</p>
    
        <p>And if you wish to launch Jetty as a Maven plugin, then you
        need to set the "com.sun.management.jmxremote" system property via
        the <code>MAVEN_OPTS</code> shell variable:
        </p>
    
        <p class="source"><b>MAVEN_OPTS="-Dcom.sun.management.jmxremote</b>"
    mvn jetty:run</p>
    
        <p>You can then access the MBeans exposed by Jetty as well as
        logback's <code>JMXConfigurator</code> via
        <code>jconsole</code>.</p>
    
        <img src="images/chapters/jmxConfigurator/jconsole15_jetty.gif" alt="jconsole15_jetty.gif"/>   
    
        <p>After you are connected, you should be able to access
        <code>JMXXConfigurator</code> as shown in the <a
        href="#jmxConfigurator">screenshot</a> above.</p>
    
        <h4>MX4J with Jetty (tested under JDK 1.5 and 1.6)</h4>
    
        <p>If you wish to access <code>JMXConfigurator</code> via MX4J's
        HTTP interface and assuming you have already downloaded <a
        href="http://mx4j.sourceforge.net/">MX4J</a>, you then need to
        modify the Jetty configuration file discussed previously by adding
        an instruction to set the management port.
        </p>
        
        <pre class="prettyprint source">&lt;Call id="MBeanServer"
        class="java.lang.management.ManagementFactory"
        name="getPlatformMBeanServer"/>
    
    &lt;Get id="Container" name="container">
      &lt;Call name="addEventListener">
        &lt;Arg>
          &lt;New class="org.mortbay.management.MBeanContainer">
            &lt;Arg>&lt;Ref id="MBeanServer"/>&lt;/Arg>
            <b>&lt;Set name="managementPort">8082&lt;/Set></b>
            &lt;Call name="start" />
          &lt;/New>
        &lt;/Arg>
      &lt;/Call>
    &lt;/Get> 
        </pre>
        
        <p>Moreover, <em>mx4j-tools.jar</em> needs to be added to Jetty's
        class path.
        </p>
    
        <p>If you are running Jetty as a Maven plug-in, then you need to add
        <em>mx4j-tools</em> as a dependency.</p>
    
        <pre class="prettyprint source">&lt;plugin>
      &lt;groupId>org.mortbay.jetty&lt;/groupId>
      &lt;artifactId>maven-jetty-plugin&lt;/artifactId>
      &lt;configuration>
        &lt;jettyConfig>path/to/jetty.xml&lt;/jettyConfig>
        ...
      &lt;/configuration>
      <b>&lt;dependencies>
        &lt;dependency>
          &lt;groupId>mx4j&lt;/groupId>
          &lt;artifactId>mx4j-tools&lt;/artifactId>
          &lt;version>3.0.1&lt;/version>
        &lt;/dependency>
      &lt;/dependencies></b>
    &lt;/plugin></pre>
    
    		<p>After Jetty is started with the above configuration,
    		<code>JMXConfigurator</code> will be available at the following
    		URL (search for "ch.qos.logback.classic"):
    		</p>
    
        <p class="source"><a href="http://localhost:8082/">http://localhost:8082/</a></p>
    
        <p>Below is a screen shot view of the MX4J interface.</p>
    
        <img src="images/chapters/jmxConfigurator/mx4j_jetty.gif" alt="mx4j_jetty.gif"/>   
    
    
        <!-- ================ Tomcat ================== -->
    		
    		<h4>Configuring JMX for Tomcat (tested under JDK 1.5 and 1.6)</h4>
        
        <p>If you are using JDK 1.6 and later, your server is already JMX
        enabled by default and you can, but do not need to, follow the
        steps discussed below. Under JDK 1.5, Tomcat requires the addition
        of the following lines to the
        <em>$TOMCAT_HOME/bin/catalina.bat/sh</em> shell script:
    		</p>
    		
        <p class="source">CATALINA_OPTS="-Dcom.sun.management.jmxremote"</p>
    
    		<p>Once started with these options, MBeans exposed by Tomcat as
    		well logback's <code>JMXConfigurator</code> can be accessed with
    		<code>jconsole</code> by issuing the following command in a shell:
    		</p>
        
        <p class="source">jconsole</p>
    
        <img src="images/chapters/jmxConfigurator/jconsole15_tomcat.gif" alt="jconsole15_tomcat.gif"/>   
    
        <p>After you are connected, you should be able to access
        <code>JMXXConfigurator</code> as shown in the <a
        href="#jmxConfigurator">screenshot</a> above.</p>
    
    
        <h4>MX4J with Tomcat (tested under JDK 1.5 and 1.6)</h4>
        
    		<p>You might prefer to access JMX components via a web-based
    		interface provided by MX4J.  In that case, here are the required
    		steps:
    		</p>
    		
        <p>Assuming you have already downloaded <a
        href="http://mx4j.sourceforge.net/">MX4J</a>, place the
        <em>mx4j-tools.jar</em> file under the <em>$TOMCAT_HOME/bin/</em>
        directory. Then, add the following lines to the
        <em>$TOMCAT_HOME/bin/catalina.sh</em> configuration file:
    		</p>
    
        <p class="source">&lt;!-- at the beginning of the file -->
    CATALINA_OPTS="-Dcom.sun.management.jmxremote"
    
    &lt;!-- in the "Add on extra jar files to CLASSPATH" section -->
    CLASSPATH="$CLASSPATH":"$CATALINA_HOME"/bin/mx4j-tools.jar</p>
    
    		<p>Finally, declare a new <code>Connector</code> in the
    		<em>$TOMCAT_HOME/conf/server.xml</em> file:
    		</p>
    
    		
        <pre class="prettyprint source">&lt;Connector port="0" 
      handler.list="mx"
      mx.enabled="true" 
      mx.httpHost="localhost" 
      mx.httpPort="8082" 
      protocol="AJP/1.3" /></pre>
      
      	<p>Once Tomcat is started, you should be able to find
      	JMXConfigurator by pointing your browser at the following URL
      	(search for "ch.qos.logback.classic"):
      	</p>
    
        <p class="source"><a href="http://localhost:8082">http://localhost:8082/</a></p>
    
        <p>Below is a screen shot view of the MX4J interface.</p>
    
        <img src="images/chapters/jmxConfigurator/mx4j_tomcat.gif" alt="mx4j_tomcat.gif"/>   
    
    		
    	
    	
        <script src="../templates/footer.js" type="text/javascript"></script>
      </div>
    </body>
    </html>
    ��������������������������������������������������������������������������������������������������logback_1.0.13/docs/manual/migrationFromLog4j.html��������������������������������������������������0000644�0001750�0001750�00000020115�12143164240�021760� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Chapter 13: Migration from log4j</title>
        <link rel="stylesheet" type="text/css" href="../css/common.css" />
        <link rel="stylesheet" type="text/css" href="../css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="../css/_print.css" media="print" />
        <link rel="stylesheet" type="text/css" href="../css/prettify.css" media="screen" />
      </head>
      <body onload="prettyPrint(); decorate();">
        <script type="text/javascript">prefix='../'</script>
        <script type="text/javascript" src="../js/prettify.js"></script>
        <script type="text/javascript" src="../templates/header.js"></script>
        <script type="text/javascript" src="../js/jquery-min.js"></script>
        <script type="text/javascript" src="../js/decorator.js"></script>
    
        <div id="left">
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="../templates/left.js" type="text/javascript"></script>
        </div>
        <div id="right">
          <script src="menu.js" type="text/javascript"></script>
        </div>
        <div id="content">
          
        <h1>Chapter 13: Migration from log4j</h1> 
    
        <div class="quote">
          <p><em>The more things change, the more they remain the
          same. </em></p>
          
          <p>&mdash;ALPHONSE KARR, <em>Les Gu&ecirc;pes</em></p>
        </div>
    
        <p>This chapter deals with the topic of migrating custom log4j
        components such as appenders or layouts to logback-classic.
        </p>
    
        <p>Software which merely invokes log4j client API, that is the
        <code>Logger</code> or <code>Category</code> classes in
        <code>org.apache.log4j</code> package, can be automatically
        migrated to use SLF4J via the <a
        href="http://www.slf4j.org/migrator.html">SLF4J migrator
        tool</a>. To migrate <em>log4j.property</em> files into its
        logback equivalent, you can use the <a
        href="http://logback.qos.ch/translator/">log4j.properties
        translator</a>.
        </p>
    
        <p>From a broader perspective, log4j and logback-classic are
        closely related. The core components, such as loggers, appenders
        and layouts exist in both frameworks and serve identical
        purposes. Similarly, the most important internal data-structure,
        namely <code>LoggingEvent</code>, exists in both frameworks with
        rather similar but non-identical implementations. Most notably, in
        logback-classic <code>LoggingEvent</code> implements the
        <code>ILoggingEvent</code> interface. Most of the changes required
        in migrating log4j components to logback-classic are related to
        differences in implementation of the <code>LoggingEvent</code>
        class. Rest assured, these differences are rather limited. If in
        spite of your best efforts you are unable to migrate any given
        log4j component to logback-classic, do post a question on the <a
        href="../mailinglist.html">logback-dev mailing list</a>. A logback
        developer should be able to provide guidance.
        </p>
    
        
        <h3 class="doAnchor" name="log4jLayout">Migrating a log4j layout</h3>
    
        <p>Let us begin by migrating a hypothetical and trivially simple
        log4j layout named <a
        href="../xref/chapters/migrationFromLog4j/TrivialLog4jLayout.html">TrivialLog4jLayout</a>
        which returns the message contained in a logging events as the
        formatted message. Here is the code.
        </p>
        
    
        <pre class="prettyprint source">package chapters.migrationFromLog4j;
    
    import org.apache.log4j.Layout;
    import org.apache.log4j.spi.LoggingEvent;
    
    public class TrivialLog4jLayout extends Layout {
    
      public void activateOptions() {
        // there are no options to activate
      }
    
      public String format(LoggingEvent loggingEvent) {
        return loggingEvent.getRenderedMessage();
      }
    
      public boolean ignoresThrowable() {
        return true;
      }
    }</pre>
    
        <p>The logback-classic equivalent named <a
        href="../xref/chapters/migrationFromLog4j/TrivialLogbackLayout.html">TrivialLogbackLayout</a>
        would be </p>
        
        <pre class="prettyprint source">package chapters.migrationFromLog4j;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.LayoutBase;
    
    public class TrivialLogbackLayout extends <b>LayoutBase&lt;ILoggingEvent></b> {
    
      public String <b>doLayout</b>(ILoggingEvent loggingEvent) {
        return loggingEvent.getMessage();
      }
    }    </pre>
     
       <p>As you can see, in a logback-classic layout, the formatting
       method is named <code>doLayout</code> instead of
       <code>format</code>() in log4j. The <code>ignoresThrowable</code>()
       method is not needed and has no equivalent in logback-classic. Note
       that a logback-classic layout must extend the
       <code>LayoutBase&lt;ILoggingEvent></code> class.
       </p>
    
       <p>The <code>activateOptions</code>() method merits further
       discussion. In log4j, a layout will have its
       <code>activateOptions</code>() method invoked by log4j
       configurators, that is <code>PropertyConfigurator</code> or
       <code>DOMConfigurator</code> just after all the options of the
       layout have been set. Thus, the layout will have an opportunity to
       check that its options are coherent and if so, proceed to fully
       initialize itself.</p>
    
    
       <p>In logback-classic, layouts must implement the <a
       href="../xref/ch/qos/logback/core/spi/LifeCycle.html">LifeCycle</a>
       interface which includes a method called <code>start</code>(). The
       <code>start</code>() method is the equivalent of log4j's
       <code>activateOptions</code>() method.
       </p>
    
       <h3 class="doAnchor" name="log4jAppender">Migrating a log4j
       appender</h3>
       
       <p>Migrating an appender is quite similar to migrating a
       layout. Here is a trivially simple appender called <a
       href="../xref/chapters/migrationFromLog4j/TrivialLog4jAppender.html">TrivialLog4jAppender</a>
       which writes on the console the string returned by its layout.</p>
       
        <pre class="prettyprint source">package chapters.migrationFromLog4j;
    
    import org.apache.log4j.AppenderSkeleton;
    import org.apache.log4j.spi.LoggingEvent;
    
    
    public class TrivialLog4jAppender extends AppenderSkeleton {
    
      protected void append(LoggingEvent loggingevent) {
        String s = this.layout.format(loggingevent);
        System.out.println(s);
      }
    
      public void close() {
        // nothing to do
      }
    
      public boolean requiresLayout() {
        return true;
      }
    }</pre>
    
       <p>The logback-classic equivalent named <a
       href="../xref/chapters/migrationFromLog4j/TrivialLogbackAppender.html">TrivialLogbackAppender</a>
       would be written as</p>
    
    
       <pre class="prettyprint source">package chapters.migrationFromLog4j;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.AppenderBase;
    
    public class TrivialLogbackAppender extends AppenderBase&lt;ILoggingEvent> {
    
      @Override
      public void start() {
        if (this.layout == null) {
          addError("No layout set for the appender named [" + name + "].");
          return;
        }
        super.start();
      }
    
      @Override
      protected void append(ILoggingEvent loggingevent) {
        // note that AppenderBase.doAppend will invoke this method only if
        // this appender was successfully started.
        
        String s = this.layout.doLayout(loggingevent);
        System.out.println(s);
      }
    }</pre>
    
    
       <p>Comparing the two classes, you should notice that the contents
       of the <code>append</code>() method remains unchanged. The
       <code>requiresLayout</code> method is not used in logback and can
       be removed. In logback, the <code>stop</code>() method is the
       equivalent of log4j's <code>close</code>() method. However,
       <code>AppenderBase</code> in logback-classic, contains a nop
       implementation for <code>stop</code> which is sufficient for the
       purposes of this trivial appender.
       </p>
    
    
    
      <script src="../templates/footer.js" type="text/javascript"></script>
    </div>
    </body>
    </html>
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/manual/onJoran.html�������������������������������������������������������������0000644�0001750�0001750�00000102644�12143164240�017661� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Chapter 11: Joran</title>
        <link rel="stylesheet" type="text/css" href="../css/common.css" />
        <link rel="stylesheet" type="text/css" href="../css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="../css/_print.css" media="print" />
        <link rel="stylesheet" type="text/css" href="../css/prettify.css" media="screen" />
      </head>
      <body  onload="prettyPrint(); decorate();">
        <script type="text/javascript">prefix='../'</script>
        <script type="text/javascript" src="../js/prettify.js"></script>
        <script type="text/javascript"> src="../templates/header.js"</script>
        <script type="text/javascript" src="../js/jquery-min.js"></script>
        <script type="text/javascript" src="../js/decorator.js"></script>
    
        <div id="left">
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="../templates/left.js" type="text/javascript"></script>
        </div>
        <div id="right">
          <script src="menu.js" type="text/javascript"></script>
        </div>
        <div id="content">
          
        <h1>Chapter 11: Joran</h1>
    
        <div class="quote">
          <p><em>The answer, my friend, is blowin' in the wind, The answer
          is blowin' in the wind.</em></p>
          
          <p>&mdash;BOB DYLAN, <em>The Freewheelin' Bob Dylan</em></p>
        </div>
    
        <p>Joran stands for a cold north-west wind which, every now and
        then, blows forcefully on Lake Geneva. Located right in the middle
        of Western-Europe, the surface of Lake Geneva is smaller than many
        other European lakes. However, with its average depth of 153
        meters, it is unusually deep, and happens to be, by volume, the
        largest sweet water reserve in Western-Europe.
        </p>
    
    
        <p>As apparent in previous chapters, logback relies on Joran, a
        mature, flexible and powerful configuration framework. Many of the
        capabilities offered by logback modules are only possible on
        account of Joran. This chapter focuses on Joran, its basic design
        and its salient features.
        </p>
    
        <p>Joran is actually a generic configuration system which can be
        used independently of logging. To emphasize this point, we should
        mention that the logback-core module does not have a notion of
        loggers. In that spirit, most of the examples in this chapter have
        nothing to do with loggers, appenders or layouts.
        </p>
    
        <p>The examples presented in this chapter can be found under
        <em>LOGBACK_HOME/logback-examples/src/main/java/chapters/onJoran/</em>
        folder.
        </p>
    
        <p>To install Joran, simply <a
        href="../download.html">download</a> logback and add
        <em>logback-core-1.0.13.jar</em> to your
        classpath.</p>
        
        <h2 class="doAnchor">Historical perspective</h2>
    
        <p>Reflection is a powerful feature of the Java language, making
        it possible to configure software systems declaratively. For
        example, many important properties of an EJB are configured with
        the <em>ejb.xml</em> file. While EJBs are written in Java, many of
        their properties are specified within the <em>ejb.xml</em>
        file. Similarly, logback settings can be specified in a
        configuration file, expressed in XML format. Annotations available
        in JDK 1.5 and heavily used in EJB 3.0 replace many directives
        previously found in XML files. Joran also makes use of annotations
        but at a much smaller extent. Due to the dynamic nature of logback
        configuration data (compared to EJBs) Joran's use of annotations
        is rather limited.
        </p>
    
        <p>In log4j, logback's predecessor, the
        <code>DOMConfigurator</code> class, which is part of log4j version
        1.2.x and later, could also parse configuration files written in
        XML. <code>DOMConfigurator</code> was written in a way that forced
        us, the developers, to tweak the code each time the structure of
        the configuration file changed. The modified code had to be
        recompiled and redeployed. Just as importantly, the code of the
        <code>DOMConfigurator</code> consisted of loops dealing with
        child elements containing many interspersed if/else
        statements. One could not help but notice that this particular
        code reeked of redundancy and duplication.  The <a
        href="http://jakarta.apache.org/commons/digester/">commons-digester
        project</a> had shown us that it was possible to parse XML files
        using pattern matching rules. At parse time, digester would apply
        rules that matched designated patterns. Rule classes were usually
        quite small and specialized. Consequently, they were relatively
        easy to understand and maintain.
        </p>
    
        <p>Armed with the <code>DOMConfigurator</code> experience, we
        began developing <code>Joran</code>, a powerful configuration
        framework to be used in logback. Joran was largely inspired by the
        commons-digester project. Nevertheless, it uses a slightly
        different terminology. In commons-digester, a rule can be seen as
        consisting of a pattern and a rule, as shown by the
        <code>Digester.addRule(String pattern, Rule rule)</code>
        method. We find it unnecessarily confusing to have a rule to
        consist of itself, not recursively but with a different
        meaning. In Joran, a rule consists of a pattern and an action. An
        action is invoked when a match occurs for the corresponding
        pattern. This relation between patterns and actions lies at the
        core of Joran.  Quite remarkably, one can deal with quite complex
        requirements by using simple patterns, or more precisely with
        exact matches and wildcard matches.
        </p>
    
        <h3 class="doAnchor" name="saxOrDom">SAX or DOM?</h3>
    
        <p>Due to the event-based architecture of the SAX API, a tool based
        on SAX cannot easily deal with forward references, that is,
        references to elements which are defined later than the current
        element being processed. Elements with cyclical references are
        equally problematic. More generally, the DOM API allows the user to
        perform searches on all the elements and make forward jumps.
        </p>
        
        <p>This extra flexibility initially led us to choose the DOM API
        as the underlying parsing API for Joran. After some
        experimentation, it quickly became clear that dealing with jumps
        to distant elements while parsing the DOM tree did not make sense
        when the interpretation rules were expressed in the form of
        patterns and actions. <em>Joran only needs to be given the
        elements in the XML document in a sequential, depth-first
        order.</em>
        </p>
    
        <p>Moreover, the SAX API offers element location information which
        allows Joran to display the exact line and column number where an
        error occurred. Location information comes in very handy in the
        identification of parsing problems.
        </p>
        
        <h3>Non goals</h3>
    
        <p>Given its highly dynamic nature, the Joran API is not intended
        to be used to parse very large XML documents with many thousands
        of elements.
        </p>
    
    
        <h3 class="doAnchor" name="pattern">Pattern</h3>
    
        <p>A Joran pattern is essentially a string. There are two kind of
        patterns, <em>exact</em> and <em>wildcard</em>. The pattern "a/b"
        can be used to match a <code>&lt;b></code> element nested within a
        top-level <code>&lt;a></code> element. The "a/b" pattern will not match
        any other element, hence the <em>exact</em> match designation.</p>
    
        <p>Wildcards can be used to match suffixes or prefixes. For
        example, the "*/a" pattern can be used to match any suffix ending
        with "a", that is any <code>&lt;a></code> element within an XML
        document but not any elements nested within <code>&lt;a></code>.
        The "a/*" pattern will match any element prefixed by
        <code>&lt;a></code>, that is any element nested within an
        <code>&lt;a></code> element.
        </p>
    
        <h3 class="doAnchor" name="action">Actions</h3>
        
        <p>As mentioned above, Joran parsing rules consists of the
        association of patterns. Actions extend the <a
        href="../xref/ch/qos/logback/core/joran/action/Action.html"><code>Action</code></a>
        class, consisting of the following abstract methods. Other methods
        have been omitted for brevity.
        </p>
    
    
        <pre class="prettyprint source">package ch.qos.logback.core.joran.action;
    
    import org.xml.sax.Attributes;
    import ch.qos.logback.core.joran.spi.ExecutionContext;
    
    public abstract class Action {
      /**
       * Called when the parser encounters an element matching a
       * {@link ch.qos.logback.core.joran.spi.Pattern Pattern}.
       */
      public abstract void begin(InterpretationContext ic, String name,
          Attributes attributes) throws ActionException;
    
      /**
       * Called to pass the body (as text) contained within an element.
       */
      public void body(InterpretationContext ic, String body)
          throws ActionException {
        // NOP
      }
    
      /*
       * Called when the parser encounters an endElement event matching a
       * {@link ch.qos.logback.core.joran.spi.Pattern Pattern}.
       */
      public abstract void end(InterpretationContext ic, String name)
          throws ActionException;
    }</pre>
    
       <p>Thus, every action must implement the <code>begin()</code> and
       <code>end()</code> methods. The implementation of the
       <code>body()</code> method is optional on account of the
       empty/nop implementation provided by <code>Action</code>.</p>
    
    
       <h3 class="doAnchor" name="ruleStore">RuleStore </h3>
    
       <p>As mentioned previously, the invocation of actions according to
       matching patterns is a central concept in Joran. A rule is an
       association of a pattern and an action. Rules are stored in a <a
       href="../xref/ch/qos/logback/core/joran/spi/RuleStore.html">RuleStore</a>.   
       </p>
    
       <p>As mentioned above, Joran is built on top of the SAX API. As an
       XML document is parsed, each element generates events corresponding
       to the start, body and end of each element. When a Joran
       configurator receives these events, it will attempt to find in its
       rule store an action corresponding to the <em>current
       pattern</em>. For example, the current pattern for the start, body
       or end event of element <em>B</em> nested within a top-level
       <em>A</em> element is "A/B".  The current pattern is a data
       structure maintained automatically by Joran as it receives and
       processes SAX events. </p>
    
       <p>When several rules match the current pattern, then exact
       matches override suffix matches, and suffix matches override prefix
       matches. For exact details of the implementation, please see the <a
       href="../xref/ch/qos/logback/core/joran/spi/SimpleRuleStore.html">SimpleRuleStore</a>
       class.
       </p>
       
    
       <h3 class="doAnchor" name="interpretationContext">Interpretation
       context</h3>
    
       <p>To allow various actions to collaborate, the invocation of begin
       and end methods include an interpretation context as the first
       parameter. The interpretation context includes an object stack, an
       object map, an error list and a reference to the Joran interpreter
       invoking the action. Please see the <a
       href="../xref/ch/qos/logback/core/joran/spi/InterpretationContext.html"><code>InterpretationContext</code></a>
       class for the exact list of fields contained in the interpretation
       context.
       </p>
       
       <p>Actions can collaborate together by fetching, pushing or popping
       objects from the common object stack, or by putting and fetching
       keyed objects on the common object map. Actions can report any error
       conditions by adding error items on the interpretation context's
       <code>StatusManager</code>.
       </p>
       
       <h3 class="doAnchor" name="helloWorld">Hello world</h3>
       
       <p>The first example in this chapter illustrates the minimal
       plumbing required for using Joran. The example consists of a
       trivial action called <a
       href="../xref/chapters/onJoran/helloWorld/HelloWorldAction.html">
       <code>HelloWorldAction</code></a> which prints "Hello World" on the
       console when its <code>begin()</code> method is invoked. The
       parsing of XML files is done by a configurator. For the purposes of
       this chapter, we have developed a very simple configurator called
       <a
       href="../xref/chapters/onJoran/SimpleConfigurator.html"><code>SimpleConfigurator</code></a>.
       The <a
       href="../xref/chapters/onJoran/helloWorld/HelloWorld.html"><code>HelloWorld</code></a>
       application brings all these pieces together:
       </p>
    
       <ul>
         <li>It creates a map of rules and a <code>Context</code></li>
         <li>It creates a parsing rule by associating the
         <em>hello-world</em> pattern with a corresponding
         <code>HelloWorldAction</code> instance</li>
         <li>It creates a <code>SimpleConfigutator</code>, passing it the
         aforementioned rules map</li>
         <li>It then invokes the <code>doConfigure</code> method of the
         configurator, passing the designated XML file as parameter
         </li>
         <li>As a last step, the accumulated Status message in the context,
         if any, are printed</li>
       </ul>
    
        <p>The <em>hello.xml</em> file contains one &lt;hello-world&gt;
        element, without any other nested elements. See the
        <em>logback-examples/src/main/java/chapters/onJoran/helloWorld/</em>
        folder for exact contents.
        </p>
     
        <p>Running the HelloWorld application with <em>hello.xml</em> file
        will print "Hello World" on the console.</p>
       
        <p class="command">java chapters.onJoran.helloWorld.HelloWorld src/main/java/chapters/onJoran/helloWorld/hello.xml</p>
    
        <p>You are highly encouraged to poke about in this example, by adding
        new rules on the rule store, modifying the XML document
        (hello.xml) and adding new actions.
        </p>
    
        <!-- ====================================================== -->
    
        <h3 class="doAnchor" name="calculator">Collaborating actions</h3>
       
        <p>The <em>logback-examples/src/main/java/joran/calculator/</em>
        directory includes several actions which collaborate together
        through the common object stack in order to accomplish simple
        computations.
        </p>
    
        <p>The <em>calculator1.xml</em> file contains a
        <code>computation</code> element, with a nested
        <code>literal</code> element. Here are its contents.
        </p>
    
        <em>Example 10.<span class="autoEx"/>: First calculator example
        (logback-examples/src/main/java/chapters/onJoran/calculator/calculator1.xml)</em>
    
        <em> </em>
        <pre class="prettyprint source">&lt;computation name="total">
      &lt;literal value="3"/>
    &lt;/computation></pre>
    
        <p>In the <a href="../xref/chapters/onJoran/calculator/Calculator1.html">
        <code>Calculator1</code></a> application, we declare various
        parsing rules (patterns and actions) collaborating together to
        compute a result based on the contents of an XML document. 
        </p>
    
        <p> Running <code>Calculator1</code> application with
        <em>calculator1.xml</em></p>
    
        <p class="command">java chapters.onJoran.calculator.Calculator1 src/main/java/chapters/onJoran/calculator/calculator1.xml</p>
    
        <p>will print:</p>
    
        <p class="console">The computation named [total] resulted in the value 3</p>
    
    
        <p>Parsing the <em>calculator1.xml</em> document (listed above)
        involves the following steps:
        </p>
    
        <ul>
          <li>The start event corresponding to the &lt;computation&gt;
          element translates into the current pattern
          "/computation". Since in the <a
          href="../xref/chapters/onJoran/calculator/Calculator1.html">
          <code>Calculator1</code></a> application we associated the
          pattern "/computation" with a
          <a
          href="../xref/chapters/onJoran/calculator/ComputationAction1.html">
          <code>ComputationAction1</code></a> instance, the
          <code>begin()</code> method of that
          <code>ComputationAction1</code> instance is invoked.
          </li>
    
          <li><p>The start event corresponding to the &lt;literal&gt;
          element translates into the current pattern
          "/computation/literal". Given the association of the
          "/computation/literal" pattern with a
          <a
          href="../xref/chapters/onJoran/calculator/LiteralAction.html">
          <code>LiteralAction</code></a> instance, the
          <code>begin()</code> method of that <code>LiteralAction</code>
          instance is called.</p>
          </li>
    
          <li><p>By the same token, the end event corresponding to the
          &lt;literal&gt; element triggers the invocation of the
          <code>end</code>() method of the same <code>LiteralAction</code>
          instance.</p>
          </li>
    
    
          <li><p>Similarly, the event corresponding to the end of
          &lt;computation&gt; element triggers the invocation the
          <code>end()</code> method of the <code>ComputationAction1</code>
          same instance.
          </p>
          </li>
        </ul>
    
        <p>What is interesting here is the way actions collaborate.  The
        <code>LiteralAction</code> reads a literal value and pushes it in
        the object stack maintained by the
        <code>InterpretationContext</code>. Once done, any other action
        can pop the value to read or modify it. Here, the
        <code>end()</code> method of the <code>ComputationAction1</code>
        class pops the value from the stack and prints it.
        </p>
    
        <!-- TO BE CONTINUED -->
    
        <p>The next example, <em>calculator2.xml</em> file is a bit more
        complex, but also more interesting.</p>
    
        <em>Example 10.<span class="autoEx"/>: Calculator configuration
        file
        (logback-examples/src/main/java/chapters/onJoran/calculator/calculator2.xml)</em>
      <pre class="prettyprint source">&lt;computation name="toto"&gt;
      &lt;literal value="7"/&gt;
      &lt;literal value="3"/&gt;
      &lt;add/&gt;
      &lt;literal value="3"/&gt;
      &lt;multiply/&gt;
    &lt;/computation&gt;</pre>
    
    
      <p>As in the previous example, in response to the &lt;literal&gt;
      element,the appropriate <a
      href="../xref/chapters/onJoran/calculator/LiteralAction.html">
      <code>LiteralAction</code></a> instance will push an integer,
      corresponding to the value attribute, at the top of the
      interpretation context's object stack. In this example, that is
      <em>calculator2.xml</em>, the values are 7 and 3. In response to the
      &lt;add&gt; element, the appropriate <a
      href="../xref/chapters/onJoran/calculator/AddAction.html"><code>AddAction</code></a>
      will pop two previously pushed integers, compute their sum and push
      the result, i.e. 10 (=7+3), at the top of the interpretation
      context's stack. The next literal element will cause LiteralAction
      to push an integer with value 3 at the top of the stack. In response
      to the &lt;multiply&gt; element, the appropriate <a
      href="../xref/chapters/onJoran/calculator/MultiplyAction.html"><code>MultiplyAction</code></a>
      will pop two previously pushed integers, i.e. 10 and 3, and compute
      their product.  It will push the result, i.e. 30, at the top of the
      stack. At the very end, in reponse to the end event corresponding to
      the &lt;/computation&gt; tag, the ComputationAction1 will print the
      object at the top of the stack. Thus, running:
      </p>
    
      <p class="command">java chapters.onJoran.calculator.Calculator1 src/main/java/chapters/onJoran/calculator/calculator2.xml </p>
      
      <p>will yield</p>
    
      <p class="console">The computation named [toto] resulted in the value 30 </p>
      
    
      <!--
    
    
      <p>Finally, a <em>calculator3.xml</em> is also provided, to
      demonstrate the possibility elements that contain instances of the
      same element. Here's the content of <em>calculator3.xml</em>:</p>
    
      <em>Example 10.<span class="autoEx"/>: Calculator configuration file
      (logback-examples/src/main/java/chapters/onJoran/calculator/calculator3.xml)</em>
    
    <pre class="prettyprint source">&lt;computation name="toto"&gt;
      &lt;computation&gt;
        &lt;literal value="7"/&gt;
        &lt;literal value="3"/&gt;
        &lt;add/&gt;
      &lt;/computation&gt;   
     
      &lt;literal value="3"/&gt;
      &lt;multiply/&gt;
    &lt;/computation&gt;</pre>
    
      <p>Much like the use of parentheses in an algebrical equation, the
      presence of a <code>computation</code> element nested in another is
      managed by the <a
      href="../xref/chapters/onJoran/calculator/ComputationAction2.html">
      <code>ComputationAction2</code></a> class using an internal
      stack. The well-formedness of XML will guarantee that a value saved
      by one <code>begin()</code> will be consumed only by the matching
      <code>end()</code> method.</p>
      -->
    
      <h3 class="doAnchor" name="implicit">Implicit actions</h3>
    
      <p>The rules defined thus far are called explicit actions because an
      pattern/action association could be found in the rule store for the
      current element. However, in highly extensible systems, the number
      and type of components can be so large so as to make it very tedious
      to associate an explicit action for all patterns.
      </p>
    
      <p>At the same time, even in highly extensible systems one can
      observe recurrent rules linking various parts together. Assuming we
      could identify such rules, we could process components composed of
      sub-components unknown at compilation time (of logback). For
      example, Apache Ant is capable of handling tasks which contain tags
      unknown at compile time, simply by inspecting the component for
      methods whose names start with <em>add</em>, as in
      <code>addFile</code>, or <code>addClassPath</code>.  When Ant
      encounters an embedded tag within a task, it simply instantiates an
      object that matches the signature of the task class' add method and
      attaches the resulting object to the parent.
      </p>
    
      <p>Joran supports a similar capability in the form of implicit
      actions. Joran keeps a list of implicit actions which are applied if
      no explicit pattern could match the current pattern.  However,
      applying an implicit action may not be always appropriate. Before
      executing the implicit action, Joran asks a given implicit action
      whether it is appropriate in the current situation. Only if the
      action replies in the affirmative does the Joran configurator invoke
      the (implicit) action. Note that this extra step makes it possible
      to support multiple implicit actions or possibly none, if no
      implicit action is appropriate for a given situation.
      </p>
    
      <p>You can create and register a custom implicit action as
      illustrated in the next example contained within the
      <em>logback-examples/src/main/java/chapters/onJoran/implicit</em> folder.
      </p>
    
      <p>The <a
      href="../xref/chapters/onJoran/implicit/PrintMe.html"><code>PrintMe</code></a>
      application associates an <a
      href="../xref/chapters/onJoran/implicit/NOPAction.html">
      <code>NOPAction</code></a> instance with the pattern "*/foo", that
      is any element named as "foo". As its name indicates, the
      <code>begin</code>() and <code>end</code>() methods of
      <code>NOPAction</code> are empty. The <code>PrintMe</code>
      application also registers an instance of <a
      href="../xref/chapters/onJoran/implicit/PrintMeImplicitAction.html">PrintMeImplicitAction</a>
      in its list of implicit actions. The
      <code>PrintMeImplicitAction</code> is applicable for any element
      which has a <span class="attr">printme</span> attribute set to
      true. See the <code>isApplicable()</code> method in
      <code>PrintMeImplicitAction</code>.  The <code>begin()</code>() method
      of <code>PrintMeImplicitAction</code> prints the name of the current
      element on the console.
      </p>
    
      <p>The XML document <em>implicit1.xml</em> is designed to illustrate
      how implicit actions come into play.</p>
    
      <em>Example 10.<span class="autoEx"/>: Usage of implicit rules
      (logback-examples/src/main/java/chapters/onJoran/implicit/implicit1.xml)</em>
      <pre class="prettyprint source">&lt;foo&gt;
      &lt;xyz printme="true"&gt;
        &lt;abc printme="true"/&gt;
      &lt;/xyz&gt;
    
      &lt;xyz/&gt;
    
      &lt;foo printme="true"/&gt;
    
    &lt;/foo&gt;</pre>
    
      <p>Running</p>
    
      <p class="command">java chapters.onJoran.implicit.PrintMe src/main/java/chapters/onJoran/implicit/implicit1.xml</p>
      <p>yields:</p>
    
      <p class="console">Element [xyz] asked to be printed.
    Element [abc] asked to be printed.
    20:33:43,750 |-ERROR in c.q.l.c.joran.spi.Interpreter@<b>10:9</b> - no applicable action for [xyz], current pattern is [[foo][xyz]]</p>
    
      <p>Given that <code>NOPAction</code> instance is explicitly
      associated with the "*/foo" pattern, <code>NOPAction</code>'s
      <code>begin()</code> and <code>end()</code> methods are invoked on
      &lt;foo> elements. <code>PrintMeImplicitAction</code> is never
      triggered for any of the &lt;foo&gt; elements. For other elements,
      since there are no matching explicit actions, the
      <code>isApplicable()</code> method of
      <code>PrintMeImplicitAction</code> is invoked. It will return true
      only for elements having a <span class="attr">printme</span>
      attribute set to true, namely the first &lt;xyz> element (but not
      the second) and the &lt;abc> element. The second &lt;xyz> element on
      line 10, there are no applicable actions, an internal error message
      is generated. This message is printed by the
      <code>StatusPrinter.print</code> invocation, the last statement in
      the <code>PrintMe</code> application. This explains the output shown
      above (see previous paragraph).
      </p>
    
      <h3 class="doAnchor" name="iaPractice">Implicit actions in
      practice</h3>
      
      <p>The respective Joran configurators of logback-classic and
      logback-access include just two implicit actions, namely <a
      href="../xref/ch/qos/logback/core/joran/action/NestedBasicPropertyIA.html">
      <code>NestedBasicPropertyIA</code></a> and <a
      href="../xref/ch/qos/logback/core/joran/action/NestedComplexPropertyIA.html">
      <code>NestedComplexPropertyIA</code></a>.
      </p>
    
      <p><code>NestedBasicPropertyIA</code> is applicable for any property
      whose type is a primitive type (or equivalent object type in the
      <code>java.lang</code> package), an enumeration type, or any type
      adhering to the "valueOf" convention.  Such properties are said to
      be <em>basic</em> or <em>simple</em>. A class is said to adhere to
      the "valueOf" convention if it contains a static method named
      <code>valueOf</code>() taking a <code>java.lang.String</code> as
      parameter and returning an instance of the type in question.  At
      present, the <a
      href="../xref/ch/qos/logback/classic/Level.html"><code>Level</code></a>,
      <a
      href="../xref/ch/qos/logback/core/util/Duration.html"><code>Duration</code></a>
      and <a
      href="../xref/ch/qos/logback/core/util/FileSize.html"><code>FileSize</code></a>
      classes follow this convention.
      </p>
      
      <p><code>NestedComplexPropertyIA</code> action is applicable, in the
      remaining cases where <code>NestedBasicPropertyIA</code> is not
      applicable <em>and</em> if the object at the top of the object stack
      has a setter or adder method for a property name equal to the
      current element name. Note that such properties can in turn contain
      other components. Thus, such properties are said to be
      <em>complex</em>.  In presence of a complex property, <a
      href="../xref/ch/qos/logback/core/joran/action/NestedComplexPropertyIA.html">
      <code>NestedComplexPropertyIA</code></a> will instantiate the
      appropriate class for the nested component and attach it to the
      parent component (at the top of the object stack) by using the
      setter/adder method of the parent component and the nested element's
      name. The corresponding class is specified by the <span
      class="attr">class</span> attribute of the (nested) current
      element. However, if the <span class="attr">class</span> attribute
      is missing, the class name can be deduced implicitly, if any of the
      following is true:
      </p>
    
      <ol>
        <li>there is an internal rule associating the parent object's
        property with a designated class
        </li>
        <li>the setter method contains a @DefaultClass attribute
        designating a given class</li>
    
        <li>the parameter type of the setter method is a concrete class
        possessing a public constructor
        </li>
      </ol>
    
      <h4 class="doAnchor" name="defaultClassMapping">Default class
      mapping</h4>
    
      <p>In logback-classic, there are a handful of internal rules mapping
      parent class/property name pairs to a default class. These are
      listed in the table below.</p>
    
      <table class="bodyTable">
        <tr>
          <th>Parent class </th>
          <th>property name </th>
          <th>default nested class</th>
        </tr>
    
        <tr >
          <td>ch.qos.logback.core.AppenderBase</td>
          <td>encoder</td>
          <td>ch.qos.logback.classic.encoder.PatternLayoutEncoder</td>
        </tr>
    
        <tr class="alt">
          <td>ch.qos.logback.core.UnsynchronizedAppenderBase</td>
          <td>encoder</td>
          <td>ch.qos.logback.classic.encoder.PatternLayoutEncoder</td>
        </tr>
    
          <tr >
          <td>ch.qos.logback.core.AppenderBase</td>
          <td>layout</td>
          <td>ch.qos.logback.classic.PatternLayout</td>
        </tr>
    
        <tr class="alt">
          <td>ch.qos.logback.core.UnsynchronizedAppenderBase</td>
          <td>layout</td>
          <td>ch.qos.logback.classic.PatternLayout</td>
        </tr>
    
        <tr>
          <td>ch.qos.logback.core.filter.EvaluatorFilter</td>
          <td>evaluator</td>
          <td>ch.qos.logback.classic.boolex.JaninoEventEvaluator</td>
        </tr>
      </table>
    
      <p>This list may change in future releases. Please see
      logback-classic <a
      href="../xref/ch/qos/logback/classic/joran/JoranConfigurator.html">JoranConfigurator</a>'s
      <code>addDefaultNestedComponentRegistryRules</code> method for the
      latest rules.
      </p>
    
      <p>In logback-access, the rules are very similar. In the default
      class for the nested component, the ch.qos.logback.classic package
      is replaced by ch.qos.logback.access. See logback-access <a
      href="../xref/ch/qos/logback/access/joran/JoranConfigurator.html">JoranConfigurator</a>'s
      <code>addDefaultNestedComponentRegistryRules</code> method for the
      latest rules.
      </p>
      
      <h4 class="doAnchor">Collection of properties</h4>
    
      
      <p>Note that in addition to single simple properties or single
      complex properties, logback's implicit actions support collections of
      properties, be they simple or complex. Instead of a setter method,
      the property is specified by an "adder" method.</p>
    
      <h3 class="doAnchor" name="newRule">New rules on the fly</h3>
    
      <p>Joran includes an action which allows the Joran interpreter to
      learn new rules on the fly, that is while interpreting an XML
      document.  See the
      <em>logback-examples/src/main/java/chapters/onJoran/newRule/</em> directory
      for sample code. In this package, the <a
      href="../xref/chapters/onJoran/newRule/NewRuleCalculator.html">
      <code>NewRuleCalculator</code></a> application sets up just two
      rules, one rule to process the top-most element, and a second rule
      to learn new rules. Here is the relevant code from
      <code>NewRuleCalculator</code>.
      </p>
    
      <pre class="prettyprint source">ruleMap.put(new Pattern("*/computation"), new ComputationAction1());
    <b>ruleStore.addRule(new Pattern("/computation/newRule"), new NewRuleAction());</b></pre>
    
      <p><a
      href="../xref/ch/qos/logback/core/joran/action/NewRuleAction.html"><code>NewRuleAction</code></a>,
      part of logback-core, works pretty much like the other actions.  It
      has a <code>begin()</code> and <code>end()</code> method, and is
      called each time the parser finds a <em>newRule</em> element. When
      invoked, the <code>begin()</code> method looks for <em>pattern</em>
      and <em>actionClass</em> attributes. It then instantiates the
      corresponding action class and adds the pattern/action association
      as a new rule in Joran's rule store.</p>
    
    
      <p>Here is how new rules can be declared in an xml file:</p>
    
      <pre class="prettyprint source">&lt;newRule pattern="*/computation/literal"
              actionClass="chapters.onJoran.calculator.LiteralAction"/&gt;</pre>
    
      <p>Using such newRule declarations, we can transform
      <code>NewRuleCalculator</code> to behave like the
      <code>Calculator1</code> application we saw earlier.  involving the
      calculation, could be expressed this way:</p>
    
      <em>Example 10..<span class="autoEx"/>: Configuration file using new
      rules on the fly
      (logback-examples/src/main/java/chapters/onJoran/newrule/newRule.xml)</em>
    
      <pre class="prettyprint source">&lt;computation name="toto"&gt;
      &lt;newRule pattern="*/computation/literal" 
                actionClass="chapters.onJoran.calculator.LiteralAction"/&gt;
      &lt;newRule pattern="*/computation/add" 
                actionClass="chapters.onJoran.calculator.AddAction"/&gt;
      &lt;newRule pattern="*/computation/multiply" 
                actionClass="chapters.onJoran.calculator.MultiplyAction"/&gt;
    
      &lt;computation&gt;
        &lt;literal value="7"/&gt;
        &lt;literal value="3"/&gt;
        &lt;add/&gt;
      &lt;/computation&gt;   
     
      &lt;literal value="3"/&gt;
      &lt;multiply/&gt;
    &lt;/computation&gt;</pre>
    
    
      <p class="command">java java chapters.onJoran.newRule.NewRuleCalculator src/main/java/chapters/onJoran/newRule/newRule.xml</p>
    
      <p>yields</p>
    
      <p class="console">The computation named [toto] resulted in the value 30</p>
    
      <p>which is identical to the output of the <a
      href="#calculator">original calculator example</a>.</p>
    
    
      <script src="../templates/footer.js" type="text/javascript"></script>
    </div>
    </body>
    </html>
    ��������������������������������������������������������������������������������������������logback_1.0.13/docs/manual/introduction.html��������������������������������������������������������0000644�0001750�0001750�00000025324�12143164240�020773� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Chapter 1: Introduction</title>
        <link rel="stylesheet" type="text/css" href="../css/common.css" />
        <link rel="stylesheet" type="text/css" href="../css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="../css/_print.css" media="print" />
        <link rel="stylesheet" type="text/css" href="../css/prettify.css" media="screen" />    
    
      </head>
      <body onload="prettyPrint()">
        <script type="text/javascript">prefix='../';</script>
        <script type="text/javascript" src="../js/prettify.js"></script>
        <script src="../templates/header.js" type="text/javascript"> </script>
        <div id="left">
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="../templates/left.js" type="text/javascript"></script>
        </div>
        <div id="right">
          <script src="menu.js" type="text/javascript"></script>
        </div>
        <div id="content">
    
        <h1>Chapter 1: Introduction</h1>
    
        <div class="quote">
          <p><em> The morale effects are startling. Enthusiasm jumps when
          there is a running system, even a simple one. Efforts redouble when
          the first picture from a new graphics software system appears on the
          screen, even if it is only a rectangle. One always has, at every
          stage in the process, a working system. I find that teams can grow
          much more complex entities in four months than they can
          build.</em></p>
          
          <p>&mdash;FREDERICK P. BROOKS, JR., <em>The Mythical Man-Month</em></p>
        </div>
    
    
        <script src="../templates/creative.js" type="text/javascript"></script>
    
        <h2>What is logback?</h2>
    
        <p>Logback is intended as a successor to the popular log4j
        project.  It was designed by Ceki G&#252;lc&#252;, log4j's
        founder.  It builds upon a decade of experience gained in
        designing industrial-strength logging systems. The resulting
        product, i.e. logback, is faster and has a smaller footprint than
        all existing logging systems, sometimes by a wide margin. Just as
        importantly, logback offers <a
        href="../reasonsToSwitch.html">unique and rather useful
        features</a> missing in other logging systems.
        </p>
    
        <h2>First Baby Step</h2>
    
        <script src="../templates/setup.js" type="text/javascript"></script>
        
        <a name="Requirements"></a>
        <h3>Requirements</h3>
    
        <p>Logback-classic module requires the presence of
        <em>slf4j-api.jar</em> and <em>logback-core.jar</em> in addition to
        <em>logback-classic.jar</em> on the classpath.
        </p>
    
        <p>The <em>logback-*.jar</em> files are part of the logback
        distribution whereas <em>slf4j-api-1.7.5.jar</em> ships
        with <a href="http://www.slf4j.org">SLF4J</a>, a separate project.
        </p>
    
        <p>Let us now begin experimenting with logback.</p>
    
    <em>Example 1.1: Basic template for logging (<a href="../xref/chapters/introduction/HelloWorld1.html">logback-examples/src/main/java/chapters/introduction/HelloWorld1.java</a>)</em>
    <pre class="prettyprint source">package chapters.introduction;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    public class HelloWorld1 {
    
      public static void main(String[] args) {
    
        Logger logger = LoggerFactory.getLogger("chapters.introduction.HelloWorld1");
        logger.debug("Hello world.");
    
      }
    }</pre>
    
        <p><code>HelloWorld1</code> class is defined in the
        <code>chapters.introduction</code> package. It starts by importing the <a
        href="http://slf4j.org/api/org/slf4j/Logger.html"><code>Logger</code></a>
        and <a
        href="http://slf4j.org/api/org/slf4j/LoggerFactory.html"><code>LoggerFactory</code></a>
        classes defined in the SLF4J API, specifically within the
         <code>org.slf4j</code> package.
        </p>
    
    
        <p>On the first line of the main() method, the variable named
        <code>logger</code> is assigned a <code>Logger</code> instance
        retrieved by invoking the static <code>getLogger</code> method
        from the <code>LoggerFactory</code> class.  This logger is named
        "chapters.introduction.HelloWorld1". The main method proceeds to call the
        <code>debug</code> method of this logger passing "Hello World" as
        an argument.  We say that the main method contains a logging
        statement of level DEBUG with the message "Hello world".
        </p>
    
        <p>Note that the above example does not reference any logback
        classes. In most cases, as far as logging is concerned, your
        classes will only need to import SLF4J classes. Thus, the vast
        majority, if not all, of your classes will use the SLF4J
        API and will be oblivious to the existence of logback.
        </p>
    
    
        <p>You can launch the first
        sample application, <em>chapters.introduction.HelloWorld1</em> with the command:
        </p>
        <div class="source"><pre>java chapters.introduction.HelloWorld1</pre></div>
    
        <p>Launching the <code>HelloWorld1</code> application will output
        a single line on the console. By virtue of logback's default
        configuration policy, when no default configuration file is found,
        logback will add a <code>ConsoleAppender</code> to the root
        logger.
        </p>
    
        <p class="source">20:49:07.962 [main] DEBUG chapters.introduction.HelloWorld1 - Hello world.</p>
    
        <p>Logback can report information about its internal state using a
        built-in status system. Important events occurring during logback's
        lifetime can be accessed through a component called
        <code>StatusManager</code>. For the time being, let us instruct
        logback to print its internal state by invoking the static
        <code>print()</code> method of the <code>StatusPrinter</code>
        class.
        </p>
    
    <em>Example: Printing Logger Status (<a href="../xref/chapters/introduction/HelloWorld2.html">logback-examples/src/main/java/chapters/introduction/HelloWorld2.java</a>)</em>
    <pre class="prettyprint source">package chapters.introduction;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    <b>import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.core.util.StatusPrinter;</b>
    
    public class HelloWorld2 {
    
      public static void main(String[] args) {
        Logger logger = LoggerFactory.getLogger("chapters.introduction.HelloWorld2");
        logger.debug("Hello world.");
    
        // print internal state
        <b>LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
        StatusPrinter.print(lc);</b>
      }
    }</pre>
    
    
       <p>Running the <code>HelloWorld2</code> application will produce
       the following output:</p>
    
    <div class="source longline"><pre>12:49:22.203 [main] DEBUG chapters.introduction.HelloWorld2 - Hello world.
    12:49:22,076 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
    12:49:22,078 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
    12:49:22,093 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.xml]
    12:49:22,093 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Setting up default configuration.
    </pre></div>
    
    
      <p>Logback explains that having failed to find the
      <em>logback-test.xml</em> and <em>logback.xml</em> configuration
      files (discussed later), it configured itself using its default
      policy, which is a basic <code>ConsoleAppender</code>.  An
      <code>Appender</code> is a class that can be seen as an output
      destination. Appenders exist for many different destinations
      including the console, files, Syslog, TCP Sockets, JMS and many
      more. Users can also easily create their own Appenders as
      appropriate for their specific situation.
      </p>
    
      <p>Note that in case of errors, logback will automatically print its
      internal state on the console.</p>
    
      <p>The previous examples are rather simple. Actual logging in a
      larger application would not be that different. The general pattern
      for logging statements would not change. Only the configuration
      process would be different. However, you would probably want to
      customize or configure logback according to your needs. Logback
      configuration will be covered in subsequent chapters.
      </p>
    
      <p>Note that in the above example we have instructed logback to
      print its internal state by invoking the
      <code>StatusPrinter.print()</code> method. Logback's internal status
      information can be very useful in diagnosing logback-related
      problems.
      </p>
    
      <p>Here is a list of the three required steps in order to enable
      logging in your application.
      </p>
    
      <ol> 
        <li>Configure the logback environment. You can do so in several
        more or less sophisticated ways. More on this later.</li>
    
        <li>In every class where you wish to perform logging, retrieve a
        <code>Logger</code> instance by invoking the
        <code>org.slf4j.LoggerFactory</code> class'
        <code>getLogger()</code> method, passing the current class name
        or the class itself as a parameter.</li>
        
        <li>Use this logger instance by invoking its printing methods,
        namely the debug(), info(), warn() and error() methods. This will
        produce logging output on the configured appenders.</li>
      </ol>
     
      
      <h2><a name="building" href="#building"><span
      class="anchor"/></a>Building logback</h2>
      
      <!-- 
      
       Try downloading the file manually from:
          http://java.sun.com/products/jms/docs.html
    
      Then, install it using the command:
          mvn install:install-file -DgroupId=javax.jms -DartifactId=jms \
              -Dversion=1.1 -Dpackaging=jar -Dfile=/path/to/file 
      
       -->
      
      
      <p>As its build tool, logback relies on <a
      href="http://maven.apache.org">Maven</a>, a widely-used open-source
      build tool.
      </p>
    
      <p>Once you have installed Maven, building the logback project,
      including all its modules, should be as easy as issuing a <code>mvn
      install</code> command from within the directory where you
      unarchived the logback distribution. Maven will automatically
      download the required external libraries.
      </p>
    
      <p>Logback distributions contain complete source code such that you
      can modify parts of logback library and build your own version of
      it. You may even redistribute the modified version, as long as you
      adhere to the conditions of the LGPL license or the EPL license.
      </p>
    
      <p>For building logback under an IDE, please see the <a
      href="../setup.html#ide">relevant section on the class path setup
      page</a>.</p>
      
      <script src="../templates/footer.js" type="text/javascript"></script>
    </div>
    </body>
    </html>
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/manual/mdc.html�����������������������������������������������������������������0000644�0001750�0001750�00000070746�12143164240�017025� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Chapter 8: Mapped Diagnostic Context</title>
        <link rel="stylesheet" type="text/css" href="../css/common.css" />
        <link rel="stylesheet" type="text/css" href="../css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="../css/_print.css" media="print" />
        <link rel="stylesheet" type="text/css" href="../css/prettify.css" media="screen" />
      </head>
      <body onload="prettyPrint(); decorate();">
        <script type="text/javascript">prefix='../';</script>
        <script type="text/javascript" src="../js/prettify.js"></script>
        <script type="text/javascript" src="../templates/header.js"></script>
        <script type="text/javascript" src="../js/jquery-min.js"></script>
        <script type="text/javascript" src="../js/decorator.js"></script>
    
        <div id="left">
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="../templates/left.js" type="text/javascript"></script>
        </div>
        <div id="right">
          <script src="menu.js" type="text/javascript"></script>
        </div>
        <div id="content">
          
        <h1>Chapter 8: Mapped Diagnostic Context</h1>
    
        <div class="quote">     
          <p><em>Lock the doors.</em></p>
          <p>&mdash;LEROY CAIN, Flight Director, Columbia Mission Control</p>
        </div>
        
        <script src="../templates/creative.js" type="text/javascript"></script>
        
    		<p>One of the design goals of logback is to audit and debug
    		complex distributed applications.  Most real-world distributed
    		systems need to deal with multiple clients simultaneously.  In a
    		typical multithreaded implementation of such a system, different
    		threads will handle different clients. A possible but slightly
    		discouraged approach to differentiate the logging output of one
    		client from another consists of instantiating a new and separate
    		logger for each client.  This technique promotes the proliferation
    		of loggers and may increase their management overhead.
    		</p>
    		
        <script src="../templates/setup.js" type="text/javascript"></script>
    
        
        <p>A lighter technique consists of uniquely stamping each log
       	request servicing a given client. Neil Harrison described this
       	method in the book <em>Patterns for Logging Diagnostic
       	Messages</em> in Pattern Languages of Program Design 3, edited by
       	R. Martin, D. Riehle, and F. Buschmann (Addison-Wesley,
       	1997). Logback leverages a variant of this technique included in
       	the SLF4J API: Mapped Diagnostic Contexts (MDC).
    		</p>
    		
    		<p>To uniquely stamp each request, the user puts contextual
    		information into the <code>MDC</code>, the abbreviation of Mapped
    		Diagnostic Context.  The salient parts of the MDC class are shown
    		below. Please refer to the <a
    		href="http://www.slf4j.org/api/org/slf4j/MDC.html">MDC
    		javadocs</a> for a complete list of methods.
    		</p>
    
    <pre class="prettyprint source">package org.slf4j;
    
    public class MDC {
      //Put a context value as identified by <em>key</em>
      //into the current thread's context map.
      <b>public static void put(String key, String val);</b>
    
      //Get the context identified by the <code>key</code> parameter.
      <b>public static String get(String key);</b>
    
      //Remove the context identified by the <code>key</code> parameter.
      <b>public static void remove(String key);</b>
    
      //Clear all entries in the MDC.
      <b>public static void clear();</b>
    }</pre>
    
    		<p>The <code>MDC</code> class contains only static methods.  It
    		lets the developer place information in a <em>diagnostic
    		context</em> that can be subsequently retrieved by certain logback
    		components. The <code>MDC</code> manages contextual information on
    		a <em>per thread basis</em>.  A child thread automatically
    		inherits a <em>copy</em> of the mapped diagnostic context of its
    		parent. Typically, while starting to service a new client request,
    		the developer will insert pertinent contextual information, such
    		as the client id, client's IP address, request parameters
    		etc. into the <code>MDC</code>. Logback components, if
    		appropriately configured, will automatically include this
    		information in each log entry.
    		</p>
    
        <p>Please note that MDC as implemented by logback-classic assumes
        that values are placed into the MDC with moderate frequency. </p>
    
    		<p>
    			The next application named 
    			<code><a href="../xref/chapters/mdc/SimpleMDC.html">SimpleMDC</a></code> 
    			demonstrates this basic principle.
    		</p>
    <em>Example 7.1: Basic MDC usage (<a href="../xref/chapters/mdc/SimpleMDC.html">
    logback-examples/src/main/java/chapters/mdc/SimpleMDC.java)</a></em>
    <pre class="prettyprint source">package chapters.mdc;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.slf4j.MDC;
    
    import ch.qos.logback.classic.PatternLayout;
    import ch.qos.logback.core.ConsoleAppender;
    
    public class SimpleMDC {
      static public void main(String[] args) throws Exception {
    
        // You can put values in the MDC at any time. Before anything else
        // we put the first name
        MDC.put("first", "Dorothy");
    
        [ SNIP ]
        
        Logger logger = LoggerFactory.getLogger(SimpleMDC.class);
        // We now put the last name
        MDC.put("last", "Parker");
    
        // The most beautiful two words in the English language according
        // to Dorothy Parker:
        logger.info("Check enclosed.");
        logger.debug("The most beautiful two words in English.");
    
        MDC.put("first", "Richard");
        MDC.put("last", "Nixon");
        logger.info("I am not a crook.");
        logger.info("Attributed to the former US president. 17 Nov 1973.");
      }
    
      [ SNIP ]
    
    }</pre>
    
    		<p>The main method starts by associating the value
    		<em>Dorothy</em> with the key <em>first</em> in the
    		<code>MDC</code>. You can place as many value/key associations in
    		the <code>MDC</code> as you wish.  Multiple insertions with the
    		same key will overwrite older values.  The code then proceeds to
    		configure logback.</p>
    
        <p>For the sake of conciseness, we have the omitted the code that
        configures logback with the configuration file <a
        href="http://github.com/qos-ch/logback/blob/master/logback-examples/src/main/java/chapters/mdc/simpleMDC.xml">simpleMDC.xml</a>. Here
        is the relevant section from that file.
        </p>
    
     <pre class="prettyprint source">&lt;appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> 
      &lt;layout>
        &lt;Pattern><b>%X{first} %X{last}</b> - %m%n&lt;/Pattern>
      &lt;/layout> 
    &lt;/appender></pre>
        
    
    
        <p>Note the usage of the <em>%X</em> specifier within the
        <code>PatternLayout</code> conversion pattern. The <em>%X</em>
        conversion specifier is employed twice, once for the key named
        <em>first</em> and once for the key named <em>last</em>. After
        obtaining a logger corresponding to <code>SimpleMDC.class</code>,
        the code associates the value <em>Parker</em> with the key named
        <em>last</em>.  It then invokes the logger twice with different
        messages.  The code finishes by setting the <code>MDC</code> to
        different values and issuing several logging requests. Running
        SimpleMDC yields:
    		</p>
    
    <div class="source"><pre>Dorothy Parker - Check enclosed.
    Dorothy Parker - The most beautiful two words in English.
    Richard Nixon - I am not a crook.
    Richard Nixon - Attributed to the former US president. 17 Nov 1973.</pre></div>
    
    
    		<p>The <code>SimpleMDC</code> application illustrates how logback
    		layouts, if configured appropriately, can automatically output
    		<code>MDC</code> information.  Moreover, the information placed
    		into the <code>MDC</code> can be used by multiple logger
    		invocations.
    		</p>
    		
    		<h3 class="doAnchor">Advanced Use</h3>
    		
    		<p>Mapped Diagnostic Contexts shine brightest within client server
    		architectures.  Typically, multiple clients will be served by
    		multiple threads on the server.  Although the methods in the
    		<code>MDC</code> class are static, the diagnostic context is
    		managed on a per thread basis, allowing each server thread to bear
    		a distinct <code>MDC</code> stamp. <code>MDC</code> operations
    		such as <code>put()</code> and <code>get()</code> affect only the
    		<code>MDC</code> of the <em>current</em> thread, and the children
    		of the current thread. The <code>MDC</code> in other threads
    		remain unaffected. Given that <code>MDC</code> information is
    		managed on a per thread basis, each thread will have its own copy
    		of the <code>MDC</code>.  Thus, there is no need for the developer
    		to worry about thread-safety or synchronization when programming
    		with the <code>MDC</code> because it handles these issues safely
    		and transparently.
    		</p>
    
    		<p>The next example is somewhat more advanced.  It shows how the
    		<code>MDC</code> can be used in a client-server setting.  The
    		server-side implements the <code>NumberCruncher</code> interface
    		shown in Example 7.2 below. <code>The NumberCruncher</code>
    		interface contains a single method named
    		<code>factor()</code>. Using RMI technology, the client invokes
    		the <code>factor()</code> method of the server application to
    		retrieve the distinct factors of an integer.
    		</p>
    
    <em>Example 7.2: The service interface (<a href="../xref/chapters/mdc/NumberCruncher.html">
    logback-examples/src/main/java/chapters/mdc/NumberCruncher.java)</a></em>
    <pre class="prettyprint source">package chapters.mdc;
    
    import java.rmi.Remote;
    import java.rmi.RemoteException;
    
    /**
     * NumberCruncher factors positive integers.
     */
    public interface NumberCruncher extends Remote {
      /**
       * Factor a positive integer <code>number</code> and return its
       * <em>distinct</em> factor's as an integer array.
       * */
      int[] factor(int number) throws RemoteException;
    }</pre>
    
    		<p>
    			The <code>NumberCruncherServer</code> application, listed in Example 7.3 below, 
    			implements the <code>NumberCruncher</code> interface. Its main method exports 
    			an RMI Registry on the local host that accepts requests on a well-known port.  
    		</p>
    
    <em>Example 7.3: The server side (<a href="../xref/chapters/mdc/NumberCruncherServer.html">
    logback-examples/src/main/java/chapters/mdc/NumberCruncherServer.java)</a></em>
    <pre class="prettyprint source">package chapters.mdc;
    
    import java.rmi.RemoteException;
    import java.rmi.registry.LocateRegistry;
    import java.rmi.registry.Registry;
    import java.rmi.server.UnicastRemoteObject;
    import java.util.Vector;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.slf4j.MDC;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.core.joran.spi.JoranException;
    
    
    /**
     * A simple NumberCruncher implementation that logs its progress when
     * factoring numbers. The purpose of the whole exercise is to show the
     * use of mapped diagnostic contexts in order to distinguish the log
     * output from different client requests.
     * */
    public class NumberCruncherServer extends UnicastRemoteObject
      implements NumberCruncher {
    
      private static final long serialVersionUID = 1L;
    
      static Logger logger = LoggerFactory.getLogger(NumberCruncherServer.class);
    
      public NumberCruncherServer() throws RemoteException {
      }
    
      public int[] factor(int number) throws RemoteException {
        // The client's host is an important source of information.
        try {
          <b>MDC.put("client", NumberCruncherServer.getClientHost());</b>
        } catch (java.rmi.server.ServerNotActiveException e) {
          logger.warn("Caught unexpected ServerNotActiveException.", e);
        }
    
        // The information contained within the request is another source
        // of distinctive information. It might reveal the users name,
        // date of request, request ID etc. In servlet type environments,
        // useful information is contained in the HttpRequest or in the  
        // HttpSession.
        <b>MDC.put("number", String.valueOf(number));</b>
    
        logger.info("Beginning to factor.");
    
        if (number &lt;= 0) {
          throw new IllegalArgumentException(number +
            " is not a positive integer.");
        } else if (number == 1) {
          return new int[] { 1 };
        }
    
        Vector&lt;Integer> factors = new Vector&lt;Integer>();
        int n = number;
    
        for (int i = 2; (i &lt;= n) &amp;&amp; ((i * i) &lt;= number); i++) {
          // It is bad practice to place log requests within tight loops.
          // It is done here to show interleaved log output from
          // different requests. 
          logger.debug("Trying " + i + " as a factor.");
    
          if ((n % i) == 0) {
            logger.info("Found factor " + i);
            factors.addElement(new Integer(i));
    
            do {
              n /= i;
            } while ((n % i) == 0);
          }
    
          // Placing artificial delays in tight loops will also lead to
          // sub-optimal results. :-)
          delay(100);
        }
    
        if (n != 1) {
          logger.info("Found factor " + n);
          factors.addElement(new Integer(n));
        }
    
        int len = factors.size();
    
        int[] result = new int[len];
    
        for (int i = 0; i &lt; len; i++) {
          result[i] = ((Integer) factors.elementAt(i)).intValue();
        }
    
        <b>// clean up
        MDC.remove("client");
        MDC.remove("number");</b>
    
        return result;
      }
    
      static void usage(String msg) {
        System.err.println(msg);
        System.err.println("Usage: java chapters.mdc.NumberCruncherServer configFile\n" +
          "   where configFile is a logback configuration file.");
        System.exit(1);
      }
    
      public static void delay(int millis) {
        try {
          Thread.sleep(millis);
        } catch (InterruptedException e) {
        }
      }
    
      public static void main(String[] args) {
        if (args.length != 1) {
          usage("Wrong number of arguments.");
        }
    
        String configFile = args[0];
    
        if (configFile.endsWith(".xml")) {
          try {
            LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
            JoranConfigurator configurator = new JoranConfigurator();
            configurator.setContext(lc);
            lc.reset();
            configurator.doConfigure(args[0]);
          } catch (JoranException je) {
            je.printStackTrace();
          }
        }
    
        NumberCruncherServer ncs;
    
        try {
          ncs = new NumberCruncherServer();
          logger.info("Creating registry.");
    
          Registry registry = LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
          registry.rebind("Factor", ncs);
          logger.info("NumberCruncherServer bound and ready.");
        } catch (Exception e) {
          logger.error("Could not bind NumberCruncherServer.", e);
    
          return;
        }
      }
    }</pre>
    
    		<p>The implementation of the <code>factor(int number)</code>
    		method is of particular relevance. It starts by putting the
    		client's hostname into the <code>MDC</code> under the key
    		<em>client</em>. The number to factor, as requested by the client,
    		is put into the <code>MDC</code> under the key
    		<em>number</em>. After computing the distinct factors of the
    		integer parameter, the result is returned to the client. Before
    		returning the result however, the values for the <em>client</em>
    		and <em>number</em> are cleared by calling the
    		<code>MDC.remove()</code> method. Normally, a <code>put()</code>
    		operation should be balanced by the corresponding
    		<code>remove()</code> operation. Otherwise, the <code>MDC</code>
    		will contain stale values for certain keys. We would recommend
    		that whenever possible, <code>remove()</code> operations be
    		performed within finally blocks, ensuring their invocation
    		regardless of the execution path of the code.
    		</p>	
    		
    		<p>
    			After these theoretical explanations, we are ready to run the number 
    			cruncher example. Start the server with the following command:
    		</p>
    		
    <div class="source"><pre>java chapters.mdc.NumberCruncherServer src/main/java/chapters/mdc/mdc1.xml</pre></div>
    		
    		<p>
    			The <em>mdc1.xml</em> configuration file is listed below:
    		</p>
    <em>Example 7.4: Configuration file (logback-examples/src/main/java/chapters/mdc/mdc1.xml)</em>
    <pre class="prettyprint source">&lt;configuration>
      &lt;appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        &lt;layout>
          &lt;Pattern>%-4r [%thread] %-5level <b>C:%X{client} N:%X{number}</b> - %msg%n&lt;/Pattern>
        &lt;/layout>	    
      &lt;/appender>
      
      &lt;root level="debug">
        &lt;appender-ref ref="CONSOLE"/>
      &lt;/root>  
    &lt;/configuration></pre>
    
    		<p>
    			Note the use of the <em>%X</em> conversion specifier within the 
    			<span class="option">Pattern</span> option.
    		</p>
    	
    		<p>
    			The following command starts an instance of <code>NumberCruncherClient</code> 
    			application:  	
    		</p>
    		
    <div class="source"><pre>java chapters.mdc.NumberCruncherClient <em>hostname</em></pre></div>
    
    		<p>
    			where <em>hostname</em> is the host where the 
    			<code>NumberCruncherServer</code> is running
    		</p>
    		
    		<p>
    			Executing multiple instances of the client and requesting the server to factor 
    			the numbers 129 from the first client and shortly thereafter 
    			the number 71 from the second client, the server outputs the following:
    		</p>
    		
    <div class="source"><pre>
    <b>70984 [RMI TCP Connection(4)-192.168.1.6] INFO  C:orion N:129 - Beginning to factor.</b>
    70984 [RMI TCP Connection(4)-192.168.1.6] DEBUG C:orion N:129 - Trying 2 as a factor.
    71093 [RMI TCP Connection(4)-192.168.1.6] DEBUG C:orion N:129 - Trying 3 as a factor.
    71093 [RMI TCP Connection(4)-192.168.1.6] INFO  C:orion N:129 - Found factor 3
    71187 [RMI TCP Connection(4)-192.168.1.6] DEBUG C:orion N:129 - Trying 4 as a factor.
    71297 [RMI TCP Connection(4)-192.168.1.6] DEBUG C:orion N:129 - Trying 5 as a factor.
    71390 [RMI TCP Connection(4)-192.168.1.6] DEBUG C:orion N:129 - Trying 6 as a factor.
    <b>71453 [RMI TCP Connection(5)-192.168.1.6] INFO  C:orion N:71 - Beginning to factor.</b>
    71453 [RMI TCP Connection(5)-192.168.1.6] DEBUG C:orion N:71 - Trying 2 as a factor.
    71484 [RMI TCP Connection(4)-192.168.1.6] DEBUG C:orion N:129 - Trying 7 as a factor.
    71547 [RMI TCP Connection(5)-192.168.1.6] DEBUG C:orion N:71 - Trying 3 as a factor.
    71593 [RMI TCP Connection(4)-192.168.1.6] DEBUG C:orion N:129 - Trying 8 as a factor.
    71656 [RMI TCP Connection(5)-192.168.1.6] DEBUG C:orion N:71 - Trying 4 as a factor.
    71687 [RMI TCP Connection(4)-192.168.1.6] DEBUG C:orion N:129 - Trying 9 as a factor.
    71750 [RMI TCP Connection(5)-192.168.1.6] DEBUG C:orion N:71 - Trying 5 as a factor.
    71797 [RMI TCP Connection(4)-192.168.1.6] DEBUG C:orion N:129 - Trying 10 as a factor.
    71859 [RMI TCP Connection(5)-192.168.1.6] DEBUG C:orion N:71 - Trying 6 as a factor.
    71890 [RMI TCP Connection(4)-192.168.1.6] DEBUG C:orion N:129 - Trying 11 as a factor.
    71953 [RMI TCP Connection(5)-192.168.1.6] DEBUG C:orion N:71 - Trying 7 as a factor.
    72000 [RMI TCP Connection(4)-192.168.1.6] INFO  C:orion N:129 - Found factor 43
    72062 [RMI TCP Connection(5)-192.168.1.6] DEBUG C:orion N:71 - Trying 8 as a factor.
    72156 [RMI TCP Connection(5)-192.168.1.6] INFO  C:orion N:71 - Found factor 71</pre></div>
    
    		<p>
    			The clients were run from a machine called <em>orion</em> as can be seen in 
    			the above output. Even if the server processes the requests of clients 
    			near-simultaneously in separate threads, the logging output pertaining 
    			to each client request can be distinguished by studying the output of the 
    			<code>MDC</code>. Note for example the stamp associated with <em>number</em>, 
    			i.e. the number to factor. 
    		</p>
    		
    		<p>
    			The attentive reader might have observed that the thread name could 
    			also have been used to distinguish each request. The thread name can cause 
    			confusion if the server side technology recycles threads. In that case, 
    			it may be hard to determine the boundaries of each request, that is, 
    			when a given thread finishes servicing a request and when it begins servicing the next.
    			Because the <code>MDC</code> is under the control of the application developer, 
    			<code>MDC</code> stamps do not suffer from this problem. 
    		</p>
    		
    		
    		
    		<h3 class="doAnchor" name="autoMDC">Automating access to the <code>MDC</code></h3>
    		
    		<p>As we've seen, the <code>MDC</code> is very useful when dealing
    			with multiple clients. In the case of a web application that
    			manages user authentication, one simple solution could be to set
    			the user's name in the <code>MDC</code> and remove it once the
    			user logs out. Unfortunately, it is not always possible to
    			achieve reliable results using this technique. Since
    			<code>MDC</code> manages data on a <em>per thread</em> basis, a
    			server that recycles threads might lead to false information
    			contained in the <code>MDC</code>.
    		</p>
    		
    		<p>To allow the information contained in the <code>MDC</code> to
    			be correct at all times when a request is processed, a possible
    			approach would be to store the username at the beginning of the
    			process, and remove it at the end of said process. A servlet <a
    			href="http://java.sun.com/javaee/5/docs/api/javax/servlet/Filter.html">
    			<code>Filter</code></a> comes in handy in this case.
    		</p>
    		
    		<p>Within the servlet filter's <code>doFilter</code> method, we
    		can retrieve the relevant user data through the request (or a
    		cookie therein), store it the <code>MDC</code>.  Subsequent
    		processing by other filters and servlets will automatically
    		benefit from the MDC data that was stored previously. Finally,
    		when our servlet filter regains control, we have an opportunity to
    		clean MDC data.
    		</p>
    		
    		<p>Here is an implementation of such a filter:</p>
    
    <em>Example 7.5: User servlet filter (<a href="../xref/chapters/mdc/UserServletFilter.html">
    logback-examples/src/main/java/chapters/mdc/UserServletFilter.java)</a></em>
    <pre class="prettyprint source">package chapters.mdc;
    
    import java.io.IOException;
    import java.security.Principal;
    
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;
    
    import org.slf4j.MDC;
    
    public class UserServletFilter implements Filter {
    
      private final String USER_KEY = "username";
      
      public void destroy() {
      }
    
      public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain) throws IOException, ServletException {
    
        boolean successfulRegistration = false;
    
        HttpServletRequest req = (HttpServletRequest) request;    
        Principal principal = req.getUserPrincipal();
        // Please note that we could have also used a cookie to 
        // retrieve the user name
    
        if (principal != null) {
          String username = principal.getName();
          successfulRegistration = registerUsername(username);
        } 
    
        try {
          chain.doFilter(request, response);
        } finally {
          if (successfulRegistration) {
            MDC.remove(USER_KEY);
          }
        }
      }
    
      public void init(FilterConfig arg0) throws ServletException {
      }
      
    
      /**
       * Register the user in the MDC under USER_KEY.
       * 
       * @param username
       * @return true id the user can be successfully registered
       */
      private boolean registerUsername(String username) {
        if (username != null &amp;&amp; username.trim().length() > 0) {
          MDC.put(USER_KEY, username);
          return true;
        }
        return false;
      }
    }</pre>
    
    	<p>When the filter's <code>doFilter()</code> method is called, it
    	first looks for a <code>java.security.Principal</code> object in the
    	request. This object contains the name of the currently
    	authenticated user. If a user information is found, it is registered
    	in the <code>MDC</code>.
    	</p>
    		
    	<p>Once the filter chain has completed, the filter removes the user
    		information from the <code>MDC</code>.
    	</p>
    
      <p>The approach we just outlined sets MDC data only for the duration
      of the request and only for the thread processing it. Other threads
      are unaffected. Furthermore, any given thread will contain correct
      MDC data at any point in time.</p>
    		
    
    
      <h3 class="doAnchor" name="managedThreads">MDC And Managed
      Threads</h3>
    
      <p>A copy of the mapped diagnostic context can not always be
      inherited by worker threads from the initiating thread. This is the
      case when <code>java.util.concurrent.Executors</code> is used for
      thread management. For instance, <code>newCachedThreadPool</code>
      method creates a <code>ThreadPoolExecutor</code> and like other
      thread pooling code, it has intricate thread creation logic.
      </p>
    
      <p>In such cases, it is recommended that
      <code>MDC.getCopyOfContextMap()</code> is invoked on the original
      (master) thread before submitting a task to the executor.  When the
      task runs, as its first action, it should invoke
      <code>MDC.setContextMapValues()</code> to associate the stored copy
      of the original MDC values with the new <code>Executor</code>
      managed thread.
      </p>
    
      <h3 class="doAnchor" name="mis">MDCInsertingServletFilter</h3>
    
      <p>Within web applications, it often proves helpful to know the
      hostname, request uri and user-agent associated with a given HTTP
      request. <a
      href="../xref/ch/qos/logback/classic/helpers/MDCInsertingServletFilter.html"><code>MDCInsertingServletFilter</code></a>
      inserts such data into the MDC under the following keys.
      </p>
    
      <table class="bodyTable">
        <tr>
          <th>MDC key</th>
          <th>MDC value</th>
        </tr>
    
        <tr  class="alt">
          <td><code>req.remoteHost</code></td>
          <td>as returned by the <a
          href="http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/ServletRequest.html#getRemoteHost%28%29">getRemoteHost()</a>
          method
          </td>
        </tr>
    
        <tr >
          <td><code>req.xForwardedFor</code></td>
          <td>value of the <a
          href="http://en.wikipedia.org/wiki/X-Forwarded-For">"X-Forwarded-For"</a>
          header
          </td>
        </tr>
    
        <tr class="alt">
          <td><code>req.requestURI</code></td>
          <td>
            as returned by <a
            href="http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/http/HttpServletRequest.html#getRequestURI%28%29">getRequestURI()</a>
            method
          </td>
        </tr>
    
        <tr >
          <td><code>req.requestURL</code></td>
          <td>
            as returned by <a
            href="http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/http/HttpServletRequest.html#getRequestURL%28%29">getRequestURL()</a>
            method
          </td>
        </tr>
    
        <tr class="alt">
          <td><code>req.queryString</code></td>
          <td>
            as returned by <a
            href="http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/http/HttpServletRequest.html#getQueryString%28%29">getQueryString()</a>        method
          </td>
        </tr>
    
        <tr>
          <td><code>req.userAgent</code></td>
          <td>value of the "User-Agent" header
          </td>
        </tr>
    
      </table>
    
      <p>To install <code>MDCInsertingServletFilter</code> add the
      following lines to your web-application's <em>web.xml</em> file</p>
    
      <pre class="prettyprint source">&lt;filter>
      &lt;filter-name>MDCInsertingServletFilter&lt;/filter-name>
      &lt;filter-class>
        ch.qos.logback.classic.helpers.MDCInsertingServletFilter
      &lt;/filter-class>
    &lt;/filter>
    &lt;filter-mapping>
      &lt;filter-name>MDCInsertingServletFilter&lt;/filter-name>
      &lt;url-pattern>/*&lt;/url-pattern>
    &lt;/filter-mapping> </pre>
    
      <p><b>If your web-app has multiple filters, make sure that
      <code>MDCInsertingServletFilter</code> is declared before other
      filters.</b> For example, assuming the main processing in your
      web-app is done in filter 'F', the MDC values set by
      <code>MDCInsertingServletFilter</code> will not be seen by the code
      invoked by 'F' if <code>MDCInsertingServletFilter</code> comes after
      'F'.
      </p>
    
      <p>Once the filter is installed, values corresponding to each MDC
      key will be output by the %X <a
      href="layouts.html#conversionWord">conversion word</a> according to
      the key passes as first option. For example, to print the remote
      host followed by the request URI on one line, the date followed by
      the message on the next, you would set <code>PatternLayout</code>'s
      pattern to:
      
      </p>
    
      <p class="source">%X{req.remoteHost} %X{req.requestURI}%n%d - %m%n</p>
    
      <script src="../templates/footer.js" type="text/javascript"></script>
    </div>
    </body>
    </html>
    ��������������������������logback_1.0.13/docs/manual/usingSSL.html������������������������������������������������������������0000644�0001750�0001750�00000174325�12143164240�017767� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Chapter 15: Using SSL</title>
        <link rel="stylesheet" type="text/css" href="../css/common.css" />
        <link rel="stylesheet" type="text/css" href="../css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="../css/_print.css" media="print" />
        <link rel="stylesheet" type="text/css" href="../css/prettify.css" media="screen" />    
    
      </head>
      <body onload="prettyPrint(); decorate();">
        <script type="text/javascript">prefix='../';</script>
        <script type="text/javascript" src="../js/prettify.js"></script>
        <script type="text/javascript" src="../templates/header.js"></script>
        <script type="text/javascript" src="../js/dsl.js"></script>
        <script type="text/javascript" src="../js/jquery-min.js"></script>
        <script type="text/javascript" src="../js/decorator.js"></script>
        <div id="left">      
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="../templates/left.js" type="text/javascript"></script>
        </div>    
        <div id="right">
          <script src="menu.js" type="text/javascript"></script>
        </div>
        <div id="content">    
          <h1>Chapter 15: Using SSL</h1>
          
          <div class="quote">
    
            <p><em>The whole difference between construction and creation is 
            exactly this: that a thing constructed can only be loved after it 
            is constructed; but a thing created is loved before it exists.</em></p>
            <p>&mdash;CHARLES DICKENS</p>
          </div>
    
    
          <script src="../templates/creative.js" type="text/javascript"></script>
          <!-- script src="../templates/setup.js" type="text/javascript"></script -->
    
          <p>Logback supports the use of the Secure Sockets Layer 
             (SSL) when delivering log events from a socket-based appender
             to a remote receiver.  When using an SSL-enabled appender and  
             corresponding receiver, serialized logging events are delivered 
             over a secure channel.
          </p>
          
          <h2 class="doAnchor">SSL and Component Roles</h2>
          
          <p>Logback components such as appenders and receivers may act in
          either the server role or the client role, with respect to network
          connection initiation. When acting in the server role, a logback
          component passively listens for connections from remote client
          components.  Conversely, a component acting in the client role 
          initiates a connection to remote server component.  For example, 
          an appender acting in the <em>client</em> role connects to a 
          receiver acting in the <em>server</em> role.  Or a receiver
          acting in the <em>client</em> role connects to an appender
          acting in the <em>server</em> role.</p>
          
          <p>The roles of the components are generally determined by the
          component type.  For example, an <code>SSLServerSocketAppender</code>
          is an appender component that acts in the server role, while an
          <code>SSLSocketAppender</code> is an appender component that acts
          in the client role.  Thus the developer or application administrator 
          can configure Logback components to support the desired direction
          of network connection initiation.</p>
          
          <p>The direction of connection initiation is significant in the 
          context of SSL, because in SSL a server component must possess an
          X.509 credential to identify itself to connecting clients.  A
          client component, when connecting to the server, uses the server's
          certificate to validate that the server is trusted.  The
          developer or application administrator must be aware of the 
          roles of Logback components, so as to properly configure the
          server's key store (containing the server's X.509 credential) 
          and the client's trust store (containing self-signed 
          root certificates used when validating server trust).</p>
          
          <p>When SSL is configured for <em>mutual authentication</em>, then
          both the server component and the client component must possess
          valid X.509 credentials whose trust can be asserted by their 
          respective peer.  Mutual authentication is configured in the
          server component, therefore the developer or application 
          administrator must be aware of which components are acting in 
          the server role.</p>
          
          <p>In this chapter, we use the term <em>server component</em>
          or simply <em>server</em> to refer to a Logback component such
          as an appender or receiver that is acting in the server role.  We
          use the term <em>client component</em> or simply <em>client</em>
          to refer to a component that is acting in the client role.
                
          <h2 class="doAnchor">SSL and X.509 Certificates</h2>
          
          <p>In order to use SSL-enabled Logback components, you will need an
             X.509 credential (a private key, corresponding certificate,
             and CA certification chain) to identify your components
             that act as SSL servers.  If you wish to use mutual authentication, 
             you will also need credentials for your components that 
             act as SSL clients.
          </p>      
          <p>While you can use a credential issued by a commercial
             certification authority (CA), you can also use a certificate issued
             from your own internal CA or even a self-signed certificate.  The
             following is all that is required:
          </p> 
          <ol>
            <li>The server component must be configured 
                with a key store containing the server's private key, 
                corresponding certificate, and CA certification chain
                 (if not using a self-signed certificate).
            </li>
            <li>The client component must be configured 
                with a trust store containing trusted root CA 
                certificate(s) or the server's self-signed root certificate.
            </li>
          </ol>
              
          <h2 class="doAnchor">Configuring Logback Components for SSL</h2>
          <p>The Java Secure Sockets Extension (JSSE) and Java Cryptography 
             Architecture (JCA) which is used to implement Logback's SSL
             support has many configurable options, and a pluggable provider
             framework that allows the built-in SSL and cryptographic
             capabilities of the platform to be replaced or augmented.
             SSL-enabled Logback components provide the ability to fully specify 
             all of the configurable aspects of the SSL engine and cryptographic 
             providers, to meet your unique security needs.
          </p>
          
          <h3>Basic SSL Configuration using JSSE System Properties</h3>
          <p>Fortunately, nearly all of the configurable SSL properties for
             SSL-enabled Logback components have reasonable defaults.  In 
             most cases all that is needed is the configuration of some JSSE 
             system properties.
          </p>
          
          <p>The remainder of this section describes the specific JSSE
             properties that are needed in most environments. See 
             <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#InstallationAndCustomization">
             Customizing JSSE</a> in the <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html">
             JSSE Reference Guide</a> for more information on setting JSSE
             system properties to customize JSSE.      
          </p>
    
          <p>If you're using any of Logback's SSL-enabled appender or receiver
             components that act in the server role (e.g. 
             <code>SSLServerSocketReceiver</code>, 
             <code>SSLServerSocketAppender</code>,
             or <code>SimpleSSLSocketServer</code>) you'll need to configure 
             JSSE system properties that provide the location, type, and 
             password of the key store containing a private key and 
             certificate.
          </p>
          
          <h4><a name="basicConfig.keyStore"></a>
              System Properties for Server Key Store Configuration</h4>
          <table class="bodyTable striped">
            <tr>
              <th>Property Name</th>
              <th>Description</th>
            </tr>
            <tr>
              <td><code>javax.net.ssl.keyStore</code></td>
              <td>Specifies a filesystem path to the file containing your
                  server components's private key and certificate.</td>
            </tr>
            <tr>
              <td><code>javax.net.ssl.keyStoreType</code></td>
              <td>Specifies the key store type.  If this property is not
                  specified, the platform's default type (JKS) is assumed.
              </td>
            </tr>
            <tr>
              <td><code>javax.net.ssl.keyStorePassword</code></td>
              <td>Specifies the password needed to access the key store.
              </td>
            </tr>
          </table>
    
          <p>See <a href="#Examples">Examples</a> below for examples of
             setting these system properties when starting an application
             that uses Logback's SSL-enabled server components.
          </p>
             
          <p>If your server component is using a certificate 
             that was signed by a commercial certification authority (CA), 
             <strong>you probably don't need to provide <em>any</em> SSL 
             configuration in your applications that use SSL-enabled client 
             components</strong>.  When using a commercially-signed 
             certificate for your server  component, simply setting the 
             system key store properties for JVM that runs the server 
             component is usually all that is needed.
          </p>
                   
          <p>If you are using either a self-signed server certificate
             or your server certificate was signed by a
             certification authority (CA) that is not among those whose root
             certificates are in the Java platform's default trust store
             (e.g. when your organization has its own internal certification
             authority), you will need to configure the JSSE system
             properties that provide the location, type, and password of the
             trust store containing your server's certificate or trusted
             root certificates for the certification authority (CA) that
             signed your server's certificate.  <strong>These properties will 
             need to be set in each application that utilizes an SSL-enabled
             client component</strong>.
          </p>
            
          <h4><a name="basicConfig.trustStore"></a>
              System Properties for Client Trust Store Configuration</h4>
          <table class="bodyTable striped">
            <tr>
              <th>Property Name</th>
              <th>Description</th>
            </tr>
            <tr>
              <td><code>javax.net.ssl.trustStore</code></td>
              <td>Specifies a filesystem path to the file containing your
                  server component's certificate or trusted root
                  certificate(s) for the certification authority (CA) that
                  signed the server certificate.</td>
            </tr>
            <tr>
              <td><code>javax.net.ssl.trustStoreType</code></td>
              <td>Specifies the trust store type.  If this property is not
                  specified, the platform's default type (JKS) is assumed.
              </td>
            </tr>
            <tr>
              <td><code>javax.net.ssl.trustStorePassword</code></td>
              <td>Specifies the password needed to access the trust store.
              </td>
            </tr>
          </table>
    
          <p>See <a href="#Examples">Examples</a> below for examples of
             setting these system properties when starting an application 
             that utilizes Logback's SSL-enabled client components.
          </p>         
                
          <h3 class="doAnchor"><a name="SSLConfiguration"></a>
             Advanced SSL Configuration</h3>
          <p>In certain situations, the basic SSL configuration using 
             JSSE system properties is not adequate.  For example, if you
             are using the <code>SSLServerSocketReceiver</code> component in a web
             application, you may wish to use a different credential to
             identify your logging server for your remote logging clients
             than the credential that your web server uses to identify
             itself to web clients.  You might wish to use SSL client
             authentication on your logging server to ensure that only
             authentic and authorized remote loggers can connect. Or perhaps
             your organization has strict policies regarding the SSL
             protocols and cipher suites that may be utilized on the
             organization's network.  For any of these needs, you will need
             to make use of Logback's advanced configuration options for SSL.
          </p>
          <p>When configuring a Logback component that supports SSL, you 
             specify the SSL configuration using the <code>ssl</code> 
             property in the configuration of the component.          
          </p>      
          <p>For example, if you wish to use <code>SSLServerSocketReceiver</code>
             and configure the key store properties for your logging 
             server's credential, you could use a configuration such as the 
             following.
          </p>
    
          <span class="asGroovy" onclick="return asGroovy('logback-ssl-serverKeyStore');">View as .groovy</span>
          <pre id="logback-ssl-serverKeyStore" class="prettyprint source">&lt;configuration>
    
      &lt;appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        &lt;encoder>
          &lt;pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
      
      &lt;root level="debug">
        &lt;appender-ref ref="CONSOLE" />
      &lt;/root>
    
      &lt;receiver class="ch.qos.logback.classic.net.server.SSLServerSocketReceiver">
        &lt;ssl>
          &lt;keyStore>
            &lt;location>classpath:/logging-server-keystore.jks&lt;/location>
            &lt;password>changeit&lt;/password>
          &lt;/keyStore>
        &lt;/ssl>
      &lt;/receiver> 
    
    &lt;/configuration></pre>
    
          <p>This configuration specifies the location of the key store
             as <em>logging-server-keystore.jks</em> at the root of
             the application's classpath.  You could alternatively 
             specify a <code>file:</code> URL to identify the location of
             the key store.
          </p>
          <p>If you wanted to use <code>SSLSocketAppender</code> in your
             application's Logback configuration, but did not want to change
             the application's default trust store using the JSSE
             <code>javax.net.ssl.trustStore</code> property, you could 
             configure the appender as follows.
          </p>          
    
          <span class="asGroovy" onclick="return asGroovy('logback-ssl-clientTrustStore');">View as .groovy</span>
          <pre id="logback-ssl-clientTrustStore" class="prettyprint source">&lt;configuration>
      &lt;appender name="SOCKET" class="ch.qos.logback.classic.net.SSLSocketAppender">
        &lt;ssl>
          &lt;trustStore>
            &lt;location>classpath:/logging-server-truststore.jks&lt;/location>
            &lt;password>changeit&lt;/password>
          &lt;/trustStore>
        &lt;/ssl>
      &lt;/appender>
      
      &lt;root level="debug">
        &lt;appender-ref ref="SOCKET" />
      &lt;/root>
    
    &lt;/configuration></pre>
    
          <p>This configuration specifies the location of the trust store
             as <em>logging-server-truststore.jks</em> at the root of
             the application's classpath.  You could alternatively 
             specify a <code>file:</code> URL to identify the location of
             the trust store.
          </p>
    
          <h4>SSL Configuration Properties</h4>
          
          <p>JSSE exposes a large number of configurable options, and 
             Logback's SSL support makes nearly all of them available for
             you to specify in your SSL-enabled component configuration.  
             When using XML configuration, SSL properties are introduced to 
             these components by nesting an &lt;ssl> element in the 
             component configuration.  This configuration element corresponds 
             to the 
             <a href="../xref/ch/qos/logback/core/net/ssl/SSLConfiguration.html">
             <code>SSLConfiguration</code></a> class.
          </p>
          
          <p>When configuring SSL for your components
             you need only configure those SSL properties for which the
             defaults are not adequate.  Overspecifying the SSL configuration
             is often the cause of difficult-to-diagnose problems.
          </p>
     
          <p>The following table describes the top-level SSL configuration
             properties.  Many of these properties introduce additional
             subproperties, which are described in tables that follow 
             after the top-level properties are described.
          </p>
                
          <table class="bodyTable striped">
            <tr>
              <th>Property Name</th>
              <th>Type</th>
              <th>Description</th>
            </tr>
            <tr>
              <td><span class="prop" container="ssl">keyManagerFactory</span></td>
              <td><a href="../xref/ch/qos/logback/core/net/ssl/KeyManagerFactoryFactoryBean.html">
                  <code>KeyManagerFactoryFactoryBean</code></a>
              </td>
              <td>Specifies the configuration used to create a
                  <a href="http://docs.oracle.com/javase/1.5.0/docs/api/javax/net/ssl/KeyManagerFactory.html">
                  <code>KeyManagerFactory</code></a>.  The Java platform's default 
                  factory will be used if this property is not configured.  See
                  <a href="#KeyManagerFactoryFactoryBean">Key Manager Factory
                  Configuration</a>
                  below. 
              </td>
            </tr>
            <tr>
              <td><a name="ssl.keyStore"></a><span class="prop" container="ssl">keyStore</span></td>
              <td><a href="../xref/ch/qos/logback/core/net/ssl/KeyStoreFactoryBean.html">
                  <code>KeyStoreFactoryBean</code></a>
              </td>
              <td>
                <p>Specifies the configuration used to create a
                   <a href="http://docs.oracle.com/javase/1.5.0/docs/api/java/security/KeyStore.html">
                   <code>KeyStore</code></a>.  The KeyStore created by this property
                   should contain a single X.509 credential (consisting of a 
                   private key, corresponding certificate, and CA certificate chain).
                   This credential is presented by the local SSL peer to the remote
                   SSL peer.
                </p>
                <p>When configuring an SSL client (e.g. <code>SSLSocketAppender</code>),
                   the <span class="prop" container="ssl">keyStore</span> property
                   is needed only if the remote peer is configured to require
                   client authentication. 
                </p>
                <p>When configuring an SSL server (e.g. <code>SimpleSSLSocketServer</code>)
                   the <span class="prop" container="ssl">keyStore</span> property
                   specifies the key store containing the server's credential.  If
                   this property is not configured, the JSSE's
                   <code>javax.net.ssl.keyStore</code> system property must be
                   configured to provide the location of the server's key store.
                   See <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#InstallationAndCustomization">
                   Customizing JSSE</a> in the 
                   <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html">
                   JSSE Reference Guide</a> for more information on setting JSSE
                   system properties.
                </p>
                <p>See <a href="#KeyStoreFactoryBean">Key Store Configuration</a>
                   below. 
                </p>
              </td>
            </tr>
            <tr>
              <td><span class="prop" container="ssl">parameters</span></td>
              <td><a href="../xref/ch/qos/logback/core/net/ssl/SSLParametersConfiguration.html">
                  <code>SSLParametersConfiguration</code></a></td>
              <td>Specifies various parameters used in SSL session negotiation.
                  See <a href="#SSLParametersConfiguration">SSL Parameters Configuration</a>
                  below.
              </td>
            </tr>
            <tr>
              <td><span class="prop" container="ssl">protocol</span></td>
              <td><code>String</code></td>
              <td>Specifies the SSL protocol that will be used to create an 
                  <a href="http://docs.oracle.com/javase/1.5.0/docs/api/javax/net/ssl/SSLContext.html">
                  <code>SSLContext</code></a>.
                  See the <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#AppA">
                  Standard Names</a> specification in the 
                  <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html">
                  JSSE Reference Guide</a>.  The Java platform's default protocol 
                  will be used if this property is not configured.
              </td>
            </tr>
            <tr>
              <td><span class="prop" container="ssl">provider</span></td>
              <td><code>String</code></td>
              <td>Specifies the name of the JSSE provider that will be used to
                  create an 
                  <a href="http://docs.oracle.com/javase/1.5.0/docs/api/javax/net/ssl/SSLContext.html">
                  <code>SSLContext</code></a>.  The Java platform's default JSSE 
                  provider will be used if this property is not configured.
              </td>
            </tr>
            <tr>
              <td><span class="prop" container="ssl">secureRandom</span></td>
              <td><a href="../xref/ch/qos/logback/core/net/ssl/SecureRandomFactoryBean.html">
                  <code>SecureRandomFactoryBean</code></a>
              </td>
              <td>Specifies the configuration used to create a
                  <a href="http://docs.oracle.com/javase/1.5.0/docs/api/java/security/SecureRandom.html">
                  <code>SecureRandom</code></a> &mdash; a secure random number
                  generator.  The Java platform's default generator will be used  
                  if this property is not configured.  See
                  <a href="#SecureRandomFactoryBean">Secure Random Generator
                  Configuration</a> below. 
              </td>
            </tr>
            <tr>
              <td><span class="prop" container="ssl">trustManagerFactory</span></td>
              <td><a href="../xref/ch/qos/logback/core/net/ssl/TrustManagerFactoryFactoryBean.html">
                  <code>TrustManagerFactoryFactoryBean</code></a>
              </td>
              <td>Specifies the configuration used to create a
                  <a href="http://docs.oracle.com/javase/1.5.0/docs/api/javax/net/ssl/TrustManagerFactory.html">
                  <code>TrustManagerFactory</code></a>.  The Java platform's default 
                  factory will be used if this property is not configured.  See
                  <a href="#TrustManagerFactoryFactoryBean">Trust Manager Factory</a>
                  below. 
              </td>
            </tr>
            <tr>
              <td><a name="ssl.trustStore"></a><span class="prop" container="ssl">trustStore</span></td>
              <td><a href="../xref/ch/qos/logback/core/net/ssl/KeyStoreFactoryBean.html">
                  <code>KeyStoreFactoryBean</code></a>
              </td>
              <td>
                <p>Specifies the configuration used to create a
                   <a href="http://docs.oracle.com/javase/1.5.0/docs/api/java/security/KeyStore.html">
                   <code>KeyStore</code></a> used for validating identity of the
                   remote SSL peer.  The KeyStore created by this property
                   should contain one or more <em>trust anchors</em> &mdash; self-signed
                   certificates marked as "trusted" in the keystore.  Typically,
                   the trust store contains self-signed CA certificates.  
                </p>
                <p>The trust store specified by this property overrides any trust 
                   store specified by the JSSE's <code>javax.net.ssl.trustStore</code> 
                   system property and the platform's default trust store.See <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#InstallationAndCustomization">
                   Customizing JSSE</a> in the 
                   <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html">
                   JSSE Reference Guide</a> for more information on setting JSSE
                   system properties.
                </p>
              </td>
            </tr>
          </table>
          
          <h4 class="doAnchor"><a name="KeyStoreFactoryBean"></a>
              Key Store Configuration</h4>
              
          <p>The <a href="../xref/ch/qos/logback/core/net/ssl/KeyStoreFactoryBean.html">
             <code>KeyStoreFactoryBean</code></a> specifies the 
             configuration needed to create a 
             <a href="http://docs.oracle.com/javase/1.5.0/docs/api/java/security/KeyStore.html">
             <code>KeyStore</code></a> containing X.509 credentials.  The properties
             of this factory bean can be used in the
             <a href="#ssl.keyStore"><span class="prop" container="ssl">keyStore</span></a> 
             and 
             <a href="#ssl.trustStore"><span class="prop" container="ssl">trustStore</span></a>
             properties of the <a href="#SSLConfiguration">SSL Configuration</a>.
          </p>
     
          <table class="bodyTable striped">
            <tr>
              <th>Property Name</th>
              <th>Type</th>
              <th>Description</th>
            </tr>
            <tr>
              <td><span class="prop" container="keyStore">location</span></td>
              <td><code>String</code></td>
              <td>A URL that specifies the location of the key store.  Use
                  a <code>file:</code> URL to specify the location of the
                  keystore on a filesystem.  Use a <code>classpath:</code>
                  URL to specify a keystore than can be found on the classpath.
                  If the URL doesn't specify a scheme, <code>classpath:</code>
                  is assumed.</td>
            </tr>
            <tr>
              <td><span class="prop" container="keyStore">password</span></td>
              <td><code>String</code></td>
              <td>Specifies the password needed to access the key store.</td>
            </tr>
            <tr>
              <td><span class="prop" container="keyStore">provider</span></td>
              <td><code>String</code></td>
              <td>Specifies the name of the JCA provider that will be used to
                  create a <code>KeyStore</code>.  The Java 
                  platform's default key store provider will be used if this 
                  property is not configured.
              </td>
            </tr>
            <tr>
              <td><span class="prop" container="keyStore">type</span></td>
              <td><code>String</code></td>
              <td>Specifies the <code>KeyStore</code> type.
                  See the <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/security/CryptoSpec.html#AppA">
                  Standard Names</a> specification in the 
                  <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/security/CryptoSpec.html">
                  Java Cryptography Architecture</a> specification.  The Java 
                  platform's default key store type will be used  if this property 
                  is not configured.
              </td>
            </tr>
          </table>
          
          <h4><a name="KeyManagerFactoryFactoryBean"></a>
              Key Manager Factory Configuration</h4>
              
          <p>The <a href="../xref/ch/qos/logback/core/net/ssl/KeyManagerFactoryFactoryBean.html">
             <code>KeyManagerFactoryFactoryBean</code></a> specifies the 
             configuration needed to create a 
             <a href="http://docs.oracle.com/javase/1.5.0/docs/api/javax/net/ssl/KeyManagerFactory.html">
             <code>KeyManagerFactory</code></a>.  Generally, it isn't necessary
             to explicitly configure the key manager factory, as the platform's
             default factory is adequate for most needs.
          </p>
    
          <table class="bodyTable striped">
            <tr>
              <th>Property Name</th>
              <th>Type</th>
              <th>Description</th>
            </tr>
            <tr>
              <td><span class="prop" container="keyManagerFactory">algorithm</span></td>
              <td><code>String</code></td>
              <td>Specifies the <code>KeyManagerFactory</code> algorithm name.
                  See the <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#AppA">
                  Standard Names</a> specification in the 
                  <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html">
                  JSSE Reference Guide</a>.  The Java platform's default key 
                  manager algorithm will be used if this property is not configured.
              </td>
            </tr>
            <tr>
              <td><span class="prop" container="keyManagerFactory">provider</span></td>
              <td><code>String</code></td>
              <td>Specifies the name of the JCA provider that will be used to
                  create a <code>SecureRandom</code> generator.  The Java 
                  platform's default JSSE provider will be used if this property 
                  is not configured.
              </td>
            </tr>
          </table>
    
          <h4 class="doAnchor"><a name="SecureRandomFactoryBean"></a>
              Secure Random Generator Configuration</h4>
              
          <p>The <a href="../xref/ch/qos/logback/core/net/ssl/SecureRandomFactoryBean.html">
             <code>SecureRandomFactoryBean</code></a> specifies the 
             configuration needed to create a 
             <a href="http://docs.oracle.com/javase/1.5.0/docs/api/java/security/SecureRandom.html">
             <code>SecureRandom</code></a> generator.  Generally, it isn't necessary
             to explicitly configure the secure random generator, as the platform's
             default generator is adequate for most needs.
          </p>
     
          <table class="bodyTable striped">
            <tr>
              <th>Property Name</th>
              <th>Type</th>
              <th>Description</th>
            </tr>
            <tr>
              <td><span class="prop" container="secureRandom">algorithm</span></td>
              <td><code>String</code></td>
              <td>Specifies the <code>SecureRandom</code> algorithm name.
                  See the <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/security/CryptoSpec.html#AppA">
                  Standard Names</a> specification in the 
                  <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/security/CryptoSpec.html">
                  Java Cryptography Architecture</a> specification.  The Java 
                  platform's default random number generation algorithm will be used 
                  if this property is not configured.
              </td>
            </tr>
            <tr>
              <td><span class="prop" container="secureRandom">provider</span></td>
              <td><code>String</code></td>
              <td>Specifies the name of the JCA provider that will be used to
                  create a <code>SecureRandom</code> generator.  The Java 
                  platform's default JSSE provider will be used if this property 
                  is not configured.
              </td>
            </tr>
          </table>
          
          <h4><a name="SSLParametersConfiguration"></a>
              SSL Parameters Configuration</h4>
              
          <p>The <a href="../xref/ch/qos/logback/core/net/ssl/SSLParametersConfiguration.html">
             <code>SSLParametersConfiguration</code></a> allows the customization
             of allowed SSL protocols, cipher suites, and client authentication
             options. 
          </p>
    
          <table class="bodyTable striped">
            <tr>
              <th>Property Name</th>
              <th>Type</th>
              <th>Description</th>
            </tr>
            <tr>
              <td><a name="parameters.excludedCipherSpecs"></a>
                  <span class="prop" container="parameters">excludedCipherSpecs</span></td>
              <td><code>String</code></td>
              <td>
                <p>Specifies a comma-separated list of SSL cipher spec names or
                   patterns to disable during session negotation.  This property is 
                   used to filter the cipher suites supported by the SSL engine, 
                   such that any cipher spec matched by this property is disabled.
                </p>
                <p>Each field in the comma-separated list specified for this 
                   property may be a simple string or a regular expression.
                </p>
                <p>See the <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#AppA">
                  Standard Names</a> specification in the 
                  <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html">
                  JSSE Reference Guide</a> for a list of cipher spec names.
                </p>
              </td>
            </tr>
            <tr>
              <td><a name="parameters.includedCipherSpecs"></a>
                  <span class="prop" container="parameters">includedCipherSpecs</span></td>
              <td><code>String</code></td>
              <td>
                <p>Specifies a comma-separated list of SSL cipher spec names or
                   patterns to enable during session negotation.  This property is 
                   used to filter the cipher suites supported by the SSL engine, 
                   such that only those cipher suites matched by this property are 
                   enabled.
                </p>
                <p>Each field in the comma-separated list specified for this 
                   property may be a simple string or a regular expression.
                </p>
                <p>See the <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#AppA">
                  Standard Names</a> specification in the 
                  <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html">
                  JSSE Reference Guide</a> for a list of cipher spec names.
                </p>
              </td>
            </tr>
            <tr>
              <td><a name="parameters.excludedProtocols"></a>
                  <span class="prop" container="parameters">excludedProtocols</span></td>
              <td><code>String</code></td>
              <td>
                <p>Specifies a comma-separated list of SSL protocol names or
                   patterns to disable during session negotation.  This property is 
                   used to filter the protocols supported by the SSL engine, 
                   such that any protocol matched by this property is disabled.
                </p>
                <p>Each field in the comma-separated list specified for this 
                   property may be a simple string or a regular expression.
                </p>
                <p>See the <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#AppA">
                  Standard Names</a> specification in the 
                  <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html">
                  JSSE Reference Guide</a> for a list of protocol names.
                </p>
              </td>
            </tr>
            <tr>
              <td><a name="parameters.includedProtocols"></a>
                  <span class="prop" container="parameters">includedProtocols</span></td>
              <td><code>String</code></td>
              <td>
                <p>Specifies a comma-separated list of SSL protocol names or
                   patterns to enable during session negotation.  This property is 
                   used to filter the protocols supported by the SSL engine, 
                   such that only those protocols matched by this property are 
                   enabled.
                </p>
                <p>Each field in the comma-separated list specified for this 
                   property may be a simple string or a regular expression.
                </p>
                <p>See the <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#AppA">
                  Standard Names</a> specification in the 
                  <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html">
                  JSSE Reference Guide</a> for a list of protocol names.
                </p>
              </td>
            </tr>
            <tr>
              <td><a name="parameters.needClientAuth"></a>
                  <span class="prop" container="parameters">needClientAuth</span></td>
              <td><code>boolean</code></td>
              <td>Set this property to the value <code>true</code> to 
                  configure a server to <em>require</em> a valid client
                  certificate.  This property is ignored when configured
                  for a client component such as <code>SSLSocketAppender</code>.
              </td>
            </tr>
            <tr>
              <td><a name="parameters.wantClientAuth"></a>
                  <span class="prop" container="parameters">wantClientAuth</span></td>
              <td><code>boolean</code></td>
              <td>Set this property to the value <code>true</code> to 
                  configure the server to <em>request</em> a client
                  certificate.  This property is ignored when configured
                  for a client component such as <code>SSLSocketAppender</code>.
              </td>
            </tr>
          </table>
          
          <h4><a name="TrustManagerFactoryFactoryBean"></a>
              Trust Manager Factory Configuration</h4>
              
          <p>The <a href="../xref/ch/qos/logback/core/net/ssl/TrustManagerFactoryFactoryBean.html">
             <code>TrustManagerFactoryFactoryBean</code></a> specifies the 
             configuration needed to create a 
             <a href="http://docs.oracle.com/javase/1.5.0/docs/api/javax/net/ssl/TrustManagerFactory.html">
             <code>TrustManagerFactory</code></a>.  Generally, it isn't necessary
             to explicitly configure the trust manager factory, as the platform's
             default factory is adequate for most needs.
          </p>
    
          <table class="bodyTable striped">
            <tr>
              <th>Property Name</th>
              <th>Type</th>
              <th>Description</th>
            </tr>
            <tr>
              <td><span class="prop" container="trustManagerFactory">algorithm</span></td>
              <td><code>String</code></td>
              <td>Specifies the <code>TrustManagerFactory</code> algorithm name.
                  See the <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#AppA">
                  Standard Names</a> specification in the 
                  <a href="http://docs.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html">
                  JSSE Reference Guide</a>.  The Java platform's default key 
                  manager algorithm will be used if this property is not configured.
              </td>
            </tr>
            <tr>
              <td><span class="prop" container="trustManagerFactory">provider</span></td>
              <td><code>String</code></td>
              <td>Specifies the name of the JCA provider that will be used to
                  create a <code>SecureRandom</code> generator.  The Java 
                  platform's default JSSE provider will be used if this property 
                  is not configured.
              </td>
            </tr>
          </table>
          
          <h2 class="doAnchor"><a name="Examples"></a>Examples</h2>
    
          <h3>Using JSSE System Properties</h3>
          <p>JSSE system properties can be used to specify the location and 
          password for a key store containing your server's X.509 credential,
          or to specify the location and password for a trust store 
          containing self-signed root CA certificates used by your client
          components to validate server trust.</p>
    
          <h4>Specifying the Server's Key Store</h4>
          <p>When running a server component, you need to specify the location
          and password for the key store containing the server's credential.
          One way to do this is using JSSE system properties.  The following
          example shows a command line that could be used to start the
          <code>SimpleSSLSocketServer</code> that is shipped with Logback.</p>
        
          <p class="source">java -DkeyStore=/etc/logback-server-keystore.jks \
         -DkeyStorePassword=changeit -DkeyStoreType=JKS \
         ch.qos.logback.net.SimpleSSLSocketServer 6000 /etc/logback-server-config.xml</p>
                  
          <p>Note that when using the JSSE <em>keyStore</em> system property,
          a path to the key store is specified.  When specifying the location
          in <em>logback.xml</em>, a URL for the key store is specified.</p>
          
          <p>While this example starts the standalone server application
          provided with Logback, the same system properties could be specified
          to start any application that uses an SSL-enabled Logback server
          component.
          
          <h4>Specifying the Client's Trust Store</h4>
          
          <p>When using a client component, you need to specify the location
          and password for a trust store containing root CA certificates used
          for validating server trust.  One way to do this is using JSSE
          system properties.  The following example shows a command line
          that could be used to start an application named 
          <code>com.example.MyLoggingApplication</code> that uses one or
          more of Logback's SSL-enabled client components.</p>
    
          <p class="source">java -DtrustStore=/etc/logback-client-truststore.jks \
         -DtrustStorePassword=changeit -DtrustStoreType=JKS \
         com.example.MyLoggingApplication</p>
          
          <p>Note that when using the JSSE <em>trustStore</em> system property,
          a path to the key store is specified.  When specifying the location
          in <em>logback.xml</em>, a URL for the trust store is specified.</p>
          
          <h3>Creating and Using a Self-Signed Server Component Credential</h3>
          <p>To generate a self-signed certificate, you can use the <em>keytool</em>
          utility that is shipped with the Java Runtime Environment (JRE).
          The instructions below walk through the process of creating a
          self-signed X.509 credential in a key store for your server 
          component and creating a trust store for use with your client
          components.
          </p>
          
          <h4>Creating the server component credential:</h4>
          <p>The following command will generate the self-signed client
          credential in a file named <em>server.keystore</em>.</p>
          <pre class="source">keytool -genkey -alias server -dname &quot;CN=my-logging-server&quot; \
        -keyalg RSA -validity 365 -keystore server.keystore
    Enter keystore password: &lt;Enter password of your choosing>
    Re-enter new password: &lt;Re-enter same password>
    Enter key password for &lt;my-logging-server>
    	(RETURN if same as keystore password):  &lt;Press RETURN>
    </pre>
    
          <p>The name <em>my-logging-server</em> used in the <em>dname</em>
          may be any valid name of your choosing.  You may wish to use the
          fully-qualified domain name of the server host. The
          <em>validity</em> argument specifies the number of calendar days
          from the present date until the credential expires.</p>
          
          <p>In production settings, it is especially important to choose a
          strong password for the key store containing your server credential.
          This password protects the server's private key, preventing it
          from being used by an authorized party.  Make note of the
          password, because you will need it in subsequent steps and when
          configuring your server.
          </p>
    
          <h4>Creating a trust store for client components:</h4>
          <p>For use in the configuration of your client components, the 
          server's certificate needs to be exported from the key store
          created in the previous step, and imported into a trust store.  The
          following commands will export the certificate and import it into
          a trust store named <em>server.truststore</em>.</p>
          
          <pre class="source">keytool -export -rfc -alias server -keystore server.keystore \
        -file server.crt
    Enter keystore password: &lt;Enter password you chose for in previous step>
    
    keytool -import -alias server -file server.crt -keystore server.truststore
    Enter keystore password: &lt;Enter password of your choosing>
    Re-enter new password: &lt;Re-enter same password>
    Owner: CN=my-logging-server
    Issuer: CN=my-logging-server
    Serial number: 6e7eea40
    Valid from: Sun Mar 31 07:57:29 EDT 2013 until: Mon Mar 31 07:57:29 EDT 2014
    
       ...
    
    Trust this certificate? [no]:  &lt;Enter "yes">
    </pre>
    
          <p>The first command exports the server's certificate (but not the
          server's private key) from the key store and into a file named
          <em>server.crt</em>.  The second step creates a new trust store
          named <em>server.truststore</em> containing the server certificate.
          </p>
          
          <p>In production settings, it is especially important to choose a
          strong password for the trust store that is different from the 
          password you chose of the server key store.  Make note of this
          password, because you will need it when configuring your appender
          clients.
          </p>
              
          <h4>Configuring the server component:</h4>
          <p>You will need to copy the <em>server.keystore</em> file into your 
          server application's configuration.  The key store can be placed
          with your application's classpath resources, or it may simply be
          placed somewhere on the server host's filesystem.  When specifying
          the location of the key store in the configuration, you will use
          either a <code>classpath:</code> URL or <code>file:</code> URL, as
          appropriate.  A example server configuration follows:</p>
    
          <p class="example">Example: Server Component Configuration</p>
          <pre class="prettyprint source">&lt;configuration debug="true">
      &lt;appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        &lt;encoder>
          &lt;pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
      
      &lt;root level="DEBUG">
        &lt;appender-ref ref="CONSOLE" />
      &lt;/root>
    
      &lt;server class="ch.qos.logback.classic.net.server.SSLServerSocketReceiver">
        &lt;ssl>
          &lt;keyStore>
            &lt;location>classpath:server.keystore&lt;/location>
            &lt;password>${server.keystore.password}&lt;/password>
          &lt;/keyStore>
        &lt;/ssl>
      &lt;/server>
    &lt;/configuration></pre>
          
          <p>This example assumes that the key store is located at the root
          of the application's classpath.</p>
          
          <p>Note that this configuration specifies the key store password
          using the <em>server.keystore.password</em> substitution variable.
          This approach would allow you to avoid storing the password in
          any configuration file.  For example, your application could
          prompt for this password on the console at startup, and then 
          set the <em>server.keystore.password</em> as a system property 
          using the entered password before configuring the logging system.
          </p>
          
          <h4>Configuring client components:</h4>
          <p>You will need to copy the <em>server.truststore</em> file into
          the application configuration of each application that uses an
          SSL-enabled component acting in the client mode.  The trust store 
          can be placed with your application's classpath resources, or it
          may simply be placed somewhere on the filesystem.  When specifying 
          the location of the trust store in the configuration, you will use 
          either a <code>classpath:</code> URL or <code>file:</code> URL, as
          appropriate.  A example appender client configuration follows:</p>
    
          <p class="example">Example: Appender Client Configuration</p>
    
          <pre class="prettyprint source">&lt;configuration debug="true">
      &lt;appender name="SOCKET" class="ch.qos.logback.classic.net.SSLSocketAppender">
        &lt;remoteHost>${host}&lt;/remoteHost>
        &lt;ssl>
          &lt;trustStore>
            &lt;location>classpath:server.truststore&lt;/location>
            &lt;password>${server.truststore.password}&lt;/password>
          &lt;/trustStore>
        &lt;/ssl>
      &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="SOCKET" />
      &lt;/root>
    &lt;/configuration></pre>
    
          <p>This example assumes that the trust store is located at the root
          of the application's classpath.</p>
          
          <p>Note that this configuration specifies the trust store password
          using the <em>server.truststore.password</em> substitution variable.
          This approach would allow you to avoid storing the password in
          any configuration file.  For example, your application could
          prompt for this password on the console at startup, and then 
          set the <em>server.truststore.password</em> as a system property 
          using the entered password before configuring the logging system.
          </p>
    
          <h2>Auditing the SSL Configuration</h2>
          <p>In settings where secure communications are required, it is often
          necessary to audit the configuration of components that use SSL to
          validate conformance with local security policies.  The SSL
          support in Logback addresses this need by providing detailed
          logging of SSL configuration when Logback is initialized.  You can 
          enable audit logging using the <code>debug</code> property in the
          configuration:</p>
          
          <pre class="prettyprint source">&lt;configuration debug="true">
      
      ...
      
    &lt;/configuration></pre>
    
          <p>With the debug property enabled, all of the relevant aspects of
          the resulting SSL configuration will be logged when the logging
          system is initialized.  A representative example of the information
          logged for SSL follows.</p>
          
          <p class="example">Example: SSL Configuration Audit Logging</p>
          
          <pre>06:46:31,941 |-INFO in SSLServerSocketReceiver@4ef18d37 - SSL protocol 'SSL' provider 'SunJSSE version 1.6'
    06:46:31,967 |-INFO in SSLServerSocketReceiver@4ef18d37 - key store of type 'JKS' provider 'SUN version 1.6': file:src/main/java/chapters/appenders/socket/ssl/keystore.jks
    06:46:31,967 |-INFO in SSLServerSocketReceiver@4ef18d37 - key manager algorithm 'SunX509' provider 'SunJSSE version 1.6'
    06:46:31,973 |-INFO in SSLServerSocketReceiver@4ef18d37 - secure random algorithm 'SHA1PRNG' provider 'SUN version 1.6'
    06:46:32,755 |-INFO in SSLParametersConfiguration@4a6f19d5 - enabled protocol: SSLv2Hello
    06:46:32,755 |-INFO in SSLParametersConfiguration@4a6f19d5 - enabled protocol: SSLv3
    06:46:32,755 |-INFO in SSLParametersConfiguration@4a6f19d5 - enabled protocol: TLSv1
    06:46:32,756 |-INFO in SSLParametersConfiguration@4a6f19d5 - enabled cipher suite: SSL_RSA_WITH_RC4_128_MD5
    06:46:32,756 |-INFO in SSLParametersConfiguration@4a6f19d5 - enabled cipher suite: SSL_RSA_WITH_RC4_128_SHA
    06:46:32,756 |-INFO in SSLParametersConfiguration@4a6f19d5 - enabled cipher suite: TLS_RSA_WITH_AES_256_CBC_SHA
    </pre>
    
          <p>The output shown here has been truncated for brevity's sake, 
          but would typically include the complete list of protocols, 
          providers, algorithms, and cipher suites, as well as the location
          of key store and trust store resources utilized in the configuration.
          </p>
          
          <p>While none of this audit logging is particularly sensitive,
          best practices for security would suggest that this logging should
          not remain enabled in production settings after the configuration
          has been validated.  Audit logging is disabled when the 
          <code>debug</code> property is removed or set to <code>false</code>.
          </p>
          
          <h2>Resolving SSL Exceptions</h2>
          <p>When SSL is misconfigured, it generally results in the client
             and server components being unable to negotiate an agreeable 
             session.  This problem usually manifests itself as exceptions 
             being thrown by both parties when the client attempts to connect 
             to the server.
          </p>
          <p>The content of the exception messages varies depending on whether 
             you are looking at the client's log or the server's log.  This
             is mostly due to inherent protocol limitations in error reporting
             during session negotiation.  As a consequence of this fact,
             in order to troubleshoot session negotiation problems, you will
             usually want to look at the logs of both the client and the
             server.
          </p>
          
          <h3>Server's Certificate is Not Available</h3>
          <p>When starting the server component, you
             see the following exception in the log:</p>
             
          <p><em>javax.net.ssl.SSLException: No available certificate or 
             key corresponds to the SSL cipher suites which are enabled</em>
          </p>
          
          <p>In most cases this means that you have not configured 
             the location of the key store containing the server's private 
             key and corresponding certificate.
          </p>
          
          <h4>Solution</h4>
          <p>Using either the 
             <a href="#basicConfig.keyStore">Key Store system
             properties</a> or the <a href="#ssl.keyStore">
             <span class="prop">keyStore</span></a> property of the 
             server component's <span class="prop">ssl</span> property, 
             you must specify the location and password for the key store 
             containing the server's private key and certificate.
          </p>
          
          <h3>Client Does Not Trust the Server</h3>
          <p>When the client attempts to connect to the server, you see the 
          following exception in the log:</p>
          
          <p><em>javax.net.ssl.SSLHandshakeException: 
                  sun.security.validator.ValidatorException: 
                  PKIX path building failed</em>
          </p>
          <p>This problem is the result of the server presenting a certificate
             the client does not trust.  The most common cause is that you 
             are using a self-signed server certificate (or a server 
             certificate that was signed by your organization's internal
             certification authority) and you have not configured the client
             so that it references a trust store containing the server's 
             self-signed certificate (or the trusted root certificate(s) for 
             the CA that signed your server certificate).         
          </p> 
          <p>This problem can also occur if your server certificate has
             expired or has been revoked.  If you have access to the server
             log you will likely see the following exception logged
             each time the client attempts to connect:
          </p>
          
          <p><em>javax.net.ssl.SSLHandshakeException: Received fatal alert: ...</em>
          </p>
          
          <p>The remainder of the exception message will usually provide a
             code that indicates why the client rejected the server's
             certificate.
          </p>
          <table class="bodyTable striped">
            <tr>
              <th>Code</th>
              <th>Description</th>
            </tr>
            <tr>
              <td><code>certificate_unknown</code></td>
              <td>Usually indicates that the client's trust store has not
                  been properly configured.
              </td>
            </tr>
            <tr>
              <td><code>certificate_expired</code></td>
              <td>Indicates that the server's certificate has expired and
                  needs to be replaced.
              </td>
            </tr>
            <tr>
              <td><code>certificate_revoked</code></td>
              <td>Indicates that the issuing certification authority (CA)
                  has revoked the server's certificate and the certificate
                  needs to be replaced.
              </td>
            </tr>
          </table>
            
          <h4>Solutions</h4>
          <p>If the server's log message is reporting <code>certificate_unknown</code>
             then using either the <a href="#basicConfig.trustStore">Trust Store system
             properties</a> or the <a href="#ssl.trustStore">
             <span class="prop">trustStore</span></a> property of the 
             appender component's <span class="prop">ssl</span> property, 
             you must specify the location and password for the trust 
             store containing the server's self-signed certificate or
             the issuing certificate authority's root certificate.
          </p>
    
          <p>If the server's log message is reporting 
             <code>certificate_expired</code> or <code>certificate_revoked</code> 
             the server needs a new certificate.  The new certificate 
             and associated private key needs to be placed in the key store 
             specified in the server's configuration.  And, if using 
             a self-signed server certificate, the server's certificate also
             needs to be placed in the trust store specified in the appender
             client's configuration.
          </p>
          
          <h3>Server Does Not Trust the Client</h3>
          <p>NOTE: <strong>This problem can occur only if you have explicitly 
             configured the server to request a client certificate (using 
             either the <a href="#parameters.needClientAuth"><span class="prop">needClientAuth</span></a> or 
             <a href="#parameters.wantClientAuth"><span class="prop">wantClientAuth</span></a>
             property)</strong>.
          </p>
     
          <p>When the client attempts to connect to the logging
             server, you see the following exception in the client's log:
          </p>
          
          <p><em>javax.net.ssl.SSLHandshakeException:  Received fatal 
             alert: ...</em>
          </p>
    
          <p>The remainder of the exception message will usually provide a
             code that indicates why the server rejected the client's
             certificate.
          </p>
          <table class="bodyTable striped">
            <tr>
              <th>Code</th>
              <th>Description</th>
            </tr>
            <tr>
              <td><code>certificate_unknown</code></td>
              <td>Usually indicates that the server's trust store has not
                  been properly configured.
              </td>
            </tr>
            <tr>
              <td><code>certificate_expired</code></td>
              <td>Indicates that the client's certificate has expired and
                  needs to be replaced.
              </td>
            </tr>
            <tr>
              <td><code>certificate_revoked</code></td>
              <td>Indicates that the issuing certification authority (CA)
                  has revoked the client's certificate and the certificate
                  needs to be replaced.
              </td>
            </tr>
          </table>
            
          <h4>Solutions</h4>
          <p>If the client's log message is reporting <code>bad_certificate</code>
             then using either the <a href="#basicConfig.trustStore">Trust Store system
             properties</a> or the <a href="#ssl.trustStore">
             <span class="prop">trustStore</span></a> property of the 
             server component's <span class="prop">ssl</span> property, 
             you must specify the location and password for the trust 
             store containing the client's self-signed certificate or
             the issuing certificate authority's root certificate.
          </p>
    
          <p>If the server's log message is reporting 
             <code>certificate_expired</code> or <code>certificate_revoked</code> 
             the client needs a new certificate.  The new certificate 
             and associated private key needs to be placed in the key store 
             specified in the client's configuration.  And, if using 
             a self-signed client certificate, the client's certificate also
             needs to be placed in the trust store specified in the 
             servers's configuration.
          </p>
          
          <h3>Client and Server Cannot Agree on a Protocol</h3>
          <p>NOTE: <strong>This problem usually occurs only when you are
             explicitly 
             <a href="#parameters.excludedProtocols">excluding</a> or 
             <a href="#parameters.includedProtocols">including</a> SSL 
             protocols in your configuration</strong>.
          </p>
    
          <p>When the client attempts to connect to the server, you see 
             the following exception in the log:</p>
          
          <p><em>javax.net.ssl.SSLHandshakeException:  Received fatal 
             alert: handshake_failure</em>
          </p>
          
          <p>The server's log message is usually more descriptive.  For
             example:</p>
          
          <p><em>javax.net.ssl.SSLHandshakeException: SSLv2Hello is disabled</em>
          </p>
          
          <p>Generally, this means that you have excluded a protocol from
             one of the peers and not the other.</p>
             
          <h4>Solution</h4>
          <p>Check the values specified for the 
             <a href="#parameters.excludedProtocols"><span class="prop">excludedProtocols</span></a> and
             <a href="#parameters.includedProtocols"><span class="prop">includedProtocols</span></a>
             properties on both the server and client.
          </p>
    
          <h3>Client and Server Cannot Agree on a Cipher Suite</h3>
          <p>NOTE: <strong>This problem usually occurs only when you are
             explicitly 
             <a href="#parameters.excludedCipherSuites">excluding</a> or 
             <a href="#parameters.includedCipherSuites">including</a> SSL 
             cipher suites in your configuration</strong>.
          </p>
          
          <p>When the client attempts to connect to the
             server, you see the following exception in the log:
          </p>
          
          <p><em>javax.net.ssl.SSLHandshakeException:  Received fatal 
             alert: handshake_failure</em>
          </p>
          
          <p>The server's log message is usually more descriptive:
          </p>
          
          <p><em>javax.net.ssl.SSLHandshakeException: no cipher suites in common</em>
          </p>
          
          <p>This means that you have configured the cipher suites on the
             server and client such that the intersection
             of their respective sets of enabled cipher suites is empty.</p>
          
          <h4>Solution</h4>
          <p>Check the values specified for the 
             <a href="#parameters.excludedCipherSuites"><span class="prop">excludedCipherSuites</span></a> and
             <a href="#parameters.includedCipherSuites"><span class="prop">includedCipherSuites</span></a>
             properties on both the server and client.
          </p>
             
          <script src="../templates/footer.js" type="text/javascript"></script>
    
        </div>
      </body>
    </html>�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/manual/images/������������������������������������������������������������������0000755�0001750�0001750�00000000000�12143164146�016630� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/manual/images/chapters/���������������������������������������������������������0000755�0001750�0001750�00000000000�12143164146�020441� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/manual/images/chapters/receivers/�����������������������������������������������0000755�0001750�0001750�00000000000�12203357067�022433� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/manual/images/chapters/receivers/socketReceiver.png�����������������������������0000644�0001750�0001750�00000033333�12143164146�026120� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR��t��������	pHYs����>M��6IDATx|UrQ!wTpVz~<.2n58HX'1iYd:U+qp
    *@f!%",#-_"ԩWWUw|t9uw: _z	pg&".>]	$qrn7J*!	x	/kLF -I{R!μcxœ˫dNwhqkpdAj;;;'Nu{`@I*И].D]R˒' ߡ$qgK.GfQCHh6f!m~aeτM7	ŀZwaHN?UPf&JjӘԺwԾhbF?,pj%Cp6$c'6J	.pz܅N~ǯr1BA zankɜ	,x
    `1uօm0v>pf8{
    ZP@L\GFvO-$VjIR鯔Ԑ!u'wUnP
    1R|7Tz5jhr-;P[B[6\߭w^ԒTO{<7.~ᆱrȭeom
    "TRVbfaS$X}f\GF$%>q
    @%>!ĕN&Bq�;jtk{<٥Iv,NxSt6ͰG32O©M*v	FеI---mnn6vWU%J,l%i\&$Woy3AӗIjN'dpc1sn4tB8c,Lac=U3!Cpt|b=]m MP%5@ԾGNX&{5yQٴ?ޤ}{bR#H:rV4FjAN*mhL&f1tD~PN$Zv!"#O
    Mk)|e*ғT;p'O&o%uI%ɓӚf;ZH꒪fRZAQ2¶kd4=$6T媁<.HbMJ;豋%:9w0nSqoBx8P%g\^*e}.ޥ=|c%ySk+S]]P^ë&-T>_o>wH@9dK:Kp�]%WYʕ+yx	)늗Nto#|5TPF-L,ya4/Q,	f*D2"
    ϵ^{3T]vR#4־DY_mfB8__\7"rp7JcP=%zwDB/lta
    |}=7lR]hic:$95l!wli#Χ8DpZw9^<Np򂰓9n,/sX2NͥΝ;w-i* Lq<nZ
    tRpHpȁ(v0~ƝHJk¼0=GwKwAaR\0_y4IU<<sS>0zhT_?%ΜB4UʘC{3LgzDvgE$y+̣8$){.aֿ21Rw._I=ؐ'~ĂB9n=3>
    ɭ\La]!uб{w;gܺVTy#J
    ڌ´.J_12UY3{pj|�U+DSb2x̠Af'1}Z'zbͦk7dt#B$| Yr'74|0J8_jl
    'ǵyی’L(J\+ŝ[c	p*Dl-lu>+Ld$kvuw{90:=r.cAıíņ^p/xPd,T="`֖6_f*BG25�c=~^^G6DGaat#\p2�N	PalPzD	}z	U|Q[,IlKTKJ[67|3@<_̤535-k
    2Ւ']h;ϐkOW~Eݽ}%%>lQ8aݝ&W%FE-qo(d9_1SMض?g&/P25S!Bb	x?|???ܚ6"ٙ
    |=n~,	Yhߜ3Fzj~MtT8b? ى6_ٷLl-䷲2#Q;I|j3ʝOt(0}'nVVt+L_%~;q\2W=XRih,O=Zƅdnlc@~gT찙m9;˟y=c>!/+Rڠ0[Urp|!=`!0HQH {;rg2atPX_AmY
    LMI&/Β=݊$Ž sg�|4g*ڼ|<\E36#`8ļlĦ`_%D4q^N8L5F,|&E7WGi0L`V(hx^I6K&/1l*kFJXzjt"CDa2/X=C/}[@{H6(RFQPYl7Q2$g:c󕒂)o%6ͼۓ|5l__djgUL|]+`&JO=䖛	e}'_I^[drs/-SJ`O7vYK2U5V'}KY	GC4R>|T}4%	qe#;pySN}WkT3AE_"p{\F|'E:2#ss]=q2PW')CҏMy<OXov\]_Kv
    >']*ܜi	i�VByELP:9ʡgXş)
    KYru$8ct;l4TOOȒe>E�" ~u1SSa
    B%RfQSxq9ȾƼhhWj@Qf~6
    H60b.f;2G^R72uҤI6!R;g<C$ibu2dȅ̤PY,(K:dSE@qe
    g]&_-ĪrqYOR`TH젭)ZMyT3chJuMR6 "ϔ+G0.N =;e;~^هR?y�^H@fq|L.<RY@Q	ծ&|k3i2uR?!k2fu[^,̦\!A)#Oiii(UJQhT\AU](_.uK'֨QUW-쓼K͆^YTu%ӧhHd.^x̙G}4�!d"ovWUs*?LJ2'ҧ#p]+;vuy?#~z/?Sp_LA3zazF/4TWbT &d3xU?iuz/	I5+~g&hY]LjkAP>y,6()ufB1G~;f$,u7҃l!c1WEYO_-\rdyw<s>4su}b60"J]eYѐ/U,n2@1WO^s.Fii>_A)K8䝱4;έg<絈�ɋw6nrjm5wԣ6{NsئhQt1Wחip扇G&aYKo!
    љ<Nkv�Pn5aGs;h\AGp.(r=v0hVϳEBHifmY$
    sH:wb[XgehzVG96@LPU(^q"-@TL{
    ƖR w1LEcA�}dsubUzW2K-zNu&;B5:]"W@MtxFN8^qiU#
    s_VhYh wUϹx4h|)|M(D'IY%Kg۴�5>j¦-zAhUm}kj\aV4&[lj]Aqgv\]uaj*HۆR&#+vV[ޖ5Icn$JkkIvwX'w#E*-T[]~7;6*jA}ex.Z_|9*ky̫F 5P^'^RYeʦhc^}T)\FonŅDuNf31ɗ�TK!.aTrٺcN	3ptbm
    NSNX*F\4L6Ayc/6L'Bk(Gs!IڷE4NQpGp8!oJȩF>pwbGjԈGb6и)o*H<uikQ'V"_W[~_zTV!"#u]+𒀙6P]8%o8KAuMœHAuk$ۜ&/pTW$=Pk&	T׌fڵ֭O(ϲςޖro[[Sd#.^yl{y@y,۬_S^Sdv$Uf(Ǐ/--%f&(,-o!ǽ-ﯿ/_Fp)':KDȽ5TW	BOؐԃꚡ7W:u*l$z	\v-gLEw&5G
    IG6I:l6İ!	?x<W\9rw󝒒^TT4qD~zAuk8p`޼yGӟDmԩ3f(*RocLjn_bzËÇ+ot Eٲ5l)B
    c˘HuE@$[P
    + V~uewRքhw0m33_WWvSn@ZBb֌Uues
    >_-RAvrr3]&>'o|9AZK�xsyA�wef쉀DEUA>$R[(?WWFzwVK+$Y;`h<
    ڡRյ:Gs=(UU1(S3ŷI1O+HF`.XP}FE#(1Ղ8PS�?H7 w<vA+*1*6.DүwAp	5w^.Q"NY	1WPx\XiK.᜗a~uE$JP]$k^]KKKͤ,&!{$9r-t0X]r˫z`{{*+ۅh>+n
    #+Z[77Qrr'g+֕rᑳꠂw*_S*\*olu
    uf"F
    $S
    vsNO=n1f3>jn'pBqAiT{UT}^:J,]AÛl߾=V]U
    *0T`ԥj Э\Ub_P2r`EkkM ݃d:r$+Xtܹnh6W\.P]g-S׋/fRap{<i{I8Y	l�RQ	&&metqEiii<=)UᑳBgEErŬY\]qZ*{^uRc(b:ʕ+fRaQ|=GrT&Q3p.E/G2ϛq`hfY1UdaVT<AoYˑ"ȤI>l&߱F]qH?bg?O{Ȝ6On/fKJA<-P׶)w"$bIk>$Qu.zRuqgKɸ9lE	U52bM!�8c&�To]/c5oI!HxHį˦
    o@u|;S1~ܸH4B»HL
    A)n3k+QW<o7BģGR3fR< Ӓ6z
    TEZ	#fuAf"٫$cbSjތbyj=ZԵlsf"O{̄Dհa!	A4`¤Ňqz:NNǽ\]՜|1߻L
    ATto^#H?ˋכx`dy	!i&D-{
    -?1G&\3!su%#LHBhb"x<a{8dHŤ1U1QF#)1sTfꪞw
    .n];":u?cU.ݞ:O]eոE74xɔķ#I8VqUrQ^2j!T7D680
    fOarpϏtI"c~s̲Â$䎍~RЀk׮]n9زeŋMlGx78FH$5p6gk�cæ,̓ybTwaFl!W6+VzN+1J*۽Bzۗ_z{~”o*6L6rAa@p'r6kz*aѢErKIIɟ.^HæHV'*NLQO!"ނբWxЏYq]4QY:f[lC]GG@
    �zоW�G1AsW>M ɨv)ݬ1<w̐Bj:b[iAe6>ZRJW”IVZ~81ϽQQ-=W7ԇBX@B򮮧QP.>ҥKէ+w+ܳP=U)+TOfF5SŤ
    菁f3p@l6-
    S"쐪�9X-XNL&66m*aYeqb=h%pH'	gWð`\I.NnX&zLf<
    ѣQ[`GvjA|$i*oSdvP%_eTڷP^U!F83,ߖ^qc
    .L(E>?(d[7Xl(0L&1𽅡m4bʽP::Lԕ?T^#̓jv{
    5t�8Vl33H
    �m>LwJ}|S^9%-dL"~O~O>⡫/JW74BjHeV+aD֋?U"tKiOV6TK4o�+]D]m
    9 iFؗQzjoiI:yo%bp*XwuM^%*'Bh!&J7H6S`ªH1;wh,$}W}h˓s8;s*.e]GCLf
    !oJQ aD9'l+#$yjxCafu[MGf{3�Y4.i$݄PU81yc.Uڙ2vWt|a~B
    bp%|R{Bc+CTh,;&m`a.bqtNh|#NTev[pZv	]n9B؏~El>H�bFi?_(EC^MIX
    +s`ӿŭxz$(|q᳊;Q+QW3TWD!%HJ@uEAT><In&X	+d
    }z{=fK^HP]|T%�45P05"*zCn6P]Ǐd:mEu\P]3YK#c[[SdUgV=,oE\<6twgHCyy.̲Z'IfT5ԩSy{Hs[{8aܸzݲ澙.-'k4Uq7ߗ'&p[ʥƭq-䰰W\uVIf(k@{1PTC[Kqr
    2*tؖ留gEkS)�ޚ@IQ\46I�Ô6C,s?X
    yb!HWdԀa$rO/H~rwC5-<#{3f}J
    $=5o߾y@ pM7?//WƆ;mFn{E~)-0SEA}>H-  AA,kμcUAe&d8
    A"F&|nz|c7D@㪵de]Q+1ѷdgu-溨3J6)ubPAjIZzʠ\eBkZXu}`3UW2#\C/c,E$.MvvL@㪡fV6<rqݵ]A
    pAbQ)}*ԃI	u˦^ot�hPn_`
    CC$W.Jf+
    N].)X/k|w0h\5LS審,ZFK:V$DlFIAGLՅTaShHkg9*9їXUq2GnRzU.?H0)2:2-}G&XAE%ȕz`ՃvHDи2Cz`H<#qVQUǑTBRGb Y1uJư6#D/+ XLN}A3E#3>ܹsv#Ӎ+wqǧ~j&'Pl~A`ҤIF곖u?+WBxN)p*G:
    0`*źuW97Bbl6…y3D<%;)W(D2׸\ҥKfV9j[pZGNXE+BypL
    FŜ	_ݎ8ʆwG2n{G5L.Φj-[ъ/R2Ը>}LJ잪b]k*(}*+Zc!
    'T)MEN.drrr^~<USq,A{HLz=Ç	Zje
    Quhގn+FAĸxСCy睉'ZQ͓EՎul7g\f #/<x,%kJ eE'kf8ARdqMd#I�*H4ƵsɁ@`ԨQf ֓Mk[[۴i>c@$-0˚̀/L,2L,
    �D Ց	�RC EHv+߆7q&+qbMXGͤ0=tW5I/3,祟?AQ=cCkIy˨F@$M欇LA$uui^ޤZ  H<}7,~j(OJN)i  Hl~V+LA"uqgO־\� -+Ra\/iC{`B~;Vú39׏ظӜog"I{nXfrb5GѲ"6©w`Jh\vԴi?3AAm)\셥be\в"66υ6XLAzđh:۲OApк
    J2F`qjmӦzK'OP b%kdnF
    ,0~\u罧4ukgV5A*&͢T==pxLm IJ({-?/ջw^7P b
    ']4H:ƸSy~~q8 #8
    >Om/9 2IW[D&]wݾ}Lb&n<;$$uXf\cw1xl5_?Gev)wи"/J~/8pK̮@UXX|@0_
    '7]Osp505!inO]8ѩOQ{<(%H/6'''M
    8L3~ԚʇCDl&ih?}�?<tqW?nM5z	׳gK+O
    WY b݅oŒ~B؋iƖ9�XbcX{Kwus	͛7ກ/SJziN]Nl	$^m|aƘH.bY`xe&oq`4}	0ׄvB{*tDӮ|gokюb%s~@t1OH@=Wt,-!WE ?aIGq!-$(--ݹ`)c=e]8WpǦ`ľ9I^[[[}_MCcBzPl7:4THBKO1'XiU:&;F$&8B-PN"F]փM
    -%D42Q즯_iCߩ`L&b"Q:l=*;ϽQ:vV0dHtj8d{$K}IȆ6
    DӠVDMBJ=G8G4$窱U'5Pz0()
    (QpuXxw%P"muvƣME�~yC_|ȑ#]q]y^%.ON&G�fBqrpJTG%'R+
    GUUd�Zm*13]*d]dV@+|z 9QFFTQ)Mc g4vJnD.$1	=@O1F	!
    k=>b&cO#iFl/#`07Z-H_`’qTBiua%;S쾽hϊkڸk^�R	Mx`/Y_z;
    LLHRUahnK6!°y
    ekI&>,F8�z魒Ln~SN=^zUN`lP;TQ%6zjO6Z#zxTroMeK i9;7χH@VPy;"cu*_>9;m7ZzGŬSTO&LT3~\逞h	p#
    CU>KLxQ֊^aʓYq+n[ i[[?xO&%IU	9${T!>vj	WjZVf`u+(	4(۵5Nk-A7L^XSZBאtʿM3N,Qյ[q#S5ߘeOJսk2ǁ1D>L8&�vR>oҋ=ڧC{o/`3w.:JBNiDi}؁$(/@[o-x}s;=}g^W|~
    7
    1ELJ)^({J6䨙G4_#*hI:/c.@kEԊ2'%{f.5ᣄ|W\`SWC#M,c6>L\@ߠ3 k&V)VHGU^J<XF7* n6+@
    0 ak8Z, #yDG\+AP2&sClOZ�݊	":
    8D=
    z
    s7⡫]9n9D9E&I'GRKVGWKˋtq~	R|!GsԠd$%ƴW$r3T\@:�
    ZO#ަ]b%rv:
    hi
    ]5z'k%7
    %a*b5y%,f/DXi26v8ԯ- iF@xic!bLE_f3盯/ڲ*QѤA3	o#]u,pL
    DXLx/7O1m"FUA>5̬kAA5Ě^K~2VG#ݠqEĀ^zLAqEAA  AT&2hР~ARWbe5Dl6d1h\$wUJ
    8ɓ 4M`WA4pYdY5͢"qEAA  A,㯿ڵk3Y3-f@ 	LɁ=Uƕ5xAcoM*
    dPaɈ6ܽ@`Ӷ{jzA@ 1ΔmQY5Dmo]驿O=5_SN͎nhi-ԂΪ!FS^
    h\Ĝ̲=™Qۢt4vۨywi%wa{<ӱ,S+H aA 7n]9[NY v/;.4isP(xH^fwŎ/*@UF~	W=uΝ;RhniwRrU>F8Y%N9 4b
    G0\s54qAA`LAT`Abի�dbAd1|p
    'ү@ H߿>8~S3gȾ_|顲cE3h\	={>|ʕ+7tS~~DG}tf A2Ə?zqƕ[F>N<__ַL'ZPI4ȣ2Onnn&F>.]_!_Oo@X{7lwygQQ>S[!b|
    ����IENDB`�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/manual/images/chapters/receivers/serverSocketReceiver.png�����������������������0000644�0001750�0001750�00000032623�12143164146�027310� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR��q�����T3IR���	pHYs����]L`��5EIDATx
    |Tՙjh2kIDo2RdE +,,).X0#8E!)G	K&,Yd3S:PJ-`i{s~̝s{9<{9^/a0Thk!4&dPyzLTu⩓Z)ۼ^Xk'ǫ�n!i|u(tR'yT0n7nyl0w+	<A3l.>_$U$BnA(-MDVRcKxIvoDS�>|_yN\j&BI=@QRIMCYRN
    ;g6<8m<ϡ':5:K̟~4Yga949;A4;ÏZLm2" ؅=
    WdڵkKJJ<|!Kԣ9
    
    FQg�NUi4i,IlsDeBeRbdT9SSSIg8[ Ķu4hsx<#GTGlS<H[jYT}DEF찡*կ
    VYnr+FG	~8^~eYs!W=aIb,&Uĉ)nw@t	NݤRvk5\sA]fһ,6!)u.#rH
    
    "pyUZ4HVLUaҤI~
    IUBt|0e'8|4g^W�ф0v=!u|IMtM'$p	71؎Ds$鄠
    5fƺݱ"PTx~SDB᧖O'�#IA$pmȒK`#2m9<̦=	#(#U
    7rzROhITtZ&N1I8$t>9eP͛R$+~K'AN�͛7Dx()8"ǎ$uҥuuu
    A;]ua$'/q<qli:Xz	^
    ;O?U΀K/!%Rm55^Giȡ!�c<;~Q
    sNpc\Y-s:i66^ycpតS,tH&!k999.zMe=I#w93l[ x)WZ$hsו+Wje*9~
    &f:Zh?e	"S!pB2LBMKTh-4G#L$ʄ=36b0_cyYO(V5[onuq$Hj&I|MWxZޮE/_=|
    φ&;崮o=lưۚ$zTnrsupYm,|%(ww*PiA=F:3a|`6<D(I|9aQ*e*^O$s2Y6a.rHCゲ$a1ԻON걛nbeT_ׅ~Cͦ}EK!Jҷ8[%S!IM/+'_.H|!egtR_)ˏ�GÌw߱#uѢEj|J J(Wу#pS&6=)?/^v5%aB4<CzT')*?xb'ORJձD<+=OF=ȇqr gNo^չtD,	'6=<z[2U"ToҍVandIg|')ܓ>If3I<35##Cj&?ډ"mٜv;e/kq3L!i&	`Ne޶vSmvTx{6h|f˙KNbsmV)v7_xƫ'=붳IlG"96QsI/-P%{U?T9=HU/�df" [
    !	' S Gӄ@&,6ȖƐ2S!qg*L_Zatяp,텯	ELQPԧ8uXLGjbFKa~)CQ#N9
    L<Fڅ|iH�i$(qԂ'zOH#!rU_Dddd?j5z ~:K~\ׁ_>SRAX:ecv6|`i:Wf͚`!�=~I£P84Rl3|C
    Hl7e3?ߵ=f/[k(3rmE/M9M;T�-FK ,Rj[@Q6HLuL\%̾ns/ؖ6'57nEJ[dSvlNDŽgK}LmrHͥ$WV
    SWMx1]+P:j2M`V1RPH:f[]~g2vu`hFƵW?{W.g T"[c>O=Zr !zL~TrD)A'Wt+dcp_*ngv}/x}d	=bG8;KrT*4ͫ?Ǎc(/݅gCD\WL*6v58vkFv	9@]
    ɰGMyF%Y;")3Xh7&Rɚ o@<QRB#1s(0SXiՓJ4Sl`4.xfizh&bճQ"256	�SJcqb
    BWI5+SfmeϲzZI,X	tTFT+HvF%X08Y|-wu[o5o<MDZ!5RV677>-Z$_@WFIEgj;C]5dBOvH-;;t(X&κ*b5^l6hvӳf9[8LUUl&gu>Wag9s_lȵT(cfLV>_.g3-ppYQ$?�uL_\ek\O)AEE"f8EQUOIe0ЂO2u)er\ęGwʷ<M<#/q", #E0JW顗	*Wtpbh|$#$:=jԨ́t,$Xromb]
    硴,y*\'mݵ@x*処IW%Lj5.ͅ492	P,#RHu5%,C'-s`5o3((/`񪲂zk;rEPZZ@\	R_dQ:I"H:ՈytuΝӓR)n{~G W|@<$[40T 2�=!Y/Def
    h֐e^�(
    zb~ҴWEzmD&̕u7<+	dfbvuwF㢆Ho`/Rtu?0$BHD;@Bz//}*#H5ՏW&m
    I~8xGO(<زy饳H"i,zKO4՗gxaÓZb2@$9qASWf@eƓpU4MM4uu׵N!a3hРWdn/3i\WN{+YxMrI\[-ױNV/=, wh
    C3GJ㢌Gh;;r'O�>}<fvrn ]*tlnQOvuvu]m9M<rza+!5JWPXr1C09;HC`l7fQ,>j*Z1$b=@GQJ(/9Y/ڭ\JA]s}{osy<v*//^zj SK9ՋW):�fBtW0\p3Xhsbw>	<`!(}apĭQQv)w:݁k
    ]Ͳ9|u]CvwXE=-mrBX?^ Z)ĜK6>[N'Zj|1:7<fe.M8JUNb}smǪDrS2L欠[
    uʠŵkD7QTѽpBʕ+QWՑRbcXI_dLhćqj[R-v=:Mnl#hR)Q	8ZtwGoDKbuŒB.`*GN%sA,K),1Yi[`v'mmw(CSb<TƪrP=L>6ܑJPz_鹯ujqDtҥK߿;uJ[m`e{bA<6R=6SD
    mn?U5'|TÔAj&թtON]C&BIBrH
    x8~ooEת$;fKp{92V)MCT`wF+~t2qPR}}}:#EE#*t.R_`|E
    
    ],L&sGVs=
    [B\f;Ghl)j'MR#65BPW�J{	QQe,vLMUDM4RB *}FYT�}
    })6&gF_CCXS٘`4_l}�Qu5Yti]]xXQZno(n6Ϯx*i͇DҞoG�fhj*hѢW_}UOJnowr>J&m~4hl0F#plq$HPWƎz߻?Mɲ/CXp0dܸqDf͚裏u]JΝ;/_<mڴѣGgq(
    9\D1ՌlD&G$*CU"&
    `PP!
    \Θ(* %m5'~\^IOAtE0eE**)\6R$*;dE1e_Qn<f5F0=˙bű`vx)]J5IAqGˏ`ƑCvOV9fY۽%E>I5}!a9C;^jjQ�PVc3{txkH[_=k!UسA"d	Z~_SDcKY>hsX/궏#}MetzIe&2j\>KɋK,@("vk
    iY
    |J.kAU-aWEZNhmcrpteZ�jISXeBEԱ+/)ʧXtY8ݴ
    D2⪨**$Q[nƍzR#fHjbY,!knȩj󒦽`I:ܝP_PrLR`*5zhs<\^e-՝tXPTO=5kZ|r=5b],# 
    tyB[nϰ@
    xI&=ē>q%aPj*W]F%Ns)i5UYv}E>$yP׮Ke$6RE}'Ɛb/u,6	K'}}sh\zR!b	*~'N)mKɶpJUd0x]tY k$m�*$ixXF@D:iҤ'jX_h}WXc{y4;]eDS-$Ăo}[a'|E8hPWWZ
    (K/uu6aƍZ&Q
    g8ܼySĂ�((*?~\O
    A˗/$7(ɓC 1#McϚ~p#ԫ
    ka@gA̭maPrEmٴ4B0 1v*JzBS]?zzA|%$sVI)DW]H2I);ej o{a.=!Eu$=@>&W3;E_Gh)e4'"Hؿ{=!(E]o$JF⹚8I$\PD'ZSbBs$?~7	:fR$e=DSQ[6/=]'"N{Nr՚zƟ!b2@L/{`Q[45QW{-_MUA{gGGxwk-,׀)-{{x3s)P45QWԬܼ1}k{�(}-z&ԓNA4V)$իH1$HȨ)C]PQzR~ӼzSxh^=
    ?¬@2
    +Ԙe&n8ljPESdYf6Qy$jKN2$XEؼ1
    lBOQ"C4	f"HmyPՁcETFRؓSI6lXfff/x>�#( ZywDOQǐ½ݱg3~m1Gj^@_YaBݴ.&nrl6:;.j�nk~ÏZTƇ2M[+MU4E<
    ,84|_`9C]%J8؇`l(P3L񳓇=&IT w59Q	\?ECP(dbNb	v䧨IĚBeOZq׽Ee{_L%%VQ].V/!-OVZIajq7}[tL+D6t@,("1%(P
    $	8
    O_\=/]$#>wy' 2χi͚в%rO#OK	!œFhug 4w+tO#6M*Cj`!-9PȒ
    {9)tJK?e=sXM{cAO2+Ċm!?~}ءh![JkI0Gi
    _APJr
    W&pYmu̲Fՠd		AF
    K)`fH	BGۧrJh#bso^le<lQ1)0ܷχXc
    5TQiPTSgz0d.vI;<?9UT9٨nXMԒ*8DTyQ`ucvLÆt@Hߊ7%-eq0VhrGc\	Ē[!_
    Lquic"<@ʒ>1b3pz`$NQc²T[PrƵ LwIlg
    I*iݲ)+DE%]^Wm/ZI|Coy
    Nl,mԄ`* 	u0Q7p=[(].-*cU%t^Ag
    @F+p7vҥK|mp֓~<үy%9!ʳs*6/�
    FlD)9jRHD#M_ӗ胣\.AJ'iJW	P-$
    [8(.qISGerbÔVty$@͛e~V\?%�U{#||_a0IU@%UD'Szb	_9ZOAT@E ͣ|֭'$|Qg@EPnjAhfRFFKIСC^řƁ�hiͼ#hLŋ7vZ**"'m!C9sFO
    n I�**$Hkhl=1$PQ}kMv_"Pl,6tuqCf"8FS8C‰'JKK_ӧsd7ZrqsmCTBZFNW=4]p[D5T{<5ayY=AM~s:SPSZ_%c1 , ]9&"!D"ٕvcqh,xZƮJ#0.bci*F"55#r/Mh߱*9&*SD+|ϴB"5e!}Q6ދF#Gn4TcaY&69	U4$PQӈ{ch"1aջwr`WB|&N]0w+:IQximm%=~okzA WUpv"Ǎ7sJ6/njjjVd$6}9oqH}__spphDd;KG )s,bAATAilSvsΩoհBjrLz 	EbH/0"m4+|kTwzx'JTIr
    JP;r9S,G&>NNF 1EU5l>i' A�U/v}BThS[pJ^6{YN	n#ʠ$lN(_^3bGA8ZQr׎8Y~i
    PU*oӛРWj@*I>C4s1P 20XPRIЪQÌ'hScUVP]d`-)K$HʈnPZn,VCIbgubme\Q*Uo'J< M�؅w^$(n@5R$޾k՟~7Uځ&m* DIJ<ȼy$ H/<xPO0H2lh\`A*Ti]ABy…W^L	LzwU#A2̗aO}-
    }t*/,7{I'e"qI#V\85k˸65##_um/s-6|<-kwXfr)I0
    -Yd>uݶYoK"`qx*lNUՆ_"HZO?x<zQ#k˸gOzǏ0all5UEbRRU$xXYf	;n_#+פq/*>nĵ9 �PZZz9˥'MSLqݣG֓
    }3%SuTdZdHgK.B$U4i?C=eM%uɟ~iff, HڑskzH&ݸqCOA$aAzHb:AĂO?ÛW)${"=Y9α ԧ:6M`#	"#Φo H6S׮]կ$4c +F)Æ
    ARM
    &xq,iw>ؐck8A='%~g5\ߧ	l 
    WР1WпʄA}!ICl.\4 X
    Xz@OI&bbS?vwΟ6A[A7!IFmjϚx~_຃ j4!Gmjۏk﴿oA lxH*Mq;	"%k殃^OIVfSc.x0|ARÆB(D$&:6bW]ӄ"( ux|=WOIn`SWLոq. G`azHMtv??8 Hqm<!zi.?UA>z^,#
    jMxr++'G:,< .4i'7UI5Bg~j
    *OE[ [9Sm/¤b*:!Ti<gWw3TA4r¯!;_$ͦ?$)999qos$gU+7Fޣ' !TI222]f0^=vOqos$ܑ3hSTܹs{S 2@6*t"1@1Yoزl0KOTᝮr!NV%:0k\,s(7
    bPњ"q(,LX<$u8@
    �=	Ig;`Ƙ<|=m3\TĄX%]Ǖd9ܶBouFmbCpt9IFFj)sƍ/ ͛7^|8O< Jvؿa]~aĠA	xsA4,wziS?9re񫼎Uj!H}Ӽz%]%'cAٲ-}GNwyujA)T(V<터$Sמ"ڶ%sx ['$@ ~*{b8@@znGxlbJU/Ypo/))ٻwA49}w朄9jݾC!
    nr(o=W3\�m'bzi$bg}֋Z	
    'u*C>oD	j	s$@Ӧ(wRX7I|'ԭn!
    ycMVo)u5}гzSQ~6ysn|}T^*6`L  nYjFiP+Bc*O3THk4|)NH0;-}!]>w{:{ӪG~GgDF�R)φ6grΗKT'*Cm`�	YY3C"	lrI`HHlǪIi4FCTnMCc-߭kՓэ'	ؼZH#gߜ(	G}H%nD"?	>cñ:	բYԌ??dYiv?;4g9-6k?D	ui)`!ؘ3#3Y]?ӲŞ2zV9;(JLl:[(R*OH00 �9(ɯ3eeܖXqY- guo ~CU 9dcGv5m$*2T@fNfXlwELww@@2O^DvNS
    <P6X&xJ]m3\bHdɦpRl*R166Y_e
    ᾤ4no_qF'%~6)`CyTz{,wZ6(^gz5[nAj,V1hРk_s΍=Z&L:%%%?
    ob/Xo*Q#33!Qz{AfH_|&t#-jWuظl@Rx=6fٳ\]i*|F"*7:T_߰
    >Te
    i/pJ
    nڅV;lg;vBԡo'ViR;y&eÿ\}n:d<x_ꟙm۶Gy$Xrä\N9:LExɢ<h72g31[ωSn̖ޡjMeQYytXrm|%Q}JX&x*!)a.7֍C{엟Ik^ߊZL*@*ͮ*M\|VQsq܅
    rB	{˛Gma`e[e&:GIސ�#g~BDp]v=:5cQ?bY7wС:s˗/+A!5;娑PdCDX2A~j?#$oNu1YdKD-H=.:m<6[78QkA`$Opnߧ
    {exCφl1DVRֻ<-U_O~fDT̍ Cf޼y䷲pʦ_7+~`(!NB068 Zs�]$8##{SUd(] <)ك4'. 6IAe%9s֡kw$":ŃIMЦ"LQQэ7>(!b0<T"b4'G@ HȰ=CbSq
     82̙3 m* !CjvLD$|Ц"lt7*1I[$A  m* D$}GzbWЦ"5vΘ' m*,'N̼#5c<gh[+Apd[)ͅѕ(/Pm9hS$E q߾}gϞ=}}
    5]�]&ѯ`k}3Ȧ2əNu#_s7} ͮXSa6!
    bK+[= TIJT-hXV;Jlmrm
    ߘ}v&Z}km:rd$hS$i8}n'vҥKz<<H ^{MOY94qdtHzM}
    xR3*vrd@ Iرcq>^sss�+N>]TWj
    P	0K)MЦ"H3#$+H@ )"#GhP6Aʕ+$vME$q/;wvóKJJ'�:ed #!HR{ǝ<n8=9uԡC:::z{{?!CYXXHL�VH8<~* 67q^vʕ+,1zߞE&OA$…_|A033s=>`qqq!֭$t:ש����IENDB`�������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/manual/images/chapters/layouts/�������������������������������������������������0000755�0001750�0001750�00000000000�12203357067�022144� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/manual/images/chapters/layouts/htmlLayoutAccess.gif�����������������������������0000644�0001750�0001750�00000442526�12143164146�026131� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89aJU�����0JAYE]G_IaI`KbLcMcOfNdNdOeQgPfSjQhQgQfRgRhSiUkTiTiVlUjVkXmXmWlYoYnZo[pZo]r_tbv]pdwfyj|dtnsk{vy{l{~ށ߃߂߄߄uƅዙ᎜⒠㊗՗匘Ҝ揚΢葛̥臐鬷갺봽쉐咘驵뜢ؤӱ~~~|||{{{xxxwwwuuussspppnnnmmmjjjiiifffdddcccaaa___\\\ZZZYYYVVVTTTRRRPPPNNNLLLKKKHHHGGGEEEBBB@@@???===;;;888666555333000...,,,+++(((&&&%%%"""   			!���,����JU��H*\ȰÇ#JHŋ3jȱǏ CIɓ(-"$&N0cʜI͛8sTǥΟ@
    GC*]ʴӛq|JիXji:Yϱh*ȝKݻxw.Kt#d0ǐ#KL`W̹ϠC-9Sۍ�DP
    ͪc#cGxtpN*b$زУ&#Pҳkνw'Ԍӫ_Ͼ=[ܸXιM a{8~ 0#gp(Ā"
    r䱰 %| B
    o"b
    btYG8
    <x^xˆ#Ah #	0߈"\v%z!ߌC(eo+Х#`I~#)B-wJ"(}�
    v#tsX,
    2�'\@_hY
    )0Aig
    Hz0ΑFJLdGB6~)-z+̀
    : qs@b2FezEi@ںsE=/elpa[	TܪE0pq\@Fg0ptpx[%�GhvvQvt\6|:`!x=1L{@=pqaU#\M,EPd
    dQ�7`ET,8tޡW0
    ?p	ml0h[a|pC 
    eбe@# qG�h'q	'AmXPApEƉymp+|`E�wp<~
    ,FpN	h@oa3 
    d`>|nIђ(TOTDg!(FRNh=D%,	?@f=9+(сL@Ɖo<6(tP%L&쓉D*]DBpA<^&*3�F/"$T'N:YS0OP�T(+�0U NRQo:&x_f+2i>1:# dL 8@vC&P&0.o0Pqa{L2Tv*�V\fh$-hsxnH=% 	K3X5ĩ;P8p!>qI-pK!OBPЀn?\oR9YP809L`Tɨ�
    ~@
    (6Vll^8jg"p_`�@wg�'L@_
    �(`�O8Ǣ!.?
    $XUSWX@T\@-Yai(D��
    8l2I48pqT@:oML=ZyY_`7L'd8P7"xWZ aKyB]05x0.3, OUpU 3<`y�VVt'Ѝ
    Zg0
    =vP6!WsvK\GF0 )f8wK)Bׅ7 =43Rd@
    #od%x&
    Ե$/R�20wfBf,87Hsi{#ӯAoW�2Rz�:]`G52�2>C
    "(@\C7yKVUtRhlPPZwx\p\
    CpA�)=Cb9h;3;:
    uǽ60PPABu�.(
    xn9
    iPWdž!lè{�!;@qlf`N{;
    xm
    B@@WPSNxaT�(Hi`30u;h�?6qDO(ࠀ6C'aBrܛ" �>|> 6;@Ru["n]f6
    o�y�6u[W�7
    cR[o}!ћ<(o1ā!<md̸%^t;HA@6#@4\gH3AL3!;&�DaFQ6D80WTaw-P�t^ iO@+8UtÁKl@4Uvv];�pA
    �#NgpS2x �K"NhP:C�eRD<`1�3p=E_Tf_�s$pRA(pG2(�LxV�;?uNC6��:{,`_e�kP7M�7`7Nf=x*wW3Hvm`s#d+@7:0HxS3)@7;@G%z,@RTy'9_pK4x^{JUm]ba:so$�;z.@r�0�D7 3@6O��3vC@6a0h6Q1:H�;s0@_?p	H}00;0D+`YY00D0gh:*I xG7[G	dPشD%h�4-vOT`7+0nRa0#]D@D�R0D@7�KPDKX}@pSkLwg`HxTRw i3~v@> 85C,Wh3w7Uw0D`<O:FXE/R8O0 k�eNZjY}ze#hXf�Z#m�{ģͅx9DA*POo IP�M0O$OYu$g;8xe;0':Q�2NXp; 
    `98:�22 d1pZg30<? C@i4@6iN@6@sn'lG2@7-pG8fY�OX3 fN>Beiaa�v@#3+.p-=0j;7f~8OoP4; d8NcRu>�0BZ� 7Иdzp8.�M05y�\`g7=w> 5w@RF0c>D7Rs2P:QЏ>o0wBv
    a>p�
    :e�v׮60c0;VJ3p�W+J:؄0�7@6:pz{QVP:Na0seu#5:cH#=M> Zvi�);8Эaeo6p(/"0s@w d::8F]@7d0V 
    ȩwp�ac?T@2
    :0E0Jv`xg 3=3vj"]L`6_00a�iRRp3r\$j?@7@;c;G7}8:f r*">y@:ap�y@sP6�rd{:Twe@7iCS�Yދ
    M`;�ayfP�y RsOs�P\x*+]w`
    0:OU)Q.)0ev0_p�w3=@6_@i?d��'�),8k@ڛc/�Z8MyPft1M$g)`P`I;`IP01DPNJ;L�7`,`D=b>P`bQ`N% OG 40Yl#�> N:p(�yIE0uNPp=E8Cix2P0JP"Gf:PPc>P70$2B,-+P) rat(3~z?7 K`O&\lAP=`J@7DN0>PlcXǟW2Qp4 2FQ0JQ<e\\|ˤ);�ڲ:KL;@BJpj-&ϡ|/R7`
    )ḌSQpS_f Q02G<PDN`bN2M朩YD3�=QP QS;p:^=vGe (}N
    hCU!2]5�-
    !fb-#+` 
    ٭%m!=ż,ؐoڪm((٧4}و""PqSݻ۪"u\(ܖU. pJF1EpJ}Hbr
    nBG<"b"m?p"]
    
    #`-#q`7)^έ3M#0M:~J&�Mi%CB!`%�]j
    з7} 
    _NRԎZ?{1q&hp^
    M'bn w\h9 ^~芾
     >^P~頎 ء=븾�~0mN 0.%UI>^~^I�rA0>{=�r~0o? AP   �)
    (0	 _&0
    ',.
    �	409? $?Ho)LN!P6S/;W/AQGboK?fhRQlY	q P�
    {_@a
    0]Qp@Pǰ`
    `Ȱ 	
    
    p Ő0ÿ0ɠЀ
     p
    Q9?�P	�	1�_n	q	P	sO0
    �-zl+Z,�iYe6|qhXMG\qYI)Q.%n*-[3XkBKݺYʹs@
    `	)&|I+y
    RyqXD9I۷M/@݅wejDD3BMX
    vk!cTq6l(oD;5ڪ-,-Jt5@'fDAju..c09\ge[V
    )樥O^uAޝ1Yl%kPY�hY~b$YϧQREHrh5eDYƓ�6fk@pBQi$C%:dK2ɦD&e�撹axBd."D2UyĐGҲ!?zL($MT#de-Jʆ+J8�ϻ/A%�FYdffZYhm!N|%�MJz1a:PE\Au!m�!usԦMb)T۬&.DpY`-XdUv햝�xe(Sf	@OߋYpK&.Oя?�HR'dnMIbHFp%Dh!!_hCAxX6D$c;FDA]!
    c>^(XbDw ,ER6�'El9�BAF:>:�HЅ)A'FS#K;e\YIDQk	FW�EqKṔ.2P5Uw!Y9<v񕜩UC}%$V)$�/(O݆:?؝(&f5V鵗|g_d؁;*0m
    `ljx!%~b�aZ	 p骩K&*U񆏬Exf6[H%1PF8ˆFb�P떶`tiL{DZ i3_C	DFA4xJF7<a�B|PH2l 00R&{04JS<ԅ9˵IT8.lsx>1I!XaE=vD3NwY2T1a^ƋWI9o"E,ԔHD"P�1	AÈ>ru9QǾB|#KG+Uc4!-qՌfIBAp#:
    mZ=
    #h7VBpyD2V)LI6ilD`ᜃZX81o 0P!4LiBu)^!�DX!EP(Qa|Jh\H9bSTT c"SLud�[;"ɐGw:2:3n.Ӝ8<h"x3.ԕ#pf�D(|&�b	F+1nd1\4	j@`3@"99.gԎa>VkJB)E
    :4dE2%ad0QrQ劑!+ڥU]LMV洧d 'TvdvᝏSHt#Ҙ)4rOkV'
    d<S$�DJFJ%JJGQG6iySjԎvFg:<B-=bod˚�eqr
    fX)rc 3$p3j	yt#f񍟌c+"
    /sd^ZD5B8>혚JHžd-V"p5	m83bw	@1BB8g(j60F"ob42RURn1bLu}}ޑM0L�RAG(Bט"HAC;84;r$h
    m1E,-v/ݗ(6vJJ;_t%*#CP$ �p/X.D{v3Dz̈́riDGDÐBLKiIf0h2ls 8qڅb�Gzq}!	�P:r+[G5CP"M\@!jD`8raC71UC㰘&qxPccqsD#3o;+v\8aHSÐ؆6718w%V$c~~GtrIn_}g=g_ƧA}_>轿/~^_=w~*YE�<@L@\@l@|@<E`W�D@@
    TIL@A,A<Al@EHR(|AAAAALQ`ALK((A"$AEYXF �'|B(B)B*B+B,|BxW&B0C1C(lJMB2\C6lC7|C8BGPSP8C<C=C>C?C7dQh@,D)dLJhCl@K J K4@GDKtEDKDPQ�L<EU\EV\EG .VEZE[EZd3YE_E`FaFbdFCOEF`lLFGHF[lF`F[FFXF�FUStLFJFUblGw|GxUAGxtMDh4}GLPDpGn$e$�r,QdKHBGDi4MTMfTKNJ0EF`DGTGRHI0E{|XHE]D^DF;V$EX�hSʡ4C`DlB�C`JUIJ<ʟrªQJʬCxʟtdJ$KH˫<:<EGPN4M؄LOȄGOL4GEGظDLHTG HNȄEʮ\IEǻ8LMKK4MP̟$I �DP͗M_V_Ź,GOPNɅJH\B �DFKM@ȏDtHGX8qko8o͵D^(^@tDORd3oCpII^\HZIGH[>0EDtM Fp	eGdDEZ@EH\UJeZT\E܄IIZGXPK$JJQ&Ő!�ht!'[R}DƮ4>�piapwn[HoyCJ\LVOf(_dL "Umj0bjt�YUeU0TchxSyvHmpQm}y2FmHIE(hSe,gUU^uIUZ�V�qL`(ced-\8PNVbl�W@iq c8<nHlHDcY8E ]xQ;JJ\^B`TWaDk5wh
    TjGM4h_`HXiahQTMEwB``JY[HbhiLٙيPgL�Five_Dy0ĦE_`թħTӨdd`^`[dW}tKO$Cghm-@�V	x9
    _UD@Hn	�[Ix|mD|mX,KEeefVpIP@[WHfDXF0nd
    �c�6u֕D؅`t>DEsއ^_O$�pC0]^@�5_ ]OTVmGFdWPMBYp
    EEs}HtDIH)o0TfhUnE|mYnȄ`R]XؕE_ES(DHoh%Di8EHnB0o@DI`DfT0C`)TS &~Z!lJXDEmPaBJZC�W&Kc,nSc2�RSDXaKh
    �@n?&KCtJDFzc FxQPODQFH^DII+T)EMxUI�OƄN`IO Ex?CȞMKgHE؋I̎M�m>^8Z	lfBVDOPQHeaBɆe.J0gGKmhHHNNMhH`Ugq`CH\gX�sBx�r5WH/+`oJTӫd,fl؉_Ÿ<SZIj0CH7_0FpH
    G(>PE8RGp6>G 	QDfDÙMT\W8d0UWJ�ED�ȅdSih<IPAG�@l];P:GFEm6XG�C�@HWWxZUb@�DhEN0+{xagІ`xHm~HX@f@-ֈm`rJichA^(s@b]M@i8fT@r	�XF�go>XWY@NPOFE	
    nD fh	LL�DD]hSCigۆAPPQBuLfPY,0|I&`FihRhQEXeinٜEi%DHEň=Ev`_m&h-ajRC jLk<GaNj\,`cT䅊@*.Vx&ndJ,_@>eahUlhtxmFP̾vfNd os`Gw8sm)yppSSӲ3bGPMxcxpVU r0_B\P}XofChBTqGXp bo:~wXgpwHMmOsXi�X]>pW-q6ZXY_qDhq<Sx[qEHMPVPH/O)r(/'dya`MPiG~Y(r(__.EA�̏ ej@s<7qJDh,PXH GoX{T;0fĞ<{^.F/ctFPllooXDk]XiDlV)8%
    OnT`i/
    
    G@}E>!F6C.h]P-XREvF�XhH�cH.MPRWXBEP@Ke8Kn wUOO؆<iAop9Zh,Pjv됀}XHYY@!"Y
    %Ǝ"G,i$ʔ*Wl%Z	ӑ![zMR"OLi0Ū&Ԩ,A0�L!,rH*UQbrU jY�
    @/-
    芌G'pj@F<yH2訌(҄9a#H|zA\	Ku�GReÖ*[)
    fkuZSk#oM4H}(*lTn+{EB
    t4ԻeAu^R6:u*4")83nk)-}B$3,3RHPV#Vn02/@�@S	!d�#1"	4�M,@J�\B&x6'L
    ,'|	8`2.#43hI�h*aB#V�(�$t2h'hrM'B]L�y!�
    "9JRL�(•�*n:+$MJ5+eԬ2-$SNlJ]1"?>ʲJeZ(
    &x"X6$rH-%44˨&&リ0H&󈸳Rfi
    0@>;Zi
    64%<#`3%@C	7"L%Ϭ6W$:*$b18s=3*tK4<H$@c	N0F#C#
    1|6"֑4#%04$35$o}lfa3Mј9,;þ<p2!$@!ΠC*<#M%|.C;94&%S
    %4"ʌ*#2(+�J=h%,"1!`!!?&L^3B;È<۴ˆ1L"@~+o/ 28<:W"TF�&2)[bs(ۤaebVS"Z)b/
    e4Eb,i�2!WDb�E-lQ
    F,Oa*&IbB%&>1K!~tˌЁ3HѢF1hEb-ь=*Lqr#nEja#H�jc#
    <2!~L!RA1\dZHEoۉFY(fZP`K1'`Cb8%f#JM )	VB-NQUBD.)
    Z'0ӈI.-X1�Ets "'w6Fp3C,EYs}@m!
    Ftc%Hb[:T( ғ
    =L%p1+KD8]X*naId)	
    uõ0"j`yLg6dG6ꆌ [ma3ձ$%
    HqC,/F]!*
    z<*_
    i/PK=b/j
    _!-M"aJ~'`aA{rn="�WaJciJuUam*[يtH*[-Ըq�im5UmljC
    &bsRgenur$.J\Jeҫ}/|+_
    |7 &>0%~0#,	S	fL,a2"MAC\`\S.~1
    P$61sbEHH51,!,VD*JX#3N~2,)Sȉ<e'p<dEP�Ҭ5n~3,g6#3=y-AІ3*FqE3ю~4#-I34	Y0"Ӟ6�fa3jM]j?Zծ~
    YӺֶu-kFoӻuG_;n4Zz~6h]K;Ͻ6R!KPF3J@kNlMPsoF7F@1RpF-Ԝc,E3ad,#P*XHjϪ7A~f CXF1a|F2r@E�\BHlkj{�h0
    A#AF@F3.k]4#bHVȧW`-fH,h5vǥ'm9jD7�T߀)]=�%֬Mpw|/ok<�|ټ\F7:fhƷl9$
    _B i|p<~)aS(Kg+V[Ơ*Qa,I8|N#h+ΠQ!	>o"pvF;o8G,mt�*.,d22uC�= Z1*XB۱P�D-24qZ$24iݰ(424&\"$x5xB`]("IY
    ߁0XB&dCa&PY-WC=6\Bz0P›"!&a�0<!2؃._6`B%�dd&Ⴐ2C/ A%Y6pB
    @�%h&b%rbpa)ښ916,$4/|
    '-B�0ð.+�PC01\JŸ+,0Uĥ̂9,6L"1 B1\
    "\#"BY8c]Ba�020ա#ay52 cI677J)d1"~9>ܟY"thi$тЈ/xa�dZq$G[7JBK$K򠚉.�$tLB)#;a!t"d0PBS�!t	r	!`e�pW^eV*77()DC.,.ԃHҙ)%X:WB�4$"3.HO^34e)b�/H&-Tf�4q&$4h"2jC&3jVk+Y%Y&!>k6\&m[@*\6B6g>s2H]EFa18l+ΥHK,x�C+L$KRD:7t%[�dB7xY%t((CaQ"S((2$1B#2<E�&W0Wv%XX�!k(Ω7<B�/(e#@C#:%H/@j)C7x((]2/.1L=Pfb=/Ђ!@ݝ=7ChN1BB�ta&fo)}>XE&&,if�'A.2 I
    u~$BCt6%d$
    v1О!LB!-YH҈yr*J|*L7d'5a5P-C#Q5(-/-|:7\ R~h)27aY(>%$T%%h4l8×�,@ƣ3xҁC7L7�.4LC)Y+HC�1(A+H@7"$f"ah&"*Ͷܘ4d	*8B3H,(*Y@q2BfjtfJBu�)ݩ
    C, �"0`z٬F$|ʭK$
    kQ"Nڭ1j:.ODTVe[neXXzB1)۽Y\k%1$")@,-<Y3d2ш2dž,3:h$J'B̪Y-,(#"gIG"|84'(( #/ifuRkbg!C6⽂7pVɚ)x7	!
    ϝ)lpŒ*C;u7(gm<D)p�$;3Ī	cµ6|CލmD�B^UC- +1@#4C:P$+,4؂IVB6؂+P\|4(3ùp.�_�#C+`nl$1B)8H-pl!B.HC" B$|(P N2@%ha2Co#I$4_�B(^, )\-)|p
    e9dE4C7h8@bW8`),(<3^B9lC"FZ֢㩎F%l!P%*I$Dԍ3%/
    �939/;o!suF$H=s)z
    4D?A?A$Pxt!Txnt%#`C8`(8.5.IIH	�8\I:'C,hIC5 O;l"C8h%6$U,6'L8>g8C4|78g58|&|Z	5Q2#5ÝɂB^)#27j�8j5l63.4o)z/f7gh[>jh'knvh/h6lǶ
    vՙhkv
    lk6pwѶvhvEvpo77t77qq{‰vvw7y;)Yyz7{w]Yy7yY
    X}7Wi77؂ȁ/87?8cX+@u؇Q8PEv$#LlVuD?KWKL8T\WI<vDĎ']l"|x8P8Cwɖ#|xf|ÔTcx8{K
    H�Dn'"DԠPVQ39#$h<XuR�WmZmIVRLQ#zlYH7!o}HHz?:$MP:s|[lFVgUxBI&l-yB&<%x'`'tw#LOF?;c#PBBuB&l'HfSE#dƭg%z&pB&к%pg&$"=Ĕv;4<fs9@	;B	y&
    X|re}C,dOC/ 'XC8x9|߄
    /C/#.<{-\W�9B*@y#m9+=yUׂ]<+m].8I@%p1Bm$!&т-I%tZ9#B�JRݏ-wZC8T40;p7Ѓ-7<p':pIB3DFɟAm%P9%T<8=>&8h=)B57C8C:h;;}ʃ8~3@L7,B)@P)<C{L�8-Tz"C9?#9oxu"59p!\w)$B8^	0Ȓ,GdYbdP�H:ț&te%o,/`rFubN;ytDU=5ziR(4`AcѢbiݴhH-E*0`]
    h1J;]aIz-K	]~Q[0DBȗa ݰB'C'DأݫvlynIrֈ`9dn%,l8m"~Z)F<g4$EJ4`OQ$HE^5_[%ej	[qFOOy'0�1I9��Do	`AI%DpA RsjT} <jQZI~'CaxA($F"$JKL %CDtKAL"Jht$�en9Q$YD$CXSVSKdH
    �]p
    SPd)PB&I9$M	HĒiNY$n|)JAo$idJleCfHQ$fiD	AeNo(!n
    ;d�DAo(KUS1Fv EKE$9K8a~"DXf<
    yĒ�v1[F%BnD@DHD0%EdJIL)dN4DI@qO.N\$F>OGCdKy&�@p6ēNēI1;XMdLNX$n>QDDєl@	 Xe
    " S*=#?RGDU#Im]}חmhVpfQdcRYDѴ!rHBSD0hX8LD6$E{s*;T׉ԧrS spl8|FL"D8$'8D)Hc 5rԢ�"b1*2p!G8j"Ti^t0!Vw-�D<
    "#$kLQlD)81.H&W7T!
    b  Dt;q	gh#1ڱX#@E3.|b�3srȃF=ъ '́qb&Ƈi ͠F*ъ%8Hun+j1ttjƟqn� D3fqlXȄdЛ8:r&5P.RlQDD(9.}霢"6,Ig!`iythPP$ǽU|9J<PD Ơ�$Ŧ
    1"P|`)6uRP}P7HtPIP`+"/Tm8
    $tCu5M2FÈa,hH$,1t<#KZ""@Q
    GP^80Bd �sp1q�d҃H!"�0a
    X+o<BxEhaJXc%TAr D0p}a`,IX8AG4X:D~iWcp;61+n2αitA
    "i9ӽ%|}dNXPxHdy!)ʈAg%3!y{N
    Q=�sɈ	ZYQ8Fӷ)}E9%)NFШ1Ӱ#|UA"F.I(	B8BXĪef90tvd^cBDE2;F=ao4bYr3k�]�.=џ,4$*qB$L`$K�G'lbR[<
    ,Hb`$&!(_b
    H82ѰM(8-X8jřC\Beݠ",э�hP2=Bx*n]3P»t1>]eTc`Xpp	n_;BP!!ɸ0	>$5�@n,F#)'Sƈb $x5Bg{E4|Gg"�;p0Erٖ'<aJNJ/bF<b"F�6R1i׵u?.Ӱ{4>
    H*
    U,{#P0v\(~Xp<Ku
    n�5;)9%4tajLb�,b!^np9,"@�FQ,�F%ql`54N�Yc%(	Qx�FL
    @$>H3|h`C64OV.�|A�>mF*rfn0`!�@ Gl0a&$�LAan�^A1A(acAh$kK)DCaXdnD!UCAzLt!
    M
    #$>y"B�+AC(a�"L
    J"/*AgbXBT.A$L#D"PǬ8p16<#'VA;$i~!iQba1L!Aaa_a8%AhaP"ȡA4A(AơP!aAAcPPIIaAhctaDaZDiN(́fa"LARK,og
    .!
    
    !c-Lok',c9�j!*' d"a�HjJ0j"&$!&AQ\63esXP."kpB<
    WJ'`dj5#7![b8As8D*lSBB5La9I9(s4;'938s8ē8s7Q'cjL``al2.`Ra6,abaP0tavX$8Reh]&!8Th@8a( a` IDNv,hAHB"?[FdT(l!HaHgA(*T^a4YTSVSKEe,
    ,_D*d�LQjpKb3"Vc,2rAY~"$@l�s8er387sVO=g(ZR/GԳSAPm.P9LfLee~g�@,XLTMVFQq5u0V;3AXSlr�TTmN<%XXUCXm5TU5u71U\{K
    ,P
    !<T#Ts�5'֔.w
    9l]_Z 0R_1T3`V:`Va'U\_'
    ؂.c3Vc7c;c?dAL�!(,6dOeSVe3Lve_fcVfgf5¨fsVgwg{ghfHh5?XicIc!OAjjkVkN]ckVlǖl$ibVmזmmk!JxnoVooo6Dp6.!8pmg �&r+r/s3Ws7s;rPsGtKt/wdNu[u_vcsQadvowsWwww{woXws#A:xv`"rz+tE7z7uWzW{qv{|W|7xvyw{y%W}swzwW~|~Wm|t}y/4ar&A*-w3rMa~7~tWKvwr*rLAa!$rUoJ7tSsQკA4a!ᆭxaArlr؄x{} A-!`�r[7+r)RarXaWh*c1Y!	C;+9�!r)�rRx'ں!d^OÖiv9�Ф8�2wp&!N67'w!#նs'A/XyrYm,LA>arV!V$�taA'vsdr-Nws!%DZbAy�`PA@zaJ^،-a9,Xzc|g}AV/ hxetr	})AYl(�<'<*gr	Ad-ר-x,Ahh0rka
    hf.ar:�]9['G2WA:{*u2�
    !4Qrzr?Er!D&789.)A8`Ǚ(7'ȍa&Tɪ	'$vP{r_8(�AyWr]A"S40POJ
    AaDe,׾Zs׍՗�Frx7>a׀r)Wrۻr=\*C&G|7|rۺr/kr}!95'7h|\aNȱrE'w!C(>ɑX+,�`1\̇zr	a\|r;
    ,7;L!hrrgapzLVlX(!
    �袄Ta/Ьz
    ,�2anɻrU}r=|r3r]=[=dirW.U]ߗḊz+7Țr-w'}1[+JG<�r{7Uvr	s<{@l)ȉ=�!A-EoYEAݴ+A)ݩ~ab΁S޷krg\BZ(W+FA.AxA\LAL:�FAxp!ZxfhAO
    䡩a[ym!�srw}~t|?Aaؑr+\3|A(w½յ]i?r=-hGR-"('Wc|8V6}%s|r`*rɁ|<s/>)�ʼrmFQ~/wh8e~rC"g
    r-,A!�B6gŚ�K9T(�nӾS�L-
    0(I1EtJ"J!tK(Λ.:]bѤL:}
    5ԩTZ5+(VYbUԴ�؄ͥfFȫܹsI
    @I[R9%J3i�fcijFESRRϞZ"Y7w
    {,E].u;t5;J
    Qn.`.G.c:_cS\’Fȩ
    lZ/	GoF1uj'c^*)dI6/1JR`^
    1(B
    t
    4`N<c%0)(2&J-
    <Db4K9S=dBId�[	Zd"ˈ[q!IeVW_Ɣ4C�M.|K@F#ǘ!p KB%fU	S֜:ـӌKx
    2Sfxsأ;6ߐtJ7b(j~RK$b;$zj&D)xj;<@�x3"OKl
    W4kB+(&UN,RM-ʾ1<R"4%$J�Nc˸zBYI6B�4"͈r
    3xHH5<2!
    en3SJ)Ղ҇*H.$H$ߌ"{HM,2/ㆂKP#꺴sBM\G=$L'B#x5 BJ2IIt׹C�2Pė_19(L7ڈK4/T8p$.w~pI9L^:(SPRI$.B	%5%	$��Kyyzg!vE	"|nxI~S!!2	%iɧ|%K`9p8,Ԁ3"؏K˘58)5Io1.N5f܂�Z8¡K0Dgl8n'q#F8Ajc7>jPkC3 dpU:pxi.Q8Xmh2z	~(4S-Y2($a1HۢX/qd,#|hƪ<1U*-*];q|!52n< "C2ldSHJrN!IɪL$IEB2,-9HL)n%1Xr-o\r\#\Dr,1iI<3	hJsTD*JKjjs7	ps+ƉZ&f:LEPB~%A|s?	Ѐ
    t#\
    |tmCJB
    }E/ьjtt*LQQt$-IOҔ4E+V
    ~2"D#bS/#�Ԡ2A#Y4p"Ԧ>5H%*Uլ@�
    ְud&ղulm[
    F|tQPY6tmj_Ŋ׵:X�ΒLuD,j׽>K
    ,U
    jvURrֱ�jZԚ5eh_ռ`ik	z:}u!*b".Nte#KZ$nYz%Y5V�Au�QF!nj_|w�/U׻WK>{Η@o	UxpS+<aX #	OPTD&<L<&<\>bժ#bWcC9#(NPDb�q%؄"ڈg&8aoBĖ񕭌eM3iqw8kZ૟3TF3g	x(Q	s:<)!ъo@8zOX#87TD@U]E7hqj75t֢uD*la>v%6SF8bؘu/#!mj[ٮa!}	\'͈ZW=&|\Z*!(	t˛au,=ou͆8Qicp7A[7:."@@j(DYMzSu�%ab\H8E\8Va*5N
    yІ;ގ}קf@,"J3u�x}
    sr�Xq"F9Έ]." 9[r90^FPzFj$Yb~WRы`�`۾0;jQZ,*�cD#`$1hPU&l`K0HD1`_TI<=QvrZV%�	`
    7pT`Urа5g'G�
    Q3�!t#؁`UFWpPqZ�0i	-	܀j
    XHK`H6	
    UE[uXa5UZ
     		ސk�
    `�۠`S�
    .T簈'XVtG[E�	`ЉĠvXwp
    c		@0�	y[�p%
    0`
    p	P	7~ܐ	Hԅ#|5|h|^[	P
    0	h0
    
    P
     	7
    p62p	P_P	6uZ
    xcH@	9w��30�
    
    }pj
    T�^2y	
    
    =<9�Cp@1X*1\ 
    	'	h
    `
    @		B:	S�	
    	0v�
    8Tp		@0T\
    	@	U\Y	[p(
    	@
    	 
    H/P<b-k 	 
    		ڰù	ixlh6�ΰ
     r0
    ЋLU0(�
     t*
    		߰T0DI8	[؜pu|[p
    �\\V	`
    p70	�	kZ
    $:%0lp5@�G�k@!g
    16:r}&pW�00ГX3x4ZpTư
     
    �WP	a �	L
    @pN°
    P@@	 
    p`Ƞw	Ԁ	ӀԐ
    @+Pߠ @IPx
    0	V9za9�@Pha	@
    0� TE
    IpǛry	X
    
    ﺜVjł1rF
    0�B4	TYn
     		)@ɟUTv`Au0
    |
    J
    W0z0@
    p?k|�
    U9|
    CJTz	�
    LՊ0ZP
    јYz	b:dzZIy:�`ps{x*@q�Q/Ъ	`p	@`
    @	�P ⠦Ag<(?upu t͚0p0
    .r:
    [
    @U,ڮzȜ+V	x5
    0+�k*O
    d	W͚޸P{U#{{�t^~kI
    /+_|'@	ߐc3
    �	
    yI2
    7`q	`
    
    �_`SYe
    W@
    ߚ[ApǼ<f�j�2	@w
    бRР
    |	b	2d0A
    `p
    p�ymЮx	P*;
    ʫPp[!0ڈ9P
    	ʂ8)(,Κ[`aL`;Xvn
    TȠ
    T(
     0X j
    Э>`m#Ν埧U	(,T^
     G
    ـ
    {p 
    ٧51UҀDԷ0
    Q
    O=
    T�
    ۠
    ~qնՍ
    B`
    TMz{B
    0^.1
    `0	`�0^i[ؓi3PZtTP,P&	P	p	_ 	p	I	 
    ހ�
    S2
    0	/�	 �
    
    
    ?	s҆(	C~	Ү(I#:Oq
    y7P{
    !we�yr
    d*
    dUΓ8�kԐ SmBڨPP,e@`{u}e}0ְ =�`	�tɀ㿹㈕	�xoUҧeW>G5 
    ӷ�
    pTTT�
    @	^�p{0<;7<=B
    0Xp{'r
    OT 
    t_
    Ȱ^�
    TP
    d	 
    t
    ut)ꛎ*X`
    `	
     	Bwz+/΀
    P	|@)p@
    @	A
    @	Ȁ0̀
    uҠK
    3^`=t*1
    &KTPr0
     
    
    0M}0�`
    ذX%owu8
    P.
    K0UG‡P0
    РխP]k	
    CF
    n\ 9	f-	0	
    X)hJߏ&OU*|kUߘ
    T�ksz^z^[}^0P^肯dPvPUW`
    p�|`tX'6[�pp0�`
    	U
    		p
    �	pp
     /
    p
    ࢜UJǐ0@?M.N_vXտZ)4l 
    �HY1�G^҄H
    @ @F=~RH%MDQTT蔭ZD1RT	ףr̸XDPOeKҢDEr$Ԓ,GdY:�#C@T"(" @FrbԖ]z-UiȳBXPJ4!^Yd!2vC֢-G敻Oh-zD5"Dz^VQ!GQ!EOȐ!%"sC9J!DD+ -ķ}gҊr|tieZƗk��"(Ph/
    ,'Ԩ(DðC#,G$DO?(V咼1GwG2HxİD2I%ı
    d2J)J+yt3(K/3L1$sJFZ*3ɤFԄJbJJl O=O?4PAsF\%BeQGTDX0QQK/4SM7TTJSQG%TSOE5UU5MDVVD.ePcRE(p�6Xa%XcE6YeEN6Zi-vY&6[m[oEeo%\sE7]u%V؅Hda$^{`|_a}~V`67\fa]ɝމw_/6`%cVxdOF9q%V9ڊ[7cG%M=g.gia+a))XS6ac
    i-XE9gHgEDYSDifcY&IUicYZU[AFM)&c|cIFhP	vXb+:sYxd`5`@}Ysm/be9XD'`ey%UXa!Ye
    yhyw]]G6ja=o֬�ѥ�,Kw$MqXK}pV'"p`UIl7+V&
    6К6Kho @j@)aS(c+V[�Ơ*Qa,C@(a`Ac
    HPk�D3N0D+mp>�fs2J@0bbcw1cbHF 2
    )ZH2L',m,XP4mH<A`]Æ
    T
    ,GK{8%2
    ހhj�,aC6.CX6
    LtpՔf�V!GXʰ.
    LT"z�2BdCT _j#`<	J+�7JhC�AP
    Ԅ3 Ljm,b^�~1�HX-B�fQ#+!�j$�1`.U(CX)["�Ș,Om(LQT1
    XZV\WDU(EKQ7Q4O\cX,2f*,IlCXL
    S%aoBGgbwK,Z#X f�C,Xpl*vleC),QX�?n6>#S`maoea�˷"@ErpB`IX(3 ',n(@JJYX#$fM:QLWLwBC0=\HçxFqK�(nq�9
    �^:׼X@U0X.lUbF!7`ej%%WQX؀^�uXm-E|X%086Xd;cYg+Z2HG8@K*
    >0Py	\.0\
    2sPb
    u"h4P%u005`Q^d#�1i0E�la`-
    7aI8/[`1-cv/>q2xY-`8�6$kc
    /b0["9~uQ(|b2�.IalreIrR5fLXXQjX䠅8zg
    wXFKhbx7~hI9Jgn#Ma-@
    N`D,K�$!m8
    �,w:G7_Cn)6R%+VCv+J@6Á%sSoS#L1
    Xhlz`+x=d1Xi?Lx�Hg L7 ]&%KY8"
    a~2X83"X~am^ham4X2zk^r5aAc2V(�8i`/a[D dPV;R:h�`gK`JSh!`Q)W<K㣰 !u$={z=5b1~=>ӱ`Ӄ\HOQ+#�dxcH6&QH5lCoh`0u>:BPl�*od*vh:o)DWB
    zS3"Do.S
    �UX;ehw�DM`91Mh�R8;`)roX;bk	q8i@C_Q F(%ZjcG0xjtI@;vZig�h�J[pjOiQ8f0oS
    Uza ]WFx!R(Ǫ{DiHDo3%^9DP(`	4%\&l~
    T GPSY@R=R8bsȆ3knq`1^(�RdӨI_KE}8%1&ӐJ&CJh9bH!KJCb˲öB)4IHXt`qaQh$v*/L*˿LcI"%J2λ,ɴ̬/kd�Fp @p�	\j�)\E
    qltO(X8`	uB"[`
    \qMsrip?aqOp1q҄o@O,N[cJDsxYh#CO2ICIYp|Dqȷjm *7SŸ<*&PqգP
    >ZPeQo)=KQGZdѩ�< ee'e!"5I[\1D,ŕH.1%SRP)4U5e6Vy7Y,S/-5!#>u@5C,DeFuG@=V.a7F:8`=yGXSOQ
    
    qWZyȓCkQݓFp\^Ua-	deE=!UC8
    cdm%UGժqEUh֗`Uձ UiVC��E؄OUEHNJ@ՃWkezrWMWUو7A ExhCxX=ؐUٕpُ}Yٸ
    YeՎpEOFM؄LOȄGOLEGHXhLZxJPLWIOeOKhLM@ZK8Z۾Pp۸ I@EZhm=oS=ȋus<i-gl-C{ڈW}N
    FȢoC�M^@Ops`DrDE
    FoChU0Z-ݑxXXZpT[TXMXFpV@e__~t�NH_F	8ZNUV`eYh```
    Y[-\Cpj`wpnztqnċEn@	=CXhB@ mj0bjt�hGqj@{=vj8ophtw@v5q63f؛oXR >Rx>@]`p[8DrPdF`r%d"pxD[r0OsDx]yH8xCXB_ЅWo8E` _�*ea_vH0wJ
    chFuh+E[P`p^(inoNbha=gxiSgLFavrf_箰Dy0wHhsia茦p`~.^@GNޡCghN.:@B�VT_UX]Q
    MJ9<1Wf-
    QU֬XZ\iig>	]W!�gF0nd�c�~چgنD؅`x*thkP\8nN
    B>�H8cЅlF�bPJ_6WI@xx݄m ΒPbׯ�P[YQ[6Pfh*VnnLPdef6U}̀S(DHoh&JKSXT_('IxDfT(ϋHE@fb͸hJhT؆k&o_]��Qo	G@f�ND開oo?3o��ka@[3|$
    QPODQkJ@L@[OrHHإMcI�>LžVF(eCMCx$IZOڸe脣8Z fچNi[ N`HHnEDX&l`lgmFȵRT7	FQ(
    NDiDi"mҽadVgq`CHuUmBx^h03$'No8
    E8n׌BhVuƘPC8j2JS8nIHqwmRGpoxwG `DԈ3r�e[H/G@WMrVJ ivk
    _y͘e)DxpqljCFE8zwv]0�WWxZUb@Pr[F곇wKpmG/ކXtThDPp�af[ yLz8V.DrO0dHE؄;3>kjHd3[(q CyBx8XWY@N]rE0D fLL�DT߈t7h	[XC�yEDxP]?BdvL`fPp
    CfgvJah`EXeovqpor7e`H#"Lp!ÆBTȈR,M*5M"GE(Q%j,4,XFANIjP
    8DEMPAFS3VH�#^ }-mQVP!>)%Ee+5(aYƥ{KKq/1B%}.FL=hHW2B2Q,w `'n'Wcl!	ѷݰq(mPk3VT+g/BpG,7J`j$iY+Dg,EGtH`hZ):xջeϜ"-8	7XH2,3M'4ST2T	!#X'8(bвE}!B6ʍ1I,D梐C"Z-(12@"t3"(IX"RXdJH+PL,&
    &XMd
    j¦5D&Ĕ+\t"S.YUA#@�$I&&b�K�PM"|	&H(@B#|D묵"b74B"h�/|
    7kH#`S6<M#|^2|Jd"dM,0[!	3F.c8B=@A̲.0I&@Bi,@k�pIbp"SK�J,bN(Xr2\
    "P%%Ȇx<4`K9@8@}R364h 
    2H2	" c�~ȡhZw},}#Ҍ"TK'F';ZyJ�pl�˼bHBTZZ̙R|8$ά43�-\d"C݆'BT'%9ވZ<$+<b .("L*
    �dM*@"-HH0Ľ:hϔ4b	GlB6l"<9bOG	JD!XĂ*aB�EA#[Pc00PpK-r~	@el=4*AKd#�Oa$q
    PE�6q	JhB@r%O4bM�"	|"&&f pM,3L�`XzDF8"�/�H|'$�B @	\ь�,g0`11"�X%&9<9i3أnBԔiLc!+X>Qc1\"ٴeq>2F&ft�pb!ůdqURM@D8l#Y�ta4Bp"t	&c((&L(~
    `�(
    /gH"3aRРF?a3f+VWi%
    V$u1F3Ԡ&!Da'΀%$0Ј2|Uit!(*ÈH4C	XHuxk~-9FKa\CX;m!(5g3Q	>c89TbF34RCxG3e>i(0PQv)OюrF+(ˀ4x!(!m`tN@㼭zEipD6	t6W"8-JҺs(\aV06B)bM/
    e4Iu˄,^E)O̅%IZ$d^!E?l7*M$%#
    kˑr!҂17Is5nO=G7,Քag<?WsI#h0pφ.DY;3z͇^_"Y(fZ91lFd,ܓ]lE,
    S`(.6O+n!	Dp(*h!
    DL"-NX̂q	 1XЂu'[bcDQ	[Z;K`g^F\+f	DBێDgC\!x#Nc}x�^qnxhU0jxt	i!\#�v㜈y?s	0toU&#>DesZyBϮhoEt<za!d/,"&Z'b0ĠG,F1#b�XaYscA
    unYP߼&q"z@{#Bh.2VN{9wDDNBn)+[C?ҟ>o1	{bo?_?W??oXQ}TH�•u)2`:B`:9($b`j*"HB] `		:"B)
    ``
    	&(
    &%"PB¦2a:BaJRa6!'Xraz!.,aaR!*aa+Ba$B,a �R$ "fa"&b!#Bb$!Jb%Z%bb&aj! v$!*a(!j)#b+^"%b,,Ңrb-r'#&,!3\ڂ3(C3NV4T4:)l.~!+jc7!,:"C322(2\/,C226<r&|QT!*c�la&VB33B,0C:#<*C21,2X$F*C1,1$B*(6!7ޢ)@24ä,!A$<.$@R�\38-0)PP.P%/2!"L>2.2,B3+74v·l%yx%B4a6$rczB7pC%,a5@)5͡.e�L7X&p_.%f_e`"LD"k $7
    ?N6x?Fa0e~fR$h7\#OfiJi.ajCi2!82"$,3f)77.)64&d!Pa"8Qӄb>"G.a.5!,I61a!CstJ+
    �+C/T&,7B:|�p( 7'7|҂T,2#x<`#enJb4^GZX6dZ=Ē#8)(,!)$C+h�:aRj'(4@2L&\"P' C^'6((h"T6.60XB&dCہ&PB$8a-܃P\6BZi�%tyh&i!i*# '*=B6`B% N�̝jiif&>!$Pf'@V&%h@bVj"qBj
    ka"1p
    %^f$*b"L5LJ%VC^:$TB6*H%-!$jja2zHV"8BnM("h%)!(\֥&&2&3P)P*�ګ(kfhJ3*)�$lj&jCBl^kFk�T"Ĝk&B7>!-l•R.a,0v|!l,u2(B0i"@7Pg(20BN"ml2-B�B-K�\rÅ.!!m�ق.!l:ᩖf=5:4-*L+=TC(@q&18\1NB=,C#%]3×^C)$.Nb;+C,x
    /؃2x)5.r+f,,#i/-a6f?~l2Ớ&h7\ffB2azm5-$2d. 3,/6>24l" .!6bL_.n򢒒>a!4!96,×,˺,2,0B�jp@:0%Pc�v7B((2.BԪ^m*im2B#\L٪-0X16!&8#B=TC<>a.!2TB-8.'/6L;%&-+2C*&C(8C,:&"@+B0�9h*@!.B5lB0|))-,:>Xp8n~9h6C
    �8X2W9j62o'22().W/aNB06/&C�432+s/j",10p,o^
    fN0!(L6 '-r6>s#6,dBa	'5i5-C/p
    pbC#7;xDr"@0%٦mm� "/,8C!B324t3%|3xBpM$,öG�`)1(qRj�<d'x
    p+'.!+L8#CX$G66$4.)*B</{]?!,rr&@3(.K.[b6*:Swz5ddS3"#2D'4&o32d3%BKYsZs�db, 23l�m@0s7:@?-"q3.;l
    zRN>!׎mG_h/h{ZB3<"&%mt|KSPB,}5TB�0*0B2B65T;5q2646<'<C+ruZ+urHc&Cn:\u+"o___"52vrJ3L=x
    >0Sc64C4)B"x40p}>ƒr]I9)xwf8+x74.92Ch7x9:	{	j�|KR;]3&C4d
    )(ؾ7|?,Ln78H<(m9C&L#DB31L4"oP)4C(kC- B/X(Sc,b(@00%PR+BC3�6Ԃ:�$d#x/8p¸S1$cŐ44306.L&!hB8R|H!B(�""|CB8�T/ağ(8v5"B11<2Pu?B2P5x#T$ 1@̣(|+%f9d4C7h8@Bs
    84.(0L^B9la'okOD%P:S%J$DBg@}SB}ǦvKB$@}3/5av=!*%P0=$~SGwN/"$~!D>c~%4Ib7v 8|6h9h,C8L*KR9�RÅJ1ÉB6'\9L'4B9DC+(p*OK+/B069x'X6'LCoC-;/+d6i78/58@ @qX%.NM"�M\NDA9dI'QT$(V,a¬MT41g(d19hbDS|գYBZkW\q:lE$UmۉF;n]wuw.P|Uk`{6bǏO…<re˗C<漃n\袌M+Yukׯa{dgjA}}OZxqDnyLв()0zuױg׾{w{y[W$)&Ǘ?~}RnP	/QX)P$I[PDb8AQI,xĕP6<aF(EeQyGQ,#LR%lGFFi)Ad$X*i-t+Y,aD1d2sdLFLYD7ᔓ5ϼS=$VA	-CdFMEG!TI)mDH7Fج03B9`5457O3N4P5)_
    VHSeM,w5VW#V7LuMK.tP1DHTdO8UO:鄒Ta]\-Oq%V?C1=-@CٓE!@�1a:)Ê
    '|89&dEZLYb=	`YG~yPAv䐚9gmtH:QOnDM2ēLN0TD>DG0zG&^d\mdE`6\:dUlOdM*i3لOܓؑ9dq)\Xb[8`CA?�}g+VsacMYw.LnF iXnO	ǛsaNDx)Dt]~LGaZP^5]ZjבTlTE�,D\wWp`bv	\NO'LjZT0C&/Z#.!
    rЃb,H)vP),n]M0jL#p;
    z"<m4L�7p2>Q�2 A}�&W0QT7X7
    @b$D"l]"tB-!pB89ޡ
    t86ܑD&Bd�F7O\Ru''9Pj��8lqF$"H*[	uf
    D ";onM8<dqExC.^!
    QnZD/A_�c8Y7HW[}S1_0F4ш9)BPD0B`%@DP[$҈F0Ћf4ˆ$Llg02Ŋ�JJDxb@#|aa@M1L偊;NSi@R:^@ߤjC@f9,rd�EB8�l/n
    OS]dI(bh"!4)ˈW5!W<؄Z'JP@DbYVa+nP/�p*�Y�x2jQZW"'
    f@ ~
    fr5Dy\?�81taЕ.uZ?
    B8",!_o*�ʸD!EpSD3ZEEpD7#ʍL�2tNcӻ\=!qB$7Y )
    n40!	-%'f*qoL"CĎ{O�E�@ֈJd	0
    ()%]�@�
    
    K\9ˇ2)@̧B,"<o8"�޸D#Z;YೝݔU2!Ҩka�Hf#DOS8	k("1I|b(G* lbZ3& f,6p2l�]&!iHZvD�
    [X:wɱ DaHp ݌[4
    cٴ(D$*>b\{"؜#N,Éi]|?j؆%шDDlX"Q	uqe&
    
    x4Vl`BQo|*D3<-
    /|RdUNQq+A
    S~Pi#&H@"׸RT$8Y01�0B\bF+h0IP^G%]�F4F]މ-HΔgDBq
    Q~X?pLE
    X*AL|҉щg%`<h6bt8.qSliF*֪
    hq�3,ь}C5@Qz@B7y60:QG E-^!j
    K`ɦAJbt28иN(Ha:PAAIMlH,6A༡e$FN�n*HVA$MjNhn.pLn.	P.Of^U.NA$.Ha
    a.ꦮꮮfH(a$aP'<O
    LZZ
    NL%Ɇ,~n\f!A8<,ot!a|b!�4
    ^!�!|`0.A6*!VaA,!׊<tK/VlMa!-|a`!�%G7Iru>APJS0W0>$D΁
    
    !vzv~P§N8bdl4
    qNf!hrVLA&&~,ըa
    _&�~( (Aa831{LaLK f.yARʬdxMu,K43ArEl&da$A"6/A6d#m!�&!(>Hf!�!1;[!ؼaDabK!�n!
    XA^!aA<1! ݐa $B_ab!$C2G,ATZNA$anEӊk)Dc%!"^B2w䭾RD aAa�nIi!�J~+wfdtMbAnA!�SMR!!xGntfA~aMDpO�aQ!Q@lA"RmaRa<!fqL"rSel�FT%CUYnb=qAl&a�a`!ukXs$~`#A9	BpO=A(ADa@AJyaAdARAa*<!�2Aج/Z!:'l0'$A`!�OF68WF~aa
    LfLy6XF_A|ashom$�1<@
    &Njj}H߄!aA";rttjEA0V!nn*i#eFSzG�!$:;(sAqbB*Ew[E-*lAX!@tZA*,AuqWГz!xDJa؆"X
    !
    zwzKa2L!Aah_a8lA*avȁ^
    AAZl"a<TRaAlAAa|`!BP&Z!DAءvzAY#ztaB2a$
    Af8gXR~vWa:eMbtdA8nZE�X1%2TO^!laJ!^0FsBY"S0eLtLKZZ
    lMA'$kKEXefYbb&Ņb
    9qytlAaaeٕ	Fq�xٙU|wjL`^}`!:lA<`!rRa6,abeP0!�DJA6a�,cW0a
    vAVl!T&a8!0a H!ݖafNR~la`h`:I`f)IhAAHlnF<yNmA.pbƪeH&$[-TQ:trOfggtt.
    [dz_L`r
    El+fYo�lag'f#J
    a�mIaD&^afATagr촏aHQ#
    A:(7{X
    Fg[eZᶘy�O
    ׹XAI@(盰a�ߜ:DE!CK$EV$IhF$H=o	pQ%|9çJÍJDKD|K%:&ŧ<=\|A֣=d|q<?C}ǁ<ȅ@$A>A"gBE7c"z#-<ʉʵ|˅c69$rC4|ʣ8<8<ټ7ˋ$|ͼ9|ac/\8$NA. l#*#0?-9S@~aTA~a"}d'l=%62$b!d
    cӛbXgՇ]ڕO*#E32 !ֲ=�U~"(h� d-!q+ =Ī*B#ap2;hWh<j#�,0#!O.>8B=�<lta-A
    ׊k	1a"Dbpa	IB9H"fMb(	%	"#|aX*=NtNv"6[
    $Z@$
    "!%&$?&$?Xz4aanaa�AD^aiZa_?͇2a@ǯx.>bSb"*�HZ$cMju	@!|	,b"*!п7	�SBCT 0Q`Z,W "m.i;d0��"jCTH&=J#C+*`l*mLiL^jfA
    f4I[O(Ʃ�4Q[SJjը2VY\RR�Ķ*A
    P	�`ilaÃf*e8\$urVJ)Ƥװc˞M5(Vs+&Ĭg)j R�Q+FHٯ]{QAPL\[PO(�f9r4KOe+JVQR'o,Ad<7p",H7 !Mc/	!LXP,!"#
    'vHJR.t"ݬX1";"4.RP(8*#(c�Kd0)H�LeTNVUJh&.O׀8p4e2+SM(h�#3J1$ܒ&2wIN8
    !h�12t"-T
    4)|93u5Af=*Ẕ)eS+Fs͔29e&~)ܱ*(HR6΂2m�Sd1{_E SfwTh �`4Ba65L`XІ;1# L+1֥7iA0J7aP%%2d02ʌMVH#,È{fi0m*ͥ]}UQ%38RO5h[)B![3x	|LŽ.4*۔1C,E=|@1 
    !0(7zKV̀S-I5DӒK6([7h;߫	�$,C	"
    ol1LI74)-"Lܨn6{#*5n`7Gz˨R0w[%EPhZ�1Ld%*"1
    Ab y
    rqc&721,�FL͂q"cЄ[|cﰜ`*IO{Z4pF!daфb�gp'ȓ=*i+iF,q)f!TF!qa-d�bt"u3J
    y8#1.ibz$qeNV
    "VR~EV6{%^Ќ
    yϊA'K(`:pSE>D8H>"U{_Amgv߰WR<na􉃳@"
    fb�,Y`(0�hrB̨F&4;4cЛ0%0;qIQJzѐ+iPbf,iZ{rh))A2zB1V2L
    J
    
    Q
    E Ev\aTeFM+4Seqլ>Y?ܕOζUg|+l)�2�Г&S0CɰG
    OOԷDF.	O`HxGA(Y�%`Y ):f�'Te=7V7s
    a޸K�L2@1UF;aV A61hFL[M#9FLi"1ǑiG%&/d$h1.R|;E3ȣw%DracNe{IE><q
    "�W.ra˰Ď3x"P:E>@Q
    
    BUhf;$Q
    D 	"BI">QfV1ú
    1ٖ3bkM*enЏHq8@-)dl)+	M}H&̑
    4k_Թ�m�~ĺ .%ѹAA	Nۙ M$HF-Ml,0Ǧj,⡒$mmD%$A b讈"rC-,$(E [w]{gD6!cІ6aY#ވ*2t	R5$c\Lz:^ň4"a_QE8Bn|YgX!C A0px4W!pqu='];b7`Y܇gVc QU!E_74Sbv"C18x\4;xِ67s>xI+fOiRrZ?C{\4<w_`rF(y,7
    y'(4T˵g3W׽kW"` 	*ݟEXϿ,z5ݗW}W~
    lz>1M@	0�x؁ x�
    (*p,84X6x8؁
    P9@B8DXFx8
    H؄F>TH@	p	@�^`b8dXfxh
    ]pr8`t|؇~H
    x؈~
    Xb؉!p4P84hpHX((�x@�m8�8XxHlx(،8芳hCh܈848xxpX`Ը؏08�i8X
    i0h	Y �	p		@	p2!)	H
    >ʨ	=)�‰`m@pQy0WI[y]H`_OQٕcIXVQ9bY(_0zɗii						В8ɋ0	8			0 		inPXi?ٜ9�](`0Y
    Y	)H�P-%ɛ)�*ٝ	h�	
    p@]�MwߠP꠴
    c١xBYP�
    `|`ESf	p4HX-: 8@๋|	2`H	`0H�MʅP*Tz0Z^:`0?֓0
    0
    `
    
    Ք
    `Cp/
    P>Ř~Z@f z0qz
    
    ŀ@	zZ
    y8��畉 ҊԸp
    
     \
     d
    	�p
    � 
    Lys+p><=
    �	0
    0 	P'[)kP
     2˳>�А	)�B0;;V멞 ^
    `I]+
    @hmrt{UzQTs�Q@@t
    Ea8`0
    Q
    `=84֙Qٍ؅	8akiܰ	�/G�`P��
    r
    Yp�
    	jP	Ċ;䫎�pƠ0�Ky
    b	܀`		'@�CBuY)
    ok
    
    X™*Ƞ;p
    	
    Ai	
    Pv
    ^
    P	`
    	Zաp:{U7�[C	J[lK{��[6�
    huL
    .
    O D
    �pgȧȒ<�Ȥȷe  
    	L(i�			&	o
    
    9p
    Y1H�
    p
    	Z				�*	`	`Ÿ8�`p	P2�
     
    	߰�SG	
    F
    �@͡
    @E7j-
    	Ñ?miP3@<f`	5
    9,� �
    а$
    �m	H\;i#9pP
    "y@0I@
    pSO~ဓSLךեP
    	e	wדG0~�`0+�ʀ�@Myo
    xٜP
    +bl�ڨ{z-ڗM\hQA
    
     
    � 	d �	
    p
    Z
    �
    �
    C@°
    ̀	P[
    2@0
    ;`@�
    	;@ 	 �`x!PO0O[M	mU)ݔ؊ڈ_`�H!>Np@ʐ	�
    }Rϐ΄,;|�
    J}&LQMS]O JP
    �=֤@ L<	kג֥@@
    @	 	zד�
    Ca]౾EPg	ڸ(
    (-Cz�
    pڈ�
    pڳ]۬ہYи`p]2'$F`	^|	R
    @!0	 
    0@Z
    70}
     )ހ
    𨨉B
    NRt*P	Qu/<}9
    ;D@І@ FJ(E	։%¸P
    �`!
    L\:}�[j$Pš`xP=YPS> 
    �D^;԰U9k
    Ð	o
    Cy>ŨNl�ey�%ỏPP
    S
    @p¿^@
    0
    ۍ
    paȊ	 	lπ�]xi@�	
    =mv &F�iLmJ"Qj,c$JܫX6i["I݌˔YEDUVLIY@ۥ-@,s	%h7FLɂF%tf-@[#}Z4-PmΥ[]yߺF\#C)2蛤D!z6DLaU)aС액^}h$WR!FI%nrZȑ,KVT$g@HѳX^EuZڹ{@-:"*TP*yd	zQ	F YǗX^ifn%EIpDT&�i	Tٓ![Q1đE>FPfU|Yē$ĔwYhrRF -G$1ga'N	�&uI0gXb!gDs8kAFT1E8eAHh*!l`$BF$�hT	`K(Do,Q䓓<iDYt"dPfI&H<QLNΩj|df�٥n%KF2;h1NyӧK	`@Dh 4teEh
    qd�UɊ�dlw3`K0mW)DYe8�[YJ:aAD&�(f�TcM7Fx
    oA$kFDu&�ŒQFeQDLNjfdL瑑fϽ�`K&yphFKyFghmbXgw
    D]$JRDVqg9+o
    V>faY$gDs?b\]RU*fDF~&d\㟃^DhLuY杋_Fg]n-thAEgvryCG5
    lA
    U�C *qeܣE5Tm4xaHX=S]4b[�!p*j1w C�<
    E,@LaD$`HD*DPb>A=Qc`眃jF!'
    c@Ϝ1aŭ]O@/!
    M(-ː2!7q�2!WDb�E-lQ
    FlYa*&!$IbD%	Uҕ$v葌p\C(D#"DC�S|T]`qՈiG83
    Ql"pAo \D9sts!gYq˛OiOs,jSxE-jpVU2	y8D*vCXb@*L	L	@D)t˜.Nqq¦X-@q
    ⥡hEJW"-I-T1�IL!XIe�DJXB�(-UUl[&
    [.XER1!K$lafFޥ-DJRDd'떐1FX؂IB(ɔ7Al
    1�@4e˴maLr\Z.8!nKVmM(b)"V\ B
    /:"TD!M
    oy1F̗۵liv.¾4D(j_hwĵ"]y]n+\s.X!/tM]X+oӶkxlcxoIA\#'Y
    j$Un"ȋ+Y[O̗6i#bqwYkfsf8Yj#9Y{sMσ&t
    }hDKVt6VC�"T$iLgZӛ1NΌDg)jT'+ؙmjXZֳum}XkH}k`֊ĥz-ld'[fviTBΦv}mlg[涳!
    Vt[ܱN%bq{ي$g!�[w}o|[F+8o\"d1	'\gxoTx-~qg\8(Xq;`DMp7>yGm~sG;y}{yɇG8̙^q?]=ԭ~ug}Bzu',)4CP3ьȻ`	WwyYw:uU"ь_cP2q_,#x;,|GEcysBS�}f CXF1ac,80ǀ*
    Z\Rs3}�h$(
    ׏/Wno,x_ΰżNx#bHFV()b`-oH,˨FC|877Ono
    E�K`#Kn,AL7>+8\X
    oX{[=m`9ԷIІoػK0½%&7dVxwˆS8oo@]8SMhCȷD1PBXy(ԷPHzfQV8XІen(Dl�Y@sFlXR@Rn`X_ĖKYG@;EKпehy{(XVt>GpRQ0?7PiAepMDÒDOlkMx#E;P,al/pJ`y]1$4x�KHBLB�H<ax57e]ЈBLɰW�xHMH0ܻlЄ"HzJl"�X=Jt�I&TI)8yCc(xbpHJlI xÆE(÷kpJz;8WPxF�P˛s�m(Ib(b<D�fA\ ysKG8Q:B`0)j �K7X<WpkDPȈe)kt�%z;b7Þʒ�`yӆyC;Ky[yKn8Gy1_�pz͞McC�N\xJ]�d)hFwBExN�=CB� zaЈtEnpEl�OdOԈ)7ܔ,zu�hHNTW {P`If(Ifp�8PzJg RP
    Q[>iNJԈ�d<\f7UMdm,OWnpLJ(LCem'm֓MLܤDyÆ$M07GQ`x+b0pԈYټMY D�ah$Lp@[x[n>JhTQPBNx=7l�O`ȎVOHqF8zx`NF\C�eZp\�OJlvJ8Jr(
    T؆R؄[agu0d`0IYz T|0\a�8{nbl
    c)?}US]:FXjRkd"}EB`R0lp(mIyk[7,7]e=L1,x;SԜKh;<>6@b�0IȄlXCZ7MSLBCDC=BL(z� Ť7rqNNqp S7[uxo[O�BYy1񅥁g(Y;7ftxrOpOZnhisMĄS8؅[RpG_H1	%
    7Vǁo?mHʅmX
    9h`dU!%R#ŕ=>eR`u@Ԉ=C YF;dR(əљ8qR�YKSz|Ԉ`ګ5T	6yD`4wN][zc`g[SNzCO[Wz\OZxf4\Z�aዉSϵ@bHE`XdZX_PRm(I[x�x}_3EބU6n^8η9XX^3fPdWq?
    ;RxmDnZQ@G8S`5dO7hdMS5eBPl�
    |oNVy[vBoZFt0¥ISԦ4c7Ulw@dWxՈM0"o`SM$nf7Y[݆o0qidu6@QyMqLFf�cۖGShU�Z@^QņYPDbydsWu0W8E	h8Xp87DiHDoDF,i�ƞJ;N<8^{cX@STe�GHcK@-fHHR88WحH@U:zsȆlnq0�0t_ N苈軄rĸџXJ7IHxAC설hGɦl^SH,Ύ$7EG NlٌmئmvmJR[N^ɖ&n|,I�`n1AqmІsYpAe[�Sr(?PXjpEi8a^txFiO0hhsUq^lu$	WCCZ`7ah@pBqԄoհqhQkDs`YHNC qej�޹jm Vq�P>>NeS,peV͟mn}޷/r-<$rYYdm|r0:)Ml|{sx÷Dp3s-_r5%s4s=g4w9DIX{�Kx}CBtss-q$tKCuR/uztt(;Yp5u{5^uu#6cu\uk6iu_u`vaoa6sCcuv3Tw;vkW'@kvnoEۓnwqwr/kV0wI#5SSwq_5jla#F蛲b
    }y'"@2/x``)WX1Gϋ}x*ydFwx/.C,:
    3yz_,HE؄Ox$EON
    yFhz@7%F.cRC-#q'ᐡC85gkp
    {R{
    书G{{�0k(zEO4IЄM(OȄGOL7G_ֶ?"ϋ*/mhK8%OIɟ|OMMτMO2z(z7/;1q|iQ7}MP	1PZG {-�oC�d^@O>or�^	r	|C'RhEG\#Ȑ"GȈR,MM
    U#Glh"F.-ZD.u2(EpU*Z1@%N@aֲ"D,dD֣nTlZ0gh�ݴw{+nFLY@pM6̝;nJM<n!*(7Hf
    UgvTVKE̩H`Q"R""[C%
    9sﴡ^9miMƉn(.pӯoZq�+c!$L9 .&T-7tcJ"x!#/h$9ň%8,d1r"h/"!PMQ!�^n䒁Ab;UF]%~'MD/@4M(-/̘YЛ$R4C:0,"3dd#L;/(@%< KpS}**JmRD�E*4Ĥ̫K,C!83# -�+`�'	7-x#0T.#"",J"&0%('xA&&>h"o䤯Q`@,* Ǧ�Ƶh)o"'Ҍ�pC23\3=iN$"I/M.5A܈.r	XRň!"@%+b92҈(,2!)L+L*%TB$db8.rGjY}(8$7L!F@"Ls"pK!~"Hꕬ*$|H_<ӈĜVR	A0vB2;!P)%t.�%{�7>| K}37HH�׈m_QeDB:#,]yx(	n B HX	k("E}b(G* lbD#4KmQ!N1M("#>E<ZaTRX_Xz%OPM!J[@eV f܂,Q�cH-
    1o&,)A?(6m.gBMp$T!E0H6W
    t7`cp`$#vq
    h4щIO1SfogR&{9N8E5s05LqRp
    $ I8"DYj<"ᘄ:y|>O
    "b1ư�[,㊈x-:Aƨ|.:JՐF+vы100pP<D(1	G,]M]X`N\W<P4DhDp҉g%`<h6bt@*.fPcx%AfX(xCB`!iE%aKx"rG�:hQW .n@,iB)#2QL&ns[!R!"@qCq\KJIkQB@ʠ22h"�G�^x&y,S["VIEL1d3Ւ5pRLCo�Ƙ~w79ѩNI!HA
    J,j&$j@#QfYFbLxQN׈bE3=7bp*D
    =R$8ԥ�E5
    і^])x:&9X8F�r|3p<8!lo$&F9�΀E'T�p,CV!<BLixG/4!UBEQpw<pǍډV"h;AV`@Nd~v!]Cb!q{	D(76SkI0h<#D4,؆*t#,ymKb!�O$k4qpe2Sr[
    D1ri&	#"0P7dH
    '�)D8se@7<x0p’BH"ߌP6ꁍwclC1RbaE#A)̘D	Bo�j/`\@?+vwQ�L"DS̓f"�Ј
    HP!82@"~' D4
    HƐQ	uQ7N*z�Mİ]9"㖇uW#]+eWymG09Hr8[ކZ8wg(mxc͠3R
    #B1 !Q@@(3@+D� BxY RF� CF%x'DI:B,B#<B4(0BD*d6B#@4-H iĠ:j4>4-LFN$('zH6ۋX-`a#,'z8$B-#@C.$;86[T@1-P$9,BNLY!N"LY-b,B0 @-@�h4T!\B60i0$@)8^,`4HZ[P&7 6BZ"N�!,Cw1*2 B3$`&1z,*6`B�h KC)B2t$D-ق#l'a$DB�<B�B3 ѩ;*Vg/t#L6D?p B=�(BGP*@1JI-�^RB!p
    Z$_7�<XC$<
    i9B ƛ7<"5,a%%؅2HCC).H#$Q*QK&8<sL%BA0@4"\II՚1(
    %@4P�D80xe1%4
    MT
    1("+$Q381_򥛠(D3@/6cOd"P4\E(B)0B$44@C4$@j&l(ED0LCE)92,;L+l<<'IK!8Cf93HC%A;,.9P;!�/1|B<G<T,1;:<;@$ 4L.>�*/8C;T,\)B",;,/G"B640C9B; $F1Ph8d$(B&`i>B!,mBQQvC7iJ1K"�
    ./L4(C#(.HCt"$4h"z�ee,B$�)BWL`'l*LBJB.l"@B^)*l8S$،bVN&JDNB$Et$hN:*J̡B*4BFT(p0!p!j"jū*�jj&EE-)+,R-y[z,,!.l!X,')`&"_pk+lB,&,D,h+;-$B,-(&)X+$\)2B#,anBM&,+-Tl$B+`ƚ	>*Ђ($&dP(LԨ5)-U.ET,`<F*#--x�(D�#ΉN�ܼpShYj*؂PLΟ¬
    jb!B}ޖFنE
    IՆ&
    �i!D6�ȕz,BVnw&N,H*ЭV^ ݎ-M*""ޮ}Ȭ٭!$.2n~ndX~NRdz.TV/%foH	6BqbmbVzł[�/Ư/֯
    #p/�KJ�0'/0˯#TGM~N0go0w02~xolI0
    '0#\B,)%ǰ0
    װ
    0˰(K0ð"H+'/17Ӱ"B)W_1go1w'('(1+%,�(Ʊ1ױ111  "
    2"'"/2#7r(8$O2%W%_2&g&O2(&2+#2)7�‹q)1'2+!2-2%C-.2/2(w/O(.r*11W+'3%23?.24O35W5K20_3 6o1;*)h(B1<%-824q%@C:Z&l2w ;3?$K+14/!C2(2\/,C2C;c7E&1*X-01&,C1$1220$2tM1@*q%44@%gs2@24ǁ(.u(B$,2Q1*P-14C1"luW7s#4C*"31.C+71$2r�u+ܵB4'g>W5{B7pC%b5|7c_"B`[JPdo7tfgg[#(:"Bwb%p1J"@+6|H$hC4os�HoppDZ@"$,+bAC67.)6&!q"pIYc>h4(> 3"7$9B6,r76�@-9w32jwу'/@8aW"51G,Ļt%u17[x2 --5*|"(42|&\"'<K_'l˵9(8!0X8`%ׂ-=Ji%\6N{y�Cs5bn59>
    #w+=(&Tg+�敇&�":��w6hn'zC%ıy4%h`'Xz�pp4(&JC)q,h,QBJY)JBJ16,B1�_U‘q5OB5b+$^*T"j"6©#;΂96H0 B14"däWC>#.C12!0C5\c:;(;OO\6Du@_wXx+Eı6L:Oq124&aq""B /Q�ܚ<(Bʗ3B߼<{DZ(09{©"#;y!R�r+}zױ-]�X}qÈw=ׇؗ}�oσ)5:4=*L+=TC(@Bw'18b+3xOB=,C#]35".Lc;�)Чj?ö4(>(:;c=Zo<(f>(B+{<q'&\K7Pc}eBb, 2,6B�bOV#3'2=(bCTO<~ϱw~q!D"96@
    ʃġnE`AZan
    S�.iUݼX)cAQʖ
    P"1JRѤ1�F1[�ܔ ӥJJՈjY4&'ѩz,h)�hR-gaItQ:F*@2[@.U3Mr딺UAZ`iS,\m
    4Q%lSm&FdjCpK3VI~{v۹w|X7/2OHn>@#bt~⤭Za	$(fqđYR/YF8J۰CPp.%MJ|EdDC C&$h@|٥D*L.ц@RL*&KȡE^^iEp~)'5uͤ
    �`l)# D|g
    RU40t!ǒOdIn$YjTQ  e[!LN9E	Yk}	n>	`9yOL)L#W
    CD12jo*8+Hxѥ:=t#O	h%܃O>껯|&EO	@a&&8|BH
    9D="g*ԗ�d(a^ar b#aEf!)}hn3ihv1fΔ't1gT39TOzE@	Ь<
    j+hQd”nK5:YHԂqRUIfZV[gh
    ygZ9Ɣa=2֣J	Z٩X0܉G0U\Z/eǎٻ0ޞ{Ozv}5RA�%Or`h"`IQySU%M_#hc?Bf
    zn)i;71y7s
    D,�*
    b
    P [�w/�M#!7S 5TȍolP-x
    `,FzCQ(&I0boE3шc	#f,I*F-Kb,A"l@4DWXG3Z#<B1Z1|$Ԥ
    g @Ӷ]�"r1D Z"ԗC@�+}P@#LFA�}&j7\CHF�RAG(cW|D2v;|F8#kF�qzySK&̑
    44*�U(8w�?/QmR]fFP%(HU�AQLg�(G=:QJ|%-"䴡H@b)=FYBx	EXS(:ikBL	%$!T&䨕 j�lp#2C8
    m#EG8�H8r	렆Rqa�'.qi|E9
    rHƃBl0*$tC9<HXF!p8N5h|X51cl@[d45�X�B\й6AbB<8
    f/E7?o\C)=o
    NF
    o:_ڮ~@׿ڹW^;E0w`')bV8�p~(+QI\)+aw)qb	9ֱ}YLa:%5�#IVd'?F^#\DDYIW\f3MVD*JQ4q\g;̉+g%'\1+`P,.<ґ)]iK_ә�P8ZӡIFP"�uYjWֱ# jY׹yk_ՌE+]I3"D#`AQPjFvĵLmk;b۶v-q�VٽnGh]o{ߛMo݈ZBi#%{[�~tAFf7#MpkWۍI^o4@-{�wp#/7A8ͫpsPąt	7#,hGH[@$M|bኸ':	J�^ok]t[ߚw	C@!v�t?;z0ՍE(>|jʏW|7z8D#>08ZNxBՒ&2	Od,&<avs?br#`*nv$M(Bݎ$/pO"X""0'�PQwxػ%q	}6Vo/<(a:642!o,$O.~/@>a[0N*N<Э/>Zbơ/ʡt-BanP
    
    nj!!lP6(8.]�$p-�*jm�6aҎlҐ:@QIQnRZq_`na?଍�!aaAAO�!>o޴{`ዪm�&!^ϭU`ap�jfa ̡4q
    m6ᰰpvX~!N!IpA$ZA
    ZVA!Vr!aA&A%BLv!"(r~a !D/*AN)q\AqnA!ݪ.ڦ!d4~A^A
    ~Rs0j+?r+.nی!aaAAlAx$23DH!AZ6s33$!SRN‡a5zA
    ls`P.:=AP:SX: s={=/veHf=8a`
    na<am0rXE̼n^XBjA0!&o�F 4nbp--Aa$DڴFnNf.o!P!Lan!E4	BtEVp2P!H
    J(Z-�A8aLa8�$$xQ'1JtD/JaS;(Mp2!t`U[UA̒fK5A$.a"6a/R8�O$aZ>OL8.A*/c2![C"SWO2
    N"a �!
    Ծ$P&!P`b�d#(VMPaa5a	( 8a�@J,d5VR �A-
    `a\O<vh�irQXAʴ8&(!AD!8Q z@!XJ>! G
    hbu$.Na/DaB! Ж2ʮt./CR .[A�>V@o#*n /U(>!!,xbL� P47�)!6"a<A
    N($!4Ե(O(a
    UC0�\Ya36Ld|A`IV!\M]#!:K56KWS881Y!AX-ngaY ^{:>a!g!P.]GOpҮ^+LP !`+{47&9ȁba1�xVS�la_OkQX*�RyE9S5�laF|yu!!||yT\hTAa`kw7:AdA ab&cPa_a(ȡfxA!'+a8*z>aGL9Axā<2!pA!qA@bapoL+n!d?ZA8p8X�AJas
    Al(A�x,8q!/iMJ3A(8Z
    AhaAل}GӘgؓzaCqX+Q-6Ta'nBVA$8c[ɘ\\qDQmJa!3J(_%aK1)(!oy |2;э2$yWZRy5VaZV͖-f!V[W/!|ui9A|bn+y
    LVaMlJ`0a9!`*-8t>ypaNa(�(<"`K%A21AVJa@!7$	ιJ!<$`騼Ja5CHH#A:*VA@!CO!I4dpAF)!"�*|lmAXDZAV3aTSXFaCRA;{M)Z]�rzAVڎxǜ{-0b5,\U\GfʁUspA>/8n!]808C?M]%vaod-풷�VdIᱪ?㾡$!eaa
    ahF6vH͟ #bG(2Ĝ0"8c A�!La/	Vt`$Ea0DO�ph,>*lL7D@,4ږ7KǪ-H8J@ۅ,oΜ9¶Cވ"*@`Eۤ7D.݆-NR[�(E
    7DV,UBڦ`5Z�j↊CF,B@:g	x,`&pCH@#JVH�"TA.4,XDjHѨk8nR#ȶq=`T+ċ?<yqGl5Sd7I<iC4=m3#˛?^�(u[x�&n[ȑ,K!L,0J1"#@*H#<K�D3�"LHj^�Zz9B+�Y#x%Hc1BI,X#K,4H3"¤r	J6ؤ4""0$"$#y4fFC48'iۨ"#28M.{4Jb;,Hp1 .P3�K,0򌨤.j-׈*g"t!�,
    bB@S	!d�#N2"	4�M,@J�\B&<ʅ,2]�+0
    + Ҍ1`.),'S	v S#B0c	%tp"Ӕ"J5(B((6Jc8$\I�ؤ
    $@&	8tH3
    "4)6P"&|r	'7.2
    "4*C,�/�XrsL!cI2#юҐ%L2<ӊ3tÔM%PlsH!<#xt'\҈,/_($d�s6-t7ȃ޹N\pوr"+R
    �܉@]x|p\<HL_h7 5`#N"BzX2@#H#Io?,wscP"h�(HH41>]a `g<p4AR0%,Fd(.b0$%JG`E"Dg8
    Tx@4EDDDĈa(p#"i\B4(B"k\#[-4D
    SX2WlC|d@-P!gH|h2vqrP8�x!
    hI<!u#(:R!R8{D2QupD5	Dxp�xED`H
    |B2g48>کa"D*ܱ^p&Rb|8G3"`4pnl̀!f,9rÐh*_dprW"H3,QQM2
    Vj&#SP@F3QR2u|hST(/ҁ` ߀20`U(+3*`u8'nDЕsЯ(a*#JF4	Y#�'xE$@
    [`w>1FB7D.&:QOmnQ%E&HpG1jBrƉ*UOvD肗�Ю,&4-KE("%{ʗzUK7-#q1Y(fZ,I-lqf
    ,]lE,؈
    S`S,nbh&dHB'$Eb
    ,.6
    S-NQ	[�yE&(�CXE
    3GE,DaUB.L	Z;*
    a
    ^x,f8
    ]|б$Z
    XB+pf-*1<"8ahXP*,nKY\BśKAQ'xY8)XaI<boqfb#"TkCh)":qs("NaSb<(+atbݏ0�S)X}vɵQ#нZQlx�4p&y-őÈU9='[!"Dy/Mr9r\}խ\ۇ0#rWS(P!A<6M]}4pߋ"
    Eܔ*fqd1!#n46{nBHzxF=Ť+m?fp.uZL!=7ڶ"x=!EďDZOMëxߕgJܩrCGADƷ_^BqyŮy;
    {_r~<̲Ԡ	|A�
    x
    0
    }đ0
    H#�A"$UŁ}#;gY#!^/1(3H5h70(�"?A(/:CIKȄM8GN(Sa6 fVtTM$]fQ�`ȅeP^%]gfSцq	Q9rnx	=eU(H8M
    PTȈ舎 -hP
    (Hh 
    hU@	#7苿(Hh�EvȌ0	Hh׈h0
    (Hh
    !sB(�	8(i	Ɏ騐
    iXᨏ	yɑ	!)Ȑ#Ɍi(`x
    )s:%!X	@hB=	x)iIp7ƠʀːPRы̘x
    pP	pHp
    ֋0
    NdA0ٌ
    \U9ưʐp�	
    )%Y3),@0,Ў`J@e0 -ً0
    .;
    6	
    ќ
    XiH鋞
    ܐ Ӌ(�i	6
    09F|	`.Q	
    )�
    �}P!8	
    C�`*	
    ڋLً
    ;
    p
    p߀
    p,P�s	,�[!pAX@Ð	h`Là
    	�|0
     0Kp
    0S@P
    �*	`ə@
    Pprً'H		ւ
    TH-DZމ0	٠x	`XLPp	ږX0z
    oW4<`xYـ	p
    �`	)	Ћ	J	ذ2GF#ڍP
    2ŀ@	"	&ۋذŀ
    x
    Y	հ8	^�큣0	ހY 	#lx
    Z
    q0P 
    	@@
    0I
    }ًpِlC{K9ڋp
    Ҡ�6Ȓڀ660Jꋉ
    )1:p Q+k0�݀бZѼ[ԫT@ p
    S뾾HX@
    h	P!�
    {
    p
    �RV
    ?)P
    ӐĠP+	
     ipŰ4Р,a�@@0
    \*	͐C	+p
    �Ā,0
    Tp`Р$[\0qH̶ѵb[h+
    cȽX
     
    ȍ34۠싩@QH[¨#K��ې;*:cQ: p:�``ۋ
    `jpN0I܋P�+5K[ p
    L@�P		;7p	
    	
    f̰P
    piP
    
    k
    =]
    P@P@;k	`	
    נUՠ
    p�
    
    	Ͱ
    � P
    @	�
    yxcP	€�/=-
    Se|K��4P닄 
    p{ِؐ
    @2zu9P	P`ȇl iːȗ	�\Ɋp%ҋPʭ6lۉ*"|0K<	ʣ0?J|�ɪܽ;ͼOh͊K
    Z
    @P׻@P[h߰
    u�,ۋ)@2P6'<&�ɀ@		|
    9S	pĠ8P^; џd
    ,Jwm
    Yn
    KTೞrT
    
    m@	ϰh�Rk	P`66S
    `׏	�Dz,!
    ߋ؏x
    �	 yě}:)DŽ5
    I�͠۰<ۘʚ܋/ɚ�*Y^yP6
    !YH
    ":3c
    ;=Pŋ}м``>{غ.NBп<30S!̠̠
    @@
    `
    
    	xs<
    !6`b"c.]~�6ɐH`İܽ
    
    jJ;	p�
    IʀPڒ UPl6ؐkoƯ	y+LǷ~ڿ8u{
    ˠ	ۑl뭉>λ=(
    x(�J�|,
     eG9
    -uLԍz,8�
    
    R	[I,`}
    \
    n
    f`8?̽	
    M/. Rp@
    
    8:
    �Q(mXX BF1dYIv
    ٢F0"*!	T&հZzY�f(HM+Uk&�[-uzp$X2ئXIZ)0%*ePaJP+%qk߲�pi \p~:S_HF*QV/^r4RYް1"v*d
    1\)�&F¢~H�Tɺ6M.!BxrΡC~jB^xZh^`!2,@*b(Y`d1b/@N[	/DhTɮ,fqđY -snDz�L_q`Z/)'+CNnG7H2JNH"I%
    	o�% IJrJ
    E$H�-RdL6!y4$	6!RN9#1SH.I(s%%AT:rK&b@fog'o0aH]є)'(P֡3iF O.9gOʑFriP%z9ggچXqGhф4ViCFmyQ{ŜbdYGTї1G�6QјQ�4!VĹejFEU
    EQ9gp)s?Vn![	'CH6Pgyg
    Sq&Car}<ƚjцeRE0k|lSHeh
    /\osorpG<Hgm(	Е/Qz<lsspY|ug/kqڳNp"\ptNib'M}2hfnqvI׾svovD`J6HI|qE~%7
    <3ྦྷg|
    T 8`W@
    �dA	E'Da
    UBЅ/	W"1au*B
    y8D"шGDbR0Ob8E*VъWDb"D
    ,vQD,&D/,*K0�oc8G:юwc(G"nc 9HBƱ&�YHF6ґd$Ubd&5INvғ#1VҔsdD&bQFҕcda	FdD#niBGؒ'-ER,1}Ke6әϼ#@Ӛf6yL"%g89NrӜd0mBf&T:Ј\И'#9x>|	YDaҗ%B͹P6ԡ1@ʈ64l�0QnbbhHiP\ܴ1x:D/OSb(qOF0ORHB&5ETlvSߴ%qCR�0!L,b�AUSd}XV10[կUr"�yW6�z+]zͱX[ka&v贤;щLuը'>aDV#zB0#&>s"&G̶&:QfokLxb=n'	EL(D$`{KFwLnv]R$&hj~b(oOJuD!a2݄q˔ʒl$ZXb�8zOXCT~^`uaaKޠpBP@LukYZ-pO";D-Rq-!;pMqf1#ja$9)-lS9m$�!(	*<f.gj-tوʒ 50G2AwhІ<�0#\Yb9"l5_%iQC鈅0pȣ8htC蠵<U8F- Qqlb}bjW؜h+!`J..DKyokF8a
    2+/#qx&]BZ7^�Ƴ@qa\<1QuG]~wCSM## iDc0"4aE(D`ܖ:E"!hCo_.bJȄP/^!l<Ld_0}mvyȿ`0ԕmF}i(|}(G0e@ź>QL"XD!edVg"	w9DP!3B("DX/~vC !
    `�dь�BpCp41Oyl�G$a] b@�?�$](5Fh7#'FdWd]BP57b
    �eI0o0RfhSnE;:nAw](9S@Z9wS(DHo 	#Di8EHnB8o0oVJJBF@C8oH0D C3T4[qFV*;TsHBBJغ"��Q@=o?C� ;l0S&DooF;DMENBx9n_ �DlXhH EO�Y(]Bbr8-b.j�hPCl Nh2/D_ؒmoB8K`g@QXMG`N0g�L8o`C�f��P?
    Tq?G,m0HHN4MH\Jܦa$Y,cH~LgAH0Wg#BL`AoD`RoTlLD9̦ t'E8S:\jJS8iI	­,jxHzKH˷|r8ZBX^^R\e@-DxZP͛U(Dpc%DLgjVت�ȅdDJ� 4pDCkG F ExM:%UPEU`BDLphZҌ+![X}�PlRH;W{KpS`d(kL(dsp>�{xbj`Wf b=Dg(@NxBsFsP	.mS2TDRDPP(
    &I(gq+/tI3>*SUPI�J$ ʟ4J1E�,53Dzc:Rt`x_h$cK,jE6th:iJ[ʍID2^x9_bhg;HpLԥ:mahgX*_@ΜYqHg04MD�jxA+KMQͲM;qXipu#j3]:N8PNxMxdpGPd	�WzPK\PSFPK{Xxlpe(e[:�KxgnWzu{T@Ce&P}U,Q|u&RMKPg
    \UQ7X"K'A;=|(%%Dr(CX_R[Q L@CHjҾj^�GoH#ٍK]tIMKè52BCV*aZ=D>CrF(z8GV"F@lmЧ�ЅKQE YmT`(NTN`Gs	P<SUhpZr[ oH�E�l[En8OIYOPRZHV=O	ODo0qf�X8o�p�rZsEtXX�Y"נטߔWs)[hE06-Dd_NQv;MhHI
    �X'B`T(D8Q'H`T0ExKOg82JCZԔUJ�OD_uXxFxf\EЗ&HlT0iTaV_@ai\G "i@h0i`-^DHOĆmP
    qb[FXOgS-Sxsh-b0SpgSnPJKA2[I�sXT?EZǍ,
    gPgXHT�gѭfXLWXC�lV�"FFXLX0M(SPlG^ֆNsPeRp+$8I؆���pfhΒwZ8+|FMW5g*WE(1jetP̘_&;g`Wx)�NC{x9xGkXvIsmK'eT]yJHLxpxw3'9x_aiE=s{g0bhJ/*[axb8J45:hhjgTV=xg8{VTh{>`hGXHphg^ *g@R&E(Uh.Ffd_hhk.5TD2JHwi
    H`TXh e=s\8F`^\PpiC jhJvo(.ij@`Їmoe]8q�+EhmPichVyPh] v@hnEgKUd@J]
    .sfJwsnkc0d{6i')y$)xpEie-haLW\R)+„O1T.\#OqE qz„	¤TYo:&C@�EF(+4sqCd7qN"\E+!G~nB@�*&E (r*_++,g'VMr7s:s3ǢۢWU[*OXjHXU�(QFxXXЫRЅM8KKY] UP8OIU؄Wo�L1[�Tt
    	VτtBwY[F^ZPU`@T�va'vWzwkSp[߫\ಿ9#Q|6pH(	Z[,}<iªu1*DХ$z'{wvo-Bve7gn,x,ʪxEpת=;CwmRB 4DD6bL1ECÚE߸+x箪yjw{wC4r4vEvOyrpwYz	y5
    \#0{>#CJKRH$KQ*%TZV{gXZ)27!!R|/! rǧO%j"|,".$#1"|4R)!xg	o} 
    7ן}}
    G_ϠW~�~'燠a~rf
    I8pqbx_MNnㅈJ0M0o p "L Q!;)9E0ѱeLje$TiXx2�X+5+l,fƒST0cːEHDOm3bͪu+׮^n
    ,ل54P4٢,IղvD4Y%)k&YP4|2j٢WVō eM4Ck+N_]$+tAOݸ
    P۷f9
    HW�u;&nZrܸkp.7yP&y+0�}SroQ\_~7PCy1([̰J0d1M5,#7Ȉ)A
    K8@!D"9	!b@l�K%0M,r�(p36J-*|#[a唰a[%]E34bgdYUחot9%/ٲ
    a!A("wʨ5$"'t'lM@*@(MZ
    7oXI6 &HP-=6w6
    &+,"#.=TH6T+B�hR"p0jAP2P67@�Qذ+o�简*4m$/wbK(0#.KE�,0KAx1"pxln� SH1H'"ز2b"z`1L�@Mm4K34X^:!|[
    Ʒ`u�X1tE5yR
    "%3AX3Aڨ,0r-2sZ[FAtCbB@�@8>Ply7^yR@�t3z(Ĉ0<ZH7R�^z;B#!ݔ͚|�Cq)JP2.,$+GPb:
    LI5,+"ǤE�RFl r#+n+ݦSmXpp ӠAD*�ȫ˔	K
    M6PjG l6	1涷o[
    US"B9OW@&W9)΂R�ъ.sJ:
    XA@V
    oa ϐ2d&2;p+#e0B1#t@=OzA2__#vpB|$#>C/i'J(P4h"AZL4
    fX(H8̡
    l
    @8AbːD|]<(NF,Q#O(,8F#! �WferPA0oaA8O	Eɒ#
    !&a*b %+ MBA&F8AEjPl!-ы;Nx- AluG]d1ܗAoJ@Ad�bN6�@؆3Qy
    ^IoUD(|!�~ʰXE	F",5ˆxxZ`A6	1
    	ЌPD@T(Z@19 �E2>DdvkU
    , x3ڄ` f�Dt#�Y4HI]XV (LFĦC{:cC
    cjE'ɭ
    kEVj4N[!V
    5I1V5yc
    QXe@XYQS /,}@Q{2ӄ
    ksd
    "
    h�H'3hH�M2qS�.E2f1|FK�o
    op̞^+О	Btԧ8}ho\oܞ*FvΒS8M#!xFy
    Odqa⨣Ojilր$ET%1 頄$jELÎr(+
    [Q)sS!\K	X6ZE8[.-D("ODAB@sw3ǹ
    ^0dSAG$(�D257U\!@8[
    gl@2al8І8!S`8l0[.QmKM9tEEHJTU%VjI@"q:%bk";
    WD\^(P	a"o1)Eh Ko&QS4F8AI,.@QB5B#
    t刅zfqY<#І-oc8Q�Bᰏ@Q}k`_�
    v0E6AB&8(vr'D`@°š- BL]1&AR_Y^i> i )X`	R\ Bp`z 
    `
    `�
    `M` h
    %(�HRaZbajr.#($BaV"HB,`aa*B*Bab 
     a"+b"Za"\]"B"*%a%0h&rb'z'b((&
    #B(db)b++rb#PB,h*-b.."(:*-0c11"c2*2"#B+0c4z"#dB,TB#Hc66c#,XB"	@8c!:8N!8#,9c8;�<==:�?d@
    @$#̢&#A*B2dC:CB$>60;Ja!5#Ta#XaE:BE
    dFc=aH!>2<F8:6dLd"5B#�B:B:j$cMJcJdQ�<QNO6%K>;2&X#H*U6EJ%T#xG�D9*&|BF*%|B't%##0BZV\;:XJP.%?BBbe`A"`
    �0`�! >",f#(&e#X!`f^gB&�hcdNfeRi"fff&eZfib&@֦h:!ئ�fo&kNd0Σ#('xB-J&lB&x'd#\'p&x[#L_#Н;F&%@:$ 'l"أ#d$pCj$$$"D(m
    C�^
    Y~�f@:B$x&tBqB&tV['4':(oJ$0B!@{#bz(J"e+C#r@&'(\J%UVUhYRzsfBNңWv7$$7!C/ 'XC8x9|z&"B9"# .py-`c?hAf"B-ȥ#-#b"BY&$RJG(# G":œc^.=@%pB2B-=# &|\҂-<Bn&*=,*Gjj,B$E8C5LC0;7p=B:x87 c
    "f>zB3B8$+H<6BF\2,C7B1`6N628|!$9TB.&(`-0(l9P"t8ȃ:/CT7~>6Cǚ<x<�k,B'C/Ԅ8c%˺Ҭ@2B"̈́ϖ.PڨU.+@~-9xP)X8F1,".(8&%x8.B/!0,B80ۆc#@1_j*%a":
    1DC4#@:LC4C#"h;B!F0n08n8B-$B1HC4Gbn
    ;J3@C&��GC;2/a&'̃)/092�<¡
    4@򥌦&#/4|�^o/h#mp#,8C:B90-H,H
    'Is`�-'$b.BN2-p$x<b-("xB3B6 �&F"`ڤfb$%92B:(!B]*GF#L.
    f0S(d%G
    N6B"B<:܂cnkd(H0<B6B4$7ا�?\\*PC"$,&<(T3C(,1@l#!./ @1.TV%'dIB!\l6"iՆ%^2g$<7d*"p%(B%-rC&*cBb"&wB!dq$L7J@"X4"7B!77H6&B% 3#!7LB$\)"p7+84h6B%\#6
    "7PBMbM.�( B@!|%:3�Bxվ#",77\B#,o�Pt#H4F_�l4E#"4=r4#,(ؤ5% &B$H$|C*@B2Ă%x"H(\!8g,$C!"B6,%A#4#h&PB&8[%%g1cB<�-"4H+?¶1"|G*%RG'Tqn&@g"d$uԧ~#<u'#� \#!`%/84B,؃)\B=&`v'$;J')P"#T8*!5 %t8(\)HC�I5"nD7.[;#6r"t¯|C$$&&rv+F1!8=+t+~%c!<&#�+@jٴ7tBy8*7|Wd!4D-z'e
    B59-e1W5!D/n#f#T3i
    B5<B$$@8#&",Hk�1X�(.B+cB?C%5"K9'T4o.0$a&-l"<8T!B97/yj8}‚+<-|$"d/=vBs;%86#@16?C,B3 *4+ 75l1<%494%4>(/"7T1z,((%p6/TB9'hC=o`,6<6@6l٘@-</#?x+3dB9$C8.C.P2l0H:"B6C,0B23,C8-x4d,|A8$7$8.6`1!+�@5@6C)VC%,3{"$pfR}1.c"B62#hR2=cw+6%�գ>L~5f&4*�&#X2C~4p"2p(}oBwURx>plv}Ab;B)L';0/B0$x)!5PS$@:P4>#//gf13,/$\yd703ѓB5oc"4C:<!9#(T*_Bonwd9#Ă;9̴6z~CC=L8C8)I[x3@\R
    !]V'U-
    m(j"\NͣĊ%>cE陧c m*a)N`=mQ#d=*l*}[`%c冱㳊![Q* }+4[oؐDh&�%K"]5
    1^N=,�XD\!ȑm֌8i4ȈZY3Z:iZt6S$׾wo߿>`T+Ǒ'mS.!"u:P%3mWg1HSE-rH%=uH@W(�H&"SLԤs+]9Gp%&rtLQJbD# �$jH90G(&DrĄGX$e !đArHKYG&�GB.�GQzao9JNtGFĐ�/EHembAo):af�jKKkDS;Ėg`Y	`b$J Ynff	�XxfV n"YLdM9ĥ�pd(J>aDng<9h	Vol	@r7ih*c`caiEoq,Ty�F29K`IJgfgfS9bh!pXoXm*Nex&EkjpWh^ݻYM4L�5B[haJ6rC>8[2GESD<oDO&`�()W0o'PIDqdmgVFyW�Fb%�m@dhA8*KVlx%Wy[pFaRaҴT&i	&W9![?Q]=@6l"<8bx2h䢁 @'(	SY.:<_)"� FL4[Pc00`02"zXTq"  �
    (	hTF�\%�uAŠ&M\ж
    YbC!�0X"aI`rq
    E,"9*qJ �G*XD'0Yi((1�EPCPF"p"�c&kh"�ؠ%6 Y %'N8X"ьbc&Kp.i bf-!Xv�,R(*2؄'	Mp&
    qhI!D SLhK!SHM(8,"Pć12zŹt'-=X<c1
    L7Eч	<D8qZ0Fr�ipDT1GTXD&G8qPn1ե΋&a@Cx%#	4x3qDJ@X+_CFb4%
    Sc+&I+P*X8F&;(H!Dat$΀-[ڔ""$!
    FXnfHC 4@be.q"F_a\CX;DmxARg3Q	>c89Tb�4x,Ր:vbpG
    -	*BX=a.%CX7LT#@^W\*A
    Vh*ta)cxF3!SC)M[M;@qf<A2؆3	"CXD)1s2fg̴Y&n"x2 akЃGP-hE3(pSC#iNg'hsL(paWVTt4;_;O7L�)lQ[BmmI<P"E@Fl=Ϭu[nba!:&f~w!\EFFWBG`RĘD/5Z۹׈+^AO%c*T&.LQ>,Hm>؂TZ̄'	X4!,1X@
    DW[<"D,Z	Y"Є+8	IfZKM&4qSTcD+d	w�*|SU >-b!
    C(&va
    MEgB0D%b10B8},bVhP0^
    \L5*D5DaJ\|�E%X`-r�"!}|-DQZnb(ӟPxI+A~rNN!w*a�2"07gХan$!=,sJ
    trc8&&D*.k^arm)EJ}CMpN0P.#H�al
    ~ӥO&
    >N2У0a&La
    dMpc
    
    ʣ	Pqr.p	{I8p!�0ð#
    a
    `!|&v
    hp@0!CBL#�}1n\1R0]*M'
    ?1h!p@qC&޴QneABC]*Ua~##XaAޔ#{At-;"ҭv*He@!!!2"%r")"R�C"9#=#xp#A$M$Q2%U"V%a!
    #gNb$'#'O'
    &s2)$8)+2;*&bsl̼+2,r,ɒ,@!r-ٲ-rAH-߲..2/2,!J20s0	0
    0312D12 2R(fL(3=3A34Es4I4M3�Ns5Y5]34A65i6m6q37KFA7}738s887As9A97`c3:=359;36g;3<7ų<<3=397=s:38>;s?ϓ<?4@7s@Y=
    84O(t3+(3C?83A]S?M4E??S~!NA~alb:|5_3OZL*a!4&833Ka)@]!Ba;
    B[Z!GwFNT9`>bXF@sO@s�O@U$9eNU4I)3A;Rbh8jX3!a6;`U[3!A9IT54Q3=(Ed`tV-ҩX`uZ(!Qab*[ES t3!(֕4'Aak._FbFbX3!o~aCNnPAxA<sPH3Ȥb0A(4 :nXB3Ceԁ!(.?QDaut!\s�V0a禖FāLj_!.fDvOm>a XUnv#34WMSjL@>3Sb@[Yd3,W6As;aXD4wba,!(i=v!�.l[bB.a_3i7�aw
    5
    xIcASJ!0G4_�ez5zY3b&[v{Abur̕ar}緖~;`cJ3hK)a$;P4F*s=3'(Ar09q!؂bVa*`R$x(,AʡY](a`a~A!�8<K;PۓJ*B@3tG3@�Ё@qCS4m=S֗b8�&i?8I׌aS6E324i(j7�bbQ*Cl=d3E<sb
    Ad6bAsSyVy(ƕQ=@q94mLby=ga?3)4Qa^B06XG.a[~X)bŒb^arpaHA|!jtA8!3w!]Ab ar!8([gnxn!�BIazV!S!ZJ!TB�~R[!k"blXbx8tEaǺ3sA@;7�!oy)	Y4MlZR1:4q;S=3_[8U8o3O3D
    X)fw�)fˬwgH&:99Y aA:֔;s\Uxpk3AUa;!Giíb$by`{3baāNH씯9=3h"
    &tZბR4A!!NAVa6atAJ6!MKʡhV:�jX<�A,RNA`n!@AaA_VVNXZءvHK\xagXk	�	?WN;3!!؁1ګo[	*H@Ԋs:6:�캲=W3t!:s${;AGW;(ba`sbVPha>#=uY?Y"74y;�3Ɂġ=4{),B3m!Z .5;3cd!C4A@><!!Q3@U�NA0V~;||Af[衋XVe<!>i},:UE!<AwAOB!�ANRRA3׊t'T$3!EX;i+Sۓ�p;s3_vQ=]4><M=Qud;;b_}89�HXt}]f!(03M[̦ f{ڧKYSV)fmQsk3=o{w}#<iEi lU
    <MV�nFHAUeL�>
    Tf1@,hQ
    ѧgYV�[Δ\+2PbT2DhѺd.
    i6Ff
    @
    Z�-/XJkL%1өip%Ŗw/_>A˜í	6	,5Xn6rf˘VXҨS^z5(Vc˞my(5
    	[�2I#ȓ+rkf9r4K�jiB˕S�4	$YGL `(dճr\qϿ?ELX!dN3
    7yV˴wx)8!h3ͅ!@8*
    L; @ޜb+[m2O47-@tBE,D68?NSR%bR&dB.M"$"|x!62¼2L-b(4,h�6@""�5:M-2'4	,"Ǵ2I>
    $)R12)@-\"N�ހ&
    .|@8Ɔs/K'HR`*v5@/Qc#@7`'7&QH0�`ˆ0v�ܤ"\3�!l"%D06'p$V`HcǬ]"$@*<,?G ?RI$ܦ3ϷA'u!94L7ڈS)Mq�^�Մi}I9U~mvr�;#,!PYi@ID`jzNޅn"I	$x>@ 9$p@'wBP"qKby!z%%jdM88h92N8`.ʔ((P44$؀%LI9҈RN4
    7$St�2LZ0K:"N8h:(
    +1gPx!
    ql@
    sCF*ءAv&ԁ
    s1C&A
    V۠5!	EPC6*M5l
    U$!*α
    pp88pP6F8
    [#8)PWE.!ZϜBg#xjlCP@T!^DLqCBF)HE&:ө!'Q	&7ɳͮJh
    =1o*@c9A2$-f],m.?)̏%myƏ6Ԩb\N!mlpD1)Y9<'%s)IuT0IOOzA$*1:)	!im5Mbn|9#tRg\E[ύ"T
    )r)ҒhI-RP�fJӚ8ͩNwӞtp(ӢH"$L5PTJժT(Lծz`
    XJ֪&B(ZoKb[]\Jb:#׾
    `Kx+B:_AXhͬf7zVP)0ҚMjWrhkgXFd"hmwZNG`�K\F43upASW�Xr]Rwǽv]:�@wKeeŋ|:35n#[Fpy쎗әv<�j'L^635y\BurA\S@lQb�Ӌ	
    8~/M[⮎�.aDB'K|Z�1#d�O%�$Ab79s{ի	�8!t+�D.�P3g=5kzםshD'ZVC۹Ҏ.Ӗ'bR'.+	Ml"D&q	OpDIt`tL#@'6:"u|;DH΋(Jj1Ǘ�ą,$B�f.#"	LtD&:[C~'^MNpº$hݫV,U�*OL�rk\?MmXgoKF@߈!qfC(G/]G BB'pVx
    Cnn-j1eGьYbEq_l{uɸvP	NݵKvL[<b�m+̈Y8yn}G\41wܠ-
    qȃ�	n `%:y`!`=uQv%G7LQC_p3
    p�0G5nu.bÆ-f>mc"6":y`;1o4ߠ
    0�z`�#svW	 X~ph^}~<0%Q\qf
    T r@&d	�p
    � 
    pF	\@�0\Q(Th	86uUau%�
    �	0
    00]	Plu8\whP
    vȆ]А	Wbvmv�Ӂĕ0F-]�
    Àn@�q2xQ5zmw�
    
    
    >7�p	fh\@5�PCTI6�TU
    	pEaVSqe\0 
    v1]%aΕ\x&a\b.fy<
    `
    pp
    
    teS
    f 
    
    &�P
    HI
    A9�pP	@wYiŁ^]pƠ0�gkI- 	p	ݐ0ۀ0YrAr"f 	
    Pgp	P	OHܐ	YK; ^^TGbK	PA	
    u0
    
    P
    
    [P	`
    	=Ɖ6
    AhP	b
    
    pam�@t
    )zl0�
    
    \�yg Np	
    
    ӟr	@6\
     L�S	܀ 
    Uxb
    @			t&	P:
    	P! 	p	p
    l 
    
    ٰ6e	mu	@	�k-vam	Nu|
    �	 
     �	l�
    8	P		�	m_	dVepnfTfw
    -p&
    `
    𝥷		6]
    "Ԁ�k
    ``
    `	+5
    Ji
    p
    fЫ(J]
    
    		Z\sy8Vx2upp
    c=XUP`�
    WHـ	
    0\
    �V͐ReEKP
    Fv@S .1F|�\[nP
    �	&'k@u'\{`F
    gozg7ˠ@崌` n7*]릇
    k]]gf�C@v	Ϡ
    p	Π
    p
    
    @
    `@	@`	Ͱ�
    
    =)0�
    o
    P	PP
    π
    Р
    000J@%	ϐ	@{˰
     	@`@
    ـ6d	Ӑ
    	 
     @t𿇰
    @p
    �P
    
    P
    rN^j�`%Dvzh`	@g
    01<[+vڮ<][ۀ?
    Al6(v|P
    `[	͠
    fƃ+'`誮0x
    0ph	\�+9F禐mH\aUfӀ�l*9u౥uZD
    )+;	�
    ]{lᨗV�*�I\{մOq[
    �]ϕ�
    e�
     ˗ìFzekApp{|z�pţ
    p��C{Xv
    =0
    @	|0k
    *00P	 
    	}ї�+P
    0�,c	P|
    @
    P
    	ܼ
    а
    
    ؀	#3*@Nmp
     |%#:U 0ӹ<Z!&	 
    p((\5L2<:l:lpO"C
    \	X\hRJ|U10T	bճP倖m^{гpg梜/J
    <iX@	ߐA		{@'Ayҽiީ[tNۉ@B.pVgC[	`@
    0
    &П&,�W02	@	g�͠�	j
    (
    p
    
    hw
    �
    P	|ph
     
    @а
    Z!
    ߠ(@@��|W>ˋͨ�R		
    pՀ)S 00
    
    p
    p@@
    pk
    	0n^շ	0�
    �i-	̠;#Pdkmpm{�o
    w%JdIlz7q 1	pvW1ٌ
    ŀoPvD 
    n>1@ƭ-zkaľ`slf.Ѡʕ
    ـ
    rp 
    zح]Ҁ0
    
    ?
    Ѷp
    ۠
    !@	pf
    pҌp
    װ8�2o]˰wa�;L
    `0	`�f\Q]�.S	P;jg 	Ѐ!!	C 
    
    n	W}p1̀
     	؀	Wો
    	O\@`	dVj	@>
     
    0�6$
    � 2	p
    
    	S�	ɀ 
    `:`<	U
    0
    	��
    �PUa
    jaJ
    pB12%#R�'*G!E$qV%UdiUBB
    *ej,QGFbUbQ-	B ֳELBjI#G,H<oDj9@`.K)"]&{7/Eށ{5iIfzl4`Ñ%dD)	MڰF.A{&qf={f"JРQzZF<�EU
    .7qTJgΎ6>|QrT~
    8$
    0EGPQ"9fiI݇TTjGFIdhydH돑FT12hLuY^Fg8]	gСi>YfCȡTi9x$jdYp)egܙ$3EeEĹf{1JufLGDN�WYVADjanځUtgYƙgGSATaLMRqg^
    g4IbysypJQsCƙf qiY{9L!GCe<bdբęxi%pQSRQĖhlF1gG1E6l^NJ^|Sc䜺1Ʊ@^
    |l_FFxⅪ*< Y^d�RlŖR	ꓢAe$eEA $dIqX3mh첣0Ɉ! $:!F)k�隀FH[6$:#*&`B^
    Vjl<;j\L)Y^XR-[.i9OReC,%P1L	-[MbigX"EW8DeJePL	M4JlMZ%
    PV9CTQ?W`%QQY
    dS4OXE!LOEpFO(0D+UB+p*a�(lQ
    !@ZD-r�"!|CQ{(JQ=-7�T Jd
    `E#-b@Xe/3J0YJ �x4+{,	#Vq[H=u4@&<8DHC lH!4[$&2:,1c))c̘R\vF�!qH
    qdSD#gYEDCi�iVQ)u/VԂ@D!F葆@h1MN%G)Ex3ߔg!!ӗT>f"%91NԠ9p!}xexbpLDHL2Wʤ+!1I[Ι+gYNl̩ȎlRT:USm+4FHMJhPdA4I$0/5UZ/ܕ^=OqTGtd#la
    {X&Velc+G(lle-{Y6lg=YІVu8;ZԢif{eW{Ԃ;	b~֢	I#Z[w@pKYFdb(V;nsˈKZUu{]fW{\DpW%oyWI5o{^WUD*JWo_�X+|&"4CpJll@-|agXp=a# y &qM|b
    /B@q]bXF(f|cX;q}c@&Lj"'YV&d(_XĜrU*gY:e0YEq|d3Npu<e7q3\g<Y{q\b4kvē3|
    MTx%*l@54\æ,ԣ1c4EOe XF2,X\6&NSdĨ$QChHq&NQWXŞ]PPDI!c8hƫomkX@ƺۭs3;�DY	
    {~v�+k%@Ĉ0F3]K40
    maDL03pe,%`-qaH,rS0?ž7*Qj|p#]<�%�lpҧ^uKLC8b\D•7aat{{mgb'ot:�%
    z-dpMt6Nq
    o9Nm\x!<Ƅ>~a$̸3Xqg8q!AažpgTC0tafDX9a	LPχ~c)DW"p1fmCӁO4Gc|U^K|pqaaVe g >kBk3C�ED=O@O:l@ڄ0BPh;0SaL{L廰Z؅�Z0qK6� ԆnL$\B$UG<
    S{L'԰W��a�dB^0aAmP
    lm'l;<*<0D8R0
    Y(
    +J<IpDÆE(TkJðI
    kdPe�;L2\HI
    [ijBI@ICKPr+gc E p�(i�NB�`h8Gm0Cn33B`6,j�mp4tTGGt0[
    �@xtH80e5m0mx
    ;�0mp:0dOSAzܰDC@0Z
    XIEDhtIn=R]�EtI
    B0Fw
    00\E0[�F0BJ3<DTKĨ
    ˰k�u�hPKTW {PKp9eXIi_cS\8D(TW'\$e_HXeN0!^�WPDhHH0b8bX\BNxJxh8Yӛ[<bpG#i=IhdXTqfLexS(ڬ;InVHc0c`[DaxNXkӬ0`R
    ;B0g<<jgO0ܷO3n-�NyH
    3cH[H·0B4IdP
    ÆKHHȆptE$@�s�m
    a� 
    ;VY E�ahI#IKp[I[n>JhRQLʥ&
    0Q 0ݡ а0`@A|50D
    KqF8z0.eZ8pXJX\POHlvJ8L[hSDvHfMPpX8uXLh,C�oP!j|@*j؄_8FpoJSR0rZZ`NlHNx~PKT8~SjPh8X[PЄfXo�eXjXJ0PXzVva@]L \UQ}T �h9� :d(0BSW�0lHlv`Fi{
    SpKXK(gCND4ce@=PSyS|6\@6[UaHUGH8X?=b@Λ<ZɒяtAI$IK&0(
    �ئJ0rq8C.08K0[uxo`FJʰӱD�@_`XpB\|c�HtxrOpOOn8׽uA"ńS8bPK5ypC:h|z5V{5OeRc
    �QHS`C҆Pl`_Xg OЄg q7S(e({po{LΣ漁`POXIeXzkHH�YϣXbM4Oq43h-DPG
    CGk0ߵͰT4d8=C2UHMȦŰM%(ZzdQahCDdIQV!/`ZMc#\\BḬ]0w`SJJaMnXJ\\Jɕ\@0K UD˥6S#]J	;h8W�fPFH]c]T̼
    SOv
    hkmxO`cQI4X@1;fSއ$uH=lp%
    �R4YcX(Q̆0g NakÆsN|O_0MΰB8T
    F>፵ϳ<ka1[eR@5M
    aT0iBhȅDx
    e!GQ@G8!�ޒ>i*�hXZHp nOJ[v
    <ofXt;=)==K�SҨ�0ehw驆K&Rۄy:ewx7K~BnK0Y`
    #q(iOQ
    oP:gf[ic`FD(ox=fOeaDK]HElu@Zl�H8jxUuhZP=,ۆI|m@V|hSHHI|�R0C(aNEhq�o�F~(@U8z5مN_pK0UsB_Spa 8lx_!N8\}B�anH9k�B@MK[DlpM_#0n0bqdY1X@S0T GPzGHGH@,#R f;sknqOS�/q(_ 8Q
    s+߆b^˰0
    3J0IH:9ưs*EH:FsSGxHPtBͰBN9Q?Ih!+ dom8*q0U([�|Sr8c-l�OsO(irV P	uW@e8YxFt\p[7g=QI؆sxs(#T`g
    $sMPl7fPaqmkIPj¥�q(ZT8m�n(Z8pHnr "rl8Rpp(�腞c0SPz=30mrhLU z]b�oʲ?~t\sa]suu$3pS0u{Pr ٸ/{Mj1C�y0/l(;iS}+hmnc||#|_-WŏQsDU`+H2BJ0y+9Isܟ1W8؟
    ;|}}3~*~R~'4Y.k.rC/b/ϯ,h „
    2l!Ĉ'Rhb"Q.rX0ѥXy,i"J9u2gҬi&Μ:wU(<-jtf#J4	=)ԨRtTSZr+ذb2j,ښ2Ū(-\!YʲH�޼/w
    p/‡1y�:@2̚7sNH˝G.m4ԍN,pol]ض؞cfR dߩnhm[ oΎ˞Xs	_�߿Opy1M>=道_sQ]ێ	W&Ħ%t	%1ˆ- a	 vQf|RE�#�b""@@#"27Ӌ#c+"@Bd?ؤA#8Y<Vy%^a#p	ShI&x#x	& x#T(#Paa$ ~"9	$w$H"I"Kj@ܞ�~"9'tb%d҉phIhz&p#HH!$zpBi9�L},.{,x8k{	oG]y5I+r�t3N/|bM8ޜM!K9 #x9+rjrwR˂b-|\""`&wv#|r-)#�XX�pb2#2c IP3sb#Ķtә-8N@uӴam,D%k`S4;pC-x#<ܠM,	7ٿK35$ἒwb,r22N7@<1\Kt 
    8AR9Ք1ilB((ېKv)	8c/<߀7ij9Ǜfb#�##J3Wb=f
    �83H0嘏~90W"|N"9d/}H8"	B(, /TP` aw}q旡y/ƈF4~HcF#MBp/
    `09QiD#)#bCaFπF&6)dyI'a
    D`4c!i@cc	ph
    #1@6 !%p#ʁ�"@�+f�pb75_b#GP$ъD@xVJBD3Z
    `ޒJ@:ʹcH"1gcĤr0_`	T)34")qm(
    時F(L
    i$r�q�FCdx(*x"{{iIU2G$a] b@LkzSbk)I6P\	2n1"QHb4DL-*PD%&-ndb5X�@'S7 )
    nI"
    I%�,#PaC|cb-`�*b"$KoP9mv�Q8m^˗GBpKor%X닾^@s\`x	ؾDB#,]x>
    DHB|6 a^P�E$X$OLH$2B2ba.B!N1B""BExjAHMhHӁ4+\R1I&(u><c�DD+sHCe}�>E|"e(OT"L$45DMЄ9rħ�"͌ذ/x"i"0%Z+MpdB"щ�@(Q	p�Y0D+�K7@(,j
    i8E@Kgﭐa#GIvMD'H$bx_{B
    83!VN/qRgHU�!^
    .7:oFĴmSf 7Cnw:l9.hV8|F$W᠐cͰlD8&\9dvDby�/!D(X#
    ZhSEowyf(XClؔ�[#�x8!"vy#r<1."W7J$brf։g%`<h6bt@*vfPcx%AfX(xC(H1E†8~Qrڨ6ya؀66X>�x$q32Qd G.mC :́Rd`D2B"-<1l7đo$C!pQb /QV�>JsU4Dgc̘F!ˠ%!(B"$ڏ %|!/C!1"d)tZX n]"m"`( zC5Zd&4*xHSn[!@(*(îhKeb&Pal[Pe<XJj!4T#�B=)O!üIB)P%4աM�5@QƺE!1//Ę=I13<�/`�!B5X
    _5BaF"4C:<CO!(TW)^йbaG%!/;<B,11\]B3B�8C8)1- 7`b}7`!#02B'B�2HBtR(B+`""<P+%+P3x1% 6C%`4hB&A^,C524;<B),�>8,C�l%C9;*0!L#7PB)'6@Cj$xC!|6 ;lRd�>X/!!37!C,0N^�db7434N# ! vH:H4F^`qi!ЂE
    �		
    Op04<CF"h1Z� 	NL@2B	@WQ%UWi_ rHz"B9M%F,(`$75@#P7$BCA&&M(,$B8TCi",ekfPfj!j8B#66F�0#�|2L0�&4p",LCڡ#|#u3gruUW\9͢�H3 �L,.C�LB&P$X7ۇ@3B�@C, #$1pC~C&|C!D1BC-�.p4$B%HB78lBGz!44l7T4B01p$#"81B2<,6hBe!p%C5h)c	8P.$,x38#`&77-(؟,D@7&hJ"-p4@!(/`C" @Bm_d5GWð5$-_%*j-4C=b!:fDK�PBa
    &p̯	@d2B*"Tb@3B"<CB4�+-�]2dUhK%%D2j:B,B#<B3.D"íQ�B6`C*4-H5,v<:R4>-LFNCX(lsa6K-qxB(l;X$#5̬
    .9,,uatd
    %94-P$9҂)f$,)ւv)F0 r&@C%%dh͌$@)|h,`4&ę&Bbb!,22*2 B3$`&2db.`"d'p9TbU2`8!�C,%P%9|4%"P(2$'+"7M&\&�6,/6@2B�r80B'8B4 B24%a4PBbB�|BA.P4 2@*LB/)t�W)Yݙ]&BO~S=)o0M#LL5"̆fr �)P*P-^+i!m,<"p�"<"5,%!7E.X(4`"&8M2D1Qq*e;ZƷu	}pdd_4H-%$ȇ3<1%@4PP#Cc W~]!S*B"1<3Xn",E%#$#]r&4D(/$84`c(B)BDB3HWr4$#,$r-2-g"E"4q4B.:,2C
    63J%3-4<4T2!5Co
    �/1|B<�j<T,1;:<;l-e*8\2C1ku_1۬&TC<hR
    RC+$*P5B4*=2,3<C3؃0>>)D7oB*2BMb3hB*C1|;9435!t68C3@@ 44"=Lý`B93+6A&T7B,;)\=Ԧ/[5\uuO"><Bu_/F[-C7tC!Ȳ4@862^"4@24"h6g`T+b@&+D�-L),&̠$$H8Wk2n+n&6cy۽^6gd!--aY*:&C7stE#t/-I
    #�H!0",Ɋx7@JzWxIyG	pyoypێ~kw}[J0.B!,6v'0'B.l!n, 	*B"Ăn+lB,BpB$Ȃ&'pž,(l.lB(B�p&h-B%BmB+B&!@#(Ѱ*@y$,B,@*܂,&)h-'*)'.|B,6*0P+ZT(B%�<B.T!B.B�B.P^0G-B)?'�*z-:r-'+l*ۺa{Z#BkU.4MTX7-r@aLe<7Et{P{B+G;{oixdy^7~g
    =#h IPIR4� oH",+5"仺r	v,3wb鑦^NpW]�
    q!(<"|ͳž;"p;B�YtBw͉1,$$ػ/aLҿ+}U,B�%r!TJ\G	#İG;=i{3rK	>wH2Pf$$4h[2@4BDF"4�C
    mFNCX/ǯ[vFDV\P>ER,׾>UXV~Z ,QyL$(w\N20?Tws ?EYsZ[l3\RWr(?JH߲?D(B*I?�	4xaB6tbD)VlH+9"Lt)$EI,Gf	fL3iִygN\qhP4ɚ4iRK6͉jSSVzkVSAf$Ym*`ʖf-ۢGֵ[]{ߩb
    ֋VKU.:qdy%W|1K2OizyسK/m9S֌JVˤDM[
    we*:엧PS٥_˒{
    +f#A7"I'J;DVᩙNz4]]%
    0hBbf̙SZi9{ncAFA1PQ>yHh f,|Ih> DIfL81^gl)bBd|Ry\XYfWYZ	eZY\�-Ŝɓnjq$Et2�K3܄8_8۬DpyJOo[)m/IDovL7ӗ@gSidfaw~-SNoPSx&M	AcbDhB Vn1vPu&<q^p{Dat1H`sciE>fɗ~qH!&|_%D^*fD6$y844,YP6%;	,sVfY&�G!QhLKPe,D$MEL(3$l
    AL(q7Zv	`{jy	m.<`Am0n`a	&e/Bkz�@fkm	rJ,	J`ʆL\G&tmNMcJ)f)B(_%&l)cM&VQD�4/d&UX
    Fdb�K)GOٴg8EAp~	iF!2s6C,k_˕P2AQddcZN@@T8#�@G)&&؎Ķmx&7$8p&ȘE"8™lI&!ęЂ0C‰/EaEDxx-10r'FtZK!w%`#L(.i�$Ml!cY��8\d�N䒛H~5kb-ITLG5B	^%@`RMSXF#XQbF(F3pbi$24d<'Da^p2CH(2r7N<Ff
    e"3VCikH2vb:T3NQsgy	681N}N3	|tV
    jQ&/c�tc6i�2̈611s}(&/M.4P/!}DDjMBc@9
    0dh[�+bm Z'
    )cTX:Dbk*
    >2!<PU)9f(
    ҄#\SGP{$G[/I8Sԣ%:\XF%j\2$ءJ#ɰE+v0BXBD3�oKE5
    | (E56s0ސ)[
    SE<P_!'EX8E?qjTC8,qlBX7UTc0(1g쨄0l`(xlbhrP�(21H2>ńld(DiIAz�(2.Qg8.�2-s0bD۩N;S�u2>q9DtfY*c6Uë$WZL.Xd]1DId-XHŷ:QT>O0M+Vj 
    	9h!^D7A%q]z&:ycCIHƤ
    �"|BX88_fŒz;�@3aO8䆉HlRR�0qsC¶PB0
    zxgwdl
    O((D*qSXɠ'C#iE�_&`)8)ʱBGF8
    KXə.+jW>M0TeH	!d&{4,D(iHR.1`Ǯh;us[9ֈɾ]H3DAT
    0t,xG(ia<@@-ŘKb�`ҧV=^(Vpd1\Cv'8 {#ˤDv�zqC>٧%KJm]p#W`D2vAczz2X@C6FlZ_"hLI!JH.NJ/�Hg|XFlq$A	<Ha[^DAf2
    8JhU..L1//|*�N^^BfBr!%mJH XD!p
    '�񪰫%LR<aȦ!|fC2ENx
    @j)&W!T8	mB$JPD_a*h!6paJaNH.ojzDa%а ApdFT!h֡�jA[b&<8ZaLA !4J!?
    
    wj!.A0XF~kB#ca:~$VxcaF$&ސj:p
    !��(JnRAa�6A.Aִ+R֒Q;`O"`L! aB~J0&"d1ӱNd"!AAL޲ơ<CDA4_>N%(dB !6)Aeb�nl~p3wnS$! !Pt8aB~O a
    Iӫnmsfj(m6%A;<s*a<)	vdv.aA|b!&Tn,DaF@:FA>a>A!Z@j4^fXf!ApAABd.BaAaa@̡da!AJ!hc,!4!$AA21 PhM4'(^!HFa䈏QRAR_PNJ:UʌATAU'3&ahVgbeUMV%WG
    sp(/HЖF&\0X9C	
    &vUV6ZjX*!R'Pa*gBYa!d["ZMfZUW[X75 >'
     a$a6ys)*6osra__CVYvd1Ca[fc0JUZSf!dF$zv#\g$$!0hii-BRxijkVkV 0B#h?"$lv PB%!.mnVnnnoV�BmpWpnbApqqrT7r/s3Ws7s;s?qaZtKWn!bt[7tAb%d8K�jv3vnw hvavvkxwx�wWyyoyzzzeq{{|W|Ǘyr}wx"
    }}}w~vw�2"|W~k~7؀
    x�F7tvx%xT~!x7v9v-!me7~
    A�"awa>}>$)x`}qXW@77z5؈W{5{k�XW����ታxXWVXyxx8X�aHxX�̷rV$A6!<2.8<lvaz:W&!!3a&0X7-ac4A�ᔅ٘w[!xy	@z?!ׂ1ׅ=(9XW$Y�fVXcwv#Zbǡ AxzHA:Xpˈ8x91jpRl,a8ZAi�d*!8ly7a	zyqlNaa�DYyqx}g:׎
    !aaAX�!xz`!8{!Qv!AAށa¡A!!ALlq[3ڷwyAl!A2/ا{�ZnAAFXf!I9svo7d4~A^Av~v
    \|A*z/5xW�!aa5!܁
    a%Ã3[!A~e|{Åx%!IX~@U~!W"m7<aLa@5A�ax�|r�ͧ\w	`œ!hJTh8d\V*vv�lM'AIXw@#wW\x	!ʄ`.�l�$4df@$!x!mx9Ûٍy	�"�Ataё׺3X0!zjA`}!v}naEAZ.Ajv!>&qt߇1wÉ#!&΃	 ,aNaR|$ubP&!!'�Af̸*aua`rpw�D!O!g*]y8^M-vv!Kd!�pDA>AD (0"9%γ.k
    !8A�L@TtTmax^�X<a6O*Dh!Fgo?7]#!:anP>�b6D
    2:|1ĉBcUhQm1Zԍ"K9
    ֡,rH
    =53�C-@P6LG()Ѧo<~Jg3]3)zHU_˚=!#J4eHѡSD:#FUf�j4)$H$9xRE
    7qf̚UKBDfB(ek#G^"Siȵ`
    mrj=z˰o�[ zR䆺6Qe7g#Uxe,�F`zD*i$Z	74u*#%h#6N,4"L7N7|r;l8H]d<hCO8#P"+̂&Pr9T$BH3b%P�M!meZbIffYJn2D!)"lH#&B
    	(DB23d&3"м@-("O2dN:WP]4920TTSUUjUp5Vt)—FV[tH)H0DU!bIY)]B
    5,"	gn6�P08k/^6RL+ϠBP!gPvV�0P"@3N:Bv!J5(Bx}^Aǐ!$C#s9 �
    <C3)s-x	"l/ S"(<4K�d"I<dH-3J%3ϼe?uU3TG9LI�%^6d/x^٦iB2dyg 'C%e34�h"9L/]
    8jh洓CfZTRL,;
    &XMUh|#B,唣[
    -"l u@	5/%$W_s(@BGH$"A@"%AE,~ 
    Dlx.,XN)0D�aFc"H!iX#
    ፍu|K/�F枢=|	,ⳋb`$l&
    nF֞aV@B�Fn)*D61	oCx-f@c!n�B߰E�<C@2mx,+H:7eL@Ӏ"!K+_	˲@.q8dG|[7R8')tJ!`F~"R,F*8Mynwj`a<F8(L	g@D#񌬽"0z"iheǐFTa1>p+fP0R!&F*d([BFu¡֓.Fӈi4^:
    H08J#Pm'7ENO()6�FB]�ڔef`V*EGhԘ�1Xb>c$1ZU=q ˰b|	hTF�zI@e&
    *]7
    PfM\8"1L$iE�[$CX0Mlbp%�mPB00\Jb0"d8xd-fi^QX.2'Х"`1sbx"&/5`WS7	xx5ѢDT.,1F(CQ.0d.I2p<iXՈDubJ(\0hHcH4!	!C5Ɛ1D	h@Qr#bԌh"ȬX	J8
    X8F֜fa4g3:#caسP0	gH`D(#"ilF4ifzӐ5D׆&Ӑ[4LscxG|_
    y<G9tx4*v,c 5ށC0)QedB8lbJx1±LTX4<E(!mb"	hfG,eC@�,Jq],&/.&$`q7QLKB92	&GBbPFi\3&0Mc27kXdB�HaZآ{'TL$N`AV_8W,'bd>8$w(;wНkD{E�EpX0OEEpHY!?`L|!"Cd򒇼3x}C<Z,TX|EM2X!RMPa
    L)%_
    ]h"D,[D*1J"hE[ZQ&lP4bž	goqu	 `(vhquϑx 41L(Ёp,4	,+Jt VSaݤ+p@`D�ywmCwDŽ!)(k7,(o]&pFNE80m h(y6<KN!cUN2Izgn!`|5Sq6c%WGrFϵrH#hHcwx}煝X^^Ehl`¤_NkxdQ8<}xwT8)H牵P8\`(hx&(rXd1<Hh׈٨ȍ(� ׍Hhl	x(}5ȏ8&�I|	AR&Iih�
    !)#I`Y Y+ɒ-/	�q1i79;ɓ=1
    ?IuE.Pa SIUiWY[ɕT�	])cIey Edkɖmo	[
    uiwy{ɗ}i
    ~)W	�]o)�P`	j9w9ə陟		iy٘QwaٚvYIYɛci)i	Ry D�
    YYUi
    ӗ)f9IvyUTaʠp	P9%S9@YTy
    qĕP	pWx	P"Ƣ
    
    )-Аe		`p
    y	`ˀ)P9
     0CUI雭9�5X>
    
    `Yc*HTI90
    R
    ˰
    
    T		
    `0ez
    )EڕI
    P	RY
    
    cCC�o�qP	
    Z,
    0|X�P	܀4Z)X	
    ʕ
    )	*
    99
    o֙
    pm
    p
    
    T	BZ533i1p
    U
    p0 `0:`
    	e9�``	p
    `{
    @@@
    	
    �0
    ![90|`sJ+k	dPD*\)
    PXPQʚR� 
    ZTy
    @%�0TI5p
    5t`	
    '@	Jm 
     	:l�@Qڀ	~
    j`HKQ	��€@VW		0	:�
    
    ZJTP
    S4ZHPv�PS
    Pא>@UY
    ZP
    R
    ȠɐGR
    %@$	@@Zey
    Y
    t@4 
    d�r
    c
    РH
    ]+@\dU
    Ԑ\� TI^I�@bTgB{"Kʵ +	a:ڀ/l@F\_XkLvK:Rm{[kskCPNNO,IܴS)
    @�RYN�дpRR+S)ƽjV;\Wi�+ RIz�~yRɫVĻUTR	Vy
    5�
    
    p
    y
    N`
    <
    ppIROӀĠ�	`3`ƅ0	PPː[6@V4Y:
    �@0
    ͐p0ˎp
    P6*Y
    O
    p`\,`Rپ*R@۫+
    [SY
    h&,�  -	;Xi
    DSV鬤Pʘ9STȰR
    B.R)Si~	+};l@��ېR9�E,=<JlE5 e
    N�3Z<
    ޠ3Ri%V�iv�
    9L)<!-S	[زȇ RU}TpP΀~	(
    @	ǀ`pI	
    	͠
    :ְP
    	p Ʀݥ`
    P\)`,
    @ՠ
    p�
    
    	Ͱ
    �P
    @	�
    Z3`P	€
    @
    ڭݢQ��y��c5sǢp
    ~
    2J
    4BbݿS)RI'p	p	>!WѨUR[$-'=Y	
    K3-Ty5p?M+<E-GTy	r5I[\
    .D`Dl\	Z7lSą
    0W	�Ԁ	P
    [@SY9NP
    U<
    4%OǍٔM@bS@XU`	� B:N	:+Ő`K	@
    I	 
    
    -
    pt`
    
    @		.l	PPaa
     
    `	
    @X@
     XG
    
    ~)+F\2~�S8I�ͰGN%M~h	@>&yen,L1<5{SI
    r^榻0L_mZ}]5L,�g
    Y]_RY	H`UY|2pǑ<mmSȲ�@V�
    
    X
    
    @``P	
    `
    
    	
    P�
    RO4�}CU=ـOeO
    �o�u21!*	
    @qa
    �)@#n�~PbB˜)،kbpQBKI8HyfL5męs"(V:}*r5
    	[2-IU^
    JID1rht5+ѧe
    GA;Ԑ@IQ3�ͻW"X"pbAɚl5|[^OH'.k׮mS޼
    y"!tھ9kxسQ54e[Usw9@noci^ع{xryMY$gqܼM~(1QYIvylQc摸bk$eyeZQv
    Yԙ!l@DD%�j^Q�iF�ljQ<,m&%QV&ɧS$aj:%PJ1ƐB9b%K	pTEOgp.eCv餓_)(YEΡh~)jLqdHjFA퓿N}($�0aDu:D�nRAYD6DN?
    u�ye"nP#�WQk֜x5WS	 bQfKaIf˨ҵY[$dVZ&*hĜlFmm	E�J'/]tὤ1ת&JmJ(Y&I D櫦aJ"6b Ni$(X"E y�"	yR'ZeCT%yJ\`I\.$ޫl	�m9GY	Lvۥ[Sr:ejap>i>)GQʉr@dleΙ噶a$tEpu4gyFCyCgs^AkN_1Y&vbgGDb9kuٓun	@raE[h$Qq[QEPĩsBf9\q(&r^p9	^܇_pob[l"hjlCPFCT!e`T@F)$[b!\UH}Ѕ)e8~1.%0&*`lχGDbC\iI<ᶞNYbhC-*GbpÈG6#
    D"V
    
    olcȆ#G%VqW
    +U4UHF>
    &Q	D%}HI^8YɃl	ʛ"+HY2eUK^җZe/]KPP�Lf6әτf49Mj.sp(QMnvӛl"$LlDg:չNvFS(E29OzӞg>Ov&Bg@KbhBѩJ",#0QVԢhF5Qvx+B!QԤ'EiEAXh)iLe:S4P)^jSԧ?jP:TΔhEQzQFd"hRjԂE`�UF4btV̬nU�XDXzִU^uk\:׭:�"�]WկkXKWְElbۈuj#F8ӱgeʕZu2%NvUj,jZֵֶ_ض6plez[
    xjgk;âCq:DXOHVD(ZF0w\H+^^V*qCDU�0!!W,b�A_U`J40X"La�W�p;;31|bo:]#	OTD&<L<&<щnpDϻWELG@#$	!W"92	K8Ǟq'	Ed(D$aVys<gζt+Zi	E =3	Bs5VŪ!ъo8zOXkFϊ^#S`7hQ7M4{݋֢uD*la>V%6YGe"Zpv}Kq
    @%8YF+>iBPbTDK[<r,=woao7͆8Qicp7A[7Z_,"@1"E؂�.E$B~@G,pȣO>ܡ
    t7
    C<"�ʨ$j1M,⫘X&kWꈵ:�Y(|PD"qKjhDkE9x>z#m$Yb~WBFYы`xk0;jno*�cD#`$1hjU&l`K0Lk5HD1`pV7酁VI<z#Y`e
     )v<P!m_H y\aF@0܏^?z1"Cgh+�@�VmH
    nEPb�eP:d(2Z_nE XPHЄ� YYP 	hV0NMhx*E':г+� OC^@�cЅE�I8bQ-BZ_B^:߲;Io0R#:EKPJH<LhG΃-ϋC=ЂS(DHoZ#Di8EHnBXoȔoJJ`EF@C8oH5D�FaTbpF2T؆a=HEBJ1�Q@Sj<n<+o$d(BX�=Kh{|}Dz@wdixK]0�GEn@IRB5KLFMLH.2FME#bۆJ�xg@QXN5H`N@Zx�E0VJX OCrPMʫl--BD(dЩQLNІKCtb9GS.>4Bx?>0WlDNHMRo,̹lx5<N-E8S:\JJC_ Fpp0\MRGpHM۬M|rжBX�^0�e[XGPWHS
    \(NBNNihTCN[`H�K�AG�{lOFP$kFhO4H*CЅ/WWxZi HEDhD�0FjP0IKx\k(E`qXnȔE(
    qEj9E_Wf mɴ:B�D@�bB_섪tMĔRɴ++shDe@.,UEMKoCv�Kh@7EXeL$*DL/E06u+ԪC(iDG�MR#)LMI`RJXIWM'Kj+ԪFNF󅰐f,\;fVpU6]Գ2Dhtx6DPF$m|OOԅd s`Gw8s8�Khp�yWJRdhAr(`e:CDdfKqgXrXBݪCwxiMH�R)=ORIY+TRhSKZhD5rS89KH,<B˹UrJTDMPEJUE%.MY(rKZJ]QXN0%=!FHj�spJDEH͎eBpI8JQ-FZ4l*[^�pkDlFsF؝z=҅̍/
    ]tzІZGohE YmT`�)zTN`ȐGKGGsJ萨�܅%LH`Г*Yi<HDgpnpEhXxM0QcCdl UK7-�X۪Wx�ԓL@ZZҵٚM
    œJ
    9C E(\56E=lGYQeT(D8Q,HhVdC5ExXh(R|Z!}FuJ1K(O[_WhGh[hP)ܰJlT<i[Kbu,+i6~[<;H@OhmPc[FXOsI0wX:k@�HdI0wpkJFE6S�;h[I�sXVXEZ\^
    _@�阅ކJ ah8D]HPY peiH׵o�ihYxMhVA_uRg@3!{=J@
    {C
    4ZQBMB3ᇎCv[X
    >WP-a֫Eu~9uˊ=xGHkXI
    ?K7eT]~K~{pxS,<2aaipEhxIX3gxc@+JYJ-
    ]ab8Jp>V
    j>hkTVH"=VTh4/qdltaYHpiURX2cHhi`DFhlH0m7ȺB`SsPeXwWyxNpCHWecplPV݄wPjUPexjUHeehE] hlPichVyO@] v@LȫDX}Jp}@7:ֺH>cP&Ζ	gYm-ep|�nǢS5W [0R.L`4BIpdIȅGmW,LHSnbpbZ+C(Ji3Y1:&0F(B0)'')+
    rx.+0
    "3/
    06O74s4W;s>ǰvZS(>Q_djq>-MRY*XI`Q8IeCE\E\O&6[�TX�PfVuZp_tn@dPU`I@eUP#rkW6{Ju~;Q buW˒/_+d>3Orr*Twy/['>rJMw&twuED}J*9r.>k0lsFkxJAJ>B@M]y
    0wCPv/(ww<rfpyMxNfI
    z*F,*)B/jw{)*<J*穦z2gZ.dRWk&s|'row''7}~':v"(Bտ|R.)"|IڟEߥ`a~ߧϥg?\"7!@!O~bZ~O%~\?8	C(ggPf0≨hk` �6Lp!Ä\qj(q"Ŋ+.5"ǎ?)r"QkS([ˌ)SүeɊ)k`}"#V2t)M
    XY1f!jlȄ!{yVg
    j@QԄv+w.ݺAKw@fjw``I
    #bw1SZDqA	rhK5.Vˠ[ŊZس//#TBOݸUX۷f	9
    H�u<&nZݺwL3py3PS2|Ҷo)N7H]" R8 EPI
    -,/@)xs7r)hS&%GАSQ&\BsLE#@P3d.I(#7 d0�6HAp:(:WgNE3ʨe	lpZ2jbk5,E-('hAiƙCH2mr
    "	2]I�`)(J!@pgF6%dS"`BI$	ղK�S@hsIk�
    "hIF;m�!)cY
    &8+�<�2Jt.Rh PAB	Ap�G6bT"ǔBP,0K1B0e$!}E׌.X4M['$ꮒY0&쌊,J)9:T0&
    	%MOC]Q7D3@BM�uQ-PS+\vu1Yg
    )AlS63o
    *De*Cts"+D1k�rr9A#Bݔ$
    )Ũ#
    4<#¸@N-t#Y"@ȫ
    "}�c<X}e7
    H#
    !$IML0p3X3%$'�03
    F-4=abS`J
    X 2h!`(l�|̐7%$qa�3#Jdj@T
    xQB4Đ0R(!#eH XTH7m6d5{ 0uqB
    AU��6a/�CT<Y#F+pA2�7c$vYE7T’P2DA$wITo hDM%Zo P_",!H2!FՈG0\lP@,nqjh6"aQ#2TphNA-XZPE71`"�LZ;.G
    ^E&ȁX'S9l[(o7zZD
    j62zCT2eʈexJITǶ^$
    )q,dɌ7╳ (iH5qT]L	r	XĢA@qC^նh1d+$ZM7+$LXk!#5U%G/NL@j :
    R-\{�}�ȧfQ'bQOlbg$HQ
    tb!!#B<q�5�2)
    SB;""\6Gb%Q
    SZ[E5
    et5%t 2�)]9ly<O$@3LiD$J=%!L*`:Ԥ"nLbBHd(J\F*8!3
    SF[1L.b89.y @#&dkwх1,oyiB^4m0bf{3ہpc12^LC@)
    .QtQL]Se8FF
    Nk7X7�٪UPgUƛg]U(){m	ql3/RqlfPMe$'S<.-!4rO,c pW&=Dt�4ݛ.{8:X'v#7RR):{1E'5>U1p9t 1gu)<FW|!@Hތ>8"Dل321	F삲h"q"xD Oь^P&1aü4Ac0H'dxD/V}Wi<L.-r	r#k/
    qYpP�HCF-][hѸ8效Pai,⮧/ZK%8e7C^08SAG(p#!}?!`A*yDWqML#*jF7!t6u0@~1K6c[5%T®%P)$@B$!8)�8 Z %[[x HD$b"@($<!@$m`A`Ҍ V!L%"8$ 
    !LB% $LB\B6pC8\27h6CD8C|*87 -/7a�|8|)+pAC�6'	m9t8xB5y5\�xB8`C#<)C0B'L9T'59B5'L(N8l9R+38؈0x!6H!PC,H0Ԣd4
    0pB>;l*cU6h9IQc(&6 V
    &78~c�`2NDcA `;£B(^O<=)cGc?�;:\,6dC:d5:CN?$;#AR$\�!ndHHNH.U5$F£FuKLIIfId%(�OeP
    PeQQ"O.#($BRBeTJT"HB,`SRVreWzWeQ*B*BOYeZZe[[e"+e]
    e"\B,LYe_r"P,hF,\#a"fb*b2fc:cBfd"�<+aJffjfrfb6%Ă&`fgfiifj6#)jfllfmmi2(Bnb2B&B%4onfȂ%ؒ�8ss#@O6s:"Ps:gvn'w
    @txgy#eyg{{g{2hjz}g~~gg#urOR#0BP6P
    #ؒ''�Hh~Nh|2v:OhWrg#4t~'wn脢hx�ov�|gΨ'#`p:x(u2Rh2%#,�Du*&|*%|B't%|'#0B
    )w:“JB(zg)~ghڧsi� !Hy",�4)x!!,xii£B",j*y�i:ꦲ'.#BR詖n*&x:"p'$h&d'xB&<%x'`'lwҏ#*"L{τ:#d甎)6"Lj
    @#D'`B'X&pB&tB
    p**u:$H#$@wk뿂ggvz~*hVŽ,�^fi'T"`riJ(dˆv**'s>g#@B+|C,�p8|5|9|"t'"B9.,R#7!BNӾi}�B-x#-|g"tY&4#Tmz톖զ-Bxv%BĒg�T'4(#Ԃ-'"&,!Pi#8myz,&(:�@�<- nC8T40;p7Ѓ-7<p!s.B&x1}.-pC"�\B'#\1${,7/�~v2Ȗs6"t9x"('<C-;7ȃ7d7|>C*C*~<|.4,(,s2B%Я>m/|�+8B&B03B.(-B~
    5l6Tr>2C2(9`B&6)F1,"x& /+P74"B0/�
    CB1C-Dp2VpFmR1DC4#@:LC4C#l"hF;B!hF0dq0s-$B1HC4qCvJ3@C&R(#�C;3/ft:g"x<",2;$rB�H<%4@0�&2B(C
    2(?#@^'Bl=#æ܂8!�+BpBt
    �RgO~f$vB2zt"//v,U&4(#(ts"78-L5'9kvBv#|vm$BՑs�"B=p:B!l'<K+<"|"PE;B?W+$Z+HEc2&<'X3'(sJt|L'C$1"/ �O4P.4Mg"B(H%`+85"6+ z*4%2iv'u$7B*B3+7L^%0sC&(]_gt .<1FRic'$B!$7D$|DpZ4"7B!|E#7HBq&B%H6#!7LB$fvj6L)-j#Tqv+*l01$\4!|%�B6w7)|m7s",~Ctx%4'G7wgw@xows2u4=vBx#$v% B$<B"`(@#h&PB&hB&,q&,}R,B
    "t$(&d%8#D(\B"$$88H�L8$pw?u6$+<%$,pY#@_/*%!3@&('$T/!d(q"pR4 (�/8*|B!5V82*̗y6BKi�\CgMs#Ȫ6$v$$B'8b'‰@oxNg�8+u:* X@04lWt@!<CYs�+@7t¢Cs*7|h!4ui`Cz6v*!\.ЂVl%P)tB"7$#|v+B5<B$$@B#C-",@o�1�(.Č#+^@.ػs8'T4-0$lb-\"<5!5d+K";o:!t1%,8-|×x$B#$2B'Pǚ$x6/X8ă(<|B.5" B/2ԗ/ "p8"l5\!84÷Ճ7<%”/:)xC< e
    6'8B<�~<C,97$8-oB9$C8.C.2l0P-8< >2>8ء8!pC(1"x1BlEb她"&x\n!0nw9wK;9!"H"ܭ\¦{'uǧ.-%3x37:
    s':4"2>:@$�}HРBtj8bEpj@C)bDbI'QȈR,M'*5M"GE(Q%j$
    (4,XFANROj"E"I&-͊UtԠ	sHWN_c?mT3TJ۰,FZ9[8hqRR#ʌvIʖ/-,RAT2-deݣX;@OM,U�X DI^)>JV�d
    e_B
    SkF`h,Q+f
    voUYx%^A ky�ebAdl)dE@KLB(%�a9EY&m,1aةE"DZUq~Fyp,effFBjhLY$D!EFLLS5ټhQZiS4
    e(Cm3>$JVPCCHLtQD!&`pYeE&ֲDdPEB^B  dbQ E$K1VMnU8:Ԣ6Y)GmM\7Qy$"!CH _x	JI$o [	eHqDoYwH՗_DF0�x\HA	6ؑFlq$�]6`/'Fz)EFԉ!EiFyo8넙Ix#/K35:Ėg?cإ�&ɄH|Σ�CgƕEMec9J$B殛"70ej	V)dL2yFfyEWBDCg2C	SęW1i	Er1PF|A!ǘobj`cu?h~DmѤFH	;�PI'$rJ&+9ǖYp<s2w|3Nu[7oD"	@"hW5n@:}/ʶƠB0"(H@D#"3hȠG,4',ѽ.-y	!_xD3nh(B�Wbl`#-n!
    EË~y:~AŌHi|xi1u$P6T1>⏍X'Iwb)H8b�Lg,#%DlB#[Pc00`DfXDdjAKm5/�hP&Q	B\"0#$S$fP,Uao@;6<c<@),T6,Qj:HF� JL5 (6qKGq�hWdj"�`)6)�dbꂑ6|ʍmK]&g\
    h&8B-'O
    ŸP#*kxe-̺(5se 2C@*&4PvАO,!MxB ŐAGP<DhG"Q`��iTKjGXD&GYBV#۾6ZO4b
    iÑ3$Q>N)x1I	h@`t!7xw'dhNHĐ
    V$" 1z!Da|ddC&߼""x""iXQD)V1&FD#~h$HL"P`
    4
    SX2џWlCĐ�|]1ܑ
    E;Q
    |BxF5D,Cʀ.!]�H44E0'K
    U�cU*CcE!	D 489CX=KcԘǣ!Lc3qX "D5A
    u<`~^G+C͛x<Y$F5!
    Qx19iLS"Nf(b^QnPhIRxv4Qs#c�렄m6%	].+#Ʀ:ɂ Ȅ,^E)ʂO#%I([$4qTO%}+WZID>R"x9!sTyG*�9Ip܁E/DӐxlh:ө>ulUFtNw~S.LQ>,p>آhȄ'q]b %f	D@܊$X!CL"1\$#ؑ@-X)YNX-D%=7!<ބ"gY(bvXX-&q
    [EgB(&Fq+<!
    ۛb*Kb0E-NO/@*_x/I{XaR |cXATnQ"AN@>o�AZ
    pN
    `"a"6A":E(k">!#�Hk $戎q.vAY~R唰	p""lj
    
    A0Afa*
    Afp7mvIb
    $e
    '<F
    !PxЅ$D�lP.#A0
    
    Bl0 q573`-$$Dqm7wPMQ
    [n7)"Y		k
    [kMr0\cr.#	n
    %	*
    ݇&!qɑnMH.JUq1qQ�a#r 	 ( 
    r!!!!"Yc"5r#9#=#A2$D$MnP$Y!$@nk&i&m&q2'ur'k\'r((iR$!l())2*sRRA*2+r+++R*AX!,Ͳ&baβ-R(AfA\..2/r//.8/	0
    0rdg11!32%/Qa&21335s393=31X4I3/#A4U32`b.W3620S6cS16us732y738s8KS43O357[5r93633qs:38}:s;;/803<I96X*�Ar.+.+?64<:@13;R~A~a3=҃P1/AC#s;-aR^EC/4BtGktG.K
    /@Cs4s�z)J	.dz@O?dzN#�.L<ѳ.a!p.VhA!7O.!\
    @SI	@*zrJ4�,,!S5fBSKT-T1.)rpA><RslV2js/'A?YUz..!3NtN.7!]C
    /3a&B;0z!r1,!\!Z!DaAaաfzaaRsFQ'<3fAQS`P_.4<H.ogSD\hMz@zA[6_	:겫`k3eQ`aa9".kag[Bcn
    
    p`*/tz
    !0a5/_�2c)/;WYeX?/!28XTW)AZWv[5H22rh&�8d<$yT1/T0gx�a/]Us*�JzឦjDDa�Xz!Se힨aD7@fQS@Pt!JX[&Oi%D^Rz@8�$G*TK/?VQks1266/iAR6�d
    kzb۶.Eagrr8S6zA.ZvԌ&�ef@؍{x.7/x8yU!4Bap/JǹHda6A:@J6cϘA$!7!D9asۖ!x
    AM#�T({ka>`!4!LQA^!uLDqZ
    |W6.WyCkم
    Ske
    e34c[A'dmp5ϳiR88[JEXuSQ؄=vXX_XP?aH?uzzw@Z=]!j.-?.Wa6�>"UB"�zζw.zaվ2<D!:nAa"DAjAAnPBX@j!ظb@a;A64YA
    !AaA.aa*:xb(TvAIA[Ra_ zDT!X�R!7�ȷt(!sk+ܦ:gX97vOĞATa^jiEMҤ5rh:]ڄ!U=3m+9.@6�j!ha.7.ǥz̓!7/:�2|.Ɂ̷/ǁa;4aaa#L	:rdD/M\Ac8!6yi:"A?i{7y8:jA!BA!j]Caj6aj!A]_,pTwqA!/@`G5Bu@N(˫C8�NO
    A2,R�yOjYA>W<�9//S�Ai?zĕJAAY~4a0=a{2vRRN.AGEȁ;k?WaC|ک`'|.׼zvɾzZ/ua/՘_e{ao؎Z%!7=8^A?	~Lp?8Fzj}|a7\ʉuS!}BHXA=vB5"!\zxPߍ_w.^'+)\RÇs̚ZZfK?L ٻ2l�>@,Gf	Q.r%(h (@GL `e22iFϟ@"p)ѣH*MH$e+odzjqYv%T	Sʾ
    )UzMAL3ˣo{Զo mKQCL(ehg_5:QoRm2�BTa*0bX`Z�1r/c
    p
    ԣ^՜RZ 	!V.CQX蛈�5<2#xC"ېO*8È8!s&4'Cb83K$J5m2 H�X�,,-x%)#ތ!"\!t"N%(TZbA7�ԚlfPI]"$@*<|>E"ˍt&:'5Qe'xTxYF>ebN65Ӎ6Dgf�#S�<ؒzI9(QCFS1BB	%$	$0�FRkm!
    HDDV"#.EotH2	%-$,k?]
    7�2|658xI^D
    "/0
    @*X8ß)96xBJO
    yDS-TL;,%N+\ΫOΨ,IJ0K;r6
    ;r+c8ݔ+ߤĉ-Tc'Ϙ
    6͇.<v9@d7
    .䄃M!v!N1D:LbgV6TN8O";s
    QD3DŀiˇT԰槯<7/={'ݻ�>0w;0n�+HAH
    T8B:nJ 
    W;ac!�%P|!P@ۍ|=<	Iq!&)K=YPBȢ.z`ǨE0H6D,07x̣FEX IBL"Qbb".I2"(! (GIRL*WQ
    E([IZl%bY0ILT:Be1f:Ќ4)LF̦)XTg5)YXH:ufdѩN8b=x�
    @r�MBІXDC'JъZh#IO}fŎ&u#RЕ3`);3
    weD>ŐⱞN:TH5T  )TPLxLͪSţMKt4#!HSDHqOt*#!W\�$VYMlE!	�8!)�D(�,e	Zъ2=dClg?ZVg5[φMoYC�מ%nrd'z)	Ml"D&q	Op+T1	GlU$J^`D=7Vbh#Q^ _j$<NXD'
    ݻZu]E#
    	HwVG,,tJ~p^jJ`egv3FǟgϺ
    9f-9H8�2^ 9""D"c#X
    ZBć
    cqLxd@-jWGT!4Yb(uĞ]XFHѵXN=Jp-b
    P bK&%>Sr#нB gk\f2Gk>#՘F0wpE:!ypc-"2
    Dc]-XD:Cc]N�$WS8|ZT(ĺEtX">yx79C9q53DFBPw<+qI5q+`!`C<9.ߘuD#n!r$#`ӟԋr=90GyzM2ZH8"	Bf)
    z.0T~waB*o1QkՠrF:Xx## iDcȧ"4aE(F`d>E"!hcw=!/{JD۹R`#g/hS�<La_M>~
    B2�};܎pF#^BO`,�NPgo2
    OE>YDPY_NOmfp]E'v\Հ1eFۇ	Xܠ	p`aNOO5)HO
    �:%	P$PnP	P
    @	V0
    
    PQ			mfmxrP27-E�	`~ĠmFg	ԁY	Ep�
    p	PNbV�p%
    `0`
    *PPw
    Q`xxHx	P
    0	$0
    
    Pd
    �NP	`
    	\؎H�0MQ
    ۠4�	VH@	Au,w��0f
    Jn\I
    e	Bv/Y߀ p	P}	0ɃÖN
    p+�`@ 
    w2 
    dj@		�
    		p	]N	NANN
    p�
    ݠpq@8�
    5Rp	0I 	,]W@6	pdR`	`u@�pP}vp
    r
    � 
     
    p	J	
    @U	~@\
    ІEiPu8T ѥ
    		̹	ϹNhp
    ΠP
    @W�`Ӱ	
    Wd	&gETπ'�
    Рn+
    0		@O
    PZ͐gh9vgs]p
    VWqY	`
    &�|0	a@X8oP
    �	89@Nm z`ˠ
    YlYIRJP
    cƤp|`P#�	 p
    �rn)@
    
    I	Y	԰0	
    0 
     `
    @uV0_@
    	P̀�_�  p`@@
    p
    `
    ڀpo0p
     	P?۶05B
    p	ȰZo `
    *@	wZ	�V0�:IeNp-
    FWU-	m9ЌМ�
    	
    Qph`|�
    zʠ^XNe
    4Ӱ�*po0(,*	/Z
    v@
    ۣ�
    WP N�yU0T
    ΰ
    6skO�
    `x*�
    PxۧQ@	pZJn	
    �		 4P[	�;	�jl7ޠ�|P	0	 
    p
    .`
    pr p
    p
    a	PWY@
    р$n$	�߰
    Ry|[ 
    !0[K*9qsxjղ/3[t5K5�	&O	
    A	ٰ
    ˰
    '��N;P+oа�'�HG1HNTPЇbPlN 
    O� 	@
    w[Ќ	\
    �	a߰hY	Nʼ0ì[JPؠSXŬt
    
    D`@
    0
    QOΗPs~\t�@P0	@	XEz
    `02@'d�Pxа
    
    0�)1nP`pP
    	@r M
    �٠	
    `�՚
    p�|@5n8
    k0SCYp0Y$	߰[O<"śtV<ke͠"a\	'DI
    Ƞ
    ؋�	P
    Xe&&`Ȍ
    ŀRp6f@@s�YC|xn]Pd.ѠrC
    ـ
    dp 
    .RPҀP߷0
    
    =
    pOr
    ۠
    ߶�	;`
    Ōp
    p+L(	`F!8_ruР``��Y⓰[O�P�
     �*	`	 ^	lC+
    1	mQ
    u
     
     
    ̀ˀ l	p0	ȓ0v:ڠ	@ �� ��9ʈ`_p:
    @	
    Y7
    Pu�&97��
    &	mhb
    >݊w9��| g԰׾ː1U~AT20J{ �0]@
    �ְHy
    ְPnc`	𤊠kɰpGQedV^%��
    Ҁyp	tɂvO�
    @	,x &/={FY
    +E}6n
    Д}5S~	 
    r
    Q	 
    5(|
    7qmPm~0
    0
    ˰
    K(�@3 ٠P
    }(#w\
     
    7P90ư}	@͐�
    lE
    p	`A
      ,0
     
    
    @
    Ԁmmj8w6O(En{TimH@S)KǐdK1eΤYMFKGI[֭[Hͤ0 4dd)V%F?n}4h)VYIS�D2!*+MGd9r$R֜d4ZJ1)+#T-kF(MdFUKjĕ#B5LFbib`TP#07/ݻr	ht<8ɗ]݋%'wO<z_zꅾOϲ*S�oYjŔBZjEÖKēE!ěK6Kfy[$aEC&ŒMYd\$YđEbJ<Nn)[%PёYZ
    Hd$\&A$HT@\bY0]<A$EB@XVaUn[`9YeBLœB6WdY6aQh	EMUBĖ	A>HZdS	E2F"I$UgajVxFLLFd*wuVYVnEi3EʣFD)U$F˯fy3Yא1	=)8mNzedݩ�5Ւ`b`vC�w+xMED$j*AE2D^xCy_
    <
    al<
    Idu+6dKG)$gyAv݅9BKc~WS}z
    qi6W{ؐDKūV*
    7
    cCt]#r/'xV[w4}I&^}w{p][6KX*nywy裗~zՠ~{~FdD7|WyG�$y~gdyU#@Ź FP`-xAJZ�E"2APT$b	P+da]
    *"PmxCP;a}D?$Q-T%D7@SbxE,fQ[b
    NtQc$cYLŒkdcF8rcxG<Q{c
    VQW#yH8
    `|""I/D'yILqd'=IPc!IIE22c$YyJR,myK\沎MK?)4!C-fТ3Hj^+YX~Sveqf2e XF2MXP"8Wt+E
    (36dD@D!d3vAEX � hQqd�HLQЈg*	+RR<E&c8S4�>T&1i#Rd.XE"`-AEH,˰:ֲG ͝j1TD7qj|ͨ"]5�0%�l0`XK,SC8pzF\T7&Eal!Il$
    n$h+Eۂ#S,Yf6Nq
    o9NmPqMA.fbLaU^]6Zp$Bd@8D�#h~p"7"q
    uÊHS2Y+V[BhDuDPb3l1֘Jb15Uk:Ŧ7�P44n@'Akx"�2(LEB(&,4uD6LP"UGqZT!�86016X0a,*b!J�O=#�͆&\+BS'\{RBņ7N#qRL1ҜE1La6DI_5+ITÊGZM
    ccn#x}hWdϫpF�4#c(DQ�,#s"@
    +&~rJ#JB$�F�<z[Icju"5@͂g")c)*k)^϶a%q)"cour+&@ʭHbL
    +r)"S<D7Cz(
    RPqPt)"Rd0!d)SondBtc;m!)p}mbo+}I%fmEn<"�.Bb$C|$!3zԤu8Ņ4@z # ,1jLИ)a�Xc֬H
    hh5@	g 3[i܂ΞȧH*j|+6&Y	"w'{3A~f+>Stc|ES1qٌ"ms>$B U1s�mXY"țb@VP+;C�Hp,{n>JxAQPe):*)x:Uo8kzʊ;&B*;*;dq`Sj5+{XSM "mcaH�ePmZ[CVPn#0]b RPTȅt�ShIFglNnpUBDLL\\ uxVX[USfho"Enl>*�hC8ceP۾�о&#%FX!#0{d?,Gs8EC*88+B@>+˃Xحj@d")�C*3Z
    �hB9zD&$L3,@h"rqC+Z_"jpj0)oXwƷC`� +BR,D*_6XpBi껿"f@EXO؄X؋R?nڵ?Rۅ`fXmPaHg LgO7TԄPg\Pí*ZZPxO3IEX)BPnpBľ*jk%h|BF"KqXTs,uT%#C@"d8@3}=� gxpy0�a(Ch9DX`O)
    H<AT+:+cpfh,c`g++:0sB�f(+[~"*J)2Oddi@_@S<n;N@lg�?W0h<"Si8m8rŭGe*ܛP)M~4ӬG׼הFٜ\MOTn4ޔDd?J\·"i�\HOX)h<Hzc0� �<XF>&S$BPl�<oF
    vhAMFo#U$CSUoPNSA�Ukw\):MhBvpgxd<V)y7R@B_"YS-ΚDV)rR.gȄI`]I_F8$ox<fH+ePLЇbڮiH<Fp~HN8G@Px^`R<Qxc@lȅNc(qD^PGN@YDBQlQ讘N@;e �dPMThD[)JEpEZڋ\jL B1SX@ST GPÜGHL+jP�[@PTR8AMvL0lPfm
    �S�q`έ)Q])rTۿB9*J2JW+H2ۥ*�ۥ]ߥ,^,íHR^㝢EHxBHx޲^"BJE]I_tKnCqmІsYp)R;Dt^ZpASUAS#�lO K
    �\`WSqSeضWhc84sTkvU`6"Y0e`pFN�l0,gP0~Vgqh` `lC,brJT"6N ��wN}%2jm BUq[=
    Ǹڄs|n\p3dDv\[@\㝲;<
    <LddN9N6d+?׍ddQ&KEpIB%NeZMmP� e5eCe]ƥU_Dfe>O\e^S_n7`^fYfkfmޥ[~geaZ"r
    r^:Jgw~g!gzg{g| |"$~~&yɞ>
    ^hi�hhh^i2jёeha	i`~aيh
    BjPXpꄑ隖jA0jjFh@i�qFkQif	>n9H
    E؄O
    EONfjF8�I[iiIި�(lvhϦC`̙El>mf	~mVԦ	ƙ	VNM؄LxKNOln<GhnǮ	ƣ	ޘGhFSI؄VMM`nM`MPO@!ߞHPqpkyO@ppG̼FppkƠkshHX8qk(sp-^0ۓq]qZ
    lkhpTJiڄp(+_-ZP\ J``@M B4o7Kd	dA>j>'[wpT>�piapwn[HoU^*EnHK QXP0WXsp@hs0w�`/~8mpt8s(wlDlfQ_"S߉�V�qN`(rgs/\rrpnW^0[DrE@qqtH8xM@_ЅWxmO^B`X	cxZpwg!xOɆkhFuhFE[P`p^(h`y[Hb
    ozFxzaIxho
    `h`�#
    g	uS@#fV7yFiah0G^E|h[Z8lDpr[C0"R,�`E(0jh
    >d(.E_/Z�0VLj!yz}ڗi	
    a
    79IWXVS�LKX(ei LUhsHUІOy	o�H8cD^�t!1]0d)V%F'Rh"ƌ7Rd$	YWyT(X/D~B$&2$ˑ#Y$Nt@٭CDIZDɛE5k5S"nU3j&V{@ǰpjشjײeD)&A:U(ѷH
    �V�DZB(}C蛤F+fСo"}Sxs
    F*5Jj۰BtFb@Ff5oߤN`}ͧKP!zlOXIc#Kv3(E!$5lC	"<&@ˆ&P&~B4‰&(b'H&6r6I'2&dR%8'\JQHI%`	'0ȍ9F%B'	'B&(	47.|R,P	!H4@.CK!<rE6'[
    :(5(E<'I"h\JC1Z>1S!"M%Drȩrԓ6SzLP$"!@3dSxI"|s74,E4Se\zu"R�-NF)/(6I8@$$R	`[J5D$&SK-O,0�/&2ز# 
    -W4X@.34rPqR4ױ-@D`0	vDyH(LэFw^zR+*@"H#H'H9x8X2N<#'cM) ҋ8tX/"x#/lB
    %HS1Ӎ8?`	&l#$9t8,	3GI04c2CJ"0R8߼)J"ĬcBO^--xVf!H!|<"Ҩ363	8<tI?!hZlA4Db`()*4H+`17+CV5INS-^|
    eHZrj]/Yz6
    ƁW\*iF4~6//}_(_A
    a^\$j@C8it1Hݕb@!|ᲆh3VF
    E1h#PHӌPTc*%IjZ2!xD,qs#�07~5"�$^	Jȣ|@F�bFآ+(0~aB%))X+T(m!aPlr�H8ȹ
    Tc{ZgB@D7(q
    N#*g<c "7Kx2[B#�YB&
    NCbh`x	D$b
    TUj(Jh"qNdX|iz>x+ΒxV0dĢ
    &pCZ͕uòe(G9SPq\�H5�pcH`"ze(	B8BРf8Y "r1^㯐e	Y8F=袳RJlCqtrRi@#BdG`$\ٜfG<Ny<ɐC8M�fQ]#�% KY&�ͨ!	D<p"gh1qoPB!_u�YF-
    ak,D5"b1PF4bH8IT^rih+dqL4f�Y
    qmxn]NDaU]QT= G,TUI #F)S")Ef({D"<qsB7e S|("L̪xskB\'UeD*CBx$sg"�Z8҃,/2t?vK5%H浴u":|W4͸.TVK6RqjiPD0hV&4pG ٷi@fLm'ҶOb&)0:�F&�mnIX#p;g-!4G@C$`a"Y{'GEOO_ �]Fv�M@D6L6I@.$!C?[x#�xEv߱f�}/D�Ja	g.AU Z�!8p,oO!LnN8'�A,U,>1F
    gm1	>k<ʜ+쥈Pc�_"Je!hZŌW|o8"?âpLibJ7pXctK!jx@@#!
    )B~2('�#r(NSX7 E�À4!K@xh101X%@4Pº`#+Q3$`fI`e$L`%̄"+#C{+eB*,4CC{!iɝ
    (@1<"D3H%
    E(B)BDB3HT0/@C4$B&!"at"40T4B.:,263pL.$G;d"B5&2T>2<C5܃*$2H2�.HC22C3%4|BWtC">)H3 !+2܂*0>p'J'`3<5$P)�@B1@4�C!68&(Ld"64B09,.;$A4#"8D#%,(j�>TU(B(/#yş:.muC7J1_="�həy:r68T2dC8XL!""AC
    M�d,B$�)B-B)x&tȓ$$$(v"@J$*܆C\dy㠔EBǁEbhDBOtPNWQ$R2i!%`(7*%`uhU%`,!`%U"xheVV^DWrV>%Ye\JU]t�B-)+@,F-\D',!X)\,D"|d-H+!L.X&0$B-B,I%xºq-!@,xBM-B!.p!T,T8(f!Bo:&B=+xY$B,,F'&,Bk,B(bn+,BD}Ř*X-$M-B"dB<)'$Jğpp-TBU,hGTfDE^$$@)()Gi#\hGfS%fEe!0Ue`�<%eSh֔覑ոDX褎(j!haƐ~ϣ`pI,\% B!(cڐ!,B%7dT)B`)"1B9Mi"Ŝꉔ~ibBJJY*iן*Bh"LiR2D;rމPߒ�|㥒nTj)jX$fΪH^3LCV"0 ?ުZdꭺ"+_,(TM+V^+fn+R�<Y<e+Nb++:kK0#+,2Bb@d,,k­�^,fn,v~l+B"ɞ,ʦ,*$BV,Ƭ,l*B*",,-l"+fl"\B,F*%,@�dn-v~-؆؎-"+p٦ڮ-z"Br-֭ޭآ(--.-(B&F,0>
    ,Bn٢Z~.ކ.閮.*n2.J.b-m֮v...ں&:Bv)hBB1<3(C3PV4Tn)lBnr"C3}1(2 %2$C1`/5im#P9��ؚپ�'n)8C10&�2T1,2\022,1[3ԉ¼(rt/{m�$C3U֒
    4 "ok)dB"18C%h- o6"4C*d-3+,"*-B22xn�!D> .omn't7 q5|74ז
    %ȣ|l-o7t 
    "g"c|"	7D
    -TN7lN6U^)o�H*g++kmj"$,+/po67.)6l@(tGB9m&l&B>ЮB>hsؒ
    Z.,7$0x( 8B0�1B64<'0C)B.h-7D)C9t*C@q0F,!r74q#pq"P>B6-1]IB+yp67�(e2&\"Xs�x0i5&`^(No@C4%dB6	8R$pm-2C-6\*Vu�W_J!h&5Z*#ȉ*=B&T¥|+��w\30�r6<6B%hm6p)/&S6,4v�+/0-"1Bw%rh-6$6^ g$TC.08Bm#xqWB&*0&OC(2�]0du"Bqm]7R/B.!0ÿ5d7y(p452̋'\Ce|C|7O.K0,Sjkg-2pg|HBg-2Qkvwmcw7ޅw--\	'…Bgm,pxӴ֊)l.�C]t(xv20mf-.и-OB7,B�$Bg�O47Lt”gSyrv6׊6P8#\rs1O�4!C2h>$W_35rg6 .H(B= C2,o=(TCb4)LC13To-DzZ]1=4R3518|4>7*7-?7Ӻ5x6Ovwu7LO4Q13&s�d7;עt\x" g-6谁'6o6,z:+u18l0x5|x,ܞ"0_xx�C8p#3rxw7lTV2,Ci�?|ă*p7�ZJĒoCQk9|f9Ó8[=TC<\ism.,C0f5h10lC$(N26C+4]!I7b-.1)C*B:)$,J6HX8h*@C!-d'`B5.:s�<C+B,*`)N+|*<p6z�&^ֺz򺹟/.#,m;P4zWA/{'Ci<{gm"o2",'x#xגq*7,pG/1u�we0xz{_XES&*JS]W3s-9Ђ89؎-2�5�I0xַu
    ЭQ�neD5j<jADY�X
    ɢuR6
    (�biX�Z#.�M>qKӵ�$ @�a
    @I[�yB6UѰteS!hKPåhHIN]]VRP>)�$J:*b͙�2xtfFSvvlٳi׶} (Vy&LA6a{1qd1:lfZ
    X կaX>S,Gf	hCND^ă[
    @=4gQe[DIR敃D	`bReC&BLnDQ\Z
    1_4f%Ft1g[!"[EӨZʈ(7	,iFJ" ZD)fTAƦdz&�D~Ak$
    K;2Ȗg@!;W&m9:L%:�\ I;?Y�HɃN;l>*mFMm5eZs	.�B+�9r=B$RҮNfK-kM]&D>YƠQ9 G1*DIF]v	pl[^
    6<u^v=Hei�Nƛt&S Δ@lǝ(yNiEMƠdqBM RFdqmun\qig2]FqRyܐKBQ}h$iF'Ny^&uQ^9lr$cq*^2GA@N:<5	VdQ$\D)tH8IRQe_^
    p$Ah|AM[YD.Bqf6ky^EϠLM{~?_VзX1%�R!edZs-
    p�a@<I&̑
    5^ƴ�*(8AHD$4/N8r
    YFP0!(A	FDUCJ+5Cz^pAaDD+ D�"yQ$ضy2%ڶJsl[!&Q	7dk3D6!cІ6Y#AT1!/q**cr38elW�p(B
    g^c�E�<k *Kc 02]0i�6u8la�Z!H1HbH:riD"wp109C5Ck
    mCP&PX-&΁
    =*[	R>Zd\Х1Br,n< WLySF?MFjEiiR{S>Y"D܄VѠv5DkzfgWVHUV|A!1N*^ŚTK�_gW`"Y-XǢd	3U0eiCZ0H#\meSZ&U!\�;��������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/manual/images/chapters/layouts/htmlLayout1.png����������������������������������0000644�0001750�0001750�00000052501�12143164146�025075� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR�����������sRGB����gAMA��a���	pHYs����od��TIDATx^};$Zu\[~6545. rdcV wf/,2+*QO?0C0tb&e!`O
    !`!Ex)3C0
    !`!Ex)3C0
    !`!Ex)3C0
    !`!Ex)3C0
    !`!Ex)3C0
    !`!E7_Tn-2Jm `Aii:0pEt\ԴEV֯{[4XhPZZx9&nښ`dm `Aii
    .ugQ)A01
    *1p'碦-śS"pDPpo1
    .ugQ)A01
    *97;6[|<?hO$
    oi)ՓH!Xu4B/{in_QC<WQQkJ")M$C+T4Wl�}MU;UJe1VU-o_dgǃф~WN6o#w_HF]VL;c9x#iAMN)pdzIPm_oF|h*xbg$?#O?KBohڇ(~-ϟ8fvG6_a?'Mݳ
    Hh
    "
    ][UxCZ	Vcij\poZԩ7iHN?ZQ$Y77aฝho+ܻ④˧5Tf|yUC]>EXĝRpH_;k@gqH5:M%%Qh8s[Gp,,\j89JlxzU"y:g	pN)~ݮ,yC:u>G4P	>7$QE)dtt	�[@mC_�|Zv5342
    "}/:z*'j	ߑvb4{L" \>]|&ER	bMCG¿aalJAiSϰM_zސ9@D:V͘mPő>7xC)[0kGT	(;hG;+Ͱz;E%@7y*oHׄޗIW$6wh}82 
    dO4\VTI{zg0ްnŞE�r@Pi�tRm07}Q}oD2{_!2G͘t#�a?N1!V;)U	rtbr3܊2-9'lV_Y}"ohO�65^̌sG0igRK7=/z:o@
    cYվ9m
    eSoTRPQ~&Vm}y2YK
    pO?~	<	y3H
    o4,xa:o�g*D&з<U{D3l"|9GtQ=7/"2)8o$zQ$=ޗUE;/]*u9Ehr2
    nK"n@!c~/gړ>{az9A9>/]>xh7N9%+j~aFu9"J\ܑ+p	>*eߏWJZYiA[:)6$/t,17Vg$,1XE/om7
    MP~"|t3_߀J@GXP^drԴ^InH;Ҧ(k٣"rзzvE}*댿CE[/ڔ?
    =&(D_[V;R7xF(V2?<!VTuHu,x#(n{ܥZRz̟X_Rۈa+S8/~Y!RB^)a~nT }\E~gⷌTQ,Px s@W.hfR^`UN^BPCX7O#�>~_/)*WWټhiݨ.uʹ5mQ/|GtSVK$2
    SROZrv༨i3͇]G~ibgX[tuixKNuh.jڢjkmn^]㪅A4G`zuz%Ntь7o՝XU['N]\R;
    Be-]xo\TpTuvGu>LrNQ(-=, ݩF"NkQU[{[4XhPZZFO]jFЄEn-2m `Aii7\]QoN
    "N	iPѠb箨BEM[TmC7(A21ZgኡV质ip5%H&f!b@S7\14
    5mQf,T>Dhjp˧O_޾MubA	L%r.ߗGj]zyOw8
    [wp> "u|gS;\*?qfzuH	p
    ִG)s54.0uJo(\jD"RMw;3Q"}{ITZ:i{zw!}[_l0H8BghCZl~UltfqXް[D`^
    >*Fk<we+-jD9ox
    xC\޾kmu[|7C<6Iܚ-\v@`NPy˵G
    M-B#fCx2E0ݪ\g0\E|Q&-m"sm)7ķ{
    C�}	үԺFxû@Gڭ:*OzPWPsxc
    'jutl]
    _G&!	ӔO4Qm7^_
    !ťK}ǡe]dB5W(B6)+I$d@EkmMk"_u^=|fQ
    lo! e*)*Xh!.H+#}Z}Pz秅|tn<Wc3xC*l"E09!d]d
    o9_rq&XS?jQv7
    Rdڕ(m76zV勞x:"m.xw6$PN$!=Qm8{qDG�/=g?98:%,^lNq#fhA4,B<E�W(8Ge8p}DC_8n>IG.s^6Wxe0eek%'kaRtZů(5؀ux`e�Wnj7$_Ooj_1>Z>X(
    '=X<'y�pD]8/&H޳Ҟ35o
    bWkF7\aNE-iIM"SH5*3Ÿ1@d\F&,/"`C>-{Y)Bpp@70_w	Oo`5ڽHGyC|Rʫ	'	ʳtgUސv
    ;"aZ2+։\u5Qƈ$NM~tgu|eaKj]VyC,D{tv4Ԑ9@&͂fl"S
    O>e&�@ȥ)J!XGu+uy催@\.88C
    
    =@__a`bW,ӰŵXxCu�?S@dEuHEdI4qEXbUxC b/xį-¬+a罿Q�ʂ6Tx剽zZQcL|G*EܧRh1~Ԯ%p	`9y1MRpDPEGx7Α_דD4Ay:ک&MB?)g՜{yT4jRT+jdV5Qv<�˦]a9e�eP{	DGᜢɱv[ki3oXrU[SV+;h闞7ݤޗ\]VCN)H ؏,MԺ!SG$V9@n_È
    ,Y^Ǘ\Wt$}OOWU?I5>r@);LDu`=X?I	~|k Z2$ăl'@3G
    ~˿ Eaxy>}3&!r[@SX]:r
    O6i)Jc.Mxebh#?fe)Ms@:EU
    vMؾ&-jᢦ-2H&Z'.1j
    q$wnb,	JԸxV质ip.2ѺWbb d穛sӸxUfxӋJ7ϲl>qxJ7 6+TV]ґjH[b
    WsW[Ӣ-!";q\55.60FxOjQU[{[4XhPZZF#MF{n$~QU[{[4XhPZZxêqr.jڢj+)A01
    *1ްnuJLLe7'碦-2m `Aii
    ɹiL{[4XhPZZxêqr.jڢj+)A01
    *y
    oO_}T_~{@AN0mfazޡ2=kďR:di;(K~Z~uStUAA UĺΚOlsǥj轐$L¤ErgyC`rOGuPuiSSjiMMJD(\YT.>߾2@y8vb؅l0k$oPrCU]ʉB?U¤͊j^m:]v$XAlWZ+kݨ.鋚֫q}/Ax!?%ܺBZ>İ=@zi5l!?Ǥ*wsם:P0xs٩^1QJVf1
    +WDO�b]O5WmD
    7^ˈ9tV7I:{Eu#xCJz#*rsԺFx7+:8d
    VQ:5}
    oP^&ħ189P({\E=>zKݷ영:s
    o8BHPYE d?q5o'Ȑƒ^r5KpZb9z
    !5նI
    6^E.?+�]Ex+N ^ItG'oӵ˂bRr.Y.Ω#NIqrBJ!#IrA2˹#Yx[eDoHk!
    JDW<D9Tz({L?6۰{y/p>Q#&$Jhe+,σcQE<^
    P2A�.xwQc$PN"gDQ
    pi9K~3?4)ܝ }a:%fD/WD 	f(Mjsn䀉:
    a�w~$>l<BGd@(㴜GA?@ek5$Q$
    X~83ޠo39i]cXv+	1mJf-19&�$_T(ZVa#]
    ##WpBT!Q�hT&IO.ɢL"RJͼҼ"qY&`Y)M&b&LS�T:o>AHw(C]$QdS6j%x."bLxq{3@ւr;}cU[zI[o@=S'hO߮?dn)͸ͥZIbnUa{v=c�ڗb#k,
    ]QW[2ExHY.MuFYBa_^=6R`ltR1KYR.(?mɅiL_uIkA!07mP)yM
    i8o/zGD!8YkzɒμP!ܯ_]GR&xC5v@`~UUDdTKSݹ	;X[z6pH>w
    	7B|o(BE~P_o-$C~-VF7[oDjK+ԧXoCXXXŴ6xi~q'J%Ur#E1Uaye�e8Y[`;(T0/RLdBg"̺ Ȧ@mŀ_͆!|$9iy˔qYխ\}drNqB<7`Tj<QNΌ5xy2U>X>~yBWcaTc]l^~V.fiɗaqznj:^?I	4k $>Fsz�:=DC?6#`P�4! sE\'q�a"!vIx@?EHYP&^[@liv
    Eqd*(&lP2݅dP/
    !6Zu|a5mQ2ѺNR!b՟2db|�0xnqr.jڢj+`u
    p90ް'gCi,_ہ-
    +
    l :oX7NEM[Tme:%&ABE2VuߍsQU[�N	iPѠ,&#df
    i⽭S`b,T4(--q.5#v
    h"7yQU[_N	iPѠb箨BEM[TmCv{[4XhPZZFb
    WtsW[Ӣ-! ʇM3pPxz+tZԴEV8Ě$P1u
    ]QoN
    X3Pdb*"4n8oӧ/oE_GU&H:٠	MВ
    ٣/Y#~%KKg@A]<4W	訫<@u5DKߏP{!II^DX
    }>ņMPz=BJD9wP.loOG,*(OBN-^=>>wefPZ~$JnB9^HGz¡![4YQK@M8fMv$XAl7Z+k}KZE-^Դ^{)M[r`;A[W^\?2ۇVS'¦S~{LB{7׿ԁś`NZ轐$΍Rt2\]K^Msij
    7Hò2bUe
    n^kнҭBܯԺFxûQWUV7*>.JhPՌ7(cD|49'biYЫX"<辧\`STx-HE ^|R!z3p2<y@4$Smk$xLnH6t+βx]&qHC>˂7Aعd,8&89'
    B	+Qn<Ѡ7}ʕY1%`\tTDM;7#6%{Q$ȁ
    Q5BL#<F"oΗDT4I=Bj Mպypb,*:tC4j@厸>g&r{NndDQ
    pi9K~3?4)ܝ }a:;CSF,҂ae|s*[(O9PYtKjќGA[9Ձq�˜NSnn&'k!C:8rRxPLX"oMcoPS�jiLho_5q,^@j!|M%o-�%*V~}ēK(/WBWD5.@dBOiXD'5�UN4It
    BGM\&{4d3rV*
    (Z770Lc4k�SIΘm rEkjpO	ʳt阧Wm1aO'a_߀z\OО]7)͸ͥZIbnUaa?}*Vm<&aU
    SQW[rcAxHY.MuFLX�]1OxYoTOx;@kjt�kX7՝0i`0
    j\N֤xT
    @GhAp	"m
    @D/d%K*xuH}yy_vgFKxXo־oʾJݙwÃBwi;9NrKJ?^Ա}K/ɧT7W_!>aNBZSQyVNN.zXd
    n2c-pPb`F=,gm߈I:N*KdG�a|qd,
    :�@qpwP1<^!.lI1a!u0ʃ Bi:7RrHܧE9gP2 <`<�ٓ)BZ#YZ77@(fCReeܯacVNW8 <g	ʳt阧GmX
    ~
    \̪ė'c6ej'"!|o
    d5`; 7!oc6`PO6/
    �i8CR#E�ۺ۸IS&&
    O78ġB(JO<nyDOH>#/dم
    
    ɂ$T(Eofц'Stc- Ъi=cO`dJ*ks5.pks싚J7M2.異G`b@@b
    B+iQU[]du`xڮjĠ5h브ĬPY+q+ƁsW[Ӣ-!3yrz[{':~&:.jڢj+}}o 
    JKh\|7xM9/jڢj+}|o 
    JKoX}7NEM[Tme:%&ABE2VuߍsQU[�N	iPѠUw\ԴEV&S`b,T4(--caU895mQ	po 
    JKoX}7NEM[Tme:%&ABE2O
    ~/"r߾Kso4	
    Ҭ:L;_F gQJ',/yEwo_+tpN>C XYiMtnTX
    i^5H>:~NJq>oa>EbCOOA	5m Ы6)|A>G\|}eq!#{y'YaNIz䆠,A$'Ic/ռٴLzs>oؑ`1-x^iz/.֫q}/AxKN~l';xr
    kKK>İ=@zi5l!?Ǥ*wsם:P0F0dz-T^HG�F)M:[G/J5U
    @,cޢ-Fk>c?*27Igno^bʝ~m5	\~[hoh!T|TMToUxϵMn{-ow
    v3K_J#JnQO9b^A>#L4ZH�DīOjшn`\xK-p3< oD5MRbG-r9X_FM+βx]&5,(x-yf\
    ]\0$89'
    B	+QnV0}Sr.)A5
    otϸblV+"DWڔ<4Ttmr26Wm7GEOӏ/qR`.%j>$ )Ƣҩc{M7DCeV�
    ].Oiol^$&EJ	{NzE2MJ!w'H_.0<i�tY	G
    Hpk恲
    G>9q@-ЏħA(@Z4$T&fYNRC㟐Ş2zb3}LN1KY(=A+ۀ{ǟ$߫`Sj7)�5P4&	48$}r̜ۙ;_d	J%o!*V~]y]+A+ᾊ4Sll<XzJؼ;$?m
    ԉ~;Dt_.'-^4X2dSr22ow	0ɛlo.{ւom �{:	7
    $oq X7&x7ԩIh"CF`+NZbC	ސ]QW[2EX@Ζb	87* aE#nWwXOxjH>rtRo(WBR$B&J?g^7͝Yp<	
    
    3`oJam"v*Pvq _,{&`	|zIQ>5~ٕl.%SDOxC-D}f3/قTw.rt _ؾhw~|JKe~8ސ"+aBju+?RY"?NNJC2S7\ۀ~x^IK=X.1ہ:;,Z=>i^jn~q'5W	d9@"\f-[YOBir7Wg!Bi:7RrXH)u+"ecRd"P$< {s
    xpA<x~C(Xz֎ʆP1ke>o+rtN<gۀҫ1O0.l`_*"?+#2(T=mYIH<[Y`>W!ACjq<b'x҆vt6#l�mkXuN/iڰH$<�FƔEi"Q\8@HAF,:Vc˕E1HF<eNlh
    \ԴEVD5Rb՟<m*l1Ì7,氤sQU[�ow$bC
    ɹiLYց='5PaYDG
    :ɹiL{[4XhPZZxêqr.jڢj+)A01
    *OG@gyJ:%&ABE2AYBy0+i{[4XhPZZFb
    WtsW[Ӣ-!ȽS`b,T4(--q+X+iQU[
    JLBCĀob(h<wE:-jڢj+b@	Y|:
    W箨BEM[TmC(A21Z77|ӗ"/죪p`slzy|h&hɆQ{Z?J%3 .R~uStUAA UĺΚOlsǥj轐$L¤ErBX+SQ]~$k_Ǜ=%?ϡDMzXsQA>G\|_g<eoi;yB^DIiAiS^(!n.D{!Ita؋fE5/mm@4n,o5a1-xhc4[ʠ좦-tw\Ki"dޒ	ܺ_zsIlbXO=~{zO1i\S
    oa ;kB?287JiʌF£gWĒW)Xk(ֲ(iij%Hؿ=s謂/.3opt^Fn-GT"ԩuw+:8d
    ǣFT
    >PՌ7([\h"pۋnU^RBQ*&(ej%ƒs3S|NQ
    GhCDT^"!z
    ƅ>+S8tHoxhH'Smk$xLn�d譨
    ]1⊸,^ItgHYP7Rr.Y..Gɓ!ޕ(7+D)Wf9|Ĵ?Qug
    @@O9]!jSPMbXZsy<EIzy/p$"ϧGx@ΗcY2UL1NQ-
    } Pr#wH{c#",�5D.b
    Lثo@u�ǀ&7cLo	T"]bAatEBjLd#eXma΍0A*ЏħA(e(H3xL~Ͳ&6Dl15n>o�YnA٬I[5tXqfd&(()֫`S7^l_5be6%0C*AC:dH%o-�IAsēK(/WBWDQdvƒe4mD+�UN!Oi.'-�Vf:~x<6:jjt0{4~z3f\cZP%,4A9kU[,AR߀z8r^~(QNbs(h\s^:4g׃]k,Tj5A)ڛGZtvE3Cf)ݥ;#&,@{)w<n *PHR^Ժ}>t�
    k\{g&
    �ހA6
    +AX"jkIcC^/3#0k|R4L{Boy&4۝x<<,t&W8q;X[z6SZ*{唝15n<o(ٞgE~P_o-_+F7&(LؠjK=)6:a1_{7bR7Xk%RCɎ�yLW	Yu�&'wpA5MRAp/z!@<d@Y/MUfCJC>t0Hq.Ͼ$:%1ϛp?
    Vn?V~1kel|_}y{yBWcaTc]lUD~V.fii˙8=7ej/i$Q5
    IAtO0n8Zm>/'mhG`=
    �i"q`b?=4mX$&$a˂4A@<5iv
    Eqd*(&lP2(+"D<.RWU6pQU[(#K=BSĪ?}5e:1Tn֒&i\<bI.sSY΢-+oy%,&ֿ5e-o5
    5mQEfYO4<hD
    nXAlV`Qb
    W箨BEM[TmCf&Nu0QS7Lt5;<s\ԴEV)A01
    *Ѹoa<s_ԴEV)A01
    *1ްnuJLLe7'碦-2m `Aii
    ɹiL{[4XhPZZxêqr.jڢj+)A01
    *1ްnuJLLe~y_D}eU嗆'$iУLYuIj__7?wQrp\J8E]E|vT:k>ͳ?.ݸJ3=:Bkڣr%
    ѿrOGuy-{JrP|{Y	$ۻ=oP"5Quf~ja.ej݅nnu(o	ȁݳIvu&7:&zו*mq>o؝D`^|}%}Tk6!9+aQ&yW@A7$֦^unx>c#O=|6[ۺ,iIA{mS
    f@vJuJ˔̦5E>v_	+H7pߝҢMT[
    ށ_ERo=oy6ЧS_۩uo1t{j*Awl|>ݳw~ApeՒ3]=%Iy }Dbgם5̒ye�.}C)`K׹PG$&
    Q"l3bJ
    @W2 g<4IJbG-r9]W,Jɼ&n
    8Y@[RRp	"$<{zܧw�ё>g'b*!6
    .VLN!d]Kr?Rb5b	cLTbyp)2՝vCkájݮ_"xg NA7XhUeF6_
    ij�ԤI;DIoYPۺ&%ސ/L蔰㟜^dhA�0,B<EJe8p}㵎1jN<w'z_9\7mT
    ʎJNVB!._:-UW_vMlݺt<0Q2oc'7l߹#}r}@t憓,q�8D.ykb= K}bWkF7\aNE-iIM"SH5*3Ÿ1@d\F&,i
    ef•DID/XMǶv/RQހ|e,Ί@a\M9QTծS)%mJk7(3bQW:[qe? NMam&a%C!)&fM]VyC,D{tv[%ռSj=+D26J7ȃEx�wȥ)JfoPm w	@ +ra`C<`[] &7O
    ;QoWa60ܹW̱R>
    jb/(ou	0�N¢u|޾BlOR3d_~C\oN[Hoo2T"Gѧ%
    zi
    .})V^!jsxZl)BE~f#؏9zr<ӊjӬOY5g,yTjRT+
    uVv<�ǀ]a9edƁpN :
    zEma[T
    {3׍*xByxIi'/)Bh{dfR|ސWH#4-@99
    #^˯7|̾Bgy_O
    ۉ
    xf4LRtU,X}LiUQqenOEBlȱlE)&[	Ф?+A`>�@ۚ&![D	uOEP5mcPqeM1DZyJ#H
    Wsi.wqkc)cSXL7;9#`OR)>fV
    }t	V_EM[TmeLl("&j㔩;PY4^{P\d
    tB'碦-"v]7L&g%;s8#]'碦-2gYc
    Z<QV*+.ȎV5$maU895mQ	po 
    JKoX}7NEM[Tme:%&ABE2xOsU5-ҋN	iPѠş,Ԍ5	EM[Tme~:%&ABE2o5
    5mQEm `Aii7\]QoN
    oPdb*"4xCA+iQU[kJLBCĀob(h<wE:-jڢj+b@	Y|ԺۗO}~aU?#5f{C'6AK6dM?Sw̓hdqNJ8E#+gŸT:k>ͳ?.ݸCnƜR8^Y߆|.*t~sTTT!b%}T?+ͦ\ER\5	
    Ԯ8TC9SG?Ǐ??;{
    `sHATP3;jX΅ٚgeoؽ
    ^/aȫn.PC|{qc!ϦU*D)X\mJds3EGKXްkjR)}T?\u:~U3$57l"
    @%~n[H2~;F
    TW�O=~{kKTcrڻ֗:P0>S7<jq–M �*=>c5\7l.S
    
    ܇u0;EM
    lC[%42pc-g{09ԓ_۩uwqݪ=a[:YA2�hMȏ~}~c
    |sa-&׻1,7Ri'
    [#'I�&4epgp$&%Ar
    (N0)HMx@Q̆m𠗄Q.Bɂ?UDFvj5j/>@v787*!)oڂM`
    CBoeDƦѬW26g(00@>�(<5n,,^ 5dpYg!׿V5؟:7)rTx"hx3H�>,	ʇ'?7"ow'cں~_I!51Wo	OXZŖTlc	%o_-4B_Y@#J!CMu{`KFF @";H6|S)gZ[8ko�čs<oP
    wP*Ǐ4Al@H+@2(!t
    p1ԯOJi8,$QGS
    9rͅ^J�–RCb<4܇ak~(o\=a##4xr5}8(G鬞t-]y^$HjJa"ةH&l˂7`�
    %潂?E72D=""ogЏġḅ-yIMIt$a$o`\In^s{
    !7<G{u0T)/S.fF~Ci r}yQ뒸2e҂&5BGDʯ&c/2ULlBCoțhoVΎF7PRzxY2&p/}2)pyyJnabv1[nḃ
    Ge,O~+A5t5%z~p74۪x7Zw+=رߐ۟/t}3B!S>E\A(FQ=œQ7E`�Fv{5I/%UA',xC boK!5QX1,Ru`۬WU?J?Qt%/TM xܜҢ=7V}$6p
    0VkJLt4A9sc_v/3odJ�f.A:\cZLK}>';=\r'X
    K(, 3DGۥEc)E軬-¬+d CaZ#ea.o^np`L|:BKf<ڀ^Gc,$ڋ&t5%z,op?0А?X칌5xy,FdN?Ht`Mү4vN>M=>(~^$<̕(t/o(X
    <[9|KUL~h?5^*/';AVs
     F�4~Jٚ1ƻm\p-/WQU!4�fP!ˡq!{DbQLp&C*!u)z@}
    1ۑ$ɇyЂ�]	LBYx,o`_RV_(-2P&Z=6*!2ܧG@S
    7<OR:Ӣ-uoy%,&*5иx5|xz+tZԴEV8d&m}K58Ew"\sҸxù>ͦnI-jڢj+o 
    JKh\l.xz+tZԴEV8d~rz[{':~GxC0Cfo0~c!`Z7ha4sC0o0`!`Z7h:@C0Cfo0`!`Z_~"K?K~o?QuVR5Ekf"LpԞ^OSF(Uss^/!`|L7<scMp_G	T=6α74j!
    3qw{@i@o+<&8|LW#VrJ3EN%	*\Q|T7U)M`s#mFs=er0tϊ\9f@ҥ.Xb+_긕)6K	28aNuu 8*E<WCcN)Nȯms:=h!`o RWտbk:RK+iMӗ$Y`e8K?}4xJtSs^IHTLnNCH\7BYo~=DfeojHz^z%{yC) w.hRL.Ӓ[Si!@X7*g7re:jMGz~XŞNM؆]L7$!`7YחwJ@CeIT
    q["7o(AhRЮ:ԏQBB=2]lƪ!`.|I5)qqLXTEG@͹�oKnSfu5-936f`դ%5,!7&ckW$kju5W.q4¦!`Z6X^oMY"o37gA}VHz]\sѷqb\'kaZ!`@
    &&`!`
    C0C@-Rf!`!DxC0C"`AT!`!p{7
    a\=*?iw|qط{$A+z՘GHϚ+{UFԤTX9ڇ
    cCmh>\fy,(J?>6jcZiåFӸ\y)PFu^l#7LɄ+h2CcM{%y}+bR2 +a"p5PnbMnҦAQWIdX/UΠ;J+OM."Q=杤phQfCA/ɢܕif3U%sI$y6fbP}pWHXWPq$rx Ht9ohv+#ɺy*#ö́$*}zTZim*&
    FՀ)@%ao#JiaIC,h[
    x\Ow&#8zXJXLDGr&Dr^}+[~RTٟIJ~)eTr{AI>eic{|5 =*F	yfn5'FE7sȈi(`͋dX^ش pgXc%o)e2[(�j!z6gW'#@Qkh&:ץ~.
    },o8fS0Ty
    UrJޒ~e#:EփX
    ueIwWF(q;.
    %O	ES87Bq~e
    R8Pǚ
    ]5	0x&<CoE$F*fybUb(j"=ܮxocǺr_B o{ܕ7<וO
    j#ض?;S=t/σ"vGQ\+
    D+j)TBwSQVT_z?2b51+O#ӄ&DD	]6O
    =Jz	/D\TⰞz3q~oJ\_i	@j|c,38
    3rXi3"T"`qJ/Fv^J4wox&ohnc'*AFXz~5|ZHLnᙼLO\!`o0`!`Zg!`Ov30C00ЇI!`
    f!`!Ї>L0Co7
    C0>7e҆!`GFxGn!`!`/6C0>2>vC0C
    }x!`!0o!`}-s	Z}����IENDB`�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/manual/images/chapters/layouts/htmlLayout0.gif����������������������������������0000644�0001750�0001750�00000023161�12143164146�025055� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a������Yn՝梮誵굾@@ttꪪ������������������������������������������������������������������������������������!��#�,������@@,Ȥrl:Ч0JZӫz.xL.1znB{Nl9ߏ~gqw[NLqvRf{JMUUh}nJG
    J
    KhIMd%q�ʶ5	G�8<k@lDm."D";ydfQA&qeR<H4N|\YiaK&0'D=,r5ظ*tȠpPA3Q-Bʖ9k	_
    P˖ۿ:l^T:q)l6NJp)*b&GDzeמ1oVsh"_n8Tb((@@ċT g6Œ9j[΀nu#Ÿ9_|L[|@᳕T�1O|a|СvtW^ȶtV7N4_{ŷw�"}x�L"reHDۨ8e4p@@ �1`' xEtb(`fصCLod�>YŜC$vweAd-ft�^egN$#D(gc
    �t
    ZD8%1
    fay%o�BtRh*SqQH
    ]:)!DQ|D]鸑[NCFB`z)Il� GEZ)Ҹ]Z{c~ĐCSbԛ,dXdԊC-Uv 50],'kѢ\xrn5:
    D.72#W44f 7hsFFq6ωHGȼ͵pX4i24ıɵB
    p\V+g3D܁ǖX}Qϼu'Qtwޚa!H[E:1e.ښܜMC4%z@K{>	6(ﻯʹ*oNz"-#[YEi|@q7^!<]S^󼔝_/?WN߾?ڻH )#rd
    ?9PW)>
    D)"QIpAmɃ6J
    ).BΎtz @3<cƣ܇0Hcn"4mGiLi^$pqE4`QD!u&60/HSGT"d#NXSq€""N!y\h
    #$"c
     &GH@ B~kOr	�"0<Ed&k']ÒFԃZ*5O4I_ÎXNh2N>CM6HP"Ǹ5yGrBo�5HEzg1gN>sdU=}ڳ64;5P*}?QP?$t@PZTE0! peD
    :@#B?SjK^d,ELDd>Ǩ$K	H;-K6TΔE5jPOqԥBmN_`₪QXVVz`
    XJVbhMk+Ϫֶp*[J׺b+^׾5]`[6=bkV0kb#K
    6,`YN-gCKZƎMm40Оm-l9+5mdY[f+⮕MiH��@|%nsݰ:5vht%s:Z׻Eozj޴N~mXV5,oKVl^809X`Wuoe3W~C֕Ep,	SP1a;_fCqfm\bx<F+I;#pn հ,XU[,W&>2Lb"3_nb{x4pt٬/[e2WK纙 -,hiq?7΀.	`.t9,g8Wҍ0<?Н0w"h}3-iAyΰvrCMi4[ƳskZZyF
    -NvifҧdGGqymOxv홗\nW*܈.Y}'xFoNWf}q[0-pL#춸>m?׽gVֶǩpڻPxl~	`|:4/n&qNq;!r3_6?ɏ+;4_}}=NGnt/É[I<vxwz/Nx~>-|c6t[O}u
    Wm:xkSo7<7|×Qy_u;qo>?s:ߴo~UO?SOg`w_tbv{	8Xx6myU('Y\nՀhm u9FBf%_%.{3([0XՂ8zu ;fAxrE6|փ2h&DŽu!R8TXVxXZ\؅\(^b8TdxhjRhlprn8vxxlz؇~urXxxq|HX_(sx艠8X(؊pXȉ8؋ZXvxU\ƨh�6Ee(VTy؅娍hhtWHxHȉxɍIxXʘ\x]Yy8X8ii&S8~aX*y츆2	g+:).	️(QXIA0)hC?ɔyXX(xؔXJZ	fsr(GqbyixY7Ie)Ij	c^ȓ9Uِahjiٖmid9YyO)ii)Y	)c雼I9]ٙHcȝnI(ŘiݙYɞԙȹ~}9i)Iٚ	޹YI
    y٩Ɉyi	YY
    *&,ʒI	ْY2!Jxe9.*8ᩣJ\4ڛV;z҉
    ^jJjEJ)ky왟R
    \Fj[	q_}ؤl'Y*.)dڞ-:a:g*VړWYuzXIxyڍf*y]
    ?zFsq骧J*9<ڬj:ω::@ɪ:jʟSJ|ﺧڮ:Iiw꣔ڭ*"[{	ˊsG:ۉ[{{"*$�+['K-&XN.N8~9b8ELh׳>tE[YB{H+K&HeŴ>T˵T˂^b/d^f{uZ(XTVY[]W'juh+|_xlɗc,{u^{{[eHa;iYduv7eWgrtzlZxpnǺVr~;0׷fGse[wvxB_Ee+x`e_ոcīV[sWusW;hz+u&~WΛw{<f|GlG}ycyWjj~Ka[ګ^tg}Wm7g۽&kmGekbɫWx6{rpx3'xsgzk7mjkìǻ&ll2ՂKo(,rC@wRy?vL\z}tp:+6̋,pGwz,+Vo+wuQLsL:Ş/ƥÇl8@i\t;w;Čqr}Ǽuģ|zm7Īq'iǑZyw{GlɢȬruFf\pL%fL)Wln|ʶs%Luy|+<Ėˋy'~vLkw,vm$~D||5,YYs;wKn+ŽD~Ͼm[ӗpss;}c|}8pY,ogk	]QFS{~	ܵX[3
    E[vJcMɜB}<GƵW{u;=53HSj{^]Zca}gi][>meݾkMqsu1{+2{]y  )؍x'K؀m)}m-=B،]ٌٖ-ٟ]]=-ڙ*#鯅M
    zZl(d(|)Es
    
    |[Hm
    ڮ	|~/ږ=٪٣hܔt>ュXʤ
    ݞ	Zze
    5ޥ.ঙ=M
    �Jhި>i(
    9zϚDʯ
    Yݼ!]9驝%N:>y>^ͺ#
    P
    >`nٜ)řAN N͒'JΫ:ٜz&>L~|n	by
    ޕ=)ޙ9~犾G>i	.n矮)nlO~e(fp.¾^N5(I1~E*U+ꨁN_.\N~3~îNNʎݦ
    Mޢ%)>9)^澎R.	ZvnE^ez&z2!od~?O~'2gΪέkjoND­=Lo~mbiE?JlɠFn==
    tȎB}Mv?z/}{
    )M熨ݲO___/٭?C<ײߴ`]`{Vrϸo2=h_ttM̟/?M8JKR}[ye L˷mՂ˹˸ӛP!@X$âryLˀH$^Y
     zF3%t5q^ék}�	,&$!07EGI49KWQY=_ߜ,3?q]eAlGCw{Ub3ƠjGhӦ*+lٻӷ0ѡӱ9ߗ&uSꔳ_!?vHq5~Dž|x/1*<1ʇ,ay0X$0e$-U	:jJfReFl̥.z>S)xRtOL2u*`ԷdEvolU+sY(ۻvgYثAmM{+rd|oN]zqkY[tQʢʙؗ%]Mַj۫5sp>}sTug*p?^'lލG
    iQ=~߃o}Чm;
    dhh!B&Ǟ(WH2$*=uRB
    DFFEqLе\<,$OA)[aJ@D*+Y'$oBJ"f!L6	p;[
    =PP4
    OMTLG,;tF54MO==%QI-SQMUUYmW]YiTYmU]yT\}
    Va
    bMVe}gUhkMlvm
    W\n\[=7VmtݍW\xU˽^z
    ~aw
    }Y⋑T/0fbTq%(dC8d@UeY6
    JR_.9fm5dfVG-H~BZWT6b:UdG>kqA(yT4`lG@	H
    .	6u	0hf9UI%jUuz;f\_ɋVV/wz\;lvO[I@H/uSAV롏~\Ϝj|w^79oڻEteOzR+R=Ggo<UAU~y}uso~VpC\r¯v5)k|[Lo&>	0hcX9Emc_QP�Mh	~5hBy0K\H0=i8φ$O ;b�p�SYU3ӭe;^Eڹp[˨;
    vml4WCЍ(ܠyPhܝOBDcXB~,u1M}\Vu額f۫ިJY	L/e$5>r򐊴!pGKRL7A9*kp/G[&3�d&(5'Q<08_%ddbSRo�T&Ͽr#6hr�-)vn|Bg9ЂΟT8р±B#*A
    y'!iQS_Ge23UXWӛ42}5Re.2*yIBr&8JlӨ\E'ЫfUUD1Ӫ%I
    MRbn#u{$@׵uTr:כu=*AJG-	Ka՟k\C9
    q*5-ҌF6"\BZVqfն&{Her7ԝm:=wt(qoEFVP,#9B
    ##JR>lF]޲BlI:3uCMn[۱ԵMm>q=51F`hU:"X0{.{"Uuq`/83nm8Ǵq'
    Xȅ؏"x>Ee)OU򕱜e-o]f1e6ќf5mvg9wsg=}hAZu&hE/эv!MhCGҕ1iMoQtAjQԥ6u?}jUխvaj6ʴnlk2$�2,HоlFV6v)K{e6{
    fjGyme3g7f7Lg[U~LosF3ym_c[v	66+Tpa3	.e`CBpZشv3#O'{n/sB϶)Z_CEtc</xȥs[;:ǝmW<Z7Ƌs]�9}q>o}|iw~_߽<l}{v|#/G}IoW%o5w۞걏?M>ۉ|^{c>:Yz?:֟{S>/oZoo�c-
    hx/^t.N@:g�3;N`D\'cnpt߸Ғ犰	Mm	
    	U
    xӺpp߰0ɰlp
    ٰ
    P
    0p!0Uq	QM7-41(pomOOxP161/xXP
    Mn>qBeQ0qnv1tq/ornxpKXp^P`Upn1Qq19Ӭp뢯RP�a/oPQ!p !rL<qWq϶,o%.#W"g1 1Z?pr2]52$GR'Y}Qg2+(%w2$/
    
    &Ֆ+c,J,u/+R%0r,}+r26"9&SQ{28/r233u& I3 4&# r3)'3*2#.R*	8=0Gn81eR8.3ё99:NrQs93<us(x-57$M2s33>`Q?7(	4405mAl@t4B)BpB-4C5
    1tC=CCAtDIDQ4EDUE]
    E>-5qFZm-֭FqT	9EӐEUv-t.S('cJ%H,F426m#22B_TK%%F NM,TjP1u3"3THIشM30AI/I<?\Y6!NST�S17P
    WxUt/=Q;tSSN5fJvN9.�Z&U0[r :YԴEUS=3]t=]^1m؎_m[!bS_[a$u1X^YYL5b67U+;`?v72`0ne!5eKQL.^Utcga=Kafh5Odo3V:fA`b4_{iI"Yrrs;S55*3S4羖]eM0:1QY1;ms0=
    kRto;m;Q9#UoV<VR-q*߶�6[PVcזD5|VFtShtS\?UfDYutjsww~wDosx%4t7yԆwyy
    ��;���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/manual/images/chapters/filters/�������������������������������������������������0000755�0001750�0001750�00000000000�12203357067�022114� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/manual/images/chapters/filters/filterChain.gif����������������������������������0000644�0001750�0001750�00000002312�12143164146�025026� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89aE������!���,����E��ڋ޼H扦9/|
    MahLR|LiJЪu PtMpnKa}޽jק(xEHb&YIXEi)9ӹY&
    Zjzi*;8I:k{ˑh1Ll|TlǬZ,w
    =!W
    D-lO>Ͼ^oZڽB�_%@6KJz!nb2d8MƋBs'y!9"",UJ]}œssI
    1ҋuH&pf	Wl4-E>K昶o[][KUÆS&F)߬9qJ՚=oƑAWu״ڐ*t*_kg6}Z4۰`l=m87gwٝOr^t=Sֶ{{<Jee>>GzҳUK|1d8b`v-VbRpP4Ik4{*VZ~T :\̘k6 g?Fwc)"."C�`^X-đ%%`AMI%"vfg9 X[G.iU n&6dhgyX`J敒if9	b'B
    Fi	b'*f X3$B&u
    xkI<7@":r	gӮTc6bcz{C9ˮϵﺽ+Z2Q˿;)ǡRv@[f&;nԺmMe})3[)<=̱zkQS|$,ͼ͌=”TcҞthO1RtNU9$#b-iH~&7]s/j;+;m0f*ĺ-WGuWw,ZY8fG;x䞛MNiVN,|380Q6*HJ7M~>RsN"n{¿qh?Ha|B_2o}~O~柏~~Oߏ�
    p,*plX��;����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/manual/images/chapters/filters/countingFilter.png�������������������������������0000644�0001750�0001750�00000256476�12143164146�025637� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR��V�����=���sRGB����gAMA��a���	pHYs��t��tfx��IDATx^]`E	FمCQO"**HDNzr,+16߳"F
    9EO1lg('MٝoKHycݙy7f&m?~w֬Yx`F`F`FG)'4m{oH{cVu>i�Ç__|3@,\+I!o
    ADjH)TL%R#NT!>==
    1YUrtz>1gq:RՀ4Õ)<`abQA
    [Oа~=4hNT$#|ҤɨdVJ']eggޚ瞇9$+G஻ù;6m	;K f(iihg:Vu84JvlqJ?sSK<=h!-9#X/^P<y:E_e/~Ļ!\^mD>zfa$/,mX[Qe>"8*"yc2%> /j[կsoPx۪qMfvF7|_qFrg8S9ҪH˘]#Gъgו䬮{
    YuNi}ʫr'&Öm;02Jણď0H
    'ҷaV[/,ҽ{;ƍ\\sl.ZԬ3j[_(].Rl!!|@(t[2^/!k=>z(|Xa+4hPyeKp#/*HYƍ<ov6رI4TArjID!>!=dbݘ".R~Kw0Vzrl}(OrusӇuM4@3%!O"&*G%WRu|2Un\,}e;d*Yfƕ_o$2&&/ns^骺HHG
    
    dK?3oP)#Y\(_Tl+3/c"!c_M_2_X+~XUOn2޴wǨc@c^#JWcхr&e(EƆLFbL5LQA\X
    ;AF	쑓-&8}0hKRr:b2ʑv]|.{0�];1N(�B]K^rIA)
    œ._P.tz`}EnXr48)EXDm~ꭢwnaV”H.Y!E$0NMz([RP_һEyS=ฎ魁]qפ™߯V(,T9tַ.CUdzaai8rci`ΧzlzÁ1=} ^z\OzkDӆ'7s3$,O0,4Afzy:OCyzatڰtHZ<[nrY5Mq[ya2+=uϥvQZwz]eT:+c})i;zg;)=&Ԅ7`	*252'` Dʼ[kEIgOɴW"ѼWu;SwJ-'ĪtN1_$%H,akHJ09!&	$4lI2ILEKr(LyeRMRJz#!s!K.!W_O28q]]/.n	?X'R#.J!a&xG	a>V|
    WD<ɵc!qNp]Wuvc-}j +ŗ<euF6I?DE&:U\"]FnvQO2=ctOMԗ)3b6_{5*\ig(K5B>QoF-6[p+4Ƌӄ@iqL>GByͅ'
    '-dR)Ro>,z
    8'`ȐNW@8/:ҹ5n_~*\[
    $7@q)!DyiW@|񿉺]҄jj(iޔNޣm\3fZAW@hnEo?0eu:2h"X{B<
    
    X&1:JKTyr&*0_<t]�Be>} "ʎGF=2GhYrs1F=r&H`lu=]{Ɍ\Nۏx'+&.1mt:r4ۮkf=q\ce#-MpٛQNՍ\y!#`н@Fe`vS9+Md\}JY&2:Ÿ`	u<XMz1HsTK<޴U-RRèuM'
    C<̀,4]/¹ulW~&ᅫou07s$_D>Wxq8}K$TRq}͊C55"j	q<;w~"	-]vşOkHj D<'L"w@xI E<iH s}˟PQ)T*3|q!Nsf΂TqAqWDϕ6*(2@eX|ʓ14HN}%hgzD'ĢYONM:=15H+8*byT,,$	e4ri:x0uP}-JgABCWGyذYGy
    8}gG(h=)S@b5V,[ô'G64M#u7G{>/\x(XɇDJZbJ	>rcG?yօ:O{Eٞ_;ߴ[W*ISm-yN]Jt\3b<'qĊ
    ߽GwQs$V7:Q2ң҈x7?BA$H%)U$Q69XGSDtt
    pZWUPp$qFjp/JDH	H*5	UǨA(�Pжqmu7Dmg9٥YJ{霔H=JdԝGD"mCRcz,:DTrXj|aq)y#xXYRؿ,w:,1Ѕ{yOv~-C{P�+bR\&igB-VHտcn'ꎱxCX7{Oxan5>+uk\=&ZY[KNo߂\tXsOrY4sIV,f
    bGHEI+'lZ~Z{ҷA{~-B
    $@+k*+%o%JF?r7%?KΥ0/Ѻ*bĥ8D<-Dx<}N�H4/!yhr
    F6#-`Ϣ�QƯ(yӄc.Rx'2t'V7drί!n?gRZ̻+uŜĠTX4ExAνu@5y͋``E,FqcPvY;u-פeD귵8VƎ/;nrcַ{K/n'yVmZVV,YGHދ?lWo%WBGV4iF(C[r&Vt.n͎׎/XX:͏}Ta_ذ	4]'M&"-t^iu/&zB<"uf':;q/W(
    ?&"2	Z9q�19Ɉ}	JAы
    D?<Q)evPa&Wyϣch;h+&V#xaկ,XGJ69&*G$:72LdYQqq`	=xC4\ZE*X]5z&VZ
    ~"i
    fJv,$Vk2;(P>7&V"z_\#Vre
    ڮ45\yK#UAd➑Y/pTVWlu0bDLҴlT;$WDפMzh{kBu$FleDLQ%G|0p''
    ɛCw_J_)PV=<y(h}qګx.Khy_ɜ}/Ԃ>P?'¨{<a}?Gw9|YϠ|k]׏W\=t5q'CIvKS>Jc#ֹzZ#wzRUl1pr>:=~pXF,+$bdZv둨1Kf!b'ȝ}EZ$MWV7C%XwEY>\?1x|VӋx]i8z̍p[@Q)'+qjI6weFN'nQI[,(.+(KivkB!RN\}Os"WS ھ[&]Še-?!i[$*,zboF='
    ؈|Fr\AǫXQY$vKjr*"~IqEB=I|~S?T}QGA]r�c
    H|M})G
    j*/n]qv4W)>D~iظuדͱk߰ =d6TgKsO#/h~
    ;YX="I8ƱxHBaq7հ&,>}*~|$.+ac$&!I9(e,^*,7c)=攥ɃʱH&BaS)h.7oKBKuq2|'DC9A'EcE?LUIǦMQ\.|BwY9nD;Qm*l5~o2trfي)8o@+w9ʼn4m�OxϮ#ʦfr[L_J[y+"PCҟ>%XV+"e?c|Am%o)R(Rg^uDNb~3q<|9&2+dϯ	3OW1qs_?ʬ꓎Wɑ_|95*ԅ"Hq%#Q%8=#Ppߗ6X{f0�$&r͏X٦p~Ab|U@GQЊ%,9OCFbez!֡gk}m'?<kwHg	k&5#|qIKi'Xn9Fc@$j�۶muxź
    a=
    &XfkGJg
    dlolLqf^E9Zݲul۾o!535:t,o>](Zعi#l/2lo[~	"6c<GOWXiy
    qukiJ[TSܭoU]t_`Z/Jd˲WܵI()(Uص`oZAP~9YO0Y|OD>¾;
    W5Z7:l@ƫtcІL\"P_Blz<$N$KSo8A-egײI-/4!K/TfO<D;S:+VBj6M*\9V;E
    m
    c)US5C<_euxjEea5C$_ph,Xc?C/~=~Gu:6q:7%?l`DB|^a45w6
    7|>
    \XvO<W~?#AӇm[),5d'm\`<BWd5Ǽ"oï.ga |֟@ytΊiird^߱GaE׻;dt6RPۊI%%]wG"3^D+sNaZua)K&XnY
    	EvY		HL$a6qLDK"kkD(l@kz
    h%I*iN&{@ۺDׄVZs7A"c+$@	Rd3FbB$;!r XDt\ޫe[6T<9B0."V;6{%f:}ILJ&J/RE&]}bLK߁ESˏ,u?JqrF=()^*ۊoQ-PfX5̽|/hW~i=lV86ʬjx`_5K_q܎ly֒[Xvp*ptks;YKCwWl380zq
    qs'{ףcz8.Qum}Tkg>kzI,P$?FBUav+X|ipmf-ŏae=q:e9Z&F9ދ@5{[O(	=a~tt~#/
    2o>]8ZF"4{#[%sGi+M@־w~dFˏ#&\T?A~r7'O\/Ey_1
    	!/3^|qdN(!m ɥe5N)k޽~[2(XN2KN܋^[(?sP16h,=LZ!ʴ6u9|X#I,k83=jȡөq)k=>qGڝh�Ю}opC-i\kNq7]Co."(\__`jtt]nQr~<$tAtJKkvrs5)ʹV(}_xHb1�=
    Ͳu~nK RÎ=L˕r9ۊv;Ac}:;
    J/{GT~;lnF,7}7rmXm7Exp|/<*E@K^ii/j┞ޤeka�}/:qx>?`Fie6ՎS`^Р'�- 	eܛq~dTa`^*X";O6X
    {7,D8gq=~+_l	pY
    HS�[y%leA	{6FhyXd$3>&$a9\ռV+�*^o,2n>mhF	{	hg*N&a|a%	A%0"䣫kM%{7L;n--XTTʲ[Ycץ]M|('ӺrSorzE94U*?]xWa:>us;ex<sy%6aJ/b%\=d	hLbg69>mT\i6V<jgL:]+.,S
    y*?x{PoH_/lCDTIr&N@dt
    l'Zv 	2z^\(6jciƱs~~ia[6qot!$7Bz2KaFi4D_AaXpl/F]
    ۠
    Gh%Q(|oEy\ɵ 
    ]g˿-UxKuj8@'&=	Edm
    B"-VphC")H
    )`(p[txzD;{C`+\4bHnu<Ĉ;:
    C"X3o%F.*x'ϖ(1%rU>\#^3eS/>VLGR2p~f!w3lQ?.2;*IGW떋KσR2e:q8[,7ѧteԯn;,]-m+-Z3=p쟠j7ylFT/U}`�<9y�zcQϡ)
    ~h)kCBW,^i((Rb}=Qqx4*z,L.F@,E?as,	{/׈/h=O-Uxcz}t�n˅(>)v98k"_?RlFj4At*xVpͻ>/KB_K&k޽2jmӫO,ڣW56}~)*w4xB搹]W<•D!\r\Ə=
    _AbYŒ6pZǖC1u*]#@vv-_B֡h=SC'cS.%wFyT._Rku9UZ5{kв<	0Τ>11oNO#X>]oq+<!Lt>pMVnKqotCߛxo~xo
    '0cx9|7
    c`_3;~P?XMi}ѳE
    WXViX5$0t&֮(U$2hS ,*ҽAzW~^_MQ4[Mw/ҺSorEU5c]5㥰5ˠS(C/H+w^:ZM֮k0wwN
    q�$-~?<.s̷f0.1Q'iE龂#cp= ]w{y
    ξxu
    y6u+s^oqBwVr[dm5
    _t.~ҥ`)ع.~}b>Hӛ-xMH"G�KUo3~^	~FbhuM>#fd3K6U(#v2pg̸JDz#!v' o0ógOnu)wd%~WZ]I.C:R⏽}$|cpE10q[xoOVH,T]	^OE<:8֙S{ԩ@t[Cpp.uҖCտggf#࠺|
    
    Z3g[k[=uHu9v]aڌy<E#.
    4v_deA賍6OE}9~2k~[X7د||>xq[?x\eeŶ?pޢW$ʦsr/[+e:?Uؿ,LAw;QD>2y~^%clOޣ~t7j>G09h_
    N:a]Ʈ
    >Ogob~%QSyxl[a?_1%$A'ﮖU1Ú90w|�;*N�qu|4pϿ[cPVN(v)|<f,ZXIaX1'ĭ|`U67K-hr54aK�O.F0,~Θq!Iu2ȪHzO1jxy~$;հR揫Ovr|tጷ.qBsw<_y
    AԹ0~/~o>7`Y'wfAbOyp°\8a({
    _gg}WgBSyL$QGmu<]ç"n zLZm;''cy_`i8_wo4oK|	(XjOJ7/^&W}Iea[D7G[:xi}A1J~:3`$p/-[;ѐO9
    KX(cKvy,.fX"D(:nٲ*I,$FF\ս$g=f7Cg}Z r+k{h31pTnnnU_IXĚXgD1dvՄ]SݰC+L2?I+:@sab<Y ,?\/<7SA̼$QfC:OBF#gëjJ덽7.cYNG@_⏀s^B6=˺z}0*v?](оz.>h$:8Ι찎"
    q~iZ|hty+(<,,	H^+(
    ׹4~;s9=qكoxFP5V8*v7z#5Y-’/au8Rs^##=QN^L:u+ґ|9�o|+Bog^#;vzJ63I|-{<s_nY8ɾ&ES>tL=:pyґW7,cuVwќcLWH"�Id�I绦A_79P7Ҵ:飼8u&pYxlir/7$yX"Zw6o#ey5V2rDp,w		ٙ*٨Rkmqv41GCǾimqv4Ǎۆǚp	]H@:AAp+pjOxI=qt+9X*UCRqZ"i٭�w|Ow
    ',e:$U>Dy?+K,gwz:q,RV>Y巆N`,rBC&EyOQT߂qJu`	U/ w24'dp-:0im	oUS|qIrVG߰ߦ`٦Pc`?e	`ر}]v~iDd݄Kaƀ7Q\!F'dm~
    ㈷B~I2߾UJw?=+ ;cCbVW'QT'(Y}'M;hn|w{/Iݛ^MjʒD>~MORd
    dnB@4E<W]+2o޼*4.^nj}žfݖdυ^k_kR"2VCAW6!A{
    qFZ-vב|ڠ5Ո%5S_w+CDb%Bkv#b5[p9"\w	0ӏL>nxv˳o4Na'3]$0QpO_AV:{-IdȟEMYPȆj|tLɭ&*}w$쁅K%7XE䮓|c1$b/^q6>Ս/r[݇Z[w
    8@6?Εz]Εje<<Zx4jȿ8i舃˟֐<r,X_^FIw1&Y9yP2Jw5"ˊ^[,Z@"*AJ[
    V}̯,?e"	8uI#5býf.auiUݬ9='˗;Fiqqcmbk*+Y0.Nw{ VzAJydwttEJ"'wܲ"A2Q[M3ʪDDxK_ś	WZ8#uoѽ_v=Q>֔L@rgcp:>+!#sX~E6rgR@
    #L7,Ncfz e8UrYsM
    hذ+X\E뚒w9+BLtlm8ƩS+vlUv6]u+o8]	p?DȚuBk_A4!m„Q`Ck˄HgHg3U~Qls,
    \0&/	G|
    g#ɺ=k~1~D6\4h+ZkW};x44b`i?hэbwu>N	~lGCU :3nEy:phfogzoFw[-{P?&XV,{T sXx|! 6*Bv#->u/~ӡHLXYu,+\F<MiYh#+Ho[@.YoQ&8!q&
     QC
    !
    C&z#<oכ�4~7je_ btם,R#F~>@隻>d<3Pv1ҩ/4 az6~!(p#l9ԦiާZt;x4k\nĐT}$SƝ9fvqUO˕K{~8z<nW`F60t9m	Y΅իE n_Áo)T^LynƊh!4|@Wc\V<SxHk<=a	H.ME]5$wԢ/nYrڥX)
    ,=dX"ZĬ&#p#BpQV#X)NVb,4p/>C\O2NDE_EUf$<E{0
    R$SǠ;pOBuKG1Ϥ;,FW~#w@rLqs&nNPBi2Vq
    oJ29L]1U{_ꯙdVDW'Tu#.gς04"_ڃLtɮGCU7R4pd9jq8/K_ʷҵ<BЄ4>'⧹H$Gu]Et]Ib~'SNnܥzG7<q^1_mKDR7Ұt$8ص@}[P DӑaչuG)D"=;(KDk=tz{Qh^HD'^`/$)0I|±6xփiקJI_1mO5:P:ߴ[gs=oZbQ)εasZiEL+ǪTPb)�ižinKZ+}7t9QϿ,cORfŐ#BӼ%mY:N>:
    =\L~v?e-R([U}lj9Tտe}hPnvp�E(ի	k~>?-u} ;6$Ez$\Х_@'TWj
    j#n6_#%({8KWǰ
    ntBVr (~ҍwѪ
    #t# ^7ߪ\n4G&NrJ:f?ظ;oB\(E
    އed3TT\:VHJHY宓/Fzak~b"[/.ho>A>U\j3sL2tqm
    >[z!fҢW,Cĉ]t/q^;ՄV625^9QozsȝBBE(/u2o#W/ɴ3_wy*5jvùK%+$}(suv\U`b Akph{rrbe_VL9V­8#g"?s}f(\]yӚø{C\@˓FbY,.~BZ<_^EڲL-ˍ>fdMkWXn[%_4k#Kg=LײG!!#?ZAX
    "T
    O1)HrkW+sHjI+m%3Ӡ\jo_|xqӳnzcJR*={UOim	_e[YԊnfIK[g'3u7L-hDhP-/XYq@]^L8Kx]K?T.s3>LW_y:,3V"WNW}.S.&<q'8.C=tiH#>
    Bx셄
    {PooWSд)HiSmh:.uTjlF;pV"M=-CT@:5z߻)Sh@2T6kH!#I}x$ DkS&ʇKZtp=EDW?i)y}(s?3X+hv^;pr#o7
    h7@{E3Z*Vq/
    ]L}Q@Swz$g�kTNT+Q9f^^b']UYp.oZ't9=qo+!jMc\%^!Q
    f=.aN!7cD>^RtVY~j8rc@(	;h.kp&𐇚8iE?"h?n#vFsjh5$h摯c|SG+t%ˀn|>(tK4[V	26fO1ZKX=exkGKcynV.ύ4!p`1.]h9^UӖ KwlSeGQ%GKo]<W�1ku?1W'W~LDe Qrj;qWku;o1ط}?\9G'Gsx:FEbOZ$#IGOb³Q6zS5eVE^.F+҂݅iχ1Vj@tjFqzKA&ιR:$kTJkR/z{ޯV-p4R"y[͇3,'2Gh$)R-6X\W[=K+NTeobnBϦp,w.LԾfqሩ][6@w9P^c#kgyyV1g*NΜJNbcE}Y(?}p	Vσ87+~p4E[O
    >P1sED
    RMu0<'.L9{UL6GsĤ�ObN?8To}I*/J<eNd)QV̛?n"Ǣ?aee6h(F6l$N7t0}F2Nˢx
    
    ߠW-fxշuкB'ҍd\^:sEG_S]]�oLM!"(a3<@$	L=$'.2hAÀ2<2(GyTBQ}ҕߺ
    75i75Y:2f ݏh'w>[#"PZCyu YΛFᦸRފkMQDFH,~<EW7էX/>ʶ"yDo%1.7>i
    Nn9[^8)\[ZFGo{z^,֥9dc8ugl/{$\Qٰ?^ۿc羕)>8+oA(a<ŇKqei^^h9pR[nntntz^븪M9_.btjydn<tXrD?YMGi jF:}6'@sr	-C:zjcu
    p
    o
    *ߒ+%t99F式GǵN4N4u#AWZ,B,ˮ©$-O{W•̺Ű=DhL6J1_lc/7]]8.^r}g72]֮!f+Vu}y"x,/+X@yCr:)pbh}fc:,EwG'~vR}�h݋wD%҅/[yf.`DL̑´njzI;C'9XXi|:zM}U.~
    Ny=zIux*sk]n{3e-糗,2ʨ":s蠖[�Ȳ/pU?
    ]แy/�z\z%h•˭su&tQq0Twsұ0R:KperW=yf	e<Ǵzs9:.7~A
    Rhғj .~Ys}n4ˎ&>GĐ>?C-r
    zȧh?ϢGYKwGBt_ô-O.=g֏s0S|Vpc_>C0
    nxxP'
    yhބ*^: G|_sp>3o~<
    }3/(.|6%[
    OW<}4Gc|cI%|J=}-
    #iY,zo6=a\,:[k?=R'<珸ei$M$8f] JձŭDf_$Y{Ƃ‚n\"m|@"`_Eh&iңaЀדdЁ~7"n0-F7C&UE<Fue`}Fk$!@#4FPýFb"]otJC$[tJ�ȰσeLC7DSFCSۿuHV(OC/7sI؞mCG'[{7Ӳ:|gb9[pk>o"ãTwZobsM`=O7xrBLN9B?cruciyp&J1Rf*"0X=b{qW_DQT# ws'�@ؽ#σڽi8IJuXz=V~ljہ[Ą#(_h~~%'
    AihƱOh~}]PlRe)<Sbivҙr)d>MC?aS4s;IίM)32Ff|{&n}tZ〺LTyOjKv}#daZ<y2rpXq^Zpouz(='+6t~=uї=O:#jR;,JK2]=ݾxq(1"GwbLs\wYWD`XR,Xx($]*oJOD!]0�_@i#EI71fga5p2;ҝˬ-nX<"Ǟ[uK?Z:$aJI%$W2�ljw?LR(#ܫ,yy|.辊5	=@GEO^$u}0MD�#XaD֢G*j֛Г͸gڣȎ(bOd7K+"IEH#M_e+tD"ʑ
    ;|dEШ~:zg6|8U_U4$?a0F5"`<TEiBbL/&zCGH?Gw%6\Ё"R>M˥їe6h<?&<;JcH V]ճ3߸	_9>
    Jy�Έ>pBf{KFK
    |[5s>LHUhE_rG~Jeh&J:J^Wv~(OjMD%\{UHwRH}"NiΩ"=;G@QhړS\\baܫo11je{+ngAs8Dl)3R^O8TXGRxmOBWB=4&;6wc0ZiT~IpnYf"%qV&Q-Gy>Ka,"Jbe*&q_J!WIv$J<WbŰ퍖4F5\egQ["t".+\
    5@`IJ“sJ}`޸ueЇXo$W׿
    eZꘂ֗KK+jr%ʤ|,{м{'
    F#݇y%6Vm*H?..QJl;wy<z=$ϫDpzFv$FP?ltzav5at~E%~(Jˈ  <?ދb|H'~&VCDlN$@zl㯉<!ץ\|#=[F'M	"MTQVK>LX|:UǨ$I\sE9^j\l`##d/-eSj+r貆1b*Wcn)Rl:w2+$FqJ[r�h:E$VZ{jǛ_d)ϙ]yiUD̮&Y5_䃚ĺhmq:.%wy{*7V\f,W5e`ʙ6az65F`Bb-"IGy\?O5Z߻!*ր($rhzi߹=s~=u	+7BŬ$Km#M΍8ar*E@*? >DExf Xr_%Ħko޶U&f?땺\.[ͤȕ!O7pv];sVC]}xKd.V	>}?jdQ\+kT\q+qz
    )՘A\[Fv߈dIT_bHՏE|	]Wur2bD!
    ,pM8#~,(tNtи<~y|_W
    VG_d	QzX"gȩ9v
    SސF~{160CC?a\¶Hi?T4WEF~$QA»8KQDm,XEeD"uJDvY.~!V/sX;Swz?j	][{$Yr	x2-*vZgYcq}0> fRDL+
    !E,Lt}j`ŷJR[?1؉|omPѸg>χG\ZaWIἔ8y05gEْ`;O2CӅ<Be+?r;`!ړ?zQ&,~/.1@Drs}6ۮr^&2#&N=v3ɗ&]"E
    2jYD)`|k2Bi(˴`hXi2U;=mpv~YX {qP yNL\9:z5guMBI\yJ V:̘<
    /R=:OgڂPYxaRp'礎-q$|&tj|9u:uRUs:r!⣙\%g`^#ḥrQUQ~d	~UxDP"(x%|Dx_'~@&_rBs[]<� Z8B?)*o sCDYĽ"5|
    "Ws[a>KI7X6Q	^	v$uS;*t䥃WSAXkԃֽ+?꧃Nb2:2·B0H6bOl[\+&$/1'	3;N~:JG~Ȅv
    Y&e2׭K.~y?+a*g)ɳg#EFlQQӉ`utQeF&xU-J~HިJG!,^+nY%拪WCǍ,F26J[+[ssFl:я1e8uQgdM
    %&iI~1h2-]F@+YHky-jPzetOj}.8޴=v6N#&
    z_Z<`:7q$fߏ|4`_k7sI]qڤn~YBUhh\Q@Ck5K@*HƪȀЯQqP�<-Mzv|yMTy~&?
    I	'WRۂ&ʥ*W΁y9�2Ju{%&Q
    ;i..YIMD;gYˮNO
    TQc )Ji8M2&qP*WAȸk?ETf{>hY'Pb~K]ѤL>H9}<e$׏XH>&qj㒗uqX7D1;.d8&.ȘrEG&Unq7}""_fVd8!#PcJij-"JuT[E7MRv*q<j"|ԁ/<V,;qdJD^oD%OAWU:r,sΧcMAmE�h'Y=ce$ZY]!FfQ.2M첅Y2C1aTB{=z,{0J}K}<n8vOsdvq*QY%y~q*J4ȅ<T<(S,`T#upT
    *T$EFP"%ʍbC5/>_|7E(ib.} m%X>L^hu"kb^&0c:|}d/LHXٖFh,y5>G<7n6({+/R[3^3N0�#0�#0@-Dpf߾m$Xnc h|O閑c#0�#0�#0\54g<EbEmKCbEWiY}3"V=A:`F`F`�ܡZaXE$Vypm>F`F`@պ;w;c}S\&kX!^0&AbPZ*F`F`+ϾZT]U	v9c}S\n|Kj-}Мu0YDX=fũS%1�#0�#0>.&CUI2=;-A6mЅxK]o+]ZҦ VZn3f~8mlfϙ}z]bƀ�p>}+ᨎPfà[8Lض1.g}+N𭟞3ߙz[;	-{5ɓ-^p(DX;af_hpp}|0�#0�#0WޞS-VkpV7+=׃k�}W+ z~訮[
    m?rtP386(++zYQϫ`Oᤣ*^k0�#0�#T"g̓sz&lPTbl�^{S]oV+&w&!-bE͆5	ziU@
    kmm
    5
    :B
    HU_b)-塼Zxr`p>}�կwsw_%.x}{7C⹟}6m�
    رcx2ľMJ6lN;P9#0�#0�#;TkՒopV+V-Gu?,V;vV)r3֭[aG|a!۰#عsPިǏSπ#25p5s5L74ե =7	qI+L
    ]Ey_UMT>+#hȂ9!#0�#0@BIЖ+}dD[^>y#ف3wNjtֲsW#/R]{)ؽe�/"+bTLENZ*aF`FA`ʔ)8Z	T*\I\ĉJN{;4iH^0.
    ?N
    .xMBNʇO
    dŸk$P?̂Yw?Vz\o{0�#0�#44ͱرcga*-
    4*k
    еM6kt\xzB?t2Uv&^w| J3_;0{Sy�g*t+I**V9NG5]w_/.fLm	P_}6ShXIA<\
    t*ƻ.΅;Pat/kkm#OS`F`W^	fNyBd2՞^֫@�Ŋ,P{Z!ei`ƍm6x_E͛o4NLр*n*>?nNϴ+L_&[/xl)w)`B/{TX9F7&+Gg[8nŊlbb!a Y͟D0} 
    ŠbU_b<	D_pQ&b|WS8,x,F`F{:#AO&2Wnr<
    W@…-=Ș
    ɔ9jԓoØ`;-OO/J~LX(
    
    N3yN>tJKkw}d]CϋH!:W]y<_=ip d[w0떺:auHbd.{>-|&>,uN?́rov`.xDhќg༑f~LNgX?l;@X߸mkY7pKD,EuO`ʁ1>}�5Tƀ<2RveȪ,}$*UʡH:͵4kXʖ#p3XM|6\8{g{cӺ@qģ	Uh|mJ9A-/C8)suiHvxQBй]bx$S<YkOEĸy.tB~-B·qu1t`)l죴!	b.6[T;ҧNX[kY>-'
    =DsEON<`lp؝}2E*el?ԐK5vWaz!wxr@*G_x//u,
    A!mSl~ BCV][V/%RWR~:[
    VxUDttDʕʯ/SYBt|YDb#
    huJC
    H$H?۶ F
    Q\[fysoq>}�*JS*{uʲ�U~+C_?T+S_;STVZk>Nh,
    dz
    ^zb
    ?$c0s"Q448hԨW{h';pڝ%,'i"ֵx2iaڒk?:p=8Y(<{ZҮ#o4O+ILCI1('brj?3dN'>�^5	G3:HCgzGv9t/Ehut{|p}�@eTum*`*dZ|NlmQKec`VNMOh˭/XOK~/f|Q<Ap
    .6
    <x�1ҖvrBa0ߊq$NR ~eR:y8<KQbe9IQ<,Ern6$z
    rNu'ՍF{a[
    | gvX&d.	ǁZ1.,�={$ptDBjOI>*c.
    G/Jpړ)p>PсۭNWTne/ip6i(XI$bEthLPq)\iCy=awaDHi:h&\Cp0k2ȵ;g.hk'rC,Gŵx*cESedaJf\!PU^ka1*sp[T!K,0eN=ģ'~)2u
    ^bꛞt2u%]V|GZjkwѣAGu/]4txx0p>P@PeqUYJnMW9BK)T
    4-ӑ.o	 Joѧ᧋MCxl؄qbF!ȦXE$|0�#0@D`ނ᜿	[v6ܳQxͷ`Eg·?ltVmѴ<f
    VAdբ#c!^X!lsߊW!
    qwu4A,
    &Rd}"V$�#0�#Pp6+=7*q#Et~6onN"V\ aDk0k=1Z;$%}YGnKp>𛦴T`R+G7`
    шUs[,~۩=Ӯja JY'p>@RbjH}xYb}+V~Eݶ./H36l>7F`F`Fw>xCsyC?7uƷ
    [ns~9Vz1]biUhs>&Vk+0�#0�#05"V7|EHm\ib2Koƃ�p>}�:<`Z$W;IV`F`F`"';,VZ:Y6}F)RKcF`F`F p<ObEgͱHReV`F`F`"p%ZV%VD*
    Ff"0ys5SxHIF`X+ILRj/Xխ>õeXtZ̈́&Zۼ\1F` IH.PW@JZͱҮum
    pg�#P`bU0�#DDXaC$V
    X|J@dQ\PGjZZ$!lXU`F`݃@ +AXmݺuh7{8㵱u}jk=kkv-WbbU]`F`vXJW:HݹHF`F`F`F`Gvxfdhr_4z:WKv&bE]\PGjZZpU×e2�#0@ wͅv?v7<g_:BObe%W:U,ʪu4IUm#!u~p/ii6\	"t:&@wԿ_X"#0�#PjraoA,&9]xJG,bE˰뽮߮ͯj`4 .Z+^ِt-[skUVʋ-LTR�c9oU΅3X8#0�#x!W?O~z~^#Y] 9]xJԡR,
    -P4)d^IkV^^^dboh޼zO,L痿bqݼ7L,֭"clwva3;W^;o`K&Bo]6߲%wTꔕXmGfS\bU^<^%07üqg{Oa׾ʪ*,*/(-�a£dˀ!/sFv9-Z5+Eqh+hYN1yׅMdM)F`jwt~~qaُ_BF`݆uklߎĪ4&9]xJ畟&aJc_X2++gg@[ŵka/B֭]WTќSၵ3aa%=3xFj]x@i
    -f<Low3r#ao[!Eԟc?+vg=70x=gY0U
    x!ү%V$Dz=r3}�埵kX2D(8Xo%5+&8:(9V>vtID	g,-dI^
    r"F`F 󞆂qabغm+Hw_:2~W6O?1+~4.}8� yRX8Q|ρ-πM71$gzZ0"'*J2PN|^2iAwAl9|c@e0ƎՃoa;ClXYqk9?:g(E&NZFjw?Pmbx<kc%Smx,t	<pYOo
    Į-WGzT^~, /G)V_D??9pダiMkP;$k2$A3
    !wt$V%30Zgeժ0RK`eBkٍ9,[�_[鐠MV{5aF`B
    xñ@'aS_}?#9zˏS҃*,=6n_.WУzxu	<eWq"V/|
    ]nꍩFͅ+V`Ʌ0߄pm/GEVl	ٽKog@7KUK=:GuևguXE_oƒˠw2꺴CtA˛pqSaT;}fίu|sХw641mMVmBX4Zl+nip;KGp튧v!}5WŸ[k/߄uvkϭ>Y~p^xv=+л˳pa{|pg|"i{d_Ct1X	˓Z؂WPgE-ðT"U5+)#>xF`jdڴkZXX~tkc#9:m
    ~9^/]qkHb(N셣f{"w0wb׉P\BzR= 0=9p%WH0_̃(.館f	mK`wT{0.`7s8t'•#=%eJDpdRPBzH'z<cveC3uVm^GQG{
    -nmQ8m"%ݶfc&D"*<SȄ\}nsw}z}zaŽy
    l"{`90iڝOɔu3A}^((ק]<b2B(\ h#Z.\x:)LdB'>˚7s&e^,#8-#0@5G}a櫋<
    [@)ΫUZq\+&P_^|ļf/re+ℒHvp[8z
    k>D]NFp�18~ApE^0~Qic#戨A2O	(]ߟ\D8mޞ団s(
    +YH G)rQtlwݍs8�b'B:,:A_6߇QoFΆbS.WDw�xa/QjKY.~׃HI6̣眩aN2=G>ׇ|}9'N):/`΍ 5()ĩXp"pc!c銐0�#0Q2;.o	
    v;AsN+?%{D
    
    F4t4VAsAt 89hxqݼq q2D_Ŝas@ݡ0'ӽ'7K/|JrJq]
    CP#rw{9|^[:~%_{ӳ^5	Ѷ8
    at^7XI/o·!dY=,!'j=q>x%A'Cџ#	gEK =L?]�Yn}گ;\>D,>tl=\BXq`;oWvX#
    Z>\DXy
    VkrK`-=75E9yi_Qs'fF`x uQqǑ=AM3D5*Z9]xJ畟V*'{[i|'#
    >|]=
    !=КDv8D^DԈ_`8S*D펆o'Nt;z:LڷUzU|$/= NRuTg4n%$,U'n[XDmuG3>
    .2;9eCn;3J|3`R.~׃FJe߃P$<iރaw@!T^he.H"qPAi.sdڹ+#e}d[^'O6sTI`YF`jJ.s9t˟EO9]xJ?Z&Lq[\*}b9xb*+D
    oyD[A?c$aŒKq +eAZb6WrO947F
    yI!pi'XVN\V7,}xߡ	c'ob1p5�Ӭtf=Ql\<>O@a%wV}i64ldWyĝpe~zDZFαt~b]0Hʲ.:zQ:	z^K{PW|u{*iܱ^}-[G`/Sj.aF`Ft�\[w98
    ޟt;KsN"Ts$qJtdşweӔ <k|OyHx;D)A_=j\C=$7>r{|Ԏ:wZZMU㭢뇤j'gavzB�#0@2GSWwݺuw67i7o.G(w_nb1]7�knlkd]?oQ#aOmgmWd`F`"M[?\̣蜮'Jvs
    Hx+Vk@kjO*}McԶڮIvTkKaF`T#W\/BLcAX5
    ;rWe_#X B`
    ˭8ֿtGYFm裕OD$`F`j)КcҜc*ܦc7`:@mcU0�#"Wɋc3e9V
    ]Z7nQĪ6*/1�#P+_{�ם`FX.6׊gF0ȵ`FpC*܉2hUhE0�#0�#0�#P**yqXٓh9VEs=U6�#0ѷ\6}1ڴiSmeF`&{\+k7Ɓ$:ֹA}
    9VDEcӡtw+Ayi)iw4\Mw=[YIS_U˪ \#0}E F`FZ#PPP�^7*?>J}t
    fUIJhش4iHߣ`ݠa'Cv¾{>tkT`F`F`F"Ty2~W:&rCk"F]-ꗯo!ؼ}bUCL+ݾ5F`F`FE@)Fͬ,b70QW9s
    .QՃ]hڎa+lM}"
    JR/%2�#0�#0@Gm[n]$P^(]ˠtί*EKU T;7c؈"螞FD-H,%/LgF<@^a+!5k-KaF#CDX9IUߔꧏr$SX.Dv`-hg3Q3@r`R|Hڜ`F +a͠Ɂ܄#
    &LT+F`'j+Zs]:9VtbVɑd�V("UD6+ "*}#ԫW֮|>(W0)Lg~d�Y,Y{(0<afM]N*/9#0E0Aӡ֥P~i[Kj1�#T>H?1ok
    Z&_i6JkM̠_-O];`綕Ubt/
    X 3uɰdÒ>Be@ِ_Laly?i-C0~OGxF`j/+LYTX#4;ϛ5kʲ4g"-^5a7-@okW9s^ʠ'/KJMj.K0=jo_1�#PHeq)a&c?dBu
    +~_uwq&vTHpҝ]{þ^͛!n뾾2O+OcEs2($F#5Y:"SGA㢤5ex{m+XU-%0@#>V?P�CQDЃ`Z�I9H\-P^HŞy(=z8$Xx!/H;t-Yd
    #ԥnZ_�(qkAGx:t)IofyAzƸ{�0@B~HlJs>Vضb˾_[5Į|]Cywz(kéQ:cc+'bkx8۷wg֮]+rOQh!(
    1:WE*uz7博6L)߯l[W_8`~__>ccƌ~gڀ/Ӵi-6~qsJgʯv-bӬz뿞c�JG
    :*#0z,z_iD
    'Z_K~;cĩsism`uOͧҖ*V؆ntwcsZmBD,h?{LLߨ(+M$6
    XLN0@5F(6lZ93L\ȅx:.lݒBPyw
    
    bxVlŀ/u`@Ƙϝ}`<pQTKjo*^pO`җ""BHp/+:6++5*WYTK`];.4m``1u�%H
    E8@RJ(#DŹ\n>)-&ȡ;#@j6�nQ'`FA h?_,nQR5a	5XZoγ.FKˠk3I,_@3ddTZOBk!?
    E>\"0mBUS-/	8#05")UIY|DEBc@yU䦯 Q9' 1e`lrbXmsA`	f⺇]�#d8)#0\P,)
    (`7k١c'xWC;+Ak3G
    
    o\$1^~=#o$\i؃ʎ_5Mj:
    *;R`�.0a*tt,>hOp-N_7u
    )XO,\hCnd7ApsigM#Xv	3v4`!R~vFZX>_bF@@z=L?h`X̋*zտظܻ'5am`{Bƍh
    '"VVE:^*P2F*9Ǫa�#0@M6ezu@U
    hmO6nw`K*
    HwhE,=iIDm|hhau+P8ć!g dzA$UiF`F`FHaK+N	V,bȱs3(+hfhܹ=c9l;`Ͳ`meiVBlV`F`F"@(Y,+ĺT)3Y%f+avФ? }fP5
    Ԟw۝
    	6YPg+0�#0�#0'x^LUź09RE$fRipIEg+š7B?ע!/ݾf7"E3�#0�#0@]E@8i>&{#+PC$d=g.<Îмyk.QÅ,h	_A9XAG)`=һCϞŻE%.`F`F`BZBr*a2RJ3S0t@|8X́q)v"T;7cSn	tWi2CFMRh]WɽTpn08q"$ϝ6V`F`F�L+Ŧ2N#N)zbLY~(oĪ|p$BUC3w!746)a:QR�
    sXXˆb{߫*S;U1�#0�#0ؔI.hڈX9G1hX<b$d˄z_]<X}5kc=^{gl߽Фeg$58j'4hr,ZQmPC&͏m/NJ+ x>ea,(;n:ґH|%/YCz<ei8.hN;S8%!'К	í?rafy?nBR>ds-Ǵ6@98"f{;x.~V1d=C`F`<$e{I)EXm;vŖ}:ձ"-f{c[b;.Cv:BS]t~vl۶mݰ scf3r;cc|qM䣫<E,+̌)']3߈WL)8?Mq)$F\)]q,?bH>2KTYKeu1$aAqv#FV ׯ0xؘ1c,)F.#qFq?0wH%9'Zns:<ߺ}g8:-Z"oˠCúZ>jZv.Tu(WJwl	]7Ao0O!`X4
    sG)RPEsCL28_˭E)~RSèira4]̾?tQX^rL=sp~@Uy	?a?
    #'eF`F`c=
    M.XbuG@7nXNe-rS<z+_"QT܆j V1_%Xm29H0o.#-XA2f@⎒H\
    Hn#\tqD˓4K<|@8)#0�#0�#P@#AVUp+9*+nf 	^@*CE*MJw "+VN$WhBBU˭n"bYr=#FB|ІiX1m"cI2),O-,{&"2�#0u|<qH^SP(dXՂU"Vīc(/Eb,UDŊHeZyv{g+A~8_R}]t ]ZJ|
    1\ѽ1tÝ\zշe�#0�#0B%RE>V@) Vk3	"UehB^Akn
    p4
    }3*u.upYz%L!/Zd>V%J$7Dr3q%LkL\S(ɡyfPG4L=4pu*K!XN0�#0�#TwhkIlje-ݯ'Ur̅8:v^=Oϯz
    [
    rE5+`Ƕl'4jbgba;hwq7饢eS!ks
    6.mu
    6Ӳ|0@!5#V"Kc̱RjW"DSaݺuqHIoؤlYQغ[Cc(ð#v7e j&h=KfF`F`F@rysͪJrD6mCv@=]'>Y'?Y=-U@6eF`F!{oj\!Fd5ɖk/Y^-O4ne$d˄ڵ#hD?w`9Ur
    Z0FVhҼ$U,`jɺz((-+	Ud"Р~=XwhҸ!^|]Z=V,�5	ajMvsi$V*RtJhش4iHߣk֯=M;;m9l^㻆9F`F`Oށ`xFbRW@aX:0bPCk"F]-ꗯo!ؼW=vFX}Mtќ`F @†Ф`yXK	xC߉K⑓]F$`A9$],Na[\늧7hR2iU~7owE9Jaz `*Apٮ-P^́(iF`)_ܫiZ@\3J'_YJ`+U,`(6+6adZևds7,R9pY T;7c؈si
    wՌF`@YȪSYbŝH	n:*e˩nh>uφ+`
    a23ՏІAuu/9Ō@`e.(E6^%~qM	e*GW?}
    q/+$V; 2i*3�#|]#`<Mҳ_7-?[cn竴nWXz2+SN͇kPκVDž3_8N
    ԝ((qڀ@IXVR-:lǪV("UD6+ "*}#ԫW֮|b
    t;"C:Ȳe_.h+*"~^~r*fF.# vt`w vNpS~Wd"-Vna	|Sa<m3cܹJ[T3x#_n;%.tߗ+Yt9Lnv} {ǸV(5;^K}gM	
    'Q9Q9VhE-쭱3I*GIUnsJ$Wx
    Ubt/
    M1T%H,r*/	"]	tK|XG(�*L_9ɫ9F`" p0t<<kLM΂em;0Gd7HȦ@&`} T
    M�>oH}@%5H/?}+c5D]�
    |th{XW7]Ӈ^-WS*"UPJbE+TmBM#̳
    k& ¨<Q#/.ژِ?5T!'hgF ppӃorfOZ<WtA5pl#@c=9{ð	�,A^
    Ƣ)~Zvc`ε"K>9VXQ
    	EsCoK$Jҝې@m*-VHD"?tȃ3sd9ڤ
    
    	ÃS!׎`GӝFk.dJ]k{8:nǩeƓ\tKpыGK!W%Z3*|3۪pszÏ?2KGsμ|iUzu=sU@)(EU�[ns뚟4,UT@bEV,=
    	U.^^MXV4-III
    .0SفY[3�#$@;ův@!~ſưИ+ .X}7MG8v>TǑT?so@ih֤:#ğ=Jq*p"VtnUz"R*"UbE-t=
    %!X@?4C/i ?%\p{.Y97@>3J
    m7'BHpfF`I-ж"ƵCm2<ޝ7ʹC^
    m\nT+%-KWΑq~>gծjՓHy%ֵTĕ*$X&A؅	Zڡ]p3QnJ2^	[x^Akn
    u̙TeZe3Q9p;.=ss2 oLG\,IƼ_9	U3�#@XW{)_כVp<grcem;(!\
    R%=\<6~Рq$.}p^XŒdL\7ӑ 9k"0�#0�#0
    5JZثip:ºuQ:avewu/c:oC$-PaG(o
    Xö�Y~։`F V;Ֆ1{}|>�?+8^OfRA
    (I?I̳ҫEs<h5ڴql;J?t?a:,t8_AgDF`jbRP0upL}@]ƽ+R$ Yө b`TcTEs3(+hfhܹ=c9l;`Ͳ`meQt<0=�#0�#0@F@_ZV#c_|z
    `۴	xl	7]?=
    f@zaۺcppiPACҝa6o,B[F,j"wF\:#P7
    6X�1?<qu[NSPP�w^k(8�Fd^~'5m}|OQ25٫@t\9$pqkf|1MT}IX*wCf7L5eWk8,(hgs: .rp@<afbUɽgbUCլ$KnZ
    WC2[n=;>FrZ
    <Xo
    ZV3X͞3^4ƴ*&LXUy{Kh٢	j
    N՚cLXqU^/TJH
    ]R!ìZUlE2'c*drXxF`F ah}6cq{;-V?RWDnC6c=&V
    :bEY
    غۼ	<($U;D/y	XU'
    ]R!Uh�#4D<V32D=qUX5FZ#ׅHHb>Vb:V,dcer!v(+݅jnv`,}X.#0�#0�#0qU"+UZP5JoLfMce;E BUJaFW>]|H+5'uTd1Ⱥ޽$@KFzw@wKqEf~sQ\yǭ{:8GXݱ}$+ۯLu~X&1?FD`?%F`F �ܺ{uE+;m
    *GIUnsJ$WxM*ݱAao#R
    sgrŐAX�×g‚ARƒb%c&ZH2C$tᙃ"A}@~+7 ΀= yP$Bq>,tcѠL˜qj'#ۯLΦ~X&1?FF!	K"h=!x1YQ
    FB/H9#$e+s~e"v%M[1W12]1	K]aO%"I6K&hx*XQ oRI s!YZ˽VJFC!90bhHB&>*+/ȅQyzqe $t]X~wU}˔"E_Q?;
    	brFFdG&o36S5X~`ꀀɥMv
    ޸a=<;ox:d_"QT܆j V1mBBU&!'pY~\$rk2,9``>Z
    nQ<ONfYAzcqg=W^},L$!X&qv焌�#PcpX;ZO8,`X{8C,EQ
    5h]B@l㍺T}+#P󨐆)Ͱs*u6s!8TdҤt+b9VHvmE\#XedT>,@I	,7H$O,S<G\P=ZLל,dd3MEmLTt	0ʒvg$RBGk2-AXr\p3[gWb
    X)7*/Eb,UDŊ۸omLt=
    !JLEg"fmb
    :pI[�f(?AA&ԡ\iӕUp,ABX\͢M=܍a!A|L9Yz76I+3Ƕ$Z0H,`%E	s,s[klɰZ	gղ¬TDh GV09dfAć+UJ4"fw(A*C'Xvk+ }FQ{DuӥHrRHKΛE8X$:˜z-�`VP$ӵС+2ۡIU#_|=)~e&fӲ@Lm2)+lFmdwpewuW Ru,)bd&?.h:?!qkTbz>}Hb%",kVe;tjht~p4H V"84no]gh!3<EmR?gyf\Lc5>+-ߥ<Rp-t᪣C\#o8iG
    ==$.jJ~wMAYoFH_~SDuk4/zȜew"3^%TȂ(Ԝfj;H$XòXi]ثip:ºuQ:avewu/c:oC$-PaG(o
    Xö�Ysȥ/0@]F Gܲ]hZMi`F`C@oNe
    Sƪj7+cEb^/jm|hhau+P8ć!g dzAUt-Hg`R\F`B�E(p
    KpI-#~/<C
    X^ψjUL
    Č�#0m2Rx,^1>UHߨ8dt}zy}ߤb6LPad*0gZrUXjH櫚q)�#P5Њ~nFi2>R$ٲѵjdCf DDV[D8#P	RymP%Z¹:-BZH$YF`F`FrޟfL񮀘XKd,V~TTڵki/?x/*qF`F`F`!Jq,iY}bX~KTp3d˄cyFr]@:{\zPٴ`bZ@G>M{N0a`y
    عt<+x≾eE0(}d&Vb)J>F"6l01biĵm:MAAAŋ+0�#{臘M²)wRZ	DǕC&m;oht8]w+!HDjС!|	+/ä-[O.W]~)<p^V?p`\Dn>OFM2vT`F`FVI[4(Xd=BUcz
    ;{1QXXM~?6	"i]>+!}l8|quؾo[bUV2tQ7p8#P{HbU{1�#Tw"Y'fŊnY-VlTvc>p/̞5>5\tVwG·tl	0:'N=\VAE2�[V KiRA]R*`x&Yh(](񖩼/=(
    e*X{n1Y#0�#0�#P0R
    XhfSXkn:	<Vy�-"EܙP^N˞C>,GD#s8tB	QTRiy?)8`(
    P?7̆b鵬W>`pJGQP⥇`:/c0USO%0�#0�#PWPK9Ċ6XLl\QU/_0QT^�+[3|	emrܮC�
    rI	&AFt.B?}9te
    lȂΰ*Wt?_2|$h+169
    C~F_mK�#0�#0@F�9SgR*L`+bڸa=<;ox}r۷>ha2w#!jT:Ck2DdeGY)KV0cIFF`P},L$rqF`F`F!I,n}AVTYWVjmn4j-@p}ÓOmEɗ/- @}I6L|.~vH%S"aF`F`{뵉Uj~ScE{꫾r;V.4K֓CοOo{+S
    HBX	&f@IYpw4\p1><Ge))8@Qܫ	!"\B-@>jɧ>
    ƌ<ㄑWʜ𪀵y|N
    +رcQF?	05
    (>}uz5۫1qrT+X%
    be֒6nVd^g VPm
    NGBi`I4
    `ZB2&莌I\W#;?:6
    "HD鑈q0<ͅ%>E!Vn=,0·4*xiv&V5Y2)GU!e'M=4.�ZlYM>jG_|n
    >&@Q#>ĪX߼==7kX%sBZ;A5*#mzgG**U}=uPUT#&VE35&V5X{.Yf}{ةc׸qcX~=w}p뭷u85jҸZG#a[OUcEd6
    QIՇ$ӊ <RU%YҊ//ӷeFڵZhʧl>@C xQ
    XѼ" "ɸ&X'w `Gӣ�#0�#PYg`*{^M	T)s&+%I/UVHEX#0�#P]`bOk^@JLJ
    \=Z^˩F`F: [Պp:]O\"lkv:L\:+\uhցLfd+]EtD
    Z^,`F`*"U#i;Bv-&	^~wx{Iܛ	B;y]K=q`W$0!Zao7=(9hP`2{RF`Fw-¢#xa7<F 2q+/Vdi:XhCitH^[E!JQ҄!
    aep<#0�#!+ 
    6,6#ᄚ
    P
    xXva0'F΀<gtzW
    rIw3avX|'гRzuXJf4�8{4QaRL*76N,`F`dR(Xxi8U""Pc?5kOGt|ODz@5<Bi5({V)=ɓ9}d/\
    G=HZr󮪺-<F rbU,Vd4Saj>4YI9iqeY**h2m tnz[üʑWQz) kS+xGdPb9�#0@B6nܘD
    ;a>j%+`]/߄]/n)[fC.7,[;6rbhu	ʿy^K]vQsҡk/CE9VKo'HuX	vH^	^fOJf@r<//"0UL1~y?9tf.,> pUAI|99-/raIap	>Kr,#0�#V<Ȥ-|H`�KpyvN`b̐P.~{㵠_/>y!pn}/H,+k]Z"T'U/_B0(ȣv3B֠PxM
    ڬoȑRr!Y�u7$W0J(.閞LtE՝0�#0@ɺMDsH	޷]�.)Pl;OTV^s;mS.9VZ'ԗ{#PZ5=宀bqzxvB/@th}Q.v0|ڌ%%YX!\d|qL80�#0rd-V|xzrqӶ뻧Gɸe=I([~P[8pP	ZxuKj5EeJ9.[AXo"^3t+3*(%,ޭg9XI_,&p`F`*"33?=7deeл8$jO君ջr"c
    +_bcuXUMCan?p:ΑU͎JK•O+I3`?Q c*)qasN
    J
    ɹZp ͂,#0�#T,V'e%97=`u,sJޝ[L߸(Oń	>$VȢeObJPmGq з6=r|-
    <V\UP'.R1vE'-:ϴV̜ކe^OϜ5bF`:ɺvBrd-:*
    XZ\$Wgu:2?[ǡФQf؍.n~!}usB�:v^=OO]y `@@/6l`1biĵmfЅe2D`̘10n8Xre**Ym۶QFa#PShڴ),8B傂hW+rH<Zp?l)Q\`=B#'/Pew2:X,]{TՔg=F`F` 
    yu5i.\qHL)r&MtM,ȉ VJ`պ*l뷈[w$[cUmF`F"РAXnpIX\R"H>@mC`;ro.
    ۄQ"Vļmv(SW"TU"zoy睾syv_*3.ʼn3�#0u
    }^yؾ};dddppa@>@mC`ǮRذe7o~C̱Zh,.%mocnͱNHj5l`ZRU%0cU[x`k.Ņ�Y5kCel@9VcǎVm|Xk8cSObU#b5Gjԝ2@`brHY #0@%"Xڏ7ZZhU7L:7�_.*ˮԊpF`F`F !UXՆ9VamH2!"
    VR<Y
    a2`F`F` ɔ)'VXsRSH&Y(|>;MO+WwXU.,`F`F!`+[NI9JĚSS!:F+UK]{Iҥŋr3_QTvMm֛`F`FBQѦ**kNҢcQ>*K%"5~e*1\Y_&zQN)0,`F`FU 8uOĚrRQ3o-NdB�`�KeBv00q-*AF`F`Z{^-VI4.Y*o$:A<-"a~G?gaF`F`^+V+`]XEHFsCYEV1�#b?
    ,>~sF`P}D殺=$ViY-ZǿƠu&]&t>6q1M㼨p"Pb@$O⼩pLpprE.}-CI[>mN$#0@
    IiUeF`@Tm޼JSPP�Mj%8WɃ1c10C׮]!Ċ,V,P8:xL0҄Kѡ½Ndkq|l&V?I]Męuf@TbE5`F`v'6lpEhbe3b;e֏-VU80D0�#T7骭ULXu}iDyNdp<�#0�#0@uFJ[nЉ֑,GWyU|[n�#0�#058r*![[5LĚSbvkDeR9rIu[gF`F`<CXJHԚd15[]ngF`F`!A˭|D9H*Յ:F1�#0�#0u
    ]`=u,Aݡ\*#0u9tU|D8Y3hjX5ˆUa:TiΩ'VbUkNbu$BFTdT	t2�Xs:F^|q)6'kɁ?<wJJx:wDpr 71B	D2YX4:N[ׯYCچ)�#jȕ0[h-Vِ_,(/·%}ҡ{$SL*y	*Y2A6d/3Y%'gTa%Lְ_,
    X봲C7p:Uغ
    ς*,=i0�'
    zvLS)B,`j.U1**1kNBuȃ3saA,ZirATɌi�|i~@AzV5ҒmP-V:ӅYֻWXkF8DimZY4"m&pZlkVKY&ږУ$4`ŬȊB٥*<'Mu5ym
    *GrQoBh[+Μ`&WvKtdl…ݿs;d˄cyFr]ͫn8{]AViy"r`f9Lq)G$s9*9t3CP<?ȘU4(e|a"CX,NfB*�,'W2tVyqp:S,G\q|TFņ
    1ڴiyyD&u[4i?2]/Yt)MȄų@[Al~.p38$Hz2#i	(S:j96^*Z{vVw3}P}t
    .~S۲fb֞`cdVq<=z4ڑƭ:
    w�M[|e\i{cHb;.1cƄ%TG]ϰ3cCW@ ;yDNo̍ALUNq,?( 76SaDz8O)CΎ2t:Url|j|
    0@N~CKOZ]bwi1t8|Al4Un0 6aql|7#>.,)҃dj9d]čQ\HuR_WTw9w}F`j*>2OD_Rf}
    6oJ+`j:z
    ^-/sg#.n~RyXE
    22a<VȹmŋyXpYJ(>蜝%,iqG�#P FCj]97c*5!Șcx<,XYNySZԢY.0r.4/sĜh'r ̩`DK2Ѳ=T2uR8s%;6xp}GXMW@L9
    >*{HdS?"5Ẁ$R*"sP-Z!Nd@قhyX:Źy)jt^<`5ʩrFz#v4�..@Ltؚ4�tak�ܔs`TL$eH*g1BZ<"{tJѯp~F`)'Vubt3Ҽ>Ho9Tup%\'HK.ÑHYr#ǡ7
    *eWRqJ%
    ҙh#$H0pF싎5*tq:A*v=ݦc凌 8\,	th\$v$}D@irlY+'NplTKڳ/QS~yFyV)'V�LVq
    1<z?lGQrt…!!ar;)+87
    >H3LkiY{a6:a!.)/r'riFn K$WXከYӠ.־M]gB3ъ~V8s(!mqA\[m!_7zaO'rMrGk,>p^ls-'/::
    \0V2.
    /9`!IxUJnS/)W[>*e/5UPa4Q*`48#P*9Ǫ:ׅucF4m}V5j|*=f=bU@X%OX%QHXZ|b齱`U
    0�#0�#T	)'V<ǪJ
    SUM+v]j|`F`FXUkN%Euc$\/nwJxDB7keB8CML"fF`F`R=状vԻ*
    F`F`F#$ڨ:XP0�#0�#0@%!rbJj)0�#0�#0`IxwvnYtR%$0ĴqJ*`F`F`4a[>VWbNHPs"=1'_X|΢Aާrqc{ԡrRV+c,`G }~|jqF`F\;xeѣG[X{HxNG6m{qUcW.vaXλߠc̘1aIj||"u,/˅X~qyW3]ZB
    HX8ȝ6bZ"_nl(˯b!+;Y^v~ŕ=yqDzuviv}^<]'�#Pt<xp|w?J(]k֮ظq7|0�#B"9^};Y*Bт%Vذyk8U]yUTʜ%qy|XGmK>K-	?ͧ$raB.\ȀaPM/}!ólL$6$Ά}3|*%uFkXj}fgil̇82Q[1�#0�#0E *GU:z
    И#d,	R{Vy7
    rL"^h&;C/t.i xad1#:;p�#0�#0@"@Rt%Xg_&&|(.Yԑgݩ0ErR֬~`1"$EA6GͲdU/F`F WNE<FC&K9+
    ="3HFh3I.r#ѭN2r
    w+UvF_蟭_,\w/0J,`F`FXU[]޲M7Aԁu/|ъi-kB̏¹R7=
    2(-<B"6<3Z@zXYHʴkcI8@74/'`F`F`+Xy5.ΐi7'tJ4q-?IJg$0zijғʓ.TjCZ<b!r; '"[eSrE6̺4	YJo$%W28�u
    V]Usq)�#0E n<Ո3@MB!)'Vlrw+|b>$ymwIp@ו;V^¿2/[Ԍ`oLGk.ýp~^fZ*߻*`Mzd�#0�#-RNbU:XBXɯΪ2�#]*ksEk-*FY-Zh[1CfL!0`--+Xj
    %
    J>0ʓ^=Z$'`/}aK#F@6m tnt<ti~|*j(-+cv;
    ׃5k&ž{e+,gw<@TiӦ_{hW+rH=\
    G;WL+\$tKڌ:tPH]9#0@]GȊן`A 宀<*f<�#0`!40]�sB}e;q+9ՇAF`Cs*ĪXs`uLq.F`*
    dKBe\Kf5#xuQ	|?p@ZRS#^\	Vʉ[vo#)mlv\>#0;oj~%@YȪ֨ZYbŝ8une֩1~6\S
    Y	~|%&_Z^^} Ŋ2@
    0ɕ V1
    jJEkNbu$2#rDG-QYd
    ~UqT8#0Gݵ0{
    n	tXz?,=kaܴlqpcGhyҒ_a}ˬN9KL+he3_8NYKDA0gHZY*Jb0dV%00;dCi0U0DXb`:MEc&Pmt|K
    :Nv6:Ɲ%o	-WSiπsXNb:ZAYt9p,Bk}sWB~~xOw+\F0q65'թy1spm)1
    "*#.[nKJRq]U鲊pː()CEްN	O�,fa:kk:W7uuXxq2˩RF`7"p0t<<k.ZM΂em;0'oM~M" 8Ag#pYpǯO
    HAᾲۛ`#<*VI*׷Z֟"8YFH42C癸:~+ɒ>iy?WlgHM2 oL$gH܊)$3saHk%з6,6r+^D:J@ѷ?1+.miDr%[_l鸤Kq�SI0$[e
    @r>IA9# 2߰u<hig*z\	9ãր9*m
    &�:y+�Vp_IE{FINĭ9);sQu=z
    !)) 5$3BށDHnPY\iyDoza R(wVe04p"jD@.)Mrav?5O7aBR@I囲-gw.`*uR
    kܻt
    )ug/l7,3=N_^<]
    CcWԹb)]6i{ߐYÃsrQK;8]+Ux_q_aW@~>`>C*r
    H9JʚJU8g_Sd#)!AFGvA<2 +2k"O͏H]vx}a&RJsk$a{%ˑB˕Q?T.U
    s90$\NebȲF` W'Gk7rą|Žm"@̤'TьH7վ&~2<hɤפMt֚5	M3-hk^dPeqMm >>\Ys޿o'We#kz+m9j.$,_Z)es%w}۝ּbfK .ź]gªQ<V%
    LK	OD+ׅs2SdA>pT(pLF{e3'RaFhASuܬGCxr^,1Q 0W#<܊Fស}hB{_i;_
    Bk3ɰ3w>|OD桙K<}(!=ԏy Q<V3LV-^߀P"a9
    6_T p0Ef>,zd˹dSӚl#~?-v_A)u(,%-0_c^3́CWXSi,<4;xhqU&dIJuMh?E:- uwBJChpKg5t<oT$h>n3:LA7#eФn׊l'M]� �@�Bms'OoK\~<cҺUyh쓲O3QYⷚ{2+G^mRY5 mS	?rTE[J딁�'^w)˖->繗Ξ5*=xPپM.V
    RaT/eYz;g4Q$C~1;޿٩YN,_yJd
    8mߖs!w]~^XcUՍW˰G,jj$H!*�+k	`k
    B//=$ąk7i{PUae=M^6c �@�@H<xs]\liO`9=^GYi,_\^z)sCu!�!`CL\X-*naU]%PڹB#`>[/\ Kk!8 �CzaU7�to1}DXUȉ k<~	*EKA�@(EX=`?y
    l}	Uo#FFDTas%G#+tAC�0!謀FXEּ'Tu1/h<ZyV|&htJ;ϭcEuV� �@q	dd,R+T>ˈ-RT>smE>:+9*o8\=b	 PeK'cWâ� Pt=Dɻ8oNWCd{xp=<[vɰKraKL=,ڰB#ۓywR֧<8^ݎFʰٔzTuNP({)fqU0y(O$1iZu}	EQ!B{D: �"&h*aX7ř.oS\#4&dp*[%RCi7vKa9|ݞJz6Y=Sb{FUY6z߫d"^w5)fQ9<ޡd!϶\T%4E �#0=%6{o+ǔ90q6TNՔ� �TJX%ͩ1}=V*|eB&fǭU=j;eT⌍pJncԩBLIX]liX:bseUlE{Na &0}Y{7SDwx{(W=υ755h}]5~v}f?&R~Q8׃ousK($m?@�5M _4<V%X^|gވ.9wݑFyGKWopWZ6HlQ	((6A
    H[G	U$ͶҶ%U�*M'rꪍ7IƵpo{m9#~3LӔszj׏o?sUj:NOM{ЭN�@ªQ<Veϋ+[lJP:у#нUAO'u
    29^v2+eta7N1*]�*D`loyoi{U|(ŢX?&E{?5uVK8s&[rķrBׁ
    Z@�
    dUF$G
    M cMX=3Lx~*f]ˬjpzuحO䴭E=kSiFyHv筇 �&0v["/#*BIV>ߒ
    A(k' �7hvoVx&SzuQN?=G$
    b]HSdRux!~V@=-')WcHkwqV
    rsXu3s2?$r3f5!: 01'?5ot~"KDQ;Pd9@�N^wJěrP\#Ti;,ǽ2vܗ:rͬ
    eum467͎]lA>y̳x__Q~	y@iM:Ï*Yav{%-dKi']tGV;dڴ'H|aEz4+�@
    UM!@ 9=ߒ޺ڛd㽷U<Of3[C؏*dϚ<!I*vWc1Ykyɣ	-ڷ:tdY0ø�j@ª8oNmk>`5 PN<&'VgZ>.s'܄^?~b3a:-A<P]vݶ<I^QS!�N!8qaǪ1d	D=NEj� �@�h$WF4BB_!�@�� P,Mmk;y<3hP}+S>Ǥue<6'e٦Xջ(sssŎH n%VK1@LPzΝl2D4xyYs߳eZ �@xQSYN,_yJd
    8ms4_	5dߵg^BeRU]'t_E6㎰1GKTaǻ%I(GΤۦ>@	$!qax( kmlWts\{NKj}mo-B�� �@VQjN]0@>vvLLZ"jLF;CQKYMOKGF'ՂG*m<lۂC� �!0&[֥*0+#\UcږP]}\&a劭`#;r]<ϭOYjnlkK6}HA98(r8P}锬_U1G6{rc^ӗԛPZ^VG|ug/1̕,:3/Ng݂@0axetE#^ZxG\i"FlIy<P%S2;;+S2勘\ҝ*{n=2~h=d*w-{qj,{uC|hCZS3ڷ"~gG9�S PgPȳ_FaBhpܬg;xND[8j=@YcU`=s7HA(PgxPqT]#̆`yܻ^ڦẋIK.
    "^߾KbM_K9#qm9!5<˸JJsgڷmKvJD@�UOʡϥԱ~>r=Zֹ%@XqPJSx0!ϖΧ?ڭ I}O[ϨshD95JgM[ڽuVFx)GkU^|Wתsoz0?xd?t<j;dw2(;TW5vlq!h_c5:0M@eO̚N9x);>ذ}/~zkY؏?PdXO{.7\TT,.<OֱvfH	u@onz$GZ%.Xc3Pݮh̬2!tܒ6gUt}+vȜ=sM=DSSs5v2xL8`*hlx*usaI6raaĜ-EQI>h'
    5A�Ls~	/́۱W45:=)Wo!"9͗A`ٳܤrʘ[eAQ@	$.cU<E*pY
    Ȅ9;4`-Nmuu-U]FUK
    @>F~J2:d˹ {,R&3O;B;G5cˤn@t>,&^+49kkJ8O;U=ӿ&(R%:V[-#]	ͭ*6f@�K qa*~�[4q~`3b2xY[y!{'{!1|nMjʥ!94p\&"1./߈JFUZu]+}
     PQmVGҭxTVr+ԿeULj"0~dZNgЉέj-@re4'.XeV}5q798nBq~ޕH<+_Ff)%h/:89at,.f!5d17vݮvyYB6Ku;2$^*T-k5pxMW	W{B[اU]9?w"IjnU5� Xa*`^@WUb꧕ג@=0^++OzIeTgVI^v\uh啯'MH'11aBS;w4s7+Xbsyw4.<V%}-{jT%@H+bhw"R) PuLfaܗ~wfz;p?Z}ND:8@̼
    w[䊭C4:J`ԲW	=L�JU8_ 2,� �@�@*n9"l>ʂ �@�� �w̝<yR|1GwδlG&{>~9]xGAXXq"Z@?/fffܹS-[&}}}s/=/knU{^<Wp! �TE(޿ٱYN,_yJd
    8m{L'c;nVUAa5&[
    HT$aqe
    ªF
    3@*ߏwuΔE9j@]0!+[\*YS\(ɲYo
    ۪{>m<{ʻ2Z\MR`:%yRyG-,e䜠YT@�� P}%.=p>v~'&MddCw9,G=9qh:?s{l,jQ;!Ũ<@� �	ɖuodFC:oKu־q
    5@$.TBIÒÛc}}$K7VSnmqKDMOD.>.rVFgpaRk>iei<hztNI8nPyl^d?N٬wޠMa6a?^#}@u0_Ҽ=닺/
    -W
    ,Xf]8jC7FBƩ{L|mumcn}ZldUz|UvVͩ$d"#H-^A65kB|oϨn~y7wx(=i5}H[O-Ĉ-i7OdBn'4Ƕ-oRrxsPd{FU,Z<݁ҿW?2u	 P:tWouB7p_s쇔ijyv9BQYX-ԴS!'m~*o΂i|!R1(iN*bj=c'TC)B
    6vO-rٰ8s]:1wMЯM\J~:gGޡWa+l1[ �Z$`6w=+??Gثhm xO%uxG68QWZ%
    %Vg-N<}ȽOSDq9nYǣ9`+JĄ
    Ƶ6eܽ1^9gP<*|4f	{mk!|86tVgՇ0߹x7;T4cwR{Ҽ:`A-I\X%YP&y7}Q%hxCDUѕ̖[geB<1cY_庫b+
    0,]Aa{mܢ%1:ڬ5_-֑;7@�Ls[#j&=n
    x|0v[/xǼğ}QUqG)g1Mn9G}LĪE闟Uc*<ԠN_BԾOŖe?eJmmFU渱1G<۠?U;!oqs<c>yľ΢}	^gюdeڰ^(V?*i:FC'y<\F}K<Me;{\VXz\!VFX<=&Eor鈬,rcYUPqYEWk2j igXk&qJzJH(3hD7n'ݘ�
    #`B߫wWt_.Ot@2*闐ܯ?gUxvYL;x7y[zm}/ls59޾t
    s}@޼*^-b<#ce杏^3Y^gQ׏דA;A%3s~weiz]poQ5WMnąUxw	׳Mcޙ;.Uᬳ	VtA1`= 
    f-l"KzGDJUS"0Ph^YRYFٔ=JT�T#ӎ}Cb~/ݰa]9KN!EVaX\`[1<1wpZi'9`kF-wF<oBoociU%bgƿf8aDY%OV|V()=K@
    U~7ITxK*J[KAkj5UN`ڃբqt8e=rg<un󄗛�"էnW-'IaKt(CzM;I1xی( 7kPc%紏g+ �%[!>w
    0cVY_`=㧭0(W`#YG5yI*g,ssܫ{SQ۫'k̈ckƱ'
    從oBAr!3ƹJB;}Ȗ”O\X᱊K$犈p!x܋B.}cYeHzOv<<ng+00ǷϹ
    /<bgWo/�DpLòO{B-]/ee_Bu
    ÖhZ8d,aޚƌr-0l{7y?E&[xplҴkڄY䚷_rqI_~@\ ʶ3|engu*׆#�0BU.ӼX}/fs*2vCmx@XEIxH�mOC$oEfj_zVDq-m$8}ivhڇC}l쿊=*3ryk{ul¬6t^N~LWw,昷Fd$5Pv]3/Wj5:S~ku<6I
    .Μr1zs.`pC1wI8U
    e;+[呇ɞ>)d&wuI	TrVej@?/fff;we˖Iz[ſgVgYkGV?g]k1'%S8wjᬒIҜϺ{Ȣko4,^xY/]<NR[
    d9{xylW]wݝ|( @�� 0ƶX['P{Ӊڪ:*aHh� �@�uAʖA؉\5EDl|1}$X \@^<S@�('6_i'0qa5/jj�@Šu7WJq1?r �%P2kbU)ӥud)"oCReojM†냽:Y*q`_%̠N@�� �$X
    ˈ-XT6TB/2UKW?GEJ7)@�&:wG
    #_\� �Z'!Lҹ9emr=9#Llo/Ij}n7.=:dpPаâOZ{iT8zmC͈p(_]'VoHfx\ٞ;+X�Boߙ+W)UR	 nxp@%xJd<VƋdysekJc4kBҞ^UXR!<?|c/ҳ-GTMv$mWf9RӺQ]NOlMxITw
    fθCmW=xg_ފjoM݄bU �@ZٓJƛS-0}=<>*4eB&qoaaON#16"ý/qJ8&vd?mSj(=vHbeUjJnTaτv �!в^}粏WkK2]k}}Grz-?ͮaY_h:3}ryRxZQ/V_@ۋJƛSy`31KϬFyGKUѕ%L0Җ=1<"[GT^);=c+J]1uuIZwH[S
    j@	}nnľߛ)HcVtrM~zޱ^YE`F,0{8xsDkS\ƭF!PV*{pgI?
    OΡtGd	S1wX'wFmc
    zegԿǚnlb1>_cZ&C,o�=᮵:I 1?ݖ^ZRA{2Z^s~qks{[\^~Ъ:^Oi+VE)mFX=a9B;4qE:*zoCVtvov=-OPVQԀ&c!Ef
    քCq~oWW/AYOd|6Sv6Œ~@`	׫4Vic!HlJ?qdylS.ۑ\FYeiB7& P\	,VxFI=Lͺ('ß#I5G*JͬBV{:{qUi
    "?qdnjx҄$Wa<nNBt8"
    }TڠkƜ^DC^F.rf"!UM@C4OHxTCoǡ5vĉYvZVGiYs3-*,vU5c3	4� cι"x:ohHNDeLV\Sײmla l
    DSZPAs=t-?td؆hÏ<}V+[!�%'t]oϩ·ez<[\#5`'Y2\'6	x^ubYLhfg˘g:'=/:tO qaj �:rʴjc")>o#V4th1r345_&4|\Bv݀TS:}k:6c1׊`ܪi4@ [ąZ@	}'2h;#YNy{`8KZkE
    5]LmK
    ��]"IDATG?9Ƹ~,\bJ%@C T-� �@�(@c%qJ"u@�� �@�Dms'O~Cy!Wf1֕Cdgݏ~2g.	9\)/+*5C�333;we˖Ia㥳e/ًUu@�@"]{<xff9˲|q*7h sܷOqyGSw)뮻$,L)K\"eU`"*˗!P*RUJrG9(yIZXe&0,bXE馸fEwUVzoS]sw	"1-jn@�� �ME#CeVV)6W1Fړ#-2}T/(ʪPj-1헕\HmtL?SičbXgoi<cX^q|kVx&BiâOZh&Vh"Y|PDRcQSj}nx8.l;zAÁ|떭Nܘ׵mg^m{(%f<.YNx.ݮ/GϿmcn}fC3@�O qaU+Ǎxdoꙍm9F\d씪vag*TMi!bkbp*gIGW鮚-{;WߛbcxowujnęSA۬ |f" 0?:7;Ĥ<&Gճ.BqFe/+i9=!SJ �LFXypݕexxT tjivbCLxk(=VH^o0פ_|-٭_lG<1gظv=4`zN穵_}j^_L}6r�@j
    ODLr:xtֽÐyq[m	s68knؘFd"GײvsQTM1g>_cqvB0jel@H\XͩZ~?owx:TlvEJ22_'PV2FBkB20g֠8:/O]2򚅼RzwG[ESiގ>zH;xxt#'KiS
    67w 08x=_3,7l9'XQZMc2c^Я?`\:V79){|=df]ֆ	o^`9\6Ԣ(aUªQ<VEN'zex)%URl^C!GӍp^-wnیwN?Yq;'zv@{QӧLO"hx&
    *zsuHڞ;E;7;)CqmEܫ?F6iF`
    ndc ӄnB aFX:&Į#$RE\?,p:5%!z^+CҴ&p:f͔}ӡm@6{발;s
    cLC\Y"~@{Lȟ2,oE5K<ob#yU{&"`CrJ[5.p|	dlj6$I 0Zw
    Uee,Ұ]Af۬+	:.׹fT	-[|tm9htg:q#2爯3}=dt39"!{F}	_+$_5,<)2*3?8U%:vަUncvHmL<	uD.(<jZceCřex_f;$h;]3YVV}8xNyQCZz./״MZP^2;xa$ PN٤?㮯g՞=2qO!
    Y!_&0I7B+}IL>	ElYUmܓ(BWWrMt8D qaǪO}j7w]-7"7w8Փޞ%Mlw;}wB#%P;b{M~A$78	6Iڷ
    :HWcSՖ_z״clz|1UL qaǪG*MvfxǪh�@K	
    :ޚ¬1w=ϹuY)u@D2ʅڏD13`49Ƿб2G2
    3(%z+<VGcYLŃ@�� �T@
    U �@�� �"Զ'!<VvTVymOG?zWфp$O %(y133TsNYlistVŃ2{\9R� P0E(޿ٹYN,_yJd
    8m=<\;KVAn_a5&[
    HT:K`bFXүz!P](G[@RUV*:YI|OWj+>%f`@�� �@0qVhPEaɥcEY
    .@�N)YT֎ɖu7VUy+<V%	@XHGi{-_6T_Zom\)c[Cީ飇EzAÁ9u뾝dL[Dr>;R=qKK^S{] y.'}yڀ� H\XՅ7'H*@Z}K;>.֦9mNttlэ5
    Fgn{hiqtnٲ(+N:6ۭ%SnzA"Zb(H_/5;*A?k{1}_y$eUwO`ZNwjT(M]ndj|5YKaѿ{Xin}4,#B!7l%Aߘw8B9J.w͖#kn8#o2`k3㽲%Д팳Zx	4a}.{JmO@-xpc(Vf1nL(2~nXf.YU[*!PVzs|=P1eok{h6ϓdm$z0?#:z$U꽒./UER!`ra
    #'ckXP@\È*JElRt;I@	3&	rYp?3Nss4^S8;'Y+&=֑<�4|YVJt&OZe2`)e}2ဩP^ʨgDOrraღhY=mQ<O\^9zv
    @MAL|`Mf卷<N#&2W!mEhܫ?8)(=@`a	%FX%6^߀h"hWnөta!_T pLΚ)0̺r<Y=[gVjiS?g;hc1+B8p PZ1
    P@hWm!`Dq6O;PU=<@�UK qaǪر$Bay]6']e]YWCb՞@HixÀ&hTޞVaKǵ=?|	8>*jO6zZ8-1@Yh_B׊lX&'刬ЮV'M`숳v98?cv84遢>WXͅw.xLvn[Xϩ9EryϪz5pr*?eD'3uRKq=N9mZ]#q3u
    s5;rf&e!�%	B{ԚW	#bla٧{-KS[cEqMC@eU*P˰
    4Qjc[TI9@N8ҙ޶&i߾*m!uBnC@|jxY5|1aUܙm^	19JY@d
    EVcU,?WSg\{leWwC�uDrB"YND�tf~DK߉tu\*rB�kJZ9|Y8͍m&i-]� �@�@ą+& �@�� h1wߐU"?lG&{>~9oNbh)G mg	-A	333;wʲeˤO㥳e/ً� �y#7;577˩^K8S,Gm}200 ?W3[{-rwJjHHC(5d#P!(GNA�0!ICkeQ9ӫ>EJ+$+tJ֛}skv_>[!�@��@4źąUxǢ^c[eQk	)FE
    !�@�-Mvhdq+qaU76#>K+_.p\[MylY.wmBy{Ned\RӒ)	' M~ؐJsXl֨E8T1Va�$t,gh$ۥ.@�@[RPVI*<t.O!5!ShTzV;n*`U ٞveƼ9kP7 rбQӡdtQ9<!=
    nZv#{eLtHp P#ts:{<''H0�@*oNu6}=V*eB&S9ƭUeݏ`/W}٭e 
    
    .mYuU6oi#XTz5Is5E֥A/$,=Wea[
    z/T?bB^O;D0^X1b)ąU2ޜm3{bDULhQFyb{|T%PW:T0{"߃e{V;T,m%i-cOʆM POZd2~
    Gwh\zyko  s=O&6lQ)Q_T<.</vپgk~ΏmuZ"Co �d	eN\X5*aItyK#
    
    X7>|0&˰>Φ1.)
    ;~Hܷ192!:ܤ?XigyQ94+\}ﺷcXcR;Djl
    "5ٚv$d=?
    �$`'rU[6*7;ZޡI"D
    a
    >v8^KпPh`zuMU&]KJث)$mUDJ �!)zQVtǽ̳EV^*eC
    JHWO$ACD\@ @Jj#[<Vq,JOZwcp29"P@#*TY);;B,'WCQ8&7,=㺐&xv.]}br6v93omh<
    Lya<tH<ʱ 1*v77yO"5s GwC=�*O 
    軳nbcg3Ҧx:ohH7J%Z.cܖ#ϙQAȽVhHqTEqm$bC_ivP,fr/ PLv>lE;eu>,4o
    0I.gB#
    9W.
    uq@�NN+f � fn~49*/߆	Ep ?qLڷ
    2::Ka
    d@pRx i9Mv2;G(B�B Ip
    s�!_vNxhgh,U/'܉XM-M 2OB{s :";xu4ߝ=@$.]cu'#rGKWOȹ(gǓ3~[^+mV0jy\sZ4B	xY2tU#ωbeϙ%C<VsrrMJY7d799s,ni~e_wGޱ|~Nu8 �	}ng]
     `Fn9GIms7/dmw?.+[呇ɞ>)d&ǪquGr͍s:7]޶!,Y*see+YߋmOE#_Ƿ-&5T%bff&oΝl2d9xyYs߳e⹪FA�@Xt577˩^K8S,Gm}200 /y-Ě,wy%k-O=5kJ}27\}*߼YniܲnVd[r嶟E1*04
    j:ZJV\w
     �@NVeQ=s݉ȕo9^YR]y뼆l#(n@h=I
    � �@�	(KXŵ~(fϚ7a5x.:E-n� �@�� PAbmPFT^6bu+|Uꪫs&'c,ϭc)Y<o{:<GjkPf1r,8[}NN{Qo8K{c[jh6sr3\Ҭ󶗕i؆ȴwjߪ� �@�([XH>4]{.[M/uQ.hUJ3yճ2A;u9%2_{km/q>^(F{㿸5!S^{!G,;Uj[9}NDW>m*<7vЫz¿lL"}Ǎ-@�� �@ 9e+cJCw[Ex֛r32+=]Q&׼wr}M|H7QFtOwva	V6i7_:2Ncܺ"e(Ye\b/6Br<dw6+㽲%kZF(i^@�� �b-^9'_~|{=6`&pEKo8ynXzrfT1.m1:@:-Q,GUuŅ%PQUqdy
    )f UEXQ7'UO	MS� �@�I([X]ا1,lT|QbkTP]yzÙ]ʪMHLd)" C;Gd-z+]5[qV+v].ÞIeA=� �@�(@ª2TQx̗uݷIjۿ5\
    G
    )BLR
    sDCY'0l'хaxxG,"8PN!GBmۡN81j!k;dPYLiMa(ur0j �@�� P^WT@9UW4$PՓ&{+\
    '52ixk&tI8@&хzXz.cǮtf)0EQ7kXA'8"rCCu	$nqa9Uj=c\ /aEQ@�� �"Զo|r2z3\ZW#m=}Rv?྿_K;WY+|WbKfG\Qesg+ߘoZ".NE2wJYu\{U_c1mX@BM755U)%^v)˖->繗Ξ5*=xPs2� 0ϝf9˲|LjT*%o@o[ȋg^0r{n;Sk2ZR#|yٌ粉*5Wߓ,/Vcg:Źly*Vm~qZjyL(`GO	^EO!�@��@⡀~ֿBqT[kPMyXZt{e/엶>%meYKߓnPhܗ+_q@�� �V>Ubt);"rZNWMOxro+S{-ZK@琵l<OT@�� �	dRB֊Xڪ敲xoȢoMsr9Yrҕ,\ucZyLR9Í� �@��p.*vRq+/@UR䖏M?,WϞ_,fOjb\~Lq �@�� �&X+LVΥKf<g+v)/~Gf5Kn|2kB@�� �@� P+j{Lɮ[V+r岷9ˎ|u=_=rl\8SI{�=� �@�@E	Į*ş#EP?u6ֽTX^rB�r={j!�@�� �T'ڙ*ضS2jSk(
    +|Uꪫswf,ϭ&P锬77'5(>5-2yU>M~-wӒZ%2.ٗʫwgUQgC�� �@	RŔOG,<
    Ӭ(_T]́/+}NUJ3yճ2AZI>%2BDkzGUdX1햙(F{	SJoA!^
    TЏ.;nN'\>Fu �@�� АbXr{!+<~O=UFT]D=
    +UiHkrͻ':rx\W:C؈zlz[
    H2-mnD_xB&Չ[:eho$|*ms+{[6JOǨ=ZAk߼A!�@�� PUA^9'_~|{=6o߈(_T]
    7a5{TP]qN=ss.LO]<mKG,hb{sKU֕=#*KW*nU	F!�@�� PN^qbBsTS勪UX/JM>{
    OXޥzi܄ǴL+:us;Ԑ:Gd!='ze	K9|3+h1 �@��晀#L
    ;PrlTQx0н朄ۿ5\
    
    FhkJпѰ;`1	*L=[ItF9^KNԗT"=;dPQքiŘcT@�� � ؍mO?(2f*<QuEW4?^yBP@?QpO]'0rN	?CQoV1n]wYkvC7KOI-ʰmO6?vʎ/d1GBe!�@�� P#1oz9-:)=lG&{>~Ak-97\f_E-ꚛqeD9ϝ\|cNni\8]lN5+efԕsUF-Y讅a# bff&pΝl2s{yYs߳7'c�@��?w/KRTJpq߶>ϼQ,wy*4و|0t={6l4}r«/guEǢYNyqF8,o^yty@c@�� �@�X(QQUg+C?'+e+Sv{?.^qYOI/~YVҟ6Z5A�� �@�*K?Kgk!"˪뤽}tʏ'?-gN2WΟB
    K �@�� �P@SxtmrMJY7d799s,ni~e_wGޱ|~&	
    @�� �@�TŮi2ލJSSqs;+PiuQS770p� �@��@xLVΥKf<g+v)/~Gf5Kn|2kBH1ٺhWT
    P! �@�� Pb=VB6	6xgΔeU"W.{_˗^U*A%w@�� �"+')go^!8?G4~1l{Y�Au{foD7=.}Ƹ� �@��*OVfSt]+*^(#f/1r9l7_Z^y?g7jl,ZHO?<xDJWk:%mŕ"[[V{)߾E>5in|@�� �j"P#FguzVE/x^ŕ>*cYd9uJop^s95(][UVuJwuTsL=,W2-_9mo۵EeIm&!�@�� �j 
    &/;w1[x]9Fլ2&pWXzMC_k;Z~	TgQgʯ@=<.ݝ^2,W&2W{er �@��@*TX:sN=zlw~wb7"U/
    GX+TWS~E#td"ԹC;eĸaW(sK-v	KªY� �@�(@(UJ{ub澸粕7멌U/2^,
    +n}*$3؈k``7E6tj	Y&R˙*'5 � �@�UeVʈ*ce!^VsNB}|MߚQUJC:@4{ײG:d<Q2j&p3`<mee٭8cA[� �@�@ib=V~Uҫkknt7VA剪+rrϙrP>9hDzFJl]b\zU湜er&YƨJ,6E!�@�� � !1b|%iv8rqwۮ{W1&N:
    84Uzǎ8e/"}!?ExϬ{kE;̅CE!�@�� �'+BW_|0t={69s_+ɅW_zέr\܍rqY޼f,].֩]j(V;m@�� �@�yYc?yE~?_OV5(Vʅ,o-]޽K_?=
    Uwi!
    cX
    DF#Z	B�� �@	d
    X*B_Ɉ\:\YzYv?C̩ߖW3Z+.+Ԉ	G62&|5!�@�� P*$0y4qrMJY7d799s,ni~e_wGޱ|~f*a �@�� �@Y+PB
    Ҕߔ%|\naz<?N.zi̞VuG&F� �@�@)[߿?t.]49s_!7M
    #%pV7y-fB\{d8׵3!�@�� �X><yOs_C
    Weos`MnKjl
    zEDVx}@�� �@�Xwr#EP?u6~V@#\tOD*ʜ
    \-vUDM� �@�gMmk{g_	5IgvٵklG&{>~}&x<D??p;^UH]uVmL݃rMv}s^xDzx+L<1)5ݺHN%}Gu͹ǻ6r|;K8fJj}6z^͘#ŭm-r=Tξf=..)9CZGEINy 0ϋ;wje<[ſgγ4@�N7;/KǩTJpq߶>ϼl{n;SV"V_DX}!ŷRQuE7^2*aZ=Wʈ+7ee-ܾ99rO<U9%2fN]〘U&soxa
    b>fc+#M׌p4MJiG].׵{=#m/ªߎ?	"`	@�X(IXrHs{
    6-0fDeMTq3*\9/_5
    	|My**T"IM+2<2rvɈ2>c#mn}4,#豽]Ͳ.׵Nl6iA  �@��@}
    3ՙs'	csV2*#._z9ss]c\qN=iT!n;;:wȠz2}Tˠ"GBL6Ej]4Z6&QGmq pw2'� \*
    h*k>яOm=|%Oɵ+Qu\t
    xݒgwH3
    8m)jr][
    ,npMbX@ѷeG#fByQKP@nA_�jUz`k)k$xKs''_8ǯ}O?P27L9ǓO>9/տܟ/Ͻs?zw~8s'G;&s8ow&[zstW:osmWbyczGGsN2Ss2'^[cM<7vmi'sP²wn4Uo3ۊu`�44ܹssy=ccE!�@*؟Woyk cDFi&Jc'Isy^r�hH_~V.]lRbvq~d'\JPWO+lc&ĠLBq:^3z8?]O:
    dATѾeV<V5#FB`	걚wh� P�R<Ve	_K=WY+|Wb-ꚛQeչ3ߕo7-		9Y$s׬[*[RD
    z_?ª$@@XA@�uMaUVV@#Tlʌ5W=^j urEϋs7fy;TTZ0N&viKg|Aۺj]4葍^s]+HuA�� �@	%OɊeߔ]^E˻~\V~iSN_TtۆfMؚI}.?-ia3j.
    eD}� �@�].Inz=rcs*CYq&S6m8b7
    MNz?7pd\
    RH;� �@�
    a\w	� �@�@X?sZ� �@���ª@�_ok3ku@�uZA� P|Fr۟S=7ʇ+h|HR瞖m+j �@	 ~  �: b<}x~I;^Gk}!o׍ň'y:}aC֗~Xy׿x>#|n9Ƕzs+yu4�@YWsǰ
    �@1t|Kxb	i52¤G9I}ȈHiV2bSȹ|{DZNR*)5\C0TzuRvnsJi6>okLV:DpF�ٓ>J aոC�Bkn5dL~aRNiWhM=˹)Y0_8ae<[EʆTThŵ#\qb@�(^[\!
    ]� Pa+_TB*zd;7H'`F;rNSEVPz|帷c@� P8#-JV*7wB�BQ]ϴY6^b%<TJI/̩krw"?/S'sTtrJgD@�jl� �Lz̃VI=(<ae	|^K8[hݭbEtk YcK8LJCUYve[`@�5G�aUsC�mOykDαB=}X|AJ~Fb$pl>D -N
    QxgVPӴkjxM	�j�ªF!�7T0{~Ѳvf5'v0nϪs֞ZVl{;ĖI
    m{;@	 y; �@�� U"� �@�hdF}@�,@�@C@X5pY@�� �@VJ� �@�@C@X5pY@�� �@VJ� �@�@Chj[{3<#JFok.i]*<M|I'
    � �	333A;wʲeˤye/,!J@�� rꅗe%T*%o@o[ȋg^hm{n;SVeE!�@ @ŠQxdvv"@X{A/IaE(`#� �@��"VL	@�� �@�e@X	� �/m �"PU]M:@�� �,BPM@�� �@ j8 �@	T*C@{Š@�� �@L2R� �%P_,JAB(B�cns':&C%𶫯3X_w,Yr\@C B�� 0_R>qߝh'h@�uI|ٽF~Ip]uٝΕ2~9TvcT�@ D�ań� � dOB
    B"D2gC>]r!ͣm@	 zx �!O|e0!yW;?|<[\O<y`
    ו~8}O>oGU[Y}wTdohsN+8n=a:d!bj@�@mXĬU7/^y#,G&{]kdۏ{Mٯɳ;605s9UZw7aTRAJ!K {HV#JgGI@�H3ip3N+=Y+׽{cv|]&z4vˬh5{_ǫ'Vzn~2ƞ8y.~b쬛92|#L;m?xs |qZse^: Df$&R �T~F~?JCDN=\x㢞_Wd$݋SEK2N?cf0@se PV8*@�Y'v#WK&gL}2∳r|\fWe"_V]g"V$6_+I'u@`	RUҸQ
    �*A 6m(ٹgb{n4
    ?O_}"uMYMn?I/>T_θ{/ǘ몬eWD6m;pBJy.O3y\kq(e!	!Ju� Pi+jvX[2މɒTgVI摵n=z6H`el?/貹;Ͼ΅^uk^1WjqJ`3*Mms<+mve׮]ҺUyh쓲OV&� �'^=ٹs,[L^:{^~A= ou{$pݵK/4Y|K%aS7ꐀb>wf9˲|q*7h sܷO3ePY;$yE@f	2t;frk-/�s~IÒPR �@�� pV
    7t@pUdf + ́"@=$CU@�J'lZ$73;@sz)*$*i@�� �46ܐa@�'PjV_=7套^	@`	"i@(UX@ݳ0.\%Kܴ�!࿇ ƽ�  JV~"b4B�@CHZXƪ� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��*A�aU		@�� �4UC
    7� �@��J%07d rUj˔� �@�� �B+U8]� �@��'@(`H� �@�W&/./CXᵪ)@ �@�� �DVʈ+VRȩ� �@�wzn@�� �T�k*A:!�@�� �"n:@�� �T';]ƪ� �@�W9X^~A�� �@�IpZ*DU� �@�g2
    AUL �@�� �J%Vl!�@�� �pn
    YI`Q{� �@�@	8~U� �@��@NU=u@�� �@�XU,B�� �@�
    C  c}UÌ?� �@�� TMMM	TM� �@��@(y2Y5K@�� �@ 9?	� �@�@XL �@�� �$K c+BLm� �@�@)('�=� �@��'[7UB
    AU>Xj� �@��@5Vƙ� �@�(@ +DUP)	@�� �4j,� �@�@zJ� �@��@h`cE(`cMz@�� �N #ݺ/J� �@��@(QN/!�@�� �d	ĮJ	j� �@�� PBª$U=� �@�H@F(`S �@�� �'UXᵪ� �@�@22p@D\%Z �@�� �&X� �@�� �k!� �@��$+,*!�@�� �"3y� �@��J$@(`(@�� �@'b.@�� �@�(�ªL� �@�� b@�� �@�(�ªL� �@�� b@�� �@�(�ªL� �@�� b@�� �@�(�ªL� �@�� b@�� �@�(�ªL� �@�� b@�� �@�(�ªL� �@�� b@�� �@�(�ªL� �@�� b@�� �@�(%ʬ� �@���wz
    @�� �$H�a L� �@��@DXp@lL � �@�@rxX~@�� �@1	
    ؘN!�@�� �	 IU� �@�@}-U};� �@��&`ĕFFX% �@�� �'`!! �@�� Paj2I�9 �@�� �@ 
    UAȸ	� �@�@v+f �@�� �2	eҤ8 �@�� А2<VF\gC� �@��$@(`� �@�@@NaEh � �@�@~x3@�� �@�9	  � �@��$* !�@�� � � �@��$* !�@�� � � �@��$* !�@�� � � �@��$* !�@�� � � �@��$* !�@�� � 07's[U@�� �$G聰J/5A�� �@�
    JVM
    y
    @�� �@QR(R� �@�h(&/*t� �@�(@*Sª� �@�� `&� �@�� �0x%� �@��
    tS#: �@�� ��k
    � �@��J&KqU*,!�@�� �$Fdª!g� �@��#஥'$0[c[� �@��@\6@Mmk;yrgXu-KVymOG?�" �C	ٹs,[L^:{^~r, �@h޿),^xY/]<NR[
    d9?VUcŻλ@X}CLdž� JV� �,B}aʾy:G� �@��n;k
    #X6@~eN �@`	#p
    POӬZ葦}@�5FP@ӥnAa. �#^[qk>i\FEO]X!m@�KPae2q� �$`'[2vdVdzvdj!G!�9bU{� Pe4++6d@�� �@`~	8{|֪5Vk>A�@0cUn@�h,}B%� �@��2L|Uk(� �@��#ms:~߶>͖X45VRI^C�� �@�
    OV_>\ӭ7_ʷ톇	�@�� �@1	}~uCO3�? aK
    ۮ(vv
    7gm\|KHUf>_}~7s]+@|H~7{
    E53|wC+{(:\"VΘ*&YF&T!9Iq~k.ʹ̨_ޚX}I1"B?\{$8eA\zho$ǖ PB+o|M_3=𥉉ByBY@^VJB	ΣBm9Fv@?|0WJs4ZIW|E}E?*K_kN<Ө~IWo)rtƱf?]z¢5g_h~$D 
    =υ{G\?ZD+\{o83J+Z'o4%uw#:fiG0%KJ;j?׻ɟSmŷLx&vo|so)2to(_8_Tig~T_76!DBD:kXU=,#7&|_Md]?૩I{ܓk%>O
    0THsBpJ!PǞB?K1>Gkkÿ):2;'O~U~w$l[]55,S+Nj]e68JKIB<BǶ\[U*PgL&$UB,qyeKo#NZfcߒ?si]˥W[k	sY/j4s	yb=dx}᫗/%
    @!	
    0u=Goc!V\ɺfyU͂Q	VZ+
    $<5=E b=~Y]7O]/i_>;#܅dfftq.ھ_o-	Q]%֗O-P{mr{9T `.i浓eUb
    y
    fb)0_柳TUƔۙ)_�n46
    kO}OU{Fn6y.M===soܹsrEykfߦ{{@�� �@&}Sȭ*7p,YD7\(����IENDB`��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/manual/images/chapters/appenders/�����������������������������������������������0000755�0001750�0001750�00000000000�12203357067�022425� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/manual/images/chapters/appenders/smtpAppender1.jpg������������������������������0000644�0001750�0001750�00000671637�12143164146�025673� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������JFIF��H�H��>Photoshop 3.0�8BIM������H�����H����8BIM
    ��������x8BIM��������8BIM�����	���������8BIM
    �������8BIM'�����
    ��������8BIM�����H�/ff��lff�������/ff���������2����Z���������5����-��������8BIM�����p����������������8BIM�������8BIM���������8BIM����������@��@����8BIM���������8BIM�����y�������������3������S�a�n�s� �t�i�t�r�e�-�2����������������������������������3����������������������������������8BIM������8BIM��������8BIM����O������p���.��P��<`��3���JFIF��H�H���Adobe�d�����			
    
    
    
    ��.�p"���?����������	
    ���������	
    �3�!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw�5�!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw���?�S##nkvdE}Z͍ɱֵ9�"9h5�Ar"7zѹ�t{-}9c1h_]/vL:s=m_}1WHu6&a%��5{'ĹB3+&qf/!o[VGkyoswk)Zm^*fM{ܶq_~_b3̲)t̆hZUo_jύ[W93ݣҜxkg}Zlݵ:ƻzcYY_Ϩyl	[S~F˟m6�t-ǽU_�-"Qm>
    
    ?p۬V�5UƏחk۵4V{8y[�yƿS}[];qc4-kswc6#}kѰDz57uAe�H(X?wxo:XX�ޥ�5.gzw6'm~'zߡ;u׶FHNM}OSϠg�zrw�Q���upllmx[H9/9XͤӡhsD;3J_+2#�9?K�!?<?L\lc75i?F#gXfKR펮5z{vK{vIl:?7u4à{i#oE?9H$]$9|xPcu~~66_MVqp#{hO~a~;0kumk*{*Շ%5�:8?ene}
    �Jѕϣc4�L�_a?/4GA8	{Ǽurk|{^D;1q03phic;POŀh3|�M�9oOd�3O;O��L|lmgilcx`ƵO
    ]궹q$:.D>ݻ7�ۉd7s�huKm$m}o[s??S�m0c{4_�/5_p(ys*֒=0,Z1Gծ
    ,na{r*/UM
    �em}?o٬�I[?àLMĐGQSJΛҰ.gI/G;\_ͫe.!Mߦr*	6Aqٹ�6?(wpx2oOnmn�_#)JfLx)Wd>_-P_�Q,QŠz\�Y%0t{t;s�W�
    ~ewk}�ܷ�ImfI}ƻvgnwRH%=Wq;n']cK��=;qn+�0wpk=2Oy
    Py}&�S9xM[sMKEUMoՏӯG2��o*(>�.#yI�5\jS�3"<MUA[&l-�IVfMNOݷ/wQͧokm>eL?6?ne\dk99w�1봖$�	ޟ;��ZUnDm4۴o/gOz95�K�#XAA=f/.-6l�GKkĶ0uLk�K&zعw3AoF�2$i?ѸMٿnܯޏK}�Uy9� zA!�?A�!el~}�76{m4oWonhzFe3ݙ{~'	c�|6rAy없c�KEuaoM~>?C�hssvoou3�GS^ngAwnI3[׻rv�k;~ܿW͟�礸O1�U<+d$\o3//"�G;~qhzf@54v'/NO|X�(�8BIM!�����}�������A�d�o�b�e� �P�h�o�t�o�s�h�o�p� �E�l�e�m�e�n�t�s����A�d�o�b�e� �P�h�o�t�o�s�h�o�p� �E�l�e�m�e�n�t�s� �1�.�0�.�1����8BIM�����������Adobe�d@������3���]�������������	
    ������������	�
    �	u!"�1A2#	QBa$3Rqb%C&4r
    5'S6DTsEF7Gc(UVWdte)8fu*9:HIJXYZghijvwxyz�m!1�"AQ2aqB#Rb3	$Cr4%ScD&5T6Ed'
    sFtUeuV7)(GWf8vgwHXhx9IYiy*:JZjz���?�'*c|
    ˹&g:nsMյU[od6	t[SrfۼPa3er/TQ[QGK^qiKO7ȞrveaOrZnTO<,Oq3QȖ+,H-#]1$+<,=qcYn\jچ(]bw!fjE(i{r$c]m$$7)U$T0sGK;U$zw2T^ޣ�Պ*%
    njbYz ?$iq[tۉ�{I
    ~^.uoWY?v@޷*C�=�ca�Mo}gW�=_zܿ�{�~�8m:�@G߸��e/�@;?׿n�Y?~/)i�߰�!~vή�'�F{(K�={Nq۶�uw83߿qE�G_w?ݷ�>	ў/=n_R�^ӽ�a�C{6]�N#Qr��zm�Ϭqg~[״�?^�Mo}gW�=_zܿ�{�~�8m:�@G߸��e/�@;?׿n�Y?~/)i�߰�!~vή�'�F{(K�={Nq۶�uw83߿qE�G_w?ݷ�>	ў/=n_R�^ӽ�a�C{6]�N#Qr��zm�Ϭqg~[״�?^�Mo}gW�=_zܿ�{�~�8m:�@G߸��e/�@;?׿n�Y?~/)i�߰�!~vή�'�F{(K�={Nq۶�uw83߿qE�G_w?ݷ�>	ў/=n_R�^ӽ�a�C{6]�N#Qr��zm�Ϭqg~[״�?^�Mo}gW�=_zܿ�{�~�8m:�@G߸��e/�@;?׿n�Y?~/)i�߰�!~uw�K{آ�K�={Nqq:�@/{ܩ�GʟoFq�ug_߹S{?m�Ϭ0߿rO*u?׿ӎ�Y՟a߿~O=T�7?�>?�׿~ʟ{?�״o�?^�N;o}gV�~?S�h?ߐ�!~vά�#�^*t��7^Ѿ!�C{8Y�FT��eOn|�~C�8q:�@/{ܩ�Gʟ{Fq�ug_߹S{?m�Ϭ0߿rO*u?׿ӎ�Y՟a߿~O=T�7?�>?�׿~ʟ{?�״o�?^�N;o}gV�~?S�h?ߐ�!~vά�#�^*t��7^Ѿ!�C{8Y�FT��eOn|�~C�8q:�@/{ܩ�Gʟ{Fq�ug_߹S{?m�Ϭ0߿rO*u?׿ӎ�Y՟a߿~O=T�7?�>?�׿~ʟ{?�״o�?^�N;o}gV�~?S�h?ߐ�!~vά�#�^*t��7^Ѿ!�C{8Y�FT��eOn|�~C�8q:�@/{ܩ�Gʟ{Fq�ug_߹S{?m�Ϭ0߿rO*u?׿ӎ�Y՟a߿~O=T�7?'ͺê@lEpzknu��@o{8�?]�>Ǫ�ۗx{E�8^�M{}T�
    �/)?^q��G;O;n_R_{7m=S�6'vvܿ�{޿/:nz�@lO߸?I�:_uݷO؟?߿qr��@uz(oϱ?~��e'Q1׿v�c?b�~i�GmO׼=�c�>Ǫ�ۗx{E�8^�M{}T�
    �/)?^q��G;O;n_R_{7m=S�6'vvܿ�{޿/:nz�@lO߸?I�:_uݷO؟?߿qr��@uz(oϱ?~��e'Q1׿v�c?b�~i�GmO׼=�c�>Ǫ�ۗx{E�8^�M{}T�
    �/)?^q��G;O;n_R_{7m=S�6'vvܿ�{޿/:nz�@lO߸?I�:_uݷO؟?߿qr��@uz(BAˣ:tnô66z̦c5Wp[{T^}s5+rv6|͸mʺy$fw:R8'i]$yT^_b#kh`M4"*쨈,ʪ8џԎuOŠg_ԕ%B
    Rn<}6^d?7>!dzv�k6ӹ�]/(`5[,>t*'�O>e'>�=4}(ZO)mivovbn:
     ׷lݛ~۱U4Y_
    K",B	ξ윿E:2lۍ>主_-`R8H/B]7mcnVAԖg$ .k^/9+?V$ٖo_*yoasI�1ṡ?G/s8��m@o}޲OK_Y)١'6-MۛWޙm˹s.?MS[Y;$PD:{qO=vi}%iڣ+q,	
    /!]</$sԎ;wsQGA7Tusw:TR[);)`jGjMr<t7ժzrB1Ce}wsmp͹{iҕԉr~OF{owl
    Q}Fˏˡ_)֒K$]0cp?�bTZ�ly=1qK0jʞ_AkomgbÄs?ZO~8Uyz6;p29jc^	',Q<#�7/9i~Ud	=nr\$`Pku,E(̼1mhؤqh8*@s+jNωxoYv^dۛdS�
    +7!z'vtk0Ś)h)qtyLW>l]{oO(a]Mz8�XdB˹nR[w)B^WH|M�.J曩9Y!.-uѕi1OТݻQMݙ`^UVEQ}TXagj08ŗX1TCCK-ZP
    HGGǷ܃U//lCyi%HT/2)Jʽenmn]_
    n]kcu{
    ;B.](3vg{;|oZ<X9.l!CSUpC=XiL|=>~߻sW0s3G;h],Sml�췑b5*<$!^B`q�o]D
    1Y@ZVёPRZ[{gQ휖iG51dQkbi
    etT+;x8:yUHKoW34oٺ놷*;IFddRjݭW`y^q%}HKpI*J1|YGn?ǮlcvGem]<Ͱzy!UM.GwIFHeW + ~>U,h]mn4P^[*SsHಕA ?,.gq{ݔLDCΈʤ)Eߌ?&zktc@bA7n:suWH+1{
    缶RUVҚ<ZC:U<r:Ex^M�p{ewu{Cp{ehQY!#@$.ԎXy7r?lo~"XaGka̅FvXgJ.;!֧:3+y`nأ-S֢_UTL37?r2L]9R/5j})OWFWA*=#~ghEяԈ%6V*	Xc9yύ#6^Sv�{{1[;IΩXnƢM޵}>+rFcXgBϭn͏|'(msbK,Mek,dMQm`i4)]ԛ,1lX
    IO
    Ĭ2j]
    i&ʾ=OSoո6?af+}Y
    \d;[EV%l:jGdW$=}hgɭ..'ޚCww]>vNѸE9wbf[ǂ(cAq
    i
    
    uqCOBw>Sf%íq[+wF5vu6
    ]łĢI+`~z}imw;4\{7oxk<Ĥp2|){ٿNLv5Qr5Orͺkm3FDZ/zw2޹5q}p?PczNݛnUM|ri6NƮmCzel,O<}~|"|$Knn	T%4r4klxʲ"TV_mK݅\fHT%j%f:dhkd}٘並{Sl1u9mɜnwI]Yd+fjT;yojl#oneU$Ɛ#ZIÍ##ЀZ�.}|3ݵH9U%˸
    !iFV?�2Gɩ*2>GUvLQ	&4hd[\83{"(ƈ](ǢSBhh0z:4h9#x.YGՔR#פ/|w.={llSoǵ}na)3XM˗j,"jjxFT2q{m[={)-3E,JJ$1*ʎʐzAe|׸]mgo#$Go3nIP2+TH||[ؿz){#'\ynzʽ0Samڵ;fVYvzSM\a`ap>ټ՞m
    k#\K{ru)<\HwQx2T
    i%򷳳MMess! #KȦ#!eXXw=	Ք}[\H˷i7t`90c#I1Ao9V7sw7>s?s\%Ⱆ܈̚d́&KR<9f{u.atQf@)%jZCfW\[eo/{;+~{3b/Exڰm/}o|MS1IhTKQf&幡HwQq%GKVkx3Ka!TWyf-N}eu\!n$rQi#HK*/G\yv/4fUT/_n-
    az1UxAr{sɲ{?hyt&FSY�Fjۉ.*�c \;lQ^PČ$̐O=䔽wٝ	3(Cxcf2_s7ܛcaQMS쭝E]MIC-�]W^p|\˻]cM8V\4V4EUM.Nm[-QNn]|R!+GXB> 2v�?3su&}͖m֛7'vf[톂M.X/a>U>b#_y.-LQƍ$C~AQ)9AH'j.k7Ԟ
    |m6uLZ9ʑlɪ6J4��{o
    guWՁ.6(_Y7vgƶN3m<O%~̹GgRN>>m�wQcvn',Χ± E.>]ѦiLFU##\`hB
    ޳QG2ԝO_wJ܆['&n?kdi+kz:f
    u+-y/nomxFy<
    Py'&`dIh1vlt9~"b}7!Ŕ2TnŸVdh*To_U_=ʼ;mG:E<p+p-T)|D7CcȻo<eIV9<Si+qw-kܖku!q#DѢHeôQ�N3!~'i}ݸ͍]QmiU8tÅ$<:Vuwn
    >>7%Oo)/Kx"=/)sdV{ܳq•)JIQ}'^wg|t0vVNx#[:#A[#%.2*դ	2:@ZNKM6b]i.&j%J
    64fEa3KM>^l9Xl76[O(7pkb+eV $i]N:(wE_VNm6?;kov.]={ܹ-zeZ1	Fr{.֛eػ2 S.Ĉ>x'Nz˵nplOc/0Bᘂ-K>[3/s޻s{	۲+ڻ/{�w.?fխs4x|U5RA"SHU{na?.Z:$QZ/+q(GeDW`]UA$o-vVܣgVhkiYw
    *M�+}-=/{+zY+qX{bd2tp$x=ъTVi#VE,<fΖ|nkaDcRp@4hzE;/ye40JIF:{�=?g>.~?q{Gٷ>M�RgN>O]~=</կOVs;2=uhîjx㧚ύ_"؝tuPW#q_M쌶�aF|
    Q\D稗%l"!>yqwX[%ėIg{Kf`
    (E$tNS渠.em^%so0Y`L+(Rt~QIӫS_~?fɷ'ta}MSShwm|4O\)*hKL}v#-.9d\syJ.1(<_10EYÒCf1|2xZ5aBtkQN6wX>n9{ltxmA|^O
    YM=rA4Mx*/ovfxl[I./mKQKwEYT7g2Ň*N5{ţbFe	*FP%XPh�xM?A~aڏGw;S{?;_Wݛ؝]lv-׻r?"yxF
    ,~’N"O'@{rV~ng&F9fKeErFZh\́Pʞ./]s|w0!辢9Q"iYasQG@)fT�0?(?vT?b>4On;;!/p캪M:/}c=ypgj2OFTR5\]}[�{?\csD/FZ[[[I594H%P[/&snD$244$J6ezR0G+9.<5?cU:qT=UʜT4[[jTQ슭ɓCOALҽdwvrV|Ӷ.𒵂,o;YrnVìFAwWdDd%s!	PIHS{ba~2o&߇|_L>Cuwn*;bݛvm͗۲nl%$[K԰$Wio}!ĦD@)4922)vbFW:IDx^?eM@kPYjzM`>=ߙޫ!ۓVGsuc~m}0Wgv;
    Qqte)Yj)Hڢ WțVc[96ܱtKyoW F`UQ!hۖyslzm-$	o+L(	x�+te~E�/_? >0/?e똷>հ�^}AQmmwsE5MeY%4}r'=m>sFr;c5=&7x䡉$`ek@>g9K`c-D5wrSV*UK?3Swuԗ1O;lum>Źn+W˃sBj*#4."ܿ%l,o<ݵs-،i5\&	$YdQCPcZQ.]o~{>a$#D8yUJ!HvJƋɿ=dtog:>0tw}ڴOa?Q7U_QI&:imG#$]퇿\/5{5{'0mZ=Oq{^CX
    eJ(ߜOO#2웖ʐ:.;2=6[םq/)gwcz׻ksy\wm͛޻Gbf蠣xںN"(o_2|k˶^~5DAW3ZS5(=Ca>�OWطs[-NUx]
    ID[RB҂�
    OyaWֽA5jl
    AջrCz7<hbhhjŵ奯F7-d;H�vI6;'ޞ
    $VR37f
    @mmJymYobuO%rF6~lԛ:o;k_r/5=Q{k3{mL) _+Q>ߛy?涏vKxJ?JxBk�6yf|{K9	�HIde,I%u55@o״}oj>{@߼&�}z״}oj>{@߼&�}z״}oj>{@߼&�}z״}oj>{@߼&�}z״}oj>{@߼&�}z״}oj>{@߼&�}z״}oj>{@߼&�}z3�%�x�F__3�K3߼
    g�k�%�{X3�5��~~{�o�F{?a�?^?~?�=߰�k`�?^[�ўo׵?xs_-�~7??׼g9�gxc3�K3߼
    g�k�%�{X3�5��~~{�o�F{?a�?^?~?�=߰�k`�?^[�ўo׵?xs_-�~7??׼g9�gxc3�K3߼
    g�k�%�{X3�5��~~{�o�F{?a�?^?~?�=߰�k`�?^[�ўo׵?;XY6SLmAlVY~g@H:)$r#
    3lMګ&F8|s^oeM�G=w۝_UYW]O
    .iЁ~~~{r)C0I#QqǩOw	2JiDc{vOp]N"Ho{9rn{fmA}kus-ҿ/^wKwnf#)7+C9
    X=S+,)fOQ
    o[
    tWynQC�:~CKEs|hg\Χ?oV'${bv^szy7_n蘒bvQn8EmL$s"|^_C}ob
    ifHDԗY7kv
    |$Ae]$u!\XYmmd"*UiIpVAJ8#&�V.N+;Ovf>L,]XNQ*ˬ?ώihjK2c|pqy.P۶oĞ$+-uRQ:[DKޮ/,.n"t8T05 m;18V�3jDdO
    y~,>(Vf�_'~w_tZ=ګ\ճ9=ugv(}0� @]c!р7n[Z.ίle{q|KZH4KABb0ԔK[],5Dx!J*q3rk0oF&{IB]�4g݃mӚ_zh武3<qXw;WEx㑓I4;"S13{X-ؙ^[_ż.ߵV;}ôi7da$PfH+`ݵvݎVgy{{{Uy誯8DCjuiy,&oh#}VgovHlXlͲ	�wUh4c%:``a!
    }@W*B3w36z{}Ts%	=|J+ot~ΟQ:Ѥ^l3&Юn{hdk|m.|^LE|sQe1kBjieV="Z{ɜWCkYI4*ZX0ឹ!w2?w3^6VVPG*)-C?ڪ~c|"
    gunܴt8߻Wen-$mb*$cO/Oݳ,l{sŴ39nTEt-\G<q(aiR
    ӧ^=޷dK;ibU
    TU̦)#*e�@Ff*{{7̢[2vڞ<XvYMՍG\m<IxA/7[^s˱Y;x3R5ɇJ:�B(`H}&&yN%"V2uji]e7M5#|(\˾>%/^~Yje>ص]$Mͷ0Y
    N}3q%Z镠ȯ/m×=Wfugvm顚+Cʑ~,\Jmr_\{O\g"r3m3M$PۺٚHh"Udî|B)Nx[ll�~Ta's{{7
    WFWhf1]̴an<t4WnmϽ~6r4H-%#
    cuR"YCf\o֛UJGI
    `x@oNa]ה�oݹ{i3�17~,�ov|m_il\:S>VSSJ(B~{Alז7MrtR(\ǷF"G1Y Gaw+{U۸fE]@VIYRAa%7YfJBo}u=_𝿊}=hyo&қ_huV59>~T&qQG!JOp=ͻyAM]՚K8m]FDEH	Y݈/y[F9nUjݴD@hy�fP9)
    :[x;*t$-7eKT?ps1]7ns1m2#qOnއwP؃%{
    yiVc.wW0s-x7WI S5WHdi-!	qrǾ~~\~ꏗjNVYY䀈"KEC!R5w΍Cao0k쟅wK|heՕMUs+an"*䍣dmϳ[.@Vk\5xnR;XmCknDH?w=ݛi?;xf4fhi5tH"i
    #0G	.#gaT]O~:wmw^>@dwzva3si툆Kbga1U	oKJaqvܧ)8vUBZ]*F/
    50ī=m{fΖ65ɺ3ʮ$HB+mDRDo#�Rt^?�"ٷ~c_vW~~YM
    M.MS�vd*SP[oܓ=W[@Ϻi-[uţxB2IxZS32,0`HHIsl%:Bib.I/#M-I%X@c,KIdY?y>_9~\VKm3Ey|mXcå˭R$kqˀ{iO&O~
    9Hĵ]1RrP$_zyo-uJ
    (x&
    r(2	#ơoM߷%rn{{$~_
    0{Ug0S`39<*Hbv7\ra-6]_kueoѤnn%Xf[{<HDSBTqD[G\g0wr[x]ΚƄDbWvh(/EO}+?eß6̢ٟp^DŽXޢ%5e͈ː)%dJHb>r\W-	eDxȩIo:2`6u/mk;G4o	2ũVu*(gňHQBՔWg=?Gzww�{{;6.n33	ltoq
    ǸtË>9OAIizEuo8{UŔ?O%ͱ7W{LMm$alee&i9:H͏s{|;[\ڞmynHko%tenxVON:_}彺[|@uUיu[H:f>-(wLv٫;(+E]50z>"{S{%m{ݮϽKX4Q4fwSE":+|kM8~l<.u6B ao
    Y#+jĊIcA_t;;_hu�lnNK=,na豘:jIhrR{w=r76[봋0MQlvs$qT+3e[$b:2[\/mrw.7t2]$jOAl[ugݵzg0ؼ!}]f;Twml~@nM˹*fg8,B_bps6o>-]I#2m<hJDs"tr6CfiP<&+dJx]>CwL?d{u�;66>=;;Uzulm퐐\nS<Ux餜={nX?�*Oek-K'4&A)RhH˲Ԅ:C7>Q6dvm-6 6cLI=aSE$
    6îtcur?ofqTm_nmls~WϘ922J*_o|sN˿muk[R}鬥H4"T8 v!$WY?m]w}sTݦ -KnE**ђY4J	/�NL|v�_T6|a:[7s#2e<|'/H28ғ6.ho_toW cno%GpB	cK
    G-m;F Y:4#$~+s;v)!$RO4vGdtv�lY:SUTN8: {C1o	YӊMۻz|&
    XC%NF:&DY{gzoiy6mzG㰼mL䮳mQBx+>_+e~b&2x(̲DӰEO(
    )!X
    ~Ta>sm	Q|m&ܸ~<N܇iŜ[ov0ωfU\~ٿc6({z5;v<(#ZGticGa]5"Cwopkx7E絎FW(&[w@!\*i�Uw&>ݟ˫zN|-ёەT5U;|f?	**f؟m�>�;.So۝aK{	m-㰍6UI*Z	KmD
    f`oknZk[3`neJѺOÚ/|=T~�+&AGEXmظɶ>wpQU{9
    ~.u*G6a}/lln/?vøW\\^Z-Cc{+,mx_۫>yg[x{hXa'Vͤo
    m(JI#2m<+ǩ>AtT#}bY;kzCblz2["M~W
    GHq<G&pssY6_ra$ʖC=ckKwԪ.![[.4mNh+O|wz7>NLokW6oV#@Ca|;Vm?lfi~ Sw1?]_w.ө:	t5KeGch*|e~<͵GsAw<כ^d4NKM*ez+Lu^{XۄI>׺\;[+ķ*FE;P\j@5N=ޘYxo
    '-~CG8e�Wz9w^,>WvVAIEE%Tp3F{k͜,>˰jʱR[XC
    ިuk&X䐳Kԇ9S,y6bܢeDHJWKfZ=q�0Qd2vwُi>
    ^g2\sfma:8+A3;vrIZo.s{�<y�m;I
    7̞:lۡ6Rڭ
    0dIW{=m=ϖ̈́W
    4O3,kZA1]i*4І |�M7oOg^/iAvOpt�n6OIE7ؙ:jr~&*`ugVeP7m?ž*[06#}>}ZW>'L<?zݮ[3sR6ͷa4.Le%f)cDgU-	H%`|Ŭk=gJ{ބ+W;vfJ/͞7_lCxm|/bV<8ZzjZB	sgvja/^;vC8xFܫ^GDfQʳ/.Zn[&ٸ2[DKRHuPƭtp`mؘo
    vW[nݿ.cv`6Coѐ<|�/uUxZu+j5CwOrk)Ͱn;фr9ud
    3)=Mq
    yZ}4XCQChm5):˭;+cIw3vO[{o:v
    hpoۻও"R6Na	˺org4r�$Ic1Zq߬V<Pi-"+1k*i@Mmsԗ[ݡGIm11'J:M]0H)v~˦3߶s_fqqTm_nm*\umAmhI&F[5lv%~[[뤆f_*1]uE	0m\;/x"S}ђY((&&+?�9Opɴ`ڕ;pQѻctbmZmܛ/=no7MNQPKPJ"/1{y+h{f[&xќA\KtJ1Hujr3{λ'.;0+kF!xc,UN2Hnʊ}ӆ�%ݻcw{K\zuЮ{[=Ʀz1[7jhY_cu=.mϺ׼d{ce]ZXBkyDQ┪Rrysg1ny}K%	4R;#5b)~#|΃l\]BQ|Su&J=*
    )*Y+co&{7$݋yKב`7+qj7niLs%bp+x	k{7ڝ}-ߙ~Ctu^2-n'%H
    ?�Cwήޙ/]Sw6kp,Oٜ_wfoloCc޵Kdf)Ͷ*)rGI-R̋#}۬~6\߻`ݣ!pLw0@dK
    RTUqzmm
    ,Y=KnہdG6Y`Q!E߿.4wf�:Yl/i;·odv�Zfv8];竃oWckhYU3
    cܛG_vØ}eb?x"KVkK"xe[K.u3ʂ#H#õ9nd#iWX#] KUim$*"_
    c> Wв>(^mGu>z/Vvgqu>霖"z|yː]Ur-ZK:zHWmr,n7>^x{6]X.ڷPܬoễ"\XHw~{M>�>9+$NM,<7%D#WzUorn�=-yY/Seڻ'+2voud!*U$fO({̶~{s/)Iuɻgm=ǁ9-n.&hu	a	u	C1{s[oy- 	a)Zh&Hh	T,$i4J{B92~8:|f6p7�&'+[ۯ{=z2atv<gr31c2ON?SnmeOvlanW�$$2Hc41-eW[ykK	9ܹco\:A"'kyJ+U"`ݽõ{'w3M-k;1̸*v'vOֶl'A1ܔ~V('(5{>۷!=E6 HaI[ {D.Go"okZ^p.,\0'DRԖsηPnjydr{+lci7
    .\L[&dzZ<1R~E<R˗ⶵkToo
    ȂHDq̠,i4q염kqo_
    E\ZֿSU�WDrQcN[GUO{^G+m}ػhgۢ0vZijI8*2˛,{/s-eE�x䎪xB0A*ŒN׺{͸uK4m8x}<U*PhjjhA?Y�_=QGub�x�'uC�Y�_=O߾�W׿�{׿}S˯ue�S|?˯~_^/^=O.՗L_߼?�.z~]{/?x0	]{?V_1~`ub�x�'uC�Y�_=O߾�W׿�{׿}S˯ue�S|?˯~_^/^=O.՗L_߼?�.z~]`;fPH"R>mn@OWӏ?̿ͿR�~__׿2�6�K�G{[G}�7^�/Mmzg{/sow}5i߾Wu̿ͿR�~__׿2�6�K�G{[G}�7^�/Mmzg{/sow}5i߾Wu̿ͿR�~__׿2�6�K�G{[G}�7^�/Mmzg{/sow}5i߾Wu̿ͿR�~__׿2�6�K�G{[G}�7^�/Mmzg{/sow}5i߾Wu̿ͿR�~__׿2�6�K�G{[G}�7^�/Mmzg{/sow}5i߾Wu̿ͿR�~__׿2�6�K�G{[G}�7GK0mig-/=U�|m\/ލd_GCN~`~KmC[�C`�~靛_v'oWŜ;jml.f	}əU'Eo:i>lCES.Np|dy�r\Y{kϸrtf/XY+m.m؍3Qk
    UTwQmGY|}k0"G*v	B-&+<8
    q%Wֻs}vM7U]vY^sdkc)جrx(uj*6Y#k>E̛)2mv&^E8%7D)uR%P
    H�ĮeId`BKQ
    I^�|}/"+G6U`�ӸX_xR_^�X[yk¾NURN=ܵ[wS|-_:l۟$N
    }כsPd$ڟNޟڪKG_UuUO'7<\'[Γ[ϲREw^].7x&h,FR1Rg͇eޖ>q�FYcԯ18>h*9q~=]bv*61xv7i;Oz֮'[[YVt(b2(9/n}=/}~_ڭ!rI$YosN,/oUQV�3
    )=DXYrv÷s{}<.'n Mյ,ZbB+�`:?]͟jNȱ&W4)9`}/@7r!';Q?ϯ?;(*ڏM%Nr0Q>Jnۉ|\߬19:|KemLT\i^R
    =y"h+mK{},…-UY}ٽݹMf8ٓcZlx$i
    la?}4{q	r�0|^[-
    wbqپfgMysCFxEyj݆SO\rs#+Hر' $gFxN|mu[Ag8YlkiU⾆+iWT@nI [x
    S쵱=nE-fG~OKXGbåi7>Y�q\p=|lm{?)s+W	g=?Ҭ�~\ٕhmڕco?Kǿw^j寪940MRiYb{3yC,^��ͬ3mo0]"x:WWn-NY{O~3^3pcXjT'P3թQQ$Z܎x#Էib5W:E7?	iٖUzʏ_5A�[7WjkJ{/?�OHU_m�m=@K�4mKU2:{eE�P}@�%_�N/%Z6·o�GX�?L=~:�;Pd�~�l=_txOk�m{W�%I��m~�pd�~�l=otʟ:q+纳y7g^Tnߔ}5#{c.Pm
    )3ߑ{?nrqhizv!7`y{"n~ön1]Sȫb%I]:cFfB-0휿H[vEjOhMcWP3,H#
    OMG*Om`�ƒ'/a;�W_dOk�mw�
    +��߽_2ܿr��_?eOk�mu�
    -?��׿_�ƒ'/a%�FT�׿᥿T=~:�<>?O_ֿKG�9K5ĩ?zu�x}?_[�//2'��i�r�kߏ8'/a'��
    1oR'_?_^�+?2'��
    /I��m{�2ܿr��W_dOk�mu�
    1oR'O?_^�+/2'��jR�k߿�BOk�mtO_r�k޿�B�"{_h?;.Om{_u(Rܿs��W_dOk�m{g�%��m~��
    O�JO�9L�4Ĺ?z|v�yI�r:	>�ё?=u4N?)r�k߿�Bu}�"{Oh_;.Om{u(Rܿs��OdOk�mu�
    7$��׽\
    O׿IO�9?�ᦿw\=>;=~P�~�l{t�ȟ:4M�L�Go^�o�
    /�탯Oi�mu�
    7$��׿[�‡'?`${�FD�׿�od=>;�=P�~�l{u?ȟ:s&I��mz��O׿HP?=ui�x'?�}o9?_�Z�'?2'��
    ;?$��Ͻ�[�‡'?`g'�o7ʐ~&IcoO7lYR	
    C�R:	>=uc�%?xq�>�d�2�{Oh?'._?k{uo�
    z	>_i�m=u�
    3G\<~8�?>��dIXٗsO^�ir��[߿�@7Oa$�Fe�׿G\<~9?>�P$�
    z	c/��
    5?��W�'n׿I_�9?M4Ĺxr�~տI�d=_i�m=u�
    5?%��V�'n׿H_�9?M�4xr�_}տI�rz	�љ=4G�L�G/�[�
    A�[�2��
    7�%��V�'_a${�FU�׿?7d<>9?Pd�~�l={u�ʿz4F�L�G/��W�
    /퇯WsO^�h��[߿��A=�*�{Oii�x/_NT�ƒ'_`#�FU�׿)�M�G?ھ�'�AuG`z4F�L�W޿?uO(2ܿu�~;*�{Oiql<>9�8S�
    /탯WsO]O4Q�r/}NT�ƒ'_`#�FU�Oi6_�j�
    Oև݃e_(��
    ??e��P�~�loov?ʿQi�m={&��m_~�}�I�r:qʿQi�m=u�
    ??e��_P�~�l{ovx_(��
    ??e��_P�~�l{ov?ʿQi�m={}?M�G?ھ�'Bu}�"�E? M��j�
    O׿Fg�e׿?'l;:8K�
    /탯+i�=GP41�r/�}N	Q�…'_`#{�FU�OiT_"~.g~���rzp}=ՠ+�5?ᨿO_O�NS�‰'˷_a"{�Fi�m]{�%�t�;޿u!�On׿DS�Zں5H�K��w>_Q$�v�l=oOu?�U??Gg?�N	R�‰'˷_a�kOjԟ �ܦs�;޿u�On׿CW�^ں5H�K��w�rz~�џZW^�h�_S?9w�poY?]�^�_3�{OjR4q�r��l~�}�rz~�џW]Kg?N
    P�‹'˷_a!?W��
    Kѿ?9x�pY?]^�_3�{OjԿ3�cǏ�'ܻv�>~?W��
    Kѿ?9x�pY?]^�^�꽟ujo?S?9x�_pY?]^�_3�{?j5?E�M��w>�Qd�v�l={/u�U�h3�cǏ�'�F۷�?W��h<8O?�
    4.ݿ퇭��꽟uj�x��l~�}�I�rz^џ�W^�h<�8O;�
    4.ݿ퇯�꽟uj�x��l~�}ӿI�rz^џ�W]T�4A�r��l~�ӿI�rz>ћ�W]U4?_f+�On׿A_^ں'}|y�poi?]^�o3{?jCoz/ݸ
    π;bo͡}n;'U7X^硦\_A(ꠊdsWu[Dnͽ[]Z",;GÒX%XeI"7H~rfۦ۱A(&Xf&*9oDpQ]YAB5oUU 9d{?v+-?L>{ˤG˥�_\T�&Orpd{1M52#}H${VzDj><#"
    Ty(h "Hfo}# R o٫{⯰>
    jÃhSn>8-=omՉS{箷~�Ee+pY|qüP=<y߹;?^F}\[n~`'%'82#V{^rܼ?s.m
    2Eѓ>2c:LCl͟`-z}2N=/KXk�FOzht՟Ao6⨦�::7ػʗOG[>/
    ㎞cTh*$.-~>*/B$CC-*qaOGVt?iݷ.mȮ) GdaMKP#TïOσ&;zojdh;{6]EgsJ}aGP|GPGcr_mO%E,RmO5_ڎ][K)6=HtiY6Ċ2 }u�7mx1.9,XQ|RIp*z}�d �'?-;ŗa?̉M#0qAW7
    zɘ?CK.�m._Kz\|uù]>Gպ>lFMv?>sfţةM
    SSHa\A6|i}{a:ʐEKm#!cM&u%D
    (j*:%O$j%MME**>q|>IήXh2֧|E4qXo5ܟT1Yq
    �^!)<^'ok/&?0V\}]caS
    A-ot;o_�;�/$�ߒ~
    ڟwj{�5?=l}OIvTt_$+6qvvm|7c~M3{1+@#goAEMO(ㄹ;q(@sN
    �;	н�ǻW:?v�dSua~ڟv(eVsY m̾?Uxuoٱp}=s7/aucz6G-	jj|x+)AU k[
    ��ꮓ鍥ǾIvWnl.F
    �_қSzg7>cWGނU;Q	sh<=�zc7GmM[[z߈On|B.m"G]t.cpCv_fYےf0y)v}=6Yi0ԟ?^`ߎ+7
    [oP;w.�x.ڴI=ޝGMIq5nrRAu՛)::#=ЃPz
    [;ltF}Ab3IOqՙG;",SL^}VVU Q%<3t׭$=.nf|&#zc?|Yɧߵ{
    dmn\_f8zDץO
    ͱG.\:-]ay|nn
    Q]G|u
    VU
    tI*+xԥ+г;cpw^#9̮Sm]1<_mzMgꭗxh0lҝyz}Gž}ngl`q~OmSCm/3oM?em9Brs,OlwևI_S:j_?ڽ[$g
    1ۢkA?v_ag9<{g7DCPViD㭐i#~]hoރR[|aΏk݉2�]6^xw+io>k;F!t6/vFNM=^3S=<?݌AujTub89߻OGgdfzvM&]iEzm
    U6Ie]4Z6W"+׼Ga�.�ӿ'�wO?�Scϡg
    ;u{_Rg;bV?cplY۩ܛ(3M8#+Fȩ::	6ς;cvf_w7[u'O+vӹ_ܼb�-ٍU8SIC%QMF6"5Nxe6lm7&ylncvOnMTUs&*:Y$IO>҆dC))5˲zw>$|zϲzttcEx/])YWVo;-lINSC#/.b<a7oxL~l]OGgdgm6M&]iEzm
    U6Ie]4Z6W"i|!5?}ԟ%v_?FOkvvqMZWMQPKQ>₽)t^k!}?#6~]I3ڹ=]Ck=;ەbi3xTrLA# Ic-M$qhk]h
    GMnWAzvRWr2t{_7@A)V=I*yki*xw^g.v�ewpꝓ|vgp~2oWV햳~�읳1|y|oSSUU
    UF{ˤV�1O[;7;s^}_-!=ϳv~ڻp5cq^,DgZH�OWy{�|<-oz<:ۏu~}>zNiN|]z''}|G.[u#$W[]o>ׇ]X^=r1׽ӭqQϽ١ǀoOZ"]0ޏZg$ouqDi1Z+l��믨B2O[]\X~ :r=t\k߇Z z^�#Ϯ,AN=h{iJn^O><{^^A2
    pnz^�NGV&wpEOJu#yo3כo> =y]_zg4G+׮8 ׸b,}uִ|iN1hq?g\G_>Ձ^Q֨O]{9�[:y'ߪ4î6>ս:?ޏU>}u�czou.?SCc'ވZu߽p}u~h>F:)&Ŷc91�qSSŒ`4MȲP㿈<p,
    h3K"$pf&4QB.+>o?�~�){5'O~q�r
    m^pC[I8:~.ߊ
    }D%"_t*u&L
    LC^2X8&hk`Q>*WQQbH
    Dg*�_[Em(ʾ`0S̎=^&iz�cV�qSuo_ǾDu�ɺ^c�Đo�\];�Cn&�ߒ~ǵ=;uwY�nV�_wO�=۠?ْmп07^�/�9�fvôwO~8ؿvS:9ʌ6Ft?Z,�GYD*g�.{.O;?Uz;kŽ㺃!Y-Vת.�xQIٻqmŷ
    ո|ۘ;_va0�"Ld n<c_,2?Q$u+~/j<>2sg^Pux3F͓ak;moGeΣsU];ûtvv}ve?Ư;_=[Q]OmUJSb厬<T]'%[|u<GV|3/qWEG[v'Av;w&[gvnz29KEIvST ֱ?oþ7iz{{e͙j}#|.̿VRbwQ?eT{ګra3?qLLU`]xћz�8O[o/!󸗷VvQont7Zo
    ]Zcy%ۙz|rFյ}=C+m׀#F{֝K=Pl.?T>>7?̟W>'hvǮmй^vc~32sQfrSujҝ<_ncTU?'L|}-{f{~FggUmMA쭔z/rݟ#t||^db7�`K{#V[vd7{s~nۓw|mόF_'Y3!&z
    JosS^�_ފSbכk=I$?PͯrqY/ǟݿ7=U[qTQŹvÅ:ހ6܇Os:~~oV`[K.u|󛳺vu6K}_<oF7:u:!IAPzu ?]q5 z{*[Xn-bF�8;m-+"|(Io;7}0=͵26I2-M_ոPt<叕�Ss8>Dl{Wl)=_H~
    p=AG=ۿ.2K9T;xAkgc&]!ָ5[kr;s~^a
    �1۩>lXOM>\b.p1{|H?/883~�|Cr/>ػWeɴq_v^{?vIʃ?{:3]56Wte@+ǯA*5F+�:=y7Q懱#n�'mϟlY��w#T}{\<�Վëѳt
    ո+M1;s~wkۣ[{飨=ߕK1(*2VEV[X�ϺuUsv﯃9'|?/|;oc|g0wNPo7pck*p\.:ݏǢ�s|ܛ6]>Muydf/\+o[ez㳾'U?�B9Y*;9bR`uڤ۞~xT�7[z~#Vߝu񢖧/NǷ>HwN{`oJ%G/=[C==YZl~wڛomfhryl\8jmTp�7[GV!ۭ~CwX簿#̞SvoSmN:;'ͽ]MKpUcphSh
    y:OUsٿ-z=au#]g_`,Kyt{M'juF#d*?qCUЅ4?m=zVQ�,i;okvK^/`~7溯EX[zgr|s!:fK~El|Nx͡_!q6/JW|שǡd|'f1?
    ԳobGlck`{+:i|{w/m'PdwFЫ[(A4YhrSRAn;�}xJu}#RtO^Wyx@r:(\y^y(k:?{ב|^<7^]o˯}�\ֺ蟯z8uߺ]uׇ
    u:O�{Ǯ?Ou׉?>Ď
    I4=oˮ'}�4{zޓ׿}׏ϯ8u[>ǁ}t8#NGWi뢤�O~ꆥ:�ӫNzS8S֫_u:龟q~c_{SϮ
    z?1덴~9|k׏�}Ӂ={^�z*O\-.Jg7+\^'}zu]Z
    +ҽtE^=l믠=
    W	:i^{"t>F:_ހD[߼^&q�OuuNOdu�cMu�D҃>պZ"{ވ:x^h'>Zq>]]k
    
    Z8j\nN[6jh顯OA'zfze4ʬn^eG
    i"8)RJ<zuMpOgn]޵3vק[ᯛ;QWR66&5nO,m}K,0\$iQ8 \iE8D	Dۃ&Ӯ{vV䠫zhjk+0)1TVPĔy/mn�[F+ZP�qHI|:{t�Ua�sWN��ȯ/�ɺNb�Ď�Zu7_ZWϿni_yo'-)ɭ}ZieyÍZVW^]bP?:؏smF2=8?�?]<_YE�{na�F�^=ЧG?7]n}?}Oq�_|�돁־�q9۵}O�[|�#B?7]m?}OkoܞG�O�kon.M?B?�}{Ë?7]ߩ�?ǹ�|hML�Cu�S�ko�g뱑�0S�?զ?1�kzb?�Cum�)?Ǹ?1�kEb�~6?�CuۿzO�C銿7
    _\W�C׏p?c�{oשG߳
    ?<�?Ǹ<!_Z"#S(�vͭ�?	־1S`��W�j\�{otO�Cuūdq�W}־/}�ln_M8Dž־1m_<�[�C??�}xg:
    ٸ�~S�_Ş[~�Aud�/�[�_=M=)i}l�~�ѩD{7
    �kԎ߰]{cy~�,־?o?.]�3O}~:#�zo~�AuѮOcEi^,Gi믾a{�G&dM�Z#߰]tk{b�v:{�G	e:oւM׾�{�Gx�M�Z#�{�G%??�}{J~�Auz�F�^$dGR?o?_}z[�Gx(�ޛ'~~k{^�vz�RI־D&q}/�E?�}[տ`�?]}kS�K}��>#ߵ‘�7kF2߰gk�#߃CO_^:+ſ`�?^}u?�#K|?�}hh߰O}O�G}�Rp?�}oտ`�?^�o�hYM�Z(|ѫ^?߷�[�=[ӌO�Zy]}j߷�4w�h~�־DVt*TO
    �#u7G_Rv?u?
    �#ߵ7G_տ`�?]"Χ�ѡ?D{Zkݕ߰?sڿu?
    �'j{{Wyާ�ѡ?Dq�}{տ`�?^�w�ho>Ҟ$�_^KO�C~�_^:~~j�wſ>�}X돟�{�?Dj�}j/?qچ��O׎Ov?ߟ=?_~~P=�3�hz3�}l2u�<S�ߟ}//џſ߿�3�h~Կ�k�־U??߿�3�hz��_[ѿ`�?]}i�?�3�h~%O4ױZѿ`�?]yN?�'ުmoF_뿸.߿�3�hz���־M7i΃�go>T���}_X_~ҽ�go?ħ?kꠌ�?]yD�~O�'ގWǎ�_^/_�OD?񗴈�S�߿o@7�ћD`�}D|�ZqM-׌��OG��}h=^^ѽ�u?�'߿NDյb[ݠ߿}�rc�{6n�^|*1�O׃go~v躟�Ff�ߥ�)1�O{[y;Ct]O�3~�үT�}l>_뎾��W
    TSxv�?^2v�O�WG�U?_^&?G�37�hu"�$�}l~_'g?u?�+ީ�q?_^$o~/O2�h{9�I�ZcC/Wg�e^D'%$�}WUG{_g�N�їE{ o#־7�?]kŗ�e^D_ڻ;tO�+P-�sc־Һp�/S�L[ڏ7�?\ui#u?��+ނ+;aφweoP~$�}x&/Ğ
    jV��Em�s־|6_?��-OO$o~?��+ߴtOko/o�FN��m:?'k�7�?^f�Ο��E{-:?'kUc?Z3tO��+J�|2oS&_g?#�Rw��hz)ji?̟^@ٟ��+߂Z}|2yYɿQUuN骜'WϿwո߾`
    :$6_"5
    F)-
    8Th<MA0��?SL&�:�MPOð�Bo~*?O
    S?v۫Ǹ?��?ǿ,#���O�&/=?nN8xzƭy:\ci:f$o~v>J{cowj�5l?[_kЏ'oYCNLSy/du]O_ϝ[YMM]MoO/U1b3Qc!+D4$}ZܿrkՎGv~J2\$}՜UǺ;<țuIh_.nF<"]1ѱ
    F	~<{ͩ/'WgѦj
    ASUV5T,f?5Xvjd2ܵr%s᫰w	S;f0'q8t!UKSrMh1NE_BGOyֱ?_~o?_z+_}`)z�}ӯǮ~:8`.G㪨9V[vIMOU[aY]͒1TkWLx覍<<
    pՕ)]HEExE.�h	V>2^J@
    ;S̎gvqG[_jFYW6zYt>Ү2JMP!q݊_YJ[1p+pB+SJm[NeJ	_GH8�X=`qk]8>Zu]$uİ$y�SW߸˫V괱_)Fn퍿vQp=yӯib7&Uv˗]1Nq[v6$PV`EJ?u3uIn5ڼPT3""\ടivw7,:)^X;[ryCz_	Z
    ϱ%b	j8VaAKXY&I݅TMhXz|:p;�KNe#<7'd6sW677E/Z1V}i�CPA#{vgJHH9�X�}=uH
    �*zyz&tS'�cef3HY[��r/ۄCN6Ь/zmjn[=.&\dڸlE5=4T/*TM^[wr0y5
    䅠'Z,4㎌l6&{TBZH�2HV8ORvn:CG ?�aȺ[?Oz[@u+p}IKtyĀ,tR|ۋ�Mop?7M#6~W6;o.u5zʜ3UZeYjJVrgH7%u9hZ4+8`dt[wgqaq%hHXQ0 *AR	҉XkT"<�^"�C+U{zIs;ko涎mS!ٹ[v1Xqj1Z9ĄS`Ǹ-$+lLj"D��$];{DP"
    "ߊ)*Oi1N=@y-lLM̔v�ȻiYN+�*OH~IAMwݴ2)ymj*}7
    &b,K7f8cNsG@IL)施#S)<|pr{BF`uiz_?++m76NʭG]+fjQSSt26~Tdvk(Z]UU<uqASeH0k2$JJEr1!qgwf+i"TӅhTJc`i}'q�x�S׋�}ދ
    u⤞]d'v!-lU>NZ-Tf#ifX]B(${G=6E+0	)PĈՈ�
    m%#
    ^H�2HV44J~?:�nWJ?s]�E[ޣ?j`[W||v�zu7C�]o%֟Um�[zSm}لXhkfI[Ƒe9
    l1_X6zc38y)HJ.b&,2
     � \g;[((He%H*Aǥm{j:cA_^7?Fگ�mޒ�/U+ZO\$4Fw`]ʪ" H
    <~
    I
    IN:)eWD8msM}KۗmI_>+rv^Gb=3STCSH �xI."~M~L$<XgO&H.WH|Ոۛon9kJ,0TIGYI>;/%@SERd;ոm6jJV*x20%]O!*|FVwm'W@hxYMXy�GOEW>ΕӮ̫�x�8׮&AߏRxȦҔ^]	�}ϭ:wM{Ҧ4g)4pdq4{z)nݮUCPf
    'Y>[]nH5xU	u'{\7<|quH<H3H_"a^bڮ!j"34谬*F,D\n}Q
    KJS5Jz:fMۺ6Ynmݶu4^שjw5%tu[3nn<pR$4bi+qt$ՑE"[.-<k'CWG:s' Aל.&R<"6
    s9!"E?t
    \LÀx�=l
    u8p?G[׼sWiïS@Ȏ��?KU8%M$qWZ�
    ;oR<K=,RUeIf2ܞр<ُ�.l=
    :,唂R$**kiu¾ZL_uUQQ;,7)WG駯ЬśI]FڛK 5z}Oz 歚=dw{k{ufQJj�0J(+Z
    t)_j)A)CNN__t=h`*�{�zjzR3*_{:5U}ԩz뉕H+TzڎO-�i׸%Q?_t9s5�{G[t,fQˋ2�+seoI�J?YX\ߏ>u
    tڛ{!Q՜W-4A mUqsCqZ?gy!.dK@
    4ZIt|
    3[u>lyFhXa^C^+5|7FS%-1`|fIrĿj\9"3$*Ǐb}nʹsW�WD|&>ZvmLlrAnOb>eLp=:IC';cirzr8)T3#d)рxJ>5ٺZF "S^ݸX6tYJGSPEiA
    A�:p2�W 3ю�7�x�=xʷߏNy�x�1Nƃky03*=4%:CS+6K/ 鱿63OV	O"~
    &fG55*,{VK0-�)q-~Zk('cm<IhfJ�lA}9I:_Wt&>Nu^x<_z*E:E?Wީupu~}5|:nx<}AׄWLdN?*Nnm�X\<��pk؇<�\}:_ֿ$8<AOU�yz�ںşי-[k|>?_�[(<_-=e۝['hf>:edn~-(+4սSp[1͇j\sU&O'h)d"EwJm۠_"Hh!"Pp0J\:Ǵ^w˗42?'"^z.K3+id;7[OnY]1F_	9h.ْ:Ty1NK>m,w!;}Q)V*QIt#Qa\:zw`l܋٠}*,QxhR#vڨ;[qwk1k	M6IY[YUEǭnS|45u\1YU*d<{W:a`u9ѨX鏶
    U��b
    QF|U'̳NI_2X}?7�ƽ4m85fNz3N
    Ǻ׈q뎿O�{ֺӭQ׼�_[;zO2
    q;{
    Nw;V6Y$Zxp=UC)	e0CKw2U~lqp	{vO$3ahOUص&_dgq>:-h,r㧅)a]C!Ef2��~ixdO"4
    ^S0ro~tćsRf)A՘
    lv:@Y
    Ze^jܙ&FigIIZCocm
    -@�Pqz.$y.n%-3,O=(�kZSϮZ[kߵj	\VKq^^z{k^\}>�t8?\C?^d)Nz0=f|4�n!�:sܟRq̎U71fkbOfPdWsA.PCE/Xi̡lbkn7[g>kOٚzTǵm"hqP\k y5zнja�uM1�q>P�<]wӏk؇F@\X?}ƩV}w-�׺4Xytg}wt.�tGi7�g-M�ooT+_>㐆U^F*
    CŊG>Ԁ_x>̤{Eſr^}RA׻.1$ͳN:۵1g3X8HZEWcL+gj/1jjE<$j�L]Viq}gCB}@ժ�:E>->L]Sx>F
    ]YWfڛ"`sRSbM4r62	%	.�_\mр
    HuTjNچb0mkfI0VIQE 2f�*
    pMv2H7}3؉ijᖃo�}̯y)}Y4H
    q9gS˷
    3g,<)ݡ8҄o˸mQ^Ւ)S¤%V�SIb-?E�~(+~:?<Q'˯b_{Sg:kɾwv#iPV]߱NRt4ySʞ{7Qû1@?'6[)6H0;ENcH˨{ZatJn^2mҹNZzjŹgbee0Ďni'5 'yp}[QVŒ>Nnx7-)%<94E⣸ƊD.>(pG	+mnk*-4Ty^SAZ$O
    f><4QL MȥRWt*(	�R�5f>	xA4xdU�
    	nET:?5rsq(S%Yq.ܭNB*=SPQoUy>)㍻
    g�㡀TSTMJ>l}rmI0&T GqFUpT?jt:?L^5u^c{gvN|f
    0;r?m�觞hcemLTS<r7eG7=~].-JXXܴ/PCܤ-a$
    -F
    M,	8I_DOy.A?#^vRby7hnej
    *ZT)$V"A:k!]jWRVSN+,Tt	ݯ/iVܔfmukhL1M.S4M˪O׺{�[�vMjnG@$RrڵDPmhB
    ,y;+d$81YiVW*o]R_'v|I;`e?;{m.ERsHz8��<]
    wf%xtPq;w�|op{r&�m5V:Y-?^O#bZ˿)ig];&
    Y@2jsy0R)'�߿lEc%Q54n]p%E?6R~U9=+VSoCعNMߚ]CP$Ω׹L<u!UKJA[7#
    8*~,'Y4'X]ʨ@@,%ܖvXW%0ᔮ1<oPIcSN&(fڛ{m.^H!ՅjL5&)&WKV`KPO�N2mC,e^[ށA"Pp{d_ ~{=nb`MVƪ<6a3*iQjv&555t,PG76;ͥؐrSď*
    Yh$F,BI	(+R!ط[[Ģx4UҺXb0r�@C	}O
    SOB*Tw_iJu��.R}V/o}sk;a[*FOcKڻ'/Pl'JsUAH,);+eh)AkNgO;{`K򑘄#LҹfҨ-bHPź>#[y7VO^Ulf1x䎓c-
    ׹ʊT
    fn|t=+nܧk׸	Јɧh)Lݛj۹NC(`m:6i.j$$}BMۻ/oav6۸lNchXih8i5
    ?I+F#8�0�rSp/ktqHŝݍY$|O}^xtNk^�Z<:t[-�jWl^ku?>&?3=KTyvTl*826XzQ}5ףH5b3JT!?۵81ݟi^ID9w~zB
    ux1ooE'eiuS\;7}g|lY?g;Ӯ~+1dE-Ft-@>`$YQk+A"]+@U5`i\>Ͼ|1[[n+MPʎB
    +&kKձk{vbj(tv"!O%k](EV3#ҢT".=y6m)
    Xas&n|;*qlLKJt ҧIR'H}ktE�5ڪiNWν%ػ7v|SMg=0�mU^Z:pV <j#ڋ8d~*/3&u%sتI�n؝չ
    ջnf0g6flp8^2c|*]XrNdѬ*QRg[}vm$@;CW$àu1\}ڭMM
    4NkEpM㰛ڹ,U>::ޖ=TȰCk{hYOMe^Hw טlnK�TP1[Emy];P$3ឌknڍ^WٛgdfqtX*h-c|Ef[.k!.k~bx^J'1S11.dvBY[ObI
    H8PO>*P�+Ė~@/ӎz赿_V}i�o%a1B3Я6+�ɽzb�=UsC#]'R~�PVEPcqyI8U;tYVihͤWx7mgb3ȃ3Lgf�q{՜.QDd?Mve9Lo՘ؖn)jqH:̿wT\4767!vkjoҠl@b�Nĥ
    DSJ-{['orArjS]L|omϴ'd6Ѭ[MK㪣bir+\]-+VIGF%#4u<ͼeYZ,ۍ	wk֪f9p0sg'{_]rZ"Šj!nV9,?˟W'A::]<&7#cWYb4k*iPRy'jyS,'\w�9#yMtxrִ?'9n4nc}J!$9B$z
    ZUx>Wˬ"uufu<~mUMəLgd@0L+&2zV<X0D ~N{AoNʗtQm*q1C&nm*
    ̑e&|e<L;hj*($O͞,'e,
    US+6Gi娪r
    NiI$"mֺ:TSYڅ4j|yL5NF9)&UtȒrسtE0xSOۚ=<GbúLtgū֎:?׃[E]x>׎:_˯u�z�&EGGz�pkؿ$y_9#ǟ;犯ޒiH�voggj�n筛;yj++a]%v2ke_A%=u
    u<<SC"K20`f]dPc7FPA\S,-.jShiOE.J[FUPyd5S<XV.\
    w]'*@n)Jdb҃M*mΡs돜^s}a#G_pF3kĥ*!᪣GR<HTL/Vʀ�&z]ga+Mv#z!\83@2O).Z\^J76/7.RR&3n6
    
    ,WkOGALT;*<ka#E>#jͩJU~f<ʧJM( M?!@NI��y�{A:z�8΢8wQ8};{wfۻcbN{yEr4j\m=nFZZ*Vx	>^b>pz%IHl>dolȒٸ~a﹐j2S) 
    zg㫫|IEzɯF5x`Sy^M1իh|*]6~/-{W|Um-]}Hbe	oϟ5ZbQh;KcPU~j5j|dk{0͸-(.z@q
    N؟k* oRR)kqi%n[1YaS)A4/�tnxpQ>d!__/'Fkz~�"E׼^G^\^|#	?6�_׺JcA_�jǮo�ƽ՚VZɊ|]ro\Tc;-RHnefF:ԙ±8-VmZI,Ǹq#<+]{aμ-soPƈ#$cjщ*N<^f$ys?ܾΒes̄�ĺY)X<=-v['U'FV!W!@^]8bFOh,Mp�C}mhrʊI}[7Ĭwlt<6K3f)'e)h7?go-ˆ5Ta"M	}*-5cE%X#@ym}͜%e5RV(ѨFԤT`ң'�uJ\u�kީ�׽p	{9�^A_f!?~�{nVۛC#v5bw71޹=,7auf:aD:[IwMMKy#4aêZSOϏGFm*Jp4z>@~ώEim,1T6/SiU{}AGPQRGM#/rm(X%<QGPG@u9vn\SH	ILFr<ӷEJnMԽp]wō;Zf]וl
    SԑC|lTx(x}ͷSo뻦!C'#5{��!:{7<�'Ҵz|OP0u5M�)$tݿwkd/ܝ7\4AGmmʜ0dj0VTHҚh6r}Z.tj
    "Qx�WwWݶd7ϸJ%rکR8p:?h,U{UI6[�g^Ņ~}Ht/�y�{˭uїo�{)^N�i�y�{^>Hᅭ�?obve5&۔{c3�"ʓ:g1zYѿ?w
    PViUOZ1g\ǻzT$�yDS	J;3=\W/V377ر4Ѫ8eOA=�6&lnYwvdf7K/ܽMءTOGWZ)+$$MeQ]AuhUX5`J5~S=a�.{ya,_$gY$5aS3^U:u|?zZn=C9_|vᆣ%Yw|ny"3X,̳&(!J++YAV0_3#$
    PGc4jIגߑyRg7[LI&[@@C0H�װC�׽^'?z+ֆJU.[G?n
    Ӂ``a	W]k@8,StmF_xLgWWɏi]ۖ[Ow-TmqY]C2tD-Tn@MGT_vƶ2[ql
    	ӻ7N3nٛ'/In{%ml\3hQwY2άsdpl♠ic�3H:\3#4$^Ou'UsRjr>|zCq�%붖?EKw&k+ܝzH#䷾X�)IhC.ymwKN]ݡc	ȃ2 toJ*[\<Ë,ʠ`r?ޏBQl\죷svVٜS1^9
    lNޭ;ǤIU`Vy1e&v$
    
    3
    ZnKytӤE$hmFƱU4Qá7?n'_D^>v�nTkť??l^J_*m!X*䪧`T6J#dwoGI*i?qfuy;sU&EGZܧ]v'a+h]ΰQ1Ohg(+'tQcnX(BڻIuj"9<㱙{U3B2P'Y_fornogQR"z/,OUTج6;41vJ$dGrTog2L*<PYx|ZT1*"7~3NmylX#v ckWUs6]a\=Y;x7lݩ{O'E5lٌ3|%m>3SCX$yz�Mx%8SHS<b*qFfo�,#57HcG]�#~]|;x?fy.k軧{oOv_1fm.w휄9fGLNC0I41Db^*M(ϯ5 Zt{�_״3ǭ>?~Ձ=:s�y�{OUYط'ɈKnl/=a3]Uv2(-6/6)&zTqS
    V:8[F1Z@%j9QR(11xPP)	;n|�gg.l%KTG* <*!Y
    <_-?xAvOG6wfn.WNT5FzHi4TU(%& ,CGʢkq,?<Sq~?8C.r)fų1
    #
    `6*Fj^=;7�
    K]'Ysm�zsU;R/بQy
    lWvٴ7Rc>&Y.l6<f7�Z0*$TRB׫kPo^?zk׎1Z^EzqN
    oxӭע׻Kٱa;c݃-Zl\8[
    O$$<}<զnC!A#mX_hyv(>MHY yq_co`
    {nd7J@ȍ<A5֝z[r_۷Va]k{u#QUWʕSGd'ZM>4GO;YX[դlZY;W@f"ݍ.DٹFPnS㓑l[pkk$^c?Wq˄
    o-+v[jhh&_ےpdW[$}{:NYI.$e�J'y[
    m~3x)K8?Y[0X#2eO�0(=BU^->kQ30{vu۱+knM1_|ro8Jveq#^?o䷍KX{Wsa-Qx!P!@J!@@I?Ku�8P3:N*Ҵ
    	zOcuggA{n-$B>�qM,#]ѳddq[]ILO_S,I4&ﹿrT*<2AK[Hh+N[72$3K#-JPƄSJw�z6?yoNjk}nnT*T:j2jettM͞w	LjA8U(�sH$wn<;jVU(^*F; =s}߸LFKweڛ
    Y_3V<{Sq`w]6۲btn<tT,2ELcq-gŃM5r
    ss%+U8
    P
    q8�ugEž�_׸@ӡ8=��-1?>ߒ[׻6/^hv#;{l5eFkwzv^}_mώI9TS&2![FYXP	9>_ZfкHY|RFT><>}q,ݳnm|K־.\dR*z,UTTxr+PZ_Fzڶ&礶s4-�/lVMݾG�֣#:-)z~>vT㦆16_JUK"[T3JFXHGL^]Bmpuh姩ݨ<A~xܥ@{;	#,"^ù>v^sco,ٷ
    VzΪ
    2{7C/̆m$xً-q5VVZj~s{ZnSDo NYr>$5<PF)N7@fO24vA\R�+~=1FkUnՙͼr\&RjJI*icJx\TL-v1AVֆJi„4
    |!oow_݌jn1QRSԨ57:6,{#Sdnh2{ζW-XvSCEB	kaBh3cރ-7CUm)
    DAFa=M&ϻ#Oۚ)!MA2雱2k!ת_|돂|>7jzme3੻]>Wmງ+(7
    ~"<ո(1,lKW©RN
    i3N5"(4ՂJt9=px
    Md.,d觢vRcta#ת9^ٹv34b*_p=Rs$6k)<n[\bYQdCz/  uɌꑎڹûj3[s[pb6<S6nz}K=,
    s wi*^Q׻+qWab=~RYj$wJ6O=a,^7;#~O@;SXn@�Xltޛ}kn&
    v]&;!BQ1L%[OL^aLFcI(dQ	$H̪4T
    >Pyg3vztӥ=,nޛ;Qt8|^c1hᒏqRb3)cH1 #44]ڛYݥFqMH dyӇ5h0Rϡ?_�ƽ뎻?^V@~?k޴ߟ֣kUc{?|?�'	:ƭ�Gi8Vֿ#
    _ACT1c�ݧ\
    \v�s[oLoݨMwNWv?y΁nT|uEWx3?5YZ6ݢj0yd^N@RJt'vV#iro깲Rl[7qcؽYQa_m=\&ɥ]]E6p9jhfz+teyH@rZ.[ԁ_y{˨g>tgut|�Jѻ<nɇEJ}vt1cڻW!
    PXHgLABs2z^?8~H'u?mڇY>(7Nݱ:n?Ǯoѐ&[�7e5{mm*	3txʒ,T3!EMsn佾mSɟAG�U- O>g?مj\>M؝4'UtÍ{,?�ٳb!a>3b(}B>Z�:8grN;5E]yS׼??zz3Jכ5ׂWϤGF+NW|6cvf۟�M:kvo804?3Ӷ`jj꿉릊h
    $j:Jb/r=VtV{Xv]ٽ:>o=0lOIivagrŏ/M\"idh暍�$95bIYs{sx*Ut	9??,�z~ދ_!
    8_b&?pmߛknסٛj~Im
    )+1
    yruՔ<|4L�a*i^7#�׺ziQ^&?5^/z׮5/޶ν#H_|�#�O3H�[�C7w,WZ~}T=>{la;Ӯ>?Uo>n<NbltV=rd9_8I1CEQO5=-sM=;u5t3Sx*\Fߛ/Re~:7z|}>?)� i+Y<Mn=޸i%d#4SQFbTqdi9Sajz"xx&Dr,R+$HC)l}5A\RXt�=YYڻ&/U\ӏjRe	ؘ<c`]]NۤO,PGK;[+ܐI8
    >]	7.m}fܮDJ]d(�c*�t_7jznF}rn][[poݳb鮍ؒdzqW&?VKOCO%Bl5*
    VEI'A5=nݏ;c7Bl?=Y95||^t_t|2*h2lދG-$U'QG`j{+@+�/^@X??t2qSW]ɧhB4׹f(_qt2??uJuP+L;jznN}rn][[poݳb鮎ؒdzqW&?VKOCO%BUjU8p�^z~}-͋_ǽq[){_PnfƧ*}8W0],;ӼO-D45R[}ycl"))1:F4<jI.Ǹۦf_x~0\#4ex+ҁHRMN�{0?ЃOϮ>kg?kݼZz�ku㭏>omѽSԝ'ub6&-t_}on~흽ؽ{/Mtvė#ջJa1~Zzy*TR*OOïF-׶kunw/z+?ᨱy)|&Q28't;(g˷IEPU2M-g.
    8\|U8F„PAk|}.Qm-7Kzf
    l.FW
    IA#G~[Kd(aT30|qE+SRC&Y制kOb7HAڤ -4$~M?̷:_}?��
    )_o#&ӭ+_:W0#zB?_5'}Yx+'`c+.��[۪î>Gś=,T:6+"W#
    z5�q􏶵|-1^uoΉ򎟽w/c
    xϱ&|.ٻ}-vx-SN[!STԘl~F9Ʋ28]$W,⣁5>]PRz|5?�{h2:ǎؿ!:~ყ$E~RhP΅v&|v߆J%eCS}/&M<3I%?ppŭ5CG~�	Si~?{ֽ'|	Ȏ鏐+~-4-͎=C9,*;IdTյ+sʀH֐to1ץ>z][6}=Y?[nE/[�g5_.0)e^9j6nVw5UAMV߹yxn3!KO5Cx
    kOh'>?|On쾯Ulyw_^y}7^?hC=IոK`AW.R}F:I7$dxsО5.�<8}4SIOPԓU+Or5RM9:+(ub/b}fb
    
    *=>mV*XCQ|&?�o[E:p=??z/N2]��׽kugA5Zp=ӣ{6'qNM;+ggmme:o,rU~{	CŊYZ(h;$`jNF�<i֙y#O�_گN{lΙ^.XOٻCp4;3QM[YOB<T+Ԥu5}r=~۝םwpI6o~uoozq})n)U8Y*40ҧ1V0&c5#3LJ/gW.F8̺LN2hMe@-uWH^Qt{Ԯz�'ƽW˭S4;5U["힁7tN~tuWw|u}8plb>)K]R1*PYl6ź֫$uք7rH! =1.>^췞FUxQ\B,cR#7ݽ۲!]pR0%fs¢hGՒ.Hf7>wo{
    \úmIAɊFOϡR8n_܁-][ɖ)gXA@i@)/]{Dv�Um̖>޶MT8^oggqlkGJԧU	4O0.
    5aHUQEqT9	_n;u$wY$00:LO5/z�{jyu��\uDâZRWu]f
    fuwz/<n5?tVf3db[uNG3'Qb}�tum[0d8Kw"h:8m׶n,6hi"H(~m,{j,>{ yK{΢-ϕ[[qGWC{;{=AEOWO3Yb�u7.+*"PN#
    Y
    f.jXicFBjbVy;�(
    (Yf{M;ڃ`kv7go[ur)"#֩S04aE1B%<&䊓Lj#=-@4�Pt%y�׶	[xr=?K^2O[){Rߪ4i_2_j{ւg[p=ٱo_$>7{Q|kyw�5[<z٧?'ݽ_z%ڝv/;vm};3sdw7fo͵n݃cx՝[x1e]Diyd	NHrh�'' $gϼ}gibq{0i6nzKvwvnuqfjg1l].U6TJ,{\>jGjrRS]^MuT7Jfq�"vIAqFkSA'ޗ/=뮉M۲_]fvYmch(6.5u~'	,0rTHUg`)}xlm-̄.wc+yz ,%A5Ɯ镁\z*5AKQ,N'Gi)1u4T88i)`R8UDE@yyygf$$ԒNI'$ԓi$q XP�(��KkZ]9׼�3g3mbޢ*1dPdrRUeru56;I]$Q;qŮ}iA\p=K%e
    >bczfL횣"GxUtg�L(bxԯH-Q>	rT(ag'jl)[1oI鋝F2r+$]QV2|VXKwN61Lr!MsШ~dlGԟj[u+@}
    ^VL>GPGᤠ:jXH"uI#v7gv,ı'{;;bK
    )`=Km׊e0<TVm
    &Z&ܰʒje!CkQZ�ש@O"NI_׺uPSrxjiի'�ƽ^8u^[5Eׇk޵|3^-�mM[z?]u#Yw�E!_Nu[$</7�)"@;o#o]*�z]dwg>|xYzo`:w",FKq�2z3-	m:Z	s<'ĈIv3^"Ӆz@	gA>Y<}~Jum� �k_ڳ5�P|S-;}͋%<Gjm87Ʊ#W<N|uh2&o}9-P٘-;nmw@//wωj.ݑu
    Y6O32kZz]*j<=E?g&.ӷ[�Z%6Fνݹ#{Ώ
    ˛?Ά[Ϧ߽A^>
    2z;Vl>ݟ`복7YBX$>.=x>/?įO;f3fvvQ1S7gsiSe\ԥEFzj.RʅHC�#y0ſ+9s\uWߵug	DžC?FCƒR:O߷alL}ۜn9vƯkQ|˴39X0=
    ͷ8:
    QK8-
    Hal�>*+C?sUu>srlͽO[a7=m__o۝-յ/6`vXogSSmUOŵxm¹
    C_M}}UO5['w_Ϗ3&O#)_}Swblvv'|} ,W{oqrT5cӮL[G5:wΩ}\~fϑ=0e򏾪^dg|V|W�l9~1ݏnG)MN'SJ�)JM1ZW'{}�LO;,Wުz:q7h��ob�fc1�?5?�qZ/�q�k�._j<h)Z\)Xê'?>n~=O0Ct=g|O?{a]-~+nmy_p:nњL�lY{&vABG^Tᎇo�ԝћ02w.Ɥ|}ۛ{f}Կɏm^op�.평݋ӶZ
    3rO?pGJK5#$9z }^_,t}-D+w�)]U;N;."nl]qg^nmU׻3o}И5–R)\W^CGA״<>_'{/ǐk�)L|~G+?(?w^
    ~OMdIqY]](k4;nT̴
    >ӨJ
    ?auwvɯ_>ҽ~BM{lͺܭg_}z>GV�NK%e϶]s8d>R0rHi	�~Rn�mc:I!3̼o^GoOY|z-5rcޜa.M<
    /~YiՎۜFCۚ7S\={I5ggǼh;guN"ѺFu^l]Q_+{n-^3o%~8=)|.TpN9rdyQE>ڑ״#=^E&KͿi`t<?,Ңbj4rdx,&?~~gNiO%e4=Oyor"+߭ŧ{}�sê=S�O-˵;9>N[ue7Q|mϸ-G[v/Ⱦn^=K6$<}.^W\dJ#Q#A`ahF@9SDO:wG^K++;c/muNno?WduG{O[+ulo|9zS3_{
    
    x&U?MM_LE8`Co=�v~4m\?E-(%�nݱe|4]/{#؇:o{W1~]P$^]FN=aL2G
    g@T)[nټr.鿉?�p_ݎ؝?d}՚nٝd?]?9"dɀ)Fj3}l?VQ?.�ڏV Wߵ:�
    {7ȟ[jv.scuh|1ns=g9qnZ_]/ܽ?{~|lIy=\$;ȕG:$qv5WB2ȭSU+S?
    ó>~Rn#n]Sۗzb6>kvƞl[79;/ln6‚=A9z;ax~,*2œ0[V&tL|JǏka'l?YA'~�g_v폘3^;Qtȉb΅\\;s{AL>63rYUedQtF*Jx Së_^4׻7nA:o`Oc'v1ufۧgDw|Y,OOFHww4pZw1*~'Ӈt�g4?n�/�{?ЧG2o_r
    >T|:SOz/?~7wwſ;bt?DLY{Osy|�GKsS/�-
    M%L$�7b?m?{WBǧOU�~U2۬+j
    '^;̈́}Eݛ{^MNJSnSW㣂*;PÆ5{H5PH:^p?Ϫ9Nww7 ۜͳ?v7ݝսk�7t׶w]ݛ=׽{�=&vIQJZf3PQ(kEE	4
    A*(*�1_F�=}u̿9[6�͹ۥ>d~)ɲY|O_>,nI%?ɥc+5u,2"TsN= ?OEp/ϒiٟ	0[Sb@�C''_1CGKENRl4ݪj6Tn9&25Y[6Y`%NurµkA~T^.toӵ;CeBkYѰ>$a6~nV
    zd6bu6ͽ(q2s[%[#h$TxdNxEj~uk:{=;XA'uM�s7
    V!egqS4UU4,I<&e5Rď\*т9;ên?{{}݉�[<+<W:[}{�}=hy>4wC謧P
    ?:~gv_pG;[s|~�(~@k6ˑd7Cqndi
    68SlLq,F&YЈB5OcΟTJyOS뎩MdS_yv7wPEˋ;y/fbGuoW$ŲV7}oX\f3u)ݽILj8I`ɥUԹFM	!^kSV=6 Ӈn\e`me_ȃ(^򵾃+EZ|Ğ�թ׼o�i^k}O3~rw'g][[~(|J]pݗge�o;jgcnZ\w~ʼػ Xxu4xJb4y(ĐBpppHGCA[v�Lh7=�#4�1t7ǎ쾸ﳺ�T�+nO;Ygzeh=<RJU:%@!*57p@4PjGS8�?H_S�ol;zSmZ^ן>3h}xw~Fްy2/$Vq唢ܷ8FˠV%�Nrœ
    uUFI~Ϯff__biػ>Eu7m74_)S`|Y{k3a]yllw2
    ߻)6}x)
    IQu jr
    2
    +VQc@~jҜq�OCm=}}39ɼv7SݻtG7>{smg[72ehep
    FjGDh`�RČSSOSi֝
    F�J<^5+=xźsyYNov^רTw1=j:;*!ZJI2l^1*&CUWM�y˖�<MqOSF}wwkn|_mg~Em1=U_wF!6ƹpK]{<dgrqP‘9kI-utQ
    nA@U0mzxb_E7^}77͉>ilPܤj;k~迎˦~am]x<fw`u?pߦGɓQ!/QeYI+.3MDSB
    0i˜�%VoNZwVݔ;qm<�LuVS=ߔ*f2{}%V?M떯wJ[飝j.
    I:Ploj8T-}WM'?9uk_z'S#>V�}ujyuWO{˼Gb-�egwO}bd|k۝%AQKr;v?TgmLOdUXք%\!!.&EBEx}.v�{=ìO|�D[|ng|[I7Կɮ_v^$)2X]FeOvMhXbj|%<s_0\F�z],_{?Nt|͜�1rYNږd2[=񗲻YCﮃ{sAC%M6G塊I*_Vj'pw`SM4MJgƅr@=x?u;׼j#t';,q_/�<K}IԿo^VR0a�V>߿b//?�ǏU~W`My;�]8
    }]Fk:~eNZEzn\b4^%X48(TPT˯JZ�NGzkr_u_]|]ύ\/>NwПٟ_x|x*Ysso#ZQ+YL
    _&084I$eN<Gxt_ɬ^ ~>Go?\'ˍӻ~1&ʿav?tvtc{lwʽUr,ƯfD]%&%R0<R~*7m�^QW1Rmxz]޺8{WnJQGqS[?v#6yjcR٣gE/d\JM1M?OO蚒?kUӨ�[ʽ{q^";YxHfRWˊ;s-WEUGQITx%J<'ˠ{5	'�#ʦݏiټo
    I6^cRMNVz]ୌxq1}A5fVg76CrZw<mu^J'Tݏ--UlC<8**RdQc %iRZCuǶN$PS|Q#3rMEaIW)Y1Vn8GCB??Lgݰz-KYZl7Vޠϳ)N:L?SYv^UE;oᆛl)["kG1H(hFs?:id{nVld1;=[]{#eWnlσURH,0*@z8{~+.׼y��c]{˯y�}˫M3\p��=xp뉙y~}xc�ALu��v׏}g�|�Q8I5_�Pk2MnawV_vB
    Ϻ�!ݼNS<h}5/h|8zӷiNv~āsBv�O$\//M�<_j�D]�؟j
    n<_׿ҕ/ڿ(;�?zKc|Ut{F}"�ĽUKzOVh�?^J?O�g}z~[B?QhQgJg߉
    nb/K�<_j�4͜-nE�~/Mc�?ߧl�you!*~ѥl�GnkQEx/_=G٣�?{s�(r�oS�Eg'U�9[Z_?_F�ڟ(7�?z-s9?[kJyʵG_3?Qo�bM?9?OUG
    [�Ǚڟ(7�?z��9?[B_?׿ҍ(ڗ�IٿIz
    o;S�Eg'_?I'ZWQ�0gi�=`�I?O
    ?K�<gi�'ݿuiG�\�$'kJE{(�);7�?~O^Ҥ�hҍ/l�Kٿ.?O)/JEoD�؟iYO^QoD싃�Qh�?M
    KÊvW/rq;6_ז�mQ|Mz+,͋z|׎z)O�aԽ�؟iOt�D҅-.?o�b~K?K'tZXu)>/f'_'zWI�<wh�=cQdQ|h�?^�Jv^�Sީq�(~רu)?�اRQd�y=x5{(R_){3�OzǝƿhR\�2�\�3ר|Et{>>3�O~={:F?Gn�Sߩr3[kGP��\_zkG'�_)/�Ozq_?_>x�M{.3,�~�In�T{?L��{'vh�}L�qu~�&}#5}���c�g?;C�E?e�*=E5O;?�E?e�+g�wxu?�~�S޴;νAc7^cj�9\S)/e/}ui_e׭-g=8U^!h{ǗN>y�O_oD�lc_]
    O��دhQu�~1_>��'}P߳]�1G�1GeU}L�߳$c'}Ge_ug[q׏gю?�f7)5+Chw}Ûo]Nߡ�ߨ}›xuG�<g}Dx:O=b�^uCow*{+�xs-֨?uF8w�W޼)-Jju�=�دxs[`!_:#ٿ*{'�_~�|>4�>y.�S?{?]?7�EOd�-�_w�=�طxs}:'�%ٿ*'�_z1Џ>E!F	�~fs�~M=o.;>6fŽ7GQ}zN]c�U?^�Wm}�m�xsR�W^=xu3?vH�[|)�Gv箏f'ٟz
    n_u_E�<e�}›Wׯ/3W{7�/׿u}�?
    o]oOE_̡op{;"�ch>t�q�qG5څ6#|#G^ǯJl2�ˇ+*_軱7Mz5V�[wO4xkrԨMi^"˨2�t3�>-�LS�?V$>=C3Vv?�bM?z׮m}��_o_zo=Y�{^n9C�<fŽ›)Ǯm�6y^[egc/^�I?v_�_|	׿e�{7c6++;�~f?ׁm�_n:?�?^^�I_�_ߌ3>}u(o�e}?v7�bMOS]oWiocq�x?h�?[]͠�W�_޼	~~îm{+�عq?�?^\OfP�d�o�zyfܰNa�Og_qxu??�s~}g5O!C_~ccVq;?Y}mJ'3�%?}s>Vy]bSa�Vzo?z|^]
    ޻}Y;+w?Ȏ뾚?"(2zJzۛ[S&:c#/Xm%OsynV;Uxi{I?i4ꬮeP_zmzW#.{+K6cfM}ebUvU{꒣KMUM4&7{DٮKkS(IdY
    O8kէ4wbdV*pfQ��4 W|Za�wc~g�_F>zŌGMBo.v0mh	U5mdW(9!;nn]=GCOz�2_tߵ~@dewOmɶ؎Y]ym
    Ue,bm7xjXSGh˧ފn!_ˆz[>C}G6'v�[1=5ڔ7aoN\q8jڻK92Y*te״gOrm]>KwƏ!;*;+A0u6|,|u9=ʙ:30dhp R<e?o^kǣ-_7mm_=�CuUM�!)|n|όޤ
    .PRcoA%}f1$�pT;E2z_>�)zvA-?lVﯓv_qwZvWv^lFe~97#Ty<x^e
    ˜uXwv={gr3:wb6>tdXlm,OVbrGUm<$!iBpH�dփ^V_%Gߤ_p|g?3cg٢|
    \OW|1<
    pٚsu7.OnYԙ%?==잌6
    :ﵩ6Ɲcqӱ9
    krAʚ2ȯ^s]>V'z{K>/_875[crt�b|_?[r&3۫eb-=VnZJN(e|eBH�״^װSi6ܭ}'zu6?kb:kۿ۹逭[}WV\g EJmS*Ҡ>޶R~P6_)z~C|J_Sq`]wݏ,h�={g~IiڳQ}MSY^b}{Iz�(KowX<ߟ:io>_o~DmImϲzY۰d3Q)栊RQ(&Z
    |)[oeZw/e뼓/5]<i;|oG`w7zu&o|oN~]ou
    [uU&n)^Auh{+q_;v'Kl~xc}&Cj�1xx\|^9߿~{L.z|`N*"O?t~Ɍ_}7yϖ
    0{7~mφ/gK?6s?/[Pl-EY*uP*:'MKM;A*&?u'Ӣϒiwow{1=]C7/fn5wį=
    hmnޢNN wxǦ{q^?2?zO
    wmX./g�O=
    1?#bb{p{L6z߆]{Orwܙf
    iv厯<rpbc~G˭,�+/[z~v�nas#ܛm}7{n]vOuץ̴ܹ}0ɗR{~ߙ{IwN}L^vfu_R?bavxmWsϳ3]kwݩ	ۯQKAK\tK(.q>nTE�0ѝ
    �,4�1^?OzPo?v>?_o1mFr)C5Iu.
    WשՇ|
    1}Vw]fVl~l7|-M`[~n
    ٵ;[l&h-^䫲KȥM�/^s,OlU=;z|?%/1霆~\oݭ_]a_jlnꎺ|vxvjZ:�A'9OCܿ!;jk1{}>Z|.{{Ud7CSPⰝ֔7v[�}pLMM99hXmE"h�vq=�h|uouL;o=/g;tkm⹆bYVi£uttq8lt̾α}0m_|紺##tk`?0O8j|keQW:~|8E+h�5ܵ[d?]K]o]6_%?k%;#¯]�FUbQ`k8}ӞsZTGD<}8z-aGn;/�c_p}Sڝ.GԯkL92	QRLKp�uLt%ߙ.rEM}S؊7{&탈;3C;MVTb&kcW3K3fUwEP�ǭ
    Ƕtq3_׽	Ќҽ{It'N/o=ξ\~޽C\uם؟x£'ӯy�ƽ\wuѝx��=Jy~޽׮׽}BWN:̿?Suz24xΟ=\oN/ {/}:)>;Kz_}Yd7ϑۏn'3ygTu-M=E$loƄ`}OZ!$�?o>|yퟀ]񝹺T팆C݃E`jJHp=[*$7"`$Ȭ@cG+":{n�fk)�	p|W|sww';sluRqv[37x)V+t.[N0t1_4đ\p�/f.t6oG;9l}7_&7UoV:#y穱Tۃ'GۃlV3QK_
    h*^yLP:6??v|On3o3>oȝ7#ow7};anGCmURRRMK3xqJ(S5qZuld7q__cm'R|q˅{A5/{qPO}쮸W\uFs"^s਀yyIQѻ~ҟzNPY{pqj7YfH;(b;}_s[Hm!k!?r\smm6HL|_	C9b$HK>n�4݋ds]_ m>j
    hS'VwƍӰ{s|vV;n�0w_bav-6R3㥧|WB"?א?vyg9Ǖ}y>m}ߗnw--v;m1m2fڷ8(]f)a{8ܭIWg\pi!L-5TPvp콛I׼266
    �O]uMx=WK迍_~@t!bf>\.<&ްG<Z(|7x/m}۷.h>bN_ܛhܗ~Fc5bv?Eڗns5Cik'H'TO;3'1Vq4Tk/#s6]c/zQA{;\vwyVzzon1~'g[uq_|ғ3EWN7܃~rne彛ew}awϟwv=}Sh7A�+X3l}glk7=Nf-Q4E*CxJֱ	eQ"5tpG\ݧ#kf:MS]P-T8Oc?u:TMZ,U)i1ƢDōMr^[=5l`ْm;J>Y7kfQ	gkkb,s݈=~i\ndliB?Wx|9>DnG3ST}6ޝ`;{{o=y)18wǟ�rÞyqNc;͖͊/n.m6ۋkit^%^ma)no*P!dp?{7a1/?z\^Mx:Cڛk6||
    %?-tu&V*,~_t{*nW<y�X^_mV}6$)6qcQT=mPdP!.<k
    UYK
    EJpՈ`5g%D=GTn/mO|i�{it]e8ĕq3\U3d}~~G^}i.7}.n7adkxc@)_}=SuظXQBjWÐI
    WFNm񣳺ս�5o}_[~um{puLn3TpQW+6,;V	Zl؍On=yzv7zm{&ZY-gq
    *onbC0lݞtۮ-wv=Z\"kRm\&=&T�?d{J?oG |Oӓ�Zg^�]ߪSލC"�ac�=ϭuђ;PX�ďzׂ㮼@[#޾xS?o[^2'?ؓu�ϯP2G`5�ozIx^D?}z..z?q֟#޼q_~޼<zȃ\�Ox?[Dq�>+בϽxǮ%�T8y�xgi�o�Ͽ�>p^֟Ǻ�ح8g>D>�GSyW�{4�c?ϯPZ_Ox.?C{?^??[ɧ\u5�f^^֟�"uS\uz�}:�?ϭҽu?�x?^v7}|}'www{d<%/Xod|hݿu
    Κ\m_6ُtoz5Zʜg0s
    I;,=n9a5"f:fUAl"eѮwݝ{[lcw`p;R/3f66.}ob({kw6m,6TTؼ}.WCH颌&Dd/:j4'R@�ԐxϠ+/7~_1H?w�_zqs?RVbzu3bhg5LrURKq5(CH1꧈+81JE;Bj@'z9q]y,fI7E7Vy
    n_Tn,Hm͝ԛ;һ{7G>aqBbKqqO
    M
    1^ꑫ	$V4*=ߗFOR_c?>]j'T`<�z~ÿ<6Kq!�y_7�ʵo:/m{حgG{jP}�OXwZ?_V};r;MܛFiKv!S쮙F9,Z.]Z:fy養I3Ӟb̻~gRiD
    pFY':Pp
    r|*�*OCONە"sɜxśݻp1x?i|}?_wVB8V毨y*FT)ngmѠQ^Q+4䳬p%`)BSV6]eMM�1Дr�"��x/<?,K3.nڽ߾ݫbvG{,/o|GC}t~>vwr΄ٹ혛mTگ$oZh/1@G[rZϐ�@yq8<}6
    /TC_;;龓8z=wR=SѼMDI�=0?1
    GQa;#~%mߟ0rM񊮗/>w/Hacp;!./Mr<m}uJ<dMʖ�{ƽ.?k׸Oi;h?=Iƍ[#Fn,yNͫ{mmI$3=\nt
    )a^~yסk3.[1=uT{|,wqeƞS/qznŋahĩʌzSˑ~
    X�.C>4n&o>�B{jlnGMzfc4s`^)*1tuU3ͣxNQ=oz:[w{#{vf6;ctÏgeYsY-5eTRȌA":ׇgϷ=7{>I|
    c1mA켬8WӪK|Q%3rff?"z	(�WlW(l-1?cm$Xr�}Onz߽7\Q6ԣsXPp^ϐ4	e|l];May^Ǘy'ܿ7qφ_;#롢	;vqUu4>kڒ�U}>#zm-;m2yZ;}FQN~,f'|l=|w`N{gTQUG_49{E1C||X7Ew�e�z7w}??���?/u[UFΝu>gb[2,�z7v;;;/?C�G]ͻ9ن?�q?*dհS?PzAUSGM(oaC-�)Bϖ=ɺrwSfv!X2zLb)'Ux
    (շ/)uH=~팼->~Rvk.KC{nf{׵;wyn�C䦦Pvo�w|gUWev>{~yIw=.CocE=vŝGni3rjHct/XW#ˈzzϤfs_t
    w}=c=Ǹgdn}ٹ7(++'zE=FFtƟ[xgET`v�emߒ[Cr�>}[gq=oޛ(jQ
    9ʬ~QR(aZS_/^?g׼?:oz3ѭ؝bػ[!Wwn7.?˷pc=!ޙ}Gz15�/[=.d>8:qŲ^yk%vFdjJϴzh$ԕ$㭘ނ^w>[jF�X.ےv..ۘw=vU"w2+k9<tp*UCQ`�Ouu~>g{e{l[=؛Ӯvnѻ_kwr
    %fx~78S9i+}Resִ0z?FKo͎,socv.y1ո7>cC㷯~gFJmpTP=irZ1<G[G+םM֝S'ul
    ީ|۷c
    }>C==m_Wߛtds[k?[6W4jt7%
    1<Oӯhi.}ۆT{Vm?}?#>In.\F6IܟStݳcVma!,B:5_^,?`ɦpO^G+PAU{n1_&>nwUZ}ǵD}Qu	Yee=#5<K;Tݹ?m|A.o񻮷X>c}w{vuntS}ٽ2ml>vnBlb2)oM>@/~ν}|Zz\W31vd)Gzwow>}ǰ޵oM{s9UVOz>T1^>oD򛃫6l{k={/nmѻ_tq
    ג9fߙ~99YS$,(S(|[	O.][v7J\Yb#]ohu_m|dl=S	_pd2*ǮidZ3b	&l uu?o^,qZ)ִ?�8u`WT_37^2?e.Sx��׌8*�mތO>*;�C�zVŐ�d�}z�#�~\u8-{;3~{n�#~mxO+;+A4UTpy5,r*uu#P5o^ӊi|Xݝec3g\|(}ٟ6)ў߷//Ex>pUei2:ES -w8 <|ּ1‡ r|!ٻgcܛ?\PWmm.	r1)7鿑H8l|P>x)_V8TW
    *+#xjjJ�
    |_]�2{o��s=/MG:}u/͝al={o!]im͋3z�wkT�Mf&2i%eRi:߄_Ge#�϶ʚRMx݃=EONZ�7qT;{'df^�6jΟAd~۵Ɋ~R9C&zwoI#Y7Mv]w_D@z_9C563{uw)THnwS'ҽ;>Bl?q�s?�w7
    ﻠN/14iI-텗ô~b;Om[u�}<OskI>h<yG-7_ duܚ^:aMFcP4d�*π5QW}w=&tmOKmwd=ihň]zqIdql4w{/7}->lw+NuqC{YwF;(#8!Hꜫ24dy/4~
    :IUOov7m>ra�ޛ3&ݟ[r^SG
    :xvv&KxA&-[5�va}ݹ~D~<uݑ=l[nw0o0[՛;MxC[mo>6
    Hycv]>o%[K٣eXɐ3DcOV5j~%=ڿ-zO�~N`w_K{ytvonN\L}9Fܫuz֩1Na	bKP]˘vme,Mh^O-*X-5+q9VnHfүhَAUj?}utlNX|/s`z.u;E)[yVuA,Od;~TM3.6^`y}mK7_c\
    oM3q*zWU`75_	oX:ZoZnn$nmَ(`ᅫ7r{viݝ�.mm[QK|vڣJϫW*OmwAɜeMʻ-
    0ruϼη[enr]_CJc5֘{եښs$cLeKAPĠ閿Kn̗YITv74/q]w|�q揬zGf!a~7E
    ]U46]SG3^ͣ9]Md:v'ۦx߈+5\չNf[b;;cWVO??? {?^';_#=ݽWN,;C}3&avȩPAۘSQXN>3{'^SܵV;'߶n4[Rد$`g.HbU4G[~qi}}<<
    E"PiCq*QEE �"�W3x._.)tK?_~>]zG?(־C׎Q?_Q�C_ؿ�íӇ]kkרE:QX�O߿k/�_=_.�O?/7Z>}nH�-ϽkkI]O�c=oO׿'tK�ֱzH߿ku?o]f߹z3íģ�~:֓룑:G?~\z!C|z״\Gy?~^l/Ϯ?ē\0}_z֜~^??=迠z~}{�C_ē\7޵רzST}]<]/z2Aר|�UL_P�G�%[)Z|
    |^o'_:
    �m߂vRTt	ڐl}x_�~ݹo�*sqŦe76y+tVC_Nx!~+M$
    
    TPS|0M
    +^'=
    Hu_3f';f1\zonns;Mڽ}7F|㪮%@((?!i�$�(�0)`#zBzתMGgLW/uڿ!1]w?w~ΤU+殪'5v{ɤ:|Mp;J�4(MP4Ƶ�Fc֟d{LXzup1^9�::ԋtNXOmV?ݕ�_Y�`!�=8I5l_<�Pk5�𘾓]!?�ߏ�?ڽa�|�Ͻ%9�|?}m[Cq{KGӏ^b?ZO.�Vz_~�]�OO~�|Sx7B��ҮW�ۣ߿wY?+�^�d�W|�߻�Oп׻�U�_Ot/�*=u~~u$	��J_�n~e�x^�d?�W|�߻�MП�U�_O�7B�ҮW�ۣ߿wY?+�:$	��JW�n~e�x_'*_=m~~]{^��]�G~�qO'uIz�wwʯ?i�?^d./B�ҮU�ۣ߿v8{œ$	��JW�n~e�x]{^��]�G~�|׼Y?KПӻUݶ_O�/BN�ҮU�ۣ߿v?+�:$	��JW�n~e�(�KПӻUݶ_?i�?^_׿%OU*t{G�x_'*_=m׼W/uIzwwwʯQ?+�:$	;�JW�n~c�(�{^�[�G~�qO�׿%OU*t{G�x]{^�[�G~�a�׼W./A�N�ҭU�ۣ޿vX�0+�^�d�wV�߻,?�Kӻ~Uݖ?'u$;�JW�n~a�(�׼Y?I{�JW�n~a�(�׼Y?Iӻ~Uݖ{œ$;�JW�n~a�(�׼Y?Iӻ~Uݖ{œ$~Uݖ{Ɠ$~Uݖ{Ɠ$~Uv{Ɠ$~Uv{Ɠ$~Uv{Ɠ$~Uv{Ɠ$~U{�?^.'A*ߕ_=^�(�׼i?I_{�JW�nzշ�*�?O�ҭU�ۣ߿u�oƓ$}~U{�?^>�dogʯo�U4�ҭU�ۣ߿u�{Ɨ$~U[�?Z.�dogʯo�U~4׿#/�Y�G~�/@�*ϕ?=^�(�׼iHGvV|�ߺ�E_~KgG?;�JO�n~շ�*�?_={>�QݟU*t{QW�x��ҬS�ۣ߿um�{Ɨ^�dwggʟo�U4z$]?>T�[w/�?^3׿"�Y�G~ۿ/@�*ϕ?=V�(�׼yHGvV|�ߺD_~gE?;�JO�n~շ"�?_={.�QݟU*t{Q�x�t�ҬS�ۣ߿um{Ǘ^�dwggʟn�E4z$]?>T�;w/�?^3׿"�Y�G~ۿ/@�*ϕ?=N�(�׼yHGvV|�ߺ6CNgE?;�JO�n~Ѷ�u_=u@>�ҬS�ۣ߿tmϯx�HGvV|�ߺ6CNg"ݟU*t{P_={�}�W�?~
    :/@�*ϕ?=F�(i׼yHz9__ʟm�4<z$=��JO�n~Ѷ�u_={�}�W�?~
    :7Hz9__ʟm�4<z$=��JO�n~Ѷ�u_={�}�W�?~
    :/@>�ҫS�۟߿tm{Ǘ^�d?u�U�_6CNgC�9__ʟl�4<z$?�u�U�߹BNgC�9__ʟl�$<z�˺�Tg^�~�U*?sPӯx^�d�r*>�(I׼y߇}q}XT̔3N2J.ńErxgʜvuujM!Nj_Jy{we:/đG@mS;=GIc*{,V?u<VWQGRprG=1/RۼqQ^+ExWt@߹#KY�Z?(=;NG*>�I//�%�߳7/6!m<+4OO~]�<\WĵOc=װIoml��}[O,{Ov�]bVv歇[i~qr
    l{Wmlm]ٛuUcӶۨ:ko{)ar58en:e/AnNG`o:.sv_RtN?Ѿb
    _=՛羶Uc}�x6ﭤgfe^�T[=;~~u~͙{$ӻ;}u�ۻC!k)2RarQtܿ2~<mٙlVvgOao0}/r:;=׀
    F'sf[y(g}Ń\FߺE`|Z'kooݓҽYOfþzcgl^�iQf1uMrۋhc5eFF:L&ju;_"4uWOvqtv|r<6tjnꮥ׽]٭m1/dpYj:JYi}׺?W{7) n
    ]vݙ7UV;+;kn,#S|Z!㫪׺7wbu`G;yv>BwovImnx=Юq}m&=;5WMC/Fiͫv[rwn͝vgڻMۗmn=Mf#;jifT'decSgG߸ouyMK{/{-N(6w^}}rnӗk/T7;Oo}AM(){w-ODwɸ7f+z5`A�y=L
    2ۛ	&)[C׺3׺(|g�eG`/�|�JOOTѧ.�?u�~N>-_`/}�}؝;׽e_{R63q<2׻Q|uSv-_`d7>};}78}"=׻z^f_
    Ɉn7Ħh㡪^?�2~<uWwc;oZO=Y_,7WbXM~0l^ΟSo1hwz3Ȫ׺3׺,kOǍܵ=;{&ݛ3t-f:E.?l_G3?6nl$Wpms^?>zNNhln^}'~M=1]ų/Y|�ܦعmŴ1#&k5gBE/_ޚnf_';O>9v?ǵ7uWRޮ[X}Ƙe8,%\x4'FwepnMWnGtkkmGC۩;RdYj*at5>/#%7A�c�1OggUKWWzj,_:ONsow	GMtd^�o)RPoe:>Bv
    A5z.ժ޽SRttUgmr76pzLjMF/J
    ~"lO||#G}cўu=f?߿Oy<L=glxӷ{t Qϑm;7`o^;>BUtN>�|/ZmϔpucevF7qYUCWWEF�ߺ@�rwY;`;O)0药l83U,^[[su[)Epn2
    :I뢨ou~{ߺIٵhVb]Kܻol:
    ՝ڻ/#r+m߸*\l5Nj)d^A{{^�蜿ļV'XN^gh6ת7.7'شzN
    E;+']̦o&Z\rc2u׺ur㶞:)T[i[OuoLwl=MNgaz=G6[-4	b'߬ӳ:;SpbPGM;7wνYml]-w\es؊�VUICuf�5�{#ߓT};3j˙_jgat۽W;f:/xC&РsUevf2|_h}׺_atV|vۿwYc
    .][;wGanϞ\N
    ASIYZ8)goV?{NK|qڽ%z�[+?IfG}*s0{ݫdE^mjͯGMWQǃ{�ߺ^׽uT�a2VcOݿқ�.3Y_btܸ2Sdv�oj*zmՕ1UP^'xgZw_Ve{K/ű;ncwf�XFzzh(VA҃mn\vT1tۂpn͵,[ilY6/Y2)塁YSJ׺P{^?w.;i㩲JmUMU6ڊ-VȮGzn6v;y|e@)*2y:<m]\(=u~{ߺ^?;߬r@`rEݝ;:jT^ܻOx}==ulsZӯ^}}iٝ[)1{~O#ڻuu^[rb`6Sny|2pqU9lEīz*{ߺ^׽u~{ߺ^׽u~{ߺ^vn\vڻx)f#iRm=`9Jmv.qm'e\IJzJy$&^|um�ZvLgnu;
    "q5;3gtvn94Uf|,Vuc׺u{{^׺u{{^}}iٝ[)1{~O#ڻuu^[rb`6Sny|2pqU9lEīz*{ߺ^׽u~OgݙSpVe3}ؽ˰;2;k0[Wf戴]5bmmSSd1VR]UO ߺCu{{^׺u{-O](zs,6#*15L/hU6ݲmYhx00$5vvGJ'C8{aje囙Tdn=�R 4ǟꏋ;?Ov%jF{io^"}Ŕ4N;{\c)pu	*3'`2Cim(I;SPG�U�܄QPP�
    )�U`no[Po�Bn�'A
    k�VcаIoml��}[O,{Ov�]bVv�Vz1zKswnV9|{N鮬ۛ/c6>NO	jlb|v#a5mARu
    {/;~w՝?><O;C5v\L�"Oq]"gNv.퍷!;"ݗ7&ܕ
    tWXWōO	?p|H?5Wgu~lwVt?vt]|}żzk~?k~Vw?qiI^w'ܿ2wu`f/_wv螏ųOXo�@=+ssr|^IC0L|#{].ߓdϸ7ff/i/<v3ig6wM
    “)&rfN2uj^:-]UЏ7/e{+z3~s6iu9*I[#lf0NW f1~u(3:O�vi�ƽs}ݝ'�}m{.ҩ�eڙɔe9,n3u|Xһ�oS/߽	Y];v^cm|'w'9qX8IoF
    C{>?vfeKޒ|
    ?z�M0|n׽sKzsux-N˲zqoݛqNd3/a׺�uƞ)z�Mb>{'ۻGw2a
    8i^K9ǝ%_G{ܽ(''?knϔgj�%6'i&w aqygItuG_-�0oujkNnN{+wٓ~,;bm[p,z&
    �z#j8_y|O8Fm^_5;~LmvB
    t[1ⶽM5\TN{hAs{Wb_�0oTvvջ1jS^>|6Oab)w$YqTɕ1bS5J{tX;v{'q|�ggRv|O՟%._[K#aa7Qg�*M*(&V7KAIѿ/wd򳮺+>Hm�ܽ'N1~>ߔ:�oQ|Z71ő~YHoUAU\tf\\;v|ڟʃޙ*}M_\|B|Wn~Jo{wbU}՘])+vBn^,8z_!'M0*lqj>ؽ0۵(p;mVcp[7"KIU�鿉dϗ.p_mm=C:wg|`K�!�v,{~P]f7NÒzg�y	wIjσHk;{.s>9٘>?՝/ٽ?:[vLeOcd6]`	;'{?7?}鿐[?lm>bwGz[6wVO`p=ZgJz<̅.In?u<`;[|ﮠ%1)w|jj>ȟ=M{|SEA5M4X6RZM^;{w;NKyY?m{wƭv�Co"_Y?~shn'pO{|Gr�|
    ?]˃g޹`cd|ʣw՛c̦77An(O
    !0=33'_�;?"RtXux?d݁֝v6+
    'Xvfy7N5|׺RtM]cW!ӝyGUs^;}I]mw=0A|-஬]^X%5�ܛ{Ǹw]n=ݳ;j�uwnF.|M̈{@/5?R?ɣ>*VK]kнvon/]0v^U6~۽i~z:z~9^݇׹'[|v_>|�ݗד|�|N=eKS}U9޻OxVV9;Zs=׺ '`l
    s/�_{}P|k$'>/T~[ugŎ�1b1ٛ>3�u�?T_ݵO_�4;7?=}ݙ/Uw.g;uI٫K)w{I<ਢ^?b'[3{ĝ7Rfݛ
    {K_{V=׳%vSE;ۮQ\Oϻ0{za0[u�,ڿ_폏�*rYάꍻ}Kݗv..ݵ{rv_nz>ũ~�$�0Os_�/1�$>^lߎ{cߐO}.d}ٹAtcV6a)׾26_Ǡ?]'�btw\6Sӝ1?ō**?2\e?D~|PQϐKNWn\?!=m"-;odve+=ʗ?T{'Mp�EGo]~CU�I}w_YO}c_PXݕ�]Cqnx1s`;	{uc/7g˷}u_^;kdv\̏/Sb|[۽0uYi1d6kDS?G"w4�O__�'6wg�Hݯ]?7�}wx{`	ן$~.ԫ[7{|;۸'l�YΥ|c0>6`;cPL#;/{snڽwUntc+}׺,Wɏ=iӰ:3_^{S3>؟6Zh7w_?)�7jdr}z2rUn]п�FfuY'lt�-2^E{j.f{+<n{s\\97\K[i?Sw�W" ?ٚ�d�a�ӿo�@�q�~��ݏ~]V-gSGn?[Y.ッ2C;/:ʣy_ᛏ#%z=,>]ڛv/ߓ�{~
    QzSi/\F#vd*ED஦G,tlPg^^0w~a3t^�T>|Tep{R㻗>::c`s p{7M7ʼV+	][_oIf>%ABܯU{k|hڿ6NZ}Y?r;bA>;{z%޿/=vOFt=~70r
    Mˏ^3ӝρY!~(W�-oqOߖ[.{I;o(=;I>@NJ\><oJ֝G=/IOF�S|U}K�/e|v;gvy:گ;޻`KrB<m/TP`LO7EMGI�|eu=۸�ƾݝ_K|]я[w2Xz(UehR9>>׺(&KOpnꜧ?bnӰ`vid{-�)vwmnv)v߲>!gbM;7[ٛ2{uG.gqg	j7�i]] vݩԙ.k[1v|.u/W`vkX-սѯvW;ؿ=dz=zq޾޿GݻWr4ıth|jhdE>PgOs[G�3�62oܵo=�.~?Im$><loh~<wU^;3s[uWV߫G{)]^{>ո��zK`�?=�Twz}6U|M1;�rvt]4㷎�6򢩇q%6^	{w+''k[�nxouO̞
    
    ßQBL]�d[/Ql=<׺][;~߿ɇ~|2_!3݃}MޔIgmcSvTj]Q;6&-c6S{vڻjv{'e6;isj=1}Q0[iHEEUjsώ4:x>Gw.==5ޝr9zFoDz{ZLN+2 v>Ɋ{�>{)zC�cA;3�V,vѨ__z;3auqw~tgy:nd{tܽ-M&!?;XS�+?.;kon	aN\{�^خ[/Kdm׺k[vt0]i~ow�_zu-M3ApRx|{~	7]TbhBЎ,[k)w?MǺW #;�o	t|]Վyпc>,|K؛bmʞ7}NFTQdt}O?˲1?/vX
    >[Gel>q/(mmohnڵNaw
    =5~lU[?N�f��8�D�f.˧/�2��.t/Gnm]˸pOpoܾos8vޙ^:iv^ɥ1⒦djZq$֨_ʮގ9>5L?,!{WeXqzNz-?>?OwĽW\.뮣YbgU6{??	sE;]l_?�w7.vSs�NS݋kjo8p>G~;[ko|e׺Oῗ_gEPϛݫ^W;>Oퟐ_{zE0XSivOmo(�Ҧ!{??~tcܽG=m/M[?uwgywwG|;hZgw4}[qs2n|WY
    GD6]{fo+mg/�+XϮ]'/6f<u|JWv6]5N;oe=׺.b߃O5woĜWKcWQCuC ;KMtFڿxH󪥤ь{f7՝][v_3;ҟ&_0aJ'տ»K;'(|O<;7诪2ʞjŲ?w#ۃ2~B|V{}ؿ^:/ñ{5A'q:sUuv_YM63mRaiBϋGߴw?_d~C幼7VGg.ܿ$_#[쿉amۙf
    f?b+'ꏌ]Gj]/pm~I|a??V2lod>}p[pVY-gFW|H|D۝:[lWþ-]QW?6C'}|�
    *Qf:Y6nJ+r0`=fGf*{>!>c~m�O뾢\۠{1}3zvfoMɽ>/nߙ1v?*7PT&8Ƕگ.{uc�ƛ;���C��E}?;�eSN�ǿu�uK0;s=}#	׻Ǵ
    ͇~ |.67vg`doIgԡq`C͔e^u~{ߺ^׽u~~ܢqaG'2YZznV;YH0M%=>2+]긻c\:/:
    wyj�Ө�ii0&Q	rΕ$b}S˶_Ia}֊Hz/2LX".8.c*-@wgj<;IaiUflU-A+Jhzgt͵?+>["V=U~+OK}=MO~EZ|?,i{<:itӎ]?מkCzWݮZѰIoml��}[O,{Ov�]bVv�VzCc#;Wtpw
    ]:˥0Vug22㲹}9[r巆۸`QUgrx^Ce'E_w_:#xi�o:'nv�e'빻z%�@�[7%{�r1'@-p}6pw_N'=
    ڿ>;|gmm˷.}{amh鶭\UX(++0ԹOu
    v_r§;1v?pt^3]EO7LtCp
    '><؛icg#L~|7GߺUAn;:q0vOΦlq? mt`vkmllnlYM"OYGt`:պwWK>=suuY:϶2=N_]=SWߋ44U;rykuxK팏P\~k;)v.mZ՜ˎrY]m>W˖njaGQU1yu#gf6TTtG�ftN=OizWswGz?@K;�snK�c01Uf)׺7O[z;sގٽ[fc	؝1hn,~#pb?=GRRS4Mr+ ^	|ٿ)`|쿐GIz/~]
    'fvݭVهW&^ٿ;zw.)Ӹ0'|wpuoy>5ۿ!?Aw?L<#2� r||Hn6FMXqzmtglugk�}oe�e^}Oؿ
    7w�{z�wrY`m_4�İ?4)o`_6ޟj~N_'f^7gDUfX>ͅ3}bWݵ]}2\m6;iPTe+P{>z.ߐ-k0)?6n;e}C![؝g]ӟ۶Czz	NZ5@Du;J]33o=Aғu|^`;/r/pt7Tm{hb
    mNZmU&V׹ԻoZw̜sv/AXNMԣ>o1CwMYX}{twtH6oޝ˄
    n>?z^fMvv;O=6;)3bmͥdv^2}>'wۃnm :/�k?*wtNW7&][;׳~MVkn7_?c2驨^`?wV.]/�_o?Mf7P>;'~=w|M^~.*pT⪲'S|ɸ?m<ƿ"ݽ[VoNl	(?uX
    U,cQOU-5]V.
    �u�h4޶;Ǧ6_t]|l]3�nf6/{umӛ'=>@l2[/1źx4Lc^?kodwK߄7V�';y~0mwϏw;ǵ:-73wln<ή%V\J
    Ψv0O�/7./'VW|6_i�F�??06瓯߭Yy�n7ܸN�OpE?ˌ6><b3gkbf2>?$v>]{bǸ3]yA{8h+r؊u�u[@۸}�/vG!7?|:Դu_r.<uTSbi({t`?ٱ٣�f[�,铮O~?f��p_p�	~'/߅/M?.0m<EgO?M߽SUtXm{š))i齷?SQ<QI`0O,?'f>];Kb`w#iϝ#o?Sk*32ύ<.]}׺?!znw.{ç_ ߩݛs=}˽6r>Aߥy$#38^x_%?.iu>+]Y}>7u?hF*ӆ;~᧎Tf^?�5zu|	8
    yn=�+nRf;quǽz+7U?`Vvh6V~̹\~WCп!z^﯑}rۂiu^꽫Ubmc`9Jj9T){v|-{xt͗3;Ox콗:iU=GvߙnkQͶ+h1>:TZhGH1]_]?O:
    Kݽ!==׻zҒdGn^v=U⦊<EO%[{tO~ߌ=K}�f;vamؓlM'I'S`vߎM؊;Gf%K6^Pt�S~S
    ٹH϶J~N&_ۿruN�ioC9A
    gcߺHWҿ'_/(w&!Zt\|oYJz>Gn꿰X#SgS=:�|_kv|.0g~>l-M{ar5Udjmnϡݓ읹*w8+y2jMT׺O̝<_%;+wD=Y.˖n:n]ص59z;)Uj=׺7׺u{�6]۞Iʣͻiz�ievLkۛmҙݱ:iwnֻ=Kؔxjc7IޛOz�nG/[[{]b7M!OYTIiuk#P}׺:IDL2sT-Ս:x-K*u`on-U5sst5~:{_%6C}|t퓉[O)zS_jm\nbk!v.k;x
    TRL1VA+ If^郻~OtTm>N}z맺qvQu{cflv_�(ry|vLvZ2V^�2�%?wN뮤vx�Ƿ��}>˧u�~ov|tߐ{on8nyN{V
    UIwgXPsoSoL<PL\t0{^u7ܻ޻~^eOQWHn�#rll^ԛwmݯvܘij(Z:^ۻ|j|j8ݛko|
    2=]ޛƧ&^T6O@Ul.?9d6]>jZ^`�f�'�lru|O�yǹ�M׺cchaqnϒݱԹܝuVuăeO%騷_잲q8ǪcpR-}D0t/=ٵw[b]6NmٳݛWq㩳{rÇgvwY
    Um,USJ쌬}׺:wŏk�o�C]~?[ڟ4_g>?4~ou/Aw]Op.m=M{lf}/򴢋+
    %IUţ]<ʞ :ڽ='vw6zj;pfrv)[}O+T+rRSle\Sװ7~>ݟ"˿ߏpSm=nꜧMlY>ڥ[wd'nn
    野:*j^LU�u/ڽKۃa>9.t;WWjcu]U5V5eNbL2׺@R_]L˿+:e){j1[sk+ݏMڛ
    Ըz,WjbDtgtݙڻp߹|q{iZ=ս28uMuU{r콓K7LGE&c1%LuI{G>5|A+~,?ro{jMu~엣}>
    
    ܒ56{U;SӮMXcczV�]%ֿ?[:xfm=ỿwGim_2_}W㧎m^?q]`|[iwT:ke-&ݝC';spUTL<qVWCRePu߅sȽ;Obgz[uQϹij{e#jX{�g|.?swO_vmݛWݗGr^ڭwr՚v�U9[LS`@ּ{gս[-�/ٽNw']W̾;]ջFq˸;{k8ztx꩒c<vm]w.[o콓gvo38vܻۘp*h-QU[[U4TԴ<u	>n/j/˿잫K;?x߽RW6cܻpU	%5\2ޡ%Fou?7~G{aO}߽S;uv~o[ڇs]NvK1X*rج}M]*KO'I}7Br�.[=EzC}dwfpm?rx֮KC^@�,~,uGVl/פ+']lY6+wm-Xꌦ7jtTîg{XXwn_o?6_;crK:w3{ոn7fV:�/ٹzMKHڨf">/�V?�6��[s)�?%�_�q~wo7{ߺE~aaWz? :#pnU=鶶&�OEۏ
    cnooq춮}যtou~{ߺ^׽u~nju޵`zVD:A]MѬoK&0FCQ xZmD�DPi"PDS!ͧ8~Tyxr)ŊL;(q̴$JOsc8斛J4ڼlU
    Uo'ĜUٱ[nyO rS.#uƷPU#bZn?fW�y�:_y�O˞?ҰIoml��}[O,{Ov�]bVv�VzO~+?_�*7wv/ŘtmΧﮯݽOvłTv=UlWonOۃN/B]z{q�_.鯌'zxtr.v&-?ܮŽ\C9G=׺�7'ݗYoEOx*s[ө7WQm_/^'>꽱ӈq*r#2`Scv%33Va׺;_7i9.>?�|{G.;O.*_ O�$�qR$㻍Vj^vr/v|[vnYp{
    Kސfi7~~>Q8N&Nz7h=׺])zaNV�}�,!/|v.=]qv]~\;?Jg(vyo>GqA	vg{);>'|uO-!?~w/[]A+xn鞲-pw6[s5[g̽
    X}׺;yAcwpgcKw#ٙNyZ
    ۴_>r`vaɌջnmUܴ>�{g-;6�.^ۧxoL?ͩwoal_V;`n=/Uȥ
    Ի~vW0ou\n.-ۃ7U�Zumع]>ە3vepoܾ.lhEM[jT@잷a}%{;0d>u?OWA/]˙ڿ%7^]M՘;dn͐MSTeE%{t.==7O�<6/g/hnp|jݝ]]ջj~v=Gۮ9ȣv6�FWNm_yA7�?z'o|pޝ5{sjv^_17Vݙu?rfi4tSW׺O�/nOuٛ�?-ޛ+-}ؽW_qmA2z�A3TVKO,~�,}kOwg#a|ӳ>g{~RT)mؙN}w4g}Rz*^|nn返_6ONꞟyNޝrW^u݅M?#6>_6-&Zl6䞱/)`o�ͺvQm
    {g�.g|,fG{f廃-w5.ݥaSu"ݕ\/uqv�~2_>Duoݻ`؟z7om_݁׿e[ejw-T>
    {N72? >F^w;i'~m/�ŵە]GmK1jH^=>-�|])UV3mǰ?my�'O>㡧j>Cqfjtt/[>:n
    Nﭿ{+U?->Oڽk׽
    C|Ǿ7ܝٹs6l`Z{͎O6�Ѱ?Z@o޸>,w�ƍ~;uu\4gާXuj�,n쏸!o,H@{4Q޳wgL]һ{+-ݙ|GjڍRQnouh|]˃!݋ƍ}?r!޾ߖ6V}&pmr;M;K5Y^`+w&.to/~nޛ7�O;zc;W>5'J>-U?&mS{:r'o{
    S&7:߿]�Ln�&:}�f{O�WEr�š}o|7{�Ǣ�٠[GGO7?-ޟ}�x>~>/W}׺?h|
    _�>ym{!OkLx/C
    u]_hg?|m_u{�`nߖ#>??w˞{G}0:ݡMƜv
    lg^amY(s]岾ߘW|9t�tvT�6>ݝ9~Ut~n_jT~OvNȭ]9]Ņ,ۿugs~aڿ֯?{|!A6ujwV?x^]ۛsC[FLe5]6vS":|AKrw,s=;_~0|bu�i{oxm�.vܟ|25U
    MzL&v{�oE/4wr/
    ~մ~C.Cv/:WtJloo[wdXqN]LQ^��cO݁Ovs|E�(:y[ve}۰;u۽CMol�{;70xnuz&r|{t/S2N7{3
    CWu&^jb~Nm[n,�HkU
    ᵺ{nm貘zj,c%y=׺ ΞOӝ]:>(v/ϒ=g,wH,~[[ocT M:pw&+!묩LK'>1-`|\۝U'6ϗ5}m�^chVvn#7{rVocgTf*|oF�]goH@�.',|ѻeW߁g0n�m-R{tp?)�٧��d��OR��c�u/?o|O\c{|][698ٟ5Diڜ/"kmݭs2ݓX+6T";?ʓ?]l6mQb3ݙ?>2zό{mu/mu7[odgei*!%~^|XOv|7I��gln=UfnlF|xY;e�Y:\v&!Gx(ːb}׺)>�? ޟjT_0�$�oG>;w{|׺v_b`׳z�6hoe>ؘc!bΧ�oIUU[KJs)WQA:V?x]OIҟ7~h|kڲc9\59
    ӿzdfYrX$==-4Ptgt@1_m|m
    ?˱> |yޔ'}{9ߒ-Kp>TdUNkxdp{b193a׺$|]X}ҟ)?~Ivo{ꓱp4?֚-1r3T^խ&joA&^@:hA'G| omA->Yl;/='[ptVKWԦyZ
    nTľ>*Y=׺7�><vǎN;K+;9v;3Gbc>]>_wٟ Vne&n=ɽev+/GMp7I��)`|h_{zӾ�>Kͭ6_ޏsazzȩ{7iʦ?g~]|3%v:蝥ߏsSǾh{imMVhq"us׺o[Fw~t뾫$3{W[㳝g;cݳ�.-𿮻(o\V^
    ڹ]Y1}*i}׺�=ŏ??b>?'E�}y�o�w?�c?w}:@v?+~do߈̷_�.IG}[,w'}͵W`us=nf7;㧢u�'1t?3;+G꟟=>@3*V�
    z;y?#~
    vf`m
    ɍQ,ģ?j*O^l_)z{cs�ۇ�#.{n�t=Wwo-ۻVv�eSv>n�J23gv$ȴ-P|mc~(d;t�>A:bd6ӋWb^gto]v'T7a؍D[{`nC4pWg~m{h~?./I4:^?)N-{qn~{lb?,EU],&i0>�q|pmӟ_vgн7ϔY?6X)6k/?'x{3�1v-tj^@Naz?ݩʪZ|?Cwf]أT`muG`>3V#`[.ew.}#^!?{n�H��9ٸ1��?�{�E�?�ޯa{�~"Won>S<ݍ??~nm^/uWd|Ǯvkl_cs'Q,;]MUǷ}׺MS+>T|?7/Wj~9lׇ}aw.so%O
    iammc*(׺�i�_�%�e�/4��_�_�{vT=j.o=K5;;onˑ{W;T˷ۗx=ˬ0VpY
    gy⠬tZy=׺��\wRWD6�nA]߽;{ß;+zۨ7~{oޜ^r+T#Q'׺4c}apcۿGfd3iw=U};'`t3{UnMv>N<͉=׺"_'0�θ�_9iM7S�6-=ѵjjwVC՛3qHv7+u>BPJ
    :�~o>�fט/&>)?٨ͽ8�37WnO]"ݝ�ى;Ż[{1wIPv�}Pt7l=ʮ>ςXߏko|Nn?'{r6;M&wh׺wG#v�vuOr|;b63㺇utӰp	M6a|\O6&s+~bs[!sZ|
    tT8:<OV*wUܵ{
    f콫Pcem˼pO~e+rt,M3PV:-<kñ?'x8[:o/{z{v(;O/N~Cu�N|^
    �Ʒ<fܔmյ9`fI!׺;oM�G_�)�\dۿKgf�$?;||__^t�c=`�'I7x_LGƿ�PRRn_=Oܻ?3b6/)U6ט*pyZj|m<MQMsߺF�{�,	a㵶c;~VNd7ˍ/tm>co~ܛ=vu'1pح�M\oWb0t n/_%z�b||9~
     쟏{cw=A]V:{
    wv꟏5RwdW+yRW{O> /P??b?~ҟhO7K?O{{U�>gi]duV{;jJuZm-vψ-6Ώ%r##+Yܙ=w7V{{^׺u{{^op՝029P`:t#U42IDݗ{^Zj&ZsYh˽']m#' A&VURݞ;P,.0�ǍpBIǎH'=LH_),.Sdu`ygMϷۢ„}NB ߐGȃ˱VIiKjε);s�AbS?ھ7/W_y}~#\ɶ
    PKiAE4z{4SFiP~mŵq:3WU]Z\ӰIoml��}[O,{Ov�]bVv�VzC_r]~}jNH:c9q\SvvO`Q؝o1[)z:<CRuϞ퍻
    �_�#;b
    ڟ wX{>+Xt�쾬ݕ7on�nڛ)0yAfxzuV'_Il#Cvh�;nw.xSiw'v鼟)s`2+rTÑ{t9~d~,vSc3޿ϙ=hvmgve�_vكbv꿹2Y�uvޛWnv6?=_}{#=۽Ը'auOz?'v#ȧCl^sS娟pYu7�J4?�ѧ&*;1GōE ?Fh׿[g�;O%BPtgu.ڸ~ؙKԃ:lce7gdMMCٛ+Urg>O9^{�s'm�q?x�K~[|�eD?kxl_/Wh�oe�~:+_Xܮ�p�a.u�Wδ/W`uJ�lmwi/We�u{j�7'C}Ak7VZ|]ݿ&Oߛ{"utk|z׹!S#%nʊi+ӤT^uo8<J/?[K}nds=ˑߊ|nћ:&~잿OÎLw۫5]WǜI0G?(?W?ߏ]@v?�~?Ocom�I}Uͥt_?n#l|{t2Xtw}1Yމn	z�k﫧^vI6Q{�vX|qUg�e;�ؽCè^۵;vT֯-CE?hf*Kр'i'�IݽTt}ۏ:՝	Ceo�Cv
    ;j&Qq՘T娦{tP7/tV)?�PuVO>:䷟һSu�? 7R]7:-sf3X6.^߽uXi?̜ŏu>펷a'�5�N'G۟;g�o]/F'{Y�5V`?zKz��L|�L2qvpllL训]36Dn=ŵ�-g(_,3Vto=|=}�Ru�SoS�LeN6ᆲug}>[^i{vqiþlu954j٫k(~'_ދޟ/D_O>_�po^FoO핺Avȼ>BIw?;oODnZD4U4_q$tu8uy7쟊{':c>Y�nٳ|[>?c՟c[^nwop`kmVQ7.`VǶ4ܧIoGӝWoh>0|d-WYWˎ_~"t&/fa[`0ڃ;]=->/{W}O_.�?*|۟fv.�H_� ?8}iS	m௛+�)GwWik6|Eߏ{+>JUc;cf>2n>-7ƪΉfWm!n_;6pbu%Z_Gvnͫ[rv^wfg6ڻsS;rM#X9kj'WTVa`v�k
    gaw8o
    ?
    W6G~tڿ#q0Ӷ)o]UV@a0°Yij3USV{th???OOf?ҟs?A�E�[�?ͱ뭵Nݽ:do'7Z^puou33۷q$XRQK{GC]_0x}uM?^[;O:z/~?eؿ>.[՛6=Ks?SWA>"#clV3\Chw-7D緎ϸ6g(=5{x]1�m
    ͺ1;7&EC;,=׺OGƍ;pwoYvNQtJ/SΣkn<VQm.Ufv{/S榤u$||S]]*|{y)wiUݿ6uݑFo.ܱ֬>fI&+=׺0$>N퉇
    
    
    ո>|ﲳiG^VڪL&:*:J
    =GA�>z1�H2?n
    7dbm.�c0]i}[pv;
    U0YJ<VMhMm׺O~ڻ/ݯ+:fnJò׽vouM6MlA.Tj)՘u]׭i:o};'7]gƮ%n3؎y^NYީA,dz^^~+�3��+{Oz`|Vݽ	? 0[7.]v&{սUfk~e_vIL\w}nzͨ{tz7atzD�y| �ݵK#I?^v&[{pe:sj39MQC6lV~t|[w?3|;dg<EcMnYvNqvv
    \l%Yu_+;ĺ`�m�M`=&ؐu?7e
    � ̿䙾e#`~Ju�u{{^v?捸;T�?kl{ad?~Zvgq&?+_'+:66WzňDݩuDO�|xy[vFkܽe6Gmv\/lggt&uv>E>tkGQGc\\iK|ʼcT]}S�؟菱zg@nv�=YwoswA[^@wPagj1`7V.Ϗg&pY޸.޿ZgWGOP_u�$R쿍/s	rSԻW%'\g^S΢=I2U=MҦsV&`cڻ)^?_wſn
    __�E'*{/�{�B?w_lvc?e>{{dxS8*7n
    ٳ19ެ7Monfj;^kb>vpu{S>3ClIw
    Vw8�uٻ6ڻ}o˷^{37ݙvڻOjuNcp]˸s4xb(檭*jZhY]QYU_^;_z�sqنlcmzsv/Au}u7*XV˧m_PQM׻S^|aݘwtv|=x/ݘ=+zo>N}xνڵqߚw:ܐ:t`0_;3?npe?lV!2]tvuou~3Օ :st[st<hݧpWzR&^?�Wf}۟(.,=f՘.�/20YTu;wnRe3cc^=ˎޛWmo=6nͿܸMٴVT:)CMv.mJ>+OWODrDc~H^[<fޙ>U[r;ֽqpEKxV7S,jU^A>zNNhln^}'~M=1]ų/Y|�ܦعmŴ1#&k5gI>*woW�plWwO+ޛy.=eݽ'kkv/9h#Pϒ{a\^ơ/)1y+z=quzO[~mKLҊ3#.7^AzNڛ'=e7>*67d6nm:vq�;'jn>8.3wUkJv^?4սNoݍ}yw
    %MONCʿ0[)jqXu�uuQ]Wpqj]{vn\ڹ:]ܻ_i]a'KTS;c�z7atzD�y| �ݵK#I?^v&[{pe:sj39MQC6lV~w|g[{M2?-}?ku?kpfN؟vO9J׺OῘ\^ơ/)1y+z=quzO[~mKLҊ3#.7^�1O]gS
    ӈ[kil}Sv=Y.
    yϒ;;ohnLcjPb2*.:u̇/ǽ߽ߛ~~쭝ku]ndmޕ8*_Y>fN4av^A」Sn
    !:&؝{wsc][1e޻y1uk}Vn
    "
    ^{
    oFvn\vڻx)f#iRm=`9Jmv.qm'e\IJzJy$&^ag-[sgt7Uﭿ"POwau&/j÷/1}O2?cX>*mٹ=S>:>Wv|~Zdw~S4oؙME>O6UDڊl|:'cU|a޻;;˽>@vƍ_}.Ӡ؟#z;Mٸ>B�1%A޴{fve.n\{t`7wbu`G;yv>BwovImnx=Юq}m&=;5WMC/Iczuun{}ߠz{Ͼ`pdv&G))kxF9MnN͟YCI2iD�OWrk�h�ѧgx�̉�H�?g_�o�{VOd_
    ۶:>
    "0�!7F%N{kmu_@vM-GwmF3?QAtu~{ߺ^׽u~.Zd?:Y�~:]P}~.<OZ^n?_/*�}@��&:]�>_԰Ioml��}[O,{Ov�]bVv�VzǮ7՘N?`b};cwyg|ueTy.콕{ͻrXlftAܘ,w;Cy*e'@w�>\sSm�m=7-_({rd;l_]mn{om*'9$\VN\6[)#^ ݿʓz>?}rK|�:+[svVt�ڝK@dvȽMŜڛnOl5Lnuug{|[ǹws[Oia[yr{W''S㯟?uWFw
    Rgq+|Fm|"_^ivU.w-V߰fiw^ӥ
    MZcZO(ouTuՏ�{[w,}_裴wŎ۝5[^]:l,;rjgu0hh31^C�ˍwgqύ[_r}%=pff*cx
    uMvK{�u�/]7Ac<)`kَ~ovEmSo?=='ڿ}b<bQn.c?IL&{W|Oq<!CO>a6KNsy}5z+NEkn蝇rsKdSeh8u�Ǯڿ:l\lMݕXՒڽWod7-vVn
    F
    +e+tX;G}SYuO_'Ns;;wNgxߌ;rӏvCp|d[1\vߣ~';$I;{t?V]wV||_�%fXQuG
    ܸ_e{CT`=ssT1y܁d?р?vMo.>
    pϏlm_gqw.}{/I4ʬ;*^?7ǿ~1lؽޝ?ݸ{V~9N7{_n۫zm۷�ݴivTqlj/u�w'GO3o7̿7{vq/}˾ܕ}�f#76A^0K$t*u^@i'OݽOӴu;1՝CzZ
    ]j>0xSTkftP7o^O-_ܾ�:Gd|�J~,t]1b鿐/y&Sqg6ۓ[
    Sۦ]G^,󇮛
    �G	z[lcݰmY=#6J'swwz)k9~~˰s+ޗ
    .ỗ߿+,hw=ʟ'vj1;8׺Pm/#MPu�gvoW|7-Gƺfߟ,g�n]eTJv'Hा})tq1׺՟
    ҎۛC_ώ{sODt=g67B}Ӿ��9<qՙfLXM�J�{7-=1׺{;z]s}N]!5mM~W\=%=]6O{�i'7A~N
    Ocܟ%6W`6`V|}6X>ː=!P}׺O㴲=я�]?vO|oYܻzj/;/7sꞪ?(w[4};V9	L]du?uoum/?otuoQs=ˑߊ|i^잿OÎ|-;5])Iǜ5�ors?9��n㎫ݍ߿)hdCD[r)v׻C5mm[UT}׺?�!zSj.龲{/7SicwV7jl]ÐUٌVwG(٤:F	4m 8{ߨ4? >*!Ah:OݘkꟙU[;MsݛYmۘ|{a�-��?;.|q?麇Rf~U/.[
    5o_�EsSm?u�S`B|JuӬ߯�Hb>mc�:>LtWʜǼ'ŜG]G]+_Ü]dؿuW'^y`2[wQ~D][,ۿgum|S˷p6_Ϟ;EKLCQTb}׺&Tz4)) wvBgv/_onw.?K6{k2YF^)|�Kznػoþ=G.sgvDmjuW_�ȌRa՟Ki||
    п?wB~3o޾L?dPLtPڿ93e}hjCy<9tS!׺_2{gN|{ߟ9z�F�M~PŇ�_>NbP~փMJ{am,F;W,]yrq׺(#O>16ϓ�oq?/^>umӠ3?0w
    ~uL-g6owVRa)}׺6O>"lu[g,y۟ӱp;սC:͉p|<ѥeglJn.<]~.lS{?+�ޟwMae.n
    n٫ܿ
    ;[q�r߿7㦇ӮjvO6OV'j4l'+CO-FSi{A_//�E{_/1�t~?|s�GC%�SSn�.۷hf;}}<j�G|mݸ\.vZ<{b?I[1][Oh;Ǐ{GvoV؝;4]oP9jKr-u~G/=:g/?qOq:G[{3n^l*wܻ'7F(SS,v*ҟ
    Wt�O�
    e�
    ͯ�'�N�W&}�d˯?��sQ{>oi6&{˯i��ywwV2῁uw6_qrwYI̔MՏ_""|`O{7V7jr;ir{~/9:T4�~>8ߓk:~_:ׯ3g#{}Ѽ簷9co˽Fo	s{~	rc1uD/_|�s>O�rG77�e?a =�u׺_.6^ݸ~V`ݵ=lW|GWwa|_]ՈĤ,lK#dr/
    l_F�_�?`ew�/UsjoWߏ߮�B�y&gan-ɟS�Ou�9>8ݗכ{ӧK{uTvw=ߙɺ9wN,~ߛjM�۩E.䊦N_^bQS묧eww
    F9UN~Or͑Uy|;poj6۟)eGs[j!ZuߺT[wUͮG6_O{|&ﯛ]{sc'\﯏/Ʃ=9P=q)՟|MSnN쾔9MUXݫڛ/5wCmWf1YEgfZhUX&@ѷU؟'~Fny?$>0v#z6;h|ޛ?b_Oo[[[~kw7ktݓ>ՅݛfZzLvooE=]_^-.;'DwݗPEOq:7|:n>
    R{StO9#۰$T4Jt/�3zvo:X>�Wvg'w7F3;	ݻ'Unm,KApi>}׺[6>s6N|}.]5N;+;;[[N)0lcÁuu�~O_%7?zn=1ػK_on:Ϟۿ}I/;Fؖzz�ǜ^`?b/Ne?#p]Cj[qaڿ#ҫ'^jɱ+|X
    .
    {t嗾~E]vG ?!)*Mkr3"7�e{;7/5$4{ju�
    ]�8��}�Cس]+�
    ��w?G'�\^׺/,~uL/}=Keп
    :dt߻6ڐr4X_+ޢ6~W
    ڢ,NЮ6Ln*/uJ՟πݽ%G®�g>YK��ŽޝU%Qm48y_=׺�w�b��G-�3"�yً�O?{?_�k�OuM6ع7Vlû6Gzm\S]ݛ/6/.[jkj#^vGgX~޿!~v	⣩~%dz{jY_H폳2%{;mNٝ99)oC>w7XtOȾ�In�DX̆WWVo-wnCJg~\v=οerӦgjmvUIWSul~쏈[t|�L}ax%?]t�"(+z;ݻ;f\waU.g6̴O׻W|:'R~>?G�K[|L�foDxoӯWZq+y_Y,�sRu�}�-]On|NϹ�wn\cWnd>>|Mml's?֝Mr}soLD6~1}׺?`m\ͬM~n\-?]Oi1�~OPTNߥ=-"۲ooz̮mgE՟mYw-&fgnٶ;jT꘶gr>Y}ٷyvze.wS_LUnQTÁR}]՟?ο%�g}}qi/V|۝a;#gw6X_"JݩY]RkG=׺k-?=;Ƕ_>?ٿd7'+vM]?,wt#inݥv]Cs;'6/70~�x_�2i{9gj[�Wm~l?"GY>>`VJu2o&zWP[Wv_EOmvRn9/ox�~R|ܻ/Gvu<[6흑YqWV.n{v3OA{K�-O
    Z.ʯ?n-�u+_,[Rgm$�v!
    NO-lG4�c__�)_g�H_b���x>{�ߺD0.v{|/}?ڽ	Ѳ7StN=F({+zOݠ`l{fLǷE>CI^^׺u{{^׺	]r?uG�?=(t'#^]2x?XǺ^U�3=Mu$<}mհIoml��}[O,{Ov�]bVv�Vz=ՙmջ��O�w�q/v{:k6nݿn^x?S熻}|vM,):N+͟JmoO{n�]{NLŘ;[w]On[uoz4O39l׺�7'@Yo]E:6OG�*͏ӶWn_/aαM-ӾOdjwM%gf0Q}׺;_vl9.u�2 >9t~̬ܟߪ^ݡ�c">
    /{a:?05�lT89DL>w~Z;
    pnͧW;kz;ܴaA[j1{{A6]6IjS1}׺c#f?9;t/Z+j3|?Jmόz|~߿ު/x
    |XV)WzL׺0Lw|}Cx|잃_僎Aݻ~svn={(Fjt7w-N_hgL
    j7An^Ewd۳ӠjmS[3pG7/ؘkq>ش.qE}Rcaf׺(v?t[{oݛwT.UuevJvip˗dm}EK>nd"6zϟT^Ͼ=vvG:1Oge6}{WmdwwbjSQnL984i[HM<^ }{M.[=v�Aiez�xm/?�u)8T[t߻z{9a>>|/~6ޘW[_5{KoUO,ǴhjTh^t~��WK�_zu3WJ�1KSj?z׺+?4;kq/A]GM_ƭT/dtOU3)ݳSTeq,tnό,Aw\n
    uT�/{ٝz�puFvCji?ݹiN|nYjw555~g SGS]р=~:n>m?32}U;jM+{8poj[Mؚm=bk+f/{m;64v�\o| ߷;w~,]%׿)l͇WlD잩ZNOvvg>;g+gW{ꏞ]ٽ~dz5A�w2{wm�qizf`Y7̽?\zr%2u3{tϜ+fsջ:nwʯWrMۗKdv]x]ް뜍65;}*h1u�7ٖ?}-̟O?v0�
    X
    ?e�;�v9UGKh`
    A}^@)'b&7̯
    {-ޝ	ؽ?Ŏ�/7N֠&8�_?4TR�)pwK+[{?{oᅬ~!܎qb_čCs~5f'wn>ծNE.XͭA׻0=˼s2~Ac.cfٛ;Sp|غ'�OOƌFX*}^`__>9G?��][�V|�d��}۞wu%5/_{d<vuFߟ$�tB�ƞ{'b۽:9нəG;7ݍr*n[ű'_{ugݱ[~]ػfc7؝2[wgm~_pe�mEEGUVTxC2^~B1뮺�|@|v'Ml�M=ƍ_c/t_}i~ŘV*[⠪{|�3N쮭tp`#[|<m-=^M?{/nn
    ]WS1f*Իb_uܺ'JNMOɞ~ڎ񺶮i]$!ٕ"S7Lnv}3A;%>(7o),?@|/7^vM?cqttw|6�<.O1&VL=f;&1$}׺e�7?S'un_fO;+��vz�){?Qv~Mۧd⿼y(^On?6/tvv3DԻ7yoH;�wt9䪧mڔ}׺{i'{ϵ~?~X1[}-ݟvuc�ۃrY?:Mymq+F>%ھ}ӝ)OzR~uP,QuC {:Wk
    mK,IhsPUOc`WQ{tW?gŏV7ˍM6`l5-d=u՟4`wO]ٽKz�<vޘL޻W>VӬ#׺S�ކ݁:gomD>-ź~_˴W[?f\o.EYDۚ6t	^|.vӪzo-[|@Camp|u^4OQu�uO�%ǻ;ߧW.O7`wo_;~<8z`_:[zn?ۻߟqݿq9h*\k'޿L=lT�[|]~DZ߀<5ٽ=v_Pڝ;?%tg}dr_h<+6׺V}t=_ٽ7_O}ws.x.꿘-7˲w,XLewU
    ޖzTq
    ^ݥ;?Jd^͢.tr}fpޟ wmjm--?belS=v{ug׺,wƽՏؿ"]`zVKjdrzˏv`~/8ZJ9W/�~R�΃qwfSٽc�'zosbGnGqI7�2]][~k+(k)fj׺2܏]ϼ>?{z�ji'O6ܻ{na;RebM6v[pmQ{t0ul=W708κ[vu;bm#jt
    NaK1C!X޸xf+^@U'g|�ol
    a�ۛW;_z4wOiNK	>u`8zuP^qSq|qyao;{_nzwN�L#SԽwgΊٿmoi6#X׬
    bk)(^:yuopv=ocuoYr+l#_�pn,;{ʊKBl.k{pmq|ک?lvlݨw.
    \ޛ#c{'p)9O{oy'xNsbLFpm9-Y}YYt�_.]31Nۙ-ٻ?/2�6"hi**<z!IPuT4C#}5˯w�ll{WnO=y>HG~unثۻhG*q[-[}h~",R.{6~؟ ٻvݩ;Moos.˸rg>a͹7̓lnO^o+x큲#kv�(8_~4|nR^8')3?s]AI?�Al鿓[0.qכ/r.{utLݝ[(2m~ܘ@97fg#¦~Ou�ir;jØ{ae
    l]Sk7V1Or]˽6MVە3l|[0RVUSuY?}J]mw'{﬷M*G/tm�zSꖭe#.><}_uv.쮟!6m<T>{mt}w"|mE{#hl^TnUd,O^oѝ_$ogw&׻#gw[Yߟ64y
    &C;gpb6튗װ2g̪
    s)oSg{#>mfeOFYGuڭ&we#׺6@.>ޞt|^l[1v/;o*pmKCN;%Vk^n'Ǎ�xZ/_۝"l]71hǷs+p|1=7hvTy=AYuߺIM6ع7Vlû6Gzm\S]ݛ/6/.[jkj#^X/_΋x0ݶ?~|q7XvX9fak߇JꃷM]Nm>YK8ϊ=_$i%쏊㑡ڽ>?$;Öݽ+
    Qͦ׺fS>]:nw7Ms;/~gm̻i+3~;U$l}^:G|޽MCkwm;||=w	쟿g]|/a;=b܂MGcyWJlz*l쏐�/?N=֔uǷ6`>==Ӳwͬ�OU(W
    E�e7Go{^?qv_y{ptw]oM;#Fؙޱ=o}+mE[:gTJΔxmU^fg#68}7_9^u;VuoL/S]C^ܻ/d
    SIbqIS25]e-8t^q�cr(!ָműzgT[S;ygb6]w\f-GVz⤧{!�;λܝW>u1?3'fɪ쟓}q$[~/}qU3ceqZltuxϚ^�wic?3vOSRvqG=)!=}}g'pUJ'a6a>ufc׺_}g[z('txݝWwV_;
    .;/c|!?r;{
    [EvqT=ݽI]^@ܟ̷Su|r?��Ɉ_|`as:mڝ{SlNC#ܽ5=)6}k)Pa2՛nѠ�O�_O�q�8�3�_g_�ߺC�ujr|w~W�~Ń7w�߻~	hV?o>[M(Փä޸]ǖ;ug׺u{{^׺ua�\2Q�h�OJ?.>�oj�WL'/7Oqo�B�Ou�dc�ecְIoml��}[O,{Ov�]bVv�VzGO(>R^rGptOY&:k1>_ulLvhcN[kE۳ᷖq4u򓬤]Rީ'?f7fOmɱ>Mcw6oTSNL%>`b+6gb8jad=׺Oo[jdnNmz3/3~A=vuܽko7{/|SnjQ᪱~^N}Oed]
    Ycw?:mٜ~_Ow,x}ɲhGX
    u�ud�+W9ֻwu|`쟄}Mxmoc6>龿~ܻrnسwޛ掛jKK3U^t(:Wuvenٛ6냦S{?֝m_o;)qۏkjwWd1T�u)v]m{:Bh^p5/&;qE1gw�OT-Njubmpn`rX:׺Twgﮦ�fmY㽻rlO}>ǂ쿍7_=	OͭجNr4u�SnN_oV'�wv'_n8/;!OOUuU=sK$}׺,oz|؟.io6靵/MRv޶}Stwnn嫤pJY,=<^7^v}7ecd~]M3Yg?;bmu~#O},}վI;Fouӑ}?oaK|yɋ]inychv
    Ms'gt�P㖳g|pb2JqS$
    Ěw}m8>J|~8q>jU,N/&Z⧧EI {/r	il?Ҹuˌo7dow/hM9ag;rfj*d%{t w(;uuem^}{v6uldz?}m_!zzo
    C)-pۉhvPhuWvvFg:?;Wޡo\}ܝݱqcp-Dze6꫖;=eK7k�v)7Wne|.^`w_Reeybv{!׻/pM};;WS|tu鮢؇i1_wbK&uoǴojQ?o{ll՜S?;'>?ot_ϵr;1}cr$~9~5Gpwtݳjjv$u/-^`迏x~	dwq6ėhTa:ìo_zax9[5-$ۃ=e=׺S|I7?nOwݽ!gVoNl	�gne
    -,tTgQQUM]..zuvPF?N:oh`nwfl}�*2|NN}Ѻ3Yܮ[+#,IJ̧ASPmÑ)~l޻'>0tGn <t^`쬷Ŋm;rN=ߺp;k2ƺl~Ox~
    Cwr>wptȮ醬1]OLw6e/on
    'λ<>{sidd4c#LLϺ^ٿ:e./3'cpoγ=5_!@?sm<# ߒ|Id:MX1؊4{tgcv'xgei`ev<ű;nd۹FzkXUq /nav_rO55wU�
    静wĊ?8-:Mѓl*}qs#({u彷7u\?)>OOj||ػޖܸ|JL-wJ͝߉]cc7i+LϞ{AUu^韙]蝏{{+;q/a|!Ois=>;FvI*j+dtUx}E{t'jr	}//O:Jγ{n|xc;9
    O_Cd荑Y.b>튧l@xird}׺I^vbޗ;spu:k~n޸M]^-_kpS_M5xw
    nO3]׺o~C}~`|;3}ٽp]_MTwo[u֡IᩩnegUe${t�>d.οz_`a:=D뮬_:wb>9�3(rX*{t.X2z_/jn
    t�#7`tq|߻Og콭vl~
    (6I|n2yƜ%AB�'Ng|./ku'Vw~'uzcv^~mFh-Cisr{t�S~t4_?>ol_7M۫q.w_=Yq}rGc׺;vV|'non՝қw.�]h;|ug,n6<^ɧ1
    c}׺0r?��?b�O@ˋC=/�v{^Gݽ?6n2/{#{zi7Fݨߓ3ql[J}ߐyɢTI{QKڽ	ֻ?ΆA�51[W0w;n`7:㵢mn{o!6KY]곾So]۩~o[S-s;Wz.Glm^ٽx/6MM犒\+)MU՞h[^?�
    C/7G:/�З?�Aޟm�g�B�/�t�K?G?~ٻ&h;KY{/JuO?J*Կ6;]$MQfz׺=u~U&p%>@mOW:Օ[3;iǜퟰ6>㙧;1U՛.G^gšW�4>_t�P6x:s6(GŎbP�nJ^Y_M}x#+O)]#flNݿ1oUꩰt48秗{A~*n&ؐoplMLw	:n�wz6ۥ{cG-*r9oA�5_.s;d)S}G}m}?5]ka�F]ո
    ."LMGQO%HA�q|_v̟�)KM՟&6& `lۃ{v�f;7Թ>ELyɉG�pV�->R|'~OڇK}ܰw$=[S_7<>Fj
    $x7u@ͅJ"b׺;ջzS_ގ][ػkc	؝2[Ow`܆#pb?E?PS5,r*^Ehsǵ�k;�9m�Cnq7Ğ|*>2^N\69ojG0ii׺Po_gVߺiQnY	^m{ww|ֽ?J	_VAz;Sݽu6>ۿ/O޿1v{ :nxӒ_-t{B|q"
    W_"{C9;eRケmz{o}RRm=?GS>gwWWK{u׺K{buomwYVSz|[hv­oXbWc*i鷳oI^u]g՛ס6̟Nw?;_][(g_f>?۷~F("mL{°hZܱ+{E.kO�!]3%ڏ'd؟;O5}Oջs֟vO*{v&n32rU~0c1{gs�f?pOv�N'+�d�g1>׺,pwLuϩ7&wM/t_q|j=Մ?`cGͿ?%FݑRu\Snf3}׺kUuV|s}aGoK@;kczt?!o_'CۓY'+[h}׺8r?��?b�O@ˋC=/�v{^_ݘlڻoafY|{imZղ9LuM
    TmoMU6LYEc=L(tuTH{7q;W:w?9;x+jmڽz\v[-#C;m ^Ik+Vw{'>ľo\KvkGMavgPziGQ|7뭓SnNVco	ž
    zS
    ;GOd;Kq>qtO-8?llܿŌ_:c1Lw\#!uީN]YD{nʯ펀=o,=GA�e{t@>B(^O;_=vOwvht;}>'l]>>SQ�/~]{JZmrbs/uMU{n>� :J;evwtqY;f޵絻kzzvR۵h*<M~V{?0ǵw.ݿbӦڵerٶ7ޛ&pmʙֲ<-zQj̐?U?oRvBusw?7wnjV�ۘ
    {'rwNh[[6F.1wAMWn:LC=`?װ7+6
    𫽷7n.Y'_6~gyVS+drOGP7gE{K/﾿m_G;_2�|ES/j:I4͑>ީN]YD{nʯ펀=o,=GA�e{u/{#c;~_fv=Y&=z/wb�{FH0,(
    UJu��f5|��@_�ŏ5/P��s�ݞ׺uX?B(ϙ=;K=nޗN迏:7Nnr J:/y�cj()9sY�u{{^׺u{#�kLT{+??cҏgKڟ?'K�qq{�]��#;'XAsk�vװIoml��}[O,{Ov�]bVv�VzG_#j?kmwfڽܹvNyp;K:#kZ;?w	ɰWr[>aFbrRu
    -O{o?7{~쏏�5Bo꽵p|yoqaoΤ}zc,Yl?CI^z_f~#5{é;{gvf|VRtsl;p~qTն&рO&6�̝=I]I�̯m~E�oM/G	?9>ϜE]44]Xw;jz'Oj]6Թ35o{Ǡ_+6dx)'-|V~GLeEcR,T[?:E?[uTL?(?^/:o_k6_Ýv^cꝳ1Ox?pvgbTv%qS)3^'{ws(6jgN�ƾ>Ϝ4ۭo׻󤷿Oic4,c؝_"glTC�i|۽;>@|=ػ_1s}a};)}~a+VN_odU[oc[tQd0/؍3ߐ򣴷/|靧ҹ?U8~ٕpUSs:Y�wŏ=׸7p|^o'Vn,`uݙ<ZaKG_rQt|t|Qլ=׺f$.'Nv{pN_jg@,6d%Jgqy:FޚX1TUU{tP:W|rzsn3�JݡԴ5{'__W0s{sIC.~m;6ٞMӸE/u5O�q@v?]eݝϢvo}/T_&_rldo2[{~L|E7]ocӿ�Ϗ{�+N_/+|x7ǎ�;W4m7H?{Kw,W`3>�/_~-uoowvN읓3]؝sYsYmUVZu�w_{~쏏�,~Bnݵ{s{\mMJ!:ʏ
    \C0l6'2t{uX?OzYc?ÿO+­t_s2;s?k#�Pmۂ6j>CN*L;[{^zoɍ'eyw`Umsgl{C�0|WQ~?OۦWS
    o\}ߺ^؝f{[w~@nU;K~f|gwn;{?m|�͙EE/oͩY[>*`׺�
    s*o�yl�olľuwg7̇cg#qt]'|_;O>r t |ozp|kwNШ]tdwէ_^!"~?w6pmKM-49HluN;{?9;/~:ױ>OiSp|߻KrWonCo_6fWklΟŸwhbN
    G-}>77{t�0]8jO#o{6i`m;]|_|`
    m=_CY(>נ{�˺|?:@mOu�Wίֿ
    +D��I	?yy<�//ly*Ӹ~{k}wgBl|�Ľb|@_ߕ6^oz%u>ۋxkઢۛ;n
    =׺׵~5x|X={q۫%zeWEU]GM%K"<(ZE^~U|bo3o{rmk)'�WO
    ӽ/eU5OV
    MTyumSMetto~/.^ɟ?o>OuO{3)[yAmֿon�EuLn2MYea{]�4mj�":熯~ANuOm|?~1wřntVޔdg}Q^�rXu?>~Si�d_3�v\2� {;OqIߏ?'/=,?�dkjWaE^�y3M*f잼Nm׿'>Gks~LnTl?;|]?{;6Wx7u-͆Rj۵I{S?#zR�_%ӝzT|ܯT/Dn`Tmplgۏ{H2u橳Y1κ۝w?Uz;FXжS%Tv?l`q݇߻3*7IYIڸ
    ۄSug�6BNڽԽI͸7SGa�fLmt}�F5}\5S׺$cꯏ;s=czpn]Y>zWn/Pw)=ogyCVe;{Se|]_{�Qh՝�1.;1=uֽw_Nl&^
    A{d:]ju�ٛݤٝ6ҝ>^ڳkk!gN_6}>2]TSWW K�~k'GvjAwɞ
    ӟ˚J\_7l럈{/F_:xg2'M-UG[l6C!@[�7?ou|eퟝ wq�ʃG=q]{op&;3cd~>^ީ흀?uϨP=s%>^0ܮ^߾0�0~E6ōQn
    ݟ0^쭱RvWO ;'Go	jVfi R秩E׺`/}&wXo`uGv|}=/Ix?xz7[Փ^u4uraS6^߽tX;TOr-KiSV<ufG+!:tjlNJ4.&!V
    gZtou�uft|�yO	|{a1�.jLv]�.gȼ~+c|A;rlPE7\A7B>:Wo�o˂gIۛ{nqu_R綷
    ڽOl6gM{]vbv+s?'6c7bwN[)ӛO}A0&ݵ/nǧ%6j&~s*n5!M=׺>|/{{:so~Xmٛ#]wٝ>v${+Y8]\o^ݝxN=v[g�K>݃avfwˏ}!{?񫽶OkmS5t{1xL<yk�+v|2Sֿfn[57ޮJ]Y]S_Ytj*Ut\b1*:7&Bu͵׺�~Ugs/XO9~Ug]׎Gl~{ҏvnox;~Lw@
    X6zoei{hrn~^�񯠻^8KY-{/5?mP2,Ef`*:i*YYB/Uwm0<^4]�7+s:^ŬEWIS|f,7Om6c}9n
    ΛOm籿|ߺ^qدcz󢻃۟{'fC;^wi|,6�Oˈs+m}r};;vο�]NJtz�˷u}7y�tvo`QWmnˎ][i&6ROu
    77ńA?UX#~@l	~@aV;]w.ꝗ9LYn
    ,2	i;wUK{u;js{Um5NOrwn69o4Y:yh(ڞ?uc]߻[r|lQ/pvJYwG6�b\]йzr�ʳ$K)S40dr>(>4#{	+Oۏo�Viu޿);|J˷~@vTCbV�Q1XvW7׺7|=pn7ο볺h_�Iydk7J#3\|\3cQ߷WߺI7L5n?v/O|lؽ/܎㝺Cmw^ݝ[]kn1
     YʣR(cZ;{�]�2ݛ/_I|`˵{ow~Gmm_~0|_muܛ2x:m.iw
    u<~
    _a5[f|
    {gF~cgtɌfIޤ;~m-93&C
    ٵ' GA9Z_u
    {Wr>/6/}m:mY^G)ݛj}mjܩk(aاuɰ+W�?C󧴶w_tBj[7ɜ~Hl	r>"�0ّ.{R^
    ÏLu
    VCr{us-{ϳk|dFmL^}ϏJm~R|tgVfw'du>mWZxn|m8׺`ٿ̃&gv?Z+ٻk;&v]�#`Q�fwUO
    :1^?iq_v{p|[WmVu6>5
    G&[:kuVk~K۹u?#-Sŝݽw˃g7mm^7M|}ݹz'	Md
    ;4UnL4WoC
    ^؇}M}׺PM{&'vBo8?=ɮs|/}ɹ�guFP+~ZT{Wr\6{ڗojvvݛ#wuAoa.={)X`U4AX{uH08^ION\:/X*r;æ<a:=?	ٻh>un|交cݲo\Pꇯ2^l]?C��߽];O=O]nM;>87d?!W.Z<?ғbn2MMٹ_O]S`w'Mwǽ=O;b|U|lߝ`.Y٪k6b,&3?e*3>w}K0n1z|9}N>!|-};o]unf˽fjmfn=׺o_gzKWߗ7-Ȏռz;1;ֿ+zv�>jmχcUOuDoi�?.�Om�_o�H/��ϫߺC�u#]}k~O1w>x?7Uu�dvkKbwTg/9C[d7TܫUa׺�~{ߺ^׽u~{ߺA0�G֙ΨV'~ΗTD�7ߵ?˦O֗8W�{��/6I;l_\Z�ݱ:аIoml��}[O,{Ov�]bVv�Vz'.Axnڤ׻{>?⦅�f{z�sؚU]NT)=%yIRt*>6#7mn]6Oʿ`adk鳟'v`Hݣ]Ź19_fʺyj18(׺Po�_#M;cu
    ]zW7I߼g7s/N_ >?*,R'qm~;=GICY҃r6;pTodOyt]Xn݅ S�jvL.|�7~m̈́j碮
    �~
    +w[�}iS{o}AUC|Ouuf=q鎥-㾺�Ee6ݡ`pu)0h׺:/Q|u'`d	ߝݝ78}^Mjk?avf_
    ɗ&))!f^!>1u>v'`/.[ݝ�}}c6w]e_{ROrI+?K{؎v?*Wln#ߝ|ك#v�ovEw7]~+5+*^=v[bNmvc{Wnc{mm`G
    -,1SRDD=׺,;n|�MKb|[	fv?6z:J>u{n
    vb!RWͭ{mhw-O{`vvϸ7f{O=5{�1;7&/[];,d=׺W|6{W~=:Ӹ;گimaV^c}[k}RW34تf}ǃ*1kEP_~{7ސ8~^oݛ&>J
    ՝[}n˷~Ahl7%nh*w&V8d{�e
    
    zOոN#'GWlܗV࿿-|VVYf{t w.֩ZNn
    n
    :w;iDhǎno[ۏ|[#UMWMK|NU6os)vW^}'~=Խ;v/Y|�J,^XŴ1f&k-
    g^_]|ߛ>?Թ
    $-K}c7f"*�gm-C5f:T)׺Pm6rgn
    }vo<Nk3['~NYMϜ;_rnӾ6C{#񟫿-wo�!*зVnϳ;֟vg%Qu'I}1w׺S:m.)vn˾w�avfoU`Ӿ{[?km^?xqZu#~ʼUf;}{r%7&R+#Vڵ5c}WSs9,=5m{UTb9JJW){��_^]cj~w]5.Go*hl_;'5;;i=$۸jyJ|>2*_u76pS1}?ҟ:~_|n]jl;s:
    H2gr]&5>^7{~|xM흸*7n
    :.7Mona�;C}c>vpu{S�psm|IvW@w�u|xS)
    ټ8:Mlfi:k}d>>u7pv{>sl|NɺN8uٴڻbﭵޛ3ݘlvڻj<uNp˷՘+&Zji^)QOD;"nˉսޙߚ�5ٓ]>C>Bwo_}܍v﫛?AJ҂uU^rlp&wݴ*WPLrᶮC);7vS{nI*߮k6ub+6ނd~
    ۰q{:wU�n^|ai߻>^Nߔ3_?vbmNYʍQmjrearou�c6ٛWvu^qm3j8m|O]uײ.{`#MMW &٬۸jd%^?{cm~ݕ쿏}�I�6nm}�v.myo,^ͅu_�Xw
    [
    Ϙ/Vo-6u^gw@>._FcqJYvO<V5i}׺7._#fzwVl?;1UA,J`[Փc*몲vyL,;t_�fտ].=uK]f6Nw0yCcw&Rx-u<QTR{t3opuY>ڛ[;:vRTRY6n^ػ;3)ߕݓ[1ǰjvF[o1m`zP|3<7OKE}zpT?r},~q
    ^t{
    ʨj=irLegBl//ّa`:)x|̎ڟwŧ5w;j~la.9TRdrTt0?���e�?"/Xs?�f'+}tWog8Lڢ?NüYwV;im^ݻڛOOf_7#7n)5.WpdkKc{W�6Ou`f�Coo=QKe=(Z
    Ӊ;om8to7{mwj;r/v_;!?s}v&sNc7s>Gv_䡪SQt	()׺67OV?*_?�w:�D�/@�e���uW?{սizb`i/?Q_1.]ٻ[)ʍbRS~׺uWސ^o}?8?%v:~d"==C6uNs+]C8\{1*+=׺�w�?:kG�{C	/6�_l
    m^{n�,o_=e={cr1=ݓv_]o}7+{꡷v_3XL΅MY"!_u�JtGY|ڹ
    X6spUnչw�.جܽwkv^mYvq47CKOސy~^l=ݛ{?&>J|Ղ[?}mM˸(~>vWSo7f6nakvVUޒI{�{.{|`;r}?i2?*W6.|l3bȶO=0ݒnZlB0I �.}&0bwOlW`\vͽ;.=xyɺ3\2YѿݛOjݫv.[zl;Oxنn=6Tܻ{1MY"jZ*etH6s{z�hۘn%}|.^ͬ{v`_6vU/^_3r>_�'`ncJ}ؐu;S��{'%"9JfB;uNlT/td=EX~A{h];GnXs};s`S;Y=I*{A73uOitU|k>;tNiCuw.՗=X<FEޛeb;m^ڱ0f=׺~V_'O=]{?^Eٻ){Kn\ίN}Ż'ۻwo;Wae)rԕyҺ*]+=׺1˯'j^R;^ߝzK%vg5{z3]ӝn16+cYϺ^uU=ypnGeܻ|oo+~ϑ>HS`O|{Gۋmpd2uTeV{t�dG?,�D~?I�O�!?٘�J/K�f)�[?o��|��/ߺE^魿ӄAڝ�/
    ;vܝ6�ku	GqX]ݹ0f6,r8
    ^`�-/~�հV�~4m�_!>3vΗۑm޼>	?\v.<G?K/Zu+?:oɯ_�\�Im�2'"�77�`¿>gߺBXw.T
    <F{ul-Kqu;k}l\/pAMTE(2ꐕTG ��f�CλW`9ڽYMǵ~>}Խ{G%PKAq9mGm!ty|n=Y�d.]ٚx|Ղ]X=#/btʚݟ>{f_\^>w/*{ؘo+z=ҒO[~mUc|Ҋ
    7^Ag[=2ԝ�?t?Ov6Ƿ&O39Jj׺$#7TMuWƾߛD펟ܟ6ؿ47Wr﯍YyEl;n-XiV#u썫zL~ۃLFc{�~Zn+C{:OcJaܽ=A{;p
    X*߁vzF>uٶj]xٷ;k)Wf[Tvع^-Peq!*)* 9W{A��͓iw�[>%szj}é{?Yv_J&ts1Ez/&C^?�'O;1ܹ-7n�E}otfOGn8ݽ[&lǻksYݫGPb(18j?uO'�/ڥػW˦{
    6u>b�gnAVo{rp�+n8v%m(fĘXq{Ag[=2ԝ�?t?Ov6Ƿ&O39Jj׺O?۫w?n[d;17Y|}7_haj&M;-]Z&{Ή�f_7/�6��G�0?܇?_?w߳{�ߺE>|xǪv[3lRnNڽA׵VR9l^[dbY]ٚmޅX׺3׺u{{^׺ua�\2Q�h�OJ?.>�oj�WL'/7GqCP7�Fw!�ɲNb�Ă珲ѰIomm��}[_,{Ov�]bVv歇[c/F~nnmԿ;1=o}ɷ7VKktVߛ/qu�f-n0̞Kv5#*;=Ci7he'Dkl}p|ص?�Oho꿍�+d1=^|�#{[yMӓww&4{tH2!{GG�<??SfKQO`7fwVtkauO}ú~4lF߸M˱th(2ߝ̞.
    ~o�>(:?m/0n/
    _,]s}c_Vl#']lњ^~wjz)0n
    ن^ݟj ͇ݔ=v|]d&9$YXdӜ9}׺ߝ?:Gݿ)o%'}69Q{=cVO띚syC8u�߿T={�{k|Ro^FX;>Qu_O_I~3d
    :+&#f<Vɦ2\i=׺n޽SG;ek[�
    
    m>IoܾLϸ+׵8|~dKTےju|-m�f?y�>wGɏ
    x핸m>]w`|?w6؃.._x0ۿUuk�'#ܿ"vc{n윧cn͍zuoꝧ뷶]'75}nb53-%LG+tYo3wܽYt�ȯ]nK>⓬;nwa㲟gUW5%5$4}_{S2[_f
    gS??Ll/~>ufQ3&ڻ_rb+#|lV?;O�ٟ�J]ѯ~�eyn=͝�K#}p>u
    kktW"uCvtϓF�ݍIkr5�5Nl^)ٞ}n융r3))iT\>�wk�W?}]6?gM~R|_w[s:ܹ}ٛOSEll1ƪer~�	ş{{{l/JwrpY>ivǭ6mo[)v�wU9*jk1׺%{W
    �>>�&̯cbw[Ӿ_{fOU=Ѹ0'^]o-#2^eY7]un쾿K[ym&qourY*m;~:zr,81^z?~wd2z[*:˾~A>Bv�JT~wC=s_2NEw_糽8lt{u&x;�&kc%�oϟ),Oՙ.;2'im^�D8_]?SLvsnaT%{{wf2:.}%]BlV3}Goʯ뤣ʿ9</t?PdUޒ\B9ú)^º;f<`|;_VE*~n}5ބ:%E=,dV{uT;w~]u[Kpwjv6#'rk{oƿ?;[zz|!76L&#=Qz}#@wOI|_P	R~Nn/}+5X<?,/z9_;3>0mϗ!:3u9
    vg1t?v®�wW}zo�w>qڿk֛د}a0�vouv|a}�'g�̛=?s_
    ~s\ln#LQҵ[,U{#zr5u&)w7V�ǽ?_[[˿OWu�ow»<_O׺N9jgvW|Pߣvƌ#/v']CN_t욙X\+#S]Y]q7Bil~?c33xܹ]/[|l쯕y{ltb7Ƚmd-r).#?w:b0t_RkWM/ޣQ]{o}N|ǰjf%cj|l8J//?){Onnύ�Y|Xqu/q|qݿ'
    dߛGWQ3%xJ8~-QI
    ҃r|;gݿ޿ϸ>>u6Yљvgǟۇ
    wNm?'1ٺ-ͦTq!nF;W{�l__..1�>)jJ];W~(Ƚ*fwuV=폥nvvTf*}U9Ou_[㹿7P|o>hd_?ͮ>ڽgTԛ\mX4y}Y^�e!~w
    ?�S=[j]> |Ӭ�j۲'$)nad1k?#@|JI#{gLuoS<MWe�旍m̓Խٕ;O7U{pYWxc#W�uȚ_m򛧷Z}wlkC)o4{n_iVjhWkVd:w{|w`m�ٷbソ7˷gT0ۊW`tb*̅f
    ύGF�,ugS�A/�o?�Kw?ҟ,�s�_>%�G�g?�&y׺ׇ{϶s#O쾜|пw4͇_+'۟!�Ǯm֝ߕMV
    ɴv^>-MS!1:ⰾѸ~_)+_|=e??ܿ&@�eGWȾu=�?z@Rgv6nvbuRWF{OwncRu�ƾ/;b}؝hMqmk_Ysp5Ȅr{�3x'C;=oٹ?/ݽ[=#k-Z_FS=Tי*4=UU{uw׺,߽{//�%1~3QSv|/m\NF#i)>E-&ࡦCY,zQbj`^^v'Y)vM|@[=ݓ�3ߜ0oվWnv&�fi|smKTrU͵۵%d>(?u_noo_ʁ~GteqڛWDl;ɝ͹+gSn9X혤'[*fCoOW{�~Aw?|vOfKY?+0y=g{3j�1Ǵ?wD̺
    Ѯj5ؽ?	=K
    wulUKNϐչ=zʫOEvSO/YvSUl)[*~{N}лۭ__:��u;7qmn\?vI:?Mֺ/y?M^�e-dxd>,?ϴwwwv>ԡKS>#~w]a>`Uޞ�3UT{}'qm:JCI}׺~S�9k`kvWx-Smmm`;36-7FJ(7ܟN-:uj6/	ouzcޟܯݟ$ǿ�?}wyo6{uL;ojOx^mlwMf3//~+|]zpcc͏|V96E6bvm]&^A;'no˗ɪϟI7SatOrN\'zoƏ-z�qϷfk9cz=˰}S׺:~oL�?N
    җj~�+O]wpܵ{x65UMz9wE{t_'@_+[C>Ow6|k>~H4c2G#/+8.Zl&+)S{uNuQ]I;qj];iڹ:-Ù[;17_i]fUTS:A-}cTIHf�)}'޽;]b�67M.޽:�5n׿oǬ|{t |*󳼺?o>2u�O|eߟ2.wcyt@g\ڽc}Z|¯!,TuWf9׺U|`wﭷ�iYu�|Euv덱x>Lvstn~b1~9vH}}vwg^wV6e;§{o8:3vmô)Z7=n|ې/ݵ"oΕ7oNs?Yٱl:I('LBOq	c^v�
    }<W9Z.:}7Qat.[pN+iEQ$9S_̣?J|a�~�|Nέ[flMfc2izwp|kmUv
    >;�d%˾ǎg}׺՟O��M�,�J�I�{_G{^A6;zm]˳;6gme*[uR㳸]uN[37SU3Qe
    :%E%D*uMC??/�%O[�"�4:N֤ڿ$W[c-|&7##1X3
    u4CԴ+XW&?6+~EB|zݱeн{k}:;#ڛ࿺t>[EVΎwI~d0LǾآ36oǍ_lu�b0[~@IwvR`:.E6GIsݿջOfnU=:;>ڿ
    ~Juޘh:K}|\ӽGnj-E7ϻIi?)_ōG[ڟ{@t'I޽_ޓv.Q_&F}ٛ'?��_z�JiqMtɸ{anؿv�qNgm=j}纻6	E%k|/E4?U9m跠>^߷e6ڻbv[3MYp[|uL[{3vvvl,C=n2;G*7u{xO7=!1?1]??ORݻ]Ѻv'[�*>K6f/f�H1m+)Q7ct`>QOB|?vw۔i:O{Gqu9/ɎqP쯗kjvvޙ!^]LMN6ܱ{tWw_6?suM.ߤX5]35!?ognV#͈
    MIM87kq9Np`}׺0ܸO=aӣv7vv}ujwq>oMٶSy{wQ{+i0MGD�{Kl]_ڝ׶7}[?~m~>ݓohE㡩OYJxu	?q��G?%�_/P?_/y>~�~Qn~TC=e~`uw`=7Y?kV>{+>|T&?Skbf�{!5{^׺u{{^׺	]r?uG�?=(t'#^]2x'Xź^U�3=Mu$<}lҰIomm��}[_,{Ov�]bVv歇[i_%6?b퓉6_jm\nep;;xu,Uµ1VOIV'YI3~魧pDNؽ.tUZ˴»iϲv઩ޙ$V395S^�WXM{gLM7WQ^;-}5*MN2]zd^ٟ]i=ߐ{o=ٞyN{V
    KWgagsoSoLrQQCLt0{^돏]ӛQtO^\u7Rdwa7/gn\
    ܬu"'W.u3u_Cbt[)S6_U\bۗ!.
    ,B2SQ9HcU^렾Jm\~?')wf/gw_ZlڸCw.?oo.wG(Xcjc%pH3~魧pDNؽ.tUZ˴»iϲv઩ޙ$V395S^^n__r|?>0nϐt{iNܽ9[
    5.ܴݟu[
    ><Mj
    ttN"�
    렶rϑ{{~m
    ֛/ܻji6,qZm:*驒<MK�OuXm[?=7mMC{uv:<?g^ԸX;sT)EV {c�?;�~?}_MR|??�ޟ��~}QWOAoNz?g='D^yޚڻ
    |5VTal6˩ۘ14KB)PS:F`^]Sj/Ⱦ8K1{;evWCq{}as=GR[+S5d+Eou�WXM{gLM7WQ^;-}5*MN2]zd^/o2m�[o|ĝY/ؿ;s7 ovpn&փr꒮T:z[Amݟ"GO}w6^/wգmRm8X7/tUS$x5T�0a>'|X?�f2�:o_x??ǿӧm?o��M_w?{�V?VtvuoJu_�Ymݮݛ:�bmy�;O/W]UeT>$v> ;wŏoe47�N7]�uspw�O?W=>'�EDv/x_AuOjnnաs;kw_;]Us-4u5ʨi׺OoT So_�b{'_e.oM*Q!M
    BgAn>"Gw;Obg6^Sv^լrYT1Tu<yjd"p{
    렶rϑ{{~m
    ֛/ܻji6,qZm:*驒<MK�Ou~oo�=	iY��_/�q~o7{W/|DY)1[^.۫{mݩ0-Uέ}M>VZj$yD�u�%{Sӛ1o_>]̦ݛ532W)c7..hB9M^�_Ǯ)q_G�lNݘ}iSjwU;+ܸEgkbxM"L�wŎ=ޝ�ewoZ�w?qo{7vۙ۵#Q\cJtL{Ee-OȽY7fm]SZտ`SKқq#Vq_P P/?q.z? ߩ{=i˲dmm>ϮϽߪޙ䢣V+!S^Eq~"|`|[vl^T:ke-U^}a];spUTLĒVRetۿ.؝ջO
    ]�K]u~4bv?OE8ݕM'pT]'OU6F#>'W۬ڸmW~Ul7.:COp[zcx\6ޗ`#7f#a`ruB5ZwJ:u{�^{_|@ks�6wtzexVGWG5C
    kkt?�~�Ju�m�G�1svS�E?4�H?�?}?>7ߺEm,已59~m<fݛN)(t6#Uw]k{}6NaLƛ#I)6^@mֿ>0u魿}Av7AuN]Sw>G{f7.mÀx/{5-5]NK*;U4o;vaAoݿM/
    CxhVTkvP)ߥ/fL&PTR"{t�?_#?З@�Kw�EO�I�H/g?��&x}׺&zS:�k�uVݹn�d7gxFz꯷+*I#^@׽t�d'|X,Ɵ~u?u.O}Ve-N[r]_CQTU㦣RT^?^q� Ps�z>?=/K��^۞
    �}o
    Ke__~ou];v_ni|&ql?q*ooN੒Nmd5?F,}׺&zS:�k�uVݹn�d7gxFz꯷+*I#^ޟ,|/�ȏ?Wt龺G�ۛ}x~i1^?E3}f>"|`oniNtTnڽW1kw
    Vӗ/2V56׺3׺,ܴ"O{/AuNwiwVƒ
    Kw-7g6VplmZ§:ӼbtgtP6_[{Z�}Oؿ=/Y~֛ޮ_é�a~h_B{O[uW
    j�
    7ݛ{gTPiuoLvˆbl,.NRAGNt?=tgj.tOO@
    :'gdem^]WvV\G\nJԸ<4u8zf1R<(J^|P
    >MNVu�\t/G<Eoǿ!{1Ne=ٿ�yk22*:leuV{A�W[mo~lvl(t6[Oum̍6con]p/,5TUESKSK^@"_]�>0bwmxzhwWum^ǘ[iŗ}x=E1RZo~{
    ~o|Dw6].TsM˻:‡iw३xy#$Ѳ4^Awŏ-?�e�t�C}u�H(�f�^?O{^_sڝױz5MpRFOW-T/+:_ŮvO.vmnaMA$Y(Z{7>n辔_3#zmwWm.�E	6Ӥmlpc7qOW%fKu;<u�O՟O:N�M��/n�J�Fo�{ܧoG^A6߻Wr];ov۳
    {Wvm]ǎvbEdԵUPMUM+*23)^�mֿ>0u魿}Av7AuN]Sw>G{f7.mÀx/{5-5]NK*;U4'6'bn=kpt]mߍ=/؝-v7eSm2Wb?
    ŏJ/Mw;bNg)[/uVOj.
    >ۛzf$-XN_{�cet_i|i�]%ֿuӻ�xfm͟]}Gim_bcI㧒!^P
    >MNVu�\t/G<Eoǿ!{1Ne=ٿ�yk22*:leuGNӴ4_:-�}u{O`�sf?ܮ[s#vWvj2߱r3St/ͧwܻ}m6NvvcݛWqpmn]gvwY5-mT2USJJ}׺�67/a}uOyko6Po]SWT]ϑٍ˶p6?/^㪮KMWS2RʎM/Age-ǎx}~gqo=Pl;eZչw^t5zm귶f$Xi+d5S'�O_>׺0�wŎ͕}�etZ�w?N՛+6~uۙK#Q$cJhtB{��/o�J_ vW5u�՛;?=i[+#Fn5׺�?V?:�6��Os)��rw{ߺ@�\|z.]vnݝͼz6^]#3	{;p.//wfVVf9:u먙{ߺ^׽u~{ߺ^L?�C�s=1�	G_?O�:�-���_�lvؿ y�buӰIomm��}[_,{Ov�]bVv歇[g|G>p`6Zuuo\r{onfw}[nV厏!96.e'U^XO>@_?�Oٿ"[o/\m=gCk~C9{;ow>竰3PgOV{tX;kbt춿~yA�eO�eLҿe�q�"�x�}YߺFM6]3O!~k_˷�Adq_
    ״{/{O1ۨΦvJM܉W0Cshuwkv|ЪZ//7e5'g};}Ge.fr^ɥzeSaczz+=׺Nգ-W
    7:_Cm{hg$/lqSv߽�S`y>f}=-eJgi^�._>dAS~(dnO_gvK}m/+v_nZ\o#O1,&27^|>,`+J|@K@b:Gs|nݣzun=?>z
    NFCvnϴ]Awm|^;J>a߄`T;:	_ʬw.+{b:k;kplz6ZNDzz#d&-ߋI1_*Y%^w_:
    x#;ꝧ.wm=ݝ˴nlVS_J堣wjx׺ ~v_0A| k{b8.[_?twzSn=Ә{fMNF:^&A=\_/YOA�w�8?9�,�gC7sA~��m�eg/_O{c3j}o;f>;vt;az9\#�\DUVuTMye)H̾塶ςoT`ϛ�0.gX̓iuT)޿)]ueݘMe2ӶiD+O]hd^O՟/ʯ=1=:򏬻ר~%m./�mO*Ucrc20۰sYJL<tp?W+J���e�__f�g?EA�Ŀ_�GcߺU[麳='d�?@|-ɺGqi_;/1懱;b�lS.ޛ#tQzӻe/P{)kwM;{
    ;tcJ%˻7ٍ{Sظ
    w6GMhOS]Q;{u@?2z~[�/tuX]:];
    ّݽ76>[vFmn~JMٝc{ٟi7}�1;G�gݽǺ~?|Xَh7?'vm`md+wIҙݱ̕=^2ZѿRx߾?]~n>ǵ_)6^ۏCWhuv}mlnͷvcU>դI3c/۞{��/=tٿ�f�wg ,�?�m�FĵW__'ߺUn%bv/xο-W[=E;Ow�-~&~!|vO
    xmldbs;d_{Q7{t\sneo/�\9/=}L^ca0*6[߶6w�
    Nڛ+{C}d:\_~?'}wr黺?g?{^뮉ܝi5qU|
    <+n56[lsPiTs�'騾hth?_wf>yP/k|u}/ٝؿ33]7Wnw'YPeZ\)^Xꏋ%KWJ޵�ܛ�zw]n=+1۷uzn:n.wM"L{x~cFd>7e/�36r{\Μns7Nᅨ[3Wvvre1fu#!eq-OP�p=mӣ6Ξv|=c3w՛vӻpٟ>*?6Ɏp4[�i7~F|}׺�:ݮ[�ž]:g{g߃ge;w̞ވݽ;ߝ[Sb|~5-6ݛcvLv[
    џY"Ya{pvKV._]+[k#}b3C;
    ˈ3+^?4LϺ^9>O�/gbI|`ӕgkt/׷/vɎNm忷y?2,;?+ko]Z>ٔזoj}C}f0]�_-�z�x܏lwiݪ}?yKö4Xؤ[odvnvzjL7EuOWR|͚ߴ>n]$|O7\?o{υݽml&wQ�u�̏7}zŏ?�r|ջWn?=>Z<wm|n8*#ͷrP{t@:Gɟ[�fvX.|V>؟v'߁=m9=yw~*u[=wN~ƬVmf&҃;?d=0mؿdt_a,7i|%.-ztGYnNݙNs3:`=ָΣI("\7{]=-nG퍧ػ:_|Xnv^ٝO[E�;7	S3MPspgi1*U^�٣i�*�M�4?�~_�3�+cm׺imCݝ˹{c[Ϭn꽣ѻz뭶�n�76=6L}}�/M]kqOKq
    l%%}&#5׺,ʿ:?;�̭�쿓=߈X,C|BOo~|[ok%Ng6Jm2t9fIտ|?b/_#�
    {/'J|ulLwfw/hwgṁh~XEsb\LP沸j́Sg&{U?/dG
    XΠg?÷c;i6덴p>@lNc1mY|f:)^l{ս՝0]ҝ[kzym؛&c!s?ve_FU}DoYK,/HGAuϚ-Տ_;Sdɷjr]@=Ul~ؿJb2[~
    dTSQ<
    ASQUџְ[_<۟>]|hݟ�b�
    ՟_>ey��2�gsڹl[l+/u'�/̍~>oI[/a}*/XmY:}wUsdڙȩ]9bt?s԰+ߑۣa0/:{�́>DUd<Rc̻Ӫ9vu|sꎜm(2ԝ\͋+Squ�^_ ٞl^teusbSuMd&W}=RdJѬoh:hre=׺@7nn_7^���/zS~'q>AJO?{swgq_!xv?Vw=.Ŝ�"{>soLVkG~0`;`\wG(:oyZsd�2ٕ=u=꽁:W+>jr{{mݳ׺
    {wf3.I�]�'UZ>ń߹.߈0{�M.pbVM;{cO>,|._+z�ro?u_lϬnݸJḺ25
    43u[#z1Wq%7lNޔ]z>a|诓]G~8uϣOveGSɶz`lf&ܞ{~#7'\}�ȭ8z�G5gy�lnEMwҵ/ZlNWf]ø=׺;/n⫺'}�#M^:�۽+'t|2O�r6^נl-{tH;w|�h|��KzgJn˂Ց8y+n|l&ip|mKN:,&Tcm{vnr-e7ڴ{zdqxjٹi6.{&pn:<>Ji(ip'Z|q�O=zSۋ>?un[^`?lΠW
    LGomi(Z3S/&pdru{c{�?6}v6NA?&;Gom�S.;h,7t| ?>AGOņM;,;4(<ߺ^߈;oO}_rW?Qgtv`u~kmCc'kw~9
    *+we7~=ڴ{
    V/u57麷c3>(Wat`Y�OYӂْvnw&jAΠ$5^�w;>2n>n;o&7zf+[uwĮszv�ncsحX\0y6)#^�_wwoC?u|ᅫ
    z_nb	�8ɣmtۻgwR_sdr[u4}?%_ߟɯ_�٣�Fݝ�2'"��`�{ߺK�E賲�ӧ?�B_�y/�E�H?//??w7ο~hV|N�dJ_�%V~q�#۝سv�A�%WemG;"O`
    ٵ#U՛7sxUQt^|N|�Xͅ˦~@lϖ'1[ᄏ')c߳z..9;͸7Fubx}׺Oj~-7e=?;7LʾߍXjn]럏_Ge
    ͗Zwwɩvw/SÏ\.Ou0Um2Y>[wo;ĮLw[o6>ݽ�dvlWI
    {ib2K?A_ǷwW_ܧ/}K/E_$_,9we+vfͱ75>[domI44{nuMa�1\_uz>,#3kR>lmw׍)/bwpoMvs;kil,&^c'ugewi_
    �Cz
    ^n(-Cj)?Zl'{|GzĶ�u|~B|]ӻ_am0Q=3]!A{/7|ehs/pI867{[{:ꜦPV#!v^Gj.8/wt zzssWJm
    :;9"^Կ1?g_Ώ[>oTߕ[Wx|mv=>Tl.;sl}K(7c{t'*N]%݉>{Sen_ug-;W\R߶~|Û6023m~b'[:1x\Bz|{|`B�.
    "2Y#.C6z~vO]rߙ~4,~m{C!+Eau08 �_8��+}^<?�0-Sywğ]?=w\6}	W`/w>;=:zctT=#[{׽u~{ߺ^׽ti�egG�LzQuAO#SGd=iy?.N�Ït��gr{$/H.x-_԰Iomm��}[_,{Ov�]bVv歇[k펬퉝.쾿�?[nuۿ;fK^*#ʨMRHyIRt�,~,uGVl/פ+']lY6+wm-Xꌦ7jtTîg??^;{ç{wfm;;/e}ۛ2;kvbp._vbM*SFU׺g/Am7xt;bNg^/wգrU]٨7/1$t3S$xgr׺/Aw]Op.m=M{lf}/򴢋+
    %IUţ]<ʞ{>BM_;çdwVo콗ڛWqجvn(#;CU--LtՐJhٽ׺PvlugGlLiw_e�O^[s&77ݻ2X/24qQVUE
    jDSYӴK|^:-�ܝu|vf?ܮ[Wic2߱ISQ{t?^?�KY�_K��m?�{��OɼoGuov|tߐ{on8nyN{V
    UIwgXPsoSoL<PL\t0{^��f	�fo��E�N�A?�?�3/_'t�ҟ!zoq;i7Jv^MT8Vbmd7gq{I:j%d	4l{Bƽ_"çd.콗{W%\b+7f#]Us5LsʨR}׺u/{WEOn
    ]={/KuWc;5Vn
    F
    *(j)P22un^v|֩zMm=;׸jۛ~{oJ̖M1Rɚb{aB]owO~A-M7D/e;eZ6U&ݝaC{mͿUM0G[YC
    3ǖer*/ccOz_V�]ֿ?ӻ:xn:=}wGv__}Igm:^�>BM_;çdwVo콗ڛWqجvn(#;CU--LtՐJhٽ׺`O?>/�uٗ-�+:w']u'#�=�x(><i]>h{t5~@lߥݘ}=W[V#\~[|u,UTxdU^?	SV|Qٽ}un}oۻ;F=ۃr5s7GL,{q�0;�j�~|5<Zo�{֗�qp%5^/ul~,oW?ٖ�d�wD�E�H/�[�[�sߺC�u�Yܯ}ֿ+6S�ym͝=_,;uG5#]k{t {^�_u|믖N~ꎿ[lMUC{`}),wInVOmʚ3`C�{{^׺�V?�6��[s)�?%�_�q~wo7{ߺ^rٍͫvVn
    23cVXmv5vR}74JƧ#I*'6^?c6뮭ݝ_{zqo-}n-K%M7'o]OU6E>׺$k�-鑩
    veݕx򿡳]g}oSCU0mvC1eUE]CO/BW[l^wr
    wnm2;w/[me~tոj*vJ)]b^^ܿ!ze7Ƚ?>Vm);r^tV߳v.jdϷNljZMiC<A׺=u~{ߺDY>�d|u�{f߻Wmov;of;O3{Wvm]ǎm˶Ed5TUKMUM*K2^kvm]鎩l˷f"pnͧWYvwK]ku5Tn
    Cf8E%BGQJ~'.ڻ/M;o<Ef{N)s8:uoՆػmSWe*ii{n<~Djr9ZzJtxou׺u{{^?۽՛}/V>ٽ?�K]uwᆴ�Hy�HG'餮%GMOKuc6뮭ݝ_{zqo-}n-K%M7'o]OU6E>׺�;Q|Sw'`n
    �>wgvu�Vvr�qm^-_"�;EJ*q;Q25t?^׺u{{^}q;}f
    ]OWҟ!{^#Go{-ޛ33KM )i{i=ػmmv^m=6ڻsMkmm=5#X8iha$$TUQ҃ߺIٻ6ڻ}o˷^{37ݙvڻOjuNcp]˸s4xb(檭*jZhY]QY@W[l^wr
    wnm2;w/[me~tոj*vJ)]b^^׺u_$IopOݝ՝ܿ#[G:iȮanoNTcjL|5>׺u{{^?]՛C}Vٽ�Duo�Gx7�G[G%c�G"Q㍃u~{ߺ^׽t^=çS{t];;/e{;ke2p6_iiEVJSFy=׺=u~{ߺ^׽u~.Zd?:Y�~:]P}~.<OZ^n?_/*�}@��&:]�>__հIomm��}[_,{Ov�]bVv歇[a/?IuZo\II;m~|j_8rhb_#wgXv;ӽiz86ڝɕ{f9܎rucec_7~>az>oO_�$~m|^	~/tQf�ؔ5m`=tP2~G=Y'?<??'Saz7tmSzO_v7Yvwi~OBm~K߹iut>Ӭ;c@�Gm=1�
    AugN~kߟ)�6ɥ>g=VܟzV
    ^oۃvTuO`ڵfWb{)wzl*gǾ[&s
    6j:ZŚ{!'ݝcz7fF@?1v_zun_Vo?=_vfm۪�x�bn;]y~:ˎ/^O]{eui]s|1ޝkY}vvWI(mw7On,nSln
    ݋sZ|[пB|u={ou��N_؟E:[GSfۅ5{S-Vn^Ҭڸ̮WutH2x\v	:nfdkx
    Wfw/u5;�>cm�;]Nܪ?Imm|v6cPif}׺�[uu�koόPm<Gs^[Kvpܹy}÷6_6.q
    jT\sUK?b
    I:K~0|;kˍXn)wz.Ifzq[m^-#ξڲb* cj}׺�:ofv/~og{3	X$jU1vȼԢ{v3ě[jɗL2;q~�;ϝ㘦c>R|{~v.n=>OMJ՘>>+5IM3/:z|tpbjv�]3#zOSOGS'^?#vn^!|+VevvW{׮3$){t�vfP*�}k>*wu;Omͫ{v>l*jw^H|/؝k{WEIw$U嫧d}׺7�(3?'7V
    ӛG~ٮݝ/zϏ[Zw|cjqRWWSVdPVuP8nGjWc%?AaEKwGؿ6?q]7;yPL~**F·%}׺ïvˎYCǸSSmLY;:k{3gE]=/7.گei2&E*׺>ӣc!@_�n1
    >gqP~k)i?mi7ɪ>`'.݊H^؝ۿ44T/}bݎ'N}�a|p�f{iWæGi툰^�J93?_,t'Q)$՝|uޟ,y_"{jܟ&c2ksu8Z۱`?Jؔo�7vd:�{�;K~d:/?͉MWJ.wt{έ�fPGfC*)b{}o]7?˯79Wo'o!U]]>|{q|^?o|Ol]e_nmI-jq{�
    |n￑X.鏟
    @|&ҟq}=پ[si[K7_
    +fݔT{&-əmۍKY^&&_M}#��7Pfo>6j;xϑx[7ҏb]ۖFe[=׺LCWlvFnٝQ}�ȯۗ~w~ڽyCo?.}uG{z1{v⩻FL"jn<Z�oW?즿O]?�"���f��]�&{^>Dmm_=&�'�N6'=cKnΜn[;yn|oeTum|.(f7YC{t<}?[|yW[;k7wV�2nx?g7[wym<\�0]a{s)./euXv8O}񸊞jM[C:GMꏃ[!Snvm~;w~;#/k	&
    ;p>{
    ^Do~N0,_?atGl-�j}Ղ2?
    {7V+}|^ݙ}2w&Ư2{*׺oۗ�K>,/K~)GnjW4?>Ln_כuwvS6v{?;7ynݓLsc
    `.KB�;?~?U/gĭ{+P|6�]7|<ob]
    i7LluWYV;ߵk?W�$9F?�6woɟ]IO#;AGuB=v~y?Luqd}N>~^|Ǡҿ�O||Cvo\|O;?6\61:gpvKoﬥ7U͎
    SCrME^tt|�^\wYW{;bvg>m޽?� u鵺'~mν'iJlǺB?tvO/G?|诟G	�묿Ct.LFw;G'ltjsz4X;G�M�vQwѷg~pG'/ޔە{֗`|yܕC{Glt	N:&d=׺?�r+�>�??b�+�@?=߸�u^?`:϶szcMٟ'gvLc�,/~;k_"_?X=dƻ�mAs#w&�*C>oxI�e/uF|�fx�$Ygn=>/>7ӽ>vu�Ɏn~IC_ZLGܘ)ftS?:|loߠ{2{Giwn)%)!z6ԛzmQEMO5^�n]G?g۳ͭ߻?S+vc;;Y5-ofUC.ƪJKje>^V^
    ]F_�KO?CUw{f�f-n2G'6IQ{tw^XL{~)'kwI]w^#1P2L]L54Dt�~Ti:v'B�~foi;_u[sr]e(2{Snly2yس>
    L%7{f՟o)?fc>bcwGB�0JUݝ:aV|}yb`lؽр4kw7;5ُuQB6�n=vn|�?#"�_3{W^Rqy}{to�6읥};q|x-M;1v"uM`+2w/q|nXwn̾wݸ6b=׺O�5ʛ/	xoOkܻ~&vWM`\|d|}
    zm7Rփ24%O)箒&^4hw^?g0ߪvOStG鍫ٻӸr=I&9ne~u�,=kMYahtuָ8m׮�\n
    ɸ~_ϴ#�uutu+;zjg؟m]͸?6�Qval|vkfu�v�ec+S_'.�G[��3_?�y=uA;@oMb7囃]�n=Skύ]߻/~[w>AVFؕ}ѓܵxRTap[o{fu/W]ܟNc[:o�6^O7_^Guvo?ow56=عlljvǺFe]>Ro�Gv1[ydT]K%qPϱ6.Yㇳ<i}׺ '6�ʥ^?YCѻ�au<>�W
    w
    =X\f>!pbdE'[n={Wml=Nm=Xٻ7VUX:CSw=7ԪչlB+/QWQ=DJjs>RlO>njG|zgik[N_&zuT퍿=y2|$23PÚyk׺m[ޝA;/BuVm{7k~ivȿ=7{|.Tv-N~*pUg
    {uO]|xӸ/}�]?Y
    ڰu�!{P;of;[~�;`^{&=Qװ#&ᅴ
    ~)<n>£KmQEvM9OI}R:]&w;v͹y2ԙͪ^?�"gH|dcp0ҟ>~~w_l]}:}hS3u{xG
    O`x�=~ۿO({jR?h|ŢSo�x?�m>͇XT[Wr+�>�??b�+�@?=߸�u^_ݛ9mY{3rOi,uNRml]{zn	Yh8|}~W#RRz#׺.~8Mn|ȇ?Ql{~ڿ~Oώo{n
    .ʡo.>zm}X�Lw%1�0o]6o޶nc')v\>Bͮ⟰?w`l]٭7fGI6v_mٶe�1h;s567G�5]gݶ5y,_ힱm}t{W{u)1~lžo-owlɀg'35w>O5
    Cw6s?;rخv?eSv{t�|	)3!A?}Avf-r;W}sXGK꽿.sm}USW:/u)6w+H|gf]ۘߌ.q=_Nvȼ6N~۹bCv˝-u{ݱ�E�H/?)�?s%oͿg7;_|?ߺZl7mCkn濸QL?!3=j'Pvw.l'E;rw~]I?7tjad/);c/)U§ra39uɻ3769@o.nm;szN*}o%OlLJ᩷Vۛ#sl|_:Ogؿsx/X{Ck=c{2-SGv6!m|{޸_ސI/�U{N_pz?~mT+\akg/o�7pT|9>{'stA.�Rt wC+~^濾:-77[.꽫7@f{~'vc//76^>_e=0u�s��d�����u{�{Wg{s1cv��][Gcq?V|<m?WNW�s�?7-F91c*|�xjW{{^׺u{{^&u�!��/F�{ytzt�\}a��yW��/6I:_\Z�ݵ:ְIoml��}[O,{Ov�]bVv�VzC߬>m\~ܦ9)v[`vovfUXt絻/pcg+\N;oaYj'YIAw|gۻ=΋ݗԝ{OokvOuf﭅we6Ƕ3i0٪j}׺�;�U9=_ߥߝ_'ft6|?mt]e�+q{}ec9|\~(7/̟Ci'=w>}f[9E՝魓[5G__h|\Φuhnmщٹ7VJ*q`!џ@=~'vG֧	v[67dVo>ٿg&@|TY]nS~l\v{
    YQ5{NȯM7]U3pl]'ݟO
    ڛ~CWvkuyz,>LKZjVF_un)i]avfoUNn-{[?kmr%Hqu
    >؝ut]쾤ݒ|[?:{7}l/+)=m[IUPџ{jݫܻzl۳gon=6Sf6[SY"*Y%XtY^SpR{S;
    
    =6_o9MNEfpSf*J:y^dxS8*7n
    ٳ19ެ7Monfj;^kb>vpu{S>3ClIw
    Vw8�u�u=�g�fK �@!?ҟS�f/i˿,�f __?ywߺBǿE3=KW�itv|{?}�q6'gCuYv�frԵM:<Ozu;_݋W=ϵNv|<k�u^׽٫Brb()s:jj׺O?̟gzxVv
    ؽ{;o*Shl_s{{:ņ:2*umhVg}RmK[Opl6:
    ՝ڻ/#3;mfwT˗m߹ڬe=5NjX^�_2~<n7٘oVval35}_/5q�;g:=wF[sa$ڻ+h`}\I?`f;nv/@|?;_]^|^ٟ/7{'KkEMtЁ'zW6WIN.ώ]MUԿ!5�wq%Yl-GIW5^+#
    /^Ez۱v
    m}|͹kp[vu^ֿk2j5ar3/a~O|Uޝg
    >ݟ'
    ySvž>wgn\=6^߃fVo x_u?SQw.{uϳsSvcϯ{FN<ͅ=nf#]Jl{tohnعo];;oAVϑLJ,ZyϗMK7RWJ*=׺�~{ߺ@�rwY;`;O)0药l83U,^[[su[)Epn2
    :I뢨ou~]i=ߐ{o=ٞyN{V
    KWgagsoSoLrQQCLt TͫGr]ݛ{gTqny;
    \So<R`*sTN'J~{ߺ@?DGd%>uw;GwnvWVq>Ŧu`m.Y:.e7U&xa2^׽tܻL6દOmE{zdW#7Vgajp;
    <v	iLV<E6ug֝EG
    :mYwW^u.&ke:an뽧(WSW�JH׺=u\73߹&/mVsٛV\`;W;vlo꽧_p7{6+13C׾:�6π_-;zunot8؝3;vn|RvXmߍEnJ̪L>W+}׺�~�w[wgU-ݙYO2;hL.?!S)܏v_3"*.CnVmz:jT0<׺u{�;b%ݘ<?t1vgjU[WSQ#{PχUn/IzhǺV?;ǫ:Ӻ;.]uf0-s6w67#}u%-e?DG"ukrf:)ԻvmbܻOuldv^M6xYzͿYO6'-➟'RU҃ߺI˹qOMSn
    jQmEr;uavܽߣ`-`1IQQh^A{{^׺u{{^׺�;>8.]}
    *"/3fٛy=$+ptshq	VZM4׺u{{^׺A|ڸ/N'pR^}q\~X\"pQ3ԱV
    MY<J&[{ߺ^׽u~2~<|ߐ)7Μ7VvjcGs-vRu߹}u[%OK+YGBjeuu?2~<|_ wC�pwgmlݫhdrx׸m.=6N/VM6C/5eD>K-OFߺ@�cz.]cw7Iݝ3{6^]G#zp|.S/e*⦤58Iu맅{ߺ^׽u~{ߺ^?;߬r@`rEݝ;:jT^ܻOx}==ulsZӯCu{{^?.؝/39� cpf1ki?1w`oۘm͹gww!IRU;߬A\,*[`vPfTVtmpd6(h\uNGof1jT^`׽u~{ߺA0�G֙ΨV'~ΗTD�7ߵ?˦O֗�8_�ʻP7�Fw!�ɲNb�Ă矲װIomm��}[O,{Ov�]bVv�Vz1zKswnV9|{N鮬ۛ/c6>NO	jlb|v#a5mARu
    {/;~w՝?><O;C5v\L�"Oq]"gNv.퍷!;"ݗ7&ܕ
    tWXWōO	?p|H?5Wgu~lwVt?vt]|}żzk~?k~Vw?qiI^w'ܿ2wu`f/_wv螏ųOXo�@=+ssr|^IC0L|#{].ߓdϸ7ff/i/<v3ig6wM
    “)&rfN2uj^:-]UЏ7/e{+z3~s6iu9*I[#lf0NW f1~u(3:O�vi�ƽs}ݝ'�}m{.ҩ�eڙɔe9,n3u|Xһ�oS/߽	Y];v^cm|'w'9qX8IoF
    C{>?vfeKޒ|
    ?z�M0|n׽sKzsux-N˲zqoݛqNd3/a׺�uƞ)z�Mb>{'ۻGw2a
    8i^K9ǝ%_G{ܽ(''?knϔgj�%6'i&w aqygItuG_-�0oujkNnN{+wٓ~,;bm[p,z&
    �z#j8_y|O8Fm^_5;~LmvB
    t[1ⶽM5\TN{hAs{Wb_�0oTvvջ1jS^>|6Oab)w$YqTɕ1bS5J{tX;v{'q|�ggRv|O՟%._[K#aa7Qg�*M*(&V7KAIѿ/wd򳮺+>Hm�ܽ'N1~>ߔ:�oQ|Z71ő~YHoUAU\tf\\;v|ڟʃޙ*}M_\|B|Wn~Jo{wbU}՘])+vBn^,8z_!'M0*lqj>ؽ0۵(p;mVcp[7"KIU�鿉dϗ.p_mm=C:wg|`K�!�v,{~P]f7NÒzg�y	w^%K?ïu>?wޒWgK:�q�(UJ/r+;oW0vC�o 6iA~|n�966_b|s!Ly]-6/,oy63xVQԙyv^S;Lܴ{ޫw?vWimG%-n
    vo,P.vjܬ\uT?*|NꟋ{k7_u3�llkvn
    >~O8;`C)s=)M:�1�݅{zg>{ )~#.ϓN~}:ɜ{gTa6ԡrP2X&/)z|Uڟ.;IG?/ss0to[T=soSo{..`eBI9]XjT{uu;_n{?&==[nl<ڿ]ۑ%#CSF")^;
    OԏhjZ/l6ݛۮ `8]:{r8MvdEyߞN}׺a5}->8]�?weFkp_Yf6vmoosdvgiNևOu`^T�_~)e,	;,IOt}8_Yc~?L{Xm7~dfϤm:L?{?U77m|S�3~=�=/Mov`wfK]˵vt7Rvj�gRa/*(׺O󺿘/'vŞ}'u-ԿfCm=UuobTWws1^`񞇮w.+6W{c�ʜ_s:n~%tRe݋K{k;muܹ۫|&޳jlA��?ù;1�$:~�7Žw6S~z<lK�dns2v%5vcv>Շ
    JmuB̍9>C�+O}I�iv(؝
    {#;{~tLncd?kjʏ!5YO�=wǯ?~@}3Ʈm쿁۾O[uȬKln[fvO,dSv?B?Q"{e|�~v_Eo�VSD|XW?(7enmduP�>`Fv|m(05u^XGq]y�e:W*~N>�_#GK؟3656w6VLVZLD
    Q.;pd*"�H?'�eq�ͯ]=/kO
    _e�s]?{^>u*�*,I[?{3p!�>?2{/lہ]ør[|3uïcEZ|45s;{{.Ov'
    ֻ
    e}�xw?Mڙ^nܴt;nt/?:.eG_?pmײ?^ڻ˿z{E;Y�'JO3^k)M3l6t0p>]��Uȯf���F+G~?�f��?~߿c{ߺW}ջqvnۃ/OVK2kc!;N7EEFf裫j>ެOKAukvw�ƼEߥTl^W-kݙ
    ;{G+0.b) hj=׺3׺4ߴ_??9O67YoԸώfn
    MWnVepPP.+`|6
    �pVmjAܽŰ_ؐ|tN޽	wO|ѽ3_&ܦmr׺CLsw_�[\cwBR0
    <Nmϐ=pez}쪨o'SѿTj&m�#_ 2ݥN|qݻ6N鮶X)~ܽmK4T*5:SQosyOp|>?7gm8#Wǭ.>2wWtc+3v.L-tjOx'u@}{nI)؛_>Yvt�][{|ݷJ]>쏈Yػyarf̨^a~k?�\||tDvZemD/;jt&K;~o+z36fz�n6~FKտ�0?|gr}?G`l?Ay}�D;g?ر9\>#E[GߺTwp8o)Ww7OqN_WmU|Q?Pu)6߽OѴ[grU	'Uf/A?OȨ>v���wm-s{Yti'Dn[ocK`c}CtvGrIU=~cye_{?Mz2˗zn.^ؿ.W{o{ɦ;wv^sOuNELؿp|C?v.
    _|a=[}v'˾?_n90Ux|
    4ujuklp'q��ľGb|/۹ΎzL}Ӱ݄jv>ءݫ_G^
    ?>4.=,:o0=^ܽ->>At2�(Ĝt=UVqAqusSȏ?WH��l}Yž3ݻ蓰'Sd?*:4T{uH=a}#ʏ[_wumea[u5~wN`v}]{su>CԛsWR\>Ut?�K|�eػ�qtSmؔ/oNj%S=�'^*88!{3PӍe{�`/OL�d]~6�+?L{߽I�Y]ٙZ׹:X냍5 >t-Y]7k||\]�*n;jp{/wbYmԷEwqO${
    7atnCYlFxj+Zu�;v[vW|wNF{k'no{~bEC_&{>?Mſ^;:#\l^_+^i-a7v~Y,w_'ʢϼOrɗ^ʆk6n}Ӵ66ܒfv-lTRuo؝_:|t�e.�N}Ϣ�F_7j�ߣf0eS#y�{ӹ*zg|d-�;zw
    YPc}5+pSn~ܻrS6x%QQNׯ^r�{c�}:׿
    ;S_MaV+~Aڝkun3~ڲecM@7п	s۳w�?Ő;*vgn~b~ſWu>u,_vV_1zwd\N+pstyƌo+Л7z
    c~>sr
    n|?ǿuQ6^K~>{{lqT'ܛ7kII�GďU�8aY_>@v`lPϏyoK;%ӛfݑk{~mhc͵zWr./w7c͐^ 뮥�5=:Ooc�*>[hxvW/K|O]9L:m'=AwvUcpc<&Pc~�'[(vNgg.u?V3}oU{2hv]l[doN�V-7#oF�vvn$n1ާY՝w~Bl^N�-v3-#('h׺$kwku|]�/mzݝ-?nf~eh�
    Woeu}ב:+ x$^W_y|g~;o[]/j
    ޚ�˷)ՙ?!F.v],}'^Ŋٕ~G{`^`|IV�GU>1'ڽzC7/ϝU;-}ŵ;O7s`ir%
    NR5ݟg/;f|ߴU� >9o,wBt7Nv?j|�S�rߙs16|yǺt |PC?;knW+޽�NK/9՝Qr?o{[n=ӝ۶uV\mվqoYص6{�:��#h�O�Зm�23qϺC̝ax8|~@:kow./:ö/euWdȍ:&ptd,VJ_>ǂj:nfwW{t�/};;zݛQtgi=7DWݑ/=buBb&626,#IF{tu~{ߺ^L?�C�s=1�	G_?O�:�=��3=Mu$<}lаIomm��}[O,{Ov�]bVv�VzGc#;Wtpw
    ]:˥0Vug22㲹}9[r巆۸`QUgrx^Ce'E_w_:#xi�o:'nv�e'빻z%�@�[7%{�r1'@-p}6pw_N'=
    ڿ>;|gmm˷.}{amh鶭\UX(++0ԹOu
    v_r§;1v?pt^3]EO7LtCp
    '><؛icg#L~|7GߺUAn;:q0vOΦlq? mt`vkmllnlYM"OYGt`:պwWK>=suuY:϶2=N_]=SWߋ44U;rykuxK팏P\~k;)v.mZ՜ˎrY]m>W˖njaGQU1yu#gf6TTtG�ftN=OizWswGz?@K;�snK�c01Uf)׺7O[z;sގٽ[fc	؝1hn,~#pb?=GRRS4Mr+ ^	|ٿ)`|쿐GIz/~]
    'fvݭVهW&^ٿ;zw.)Ӹ0'|wpuoy>5ۿ!?Aw?L<#2� r||Hn6FMXqzmtglugk�}oe�e^}Oؿ
    7w�{z�wrY`m_4�İ?4)o`_6ޟj~N_'f^7gDUfX>ͅ3}bWݵ]}2\m6;iPTe+P{>z.ߐ-k0)?6n;e}C![؝g]ӟ۶Czz	NZ5@Du;J]33o=Aғu|^`;/r/pt7Tm{hb
    mNZmU&V׹ԻoZw̜sv/AXNMԣ>o1CwMYX}{twtH6oޝ˄
    n>?z^fMvv;O=6;)3bmͥdv^2}>'wۃnm :/�k?*wtNW7&][;׳~MVkn7_?c2驨^`?wV.]/�_o?Mf7P>;'~=w|M^~.*pT⪲'S|ɸ?m<ƿ"ݽ[VoNl	(?uX
    U,cQOU-5]V.
    �u�h4޶;Ǧ6_t]|l]3�nf6/{umӛ'=>@l2[/1źx4Lc^?kodwK߄7V�';y~0mwϏw;ǵ:-73wln<ή%V\J
    Ψv0O�/7./'VW|6_i�F�??06瓯߭Yy�n7ܸN�OpE?ˌ6><b3gkbf2>?$v>]{bǸ3]yA{8h+r؊u�u[@۸}�/vG!7?|:Դu_r.<uTSbi({t`?ٱ٣�f[�,铮O~?f��p_p�	~'/߅/M?.0m<EgO?M߽SUtXm{š))i齷?SQ<QI`0O,?'f>];Kb`w#iϝ#o?Sk*32ύ<.]}׺?!znw.{ç_ ߩݛs=}˽6r>Aߥy$#38^x_%?.iu>+]Y}>7u?hF*ӆ;~᧎Tf^?�5zu|	8
    yn=�+nRf;quǽz+7U?`Vvh6V~̹\~WCп!z^﯑}rۂiu^꽫Ubmc`9Jj9T){v|-{xt͗3;Ox콗:iU=GvߙnkQͶ+h1>:TZhGH1]_]?O:
    Kݽ!==׻zҒdGn^v=U⦊<EO%[{tO~ߌ=K}�f;vamؓlM'I'S`vߎM؊;Gf%K6^Pt�S~S
    ٹH϶J~N&_ۿruN�ioC9A
    gcߺHWҿ'_/(w&!Zt\|oYJz>Gn꿰X#SgS=:�|_kv|.0g~>l-M{ar5Udjmnϡݓ읹*w8+y2jMT׺O̝<_%;+wD=Y.˖n:n]ص59z;)Uj=׺7׺u{�6]۞Iʣͻiz�ievLkۛmҙݱ:iwnֻ=Kؔxjc7IޛOz�nG/[[{]b7M!OYTIiuk#P}׺:IDL2sT-Ս:x-K*u`on-U5sst5~:{_%6C}|t퓉[O)zS_jm\nbk!v.k;x
    TRL1VA+ If^郻~OtTm>N}z맺qvQu{cflv_�(ry|vLvZ2V^�2�%?wN뮤vx�Ƿ��}>˧u�~ov|tߐ{on8nyN{V
    UIwgXPsoSoL<PL\t0{^u7ܻ޻~^eOQWHn�#rll^ԛwmݯvܘij(Z:^ۻ|j|j8ݛko|
    2=]ޛƧ&^T6O@Ul.?9d6]>jZ^`�f�'�lru|O�yǹ�M׺cchaqnϒݱԹܝuVuăeO%騷_잲q8ǪcpR-}D0t/=ٵw[b]6NmٳݛWq㩳{rÇgvwY
    Um,USJ쌬}׺:wŏk�o�C]~?[ڟ4_g>?4~ou/Aw]Op.m=M{lf}/򴢋+
    %IUţ]<ʞ :ڽ='vw6zj;pfrv)[}O+T+rRSle\Sװ7~>ݟ"˿ߏpSm=nꜧMlY>ڥ[wd'nn
    野:*j^LU�u/ڽKۃa>9.t;WWjcu]U5V5eNbL2׺@R_]L˿+:e){j1[sk+ݏMڛ
    Ըz,WjbDtgtݙڻp߹|q{iZ=ս28uMuU{r콓K7LGE&c1%LuI{G>5|A+~,?ro{jMu~엣}>
    
    ܒ56{U;SӮMXcczV�]%ֿ?[:xfm=ỿwGim_2_}W㧎m^?q]`|[iwT:ke-&ݝC';spUTL<qVWCRePu߅sȽ;Obgz[uQϹij{e#jX{�g|.?swO_vmݛWݗGr^ڭwr՚v�U9[LS`@ּ{gս[-�/ٽNw']W̾;]ջFq˸;{k8ztx꩒c<vm]w.[o콓gvo38vܻۘp*h-QU[[U4TԴ<u	>n/j/˿잫K;?x߽RW6cܻpU	%5\2ޡ%Fou?7~G{aO}߽S;uv~o[ڇs]NvK1X*rج}M]*KO'I}7Br�.[=EzC}dwfpm?rx֮KC^@�,~,uGVl/פ+']lY6+wm-Xꌦ7jtTîg{XXwn_o?6_;crK:w3{ոn7fV:�/ٹzMKHڨf">/�V?�6��[s)�?%�_�q~wo7{ߺEW?67�b;NMYm�ۙDzT?O'�qti3xgu~uxjJߺJ;un]ϸoAscu팏a:ӲqpwTz{w;7
    NܞZm-^*!џ׽u~{ߺ^3߻?֖%7]m^'ܕ{rqﺱTtZ:ftj_hh)ᥧ97{[ݲ["TK!M>#ÏAM[{gd_	NIasF
    >rb2nZ)VōM<E2k`$*:WnDM
    3AҔ#F^x%a'#vF�z+f_�OW	�&+jv5ܿI�w]7sĵϏjG:ѰIoml��}[O,{Ov�]bVv歇[cK>O;>]ؿ7cmѷ:v?`n}S۟(Ve9]?n_):N+hm	)w=�Y|_OM/ˎ؛ptTOr
    :oasyJ\.^�ܟ�v_Ae.=>5�)nN]E~;쿒=x$Ǫ_N#w|́MԔjY^`ݧ>d�=up:o?z:~t؃3>?�C
    QKڛ'w5[c/᫏u{twN}Sؽ~{Un
    ٹe_47M.GzASS|t=Gq8vb%;)ގ^:u͇ۏ:�?[X>4|ػf۟vu#p�e+	
    徼Q{$ٟu�?�ڸ}?{o|X\=ܽo׻cuuF;z}޴ommoTmSW25c^@]םw.gߞ0fe:jeh7n?GpnMɁ۔I&3oV
    Y7eV?rt�vg®ힳ{[Zn� {n0�6ݽ[큸'ľߏ'>uT{"7Rj[\E^Ơe׺]qs?gnWiǹbSuv/7gnTn
    ٗ]r+5o嫨}S?Ez[}?]Wܿ(;[mw.gj
    {}v7VbI:6B{6%OQQ֟l/O`?ώ_7eؽ['ܽaUWvtMwTavOVۘHucn{";t_߽9~bU:o��>蝽‹ztͫ9zy|5[veݘ|OIM^w^??Kfl+zlEbG_j>S}ǵM�ҥlQY->#LttχG/M>w>썅kNIS=;l/be:i&uU3?I*`{;Q|t۝?;۪zgA:WztNm_{av?6/H˦48ضMiےzP*:<U�6ڽE6.qm>*/M㸱߃[;1{f/_aԻv{N5tvT=r׺�#?8zv[�	˵~?;ϯ8}վvb|}^}v;w^in<V
    oіtPtP:7i8`>??{.;Oެ믄'�?փnTUv<M.y#ھ{#۴wπ_�/W]tVY{OXr�D?㻇s¹ϵmп?n麻#);[�Q<]T?kj^6G{
    wrwfdڟ6Ej~Wsu6:>_�F��jz{Ӿ?�6/cUpz*zUb׺ >]#GzϚ�ߋۊ?3qvJ򚷬:�;7>vej6n!IG_U׺Oswlw7D.kv/6?iz;˷~Z8[ܘM{yLU7h,d}yܘѿ쿆]p{znߛ�
    >xo^_ Tԝ+&3['�eTäN=Xȝnu6OOFg~�t~9tG�11ӧV|71o﯋;]?;]o�v?u��foޟ?1�?�[`z�^E^>X_ߤ7}|_\{o8wYU>R!3	>|Sm7]u|8]M\m
    i}׺O~Zn�3||�.zom? :}|?v7�p=s)yߏ)mf࣮BvO+tH:~c|_];}S�Vvw?N.|Uӟ!%n\]S>'
    ;"wpwdWnv#՟mφ]j�/Zt�׾={Wxc K]Xzv_nn>_m0Ut۪y=N/R6]?o%;pg=ﭾ0ueorA{r}`Vd)6J0u�򟨾iп)�Vعؾ�}]])\d>mnOam9w^:	2rS=Fg{�ɏ?8~'v=?M}oߏtٗ?%n]גn5ޜn7'g׻2er*
    п۽M;I۟7'�]{~0
    69m#=W7b)騲N)憂^|eV:z?Nv^/v3Կ/>HG!mnݿʝSaSNv6}ÕܘSoe2,CaĶO-snuW_?>\eϔ[&e{+l
    Yٻ
    ZٽgVE>sIQa�{ev/�ս##o`ظ�6_FM_~/S汻κVG32J97̵I��f�__��O?E�K�%�ɏ�L~׺_tO.M?pm?>Iwn_0>HtWf|jpl7[v>vMbPx0XG@�E�*Ou:?OG=[{vgD0׽>3wgԽN\n>SŕL{c='�+~?k뭝;K|Uwgf
    Id)qؚL7;Do.C)^�_��G_?o(z٫Y?R�A��d?߹^ߺ%y}w^ڏ]սbb<Yo]:%UWml_VM-*}p]GAuDX㾷g_v='J|jɎr6/N꽓SeUcLSPCџ�}|6�.zR}.}~Jv.*/]÷ӯQTf19QZdKA^|?ACv;uaJ| |2\$+o^%K7WANPZh�goo|(Se{';V{3|gߝ؝1W8gG)?`V2Ğo[[},=_{Rqh73Rd^_:;0mv.nϓ9v}_f|Y2ru&A۸Ǚ6'�OW=a¾@|iMN^ʿ~/6֠~B�z?w+WU͆y"꒖/u߆�+Vne�*0l^uln̖G۰;/vG~>5όOl~J=55[C{^~Wmo]W	�y]oudgv\k|IqYx7jvfg?e੥^X_4>K|h�q�و�ܝ	�{/��߇/U��Ȯ'~ t23'o|ܟ!{6O]׿ϯ;F-Ώk뱘׫�|h쯉2{~tϾi�I[k6|Y|5=+w&7-Dch�L⥨>{|펭wnظ
    �Y�>d�]ݼVWnZ
    'Mtk*㪤ؓ͝"зUAc�(o剐{N/]}{ٟӾ;mv؝S~Ob7oHm큸vM]uu'_|{d 8O/iźW[s#q
    pGEUv&+S@t0|_Xë7_YN|}�;OB�ߟ_;>Rugl�۝c۽:⧤0?Qrlu��ca۸{l|9/o'\|p�vKGo*i
    ݛwbKڝQkTX!n͕ܹ{x|�eM�#�!�f?+��Ã��G�z=tW5G]sNSv7|{]=]Oɏ{pu̝GS޷aw6Tf%W߭^o7yNCo^P|"Wd0]^ܹτGOؕ? r*~᥇ɌJ^�)�٧��d��OR��c�uSظm.7.Ge\S.n]{/S.[fh)犂i^\O�%qK]�:��ǹv7~l~(n_mmzsxuȮ6TmS2H-F^m/qwon�͛|ͥ{;pV<wuv߈sUv6j:\CO6&^||{:[�z[y|%7OضTK>@dFסoYVnU!D׷?	C_(6^`\|?�f6x㿇�0ό]>]wm�vwO�f';[dcouo'3C'ۧQA!_*>}c~>w3:;tn:%ސp4ߑ?^[=Oώ[N%7¾=s>ؙόnީek)5SP>[T{Wr\6{ڗojvvݛ#wuAoa.={)X`U4AX{uT)o.gk|@龲ؿ]ۘ?;K
    ;U{6�c�rSeVsWQ&,^@?7{|��
    q�W+n�_m/�dx�oyy#?s?Ed'~0l˃1OoAII~`>;r�[a�,͊ؼTcpb^cc_i5E4Y~L'ǝo][O'/;Wd.6̽MX|RmrlXb5rnj}]Ё!|]+~<l^폘ߋavXʮ)ۧ;~<mJ-ݑ\>J,ZC<Y_u�'?~ӧ4@�D���J?(/)��}?|>_u�uq"?̓o]N/:S/k|]G_�	hp_>.7ߢtv'T1@SɖOu�E/nt�[on�}ꞔ]W~:oOCY]#.|eSWce6m+-\Y(~�~{ߺ^׽u~WON
    u_cõ;Iҭ}>|8z&b
    uB=U4
    M4$h2qmqɽ5!TP˪+Bt	KkZU:EhP єȂ: 峕{iv;�;s+Q,KRv>||T۸}4*ɨVH)`mXg'I�EBh�T'玁{o~O�-J
    w+Gun߿?au�xW쟿^Z=^a�&(Ew<_߲EӎJzhh]xiݫ֝1-W{g6ivV[9F@ӑ;c-9O>/?ŭiϴz~;OϬ\j)?w>ly7]wᶵkcwǼWF#jDu;Fb(\|5k'Gxr�+|vی6r*\
    n;efHDRBr㹋}M2$m/"F0
    H 3ҿg_qb@`wwjX;h9~3nc$$12{mgammFѺ!a|#{[\FX2*8t>_;[�gj�Yָq#�@z�c}?FQ�ޛX*:G�ZL�헼_g�zopbn�?,n>S?+u���+O7_�z??g^�B;�?�ޏ׿Ў��:{O�~u~#u#���߿x�x1�{���+7_�z??g^�B;�?�ޏ׿Ў��:{O�~u~#u#���߿x�x1�{���+7_�z??g^�B;�?�ޏ׿Ў��:{O�~u~#u#���߿x�x1�{���+7_�z??g^�B;�?�ޏ׿Ў��:{O�~u~#u#���߿x�x1�{���+7_�z??g^�B;�?�ޏ׿Ў��:{O�~u~#u#���߿x�x1�{���+7_�z??g^�B;�?�ޏ׿Ў��:{O�~u~#u#���߿x�x1�{���+7_�z??g^�B;�?�ޏ׿Ў��:{O�~u~#u#���߿x�x1�{���+7_�z??g^�B;�?�ޏ׿Ў��:{O�~u~#u#���߿x�x1�{���+7_�z??g^�B;�?�ޏ׿Ў��:{O�~u~#u#���߿x�x1�{���+7_�z??g^�B;�?�ޏ׿Ў��:{O�~u~#u#���߿x�x1�{���+7_�z??g^�B;�?�ޏ׿Ў��:{O�~u~#u#���߿x�x1�{���+7_�z??g^�B;�?�ޏ׿Ў��:{O�~u~#u#���߿x�x1�{���+7_�z??g^�B;�?�ޏ׿Ў��:{O�~u~#u#���߿x�x1�{���+7_�z??g^�B;�?�ޏ׿Ў��:{O�~u~#u#���߿x�x1�{���+7_�z??g^�B;�?�ޏ׿Ў��:{O�~u~#u#���߿x�x1�{���+7_�z??g^�B;�?�ޏ׿Ў��:{O�~u~#u#���߿x�x1�{���+7_�z??g^�B;�?�ޏ׿Ў��:{O�~u~#u#���߿x�x1�{���+7_�z??g^�B;�?�ޏ׿Ў��:{O�~u~#u#���߿x�x1�{���+7_�z??g^�B;�?�ޏ׿Ў��:{O�~u~#u#���߿x�x1�{���+7_�z??g^�B;�?�ޏ׿Ў��:{O�~u~#u#���߿x�x1�{���+7_�z??g^�B;�?�ޏ׿Ў��:{O�~u~#t6F6Gk휧uU4t9!euBjf57x[fyo**̪fp*zC>ն_w|F'#	R|ִ!�UpA#w~R
    �[7:T�?�5%Zn/?ϻ=Կo^k?#y.<Wok~B[ƭ՚&kƽ@;i�G<Ǥh8_ToZ=�;�SDWy>�z]~c67EǽKO]W썙
    U}v^M� *sTTj24~}=ysan7=sx
    $S	ZV�wih9	ϵM6q5@̠qҠSpDڻjmvVY /dlLRQd7o.jb5y1t^9{aeRެd!+n'uo/hdWJ@+Ficnz.:+"=lAg`y<av[}͊קX-kS*:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:^ֿ�=ukSߪ:P0FٞQ<pV!߼yQ�մ�?=5gst:<ߥ4~7KKX)Ib/)R
    rPT0
    q"t:ԻtT	+�K�['Sg?�t~O�wM?ּ
    }ZiJjT"Esњ\3<֝o)/}mY+).[22"R5BìP%M]qA7k9xލnacgqw	k|ą$Ѫ>4ğc9gKXhp˨) 6Б^#쿑	;O#I%J|EV
     X}77jF0/A5
    CGQ"	�xxVD_cyٷ}�$?۳JQ�/yyM
    $�'8j
    ˵">꧕p[HUrTKOBfU.@,'OeؾqҮHۍh&q�-N|jA�G�sI}G�ew/g>u�&�l{q�e�o6/O?Ӿ�=~�x?ο$ܿ헫q��e�_a|??>��m4�0i�JMzs]k�[z>~&~>Qm'�^mg4Gu�&�l[r=l�o~>&Q|m�
    xu��lkr�d�o׿�yE�GT[5_{u˭o^�gg}Q�o�__׿+ۿoO.�{_}G�e�_7�e�G7^�\n�?~>&Q|m�
    xu��l{r�d�o׿�yE�GT[5_{u˭o^�gg}Q�o�__׿+ۿoO.�{_}G�e�_7�e�G7^�\n�?~>&Q|m�
    xu��l{r�d�o׿�yE�GT[5_{u˭o^�gg}Q�o�__׿+ۿoO.�{_}G�e�_7�e�G7^�\n�?~>&Q|m�
    xu��l{r�d�o׿�yE�GT[5_{u˭o^�gg}Q�o�__׿+ۿoO.�{_}G�e�_7�e�G7^�\n�?~>&Q|m�
    xu��l{r�d�o׿�yE�GT[5_{u˭o^�gg}Q�o�__׿+ۿoO.�{_}G�e�_7�e�G7^�\n�?~>&Q|m�
    xu��l{r�d�o׿�yE�GT[5_{u˭o^�gg}Q�o�__׿+ۿoO.�{_}G�e�_7�e�G7^�\n�?~>&Q|m�
    xu��l{r�d�o׿�yE�GT[5_{u˭o^�gg}Q�o�__׿+ۿoO.�{_}G�e�_7�e�G7^�\n�?~>&Q|m�
    xu��l{r�d�o׿�yE�GT[5_{u˭o^�gg}Q�o�__׿+ۿoO.�{_}G�e�_7�e�G7^�\n�?~>&Q|m�
    xu��l{r�d�o׿�yE�GT[5_{u˭o^�gg}Q�o�__׿+ۿoO.�{_}G�e�_7�e�G7^�\n�?~>&Q|m�
    xu��l{r�d�o׿�yE�GT[5_{u˭o^�gg}Q�o�__׿+ۿoO.�{_}G�e�_7�e�G7^�\n�?~>&Q|m�
    xu��l{r�d�o׿�yE�GT[5_{u˭o^�gg}Q�o�__׿+ۿoO.�{_}G�e�_7�e�G7^�\n�?~>&Q|m�
    xu��l{r�d�o׿�yE�GT[5_{u˭o^�gg}Q�o�__׿+ۿoO.�{_}G�e�_7�e�G7^�\n�?~>&Q|m�
    xu��l{r�d�o׿�yE�GT[5_{u˭o^�gg}Q�o�__׿+ۿoO.�{_}G�e�_7�e�G7^�\n�?~>&Q|m�
    xu��l{r�d�o׿�yE�GT[5_{u˭o^�gg}Q�o�__׿+ۿoO.�{_}G�e�_7�e�G7^�\n�?~>&Q|m�
    xu��l{r�d�o׿�yE�GT[5_{u˭o^�gg}Q�o�__׿+ۿoO.�{_}G�e�_7�e�G7^�\n�?~>&Q|m�
    xu��l{r�d�o׿�yE�GT[5_{u˭o^�gg}Q�o�__׿+ۿoO.�{_}G�e�_7�e�G7^�\n�?~>&Q|m�
    xu��l{r�d�o׿�yE�GT[5_{u˭o^�gg}Q�o�__׿+ۿoO.�{_}G�e�_7�e�G7^�\n�?~>&Q|m�
    xu��l{r�d�o׿�yE�GT[5_{u˭o^�gg}Q�o�__׿+ۿoO.�{_}G�e�_7�e�G7^�\n�?~>&Q|m�
    xu��l{r�d�o׿�yE�GT[5_{u˭o^�gg}Q�o�__׿+ۿoO.�{_}G�e�_7�e�G7^�\n�?~>&Q|m�
    xu��l{r�d�o׿�yE�GT[5_{u˭o^�gg}Q�o�__׿+ۿoO.�{_}G�e�_7�e�G7^�\n�?~>&Q|m�
    xu��l{r�d�o׿�yE�GT[5_{u˭o^�gg}Q�o�__׿+ۿoO.�EV_8͡ԯ;NQ]Jlt>�xɥW_�;iЀcܫڊ#zu#ۥZ+S�ߝCe-ͧ,}oIR&'#Z>id*B"msiFqg:!8l;~TUBI$+\{r&2ye?:W5ֶGgKo;Xd'V߯`?g>n1$x^_}qxr'cs Kv?^+̒\;!M�P<=~d;͘ms9q\k�;>,u?ݼMـ�
    [Ɩo~tMZ<|||}>T+\|_1?/d{g��=#5^�)��G~G~W??��=5j^S��Y�wj^?u�{;VWʿ�#߿_�׿C�
    _׿ʿ�#޿_�׿C�
    __?߯�wQߡ�U?߯�wQߡ�U?߯�wQߡ�U?߯�wQߡ�U�?޿_�׿G�
    O?߯�oQߣ�U?�
    v׿G�
    O_?�߯�wQ�U?�߯�wQߣ�U?�wQ_�U?߯�wQߡ�U?�߯�wQ�U��÷�W��v׿G�
    __߯�wQ_�V_߯�wQߡ�V�??S�+oQߣ�U?_�oQߣ�U?��÷�Uz�=��=k?�t~^?��ǁ�UO�od{��Tz�UzO�od{��Tz�UzO�odGW��O�Tz��Uz~?���Tz?�r�)��z;U5?^�)�G~GW?_�oQ�V_߯�oQߡ�VW�d{��Tz�U�=��=k?�qog?1�oQ�S�}c��G�
    _׿�'�?�={�{�}c�׿G�
    _׿�'߿?�={�wS��Y|;�Z5^�)��~;�^5]��~;?W��O�Tz��UzO�odG~W�ʿ�#߿_�ֿC�
    _׿ʿ�#߿_�׿C�
    _׿ʿ#Ǐ�wQߡ�V_�wQߡ�V_G�û�WO�od{��Tz�Uz�=��={?�r�)��u;Z5?^�)��~;^5?]�GOۿ[5]�GG~[�G�׿C�
    __?�wQߡ�U?߯�wQߡ�U?߯�wQߡ�U?߯�wQߡ�Ua��Tz�UzW�od{��Tz�UW�od{��={?�uS��Y�wj�^S��Y�wj�^S��Y�wj�^S��Y�wj�^�)��{?G~W��G�G~W�Gj�^��G~G~W��G~G~W?�;V5^�)��~��û�W�x��W�û�WO�od{�;wQߡ�U_��wQߡ�V_߯�wQߡ�V_�oQߡ�V_߯�oQߡ�V_c�û�Wu�û�Wu�û�Wu�û�Wu�û�Wt6�J4�UVEwWV~7ݦ
    *c5qW:>rnJ'?sOz�������������������������������������������������������������������������������������������������logback_1.0.13/docs/manual/images/chapters/appenders/fileAppenderUML.png����������������������������0000644�0001750�0001750�00000015034�12143164146�026107� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR����4���EG��IDATxˎ<Fd׼\E|ЛhS-ğ<)Bbl/���� 1��H��kT__|?k 1$KLE^{"Ab 1Nb4y-@b2n@bBb�$Fb"$	$N3}r<FH$Is!1Hlpn}ՈۖL�#>e{;s]eTFb 1ldw@b0'VdUzDgNL[E7
    YBFVW#@bBb�$Fb"$	$HDH 1!1HLH 1Ty'1Hlp<_#1@!XV-pR1S@brfb�ev@b b#\@b_x#1C!!1`$vHrBb�	$FbBb�Ą�#1HĄ�	$Fb"$Z1M`$&cH$HD̉$Fb"$	$HDH H,qE[?Z|zzà5˟@b(.-Qޯ(%H$lIa=Gacޱnu[Yz2Z-Rx\'CV--
    3lkoHvQd'eMb 1TtR9xt?$:Is$FbFb,=KKRDci!1sb 1TvbXH{t+SޚvbO^ʜXcFb)sb!oN S_'V뵾xkZ};@b 6@b$&bN$HDH 1!1HLH 1@b$&Bb�@bBb�_V�ľ<d~Wc/6<y	1Am$T_"AILY1׽:_V.�H$Ā$2�$/U 2�$a#1�$/'2�$@b@M� 1 RQ~��@b����$� 1>� 1�@b�H$�@b�jʝAb� s	'~J#@bZퟷ=vm@rqm``ٷQH;bGbK[74Xu3*3$Vܶr͉H 1�$�CP'w 1dKbYd@b $6Mӟ?@b $vH 1 1$H$Fb�H$Fb�V;BHF$.*Y10$%61kIli[@bPb[2};#ŭQھI 1$5KĎrͫ@b8H,>CGN15Hb�B>1ǵ'E-_ʹ@b:H 1 1X�	$#1�$#1@bBb�H�C4@b0s$Fb�H�̉$H$Fb�H$Fb�Ą�	$#1�$#1@bBb�H�H 1@b 1!1@b$@b$HLH 1 1 +Ju�ؘ#1H$Fb�H$fN 1@b 1@b 1H$&$HLH 1 1$H$Fb�H$Fb�Ą�	$#1�$#1@bBb�H�PKc`h$G:c.o 1%A'u.z?y 1�P[D0D0m$0D@b�H)0"H 1�$X* 1k)�$@b� 1�H�$�@b� 1�H�$@b�H 1�$�H��@b�H 1�אؑpju$ֽDDcHLD4MIDd8n7#1HD@b"Bb 1pDߟn_o@b$v2nH*u[zɡ}~kIli[=q6!1
    *5#
    H[djGH$FbJJGH$Fb,E6k91ǵ'P'I$Fb,R2#1HD@b"Bb 1HLDHl<'4Ș#1#1HLDH$Fb"Bb 1HD@b$&"$HD@b""$Fb$&"$#1!1D@b$&"$#1!1D@b$&"$#1!1\b�4M$FbFb"2HHD@b$&"@b$&"$HD@b'vXOvhGϫ~ׁ@b;sUgu-ϯzOIb N%4YNdktz`Bk혷qKyNxmdcի۶kI$֙>hB:N9b۱d
    FbkDbRb5#I}cJ$Fb .:a$Vcud$6H$ۉ[m͓|Xj&t$6לe;'91]zQHr!~zFb 1HLDH$Fb"Bb 1o�K۵a1gک[=_oY~HgSb%j3ˊH*;�rdE:+E<{{1uܱew-[hx^הrOb$fNJeW{#rdDmI#1ν_Sߍ u0{_{
    }S:rxZ?o'1Xǫؗ\&Rb:-pr>V'1s&ړ-U#1HD@b"Bb 1HLDHD@b$&"$ے�|2M~+,"~Vsc'%vdXNxnPj0w;<rP@bmK5Ćd@u
     ayӱ@]Hl苶u.P�ӱ@]S@bht@b:kHG;T5ĺt5t,@bб@]HLk�X)t,P�@b:@]Au
     1X$c5t,P5t,P�@b:@]Au
     1X$c5t,@bб@]HLk 1XJl@C[v�iۋXE^1WqڶF,]Ui<!1md~HLD&1QILDHLDHLDmDm#1\zm}$Fb%{٭mkG$vY}W},;#^v$$PFhk#w{\5O99~#rk$6st;Jo81W;ЎHS6Hy!1k1ӎH2{Zž*2"1|;13%a|{g1vDb;YH&1OE'1HHL#!1!1QILD&1!1!1!1mĀVL\b�iމJWzӶ5b!1_DzܜDٶ5b!1_DHLDHLTtѶILTt!1!1mDE'1mĄ!1!1QILD&1QILDHLDHLDmDm#1!1!1ѶHhE0qڶwջ$&"mXHL!1?7'1smXHL!1DmDH,	oRBe1{:Rou{{V-,|e%v`Z6OiʭVYr~=K,gh$vvFb}d֨/?aR2wYľ?d=R_5[{cX{:Zc:},^$ދY+f;@95,%רkGEc(=2l]3#OvOةDYXޑXLo	x{XHhKْ�Ep:;xO+n͉R.u-mXGq{!U812Ή-=oH|ș~v\9abK9#Orr͉m30r9r|g+*׉Ҏ
    eKb]HqYK 0k{;eK`$&*;DmDHLDDHLD&1QIL>1ЊiNkBvKw5EyX=}?y̝@-^{u؇'>#"Cu2/�
    ا.MQ/sn{ݻL+XĀ+Sc0/2XoPH8*~hJI,v.HĀVO\GH�T#sb'E#;p)Hb$\b"V!1D�!1HLH 1H,o\Tqm]z[xפ_� 1फ]d>$6kSّpUC][x!C:̘/bnY~cG('.\ĀbY"ǒsd8*.$']h|9JbkT V	}ɑm=qGb_Pe_R]>fǦvcNIX̧�׉.ks\$NS|-H 1Kb�$&Bb�$&Bb$X~!SG˯crߛ bY`;٣Ps8*e?dЕCWH9ν-FW 1beR蚉)##k:$FbUoL"R=N#1;ÑV?:z-J%V$Fbo'|D7*sMGGb1\;)=sb$NdHH 1@b"$@b"$Fb�p	4M$Twhc|^{ĀD8
    sr 1�0%D05z$0ED@b 1�h�H�
    ,еH��@b�@b 1�$S�H$�$� 1�H�H$�@b 1� 1߱<O$!%&"KbYd$$6Mӟ?$$vH$&"$@b"Bb 1!1D�x'1{۹#uzIb�5lC3<oZ
    �@bK#no*̭o?9ĤljʵZÑcɁX/=]ZsޏHL2ػjO!@b̉3ל9?WŞHLɄ�NFb$@b"Bb 1!1$&"$. 1�f&9#1@b"bN 1!1@b"Bb�$&"$HLDH 1!1@b"Bb�$&"$HLDH 1!1@b"Bb�$&"$HLDH 1!1@b"Bb�$&"$I`$&"cH$&"$HLDH$&"$@b"Bb@1z/mSH-ex];WyIXN{i?!-a=e=k4q)wk>:Эlm$֎3qwV1#s)q\Ǹв%1Ė	i!ljkql	eqtZbsiGI<Cn펻DǹչŎ\-%r\$FbМ^cg]],HhĭJ;/r\,z;:I91ub÷ZooeQ1#F�:k=uڭE6Wk_boH$&"$@b"Bb 1!1*_;wcqz>*
    ewRjuu繴G:Eb}t[q|hO;Bʖ`Ƙ0{nrfc5IVXt盺(++G`#?H,h$Fb蹕9c#Qrz~'$@b}1m|7{]|@bVUǛCdʱz^=@b"2lH$&"$@b"Bb 1Ħi"1@b"RUbۍ@b"Bb�$&"$HLDH 1!1DH@b"Bb@6V~+nx	1$%ve;��EN����IENDB`����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/manual/images/chapters/appenders/appender.uml�����������������������������������0000644�0001750�0001750�00000203362�12143164146�024745� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?>
    <XPD:PROJECT xmlns:XPD="http://www.staruml.com" version="1">
    <XPD:HEADER>
    <XPD:SUBUNITS>
    </XPD:SUBUNITS>
    <XPD:PROFILES>
    <XPD:PROFILE>UMLStandard</XPD:PROFILE>
    </XPD:PROFILES>
    </XPD:HEADER>
    <XPD:BODY>
    <XPD:OBJ name="DocumentElement" type="UMLProject" guid="JEGKOL0wwE6O2Emy29kFuwAA">
    <XPD:ATTR name="Title" type="string">Untitled</XPD:ATTR>
    <XPD:ATTR name="#OwnedElements" type="integer">6</XPD:ATTR>
    <XPD:OBJ name="OwnedElements[0]" type="UMLModel" guid="Nu7ucmhxa0aC5WTL/Hl5qgAA">
    <XPD:ATTR name="Name" type="string">Use Case Model</XPD:ATTR>
    <XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
    <XPD:ATTR name="StereotypeName" type="string">useCaseModel</XPD:ATTR>
    <XPD:REF name="Namespace">JEGKOL0wwE6O2Emy29kFuwAA</XPD:REF>
    <XPD:ATTR name="#OwnedDiagrams" type="integer">1</XPD:ATTR>
    <XPD:OBJ name="OwnedDiagrams[0]" type="UMLUseCaseDiagram" guid="AOpe9EpUuEqbJkhPg6UN+wAA">
    <XPD:ATTR name="Name" type="string">Main</XPD:ATTR>
    <XPD:REF name="DiagramOwner">Nu7ucmhxa0aC5WTL/Hl5qgAA</XPD:REF>
    <XPD:OBJ name="DiagramView" type="UMLUseCaseDiagramView" guid="jha7HHI2JEmss41Kcx5rmAAA">
    <XPD:REF name="Diagram">AOpe9EpUuEqbJkhPg6UN+wAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[1]" type="UMLModel" guid="nzHC5ZSub0yOmXzqddVh7QAA">
    <XPD:ATTR name="Name" type="string">Analysis Model</XPD:ATTR>
    <XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
    <XPD:ATTR name="StereotypeName" type="string">analysisModel</XPD:ATTR>
    <XPD:REF name="Namespace">JEGKOL0wwE6O2Emy29kFuwAA</XPD:REF>
    <XPD:ATTR name="#OwnedDiagrams" type="integer">1</XPD:ATTR>
    <XPD:OBJ name="OwnedDiagrams[0]" type="UMLClassDiagram" guid="ucvrQjCCHEOMfGCAAc5zPQAA">
    <XPD:ATTR name="Name" type="string">Main</XPD:ATTR>
    <XPD:ATTR name="DefaultDiagram" type="boolean">True</XPD:ATTR>
    <XPD:ATTR name="DiagramType" type="string">RobustnessDiagram</XPD:ATTR>
    <XPD:REF name="DiagramOwner">nzHC5ZSub0yOmXzqddVh7QAA</XPD:REF>
    <XPD:OBJ name="DiagramView" type="UMLClassDiagramView" guid="sxIjWZ8eT0KTmxDhcr84UAAA">
    <XPD:REF name="Diagram">ucvrQjCCHEOMfGCAAc5zPQAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[2]" type="UMLModel" guid="dQlYoesWY0yxg2VJCxHxOQAA">
    <XPD:ATTR name="Name" type="string">Design Model</XPD:ATTR>
    <XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
    <XPD:ATTR name="StereotypeName" type="string">designModel</XPD:ATTR>
    <XPD:REF name="Namespace">JEGKOL0wwE6O2Emy29kFuwAA</XPD:REF>
    <XPD:ATTR name="#OwnedDiagrams" type="integer">1</XPD:ATTR>
    <XPD:OBJ name="OwnedDiagrams[0]" type="UMLClassDiagram" guid="jdoFPKplx0W53YpEZi95TAAA">
    <XPD:ATTR name="Name" type="string">Main</XPD:ATTR>
    <XPD:ATTR name="DefaultDiagram" type="boolean">True</XPD:ATTR>
    <XPD:REF name="DiagramOwner">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:OBJ name="DiagramView" type="UMLClassDiagramView" guid="oWGUMKWgOEus+/3Jqk/tpAAA">
    <XPD:REF name="Diagram">jdoFPKplx0W53YpEZi95TAAA</XPD:REF>
    <XPD:ATTR name="#OwnedViews" type="integer">15</XPD:ATTR>
    <XPD:OBJ name="OwnedViews[0]" type="UMLClassView" guid="tSxGyrwfEkSgp1EcheSXaAAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Left" type="integer">496</XPD:ATTR>
    <XPD:ATTR name="Top" type="integer">140</XPD:ATTR>
    <XPD:ATTR name="Width" type="integer">161</XPD:ATTR>
    <XPD:ATTR name="Height" type="integer">69</XPD:ATTR>
    <XPD:ATTR name="ShowProperty" type="boolean">True</XPD:ATTR>
    <XPD:REF name="Model">Ec4V6xlK5USBInAfRT+kBgAA</XPD:REF>
    <XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="4OJodmUjvU6Oqy3fe+ZfuQAA">
    <XPD:OBJ name="NameLabel" type="LabelView" guid="nTnCIikI3UOMxs9QtoE1sgAA">
    <XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
    <XPD:ATTR name="Text" type="string">Appender</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="LabelView" guid="iOfigC5hM06553UhkG3o4gAA">
    <XPD:ATTR name="Text" type="string">&lt;&lt;interface&gt;&gt;</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="LabelView" guid="gAAMY35/8kO92uV18LmCWAAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="m+f/Nz96gEqfQeHGgfAxjwAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:REF name="Model">Ec4V6xlK5USBInAfRT+kBgAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="ViAxcLeYxEC/QDB9dCuwagAA">
    <XPD:REF name="Model">Ec4V6xlK5USBInAfRT+kBgAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="gvxeAhX+WkGcvqw6KjlA7wAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:REF name="Model">Ec4V6xlK5USBInAfRT+kBgAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[1]" type="UMLClassView" guid="NaiNuZ1qLUu+5nZq2pgoJgAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Left" type="integer">448</XPD:ATTR>
    <XPD:ATTR name="Top" type="integer">384</XPD:ATTR>
    <XPD:ATTR name="Width" type="integer">257</XPD:ATTR>
    <XPD:ATTR name="Height" type="integer">69</XPD:ATTR>
    <XPD:REF name="Model">rzT262Z1jEeiLPfjq8YXAQAA</XPD:REF>
    <XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="3Qx0O28WLEC1wlpntM/QWQAA">
    <XPD:OBJ name="NameLabel" type="LabelView" guid="gLLmeDlS+Ua9NL1IKkZqBgAA">
    <XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
    <XPD:ATTR name="Text" type="string">OutputStreamAppender</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="LabelView" guid="7awZOkK3cUS1dBI9YKP2TwAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="LabelView" guid="LtVVLfcmbkq7TWeA6T7S4AAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="H/1viIm6yE20XaYIV5XQmgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:REF name="Model">rzT262Z1jEeiLPfjq8YXAQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="/LiIyuskqE6jkbei5roLSgAA">
    <XPD:REF name="Model">rzT262Z1jEeiLPfjq8YXAQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="LFUOQyCzKkODyDltdenqSQAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:REF name="Model">rzT262Z1jEeiLPfjq8YXAQAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[2]" type="UMLClassView" guid="82N1NUXIMU2s0JVvIgA33wAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Left" type="integer">460</XPD:ATTR>
    <XPD:ATTR name="Top" type="integer">248</XPD:ATTR>
    <XPD:ATTR name="Width" type="integer">233</XPD:ATTR>
    <XPD:ATTR name="Height" type="integer">95</XPD:ATTR>
    <XPD:REF name="Model">xVL+I0ePyEKePe2ybmIZqQAA</XPD:REF>
    <XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="MEOstStI0EC0RQoiT5DFLQAA">
    <XPD:OBJ name="NameLabel" type="LabelView" guid="CDkuaYXZDEC5+cMzdHsl8wAA">
    <XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
    <XPD:ATTR name="Text" type="string">UnsynchronizedAppenderBase</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="LabelView" guid="N/VzkXk9vkGTb/Gq05Hm4gAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="LabelView" guid="Wbq2KwFqq0uOx2yShkE49QAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="MbkisNcJq06fy8rfNf//qgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:REF name="Model">xVL+I0ePyEKePe2ybmIZqQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="bHWlSSp0L0KsF9iS2K/VuAAA">
    <XPD:REF name="Model">xVL+I0ePyEKePe2ybmIZqQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="A3o0HBZQP0+GUAIDarVM5AAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:REF name="Model">xVL+I0ePyEKePe2ybmIZqQAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[3]" type="UMLClassView" guid="uk+yKXVJ4kGbJp9tS5jKTwAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Left" type="integer">348</XPD:ATTR>
    <XPD:ATTR name="Top" type="integer">500</XPD:ATTR>
    <XPD:ATTR name="Width" type="integer">205</XPD:ATTR>
    <XPD:ATTR name="Height" type="integer">56</XPD:ATTR>
    <XPD:REF name="Model">yqvs3sZ9DUGqcZqP0JhEYQAA</XPD:REF>
    <XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="pd1JNpNdxkm4N3mMjABxcgAA">
    <XPD:OBJ name="NameLabel" type="LabelView" guid="Jfgvt5uhf0aDXP4fvB8FuAAA">
    <XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
    <XPD:ATTR name="Text" type="string">ConsoleAppender</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="LabelView" guid="x915MlraB0+hK5agb0HxVwAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="LabelView" guid="o72CPBdC2UGyraSt4vxsHQAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="nH6UBhoeX0KbQRIkAzLiWAAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:REF name="Model">yqvs3sZ9DUGqcZqP0JhEYQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="Jb94kigpgUqu4dlcc+CGdAAA">
    <XPD:REF name="Model">yqvs3sZ9DUGqcZqP0JhEYQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="QxduxAxohEmCZQGHeQsZcgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:REF name="Model">yqvs3sZ9DUGqcZqP0JhEYQAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[4]" type="UMLRealizationView" guid="lL0hvfNl1UCp0ZckmzYqAAAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Points" type="Points">576,248;576,208</XPD:ATTR>
    <XPD:REF name="Model">MLMgV5lk30+73KeQUlkJ1AAA</XPD:REF>
    <XPD:REF name="Head">tSxGyrwfEkSgp1EcheSXaAAA</XPD:REF>
    <XPD:REF name="Tail">82N1NUXIMU2s0JVvIgA33wAA</XPD:REF>
    <XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="R+yIkrw1xkGRRmxo6cIv7AAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">MLMgV5lk30+73KeQUlkJ1AAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="MHt2cHh8nkq4xztkXeNA1AAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
    <XPD:REF name="Model">MLMgV5lk30+73KeQUlkJ1AAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="1cFzyVYsZUexhz9n3LRU9AAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">MLMgV5lk30+73KeQUlkJ1AAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[5]" type="UMLGeneralizationView" guid="fqotcKjEKUu0dHy5krCbbgAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Points" type="Points">576,384;576,342</XPD:ATTR>
    <XPD:REF name="Model">iGZQWONRSkmUZXwA2ctTYAAA</XPD:REF>
    <XPD:REF name="Head">82N1NUXIMU2s0JVvIgA33wAA</XPD:REF>
    <XPD:REF name="Tail">NaiNuZ1qLUu+5nZq2pgoJgAA</XPD:REF>
    <XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="a5TKNXnsu0Cm1O3vWK2A5QAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">iGZQWONRSkmUZXwA2ctTYAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="lfapsg0nvkOzLtKq21jKcQAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
    <XPD:REF name="Model">iGZQWONRSkmUZXwA2ctTYAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="J/CqIqCm4k64OiOc5XyUFgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">iGZQWONRSkmUZXwA2ctTYAAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[6]" type="UMLGeneralizationView" guid="Byj7ulJD9UmN+tawKGwCEgAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Points" type="Points">481,500;537,452</XPD:ATTR>
    <XPD:REF name="Model">AjD3odwWRkqn7DLLtsqSMQAA</XPD:REF>
    <XPD:REF name="Head">NaiNuZ1qLUu+5nZq2pgoJgAA</XPD:REF>
    <XPD:REF name="Tail">uk+yKXVJ4kGbJp9tS5jKTwAA</XPD:REF>
    <XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="HQiDhC6IA0iqlMhf1tdcJQAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">AjD3odwWRkqn7DLLtsqSMQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="npCChlHvbECPkeBWStHdGwAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
    <XPD:REF name="Model">AjD3odwWRkqn7DLLtsqSMQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="DNi8lqQWi0GHkNrHlB+wdAAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">AjD3odwWRkqn7DLLtsqSMQAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[7]" type="UMLClassView" guid="umRYCn2dek6PVCutQ7EHjgAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Left" type="integer">612</XPD:ATTR>
    <XPD:ATTR name="Top" type="integer">500</XPD:ATTR>
    <XPD:ATTR name="Width" type="integer">181</XPD:ATTR>
    <XPD:ATTR name="Height" type="integer">82</XPD:ATTR>
    <XPD:REF name="Model">fbO+5cdSPEmSXuXSqE8gXgAA</XPD:REF>
    <XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="IY/ehYDmxki8kSqbCHHCfQAA">
    <XPD:OBJ name="NameLabel" type="LabelView" guid="lcA4v9eDHUugTZoPU740LAAA">
    <XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
    <XPD:ATTR name="Text" type="string">FileAppender</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="LabelView" guid="OVAuCrBMykaCfcii7gDdCwAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="LabelView" guid="xiHCrB3qu0yBBg0U/q3EawAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="XJMRRQ4IvEKN76PkDbMKOQAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:REF name="Model">fbO+5cdSPEmSXuXSqE8gXgAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="wZmHw439VE+zuefCYQQqVAAA">
    <XPD:REF name="Model">fbO+5cdSPEmSXuXSqE8gXgAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="PHqgEBQhpEmlVKbjkRedkAAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:REF name="Model">fbO+5cdSPEmSXuXSqE8gXgAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[8]" type="UMLGeneralizationView" guid="xnvee9U5202YS/ztrwJSRAAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Points" type="Points">661,500;611,452</XPD:ATTR>
    <XPD:REF name="Model">DwI/SvxrPEa+xlJeUNknVQAA</XPD:REF>
    <XPD:REF name="Head">NaiNuZ1qLUu+5nZq2pgoJgAA</XPD:REF>
    <XPD:REF name="Tail">umRYCn2dek6PVCutQ7EHjgAA</XPD:REF>
    <XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="oASzcKN58EuYmztjk4WiEwAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">DwI/SvxrPEa+xlJeUNknVQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="O0OgQK6n40urO6JVc74njgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
    <XPD:REF name="Model">DwI/SvxrPEa+xlJeUNknVQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="bgKTOidFkEeRLn6bk0KEEgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">DwI/SvxrPEa+xlJeUNknVQAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[9]" type="UMLClassView" guid="rHFGD6C9T0y5SMWPFgS09QAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Left" type="integer">596</XPD:ATTR>
    <XPD:ATTR name="Top" type="integer">628</XPD:ATTR>
    <XPD:ATTR name="Width" type="integer">213</XPD:ATTR>
    <XPD:ATTR name="Height" type="integer">69</XPD:ATTR>
    <XPD:REF name="Model">V4xOMUpxokyB4fxrQNJPxQAA</XPD:REF>
    <XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="OuAPH3aKlk2rg4cWgwv2BQAA">
    <XPD:OBJ name="NameLabel" type="LabelView" guid="BEu6SCte7E6fslLxmD8brgAA">
    <XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
    <XPD:ATTR name="Text" type="string">RollingFileAppender</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="LabelView" guid="diAZdqUjrUSnaEkyvki5HwAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="LabelView" guid="HpL3GnQOO0KyNABCTyAsRwAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="1hKuFZUojkuzeqX9AiWUlwAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:REF name="Model">V4xOMUpxokyB4fxrQNJPxQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="g+GUofZEmU2lEM1VL3vLIQAA">
    <XPD:REF name="Model">V4xOMUpxokyB4fxrQNJPxQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="4HSOp+H3/ECJnOpzcIo3jwAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:REF name="Model">V4xOMUpxokyB4fxrQNJPxQAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[10]" type="UMLClassView" guid="0AQ8gdYUKk2Ms7nTdCyd3QAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Left" type="integer">788</XPD:ATTR>
    <XPD:ATTR name="Top" type="integer">372</XPD:ATTR>
    <XPD:ATTR name="Width" type="integer">137</XPD:ATTR>
    <XPD:ATTR name="Height" type="integer">95</XPD:ATTR>
    <XPD:REF name="Model">F1lk6TogWUGfYFH4FvBLOAAA</XPD:REF>
    <XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="h/ce/kieOUyyxRZ6c71fTQAA">
    <XPD:OBJ name="NameLabel" type="LabelView" guid="UZy1Qq+RWUWzR+BkMD2qBwAA">
    <XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
    <XPD:ATTR name="Text" type="string">Encoder</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="LabelView" guid="A/4/paNKfEeyuIjaeXDosAAA">
    <XPD:ATTR name="Text" type="string">&lt;&lt;interface&gt;&gt;</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="LabelView" guid="Y950eaGp5kKS5JcixC2pLAAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="lyHSH0gj5USAm8DDiVvc1AAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:REF name="Model">F1lk6TogWUGfYFH4FvBLOAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="A7cLwlK4RESapHusUAalugAA">
    <XPD:REF name="Model">F1lk6TogWUGfYFH4FvBLOAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="qQCEnWeXyUaictLrSH/4IgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:REF name="Model">F1lk6TogWUGfYFH4FvBLOAAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[11]" type="UMLAssociationView" guid="lMmxZJude0e4iK5TJK4KmwAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Points" type="Points">788,419;704,419</XPD:ATTR>
    <XPD:REF name="Model">kXyf6+RLrki8M9yh9qd9JwAA</XPD:REF>
    <XPD:REF name="Head">NaiNuZ1qLUu+5nZq2pgoJgAA</XPD:REF>
    <XPD:REF name="Tail">0AQ8gdYUKk2Ms7nTdCyd3QAA</XPD:REF>
    <XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="Lpxx+3J+D0S223D5ODQq4wAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">kXyf6+RLrki8M9yh9qd9JwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="rhfNbKEGWUaK9KPGeno2AAAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
    <XPD:REF name="Model">kXyf6+RLrki8M9yh9qd9JwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="5lfzJsxzLkS60zCpNz5+twAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">kXyf6+RLrki8M9yh9qd9JwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="w+U1pR05XkeMT1rnnS2TcgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
    <XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
    <XPD:REF name="Model">KNPa5jL8m0SnxCPJDiLPEwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="G2JYoZaOKku0lwIKN7cKRQAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
    <XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
    <XPD:REF name="Model">JFP7YnD8ak2COLWe8jfBSwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="Wzm+qJkDL0+jgE0ioVsNvwAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
    <XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
    <XPD:REF name="Model">KNPa5jL8m0SnxCPJDiLPEwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="h/GU+p9gHkyMIIzW5Tap4wAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
    <XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
    <XPD:REF name="Model">JFP7YnD8ak2COLWe8jfBSwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="MLngpvqsdU+i4Djdsali7wAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
    <XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
    <XPD:REF name="Model">KNPa5jL8m0SnxCPJDiLPEwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="yN2upZx6REeZpBi/IRMnlgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
    <XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
    <XPD:REF name="Model">JFP7YnD8ak2COLWe8jfBSwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="ZVjULz2utUKwdUcoGweZkgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
    <XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
    <XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
    <XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
    <XPD:REF name="Model">KNPa5jL8m0SnxCPJDiLPEwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="4leicQixUEWISYBF6P8LSgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
    <XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
    <XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
    <XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
    <XPD:REF name="Model">JFP7YnD8ak2COLWe8jfBSwAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[12]" type="UMLGeneralizationView" guid="VGws4gb7FEGKDPIpXKW13QAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Points" type="Points">702,628;702,581</XPD:ATTR>
    <XPD:REF name="Model">MAm8gr3YDE+lxocsUB9afAAA</XPD:REF>
    <XPD:REF name="Head">umRYCn2dek6PVCutQ7EHjgAA</XPD:REF>
    <XPD:REF name="Tail">rHFGD6C9T0y5SMWPFgS09QAA</XPD:REF>
    <XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="2t9xQX0DaECER1G841x4ggAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">MAm8gr3YDE+lxocsUB9afAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="ZJ+e5yqWkkyJmgI5NCe9qQAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
    <XPD:REF name="Model">MAm8gr3YDE+lxocsUB9afAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="uWFySM7Jq026r7z2lz9/TgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">MAm8gr3YDE+lxocsUB9afAAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[13]" type="UMLClassView" guid="XnLeT4tUAUivKFCoAi8mCgAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Left" type="integer">240</XPD:ATTR>
    <XPD:ATTR name="Top" type="integer">392</XPD:ATTR>
    <XPD:ATTR name="Width" type="integer">152</XPD:ATTR>
    <XPD:ATTR name="Height" type="integer">56</XPD:ATTR>
    <XPD:REF name="Model">ObD18j8uiUuqWEEES+U7VwAA</XPD:REF>
    <XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="w2rmuF62nUmUAhOhrmqOyQAA">
    <XPD:OBJ name="NameLabel" type="LabelView" guid="irr7mImnC0OIf0QeBwSo3AAA">
    <XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
    <XPD:ATTR name="Text" type="string">Filter</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="LabelView" guid="/ZkI9RE/EkCmMYBYxW9vSgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="LabelView" guid="/Seh5JPXJ0WqIDeUCCMxGQAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="Y+K3bBi2DEiJlBzf/w+degAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:REF name="Model">ObD18j8uiUuqWEEES+U7VwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="x12I7wVJHkKX8s9N/bVWLQAA">
    <XPD:REF name="Model">ObD18j8uiUuqWEEES+U7VwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="ybd6Chc7bUaikqpMu2gydwAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:REF name="Model">ObD18j8uiUuqWEEES+U7VwAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[14]" type="UMLAssociationView" guid="1GuVB976AUueN1l11+x/9AAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Points" type="Points">391,419;448,419</XPD:ATTR>
    <XPD:REF name="Model">uh4HvYt2ZECJHo2VN0YtPwAA</XPD:REF>
    <XPD:REF name="Head">NaiNuZ1qLUu+5nZq2pgoJgAA</XPD:REF>
    <XPD:REF name="Tail">XnLeT4tUAUivKFCoAi8mCgAA</XPD:REF>
    <XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="rvc1lZzjJkyWMr6P/IPRnQAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">uh4HvYt2ZECJHo2VN0YtPwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="bCA0jUpnukKQFQdvrUXC5gAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
    <XPD:REF name="Model">uh4HvYt2ZECJHo2VN0YtPwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="okxxVKfDiESE7wFAiHiTwQAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">uh4HvYt2ZECJHo2VN0YtPwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="IPgYB1C27EyGv2x09901MgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
    <XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
    <XPD:REF name="Model">IA0uuG/DqUSPP93NTt7KPwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="mdaJom9Aq0CCnF2E8j5mfgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
    <XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
    <XPD:REF name="Model">rtqCfaDNzE6xCSqNvsGQmAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="QVrq+D0yCke4xdkp2ecVFgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
    <XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
    <XPD:REF name="Model">IA0uuG/DqUSPP93NTt7KPwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="u6QeWosm+0GF06B6oeoA3AAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
    <XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
    <XPD:REF name="Model">rtqCfaDNzE6xCSqNvsGQmAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="YoNg+kiZ/0Kk9BC8Hs4jBgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
    <XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
    <XPD:REF name="Model">IA0uuG/DqUSPP93NTt7KPwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="TwLu6YMezke1PLwCqD9EKwAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
    <XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
    <XPD:REF name="Model">rtqCfaDNzE6xCSqNvsGQmAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="j3F8XkYCU0K+Wb/6ACwHmAAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
    <XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
    <XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
    <XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
    <XPD:REF name="Model">IA0uuG/DqUSPP93NTt7KPwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="5M6UkF5vREiYn4A49eajJAAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
    <XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
    <XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
    <XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
    <XPD:REF name="Model">rtqCfaDNzE6xCSqNvsGQmAAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:ATTR name="#OwnedElements" type="integer">28</XPD:ATTR>
    <XPD:OBJ name="OwnedElements[0]" type="UMLInterface" guid="bL5DGTE1wkqFiYq+yJuTRAAA">
    <XPD:ATTR name="Name" type="string">Bae, Rankyoung</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[1]" type="UMLInterface" guid="PfW7flMvskqKmFDofejCYQAA">
    <XPD:ATTR name="Name" type="string">Jung, Yoontae</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[2]" type="UMLInterface" guid="XthOkDh0rk67+FyPgXCRgAAA">
    <XPD:ATTR name="Name" type="string">Kim, Hyunsoo</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[3]" type="UMLInterface" guid="WhfjywuM1kqS7RtEmuvAlgAA">
    <XPD:ATTR name="Name" type="string">Kim, Jeongil</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[4]" type="UMLClass" guid="Ec4V6xlK5USBInAfRT+kBgAA">
    <XPD:ATTR name="Name" type="string">Appender</XPD:ATTR>
    <XPD:ATTR name="StereotypeName" type="string">interface</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">tSxGyrwfEkSgp1EcheSXaAAA</XPD:REF>
    <XPD:REF name="Views[1]">m+f/Nz96gEqfQeHGgfAxjwAA</XPD:REF>
    <XPD:REF name="Views[2]">ViAxcLeYxEC/QDB9dCuwagAA</XPD:REF>
    <XPD:REF name="Views[3]">gvxeAhX+WkGcvqw6KjlA7wAA</XPD:REF>
    <XPD:ATTR name="#ClientDependencies" type="integer">1</XPD:ATTR>
    <XPD:REF name="ClientDependencies[0]">kjMmekdMhUCZp7nT1+7m5QAA</XPD:REF>
    <XPD:ATTR name="#SupplierDependencies" type="integer">2</XPD:ATTR>
    <XPD:REF name="SupplierDependencies[0]">MLMgV5lk30+73KeQUlkJ1AAA</XPD:REF>
    <XPD:REF name="SupplierDependencies[1]">kjMmekdMhUCZp7nT1+7m5QAA</XPD:REF>
    <XPD:ATTR name="#Operations" type="integer">1</XPD:ATTR>
    <XPD:OBJ name="Operations[0]" type="UMLOperation" guid="FRx7C/jgm0uUQ2KJbSES0QAA">
    <XPD:ATTR name="Name" type="string">doAppend</XPD:ATTR>
    <XPD:REF name="Owner">Ec4V6xlK5USBInAfRT+kBgAA</XPD:REF>
    <XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="HEOzMeB7hUCVhMMCFiMU/QAA">
    <XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
    <XPD:ATTR name="TypeExpression" type="string">void</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">FRx7C/jgm0uUQ2KJbSES0QAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="/QxGe2nRTke4OPZr6B8DjwAA">
    <XPD:ATTR name="Name" type="string">E event</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">FRx7C/jgm0uUQ2KJbSES0QAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[5]" type="UMLClass" guid="wrUqRmysaUaTNG+EIldTAgAA">
    <XPD:ATTR name="Name" type="string">Lee, Jangwoo</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[6]" type="UMLClass" guid="R4ueGs13U0uU7uA7GfQuwgAA">
    <XPD:ATTR name="Name" type="string">Lee, Minkyu</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[7]" type="UMLClass" guid="cZJpDMIhLkaN+6380nTjCgAA">
    <XPD:ATTR name="Name" type="string">Lim, Heejin</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[8]" type="UMLInterface" guid="KkLGJmfcO0y7keuSLh3xpQAA">
    <XPD:ATTR name="Name" type="string">Bae, Rankyoung1</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[9]" type="UMLClass" guid="rzT262Z1jEeiLPfjq8YXAQAA">
    <XPD:ATTR name="Name" type="string">OutputStreamAppender</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">NaiNuZ1qLUu+5nZq2pgoJgAA</XPD:REF>
    <XPD:REF name="Views[1]">H/1viIm6yE20XaYIV5XQmgAA</XPD:REF>
    <XPD:REF name="Views[2]">/LiIyuskqE6jkbei5roLSgAA</XPD:REF>
    <XPD:REF name="Views[3]">LFUOQyCzKkODyDltdenqSQAA</XPD:REF>
    <XPD:ATTR name="#Generalizations" type="integer">1</XPD:ATTR>
    <XPD:REF name="Generalizations[0]">iGZQWONRSkmUZXwA2ctTYAAA</XPD:REF>
    <XPD:ATTR name="#Specializations" type="integer">2</XPD:ATTR>
    <XPD:REF name="Specializations[0]">AjD3odwWRkqn7DLLtsqSMQAA</XPD:REF>
    <XPD:REF name="Specializations[1]">DwI/SvxrPEa+xlJeUNknVQAA</XPD:REF>
    <XPD:ATTR name="#Operations" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Operations[0]" type="UMLOperation" guid="Y/8ny1CDlUmGw7XO+p1IVAAA">
    <XPD:ATTR name="Name" type="string">setOutputStream</XPD:ATTR>
    <XPD:REF name="Owner">rzT262Z1jEeiLPfjq8YXAQAA</XPD:REF>
    <XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="o7mxtv1VFUuGMzTZ/PzpJQAA">
    <XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
    <XPD:ATTR name="TypeExpression" type="string">void</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">Y/8ny1CDlUmGw7XO+p1IVAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="WiQnBPlZNUKAb1kDr8rYMAAA">
    <XPD:ATTR name="Name" type="string">OutputStream</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">Y/8ny1CDlUmGw7XO+p1IVAAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="Operations[1]" type="UMLOperation" guid="LBTffoJKpkuteoCZOKUnaQAA">
    <XPD:ATTR name="Name" type="string">setEncoder</XPD:ATTR>
    <XPD:REF name="Owner">rzT262Z1jEeiLPfjq8YXAQAA</XPD:REF>
    <XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="QBbT8+accEGiDOyIxemC6gAA">
    <XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
    <XPD:ATTR name="TypeExpression" type="string">void</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">LBTffoJKpkuteoCZOKUnaQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="euJK1npBAkKQLyA/ixyf4gAA">
    <XPD:ATTR name="Name" type="string">Encoder&lt;E&gt;</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">LBTffoJKpkuteoCZOKUnaQAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:ATTR name="#Associations" type="integer">3</XPD:ATTR>
    <XPD:REF name="Associations[0]">CNBYSz/4s0OUBwR3Ujj7qAAA</XPD:REF>
    <XPD:REF name="Associations[1]">KNPa5jL8m0SnxCPJDiLPEwAA</XPD:REF>
    <XPD:REF name="Associations[2]">IA0uuG/DqUSPP93NTt7KPwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[10]" type="UMLClass" guid="xVL+I0ePyEKePe2ybmIZqQAA">
    <XPD:ATTR name="Name" type="string">UnsynchronizedAppenderBase</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">82N1NUXIMU2s0JVvIgA33wAA</XPD:REF>
    <XPD:REF name="Views[1]">MbkisNcJq06fy8rfNf//qgAA</XPD:REF>
    <XPD:REF name="Views[2]">bHWlSSp0L0KsF9iS2K/VuAAA</XPD:REF>
    <XPD:REF name="Views[3]">A3o0HBZQP0+GUAIDarVM5AAA</XPD:REF>
    <XPD:ATTR name="#ClientDependencies" type="integer">1</XPD:ATTR>
    <XPD:REF name="ClientDependencies[0]">MLMgV5lk30+73KeQUlkJ1AAA</XPD:REF>
    <XPD:ATTR name="#Generalizations" type="integer">1</XPD:ATTR>
    <XPD:REF name="Generalizations[0]">mt8sHMuW6k6vvkswchHN9AAA</XPD:REF>
    <XPD:ATTR name="#Specializations" type="integer">2</XPD:ATTR>
    <XPD:REF name="Specializations[0]">mt8sHMuW6k6vvkswchHN9AAA</XPD:REF>
    <XPD:REF name="Specializations[1]">iGZQWONRSkmUZXwA2ctTYAAA</XPD:REF>
    <XPD:ATTR name="#Operations" type="integer">4</XPD:ATTR>
    <XPD:OBJ name="Operations[0]" type="UMLOperation" guid="QrizX1w8Uk+lWkr80819WAAA">
    <XPD:ATTR name="Name" type="string">doAppend</XPD:ATTR>
    <XPD:REF name="Owner">xVL+I0ePyEKePe2ybmIZqQAA</XPD:REF>
    <XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="i3SFY3XjzkqfjCdeRItB0AAA">
    <XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
    <XPD:ATTR name="TypeExpression" type="string">void</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">QrizX1w8Uk+lWkr80819WAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="rcsyT8SmtEaJWAgOu29ifgAA">
    <XPD:ATTR name="Name" type="string">E event</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">QrizX1w8Uk+lWkr80819WAAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="Operations[1]" type="UMLOperation" guid="G5EvR3IAqUWyIUSQT5iKfAAA">
    <XPD:ATTR name="Name" type="string">append</XPD:ATTR>
    <XPD:ATTR name="Visibility" type="UMLVisibilityKind">vkProtected</XPD:ATTR>
    <XPD:REF name="Owner">xVL+I0ePyEKePe2ybmIZqQAA</XPD:REF>
    <XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="BZo+omwID0Op8lvSMhrmCAAA">
    <XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
    <XPD:ATTR name="TypeExpression" type="string">void</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">G5EvR3IAqUWyIUSQT5iKfAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="0mhi1Re0mUaekyTApQtYKgAA">
    <XPD:ATTR name="Name" type="string">E event</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">G5EvR3IAqUWyIUSQT5iKfAAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="Operations[2]" type="UMLOperation" guid="noZlW3WOpUSNYP7MIP2dIAAA">
    <XPD:ATTR name="Name" type="string">addFilter</XPD:ATTR>
    <XPD:REF name="Owner">xVL+I0ePyEKePe2ybmIZqQAA</XPD:REF>
    <XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="7JBY4nyhIES1n0jpwFzs0wAA">
    <XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
    <XPD:ATTR name="TypeExpression" type="string">void</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">noZlW3WOpUSNYP7MIP2dIAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="Zd/8hSZIgUuOnnlNuMOW3QAA">
    <XPD:ATTR name="Name" type="string">Filter&lt;E&gt; filter</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">noZlW3WOpUSNYP7MIP2dIAAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="Operations[3]" type="UMLOperation" guid="+Hda0J6VTEGM7V6+m3aW7QAA">
    <XPD:ATTR name="Name" type="string">getFilterChainDecision</XPD:ATTR>
    <XPD:REF name="Owner">xVL+I0ePyEKePe2ybmIZqQAA</XPD:REF>
    <XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="b7Oh8zbH6kKEeryzkMlLQgAA">
    <XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
    <XPD:ATTR name="TypeExpression" type="string">FilterReply</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">+Hda0J6VTEGM7V6+m3aW7QAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="QFIz2saC3kK9QRns9gVVIwAA">
    <XPD:ATTR name="Name" type="string">E event</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">+Hda0J6VTEGM7V6+m3aW7QAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[11]" type="UMLClass" guid="yqvs3sZ9DUGqcZqP0JhEYQAA">
    <XPD:ATTR name="Name" type="string">ConsoleAppender</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">uk+yKXVJ4kGbJp9tS5jKTwAA</XPD:REF>
    <XPD:REF name="Views[1]">nH6UBhoeX0KbQRIkAzLiWAAA</XPD:REF>
    <XPD:REF name="Views[2]">Jb94kigpgUqu4dlcc+CGdAAA</XPD:REF>
    <XPD:REF name="Views[3]">QxduxAxohEmCZQGHeQsZcgAA</XPD:REF>
    <XPD:ATTR name="#Generalizations" type="integer">3</XPD:ATTR>
    <XPD:REF name="Generalizations[0]">KECSr2IcSEKuUekqxWFfQQAA</XPD:REF>
    <XPD:REF name="Generalizations[1]">jfTGxiHUzUynYKDudsAtlgAA</XPD:REF>
    <XPD:REF name="Generalizations[2]">AjD3odwWRkqn7DLLtsqSMQAA</XPD:REF>
    <XPD:ATTR name="#Specializations" type="integer">2</XPD:ATTR>
    <XPD:REF name="Specializations[0]">KECSr2IcSEKuUekqxWFfQQAA</XPD:REF>
    <XPD:REF name="Specializations[1]">jfTGxiHUzUynYKDudsAtlgAA</XPD:REF>
    <XPD:ATTR name="#Operations" type="integer">1</XPD:ATTR>
    <XPD:OBJ name="Operations[0]" type="UMLOperation" guid="QBjgNn4eI0Gb0Lu8uW8RgQAA">
    <XPD:ATTR name="Name" type="string">setTarget</XPD:ATTR>
    <XPD:REF name="Owner">yqvs3sZ9DUGqcZqP0JhEYQAA</XPD:REF>
    <XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="D6Tvg4B6zk2nDCrvCSXiogAA">
    <XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
    <XPD:ATTR name="TypeExpression" type="string">void</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">QBjgNn4eI0Gb0Lu8uW8RgQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="5HN4co7SEkGYIIXb9P4IcwAA">
    <XPD:ATTR name="Name" type="string">String</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">QBjgNn4eI0Gb0Lu8uW8RgQAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[12]" type="UMLRealization" guid="MLMgV5lk30+73KeQUlkJ1AAA">
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:REF name="Client">xVL+I0ePyEKePe2ybmIZqQAA</XPD:REF>
    <XPD:REF name="Supplier">Ec4V6xlK5USBInAfRT+kBgAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">lL0hvfNl1UCp0ZckmzYqAAAA</XPD:REF>
    <XPD:REF name="Views[1]">R+yIkrw1xkGRRmxo6cIv7AAA</XPD:REF>
    <XPD:REF name="Views[2]">MHt2cHh8nkq4xztkXeNA1AAA</XPD:REF>
    <XPD:REF name="Views[3]">1cFzyVYsZUexhz9n3LRU9AAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[13]" type="UMLRealization" guid="kjMmekdMhUCZp7nT1+7m5QAA">
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:REF name="Client">Ec4V6xlK5USBInAfRT+kBgAA</XPD:REF>
    <XPD:REF name="Supplier">Ec4V6xlK5USBInAfRT+kBgAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[14]" type="UMLGeneralization" guid="mt8sHMuW6k6vvkswchHN9AAA">
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:REF name="Child">xVL+I0ePyEKePe2ybmIZqQAA</XPD:REF>
    <XPD:REF name="Parent">xVL+I0ePyEKePe2ybmIZqQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[15]" type="UMLGeneralization" guid="iGZQWONRSkmUZXwA2ctTYAAA">
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:REF name="Child">rzT262Z1jEeiLPfjq8YXAQAA</XPD:REF>
    <XPD:REF name="Parent">xVL+I0ePyEKePe2ybmIZqQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">fqotcKjEKUu0dHy5krCbbgAA</XPD:REF>
    <XPD:REF name="Views[1]">a5TKNXnsu0Cm1O3vWK2A5QAA</XPD:REF>
    <XPD:REF name="Views[2]">lfapsg0nvkOzLtKq21jKcQAA</XPD:REF>
    <XPD:REF name="Views[3]">J/CqIqCm4k64OiOc5XyUFgAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[16]" type="UMLGeneralization" guid="KECSr2IcSEKuUekqxWFfQQAA">
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:REF name="Child">yqvs3sZ9DUGqcZqP0JhEYQAA</XPD:REF>
    <XPD:REF name="Parent">yqvs3sZ9DUGqcZqP0JhEYQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[17]" type="UMLGeneralization" guid="jfTGxiHUzUynYKDudsAtlgAA">
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:REF name="Child">yqvs3sZ9DUGqcZqP0JhEYQAA</XPD:REF>
    <XPD:REF name="Parent">yqvs3sZ9DUGqcZqP0JhEYQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[18]" type="UMLGeneralization" guid="AjD3odwWRkqn7DLLtsqSMQAA">
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:REF name="Child">yqvs3sZ9DUGqcZqP0JhEYQAA</XPD:REF>
    <XPD:REF name="Parent">rzT262Z1jEeiLPfjq8YXAQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">Byj7ulJD9UmN+tawKGwCEgAA</XPD:REF>
    <XPD:REF name="Views[1]">HQiDhC6IA0iqlMhf1tdcJQAA</XPD:REF>
    <XPD:REF name="Views[2]">npCChlHvbECPkeBWStHdGwAA</XPD:REF>
    <XPD:REF name="Views[3]">DNi8lqQWi0GHkNrHlB+wdAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[19]" type="UMLClass" guid="fbO+5cdSPEmSXuXSqE8gXgAA">
    <XPD:ATTR name="Name" type="string">FileAppender</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">umRYCn2dek6PVCutQ7EHjgAA</XPD:REF>
    <XPD:REF name="Views[1]">XJMRRQ4IvEKN76PkDbMKOQAA</XPD:REF>
    <XPD:REF name="Views[2]">wZmHw439VE+zuefCYQQqVAAA</XPD:REF>
    <XPD:REF name="Views[3]">PHqgEBQhpEmlVKbjkRedkAAA</XPD:REF>
    <XPD:ATTR name="#Generalizations" type="integer">1</XPD:ATTR>
    <XPD:REF name="Generalizations[0]">DwI/SvxrPEa+xlJeUNknVQAA</XPD:REF>
    <XPD:ATTR name="#Specializations" type="integer">1</XPD:ATTR>
    <XPD:REF name="Specializations[0]">MAm8gr3YDE+lxocsUB9afAAA</XPD:REF>
    <XPD:ATTR name="#Operations" type="integer">3</XPD:ATTR>
    <XPD:OBJ name="Operations[0]" type="UMLOperation" guid="RGzx8sTCQ0+SvjEhj3FCpwAA">
    <XPD:ATTR name="Name" type="string">setFile</XPD:ATTR>
    <XPD:REF name="Owner">fbO+5cdSPEmSXuXSqE8gXgAA</XPD:REF>
    <XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="uxSNpKmGV0+K54EwgffqpgAA">
    <XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
    <XPD:ATTR name="TypeExpression" type="string">void</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">RGzx8sTCQ0+SvjEhj3FCpwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="i90wHpacOEiHseZIDnpZAAAA">
    <XPD:ATTR name="Name" type="string">String</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">RGzx8sTCQ0+SvjEhj3FCpwAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="Operations[1]" type="UMLOperation" guid="emxKAOn2sEGODzlrBwfBDQAA">
    <XPD:ATTR name="Name" type="string">setPrudent</XPD:ATTR>
    <XPD:REF name="Owner">fbO+5cdSPEmSXuXSqE8gXgAA</XPD:REF>
    <XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="Qzhwjji8FkawThwNpGWYlAAA">
    <XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
    <XPD:ATTR name="TypeExpression" type="string">void</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">emxKAOn2sEGODzlrBwfBDQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="/c5zBe26tkWrpTH8RQJKDgAA">
    <XPD:ATTR name="Name" type="string">boolean</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">emxKAOn2sEGODzlrBwfBDQAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="Operations[2]" type="UMLOperation" guid="pzOru1aa1kKBEpPdw/x8HwAA">
    <XPD:ATTR name="Name" type="string">setAppend</XPD:ATTR>
    <XPD:REF name="Owner">fbO+5cdSPEmSXuXSqE8gXgAA</XPD:REF>
    <XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="xfe5Kz7eGUGt/qsdAVz1nwAA">
    <XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
    <XPD:ATTR name="TypeExpression" type="string">void</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">pzOru1aa1kKBEpPdw/x8HwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="byGZtqglLkSMXqHvyAwzXQAA">
    <XPD:ATTR name="Name" type="string">boolean</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">pzOru1aa1kKBEpPdw/x8HwAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[20]" type="UMLGeneralization" guid="DwI/SvxrPEa+xlJeUNknVQAA">
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:REF name="Child">fbO+5cdSPEmSXuXSqE8gXgAA</XPD:REF>
    <XPD:REF name="Parent">rzT262Z1jEeiLPfjq8YXAQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">xnvee9U5202YS/ztrwJSRAAA</XPD:REF>
    <XPD:REF name="Views[1]">oASzcKN58EuYmztjk4WiEwAA</XPD:REF>
    <XPD:REF name="Views[2]">O0OgQK6n40urO6JVc74njgAA</XPD:REF>
    <XPD:REF name="Views[3]">bgKTOidFkEeRLn6bk0KEEgAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[21]" type="UMLClass" guid="V4xOMUpxokyB4fxrQNJPxQAA">
    <XPD:ATTR name="Name" type="string">RollingFileAppender</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">rHFGD6C9T0y5SMWPFgS09QAA</XPD:REF>
    <XPD:REF name="Views[1]">1hKuFZUojkuzeqX9AiWUlwAA</XPD:REF>
    <XPD:REF name="Views[2]">g+GUofZEmU2lEM1VL3vLIQAA</XPD:REF>
    <XPD:REF name="Views[3]">4HSOp+H3/ECJnOpzcIo3jwAA</XPD:REF>
    <XPD:ATTR name="#Generalizations" type="integer">1</XPD:ATTR>
    <XPD:REF name="Generalizations[0]">MAm8gr3YDE+lxocsUB9afAAA</XPD:REF>
    <XPD:ATTR name="#Operations" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Operations[0]" type="UMLOperation" guid="zJE7QEhOYkGwavHKRi/e1gAA">
    <XPD:ATTR name="Name" type="string">setRollingPolicy</XPD:ATTR>
    <XPD:REF name="Owner">V4xOMUpxokyB4fxrQNJPxQAA</XPD:REF>
    <XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="fBG8X0xpiU2QG4VhcArHXwAA">
    <XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
    <XPD:ATTR name="TypeExpression" type="string">void</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">zJE7QEhOYkGwavHKRi/e1gAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="pokyvx+ik0yawdfYXl/EHQAA">
    <XPD:ATTR name="Name" type="string">RollingPolicy</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">zJE7QEhOYkGwavHKRi/e1gAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="Operations[1]" type="UMLOperation" guid="90I+pA0XnkiDcK8Um95kDwAA">
    <XPD:ATTR name="Name" type="string">setTriggeringPolicy</XPD:ATTR>
    <XPD:REF name="Owner">V4xOMUpxokyB4fxrQNJPxQAA</XPD:REF>
    <XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR>
    <XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="/rKEm7ax1kOVmGAMDsfXRgAA">
    <XPD:ATTR name="Name" type="string">TriggeringPolicy&lt;E&gt;</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">90I+pA0XnkiDcK8Um95kDwAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[22]" type="UMLClass" guid="F1lk6TogWUGfYFH4FvBLOAAA">
    <XPD:ATTR name="Name" type="string">Encoder</XPD:ATTR>
    <XPD:ATTR name="StereotypeName" type="string">interface</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">0AQ8gdYUKk2Ms7nTdCyd3QAA</XPD:REF>
    <XPD:REF name="Views[1]">lyHSH0gj5USAm8DDiVvc1AAA</XPD:REF>
    <XPD:REF name="Views[2]">A7cLwlK4RESapHusUAalugAA</XPD:REF>
    <XPD:REF name="Views[3]">qQCEnWeXyUaictLrSH/4IgAA</XPD:REF>
    <XPD:ATTR name="#Operations" type="integer">3</XPD:ATTR>
    <XPD:OBJ name="Operations[0]" type="UMLOperation" guid="KTkAdBDG1k6vBX6/3VDh3wAA">
    <XPD:ATTR name="Name" type="string">init</XPD:ATTR>
    <XPD:REF name="Owner">F1lk6TogWUGfYFH4FvBLOAAA</XPD:REF>
    <XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="K1xInu1IW06VU8RAornDFgAA">
    <XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
    <XPD:ATTR name="TypeExpression" type="string">void</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">KTkAdBDG1k6vBX6/3VDh3wAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="q0oNOzYnwkC00CgD5grrpgAA">
    <XPD:ATTR name="Name" type="string">OutputStream</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">KTkAdBDG1k6vBX6/3VDh3wAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="Operations[1]" type="UMLOperation" guid="0OIKQj9lz0epLF4VThStRgAA">
    <XPD:ATTR name="Name" type="string">doEncode</XPD:ATTR>
    <XPD:REF name="Owner">F1lk6TogWUGfYFH4FvBLOAAA</XPD:REF>
    <XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="DMbvra8Y4E+d/ziodIGqyQAA">
    <XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
    <XPD:ATTR name="TypeExpression" type="string">void</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">0OIKQj9lz0epLF4VThStRgAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="v+KY7Q4t4kak92z8YJ0K7AAA">
    <XPD:ATTR name="Name" type="string">E event</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">0OIKQj9lz0epLF4VThStRgAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="Operations[2]" type="UMLOperation" guid="I6ieXuGhMkCcbz9MDCy1uAAA">
    <XPD:ATTR name="Name" type="string">close</XPD:ATTR>
    <XPD:REF name="Owner">F1lk6TogWUGfYFH4FvBLOAAA</XPD:REF>
    <XPD:ATTR name="#Parameters" type="integer">1</XPD:ATTR>
    <XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="XyFkApGcmESs4dwJgM1s8AAA">
    <XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
    <XPD:ATTR name="TypeExpression" type="string">void</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">I6ieXuGhMkCcbz9MDCy1uAAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR>
    <XPD:REF name="Associations[0]">1RTpKQO+4U+uqZahckvNEwAA</XPD:REF>
    <XPD:REF name="Associations[1]">JFP7YnD8ak2COLWe8jfBSwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[23]" type="UMLAssociation" guid="u9/9xY5vOU2kSfX9AmlMAwAA">
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="CNBYSz/4s0OUBwR3Ujj7qAAA">
    <XPD:REF name="Association">u9/9xY5vOU2kSfX9AmlMAwAA</XPD:REF>
    <XPD:REF name="Participant">rzT262Z1jEeiLPfjq8YXAQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="1RTpKQO+4U+uqZahckvNEwAA">
    <XPD:ATTR name="Aggregation" type="UMLAggregationKind">akComposite</XPD:ATTR>
    <XPD:REF name="Association">u9/9xY5vOU2kSfX9AmlMAwAA</XPD:REF>
    <XPD:REF name="Participant">F1lk6TogWUGfYFH4FvBLOAAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[24]" type="UMLAssociation" guid="kXyf6+RLrki8M9yh9qd9JwAA">
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">lMmxZJude0e4iK5TJK4KmwAA</XPD:REF>
    <XPD:REF name="Views[1]">Lpxx+3J+D0S223D5ODQq4wAA</XPD:REF>
    <XPD:REF name="Views[2]">rhfNbKEGWUaK9KPGeno2AAAA</XPD:REF>
    <XPD:REF name="Views[3]">5lfzJsxzLkS60zCpNz5+twAA</XPD:REF>
    <XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="JFP7YnD8ak2COLWe8jfBSwAA">
    <XPD:REF name="Association">kXyf6+RLrki8M9yh9qd9JwAA</XPD:REF>
    <XPD:REF name="Participant">F1lk6TogWUGfYFH4FvBLOAAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">G2JYoZaOKku0lwIKN7cKRQAA</XPD:REF>
    <XPD:REF name="Views[1]">h/GU+p9gHkyMIIzW5Tap4wAA</XPD:REF>
    <XPD:REF name="Views[2]">yN2upZx6REeZpBi/IRMnlgAA</XPD:REF>
    <XPD:REF name="Views[3]">4leicQixUEWISYBF6P8LSgAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="KNPa5jL8m0SnxCPJDiLPEwAA">
    <XPD:ATTR name="Aggregation" type="UMLAggregationKind">akComposite</XPD:ATTR>
    <XPD:REF name="Association">kXyf6+RLrki8M9yh9qd9JwAA</XPD:REF>
    <XPD:REF name="Participant">rzT262Z1jEeiLPfjq8YXAQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">w+U1pR05XkeMT1rnnS2TcgAA</XPD:REF>
    <XPD:REF name="Views[1]">Wzm+qJkDL0+jgE0ioVsNvwAA</XPD:REF>
    <XPD:REF name="Views[2]">MLngpvqsdU+i4Djdsali7wAA</XPD:REF>
    <XPD:REF name="Views[3]">ZVjULz2utUKwdUcoGweZkgAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[25]" type="UMLGeneralization" guid="MAm8gr3YDE+lxocsUB9afAAA">
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:REF name="Child">V4xOMUpxokyB4fxrQNJPxQAA</XPD:REF>
    <XPD:REF name="Parent">fbO+5cdSPEmSXuXSqE8gXgAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">VGws4gb7FEGKDPIpXKW13QAA</XPD:REF>
    <XPD:REF name="Views[1]">2t9xQX0DaECER1G841x4ggAA</XPD:REF>
    <XPD:REF name="Views[2]">ZJ+e5yqWkkyJmgI5NCe9qQAA</XPD:REF>
    <XPD:REF name="Views[3]">uWFySM7Jq026r7z2lz9/TgAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[26]" type="UMLClass" guid="ObD18j8uiUuqWEEES+U7VwAA">
    <XPD:ATTR name="Name" type="string">Filter</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">XnLeT4tUAUivKFCoAi8mCgAA</XPD:REF>
    <XPD:REF name="Views[1]">Y+K3bBi2DEiJlBzf/w+degAA</XPD:REF>
    <XPD:REF name="Views[2]">x12I7wVJHkKX8s9N/bVWLQAA</XPD:REF>
    <XPD:REF name="Views[3]">ybd6Chc7bUaikqpMu2gydwAA</XPD:REF>
    <XPD:ATTR name="#Operations" type="integer">1</XPD:ATTR>
    <XPD:OBJ name="Operations[0]" type="UMLOperation" guid="h2ChKW0gZES/JuZQuxznnwAA">
    <XPD:ATTR name="Name" type="string">decide</XPD:ATTR>
    <XPD:REF name="Owner">ObD18j8uiUuqWEEES+U7VwAA</XPD:REF>
    <XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="en+rpIVeCkSoJAa812PoLwAA">
    <XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
    <XPD:ATTR name="TypeExpression" type="string">FilterReply</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">h2ChKW0gZES/JuZQuxznnwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="uNlc9FZz80ancniLw7/8MgAA">
    <XPD:ATTR name="Name" type="string">E event</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">h2ChKW0gZES/JuZQuxznnwAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR>
    <XPD:REF name="Associations[0]">rtqCfaDNzE6xCSqNvsGQmAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[27]" type="UMLAssociation" guid="uh4HvYt2ZECJHo2VN0YtPwAA">
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">1GuVB976AUueN1l11+x/9AAA</XPD:REF>
    <XPD:REF name="Views[1]">rvc1lZzjJkyWMr6P/IPRnQAA</XPD:REF>
    <XPD:REF name="Views[2]">bCA0jUpnukKQFQdvrUXC5gAA</XPD:REF>
    <XPD:REF name="Views[3]">okxxVKfDiESE7wFAiHiTwQAA</XPD:REF>
    <XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="rtqCfaDNzE6xCSqNvsGQmAAA">
    <XPD:REF name="Association">uh4HvYt2ZECJHo2VN0YtPwAA</XPD:REF>
    <XPD:REF name="Participant">ObD18j8uiUuqWEEES+U7VwAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">mdaJom9Aq0CCnF2E8j5mfgAA</XPD:REF>
    <XPD:REF name="Views[1]">TwLu6YMezke1PLwCqD9EKwAA</XPD:REF>
    <XPD:REF name="Views[2]">u6QeWosm+0GF06B6oeoA3AAA</XPD:REF>
    <XPD:REF name="Views[3]">5M6UkF5vREiYn4A49eajJAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="IA0uuG/DqUSPP93NTt7KPwAA">
    <XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
    <XPD:REF name="Association">uh4HvYt2ZECJHo2VN0YtPwAA</XPD:REF>
    <XPD:REF name="Participant">rzT262Z1jEeiLPfjq8YXAQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">IPgYB1C27EyGv2x09901MgAA</XPD:REF>
    <XPD:REF name="Views[1]">YoNg+kiZ/0Kk9BC8Hs4jBgAA</XPD:REF>
    <XPD:REF name="Views[2]">QVrq+D0yCke4xdkp2ecVFgAA</XPD:REF>
    <XPD:REF name="Views[3]">j3F8XkYCU0K+Wb/6ACwHmAAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[3]" type="UMLModel" guid="UTbE66PthkuXloDrctmmwwAA">
    <XPD:ATTR name="Name" type="string">Implementation Model</XPD:ATTR>
    <XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
    <XPD:ATTR name="StereotypeName" type="string">implementationModel</XPD:ATTR>
    <XPD:REF name="Namespace">JEGKOL0wwE6O2Emy29kFuwAA</XPD:REF>
    <XPD:ATTR name="#OwnedDiagrams" type="integer">1</XPD:ATTR>
    <XPD:OBJ name="OwnedDiagrams[0]" type="UMLComponentDiagram" guid="UJbtRzsKuEa7sZAmr/tDGAAA">
    <XPD:ATTR name="Name" type="string">Main</XPD:ATTR>
    <XPD:REF name="DiagramOwner">UTbE66PthkuXloDrctmmwwAA</XPD:REF>
    <XPD:OBJ name="DiagramView" type="UMLComponentDiagramView" guid="vo5SIJcJIUWJz7mqomMr4wAA">
    <XPD:REF name="Diagram">UJbtRzsKuEa7sZAmr/tDGAAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:ATTR name="#OwnedElements" type="integer">1</XPD:ATTR>
    <XPD:OBJ name="OwnedElements[0]" type="UMLInterface" guid="naDG3jNwKEqkpiKwcQF/xgAA">
    <XPD:ATTR name="Name" type="string">dsd</XPD:ATTR>
    <XPD:REF name="Namespace">UTbE66PthkuXloDrctmmwwAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[4]" type="UMLModel" guid="sbAEE91CXU+VbUQcRp4FwgAA">
    <XPD:ATTR name="Name" type="string">Deployment Model</XPD:ATTR>
    <XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
    <XPD:ATTR name="StereotypeName" type="string">deploymentModel</XPD:ATTR>
    <XPD:REF name="Namespace">JEGKOL0wwE6O2Emy29kFuwAA</XPD:REF>
    <XPD:ATTR name="#OwnedDiagrams" type="integer">1</XPD:ATTR>
    <XPD:OBJ name="OwnedDiagrams[0]" type="UMLDeploymentDiagram" guid="tzrsCrrbjka5umz88mdzIAAA">
    <XPD:ATTR name="Name" type="string">Main</XPD:ATTR>
    <XPD:REF name="DiagramOwner">sbAEE91CXU+VbUQcRp4FwgAA</XPD:REF>
    <XPD:OBJ name="DiagramView" type="UMLDeploymentDiagramView" guid="OlRAEhzdxkCw+mUnxs9v2wAA">
    <XPD:REF name="Diagram">tzrsCrrbjka5umz88mdzIAAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[5]" type="UMLModel" guid="mC0A50UCikqRZT73f5NgTgAA">
    <XPD:ATTR name="Name" type="string">Analysis Model1</XPD:ATTR>
    <XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
    <XPD:ATTR name="StereotypeName" type="string">analysisModel</XPD:ATTR>
    <XPD:REF name="Namespace">JEGKOL0wwE6O2Emy29kFuwAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    </XPD:BODY>
    </XPD:PROJECT>
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/manual/images/chapters/appenders/dbAppenderLE.gif�������������������������������0000644�0001750�0001750�00000075050�12143164146�025405� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89aJo������>N`@N]8DQ恞]r:GT5AM⚼ޗږؕגӄrVi|2=H$,4!'犨xj '.=JWf~}mJ[kcy,6?DSa6FT#>MY۷tܕʽl܋}{yەͯ|||zzzyyyvvvuuurrrqqqnnnllljjjiiifffdddbbbaaa___\\\ZZZXXXVVVTTTRRRQQQNNNLLLKKKIIIFFFEEECCC@@@>>>:::333,,,$$$
    
    
    !���,����Jo���YH*\Ȱ`T
    #JHŋbȱǏ
    _"I\+U.0iIaʒ5s6͞&/cd)]ʴӧPJ*ճ[ȒRʵׯ`ZŪ5ٳhӪzX[k.mV]YzߪW.\ˆجP/Y2iڴϠCMiН<}
    	Y7w>M۸sN؜uNӪW&&ͳOjy盥W͚.bkΛkУ_ou˯]7zsg?{]_qc,$J(4&'@h|Ivx(r
    )ʼzbء�L n8!"h3(dq8H&y�b)0ɔb%.h$EL:	T	kA
    )�s0fȦ,ba#8ˉx~gaOF)̔)$2J(މH(DJf))UreZ6)
    ^I"ĎbJ/�+,2R-Or2k8~Š5dkm>,(Ћ)
    ;,Fkmk0xŚ(�golZl. ;$*Bf^JL1KKm�RK^<r'I/bof2$*3g�zlp.+2nvm.12Kn6={1ly	Ǩ-t{x|L]n}wܴX^�S
    πsý',~ +6R(KlBnoR"u*)J(,K*`0H(8ǧ_|L«=+<}*	)E'נTb+1OX{H3	=.TEc1]/{`|}KRѾ"~SgXVck
    p{[E,H@Qp`$:щ@*V!)UY!Cn{O(/%-EBMRz_P!#Rٓw@	BԆW
    D#wD^+9R܏وSCU<.a-G6zG)nIK *x	D^(NhQ.b+py=x=6HV4ddNM.W!yc&vB+!
    9Fs5z2)Ob"җƳ'WDTBDϴ"'L
    Q8hazb-UwBۄd?E<!`#5衎YΘ;y?MoUb̀L!ղTF=Бfܣ(<t4tx!8jRy<6<JW 0!cbI^yȕKEVJZX~5/Hֲv]k+Zrlhzj]7ˉε5V:יh-2v;0hЃРM0Yy#>1
    e$C,<:]R74Qb8GdCqy U=lbkUtmoUKs`*B'yF`n`JǦxldSx0:f[[}kZSң(0RWS(ok܋t8lm|	l4C-`U)Fw¨ZFXD
    "@xqN]V*Scn0X=yp#]fwV4@*gZɭG|!,e�<`HɔMZ
    vԭ06Pqfzb4�Fq]3Tsc8Ɓ8!81*ڱyb@;Sc$8<<aW0#X<!x[�˘FuMGhjM'7)g(G2BeHD	wB>ź"3A
    MݰX/X1o[b!y<z[8ėmT<ÙNxŗ!}bE?:5qqOxOQ|5+Nԝݛ.hX<g(۟@O}Bf^y(0Ph~|
    Xd-7
    =ةA
    VƘ&&g`尐(-_<�̝*F#szP]E.o/(_>;av;Za~[ݒw?Ag~q0
    gvʗ
    zFz'o
    
    -auNp
    }	zw~ozwvxoWq`wi6;%�W	)n||oGs0
    8'	`|6v&|	6`v@S
    hj
    
    	�
    Іp`
    p 
    t(�P
    
    �}f؈؈lHXqX
    Ҡ
    `
    mhxh
    <	`
    @ϐ�? ȇ`=Xop舶8e)g،xx�
    Xpp�
    h(xH@ԅEOÆ㈌ؐ@樈i
    
    mHXnH
    $~憅q
    x
    6󠉭	 )F
    0y,�
    
    pysX
    Y
    S
    kx,0ٍ0(HjPA#YX戎QnHXh$	r8 ְjxfX8
    H!Ў8I	
    i"mI	
    P
    |ɌM$'3	瘎i8q)ts�q熲
    p
    _$	jiypY
    
    	poxr醡~װ	0	D20YTd
    	`
    0��ְ
    
    �
    ϐ= 0
    `j{ OB
    П?	
    p{
    #R
    
    �
    : 
    ֠
    
    ١pp
    nq
    z㉠
    ʠ
    PJ%yp
    A:`
    -:ɞ *jH p�GRIÐK�!a:p1@z48ji&0	0 
    B+:/0
    
    {	#�`
    5
    `IjW�
    䩧yzY7
    9
    ?
    ٭:ɬJj
    `Zw:2q0
    `У"ꭺʫDzڬ誣
    RZ
    ۚڪ:Pګ@ Äl
    :N	zګ
    ˚1ʍp
    ^P
    P
    jJaY
    P=pC2S4[X
    
    @
    Ȁ
    K=Ɛܐ,dk
    �
    z;	JU
    WsK
    0ea;
    p
    
    ڠ
    xiI@fp2
    b
    `
    k
    h( 
    P˷වE
    [ƫ[
    
    P``
    ȐZ�P;`KƠ
    {0̑*4Eԫ
    5\bqK[
    �]
    P
    hH
    ׀˿;۹PL8:ʀyZH`p;25BۿJ弶з.;XD|ثC
    UL۸R[hѕ
    ܾ4k"Tlc\zֿ6IP
    r	
    0[
    L$@p|Ljp½3<͐
    
    nj<ZlÐ|B
    Ƣ
    ȍ
    QDz츩PlCø
    ۠Ưl
    
    P2;}`
    ll=p‡
    
    	
    tpܺ\Ͱ`@2ߖͬ`P`��l\`m
    \l.]]&ͬ`0pm
    k{P,ytB-(p0`]>=K2]-?
    ŐG`HLaL@]Ь
    LUO]28j3ˀy
    M=E)}ρ
    ;hQTp.
    <
    m=\<ӌ؞M͡mל͟E}I~aszMөܺ@@
    ֠
    &!q֪ۦM46:}ͭm?Юp
    d=ռٝM-8]m
    c-ۮ?
    
    ]_sweBNm=>LLs^J
    "..'?]a-&0.<aMNP!$NA>hIHȾ	H=/U:0Ia*^S7._NBNR^v)>+`cq>Q"9NjK> 	p>^^	n>^~붎ꮞ>^쥮ȮĎ	n~~>>^ɾ^.<
    pWd_$_&(d@V0+/0�d5o6B3C#%_=B?
    �Z�
    �eP
    �AP^e_c_gl�qZ?C0k/do_~0`a}v{t]_/e
    �CA
    [oc_�Q�_ A |oĿ?_
    0 b/_O?گǟ|Oe4 XA	6P%-e0`0d*b/(>c$
    #_QFJ.a~`B8x9r4'^i$MQF}e$lrʁkԯP]pyXlEdׯc;њک&\pUƆˆaea	$Ll+H!_n䨤7;];B'HyI<xjmo琰h%'N'BW}jU h.h-75̚9sՀ	ѹZwy,n-T7N5l46@(c1ŸM4Լ3q9/hI;CQE
    \°E"# !&@b5P.�	P@&^#Tؠ	.
    R!TC
    !:rJX(`�1B��8>Ä0@3O¨
    V8@+:'eN0@ht;`53P,@
    'J
    JM�Iݠ!hpCX2J�#]O
    h%AP^} [0<vQ7lItW
    egh!q,`�I�˷'E/N8݅.
    3U07c&6CyU
    ~JxT7Vh��Ag[FAxJ+ࠧ
    uݮ#b+!D(+vi@8aVdSa1ƜybaY`u^kUW].dI'g
    Hcm#
    R(@
    5̘##fÌ
    `p<hB8"$CtCȼ,B3?Ģ30(@$l@l`0ÈX�w@
    /.$^	'	#7"	ӞD$HC8H@B`F
    	6ڇ# U;B(pA
    @,P@|HU�`>*`_0K
    n!i0�/j@Ula5:k(�ՐGUz#N;kJP
    hpP
    �p%	/UL3�2(@BP�Oar9PK	Ƞ{w4ᬚ@=(-(i3'\	H`7(T&XA ?H6/`;/˙@p U*&
    t(@Ё0)Hv4�:l{ 
    P'#4b/4GCN#7$A	|ʹ80$h	yH`PmP7!j_`=4U
    ؝)hO>*y,q"Q`@_X^0�bU1KgAwUK(b 3+h.5*Q*/Dv�?
    jې6P⚖+& i9T_,6n=r<S&j`eV0;&dE*g@
    6QjЮ$	#<E
    Zl#pWL%\Gpjf0c+k$%|8|/lRY &Jɝd׷.')R\%e�8Pr5D7Ho
    b}iH2	pU2v#`z
    P؀D`i.̈́B@#āx!l`@,l`GOG0לgl�A|/yUctZA|sf=  oHh*Y-L8ԤA
    4�٣=:whl5[5`)Ҁㆋ.qP9Og jQS1m.1>=M8�Bf-YfzFB
    R@فN@@V6[OLآTnB=!�	�pӒ/0'=uOެu .sZyuc@\&0�Ͼ0sp=VnIh*gf ch/�w
    	A
    |IX ]!EEWI\@ѳ&\#D=voV
     ff+'tIkNg~淟h@!SH8Gn-] QceDXB4P!�@E`~$A,KkϟջPL9d#
    P-YX܀T$hlZ>�wS7,X{ CAZzC򳬠:>/ӼX>�?H+̣<
    r1D;< =CAX0PɃi69D@I˾:yA$AEkrˁ!(#ȓ(V@
    Ȼ"2#0&�(&0�HX)$pX$BDC�/x7P=x$?>D<tG�e19D 5`B5 
    *=Qt@XXNį/HDt"<@7+'\\dFZE8뛁QEH`hL$qt%oE5ph<	)�Z&((�Hd4gm\=tfL%)7p</F >1ƈTH#�ȎF|&Ck@,�DH`\c%#@­\dAHzDqL#^DUH\E)JgFXDH/,Itąȇ$X&(Ha|HnDHVCt2Pɤ<j<:k~í$FYG|:K�P-ӀC|E:3��	8τ6h,6Ђ87P3(3X�-p<MM.٬N�,H�L2:Ђ.-.X1,( �/ MN\M$NOOOD\MlشN\�/8.hONtM3P	MΤN-0ЬԂ!@M.MNOלOu�|QP-RL�,`4R&mRMM uQ2�NNaLE
    P6eSe/UN*傐0,45M
    }S"R�]S'57EߜQMMLu)UR-US=UTMUU]UV-*(hUkUS؁ZU^U_W_=Vc=VdMV,Ue}VSeVgVj%(*Vm5`V^Ձ[TU_VaVtp-VVtUVs}WVV)@WfEBW~WW
    XXBX}-X]XmX}X=؄XXX-XHHD،؍؏~E(MYXmن
    YuYUXYYXmYHT�ZZ-Z=ZMZZL�ڥ}ZZZ�hZZZڤOZZ[
    Z]۫uZ}ۥ-[ۧZZ[۵TpZp脠UmOxx(�|ņ|Ѕ�(xxO�]ȇm��{pL8
    %
    �jx�\=ڦՅw[Xl[[MZNh\_0l
    Z_8ި}ެ]%ZO[x[z�P]{\]_[=Zܭ^K8\uߩZ]U^%Z-^%lP�f]_mߢ=\zp\-ZOH^
    bb^]m^
    ZO@m\%
    �aɥZjFvxePe�f�eaavfPX�`�YnaF`SxbU[cMPZmOPbLP[[pkP[UV@THT`jPiPcn]X�c<� ] ZX�؅M
    L` �:@ބ]XH`:>4�UcbeN^ YHcL^\v@eO;HUSZKe]T9ZJtx@�>c
    daN�O0SƄK�%N�XPaNhXZOUS8Pe=f8cU]enfnVeaFuXu0c8T�
    �`�LfLMJW]yv>ZEDބXdegwfgcg. :ajWHQ&΄L��`��fd`Mh]Eڦ}MNf]v_OZ$քj"~ƄSHp6FPMe
    ZfaH�
    �S0$%}ɕkքg6lv1mZOP�t-\^�b^\(^H^thg�~Hk@V[kH~phmZM؃d{Ӗ^HL@b㶆L[xVζlb�bblr@`NЇWh~�؃cmiNN_�vn%.monqmZ~_aaEPQP�fPڰi\HrV|nNXH:l΄.lnȆb ZoNmpxNYnΆ`@x@pgpObMoh(SkehOZhq~�(Y@DigPHWȇ_Swsa fhrXro=o(a>^n3gntN�xh[/}��knFkW=8c(V]%u[�bg_�_v]~s $O@b �hlZhiqeTwa8e%.ivZtgPgZvo_h}fmvSmfo_c8xq'wofp�}0xwJf}a} ujOhpxwpuw!v%nwv!uqYwi�X`tmWx9iq>?u#6yWywq^1�w`&t�N8ps$|?in�{zwwyWw?k`wxfa8?=Gv[ԗu~ui@�ȄFug_Xo^d%gjN fO{xlo|vZShkxNbMHT(|�je|ovvpwGY؇pwwXvցn`�ʆ=WB^nqR,@�e1]�؂
    (p'R	Wc1Ҭi&N$(&TFG1)ԝ=W._ö+X
    kYL<K:eȑ[2t\jaBb7v\”I]߿ѦԮUf#8KD/C-[4
    ܌Uk�"NxS'E-<(-v.iגSɓSv^}	S+1Řl۶U;ʛ4n֝oX&|zIyKdR^�+O>\S
    Ui#>x&\sMn@
    ,iӇ!>0xs
    ? 5:(@p	3{BƠ{;dۂU1|c|�0e\�ż
    7h5l$*S4rp3Ma6޼U6pL6F�1lnLlj3&RI&TNNZ4eVa�ݬˆezX�6*5ɔTyМ0 ec6q*T*y	2ؘcswHΏ'>cMjWUBX6a2٠#?K:$$]
    {dme)Tse9'''6<P(p#W_w'*`	*a/`r-#cr<)ccTs!c$39,K��,43&|q7?4MDlu�"JIJb%#1auIZ'	&bJu" 63pL+)x�b$c݋,.Rt{-TXJikI''Nt/*,Aj(/=ԥXpCw'	.D3Unwcc4ӵn	;\qύ¯N}T#%wQԢK_
    Ƿ
    k^)F/KXni6Y[L'?Au{�pqyˡ`}yC{J&1e|Pha_(c>	x 
    -xX$.c(!NhA1yE9
    NJabx0B�f<#Ө5n|#GQF7#8
    N䱏~#5q<$"RB\##)I5⎓d@rrz%MR�>J=j+M]b]LeLagH,nLsT3Bij,<AȜ�ŭ+R\E7kf�9r3BW
    >"Or,LSJq4D7(Z0ꝃO:5Vh9{fNgj,hJPD46QNkPTj8QIR46RST'$(FYմ]3XN#49Q�l`d8a.8Ʊ�mAZ "S1zW'D2s#13ؤs'bS	fi4@=-IX+V0r5E
    g%8ȱWT4XjWdh{tBkp&
    :*u'_q.N�+QC
    jRx`$kii`>AC.X5qyh@HqS-#j_++UhbD!S(:^3\8V<E4`C�7_�CN�<3N,x''
    -*XOF6ޡM#@^r']"Ƹh��dc5/
    _0A9)$/h2M"-2y,6xlcL3ь҇|e&&�-w9lrfӱh?36�k"(4AIlˎL|PD^xg&FyaNcVYh
    K540} 遏��1
    Ic@s}qjXtDh>P(Yui<`Z~W`llr8�B�ȸ\_QgG6�n圴z7?�Z#ue%F,,.ArBd8E1vIFhp̕C/xqpL#GwnF	 ilbWXēN &:m!=XD?zx+$E>Px}WȬ#؄od	nx\X~Wmm6ģCjoi<U/F7(S(5a`_]dpxcЗ=W_ig{QV|$}2'80waȨ}>I\PmC7tCoY
    M7
    rUQ_-˙W*t_C9@	&`5<e\h!;؂'E#FxC7-Ƕ!Cnܐ@C[J(tC,L$I|•}e<(ىUI(^X,$'p*F5Eƚ/;l[;=x&mUC;,
    0,B+p=,$_+L	@B=샆!X.ĵa b�_a^nV%Z"&ʡ#*F^#V&^,bؖ&B-\Ca1U%:$+Ƣ!&"L5Ι5`ŒN\B)NX]!b�Ǽi%hR2ID&@M\a^ˮ&<&I.u.#jlbܗ
    31|‘3^n[#$^Dh&om$BMM+B{5) y(&(Cݭ7dD5dHöa-2$aiVi@:8B/LV`QbWeS6&6`P5N]
    ]2xW%:&X2C4D3lbfITHV&!Yd@&4B܉Gw8h'F$@C,`8CfaC?"rBtfrLq&ȸe+r7elbwb1dVq~8@|"'1C�C7&rw%M=HC[Ч}g:*Et'7{ZʧqCE'Ч{v‚|�},}'CȘg<4P(7\"g/&x>4h<+pBz.<4€1@(2'8\0(΍
    i�CB2`iA8W0'>i¨/ȩ9^=CfÜB-/Ó<ُh:@甊h::,Cjif:xB2]b&)j¨{f4[<ԃ84j[C-.艥f00ꁪ(Z)>HH<h)rfʇ|:e,A;6VqvJ'␧5W"&T6tRDިh׹Fy+Qbr\6d?['X37\C6lH"#(d&L,V^,fn,R&,vȎ,ɖnB.B,~lȲlł',֬lJ
    ,,l.&�-ZbB#.f)&"f)L-l~Ɔm~*Bhڮ-۶۾-ƭܮ)-m't'-jMnz.&.ڂ.2.Fn䂂)XnnzBmVnrm▮-.(-ݫ.f25,t-2F/X/.	/8or0&i6<+ÿ9fo�lC)>/8Zo�x/Jo /M7D^Pr}^:mM:0MY`0u/7op7#.0s%/Nj0u
    
    p+S
    oC}߄;Dn'4NoC7L@
    ܐ&}.Bu+X.5:4x)$-�:̂,7-yqz.r�B~C"D'+X
    bD(>7qD3@C+DLMd�XIMԱ/~&3XmɂS\_&B<B*ЂS,x'Bx0k&)*s/Ǔ�k6�̈́.ÂɈ7q'B.r�4#2'B&7/	=-'+b<{+8>zu\G,,1;*l9b?h:b1c9wBR5H6b(/�&rrj%BA8ttB<c-t.ӏB3;DK4:%ǂ6BPS==&sCa*gs1BCk5F*K):t5ނ)&,4P&u+Hr�&Pxl/h	[E-lyf
    91t	=d^Cc?a5]v6Ta#6ٝ^mgۄf;6j5pYmMd>l7dC8L18'DoC*`+ÔU9Cw\a	1�5x*1Ctrc=<0PF046(7bpwUCH�9G;}7@0ÿ5)k%F�1s]7`7Cwl7uv[_0@éi
    tKo$2<!2�\93%z')sϕ0C9(F~w-CAC/bNXGWu7><J,#Tyv918,>.#Bx)B8l>`B0w$lMmBovp/q7rr&%LӼj&L>02uРm!H<C.rnZ4 c+h4.`_r
    *^¶$,D3܃n^[rMC4t8M>1fieڶ'*In''З;Ԃ'$x0C5dB@\{Ӵ=³'UeB5TX n;C3;Ad;Ѓ"tI*Boſ:ثn;=;0_G{[{�|%h;}mj-H<;J;,"L*,B[1HS?mBRf_<:N2{Wݶ[`T'4<#zrsNd<$*d9$ÿ&0 6�$"÷޷F|-@j18jw<!N:O0x8q5"gbIZ/C6PH;7<BUL?s>\C7XA7x{&nZS!k@\6]B~E?G#ZhB>$~ʗ_G>f1,7>
    C&4c\2S?g
    DaÔ``(P6dZ7Ʀq6آo!Tx{nGpOdiq,hPC
    )�nncZjԡG_d׭3[9(Z\jZqulTMB)]*kd9S.Y`,,8a1	�f-TTWʩI(ŔI#&JU>+7m+O5r嵭
    oe̙jd7x=#iZ.+g+m^k
    $�*d k8Vfh:TZ%_~x)L
    Pq0�mP?U8VnXi�J<1E
    B*C(}z\P�Lp wZQA�kbti=u>qGu$|ˉA!,h	`M2QשƁld2sxye;bl2Ж1'{PPbrKF_p=>ɸ5CG!)LQLR8O2ůiYh
    f6&0dmi%�d΁oA&V6iR%b-[n|\C%i5&bZU[Y\qWq7w^s�%X`W^LM1fUȘ4AVat1	G_V^ucz	�[YY
    /1MYU	o6_yp	�8obaeÁ؛[^5Ihs)3:l	l}+䕅FiYt.�2nZgⷳuSae:�b.!vA^^6ěZ�߄"8XZ:(Oخjom[?W[rtS�P~,XvґeoLge(b`^ya|ץO_j.~japiVHfw�c+Tg+B(XA^9XPbIXB!
    )
    N1iHOb0a
    o0E(XDЈ#^Ot„=a	NpD"i(E.rЋI�P1
    MiTF7i"G;y8: 	GM(䏅T!AHE>R#)F?V{d#3;^ғd(8Lj@Vo,(@ZɖJt.YrG&\	LaY&	b.9<dD77yG88tf5LgG9/#8Pbp@JD39L]S(莆ы
    P�;=	^샚(<Q�胤ڨwMr-@-7l< 0aN4(
    uC2zVPL_2ӡL0*-(xS�,!4(
    $ÁdMc&ʊM&U.yau	@
    z.2Td\a]-�Uq|9WCG8\^b
    LpȨhNgDiK(HGg1rHq$ݺD{ 8nMqeK[Ԫ%MuXhI-ʚ\z[
    cHhV&IX6�Ț`YUx=+Bζ+�
    :*n|1ymg{ִ];_xHKAڝk`-&8%p+\�vi}~@=L��$-f .Ihqmo]dXtTK4oV]?B24<;D[3ypC=>u.'֡O#V+!Px@)\{E4ZYL*qi+ci\9ft0jžIY;-�֘F/dchuS_4FOYhh͆&^mOo=^WƃE/K{'68;J(a	E2CԠ4r'H6ԑw;[28X4lxjX9aa\mxE u@oatc1dAkE4~K;ߦ*Pp]Tİ׍L^"p(6ԊG8 (wKf
    pl㮆?BAS@ ^F7ʢ
    6qCfD*[	Kȥ#g<1v/~#YDAG>
    c`bIÒ}U#~bVZFFc}F+(�bAaK
    "oF|�p<ξ BH"N".bFPAb�O /|CXB\8p|YL6!F#`0�2V,^t#x%jP*Aޡ!dUT΃|&.Xa~!:jҺszPބ>TXݴk$�Q!
    
    cAh!&%@f�JH8~!kp}ON�<6!=$A$q<Af%QKeq9\NC'QBi'1I"ADM	ISo
    Wa09A>d̈́{İ%pPA!L!n%j
    z2&b!AZ8(!ra'^:B	2�r"'o[x8qJ+6Ē'ڏ@d!t)03.aa(/aX[PS5k` au|03o1a.a-|aa!.r:Kar0'*2w[3,Dz8s5P6iar"l+!2-S9n6!#0!20S&d#s,9}L%JVA(oȁ-;OXD\0A4`4CdhEY.hRT}F\CmtF_|IG�W0DC4>hD++DIutIeA!~JAT!IQ
    dFyIșdTE.II:MtKbAKbJCL8AD۩N2bD]L!F5LTP*FEG5fQU4U48<LUTKGKdP:aDb5KXmO-T15STE2J=tX>AE'2(KIE1U!ġTTI4ZS^DiTUCaAB_uX`al
    `ˇr4(&D{�BVdGdKdOeSVd@֌2aTVfgfkfovfYeq6d%igyhVh6dJghiiEV�NajGVg6g9!4d>ajiikv@@!lQjvhmSnhUi`	/cV7Vo`oY)aYka6ppapoc)O2.j4|\rqr1Wts;F�r x!Dt]BrCX4ςb!(Z"K"ʦ{t@w6t#ww7\a<8O(zs`rs+d{wb!xςt/qvkjI+pG,{{kw(pwx'(*^Lwy"uwvivԩ~ׇ*�u)dWD^W
    J% !&fC,6i2�gF 8V!:/@Ӿ"Ʀ~%(~n+ĀBRowEQ(Ԭ08r3!A(,7/AԘV"L`j}_+!K(xYw
    *OT!ΐϋ,(%NL%)>
    8Q5XI{b04r&HVJx+BP[_<#v9a|J!BaxA9KA!ݎ!ࡻP!8Av!Z�(OxҡA꡻^AԙDá:A𡻸ٛ'"[!�ay)-+ZEyê`៨-�!!zY95-xq,p1ƎLU:
    C9$S%6:!AaE%�:>Gz:Z$z8a[`ZiڦqAq:ǺoQAYp�~JWnE]P]$WYXj0E2Z]alL!fm氕A8`ײҁp}aZ<fĻSq`@Zv0�$1ᄍ[h!图2=O| pwZ zA
    )=@5! Go72:)0ax!PubϿGC![S|Ł|P_2P!-8)=[vd%e%H)�A}䅦˾|$	|*�40!v8<a$r3[1y+K)
    ځ$<õJ/8j|+pYխA틸LJaLX?-.<6PEXE-Y*A]>]S`K=O=I	\s%PڱG=A":ס`!A]jagJ՜0cA!"Gh#ȡ2&Z!x?4>_AtA+b>A#%FqvbL4R@a]
    R["EB'(J!R,%˼A_S{c\fc/]~{
    "V\	 =%LAoJx꥞]]k{`ԋ\_Pa<)tj!]b4u|B#x!R)!Cgwu_jv{¬\7r4d6(4$.|8A/|pf6H�b[_l^kV�ݲqnYPx60W
     -@8i<yrP .|J
    
    <S81[=x:,XJiX"y*ԩTZ5'LA
    k=jw20|0I]6\|R /xni
    Œ$=={KV=]fu.0lNE5rH&Qr2JW6t'&k#f͜=irU݀:.apJc_;zREf?vy``~(~
    >!yE_y([:`~!cN`&VቮbU,BX"pBc6ވc:c62="*	F"dN>	8nV^e>nJ(Aj	f\zf6nBjhɚO%rdxbI<)&R'h.h>hB'Z饚niHiJj�j
    +J֊+":j6z믞*,*�*`>ˬNK\/Vkյ^ᶌImK!6"X}2	C&O3R5,hB[TϨC&ko�T;/Vڍs:6,{xN	2,\%%OEʍ5 [2zI+So�c:b̎?oKUfp!g,$U(UT-U}-sV\UW5oSui[TRSe-	~SI'818_,lTRJJ|"/H:HH,%8?y�ĀNZ��	dc<r/1@#drJ,'<&T#[<>\�^b{HkbzS5|sXj@pB8G+?bHIv;0
    y/t`aQ05Q/XG� y�	K(
    H=aY)G,LG?@@(䁑>O'эⓊ-4A�" cMTЉT-8]a#S=P,,T&E0Cu,Ә5kS1"NQ-G-\ѰqR!Od`e'1
    d@D- W"RA.1??C^%
    �(|xc@v8G#`Ldn
    JH	l\ :sG4`
    i(2i
    o>e\P;afԠ2(
    d�Ȇ4_hEl9:t$7un(4�'E.#FJя^`i;юt"YFCR*C^E&\Oy)G/α	:ԅT)/LR>T>mA>pTȩ?ڻEAP'HѩNմT1̱u;BMT�(AH@{Ss;i`�`U[W*Zg&DDcVl9!�cJQj?r!Y+)psr+,q	^A,TV.�.ڡ-[,@zqܣ`9LS*<�spYS3aXu?+HzPM-~ʇZ4aOppYFCf1f~pდ1GuoFON*~?1�(L#e7BxDj4 h5l3{#Dp)xONx1Gk FV&Dׂ29/CzS4IaS#YҔZ&!="&qiM0潗KdBNhdF/[ЭnBK& V*Ha
    Gˤ	:[x0C_͘7@AGi<U558K
    XtaiT
    ^/v`Cؿ?:±Y>f-9;Dsg@1+a}e`Ê#Ԝ|l޺qTx̄9q}:Al85^	ڳFyַތX*VKj|uvx4[	oNif3Y|D-aYD9l
    [Ģ8AT]ľ(x.!:=$ F3`r4\\r�40Q՗4xыo@<A7;0
    W(M/�}zP}A{/*Trfp߷a�wܰ'g4ط-Q@P|{
    @
    BtaPC
    M7tVz$C
    
    @/�ІW]uH q	8؀~	u,�	YVׅ_cXgsU?q	Pj=	G'|	@{	Qئ	 0
    
    А
    d@F0
    h
    �HF`RSьx�P
    �茾p
    �
    �
    
    Ҹ	
    @LHȍp
    ?
    p
    X騌8	
    hȐ
    CPr戎HF:PH@<r(iI브.	P
    p~豓hֈiD 	 IP
    p縔B57Icڡ
    ـN
    р
    
     
    ?9>?h;InAfɍ`0)3Y'	[ɔrT
    _cYy)rI@1(x77ra
    	Ґ0c,9ɚYd6e.Y-92G-/y5R
    ɜ	)ӹ)�I	�ٙ	Ii牞i㙞꩝	))C
    Ip
    Iy*0zɞى*ѹJjɟ꟡<t$#J%j')"	+
    1*3J5Z-6;ʣ=*	?AD#		I$O*3jC:WQ<Z[]*	20(XuX0fzj٦oˢ0i"�"a~.pcknz(Xn!Vj	՛- )ҧS.Dh]
    	0c+� 	@:<`p 2j8:
    Cb
    EP⊟pYQI!HJPiPa�p
    45!�	j�ڛѰ0
    а
    P4Z:5BCZV`	UQzWڪ.k+Y({`TZH KR@ʆGB*y
    `8p
    ,td		W
    
     h`ZkA f15b_chv@mS!0`3rΐ�
    /	f^P 	�@S!W)5Gb0TQVcR
    	{Ƞ4ǻ	{V`) {Yk,E2ݰ
    s{V�
    h
    Pg!K {TuF?aмGBuJ!˸	koH#qȹF;ck{;K
    XA\|\In`_f׵R
    "H
    w8	ywC #0p€` °_ŵ`
    
    sUw/`)
    @ 
    Ҡ
    p	P
    ~09
    o{Ptl �W
    #а:dۚǰ	>p	>PR_
    d
    ;@9!Ȭ̵�
    Eʨ�p	̲M0 <L-{Vȃ4W	 ꫿j`xl ,ܦ�@
    <͗@ɰ>`
    W
    p̨!lڬɜΟL?d
    Ȏ@!-L&h(,Ḭ)eV
    @p7E#\, uACp1^ClP.'A�ް]		QAvٶ͐
    c
    `{ a:	0L3rπ�ggT	p
    g	}r4R]{qv3ڐkYt6-0/'
    qWtgsIh@
    	 p	Ɛ2"IѰN	v"fW 
     h
    /i)a�bpi\!7tm]sMS.dN؜4
    @ux	0	&R y	0Wܳ W
    Uq	/+X	
    4bC
    	JFD	C	ǐ
    i[S w>dnVۚ0[MsGRAmNS:~jCܱhTZxmvut?$9'kn	p0�G'axѝWFvd0pE蕓p�rLznxY7I 
    PxѰ
    �l	3!H	JLtX�0M0ML0Mﬓm`
    	/wop%
    @'A0zpaNᠷ~	'	̴	c!n S*	�
    :9q0T0V|Ġ�Pn4QO(.�Yd"yOC
    tRNYа}ÀCLNETVKj>OrO`z5O0IT!_&?r?ZP
    @3כ�`
    s
    ^`
    
    	P^�AR��ujSK	n:D0	)AI	|8D7$x#uBJӥK$]J
    F)ǁ6iq!(L>
    b'i⤉L8q
    SRD&5P!K@pԄ7)x7
    ӦCAFEX1AO.	(bYJr8rŝ4d5n)iQzF
    U�&SMp&SҔKL4mYXv5vjO@O.e}_	%I"mGkS)Z$J߳$Xä@Xc@HB'<
    ڐ&
    /A	ip7DP6+T1EET	ELC2S)	DȁlKC^d2A"3L1o(DsϜ+$lN0J;!B�ZiŢBı:q&w̲H-rBA!\tM?0I*uOH32U7ðTCn5W]wW_6Ql
    X`=[UYguXhwœi6[m{-k[ou[qq5%qϽUmGsm6t^`յ7[y{IA=F8VaFLsnbV`3Xb?6S`x<V8@a*�M`b2[S,f	%1 q֙	z0kz!7~Jc+eQJy
    ]:�QEЦ�6"O8	ŘcdW0{iQ~*T&h5\LQF(l~ʖ+g<'{)\sן\ԣ3\i'=O�f�hY�AFp&hlf	g	O{i>I>kP+<?L|b#iH EP#0�2 ""m! X@d.0D&>#@!]0D/ CD@2>XAxlBp	gЂ.,,hTCwlbaȜSv Є>]Bd-olgS@p`+,a$~ӝ2̑#:@
    d#F$.bfaa(P1<sA
    dU]FHerT@G"S$7Ic7=x&90mb-%sG(ӱZ(`Mlr#Nxf(2NE4ъc3H;Ax@;9PD	wl GeB؄Gǁ	FbE6rÎ'b`c,('SFN@<8OpiJ	
    0YTPl#i�MPՎ6S
    A;rsN2tO:0lAPK<60ұŃp0~ወeٞO@k'�F#G2WPEኖrb؄(j5�\0v+Vk@s5.=	ζtMKpks:r,cwBiQ>) $
    �<@n02ZѾ�\cG4ъG{ǂi`Jx2QmP<"np'vBcx>.XC>67bF.DtN{�R'`bdˋE�8a(xf:y' 'k0&/y^^b?vYs7-OW>X,2iPBǍ
    �AmyIe)GV딩(ųyg?s$xsf4/	T9{ukm`kВ޳yY_;&2}xsX[V}2Chglr/AkDxR&>!@Nd_;PQy
    DxhB�1ɔu@)RiH(_=*CH>.QiX:ԊFVr̍tjۆh~EmcO0b9tS''=;+Ub-rAF48ĉc)0Q&@�cC@]
    CxL}0]z0q&~	H_1݁й1w|.=Չ'֪\V=V06'M35N`/:8yfh:PQ:EΟK_sb}i>?ga0�ppwȄ\>i�z:*RLt0AaM=he@
    @A!aPJ:='lC~�yQ=0"?@63TPM#Lg10.3=.@Ģ-2D.cRC죆\85.H*�_<gXw '܇^dTA'lj|BB\&|B),Q:B6tCHIԿJL- @V,&tBi)A:LkMRFi脗�Yukykr{piZpuqTo$u,'=[z
    5ǀy/j<z"LV܅
    tJ8_Z3ȉ�lPHN�hGx@uHNjpIƎl!pi=pZ\Hd.bǢ,'hh"J<)ɍ¢<Jr�H�i[ZOȄYvizhK$u>DcLxlbZpLHlđyvLZXLZxwwľ~@F\ʦ<HJqv Kl!\˶"LLMI֊MhrB]@H-Xȇ+~ԉFLȝHZ|,iDK<[/x\-L
    (KEɯp	
    PRh%Q
    -QMeuQQ	RQ=BQQ!ER	=$"uR
    js+,-./RT�1R1%3S3E5ES5e,u79:R+<
    8>M>@SA%T6+BU0D]=}/=TBES�;����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/manual/images/chapters/appenders/appenderClassDiagram.jpg�����������������������0000644�0001750�0001750�00000213037�12143164146�027203� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������JFIF�������C�
    
    
    
    
    �C		
    
    �T"������������	
    ����}�!1AQa"q2#BR$3br	
    %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz��������	
    ���w�!1AQaq"2B	#3Rbr
    $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz���?�S(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(> Agg^ɫkiCvӗf7��	_ſ|��*_OUf9':rVTJtm6rf5?+�B/��U[�Y�򪻺+7\Կ�'%�E_w"/�;UWwA8c�j_}�"/�;UQ�	_ſ|��*uaƕwxxiP؃Ol/l]%%07Ooe+OMnl$mzICDV�~ven߂{ywj_}�䎇"/�;UQ�	_ſ|��*�i+=[P[[_`t
    NT>R豜cx<WZ^ׄs2j]o($4nVRՙi~c7htߓ'M󷮛�	_ſ|��*���Uh}sPij𧉖soA,Km+2!T^X]ڧ@'nu[-wOӞZѧ*2y}I#%pMfY_D:*ߺ_|�	_ſ|��*���UizeNj'xVT2Z-ƨdI.Xid+j.kMS<E}@ndjĒ2740K6o&S[�Q�[X���TWo_�gw�ʪvR
    3XJ5dOwqY2N2@\{uNcv{oi-ŵ夫,3tu$2Ak7㢮/9�Ϩ�?"/�;UQ�	_ſ|��*c߂�!R�K�$p[�Y�J-�Ћ,�U]lc?_Կ�>"Cx{K>QI4bMB)0	͸r1^^]O8ث�+kkpg_
    �3­mz>{Q]QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE+�/ �ҽ<W�'_|A�z5wuq?Z_¥�Q^1QEZ|1дI]&)MFLVړ2!Kw܍⿀?B/|<Ů?&4$4O7"rhw܍R_;o4MsVҾOimc}j\"ϪΒ0sۅUQIj-봾a+JI]]E}iM6A./Fկ'5عP}M`.I-~K%O#xE-+πfkkyk7B!"D9#c~3~)ϳUf(R&W]%P<?ڟU�??`|F4-,�D.u!F�	B$,&&+O/Uk}Ek1sZ?f| px{W-lkC"yi;183Fog÷n׵{Xb9䆎gmjRF�|_ڏ.ž.+Mb:.o[[oc1iNHVBV
    5ړt7<'6}Qab#h7U}'2[hHپ-vnė~5TGfN}ZG$H̖SƶF"A zmO{k!cHcNMŴj!!yR6@,g$ws?~EKP7tk:+Ajn$kXU4jCR>%A/n<U'^1AIlD6e"5	̬2ZN-I-/})et~mmF=_%&OE-axSSkVz-ܥ}ۼmvBpp5h6n0m�ZZv很k
    (aEP	O8ث�+kk˼)�'|?�zz~�lg~Q�PQE!EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP|W|:/öxk_.kbi
    ֐H!XV4O*^�†�U�_^]֩gcqgoswmEV3@NXFlp=G%B<[v{4Լ�H$�(m??	?x/�
    O9]N?k>.bo٢U*KXp	c$\4�
    h:܋=3Oᔰ$R��{WJA(K�_H$�(m??	?x/�
    O9]|Ixn\/QKY2o2)@#�֕
    (4y	O_ο~R_6riT�
    �E\LI+V5.@3RRt��"x~"�<Q+u5@�i0Gv4Sj|<	87zjk:�	|빈2w`|+�{ftm`OkluM%gW"Y	es«07|ךek2,։{J[�c'e|jE7$eoD}%�H$�(m??	?x/�
    O9^Es�#��"y4O*^�†�Q�
    #��rʰD9ڈ1މ/h]]u!u#R ڄ.-dA$L"!Ākm�IϰW�/G�?	?x/�
    O9G4O*^�†�WS6ο~R_6riT�
    �=^	FU.\eW�Ha)+r
    
    M<#x9լ;"*PapHsNk~;}b�+��"r_?	?x/�
    O9G4O*^�†�WK>l??	'|(|{ڇu/Vk@Y֮Fz׵חxSN'_*�J+�sˎvQEzQE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�yw�|�b?F?/5'tMQ-$Ŧ'."bGgwU!@<!W�a8�ث+ѫIxv_KZ4x*G:nt<p5
    rY~)^Y$\d?ڐ'mA,F0c~
    x}7X[?~4x56lwYVm*8PTV]?utKSQRG1ռ?;i;;OͥiK:}-1
    $R5Gr{)u/tEjmcI+/HjŲO<o #*cktZs_Oǿ(_un>7쩯Zً=c~*ZMMvǥk-J[6E{r"lrgy4Oۯ{?8MJZ{K贞DQdNfd52Tmo򶝮o{��ZR Դ/	mcjYfNP3B,)VeȐ{MkWOGuK}>OJg
    *]-F
    X'sTJkmv_]87ͭ|
    j�%/lu?Hև--.al4+4Y8N2"Ii%(MDŽOq{vVMdYfu@0"5uj{Oie�	A(Vok2slvZO	Xq}Fc>t5&)$m2J>xb/?�[xBk5:ڄ ٵ@ˣ>@J}SEbeV�ҭs=ʴ}S>|J?/omscw-1JmyO
    kz/_ONYٹ R.eKy
    ̊吱hc_WQIb&)o]ӭʏo/w>3a`C~_(^;nlki&]ʈmx3/Q~�_<jStK+;p)cr# һ**gV<K_ˢ3mQEhp��ҽfFŸq>:�W�Wר_?%Q^QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�xxw_x_;a'V&i4b:OhH$�(m?zb:vю&'U][W߹?	?x/�
    O9G4O*^�†�W\�|??	'H$�(m??	?x/�
    O9^E��O$�I�EKP?~R_6rn?#�??!��%�ȞI�
    #��H$�(m?z`G~~C��K�<G'/�Ci�(�I�EKPQ=DR
    41SFvn1iI
    
    U/m�Y"	[QQn
    G}y'4O*^�†�Q�
    #��tV���K�<G'/�Ci�(�I�EKP(?�#��"y'4O*^�†�Q�
    #��tQoG�/DOiT�
    �G'/�Ci�+?��_
    <mwK~ {&;AuBѱe8tQ_Ej1{UUsYY-K(9((((((((((((((((((((((((((((((((((((((1�~]_mE{mM
    	ׇ|_k>vi:]ܚjX	Q@$lMH+iǖCDQv:0Oo[m~	wgំ:gu3aOzvn#TFŷ4I&ŚF,XNoN�S-ԐEtI\[orWs7V$9tVVoŷ)_*I?Y܋E)o6|vkz?tUK]'[pgG%EDGvi^lS5o>.QEQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@vJ<5yv[iv98lev4'ớı蚤vVj-Oh8lezꕻ5N�_@*(((((((((((((((((((((((((((((((((((((�|�_oj
    #}w6{
    IfcfwfbI$I5�7|$�['?wt$&>J}:�nI�DOZ񺥬)&TվxK,iootK(a5gwdTI'J^~
    um
    c0D@5<﹄15$G7SN`gyJB=/OiH/>ur9�᛾-_֟n*&+mQKk65wDX74bc>\6Hͧh>,O@~5;]kX/6Kse61Y,uM$݊z]-Nhq-.i]_h]zV;cfK|��'�=i�|Is7'6麗۵/
    ^Z]tkqp	(|'�(&l|A?^~a隮�l>{)LM.&ܩ
    kWSMW&{ry-iZKn;ںu[-!('¿|xSiy�;$X|G tό&xMj3I%cԗF65j>2ynٍmIo?
    wNl>"iffךL6Z;b[k(*;dI$V$=U᜚\yKMwJ8D7K{�7|$�['?	?/�	O7_$j>M+*x_WơkcAndqʫ_9f,Mq"?hSZֽ7HK|.Mdօl`\<SCxK_/Ӛ�O(;+{_W^%WJ-/]5;75.Qc,UT&6*ApsZ	?/�	O7_|A־+GR#=tUeM<Fo
    <;&~l|o?HtX4PԟSYx.cd\RCHEr<#M'>cϥG<ʿ+f?�>i6z>/LL_E}ϲ$p܊	~�W§
    lj틢/Oi8D;7#v1_|bďR=64XZhF4&!r x/zdߴu=巍Tæ^n�`*#nosۼ;1USWjʵY;jZRmNZ-=O�᛾-_֟nfK|��>1IgǺnWRB#y,ރms�>8x^>:5ټj�wSO|̻G0YN||$/ib2/{wܿm~�7|$�['?	?/�	O7_]h3};}
    fxov7vȾ,W7FEmFUCm
    9+:5]&O{nn,fծF
    .#/y%aL<2j
    oiz8/K^35[kwh_ß>~/T{&x!йE$*2`$WI/I>x&8goـu$uWsß
    ixZ6>Le%ŵžѲnn)ȭּ9-hNE�߇2k1]7
    
    $x,q49`L7,yNY6m-Ѵqu]Gk̢}^=~$j3i>mt[m2T oe1O"/fK|��?x3UӼkZnU2C7r4w4FR�a}VxZ
    ņw^om;iKETXz3lM�$]6_xL._hfݬ3wO%�z��o��u}�	3T<]5Ϋ}W\�p۾vG#CȘd۟lu-3>,m)u_JLHWF@Hz%j9ﭭ=6z٧Ա�괺?fK|��'�=i�hiw5#~?>F#PFZVr"*A+OGMK^_a6R_.P&!EW՞HQE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE?Ҿ|7Nsm6kokYmcڲ:pJ${�?�!7ɻ|-�WJ�Hvo׉C^}STY,s@O&އeC{_3�@�3�@�U_xC|Kh_o,4Xg ?ڞM۫W6�(y0hV�tRQEsv|ݠɷn6S(^7N|;/�^R�x�]o��x�]o�_:+w#k[uFe!@Ā7c$K??־D|+n6kRkVg49&/moҗ���%�ȜK&}=
    Vm:/bcmp4{8e<֧/�3ƟB[VL>&1#
    vKj`}v2�5k_=Z.kRizW3dh%2s$%+%輪w_E.O�x�]o��x�]o�C}BM6_%[;l;2[+d)ds_l'~>oVi!>y:}Em-U
    #earrQ*N-E_fA*f�%�Ȝ/�3ƟBG/�3ƟB]|^/ЧH:Hn2%aSDeܣ m8-;4&m"xR}]J-n٭PѴ'!FzTrW5�J3�@�3�@�T�ho	.zS~Mfm5=˽R7ȎC84Oh,ou6IRʬ'vr#Fmj<.�	ܯ�^_ӿC߆O!uC߆O!uCOhptV[y2~T/#mC|;p-hojznjX4Jҍp~v*ʪͅ2ʹ_o/5]�K�9}
    E?Qyv_E@C{Xϊvoh6dAa<-,X,I$u$֦%<	kFޢtN)Ӥh"f2Qx"0yǢSi'$]͇\}�_~�g?�_~�g?�>l??	'<i�.�t<i�.�uQl??	'<i�.�t<i�.�uQl??	'<i�.�t<i�.�uQl??	'<i�.�t<i�.�uQl??	'Ͽ6x{U"
    ;5φ(Q|AfIj1
    $3_LW~?nUZܵ-
    |eH +$(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�gJ[
    !5XXlDar	h
    'AԼ=74_1%N>qxy	;s*BΌ'~-֍h>ҝ_Ɲhmb
    >6'Ē�ם|6Ix[֯.{=:(dxCʢ+-.Y%p98HߘU;j�7oGW/�Xht_XgwxK.$#RY!B^ݹ	!S럳<C?"Ğ Pl�٦G2QjnpǙֿ߈5
    !ҾA6kZ_k2B=3o{MalgQ7Gs	nou]>OΡ$IvuRUi1
    K
    N'ֿ_K{�#w.V{P𦟣nm{s$٥k)X*K�f/~/dzA]3:ir@g
    M+cO^�e%gIXiq-]5џRtVyLRS:FC1%F/?+>-Y<3km/Utˍr_o"uj>3>9_ 	%ܩ])ٵͫ߾ZY._3fgiz0^Mu{[n$I##0`9=|C�*
    [[C^xwGm:wmBs%M4mk�sk󢼛K;u 78mCC<U|R|-mxR]<- d=G{YaE
    꺏]Kg}oXIKz;7Ԥ{iQ<[CHF1n<뿺VфRmF�&}sG?~"ڣkeBl<oU>6Ϻ~#\}SFGҮ|ixp",n˃6vCŸkxg;PKolI%ݝF�xlj d
    Yպ񵦂W=%:ѰeY"kV!<ada<rܫM^gC_vV5<e8]xPšԭ|;闫D%{lp#\go?5?L(nndY.¦]UV#l?:SӼ3j^
    Vp5,kp*:!W]mxG7oX/.a{hW&tO*9h1FmN<饯>{KMd�rMoT>x>x t(xJ/t-ubiU!j_<	-Zg]jF3&cs{t"ECt -X5n42�QyHHyg�H[?.�kk6A4Hu{gɒ=)'Ky?,[<'1*Dj%}Zu�ɛvM.NZcOWZk=v+x|=*uٱc,׶":6yىk[|_(fOK|7Y6IHvois%
     %|f@L^>ᗏ%yN]j}kAjLi#o+h+fU@I2NIQEMz[hmJ�>|#񟂵�	&o]ž5M}[V["xa,a7l{W-J/?Ŷ�JͿk~EVC
    (
    (
    (
    (<�v�b�׭ג~?nUZJY~Q
    (B((((((((((((((((((((((((((((((ZxbqD6qG>)mk Q}7SC!DDKy� r-o^]v/{o,;“BϕpH<GᯃiؒQ6\x{zoZ}�ڮ"*G*ΌHwY97i[U�kz_k~)ԭ|!eG꺈WSqE,Ls#!ȧ…{MfWriPȹVim(Tܢ@HOwC�JĝZnÖEwWKyz)0-UՐ&Um+x|BRH/,x-[(1+KHwS*_nҳo|޿y>�h
    ?Eo77͋-'>^BzK~]ㇾ^j0iO>FxnJ7ܴ	CWw|<^.e_R6n3B1&cۃ׎/h>*MmOV׺[>tjo,X^*:�`N\RG{ov^Of/m��==Z4_T/oo"}y\jiMWv7	P`yψ�M߁AJHie�̷s4s
    |&Cx܅xG>9>v{*v]S-y>eԍ,GBnZF!cZ~Ql^x:^	lPi6VO^o-'İʄX""NQݡ.ͭf�gXh
    
    k2k6w֗o7ۆhAus39FO?|e'Z-RXk/1	)P2rO^4a:{-$VY<WGT,ȹYd<q<>+ņme4&
    xAqha<GzOa>.$&Fp_?k�w{~syx:Ff#M%6#?^'>W]//5%hPZhzBmaҎ�04M<,&gܼG
    nƾf+Kvio#Iql!ylAڟysZi<+2Ý"}N-t?ɭ=w7.6&K4P:*Sm_VVwOy'k*Iy*ߒv][�\~^hWfxRg]"0`qH k~2/Vok1Ӯ[qkk}5c,vgdK^ĻDUХE=Z(j[TVpGpu0S^4'韴5?-4Z릟],{`mմ$g
    A'?9@q#-nE잞RkZkR?
    U̲<vj-rQh]RTkU`BePp�+M~]Z׋tW6y
    2۰ERn62U_h_1/.4u.k^TR2qu=Տ�&BB"Ri}4o|sk�NGts^ִ[KmWGhX$Huޣ̍`$MYs
    i_4:÷]k^a1wWeرcpl<F؞@ԤӭǸ�
    9eBQ82Oj�^gvm=5OhZG?jp6<wαK	#IB@$# i_tKˏ\xCSMůw4z߻#/kq
    0^C;'Jv-IqnC]S]J�p6',>Q0rºaOO.�>*0KL`Ÿ^sQEQE�QE�y#�&K]W�I%[$ݾ)ث�$u9S_QE}aQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@I7ɻ|-�WJ�Hy7Z;ol.4h-[gHmĒJIGXc৅_~
    ou]$Ovqo.XYwaڼUu>Z^s[]hz4#%ݠ(\!4ep96뭷ǩn_K>67SԚ]ݗ@	Di/W͒	"w܈RǿESEJj~0.t-#o~糒=ăĻe;\W3�Q?wP\jxpC_ݠMNӡ*-{?5;A�o
     [Qp&LE7FޞL,$}jUv֋mu93U</-mN+y/šƹ-)șmx_]!@B3xS^뚂<ڭ7ھ4[ne	eb	z
    Vml�3N<s+~Wwi�ox
    u8͝1h#E>HI"(/N^~%u/B|#mqz]XV6ީHX[NҘŐ7/2|a/1kjZ^\x}ErD1)߷O.xi_Λ߈4XYFX76#ԐBAܭ+s@gm<Y?ZԠԋJZ#kVU&|bw;n2(~V_m?7�/\skA!}?R]˘Gۄ&YLe�y&-r}N#^8̋4{<,ʏ:&#SCtQ<3Z]YICM!,ۈ=?foG>7?$FSHԾ{6y9tmܡJ\{z_ӳ̔uup_
    Ϧ_YxkN@of1]m'ȎWb~2xhɣjwYm>ڌ.+ɲxHCG#?e[<Y˥iz!ӝٽdXd(QfG,¿t'.xkĶ^~l2C4.%7nNjc1#=*G
    .Wen&z˿_:|bojyw[hz[4ڋA-s2]1EҾӾnfӬ/!;-DR#e&+z|S.xs]_\xC[}ZÓwdZ[߬nVղ|]w>�RO?O7z?-դW8gO"`deO5 0Bwzw~w׷=MkhڽɺInҮyKx/*yRm[״JY΃6k0I
    ǟ2$ P(N77[4%jfKսS;݂/o}}mڝg˴ּ>_N!<gɎEܥHU5\mwi{.kiz}OL'ŭ5MvF-ƣwx#BHfeƒ7(6m~1x>k}e'ynFf 2r-6>CmQ֭2^Sb-kzt?gid4(UNu!4,YtȬ4#NwC[oo&8,Yo:iɾn,Ivo]v_ߴØnf֮aw7:=Q^$1h[̒ľdEg8u';V3M.Z]oXD?Ν<v?>)?e$2I3#[ZYIm~
    [+kn.l
    $au#0qHc~S-̢h@̮v\�Cm˄Omk�ۧGwm˾6:gf[1/"VeK%n'o�k.o	y�|6PWoLasy|nޣ|;WMr�]CV!imZO(b;<ETdz|^O<M>V<ߞw}Χ<G%)讯ktfwK�;yV\\khWZeCC̸,bZQ]#}I}Vy澺o3\4")&RM *n&
    ՝ʼn^j6ͦy[Mo]jH$LZF	H`[.xog^]EYmI<җy_je#.Zeu'mF;j:/:	j꺅Ε|4*[#-],km`:ƿ'@P*iwRM"#2d+ޙ}2s'/jB|A}WKEi	_wW	#Ո,�f Z}%sn/VcѻjDq0bѓk_ok~M
    뵕uڧº͞Piq^=k8Qp4e³Ѵ=ޓkj
    sq[\GiyR)A6ɵqWg<&:
    ;OZ糸w7rآHZ/p	K/|BʹiE4WeXmFe/	]Ms18UҬ0N0r~E)y2o'ߟ൲H�ɻ|R�WU�Ik?i7o_*I-z}A~�/!EWhQE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE䟳wt$O&o|*gu.�El-FA*Ja]g,�he]E.zӔe6{Ey�,�hG�x�4?YR+}_
    ?z�<W�DsƟ�ʏY+�9O�eGq_=?
    +�dx?3C�<W�DsƟ�ʏ{4(�W�_f�*?dx?3C�QϷ02h�Q�3(?�#4��T_f�*>�oae�gQ^�#G<i��,�#4��T}G�>�G@zկt~xukK{|0<)+n6#w4dx?3C�/Vm_G@�G�x�4?YQ�#G<i��,G�>e�gQ^�#G<i��,�#4��T}G�>�G@�G�x�4?YQ�#G<i��,+}G�Ey�,�hG�x�4?YQWsc/=�Y+�9O�eG,�h8_
    ?z�<W�DsƟ�ʏY+�9O�eGq_=?̋�v�b�׭ϿxW3 t7֋{[s},K$<j\HPXdN;
    $V"h7M[4GaEWXQE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QEq<G>
    6|G]\ȋ,Mq RMhM0RMT3*o\ҜI.j:e犴\-'o쵻MC3%Ƌ`%9;iPm�L6P࿰.-E4l#! i敠�dtHlPā#]K*I8>7kxH!vZ`Ҥ%!cYĤ%bgmiD$6�߆6sh(((((((((((((((((((((((((((((((((((((((((((Z΁o7/
    iIg*3̪FKyHE
    ʳL#I%fiNK;O3
    KD5)kY-)R. `OqiMh8bhő[XLI`y6kkq�SYWQ}dw֯5N	$eQElyEPEPEPEPEPEPEPEPEPEPEPE	CǾ<M0kZ}oόnUhEK 02#=rQ[:iaVNPio~vg^]�	_ſ|��*���U��#_�g^]�	_ſ|��*���Tj��>W�Eyw%�E_w"/�;UQ�� _/
    ?z[�Y�J-�Ћ,�UG~~u|(�4WWo_�gw�ʪ?+�B/��Uڸ??�g^]�	_ſ|��*���Tj��>W�Eyw%�E_w"/�;UQ�� _/
    ?z[�Y�|m_⇀PftF;o416b{?0o^~ڌmw�tQEzQE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�W|WO|{:
    /Vk_-uk8Y֐Ȥgև3wO%�z�u8^F8j^rW)knǭ^I�o��t7|$�['?q�o}?0���Ey'3wO%�z��o��to}?a��+�=nOfK|��'�=i�ߏ�;�W�$zxoO7~/͎53=swٿ �['?7('�{۝�+�=r
    |M
    _y3X"	
    V"!SVSvOfK|��;:_�
    �[@&_<!kO$k6yV^~13mtbVԴ{zjO-QiM5C3JnAm1Mgړ�
    �䏥h~MOLu=KMn--4;)a6�ApA	?/�	O7R䝝/�;T
    �-{N;*x�K4jOfK|��'�=i�V}{�6<<u[]o3	վu'CNֵbNn>+ң/L3f�᛾-_֟nyZ�e0;�W�$z	?/�	O7G3wO%�z��aw�H+?᛾-_֟n|9[ĺf�wb�^q>̼ ?	jOMwv/a_m�+�>'�=i��nI�DOZ_�?G^I�o��t7|$�['?��
    �['�=i��nI�DOZ?�>�0���Ey'3wO%�z��o��to}?a��+�=nO	;O΁vO
    hgM!ԹX*J,-э[Z6"S.m}~EWQQE�QE�QE�䟳wt$nn�v[�b�Wg�
    ?zT?GE8η>Үo�?imkġD�}|+ci>0ĺLSh˻Ҙ&e{?.B?hٹ˯7m=C'[Z2S⦷OEV6$!+	]�Z%gjkk�,7aCjb2|X[JU3o_Oxy}~WşȋPFQ'9O4yjnF|4}=V`H<bJA60';Kغv_o}o[^ׄs2j]o($4nVRՙmNCᦩxž&Yψ-9#Ӕm.%KPiSayb$2	vtZԾ]47YbҼ1fft"*JC>:AگZĆD
    vcgqgo]32tkd.hw<I|-/xUt9{'m412W
    N'kᦗ\xzouC+XޥqjI
    e|JKFBT�O<k&Zƙ+{io!kRf+s3v^zLo6mLY`J_iQٓ>LOH@ÀXnjMt}۶^ڍ.Wn�~v[\؛-4]OXFaZkuC5?cK"Tֵh:U߈<[%xøc7*Ypѕrh]o6NJ]	$_J&5Hf<) h3lxᆅNqMX[ rәn%I!
    գۙn֚];]ɂ�[Iu.S/m-6%exR 
    [v/0:ݾ)ث�$_/u_$~$ua)([<P(�(>+'þ=?+5ΖwQ,HPdR�3}kC'�=i�׊�|�b?F=2v}${ZtiFiYHfK|��'�=i�h]#~?u�o��t7|$�['?z-sK}k�?:�nI�DOZ?᛾-_֟n9>�gj췢x5�l<GPqݫT8$@ WUbfb%}lyCK�k]~_�|Q*P沶IMn0FspNko
    IqS:eDj6j^i^gM(s`)
    HZ(aqSk_]}k3ʦkwq~?MWpF~x(x~�!�7|$�['?|;H]7O|E7.GxUR
    CWbNToRXJ.q?|Cioj)o!&e[+WƎ	6PU
    h:o[-|zjJb,;IO	?/�	O7G3wO%�z�ע^w4}k�?:�nI�DOZ?᛾-_֟n9>�g7|$�['?	?/�	O7^EZο᛾-_֟n7xG[Z][/&NKx"ݢlQ�Qf'I^\?1V+Wj(Sjw螝EWޞ QE�QE+�/ �ҽ.g�j~Nui&;hpSt?}g4�[�:7xv*jQ(Ag#h:�x�]o��x�]o�b~�og^u�?�!�?�!.\Gs=_~�g?�_~�g?�Yv?}ڗ¡|O�	^)TO.F-gٞ+S7)xk_%kwChB1Ga
    I_^<i�.�t<i�.�u}fNPmZO6DxBI}y�Yz-?	gԏĿ;6}_f#!dYŒalS]Ɖ|q+V?_[BڕpH~an)eN>>)xϧ_jͧ]%yLm;&u'#'�x�]o�jUrr];5/o0j|W߈SN%wӯKEMYonŮIK9'/)[	6Ywџv+eVRnܪ�x�]o��x�]o�*c'QI8hM\vvi]08ˑreE~<cei=[.%SZO
    o7_)N�'k�i[>x4;׏oCk7Z^yd[@t\lHФȹv-Y�?�!�?�!өRMKzt,
    ufG[iT|;S}x.o;,!cjsO3KsVSZ_{/^YZ.WySHa	*~�x�]o��x�]o�x[V:-˯|eO|PE դ{6[l=Fx�`A'~!EJ5WƇ.nE-wЌZěwYC`}߆O!uC;◀4cTլ<+k-WU1}oX{4WiO^w)r[9`1\Vֲz㟆'ό:5}z↹k=ޥ7#[X9?x:
    tᗋu=S?~$/u{
    Ts-Dl B}Rt_
    H[/bqp4ll8֧/�3ƟBY<S:%~+>=M3W:~Ws+4k:oi^+y~%Mh}BjIHNQ( c.?Ҽw;U杬6m6
    FxĻwR	J`~�x�]o��x�]o�꾻;teo*Ks5\ݶ)Z=/ ߉^IH;HZ$khe *).?#nPˍWqm?Z_~�g?�_~�g?�+Uez.-`fz-_3�@�3�@�r˱UϷ3h:�x�]o��x�]o�`#}Ey/�3ƟBG/�3ƟBG,q̵O8ث�+kk>x}{[JM֝)aucr3@+O
    Vv(TŠ(((n�v[�b�W��>?/Ѿ|7֛ŭλkȶ#H
      <6=l%9ԡQB-$}Ey4O*^�†�Q�
    #��i\Gs=iT�
    �G'/�Ci�(`#}go�KW~W#ᏍVχS,Z;#+]RLIsiT�
    �G'/�Ci�+gF.M6{&Ք?~+oV>7�ooMG-'tyg f'.즱T|F>�MrYl<7H�/ncC6IHؿ?	?x/�
    O9G4O*^�†�VB.-ҽ}۪{YXsrJK{}/GPF3|=UCo*[&@9V9\_K𕶫irw7[uF-8
    ѕd2ۉ4O*^�†�Q�
    #��㔾gK_onSG)7{s9[陟
    ߍu:s<Ov?gcK(!>ī.LU
    +ο~R_6riT�
    �Juj9>m~;OT\${3h:�I�EKP?~R_6rcO?_/u_$iT�
    ���~#7~ԠmdiETEY	f$�U˙htzm{Q_8QE�QE�xX3㿀ou5Kdֿ]'Ienr8\)r@:3�@�Z_OU$ӴMGHn{c7*/ˎmg#RRnϪ_j^L?}g4�[�:?}g4�[�:5�>&xv֏P.-R/i񭤷>t#E(9χzu^ӥ0kgk!*K0}ĺpzI>Wg۫#{r;�&o/�3ƟBG/�3ƟBKq@>߈o<a?@Z[jZݚ^H,"e#%_m@,V.O?	xNlwzxUiHM뤱yya;	z[MIu>_ۣ?}g4�[�:?}g4�[�:#oUshuۼi-݊YKrn<4_cm-w:Ҽ7Iˈ<{x͜YVF6v	qIگ/]7>�"s3�@�3�@�t<)i6&t,U(9Kp0B$'i</ůAZ3zޙlo/ 6V2ȁYN�a"ܮ�אsa~W�/G�x�]o��x�]o�~ҟ7ቼB5Я{}VFmY`T	v"1\?Wޏ\k˥_j&mAdiP7$U /fNMsr�|/�3ƟBG/�3ƟBV|}V_H4�k1յ+[ԃC?*^$vv~r&t˨?4LѮmGWoql-1XxčPE`29p[o~1aӷ$%ot?3�@�3�@�iX|j{Z>g
    ]j:ſ8u{w|ȿ#9~z,tw`x>M-R ¡RC`�ħj�]v&/�3ƟBG/�3ƟBW7']xH!\OE^Gg5!Qrfo A`1exW7ĺ<GZ cI*vy]�~:�.?/�3ƟBQZWO⸶&c=n' rA=>1Чu8(Ef{uT##^e3w~/?Ix<翕2H`qmNA;p=LV
    #jRwKn{?�yO�>	�2�<_ga�?c�'^m�y�Z?~/�#/?kG3W{�5Þ*Եm?E_Qyl.ɑ(0kĵ?ktSW0&P \n4xmEf0q4%7ScM&_>7t'-4hͧ
    =p5¼,R2)gW Q�u,Kw/8|ߖK8�ث+ѫ|Ihc{qj
    ieo6U+_'9lHxIQKńכIӵĿV.Q;v;I<cF<Bڟ-Ǩ5V-լЯu'dYw7f\˟Eeׇ{E/?ǫkzS˪hp5֫duX|*i'M@Ig�Z?i<ohw:_/VT{G8ݛ`R7 w.>jsYt3Bڤl,WfJ+L֜�2V=Ku'f{ZFYxMbƚI`L̲*:Pܻ/C}_k[[]j�?OW=u_jwe#^"vZwfR1+g7	6B)án?#�+Ե)4}1xw	keù¸&Hg> \Kÿ59|:	Юl5nR%!Fc^
    �W~$Ɲmx�7/u$c61
    o^B߳tVIi6Ŀkk[/c~=|3׵?OӾ!R�PFli&w~㚛?#�+Ե)4}1xw	keù¸&Hg~"D<mtGźfyê\H%ۈ"m'Ja~�	bOigoa{c{qrRJ-;ch#h+Ɗrߧobbj�ֶ=7GtYOEռeG=׊4'LdI3,$3<1Ȋ_kK|2�h1h˥ƭj'id$H\mxzNy[R{xs_[BQK{t*0|`>x�IW_Nj7]+4mXY^3G݀xU
    *>z쯾ڽoWi9ZtoC <7(jTa>ͦiz~?>ucFʤ)'q�ZM3NK[mgNH
    x�Z-
    4k42&#B#�dϧu$[]k[{͕As2�tTpVӾ?ϧUkfMw}ϣ/Z:hτ.4뺯>I;d1 E8f±mXV^FiZq�׈#ݭ:eԌJ@YG#
    ,lJa[í[�
    SJo5Վo,\ipش&t$r{ s/8'BtẞMJd&R8_tPO !0yyRQMk{u7:[oGk$o]?U^~"ze&o>-ul>xw8W"¡~=|3׵?OӾ!R�PFli&w~o�89I:L-�/lon.^IEs,mb"-sÿj~"D<mtGźfyê\H%ۈ"m'JawJWӚ�%M]_D�;c�^R֬=%g
    "PsdAV@-𞋫xD{{[hOg>k,Ȓ f7Y�Ibfxc?,62!ÚĞӭ:[,w2F!R-ѫW<;޽]xIo<5jQOukSkhJ42obrE@o*	}jtiYY~]ox3ei6cїK[;ZNӥT"IaAՄ<7(jTa>>x�IW_Nj7]+4mXY^3G݀xU7_4䵶t-4Z\@@C"i|Pl4-/":V�In-;{_ۦ{ͦiz~?>ucFʤ)'q7?t5OMͧxšKNk|eE*UImjT,)O'FI5+Y/
    :4ww*g.#8dqZRB 񕧉	|vY^kdE1fYڥC)JjZuQnWMg)IFM-om}߮�	tKgoNǰ3-lab	$1`#iR1UE¾׼K0qu6[+D`]ѕIbj)qo}[J;{]
    kyV�OBpkm~xDt-V?BỶUXm屶R<r{'Y$PmSm;moWmtzXY]w$|?oeio\궩dܳ.V)�lf!G{/ĺw|ܭS̰,"\Fc#
    ٛ4Z7}fUt{]Y&ѤCT_*O)y$vW~
    xGXOSMמY5
    Bow~y4UU5Ztr;}v!t;z(
    (
    (8O
    _�^]|q�i(	eukC0@0V8p|Q+xOO¾�HtL	A۷�<7o+-O&${DY J ln[nO12h77g`rZYw?ulW/[sS9͝K	U]˱6>_iP>MƭIy/"7R 6bVdFPGG*
    _#̲X
    ~%+}^m�y�Z?~/�#/?k]_ga�?c�'^m�y�Z?~/�#/?kG3W{�4W`_�?F^֏�<'�Z�?7�"zMy'�&]+�I"/�<'�Z3SH׿e6:�.𮓳S!Ŭ$KNn	\[Ƅ4~N)|w7$(,G@V=7R\m6='�HvEhTg%T@'
    Xf_|._޻ԼE'^.pC:I0ZA2,ap;;N4gqvl5[{d9woZ+R`9:44ݝWs]VOa|mqG☍݋[DzcY$d^=ّ)fw]Hu{uhi71jZK<HH#nmel~o~�)
    /R×'f	f2쑁b?3(ⷄ!w|'g{KTk{ۧӮ-"JXHTO`ZkG$tI}|ա97gϢ|AM;p]je(c>fU%‚~gu3@ɭ*S|_oky?m~LY_O-(YX)U"eO�~O|1�;[R2\xKSPw-C[$ğg,7D0[zY>\ivtĚw.>o5Q|4K3g$\͏Ư	j^.v_4tϰ4+4w>B~xX־%�nKoeynB$
    JyX>.X
    x|#{5kf_7K<IE1fs0Tܽ{j7vZn5+=ú
    7ZҧVGwk>O2'PX28 QZ�{RgA]FjW=Hb2yџ<UW;X=6o$%#fxX|
    -1nQYB۫n�Օ�n7', AKK۫S׊h`żYYW"@TO�e-~J�BOGͦY{+kGHQJ
    <мQCd^xj^'FK*i.b"IVhn&t)Û|miѽz|\KmM_�g=/Qy|{oۛ ދ�{6n>iT;k|gk[׭tzB}XwτVͥvRs*[mdW,F3R4ͳ}]mVw4mcjR}K[aE|p2*@)XG4VZ/Bȱ`$F~Y!~/Xx,e)@w*#nl̾fFƽW>/蚭߇WwVRǦRAdzVңN߻Ϣsl$Rӯi}EWǒQE�QE�yw�|�b?FcF<Bڟ-Ǩ5V-լЯu'dYw7O8�ث+ѫϳYʞ:rK4_#~^2I]G\\u-ct-kU7e	Yhmg<=2"ڢE
    ;kf{O/rIWӴWݬsoQe˯\$ҮukW6|M,W"s=
    $|(ڝmd񮱦%՝mmxDi|rpTIuj}̚}ol|kZv5b|ŀ˸m.e67Q$hQ3>k<{m3OtmSW.׺]m-[is¨P8*"V]5[~Z�$;j{vO�nƍ+Kk+B{_i[E͜bnncY.Mʫ
    ߲VI9tRSZ5
    ߥ
    #gWhXw^}}[/;z%�گH|:ro&}-E#$m士+^N�
    kzߍ<Ed{?Zms%#FX<ӈ$d�!*�ȢyyO?<U_Z\mڲH"2,2�d;?eR]WljK.jzVinf' LJUɐ)NT)YARw~O>aŚK&A:?m!n`[HMr+ʐN@Pʲ{Z>}ƅ%ׅuk>TZbX,`+$P󏢨DZ[פ\Wk݉+4�>V/j6wN	j&=gV	
    oZDHsiTJYdMbwۍC𮙧$tn
    /[&ڨ&[!da~|tVQ~}-EʺJַݧż9h\döV^m]^h%+�5ļH^k�LzUw �pJW')'65J[v_TSӨ
    (
    (<q>�WWW1Km3?l[_	jש}iG+H**W_OUӵGH󮴋{/+D 7+6G͞hsWV_4��?j΍yDgŌZnuwuzHgm4e'O
    Wg�<OmyGz%W1&5<
    ugq?BS%Xۯ:ėU^7[&;Zo5Q[dB*1j_>,􋡯_[_�iZR}2RK:Fu(!W`T9Q|ן|1[ki�Oc~V?мeZ|@$V!VUc7H]D
    ^|x񆳬;/[˘,1ZfKdermPg (-xm7b<E-[�5kH,; ]cz>;7s]_j^N{]yp>٭EFF#yjJ3Zԭ[ikmmJ۩Iֿ?Tn0>ace)
    8B9ĝHBu_	G&hW4mV�VjSI,
    =F)nUirR<ܲ{$5CS:2qő7	EF%w	%TsP?!;UiCxRP%{<EҨ12ӊS^ׯow�wDww*mtumZMZ{IF
    ֩,2c1
    a
    j.u[5߈ګ{LxBMHa_.48>UX+o</@\c
    6XsjW:C%Ē3`/$8U|5+{JCV,.t_j3;ZN-nghDRFFrMBn1K]_ﯚӺZVkKc?h6ˬxiwjV%OL־BF"ɂ&f�5k_~%C:(ⲏŲ+8A̓�c$ƱT[Jd(.fUnegxqs8*?�`cb
    ֑mOgٟVk$pnԅWt*6ڤ*Ǟ}w뮻k/#Zqa:֮241Z#cwH�xּG`/~jb6MOpS-sa	&.@IrL>z~W:,Ii4vzսg٤kHXHqvBQW;@7=V;%+t	4gtȴi�6i a-gkd_-6Eo;/!oCV:
    
    t#3�,I(Ypm]c
    Ƨ㫍'I֭,^oxvv%[K!o-`
    ^<_hei7JPI
    
    -�gYVyEhH4y`[dQS/ͻ'8ѫN
    GkO讻RMj�<#/
    K}zi#ѯK2Og:lLy�ie6_1x^+;[(.ukDyfPM#Y]DybHb}H^gRҴkM_W6Qhgg!;P1TRE®�[t+Mџ_/k{emBeDHBf#fp%n/Ju{-M7w5>[$9?Jn+p�l6s:5mF5	|1Xѯ澱wuڼpd!iOț_uQ/[n턎<2n 7
    +TBr}ƣqM,]%ͱŠkq,V_&d,H6Ft#oi�>֌kx|ֺD:?$>\j/mg{mB̤bN*t�>
    Ҽitۨh必Nv֐\JK$rPf,nkQPV�/DBN�
    (,(�(�(�(�<)�'|?�zzyw?|u�b�YQ2:?͓/?J
    (S(�(�(�+>
    xE_YaLrnW|BY=H?f7o*_I|/zXOQq<
    )toU-|1]N.i&#⁦+"m bWvGjaYn|K_]{m.uo]:Ho v Kz67MՆևykZ厳`I]X^&B3Ga�Ì%v>4|;Ė^^501yɐ>=-�Mg+�^si-߉5rO;]4߇y-GFXUi=ޛ?|Ukd+/5fx䅅ɅWe7$l#A*?fN/O
    
    ~}cҾ̂yU$�y20$pu |еJŷ#-[Ak*kvs[Ӗ\|<4wsTR3Q)PiVorv_O/ˡG?Nӵ	xIK]3RniW*
    ,̀eLͷkM+6>!Դkzެ,`Meݔ6LVF3su`ϴ))xW�>!g/>^[7Z:fh#bD0Ô⌴	ݹɺ,cY!;%4RZU2I{E]�ko-﷗῞~Pfûun];PYoNMWtPy
    ?_�WNuKimΌ;8MBQݮ\|
    t%GGt/xĺo)DOjgkgV	:mJ<@4$P*
    2j(i܆$QGJ)kkuTiu�-E7)|{F.]ZCV7|^\$=vj(ɔ+qNB>M7Osi"X[)f$QL:."�:/⋽CJan/}M<M;3lnT'�/Y96^Ҵc[lvl)7*$hc6Zr=e|>]}oߧ:l^𮷢IZijwbKnfHY|"˸�ɼ_|iJt�kq3Hiy.!|K$ IR06!dc'|Gk^#ѣ5
    JУ\uj�N2T9-㏁λi|Cc}*41EDf(J5Vg
    XaꮋO=VrI׷l7+ߛo}zfFerG
    R_2ٳfalwIrv^r׶X[FNn@$ڷq#Dv)gUMmzWS?>l6[aHu>^|W~-|[g7V]>hekc
    >8gM\˟m/VimwgMSi揭iwᙬQ[( Erd"`,A<<w\/6ӬK+]+S))63[I$m1F0:=r7!.Y%M5ܑx{cã9+?f�x_k&Bfo' Chl)q:Sku[Yw6])nuyyEQEiQ@Q@=KYvL4
    nKE5uFM��ÿ	�!׬^+)M6zS'Uvgo^�O?^�O?f�_|;�@	|;�@	z`w�_|;�@	|;�@	z`w�_|;�@	|;�@	z`w�_|;�@	|;�@	z`w�_|;�@	|;�@	z`w�_|;�@	|;�@	z`w�_|;�@	|;�@	z`w�_|;�@	?UetSO<Mşq4kг#I6H+P5Wn+#&OQZOQE{G�QE�QE+�/ �ҽ ><gxg:^isǫhjM̖w0e6kX灊�ſ�e�-kʥ8;u]]:SM:4i3}wtW	�ſ�e�-h�S^�2�c?_.Z_}�N?�Cׂ��|[�F]�֏|g+Ö_tOE>-�#.�kG"�z_�0�?W/DO=x/�˿Z�ſ�e�-h/9iK�;+üGcYgG_n4=zۣ(a$G?x3\i4D&WwW^XEGmN([x<7,x/⎨7:Jי]%}/};\2?�Cׂ��|[�F]�֯�3_tOE>-�#.�kG"�z_�0�?W/DO=x/�˿Z�ſ�e�-h/9iK�;+�S^�2�)o�w�Z?Z_}�N/h_4jGg)soɕ	5]`qg'y~3xÚV_xcZWڇoG	4s@jbF	(gE0\]tSªrQ?Nkܷ>OE>-�#.�kG"�z_/�?W/DO=x/�˿Z�ſ�e�-h/9iK�;+�S^�2�)o�w�Z?Z_}�N?�Cׂ��|[�F]�֏|g+Ö_tOE>-�#.�kG"�z_�0�?W/D<)�'|?�zzy"�CoxK/]>NHM>(c@Hrʀps^_k:hSFuouh)u(8Š(((CƵk-6|MN�Ev0#H{}y'�&]+�I"K	�?~*FӾYOI.U_x]Ѹ"[)K1lɽvJwYGjMJ-+K<sm4R5i<FW
    (")ouۺ{[{T�|KuFH]#ůo2Z\5ѾټknyrK*0m=Z_|Cǎ|1q/u&mV)�o$QHhi6fzo4
    CD-K-ܐ`>AZ}jTҳu󹛃qF_ש޵-|NS_AU[+[H̘<]k_�Gf{�NҖ5>uw7VH;Aw|:Ҧ H'kﯧ帝Yjp04ҵid;jѥ{߯�?ZO[q{QXN)mn0V{7@dp߉^(<MQo,lmm_=O$PK$
    I#!mO4|?.ݺZ%ed5�^QEQ@Q@y#�&K]W�I%E:ݾ)ث�$QՅ�x3袊lB(((((((((((((((((((KW|VI=tϸ.YtASeċK$9&d]}dd;=M5,,-"{qC@U�I8�fPƧ~ybё&ծK{ED2i%B.SWө߅ܛOfxgG~oh:Ul4d-Yƀ(31{w*�	Wƍ�ggdOO%qxP|U,-Z	
    UXi{{)3KvG"fj#i=6_T;}|ռŠ(N�(�(�(�6_�ms�$rMqs3$-W�y^mk)g><'Ү$ă,qas,YNnGzZ]�5mPxግĩ%aܵKjd8L!b5_3`*l oa:z]W-j22d0	H&Ү2؞#~?hi:7N׷6p"u`dLlmuVFVm^w#e?4݋M/nݲhɱrqs{/}n]{ﵮvktQEnyEPEPEPEPEPEPEPEP^I7ɻ|-�WJ�H٣:6k$qCx���
    3<
    LjJwҍ9Bj={_w;+�z|i�޹�ɔ=xS>4�\�k�2ן
    �W�$vW�O�s�(�z|i�޹�ɔ`e�sῚ_
    �֊ូ)�Awe^�??2�̿|7K�_\W3ׅ?#O.LŸz�&Q_Aφi+�;Z+�z|i�޹�ɔ=xS>4�\�?k�29/GkEq_^�??2g
    GƟ]G
    _>�Hh+Ÿz�&Q�O�s�(� 4�y#�&K]W�I%g
    GƟ]U/٣:Νu'ܑMxC)k"|�#Z5FnRѧHJ(((((((((((((((((((<[mlwҋku-1H rL[lQw#
    Uc<%;h[lM+7W|HH2GEƀ4z$$^x#�ZL%Xږ�%P)Uy"$0
    dtBKߋ�fi/C<qxd]m`GXʺLx|zSI"'RU-Ek( (�(�(�(�ڞgiz~iOoqks)`Uс#U(m;o>�w$w^gneLo&DXgj2rRi5fT&;?Ěntn4Om9BueX>;?^cMvyV2mIaRFx;?Ěntn4Om9BueX9Mfk8)/iOngѾ(9Š((((((((((((((((((((((((((OWh&l5>Q7K*4k"�涿+�B/��Uy_ژ5�/?G|5ekGQ"/�;UQ�	_ſ|��*��W�Eyw%�E_w"/�;UQ�� _/
    ?z[�Y�J-�Ћ,�UG~~u|(�4WWo_�gw�ʪ?+�B/��Uڸ??�g^]�	_ſ|��*���Tj��>W�Eyw%�E_w"/�;UQ�� _/
    ?z[�Y�J-�Ћ,�UG~~u|(�5ŷjQoqy⛘)km2ܖQutTqAteRM=wf\Zi^^{6w3(Xohմf*VdAF(>"MI%I7^xQ]O6bB"(ª/4=O�0r敛蹣un9j[QZ//ۻd1&[ʷ{qٚIdI:JJ-�Ћ,�UG%�E_wLVU?FsכW�+˿+�B/��U[�Y�~~_/
    ?z[�Y�J-�Ћ,�UG~~u|(�4WWo_�gw�ʪA?g;+ORM'XPhdd)n0VԱjT,%XE{J/;C+
    (
    (
    (O=fm?>Zx|ctsF(pYa	k*VKRrK{k=J-�Ћ,�UG%�E_wO\N=F?m;~ͭiK-UL{yY[n)"+2K"/�;UQ�	_ſ|��*<s-x>hgG/OIGm3nm;pUMըbHPYgU4uxW4<+;iEՎgKf@`nZg>3Ŧ&]_H.'e1I&HMrNHR@qR0GSi<乣ʟUS֨.���TWo_�gw�ʪ\N=FJ-�Ћ,�UG%�E_wW�??A:_+˿+�B/��U[�Y�\Q�3h.���TWo_�gw�ʪ?pS�GQ"/�;UQ�	_ſ|��*��}N=FJ-�Ћ,�UG%�E_wW�??A:_+˿+�B/��U[�Y�\Q�3h.���U{x~!ω=wVaN&wmFSfa9cӝ&XJ_[twݞEWyQE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�y'�&]+�I"E:ݾ�ث$U$&{X
    (
    (<y7dAֺ>mvQm1_RK0sY׾	hx#.h	y( ?j
    $JsEwxKđNuY%0Ž)}YO##H<>3G-ckZk2;2UFFVI"G&p:W]'K)ͯ}f3{h{
    W=߭99?o?KkϥZ%ńv>
    Ǜr]$mi_?I{@mgX6kډ,8g$"wu	A% H
    O<fƋxA-
    }mf.S]wS݁`|UW6xsUuOþm1Nsu?G@Lцk?SyyKܶ{)s\v�m?gCVNu];P|?{x?/u+tbDnʬ*1Fx¿(ׇ'/ןoGKMkU6H,hDSOn%vEn>%FWw߱otZ߮	Kb_Ӽ/-MRO;*<HQTxgh'?_-[JCTyuO<̋qŬGf6HNXEIj&nv*jNzlF*vo8_~𮗦_mt�kW	 QGhА)
    |*]m?~%
    7N<CVag%Sn
    ȝ��$=,|g3u=fIub`Q�@
    yqZOnWKS=Ɓ=
    &]QtNM'@؂EV,:tҌί׬W5Wɓ?iiJ;-z鶧m~۾ni{xI+ڕ3_%L]
    r2G8洟)'}iuY-cզHx%m9,Q]4HɗTHIPzE7oD4珵ɵA]S:?lf鱛ؓN
    LgUfLj@ {M/C4Ë_~]xrYl%Ĭ3̕0+&yYz^KhoÛ}oO:֣uyumjZjEpYW<?>�gLVI/?($cS3-x>tNL a#NO)"<'Q_nOuHY+MAcldZ7Ԇ<tũ`ӖO4mo;)_%{G}>Y_սpAOnŚ׈$-4OPES,;`F`Qg]T>ն+O~x>zjbLqn%JBv9'qjZd[E֮5`+(�Ÿq>:�W�Ww\'?|u�b�Yg'�|6/*'E!Q@Q@y'�&]+�I"[$ݾ�ث$UY�OyQE|y!EP^-`|g>�e{V4ԭl1
    dֽO4_:5յKȉ0x&ILkZ.
    O_�+߉O_ڷMͲO/
    ڞt4SP+4z`#0HdrIm'
    �VMyu=gR4w�dVvuH]fSYgZ$kM)!wx�m9=CU	~ZOÍz}S^5gMie%žֱEd
    mkхL#Hk.mG#w|'ks?lv?7Sx٧߰F$u?
    WkI֒xp}]NY9#e�M74Gm~}TM$yב7qf65'E^x}WC?褹]O861A<	j@ s/ꎟcwU+^EsI]ޟ6�jѭ/�爴SS<I
    Q;R1^6ۑï8WU-3O)ڠӵǓGK9t馊qlmy,AC.?O+]/▩q-NE4$`QX7يAv30
    @~>%^>x7|Aᘖma}4Kl-eI",vHORZ`cWWݭWg'QN;o[~o;[r~s&<-KĿ/6fK$LJ?乘q|gᏄ:6>T^0Yt=⵵eOol6
    �C뺷c�>%׼GxpjSZWf!%12uY{?~u$<W#~-ţ^fkef`rTK-־[ys^mӿyoqw'<I@<YxIm	y>&!2TᘕV"ßnk]Hr[@*Og!58\kҫ]-KkaG_p+(�Ÿq>:�W�Ww\'?|u�b�Yg'�|6/*'E!Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@3�o
    `:5Ȗvֺ96,ʨ8O5�­7�)?k�wQxWI٦infvb`s�'��△(n,|X2xPW֭+6Mu$)
    Fp΂r�%Qd}+5^z-ُ9�|M�EƟU&�O?[^Eo'o_YxrڵP	V"T[Y"D|s)eok��c[kVZhX%%K*hjv$һK޵zV8*i7e�dz}|M�EƟU&�O?[^Y#];Aͤ߁tJ֩nܔFSp'k0dqK>G:/mvxB](R/Js E\yl~zI&9mE}f|
    F�Ꮷnz�
    X|i�z'�+h�[o,>4�=�?hϊ�Idx.�Bt-USugos4,K
    .IX>w?x\[)#c5i1Q"	bI�R�0e;󵧣}�-U׽tmf{w*ao��OV牾4w<k0xFPBlgHcHQf^m^_[k]y�
    h>&40]픷rL|1axE̋ q]_w6}3u1۷?|M�EƟU&�O?[^5+H/uόK;1mnJ%w7~oz.-cS0m<;iXmLrO;mϘW*MmTSXj;jRQtO\�v7n?Ǩ�­7�?V?D�m\5
    ͦCq\6tcqb%s
    2pc2>&l*xY4="
    vE qg|S^,QacWB%Ic)46m4xc~5/U&�O?[G*a?GCӼCmj%jKq24Ɗ߽Fc_{>^^Zg[ּ(PL�ڗ[4.TǭiRE[Go$<TJ�4�V?D�m|M�EƟef}<o��OV�
    X|i�z'�+khg1�#οV?D�m|M�EƟ9}f}<o��OV�
    X|i�z'�+khg1�#οV?D�mg(/;ڇ5OL$v*)ǖA<lkOU�5�"iNTlQQ+#
    (
    (
    |os_i6DP)`UAy+>
    jzD^vicۥٵX8?)=)|�CNPStIw5?V?D�m|M�EƟ򶼃G�KY7>Ԭu<CZMV}Cg|MA&#d8gA9�;
    DM;7/Z]6V\Z<J:Wʋq`k9Xȏm]iK5e<Tn�ݶ�Tz*ao��OV=xAӮu_KzDŽ1oEn-$yneHʢ6J eK9t+[I5MYцk٢3{~go#ZC
    )0Wi]^OV%mZ:;|1�#OU&�O?[G*a-TU*1x~W
    uk46E[Y
    Eyv2c3akQk7&Q^:^<OszqKAKU!!Emyab4|VzZ�}*rvIt_{۷�|M�EƟU&�O?[^]{/-�lim.[&}>FmE?˸+H/uόK;1mnJ%w7~o
    z-gvǙ}_:Z/=tg�­7�?V?D�myuޯnXE<%OZtS<-qs
    m`&}w!<1x+FNLy.,UD7QfPb`][?]un3r/S�[o,>4�=�­7�hxM<,cK8k)oHX⨰gzwuYo[仟MIaXY"BYF]|VVfݺ'r춿w|M�EƟU&�O?[YIP:޵]DbgԺw*.n=k+p_U&�O?[G*aEe}f}<o��OV�
    X|i�z'�+khg1�#οV?D�m|M�EƟ9}f}<o��OVÿ}mxTDAyGj\y`[A
    mʖq=VO
    _�^^P)֔UM-/(B<0(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(?f7o*_Ioxo<_.GBִekӵ2qp٦L.<ݾ�ث$U+mI_=_KPA=[^ҵvZR(JJK45BI**</iqA"cZ29!r)U*<Vs˿drk^)_j
    "bKKe/*:W5{{	et]-V;KjPqq^E
    r)h8k'@<;kog7t7vQ@?rd]A
    zO𶺓Mgayu8uhAxocD61FxVHx5QUj7��(.TV=K_<'úyznWf؃3pխᯄ<=
    J𮉦hxFgC=\Z]džFA]r{mr>+]xsK}9fӭ%6֏|1<2EFBW7?qPWXBᵷ5xcTO#IE\kN)~ZzhRtM;ALӠi.^+HV%idrHB3337RI'Yÿ
    P.{*)-f2LY$d-ך(/U[Cg4Vm6K`Sn%\
    3dZnZi:tEv0,1!f,E�$$)6+ *FQE�QE�QE�xSN'_*�JOU�5�F_E�D(D<(�(�$ݾ�ث$Uu4{[mccr_
    ;5=1-ZNqTF`K	�?Q�e�<7}4nĒ	aVA(qq|M?PA=[^ҵvZR(JJK45BI*+ks}k
    jo|DxM}/m;#y"38hLm
    ~'kVX^@FGh#z"H#3rg(ڵ�S){|:q׬`}�|!wy{qimM*ƥmA ]>gfcѴ=f\o6ZC2_a>$H9rcN4�6VH_턺!F�+7Cm-�pvx2F:=Ɗ&I]0�!cf,
    K|r巖;_djO7wvjzΥ3VJim;PMjOY[ٽQf2̛mC#
    
    <_E/xC폋tn-dTީp#\9čK+\[_Sj:xGR.i,mfKn>u*$~nQ\15?e^xAL62j:
    - )%EQ]-$hIjT=MZO~]݃gKO;[S5o45;k=.5o&4DA\'=spˡV?it>unbdKh2B)Xy^߲l-}/Z]|75#C6s+$e;s�_	G
    6k3l}{[6|.Y*|}.�ʜ؛ing|9|'=
    6[]*V[?Z\_K\6F@,jdi0,t7}}ldHXv2H(�1f$I$
    �R
    ӔhMC?0|/RE̠%buu�EXn4Iw	}g<vEG'7;)/iiU_ve8�ݶWgњொtn%#Վi<2ȸ,8d2}y9'<?yi\l`F2vFI(YxZO\j|/5MOoMk<+bȖ4r$Gv5xS9EΕog/=OMZFK&ݕky3:NXUI7nzwQj}s&�:<)m�b隼[amV\UG	]HMCvu&ZѴM-[ǖޅ$M[3bc3/p8&AVw,/ZÚf-Θ�mQ\JZ~N<9�{�
    qԂjOF}bZO$�UhgTMi+3[ȱ!]~CRJIrc׋5j0
    VVٵ.x`bHn|]FA\?xMwD2\x)/,̲YwO),^X|#5Ef/vwmVMZ7~8Ѥ"(ĭª{ s#b9^k::
    {wh	o%�pҫc10m]QYxSN'_*�JOU�5�F_E�D(D<(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(<7?j^i?miivYZ[E*".Ӌ*I8�A/,^6�M�W0}s֓�<x�4?V�
    _Xm��+kӨ_}n<x�4?V�
    _Xm��+kӨ__/?y*bhx�4?VקQG0}_T"�o�[G*bhNau|�?<E�E	�T"�o�[^EP�ϵ1�#PxC�m<E�E	�:>�k�cG� /&�?PxC�mzu}C�>[�1�A/,^6�M� /&�(}>W�c�
    _Xm��+h�A/,^6�M�Q/_p}n<x�4?V�
    _Xm��+kӨ__/?y*bhx�4?VקQG0}_T"�o�[Z\|-k]NWUY[4{Qm_u)%'#h)0$ɖ*g%Q]g QE�QE�W|Noᶳ^A|+
    N-k
    \�2z;׷ג~nUҿ*<�j_?�H�oީ;;REkvfO4p9i(dou
    U(kSٞ2;3Z{{'Dhkr؁xa5/־^>%K)on%[9I;o4W6$$0ѓ^r	4<<X8oĞKDЭwZO>I#-Q!�rO+_wEr?o;�BYYwx4Xx&iyOk{\\nm\ vLȿ.T[Wߵkǫ_ĚMZTVcp%"IPA)d^,x+SĞ#IeCy}YxopZiS;MW}W9};BӵwO^|;ttޜm. 7WMg!kR[F &[!Z/۪~/usfotgQ/kF^An3d2*;2D`_k8+kWu/cGtBWi ho{%+-)Q*cg_ΗuamQo{?
    EXn@'; EuV>
    MwzώO4KX
    eloMnT{HK%mʧ?x2VI~ؗm7?jៈ.|M] <>=k47"kiX<D$)hIƖ,4-Oq3,ړGu4Yyl&؊ѠXX>*hZmivV:tuf	!you8SF*\Wj^;/,SMI<Cc{InZ6s\M$G~xeKt+Oei[274t-9[K[VץGbKm7]$sb`
    -C-4kK+]REUͽ58dyaL)e0CI
    Cfwl^~,WV]ak.$bqrYz}N+{]5o=6..-ɃDd_9v*ߟ~GO/ڕ~"7gke&D.hELdyR$ِ2/дgZ֛PM:=#Iҵ	^Gto:KeRe*Tn
    1n?gkGx<-l5=.^G(hc>Z_
    ~|Ux~&-T6qء4@oe	*}[魗}OWb_2?'-k<M.[·nfef
    XAr<Bb@-i3񾡢kZ][qa}lG+\FyAH$*6in2tmKPS6ɵy]q$`7wcf_|
    ka_j!]?:{fw4݁98&_/b[ohM?Dծ7ž%V"F2m/sp<'G	Q0m�j;X[39vLЭ-qf,.人HB27&@&vgM5>*7u=kuŻr�:	"s,WBi,sEx$ƻ>Xs
    IMnHkk[f<Vhe%d]Uڇ+O{4߿z=5^RwkMψ/Y:ޫ1-bgmx�Jk~/OXI<:E6Irh@\l(�sڶkҌPٷoKEV%p��ҽf<)�'|?�z{9?~WQ=F($(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�+?f7o*_IzxO_{�W7�zUKo#V=?sg5%ST{_=<5FqNݥ]O`/_�+?Y^򪏷_�+?Y^c3�>i_G�}�	^	��T}�	^	��Tfc?ؿ;+���*���*Ϸ
    ?wW��%x'�+UQ��%x'�+UQ�ob�?h��JOW��JOW3�>�4(�^=oaLӼ!.t;iq\.Wcۦc bk[WI��%x'�+URYn-EK8>Y4g{Ep_o�BW�Uo�BW�U?g>�4(�\/�Е,?UG/�Е,?UGf3}=h�Q�3/_�+?Y^򪏷_�+?Y^g{�g{Ep_o�BW�Uo�BW�U٘��/�GO
    _�^M���*o|?<S&ieM�_H%s��pzW`q1QHYk
    ҩy-R٧M+O(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�(�+@k1�i^io٤Xmm<G߹+ͼS�xhI-58G�ܴNd_�60ME)NVt;u]E>mxO:Ա}Fp45wڴ�J_k߅5=IὈZ0[Y
    .A4NH
    O|;5mR8-2[+s !3VƵfUev;:(8(((((((((((((((((((((((((((((((((((((((((((�Xmkx�T./SOiW1[ܤ{c\3
    *\TFԤۧ&�oşuMm�Z_&Ҵ`g?63�<~0h}�]ϨW:GI8bP7`|*�'pJI)^�3^j:]�*QEQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Wx'3@6aiw>1YV9Y8],05_G
    ok+\饇Y9BVݥٞEyw%�E_w"/�;UW'~~~W�Eyw%�E_w"/�;UQ�� _/
    ?z[�Y�J-�Ћ,�UG~~u|(�4WWo_�gw�ʪ?+�B/��Uڸ??�g^]�	_ſ|��*���Tj��>W�Eyw%�E_w"/�;UQ�� _/
    ?XU�#O�^^H~-c]�"գ<Klm-6g,7.OI�	_ſ|��*#`֧~_RsN-mGR}OQ"/�;UQ�	_ſ|��*�psN=FJ-�Ћ,�UG%�E_wW�??A:_+˿+�B/��U[�Y�\Q�3h.���TWo_�gw�ʪ?pS�GQ"/�;UQ�	_ſ|��*��}N=FJ-�Ћ,�UW|A<g^iIjM̗qLe6m㑊ږ?
    ^j9ݿReYoiEG}tQEwaEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^I7ɻ|-�WJ�H?f7o*_I|C~z-Q_HQE�W?k⿄:ׂt[7,VI@hUv~S߉,"4w߆gn'd7,&
    
    ބ
    UֿmVJ�[Wiv/xz6&U2.EXN�5wڌJ�ǻ/DlrxE{hum֗%ˠ%w
    eơ=:čyGbl֟6\$ː!w|=v_
    r;+kE251"K-0q^j`)I+m4et9mQG��ҝ�g(/=vh6'ԯ.,CY%8`A<Kp/ �2U;{NP^ha>mrԹH.py4'í#zּPW_#[ݵu"7{
    ۞kGkO��xJjq%qܶN
    P)eٌ `jV7릜ߤ6KwB^R/Ǖmw̩OևW:6EHu}Hx&w OoJޯ-5
    :bCe`ns 2M4qc=*it~Ek
    xQgy7I{BVQ;Z?`�Oq{gx[vj:mxAHۏD*=5b[.OO]56ӏI~W�"ܯgJ|i=v}N5i
    ]Dh
    R5HȮJ;|*ԡ-gǺMΡox|Z!cV
    �I;z-SG<oQѬgm5fiP^Y~_؞<;ڗ]i�mQkGa9*&?T\6nﭗ+F;7[ܽnEM
    	8]CK׋<CU֝ofeVkؼnc#pS�Mo7щ,"Qc4_.P#;C9)?n}|-qx>[-&1ޅiY[gQg0hĞ]UmRtvۧo/j&Bq*I}dC/ۭʯo5+ekks�nOk,мIY\kzo&SrǷ@/}ύ^5
    ::՝mA`U.<T,Ar
    z}O+k6I/˸KA=>\>PRvCk+A|	h^𵦏\Z;x්bAkcaRf%}l{tkoqk\ɳ�-𿉵tK+Ky$u^XGGP澇}h!Z]Ht8gh_{+щ/*MU	[J/{ _xY೷D֫m,rGhTK3vE7/V}zY[Z#ϧ7^kEW	QE�W	O8ث�+kŸq>:�W�W׳�GGU}hB(((((((((((((((((((((((((((((((g7>Wt3xkM,ts
    mc"42X3Pp736$kރ-6/Gutfq6maa(,w:2pgJ_?(T']OU&�O?[G*a ?R|
    ŏ+FOjվ|sw&PI!H#!N@~?~"/
    b>Mկb$O-ҵΡŲnXfa7r#WZzzoM$O4�cm�
    X|i�z'�+h�[o,>4�=�ľ#|v�4WŗcRѮͪyѮUHs"QuzVuz|A�tkW$O?4Ȭ,^)"H}RP4ci4֯ۮI-?vG�­7�?V?D�m|O~k*kh'WeHoe"-'nAWr�`=S/E>�UҮ)ྙE{*4!̹ڻ
    <,/]U&�O?[G*a׾#|X!u~v]@/"+u{eF;G]n#_5_+Kpvm62q<bm1P;E5篚Ck/=�­7�?V?D�my3޽';BJ]bS[vŵmN&ETUB|w~/鰵WH\au%t"t{XN>n\_OVT+^I%|�z*ao��OV}2Ba^cKyC"xn5j(f
    pm?މgo�n�#ݮeo)Ԭdy_쏘(Sϋl,3+ѫ'},X$?/�­7�?V?D�m|OxYiMn)uu38IBF>]pwnhZ<S>/C=Σ5up^mۡř.Z^*hK71U&�O?[G*a|5_n_,iWR,sn"[Hd�m['ŏװi"5_mxv>D5R\խټĕ$@B2j8YI5}֧u1]�|M�EƟU&�O?[\cOMYxafS,"T4TPCv!orZx|_H'ҧxnI̠]Bܐ)JIivI?[ɵ{X.qKKW}:Y_�­7�?V?D�m\5
    ͦCq\6tcqb%s
    2pc2>&l*xY4="
    vE qg|S^,QacWB%Ic)ӜQ跉.f=7]B�[o,>4�=�­7�O3_mt{=;:7]Ϧͬ,Z}C,MhѾYj+?e*5审vukλuBUI
    ]8z֕(ʔ[v�CM4y3Oo��OV�
    X|i�z'�+kh^f_g1�#οV?D�mg(/;ڇ5OL$v*)ǖA<lkOU�5�"iNTlQQ+#
    (
    (
    (
    (
    (
    (
    (
    (
    (
    (
    (
    (
    (
    (
    (
    (
    (
    (
    (
    (
    (
    (
    (
    (
    (
    (
    (
    (
    (
    (
    (
    OٻMoWE^^!SH׿e6:�.𮓳S!Ŭ$KNn	<�j_?�Hu�?ᡦ_s~'wN,,mI dP$յ+\Oo5%"NԮ4$HcXd)0H<bjֿg?-֦gGڊnx==h㺊O27#::6{?^ּOun-%l4xa9l̗0$m[K"<s7,&|RݫZu2}ө�~8&<:ږu5ƹx&Ksg[kW̍4*]PF]z75WsCky(]Qp2$[wipP7�n3[
    xS__y/,QjvkLoV])oo�@>#|c^X4O2鰝5*ŲF1@)Sڳorޟ^�ۿuYx>f1dӡmEsΓ?}O_×Mb/K$8Y(/-YJJI
    piZm}y^?m)
    NR+R\H3nޓ>EA4>^O1(t[ݡ<i̪7X[ZN׮[5g-vm}῅~GN4=4+Vt-S̞WªFo^
    ]v_kzu' 774wH"
    H¯
    KuOk7뻯ͯRZjZͬڣiY+nȨ@w 7O%2aF/iZ
    PEwI-ʋ+<1D+$#9:vo<ϮbcJ+_?]S/eBn=*+OϬhD{iLHٜrMuZG-}ޤh1}4^A-DpWnrI$C�MGGuXmE(P]@Q-CFAult#r~o'&k1ϧ~_"M';_
    
    vW5g'Q̾^g|#Ѽ%�]kg�Sj	%MqrD&(̃x>^ҟ:֧{_S67EݶL2ɳsDŽAU_-C/<=hO&oi�\+M;.t{k~gܾn156[m`Ɨl|Aog}hmDcg<c<aKs>ohSZF/E�ߝ
    iHl	}vI-WWYn|ʼT$V²r#[xvV7eK3!SX"B
    Qq5)J5}*xt˛Y!u9Y]
    9VViq)5;Shzu<W>=CP廎"XuUK}$3mjQxN7ֽw
    _~6}UaXVmieeogj$J^F/#ffb{$k~?tg4kN^i.HHRHcT
    Y%c%ISΟ8~Ѿiz,�t5Dm67G$sՈȌ6_A|5A?[ݾa%ߝo&Ibxd<3[4sK!^JMWNFR7_w\[tgu>~6SkxnNi:AGy{�nUULV4Kb/mtǑE%Ĥݷ23,~̺+4B|Uk".V	R|G\AT7دO:υoujOnV=B7.So,$R~6n}:?en|Z{]S4|?v6Y3qusȲI+Ff8ɭ:O<?ď
    麷m!UѿHKIus_7~_fI3᾽atvڍjzgƒE\B[J/0D~4<__x-+e,kx햇'K-?qal(1sJ5=V6-J[�I-u{MG>,i'FZ(Lt4HL6c�n1
    8`OQg4ȴNt,`XbBY�bII|;S|]cy/6x~gծ
    חu:bþAm*Pz/e=@þLBAwtcGYmuЃyA;ݿ}--�&;߆jnUbrGOMpd\4
    |JahzpiO.&⻊'V9PG	/%<1KL'/uguHmhfeHg.>W-
    Ϩ|+tWy|tO$S@%D]! J?g{ۥZkb��Oxǖ~GtkK]Kk]H*UT.9ݽ]d*v>Y
    O8ث�+k5
    ^OL}x#"]EΖYF^ym!Cd}Ÿq>:�W�WשB1A5mi*_OEQE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�QE�䟳wt$ng�~#ᾟ|H.-nuXEYZ@UyWNa)Υ
    oX#*+ο~R_6riT�
    �cO?WH$�(m??	?x/�
    O9G,qZ+ο~R_6riT�
    �]긏z-_?	?x/�
    O9G4O*^�†�Q.\Gs=iT�
    �G'/�Ci�(`#}Ey4O*^�†�Q�
    #��r˰}W�>EG'/�Ci�(�I�EKP9e>�og^u�
    #��H$�(m?UϷ3h:�I�EKP?~R_6rYv?WH$�(m??	?x/�
    O9G,qZ+ο~R_6riT�
    �]긏z-_?	?x/�
    O9G4O*^�†�Q.\Gs=O
    _�^U~R_6rxþ=C:+5@ZMwQ,Wbb�q=k"27]�"
    UҲ?tQE~xaEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/manual/images/chapters/appenders/appender.~ml�����������������������������������0000644�0001750�0001750�00000140112�12143164146�024747� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?>
    <XPD:PROJECT xmlns:XPD="http://www.staruml.com" version="1">
    <XPD:HEADER>
    <XPD:SUBUNITS>
    </XPD:SUBUNITS>
    <XPD:PROFILES>
    <XPD:PROFILE>UMLStandard</XPD:PROFILE>
    </XPD:PROFILES>
    </XPD:HEADER>
    <XPD:BODY>
    <XPD:OBJ name="DocumentElement" type="UMLProject" guid="JEGKOL0wwE6O2Emy29kFuwAA">
    <XPD:ATTR name="Title" type="string">Untitled</XPD:ATTR>
    <XPD:ATTR name="#OwnedElements" type="integer">6</XPD:ATTR>
    <XPD:OBJ name="OwnedElements[0]" type="UMLModel" guid="Nu7ucmhxa0aC5WTL/Hl5qgAA">
    <XPD:ATTR name="Name" type="string">Use Case Model</XPD:ATTR>
    <XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
    <XPD:ATTR name="StereotypeName" type="string">useCaseModel</XPD:ATTR>
    <XPD:REF name="Namespace">JEGKOL0wwE6O2Emy29kFuwAA</XPD:REF>
    <XPD:ATTR name="#OwnedDiagrams" type="integer">1</XPD:ATTR>
    <XPD:OBJ name="OwnedDiagrams[0]" type="UMLUseCaseDiagram" guid="AOpe9EpUuEqbJkhPg6UN+wAA">
    <XPD:ATTR name="Name" type="string">Main</XPD:ATTR>
    <XPD:REF name="DiagramOwner">Nu7ucmhxa0aC5WTL/Hl5qgAA</XPD:REF>
    <XPD:OBJ name="DiagramView" type="UMLUseCaseDiagramView" guid="jha7HHI2JEmss41Kcx5rmAAA">
    <XPD:REF name="Diagram">AOpe9EpUuEqbJkhPg6UN+wAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[1]" type="UMLModel" guid="nzHC5ZSub0yOmXzqddVh7QAA">
    <XPD:ATTR name="Name" type="string">Analysis Model</XPD:ATTR>
    <XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
    <XPD:ATTR name="StereotypeName" type="string">analysisModel</XPD:ATTR>
    <XPD:REF name="Namespace">JEGKOL0wwE6O2Emy29kFuwAA</XPD:REF>
    <XPD:ATTR name="#OwnedDiagrams" type="integer">1</XPD:ATTR>
    <XPD:OBJ name="OwnedDiagrams[0]" type="UMLClassDiagram" guid="ucvrQjCCHEOMfGCAAc5zPQAA">
    <XPD:ATTR name="Name" type="string">Main</XPD:ATTR>
    <XPD:ATTR name="DefaultDiagram" type="boolean">True</XPD:ATTR>
    <XPD:ATTR name="DiagramType" type="string">RobustnessDiagram</XPD:ATTR>
    <XPD:REF name="DiagramOwner">nzHC5ZSub0yOmXzqddVh7QAA</XPD:REF>
    <XPD:OBJ name="DiagramView" type="UMLClassDiagramView" guid="sxIjWZ8eT0KTmxDhcr84UAAA">
    <XPD:REF name="Diagram">ucvrQjCCHEOMfGCAAc5zPQAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[2]" type="UMLModel" guid="dQlYoesWY0yxg2VJCxHxOQAA">
    <XPD:ATTR name="Name" type="string">Design Model</XPD:ATTR>
    <XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
    <XPD:ATTR name="StereotypeName" type="string">designModel</XPD:ATTR>
    <XPD:REF name="Namespace">JEGKOL0wwE6O2Emy29kFuwAA</XPD:REF>
    <XPD:ATTR name="#OwnedDiagrams" type="integer">1</XPD:ATTR>
    <XPD:OBJ name="OwnedDiagrams[0]" type="UMLClassDiagram" guid="jdoFPKplx0W53YpEZi95TAAA">
    <XPD:ATTR name="Name" type="string">Main</XPD:ATTR>
    <XPD:ATTR name="DefaultDiagram" type="boolean">True</XPD:ATTR>
    <XPD:REF name="DiagramOwner">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:OBJ name="DiagramView" type="UMLClassDiagramView" guid="oWGUMKWgOEus+/3Jqk/tpAAA">
    <XPD:REF name="Diagram">jdoFPKplx0W53YpEZi95TAAA</XPD:REF>
    <XPD:ATTR name="#OwnedViews" type="integer">13</XPD:ATTR>
    <XPD:OBJ name="OwnedViews[0]" type="UMLClassView" guid="tSxGyrwfEkSgp1EcheSXaAAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Left" type="integer">464</XPD:ATTR>
    <XPD:ATTR name="Top" type="integer">76</XPD:ATTR>
    <XPD:ATTR name="Width" type="integer">161</XPD:ATTR>
    <XPD:ATTR name="Height" type="integer">93</XPD:ATTR>
    <XPD:REF name="Model">Ec4V6xlK5USBInAfRT+kBgAA</XPD:REF>
    <XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="4OJodmUjvU6Oqy3fe+ZfuQAA">
    <XPD:OBJ name="NameLabel" type="LabelView" guid="nTnCIikI3UOMxs9QtoE1sgAA">
    <XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
    <XPD:ATTR name="Text" type="string">Appender</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="LabelView" guid="iOfigC5hM06553UhkG3o4gAA">
    <XPD:ATTR name="Text" type="string">&lt;&lt;interface&gt;&gt;</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="LabelView" guid="gAAMY35/8kO92uV18LmCWAAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="m+f/Nz96gEqfQeHGgfAxjwAA">
    <XPD:REF name="Model">Ec4V6xlK5USBInAfRT+kBgAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="ViAxcLeYxEC/QDB9dCuwagAA">
    <XPD:REF name="Model">Ec4V6xlK5USBInAfRT+kBgAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="gvxeAhX+WkGcvqw6KjlA7wAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:REF name="Model">Ec4V6xlK5USBInAfRT+kBgAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[1]" type="UMLClassView" guid="NaiNuZ1qLUu+5nZq2pgoJgAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Left" type="integer">364</XPD:ATTR>
    <XPD:ATTR name="Top" type="integer">384</XPD:ATTR>
    <XPD:ATTR name="Width" type="integer">361</XPD:ATTR>
    <XPD:ATTR name="Height" type="integer">56</XPD:ATTR>
    <XPD:REF name="Model">rzT262Z1jEeiLPfjq8YXAQAA</XPD:REF>
    <XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="3Qx0O28WLEC1wlpntM/QWQAA">
    <XPD:OBJ name="NameLabel" type="LabelView" guid="gLLmeDlS+Ua9NL1IKkZqBgAA">
    <XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
    <XPD:ATTR name="Text" type="string">OutputStreamAppender</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="LabelView" guid="7awZOkK3cUS1dBI9YKP2TwAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="LabelView" guid="LtVVLfcmbkq7TWeA6T7S4AAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="H/1viIm6yE20XaYIV5XQmgAA">
    <XPD:REF name="Model">rzT262Z1jEeiLPfjq8YXAQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="/LiIyuskqE6jkbei5roLSgAA">
    <XPD:REF name="Model">rzT262Z1jEeiLPfjq8YXAQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="LFUOQyCzKkODyDltdenqSQAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:REF name="Model">rzT262Z1jEeiLPfjq8YXAQAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[2]" type="UMLClassView" guid="82N1NUXIMU2s0JVvIgA33wAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Left" type="integer">428</XPD:ATTR>
    <XPD:ATTR name="Top" type="integer">240</XPD:ATTR>
    <XPD:ATTR name="Width" type="integer">228</XPD:ATTR>
    <XPD:ATTR name="Height" type="integer">95</XPD:ATTR>
    <XPD:REF name="Model">xVL+I0ePyEKePe2ybmIZqQAA</XPD:REF>
    <XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="MEOstStI0EC0RQoiT5DFLQAA">
    <XPD:OBJ name="NameLabel" type="LabelView" guid="CDkuaYXZDEC5+cMzdHsl8wAA">
    <XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
    <XPD:ATTR name="Text" type="string">UnsynchronizedAppenderBase</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="LabelView" guid="N/VzkXk9vkGTb/Gq05Hm4gAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="LabelView" guid="Wbq2KwFqq0uOx2yShkE49QAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="MbkisNcJq06fy8rfNf//qgAA">
    <XPD:REF name="Model">xVL+I0ePyEKePe2ybmIZqQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="bHWlSSp0L0KsF9iS2K/VuAAA">
    <XPD:REF name="Model">xVL+I0ePyEKePe2ybmIZqQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="A3o0HBZQP0+GUAIDarVM5AAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:REF name="Model">xVL+I0ePyEKePe2ybmIZqQAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[3]" type="UMLClassView" guid="uk+yKXVJ4kGbJp9tS5jKTwAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Left" type="integer">308</XPD:ATTR>
    <XPD:ATTR name="Top" type="integer">548</XPD:ATTR>
    <XPD:ATTR name="Width" type="integer">205</XPD:ATTR>
    <XPD:ATTR name="Height" type="integer">43</XPD:ATTR>
    <XPD:REF name="Model">yqvs3sZ9DUGqcZqP0JhEYQAA</XPD:REF>
    <XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="pd1JNpNdxkm4N3mMjABxcgAA">
    <XPD:OBJ name="NameLabel" type="LabelView" guid="Jfgvt5uhf0aDXP4fvB8FuAAA">
    <XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
    <XPD:ATTR name="Text" type="string">ConsoleAppender</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="LabelView" guid="x915MlraB0+hK5agb0HxVwAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="LabelView" guid="o72CPBdC2UGyraSt4vxsHQAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="nH6UBhoeX0KbQRIkAzLiWAAA">
    <XPD:REF name="Model">yqvs3sZ9DUGqcZqP0JhEYQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="Jb94kigpgUqu4dlcc+CGdAAA">
    <XPD:REF name="Model">yqvs3sZ9DUGqcZqP0JhEYQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="QxduxAxohEmCZQGHeQsZcgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:REF name="Model">yqvs3sZ9DUGqcZqP0JhEYQAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[4]" type="UMLRealizationView" guid="lL0hvfNl1UCp0ZckmzYqAAAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Points" type="Points">542,240;543,168</XPD:ATTR>
    <XPD:REF name="Model">MLMgV5lk30+73KeQUlkJ1AAA</XPD:REF>
    <XPD:REF name="Head">tSxGyrwfEkSgp1EcheSXaAAA</XPD:REF>
    <XPD:REF name="Tail">82N1NUXIMU2s0JVvIgA33wAA</XPD:REF>
    <XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="R+yIkrw1xkGRRmxo6cIv7AAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">MLMgV5lk30+73KeQUlkJ1AAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="MHt2cHh8nkq4xztkXeNA1AAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
    <XPD:REF name="Model">MLMgV5lk30+73KeQUlkJ1AAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="1cFzyVYsZUexhz9n3LRU9AAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">MLMgV5lk30+73KeQUlkJ1AAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[5]" type="UMLGeneralizationView" guid="fqotcKjEKUu0dHy5krCbbgAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Points" type="Points">543,384;542,334</XPD:ATTR>
    <XPD:REF name="Model">iGZQWONRSkmUZXwA2ctTYAAA</XPD:REF>
    <XPD:REF name="Head">82N1NUXIMU2s0JVvIgA33wAA</XPD:REF>
    <XPD:REF name="Tail">NaiNuZ1qLUu+5nZq2pgoJgAA</XPD:REF>
    <XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="a5TKNXnsu0Cm1O3vWK2A5QAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">iGZQWONRSkmUZXwA2ctTYAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="lfapsg0nvkOzLtKq21jKcQAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
    <XPD:REF name="Model">iGZQWONRSkmUZXwA2ctTYAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="J/CqIqCm4k64OiOc5XyUFgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">iGZQWONRSkmUZXwA2ctTYAAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[6]" type="UMLGeneralizationView" guid="Byj7ulJD9UmN+tawKGwCEgAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Points" type="Points">428,548;520,439</XPD:ATTR>
    <XPD:REF name="Model">AjD3odwWRkqn7DLLtsqSMQAA</XPD:REF>
    <XPD:REF name="Head">NaiNuZ1qLUu+5nZq2pgoJgAA</XPD:REF>
    <XPD:REF name="Tail">uk+yKXVJ4kGbJp9tS5jKTwAA</XPD:REF>
    <XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="HQiDhC6IA0iqlMhf1tdcJQAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">AjD3odwWRkqn7DLLtsqSMQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="npCChlHvbECPkeBWStHdGwAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
    <XPD:REF name="Model">AjD3odwWRkqn7DLLtsqSMQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="DNi8lqQWi0GHkNrHlB+wdAAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">AjD3odwWRkqn7DLLtsqSMQAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[7]" type="UMLClassView" guid="umRYCn2dek6PVCutQ7EHjgAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Left" type="integer">628</XPD:ATTR>
    <XPD:ATTR name="Top" type="integer">552</XPD:ATTR>
    <XPD:ATTR name="Width" type="integer">181</XPD:ATTR>
    <XPD:ATTR name="Height" type="integer">43</XPD:ATTR>
    <XPD:REF name="Model">fbO+5cdSPEmSXuXSqE8gXgAA</XPD:REF>
    <XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="IY/ehYDmxki8kSqbCHHCfQAA">
    <XPD:OBJ name="NameLabel" type="LabelView" guid="lcA4v9eDHUugTZoPU740LAAA">
    <XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
    <XPD:ATTR name="Text" type="string">FileAppender</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="LabelView" guid="OVAuCrBMykaCfcii7gDdCwAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="LabelView" guid="xiHCrB3qu0yBBg0U/q3EawAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="XJMRRQ4IvEKN76PkDbMKOQAA">
    <XPD:REF name="Model">fbO+5cdSPEmSXuXSqE8gXgAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="wZmHw439VE+zuefCYQQqVAAA">
    <XPD:REF name="Model">fbO+5cdSPEmSXuXSqE8gXgAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="PHqgEBQhpEmlVKbjkRedkAAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:REF name="Model">fbO+5cdSPEmSXuXSqE8gXgAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[8]" type="UMLGeneralizationView" guid="xnvee9U5202YS/ztrwJSRAAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Points" type="Points">695,552;574,439</XPD:ATTR>
    <XPD:REF name="Model">DwI/SvxrPEa+xlJeUNknVQAA</XPD:REF>
    <XPD:REF name="Head">NaiNuZ1qLUu+5nZq2pgoJgAA</XPD:REF>
    <XPD:REF name="Tail">umRYCn2dek6PVCutQ7EHjgAA</XPD:REF>
    <XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="oASzcKN58EuYmztjk4WiEwAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">DwI/SvxrPEa+xlJeUNknVQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="O0OgQK6n40urO6JVc74njgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
    <XPD:REF name="Model">DwI/SvxrPEa+xlJeUNknVQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="bgKTOidFkEeRLn6bk0KEEgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">DwI/SvxrPEa+xlJeUNknVQAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[9]" type="UMLClassView" guid="rHFGD6C9T0y5SMWPFgS09QAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Left" type="integer">628</XPD:ATTR>
    <XPD:ATTR name="Top" type="integer">704</XPD:ATTR>
    <XPD:ATTR name="Width" type="integer">181</XPD:ATTR>
    <XPD:ATTR name="Height" type="integer">43</XPD:ATTR>
    <XPD:REF name="Model">V4xOMUpxokyB4fxrQNJPxQAA</XPD:REF>
    <XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="OuAPH3aKlk2rg4cWgwv2BQAA">
    <XPD:OBJ name="NameLabel" type="LabelView" guid="BEu6SCte7E6fslLxmD8brgAA">
    <XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
    <XPD:ATTR name="Text" type="string">RollingFileAppender</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="LabelView" guid="diAZdqUjrUSnaEkyvki5HwAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="LabelView" guid="HpL3GnQOO0KyNABCTyAsRwAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="1hKuFZUojkuzeqX9AiWUlwAA">
    <XPD:REF name="Model">V4xOMUpxokyB4fxrQNJPxQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="g+GUofZEmU2lEM1VL3vLIQAA">
    <XPD:REF name="Model">V4xOMUpxokyB4fxrQNJPxQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="4HSOp+H3/ECJnOpzcIo3jwAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:REF name="Model">V4xOMUpxokyB4fxrQNJPxQAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[10]" type="UMLClassView" guid="0AQ8gdYUKk2Ms7nTdCyd3QAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Left" type="integer">820</XPD:ATTR>
    <XPD:ATTR name="Top" type="integer">380</XPD:ATTR>
    <XPD:ATTR name="Width" type="integer">85</XPD:ATTR>
    <XPD:ATTR name="Height" type="integer">56</XPD:ATTR>
    <XPD:REF name="Model">F1lk6TogWUGfYFH4FvBLOAAA</XPD:REF>
    <XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="h/ce/kieOUyyxRZ6c71fTQAA">
    <XPD:OBJ name="NameLabel" type="LabelView" guid="UZy1Qq+RWUWzR+BkMD2qBwAA">
    <XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
    <XPD:ATTR name="Text" type="string">Encoder</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="LabelView" guid="A/4/paNKfEeyuIjaeXDosAAA">
    <XPD:ATTR name="Text" type="string">&lt;&lt;interface&gt;&gt;</XPD:ATTR>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="LabelView" guid="Y950eaGp5kKS5JcixC2pLAAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="lyHSH0gj5USAm8DDiVvc1AAA">
    <XPD:REF name="Model">F1lk6TogWUGfYFH4FvBLOAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="A7cLwlK4RESapHusUAalugAA">
    <XPD:REF name="Model">F1lk6TogWUGfYFH4FvBLOAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="qQCEnWeXyUaictLrSH/4IgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:REF name="Model">F1lk6TogWUGfYFH4FvBLOAAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[11]" type="UMLAssociationView" guid="lMmxZJude0e4iK5TJK4KmwAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Points" type="Points">820,408;724,409</XPD:ATTR>
    <XPD:REF name="Model">kXyf6+RLrki8M9yh9qd9JwAA</XPD:REF>
    <XPD:REF name="Head">NaiNuZ1qLUu+5nZq2pgoJgAA</XPD:REF>
    <XPD:REF name="Tail">0AQ8gdYUKk2Ms7nTdCyd3QAA</XPD:REF>
    <XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="Lpxx+3J+D0S223D5ODQq4wAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">kXyf6+RLrki8M9yh9qd9JwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="rhfNbKEGWUaK9KPGeno2AAAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
    <XPD:REF name="Model">kXyf6+RLrki8M9yh9qd9JwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="5lfzJsxzLkS60zCpNz5+twAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">kXyf6+RLrki8M9yh9qd9JwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="w+U1pR05XkeMT1rnnS2TcgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
    <XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
    <XPD:REF name="Model">KNPa5jL8m0SnxCPJDiLPEwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="G2JYoZaOKku0lwIKN7cKRQAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
    <XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
    <XPD:REF name="Model">JFP7YnD8ak2COLWe8jfBSwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="Wzm+qJkDL0+jgE0ioVsNvwAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
    <XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
    <XPD:REF name="Model">KNPa5jL8m0SnxCPJDiLPEwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="h/GU+p9gHkyMIIzW5Tap4wAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
    <XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
    <XPD:REF name="Model">JFP7YnD8ak2COLWe8jfBSwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="MLngpvqsdU+i4Djdsali7wAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
    <XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
    <XPD:REF name="Model">KNPa5jL8m0SnxCPJDiLPEwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="yN2upZx6REeZpBi/IRMnlgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
    <XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
    <XPD:REF name="Model">JFP7YnD8ak2COLWe8jfBSwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="ZVjULz2utUKwdUcoGweZkgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
    <XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
    <XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
    <XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
    <XPD:REF name="Model">KNPa5jL8m0SnxCPJDiLPEwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="4leicQixUEWISYBF6P8LSgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
    <XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
    <XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
    <XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
    <XPD:REF name="Model">JFP7YnD8ak2COLWe8jfBSwAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedViews[12]" type="UMLGeneralizationView" guid="VGws4gb7FEGKDPIpXKW13QAA">
    <XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
    <XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
    <XPD:ATTR name="Points" type="Points">718,704;718,594</XPD:ATTR>
    <XPD:REF name="Model">MAm8gr3YDE+lxocsUB9afAAA</XPD:REF>
    <XPD:REF name="Head">umRYCn2dek6PVCutQ7EHjgAA</XPD:REF>
    <XPD:REF name="Tail">rHFGD6C9T0y5SMWPFgS09QAA</XPD:REF>
    <XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="2t9xQX0DaECER1G841x4ggAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">MAm8gr3YDE+lxocsUB9afAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="ZJ+e5yqWkkyJmgI5NCe9qQAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
    <XPD:REF name="Model">MAm8gr3YDE+lxocsUB9afAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="uWFySM7Jq026r7z2lz9/TgAA">
    <XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
    <XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
    <XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
    <XPD:REF name="Model">MAm8gr3YDE+lxocsUB9afAAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:ATTR name="#OwnedElements" type="integer">26</XPD:ATTR>
    <XPD:OBJ name="OwnedElements[0]" type="UMLInterface" guid="bL5DGTE1wkqFiYq+yJuTRAAA">
    <XPD:ATTR name="Name" type="string">Bae, Rankyoung</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[1]" type="UMLInterface" guid="PfW7flMvskqKmFDofejCYQAA">
    <XPD:ATTR name="Name" type="string">Jung, Yoontae</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[2]" type="UMLInterface" guid="XthOkDh0rk67+FyPgXCRgAAA">
    <XPD:ATTR name="Name" type="string">Kim, Hyunsoo</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[3]" type="UMLInterface" guid="WhfjywuM1kqS7RtEmuvAlgAA">
    <XPD:ATTR name="Name" type="string">Kim, Jeongil</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[4]" type="UMLClass" guid="Ec4V6xlK5USBInAfRT+kBgAA">
    <XPD:ATTR name="Name" type="string">Appender</XPD:ATTR>
    <XPD:ATTR name="StereotypeName" type="string">interface</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">tSxGyrwfEkSgp1EcheSXaAAA</XPD:REF>
    <XPD:REF name="Views[1]">m+f/Nz96gEqfQeHGgfAxjwAA</XPD:REF>
    <XPD:REF name="Views[2]">ViAxcLeYxEC/QDB9dCuwagAA</XPD:REF>
    <XPD:REF name="Views[3]">gvxeAhX+WkGcvqw6KjlA7wAA</XPD:REF>
    <XPD:ATTR name="#ClientDependencies" type="integer">1</XPD:ATTR>
    <XPD:REF name="ClientDependencies[0]">kjMmekdMhUCZp7nT1+7m5QAA</XPD:REF>
    <XPD:ATTR name="#SupplierDependencies" type="integer">2</XPD:ATTR>
    <XPD:REF name="SupplierDependencies[0]">MLMgV5lk30+73KeQUlkJ1AAA</XPD:REF>
    <XPD:REF name="SupplierDependencies[1]">kjMmekdMhUCZp7nT1+7m5QAA</XPD:REF>
    <XPD:ATTR name="#Operations" type="integer">1</XPD:ATTR>
    <XPD:OBJ name="Operations[0]" type="UMLOperation" guid="FRx7C/jgm0uUQ2KJbSES0QAA">
    <XPD:ATTR name="Name" type="string">doAppend</XPD:ATTR>
    <XPD:REF name="Owner">Ec4V6xlK5USBInAfRT+kBgAA</XPD:REF>
    <XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="HEOzMeB7hUCVhMMCFiMU/QAA">
    <XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
    <XPD:ATTR name="TypeExpression" type="string">void</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">FRx7C/jgm0uUQ2KJbSES0QAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="/QxGe2nRTke4OPZr6B8DjwAA">
    <XPD:ATTR name="Name" type="string">E event</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">FRx7C/jgm0uUQ2KJbSES0QAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[5]" type="UMLClass" guid="wrUqRmysaUaTNG+EIldTAgAA">
    <XPD:ATTR name="Name" type="string">Lee, Jangwoo</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[6]" type="UMLClass" guid="R4ueGs13U0uU7uA7GfQuwgAA">
    <XPD:ATTR name="Name" type="string">Lee, Minkyu</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[7]" type="UMLClass" guid="cZJpDMIhLkaN+6380nTjCgAA">
    <XPD:ATTR name="Name" type="string">Lim, Heejin</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[8]" type="UMLInterface" guid="KkLGJmfcO0y7keuSLh3xpQAA">
    <XPD:ATTR name="Name" type="string">Bae, Rankyoung1</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[9]" type="UMLClass" guid="rzT262Z1jEeiLPfjq8YXAQAA">
    <XPD:ATTR name="Name" type="string">OutputStreamAppender</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">NaiNuZ1qLUu+5nZq2pgoJgAA</XPD:REF>
    <XPD:REF name="Views[1]">H/1viIm6yE20XaYIV5XQmgAA</XPD:REF>
    <XPD:REF name="Views[2]">/LiIyuskqE6jkbei5roLSgAA</XPD:REF>
    <XPD:REF name="Views[3]">LFUOQyCzKkODyDltdenqSQAA</XPD:REF>
    <XPD:ATTR name="#Generalizations" type="integer">1</XPD:ATTR>
    <XPD:REF name="Generalizations[0]">iGZQWONRSkmUZXwA2ctTYAAA</XPD:REF>
    <XPD:ATTR name="#Specializations" type="integer">2</XPD:ATTR>
    <XPD:REF name="Specializations[0]">AjD3odwWRkqn7DLLtsqSMQAA</XPD:REF>
    <XPD:REF name="Specializations[1]">DwI/SvxrPEa+xlJeUNknVQAA</XPD:REF>
    <XPD:ATTR name="#Operations" type="integer">1</XPD:ATTR>
    <XPD:OBJ name="Operations[0]" type="UMLOperation" guid="Y/8ny1CDlUmGw7XO+p1IVAAA">
    <XPD:ATTR name="Name" type="string">setOutputStream</XPD:ATTR>
    <XPD:REF name="Owner">rzT262Z1jEeiLPfjq8YXAQAA</XPD:REF>
    <XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="o7mxtv1VFUuGMzTZ/PzpJQAA">
    <XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
    <XPD:ATTR name="TypeExpression" type="string">void</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">Y/8ny1CDlUmGw7XO+p1IVAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="WiQnBPlZNUKAb1kDr8rYMAAA">
    <XPD:ATTR name="Name" type="string">OutputStream</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">Y/8ny1CDlUmGw7XO+p1IVAAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR>
    <XPD:REF name="Associations[0]">CNBYSz/4s0OUBwR3Ujj7qAAA</XPD:REF>
    <XPD:REF name="Associations[1]">KNPa5jL8m0SnxCPJDiLPEwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[10]" type="UMLClass" guid="xVL+I0ePyEKePe2ybmIZqQAA">
    <XPD:ATTR name="Name" type="string">UnsynchronizedAppenderBase</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">82N1NUXIMU2s0JVvIgA33wAA</XPD:REF>
    <XPD:REF name="Views[1]">MbkisNcJq06fy8rfNf//qgAA</XPD:REF>
    <XPD:REF name="Views[2]">bHWlSSp0L0KsF9iS2K/VuAAA</XPD:REF>
    <XPD:REF name="Views[3]">A3o0HBZQP0+GUAIDarVM5AAA</XPD:REF>
    <XPD:ATTR name="#ClientDependencies" type="integer">1</XPD:ATTR>
    <XPD:REF name="ClientDependencies[0]">MLMgV5lk30+73KeQUlkJ1AAA</XPD:REF>
    <XPD:ATTR name="#Generalizations" type="integer">1</XPD:ATTR>
    <XPD:REF name="Generalizations[0]">mt8sHMuW6k6vvkswchHN9AAA</XPD:REF>
    <XPD:ATTR name="#Specializations" type="integer">2</XPD:ATTR>
    <XPD:REF name="Specializations[0]">mt8sHMuW6k6vvkswchHN9AAA</XPD:REF>
    <XPD:REF name="Specializations[1]">iGZQWONRSkmUZXwA2ctTYAAA</XPD:REF>
    <XPD:ATTR name="#Operations" type="integer">4</XPD:ATTR>
    <XPD:OBJ name="Operations[0]" type="UMLOperation" guid="QrizX1w8Uk+lWkr80819WAAA">
    <XPD:ATTR name="Name" type="string">doAppend</XPD:ATTR>
    <XPD:REF name="Owner">xVL+I0ePyEKePe2ybmIZqQAA</XPD:REF>
    <XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="i3SFY3XjzkqfjCdeRItB0AAA">
    <XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
    <XPD:ATTR name="TypeExpression" type="string">void</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">QrizX1w8Uk+lWkr80819WAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="rcsyT8SmtEaJWAgOu29ifgAA">
    <XPD:ATTR name="Name" type="string">E event</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">QrizX1w8Uk+lWkr80819WAAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="Operations[1]" type="UMLOperation" guid="G5EvR3IAqUWyIUSQT5iKfAAA">
    <XPD:ATTR name="Name" type="string">append</XPD:ATTR>
    <XPD:ATTR name="Visibility" type="UMLVisibilityKind">vkProtected</XPD:ATTR>
    <XPD:REF name="Owner">xVL+I0ePyEKePe2ybmIZqQAA</XPD:REF>
    <XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="BZo+omwID0Op8lvSMhrmCAAA">
    <XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
    <XPD:ATTR name="TypeExpression" type="string">void</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">G5EvR3IAqUWyIUSQT5iKfAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="0mhi1Re0mUaekyTApQtYKgAA">
    <XPD:ATTR name="Name" type="string">E event</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">G5EvR3IAqUWyIUSQT5iKfAAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="Operations[2]" type="UMLOperation" guid="noZlW3WOpUSNYP7MIP2dIAAA">
    <XPD:ATTR name="Name" type="string">addFilter</XPD:ATTR>
    <XPD:REF name="Owner">xVL+I0ePyEKePe2ybmIZqQAA</XPD:REF>
    <XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="7JBY4nyhIES1n0jpwFzs0wAA">
    <XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
    <XPD:ATTR name="TypeExpression" type="string">void</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">noZlW3WOpUSNYP7MIP2dIAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="Zd/8hSZIgUuOnnlNuMOW3QAA">
    <XPD:ATTR name="Name" type="string">Filter&lt;E&gt; filter</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">noZlW3WOpUSNYP7MIP2dIAAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="Operations[3]" type="UMLOperation" guid="+Hda0J6VTEGM7V6+m3aW7QAA">
    <XPD:ATTR name="Name" type="string">getFilterChainDecision</XPD:ATTR>
    <XPD:REF name="Owner">xVL+I0ePyEKePe2ybmIZqQAA</XPD:REF>
    <XPD:ATTR name="#Parameters" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Parameters[0]" type="UMLParameter" guid="b7Oh8zbH6kKEeryzkMlLQgAA">
    <XPD:ATTR name="DirectionKind" type="UMLParameterDirectionKind">pdkReturn</XPD:ATTR>
    <XPD:ATTR name="TypeExpression" type="string">FilterReply</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">+Hda0J6VTEGM7V6+m3aW7QAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Parameters[1]" type="UMLParameter" guid="QFIz2saC3kK9QRns9gVVIwAA">
    <XPD:ATTR name="Name" type="string">E event</XPD:ATTR>
    <XPD:REF name="BehavioralFeature">+Hda0J6VTEGM7V6+m3aW7QAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[11]" type="UMLClass" guid="yqvs3sZ9DUGqcZqP0JhEYQAA">
    <XPD:ATTR name="Name" type="string">ConsoleAppender</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">uk+yKXVJ4kGbJp9tS5jKTwAA</XPD:REF>
    <XPD:REF name="Views[1]">nH6UBhoeX0KbQRIkAzLiWAAA</XPD:REF>
    <XPD:REF name="Views[2]">Jb94kigpgUqu4dlcc+CGdAAA</XPD:REF>
    <XPD:REF name="Views[3]">QxduxAxohEmCZQGHeQsZcgAA</XPD:REF>
    <XPD:ATTR name="#Generalizations" type="integer">3</XPD:ATTR>
    <XPD:REF name="Generalizations[0]">KECSr2IcSEKuUekqxWFfQQAA</XPD:REF>
    <XPD:REF name="Generalizations[1]">jfTGxiHUzUynYKDudsAtlgAA</XPD:REF>
    <XPD:REF name="Generalizations[2]">AjD3odwWRkqn7DLLtsqSMQAA</XPD:REF>
    <XPD:ATTR name="#Specializations" type="integer">2</XPD:ATTR>
    <XPD:REF name="Specializations[0]">KECSr2IcSEKuUekqxWFfQQAA</XPD:REF>
    <XPD:REF name="Specializations[1]">jfTGxiHUzUynYKDudsAtlgAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[12]" type="UMLRealization" guid="MLMgV5lk30+73KeQUlkJ1AAA">
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:REF name="Client">xVL+I0ePyEKePe2ybmIZqQAA</XPD:REF>
    <XPD:REF name="Supplier">Ec4V6xlK5USBInAfRT+kBgAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">lL0hvfNl1UCp0ZckmzYqAAAA</XPD:REF>
    <XPD:REF name="Views[1]">R+yIkrw1xkGRRmxo6cIv7AAA</XPD:REF>
    <XPD:REF name="Views[2]">MHt2cHh8nkq4xztkXeNA1AAA</XPD:REF>
    <XPD:REF name="Views[3]">1cFzyVYsZUexhz9n3LRU9AAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[13]" type="UMLRealization" guid="kjMmekdMhUCZp7nT1+7m5QAA">
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:REF name="Client">Ec4V6xlK5USBInAfRT+kBgAA</XPD:REF>
    <XPD:REF name="Supplier">Ec4V6xlK5USBInAfRT+kBgAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[14]" type="UMLGeneralization" guid="mt8sHMuW6k6vvkswchHN9AAA">
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:REF name="Child">xVL+I0ePyEKePe2ybmIZqQAA</XPD:REF>
    <XPD:REF name="Parent">xVL+I0ePyEKePe2ybmIZqQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[15]" type="UMLGeneralization" guid="iGZQWONRSkmUZXwA2ctTYAAA">
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:REF name="Child">rzT262Z1jEeiLPfjq8YXAQAA</XPD:REF>
    <XPD:REF name="Parent">xVL+I0ePyEKePe2ybmIZqQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">fqotcKjEKUu0dHy5krCbbgAA</XPD:REF>
    <XPD:REF name="Views[1]">a5TKNXnsu0Cm1O3vWK2A5QAA</XPD:REF>
    <XPD:REF name="Views[2]">lfapsg0nvkOzLtKq21jKcQAA</XPD:REF>
    <XPD:REF name="Views[3]">J/CqIqCm4k64OiOc5XyUFgAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[16]" type="UMLGeneralization" guid="KECSr2IcSEKuUekqxWFfQQAA">
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:REF name="Child">yqvs3sZ9DUGqcZqP0JhEYQAA</XPD:REF>
    <XPD:REF name="Parent">yqvs3sZ9DUGqcZqP0JhEYQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[17]" type="UMLGeneralization" guid="jfTGxiHUzUynYKDudsAtlgAA">
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:REF name="Child">yqvs3sZ9DUGqcZqP0JhEYQAA</XPD:REF>
    <XPD:REF name="Parent">yqvs3sZ9DUGqcZqP0JhEYQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[18]" type="UMLGeneralization" guid="AjD3odwWRkqn7DLLtsqSMQAA">
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:REF name="Child">yqvs3sZ9DUGqcZqP0JhEYQAA</XPD:REF>
    <XPD:REF name="Parent">rzT262Z1jEeiLPfjq8YXAQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">Byj7ulJD9UmN+tawKGwCEgAA</XPD:REF>
    <XPD:REF name="Views[1]">HQiDhC6IA0iqlMhf1tdcJQAA</XPD:REF>
    <XPD:REF name="Views[2]">npCChlHvbECPkeBWStHdGwAA</XPD:REF>
    <XPD:REF name="Views[3]">DNi8lqQWi0GHkNrHlB+wdAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[19]" type="UMLClass" guid="fbO+5cdSPEmSXuXSqE8gXgAA">
    <XPD:ATTR name="Name" type="string">FileAppender</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">umRYCn2dek6PVCutQ7EHjgAA</XPD:REF>
    <XPD:REF name="Views[1]">XJMRRQ4IvEKN76PkDbMKOQAA</XPD:REF>
    <XPD:REF name="Views[2]">wZmHw439VE+zuefCYQQqVAAA</XPD:REF>
    <XPD:REF name="Views[3]">PHqgEBQhpEmlVKbjkRedkAAA</XPD:REF>
    <XPD:ATTR name="#Generalizations" type="integer">1</XPD:ATTR>
    <XPD:REF name="Generalizations[0]">DwI/SvxrPEa+xlJeUNknVQAA</XPD:REF>
    <XPD:ATTR name="#Specializations" type="integer">1</XPD:ATTR>
    <XPD:REF name="Specializations[0]">MAm8gr3YDE+lxocsUB9afAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[20]" type="UMLGeneralization" guid="DwI/SvxrPEa+xlJeUNknVQAA">
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:REF name="Child">fbO+5cdSPEmSXuXSqE8gXgAA</XPD:REF>
    <XPD:REF name="Parent">rzT262Z1jEeiLPfjq8YXAQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">xnvee9U5202YS/ztrwJSRAAA</XPD:REF>
    <XPD:REF name="Views[1]">oASzcKN58EuYmztjk4WiEwAA</XPD:REF>
    <XPD:REF name="Views[2]">O0OgQK6n40urO6JVc74njgAA</XPD:REF>
    <XPD:REF name="Views[3]">bgKTOidFkEeRLn6bk0KEEgAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[21]" type="UMLClass" guid="V4xOMUpxokyB4fxrQNJPxQAA">
    <XPD:ATTR name="Name" type="string">RollingFileAppender</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">rHFGD6C9T0y5SMWPFgS09QAA</XPD:REF>
    <XPD:REF name="Views[1]">1hKuFZUojkuzeqX9AiWUlwAA</XPD:REF>
    <XPD:REF name="Views[2]">g+GUofZEmU2lEM1VL3vLIQAA</XPD:REF>
    <XPD:REF name="Views[3]">4HSOp+H3/ECJnOpzcIo3jwAA</XPD:REF>
    <XPD:ATTR name="#Generalizations" type="integer">1</XPD:ATTR>
    <XPD:REF name="Generalizations[0]">MAm8gr3YDE+lxocsUB9afAAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[22]" type="UMLClass" guid="F1lk6TogWUGfYFH4FvBLOAAA">
    <XPD:ATTR name="Name" type="string">Encoder</XPD:ATTR>
    <XPD:ATTR name="StereotypeName" type="string">interface</XPD:ATTR>
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">0AQ8gdYUKk2Ms7nTdCyd3QAA</XPD:REF>
    <XPD:REF name="Views[1]">lyHSH0gj5USAm8DDiVvc1AAA</XPD:REF>
    <XPD:REF name="Views[2]">A7cLwlK4RESapHusUAalugAA</XPD:REF>
    <XPD:REF name="Views[3]">qQCEnWeXyUaictLrSH/4IgAA</XPD:REF>
    <XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR>
    <XPD:REF name="Associations[0]">1RTpKQO+4U+uqZahckvNEwAA</XPD:REF>
    <XPD:REF name="Associations[1]">JFP7YnD8ak2COLWe8jfBSwAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[23]" type="UMLAssociation" guid="u9/9xY5vOU2kSfX9AmlMAwAA">
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="CNBYSz/4s0OUBwR3Ujj7qAAA">
    <XPD:REF name="Association">u9/9xY5vOU2kSfX9AmlMAwAA</XPD:REF>
    <XPD:REF name="Participant">rzT262Z1jEeiLPfjq8YXAQAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="1RTpKQO+4U+uqZahckvNEwAA">
    <XPD:ATTR name="Aggregation" type="UMLAggregationKind">akComposite</XPD:ATTR>
    <XPD:REF name="Association">u9/9xY5vOU2kSfX9AmlMAwAA</XPD:REF>
    <XPD:REF name="Participant">F1lk6TogWUGfYFH4FvBLOAAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[24]" type="UMLAssociation" guid="kXyf6+RLrki8M9yh9qd9JwAA">
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">lMmxZJude0e4iK5TJK4KmwAA</XPD:REF>
    <XPD:REF name="Views[1]">Lpxx+3J+D0S223D5ODQq4wAA</XPD:REF>
    <XPD:REF name="Views[2]">rhfNbKEGWUaK9KPGeno2AAAA</XPD:REF>
    <XPD:REF name="Views[3]">5lfzJsxzLkS60zCpNz5+twAA</XPD:REF>
    <XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
    <XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="JFP7YnD8ak2COLWe8jfBSwAA">
    <XPD:REF name="Association">kXyf6+RLrki8M9yh9qd9JwAA</XPD:REF>
    <XPD:REF name="Participant">F1lk6TogWUGfYFH4FvBLOAAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">G2JYoZaOKku0lwIKN7cKRQAA</XPD:REF>
    <XPD:REF name="Views[1]">h/GU+p9gHkyMIIzW5Tap4wAA</XPD:REF>
    <XPD:REF name="Views[2]">yN2upZx6REeZpBi/IRMnlgAA</XPD:REF>
    <XPD:REF name="Views[3]">4leicQixUEWISYBF6P8LSgAA</XPD:REF>
    </XPD:OBJ>
    <XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="KNPa5jL8m0SnxCPJDiLPEwAA">
    <XPD:ATTR name="Aggregation" type="UMLAggregationKind">akComposite</XPD:ATTR>
    <XPD:REF name="Association">kXyf6+RLrki8M9yh9qd9JwAA</XPD:REF>
    <XPD:REF name="Participant">rzT262Z1jEeiLPfjq8YXAQAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">w+U1pR05XkeMT1rnnS2TcgAA</XPD:REF>
    <XPD:REF name="Views[1]">Wzm+qJkDL0+jgE0ioVsNvwAA</XPD:REF>
    <XPD:REF name="Views[2]">MLngpvqsdU+i4Djdsali7wAA</XPD:REF>
    <XPD:REF name="Views[3]">ZVjULz2utUKwdUcoGweZkgAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[25]" type="UMLGeneralization" guid="MAm8gr3YDE+lxocsUB9afAAA">
    <XPD:REF name="Namespace">dQlYoesWY0yxg2VJCxHxOQAA</XPD:REF>
    <XPD:REF name="Child">V4xOMUpxokyB4fxrQNJPxQAA</XPD:REF>
    <XPD:REF name="Parent">fbO+5cdSPEmSXuXSqE8gXgAA</XPD:REF>
    <XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
    <XPD:REF name="Views[0]">VGws4gb7FEGKDPIpXKW13QAA</XPD:REF>
    <XPD:REF name="Views[1]">2t9xQX0DaECER1G841x4ggAA</XPD:REF>
    <XPD:REF name="Views[2]">ZJ+e5yqWkkyJmgI5NCe9qQAA</XPD:REF>
    <XPD:REF name="Views[3]">uWFySM7Jq026r7z2lz9/TgAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[3]" type="UMLModel" guid="UTbE66PthkuXloDrctmmwwAA">
    <XPD:ATTR name="Name" type="string">Implementation Model</XPD:ATTR>
    <XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
    <XPD:ATTR name="StereotypeName" type="string">implementationModel</XPD:ATTR>
    <XPD:REF name="Namespace">JEGKOL0wwE6O2Emy29kFuwAA</XPD:REF>
    <XPD:ATTR name="#OwnedDiagrams" type="integer">1</XPD:ATTR>
    <XPD:OBJ name="OwnedDiagrams[0]" type="UMLComponentDiagram" guid="UJbtRzsKuEa7sZAmr/tDGAAA">
    <XPD:ATTR name="Name" type="string">Main</XPD:ATTR>
    <XPD:REF name="DiagramOwner">UTbE66PthkuXloDrctmmwwAA</XPD:REF>
    <XPD:OBJ name="DiagramView" type="UMLComponentDiagramView" guid="vo5SIJcJIUWJz7mqomMr4wAA">
    <XPD:REF name="Diagram">UJbtRzsKuEa7sZAmr/tDGAAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:ATTR name="#OwnedElements" type="integer">1</XPD:ATTR>
    <XPD:OBJ name="OwnedElements[0]" type="UMLInterface" guid="naDG3jNwKEqkpiKwcQF/xgAA">
    <XPD:ATTR name="Name" type="string">dsd</XPD:ATTR>
    <XPD:REF name="Namespace">UTbE66PthkuXloDrctmmwwAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[4]" type="UMLModel" guid="sbAEE91CXU+VbUQcRp4FwgAA">
    <XPD:ATTR name="Name" type="string">Deployment Model</XPD:ATTR>
    <XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
    <XPD:ATTR name="StereotypeName" type="string">deploymentModel</XPD:ATTR>
    <XPD:REF name="Namespace">JEGKOL0wwE6O2Emy29kFuwAA</XPD:REF>
    <XPD:ATTR name="#OwnedDiagrams" type="integer">1</XPD:ATTR>
    <XPD:OBJ name="OwnedDiagrams[0]" type="UMLDeploymentDiagram" guid="tzrsCrrbjka5umz88mdzIAAA">
    <XPD:ATTR name="Name" type="string">Main</XPD:ATTR>
    <XPD:REF name="DiagramOwner">sbAEE91CXU+VbUQcRp4FwgAA</XPD:REF>
    <XPD:OBJ name="DiagramView" type="UMLDeploymentDiagramView" guid="OlRAEhzdxkCw+mUnxs9v2wAA">
    <XPD:REF name="Diagram">tzrsCrrbjka5umz88mdzIAAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    </XPD:OBJ>
    <XPD:OBJ name="OwnedElements[5]" type="UMLModel" guid="mC0A50UCikqRZT73f5NgTgAA">
    <XPD:ATTR name="Name" type="string">Analysis Model1</XPD:ATTR>
    <XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
    <XPD:ATTR name="StereotypeName" type="string">analysisModel</XPD:ATTR>
    <XPD:REF name="Namespace">JEGKOL0wwE6O2Emy29kFuwAA</XPD:REF>
    </XPD:OBJ>
    </XPD:OBJ>
    </XPD:BODY>
    </XPD:PROJECT>
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/manual/images/chapters/appenders/smtpAppender2.jpg������������������������������0000644�0001750�0001750�00000734777�12143164146�025701� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������JFIF��H�H�� Photoshop 3.0�8BIM������H�����H����8BIM
    ��������x8BIM��������8BIM�����	���������8BIM
    �������8BIM'�����
    ��������8BIM�����H�/ff��lff�������/ff���������2����Z���������5����-��������8BIM�����p����������������8BIM�������8BIM���������8BIM����������@��@����8BIM���������8BIM�����y�������������N��|����S�a�n�s� �t�i�t�r�e�-�1��������������������������������|��N����������������������������������8BIM������8BIM��������8BIM����	2������p���*��P��7 ��	���JFIF��H�H���Adobe�d�����			
    
    
    
    ��*�p"���?����������	
    ���������	
    �3�!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw�5�!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw���?�j6){+vח>w鬿Xw]/ݰK\)ʚzZ.(}E/}ks�Wp֚[oA-oWn6W"<g!�z9\$`,՟Qȸ\ѰC*v.:n?{?Q`*�-w?onKX�Oj'dN[FKxq.lNg�?|C?t[}L}",co>skV�ޢ*#)O̱t7$\n60X@Զkuk-߳�I|j>	ݠvNϲ˿Fߢ�Js~�W0Up?laЗ7N�BMF+Ɩ<hcGqfoU{hii[{ml�;+Q<_r�ӿ;�zt�˿tֶʍ!sڃ^5bڋ@cuO^x9hVr��:'��g�.�ބ?l�eкT\dR_ġ�xZ�<_k,_A-1o>0oxɩƺm!k
    u_eQ|>S_8Yu{I~yX$~8�ЄWGTaDxs<1dIGЫ'1f?qo�ӋSܫL�Nϧ��?/4GJ{uES;=K!Yv7vlo?ͷoenV>gBra>`~>�gUVj5ҝHn�5PqV(vo{�V6}Pv>,o?oڽ*=y9l�RI-m}:GlX1'nؼDi՝a̐78qtjӤ5/rHqޓG*B1��[n)pDozOmqlO?wo�se%w1_7Jj؞�X70q?l�a>a=jTvX!ݮD`omskՊ>>.,0FI[Wg�oSu'08=Lǐ}cJ��=:<|eVe81;~";ݱSv[02F;*N�?*g�ĭꖰV�c
    dۚ_s\`˩$9-u4};C_Xׁ
    z۷K�$J(Ȇ�Bj=Ukk0:D{75W�/_gUm.?MeYD'�|Fm=a5��=�Rė�\H�Бa~gֆִ@h{@�vC�$J|?gC_�F�r5auN魯ixwe�_q$F\[t^X�._윿Lw`	ײA�/�5gC�%W\qר�.8BIM!�����}�������A�d�o�b�e� �P�h�o�t�o�s�h�o�p� �E�l�e�m�e�n�t�s����A�d�o�b�e� �P�h�o�t�o�s�h�o�p� �E�l�e�m�e�n�t�s� �1�.�0�.�1����8BIM�����������Adobe�d@������N|���p�������������	
    ������������	�
    �	u!"�1A2#	QBa$3Rqb%C&4r
    5'S6DTsEF7Gc(UVWdte)8fu*9:HIJXYZghijvwxyz�m!1�"AQ2aqB#Rb3	$Cr4%ScD&5T6Ed'
    sFtUeuV7)(GWf8vgwHXhx9IYiy*:JZjz���?�L|K\#/NFo%"Lk}f2pGPsTgI"E01ƟB_wb/nRm-6;9KEۅM,3QHK,h-	%ZwGg7.sm˱[{`t"XGa;d,W(cU@&`ܢ[I'6JEI =\E�aR{�I)_]zEz??b{ko[:i.ڿm^7�oV;kpz^ac?_˦9n+�[mb8p8O}](7ʟ�F1e?�?Xn�Y?v/)�߰�!~vή�'�F{(K�={Nq۶�uw83߿qE�G_w?ݷ�>	ў/=n_R�^ӽ�a�C{6]�N#Qr��zm�Ϭqg~[״�?^�Mo}gW�=_zܿ�{�~�8m:�@G߸��e/�@;?׿n�Y?~/)i�߰�!~vή�'�F{(K�={Nq۶�uw83߿qE�G_w?ݷ�>	ў/=n_R�^ӽ�a�C{6]�N#Qr��zm�Ϭqg~[״�?^�Mo}gW�=_zܿ�{�~�8m:�@G߸��e/�@;?׿n�Y?~/)i�߰�!~vή�'�F{(K�={Nq۶�uw83߿qE�G_w?ݷ�>	ў/=n_R�^ӽ�a�C{6]�N#Qr��zm�Ϭqg~[״�?^�Mo}gW�=_zܿ�{�~�8m:�@G߸��e/�@;?׿n�Y?~/)i�߰�!~vή�'�F{(K�={Nq۶�uw83߿qE�G_w?ݷ�>	ў/=n_R�^ӽ�a�C{6]�N#Qr��zm�Ϭqg~[״�?^�Mo}gW�=_zܿ�{�~�8m:�@G߸��e/�@;?׿n�Y?~/)i�߰�!~vή�'�F{(K�={Nqq:�@/{ܩ�GʟoFq�ug_߹S{?m�Ϭ0߿rO*u?׿ӎ�Y՟a߿~O=T�7?�>?�׿~ʟ{?�״o�?^�N;o}gV�~?S�h?ߐ�!~vά�#�^*t��7^Ѿ!�C{8Y�FT��eOn|�~C�8q:�@/{ܩ�Gʟ{Fq�ug_߹S{?m�Ϭ0߿rO*u?׿ӎ�Y՟a߿~O=T�7?�>?�׿~ʟ{?�״o�?^�N;o}gV�~?S�h?ߐ�!~vά�#�^*t��7^Ѿ!�C{8Y�FT��eOn|�~C�8q:�@/{ܩ�Gʟ{Fq�ug_߹S{?m�Ϭ0߿rO*u?׿ӎ�Y՟a߿~O=T�7?�>?�׿~ʟ{?�״o�?^�N;o}gV�~?S�h?ߐ�!~vά�#�^*t��7^Ѿ!�C{8Y�FT��eOn|�~C�8q:�@/{ܩ�Gʟ{Fq�ug_߹S{?m�Ϭ0߿rO*u?׿ӎ�Y՟a߿~O=T�7?�>?�׿~ʟ{?�״o�?^�N;o}gV�~?S�h?ߐ�!~vά�#�^*t��7^Ѿ!�C{8Y�FT��eOn|�~C�8q:�@/{ܩ�Gʟ{Fq�ug_߹S{?#7#Ǥ!�yܐy��*#??ݷO؟?޿qr��@uz(oϱ?~��e'Q1׿v�c?b�~i�GmO׼=�c�>Ǫ�ۗx{E�8^�M{}T�
    �/)?^q��G;O;n_R_{7m=S�6'vvܿ�{޿/:nz�@lO߸?I�:_uݷO؟?߿qr��@uz(oϱ?~��e'Q1׿v�c?b�~i�GmO׼=�c�>Ǫ�ۗx{E�8^�M{}T�
    �/)?^q��G;O;n_R_{7m=S�6'vvܿ�{޿/:nz�@lO߸?I�:_uݷO؟?߿qr��@uz(oϱ?~��e'Q1׿v�c?b�~i�GmO׼=�c�>Ǫ�ۗx{E�8^�M{}T�
    �/)?^q��G;O;n_R_{7m=S�6'vvܿ�{޿/:nz�@lO߸?I�:_uݷO؟?߿qr��@uz(oϱ?~��e'Q1׿v�c?b�~i�GmO׼=�c�>Ǫ�ۗx{E�8^�M{}T�
    �/)?^qݙ=Z&ٚ9ku7W
    |SPxvٻ^|]-,GC[<<=
    �ͼȳX3+}rn/o}=%f
    eha]Z
    yw9m <5a$/q,Q 1jiL.$K ؉>MB
    r.=ݯm){9�vq�Szat7t1<}C+sɉj0u{K{T1TWejͺLV:	jE:!y;ygy8"Yo6I!wyAmw!ŕ;*-YY\29H/6t&}"PXs:;jMB,[6<V"
    ϿLJ |vlPU{TF&ϾvCF]
    2w&[tk
    *縼bw-~IVex|M5jH7zE/Y 'wXܝ_!c*~͓5>{هLvn:�jW~0,&ؤ%?wf|^|S
    n[`uiAM,,in٠9A[�[ŠkXd,V
    ̨Bm}lnۤhԚkxnRB@,	pGv.4{?qG5NfUdsES
    ؙ	e:)icRFd`#q>viy=w1@d3JіA*#r@J}~ls"m[$Uf]Jji*>g*(e&?/r8$@,9�`#_rȀ~ϤH
    4{-c-|9ꍳ{�({{OW=KeNt|w.\tUR9r?yo\'ҸvKyAIễhȨ�zBa{=}YyzY&VH`Q⦆FK5_EXOj�`_�w>??f_�r_�G�D�[sZ}W?ޞ5i>}7iN_Q_կ	ux>uk)^/]9_ТݻQMݙ`^UVEQ}TXagj08ŗX1TCCK-ZP
    HGGǷ܃U//lCyi%HT/2)Jʽenmn]_
    n]kcu{
    ;B.](3vg{;|oZ<X9.l!CSUpC=XiL|=>~߻sW0s3G;h],Sml�췑b5*<$!^B`q�o]D
    1Y@ZVёPRZ[{gQ휖iG51dQkbi
    etT+;x8:yUHKoW34oٺ놷*;IFddRjݭW`y^q%}HKpI*J1|YGn?ǮlcvGem]<Ͱzy!UM.GwIFHeW + ~>U,h]mn4P^[*SsHಕA ?,.gq{ݔLDCΈʤ)Eߌ?&zktc@bA7n:suWH+1{
    缶RUVҚ<ZC:U<r:Ex^M�p{ewu{Cp{ehQY!#@$.ԎXy7r?lo~"XaGka̅FvXgJ.;!֧:3+y`nأ-S֢_UTL37?r2L]9R/5j})OWFWA*=#~ghEяԈ%6V*	Xc9yύ#6^Sv�{{1[;IΩXnƢM޵}>+rFcXgBϭn͏|'(msbK,Mek,dMQm`i4)]ԛ,1lX
    IO
    Ĭ2j]
    i&ʾ=OSoո6?af+}Y
    \d;[EV%l:jGdW$=}hgɭ..'ޚCww]>vNѸE9wbf[ǂ(cAq
    i
    
    uqCOBw>Sf%íq[+wF5vu6
    ]łĢI+`~z}imw;4\{7oxk<Ĥp2|){ٿNLv5Qr5Orͺkm3FDZ/zw2޹5q}p?PczNݛnUM|ri6NƮmCzel,O<}~|"|$Knn	T%4r4klxʲ"TV_mK݅\fHT%j%f:dhkd}٘並{Sl1u9mɜnwI]Yd+fjT;yojl#oneU$Ɛ#ZIÍ##ЀZ�.}|3ݵH9U%˸
    !iFV?�2Gɩ*2>GUvLQ	&4hd[\83{"(ƈ](ǢSBhh0z:4h9#x.YGՔR#פ/|w.={llSoǵ}na)3XM˗j,"jjxFT2q{m[={)-3E,JJ$1*ʎʐzAe|׸]mgo#$Go3nIP2+TH||[ؿz){#'\ynzʽ0Samڵ;fVYvzSM\a`ap>ټ՞m
    k#\K{ru)<\HwQx2T
    i%򷳳MMess! #KȦ#!eXXw=	Ք}[\H˷i7t`90c#I1Ao9V7sw7>s?s\%Ⱆ܈̚d́&KR<9f{u.atQf@)%jZCfW\[eo/{;+~{3b/Exڰm/}o|MS1IhTKQf&幡HwQq%GKVkx3Ka!TWyf-N}eu\!n$rQi#HK*/G\yv/4fUT/_n-
    az1UxAr{sɲ{?hyt&FSY�Fjۉ.*�c \;lQ^PČ$̐O=䔽wٝ	3(Cxcf2_s7ܛcaQMS쭝E]MIC-�]W^p|\˻]cM8V\4V4EUM.Nm[-QNn]|R!+GXB> 2v�?3su&}͖m֛7'vf[톂M.X/a>U>b#_y.-LQƍ$C~AQ)9AH'j.k7Ԟ
    |m6uLZ9ʑlɪ6J4��{o
    guWՁ.6(_Y7vgƶN3m<O%~̹GgRN>>m�wQcvn',Χ± E.>]ѦiLFU##\`hB
    ޳QG2ԝO_wJ܆['&n?kdi+kz:f
    u+-y/nomxFy<
    Py'&`dIh1vlt9~"b}7!Ŕ2TnŸVdh*To_U_=ʼ;mG:E<p+p-T)|D7CcȻo<eIV9<Si+qw-kܖku!q#DѢHeôQ�N3!~'i}ݸ͍]QmiU8tÅ$<:Vuwn
    >>7%Oo)/Kx"=/)sdV{ܳq•)JIQ}'^wg|t0vVNx#[:#A[#%.2*դ	2:@ZNKM6b]i.&j%J
    64fEa3KM>^l9Xl76[O(7pkb+eV $i]N:(wE_VNm6?;kov.]={ܹ-zeZ1	Fr{.֛eػ2 S.Ĉ>x'Nz˵nplOc/0Bᘂ-K>[3/s޻s{	۲+ڻ/{�w.?fխs4x|U5RA"SHU{na?.Z:$QZ/+q(GeDW`]UA$o-vVܣgVhkiYw
    *M�+}-=/{+zY+qX{bd2tp$x=ъTVi#VE,<fΖ|nkaDcRp@4hzE;/ye40JIF:{�=?g>.~?q{Gٷ>M�RgN>O]~=</կOVs;2=uhîjx㧚ύ_"؝tuPW#q_M쌶�aF|
    Q\D稗%l"!>yqwX[%ėIg{Kf`
    (E$tNS渠.em^%so0Y`L+(Rt~QIӫS_~?fɷ'ta}MSShwm|4O\)*hKL}v#-.9d\syJ.1(<_10EYÒCf1|2xZ5aBtkQNvwXNnY`{ltxmA팭^O
    YM=rA4Mx*/ovfxl[I./-KQKwEYT7g2Ň*N5{ţbFe	*FP%XPh�i�x3gA~g^ϣ;V)۽YmݫtfNW]Lݹ]ml{{#G?kaIcyj'=e9cp?ol~Nq#nogs\I#-4DH.f@(Die_k`t]fvf9Q"iYasQG@)fT�p_(?vT?b>4Onc;;!/p캪M:'}c=ypgj2OFTR5\]}[�{?\asD/FZ[[[I594H%P/&sD$3E44$J6ezR0G+Y.<5?cU:1T=Uʜ44[[jTQ슭ɓCOALҽdwVrV|Ӷ.𒵂o;YrnVìFA
    wWeDd%s!	PIIS{ba~2o&߇|_Lv6Cuwn*;bݛvm͗۲nl%$[K԰%Wio}!ĦD@)4922)vbFO:\IDx^?eM@kPYjzL>=ߙޫ!ۓVGsuc~m}0Wgv;
    Qqte)Yj)Hڢ 7țVc[96ܱtKyoW F`UQ!hۖyslzm-$	o+L(	x�+te~E�/_? >0/?e똷>հ�^}AQmmwsE5MeY%4}r'=m>sFr;c5=&7x䡉$`ek@>g9K`c-D5wrSV*UK?3Swuԗ1O;lum>Źn+W˃sBj*#4."ܿ%l,o<ݵs-،i5\&	$YdQCPcZQ.]o~{>a$#D8yUJ!HvJƋɿ=dtog:>0tw}ڴOa?Q7U_QI&:imG#$]퇿\/5{5{'0mZ=Oq{^CX
    eJ(ߜOO#2웖ʐ:.;2=6[םq/)gwcz׻ksy\wm͛޻Gbf蠣xںN"(o_2|k˶^~5DAW3ZS5(=Ca>�OWطs[-NUx]
    ID[RB҂�
    OyaWֽA5jl
    AջrCz7<hbhhjŵ奯F7-d;H�vI6;'ޞ
    $VR37f
    @mmJymYobuO%rF6~lԛ:o;k_r/5=Q{k3{mL) _+Q>ߛy?涏vKxJ?JxBk�6yf|{K9	�HIde,I%u55@o״}oj>{@߼&�}z״}oj>{@߼&�}z״}oj>{@߼&�}z״}oj>{@߼&�}z״}oj>{@߼&�}z״}oj>{@߼&�}z״}oj>{@߼&�}z״}oj>{@߼&�}z״}oj>{@߼&�}z״}oj>{@߼&�}z״}oj>{@߼&�}z״}oj>{@߼&�}z״}oj>{@߼&�}zK� ~I]q[�ўoյ?xs_-�~7??׼g9�gxc3�K3߼
    g�k�%�{X3�5��~~{�o�F{?a�?^?~?�=߰�k`�?^[�ўo׵?xs_-�~7??׼g9�gxc3�K3߼
    g�k�%�{X3�5��~~{�o�F{?a�?^?~?�=߰�k`�?^[�ўo׵?xs_-�~7??׼g9�gxc3�K3߼
    g�k�%�{X3�5��~~{�o�F{?a�?^?~?�=߰�k`�?^[�ўo׵?xs_-�~7??׼g9�gxc3�K3߼
    g�k�%�{X3]ei|iE(#<=O|$\_`?{
    6A2:G'=k>AA?+m${#Ե$4×#AK[ÖVDev])ݷSct|t;,JDecD$~<2:F O=h?nC_5- #Nr曇=b+߄ޤ_}Cz|7fl]JtW5Xk)k)ZIEԎS	m._x.oMո<Vh9[b@WPBhMz{m"]r߶<DV6"}pBVhqPE@<:79_BI>AMw9*�lAi/[G^SuΗ�6�ډꬻeu_ͩӛp
    P
    \pş;o�ol7#nm/yBOI"YSΌ}i/iݹm[]a˛tBfvYGbA�F53s}u$OvX^Jx٤Va:WĨ@P=X7Qom?r']Zn|ۡφYKOSOZZ!:ISu4O]�~<m?-xgE2A$UYuɶV̼<vHeuY{W$iH|%x.َ
    !lLKPw]gm|w[S@so-)V4Z	H$*kom7K˝tߐ[II`r|5^B�		|Hyߍq坪ǒnޭK95%|C)0UY\7eGW2=*~7`kɹ)1Y0p].l=FhcYR93voy`ы@%CVzMeWޣwݶ�gxVrEYZxe\Rj#ɯ>_^}oi򮏋y\"cj)_Ѥ^l3&Юn{hdk|m.|^LE|sQe1kBjieV="Z{ɜWCkYI4*ZX0ឹ!w2?w3^6VVPG*)-C?ڪ~c|"
    gunܴt8߻Wen-$mb*$cO/Oݳ,l{sŴ39nTEt-\G<q(aiR
    ӧ^=޷dK;ibU
    TU̦)#*e�@Ff*{{7̢[2vڞ<XvYMՍG\m<IxA/7[^s˱Y;x3R5ɇJ:�B(`H}&&yN%"V2uji]e7M5#|(\˾>%/^~Yje>ص]$Mͷ0Y
    N}3q%Z镠ȯ/m×=Wfugvm顚+Cʑ~,\Jmr_\{O\g"r3m3M$PۺٚHh"Udî|B)Nx[ll�~Ta's{{7
    WFWhf1]̴an<t4WnmϽ~6r4H-%#
    cuR"YCf\o֛UJGI
    `x@oNa]ה�oݹ{i3�17~,�ov|m_il\:S>VSSJ(B~{Alז7MrtR(\ǷF"G1Y Gaw+{U۸fE]@VIYRAa%7YfJBo}u=_𝿊}=hyo&қ_huV59>~T&qQG!JOp=ͻyAM]՚K8m]FDEH	Y݈/y[F9nUjݴD@hy�fP9)
    :[x;*t$-7eKT?ps1]7ns1m2#qOnއwP؃%{
    yiVc.wW0s-x7WI S5WHdi-!	qrǾ~~\~ꏗjNVYY䀈"KEC!R5w΍Cao0k쟅wK|heՕMUs+an"*䍣dmϳ[.@Vk\5xnR;XmCknDH?w=ݛi?;xf4fhi5tH"i
    #0G	.#gaT]O~:wmw^>@dwzva3si툆Kbga1U	oKJaqvܧ)8vUBZ]*F/
    50ī=m{fΖ65ɺ3ʮ$HB+mDRDo#�Rt^?�"ٷ~c_vW~~YM
    M.MS�vd*SP[oܓ=W[@Ϻi-[uţxB2IxZS32,0`HHIsl%:Bib.I/#M-I%X@c,KIdY?y>_9~\VKm3Ey|mXcå˭R$kqˀ{iO&O~
    9Hĵ]1RrP$_zyo-uJ
    (x&
    r(2	#ơoM߷%rn{{$~_
    0{Ug0S`39<*Hbv7\ra-6]_kueoѤnn%Xf[{<HDSBTqD[G\g0wr[x]ΚƄDbWvh(/EO}+?eß6̢ٟp^DŽXޢ%5e͈ː)%dJHb>r\W-	eDxȩIo:2`6u/mk;G4o	2ũVu*(gňHQBՔWg=?Gzww�{{;6.n33	ltoq
    ǸtË>9OAIizEuo8{UŔ?O%ͱ7W{LMm$alee&i9:H͏s{|;[\ڞmynHko%tenxVON:_}彺[|@uUיu[H:f>-(wLv٫;(+E]50z>"{S{%m{ݮϽKX4Q4fwSE":+|kM8~l<.u6B ao
    Y#+jĊIcA_t;;_hu�lnNK=,na豘:jIhrR{w=r76[봋0MQlvs$qT+3e[$b:2[\/mrw.7t2]$jOAl[ugݵzg0ؼ!}]f;Twml~@nM˹*fg8,B_bps6o>-]I#2m<hJDs"tr6CfiP<&+dJx]>CwL?d{u�;66>=;;Uzulm퐐\nS<Ux餜={nX?�*Oek-K'4&A)RhH˲Ԅ:C7>Q6dvm-6 6cLI=aSE$
    6îtcur?ofqTm_nmls~WϘ922J*_o|sN˿muk[R}鬥H4"T8 v!$WY?m]w}sTݦ -KnE**ђY4J	/�NL|v�_T6|a:[7s#2e<|'/H28ғ6.ho_toW cno%GpB	cK
    G-m;F Y:4#$~+s;v)!$RO4vGdtv�lY:SUTN8: {C1o	YӊMۻz|&
    XC%NF:&DY{gzoiy6mzG㰼mL䮳mQBx+>_+e~b&2x(̲DӰEO(
    )!X
    ~Ta>sm	Q|m&ܸ~<N܇iŜ[ov0ωfU\~ٿc6({z5;v<(#ZGticGa]5"Cwopkx7E絎FW(&[w@!\*i�Uw&>ݟ˫zN|-ёەT5U;|f?	**f؟m�>�;.So۝aK{	m-㰍6UI*Z	KmD
    f`oknZk[3`neJѺOÚ/|=T~�+&AGEXmظɶ>wpQU{9
    ~.u*G6a}/lln/?vøW\\^Z-Cc{+,mx_۫>yg[x{hXa'Vͤo
    m(JI#2m<+ǩ>AtT#}bY;kzCblz2["M~W
    GHq<G&pssY6_ra$ʖC=ckKwԪ.![[.4mNh+O|wz7>NLokW6oV#@Ca|;Vm?lfi~ Sw1?]_w.ө:	t5KeGch*|e~<͵GsAw<כ^d4NKM*ez+Lu^{XۄI>׺\;[+ķ*FE;P\j@5N=ޘYxo
    '-~CG8e�Wz9w^,>WvVAIEE%Tp3F{k͜,>˰jʱR[XC
    ިuk&X䐳Kԇ9S,y6bܢeDHJWKfZ=q�0Qd2vwُi>
    ^g2\sfma:8+A3;vrIZo.s{�<y�m;I
    7̞:lۡ6Rڭ
    0dIW{=m=ϖ̈́W
    4O3,kZA1]i*4І |�M7oOg^/iAvOpt�n6OIE7ؙ:jr~&*`ugVeP7m?ž*[06#}>}ZW>'L<?zݮ[3sR6ͷa4.Le%f)cDgU-	H%`|Ŭk=gJ{ބ+W;vfJ/͞7_lCxm|/bV<8ZzjZB	sgvja/^;vC8xFܫ^GDfQʳ/.Zn[&ٸ2[DKRHuPƭtp>B�0^L7U{/7^_cvܻCv<}G2n:-L̺TB5�[v5y�f7h9Rk#u;$M%F@QFnxaܯ6kO>sskH`~8[*yN8VSziv-V|M=mgN
    b
    _3SSIHqbc0Geܷy9n�Zǖ,b6xd	 h֒ ֲ�2$.5Gu]:%`ؑp]؈Φ
    m]zǪ3Y<99{cpb4CIAQ&'1se&dT>Ye߶x-)>RW]$iba+m˶|;{Ÿ)mȥTW2TT4+&	A14';_vX`}iu*w>n}UCo;lb֛ml&Ysyjt]RT(fӑ9/\{C_s-ٴ0+F qKJXbt geR86N\g7~aRhWhC-XtD戀vTV`|S'H-_I._E8n
    ՝WjK4
    Y&bSF>;^6[quib	oўȉ"cԵ/܎]�Yom$'1K|kñ_\pV~@|G|9]u].CPSuJ-�շtUSAEYR<s5lnfTo3iwFIV+ks9f{s5+x	o{3ڝ}-yߙ~a!^2-n'%H
    ?�Coξޙ[Ww6kp�,*O͕·3kXwTVE7JG={XԬw�0	RkO9+$BXRҢ5߻hny^$^kv">\bw;7m\Gxa|O1E
    sx'۷3Ǘyݿ=\z*kb=B/$siZZ_I=*],%$u	sT"G&<s'/YK"\Ki!WkOYGzl>_)z;?崷~LCm\>h7zl*\?RBoWmycqٷ)vպgS
    -7!5D]6@Ki6Hַq\$w(bi`uũ($2ҫ{F3w=?ԝ޿͇Io\ͧ~8�7-v9]Pô3{'q	RA$2yCeyJKM=my<	;kqq4pCKOK(`Lz)߻{m0OSQHA7F@Jehy#OSJ^	;1;9wH]'?0]M7<8Z{qmє[S?[)*xpϱsw{k/mez~c[c{r )$_Y!E+a9k*[_^I<>VK}̀,&>[Q]ȯ#oFen;�om]yܔو~eU={rxdp:	wwD9Gyu/aݹy-.$Yi7(F
    O b$t=>y{ZLqbܡ?ߥ6?O7$"@ß~>u\wOxsuP违#ؽX�ػfI6>Vv`n9w>zb6~&Yt2Oo.io?|rn\Z}xm.D@N^$gvxcfecId?[|ܻ2�Xm7.&Dʯ
    #(ʈCbwO">NvϚfݏ9\sl^{G3>]Ɇ32KO]GKWLXQwn\c�l{m7-(g@$uVS	Ve%H&ǚv^p6m+YhVZCPsPB1/g`?}S˯ue�S|?˯~_^/^=O.՗L_߼?�.z~]{/?x0	]{?V_1~`ub�x�'uC�Y�_=O߾�W׿�{׿}S˯ue�S|?˯~_^/^=O.՗L_߼?�.z~]{/?x0	]{?V_1~`ub�x�'uC�Y�_=O߾�W׿�{׿}S˯ue�S|?˯~_^/^=O.՗L_߼?�.z~]{/?x0	]{?V_1~`ub�x�'uC�Y�_=O߾�W׿�{׿}S˯ue�S|?˯~_^/^=O.>֕E)ޅ~S�cWu/sow>?o+f_)~ko׿|?ݙԥ�魿O^�ve�m�R禮={�3nٗ9J_;߾?+f_)~ko׿|?ݙԥ�魿O^�ve�m�R禮={�3nٗ9J_;߾?+f_)~ko׿|?ݙԥ�魿O^�ve�m�R禮={�3nٗ9J_;߾?+f_)~ko׿|?ݙԥ�魿O^�ve�m�R禮={�3nٗ9J_;߾?+f_)~ko׿|?ݙԥ�魿O^�ve�m�R禮={�3nٗ9J_;߾?+f_)~ko׿|?ݙԥ�魿O^�ve�m�R禮={�3nٗ9J_;߾?+f_)~ko׿|?ݙԥ�魿O^�ve�m�R禮={�3nٗ9J_;߾?+ΦPTH Lצ=^">7`͝o�B1.۸sP�'Y?d;?eխN'�+p=U1YIژ|vE;)JxggUؙ|1{K[rԗ-ܩ4FHZTF!/E@BX�#ͼe[<績c}/0H@
    ϥX@=S7ͯt4�w#D#b/Ӌ�}^O`=۞QB4xqtB]
    [�}ӻ\eUp{Wlu$upO!'Țm=nFQ㨤OIJ#1
    @rzݳb[kx#Y?`XSwS֬Dkaa,vj"oc@*@	<�'ս1Vo�,"�ڝyTَe zO�Gz-mh6�h3�ۛ;'w|ʩuサݽ~Cxlg�cuQo,	tmJȠzu$D +K%[<ǹW_O+$Q@5k0\F"EV%uEvg}|6n QeTwxO/�6ѲY힓ٝɼ;�m<r13g2R|%jJu5=eGdgDY֚<�piDF	>c~w9}vv�"!vT	P	[Muhzi?O_t{^j>,;4VA,(Cyp(d^?O_Sdz++9vU6fv6brc{Ÿ-
    *)Ul:
    ^FU9IJ,o0"kU	ƬKi:!(M<s%k{A'󔗿x8�r,bM&%%[7>
    j-_nv흧umg<e>sdO'9>Z#wjڙoh{y\cittv[+!ȋKxeYBZ*C;w}oK=mliYD	Y"	V7%HZ
    vE>˟yW;进Wqk{�j]_:SL�oS�/><=3J|^Ҭ�~\ٕ|hmڕco9\=W-}VɥjJxٛ͢~!b0^mfɛh&OJե9?q/Y䴕|Q
    k,z*ۨ
    CJujԨ�]nG{s<[j[}�tGH!m;2ʳZ�OSi#THڗC-_W7{h/׶�I?{+"U{?ם=>w݄_p$�~�l=8tth:k�mc�j?2�o�Ao=�*{_hҟK&Om�v(2ܿr��g#X�9n{1Iݟ7c6~%FG[=68
    &{OgV.3-R \7/sVWݘv1qpkylB2ˤ<uHG}=
    mohVIj>4fe$aPiWJ�G_~ğx}/ܿ퇠	b��j?R�o߿A�"{_hG*Omu�(2ܿr��__dOk�mx�)o?R��߽|֞�rz	~�ѕ?=uio�x'_�?_[�//2'��
    -?��߿_?J�ҿr��_<?r��
    -?��׿_�ƒ'/a%�FT�GK�4'_�?_[�+?2'��
    /���׽^?0d�~�l=h}?Ok�mx)~��׿^2ܿr��W_dOk�m{_INm{?uWpd+/a%{�FD�_>�e.K�t�k߿A�"{_h4P�J�G_^�{�
    /�퇯s�G]K�4�ĩ?zv�_y}I�rz	~ѕ?=u4N�K�Go^�w�
    /�퇯s�G^�i.Om{u(Rܿs��W_dOk�m{g%��m~��
    O�IO�9L�4Ĺ?z|v�y}I�rz	>b'��iOR��׿]�…'?`$�FD�׿u\��׿]�…'?`$�FD�׿ᦿp�K�Go^�s�
    /�탯sG]M�4?z|w�z})?_�^�'?2'��ir�k޿�Cu}�"{_h_7.Om{u�O׿ILS'��i)_�^�o�
    /�탯܉�9?M�4�r'O�_9?_�[�#O2'��
    7?$��Ͽ[rܿs��GdOi�mu�
    9?$��Ͻ[�‡'?`_$?刟:4L�L�G>�o�
    /�탯sG^�i�g��CuHPqsG^�i�g޿rܿs�>b'��L4Ĺxq�?>��d�2�{Oh'Ĺx��X�O ?퇯sO^�i?r��[߿'n׏'af_i�m=u�
    3��X�O ?퇭Odž̿z4H�K�G/�_�
    A^�#~?sO^�ir��[߿�'n׿I[�9?L�4Ĺxq�_~}�I�d=�*�{Oi_#._?k{uo(�l={u�̿z4H�K�G/�[�
    A^�'3/��h���[޿�l={u�̿z4H�L�G/�W�
    /퇯sO]M�4x|r�}տI�d=�*�{Oi2_k{uo(�l={u�ʿz4F�L�G/�X�*�{Oiӟ2_k{�u_(2ܿu��?�e_i�m={s&K��mo~���O׿G_�9?N4ox|r��rz�ѕ=4F�L�G?�'�Au=?_i�m=x�)?S%���>Pd�~�lov?ʿQi�m={w&K��m_z�}?�r:pʿz4F�L�j�O׿G\=i8�e6_�j�O׿G_�9?;Gl<>9�8O�
    /탯W-?᧿/l<>9�?u1�O׏qܫ�9?O�4Ox|s�p/)?_�[�݁�,U�Oi�6_�j�
    O׿F`z4�D�M�G?ھ�'�Bu�*�E4�D�M�G?ھ�'Buz4�D�M�G?ھ�'Bu�*�Ei��x/�}NR�…'_`#{JQi�m=w�
    ??e��_P�~�lo_vȿQi�m=u�
    A?e�?ھ�'q�\)?_�Z�݁�,U�Oi6_�?jJ�/탯+i�=_ܧK��m_~�}ԿI�r:ѕzʋ5ɿ㪋;IN	R<=Ót_uݳ�?潡�Q4Ŀ�g�OnտDSZں5I�K��Q$�v�l={Ou?�U?Q�4Ŀ�g{?bI�rzџZW^�i>;�8'K�
    $.퇯�굧u5'H�L��w>_Q$�v�l=x}=<6i�m]{�&s�;߿u/(ܻu��g�#/�c�'p�\Y?]�^�_3�kOjjO?S?9w�p_I?]�^�_3�{Ojԟ3�c�'�Eۯ�?W�'G_<87D�œۯ�?V�'G_<87C�
    ,.퇯�^ں&s�;߿�u(ܻu��s�{OjԿ3�cǏ�'E۷�?W��h<8G?�
    ,.ݿ퇭��꽟u5/F�L��w>�rz~�џ�W]S4a�r��l~�}��rz~�џ�W]S�4_?g{�On׿B[�^ںS8��w>�Q�v�l={?uG�꽟u5?E�M��w~�Q�v�l=ou�U�S�4_?f#�OnֿB[g�m]{�&�r�7߿t�(ܻv��g�׿?'o/?}NN�'˷oa!{�Fg�m]{�&�r�7߿_t(ܻv��g�GT�4A�r��l~�ӿI�rz>џ�W]U4?_f+�On׿A_^ں5WC�N��o¾Q�v�l={u��U��'_f/�On׿A[^ں�'r�7߿t�On׿@_^ں_fi<.ݿ퇯꽟t2lmmI_]q{n	jO~lD[Owc9]ǵ'N|}atC)dHbw}u=-ŻmWy#xvky)$H_d$ʯ"w~u(nT+!+UHqY\x"BȤ),?ɳy�?d5>u5O;We˦_hp?3~�C]WX
    ;vɭϻ>͢2n])76%͎
    QUH
    a7wHF͟ymymnvʂ9;I"Y%J xٔ_j/q{gmۮ	M"xAZّC�CN+vٽz';
    >Cbv{dsy:gnbsϧrYM_r5Ij5z95}~<ſ_s�07>v_̐CB"g#I|AZ9_ٯ{kgؤ䝯q\*]scH&vfM:S| *ɯ{n�{$y_$??f	&Y�}UG�/�?ҝ6켾#*wv?vPMsQ_4{{)^lnBCIUTњKUSދ7=q揼o3}w0[_msvMl^W@²$I*3$hW{mݵsyC,i0;ʢʤEbV`^q?�'?G6ci^o"kn0tݱtM!AU(i
    SRSC0_S笠2n$7"l띒Mfdd!’*I/g=G}kT-[F{0jB(K^7}W-;-D"�^}S}ۿo}_އ^wۂ^Wm�-�'A`ifn}�æ##viؼw}a9=ˆy�w<٣,1ՙ
    
    Iy(LY
    kos�7S@G5p`Y�Fv1QMF~>Q6	D6�hT򏤊rzs7}?>淇OժW\/׫<:yJҜ|uO�0ǁ:GZ|_)L;?$�ߒ~
    ښ��ںo�k[_U]38.ͅ]}!_
    zSjL|8QSc5'v8.yLsJ
    #
    Nߛ/cp[{o;me]6s#wVjH2s/h`}:SCѵN]ֻoxm\~ݛW#5T5>
    <dnz
    S=/AE靥ǾIvWnl.F
    �_қWzf>cWwނU;Q	sWOH`1l-Sm uu6IC#1!ٻWs/zY,3<V,tOp=[O>|pY7W⻃``zx:1+wn.vՠNNJlOȬ&Mۉu{}um jj:z:czE8_sm~m3Ns:i).>!odWEaޝʲDj$t]ztR|;g=_�e#Mڛ�wSlݏugL|G 54aa̍
    0Kck~�ʮW�hK'ʏc;m]ֹ]ݫ,'puWc亿Ϳݑݔ|
    f<fs#lvkIQ[]lt.bwV9
    ՇnLs-3W{vO!wEf{ޓm**vze,F^::yZ:CL2>_.A|}{#PӠ;݌3cojn~^؍&])֝m6_QhN_p}łÑU͞qY=NQN=0|ꝽOy|>SjgA|ퟏ7n
    }Sj;A
    BA[9JB:tfWn_OGZH-zCwv'|>!wctF*
    ׯ~;˹~>
    Ѣ�H]
    �CqOWb:{Oc(k˭OV)_Ǭvu&sv&uo~>pmMɺҋ3>m㈒:ʺ(i2lEL%T"�g/=ηğ/�Ew�F?�F�S�r�Zt,awpnXL~\
    >썛
     u4uuf}鷰5T$utPӺeh\Kmߟwf.ڿ5$nA�ҷam�9cM/BݘSL48Uk#hi)Qֈ=}s{Ɂ[/y`phnSm9YiiI#vFV>ǭ=?Ul`J~J|r쮜zO%ާ잹5C2=C;sru^;Jn|V{ս)[61pSeKyGtFo_Rg;b`)V?cplYܩܛ(3oMX#+FT_\zgDo|h=v'R|!>Ln>k{5kvCVc<1]5E
    %^:
    }A)tU#?Zzgz'nخ�;e;W)kwgnr?39U&zIV:z$d	,e�gvdCG]WAzvRWr2t{_7@A)V=I*yki*x|iA3O]{=}�:d>�>Cջo#e߿Ļ'l.o!5cUB<A] z|aٽ~Ct^nc_i}^{.ECd*$=lԭ<*x8t|~m:ySU9ׇߺu?~m)Ouu"zޝnSK�aӯ6N:Oޏ�:]ZzG]{^vHXN=˭{>]k׮'}x8{I4p?[:�{Ǯ~xun/^~}{޾]k\Gz:uq׀0M?￧zu*kL99�zև ?:L	NXӮzpzߺ]uz=Ќ_ߨp|�zwp�^JGmo~UCT:GV*\I{T{V~QשA[]
    Wu�.^�OV뻋	=j-O[tS[:͇Ꭻ =q^돽=oʞ}t_~~�{
    OW^ߘ:'>:{5[\��~X{Np=x_*uսuO>N�czߏ{u덏'>}׭zGoּ\-~n[ɹ�a=huߺ]{Z~n׉{Z\r1Չ:}X
    8
    =kf`idúu3<5lTf`i*)#Rt8pW\HEą Q	-|JPhsǟAVT;S�^�?w㞯wڱ?ܟNBsZ	`kW;iqL@ƴO[n#GǍg(kt/g�I ib:6f#\7*H49TGUzׯ7�s��zw	�~<?�$��ϒ~ǵo+}gcjջW�U|m?')vwn�fOGB|t{ȿ_
    >;Sb�	ڝO*0~\u�j.T5
    V=#wgOGu6Wm|Q8wP?>]C}S_3w`	27o-?0oE$p��7VO}[Y"s7ogk&_ɟy
    lm]G}kTvo6S䎥vqmGT.lktꭜuNl,-_{Bq콙ԟ.{Xw~?.6'k8b+s�
    J|Q蚑=wE)Aew^Nug?>rpn]> {gbtn|(;ӷpomUwf闫*3)TTWe=S׭`~·lNu&{2w~ڻx6|to/ՔylOwUܘLfS&Dl�A=Zaz=Sn/[o":󸗶VRon߲t?Zo
    ]Zcy%ۙz|rFյ}=C.qjzmr>m|wN?qOn}ô{cJ\k|X;Rz`[1zۙ99E�)+ռ3[WSgy[,Ʃmh~Ob��2{8``�/nڛ1[(^ݻ?5vF:-]C<�Gs`vF#vrunwfG{>N?=7vmvdeu2bg)|:׉Ua+S7?RV۽{N>I~:3_wt�~z'_?!wmԛK/g𚷫(ro)un?н[*O}s&۳_5~#_;z1ӬJ�W.uu	Rjzޏ:AְUҿ/qߓ*7uko1md~pGK}nٿmNVmYݕIIjj|iA>Wd;=odpg̯A?ϽRzz~\s(wVܛiv缀Z:]>|m~vn|ڹ==ߵ,7?v;v>r1e�6<NrӮjPhhu͸h^*:A|W_)~V^�Ǟcw-ːɏ/~1unڿ*Mqq�#MׇTՙ驲-L:+5k7ʝW�uG{4cvF�OۛO?08;_s�
    ǔ6Xu|?_G+q.Z=pbvcGqv-GQ۝_oz
    ſ*+3rc*7^PTe` du6G^>nnz1'wX7WoFy|n
    
    meN+SᖱE[E'{/.KS6]|mܻ|^Q_!W8g|6N=?rTUVv
    vs).Ŧ`3I<Ou��Q_)jr,_Uo{ot$u$h4uo`ml(ei%jmQ5p᩵_g^#g!O݋dO)׻GU?7[O?ٌMCenޮ�{܏ywv_%*͸r5^'#fǺN^WU|n�')w^�fGOC|ؔ{~_
    _>Sc	ڝQ*0
    ~du�j-Bz�uZEdR^#vkx�4_僱Ww'o�':3>5~nl'鏞X,-,Jt,�97el~i|h[{[c_sIYNۿ!{o:##6^شyF.deA�uǭ�׈\ޛc[]n]}9]7ëy�[=j?>GV@q_�}^]~-9@P׎@xî6Vր]zuo{Z?	'Wcׯ`zzsG=h{UԨ޺3^
    z{^^5zl֠?{:<�׺^#}kREhi]?'ޫL	=qO^{[3׾{Z)ׇ^}uz:k_}4V"zSg?^zb?^_g^:7>uċ{T{I֫t{^=q?O[=w{yuu�;k^8M׉@W$^�VozMzߟ]7ׇ/ϿSWv[zoz=z덏'xun.z>}T֓Z8�okP|Bz^?R7?=֘^8ވ\}ZzqN�xCׇ]A}WϮ��qI�}�{ׇu`u4뇽un{ֆ^B8^uoϿzufq>GWOz{8Dz.]%{Num]
    ٨٫)TQQMNjxZ/f]5;ikJTq$&'(VEJȿOtûmɀݛ;jlnݯ<utUʸ
    *LRq9vy\Zx`!yB[UlHWUBPxi4$u'Q*c<8Ӈп6^;OX˚tzsUYM5}t�}%7;w@@0js$ӥ0F#@�<}��c�ȯX:�_'?7
    [|bvW^+�9<s#/�{7_>�z4ǼMƭWݫV+vEj�.kyݝLGp�C^?}Om�}]0?�F�}exx�Cu.>�ѯC־?7]ϯO�C�x\<�p=E�}OoJ�?x_�?7\NG}O�[|�=ρ־ oG׏S�_�?}Em�ZXO#�q�N�ѭCٸ"m�Zn96�~S�|{S_^1vOm�޼{m�Z!<F�y��S�ko�m1SF�y�d{ou??�hu3\־m�Z?Qn!u?m�{_^n9�S�j\��wC��?x�c־!߳vխ�G}E?�}xol^�ѫC؞㏃־?.2kuz�F�k_Vζ?.?�?x�]1�troz�?W}־/�t+h_OM�#޼[?�}[Ìӽ`��57�h{3У�{oմ1`�ͭ�?g?q�k#o?.�F�,��⑷o?.??M�#ߖim�Z߰]xv?M�#޼Ym�Z�~�Au폧_�jo�kc6ƻ#�57�h~f�ޛ1߰]u8?=�޼I_[m_}�~^,Gi!�Auv�v:�F�lG>:ذݎf�%c�zoִMu7]}k�1�4�h~3JE4JS~�Auz�F�^$־H�`�?]}k�3�4�hz2J|�zo״k`�v=O�O}�P(DM�Z#?`�?]}k?=O�K}?{(#�zoN5o?.k;\vz�5K}�OH�ޛtj\�I־q߰װ�~S�K}�r�ޛտ`�?]
    �~S��D{yo׻+ſ`�?\Mgk�k�h]<#f�}{-}O�G}�R�ޛ_&xvm?�#C�Ϳ`�?]}j�F�M�Z1V{;T�7�4w�hu�?kGA<[V?�#ݵ8�Q8U`�?^�~S�G~N1�?kG
    믺[�[�ߟ=S�_[*߰?u?
    �#ߵ7G_y«GÝO�C~G׎߰Wj:�F�U`�ׁOVu=�<S�ߟ}q�}n/?׾�Oj?ֆ߰}j;�47�huGkuO~~=�<S�ߟ}u=�<S�ߟ}ֆ_vO�'?�jZ~/?׌�~S�?~s�|H֪{;PO�?~Tc�Zi~~*{Lq~?>X_<~~5M�O�'ދ
    Sŏk`?ן�S�ߟ}_K߰}i?O�?~ꁟ?�߰�<�S�ߟ}P�~_w~Ӹ�~�S�ߟ}ꢿG��}z3FxvO�;~K7�Z 
    ?�'޻��_[g_?�'޵/?kFFxF�OU��_V/כA�3�hu��־/?i^��h{��־/v�hz8��־Lpo~z�Fn�OH7�ZG�?^S�߿}R#��־Q-FNҽ�?�+߫Æ_/h?�'ߎ��_[-õx?z�Fn�Dq��_^k/їO�Fn�C"?k�?^v�fn�	�LS[>^�S�߿&?�Zo�?];F�b�W~TS[躟�Ff��)1�Oׁo~u?�+ޏZTS_o~�WR�ֵo~~>7�hz_T�}X|
    ^^�S�gj?�Zqwŏ�E{n?'ka7�?\Lx	�2�h~#%$�}zxgO̽�+}ֿW%?tO�/!8�dj=_{_gZz�?/!9�djxgu?�+@�dt_K�2�hz"LI�Z_6_ڻ?tO�+-�sc־�/־�[�WR�dj?q/ٿ[��WhlO?_n[�WSc־d'/na�n2��hz"Sc־6_n͵u?��+J�tO`o~Xẟ�FV��Am�dUf'
    ᫳O�2w��h~m�)?m׵vo�FN��m:?'kx�?S��MG$�}xxMD`�?S�'�'Gjl~c�?^ه\O�'��Okl/=��W4�Oj7�?]_9�qO�#�''Al
    2h~x��E{KZ�B??YA:6lWd ߻ܗQ}T}}R/#7
    Ï{cnʨۚZRZ
    ъMIL,(Պp/�Hy~r
    �Bߵɓ/�"e�Wi�W:�fHy�OՏF�Ǵo,}gcjջ,	o|\PSϮ%ƣ�}oëMf~~vn||I:ΧelxsR[odbgjC#^P4CN>Nَ[l=+vXDKgg$)xu2Hje`#V@=w~NDۭKE׈ѧB˦86:\/炯y\0Eø*iPTyUd*qxܖb[Cu2E
    AcwMjWef]5v*teTV`( &*	NF5RZTRk@YN?itɯ^.	͇�ujc?E:^?׸upm�x�P)>{X�*t`.G?sy
    +jA䲻%Pb֮%YMyb(+$R#�
    -Aw @H5v)V(ВM�*A�(cCA#7ݫ?P|G[_jFYW6zYt>Ү2JMP!snֻՔwR-:
    Ԧ@`qUXK6tӡYiRVFUqR+@+�}S^@:q?_u:>}0:ڂ�ׯGf>GnW׽:6#zz
    jj\Qny)Us*<womE�;f0TlGS5n^^,[CP̊ƁpZO;`[]ZovYʭTt9l<cٍvF/`zcKiQmpa
    .ں5KU7taZCVvVvr4H#
    U4M 2E$K֌UwùYAy�"9(H cx6Mke3EJH
    rK`>՜cyu�}.s.>zڏ>}hm}Q�^ه7V?%��w}y�}ۇ9zEn;>A|5X[.2#RԛW
    5JTRIm0܌MEBH]54Ej�YFiSqIeC8-+;S�WRu<@A>`{e79e$՞m4�Un麳+p}KtzDI,rsotBዧcLF~W6;oͿI]En+Ex+0jZj29x]iyo{][9hIS�FGEvWZ Y@*Œ =)�m-�qoW<^^��cX
    n-ս[~vmۻCe<C?s^1Xi1Z39ĄS`n1nFHlLj"�^'=ݻnmK{DP"
    "ߊ)2|C�	w:�9}2&vf̜{kn5zi�/Tݩ	80=~vWq0;-WMwfEwi`i)ik82=7(-w+,;iDfQ֚:gr;mŶӸ%⢲YH*!f5jE:5gxm=C.Wg}1pVKA6Gmfk	墖UUO\PUD`)"..3%K40a\T+@K'[ITR+F�ҠzQc_otIl�}?M:<ȿWޫS=vqWd<7lݼaS뤢<M-Fn6e5"I[HH+.ĈՈ�
    ]&DA/$qX1QY$+
    <RIo�zhn�[ҏgʭwQ۵1V^/
    �Bn\֮Ki�eV6ݘM熇?lt|i#rm>
    fq.h D"-kh# 0  pͤs(
    pŒRAVO�}:`zCnVQ�>覲GVȷW޵u5y"+;UDPYTx߫Z�	'Jq]M&1Sl9."_>+s`6^Gb=3STCOL�ryVH&ID?&P~]�cy< t?]"daV#wvQI_Qda SWck|v_Y6K�7�i[n6+B#U2cgwkut*Ge 2V�N@E?�iҭ'�u$u"<��Rsׂ׼k�}꣭=u_?N[o�
    4
    JÓ!ǷSfhh\Slݻ]_!3O}k]R聃Z
    SH'<GRfϹ3s7\Č;xd85*0*lm&1yQ)#;N΋
    ©iR Qk4qh").M)_JznmݹYRnmݶzTek^ԕQl͹O"JO.&L2MY2  T'�2ZԨ*<qי9}nG)b~be,�R-lY9@*�F�l?֜ӠF^E�}u$c�~z:Hu@oȮ��zpvCTi,ܵ/8F-4\S,XFTa-͘Q>ԃ폶|߶ER^YX@&p)PV\-P=6뾽9i)2;cm}UED԰Tg0Xܥ\T^iwB3m%uj'7vv^@|{xf]wufQJj�0J�:\�x�Qt$Poc�>xuёy6?_�[@u_?3^N?+c�!׌?+]x
    ȭou=q>��c|zApȧ;HX[5�mהw/ЭFc+pxW�G܏cDE.GѿQV�9mTKGYD)E-AyʊHX\VM��@ǗQUDG{)jE[ I#:ۜR@O�?^
    ƣB!M]SM2hdarYlU=(t é%�}G?׎G^2?F�l?TӭH]~�:5)|,Ƒ+=,?`8VmR_SAcog,	z0_vmqǑ449P{RcӶPOOA&r:\cs8 *!f(He[x]XbKm2-=Nx�[+|i뗕@7#?ۧZ
    }z$[?N^=xʤ�AU<Y9Z\<yu)~e 7a�Ri$uȣ?T^-}IV\Lb,_~z뎱?_{#[뗕lEo�2zz@�`P�x�+ʤ}TO>c+ZO[c?r:]y�F�l?GW]T,~4uו�x�TAɱ�x�׏]yͿW޴׌XX+I$]�x�׆:Q*?oq _#?_�}u�~:_$8<gI57iqo,yݟa�Vz??P)Q+^տ"6gU{9_J
    =uoT,gI1,vYe5ZdxfybB$Ony}ǛW顨$4KOC8m%R@P:Ǵ^w˗41eg(5*NEAt,H=	|gvVvo[N>=eGpcp,rslr]%uc/?e`>}o۷B0v{1 R#U-JKTI*F^t^s6nEH@˨P<z4~Haݧj6xyjFSnMsVVUQavb)>G嬪ȕ2JY}E^S=XXw9Ѡ,cU@��ckx(5H)E1>BuT2I9'ϡxs5K+׌[5u+5fJӭNo׽x{k^-a_u2i\)os5犍lTXe;IZ-<B8dEE2d`r$Gp68q8vE@h8<#:ߝITSIZ۷H"xܖr9L”.ҡ"3gg}742HNEh0H{?n`-"88R1l=ٻS#nu>/,ɤ%5S2M433;3KHvѨUQ�(=Es5\HZgbX2zQ?5G邾UK5E>?{2:zWy?5%M)ՊqI~-�׽(xu=T}UA,Ƃ-C9o'Ա�dr
    $c6vݓ[Ͳ{2'X>⾏	p҂,LzLe`{]{uq<-qkZ~ҧݎ=iEp
    YȰѫH�ooT[;{Zc�w.V�mb-I]�׽i׊Q@^/ck�ƽĮi׀H^kl}wA�mE4Yִϐ�!ž�ꔠ0W]*5I~H\A:ŊG>_Čx�Q׹PmbV}RA׻.1$ͳN:۵1g3X8HZEWcL+g~ռ^,b9,%EԊyHr?MOZڭ$+{·'K:hU�t}[|޻fX|4#͵6E+U~-CԚh(le=E=LKWSM]�p%0ۣ�R'KR*aNki~xaܭ{T@e�jU@)g|ar{krU7h"ZZe�yG+y`ZiriVM#G+(xYr-d,3YƜiBpEH~e6g
    yokh΢$:RIJj)R�"_$ok؏EkE�yS%3N}tߏzSaoboSg:kɾwv#iPV]߱NRt<ySʞ{wQû$[*~O5ezl3lx0;ENcHǨ{ZatJn^2mҹNZzjŹgbee0Ďni'5 +r6{%a_}Gn[RJ#"yHrh55Gp'[]&|P6;}&WsM$UZh&,5*I|yi^A̛K;p,*TP5"j	v}5~i"ɡ##WR^tDj*?1SncRPKɶ㣺]۹Z%<Uz7鞢(ޫ}Sݮg�FQ
    blzPIy{g0^][ӗmNi0�*;0�O0S-O׼A�y�}o~>]{9'mLMWI[_6RBŹ6�tSO41:6y*)剞9)
    䧙SەO˻ũKu[|,$A'66{700%'$~ՔݵJ]#=U,B"
    ݗQ_Rcc0ur3ᲔeZ Zje1p{dH'Mq+JSizj%vuRЊ�1?={E<vܔmU|31)b3ƑrQuR�C	O|~{ɭZܭB@XVXA0Ge,Ē2+-*cZ|~z퇝Gϒ '|XV;\:6T
    ƀ�.Of~/z(V?/=_޲ �շo#2=x[1S}A-fߴ_
    WݝY 4dgZJ\e5D^aݣpr%cp@pM4H7Ki.HZB@9ANo
    ]yȷRvJnA'T~O_oa]DvvԴV_Sݒٍ=§uOx叵ܪ
    (:y]fe-ګᔮ1<oPIcSN&(fڛ{m.^H!ՅjL5&)&Glvk&)*Tţ`CD�ӌ<P>oqy
    % pWEH큻lMFkenjS?BhRjSXCWO"0Ung~ͭ߈V9)G#!$҄u(
    Ԉv-pkk\A#(�Y*1�y+t!+^��Q"yG]__כ뎯.^7.ܙ{5}1-#'eEC]\._$XR?am7S%ޣ24�AkJu>}9W[%yK!-24Y<[u[pY}縺gym^}T;^i6cH6>ߙ,{Mfi6/.Nvydo,k4a4)>{{m;w0|
    'X&Z٤IwdQ%$I$LPmW6[{
    SbpX-V'G#!l<}˱pFEXP�rGqo{tqC$HŝݍYI$5^{iC^=x7?=ŭ=x6{N{OzW{C*uL?9s=ԝSIl6̣S#>Ŏz+Qz:TP&#4Hϻ|#nLoH@W?tSҧ׮}mD
    ߞADi{~)<++M4JGL)/bH};-6w.qYf+)NZ)j0imJ�7pNxۖ_x}Eo"]+@U5`iT^\1[n+MPʏ$mCq<ɚtum38덷ػz
    *l<_ dp|Y҄Uc24GJP,4m}mwKO^ʰ)=`>rN׺۸"4ROk:MTOB�y�{4 R}tOO	xi-eٛ{blfՑobӫYLOF6,GYT_QTb'wcvWVd7Vn2F90g=+gqRoZnX3oA;EFEK%6ZoFE1(irA*j<:�FnvCuSB>'?ez
    =>3#no[jdTzZJLdS"3u_egk=5y {vvcslX��GDv[^lWp$g%ؽeݙvFgErնVoչq";RUUό9ΨڙM=EЖfVؠB^8PO;|EWf��GLcX=̊kߋf`T:�M^޿d]AVQ~}
    |YN)E#~CݡfMßIZJjjhjV|BOVKM\sןmAI?[a@ƽ}숤uujKS%*fQSyi"JSGy,iS}L
    Ҙ1q~glOOap[;a	tS-MPܵt;APژW˫qDڕ;rnSX".Ե5ؼ`c[uE{\w%@3Zux�VZOiZ��y�{֬Vh/zߏ~mt˹	?"Y13ֲ6>["Sz֝5ϗDeͺ,6zt˛J$gI#WEM$4N#cP.t*'w#%D偪||wu=\T±0\Bԭ<4@CdR.|2:TS9ʔbj|YL5FJ9)&UtȒrؿqPxR?aN
    q섿˧N/O�{ޮnދ˭N~O�q
    bM}W˭w6�u1שӮ7u~ůSV+/zRuھ]kǮ-�=ZߵS˭RuދyS^޵|R{_�ƽԚu?>_zךӭӯ_߃Ҹ}uz6o^kNOשAW�{@׬�ǟNGǯW{��.�s_޿9#ǟͿ�KOJ�ϴ{wj_�5l?[6w5]T;PPVֻZ:em^?%GUʽ=^>Jzy<SC"K20`f١]Hn#F q&YBCmJqJ|(tW|74R7ʪ%Yڙlt3X"rHm9R;qJS#'Jsz5ボ(\|Pfj
    y:c1_%)Q
    eN_
    Uu<"8喲Bpje-ܹzFT�g@55&<;
    Zkq
    đ
    |Nv~RR2Ui7i1w^'xP`hf
    WZz<|N
    gؤ1V([[
    7"|GGUՎ*OV(*cP4)4Og�i�y�{:5%~tPumwN˸ꎉۿC<-OvsSM\+ɥ3Rir2TiM{zA7_x_mҝ|.ۻ#ho}$n#nl_{dl-FJz$!OLuuozF�Jvf??zӇUc]o_^[tu�Um-]}Hbe	ߟ?(kikrGOģ#C4=ϹQ{ZƠ2==X$j/-ups_6<h`%Hߎ#GѻmeDpv6E7n9tM"$mݿ}:"*e(&bîX^Z�{sO=wmK*"E<Iт��ƽ<'k^O׺u$׿[ˮ_OkߏVif^?OkއZ_~|E:+.wgHvvvvLS;|vF#rޙo}Gw'C,41'Ǘ_Zڽ˝5f=È^u`kz4AQ&+VIRtyћp!WT�r:J\f'g2RK%6+dޕ1#ќ)(k7V)d��I94hG;vTQX,@Q$�>V;hb%˙|b㲔uRGWex&D$Uue[k]"�U؊,nxu`2+h#R*0xN=?{:'s/Okdׯno5@ӭt뇶N>߹e�!4_?W~4Kkߺ펮;ul߲wج+1na+1T;
    %
    %ԢKm2nOm$wb&8uT1CKJhֽt7pY+#aPH<_Rڿ/>;uWsm]԰ǎW]S4OcSjvWiJAEK6<3$7\K{JbZhP34y(vrܟ[FLbJf_"3/ݠ֝z/}o=Uwrn~ƥ}͚뼇en,n݋6f`m
    >bǤEM7nw;}]4M#ȆM ԑ�8+A@�D>t>-ØnyR	owk�O1hv`j	 
    �S|HMջv.6_;o)o2iImmʜ0dj0VTHҚh7r}\.vj(QDALQx�WsXݶd7ϸJ%rکR8p:?
    ^RMϓ?^ŞH]u�׽ʹ��ƽ˯S'�ƽuO_$;.vm=ٙ�{Gdɍܝg0t=mߟr(RYw+4*-[SOھU
    ǻzTZ|1 #xҀ}筓a<8&c5VgH"@|;Gz�Yݭ.{lvw^_I9^%yy.;.t
    *VbFPÊb@}eܶOo,d$,4Ē*|5F`TߪRJНUGr390dFw|i!3X,&*xhҺ詖zj$]oۤZF~H9}^TM$=Ēe3P2p}??
    Sz8���ƽ֝zu?_�{tUW>Kk>T|?\Spn=|%]~]smMҍwa|tRE2K^_$�mwZom}۵Q3etu�k$eӺ _5lXh:S�1T_wmƶ8[ql
    	ӻ7N3nٛ'/In{%ml>4SdfTR;jCWeIEu6qL^1y.TƉNeJ	N59>=l׸ߒO5;3\KnNM,r[g謌0b-c�Yiۼ7{,s23A"pbU+_BJp(YfUSzdeewsvVٜoLEFW{+wvNBw1u{)ldBl]mnag]M�A3EÍ@-81V
    2xt&y.>?oo]~ӣ{=/+�ն߅/O�y�{lh:/S.+*䪧`TfvJFQjy
    tOdxD¹QNħ@Uoܝ!ivn6.j<:;![Eu&zQ{G>g
    Fo_O]IY=ƣ+K
    ݮ,#BB
    HZFr5*rT#L(iN+,W|VV|mܾ*DL'[eIjuްf3UNYD,ԴHvA.2dTxcUDne٣V$8}L@r֮�mmz6
    
    {r\n=ŒٻOxNj1ٌ3|%m>3SCX$yxi)Ĥ)
    R37CmncXF|+GEϗ$F_+1Yy.o軧{Ov[3^.{휄9fGLFC0I2PsÍhf[ӣf??l={^[�^k�׽A^OUU7'ɘCmas]Wv2(-6/6)fzTqS
    V:8S%V}EH4<((x?tǝ>hj٥˪#KKXA!YF#k|MI7dASng|a|UtUCTgdfENRRbώ];4[T*!\tsۗ]rfb#{jGjTU5UG=w~>K='Ysm�zuU[R/بѼy
    6+[:ٴ7*24'}oa
    y1inom�<i aZ	QI^#]k]AփM{xuu.5>ē[5<֔WK٩?l푻j'Win5<�SVuiij#mX_v	A%?r+\v"n xk]5Fܗ6J0ٮ[z=}鏩keJbٲQc銓&X#$mvvo6Tk2v
    ^M\r,�ܧ'".*"I^
    O~/(0mɮےG۵tL%-^VʮW.X}2�RiI.de�J&?+~}/srM78zg?2y P�+p'ϯ/ž�Zq:Fv.oο[[v%{]˳>Ɋ}Wc+j2F2~7o+6湋p͔^,PP,B,Bāf7�qjbtPXVAbp=WJ,n7rozžHWub7{oK=Hatl*(VRAS"SM<qG)oܣxm�TsAK[Hh+N
    72]gJF:ZehI4@<7[[nl~݁Y-8>4\UVuoteX#\0
    <"=.7-ԃ:qZQH�簐H8qnñ#Rz�Fz+滟p|c1#g8x]dňsf"SR$x詤&Y^d~^{e{?HiD*fVh+N�gg-Ź\>[Z5S)N5��k/Lס:)5[b~||$OKwvNol۽VɎ5ym;bm/j1U'9
    dd+߂q"$Ucµ>'qZ-#<Wid;VK2}KSz{w(0gnvsGOv,RZr-ƥJd1UQS"ِ8j#+OpVF1ѱͽysoO >7.�ܛc4DA'nФt31+ieh#=6F T$feI< uO}5;|33.|ݵ&IӿTqJ5F#cB9E,B1GPw_a|`g;#j6k2ĕ]-Z}dCKD!W:ޯG[#ڵXUB6. Y^vzvkjiPHybrHjӉN= }e:x.l|J7SvS/c]?^6ߣ4QfT8-S_Ipjts[AJEV
    uW4iƤPZ&&t;6�y�{Iթ\ӸqpnoTY)s|ŒS2`YchY\qֵTӻrhfqb*_p=Rs#LJyM#n-r=EVE8#RA1}S?j+{쪪LnnA=E=a筯e!Nd%QT֫*I]5݇*Ej\%VӴQU\8%A~\طqD^=Ċ};X50:m\o>ֹˤ[toI0tO^ceRc+.uaiUP*jf:tGcHdU*ՠh
    >LEi^=;tɱ1]ga304
    08dT>w?e|iᖦ$fX&6VVaMH dypQC@N2X?�ƽLquus׃-?_׽Ǵ׮uz5놮/o~zsN}?uu'�ƽ뭓Zu'�ƽuĵ}֝nzo{ו�6�y�{Z'guk~=
    kdZmϿi1A~>�?>Z]{Uީ׫]'k�׿պ�y�{֎u�ƽ3^Z:_�ƽ>:;C
    ܯ`ϟW?_'_	z8V#8=gH6L~=;w^ggj�n筆˾S{G,I;Vxώ"}K4G\gT|g=[~m*1:GJ&czB>+;/)nm=ɾkmIlub%f=E}}sԹUSj#榆gΆHEO0t[C!")o:;<|vw_wOnw]hgAK~m~[&=rՁ4yT]gez^?8~wS�j_jm_7t֟}v7W`wV-e5{mm,|B<RTI*^nwr_^ !sS֬`-"QOԟR|J�c6AԸm=i7/:R>X�gCoA}gU]KTPD\L}�7J4ķ?5%3Ncў{<׼??z)#[#ٻC+>ߛ3jmy쎦[7^|0}MT5u_ĵE4tOLuz)2?vL{s|Ɏ-K2z'[U|{la"٘$!vO^CmaobI5Y5
    �H�!BrjĒcYO*ErH`P�znދ_!
    8_co&?pmߛknסٛj~Im
    )+1
    yruՔ<|?1.+г�i�^d^	?O�]_.fo׽ku�f{ٚ�d�9٘�G_�2G ??��wݵ6GmiϯS<zwNw\}g}x=>=&Л'wP$ŕdr"pcjzZzwj/L;e`q<^tc7>o[%~֖'_S[fw"Ij⡨:j
    pxjEx*L!jj"	%heCK$R#Atg(WxUHeb:�v?Ʈ~ѭ]Cd+6_iG)2L]w1k0[vZim'h#uff%m[UʕnH$L.6oonWBkx²UU�1Vj�:G?=ٵI{}7V#bm>9l7Ew.-7ݍ}ױzrtFI2=[+k%(v?`O.@�xl[OkM:Z=cwBl?=W95l}F?? L:
    ,3IuA`X$a p`�,?^|:EuԖq޽~׼3=I8_qt���ƽZE;q|rͩN{i+YuoYo}vn;7bK%^_xgn?	[_Y-=
    <
    eԨ)Zq'8>]k^g�i�^Tp~}=͊Oý[#){_Pn^Ʀ*}8W0],;ӼO-D45RUa全k@0J:ihNjHk南dw}kXn/?.3%/c6P6	Ism?�dZ4Az�y�{~&x
    ןN�{zu?>om|ѽSԽ#ubv&-t_}on޲ۃ~m{w/Mtvė#ջJa1~Zzy*TR*OOïpF�'ƽ^]{OϠhtn.?Z,^Nys$;î<	y*
    hQT<0ULJn!kJPWG$GT
    
    EApAˮkz3x`zlôY.m6;peL)\F&h6%$g!Z"Em6)h?PQ=WMI'loZr퐶k~4o
    I:@Z(h�fwɿN'sݿ$-�{q?�!S~}~&ҵДϤ'�e_}x
    b�Rv7o~.|o0mͺ:~!|YZaOYSFX
    ):6O׶OVE6DwnGOۗ~igؿXvYl߻{	{bd^-n*jL6?#	icY.QJBѯ}=?_�OmWߧuv/lv΢{8`_m8=]ᒩ)YPŦwE"^2nrtۋ[p/j3,4SG
    !
    Z
    ,Zbk�i�y�{kuJdƟ;5z׏A?BwN}1ecޝO]ŴEgv~zhw'%Rgi1Y:uyP	R2$~ν
    ])R6Ӽk}~q�h_[U/q|GH^}y]ccvW5v[/ڵY>
    LU76[~Z1̆JG
    -<mf
    5}i+à7Ϗ!j;/U;z]񗿾8|^_mMױORun'?;b0~U˶Tii"*:fJT??"x#F*Zi)jZx7jï9YC+{(hiQ}F>]U[Ae}Gϩ�}UGuh�z<~�%3NN׾N�}W˭Rϣ6{+qoNM;+gg[{{7YnN&Gy}ߞc%e}dP%@ubDԪ)Zq$S�Rr8ǪNOF�qJu`(kMНѶ~CoL|X3fSqm,flvݟ޸GfTLVn(⦭]cTFQ6⤏َZ>e=Ȏ۝}uIvo~uso
    0SC-=%RqThaOlkVqSGfn:W%vQ6OȄC&TWUt
    ~o׽tOϯ	-5״~~z
    Nk�y�{zmpiX_wK)PnMh�TwN^̧;+cly)v/da2ѥ-]J3u{ŷo6g,WZd`H! r3\y%yỡDeWXH9� i/lNo;dS
    F{ᬥaJ:mM4VH!ַ-2NLR$J/	>Ñzr%+y2,+H(
    (:񫲶q|unꭻ}g۽;ֽ6jc>;
    bh󴘼IZյ&v\)ZتU<NzW۽=]sVf<I'(5�y�{oHϧ]GkV_.fz~�x�zS=kG^#u{-4]יwXV#^֝Wݑ;
    r9>Jw#&/kmyՒH-܁FOՑ: 6[4i{_M$Q	~aёa)wzTCջKkn(w7`4]og(cjZIx1ut
    �pSJ
    	¤aU;1VKwgciamY3;3P
    gc@cEE!u,ocu[>6#{Puvx
    nnj$RⱸuyxjhL
    (QK$YgqZRrEINZiP�]	FN�{oW˫׌�?wkߵ|=ɯ4zzy/U:\+go24\_Ҳa=4��=4}sc62\a!HM%G-W-^W#IR4uʊ̍tQ"EgZJ^MQҌu^nmni`"8=_$C<2ӮS$hʌꢹ7o֙ң=$X5su#'Vm84SBmlГ&&UT5$*'ݟpq>#Z%4tTTRQ5-%,qR4D0TPT�['WOY~O5S=w�i�y�{ju͝ܘ͵1zhbIAWqԴMvF#]HDY:u.4VSf)ኡY3{pm"ExUtf�JL1e`=T-1^]qӶrt1|Au)Z1#jc-ϷmO.A]rI�!Ms~dlGԟjp"Hsэ1;I(8TtMKiDQ"$rŘ$BıXgT]3t%&߭۴A2K6YRML(j
    çq/$�k߸^��ƽ{OϮ&K�g5:5��ƽT-�y�{4ǻ�'ƽcuŴ��ƽVF:3^^ϯS=qku|^kߵ|^kރVq2\Oӟk}]<]ymƟ׿j:+}??u&Zi׌�{jfxc=x�&zte׿)״^`M�ƽ_:$u~_�{֯[q{�׿ᎷZuђ�y�{޾8ck�k޵Tp_ד?^պ<=pj�?VPO��}�:\:&�7�)";o#o]*�z߻]d7g>xYzo`:w",FIs�2z;BpF|vN\-${7"S&xN�V:aSQO?}n7G?k_Bs{,?/4:?/7ĭ�3n-;}͋%<Gjm87#XFPrN|OR:_wɾꌖloRT]]#^v/>1TU&�vf[r+OTKIIPyXLWk~Ü_c)7OVVρtxn\�.t6}6ZghmYڳf)Ǔ]δIsָtZ�fu7Ȏ�K8Y~5ٻuvf-Ϛfqq[s͞v.ҧʹJ4<]E~HSV�!{ ,�Ou`G�}칡=x>3�}94Ԩ?~}rnslw[A[=E7O.㷤{d`W6{6ާ7'L)E.\ط#K@i�6zZ_sUu>srlͽO[`7]m__o۝-յ36`vXogSSmUOŵxmN*
    ~PWz<}|	?>�6e}ٝ0n||M+�'ꟓeoӴp]s>;~oH;Ƕ}\0{ƬtFx-Σz\Lu=_;6vvq>D^|u>yA[_#JOt1^v6_58M(q)\q1Z^י�?_iu;�E�l�?o4_~�1w{ПC[2_r{ċFŸŎ<:E;{
    ޞ]a:ž'拽�.kw6<lw8=Ohq{6?=.*<cfQ0[=`<(H^~]?U7ͩ;7]~)|eᅯ]=W6�]M'{wᩧl&sf,~VyOHST+WS<1�GT6GμvWㇹ:?tظm�ywoxŞyi]W^,|{)Bcӂ…)\WVO/E^ǏCg=wq>>/tSe>w|W~Rvrn=нSOxg_7:Ⳳ3!Pf(h(wvܫLk4?3J
    ?a_KM|>M	]jl/{ݛg>mk~j~CvpY,/}Ʀ!ubDkE3Lp4Yg/c!K7mc:I#3̼o^GoOY|۟z-5rcޜa.M
    /zYJ/npA4=jk'&0?cv~lYlBNodW�7\vڎ9>Lu7]er/zm䣯ڧE.ޜsT'"mHE}_WIdooXv<];2{k36?b>'a!m.#odܨ,"*)YHj�?^9<zO
    {x#{˳?މ(Oɿ՛?`��cWzZ]CE6b67Qz/X6s >9n-ݿGwğۯC*ˌBNb|0# )]5=�xo]sGܽ񛶺u7ퟌ]+ףퟍ=:ns7vWaؽ)mONz
    Ѽrn,!(p?MM^dS�j]?S]%ϵq7<7_�v3\tjn̏b΅\d;s{S�\`NMFN=)HQT._^4ݺnEݝ732/߃࿻%ɏ,5=_:'˻e}(r2C7F?[O.+˫b3E��>	ߞWߵz
    {7ȯ[jv.scuh|1ns=c9qnZ_}-ܽ?{~|lIy=\$;Ȕ2F
    ՃQ�p<iLWI>
    ?
    {dz7&믒8폌;lc]ֽl|i>lճsLSo}(*sn㗣ߌdЁdS�@k1M';?ƍ屸Ae�۶>c�,拥Ovd{Nt/j>�!ۛaٜ5+J+˨թǷ2<*1 z`^4ۻ7nEݝ70w'?[g�LrϺ_m3|,_'˧҇#$[̒y0(Fo~ږSec_
    �e;�h�o`�f_�1O5>��rY-�q�k�._w�gJxkI&??>7wwůbt?DLY{Osy_�ntw>2ϻTKVG
    Gwv#iX|�M~[>S>ʗ6faݗPl_!:؟~o.۽OvZn<NBxmښ?Uaڅ]Ep+7GҮX窼]67Ml>6g:sl͏guoZn[?ovGv}۾y׿tQNm4|c5rVBt,Њd\g�uPF'޺n_X|/`w~f|V齭ݙ7�~m'#OnM{ctl*=Őu)MN^igFDY>#U'8-AFH8~.n_%׳>ඦ=~?Gu/?��i--�9Jw}Qj&[dpzdw|n}DdMV�6ANZRr٭OUA_K_]3tN2.6Y|P�*~)V?w#?sMߛ/ŵ:?~=#
    uM73omJ/Gri%[#<2A'=X%kկ~eam7S|P֛�n�f?om;kn/|C)�
    ⧃hi'Y#erw4Φ\hNrVm 
    ;}"L+�նtt7_+ǯi=xNj/c�gd=/)|ίݗ=e|P{C=9Mn
    [nl-$TJ&E�P
    tSǝ<t4g5Y>{_Ǒ]�Qt_s٘�7u[I?q쭓{ãAty
    i667oR`6:TR+C&WRZzqrOMцhi1a�O<�}YV˭A^F}?+ڍzߟUf՟9{=_>%u.8n}{3:onM5{糱Ƿv-.;ve^[hl]Lyj<^B<}BxV++"^>ǪGV?#:Gzv�dk
    />o}
    㬻/757SW!ֽWwf?#d8.)kx#HժuKA�ȥ@4Q}}!~.�-?A};v7Xl_M�)z^|{aǍ[í?voXv<
    ՒuvxrNQn[fˤV%Bp+h#I SνS37pF}a+~:o_?٣J_=[bS1nIMNjLfO:YvUhAc@z0N?,أ6뾌鞿޹[gnź{#ۛ=3٭m^22Yjv5Q#Iy4E23(K*yT쩧N+Z?_t$6\L,l96�5+Fs%[=`|njsn7QYGV{CfgwD+II&[-%Dj2X	kS:
    "Tͳz]�?g۟YߑxmoC_KgWѾ7/]\N窩T;mySV44"PT/uIcWTp?*|t_ivR6ޛ^4oz�(HvnMӵٵ>_Oc0v;ؐ`zvgocteSR(󐌃#e&c4ZBʚ)**Gv?+^Gݿ:s׺Pu{iw\g_VŸgU^fs5op6ٯ3n
    h7\òSNHvlPԓ|5jZ4"�P�W][/c�QǯyYߵNz͇�y=Y^<zh�+?~~]=�ouM~'N+URϘ'V,_,Ɗ
    ]Ñ;xʣ;o0eL>fEQ
    hNU’€g"J($E67s|A?;7Ymo_Mu/;})p±I#>
    L8Qmc OtJx7
    y/=.'=ӟ':�eOv�Eeo,OoKS~,]!{|wA=Q9Tdəjiy:J/5 e݃M4y7)9?oW+o?*uّ�y�c՛Ӡc],9??dt+?dzc2o��=7?OwhMc6FJJFJ,>V	k(̤\"PdU:ȣDOxF~5%fmŁuj
    6b3^έ[+NfJW!OG=,-v66L~:ݱxmYY2u{nn팆ةsn
    J:|3ǭY8xq󴱹'm| _QOԟqۃOG,iM"::ס_Iz񕁵+]l
    ܻj<=$3WR)2bei4t5TuxGT|֍ܻ~ԴWly7W)&
    #Nˎ|F;
    _L*oEj*|3؞ܔ{s婆s}Sd:-.y꜖B)T
    ZZy|pTTON~ ǧ[C6N$pSm|"MQ'32MCaIW)Y1VHGC@?|M9j]ю2cQ?=QN:L?NbV]וQmxaE[
    VȫZ2cW/^lumڽ0G_޷5(͚f^sfF|Br'yeiϯt?j=ky?_zz][+ŏ[-3�?_zOLW̬?+Z=x/c�h:׌�ǭ(f&_+ō:8љx?�}ӯy7_+}x={Ts+]yX�y�iǧ^e�l^_>5+Uc8fWމ+Z_+g&z}{ֵ�^]	ߑeWߏ^=up~+z~V'9�_+^xZYx:=qa�Zz,T/f
    >ޝN=|?bγ/W	z2MnawV_vB
    Ϻ�!ݼNS<q^m]/VRS~] v<i/݀<X?}z)�3P�b~'SJ_�7YP
    Ewi}��W$R�7Txv/fvè?�?~s�(R#Q?߫GR�/Pw�b~[B״?Wu[�Ǘڿ(?�/~s�(R�7^*iQٝo;�?~ʡ52-~׿ҕ7ڟ(8RG/Q)/}�
    �r�گBx�E7?/QߋG^/Wb.�Oށ,�you)_?׏h�ڟ(;�?z/h�?]
    _WQh�Oߵ\Ó֨*Fx�Gn_}h�?]ѥH7�?~u�(R�U?O
    _;S�Ef�'Ax}'kJyJ�ҍ)�3Gٿ{7'!ըq�J�3?Qm��-ִUh�?^�J4`Կ"N�O޿Oרh�?]�
    o;S�Eg'D/h�?]
    _;S�Ef�&=c??߫GR�3�Rvo�b~KEn~iOfvN�Oީp?,'Oҍ(�7�Rvo�b~KuGgo\,WOy}�͇W|mu�j|%^ƟI-|طiV$=)ӿQ<�KٿE_?_Fxҿ"^�O޴qYO^ңh�?]Хc�)/f�'`N1~{F1/f�&}苏D�?h�?^�I^�Oީ?׻iOh�?^�J4OoiLVu](?J?
    /�2\,'~~�I_){7�?~zǴ)ݣ�ZOOOר?h�?]
    OG�E/f)'_7_?׿҅'ݣ�?Z\,/h�?]
    OG�E/f)n?Oרƿ
    _G�E/f)T�Y?a_~)?�اRQE�~/H?vg�bKEzc_?G�?u7f)Թ�WcZ~�ߟ?K̦=#?J�ƿ
    1�0h�=苂k^\~~�In�Sߊ�~�/ݗ�اi>�a54:̾�uF?[1EmŶ6~/a~�sLe׭.p9J�*ׯ`k_=A'?){/�_m�g{ƿ?ݗ�دi~~�ݗ�د�w{ƿg�!z��;νO;C�E?e�+Z.?�g^~zO�C?Sv_�b�g^]Ϥ�C�S_�bGרO;?�E?e�+Zn?�g^1_>y�O։��g^u~}{'�!�)/�_z?׏hQ�!�)+�_~?g[ �Jv}W�bGoׅ?uNM�ߧߊNi.߳�}���*Go֎~1G/;?�>v_o(uA>�Iv�WߊOo=F~GR�W޼9Mb{(Rog}Û߳'�I[*;+�_z�|7[uG�<g}Dا:1w?;+�_zZxu�ߣ�ߩ}›{:'R#*{+�_{[!׿}=�WތSq[cuG�<g}Ûxӎ_:y�S?7/�=�طxsBX?tݛʏtm]˶C�.ɩ?}n>5&[P9u~!ҳ!4u
    wf5~/Y2xgǯk/oyK,NSOJBc_>y.�S?{kÜE!׿}]�柤/�0O3]�ذ
    }uG~6f�ߪŽ›z׮�u]�`={{:2�'�_~�}~}lS_6y>�U?{юc�/zvu}�G�*"#ֻG]͢	g�ʯxSp�?[�]//�E_d+ת{'Q'ه�)_d+^ת׿u}?G�bM?o{'Q'ٟ*#�_~�}׻u}�?
    o]{uO}Vv?�bb^ٔ'f�WބS#GE2v{:�'+;�ozM?lS?6y>�Y�{يc�/Cׯ3�Egc�-ցóhGjv_Ž/~Q_2Ƿˏck:&;/�Egc-^Q�lS96_�_ߌ3U?�?^Aku{/�Egc/F�?.;2yN�Yтoczp={&)+{�o~g�}�1~hG�S?�?^t{6�+_+;�uf?^�IW�_)|L�WVv7�bMc#(E�߫+;�{&gxzoW�]z&~~^=wh??v7�bK8G:u?x�[71~Q@8O�[ތ(?h�?^.t%G'vۖf*8u`_*{�E�o�Wf�W;?I>%{s;Xų�%?�_}\9{ϴ_vںŏ'اut+~~+r33
    [mmv>;Wwҳ7vvV4)IQ}4~De66'+LLtǚf.^ݒq'ipq<t[Xjrp,ePCףkҽeasJ]᰻G2m$0l^ٻ۪A7^dUSeik*buI)~o.wG*[^ZtK"VxֱX59Ó"@xT2�o>_4|þPu}?>0lb43�,e��gw>2l
    ytpwcHIȍ̻os@Jk&3"_xq<p_ϧsg]:#={|+sh#6?Fv[oMu~o<m8j)fnkĬwql&sE7O+<=-}SS\�!gv�jݗJ]ٛ簷p|L㮾[}85~]Nԙ|SU:G?>V�
    H6%WezG_
    M~_>:�_LuN./tf`1AHl�>їv7>]w�|!ߛﺪ>CR_ٟ�n߽I]bS[JbI䯊0<^C={g~I6+~;m8K;/ytgzz~W[*<b}u/_K2*
    +8Cjs	3]I˻{V]2[c6vg{6_'g1X9cJExqZ8V_%IߤOԻp|g?3cgآ|
    \OW|1<	pٚsu<fS.n9ԙ_%p?=]잌6zﵨƝcqӱs9
    krAʚ߈*}~N垀MҾVw'{K>'_875{_rub|_?]rn*۫e|퍿دKOU_xWf&fGLw+~t_I}MO؎n뮤Zꝅ6n7z`+wߝ՛E.opϯi4|l'Sa~R|ڿ#z;hߏ#9N�B_[~ޒl)f7c>>yn<6*⮭ 
    ֜z֘ھG|u'ޝc~|X�|'ywSo>gn3Q)栊RU	״\tRA]޽ӻoUUtRwVx�	Cl=ԛ
    ;	yX-O6an֭Tc	5~2.:ޜtJtm~8-mⲝ
    �q{o~}15
    .z|V*")~u'oks-i;avn
    1�^:~m]?:^{~US`U2tO⚖wU OE%/v,h{zo^[Ot|iG+gwmw۷״mH*:1\}'QJO�>�e݇z~b~Gwvw}N1Uapm믈տz-r8;pR^/myِdS"~ϭt-+/[z~Ŷ7gكMQ?˗.ڻKkLOzZL>Z|VM^)=��/̎Tk߿9zפ
    _iqym]I�]Ѽ7FL'iuOkv`PR`p'!^'Q*G(=x?.S?
    ϊ΅?~|oU=oç!;gu7ޘ6nbosA]!]>5 RΝz}Xw^k
    O;냮{|a?e6荿lpo:km׻%scxvIqՔYA*<u>L?9YaU|uu^=_�l޷&-ݥ&66Φ쾨^Qghq:lްq^>zGG_rMޙ)k?k}Uc_EvYڽo154;wnj:v墮ic*
    zy�Qo]C~ewN{f_%/Ew߿3~0|><xv}?T|ۧ_M[o%30*d1xӯPt8F/ߝe0#7`?g[iFK}`6q]A4zE,RӭӢ}j.[./]3ySxΝGWĞ�*ߋu([5i,vO>9-mqh€zQO:֟Qгa=16Ŝ4@ཋc~b�/{SE[N_&fɐuU8J5zf+ 98��.~5�0Or}!;:1Gbo}?M3C;MVTb&kcW3K3f^iTg~@�Y_/�y:|o[^�=ο.?OSތ1ׂӮ-7Ž_zG׍BS޼u>i{ζ�ǽ~޽<:Ο[:?N}Ξ3q3?k߼t#$Wi9:?�{z˜t[k޼uiz	:ο�{W-5:ӈMxSݽ''yכ�^:WN12S޼uANfO۟zze?؏ѝ>Bx'81_ioN[ƍ�ޯ:֘l^eO~GQּs?<9oyύ�ߏ;otc:b|N�dm#ꪗWd7==2Sx*2ko.
    ķ?oUt?ϳ_W?�/ħS |ZtUq7ۏy
    Cz6JWVfLc?|]Luo
    ,q�쩯?.	:pOO?ghoHV?bb;Vn;}7�];aFߴ_!EJI@ƪ#IaUfZ�3on|:l߄�#6q$1
    '_{#fqSٛ6x\h-Ź嬤p}YGƉ1A'aNܞow6ݝc6%ɰw3);�:L}*Ƞ!i3 pxuj7Maafm�}қ+b[v]Yސ']ژΡav[ftM͹GrY=]=N#CECOYU,
    6R7_nG#'9EVm{L;mtY;{{HIuu4<@,ndz٤_Nfb&KZ�I4f7M�)7_Ju߽Kh~oٸ͛6.'r>>W|r۽/{
    :YM2ge!97ݯw?o!=mkimi&~vXD\Tjng!igei۳rT`"1Ϭ/yJcXOݸ<`�>Waso?\_muxTw7g1sͣ2ekrW.}6ܱ||rg,aoZm:;uٌCmry,Wl'i'!rZcEͻ+:ߣ;+rwNܹJl6ݿMws>ڨޕo0[f퍙7Qe2YJj<+.9E0s6-ͷ0[!l;Vcͻ5-w[vmVvS\ZnN]5[ٴO2a-@;Hijpƥ0ۡ?Oh<o~>H|Ubn{J.l<vMQO؍[njLr9)v]&ܣrW.=>luw
    w;w?:7k{Y+mr}K{\mM\>pge3.f]K>-%cnv3"0�Ǹ{6?Ym?__6]v鯏:!6_L^.
    GqX?5/$�Ki.zݹc}]9mR{|l{n<X/7+J�I
    	Z仵k}xE-˫J@#GEav*M
    whۿγ.ӷx=cy-ۿ$.l~.yxp~<g϶sTNj;ݿәksyx]瘶N[ݢۧ.}[gܬ==t{-/c9D
    9;-k<P4їGotZƤ^o'ͽsSeWlTc|{;u{W8,.lΐw>nYk'b(h`㬪w
    /`Kqy?s6~ENrmwo&4wvۈ)#iEx HI.[ݣ٬Klfb.KVTLh*?^/Xf;wzn]574[mu;JR;>-2MGӪVǾuo}j/-]{=nof[mzG|Yg.MrJZ7﷖w7vk9w-e˧ZyHh_ʟr=uO8>OQ^T�T?=o姮~K�~)FD?Ou_ϭ}:/ս>"_�n
    #N'>�=1A$|z�=h?[
    Eq׼ �{1]yWz3=zczϭu$wC�{=uO_A'#q?ϭ"Fp?o[ˮ?Oz7^ZӞRq'ǽxC~H�sތ;["z}kϮ88a֟-6�{?T]k__y�{׎?�_
    p1FD�{>_ג?_,Cut�U_߼�>C?~P}lcjP�[I/^8xkߨ>�C�Pսש:�`xqˮ:W߿x}oP?ϯgӮ׎?~޷O*Fp=/-ݳ?cvC<_Rm[q츻u:ڵ&*;WTS+v3l]b9[h44i�0$Ԩ즄wͽ;zvgb|/o_oM�{qힱ[x||>ۿ-6wb|WO윕^mEU=6F*<}nMWHDLs%MB
    V*u<@`ySZ>:2_%~OJm-S%fGvK`mo8N===+knNl]ܻ:lSA^،D59gpᘀE+ 2-4 LꦐZIjpt1qN�ʽT?|߿?6dvz_|t}ܹ=-37F~gںͻŬ}Nm
    ]Adz	q,%vE$
    4$kϊBTZܠ`NƾX9f]IDg??hOug@W#%T׫ ើG1o[:�뙿'?7�ʵo:/m|حG�^[ϴ|2wi~�[{v^v'6NvUwR˵B]5ͰTyo,8]һ(uIAg<ŋv)x.ZR4#NuCT($(y$X*OL==::nW]&sqovnJmœ*.Xe~UCgR5}CP0ҥQKs;lV6\4ӱgXRuR5w%5jPpOB`?̇d?T=GNx^D1K
    ݟmTwO;
    Ogw6=ّ㶟Sjh^֚RlF~}�dhjBfb`%T!LXm{cxߒ{sN".߹Hj
    OFE5SOKI$:i^w׆1Sӝ?=Aݝ͹_~1U=Gո	{a,nr%6{	GG/r@kNcU�
    :)'yմ;+>Vѽd|hםE6]{O~m,qfX֎C5,>7q^zq~"{3Y]G{'vQ|i]:ϲ'jGh-v{J̾άW<**�$c\xo}0k[Fٻ|Tg>0Wo$_b;kvMo}i{Sw.é}̓xQTT6H^tV3joFwylm]ߴwV36Qǀb*jZ:Oj?o^G>0tOnmǽ66Komц͐錿cm�~veearvTTb_Tc璉)#ju�.QO[kzgٶ~#~I+
    }U{w:⋩>Ü|=]]E.27G_Z\6t?Ǯ-&莰,fv/p?6>A{~|2!g]
    XdvL۵T^Չ꯯׼/:~l{Nn|{i�{7ߛ1	ݯe[Gp{ޚl**x=í+^_w,_sc�e�d>�Eܟ�ݿĿ�w}~_vCUk׼3z{|}lyչ�e9nuw,^~Mwds?2{CTɯ@x=ozAe|UGK(_aþ/�)Clϖ=ɻ6rwSfv#X2zLb)'Ux
    (Qʇ]?
    v^
    uA);6Mٿ#~Ivo|~ؘozn-՟u<ՕB*Zܝ5oTS/xoOۿ>ҭڻ/+$77Bnz\˞Ȋz=ۇ;RfWUbGAOK1ĺ<?^އn^87}{A[5{vFgXtFq=vlxuwM
    ޣ'Q@Q'g>G~E6a}_gh|%:+wgiVO[.ڔtۃ{ruuu`?vFk[CchNٱ]}+ѻ?tT|r؟=r1�鞐oL?]SWS=ZՈ�Q^+F݅p`q[;6_+C:7XJmdݮx<IYoUZrZIڟ~>w.|m\rN]ڝYsy.;y^{M'|+rf`7VGT5�W׊|Oݻ;/bܹޝs3p۷2[oӽL+vG홸6ǽ6ڙͻI]cz\
    ,=�]#%w{o	fߘduYf�!׿3#v[oi(WU[+`u=Nn;3;~3˺vݏ7C)<o??R=Wf{~}ёnͯnl\]�c\z>}Wkݸ]KMfo37l?[SjtNn7Il=_65m&X\6~٢- ãP7ҕ_^є:u!Z*3y}`7HwUZ}ɵD}Qu	Yee=#OSU,ۜνλKybvcn=۝ߝ;=\uOegf={CչnNRzټcPiJyP^<us>njpf.e6Wh^>݇=}֙{ot־cQ#
    Jﯫjꨭ)y#Q|}7Uض{=_\<ۣv,{fb2%sӿ3y
    rS^sqUf
    ISMrXQau=/:elN龲Ŷߩv>۟Ų{!e`qT}mUM\=sK$jbFz֏u]1�Oxu.a?�SG״}{}|��hG>n8u৯:'M|ޟ\NY?GWލŸNu_qzy�a~=_^ud�W�㯨z~޻,�~3ZӞq,q�.T3�O?~fqŖ߮/�}z_/�^(u3_Ŕ?:U}՞}<^r~do!�O!ִ_œ:G�}Sg+^0ϭ'u�𚆸T:H�u>FGuww|vlX>KӾ*݋g�v6Bj_C~Z<dktHiOZV#>-,GLEsn{+wSvn+3}nmx=ۗ#=>_rd*hQZVJdiK~<2)JJSZu\z{flNDv]vKktoi7"on{~#CMEQ,%44RGM澕՛cNBzBAU7YtNC$돎GY�K}͓_o-o	]1&`fBUWU^*Z7M𜳿51Rp?//ׄK@)ݑz[:뎦؛Gnl[ja?ܯ*Ǯid9f.cSmigt|M:n
    =K[+ۿz>
    AY[O:|[=~9Kx;77|6[}4W1m|\$Oi55Gb
    d+yUF3'QṀ#A=swplϑvo>΃#sVn%K{o.zWvfbm3!Sr:;V!^=ݹ/hamnٛir#rܭ6gh7�k7{hmĿB ؛u 㹒+#$wH4i|#b_OAQ6n[?:�8̞[De7{|nJ/읗ܻ#Qn*{k1Tov-~fpbnd#yأlܬ#ookomq-V͸Z-w-O)QER"F" 1:M'=u_Wa:G)ꪽ�˲qrn̗L7sfEdo
    *,K#MǎRwu4n;%m[oWR_ox~Y十w+mP]=ōۋ^Wܙmvb@cPO-$ED30Dҳ[ɔ뾅܇r.f7R$ᅨvfwmno_{?wefm0w1]8LpS,>Ysgks\|%,Nq9Ynߙz~Qm7uk
    KLdyj7V롒XYKzuԗUҬMtPIzߣ�XIoꏎ,:wLWd;[}'knۥ)7jfz|^J#$jɪ%Nm=�r`y7v^`mݶt-nv۷1%BÆ8Q[TYٛcΎZj&*I&n{wVS~adFJ~l{_eg]wz�=*?ğ6.kby0XK>2}3E^MOj+*Y{{p6vs)&x/9}7 w)-fWF-˷5yjL%LkxHQtH~R!Qc�ؘ>ja;[-=/zﰻN=�kNuY>jqu3=TiC.>Λ7G9o
    p7G,vk6˝vKInl湆8JhNh FE)6meK. T�o�w8H�P}�?A�[?d=�wE�U�_;_=�j�i}W�oogW3Q?_37'B|H�37C:֞R?L�׈}::D�~>]n.)�vGIr^?,׉?>Q?_?_z2bPH/(�}X=uM?_~2�)NC_#7�%�NC(,`xcI]cs%|ޓ)t^_g�~H�?}XAOϮtz=3u4�~?#O�cӯ':E�%�P:uJ>r.�~u'׿G�"��~|֟J?LOk(:^$k^$I#?�ֿ[~]trhL�{C[Ϯ'\0}^xugOGދ_ėZ{C_ē\4{־NI?G^u9?ڏsZuC"��c޵ӯSׯOQ�c^1�~|ȧ�z/Z 9�UCרk^ �c%�{A?yu'[|M}fóRmۻ~uCp횹)j7gZn]p[GEOOQCXTA+NHEA"Zyc#=iR Ӡ|7?��]zo{_�/_o-?񌷗ڟ}W9Oٟq/&MZ
    +|SI zz6pvڸg{}c+嫿}ws7}DjfZfuZ R$`)SN<n=[3X}O:	�pwFz 0;o8}QqU
    h6eŻp;3qZ\
    lūe$v|5$
    `
    q<="7!oA` �֟/>ٸʁO>=|b�γ'_	z5�𘾓]!?�ߏ�?ڽa�|�Ͻ%9�?}m[Aq{KGӏ^gXwf^gj${�J_�n|e�_{n��]�G~�|׼W.?B�^�ҮW�ۧ޿wY?+��؟zvn+'o}�^;s�OiaL�wY?+�Coam]˾v^wg[sj=19ùw.w#X9kj'WTVa_O?vfI~G'>ڤ۟~뮽2/;*mZM>=6eN]%F'.�wY?+�^ͫƓxGKm}I;�/]{.;pe);Sw_w4;:|zmʝJ>N*_~�|׼Y?u;~nI>Gu#>ڤ~뮽2/;*mZM>=6eN]%F'/wY?+�J_	Eziv3pl]ž9v
    ?ǵ7uWR|[٭m1/dpYj*JYi}?i�?^_Žw.[^{37ݟ1LͫT7ܻ14xb(檭*jZhY]QYwY?,ٻW&jwm�0_\vRvؿ'PlO䩶vui7|5;w3Ot|Te�xu_f_';|r<6tjnꞥ[}nab_tsU0u~~v|R[r~;/owf;?ɝvۘۗp;Ə,EUSEMKM++0/G�x@\cfm^4{w\bz[oOݷ~'qۃ)IڛbC}?դlT<TaqRm~~](:3a|'몿Ovqvxl>/]Ksuwf_ݷ4ľ-e*da/{œg/[j]/g콓gvo>cۛWi]n˹wch8-QU[[U4TԴ<~�qO't�`).h.sv�xO̭ϵ_jplvI[|LТdiԩSzjY/G�xJ뿇�"?o�s��N~/uٗ?}O5|e�xC�$	��JW�n~e�x@�{C]i|M
    տ#�3~Pb'Pᄉ؛[{+_6/5[ƊMUlxī/{œo_ޚn]+$aa1o]MUԿ!7Wvkuyz,>LKZjVF_~�|׼W�Ckam]˾헲v^wg;sj=19ùw.w#X9kj'WTVaݶ_?i�?^_ٛWjwm�0_\vRvؿ'PlOivui7|5;w3Ot|Te�xO|u_f_';|r<6tjnꮥ[}nab_tsU0m׼W/t0nϊ?ܻ}n^{'e;v|36ڻsS;rx0[hiyeuEfc�(�/ڽi7t]T#oO]uײR7~?{`#MIǦ٬۹x+G�x_q_{;xoqm϶>Gven'jnwFggVwϏMYSs4WIQKݶ??i�?^_҃o_ޚn]+$aa1o]MUԿ!7Wvkuyz,>LKZjVF_~�qO�U�O?ww3�oh~M#�ū>׏_߿v�8{�F^�[�G~�qO�׿%OU*t{G{?=ݘ*_TM~@ۘ̍V[*=oݾKlT9X1T.KG�x](?%?U*t{F{*ߕ_=e~uIzwwoʯQ�?^_/�>-WctN{%ٝ˘Ak?Q�v
    QKNOvX�0,YbWn&pO紶<NuE_Zg{]_%d.
    RdkwE5Qa�(�׼Y?V�v܎Wm 6Wݗڿ6{vVIX?O\Vn\VBZ%La�(�׼Y?Do;ubwZfeͳW>:]]S8꽙B'xé;C4_9Q-
    r{e/�?^d.�dd�DK??Z���~�߳ǿw~�e,҃`_'xvgݡ-6;�龧mZ}{=s;um"|ghsm1xǁ#ݖ{œ;�t*ߕ_=e/�?^d.�ϋ]UngrfIJ_|qTxݡACөēݖ{ƓPw'M6,vvKn}nپqgs-X]ͿR
    ertEQYKa�(�׼i?N�SݿU*t{F_~I]{N�SݿU*t{F_~I]';jw'fM6vlc|{Wvm]ǎm˶k1ݿVCUE[K4TҤ;#+~�e4׷g;j]'f콓gvo>c|ۛWi]n˹wch-QU[[U4TԴ<~�e4:HNvٽ[XO
    ݛG;qv#pb?=GRRS4Mr+ F_~I]t�ҭU�ۣ߿u2�?O	~+MS	_io=ٴ{jlMxmםU=C�ߺLC$M+1׷�*�?O?7
    SGkepnM�3�ӺծYjԩ8lbijkXl]*MOM{�?^.
    ܿʿ;OJm[Iٿ*Ӵou1qFk3=.':spu6n?3x?EH#b޳_�E_~I]g|kwQN?\kn<uMR.ؗgemݔꝅt:Toc+-j9|U^׷�*�?O`_�:wrV?^8:>~awv.KϷz{omM;d㼔_;5sY\]gum�kƓS|u=Y֝չe{K73?0-s6w6FzzɢhY�u�oƗ-Z蝍Gs3%�f;Ê�#v
    >
    VMv$~�/`?#/=�[�G~�/I:Ov�V�ߺ�E_~I]{>�SݿU*t{QW��]G_{�JW�n~׷�*�?_�ҬS�ۣ߿u�{ƗD>[go>fGGqb~=M7?Aٛ[nmo_[Oi򼰉=o�U4zPtKt;K`unYWw_/eNݿ̷>nwd޸|f:ggt۫uco~�/GGvbhFAS6KOnc25[Wmovcp~/v7e,2eSqPbIP,vBߺ�E_~Kgf~$|pdv.d;pT<o4:#Kw.vf6g1o#iC[;>;6VZ<du
    *o�U4zPG?;�JO�n~շ�*�?_={>�QݟU*t{QW�x�ڝ5zw/ot#0Eݝ=kvuA]˴}ٛ?SY+vG1M1M]O-:V�(�׼y鯆ّ?^d~FVe3}ؽݿ:#3vnP&ڵ;o6OaZe)T	=V�(�׼y0E?;�JO�n~շ"�?_={.�QݟU*t{Q�x�t�ҬS�ۣ߿um{Ǘ^�dwggʟn�E<z$]?>T�[w/�?^3׿"�Y�G~ۿ/@�*ϕ?=V�(�׼yW/}uowͽ6Ol�0JظgW`avwUte5nOUT<2xߺQ�x�/}`\m?ۻd�(Opݳ7:s{lK[uNvV*71M5j>*~ۿ/�$]?>T�[w/�?^3׿"�Y�G~ۿ?/@�*ϕ?=N�(�׼iHGvV|�ߺ6CNgE?;�JO�n~Ѷ�u_=u@*ϕ?=F�(i׼yoi֝E#1{~O#ϝywW^u&&e:an뽧(WSW�JHm�4<z?"�Y�G~
    :7$]��JO�n~Ѷ�>gq_hw-7DoȺ}i̶rgOao0}}3:;=׀
    F'sf[y(g}Ń\tmϯx�?one|mM0Lc1ͱM[kb7J˞|{oݯVozlWzmzL{n}Kߺ6CN?`;Wcu^|fͥ_�Ku�-Gwnu/=ӋyN7_GY?tm{ǗKz;s׺:˸:�f]n_f>`?[67vmm/k]IKYO4QȬߺ6CNg�}�W�?~
    :/�]W|{|ٹZ{u1|WgVsݻ
    }wW²7cзm�4<р�d?u�U�ߺ6CN={�}�W�?~
    :/@>�ҫS�۟߿tm{Ǘ^�d?u�U�ߺ6CNgCϺ�T�o^3׿!U*sPӯx��}�W�?~?
    :/�U*s}Px��}�W�?~?	:/�U*s}Px�H>?�.�ҫQ�۟߿tm{Ǜz$�u�U�ߺ6CN={�˺�Tg'^�~t>7#Q
    wZM
    \?5?)LS[[K(6 j#4SbyI4vPvj퉷7/qQn<S+oX
    :*jZid` )>=[]RDUdQޡlqZq)w̗4qzUd8N^>JMw~a1&>^QUOv[pC(5 FQ.//hol伴QwF;#$T౩jd3=ׇ1jcN_1i�_c�߽װIoml��}[O,{Ov�]bVv�Vz):N{{^oﱾ׺c�ve^[�u>m̖uw7Wc~>Dר{uL9>h/iyM;{
    ջS}l?+8Ω񟣷̾Mڻaong7|stUd|V{{{wV/WlGA�
    R>+ni㿙NS;>(vBźkJ+==>NZ^^*u~[ðN|]:Tu~o?ǽ�qnm/vz�55gԕ?q*VM(>'=粺qewOE뮹yǾN,>E;+�6Yu;d7)7EnnU->-^_j|/~0w_>|^랔3rT
    vWn|ݓ߮A-5V7\5=,T{to.m�]9�;iwoQ_%$��r
    ź-{/ۅ3ˡwRTm<�nY6tx˞
    ŗ?c:װ;3쮓PKenݓXܦsS]/Vܴ{轫]/:뮟ߛ?>vY[GG_:~A78Ev+cjr:E$5>ew̛z;o??Mw?O?'-`믐Yߒ=wv__woinwG`{+չZnjп5߿';jp-]m3~>d~*]q>Y]p~b$v;u59O󉆧mu�vn\vڻx)f#iRm=`9Jmv.qm'e\IJzJy$&^~-mߓ?ƍ_/?ef:vž޽YG�_/q뾡\`o~ߔ5tw_&;krT1nFߺF~]㺻'ooXwGߍ0|P܏rr={u|=\~TNr,5rF{w?_?�NZ�e�-j�p�O�׺+WGv?؞ݙ~L>{xwn=xc;콭dwy&nՏ/fwګ?'dn[{wߏ7W\oO{x=+/ǟ:Dg
    Ng5|a[c{�Y}O7-9MT}7/v{"tԻqh*4NM6-uLcgOuzuiG٤S=Ptynӭ۟<'::/*Z|W#3T&^_�4>S|ڻ#6Nn
    :#l滯gIN^?>BNik|ŸIC]SYE҃�FW=i<?hn-[#%w_
    m]Â5XZZ׺flx;ſNGiO
    ؽǵ:g~P핋tcqUu9Yy9rT0|*ݻO:�/�zPuGInOۏݸ-i_	v�^!0;VW;t9کayu�
    oߔ�0.�;Oev{N1;P+?{]ےٙw#3TY-繤C=׺2;j=uUb&7u.[>�[k`|/ǽcyq);[vߑavM;d󍦟
    X^f6ڛ{A�c}
    �R/>&|a%ܟ6랍뾃;pvy[C[+礪q7V�
    <6^@[>Za�9.f<7O6ڱ%凴bm<w6Ugb[Qt6J?+6]
    ^ep|ؽG}n/]?{b63�zs޿^e^qz6TQ'F�ߺ^UK�d_9�~׺kx!G^mٽfsOFufnkvlv_ww?D>^4ى7Sce7T[v{`7~ڟcWi?w~dP?K7ng_ͯ8Nljt{ʗ{}an=ԛheKo_S+~*w.过/J|M{Szgw?Cny|[\{U׺3�e7#��f�w	�A?�ߟn?)Ig}{^;O| ~5g/Ǹ�9�#:Oevg`n"Wvl^#6ٍٸ7_lݔVuoL/MC]7-&[/d
    SVVLJqIS3%-8^%�b/�~Pf⽂~O{߸?7VO-z@�!kvN~b6F1lݕQrSbcLU؆^?O~�%o*=E8o{حUu;-{vw}qUd׺;kzvq
    ?�;ux/]z `uX8;e۝}m>[cI]W}׺>}&�I/Z@1wo{qd{ncc?,gHu/Cuq[mpVtoxPS{t/koݭ;o/;zk|#7_L4.S6_�nV8};[yt٪
    39J>{o5֮{uؿsluNmv�L_zc[clݝ~9d6v{Zol`u~ڻlm67fjkv^s{cy|)v7&;zn1pz{tTbt=oݝd{ySG̬g	mش]_Kxg^[?`nd�6wVvV|/m�Eݕ
    >ߝ˗︱?imvT,uo�[i{+)s}}?ٟ/};k�qe}6p|N1)r9<9"mmp
    ݴ;'nc@G]K>Nu_L|URM�'1vuW_YlfW`w^ժ?h߻W6Dʿ5zkzu_>FoO󶻛:?|4d|4Iv{m6Bl9-n^ :ó5��vgB|�_nv	OUzKswB7N;v�]RRuwʒ;e|[hݻέ'}Fڻ:mgv7dݫq÷nխJ%ѬUTTЫɋs�߃tju~{ߺ^׽u\3?>w]I;uʌ'Jtwrڽ5fm؝qjuOSgrG44cyrU:ui%�)>_{kCe=/n퉹GU|T퟊}9;Wo}_);/2]Y{g?K[{=K_t^7޽}sU�͇g)ٿ>잸ͳS5|>cgm=7<9ݸh
    ouvmu[Q]?>n.;s>Im학쏏}vMmz٨)V奯b#{V/-/)hwp>-Evldv?tl
    ?
    �cwMEm=>G'WulU]g@�]_#uO\n?So�ޟ>]p>"lMj旹_?h�x֣Vҩۘ}׺ G_#nFgOn�폐{;vfV=EO|ワ
    }
    v{?՝c㭻;[[n\쿌>5.d]_W|w=6F&mM_Ve3^�m/N^czt\{y_sM+S
    ?pw/-۽6'z�-~Cm3TgoC%wF�$?TY_7OV%0?v'[o?iG6�LPn^O{762&-$�^ƭJn+z:Ɲ&uۭyR;/wo`wenJmқMcu0ou:n_+zGmlc�7VͲ+NV?!~]6?ooܟ<^=R\8.u?q|c=0[7ؕ_}uY_-vO\|�E�:wn_>؇!6^~N꿕_!o^)k�5.?.]t2}��:�d켇f{[xFksa7x֥uk�z�_N6anFm�]{O?;>@nM۹{fc5;^{ϗ7mbr'2i@|%{qx.?ŠQYߥdUV33@=iܽC_ 0_6[|�qwkbm޺o{mg_zu� :_}7^j\=.3*G~:`u?=>W=nᛛeW؝I~Bpl~}ٹ?x{֥3t
    p]})׺3~˺6?z?`6o*ٻ뮲;:[dm�ޞIu;#M}C
    [E;ctmQ_=G*C꽝ӛS/oj=A]o>]ds5�1uyOXoK^�/j_n
    j{ov?GU]c+c{/qso^n@r}S?E5$g@^s{uXK
    |trt�S濑�O�;]-t9:uugrO]	
    [k'︫=⏰*r՝۾;ww'L6y=}SǟV?MS꾟�1KbJ0yΞWEfˡTS%�g~PfGic�W�C݃ݛR_󃬺nG{tƧ]_n-ͺ;4tge>EQv_Ҙ==H)%xo;!:Ө�+Zn1_ݖjk2t{{p:Wdn?57Ylޝ|炟c/;6p`mm\Ë+c*.;&wkl׺O'>_;תvw{|{[>*v7]j;guwYvdY,6ho=Yq96tP6ľu=}g�W|{^~?/;1�)w^oϑ�1vwlu�Z﯁]y-Cf
    ~c_5avw?#:#1}֗lト؟;}�?�eNvF	Vnǧq=(nu�۝?W{vnen]=fmXm{eu.RMWJ̔ti^�^/˟^׺5^׺u{{^׺u{{^׺u{{^׺lş-�j�ŗse/Sz?F[Kt'8=rx:z^χTm<>cudzhc]zMٰv)�ks�TSqUڳɏa՛磰=C 2t
    綶
    tꖟnnO])
    ,iOKL$H&Q̐H=T]>,ۏhUAy_	?9ob�NаIoml��}[O,{Ov�]bVv歇[o|)zu{޹?�"(ds|~m]:|&u�VOiu?�/�׿gY?�׺L�'Cߺ^�Id�֗�{^3�~{&Փ�Z_!{K�=u�VOiu?�/�׿gY?�׺L�'Cߺ^�Id�֗�{^3�~{&Փ�Z_!{K�=u�VOiu?�/�׿gY?�׺L�'Cߺ^�Id�֗�{^3�~{&Փ�Z_!{K�=tZ?�ܵo�^7:t��׺23�~{&Փ�Z_!{K�=u�VOiu?�/�׿gY?�׺-_7y?mo?N-Q{+?�/�׿gY?�׺L�'Cߺ^�Id�֗�{^3�~{&Փ�Z_!{|�טs6�It׺23�~{&Փ�Z_!{Wu퉘n=A݁K)Mؽݝ}VbM˿n}h?;7;ɼF!]QQ�?�/�׿gY?�׺L�'Cߺ^�Id�֗�{^3�~{&Փ�Z_!{K�=u�VOiu?�/�׿gY?�׺-_7y?mo?N-Q{+?�/�׿gY?�׺L�'Cߺ^�Id�֗�{^3�~{&Փ�Z_!{K�=u�VOiu?�/�׿gY?�׺L�'Cߺ^�Id�֗�{^3�~n
    ?OSMm+1˴vݛhn
    p92xʺJJz׺O?W!hn)vn˾{G{7bCrOok|e~ؼ
    n5m>7Jq43�~{&Փ�Z_!{K�=tX;<|Xڽi2x.o;k6oG+꿑wV?'z~rf
    ؘ϶aܙtZ|^*u�L�'Cߺ^�Id�֗�{^3�~{&Փ�Z_!{K�=tX;<|Xڽi2x.o;k6oG+꿑wV?'z~rf
    ؘ϶aܙtZ|^*u�L�'Cߺ^�Id�֗�{^3�~{&Փ�Z_!{K�=u�VOiu?�/�׿gY?�׺L�'Cߺ^�Id�֗�{^3�~1+~Ksgx?xի-{{^^׺u{{^׺u{{^׺u{{^5�|+�_mO:CV{#Q_&/RetVjk(ƳeO]#Pjʊ-y$v%Ǟ/alb(_ +_<"*A=3tжo/xI'wBdr5qf\e|5X;~'LC؝G7LOW0$<=>u/偭#CJd*h{g0:Xd=U`ݮ!w_51ۨaLpF>cUaRA�gbNѰIoml��}[O,{Ov�]bVv�Vz):N{{^�g�+/~AM7Y-Ge'\A7t݁�[�&-}պҞ?3i,
    ,6
    jfOu:_K_�d7w^{ޱ?n
    zw>E7훏_?{큥\d1lF&᩠^?_v6{c/L흙yAj`zmlfq]C骷P*)"9*1bu{ggu_w޿OQof�**Jocٛ{zgn[p9S
    KQj_uqڻ[|v
    s'�o*,wȓi2;ڝupg`=׺]|7޹__?�؟~Uv-(E+{mܵ[rӺ;k$)#5_k];_U'(7Qw%MG1�s==iQi}{aEr[SCAI5/K`]buw_
    u9�U{Ov\G޻dI޴NۍO3U0apw|{l'�_:;;8GJm=_dvXgq{f-pZ|dKK6蟈Rm?[ꎫ莯wcuG ۋ'H#]hvunwRzjs2T͡б/ɟU:+WN�e^_�3vsgƭ}�G}؛^Oc?ut~;ie3тܝ^;cjl~oQۻeeiY2>$r/TGoCwcyox{gg_0pl=k7miqn\FS&VIS9{'okQvg|tV+�=ɂ؝[mYYv}Ե9MozkzV&lOc(Sd1߼w7Suf>{{+.M}y~=geuY=*wlMi0hW%GOwL+#u.|{y_$msߝ45Kan߽~9o
    ~4>Lm�EojvW-xG!YGIf+}׺}}L_ע"v-?�?�?Ӟ;=5k^�G7e'?x3q7o{u`qޣ;p[fłz؛w;?c?Q>箤vdK;a-<yMAøTf
    T{w[Wv6?wRĺY>o�0nY{;���EَmڟxiM^|e/+WbtMO14KԻGoYf�bl=mh7Y1lG1t>!^Wcslzŝg2Cv|_sml۹ME&W	ei"*jH]A
    lb*w!wzx2ڛ+zlEju8Jib)1mO.On1M]A�ƝRӾw6;#˭]mҟ
    �Qt6c[qd[31.ai}C>=!�OPl7�x.;j|Ȭ'cu+m|W]E*m>XvIE.{�sO���ߺDO?1+:[צ�_1;nof�e'$[3۫sw7njkpVASVHhf׺-!/ʞw^*>}sؽz3'o/
    �['W]%n3ۇLK׺]fE_#U;&W?k;?j3[g7_TnTltNckfh)i;h=}{Mա|]d3|u�ފ>�t�Ҟ;׋W}׺}u~�"v/L~Q?G˯=עTO]{ff36o/]m;rm;ͺqcq~[xضeF+%K^=fj~o[vov̽w4Z�\ıl}ؒ#2?e[<֚){/Ŏ�erun?z?d5�kswa_{6n?+@�_fN:3flm}%TXe/KW~3j�pu/>y_`t��ǹ�d��y?-׺}=ӝG?�Lr|LuwK;uevq]Yε.8=Mfv}9E߻/^`Qݫ޸U8,EFmŐg	ɞmۖ+0XܫK
    &F	DJGs~�D_>׺>.G;2]
    ۟w7~f}S
    f׮ژ
    yX`c^XO{
    =[~6&m^Wv.rݍ{burT!7cn[wUNХ}@
    ݻW+~f\Tu_v}vC>q[+'lܟ
    ꝫ;7}=gK.R\^3qPn;
    /@Wo20s-]2[sNkfl8�wX>=rN휟xnR63M`aE;;݁KHgş]u�ç-n폙;gOn6+LC7`Ϟ}׺}O�cbN؟#&m8=3qa;<.{|×ow	D+q\J{u�wɜ2z;\ڛ�zO/Õ]bq_':͕{z=ڑjñ׺*-~Aoo�{җFtU?A_>HuWK,{Sp];+}bMqK^MܿcCOut O;G\vsW߻v{y�?|>G=1d頮^궷?ǭf~
    /l^?v6,_c/ߑwkv
    .o#zs_<bOu[&_�4lLf'n0忺[}%w`쎿\SbwzvWiS{L5Ěu]G>C.鏖*_ݿ
    av�D,�{wa|8?VtufuK;7۶wd]oW_�+�|_{^j�2'b��р׽u~{ߺ^A�4_?n�Oٽ%.M3
    r=F�̯Iiخ113EjJzX`^ٻ'iR_}]!7rv٩LΜ
    ~Xnr19*ȿ#ic'ڝmc9uoɟb`>'Jή^
    OC㉢>a:5QO]eoNXM+8p^;Od]&&ڽ1;pPom_w]sSxlG\|j>m˸3< ;ƲI*Դk]C80|o_3
    L:՝2oXsWWeWh>//̽Iouva~ߑ}##?_-K҇Z|�cwgݭǶlP�wŤI$u?wmnUb.߽
    TXO`۟{{/=#GW=qN8܏I|&'^g9!vWXm뾆_"e;Gsnc?>}'G嘆n܄q>K{ܟ[ѣ˼nܘ/[
    ktgv"w;
    I_o]݀M7Ǎ^gAdMX�=[>GwTb_NSfMɹz.]g-[}S쑛puc2Y
    |@Wk�3?qtEn,@]ŅNmٛCbn�滈
    ӰolN덩K9ieu~wNn確oݓ[[nw'f잛꟎}#zobn^3rn`a1xӝt=I&^u�ɝ]ѶV�e|lv۳l|y5~Hq0;jquFnnn|oM[ش1m	׾SJSvK30݇>|ߟ;�{o~MQ-'qc!{tk�sg8�~Jt%>ù:?{[['{o,iuwc*}�QY]oOuo%_('0?Gfv�_“n?'�nTG!UyF2l=6unm˭]vwpl}$~
    mսYً⪰_&1[#,m8t`q}׺;K~wEti/1'<N=7?g{['ß�!FYؼf[guw^b{;p{֒My�1;omK9�
    g|k;h>a?Ofve&Y[aoj&<&ޚi׺b_|U~>:6gha|
    >$w4m.?݅[wc;S'_SNC'^�-/lwowtq[>J}ՇsTu|a/O>YlӦ8Th6>ޟ_<˳+n8v?ZtW]
    �
    +o.wm#8UTe7${m~Z|凿W?qwº
    {f֝WU}+ᒓ%=-w_f2W0;`>׽_ɿ5龌`Pv1lݍC;%So+6&w	*!ђ_
    ؙ;nu~ˇ9כd2|\]r[cK#v
    .JEt43E_/hgwvnKFO՝c9?;HorW;7u4.6NGOi_DW\Dt�s+~fN+u_FWo
    - |l=KuSυؽ&^f;po<ٌ7_;~6fi]|v_ϼ$ۻxmۮ|폒z䎓b=4oy}׺2}1}ys-ٗ?|+|._|}_3ܽ
    7d|mݿw�,!{v-;PXn>\7]l;]G�eW/S`m+�?/.{t:^'gog}tu=u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽tٚ�>[Օ�/_m~!P�c�W[]�l@V�,ݗo��a�ȿQ�:��'?ҰIoml��}[O,{Ov�]bVv�Vz):N{{^GGo\q,1hОH_~+OPw޻+6ne[o
    6bswq`rWxi*bWDdbA?J'ߍ_]>1WA}?|ЯXuV{?_6'w/=>i5{tӿٮ_3f3['wc�Ym15^+	EM-\5DR(uv�нOћ7)9=ӻlw5n?UEUjXJ*ij䉪$6rF{tkW~ٹLV.[g#qMf,&*;WQSKW$MQ%=$10ܝ�:]�_u~v�нOћ7)9=ӻlw5n?UEUjXJ*ij䉪$6rF{tkW~ٹLV.[g#qMf,&*;WQSKW$MQ%=$10.OPw޻+6ne[o
    6bswq`rWxi*bWDdbA?J'ߍ_]>1WA}?|ЯXuV{?_6'w/=>i5{tӿٮ_3f3['wc�Ym15^+	EM-\5DR(t=Bw[+zٻ۷in]6;QmŁ=^+7妫Zzy^9>+~6yt]
    �BaYy؜_kkNO?fe|^͛nݏer;n*ʢbx%4rDSC9Hn	NX-W۴	seUxǦ;7e*MFC']QU;<H!:Y&=e:o_l~ٛ72d3e]۔XܮήWtdE^NZQ^Kuv�нOћ7)9=ӻlw5n?UEUjXJ*ij䉪$6rF{[_W;ivS]븪(MM6wxo-_UNwy׺BtkW~ٹLV.[g#qMf,&*;WQSKW$MQ%=$10{~'}]?/SfgjNOit9[bk7veQa1UyڼVZ"j)!Q^>?Pu^m/[[Jjzygr<w-_N[qfۧ{orչ35j*$^釧~'}]?/SfgjNOit9[bk7veQa1UyڼVZ"j)!Q^><m8^ާ؝Okwolp2]`_sZڟeI#^釧~'}]?/SfgjNOit9[bk7veQa1UyڼVZ"j)!Q^�k7t�_>w:~mo~;v~e>Ǧؙ[xՀ=uXv-p[9E,YIh:{.kk|Aܸ=??�Ox\AtW�B'%֝;=g'^^DoXJh|MU>ۻe/[?yl#t-۵5_sm>[{i2L+IM%]4TSTDF^Ǎ'֝;m�Zmퟱ6NZ?vX+w+U[S?=]L>$v>.;u�~{�Y��tM7'ǫǽwO薡$o?^߃/`uAt_.gej|礩{k|A�I�?�zޟ'_��(~׺Z-o=/ӿ'?c_N
    15]յ+;+QT'IS,/9OKI76-E�?�ul�K�3WO<_��G��oߺ^?	7;3gwWecN�=a67KpUͫߙNCtO\eJtL{�Y��tM7'ǫǽwO薡$
    3Vxl~ݻKtPn
    ;pc19X*ZjSy^9*Z{�=_.{ٝ�I}Wkl?+]d2�)>Y~!>/ƛsnӋ{}?_ ʍҳe7pؘNCHxjZZwCOѻ�q1V�@_۟W)N�D4#ǿ+ߛS_{ޝv�нOћ7)9=ӻlw5n?UEUjXJ*ij䉪$6rF{._lvW`|@۾nuۻKxPn}=Eޘ۸\o]oRAtZ|F:4+Dz|gd2ylo;[3鞠e7ȍK@n,eFJy(q;ƮVz͌)rOSc{z޶~
    �*|p�'ߺK N|OX-awWAt=֔�1}YGuS]nmU.:(}׺}?[n޽wn]Emnݻ/zknn;!rۋn{{+؛-5=UFw!$[Re^pۭ;/񏢱]w1a;۩`1u֛wblLnrhbI_S
    D#Uouh_�z+��~z_dzӧzbu?\m_޿M&W�v֋jj|G竩g${v~?:54ޯsGq?ZZD#>ߺF/�Y��׿;u�~{�Y��׿;u�~{�Y��O_F١_ :f󴻧c�fv4{hxL&+7[M\q-DtsFY{t	77=+bg;:yoh:uwVt;qbrYض&oC}e&fxOu}~
    l}ͷw_~F[k|k
    |qm'hep&V*Jib$б_	7k}߿ܿ?a?k�;
    >_gW=>.}N}qwz�6؛'c-_�ڻZ,VW;AYT;u+~6yt]
    �BaYy؜_kkOU?tp?0T[z1fsmIwMцp`壤Y''D^uO=ۛ[{z7;QWve?_sg횸75^ݑYE6*mᖎJJJi2jPt[~K+ލ�#ܩ�f.t[
    s}]v�6<Wm
    =wuwl縶Ew\vF;qt~{>қd)gtu;)wG>k5n4LRR{t,P�/3-gzwtt=3FjWŌSA͛[6'gUQq=.5fu_Ӹ?i1_=�K=A?76osP\8)MYܾeEQQGiIOo?WE`ٓ+_n_};9S3}߿՞M_u>u㸿_Y]CW�b|m߳kpT\o\қNJϑ�n߽Q}7?QC0֢bYjVI{q8|&+|v?}o\f#c7;ΓsmImgr*0<]%PC"{u@g}Uwf_cK6~٫qSUݭSo-h䤤)V?LX߄ix}~ؔ]ӽOxNk뮴Tbcp[#E#=.>JR!{tK3cwGm&+w'~?)zg fj];G);XlU^h*2tUH<i ^
    vjc2ً
    a�O?Wb`�J;�qZɫ|wK=˹j?Omn
    �_SsCY?^[1_fYJ(r]&zVTl]3cmX^ж7Ǎ�i?m7ozx��{|2|o?4mOן?Qd6v[> |m]w^tPlݑp+7άxmNݛ؜]AQPSRԼAkk*߃[sm벿-~wvomB-[w=4\&w	X)"I#uu{t�
    �d{[_?�&u;?#?<_}׺~'Cr}_,�C6olȨY}RaO,Fu?F'ߌ}-]pia18l.8<VVoH*eyZGt|x;S{ven؛kc~{v_6d
    Վ;*(_gI#CO㍊uo�e>�e|0'�oeW'_k�~u{Y}s:ۧwo`~{30Yf]otY,ζWk*M^2ZZQ^x{t,rw??w�~׺'s�γ�Wq�W{V;ʺ:ȼ50�$zOefO\NO^{^׺u{{^׺u{{^׺u{{^5�|+�_mO:C?!Ҷ,o�Y=/OM#e�s�~�u�9�NӰIoml��}[O,{Ov�]bVv�Vz):N{{^oﱾ׺1[uVm]Is;nojۇvmڸ->:-ܻ;6_vm^]K#}G@~E|_/sn}w쾚[Cq=GBz?.*|*Qo,ە;|
    ׺c|j�4Wۃ._;}|KU==(jw|`럍['3*H`aS̬A^A_ٙݿ�u̞_I-}^NM[K?Ia>?2!qƳd}}׺ŏx}A?}^�{替?ZlOٴwtoٵw^n^I#�혛uv{w6&rfq�GŏV>eï>Ioψ">K`w]w޺,f[zo?�O
    Eio~ 3]cO9Vw3;7=>=O�۩׽ki|G,'&O>2T\7rl\O^('ᅰ݁}|wM_6}6	?|}cnrnnLN"}׺7ŏ^uSmm'_=ǂ믑�౛�zoVݻC_s"de^c;Qg&N�fi|f�7C|\nd{}U3'9.:o&Sw}K�׾i\r|^}|�S!r}/[|m{?uuQwCvcw&fL%^/n{ucuVm]Is;nojۇvmڸ->:-ܻ;6_vm^]K#}GP?̾ңݿGYö쮪ܽOT4_KR|N7~`(pF<ÒVMSWW�c|aQ�ɟ'jp؟O/tx-݀\ݛ[[R<'5dvu":fnѿpbn?о؟'3=&']f75Oigw.wn
    �pm-7=-FC!KYVDs()=׺5~d_͛�u_zT=!z2?/O{^z5UhqM�?}kO[?obtz=ٻ6vOpͿZgJ<n}.Ʉu
    &m�E�n욞a7݋}mXW_[gjpURW*ji}׺՟͓!-uԛ;O#on|yl]u?P|@�@�u[?~a,SvRᷦkLԛs{pvO7b`|o�wMŶOo6c7bװRt?YVuޢa퓝#}RԘu׺5/w/b[{tݔ]W;}m~pYzͿYClTu2S3Sd_u7|m\N}5~N`|f[{#b~)Ktn{jJI*(qYzjm¯}O?qn??7۽q.w˶dr9m'B�>ʞSЛ;m</aN^~=q#vv*
    Yvk%i{>6CZ�5~_*V|<<[U?y;`l}:mg}DZi>He}?g_?wmlv$x]Uuݭ]?_K?F읙ژݷSvBNuGR{PK[n
    vnݓ=9VbG;kxv^2ݿ}z3��aLkqwvI[;c&n釧JuMDۯ	wUG2=iSՏ?ilNδ�z:˸:�f]n_ᙌ'bvͣ
    /k]IKYO4QȬ{ߺ^UK�d_9�~׺]7ϓ>gί[?FK!F>	1T7;O=IC7Okqv{UEf0Z�u_ {l/,�1/h|jݟ
    ?=7{GC�]M.{&q=7ehjje=׺OIݳٿ)>_{�oWw՝Uۿ/Wal?]EO@v?puT�Hܻ)ۑfL/B�7�k�~|O;6oO%�Kݯ߿?҃zܟ~fϙۃE7Gn/}qݿCϷ(Twcv@
    ׸2ǯ[Lԫl޻œKg6Q=׺qj㇦xٷۗI6[Se(i.Xm^Veq!਎H{ɋs�߃u]}7�	қ;�D/mv_IugdlO>d=%t�"3^y>bwf'$>2{|Xvv|Mcz[ok3#YC]sfKRvhZq*Na7.K{uGFݷ6??';o@f��./�bJY>Ad
    tڗ"''1[rAW^�O=?;�D&qY]s}=S;v6C?mv/_5t{rdoMI_1lgzпnG]N�6Gȝ_#ՃOwg~_vfBs?>=EwFwqxes[{7nLN+{u_ϼU�+#nOmҝ}wF
    ջU;C![c#w&N<}n-js0&+oT7tld۽lr�fgzҗo{?W#}<>�fmljK59*]Y%}׺()nNN{� :p`0=#G۱zO)ؿ'oln4GٴԻin7fޙ|yʸy7Fvfu6o^!vOi|ޝ)�<ɞ{V?NY
    y�-pm<D]jj}OD!^MWVOR>|obG|Qջ#{v߻ʯ\>xӻ)v%e]f6'nj^bXwf5E۽l_�?t]u&_=񓦻LPn?M.uJ,[;UNk҂{a�2C;^��s'1';wf|6쏐-ٛ>Pu.+ԳG_'o{nQ`}]
    {b{K}_YGf=ػf	}+vnmmG}ZJZ:&b5T:%�b/�~~{ߺ^׽u~U|i{>sBlp//T]9=GG?\/{õw΅Ӗnm6>+",df{>Gv	Иo(@|ڽt_ݬ?_w2tSv;ka[M_|g1׺Bk=mӝ=_OXOױŝ[{i|q{u|\ܻ:�%]ߵ?jUgtm1Zџ~#=zrؘgt_~vxs{[qnlo˸ve-}e5
    kc>(>=II>?uyؓi|x�&vȮKj6VW9YWbjf׺|Xc_a7gw~6`jq�YXnݿ>@u/h}Rl^wux�]G=G{t@3Ͳwy4 :b�>?3͹G#`|Xc;{LJÔZmmMЁ?a'b\߿/�Ά7Y[fugNu/{3WV:6Jo�ﯓ[o	O{lvCWX|uMn{ܺtn_'_|f`w-njGqϞ{nߋ;^㻃9򏷶~?Iq[!U)2ЁGv|%5o?,6*)3wvm:}opNCoۦ#ݔ9\{ZLUzUaS{�vw/]X;tv}w=sܵ]_	vv_v;]*8i<k׺1/ݭa{?'@_ܹ5u^^SokwomyWG-vu=׺꿚I�&�r.W�-]i]Rw-&�gvKs|l\tۗߺH
    ?9]} >O7Yn/?)>ۛxg>�H_+zvm
    \n
    WQ+ۮfr�?wŏ!mݟ?Y]n?uO�7`�^?ÿ͵pwu}pSOٿ>Shu-^Ǯ֛�r}Dug<ZMMՔcfkg^?|a{7o-?01ϜXnюMβ{=Q;o6L{3ʚ̯H}fcVu_zkn>}^};l.F]g;w69[.]?0cU]tu>I>@o>q=E?}ZvEn,ԝI~?ݽ/\/[<6{u_vGGthEE|g�E}6=O޳ݛB7|UTfŶ밙C�]c[wgrs9/;[]v?cM� Wm\{?IQwje>7>�ql^ovPX:q.�e'6W/n~<_ܘ́{t޿gl~Ŭϊ/�;[cw�6^
    '�%n\>?ҲnŸePRMZk;W;[?6f79X?^G?A|_~/vw_,F=un]_V7l9Y{G7e̟TWSve~m˴*Ewq
    GvmwN?om#y,fϬnJuůp|Wf6/]YNl
    rWasSvۧ;xmꜮQTb{O{'OmnO;�?~	nW,;Ư+KSmaػboA9^⫟a{tP64�a�qO
    <Ƨu'ԟ.?gJ^蝿~_vc'ȵZSԔ{z<>5пb
    7'gϽ>^t.e�Ǿ+zùvti>@l6-<e7ǻ7~:evGW|^.쭋;vOa�Zox\˶'1{poFBm
    .ԕ5OXE{ߺEW~\��}Ѫ׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^fk,oVW�,ۛ)ҟuCߴC_mwY[�{v_ҞG/�"G��Ws��W԰Ioml��}[O,{Ov�]bVv�Vz):N{{^oﱾ׺c`~쾭Z�[">v̖<W6d7ѤtX:[:jMTlyν~*Tm9Z1TAlqY{mݽ}-2�+:~u=nj>;hp]3�NZf(pnjw<Q;{m{>_gO|uug7Vvq:~S޲,
    -Nj2Sb {t t(:Wuvenٛ6냦S{?֝m_o;)qۏkjwWd1T�u݉=Y})X/GYw_.]O1lNۙ-_vC1^jk)9\{tX6j}/>:^γٛqxV8O_d}Yb햧sεyc׺:+WtwͿsv�uX}zϩ=N]?SI~ߔ5;xUTt\B�ll՝տ^_`^?ۿ^g#l9!4u\|c;kwp|ٝ>S[Qm^骍:9׽cOJ'94KS&*H1
    +1{1Aһ+uwGp|>}7o\5G#yl~
    4gH}[S犻%UGIt?6Gq]˷pl,wopؽ鶭fy:vmMɪru1bZ:s$@gE;Oqnݕ>sulM=]ۗ{_I|hM;;w'5+=NݩdC{t t(:Wuvenٛ6냦S{?֝m_o;)qۏkjwWd1T�u6&Ο4m-q
    [wbf0bv.cqTnwma[lR1UC1U{П3Ǽ?퓴u/
    gtt3`|靉6%~}_?Vmo.}䡧35u1OU{32uAbwWavV}cnn:kY>Gii6=ûWqvJK^_`؛`ny�Z<q�}۽Ush^
    GۙdԻIYQ,Zu!׳_{/>ZeVt^]Y{3un?|wjgIc7읽="Pݲy֣/5="wBAbwWavV}cnn:kY>Gii6=ûWqvJK^A?E�;
    w'a]ŏ?h&^-|܉mՏR撫7Y1Aһ+uwGp|>}7o\5G#yl~
    4gH}[S犻%UGIuvNv^.;O>Dmݎ703m`mѸiiOqD|s7^][;gqf퍹>=g[cǮn?tE\vڝ<U*:LU.?{;j=t|^;n� 6~@?7սtE2Yw~|ٴ݁S[vGUMPl/IW{t�vtnުܟ,_nߓ8)~'Sf38o,~;!?'?m/}m5Tȫ0ݣvC7{t��c]~7̦vb>Q]ܸT
    w-63q\um!)|#RDyT^|Uǥ3m#[wgi6ē}ͱ6u(llv'[m*�vҥRG)嬯zʏu�~{ߺEW/Y�u^ušw%{
    }˶(~cw^K>mg:�{e3;NKsꙶW]jpU>(!^Y>nm?ow7Sm:Gjgzfm1?%otTE)E^l̞'b.jϚ/ǧ 2(T?
    tw*]ܽ)�'z.3wQIQy׺?w@`?٣�d_D�ٯ�}W6V��?Wu߽{vݣ{꿏�foZ?D=�S*[z?c2cvM屾1_ܴgrG�ߺEW/Y�u^eΟp?6ϗ}>4nnnn~kh;A
    _w__G``9Yk=CwvEtӭu�%YGtM6̝caٟ*>]n�9ܧr-^?oH'{;�M~ݧ[1ܿ#/N̛wu6&k&WfǾh[32>;/e?QM?w�M|^[xPuQL_r&ʟfIU;6Y$^{~(v�ϪlOpwu-{>*[�aM۽ߏg|]lv~(fT
    Ucht4'YuwG/^]%�&u&b}Kk[{[`vvw~j4gv$Cg׺OԻp`G2lm{1/u|?ӟ8j]gTYzKhg{N}�䅶7F[O;>m�5zs}؟K]T)hf)ruO$UIq7F�>\Wo~9_il
    vO?f͔,v]G[,c)]:
    ۾'{ow.nIN;ߣ{Ǧ~GA(;K]sɶ1ko152m'T'�E8M 7WYu�7RE#>Y�|ߐXnvnۀ;rub#C&S<2 ?,Ô|��HG�{WW7_&_o�O׺?�~=&qk~vem.VM$slMJ0mJhԵQପjk+ަ{_&.��~Ѫ׽u~{ߺ^`mgʯ;iptuU۫۽go[g.
    ʜ,5�+�}[~w
    >O*o]?DlLV|ᱝß!+{vm7`T읥USn815>EUis
    ?f{r.:V;HvL	a]bLiu�­S=ϵk6rPT6c~�_	 REQw�ƚ6osuvOMoހܯ+ct7^?[k08.@;quGzø;[m>Yn}ߛ^?{7rZ;3f
    xZemnmg=N׺OWg|� >X/>_`q=?�蝻v�u,WܞtJ1�e_Q^V>[f>~|=C
    ;73GݛOk/;gZvג=Ɇoʗ9^`׺&]}YP
    N^�s~No8~_wvkv_.]3oeeRϜɔ܍^|T[{voCvGf,o?puQ+5=Iw`wڝٷ6fvoS7m}I[jt/?O?>Cezoz*,GfG;7gf0�~{)^n`0-CꊭKPr5t{oR+hk?8wnj;_~VdtWs?.?zŃr
    >Ѩ_{q�++bbӿV|}Q
    9}n\Kd۝֐}.�G]uvڵy7+Oslg^�*n=]؝kx�3|e}[ß8/7ht5:�~Ml{sfףPa(i"33�?˓ڻwv�ؿnϑݻݽNt]Kzmne?t]ո0Y
    ߇W`^ć:ۼ~@&�i~qn]03�3;7]m޸�m]0Y=W_ou�
    wt| 7avgo7''r|q>UkXۗwηAMq-KL)E%~vE_MyS}uu_@}u.k-Qmߒ;\ʞ0}5[iwfݸ
    ++V-12e3-׻\[֝��s\⏿o`n~Owz:[%YuW<|-6VլgqZ}Ӝgk=׺OStN[Oٛ-U[|ٻG7VyCkdm۝7fලڃ	CI%1u\(8wfw7o�~ܝEw~N|p|>]Կ;kv>-n>b՘7W?_b
    peUސuvzOvۻOab2ҝѸa^nmϜL^%h=׺'WF.;IO�'kVm�lvMwnj;n_){WNܘ==]+kh%&q{i�*۝߶18/oL&|ڻӹqVZmge)vl>CSL*FΈNm�;#Yo?SKo�/٘mnߟ.
    п.W`Wp�f^՝Yv~}lZ|&ۘOmw7>#qvdcs[g>M|߻ʯ	U}wwnfY=ڤ^@&Ĥo ;Cv|.q13 3;ad=eܞ\fv;Ln3ou^.�N~veV.M>9f2;wwS'嫥{+3,v_3ەxL.;{t߉5[Wbv-~hd1�s#8}df9#jrx4q)7wIC['{/>)nvktgYl[3;	>Uuۃ[5m͌\te=׺3Oջ:Sp_~ٽ[[kc7؝1Oh࿌,_pe�mE=?WUVTx,39^@U_)ߗ?A?dtju~{ߺ^׽u~{ߺ^׽u~{ߺ^׽tٚ�>[Օ�/_m~!P�c�W[]�l@V�,ݗo��a�ȿQ�:��'?հIoml��}[O,{Ov�]bVv�Vz):N{{^�g�+/~O9|;=`|ffso7QYG^[?fgwL+II&[-%DjL_w77VퟗU*{ÿo2w?FnLIjnόYVbݐa+0x)Mjw׿[~]U_6^ow1&{>1e[+vCUSa৓4y޶_^�gssunuW򫧰[y|;ۆy0?{S!gsfHv~ŕnl-
    V	MLDz1~]3+zbuwruvګ^yn;cTo?wM6?w:-Il]E>RjʺLoB}wѝzr7:{v6.>sdvYlP<O	ⰒIMm%<$!2/ECջg_ʮl-n}Lmћa!ڛUad5XJ%6
    y1Gk t,t/}vf͉{j{{pwYϼwslSMwL}4t}Ķl}&=uJɫ*1-ӗm؝\&/lQi76cq{[n]ųm6wpT´eؼbTL$�gssunuW򫧰[y|;ۆy0?{S!gsfHv~ŕnl-
    V	MLDz1~]3+zbuwruvګ^yn;cTo?wM6?w:-Il]E>RjʺLoFKtl,'kgwW	+kTmMͼ2}Ee۵{qlM0%$l/!I2{tEq�:?�~Ctfwgz/]Ӿۚl¾Nۋ|}pSҬrb_rc0-^b
    x*׺2]+>LEug�_[���xߟ?4?gƾ�'}^wtᏨm-łLy=ۛcl޻vQSMwg-_R3
    ~Ntxd}׺eg
    =xΛ3
    Rm}Aϭ>E�%ջ`}_�̘RÕj?u^ݙ}޽Y::bumUu/on<Ymi韏}nrؖ
    Ƕ.)Y5e]&7{n6Nޝya�m>Le6\kn;l39U&37O-6FP{tL[~]U_6^ow1&{>1e[+vCUSa৓4y޶_BBfon>^؝]ܝ]::x[pw64xMOιlKmcQOЯ]Ŷ~;gs޴9ܦΧ^ݸͭK[?1s;v-bx$ES[IO%C"4HLP�gssunuW򫧰[y|;ۆy0?{S!gsfHv~ŕnl-
    V	MLDz1~.ne7{uGo
    ='q0u�惹vcl.wv띿;m632墪qݹCOQl^?t/}vf͉{j{{pwYϼwslSMwL}4t}Ķl}&=uJɫ*1+�i��^Q6~O>M'\n.MSwcb:{en*}Sn[öխ9n:|l%l{/][-~blTt.gqü76U}1+3nئ[?-n4لM8h{j-0}p|
    SY>I0O}/|
    Ngi39:/P{tku~{ߺE�ȝ�7;ߺD`|3/Tᅭg�7Lᅭ;GwZ|oW>/TnO]5jgz'iTgS63i=׺}%ߝxό?jvo[|d|՝G;-]m[Nin\]isiE&SigqdR{|{}~8u?Vl%ouGɝ.3w-o+	WM6/7El,3aJ>1gO�E~�dw�_Xɗ(
    �'O^w�4AcvOw/otG�,._ k#-)snkT팎O)p{\&rmmm{awoVI{�odN�ɛ�{{Wvuצ/uWȼa'=~@m@�'5ۛ?l]bゥ5l[i1]9(j-GFJ2!Ӹ>zȌOtR.ϟ!{g	hwgqtY#f)UxETEU#${.xc2Kgъ}Uy=}atf}{*i}~')95^鋠n|f;/cv�+Eu{7go흊ڸ}ٜoMEqyݼD5r'ߺ^|T^v�JM=;/-vKIm[ݐm?[1yWixiqy:?u.ϰ3|E{btG8=cOϐvJßi=S(aeI!K4iЯO]Wr֓f۽ݴ8NӖ]ϗGlV7F+cqۊiS]OJI~=6LdvI>6-�>oxwFlW]}]cu;7x<;:>)fjOu_+AwJ�+W{+K7NQ 7Ecv۽_ 15.?ޒܔ(#Hj{tT)?gnmIOS{vu7ˈ;l,~:CMG]MOy|}~;'
    ]߭{p1X^g}W_2o!q}7KnYYvoy32n>񛾮*zO]g=?7>�KKC'u.J>1\%fG+/c!d׺]|]d3|u�ފ>�t�Ҟ;׋W}׺odN�ɛ�{{{{^׺u{O|gX|U~JŞ#^grKJv'g`YZZewFFc3<U6J^3na;:ogG?
    ~t߽?˥>4l|M+9%s:J6O2znQa}׺2_43lOe+?zbw}+"vfdw˫_LZwήrZ2l%]F?Яgl~O]ǝtC;u흅v_aI{;t2c)XNVjtpc{{>Dm�n/;U{{gnnj,~3-Yk+1Rgi1Y*i$j#F@[{쾝]qw{7v{'?-_�[[!egqUTU>	UK7Q2S7&	>{~6.Sm-_g.߻gIUY=yיݛݟr&G^ca^u0n�=O]Io>ӏܛ.o͑m6w�u`qY}QM3h{xc2Kgъ}Uy=}atf}{*i}~')95^؏7Qs}
    [zf#%{?sUϷi6=6ښ቎:JjCt,a{G.Z{bg_3+}NmBzOM|huPx*H{//==nvklXczxnjI5^ݑY!ٻ;MSII[5B>.JM0Our_(3ae_WEb%h_s`Pn<V'/eZwblLnrg I_M3#&ou_=o{[g޲ٽǂm;{Ϭ6fMY[	q[RjS|,TD_{ccvYv.?yWvwmͥޮ?2? !d(Mkuȿ�=:{?-Q~RnؾΈXHՙ7~W\vGEF殯p{u>nnmb?z{;w_Y~mn^/xufb}gq7Qdɸpnj2:ct:e@G@gV|mt6mmݙ~oQ
    I>⦫ۻ[+7D;7pgiv~Z9))+fGթ@i	Kl>쾴Wcįnl
    gs>콫U"Mn\ul|i+yDs`ԛgk|[7Mzvy=S6|V.+tc*M^2ZqO^t,ln>�N؝7nݙ[C!{g1?4IoOO/_\gڞ-sݥO}a7\6߻xCmntv~u\IO]cw׺w̿OYg{kfqFiw
    gz3fÖ4TmdUJhd>!;YSa{cwff2w6�4pkKryYN*̹ǵ08̮''9
    *zuZ^܇Nh"0Y=�Kػ>|y&١޹ӴqfpXUUQTHu/ݧ�F?"+�m�O�K_in_+=�om?776cw_}v?Pպn8z1wS~[4f򝁶3I}pL@V3nc:z?,f+Sq|wnC={g;oWwKo_93їܒSM>+Fة><tV2ӵ~QS_zODR�!j>9fct~W3:oa1s<y,x{нo:c[zsyvoS`ޡ-}{y>ulk[;)qf5䥧{Ğ׺Io��(~O~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~6fϖ�e)�[_}?�A:y�:Vś-�P'e)}|lb�/?	zְIoml��}[O,{Ov�]bVv�Vz):N{{^�g�+/~A
    �q?'w_�F3�_ޟ/3h{_}>^Z
    ?~L?f~,zquܿb;qQa<
    .n᩶׷>#~zU'y|e0=;wvkn]e~[V.Տ	IOKO!sVH1^?S|l3?eg>N|O؟fo�C?|	�\|T2︷Oʩ+3MUzYm+{o>aX.�{svQvn?8Slwe6m#KQS:O]U^/{`.cvWg|e~Fm_uY|Uv~?}nؗvOfvLTEQL17Y㯧_LT>L:={b|YO'ľٛ��3�f5~Bb/?7L-wE�SUClC^wy?1[ϪXwv?/݅7Tnnݛ+:>-M0grATμfUC^u|SN=~0nGO2o^=2{"{>ͦyb1`!pa޲
    :3G/AGV|3o;iNXߕ]AGݝ3[5/�}}yۖ(X(6{߄77@nnu}5<Uo{!3!y-llw>+ps7;3XV5G5l*n
    Mm,Y
    s{}DFݸ2_ʬPiwytI||]_8?"_^O�|p=|
    óI|X?6[Usr}Vy$#C?77pOf={<6FNɊ;ظM	+MȣC^g77nk;9^v_Ro><[fm>ڻ+6콿SbSA@}٩AGB{Qt�^2w�'k|`>$_z]јOݵWgw_>mn{3kunҮⶾf	EI5v7!GFKw]_M|m{{{[nnnvKv#'E|dGϊ\&dQtsf�I]lNǟ cFJollW-ݺ�G
    I\XLDpÙ{|?{_��Nv�}{/Nu?/z/nc5;2]aګrV4ouޭ5>+o?^o.ݛgzx|{wM|}ʾwy~LVǵڟO\k{ti^|0<//EwwRTcb{[-XۿdmlM_*fkpZ|gL?z׼
    y??n3:wvmn
    ?Q޽5*1[j|]>ކrQ/.v_7�߻aljٱ?;,.{}Opr; 6X}K3afܹu_:>Bw`uEtsTW;;3ntnI|o/޿ ҆+}.Bl_a׺i��^�1}�+emٴ_d[xPv7^w=
    �T-ذL6TwhGJS(s/_ʛk{walmbn
    =o�%{פ=OS?>[�M|ZqW#S'_w6sPn|fe(׺aw}ڽ]
    V�]łGo^[ms~>
    1W~}{n[ӛRQdDՒ^$]ֽ+Mٸ7�}FNLz[z'SG>uur$ӥuOFߺ^�2'b��sl9wO>e[~鿒C{N�kvf?ݝͿ6]ufm{[#[*#qdLxVAbܕL4ϵ׺aȚ/]v~%?ft?]}NcAIkHٕ=ǂ7ne_\M=QOE^tu%	zX_9y/^]7*Mdnoϖ=ۛrXg%\mOacY:ڙ1Քu>/RL��ewEW:,o��o�!�F�'_�o�~׺bA3_;ts@no]z,?Hc>?/^wwW=Ví!agz:<-կmv>ۻ+emٻ?KimlF?o흯v>ۻwa0XLU$TԔEOMOG*({sȝ�7;ߺUW?ɚ#)+ڟwV�_|f_=?wq�?opd�;^'�?ڸߍ5;`U|86i}v,Y|bx&+jvU.޴ۋntOo˻6e~Gwf׺~[[\/ouf~?u?_f*;#wߝ/[_i3[+t?f6Tl݇iI@{ޗV}ӁOb|W~6c\팇.{ћ7w*w]LJ52Tq${t,t7h�e'0,>s+=9K}fve^S1=gz?\f'6C+]KR,n~Gʘ?_oߍ#zi{+!ߝ5ӷ6oMي8tV-'ۙdpwOAF{`;im:<z�2>yk{vCNܙ,[zf|cj߉Un\6cCO[�̊Nݝ3�Pb<ftK؛>Dݻto_9mމkef憎%U_X?&~XQ|X_
    g�QPm%G�ݾ`|.A`?SC=׺	GȞu_Pg^|moO|d6Em۝1!vM1[uvwwgb-&
    ը%g)=׺>T?ZښύVeȺ?cdrٞ҃k|g}>Jvw>1Bםa۳[9Mϊ׺
    :?~=_,άJ7e�3?}ѽ++Uuk}I9X=TA[VK{3~|[>ؐv?EtWZ⛭7f'/;;3m\MxDGN>+-�̉ؿ3c}t`=u~{ߺ^׽tLvuoyL
    �o>Xo_'K]:lO[|쮚VwvezRbMiz3_0el6|0ߌK~`
    V1?*1][)9Jc{�wGswbgvw.jg|E{�mf`~.|yQ;6t1*=׺=_ȟ;3gEl_3<7>n9l|7#zz,
    C/?qSc|<GO=)>(|߻�'҅&
    %_+==/El{:3>-IW>c6nlJmŌG{+>w̿�_9
    ׀S3؟K]|U_||^}Ԭ\+ϝLaS]."zu^1?z[UVVkC|Wջ۷3D;Ϥc??͈9tu7jRM3mu}7Rd*z`m�Icn`wnl?1]weŕ쮧~#l{E;'-#QRnuoω&zjGttV_Rov�ݭ͏w{m]sQb|/펤pog[�9{tdono{wǏxo|ە"2񏻻
    C~wwɞ5ן4ݣy|5ym֛c&fc8\tw>ԥ].{·!MV`0ό{u(.ȯݝcjv2Uԓ<K/O]bq}vg3
    ?j/'qg%؛>5L{3b"E{w#y?uU?ˇsr|)[ef7tΦ.�Mj럗ٍA}ӕ_ }x哩~8[G.ՠLǺU߿+	JmΧ;GQtcng|˨||_�<fb~fryǕMݼ1݇>[+6NW3bo
    E>*|o9�(-=9-1]_QG}mouK=]vSmfξ1^^w_f|%]WþX{3z'N}uu4YMOrԽ\,Tu~\?&wctVkv_sҿ&{Ckplߓ?[6.ܽ9o~ٯG(
    ݳUWau]bq}vg3
    ?j/'qg%؛>5L{3b"E{w#y?uU?ˇsr|)[ef7tΦ.�Mj럗ٍA}ӕ_ }x哩~8[G.ՠLǺU߿+	JmΧ;GQtcng|˨||_�<fb~fryǕMݼ1݇>\Cs&+?ߎmOݟ$sv>Ϗ:=zN5[7uTe}^;&]%n]}$8_uX?&w6]v�f3b;N]Խ'pc�{3{{~_}4`屹)2{t]Wjqt7Z_K�=w
    ym7m\0[}wKٻ'=nNoKF;@WL*=E~[|?Wêo['`vɟ'kO�ϗc�w{ٛSWVc׺v<wxl-[nvl{=7Kp}_}#kShlڽK#o:uo>?s]vߙ+>AvW{kxn2;gۻ3Y^퍡S8(retؿi?WwG�a}cEr]iQt>_/>>w_mYnM~[Gmv�hs6&Mɱ1Kҿ?>yܛܛe﫶>?bO~jba+7fk{^/>Aޟvbgws?rwavۯl2l.fk;~&`]EeE>*ovq/{uh^׺u�{|�!�vwߺGSߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺMY_�no�JoA'?~G~Εfo~�Jzlqo_/�_﮹�s_޿װIoml��}[O,{Ov�]bVv�Vz):N{{^wE.Gĺ:ȼ$zWabO\NHG{^kݔ_['^{37ݛmͫT7ܻ1`G5UmmTSRD=׺�:ڽi3ۃ1-y'\vRvؿ'PlOivui7|5;w3Ot|T{>IQͫƓ=:}wmR|en'jnhuFggVwϏMYSs4WIQK׺ڽi3ۃ1-y'\vRvؿ'PlOivui7|5;w3Ot|T(:/=u?`c7	>}˴}^=>no/Ei|[#QUWKп)zam]˾Oo콓gvo70ۛWi]n˹wc)Gm"jک{t�u?={;xg\b:[oOs_W]uM߱~O>lnk*vf
    *08}׺Pt_s{~n
    }Ӱ;i{SwUu/}ݚv^,G{vR~ڻ}o{'e;vna6ڻsS;rR,EUSEMKM++0^�돒{3jvnt]T#纾'qۃ)IڛbC}?դlT<TaqRt+MT+$aPw.aGx_5�wq%Yl-GIW5^+#
    /Bw.Y=Nټwnm]v:1w.9#X9kj'WTVa5v|`�4vfms6�xLo
    ϵ[jplvIe~
    *6F?MJ8u'#? 6�?'oo�2KԟߏI/tou�N�g?ߺ@O[r;7Vɱ{wZM=/YAѮ4Rn:e%]|57^+MT+$aPw.aGx_5�wq%Yl-GIW5^+#
    /Bw.Y=Nټwnm]v:1w.9#X9kj'WTVa$(fIqm϶>Guu|O]uײR7~?:{`#MIǦ٬۹x+^A}W6WIN.ώ]MUԿ!?Wvkuyz,>LKZjVF_uKj]{e읗;xٹڻOjuNcp]˸sJ<FosUVM5-4O,{>IQͫƓ=:}wmR|en'jnhuFggVwϏMYSs4WIQK׺ڽi3ۃ1-y'\vRvؿ'PlOivui7|5;w3Ot|T(:/=u?`c7	>}˴}^=>no/Ei|[#QUWK{�gCo��_[}Ǘui׺4ܝ�:]_u�܇�U^?|Gvbp{
    )b\[sYڻkxS߻}q2)8rVc$\;!IK҃?Y�׿;cu�~{?Y�_gYoYYC橛k#߻$EPFp^ w3,V->i󟣺!]i^2MK)25٢˚OuYOqA@Pnݝe|\zφ9zjen=cn>Skip:+ܸ-\
    J׺PtG�#V/gugpPeͳW~_|uڻ#q}{3}|;Ǹ6%Nm^桦ʉhV{�8̖W?i?�/Z���~�߳ǿwuaRw~?[~l�nv
    S|ޝ5-7?NupnOٌRnm/WQ1d}׺;�ܝ�:]_u�=lz5L$sY1'*Z4>ߺBrvFt;`;L&##k03:>}Ez+su[)Epn2
    :I뢨ouN�g?ߺ^C�tt_v['ޛ
    6v{n=6Sf6[gvwY
    Um,USJ쌬}׺w.Y=Nټwnm]v:1w.9#X9kj'WTVa;=Y֝յ_ގٽ[0-s6w61^k)k)&9{t rv?w!�~׺�>C?ǿtwu?_{h~vjlMxmםU=C�ߺLC$M+1'FS#X~wepnMnGtkkmGC۫RdYj*at5>/#%7@a_{#=t]Iٿ*Ӵǯg|a}Bdu>':spu6n?3x?EH#b޳{3O+]ޝ?S~uun<uMR.ؗgemꝅt:Toc+-j9|U^nܻo2tU/u}Mع/>]7[OR|Jeqt{;=Y֝յ_ގٽ[0-s6w61^k)k)&9{t3,ηTI5z"Hţ@8}th?;cu�~{?Y�׿;cu�~{?Y�׿;cu�~�7Z#՝Yh�QZwXa}F;3ttGn
    }=ٛ[nmo_[Oi򼰉=׺Pt˟"7[
    ۾:�{/mbwFOۿ>4w6c0ԝ=>?릦XϾS{tg]pAS6Knc25[Wmovcpo#vR&[>GV*dd))}׺gY	wXyp}n<uFj]-Nm#amm:cggbGY}%WJN�g?ߺ^C�tNܽkt^{3;KkvuA]˴aOfmO]gd96;+ֽ5u<׺z32=Çø+2l^ٝי٘-wF.0Vs<c1_=^:A'uN�g?ߺ^C�uN�g?ߺ^C�uN�g?ߺ^C�uN�g?ߺE}';n
    vO\UF\wZml7n
    pl&jZ:jFO^{3O+]ޝ?S~uun<uMR.ؗgemꝅt:Toc+-j9|U^�N�g?ߺ^C�uN�g?ߺ^C�uN�g?ߺ^C�tδΎ-w/{|it3{Wp�kn]L){p7]<WEr6"bURE�܇�U^ܝ�:]_u'Ghw-7Dۂ{>{3--�>EvCSw`Ǻ76lܛo%︰k^?|-nf)o{cޛW#n_ۗ`bilmٽ+z6s+&=j7>ߏ%ת~o|/j-=gpfv?2;7;Eڽ=G{]_U[?vQ}π#ѿt_v['ޛ
    6v{n=6Sf6[gvwY
    Um,USJ쌬}׺Prv?w!�~׺./EK'Ҏ/
    4?$YY_+9<׺6׺u{{^׺u{{^׺u{{^׺lş-�j�ŗse/Sz?�{?t�t�6[+On7Scz��_��}u�~аIoml��}[O,{Ov�]bVv�Vz):N{{^oﱾ׺c�ve^[�u>m̖uw7Wc~>Dר{uL9>h/iyM;{
    ջS}l?+8Ω񟣷̾Mڻaong7|stUd|V{{{wV/WlGA�
    R>+ni㿙NS;>(vBźkJ+==>NZ^^*u~[ðN|]:Tu~o?ǽ�qnm/vz�55gԕ?q*VM(>'=粺qewOE뮹yǾN,>E;+�6Yu;d7)7EnnU->-^_j|/~0w_>|^랔3rT
    vWn|ݓ߮A-5V7\5=,T{to.m�]9�;iwoQ_%$��r
    ź-{/ۅ3ˡwRTm<�nY6tx˞
    ŗ?c:װ;3쮓PKenݓXܦsS]/Vܴ{轫]/:뮟ߛ?>vY[GG_:~A78Ev+cjr:E$5>ew̛z;o??Mw?O?'-`믐Yߒ=wv__woinwG`{+չZnjп5߿';jp-]m3~>d~*]q>Y]p~b$v;u59O󉆧mu�vn\vڻx)f#iRm=`9Jmv.qm'e\IJzJy$&^~-mߓ?ƍ_/?ef:vž޽YG�_/q뾡\`o~ߔ5tw_&;krT1nFߺF~]㺻'ooXwGߍ0|P܏rr={u|=\~TNr,5rF{w?_?�NZ�e�-j�p�O�׺+WGv?؞ݙ~L>{xwn=xc;콭dwy&nՏ/fwګ?'dn[{wߏ7W\oO{x=+/ǟ:Dg
    Ng5|a[c{�Y}O7-9MT}7/v{"tԻqh*4NM6-uLcgOuzuiG٤S=Ptynӭ۟<'::/*Z|W#3T&^_�4>S|ڻ#6Nn
    :#l滯gIN^?>BNik|ŸIC]SYE҃�FW=i<?hn-[#%w_
    m]Â5XZZ׺flx;ſNGiO
    ؽǵ:g~P핋tcqUu9Yy9rT0|*ݻO:�/�zPuGInOۏݸ-i_	v�^!0;VW;t9کayu�
    oߔ�0.�;Oev{N1;P+?{]ےٙw#3TY-繤C=׺2;j=uUb&7u.[>�[k`|/ǽcyq);[vߑavM;d󍦟
    X^f6ڛ{A�c}
    �R/>&|a%ܟ6랍뾃;pvy[C[+礪q7V�
    <6^@[>Za�9.f<7O6ڱ%凴bm<w6Ugb[Qt6J?+6]
    ^ep|ؽG}n/]?{b63�zs޿^e^qz6TQ'F�ߺ^UK�d_9�~׺kx!G^mٽfsOFufnkvlv_ww?D>^4ى7Sce7T[v{`7~ڟcWi?w~dP?K7ng_ͯ8Nljt{ʗ{}an=ԛheKo_S+~*w.过/J|M{Szgw?Cny|[\{U׺3�e7#��f�w	�A?�ߟn?)Ig}{^;O| ~5g/Ǹ�9�#:Oevg`n"Wvl^#6ٍٸ7_lݔVuoL/MC]7-&[/d
    SVVLJqIS3%-8^%�b/�~Pf⽂~O{߸?7VO-z@�!kvN~b6F1lݕQrSbcLU؆^?O~�%o*=E8o{حUu;-{vw}qUd׺;kzvq
    ?�;ux/]z `uX8;e۝}m>[cI]W}׺>}&�I/Z@1wo{qd{ncc?,gHu/Cuq[mpVtoxPS{t/koݭ;o/;zk|#7_L4.S6_�nV8};[yt٪
    39J>{o5֮{uؿsluNmv�L_zc[clݝ~9d6v{Zol`u~ڻlm67fjkv^s{cy|)v7&;zn1pz{tTbt=oݝd{ySG̬g	mش]_Kxg^[?`nd�6wVvV|/m�Eݕ
    >ߝ˗︱?imvT,uo�[i{+)s}}?ٟ/};k�qe}6p|N1)r9<9"mmp
    ݴ;'nc@G]K>Nu_L|URM�'1vuW_YlfW`w^ժ?h߻W6Dʿ5zkzu_>FoO󶻛:?|4d|4Iv{m6Bl9-n^ :ó5��vgB|�_nv	OUzKswB7N;v�]RRuwʒ;e|[hݻέ'}Fڻ:mgv7dݫq÷nխJ%ѬUTTЫɋs�߃tju~{ߺ^׽u\3?>w]I;uʌ'Jtwrڽ5fm؝qjuOSgrG44cyrU:ui%�)>_{kCe=/n퉹GU|T퟊}9;Wo}_);/2]Y{g?K[{=K_t^7޽}sU�͇g)ٿ>잸ͳS5|>cgm=7<9ݸh
    ouvmu[Q]?>n.;s>Im학쏏}vMmz٨)V奯b#{V/-/)hwp>-Evldv?tl
    ?
    �cwMEm=>G'WulU]g@�]_#uO\n?So�ޟ>]p>"lMj旹_?h�x֣Vҩۘ}׺ G_#nFgOn�폐{;vfV=EO|ワ
    }
    v{?՝c㭻;[[n\쿌>5.d]_W|w=6F&mM_Ve3^�m/N^czt\{y_sM+S
    ?pw/-۽6'z�-~Cm3TgoC%wF�$?TY_7OV%0?v'[o?iG6�LPn^O{762&-$�^ƭJn+z:Ɲ&uۭyR;/wo`wenJmқMcu0ou:n_+zGmlc�7VͲ+NV?!~]6?ooܟ<^=R\8.u?q|c=0[7ؕ_}uY_-vO\|�E�:wn_>؇!6^~N꿕_!o^)k�5.?.]t2}��:�d켇f{[xFksa7x֥uk�z�_N6anFm�]{O?;>@nM۹{fc5;^{ϗ7mbr'2i@|%{qx.?ŠQYߥdUV33@=iܽC_ 0_6[|�qwkbm޺o{mg_zu� :_}7^j\=.3*G~:`u?=>W=nᛛeW؝I~Bpl~}ٹ?x{֥3t
    p]})׺3~˺6?z?`6o*ٻ뮲;:[dm�ޞIu;#M}C
    [E;ctmQ_=G*C꽝ӛS/oj=A]o>]ds5�1uyOXoK^�/j_n
    j{ov?GU]c+c{/qso^n@r}S?E5$g@^s{uXK
    |trt�S濑�O�;]-t9:uugrO]	
    [k'︫=⏰*r՝۾;ww'L6y=}SǟV?MS꾟�1KbJ0yΞWEfˡTS%�g~PfGic�W�C݃ݛR_󃬺nG{tƧ]_n-ͺ;4tge>EQv_Ҙ==H)%xo;!:Ө�+Zn1_ݖjk2t{{p:Wdn?57Ylޝ|炟c/;6p`mm\Ë+c*.;&wkl׺O'>_;תvw{|{[>*v7]j;guwYvdY,6ho=Yq96tP6ľu=}g�W|{^~?/;1�)w^oϑ�1vwlu�Z﯁]y-Cf
    ~?]op|oϕ]_|`[zOy{.!	]0-vϊڻy,W#C]CM/GiKW;z#Otl\~'dv�Uԣ`تj(4׺*K�e;�('엿uWu{{^׺u{{^׺u{{^׺u3_gڲ�qeK�>ރO<�+k͖�
    œ۲
    >޾6?1?R�\�9_ѰIoml��}[O,{Ov�]bVv�Vz):N{{^wO?ȯ/u'_cb �9N-�I{&Փ�Z_!{K�=u�VOiu?�/�׿gY?�׺L�'Cߺ^�Id�֗�{^3�~{&Փ�Z_!{K�=u�VOiu?�/�׿gY?�׺L�'Cߺ^�Id�֗�{^3�~{&Փ�Z_!{K�=u�VOiu?�/�׿gY?�׺L�'Cߺ^�Id�֗�{^3�~-_>ן?ǿuL�'Cߺ^�Id�֗�{^3�~{&Փ�Z_!{K�=u�VOiuW
    ^c{{|:sOo%ӧook^�K�=u�VOiu?�/�׿gY?�׺L�'Cߺ^�Id�֗�{^|@?:7_ï;w4�]:|FuL�'Cߺ^�Id�֗�{^�E;bf:ۥ6`Pm,`o~Sv/~g{&}renii뢣oWTT{t?�K�=u�VOiu?�/�׿gY?�׺L�'Cߺ^�Id�֗�{^3�~{&Փ�Z_!{K�=u�VOiuW
    ^c{{|:sOo%ӧook^�K�=u�VOiu?�/�׿gY?�׺L�'Cߺ^�Id�֗�{^3�~{&Փ�Z_!{K�=u�VOiu?�/�׿gY?�׺L�'CߺA�iC;bgz۲vGinAs1m?r=ݴwf8}۱;bn=onn<%v?;3L2/u):m.
    lݛr.جܽ={/C[djq{Ҽ8u
    -?CL�'Cߺ^�Id�֗�{^3�~/!wV?xZn^-K7=&N덫{A(:n]մvOޟܙhv&?si&r(V;{??�/�׿gY?�׺L�'Cߺ^�Id�֗�{^3�~/!wV?xZn^-K7=&N덫{A(:n]մvOޟܙhv&?si&r(V;{??�/�׿gY?�׺L�'Cߺ^�Id�֗�{^3�~{&Փ�Z_!{K�=u�VOiu?�/�׿gY?�׺L�'Cߺ@Ed�|_}�yxv6^8j_^׺7׺u{{^׺u{{^׺u{{^׺lş-�j�ŗse/Sz?�{?t�t�6[+On7Scz���UH�Wt�WҰIoml��}[O,{Ov�]bVv�Vz):N{{^�g�+/~AM7Y-Ge'\A7t݁�[�&-}պҞ?3i,
    ,6
    jfOu:_K_�d7w^{ޱ?n
    zw>E7훏_?{큥\d1lF&᩠^?_v6{c/L흙yAj`zmlfq]C骷P*)"9*1bu{ggu_w޿OQof�**Jocٛ{zgn[p9S
    KQj_uqڻ[|v
    s'�o*,wȓi2;ڝupg`=׺]|7޹__?�؟~Uv-(E+{mܵ[rӺ;k$)#5_k];_U'(7Qw%MG1�s==iQi}{aEr[SCAI5/K`]buw_
    u9�U{Ov\G޻dI޴NۍO3U0apw|{l'�_:;;8GJm=_dvXgq{f-pZ|dKK6蟈Rm?[ꎫ莯wcuG ۋ'H#]hvunwRzjs2T͡б/ɟU:+WN�e^_�3vsgƭ}�G}؛^Oc?ut~;ie3тܝ^;cjl~oQۻeeiY2>$r/TGoCwcyox{gg_0pl=k7miqn\FS&VIS9{'okQvg|tV+�=ɂ؝[mYYv}Ե9MozkzV&lOc(Sd1߼w7Suf>{{+.M}y~=geuY=*wlMi0hW%GOwL+#u.|{y_$msߝ45Kan߽~9o
    ~4>Lm�EojvW-xG!YGIf+}׺}}L_ע"v-?�?�?Ӟ;=5k^�G7e'?x3q7o{u`qޣ;p[fłz؛w;?c?Q>箤vdK;a-<yMAøTf
    T{w[Wv6?wRĺY>o�0nY{;���EَmڟxiM^|e/+WbtMO14KԻGoYf�bl=mh7Y1lG1t>!^Wcslzŝg2Cv|_sml۹ME&W	ei"*jH]A
    lb*w!wzx2ڛ+zlEju8Jib)1mO.On1M]A�ƝRӾw6;#˭]mҟ
    �Qt6c[qd[31.ai}C>=!�OPl7�x.;j|Ȭ'cu+m|W]E*m>XvIE.{�sO���ߺDO?1+:[צ�_1;nof�e'$[3۫sw7njkpVASVHhf׺-!/ʞw^*>}sؽz3'o/
    �['W]%n3ۇLK׺]fE_#U;&W?k;?j3[g7_TnTltNckfh)i;h=}{Mա|]d3|u�ފ>�t�Ҟ;׋W}׺}u~�"v/L~	כkv}K[wy`yOWEQ�Qdi:劶`eR=eW[Y(eCFBA5*:{;�^GqZEI4&dF1$
    _N}я7Klssm
    ->Ms[_1WfY܄;~|nᒌ7%b/p}]3\zr�\l8bg-	cbAelÙgK?rdkx)un;D`;pۭ-;.ko:-ֻc{{Tc4콧19ml>|or{)di竨XqWIO6KRRG
    pdXYR+y!4~23e<~W6"�~lųm~qm;Ŧiwsk;nҶP@L˻ڃoc@7/˻Bo=ۼ1o3LE-E|5'KEv飷6QX"xP0RIWL.t;E;}/?~^o-չytHu\V3x]9c
    w~Nw_`j{q#./5wvLrArr[-ztW%xr7
    m=ZAY;i'&m:4JYk\ɯCc(s|<_wfyy-dPeG3G̛͖"Kv.!XnmlfDq)b񸏌18],9YIiԔT{Sdd8zbz2TT$wf#N(9OP�3Pyx$znx?{nw+.8C#&9$G(#@_�D_>ĝBRoyԝ~ooO�KciwϏ́E]߿3Y>[kg_kLFAv0@1{t,'=-M՛yදzo+[;SA9nd:i*wnΐ؛ñ7-[w}zhRcw^~n|ln+޿3~m�.*I>!l쭕vnOuNn񾂞).b7DK|{~{+7~[}ax.d-9{56d]SqogXnl]F'lvO7uCqz^v�0~[o~A%O3G.b�Ut7~Fv̝7A}ܛꋰgCԾ>'N�{_f'bewJlOy}fOjoOt~Ӿa;	[.n%CX=׺�̻]ܽ{S�QSmM}'8/f{}fj=Hw5f �K:*v/]IY^_$:sv.؝{wxϸ[fbzn_ȧVպWl[Ujwy'{~#s;g9+nݻw=n�Sez	HvN#2@WQu[[OzcSυ?M6/ro/;;spN[7ghl폅=v9X
    'B/X�wc6&vWo~r-woo>~;vG_.w);;+l=&ˇMgC#ݟ!B_}/|߅}vOpf�ʻ\m[:cﺳydr;V�{[^+vo��t5|[�f�p^{^׺u{{^�_ïݟv|vާ|V&썙߹
    WTymݴٌVnWuz
    ˜zWܘ̙ʵe%=,0{t[~Sݓ{gǾX.[_͛;lԦ[l}Nuφ,7WW9pd_^{PN1
    \R^
    0gWw}ouU0mߨAʮsvllf,&OTX|u8/uW'svRoU^(7__/cn)w#>5}N6^mY$XZj^釡c_>j7S/Mۆ{}]|clڙl9WxHݫwџsf^7K >I|ϒ_v~Ktlf6L8/NMߛ:O{ⱸ,n+xgrj34+ȶ+
    |t;ۯjc+l诉Z]ӟ Ÿ7n]'UUrT[v]6tYJ�u7>}YTޥ}8_ٰ;;xm>.k6yknݑS<:KnUB뱾Z|߲?Xn}ܛgͤaWEg|؝_}Qv7:km~_~~�'9f'�$vS:2]a�[b>2^_𭳄ff?[{_�tvWh㺟!m[!Ϭ|n{GSn%'oMI]Q#+RtL?w^;~'k?wmWtݿ_.Q&a˩Yg*xľʽU_{td0<;[^ēk&Y7~nmп;&`1;�?%�[d	:l
    }ݸ}L[S:'ٶn_:�`vrm9nh1^{zs/�9T,�lC:g!OܽU>5e&1tYuoW39]w]MY?Jw77�{j~9?/wu~ʯ^(!KCu,Ednʝݸzha^f#Я3dt}MӲamKs*;�^Vnݛݳhn?Cd;Ghc׺Eȏoa`fnOCozmmnjsl{;=)njUB$^꯾IChlޣ꿖W]4K-v9{Wvl\m^o:_w%~Ukm_{_Sɾad7'xvƽ&M=Inuvoۡ~wMϔbw�
    ~K�xO`ɺt-&37E7]p/u!?tOlܿlu~sbn_s~Y�/~؇dtB{/e>}kL*b骳1lgybr8؛"g펔oPosS~^݁O9/_2Q|B
    X:~Ʉݕ;p.G{_g./n}e;SUw37/;׻gz:ݛ&~+Ov;ڏ
    Vt,wOO=7~u>6C3n򯱾tyN?mpmtWTf�{{w]|On;kof)Ϝg?6Yvޛ^?'m]?♊
    �s_yo_<~>|/}GC1&
    <U{�۴[fT/Ya9MKKɅk}׺5�Ov2|aꎧߒݓɺwm>=o{a|쬧]Wl)#;훡zMvrSrpluN=׺:;�ٗ=q+![]oK7;mu?ɍ페MMI[hPdŻ{ͥu{Ɵt>*f]~3C>e{Z/zcVqGj̏cUf&dVe>lv[d|}
    񿡾8uF-[ڛvm<~{w^C1e37L=}񻹳ow>mͭһKyI|	۷wN]%4Ou'yQmL{siz&vTuk�ʮX3=Yߛct^w_ƞ%Y~!tF흷є'?kt6nu?k|xFL>uѽU6~*u[oD?^{^׺u{{^׺u{{^׺u{{^5�|+�_mO:C?!Ҷ,o�Y=/OM#a�su�u�:?NӰIomm��}[_,{Ov�]bVv歇[o|):u{k#^jӗ=qǫDzWHţBy#}t=Bw[+zٻ۷in]6;QmŁ=^+7妫Zzy^9>+~6yt]
    �BaYy؜_kkNO?fe|^͛nݏer;n*ʢbx%4rDSC9H׺wYw5+�B?FlܦvtN~-ոf&qW`vUWa(&E_uӿٮ_3f3['wc�Ym15^+	EM-\5DR(t,rw??w�~׺	wYw5+�B?FlܦvtN~-ոf&qW`vUWa(&E_uӿٮ_3f3['wc�Ym15^+	EM-\5DR(t=Bw[+zٻ۷in]6;QmŁ=^+7妫Zzy^9>+~6yt]
    �BaYy؜_kkNO?fe|^͛nݏer;n*ʢbx%4rDSC9Ht	gql벰[f_knݥiv;l}F'=w,x7)iixFF t~�eEt7
    XugWbp_?OWO;?;�z6nS;Ur{Kv?_j~3Y;*	ⰔTTIOIl"/K'g1;Ke`*;wM^3n&>so͗޻qTQl[-e5uET$I#{tgԛ7T/S<ݽ}�fnnɐqvF{nQcr:]ѓy9jFFMz%/׺wYw5+�B?FlܦvtN~-ոf&qW`vUWa(&E_u{wNbvm|U^wtfݥL}N/w⨣=54ἷ~[)Vj2:ꊩIF^	ӿٮ_3f3['wc�Ym15^+	EM-\5DR(uv�нOћ7)9=ӻlw5n?UEUjXJ*ij䉪$6rF{A'םyml)Mdܵ~;unŚnVwn#{v�нOћ7)9=ӻlw5n?UEUjXJ*ij䉪$6rF{z_dzӧzbu?\m_޿M&W�v֋jj|G竩g${v�нOћ7)9=ӻlw5n?UEUjXJ*ij䉪$6rF{g_;ͯ߱�-�e|?sG�_4t	77=+bg;:yoh:uwVt;qbrYض&oC}e&fxOurk+?s]\NK윗Ztku蟮3{mya*R7L;[Vn]lӴnsm}ͷl۹NѤ3L$U4tQMQI#{'֟6K/ZtSN덵Ki~8j_.bXܭUmOu2t?�uN�g�ߺEv~?:54ޯsGq?ZZD#>ߺF/�Y���>c�2�?n/ӵѲ�O�?�|>oG�+?\o_LYo9Sz%C'
    k?;p>O5*T/TYǚMI_<mYXc:UqƧjqeos%6;kV5[[x6ڡLgz`|@Z
    |%ǎNjSRu\Sd٨Ha$u1f1kZXe\hr-F$|b"` PXԪ5O:Ys什m7sTwݯ١,,!i.X4GW>=θ%:c??g_+;�}OyMXm;V-JjHi5hxTӉ7~s>}75]{sw<O$<8覽	V_[e0v(q|E
    &/ŶSICPO-
    ,I0ƋqU��="T*T
    P(��P0:
    ;۶}5u34;I,Y$ܖf%IM7'ǫǽwO薡$H}w޿>6
    ;c/[in
    wGy}F'=}UMWb1SO+%C#}׺b?[a@=?|�{k�={3?/j�m߹}˾_e'K/C{'o8nmqtWo|￐yg+QzVl޵	cpABQ_KQ^u	7a_7>}as
    �?�I>&1jktӿٮ_3f3['wc�Ym15^+	EM-\5DR(t??bm.wx.wio
    ϶p;gwkXXb#qSmH"OFuH{W/LO-#{tru3yivW
    œS_=E'xQ.I`U{t�B�/O_%O^w`7<?l..8'ҟ7/k(}=8MREO/|g}כ׮ |m[˨YePmmgrd7[qm޼`49]e{pTce$jL>~n{ue>1V+_bPuwN7:‡{u?Y93uRbMn\\i+aHsʭ�
    ?[?>8{a֟6K/ZtSN덵Ki~8j_.bXܭUmOu2t|N܏YGC榛h޻'KPHr{^�rw??w�~׺'s�γ�Wq�W{rw??w�~׺'s�γ�Wq�W{rw??w�~׺	Y4;+B?y^vt6ql~ݳX&qPwoIfi%hK ou?FOEv_clL�WS`uXo-YNnun,NK;ܸ-bqC4O]BOo_[?;;Kvo}6!O-L;ESIWM,U$=׺;?F񏢻gì;O~q9_Pjǧ{Z|x=/piӽO:6/_d?eWkEbrU>#3Gc~o/.+?W:ë?/;wח~4׺]~<mާؘ+%�ave{c{/%CcraDEt�*߃[sn--ἷw/wn?pnmѹB-[=5y\w7Yj*j%y$vv$t|҆Hffc�?aػ٩/<9|d#;(ڟ'L8[koN'a1[O31i76޴wti
    ylNZ:J2xJzhdOusR`{6&wϱ2}{{8'6k6�0.�Jϖ-+f}CwoJ׺p[`6+%�z1Xoh8޴/(�\a6�RC]祉"_u_|gl}'luf썤3{lf?=-8قV"jWQOa)47?FZv^#Eb%Wt`czì(wS+c:7U.&,ؘAKG<3{kOϹ7=ް́rmճ[upu.2[7vf[i*--OCƟgU݉{klM�閏b0g{3=ۿuS�'��qKlX�^u~ohu^]}y�GKzì7oYo߫{W?ݝ*H><^쿄1Wl`._Xu3h:عnh]M$A%ZX!׷g~߿k񏢷}�_gXu�M_яZ1�H�c?<:V{pۭ;/񏢱]w1a;۩`1u֛wblLnrhbI_S
    D#UouȿѽSwωgܛ}[Xvf96-�:tؙ-ӛ{cwf?3l4sa{Oo쪿n=ɵ&Gv~N=_�n
    trqXMC{t?~݇{wݯwLݟvCge<s]޸,WM&JZzZ>H^e�-o=ѽ]_'c_.쾂
    �4GպvW;RSyIM)8GO?>/!c> |mepޝ8lL&C;횭�qc+)1gz3f͉q2TmdKzh>{3??>6:|giN<GL7椟nn-xvnTLMP`BS{ܗ~on켿>?tlJ.uXWon<'eL2X-5%4/}׺]<m׽�OSMO�E?1�Sٿ,4tY_aFG^|x;S{ven؛kc~{v_6d
    Վ;*(_gI#CO㍊uo�e>�e|0'�oeW'_k�~u_N�g�ߺA*wtuxja�AH&&J7׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^fk,oVW�,ۛ)ҟuCߴC_mwY[�{v_ҞG+=G��Wt�W԰Iomm��}[_,{Ov�]bVv歇[o|):u{_S�^nmYw-&fgnٶ;jT꘶gr>Y}ٷyvze.wS_LUnQUA4۝͸>aïk>Amϸ~\tf럌':z`R]EnTY*>^ݍ+?]6_sn_˃e];hu.7uT|MI~5lO~)!GNs2秓/{k~L|i�#>�fgvf_2zG~]'Ǿi={u:7wMm/%�GWJ�Ma^>aVc2zo5nbi>f}Ѿۯfyz'blmבQMߚؚ-ɛTbvKi?X_V|@'ݿ> |/뭁}u_'z/mz�.%<5>8R	tw/ɏ?}[Gߌ�:OH/ˤ>�gn^魥?
    Sr8Yɲ[>q>{<>|WvW/M�ƽMߟ[6'~;7{uڻï7/A$�M;
    =ɻ[E3u8N^>P}zOݴ;cDsgoս[vpb%9|t){_G՟̛;;m
    r|{
    {s3wAKIV|̞|40;5pM{#ھ/w^߽rza�wNWOG7qv.tn�kUU	Gy
    ُܙ0xՏmYw-&fgnٶ;jT꘶gr>Y}ٷyvze.wS_LUnQUCNS2Jv�]e�۲r?MPx;OO/]I:*W߽/e`2U#CJ5Y5M]_C��F/FW&|b|R>俽vq�	vmo_n7#EK%UxGF~�BKb\ؘ|>؝uT=ܸmݸ6-f?YR⬠^~;|%6o�W;[y|QP�/_,6?ʊﺶ#0z`wUVr3Kǽ7C�n{AC>@wYl>vX�)f?ڹ>í>?6�Sj(!13&=׺?7؛3v�]j{K|vc[kcv.wiic]QnJ\D{WEI^,^r?,;V6L7{#?2֛'Rl<{m}峲}uA�q�il9MKޙ3Rmu�ƍۻ'?ߊ}޽Co�!6gw=tُ݋#7^êoIeYz#!Nv,g-yJGRc}׺>n^Ƚm?;v/vRkKuu_Te6f_uRQLαO}׺'Wߎs;oq;);ћKun,-_wt-~))$fwewѶ:<OL
    Ci/G>@v/�ǵ|0On
    c0t/�Iw.s+|vr{\:X0~�*{OBn;'�Kc;{3xoO37c�E]o?X56Ef٬b';j=t|bY}o}W�_%
    ͷ՟Ť!޳a�AXߒ%tvV{yvw@�m9/ײvgjc{v2]M;7	9J}C7/qn!7_ڛջvL|Y}Ûp۞{9v�Y�37m{Cm'Yl팛1)5n&
    Ud6ޡLwV?;ǫ:Ӻ;.]uf0-s6w67#}u%-e?DG"u~{ߺEW/Y�u^F�w>N|ݟ:@woe,_>>'sURk>$'pm?1n_MU^ϵk׺O|?<oWqv|G(3Cu4q;c!ݗ٪VR%^?'O{`{vfY�5we_O[;~'uVuWn]Yu?}?SF?"vgrnE0��/z@w�W?5Q�A?ٿo)?e/?�v~�{��ߺJ]r|=>gn>ktY?v�ڐ|_>Qޝ?,7^oo3Rz
    q-{-F^ﶞoMpQ7fn\]&{an\vwMܻ}a{
    jZNcAT9"_u_&.��~u ['Jl[3콵}%՝>r|D�hgWiyt-ݘ:̞$ʯu�c~4l}M5[35M]m{m|XeC#w`mϓX͛=-IX}j=Ǹ;31ܹ/ugv1�_q�ltN|r+eg`[*}ӗj\UoM^{<\[k?�?ievL΢acbnLؽ]E5%dųGBe�u;w"wpnϏCe|Vvޝ=߹}ٙ
    ##.lmt߹18u>=W̏_;/ޝ?WJu_,6VTQmܛo;R:1SOo҂|qns!>@m޷ݙJ]?i_8t�{뱪%/Gcwflo\^|gT=;;cg�
    ~dlm?n<b잷ٽ׻%ӿw_`ufRmjެݛCze;{q*p�]ٿ{3=ztoS׿&{3uZ�%;md6�Y&|J;yv	_5>N	\'{7˯][?=K#;~Aoɽ=GwV_ug~*sC>|\7Nؕt=SҴ؜.!{Aan
    ~?�=uԛ; ;O|N֝1AS7�](9lKPg1U9FJ
    u
    ˺wmǬ/Dϐ{@w̟dtwpޢm۲>B7fo~AԻR`m|YEt6u�-?~w_ig>4b_|'}Kٻ?^hi)h!8P{tɋs�߃tju~{ߺ^׽uTw	in	s9QtX9r? y>߿:wN[peqo@pWlڨ鑚uۿ˯'BaN3?OjJIv�~L|iߛW`]Oڿ/|N'oo~=6}`s^Nv/x~C>_}a>@w^?v'uoiM]sr.Yw~XUwK#2qajvF/νpV˸;3{Cb`zsN}KgnŹru+.ٔU5t}';ޫ@u&tX׶'m;cbO[=c_"�xm-�OKY\fS;E]^?/]cŎ}ݟޥ�ف;]�g]av�ԽKy]�uGE��6#Y~T|͋O�H~tc{ۺ*|Ͽ6썁cs鏊x3{w;SlPeiMU7B�iܝ%s~rܿ/::gQlM՝9_<,|ω][ })�NUm%>+lo}qU_ca4yu_rYkE~<|y}
    ܴ?2�>y廻~/ST{>N^%nZ|V뤧wB!Olſ[df s3|`\;u]ٴɽ9
    ֛cndvPrj1TuU9Ou�7/:;pu`}_'lacd|q_4.rve|%~֥ۘ}vwh`M]^ �<;ǯv ;[u�~*rg{{zsmOB
    ݿ	:]jjl<K^_k='czߋ�oϐGY^�KYumtVIܴ�`mN.aճ˱qn_~ *�Ǽ]udtwO|??vtPt]gzQ@cnnٟ$ϫ{!|=ٴ(s}q7_Fjl[n	t?e?Q�evx�g'3�su�ui�{?c�4ߝ�?+{u{Ol��6;=׺,W4>1.mO?f`O+GǪԵ{W?_[gZooꞹ03]i77VPmN"!{�1s^ݿ U�,7>saawF;7W:_}GT/8M{G~1*k2#Gq.Z)׺1/ݭa{?'@_ܹ5u^^SokwomyWG-vu=׺꿚I�&�r.W�-]i]Rw-&�gvKs|l\tۗߺH
    ?9]} >O7Yn/?)>ۛxg>�H_+zvm
    \n
    WQ+ۮfr�?wŏ!mݟ?Y]n?uO�7`�^?ÿ͵pwus&E�odS.űzC?5`S#\G0Y<㶽~rb76�z�4mk>)�>emoX۟1z::|*7Dt掻r>Jɻ
    }AI5j{tX;#^oc{1E`;cyk[=$~dLg=XZ,V'1wP}[ݳ{t?~kz7qg7lj헻2}S]Mٕ�!/.Ы=Ǹ*~Xuu;p䱛>+׺0m]O#mwctGae;k[c{37Ww^]MdonmᷪrIG]SQޱ?u;'p̓-AkcA~^E1{3Uy̍Mvߏde3㤩zN`c"uP0}S;}V|/Ҿ0|w>wz2wߟ4?L?$;kvMN'$]7nTWhmyr)ۇ{cWe|ޟˮpmLGNnku?Wimt|\osJ6XmV%DY?=k9 ?Ǽ>8?/偽;~n峷ɪ.ٹ8>`"ڛm2X:sl}{ԿS.{^{^׺u{{^׺u{{^׺u{{^5�|+�_mO:C?!Ҷ,o�Y=/OM#_�s�^?v:?NհIomm��}[_,{Ov�]bVv歇[o|):u{_S�^j퍁k�yl{2[w֛?^ڿ~
    y#3xF`돃ltg|[n;3נW{k|`-ם5Q]:i|qSd#ƔijdSc!f3uCgڿ#v}_p|׾f0աt>Wo;{oj{{EeF^jz,DuuWn?A׺uu[ڴ8.|X�'om-O{zȳ8x7l;uOEЁ]]>Fwfmۛ}O<�Zu?m|zMOpUn>᭩s]R׺cv'xgei`ev<ű;nd۹FzkXUq`:}7oweLΟ{:fnZL>,udY<Z:e槢A^@?Pt.]#;6�_lmMaQ>:=t�CuM&w~R*p9UQbq?ҿVv_V�}{W_-zq�sO`�|vKn�}zw}GWa_o?`o}׺,qwo펂}Sft
    OcoEz6^^??*vxҍ-Llu 68uJ33oݿptu|aӭkO7Tm{w";q
    mN*U&*�0ǵw.ݿbӦڵerٶ7ޛ&pmʙֲ<-zQj̐?EoH><upuG=Ÿ;[vWΚձ7W|ivwn^O}%6nܞT֌;vO
    
    Ё]]>Fwfmۛ}O<�Zu?m|zMOpUn>᭩s]R׺>؛;:ѴEn7im݉
    عSSչݵ;inKp
    KOVd0TqVRZuB(ψ�;N_uԿ+1x́�v&ؕq|[յW;㒆'Q=TY׺4][;gqf퍹>=g[cǮn?tE\vڝ<U*:LU.?{~}_bn큻7`n-h
    #ncqVRͣzR7�G{=nfRJ<e%eFV4j=׺,o^ϵ~FiY{}w]gYո<aݫC}'Ŏ߲v1CvSZX1][;gqf퍹>=g[cǮn?tE\vڝ<U*:LU.?{>8(7O޿^OM{w)w?{ؙx_3o;r&V?KHr;3JgIJ33oݿptu|aӭkO7Tm{w";q
    mN*U&*׺;Wۯ{'6>v;cڸv͵_F:go#tdNۢfѦfy=yYK{t(:Wuvenٛ6냦S{?֝m_o;)qۏkjwWd1T�u�\U{%{7�¬VMg˼>9ˢfvMnYuU6CYP%^v1ڿӭzgr|A~Ouk{xMlNG�E)[tRc"gv/?)U;mwcp_'/2MوGwr5S|7ܴRrմ|&4TKS{WoͶ`vV莿unݝM6ԣ
    Yڞ؝m�J
    KU
    ʪ:k*=׺u~_L]e�{֟dmܗY_/7W`veg.ءm]{˼{Cy.=[%8wE.cf۹\uvժTtyf3'NM#~ޛMl|H
    ASWko.ƦN9y2{tC->h||twiP6lM�#0wwrz)cԸfa޲,eE%F3^@�'w?ـ�f}ӷv�f�A_ZG��q_i�~ugvKT<w_hDOW%OĪEo?Ս7~Gr3�~_L]e�{ՖW;:~x+>__>ѹ
    '9_6e|}~fy.cLmUq�'Nog�{+M6ʗvS˘2w鍇Gf|O8�]vݸ�r^gxLv+{�m ~E7v�%/ovAo޳ۛrl;2n]לڻ.|ؙ]1n.ӟ;St?_ߏxE7Dt�KfZ{{#5{uo}C{1G2m�~H*}&Vˌf{u8:^�>=״Wڛan7n~?cv絲ŚSX)Vq{teO{At�V2{Ԙԙ.ɮinZo|c3}}Oҏ9CKEOsA^?oR=!Oɳu\v>l�N|vG+7CmQe2u/|>q:tg�wum<�]_Ϗ/MOb1.w_\Q�L<Vm�%3/{s9_/}7ۿ1>q6S;ۧvY;Kuo\Ō;9w((v?nt�-Uܻ[o'�58~.~0o,au&mtæ|;;lɴS;ַstStG7m]e�>@|0]Ku[wg%~@oMa;Vx]ٺnxՋliL{t�_�Q� ���%_ߟ_ޟߵ3�?�{^�Uǥ3m#[wgi6ē}ͱ6u(llv'[m*�vҥRG)嬯zʏu	옺�'?;ߺFߺ^׽u~{ߺE(>Zu*۝ӝORuWn,n? ;km*k*pR;gPt^;n� 6~@?7սtE2Yw~|ٴ݁S[vGUMPl/IW{tX7G[Ȼ�뿑[]!1%yvǍ3om�
    -N['>լۻeAS._'Utoi|$|IGߓ�jzkpv6Κ[m=5zr쮒Ӷx-nݬTw�Vc}׺W/ނ΂?mpwed{/W~nx˹h>8΋뽛7G]h1?ki3X;'^?_gm]3`w{cxفN#Svƍ֯_r{g[#oa+S?}FF{~XnNx6#f;#;?vm=ힻn
    i^H&?*^1{k)^`ug=Cڟ ):ʳ:{O|m;0}];#}|vʋ\P1:͕K>r'&Sr6s{SUn
    ]ٽ
     2Oe8�-0>GuGȯGhGM&}{jwf۝OiM''n-Wп�[?p,
    ʭ`ݝv?izN/*-C!{uQKܯ�'#cw_hr0�3w1Zkg0{_Sʢd6TF1uvwȭN�Y�._G77?D'ms-nvZCQt>hfs
    ۫jU3ܭ>e{'OtOiw'bvB*o~Xplݣӛ	X<56eٛp[^mAϺD|�.O_;jo;۷�ҿbkN΢]?'>Gvv8>UvSu._{k][wVd7~1_WAV{_n�Ko�mŹv&RTuz�_}27vdd]~'oW׺k6;c|ߝ>?oƌƌǴUVկOi`wKn^:޷OQ6x-027INq
    ]
    ԹQE~HOr_*{7 >Eoݛv7ܬXƐɔ^?sElLWZw�ϗϱr�ߊ>ٽ'/>Smls}e_C7Әn[V1iNs-^?M{{K;@vmou?foQUoxsfXN_ɭ3/nvݛ{j%
    $Xf}׺ r|ݛW{|q >Nݿ_rvu~9;{>I򮋰woR@XG!Vb\��W}7m]WwcWzC~>on<CmOJwF?{RE>q1x^_Ըu&>C=Y�vM50X?}we|m_ҟ:r`Krvԯ[L/S{unw~ϛtO^e02jNjo][i/
    h0LiM3:#ʧL:u[�g�
    7|O}-;fa:�%s~Oػ6B>[
    ]m]BS1{�_Vufa
    k;na?ٵX/ޕMm5#~*'YUddt;j{Ě`aJ|g0pdK|v}~<2{r{biqL2ݸ׺PnPnC0~LOLϵ{77?`d7c3o2ۓelr7.MG0%=frEOpO% 7>>[u7#`vE_\`.mtޭfW̝%WsՕ
    |ԙ=w{{or0FIg|00`/gCjOvl
    s|O/qɶ=G2V
    ;׶->>>m}|>'a/5[>m^ٿ'vo]&nHp}ٙ6-1׺�~^�s��}KߺFߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺMY_�no�JoA'?~G~Εfo~�Jzlqo_󫷿�|Ώ�~ְIomm��}[_,{Ov�]bVv歇[o|):u{WCgş�`u?tl,'kgwW	+kTmMͼ2}Ee۵{qlM0%$l/!I2{tE[~]U_6^ow1&{>1e[+vCUSa৓4y޶_^�gssunuW򫧰[y|;ۆy0?{S!gsfHv~ŕnl-
    V	MLDz1~{ջg_ʮl-n}Lmћa!ڛUad5XJ%6
    y1Gk t,t/}vf͉{j{{pwYϼwslSMwL}4t}Ķl}&=uJɫ*1
    [gFw?
    Clތ~-یԸ͑=e=Ch<&*;WK$U5T2,DȾw77VퟗU*{ÿo2w?FnLIjnόYVbݐa+0x)Mjwбнٛ۳;O׫6'Ww'WlNN=g>ͳ5M6=3toms[aS+&tdN_!bvw|ep,_F٤!VQmWwٴS
    RIbQ2h'DWջg_ʮl-n}Lmћa!ڛUad5XJ%6
    y1Gk t,t/}vf͉{j{{pwYϼwslSMwL}4t}Ķl}&=uJɫ*1-ӗm؝\&/lQi76cq{[n]ųm6wpT´eؼbTL$T-љݟ|OwN3ni
    +:kn-gwOJɉ}ɌW<Ty)㬫^t3�}՟k~Eo;+�~~.l���o{t,mӶw>-tb3kU_nm+zڊeEM49ݟ~')H*1:Y95^:uc7}:o7J9kpwY>3kVN݁Wnl~2byKW׺z3{vgiWzf=WIԽ;Ǭg;vƩ;Ǧ~>mM~>ub[l6>غ|dՕtuY;zu?1w3'!ۭrz[l\~ﭳ[`qT</C2�gssunuW򫧰[y|;ۆy0?{S!gsfHv~ŕnl-
    V	MLDz1~]3+zbuwruvګ^yn;cTo?wM6?w:-Il]E>RjʺLoB}wѝzr7:{v6.>sdvYlP<O	ⰒIMm%<$!2/ECջg_ʮl-n}Lmћa!ڛUad5XJ%6
    y1Gk tߒ=x,7|Sx�{={!ovN뿉/ۖcv
    =F"*{tнٛ۳;O׫6'Ww'WlNN=g>ͳ5M6=3toms[aS+&t���{Fﮌos>4qg7N핸~O1Mfo[V!<G{u}tfl{	Qл+']ۋeU֬CM;byl&MHf'4ziOuog}MW`d7O/=g]&e?
    п59٧迈ICAѯ׽u~�"v/L~rClQWm<|ڹ.ʨ{3plޝǝULՔu5QI奆Z6no;gZ͓ P׆6
    _VpA(Y~oi?t7myZ]Kȶ/'=$4 +wuxGq,v̕57-Vj
    8<ݓMG,Sm~RRN,Sm
    ~ǞbJSWE# Zjw%4po1@XB${w7+yymםbhڋ{y.a羅pX˲Ķ;nXȞ57-Vj
    8<ݓMG,Sm~RRN,Sm
    ~ǞbJSWE# kϷo<k{G̗F5@Mb|2E�^o^^ouX#Kw{#2-걛V2"pG7.V}ToMfm]5Eכ''janLd~,F|sTY1	۽glĆQ&B$&I!E?�Us{4,o{Unw\Z~V5ܞ=_,$J96v/Z]wd{7qlТ$7UU5BCKI<4ďp盈/n!۶n,i4{q9Y	&hYP$ͺ͹s?[?2mowbHctݺMfM4qYuPm񽅲6n]KWonM6R*xrTˈP*kQfX5Gu[c@ $PE�H+c_poKݦMgܮlxK4M-:F<dtF*AdSP"v/Lk:
    �γ؟,>1d'
    dA`4fsgˬ];p}&7+%
    U�^RFV:wGOW^;l6.0=lܥ6ZʈuDtۿ2 o}F[i|ۺ1TO{'{Ϭ3xn/sVc7EM4=O߯70t5G<2F1tό#:enؘ�p6%v访ܻ`Rvf3[W3
    ^I?>OD3{^ٯ؝_iIq}e|t-kq
    G>@vf/1v6o
    ./'SG׺[Yo"/plN�gbtgv}I`b]sm/~z\}%9$4if=׺*_zw?Sݿw۶v|g	ћrK
    >l|N;qM*aCPI9{鞣<ߐ^erGm͛>{K{qu>٣r5LJ}A!VS	.]etJ?oe~Iv;O~w;K&_>BTY}[QEOdi
    TUu',ͷ	6oi}/p]Φq{흅w]|z}h)To/}4_3dQ>w{t:ssn+,۽OwjCm6cu/}ë3;;ٿ-;&fMÇ3wOSQ{c)ˬ^'۟;o	cr(v/#;οsYq[F>ed8lK̟o"�_ܿ]G_??S|�v?°__?y<Q>-�̉ؿ3c}t`=u~{ߺ^׽tT>b|?:[ړc}0Pgv>D/U Zfe1Mwώ[{g.fOrl,͍[zuUܘL^
    +mh%S$ۻoc|!H1vɿYgnt�`av&7_ߛr�l/vkd㶶ؔ[qYwK*
    mGK/s
    �x>EtV?_́�O_�Я?ҟ?}�5tcF|j|-vlvNx-ɳ<	~Uerlɺ1KmrQFOh9&1ד_	vޱ&iݩ}`gvFc9n[#<fqXWA-E>ާJHܯBeYv_qv.~_]{oM1b?nӐ`_sZZ*o<b5I")^'?:!q=oXez;`c;ed6.썳޽wwڝ߻7mrZJՂ)I`Y{O_VWEV&�uz6Ofnoy7Çp>qOW\fc$۹:zIOY]xts?qbcLy>]86_soIYzge7YnLM=Xo't=Tq{t,{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^'gog}tu=u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽tٚ�>[Օ�/_m~!P�c�W[]�l@V�,ݗo��}�:?	zװIomm��}[_,{Ov�]bVv歇[o|):u{WCgş�`ug3_+�LMҏ�Cz~!?�ߺU~)d|@{k6S3s}{x|nn
    ;;r^iLG
    x4
    mX.^Wn3G#;OJ>ݻ׬>0eww-m[V<%%=->؆eNY {tMl�6'Ş9?b|K��?i[W&/qSt˾?*x0X5T9fɴ8u~7|lcuq`goc2�/ν[osuFMٸ@szNݱݔw$
    -ENM=vk+ET1xu}zptgɎ]K
    ~9nne�Vb]C? >Do
    S3EQE0ޝf
    ~1S|l3?eg>N|O؟fo�C?|	�\|T2︷Oʩ+3MUzYm+{o>aX.�{svQvn?8Slwe6m#KQS:O]U^/{M:3l;c79wi>Y##ߵx슍ﲻS6MǮK)qz(T[C7ɾpO;{Qc~Uu�K77vvnl|ȾfQ}mT;nZlN3`</u~\uߊ{7]W?!܇io2tWLT}mϸL?]aZlE
    ?GtnjMV#76/Q;qd6~hq`qvv|K*CWf*(i掆A'Uw~L9o}{?7}o}�87=%c?n	WYO.nnúko=x.CstfsuC[:+&*>|Wb6nvg&6k"{_v힣޸ݹP{}I/oݙwj['NvmMqk)f-y
    uEy_1�ܝkŀwFbq?v]uE|HA}ͭջJ%&.@܆/77@nnu}5<Uo{!3!y-llw>+ps7;3XV5G͛&evNꆟ;)q^,~7v§/+6&CsUb3ufuko;3�nE|O�gâ;_֟3ۃ:of쿙;5�ܿd1uj[a׺2_z׼
    y??n3:wvmn
    ?Q޽5*1[j|]>ކrkyû_nIQ%lUb{kkn6~kgwkgh
    Rf֫ji0}^ 6�S�Ѹΰٶqg7G+7zܫwWn>\{]tz־NJLgAGĿ	ڝ#'~M:ff_1xO=ÕlPl/a,pͅr׺]|K^	׽_Q_7nͻ;otv_=ѻ]%z�J.	;CE^j���{~쭗f/ioAy4�6f'P`+be2ۢ1SY)LptLE*oQ݅'6X_^=Olcopb5ko_wOäOH}MC]
    헄^u]Wjqt7Z_K�=w
    ym7m\0[}wKٻ'=nNoKF;VKK{3~|[>ؐv?EtWZ⛭7f'/;;3m\MxDGN>�~{ߺE�ȝ�7;ߺE_ϋ_ p7rs{뚍�e0}C4%NOF$4Z2nYa}`۶nd6$+@c0KcJH�RE8q+odwnsk_!]=m-o7Km…7X(
    '|==9C�7m}Bx娺>mTUc#Cs̻n6�l+<~-ɉ!Ts[.u=M^j䝯lF,
    ՎHEcܶoqsoĦ++Ғc|N{)xzr+�!CboTۻèuu~Qt7=[]3}~کtG_YUW6=d(ɜ˶obnSM.mG[\b0U@os[.u=M^j䝯lF,
    ՎHEcܶoqsoĦ++Ғ=~O[[w6o~v<x݃90=Buk.OoIGW!#K![V5ڷiGS'\
    !cD0+dH\
    F7ڽx=۷M;Cln6V\m1-75Z%Wh|{M67iOzwWokmmyz-euMN7	\w6.<6D!
    UWUM4R(A6{Fo
    Y[m1[Heaq0mʡD1=-r\k\s.�G=ߺ&߹mTxYn#I]$?]
    IfǓ{˴M4V}
    sC9||N=^
    =f"qOQF<"1S,[!]O=C,	ZpCӔ#myrbmpoDL	pM2LfXV`o0F[�f�pYoO}COe�
    s;`3/v~ݟ8�v�Ru{?ɸ2GZ{tUVGum\oShV||f�4d;x?1nWg{ܵ;*jZmŷ:g'ݛN#Tt^?-.ZxOܿ�3ou;ko{}۴?`uSd*6t{knôZ}QK�+>'۱u>_+ѿ~|~v1ʋvCn`vYvv꽃͛;;ZLcÅt{*8Uk=׺:ov[~uv_c9Hd~3;2{)Zz3s`!l)7?Y^?SL/7Iߑ=E_m�kvoۛ7ebwnl}Uϓef≲8f;{=~LW_Kco<eoGoC'KL{u޳`15n*7R.|mS1^'-�E'LΙ�(1Y3?~xMAi"v|Qź7Dm5edDdOuO?,(,Rn{sktzWez޳^﨨6I#rwQd0I> C]#Ob:{3>67'e2CFw6Θ?gۘ{kb;_rguMsr3ޞz*gvMg~+s2d]o9liAT�3ٟ%;k;՟fٰoomُ	gHsiu?dw/\VK�̾�\�*5O}>VdٜUW,[~*X {_%Խ?>-qSlH;+zWqM֛pom�D[˅֙.N|<?I룧Ju��D_>׺0׺u{{^׺;O/T?:{q_KKq`]u}yYл#knfl~n[D{7C켅En>Yv2<@WN|Sz6[_n"7ٹle:�Ǟػw}f/m-͹cX|`))X7>LSrQsU-G&~HwStT=Y+V){c3Wȸp;:j>�F?Ɏ3m/w_d7oQSf׺&_?][Bv~6vx>V|owXmϟ$~~zO*n\?swel6plGn|dfg{%oݹM7ƍ}Na.XL v;tOrl}9ڛewgTTȩpm> 	2sA{u=-?;{{Jf`|5coȿu\n8{+kd2#c!t:s��oFn>/ڽigDl�FkM/_;ֻGM�=r>j	vGck/A?b-#lްRb_o߱}7sl~w@o.}MW^<GZm貹
    C>ez6Cv/�/7^!s|3?1:Kh?==O;7^뺌V3uM(npP}׺~	oyw߂N۵wnY;[t? d&uٜƮ7lmw-.JO&C.OMW{׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^OoD?^{^׺u{{^׺u{{^׺u{{^5�|+�_mO:C?!Ҷ,o�Y=/OM#c�s�^�1�]s�߽аIomm��}[_,{Ov�]bVv歇[o|):u{s[Cs۵�umIW~̡�'O%-Kڮ,@ _{]{V۹AYI]L2XQ‡ma<жWM
    yp=d{?wv�X_7�mt�=4~Vv~jۖ2+k6cVmGnf/!Qb咂8+BMQEQOQ+q{iȒeؘ�̽])ST-M,e%H'mnhn�px8ْ�b7�m_OJ�׿ْ�bo1�k׿}�O%?�뻴�_c�~?+2M9�Yőݹj~WS:ug]Sk}ۓ-,02Pc*&+
    <2ܾr$1K3LQ%5�ҫ!f>8�u޷VeQt*M2HN:i_2.쭍�6Wa=v~k�۷GO}c�brં
    4p]Uѫx"2A�7'x⎤4zV%?�뻴�G7�m꿾OJ�׿ْ�bo1�k׿}�O%?�뻴�_c�~?+2A?r|�	ϲewf3lFMӼ)xpY֛?K2yiR|e%ja~m0% TSΔbwaBVAvxGr5�NDk�`gM=Ssϝ_fo^ nW=ҹ,w/Ql,gl,S
    M$d`nÑܥcO2аW.$ETUK
    TvJTqn�fK�wi�ٟ7�m{SwO?{7�m߾OJ�׿ْ�bo1�k׿}�O�ژ,{gmr9Ÿ폇`0Xz99|k/Sx^>Ijg8`6weU$7/R>Щ)ffpT5�$zݝV&Z;zv�fK�wi�۟_c�~?+2M80X]Ŏݹj|~Pjg`Q]Mkko-3di)k
    
    D1J^r$E2lL0%ҵԭ e>08 u޷UfSt*
    0G@F:v�fK�wi�۟_c�~?+2^�fK�wi�߿ֿ�U?o^We?̗t�g��#я\޽t�=4VvfGv1NG5]O
    םG5uL8]csnLMA4+3riȐ,ϱ1DRLLJ*qzYEЩ4ʠ"8=鿟GyݕXVmYǺvfEfg꿻'VO+iU%T1$yۭ$1,[^Du!LtT(2RM0I.Fr2<X�fK�wi��o1�k_OJ�'?#wJon�gm윍.޹6ظyfzVFo8qؼ7/R>Щ)ffpT5�$zݝV&Z;z[%?�뻴�o1�kֿ}�O�ژ,{gmr9Ÿ폇`0Xz99|k/Sx^>Ijg8`6weU$7/R>Щ)ffpT5�$zݝV&Z;zv�fK�wi�۟_c�~?+2^�fK�wi�߿ֿ�U?o^We?s�,{3j`[tvn'm흷>aYGOqxy'HݕTܾK<ByªRL�pO[]vvU[X�jO.��]ݧ�/n#я\޵t�="z`c.׏dMYa1Y
    ՞le)f-$m4QLu5ItB*5+HOmY
    L*(~юwO?{skZ{SwO?{7�m߾OJ�׿ْ�bo1�k׿}�O%?�뻴�_c�~?+2^�fK�wi�߿ֿ�U?o^We?̗t�g��#я\޽t�='tf흳1uT_T�1UUry*\mVP�7�m߾OJ�҃.��]ݧ�/~�ZF�V�{�)_�z2]�=O�^�F?q�[zR)�@d{?wv�XkZ{SwO?{7�m߾OJ�׿ْ�bo1�k׿}�O%?�뻴�_c�~?+2^�fK�wi�߿ֿ�U?o^We?̗t�g��#я\޽t�={.��]ݧ�/~�ZF�V�{�)_�z2]�=O�^�F?q�[zR)�@d{?wv�XkZ{SwO?{7�m߾OJ�׿ْ�bo1�k׿}�OXw/&7ʋ6
    *O%]T둭��ZF�V�{�)_�zP%?�뻴�_c�~?+2^�fK�wi�߿ֿ�U?o^We?̗t�g��#я\޽t�={.��]ݧ�/~�ZF�V�{�)_�z2]�=O�^�F?q�[zR)�@d{?wv�XkZ{SwO?{7�m߾OJ�׿ْ�bo1�k׿}�O%?�뻴�_c�~?+2^�fK�wi�߿ֿ�U?o^We?̗t�g��#я\޽t�={.��]ݧ�/~�ZF�V�{�)_�z2]�=O�^�F?q�[zR)�@d{?wv�XkZ{SwO?{7�m߾OJ�׿ْ�bo1�k׿}�O%?�뻴�_c�~?+2^�fK�wi�߿ֿ�U?o^We?̗t�g��#я\޽t�={.��]ݧ�/~�ZF�V�{�)_�z2]�=O�^�F?q�[zR)�@d{?wv�XkZ{SwO?{7�m߾OJ�׿ْ�bo1�k׿}�O%?�뻴�_c�~?+2^�fK�wi�߿ֿ�U?o^We?̗t�g��#я\޽t�={.��]ݧ�/~�ZF�V�{�)_�z2]�=O�^�F?q�[zR)�@d{?wv�XkZ{SwO?{7�m߾OJ�׿ْ�bo1�k׿}�O%?�뻴�_c�~?+2^�fK�wi�߿ֿ�U?o^We?̗t�g��#я\޽t�={.��]ݧ�/~�ZF�V�{�)_�z:�w.kw~�[c!)<it4�0SR㥦EM$>mv;75neu3ST1˖cVbrOPt0ڧ	mR:a:u{{^׺u{{^׺u{{^׺lş-�j�ŗse/Sz?�{?t�t�6[+On7Scz��W�}ueѰIoml��}[O,{Ov�]bVv�Vz):N{{^
    b{_�+�7^%�USv^Sg7f?/}u~F)ֻio\S;IO6%7+h {yZAR$x<l¢
    P~?i+';|U9;Kz[l\
    ۸]W`]>F'
    SN	yZx"{_Q4(ԂT8J+rcGRgH;FDUf1Gr׉l*(({1wn©�!wn}Ʈm۽[mkwuG0g6cls#
    >Oki^웝\^<$F ZLg_E;D'"qդ;$	VBXFnV[q9ܝN>BO||~0&u!=~ES�=r
    $ٙOًRˆٕ4nx/nܯ*^jkZRq΁(L/*zFhc2b#Px̥;AfETpzv>
    Yx/aRfoto֕N[+lSKݝ-⚃vn~k!lNiʍ|-eDYBEq12(�/$,t:bD^'T`�/W*V,c{JS8c0GrK=v^SIZR[
    :徆+1|1)ZJ5)*Zj]:EOR2?Nև˪[|M6ue~n.G>`mŃԛ{'X<D<MW`[IyhUs9F#/I "k[-VQI0C10ݤṞD`bGLŠY{!ƀjE-+(	lyb3-޿1s;o?ƽ]]c�{̖cc
    {nvWm׫Բ,xy#-(@d#&KțA$P^<hRR_єf|?KU.r&NWB:Cu-7nf{~~cmU{~9~9Ra[Gznܻ'ggjKtKCO]>
    ǸIn�i-4SKnm"&M- HP9FIL2JqHtPbY�0Okv6>DMӰ6;.%twgfs/>/7QQSOA4tF%-iyEvQmo%*fު7i2IE
    	T(FI.9BkP|ok}{_eȮż|v[bl=IKCJ,mUյL@uh**E+9vRԖ:KV+H2)%@ըR@<2
    3N=_:d;'7:CM{{wm
    1O}!{2<gcb)6K r`q˧}%g`^@M3H"Hhb@EA_1\hHVce]qUA#Q*RUUKO_�o�M��yٱ�gSo-y7Ͽ>�u?_�%�q#v<o<//
    o+xOݫ]>'<Oz-Z-|_Fk)^G2i'ƍwit콳6wN?n.CUN3Pjzy G`=]m=iF_
    n&8	 +U`"ZܬmHSDM@|>l/~ퟏ�?;s!~Ňl
    }C>+׾ԃ>Iv͞Hl9=VyhHpmrϹn
    dT!/߾cSƹ]q:AHk/N0:QcZ0&TZToY�yNߟ1w1;3~/vwm{E֔յAeR*gg=Vj6-XDrOC]2?Nug`cei@NF
    0c]w|5N>0hqFoRtr|.]f9i4)>-)61.͵ZIUWnV'>:oi
    U|
    ,\
    	^qQR3M;y0kcGE?n&U.-YͻsyNUlYbuY6<K{˞[ϩ],~^;fUn_dêH5j1KҧHAQ(S.=IA٪LPjO;gھ�04rwkLdAޛ_wMܻ?׃uEva<45y\-mn鷋#iyO$QYҖ؂A03h#H(muʐq!iSO[<=3;>w}UfSr=Qgf۽sc-!9RКE<$0⭂Y_Mot2I3N5L<q=Ј] PV^nm%x4N(3Zj/�]�?z?O�3Z?�xy>�[o5kJ
    kS]>/^I]okJSOJc$o2=Uیl=ٽvNï-ӽwN;[tw/v�>0SPNA`z	I$JHQY5*85y$)*h^
    H�T*jNiN$tHi7e&.;sqn_4M[;K}d:y0ۮ=j7UVu[[1τ;
    zHkzsƗ	2mryTjCWbmY!^0
    ݕ%
    TЍB Q=ZsOYM>]c_W2_,v=_)7FwBuB$Sng*Wgunn큔F
    p=6ƒ!h^!c.|&9meI`fE(бvh;75#ԫJ6~NSgYmۯguRm|wevBl'5?]򃫿9nm)rR7Geyr3mKwHI.I&/h[hBKjJ,s׌{e1h@HA],jJάGmu56w~fa\vmG,gSsYN,n.7t4̈́lU]PhxZV+V!MNj0Xg<Pھ]pHK#:4|=P_4;ݿKu>ԡe7~lFvVlڙ7Y&wm'1jLˏ-/V+5Ķ*ru\`C)*BUW "&ɥ
    dӢݲ|~]uN3v>쭣7'ams3	W[NGn#JlIC-KT5J
    KYGl<w$PE7>ƘhK6.
    s!R�5@J
    fpvhzs?G^Ϋ
    I#svvl|?|<W9m3(Kv=:C65*0RxݶDx[A!%5LbGw	"ҳ]?
    ~l3-uv7MM?9~Puw7-ͳsE6.J\}w1=FvW,6ܑ^$tĒDhj2f$-$t!7=PS4t+֤=W]?MS>Zv;#T&7]|1Z|M>OtA8mK3mV6*[g԰ԧRэ5[Jo!3�0pqp**Fuq߽�GŪϛG6VM;pmNIMޘU/-˹v~CsUΣuOYYp{bILLRӰrK;bbۜ{RY$	éYdX$p]R	M�CIէVWe-7nf{~~cmU{~9~9Ra[Gznܻ'ggjKtKCO]>
    (U%]opo�ZhۀD7SM&N[AsE&0!+Ɗʯ"SGkMA~Qdb9<w].[7N_8|Giݝ̼EEM>F
    Qrz/;vEtGzC(cڪߑΆ3X%('[Sdyq$OwE{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^Օ-_LV͟Gd�]ouh=~{ߺ^׽u~{ߺ^׽u~{ߺ^׽tٚ�>[Օ�/_m~!^*":_vCq&K!<B9"PK冏hdR%Oe՟ ֶWWȷY2BUL0?Dg#&*h[ȑ33jxϩ%69[TWr][)sco+pDF
    DuAa\<Pt{ƵUq$R�	E33=��W�7_ҰIomm��}[O,{Ov�]bVv歇[o|):u{d_7�֭};�yz*�u>UN[ScvV}ekgݻ[/7#I<'!?-,/⨂9Ί,-o{[hjjGPhAV��RG\p Ӷژ,.\N;omݻQXv#c8}<pSSApj�r((%HBU@U��LKRO}ON{ߺ^{ؽjdwv[ޝ:]{tQ|6T9ôq9]MLYqWUSU0$//%"Rkb1b$UyK�R `
    Tf:龽{Q:wc׹ɟߔ=yN%tK۾X62-SX6Zb/Ⱊ7H}.LzWSUN+ӑ4"ՠZₙt
    k^l�na?�d'
    yj'F1	kem6](EI&RI4$'<+9IgS{^=T=6S-0ۀZfdnSarP10nmY
    5}1!kSI44,o;eYmYCJ;#i>cRUXw)*A.K9T+ ��Gھ=쮣Rm~}A?C{+e㩳TэcTԤbdTG%aDn60@PY]C�@`Z+Ƅ>iabԥA ^I?>v��}?�p?g�3^?'O1/i}txZ|Mt�CѮuc::UOOi<N+ce?l{s|dqSv^�!Uk$hz[kWm4j"2 ЀGHn(H#0zI'vBmlv쪍Kͳfi}t<av.\Vm知gG<O>Rd5Utm0%D*
    )J
    1#PHb]L$GM@U03TkC"gnݝ7{W^ N;Y}Gjq[O{]_?R`ISY^ʹ;eO!c 3$$HGtd `t\Z!cC�[Ad=
    [V޽r-]s-pm=݌b3h\ye}}m6"l\9
    _Zvd4c=*C:	*V`C.jatH`4$dVКV P+CN^I?>v��}?�p?g�3^?'O1/i}txZ|Mt�CѮuc::UOOi<N+ce?l{s|dqSv^�!Uk$hz[kWm4j"2 ЀGHn(H#0zV{Q:u{jr`ZT4wjg`Q]MkkvsmPΫSA45*:+qJE#aYZTjV�qՙJ)A##۝WRݵ9Lݘm.~o&cs*k0n۟?{�?o?
    +,c+*^}-aܞYI#$RɨB4f)#PG $ԅYBZ!@EH,5qE
    @OkC"gnݝ7{W^ N;Y}Gjq[O{]_?R`ISYʝ9hw$$(C\AfHI$4@+0$sephQnri87n[z_mv̶vMv3ߘl.;wpT;Cuhg؊p)~iڦkHY̫'c$
    F:Y3U"ZBiZ@
    8tvݕanan�
    e6~!cઃ Eեk{mMHM"B #$ʸAƦް]_Z�<ӭޘ^?GAW24xm~̅NByELI䁨kEUۑ<Ɛ
    \pLa5$ii,I&I%|Dҟ:ҞtY+ce?l{s|dqSv^�!Uk$h?iu궚5tjUpMTh@#$F7u$=+=4sTy9aAl5Ƭy܎;qcy
    MFC,9Zj*z[UK(`2+)S�Ҡjie)*A6e*hix1Ϋ׽u~{+6Uw`
    vZlevwl=
    ܻpeܴ453<+
    Kmٮل{Q݋;h;vUT'q($HO?ڵm[Shm̴8
    ^tZ<&juc
    ػ-;SZ4:oOg-xۣi>$3D厐*EbB&Q"4"eaLԒ	jEMzvڝb^UźOZv^'GU;3ҹ,~m̅KL;%CUCOS}o]Zw	uA*J	!
    juddI":ԫp:I+i\Z4Bg[_5ܛgrbq<?QÑf|t')zj$]*)x%W2UR0A`edfVRxzvU׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^ʿ
    /_}{_t?y?ԃ.}o`zu{{^׺u{{^׺u{{^׺lş-�j�ŗse/Sz~N
    
    {/qUH@x{d:zHhǨ1.֯"ݱRSܶ2I"Dz$Eo(Imnn�MB$o~ƚMRbSN$tuR?q/52
    yɦmǑQ=KHd?b౽<8?e
    53H3�suv�z�}u'?ӰIoml��}[O,{Ov�]bVv�Vz):N{{^
    b{_�+�7^%�U.u{{^|wzGY�D�eه�AK)[?ݯ��3#;>�A7aO^t]tN~Gf:ujZWg^w,	>><gN�0?!~㪾NYWeg#z~GG
    Rlg`UC&7,/Ό),G-dHmV[S7A
    %
    XPZlMov3]M};7ylϝ;zvVm[V|>VmMŶڻ沯PdU5%Sz_}$wʋ+pHё$%@2c2[L/IPb�(A\Ozd'߿&l�_><vp'U&٢}~XoGu7vr-Ы6+%(c.hbu[$kyf)7+I$7ETkn3w842j:081PxIбso�=Ot?&I>2c/cdv6gF3_{h7:1))k#묂ːUϹ|3{O5Xm||!aHni>
    t?G;U5UYBe!;hi+_x.n|W>MT;\wc?0;}Bva?I0u~%Dv42Խ5NY$Qvk(}
    RG.䙢#jG
    )b֥xM)L�c
    RL_O3J8L?SoiY�K�2XQus}%ww;NY6𾗤~36oI,w;3�ż8w(\\sSId?fM:2RկhXh�
    `TdZ.o7~{G򛿺14Onn݅nzܽjw7R[fM[Q1{V>۹v##ڴ$+6Ws엿@KVi^-17BxSC8FVC94O}M59i_icv.{K[-A;(�ej7ӴG!ķ&ee]U/.tGTg4B%JSH{rxƕ5SMJg(Y�#zw.:~;[b_%_~}Kۗ]a}f~Uٷ}7֞DT|OCƂ&HCJ%+gH_B�
    tҵ4ֿ5D�lŝ۲gydg<W|m;[>*us&[ö|ɦ;G!6.礨|YKCpa3gw˱\[nݞC֨[Xfm38%PmĔeKx}-;UG5%KU=,%WCwǺO�6|ɽ^Y3>}uoe:qc6
    54;jvvW̓,Ktes
    dl
    '3aķZ,2E&%D0eiZAxL\7=$*C2V(\7CN)o^n}I:fKE66/zVEsUڽteݫ3~[Q"UJj"3w&NYۮ/mIpf2@A/q̈!XndǡѓNfWD;/ܬ
    ~7m|-ä:{7쮰n꽙ܔ4S!-U4R=T)	͚hdH:D*�Z	4=Wp`Up&aˤlЯ=û n|EoZ_co^x-+{wqo:~9ݯ؛frRR}ŒUG5mD89S>n-2]Z01#ʊJb𝔢#5%FR!p0
    IFP5j�Ԑ;OLN;'쿇'~wfnN_gmYmЯC,Cm:wa
    J^+]fs@dKKi#bWh#X,j^%mm�"
    KƠO�i;?|u?Wl#?1O0tW
    Yܟ:Gu^tN<Oi"|Xnš;<^ݥՅ1mGtZMZ[	-oqp4SJ%m.A&m%V)A	
    <,WLl
    ]jJa>=n
    C~MuٝY;{);iTl71e(2[+xk&edQ9
    u%fV+10
    5y/j'Y+J-:Op@D˨WZWp
    �;7kBɽz󩺋e&O.vؽYuWj~їv1luDWPk)aܙ9gna&3,2"㨅bْ#v+FM:ji\ydtr|5ݵ;g~wñ;޻+f;rPb;'kmLCf<::ETJR2s'6h	Xbu)"`�HXkT$]R)Vv`C,i}?.~_dtN�sمVߐ�c:}P]ۛ/+�k=ozr��,>oÏ06Z#J/x@di]2kX¡NVTu�Mv_l~Bo,]mzkvN~ܛ?oytxv֯4ۧh6wOXk)hv,3lv+m;r[bk2-y4PJ
    oGjH4z�pvP	}J2jn])?7�[k5;fugϮP,fmSnrߐ{xŔn~ᬚ-D{CL6xKEZ&H04佨f+H#鋀XH`Z&]Bp#
    Ѕˆ=�ˣ]Egݣ+v|&ڝ6NLfyNܻ?!9t]gQ8=ѱwb$K&)iwvŷ8XI!SԳ!#I2$H
    ;8#wH$ M4:�u
    'VXA^O\t辥�fѱVշMofקl?=77mh3n|sDVS?�X'KVV:Iz4ⶁx]4|n_Ki2F֨j4t=G~jƒa|I[v쾨}=IW`z|Nٵ9*\llSRScdP->Գ9&h,bXHHH!P$!ժ'+6�*BŅjƆMi'pu|px?$_!z/=ؿ~N؝i8+}l
    -O}YE`0XMGNzL2UVI7gٮb7$H3:X�F!4H=,4WsAxo@$BRw1ĵ@,ZvO�1z7O};She7'ǎkם:{O.z;hv(}<p׷iouac[|QqVBK[G
    ҉nt1K5IpGIePBBm(KUWZOuۂ�|m/ߓ{𽅶]c6gV|Nuljhv=f쯛-YJpɡY<No4imoYd9LL#M^Kډ`Ҵ:1l7=$*C2V(\7CN)o^n}I:fKE66/zVEsUڽteݫ3~[Q"UJj"3w&NYۮ/mIpf2@A/q̈!XndǡѓNfWD;/ܬ
    ~7m|-ä:{7쮰n꽙ܔ4S!-U4R=T)	͚hdH:D*�Z	4=Wp`Up&aˣhk,>؜i~j*9en,t3dvGo:	%"a
    Xܬ±`UZX$29c<5-U#K)#!XzyOy~!؉ka2}(]_);zlf-;oe}uhy)j0̕4է'uuKib;H%K$&4u&TC@|$`EVcTw)xҢA'z�+v*p흧j*~^|F=ոlfN|_pd{{#kv6Ϫ;x2;^/ܰS�ɹ5
    MnAib
    /4ud[O3Ap/ZI-㹂@d*�4j*:AFPk_J͵Wӝش..WΊ\B``ȷ_MCۛU?c[N+BMٴ,mSF'6}bZl,wٗDf?&(5Lj,SmAUNMwhS]-׌&kF�ϐiYŲ4?
    ]r)7fh~ƲhOlD木YE4-$W"MQ2
    +HK�</ExA+F?%rj2gmo-&�N]?vNk6
    ݛBhR3l7sRVQǍ'u{[h@P_
    HW+:@#2yHR.tI@uU�BM=%ݍ[6aEMs['>�}y>Ϥv_Ofcl.J\V7faͯb3
    :{ev7Iu=sR&h\IX3�
    HF8vS.3,h�@4#NK�|Nv[.;/&;{0XMQjvoVð-ͳ2;WKOv5
    :kˑʱ2KudRʢS\*(8c,*L
    4BU:5Z1jEE4o?g(8[vw.騢u7=ݽ>3Aɴڇ
    )v-)Q=#RB,get�qIAnHGAnфƴBWH`(o@z`55F�I:u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺u{{^׺�{�)j^^w�hu K�m�n^{{^׺u{{^׺u{{^׺u3_gڲ�qeK�>ވ>mwMTt}#%Z*LiJ7FVD~#@yBgMۋB[ުl,[1/8T-QViM~iKvcĒkogd0i)WnڵZn`2Y?AlM\8Y$!Qਊjy%潣ratBTxH. =j\cVOMw|&X}$t?W?1_Y/�_]aw	z԰Ioml��}[O,{Ov�]bVv歇[o|):u{G_0sli_?KƘ%��<?}_Kx:5h?KRҘzI}kkӪiB
    O^W7'?|{�
    9����7'?|{�g?ïV?1�CnO�c^cܟ����X�׿?�=�߿�
    9�{�/r�{�ǿs�\:c_?^����Ϗ~�_6?u?~QQ*M9^}A?C{+vQgih٪LFL}>Z:Lʁࣽr`y*j$�V#ϧ#abLJT)~/nO|?�Տ~�{��>=|?�׿��7'?|{�g?ïV?1�CnO�c^cܟ����X�׿?�=�߿�
    9�{�/r�{�ǿs�\:c_?^����Ϗ~�_6?u?~�
    ��a�lpՏ~�{��>=|?�׿��7'?|{�g?ïV?1�CnO�c^cܟ����X�׿?�=�߿�
    9�{�/r�{�ǿs�\:c_?^����Ϗ~�_6?u?~�
    ��a�lpՏ~�{��>=|?�׿��7'?|{�g?ïV?1�CnO�c^cܟ����X�Nc`8>-PzG>wur;tfPC.[rnl^FY]U5D\PHyMQ3Qn�3P[f%,I9'-3&e<t�
    ��a��_6?u?~�
    ��a�lpՏ~�{��>=|?�׿��7'?|{�g?ïV?1�CnO�c^c'>ݕa禰ke�i2?2>
    <[:+^Z@MHSB*0@<GWN\x<{WZlmLk~8۸,=8Fo*|~/54ƨ"("9MRPp@��[ٙbjIL{v����Ϗns�\:c_?^����Ϗ~�_6?u?~�
    ��a�lpՏ~�{��>=|?�׿��7'?|{�g?ïV?1�CӟX-ׂm}8ɶw&'#[w?tyQbr 9!YXܾ<R?)UVR(U`0z#+-
    A	}GNܟ���cZcܟ����X�׿?�=�߿�
    9�{�/r�{�ǿs�\:c_?^����Ϗ~�_6?u?~�
    ��a�lpՏ~�{��>=|?�׿��7'?|{�g?ïV?1�CnO�c^cܟ����X�׿?�=�߿�
    9�{�/r�{�ǿs�\:c_?^����Ϗ~�_6?u?~�
    ��a�lpՏ~�{��>=|?�׿��7'?|{�g?ïV?1�CnO�c^cܟ����X�׿?�=�߿�
    9�{�/r�{�ǿs�\:c_?^����Ϗ~�_6?u?~�
    ��a�lpՏ~�{��>=|?�׿��7'?|{�g?ïV?1�CnO�c^cܟ����X�׿?�=�߿�
    9�{�/r�{�ǿs�\:c_?^����Ϗ~�_6?u?~�
    ��a�lpՏ~�{��>=|?�׿��7'?|{�g?ïV?1�CnO�c^cܟ����X�׿?�=�߿�
    9�{�/r�{�ǿs�\:c_?^����Ϗ~�_6?u?~�
    ��a�lpՏ~�{��>=|?�׿��7'?|{�g?ïV?1�CnO�c^cܟ����X�׿?�=�߿�
    9�{�/r�{�ǿs�\:c_?^����Ϗ~�_6?u?~�
    ��a�lpՏ~�_�||}?>ίk>֯LE}޾vjMt3J ;X\ҕ'OFJu{{^׺u{{^׺u{{^׺lş-�j�ŗse/Szߙr]S]ti'7ԥ$XYSUJ<l/:3@ZVcE[4{6(oS_)e?Y{Im`&>&7ԴwM%ڵ4W[Tih!4mUxLӽfO&3,ZښyIvt{4h
    ')�suwݏu�W]b	z4=� ]yW#CzTjе>ݢT
    [^ޕ#.SW?No֢�[8oш_}6;#c6�C>:n&)g=pO$.Yk1^9+rucai+*c@ʊZs{"IR@h?OE߃�^mɗ+#S�g'/},Oޤqޏ!_?Xp;�ߺ0�@o_q?*}~0u�C(��z�zط'/zg|0auߩ_/[c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_g|0auߩ_/^c_rqJ|e6fX0/w.6~Ur\~~@5h8}9^EOpHf27WVO[Q6_rvVFFz̄s;6>&fu5ieiohmtF@Kp��m8P0bN$(ڬI%_3Đ	Y6W|Ős螝䰹C/fc/MSd7N[}c(IMQ"W*5<ڭ_ݐ:m2ԪYYAS[>OӉKm$"X�s(T54*hG̿/}0��W�9_8rG[|�oH{w7h�z߻];:�1S8W(7릨XojQdmڟxES-H<)iFhl79jiU1ٮl!HTJqe3a}66fն<*T3TOj]45zJorr6�cr9f#GpٵU5,usWmAC!r)23s K'236b-7x6M%�Mzs
    rrh�t
    :ٍ''{Ϣ#Gf?_|Gc+_}/Ӊf�TA>ќֽ9Ss
    m۟zu~7s�N׵�nA׺�TWߨ=:^�^S?_~{[o+{koM�}ӯum۟Pzu7s�N׵�nA׺�TWߨ=:^�^S?_~{[o+{koM�}ӯum۟Pzu7s�N׵�nA׺�TWߨ=:^�^S?_~{[o+{koM�}ӯum۟Pzu7s�N׵�nA׺�TWߨ=:^�^S?_~{[o+{koM�}ӯum۟Pzu7s�N׵�nA׺�TWߨ=:^�^S?_~{[o+{koM�}ӯum۟Pzu7s�N׵�nA׺�TWߨ=:^�^S?_~{[o+{koM�}ӯum۟Pzu7s�N׵�nA׺�TWߨ=:^�^S?_~{[o+{koM�}ӯum۟Pzu7s�N׵�nA׺�TWߨ=:^�^S?_~{[o+{koM�}ӯum۟Pzu7s�N׵�nA׺�TWߨ=:^�^S?_~{[o+{koM�}ӯum۟Pzu7s�N׵�nA׺�TWߨ=:^�^S?_~{[o+{koM�}ӯum۟Pzu7s�N׵�nA׺�TWߨ=:^�^S?_~{[o+{koM�}ӯum۟Pzu7s�N׵�nA׺�TWߨ=:^�^S?_~{[o+{koM�}ӯum۟Pzu7s�N׵�nA׺�TWߨ=:^�^ljvg6;Wmwm�̴��RO?i'9	zptǗc0!T;Xx92.:
    Z&,`X\{OK�qOK1_YS�_�X	z5ܥ>7A@ii?#էXwh+]`)<�W?kv>WU;cnm,6e.))wnBl26^lA{C MWuha}93l7Nc<mU0WXVE +pf/wmk{v**i
    >lQ,rκ)èhܕHR,f=CqD1C*Ezhzۛ�+j?/{<.amǎ?^=\ӛ{Ng:O;n:}	k�eFRn,}s톒up5#XO?魽zWׯxh?a?`�_^��+ׯU}zVko^UXO?zWׯxh?a?`�_^��+ׯU}zVko^UXO?zWׯxh?a?`�_^��+ׯU}zVko^UXO?zWׯxh?a?`�_^��+ׯU}zVko^UXO?zWׯxh?a?`�_^��+ׯU}zVko^UXO?zWׯxh?a?`�_^��+ׯU}zVko^UXO?zWׯxh?a?`�_^��+ׯU}zVko^UXO?zWׯxh?a?`�_^��+ׯU}zVko^UXO?zWׯxh?a?`�_^��+ׯU}zVko^UXO?zWׯxh?a?`�_^��+ׯU}zVko^UXO?zWׯxh?a?`�_^��+ׯU}zVko^UXO?zWׯxh?a?`�_^��+ׯU}zVko^UXO?zWׯxh?a?`�_^��+ׯU}zVko^UXO?zWׯxh?a?`�_^��+ׯU}zVko^UXO?zWׯxh?a?`�_^��+ׯU}zVko^UXO?zWׯxh?a?`�_^��+ׯU}zVko^UXO?zWׯxh?a?`�_^��+ׯU}zVko^UXO?zWׯxh?a?`�_^��+ׯU}zVko^UXO?zWׯxh?a?`�_^��+ׯU}zVko^UXO?zWׯxh?a?`�_^��+ׯU}zVko^UXO?zWׯxh?a?`�_^��+ׯU}zVko^UXO?zWׯxh?a?`�_^��+ׯU}zVko^UXO?zWׯxh?a?`�_^��+ׯU}zVko^UXO?zWׯxh?a?`�_^��+ׯU}zVko^UXO?zWׯxh?a?`�_^��+ׯU}zVko^UXO?zW׬_k2[ZdV}ׅP=V
    oꍓP?PEbolxuI?vSUUMOW[5ng(̔1ECt*<	'҃5I,^YS;9껮m6'b'HUiJU["U6hdE{WpJfkšiZlm()_O:Q��W�}uO�~Я�奺>t�*1#�vlڻrȻ9)y@�)ݾ?Qڵ^MYYc1>|NÐp|)}
    {AoPBoOVi�4�Ϧ�л{!~_c�皿>�xomm�}p;�>�B�?_Vm־>�4u]v?^[ݣ?5x?ƹS?U; z.�@uSW(�*^?;�ZS<WͿ
    ?kq;
    ?_���WͿ~s�fg?L(�O��u;�XS<WͿk־�z?L()^p�]�L�_6�ε�Mz?L()^p�]�L�_6�ν�Mz?L()^__�%�m�{/5?_^™QS�߿�u0K�e|�[:/_7k־�2�ϰ�Чy�~��`u_xn?l�}{�
    e�aE�O��~��/ol߸ٮ�Z�>‹�B���_+׿q}��]G)}_�Ͽ~��`u_xn?l�}{�
    e�_E�_�~��/ol߸�ٮ�@uO)}}��W�WͿ~�s�fg׿?__/?�_�L�_6�η�M^�™P�U?��uw0K�e|�[:/_7'vzL(*^]߿�%�m�{/�dg׿__/?�_�L�_6�ν�Mz?L()^_߿�%�m�k/5?_^™QS�߿�u0K�e|�[:/_7k־�3ϰ�Ыz~��`u_xn?o?/O�_�L�_6�ν�M�]ޟS7
    
    �W��	쯛g^��.�@u�>‹�B��_+ֿq}��]G)}?��WWͿ~q�fgkޏS/
    /
    �W��	쯛g^�v׿?__�/?�_�L�_6�ν�M^�™W�߿�u0K�e|�[:/_7?k{�
    e�_E�W�~��/ol߸�ٮ�@u�>�B��_+׿q}?�]ޟS'
    ?
    �W��	쯛g^�vO_/?�_�L�_6�ν�Mz?L()^__�%�m�{/5?_^™QS�߿�u0K�e|�[:/_7k־�2�ϰ�Ыy��`u_xn?l�}{�
    f�aC�W��~�/sol߸%?_^�™P�U?߿�uw0K�e\�[:/_7v׿?O_/?�_�L�_6�ε�M]�zL(�*^]_�%�m�{35?�2ϰ�Ыy�w~��`u_xnl�:�
    e�aE�O�뇽�`u_xn?l�}{�
    e�aE�O�뇿~�`u_xn?l�}{�
    e�aE�O��~�/ol߸ٮ�Z�
    d�aG�W��~�/ol߸�ٮ�@uO)}_��WWͿ~s�fgGt�™aEu/?�]�L�_6�ν?k{�
    f�aC�W��~�/sol%?_^�™P�U?߿�uw0K�e\�[:/_7v׿?o_/O�]�L�_6�ν�M�]ޟS/
    /
    �W��	쯛g^�vzL(*^_߿�%�m�{/5?�2�ϰ�Ыy�~�`u_xn?l�}{�
    e�aE�O��~�ol߸ٮ�Z�>‹�B��_+׿q}��]O)}_��WWͿ�pl�}{�
    f�aC�W��~�/sol߸%?_^�™P�U?߿�uw0K�e\�[:/_7v׿__�/?{��	쯛gZ�v׿__�/?{��	쯛g^�v׿__�/?{��	쯛g^�v׿__�/?�]�L�_6�ν�Mz?L()^_߿�%�m�{35?_^™QS�߿�uw!/ol߸ٮ�Z�>‹�B���_+׿q}��]G)}?��W�WͿ~�q�fgkޏS/
    /
    �W��	쯛g^�vޟS'
    ?
    �W��	쯛g^�vzL(�*^_߿�%�m�{35?™QS���uw!/ol߸ٮ�Z�>‹�B��_+׿q}?�]G)}?��WWͿ~q�fgkޏS/
    /
    �W��	쯛g^�v׿__�/?�_�L�_6�ν�Mz?L()^_߿�%�m�{/5?_^™QS�߿�u0K�e|�[:/_7k־�2�ϰ�Чy�~��`u_xn?l�}{�
    e�aE�O��~��/ol߸ٮ�Z�>‹�B��_+׿q}?�]G)}?��WWͿ~q�fgkޏS/
    /
    �W�%�m�{/5?_^™QS�޿�u0K�e|�[:/_7k־�2�ϰ�Чy�~��`u_xn?l�}{�
    e�aE�O��~��/ol߸ٮ�Z�>‹�B���_+׿q}��]G)}?��W�WͿ~�q�fgkޏS/
    /
    �W��	쯛g^�v׿__�/?�]�L
    �_6�ν�Mz?L()^_߿��m�{/5?_]�zL(*^__�%�m�{35?�2ϰ�Ыy�~��`u_xnl�:�>‹�B���_+׿q}?�]O)}_��V�WͿ�s�fg׿?__/?�[�L�_6�ν�M^�™QU�޿�uw!/ol߸ٮ�Z�>‹�B���_+ֿq}��]G)}?��W�WͿ~�q�fgkޏS/
    /
    �W�%�m�{/5?_^™QS�߿�uw0K�e|�[:/g7k־�2�ϰ�Чy�~�`u_xn?l�}{�
    e�aE�O��~�/ol߸ٮ�Z�>‹�B�~�/ol߸ٮ�Z�>‹�B�~�/ol߸ٮ�Z�>‹�B��_+׿q}?�]G)}?��WWͿ~q�fgkޏS/
    /
    �W��	쯛g^�v׿__�/?�]�L�_6�ν�Ml&�@�uO/���O&Wރo~i\3JI^<l_x|)�Vr
    �/o6�;J��'ۑ�yKo^.E$uiؾW�ez'_ar�y}_m>7G~u__0�WoWM:}AK�~_FT�logback_1.0.13/docs/manual/images/chapters/appenders/dbAppenderLEProperty.gif�����������������������0000644�0001750�0001750�00000007354�12143164146�027154� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89aF������nnn���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������!��@�,����F��??	
    ҭkW*\^}CË3jȱDŽ0d˗0cʜIs&(Xa5TZlYѣH*]fΝ=\IիXjʵQ:y,	 ]˶۷pJPB
    <\3[]˸Lasͻߴ#KL˘'W/�|p3ӨS^Z5D:|q-ѥ[ͻM={+_μУ.gϝ}w�zzMv˟O|=!J�߁&`!FH�
    8DWv v^$pAO 	'\av$F4h#<vxbl*b1nH&$;2Pc+Y4�>U�\`bc~9b	fl&�,p
    ZrIW|k٦꧛"&)''9 [gv|fgoj虡f*
    ucR�
    GH�` lA[6,�d%kvm_-"
    ;mf+"o;...;F,ZgY�hqt2!q(' ۊ(\51*笳<r,Lr>,B/33XH;-mXgH)MGJkj7tHf~)�wwއ7{&�ȍHxA~-y~'rvc#*'Ν>9:-Ꝅ~p�o#|7|G	(B4\#|M/͗_o~П/_=�֧s
    X5Pg?qx:�x`@8"!W� +xlp
    
    :)̡KhB+	UxB0<LwCP4l2X̢H.Q>DÈ1~i#Db61@/1}@Ef"I=Q}# G@�
    Z�ר#qTJZR$i/q 1y@Q*YCF:l(Z'5SDe/kLNr$d.\*ҕ":̦6nr.
    jp\cvf�ۄ;IOȳ8iS@{bӠMB| ,'�{*ȨF7юvTv_hF[�:5(jQ0(�>St5UNsQ6)]lfRHMjRwQJTZS*Cx`
    XJֱB9AUle\J׺`=+Һ{]ū`KM,]W^*X&KZ,feєx"͚MjWrDҶͭnwVAlNjBMr:ЍtS!pXͮvzU @Mz^r|K׽ͯ~� L`Np;{+a23{&w-zU,_
    >0Hbx6Na ,vzc5q{*K8)N11{Y#,�2eF,1f1ynsӬ=yl3Ǽe+X}'GςH[zҘ1'+ҚiRGZ͜>|V7Ѩft|ζu!Z;׳f/[ZlW;βMe3ؒvk\7Bk͛5Lk_s{/ƶeZvώ|-n8wf=9�p<O:zfpy;@N!\ncxmj763cZVWN^,Iq<{7o<7O2,17{<]g;vur
    :շh?{+v̡_svmNxϻn~/A;'Oyh(Lj<7sO|uaa�h^AֿwFc{ȏ|Izi|I
    ^Wqy3_߽>݃ξ7__P}wzw}Χ	؀|}~|g{	~w}!(G{#8'}ȁ,]';>W)8zDH}+x~@+8PH~~].h}}X
    0(<GLXMXGgHnhvH
    ^]mF('A8uwyxxQXh(؆ ȂhW}ohH h%f(~ǀzX($8~x؊ȉdž7|(~E`ՠ،g
    
    yҸ\|Wx蘎긎{88MH}8XwLjy		iX|v^]ʘِhy7xw	Y~8eUy'{W~aHR
    ~HgGnh>iHR:MUY88
    h=HȖ=DŽ8tjhgHhYx"OXwuY|i];gYcIi9Y(}xٚF~)H~})Y
    ə)9I闾隹)U)yyɜ8(E虪9yٝ|iI霠ԙȞ-؋yOi ˹9Yiɝ٠؈h4ISx8ɔw{	9H^Y)(H?y͹[)Iy9+~ȡ1ɍsy|GY!Ф]PJK
    x%Zڥ`b:dZx�;������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/manual/images/chapters/appenders/dbAppenderLEException.gif����������������������0000644�0001750�0001750�00000007425�12143164146�027265� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89aF������nnn���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������!��@�,����F��??	
    "HPkG?	D]y3jȱǏ CIɓ!,xpX10d͛8sɳO"L`C
    `ϞA=4LOjʵׯ`ÊKٳ[5e@ݻxW„
    2h܋j]`†&˘3k̹ϠCMn5惠b˞M۸sKİÇX3t
    ;7ݽo
    УKNسkνw}w˔^sҫ_Ͼ�OϞ>G=&qg{m_F(Vhz^ }j (b:`_0(c�8c1^pT @	פh^@hd<B'GF)TViXVcGn`)Q[?SL4@@ts`gtPxit
    wh~
    װ&*)j`6BEZ駠*ꨤjꩨ
    Z(򹧪N
    謭šꭸ뮨"	db�@.l>V:k!pB
    ,\3yY[c߆�k+-bK-l7찾z/`h�lܱ1{\((#
    pTT).�32+HJ7lH'L795+<&W
    \wNsK򧝂�o p}Ht	*�-5f"v ~Gnt9r#Bug.ww/ki�@뭿밳>;n	(B4\ͫ޻?|
    qWogw}>[?~>O<Dǵx!�@G`/ 
    Qo A	RfGH(L
    WHP`1p,̡w 
    &薵h"%��Nl"'VщSd"o1A
    pp
    #&'Xb@0
    2oи:x̣>[b (H.T
    F:򑐌d1RL鑢LNz(GIJ�4
    rp
    Lz@
    ,(xTGɤ6)^0IbL2	LZRtB0�O̦6nnsm7[0�:5Yk* gϙu7D<~�
    @*NpډMBPӜT[ԼͨF7юz@#s\
    @Q!'MEWҚ8ͩNwӞ@
    PS․&u$/PTJժZe:yk,[MmV*^S:ֶp\J׺xͫ^
    ײr]uI0
    Y=b:+qZͬf7z�FKҚMjWrh_+ͭnw
    po+W=.j:ЍtK]e.tz
    xw{]ok�mZk#-}W{_֠zLҖoK{`6pmR
    y[^#-A[/oOw1yb4#&q{slyCquʽ-qy^(eN|'X+2e7yd9ce|0طsc9/{59Df3!Fӊh{ZĆ~CiGOƴJ a]k]є~][-N{iGG޴h^S̷63klw&U{]`#[>li:kxn3m;ۚџvwmY;)Rv\esզF%9ٞ|:xpo\'aU;#>re|-_6ji^|?o.[HOҥ;PԧNW=g{`ع!EdW;ܫ!w}xϻٲO��@6;k;ă<4*?etO]<>==Izgc{k@={_z>۹^x哃|E/O_o~NwϾx_ϼ~^'Aۏ_|_zȇY̧G{X{ɇ~ﷀ~
    8	8yg
    Ȁx(|u'~wgx$؁/85~*(6X4ȃ1X37'Z7|7xhYz?&~I(6H;{\7~]Ca}}ǃXׄcׂ'Zx_|LJVX:zX1{hzhYqXHbgh8hHWXȇ؈g(XYz7wu~駂9h~8z脿Hl8~Ȁ¸7`~9[z'R{v`7Lǎ討e
    ( p9huy
    ِ �|9Yq[gy9!ّ$Y{7xԈydyWvJy1YY):(|>{{ǔ+p'vuדPT~8(Y8ɘ}g)hnj8h8S)w`GTh\9nȉDyىkhhEyxOH8OٙHx	QhoxCɆxț/8)XzX,وXI[(xicȝə=HlIh螀)wIٜ膛8t_Y*U	}Y
    :)Y)[Hy)^x$7 Ǹ'CȊڙ+r8ٛ\؞ai}Cȸ	
    &J뗖(NHPx	'9&	XWbb:{ɥW_ZxyKǓߨkzxʂ|ڧ~z��;�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/manual/images/chapters/jmxConfigurator/�����������������������������������������0000755�0001750�0001750�00000000000�12203357067�023625� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/manual/images/chapters/jmxConfigurator/mx4j_tomcat.gif��������������������������0000644�0001750�0001750�00000066011�12143164146�026546� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a���=fffݎ�KIP%eԷiL�Z3n(>RQeژDjCCzӌ�Xh�m�X梵
    1j///Ukl쩍rU$;U&�H{�U�S-*VYаb7hqCԮc" x[&\#k�\鲳CS�\~yb�kS d�;՛?Oڬ�Q䍞ȼੵ�'9n&`1YZ񚚙qn2vF6L\e{zzU�U\jO�`�T�XUҽʻ+�eX�`:&�1j\fZPPh_oJJK9�����,������M9h*/&kFI#681ŋ3jȱǏ CIɓ(S\ɲKbʜI͛8sɳϟ@
    JѣHhRJZuD:p#jʵׯ`ÊKٳhӪ]˶۷pʝKݻx˗/*UIԪ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺPap%$ZrͻNȓ+_μУKNسkνS6^(q󕆡M˟OϿ�(h&6%m$3x6mWA Ɉ$h(,0(4h87R@)DiH&L6PF)T6Xƅj({^RDޘdihlp)tix|矀*蠄i%P^6D*餔Vj饘f馜v駠*ꨤjꩨJ6꫰*무j뭸뮼+Ķz
    Gy4aʳDYfv+kk,m!4b
    !H"(P�>4�,l'j7GL,M#�!J5To	~T(,0,4\Y/1F!́
    
    c67PG-TWmթRG�0@
     ׂJ%K5L!LDʄ??D?qO?÷sv35CcyۍwDL"ߓ:wX.褗n:ZW
    5d)C*”37D:?| ,]Ev* CN8pBsMl{;5#/kDԿ<s
    ��@JkxG7@*`1@!AP?n`H
    ?нV`@~PC(G)vJs+(ս#$C+CUmv<0Sʓı:"8H*Z
    3B.^
    %+PT]	hXia
    vȣ0;	у;򐇼[hȹ	acC+l[4s"'0JM
    r*ȄNq#XJBn&1 $oDaIv*K]r
    #WZ̦6nz8IrL:v@ 
    .c*4?(w3D+`=8"a.[AyhHDxs[	b"^~C=Bѣ ; 	(M EHE#HR&4A;C'0ӗhM+Gֶp\:NY$P
    
    4襯70c[Q�wGGL*0jYp'sk'^eo|؀ID-lGfgնp!Fq'mc-
    ҵc%lUrpX!j0ՏI"T*e-t&tV)|Kͯ~ƓB#ڐ75
    "V2X@8Z4Cp 
    o@bkN&"j7ӻM؀dEc�ň,aXt[cm8c!6 k\cͭ362Qb*ߘƛi\]8N6pL:xγ>πy@1x	ڀ6BY=r4!#*,Iۏ~?
    PGZ3uB5zo_CoWz(PuO-ia@i-P`@UH!SSZqsmmz
    
    M6nmCq
    *Sw{Υ1mՑ(yMyۻ}�AOZ8+B4]tC8K D(G`fEPOXy
    Pk6F^C<n)[6ܜ;z9ҡHtMݙt|(,l%c>u7ݹB'I{Տt40BQ�;O;񐏼'O[ϼ7{(IBo@z7 
    8^w!ĸiS_*LBpav@C2Ew({?#ǀ;8n?۞A&9QG
    p =?rg׀~ٷ}
    QvM7tP؁ "8$X&x(*,؂.028(zg
    	}�@HPH
    P?PIH
    Hd5{HH|?ɀ`Ѕ
    @V?vT0R@gukd5HPMSLJ
    P?S@fM x|}؈X~8{('{XQ8Xx؋8Xƈ
    �r}
    �z0֨F8 ۈÀ찍(TH BӇ({؇((8(�)Ih舏9Yyia;h@F8$Y&y(#٥8*294Y6y8:<ٓ>4B9DYFyܰ-�Z Z`H9{R`W`b9dYfyhXm�	9{;Xvyxz|iؗ9Yy٘Y9Yyٙ9Yy
    W!PЌ
    } zٛ9yxpșʹٜ9Yyؙڹٝ)z,�5x
    :Þ�9Yyٟ�:Zz
    ڠ:*z\,Qၡ乡 ":$Z&z(*,ڢ.02:4Z8:<ڣ>@B:DZFzHJLڤ<j@N00TZVzXZ\ڥ^`[jdZfzhjXj:lZYZ707`tzxz|}:}z@
    JڨZ*Jj*꩟RЪ:Z	
    
    ʫ:zȚ*Ь:
    J֚JӪz.P. 暮:ᚮ*:j:z*P*bZ{
    koڰpz�n[�[rJv
    *z
    z*k,,[+k4ۨzz7K:j@jF{H;
    NMP;T;ڭZXW
    YڮZZz.l۶�˶|۷~aUʦ;[;-ڲ;zk[5 <K>B[DkIkKJZ]a_Y;쪶gdkʶ*r;uk;۽
    +
    ;dz{{,k"범:K9;+KA,۪R;ۻ|kǻb L֚kg̻qx[J2<<>|K[E#Kۨő۳l̩;
    ܺH;RP	{|Ǽ*#`k\JKϋ23L{ùak?lJI\@{z;s:UW
    \̨ŨƧ:`lƞlp,\Ҭa}̵́ȃܼ-l)
    x4u9,LW,`ɘLUjl{,SJ=FLLTf};ϱ ]*Ųk|ˀ)MVji2cj<mt|vrlZTLܬ|
    Vl-;,_mc
    ;;l	Mnͥ|qݷs}\曱M͸i:mʎшzѲt:,Ҷl-+
    /}13M5m79;?=ACMJگݫ,B=KM-Q-O
    SMz,XՄl^]a]c}_Mhvlbj<s
    o]u
    sMo]][ʋ۾rLnئ,ωs:"mm&
    ҙ>̿4
    6M8M<ڲڴBMEvUĪ{l٬\Ľjg;giۭp]�]�[>m]^n_ݦ
    
    nwJM>؂wnzz
    ٯ<Қ
    ᕭe៽ ."N$n&ӵ>I0^--⾫7|S
    lB]ma]M:ݔUY]Swm
    aZjmn
    ߨ}N{n}<lŌN�ōM^ڥݪ-(~nG
    2>Lݬ.;ܴnjܹG.I]>PN^ӾǮ7_TnDkMk߂|m爍
    .7N'-emO
    /ƹj/^ꥮ񣾬6n۲^%oYJe-3_l\b.=]͎q*DAOߠ<O?myX/ʧŇ^Ҽ_#ѿШjyʴ
    0z+ͻ8­!O:JȒ|;0
    W\N`ؐa? B؏bD-n|ȑŌ!^aË"1XdɏU0Tӡ/iѐ7z܉FD
    ݸSQNm:uӫURʔ~Vf
    +@v=V-kRWn[_ۗ2&ar'1_ǑJ0e̙5o3dY̙TfZխeϞvm۹uom7xxs]Lwa%luݵsovիoPLϧ_y܏1*?+DpA-zآPoh«DS$2ŒbqF)P-4ZK-6`{6 
    7$N8
    lR9z;﮳
    J=-l/2$FZM5߄>9K))'P(Z3C5t¯0ҷ⪔..P/S[KT c*FV[WqL3	G!e3Wߐ,n}2%)ʂK<j[2d Ҝs\r5<?ݥUPQz'%-
    Lt_P
    `D5[TUcFY7]Cր5Ra=XOnֹߜ+Lks{9o-(s6h'vPx
    lzF^z-*5FxOų6Lņ!vQ*;nj1mV9UEdLVd[Vcy[f6d9綠gq:hEs}=$zp`b^`E,sw{}11}11ޜZPgU*cYzq
    :{^Up7|3W}w}%P/<o~?\k"�6tS(m-lnA :Ȏu;#o3<=oy^Z=5k�
    FT|C +~C$bq~J�'FbhpyC[bE0Qc$cxF4QkdcF8QscxG<Q{cpC$d!
    yHD&Rdd#HHFRd%-yILfRd'=IPR$e)MHde+ҩnAHpv!Q. `@h;j1aP<5U-cxMm6w QyNt/Y";Nxr.+9JJ-(@M1_t-MQ0058SQ23L)HSTaX<#fi=ꐇ$gK]jtT\dxNJR}sQdJ02@h�0h`RZBzUfUv"zDc!1CYpȘ5yЃ4ֶ"s+[޵tW g|BzCNeu#-Hr۹esm55ig=Y�%miM{ZԦVemj:U0E -!1#b2P[1TV{\n50]B~fEcZ¹u̮\]jL4y/^WW-kWX/cb).دd++^g/"�e2fFX_k-|agA0 ([9!H0
    "p!qm|cXHn	6Ȍn[.v=d.S~2iƻ]'Uou
    cXj,3XnpDg'�)g@VÃ&t9L~ C^ pbEG`hHgZӛt==
    !ǣ*w!06Y|62oa^W3+kـ:s7_2IkfCy:<\mp&7k_;hDP5bwRN#չH/W㺿`xp7Ru]sl-&eNBffKЎ3-{Y:+x[xf@p\)w}>Z!
    Xt{[Lg�ƘFtG]SV<iOB[g.`TK00(B>�	WxY)�ZXsC&`0B0"�r:I |
    x'^g|xG^|-yg^|=yO^^їQ^g3Q(VzmߛDwujs
    "@3j�=jpBX*0db@`ۏߟS_�@I
    [(7,X@l@/Z=k@,~
    @k�ýWKV+[ҭX52^SـO�!X??)#8k'?/B@2,C3<C4LC5%/s:,x@:C5	C9\1!;DA+!=+ȀDLDۣ"`BAFZI*`X>خA9pG12j(Bg�^_H/"<2`BNpBdBX*\%X�($x808~>/Fk41\Cs<GtLGu\OjCx*;@zGC=!�8-~H~|@k`4=,H<A*Cp N8IIXO5t0�QSIG*
    (1X2Y
    L2"1"$1p~("dc
    gNHJdLJ*lFg\%p%
    pFll?ؾs�prdG,K<K,6S2ǁ4(! +F{4D$="h˄DĆ4'IpKtIȜTŌR`EIS1J)HlIYl ȇtZEQ`8|ƽ
    s8JId`F+<%\gRHlF[FؾKq$ǴNODhCCl~K9tD*xzK9ȂzĂ,ړk8LȜ9X:%NЅ*Ŕ$[QTS\*ˤ4M|XQM11dQͩ
    @
    f\\NWt�ehkn~N4&KR.R/=6~O(�O`?O9`3�P`0G9Ž1Z]
    ULI)
    ^\tt E�l|ٜtцQgx,pOB+%X#*@
    	khR'Fo?oJ+jTֱLVAVl$m%mRp
    Wq]pQL2@SuO`d
    9<]Wz-0W5yUW<?
    1e1,*8KhF.KUT])=
    OuPtI
    `-ٍSMUWu|(YثT^/*9ڠL@gPh؄MP'mVԾhV,Uj-mEZFGlAڈ۰VW].-yh xx[Mˀ|]v}W6W0XM1+=Ѓ%&K\K.+M]9YX61؃iL1�5Y0|�gX�dV}Yˇc�Z@{J]Ze`V/|V[8hR%$ZGڴU$C߱^e[m_tJ(2�e
    dP2(21\4ۻ5\9[u.K+ݲ+8SY$݌dV]]hE'h-֨]}Yg]NٙXP;E�9$Nޡ58)^Z3)N[0.Je)VZ%ۜ8lEclc2^cV62~4Ncc5v_=ct?eE_A>d#_Gm%S01K`:8ዥa>6�;he;H;PV$`a~Ua6a|(b�GH@~XU]^a�jVȄl<.F'<0L@�u檵c4^U5fZy^{>[<v]g>g^CE1FFdAI&Cvd.nJdL^�S
    DUQQQ\Ջ
    "hme2hi2T0�EY5b|0f] atXf`ds�0?hxRSs@F;q@.t|Fk>ng8V봆k~k?U>"G_
    Inh"k:J~l{6ٸ*9#�6J1SՑFT.cV�; +2heր-$|U$!iP(jbiۿUAujhFSp6h`6{fkw6$x6_[v.og<No6pX,@++ lN0:ދhSS9l	pp_O/(
    >H#p?�m1qO�
    ^mfmp
    ؃q
    e儯8U!;|P"?|P*gX|r0_xjPȄ,0mn'l?S)pu(f8^6f>?WgyoC?t6Dp,�`+hlGkGǂ2Nˀ["tR[ZN1Fu9@�"gcXY"q9bqh^pH�WXmvXծ!?W#Gtg_=0Ww//؄*b͇0H(fP.Lbw0^S ;s&6NuV76[gcgDx.)x:�u+yۥ[NyNǎW\\9{v
    _U9vgq^0ni(z(z;A]A< wrr&fF_X|8yR0sfhdpj4&냗Uߴo|7t熺t^`vQ'!IWve`OS"_}q̝\koWzU}z/qq}>_0!ȇ|r?{Kwur(Xݸ.p.PcjkdsldcP.�<+h B*l!Ĉ'R,"ƌ7r#Ȑ"G,i\Ni	L+DE#&0`Qt&K4oF
    LZф0m4ӨBтi*V`p+{K$r QFmՊ4ʉk%ۼ0|o6߀8 ׂ_b8,SP(xal̙3|PA)mq^Y>gNRJ@"82SYL7eZ&H$ҧSn:G\ٲH"Vir3h酤ש(D
    Rfa^q1ADFz5K^6ؖll0:]p�ܓDŽ^A3E^rL*:cl/]�=B$KxO�tAsYy%Yj%]bLrdNT{9M0uy'x_y#
    :*[Ц(&:Jz#"ik-�Xh6hk;:3�9Y�G"$eLys^{,*,I[Xez;^~DyH`
    ;.k
    Y5(2軋bخ(κ
    #L>	+p�@[|1k1{1!<2%|2)2-21d}&-=Tzxa}yHA/(25ګ(j
    ]{]Z&e5]Ekvo=7u}7y۷߁~8+879[~9旫*@9d^9	:sncn:訣:쑇^;~N3m5L9yBBEz"==Ҽ�1uR4O]6H�(whȪ5a+ K@o
    o< @jm#ܰ'	R&7
    rr\\ANt\Rw9]UBߥ4!	7 (-`k`FĂ5+p
    (=xyOPPְIo|"(F	0Qv+Ө5odt9ұs:~P 1#	e҄cmȺ/TvA)BBh<B�F)0Q{TO|/c|%,cI2fd#.sK)aD#23N,d)ta	{kFDo(e(LJ.YskѸyҳzeƿ�8o@Dj5Cr C3QfBn~G-ёzw%5Aҕ.a!bZt)jӝ>)!ԡF=*Rԥ2N}*T*թRVUխrujWհf=+ZӪֵn}+\V쀮Y^]쀯tk^+=,b2},dP,f3r,hC+ђ=-jSղ}�lҖ-ek궷-p+=.r2m.!Rֽ.vr.x+񒷼=/zӫ}/|+ҷ./,`0L`X~`x-`s0C,K.q~2}и61s>1,!F>2#N~2AQ2 [2,1f>3Ӭ5Xe3,9ӹv3.D~3-AІ?E3ю~4HSҖ43OzӞ4C-Q:5SUծ~5cXӺֶ5s]zּ5-ae3~F
    iS־6%ls6m>7kr~7-vdwI}u�G7rd-#
    cqBn\#x]ct %']r<xBpC|>y)gFCH'pOY$8!ȼ:BrWDQ)~mn<$Bo8!,#Fs׽:?s '_x4OKa:OS>M38Iyg^;8'=c?{ͷ^&/t{Bw#wWz'?߽>|?_>R?#:Cy~yϟG
    ֡	^
    `}]- 2&b`՝µY 5Ay`	 
    `Aù
     	_
    G_M^-M!aɟQB`a"ava�_֞ffz ө_A]Ҡ
    
    "Z6! "
    Jbv2bF@na(^!"q"*abF:`Vz*)!2D*!
    !a$Vb1"!#3z42% 5c4J!0.4 v^IJ`%=`Ya;8!Ɯ(c£8cڣ=R?cą!_e"#VbEfF
    a4b#.Ud	 bb!>Й$Dd߹1KfG',t4 CO-P%QQ%R&RO
    `SZ8F%UVU^L%Vn%WvW~V~X%Y~eX%ZZY[%\[[%]֥]>[^%__e%`&aa&	&b.&c6c>f)&dN&eVeZd^fn&gvfegh&i&fLzYij&kh&lƦlΦfiؙᦇ馈憩؄gQX'mrRXs6='~qBr*XuuunvnVgv'z?x&A~؉gIgN	I'J~Qo{w'yr'g{z
    gin|n槈񧕕h֧Q構(肞f}(Iq֘E(Zgufgv)'BjXJVBiNvg&鍭'Nfn)"XFjii)h)~¨֨"('֨96jj*ZjiV*~j^(&o.)zjªnJ'zjvvi**6++NRFwfk=~nꌂj긚(>ꡚkƫj.gӭ*kiVXn)
    +)&l+Nw*fƩ*ĊJ+Bv(˾V+Bjl&~k+~+-򬺊k,*Fm6mbkʚn-XnjR+v-V,blŬmيlˮmޭl
    .B*lF2.^R-QFh’p(+^łR,nB٪v-*nbl
    ߊ*Z"k6ޫ".jv/>oІovbo&*&.U!m6Y&a⯖R/��0/Yy.?0G9W_pQ0o0wpip/	0
    p
    0!?0
    װ
    00011'/17?1GO1W_q
    0o1w11111DZ1ױ;ӈq2!2"'"KqpMKr$[S2kc"2((27
    2$_1'_r{ 2+w2)ײ-2.)װ$r2s3s.'2/33rp/#07[35c5cr5r6s*w*[3 Os6{)K6os78ò93738:s<=r3?3@#.#3A{3B6=2?/5sC'sE+tD4AKFCrBwES3GC4EHI3Is@4LǴL@C4G2=HDF4PߴO[/4<uR&Ps2%CRS?L_5Vg(4N/tQN;46#PC3?uY{RsP[/<;5Q[Mo4;{4>sOӵV_suTO\5D^uGb35a3^34PuUv:Ga6bGw5`6hYcZg\i{vcuf4\5OSe3mTvlKN5k6pp?1iZijk;jOn?tqCuf?ou]'o7xxpqfvXtU4ZEr4}3oKy4XtKG|x88idzX3wvz4]5\c#>5TsOx|l7cEwxpsuV#,588Vx,縎U%c69y)0'/0?9owÈQyYaiq~uWؘcXיy/h>iě?ßyS9z빣W9cy[:)yM^y:s&B.9ާk"y{ئ;جXs:CXC:MzcYg#zSدز+p:=;W㹌m/:;/#;:_{{;;z;k{'{[Ŀ¿{£;S{:SW<;w{7Z&'j>r"V+fЧ
    J/s3w?|c{7S}֫y{{o=؏k=W=;ǽzۃ3k={=O3J.nWnj.<2>b;B7_}ݯۇ}o<}s|ث~{<gԟ~ӛ>>~s|=;=+;Ͻ%>Sm,nOBgB.~?r٦7;=Ŀn
    4x@	DhƒVtaĆ	1nQ#Ȋ#/rxF+9bǔxsL8Y)%MgyiRK6uèFjUvVY~z5YYюu;VY\㖕{lڻn}w)\N3lxi7C*X d#/vRe9'+ǒLq㕙A|0ꤩu&-[&˕1߮-΢yl$oEMkөW^_sWՎ;Zw^{\ӷgW<޳}5O5|}K'BLL)D'+Ԑ=-BI$0#emuܑ} "R$Tt*'OY4~ܒ.02<4\6|8圓:<ܓ>JB
    =D]F}H	0I-L5ݔN=5)5,RM=TU]V50\uP[qݕ^}V1uՒV?7Mf}`eeVQkݖnRZ0=v-m5bU]e]jetu^sэwZjwa]^}-%߆VwV
    Kmw]Aޒ)X[-%ˉ%sYueqޙe>iT9feYMgzǵ騽\A:ꏓ~/]Z^;muy>m\m.
    ][pNY-\OZkޜm=qM'<m[O!ǿugS[}ŧ}ڿK|ZUy9΍o)쵟t+-~r^}ZoW>ŇxǾ	/yasn3M}̈́A|g>.v9Nl	 h6Qb"/O}S+au6CU
    ucx`?A"b#E4&>[bB*^UE/~aXF3*bF7qXG1юyG?D
    )}J$AɐELJ"#Q&O<N~%1I$`$VV_fJ
    r.I%@T)QKU"L+̂DҖd3yHg.|$4Yn*e39m&8%Mov3Ѽ&4ݹu>{ٟ@!)CR!BzJ'bPDJyO HJs--ZT -'&Cҕ#4Rt)MUSt4
    *?ZT`64/}^(*̅/}jan'@yVr{XRJ<{zRy㼩8jMz
    ՜2iJSztmkOz֘zPZXҧv?UB~W'T2iU[
    ȎT!
    -ZZڝ5|-\Kښz%m-]ZҚְ=e![>/fؑW>E.eCL;~Vle-K	سֺҍ=V5EJZzӭg6KMʓ&3ZrzP\O(�GNg@rB%=
    9__xUOyaӦ!I\b)VYbx$ٸ2byc\
    \d#xGV򒙬$7QLOF7e/,j`V(fNR\n \'yzsXFPϫ]\hgCzwxfт6ְyjhK_m~ަ#
    9va1]jScKfB.i]k`U9V[5k4| m]lc+
    f^7iz{]R{~DMZeͨTd\}eKf+2$\	'cKWtk%x-OrLc!1q=r)W?I
    1/$qsp<ͪ"󴦲de^t{(P19(:\{y)_a�J,Oq)jvJݺ]ӛx1aLԝխnN>v]PM(cհ�]hB3:\ɻ󙨁"y�yGV?*E&{]ԯ֮؅Ky޸)JeP=۞ǃ+_we_o^zS^j
    }*~2u.'_som{_N
    uZooxЫO/HNJ
    R�P1L0*?*Oÿ8O7.Lb?XpDZn(oPJtp:0Hƚ	ņP
    cN	PCNp
    KPǐ
    P
    א
    
    PPaQQ�'+/3Qɰа7QPpOTQYQ+iQaqkosQ
    ?10pyQC
    dV|uKY1_S01QǑQ=Q
    CSW1qr  iQQ !	2!2 	"23R#7$q##$O$O$_%G<֑KEW%e'qm*"!Q))2QQR*r!2+Q)!#,%CqR'2&m'Q-c%sr'R'R%o-&y.2/Gr*R+*_+2!Q!10 )R22+33S3ِ,'ѱ/(#r4q(,Qq%E-I&Ys5kQ0
    *0s7!R/18!1799ђ.,E-s6/y:o6eas-[S:S-r;717S1i1)21{S"!*r1S>' ""?33;/;3$S2Q,YRA?-k:r(;%C#4<51=0*TDGD(D9DCE_FUlEgF52EFwF4GnzHHEHIYTc.NI
    IOJt
    KӤKϧNTK4ʰTMLhgPMYf"mFyOLYB&ۮo(QEljH(O#Β-OV(Qo8'}TRG5}F-NHҔTeqMվTkuLP\mUh~DVsڴ:uVNm}UxX5(ڠU"',mQ'TZUSes[L[m\&&(l(S]Xup`Ut\x]TߔUQ	_iS̵Vb/[$S(VO
    c?ʒxeJ-@ee[e_vJfgfkeW:~It6gmg)pZgEgdzp:hVA+6pihVlpP:LԮhev	>ʺ/nꝾ)knlI =7q)pp+-"?oq֌`to+^obku>JvvjxyomEeutvﴮx˶uDw07qK{3OjWZjpJFbOHwuQz|�Kpя|i/|g}V}_˞
    .z9.˼n'7|,fq4jrsj{]7x@CkuCψsjy	cX*x6wԊXC؋X0DqXטQsT8ps3
    =ۘ#&א/SS밎XDя#Y<㰒X[1y !?%1?3gO8C9"Oّ'YG4RBK$e2u37T%y0[6q%K4.C7RR8Q*Ky)yS2>0YsÙFrB/t@5B</Yy9Y;],?>S9S->Cl9ٛ'1wS44;T@k;١t.@;>[=٤z8cg3'4:<!:49<ERᙐ5A9M1?Փ?_Y9Y8]Q9Uک}9Ԣ;:A':(?ڬ;Aq:59Y؟P0ǑذZeϑ[։'+C$۲3[7)0)~@)K۰8<7iaɁNCMX"0ru<)D[wx$slPٮH/nOo*Hf»#8Ωye	O{Xs%{q٢r*ot
    nUéW-RO7[bWjo7>Ldw|m||k<Xܻݗ2n.I~֯VmSo\o	{wVؿ
    ̟hwo̯*/{/wP•})=8>~}i\tϹVͻw+8y
    wQiǕgз΅8[koٛQ}܋#xh{1p\{щjżS8}/ls17jLFΑCxXá\c{קDUv3HI0]=EqPoq7zC
    
    S
    q)㳑ޫ3O>UU^xpڌyg;yXE/˰)r)"z߳+:2(	Ӕڕ";Y?Z>+"^#-21>31C
    B=Ӭ9z级9Ҙ::)^7O-CT읲2cz?~?R>yi>1 /?a'ڟY5}ڣsZw::{_59wy"M>מ{83y?)^>ߥYk_?4%z4ږ_?&lhÂ+(QB)6bG$K<2Jr9>3iY3M:k,Π?U9ҞKIܙҩG&*iʠYӪVzӘlۺ}7ܹtb^#娑oH|x⍒9e˗ns#{3Vd?:iO,Uuղa>M;+nܡŢ-kkā;;unҴ{>򯙫[=N,wg|p<	s{yo}%Jnf0vʔF) t`\>Ha^veֆp	Hk&b*b.c2Hc6ވ"c>ߏ$)dcED"E,dN>	eRNIeV^eZne^~	fbIfffjfndIgvމgzg~	h#'Ai3h.h>
    iU#)C%\j%`~$Jjꓔ6)j楇~)Jk
    l:?Ŗ9
    ۥR
    mK:ijk"J.~Kі-oJĶZ.oƮ:/�{l/
    p/>f̱zr\q.1\̮̳:8
    A3>lQ^nBvl'k{b[wmUgtfeEZیoo@<?|j77R:
    %Ykl,{O5Z=_.Қڝ~z{zҞc$OR}*2n;w5G<.zpOvu<zM1ﲘdhzO~SGKcϟO%_z�
    p,*pq Jp/xbgBJ8zp$,	"j5rV23%|M ''8;B"
    p֑&ʼn?r)p\L`CD0jG'!c�ϘERsn#04!Oظ2*HGތE:ᡎG<DaMT--]d"Ga}"Χ<)#JXƔagLX,j#Uȱ*i2MI].yǢPA%yIX0FdU9iVnȜAgbҹNⲍp
    ^̱1
    ˁ
    3yKlK`'5QYdžKѨpF$~�CN*Y
    `;L<Jè*πj(CjTR̄P
    Re`.˪*E&UJŒ5.?Y뉘|42ciSִe-Oc#Uɹh@eN,GJ 7TCjLp:p$Ɉb9sX?[*'~N֜5i~ctK_O-amʡކ𷠽aq[
    Idsoԭu- !H|΋w2/{wbr/7;7Kk'^:5&^Q+઒TeϷ~i_zޕ*zULe_llHC_ΔE*YPٹۮ+S0zWȊ].tvS2^d%.cJaf/Obz6
    zg^߄063Lgk[05XXƱ!q&<Ђv2�=hn҉>&
    D8̜D缵h[
    uu4Ѱ:fwbhI{yWV\]hMљYU5ޯ}NK{,=ۮ�7=Ss`&kiJk+-6Yһk29Å\sE.8[jy{sSRg5f8-:>P]mxK#rѺ{(vkQA27﹇%3n9z6=;IJNf]fS[MK\4u1̽-ώvu}pҟ.t.=|x!ݷ.7-
    oxPRtd668W'=M8x	%itu{y�Y@MEO1)wNHԙx$$oܘQCZeMJvwkc4
    ?	>a-$Ft_Tr$<۹|r01e*WփEMQxQM}]UMXV	QDUw|$U'~xRR=4WTCVE'NQW$O}	yQTt5YGwU:}5QK(AO,8ZI$$.TK#hp#LEThXL<XX]P	LXdU[€ńy؄xENpEW|؁li\h,qV%}W僂e|OX5%}YYX}zX{5NrU[*4EQhSRJĊxG\xx@ˆ#("X^Ei'HԈ#@A"v(HQ刎騎v[u-((&ptRuZX)UV&Vb(6sxrh"cbvSucc(v_befb&鑐q6,{FmpBvJd,-bsaoSsHv8eo.rsbKVe]-�W8G6fhv/F#vgkffifq3g>pOt˓0Jq*voDe1yoh(iifhou-rG?4tG7fqpFg)qptw2k w@ve0ǒ5noVwislsie9rɗ�6mJ=I	ttSw#uv㘁=gnnӖ2gp)oV96p8Fpooi&	f<	Wg	kp=ji'1:elFscrjɒ6hIr)5	sF;gY2Cyaƣm<Dgvt:G3
    yQW:S.&Wez#','*
    r<V1*3J#(j
    (,ڢ.z?
    A=*EjGDeyhES@3DE1G_:bj\GKJiZKG4^Lj[
    Ef:Mu*yWTaդjl~񁽷z8YTk|G'IM7~4XjAHuDWQYzd:X7TJѧ\;~OJ8K'Om~N緅稱UMHhڧMoTxTAѱ28uUլȡ*OS88JJ\hV˪Tĩ*R8Ȁ%
    4eeKmY�x5EANxE~R-X+hZjZXbXUp(PTiTjM̈́T;h\uT@(w{ǡKAu7eT'Q;$تe8{Gph;~5BFU94J#Rj[_e*1S%[Jej #P:B{Kx|yWj!Dz׵`KKkd~G⹟Eh+(Kk)/JS2su\XRۓ-["Uv֑b!ٕȂ	aH&9ÏW)½{/
    Ic$?+%()y.AI.ɓd&`hЛl8ȩ)6ٓ@9B.[,ll2ih'ِy֔)̔]9G34V)j*\=2(؜h8	?1oϩ9Y5$(~i&j&tIpF/ǝ	[YoQq66I?<rsL9)\;hyiA<r"#rZv9֠793t{nf̛:`I*ũ;Ⱥ6VA)�֩rkȒSS&
    %p	p)il_	,`S|WßR;)rQrds:G6'tYltsϲhm)չ	6Mh1&
    ))yv4+/m)Җ+/
    ҼŤ1m.mux
    CǬa*Ԓ+]{|kq\[JL:Г;AzMGIKݺR{Ĩs:ՏzOxHtdJXHکbK738X7+W^MRII񇬴ttV+dAY*{gT?9[ږ7KEڱ''+N{V-m+DK֘ʰ'Y:Ge(۟״]IPj3ET(-x5S\ӗEzh
    {%<+L> ;TԍmILۅqۋVW+{ֱvmkTXn+jˉ
    ݋HƧY
    g
    E~{O[޴Z!;Zط帶([=]ZBNnR]~S^P]$W寛٠kmog sNunwy{}.Nn臎艮.N-.Nn꧎ꩮ.Nn뷎빮nNnǎɮ.Nn׎ٮ.Nn.Nn/Oo	
    /Oo!/#O%o')+-/1/3O5o79;=?A/COEoGIK�;�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/manual/images/chapters/jmxConfigurator/jconsole15_jetty.gif���������������������0000644�0001750�0001750�00000023104�12143164146�027512� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a,���161U�=U&�%tYh"��K	:�\�F�l�C1�:8J�DL(�TO|c9�>BcCa`\:�Z�Sڲ� M$|bAj�&dDjL�My;floRU2r*S4�[2�)�7�`P%|qiA
    �F"�Kᚽ�\	.gH,�=Dέ;1R�6}hCw\TfG0Q-�U_>jc�H�T�`�U�X�e+�Se�Xj�M�\r�`=
    �X�Q?n�Y�[�Xl33f�Z�Pff]�^e�gt:�P�Q�_�Zߙ�s�^�}Ϊc�L�K1�G׿z`񁈿j[�Z���AR1�CLB]�>GY�!I�k	?c�mRI
    GNۀT���UYX㵺Vz333!�����,����,��	0aWPAbb3jȱǏ Cяɓ(S\ɲ˗0cd驦͛8sɳϟ@GYf۴	R`U$Hj/+
    1]	6-VI8]۷pʝKݻxe˷߿Lpa+^x.Ig#<9
    VlPEkX{RZװc˞M۸sͻN\ufǓ˼41(P@a-ՊV\i@
    ["}][_Ͼ˟O�(h&F
    x[-*	
    2aLЂEDP5PM-,ւ	q'3nac}<@)DiH&L6P"y9'*\%|"KB5c0�`›,vH+xD|矀*蠄j衂V袌6裐F*餔Vj饘f馘[dAXŪ^��+Y%v݉]P䩖+k&6F+Vk^e �5+#@D$�p>#.n�,l&7G,igw "C
    kPpB4@7�^UJBo7PG-TWm"g\w,Jɲ	&h11
    (pAԤL>-L
    	aT
    D*7GՔWny^g晏yUZ<vnǽr	)xІ?c?{,uHkхq*o'7<|#+El6<.;@ߞDP</oӇۀ?ֽKc ůpk<!r !	G<,!B8̡w<^a@\,Y7,pJh  8h!4w	.J�G
    x,/\YpF7ү8V@ۣIPb6eK@%A6O	A&c,c31,x?xU򕱤˂e!ImBU&7qP.d%)aU
    [Ca9lUW@%l<0IkG
    B(
    @{,cAIO �<!ЃsgB1ъ"'NqQt\4G!J`Ǡq
     0 (?R@
    PJԢHMRJC`L)l@.D3Ӽdr%H`#)鋲<g1ΙNb*Ӱt"3
    1pZ׻V@]
    p ne\1BXzk\׾&v`]xvDHv+၇`>${eJJ	J,Mrܥ幛5hv]@@	LJM<LчbDJ:˔+2J#\1v7,f$|닒뗿)_@'%knlX%e01\W<8>Lv@"
    =+%.pj&aKYӺ/C*PA|Yn'8Y5A)Q,\~~E,h:qN4%�M77ъsg	OX4h>?ZРGMRNWVհgMXypC	=q \.8 et` @0H�-fjcmRž6
    RܳD!�|6[⊛w_q2ewm i.
    s#\V .Tq	Fm>KSGN(OW.?\�5,Y\gՄa@-t`F
    fU/f(+!/`v…ȂʸY
    !kE~v-Nw;8|׿jggvJvm~򇷻nJG@Q\s}_<%x˻gOϽw+
    iA :CEqq@
    �:: t�LA�F%U, PG*3NqЃ@wf EPq�j%t020Ɛ7e0
    X`uVWׁȀ/t+thu$.%}$.8"-XFxHJhuЄNPR8TXVxXRx�xp$)P.sH@�Nt0}`}-}~e
    >�y	q~`:~ 
    W\GPz~ڐ�`藊؈_H	q@(8X�w؊q[[0fb_(Hؘڸ؍8Xx蘎긎옎NxA0C)P| l2dmMؐ9iBD.t
    Y@ّ "؄�$0I4s�nЏslvmT|H<PB9DYFyHJJ)Q`�_ P#YVyXX8@``Id	0Y4	�G�~!J7:ɇv	zz: ȗ9)(	p\٘YYN9t0mi	[0@>HuyَٚYyٛ؄wR.).p.X}Tu%":r#Wztڹ	{Z9S؝y9{W 	|FE60E6qɖvU@j*#6҃H
    ڠ:ZzRѡ ":$Z&z(*00#p�0
    /# �^8
    ^TƟp�UP@*B:DAJHJLڤNPB
    TZVzXZ\ڥ^`b:dZfzUlH�P�Zpr:tZvzxz|ڧ~:tp�Жlꦅڨ:ZZک:mZڪzZz*:JzȚ*ʨڧ:zjjƚmɭ蚮
    Zݺ::溧rگ�Z[{
    {۰;;ZrP۱[r#;%k(+t02;4[6!+'k')+{-7{H8Z@+O:wJ{X!:\_+z�j,V;Ykk{rk;Pu˧;sk{};a+JEl۶47|{
    z{;+Jsj{1K0K/kkkt+}뺭K_kkQ;+dDF[{+˶K[Kz˽wK۽k++;+;p3YAKܾu[L+:qZkћۿr:(,\&('<'lNJk ?2\ėK&\	<+P27*fo?LlQiV|13LolSX|:͛k ̿BDLu3|6t\"zŽ}\\WL<\^ʮ<ʰZʷ*˧,ʳYʮʰܵJ˵l˝L˽ˮ*̱<Z̪\Y̭*͹j\|<||.�=]}
    bϷ<=]}m|!=$]&}(@02=4]6}8:<4/\FJLNP}ECEY\-SUѺ"՗j]BϬqt
    l-pM%|hַȄ=m -e=#~}ؓ-٠܋zrzύM{}w"{\ڕ=ذ]ol~]óqTVXڶ竽	lМ=٭ۧύʽ--
    qJ#PĭׁͺMٕM=}ܜmύښ]ݷ
    `㭼[ڑ
    mtލl,ەmɮk[<}" ^N
    .=(
    Mޣ|ͷګ]^&=䈬ބ
    B)}57.D3^
    VޒKR^>]f_`݋M^]Lu=>Qnor^t^纪€meֻ>ݰ>.V!>꡾~ꨞꪾ>^~~6|n긾>^~Ȟ.>e^~؞Ny
    s֞ N۾.NɎ
    o?^~.�On>.!*_21O54o/00@3?6'?/M|HETGoOU_e=OSc?gi_Ns^/^/x.yJo-W?Y
    .tO{A/?~opO?ܽ/nnnOO]oM5_/ʿ^/oP>_~8Ԟ:_O__ߟE7 
    <x0aC*(B5nc}It82(eCČozWQÆ:HЊAZ)S7R*NFEZ+ƫW*(Yiy$93ʖ/c5YQA.4kv];"5p@E\61⪅>f8TÑ;bk
    rT
    !GO%K0kӴ	7೭}'^qL9Gmkߎow]/7-R=.ǧ_}Ѧ^np@4@TpAtA#pB
    +B3As?ޓn7K4DSTqE[tEcqFkjmG rH"4rF;sˮ#rJ*p&yK0sL2M˙Tbrz4M8sNєI.N>0|kPDUFAO“M\tRJ+Q-4RK;>1	I7AUuUVQS	VkVF;XW`=U^O5UaUVbef[ziR]stXhv\rCVoe
    rujK%qߵ^*UI_z6,ݒЁba#&Q`u}Xb3Q4I~5b}dKeVۖc7k{inq9Z+&⟋6hVzYW^i`jm檳njZUk}VՖNNzn;ϩͽ!EocW|w.xqȧlm#<_l/||Cwti4[q]}Eػv3OismwkOxQ8q~棗u+>3MqO='}~~g|Ov`X@�6Gw@~)9^pq`8}yVB
    ),
    Y5Pk1ahXCKCA(3#elÍD1s"٤ػUъ
    igWtC.zqY<c6zk_o6QigyEя9N7Ȣ񑍈Ld!=FёXd$?o=򉖼4%HNq5c(cJ*OJ:ѕ.eg)2Tn,˥w^z'1bᆔ<f�V6әT4c)M\>Z&ɴ)kvs2S)N%sD7%kڲR'89O{>ei@UPҳLhw=Mc9рVt(4jOv4[3.EϏԗ'IRi0iJ_JSeKCO}SUC%jQzT&UKejSTFUS(dXC[jWUc%kBڜtU[;;'zWU{k_WV%la
    {X&VeWs<i&,{YfVlg=YІV%miM{ZԦVeckbKI?fAVmo}[W%nq{\AU.r\FWkUG[v&dgۮU%oy{^WM^Wo}{_"	�"嶅 p
    |`'Xfp`GX
    {1agXp_%F	wݪ9z$-!\bX3qm|cX;+YC&r<c'$6=	W0bc|e,g?e0[90|#!f8Yss|g<Y{g@ZЃ&t<שY'qrϺŬ~w",}iLgZӛt=iPZԣ&\jTZիfu7:yxTqmo{\Z׻u}k`[&vl.[fv^úEeή[?Hϖ8Dmp[&w}nt[67nx[󦷸"jQ#%#'x
    ~p'\gxpG).qg\x~ĻvIU@\+gy]r\3ym~s\;y}s(tz]YUKgzӝtG]Sz_g][z׽u]9٦]kg{v]s{~w]{{wŢc
    x'^g|>Dz-yg^g&ӓjg)Gz'Gzq$Gt}}{_'~}_g-#ӧ~}g_~|_}1Bg~_?#__7ПG@@,@<@L@\G@>@Q@	@
    @@
    |@=wهDAA,A<ALA\D@>AQxAL|sAAAA B!B",A@>#AQHB&%L$BB+-D()}hB2,C3B$L'<C2\"et:C;tA;ԊDACey"
    @`~XDHFD|@QxIHDF4dADJ'ӊ3ESdUCTVE?Ul?XlWY\ESEaŸʧӊSFPƼh~hthFkFf??\FjFq>j$q#`1ӽӊ߃EGy~={{GCyǂ<ޫ}GQc(
    9H~+HHBƽȏȍIHRG`aGtII�ɞ~�ʛɟ$ʠɟɤIIkJF<Jʠ\JDʠID&RK,KK@~ d˵l˴˷\K˺l˳KD>KQ˸TKKL˿KJ\	K)ȌLɜԊRϤLӔL;MMLόMlMLTd[E˧LMNN,N<NLL@>MQhN<lNݴ0<(hN5+6QNaNbZΙLO\OlO|OOOOO$V1OzP-P=PMP]PkP@		P@CJ'LPPP
    QQ-QL@>MQ]QOVМQQQQQQ 
    R!Q]'KHR%]R&mR'}R(R)RK@>*R,R*-RU9҈+10$;34]ӌiS7ӑޤwS<ES;m=-=v	8TDMT:XTFmTG}THTITJTKTLTMTNTOTP
    UQUReH&ryhhUW}UYU[U\U]YU`
    VaU_-V_]5X
    VeUd}VhVamViVkVjVm1H&AWqWr-Ws=WtEXWvmWwut}vWy]tzW}5zWvWyWX-X=sW]X}e)8XXX!XXXXX
    YY-Y=YMّ
    �;������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/manual/images/chapters/jmxConfigurator/mx4j_jetty.gif���������������������������0000644�0001750�0001750�00000064535�12143164146�026427� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a���Zjdee		kWcKP%�K➳ʹiLe2n�Z(Q>}DjCɌhڷCy�j
    1�X欨..0U�=e먊qU$㾾<T(�H{�U-�S\ѧb6q@Үa"123w]&]"k1ٮ㲳CS�ρyakS <sƿ�;d웾B�Qۼ�';l&`�&VZ񚚙q2KKKL
    [
    fxx|?��U�7W�UO�`�TUʻҽ+Y�e�`:&�1㮮hm9���,������	HpV%pBo<	41�hȱǏ CIɓ(S\ɲ˗0cʜI͛8s9ϟ@>)HT +Np䥑(QKǢիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻd=,�=<È+^̸ǐ#KL˘3k̹ϠCMӕd @l۸sͻNȓ+_μУKNhν�%:زg~}˟OϿ�(h&6@~@QylɖaF<($h(,"L
    p23¦alZP@)DiH&L6PF)TViXf\vd(xV^  hO?>Λp)tix|矀*蠄j(8$袌6裐F*餔Vj饘f馜v駠&Ѩb^CScf M2
    BD@뮼+k&,6;*(<1(H�	$�k覫+:,~PLDPm#@qO6G,Wlg3ae
    m(#2r2@*Hl8<`^7DD'>|+%0ko:oqϜy??@?yd
    T[=ND*Y'Qr?n',7㳠ꍾcFJO2@
    %?8&>?w-9{yO4OrάO7MD(~N.馃zx3_@M\Oxή/߼cA򊧯qГW06'H/Op5޴6
    3^,407!S4
    {r2@X3W�-X@?f7mLr8f=8̡%#QA"0fQG2@'5<kH )
    yb4@m\	xE6̎eLc(QkpB)( fƁь4?wER	$HE7R w#A4y3qm_[ψGtҎy#&OiK[GH̥.w^0IbL2L[DL_'S+X!#^C,p
    1=avgI8ZDF	vԈ@0{;C6`v(6SXHΊ@-xxURy6'A6O,Mh@Yt
    
    h/JjGԦ:PTLO#x6Q`
    [bD L`�dAa)8mC_`Q1�׼5�Zi(h)?VTOz_z!l#
    T�ME*WHZۚBzV#<*KY32ךHfRh?0NӖ΍.t+RͮRz#	*�@Cmت 9˵3ȚT" kQJX905 #k%JL`
    Q&-_
    QgF	x 
    }A8Ѐa
    XkhO,F;p=
    cİ&;PL*[Xβ.{`3'STDVӋ*KAms9J	@
    `�ߠ9_{52bv ݥDzv(]Jrlg1uh44ӟ64gBMӿc9MVzDlHcЎMj[Fn{2a1R`G'聊zb-1A-bmkgGk	>
    0z!D!ps]{Zwa�gWg+E#-a%£DJGv\{h[F/95.MC*l[XϺַ{`N}6sNm{1ysg
    Xs6lQ1h\܀MS#Fa(g^(xTԗנ
    yuzw;7>5PQG|(.*R1T;=7GE9y9o`{OOA)N/o 
     0
    pLQ=
    &�(� c�p>MЀ2=0
     �S~�ځ
    S가-(c0H0+=S �IXi;Q
    MTKx#0Q]^؃/Q(�K@ڱVHHD؆npr8tXvxxz|؇~ޱXxxCj'_'�^�|	 	Aܡݱ	{P_DځNHہЊA聺؋ځxȘʸ،phvሎ±7w
    8Xx!긎؎xc �.9Yy
    Ɏcfp
    H�脼ّ $Y&y(*,ْ.084Y6y8:<ٓ>@B9DYF9X&vvvVyXZ\u`b9dYfyhjlٖnpimgf0P{8o80Yy٘9Yyٙ9Yٚ隲9Yyٛ9Yșʹٜ9YyؙڹٝމAsL0Py虞깞ٞɞP;i鹟i99z
    Р:7pzz z$*(*$z,ڢ-�ZP6z8:<7:BDZ HIJJڤNP'0P:Vz'WT*X`0aZf:�jlڦnpr:r9xz|ɟ
    �)yJ٨:Zjک7Т*(
    4ڣzDCjEHʤzT:ZVgjpzjtvJ}zؚںZ*z�婠Zꚟڮj
    ڠZ"
    *2zJڢ@j*J	[ګY**]۬_JˬڱuCiZ&{٭ުj;z:z
    :k+ʯ$:L+jGz۰VKZ۵+
    f{[(l˶*-zڨvzk;۷ڳ*K&jꯥGM5zRU{
    Z\{Xda{!;!0lmڭpZv+Jx
    J[J{{;*Z@k?Yk`ʹK_iKະ˧k牿'KixZ[ẻ{;|k�;<˼J3Zҋ<;Q뤗;7<\:Rڥ륟+˾HWڦ
    N}:lVYܞ6;*˨*8+<z
    
    ‚;Z&l(.l5*0<í:<	Kۤê۫L_ZHM�KĠO\li\y[+[LŴ[˼\Xܻ,JiLonL ro{$<{}ܸ/-2lȬ=ȌȋSL盵Z`ɞiʠФlŭW,lT}ѯ=˷|aL0\|0\:͔?
    ۜ7"|Ή,,S-=J̽]OZ@쵙ğk
    O,Xʰ\˲,Ѹ"
    q}w׮Ye0-2]ӾDD@͛EMH
    x̩JRK\8
    VX9|⻹+РƊ
    =}nmp-؄yw]=]'9Ɗ-؏/-<#<˛7PLՅ<<Zۻ][}
    [{MjlM
    ϝZl|-ݺ]Ѝ}9:̊5MݠݮtH=L9p9 lCKz_>_ଊP;:ڤKj>:!>礻ez⥜l˱,˯|}ŁM3^m̿㍞)*ِ}̒ӖIn�Kn,ٝ=tLo|kY
    #acNj696[- N~#޾xA3	w*~<-8K*m>Gڠ.jǷn<+ik~o^]͞XCN*%kt;Jl**TN^󰚤:RˮLo;՞T_~=>$&閽b0o�>!J-;9;8uOQVZjLNPR/V;qk]_a/N2 jj*;J>ƞ|៻_^{\l!zZڜ2
    F`՛U-Oݣ/R_[[ēlW:?_k
    P`A�
    DaC!N4E5B,G!C#YdKLK1eΌiK9uOA%Z
    7r,M4iЧ9NZ*wYb1Ǵj!kXiM+íڲlm]2@j_}&Lfx03P�0e'&hΌyΡE&ÉӘOFݚꅱeϖXň#6mwqgys"Cz(@Nn'r%:ŏ'_yկg{ϧ_}�0?nTpAtA#pB
    +B3pC;CCqDK@RTqŜzEbqF
    hj
    )GʬˬK.-Zɻr2ʹ2²r1+1˾r-:#46mnsN:-ӷl36<'M8݈tІ3Q\qQF[jѠ`qRJ')vG ;Tȩ*#JwKrUWɲrƶ.s50$33CLa4XTsmPY;3ZSO(PAsnЏ\Ui
    \%_Ɨ|t&s_x`=uJa;MȬ"uTΰa+!)حF6d,d:L3cyfMXsY4J(3BzhUzimi04jZݕu4_7;7z_¨_n`6t㭐ȍ3xceUO.eSkeXwdim^sg;og:Ať6t-T
    c}iEr�s}%ypņ0g|@W᫷z~|{nJ<I;qE>oy%r.aNUn9&t!EP*:okvGjNwv~BW@P3̇
    е+P;a}CIB> 1);ߏ1E+h1c!Sw.Yxƙi
    d@7ё2c/.i t:}"aJWdC,<^>E/d%"Q^IMbR1gES&!	k<m1q#3F-myK\ҖZ13QQx̜g:q&A@fSiHiC$F!#i#z[NxS|';gx{"$ɹ=ઈ3B(�:W~L3YҖ<f4
    G)j!X,X089@A+eiK]RT3iMmzST;iO}SUC%Ni+stEST>E}peU[]|OZ{3b@M@	*RҊgh
    :�i-}DxcEa
    :!jG!jQ!"11fv]a;Xj
    &"miM{ZԦV=Ѻbr_Bmm{+\Mm`غ"mqkqd
    a,ҋꧪBTnBv4Ge»�N?B{@	r}ci_Z!Xcganvep.@ѲVp-|a@I+Y-Vļ/|�8bxVW$1B	,B(cQJL.Ӏ*1G(C`^-Kcȣxd?k_ ~`�XK 11(\!@0h1khB t-}iLgA|!nģ&}BNaV:Mqp{n
    :Jt:`	0D:aF0Ț zJAQ]~Y./`DP	hyÔ!E ^HbTdw%Xhv!ИpϺя&5}qg\ݰYjB%'*YU[D
    a"L22!F]Lֶt!iOOir ldnqo1_yP2I`Բ�ͪ!
    W� �x1C
    ($ЇFt.\8%qg^4]{X7?P軆`S?[zj`{_;yXLhC>,B|`Of͋Zm�&c6>nnc{0޸22]a;G?p 8?gxBcE<8ɣCg8λ@@
    NsY֫K`A㇮+Ac3`*7ArW >#-S	?˄L .5yhVm3;Pc`;ꑇ%i40PPx!�8�@9`�}C
    cL8	tADqDpDHII@LDL;Uҵ$EQlpplQ\P$tP\E<EU\EsE]EWP%_E_>9x	!$DBN�Fg|_2Flt-7p78g_C2HG?5e07t^XC,�9}ԇ}xjOPC3D+DTD4F<IHlhȎDD<I:H+E{	IR,|ȉ|x'ɘ1V$ES	7U\EA+$��\>�`lk?pJjF2 n.B`Grdzët<PCwt�ylzLfG 8<gHHc4D8H@4	HȒTL̏LDI<D\�2Ix"2耜}6iM2$pIY4EICNJ	Nc3K\((Nh.q;˳܀,G_
    UGe`v5ϻjKc?lGO|�P
    ixf(Ѓ3,VxVxЄ{O(FɑHILHѐQD5Q<,MlQL]tMMiMI߼A1M!R,Ri$AN|N*V:fR_$,a0
    o.LL	hOztGc�):U<eS<>-2؇}X<h��
    D%C[M4r8`	X�@ԈDeUMDRLUP|QXՎ[U
     \U1Q]5]ʇ`R_�#=R2[7buJHN+3Fl205s5Wȃ1-_TO4Mt<UzmGS9K;e</>
    ?݇*@ EdAp;,wTL]1TMWԏMRISX%͎TՔU}CXe,c"/#'ih,FfhlFm-࡞*�@`W<3.0,xW4
    x=<X/5�t]~<-lx'2>3\`i !pBc܊KOuNِMUQ]YTSHTWYm]]	Uڅ[5Q1]e]!51]z*`!=Zgm^饌%RN�łk!X�
    __Z3i(nZm8<[d0
    [iB(�EeSiXA?1AVxx`1øS�`�cHp �.`G\,V0�-8a!=NU5Ya-]\-bY})[݂_Mu⑋/-w�."b1\_pa^g݅^fp$u_<^7P_5p<v_H8d5@d`��c1�.`i0~5t(e_`fW`5*`u4e�(1 a�	xP]f��am-f]Q.PUmU5]]ff&b#fEbURV=^?b.b|T` q@cM5>ŌncJN9|ecc/&Es}FP_`ip~+p9p`X^	[1FyT&ch�jXCSa}AcXL<kfFIm[byf`-=19V\=j.3[{6~&_6CA_6C}kCsedH^)hS6~PP&Q	>eXVW.�@1`%4A�Vf j̢渣NjĥNE^w~4,I.N"lPړnU{g=%H�N9XLtE}o9f�oUG^J>x�()V:˺쒆Rx�D-e~V8~Pm^qG>F1u6N#@mgnnr"c^XcUh_)c!(o$x/]PXPDU�hl5?]RNwtQ:I[bG5pXNc([@t` NqnqE_C~f@ߢEQb'A#0.P-Fߣ$xxXuVgnV_�XuZu[u\1uC'[u`7s4;CCv`UOv˶MVκKex\`m7= �<*-w'/�hoDgtwwMstNc�iTjn6O+@_qQ/xixS/RLUZ\xx^dg~(7xBv`gufz6ximumt/*yyyyyD)wHO.w,5-"ozzG_]hxYxxzxeuf'�	{;e_d{SpyCoyoy؆{{{{{ouv?|O|_|o|o|˿||͗|Y|Y`ͷ|(}?}?wӏ}|}|}}_Q6�G_+ɤ2X2nz~"xzw~? ddrg_s1�{{1,h ƒ\Á@h"ƌ7r숱>C,i$JV
    2$˔$]diӤM.b	&P>UG(ҝ+2mRRz)rmj+|"n˖+jvˈUҭk	/.l0Ċh1Ȓw2˘7s&`0@9npӪWVF=Үmm#eǦ ?e	t%΢59ύ>U:wbxcKtM˷X7ܷ|
    ^?fـIYfM
    ~j=Yi%akjxki$E8"鶐o)KDכq%r/dth]HјA괝TWe4LdQD03D؆a%]z%a!lyaDEq	ќp䐝k	|\H'pZ衄&Z(LӚBJ:)A"r)S"Bi):*<z*DcΚgBjKs+
    ;kpJ+*,J;-Z{-j-z->喋.n;/{///*3|0	+0
    ;0K<1[|1k1_0<2%|)21<35|393=3A=wwI+4M;4QK=5U[}5Yk5]{5a=6e}6iY6q=7u}7y7}7>8~8T8;8K>9[~9晿ڝ{9衋>:饛⧫:뭻:˞~;{K?<<+<;<K?=[=k={=O}ST5>髿>>??k_??�(T! 2| gD 3
    ^p C(&L&.|!c(p!sp54{(!Fw%2N|bD(RV"xC,r^"A0f<c4n|9ұv4=y# )#q<$"]}0|$$#)IR$&3Mr$(C)Q<%*SU"_)YҲ%.s]򲗾e)c	a<&2e23G3)iRּ&6ygj&8)q~<':өu4;)yҳ%<}g>)Ё=f@Ѕ2dB*щR0LhԢ(HɉQFrt%-#QҎ.eiJ[
    FT$)']jI!)Pʑԧ:L!SLɥRRPխrTuRmTJNeYiӫuj%V*׹u^M*Xױ8eiYҢUnuXV/`׺R%iRk_ОbU)VQSvT7hcZ0F~}o_ذEn\uŝm+]vV
    iW\Вڍmw=v;mRaX״Q%h~=ö{+5
    fni28>s-|
    s	)y_W
    a�_fqc,cf~&m+rULbW8q*`V"18rd(ױ툫lװ+e폕,1גɹ$'իJ5n楙o4yu~3<8==,Aτ>4lD3^#-Bzl4k~U;>miǮҙ>eX.دAJSsU5Y]?Ʉ,}!YRs"&*{岭j̪SIu
    fT.[]+go6_aK\V$6)67I[}oo!7A:o>%l=\NG^5Ń<q3oCԅz|S>pcX9xf_9"BIr3σ.de_Mot
    9+a/2
    g-Su;Q?D+LZV1_q2r~%.?<YQ%<-
    ST*<C/zK>3?=3XԳ_/}=s~=# S>k"/;1??{h/\/??� &.]\B1 FN V8 Yn vj ~ 		  
      d 
    ֠
    ޠ !!&.!>!F҅N^!`f!v~!B`!㭡!!֡6ޡ!M!  ! U#6#>"$F$N"%V%RT&n"'v'~"((")b&"**)+b)","-z,","."""N%0#1^."2&#'2"36#4j3F#5N#5v5^c("T#88b?h9b6#):c95c<#<#76.8#?<<;
    d2#A"=A=c#DF$9B&$EB^$6ZF"GdFjcC7D$JCHvG$F~KcLJ"cMFH`>cJ$?L"dP~"PRdQjQ$LeNMIVc$%D&PRƤUdV^%V"eW
    dS:N~$R#TVz&%4e;?0%Xb]XS$#R%GZ%`&ae`6aK-&d"D"Gube9Mfe}if4V&'&*gn(>(hn"k:#gekn$m&,2%_I%$*`&cJbfp'b
    qd"izf]jne:V'CƦeb't%gfwg@RlNmyz,r'oCNa2b.gd_6qJ`s~yuk
    htRk')&2ht2({~bi"(f&WR&xz(h^fhjh6eh*脒n'e0'`~&f%qq$(k^胞(heJ'胒斂"n("vhh)nV)))~&"F)f$ލ^⑦#|g>wZ(xr.h~izr))jn*B'iꩶ*w奮jΩL)j*$jr2|&k~V*:sB$B)jh~釶hjbz'*驒k+^+)Vkyrkkjf
    a"icF*c>2r,~Z"*ҩzbjv*J찺ǂ,iŊʞgbj*V,Zl%FlΫҪuѾb'V,Ѳbiޫ뀆zӆlFm2bFϮ-$FΪkmxkDzhrl֪)֭m̊֫4li܂(ʍڲ-dX@.+We=.*;vn|n训e"^L®o#.KoK*o/.J%ޥVoA[bn.NoOroE*/.Xj/h~/>o6o>nGI/W�wij/7?0GO0WO^o0w0/0
    
    0c0
    װ
    0Cd001'?"/?1GopO_1gco1wc%:ZW11"111Fcqb-㱢
    'K˱ 2!/+l&2J.1$O2%!籲g"%Geqn2&(s2'#"+z2)#W2,Dz,qjr((1rqaq$/13)22+3/24G_r/226+'2.s6r*o0#734:o1556;f/3>cs8?0ǧ9:@O152+w83?)8D3D4Fg4.sD?Ds1E4ED3I?9kK4sB׳.AE33##4K4@J14Qust$31>4D7#2:wR?+QgV0R530qMt}9_v375?7>4/3Vǵ\;00\5^5u
    ߵ^5`q	`
    u`6b1_'6c7c3b?dO6^G6e_6fôeg6gw:?h6ii6jj6kk6lǶl6m׶m6nn6oo6ppwm6q7r'r/7s7s?7tGtO7uqW7vgvo7www7xw_x6GAyvzzv{7|Ƿ|7}7yv}){~?vv7'/87iK!x7vv38xr;how?xS88xvUphxxvz9j9Ocx'G8{Gyx/ysCyO㷗׹6kSy_Ciӹ73S:Ko:Ϸ/o9Cgy8:::z:w:s纫+pgx:9zz9ۺwyzm{wg;㺪[{S;O#;㻮?:y;<'|8U8ۻc˺;:K;k|+<ʧʟ[<[;c:c|C|s<{̳3:<'}|gǼ:K#z{y<O7:OzK:=+=۷=<{o<zS}kڋgy=|c;/>໽?3TC>gw#|o>v>뷾볶>׾>Ǿ>K<C2"?)*)2(:[B&wbbs[?dfz?&?2v"s?4J#?94xaB-tCFh"D		dbȁ#b܈ɅTRdRK2g>y˜wʂA[my͝	jT&1"Ueʤ)j]V!:L	b?h˲mVmVe9[\k/ϘuP-lAMV~J*VGع3zT+$_#K.tI]^tv68Ѹ?svʑǾَ~[gճ}φdS6@Խ?/}ϳ|2؃O?tZD=�lp@
    +/*쪨4
    .=;˻I,1ÊFV܎Tl;ҲmHw1FtQ5Q!i'q4ѻ'3IJ`blT,1@3dP6}B	3,P?3S|N
    K<;0*5F2I(6CO4!s<tE몓q$9PcqUH\ӊG5rJ;uFXi|uGQ_4$>2m15i	3BVȐAD*DF$WeRR)<Uqw3ek]Mtad]{,y##Ѽ}q EbId\dn5ﴓM<ێv[e=&Wpd̝
    Eܒ4TQNT5.;UY+iaݴh'EJז}XZhYq%up(
    ]opٿ'?n
    e\o5B	[Ovg!k.E]/(H+3rAa}*w6GQ&
    ?_襟ꭇ^\}cc
    ڽw9_域ߟ�	X@	:g>>)XA^9@f&*IXB)T
    Ut=1iXC9>E93(D"ITyB|@| XERъYȾ&:}XXьiTWE>'DEQxG>bhG)ޑ}tc)0$ 
    	HIr$$GEQ?$IYJSbЍ(Bc+iZ2"KVfr+sIYf҈%1dƲT.OYMk^\e.[
    3T3KKsTg9oћd$'ytγ'6OOp=GyVFR	PjbR|(:Z;@l(>
    :ˍ!HG5J*Onu<;Yϔό)LIPQ>IRu&}B?JQtrĩGeҌ3MզjU>ZVnQRUkWԇsojNJ˯ԩv^mץ:U<Y	[X$\&TJS\f5Qt&cLӭycZS66tͬaI["1EI^L4[xEX^նլ(zU-\ޘ%չѕnRN׆vEvwx{P]Sz^|;T~_o	\`	V>`0d
    A2
    o!p##	6[\R6hLSB@g4F
    l&n{.I&LJPCd2{XX1lY[r+e-,YB沗Ŭf8ϙb~3f6frg<Yɉ\̠qIӉ&ۤ)'51b grVV,g$3c
    Zׁ5e0#k`&vg
    fS?'듓8paq.+MC,~\Ȧ]3Sݪ_+rvAή7oA7kLwct,1kxmncR0n]o&iNs"|ȎWf89^tr.>nkO-o$WO~3^w>khWxhDnk;ltq-ܲ"7Qe o۶<C|@S&Lt
    zt^z|t_]K–i_{y{gI^='~K\>ч~{(}_}ߟi~?ռ(^~_SwgXOzPK�
    �Hkʚ�q(UI˵nj*Bk*01$*O+hi	|kK^/˪hS{PVPwJ[ajɊP�}
    pXЯV+*~4pKp"	0~p@+(С@
    PG
    0k	i0P*!j-ГrMі0q&6QgC1dg0IS4C0 i}5opHNokӑbr,Qr&q!F"r!"BPڣr!
    B K,!$<$YXl0Vl!6ެ.,;
    !,N$fm{$1.
    po0-[&O"o2*/`?4
    #L"m$Qr md2..mGN&q<FTFe6!
    qN�&rn-2�n&M2q4EO)./Vg"Ժ2@R3of-sS|3C9,6c/n./mFs4Ef9Z:os,s-\n.լ(?2(<r&.93 4
    ds)'"3&SL2w3>�L$BW"J7,:C?DBGT|0L4[rwE[E_FcTFgFkFoGsTGwG{GHTHHT^HTIIIJTJJJI{FKLTLǔLLtJsBF4vKa4NctNftKTOOP5HT*dFϔP"MQEUPwQ+R]MO[4S4GtS#TCUTGP)5G!R%U=dUIUFSUE=)huOO4WkNyVw5NW4WGV+WWXYV]UZJPuRM)PZ'[5\u\2ĕ\uQaQ]͕]U^[F^^euVOW`U``u`YVV
    6Oa%v`c36I^9^d5dQ;Vd5^ەcUMdKdC6ecf_Vdmve5PovfGVfR5W+WY'h`VbUb#ViVjUa-ViuVkVGQgeegfSZo[e?]iVeMVl߶fm}6VTg\_iWjpivstqqqjVr'QnVn{lskvomsgVn7wlvtrEWs׶o_`6`vv5awe\pYYvp7rWxW]rlO^y6zu_E7mK^nWexUy?_M{S7kS}WMUHWRݷI6qCWu~O[T~~aDX8>7#8#kBCr$%XOTt&-  4).8;>)R82|mP6<x(%/LCL؄UB=o"c!OK"0pQ%uS&{
    $݌&M8􄿎(&xX&
    M3e..4(MAO*!@)$%JӏŊ2ԆͲ22xӅmN')3.m8/$
    /-j6$pY6ómR}ؙ_N6'RKvM=.aNK5mAWL
    poӮ.<mܰ/r;9ӎ{N*Y79-8s.}z2#g';&f:9C9W3n:\9Ă'.m'yҥyZh͚s+vs?e?$?A25(
    p/ZA_rul:Bq'K?M.ρڮu-;ګlE۰G۱vt}ijE#taoC5_tWN1[Gw26QX{q_Ih`NkG]ERUk5V6[7g6FOGy۶4vet}3g;X?UqwSew';]6owf;LaFw5wkwwy5aXiw߻v{hre7
    V'6pp/p5yWPz7[u^zyyEQdՕg4{QĵfV_ATo^WW!<rTȉ3Ux+akw{qCʉ7kbVÃ;t=vzזd-r??|lg{;c;f]kۼρvwhhm7#i5[w|a!̱їˣсwp)jj!wӷz9^{OVzš7tK\C[o;s6s̋bQ=#}ɋ׶\pUb3c[̻ۛ]*a|j}q]|tͭlM{}ރQtLuy2y7}Wҧxgiwu-^ȕ6==ᅕ5qw9ӳ[x۱_uc~owd5Ľ{cga=\qC>}T՝I]S1V~7v;o;^Ǟ3t44^G8E4C8(0CMS411鋏m8!ދ}S(.stRjҍo3Ϻ:+	9,%m*nO=)9pA
    mm7!Δn!o$YfsZM9:吙[ y-,I19<y,[?,h …:|1ĉ+Z1ƍ;z`HF\82H!Mdy$K*Ol'J6gT2̜<51ҥkiԩT^dJU	z=5!؃bU,´ϒ[6\tڽ7޽u>-s߿~,a5#U8P+_Rf,6G:,Ԫ׮5Z!C`SȚ6m˼{
    ϒ>.J(0GvnN藇#M<Mw,~4gs͜zJ+ݥ]{>n:E'-oVMՖi`
    .`>!MHaZ6AB UHb&b*b.c2Hc6ވc:c>@IdFdJ.dN>	%BMV^Ib/je^~	&9#K-Ni"*".66dJe`Ti睂Rye3(=Y)^rg="mrz%Ui}6J㬖⭰s&biZ	*l[gugVImK-6[l^|;-N2kچ..^>(N0D.l2Lf'|0O<;gSo![LVe:`lx8[m7w3lkE;}G-H)Ip|(bWűm-w}vht=]%s=25Bn:gJs8ۼX5y;N낃vd
    {ޅͲ7+/8O$)N=OC:ksIlұW}Lo9߯u+myg.y3)p
    ^fR<殠NZ\e5DZs+!F}юs[a
    IŧPY
    VЇR˂@Lkb;w
    \<щ
    \&)$ϊ^|æ%kSw7D`|Rc;E<Q@
    r,!D*r=ElHir'?	PjWf̤(OTrl(,܅=-sK䲖e';`r?!e,2a
    nb,3)MisNsS9M&3q6'Ll*4;syOsꓛt05b8elȆ:Nd5ji<x¦63#
    %7AKn–x4,hI/zQ	gl"ѮT'xdğ:iOWSpu9/	N
    %3ɐuӟN?M+)4홋lZQt!K5:&piXYkY׆浪*
    U99Nc3*c+"~uN2c&s!eH
    V4LmPΕwUXڴ6ummB<}k*-+B57IvR\Df;ejb,7u3Ш5b9mo3Wr5]kcVВUrxY5omY6A~	<Fԕ.�׺Pi	v
    ӓ敵iMK-4
    k*_
    oB9:
    φ(gKfg1szCÕS:qem<8=>Tw<Od :V|bEyd.\Z.YЖ,ْt<Mz@F|Q|%zЌn*IAGWEv#7K(P73?vZҤ~I:dJtf}@luS'QX(^SH.Pi:\粆l5hVmAx.er#"0Tc梼,E*J3YFFzObVAk?'O?ޮr|ZVBvnl|;౟$܁o�X܋sA,|"Up.s30rz*7:jðG7רUA\�"Gő[VC{utAq3ߟ75K!)w`E0zm?`胞k^~/]vgٗP #oh{\+_&ϻg5#jCrmwRf4iDIo!#H_Dq#Ig	g(8Lv!eȁHoNkfa̤K4OM/hK,3(M#9LDPGKM(HM*Hde'HM$DX;8Uce
    WR.]hQPka%Q%Z%a_UR(vņjb.\DeW8T88T5`%TšTC]7Tu8vUJ6ebZy_4Vm%WSVe^Zm V#FWREba}KPYuY5ʵX_=\`>``fEak(V_H-RUWanU_Vefb^u(_I>dDf\X(XE`uYF`]ՌUH_V84bՊWՎyW_(J
    Fc\ 	y(9PhŨ\5U(lExbؑhb/U^u+6R	Ya!f丄!2c	6RT8QU-94HN;ŕX]H%1g4ad|nP)ezfǗ}}9r�y9ɘ6t	)	+9#?i%~*	BIF+l&[r~_kQFiI6i5r2%2pz$jIko6'FpĜ͉V+ŶjᷝWiʙ{m&{R;t&|m[s|SG{٦/:	4Lg{əS|-LCV"}p6o1KtoG4zSvou}7ǝxSpdzxsrH;TtVcq gxqB(:9>BW.>|:{X4vOduysrcs<g74wDwsbt$t!jiEm$:6tN#7{O:a
    q-[o:Bxx@r1zE<vsקvigZoO*=jTz
    x69>_?}>3xT>* ^?wzwR:}ʤQ
    w@NzVzz^vL"zB$wCWm*/m>BgoZk7|B(gB9[|OnַEz2dpT
    7v^}>7WGf~MҙE$-*#Y$
    gFMW	|˱r&B#K%;yN\bpKIiXUe8MƄsz>20^4bi3JI$8ODLFOA҄_cB!@Ղ%_R"eRZh2uXEWqHZaK9Rx+a)vV	N{>7hU;XU%]XوF&"q-X^HX%FI[eȑG)㸓+h\(ًOcy#'U_x[ވMN@XZ<;QbkVȎH8{kXUi9Sfi8	029"aI^ޘ)xϛu{'%ֆi|۳kXȒ%Y,]+S{Ѹ3ሄk8D9ٍk8Jb9l\{6hA;vw\EY[SŶ<T,+YP+XkJH.JqgM܃3zɟBə쁈9ʭʱ,˳WAY1˻˽h�,Llnjɬ,Ll׌٬,YT,Ll-Mm	�m"J
    -Mm
    !-#M%m')+-/
    +m"@5m79;=?
    A-CMEmGIKMO
    Q-SMUmQMY[B]_
    a-cMemgikmo
    q-sMumwy{}
    ؁-؃M؅%�;�������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/manual/images/chapters/jmxConfigurator/jmxConfigurator.gif����������������������0000644�0001750�0001750�00000101245�12143164146�027475� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a��j�bone�ZO&kU.�KG3mtܠn	�<t푛ʔ3	/>eHCnQ֒�Zh�`Tu|U݁�X3}�=iFߞǺ*V|VCyqǙ(ο޵ҡ(�Hj�U�S;1|Gпφ1ٗyEbkAԾcf1ү#kJP5&x"�_{k�;m=,Y̹�Q踑�''`�&NZIX\
    feT�>Δz�4O꩚G�U~�TW+1jx�1uhQPo���!�����,������I!njaa"JHŋ3jȱǏ CIɓ(S\ɲeK0cʜI͛8sɳϟ@
    3#UӧNHBPi$0`ÊKٳhӪ]˶۷pʝKݻx˷߿L8/È:@Ttªu+Wa3k̹ϠCMӨS^ͺװc˞M۸s͛bL(4
    T0Na=NسkνËOӫ_ϾOϿ�(hPp]�2�q!:gs_d.*!(tsҕX"&݊,0(4h8<@)DiH&L6s6*T.
    )BP
    $rP>]#8XH.)tix|矀RMVf9lA* ʣ*@0ƙ0FDԧ*ꨤjꩨꪬ꫰*Ԑ?L밸#<J,sDZ#7DkdfiLRV+k覫^)k�,k'7G,WlqPLtq $�QBo!G0r'Q8`3<\2!pC)P&NGӳ01SXg\w`-dmvl
    :;젱KlLDH")($7vߝ|
    8#c3A#L 6|u #RA/DcLєz2.n枭;p/?3m8m?0ww<O^73l.
    F#m.GL� D->BpL��HL@�c	; Ƿ9Tz`6A5N7]gԳw4S
    K4
    јP-4@H"HL5X8Zeà*Xe
    dQ%h
    ,A|�@ƠTCpTnx|l@|X%\.;R-l]|)hB\$!Ec3]
    qD~k╷	piBp@6�ay@ZVɖc^$0K\1˜G1$1fҘt4IjLP>(2,>ԘMhqrr5RsKy6$nH{#ˠ?
    0;  TB?̰.CavjxAePBdB%
    nthFkTvVK_с=J3AUBG8ӚTM5`Tq	Ձ*zUnhĊtU'2>Q`8hEf"عN\B) a͓ <,XP�TXLZPKJR଺valִ"-j%T8,hE+Җ~K@$aϲSZӜkO(�H
    5e qe
    Mwӽp{;SZV\j=\-hW>\P{ \^:}$:'OFM8@,Ph<Єv`vj(B@~;.{8C
    ?t b\ _X?k!t!83Žqa ķݪ�bx06qwldgHNcVfMn%-]0o.Cf2LB׸?Pf
    и@3 0d2`(�=d I^HM�zMn@CAh\][>zաu7+[o̰jD4م0e"{t]=[?.|P[Vy|f>-݆N6CV>/L@+Vy!,uDq/�M<*Є
    PMD;R
    �P#\rT3?HP?!8
    \c0΅ZOUfWܭ~	LdļқZD>B֭kGjW)}HH1~@{nS4:1Psӯ�7D.=TeރYz:(:^aXb1~*6a25� \iTP/=	?{kǸ!CP?=~$o3?EtFb|Gv}B~TF|Tv~G|hT}'C&~~bGM
    0~6Dg5@v'"xp4X6x
    2
    wqc:71>X_ה3&qW35C�	T
    ]p�x9�G(`sB`r&s$eޠ@	ņPi	* HNfW��[7P U	w(eBpȆO}7kȇ~凇S&TP`(eH*\B8Y~htB	zh(eu
    f	x0Pxgxvxv`SVH2:PdsP=z꠆]8U�*@f�X\Hx1hn(fPP
    s(
    0v(ixI(ȑin7!TВ/ɈXbxv؆8gWp((xBNGAJ^0SupKi_OM;Ƅ+PX`C `"	
    01W%@!Px
     �4|)TBE7S9P|)sTRY�i)YuTS`}YƘ+6𗝉Śryy|9Y0c;�p)Y0,{)QP)	yiyɞJ4P9
    [9≘YYi�	yI:{
    )�e{z:$Z&z(JuNJYTM PI[iB+rQbio r``rq0l)cYw \ʥI}X�q@W:0_*�Olfu	8Pq@d*Ts*vj8NPr
    !ywfJymHoj8*8}whS8j!k{J*zЈxڧʏ{Sʍ}(%4PTS\|٫tjfz:P:z
    ʠɌʭ޺@	@W+;Ijڭ:ڞ!*T7*J�۞"aE}1<IWL.;\N<_E>HZ/lY88+"�AgyJFE{=yd5|`DLJ �Bŵ �(�WK^[{UT|�J%=	n˦5PM~e+T{j{SFLJ0з]+Tky_n[	5@ b[�)pc[`;P{uPYp[to�vAjnv_ۺ]+�˶ƻyɇlzkO[gY;͛{PK;_~ٽ߫e_{[[[[[fk{|0LpJ	׸1q:%<|_N>`+]�U�)�P:!
    pH|@a90!�&f@piЋ�t4 �A	U|m[ùkPT,T#jI+l<~+T2&S`Peu\�#JV\2+�dw		^kɈn�+gǜ|ۻ=2	+7"kP	
    @b]oa͌ʼl\gHɯ|ilmɚ,vj`	0cBʭf,˳LGZL#^͑0va+oX윸0LLΦű+y	PEbi.0ӻS)0*` V:=< BÆ`J! T]TI 1fP�Epia		@֒xqS0�n�a}i1x]�e=u	w=yW�>h
    ւ~z
    Nby֓M7s@<pFfـ]rڀmր]�}ا�ٖme0ڞm!T-`7؈&<PpFps=\ۂ
    ؘmp]mt}S=ՀM-j=ִn]ۦݣަ	=k	Mۂ{q	l}]zmםylg7.�	̻͝|Y�p*Au$82<ZK2=2/
    0p?An#\G_93;WJ;F@`b.`r0<pt�6sl^g.T~!!lx.�腾^^"~�Nj~阞~�V2	�7D_>HuGW冰K_0 1ԮyR0fPq퍤ޞw 
    [	0	
    �3_D*CLmL<ޡ ~1'~(*2>u6<�\D 5�`&L*ӢPqIM(
    RO%-b?dP]0]酰E0u�w??_o�f:N�+[PzI/)P\-#"%2y?_#_JY~ZL4R)(kG1HAPq؟ڿ?_	?@_ $8`A&daC%F8bE5"HGC>!YIo2dTADYBM7qOA%ZQI.eSQNZUYn:TTCo^
    z?iծe[qΥ[]y_&\aĉ/fm!7`=e̙5ogСE&-dfKfkرeϦ�u�9{;8nč==YumѥO^u�Q;8pw"O^L�jxwʛG>-Ï>R{J8@<{sA#pB
    [x8faC0Q7<q<MLE
    9D?DȜ
    1fH"!2
    JpI&tI(kJ<qF*R>üR,K4QP�@^y%O!@!JB5PD]?tL3\CFu;HrQ-ND:gq^*aUPEVEsuW^ESLCtSJսUv�MKSPKg	URGna3نRtqL]ub7-[mK^wբ{{w_~`bcYe-Z?<@<QSG22~
    I`%"y}+_H]Lw]{ec;�#>iExƚoaa`V҂{O-&b"dK怊3ƄE7tZlxװM{.u;]vӖ;enYmVyf;BjQ%O@8YwTpI6 w9&|
    *g&zw[_m}[sǝ>;~x'`+<gDޏ@| ok-ƣ)橠
    h	LI
    Xwnqv_?xd`3=gynGTz`}s*py�xȁ
    Bo~@\_sCN
    t`x@p>^72mz{^y&V+@yX*0$T#p|hC7.m{@PHchY\	hd"�DHGKV#+H
    &\P00x5Knc#ʆr;ns}K`%JMRzL$106A7/硈5~$g9h!"ZgH,$S|	jS=O	iɁ"TB=PNDoUQLԜIO<ΑtF&HY-v1iMA9`@;iOaѓQiXZODG
    iRZ͘(IjUJU<ç[jWy.)-iXŊRӬKDkQ)PyUsWՠu{q]X~^a:Ue,�	A",k5AAc#KY^?<Њ6
    hbZƖ6Ip֖7GnuFU%nq(\&W˅YT\FWӥnu{]fWnw]W%oy{^Weo{^Wu[Wo_�X&p
    |`'Xfp`GXv0r{agP0�+X#&qM|b.4+pa\@Dm|cX;1"RYW5=B$'YKfr%`+.|e,;YT6rely]s,*Ykv֑Ysq&,d<
    s}0!hB:|g:t-}iLgZӛt`<zÈ}N.'TZիfu]}Ԯui
    kYֻup=^տֵ}aOfv;Zڳ6"@Ѓ\,[&w}nt@nx;n}o|cwѽo{[W7l'ўv["
    n#m|mx=q\#y8P\+Qrǜ.wwe~󒟼8y[΁[]:lhKg
    6$4�n(6[B[z׽u0u]`'ݍvcj~}jo;wA'z?
    S:GtҙxH]
    H0_ԕAA/zЃ>]'}M~^$У+W}mzֻݰ=`Ao?Oz?Ͻc|_~o{+7yg&8`?/Oyc/Z
    z\?�@�l>wÿC?l4@@@+;@X?L@@\@	d@SA@˴>?ﻴԾŻK?l8,B88CZh~hB(|'tB'D*()L*B*\B(B,B+B+<C4B2B0=1C/35B5:77&14)CB=Cw9l2D9D)LCADC<dC;7̾>#̴ASDT�"X!LS�WdETzhB[~E_^E[a`$F`,Fa<Fa\0e,dFeFidf|F>EeF`nFiFgChGaFkGdrsq\GcidFl$eG[(GM>D>A;ET`XUlŇD$DB]\H\Iɏ4IIAIĀzȎI\ɔdəɜHIwIʝȕTIt1ɜɞ~ɓ$tQIɒ<J|I|JI<IɔJ<ʮɫĄAD\KCH[H@KT�ȻEM+KLL\TdLɔ<LʔL@z#LȜƌLϴL\IL$dL<,LMM݌՜Mt7tLlMM<L˷DP?Kȹμ`색H>d&3LXOttOOdt7OPDOO-lLz[P5PP=PPPE%LPMd<RNqQmU P�̀XO8#M$M%UR%}R$'E)R,RR,uR*
    $R)mR$R4R3eR&1uSyS(uR475R%
    <%S'R=:u;e2R?<e9UT9-TBEQƛT`H�$<RARR-US=UT
    T.EUVm5-UWT.U\-UU\U_uSHTa4Tcq@T>T!u#�kVlVmVnl=,jVr-Wko
    WwWsmvWqRwWnuWzW}VtVpaE8J=VqXh%0Vi\W%WIPW؉z،XWuyX
    f؂]YE8YYYYيzY
    ڝٟZ= ZwCZYEZٞ=Y]6eY݋i�Z
    [[-[=[M[][m[}[[۫Ѥ[[[[[
    \\-\ں]\m\}\ȍ\ɍܤ\˽\\\\čY\=]M]]]m]}]؍]]*]]]]
    ^UT8^M^]^m^}^^^^^^^^J
    _(^݇T\WH_]_m_}___^T^ 5_I]_f_.`>`_fM_FI;_�
    eC``agk`xN`
     K`Ka%a^6Va!%^bh(L��)�P+
    MW@b.&`.1.a5δⷀ�8H9:;!"6#4hhxb:(dC
    %
    pJ[_-3IJv^cM6<=Pcc}qp˅A41b,n/.GFcI^_G>0a>.cd6fdM`i98Fljl:jg:o.gso^kp&igygzg{g|g}g~gghh.h>~VSFehZ�~ȂWXbQ-ei&f&]KFi4fiug_``kfnlVvrjjnit&?rDJ5DE ؇X�b��iIfa^keViGf\6i~iVch涸ivlc>jn&jlj0h꧶`@�-퇊]jCl:&kJFkӦ6miVekkkNj&6lf#]4hE~p*@̦4%j
    enNi.mFmnnIFgmnoVž>*nۥ`* }n%nbfߵ>iFk`Vpae^pfd&akug8~gmowg&o>Fb&^b'4׀qq.H&c#o
    _Qq섫�[Vr,>!"?#O^rOvrKrM(k00s&s3ol4o5G8K{X{(tC{Os;ot<s6tM tOj؇jui(uiKcU_uVouU`WV7uZu[du]u^uV`!vavbvtdO8:==t#tevJ.v.3X6YvXvYuq^/w^-vu'cvjWfwv!v?vdte4.؍( m4poYq7wOtuox!hwwOvftynK
    x(bym4Wpu'7xZr7~0^_wMxs6xMOoOϦވJ+G`VH_y/u7ur7c/L'勯T@
    h8z1ȄW94vzpRzG`a{7{ F^ȏ|ɟ|ʯ|˿|||XSPerse;
    |
    V ��zt/bdWtYu}OSwy^OdzO0NG`W|glIhL~h`h>@n{mnݏi
    ( Ai&ǰC\Qt5ċ)#Ȑ"G,i*WTyRd2gҜd*vf'T@-j(ҤJ2m)ԨRRj*֬Zr*t2FAyȰ/LhѥZ yFągcaGVX1Vxqc-Ncș;fUp`*dº-SdMYƛg~6jY;'Оj8ʗ3o9_[lڵmnÁv9F.4i}(:u~2t6
    0σH!FXadmdidYFQ%[5)"+eɘn3O>5]t=#A
    9$?8N֙ZlJwY(.Ty^&C}wi�߁ƉRhxNLg.YU&y&z(-*"b#n5BGNG)z)Rudud-UM
    jmjkCe}fƟfuѩZutE8agg]^TWkʡXۢ($)Uz鎢"'
    "{///"\10|0	+0
    k8J<U&i*vMneE%@1Дp^|2&W<35 3|F3ЌEF-b+:)V!I\5]{5a=6e}6iuxGq˽ba̤vO.}%$1�	g2<3޼,]6<A[ޅyIyEMTBDs3ՏR":>;~;;;DD:׭dy*btFc=\_'1՗ˍI9_s猲_O{:P=7C�< 2| #(	PIPC2(
    Ucd"iT$,a5d=Ed|3G9Y!t_:?~A("��%2N|"()RV"rF"-Uz/&.g!684wX
    b$e',dR60|$$#)IR$&3M6bC1JczcT.8QcgsO{_I':@G@a ch4)iR&6MjeѼ7يn'-q�PE%<Cʌ
    ϠUBd=(Aeسi0i|	4P?Eu4&!LC6JSҕh)LQR1]LqZԦ.)P}S޴;x259dR=7ѩ"QD^}j~ tAB+d!Ná}kM
    PF#k2R\=,bqя2]clb'*%QE3M=-W>X>VXu0]Eƍ\>NkGO%--QZpn?ݺwty{WKz+W%/|^ҷͯ{ً_|ݵQJR"XQ XFmx^U	B۲6nCu&ws]
    ]K5SUs']fr>1}L!0d$Kv2d&GVnrd)SyRn2/ȫHh`y*p*\+Qh81Ɯ+;?݈U5f=+2VhN"WSTg@(G*B-QVS}Re.Gjԭ~uU
    kRZ׹^ukk[Eؾ>6j�
    6R;-ٞf4hA`�DZ=74pNtAu&\G5\1Wtt71	p#
    WxΏ;|1nq_3q<8G.r/ӼhFTiQ.y0H@ߍjx'T5' }o|CEtF1Q{?"1 ]͎}nW{َv}u{nw]r;>e';lB:u.FZxnVXU=^3v#6}z5TߥŅujݢ\n͏(v}?|_.WMg~;՟OO~}OidzD%+ayiJ/=%Z
    ZIݤC^̞D՞DݞMaU^ fn vy j =[9Mص
    _WʭJ:X)ZV9]HKHB
    žX]XsmIL!V^!fn!vva]|a@`1	J[
    llLɤ! NURA!4"."#68}!%V%^"&f"~bR#|\ ",
    r"b!"..$NjQx0#11#2&2.#363>0t"(VcQ:"dOh0n+"9,-ڢ-";.b@ԣ=#>>#??#@@$A֣"	$'Z#CFbEXcc
    P4F8AGc8:#EI<
    AA$LƤL$M֤M$NN$OK@4$CB!;*ϸcx$TBBLT7\%VfVfeUvW~%XX!ФEL֬Z%[[eش
    QZQNISXVTLXn`ne_a&baYruCJA $;\&fffn&gvg~&hz3&ii&jj&ke%\]]\R$SFoC0TB%�o<eb_L`rzCq6s>g Y&uVu>QJDe^fTMT''�'MCquzr`B'}{gtFt^'m_nbcLf%A(gLgagp1{a|',b+}']\^((T'~勒bc(6d,[(X@CT((4(PAA~l|+l)vvUfrz|~ni?pi)i?i˜)V'])zÚi)
    j6*"j? *ThtE`FevJ^)e)֙2DAUXAAA8j:ԕiVj)]pi]pii**j]i
    ҩ*fVv+&럂kj(.*+]6C]at2դ+܎BH4qۑ"2d@"ɰ.ff+j,V~7ll)nl~jriƬƬ`nrk"kzj웞롺h,'+Fm(kn*r]i$C ג4(yNZ@*bZlƖ,ɺll݆+Ά+-˾,*,z*Ю+"-:jc~.~\-Fx&l6�4NAJ,,b+m*z,̂.mFnlJ+"n*.Zk
    mўnҨ熮܌hj㘮UɕB"n~mZ+,&Ȓkjo2m[:0noz/mgc'0
    {z*궊6�&AIoªCAL,n.:RRk3l.kqoV03.70+npk]|/^.0cp
    1IB䥚Qնo(Ȕ5T),p>\Uvl#)VN&.#o2VZ'2&(r34>*ű*sp˔oNi 4T2#cEVb~
    s.'321/s24)3-B*+_363Om3,3,rY-C73n1C2;2ss2s'3>i4C4ph6@W6w)~</*C?4DG20t>WE1dFo4GoE41KHK'4J4v,Ab2HS43_5NOOsdYeQQQ'X24XJ?JkB˴L۴H24O5WPR5R+uX2W:5Tu@K+4bRҴZDc51k5Xv^WXu65XWZ*u}BuD{RrNt^uWA_WvW6bv
    +a2l}CCkC�NV[6PcvAiXsWzvUh6t+i@k+kvl?4d?rmg5e%nsnoow%pGp7yGqi&rәköskׅs,Ck܆1n5vgWvwwGexCx7Oy;zl?,s7|_xt;~.){8fQ8/tSs6jTBj\@?9xl|#9löy%#7wiEW^y󂿸gtBZC7y?yO9S0]/s9f44_?k8G'_9c繦)5:33[tp79+?_EC9gz4s>yzz1ówjLιϹc_'oukzOz*;:K}z;7;3cWD3o?rW󸗻S*XX*=Ӹ[S;C׹{/{'o;y;g{O<1W|g9ṛ<+z@?<=={�3<_|;*_=<T<Fw{t>ot?ٟ=ڧگ=۷}kp?>r?t؋ck*i{}E}=7㳽#j;~wti=觯Swk~G㷾=}'+C糩~>Wrgto@G/>;?Cw[?c?
    3F+7@C?1=|jch1?	4xaB6tbD)VxcFSd#0C](  1iygΛ4yCsAXҤH5ERbOBejөQzl؞Ȗ5{2kٶe+nܟ:{g*HF,<qbŋ7vrd
    9ɔ+[}Y1ϟsBE^ͩU֫aV:{jnJmn=:4[LJAr{v۹w|x.7}zYI$J,]39@k_h0fkÍ)p**tAj4T»ӯøS!OYn
    I䘑muܑqa0K"<$\&T(D=0o3JÀ$5\T66#l*|1,PC:.=)
    RDCt!$dH%GIP
    ͔>ϝ	,	@̛<p6qP^
    ,nXRU5Y�NZŁeT!$(ݖnyԱMhr%;):kc兦a𶪰zAf7B	G޵NXn8FbF{+V�3 jvdl۔Ua"t]R}:5č+<
    X^香3zꋩxMfl%Q앹m1i^~PYKxc}ga8kAP1/;#==qtEqtHN(;ZadRi7>zj}㑧8ieoStq,]ӾէMJ,_ő=t}]A~Wџ`�	8@Ryϋ%]<F(QR^f=v=ɘ/dS_4^~8E
    ʈZXĨ}pD'6�NXE*FE/na8FiT#2~q"A	:kDǣP)4	O'@BhآPz9W)v9g?~&ntIF9R,*	JQs<xG
    qrHw=e/.
    c8Al$MUS3$tf~gDX\IFV2p,gIu1g X5M0Pe6Kp@b#j01sM~nd'P<g?L)G!ue;	6s,X{Qrh6#3$hB**SG}fCPK3/*/'q`*FtBr~x1iUZڏhLq\1Wy]D~_kWUl`uvыfUOc0P~RPNV%6cQʾXWU(IъWխmEl]W
    `Xuʕ
    IVEHOն-՜\ZIh%ؒJʭmo{FU-g=-G�n+V?qM�x]K	g+`p{`#,s-<V׺>kvWR/CP6nKҖo~Eȿ+azذu-ql\27X;,CwW`[n:ݱaf7(ձyɞ9E=nI|3n}1hea(\V'dr5eOӕ›utk3-;jZsՊb/kd/ٿK4v˖v<,PnRԨ'b$YܳNOFgl-[)ʱq-5lHXFV0S	v*T[ .9) g}88-[Ϻs]X^e79#| K(8O5:ԩ^u<\Oֹu&\FwV·qos+wOWǦ\r'.vu{즙6os+\9D_z_~ﭘoz^<Iam7߷?yWS{߯_u۾eo	V~</}LI%h~>Ï~(*i��cM)60��O*hq*"PWp'ptcQO7:?phUo)	gS!))/[tF	p0	ǐio	k	n
    ia8
    O
    MNP
    P
    ۲QȮݘ	SI
    onPp$/K�pCQÎ $~
    cpo
    ?#1ge1_uv�ph	œAQQxqqG+c+Α*V '1ɱő_ ɱJG12##?Pj""KRq"!Q%!)QQr"$G�7&q2:${'=1w&$K&%r%]R!P"'&rt2y',kQH+(RQ!--
    2wq-i"ϒ2+2,0-B$+R-/)k&2#'$S//q3ݑŰ0CS4)03Ӯ(-S5-.M24
    053?P0G7s>R1QV8S^s/cS6k3Qt:G43";19%63's'?3S=C֔8Qz>????uA@@@A4A3pns=''ۓAO?7>CSACTDGA4A34Bs:)E?B=Co>C7CwtHGtAMPT$EcT8k44G!?y?D}TKTHH3BEwSIfnr?tttTO?4K@tLt1CCNOR	4SR7uKuPPǔUCQJMQM0N?hVRqJN-U:W15XOOXX9uSAUT/POQSZ!pUUNVmUJ%JRNuXNX\]\3Y�IUZMU_Z[5ZO_1>3Og\wWõW^USUY#]+]36OUP^mtELdReSVeWe[<$@fgfkvfQ`AgsVgwxgg6g[a6?[g[}6hgue65jYff4d6Ne k65`ke6g{hnVnni\6NihgіepScmkCSl,p+e6q65?sws'gkohiikg[t,e
    p3kWLET!wglWlee1kfQvjWyy?%N7GwyhpmwkqTu7_{|w7kW{eyW}׷t}s}zmϷf^w'%Z6xr=6qf7~8yׁ,~iMlͥulLl@BXGK؄OSX[؅_cXg8I3Ir7Tl|؁88?ς/Xf36ml؁X؋X8�@rv7l}55؎a+XK_2is\B!AA"Y'+ْ/3Y-r�peNG$ǷWW}8S~6%ECQ�٘YٙY@
    e9
    Pe؇Wff[ٕcypgv9=oyy|B.��ٟZڠj١XKewKsA7;zBZGKڤOSZIFڣ_:fkڦkڈaZwtCdz"_
    ZکZZ[#Zڒ'*zyy/r3ZA:[:zߚݺxsڮڮ}شDF"oa$,[<�eڲ/)zzɺrگ5ZQڭZڴO?\eZ_:g[Zّ/>jh?Wyn?8@([!J0W׳_=[ڴzλW;{߻?䛮ڵa;e۶E)+u
    A\#)-7:}.{&ī+	piuK{o[umܾk|s\ﻵZ[sq+q[[뻴ǃ<۽wSx{r,;ŝU|sL]g{yames{Ѳ\˃˹m̫]g#xH}9m?=?DLIQO?T]Y=cc}q=oC=WA\#?L\Oě/۵5T,H1ZK[ͻy{<Ž܉ܮi/wwW=OWa]?	>	}?>=+�Ҝś<řΕ=1;uϕWϖ9:;z]o}Y;ݍ|==1. Ꝿ~~꫞~뱾굞뭞^Ǿ>1�2^ة~yĩO~K㜫SŧGHV	̱	}۫#'}ҍޯ-B_G?AM1Q_[?YO_Sc]_ci_qG0^~ZM>C~sy[>y{Ω[Wܕ_㿿5}9Y@~;h B"tH`āFtP!C3b .2~*Wdfټ3Ν7iϡA4id2}
    5ԩTZrJ6(3Teȍxa_*Xlۺ}6ܹt΅7޽|8Z-
    >¡aF92bǃZ͹py:4hjK>m)R+ٴk_q{{"ċWYdT/6gf9!){Ϡ{)˛l`Œ5Vm zU[Ό??\z)7`Q`
    }ǖuhMtkeu^J@Hb&b*ϊ.#daT5utȣNBL7~HdWaUYiŠw1Hen!a)r)QaQ&ia?–RzF9n1މgz$40tC>#&ݡADg҆dWJd|PW_Vn~qIaf.Uififorh]p@k
    lKl)6Z>NK-)%=I嚜~H_㞊`*R?fm$B$opLpB8,O^lK.u)^[n9ݲnhNƆ1.tBMtFtJ/t9OM9_aq܎)b):n?R,̧՜!8c]8~
    xNxx!~q*ONy_yoxN\SǘU�rk~=ܩ)q>F;|?}O3_}o}7
    .d(G|?jq*gO*밗K?M~,	
    }lRK}꘥O~LS?1`L�Gxؑ"sH?`
    SXP<k@8EGD,Rks
    A36E,2_xΐ##`v4KAW8qY"ڇ5"(OX?"\awE./,bK(Є:l/nt'?	$ڑ}d8E\Y\EXYLsB4r?C	`
    sG^V~lg\E\td,yhT75!s,9mcLc*!CBTa<]0^s8%
    Y]s
    'MΉЄ*lb2N:S, dɿΰ%GdP-t$-Ǐ
    &<'O|jTPJoJt<QZ|()ƙ*u(N
    DyMUj墀W
    ְ~lb-Xgul,
    ׸m]jWBKN
    
    HTDRƬ�YkfRmeJj6,6ov^)WumkuvgMmˊVzm]wkYߦ=cRվvll+a},ujTswz5nc?6wsm{]Z7lx][$}*\z*x|oc+v)㿟,D2af&nEZ98&Ka/!/AcwIJ(1wY-v/`<(K5b+Z1ue# pȘ! FsRd2o%j7퀗8Ru:D+Uҍy+\"kj1Dg&49io|n5=h(/zִs/z赯
    _7<!3aLx^E?g3;ګtmA"#MiC[
    lo6f`;~e]|[zz.xkS˕vpJyiU/s{*,!7Me[.8Vl/;p'|?K]C^хrp+}=m/=$g:ӻ-:H5o]`<df{iqwveLUq[>tgiʻ>կt씯|U.כ[n~K/)Yw~.I~X'}x	7vGK	ȽAѿCfg//g}Aes].?4}f#pk6k_?7>ݽ?s^~~Et	pX}%�&pys5p�!(#H#(\+
    ]6|TvH]5h\n%$xͶւ.(XBGUgQo5oAroYp�_a(_8g�ekl+oq(nHRhF'8$p�b(WcHahl)8舏UwH͕VР
    %�lЇ J`ȅqUxXBWzHhq8u�
    ;
    t@ŘJp؊8(lh׈4(DkЀk(bZxȌ_xxzqtQ�!u|w|
    ~׆(Ix>э 6 	!)#I y')+ɒ-W�67ߨP
    @Y��H!`ga`KuNlIV9!pQIn[ٕGt
    Gei脒Ji7q)s8Iz4YV~�
    HOh�`NLOI'X#yuq7w8g]i/2΁#M!P!@5ɛ;Q9�
    3I'Ciǹ9Eɜ͉9a0'kȝt		oU9NP)tamTəW鞨b)QȚq#,QaI�	ʠ
    
    *ڠj 5@2y1
    HѡǗXUzJ5Z 9M9`Iz9YB
    J	ٟ9)�ȥ]_
    a*cJejaZP#m:#:s
    S\k
    U�{ʧV J@6z	WrɤFi	=x
    *<
    %Xo JJQ:r�zj
    m`ʫ꫿
    -k:s࡜ʬPRqj%V�ʭyo%׌jzb$
    ŀpڪ
     r
    
    +Kk	;``ӬV!ۛ%zXM$\p@%K}y*}ʲXwز`خ#j6k:-N!YOmq{Q 	iKjmTK(;bWA_@A0�gi{$
    ⪲qKe(3+5nʳFlG4RfQK>SkCrb?kA'SS;aZ+$$A(	H˺@됊n'quk	}+׷E}%TO'O4I$IBbP+KA(c;Y{rµ3m%yWD`	GWz*W׈˿6Dc'jj	,qdjLY@kBqC\5U?(*S#-;~g~j
    EkظziEaM*񩤤xM,M|$QRQٱp72@(b\a!L$ֱZägq8U:ĆGA뺏<J)cxɒ,Ʉ0k˛dlg,oLG11/;ép|臀Hzr5WlWl]ȊAAlLٜͺ޼L|L,C"L5p|.ʦ<(k|(qsL5J%@X"˅l`�!-!]kXoÀ)+҇lLz=6@<
    ?}=MÁ[\űʫϵ̽bLa5=L1-@|؝tp
    P-]# ]jx,+11m[5n4N8ؓM-յѡ+UM\\?;_,EW,Yuܗ5戎#Y(Jpp
    ]}z!
    "em݁ݲp2
    ćm6@!|'A"Mm"3O}Mʘm\`}m엵:ɓ>I }Ey­]ܔL P.ݤjf,fX3]uMLv+-'(£ޤ]46cߴ]ց9	DNڹ٘mO~᣺]/M=@a,ikĂ,0ΦޛrΛt?D-@Y`$HHĈ
    P~^VYN|]!lb̿k⑇Ô/0ꩮ0
    0qn!�놂'+ڢ/2ZyqW~oҚ~
    ^D;3L4N5Z<.A!|ڧ$ ѓ
    TnAMݗ-޾dޮf@zt	!/89Ή)_ʩ-c�
    ͉ڭƎs=rXN>)\݉=~d<ȣ<cWޣ[#>$
    "k&
    >@/[~_GOAeZϵA�@fOlk$(t~)H_àOG(-	˺ 	/א_o_e/T3@-
    DP
    )?`٭KCïVR*^ڿ؟�O@WDPaa
    >pD	,^ĘcD)~\?H!2UJ-]SL5męSN=}TPEd_*6Q@P/<2KULVA~uA0:AZmWܴnWo޳@-Pb;&F(2JUŜYfΝ=Ztg)2u
    U*UX=,y q`/uL_r߭/d悃lcs-J\rɓ-K^x͟2IONz5߇V,m
    5S"@1-~88~sKЮB9
    $HC :>H[%cE_1F{Rﴦ[->׶6 H|Sp-#|	tB2Ԑ9ĆB1/2qT1M5dM7U=3 1k,FjQPR|PEpPZ.K-K/s1,#i7o5W]wM%S{5Z.Ai;61 lSHPe\Qv[q]Uue]w߅XgW{7_}os91bkE6a?[@\Pn\s?Ƙcu2^OF9e9fgV+b1~$bfZ"#)dp;dꏭƶ䕷kk9ŗi&ls,	@bh`XA[+&ym-ѵk7qG9lZm/<zX* t[	{i3E/v >x>QVk<y'[mϾJ]~{.\oJW0)Lwx^͙?~tGCWCE>w>6kC$8A
    ~tްu�a�a?HЄ'DBc`e8C\=ٺ$u`H{{H)DbB&6qK/D
    8E*ĆßE.v P\8F2F4E6эc8G:G>,ud wG5ѐD$(HF6rb"%9ID.ґ$ GJvғmd&E9\mRDe*JRҕ32eU9KZ±x2+uK
    d-9LDfhbFb6ә˜LjV3m
    Lnv]ƴf8I#lf:pӝ29Ozg>yl3ٓ~Ӡg@Lc'}QPt'Ⰱ4QvԣiH=zԤ'EiJURv8P
    s<N,Ӡ؀H:TըGEjRT6ISδWM%+EN4%jEՉT-Vֲ<euDˮwk^W4`TְElbX6ֱUl2URh*W1+VBE+Y=zճ3A
    �ֵֶmle;[ֶ:շ.pHVָ[5;Z=-L>[Vw&"��]v׻ox;^W׽pGYWgUw.rߗ`m@p`7p%<e/|5Wo_.tK�v%	vo
    7quc9Ǐia`8mFrmLXOvbrjbxj]qWjg@/z2gFs4m^g9ׂ0L/%yٳ#eB0	4A{2яt%~Pzҗ+iNovz|ɠG?j?wtemK3-0LXk`�v-lPQf}ld'`̆lgO;][9ҵɗUr#վ]QY}Ѵ>-]`Ʒq}[߶7~[&8<w
    o/2UDn9*W5k#$J݀dUK?"B9gngt߼9	o0.u=:䶹lV|__Yc]RQ"rvnӎv(AI.-t%Vr֩rH:q˹6<oa]`Ǽqo^<1s^'UYo~o~}Oߏ'ٳχA%}F=gsۯ~_G{Qs{+9?9i|CjK#,3@dl=۫(.)0cߣT=~t!{y�tlAGd<,@Β@stA3'&%+,+`1(B#ԫ@!T4',"A(tC}:;<=>?C/024DWC&{E8HIJKLMNLT5$B<S<$Ed7t|a<ȁ#pZ[\]^_]0ETDFU4&<6lg')!)rklmLCw 
    q$rl,bF6tBhdG~xE|Q#pw {|}~{|ȁ$Ȃ4ȃDȀo2; Vl{GULƓdNJȏ$H42ɑ|<ɖTɯcIɪmVɚɈIIɞ$Jɠl,ʥ̜DJYSJʳqʧ$ʬ'JK}ʮ˳䕱$2Kt[Q˵4|˺\KʢK˼dLLTL0T\tLLLϠʤ̌uL4͡L<TnbMפ͜d(iMlᄉaNTi[ㄲ\N4N%NT%NND%Nڼa&JݔtϢ8OT"4tOTp8(ruP
    U)lК2˓k?\
    mTeuѥ*L5
    к2۲0l+c
    -2R
    L4+dd&.p4)*MAHQ:48";P-*RmZ-b6u78S�-:2'MF,UC-=.)#!,z242FuGHI
    B8<�H?*s.+RSC,D%UEM	VuWXYE0TTTϭRzU˯BMTQ
    SMUSu	fug1F1ij !+Č1VUUA5	-璨"*+d$
    1{3:}5|WW~{[UUo=4|^rsu\zm4NXO4XHX\؏
    ٍXM؃!,;5CBcR%ĜqO؄-
    ^KPq[mӶb{6k;6k6f+Zj6jEڣMMZlS6bsl6
    n Q+<DYs-)<z6838۽Esm܂E\[ۘSZ1۪@C5mۅx9[�9#ݝ9U]E9u9؝]Gҵ]c?ǽ8۸:^3dٲ	(h	^;_?›EފUޟX˼_`#c�.=V>`;_\dUԅ/s
    Y
    _u޸e>	n@[a3>#?3b~@[Y:#^k;U
    Na,a@vb\@-/0c#b8
    |	.d$|b()*.bA-|>c?A&dA)Mb<'cb;&ᷝF.LM-/4	5FF3tdHnIdnјC@YZ[DBSFW='V^M<&HOTeffvgPRe_nXbr%fW6fYpq&r6sva,cf8lfuzeѨƠz{|oR+G`>axyxzLJ舖~LȊ\Ȇ,\^6nё'xind%&B>;Nd.N*\FNi%jNh>Mjצhfe$|jjj,k�jm&N^ʱ^Djk&Jk2k^N>kI=kvI7*l>INj&~YlHʮll̶HlC�6.:mԆ^mjmv؎|mڎȾmVfi"wmF.q:nV^nlnȜn&&6FRcOno&#~Ofoo.OQnxHt˰w(`'7GWgwqp		
    $r6rᙗ&/}Xrr'*o)Sry.n-sZ+2wn12Gs+6n5"s:;<=o*st0r>tKt^4oG/JttEANHGIGnBpG'?s<uF>o|LMu&u[?sXuQuCu_bkUgsdcgvVv.6ihukjvvPpq'r7ú}Pugvwwxyz{|}~'7{�`5p'7GWgwxOX=`xP*'7GWgwyPy@Wgw'7GWg_{vq50|'7GWgwׇؗ٧ڷ!p`z!Pgw'7GWgw~Q(!p "Lp!ÆB(q"Ŋ/b̨q#ǎ?)r$ɒ&Hr%˖._Œ)s&͚6o̩s'Ϟ>
    *t(ѢF"Mt)ӦNs�;�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/manual/images/chapters/jmxConfigurator/jconsole15_tomcat.gif��������������������0000644�0001750�0001750�00000023015�12143164146�027643� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a,��61U�=U&�%tZhj"��K	8�\�F�m�C1�:9ѪJ�DL(�TO|c9�>BcCa`\:�Z�Sڲ� M${bAi�&dDjM�1K�MyloSU2r*S4�\/�(�7�`O%|qiA
    �F"�Kᚽ�\	.VWgH,�>Dέ;1Q�6}hCw\TfH0Q-�U_>=jc�H�T�`�U�X�e+�Se�X�M�\r�`=
    �X�Q?n�Y�[�Xl33f�Z�Pff]�^e�gt�Q:�P�_�Z�^癙�s�}�Lc`�K�7�G1z�=́�Zj[���C�A1R䐟�>LB]I�!k�AG쀜cYmӪ�I
    GNW㐦Unv���Yz333!�����,����,��	ȭ 1bWCTMr5"3jȱǏ CQɓ(S\ɲ˗0cd)͛8sɳϟ@(HYf	IRaV$H"0+%1^)f-K@]۷pʝKݻxe˷߿Lpa+^x._Kg#<
    VnPukXRZװc˞M۸sͻN\ufǓ˼(QHaXmW`i@!,](}].]_Ͼ˟O�(h&RR
    xW
    ^-+2J
    6aMED5P-,ނ
    q'3zac<@)DiH&L6P"N:(J+ч\% RKB�5<p›,vt֩+6Q|矀*蠄jh%袌6裐F*餔Vj饘f饪ty)&&t5Ԅ̪9V&qVvubW+u+k&6F+Vyt*]0?+C8(�9 +x˧[r�,/'7G,`Vlgw w*0�q&0* /p.<25+g>R宓L7PG-TWpXg\k\*Br-@q	\A2v	�BT4Πn?CkCUIg7kWmטg9bwNp6Pq`
    0a<PKJ4k\Jo'7'K"		pAo20a]m;;/o/K:P(:L7Ac$V.} B7T<!`0SfH8̡wp?n6keW@g0	-QLdp>XP8ߵ&.!TZ9<piqfDXh_v4
    q
    s/1 7 Nn`.	!\/X`8PD&R}7q1F: RV~nW.	.:o0 Ztnp".@,	E)Vd+rP+Z
    T\)	0F#cX<{�6�D+:'{s<yӝthBz|c(F'jP>0:;%Qquh0CCG**4I%Ӟ@
    PJԢH!=�npSٸ�MhJJ؅ O(&0
    \(9521!#dC/7�uH#�e\늉13�s-Ep5oň`jWUok^zbtM#?QX^%&bZf
    c?
    pP
    e%.Mrz~©@u8Ni"�	[*&@TD0Q"%meJ@xy#c.:;k_7}}a@�E	?901
    bF?iحp,l
    x&8αwǂ�A\
    ju4�^H@E
    P`g–Ymg,ќ5qcs,ER@ΗL=s<h7}3CYбFߕJs?{ӠG=
    RԨNWVհ_=Y#&@5px?<@@	Tp$40QьҀC6K/A
    d;M}/!X?Ġppnݱ 1[S`f3q]++A{
    e/q{ GN(OWNrS/.5rBma{Ȟ<0g?
    T
    P�ґ4A0=ؠ{Ȁ?6BlhacD{,Bb'?̾h]\:^T%=z.y~%6sn9x#uOWֻgOg=v3(L|IW�?.Lh9P@^^V@4A=/
    `
    pAAKc,dhAg4b`4��PpES7u~PKw	:R:HgH7(SN@RRGЁ
    x*@B8DXSW	HJL؄NPR8T؄}W	}{
    Wq&27Ip�|�wҧl Z}@Q
    tp	Z0\t
    57\΀8~ޠP�Xt@WXX_x	u�H�`7XhXu^P^ibb艠X(xؘڸ8Xx蘎xIB/#*@6̧І7B4mM|ȇܸِ
    YBEP-$
    Z ّ Y��%I3u]|inHuvx䱓두@B9DYFyHJ ) �~TYVyX#9
    ��U`	%P�P>  85)rt4�͐wX?Yz^H{9`2_�iO8xln^ 0?uYyٚ9Yy㈄~n22
    }Ty%":r#YW~tڹzU9N؝y	{XP	 {C6D d1ɆYk`P50b;9a=ڠ:Zz  ":$Z&z(#zL"$@�/J3
    ݕey`:DZB*EJLڤNPR:AZVzXZ\ڥ^`b:dZfzhj֏�pr:tZvzxz|ڧ~:Zl٦oj:Zz::ZZꦦڪJʩzJک:tګJȚʺjʬ:~zؚ:p;⚮꺮J:p|jگ�P{
    ۰K;:zjٱiYJaÚZ02;4[6{ <K?ʲHJ;&
    BD/X0+R$۵
    SPڲqz47˶HkR˶tj}ZtJqʶt*c;Uko۶n[p:۷x+b˷p:p*Kj+u7۸[ᷯ|ku
    K;;ۻ۹C[Zi{6pkm5˺Zv݋˽ދۻs3{KtKڛu;|k,	<sʹ+˿++;<
    [{/°Krjܼ>;,F%|6$<0̾2<q9{lA<BG,JK|h,ÿKUkKnغ^켊;ѫ;2[UlIKx|o\0L;z[쫠lj6ȶ%d�ZŢʤj�Lʡ^+l˷ʾ,,ƼvˬӬˠ|[|<\`2�=]}
    =.\<]}}h;v$]&}(*2=4]6}8:<>]�-
    
    F}JLNPmB]M/mԟJ0m 0\gj`=0[-k]biuj±Kxj+\ؤzwnatM׈Mٹك-ܽ-x=e{;وNJ=ժmلƋǗ[ٞ-6Lی,Nj]բ}խ}ۛ۫͊ܔک
    	ܼ[Mm-x@f[{-حەmw
    ݩMҍߍ֢M-ܗ]ȗ,mߗ
    }௝k=m^+Nq:Mڐ}ޫv-}D]>jp^MFN؁{=ū=14۶}BK~ nj-
    :>Zv+;noa>^n}Չ.0>.Pꨞꪾ>^~n~秞>^~Ȟ^Sdm>~؞ھŮY1NNζ^>Nn>>
    ?.	>_N//_n0'749nDB?%B=<PCEu0Y(/L(oI.lmoo&=oL_nxol}/p?m^j6nOrO)y_2oo~_snYg?&O1oooOc?[p]Oѿq?/
    G.dC%Nϟ>}mH&XX@v2L–1)ۧ0L~Z"y'BAa3'AF.gRP*UU/4+S3Ŏ%[֡EQrrdɵU,3֡,VԋsjԂ>6ҫ]ÃOThcxנd”ܳNGnfYԩU3D1ƶ"I|=wYbw>}o
    {O=q[-CѮqӵo7\楏>{[5z3�p@4@TpAtA#pB
    ȵ@-04CCqDK4DSTqE[tE9
    SsqG{G tqƵ>r`C֚KH&tI(E"Q2rK.K0?+mO0TsM6LqL8tN<ԓK8ْ3tPBOSI
    uQH#E<E4RL3ICFtTRKeSE?M%MuUXPT?T5XsuWQTVuXbcU[/-vYfI=vdlvZj!}6Pv[=Vw\0]\aUwSg5LKew^z|6lwpx`=t	Vxaƕa#vXو+xby-x_y}dSUvY=~yfbcVsvftqMyFg=XvQ&iE9jHWӰmlD[7
    m|[m˻zo[7|ǖ1SbqeMݴ.r	su|Ss2CW\U]L=r=g׽ٺ݃~GYxQ:䛗w،_旟z?O^O/_폟}^l�ԝ�;΀Kr&
    ,99~r!HXBʏ~CaNBT7CmCv
    A4#hIT"ИD=4_6nV>."QY|1~~g\b5B6##(Gy[#غ:Tt8Ȣu"+ʯRe#$5H8Ze&(I^ϓ !GIP1$e*EI`Q3,IFK"uY1\f%1^+f,dљ\GRs2	1k"˛\X8_)MrDg:fNlҝ8ɯz\9Ov5cρ,MPz=]
    '-^T;i-)FkQf'gJU,+cHk9Sr4zu)NyS}45PaJTi&KejSTFUSjUzUfU[jWUrRUk}VUi+qVy:O%la
    {X&VelcXFVle-{Yf
    z& miM{ZԦVemk]ZVmmm{[VE:Գ!{\&Wens\FWӥs`^nw].
    -G<%:!n^^Wo}{/~_�Xʻij|_Cu؅p-|agXp=aX~1bX+fq3\#Ȃ`u4?c YC&r|d$'YKfr\b:YSr|e"xu'NӫcX.l|f4KHs2kyE2s7bcxƏEZЃ&t
    }hD'ZыfthEғt-}iLZ*3|g=vy{TZիfu]jXZֳum5Z׻u}VoM}6uB
    KRGz`vlhG[Ӧv}mlg[^mp[㎶Qie,?nx[w}o|[wf\'x
    Nosq3^x-~qg\x=q8I.r\+gy/p-|-
    /B;y}s]C'zэ~t']KgzӝtüD2W7I`lU[z׽u]c?:`]kg{v]z7]{{w^'|
    x'^g|x9U|-yg^|=ox;d'}Mzԧ^[#gԁyu_O}!{|
    ٛg~|G_ӧ~}X_Y-~\D~_g~H`}jb�@@,@;@\@<@}p
    @@@
    @@t@AlħFXAlA|AAAF>AA<AfIA!!B",B#<B$LB%\B&$kB(B)lB\ B>-*,+}B2,C3,'<C5\C"Bb>F99CA:C	ta	
    4LDD$$AD\D@H4㻺ԉ�DMONP4EL#PET<OdED^KӉEHE~aaFdDF_?e4cTFcLiF]Ŗ'ӉGFp~X>r4rGSþn,G軎pslqLGxlJD	,8ȁ*H,,Dž4Tȃ4ȆHF]F&II�(ɓ4~Pɐ<ɔtɕɔə,IIɛɖIIɘɡI\?ShJ|JlJ~0ʪʩʬJʯʨK><K˭ʵJʳ$K?:K˼ԉS$4DKK{L\̿LüLL̜LǜKXFQS},M<MLM\MlM{MٜM|M|0(rMt6MԶtN8NLN\NlN|NN>NNNS)΀NOO,O<OKOlOLO,&OOOOOOOO>�P-P�OROmP}PP	P
    PP
    PP5MQ-Q=QMQ]QmM>QQM	+>#>}$u Rr!R#]$M:&ͽ	'=(])%R}R--(S2-S<8S4MS5]S6mS7}S8S9S:S;S<S=S>S?S@ES,.xHTE]ThTG}TTITJTKGTTNTOTM
    UMKFTSTR]UVmUOMUWUYmUXU[U3P#iU_U`
    VaVb%8VdMVeUb]dmVg=bhVkhVdVgVoVp
    WqaVr=Wk
    	*@vmWw}WxWyWzW{W|W}W~WW
    XX-
    �;�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/manual/images/chapters/jmxConfigurator/multiple.gif�����������������������������0000644�0001750�0001750�00000053745�12143164146�026162� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a���T-̕7ǸG1monf�Kn	vO%	/>e퀀oSC±ѐhƚlYx�Z􁈿ݶ^kο�Б{H�X�XVCzUm�=͢!r(kDЍ{z�HyD�Uп�Sj9Z1a{QB0ch@ffck1 w#_�\ek�;��\<1,Y澗֧�'�Q'`NJB�&d�NZyWrKnB�R[
    fU暽Oe�>�7F.}�U1jjWp`B�T+
    �`�e�X�`x�<\un]�}̿_1ZLcltYfێ����!�����,�������SLπň"!"FBŋ3jȱǏ CIɍR\ɲ˗0cʜI͛8sϟ@
    JѣH*]ʴӧPZ<6UUI
    fݢ׮[Z
    دABNΩ+pʝKݻx˷߿LÈ+^̸ǐ#Ke?~jjl
    pLMӨS^ͺװc˞M۸sͻNȓ̖sjsӧcPBp䤼ӫ_Ͼ˟OϿ�gĀh&6F(VFW%:2̇蔈H_P"@� }'ލ}##@)DiH&L6PF)TViXf\v%uO˙
    )
    )aPbh5z#Q":+*蠄j衈&袌6裐F*)Uj饘f馜v駠*ꨤjꩨꪬjCKuve�
    	(IE8f>.+QTF+Vkfv+PЁ?覫ЎOpK.a.fٰ1y,e6G,Wlgwg,$l(,0,ɴl8<@--lBBqL$vPG'NC-5V8`	lPG�A+Pp,߀
    4'7G.䔻<gw+G.ZGH
    }g:ӓ^?8HPvgv'�8DE4h#LFw/~o39*.ҧ?0_&?1('hz/�g+vby@�A 2�(L
    W0gHB�d7Eme¡M:]A ~-!8p7@Р5h]O�D0̆hL6p'&χP{_�NG#E
    TN1���ف4\0aa;�ǒc<?
    b$	_`VlI@eq]k.fLV6nzpL:׉NF̣gw$Xli@)AU⑯@$e1!`_|B*6!R@/?hL!6J2"KXIss*G!љttJ#Vj<vo#Q#&aȥ,v0@Ȩ?~UV4zEE̊1zLPAT5ևu|wX^?fO2
    jyD~njh	;
    m%+0"�'*	xDQeZV72p@Xms1 I6D]hq÷NWb()p*#�úݜD=FQb,|$1Խ(=wx<@L ~Ba.f@'EB�-Mx
    Qal<ȁ_d|!6A/g.S+@Wc�<PY8]1,K?`d'FcQ&CadGq9`<e%X
    
    ε/St\f�e>cT$Hs,5{
    4cB˘,PA\4K߽2Wo ֞ty<4s`гDŨ;1KCkzȦ%irL5[վ3nRGyԢ_
    Nk·1]mzNS"iN|0C;j
    ʖ#J&tBZ!c("X|RPMq!G CpK1X$Ȯ9Jpu: uaAuU,Ru]J4q_Ug]݋~ h:n,k�/]pF^G,44ݪ[/_偯YhDg4x2{cI/RڻeFu=(4ѓMī�Tq4]3:I2OB7f[tyG?Wa<~t1UuH~yg`G|~ng~~WwKv�57`cpF4(q HOuq.lSauAH�I[ 	AP
    000�0 �P�"2u]P
    t�
    	Q(R+j(\ KYUxu
    ROh([	@l(R5_\U'y^bHP(KmU{H.dЇe [`rX*+%w 'iHn[5[uxd t.jK]tP*Aw.s.d,ъX~,8sh( rs؍hx膵Q HFvh옇脂{eXr騊Hx؎YYx+O
    CJp?)$hDȑ 	1Ƃgq6dq	P0P'6*?Y� p00"2JQ.%fe|V[PPn\2@TayOYdy0`f	%wAkɖg9Jj[ٕh`�Mٖjٗ[ bnYXXh;�im뒖X.2"- K:mh))	yTRiyJI~ٖĉdYUٖ@kyɚficW)YI㙇ٞ4IDy@cl4#5
    v -@/`H`{,`
    'WpbZ0DHr�sFjU-.$U zf	,%5ʢf6,;>Um3@*DZK!.:K'#MUUj邤d`]5W^U@EJOdG�У?jp
    
    _`aI9\]dip
    IL&*I)ʘG~zuy`vjj٩Iԙ8JsyzIn2@ɘ6mi	9	J`ҟ|cP
    (l9	`JD&I!6-.jCauZ7%<rByBybЯ [;jh@I6}`	If {Z9"#rf!%	d�t+p[==ױ%:"pQɤ{@ d*P30.sKZ	3[ؗ\ŲP
    !aZGJۦ,*p<"˱JI�u۱fȴH[huv@,
    JijI]jdREK~yzD*[붅++۲r;kz�ZYWVjN۸IK=ۣfj۸^t@o[;"jCʶ۸%p뱎kU벿;ۣik�2P
    ({`KثتOzqA[ஆ@P	Z	*0п
    ZFP0;LYI`	AЯI;Q:6
    Q`&s%U0Q.K0³|9Z,ÿ0\á6 0KY'<0P	S|).9l	r5pTXl*3#lƖ
    MK]|1l{|&l	%unj.�k
    U
    R`ȈeGl	J<K8H{{,pT|V\Xɢ<K,L�*Fΐ,%i.ΰU<dU]h$l�ܬˬŜ˂+ҼLU|4ҟ̸DO=ly@62z
    Гѝ@ `#@\\0@#7+m-ҵU007Y8<0@	BK]LU;\U6CkJm8<,C
    4SݫV]_nmjN=׵pLm#`�CXtvM<[]Pq-W)QZԵ (8mk2`P6	IF`ֿ@d a
    ~4E`ҌMԼ<
    )rm+vam؈c0z	zð}
    CU=À=k]M 
    ]\	Y(=ٽ-ݿ-]MM.MM#؋0=O5\ᦠXjq
    
    p
    P6~7
    Q >@B>W˰pMDD.ۀJN~XZPnbFNa]>?lp.ktns^u05ԁ 
    0vG'8c0^⸼mn#5[ m2^<䴲NꨮL>
    \U>A~®>X^ƎI0	0	0P
    p
    l?N
    .N֎?�A6N+A@dpگr !@n	Pƈ	M>OoC.Î?vd&&?@0US"O(*%_5p<><-
    ݄!⡄rLR?T_VXZ\^`Yd_fhjn	ݯlr?t_vxz	'O- -`	 &z[:;X">!?Я?_?_?ď2
    2
    [DoFy+b
    &tbM_1_?_
    $XA	.dC%NdD HeW!
    "F(T4ReK1eΤYM9uOA%ZQI}RSM>UYnUkW_z%XiѮ)QC{":gLy_&\aĉ/fcȑ%O\e̙5ow&\iԩUfkرe_ٹuo{SWqǩ%9z?=omѸowS77g{,JR[|7Ï?y=O/n#+T8A#|PGƳB3pCbfDo?%80CqнWEI4qT+m4#Ө@tI(3
    />%>+2?K22;@nAN<]a<�aJ@tPB5
    .}LQeQ!U?F'AENkBfWyQ,~NkuUXcUCż7)QWrV%G9tY�Y`�0|xYgW'[ǾիUp*7ܽGYu1=cU^Gc#C ~mYfK}"i"[؍bqM\xCydу6,Ɠ
    Lwؖ}gF`O9xB'`
    bsݘۧz\~u&Lu[x?9&ymۖdޖW%df}5WSx`&TDb6iV;r:s&\tՎ̹v{u[Od\nF@e,�G5|Ah-	Yr?']Aеs_{uwE=b]wko3}?߁eh`0A��gQ\G|h 6g|_	M6n~Os;o63 ,/0ㆠ �Vz9Dpm|їP[t?О
    H	mgep8-$PD􎨭IZ$Ķe;"MwyMk\d%ieFKd&mI6``�&删d!>dkyK\BJN$&05L-
    1U-tBG54A`o24`.yNO0YLv2ӝ7g<4�P>g?5DtT:)c3BPS7,zQZ hG=쒗+<EBB#_IJOT3iHaL	SiNaԧ,Km&UKE?R+\ q*UqիZuXOTf[T/UUsD*SVBFԡu1W>Ǯxkr
    U%�&Va3XFVle-{YfVlg=YІV%miM{ZԦVemk]ZV=l_m{[Vmo}[W%nq{\&Wens\ӥnus#]벍*Zw]W@#Xp즗5UDWo}{_&	eA{k�A
    |`'Xf0
    
    p00|^
    wX	G|b_xo~]bf۠N@7TPXc>r1 Er[? Sr|e,gYT~[c0[X	
    fFl69q~y	)oY{s>00/PjA
    vA;Aғt-}iLgXHkZԣ4=
    jZի6!UǺԝvue}k\cys}g@ZЪBPXةwQhG[Ӧv}mj�~6kk&w-Ownx;�uE{{-DA
    
    d!`xpG\6рSS\1i=|']{Q)|Y(X@
    ݀p`z-G]Soz?>u^�@n]Y]LukW[lӡNw_3
    _s[4Ws~*Et
    ,oy5X/o(xJ{OCpzQv՗}giسx=sݧ}~}{{^6||cYWo
    }*h~A<
    '=/KŋOد~Ocbُ՛/?�?=ؿk4?:\??@[??k�,ӺSKc>}Aȳ飾삅>B#D4pp&�A''B('D*B++B,B->PkB/B.,.<C3B0S#C)C/d.-Cd1*>C?:T<tOC3,CBB:</dCA\?B=AC<|>>)A.XмX�Q<ER,:̓$D%'ZZE[[[E^ůFb�8YEeaFbT\FZ4T@<hF_amFfEjF\ellLGnFq<OKFiFg4g|`tF^\h|FjLMD`P.O\ Dņ\HOxň#+~~HH~HȎȏ,ɒI<ɒ,wLIIɔIIdjITɟɛ4ɏH<Dɚɢȡ$mᇣIJʙJɫʧIǀtLAO`;x˷L4ULX04|K0?R,,~LL4LlL*hlLDldLĤnjLL\LLMSL\MDOSKʴҬL\|LN4H{�p7KXxNXGK*N*O$ܖ\O*��<5N4ODODOlO$OL�OOOO$P(�ЯOOOL$Ν㴮Ds44-OQQ
    Q!RQX!M5R$UR'< }R*LE_S.p(�XH@ȿp4
    �6mS7}S8S9S75S<S�7S@
    T?
    TBA-TDMT7:5Q-}Ԃ|(�p4ET:C-85OTPQURS-TU}@,T>RI$DSk�_U`
    VaVb-Va-ȁS3VfmVcEVe4gVjUh]jaViVoVbYU=[z�u]WvmWw}WxWyWzW{W|W}W~WWr%~W-X=XMX]XmX}XuMt
    XXXXX7X
    YY-Yղq=Y}YYYYYY_KٕY
    ZZ-Z=ZYe|}ZZZZZZZZZ
    [[As]ѥ٦X]x[[[[[[MZ=Y8۴=εM:)=[]\m\[ٿ
    ܃ܽ,\�
    p=s\]=]ܼ\A̵H98HW[++ݻ]E]X֍
    0ֽ]؝2xgP+]	^	^*{[nхm
    _]_E_]}ߊՋ=Uť彋56gpgH5X`F
    <
    ~m߻```na.ajHaVa^6ݤ]aeaa_aa<	b!b"b@^Z"~IIÀ`<�/u
    `4E`
    ޖ8F~ anmIan=na[.Nd.bG~ >b�Jd%dd&V$_N_'dOJ>eTNeU^eVneW~eXeYeZe[e\e]eZ)b~#:�Ђ-6;Q}/6c8Ncecfim`n:oova>Fgufe_][C6dDfd5zaH"dSd&Mfb'd.hM偆bֹ�_n~F8`0���
    -	X�؆;45fkcngqNgttFafgE\Bg{E>j.gIgdP_fq輈Yg(dg[.�5 is6~0m؆~ l.ln~`fxnf3i[�jl~*Sj⦆km.mm%BmPfm}ejm6hj֡Q&k-`80X`/~|Vgn6lvl&onNonlwώo>m.vmfma؎_5پmmܮ.h^Vىk}s˷Tn]`up�+ppkcNn/lfmlcq9@j~.r#gRrWR^pkO8�nڸ}^^`kp	4Os4n6k9s:nľs<ss>s|q m!E$g$om,o٣Y�tL3�]X�PuP>sfHuU_uVf8uXliuZu[:u]uB7Ln_aEvmc`EW\Htt6H_nHkxXlV/rSuu]owwd`gxbwdefwvv.⦭wv
    G@xO\SwsTG>_uwwuxy_\}Grxw.t?a[lyny[@퇏uxsWzxx"&x[?yJ9)\`&z&�6^z^ys{/{/7o{l{{{'zŒzu&8H{goO{v{ʧ||{wipO}`_|7{oG>/>?ʧ||~
    |,зt0Wv^p0
    nׇ}U??uso}O_z7㏫_9/x9u2H}]HA
    )!Ĉ'JGqƌ2rH"E(7v,"3k*Wl̘2g4f&Μ6'^B-*TҤJ")ԨR*֬fW0^*k,ڴjײm-ܸrҭk.޼z+wlXn؂Cyoga&SfRV\/^0~Sf85eG.ع[kPvתsc]|8}?LJejZDrW*Uu,b=ӯo>?
    8 x`) Y
    7Xa%XcE
    0�ٔ
    .!%h p55PB 6XQr4jD\qX[#y#DAtMx@i7ewU^@=M}{9&dW&i&1f=Ha)Ƙc4e&c4&
    (Q c[92w=#l&oC6pшҒ59dӔUݕjUyOz&Ŏy*p9)B3%�@h3FD(xq.&dL?Kڋ/˯;~>+0[o6|0'Ϯ=a1{q!<2Q%GT-1;3U9뼳~7;&rJ{Z0S@E	dVX}ա,p`/b?E
    pd+[31',.`3l8=֜D'fؚC�GM@p:꨻:{6dj{JqOl{vkq|ȂLxJA_k,9>`?݋?~}W^@XG_;
    ?3*UV(@
    4@Tvռ]EɨW=X0;Wd&ռ'|;>7DŽ(|!wo}\Nr!&@�(D
    %.L|"+P"
    Ap[I(0fD!#Ѕ.aqBvdgx90ٰh	6T`<$"+hъ|#8/H*QWwa3fH?)NdkMJ5t#+89ֱq-xXʲi=MˏeIsk4c"|&4/	h\(K)=lfFN2>+g.K4ԥ.)O1r�R&sWIiF^[&8ЄћhD&CK)ҧ$!:	y.1
    \n&P=vϡByz!әҴX rE&̦2UP*ԡu87TN}*TMmVmH5JU2*Xxձz?Dtn}IIKwui\ڟ:k\^@Ĵ&jQ#+Y"5cMHT3TVͪ(زTEgJZ+_8ʻfz-Geֶ-kgHC3jk1D@IJDlj5]΂5J'ܙִmxgZ(seH
    ҋ@7zQַ6p	wi'?MDZb"Tꅩb׳,wz^wMoyE;ℤW}-w66_UbZ)f3"g^(t,�)SPr2V^2lj6f>3c9en3_:W�qǀucHXJ2L7әDx4񲔯LR~j-Sp/Okj1jRfs͐YHqKYȐ8D� D#2QP"HgΦ2%=MsVhlkTSj:">7ӭu~7-y7}wm=\\W۠'?p3Q*=gҰv
    j[.a:^{ܰ
    ab.Ӽ69s>?~.F?:ғsƵui-gk[3<r+]j8®~=Cdv]jG^{A:~}?yT2ZgQ3<#/S<3h<C/ѓ^L0ȚyҘ4i]3UմƵevTQw^{o>xR'?7|♮s>/>ҥC:x{߷f{M	]=}%N]N V^ fn v~ N	 		 
    
    `Š	%@6b!"Y)_5!M!&C vv~!jC@HF�FLРYK]
    @"QLb&[6#>"$!E"%V%^"&f&j$bma")~`"**b@l,�-?8ɮ	X_/jY#6A!!1V@!!f".##n3Jb=4N#5VcE_&~bpY*c*89c*?�,b-D?C.X!="#a2*2&b3Z&v"A$B&$'F'b6>7#Ez!9V$Ffd9;<ڢ
    ԣ/Y	l	@?$LL$MΤM$NޤN$OO$PP%QQ%R#j#{\ZEFTbDR%Tj$V^Ef%WvD~G)�[[-%]֥]%^^%__%``&a&]\*bJDBec>fTzeWndVe?XYeZ:]#d&f%	$A\B&h2
    a&m֦m&n`
    j*C:,\%dBfd^fVRq&rR`n@F�ȡa$heoe&d�>f"e]n҂yezze{'|Ҧgħ^"vbcN q.gE"heĠ^=>hji2 @"%� 9	\llyg^{%(fhzgb('`}a~^~'c
    9F <6z$(q
    XI(\c=C"f$\?\B#\%p=!e)}
    y\h])`\ڧVbypR7꧑6*W bI)Q)bjngbHA?&a&�
    �%*tC7,@h((i(*)z{ʨ)ikzk
    +F+JnN+-h"Z"(:d)8vfޡVejïaH?lHt@pA#jꚶ猒(Jfk6:2BNk&^B,v2hlf'z̖a+b,##.&⦪@j*
    @jNl>+*zj֖lƚb,mŲ-fvm]klS>m)!;,--#ϺO&vj5@?x6.�	jb�rn?\-ۺ-ڒ,-Ț6Ȃ-R^,jlۚ-Үe?t.-E,	r,%H£<Z甦ޮa	,!V!fB#*
    d,=j7A~.f6lFn//#p�7?0GO0W_0go0w00cXG#zZ"?=p\⪱Zm1#1qҮުnsb1n+&nI11/	1ױ1qjfHtNZP/c*Ώ
    `iyi#k@=�injg&'&�1(q2)DZ)*2+2s>t!V2//3�(n!3kR'0f'oln2:3nj|.53(27wbm(37:21
    r\	X0p0c6$C=�3W244AA'W5r6Fhs;CsDE(8?t)WF1G{GGXEFG1E1G#:K?R*岵,=3?3NqRQO5PP5Q5M&MrS?5TGTO5UWU_5\nM[s==#0/5YYYZ5[u5N/\Nc\r].5_ǵ^_5Zaa6b'b/6c/>cN_N14Rfo6gk61Cg_3@hfd]kk6kOh϶`lc6nn6ov<6vn/w/uZbFcaBsg;h?7u^˶^öv6vӶw`x7yy7p/,>2s9]v/SfsGiO7}uuwv77'/8{wIMn"/{S\N
    07iX{8/xh8Z8~~wh\Rv8vǁ78縎x?XX8Yki=Y)trLgW_91Hok5uϸM9Xxg׸z9ǹ9׹9繞99::`�h	VfpgDg8	3<ywgƧFCFz:sys9Ǻs68纮:a+z[![8K9z:g{wz][wyo:;c0zk4/4zKPX.[;;wyy/<K_O<7sǀo|4Ձˑt	tAʷ|?0<̿|#2|<<;7==S='=/=o9G}?}zW<gųYsk=MYi�;ʳ|׽<#CЛ6;}K>wo=G_;7kpٓ5՟lM
    ||=ݷ}̷F޳ߗ6>3}G=[oN>3]uWx >Oӽ_o~h>?w?>?c=� 	h@�4$,aB
    sbDa}HP`F3dHbI4y%H+YHb3igNb6yv_PA
    j�KUiSSVzkV[vlXc>c)SAYMXԙu)J	34D!\y#㈐)t|٥d={V̹OCFJ4YիYvvlY͢U-\z>pV6x95cHY0ߐWw-(~(H˷W<~�
    <\jKkފk.h;L:SE1D#U\E4!d4md�Kϴ"o&|(0z6	uź%o2]4\M3|7G�2H"{/I"\OB
    =4*2(dɄBɴL4hI8=E6EURMsRJ+HX3!\uuVmBL5L2KdSTh[FjW6Q=]վZ\7]^}xY,RIuHg,@�O\L`vguk!U~1bcc6o3[8GFq\+Ue9>uuztT.סg9i(dK.\h#"6-NSlN^~6M[35X-
    ?q鵭`g9̄~&%ʄ^s.fҩ(oE>;u[iE&{i[u4)9m	[
    Tyݕ׺n}k{=zՉ/~E|Vc+<_ՒB\a��-4shJmnkJ 87mvFA	BomӞG)yz%ȺBl۠چ1Aۚף93ANrz4VF,.IFЃ�V�:^+_@~nCH=P-\ø<MndC6n/b@N; 	6nK3ѧQ�4B!5	JGJx6M�*SJT2T#^W$ȷ^0f?QƒYTZ\>iR4
    B.Ԧɖ=8nF&TFġ0G*iL4s4pu
    (Lry-m	K"۳e.
    ʄPDA6&0g0O(f6u&5im)K7D 4hZvR/y.^B<VHV	uC
    ^HP
    9<.s#V[jUʪFM0IUZWU*,u)9N8`RDH4>Հ>K_fohdJǶme/+ʶEeEYӢrTrU$]ZצTh#Td?UdiOKޚmF/᦭q;N]cd"ծ cb}jMUq{}qA+_voօ)v1	\`	V`?)\a/(ݥl;^RUo{k5p6nji\c9ycA?\d#IV,"=c7e"Òm&x_@{6:󘮫2(2n\g:y?9UKZˉV=Y.?ґc?_w9iO*Q`lP�Fֱ6-i]k[:y�wPEæ�&�
    4jh\_٦m=w(Z>Pg&Vlb-8=huokV	>6nHp?ʹ=,[MFKў!5|	0~xYߢq!ߘykK+1&Ys_�U`vNTWA\?[ZYyu\f?Z|9߹}ss{
    eD/맍OjqY@d̅~|rYY\wfCZ0gp^:yew<o}c>n'F'T?_�6@O2H`wwE_v󘿼Ur/3zm6sOɊ*mФ)&)ҤO@o8o4HoُDo[M`ov�W�,xND�o͂.oK2ΜII(	C8:UPI\///�װ�mnj"M&$
    QQ
    5PԎ0ɏŮ.D|+LCҐz0rPLSQcp*)K%~qRoDQَeؐyP/xPephQ*lQݨA
    mz1)aUm?QؤE4�!R!4"'2q7-/R#pqQDA/$O%#%_"_,r#1g&؆$rM2Z`R(,b@)))*R***+++,R,2+s2vrk((.%.../R///0S001S11s0N-VM%G-2.33.c�:3?4CS4G4K4O5SS5W35_6cS6g6k6Y2PEh
    0֔487(o(ζ9S^�&ޖޤ2Qs<2<<=S=ד==>S>>?S??s>M@	�:/.-5n@HWѼSC)r<C;C;>?TDGDKD@!	x E#�F#`
    `ATǑ..'2GޚN;/2H*02JqC[NJ4>CKKKS:`64Ept7G@$(Pp4JcLdҳQTKQQS	!LϴET4$tGOd/-T31YPPcP
    QoCWwW5ER \XA4'$xN5O7/t_d[UVsuJPWU=u]ו]?4EXUXUF@Y4	itT%�
    Q5[?Z1[\Pkaub]b3Vc!X5FgtF5_uQq6O]5:I'ao΂b&Vb#bvc/vhh3E7�
    bF^iYK7a::դ1`gVg+lvW1mVc4i@? oщQՑ7PVpmll}mUmq@ &r+`nmЀ&k
     r!!/spOtPVbu\+quvkw]T@i2}8H%$U2u7Ҧv-vqz4RWRiFw6M|Ҏߔf7z|QTLɴR/5TS703ėa}vKStRR}3U{}HG{2W[y+WT^c5Y6|-,Z5|%[cbXgk؆osXw{؇X؈8R5^^G_E^jw:Ś_66B5˅_Xu'tXט؍iL�瘎؎؍SczE^Xsd_4BKteS"XPcL'+yؒ3Y779iiVdk4nMrz4�T-fUp!9V%Ya㈹h0Yٙ6Vj9t@tO؋ɰǹC#y๝Td9Y7r+WryW'Oyj@DKewќSCϜ74.CZGKڤOS:xS;wGY!ZOZ1Pf=TO3z6:p;:<9ڨ%2n__0`eqOZYf<%em
    Ze1SIڭP/C:I7S8`Vo!lUOZ'5wo
    !XmY*˱ZgW²/{9o@WtG!UXc[pA~[۸[?$嗶xSr)4]r\Z[,6{2*;[ar۽JכNM3[
    |[
    e'\/!<:;,C<l5A9\O|	n*V|H<Ggl@qo`M]Z\Tl)-LJx\Dȗъ!
    ɝ;ɫ\;l{Oʿo\#M=<lȜe)|\TG%%<\|ld}|]
    /<]'#3]T*];9G=]S]W[A(Agkos]w{؃]؇؋؏ٓ]ٗQ@ڧګگ۳]۷ۻۿ]ǝ]ם]2Ta{n^^#^'+/3^7;?C as�S^W[_c^gkos^w{^臞^ULgH-V꯾@뷞^Ǟ^מ^^	"Q4	
    _#_'+/3_7;?C_GKO�p_c_gkos_w{__1a0__ǟ_ן_�;���������������������������logback_1.0.13/docs/manual/images/chapters/jmxConfigurator/statusList.gif���������������������������0000644�0001750�0001750�00000106577�12143164146�026510� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a���ZoneP'�KFsT-2mº>eǸuMcn	�Z	/ɔ2C򯸻oR1|Ih��X橲m^
    {ǁ�=UkL<trVCzzǙο(�U۸�Hҡ(�Sj9\w:1п퀸TφhzHb1@Ծc!kOR91 x#_|_�k�;>,Y�Q躒�'{'`d�&lN̼ZnHU\eޔ{e�=�5OFT�U娚j�T�`+W�e�`1jx�1ujfPhNn���!�����,������!PB(	A@C<HHŋ3jȱǏ CIɓ(S\ɲ˗0cʜ͛8sɳϟ@
    JѣH*]ʴKP/A:5XkׁNrtJB!۷pʝKݻx˷߿LÈ+^̸ǐ#KLe2k.TH]Y
    ǃ#(P̪㌬װc˞M۸sͻNȓ+_μУKN9]j;u
    Wѐȃi˟OϿ�(h&6F(!jBThfv ($h(,B!}x1Ǡp�4ǎ�qc N=ȒL.yJKӞ{TViXf\v`)dihlp)tix|ֹ#٤ˠŠQBA+?n ĤI�gi5駠*ꨤjꩨꪬ꫰NP(Y-
    ++hnl&nJ(tU.+QSF+Vkfv+kC^n<$ckoWsI{o+>1b)':hF,Wlgw ,$lɵ,0,4l8<@DmH'L7PG-TWmu<QP-6 t"eu_S!e6&!`7
    7|'D-@0);9mgw砇.褗n._ꬷ.Ba	E5kG6Hڽ<O!d=4}~S�->h$	c	*(/o�HL
    .yˁ?how:!A4@4Ȅg=ݍoo
    |@x@@H"HL&:P]0$8(*ZXlqNoz;aROpXF2}AG_0�؂긏O IBL"HDR1w`(@_]	A T#5{-T!]bˆ08xA�/|EXX�@d,b&1)e&1dNl{ĆI,AWJL%;8ψb=?|›L':MBІ:D'JъZ}?�FmcFwIhRed=yŔmL-JW"8^QKNaEW2">fL7YXS2v!2R)fԭ*
    j!K@G_WR@UMUbkmkņ"EP?�ֈ`?,AbH\*v"cX/�8bbMjT7TRMF<�$Z4d(RvoH!l	t*`\l[BWpb"7eMf*X1ܐ2c-/Ȇ*xv.]BubJeC
    Z,7~靘i+˲#@l١I0\?	Q0a^z!ZvX(NI(N�e.kTdvo_7nD* Ӎ>p-`Sڤ]j.`vAEB2`?5`fBW�gfJ=`sDiqJB@.Kǹ+t3ܕ7Бvs']<9ѕ�/L,DЈMh8+44Bv\оtWdb6fR?ù~N.|u6w^ WW	?(mihǺPvMfM?{ЦhfKikxjkZG%f57@o1{	O=kWF5o+\V4btٕ5g\GO
    i0ӜNҗ;PԧN[XϺ֫Q,fql3&bQѣaqc-߄nT3a'2qWS8(ZqJ$G&i4n��%OƢz�/BqyC
    aˌ�8?}|UkVo
    	PA/P<>7h;K~qPX&UJ,aX4LϽ5�?P{棁U�,ӯ?2T6C�zu{7�W7@��e6% nx�`[rP�+@G
    W}elnpVl
    Jj8Th]qw�fnC)~,
    ?ȃw	BL8g``vp	JUJW18h$I8�N8rm=CWfG8h8xMP#xU|px@H~@V2i^m|;ux؉Hu&u0vlhacZD1v$Row=5\I4u	'eS0	(��$@xi] ZP
    	6��n_Y@
    Ђ̔`pi
    ``zi֎ШNuEW(؂L(fȍY)x)荎9w	
    8Tp.z Y~y{�@r)ygmwUxyGT�?`
    I%yXxC	ii0RSy'`)wF@`؈و�&3y,pY8
    blh^	)M{8ٓ7(+93aReAmCv Aewv_Êvlwwc�	`wJFSЋ'eg 2xX@#8(0TVC&י	nkU9TW`О)AWsVI:w.Y^ԉU)YN&.J^Q:�&Jz]!ҌiZ . *:.Dj{ՠ)gE`๟uMUZ_*(ʞW
    ABF-k
    yNHi*Km|ڧ~:ZzڢyETip	fE^a4R]}		H�	{pw�	�$ 9g0xxe #jXcCpCe#4ie
    pxzتܺ4:TGêY0T5zp麮fWgWz*zJ#Z0�㪕�۰4bz{z*XkWt%ٯnPH9K;YkW(:y`cZ'EpMɪiP
    ^=۞Q{9Oi@?[Wlʧ	yd7{xJ٨xz|۷~	^⩄` 	TTP	ivR|CdB
    {	axx
    *�^EPlzvp	zn(G vy思
    x)#+%X�G zTK[ݛ{[W7ۿClZ9	<P
    PL`�,׻p�,(CrC
    z&kL(cp�Kn!{ѠNApN4#z+8.\
    ̿='7xVSjZDGL#(7Xb|Iܿ^KlX7ۛ#`LTLV%0}NM<lEl@<t#U\Ȕ\ɖ|ɘɚɜɞɠʢ<ʤ|0
    I2
    X5]5ʠ8EV]7va Å�
    8Rg01
    g BPE X	vzgDWD  
    ې+p@<T|Nfϡ	Y<R <m`z
    G |gP0z6wfnӶЏ 
    TOy=T0%=ОPE`n7@�-=T|G:Ϋ 2$&-LΆuhmTL
    %K+Ymбkn`2L Lm+-Y`		T�H<,XknA	prMמPG
    wf) kF+vbرהmM ~*Jd2I1		шYcۺ=ت=۴}ȝܲ
    =]}؝ڽ}a⩕
    pMްYR|B 7EJw>1`
    Yv>m`! _P
    ^pu�@`u
    #^*1P/9.0^WE`uy~+.1~)n ~3A) MRnZ<6^:^K`;fn^᭐a.E}>THc>j.:~NIP䡰I6^jՉI>&� FP`|:N~Xq>�z>~yN;BPs~xᘾ2+᯾>3.bꡮs>b:nΑNd~>^�?_
    ʎʰ	pp6_
    Yd}r)T̢kJ&,m04_5/;<
    <2H_DoEI/p``~?/N#>O/#MToXhiZ_Fj?2.]?noCUK|v?t/ZOUg^~D~
    n<Jy??_.@&i_>_ȟʿP6 [2Xo4ci
    au�A"B$XA0)/nNX†#ZG	CɃT!D7,eΤYM9uOAiD?9Gb
    eSQNZ՚7:cŪDM*Y.rSׯbŎ5V?eXPxӧ?a@ڄ@$�P;Sx4Ce)(b%SC*tj7[ϖ�<ڤ_fo{
    W•/gs<Hru+rqBzIscR7<ŶC
    #Y2<q3x2Ӭ@PpAtA#pB
    +\y,p1CCQyQqE=i2cqFkFsqG{G kE H$TrI&tI(FxxJ,QJ-üyJ1dzč  ���<P`OG:�T(3PDUtQFuQH#tRJ+RL3tSNSPCuTRK5TTSUuUV[uUXcuVZk5NsuW^{W`hP0c@0Ugvl]AP$ Ѐr \9Uw]vu]xw^z^|w_~_x`6`Vxava#n	9b3$8H{bmKSVye[vecyfkfsyg{gzh6hVziviWƶgHv4gkk{l6lV{mvm{nn{oo|p<$|pk
    wq#|r+r3|s;W\A7tSW}u[wucw܊ms+0q׽v޳kZvW~ywy裷|z
    x ~{A^^٦k>|ɯ'>q�O^
    x@&Pd`x#٠w>)%HlX|95N$L:x[`6qC>�8AC QC$b60yB%Dq�}/R"
    ,zoJ	V<`0C/0kxG<Q{c+<|O#@
    {,d;2rJ5B`�2-lrvl`?gJ?Rde+
    Jr,ϧ�\Rb-/^C>/`qMT-ل6fJn-8aNWSdg;!H.2$&</\D>@0t$ԓ[x3:j
    sۼ~S;=QTHINb%Ţ ]Rdr\@4A91[88QlBRSʨ3f9mfU%+W9U5#ek["Ng!gB>�TBLxZ5@jW8R㰏-a?�3^fg5Y^=8*Ϧ]TڮUmm'>D�ASmaPݾAAq0B&
    wb
    '�fz~-+xZԚUiM^nsEm{_wrmnwRvo~_"eAq"0"^0Dbnh;Wı{Kجeq}bXr;\��MGX.xhl3@1t-\w8'ryQL[(qi9Y,Xc&s1po`fk>lS\ܫ32 >CPXSS-VV^]KU-{9c=iPj'<j<Χ fܹC.2Dp)an_Dš&vN([>lhϺvg7[^B>q`;&ܺ}JwǦwmd/N<5mg{.fexçx-|ƻoG;7h\(G.r\Koljgܿ8usZtC'zэN8:ϽGKD*-ԓ;|ԶЏu]j+P
    k_$oke?{7}q'Ѯv}|>]g<w<,
    okH$W]_=yЇr}Mzύ.`}]z^}m{^}}{_'~|'_g~|G_ӧ~?}W^~}_'~_g~_O}�?�4&$:@L@\@l@2Ȅ&@
    |@2@@AHx@	@L&(xAAAv|AA AAB#<,B$lBTtB)B!lT A,B-THTA0?182hA0CK5,CC6tC9<KCm@DADB,DC<�Lh1lDG,SmDJDKDLDMDS&MEQNDSETLEJ,EPTEWDOlWEZD؁CE]A/|D`Fh!X!h9ЄHp#iFjFkFk�
    x&xhFplnFq<Gt4mFoLGwu,o|GzGjFE}GBEFFHф%X:8Ȃ|qFxHHHHHl`NjHȌnH,ɇI4IHɕ|IȐGB@IG^GIa%lHkbhJ|JJJJ``GJʩʬƭ~ʮ,KJJ4ˮ˵tKKKDDIEIlD%PFl�eDzxL�lLʬL˄~L@vkL,MnMl<ϬՄMlMLȄ״MɜN<ͻ~\NKL_L?d9@98LN\)|XtOOOMOOOOO�O-�=\]O$PP
    U<Nd&t-BLlQ:@@DL=!8OjL
    Qk `Rl$fLvQ#mR%-$-R+R%R$}R|)ER"#R R`(&u7]R55S:5S60R.=R=}S1R, S9.BNEm]7QNÅ´ĜMFm�MT\8?fH~HUV]UUfxXWUWUXUXaGTYU`Ua
    V]^_mUfcUfUhm^}_]SXelVmUh-VjMSaUpgV]=Vo5m]jeTlT4QF}NGKWÅMTTLOQ\тRTXu؈XXXqm؇Y؍ؑؔuXnYٕ}؎kؔUٖeGUY5YY&؝}Yjٓ=ٌYإڊة凖|WmHWZ@QS�\8[UU@[U�R2S٦ZٙZؐMZ[%Y[=ٻ
    Z]]ܠXåۺu\}\ƭ\ۼ\
    
    ZGTHPD%[;8�ڥ@ص@]څLb~(^EM5]^E^+W}^}^^^u^5_^}^=_M]_u^%meU^ھ<`A|];>}d]P�}`}RmLl`a&aN^a6aaaafa6afG .bF'6bvbaa"a'$.baF`V`^㢃x&Fa=c>>^nc?d?a@c,&dE^d+DfdHCHJ6dEcMW6ӄP@Q9AOLaheW~eXeYeZ~eT8vdZe^v~[eeb.`F].fec~d^fhf_38MG5dms,TNUJiNZfVtfg\Fw~vgegvg}.fxklfrnsƤHh^hnh~hn[>�vh舞hhxnh~h>i&38�]聎COiiiiiijj.j>jNjviMG~jjjjjjjjjk3fjNk^knk~k6Dkkkkkkk,0sniNl^lnl~lȎlɞlʮl˾&l^Xllmm.m>mNm~m؎mٞmڮm۾mmmmmn6#i@>ZnnnnnnANnd^onono+GF`o8Xp/po9nn4o0XA4p
    Fﻑ!q?tpƑ@nxq D��'q?D&`&r!_o!$_rqVap�+!q-.g/Gq1#nnmP,yX8`Dp"$os
    ;'p(Om)*+,0i1#*$8Z3~h#XAt	oQ?;/%s's#g<wu=&?ru[r#ZOA?B?t8va/Dr.reGbWt,OgEvbWjvmvnvovpwqwr/ws?wtOwu_wvowwwxwywzw{w|nJn �L8OD3PPO	STUxYWuw^u
    kgE_ygvewvt?
    ݭ"w-IX
    �w7	�Pp�@sxYr\;zTzT/_7ykGyWyWtfd'vdyo{/l~e>(x@܆'TPzxxzsǗz{acoyk{_{7 y3?@3ػ~�,�DOoZxv|̇z˯̯w{GGW{/~/y}OJޥݯ	�_|u~	gP 2LH`CNpÌjq#Ȑ"G,i$ʔ*WL0YSM$N:
    SM7DJ4)ԨRRj*֬Zr+ذbǒ-k,ڴjײm˕?X~AAiˣnwɄ'&0nXE�
    qh2̙j3ИY.m4Ԧ]֔زgӮm6ܺw[rūʗ3oē$nz
    f;Z<ֳ_5ӯo:L	8 x 	* d5\]wW_W|bD
    x!
    T`D5ܥw"ޙZ)^7#kw#95#A
    9$EydZq&#|qB;TYF#ee;'ı-YފދA\m#qck"y'y'}yIx\r(7 y&ify)q5)(#lz**_Y&|dJ`kcNYe:싛r)*GZJ;-Z{퀯ka#|+fvG,ګb//Si;p�^ù>:Yg[y)/k߽%˙2-<MzY`	&CfW0^Aq,ESI+F4u8U[mu?Wk}u?x5a{uޡ{6fv0m36ܻ~37u}wݘl/7V̊Qe<n79
    đGCC=3LkQG[c-d}:՘7k:77|hS;?<<+<;<K?=[=k={='U3[֍	�cvW!n>O I}ҏMT?	h	r-c3rM\p
    vwx!c(Ұ6>!(!F<"%2N|"()6pU(q"32v6(`h�GnpuT(<vU'(Htc!H}Є!	#G-]vW
    P:$(C)Q<%*SUVb\(!.%q`?&Ѹ
    �ҸTA2cH@cq4=
    A4d#)6H',BL*)le
    ?	yҳ'>}S	w8`�@PF\XQȉȍOHGf23ѤGv?$)yf*Z8)	IsrSةhӞxI?*ԡF=*R$H70	>l`XB0:1L,enԙ=Diդ\CM)ҥ_#gJTW8
    sMsI=,b2J}EAᅖH(,f[LWɴr4YX>Ҵ
    bM8tmMDzS*`w:5_k¤4Rֽ.v6uwjf39uDt0}o^_tP/~h*VNve<,khJНaN803nb*(D#{߫2ul_(s#K1`\
    G¡|LC#oN~2K65\SMK^	ؽ33űGǗr&y`	h&fgEKXR~4#-&SVn+ۅe3,jun/j:΁5=9ɋhCYFt'-aE><Lgːrv<QY9fm/#60N.Y~sK$F-@cӻ);eˬBn+K3Ӧ6}l߇6-so$܌	&G(crx5rXgFxwpmۆ$ :45~y҃}S$Owr^E	ۙ"˄-}sv׀=qtgvՆw4/uf/a4g?Oojr.d=k==c_[,WnGg(yl̝G4zM]W}=}CòxO}	`'~=_W @@g"}<_>- 6`v1U}qQQ}	ìdWj~[_K�^
    	Ԡ
      `!!&.!6>!FN!V^!fBIֵt-	.m0Q01_n.ɖ}ӄ�`nRU
    "!!""&"?,#>"$F$N"%V%^"&f&n"'v'~"(("))"EJ7A!BCA-EA`k Haxaacbs}�363>#4F4N#5B?T#6f6n#7v7~#88#99#::#;;#<c*f
    HTMUU]UzVETh}@B.¡{!d/ڡZ
    "Ŵ`�c{@d*#Fn$Gv$pW^^fmfcw|Vhi�/aZCZdZPdEadP%QQeR.%S6S>%TFTN%UVU^%VfVn%WvW~%XX%YY%ZZTdWP
    ,yy_%`f
    &aa`\Ubc6fTLdP%fff
    eRng~&hh&ii&jj&kk&lƦlΦ?@d�[VYm]e"X؇X_&r%b.r&<s>t:dNfD\&mfgnw~'xx'yy'z'i?�;<�}�A	&Hv!\ʊ\R۩qC}Y$2'&vtfVfuZ<(hz^wn~((&{2�(̧?4%s覈,&g)N(dicVV>hN)V^)fP'-�hTÍƥT2)az橝2h)s2�*F͓hj)6>*F{CPr?ZZooƩZff*ON*j#\*%Pp*zjH(B
    کn
    *BA魪j鸖+鸾j;K++B*{r+d@ó)赞*�#�,(*|�4aC&Ʋ{nlr+*ɾƊl6軎&kƬ,,xg`lBJixڶBXl�&`xk>0\-n-vrvժ.gf׆
    ^D
    a--2'6m?-6--׶bm%..6>nmC$~fl.tCU*B&,mՎma.a.*`ozB.V^o'T�*vnix:.ղAoA\m�f--K$Lnl­oo��gV/bo~o
    �A	p-�N/0~zp@@ϊogVHk7X¯�	܁(ouo춭p!dB~jlf�/31Ƣ
    
    2 -qBo
    0$G$O2kT|l2qH/=/m.1@Ѷ2PLGĺX&1qBqD.&p�M`׮0� #/!62"Wn(S2::%s&W<w'K-2)j+A%7Pq&(4r1..7481Ot05[3D014q1F_s6r tJC"s#
    :״M0+<s(>W>RUaBV$t-B37sKtEw5	ZCsHGs.sVst4EgtX[\s3J4/Y{z3N5`vg	�}}ځb'޳SU:qId7 >5,/:\aJ4Dhhvhihvivjfh۶h�6?3cVoo5Cwlp6i6jk3#22:L6vgv�fBn:(c,g"ma0'=(d6g[0g}7~v~7~3n-xYvttu˴vO8W8@Xw
    eEҩ�fm~6xG38mv^_SAg撋f;y?XgDPy[a/_x~9Gy&n-[y#yii>040'9y빟97#oySҕQ:iBf[:k^wyx&g;@zWzzjze/:79.e宗({'|>|"6~yyz?}9öu˺z?wl;&z{k:iV:纸׻gy:{kįxyeyw/K{Ǫȷꭎ|9Kz#:|+:̏;?9?뼧<Ǽ}ͫ|s:|Q/zпs9W/s:z}=;|ý3|_}7z[۽}Л9RB΀f'gS<yCg|w<ɗgbQy|}<9ާ;gٟ;̳{~“>ٳz:<뫺/?>>_<?=ۼc/?׻@"{r(O|[c#&W>	XaB*4bD)JlxcEyQG8IVweJ+Ytre.y%Μ6aϗAy$Ϥ95ihT;B5iUG[r+ؤaZ}ZUԥZbͪWTt;δe%ߺgihQu&;+߸^\\ޭ9_grC.-UIA`I/b3~yrȉ7|YtөWW{wW|x7Zt~=ك~|?ߑd#e$d1̐jp1՚(Ӊ@'3Cp*)M܌.hr(PTp`0SPjL§J1D S<2D#4Tc5dۏ6pӍ7߀
    [0qNn<n.:8NĮ;c=uB8@?}ԟeR
    
    + =37kBb,TQU+FETI4 +#g02uI!W#Y]-tX$Xa!Qe%GӾHm^M6j-z-8D^놥n<.N9N.qO=X4anH$b->KR0؍AѳrqeG6ZMv1ِaKcUoyUΪg>6:Ic]ꥫ-ۊgvN6&1,L2ƹkY[&q4tDv2xƌ7}_8%w6-rlMm*O+MU"xJ=hw.}F}Pc?nnIq,Jt].-y	�8q$}7ߗ7ݿ.`QWtZGxVo^gbPX@M-owT@> DP4cpR6=zޖ.%p^]&
    /U�0׾Mn\W]J`(@/hMa)^Y"*xn`$iQ(z�gCцa:=·1"("ʈHGd7En$)YIK^0]4=JO:WvN9&
    l�qD'Wя/}
    C
    ]Ig>є4M~ѓa6B
    <(,PNsv=P'41wgSvŞXq'=9ϦP�1NBP>ZQ"TJb3Q~!)I0re7M98p.dueBdu9Nyw4|.ZuBIPCQ>ՠ
    Fm7R^YժGK|2JLJҗ61OֶUIZjQ5suj]*UF2[`	[X'
    kJj	9fV^+5:WV+پzdQI#{X׾mKMRO}+c#KZ6f;V*4w^[QRl[]^6qR!&d+[
    \T<zPpó=jr׹�b'UoխcIi{)^_ve-I\bx(IN8s,w!,yj^J825.l\k8=6(\e.,*ҿ!Uf5q<g dvƞg?y.33]hCх}fGSɀE>(]iK_ә9iOԡI]jSթVYjWֱij,4/E;l@ۏ:?i<SjSa%A!Gڿnw]o{߻ݷ23ػbc	W8Ov'CnnS;-mWT4I^r)WYr[cŸ ^v?Wc#TX6gpY{ԟ1.3֙qE!I\^viW.uI2}-p^d`(ƒNt9ـW/mW۞L<u@]:\߸]n9ywhw7'u>l
    _^
    Ik8<
    eH^7y(k^ї_}Z|ﻛq{›_}>/+?>
    =3_bƮ�P�9-&zN-*@$.
    �a=|:V[_OP]P&sPw&p.{RMl键)		{F-D)<K0	%
    
    h$zP
    א
    
    O溏#p},QO	
    Q0?/3q�(:@h(
    [q/!Sk0FNQNL0wKPy|`jkqrqTD.
    Q18;Iɛx۪Qq JCl2ّ!!RԊ1C187n1yJ!$GR$K$O$S%WR$q &{ %
    "w'{!1摥p#S&u
    a)*R*R*2 er&a+w&ɑQ'A),I,O--ղ|2ְ2../.[n-o//A-0G/m"),񌾰2[p&2MR373A2.2]04KS4G5apjPn..=c.lptSx|77rd38Q
    8q65.9937aրS;=m;C7oӻ15ϓMS=);=SS>?Wrm3609;@7-Ast֖B|S7-@ByB)
    &BU;a.SE(1-2i3Sb*u=73s>HSFTX3\Cϒ9RC=T/R6t6s0I%TJ8t/gIsKt@/8K:KôK3K46N3KMrJ_MTBI.3T@˔6t:AO4PTRN5mJBRTR2MtAI63NtTkSQMUrmvE/HQsHMGV2W{*k>WCsViHs5P5UT/t.Y9uROUO5N
    Y5[ORtZ\CJ\[ѕ\^9DQN3uCuY;]-M_D]4]_`Z\#va5\]Vu\u(]#y!FmdmWQ)Q6GO"Gq5eYveoUe=4k>UXE233'Y+RŕJZUZu^AU0vb	4/3TR!uL1_[:k%@Q'UlhuNYCtiS5lbOR]V^i[``-�<}<uv&qv2"eRGeesqwu>oqpguqzcŕhntEi6SWauhTi#]vuuswVu^ZUKyvtQ7վm	Vwl;mkWxvyb_wwͶPq3pOOcC6s%s2k|ӡ2}73rQqWfqfGmX/w 7wgQWzlewj6Cu@ݕav]vt/#{
    aWz'{ׁXt-vEz5RM8^w7	[xvI9^Lw^u1_TV۳ew]vq_euV)>-Έkn,vxw80KLSM5xݴYvI5j4L/UX7TU;USX.lCjR؎48G5Rw؍xD	u]:9ْKuNx]k7QCyXca+kٖko۷r7B>uY]I!HIsٶ'O-nAZcc˙G8fyf~Uvf'7ٜٞ97}ҚYsV{9cٜsyW'*U>Z7ڡفY��!Mٟ{SW
    ꑣck)GSwX;W,SZ<Ϩ{!ڜ%ڦ'ڢ9ڪ|<z@ګcڬQXRU$繪Z9ZZMazzQQ�[A�[#'۲)sz=۳
    K۴_.cyc[gk[_[9hOcuE:gw�
    ;m[ۺ{[~{I[Y;eٺyo۳{y[iΥS[ejd@+{	\ڽ'{Je%
    \�8\;;G<yS\ћZ_q'qA-
    )�;ǁ
    <ËI\wđWʣ[x\G|{u<ȕ<̿|\EL!\	ʑpa\aܢh7|<!o'+ݵ</(
    K}\M=ȓ[xgk0]5}KdBXɕ`I'W(=ّ}ٙڛ}٣ک٥=}ۻۿYaxd]_<{q霌)+٣ϥ}ߵ^ᡛ�
    #'^һ]7K׃>ͱĿ޳Y_c^惁k{$^){=㇞w>{o>ܛ_g^{^ws\ҍ^ǞiPE>{>汞~s~܉~EW^^#X/Eeθ_F^S_W#3sq[{y[Y_kxn_O4J�ZpA2}M?_??ٟ/>,Ÿ<0x-|1ĉ+Z1ƍ;z2ȑ$K<pPLpd#
    JD-^=4ҥL:}
    hT5ԫZ:رc=VjѺ}ڬQep3eV@!>8Ō;v<K+[d K}w3Ξ?]Zլf:\W~U+;\f-7q/.w6̝敹s翏
    =ܻ{~kV=&`Ѳ[Cns̾CPgrX6WYp	%-`Z_<OtDwׅ'WXxb? m,hx֘
    8KTNiJfav1ضZ`QiUNy\&p%gaSfnc&cfcMHat}8oHo*"DzbNhE:Ffw?EnhB*BҦjЪd#:ArFMFi	]^&VY涠[pZN*s>|aw蠯nZ{蘽k*�J*ayCk'ZƮm\iR%lU`:-&[qmel
    xjJGx裪("&ҁ]t
    R:4W3r.[jVM*4dC]jm*BwýgO
    xmOO]ڇ+`=5c-j$ofz͍
    ȰuVhM<{VN{>Uλ1-+;`,'k<G? //}~\Cv@[tM/xvv>	~3
    `
    8%psԇ@]2j)H@�n[-w4Q*9*HrDZtͮV$^t+W
     �+Dx[rٖ<dm	\HE,6o{KϨrh3aUσqg}[8?6Sk 	5R黣\A`CBK&0dWI!OHIq'kxvpa:tt:$
    ^D}¤mG4fX&V2ײLgOR,4/I	M%zK5h[6GoT<e+W	Mj!=iBv6pl;VS'
    :I"Z(	΀&%&Z)VB`DYG-}^glʨD$Nw4Mmt4r:oE'ֹqQCEΉsq)	j}ħGPZm ?^5jЋ5%&=JC
    4QuF9WbҪA8?=^.T]HiE.٪Ugi	}-Q7Zu|#R(CAuxc"ɹBЩo[E9V*5q6ѵ}KwH65՜'[:nk.w2s՜R7שޝ8Z];vo
    ,#uZ!bj˘vgSbjQ=-U|m侖RqaX8.qF\K"
    f;N8V
    p_۴.խI1%+L*1W8u30]L|B<'D'b/+"'CwЊV43bg^LkzӜPzԤO}joxn_
    V7cִoMXǺԢsUx
    R+zsk8�gn
    hK{0.)RT@v
    nS{Vk\{v5=pYw=|{mhf0p
    	/cݏvzXg-qV6bo1$/Or�;&{F8Qmngoo]qZW787>lU	FK}TzBV>WZEy^j{:6z{t:j7nsf:U|[}|߹ɶ|Al~j7VC푗mԎvcEtŇSvԫ~oL௭lA]MW8]_z=Ik}^g<ϯ;Q~tـC}'H}'r>sg
    aΗvlGG�ph!($('ng6/gMz1.GuoPW9;zhf+V;EHSVg|h|ȁ'H&xFdЂօFr35Z"ǃikXu>8x@_kaXx|_1shT(~!YEԅr8tcH<ch(`ȉ艟(HhȊ芯(Hh}AkCqHlGFǨ،=Ȉ+e(gtq(Hh爎{jWŸxT覂F&
    xb F>ɐ
    	)I:2R&x(1A$D8H&VĘ'y=!d'=sX79;ɓ=Ȏב0IdXKɌ*ȅ�`&bl?ɕ]_	a)	6k(qUYa#kILyNIYX&/ɖ&(>Y
    9IiY<vC|r	IS)pku8qjɚ	DVik雿I)f9@aɜ	yY	{BiYɝH�t%Y9乙ljН)IIx"趛&72	_a扂9ٞdhʡ	y{)6V
    z&	ڝk;ʣ= "Jjn$Z햛e7Oj
    0*+::Wj0:Y鞎>ik*@ژFjS٤K؄yT(~z
    :U9Yqlꨏ
    :nCnP*CȩЩcXW|ʢ*Vʥ_j'ɛfzrj**êZp0JjZZ:ZYZk�ʕ_jꚊJ^ډji:Ij͚њV٠j,*ʭ
    *j(ht (Xyz+.054:K<>:c
    a{Z_jڴ1ʰ
    K39(,۱"[i{j;Cۍn;:r[rKC{{p뷯8ۮE;8T}fYȊkZIj1j湵ڵ^Ja)jhx{@k˺A[{{q[7i+3ˮ˼?˱2gۻۺKۼK˻ڛ,;ˉ􋽝˻kAڹ`{4q㻾k+ k<ۼ#L;(l{\:,*?è[/|=FL@B<êlK<Dl.܋M\K,Vl{+̈j
    ,s<,
    a	cZ^̳4ƅY|>Ï뱈뾆k[JRĞlÌ<‹|OlƖlʄ\ʧL8,\lkˀʆ+:[`,Ǒ{n<ttlǼyjӷȄL\ƯŇ|*LcL<?l2lΞȐ|Lɛ\XL]lσƃϐg\_Œpq "�%m')m-/
    -5͌Nik[Ж;|ƭ,,GG\	
    d|E|DMM]W,λ	mDOϕjM^Ōjiӹ
    I*-؂Ӆm3׉9θ|lh�{kY,P];K|}]뼬mۖ}k;ɦM۵ܭ[ں-ɿݮϻپۧtz=ъj}"}=҆M.ߍ'<}ʚk)zDfYڝ
    m-]i4-ኽ<yGY೜)n/͔N40`<>n!#^8J<<R^›0N2mi(*
    -~n6I^kF'sNuZ6(ȥ%mb慾�,^U{NkmJ^v.7ڝ!cbB.>.+jҬ8b&nnǎ(Z}.Z|N^B!.C鮒.p^�.~U:n/>.O1X#OкN~'oNr^7n Q]ZX>'/0?9Y?;zy>
    ҵ}iQSOîŮsO0_dJolnuOwo^)Ie^؁/߃Omn^O\~4ȆOc2Ώ 
    *o/i(/a{Dˏȯ_N'OoQ׿/,o�O@
    DPB
    >k=F`9W
    Lca@hO$ jSN=}TP;#ETRM>_ҢU^ŚUkO^N*@ydeZmݾW\uśW^}RQ#G ɉ$)_+[9͟^2ШSzZ)hѣfFZ_Ê%lZٵmƝ[n޽}
    bƍ/|9XƎ]”I&խ쌔t۹G }]M]86ٿ_|+\p3W"26#/Į={3mB	-|B).B
    ?D$Ģ=NZ/>1FgFmԏ8Ž3NjN@Ȣ:,
    &I)7D&<
    I-DQE{F1$L3D3ÔS,Ǡlʶ2=ٳ+3J3B&tP�
    OG5T+MK/4SM7kMxלNEˤQQW\UP'lVTo.`S_6XatG7}39	,N\Qc'U_Vke5Pma=Yo3uűz\sE7]يmG8lLH:4#EPI|I#nEp/Lu8b'He$*ZKF`Wja^bgfb+͋yeYA|S^U_.h<IDžLuZϺfNZLmTEgf=I䥝	injm]42Gڻ!:{[+pWHv(<+c8e;>Ufu՗j.pe=
    s2vn/7xH!K7z|=(uj{_*{bEh's{}1z_}W?~};-C@2	/A)}`'Byd	
    T¼ꯅ/�?X0 �1B
    6xL�q&Bء8F%N|_/i)zZȅ X@Ў oG9ґyTHY~#{8r
    #v=#1)M‘L$CIQVr~!wBц$'QS$(/ٿI JdJb2a#Fhl\ʨdfi9=H}$g#8HOd<'9R<gp֐a*yOW34YP
    FМ|hD
    QD9C.%
    Pp~JE	iLdX9)'zJ6Q/Q8I7(QqDhI^H:Usznq,)ՌzTtjW=9};+U	:^eEp5b5kS:w2?Ac0Bb[tc4YM~dVÛ-x;?*\.fk!`N4l'_yUƖk,Voj)g궶[ݭA)
    օrj'\t5a׆h:+)DzidCΪu'lgYfi;y;!계3thRqlOCԟ	|†t'AX*x!I`~,N1#B>pa8OcX$!5I%r"8zEX7c[<M%;M+DCf*DlYDtVu`Ӫԟ7EQMqDő?Z04_@VOzʴE0BuZKꗝ$MOd603ze}N+)Yхݡ[#% 3Jao'>5ObJ]	qU?:o(܊Y=ZqQr'^luCƵQI8A%ag�]44/-nLUƖ_͒Jb}!nU.:m5qw|-Bg ~d)dldV8K};5Gn_|xЅ>t+x p`R0yCՏ08?)ڵ:O~ŴϿ	toѹJԽ�pcgh	ekvE=mN7>{?yrWmG#Z{k&iyַ.8{*Vъz|=WǦ0XG~}pbz`}{?2W?wiew�`XGbcGߋ\_7i�$4DTdt	
    
    @@={?𯶙[yAc=k !$"4#D$T%dBABf
    B(T
    CPAعrK
    &r"(;%b7l:;<=??A$;C<BTBDFE=+2�+KLMNOPQ$R4SDTTUdV9\(*3B).PP@0$Faàaߠ`Z):dZF`(klnopr4s4GmTGuv$GtGt\yFwlxr}qcȁibb)dRj[\&nȊ^�x.4bDA HIFߠZ+2H)Ǜɜ~Gɛpɡ\ǠGDmŲpʧʨʩʪʫʬʭʮʯ˰˱$KI",F){,+n8nHȂx
    (=?<IIޠJHIŒbJJ2ɤ~LJͬˬFͥKȆDTdtׄؔ٤ڴ<Md)IC,.T8~3H30KP�-N2}j6}358C39O˳|
    8/c\.�%85eu`J 
    
    %5EU%Dl4�L6~�8	΄� 9E59KRj۶Ts[ݠ
    +M2p1%UP-4U5G\789:;<=>?@A%B}SaR=	n N	�P�ɹ(Yj6CORnR\RݠEc4G~[&0&dz`a%֤ScEdUeef-hVgm3EPiVanumndbepsEtUuevuwxyz{|}~uE`erT*͓˝pT8>QxTLNTk
    S5QORmRXuY͍ZFak/Ec/pٜYWgٟVk=ОMV5Zi%Zf=ڥ֛eJڨکڪګڬڭڮگ۰۱%ۨ|+ǥa3Hn8I~�,	L΍�XOUQm3(M8kY%L2$>ÁӷFsٛe
    ݤ]VZ5U:]Z-Z5Z-Ͳڵݩ=[̝mۂQe^凊	X:=33;އ#3S\ѐ\<aYܠK`ܧ39m3FVF`	YI;+^G=zHH䉊}Nµ&ܩ1:W>;;süߍ !&"6#F$V%f&v'(&⽳+,-./01&263F4V5_ӻ.sΊ2�Ix>@0R)F
    ژ<゘aacIdFKvJILOnNfbPd)*6TVUfVvWXYZ[\]^VeXds9Q=XKQ	T
    Pgh~NACC~D
    ڈ=;|C;,)r6>tDG<uvtnDv>gw~gx.Im|}~^e:pcd
    T(#舖h#f0敥\9k>%36FVhpF1H+?iK0ؿ)00FVfv꧆ꨖꩦꪶFj&頎Bci0ߞ6䜖&6FVfvdžȖɦʶV詓<~Ίh!fv׆ؖ٦ڶ&6FVf^mCݫ^_dӎnr&6FVfoaQK' mu
    >_q'7GWgw	
    gp{뜠Kp^K˾F�\wqHgNNN-oX^BNUdq*+,-.qOnьR"Γ6\YXr/:;<=s︝TgLXTo:B>ϙ89JKLMs0хm؇XCH]9Ue\ttNYs\]^uF�`a'bg]seg+HۺۼȾEt=uMuV}s[yf'rNh'`vwwxyyMs}g[e%uMEv򂡒G_wqOm~oD(Deԑoo.x]ͯkrq86`5Xm'7'sh}w+
    <H=c?)KprγGWgw{Xp%y`fg濧f?u/wggwLJȗɗ|lp&@w{p}ҞkWAsbpׇؗ}wٷ}b۷}`|Y|ո7}4g~>'{~ϐ~`p�TJϮ㧿O( p LH0TN(q"Ŋ/b̨q#ǎ?)r$ɒ&Oa@hP$ js
    <T!TET@FHt)ӦNB*uңVbͪu+׮^
    {?
    "Dv-۶n+W'ͫ7o?|
    /a>w1f
    ΍,y2ʖ/{L%L4mi*,b*n-{ڶoέ+Yh1.|8u7K|y~ʝ7=9`ҡ[|; /~<5|sf͛9w&~7@GߓTlk
    H`NBYer\u%`4"$"?&[xX7jg}Oݔd7_UPF;)HO6)ۄSRY;Uυإ_b3"XO/	`+UAsYy^h;ucF	c
    L0W	F	6)Jʩ#ji^Yuڪ'եSZЊk뭹,j22kѝ{:uCBG9?$SKH)Q:`{KbY55#$̰-FO ;,zNO78ɐ>E9A�$(䥠;*o9oU[U
    0K3a=hSS]uٴ['rrD05tl-4z`r]u3&S^yex曷u>y$|
    h~266[sL7ϻ]DҜ#HuY޼C�+w$(߃:?j:/;8+*)֮3Qs	{`]`"0
    \ N�+8@q>}~' 
    };f(p]*
    Ђ2^]p9ܡ{0@L"Nx<
    ,e	@+b(N(S,^hFЉj,&@l r#h;1vB<1["辂
    T@\$#}1+4
    2?8'2%)KiSD64ʁrO`AE`[�${EKh|%1]%8و3gB3,5ikb3`"x$S,Ks38wUT'=iϬ3'?)y3g>iЃ"4(@P3T(E)Їb4hE;я)IOQ4*HKҗF+)Mk:ȕZ=%L{SԦB*Q[幝J]V�B5RAb5+ޅ0ԩ5b-NU%<}Z]+V85r+]j׻5z+_׿6,ak"6],cB6,^'rV^U[ς2Y7kڞv6]-kO2گ%ij[k"MkRgۆ6jw"%.s+Uf6ҭrk.wY]H�./vkh7]%J/IZ$~+27n]"\Ո}ߑ4�H{
    8Kϩ�}KF5qS,_x-n#ؾ1;Rt FLXO<RFe*_=2)d9EsILc3.YfV2l;910gTς4Ⱦ?#T&4*C6ђТmK{	ғ4ҌOL4cP:u[2V5kmY=˄χv5B%E˶Yc7^5cc$i2wXNl3c72,lk[َ4͓_Y6rMt{v7~<t-=~
    _8[p\N+n;1.i{<"9:5| O9[B~WN[%#8߹UbN>|6uNt>zr8Ozĥ.tZͩrK`yǞr{/^3;[N;Vy<q?p//Ug*7cUG-Go3UmWgTWngoۧ={?>o#?_>C\oc?>??o?_???o@`�
    �`"`*2`:B`JR`Zb`jr`z``		`�h$`A`
    
    ``a
    a"a*2a:BaJRaZbajNaaaaaaab 
     b!!"b"*"2b#&h9=-X%bb&jb&A'z'b((b))b**b++b,,b--b..b//c0
    0c11"l=@c4J4Rc5Z5bc6j6rc7z7c88c99c::c;;c<<c==c>=2"�d@
    @dAA"dB*B2dC:CBdDJDRdEZEbdFjFrdGz\GdHHdIIdJJ$KdLLdMMdNNdOOeP
    PeQQ"eR*R2eS:SBeTJTReUZUbeVd@��;���������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/manual/images/chapters/architecture/��������������������������������������������0000755�0001750�0001750�00000000000�12203357067�023126� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/manual/images/chapters/architecture/underTheHoodSequence2.gif�������������������0000644�0001750�0001750�00000212742�12143164146�027765� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89aG��SnV�TV�P IM]�XLY84"#L	[�>!GF"Y>aT!�����,����G��	H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@
    JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻNȓ+_μh[(	QiӼ;sV|ŏwahyoʣ{@S:0D�xޥG'遧㩡|U!`x!E%M6a}.(2x7|]0X^!@{	ɟCb#dz]y{<^zZ]Xv_
    ) xlgԠ1~|MX{VSw~_zM7ߗ%Myh4AZ~%zYb$y-n'~_|9䠃:@?@Cw60 F	t3稣f*j b8Nj_FIjdb^y;V˪~x۶{wb;@PD)lB+JyF	/߇9:[m;6(~.>|h
    "w[.ݜ9^	x@gYy:ZKގ(sՐp5/:@[,4(4B\
    ,;Xfz[.ˬԎi-*#|8*O0ߔA
    !XEHS,qAxA~=/
    %D�
    6
    >
    y >Msac&ow'vsm#9R.
    =N_R(qziKڱC&<-=;4Pj}AC^ؠ->ڠé/yj}>%B.aZyWG:X }@BNY
    <\g(Ml{~C))rד5kASiFn�^Ր%v,ؗ/`)9}aPm+co%)dxJMI,+$3',g4T+r/a۪5;@:iL@N4
    ^PGW`BuЪJ9kqi\e ŭ|2y7E@:"/G`E)N1bu&U(W;,Sɣl@;hwP�U"(;^1ܡ=
    vhHC%-IQ*Օ;h@4J?zS)?ƉF"I|@CA}j`SRؠ@xGL4}NZR#HZ׺ml#*WmՒj+
    J
    נfMk
    r
    
    U)^@Xv=cqJR60+zՐQ6SP|cX'J۝2 z=,4nwi
    
    Ԡ&6
    jK[ݦ�Yul=]Zױ|eOKw]}K+Vֻ8+(C:hvi�֞2MͮMj]J6EN)[ r[~V6g
    STeSKXҹlOt)Co%	IdU4ipT~tHkw|].6vM ;Ea:`[=3N\Yky&PKb\,@øm	;b
    nqk4*
    Gje
    umu׺\R@Ήv
    NNv~II
    |R.a
    [yUV[Y봯vM,4V#p"A�4юKq?BVvLKJZVsP<+@#0
    X)MЎk?Mq%.rⲾjx
    nk&8֐vnG;#<LTf:L=@ŗN;w	&SñJ~q22/c<V1,ٹֶ^zᣁćB=OT~R/9쾲J0SSqq+Ϛ"{(n؄blf܍9Cmrڡy%o~UٙhÎ|._iCG%>uc:=-OƣsLl堆2jHk_n֑ۚ7ubltVW|gu>>Nr@AjR 3'sw}wx6xvWrxx|'yrvwy`|"x)`uDes<f Fxpg`JNPMSSXQZOJ(
    '`8 ЄzLxVTpR8\Hwr|{XX8wQhHF(
    N
    QǢ!P[xv؈OXv(Hkxc	Rհ'Rg
    kT(臭8hx8Z0	�	ޱ	j 0G4`
    F色xy\(x؎Xk(9P0]pj萦؇ɇ؊H95!IHlȐKH؇YHxXzp
    sq,uh) OC`I	�N	�IɔJ)R`OZ0J_Y1wbHOT��T�KywIFNi]ٕM	JٗxIi	{{iUa)N9iRٕRI\9	F�9٘YN9hK&dɘɘiYyi)Y9|	�y)T�; #0pW]Yv雿~9xziIi‰
    iω٠K9OV@ �c+	٢٢b9I`ɝ	)?:y,j9̩ڠYTPIT9	B;`GEJ)Ahڣ8ڦOyFz)zIFy'SjL)eZ^ɤ/j�**g	3F	TaHA:p
     N$@p�p
    *�*�p:�z�ʫ	�ʫZ0 �(
    `	M"ȃ�z@= r0
    :�A@�pz
    ZК: {jKJЬjkа
    K@�
    ppZ˫0۲˯<+0;*Z0�k@s"&yl2	TZ@{�غ뵹
    .
    :"{
    �`
    @Z=\y:*˱[+p
    +p0Vp
    %1 =|0ڪ1~볮Uj
    Pz{]:Yc˸;
    Ьк0R }* 'QUDWKz%۶`[j05"+�}[z
    `A\˲ۼ뺐K4k3k怫6۱%;%+Jq+װk@z [KMki)�RKw˫[,+b{p;r}[|,Pd˼k/\�
    0spՀ@;{{
    K32k
    Z,�J,�k+L5+<
    ]A+W:*`èʮ}K˵KL۬\\ЬAk	P �*[M09��Kpk
     �(P	Ūz�\p�	KĬ"<"!lK��̸%۰󋱙[}�*ɌMڬ]p+0�JkL;
    o�,ݷ۷˯
    
     ;%{BݷW
     0\+-D{20	H	V,)2{eHW";o: 
    M֠vݰL3,̽�
    l]0񺽋Q*XUrv#uWCL�Śϵm
    mjݡ^]؍v
    F]pұ
    cm<�0+=%[l]
    -	=�-0Ιn0zT0	~M)>M�@h
    ޓ\rl
    ҴkՕP]f�%Pnfˋƺ--@&�s؋,=Ƒ=B}}̹zCtзLN͸px< wa,#$
    p	D@=pL^	@
    LW�$p
    $p	p
    P$0zo�00� �Q�p
    [P�
    �
     Q@ޠk~qP�=`
    WWڌ^p
    `rͿ`LP,�`�*P�\$psp$@Wp	s@n|ھp�NpApp0~*	@A	pW0*�`
    ZPPP
    �
    npp`K"~K�=P�^Z`
    do
    W%_���=P
    PaOpXp$`P	=3&bZ	pE�\	Z	[p.Z@Z
     ZO$\p@n
    kK	א	�E0$A
    p
    0ά*@ܚ^�N*�~&pS�3 `ƌknT]DkZ.E¡k$P`֕%2%p	6l0`#H,Ro
    RV\QK+$L#.A#˕L4H)ZH4%k7>E)P<k
    pS`WAx&Y�K-a\uVXZ]R֕.ۣ�MW4sȜZD(k,fkTslZ:-Sd	E<T	6m={P�I,AkPҵ4Kr̭QNN=HPDQ�@% R9 p	hB9pb(θXs+2GĎ%: a
    sT`*8	79Թ#4Hԉ/T'6M衇AoCÛ7𱭄޸X8z@ukH-p)ʻ.<$A
    HwQ)Xrƙ6㼢889Ld0٘Q7KpFzs䀣:
    X2-Jț5@Z"ϻ&JQ!,b#M+ŀC4-
    HǺ>jQs -.
    `+(q%`&p҉'(R)*Ҋ+,R-.%-/*XykY0'*"
    (3B *|O9$lFS{n>VY²e]#B-(։L$sȸBst2Xm ppf7QT0 Dp4P5Ha�&6-(8
    ypTǖ�Ik2ĜCQi8`�*pZ�'(VpPi*2?T9*pX�P�ub0B0$tI�1Tz*7rBH">5`IYR�5�A�44$v(	Ƞs<&�u-U[(:"eH,x
    LR
    T7"
    Q	.)rlS
    |4s�+Ȅ:U0oP
    P 8~2:%0Ij$	]cB,*aMTBzTF9�	p
    -(e	)
    $I$b
    /0OADب��Pk5d̡PxD*U#%+iK0 E,8B
    V`-a_=p9C5v(ma0[(lEWclh.	�ў:"=xO
    $1(xruNaG^p\Xy[
     #Xw8+ 1S,`H
    |Z4Kx�0qH	YA,\HSD1,W(o�0&o	H'HAH6%k%W-p?+ʃVDZ1x5q
    5
    +8=UMM]* (X�SIΪm!E0jl[#DJ8ʑv,�͡-я	d,YCf
    d#!)IPY&y\PUd~X}x<~P|ܲ. ט1kP:9LA,1wS'>Op@zЄ.
    }hY0<XT(G=]L+") '%y	ek �aȈEҪ78Aׅ҃4e;=Ҷ4mu4S_[CYTs:,~b4(p�@ r`E! ߱Mc3�Ny9@
    3g.CV@�+&@75<>%(B`sԠ�2�<P}HB20x5 (Aq0-I^PxHD�19W0|tpu2Ea hT
    x`'R@ 04(]"
    76
    j ufBPG�1>{r 
    X݇sX`,Ѷ`k�$�©
    PڱVNȀ'!B6;;؁w[I0m.B"؍xBSeI DzqsP
    ԦБ�X]
    $W@ 
    َе\30(HG
    (Hр"
    n~"Dr-!A;(x^*Kz:PH#@8z xP<uk�#0�ށhh؀
    ' �@yJ7 Px9Py!B�xضߛ7E(�`@[;G �YVHuO7>�bA˟9>xVK �Q(DhqPe[8x>C{9
    >pxb	VRy;ji#MbB*rhH
    `_px?:!��D9ܪkC87"h> h�jg6>9[�?>8y�C<q8Xh+6s۶`A!Ex<Pؾ+j jsCF9~#E/4O=Q_+�Ejk�:췎#F@@7h۶D8PkQh<D0*8<= =0=+�sk=K#�==>#F9c>p>{>>껾쫁ӵ~Ÿܶ?*<<<p�S@0>@�ǭ‚8.L#O2HEtAADA <="#DB%�&tB);+�BP`B.L/sÄ	<t�y�&pRk�dEsӻ<eT{5=Q9vhjN+P�7
    YWkqɻIKB)9T	PQ> X97ß>l+
    8pq+8	(LpKy(HyiC!h$M�X!H{ B(7jB9(bk@C@�/:vCWH90ӛG	�H:L;{� �:>xD΅+(G777~{@Bs2pXa$eӹV�;u藘D|GEAp,T8D=l(=O8�;80cy$�G�6QpS6pFbl*
    �t>v]5|YTk:,Muн(6Q@}6|صCd#8;HVY>XQ{#9(G@h&ÑH|AXU �pQc4;;+Fi<cz<'~9"OP_Mv3&s56Tk@OHxŽG=>�^=A[~T>ƛYˀY^{Yb=M�8ST\V|_ixO 9l?$;	#I},i#`6h}}ά%L7TO<CV{T:C/Rld>({9dž�p8@R%c鼁$b+�Gpʅ�$HSM	WH{"87k+5XN��k֪֩pD(Wr"Huu!|j9z{%|]}u[X0؎T[)T׵pYkXD+:Qy uහ?UWW7\քͧZӡZ՗-qڟ�5c/+%e7OY�;+ 'Q|=&TJ/a>9	ݾ ҇lDO�i P5P7P" �,�b(`�%F)p#G
    3ŕ|D"?)(H0H�@$,UbP89PV�1R)h-؂=@�F�@)x�&�0>,
    &j08~�~hX@P�`|tpH`08xFNhA	�(G:H?h*X/h�0
    1^
    z)8y$5Ox�(VAZȀE\hpAܔ�ЛEX|�hp3@؅X@R%`0&l(Uh8$03
    X"X)�3H>"UFѮAႚj�&khHHkXH`*O�@1�$#k᧰j(pGrPH $ !
    P	.,ofGZD	GZp:X8f�8I`N@юu1( pꀐO~1p
    g8�)�f1bkT)/
    ~�88ϫv>0pp"@PP�(?=1W j.A`lWҖqJi#T@`&	
    .%>jN*mڂ�3X5OGtJW*KP
    XŬi)Bء({O?koobFHy.2OAxA SP�Y+=S`#q`)Xwx�	X֓vb0*;�A@GX
    hngxƀno%>osHnC80s* �?Ip`oH0$.`X?"֓8k.sbg"/87Ȗw"HJ�qtw,_�r͚'s3456wshI:w;?<>t@ɮf"A0PqH`H棻pWi@F
    jHj`
    :9g$ʔ*M'V
    %�<,P %V$?
    YS8HK78@�"DȂ:9L~ D")�J�%NH	)X#XH
    װ+>hNpT15u`&*h)+*¼A@qcvԦ<ݨ#lPbRDyB퀔g;y6("6�Ex8?{pU] x@ $D.lC@
    IX ,HU \A�K^R!DP>W�QEHVPEATO>:@Ss<%BmZQI�7`D{IyD�^B"s	&GBT+$T^wpXQ	`HCJhQ]QE=$O!ŝH9UNuZʱNA,�G:uFăt
    D㏾�H"[EVJ8IaAAiS(wDET!&yD҃
    RRӬN~~iSh5A'OGS]$O<D`Q))5\DPWEzim�%3:g ъ0[XjTJM@(8S3\UbfjiS^X4Os=
    DFT@/R茅`!J
    !X)054ڈx^O+OQޗPBE"g�\!l^vg d0-<ԋNEWH�3PN,裑Fi:j*jk`dGbS{j'ԝ\x5@'oRƸO"S	XU5@F4 "!JpH1`xF�p4Zi#ܨ�|+�YZʟ~"	f@Bb,Wb�,D.0	! 9Q<)t,p �\fCj
    IXA�1A OD0X2ZqS
    t�2xr]8{ 
    �|@R\ +7$��J YB(0"I
    Ha
    D@@Dbя^`%Up%@PB ^6FfHp-(n�@u;`DdL>8Ȁ6sa�F58<A�
    @Q`?Bpr˙}0(|ndNte'pYc)q�s OЀ $	
    p5I"
    v�`
    p'>A1A@$LG@0Н`ŤG(7LeKM!D4,rQIQ8�,B=$(G91�;I[�YphOQI,31Y01]F0a�;I
    %(>P&@\c/EUbD0,唠-S6�IP Ѷ
    OB1L-~Ҙ@Ʌ2`y 1.'
    =: p5$EHPAAPD�dpp
    D!
     "
    yYE,IX`$~*lإЌ舭$1A-)7B]H8)I);G7�>؅PN/y)a)HI1?h!Gs,p�ޠ! @�Bq^&!K8,@$	Ì¡KdS�jҏ 8a@4Oj�T AP)7D+&`<
    �Z-I�ԥ0
    LDS4�:e�7EAlnax
    YBfZ4sj9)R<ЄFԂjD(@bXW=O.hV5/hEKUXKvVsn_{pYa*
    .]	@-D3(6_5( I`ժQP\a- 4<.E@VG	A	Zq-bAFڅtDI[*oS[]q߈:5L`H0ah\~Q�|6w)BX(&|8#Nl �cCF)f�Rɷ=u5Cq$xtU3rxjK�2Թta*'@+!"qdG6ߚنoR87ih^
    
    <1
    ט{eڋ(ART,;-BB>!@?S@8DA
    AeuMH�8xCE)�H4|ڑ	],RPY$ѰCaD@ -<eP
    V\TF$LLR`؂�Rg݆b\˴�@D`FTaaba@c5s�3\V�Bx<1.aۥ-P|P9\)II|Y8ۙUU_%
    di	)"(4UAMIT_(T~H;/@,@p(X\QExY)F
    5	:|RgXEt!P$~<@HV$U]Db�IA	-_bC�t܉1WT
    Yim,N%Y�|50%6##%CbS-=dT|4=3F38AL@;
    >lt`z^	.	*a `�zޏDE`S"~B@
    b4AZDTYu RT0^:S`RT�\8
    OPbE"$#֓#EՅQ=%H&&F\'~'|`IpGD 9(Ub@$F
    @N�u+I4<]I]T]@WL@$@t@1R4
    rl!DB8|XT Q]kǍx(Fީ*HIRA@mݔK!΂BgYHwƛ(R�AH+hPN))WQ�B'`-N,L
    \DPU).IPDAS|),|C=܍�(p`*D}R=әI`؅PAi<D(p�(b(DXqpAT@bI?gh	G'ЏYUQR%O@"(3RdI ^Hӗtp{	ȥ3TSDA\|\PI.]�rE)F!9 D(Y	FB�	!P�[PC��ApE"}^'Ը@y]īSD\"(O<'Y9%U\$u<h^�	S{$fDDb""e;uoD	lP|k
    UCB�Xԁ;IdC6xDaxH<Vm<X]Ev/֋RZV٥HCmg
    'PUڑKPlzIVfS=0'JjJ$\V=mCo吿B[dFߐ֋rWOS+IA%\��j9jԪ⪸`V~	"D+S.bo92>]@>d/asPpua/JAu'@ķ^<ƅ̩*%A88Ar,x,Ⱥ6ߗ,Slz֬6nO,40g9JY$&^�U`,AlJ[d<D[L]~g5&fW/Is\&GaZ.^PމaUHHqm!)Ɛ	8 0'�l.Q|<M`<|\9@AMc#5~@)%u�	P\, FΥ
    9^,,l؏H1a/ZT$9[=@0XQ`X59H@ca,LBAdu\$3
    Bct~C&`/jodrEJ�DU
    ̂-(kuR
    ��A�EL]bF<8@ )yi&^Ya,<*,r&[)}(
    !|U4	PF]:dO$…	' +K#?+W5FKUUhC6^e-U#P4Ft6>nnR"ȇPXi\]a82euC>@cntT-m4lOOR�PֺЂ-G@�D4bi6uOz>ɫ&GxebVhF@(`XR�˞9ŵIAЉl.%A3GDE=(}܆9X@]!%l|p#DF+`k
    MISɢ"m|CXo6HjI/QPtTcO,Mtx-dvI4�	uDT9R6vܥE^q݆|bPcɎPc@FY\>
    ǰa�bbnO%EeemkwvJ^m^x�3\�/@c̀�S2|\,%bT,	q#Gձ5 :xpuV܆S :#J
    QB<+aTA�4h)Af!S$Q8,8Ի׈2C<<\m\8E.7hX^J<8ufD>he)R
    _,[RD&;#vtmŅKl8$wI;8<O<\O%ITYsHC<@P@MS<GAPZ<{8�Gk-ƈTwSW9$e׳K	`K;)HC^_�@8x2(kS0'`O6a˰�ct`XF){T-SEH%lVxbT`(`KA%KԊŴ|#RD̺Na
    5-4`6-HKv@8Հ�Ė�I
    A ^p P(=FD�RGa�
    (BKQ\:l	$@>%)RJ:|�,f0]J)BEՑCQڲR>��FЮ�R,�hG(
    HZEG9rڦ_9ݿ:h)@!"F
     ʕ0'�GX\`m`>u(C!u,aE27�$qaFfR�a|`9,"e%66L�@&�ņ
    (bRBċ(jrh8*$˧()#)D]@!K�
    Ôs>Q&y�|2h<,GSsɀ/)f1"|@S#$!(PB4r|@>j͝>I#	R0#	D#$Dh`|A
    kI�TCdDLX( DX
    Q`)P>>xpÍH1�,(�liYu0D9"!nO<J$$̙Vv!%X
    SbCH	B	DBPP!.!ᓄ?aN
    00�O"%1[F@
    Pl"xEO(�z/138%1ټ]v	_,H8"o&f)KI+H`PK>M4ҴQ{V`bN!	67ռ!z9"+JR⢈x%)l`IrhmqB0bB#�bD$/oBkR@H"J/tS`	gcvQDv)  hK
    mR}֦=VMknu?;S
    EPFKbv
    uCȊ̂@s	K2O1@�!a	ABW/W@eDgoU(x9,tVl0T85
    v@RgUaSFSb00MHJPPaPh,j:CȦE"SYxd5sZE
    B	11`>`I R4o",j6G!Er9R"N<VAT$XP?PQ�Br͒7Ią(gQHKD@Q9%}&4)Ֆ8[F7ny֠Y�Np�O,{NAI-Vҗ:)B).#*	yTY-\acG!"EG(,\j:XH@;PΗ"qF|A7?9&Hip
    0B)�2 ^J
    Ry!&$n�9DB	(H!,5f%X\D%5IQ4t-=vK+>^f9Y\02s*5"X<Z׾li[[6%`x
     ue+Tp[\,Ԥxb^ex'VԠFQ%=L
    Xv^T9rzvl4q_Z%$ q0eu_7u�*Y0$�hI'.`S$	4(nB0oJ`\MQ	~o,pb3DPBF(@=ô\ "`4/+eX9i(	:PD7$OfAZc1@nf\2IN Ǽq]L CRaPBb$Ǜ6o$őĬ7aśLX͉y1?=/40'F AsoP$칗vF[؄襢}@S0Ò%󮶧3r*[/??hq,fU8ck3
    x=xO:[	,hb!Rn6
    hH>~
    M'aKFc&;9A1;s"<F<ѝ%R4"X5{[fluzzH0s3=67J0όWۘޚ1eˍ>޴$hu0-l3Ov5W|bȁ!	BR+~l!Iw.$F AxlƏ><"4-J5"{'C?q$sV'N$M4̀N_-Vg*傺	n 
    / 8!XLH|lm�W-6m8łVxDH+K34-	
    MoJ6i:FN"	M,*Ȝp|\DM.y
    pBtXӊ~Y,n눬̌zǮ$TldL|N|phFFl^~ З$,*k4 ŭ�`AyTa�H܀a!@aj@�f��f`aP�v`@V2 `�(6k,&@�T
    T @A� �H�
    ���Q`A�`g
    H�Q�R
    a%͡Q�YrE.
    
    x'hH
    `l$]%Q>qfRYP@LQ =�a"P a%-@L̡+hT!Q
    n2sq%w&$@�Y!
    
    �AҔ22 ܱ!bP *c+A �X`�2�t!ST
    &+g`1%-*!Uހ@&r`DZ82r+@RR:($uP`a!.a�!+I?T`ۑ�R@#Q"aagacnFH {{dd
    @S0:ESs5:b'u:S 5
    czvT?́#fԁG�j$"D@��(a%(�ft>?.A8/E@L!2Ta=s:³LA?ρ
    3>WR
    T!- SRK�3!X�: V kYYn&A�k ��`�FM%S g
    L3Ӂc>PsX2O1Nr%׳2>-!!a!*
    [r
    qƁ8FRLQ%aR&`#QU*ayQa<aZ!FIaD5	t'Y2-2~tv&5
    V
     3F3-4
    UN4ST5Y�\6Yu6k6!7w77 88k8U
    3::wr&MYsbR‘M]N2h
    4H7'%&/RHYL!@<DEDDUfWT-QE
    ?eT)k4Eq\G}4tH_RLt:jgrjs<gT.AceZris?)W3c
    Kg@)l+^@dHe(h A"gy F�qx.!%yqS4<�HVlw1IJ1�vFFkJPEd P BtϡZ{wP@K
    U=e1hbas%6"ԃKe)kr<HR�n/wA" <wr&%u"c
    @!7u�`g2bQUk%/v�!)bms*K:5va3d4KAxgGb:՗y�*6J!V.r�355+R8Awh <5&cb#Pik`5hR&IWC=sictrW&k%`W;O*/U:Z@-ٴ>Ɣ.	JRew
    A	UqY
    `DmoS$C @Z>%cx-!5&XKy{4M1""zz.YRP_I8KI8\H a_ CӁ!E
    Pw2<=.9HcR%*5
    `4&>.SUL++wAmkS+t�ޠ&F
    a3kcTj2%2bux^T5w/!!S+C3%QժQ8ҝGX:.w?S&c wr�*
    q@I:ys@j&eYؔ%cR&ñLF2	eXel�Y�ٔ
    [2k9EYz+Y. ˴1&4#cA+FOuN!T1E>:5rH#cKQ[+w�E&eqِ;F9hiouUxbU!Ρ1ۇA7w�Mcr/ew:19s)%"ؔ8
    rvMryzW,0Lx{Qk6S@y᧻dA8̯a̗|˼˵@J
    $Hg@6ͭA{GGS:\zɹf/|̅Ga-9@!UZԻk6U\׸1y̭qS||c#6wSY}|:%{tA&aI:SK#ԅ]8{[=%[k]eAK]g|
    ҇܇׸kl}�$}�;AKϽ{xI#x@]=i=+}G~{ݭ] `QaRF́8cW`2	]�v}C^kk=]ܫ@R"=>Ma>߽7
    ~}ا|-'�rR]5�#?u1
    O=KUk<%gZaGs{j36:/Akzג/=%>AܻI&[1x<'	`ʣw#5Upw5k	LP2Z2mZlQ@H"!JT Aԩ[њĄ;܁@%
    4¡	p逊T).\8nP@"
    `@IgūW6�WAU+P.F׆Ҥ9tWMLs-.T*_rJ;C/_~5_Rv8:;8}}$>+j.TyÜРaW53.񾂋CWbNC'Uo9%7}T	'\XafMPA!P+BBapFy`C
    5%j8	6)vD-6MpigT7U=g UӁ�-TDLv�MpDau@~At@4i8U`1Pe,|H��9h{ZF8HvUr DY3T~~gpbVTE-aA5FaZMQ#VD	l;Δz|IՃb>[ISTNHD
    �
    $S|"k:<%M4$ƉmVS
    
    (MJ1Tw
    %E
    ld$DSZVnePGNSmI'Dn�wH	popݕ\Unav0U6`<ʂ ]vl.@,U&A6
    (T99i/STvRӐCrOݢ^/K)SY5WMSeZ'Q~g`[hZ@ _v7>u�zM#:S"]<R66#,o$ֶ>XTh&h[IFɅr^(jkuΒnZt2͑Qc<AY(a[y}kS_|,4D;v.kߞ&8i"V]r Ea9\$׬Բmu[J(
    @(?\aqe+/}u_	:(oL�K7fIbX*6)pcY[מ7ip`�iX`vjśŌ0ZMF>9NMk$Jl�hB|
    LfA#n�P�Jgo1ŋqc2־Faq.b*a�;'t]�pԭN|bKؚ9鐶
    ɻxR׸+oq
    cz@ޛ4=.N~t�ȯq>5nqY?7oT۠<	JQM<MtQ
    44Hۋ~(iq`KhK̒tlq
    %2'U!Ҩi
    I
    }ܥM	L>e0T"ΡMW_'Mn:2\hljM[φP8\B"hAL8S	Si|[_כ1|EEW)52Yu
    Z"Pd%!ZX&9*qDsYwXAJ-QhInp틼$r!X5Imu(Fo	yһJL�ͥ[]&NϊW7!nECqSG9+X=o[+Q�j#g8a|Nf%$ qlQ[ܶ5'~	/p]ƶ)T:+wRhzKc:Ӛ`7%@N-ӌkj>q{<5e-SQԁM;R@0ݼep<}Y%c2/kFݐl00�F׼i:,eZ;;R Xff�bX?
    L5d:xAe;j-vJɬq[lDqXvb lVXu{'&�4$I'˰̗LO}D_D<޳9kNFQYls�GSe]sפT]edD@?M{e럃]<IO9biҔ'%AJd!4,I7
    Sn`ҽA?Kmj4JR@\h<%,(	Z/P߶h-I,߽q#)#'84GRyz%GXWRHǺ.ǬǸ6_띂:+ށ_Go#G&O@@GW|ywKz0=O?z֭@לdļ5\]O{?z\=|ӅH>!|zpK`yt<"/dWu`mmp-9]Fjcwgy'E'/)w@7DvW$W{9̷|łE}W@g=9x�{g~Ҧ;_E@W5~G)|WB	kV*q׃'tWBg}Gyw9#6<t+a2G#|IT6u3ADA8sΰs�s?w8Gtfs�PBO7W$2~~	u_DvcWvpvivv)pwar:Ȳ8w7GwDxyH5};x{r9vcȳn"xz/zpzzsz{riPh{GV{[Xɇ|*XFG}'x|yG~g~v~yX|؇|@X$g}aјp>r8yMǍ2Jp @dچLցHiȂ'xﷂ}XO	|76)X6ꘃGT8,8B�5Ry*%s�K؄׏7U{=`]Ȃ_'@iaހᢆmCS(6art i	((}(h$?RU舆0SRhsR0@TU*Y@^ljU" �K`�q
    0�%q8rja~)Ii牞#�œK%Qe"B!O,	H@Y	p i*JT!rPU @QЛ̙/
    1JO=jv!ׅ�yՐⰟ)Ej,S+13@	{*9PGʥ
    
    W@
    V-d	B
    Z]Z<ٜ YYpٹt	Оp*J٣I
    	
    I<j2@	R
    l[z
    !:�&rʫ\J68:z<꣏
    :OP	Q
    
    S*
    ʭ{PcZfh-%�4`̉)*JZڜ	�!R�P( �P	CU˰
    +KzP﩯L"`�I')+K6,j�y
    �ʲ=?vADP�p :#	
    jAkWY9hXڙjGU #ѱ!;%[˶m++!Kj"p�麮 Юr涁!BNŴ7gQ{ۤ:˳˰tʯRJ�K} +KlPgkik+;.O0+46ˮ�K+1PGK۴$Aٛ"TKK]_a;кPhKk勲prtkjz{|~k[$8@K
    u!CO‰!
    ,LT\R*@)aT!YQ')+-/1LC!9!1*%avP
    $2lGI2N(]�y`|�	<�Ka,cC)=`1pvd{}<`	5b{<> D<LɕDZ$Y
    eZ^lɥLrS!<qʿr�!@`º,K5<7A<PM|OFU|`ŶŸLlހBq�koʾixllmо\ș(ȑ͓ĘL�ɠY|˹+]rʩ
    �˱ɛEOA-CԂr�|cń�)vcDY9DMUmWY[]
    Uwp(Z<
    ^-sMumWAv5Jvhʹ8M:�<>Lw؋؊E
    )"&:!a�jPNJ�ء-ڣMڥ5*B�Ij`0צۻjBv	UpG#�PM؆ؼܺ-KH!cֲ-6}9DMMFJ
    $O
    LQ=S-
    }`b
    d}fjgr N]Iׁ�މ]ߏM=$PbpӐ�٥i'ڪ}
    +M9N׾Eƍ]>:?-]%q؍Ѡ-2 x�IU{_tWA�g^|`W
     	#"�W	43ai.NAAwjNvApװ?-!~z��:駎	Kp=."yw
    S^W}0~ꈮW`~9j"N
    e!�)AN.nNikY9Ɯ�j nN�ΜUPcpn忀Z>fꯎ2ԝ*]Qn$r~畮y| [�pѐ
    sz@=�A }>IDNJ/^Gu`	HN
    'Ɠ@kSy*f_>	en	`
    `V+?a-N	@$N 
    �@$ Lj.5#@@zjc_?Ai}0*{/,o	f2 @`|
    ��O��@�ï0c'[6
    |x�T,B@QF=~RH%7RH/&]S$F`Cg0hFͅ;vARM+N<TTbʤ.:tlpl
    pBhU-TmTɒ[!%A!¿(xEIu?vr#Kȕ+	 RO>\gСE6\YFʩZ};c5A,Y4d˨rDBM'aխ_=Tg	ʑx͟G^=3X>3g,WȰ!`У>D0AdAA	'B/|
    Z`D )BWV3Eg4DZH(,<2H|H%$r FMR0>@qI/\%1<	@1N-K<1E3;Yq@=jA&sH3Qsp:.Lߡ1#rhȡ&UUWeUݡTPU[ou,F!,ZrY&1h&h2RpZk6j	 VBU[q%TI<"@瑟RHX&]5	S_\oVF8UcIX+0SOA@TRME5a%odj&x!h@Xp.U^},Lka
    �V}&gqF2$tz7_1h[RnO	u
    J=km&`ͅW{왆c2a+4E:(k4r/ǼrQ&?t]o
    %6c%{G0cn(to=wwZ
    vw'xhؕg5R0b7|~xU	='6,DƘbFo @>|vz8Vq(F1fV3jx`ə7A
    \WAO(Ҝe(A	G5a/~^)xJ+[BFcA=?
    y){Yh
    p{Xⴈ~@
    l=AcոF68]84" a@,lfA(P�:^1ְHF6ґГ8Z!d&//-UG'U@^fL!!14PC%ge.uP!?^a@F3ҙ3*Lj.
    RU &#*xTc5չNFQ%.9OjJ``"B3e
    Uꠕd;IKZ@X"�c(C0Fce,\C!O[:C"dRhyƢ\ش8|+,0GJ\TVr"HV5qU:GNԘNՁnՒΰO^>kZ9Q51pӐUX5acyl#U;hD
    $`(
    rLTm'\{VЖg4fFYuV;2k5,E݀C�?D72AjޢqmnQ</E@L1Sv׻a~׼Eozջ^V7;_׾ůz׿p^
    Fp+*0G~	SawX|CP^3{bXPIbؼ)^ucʘ:1<d-XA&rcYOx, �Pr}�ȗY3aF8o~@f%3|g"g泐}@:78lhF?xĄ	="ZєƴI)g4y?&uGM2W2|jZϗC2kjXCֻy|j8Ǿΰsmldcu<DWYCLWܞtCnrwn.7tnw~�9|cTֆ
    ekCo;^yovg\6qJ\$!rӚoy_s4OPAle+кx+3[69>i00_z먟L<\~ze8].z.�krvkf;uF
    _B}Wffi$zF'W'̗ε}K>S}sT+|i<1>Ÿ_LZ-f=_Oz'>R~wocŝq}ohz:μg+?4+_/ƷG]w~[x߾YΜ-{~+_?@;?s<#{?mx6?Hœzm@
    ,@�:�9Sq@L0F2o;55T[>d<[5|>̯EC%dr)į*T=,La?B106B3dY/'Sb:k"$҆UKC߻7X?,D�ۼ.LDZDDǃ/
    k{FDcsLK5ODb#QL3ES
    ;d:ETD/C\Z[EF=\cbõ9<4`,%ۆ{bFF8CF
    BsF:k$<WBoԣoTGvL/q>yLExKsGÓG1iGRi26Wą<>
    GzAK67FraH<2*9	\3\G{33cH;/{I{̳Iɓ켘-,,FSBlܰI
    5kJxJFL<4ʇsVcIԔg˵^JL6FTbC˖6C7lwK3KԢuK6K#+밸z88SGT9L밹oșK|Ѵ=x[IL
    M,;EN+7+ÄL*:̾Nݴ{˱|;;TλŔT=ż;H#k3K&TM3bDüͻ@ԻJT=LDOkIϪ=݋2,kiLeQcJ:d3ͻcG
    OЁ<[D?
    ѝLD?4@\uϵ{Q7N@I
    QM@!PMT"<AI$D7<d0t+/zATN"M@,SpL7Bs#1I/P4>=YDnз1(O-ECODIF<GEs1ӹR:+� 2BK1b/$Ь4-DSmmCW%PKU]9=l<5>+CC2;uƹMA47L|Dً-d0|{475[$T23LTVtDŠMUl֨W4=u-WrŕN/*ԫknTNUN4%6VE^T`ŒΉJU=;c/PmC^H4P%6APչ/CF̓Y{Go˟ٞY9;t6$RUo
    \ز{{nH!{;Q|Z4:!4"{HTzXۺۻۼ۹
    ll`\��{8l�Ȇ�[\�D`QX1PX<L�8),g%m6 MWClY;D+RM=�Z#"$Lȱ=dStȿ^^[]Tqe[fp0͆͆ɵ2Zɵ�_e`v[؁th
    mՅh</!@�@e0QE1&]<T,cġ/5fnWQHI\b3TY[4ʇUh-Wp](XgxhbthI
    3ƒ2Tcy#]4f-FٙO1BRByс�2a./0=mQc?#O>9s^d/8x?߅H JI-;=˞b;eH#踇:R#8Ϊ\¥GGf-F�yh+zJi1mpà>n?@&ZSG]�WKz<5>4bS6K̻^,s[9UM/ƢЩߟkѳSc(jg؇4lT`VTUh0i{iwvaii1=ʇ{J�C1I?@?.Yh(v�]0B>\9
    LxG}?5DE7AmՔ_˱V;FM>дerKh̵LˌE˞:T³Ti"֖eHi؁vlEU)9iY贂r,L&rv`t@H]@cd5l=FWkxyj<Pm;Em247zĎX?ƯƽVKLl4"\FN*,bgpj3Zov^-.,Bi! !0Ёhg`vȃơ]3^a#ncAp3D0 cAM	2tELܴ.DeV̷ȤQLy<ﺊTN�"3Vo\BeN-`eN,/Ng^@ځ
    Ѓ'0#
    }ȃv
    ;NZ+X;ʘ� M=5MA5{^]K۴8Mbi,M՜Ylc1S8UgVwWXYZ[X[
     s2�YVϸqٜF]]XodtCY%k:x.aC]^EI/Ŝj(1:-]Wi=lߴk˻wii@.`wx�		`0`vo*	@	ИQ;ZJ T؀]2#S#؂-uQSCX+SأoQ军@G'/
    l:4Xm
    U+2CGXz2}N"l;ۍtkK{hYh
    �H<+@o@
    `T d�i@2�6]hCMQH*m0@C%4gt$֭54=^t|zA7�8
    |#tڜ>"4oԇQ`ŭOP<{n0~!}~HbQ,}7V<~|{8{(9?`
    �>Е2˜�9ފ*B("DmX1�&M̸1$b0e:0]:t@RfSt�0Z0ₛ.<%%{>YS&+zWn!8vijݲ+w.ݺvͫwDnjw0†#NLƿC,yr]RάYۍ7=5N;wo4\-{6ڶoέ{7޾s+vZB\
    وЈѴ6i*0GյJ
    p
    @Flq(R.<fEt)Sj~#Ɗ�H`1SJW-@7
    J1yd^�MG%96n}''F!/ȗ6~%^7?3^f?8C%Y^4V tSRYWb[r٥_^Y=@3
    H &ALD2rH%@Ch`#aYX`_S74NGQRNCR@/;7U�l6~ EKjSdnhBd}&E-,iv4Lۮ[7hPb@N6`
    �j�* " ad4064bXQdgI~D?rtI8XT/QQ
    C(#e6Xx%_P+cO|DIM!}IAӚ4ˠӑQr"$_ֵ]clgv;lFcr.5ݷ^##AA
    :$$B ȡX�E#H`{;ROXGXOF¢^{M{uvWTx9[E=#g7P؁o!Gb߾TC;>+Voll9!�aCg& +h	L';0"!	?
    w�'`Ur �= 	#9Xv@Q6da%C6Q2�J MhMmWܢdhr?.Q/^@=2._DcX&Z` ��+�*z#=FPFpC"2\$#HD$7)�s`�
    $pd$H#1XB6lb(A5(BCTD�2xLbGLf*
    
    xshA�X3'9)N+X\';w3LYN
    h@
    j` !�4{؃Np-0Ȥ$$
    rXhiEAm^F;UΣD&̕hԴ9hr)O{ӟG'z5J]*SԧB5j':a'>1~8?
    PJPBfP@cp9(@PFaz-ljvPE,bCs
    !4UA`0g;ς6,* 
    iV]-k[6u-j9[Z!DZ
    |^jp!	V@8;ANC@]vV#
    x(^	k$/ucY.a	X/�; 0l]ۀC80+la/pӄ4A'8A;!|�/ @PaO�
    ֥�vK%',"E^xLX�|2d+Y\pG9У l39`6$Y>Zg#,�
    pQ k�8*q�Gx�8�D5A'k*#u:nQ򔣩ki+gy	ސΐI5;
    +|3{_;rl>$\笆:ߙ	@bp1T5!0Gl:@4 I[җndrBwk]vwD0Dpzž}x� u8n#<
    _8C<F5aL/|q
    dB
    �P:�5
    E:2;3ѐs-ܽIs^	F~	}�īnc=Z)ṋ
    �ٓ(r;(W9]4ׁncG?;JG~/?i簆5@=\t`<;σ>=Koӣ>;CS
    RA
    o\pr.�Pp=M8xĄ${> PHZ'"jJ}&??oֻ;�3&ڛ!	ɞ�9_
    ZO1LaTh`D<V]S~�
    ԑC`Ci0D <I=@%QAF$A aʳ3qEQX!`!IEL_mU	 `
    a
    iU9VabIAH(4"<e_ELӑ^A�P^~>hGEbb|QCvETCC4)"޿i�J+!I)El0*G# C(#ޝ` mC!u'.A("/-ca"id=h7Q�-C,b.-C.37>&ch3d#G	8De):097|	\'H?CLR8<I:Ck9@C?d	$8IJ$4LI*9;HRIRR%K$L"LTR6SCOn%U:JZ%QVjeRv%NN"�&.8
    ȁ\ZC5Ɛ>FdDO|f
    X�db"bNY#8^SBPC@ݑ>m@p-HDCNrJ:.Ѥ;C=i@8P7Lu!%%fP=0i&klm?nkfpgVgTdrf5s&�t*gp'5':vgwmb'tgor'uZ'z"@9|8	^e'&5c4&NN@(eH(J`S5v[BNb6q7@%x\4|Ct\@
    C>X2�;X\hv-�
    th5_8@-@Phh(;i;ii6$ZAbE)Liڨ=਎ޑv))*i>0i88)J)")Ʃ)֩iBiF\
    W&=BCKLcFtBޛj
    x!(MUBN@2T�EC>hX;,CiQWYC!T6S녀6)h@Al\e+;(+:貲ôV뵞v+~k"^k6덱k+Z++v6k.>kJ+rkk8EF	^t["ePH˂u͖_g89)MVe]VfPH-!Bނ(�-Bn]@•Bn!B2Pt)D4m.ĨFZ-j-׶ׂ
    -ٚ-&ڲӾmBA^A~mؖ-mڮmnm:.J.fnm-+ځ)B.�A
    �lI9CEd&a,/?]V`5Ƽ~%$$ Bz�-HTUU	-؅X(@d?DtBؕdooo�pF^�{o/Jo'/�0kp6p	C0
    p_gps{0+p&ف$%7�4!:6"H]ī4"Jy'A֞	؀
    4>&`A,~D82C;8Cq%Ǣ11" Sd!G"3!?
    D$[_r&Wrz2!2"r#)k*KQ4`r4q+o 2-/-C2"2'33/"@A8C�#eG72<Kz"s9ڔۜ*ci ڬZ&um$h@�4&Ǣ82Eq@r: `B#GCK'C7BDA3F384DKt%W'g.t@w4JtHrDO4E[Ft4MtBtC3EHӴI'́5c6788;f
    0%]5VÏO;#Lv5ۿidR@B+i%Ll_seW=5ZC*S<d`-C6,@6X
    k!KW;=PkD	,:C8h66\v6h<v;a#5`C__C`+nŅ-4)ʅ
    @e<|7b8%naQwwEbYcԥ3L;[\"Q*nuiow
    6R@n}>Ho=H66@6ЂdB5h=	;
    a頦[YCQAkCp}8~׸cͶ78OC74`AeUB%H7CC7C7/PO7˖g293A\y\	[q]8aƜO03#+<B�?L04C7q=0+
    ;;#3ٹM_񨏺C`]A~bd�5TWyvCFQ"P$IT:]K*fU5U!ث99z#:ܓiP9j�/ɝ	0,NaS:#h:\{f\�$@,":TÎ@m#�vKc
    ;_#Ct!)dfC3d.`NC.)T(Vm|hӷK�jhr`{�Cήm@C!035ä<=K	=o}=Q}ۣbҟFvA9@$@-�+38@!ZkwXyJ
    {Y>}E9hй ?X4i}�}]}=]kѧBu=˄_Q4J9DU@* Iľ3Dӟk}ǽӽʅi>4t*�>(A"$@9r=>>V(@`n&TaC!F8bE1ft`�59dI'#XeK/_fM
    -g7D9}fm|�A0P Z45j`СSnٲƕ;7;vS䱷^ީv˞M+nPN|�n:y :
    hQ�v>D`T:O<J7
    @޴�hnL]y]`ֲEwxkF$@w~=aɞ3gRMJP7I?m?P?�	LOiH)ԯZ42&*CTd9R1QEBkŵ: (�-e؁e$cGR+�R<L1Z2�쩃"ǹ)Fn,.GYBSMؤp\&$8CCd/+`I)iJ1Ԥ	G	5
    Uԇ8%QQ5WM	AXi(@`si*x�ai-c&R
    +C/!ƣ	Aȧٶn\nkeHW}Tl.x]5{cUN
    aVa5]{]`EcbegmGZ
    ԝY\VYmyr	wKeqFoexns3zZr@iꏮ:�9&բAAW^}6Qb!ة;Qѧr:�Ѧh/UR4d/GamB8BA݄N:_a/:tKq0O>B8`q&{F pmӳ&tŸB覾K.ZrBjS#ԍ_C>:�cr/9H 6(H
    4&7lT�G9J0X0nt'`PH8Si
    O^*t,)8xSNě�^PIr3]1>lD/y4Ah=Nc*$<PVLhB[\5/OpeڢыfKպ`ŀ*ȱAҊl	"iI+b$J&hyqyssFWPJUvete+PWR(;Lŏ 3q.]u/0;wǀl$jX4O>` .Y0k-'am14(I`gD,])KxgjO-J/'+VvΗX/UP!t
    HPAC+iQ iIB9JJZ*0|c}«8O=I
    h%BNkuu@
    PART2\jCXwj"	p
    HEWnР=bN @pTúveZQkh^W;!r_Y<Jċ`9�xVY0Y͖e*؇Cj%ܶtjZ>?UR*_3m
    Q(\.KQWH{[w]LՎ țrWu"KآaaTA2q
    *`WPiTHy]bֹ%	z[aVW	?i	2>V&/Π�t5񍻰=l8	06'$PLQ8$9UFy-e@aXC%̱_\SYR+)@3v@pLsE..+
    Aj	M	|6Wy
    Eb�;d"*ci38c0
    P-l$ZUX$ıvnfkaU�^g$3k@�B�@v!clʒ^itݨ@1#OB[ٷ>DjCOZuak'kwI
    	םa$Su#$c Ex^w*@a
     @AJ)Ph�kC#vj{e1}w݂ϓIni#t"k-S[lF%eD{Tlq_s$
    jBF/@bg�D�LB(/lp vKߨ7
    pR9Б9CKV.B<[eIJ:yN1;7±5EKPRAO[ɇOt|!ށC!
     
    Ob?M;|ϱtT>
    v|9i\Eh:ETiVŸhSew ݎS�e (ZB"'rb@&xKJ0#Nʺl
    $E l` ,
    aVXa*A,BZڏ,/0]V"0|zB
    I¬Z )]XBp#\nBz&:ܥa
    fER!dipp\T
    o_)| L
    @@�j�X�A 	uX&+O^gth
    q%s:nQ]<bke}F10G1'q2qveڥ\X@D~M[]amB&#/QzO&
     
    c~
    	av<=  `OwoXi8Ѕjf~\qq
    ]6 6'^-]f}F|u\"gCeg§_v $Ah){r""2'5j'ɘ�P&XE&A>�R 		//$d%ZSg(gKA^P NE#%#fgysrK#hhQ1ZF}2>VĊr}q2[-f+2!f)j,b/l4@젍!`Q.A.mU!E ]]?�	J/	B^~<2WB\#I[~bs�vF1wwQn2_-S#f>n {23 tDH4a/ʡN'1v!R3lZ2�2%J'@\LS�Gn\
    sem%0f1m4h&�A wƶi>q@IBlt+lƣ<4b,�!,X!L@YB+/C"mB ~ssjs4'6q;!.qi4dt2{#2h>@.(~t'(`\HSew3u't<u?xdTKJ؁"Ā aR b*kNW77k>ppP>EBPСUuAz
    Vmm>hJ!^	fU%-5B Jh@F(A:`@:&	!xbfjRYŇRZЈPfMes"*VT~FjR?h@݈_+ii6fE{h6I @>�c`*` ֊Y{sd!'=oiE[Zd Ň^�$>	
    ZEPHIgFqlTv>	j/0!4׻0ir?,bKuXЀA``wƀv VN\SN'qp˧`[쨟ekB`$� IGb_nrSHTo{U$31(ssIeB|b{5IxIHM
    ` Bd7v?ZAOq	ySw�ӈ8XR -%Swlw֍R,a@Bj(@0j>
    "(*T6ZҪ`k!PrrXlo!> v8 !*�*��,||A66*`жFn_h|zψt8?#pZaM{IJQ=:"F@H-XBYү,6t*b=2kʃ<a
    "e*Ҩ8a*Zi*<ҨOh%6@E#y9yZ$y#JC~!A6! /لh�wJ`ok(ay �&`	>@ Xv	N}LN@\W!L͋/`
    @6sfELj]_�iHD9DX99k3B"/J@=ш9(m@
    a5#bXn^}9;h; x7<d̘e,z;{	Qb!;%{)A#-A6 Y 	U'xX @�@oΠ6�Q	̴4�KaIb)ڡt{k6)	Sn _g0emk"[?BR!ٗ&EY{9.e	@Z4.+&,.X	–7`*!XXQJ]a<WPSQ*7V`K.b1{ȉȍȑ<ɕ|{dE<ʥ|ʩʭu!`jʋ=F zF49Y|<pa
    HT@z @~!6!v+@qT7@!Z" YBtʩ%\&uu|
    "f#�h2]|(S4xH["cu⿳!-K ؁ڦA-J=삚׃7FZ?#W"=ӯÿOơoYu
    bJY>~	
    ޻^V!>%~)>޻9bX^al |<uK<lP@�
    � 4u``l1֪Ot!,t`R#5^O'ξsT֭Lb^9uDG؂ے/3O悺z",lBqjPeE	@
    s@r-+9A C?rAMQ?UY]a?Seq?uy?ٌ{8B[W#@Y`X
    T!̡4`s@a6'/?f/ȣO:p `i/B$&06mAdm~T(A)!A*�"sɳAjԜ	u64€a#5a
    RH_2l鳫ׯ`ÊKY*��Cܸ&w/]�J]N�P1x\#KL92Bo.1"ӨS^ͺװcBvKͻM\7SK`(;mذ4Blj֐pvOHtҡXDTHP?5h #De?,>%ރF(x܄G=U�
    ݈IQHx'QC%C̨M�x"
    9�8~S%&418	 ;P9TOEUEΖ0BI4dT,9k�p�\p@p:A'
    p5{�p\	�{0�*ꡤ
    gr
    睰ƚ@&Q;A9c8TUk&6h #s4Lvv;PFe;E�tH	D�u	UsfKVB	5�Ox4\8dp9bHQCH6
    5HMIm7w
    0Hɠl1POL=Md,PJ0rP�!2NMI5":x#G<hsC9s7=7$>8M#!yPJ�"YI
    B"/p}V�,A]uޙ7
    x	xZ#
    I�`N|l
    Zh!np马z+6@#q: ԰JkT70�=v'4<4VXDF F+wTs,8WREeTEa7OY[R8a,xү0:IJ
    ~(L<Z�6
    m!I 7nda_5{441#!l@g?ml~]VXA:@t*PAԡlW88@<@KP1JdB	` �09<rSd�
    \B
     Lȁ=9P(\PnB:@ 	:׹ \WB(S-W A,'ux! CD&P05P6`ü1j,yЌ4IjZ̦ؐ�bSҦ8Ir|hr1?Ub1e
    }8X5⧇z֏�?l* 9H@zZOĤ
    
    F#HNCk7
    QС2
    !#݄
    1N5Tj5>`u#{! ~D@GabQhhh p8a
    p(�6�/XCR(�p9a�!*%r
    ԑ	o+ z0@	Ux@zdB�r8Tp
    Aǧ[(Cف�Ȁ lA 5n;laW/?uCPo
    LKa&wz:�NY!Mz;^1'(i,>
    vWOY8_!p?4A5тD#:q`g1Eqo@/%|JU4qwDzzqDMBӅI.R AUAD:e+T8.42GI_Š	i(*u̡%JD�!(G
    "4
    3BP\!A5P̀ u
    HuAр4@�k};5P9:(N6
    P	zXF*QJMrN}nˠ=vηw[vU4
    ~`C.
    h@kC4G"!_p/@ʃa	WDa0?OZBŞ@$$8GՎ	!"QnfdF!A>*8Q(IRхb<iB"4<
    |]64%yU037r(Ԙ'gpB>�@ЇAHB"`B7aP20D3�ᓠ2(R`,<A+X�B>>ٻA0sP݇h[ �
    (vZA@약lf_n�8Q	l�C_=oHO݅H^l 
    pqw'bSV/0p`W�UPrpwaP&vSV"(X?!%#9
    N#UTts0�-LCݐcFX6)R(@\!@Eܐ@q!`S ˠ;pc0~p`@S%PC*6
    EdtZI	Ip2P�E`#P".`np0�o`(R�&+H.p" 
     0rrU
    @`p
    3 @?P7/Jh. .��VI�PQA@ 
    P<�C(ppq`	�BQ=Sn'oԐ
    n긎8W/!/
    X�K]
    Rb(�8H`쀁PfѰ0Ё Q'5:fsqfR$&CT/
    8t
    A$84c"bost"'R1P<Gj w�	pc06exӐI5Ǒw@K[P3J5np
    .�p(o�)%bF["rp	3"m<W03r3"3Pi(2I3R	0#0X"R@(R"Ћ(	Q"�R��(Ҍ``X	
    qpe	+j
    Ȏ	x1�s19Ĺo
    
    @Ib`H"/sC_Epr`k0UQ�MUbQMdYA&@"B&\!T1
    7:!Cb„1B1!gERRT>b@*џ*/<j�;0q0(lpOA1)`g@P%	<P"ApM�X@
    po٤pPP�,pX8\�0h`�N mk` czG�fФPzp��0|@�	֨z	'W'0C@?p5:4U^2rp#!!0,paO5jV2J	I`);2aF!JsR!c9.b#sy�
    "903*-:
    &�X'p):0@	.*0jڮQz%3+P"	;z	sJdФ�ا7P9&Wc0cIsk`r0(7`fp 5dfpq{3CLڧ"਎\}0
    
    E^Hae0NE20
    FjZ,k[@P0xk9P۸;[{۹P@{{wиqPq0+g9 [}k@���3%P"�Q�|P`&HJ<&Hx	XP#hp`Hp0ȇ|<sz�
    �`0 W'�*pj%c)LF0saB1aVVNR>qӫ@	
    �'JLNPR<T\V|XZMmLpad\f|h\{lm{;02�+0
    @ͫ<L>h")8P�
    %%r
    tP"
    �%kQP���{(W)	~ՙ0�y	�/Ф�?�,aZ�߫H+\�@p7$	|5Wp
    u@p'pAb*#|{/0Ppۙ)$,7qT
    vp=]}
    }_=qOe
    (=`	Ppn2T�	cUHQa77�*�{"dF3("p%r3BW�	3
    w(r�3"�30#%�	&(vLY)o m}�k	+H5݁^2U]&3c!m!,@`c/>@F�pvѨڪڬ�epaڴ]۶- "M&۾H}Hps2 W`	
    @
    @�BpG�` ?Tph<>ԑ(<y?pJQdp	EDa pkp
    8�#	դ$I˸Y�P`x%GUPW{�jkp}+s5>!FB2\|	`=
    �m2R>T^V~XZ\^n�A_^f~hV>@A6@Pac`
    S�&ԠN>Ki[VH/90q�P�)nppsK0(YH
    �
    p�@gg� x
    `l�h 
    0W`j'9A@˕r~➄hp�x
    ` 	;`@>/2$4Z呝C!uS0}^z
    0=_,+Р?@y-;0!�@LNG��dهdf0��	PZBs`st{֢P.Y|*ߔv	^�l
    x8NPkF/J@@3'&i�qHp0H`;@0@a1EA)�Ôm٘j!j0	7?_oSa?ď7<@dN^#fl
    kmz�p
    f6&�
    A@8pgo)t^0mЀ
    8pЈX
    �A�:*PdXW
    y BFsT,$ܡ2	 H�A:
    r+^R^2
    >s.i!D dPb	kaԩ+RD?A+4htZUYnWaj/DU}bծe[i%wn]`mZhΜU6m]ĉn@cȑ%=Q
    ֬iY=#]iԩUfkرeϦ]6jl;Zoݭ:J
    3``	;lriQN
    n[5j
    Wf{OrE2K8Gbՙs&ިH A�)(
    (k8C+$7`@3bQsh
    uQ'a:"%
    EE8XJIbK0sm
    L4'ӧƜ/03,M<nZ <4 3kz|�A0"tRJ+RL3tSN;SPC/�$huUV[uUQCȱ5ҡ1Xd9裏,lhaPjk!*0iP\rp5s)\uU[T,Wo0m+0p5]NWu%\pA
    +z,<X>̉3γ1@|3+8	ଓ[CoLTFVsyg{thNg6:Vhf[qfW^j`-dmdâe68.&8{nn�лm滋1ذ>p^{.>qo>
    &&a8lr QIt#Kt7%39I%cyL@s]2A:TC]0wy裗~z꫷z~{�c{7|u}7l.*8gEL3"}N	Zg8ڇ�DP4L8QrXЂ�4@C@W rLhBn,,TQ�bj71r,(=J42g鈉abxŮO�SAOc$cxFB0Q#F8{_1?S@3�
    i!І3@3`5hBhA*rP!hIN00!
    {
    ZGy!|xH֝,Y'^dOp˰lM)"2q YZj(g@Ef7MpS$g9yNtS2BwSg=NR4:S/Ct$9
    =iL#t;p#?0JhGv`=QH+
    eRy _C')GAzSӨG	Sf:PCOĹ4ӨG˄8[W'6UՐД�iFac%kYzVzӝLk[Vv3V'@jv}HhJC("�2#9ACT
    ,4f ;֣͡gөS޴CkKi5*lڶeY*hf,HK/z\#@-h!�
    zs]fWnw]W%oy{^v;@5Z^W/zi4*9,H?ˠ`YbT5GYaF< VhG(gX|!dצh?n&]e!Sqa`we�; Wp),!?.7B8Q3"ɹS.8DwեF}e0Yc{kfs{_e8^ўcʾ#aw@Vlׂ<:[b
    >mcAG{Ex4USIϸ}저^>tʲޕcS�At�lesenv}m󶠽;8/	zpoMno;63r9܄rwVoˆ[7jzfN{nnd?@רfFa|+g9}&F:Zâa�[J0:JZke'=+FGҭ@a2J]Id^6qeF{-'{._5[Vs	p$ܽo7[mD{򨆺[�7nu/0;? nF[F6E�.l��>l(Wm\49νs@НAt]k}N|aFqus5W__'sBN@ئ;Bx~a3g&~nz*&@�H#?h8w
    4p�h@m@w?!wX+?;???e4`?�!EC`\ȀjRE�A#? ±[A頊sҕR55/@�웲(@>Ǡߢ*'+m%+A>>lB;C<'K@tZ�ФmZ@dL:
    ,?m"A\@r$DL@C�x[{?FDF<Exj�L?L�ğDA8APAdԁ<Fb8(Bh8:SB`Bsri`</+D�
    g]q"0	7%A)GA".2Q#|G}GGy�@gPGDG g镈(tH\ˆȇD�$ɉI< nЅH	IgpȒLɇIIt),xz�a31gtJI"!HGJ16xt镓끟�[
    4�h#v`(KxЇ2ǻ&`>ߚ&+1q63Gz#Lɜ	ȉ4H<�p̙d:뒍:ȉTHF@)ȃ,HDHP�d֜)M,$HtH,Iăl@aH̀,΢<tLJ{KK!B2Kr@K+PKU$e`�U̥HL	m`KG#2($J
    -E>g8MQ]Oi?@Ry�y|@GzrUI?r@Q  /2�HR*�(q�&hl@'R1]*
    /h&#H,Ũ}5ciH	�	p�J[`(8pAа @TL}"܀ozt(&[!O >hЕ4�x
    ]	ѥb:M{$CCbL]MTe]VfrPG1=yx(M,(T)SQ(V(:h5
    �*USR1V1 ]�6
    �2eh((,{e ~TR+yRnE.�`�p؊U|rx?WK1IHEF}TEpTtfYMO
    Uo(p8:Ti`U5rOYZ-^*Ū
    L	ʸDϨ -[=[M5[{�
    5{[d�8ņ04�5\m5�h[{�\\#Ӏ-�0M)
    :Ѐ: ŵuUܻeX][\K)U
    \M)M
    CCZ.�8suI؀
    h 
     :^^ڨ�6@LC{hEZ4S
    b)11]Lp51I HhZ\bv_=_3o>	Z̐PIj1``
    ```a
    ;`5Ԇ
    ԆʍȶȺUܾ\aL݈taˍ
    }f˥H`+F\}](n =0EZ$CK'8��C	^<!#a@dAdB
    `h<#X$f)C5Zbӱ^Q#?/eP&&cSأJI>c(F`f`FC:+'@B$Pr)`f4@|n?wb�fVnY%pf'q&n��fjfZѤffnz�<`fc&fxfVfj{椡gMZp6f<fn@Ni�N��'H=P�jFhani;,v`tzдs"Z	/Ҁi_0�XT[tYm8Хv`:VNWP[u]
    ])nk~kkkkzgzgPbLBe$@fnggMjnifx
    
    /Ji&lVMOgǾ�Dh>;83߆A�nc�Nn^nn	T BH@%&<8عr+P!hFU{X�tFr'G
    3$L`:N	9(s	7�`ppSn/PRI('+WM(|/}@m5nR�0
    qLQIQIyVr>Uנ_HQ*TnKVL2!v�vI@Nl-p7WD¨~$BU#,(l60�,Q؁^?ȡ�G"7p9ܱ>9tHGe6u=AFtXp\>*@N7ouWGQquJ19[%V';1n'vI
    6}
    WU/(2vRvaӎQPR"V!Wt_WK:3QDcsDVn`nxu7;J:Mɂ
    !Z0H
    Äo@]lP>
    
    yppVp-?R6yHs9$ɄJA8iyzz/z?zOz_zoz76?z{zzzGzz{{{_w'{כI_�601Nz||?!x1h?QzwxO=`=x=h6`R1vy^"CG{�G.ৌ
    _-�	_~~~~/?nGonqTҤ	 „4!
    'Fl81jĸ
    (uH.Ҍ1x+Ν[P	=%Ϝ)'РB-j(ңCiU‘,tXPD)٭;#ƹuZD+.Ͽrҭk.޼z/:MĊ3n,X۝֭lغM͙jզMlm]�5زg;Qa
    Ν[$^<�98m8]I~Z9nrڷǮpB\4jМ4Slغ_r@fN.Q(PXgacwx]0b:X`8'eiƙyVڃ-O�!t8"o':ő"#d1x^}W8w7`W
    ~!GrD_#]%(%}HlfYgiHZ8c\yg`&[ohx
    *jiܠBg?e(}4Did5aRHs~d@'<qSVɟ�%7ڬϡyag!Zcb+b8jsJ{bͣ:]^~ydVXa
    @f2&"#گlf8,ƵMp⟁B|1jY+\z%{M1`\BA|Z/;2м>A?q\V0n"1uk4'.Ru^sN͵	%[}QC$;=ЂbLBjJ6
    xt^to&pd ֋huk-9܄(ņdw';_Ԡu#z':{˷~! rsek6-PkKG9Y;OuvV6}_kF	b(NTXW+FMu_Z `d6.15= 8ǚa:Wb{LA|
    1 
    SFQx2 .f-2tQ#R
    ȜPl#_FHp*kRךxƼW>4j4G\06rsD|m
    h6;a6 %1~?$Ú=b/{dOS8q ;;JO
    A8JyO5cc
    y%l=yJLvd!.ct,%s.,)3JRaq6̽2ۼojVt&9K3k#9,2fuNEFv6Y5fC vĹϼt3dʇ&�@)ub\<IO*}ßFQɤtc#wЋA{ b`Jiވ{ Oe4s(/)Ҡ8Ԓf4jrl
    ԧC%HYsXKC%x]bp5Q"|Y4ԨB`U-#\紕m*ӧu,;[k*`O,b"3h@%6YpYEj]Sr4*:"sq[qZPcŞ-j؅oPfv-B4q\ךZxmlgKI䌈LW1ˊ4uwP<$99Hހ@fUksb
    fTڗ>@	_-rb&O_W5<I2Kf®l/<cfƎ˜Lƀ!q|6@&21�,g9�8
    ,ުbƱ0>.ËaY1URJ噹"Y^2	L!_sS
    F07[X<%+-JytbjtÅ(
    E85$3LѶld6Hgմ_8g!ڪجoWY-Uqm-[x6m RtEݼ2luӬ==|ҙ~δRٷƘjCߵ!Ho	kr8oDhBG3y[]dO?+YޏEAhQ
    S2PK $`ᄃ,?͙ztH.(s�L:m{kN.=kr�*`۟ \@U(Ge:ꦛi_Iu
    "5ٱʄ\L"V�s߁0%o\[
    z'[&|4?tiiڰhA:QDT3E:ґ/iS|QՇ﬇>LƠ+ϭp�jOqт1F}Z/ؗZ_\ޒ\o]L<4L:2ȟ1%}Q^�~\iX)
    0:,;
    dC6``t9XI]Gٛw
    ^�:O ^Ņ=aPi!_ӱ`P`^�T]Vt@.�gu!  "!hT"͍#h"V%%!&>b%B"&V&*"$$b%"* h3F͠db62qx/΅& Aaٝ2j!!4!:"7v!6"(J$$,"hhb#b5c)8)"_c;�"c)P7+b"Т-fCh?/E0*Q3ΜހҺ'M(ŞHtE]ݡnW.0+"z$NN$OO$!P
    ʠGQzRB�N*!ܤP22GT"ReT2%4BT*DeT�R�ASreQ$[%N
    "zڠ%4|IXu1BLdh*
    X-	I3%M-׍KڅK�L
    L$qؤ[~&hʼ<@�QBRnRWQ
    %dVRWvnW6%l%9&lqbJ\.\VC]]^lPF=d yuy	~xΈx&Seօ$@lpA$[X$~~'Z$8#8C�#03 �(qP�hekY:8(4(q4h
    3BB:# @=8(h<Vg?4܃(
    yg]l'`a(mYF5_2ޘΈћjʹ'|g<Ч}>V
    (0B1Änh� >(#i�)#Vhi`鄖bn6*~:C�bg䃏69iLALM
    PW	\ޕVam|eѧ^€xx++&b8C�DxDC<�hdC�DbB�G4pk6hdgk�g`C\*&R~@|*NѫbiY	i:Uaiժ!*&�
    Av+,*k9Űbzk�䫾l
    %J-Φ+kbg4N+,,
    ,537�:EQb,0`2 K*O\L)~BSFMa*ǧ1�06>.FNfP@�hh=`�h@=.66�-hL6n\�n~nn.Prb/>#ue	
    iB4@8PC*"hȅ>lƇD
    Ibhc/WJ
    hbEٿmP]ד{/UJaix.Ҥ\�؁f4?0GO0k=tn:boPnPjbzPb46h
    nb>nn�6P�Vp/$.z(tgd\!PÇb' f|?h\|/ŬWL46 Fa ]vmÈUAn]؁݂Fz҅T~ѧtF�q>rhB'4;
    %?(t!PC%C7tC%{2^;�({2Z*
    !t;@e'r'ژeW+%$gMA;H\	lI'vm�L(0$h|ȧfZo]<'qjr71c1۶-UπX;P3
    \72"W@}^4B'B/4C7Bw%,A2t'{2.eWSV2f&g4DMur%;eZISC4Lt;04
    A@'03S͛!x>X3Ǝz6F1qOߒj0*5M)=3F±˔= \ŞIѡ-�[)wl>PI40,3g`,& l[4k4l>6N+xA9LzFb/bl*`ct0$ V\ 46;ЀdC6y<.+S7&^]L&qdtq5VXgk(7\]:uwq>.^	nx^~'
    ̓JjϷ欰~f
    7xe(&̬nv",NhG:x4T+}۬gHlEIg;a`b\w֌hR6Dqx/w;AeZE%7?˅< 399y�0	9yù99ӹl999/:9|6wAV`6t'nU 폭dxNסlC7	FŚ*mՒޯCMy\T\d9|THERLQDLHAHHBt;[Ed;QX4HVTt{O.OP$щfG'7pN,"ǰ#Ʊ$\kZm\Ĝ˘/<e7Qa`:ЙKM5|{|%(��	
    ă�(P:P/,;l=LA�LC=H}rԓ=X4Bԓ(O=O#w=iL}�;D=#d}7L},}<<Sڐ:N;C gŮܺ2&`]]>[>žԍf</E2<\~~=Nwm۽OC�Ck=g:=}
    %5̺PrY4@Pr};OAPA�BޓߓS-�g$OCE?	4xaB*!Ё�
    )VxcF-NO߿I4yeJmeL3iRdM;ypB\4jаً͙3hЪUX\ҤA�A@aZ.ݦMVgZk)2`CG0`H1dHi\nZR%F4Zo#7if͛9ka/@4njh
    umbh<
    YWqZ�y(F]
    4h
    N#ݶhaJS{{t;ۏ;eŇgYM-b6G6-`(
    	|iIB-Eb1)O)**+",<.`$8?v:V&0SL2,v`tRL5	4n.5-b7:O+ӳ�~n̪.;丳»G=gt=܃/N>Dɱm""%RUS	:uXe-i	p\1lzX@(*>ūڪ	ۚRHvÎ:1f5҃%^9cP,HTv
    vFp&paC�8p�G@H3a!FB~Y28lh0/vډˊс*+nocE͖V`•3ZWUB['%mؤ4}j٩rhekޛm~mI&Bx孄^{7~X5WcgvU.G?S�YX�\1Xp}Ag<`ifv|$G9zY4j{)M NYm8'}b~.ķUY.VE#k}23A
    %
    ,�51d(5
    
    )Ta40!8}(AC�1hpC?a4r(047̆P$.(N<
    WBXRKL}fe[~D�-R#gGC5t
    jF@$UmjHP	R}cXH57HZ35#)
    ]A
    %sdA9ln"@Hm%<ay98CPXqC(12Yr<Sޜfh�SDɑEh@3q)8c6@{ZS!�dnhHp"Q6#ۆM]rkѳ0y7rR<HPpxK+t�y@:JXIURԥ#�4rR�LX*R-%ЅdaZ�.p}\I41`&P9{R#<رֱhL7�Zv+&YYT*-K46ũ�"'Fl\Qtny[Y2
    WÕq[.K.pd$c@%hխU5h,lkʩƱ{(YRq@-,ZQ
    ]B,HHF@Mmjb4eAt+^ILz 
    &PFS({1i\cX!OnLP`qstc[YAr'	LPe1zR$ R*�6s{
    SGQ!F@j
    uΚAg=?hL$"68x;;4$ٸp7a�|8(q$7L<p̈SjSթVY ?:AOc %?64 3i#0@<HPI(@w
    =2@iID
    nABtc47C'Եr@Fp}Y0',i=t%(Zq%zzP!
    #3q!INKFA.
    W�8;N	Jq'>  	V`.ݹ')^൹:]�0"yNGC_;"oZvt÷I9vx
    4{0' LC�w)_y_׼x{~7@DK@�Q6> 0@_`�/8tNٯڝ'	Ʉҷ>OiY+	].pu�,a	Z|�g(�J
    ,B,j^"-
    (/N.`V 
    A�`�@b�M`�.ģ[l*
    jMt"UnkA	c"mMJj 	ut&/σ~jP簩0P@f >/
    POL0
    2���aF@ ALi$"B$WE!D	c#L<b@  2a,�@x:�l@n'!="z`(LaLAZ�J*�0  1AEb)
    ώ$AN7܌0!
    V!
    d!#r#pbŠh2a�a2a&[`(2-A1)�sQ*^'>
    Q* y0.kϾ%;!B(a
    +{Lơ+"1[\Nv
    t	r  `,y%"q`(
    k(
    EE2Lxxx(
    P(21)7)CG/)BVJSUB P5Q4S5,/,a�\t@: `r`8`v``b6g/; 0ar00 1S
    Ө"s22233<' n }9b"T/>/&D,#>>,m(+<)zx!A
    �H~C=cRF@S":3&	FQ(@xME,`aTfab-3Q394Z5C	#2H!$"tIO"II6)"Aר#@J7dA
    6�
    p%4#>T0eDMt<PT
    TtEѳ^*!nr<y<}t=EH}rJD!4-SA\SRQ!I!~^b7Q4|.uM9ME'àh)B.TJFgFP2S);3)ts,a$!R]'55#U$5>9!<U
    N`$3Nn[-MS&kVsuWW);jX˂F5(ad(uYY545`^{"Z'/V>U?u!tlqr.|zx8Va%C:B<#l``+``uTYӓa?a}t"̿hV'lwcv CEV!HdmeeK `6)fjfe_E4̬h" Lkhh)v)-$(6'BR$Z%(W!nBrk ˢhltct,yvs
    ^q܂
    AfM7U=xf<uGwaaR  u +5$	[7&$7!wrKssK6EtT#
    U7>XzuPleA9q/`www"aiWiWqE>ku6yU7&ҡcxy7@Gt!,rEf~DfmsVa	a.HPnA<"^&ph	uY=)UFRͦW"l s+oiS
    ^R@ˀKx}e2,0n+nX`rwpp"qqG|G*;~#~ 8kǏ)8D,x.r!b()Z5z"btA,{0@@`l ȆEu7Y{xi5 rT�	M5x6 9f!$b
    !ouOD7@|!P
    $az.aUEY 8=qk!vtKyc;JT"$|QH�n.ٲYl.� vk2.n!͢}v�$ LZ.�LAxB:Z�¢m-8:t9JSz}_:;o'/:7iqQZM.8
    �
    C+a & . 0D|yi$$kz%	⠯��@�$%t`hxmHZ @٦QϩIIZ`"@BvPZ.�S:V[lz7Wۦ[5=EH[LSE9_
    
     1`�'|`z?%5`BK�Z
     2 $(!&/L$$2!!`if@zH�l ſ	ZLPV<a`N<R`l�oAw,2|ãçç)DM\A<#�0� Vo<�,�3v݇ܬQH\#l uLjI:9ضm9.,"llba<<;\Z`"�lQ̛((:aM`xX]mL՟5ɵA]}ԛ}T؅|.b/p ~AϑRϓW!i"
    rW
    -"U="}#>BMѽSxK\e&R.T,""Ȃ,
    
    ay
    k,lKHAb.|_` "G@BF,2hFk^VɁ-0~48~<)ILcT@o	zXeSԮ	nҍ5#WX|_5r$=haBf.|h)zp
    `tL,,#~!a\#�5˂TA_*_Nި!_\~/26p_U:�x�{%0�t,WU1ӿ
    Qb
    v"h8KML	+V@@j. С}(p:C< :ÃDT:sZ%MCgb:(Y3eIrρ:F)E9z)RI+["(-��`pc�"jnQ
    ֭l|FvZi[9͜;vOѤK>:jF^
    ;ٴk&ж{
    v?n	qѨAf{:7ܻZ	\v�H 11>/ڱsDH*pT7a4?<�:\uPу�a�RӁ	I@$ :C~SIXI: Thg2zJ*tV|`!cAdye6\f7n	ggڼ]vIgp*ǜsIu6f~.(jGyǞ7wHPFXVN`N8M+9z; Iس64b4JM6M�@ +9ЈABG1-Dz*ʪ:+7
    t#|H+eD}yeb56
    ^VoB
    OhIq͚IqxZ&hsEǥ}< L3Wywޥn)C:nLlI,X�~�Oԁʯ a�v÷�j.
    kM-h 8+I;0pgXedE^iddiS[ɡgk!ଢn躕{향,(ASu?3N<m7G3흰'd3ݠ2/*
    Lk6cuhL�L;SH�4@σ
    yJ� ;*ӳN=UmkRUTPg4U|U�frZJV<8 7!j
    nΆ<<NFp;ܭP.CT
    9$Jq4٤xvK5y	^5W=aڋ.
    T	azR/F�
    86[6@ G?[RA4cӈXi0!GP4B'L3Vh*rSI]YVs{>d4s˥,iIҗ"SZƻCFf*Jjg칆rlS]U�M/ Rs3s72Y-;9Bp; {X!VPl@,Y O' CϙuFa5gmM5~MChDeJɲ594EvtnSAe1uWd:lv+*<,^3&9oF?0Z7uRA9!88{nu6(06F~,(Έz% jEUUUaeG3GT>'mGJO`/\X8�bs*aִ7?8D&tmy+`CAEsd
    G>zTf
    E7FܴdF
    i#t1!@P`�9ћ4U.-'ә}>r68v̈́mWH`-2{:ö.5S&˥
    \p�=0&ȱv)'>x0N%^3ņ}
    4܃X_�Nk5pLK`s$fb.sDs<!y;kd[vYr`�� @*@ёt|PS۰/m.W;CHFj$wZ=X8}Nkzי1$1T@`Xa$VL9A
    ALc'-Y7,[8hn)24u7-L؛Q1L@Y	
    r
    @<`HE*@j`f܀4:F0ئZ<OcEսas&sQr>V@D١:
    r 6^#s<ż&M-58TNAMO{wN49mmDù7
    hnWC:hJ:͆OkMOS6&NIѣe]n}wWOcvpsF4c8^[8?,|^{heO}qu>wL{3ulz;eZЂ^LC؂A�bVj4Xf%'C2'ۇo|yH3~D y14Tg1Q~G,`)-\G`f20"w'&KqHv͔?
    WքL^Wu0�P*qgx?Cy'7Dȷ1W:Zq}x;D&a|хtڅe4`hӰ+
    uwnLea&0nH!DW/a08ͳE"*dexs#YvH$Jx6fk~hS芶rQP7	p㋄u 7Wq8E1Cӗg1i2QQ׍#(LT|AX6#A!uH?&|t1y6n�	!D-99&3@
    O#
    V9
    
    dHiL'9<)۰
    腊ZiW9ȍoV\	ND?;I哏*Uؕb9fƀrC=mɷ		Y2�g:eIUAy@$v)xzIdAXgaUyzBsbI:hHsy~3G$0IH22#<Љϙ8I!̴~4YPـC9Ïu(;?uݹ:3ўy9<Y1's(uIHChDwA1Io:{yOm5JzaiC}L桩!y/٢vziKY<L3ɉK4CSNƛvLEzsQ꣥q$Z55[Z[%hJ[Q6~ljsy6awj/I�syLcJj6lƢc	g3gYZZ'	
    K<:lʪ!njrw lثq(Kfor
    j:zD3gryu"
    5}Q\-s8Ϊb7ywگQyG	hiؑwwv
    릅yبz#{ygA#ZZr;E~${ح	~'~: }ϊ7빅w
    PۏcIY}G{$C/+<ek[K_wթ>+a9r{u(1o'rw;HT2`}4Ÿ79tu&JzPKZsK+*AӴR}[+QP[kV(<
    λ~ѹ�=ȵn�𛳋ݫzĚE	;kmCa;w딘j׷!?LvBkC0벉V|KvQ!kMx,1A*<lq76\ЫÉH¤'Aq7KĄMISLUܯR[z]̪ZcL`ebk>\X$qLulgl9y}<wxǶǁLȅnl`9ȉȍ|aȑLɕ|Slɳ8əɝC}ɡLʥ:lQ8ʩʭ0ʱL˵&l7˹˽˨LŬln7͜3LռoӌĦ,δjl\qϖ|aL϶e|T,Ƹp@q� BXR-Mm
    !-#
    ]Y{|M
    Ӟ|		!NM;=?
    A-CMBm&�1
    Օ,1`�1W=WX]_
    a-cMemgikmo
    q-sMu{ 
    9MMՁ  
    p}P]w-ٓMٕmٟٗٙٛٝ
    ڡ-ڣMڥmڧکګqvי%طm^FP]
    e�4@Ǎɭ
    -Mm׍٭
    -&	vPE+
    }	X
    
    r
    .Nn	
    .N
    _g47
    tS0 a
    +-/1.3N5n79;=?A.CNEn8&68ӃR!.l�@"ЎP]_a.cN96X!5oNysAwy{}.Nn臎艮Nd盾rt..Nn꧎ꩮNMU|^ղ>铔.Nnǎɮ.Ң$QMINnn|/(/Oo	
    /Oo7emo')+-/!ڎ_MR?A/COEUh/{O;G"FoWY[]HLucOeogikmoq/sOuowy{5�;������������������������������logback_1.0.13/docs/manual/images/chapters/architecture/underTheHoodSequence2_small.gif�������������0000644�0001750�0001750�00000055027�12143164146�031156� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a���ҷonYtئɵг©iŚqxxx쬬ݥ}rupǢëԕz՗xw`ʢmgfd~ڳvvmtlҫpѵXVLֽߦĕq#%̞|zOQҟ˜|uh[ȳl୍}𹙐l]`]NED6ƥ峳ЛѦtϤNRÑÛбϻ׿q$"rlg¥qslqzfeSֿªʭӱԟƩҷ}}ёmĽՓx}}}__^]]ٚyrrrnnn۾Ӱϫkkjev@@ţ\XקCD!�����,�������	H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@
    JѣH*]ʴӧPJJիXjʵׯ`l66dӦ]Iv`[oAƍ8ۺv+Sނ~mW,BWs`A	3|q_lU&_3pܶAJy4leb
    [7gz-!&\63|Yj(`Gf9T^"@lf̀mܟ/]Enؖ[~jUMrhmtC@�"R8FPCnub!Z4袋'RXa3r#)h;cP@45/$#nHKb1v3VX(TЃ5ae*(%\8RyefFhVA"Qƛsr99i(C0ayh(o`$/!=b0)aV2uPj#5JàYBE&0(lF+-"U�>\P6kn˦綛˃QC
    ֫lӮ[/λR+(:pCCF;.
    w|҂,pȔxH3e›#\#q%[lOr 0.;1<.^t0fcb\/�`C`ehPl"d@ 7zSc�57wo}Kиށ YdCzcNP8yߨl]M(Ocz5N
    7;wg<{N
    "Í_PCo9x^~-NÞww^
    N,Do]7ҭ|Ԙ<-L<mtq@@GL~8oB(:ʛָڝtX<uЂ!5q?!1\(4w;qPtEqςb`~=աw|`!0`L0@/\G͋Fqq>�&�0ѷnPF5ʱicנ8α	c85
    \8`3k5IqR8G5эD	p8qF5aK0%N
    f^7N!]"1p"AL]8p8l9±>j#�513\vR@H9pmc71^BНq	\ӘF3p(8qk089VSEݠ7^I6
    9jTr�v1fP'8C$	NXՓX4bmX5(4vnXb8zWf&ueq)C
    tA%?Y#P5N8n4aQq97qC44!KSݸ8.z
    ]*	9؀int֢	5c".i@ӹ݄8NA
    pv-5@.qDxw;!D`Ud%lC58N�]8qK<@j"Dypp7q N&8U|p`/8
    ٰ,p;#vg^XS)UG;DT	<N877-o6Mf^Í`rF.w�@7zp,�C4-Teo�E0�Bp+6Aw> AO(5<$	nhmب8ٺ1s<lk�1>�qw4.WM	T3od�]H86p
    Qj 7Da�n&4�?wߤ)>`}fC
    �6p#?PF$gpUޡx54(6s<х
    
    x{la-޶qI3nA!4* ߝMG@rAk썓mm=Եnv!b#750? r&(p@H!q(p*2@b=Puo?4◮x=f
    ~
    A
    #zLM
    5a>V:lcZR0B	 - ޶ΟѺm,`>o>ʗJ?o
    F3|	Np	A<z9jF~!0@�@$�;pxy�`p[`b�`[8hSF�v!�*�հP@-zpD�*Zw.a;�.0Zb@-P	$8z`dUxP�x`.* 
    x@a7@
    `p	{(
    08�d00'/@? �;�p
    x`�8 7a	#8p�dP
     	}7!0!PwP7}AW
    ph8d`
    �	7`@B	h
    wǎ@@ưk` 
    ՠ#0�}�	~pHϗ~!dp�i~~}`B�'y�8p0
    9*x3p	kP#`Qd��\h@~3`m7Pp�[xI~py		p�$�ZP
    ~)
    77Ԩ`$�!
    3
    7v;p\)	0z�̩.`� QY
    Q	l	a=fe�F�u*x ԰�pP*0m�H	�$Pw
    P;. }e~`�x.6d@.$
    a"huC�}@I8
    *pm.�`
    КQ9xH`
    }�i
    m$o[@m8`p� ip*hpPi-P�h2+h
    f6`
    PD7`
    Өl	Nz6p� `�?ZB
    uʚ`p�P a$@-�	>JS�
    zle7`7P7ڨ.`}	'x�@m'X
    	?p	0z@@șMʖx	 @z�`
    @p0uj ˯`p
    0p	-7g{�-Tz$p�	d@r`=YZ@�p	aEP0`8+@j [xpy�j$p8@PNZ` 14x�`=˱p�*�`L*a`
    P`kS`2`
    `@�$:m`8p-kP}\0EK�$结> 
    z �`
    Y
    �{k�m;kpkˆ*P@զfP$$];8ةx�|S{�6*tp�`pt�>p}x*8[0pz?`knft )
    �L)I×ך#}`-Z
    0b	i\dA3Z)hp�Kp{k`kpa�|*.p;i$ɻxLb7P
    knB'XI zan-:lиT9D�p;i1(E!Pm�G#< 7	]TtTks:Ü2�7PkrxD@ zX{PL�z�*#b00*t5[aH0WEfPxp*=zh5d#k?=k,I 
    ~-0- 
    ʖ0P|ep{!F\aM}8hΛ$p&:;pp�z.pbPPP#
    Q	0p0+`}@�{(ߜ9j##�	@-P\!p�oJ>`|
    Hq~�#PqPx0r[H-Њ޼h. <#	9x`�	p0RJ>˦p`*�#`8pq@[бjU9s8`{H|'[
    Z~mp{0'2mb�P6'Kken 
    @
    {܍ih
    뭗~sx�K]�֔:p$1
    c_飮2AZH@T9ྋ.0q@=:m*kNԍ	`i٨[@iDIׄa4�0v�qP0u*k`G{;@y.ඝHI`q`';ځF.L	~FiҨ[
    >dHD^
    bN|SI^}0=Aj+
    [$6|O`;$l$O+8$t`9l|/
    O;8@$ 
    ƀ{$?*8ÿ*{6}Oo{		@P?}Ÿz$ן/
    ̯;$Tc$H8hCUH~HMX~yJXؖO"qr	8`NTӡ;Dmyω[eGL
    ,gIRalG_uo;.(—"Tá	.7A6B4fL&nKvA	wDȲ؇]FI.8߿fͺraӈ6>qܮ=MwañuS!샋eI2YI-̔ꚶ
    pmxÄqoɳ_
    T7i~_3&௟
    0@$0$�j�$|0`	3B
    老�p
    �0@
    !Dtp
    4TP]tп
     O@0PA<RI)w@
    QG!TRH;RA.@LBب7xPd?Ntq2ܱZ\0B	 PQ+ьT4ŌЇ!h`FQI 1DQuTLV\E#eT5 qVU4SD4aAWTK\HluZSTUA?3pS)S1}9--R44ӀދXomfj�'1`fa߇!v0l
    {F=f)ىX`j8ykjfmZ^xn`x8f!8b'nFyo_8tr)%sFzl~ya^zK^zoe#㎛h\nŏa:kj4崫Qƨ曀E>qy{q#jeEqB!wlwXeCo}o<§ap{|fEFjTFoj	gy/[hO|
    9E=Q&xA,j[Xh0uh8	88F'2ֹ.} UpCĦŨTZ!Bl;!~ֺuC&%*r
    CZ0BdF5/D3H4k[
    pLPDP:&,e-k]EmaML
    xq9#8*)mcPIJQ̀Jɪ0%N*OF
    G
    A4!g8FWU0
    hPlK^RBTRĉR߽S?GN&
    Xa,$"YӐxrg\`
    XXIDÉmg|N(1Y`=dx0�Mg%2[,!=5l2B_z65%Dړ#rvI޳53@Vbef6TYLҙ&"*vG^Lxâ߱ QՈ*dFK7T0#\F7&wVe̜
    UM/z۫&T݀UF)zV
    ?�F
    `)?j
    3~,㦽iP6{L]5X;
    K�G5CT&O!d9^d:qdoUƹǥz7Ntz&۠U4gL.,`7BVM!u4rVo2/A=([0ʞMk+57Rx]p[n0V^rg7L%'&\o`.]Xjg~z?0[H_Zf3gw?*PJV
    ☬ +Eѳ!$-OyRݤ3:I>ц2@ܨ@~gXZ=MOԃ#g@8"P͇A"$`9Ѽc9cG5ֱ&uMRPZٙ;Pcxd1㩹م6ma[I,ԐÑu}r7V4J�Jl|@t
    5#qހ!;8\x簒OgC!Pȸ]ب4q8p0yav3#0*6
    ^aKg{+q87]nkkmdYFz ~P4F~
    ]{{6o57w'^g|xp\N(�kx|=yaA(w}]xqCY3j1};Db=op^W.�[|wz	{
    dB
    ַ@CtY~ xטP
    'p[x
    PSh{nL�JY@:q5Pn&`l
    
    J6c;;2A27nؘ
    2LA! B!	$8;5B&lB'|B(B)[3{&�QB/B0
    H[+0|C8i.8C>C)�ϸ31CDBJx>n`ZI%LDKdDS(A/P�PEQQR<Q�
    @}@EXEYEX4EZE\7{OEaE[Fc$EJ(n8FhbFcdGh4lЁg|FjZFpGQdC�;_NrEJvE/ЅRq/(
    ІcP(F�7pW�|H|H�MHH70f2Hdd,I<IHClILI||J@fxxIfIFXHW!l`Fp'`ȡ`ʞ�7�(H7JLI9\ˋIWpPxɜ'I4THWhFx2p;/zx'XȾtHM|'`kȼ.k�꾸P Ϥo
    l0\M|,Z֌M٤+x|Ɇ݄;I{&7
    NMMI〶{lN묏uέzM/.k� |٘d@BOϨ�ʬLbkM\MN
    
    ش<PMl0:(x},iCP
    U
    M;\Q�}mQ>QLNux-��;5R&eH&\R)$[p ,|gR/N;L`N4NPM+mS4!9e:S/M^S>mRL @
    �CE͎|.%QTTKTN!�X�J5
    'eUtU%(TZY8\eU;|3U;\\;PF-VTeeVgmP~�^\BuVSD-VnVpr5WlRkUW8uwxUL}u@�y=T
    }WϔUiXt5XlӄTh�pbc%PN!h֋}fm׍=jVu\WRMЍYՕUٕeMxٸiԆ
    T"WTUR]f(
    HR5ڸ՜]mG
    
    `؉WPhUڸdZdCZVu]f0Y{M[_MVHu[q%׸=ۼUeR}~׻5ZUG]]\Z`ѲSSĽ[:ZZv![׳XNETE=Y
    ]KEYWzZm]U\QMړ%՞ן]u
    ZY]eZuק=^/bU`SwXU^Z\א^l=[DžUo=]ɽX]zPeW5Wx]߾WmRe|ן]-\V�UM^fxU\XRt-C!hYZb1[%]M4_5:_X_�lQWMϠ9`^��&Sm]JM\׽NńNdp(?EaL Hg@U'S�h�Z
    ZHUEڽ[�@"Y3.@=a\0�;mw�b8c  COP5VVZ`HB5_@[U`U�QOdPdR=(�~vUx�w vHe[
    諀fxDlP̼Ʀ&8UF]=`gMfhD_-_Hk[Zd5bQqgr. w(�l[t8gkc0u8
    skx;lтf聹<d&f=ufeW*gqh
    W]MWc_H(n8`Sњ[|ii̦:�!jx9B?`DP�Ic UN]hc^YM|WS!fP-U[hhHd6J^OݘV0aNе;lkkkkPlPlZ!(lk*�%P&HPZF|,!paM(0d8bHg`a8uNP{MM|I[8 6\jTЄnnnnNɞQZaHUZ`v@U b��fHY>ZT^@`�oPY:�g8YHapdL8�b(7n7Rh2M5NN]iXКk~Ol6hBP�aZPb`zc�xR!8Z`"��=?v�[�xrr&8~xYfpznmc�8v`8?v$cqqC=6ZOmkLoPdSdkQuR/uS/SY b�pPP�Wg 	�sX]w?p8Fc _XX@�v@xpz@qhuxgha`cZ@`Dhmֵg=nCCLx/x?xOx_x7(xKb8{'Zp�;~�(t�p�[�xx>f=;-a�a@w�x�v p8^0=9bpt x:p^PchHfMi(�Z[�VcOU[N{_{_�PW;.ujPKxp;Ռj_NiZi;UPȁ~Sʋz`d9~VWUWԒ�0nlf}؏}ُ}klZ nO�Z*xP8t,Yu~ZmwW
    XBn~~Y�oYV)`XG.ZAi
    \H�XM,h „
    *lA�'R(ٿU,r ժuNj)W~?}JD˓eiNA*di~!mh
    bORb@լ![?`$$[IIk-ܸrҭk.޷ܸYQ!Q02RF,֚Ml)˚;fgb1!]l5oL
    5زgӮm6ܰņe3&nW@5+jz,,k1>�ַK1L;L!qFQ4V7Z=vg&(�uM5thZT-U>(F x5V)D쥵@BpoCq~4�oh܈+QVi;$aA2j+|\DISPM۔mEٖc\VeoX~^jie)eS9T	e_6S2N [0ЖA3hj@+bJU
    JmdrDd(S-!Ť	DAABaLAEBb1"DƐC2J+-*-Ы5*쬪k2k"W2a!@5�
    (~^:=K,R=JdzTB>^0PFhQ]ESqpD
    +0(\THqg|
    GrHhH4|Q�<3T|6J4N7ERD5;.&EZHi5R'M(LM398mp
    09#10r7Cxs7-q3>xw}xm7݂nw'5tL[Pte}:GκD޽C,z^zV#![C\Anj(5C\3̱r(|{}{0DLrj#N|g7|Gʛ8(5$74Z2a0%,tB9
    IQ@k0Mn
    1'.DA
    nQ�`@R�?i]xPM!
    g"q}C
    /Z6LWHCՎh$kk[d0qB݉=jFԬ8U@(q̗ԃ0x?h1&dPZCq!$1^iN	d#�ArG%B'FTD�P'bR )'1I.#
    ֨+a	K,g|1�bń!g`�*	5[,e9TS:|ALx0q΁
    @6;)r@)PQZy'׸2}iHh,75tBH?*z8�;b`,ၟ9<AbR� )LSZ9$T()K <
    OG4RSV\^-]I?.DbBq4�a#\Eိh'd*@Ԟj:=FrzFIR =юR1lJo¤LDDko	XSCeՃ[HNԝQy7?_#ΟBx
    Y{~%3A&FRl)xU6QZw4}tVou7T}ëܴ}Wd+݃TvlRIWf`x	8-	칳2-4kI<׃G	58	dӃ7vXU4>.u_P:r2Wd/v: HVulZZ6;mgkڥD,2NG_{f8H(ȡ!P$
    сH`@Y H%	h&	�
    *Pc�["Yd(c-_L\g!Ռ�F5I6/@PgP:>CȰ*jd�`
    1qh< �`,�h*$!u#=)-WƽPS�ws!'gc}b'73B+hw<1�cu`q9ȡ(3zQ�Ѱq�Xcx,nc�
    mBh1ŷ:!Hש_f*aGaz(eڸU�f!x3v�!�101uS<^  FzA!@`<?!x
    X(P_Ѵjx@StmOqb5A:C*on!#&V[�Nx c�8v?,5
    a?2LD9i65;Y̶�k]{V?#-e;c5`KЁ$�64OAWaD� 213HVWMFCgaJHM4,Ղ?4xY55BAVBSV9Y4jM9!A\XE(cy9a`h[m頀(A(*A>}
    s,`]a�BNkcE`�!QFlDXl9zDI`	p8IՌ5>17`ܐXoO
    adbRaD)][I^Ģ,Aþ".b.b>E0�\?IMH؁(‡A#DF?p5^#@rcɁn.EbalVX,]E,",uk`5ȁ6
    D@$A't`Q0A@dAV�0$C>$L@+An$GvG~$H?BI$JdHC;IP`adt#w5t l@T6$s$da0t]AA-�&(�tޤ!1�?8@
    <f"�IDH[[@\%]@'#te]_[>t-X�b&b.&c6c>&d؀B-&d^&fff^dB'Lf&0z$GhI_x+~H<5C F�<S<154*?F=;8<B,;	Qy%EoPP}T@$R�
    }""0g~2c}A~ҧ"02 }'}&.}(Â'~*B'T,K6f(v~('((:l@#|IcF4A$G[L>aD{ΒNZ	*,*?C/|;x�21Hݝ@0C:��n\=li:0!�FPCP	B|I>i��
    T8l#u54C9NL4l`(4lC7Cm5�8Z5~(B6j8C5LHr}.j^d?/Ҫ*d?�zeH"H|^\~|8XN?0p
    p3@B!�4,ܜ;10
    A/<�W9�U!*C@^%pA!6B\l�l9t,N@Ɔ@.@n555P(t�jNI%}m}N-&lL |+,+Ȫ^TYX1GQ4Vn.p4*�:CZp':�(?,g-�|�,qI4*D\Dc�)lp
    H`<,X`�@B $$̃@Bh,h@&<J>$@)CXnT6L25@onl	|042inT@|U26P=Pk[	uhPf PO!AH� Z:�(Vp4�!@F"�؁X1\@8%@�$1�/ȁ=<<�0$xBA؃)C=CH.@%JIGPgdД"EHz]J*Ʊ1ױ1'r|Brrq4C�­0l %@C	�=(KrA)H/<)؃=2	0�0=h786*�1>v)n0d`}WjlA`#::3;;3<3;ȳ=3>5�!=(b�p�	@<)@< 3 s@2@0&,#H#@`	
    K@,7L
    `AI_1El3lx3YծjٮN5UWXVh�@4�H4kC88l)H]o�550D*n�0"@),]׵xɎçNd9OR?PR1RjH_YQk/kV_lLJ1"0=܁uX8ՌB!\Y_858*^rA87LC>99(8Ԭt8x8\65x9l5~ @ `Dgh|"Di;D|k*c>)R7888Q&?8[df|#8o?԰^&]΀[rx8\vFI1LQO}cSqAqͶ9lś)"9ˆeC6�r*dF}HtX|9y5|yyԀhog|EoBx~kEkmz^D :Eu
    86x):Y$@
    t\0̈:Daьz][H~Z 4m?G�dhUN:
     7x#{**3r8{`D@$oӋ.PR6lTbX3ܛ)fosI*_pd
    [GH: E3@	v&C/J;7wARKRXAaݸk<$p|*|Hڤ)U,#@�5txz<@86ݔ0x'*-Z͎KĭbHID63\RHpO
    :G+Lާ]Q0
    ˽~a
    �$<FnSC8t@A ,E�w\P2rV5QgL2�\[u6(]]tsK<43t_:� @:3lSw�ÕB,B/'�,<C3C
    `?,:[C"\:
    iϗ~CKۅD3iҬ1a"�lښ5_D)VxcF9b
    bG#Irl8I5l(ď۝y'I
    +U;#A.5ziRK6uZG9׿v{Lb2,aR1럇ͅ7.`�f@`,=�� ﱢ*Ai 4'In/AV`xT[lL(
    ˜yoOr%.w~j݀
    e}{v۹w|xWso6`� ǯ8s R9`:nxr@VOd`@`hv`)�bnl
    �ۑCka@ zA"`z*#z,)R%Rˋ 
    0͔(jNV>8圓:<s7hqF :_�0i2aZY@8f=a�Xv!t�h�td@!t*Hg
    @^xTb>RL [[&N X*jBhZ;]%&!lI0\wtZi]*!f.(^|LjP@�
    .I~e2ti`t(.	L0G =9Yr	&qS"_E.I r8f9g�X
    j馝~ꨥꪭk'ꥁk(jZȖI&ATީov%߇0*f~vi||4(
    EM?U_=t`e]/l|w}hP="9]֋&uөKz	&q"lUO?Mc;JY<A$.
    z㮝%@8hA:l8QP8i 5<DH6 T4U	IbHdr!Y�SÌ|aA
    '
    
    xN%
    %]`,DLo5lF=~Oa^5VxMA9V aEpSld?;$8$ʨCtIXВ#9G"ڈMR0SDR굒"9ėDEt*wc
    ##69/=E1i#
    	J`$v{ט8IJ9J83RGHfH]$F�4r!hHxc
    h<cҜ}rĬ?)ŗ@+!	zieEޱj�.+*k%=&Pcp'3'zgѦk5Q35rdt
    eP%/T<\c:P[tS)RϜ"rӟiR.Jo0[
    Eu03j!
    L&x8H` &(W2]TPV5Xm<MP4<%F
    IJ?86#L+TNWV9+WqgcfYuv@@=`Vb+n1bUna_Wњ`=dew!ɹr-bd	:Αn
    zslhKm~OԆL?wcА+4h[u"լBuG"J34�@26~2ӠeQEEU20^р#iIVBx]Ac�-�XbLs!
    4Cȴ:fHBRqE|9ٻE$jLc<@eel!4NP�i̘1	 ,L>A=aV@nk(
    Zwk єk
    6o�lxsZr)61j�2MRg!)?w8;u0,3<p[#B?fa`֘F9X4nqcXc9;^ٽ#DpXum|LaI6O
    `1["r<2x@E1wy� 0qЕ�C:WA$Xc 8:`B}F2E{vk>um7.V�"pF,PPc�T&X!B�d0H`F*tDDI 4&A&qFq^R$wkӴdϕ+,]FC671I7<>Z1QT>�OJWJmKY5e ZUci~e^�
    �P'�
    
    P%0'!p).�QAp`V\aIPO6bzV!\8"a��}bb0/L7~JhLު|mVtP@PǐP@G	a
    `pbLRNa>-
    @{0�A@!WA
    �0&NRB zVe6>ktz/|,8Zh * NH�U!8��XU^0acEX!A4&W,ͬ1
    ǜJǀL
    !L_с!@`s�Fά\C O<ARMd %%H\^�Gl6p To"J_,	Z"ߪ쭆rkyK$J-"nHXX`Nd@D-E@h)1PNH'GЬq寴Nk*ߪ0
    R5ɪ(E`)(|P�ހn	\eh�)쏤J~>]*Z $"]/Q	cU?3N4 
    (D2U8hT(C_S(%;E4V(,8L	JԮ@<k\.I$5rHt@@@tCDKDOESDmAE[DeCeANp
    u@latY!3"L U,3j33/ o4@bج!@x@�:@LǔLLMTM
    Р	t@` `	h ?1hS(@kJp"RBQF6`j�‰6 a+�1~Jˬ."> @$
    ҠX0Pn@NSi!ASXt�dqJTF|?)AFVeHAHHQ1tԩ/t<j: AJ @ޠ3iZ50	I$NnH2]A5\?Ů\ϕ/sBx"DPk`$r DsG�&5V-\'ӿT	3@`^镺!."uece5J1
    s.M$b{v\1hؕA@XA)N	U0DTjkv"s $8,lc,UgyV\/lm2+QxuXv@2"&
    e'L5҇qq+6m'"4L2@Hi+*XoFѪ!!YNB]6]!(4zrXl#g)7h3I֒hA%ijdJbEUZA	HdbB!`
    x@ 8Xe"8L@8x;8c@`��z&(coD3dqt
    ȱP7@b *�؉;�j@> 8�8�X8،͘iiAH�@%rum]$T	}*"�|ؒ?R(\\##S:ͬLZX)Z*  4(OB?<ylZr�6g9 tm#n|wOܕWTcXG~pccf`I
    eId4a +ܬ@+��~s#"nǹ(ͅ_@Y`	͌;|ŇP77ՒoIb	u]3"΅h:(A�>@0(9z&t6f?B:F:X
    Q (	BJo׆됏$8wNJi!*#(y)+Ah"jֈ[^+!a+a�@t92]C\C%BB%vc)H؄sa˗җvH-PW"cCۤa5(!3ՄwHW!B $_3^"l!l
    [h4#۩7wwq9st؇Fۢ[kS$�AqR\a�*-ARD``<nwS2BOe$ºY!E۫9DY
    *SF&0oJE~S  p%B+1{]5<۩@;G)15P
    G'JPD8 "o.+JsJNr"7Z+[|Άwr$x:"*پr aY{Sd|�r9.HYͽș7Хs7KhDh^ANRM$7/.K9(%`~I78(<G$]載v]"(@Y=9-zHMߖ>;Q#JGylbNb|H;=g..U*#]XNd9|xǫ"@ZniahߪVu#
    Ձ	V]<=7ٌM%'<ȋ/ۗ#AVf_J^4FO;77oJ-HC=s=^B)z5У1G4*kf-	Ĉ\|sjɓ-M{ӝiih;6ՈVe2�lvש>|3z(WdΣfHU2ÉP>f:VzfL~ߜ_!#>+רnǭh?K�1%ؿ̽9^D>s'ݩ<0a55LDY،ƍ;zXcF$K~ѣ�
    h2fő2kԘ͝<kl3Ѓ9%!D:q=
    jѨTNKiUz
    6رd*L0Dlۺ%̷tڽ7/[Klܭ>8Yj*~Y`\#[9cL5{<yѤK6uCWf
    ;ةϾ5ݼ{;Q‹?8%3=zGҫtn=Է[=?o>zͲ^7*H>:�`H``
    .`>aJH'_EHb&b*b.c2Hc6~J=TPOdB$H#͑C.dTظ6@$WV^eZne^~	fbI&CI*dn$}H"Mvމgz'ּ!gIhihh>
    i`Fi	%~
    j$6qkR
    $圲Jkފkk
    l*5!.l>mNKm�;���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/manual/images/chapters/configuration/�������������������������������������������0000755�0001750�0001750�00000000000�12203357067�023313� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/manual/images/chapters/configuration/appenderSyntax.png�������������������������0000644�0001750�0001750�00000010675�12143164146�027034� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR��������b|���gAMA��|Q��� cHRM��z%��������u0��`��:��o���PLTE������@@@   ������������������MMMhhh|||ǟMQS268@CE[^`ʭilm䒔vyz
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    ������������\�������������������d�������������������*�������a������������)��������'������������?��������(������������(�������`j������������[�������L������������e�������������������E��� �����������������pU��<IDATxb`�@;`@�@�F �4�hD�@;�  "A�hD�@1H�@�F �4@A*wxE@�
    TD`w�π*ŝ+"�hF�4*e&&DAK54�`dJaCtZ�`'4�)C�A#H9 KD<%z5<&�,+v끠.� IDmа�4ڳ$� Fǚ	�ш$� F#b��1KhG
    P�@1H�@�F �4�hD�@1H�@�F �4�@Gk^OD�ЀGe�ш$� F#b��k� F#b��A�h4"	�A"Lb AADR
    df`B2,# QDȈ101I GE & eXF@�
    �cYa	z2
    qd-2"�hE8<zD`0,# [D00Fˆ(�hE(4jD*k9T-2"�hD	ˈ�ш$� GhF�="w4"� F#b��A�h#0,# :"@@?	�hD�@1H�@�F �4"zfa�@1H�@�F �41
    �h#2OD�hD�@1H�@�
    ň�A�hE1g:ψ�ш$� MD1[2@WH00ȉ(T-2"�hD8xxB2,# MD9~&eXF@�
    ~eeXF@�
    Mկ
    Jj@&"`5dB2,# MD`ް�A�h4"	�ш$� F#b��A�h#bt+�@G.0�A�h4"	�ш$� CDP!�h4"	�ш$� F#b��A�h4"	�;N� �+�ш$� F#b��A�h4"	�ш$� F#b��B
    %Z5G#�@XT3k�@1H�@�F �D@ˤ�#[="VM�"?"|ba42 F#D@� l^FLAoA\@#=,(!ahDf@�a2r0
    z9 BPӸш  �(ˠ0Sn\G47N�š#Aa q:Gπ*%Є�[DQ�P
    zĵ3h�¦v0(aHh�H%52A(LB�|,wu&Np�#R`�@Ԏ߳6	4�АAN` A[X
    dDGDu@�F�{D<%zhш PGu5 F#DJA�@A50#=k�B㒳
    &7L+8^ш *"�h4"H�" :`I|HFP&@�
     F2B�a8@C6"CvG@�
    Ո Pr"A�!RVݒ*A hD� b+6ߊ0Aj�$�hFFbO{@ "	Ez ̅rD3	 ~D#`qeF`td6@�
    `}FJ`:!m+Dw8>#�(GX'A@$"0"%"0aqND i!G!P##"�hD0G`IlDc4�a"ػ$D.#p;�!rDޱ&8k�hD�}eD�"#k�hF|-)$!2"KɽF pD6sl^@C%"cƚg<54DbD5z�4#К&$A5z�4#06AOG@�
    H�4#wc`# zD*"�hDĠMZE@�FV@A"@:&HPA0}CAd@�FV@A"UD�PA�Ud@�FV@C%"
    UD��EF6C!UD�D5:*V@,!7h"V@.;x"�a.@�
    @DZ�Dq(T�4(#�hD�@C%"}�ЀFt�GD`imϡ];�=8#�Ј bE@�
    � F#b��1{�4�^%8ք<K&B5@�@9td@�
    H;<2# 3Cnj="0 :Y1WD�@K[E[>BA�"@:Gg@"i-� NZ~`KD��vH*a_r#�b�P)l@�FbI|y&P8#�hDrah!<<"$"#�hDd"J9�@�Fb+�4T�g
    @#>"A�4 �*A:b@A
    0]
    @C7"p量o&UH�h,g�ш0�IACe@�
    ;&;UD�A�4#oqA�4T"
    `L	`WefF@�
    ��:tC44l """HZ9LHi@0
    L@L)<(� JD#olgAL��I0r@�
     LLТIAL14 hFr*a1~F@�
    ݈@/Ю|EWdF�h{E'ܳ�!L9w	ΣJ9�@�
    و@]$I ."(R,�@C8"HB\DP|Y� hD71DbD{Y� jD"I,ȽR,�@C4"@�/bv#�hD`�4yDjF@�FvQ@C8"(*"�h4"3@GT�8@ň�ш@$@�F2�ш@�4`�# F#b@1Hш$hD�h4"a�40�AU@c�h$GĠ�4�hD�@1H�@�F �4�hD�@1H�@�F �4�hD�@1H�@�F �4�hD�@1H�@�F ��śS����IENDB`�������������������������������������������������������������������logback_1.0.13/docs/manual/images/chapters/configuration/lbClassicStatus.jpg������������������������0000644�0001750�0001750�00000530271�12143164146�027125� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������JFIF��H�H��	Photoshop 3.0�8BIM������H�����H����8BIM
    ��������x8BIM��������8BIM�����	���������8BIM
    �������8BIM'�����
    ��������8BIM�����H�/ff��lff�������/ff���������2����Z���������5����-��������8BIM�����p����������������8BIM�������8BIM���������8BIM����������@��@����8BIM���������8BIM�����y�������������a������S�a�n�s� �t�i�t�r�e�-�1����������������������������������a����������������������������������8BIM������8BIM��������8BIM����������p���!��P��+P�����JFIF��H�H���Adobe�d�����			
    
    
    
    ��!�p"���?����������	
    ���������	
    �3�!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw�5�!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw���?�WePlcٶ?
    HR]Mh1yis}{>}y7y]>_gk-Z?LSF۷skG.6c_\'}R^;o.akjssAsn~8~cԏ3fVPkuphsٿu7uKl.~KC�6=jzž8=�S�U/sCLky%O7X/F7VX}rլmnz~O
    wX
    ,Ii(@m?R_{?_�J/_f7='>W?__�iy$z#CYϧK|+�ҟ_wk�+A/nzO|xmZC^ᴸq7nm}o^}{AN�5K|+�ҟ_wk���K�+A\bHo^Huɽ>�`LZF_}}�S�U+/_�
    wJa[eeN\tak]ݻH:AgKU7OkP6g9Vz/&ְC]g6|y�0rhq cZ]:|W~&#-{~wgj)6Ξ=/WmUo
    _ewc;zRtyyGakA1`wgk\r@ p=�|F
    bvٺ776+lOs^\ɩlcR
    {Iw*o;h!4on(G`{ù'RW93�NILm1\K:G[dKI�?xmM=B]'udiRs[rJ[thF6?7w?"mxAlrðZr.I)f2"l3-%Kkџz?�$�B:~FGfr��I6KHOgF;5%?S�_CTבNQ/#I$4S/#I%>4S/#I%>o6�ſRH)8BIM!�����}�������A�d�o�b�e� �P�h�o�t�o�s�h�o�p� �E�l�e�m�e�n�t�s����A�d�o�b�e� �P�h�o�t�o�s�h�o�p� �E�l�e�m�e�n�t�s� �1�.�0�.�1����8BIM���������!Adobe�d@�������������������a�[����������	
    �����������	
    ����	7 p!CD568
    P09@`"#$&12F'HIJ4����5	46!12Ҕ73w8 A⵶x0Qaq"%&vP#$'
    @`pbBuWȉrCg(XefG9I��	
    	��1!25367AՆpQaq"Brsu 0v#PR4tb$%FTE&����M6{c\~uk�����������������9����������������3P���������������Xyg7~d[}6imY3Ⱥ|`nهΟbw4g\}=Cvz?uR%/+lmX{A#ea>G{������������Ġ����������������X���������������?Zܹcr=9==y�#bύ,탩}rmɁl1U/cxm7;qzyg[(Hv������������>n������������������������������NrթL<->.@d_+o#]mw-w�P
    N!hLBN-#@GX*8P�B�/2pQH8^+.(p@O@^rc@ʝo_y^n_G!ɳwr<vQ=u!G(8|ܚү{b@։3igr`ys3ՖyjF,N/%h+-KLLu]nԾw,lƚNc_G1Ĩ9N&)|sj^4ģ^SH9B8*D|ĜMHM\q5!)x@0´8cIļ@_r"^-/M(8pq(ĩX~XɻSioN.5-af�F,.t Zt=6[M(t'}owڥ֕&ws5iΙVi;˶OSDiVsqo |ʔ%@Rq'Ή^dRq ps/�i5$y#KI$x-"^q\pYļʴp |0>eG+q\*B|p	5s'PRF^?}Kߗ?g=\u5rpp9�@�)�� ��p���/(8rp!H(�������%)
    N@8N)��T̛7/~9H������������������������������������������������������F;71Wn')'2~If؍pū#PYQԓSQͲ@OhƟȬ0\"1iʮ[RX*w
    Q8H�C�b=?E58o@ƈMϙ�������������������������������Q~S[|ɽީ9I75m(Ł6kM/;t4m�zy1=>6*)m̲$oBdm
    �:s1!_=n?=N5T3z[*F
    |��������������������������������هfF?B\)->d')�����
    LB&��b*#3w@�������P������������������������������������Tló#?.2zꓔ������������������������������������������������������Tló#?>2zꓔ@����������������������������������������������������0S>z̞z LJbxV\�|cnyk ��bGs@;Vmꀕp1Fn �ڵoW`��Fn �������������U�i9W����������������bGs{E8�0K^:~: LJbxV\�gu�_]|MPr+h��bGsw~.kyݏ᯲5C}׍ݶ@�
    q{NGψ'&z+�=r`��;]l�������������Ӣ4Lu>N^�;5ӛA~��������������ؾz �F;71O~'9H�?qF��3OWOLx��8G>=Ǐ? �Ol^t)z0�X۞g[h6o7Bۧ} �.-)z0�������������#L~Ǎ}qVSb{OR3��������������.-8@�
    voe'ŸrsfO^RrPJt 4FvY"整IԪ�P;R&D@dD
    	\:"
    %.h��u$@DvDLH(F
    Y#;ӽ;Ӣ:#:"''R4JNzDtGzk�������������������-��Tló#/>2zꓔ
    kĉLN%shF(EAz*MF*Y"X%̕ AGz[:0R	8��u%f 
    "s-bדT(Ύ4
    l1:@�������������������R[��هfF?B\)/>c')@̀������#U:�1C+DADg@����P������:#;%��'%�������������������(O�Q~S_|êNR�"0sƨ�]T�nx~_w�H%S\	�&X	~C`'@6>��QMH��c*0��ʾc�[��Ỳ>C@$@6>iC>lȀ�_\>O[��$0�-c�6>c`/H|%P��هfFB<()Fe')�QUL|�HW|>_wʀc%R>LTF_"|~`��Q
    WʀXߘ_̀~
    >_�2_##/*$"ߙ- �$ 1|@@L>t�ˀG_-�~c@&_10,�1ߕ/Q*�F;74GN3/9H�\������iҀӝ�;�9;�0S:�����������������������������t��
    voi#rtf_^RrPMxaKݹ
    6kh3Q3Pe,dT(ޙЃ;*ydԉȜ9d:e3ט)k3$5l
    ^hF`�������������������������-��Tló#O{2ꓔ
    VtKm:"וΉ`zNtE 'r]*@;Ӣ%'?8%0S:"u0C;X'PggBU`m3;Nm;X0S,�������������������������-0��Tló#O{2ꓔ@+Xg�ɀ�`25$ϝ%?
    Y�'&���%	   ��+gX*|�Vϕ`,�6~X>@�+gʀ[����������#RJ��
    voi#rtf_^Rr �H5Y&sƨ��l|�6J
    `ɀDji|	"ϔ|��jV�_+k@c1 2|	�|(5Wσ�.|
    `c@c@S?_/����������Q*�F;74GN3/9H�	������:%��ɀ�����0C;���������ɀ	?V2������	�@����������L�Q>QS|êNR�*	R`	`r:<|MkG|N'ö(;Ӣ3H`��u%H0SDKtA@&w<%''R@����������������������R[��هfFB(+.e')�
    KTX6kTkOkFvAE*yl(Ύ�*A-Е@ᤂɒ;.iEK$ADgEm%wzE�����������������������Io�f}	ܯ\ٓ׏T�B������1�a`��̀2���y�|����1?&���ɀɀ2�c��̀���������������%��هfF_B|)+6d')�QEJX&X@ox�~5d`rTߖ3SD$G@L�6<Tc�,�6��z,oP�HK�p�wM|>P|	o|H	����������������Q*�F;71On'9H�TX|`3`*�g�ɨJ|Tʀwd>H>||�L%?-Hw|ɀ
    �2�	|Y #X�ɀ.���������������*%P��هfF?B*-.c')�l@DvwN	`莈ΈSNAd̤2,T$w)ރ\Cd@������������������������������:ǀ�F;72O^s'9H�&H(ѰT^Tn15z
    :#k$jLzԖDΈ΋tE0B(-yޔ̽FNP;m|&m74l������������������������������Io�f	pܧ\׏T�V.�������	4@���P'S:���:sP'S:���������������������������������0K̾z *!S� $ϔ|@O@*Q*~d25#+ �d�TF~c@UO�>c@[_"�H~K@G�g-���������������������"U��
    voi'rsfo^RrTXX�m��%S\�-/5Ԭ?&`+�6~W|?.�k
    @|@~Tߚ/T@w.X>@.���������������������Q*�F;73GN/9H�������$�2��	���20����X������������������������8��Tló#/>2zꓔ
    P
    D^*
    ̔T͒;3QWY"$:6j!	sM|H�HHL莈M{3;ҶHdY"'0S0B!P0S: ٭`����������������-��Tló#/.2zꓔ
    T	`JdS"X'RK`Vӡ,i5	`\
    f$HΈ(NvY"�u%ft&v`DtDVY tD
    wvgDPgGzwzDgDw\™^.aT^
    m����������������Ԗ��*6aٿЗ
    }uϘxuIP$w�������i@�|`��������������������������������������|��Tló#?.{2ꓔ������������������������������������������������������Tló#.2zꓔ������������������������������������������������������Tló#.z^	O������@@8���
    9����(
    �����s@#��� ƪ"@�(�1	@���������������������������������������������������������#duEl.adWC"ȮEt2+]dWC"ȮEt2+]dWC"ȮEt2+]dWC"ȮEt2+]dWC"ȮEt2+]dWC"ȮEt##lllllllllllllllllllllll.GdxAGdxAGdxAGdxAGdxAGdxAGdxAGdxAGdxAGdxAGO:keXMJN&13N,Ű]:sSiyj.-mɗ*Is}4#:NZJyH*W|2lGrfeS&̐j,
    L>%m=̕J^zg.mª	:W5fnӴ:vN;ChtӴ:vN;ChtӴ:vN;ChtӴ:vN;ChtӴ:vJZ+ChtҴ:VJZ+ChtҴ:VJZ+ChtҴ:VJZ+ChtҴ:VJZ+ChtҴ:VJZ+ChtҴ:VBЀ@t :BЀ@t :BЀ@t :BЀ@t :BЀ@t :B�i-BS}aVYN[{6~q2co#n,"Dx՗]
    w%SHnSa+àqk`n%\	5khCXiBU$E\еPhp
    0҉2:(ڼY2pzCt:Ct:Ct:Ct:Ct:Ct:Ct:Ct:Ct:Ct:Ct:Ct:Ct:Ct:Ct:Ct:Ct:B0ѸѸѸѸѸѸѸѸѸѸѸѸѸѸѸѸѸѸѸѸѸѸѸ}6zl0aaM=6zl0aaM=6zl0aaM=6zl0aaM=6zl0aaM=6zl04Jv)4b
    :tUMS1釽,fEǖbO⁗._g׬+h"Ue6+"l<;l;l;k_{`G~
    |EůZZů@wׇ~-{~-xwׇ~MtwG~MtwG~mtwG~MtwG~mtwG~rѮDw~lw;kV;kcf;kCf;kcf;kbk6cWXW5qW5qWx�Z�j�5QV�5aV�QU�QU�Q 
    Py�jT@Z<A	yjcS@ǐ6
     mHyjCR@ڐ@ڔ6<5yjCS@ژ<( HyjC#R
    ԇf< F3QAAf;PAڀ<4!
    <yjCOBxǐ<4!!-8y
    iSNBZpӠ<4)!M4y
    icLBhGƘ<kuM�>r8@ѡ49]rnIgD~'SekYޜӘas
    ^BЈBGZ7ܢ_1qqFu~ :EF6l7|ox[k<1,XmFЅh:G=E{=E,b,ـ,ou쎽C`uF{7G^oDu={<c:cY#"7/쎵ǯf#dFײ#fׇQ0xQdzQQ#B"7c@uo׀F׳8#Yx@zDF:xb!7z"8q"#Du:xÌo:í:oǯq0hP:B#:x8\,.~"՗%^rN,ٵgٲ-b8GbmbhBYj&͈D[B}@MZaoC!ZcmYBx!g؄=dqE#pUaքG[ꎬTBFu:ր@u:[<:/`:Dox^و@u :Y#V/8 :u`:GRu8F7HYHu :Au!A:94m4o,@s@sk<cn?\G89hڀxDs@sB6xa6989:6a#j!6a97Ј}s{urT*q\e(E.Qp2\e(E0(>dqO>dqO>dqO>dqM>dqaM6daaM6daK.dQaFI&dQaFIdxAGdxAGdxAGdxAaEdX1`CdX1Ed81Cd8!Ad8!`Ad!`Ad!`Ad!`?4#OF?4iN
    ;w�4�ixӲeNƜ9/r^4ixӒ%NKƜ9.r^4ixrMˆ
    5.j\4ԸiprMˆ
    5-fZ4Դ7B~=Q?Xo>�~=Q?Xo>�~=Q?Xo>�~=Q?Xo>�~b}*؛y:DchfC4,*di<B�-ٙ"O1O?ѮE|h={U"4\b0F	Dn`0J
    ҏ?�O6a$ܮzJr|3}
    PMRFR�8HtpؠϦ7/fIZPT3,l=(eʬȌv:fفnHGduQ3:('*�!7'XnMKǵ`J©x&9Eŧ#^$CtK3}
    XOȄQj2;FGq5ƣ#dM`Jզ#̖9í
    -m@;FGq5ƣ#dwQj2U3)&{F5an,61|Bfn�v뜛fwQj2;FGq5ƣ"`6ɶ;Yzn&i)C˳K)\]\"!wQj2;FGq5ԙgq5ƣ#dwQj2;FGq5ƣ#dwQj2;FGq5ƣ#dwQj2;FGq5ƣ#dwQj2;FGq5ƣ#dwQj2&K8K(Tlr|n	an5ʾ۰koͭ&!7	/_NdwQj2;FGq5ƣ#dwQj2;FGq5ƣ#dwQj2;FGq5ƣ#dwQj2;FGq5ƣ#dwQj2;FGq5RԙS?�>}�66666666666*؛yDcMEcM�>}}}ǯT_>Ͽ?؛y؛y؛y؛y؛y؛yDcMDcM=28)Ǐ5dxVG5d]SXX:X:X:X:X:X:X:X:X:X9ՑY9ՑX:X:X:X:Y9ՑY9Ո
    Ь
    ЬάЬ
    Ь
    άάЬ
    Ь
    Ь
    Ьάάάάάά
    Ь
    Ьάά
    Ь
    άάЬ
    Ь
    Ҭ*ҬSXάά
    `xV`xV`xV`xVGudxVGudxV`xV`xV`xV`xV`xV`xV`xVudxVGudxV`<t+B<t+BY9ՑY9ՑX:X9ՑY9ՑY9ՑY9Ր$.'�}����8fٌ61wZ;;;;;;;;;;;;;;;;;;;;;;;<<<<<<<<<<<<<<<<<<<<<<<<ӝtC:9·Nt:sӝtC:9·Nt:sӝtC:9·Nt:sӝtC:9·Nt:sӝtC:9·Nt:sӝHɁH$Eei8%Sl|E&~k1[fA>GB*x$%
    zy!Q>bSNi+p̑,̥Bq#,-Y LSyOpM8be4Oo63#`\GqGqGqGqGqGqGqGqGshhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhha�PÐ\@k0:t'\6_
    f-Vz=b]<03,(ERI*(,H.ۃ?+LT+&2?%ų%.9N,p3g8p3g8p3g8p3g8p!9#@gPu@gPu@gPu@gPu@gPu@gPu@gPu@gPu@gPu@gPu@gPu@gPCsdg6Fsdg6Fsdg6Fsdg6Fsdg6Fsdg6Fsdg6Fsdg6Fsdg6Fsdg6Fsdg6Fsdg6Fsdg6Fsdg6Fsdg6Fsdg6Fsdg6Fsdg6Fsdg6Fsdg6Fsdg6A.a)TXN&W14Jeӌ<e*-¸WpKA~sOT/#mօYb;LTGiGi-R*<{KTiJ)RiGijGij1QZ;KTiJij)S*CHvҕ!RZ;JTiJJT;JTiJ%ScLvU1J;ITi*IT;HUi
    !T*LvNcTvUaDv4Z#\vUaB;IUi
    %Vô\vqB;HUhWu\vq:"ՈՁB;GUhX*edvՁ2;FVGhXY#UdvUCe`v4UchT*EPvA;CUGh
    U5TvQ;CUGh	VhJhjGhJBU;BUhjh*V*ô%XvЕa
    
    ;AUh*Vô\vq;@Uh
    +KyjOz,Lի,%+W|؁;EV F)\=*=13BG,xBDlHX16#1q1c1Oc?w-[Bc<,G,b9b8pxpX^1"8XF<,BÀDBa!Fb9b9cÖ<9"#[Q-hrb9m@r#G8Dp1hp8GCBG,G!h�"08DB#08F0"9b#�#p"!�p<xqDGB0b!_##B8"9D!"!VZ7xgr@t#`rAprBD.lFD,rF#cǔr98Y>Q~XQB80@pÇ(##FDG@rppcDapG(!"8DBpF#">8p8q88�8DF8!~Dp�jlF6mۍ?Z#ֈDu:h״:^Z{P{Cִ:^ڀ{Chu״:և^kChu״:^{Chu״:^{Chu״=E-QlzC[Ǩ=E-Qlzc[Ǩ=E-Qlzc[6ǩ7zc7#^Ux=UW^UyzzzzGzzGzGzGzGzGzGzGz/Gz/b=eQw֓o__oQ}ME5o__o~Q}?X}gqt9mB'x,�68_ϮG4nŻwLE	cw{MYl?E[�$mNeVol˲<?qRsS�cuynA)K	\q/HqXLmfWs1]c1&)U&['W)]}͛Vcp3<,[%3+.:I2.g<ӓ�qj/߀si21cGƏ1c<4ya%bqY[7]bFX1cGƏ1c<4yh2XR|EͻaF ӆ�M-ήd<4yh1cGƏ1ut\7g&atr\Z-H{oGƏ1c<4yhs5cGƏ1c<4yh1cGƏ1c<4yh1cGƏ1c<4yh1cGƏ1c<4yh1cGƏ1c<4yh*p _Hݢݸ1KL�l_Mc<4yh1cGƏ1c<4yh1cGƏ1c<4yh1cGƏ1c<4yh1cGƏ1c<4yh1cGl:No?_o~Q}ME5o__o~Q}ME5o__o~Q}ME5o__o~Q}ME5o?_oQ}�s~y&}
    ?ؚෟ�bj/߀޿s~z&}
    ?ؚ෯�bj/߀޿s~
    lpOL;!!!_d0!!!!!!!!!!!!!!!!!!!"""!!!!"""!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!S>,e8΍__���Lf\]^EQrͭ-----------------------------------------------[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[\|777777777777777777777777777777777777777777D`[ttX J褒Bt"B%MI˘ֈ-XY8v168&
    0WD2Sggk8pl!qFY5<a<Xb)SU[6DR.v&2 0_Ts#<VJ>Q9G(rQ9G(rQ9G(rQ9G(rQ9G(䀍pt:q8GN#ӈt:q8GN#ӈt:q8GN#ӈt:q8GN#ӈt:q8GN#ӈtY(*zNL#L)u'JDz\|͢һ1쟡{hLFm-?jdƇW&w}:U6;~ms(SDXAYto룞LYKRyM!=ӽwr{|t1oφy-
    1hiCLZb4š-
    1hiCLZb4š-
    1hiCLZb4š-
    1hiCLZb4š-
    1hiB^ݨi[ѥoFVi[ѥoFVi[ѥoFVi[ѥoFVi[ѥoFVi[ѥoFVi[ѥoFVi[ѥoFVi[ѥoFVi[ѥoFVi[ѥoFVi[ѥoDJfiѦoFfiѦoFfiѦoFfiѦoFfiѦoFfiѦoFfiѦoFfiѦoFfiѦoFfiѦoFf'4N4
    ^Hy4M	:/0U26tzfkfqVLf[SKBݯQ%*<JUHx+UV#ĵTx-UV#ĵTjQ%<KU@xx/UbĵTzO%^ĽSlj5N&*<L8xp&j
    MU:#Sp7T
    MU6#SUM&nSʦL'*<N0x`Iڇb0&*<LU$xH3TjRUH&<MU x@7TxUG'*<Mx89TarQʣF'j<NQGڣ@x0'j
    N#QGꢏE'<Ox ?TA~QD'₨PNJ
    5B
    PxHET⊩#R*uHITq⒨R:@xDGJҒ)*-QZF)j<SU#-QZE)<SUx(OTQ⢨EQGD**<TUPNJ5DSTA⪨cMPNJUC*<UUحJ+L5[mRI2:Levc־b`u$V5
    qWҠrLWw�Vk7ilž[w#Kf=UP3=/YE	6uM.Yw{~hEE>a3Aڪ՝R%KC1KQF;3Uq6ugM"LlL._W_}MHrUoD i,zXWI[5ߖ%*I-,SdX;am[RFSUU?cq6": =E,,={<}EEQdz"8<a-_:ou"/::D/0<#`uFY:ZXkdFcױ78V]XK7VonX[:cwǫ`Fu,ԱԱécR刎^؄#ydu,K78G=Xwǩb`u.R绀9=0=1:c`s؀1c=#w԰9#nG=`ss`s݈۲9@sٌ#j	o::z	a|XSn7�N<C6m2vfL$9E^ęia0CIOɻKX@ڱ0R(ON2%E$(k.2NY7K(3
    Te=B{L)*mƒn$6Sfh__
    f:)%8%ɏrdz39Lc=}ǯ#08C3f1f0G>0>�_>Gz#׈cf0:І><=x׏_tGzzph77}lx㇭Gz߻֏\=tG:[xc#wh!q8`##zb=`z_Z=Xqz@zc"8W#2Ȏ.z	
    o&9[NԼ#޼e|)7XXعPPXXTʆʆJFJFFʆʆJFJFJFJFJFJFJFJFJFJFJFJFFFFFJJJJJJJJJJIIIIIIIIIIIIFFFFɆFFIFFFFFIFIIIHHHHHHHHHHȆȆȆȆȆȆȆȆȆȆHHHHHHHHHHHHFHHFHFHFHFHGo#B;#�}lTȿ3N7?odu>Fz'󩓜y̵]%I)\ex5G�K&굨+5K*us-VAh;?/:EwՆ%Ն+2*p(:5˶*೬UWm2VڰĢ7SÕP2Y]WVU%65LU!qu}g!e	W~++
    9Wض5Z2i€ȑb|ȩCr"[F[fj~*B{鎔ޮNkõi[JK*`TQ\r}"J޵YO&/<ּuK'd$Z-.4O}is2U3hK,I5
    C+O0ʵ4(_'ړ%�u
    :,2yVwz]Aq)m^LŸ7'�!-S)^vh.EV5$nR)5ҍ
    OI]XhEܵ@RGtpR6ШƧQސo37<sTh[j]njU4;SUZjU͗Z}ӝG"3Z5KjE
    NǜVE	ZjYT"xuU Ş8~l &-\Vmbꁱe†X}-ٹ8&�@8
    HѯB"kK*.p,R_(Щ4+*<sEy!Lbzӯ�i$ĩ"2R7 ./�Ya=<-k	m̵϶\vO1ZE�g{m�;e-lToQ�'Os6%9T8Q)NUg֨7?o:�3N$SYGPoO:�ZH#Ah^Kf7Rj�P%/)BsqȊ/F_?~/r'Y4W3LIqDK{��ԗrA2xW66)ѥIM?
    :�[5qLj6^)+--!m3'Vo8rVo$ImmY`&RRp\'ӥ�%qE>L*u4[#\֔�K>c11Ib܂h<(F
    t񵜵) ̉SqO@?�Po߶CcNLx3P!fC@5ZqU.^yIEձ?iUlO
    )3P!fC@5&j<Lxe<
    {[/0gbT-<*Wv(35&j<Lx3P!fC@]U؎\.ꫥΏ(Kzʱ7C3)eQ@5&j<Lx|wx3P!fC@5&j<Lx3P!fC@5&j<Lx3P!fC@5&j<Lx3P!fC@5&j<Lx3P!fC@5&j
    Tʩyja5k=@~/XEZl{
    |m~*݉84.P	馘+<ϼLx3P!fC@5&j<Lx3P!fC@5&j<Lx3P!fC@5&j<Lx3P!fC@5&j<Lx3P!fC@5CPo׶A?ڷ-8'BogM	{d&fQ]:r/=x38'Bo`t2_+̤-8e)mŻ)Km
    +NS%Y.sgS,|Mb
    s%g3"t.OAᔕ�vUؚ[fŖHΉ*	Y'65gNƗqdzCli]R46ch	;U&[=)KWS\-*�﬙wʩ;z2p&\2Mwb
    4f6l&ʖ1~BtY<&̗su/7DُhEˢlzf#3whEi̔y6eA3=T)DْA^ĐL|tӻ41'2D٧gPF=6m<h3f>u;߹?]@^}�j$u5)�_&gȀ/5GYٖܽTꯞz}TꯞШ;2z}^dpS2nq
    ũ3xԦqjLެuUgڳyEV~f,[eVR^e}r5&b$ĵMaN"b8dJY>6Y
    oٻNA^r웺 \l_F)OrWHb΁/{M/KtՉZdNe)qVOF)3&蒧sˌcHGEj2cyVӊKÎcHRr*QU%JU|+쥓,ȣ_ۉmyi"BȫVDB4v
    MsG|;;TuH.ZlFIPcmW8'*8bfJdJgܟ?�Smf6m1clٍf6m1clٍf6+)Nlٍf6H:cl
    ,2t4F6$$1clٍf6m1clٍf�lٍf6m1clٍf6m1clٍ(x,3E&(x,n坳f6m1clٍvrͳf6m1clٍf6m1clٍf6m1clٍf6m1clٍf6m1clٍf6m1clٍf6m1bnLN]@^}Obt^j_Q#UIjJjdf^j}JPz5}DU%)/[]9T'&YtcP'X;~"NLƠN9}keU|_RT{ $ydlKdNJ{7bԼ%t6JA:N].;k|D:49#xlZʔUM,[*r3/9U%-K[ܢUmNvSL')G=iOPgy1`t<ԌS5[QD8ԄX:M,!pcSJY䯒IK:$2UM;K1&RNnU@>=j(y\526
    QIq|n/ȦiI|2rVVN+*xy'hک#&UV1%_f$IAU^RU0)e<8rɌH$z$+!1Yp]]݄y@CVuY28jB_kFTEì(P	L.<˘иBX;Ɋ
    
    :r}-e6aX­=#R)d'`]DqR|pJU#ydlSSV1B^pK$cLV�ɠ6"j,9[Ւ
    )]*gY<	: ˆs
    ԟmC
    REwPo濩׶B샄mDqɇQ0S5:
    =*{pC\UJq=ZqhtCmqW]58Tj6²mDqӜ1b
    Jٴ:u]]
    }/eޕ2<7/ed{޲jumʝ;V"䵦rښD}ø)5U?0QeMɁ+ob]jmeGV�<Ҧ':==d|)2.8VJj.rMSZaYILj0eMO”nGVR{C
    ʇ(KRD»6a
    5IYʯq5`^Μ;Ǜc<_[	Id/@沦teD*mPs1|4
    ڞ+ORH{~Ė\_ciO
    Ti*XO&V4Tf)8X`
    OpXqEU,h*/vAarrXU'%4]w+X겭$<^[=&WLIQbLԶ,zNՕP@LS2Bę&YU,:0/4Y]}}ꙇYftqئ<ӯBd3!HܒĠ4&:jfb$iЄWc_z&`=n+H){.g	j$
    eA_gCX"YH&a+X){.Q.U/HJ@%DR\H9\sm"M钾;n+놗$LaU3 ]9y?]@^}	c"Hwv7v7v7v7v7v7v7v7v7v7v7v7v7v7v7v7v7v7veJq.OLGYqӱӱӱӱӱ#Pf8VNNNN*P'&7v7v7v1~fiiiiíLYqcqcqcqcq`q7;տp&,͸ӱӱӱӱӰNrn4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4n4_(3i7_o[&Mɚɚ'$T$gM!(v';=Di^9$
    Ҍ_wnL	o3\*}#3LDfTFf(!F/gڳr
    *#ͩvZܥPBΚye_dW&bz`,)#YU&wU2bfw&[�y淥2|KMm߷ƀGqG&h52Tc^*IsCw~.IiqF7N)K]Շ#ss%a(zeCw/Q(h[\S,{ 9E07;G2V	Ø*B#76֥dٝrdrŴ⹥mAy⠿ܟ?Sm<cJ
    bʑ̱2}z3(-Ԫ)XR>3E;*Gף2J"冤L2}z3Md`2}z3+L5%Zɺ&TFe冤L)LX`Uƒ*GK.	bf	fMy"@I.sJs<Q`i/ؒlo=:deBndޜr'fIluL&e$)@2U=sS}KK2
    ^5NV�7Ekv2)ȧ`^ᥫu*--4y`-Bm63X'W,2Sr-YVl5' fMs/.R=#)ErJrĹPDd-dSNE;dSNE;dSNE;dSNE;dSNE;dSNE;dSNE;dSNE;dSNE;dSNE;dSNE;dSNE;dSNE;dSNE;dSNE;dSNE;dSNE;dS`?uЄ ލK[o
    ԵލK[o
    Ѩꛊ~䷆jZKxoFruM?]u3JMAky-Ѩ-o%7Q7vYZ<-;lUT%2UJ:b2tQk*EYV?x}˥g6b�bra].;L"@F݂zѦw@R"'#DOC5Y5	D*aKTvM5_fJPMWs,q;nSVïqK던@7W1^8ًAh�JTbrPQռ\XhqCuqKTW`]@^}OZUG	
    U1\
    )Mo]
    RBTOn{~5UiW
    $!9,sS9iEUT	jOMG-;?5*RB]
    RDVM<TFН:ʳKTL+*pj;{ܕS@NnLN9'Wf\[1(hޑ	P@ޢr2D8:AԢ"WԞ~`LeIco5U37X6!궆H'\Reb%%,Qk]9"Mxgt$e"FfpMRL@@%<}lN3I<MۤQNx2ꐓ%$[YU5,TM/!䱄iS4ZR7M
    RtN\aXh
    pKIb\O _hJ"Y?<ȖQ'I۔
    �dVة&X|ZX\	2)5 h%)*zR *rye%B�xxTFN4e8Y&7nE:f뙿+ڡ
    :FRyB/[,
    lXذ5`kbŁ[,
    lXذ5`kbŁ[,WD]Ł[,
    lXĭڣ[6R )ؑlXذ5`kbŁ[,
    lXذ5`kbŁ[&s!5`kbŁ[,
    lXذ5`kbŁ[,
    lXذaތ7DŁ[,
    lXذ5`%
    |6$k[5oi[7[,S%",
    lXذ5`kbŁ[,
    lXذ5`kbŀ
    =a&,
    lXذ5`7a>,
    lXذ5`kbŁ[,
    lXذ5`kbŁ[,
    lXذ5`kbŁ[,
    lXذ5`kb4d3Po濩׶A?ڷfUYtop̀3 gF:7f@0%0:7f@΍0W,qni,ȫ܊3sId0vnE\meqVvπRɉ痪,ǽe.|)򭘖ޱ'p
    buS& v,y,ΪXɤ۞ٴ_jyyxIܬNALK9|Z]v?Y7ظU,dON'Ud	~ۜ9dMXo2ri&RNRsgU2bS{2{|Z%p5 n@/W䠨TmT#fl@>2WU)̦g9ʫ͢O]�'7?o[O]sxm
    sY
    k!,l Vmg@~xYb+g6V3!'=y27fnX~t\57]z2Y>5s%מU
    zeH*9|̢joGLɥ_ku32Xզ`cS/=rM&FqMM[)ɑ̣.N pM_.c^Z[圝m-̔N%`K}j#2fw_*MډCkosfP[X.IɛO�r\6LA4ә2}3 ITٻ=,A=L
    W9klIj,&�}lfnfDYV;fT߹?]@?o.辉,
    X$4I`h%KD,
    X$4I`h%KD,
    X$&LJ)+D,
    X$4I`Je%;*,
    X$4I`h%Z¥Iv,
    X$T.%KD,
    X$4I`h(Jx閉,
    X$4I`a~0բKD,
    X$4I`0yKD,
    X$4I`py.\mtI`h%KD,
    X
    :V,QOknPKD,	6/1tI`haRaMKsX$4I`h%¥V,
    X$4I`h%KD,
    X$4I`h%KD,
    X$4I`h%KD,
    X$4I`h%KD,
    X$4I`h%KD,
    X$2uЄ!P<*8sP
    U9WLFUT
    0߂q6_rbQ|Uf2u*aq;I1"=	$q1ԀL@GDjj@j& NL.<�UoH<Ιz7RS�GaTUÖ8rѨ%ItF:yiK>ho
    )qXPX9
    5@]<O_<Yz}fdљIOUK[Kŋ:/}LVWѼ	DE'?g%Nv5i;%M*raSkzFI{BB^iy$pYNbS]/#"kjhS\N4Ч+1ԅXq925oHaO=8vjR6n&u꿤 U2vr(v_Z^3^;VW+*rPYJ[>_ӷ;3pU6rzSDGKuE1dPZƬWR7?o	AbbqTֶl)kfšt!3W
    Akfš#ol)GB5p#ofMSԺ{1ZٳxpSي͛Å58F.v@b!YIټu$EWA|5%i"J=r"wib'el,iLͱy1![ULdTbd!ura[N+luS,^,\wEޞ:uT,'bHRKHASw
    l*:I6u6T-XP'M=Ee:ڮ92#W)`m$M8p3D=O=,,zo2W:jy2}iTU1`lI{]qJiFZH{ZٳxpL4P@N!3suTte!˜@
    [bH&,nT͛Ae]D4 &_11b"H{`,,flU9ĺELfW")~Zʿ?]@^}	q(IT`e&i!Av	HfP]f(.3Iuz%3&i!Av	Hfq7W_\9e/`e&i![‚47W_(jQF@4')0΢(u-HS%rcS4+YM_$OiҬM6L%`}RjhT#Abt:6VSNζ3lguz%3lg	Ӂ+J9g5OɆMwXVqPS
    lg5kc8q[ƶ3lg5kc8q[ƶ3lg5kc8q[ƶ3lg5kc8q[ƶ3lg5kc8q[ƶ3lg5kc8q[ƶ3lg5kc8q[ƶ3lg5kc8q[ƶ3lg5kc8q[ƶ3lg5kc8q[ƶ3lg5X>"w
    :'WP]Ji,L%4J&j%laeK8>YQtƑw¥,�:pUy-3c"jE^M)NU
    #/
    ^ј2L^P2P5E"Y! %ف'y
    V3
    ʿ1ysJT2g5be`tt4.tM܂Б	`}p0՗S0\rG
    Y0-J[t<4]ɦ|tĹHMɅXJYp-]MśvS7&U3K8|)\c�W~u��Smԧ1;s;s;s;s;s;s;s;s;s;s;s;s;s;s;s;s;s;s;s;
    2[8"To8ۙۙۙۙۙؑngcngcngcngcngcngcngcngaZbFS6".mmmmmmmmngcngaZbFS6".mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm_'7_o	A˼);`9zz
    N9sO[aKvɚVÎ}l58ޞPRݲfs0.9w'lKvɚVodÎ_gWT©Ou:r/p\7z{޲jj&q8pjRST%v&(G
    K[ee{X3	Ӫn2D.ǡ*]R*jB'OMŬ'O<WR+p<)=T*QuMTM:DZP)Uv-a	pTYz`j;;=uSqMHZS*o,Kj#ˎ_Lg|�8Sq2yU5T2詥.8pj T%P
    o"XOȎ\b8TƲ'
    D
    'S;[q::U<rCuЄ fN�ܩ\9SvU.xeUI51<d;TJΠc\sSvU.xeP&N՜qӜ|y5tK3O1T.c8odo)T,\=6hfT-%-=qR{^FSJz t;U.;]&'Gv>}EG0E	n']8ݩ1gUH8''NU'M2O?w>
    qONM%(RޖTEsRX<4w8LQJzsZ<ONedӌc}]*f9xRܾdF
    Y8ޢf{[Ӣ/1la]GvW~)-\'i(nRR<p	lWTTYJ:Yf5%uvt�?]@^}	]"FH7H7H7H7H7H7H7H7H7H7H7H7H7H7H7H7H7H7H/MF?qqqqqNl)_H7H7H7H7H7H=U=gAAAAAAAAAA@S61[$$$$t}*ʻ$$$$$$$$$$$$$	hbhU vUi i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i 
    SoPo׶A?ڷ5_	ȿc3_1m6@64ۨUQZ.vwnVpM8ۂ":%g7%
    U3}UYمENb*ۂ":gڳyiInTZp\H]
    -f9+٨!eͮiHUe%UM%TV9rS"蛻֞f>ipM}Fd!$e٨!eͮd2ɳl#C-6FeK^"wC)ʡe;ꕪi-[HR328)j>!IKj0!+s'g2T.RGRYB	mUfD3	U\Ȧz&'lZ\^BFPEHUbKI'O1,?�3E�ͽaw2;h5[3|Q9%L!+aN<A	Jv^zْ�50o
    r}9s)lupJ	QLsEe痸f)+ɒ?r~�5N	լMrn	92B3-H4y�	94ˈQd'fZiJA2B3M	ŴKAQ0L[M (ϵgok!9/kpXu*[XĚ:YE%ݮͷ;T1oh3ᘵdi)3*+y*	F_Kl)pE{H\e2ۅVS0Hp):p[kV_R%Bs(24\KiV\"r&d[0,״0&i6PUa{H31k}ӖS.f9SӜU=WU24JRQ>}"ܳgeELWfoIs{{ĺɱl~k
    43v?%u,唍
    &d]')$iY,b9MO)0-LӦtYfN93-k5%=eD$!8s1wu߹?]@~}LYȤ"H2) Ȥ"H2) Ȥ"H2) Ȥ"H2) Ȥ"H1er?)bor) Ȥ"H2) /H./) Ȥ"H2) Ȥ"H2) Ȥ"H2) Ȥ"H2) Ȥ"
    c"H2) Ȥ"H2) Ȥ"H2) Ȥ"H2) Ȥ"H2) Ȥ"H2) Ȥ"H2) Ȥ"H2) Ȥ"H2) Ȥ"H2) Ȥ"H2) Ȥ"H2) Ȥ"H2) Ȥ"H2) Ȥ"H2) Ȥ"H2) Ȥ"H2) Ȥ"H2) Ȥ"H2) Ȥ"H2) Ȥ"H2) Ȥ"H2) b~�3N7?o:�3Czzq)m6zbi>T*Zn-7ʚMMSSp|>T*jn57ʚMMSSl|>T*jm56ʚcMMSSp|>T*zm=6ʞcMMRp|i>T*jm56ʚcKMRp|i>T*jn57ʚMMSSl|>T*Zn-7ʖMMSSp|i>T*Zn-7ʚ*jm56ʚcMMSSl|>T*jn57ʚMMSSl|>T*jn57ʚKMRp|>T*jn57ʖKMRp|i>T*Zn57ʚMMSSp|>T*jn-7ʖKMSSp|>T*jn57ʚMMSSp|>T*Zn-7ʖKMSSl|>T*jn57ʚMMRp|i>T*jn57ʚMMRp|i>T*Zn-7TZ[..6��?�m]_RdQ!F4J"$$IGJft.)1O<"EE:Q�S-%{ZJ#mLFڙi+܍2Wjer6I^mS-%{ZJ#mLFڙi+܍2Wjer6I^mS-%{ZJ#mLFڙi+܍2Wjer6I^mS-%{ZJ#mLFڙi+܍2Wjer6I^mS-%{ZJ#mLFڙi+܍2Wjer6I^mS-%{ZJ#mLFڙi+܍2Wjer.NzJ#m4ni/sM)xۚiK6J^!R
    4җmCm4ni/sM)xۚiK6J^!R
    4җmCm4ni/sM)xۚiK6J^!R
    4җmCm4ni/sM)xۚiK6J^!R
    4җmCm4ni/sM)xۚiK6J^!R
    4җmCm4ni/sM)xۚiK6J^!RJ6I=-$kL
    2Op6I=-$kL
    2Op6I=-$kL
    2Op6I=-$kL
    2Op6I=-$kL
    2Op6I=-$kL
    2Op6I=-$kL
    2Op6I=-$kL
    2Op6I=-$kL
    2Op6I=-$kL
    2Op6I=-$29ͦq3`h]9
    y28d}$InZC�|էY[yIzi鄾4RẤF%FQKh&u0PYZ]  "ZC$ҖN$RHV	?8D[=,MѺcռ0S8S&-x7RMy$l07M']&WgQVt$wj"OOLn|BO&˭}am.[Iu9
    MIJҕ!dJV"Q-%FG~bc*ȧoM9g�:bi2=퇐v"r-ZL#QEC,B"mFJ*RrK/?`eE"\|6Þ-0"yJ);��[C<an%1Q̢
    KF̝<ܽG`pt&#	58>IP̈[l!1fr*5	C%v>"v1C:[AnRR"$eADȸVX(#&3DCDs%[ۨ%GA[#%2>SгX52D&ؖa!VCS#JQ	Y&v2J[6v)*wzܦNYyF)iAe03Rb"u͡Q%kf)QdfDfDfFt
    l*7_}Ll+q	44RNkFЕPJ:Je23g<M.Gm/u	v')mxĪ-9LKYq4q0DĢ`
    f%L{y0Ciψ6TDg$LDT76n/{C{ˈdcbiztw$,Qq[(R4RrY)ev_<L*"\|6
    ,&%Nd;3x^<c1WU3x^<c1WU3x^<c1WU3x^<c1WU3x^<c1WU3x^<c1WU3x^<c1WU3x^<c1WU3x^<c1WU3x^<c1WU3x^<cH%h+2#):>8Ⲿp2j;_ft>τ#2Y8m1ɼ<;/NkЕ4%&I5$</Gi#m7<mԶJ&M>6JRMRJr*N*U
    qCI4ӈp7r<㤻D6>t}3m*o%n>e4DZL(A,d❗ʢ
    *{pdi�7QW*hwz*M7=
    (Ĩ;fdi.gѧG{M+%Lc
    \#41YEAJXG˰NJ<h&K.;ua,K|`z"Xn3K͜AZQ6;Ng"oHlDoC$4"!"S\+G`-)ԑÑ̺bc08ly;hr-ד(JS
    )/D(6Zeh(wlLEd},p<Y0푼T-F{ϣɭ=*D!.`|S7(C6YCOvЧZ:gj,,We'5Tl%!q;g+!8-vL<&OB0p캶il%N+! ea?gs0Wg,R\`r祧"mƊ&6tK(s-V*;6R3CD1yM3'#^:˭Sf:Q%sc"ۉ5me:J'aQDꑔRo(L]MK8r@x}㮬7}7m7DBXiD8ᡱj`zED\Y\K$6[\DC
    JBa&I,RՃ*`wX;V|U*`wX;V|U*`wX;V|U*`wX;V|U*`fxifxifxifxifxifxifxifxifxifxifxif�_ɾc1o7|>M&|ɾc1o7|>M&|ɾc1o7|>M&|ɾc1o7|>M&|ɾc1o7|>M&|ɾc1HLlQ6#K2&݉Ma$-ܔȈΕ8P"te&ؕ3í)a3IęM!T0?_6%�v`aYKt4[(qdKąD:9dI[J9DfA$]Ze{C>&gPkD,CYH^BpۨmJB')
    RE)Qu&q46RR"\4FFYFHN[y[&vnA&_(JTlL+Yk)
    PIäD7FLDfCC&ܧ򨪮C6
    g�YaxOE9_+%TR>4Ԉu75#Tz7̵oj#<2GX.ye?2GX.ye\|Q`:s-D]7̵oj#<2E7̵oj#<2GX.ye\|Q`:s-DS�\:s-Duz	7o#'<3GXNyg|Pa9:s=Duz	7o'<3XNyg|Pa:s=@uz
    7o7<3Xnyg|Pa:s=@uzBp�?�s@j#hMDsiM54	:s@j#4	:s@j#4	:s@j#4	:s@j#4	.4GXyk&k&7uo#<5GX.yk\|Q`:s]@u満7uo<5X.yk\|P`:s]@u満7uo'<5XNyk|Pa9:s]@u満	7uOBs]@u満	7uoG<5GXyktQb9鮢:s]Du盦7Mu#n#W<5GXyk\tQb鮢:s]Du盦�"鮢:smDu盦7M+nj"HymtQb鶢:smDu盦ڈ7M3nj#g<6GXymtQc9鶢:smDu盦ڈ7M3nj#g<6GXymtQcٶ:smDu盦ڈ6͵;nj":J?C!$xeRm,GȣЗ4M5F{m�K?"M0m⛉b:^C&%}H$]qmԡo|m
    Lc!D6!ȇa`\7<qD}q>ᛮPҝR&Ro�K?"Uj?ZA6K)*mM:-@H`7]Zq6h'ʴ*8J[mGtzmrGTTqT"zJGzL^.^۱Zma!i"
    QBr*Z)O.IJ}UmeB0
    ھ;W(.}Uτ\IS|  nX*h'>p�p;~x_៻b
    *+31h+E\cھd.
    +vIHvQE|\";W/Тھ;WjE2LvEھ.Q|v_4|w|\Eھ._ھ.|Qݤ{E|UvXE4Q_⢾***.VMFnVQ_QGt	.$(h.*fE$"J**
    3p#73hrp#730*3i#33p#73p#3ͻe$讞˥P??4A$ʋ�?ͪ"*�ꐥZ\BE"2:;_)*.KQt�pW]O=xT?GR}n]/vz?rYO;1IN0DPD^w;;tUA?xdPW;0%TX{OlV(&�`4{tܧd^I]˴REI=�v۴T}*EA_
    J8/'GM޹UvI<kG]wTA:jr3t]2qiWgI�pIPgAlL.]~rRF}U^
    ^kغ.P*
    hvъn+
    Jpx\(iT.{P*/bQњC4Q@BUUsW_H;SE@@?fP\!pS@T*BE
    h*7E|TTTC*!Q
    Qeվ{/TOe¨E$Ɖ%h]#]�_!GtIJiI8gop-ݾ[û|#vnG܎3r8wop-᝾[û|#vnG܎3r8gop-᝾[;|#vnG܎3r8gop-᝾[;|#vnG܎3r8gop-᝾[;|#vnG
    ܎+r8Wop-][»|+r8Wop-]Ep-]Ep-X8Gop,CvnG܎p,Cw!;X8Go!;|p,Cw!;Ep"8G~b#Hp,Cw!3ܾX|3ܾX{w!3ܾX{H/!,C=gw!,C=ߤX{H~b"3Egw!,C=ϤX{H>b}"3Egs!,C=ߥ}"3]~xg;9ߥ}.swsH>b}.swsK3]>xg99ϥ}.ϥ9ϥ·>xV
    ][K+swn}.ϥ·>xV
    ][K+swn}.ϥ>J]CvtOVU)o0|ʽ:
    px?ϛ}YWAo0:'o*7MFzGD�>me^ҝ�8I[hGD�>me^ҝ�8I[;g=X?99rZ}APgCNIlғQ)I#!7WO”BTL%,
    V]I!%JK))YMdI3*hQ9'GloCnS<+Kd3hf#TPҥ$يYZ6aJ%M)FP&\NZ%eۄ�ohXPJ"V4SéGA%XqUO4M*#JPWPKBd*"4*#2RTFFFFddddt	܆/.k.|a-n3BFJɩY'pEϧ{ĩ-y9kKik:Vĝt=H�"fDkޙuRM0Q4҃$j	R.
    wC+J4<DiQ+'%Wh32:&NS2u#m"(5JNV$ ԣ"?m�t7:
    p?ϛ}YW�\{N,ƕ&dEJJJmJ2"*̈1-6/%Q/ '5TRȎ22,ً^<RKƄ>D<RVM4fkWZALn
    _,3*iReq(g{6I"FkBa4%OGvdt[b7!ha(J,Ժ624/7o#?0B]4)jΊs2UUJ>)\UIjn7L`&RmKޔa9(A5584oMZv%)JM&	$Ob`Z".5o!b
    "-/JJ1P̷i,`!-#}Sk�ILhe3(ueI[DSҷFy
    K%Ij#>�o
    ӠNqkp,o3|q&Ң3>?-DlNp
    [Ru
    Ж/|Xy#t-xf}l!hm%)fv7
    {Αn._/[7o9[SL&Twi^Jm'gCA(6n6-M6(*w㡳Si^~?>C(IJQ%)"]3;WLYY	m}HKdsvfFdA݈ɥkVI?{>kIfLvVRքQDovř(&931Uw+dٌGť(ZAe
    BtQ)#|;ݹ"^&1eoš
    BzLI]|'U=I$6Ĕ%nFB2O�ntiЦ	IJDDIG)-k}xwS!aIPtm٩IIm;n.ajaq<ܴܘf!&kI26PqS.i	3},nklĖZHRr	('N~:�8I[;fW?YWJ7imLC .$Sk*
    DPdg/$Շ<;VHXs#a/$Շ<;VHX"}9JdD)ȔY%E$IREITf
    2H0ȖĩAYM%WJݺWS|\RHRޖD: j\FDd:Ȏ$	KIyؔB[K%iAR<IH*OSH8-ylS;44e*U4RtVc^Iyy$v9ڰ痒GjÞ^Iyy$v9ڰ痒GjYCi|^o~/N(ZUTtSAdd_?39t2_K
    ,ZIRIe*4D$H$RUCll< cI
    y&ZhRi:1
    7y36b[gE&
    Y&y%Ih*j!c�-zO}&m-rg2Ŗ0m	kYJk^I]HXs#a/$Շ<;VHXs#a/$ՁLؙ]8*"w+s2M7ܖĸ{ڍhT3Z2TY*3QPgH29eE"SnDKQ+'Tfp[Dk=*ʡQ-)QD&6[}졊U48|R#!MPfqM0ĝ
    >C;N 	"I'mJ,!Te$Je	Cm
    5(BD	L)%)JH)"""""*<;VHXs#a/$Շ<;VHX̿�^�+x?o{_/#{ee\HXs#a/$Շ<;VHXs#a/$Շ<;VHXs#a/$Շ<;VHXs#a/$Շ<;VHXs#a/$Շ<;VHXs#a/$Շ<;VHXs#a/$Շ<;VHXs#a/$Շ<;VHXs#a/$Շ<;VHXs#a/$Ճٽb*\m=jQ)9H\"%**HQ!
    r|)oyD7	FDrVdMIJAf"̥*NC_i$Ҭ	*NRTT̎ᘙAˣ%4!dBLKL%4DdQ)EQ1pr"\BBeq	CmD-Ĕ%jBȖ(Ң%!RDE%SgR`{٪|lnVK^n)ܙLnDBm/;pCY]I*@DXdˆg2̨j,㖥-KY*P$Uf^!cmfj<"TfgA&fu痒GjÞ^Iyy$v9ڰ痒GjÞ^Iyy$v9ڰ痒GjÞ^Iyy$v9ڰ痒GjÞ^Iyy$v9ڰ痒GjÞ^Iyy$v9ڰ痒GjÞ^Iyy$v9ڰ痒GjÞ^Iyy$v9ڰ痒GjÞ^Iyy$v9ڰ痒GjÞ^Iyy$v9ڰ痒GjÞ^Iyy$v--֗&/moql8AP)_EM&dG}�8I[;S	7awՕ{Jt&#=n#6iN$atOVU)o0|ʽ:
    p?ϛ}YWAo0:'o*7MFzGD�>me^ҝ�8I[|;S	7aoՕ{Jt&#=m#6iN$atOVU)o0|ʽ:
    p?ϛ}YWAo0:'o*7MFzGD�:me^ҝ�8I[MS	7aՕ{Jt&#=n#6iN$atOVU)o0|ʽ:
    px?ϛ}YWAo0:'o*7MFzGD�>me^ҝ�8I[|;S	7agՕ{Jt&#=n#6iN$aXӱC
    RӍyW xhI9E)(z±ZlwXV+M`
    iތ"æJ#+1eӦfX]:aeӦfX]:aeӦfX]:aeӦfX]:aeӦfX]:aeӦfX]:aeӦfX]:aeӦfX]:aeӦfX]:aeӦfX]:?CG(uat�E,.0P2E,.0P2E,.0P2E,.0P2E,.0P2E,.0P2E,.0P2E,.0P2E,.0P2E,.0P2E,.0P2E,.0P.E.0P.E,.0P2E,.0P2E,.0P2E,.0P2E,.0P2E,.0P2E,.0P.E.0P.E,.0P2E,.0P2El.m:Ͱ|YNz(uat釢YvNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNP6f]>?C(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(uat釢YNz(tsm"ery93$[OkhSCfMn!&"RTO5w�W�?�8b[EBN3+
    ":j3+Di# i(q>W].QB[b2v�Ų_YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYk!C9,s\Y渲qd3g5Ők!C9,s\Y渲qd3g5Ők!C9,s\Y渲qd3g5Ők!C9,s\Y渲qd3g5Ők!C9,s\Y渲qd3g5Ők!@R8_$BJMD}&3":)1e:>)ÇSi3-mDPFdFI!&dFAA"
    }(SZi2J"bZfFDI̎:]2x~e@-a"҅()8pYTNAĽKs%o-YNJtQUx#GB֐�l)qPNݡZ
    w)JB%Mrtve_Ger~/[y! ~504-"6]GA=tR
    z5S*} <LVK!Tft&
    #e0igiBDq0B)Mm*('^
    /)̓.cM(Cf3J^A&A(y$!36S8k"%o|Q%r5SAJDT"Rej	QF[KlE%PTRBS1OٖOʝm4물[rN┤-<fQqRel-qV˭е2$T:Ib}%ydf2*Qfq)3"5o=r]2uЄ*'%m:tRZ5dEgIK|j6k4\A"QHZmSq1a/+A,3Ɏ7#R<aSAAZ~2
    dD*HO:F_%^0;6Q)<.AfG/DYIsQҡ_K)f
    2SGWN	J"ږd[N%yYMI'|NJNQd*V+bXV+bXV+bXV+bXV+bXV+bXV+bXV+bXV+bXV+bXV+Xy,c<1w;Ōg3cxXy,c<1w;Ōg3cxXy,c<1w;Ōg3cxXy,c<1w;Ōg3cxXy,c<1w;Ōg3cxXy,bŰFFKwTjIekW.<T"ʦnVRHZ(Jüf_RdIQRDT(m@VL2UKSx6jYT""΂":.Ϣg0nI(uU-h[¢
    Geu*hm	;bA)}DCJtmm-&Ji
    jC͛1!W2f1EIFg
    w�p(R,>yqH4iQWK-4ϴFaiM:2 qr&QK%GLRLdR%COӳƻBW
    bɕ!(UJ|-š&XK(H~T>+5%L"'ƠpHޚ0(4)CVݘn0ģ!]DA'%UJZ23zA4Kꇄu4ePDQFNo]RW2-C6@xkqD=.=EàaKiWscd6=-4Y{D
    )8wR!UCivY$v_>TT0&!mPC$C�-({N-qpЦ-GnIumRRQj%etC1-&dԜwCFf'Ay6ڋV1Wbb^[.2T6D2,ɣQ%Փ6"K2j#[̗n&D1;IR,JKD7I֞a
    !\\g{qJmKi
    j2A8KSc-T;1
    _n8RhDKJQ8n-QŶMxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxb
    ϳ+>;
    ϳ+>;
    ϳ+>;
    ϳ+>;
    ϳ+>;
    ϳ+>;
    ϳ+>;
    ϳ+>;
    ϳ+>;
    ϳ+>;
    ϳ+>;
    ϳ+>	<B'W
    !^+xxO	<B'W
    !^+xxO	<B'W
    !^+xxO	<B'W
    !^+xxO	<B'W
    !^+xxO	<C
    jX{I-s3KOQf_WK49U9KBɵ	̣86ȲZ5OIWv.S=8;ȳt%w,2KRR
    Mkq$f(Ȯp�)C9Ij7|ܕTA)d!Dy*JTTdGIϢ|32Z'_q(n`'#
    *JbDOx;oͦqhn{;KnF)eV֣t>3)ęe.gO2Kde(vZcf},Q򲒃?ER:)VL4vzYOk"IuQbG
    >X|.(.6*8]`lDq؈uQb#G
    ?%E?o
    >X|.6"8]`lTq؈ub#G
    >X|.6*8]`lDq؈uAIb#G
    >X|&6"8M`lDq؈5kb#?#"8]`lDq؈5kb#G	
    >XF>Y|&.Ikc'O	JL>Y<|..Ik#c'FO	>Y<|&62xMdS2xMdld5Sk#c'FO	>Y<|&6*xMdlTة5Sk#bFO	"Yd5SBk#bFO	"Y:D&6*xMdlTة!5SBk#bHFN	"Y:D&6*tMdlDة!5SBk"SGD&6*tMdlD*d59hMhlZZֆ5hMhQG-	
    kCc&6?-	
    kCcz&6?/	
    BkCc&6?/~^ZֆrOCcz67/
    Ccz6?/
    Ccrzܼ67/
    Ccrzܼ67/
    Ccrzܼ67/
    BF剕`XRqlj7.gmN)Nd9IZd*!/e=IguW~S.Kf)B\AhBV呖O18VoDD4[mJCiiHA
    Y Y)"�8rK,ˢT|l6q8JRB
    	R҅(К$2W3zW,C!&T!*qQfHM	IPDI""""JH�e M%-0KG-%Rwyj)FddfW!Ie~CO�r&ݬGK?m"AG1pbA"b=�T*s٦tB}x\!wغ^&.bW.RD
    QTU@NHB
    h
    h.p.MFhQ@Wpњ*WUPT*.بT.)Er要P^W}{{
    =bPXڅø2RBYݤteW߅tzK_kq"QN1E'HM`"V.+~t~H]1p�jtWVBPY
    ú+twEb++tbtbX)جV.wh]}+n
    l\f٬WV)SH߱Y]L
    RPY'_>%7i U$w]QGK$fc18q3Nc18q3K18jp,8ia3S,8ia3S,8ia3K1XqÌfc4,8ia3K1XqÌf1XqÌfc4,8ia3K1XqÌfc4,8ia3K1XqÌfc4,8ia3K1XqÌfc4,8ia3K1XqÌQ$ÌfbÌTXq*,8E1QvwEE'3K*.註;*.註;gtT]QvwEEgtT]QvwEEgtT]QvwEEgtT]QvwEEb*.註;*.a;]Ìv;;]c;]gtv;;C;]vwGk;];]gtv;;C;C.otPrXgGt�_Fꯅ-}J[ѣWŽ}-ѿtzGK?k/iKu4oxQ'R~gGtw)nF3_
    :YY72~(hT:ԔSڠԒ3QRgt蠌>h̗אepD(Gn*;~,yfD}2*Jru1�gHmVj֕vIYWN"bm̂Q)'34$#;W(:?zaʇH*YmRJ.$GI] -&̌22F]N7Ced%w U:JHRo)SAREMfwLȪ#?aUe))/$I;tȂY`qIʓ*fUTARWF5J袄e#2$Et/t/h:=U𣥟O'IR~2|YzTy4E9Y'E$tTl7Q#JYJh4fjUEtJNJYtj+$epd	79lqmEfEM&djS$B&~c,IA8"황~>q""$%R2NW3̩õE	Fn8yF RdTT&na0$<){%Q̣5I\#eQ2VI4dYDdFGEddFG*�GJKGDDEQQUJ;v	;d-iגUA)'r5]27xD+GFtBY5[I^'MmVH%y+'riQ'{ԑ2"ZnGAeJ3"35Л?JR5DU#J5Y*ƺkΓR2QE4Mt 6KĪ%ADI62GKJ	e6wn"NddSTIXfmZ%Դ:ORPYr2ymEIpRw*3FI9~HRքfJ|##HT<<3FP&:J2KR;e'eACZJ&a+2̒QGn%+R.i;�C˿}�qnF3_
    :ZX" !7I)	KYBGQjFcgrnݍ5;kv6w(lQ7!ai*i:.tRDt{7~Bd	"KIw
    a\S&QAgIE&wLG05eQRQT6w(lQܣ[Fcgrnݍ5;kv#b בATRw:'I/�4<-:Vi}j;JWL5szRriUTI:.0aƲy	¦=�S~FEyYNuګX;DCAeyYtAPWnSڤlQܣ[Fcgrnݍ5;kv7�U/vfYu))yRT)'(:JWJyW]arPo$"Y$kQI*24͸K/c.H&~)##Ƚ)Q$gA%-à̩.љTf&fffffgtI3;kv6w(lQܣ[Fcgrn%�'-&rsQM=(;kv6w(lQܣ[Fcgrnݍ5;kv6w(lQܣ[Fcgrnݍ5;kv6w(lQܣ[Fcgrnݍ5;kv6w(lQܣ[Fcgrnݍ5;kv6w(lQܣ[Fcgrn݄*[I%AdRFeS:H(p";Gp]
    f#q*}*#*H2:ˏ6lA3I:Rf)EUmŶ2I3IPdGRDepȫ+M$T{[4{ԅD=ǽKRQNYW
    &].uy3U)興=ΐRUjSj集gplQܣ[Fcgrnݍ5;kv6w(lQܣ[Fcgrnݍ5;kv6w(lQܣ[Fcgrnݍ5;kv6w(lQܣ[Fcgrnݍ5;kv6w(lQܣ[Fcgrnݍ5;kv !їItRڒW:̊~~gGtw)nF3_
    :YYJ[ѣWŽ}-ѿtzGK?k/iKu4oxQ'R~gGt�_F꧆,}-ѿtzK?k/iKu4oxa'R~gGt�_F꧆,}-ѿtzGK?k/iKu4oxQ'R~gGt�_Fꯆ-}J[ѣWŽ}-ѿtzGK_kq>Җh:=U𣥯iKu4oxQ}O7ΏU<(k`>'R~gGt�_F꧅,J[ѣWŽ~_q>Җh:=U𣥟O7ΏU|(k`>'R~gGt�_Fꯅ,}-ѿtzEK›Je"RWn:fʤ3ƴ9htf5C1f-hs2hkCFcZ̴Z3eјև3-ƴ9hf5E1fZ-hs2hkCFcZ̴Z3eјև3-ƴ9hf5E1e-hs.hkCvFcZ̴Z3eјև3-ƴ9hf5E1fZ-hs2hkCFcZ̴Z3eјև3-ƴ9hf5E1fZ-hs2hkCFcZ˴Z3]јև2ƴ9hf5E1fZ-hs2hkCFcZ̴Z3eјև3-ƴ9hf5E1fZ-hs2hkCFcZ̴Z3eјև3-ƴ9hf5E1fZ-hs2hkCFcZ̴Z3eјև3-ƴ9hf5E1fZ-hs2hkCFcZ̴Z3eјև3-ƴ9hf5E1fZ-hs2hkCFcZ̴Z3eјև3-ƴ9hf5E1fZ-hs2hkCFcZ̴Z3eјև3-ƴ9hf5E1fZ-hs2hkCFcZ̴Z3eјև3-ƴ9hf5E1fZ-hs2hkCFcZ̴Z3eјև3-ƴ9hf5E1fZ-hs2hkCFcZ̴Z3eјև3-ƴ9hf5E1fZ-hs2hkCFcZ̴Z3eјև3-ƴ9hf5E1fZ-hs2hkCFcZ̴Z3eјև3-ƴ9hf5E1fZ-hs2hkCFcZ̴Z3eјև3-ƴ9hf5E1fZ-hs2hkCFcZ̴Z3eјև3-ƴ9hf5E1G"EFD0.BVKm&LJI#Q"T}�{K�?�;s۵ocu)\V/omNJQVmr籷dw}ӾV{>u=ښHnz빐U]w[;om}۫ڨ/~S}϶o}}Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    }Ed|
    u}EϿm,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!,!~[mSgp^(wm}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=}>c4=^:`[AU4X'?|aGW$X|Vʭlf쒫m{޺v~W}&NMw߮MN�HYZq%0g{g-ŢXࡨj6ls	_EWv3HL.:ظyI68uCu#4'>;1\VkӦUEڪ{ZnW{?u:NWM߷%p;:'sJA؈q/3Җ*u%+vܪid*MX@ڍ4$bXMuͥ틖RЁsMo۾uHlvdۻFQU;סL+=_ɜUm^@M۫oBrpJaT	S,Z%lH]`weu9pطrIToǗ=&}==G\Yw�odpdñg7OGQuw{t%:mwgHv-XڍPz]̮n*LD,[@exH-
    ñȳŋWUq5zJ'##&AYqt팫ʑ*HUaKM5][rяe/N9(
    uRd2'Qz&*hmk;_ݬPRDv�8L(.rZS;1&^dYv+v-kܦ[ Qc.@X(v*HMXiK[yA33PmZ}Qt`S961#~3Jǐ<V2!(0Gd&wFA)mJT'ؤ`I;:3#(e1ٛ峦>huhQFwUWR&8K]X&89#]*oDRԥbk7.SMUۦiޭ~krb&&@.6!<pMwtR:R"VݒS.7i[ѹ$$9f5\gu[\n^7>-)"QxSeiSMJoEWk.`	#*fxAs#	@HK_sH�jEqe4*M�[kz�+RwQa0$2VV'RPNJR)­XbYqK{;]](Jp`C7OLr=K=!7YdECc]J-47\ڿ{5m]ζxOȃ`
    \6f}$N
    Ԫ-^]]ڻt:׽5}{s^׽5}{s^׽5}{s^׽5}{s^׽5}{s^׽5}{s^׽5}{s^׽5}{s^׽5}{s^{[uo׵kw^{[uo׵kw^{[uo׵kw^{[uo׵kw^{[uo׵kw^{[uo��ow_{u
    }5w__{u
    }5w__{u
    }5w__{u
    }5w__{u
    }5w__{u
    }5w__{u
    }5w__{u
    }5w__{u
    }5w__{u
    }5w__{u
    }5LtfqM6M޲C/]ۮ{اm6߭ZSmNUꥢۮ�ke4v]=mjQ(hmkj,Qr(+ʏ|Kvo>sŲh)G],qUܳB޺mQ*}똓-}8AͶ7oSSԸfbp&EN^uTE."nCyjm-)ޫ:tQWY*nj9"Qu&ucdo*]nѧfBuM.B6Z'Fza.YتKTYi>ۼLyWWvӵ=^H&{
    mEwOku:GWvze~�[zwSiuH說jQ[EVZ}!rEG7VI8ǃlZf7M/i.Jː޷ԣ~bS"ɗ=:,1\?ڣj32}JNYUzKb4ъ2:>d32̹d.b2V!ԚPn˅h\ފ(�	6lʹNڃ'M.imM"qejX.TI.=y%(ƹ6zKLufu
    !1Q庻F;ERևg
    w{KMj7%GY9wӌ7OMWpK!�hsrRlTyo|VnT?$IgNARk10lMBۣt�b�,ˉ+kZwdd?di&1&%\G_G汊ZQٞ\N/nE�hnqDՃ�f<&=6Ōσe!K!JM
    lBvtxtx!eR{(&R6dիPwU)mZY¦W=e4_%93Lc.<SfXK4)|Kv˄ދW߿n>H:N€xp9lsDڂuZ^K=X{Wr6"(C=+_HfE;ӛ[~/C.loԄCB6^N̆;7Ƙ]rݍ]MjUZ2QGbL _}U=FhrVͮ6ߒN6g{u?s^~O׼߷S57{u?s^~O׼߷S57{u?s^~O׼߷S57{u?s^~O׼߷S57{u?s^~O׼߷S57{u?s^~O׼߷S57{u?s^~O׼߷S57{u?s^~O׼߷S57{u?s^~O׼߷S5ڊ}j:{k{k{k{k{k{k{k{k{k{k{k{k{k{k{k{k{k{k{k{k{k{k{k~߱mm=U?_{SU?_{SU?_{SU?_{SU?_{SU?_{SU?_{SU?_{SU?_{SU?_{SU?_{SU?_{SU?_{SU?_{SU?_{SU?_{SU?_{SU?_{SU?_{SU?_{SU?_{S#(>[ b-춽޺B5uUr*5|ܖ&d0&P}uxB$:ŭ
    \\曫~m7kW*|۩E[U
    ]O}``<.kb[UDoH\YݤN$n!2bJ$z\nv=}\;߮7ӷ^Ë5TKX|l*Je6u$/ǶG-9B懿ڻTص~]ܢ~H7G"SFbmRݎQ'YXRK։kڪ+[U4ӵuT1zg\h>htvE[Z@/36A|kJڶmX7ȴUt|%uojg?[B{Wٻ'S:}-b`fE7#pڛ-nc<+u+Mڬ]s+ĚzӾ9u=Soelnv}NT뮧ӷ;u}~}q޿D\u&}mI_[z~}q޿D\u*W뎾%\㯭~W?>o_UϮ:s뎾%\㯭~W?>o_UϮ:s뎾%c~W?>k]O]Ϧ;zs뎾%\㷭~w?>k_UϮ:s뎾%\㷭~w?>k_]Ϧ;zs޶%c~w?>k^%c{s޶%]1ֿDLv2mkKo[Z~}1ֿD˟Lw.mkL[Z.~}1ֿD˟Lw2lL[:.~|κd˟<w2l멾%9�.}kkKZ|qֶDq.}kkK/Z|qֶDr.}kkK/Z|qֶDr.kkL/Z.|qֶD˿r2kkL/Z.|1ֶD˿r2kkL/Z.|1ֶD˿r2jM?Z.?1֮D˿sgn|1֮beφ9w~u&c]~>W_mφ9w~u&c]~>W_m~9w~u&㟭]~=W]]6jMOZn{֮Dۿs:=j~'\=᎛mnJ6%zc~^?__צ;%zc~^x;_gמ;&}y㿬~^x;_gמ<z׳^x;]_gsǏY>vDϯ<x3=gkLǏY>vDϯ<x3=gkMǏY~nDϯ<x7=gkMǏY~nD߯,y7}fMǟY~nD߯,y;}fNǟYnD,y;}fNǟYnD,y;}fNǟY
    z7biͰ'�2i%kKp듘4waJo#=j}kz\?_�Iq7E+䂂
    3(2_eNVĪs)T6*Pu;%TF)45z"QlwlBDY5(7sjMT2k6zw۩0g]kI6E!gGM'io9Hririٴa);Z7;W^t(-Vk|.1O:qE29&I9QN]!(l6JOR$࣮R޿suQm5e߮]W_PH5YGe$�_zr+"Y(XpkmmV:oSUzS]^>̎n]읟wSY#qt{=Oi$�F;Q,,߱`<Y;ӿ%nvdh.zS) Y`2eQ#6(MFK�-uQDx@Z#|r^(y\l};+RPSH'J2ra7vΩU�Wcz@qֱ%pw2;|2�3X6}OL};Vn-ovKN:JKI>8+K#1C8;dD@Q"H,Tx*E|p:|tM;0lr0,d'd-h]l;TC6.$C7~]~SJ;007=q0=#Zn,  >FND*P;-oKM饠st4	^ߧ;Ѝ+
    
    Yrk/WC_0=:uB6LV$rq=5Y";y(|X8b'PפL/,Ș	Y87*PXMggT2qsl:ʁۑy[rUݕXSb~ڄl"HL.j2DlfI:)DQX(4?ϋ]-om„/T~f勜)i|gQB%l&]UpNa}JD,odbErnՎoѢdpVFo?e YXS&brcL@	ҡWttLt_pXbI~l&gP B1QHd8bᑉXb2c*w(=&yo/d%.j oMCO�5߼q	jU߷�6$~݈2>0f>0_<yoG0@=$qÏ&v=}	$&픿-<-
    O7H}44�U�@f(>Y'4V)'Z,JoP&(lUOGYS;ˍFQ=p9f:Xy쭽`󉏿ZVnKdInF9A;d&/eHbI.v*VqK7$|fV!H@rkEh#"}d{̑ܯFA:@J+BZH:+nuR\z$&|0n('!�ް2m,FGL!8!|V:_J1H^.Wj)٫Cø/ϙ\Asu$*!Y@TV.^TҍhݜS[]=N߷�6[ڜjxؔ[!,]&7Z )'XcHB_)fiXgk_B;ػkw+;;>/ K8xa&HrgQ'6IT죰
    oZs lV5,E31CL2C8K3D}rrP7Y
    nXOem-C	R5$*''Jޝr0fa0)SJƧt]mZuI߷r>߷�6@=Y%I=؃3ETϲI@Cwxw{{joO.q[ϓ<
    ew|)c̉3cO CC̾v;)3RXhhҋ0<TTS7MdLfS"ɲG!|9;#Uxۺ6n!jpRW5o�K5W�u5k�?�׵5�s^׻׽m�6�wk=ku=o:u={{mk׳~潯wmϿױ߷�6��6c�k]]u=Zu}�6׷o?s^~溽_{7oZj7m�k.�s^ncױ޽{}OmVO潽~潽5{{{�^o{;{uvߩ^o{}O>[o_5�{]S~o^[k�z}}k}�׾moիom}ofg�m{5{?ok{?kg׷g{u:{߱oW?�k{kmo}o5潊潍�^}O^m�uvo^u5{k{{uc}w*7׾}alЬb
    6ZM}-{[f7ݷ{4TTfDi]z$ooNSE[o:m7lޢ>]vWn1mV]=Zkw}~oCp<{[=GmcGsEshM:S<S !"Rb<{n<J2UmTܥX)S:\i,d2)cbz%t'kq#l|DBBPL(*WqdV\x 2.5|"x\B͐M7|"RLTZ.HCK#GWW�mLD|<3rr'lBA
    =K?XuiB{.m5Ҋ┆26!TB:˫g\;'[Yab8f&GIJ6EeW:.){Q~,cVx{cN:RIXxR&!cO	,YIM[ka#r8NE}Ќ$DEjM!X*BB7
    Gbnֻ܏HX!JDb&T�r%r11_=	*|eC%(Xs^T:rD8a
    RNnV`xwLEDZb*lz8
    C$q*HI]1l({/:1DxAB쏼GxؠA�ǜmVK}67|ݟ,<qgi^�]>ƪS9X2^m9cQ<NV)*&4hZvLgB(K1n؎]&hDcf%�'Ux88ecNaVhrA#bi{CěiP@U1춳Ydb=Kr<.*p#y=wƟ%yP>a	=ǒnr~)PisjJS4Z)u+`wNuR͹ӄ4ozd>yB,nǷ�Oc--b:(rOE
    O
    (T	əl*UGiD4fV崧H'﷾aH
    KJOL�qF4&h�L9F?~	+ȢSZ7Ь8/N[+
    #MrNYOLR\n
    c
    *lѮVݘ:?ģt^qiar4ځFnf9Ⱦr�goKhTN;Z^#0?LFXv^Ggg}1Y5RsWM>
    }'n*l#{,Y;E9>tN|uľCmwo[�,g0D0gYMe4qK|'Gضƞ(ѣ66[.^Hklu643=,GX	t,E
    c"1q_5?d(þiXFr6Qo͉BjkN'̲J'Wa:ȼcKb#8ѝ�uʒDc=Ըci9	DH(~~|eo^lq66T˲HAdrE9y":)sN:x�<bo9?뻏{ov::ooS !lWI}4F`Ő?HJ%ι)槌Y;]먓lvYOvUnPfϸSgq&DIr^7b@܅N
    U¶F6jһTH:M>4FwtD	FjPɶm!9JryBNA	x}N&ej4tw~nW?{|=+W?wo?woww}�]^�{co~~�o�^߻{~�g�_׷�^߻{;{=ogjc}o�z�}�׳Wo{{~׷�]N{{~guz~�~w77�^�K�]?{׷^7?_c�׷�^߻{׷׳V~�^~�׾7׾7O�om�_{{{mo�^~^_ooowo�oo�g�_Sk?o޿_oo߭�{�Z{?�K]Mk~g�ugoֽ�׳ku׷S[u=-~=ױ_>ֽ۩v?02qS5wKkkwn'ܻ]ue;K=wн[TbF=mަʐov*o}oE=]m�|f,ٷs͛VMۢ(,v})mmmV;ٸk5~2itzmugS:\t_枼?=ynя��4�F>jk˃�װnz�55�F>jks�|ז�-:1S^[-:1S^[tc榼?Mynя�55�F>jks�|ז�-:1S^[tc榼?Mynя�55�F>jkc�|ז�-:1S^[tc榼?Mylя�55�F>jkc�|ז�-:1S^[|tc榼>Mylя55F>jkc�|ז�-:1S^[|tc榼?Mylя�55�F>jkc�ז-:1S^[tg榼?Myl៚�?55�dž~jkc�ז�-<3S^Zxg榼?Myl៚�?55F>jkS�ז�-:1S^Z|tg榼>Myj៚?55�dž~jS�ז-O<3S^Z|tc榼>Myj៚?55�dž~jCז-<3W^Z|xg殼>]yh}៚?5uF~jCז-<3W^Z|xg殼>]yh}៚?5uF~jCזg,Ͼ:3S^Y|tg榼>]yf}џ?55F~jk3זg,Ͼ<3W^Y|tg殼=]yf}џ?5udžj3ߎזg,Ͼ<3W^Y|xk殼>]yf}៚?5udžj3
    |זg,Ͼ<5W^Y|xk殼>]yf}ᯚ_5udžj3
    |זg,Ͼ<5W^Y|xk殼>]yf}ᯚ_5udžj3
    |זG,Ͼ>5[]Ny||k涼>]yd}_5udžj1ݭ)׊
    i:%qF^*h7bIoj+~[ow�Uk(?ݼl
    fF/l_˷�vĹB90b-Ȗx":(i-AB4Wm]%(n0f#궺m-ULqѕ$A8?;&*/!I@RC&>'~fwVܬ bT3ݚ+c9@$Zfd+ci@T3^ݞFe3iuf^߳@WVֺ62Lʍ6&d>9g3iZ@\/@<H̍hRU~)~ׅ#:o	jY-"٬	}ᓴ2$4,LRznY7(Y@
    y7#c-&�GbZ挋s؈]w貮?X"UKngHٜ:|haPT7q#"7 V-FHGGBܞש
    fi-LS0]6&`nBre026;+dQ)W/\U
    46zceVkAD~I61(4}D7̌+hK;*즲fO^`)dƍ*P[#S)3FѶJ-u04G
    +#wJR	OJdd?FD8!6ͩUkDDHr-˗cCk[BX2	S
    R$VXB+:#X3=r{M}vj!9Ŧ9l
     d{AMDKE-p|(@*̡jU
    e-V!s^F�c>-17THRKl2yOsq!٧TFn
    ((辷NT^Hb
    36*	\1y0!y<0,c'+v-!JcBlWlK[n,	NK䁸o es_ƄbI4J}QUto^1U@lhך'R}8ܐ	ɰp¨)t5?<]jNB/fU9C=&\q
    ݲ@9/Q@p`}Q":iĴܮYXrbalrdxG0G(;Pgr\YG*PSmɛZH/\Cg]/y:1q"ESl`''@	8}�$"<XPBی.YCMwoыlϙ:$7?]>c_Ȧ0oe;H5uFճN8]'a:C-KxQD1>Z-AR3]Xs
    9TԥxQU{#R|8�985dHntJ]aF+7HMƧ$L�dG@Ä#wְ@F7qbWlٲ%c:[.+RQOԷ((XHX0pp3pਘrfqᡡtؚJ[6%MjVilz̸m5ǹA)/S.?G2,F3ķq}Uڛ7ՑYSrwnV.8'dN@tEs~=_آFbʏ&(j0w)|qе?{mRkO$<cwrf_%$Uқ)`M x.uTmLUvz49;"bZ4>#FFț--IR[6תx$ƌ\{}D)HCOduB0cIhh\+h]tLw{Epͯس3r.t;t:3FyMH1hyHIL*PxUcfՓ$]7ޡ׮uQc\RD7޲>y9COrQUe<"CŲ,kk'=	
    c_!0Ҽ874UX+[Ҷƪm&jh. (Z6Y%Jyc
    6JiK&X1rEh{]lߢ6D*"iĠeлEr^?HkˆCJwmLm-u3ՁGrHb*w3=9fT:[:[oq=n|ƩAH'q8qN.w
    74i|DMKEZ`lA|ŽUgb {B:5Ȋ"wWRz[&=SgmۺWdbileIΦ#
    (lVSi
    Cof
    rrWfҸ'G|<$rҜR*8+=vRaqVsj*5nM͢QXAK+Tl:|aANc"bvPctNHnFE	?-„-jgwh`,9
    :Yh+phmݾKjh)a}
    \@?o7ܹrCdq)Sd$@�dfqcI̛ A]58IG<9`v
    H)`E)!ZؔBۂW\Pԩz"Q45\1¾=n%ih~T>Rq:"tRyqhYwrEtMez̟RkTƷ-F?8Sf(	$lZ`hVF=*7ns&8pqŮC8mRH8Y^
    [/Nn
    .=!<Gqy*qIe\�aȉ+$*]DBf�mOOڭ̥jI<y:A`fd<4P-!h>AJkhDo�yJ5w%㟢�ʁ"Kv opdWgE<Z!{ػFo3B?8`A,'XksrJIF.y+A{42f7BaNiW1p{X4ly0Z}qӥs9_8'!mXGgcú[}m*^JGK6;="I*
    +،w`s`n8T9U{)Ffƺ{rNG,A()Neb<f	Ф oSxB=ԙ흎=@*[;%z;h}42C۲eE`8&5ptͬ*#=;4l	ߐlzp{ZNoCOF[M2ĵ%	0:*e\~jD8WW&.o2}n
    V挾F;�GGx)oAMVޞ4=XYTo)eBvC9&h�0#t3-*
    ,=;6%)mښۺ!8?fzZGCGGH :12GBjqj;YOս;�mDlf56�2sXf/TՋrW6Qѳ2W
    ]hZ5	Ekv#BRv;{adW!(Ƨ)t,:Ǧɲ	Ք:
    YY&cmW^WmUgx$$'n5j)nmY5n-$ȑPBw[z�˙%.DRrS(yD4_Sb?bF~> (6ņ+;ީF]f1|,da;+#E@�8{>JMBo7_V#X\ʵ.驲7ޏX<˲$F<&fs,6F	rQT.!KIتl׃-5?dHwP==eFRdZD8pjQK)P}dsEkg:8*!I͆%,�$Kv8Tt\P4|t~4]^U8YZe7l5ܟq'' żEcHyWΎ1Tf`AD*F])$v(pn_I_`c19E:l0sZ;f	j[;XTkȌH~v{K
    r:I1Ṫ&4l3NP.[ozfjtvW\s.cE?82j
    L!$<Q\4;XQ4PQc
    vRHf
    cLt~OyQ '`2ik,caA\CyR6[o)HH~}aJwSG1]+cnA=,2hQcq
    cʚI95d)kjvz-tVKV+=ܩ<y7f|1/IwK.
    I	S*W<EK!?@ЇH)ʌ`Ay,>0um5(JQT*کBkwSbZ&b~LJrh;$\\3AP/!3t2dAebˏ.]R{tbniKBnvDĒkaA̩a�R<p ]"80~ayMm+/Bjv+BNGM�ՖX,h(K0.A=K=pZJCKVol2NkY\ıl|bqOc;M	;ýYUҮ[}U4Jv�AeG+XzCi2UlcI0
    K!(zpHȹKq5jo^N+I�7ԋ`?F>|G${ug�C.%r~
    $L;DXõٌV%WU9+b
    ])C8ZK,dW9O#�?o$#r8EeU	c{	{bJ_jKN8A	[d\2HT[E�lD2Ie,cJ
    6+߰zт
    O2|vq*pL| 1*$m.׳UC23wV[[mEG_9ĉpW㜩8B2I嘶B)dCb)%^ٶhlq^zIMΗIerζI'32�)Nk"36؀^xiSr#{[Z[Q]4&N8#z8kp8AF'Oxp0S$O;Ls
    Q)Z]C2'iM[⋗='υm$L2bH
    \@.Q{vXFy!x4;&M,v9~�Ѷ:T
    aK>"JTMyLcY)Q^upVw$;\,898X&95wo>ZgW,F&+{}vn:%ph(Dt5M38\V
    ֙JeD娰HT86PV¶
    Tb[tgf�,BGCG�H|[7=C	/1hC4ErmBva{56:_}iA-8]%O! {,E9&Z<.+__f͡+R[eʨۥ?0/h/HN"l;; *g:C_wJ[$mr2wTKɑ<|D7_q0,NFE:az?51cV-h\Zزt&>eVe~#ǫdpKxPHz0)1ԯ}拄ԺG}۲CQd1#o(JYDFG1\'v+~XYmz6|3r"0'(j}cۯg5"H$RzLn䫊TUeK5yA1K lHJT�&HR=&`=;pMB1nMUf4(-׽t)6@d/%+P\.LdO/1a ZA(BZ5ݙEhm)}iz&Dor},aq2P|U/2 pԵEΧxp3;"D8T^ӳJ&csF~"G yNl&\;@,Ii26뎪6ښ�	T8w0GM2^KO3aa"uqVLys2~+@mkAb]Ž'Y|cY݌8|+!hU3C%nY`qR="2Z"Qj/7c,bޑ&樚KPZ)O/};ABn陪
    ^g#ѻ$8[;a?qP	c,8f`@'xpk/~R:K}tq1X7ͣcqV٦AT YMڔjyf\"KԿVœhQJQ.Bp~`O�1nr)ժn5+⵩\
    픡O��kߢFeQGب~JpËbPkɭ<d+wG38SrKz΅FWN\1p" l8l>c4ϒӑc39<Z6
    ǞixSMV-h3^Vhy\HL\%2RH3„fVE׌3 V֢]]JtZ7c>  ⒪L2\AD#$
    ,3zr͚X꒦MP)z
    >XWtu<4R0@@1Q*Z[J	 GӪ"*[Roaͦ�4p9 8tr콉$(zf.7Iٜ& 
    \UtHRRk5*5npfQy-Hl)ʪ
    Z^Ԟ+j"-	ܚ2PCvŻ)3k!B7-)cqTb<.N@L$Tfnaeڐs+`R#g~UL("jm>O�ÌKju+t*P[}0ZZ{ڻRUJS];n:�l%͙v�Tk(?ݼl.ƸXLr.NcQcČB@KCS^LҽbVT^-޻q``+V},#	R/&t5.i6p)J\$ݾnv
    �ZnGXń1 M61o4aЄ	H#,4L(bn7Y_e'dSxO$
    1Cbn G8�;$s`Bܟt;cT(ٟߝ=}E)'c˻fI�UUݙ
    ayuTku31]SwWml�%
    (EqsE+\b*	cN`Ƭ%j9>0<ZnMnhoouEg@?w߳#-pHxu5*�7M\ln6r?}zo�ٵK3)Px?ͯ荒_ٞ~➮N~W~57=,*w[;+*uvO	Q_Yv(*moF/l_˷�v'?S�z%T,n*jqʒ$YVѽo.j(U7jܽ͂3sZ""-HbR5GFNjնhYb{mW{i\{j'KoܱŪjD	VodyGqE*޻4+U{m7�2ƛ% v\Z-'oR+㱏z(UMJx¾MwumܮF3256
    uvm]YxSK֒{JSWw�~jܘkpG!!k}q12a6+Amz
    -ޱU7mUwW
    4$Pͭ8WnҤK*]nMw)ޚ}QԖ2;q:?#ņj'.\T즋_	?]Ym[1F9MxωYx͝x$қZ�o}m=uuSN�?"�mC8`{??_2Pm%M^GƐ_SJ}BU)SUvvmT?<֞qk7\ɞ]^
    wljwE;WFNL1C3kx*k}U&U]#m}"ZVh]?l2?%͙w�Uk(?ݼl�_i"{ѐڪ'rS!QUl#F۵[nUVS\eܡ-UdUsڔ7itTS}ub	+ꦚ.`'iUVU/L(c"hDfUMUUy4صgjEEP.IVio
    I[J
    7$M{-fշ"1�:;Lj驃l~s�]ԪghC*Wy5MÎT5Zjצ	�O_)k]j%bjY-([Ubڋ]w}e$|31ͧ\I&[2#fc鸳n7^ :^B{ğe\JFusrVX&UYurGANu!(XU{ĬRwdI&~\LfY*(Z%yə,DH+~	_\.bT9ilޓ*Z4RXܱ@$|ŜybkU,M}
    w٪_�iXȡ6(AؒV"iTD̩\fۧl(ƥ.\qj/98s$:,)j!e]
    9[Te߽:9LBEe&c@
    Nd&o*RΨjJժd4Qg16M
    $l<Lg&NZ
    XJET."F7r[W(MGR鱵7+i-Xe;nR5ȅh$)MX$(~\ґRʺ)i/&�"�mBF䊜XD+U,ZU,%H-._RMn]uնm_.^c]9<=7վ(~{CCR*TiBcw{
    og7ޚ/So]Nrf) 2)~([b̟B["glv]j/@9EV:mEѽ{):8.j$1D*5E%"Jw_؜nݹIZevR5PvKTҢ%u"cs&PJ&[!DЃ-\lQiBʷ_]-CpExD}!fNn۠Gu\ef;a7׮lE*]sMM5
    `ܰ3|g3<9J/NìCE[Zv.ݫ)\^ǎqvLG,d$C)UTϖ"RQFr{._EREi--ĎQóZRv%O͏#7Y@89K5QmM:Ҧ�S�fF/l_˷YAgN~8Ǟ8
    	8:<r
    ˞7ikeV*nU5O֤)_@?Z}}�jB
    z֤)_@?Z}}�jB3#יսϱ
    Qԡ~VoY}U{ڪuoNQNV!KW.Yq'An]OvV0GU]GV}l2K:�j75P4*u߮QF*}}+|C/uȈmiή
    ؖKWԽtSqMuڪ*U[Vϴ!;aBQr6-ٍ2?.YaOyYX)Q~֤)_@?Z}}�jB
    z֤)_@?Z}}�jB
    zԽ)ő:�9O�;"?aCnyhQg=uUMUyM�8LVB&(?*{$^֨TrnmeJrQz+]WT\}rV{0͑+F6|gV+-TȞ޺7ޝƁg~!ca-$NVwE;-}M&服�.:|37<�Hx7�gXEqgr_8JE�4&Y8M]Y;}�jB
    z֤)_@?Z}}�jB
    z֤)U5K"5nzd|rܮci6ojWeUo]]OBr0G$w"A.;lǣmfg~7fMm"s[}uNaKs&A'N3yX%wX'yy)5ӳ]'ڤک=ۖi7z2RKJ!|OdAz6LHN\7^ծAejX:ug~iuU_jHwnSS,bZLe_zݻ]UUVoԅ=cRHS>~!OXԅ=cRA^Sg�s?޽߿/
    z֤)_@?Z}}�jB
    z֤)_@?Z}}�jB
    z֤)_@?Z}}�jB
    z֤)_@?Z}}�jB
    z֤)_@?Z}}�jB
    z֤)_@?Z}}�jB
    z֤)_@?Z}}�jB
    z֤)_@?Z}}�jB
    z֤)_@?Z}}�jB
    z֤)_@?Z}7DaEM=DS|N8@蔶.yE>nYy=rbtUզv	DƒqL�gl;˫6shc!Uuz4׺)ܪiVn$uDj*޼j2[c]30fx7,7vTZwQ]=J}%wVWӰRPI]RqUqvk{Um[}ߝ7'&FaW*eCPzfvUa5v(O]VSUNȊX%vݙ_P6)kU{Oviu,Sk[u�磊Eqd)_2!7showP4DO/j}FͽѪdVr{fĥ
    PY9|EA.8m(eM6&HPn%	]ҫ]w{Ĩ' 0(wbB% ~t5I8;J
    akvʷպi۩M;m֤)_@?Z}}�jB
    z֤)_@?Z}}�jB
    z֤)_@?Z}}�jB
    z֤)_@?Z}}�jB
    z֤)_@?Z}}�jB
    z֤)_@?Z}}�jB
    z֤)_@?Z}}�jB
    z֤)_@?Z}}�jB
    z֤)_@?Z}}�jB
    z֤)_@?Z}}�jBrCp1~?㸼u:j^]�Os}}mU?ͯ荒_ٞoFL#GN "ZsBmFpRNJ\H6!'GѸŹjwVKQ$N?䉬|9g 7	L$$=@̍MU4N*kT_XeЭ:HX$s4@o"6vHH{$1-M٦:i9)UVˡ[u,5D;T�&Hqh$Dm2쐐I26bZ5WLtrSm85Q}c5MRTIO"k$wƈ
    DF.	d3#f%U{4M'%6ӊU3YtqXV}AO!$Y3j)2 >[Hz$UM-W/8[u,5D;T�&Hqh$Dm2쐐I26bZ5WLtrSm85Q}c5BX>j"v�$Mc88He!!dlĵ42jfqU[\jk.qXV}AO!$Y3j)2 >[Hz$UM-W/8F弄5zHH&s`F!K,6$TbU.1a~Npi-9t&g-|xA@d#bztp[m֩qNpi-9t&g-|xA@d#bztp[m֩qNtw#'SHl9@á68)kNf.r�$qӣhxbnLn;wqXV}AO!$Y3j)2 >[Hz$UM-W/8�'_-9�_5;
    ꚡm( $bi_hі?Zy~BXgLԾZǸZ;ASeD
    MN:lzuLJB[5HV3uh	Ѱ&/'\?y?!:.̍n3$6ȍkLrOvOv2#emcVD)c[kڶh\춧#\Ė!Y=ζ2HLa0ݦ4gĐ<J>&m<5tbl?']Adxs"#Ѽf7fR^j9`օZT}:;i߼5hb2RРXez{M]K#:)+{f"9Z�c0ni,*6E,9w~ڋeyKO%"~jS2* x	9y#Sq y>ov겟\zv�C|]kz3vz:<9ϾkË��PgLca#<`]p4iYX^>a-\P:/VNֈ"1\N/BmɖS :)W@ֆ)5Mh7ܐT
    [BnS&3MEmRX"RZ7Xdȁ2`kEy=5z5*`QPU@IQ7e.�Zv
    sgSJk `$i#:;{3j*T#OAQ7!E 4Z�%
    \,3:8vWq2]y*Dm2Jeq#I0&IGH6„.LOβ dJܭ&NC}UZ]y4})FwkVJq0BGR(^D,tӗ786շ^߫-M̬i!}),yIt$HS0�A(7!% vF5Vo59%1GmO<(m:ó"p
    0"eTd,&.qa@K;o|N2:j`a,4@EӜ`@2Q97va_J=mJ)H:ׅ)rzm XK	2LGYA&E<O13}蠗gT6ewpfHЂ
    aପyA~|Ɂ3(B#-8$Zākv#dM'dA&rp	kKܟ6qKaR} 3˔YK-.~aqw$av%G	< if&h2!PةNPG	ġsynZ|\*xFq9l?'a2_6`48䭣[2- pl{{m>bx\4ARtJI]FxEB]ú<
    ;@,ĩOx8Wm{vV2g22kKC47KXuI	Dm^^iZݐ7Rz#QZ)됊&Wĩ,MH3%9⼚[K073kV-uZ-__.�z?J'__o1
    HZDC1(KG+
    3)AKP_\%KN4WUT5۽Czcs[Yc&(H-s(g6hLئ&tEU9
    uVn E(ޠKȨ*<>o?e(督yx@,Mafm�~ظ_f[ߦxy8bPR	ȡKJUF,1&Lrⴈ'uo^&/1*
    4A\ӗ�5z,IމxgG{8W}nks+1ldq1	TQPHS!N5IyG܇�G̸�%}Y`3ʼn,}ͿYU{ef@!bt21s
    R-q&V$H\U+udm]R(z{r'%0Q'E-Ƃg
    N4JFx Re2GrPaj2*
    %ip�3B®x08dYÛ~MYTCᔽHvXcbP+҄nkEXT{BWi[YNܻuX/"Z9�3v,qx79ﹷb=}*h*Vxc}Z!dPiP&cv7S]Jnҥ(qKoZڼŹr60l-()J_q[,"#iRF;T[;rK)ړ{6|pa2�݈4X!7@KHTԐ] v%$mEʛ7CrhёPS4 a\�\m,Fn/O,h*#ӊv7HM.nکȇi{bN1J\چS7)CLnhDu5iSzwwFm[mK}�W�Kү89[z(g+1ʶ(ܦ&)0w&fcpb*X[:*:bk4E]Qz%6EAFy+rE;/,q*u0DAf(XTXL(MN"GL̇|Ú5bbQz%9ݪ)[�hO3k#d6gQ�v'?SEc_m1ױ
    u,CQ#%Aә;baC1�ABLHJzj11,ab'->:>0lx,bE3Y RH�A:tή:m[=j1D%gGF
    ŌC0軆k#]"
    I@2'P.غzGRqg
    V]cXL}>D9&IG34ĀN
    뒡r`n̲Q11ů\	5:nT-ya:oxƑ~
    :wJ\JbbGpS$jҟ%k9jwmލ[fp007eRc
    >m.w\)W,
    3YS-Nlhe<RGv[L\NۊfF7E;Ti.ݮ˕jAl]׋{4i$kZP6U=8Xゞ1 _֫Uv.YP0pnmF85(#ɀlg(ڗCQivT$RO`mX̍0N{ds>AH޹*,+.3ZɩPQ#gxYZ_x2�2Ι1
    ̌nv']]+ˬԃR\
    N<#l;jbr
    ?ʒ9_2bR<Hra;="
    v5?ʜN}g;pr`)�ݮr+E/
    ZՉhwgW;;
    ԳuVSH`ibl6mI|1FjCk(fi7o&/h^) #aD2Nf$`9C273#xI(qvGUHnjNQ>390JBc9OMO\j;Xr{jY:JQP)0Gt6	Fq>nޣ5!
    5É|hsuN34yD_XgxYZ_x2�2Ι1
    ̌nv']]+ˬԃR_?K=&V.88e*j[�9<d{LISdcc2Ҷln-=6ĹtHAmEb<hFJUy
    }T93DřYdjNtV}r|&Sf2p䦷#c3xm-
    $w@ٛ*m%1Xʠܪg$Ҭv&1	3&'&!B-L38D!$+'TʈIDӏ&;q#;T-"| ٚFwLO[SLW.1<}${ftuuК[y({@[XԓuC6#QvV-tj'[#X?)2c|_FH$|+qk^JRv˟/fl4ag%H.*90 ]]HC4H\7GӜ%(퓤:h0;IY-Aqt:2@ؠq̤{FL&IR*Y#c[~_A3$9.c}}HIg$e:cmcP ִ!,Dg1[nA>0CbEPMW"1!̩,(1(%OQS7k}t!"xD0[#1{8{E̙fXC%I5fw@z"'נ܍LjeqbX7kt:Y$y`>Zc8F9~f
    <!p3
    b_E]phis4M_cZ�qUCóK$l2ZҢѤ8IV!lOv([$;$21w8UM&IE(PEe.7[ęx4ye)'x#hc##9=a/Vȁ5VGۣj#4_-'yb8Ù,r&~aL3b&*+^}2LR8.vklJ3>
    :-\gƚyr<eN)ΫM&iugv)+"^,8vZ}Z?䌏lY\P(!i˨wЧ][
    Ȳ(L'QawG|i':ѺvY+Z缇N5?S*T3g33n9Vm"'	F~+F"g;\X#&'bMn)9BɀY	3kّ;J$!'1jd5.D(sAE?h�rljf<級�H0Fcr())wVdQ2G҅oL50M1@R,i$qJAN3X
    rAjc{G^[ֹd&U<h6Ŏ،ϊ:AW+;|3QGaX;|b54n|e+țF'Nfp-W[Gw
    uf)Zy2֚Zq ,o<INrŹm,42/rxRϸn
    CbXڀL$m68t2*4̎}SR*²&mrךs)cROaA^\	gr05mI>nT9Qb5ebFm%1|C_zBMe05 bf<eWvZ^يv2˥	+B]­d;efBd}d[-T@teVCׇ01;3Ryc:EqB0� { &DB,cBzč,EF7-gsf[VW<Mϡe38@h>!Ŭc(d2&/,M5],uC]ܫ|ǜ1;`)r͖%dT9!	cNV :)`)Dsb[ +\֗'7d^r73m ʼnb8`ӸIfx';HiIɘ7XkebXRŐ;9700@fhHû`Q)xRtʼnLx:.q]~CҙB1٪F.&7Ax[jWyxCZٝC
    %{2^%NB�cO8<e|�Ĉ
    Xwq8}tvB=RSg+"(0轜XКHo
    aò!(ّfQ$zvn@
    U&~TD6F'+�W4`2]X3FkuwYisK	k i*Zڲ[*M!CXY�	x(pL",d>cE-0D/D`$
    ,r�E.d=	X%w;Ψ%7݋kcqeV_F?sTh~!lݱ2" X:4
    Xa!v:B%oͬ}X2(Hپ"tOuQ;:97^R"촦M,!+�=ěH ,ɷ5ҡsS6̍Yܭ&HĮ9'q;Je(䔴նfqŅ~$8,eX!FL̒
    Ml1,_z`%bcdb@0to:ꜰVyy,5=qFUIbO#
    f9`o,VdѦyHxA8B0%9JIZ)!e[wb5w ͮ&wua5Jch}17Fec|`5.eA8ʡ.	專.vp=gT/l+.\d'Yu]$vqI/"(S,)4(H"ڝwCѵ,fjFL)aQ!2ј<34q!sT&NF)䜡AR.Ҍf
    ,?L(]hkf6KxۆrKO:bu5#lDwZ[Q$4ܥj1BpAKLH% C9.y
    e%kZ\JiQEvDo	P[mDlf56aecޝR>wX.wSٺN{zſ�[[~ooſ�[[~ooſ�[[~ooſ�[[~ooſ�[[~.d
    6̯_@er(m9\Wu%+j	^SU6zRƝ=7YSڱu݋vuzſ�[[~ooſIe%gi
    D6J廍Sը֪b[U7/ov,Qv#�'qb"f
    /äL.յ==+ZE6RvQUo8Í>)510m	_R7Fd42իEyEj5e!PH8.n~>T[f&5}uTO`oSv}u˕տ--?\r--?\r--?\r--?\K,iUPUmXyC=l. )bxUZ䛶Ow{6M^kk;nyooſ�[[~ooſ�[[~ooſ�[[~ooſ�[[~ooſ� TFNŢE"%$
    _H]j{b{jWu2m]N=ܢ*mcHtT'˛iqò~%٩_]U-S,[ݽ_]runDj4XHYddCKmOlOmJVMԧ]UE[x05QK;C.$[V.a
    Lԭ[S"$UܵRYU{j--?\r--?\r-ќN<(
    )p<e]$E)L`nDlEtF)|r--?\r--?\r--?\r--?\r--?\r--?\r--?\r--?\r--?\r--?\r--?\r--?\r--?\rV
    ٪ʥ"IC{j6ТmU]W۵hU_ͯ荒_ٞoFL7*?-3bUX�e
    Tŧ)ٖ<Y~
    %","!oU6n%Yq:RWY>=#dhsZ]LF%x٣0άRjkK_t2^N+0@�𙇤pSCb.qKBį4cqsF:ܹՊMM}IrKCnKUj\`al`O.1WH1Rg%bQ٢ h ba[RL7~zNEWY>=#dhsZ]LF%x٣0άRjkK_t2^NQp{̔"c)A4Q21b]A8x~	k
    ڕS)+0@�𙇤pSCb.qKBį4cqsF:ܹՊMM}IrKCnKUj\`al`O.1WH1Rg%bQ٢ h ba[RL7~zNE"}f>dYIO2	r 	hc#L+XhNԬmjXyOarI1~Hndu©VgX;*;.D+N=.ɃTM`\5	LA}I{eDmRRX<?S@6ݟo5^uڊ[*.HgC2ATs2q4
    䨭-$[-ARL/DD7{Jg:Ī�x햩NS-7͂x8
    H1 JDXDBުmJ$)fBtmk_Rh@i0Qr77T<3:4&ͷgWnl'K0?s̢hU>\q̜{
    1¶y*+hf	!PzԭS#
    #bl\=1%&ȘJyML%LXypN#C7gZEwcm#TryU!�]�C00E-xA15T
    I}DφɱQՑ	{@Wm^MX4ۚ?a2EXzazI稻LLTg
    zHD@jPf'*[T9qSq,G9�FQ�Fס]X%<)%MRMdQ/=̛\/(nbG+D0D<A	ԡxU+#nD9!2P.EƣjgZ)ovT;[pJCrK>q L}qegxyQ3! D!`#ݒ6'5omco;k6%fI hc&?=cI\ZJ5K!٩ҖwjZ]edI v	aj_,cn\T+<IF0&:-B0855WiKL\d-Eg;gkiM^eB�Z?:'8\^Il7R(E\/&�8v);'bLqO (`C
    b&ebݥ[ճ{+D6H0dBMrCED7Bn$;F3lOj]-j'6ﹴ1L3O_VȪ䡨nu
    4\X.^3)h{hٝgRw(D6fdk2q9 )qlq#C,=f1`"Jt2
    KK(j\rn׼u`4A{efG
    DY6"{2X(4d	̃[x#nlwtt7Vڪ?lݔ@:({?!oLY1>]ʱ(Zm@'쐅v=nK䌆ha<C1>7"ǎR²[#tSsdJqCLXE
    ˊ+EѷHP=?%Gk1h"CCMفQ8`+r<cg@e+Rw.@Q7L¥G/8ԺmՊ񴓴Es8?\PmڛRrCerW;~UZ?oM2TY6LK&OሙA4G<]cԚ4y2F$CHT5ڱBjp<W;fqS3^?b<	ϸ!f&CVޱ3	A�r%)sa遼Bdf�TEX�s#OYwӰ4d'wꁱ.@Fik'^n,yj2\T\%aHs1=ekVHO,IV.9(3c<B$z|ЕeJ/-L<r|9LW?ѕ˳,N+D4i(d(bש\|gFҕ�]+nT`p[?FY+d[\JyƧbaeZ7* СTFԎfPf"EG
    I`" |1bv9<}XY҈<4nR]#f#T8;y�3P8+~hc,
    lnQ=6Hէ([_YhApǖU&O"9C(0>Gy2c;d)+_rl®+Q0?5)AZCV.qulv*
    )_?="P8^M*4!qCP00SOL0ASk4T+s|k'-0M) >8q=֒XJ*K٤R�.HLq�A.fڌ
    !l,mpl`c	cGIѬII[D>:&%|
    )CzӸXӓ$y?Һ2XG1/a<!>12-j;26٥TD 笈KC^1:KK"X'\s z?B66Pq[U9=e6
    &טn׈c|dl5+|LEvΜӤ}r(;$XƁbɢ]Ïcj$ui!@IpŌN)ƯgDe/"QZ65E<t^Nbi$&SRĈ]֍1t/0UÄ`mjx?uEI<$'p]PjQT;G\!c`!x}vZ;83@T"Od�P\ȍjv'Fyb{6$7
    4Dn8|)_ʨtXera8bV {I
    EH"3,!g~cj&O2tH5/cӌms)R}br%S�L|$E^|a(</$/
    V;>jWTwnUuUVR~!y�#0F9aÓX>?GPjQfkcX"[,=ȶcYNm85!ΩdRf`)\zeʃa:*c|%@
    %{iZPJ;wrOc7xnPÊ\-6XYdNbD9"@(6\ni:*rkp3J͹)%y* iL^UXC/
    7ف4?[H{0	^P~H	 %6!GԷ�\T05()(&|}yC|H.׫shB <߯Kް+ǸgYA6@gXlVT
     LDzSz@ra%?7)˲9A4F2@ %^m]l#"[v4ݐ%i
    
    n<_9ʘF[č){xo7zJ%.oi{'�.}z'ӷoA?jcsӯ/K�~3Ouڊb^e� br6HVve,g$RM[Gn*oY-|W$#'l`sB0xhVy=t/1;67FB>$rNHUnVX~;b#'aR)!%$'hY~nd֢Xz:no12+nyT/yc\zO洺EI2gl9"HAxYYr]6b7HQ ' .O6W|<>wT5ȲAEw#rh$y4xR3F;{qbQhӢhٸRĻar+ir|y#} G#$K J.),Rf2~.M9�T?b<:0-J!^D>&?&f�I.:e+H+DYq#z{ώ$xx0`(TuT Kr S[H%@!ܰ,ő(7bXRBv4wQHU-bf	D29tS8nKNEr; $g=PUgLmLtwcD5
    C@{<
    %%ؽI H
    nߎ\(P8:b7+9y��[}D;DaC
    l>hۀk$?*
    qGrPeNj0cKL>qȡb%;!Ȱj@
    eI^5ݲO$c
    &?pDvƧke%rB2a>[Gq3'? A^bݘ+b^e� br6HVve,g$RM[Gn*oY-L['ϱ"Ưcl42V&K%,gY6mrm;/P	n۵RBJ3H�Z=-L�6XCcϱO$˥Q~RaX	if/ױ,V}ycStނ1)~X%B$-8g#Cx{
    UYts&zwA^^10C,[28xj"|ކ!7yA H.dwj!ud{aX><2� %|*-
    s<ڞlb'Zf}}Rɝ`]ݚP$phL�O"_le{t+L9I!F"n'"v@(i7YLRD"օjVW2ϳ�WH32yX-z{C[xݓ[/$6^tr˦n A
    ΫxsOFVgOMe-DH;E7
    Ȯ,�n͓DXXdlX?)ua"l#veyoC}C9Scz+ڒu+oJU2Ü_X-Dǒ0
    MF5[^<b)CȢd2|ZN$Y-ٚU`~[!֩phQ]V
    AlQȩKq\"q�iyjGb[@;)&yYg"ّ{QC
    11
    B@ys VAě#
    y6T>8iUrC$NnY+*騮ť뮕zky&2KŌ;!p&ohhru
    ;
    DNͫv馍O~BrghJ#G'f?X 	`d7쉑ŋc1�r�?ČXYio0WGYp?*@^MEl\z#Q*oS59aɰX�/떋�@"v-1:sx!tb>Åq@c4γ5ke% F.H]q}%fA8v.\diCE1EVߞFmuu"L,m53#goaf*,gB[!hDC)8 TOMJQ1"EuqΒrVtİ)IN+J&Q@AQJ	wgV62
    ψ)kT9qjLȣ$g~|6 MNKJwj55jħY@Y�	-bdzԳO=EbbP8kB"UJ1<WRڡ;b<226.Ğ)fQOx*j0Zh#pGByd{7Cs3Y['qV7X}3Ytf	JjM
    ,%h$tN-e@A^P/"%Zƺ07.Yl)7$=bn;s1fQbhP	GT2<1?z
    JgJ5 N1^@c�v?Y`.]:%<-Ffd=l.Ł*ʝ-нj6`{|[&MSNA?ig$a?hܔhqycz,jW
    S'N�<x9ԮKf;dhi*'}P6lqO}Yz8 "d=Y4	۸or;Dč5<32TCHgdߒ|Ol TZgx1aW()fv%Ly[Qia
    MlCNo7jx#  j,?q$S;[JoP*(eקa5
    8źN#aF'93A�	<\ł̋.YdG�ݎf5u<fFX!0sH͵ g1dHbA-	4Uc
    #Rt1ͱN4 &"i=xRX21JǛQtW>$cXA`㊽c>@1.Rag6^#2HDcc
    m(Kx~̉s,tiK:Gơt
    Q!GpՎ -dLsL`~klܨ͆ÚRrz9/0
    ϳ�)~S
    !Ɛ	Q#Wqw
    X~RCJQ/4bx=l 	b5WQd2wb9ϑxj?( \vysۛ.OzfQƹY?5xCw3F^Dg)&8}EaV`#Z~VOn3~r/qeQ92^zJYGHzV;4hȚ#1YgJ%lfv*�̄c66I3fz]�o?s0<(hu7ćHH-LNr
    ;HSy‰$y[kGDKwMCN^c�e$F$?B3b-F|q*M_}&bkSwbCjSr	~6	`,$dY{[%Ѣ.4eIR[-jxVm^]B|)�/d7!mUTHlFl!!\<z!GӾS^b&qg9dYKay�싉Y)܁ߊ!K
    .w4۷E;I0PDb�d<Z
    7ybgٰ-\%Kda,2n9#X,XerWkaL|	hZRux"<LJOby#,WZVtSZW[+nR{&	49"Xd\H:ǥŁNP>Б
    ^Qsѥfݺ)HX#�!W9#?Ńl)(X 3	dura`-KQC#e L#2-`9j
    0h͐v$+/R:(a}c\
    dn? 8LCBҖ'H	6<<}+̌|En?dҳhҺݯ[vr	~6	`,$dY{[%Ѣ.4eIR[-jxVm^N[B2*N8*J#0d
    3\sX5֤AmBmqC>C&D$DznN0dGRS,`u/6#)ԵF:tvX{#qH~4d܄ MQd:G(HJ!$tHĹ!YJWq;#m:B4F+P*DnKX6Tqb7Z,o9?c@B$2q89ILT^	Mנ`(RƩ]="ƹ@p,NgW)MlxyTV'r25ugNm;uu_IrOTQwNhX\c2h3d#8>Xm^2pjݝ"Wf
    WN9RhLdTw1Tc|=
    )沅+Gzo$ot yd_iLH|u`f6Clp4R4G8"v\;OUKV[ؾܓ&Jg3V|3L%ИIwa)}
    B婆ZU66VB̀7HLSa2@H¡˻(?
    a}:8b`Iu*�Ӷ7ä!!aQ\K8M²{"çrV؂M7j{X\
    NL(:LFJb{ay]B#F	Rfw&k'}^k
    Q0ɦD#g.W0T+B\!+? Φ~ndhnK$L+=WUphNODzr3aJ]pnæ H#x"܍LBUIjY\}DFԛ_h
    .7ɆLrMgj8'\ԉ%".)VG"IHL֧spбRb܇Bd<`r*Xn[ܬT*ˡSDRB@xSg
    Xb6-gi
    
    jkAr|/٣N4!8@q2!Lk5=CB;"hƖ֨DIύP.>MY?94Fb7}L]f/KL1>#؝!#~be?}�*󜏊0EC.d)6r_Svtל؆>̈zL%İy[A71ĔsFkd:zP$S^7lqktI�|F',ƗI32yZ0\blaɦ`Ҿ-l$yڱ
    {CECdI�"Ts+^5c;-z(cg	y"4NM6|R\fWoߕVBЬuq2@;:))a9ŝ68AZņ;R%N*d!c92gS50c+|0HpIy#
    (hm]viU58C$VKsm
    i7ɲ}p9[;?HG	eV9Ȓ@dAۮEkVBLT]@JqzS;5˄^
    _;*R'PK%٘[kgH;ΤKG&\ě|)W[h2LbQ?bK0{A!ݻ.NECt
    t[UаX#%>>xR,:V7Ũ.NйKA?v{#ryBHr|{�&W%-"JPwnQA6i"hXΨs6|2aǂx�t�
    O55mV$ἤ1
    ln˗
    R�(f;?#[hL7[XT!]v;Y	BU
    d[zٽ%>UIU,Ɂg�4pHH-()]"mLJ\	")qHs f�x�[X0^d i*wCq<
    FXCyc:Ǧ/=	fWi&d.i%zʼnaIZgv`kI[nH2d6t0>cqc:eDzyxѢ""hl@Syy*fuwTE8k-qvFlr*MDY%y5Buv@[ې7"y{T>ǘd^ӏc~58yЮM2E1EJIBWxhv8"
    aćDRDJ?ߕJĵ2qb;Ef-*
    )Ao~5&\Am1
    ׶:QOd2&q:ͩV\#|>6RΎuA[&c
    oQe8ݝ%,m̈U3�۫/xKY{#m�9	0$&,fbfg�n3_gI!y6_Fd{"MmV5]Ii{6Y.+>@aԝ͙$-:'\jDضv/Qe?}�*󜏊0EC.d)6r_SvtלO8$2P�ל<tmdܺM�ܱ)qVҾaB{4;xq.oG)�Y^bqc3PPB4J<;VUfҔmWjMT+YYs![pPV]H&r|D-g"{)X(ΘsFiPa[NuE;a1PXcq=:84WR}KI	jLÛ�$+0o!.WBAMX_+Fb!bR52#egŇaNFa=4ł-s*d\ʟ#Ya;YZuJ@/?!;GRW
    ǣTH[A^.VxMD+C,J+h_-Qdl 䐾I	(d<]]H�$2Cݶ3ncn-LrLsmH>,G\qoMMq^RHDg'')	z5k-yХȎ@?%�J\~#}�M1uC!L^c,kn"RMszȏ՛BX4XYGy~Y|Gqr[1;ƪQYseMJNCTǐ2b=S!_1eM|C FQm8jW6R4^?YBPFFt[:X!G#�@yNʂQ.%QZ(Tܩ)
    ڲڌr>Ac9d;jذ9#čIi%v@A68VD̝[$E9>	d=�a+̄p|%X|;ǁV(Ԡ{ko44,pgT9 1AN2ONQ	5*;6dܩ2%e
    fGf٥d8n//I))X.1d| ,ü@5ii}*%dyl‘|.VSRdZĵ<!D '!-'=URO!@xіbcai@(KȢK6F>Of(ŚenrKS(ٔ'kL)y&U
    VSo;~c�@sdLFN'.go	KS_o)qLUK7i\]>'=\L Y=(-@lbvR2Zl$lpjy20%2(*+L	CX#aH@?EEۨ؛\W]Nנ!ei'!d8�YFq`bאuIor|>_fĵ5ScB".Mʈ2
    hoLM
    Dn1,fK)FRԤx
    ?nP4eżDr
    X6I11.EG0_ECS.3ȸqr2Vp r	Xa-,-%(U\7b@K> `Dꢈ0^Hc9x)`Ѥ
    azd8nSiHX~+v$hL6–_Yy;'"4XJ/eؾ,ch2k)(4%6>@$7GfL4!xI	Ȟe	80CP<zIۆCd'zLb}�˚V2\c&yw0v:Ooa=4.B! Y3Q-<=-lLfրaj\\
    r?SL"#Fv_ό!<' `5NA!?%YnzG"4XJ/eؾ,ch2k)(4%6>@$7GfL4!xI	ȞG# LG#`04@Rt"w!Krt#dF4(/[;-z%f^\ Z%8{cÞXX'I`Y>bɉQg5Ql Pj1eS?C>鑲O#XBNn+<1�LDKT#[Rm7+?DRN6Nŧp귁�Y^5\Y-WJi*~FЩKUpaCaAoD"{xа(e/LKΓ6wFCqk[5CaKs"?kb6K7&(B9^ns@BL55<),>;:<٩7-q.Fȵ9(wo^x}$+d;:n!uKˁNAc) 1C12dDY{"1'l<ZD#-roV:cDQD;[s.cx\[4IizvUq]면ˊlhpCƨ0Idg=GIG/>d,Rf^,u\dZexrLx:'a̸̡\k"?fvb9v`m(G'7:]mȅg?q$O@xи4d^&''R&CP@?wJ+WE\#ib?`}uCb|V):~ϰFM]3:(񋺋o&2r	l`h!{-GJ>=ΆlL@BmTّkMVQcu	q)Z<͸}Dq`ϊ%ig2RL܅wg:!ѐ
    P#Eǀhne\oL0&dBcy4f55Ɣ0sH`KJ\cNhX\c2h3d#8>Xm^2pjݝ"Wf
    WN9RhLdTw1Tc|=
    )沅+Gzo$ot yd_iLH|u`f6Clp4R4G8"v\;OUKV[ؾ(QїYv^)SdI$bt`XDŽiY]ENXS<2$'ӦĸXHjCUÃ颙p[sӍd0E1&$aV\I3%{tʅaܭ=j3\QM֦߭(k7| =0JPyG<:|D [GeM
    jrW!X9ISic%'Ӹ\eˏxS%	MїU\:'$Or^Ie<?2ƃIBBǷ(1&Ę�ٴiMvy3|;oű?a|y]`8بe
    dR"
    3[@�F>dvҼnyuDaMGG8\`HV81k%I8BW3~AL^ܖH6V{e	y[�5]N8oAgZc|쟽im9ίѕ|F�y(<ϵ y6:dd%b0Z GrkTZ؅*?& bYy[p_!h c=8w5J)ɒ)pA3ZbP&Zi0F-5dk1
    Mѣ̄#D,v䐘VW./em&蕥蛨\T
    :Cp9's4}n(
    A&N)S[Ȯ(l5{;A)?.pF??U4p܏#nt>q%
    .r֢F7f?EHof@%Id	ىcR44]ٻgonWlH恡/ˈdI'lm$:H[[|܁W<cYR-`#2go=vʮ?WBd_$=/e9U"K([
    jM׵u oiMzζ߭}x+WhWõ]_ׂv|;^
    x+WhWõ]_ׂv|;^
    x+WhWõ]_ׂv|;^
    x+WhWõ]_ׂv|;^
    x+WhWõ]_ׂv|;GY(YqRw:2.[{(kbhwoV\UTvczdOeW)-u[Unߩԧoc^
    x+WhWõ]_ׂv|;^
    H{8lANispIE{qScV͕]Eknk)Wem+VЯkZBj
    v~Γ:ϼnxB>iy^c>]݆[]_ׂv|;^
    4+x
    Ld@DR$ݒgf&Ժ12&qWfiШxCntV<+VЯkZBj
    v’<2b)~Nn3 ɃKH
    j[XA7+j3fIk~
    x+WhWõ]_ׂv|;^
    H3V&ay}ջ\^͖q{ŭRNԡKb[�W[+WhWôI4#H1om鉁ɝGT,lvRyDU4*ߢ7-5IKwwL
    ZDmTP]T'\u5ZK[VЯkZBj
    v+VЯi''k&PI'-INDG\Ŋx+WhWõ]_ׂv|;^
    x+WhWõ]_ׂv|;^
    x+WhWõ]_ׂv|;^
    x+WhWõ]_ׂv|;^
    x+WhWõ]_ׂv|;^
    x+WhWõ]_ׂv|;^
    x+WhWõ]_ׂv|;^
    x+WhWõ]_ׂv|;^
    x+WhWõ]_ׂv|;^
    x+WhWõ]_ׂv|;^
    x+WhWõ]_ׂv|;^
    x+WhWõ]_ׂv|;^
    x+WhWõ]_ׂv|;^
    x+WhWõ]_ׂv|;^
    x+WhWõ]_ׂv|;^
    x+WhWõ]_ׂv|;^
    x+WhWõ]_ׂv|;^
    x+WhWõ]_ׂv|;^
    x+WhWõ]_ׂv|;^
    x+WhWõ]_ZЭuU7dtP~zFrj.;nm[ԉR]M'WoF/l_YAgN~ƿnCsf^1mf+eY96Gn,R|>
    *=Qliy}Q~"%l \crHWäضH
    '
    f%Jq*dTb֓m6:DKY`A:/c̸#G#H;lN8J�U;Ȩ
    ŭ'mUbm6md&Gdxl;DP39%7rǔћ5dN`Ӄ4t)kICQH~X:qo/039fjҁ/p:sWMԪ;hBEA~.mS1t�sZl:%TnmX,ŋ^fOƏtq0Β 	IEE&،L9!yJ`Ve!;kVWxF-ٗgT\(zC{|i4VIxKq8%HܭЧUwnQؕXfwKB,@蠉soaQ,
    p=+u�fje֖,X2~4}N!2<5$a2'?wtq(p;<g)$w֯G[;!KXJ$G3,2�dPk4_m,$<Ff[ }LBӽewh"ݙvuMe‚4+$wC\tcQOfRnS$;3dƱ3֭9ű:WJkl-NMJT'5XD>3H͈ň>2L҂rli6.Ve/%xI5D9r$w!#1C`7\]YY.	:LjZJ:
    2+
    bnulBf<0ـ=%a̱'&heOaEGJ6761#/ـZCR	V;8282D#b1b4ܭ[{Mu謶Iy&gMfQ4NdFCmc	0yHP
    %bpVVKN,֒̊G3,2�dPk4_m,$<Ff[ }LBӽewh"ݙvuMe‰/~e\rӟ�%YEDβGGHoQ{̉,tH3RRt	]Um
    )Tvj;vz11-EA&(D�A)KQK"cT|)aO9lҮgѾ/Ή71nʮ=+\|	s6	+\Œ.;$17LFHi:b^HžPD36>|a/	93M#0L'Xi&!jSo}y2T?\I2{-Hܗ"acNݛ0{6'`?4.b~:dXGkhM3Bڊ`¿9wHm>=,#Eɩr5q
    GJ!&
    }~$Gt	YU1SBSWg.h"X*wFhfv=vip(=5>Ć&7+Gxe:G[ҵ,"L{#ъciˬ{;tc)>2oa6lk/y#;GRœ}tdf9]Kq;]:ܦ
    g:6RwL%3l)H_dS,e|H(H{D.7[iP�')~@Ev$&b&㇩Ř!ZŁ"O+fi^*J<
    Gj؊\Y3x'6Gѣ$iq֍Ry
    HnaLn]&gpszl�RH-Ho14q\JdJv\cp'wj5,xD2{Bܘ 拡D9F!b$bLMrO&^x,jMq#e7RѪgZGvLJMR2C5"^#49Œ)jc<�˙9~sMGb1GdPi])+r9iY0t\Ԏ.l GL'8cv);
    r=4hhfMnҤꝍ,.dB&$NX.aQ4#K.g�p�ZP۔UU*?<4raQ?B˶
    
    ^ܫTnj}#{ʼnf惻{|Te24/	>%sϐpܭgLL4YN>
    Ć^E3"cʤY"#˝YءGQ{PPRtVCi�"xU#S%��~IQ87oQVgC~p+uu3!c"B\FII"eLp~<`vsubbT`NCuWJ婷5:Gɩ|*:%H17q{rWX(}x&G`{UZtm{,i:ƝE‘8dY9FQ\}Nr+Ch[X>+X3{/*)L(R�ؔ&S*Бgca`tL.*
    j@
    6e/OJb_9^t6X}O
    8uhyY�luגC�r^'XL1lՉN\	"d܂H͕!\EWݣ&)$#CF�O|vWu:j@)bSl2+HKHSVyzj[3&a	z
    72bEQvmzasO0d<:}Ur5"auSpr6w
    zz9+Y矒ǜ^x9Ĝs^t|.v��RlT;L631L|HhL($r�L){	_K'?KΜf;GΠ?m+?]YL2615	 O=!r9ǂҰ%bBސG7S"Iк6лy1'1;F21KM
    ۛdUIޫn-)XyEz('~(9Ǥ1ˑ;=?#(G./r]lz3̑%zs9|H3W}@}
    mL%.\lW/\E"R>
    xxaxe=і	^e
    	(e{H͔iqjvzZkv^nh
    y
    M*!V12NqN0SXe&Q<Io'^qdoe�TqN
     bCLAJNyT#60O=ӱ`FHT2ndk
    Ɗ^W4'@~foK3Px?@UaW%~km%[ѽvNM[o3SfE
    HGb(W(x$5X/yj\WcoMݭյ!-'G[LID	̮e!QxnHDTS`P /V(EM[kѓ$fWB2T7$"t*H^)(|rr"ӭQ!ʤA5'#xa)>7=
    'hxP$ˣ-hhN}HKdQDr|3+!pssCdTv^*:$/>@H9e9ՊSaSlȮtKJ#L˸%MۊMn2As,p,`̤\vuUSο':B['GFN$;\	 BPܐЩ!xA)^PNFG†D
    bڊDk*\H→L0*@+.qe:g_HrfEs6^Qe]-"nRl;tZcdgkwe$LW[*Z%ttdi("Az>9*;/
    
    l
     $m`+*CT4hx2oVdJr֣*Zݶe˝VށRd%ttdi("Az>9*;/
    
    l
     $mb"uq+yw<~@xRJяs,`M͗<5.	TƷڍ7YRCz#$BW1RP.
    \$r
    !-'G[LID	̮e!QxnHDTS`P /V(EM[k$9M"u/(2.7n)6T-̱3;2
    QqڦG+וVOLA#FJj2dSzڊ(mꪭm}8L}^MUSQW[rݺߩMLS̓j>x!){F
    ƛBę$إIK˚gFWw7eȖZ}\eL1ѕN}Q2#x]&h:sc"QSMֶn67'i?ۥPJL hhR\A\Cc<qpqTK[%iվߢמݫZԽm2FĔYQl=390?cBXR?rNu	ktqK,y:1qnD켈KIٱKגתqqTr
    .J/Y$oum+6JJ\S#]R;{zEuUWN'0
    0bw-)@2P2@ޡt
    'wS+HSݮ*q$NdPR{L&rplv~:VuXX$`ڝC#UVݺi.7pಘ"[i&4Ï.̮P<ks]Ds#+kJ
    RX%D~<ix-sEW>8۽Ο07+=|fg9ȸRyM&(i|ʙD ~xw()}R+'9s(̙CV>Dq^pfL4|s8Ǚ,r7}-P{*PhFBHo"jMPoNʜq
    7dqogOAviTd,(r3*1qr|X`d/%Wk7Jޝ*V>20LNi%,#YA�HM%؞�DFz5YpfBY4\޲4]f7"]Țo_>./"sWdBjb+Uy
    k[TZJ5:,z7@e\ps=(C"؃Z_c1#u@6)Ka
    G2Me`w%#a#*L^8NXI.zfpNH+7bS
    2p
    bsxHMJFA%cIOj'#jFޚihIdLOMl""yB@T�ҵM&pLmzS;mnz\gQiA}y*bg%͠2XsdfU/{P+=Kɲ!`l5-rzUte=6onC!gó)-<)Mki
    ՒD)Eҕ*\X[m"5r/3}\z:چ7P9!bUn"[kpIMv)J*Q^O:{_]^(ey33R ")	7nEJQ�T~reZݽBg5npZ,XKP/ci
    L.ͯRS}^=F=@k-S6Q+-awV6 A0DjI'љ|8%t	Y,#hA[txtȢuT}ǷRBfEK	ŕdFfT߾uAPJHgW4~S7N&gyx"Q`kϦ�wCj~ps\UkT4@_CɼK)M&44Ue84+X<ԭ~JժKyS[}CwLPcjGli1,DbaF$pMR*fCkR2"R>䉕MQT&M-͙{_y[wɇ&F[hFroD/KƑ|O(XE
    ι7}fvzw'%[i(G$mʅP7lq\D뎩o…+Oń')4�f$ ++X|b+}삑2cuٵjMEH0{rnbZC4 Tٶ϶ABB*؊X:U$2q}D@[,/{t4r5o\uqeQ*v؞Pxb cB'\4'wqdY$JqĖBI.!%kwm%Ɣyqd6HaIFeYy=n$Y.(S%7<N{_tr[~:FNpkEg1	^!"H:"\\_jݾ~	@ 1W4K⹓!aߤ'k$҇8ȚF=0NHmDŽ.<+F[h.pӰF8t%l
    9Hmh\BH,
    =.23>c8N̙m%r3}\zFu=_q#:둝~OWuο':g_r3}\zFu=_q#:둝~OWuο':g_r3}\zFu=_q#:둝~OWuο':g_r3}\zFu=_q#:둝~OWuο':g_r3}\zFu=_q#:둝~OWuο':g_r3}\zFu=_q#:둝~OWuο':g_r3}\zFu=_q#:둝~OWuο':g_r3}\zFu=_q#:둝~OWuο':g_r3}\zFu=_q#:둝~OWuݍdmjܕboKv(ۭ)[v$8/boM;޽n뫧m�W_$=/e9oUZ4*4JfNn,qX=^ւTӨ'Fު_"8L6'bw:U1 iw>̝XY-HzխQ)pN1CԍU`DpmENuxtb@t}):Zb{Z	S#NPRbשz|03y0T&TāS2ucqd#VFF8R6U`fa.;ZoLH]3'V7KR8AqukA*dij
    \P#oUX/o&|QBꓱ;EtdlW;үd6n?N?7	qnU*[oLH]3'V7KR8AqukA*dij
    \P#oUX/o&|QBꓱ;D*4JfNn,qX=^ւTӨ'Fު_"8L6'bwQ>/MFF<e~-*L:K;p.CfH#<q.^*_6H*`	�FB0K{*RC-
    _-;:"7*4JfNn,qX=^ւTӨ'Fު_"8L6'bw:U1 iw>̝XY-HzխQ)pN1CԍU`DpmENuåS{LՍŒԎ+G]ZJu>HVGɆPNQD]4G82v,
     dӏtF*[{Jر[stjt \]BEէڄҨMvQU5];UNo�S!1�!*,lp<1Td3!m�$1fOc88"@c;gA>
    nB*0hy~#fةG%#nPPs\O`<(I-"0GITĦqh�g-Y%RΕbeookt
    V.S
    _E]E15;ŷPvG2( I -ZF.v>yp}bo $ T
    )Ň)[fLknjvzVWքdP9!\ڽxyʹ}y٥ieŊmG7֢HRq(Ӹ,NOaZihrv	SVnw<	�;")H|q3xMh-9)x{{[}* 2b%t	K
    q%ev]lsMdbLԁJҤttOfۊGX2?.?f/sh)�_"&CWжM9rc+JChB`e"W"F1Xn_*�`2{d3@Sʝkr:ukN%5 lE[܇;Z]T#I[۷4o~˛VdZH%@QxsCKWV!vGR;P<s=?5�]Pq%F?s2[|P?o;agt'.}	@rb,x_΃K鱽j&N7>q|]Z/DeϼPA8QlZŏvIs[}67D>FN7#ޛP3$H?|&*$)Jʒff&}c7;ZT a*56p}y6@HDk.$>GȯsanN"R+^i֟M+7G-opLJ~;e0R-bV&5&
    
    ]QWu:KW,B>Ќ2`UĮ/$b
    +VXָLq0YeO
    Mu7
    Pcpl(lr<]pH|'_x} EvV+N-+?9* O+T
    8ȍ@P*J\|ɢtSKmnYNclԅcX~L2`
    D'2OT
    L
    J$lR>)Cu@JPݰN67¼w?$}?}#4V$(x_fX=U?~@}+f#u%2{Ɯ_AބDcY\q?[4WٓF(b	I4O3
    7F3>A6RD+wtw=KM&wW'UHܴW)"Iޙ&"WHTYV[e^W<@+zO-H*GGDm]:EDZX8jRAR
    TC=44N*im֖)9lrPYqQاjd4H*Hȩ⒃ؚrvSfӛj7lkwrFG짗V F 88q۝	&/f4Eq|kZ2`bU҂bAVqXkʭrb
    vjLNXlnzԋNݒMĪ�9B;A{
    }4mޟR2۷*LF]:EDZX8jRAR
    TC=44N*im֖)9lrPY(#5đ?&>@7dlG:q8H3BAoFHT[ujEw(oNb$TvbˊpmV(rnNkw6طsm)oF/l_YAgN~G^B6)C>Kp.2fķb|rM4E"yRB<ޘFDz*K�JC"?:(#l6qC&I¤y:<'G8>NVձL %u3Nu9+
    6laWD2d*G=#oqz(Lh-[nWS9Qmδw[x0'̖͜`6;TB[[a(
    Vqd	~S&/J2< BWS%?qg6e,&adQ>8|-TŚIkkV
    @耇p,]z$�19JZ1AԐeXZ.kPVuu'ը9+|4AS
    a\d(fG�48-t#7
    TΖ/W~l
    d G,ЌDvؙ<'wj_z#i-}rjtH]E^=˯Qd"f9g)R+T?1RU-jJ~q.dyٳ؇}<;R[tl%aJҎ>́8rDRWgԕhKkJl4MdT$˜k
    *'{@
    .<%#] +HMG,B3mߛMsCcluq;9?Jf#\wHgy!
    zRDž	魑b q.g7ҟ7yKK/GN+ή&ڔq<#'ݍ|ٲ3eB¢>QY)H.001w{Ԧe|j@E[Y-[](F>(~GpLؖ30OIZ#2FջȤO*ZHG]ظEI`O~83OY%ץG엣iq{sWwIJ8>lseaQ`\(ì$|\mjS2ZV5 "/G5qO&2|w^L5ˌ[=GŮ]v&]!JÅ6jͦOTQwt@�auM1#^ ?;d8F-9)K$î'ZR״&AѺgrZҟ٫2<W.2(1+dj]"*VHɢAgT,	[&?H9~*ESu)fbQT݈#ėd(mx]g~nmzkzVՙ3$Ya9	0vU?gʥ.[W刕GGE	x} ˜f3gI13|TvWI$5xrD-#-!Jtu'fq3
    E3,U&ɈB+bu34wkU#VXWzś&HrQFR?c3tUg`ظuK~ /s 61P_'[.PPTaH�KE||�ɝ'0xz^LQE#[F6*Oq뮳mrHz�f	fBv*"&Q_G!N$}v4rf0w-޿ln{|$9ҾQ�E:L( '�aGl[m;DWV4dkLаpO+zWډN.Oz.\#L[CH~Jmm1RZԧ~-r3?LRr_wpb<f:K%2IN\ϡ_O"wI۫	?If1ˎ;r!]CVR�,1%r9׃QbYS,ߍÎP xȐwΪU$A,G0:`1hۣc4&gGqoz(#;ロ0~ّKkKn/<HOq
    5aJ̱NO~!#C(;6͘?D37xqK+2\sg|<|o))&ȫ\
     �eeA%
    8D69qR 4/JL(NJ<q?ͨp1$x~BAqrjJz"6i=BA$@~'2~>q6(k'&3LIFMq"U&i(W_NߕVBѴi[#GB/OͥP+t@!H'[6ƆE1&IW!2su4R-umT%Ne�28`FX˜p	jHRo2JQ*9sOvfy)p*F^,ԡk!B<yЃŔDMC	#LB�	Q46*)EoZB:el"NFXL9	pBKp1&@bq`F
    zڒeRu1,!DLPsL .}q
    = Oo"5KcQ4#'A(%w&ba򤢝F}L=FJ�ߎPtt88挱H`L~mk+ܘR2::$mLb?DYzJ<CD~GNіH숤,z5m6P%Ey"H=#pExsLjd3qj=	0",]E[6TyC"KĐnoctM8`9dF
    n&SDS)ĩkL{`ub~z>\?�)H'_V*s'l~%f*XKԡ3e	d`#ז[畀1W #uс̕bFIuxq>D%	yC,XS)gX7
    r�P*/)Ic!yω4͙~Y|nr{Fr0RD9!!g.BUe.JCPJ$}"]psf8q}ƏX4La]ގpi`3tpJp<9ĝ$41HsVV
    #X�)	1JiUf"v
    P_neEJ~QLYj}k\pG3
    b=ȝ"qIOr#*Uˊ-)2BBy>?G1�f)Mig,zB%;yGH15[G,9 Jjcxlt+n2լ%{2~� >^Ec<gX
    #eq虤\gr@
    rdZ-l=`DvB9�&',{N'")ȉdhzL#`kt~[ Z(eӘ}Е!̾KX(ڋ9~s$Q,8:B3j1J~9!^Ҥ)C\ds[ɲ|}|n1 gyaV|d`͢+D_+hOXf$,(&%ɔ
    :!{huhE
    ՀKWY-X+98b;DY27+	>X#jTʙ#0|)\ߜ 1m	KK-2
    t>g8K�� NAQK(x8L8ًj$pK+4BU`ɱ0Ř)!σ9`Sio!܌tɘ7Y&ʼ)&?CdA5fVz?ϛxĠDA<D=4s}lhk)a@~4d
    9oH=CÎh6ɀ##bFbƠ\;%1KȞ:EF1|		9&=wī}gqS+1EfZm!�%	ڲ8k̙Fu}9:L[lJw	ɘ>ZpzSx/EC`4Ydw-dJL_+fz�;u$WW2E$`7UX*K2.t
    F<& l
    H8 ܧjTI#a_)_gnrÏX?Ǟ^5Ә=93#Վ8 �-eoOHYس}kRDz
    aEj!Xj{hbXqV̡8ˑkťya
    "PqLYFIdȗAbFqӥxe7'Fp @2urhu^-K<ReC&t@dwҪyPA+sn
    HD^?HxӴؐ-0Gy佡6'9˜>$g4Lj[IWM}hx
    ԆD,#ք"rܵlp :nCGVSd#!R;ǂInjqHvymqN>vX}L%nJ3YB$SG'	-SǬ-!	ڷG"u<Za<'&<$MPi!P/GT}m�d;,xC<�Jc%@F+_Z#WHiq2w!:{}:;sjKK #X[(#jhx;f`iZ(ʖLLk/6'ܱL8WA&Y b\9#ccf0#A FPJLcM[=-.cj*I.D̰$k	 ){)vy,Pg:HH 0Av!&%Z%\'0BB{qq1pt7ِF2X 59>\cm]J`l*3$8##9+d;?8_6Aɩ)苈%6{0d ccV"<Mbf	CE3N2d7tO"-ɳ(Ն$l
    -0 =NOh~_+db&h3nk$ksYbƀkP0͍8!z|N8`cGC^~1Gp )cU,߁ 0$dz>9ofxce(!m=Neueƣ4?`{$t	˲}!dr_"q$52JӔf":BF["]u/uvcGf!q6`@zAш~$Rq.2r3asRL\!,Q-Ja*rqt&街v\_bK8_f8w&C(]gQQ?H<�~Lv>۴k=#Ō"
    #_|H\y<4=*yv(K]2K"6e3A=H >mG3{)A#	GrYCo0Ia#'�&H/ ׻d4tXYtr|<\z&i2,Gܐ\#Vd[X@4II�KӾIȵr"Y#%ޓX]#Ytt%Hb#/
    *l729Fex*z$9ھER@zv״$zgP*0&lqr}aGvżc3hJ>t%E4	q2e_Zdp~0f5`p$KV7N',!G
    ybed}u=v!ڕ2H.> dW7(93bnbRfLe]86(h}@TjF*$1415tO�eѧ�A?WBd_$=/e9a3\KߦUwjFtXr۫nWkIÂkIÂkIÂkIÂkIÂkIÂkIÂkIÂkIÂkIÂkIÂkIÂkIÂkIÂkIÂkIÂkIÂkIÂkIÂjQk#vQѲ
    |
    
    
    9b[WT/dmbNeSkv6zo\{%.]߫n7޹OĜ8&OĜ8&OĜ8&OĜ8&OĜ8&"Oi/':+GBGW 9LZu6mĎWgk^wn٪))8ܖA(VyJs![*qIDcDc
    Z>֦3ǻwXm�v bb"q)'~HcMPk!iDf	Qa
    Tr8pMr8pMr8pMr8pMr8pMr8pMr8pMr8pMr8pMr8pMr8pMr8pMr8pMr8pMr8pML[=TPl}xrp\Х6+nv>׶j))))))))))))))))$
    $3 $E%'g4tNP81{I{%	F#k]ԝm
    (	?Hi_'wrSSĔZ%N5OK뵺r8pMr8pMr8pMr8pMr8pMr8pMr8pM!J$#wKdP89aqL;kGxvf-JѤjm=!~Ȝ~<Jg)I#bߺ4S46T>8ZQ)qvTXB2{\NRG$NjoV=/ϋ‡=o.pdnH[sw{ԯ{jS{IÂkIÂjdufPڑ~|N׳ZD'	I]$^QٽyuNIÂkIÂkIÂi`6D>MYyKE"n.R11>D}
    4ê_]Pg*
    		8*&*8ܙxhhyCB;)Q"KfdQjM4~$5~$5~$5~$5~$5~$5~$5~$5~$5~$5~$5~$5~$5~$5=I1‰)nL	%)It>Ih"}D^@BQ,behlx35'FB$OEܔpdq%jon)SS:nrN\N\N\NG*$
    )R̀;0; $ceG$oyGJT9Dmj[~$5~$5~$5~$5~$5~$5~$5~$5~$5~$5~$5~$5~$5~$5~$5~$5~$5~$5~$5~$5~$5~$5~$5~$5~$5~$5~$5~$5~$5
    [Fڔ+)$xeDAreԴ+iuJwMw\]^mDlf56aȬk\My]b<蜒q	2p BB~%L,-[}4͕2G;x20SʗQ=&c	'[mqI,ZybV2޾F3Уl]+̩!)7/2TpIg	u~m$VXՌwL([4WC*AHyC
    <m̩~!#f80ugbg-c!oq=
    8/U>Tx?RC*8Gpa3m?	6Œ+T,[jC;zq-^u|]d�tmqY
    S4St>l ۾8xFTx?RC*8Gpa3m?	6Œ+T,[jC;zq-^uy <!6Tʎ3L:nMd3ڱB7鞅Kfq]}Xz	;}3�?O0(".is3!ڦ|@3C{|qKJ\@ؤ&F(RN#A
    V!d`4)<0{\j~"
    f&&GSMHU#Xʒ$ժލ&ry]b<蜒q	2p BB~%L,-[}4͕2G;xo+lG4N3C3X&NHH\?<w$eūo8ƃ9Hu/X_NT6;$"5V:,b*HS;\H(lkVz6
    v8
    rI~fk�$[	;g2̰8mr6T.^NEL:c6,ȩ˚|烌Fv{6}RRK�SmS<p$r
    d́)ȈL#XXP@eqs&2*\i'H¸swލ8ySCr,|NN)\'
    |:Nn *@dtof&
    &ؤՌҴ6KfK/r?j
    ia5$xzV34XZR%k?7jGE.PA!^>sh]#q
    
    bgv!u| "V*[lv	%IolrjL#i0-arTa5W]+s+	1|YϾ%J%(|fc U
    H/7[dZZjCDrZv+.X?@GJ6W|+zbm:~
    G)y-K^n.8%`(buS0^6Fr4h
    {F#VйuqLTܥ	NiwGKds-cb	ɖ5p4@8G`vJijfAb%WJ8yҟ9N~z~ў9_G_eFi}3�la/s{'Y.RaDXdN33e$ƖI,8
    *b;5RnU8@-1CB9aRM W
    5MT^V aׅrl6t-RL蕖c4tyA:aa.	RlAp`ӵZQdvЉIůnX+9f(\؆MX(7uG*V|lrq-+sT
    pQ,cyS-;r{zUcZqb3FʄỌ
    HȕP0NDT'[,HƁRF>vZ_ߥQ.e#s4A@)SBx5�FDKw!A7x9bDr$2'0}&nc;L>\zL;5gƚ#wT%qll7aL2&6_LJiz
    /)cz$qV9iB8&aV�<uˍG.2iͼ:!~VMd2TdDH^]-^}d,i4q/\d	9
    3ove`Ebp6,ZXc|YX픷o\"c�?G2/�W��?�zth<[DD$cCT>qtc:9�Ve&&tAqRZw)xI1a_+eOJv^NW4D".y&;]hp<j8ٷ7s,bV'xT\5~rPrXl.b3jLTba}q3D*)@@MqtL20& ]cW
    L$z
    >Wdm"Uy}3O2e*6e|lȎQLՐ-Gn.Y'p$Z.Ecv]c	N戄W3$s뵑CPMN�U6eJ
    <%
    JYA#I\<o`Vi%"!	B)E)0$/[؜_(qhfbn
    F"xBj(\^@Ǒiiu0VI?C&T+z9PDQ=Io/1T]VdTc'q)g
    !PP>T;hPwckSydDg)$W#N 
    )lRTʹ{[k	m\GJM"
    O+#9M#1=2)
    )K�6|$t#feVJ(p;b/xVaC$ Rdg&ņaC!dO!jc+
    ^8ҭb틗zV攄ՉO>ō&9<t^}Wib@gt^~|l;޿a.k"BgϏäa삀VJ'<K
    *7H$|1nBH&\~b\Sv8?NDfEbBJdU>;g2Ѽ}lijW}*W۠ q>bbr$z$BLq&eprt/6$daY+C)�Em. eJZ:Zcl8(%Ft`ʇdMc)ҵ!}jgsq
    =1$49\}2$4xG,3m1=jp\">o*:r-?Unc4ɑo$Y藎;rWr'Y]r-s|)&L1T)ucH8kӮJݸJ!'bTֿ{hhw&&JXs˨8xPD5;d`ccDEv[Z+ꯨz?3r%͙y�T(?ݼl?X@qcV=GBr|~I2?pIF]1jmq�E}s:>osyntMPnra	q6?e-fHr0ڲ.n*U-<C<)
    L29yA50&WLFVB5eÝ\T
    Ǘ(y}^!55I-fN[P=bhVPLpu"R%#I4\n,7ޤj}Agr68*^%!܊*6u椽vUW޹=BcX�d^ɐ8LuhA4(rrً+T,i**VZ\}R1�p'5SI1A1;d8,B3SkkT[Cy4Umw�,_F眰M*i@ʗcHw"#ʍjx/~+UOaGX.V<,jkd}ZM#J7ܵ;vbJp5WThM`m7
    bCgiisᓖ/X.5S,56HIHpM/(A
    bq~?8`üb9>&(& lhX&wjmbmj?~uBo7Tfi/�ci9:	O�I(alM^NRg\1,T~U_!kl-NMJT'5XD>3H͈ň>2L҂rli6.Ve/z)
    נF+җS	;m9utrkT,GFѦs.2?mtt?qjǨTт3rNO/&CT9(+F-M gB]RՍo-BZNj܉|f%iś&0}djl\~ˮ_EeR)AW9/INvri֩.XZm9L<<0]eW~'c,;Nj,bbvpX+gv&֩뎷T)PuMVhێ_?K=&|h#O"Xv˔~l&cNDH
    Ӌefi־-8:Gy3u{$!/a3G"Xpyb۸b쵝%ǰQ9X
    Vn@_&X12_gSnSwFnM6mΪB &e fyOhL"!9dz3C(fLnmJ+V|D\z[Ib+p_&x8t<u|lg&%b!Ak_'~i#a晃
    �ᥨ$PH0$k1.aet)`4e[ZC.-([{evw$a^)'X GbC28͍l;MAod/ n}:{�I/JUc쁏f~z7RWhY~SɜlV45Jyk)C,Qd
     >8ˊ E}b.md<{rA&~\Ž]2},!4?$aɅV:"aN [DNbыmVNvSԞM軣}2b.TmdistjɬYjKG|G2Id;1Deʐ̙G(!z5�T+6-ZNe/ʫ[14G8T~n
    4Ix%lk
    ,wr5ťYi Lqv̖MCYks0fa"Х*J0LF
    T~ԝ@bЭ]7V#TAlh^l*:XfQV9Krr+7ukv'Gua^brľlӁkޞy%ꦤl7qCNc+[1`B)8\JiLƜ˼qX
    }wd)ZǻYz5H۸n!t|Hg+Ry	317[31x9V ZBUNmn�U,ZXB?3d)Nif)8)g&6PCS{XW'FWֆrL8,B&Q?}lydiF11s~}:;OCfdܥ;(™Cs7	fy;2޽!e*3bģ
    _bqU:C6Rgmܹ
    �?ڈpWv_]	1~g`:s2;_9sdvh5p|5OH;FffF~gl
    j(}mjE
    W\lz:IF6,tOŊ=G9o1U]*V_"bKt	kڌ5?	O�zDpd�J�DFmЬU0O'WsMl~@m(JEqIi&m
    ?0:F2<ef+K40AgȞa$=3PPՇ瘟eV]tOBСT@Ny+ŌI#zQX*Azpc&"t&6fHIn=dۛ(0l/*F2OvԅE+S/g{Trį9#X/r
    ({'#ѻ~@SDӅ]WV(GOa 磙3~Ĭ%P8pS�-Sy>+xXi2k V(2X˜.
    e(d$0¤Om8B.%5rb5BС[[GqnX*5HF.śVW8u%sR=+V*/`I<Z&	_r=9,NJg]9$G'x�mO	ݏqkƥ7Q#6feIg#+R)0=
    	A1<ٍvdM|3gOq]ntY|bp|{.BcE$*Ƀ/p7H-*bqn$:6Vij"qLmolΦ\3XcCn;"H1Lfn-aJem#jb[6ݾ�EN?k,X	Hd8j5j
    }RՏMZlu#OJMݛz8BXιE-d]rL&F9+2G5PpLv2Oi耂"VW%OtQxўHq%t0HрGD20E9e[iڲdꚗZzgʵ96]9U c,lC8W1o/
    JR<`y,=:c§蓨hgʦePVO&PJݠbiL%L{6AaGcxptcfym(ꭋ1qa@Ѿ6:j'5˔OG8vpfz
    |bSM(]Vd֡Ufl=gGICyH.-4%?:1l0h[v{}}=_z?3r%͙vk(?ݼl
    \"X5«]KT5ܦtoԮ[z_g\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/R+è598qӳg B>cW'uC'UnmX)vK]j-(Ktmɞ:ɞ:ɞ:ɞ:ɞ:r6ss3rvww+jY$i.\hxc:νO6(3\8^3\8^3\8^3\8^3\8^3\8^94# ,V4MrR"S+&@l8슪RBE[Qby3\8^3\8^3\8^<, HJMrҦ`PQ˝@hlFҊR:D\Q~պ3\8^3\8^3\8^3\8^3\8^3\8^3\8^3\8^Dc_iEowܕض:p]EM2]V>ϿwjnLLLLTcꍇƋCm|Tı8zӥNcO[߳BeYWڱ]uQMLLLLLLS1𰐱mDG:#hbbhGyRժZL5ݮ)3\8^3\8^3\8^3\8^3\8^3\8^<, HJMrҦ`PQ˝@hlFҊR:D\Q~պβ.^bmf3\7.nuxB4BtJаcCV[R߻MfTgprgprgprgprgprgprgpF faBpt,
    KT85RXԗtMVUKK]g^5gp8c-$
    aI`nTm*Bi6*z6,v6pzpzpz,gs}w L&tMYRQEP_R8@$ѝ%S[S5tѺuV.Wɞ:ɞ:
    }Qarbm1
    83Ztݬ|	+bhLK*V+j)X<>@L魘gGGItpPI;ŴK)djt\<uÅ<uÅ<uÅ<uÅ<uÅ#a_*b4q,g%ySXcVŷЙzUW]hSo<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ<uÅ)aqs;smfpw+@hGr޽^ک`O~mѶ�ͯ荒_ٞ_FL7*?-lo&<k8bi;9tstʩ5u) )W!,Z;	6>8a^IR`w>2q$q/IC8:<XNIS@-%ZLح=q)1d&�|蠍'RGd9H8N[yx͊l;ݧ4	0EƷh1W2~"n"lX!'F7ZY&V$0{
    cw 0pz=qQxR1@;';t*u}䲛v%iٷ	1Iy !ֆC)9;H)VQ:AiܣoKݓiX<@KﱦW2遊;=ٯǭpѥ} ҪC2(cR@},/EƔkc-cw 0pz=qQxR1@;';t*u}䲛v%iٷ	1Iy !ֆC)9;H)VQ:AiܣoKݓiX<@KﱦWC'G|&ޱ \dzd-b=jqd[LH:X(FQP01Gg>}c54UHfX{bc# JHϽhҍu,{;A`8Y cD+%W72%gilYcTvjq%$"ΰ'hy}ѡaKI\XGi%VMcBY6,XRG'}͜7qq,S*d`|pC
    �vIJV;Izlo&<k8bi;9tstʩ5u) )W!,Z;	6>8aQ;C:\J8+H*"mhD_6Jqb֚p},6898o&>lEӋ_bP\ \|n;MTH5ЖFQP01Gg>}c54UHfX{bc# JHϽhҍu,{;D*�.�x%y?DG-CYhrU
    KGawKPըQ".lEnEF/(5RW�{Gt脵�$[!qS]V
    K:dhٺgscG.�e�D{WB` q\)F, Q7-*Pj*
    0vIҔw6
    b 6|dq�=0S@)LS7>KH
    nmt5O.kЏ&l&_☰!/Ƃ5^PGlIX6knbP}27N%::%	y,11,ynnRBJJBCB;ʖUzdWvtMUmU@t*&'NخfHR["f/R1}joS(:\jZHRϧ||piJx*MrlEGy_b�nLb5*{=Q<x0@O})!Q|zEo^:R8ܦL?s?+2
    ir;dU?IX6':&&DqTW+rT{r]ݸ9w#[{bk4Ꚍ><g�i�c~E��ߥ�'X�j�Mc'/G$Ӝ鱐Bbqj LaM0Rʞh9F5f"Dֱz[tu!Bc`YIjeDy=4ck+襤xgi7FLlm;LĔT鐩*	c<_'V-c~w7f`:ivs9@D�Sc3nA
    g�
    &?
    jtI=\
    $?иXs:CUqo_#I�q[*cřTtǑ97iIY	jD]٫k٘12,L 68;
    ٟ7kje,JU+G9P78:Kr$Y.8�L[Twї	�҇)R3z6WvKd�*̄7}8 #f�FR-88tv&&_t$BwVMD+ڭf4x3)G6+X3
    dɗx$A,3r8@>o)zLdnr,z)jM߷vKYD4G@FU@9F:6ҩDh\owdsQ'^lwp(&X1��Il>M)ndAX:TG'rm]-\qi}ʯ>M)	 `N#s\r!$,
    IMƃr͇F c&j(L%xm
    f"Ks	aR*O95;0F7cJTH^m9WZnJG;l\OEF<zkKE/-0 6%Db~nzٕxcmvX.y@׏h�ewCˬci8CPK]' K^ZI]lGdv IhpG94E`tYG2n%z/4ej@Kb^
    
    \{Dw9N	QMك
    lb>JJ,X5t>?FKn*dsbK	ר{wK^0e$Mwɥ⠢bx/i#oh`S?.Gs͡K‘&%YX/{HG@CQBG-Ejr9}d@dQ&6h$4 MNa}ݱz&܊ c2@B1:%C ~L3^5#C1Gqc\$sꘕ*3-#`	.6K+HJ.$5<:
    4G.ێR]uɒˌA1 ӌm2bcANSÄo1vOHٲbwT'ݓvKGDpŸ~^hȰ!	(3
    x3!W3~ga#\\1HxQ4lB@ud
    �]v~�)~!L< T݊l] ]cؙ4J/ȵ'PUۀw2\}o0*
    LR`a_'
    x,<oĐq=G&ec%/ze2ۣrLo~<	5a,\MN53yvos9gD�V]%~-x$}jTˈ"Ll>6Jу[a"4e,X|D݈K2܈ߝt|.B>t,Bs
    eR󌗂%ZI+;c#$41FRu-mӥNe6C;>0>-AvJB23M
    f62$̃&xm&ZSgN
    PHq2`z<8<!hLRbzԆQ+T˃(0["1f`O<Ǹn:	̊yǹ4<qFR{?Zqn@el5,A-o	˭tƁtJBtT5#ٗdaÂ':U&X\t]rfFbf?M�,W"(H%)1tuesdu :ͳA!S
    V9+Wy":1<rVѩ
    $(
    E+1+0M
    *eGnZo5	ը
    IH<;ӄ8ZQgLɚԥ #	Rə]U'pP:[&ky�cGʙ!cFhe;�L߄L*7H'6ф U[cBkL1B!E@cxVV
    d7zk8 L
    rNY%ى Lu%)ɨ^-`v 
    tJ\jqXU�2~4,6F8Su=e]㤰?*7Br�CK>tjj�*˹\s6ڨG[ͷv gc⎕$'fh�gs)a)>NҜcl6%.D#vrgVub]^};	ldXפY9ZfHcߥT0zF*gٹoJ`]B8~66%i*4Zq|V7cdLʓ4պXה'PCBFgIvP'#+;8~#I"@/0bm	!Hkl3tUA<k[�(C,wYkK)$j+0N8%!I92Q 7R/)M%x+	+(,%kQV\R`HamP"Z2Aիh2;W)'cb`0OqŐ6VlH D(yaZ^LEԙg̱Udl	?ÆbW)Fp.dq;.BDJP=izLH4H6jt񬱓lZY
    Əʱ.){юkI4}>HL3n_dXp�Ӑ?8�N
    ZX
    %1fsEUtum)=j I%46I̜cdͷ\SS)r2̰,`}f8_b2_By	2hE
    KGZv4r=*484|(2c1Wҫ
    ɭ<;z&OJP&W\�ʫ!2Xͯ荒_ٞn⎦L7*?-U5^y5?^	`d$~G 1c|XV#PSEK)fT8Ptr
    WD^FƧB!9;RHM	fbG!;뽥2q9j8."NBrv@#y8͔ďCJw{Kc
    LBAQ`p	3RUa}x g)oeQIi[+Ґ6]or[iU vw>0 ܧ-GzWЈNN=S`BDo'=iNih-^vmL[Nv5xNc!$R)5Q(x[ SӦT8Ptr
    WD^FƧB!9;RHM	fbG!;뽥l@F! 8j*><Jy32|R($Hq
    .uQJ$W[~=S&_8{^.bgXIJM~dTGJ=Vu:ʡ҆V_P8 45:	}GlH6S>'
    )]-t\$
    8%y孠~Wqji77Jc*;;JNnSY~=@+XD''a
    I!"7LH4}wT]{ >-x%/@XR͍R>Sb	XBN),O(ڍ) ,I+=b¡*IC,gykh=Um/ZFm=.Mҷʡ҆V_P8 45:	}GlH6S>'
    )]-eؿs/=Ư1	3d$@Z%&2*#bsy]jzfOTQw?L+d>I,y11e9KB"WW+ytP+AL&A䲜p&�B|.1ٱ?HZZV;(jJ؝OjH`̒@mlA�U_p	bl$'HWn.jЪiB2]kΌMVcJQH[ԄCrD&;DCy0k$ʥLQl!357WRWӹ�s7nnjկVEU
    �m;BI2"#@dsqMDr8|Zw!Ej؜zuIvځY{�wx%iqΡ *׸4FNR7z7Wud5JPV?92eUo9-)(H# ĥ/";3j*Gl/JՋ;;c,"q*ʑF	Y|11m$Jw+N@"w"-5]ls"aFpU:{ZN,'pQw7'zZꦷ?ʼBh2
    G$(P؜/E.WBi=be%>#R%bě1bb)QmR	.j֍|N}m#IeA-,/ Gd~?|o?$v5lأ`h-	c(ъ%shxXꭵZUnwXoi`_,*Ay\PTT+[*U.M0IZŤ-TVNN&R0Rt*gTڊlrwX}p|eݱ"
    	td	:@"ȭ⃸0f}SazA.GkFB	<;ZZ,E/ 5E[Kx�`D'KTZ?)FXHHkr@,)~WSߞ/-ǃɂ`ew8|:^WCFN;?ǪM0ARҞK
    KU֛?U;~UZ?oL֒@^$ JMil,Ư@oAjZũR=%P4赲*K88D˄KA$�Bt/clG[9+H"u<2'dyʌ#c d9M6@Em"�뱐KmMxu,q�*3eFGEy+6d܋$SpsړWK`H
    MK%2wS^�e74cP_f4
    ⣍i
     :ArU>	geBBdZrTUlFA~Q}(&a225,%*#z%l	 c?kD,
    HCG[qmK߫]dR 8Ӭ
    }2|NzȮ=:f|3rK9d4ekQz}o!b4Ř5Tͼj=Pь()
    *a|Lm;s0}dfۀD6nmqjK@ˌ
    
    	
    N#2"e&\^%"2}gpИ0dv4b<]ln~9 qgK}?'cҟ79/}O[o<Gf/@f�LiPxNUp5s㋑h>lcLc0K4HO/>z2ol#Vu>Bpt>H
    A<[q$5b*XMV-+wGgsW"U=S-_D)2=_dd<qTXbnjB6PIjЀͪsm#hQ$I@7Hd;^;.,)(<KU+{qJuj\ku(Ӑ}=}rfkq3Nk+?19Vl1Sa+"4�	�X`os_5@@L͜K;!c;$DR!%d,m
    $K	ޕ^TwM9�3!(|I	;띠̝fB�vWkqR\⨶1nIudN_g;^FlLcuɛ11>:3&js^Cd�H�DD`,:T%-XamKK1_&wPpJA|}ktSH\TTW7�A;6;KV]L3}U_]VII"
    79=&)`"Jh5X3j|
    ג2:IQn3H
    (mH6F'k
    -}" )+2V:7.Mr-lBXL.&(#h,+bJ͏\?W;<*%kwo[jn*|ACE�vomt}tTV{|X ]K݉T:\jŪbYdhSP4\'3$ _{sd؍
    7lO.+u-2q9j8."NBrv@#y8͔ďCJw{Kd(fk }ear�8
    bғ,(kvDgv}
    )D	2N@a)HSAKe1pLA|rYs$ɹsqnZ{*!@3YS+(ĐUe]Ņ!fGX$6S;_P޶U)OtkdkE$beF `ley@HU	(XǮ$f۫
    (;/~<ӒY9a{xby%2i_̹$ ܥ4=Zr�.Lo4�9O'UkyKƭ"&Dl%4qlz~b'�~:j}Z⓾Qr2<_f4j*&@ͬ|<>
    4D;@Qk,)&CnAZ!	ͫ ,3ic[)O0La<*EtᏑ4 +d]Q
    kW_e2*I+CdَR39G\+K-cąIGFV[Ji/+jn)3S#@/9aX
    a4æ @c'DM`gM$B
    (ӷ[HefB4>˔o[qШ? Dg0|f *E*Bn'zӋG}xb�b(4'~,xzS}5#LNwĎ|/D^&]hzǤH	#Z֐4DZgX[hexpH�ne0bd @œd*MkQ_cɃ0Y~6{3n
    deIt	!&Gw$v!tu!eͱBU_O#n])wEiRe
    JWHr8}q$}֭e-9Ii Q4HhŚ66N/
    3[k~C*y02"')IHzK/۔=Zu3g8@e1>Y >,8wc	B2TEi�K5$(D\Ԑ,hfkVXXTzT3Z$GO$fƄ%\TZj/r_TUwd&OK3Px?7{5QtzjEn.WVt=FRFSBqJ814;mu8}ԡ6-*QνE¥i'7څ)?&	pbiv7a#ZpKCbm6ZTe)mz[WJOLoD"R	~M*PPnFRۤlFR:7
    22jD0T&݄kk.
    HiR8u-m_)n+OQ<de1-H'a4MCMC	S]Jnҥ(qKoZڱfV&GSM\	F*HS;\H(lkVz69Oě&pZz#)hJA8	BjjHֶ>P؛t(C[}g^RFSBqJ814;mu8}ԡ6-*QνE?oi~5bdu8}P,} dk(0h{ĉ)Ƶjk	\;\	zC;|sL-jAud_vwa_YWSIj7
    22jD0T&݄kk.
    HiR8u-m\n+OQ<de1-H'a4MCMC	S]Jnҥ(qKoZھS&	*Vxc}Z!N#iP&cv56&#eJ6PYרb/ƬL$"5V:,eT>
    vv%7P֭Vma5==w8y3r.iVGAy=¢5u(Jn\š{v;}[_wSs~oZe|M;.3/c
    9Djg4lBOlQ"H)]�Ҩ�QؗffGunZKx
    ~OxYIcYً77ȖP[k"diդpw6W4;ײŅeĖ2DJH7r? Irk}nqT&Q+"Xk,@[†[	)}FY<-g2EN͎NJEJZJBNJZV@>SsTOnHBײ%`Zmwm輈FoxGE%mbѵ5U^+}V.DX)K{#z5BHo&MU)P.spQ~ubT)1i/X?�YWvQ8ߔRU"B6Kwnl}]xo+K`P؞C
    �,9P\u15^g|-^(+FX:̖�B@4B^nb7׃R7Ӫ{eTf{
    WYf`6bs/1W#eÀ&kSɭ)"twXq!ceRwJH8xCx=Q"LL =GELï'bRe)G)yOě&Z#$wIJVoqB9"E02R'mm)`M͗<YC
    j-_uK;CQMdM,"V`}M+Z5Z۽_))гK#`uCHU#YE$Cݝ$IM65UXMzM\MN1o51CyBat;%+j˼ڑ[u$Y޽l߸DjjjRZZR||d\d}C	]RZOj+wgv/X]њPہJ71fY}L>[([.|Ckor~$5~$5!XٮZ}z/"o/
    ovKWwnmWYM4ӍkJr?�/9Gz@:
    aa.joʺ
    P<-m?o?o)F}0vg{A7\)ꑉ#ږ[ޓ3ή崕VzS&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	S&	w_qS~m� KH,vnv4UQ^}誺j^mDlf56�aȬk\M+|m,#5r,a3S�;# Ԗq*u& 1eDcⰑ{)6LNm&.0?0(L2
    `bk㣖-(.eR}tC&!,背`\V!woe&ɉ͵äݥ%	fYalM|trӓť̶Onv|.y>2cD8I6J؏
    10Ưιpi
    ̯
    CqŎ-TNlZP^w[&&}2nJI,S_{ܽZ[%HdΆXj
    D<m&Q�ĽNG-G([WQxDY.bq>'ԿR]Ll} 
    tTRj:Q&+SjrSwq<8ż*:_͝{+Ju`d/&M	\%Jk{KcV`V	Ly
    Ah獽>?8z>)ҙEs(bJ;W|.y>2cD8I6J؏
    10Ưιpi
    ̯
    5ѫ%R.'5:@ˢ�I0\ZY*$ݞjmY_rw
    
    k,9>ə&Yi/M6ǼϝejLVd/bU
    \b,x;pm`~Fr+ӽʙ]_]xi`O4553uH!"f18L8N�?*9G|>plļB&$'##hh@*VdJu6p?¹^go2|m-3\"3> 8L�
    #묽,:
    IjxBRb
    +0\K"ǃn�	Gg"ލ;ܩ׊tO]SS=T(c9#ӞowK)[bLr2=Vf
    ҥ`/I_CmY.bq>'ԿR]Ll} 
    tTRj:Q&+SjrS?2.9i�Ii"vXߣJdFǩ=f;:@d#Dk,)b
    DݞUvvJkaD#]zQfnj<]tl7w{dLcҭ*wr}O<m跐dHn/|%q1rc#yesE}Lx`>ڳq[$_Ҿ59lYg6@,<R(|\3+(0  2'qW>}@ĕ]/qD[l_(#Q�'cXa5WkbG!}{T2'Jus[ك
    �dd		Hg{F2[a M4Fhe.ФRŤ6ֹZD(L}>bT@?m\e<i4k`\XG_z7_MqRoMOO2fb�F#/nѻ<y̠31e֜6<FC]+6uDF[lɸLQm\2~,yNR0RȌٰe;ŏiPNvs:Ìmi+-Lr*
    \[<_.�Sf9ιڶ]f{d#'l[&p榛K"ݪ `L;s6LF#k30lo,Yrr73"r܅bqb'jiliRDu�㬀
    #MzWQFѾ&lD619
    dً-*nTF=\K9n,Ɏv(r[>胖efاlDjU$ONbŎ`HYYnl~eKAØ?t}b|洤3JJY12=�a`UߍY/Y,uxzn^@asK/g	oMJ%Q|F[ʹ6߬?IeNIeN>Ɍy~*`cOvqh54nH6F&
    6L-ǀҾE$>f8mx$P쎏#,W)[Hnp1Kn-uKfZ.\S""Y6|߳Gt%J!1*Zu4,hgyAlzؘ/8'2r3�r51>ʡ2!RbH$qL=%TUD2u6JGaRޣ9GAPC8c}ӟd6ǴAxumyAŘ,lw=�	)i:ܳdy蠗dth.l^,[$zn	9*tV7'Ƒf]9,H9I¸kP'H&HN,7?\R8NVF-^zCe,QzP,~qF;O=eFS dǞGSKhekZNxaZgbZI͢Eo-G1>ORz4q{CcG\/Y6�2`G`x`3]_f͠ݾ'o 8zfJ,X#p;dW?$s,Ih}٬J{X%N|)8f+.6b̌&$G/E\]dj§$'!m	&nr!":$FB[b2##L؜\wh}_(/L=&EobXHE�,SsTAH&lS:Ybqst%7O/^WT-3NQIe$f"'q\m)=N@`{R8}{\#pU�PfF/l_˿SFL*%VۇcR+޺]}=g[{ozƼ):ޯšz
    j):ޯšz
    j):ޯšz
    j):ޯšz
    j):ޯšzb#;e
    YXuM҉5Kw}ڦ42,~TwnĖŊmFZU
    j):ޯšz
    jNv9K$訸g:"_ԧoxSWoWuM]_ׅ5v|^xSWoWuM]_ׅ5v|Jf($e߁C(U<E &: <)IZ2GW}js\-kuƍCQN#GpD ¬n�15X+U)WܹUUM]_ׅ5v|^xSWoWuM]_ׅ5v|^xSWoWuM]_ԌCn2jP8_S[EEl6=[7<]
    *賽5mRV.S5v|^)|1G~ȡTA2e%hv&Gϲ]jG]:]p;7
    G8 i
    Tb|T]޻rUW5v|^xSWoWuM]_ׅ5v|^xSWoWuM]_ׅ5v|^xSWoWuM]_ׅ5v|^xSWoWuM]_ׅ5v|^xSWoWuM]_ׅ5v|^xSWoWuM]_ׅ5v|^xSWoWuM]_ׅ5v|^xSWoWuM]_ׅ5v|^xSWoWuM]_ׅ5v|^xSWoWuM]_ׅ5v|^xSWoWuM]_ׅ5v|^xSWoWuM]_ׅ5v|^xSWoWuM]_ׅ5v|^xSWoWuM]_ׅ5v|^xSWoWuM]_ׅ5v|^xSWoWuM]_ׅ5v|^xSWoWuM]_ׅ5v|^xSWoWuM]_ׅ5v|^xSWoWuM]_ׅ5v|^xSWoWuM]_ׅ5v|^xSWoWuxKme)8_1ӳ{{.{]NJW~yK3Px?�%QEN$v@Q~^fKQf<DM<|@5uxOg!A6lnkZ[7G-==ƓCQ8Ρ\ZLJ)<'$}rh@f9m*B̖KǞICh!gP-c󌔅fHRzlv>4 tfxќathBKq!CFEdp3WJB3I$)B=6;\:Y<h|[m0n4Ps%]=ƓCQ8Ρ\ZLJ)<'$}rh@f9m*B̖qG&J=CiK8Lj,W17CH.
    O#{^e(KEI^<LD9dVOG:qkd,4B#cɡ3ƌŶE
    2Xu/{&	
    2+'qB2RyNI!JЁ͙FsiUq,:z`Y"d+49!(oDƮst8j7[R]L\*&94Q} z	fw?6.Nڑ[w<0lx;<A�sGz}-E4�G	?G_]ٱjlyMdek�cDʞdWYG$!
    }vr[$fueqr֝I9|>`@xxS̀j##ᯮCqkdlnln<ZzǬc!H(@>
    HJ!Q,1y\! 7<Z0yWS=-/'?%RE;cP\>~|d7̌4fq
    29NAch~Ѷ9Z{ @`fuiZ\8-@ю RŲ<)Mp42'ҚqE-ynBTAdphYl;c 8	E'.?"pZhU&mQ6͋t./r؂CZ?e|OqX<5M=;w%DLа8ؕϭ48<.�a�*g;;@}2R$~eIe#!kqK	fU
    �mdnNG=CZAq[EcEFgMQKI,ZmT}2[i(=cQApRm$@yibI"*7K<cŗpr
    8N$RRUGmN~T6),,#*ā8xaq7T"uN[:%~՘}	8OcI*A)!R]�_FF<,858w)(Hh*|<`ܠrPq=qrVhmC
    (G)LT2TweYcYvpi8d:GʥªGGޚH)w,jK&*%Qfr/.6vJX5ϱLVT*՝	+xcK[nI)G~5]қr
    a�H$}XUEG&_ 4LFq(wRmzzsktKcI2GNg~o󧏽:w�DIw/n']:kFXZE?=A×K%Vhr?CSힾ˶XX-sʱ4Ca!k-g1m)\m_f?BN9GXsʃJrhzA@$Ѩ=,wN,N/znBx1`D�*RJ#VG@ViBVt^$U2cy+<L2f=a:;ivR<l	]2GC`bu4:\F}?PA0	!2լ)h9"goʫG!
    c2cɂ).1<gS<50d)+%G	HxH#
    ֱ5+HkmCvDj:,1̓(0d-Q>W+K+E֬ƛt;70pf"K+1?du"pX3c.H-]2ЧXF&Ezʪxn/?BOy1HEfrgQ$TF;2	D_f!)Q:IAr^*q+cy٪͚mGL>�	-XZXT+n'KD)^GEU?"xK:j4oZ)4d?G1H[9ߛ7}Gb
    ε4�F0bkY?Xfn@]P3W; \V⻍̊^%Xi>Adc,ÎgؤH)'q	g%G]ĨVYJZViŬ-lt2GKݝKDR #1w5ZSnU/om=ڨ"bTِEde�g,q+Yc@\?$S†.6Y]t4[CrYӛ-e7K$:Ξ>wq'1wd{�c HPV8TFSyLqbŜ#U)F4$\
    (\\o\(gvwX9?TeŹ"Dk8\:;ٟآ m"J5	u΄*\¢IU0)4U>da5ILGcOd
    L>@SX$)[!B;͟EW�hٿwڟO{>_�ٗ\'~?
    T=74?jVAT8y8Gr.ZM	g$ڗu԰ #aAΏ@9`2`IT<G`�`&#Xmw)qeh&:,	FH; d~CZ-rw7z8zR'i_qw)8"!P Nf$zᇧGp"
    RE;lWkަ_EÈWXXyй0btkWjbWv=fG_OVE
    #(>Qܖ"H@"6	kZ8B^2Yn)%waH%&2/Kr)t
    E^#Xs!A$.V׷䊛;�AYyJDfg]sU�$.%E.۷ƖYӄ>`Ci,-eY`iRBRaI[Z
    vGU5ﲫׅIȃUYaItGEC	9tQI2h
    q
    	7QG-Ԁ5^)K2�ȶ͞D3I
    l#ͷzF,bV?^
    k(Cάg-, <s7J!w�5q	Um8	cf?d<ΙU"tˉVa[KFc̊5}%z%Tj4WD83#^m(&(;3,Y"ő|&*J~Qchʃ<3
    %nTTҥ$cUwd&OK3Px?�%QEL1;Q\6OnDeMJjo<Rlbny#ehDWv'uȆ[	z*H%&�<:/XqBqΔ+伍I%HfSfS*yÏmE
    3z*H%&�<:/XqBqΔ+伍I%HfSfS*yÏmE
    x`K"dD?!>OyUpzRƳbm	Bg(<^*n2SKwwKBrw/bЬwv\D5&㵨827btXKg1c i#=WGd蠛=J`nG,`>،jË\i'"l]pI%ȁ,w,bl@grl@f?e4$Z 6ͬ.ʶ^]Kߧ>ش+]W8Mx=0I8j+*̍ǬX)&X@�FU:(&DZOEہw&?϶#;ڢ0x"W8^+șxOD@78$@甀ei>!T9}`K9XY	!Ŧ؀2؁8d
    ~hH@l-X]mSe."v.٩R�&x	*BB1#i.eۈWB?#S5P8NHc]a	N-􀵒@rs,E.Œ[5KKZ8}pW|'t}Zo;HY=H$O1d[;:xXH4O;]2оW!cwc5,m
    ܈ʚcߒyM&>FЉN
    HY$'1/[9Y%_wwGڹ.ącԁ JRDLE;j煌N 4A3,xa%|\`b\1|"I-6~'&k lMSBEralj,qtM?%RE.R
    cU-,ف&F/l@R*ښ\u`x$ikZѿ}hh@%4
    tu4?&VF^.D*[MM^.9=#9X1d^s?�~˙Zez	]y*ȂDe5q#iOgfg'[{gj̡3.Br`+˱P"*Ƭ~2(B́և16}h! wyRK˳cK-D)2I,\-˼oE16r7iqˋbXfK__6: kNH!Jt؈؂\|`Hi=qv*_#&/ҙx>0gWk]m٩v(k=\$ÆCNztvffR$~eI,FNDᏱ#S뜄pCCЃ=d@6q'
    8ኡjMEKqIYI}nRd3PAм%(>tztfX&8>KԦ!:z`ss&̀@xwwxpN-IJ\J,?k~Ʒ(^G]2߭N*/coɽ'=6F@Lg̕}<H$(/ͱօSqˉrWtlհ,͗G!\)"4H	OqJ8
    @
    8%,[;1PN(S3 [8K�0 4,sI9G_N2Īlkd>`bgJYؐ9q\ˍʰ %܍-cy9YJ	C,$L>m!y)Cl*^""1`xYƵ
    l8ePd+*Iq`-b!
    L炰2kpCSP㫞lU&l#kt)61\6$2ICH;őlk}]npє9 G2h@tg#-1#>\?*q([#Ȭ\hdnRt^GWMK*P`42VA^QHnXԌ5ۍKb	%z=$BAKtFz
    34<wLjǥ$G3MS�Rp
    쵆)43y*B7OLѱG+C
    ’�+zJU�N	i%|H7S:SRa픢OCzD`F* {s-*g]m؎`K;l~S*U8/C-x,qsHp8�l6̿Ei@QSq5v\xM'J
    g�ʡD a�Y�+JK`d҃Z$ZTgWTmV*&ba(xPI!3	JN7fUk^5='9q~<r83`݅a֢	HES81T,6d+tq56Ep\/rl(9%۠q(0rzt#ǐ$(,y EX0QА~J%:JD\ysRՅ&_@6:c-3\tU fd(m$} PvGcCelԊQV_KǑo	Jxt}g^+c<5)ą
    q$%D)dVV>Bx*R$r g�2J#o
    x1uϘ9Cdq]ȤrŘlوRV(;fK\r�9&*xq̿2dÌ-̢V;�ʑ*;+>/Wlvsdi`JT>D�_58\ؕKmsI
     	7qDzXL/	<r>?{ D;n_k+kKnczF�)`C\#gw#6'iܲ%!ؖlyBNO`-FV:9O&?q"l@`1L!bh2~P#[Y()yz7'7	[34}9�{_o�}9gÏ=.//}19s#Xfg#4]>+W>cQYTTWYcz;yM
    B@@B̥fƗr
    a#@øwp%~\161ok_flU;	6ijڳ=G
    %q(/˥)Dcg1'1t-DžBܖov(cXjouJi'`Ai`)IaYSm/9=BhVŰbd1ġ/+8եg" i3yN.qY)3HPO
    6Ci@kˬh%Bq*lGMŌM!*YoU)9>,#lߏzC�"sSXVj*h/.J	)] g +톘*n{۞	J�0gQ$g0CY!CfUd%&Zl#3IY>UK_-þH "IE!ѓ;@f<3*~;&#h**HZm#jPܣd'G@3"֗Ī>=ˋ"w/cerifwZL23bCo1 JQF_JS!,&>bNc2'&B[I:,ZQ0;׵m;=]Йd]Dnh:Ql1@!5^-!}ı'<,őG0:<e|\SjZily6-y[ַ	9-IeH0C$wX,&0ɕR)+%'H$%SlmJ:>9;[|΍+$X*@őG{f"XLS^2*EYU8-qD~�۾R1+'�ʫ!2Xͯ荒_ٞVL.].\4Ԛ݊ڊ[mmSfu:Og^
    px+hIõ஽'ׂ;^
    px+hIõ஽'ׂ;^
    px+hIõ஽'ׂ;^
    px+hIõ஽'ׂ;^
    px+hIõ஽'Ԅ1E#>egYﰯNTg=U_`ok~oWWԧp~bjolۿO[UVߩEͺZvu஽'ׂ;^
    px+hIõ஽'[$[<=Qmfʙ$ݮjwW*q^ֻɻwe+hIõ஽'ׂ;^
    px+hIõ஽'T)b)%M7=LG^c)8a2&^jtmv;6z^�j?)�)v;z@?�Ar#�ؼ^
    px+hIõ஽'ׂ;^
    px+hIõ஽'ׂ;^
    px+hIõ஽'Ԛd{$	ٽǴݖvf~mCzmػS]{BNu	8v״$W^Гh=!Ișq``rrQ狫GZ^J7S*MvWhw�\t#H%؁Qct)EbEKbhX@
    [nYMZn|״$W^Гk]{BNu	8v״$W^Гk]{BNu	8v״$W^Гk]{BNu	8v״$ړb,9X&lNf1hn gjNakh=.ȝlMg5vαEkpH4B]:BhV*Tq+*6&嚔LŪދ6]{BNu	8v״$W^Гk]{BNu	8v״$W^Гk]{BNu	8v״$W^Гk]{BNu	8v״$W^Гk]{BNu	8v״$W^Гk]{BNu	8v״$W^Гk]{BNu	8v״$W^Гk]{BNu	8v״$W^Гk]{BNu	8v״$W^Гk]{BNu	8v״$W^Гk]{BNu	8v״$W^Гk]{BNu	8v״$W^Гk]{BNu	8v״$W^Гk]{BNu	8v״$W^Гk]{BNu	8v״$W^Гk]{BNu	8v״$W^Гk]{BNu	8v[tpj(AiNϛSyGsv]d_$=._⎮L#zC	D#b8,{R^+$!C'(02BhH"W›mV(sw]}#6‡"љ5.\mM,Zv#9W~9˯V|fPX3?8f@#s-t%@.Dt z޷ybX8=nøئ| =4IFd3{1GTx]T\Iz*(z&,GqG^ED�pҁJLZՉ*ݞžΑMuQVk)@q$qQH\5kc<v>MIp<9b-ww{rBlhL"I.5RtJՇ95t!,bgVu8 nQř؟\[(KȨكP?qЩISW:Zط)z*-e<|$0ۣj1ƭpgG8r_).^6,Pbn}wn]hP1JlesB؞7AIlS>FyA2JY
    #SX|.o.$`Uʔ
    kdF~'SK}]&5agMh=1HK,>x9+N;-Dt_&aDKQM-r|p+!%b.6@.
    9yaO"ы>& }PРfx;}'e%6߈U+udLn*g=\DQ>GSGQtH		r\>nfޟ5&J=hlu+N7yZmG4_`!"|1c�w=T^J/铔NHas!Tf$Ei+M9#F,@CCB-FH~"duVĭՑ3-lsxIrJ^DOG`~E l$$[scXz|Ԙ+'sQԭ;2}kٵ`}dF~'SK}]&5agMh=1HK,>x9+N;-D?2.9i�Ix;j}\@HsnHH$y$FlRkhJv-Vg{jVJ
    tvR|y~bbI|ɲ:fBb')r3+--[y~gAxy7[Yk1H<Qh*qEyP<GR<Jl{|Mia3=JEa׼`˓^X`?KXln߆6;HQL:e3U/2$HȊvHVe"D`=$	Fe3rAől.O=хׇ+sV=lsT8&Cap|`RmV˨n[7ʰ?\Ũod8W<+Is!X
    \~'XFۊ@SD	�Gĝ/Jc3|4E632R)G;&!wDB]lű!OG꼤~uĨ;YZ3	"i	..m}e$`;[N*Ҳam$B+8'a;s܃3ϴOOI0諌9.)�i9|]-eR4|Jf䉉oH_,6;nzxQmJi<+aQS|9&ly2h2+M3q(cL#ڝc#/)^ȓ0%F8=jjzA:9:$i[
    `<X9\eӔ@U*RaZ֒<c~10hAҤ"DGd^~@|#1vN�%7
    L@m
    Y`[BVM3Nlq
    u}ܰ:*IضyZ]p7`R6(8s7Z24HŮ{'drUbj'edNo)7Fx2`[wXvP4OKj]Cwٸv`#6w0|r
    FMxm&ofڨMѺ5HyݕHI+#+VU<[`ٻ6D˞eZhtL}FAr]/Go,KΧ
    DCXY͒YO
    y8zfq)&gykѩunBbZ͎dx#ԭvi[W2 s-b%bgh'WG+LLXĪ0[uP}B7Z"Tk�,ZXS>@}t
    "yb-lJ޴f2x5~B:͑[궦KZR"{*Q)(sț"V '?8H8+s8iHK-
    b=PP4JMv]ݩr86oG&?'Ȓ$5=;5P48^nxPLʗ42U㲰Oaq$r;Lrns@QA4~�d
    d6-Ss݆Ggq=]2Dn;@J	g-L{CÇpvyy<|[WhV5ƲFsp	n
    |ɱ͂yv&m̈́^8֭ĝV
    ׉"{wl�Nĥ1Fw>")bD]
    #LvK!.kbSItJb\?xӉ4x1NeKN{;]9j؏}*XDvȠ:Bq 
    
    췐>6T#-ßʰ?\Ũod8W<+Is!X
    \~'XFۊ@SD	�Gĝ/Jc3|4E632R)G;&!wDB]lű!OG꼤~uĨ;YZ3	"i	..m}e$`;[N*Ҳam$B+8'a;s܃3ϴOOI0諌9.)�i9|]-eR4|Jf䉉oH_,6;nzxQmJi<+aQS|9&ly2h2+M3q(cL#ڝc#/)^ȓ0%F8,ŘW-PT53J'p9	z?DIFɒ`nWqc`CQх"{
    #wN5LHȼ`	=CsfH))l
    qIc+x"@vܯdeHv,\q(i+K&ӎH5p4cGNvd
    ovΎ΍^["v\`;]Ƅdߓqul|e>qX$A-ckn8#1ؾWn9b̟Q>LD,0G!4F�|fX<!IÕ0
    miu�+�%DRFS7+ଛBIɣ)O6lI/#'#+i4ͅ
    9g͹Sb~iEr:l,ciI\M[A0t2:o(BVd.1m
    J)zmG!eF<~ä3߸9Ay.Xa[)}52_GR<5qAؓ+储a.r%:vȖt_M>�a%c5=3n­
    u)kȸ*#G',r3VHWU`$Ou3kC1PABBURkN3$;}(&Lc_|Jz
    J[?MU%o{KRJfuzA'<kAZF3k*B$Kcre){-a!eLaFs@ƒYYP5ZPU6!Y9+5YDQdt,ĆlQJY)jtl41&L%$N/dqAkHè6qL
    zm
    l  #*sGr)2p�S'$Ar:M|gf>bw@Ce[T"qԦd8(F@eOԘ4�76LhUix}mnvd+jҍ`QI'Y J҄l=!==Ho.`RLdԑ%V
    dɭW:4!zG5qBL-h0~"1/k�!hu^-562p=[+vcI`�L?pW[&gQV9_-(y`X"IikyUKLr$[XVǰ916o>`#238'Ptlഛ^5/0,,>AY- du8ctæoMKh؅ͼJ-^Z4OKҿ𬬲 	aǤ썀#rYB 1yai{4wt|iN^fZ1\0voI dswű9
    ,*
    
    E5 µnM,!',u9~HY*84KPZ[Ѵ'f,x
    :۔n�*8kn2ohCUWK/c,QbX:v`8us3Bjc!I#Jr
    
    _6-u_t'@~foK3Px?"q6�XdREZ2gf~1O/ڭ`ZԜ8.6TVr[̋,�Kq;T!Qa$E16<2	bDf5ItSq9R:}5沷Xjv$Bq9/Hb)!Ylxdĉ4jghr[u6kcLFvt|sfKٷ	K]@+5_r	uA5oB&B,RsEo2,-PHG㝆r^cp4RB%i&Ӱ1MJ]lך	&X}iCeFZ,ENbɝ]#	+U0OU6[8ڴV"�-RN�dT|9g%67	cLE$+=X&Rl;NT{FyiNlp[66#<ir⫨fA.;#RƭV>BVޱc9BW%Zj eIA`:ъF[eRT!n)0S
    YSeӍE�Z�\sKln"ƘHV{"M3:v)VkXe/T;4'pxdرM׷TI^=[ʥw6t+4\pv)b qWpC>?}4q1qorB!(ɾ'KlZ1Xe<_bB_Oo['9"qA\le_GwvihN3y
    bïn:zqK;l-W[uk-th#PlS9àA7c9)tĮ-|~k[hbnO4h$tcPb1x1bіh:Hkg&t}t&w;9Tm=VTokj�'_-9�_5<c>DN3T,ڃUō1wx4N<;)]nPLȱY*KV!HґPNq @G]VC4lzEXfKs20勓(]Z.UL,<q<e."=1伌pL;DCY^"$k*Wn$f!y:Iޕ@1٦]vi@:(Tn-0$,pY6h6<*rB<s#"rwFdhFdg&ƧCxjldjVr$M[XGX[[ؘZW.ݥb
    Xw8vGY1rfHa.Y0S3Q%W.iDB[5%pOGf{L}nC1Z1B+9!D)ȘiPHV'*,3(b\=.1}z2(Us6p<reqW9)3NM}Cj(2[갦
    aQ2J%0L,)b1|	d9LJSDcÐRf9pi	
    bT*doyr!h]&:12L	#\HkӃ
    m&)Kd)M&̭
    2KkkpyqUZc'']Wl	RsORrM>^aIOa
    sTP~z,夘9.1w_@9!	Ç|RI5n`CJIgI9CxTY Icwk&-;D!py(;VuvTB4I9"%emA>D2/ȋ#g!qaHƥ
    ,t9vVZnOL$2JbGonzr>fca<uf!4D>`ѻΏݲ^shmVn2q@+Ň^
    0CbmG\ۨYy][ʗew$,_}r4VL#;DeHk1AtA(&AT*~եj1u];ef,lKl&3+Md~s�;Mdo6;>s:;{	Y|Nk	=ٌ&=D^	@]h$*5@OAֶViϏdoX<Jdx\?w#7ɋGL#.^'Gkw|YLࣼ\ֱ۶FL%bFSlH1 ؈팀4HPq<|MiaiȁEIҩ*V�VY6�2dDwP¨1O;
    2<wUS	5GQj֑ò_Ni-tXd~DN<I71\f^~2)2,#�bȀY6hmEJWW|C?e0.>fmts�>n;@/3ÝSc,SIX6ᨆ.,c<@ ,pbfeDk~] +5XzԽ*S_;!!,Ar2X
    o=.D"
    ~+VF&I"RWD`7myzpaBӜLNZ,Մ
    C,vQ5,Cz$]:QZ{48KPAy=:c
    θaBfɃE̲9F}3lD�J2LJ[:+{TV;Kf41>	du{8k\ZCVv@lJYSH
    U<\P>{&o-PT,BA"T\3iCl{IuٸYjq;j}k	jl<KLf-p?̊#b9\͜<\|UJ`ӓ_w{PC9l:)Te�LIcL6#
    eX_ BD/e.@S6TrF5+sXŰ6԰Yw9BCzXze
    Y12{j\D#WILD.(oB…EE$CrI+B1\A.ŕk!օIUT@n:ĶԜ{ϗRASXD'Cgy,\2Ti&KL]EBv0RM[(wPR}gRNyAP=HA&,0*wɻ|#KN<HeJռ+]q~{ݧfмlȉ.)੒cДm3r{G)Xv8woLUuq)24YN'RsVMKh#	A~.0z%ZE;u{ȕ^s3]]f\Ǽ05PՄ	15G,hHمQ1\SGPvJPEV/ 1H[$HrnI6ehQ[X[;ˈ زd:гU==`J
    TPؖӚzoyQqLMѫ34ImN9Ʉ
    <))P*4v-G+�̑�UPjolw!,mY!t\Sb\81ɩ_]lMcjXUizft&rM,0u&-o4&B�-̤);ڛ/7z´)дapċ,
    RD'oK.fN}e*/FıL|GyH{c5-d;nch"'P倇pl\Al}-AQQ:nY12$Pm%VY+lPD;匔1*f+b`{cx;D`"JLΕj1oڭ<8$`L8.ra3	W=FԌ^2'YjdfU` R8+ln:>Q4(P!#Lr4M,obd}ObG(xa*Gj"Nعs9	;I2L4T#K3{cSć!5625+}Vȅ&-#-LMl-mmhXdh$ۺVd	Md']ma4[Hf-;L=UCzMMVpy#;M/@l	2V'^*}jcQ*R�cݹnk	{,"9	I!7x]d5	V>!M?ߪ[\][R>AQ;D;*o$&EӅ.Y*6HOϡMHRItuJQSUzowW{b6M�Da*a}܌q>3,A4!Qf#W&ė ӳ#O{	fNdFx�n>'e*16#"0$
    	JƶK
    Z_S:)sT=@P>tDρ}1:|jL)/8(l@א6exNA+#'3*G9엇O]y3oxt9arqJHa1�]DfNXlM,=^)!yz(l#&lO$_!p>m}(>qD$,",]yX-,LL7eh<=#|;fL
    :ujbuTDEd)kvn<ȲT@"+vx
    DXI
    cc $IcT;GN7*wѳ^kxȲHiO?+vi	ڈeҗXy`}ݶ0l>,XjMнvx
    )4	!"t@?:Ήm8s:aӋZjNui:/:?3r%͙v~k(?ݼlԌ
    KK1Qo,qaJВŚWf\ݻvU[E;o#5|둚OIu_':fwr3W;\zNFj='q#5|둚OIu_':fwr3W;\zNFj='q#5|둚OIu_':Rp+SH)USn*)Oy=vof變ޚ}}WԶ7_[޾5۵E=u˖ꮮvnu5_':fwr3W;\zN㥊,1پG[+m[,ERC(z]SV3W;\zNFj='q#5|둚OIu_':fwr3W;\zNFj='q#5|둚OIu_':fwr3W;\zNvӱءz\QeЉ3m
    ;)[Cr+)_]skhNr3W;\zNFj='q#5|둚OIu_':fwr3W;\zNFj='q#5|둚OIu_':fwr3W;\zNFj='q#5|둚OIu_':fwr3W;\zNFj='q#5|둚OIu_':fwr3W;\zNFj='q#5|둚OIu_':fwr3W;\zNFj='q#5|둚OIu_':fwr3W;\zNFj='q#5|둚OIu_':fwr3W;\zNFj='q#5|둚OIu_':fwr3W;\zNFj='q#5|둚OIu_':fwr3W;\zNFj='q#5|둚OIu_':fwr3W;\zNFj='q#5|둚OIu_':Df6}6(_"WQnR(޾5of7߭^mDlf�u63k#d6gQ�v'?)_$=.Ꞧte*(3ʶڲ%g[̈dmk$cH_ּɏ5!_ZO&<ԅ}knNuz	›>SWבYA'^EePyiB~VPy
    zבYA)^Ee0yhžVPy
    zבYA)^Ee0yhžVPy
    zבYA)^Ee0yiBבy?'^E�PyiB~^O	בyA'^EPyiB~VPy
    zבYA)^Ee0yhž^Py
    zבyA)^EPyhžVPy
    zבYA)^Ee0yiB{בy?'^E�PyiB~^O	בYA'^EePyiB~VPy
    zבYA)^Ee0yhž^Py
    zבyA)^E0yiBVPy	בYA'^EePyiB~VPy
    zבYA)^Ee0yiB~VPy	בYA'^EePyiB^Py
    zבyA)^E0yiB^Py
    zבyA)^EPyhžVPy
    zבYA)^Ee0yhž^Py
    zבyA)^Ee0yhžVPy
    zבYA)^Ee0yhžVPy
    zבYA)^Ee0yhžVPy
    zבYA)^EePyiB~VPy	בYA'^Ee0yhžVPy
    zבYA)^Ee0yhžVPy
    zבYA)^Ee0yhžVPy
    zבYA)^Ee0yhžVPy
    zבYA)^Ee0yhžVPy
    zבYA)^Ee0yhžVPy
    zבYA)^Ee0yhžVPy	בYA'^EePyiB~^Py
    zבyA)^EPyhžVPy
    zבYA)^Ee0yhžVPy
    zבYA)^Ee0yhžVPy
    zבYA)^Ee0yhžVPy
    zבYA)^Ee0yhžVPy
    zבYA)Y
    dZ"f
    #1V4�:-{v.Q]oQgjʶڍ�wOo�kU���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/manual/images/chapters/configuration/basicSyntax.png����������������������������0000644�0001750�0001750�00000005606�12143164146�026315� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR��)������u���gAMA��|Q��� cHRM��z%��������u0��`��:��o���PLTE������@@@   ������������������hhhMMMв|||ጌǟMQS268@CE[^`ʭilm䒔vyz���?������������������\������������������d���	���������������*���
    ���������������(������������������\������������������.���
    ���������������\������������������d������������������*������������������)������������������?���������������������������������*������������������(������������������\������������������.������������������\�������������������d�������������������*�������a������������)��������'������������?��������(������������(�������`j������������[�������L������������e�������������������E��� �����������������z��IDATxb`�bh�@!E,�ѐ"�hH�hHI�)zZ@C:
    �h4@!Ą@�
    鐢�B�I!5,�
    )̌O7@�
    鐂aQ1`H3(&	I&0(T!
    )T+!@#@#
    4`dr2 A4L+!@C+pĥ<�2.q
    ŒB
     VHE
    D
    .Ad3IS�4<BARJI2C28`$de\bB
     VH11HCJAFF
    oxB*eKS�4C	pD)$R�4CB�!@C+0^Q�133!R?bB
     |HQ !@C+p}0PHА)&*)�!E-@�
    dC#RLTˀB
     AHH`B"aBx�@�
    Z2C
    H"x�@���@#:
    oH
    �4R�Y!E@�
    е@#7 35kR!v5
    )
    zH1R�4C4@#6H.�hhe@��hH�hh@�
    )b@�� VH
    kh4�4R�Z!5� FCX�@!E,�RZ�
    )b@�� VH
    $� b)j9)'$�V&6q[HN�4!>rTr"Y�~Rˉd@�[H/%!d5Dd�DZRy
    � b/& piNح -E"a*�@:yb*2j1c3B_X�d`;%;MN:(%-
    Gфa!Kf1�@�as$011Ҳ!%-
    AՄǣ-^dSQ!@(Em�@؜
    H9iO4Zy
    { q81CbH!k4RH᳌4EDH!y4@D>dZH22!l4j#!B>y;)ؠ�QKt䐂n|a!-
    G.iR8"Jt)ߠ�$313V ЛPt'$@�R"W$hF*@D2Đ Cl@zۦrn	v�4`!Eh,Wq!�@RYYa"��1ObP&2B
     P[4\W1Q^a@mKR�o�#`Nz'Z@�
    lH᷏O2B
     8YHbe:4C
     :pHkIr41�@�Ѵ£ 6I٠�hi1�@�"i6�RZ�
    )b@�
    b [�
    )�B�@#&H�ht`
    )\R$�h$ei
     FJHQ^N
    )|܎aRT�4R�Z!5ѐ"�hH�hh@�
    )b@�� VH
    kh4�4R�Z!5� FCX�@!E,�RZ�!EB3�@�
    퐢'�R@C:p<R$q�Z!$@�4C
    �m!ǥ,Oа
    )̄ÀJ
    �hh.�ْ
    1
    C
     tH!MK3v"m[ŢRkaPc2ffmrRhԐb$MА)8�s@�
    B)[�!EB;@�
    "m 6:@�
    "�hu>!@C:YC
     xH)�!E8:!@C;JE�4R�
    )b@�� |H
    �hH�h4�4R�
    )b@�� FCX�`�\p ����IENDB`��������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/manual/receivers.html�����������������������������������������������������������0000644�0001750�0001750�00000062340�12143164240�020240� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Chapter 14: Receivers</title>
        <link rel="stylesheet" type="text/css" href="../css/common.css" />
        <link rel="stylesheet" type="text/css" href="../css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="../css/_print.css" media="print" />
        <link rel="stylesheet" type="text/css" href="../css/prettify.css" media="screen"/>    
      </head>
      <body onload="prettyPrint(); decorate();">
        <script type="text/javascript">prefix='../';</script>
        <script type="text/javascript" src="../js/prettify.js"></script>
        <script type="text/javascript" src="../templates/header.js"></script>
        <script type="text/javascript" src="../js/dsl.js"></script>
        <script type="text/javascript" src="../js/jquery-min.js"></script>
        <script type="text/javascript" src="../js/decorator.js"></script>
        <div id="left">      
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="../templates/left.js" type="text/javascript"></script>
        </div>    
        <div id="right">
          <script src="menu.js" type="text/javascript"></script>
        </div>
    
        <div id="content">
    
          <h1>Chapter 14: Receivers</h1>
    
          <div class="quote">
    
            <p><em>You cannot swim for new horizons until you have courage 
               to lose sight of the shore.</em></p>
      
            <p>&mdash;WILLIAM FAULKNER</p>
          </div>
    
    
          <script src="../templates/creative.js" type="text/javascript"></script>
          <script src="../templates/setup.js" type="text/javascript"></script>
        
          <h2 class="doAnchor" name="whatIsAReceiver">What is a Receiver?</h2>
        
          <p>A <em>receiver</em> is a Logback component that receives logging
          events from a remote appender and logs each received event according
          to local policy.  Using a combination of socket-based appenders and
          receivers, it is possible to construct sophisticated topologies
          for distribution of application logging events over a network.</p>
      
          <p>A receiver extends the <a
          href="../xref/ch/qos/logback/classic/net/ReceiverBase.html">
          <code>ch.qos.logback.classic.net.ReceiverBase</code></a> class.
          By virtue of the fact that a receiver extends this class, a
          receiver participates in the Logback component <a
          href="../xref/ch/qos/logback/core/spi/LifeCycle.html">LifeCycle</a>
          and a receiver is <a
          href="../xref/ch/qos/logback/core/spi/ContextAware.html">
          ContextAware</a>.</p>
        
          <p>Historically, support for logging event delivery over a network
          connection in Logback has been provided by <code>SocketAppender</code>
          and the corresponding <code>SimpleSocketServer</code>.  The appender
          acts as a client, initiating a network connection to the server
          application, and delivering logging events via the network connection.  
          The receiver component and corresponding appender support offers much 
          greater flexibility.</p>
        
          <p>A receiver component is configured in <em>logback.xml</em>, just
          like any other logback component.  This allows the full capabilities
          of <a href="onJoran.html">Joran</a> to be utilized in configuring
          a receiver component.  Moreover, <em>any</em> application can 
          receive logging events from remote appenders by simply configuring
          one or more receiver components.</p>
        
          <p>Connection initiation between an appender and a receiver 
          can occur in either direction.  A receiver can act in the role of a
          server, passively listening for connections from remote appender 
          clients.  Alternatively, a receiver can act in the client role,
          initiating a connection to a remote appender which is acting in the 
          server role.  Regardless of the respective roles of the
          appender and receiver, <em>logging events always flow from 
          the appender towards the receiver</em>.</p>
        
          <p>The flexibility to allow a receiver to initiate the connection
          to an appender is particularly useful in certain situations:
          </p>
          <ul>
            <li>For security reasons, a central logging server may be
              located behind a network firewall that does not allow incoming
              connections.  Using receiver components acting in the client
              role, the central logging server (inside the firewall) 
              can initiate connections to the applications of interest 
              (outside the firewall).
            </li>
            <li>It is often desirable for developer tools (such as IDE plugins)
              and enterprise management applications to have access to the
              logging event stream of running applications.  Traditionally,
              Logback has supported this (for example in Logback Beagle) by
              requiring the recipient application (e.g. a developer tool running
              in an IDE) to act in the server role, passively listening for 
              connections from a remote appender.  This can prove difficult to 
              manage, especially for tools running on a developer's workstation, 
              which may indeed by mobile.  However, such tools can now be 
              implemented using a Logback receiver component acting in the 
              client role, initiating a connection to a remote appender in 
              order to receive logging events for local display, filtering, 
              and alerting.
            </li>
          </ul>
    
          <p>A logback configuration can include any number of receiver components
          acting in any combination of the server or client roles.  The only 
          restrictions are that each receiver acting in the server role must
          listen on a distinct port, and each receiver acting in the client
          role will connect to exactly one remote appender.</p>
        
          <h2 class="doAnchor" name="receiverServerComponents">Receivers
          that Act in the Server Role</h2>
        
          <p>A receiver that is configured to act in the server role passively
          listens for incoming connections from remote appenders.  This is 
          functionally equivalent to using the standalone
          <code>SimpleSocketServer</code> application, except that by using
          the receiver component, <em>any</em> application that uses Logback
          Classic can receive logging events from remote appenders by simply
          configuring the receiver in <em>logback.xml</em>.</p>
            
          <p>
            <img border="1" src="images/chapters/receivers/serverSocketReceiver.png" "/>
          </p>
    
          <p>Logback includes two receiver components that act in the
          server role; <a
          href="../xref/ch/qos/logback/classic/net/server/ServerSocketReceiver.html">
          <code>ServerSocketReceiver</code></a> and its SSL-enabled
          subtype
          <a href="../xref/ch/qos/logback/classic/net/server/SSLServerSocketReceiver.html">
          <code>SSLServerSocketReceiver</code></a>.  Both of these receiver
          components are designed to accept connections from incoming
          <code>SocketAppender</code> (or <code>SSLSocketAppender</code>)
          clients.</p>
            
          <p>The <code>ServerSocketReceiver</code> components provide the 
          following configurable properties:</p>
        
          <table class="bodyTable striped">
            <tr>
              <th>Property Name</th>
              <th>Type</th>
              <th>Description</th>
            </tr>
            <tr>
              <td><span class="prop" container="serverSocketReceiver">address</span></td>
              <td><code>String</code></td>
              <td>The local network interface address on which the receiver
              will listen.  If this property is not specified, the receiver
              will listen on all network interfaces.</td>
            </tr>
            <tr>
              <td><span class="prop" container="serverSocketReceiver">port</span></td>
              <td><code>int</code></td>
              <td>The TCP port on which the receiver will listen.  If this
              property is not specified, a default value will be used.</td>
            </tr>
            <tr>
              <td><span class="prop" container="serverSocketReceiver">ssl</span></td>
              <td><code>SSLConfiguration</code></td>
              <td>Supported only for <code>SSLServerSocketReceiver</code>, this
                  property provides the SSL configuration that will be used by
                  the receiver, as described in <a href="usingSSL.html">Using SSL</a>.
              </td>
            </tr>
          </table>
        
          <h3 class="doAnchor" name="usingServerSocketReceiver">Using
          ServerSocketReceiver</h3>
        
          <p>The following configuration uses the 
          <code>ServerSocketReceiver</code> component with a minimal local 
          appender and logger configuration.  Logging events received from
          a remote appender will be matched by the root logger and delivered
          to the local console appender.</p>
        
          <p class="example">Example: Basic ServerSocketReceiver Configuration
          (logback-examples/src/main/java/chapters/receivers/socket/receiver1.xml)</p>
    
          <span class="asGroovy" onclick="return asGroovy('receiver1');">View as .groovy</span>
      <pre id="receiver1" class="prettyprint source">&lt;configuration debug="true">
    
      &lt;appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        &lt;encoder>
          &lt;pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="CONSOLE" />
      &lt;/root>
    
      &lt;receiver class="ch.qos.logback.classic.net.server.ServerSocketReceiver">
        &lt;port>${port}&lt;/port>
      &lt;/receiver>
    
    &lt;/configuration></pre>
      
          <p>Note that the receiver component's <em>class</em> 
          attribute identifies the receiver subtype that we wish to use.  In
          this example we are using <code>ServerSocketReceiver</code>.</p>
        
          <p>Our example server application is very similar in function and
          design to <code>SimpleSocketServer</code>.  It simply accepts a
          path for a logback configuration file as a command line argument,
          and runs the given configuration.  While our example is somewhat
          trivial, keep in mind that you can configure logback's 
          <code>ServerSocketReceiver</code> (or <code>SSLServerSocketReceiver</code>) 
          component in <em>any</em> application.
          </p>
        
          <p>From a shell in the <em>logback-examples</em> directory, 
          we can run our example server application as follows:</p>
        
          <p class="source">java -Dport=6000 <a href="../xref/chapters/receivers/socket/ReceiverExample.html">chapters.receivers.socket.ReceiverExample</a> \ 
          src/main/java/chapters/receivers/socket/receiver1.xml</p>
      
          <p>We can connect to the running receiver using a client application
          that is configured with a <code>SocketAppender</code>.  Our example
          client application simply loads a logback configuration that will
          connect a socket appender to our example receiver.  It then awaits
          input from the user in the form of a message that will be relayed to
          the receiver.  We can run the example client application as follows:
          </p>
        
          <p class="source">java -Dhost=localhost -Dport=6000 \
          <a href="../xref/chapters/receivers/socket/AppenderExample.html">chapters.receivers.socket.AppenderExample </a>\
          src/main/java/chapters/receivers/socket/appender1.xml</p>
        
          <h3 class="doAnchor" name="usingSSLServerSocketReceiver">Using
          SSLServerSocketReceiver</h3>
    
          <p>The following configuration repeats the same minimal appender
          and logger configuration, but uses the SSL-enabled receiver component
          that acts in the server role.</p>
    
          <p class="example">Example: Basic SSLServerSocketReceiver Configuration
          (logback-examples/src/main/java/chapters/receivers/socket/receiver2.xml)</p>
          <span class="asGroovy" onclick="return asGroovy('receiver2');">View as .groovy</span>
      <pre id="receiver2" class="prettyprint source">&lt;configuration debug="true">
    
      &lt;appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        &lt;encoder>
          &lt;pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="CONSOLE" />
      &lt;/root>
    
      &lt;receiver class="ch.qos.logback.classic.net.server.SSLServerSocketReceiver">
        &lt;port>${port}&lt;/port>
        &lt;ssl>
          &lt;keyStore>
            &lt;location>${keystore}&lt;/location>
            &lt;password>${password}&lt;/password>
          &lt;/keyStore>
        &lt;/ssl>
      &lt;/receiver>
    
    &lt;/configuration></pre>
    
          <p>The essential differences between this configuration and the
          previous example using <code>ServerSocketReceiver</code> are the 
          specification of <code>SSLServerSocketReceiver</code> in the
          <em>class</em> attribute and the presence of the nested 
          <span class="prop">ssl</span> property, which is used here to 
          specify the location and password for the key store containing the 
          receiver's private key and certificate, using substitution variables. 
          See <a href="usingSSL.html">Using SSL</a> for details on 
          configuring SSL properties for Logback components.</p>    
     
          <p>We can run this configurtation using the same example server
          configuration, with just a couple of additional configuration
          properties:</p>
    
          <p class="source">java -Dport=6001 \
          -Dkeystore=file:src/main/java/chapters/appenders/socket/ssl/keystore.jks \
          -Dpassword=changeit \
          chapters.receivers.socket.ReceiverExample \
          src/main/java/chapters/receivers/socket/receiver2.xml</p>
      
          <p>Note that the <em>keystore</em> property given on the command
          line specifies a file URL that identifies the location of the key 
          store.  You may also use a classpath URL as described in 
          <a href="usingSSL.html">Using SSL</a>.
          </p>
        
          <p>We can connect to the running receiver using a client application
          that is configured with a <code>SSLSocketAppender</code>.  We use 
          the sample example client application used in the previous example,
          with a configuration file that uses an SSL-enabled appender.  We
          run the example as follows:
          </p>
        
          <p class="source">java -Dhost=localhost -Dport=6001 \
          -Dtruststore=file:src/main/java/chapters/appenders/socket/ssl/truststore.jks \
          -Dpassword=changeit \
          chapters.receivers.socket.AppenderExample \
          src/main/java/chapters/receivers/socket/appender2.xml</p>
        
          <p>Note that our example is using a self-signed X.509 credential that 
          is suitable for testing and experimentation, only.  <strong>In a 
          production setting, you should obtain an appropriate X.509 credential 
          to identify your SSL-enabled logback components</strong>.  See 
          <a href="usingSSL.html">Using SSL</a> for more information.</p>
      
          <h2 class="doAnchor" name="receiverClientComponents">Receivers
          that Act in the Client Role</h2>
        
          <p>A receiver that is configured to act in the client role initiates
          a connection to a remote appender.  The remote appender must be a
          server type, such as <code>ServerSocketAppender</code>.</p>  
        
          <p>
            <img border="1" src="images/chapters/receivers/socketReceiver.png"/>
          </p>
    
          <p>Logback includes two receiver components that act in the client
          role; <a href="../xref/ch/qos/logback/classic/net/SocketReceiver.html">
          <code>SocketReceiver</code></a> and its SSL-enabled subtype
          <a href="../xref/ch/qos/logback/classic/net/SSLSocketReceiver.html">
          <code>SSLSocketReceiver</code></a>.  Both of these receiver
          components are designed to initiate a connection to a remote appender
          that is a <code>ServerSocketAppender</code> 
          (or <code>SSLServerSocketAppender</code>).</p>
            
          <p>The following configuration properties are supported by 
          <code>SocketReceiver</code> subtypes:</p>
        
          <table class="bodyTable striped">
            <tr>
            <th>Property Name</th>
            <th>Type</th>
            <th>Description</th>
            </tr>
            <tr>
              <td><span class="prop" container="SocketReceiver">remoteHost</span></td>
              <td><code>String</code></td>
              <td>The hostname or address of the remote server socket appender.</td>
            </tr>
            <tr>
              <td><span class="prop" container="SocketReceiver">port</span></td>
              <td><code>int</code></td>
              <td>The port number of the remote server socket appender.</td>
            </tr> 
            <tr>
              <td><span class="prop" container="socket">reconnectionDelay</span></td>
              <td><code>int</code></td>
              <td>
                A positive integer representing the number of milliseconds to wait
                before attempting to reconnect after a connection failure.  The
                default value is 30000 (30 seconds).
              </td>
            </tr>
            <tr>
              <td><span class="prop" container="SocketReceiver">ssl</span></td>
              <td><code>SSLConfiguration</code></td>
              <td>Supported only for <code>SSLSocketReceiver</code>, this
                  property provides the SSL configuration that will be used for
                  this receiver, as described in <a href="usingSSL.html">Using SSL</a>.
              </td>
            </tr>
          </table>
            
          <h3 class="doAnchor" name="usingSocketReceiver">Using
          SocketReceiver</h3>
    
          <p>The configuration used for <code>SocketReceiver</code>
          is quite similar to the previous example that used
          <code>ServerSocketReceiver</code>.  The differences relate to the 
          fact that the roles of client and server are reversed; a receiver
          of type <code>SocketReceiver</code> is a client, and the remote
          appender acts as a server.</p>
            
          <p class="example">Example: Basic SocketReceiver Configuration
          (logback-examples/src/main/java/chapters/receivers/socket/receiver3.xml)</p>
          <span class="asGroovy" onclick="return asGroovy('receiver3');">View as .groovy</span>
      <pre id="receiver3" class="prettyprint source">&lt;configuration debug="true">
        
      &lt;appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">    
        &lt;encoder>
          &lt;pattern>%date %-5level [%thread] %logger - %message%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="CONSOLE" />
      &lt;/root>  
    
      &lt;receiver class="ch.qos.logback.classic.net.SocketReceiver">
        &lt;remoteHost>${host}&lt;/remoteHost>
        &lt;port>${port}&lt;/port>
        &lt;reconnectionDelay>10000&lt;/reconnectionDelay>
      &lt;/receiver>
    
    &lt;/configuration></pre>
            
          <p>This configuration will cause logback to connect to a 
          <code>ServerSocketAppender</code> running on the host and port specified
          by the <em>host</em> and <em>port</em> substitution variables.  Logging
          events received from the remote appender will be logged locally 
          (according to the configuration shown here) via a console appender.
          </p>
       
          <p>Assuming you are in the <em>logback-examples/</em> directory, 
          you can run this example configuration using the following command:</p>
    
             
    
          <p>The example loads the configuration and then simply waits for logging
          events from the remote appender.  If you run this example when the remote
          appender is not running, you'll see <em>connection refused</em> messages
          appearing in the log output, periodically.  The receiver will 
          periodically attempt to reconnect to the remote appender until it 
          succeeds or until the logger context is shut down.  The delay
          interval between attempts is configurable using the 
          <span class="prop">reconnectionDelay</span> property as shown in the
          example configuration.<p class="source">java -Dhost=localhost -Dport=6000 \
          chapters.receivers.socket.ReceiverExample \
          src/main/java/chapters/receivers/socket/receiver3.xml</p></p>
    
          <p>We can provide a remote appender to which our example receiver
          can connect, using the same appender example used previously.  The 
          example loads a logback configuration containing a 
          <code>ServerSocketAppender</code>, and then waits input from the
          user consisting of a message that will be delivered to connected
          receivers.  We can run the example appender application as follows:
          </p>
    
          <p class="source">java -Dport=6000 \
          chapters.receivers.socket.AppenderExample \
          src/main/java/chapters/receivers/socket/appender3.xml</p>   
    
          <p>If you enter a message to send when the receiver is not connected,
          note that the message is simply discarded.</p>
    
          <h3 class="doAnchor" name="usingSSLSocketReceiver">Using
          SocketSSLReceiver</h3>
    
    
          <p>The configuration needed for <code>SSLSocketReceiver</code> is very 
          similar to that used with <code>SocketReceiver</code>.  The essential 
          differences are in the class specified for the receiver and the ability 
          to nest the <span class="prop">ssl</span> property to specify SSL 
          configuration properties.  The following example illustrates a basic 
          configuration:
          </p>
       
          <p class="example">Example: Basic SSLSocketReceiver Configuration
          (logback-examples/src/main/java/chapters/receivers/socket/receiver4.xml)</p>
          <span class="asGroovy" onclick="return asGroovy('receiver4');">View as .groovy</span>
      <pre id="receiver4" class="prettyprint source">&lt;configuration debug="true">
    
      &lt;appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">    
        &lt;encoder>
          &lt;pattern>%date %-5level [%thread] %logger - %message%n&lt;/pattern>
        &lt;/encoder>         
      &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="CONSOLE" />
      &lt;/root>  
     
      &lt;receiver class="ch.qos.logback.classic.net.SSLSocketReceiver">
        &lt;remoteHost>${host}&lt;/remoteHost>
        &lt;port>${port}&lt;/port>
        &lt;reconnectionDelay>10000&lt;/reconnectionDelay>
        &lt;ssl>
          &lt;trustStore>
            &lt;location>${truststore}&lt;/location>
            &lt;password>${password}&lt;/password>
          &lt;/trustStore>
        &lt;/ssl>
      &lt;/receiver>
    
    &lt;/configuration></pre>
    
          <p>Note that the <em>class</em> attribute now specifies 
          <code>SSLSocketReceiver</code> and that in addition to the configuration
          properties shown in the previous example, this configuration contains
          an SSL configuration specifying the location and password for a 
          trust store that will be used in validating that the remote appender is
          trusted.  See <a href="usingSSL.html">Using SSL</a> for more information 
          on configuring SSL properties.
          </p>
      
          <p>You can run this example configuration using the following command:</p>
      
          <p class="source">java -Dhost=localhost -Dport=6001 \
          -Dtruststore=file:src/main/java/chapters/appenders/socket/ssl/truststore.jks \
          -Dpassword=changeit \
          chapters.receivers.socket.ReceiverExample \
          src/main/java/chapters/receivers/socket/receiver4.xml</p>   
       
          <p>Once started, the receiver attempts to connect to the specified 
          remote appender.  Assuming that the appender is not yet running, you
          will see a "connection refused" message appearing in the log output
          periodically; the receiver will periodically retry the connection to
          the remote appender after delaying for the period of time specified by
          the <span class="prop">reconnectionDelay</span> property.
          </p>
      
          <p>We can provide a remote appender to which our example receiver
          can connect, using the same appender example used previously.  The 
          example loads a logback configuration containing a 
          <code>SSLServerSocketAppender</code>, and then awaits input from the  
          user consisting of a message that will be delivered to connected
          receivers.  We can run the example appender application as follows:
          </p>
    
          <p class="source">java -Dport=6001 \
          -Dkeystore=file:src/main/java/chapters/appenders/socket/ssl/keystore.jks \
          -Dpassword=changeit \
          chapters.receivers.socket.AppenderExample \
          src/main/java/chapters/receivers/socket/appender4.xml</p>   
    
          <p>If you enter a message to send when the receiver is not connected,
          note that the message is simply discarded.</p>
    
          <p>It is important to note once again that our example is using a 
          self-signed X.509 credential that is suitable for testing and 
          experimentation, only.  <strong>In a production setting, you should 
          obtain an appropriate X.509 credential to identify your SSL-enabled
          logback components</strong>.  See <a href="usingSSL.html">Using SSL</a> 
          for more information.</p>
      
            <script src="../templates/footer.js" type="text/javascript"></script>
    
        </div>
      </body>  
    </html>
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/manual/layouts.html�������������������������������������������������������������0000644�0001750�0001750�00000251073�12143164240�017754� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Chapter 6: Layouts</title>
        <link rel="stylesheet" type="text/css" href="../css/common.css" />
        <link rel="stylesheet" type="text/css" href="../css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="../css/_print.css" media="print" />
        <link rel="stylesheet" type="text/css" href="../css/prettify.css" media="screen" />
        
      </head>
      <body onload="prettyPrint(); decorate();">
        <script type="text/javascript">prefix='../';</script>
        <script type="text/javascript" src="../js/prettify.js"></script>
        <script type="text/javascript" src="../templates/header.js"></script>
        <script type="text/javascript" src="../js/dsl.js"></script>
        <script type="text/javascript" src="../js/jquery-min.js"></script>
        <script type="text/javascript" src="../js/decorator.js"></script>
    
        <div id="left">
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="../templates/left.js" type="text/javascript"></script>
        </div>
        <div id="right">
          <script src="menu.js" type="text/javascript"></script>
        </div>
        <div id="content">
        
        <h1>Chapter 6: Layouts</h1>
    	
        <div class="quote">
          <p>TCP implementations will follow a general principle of
          robustness: be conservative in what you do, be liberal in what
          you accept from others.
          </p>
          <p>&mdash;JON POSTEL, RFC 793</p>
        </div>
    
        <script src="../templates/creative.js" type="text/javascript"></script>
        <script src="../templates/setup.js" type="text/javascript"></script>
         
    		<h2 class="doAnchor">What is a layout?</h2>
    
    		<p>In case you were wondering, layouts have nothing to do with
    		large estates in Florida.  Layouts are logback components
    		responsible for transforming an incoming event into a String.  The
    		<code>format()</code> method in the <a
    		href="../xref/ch/qos/logback/core/Layout.html"><code>Layout</code></a>
    		interface takes an object that represents an event (of any type)
    		and returns a String. A synopsis of the <code>Layout</code>
    		interface is shown below.
    		</p>
    
    		<pre class="prettyprint source">public interface Layout&lt;E> extends ContextAware, LifeCycle {
    
      String doLayout(E event);
      String getFileHeader();
      String getPresentationHeader();
      String getFileFooter();
      String getPresentationFooter();
      String getContentType();
    }</pre>
    
    		<p>This interface is rather simple and yet is sufficient for many
    		formatting needs. The Texan developer from Texas, whom you might
    		know from Joseph Heller's <em>Catch-22</em>, might exclaim: it
    		just takes five methods to implement a layout!!?
    		</p>
    
    		<h2>Logback-classic</h2>
    
    		<p>Logback-classic is wired to process only events of type
    		<a href="../xref/ch/qos/logback/classic/spi/ILoggingEvent.html">
          <code>ch.qos.logback.classic.spi.ILoggingEvent</code></a>.  This
    			fact will be apparent throughout this section.</p>
    
    		<h2 class="doAnchor" name="writingYourOwnLayout">Writing your own
    		custom Layout</h2>
    
    		<p>Let us implement a simple yet functional layout for the
    			logback-classic module that prints the time elapsed since the
    			start of the application, the level of the logging event, the
    			caller thread between brackets, its logger name, a dash followed
    			by the event message and a new line.
    		</p>
    
    		<p>Sample output might look like:</p>
    
    		<div class="source">10489 DEBUG [main] com.marsupial.Pouch - Hello world.</div>
    
    		<p>Here is a possible implementation, authored by the Texan developer:</p>
    		<em>Example: Sample implementation of a Layout
    			<a href="../xref/chapters/layouts/MySampleLayout.html">
    			(logback-examples/src/main/java/chapters/layouts/MySampleLayout.java)</a></em>
    
    		<pre class="prettyprint source">package chapters.layouts;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.LayoutBase;
    
    public class MySampleLayout extends LayoutBase&lt;ILoggingEvent> {
    
      public String doLayout(ILoggingEvent event) {
        StringBuffer sbuf = new StringBuffer(128);
        sbuf.append(event.getTimeStamp() - event.getLoggingContextVO.getBirthTime());
        sbuf.append(" ");
        sbuf.append(event.getLevel());
        sbuf.append(" [");
        sbuf.append(event.getThreadName());
        sbuf.append("] ");
        sbuf.append(event.getLoggerName();
        sbuf.append(" - ");
        sbuf.append(event.getFormattedMessage());
        sbuf.append(CoreConstants.LINE_SEP);
        return sbuf.toString();
      }
    }</pre>
    
    		<p>Note that <code>MySampleLayout</code> extends <a
    		href="../xref/ch/qos/logback/core/LayoutBase.html">
    		<code>LayoutBase</code></a>.  This class manages state common to
    		all layout instances, such as whether the layout is started or
    		stopped, header, footer and content type data. It allows the
    		developer to concentrate on the formatting expected from his/her
    		<code>Layout</code>. Note that the <code>LayoutBase</code> class
    		is generic. In its class declaration, <code>MySampleLayout</code>
    		extends <code>LayoutBase&lt;ILoggingEvent&gt;</code>.
    		</p>
    		
    		<p>The <code>doLayout(ILoggingEvent event)</code> method, i.e. the
    		only method in <code>MySampleLayout</code>, begins by
    		instantiating a <code>StringBuffer</code>. It proceeds by adding
    		various fields of the event parameter. The Texan from Texas was
    		careful to print the formatted form of the message. This is
    		significant if one or more parameters were passed along with
    		the logging request.
    		</p>
    		
        <p>After adding these various characters to the string buffer, the
        <code>doLayout()</code> method converts the buffer into a
        <code>String</code> and returns the resulting value.
    		</p>
    
    		<p>In the above example, the <code>doLayout</code> method ignores
    		any eventual exceptions contained in the event. In a real world
    		layout implementation, you would most probably want to print the
    		contents of exceptions as well.
    		</p>
    
        <h3 class="doAnchor" name="configuringYourOwnLayout">Configuring
        your custom layout</h3>
    
    		<p>Custom layouts are configured as any other component. As
    		mentioned earlier, <code>FileAppender</code> and its sub-classes
    		expect an encoder. In order to fulfill this requirement, we pass
    		to <code>FileAppender</code> an instance of
    		<code>LayoutWrappingEncoder</code> which wraps our
    		<code>MySampleLayout</code>. Here is the configuration file:</p>
    		
    		<em>Example: Configuration of MySampleLayout
    		(logback-examples/src/main/java/chapters/layouts/sampleLayoutConfig.xml)</em>
        <span class="asGroovy" onclick="return asGroovy('sampleLayoutConfig');">View as .groovy</span>
    <pre id="sampleLayoutConfig" class="prettyprint source">&lt;configuration>
    
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <b>&lt;encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"></b>
          <b>&lt;layout class="chapters.layouts.MySampleLayout" /></b>
        <b>&lt;/encoder></b>
      &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="STDOUT" />
      &lt;/root>
    &lt;/configuration></pre>
       
    		<p>The sample application <a
    		href="../xref/chapters/layouts/SampleLogging.html">
    		<code>chapters.layouts.SampleLogging</code></a> configures logback
    		with the configuration script passed as its first argument and
    		then logs a debug message, followed by an error message. </p>
    		
    		<p>To run this example issue the following command from within the
    		<em>logback-examples</em> directory.
        </p>
        
        <p class="command">java chapters.layouts.SampleLogging src/main/java/chapters/layouts/sampleLayoutConfig.xml</p>
        
        <p> This will produce:</p>
    		
    <div class="source"><pre>0 DEBUG [main] chapters.layouts.SampleLogging - Everything's going well
    0 ERROR [main] chapters.layouts.SampleLogging - maybe not quite...</pre></div>
    
    		<p>That was simple enough.  The skeptic Pyrrho of Elea, who
    		insists that nothing is certain except perhaps uncertainty itself,
    		which is by no means certain either, might ask: how about a layout
    		with options?  The reader shall find a slightly modified version
    		of our custom layout in <a
    		href="../xref/chapters/layouts/MySampleLayout2.html"><code>MySampleLayout2.java</code></a>. As
    		mentioned throughout this manual, adding a property to a layout or
    		any other logback component is as simple as declaring a setter
    		method for the property.
    		</p>
    
    		<p>The <a
    		href="../xref/chapters/layouts/MySampleLayout2.html"><code>MySampleLayout2</code></a>
    		class contains two properties. The first one is a prefix that can
    		be added to the output. The second property is used to choose
    		whether to display the name of the thread from which the logging
    		request was sent.
        </p>
    		
        <p>Here is a copy of the <a
        href="../xref/chapters/layouts/MySampleLayout2.html"><code>MySampleLayout2</code></a>
        class :</p>
    
        <pre class="prettyprint source">package chapters.layouts;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.LayoutBase;
    
    public class MySampleLayout2 extends LayoutBase&lt;ILoggingEvent> {
    
      String prefix = null;
      boolean printThreadName = true;
    
      <b>public void setPrefix(String prefix) {
        this.prefix = prefix;
      }
    
      public void setPrintThreadName(boolean printThreadName) {
        this.printThreadName = printThreadName;
      }</b>
    
      public String doLayout(ILoggingEvent event) {
        StringBuffer sbuf = new StringBuffer(128);
        <b>if (prefix != null) {
          sbuf.append(prefix + ": ");
        }</b>
        sbuf.append(event.getTimeStamp() - event.getLoggerContextVO().getBirthTime());
        sbuf.append(" ");
        sbuf.append(event.getLevel());
        <b>if (printThreadName) {
          sbuf.append(" [");
          sbuf.append(event.getThreadName());
          sbuf.append("] ");
        } else {
          sbuf.append(" ");
        }</b>
        sbuf.append(event.getLoggerName());
        sbuf.append(" - ");
        sbuf.append(event.getFormattedMessage());
        sbuf.append(LINE_SEP);
        return sbuf.toString();
      }
    }</pre>
    
    
        <p>The addition of the corresponding setter method is all that is
        needed to enable the configuration of a property.  Note that the
        <code>PrintThreadName</code> property is a boolean and not a
        <code>String</code>. Configuration of logback components was
        covered in detail in the <a
        href="configuration.html">chapter on configuration</a>. The <a
        href="onJoran.html">chapter on Joran</a> provides further detail. Here is
        the configuration file tailor made for
        <code>MySampleLayout2</code>.
        </p> 
    
    
        <span class="asGroovy" onclick="return asGroovy('MySampleLayout2');">View as .groovy</span>
        <pre id="MySampleLayout2" class="prettyprint source">&lt;configuration>
    
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        &lt;encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
          &lt;layout class="chapters.layouts.MySampleLayout2"> 
            <b>&lt;prefix&gt;MyPrefix&lt;/prefix&gt;</b>
            <b>&lt;printThreadName&gt;false&lt;/printThreadName&gt;</b>
          &lt;/layout>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="STDOUT" />
      &lt;/root>
    &lt;/configuration></pre>
    
       <p></p>
    
    
    		<h2 class="doAnchor" name="ClassicPatternLayout">PatternLayout</h2>
    
    		<p>Logback classic ships with a flexible layout called <a
    		href="../xref/ch/qos/logback/classic/PatternLayout.html">
    		<code>PatternLayout</code></a>.  As all layouts,
    		<code>PatternLayout</code> takes a logging event and returns a
    		<code>String</code>. However, this <code>String</code> can be
    		customized by tweaking <code>PatternLayout</code>'s
    		conversion pattern.
    		</p>   
    
        <p>The conversion pattern of <code>PatternLayout</code> is closely
        related to the conversion pattern of the <code>printf()</code>
        function in the C programming language. A conversion pattern is
        composed of literal text and format control expressions called
        <em>conversion specifiers</em>. You are free to insert any literal
        text within the conversion pattern. Each conversion specifier
        starts with a percent sign '%' and is followed by optional
        <em>format modifiers</em>, a <em>conversion word</em> and optional
        parameters between braces. The conversion word controls the data
        field to convert, e.g. logger name, level, date or thread
        name. The format modifiers control field width, padding, and left
        or right justification.
    		</p>
    
        <p>As already mentioned on several occasions,
        <code>FileAppender</code> and sub-classes expect an
        encoder. Consequently, when used in conjunction with
        <code>FileAppender</code> or its subclasses a
        <code>PatternLayout</code> must be wrapped within an
        encoder. Given that the
        <code>FileAppender</code>/<code>PatternLayout</code> combination
        is so common, logback ships with an encoder named
        <code>PatternLayoutEncoder</code>, designed solely for the purpose
        of wrapping a <code>PatternLayout</code> instance so that it can
        be seen as encoder. Below is an example which programmatically
        configures a <code>ConsoleAppender</code> with a
        <code>PatternLayoutEncoder</code>:</p>
    
     
    		<em>
    			Example: Sample usage of a PatternLayout
    			<a href="../xref/chapters/layouts/PatternSample.html">
    			(logback-examples/src/main/java/chapters/layouts/PatternSample.java)</a>
    		</em>
    		<pre class="prettyprint source">package chapters.layouts;
    
    import org.slf4j.LoggerFactory;
    
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.ConsoleAppender;
    
    public class PatternSample {
    
      static public void main(String[] args) throws Exception {
        Logger rootLogger = (Logger)LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
        LoggerContext loggerContext = rootLogger.getLoggerContext();
        // we are not interested in auto-configuration
        loggerContext.reset();
    
        <b>PatternLayoutEncoder encoder = new PatternLayoutEncoder();</b>
        <b>encoder.setContext(loggerContext);</b>
        <b>encoder.setPattern("%-5level [%thread]: %message%n");</b>
        <b>encoder.start();</b>
    
        ConsoleAppender&lt;ILoggingEvent> appender = new ConsoleAppender&lt;ILoggingEvent>();
        appender.setContext(loggerContext);
        appender.setEncoder(encoder); 
        appender.start();
    
        rootLogger.addAppender(appender);
    
        rootLogger.debug("Message 1"); 
        rootLogger.warn("Message 2");
      } 
    }</pre>
    
    		<p>In the above example, the conversion pattern is set to be
    		<b>"%-5level [%thread]: %message%n"</b>. A synopsis of conversion
    		word included in logback will be given shortly. Running
    		<code>PatternSample</code> application as:
    		</p>
    
        <p class="source">java java chapters.layouts.PatternSample</p>
    
        <p>will yield the following		output on the console.</p>
    
    		<p class="source">DEBUG [main]: Message 1 
    WARN  [main]: Message 2</p>
    
        <p>Note that in the conversion pattern <b>"%-5level [%thread]:
        %message%n"</b> there is no explicit separator between literal
        text and conversion specifiers. When parsing a conversion pattern,
        <code>PatternLayout</code> is capable of differentiating between
        literal text (space characters, the brackets, colon character) and
        conversion specifiers. In the example above, the conversion
        specifier %-5level means the level of the logging event should be
        left justified to a width of five characters. Format specifiers
        will be explained below.
    		</p>
    
    		<p>In <code>PatternLayout</code>, parenthesis can be used to group
    		conversion patterns. <b>It follows that the '(' and ')' carry
    		special meaning and need to be escaped if intended to be used as
    		literals. </b> The special nature of parenthesis is further <a
    		href="#Parentheses">explained below</a>.
    		</p>
    
    		<p>As mentioned previously, certain conversion specifiers may
    		include optional parameters passed between braces. A sample
    		conversion specifier with options could be
    		<code>%logger{10}</code>. Here "logger" is the conversion word,
    		and 10 is the option. Options are <a href="#cwOptions">further
    		discussed below</a>.
    		</p>
    		
    		<p>The recognized conversions words along with their options are
    		described in the table below. When multiple conversion words are
    		listed in the same table cell, they are considered as aliases.
    		</p>
    
    		<table class="bodyTable properties striped" border="0">
          <tr>
            <th><a name="conversionWord" href="#conversionWord">Conversion Word</a></th>
            <th>Effect</th>
          </tr>
    
    			<tr>
    				<td class="word" name="logger">
              <a name="logger" href="#logger"><span class="anchor"/></a>
    					<b>c</b>{<em>length</em>} <br /> 				
    					<b>lo</b>{<em>length</em>} <br />
    					<b>logger</b>{<em>length</em>} <br />
    				</td>
    
    				<td>
              Outputs the name of the logger at the origin of the logging
              event.
    
    					<p>This conversion word takes an integer as its first and
    					only option. The converter's abbreviation algorithm will
    					shorten the logger name, usually without significant loss of
    					meaning. Setting the value of length option to zero
    					constitutes an exception. It will cause the conversion word
    					to return the sub-string right to the rightmost dot
    					character in the logger name. The next table provides
    					examples of the abbreviation algorithm in action.
              </p>
    
    					<table class="bodyTable dark" border="0" cellpadding="8">
    						<tr>
    							<th>Conversion specifier</th>
    							<th>Logger name</th>
    							<th>Result</th>
    						</tr>
    						<tr>
    							<td>%logger</td>
    							<td>mainPackage.sub.sample.Bar</td>
    							<td>mainPackage.sub.sample.Bar</td>
    						</tr>
    
                <tr>
    							<td>%logger{0}</td>
    							<td>mainPackage.sub.sample.Bar</td>
    							<td>Bar</td>
    						</tr>
    
    						<tr>
    							<td>%logger{5}</td>
    							<td>mainPackage.sub.sample.Bar</td>
    							<td>m.s.s.Bar</td>
    						</tr>
    
    						<tr>
    							<td>%logger{10}</td>
    							<td>mainPackage.sub.sample.Bar</td>
    							<td>m.s.s.Bar</td>
    						</tr>
    
    						<tr>
    							<td>%logger{15}</td>
    							<td>mainPackage.sub.sample.Bar</td>
    							<td>m.s.sample.Bar</td>
    						</tr>
    
    						<tr>
    							<td>%logger{16}</td>
    							<td>mainPackage.sub.sample.Bar</td>
    							<td>m.sub.sample.Bar</td>
    						</tr>
    
    						<tr>
    							<td>%logger{26}</td>
    							<td>mainPackage.sub.sample.Bar</td>
    							<td>mainPackage.sub.sample.Bar</td>
    						</tr>
    					</table>
    
              <p>Please note that the rightmost segment in a logger name
              is never abbreviated, even if its length is longer than the
              <em>length</em> option. Other segments may be shortened to
              at most a single character but are never removed.</p>
    
    				</td>
    			</tr>
    
    			<tr>
    				<td class="word" name="class">
    					<b>C</b>{<em>length</em>} <br /> 
    					<b>class</b>{<em>length</em>} <br />
    				</td>
    
    				<td>
    					<p>Outputs the fully-qualified class name of the caller
    					issuing the logging request.
    					</p>
    
    					<p>Just like the <em>%logger</em> conversion word above,
    					this conversion takes an integer as an option to shorten
    					the class name. Zero carries special meaning and will cause
    					the simple class name to be printed without the package name
    					prefix. By default the class name is printed in full.
    					</p>
    
              <p>Generating the caller class information is not
              particularly fast.  Thus, its use should be avoided unless
              execution speed is not an issue.
    					</p>
    				</td>
    			</tr>
    
          <tr>
            <td class="word" name="contextName">
              <b>contextName</b><br/>
              <b>cn</b><br/></td>
              <td>Outputs the name of the logger context to which the
              logger at the origin of the event was attached to. </td>
          </tr>
    			<tr>
            <td class="word" name="date">
              <b>d</b>{<em>pattern</em>} <br /> 
              <b>date</b>{<em>pattern</em>} <br />
            </td>
            <td>
    					<p>Used to output the date of the logging event.  The date
    					conversion word admits a pattern string as an option. The
    					pattern syntax is compatible with the format accepted by <a
    					href="http://java.sun.com/j2se/1.4.2/docs/api/java/text/SimpleDateFormat.html"><code>java.text.SimpleDateFormat</code></a>.</p>
    
    					<p>You can specify the string <em>"ISO8601"</em> for the
    					ISO8601 date format. Note that the %date conversion word
    					defaults to the <a
    					href="http://en.wikipedia.org/wiki/ISO_8601">ISO 8601 date
    					format</a> in the absence of a pattern option.</p>
    
    					<p>Here are some sample option values. They assume that the
    					actual date is Friday 20th of October, 2006 and that the
    					author has returned to working on this document just after
    					lunch.</p>
    					
    					<table class="bodyTable dark" cellpadding="8">
    						<tr>
    							<th>Conversion Pattern</th>
    							<th>Result</th>
    						</tr>
                <tr>
    							<td>%d</td>
    							<td>2006-10-20 14:06:49,812</td>
    						</tr>
    						<tr>
    							<td>%date</td>
    							<td>2006-10-20 14:06:49,812</td>
    						</tr>
    						<tr>
    							<td>%date{ISO8601}</td>
    							<td>2006-10-20 14:06:49,812</td>
    						</tr>			
    						<tr>
    							<td>%date{HH:mm:ss.SSS}</td>
    							<td>14:06:49.812</td>
    						</tr>
    						<tr>
    							<td>%date{dd&#160;MMM&#160;yyyy&#160;;HH:mm:ss.SSS}</td>
    							<td>20 oct. 2006;14:06:49.812	</td>
    						</tr>
    					</table>
    
              <p>In addition to the date pattern, this converter admits a
              second option as the timezone. Thus, the
              '%date{HH:mm:ss.SSS,Australia/Perth} would print the time in
              the time zone of Perth, Australia, the world's most isolated
              city.
              </p>
    
              <p>Given that the comma ',' character is interpreted as the
              option separator, the pattern string [HH:mm:ss,SSS] will
              print the time in the [SSS] time zone which does not
              exist. Thus, the time will be printed in the default GMT
              timezone. If you wish to include a comma in your date
              pattern, then simply enclose the pattern between quotes. For
              example, %date{<b>"</b>HH:mm:ss,SSS<b>"</b>}.
              </p>
    				</td>
    			</tr>
    
    			<tr>
    				<td class="word" name="file">
    					<b>F / file</b>
    				</td>
    
    				<td>
    					<p>Outputs the file name of the Java source file where the
    					logging request was issued.
    					</p>
    
    					<p>Generating the file information is not particularly fast.
    					Thus, its use should be avoided unless execution speed is
    					not an issue.
    					</p>
    				</td>
    			</tr>
    
    			<tr >
    				<td class="word" name="caller">
    					<b>caller{depth}</b>
    					<b>caller{depth, evaluator-1, ... evaluator-n}</b>
    				</td>
    
    				<td>
    					<p>Outputs location information of the caller which
    					generated the logging event.
    					</p>
    
    					<p>The location information depends on the JVM
    					implementation but usually consists of the fully qualified
    					name of the calling method followed by the caller's source,
    					the file name and line number between parentheses.
    					</p>
    
    					<p>A integer can be added to the <em>caller</em> conversion
    					specifier's options to configure the depth of the
    					information to be displayed.
    					</p>
    
              <p>For example, <b>%caller{2}</b> would display the
              following excerpt:</p>
    					
    <pre class="source white_bg">0    [main] DEBUG - logging statement 
    Caller+0   at mainPackage.sub.sample.Bar.sampleMethodName(Bar.java:22)
    Caller+1   at mainPackage.sub.sample.Bar.createLoggingRequest(Bar.java:17)</pre>
    
    					<p>And <b>%caller{3}</b> would display this other excerpt:</p>
    
    <pre class="source white_bg">16   [main] DEBUG - logging statement 
    Caller+0   at mainPackage.sub.sample.Bar.sampleMethodName(Bar.java:22)
    Caller+1   at mainPackage.sub.sample.Bar.createLoggingRequest(Bar.java:17)
    Caller+2   at mainPackage.ConfigTester.main(ConfigTester.java:38)</pre>
    					
    					<p>This conversion word can also use evaluators to test
    					logging events against a given criterion before computing
    					caller data. For example, using <b>%caller{3,
    					CALLER_DISPLAY_EVAL}</b> will display three lines of
    					stacktrace, only if the evaluator called
    					<em>CALLER_DISPLAY_EVAL</em> returns a <b>positive</b>
    					answer.
    				</p>
    
    				 <p>Evaluators are described below.</p>
    				</td>
    			</tr>
    
    			<tr>
    				<td class="word" name="line">
    					<b>L / line</b>
    				</td>
    
    				<td><p>Outputs the line number from where the logging
    					request was issued.</p>
    
    					<p>Generating the line number information is not
    					particularly fast.  Thus, its use should be avoided unless
    					execution speed is not an issue.
    					</p>
    				</td>
    			</tr>
    
    
    			<tr>
    				<td class="word" name="message">
    					<b>m / msg / message</b>
    				</td>
    				<td>
              <p>Outputs the application-supplied message associated with
              the logging event.
              </p>
    				</td>
    			</tr>
    
    			<tr>
    				<td class="word" name="method">
    					<b>M / method</b>
    				</td>
    
    				<td>
    					<p>Outputs the method name where the logging request was
    					issued.</p>
    					<p>Generating the method name is not particularly fast.
    					Thus, its use should be avoided unless execution speed is
    					not an issue.</p>
    				</td>
    			</tr>
    
    			<tr>
    				<td class="word" name="newline">
    					<b>n</b>
    				</td>
    
    				<td>
    					<p>Outputs the platform dependent line separator
    						character or characters.</p>
    					<p>This conversion word offers practically the same
    					performance as using non-portable line separator strings
    					such as "\n", or "\r\n". Thus, it is the preferred way of
    					specifying a line separator.
    					</p>
    				</td>
    
    			</tr>
    
    			<tr>
    				<td class="word" name="level">
    					<b>p / le / level</b>
    				</td>
    				<td>Outputs the level of the logging event.</td>
    			</tr>
    
    			<tr>
    
    				<td class="word" name="relative">
    					<b>r / relative</b>
    				</td>
    
    				<td>Outputs the number of milliseconds elapsed since the start
    				of the application until the creation of the logging event.
    				</td>
    			</tr>
    
    
    			<tr>
    				<td class="word" name="relative">
    					<b>t / thread</b>
    				</td>
    
    				<td>Outputs the name of the thread that generated the logging
    				event.
    				</td>
    
    			</tr>
    
    			<tr>
    				<td class="word" name="mdc">
    					<b>X</b>{<em>key:-defaultVal</em>} <br /> 
    					<b>mdc</b>{<em>key:-defaultVal</em>} <br />
    				</td>
    
    				<td>
    
    					<p>Outputs the MDC (mapped diagnostic context) associated
    					with the thread that generated the logging event.
    					</p>
    
    					<p>If the <b>mdc</b> conversion word is followed by a key
    					between braces, as in <b>%mdc{userid}</b>, then the MDC
    					value corresponding to the key 'userid' will be output. If
    					the value is null, then the <a
    					href="configuration.html#defaultValuesForVariables">default
    					value</a> speficied after the <b>:-</b> operator is
    					output. If no deault value is specified than the empty
    					string is output.
    					</p>
    
    					<p>If no key is given, then the entire content of the MDC
    					will be output in the format "key1=val1, key2=val2".
    					</p>
    
    					<p>See the <a href="mdc.html">chapter on MDC</a> for more
    					details on the subject.</p>
    
    				</td>
    			</tr>
    			<tr>
    				<td class="word" name="ex">
    					<b>ex</b>{<em>depth</em>} <br /> 
              	<b>exception</b>{<em>depth</em>} <br /> 
    					<b>throwable</b>{<em>depth</em>} <br />
              <br />
    					<b>ex</b>{depth, evaluator-1, ..., evaluator-n} <br />
    					<b>exception</b>{depth, evaluator-1, ..., evaluator-n} <br />
    					<b>throwable</b>{depth, evaluator-1, ..., evaluator-n}
    				</td>
    
    				<td>
    					<p>Outputs the stack trace of the exception
    					associated with the logging event, if any. By default the
    					full stack trace will be output.
    				 </p>
             
    				 <p>The <em>throwable</em> conversion word can followed by one of
    						the following options:
    				 </p>
    				 <ul>
    				   <li><em>short</em>: prints the first line of the stack trace</li>
    				   <li><em>full</em>: prints the full stack trace</li>
    				   <li>Any integer: prints the given number of lines of the stack trace</li>
    				 </ul>
    				 
    				 <p>Here are some examples:</p>
    				 
    				 <table  class="bodyTable">
    						<tr class="a">
    							<th>Conversion Pattern</th>
    							<th>Result</th>
    						</tr>
    						<tr class="b">
    							<td>%ex</td>
    							<td><pre>mainPackage.foo.bar.TestException: Houston we have a problem
      at mainPackage.foo.bar.TestThrower.fire(TestThrower.java:22)
      at mainPackage.foo.bar.TestThrower.readyToLaunch(TestThrower.java:17)
      at mainPackage.ExceptionLauncher.main(ExceptionLauncher.java:38)</pre></td>
    						</tr>
    						<tr class="a">
    							<td>%ex{short}</td>
    							<td><pre>mainPackage.foo.bar.TestException: Houston we have a problem
      at mainPackage.foo.bar.TestThrower.fire(TestThrower.java:22)</pre></td>
    						</tr>
    						<tr class="b">
    							<td>%ex{full}</td>
    							<td><pre>mainPackage.foo.bar.TestException: Houston we have a problem
      at mainPackage.foo.bar.TestThrower.fire(TestThrower.java:22)
      at mainPackage.foo.bar.TestThrower.readyToLaunch(TestThrower.java:17)
      at mainPackage.ExceptionLauncher.main(ExceptionLauncher.java:38)</pre></td>
    						</tr>
    						<tr class="a">
    							<td>%ex{2}</td>
    							<td><pre>mainPackage.foo.bar.TestException: Houston we have a problem
      at mainPackage.foo.bar.TestThrower.fire(TestThrower.java:22)
      at mainPackage.foo.bar.TestThrower.readyToLaunch(TestThrower.java:17)</pre></td>
    						</tr>
    				 </table>
    					
    					<p>This conversion word can also use evaluators to test
    					logging events against a given criterion before creating the
    					output. For example, using <b>%ex{full, EX_DISPLAY_EVAL}</b>
    					will display the full stack trace of the exception only if
    					the evaluator called <em>EX_DISPLAY_EVAL</em> returns a
    					<b>negative</b> answer. Evaluators are described further
    					down in this document.
    					</p>
    				</td>
    			</tr>
          
          <tr>
    				<td class="word" name="xThrowable">
    					<b>xEx</b>{<em>depth</em>} <br /> 
              <b>xException</b>{<em>depth</em>} <br /> 
    					<b>xThrowable</b>{<em>depth</em>} <br />
              <br />
    					<b>xEx</b>{depth, evaluator-1, ..., evaluator-n} <br />
    					<b>xException</b>{depth, evaluator-1, ..., evaluator-n} <br />
    					<b>xThrowable</b>{depth, evaluator-1, ..., evaluator-n}
    				</td>
    
    				<td>
    					<p>Same as the %throwable conversion word above with the
    					addition of class packaging information.</p>
    
              <p>If you do not specify %xThrowable or another
              throwable-related conversion word in the conversion pattern,
              <code>PatternLayout</code> will automatically add it as the
              last conversion word, on account of the importance of stack
              trace information. The $nopex conversion word can be
              substituted for %xThrowable, if you do not wish stack
              trace information to be displayed. See also the %nopex
              conversion word.
             </p>
    
              <p>At the end of each stack frame of the exception, a string
              consisting of the jar file containing the relevant class
              followed by the "Implementation-Version" as found in that
              jar's manifest will be added. This innovative technique was
              <a
              href="http://macstrac.blogspot.com/2008/09/better-stack-traces-in-java-with-log4j.html">originally suggested
              by James Strachan</a>. If the information is uncertain, then
              the class packaging data will be preceded by a tilde, i.e.
              the '~' character.
              </p>
    
              <p>Here is an example:</p>
    
              <p class="source small">java.lang.NullPointerException
      at com.xyz.Wombat(Wombat.java:57) <b><span class="red">~</span>[wombat-1.3.jar:1.3]</b>
      at  com.xyz.Wombat(Wombat.java:76) ~[wombat-1.3.jar:1.3]
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.5.0_06]
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) ~[na:1.5.0_06]
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) ~[na:1.5.0_06]
      at java.lang.reflect.Method.invoke(Method.java:585) ~[na:1.5.0_06]
      at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:59) [junit-4.4.jar:na]
      at org.junit.internal.runners.MethodRoadie.runTestMethod(MethodRoadie.java:98) [junit-4.4.jar:na]
      ...etc </p>
    
              <p>Logback goes to great lengths to ensure that the class
              packaging information it displays is correct, even in
              arbitrarily complex class loader hierarchies.  However, when
              it is unable to guarantee the absolute correctness of the
              information, then it will prefix the data with a tilde, i.e.
              the '~' character. Thus, it is theoretically possible for
              the printed class packaging information to differ from the
              real class packaging information. So, in the above example,
              given that packaging data for the Wombat class is preceded
              by a tilde, it is possible that the correct packaging data is
              in reality [wombat.jar:1.7].
              </p>
              
              <p><a
              href="http://jira.qos.ch/browse/LBCLASSIC-212">Feedback from
              users</a> indicates that Netbeans chokes on packaging
              information. If you are a Netbeans user, then you should
              disable packaging information in stack traces by adding
              "%ex" at the end of of your conversion pattern. For example,
              "%d %logger - %m%n" should be rewritten as "%d %logger -
              %m%n<b>%ex</b>"
              </p>
            </td>
    
          </tr>
    
          <tr>
            <td class="word" name="nopex">
              <b>nopex</b> <br />
              <b>nopexception</b>
            </td>
    
            <td>
              <p>Although it <em>pretends</em> to handle stack trace data,
              this conversion word does not output any data, thus,
              effectively ignoring exceptions.
              </p>
    
              <p>The %nopex conversion word allows the user to override
              <code>PatternLayout</code>'s internal safety mechanism which
              silently adds the %xThrowable conversion keyword in the absence of
              another conversion word handling exceptions.
              </p>
            </td>
          </tr>
    
          <tr >
            <td class="word" name="marker">
              <b>marker</b>
            </td>
    
            <td>
              <p>Outputs the marker associated with the logger 
             request.</p>
    
              <p>In case the marker contains children markers, the
              converter displays the parent as well as childrens' names
              according to the format shown below.
              </p>
              <p>
                <em>parentName [ child1, child2 ]</em>
              </p>
            </td>
          </tr>
    
    
          <tr>
            <td class="word" name="property">
              <b>property{key}</b>
            </td>
            
            <td><p>Outputs the value associated with a property named
            <em>key</em>. The the relevant docs on how to define ion
            entitled <a
            href="configuration.html#variableSubstitution">define
            variables</a> and <a href="configuration.html#scopes">variable
            scopes</a>. 
    
            <!-- XXXXXXXXXXXX -->
    
            If <em>key</em> is not a property of
            the logger context, then <em>key</em> will be looked up in the
            System properties.</p>
    
    
             <p>There is no default value for <em>key</em>. If it is
             omitted, the returned value will be "Property_HAS_NO_KEY",
             expliciting the error condition.</p>
              
            </td>
          </tr>
    
          <tr>
            <td class="word" name="replace">
              <b>replace(<em>p</em>){r, t}</b>
            </td>
            
            <td>
              <p>Replaces occurrences of 'r', a regex, with its
              replacement 't' in the string produces by the sub-pattern
              'p'. For example, "%replace(%msg){'\s', ''}" will remove all
              spaces contained in the event message. 
              </p>
    
              <p>The pattern 'p' can be arbitrarily complex and in
              particular can contain multiple conversion keywords. For
              instance, "%replace(%logger %msg){'\.', '/'}" will replace
              all dots in the logger or the message of the event with a
              forward slash.
              </p>
              
            </td>
          </tr>
    
    
          <tr>
            <td class="word" name="rootException">
              <b>rEx</b>{<em>depth</em>} <br /> 
              <b>rootException</b>{<em>depth</em>} <br /> 
              <br />
    					<b>rEx</b>{depth, evaluator-1, ..., evaluator-n} <br />
    					<b>rootException</b>{depth, evaluator-1, ..., evaluator-n}
            </td>
            
            <td>
              <p>Outputs the stack trace of the exception associated with
              the logging event, if any. The root cause will be output
              first instead of the standard "root cause last". Here is a
              sample output (edited for space):
              </p>
    
             <pre class="small">java.lang.NullPointerException
      at com.xyz.Wombat(Wombat.java:57) ~[wombat-1.3.jar:1.3]
      at com.xyz.Wombat(Wombat.java:76) ~[wombat-1.3.jar:1.3]
    Wrapped by: org.springframework.BeanCreationException: Error creating bean with name 'wombat': 
      at org.springframework.AbstractBeanFactory.getBean(AbstractBeanFactory.java:248) [spring-2.0.jar:2.0]
      at org.springframework.AbstractBeanFactory.getBean(AbstractBeanFactory.java:170) [spring-2.0.jar:2.0]
      at org.apache.catalina.StandardContext.listenerStart(StandardContext.java:3934) [tomcat-6.0.26.jar:6.0.26]
    </pre>          
    
             <p>The %rootException converter admits the same optional
             parameters as the %xException converter described above,
             including depth and eveluators. It outputs also packaging
             information. In short, %rootException is very similar to
             %xException, only the order of exception output is reversed.
             </p>
    
             <p>Tomasz Nurkiewicz, the author of %rootException converter,
             documents his contribution in a blog entry entitled <a
             href="http://nurkiewicz.blogspot.com/2011/09/logging-exceptions-root-cause-first.html">"Logging
             exceptions root cause first"</a>.</p>
            </td>
          </tr>
    
    		</table>
    
    
        <h4 class="doAnchor" name="percentIsSpecial">% character has special meaning</h4>
    
        <p>Given that in the context of conversion patterns the percent
        sign carries special meaning, in order to include it as a literal,
        it needs to be escaped with a backslash, e.g. "%d %p <b>\%</b>
        %m%n".
        </p>
    
        <h4 class="doAnchor" name="restrictionsOnLiterals">Restrictions on
        literals immediately following conversion words</h4>
    
        <p>In most cases literals naturally contain spaces or other
        delimiting characters so that they are not confused with
        conversion words. For example, the pattern
        "%level&nbsp;[%thread]&nbsp;-&nbsp;%message%n" contains the string
        literals <code>"&nbsp;["</code> and
        <code>"]&nbsp;-&nbsp;"</code>. However, if a character which can
        be part of a java identifier immediately follows a conversion
        word, logback's pattern parser will be fooled into thinking that
        the literal is part of the conversion word. For example, the
        pattern "%date<b>%nHello</b>" will be interpreted as two
        conversion words %date and %nHello and since %nHello is not a
        known conversion word, logback will output %PARSER_ERROR[nHello]
        for %nHello. If you wish the string literal "Hello" to immediately
        separate %n and Hello, pass an empty argument list to %n. For
        example, "%date<b>%n{}</b>Hello" will be interpreted as %date
        followed by %n followed by the literal "Hello".
    
        </p>
    
        <h2 class="doAnchor" name="formatModifiers">Format modifiers</h2>
    
    		<p>By default the relevant information is output as-is.  However,
    		with the aid of format modifiers it is possible to change the
    		minimum and maximum width and the justifications of each data
    		field.
    		</p>
    
    		<p>The optional format modifier is placed between the percent sign
    		and the conversion character or word.
    		</p>
    
    		<p>The first optional format modifier is the <em>left
    		justification flag</em> which is just the minus (-)
    		character. Then comes the optional <em>minimum field width</em>
    		modifier. This is a decimal constant that represents the minimum
    		number of characters to output. If the data item contains fewer
    		characters, it is padded on either the left or the right until the
    		minimum width is reached. The default is to pad on the left (right
    		justify) but you can specify right padding with the left
    		justification flag. The padding character is space. If the data
    		item is larger than the minimum field width, the field is expanded
    		to accommodate the data. The value is never truncated.
    		</p>
    
    		<p>This behavior can be changed using the <em>maximum field
    		width</em> modifier which is designated by a period followed by a
    		decimal constant. If the data item is longer than the maximum
    		field, then the extra characters are removed from the
    		<em>beginning</em> of the data item. For example, if the maximum
    		field width is eight and the data item is ten characters long,
    		then the first two characters of the data item are dropped. This
    		behavior deviates from the printf function in C where truncation
    		is done from the end.
    		</p>
    
    		<p>Truncation from the end is possible by appending a minus
    		character right after the period. In that case, if the maximum
    		field width is eight and the data item is ten characters long,
    		then the last two characters of the data item are dropped.
    		</p>
    
    		<p>Below are various format modifier examples for the logger
    		conversion specifier.
    		</p>
    
    		<table class="bodyTable" border="0" cellpadding="8">
          <tr>
            <th>Format modifier</th>
            <th>Left justify</th>
            <th>Minimum width</th>
            <th>Maximum width</th>
            <th>Comment</th>
          </tr>
    			<tr class="a">
    				<td align="center">%20logger</td>
    				<td align="center">false</td>
    				<td align="center">20</td>
    				<td align="center">none</td>
    				<td>
    					Left pad with spaces if the logger name is less
    					than 20 characters long.
    				</td>
    			</tr>
    			<tr class="b">
    				<td align="center">%-20logger</td>
    				<td align="center">true</td>
    				<td align="center">20</td>
    				<td align="center">none</td>
    				<td>
    					Right pad with spaces if the logger name is less
    					than 20 characters long.
    				</td>
    			</tr>
    			<tr class="a">
    				<td align="center">%.30logger</td>
    				<td align="center">NA</td>
    				<td align="center">none</td>
    				<td align="center">30</td>
    				<td>
    					Truncate from the beginning if the logger name is
    					longer than 30 characters.
    				</td>
    			</tr>
    			<tr class="b">
    				<td align="center">%20.30logger</td>
    				<td align="center">false</td>
    				<td align="center">20</td>
    				<td align="center">30</td>
    				<td>
    					Left pad with spaces if the logger name is shorter
    					than 20 characters. However, if logger name is
    					longer than 30 characters, then truncate from the
    					beginning.
    				</td>
    			</tr>
    			<tr class="a">
    				<td align="center">%-20.30logger</td>
    				<td align="center">true</td>
    				<td align="center">20</td>
    				<td align="center">30</td>
    				<td>
    					Right pad with spaces if the logger name is shorter
    					than 20 characters. However, if logger name is
    					longer than 30 characters, then truncate from the
    					<em>beginning</em>.
    				</td>
    			</tr>
    			<tr class="b">
    				<td align="center">%.-30logger</td>
    				<td align="center">NA</td>
    				<td align="center">none</td>
    				<td align="center">30</td>
    				<td>
    					Truncate from the <em>end</em> if the logger name is
    					longer than 30 characters.
    				</td>
    			</tr>
    		</table>
    				
    		<p>The table below list examples for format modifier
    		truncation. Please note that the square brackets, i.e the pair of "[]"
    		characters, are not part of the output. They are used to delimit
    		the width of output.</p>
    
    
    		<table  class="bodyTable" border="0" cellpadding="8">
          <tr>
            <th>Format modifier</th>
            <th>Logger name</th>
            <th>Result</th>		
          </tr>
    			<tr class="b">
    				<td align="center">[%20.20logger]</td>
    				<td align="center">main.Name</td>
    				<td align="center"><pre>[           main.Name]</pre></td>
    			</tr>
          <tr class="a">
    				<td align="center">[%-20.20logger]</td>
    				<td align="center">main.Name</td>
    				<td align="center"><pre>[main.Name           ]</pre></td>
    			</tr>
    		  <tr class="a">
    				<td align="center">[%10.10logger]</td>
    				<td align="center">main.foo.foo.bar.Name</td>
    				<td align="center"><pre>[o.bar.Name]</pre></td>
    			</tr>
    			<tr class="b">
    				<td align="center">[%10.-10logger]</td>
    				<td align="center">main.foo.foo.bar.Name</td>
    				<td align="center"><pre>[main.foo.f]</pre></td>
    			</tr>
    		</table>
    
        <h3 class="doAnchor" name="oneLetterLevel">Output just one letter
        for the level</h3>
    
        <p>Instead of printing TRACE, DEBUG, WARN, INFO or ERROR for the
        level, you may want to print just T, D, W, I and E. You could
        write a <a href="#customConversionSpecifier">custom converter</a>
        for this purpose, or simply make use of format modifiers (just
        discussed) to shorten the level value to a single character. The
        appropriate conversion specifier would be
        "<code>%.-1level</code>".
        </p>
        
    		<h2 class="doAnchor" name="cwOptions">Conversion word options</h2>
    
    		<p>A conversion specifier can be followed by options. The are
    		always declared between braces. We have already seen some of the
    		possibilities offered by options, for instance in conjunction with
    		the MDC conversion specifier, as in: <em>%mdc{someKey}</em>.
    		</p>
    
        <p>A conversion specifier might have more than one option. For
        example, a conversion specifier that makes use of evaluators,
        which will be covered soon, may add evaluator names to the option
        list, as shown below:</p>
    
    		<pre class="prettyprint source">&lt;pattern>%-4relative [%thread] %-5level - %msg%n \
      <b>%caller{2, DISP_CALLER_EVAL, OTHER_EVAL_NAME, THIRD_EVAL_NAME}</b>&lt;/pattern></pre>
        
        <p>If the option includes special characters such as a braces, spaces or
        commas, you can enclose it between single or double quotes. For
        example, consider the next pattern.</p>
    
    		<pre class="prettyprint source">&lt;pattern>%-5level - %replace(%msg)<b>{'\d{14,16}', 'XXXX'}</b>%n&lt;/pattern></pre>
    
    
        <p>We pass the options <code>\d{16}</code> and <code>XXXX</code>
        to the <code>replace</code> conversion word. It replaces any
        sequence of 14, 15 or 16 digits contained in the message with XXXX
        effectively obfuscating credit card numbers. Note that "\d" which
        is a shorthand for a single digit in regular expressions. The
        "{14,16\}" is interpreted as "{14, 16}", that is, repeat the
        previous item at least 14 but at most 16 times.
        </p>
    
    		<h2 class="doAnchor" name="Parentheses">Parentheses are
    		special</h2>
    
        <p>In logback, parentheses within the pattern string are treated
        as grouping tokens. Thus, it is possible to group a sub-pattern
        and apply formatting directives on that sub-pattern. As of version
        0.9.27, logback supports composite conversion words such as <a
        href="#replace">%replace</a> which can transform sub-patterns.
        </p>
    
        <p>For example, the pattern</p> 
    
        <p class="source"><b>%-30(</b>%d{HH:mm:ss.SSS} [%thread]<b>)</b> %-5level %logger{32} - %msg%n</p> 
    
        <p>will group the output generated by the sub-pattern
        "%d{HH:mm:ss.SSS} [%thread]" so that it is right-padded if less
        than 30 characters.
        </p>
    
        <p>If without the grouping the output was</p>
    
        <p class="source">13:09:30 [main] DEBUG c.q.logback.demo.ContextListener - Classload hashcode is 13995234
    13:09:30 [main] DEBUG c.q.logback.demo.ContextListener - Initializing for ServletContext
    13:09:30 [main] DEBUG c.q.logback.demo.ContextListener - Trying platform Mbean server
    13:09:30 [pool-1-thread-1] INFO  ch.qos.logback.demo.LoggingTask - Howdydy-diddly-ho - 0
    13:09:38 [btpool0-7] INFO c.q.l.demo.lottery.LotteryAction - Number: 50 was tried.
    13:09:40 [btpool0-7] INFO c.q.l.d.prime.NumberCruncherImpl - Beginning to factor.
    13:09:40 [btpool0-7] DEBUG c.q.l.d.prime.NumberCruncherImpl - Trying 2 as a factor.
    13:09:40 [btpool0-7] INFO c.q.l.d.prime.NumberCruncherImpl - Found factor 2
        </p>
    
        <p>with the "%-30()" grouping it would be</p>
    
        <p class="source">13:09:30 [main]            DEBUG c.q.logback.demo.ContextListener - Classload hashcode is 13995234
    13:09:30 [main]            DEBUG c.q.logback.demo.ContextListener - Initializing for ServletContext
    13:09:30 [main]            DEBUG c.q.logback.demo.ContextListener - Trying platform Mbean server
    13:09:30 [pool-1-thread-1] INFO  ch.qos.logback.demo.LoggingTask - Howdydy-diddly-ho - 0
    13:09:38 [btpool0-7]       INFO  c.q.l.demo.lottery.LotteryAction - Number: 50 was tried.
    13:09:40 [btpool0-7]       INFO  c.q.l.d.prime.NumberCruncherImpl - Beginning to factor.
    13:09:40 [btpool0-7]       DEBUG c.q.l.d.prime.NumberCruncherImpl - Trying 2 as a factor.
    13:09:40 [btpool0-7]       INFO  c.q.l.d.prime.NumberCruncherImpl - Found factor 2
        </p>
    
        
        <p>The latter form is more comfortable to read.</p>
        
        <p>If you need to treat the parenthesis character as a literal, it
        needs to be escaped by preceding each parenthesis with a
        backslash. As in, <b>\(</b>%d{HH:mm:ss.SSS}
        [%thread]<b>\)</b>. 
        </p>
    
        <h2 class="doAnchor" name="coloring">Coloring</h2>
    
        <p>Grouping by <a href="#Parentheses">parentheses</a> as explained
        above allows coloring of sub-patterns. As of version 1.0.5,
        <code>PatternLayout</code> recognizes "%black", "%red",
        "%green","%yellow","%blue", "%magenta","%cyan", "%white", "%gray",
        "%boldRed","%boldGreen", "%boldYellow", "%boldBlue",
        "%boldMagenta""%boldCyan", "%boldWhite" and "%highlight" as
        conversion words. These conversion words are intended to contain a
        sub-pattern. Any sub-pattern enclosed by a coloring word will be
        output in the specified color.
        </p>
    
        <p>Below is a configuration file illustrating coloring. Note the
        %cyan conversion specifier enclosing "%logger{15}". This will
        output the logger name abreviated to 15 characters in cyan. The
        %highlight conversion specifier prints its sub-pattern in bold-red
        for events of level ERROR, in red for WARN, in BLUE for INFO, and
        in the default color for other levels.</p>
    
    		<em>
    			Example: Highlighting levels
    			(logback-examples/src/main/java/chapters/layouts/highlighted.xml)
    		</em>
    
        <span class="asGroovy" onclick="return asGroovy('highlighted');">View as .groovy</span>
    
    
    <pre id="highlighted" class="prettyprint">&lt;configuration debug="true">
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        &lt;!-- On Windows machines setting withJansi to true enables ANSI
             color code interpretation by the Jansi library. This requires
             org.fusesource.jansi:jansi:1.8 on the class path.  Note that
             Unix-based operating systems such as Linux and Mac OS X
             support ANSI color codes by default. --&gt;
        <b>&lt;withJansi>true&lt;/withJansi></b>
        &lt;encoder>
          &lt;pattern>[%thread] <b>%highlight(%-5level)</b> <b>%cyan(%logger{15})</b> - %msg %n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
      &lt;root level="DEBUG">
        &lt;appender-ref ref="STDOUT" />
      &lt;/root>
    &lt;/configuration></pre>
    
         <p>Here is the corresponding output:</p>
    
    <pre class="source">[main] <span style="color:#611">WARN</span>  <span style="color:#2bd">c.l.TrivialMain</span> - a warning message 0
    [main] DEBUG <span style="color:#2bd">c.l.TrivialMain</span> - hello world number1
    [main] DEBUG <span style="color:#2bd">c.l.TrivialMain</span> - hello world number2
    [main] <span style="color:#00F">INFO</span>  <span style="color:#2bd">c.l.TrivialMain</span> - hello world number3
    [main] DEBUG <span style="color:#2bd">c.l.TrivialMain</span> - hello world number4
    [main] <span style="color:#611">WARN</span>  <span style="color:#2bd">c.l.TrivialMain</span> - a warning message 5
    [main] <span style="color:#F00">ERROR</span> <span style="color:#2bd">c.l.TrivialMain</span> - Finish off with fireworks</pre>
    
        <p>It takes very few lines of code to create a coloring conversion
        word. The section entitled <a
        href="#customConversionSpecifier">creating a custom conversion
        specifier</a> discusses the steps necessary for registering a
        conversion word in your configuration file.</p>
       
    		<h2 class="doAnchor" name="Evaluators">Evaluators</h2>
    
    		<p>As mentioned above, option lists come in handy when a
    		conversion specifier is required to behave dynamically based on
    		one or more
    		<a href="../xref/ch/qos/logback/core/boolex/EventEvaluator.html">
    		<code>EventEvaluator</code></a> objects.
    		<code>EventEvaluator</code> objects have the responsibility to
    		determine whether a given logging event matches the criteria of the
    		evaluator.
    		</p>
    		
        <p>Let us review an example involving a
        <code>EventEvaluator</code>.  The next configuration file outputs
        the logging events to the console, displaying date, thread, level,
        message and caller data. Given that extracting the caller data of
        a logging event is on the expensive side, we will do so only when
        the logging request originates from a specific logger, and when
        the message contains a certain string. Thus, we make sure that only
        specific logging requests will have their caller information
        generated and displayed. In other cases, where the caller data is
        superfluous, we will not penalize application performance.
    		</p>
    
        <p>Evaluators and in particular <em>evaluation expressions</em>
        are presented in a <a
        href="filters.html#evalutatorFilter">dedicated section of the
        chapter on filters</a> which you MUST read if you want to use
        evaluators in any meaningful way. Also note that the examples below
        are implicitly based on <code>JaninoEventEvaluator</code> which
        requires the <a
        href="http://docs.codehaus.org/display/JANINO/Home">Janino
        library</a>. Please see the <a
        href="../setup.html#janino">corresponding section</a> of the setup
        document.</p>
    
    		<em>
    			Example: Sample usage of EventEvaluators
    			(logback-examples/src/main/java/chapters/layouts/callerEvaluatorConfig.xml)
    		</em>
    
        <span class="asGroovy" onclick="return asGroovy('callerEvaluatorConfig');">View as .groovy</span>
    
    
    		<pre id="callerEvaluatorConfig" class="prettyprint source">&lt;configuration>
      <b>&lt;evaluator name="DISP_CALLER_EVAL">
        &lt;expression>logger.contains("chapters.layouts") &amp;amp;&amp;amp; \
          message.contains("who calls thee")&lt;/expression>
      &lt;/evaluator></b>
    
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
        &lt;encoder>
          &lt;pattern>
            %-4relative [%thread] %-5level - %msg%n<b>%caller{2, DISP_CALLER_EVAL}</b>
          &lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;root level="DEBUG"> 
        &lt;appender-ref ref="STDOUT" /> 
      &lt;/root>
    &lt;/configuration></pre>
    
    		<p>The above evaluation expression matches events which emanate
    		from a logger with a name containing the string "chapters.layouts"
    		and the message contains the string "who calls thee". Due to XML
    		encoding rules, the &amp; character cannot be written as is, and
    		needs to be escaped as &amp;amp;.</p>
    
        <p>The following class makes use of some of the characteristics
        mentioned in above configuration file.</p>
    		
        <p><em>
    			Example: Sample usage of EventEvaluators
    			<a href="../xref/chapters/layouts/CallerEvaluatorExample.html">
    			(logback-examples/src/main/java/chapters/layouts/CallerEvaluatorExample.java)</a>
    		</em>
        </p>
    		<pre class="prettyprint source">package <b>chapters.layouts</b>;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.util.StatusPrinter;
    
    public class CallerEvaluatorExample {
    
      public static void main(String[] args)  {
        Logger logger = LoggerFactory.getLogger(CallerEvaluatorExample.class);
        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
    
        try {
          JoranConfigurator configurator = new JoranConfigurator();
          configurator.setContext(lc);
          configurator.doConfigure(args[0]);
        } catch (JoranException je) {
          // StatusPrinter will handle this
        }
        StatusPrinter.printInCaseOfErrorsOrWarnings(lc);
    
        for (int i = 0; i &lt; 5; i++) {
          if (i == 3) {
            logger.debug(<b>"who calls thee</b>?");
          } else {
            logger.debug("I know me " + i);
          }
        }
      }
    }</pre>
    
    		<p>The above application does nothing particularly fancy. Five
    		logging requests are issued, the third one emitting the message
    		"who calls thee?"
    		</p>
    
    		<p>The command</p>
    
        <p class="source">java chapters.layouts.CallerEvaluatorExample src/main/java/chapters/layouts/callerEvaluatorConfig.xml</p>
    
        <p>will yield</p>
    
    		<div class="source"><pre>0    [main] DEBUG - I know me 0 
    0    [main] DEBUG - I know me 1 
    0    [main] DEBUG - I know me 2 
    0    [main] DEBUG - who calls thee? 
    Caller+0   at chapters.layouts.CallerEvaluatorExample.main(CallerEvaluatorExample.java:28)
    0    [main] DEBUG - I know me 4</pre></div>
    
    
    		<p>When a logging request is issued, the corresponding logging
    		event is evaluated. Only the third logging event matches the
    		evaluation criteria, causing its caller data to be displayed. For
    		other logging events, the evaluation criteria do not match and no
    		caller data is printed.
    		</p>
    
    
    		<p>One can change the expression to correspond a real world
    		scenario. For instance, one could combine the logger name and
    		request level. Thus, logging requests of level <em>WARN</em> and
    		up, originating from a sensitive part of an application, e.g. a
    		financial transaction module, would have their caller data
    		displayed.
    		</p>
    
    		<p><b>Important:</b> With the <em>caller</em> conversion word,
    		caller data is output when <em>the expression evaluates to
    		<b>true</b>.</em></p>
    
    		<p>Let us consider at a different situation. When exceptions are
    		included in a logging request, their stack trace is also
    		output. However, one might want to suppress the stack trace for
    		some specific exceptions.
    		</p>
    
    		<p>The Java code shown below creates three log requests, each with
    		an exception. The second exception is different from the others:
    		it contains the string "do not display this" and it is of type
    		<code>chapters.layouts.TestException</code>. As its message
    		commands, let us now prevent the second exception from being
    		printed.</p>
    
       <p><em>
    			Example: Sample usage of EventEvaluators
    			<a href="../xref/chapters/layouts/ExceptionEvaluatorExample.html">
    			(logback-examples/src/main/java/chapters/layouts/ExceptionEvaluatorExample.java)</a>
    		</em>
        </p>
    <pre class="prettyprint source">package chapters.layouts;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.util.StatusPrinter;
    
    public class ExceptionEvaluatorExample {
    
      public static void main(String[] args) {
        Logger logger = LoggerFactory.getLogger(ExceptionEvaluatorExample.class);
        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
    
        try {
          JoranConfigurator configurator = new JoranConfigurator();
          configurator.setContext(lc);
          lc.reset();
          configurator.doConfigure(args[0]);
        } catch (JoranException je) {
           // StatusPrinter will handle this
        }
        StatusPrinter.printInCaseOfErrorsOrWarnings(lc);
    
        for (int i = 0; i &lt; 3; i++) {
          if (i == 1) {
            logger.debug("logging statement " + i, new TestException(
                "do not display this"));
          } else {
            logger.debug("logging statement " + i, new Exception("display"));
          }
        }
      }
    }</pre>
    		
    		<p>In the next configuration file, the evaluation expression
    		matches events containing a throwable of type
    		<code>chapters.layouts.TextException</code>, precisely the type of
    		exceptions we wish to suppress.
        </p>
    
    		<em>
    			Example: Sample usage of EventEvaluators
    			(logback-examples/src/main/java/chapters/layouts/exceptionEvaluatorConfig.xml)
    		</em>
    		<pre class="prettyprint source">&lt;configuration>
    
      <b>&lt;evaluator name="DISPLAY_EX_EVAL">
        &lt;expression>throwable != null &amp;amp;&amp;amp; throwable instanceof  \
          chapters.layouts.TestException&lt;/expression>
      &lt;/evaluator></b>
    	
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        &lt;encoder>
          &lt;pattern>%msg%n<b>%ex{full, DISPLAY_EX_EVAL}</b>&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;root level="debug">
        &lt;appender-ref ref="STDOUT" />
      &lt;/root>
    &lt;/configuration></pre>
    
    		<p>With this configuration, each time an instance of the
    		<em>chapters.layouts.TestException</em> is included within a logging
    		request, the stack trace will be suppressed.
    		</p>
    
        <p>Launching the command</p>
    
        <p class="source">java chapters.layouts.ExceptionEvaluatorExample src/main/java/chapters/layouts/exceptionEvaluatorConfig.xml</p>
    
        <p>will yield</p>
    
    <p class="source">logging statement 0
    java.lang.Exception: display
      at chapters.layouts.ExceptionEvaluatorExample.main(ExceptionEvaluatorExample.java:43) [logback-examples-0.9.19.jar:na]
    logging statement 1
    logging statement 2
    java.lang.Exception: display
      at chapters.layouts.ExceptionEvaluatorExample.main(ExceptionEvaluatorExample.java:43) [logback-examples-0.9.19.jar:na]</p>
    
    
        <p>Notice how the second log statement has no stack trace. We
        effectively suppressed the stack trace for the
        <code>TextException</code>. The text between square brackets at
        the end of each stack trace line is <a
        href="#xThrowable">packaging information</a> discussed
        earlier.</p>
    
    		<p><span class="label notice">Note</span> With the <b><em>%ex</em></b> conversion
    		specifier, the stack trace is displayed when <em>the expression
    		evaluates to <b>false</b>.</em></p>
    
    
        
    		<h2 class="doAnchor" name="customConversionSpecifier">Creating a
    		custom conversion specifier</h2>
    
    		<p>Up to this point we have presented the built-in conversion
    		words in <code>PatternLayout</code>. But it is also possible to
    		add conversion words of your own making.</p>
    		
    		<p>Building a custom conversion specifier consists of two steps.
        </p>
    		
        <h4>Step 1</h4>
    
    		<p>First, you must extend the <code>ClassicConverter</code>
    		class. <a
    		href="../xref/ch/qos/logback/classic/pattern/ClassicConverter.html">
    		<code>ClassicConverter</code></a> objects are responsible for
    		extracting information out of <code>ILoggingEvent</code> instances
    		and producing a String. For example,
    		<a href="../xref/ch/qos/logback/classic/pattern/LoggerConverter.html">
    		<code>LoggerConverter</code></a>, the converter underlying the
    		%logger conversion word, extracts the name of the logger from 
    		<code>ILoggingEvent</code> and returns it as a String. It might
    		abbreviate the logger name in the process.</p>
    		
    		<p>Here is a customer converter which returns the time elapsed
    		since its creaton in nanoseconds:</p>
    		
    <em> Example: Sample Converter Example 
    <a href="../xref/chapters/layouts/MySampleConverter.html">
    (src/main/java/chapters/layouts/MySampleConverter.java)</a></em>
    <pre class="prettyprint source">public class MySampleConverter extends ClassicConverter {
    
      long start = System.nanoTime();
    
      <b>@Override</b>
      <b>public String convert(ILoggingEvent event) {</b>
        <b>long nowInNanos = System.nanoTime();</b>
        <b>return Long.toString(nowInNanos-start);</b>
      <b>}</b>
    }</pre>
    
    		<p>This implementation is pretty straightforward. The
    		<code>MySampleConverter</code> class extends
    		<code>ClassicConverter</code>, and implements the
    		<code>convert</code> method which returns the number of
    		nano-seconds elapsed since its creation.
    		</p>
    
        <h4>Step 2</h4>
    
    		<p>In the second step, we must let logback know about the new
    		<code>Converter</code>. For this purpose, we need to declare the
    		new conversion word in the configuration file, as shown below:</p>
    		
    <em> Example: Sample Converter Example (src/main/java/chapters/layouts/mySampleConverterConfig.xml)</em>
     <span class="asGroovy" onclick="return asGroovy('mySampleConverterConfig');">View as .groovy</span>
    <pre id="mySampleConverterConfig" class="prettyprint source">&lt;configuration>
    
      <b>&lt;conversionRule conversionWord="nanos" 
                      converterClass="chapters.layouts.MySampleConverter" /></b>
    	
      &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        &lt;encoder>
          &lt;pattern><b>%-6nanos</b> [%thread] - %msg%n&lt;/pattern>
        &lt;/encoder>
      &lt;/appender>
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="STDOUT" />
      &lt;/root>
    &lt;/configuration></pre>
    
    		<p>Once the new conversion word has been declared in the
    		configuration file, we can refer to it within
    		<code>PatternLayout</code> pattern, as with any other
    		conversion word.</p>
    		
        <p>The command:</p>
    
        <div class="source">java chapters.layouts.SampleLogging src/main/java/chapters/layouts/mySampleConverterConfig.xml </div>
    
        <p>should yield output akin to:</p>
        
        <pre class="source">4868695 [main] DEBUG - Everything's going well
    5758748 [main] ERROR - maybe not quite...</pre>
    
    
    		<p>The reader might want to take a look at other
    		<code>Converter</code> implementations such as
    		<a href="../xref/ch/qos/logback/classic/pattern/MDCConverter.html">
    		<code>MDCConverter</code></a> to learn about more complex
    		behaviours, such as option handling. For creating your own
    		coloring schemes have a look at <a
    		href="../xref/ch/qos/logback/classic/pattern/color/HighlightingCompositeConverter.html"><code>HighlightingCompositeConverter</code></a>.
    		</p>
    
       	
    
        <h2 class="doAnchor" name="ClassicHTMLLayout">HTMLLayout</h2>
    	
    	  <p><a
    	  href="../xref/ch/qos/logback/classic/html/HTMLLayout.html"><code>HTMLLayout</code></a>
    	  (as included in logback-classic) generates logs in HTML
    	  format. <code>HTMLLayout</code> outputs logging events in an HTML
    	  table where each row of the table corresponds to a logging
    	  event.</p>
    		
    		<p>Here is a sample output produced by <code>HTMLLayout</code>
    		using its default CSS stylesheet:</p>
    		<img src="images/chapters/layouts/htmlLayout0.gif" alt="HTML Layout Sample Image"/>
    		
    		<p>The content of table columns are specified with the help of a
    		conversion pattern. See <a
    		href="#ClassicPatternLayout"><code>PatternLayout</code></a> for
    		documentation on conversion patterns. As such, you have full
    		control over the contents and format of the table. You can select
    		and display any combination of converters
    		<code>PatternLayout</code> knows about.
    		</p>
    
    		<p>One notable exception about the use of
    		<code>PatternLayout</code> with <code>HTMLLayout</code> is that
    		conversion specifiers should not be separated by space characters
    		or more generally by literal text. Each specifier found in the
    		pattern will result in a separate column.  Likewise a separate
    		column will be generated for each block of literal text found in
    		the pattern, potentially wasting valuable real-estate on your
    		screen.</p>
         
        <p>Here is simple but functional configuration file illustrating
        the use of <code>HTMLLayout</code>.
        </p>
    
    <em> Example: HTMLLayout Example (src/main/java/chapters/layouts/htmlLayoutConfig1.xml)</em>
    <span class="asGroovy" onclick="return asGroovy('htmlLayoutConfig1');">View as .groovy</span>
    <pre id="htmlLayoutConfig1" class="prettyprint source">&lt;configuration debug="true"&gt;
      &lt;appender name="FILE" class="ch.qos.logback.core.FileAppender"&gt;
        &lt;encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
          &lt;layout class="ch.qos.logback.classic.html.HTMLLayout">
            <b>&lt;pattern&gt;%relative%thread%mdc%level%logger%msg&lt;/pattern&gt;</b>
          &lt;/layout&gt;
        &lt;/encoder>
        &lt;file>test.html&lt;/file&gt;
      &lt;/appender&gt;
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="FILE" />
      &lt;/root>
    &lt;/configuration>
    </pre>
    
       <p>The <a
       href="../xref/chapters/layouts/TrivialMain.html">TrivialMain</a>
       application logs a few messages finishing with an exception. The
       command:</p>
    
       <p class="source">java chapters.layouts.TrivialMain src/main/java/chapters/layouts/htmlLayoutConfig1.xml</p>
    
        <p>will create the file <em>test.html</em> in the current
        folder. The contents of <em>test.html</em> should be similar to:
    		</p>
    		<img src="images/chapters/layouts/htmlLayout1.png" alt="HTML Layout Sample Image"/>
    
        <h3>Stack traces</h3>
    
    		<p> If you use the <em>%em</em> conversion word to display stack
    		traces, a table column will be created to display stack traces. In
    		most cases the column will be empty, wasting screen
    		real-estate. Moreover, printing a stack trace on a separate column
    		does not yield very readable results. Fortunately, the
    		<em>%ex</em> conversion word is not the only way to display stack
    		traces.
    		</p>
    
    		<p>A better solution is available through implementations of
    		<code>IThrowableRenderer</code> interface.  Such an implementation
    		can be assigned to <code>HTMLLayout</code> to manage the display
    		data related to exceptions. By default, a
    		<a href="../xref/ch/qos/logback/classic/html/DefaultThrowableRenderer.html">
    			<code>DefaultThrowableRenderer</code></a> is assigned to each
    			<code>HTMLLayout</code> instance. It writes exceptions on a
    			<em>new table row</em>, along with its stack trace, in an easily
    			readable manner, as shown on the figure above.
    		</p>
    
    		<p>If for some reason, you still wish to use the <em>%ex</em>
    		pattern, then you can specify <a
    		href="../xref/ch/qos/logback/core/html/NOPThrowableRenderer.html">
    		<code>NOPThrowableRenderer</code></a> in the configuration file in
    		order to disable displaying a separate row for the stack trace. We
    		don't have the faintest idea why you would want to do that, but if
    		you wished, you could.
    		</p>
    
        <h3>CSS</h3>
    
        <p>The presentation of the HTML created by <code>HTMLLayout</code>
        is controlled through a Cascading Style Sheet (CSS). In the
        absence of specific instructions, <code>HTMLLayout</code> will
        default to its internal CSS. However, you can instruct
        <code>HTMLLayout</code> to use an external CSS file. For this
        purpose a <code>cssBuilder</code> element can be nested within a
        <code>&lt;layout&gt;</code> element, as shown below.
    		</p>
    
    <pre class="prettyprint source">&lt;layout class="ch.qos.logback.classic.html.HTMLLayout">
      &lt;pattern>%relative...%msg&lt;/pattern>
      &lt;cssBuilder class="ch.qos.logback.classic.html.UrlCssBuilder">
        &lt;!-- url where the css file is located --&gt;
        &lt;url>http://...&lt;/url>
      &lt;/cssBuilder>	
    &lt;/layout></pre>
    
    	
    		<p>The <code>HTMLLayout</code> is often used in conjunction with
    		<code>SMTPAppender</code> so that outgoing email is pleasantly
    		formatted in HTML.
    		</p>
    
    
        <h2 class="doAnchor" name="log4jXMLLayout">Log4j XMLLayout</h2>
    
        <p><a
        href="../xref/ch/qos/logback/classic/log4j/XMLLayout.html">XMLLayout</a>
        (part of logback-classic) generates output in a log4j.dtd
        compliant format to interoperate with tools such as <a
        href="http://logging.apache.org/chainsaw/index.html">Chainsaw</a>
        and <a href="http://vigilog.sourceforge.net/">Vigilog</a> capable
        of processing files generated by <a
        href="http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/XMLLayout.html">log4j's
        XMLLayout</a>.
        </p>
    
    
        <p>As the original XMLLayout in log4j version 1.2.15, XMLLayout in
        logback-classic takes two boolean properties, <span
        class="option">locationInfo</span> and <span
        class="option">properties</span>. Setting <span
        class="option">locationInfo</span> to true enables the inclusion
        of location info (caller data) in the each event. Setting <span
        class="option">properties</span> to true enables the inclusion of
        MDC information. Both options are set to false by default.
        </p>
    
        <p>Here is a sample configuration</p>
    
    <em> Example: Log4jXMLLayout Example (src/main/java/chapters/layouts/log4jXMLLayout.xml)</em>
    <span class="asGroovy" onclick="return asGroovy('log4jXMLLayout');">View as .groovy</span>
        <pre id="log4jXMLLayout" class="prettyprint source">&lt;configuration>
      &lt;appender name="FILE" class="ch.qos.logback.core.FileAppender">
        &lt;file>test.xml&lt;/file>
        &lt;encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
          &lt;layout class="ch.qos.logback.classic.log4j.XMLLayout">
            &lt;locationInfo>true&lt;/locationInfo>
          &lt;/layout>
        &lt;/encoder> 
      &lt;/appender> 
    
      &lt;root level="DEBUG">
        &lt;appender-ref ref="FILE" />
      &lt;/root>
    &lt;/configuration> </pre>
        
    		<h1 class="doAnchor" name="logback-access">Logback access</a></h1>
    
    		<p>Most logback-access layouts are mere adaptations of
    		logback-classic layouts. Logback-classic and logback-access
    		modules address different needs, but in general offer comparable
    		functionality.</p>
    		
    		<h2>Writing your own Layout</h2>
    
    		<p>Writing a custom <code>Layout</code> for logback access is
    		nearly identical to its sibling <code>Layout</code> in
    		logback-classic.</p>
    		
    
    		<h3 class="doAnchor" name="AccessPatternLayout">PatternLayout</h3>
    
    		<p><a href="../xref/ch/qos/logback/access/PatternLayout.html">
    		<code>PatternLayout</code></a> in logback-access can be configured
    		in much the same way as its classic counterpart. However it
    		features additional conversion specifiers suited for logging
    		particular bits of information available only in HTTP servlet
    		requests and HTTP servlet responses.
        </p>
    
    		<p>Below is a list of conversion specifiers for 
    		<code>PatternLayout</code> in logback-access.</p>
    		
    		<table  class="bodyTable striped" border="0" cellpadding="8">
          <tr>
            <th align="center">Conversion Word</th>
            <th align="center">Effect</th>
          </tr>
          <tr>
            <td class="word" name="remoteIP">
              <b>a / remoteIP</b>
            </td>
            <td>
              <p>Remote IP address.</p>
            </td>
          </tr>
          <tr>
            <td class="word" name="localIP"><b>A / localIP</b></td>
            <td>
              <p>Local IP address.</p>
            </td>
          </tr>		
          <tr>
            <td class="word" name="bytesSent"><b>b / B / bytesSent</b></td>
            <td>
              <p>
                Response's content length.
              </p>
            </td>
          </tr>				
          <tr>
            <td class="word" name="clientHost"><b>h / clientHost</b></td>
            <td>
              <p>
                Remote host.
              </p>
            </td>
          </tr>
          <tr>
            <td class="word" name="protocol"><b>H / protocol</b></td>
            <td>
              <p>Request protocol.</p>
            </td>
          </tr>
          <tr>
            <td class="word" name="remoteLogName"><b>l</b></td>
            <td>
              <p>
                Remote log name. In logback-access, this converter always
                returns the value "-".
              </p>
            </td>
          </tr>
          
          <tr>
            <td class="word" name="reqParameter"><b>reqParameter{paramName}</b></td>
            <td>
              <p>Parameter of the response.</p>
              <p>This conversion word takes the first option in braces and looks
              for the corresponding parameter in the request.</p>
              <p><b>%reqParameter{input_data}</b> 
              displays the corresponding parameter.</p>
            </td>
          </tr>		
          <tr>
            <td class="word" name="header"><b>i{header} / header{header}</b></td>
            <td>
              <p>Request header.</p>
              <p>This conversion word takes the first option in braces and looks
              for the corresponding header in the request.</p>
              <p><b>%header{Referer}</b> displays the referer of the request.</p>
              <p>
                If no option is specified, it displays every available header.
              </p>
            </td>
          </tr>	
          <tr >
            <td class="word" name="requestMethod"><b>m / requestMethod</b></td>
            <td>
              <p>Request method.</p>
            </td>
          </tr>		
          <tr>
            <td class="word" name="requestURL"><b>r / requestURL</b></td>
            <td>
              <p>
                URL requested.
              </p>
            </td>
          </tr>
          <tr>
            <td class="word" name="statusCode"><b>s / statusCode</b></td>
            <td>
              <p>
                Status code of the request.
              </p>
            </td>
          </tr>		
          <tr>
            <td class="word" name="dateAccess"><b>t / date</b></td>
            <td>
              <p>Outputs the date of the logging event.  The date
              conversion specifier may be followed by a set of braces
              containing a date and time pattern strings used by
              <code>java.text.SimpleDateFormat</code>.  <em>ABSOLUTE</em>,
              <em>DATE</em> or <em>ISO8601</em> are also valid values.
    					</p>
    					<p>For example, <b>%d{HH:mm:ss,SSS}</b>,
    					<b>%d{dd&#160;MMM&#160;yyyy&#160;;HH:mm:ss,SSS}</b> or
    					<b>%d{DATE}</b>.  If no date format specifier is given then
    					ISO8601 format is assumed.
    					</p>
            </td>
          </tr>
          <tr>
            <td class="word" name="httpUser"><b>u / user</b></td>
            <td>
              <p>
                Remote user.
              </p>
            </td>
          </tr>		
          <tr>
            <td class="word" name="requestURI"><b>U / requestURI</b></td>
            <td>
              <p>
                Requested URI.
              </p>
            </td>
          </tr>		
          <tr >
            <td class="word" name="server"><b>v / server</b></td>
            <td>
              <p>Server name.</p>
            </td>
          </tr>
          <tr class="b">
            <td class="word" name="localPort"><b>localPort</b></td>
            <td>
              <p>Local port.</p>
            </td>
          </tr>
          <tr class="a">
            <td class="word" name="reqAttribute"><b>reqAttribute{attributeName}</b></td>
            <td>
              <p>Attribute of the request.</p>
              <p>This conversion word takes the first option in braces and looks
              for the corresponding attribute in the request.</p>
              <p><b>%reqAttribute{SOME_ATTRIBUTE}</b> 
              displays the corresponding attribute.</p>
            </td>
          </tr>
          <tr class="b">
            <td class="word" name="reqCookie"><b>reqCookie{cookie}</b></td>
            <td>
              <p>Request cookie.</p>
              <p>This conversion word takes the first option in braces and looks
              for the corresponding cookie in the request.</p>
              <p><b>%cookie{COOKIE_NAME}</b> displays corresponding cookie.</p>
            </td>
          </tr>
          <tr class="a">
            <td class="word" name="responseHeader"><b>responseHeader{header}</b></td>
            <td>
              <p>
                Header of the response.
              </p>
              <p>This conversion word takes the first option in braces and looks
              for the corresponding header in the response.</p>
              <p><b>%header{Referer}</b> displays the referer of the response.</p>
            </td>
          </tr>
          <tr class="b">
            <td class="word" name="requestContent"><b>requestContent</b></td>
            <td>
              <p>This conversion word displays the content of the request,
              that is the request's <code>InputStream</code>. It is used
              in conjunction with a <a
              href="../xref/ch/qos/logback/access/servlet/TeeFilter.html">
              <code>TeeFilter</code></a>, a
              <code>javax.servlet.Filter</code> that replaces the original
              <code>HttpServletRequest</code> by a <a
              href="../xref/ch/qos/logback/access/servlet/TeeHttpServletRequest.html">
              <code>TeeHttpServletRequest</code></a>. The latter object
              allows access to the request's <code>InputStream</code>
              multiple times without any loss of data.
              </p>
            </td>
          </tr>
          <tr class="a">
            <td class="word" name="fullRequest"><b>fullRequest</b></td>
            <td>
              <p>This converter outputs the data associated with the
              request, including all headers and request contents.
              </p>
            </td>
          </tr>
          <tr class="b">
            <td class="word" name="responseContent"><b>responseContent</b></td>
            <td>
              <p>This conversion word displays the content of the
              response, that is the response's
              <code>InputStream</code>. It is used in conjunction with a
              <a href="../xref/ch/qos/logback/access/servlet/TeeFilter.html">
              <code>TeeFilter</code></a>, a
              <code>javax.servlet.Filter</code> that replaces the original
              <code>HttpServletResponse</code> by a <a
              href="../xref/ch/qos/logback/access/servlet/TeeHttpServletResponse.html">
              <code>TeeHttpServletResponse</code></a>. The latter object
              allows access to the request's <code>InputStream</code>
              multiple times without any loss of data.
              </p>
            </td>
          </tr>
          <tr class="a">
            <td class="word" name="fullResponse"><b>fullResponse</b></td>
            <td>
              <p>This conversion word takes all the available data
              associated with the response, including all headers of the
              response and response contents.
              </p>
            </td>
          </tr>
        </table>
    		
    		<p>Logback access' <code>PatternLayout</code> also recognizes three keywords, which
    		act like shortcuts.</p>
    
        <table  class="bodyTable">
          <tr>
            <th>keyword</th>
            <th>equivalent conversion pattern</th>
          </tr>
          <tr class="a">
            <td><em>common</em> or <em>CLF</em></td>
            <td><em>%h %l %u [%t] "%r" %s %b</em></td>
          </tr>
          <tr class="b">
            <td><em>combined</em></td>
            <td><em>%h %l %u [%t] "%r" %s %b "%i{Referer}" "%i{User-Agent}"</em></td>
          </tr>
    
        </table>
    
     	
    	 	<p>The <em>common</em> keyword corresponds to the pattern <em>'%h %l %u [%t] "%r" %s %b'</em>
    	 	which displays client host, remote log name, user, date, requested URL, status code 
    	 	and response's content length</p>
    	 	
    	 	<p>The <em>combined</em> keyword is a shortcut for <em>'%h %l %u [%t]
    	 	"%r" %s %b "%i{Referer}" "%i{User-Agent}"'</em>. This pattern
    	 	begins much like the <em>common</em> pattern but also displays two
    	 	request headers, namely referer, and user-agent.</p>
    
    		<h3 class="doAnchor" name="AccessHTMLLayout">HTMLLayout</h3>
    		
    		<p>The <a
    		href="../xref/ch/qos/logback/access/html/HTMLLayout.html"><code>HTMLLayout</code></a>
    		class found in logback-access is similar to the <a
    		href="#ClassicHTMLLayout"><code>HTMLLayout</code></a> class from
    		logback-classic.
        </p>
    		
    		<p>By default, it will create a table containing the following data:</p>
    		
    		<ul>
    			<li>Remote IP</li>
    			<li>Date</li>
    			<li>Request URL</li>
    			<li>Status code</li>
    			<li>Content Length</li>
    		</ul>
    		
    		<p>Here is a sample output produced by <code>HTMLLayout</code> in
    		logback-access:</p>
    		<img src="images/chapters/layouts/htmlLayoutAccess.gif" alt="Access HTML Layout Sample Image"/>
    
    		<p>What can be better than a real world example? Our own log4j
    		properties for logback <a
    		href="http://logback.qos.ch/translator/">translator</a> makes use
    		of logback-access to demonstrate live output from
    		<code>RollingFileAppender</code> with <code>HTMLLayout</code>.</p>
    
    
        <p>On every new user request to our <a
        href="http://logback.qos.ch/translator/">translator</a>
        web-application, a new entry will be added to the access logs,
        which you can view by <a
        href="http://logback.qos.ch/translator/logs/access.html">following
        this link</a>.</p>
    
    
        <script src="../templates/footer.js" type="text/javascript"></script>
    </div>
    </body>
    </html>
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/manual/encoders.html������������������������������������������������������������0000644�0001750�0001750�00000025353�12143164240�020056� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Chapter 5: Encoders</title>
        <link rel="stylesheet" type="text/css" href="../css/common.css" />
        <link rel="stylesheet" type="text/css" href="../css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="../css/_print.css" media="print" />
        <link rel="stylesheet" type="text/css" href="../css/prettify.css" media="screen" />
      </head>
      <body onload="prettyPrint(); decorate();">
        <script type="text/javascript">prefix='../';</script>
        <script type="text/javascript" src="../js/prettify.js"></script>
        <script type="text/javascript" src="../templates/header.js" ></script>
        <script type="text/javascript" src="../js/jquery-min.js"></script>
        <script type="text/javascript" src="../js/decorator.js"></script>
        <div id="left">      
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="../templates/left.js" type="text/javascript"></script>
        </div>    
        <div id="right">
          <script src="menu.js" type="text/javascript"></script>
        </div>
    
        <div id="content">
    
        <h1>Chapter 5: Encoders</h1>
    
        <div class="quote">
          <p><b>ACTION THIS DAY</b> Make sure they have all they want on
          extreme priority and report to me that this has been done.
          </p>
          <p>&mdash;CHURCHILL on October 1941 to General Hastings Ismay in
          response to a request for more resources signed by Alan Turing
          and his cryptanalyst colleagues at Bletchley Park</p>
        </div>
    
        <script src="../templates/creative.js" type="text/javascript"></script>
        <script src="../templates/setup.js" type="text/javascript"></script>
    
    
        <h2 class="doAnchor">What is an encoder</h2>
    
        <p>Encoders are responsible for transforming an event into a byte
        array as well as writing out that byte array into an
        <code>OutputStream</code>. Encoders were introduced in logback
        version 0.9.19. In previous versions, most appenders relied on a
        layout to transform an event into a string and write it out using
        a <code>java.io.Writer</code>. In previous versions of logback,
        users would nest a <code>PatternLayout</code> within
        <code>FileAppender</code>. Since logback 0.9.19,
        <code>FileAppender</code> and sub-classes <a
        href="../codes.html#layoutInsteadOfEncoder">expect an encoder and no
        longer take a layout</a>.
        </p>
    
        <p>Why the breaking change?</p>
    
        <p>Layouts, as discussed in detail in the next chapter, are only
        able to transform an event into a String. Moreover, given that a
        layout has no control over when events get written out, layouts
        cannot aggregate events into batches. Contrast this with encoders
        which not only have total control over the format of the bytes
        written out, but also control when (and if) those bytes get written
        out.
        </p>
    
        <p>At the present time, <code>PatternLayoutEncoder</code> is the
        only really useful encoder. It merely wraps a
        <code>PatternLayout</code> which does most of the work. Thus, it
        may seem that encoders do not bring much to the table except
        needless complexity. However, we hope that with the advent of new
        and powerful encoders this impression will change.</p>
    
        <h2 class="doAnchor" name="interface">Encoder interface</h2>
    
        <p>Encoders are responsible for transforming an incoming event
        into a byte array <b>and</b> writing out the resulting byte array
        onto the appropriate <code>OutputStream</code>.  Thus, encoders
        have total control of what and when bytes gets written to the
        <code>OutputStream</code> maintained by the owning appender. Here
        is the <a
        href="../xref/ch/qos/logback/core/encoder/Encoder.html">Encoder
        interface:</a>
       
        </p>
        <pre class="prettyprint source">package ch.qos.logback.core.encoder;
    
    public interface Encoder&lt;E> extends ContextAware, LifeCycle {
    
       /**
       * This method is called when the owning appender starts or whenever output
       * needs to be directed to a new OutputStream, for instance as a result of a
       * rollover.
       */
      void init(OutputStream os) throws IOException;
    
      /**
       * Encode and write an event to the appropriate {@link OutputStream}.
       * Implementations are free to defer writing out of the encoded event and
       * instead write in batches.
       */
      void doEncode(E event) throws IOException;
    
    
      /**
       * This method is called prior to the closing of the underling
       * {@link OutputStream}. Implementations MUST not close the underlying
       * {@link OutputStream} which is the responsibility of the owning appender.
       */
      void close() throws IOException;
    }</pre>
    
        <p>As you can see, the <code>Encoder</code> interface consists of
        few methods, but surprisingly many useful things can be
        accomplished with these methods.
        </p>
    
    
        <h2 class="doAnchor">LayoutWrappingEncoder</h2>
    
        <p>Until logback version 0.9.19, many appenders relied on the
        Layout instances to control the format of log output. As there
        exists substantial amount of code based on the layout interface,
        we needed a way for encoders to inter-operate with layouts. <a
        href="../xref/ch/qos/logback/core/encoder/LayoutWrappingEncoder.html">LayoutWrappingEncoder</a>
        bridges the gap between encoders and layouts. It implements the
        encoder interface and wraps a layout to which it delegates the
        work of transforming an event into string.
        </p>
    
        <p>Below is an excerpt from the <code>LayoutWrappingEncoder</code>
        class illustrating how delegation to the wrapped layout instance
        is done.</p>
    
     <pre class="prettyprint source">package ch.qos.logback.core.encoder;
    
    public class LayoutWrappingEncoder&lt;E> extends EncoderBase&lt;E> {
    
      protected Layout&lt;E> layout;
      private Charset charset;
      private boolean immediateFlush = true;
    
      public void doEncode(E event) throws IOException {
        String txt = layout.doLayout(event);
        outputStream.write(convertToBytes(txt));
        if (immediateFlush)
          outputStream.flush();
      }
    
      private byte[] convertToBytes(String s) {
        if (charset == null) {
          return s.getBytes();
        } else {
          return s.getBytes(charset);
        }
      } 
    }</pre>
    
        <p>The <code>doEncode</code>() method starts by having the wrapped
        layout convert the incoming event into string. The resulting text
        string is converted to bytes according to the charset encoding
        chosen by the user. Those bytes are then written to the
        <code>OutputStream</code> given by the owning appender. By
        default, the <code>OutputStream</code> is immediately flushed,
        unless the <span class="prop">immediateFlush</span> property is
        explicitly set to 'false'.  Setting the <span
        class="prop">immediateFlush</span> property to false can
        significantly improve logging throughput. See
        <code>PatternLayoutEncoder</code> below for sample configuration..
        </p>
        
    
        <h2 class="doAnchor">PatternLayoutEncoder</h2>
    
        <p>Given that <code>PatternLayout</code> is the most commonly used
        layout, logback caters for this common use-case with
        <code>PatternLayoutEncoder</code>, an extension of
        <code>LayoutWrappingEncoder</code> restricted to wrapping
        instances of <code>PatternLayout</code>.
        </p>
    
        <p>As of logback version 0.9.19, whenever a
        <code>FileAppender</code> or one of its sub-classes was configured
        with a <code>PatternLayout</code>, a
        <code>PatternLayoutEncoder</code> must be used instead. This is
        explained in the <a
        href="../codes.html#layoutInsteadOfEncoder">relevant entry in the
        logback error codes</a>.
        </p>
    
         <h4 class="doAnchor" name="immediateFlush"><span class="prop">immediateFlush</span> property</h4>
    
         <p>As a sub-class of <a
         href="../xref/ch/qos/logback/core/encoder/LayoutWrappingEncoder.html"><code>LayoutWrappingEncoder</code></a>,
         <code>PatternLayoutEncoder</code> admits the <span
         class="prop">immediateFlush</span> property. The default value
         for <span class="prop">immediateFlush</span> is 'true'. Immediate
         flushing of the output stream ensures that logging events are
         immediately written to disk and will not be lost in case your
         application exits without properly closing appenders. On the
         other hand, setting this property to 'false' is likely to
         quintuple (your mileage may vary) logging throughput. As
         mentioned previously, if <span class="prop">immediateFlush</span>
         is set to 'false' and if appenders are not closed properly when
         your application exits, then logging events not yet written to
         disk may be lost.
         </p>
    
         <p>Below is a sample configuration for a
         <code>FileAppender</code> containing a
         <code>PatternLayoutEncoder</code> with its <span
         class="prop">immediateFlush</span> property set to 'false'.</p>
    
    <pre class="prettyprint">&lt;appender name="FILE" class="ch.qos.logback.core.FileAppender"> 
      &lt;file>foo.log&lt;/file>
      &lt;encoder>
        &lt;pattern>%d %-5level [%thread] %logger{0}: %msg%n&lt;/pattern>
        &lt;!-- this quadruples logging throughput --&gt;
        <b>&lt;immediateFlush>false&lt;/immediateFlush></b>
      &lt;/encoder> 
    &lt;/appender></pre>
    
    
        <h4 class="doAnchor" name="outputPatternAsHeader">Output pattern
        string as header</h4>
    
        <p>In order to facilitate parsing of log files, logback can insert
        the pattern used for the log output at the top of log files.  This
        feature is <b>disabled</b> by default. It can be enabled by
        setting the <span class="prop">outputPatternAsHeader</span>
        property to 'true' for relevant
        <code>PatternLayoutEncoder</code>. Here is an example:</p>
    
    <pre class="prettyprint">&lt;appender name="FILE" class="ch.qos.logback.core.FileAppender"> 
      &lt;file>foo.log&lt;/file>
      &lt;encoder>
        &lt;pattern>%d %-5level [%thread] %logger{0}: %msg%n&lt;/pattern>
        <b>&lt;outputPatternAsHeader>true&lt;/outputPatternAsHeader></b>
      &lt;/encoder> 
    &lt;/appender></pre>
        
        <p>This will result output akin to the following in the log file:</p>
    
        <pre>#logback.classic pattern: %d [%thread] %-5level %logger{36} - %msg%n
    2012-04-26 14:54:38,461 [main] DEBUG com.foo.App - Hello world
    2012-04-26 14:54:38,461 [main] DEBUG com.foo.App - Hi again
    ...</pre>
    
         <p>The line starting with "#logback.classic pattern" is newly
         inserted pattern line.</p>
    
        
         
    
        <script src="../templates/footer.js" type="text/javascript"></script>
    
        </div>
      </body>
    </html>
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/manual/groovy.html��������������������������������������������������������������0000644�0001750�0001750�00000054355�12143164240�017605� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Chapter12: Groovy configuration</title>
        
        <link rel="stylesheet" type="text/css" href="../css/common.css" />
        <link rel="stylesheet" type="text/css" href="../css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="../css/_print.css" media="print" />
        <link rel="stylesheet" type="text/css" href="../css/prettify.css" media="screen" />
    
      </head>
      <body onload="prettyPrint(); decorate();">
    
        <script type="text/javascript">prefix='../'</script>
        <script type="text/javascript" src="../js/prettify.js"></script>
        <script type="text/javascript" src="../js/dsl.js"></script>
        <script type="text/javascript" src="../templates/header.js"></script>
        <script type="text/javascript" src="../js/jquery-min.js"></script>
        <script type="text/javascript" src="../js/decorator.js"></script>
    
        <div id="left">
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="../templates/left.js" type="text/javascript"></script>
        </div>
        <div id="right">
          <script src="menu.js" type="text/javascript"></script>
        </div>
        <div id="content" class="chapter">
          
        <h1>Chapter 12: Groovy Configuration</h1>
          
          <div class="quote">
          <p><em>It is better to be a human being dissatisfied than a pig
          satisfied; better to be a Socrates dissatisfied than a fool
          satisfied. And if the fool or the pig thinks otherwise, it is
          because they have no experience of the better part.
          </em>
          </p>
          <p>&mdash;JOHN STUART MILL, <em>Utilitarianism</em></p>
        </div>
        <script src="../templates/creative.js" type="text/javascript"></script>
    
    
        <p>Domain-specific languages or DSLs are rather pervasive. The
        XML-based logback configuration can be viewed as a DSL
        instance. By the very nature of XML, XML-based configuration files
        are quite verbose and rather bulky. Moreover, a relatively large
        body of code in logback, namely Joran, is dedicated to processing
        these XML-based configuration files. Joran supports nifty features
        such as variable substitution, conditional processing and
        on-the-fly extensibility. However, not only is Joran a complex
        beast, the user-experience it provides can be described as
        unsatisfactory or at the very least unintuitive.
        </p>
    
        <p>The Groovy-based DSL described in this chapter aims to be
        consistent, intuitive, and powerful. Everything you can do using XML in
        configuration files, you can do in Groovy with a much shorter
        syntax. To help you migrate to Groovy style configuration, we have
        developed a <a
        href="http://logback.qos.ch/translator/asGroovy.html">tool to
        automatically migrate your existing <em>logback.xml</em> files to
        <em>logback.groovy</em></a>.
        </p>
    
    
        <h2 class="doAnchor">General philosophy</h2>
        
        <p>As a general rule, <em>logback.groovy</em> files are Groovy
        programs. And since Groovy is a super-set of Java, whatever
        configuration actions you can perform in Java, you can do the same
        within a <em>logback.groovy</em> file. However, since configuring
        logback programmatically using Java syntax can be cumbersome, we
        added a few logback-specific extensions to make your life
        easier. We try hard to limit the number of logback-specific
        syntactic extensions to an absolute minimum. If you are already
        familiar with Groovy, you should be able to read, understand and
        even write your own <em>logback.groovy</em> files with great
        ease. Those unfamiliar with Groovy should still find
        <em>logback.groovy</em> syntax much more comfortable to use than
        <em>logback.xml</em>.
        </p>
    
        <p>Given that <em>logback.groovy</em> files are Groovy programs
        with minimal logback-specific extensions, <em>all</em> the usual
        groovy constructs such as class imports, variable definitions,
        evaluation of $&#123;..&#125; expressions contained in strings
        (GStrings), and if-else statements are available in
        <em>logback.groovy</em> files.</p>
    
        <h2 class="doAnchor">Automatic imports</h2>
    
        <p><span class="label">Since 1.0.10</span> In order to reduce
        unnecessary boilerplace several common types and packages are
        imported automatically.  Thus, as long as you are only configuring
        built-in appenders, layouts etc. you do not need to add the
        corresponding import statement into your script. You will need
        them for types not covered by the default imports, of course.</p>
    
        <p>Here is the list of default imports:</p>
    
        <ul>
          <li><span class="code">import ch.qos.logback.core.*;</span></li>
          <li><span class="code">import ch.qos.logback.core.encoder.*;</span></li>
          <li><span class="code">import ch.qos.logback.core.read.*;</span></li>
          <li><span class="code">import ch.qos.logback.core.rolling.*;</span></li>
          <li><span class="code">import ch.qos.logback.core.status.*;</span></li>
          <li><span class="code">import ch.qos.logback.classic.net.*;</span></li>
          <li><span class="code">import ch.qos.logback.classic.encoder.PatternLayoutEncoder;</span></li>
        </ul>
    
        <p>In addition, all constants in <span
        class="code">ch.qos.logback.classic.Level</span> are statically
        imported as is (uppercase) and as lowercased aliases. It follows
        that your scripts can reference both <em>INFO</em> or
        <em>info</em> without a static import statement.</p>
    
    
        <h2 class="doAnchor" name="sift">SiftingAppender no longer supported</h2>
    
        <p><span class="label">Since version 1.0.12</span>
        <code>SiftingAppender</code> is no longer supported within groovy
        configuration files. However, in case there is demand, it may be
        re-introduced.</p>
    
        <h2 class="doAnchor" name="entensions">Extensions specific to
        <em>logback.groovy</em></h2>
    
        <p><span class="green">Essentially, <em>Logback.groovy</em> syntax
        consists of half a dozen methods described next; in the reverse
        order of their customary appearance. </span>Strictly speaking, the
        order of invocation of these methods does NOT matter, with one
        exception: appenders MUST be defined before they can be attached
        to a logger.</p>
    
        
    
        <!-- ========================================================== -->
    
        <h3> &#8226; <span class="code">root(Level level, List&lt;String> appenderNames = [])</span></h3>
    
        <p>The <code>root</code> method can be used to set the level of
        the root logger. As an optional second argument of type
        <code>List&lt;String></code>, can be used to attach previously
        defined appenders by name. If you do not specify the list of
        appender names, then an empty list is assumed. In Groovy, an empty
        list is denoted by <code>[]</code>.</p>
    
        <p>To set the level of the root logger to WARN, you would write:</p>
    
        <pre class="prettyprint source">root(WARN)</pre>
    
        <p>To set the level of the root logger to INFO, and attach 
        appenders named "CONSOLE" and "FILE" to root, you would write:</p>
    
        <pre class="prettyprint source">root(INFO, ["CONSOLE", "FILE"])</pre>
    
        <p>In the previous example, it is assumed that the appenders named
        "CONSOLE" and "FILE" were already defined. Defining appenders will
        be discussed shortly.
        </p>
    
        <!-- ========================================================== -->
    
        <h3>&#8226; <span class="code">logger(String name, Level level, List&lt;String> appenderNames = [], <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Boolean additivity = null)</span></h3>
    
        <p>The <code>logger()</code> method takes four arguments, of which
        the last two are optional. The first argument is the name of the
        logger to configure. The second argument is the level of the
        designated logger. Setting the level of a logger to
        <code>null</code> forces it to <a
        href="architecture.html#effectiveLevel">inherit its level</a> from
        its nearest ancestor with an assigned level. The third argument of
        type <code>List&lt;String></code> is optional and defaults to an
        empty list if omitted. The appender names in the list are attached
        to the designated logger. The fourth argument of type
        <code>Boolean</code> is also optional and controls the <a
        href="architecture.html#additivity">additivity flag</a>. If
        omitted, it defaults to <code>null</code>.
        </p> 
    
        <p>For example, the following script sets the level of the
        "com.foo" logger to INFO.</p>
    
           <pre class="prettyprint source">logger("com.foo", INFO)</pre>
    
        <p>The next script sets the level of the "com.foo" logger to
        DEBUG, and attaches the appender named "CONSOLE" to it.</p>
    
      <pre class="prettyprint source">logger("com.foo", DEBUG, ["CONSOLE"])</pre>
        
       <p>The next script is similiar to the previous one, except that it
       also sets the the additivity flag of the "com.foo" logger to
       false.</p>
    
      <pre class="prettyprint source">logger("com.foo", DEBUG, ["CONSOLE"], false)</pre>
    
    
        <!-- ========================================================== -->
        <h3>&#8226; <span class="code">appender(String name, Class clazz, Closure closure = null)</span></h3>
    
        <p>The appender method takes the name of the appender being
        configured as its first argument. The second mandatory argument is
        the class of the appender to instantiate. The third argument is a
        closure containing further configuration instructions. If omitted,
        it defaults to null.</p>
    
        <p>Most appenders require properties to be set and sub-components
        to be injected to function properly. Properties are set using the
        '=' operator (assignment). Sub-components are injected by invoking
        a method named after the property and passing that method the
        class to instantiate as an argument. This convention can be
        applied recursively to configure properties as well as
        sub-components of any appender sub-component. This approach is at
        the heart of <em>logback.groovy</em> scripts and is probably the
        only convention that needs learning.</p>
        
        <p>For example, the following script instantiates a
        <code>FileAppender</code> named "FILE", setting its <span
        class="option">file</span> property to "testFile.log" and its
        <span class="option">append</span> property to false. An encoder
        of type <code>PatternLayoutEncoder</code> is injected into the
        appender. The pattern property of the encoder is set to "%level
        %logger - %msg%n". The appender is then attached to the root
        logger.</p>
    
        <pre class="prettyprint source">appender("FILE", FileAppender) {
      file = "testFile.log"
      append = true
      encoder(PatternLayoutEncoder) {
        pattern = "%level %logger - %msg%n"
      }
    }
    
    root(DEBUG, ["FILE"])</pre>
    
        <p>
        </p>
    
        
        <!-- ========================================================== -->        
        <h3>&#8226; <span class="code">timestamp(String datePattern, long timeReference = -1)</span></h3>
    
        <p>The <code>timestamp()</code> method method returns a string
        corresponding to the <code>timeReference</code> parameter
        formatted according to the <code>datePattern</code> parameter. The
        <code>datePattern</code> parameter should follow the conventions
        defined by <a
        href="http://java.sun.com/j2se/1.4.2/docs/api/java/text/SimpleDateFormat.html">SimpleDateFormat</a>. If
        the <code>timeReference</code> value is unspecified, it defaults
        to -1, in which case current time, that is time when the
        configuration file is parsed, is used as the time
        reference. Depending on the circumstances, occasion, you might
        wish to use <code>context.birthTime</code> as the time reference.
        </p>
    
        <p>In the next example, the <code>bySecond</code> variable is
        assigned the current time in the "yyyyMMdd'T'HHmmss" format. The
        "bySecond" variable is then used to define the value of the <span
        class="option">file</span> property.
        </p>
    
    <pre class="prettyprint source"><b>def bySecond = timestamp("yyyyMMdd'T'HHmmss")</b>
    
    appender("FILE", FileAppender) {
      <b>file = "log-${bySecond}.txt"</b>
      encoder(PatternLayoutEncoder) {
        pattern = "%logger{35} - %msg%n"
      }
    }
    root(DEBUG, ["FILE"])</pre>
    
        <!-- ========================================================== -->        
        <h3>&#8226; <span class="code">conversionRule(String conversionWord, Class converterClass)</span></h3>
    
        <p>After creating your own <a
        href="layouts.html#customConversionSpecifier">conversion
        specifier</a>, you need to inform logback of its existence. Here
        is a sample logback.groovy file which instructs logback to use
        MySampleConverter whenever the <code>%sample</code> conversion
        word is encountered.
        </p>
    
        <pre class="prettyprint source">
    import chapters.layouts.MySampleConverter
    
    conversionRule("sample", MySampleConverter)
    appender("STDOUT", ConsoleAppender) {
      encoder(PatternLayoutEncoder) {
        pattern = "%-4relative [%thread] %<b>sample</b> - %msg%n"
      }
    }
    root(DEBUG, ["STDOUT"])</pre>
    
       <!-- ========================================================== -->
       <h3>&#8226; <span class="code">scan(String scanPeriod = null)</span></h3>
    
        <p>Invoking the scan() method instructs logback to periodically
        scan the logback.groovy file for changes. Whenever a change is
        detected, the <em>logback.groovy</em> file is reloaded.</p>
    
        <pre class="prettyprint source">scan()</pre>
    
        <p>By default, the configuration file will be scanned for changes
        once every minute. You can specify a different scanning period by
        passing a "scanPeriod" string value. Values can be specified in
        units of milliseconds, seconds, minutes or hours. Here is an
        example:
        </p>
    
        <pre class="prettyprint source">scan("30 seconds")</pre>
        
        <p>If no unit of time is specified, then the unit of time is
        assumed to be milliseconds, which is usually inappropriate. If you
        change the default scanning period, do not forget to specify a
        time unit. For additional details on how scanning works, please
        refer to the <a href="configuration.html#autoScan">section on
        automatic reloading</a>.
        </p>
        
        <!-- ========================================================== -->
      
        <h3>&#8226; <span class="code">statusListener(Class listenerClass)</span></h3>
    
        <p>You can add a status listener by invoking the
        <code>statusListener</code> method and passing a listener class as
        an argument. Here is an example:</p>
    
        <pre class="prettyprint source">import chapters.layouts.MySampleConverter
    
    <b>// We highly recommended that you always add a status listener just</b>
    <b>// after the last import statement and before all other statements</b>
    <b>statusListener(OnConsoleStatusListener)</b></pre>
     
        <p><a href="configuration.html#statusListener">Status listeners</a> were described in an earlier
        chapter.</p>
    
        <h3>&#8226; <span class="code">jmxConfigurator(String name)</span></h3>
    
        <p>You can register a <a href="jmxConfig.html"><code>JMXConfigurator</code></a>
        MBean with this method. Invoke it without any parameters to use Logback's
        default ObjectName
        (<code>ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator</code>)
        for the registered MBean:</p>
    
        <pre class="prettyprint source">jmxConfigurator()</pre>
    
        <p>To change the value of the <code>Name</code> key to something other than "default",
        simply pass in a different name as the parameter for the <code>jmxConfigurator</code>
        method:</p>
    
        <pre class="prettyprint source">jmxConfigurator('MyName')</pre>
    
        <p>If you want define the ObjectName completely, use the same syntax but
        pass in a valid ObjectName string representation as the parameter:</p>
    
        <pre class="prettyprint source">jmxConfigurator('myApp:type=LoggerManager')</pre>
    
        <p>The method will first attempt to use the parameter as an ObjectName,
        and falls back to treating it as the value for the "Name" key if it doesn't
        represent a valid ObjectName.</p>
    
        <!-- ========================================================== -->
    
        <h2 class="doAnchor" name="internalDSL">Internal DSL, i.e. it's
        all groovy baby!</h2>
    
        <p>The <em>logback.groovy</em> is an internal DSL meaning that its
        contents are executed as a Groovy script. Thus, all the usual
        Groovy constructs such as class imports, GString, variable
        definitions, evaluation of $&#123;..&#125; expressions contained
        within strings (GStrings), if-else statements are all available in
        logback.groovy files. In the following discussion, we will present
        typical uses of these Groovy constructs in <em>logback.groovy</em>
        files.
        </p>
    
    
        <h3 class="doAnchor" name="varedef">Variable definitions and
        GStrings</h3>
    
        <p>You can define variables anywhere within a
        <em>logback.groovy</em> file, then use the variable within a
        GString. Here is an example.</p>
    
        <pre class="prettyprint source">// define the USER_HOME variable setting its value 
    // to that of the "user.home" system property
    <b>def USER_HOME = System.getProperty("user.home")</b>
    
    appender("FILE", FileAppender) {
      // make use of the USER_HOME variable
      <b>file = "${USER_HOME}/myApp.log"</b>
      encoder(PatternLayoutEncoder) {
        pattern = "%msg%n"
      }
    }
    root(DEBUG, ["FILE"])</pre>
    
    
        <h3 class="doAnchor" name="printing">Printing on the console</h3>
    
        <p>You can invoke Groovy's <code>println</code> method to print on
        the console. Here is an example.</p>
    
        <pre class="prettyprint source">def USER_HOME = System.getProperty("user.home");
    <b>println "USER_HOME=${USER_HOME}"</b>
    
    appender("FILE", FileAppender) {
      <b>println "Setting [file] property to [${USER_HOME}/myApp.log]"</b>
      file = "${USER_HOME}/myApp.log"  
      encoder(PatternLayoutEncoder) {
        pattern = "%msg%n"
      }
    }
    root(DEBUG, ["FILE"])</pre>
    
    
       <h3 class="doAnchor" name="automaticallyExported">Automatically
       exported fields</h3>
    
       <h4 class="doAnchor" name="hostname">'hostname' variable</h4>
    
       <p>The 'hostname' variable contains the name of the current
       host. However, due to scoping rules that the authors cannot fully
       explain, the 'hostname' variable is available only at the topmost
       scope but not in nested scopes. The next example should get the
       point across.
       </p>
    
     <pre class="prettyprint source">// will print "hostname is x" where x is the current host's name
    println "Hostname is ${hostname}"
    
    appender("STDOUT", ConsoleAppender) {
      <b>// will print "hostname is null"</b>
      <b>println "Hostname is ${hostname}" </b>
    }</pre>
    
       <p>If you wish to have the hostname variable be seen in all scopes,
       you need to define another variable and assign it the value of
       'hostname' as shown next.</p>
    
     <pre class="prettyprint source">// define HOSTNAME by assigning it hostname
    def HOSTNAME=hostname
    // will print "hostname is x" where x is the current host's name
    println "Hostname is ${HOSTNAME}"
    
    appender("STDOUT", ConsoleAppender) {
      // will print "hostname is x" where x is the current host's name
      println "Hostname is ${HOSTNAME}" 
    }</pre>
    
    
       <h3 class="doAnchor" name="everythingIsContext">Everything is
       context aware with a reference to the current context</h3>
    
       <p>The execution of the <em>logback.groovy</em> script is done
       within the scope of a <a
       href="../xref/ch/qos/logback/core/spi/ContextAware.html">ContextAware</a>
       object. Thus, the current context is always accessible using the
       '<code>context</code>' variable and you can invoke
       <code>addInfo</code>(), <code>addWarn</code>() and
       <code>addError</code>() methods to send status messages to the
       context's <code>StatusManager</code>.</p>
    
       <pre class="prettyprint source">// always a good idea to add an on console status listener
    statusListener(OnConsoleStatusListener)
    
    // set the context's name to wombat
    <b>context.name = "wombat"</b>
    // add a status message regarding context's name
    <b>addInfo("Context name has been set to ${context.name}")</b>
    
    def USER_HOME = System.getProperty("user.home");
    // add a status message regarding USER_HOME
    <b>addInfo("USER_HOME=${USER_HOME}")</b>
    
    appender("FILE", FileAppender) {
      // add a status message regarding the file property
      <b>addInfo("Setting [file] property to [${USER_HOME}/myApp.log]")</b>
      file = "${USER_HOME}/myApp.log"  
      encoder(PatternLayoutEncoder) {
        pattern = "%msg%n"
      }
    }
    root(DEBUG, ["FILE"])</pre>
    
    
       <h3 class="doAnchor">Conditional configuration</h3>
       
       <p>Given that Groovy is a fully-fledged programming language,
       conditional statements allow for a single <em>logback.groovy</em>
       file to adapt to various environments such as development, testing
       or production.</p>
    
       <p>In the next script, a console appender is activated on hosts
       other than pixie or orion, our production machines. Note that the
       output directory of the rolling file appender also depends on the
       host.</p>
       
       <pre class="prettyprint source">// always a good idea to add an on console status listener
    statusListener(OnConsoleStatusListener)
    
    def appenderList = ["ROLLING"]
    def WEBAPP_DIR = "."
    def consoleAppender = true;
    
    // does hostname match pixie or orion?
    if (hostname =~ /pixie|orion/) {
      WEBAPP_DIR = "/opt/myapp"     
      consoleAppender = false   
    } else {
      appenderList.add("CONSOLE")
    }
    
    if (consoleAppender) {
      appender("CONSOLE", ConsoleAppender) {
        encoder(PatternLayoutEncoder) {
          pattern = "%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"
        }
      }
    }
    
    appender("ROLLING", RollingFileAppender) {
      encoder(PatternLayoutEncoder) {
        Pattern = "%d %level %thread %mdc %logger - %m%n"
      }
      rollingPolicy(TimeBasedRollingPolicy) {
        FileNamePattern = "${WEBAPP_DIR}/log/translator-%d{yyyy-MM}.zip"
      }
    }
    
    root(INFO, appenderList)</pre>
    
    
    
    
        <script src="../templates/footer.js" type="text/javascript"></script>
    
        </div>
      </body>
    </html>
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/download.html�������������������������������������������������������������������0000644�0001750�0001750�00000012742�12143164237�016612� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Download</title>
        <link rel="stylesheet" type="text/css" href="css/common.css" />
        <link rel="stylesheet" type="text/css" href="css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="css/_print.css" media="print" />
        <link rel="stylesheet" type="text/css" href="css/popup.css" media="screen" />
      </head>
      <body onload="centerPopup(); loadPopup();">
        <script type="text/javascript">prefix='';</script>
         
        <script type="text/javascript" src="http://jqueryjs.googlecode.com/files/jquery-1.2.6.min.js" ></script>   
        <script type="text/javascript" src="js/jquery.cookies.2.2.0.js"></script>
        <script type="text/javascript" src="js/popup.js" ></script>
    
        <script src="templates/header.js" type="text/javascript"></script>
    
        <div id="left">
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="templates/left.js" type="text/javascript"></script>
        </div>
    
        <div id="popupContents">
          <p style="font-size: large; padding-bottom: 5px; ">Would you like to subscribe to the
          QOS.CH announcements mailing list?</p>
    
    
          <p>The list is reserved for announcements related to QOS.CH
          projects such as cal10n, logback, mistletoe and SLF4J.</p>
          <br/>
          <table width="100%">
            <tr>
              <td><a class="popupLink" id="announce">Yes, I'd like to subscribe.</a></td>
              <td><a class="popupLink" id="popupContentsClose">No, thanks.</a></td>
            </tr>
          </table>
        </div>
        <div id="backgroundPopup"></div>
    
    
        <div id="content">
    	
        <h2>Download links</h2>
    
    
    		<p>Logback modules are available as downloads including full
    		source code, class files and documentation.
    		</p>
    
    		<ul>
          <li><a href="dist/logback-1.0.13.zip">logback-1.0.13.zip</a></li>
          <li><a href="dist/logback-1.0.13.tar.gz">logback-1.0.13.tar.gz</a></li>
    		</ul>
    		
    		
        <p>If you wish to download an older version of logback, please
        refer to the <a href="http://logback.qos.ch/dist/">distributions
        directory</a>.</p>
       
       
        <h3>logback-beagle: an Eclipse plug-in for viewing logs</h3>
       
        <p><a href="beagle/index.html"><img style="float:left;
        margin-right: 1em;" src="beagle/images/sailing-ship-32x32.png"
        alt=""/></a>We also offer a console plugin for Eclipse called
        logback-beagle. It allows you to receive logging events in a
        convenient Eclipse view, and offers various convenient features. A
        more precise description for this plug-in along with installation
        instructions can be found in <a
        href="beagle/index.html">logback-beagle user guide</a>.</p>
    
        <hr/>
    
        <h2>Third-party tools, extensions or forks (in chronological
        order)</h2>
    
        <p>If you are the author of a logback-related project and would
        like us to add your project to the list below please drop a line
        on the logback-dev mailing list.</p>
    
    
        <dl>
         
          <!-- ============================================================ -->
          <dt>
            <a href="http://lilith.huxhorn.de">Lilith</a> by Joern Huxhorn
          </dt>
    
          <dd>
            <p>Lilith is a Logging- and AccessEvent viewer for logback.</p> 
          </dd>
    
          <!-- ============================================================ -->
          <dt>
            <a
            href="https://github.com/mojolly/logback-akka">Logback-akka</a>
            by Ivan Porto Carrero.
          </dt>
    
          <dd>
            <p>Consists of several akka-based logback utilities, including
            ActorAppender, HoptoadActorAppender and Logstash redis
            appender.
            </p> 
          </dd>
    
        <!-- ============================================================ -->
          <dt>
            <a
            href="https://github.com/tony19/logback-android">Logback-android</a>
            by Tony Trinh.
          </dt>
    
          <dd>
            <p>Logback-Android brings the power of Logback to Android.
            </p> 
          </dd>
    
    
        <!-- ============================================================ -->
          <dt>
            <a
            href="http://code.google.com/p/simpledb-appender/">
            Simpledb-appender</a> by Gabriel Nell
          </dt>
    
          <dd>
            <p>Logback Appender writing to Amazon SimpleDB. See also <a
            href="http://www.peecho.com/blog/logging-the-cloud-with-simpledb.html">Logging
            the cloud with SimpleDB</a>.</p>
          </dd>
    
    
          <!-- ============================================================ -->
          <dt>
            <a href="http://perf4j.codehaus.org/">Perf4J</a> by Alex
            Devine, Doran Chakraborty et al.
          </dt>
    
          <dd>
            <p>Perf4J is a set of utilities for calculating and displaying
            performance statistics for Java code.</p>
          </dd>
    
    
          <!-- ============================================================ -->
          <dt>
            <a
            href="https://github.com/Moocar/logback-gelf">Logback-gelf</a>
            by Anthony Marcar
          </dt>
    
          <dd>Logback-gelf can log messages to a <a
          href="http://graylog2.org/">Graylog2</a> server via GELF
          messages.
          </dd>
          
        </dl>
    
        <p/>  
    
        
    
      <script src="templates/footer.js" type="text/javascript"></script>
    </div>
    </body>
    </html>
    ������������������������������logback_1.0.13/docs/css/����������������������������������������������������������������������������0000755�0001750�0001750�00000000000�12203357067�014701� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/css/common.css������������������������������������������������������������������0000644�0001750�0001750�00000011460�12143164237�016703� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������html { 
    /*  padding:0px;
      margin:0px; */
    }
    
    
    a { 
     color: #4183c4; 
     background-color:transparent;
     text-decoration: none; 
    }
    
    #content a:hover {
     text-decoration: underline;
    }
    
    .example {
      width: 90%;
      font-style: italic;
    }
    
    
    div.source {
     margin-top: 1em;
    }
    
    div.breaking {
       border: 1px solid #F44; 
       background-color: #FED; 
       padding-left: 1ex; 
       padding-right: 1ex;
    }
    
    .longline {
      overflow: scroll;
    }
    
    .source, .command, .console { 
      border-top: 1px solid #DDDDDD;
      border-bottom: 1px solid #DDDDDD;
      background: #f5f5f5;
      font-family: Courier, "MS Courier New", Prestige, monospace;
      padding-left: 1ex;
      white-space: pre;
    }
    
    .source {
      padding-bottom: 0.5ex;
      padding-top: 0.5ex;
    }
    
    .command {
      padding-bottom: 0ex;
      padding-top: 0ex;
    }
    
    .console {
    }
    
    pre { 
     padding: 0px;
     margin: 0px; 
     background-color:transparent;
     font-family: Courier, Monaco, Monospace;
    }
    
    .alignright {
     margin-top: 0; 
     text-align: right;
     font-size: 10px;
    }
    
    
    h1, h2, h3, h4 {
      color: #505050;
      padding-top: 0ex; 
      background-color: transparent;
    }
    
    h2 {
      font-weight: 900;
      font-size: x-large;
    }
    
    h3 {
      font-weight: bold;
      font-size: large;
    }
    
    h4 {
      font-weight: bold;
      font-size: medium;
    }
    
    table.footer {
      width: 100%;
    }
    
    .footer {
      color: #564b47;
      background-color: #fff;
      padding:0px;
      border-top:  1px solid #CCCCCC;
      margin-top: 3ex;
    	font-size: smaller;
    }
    
    
    p.menu {
     padding-top: 0px;
     padding-bottom: 0px; 
     margin-top: 0px;
     margin-bottom: 0px;
    }
    
    .small { 
    	font-size: smaller;
    }
    
    .strong, .bold { 
      /*font-size: 13px;*/
      font-weight: bold;
    }
    
    /* ========== body table ============ */
    table.bodyTable {
    	padding: 0px;
    	margin-left: -2px;
    	margin-right: -2px;
    }
    
    table.bodyTable th {
    	color: white;
    	background-color: #bbb;
    	font-weight: bold;
    }
    
    
    table.bodyTable td {
      vertical-align: text-top;
      padding-left: 0.5ex;
      padding-bottom: 0.5ex;
    }
    
    
    /* apply to tr elements of tables which are both bodytable and dark */
    table[class="bodyTable dark"] tr {
    	background-color: #ddd;
    }
    
    /* apply to tr elements of tables which are both bodytable and dark */
    table[class="bodyTable properties"] tr {
    	vertical-align: top;
    }
    
    /* table.bodyTable tr.a { 	background-color: #ddd; } */
    /* table.bodyTable tr.b {	background-color: #eee; } */
    /* table.bodyTable tr.alt {	background-color: #eee;} */
    
    /* we don't want the first p under td to appear indented */
    table.bodyTable tr td p:first-child {
      padding-top: 0px;
      margin-top: 0px;
    }
    
    .striped tr:nth-child(odd) td {
      background-color: #f9f9f9;
    }
    .striped td {
      background-color: #f0f0f0;
    }
    .striped tr:last-child td {
      border-bottom: 1px solid #ddd;
    }
    
    td.word {
      text-align: right;
    }
    
    /* EOF =============== bodyTable =============== */
    
    .author {
    	text-align: left;
    	font-weight: bold;
    }
    
    .definition {
    	padding-left: 5px;
    	padding-right: 5px;
    	margin: 5px 50px 5px 50px;
    	text-align: justify;
    	background-color: #E6E64C;
    }
    
    .deftitle {
    	font-weight: bold;
    }
    
    
    .big {
      font-size: 130%;
    }
    
    
    .green {
    	color: green;
    }
    
    .white_bg {
    	background-color: #FFFFFF;
    }
    
    .lgray_bg {
    	background-color: #EEE;
    }
    
    .blue {
    	color: blue;	
    }
    
    .red {
    	color: red;
    }
    
    .redBold {
    	color: red;
    	font-weight: bold;	
    }
    
    .greenBold {
    	color: green;	
      font-weight: bold;	
    }
    
    .code {
    	font-family: Courier, monospace;
     	color: #666;	
    }
    
    .variable {
    	font-family: Courier, monospace;
      font-style:italic;  
    }
    
    
    
    .attr {
    	font-family: Courier, monospace;
      font-style:italic; 
    
    }
    
    .option, .prop {
      border-top: 1px dotted #BBBBBB;
      border-bottom: 1px dotted #BBBBBB;
      border-left: 1px dotted #AAAAAA;
      border-right: 1px dotted #AAAAAA;
      padding-left: 2px;
      padding-right: 2px;
      font-family: Arial, sans-serif;
    }
    
    /*  background:#FFCC99;	*/
    .highlight {
      width: 18em;
      float: right;	
      display: inline;
      font-size: 110%;
    
      border: 2px solid #711;
      -webkit-border-radius: 4px;
      -moz-border-radius: 4px;
      border-radius: 4px;
      background:#FFE0B0;	
      padding-top: 1ex;
      padding-left: 1ex;
      padding-right: 1ex;
      padding-bottom: 1ex;
      margin-left: 1em;
      margin-right: 0em;
      margin-bottom: 1ex;
    }
    
    .quote {
       text-align: right;
      padding-left: 12em;
    }
    
    /* --------- numbering --------- */
    .autoEx:before {
      counter-increment: example;  /* Add 1 to example */
      content: counter(example)
    }
    
    /** ----------- labels -------- */
    .label {
      padding: 1px 3px 2px;
      font-size: 9.75px;
      font-weight: bold;
      color: #ffffff;
      text-transform: uppercase;
      white-space: nowrap;
      background-color: #bfbfbf;
      -webkit-border-radius: 3px;
      -moz-border-radius: 3px;
      border-radius: 3px;
    }
    
    .label.notice {
      background-color: #62cffc;
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/css/print.css�������������������������������������������������������������������0000644�0001750�0001750�00000000336�12143164146�016546� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#banner, #footer, #leftcol, #breadcrumbs, .docs #toc, .docs .courtesylinks, #leftColumn, #navColumn {
    	display: none !important;
    }
    #bodyColumn, body.docs div.docs {
    	margin: 0 !important;
    	border: none !important
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/css/_print.css������������������������������������������������������������������0000644�0001750�0001750�00000000637�12143164237�016712� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
    body {
    	margin: 0px;
    	padding: 100px 0px 2px 0px;
    	line-height: 1.3em;
    	font-size: 12px;
    }
    
    #left, #right, span.asGroovy {
    	width: 0px;
    	height: 0px;
      display: none;
    	visibility:hidden;
    }
    
    #bodyColumn {
    	margin-right: 1.5em;
    	margin-left: 0px; /*was: 197*/
    }
    
    
    table.bodyTable td {
    	vertical-align: text-top;
    }
    
    table.bodyTable th {
    	vertical-align: text-top;
    	text-align:center;
    }
    
    �������������������������������������������������������������������������������������������������logback_1.0.13/docs/css/anchor12.png����������������������������������������������������������������0000644�0001750�0001750�00000001160�12143164146�017017� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR���������Vu\���sBIT|d���sRGB����gAMA��a���	pHYs����+���tEXtSoftware�www.inkscape.org<��IDAT(S-;oAFϮ5qb%!QAZhi-
    ?AOJP*
    PFBPJH( ?wggg5fFsJ|ߌceLŰ2|wGvmlI7f%ic<͋7҆-($<(4]chKFӘ)ԺUY MQ33YdObD3u˲L2tbt
    'Z	X{G
    x`
    RfyqϐW'lz"TJ܉N̒s8rQXc)ν!.ܽT`6֨0s֯4xΈ丹 U:e79̸yIӫHW;ልX=D\H0Nc̻~Ƶs5^ij/ɪh<x؅˜LʥVք~HuĀTۧ_uߦb-
    ™7����IENDB`����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/css/site.css��������������������������������������������������������������������0000644�0001750�0001750�00000000065�12143164130�016346� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* You can override this file with your own styles */���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/css/screen.css������������������������������������������������������������������0000644�0001750�0001750�00000011037�12143164237�016672� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������html { 
    /*  padding:0px;
      margin:0px; */
    }
    
    body {
      background-color: #fff;
      font-family: Verdana, Arial, SunSans-Regular, Sans-Serif;
      color: #000;  
      padding: 0px;
      margin: 0px;
      counter-reset: example;  /* Create an example counter scope */
    }
    
    .footer {
      color: #564b47;
      background-color: #fff;
      padding:0px;
      border-top:  1px solid #CCCCCC;
      margin-top: 3ex;
    	font-size: smaller;
    }
    
    #job img {
       border:1px solid #DDDDDD;
    }
    
    #job:hover img {
       border:1px solid #8888EE;
    }
    
    p.menu {
     padding-top: 0px;
     padding-bottom: 0px; 
     margin-top: 0px;
     margin-bottom: 0px;
     font-size: smaller;
    }
    
    
    #leftOld {
      position: absolute;
      font-size: 80%;
      left: 0px;
      width: 15em;
      color: #564b47;
      margin: 4px 0px 0px 4px; 
      padding: 0px;
      border: 1px solid #cccccc;
      background-color: #fff8e8;
      -webkit-border-radius: 3px;
      -moz-border-radius: 3px;
      border-radius: 3px;
    }
    
    #left {
      position: absolute;
      left: 0px;
      width: 15em;
      margin: 4px 0px 0px 4px; 
      padding: 0px;
      font-size: 80%;
      background-color: #ffffff;
    }
    
    .menuGroup {
      border: 1px solid #cccccc;  
      background-color: #fff8e8;
      color: #564b47;
      border: 1px solid #cccccc;
      -webkit-border-radius: 3px;
      -moz-border-radius: 3px;
      border-radius: 3px;
    }
    
    #left a, #right a {
      display: block; 
      width: 95.5%; 
      margin: 0px; 
      padding: 2px; 
      border: solid 1px #fff8e8; 
      color: #0066cc; 
      text-decoration: none;
    }
    
    p.menu_header {
      margin: 0px; 
      padding: 2px;
      font-weight: normal; 
      background-color: #ffd0a0; 
      border-top: solid 1px #CCCCCC;
      border-bottom: solid 1px #CCCCCC;
    }
    
    #left a:hover, #right a:hover {
      border: solid 1px #FFFFFF; 
      background-color: #3333CC; 
      color: #ffffff;
      -webkit-border-radius: 3px;
      -moz-border-radius: 3px;
      border-radius: 3px;
    }
    
    #left div.jobadd {
      font-size: 140%;
      color: #fff;
      margin: 0px;
      padding: 0px;
    
      text-align: center;
      -webkit-border-radius: 3px;
      -moz-border-radius: 3px;
      border-radius: 3px;
    
      background-image: -ms-linear-gradient(bottom right, #FFBB55 0%, #FF8822 100%);
      background-image: -moz-linear-gradient(bottom right, #FFBB55 0%, #FF8822 100%);
      background-image: -o-linear-gradient(bottom right, #FFBB55 0%, #FF8822 100%);
      background-image: -webkit-gradient(linear, right bottom, left top, color-stop(0, #FFBB55), color-stop(1, #FF8822));
      background-image: -webkit-linear-gradient(bottom right, #FFBB55 0%, #FF8822 100%);
      background-image: linear-gradient(to top left, #FFBB55 0%, #FF8822 100%);
    }
    
    #left div.jobadd a, div.jobadd a:hover {
      background-color: transparent;
      color: #fff;
      border-width: 0px;	
    }
    
    /* ------------------------------------------- */
    
    #right {
      position: absolute;
      right: 0px;        
      width: 12em;
      color: #564b47;
      margin: 4px 4px 0px 0px; 
      padding: 0px;
      background-color: #ffffff;    
      border: 1px solid #cccccc;
      font-size: 80%;
    }
    
    #left img {
    	display: block;
    	margin: 20px 0 20px 17px;
    	border: none;
    	width: 90px;
    	height: 30px;
    }
    
    #headerLine {
      background-color:#FFD0A0;
      border:1px solid #CCCCCC;
      font-size:small;
      margin:0 4px;
      padding:3px 10px;
    }
    
    #content {
      min-width:50em;
      margin: 0px 15em 0px 15em;
      padding: 0px;
      background-color: #ffffff;  
      line-height: 130%;
    }
    
    #content img {
    	border:none;
    	margin-left: auto;
    	margin-right: auto;
    	display: block;
    }
    
    span.asGroovy {
       background: #fff; 
       color: #0079C5;   
       font-family: "Comic Sans MS", sans-serif;
       white-space: nowrap;
       font-size: 80%;
    
       border-top:    2px solid #DDD;  
       border-left:   2px solid #DDD;  
       border-right:  2px solid #888;  
       border-bottom: 2px solid #888;    
       padding: 0px 1em 0px 1em;
       margin:  -4px 4px 0 4px; 
       float: right;
    }
     
    span.asGroovy:hover {
       background: #E0E0EF;
       cursor: pointer;
    }
    
    /* ------------------------------------ */
    
    .anchor { display:none; }
    
    h1 .anchor:before {content:url(anchor24.png);}
    h2 .anchor:before {content:url(anchor20.png);}
    h3 .anchor:before {content:url(anchor16.png);}
    h4 .anchor:before {content:url(anchor12.png);}
    td .anchor:before {content:url(anchor12.png);}
    
    h1:hover .anchor { margin-left: -24px; }
    h2:hover .anchor { margin-left: -20px; }
    h3:hover .anchor { margin-left: -16px; }
    h4:hover .anchor { margin-left: -12px; }
    td:hover .anchor { margin-left: -12px; }
    
    h1:hover .anchor, 
    h2:hover .anchor,  
    h3:hover .anchor, 
    h4:hover .anchor,
    td:hover .anchor {
      display: inline-block;
      text-decoration: none;
    }
    
    
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/css/anchor24.png����������������������������������������������������������������0000644�0001750�0001750�00000003136�12143164146�017027� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR���������}\���sBIT|d���sRGB����gAMA��a���	pHYs����+���tEXtSoftware�www.inkscape.org<��IDATHKMU[UUs93sIƴ!Tv%(|J("7%D}aeIDeSf9:̹}}sX{]Z)|?׻h)Z
    P�G,笠B*5+cʖR1FA
    ׿^^~bF"Okh{hN^ΜhrF
    纴?_+_3-(B9(ЛR]^)F_"W?QT]hT@"C[ڏ:r>v8#k8q-O
    *86h麈hH\)4/B. r(P\Wb+x3xa҄"3lA4"h 
    3brCVNRqz9N݊gΣĵ]v<F#EYlNZydۇkLMO{y:n^Wq*f
    v'=14RR~RCĔ4iT49,Y,F:/]ƫg(T8KQ&p`F)A@$&r_(I4wX/bdG<z:ţkȥ
    :Z#Pr HyxLNn^j:Ӏث ƢjӓX,C%-[{՛Pʘ4t"AҼnzģT/L=#4jFdv1WLLu皠 d皌:A!c 5P̚=zs)f`ЉGbKBk2N!tTtKHL\EbdRM]cY1biԦ-Lh&S
    42J 摚.~sܡazJFIEX˃F*v_3/Mrg$͆
    *12ĈG8k)<VQi-4~,NLKO{-zx U]fSHZ7o:N>keѤLTyRJ"RN6z5\mkW܅0=cf6׮7$2\͒s4[}d34Y^.`Pp 6\Du{h_C&MU&BLSc
    CW~Ƃ!uR &b^8}ǖ
    $J~nj1w/kl΀{jYd6kqMtf䷋!J/ËGǰC2`${IzhhXo&lc�BS W)j%DV�(
    ˇĞCga.e^u蘋MiJk^.Bmަ d4!75ٓ3m;LETQ([Ԯ˛S_Brr5)uϐruT5$6#0Mly)0<����IENDB`����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/css/anchor16.png����������������������������������������������������������������0000644�0001750�0001750�00000001661�12143164146�017031� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR���������a���sBIT|d���sRGB����gAMA��a���	pHYs����+���tEXtSoftware�www.inkscape.org<��IDAT8O]ˋUi{'q"FDVE!+A\)b"n.(DdH̘NOOg[uos}(2rk7LUEpfV)yY%SUtS<X)#>r`f13; b$Ùjf\0R<'DKR0!t#fS
    U|ݪ$"$gvSg42H(d?FeV9̕v%E;smN,Z5r@P	 Q[]Y,-/=z]x	G9RYeoV,
    {#ƻ;\:ߧVS,vXퟤ&DI+O|쉋jtY=fΜ)4I/
    3b?!CEբ,i5:
    .Pd^a;1SEq Sg6^2"jz*{@NӒ/Uݙr0`j\~y0
    =8%;sAZGIS|{.3F	N+j7y囫y8[ݪbFksmO~fM_x7_:w#PnިvD�OkLa�XgiIՐln|n}<jj6q+eiY}F_
    "wgjF"tƍmo!M[9R؟/RIN>o>����IENDB`�������������������������������������������������������������������������������logback_1.0.13/docs/css/maven-theme.css�������������������������������������������������������������0000644�0001750�0001750�00000005361�12143164146�017623� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������body {
      padding: 0px 0px 10px 0px;
    }
    body, td, select, input, li{
      font-family: Verdana, Helvetica, Arial, sans-serif;
      font-size: 13px;
    }
    code{
      font-family: Courier, monospace;
      font-size: 13px;
    }
    a {
      text-decoration: none;
    }
    a:link {
      color:#36a;
    }
    a:visited  {
      color:#47a;
    }
    a:active, a:hover {
      color:#69c;
    }
    #legend li.externalLink {
      background: url(../images/external.png) left top no-repeat;
      padding-left: 18px;
    }
    a.externalLink, a.externalLink:link, a.externalLink:visited, a.externalLink:active, a.externalLink:hover {
      background: url(../images/external.png) right center no-repeat;
      padding-right: 18px;
    }
    #legend li.newWindow {
      background: url(../images/newwindow.png) left top no-repeat;
      padding-left: 18px;
    }
    a.newWindow, a.newWindow:link, a.newWindow:visited, a.newWindow:active, a.newWindow:hover {
      background: url(../images/newwindow.png) right center no-repeat;
      padding-right: 18px;
    }
    h2 {
      padding: 4px 4px 4px 6px;
      border: 1px solid #999;
      color: #900;
      background-color: #ddd;
      font-weight:900;
      font-size: x-large;
    }
    h3 {
      padding: 4px 4px 4px 6px;
      border: 1px solid #aaa;
      color: #900;
      background-color: #eee;
      font-weight: normal;
      font-size: large;
    }
    h4 {
      padding: 4px 4px 4px 6px;
      border: 1px solid #bbb;
      color: #900;
      background-color: #fff;
      font-weight: normal;
      font-size: large;
    }
    h5 {
      padding: 4px 4px 4px 6px;
      color: #900;
      font-size: normal;
    }
    p {
      line-height: 1.3em;
      font-size: small;
    }
    #breadcrumbs {
      border-top: 1px solid #aaa;
      border-bottom: 1px solid #aaa;
      background-color: #ccc;
    }
    #leftColumn {
      margin: 10px 0 0 5px;
      border: 1px solid #999;
      background-color: #eee;
    }
    #navcolumn h5 {
      font-size: smaller;
      border-bottom: 1px solid #aaaaaa;
      padding-top: 2px;
      color: #000;
    }
    
    table.bodyTable th {
      color: white;
      background-color: #bbb;
      text-align: left;
      font-weight: bold;
    }
    
    table.bodyTable th, table.bodyTable td {
      font-size: 1em;
    }
    
    table.bodyTable tr.a {
      background-color: #ddd;
    }
    
    table.bodyTable tr.b {
      background-color: #eee;
    }
    
    .source {
      border: 1px solid #999;
    }
    dl {
      padding: 4px 4px 4px 6px;
      border: 1px solid #aaa;
      background-color: #ffc;
    }
    dt {
      color: #900;
    }
    #organizationLogo img, #projectLogo img, #projectLogo span{
      margin: 8px;
    }
    #banner {
      border-bottom: 1px solid #fff;
    }
    .errormark, .warningmark, .donemark, .infomark {
      background: url(../images/icon_error_sml.gif) no-repeat;
    }
    
    .warningmark {
      background-image: url(../images/icon_warning_sml.gif);
    }
    
    .donemark {
      background-image: url(../images/icon_success_sml.gif);
    }
    
    .infomark {
      background-image: url(../images/icon_info_sml.gif);
    }
    
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/css/maven-base.css��������������������������������������������������������������0000644�0001750�0001750�00000004636�12143164146�017437� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������body {
      margin: 0px;
      padding: 0px;
    }
    img {
      border:none;
    }
    table {
      padding:0px;
      width: 100%;
      margin-left: -2px;
      margin-right: -2px;
    }
    acronym {
      cursor: help;
      border-bottom: 1px dotted #feb;
    }
    table.bodyTable th, table.bodyTable td {
      padding: 2px 4px 2px 4px;
      vertical-align: top;
    }
    div.clear{
      clear:both;
      visibility: hidden;
    }
    div.clear hr{
      display: none;
    }
    #bannerLeft, #bannerRight {
      font-size: xx-large;
      font-weight: bold;
    }
    #bannerLeft img, #bannerRight img {
      margin: 0px;
    }
    .xleft, #bannerLeft img {
      float:left;
    }
    .xright, #bannerRight {
      float:right;
    }
    #banner {
      padding: 0px;
    }
    #banner img {
      border: none;
    }
    #breadcrumbs {
      padding: 3px 10px 3px 10px;
    }
    #leftColumn {
     width: 170px;
     float:left;
     overflow: auto;
    }
    #bodyColumn {
      margin-right: 1.5em;
      margin-left: 197px;
    }
    #legend {
      padding: 8px 0 8px 0;
    }
    #navcolumn {
      padding: 8px 4px 0 8px;
    }
    #navcolumn h5 {
      margin: 0;
      padding: 0;
      font-size: small;
    }
    #navcolumn ul {
      margin: 0;
      padding: 0;
      font-size: small;
    }
    #navcolumn li {
      list-style-type: none;
      background-image: none;
      background-repeat: no-repeat;
      background-position: 0 0.4em;
      padding-left: 16px;
      list-style-position: outside;
      line-height: 1.2em;
      font-size: smaller;
    }
    #navcolumn li.expanded {
      background-image: url(../images/expanded.gif);
    }
    #navcolumn li.collapsed {
      background-image: url(../images/collapsed.gif);
    }
    #poweredBy {
      text-align: center;
    }
    #navcolumn img {
      margin-top: 10px;
      margin-bottom: 3px;
    }
    #poweredBy img {
      display:block;
      margin: 20px 0 20px 17px;
    }
    #search img {
        margin: 0px;
        display: block;
    }
    #search #q, #search #btnG {
        border: 1px solid #999;
        margin-bottom:10px;
    }
    #search form {
        margin: 0px;
    }
    #lastPublished {
      font-size: x-small;
    }
    .navSection {
      margin-bottom: 2px;
      padding: 8px;
    }
    .navSectionHead {
      font-weight: bold;
      font-size: x-small;
    }
    .section {
      padding: 4px;
    }
    #footer {
      padding: 3px 10px 3px 10px;
      font-size: x-small;
    }
    #breadcrumbs {
      font-size: x-small;
      margin: 0pt;
    }
    .source {
      padding: 12px;
      margin: 1em 7px 1em 7px;
    }
    .source pre {
      margin: 0px;
      padding: 0px;
    }
    #navcolumn img.imageLink, .imageLink {
      padding-left: 0px;
      padding-bottom: 0px;
      padding-top: 0px;
      padding-right: 2px;
      border: 0px;
      margin: 0px;
    }
    ��������������������������������������������������������������������������������������������������logback_1.0.13/docs/css/popup.css�������������������������������������������������������������������0000644�0001750�0001750�00000002441�12143164237�016555� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
    /* =========== popup ================== */
    #backgroundPopup {  
      display:none;  
      position:fixed;  
      _position:absolute; /* hack for internet explorer 6*/  
      height:100%;  
      width:100%;  
      top:0;  
      left:0;  
      background:#000000;  
      border:1px solid #cecece;  
      z-index:1;  
    } 
    
    #popupContents {  
      display:none;  
      position:fixed;  
      _position:absolute; /* hack for internet explorer 6*/  
      height: 150px;  
      width:  408px;   
      background:#FFFFFF;  
      border: 2px solid #cecece;  
      z-index:2;  
      padding-left: 1ex;   
      font-size:13px;  
    } 
    
    #popupContents p {
     margin: 0px;
    }
    #popupContents h3 {
     margin: 0px;
    }
    
    #popupContactClose {  
      font-size:14px;  
      line-height:14px;  
      right:6px;  
      top:4px;  
      position:absolute;  
      color:#6fa5fd;  
      font-weight:700;  
      display:block;  
    } 
    
    a.popupLink {
      background: #FFF; 
      color: #0079C5;   
      font-family: "Comic Sans MS", sans-serif;
      white-space: nowrap;
      font-size: 14px;
      font-weight: bold;
    
      border-top:    2px solid #DDD;  
      border-left:   2px solid #DDD;  
      border-right:  2px solid #888;  
      border-bottom: 2px solid #888;    
      padding: 0px 1em 0px 1em;
      margin:  0px 0px 3px 0px; 
    }
    
    a.popupLink:hover {
       background: #E0E0EF;
       cursor: pointer;
    }
    
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/css/prettify.css����������������������������������������������������������������0000644�0001750�0001750�00000001356�12143164237�017264� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Pretty printing styles. Used with prettify.js. */
    
    .str { color: #080; }
    .kwd { color: #008; }
    .com { color: #800; }
    .typ { color: #606; }
    .lit { color: #066; }
    .pun { color: #660; }
    .pln { color: #000; }
    .tag { color: #008; }
    .atn { color: #606; }
    .atv { color: #080; }
    .dec { color: #606; }
    pre.prettyprint { padding: 2px; border-top: 1px solid #888; border-bottom: 1px solid #888;}
    
    @media print {
      .str { color: #060; }
      .kwd { color: #006; font-weight: bold; }
      .com { color: #600; font-style: italic; }
      .typ { color: #404; font-weight: bold; }
      .lit { color: #044; }
      .pun { color: #440; }
      .pln { color: #000; }
      .tag { color: #006; font-weight: bold; }
      .atn { color: #404; }
      .atv { color: #060; }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/css/anchor20.png����������������������������������������������������������������0000644�0001750�0001750�00000002274�12143164146�017025� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG
    
    ���
    IHDR���������[���sBIT|d���sRGB����gAMA��a���	pHYs����+���tEXtSoftware�www.inkscape.org<��IDAT8O=TKh$U=J;IL1CDq5h$u\.;?	"(Lt)͸Q$Wuu_vU{=i>v: %*/sKS$Ե򮾤E\V|)
    !`:L%2a
    
    uŒef	f9BbI<,Flczh'pNŌ7,"Gf3M?$Y@]E
    2Pc3d^{vnÛ
    4*(E6IP	XiY	
    F24QC$|SxM\Qh#ka
    �
    �L�@EyD<svwO30DrJFt\*u6%HvT3|eBbjpبhvLBp)d*9-D0CR[Y|?\:n7Q%m5A8HJ ϋ0O y$`Rd}$E0ت&)<2[eIJ)69vLԫ|nԧlGB^sQ0%4NJ%PFQW}QN1Ye6|:vࠃpM*&hq|=>-lnQ*A@RHD5o\Csc7xrd9St w0�2euN|(
    8T՜R%@Ps=ře\c7/c+qC5I\�Kxw8X]ۀdr.IbYBUZ1/<Kq\	xtIs>Sujչ=,,B,Dd9xus!g;ϭAi5''.s�?}Q5geݾGON{}N
    Um>ۘBS35؎
    כwvJw>-T+''f6JwjԦi<ԞFζw"����IENDB`������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/job_fr.html���������������������������������������������������������������������0000644�0001750�0001750�00000007234�12143164237�016244� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=utf-8" />
        <title>Logback Home</title>
        <link rel="stylesheet" type="text/css" href="css/common.css" />
        <link rel="stylesheet" type="text/css" href="css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="css/_print.css" media="print" />
    
        <script type="text/javascript">
    
          var _gaq = _gaq || [];
          _gaq.push(['_setAccount', 'UA-9228687-3']);
          _gaq.push(['_trackPageview']);
    
          (function() {
          var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
          ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
          var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
          })();
        </script>
    
      </head>
      <body>
        <script type="text/javascript">prefix='';</script>
        <script src="templates/header.js" type="text/javascript"></script>
        <div id="left">
          <noscript>Please turn on Javascript to view this menu</noscript>
          <script src="templates/left.js" type="text/javascript"></script>
        </div>
    
        <div id="content">
    		
    
    		<h2>Ing&eacute;nieur Informatique</h2>
    
        <p>QoS.ch, ou Quality Open Software, est une soci&eacute;t&eacute;
        de conception et de d&eacute;veloppement informatique bas&eacute;e
        &agrave; Lausanne - Suisse.</p>
        
        <p>Nous avons une grande exp&eacute;rience dans la
        r&eacute;alisation de logiciels d'entreprise en langage Java. Nous
        sommes &eacute;galement fondateurs ou contributeurs actifs dans
        plusieurs projets open source, notamment cal10n, logback, log4j,
        mistletoe et SLF4J.
        </p>
    
        
        <p>Afin de compl&eacute;ter notre &eacute;quipe de
        d&eacute;veloppeurs pour la r&eacute;alisation de divers projets,
        autant open source que pour r&eacute;pondre aux demandes de nos
        clients, nous recherchons un ing&eacute;nieur informatique ayant
        une excellente capacit&eacute; de d&eacute;veloppement
        logiciel. 
        </p>
    
        <h3>Votre profil:</h3>
    
        <ul>
          <li>Formation universitaire ou jug&eacute;e
          &eacute;quivalente</li> 
    
          <li>Grande capacit&eacute; d'analyse et
          d'apprentissage</li> 
    
          <li>Capacit&eacute; de r&eacute;daction en anglais </li> 
    
          <li>Autonome et enthousiaste dans le d&eacute;veloppement</li>
          
    
          <li>Int&eacute;r&ecirc;t marqu&eacute; pour le
          d&eacute;veloppement collaboratif</li>
          </ul>
        
    
        <h3>Connaissances souhaitables:</h3>
    
        <ul>
          <li>Bonne exp&eacute;rience de programmation orient&eacute;
          objet, de pr&eacute;f&eacute;rence Java</li>
    
          <li>Connaissances de d&eacute;veloppement Web avec des outils
          tels que GWT, Struts, Vaadin, ou Wicket, </li>
    
          <li>Affinit&eacute; pour les m&eacute;thodologies agiles, en
          particulier le TDD</li>
        </ul>
    
    
        <p>Vous correspondez &agrave; ces crit&egrave;res et &ecirc;tes
        d&eacute;sireux de mettre &agrave; profit vos aptitudes, nous vous
        proposons un environnement dynamique et &eacute;volutif avec des
        conditions avantageuses.</p>
    
        <p>Merci de nous adresser votre dossier de candidature par email
        &agrave; l'adresse hr@qos.ch. Si possible joignez une liste des
        projets auxquels vous avez particip&eacute;.
        </p>
    
        <script src="templates/footer.js" type="text/javascript"></script>	
        </div>
      </body>
    </html>��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/license.html��������������������������������������������������������������������0000644�0001750�0001750�00000006401�12143164240�016412� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>License</title>
        <link rel="stylesheet" type="text/css" href="css/common.css" />
        <link rel="stylesheet" type="text/css" href="css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="css/_print.css" media="print" />
        
      </head>
      <body>
        <script type="text/javascript">prefix='';</script>
    
        <script src="templates/header.js" type="text/javascript"></script>
        <div id="left">
          <script src="templates/left.js" type="text/javascript"></script>
        </div>
        <div id="content">
          
        <div class="section">
          <h2>Logback License</h2>
        </div>
      
    
        <p>As of release 0.9.18, logback source code and binaries are
        dual-licensed under the EPL v1.0 and the LGPL 2.1, or more
        formally:</p>
    
        <p class="source">Logback: the reliable, generic, fast and flexible logging framework.
    Copyright (C) 1999-2012, QOS.ch. All rights reserved. 
    
    This program and the accompanying materials are dual-licensed under
    either the terms of the <a href="http://www.eclipse.org/legal/epl-v10.html">Eclipse Public License v1.0</a> as published by
    the Eclipse Foundation
     
      or (per the licensee's choosing)
     
    under the terms of the GNU <a href="http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html">Lesser General Public License version 2.1</a>
    as published by the Free Software Foundation.</p>
    
        <!-- =========================================== -->
        
        <p>The EPL/LGPL dual-license serves several purposes. The LGPL
        license ensures <em>continuity</em> in terms of licensing of the
        logback project. Prior to version 0.9.18, logback was licensed
        (exclusively) under the LGPL v2.1.  Moreover, since the EPL is
        deemed <a
        href="http://www.fsf.org/licensing/licenses/index_htm">incompatible</a>
        by the Free Software Foundation, the LGPL will allow various
        licensees, in particular software distributors who may be already
        bound by the terms of the GPL or the LGPL, to distribute our
        software.
        </p>
    
        <p>On the other hand, the EPL license will placate organizations
        which refuse certain restrictions imposed by the LGPL.
        </p>
        
        <p>Please note that logback-classic is intended to be used behind
        the SLF4J API, which is licensed under the <a
        href="http://www.slf4j.org/license.html">MIT license</a>.
        </p>
    
        <p>If you wish to make a significant contribution to the logback
        project, you are invited to file a <a href="cla.txt">Contributor
        License Agreement</a>. The purpose of this agreement is to
        formalize the terms of your contribution and to protect the
        project in case of litigation.
        </p>
    
        <p>Upon request, we may exempt open-source projects from LGPL and
        EPL's reciprocity clauses so that the said projects can develop
        logback extensions under the license of their choice. Exemptions
        are granted on a case by case basis.</p>
        
    <script src="templates/footer.js" type="text/javascript"></script>
    </div>
    </body>
    </html>
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/bridge.html���������������������������������������������������������������������0000644�0001750�0001750�00000002141�12143164237�016227� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/2000/REC-xhtml1-20000126/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
    <title>Log4j Bridge</title>
    
        <link rel="stylesheet" type="text/css" href="css/common.css" />
        <link rel="stylesheet" type="text/css" href="css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="css/_print.css" media="print" />
    
    
    </head>
    <body>
    	<script>
    prefix='';	
    </script>
    
    <script src="templates/header.js"></script>
    <div id="left">
      <script src="templates/left.js"></script>
    </div>
    <div id="right">
      <script src="templates/right.js"></script>
    </div>
    <div id="content">
    	
        <h2>Log4j bridge</h2>
        
        <p>This module has migrated into the SLF4J project, its original
        home. It has also been renamed as <a
        href="http://www.slf4j.org/legacy.html#log4j-over-slf4j">log4j-over-slf4j</a>.
        </p>
    	
    	
    <script src="templates/footer.js"></script>
    </div>
    </body>
    </html>
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/docs/documentation.html��������������������������������������������������������������0000644�0001750�0001750�00000012453�12143164237�017653� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
        <title>Documentation</title>
        <link rel="stylesheet" type="text/css" href="css/common.css" />
        <link rel="stylesheet" type="text/css" href="css/screen.css" media="screen" />
        <link rel="stylesheet" type="text/css" href="css/_print.css" media="print" />
      </head>
      <body>
    	<script type="text/javascript">prefix='';</script>
    
      <script src="templates/header.js" type="text/javascript"></script>
      <div id="left">
        <noscript>Please turn on Javascript to view this menu</noscript>
        <script src="templates/left.js" type="text/javascript"></script>
      </div>
      
      <div id="content">
      
        <h2>Logback documentation</h2>
    
    		<p>Below is a list of logback-related documentation currently
    		available.</p>
    
    		<ul>     
          <li><a href="manual/index.html"><b>The logback manual</b></a></li>
    
          <li><a href="reasonsToSwitch.html">Reasons to switch to logback
          from log4j</a></li>
    
    			<li>
    				<a href="access.html">An introduction to logback-access for Jetty
    				and Tomcat</a>
    			</li>
    
          <li><a href="recipes/index.html">Real-world inspired recipes</a></li>
    
          <li>
          	<a href="faq.html">A Frequently Asked Questions list (FAQ)</a>
          </li>
    
            <li>
          	<a href="codes.html">Logback error codes and their meanings</a>
          </li>
    
          <li>
          	<a href="dependencies.html">Dependencies per module</a>
          </li>
              
          <li>
            <a href="demo.html">Walk-through logback-demo web app</a>
          </li>    
          <li>
            <a href="beagle/index.html">Logback-beagle: eclipse plug-in for viewing logs</a>
          </li>    
    		</ul>
    		
    		<p>Source code related documentation:</p>
    		
    		<ul>
    			<li>
    				<a href="http://logback.qos.ch/apidocs/index.html"><b>Javadoc</b></a>
    			</li>
    			<li>
    				<a href="http://logback.qos.ch/xref/index.html">Source code</a>
    			</li>
    			<li>
    				<a href="http://logback.qos.ch/xref-test/index.html">Test classes source code</a>
    			</li>
    		</ul>
    		
        <h2>Articles and Presentations</h2>
    
        <!-- ordered by val -->
        <ul>
          <li><a
          href="https://wiki.base22.com/display/btg/How+to+setup+SLF4J+and+LOGBack+in+a+web+app+-+fast">How
          to setup SLF4J and logback in a web app - fast</a> by Cody Burleson
          </li>
         
          <li>
            <a
            href="http://wiki.eclipse.org/Jetty/Tutorial/Sifting_Logs_with_Logback">Jetty/Tutorial/Sifting
            Logs with Logback</a> by Shirly Dekker Boulay
          </li>
          <li>
            <a
            href="http://gordondickens.com/wordpress/2012/07/03/enterprise-spring-best-practices-part-1-project-config/">
              Enterprise Spring Best Practices - Part 1 - Project Config
            </a> by Gordon Dickens
          </li>
    
          <li>
            <a
            href="http://nurkiewicz.blogspot.ch/2013/04/siftingappender-logging-different.html">SiftingAppender:
            logging different threads to different log files</a> by Tomasz
            Nurkiewicz
          </li>
    
          <li>
            <a
            href="http://maciejwalkowiak.pl/blog/2012/04/03/application-errors-notification-with-logback/">Application
            errors notification with Logback</a> by Maciej Walkowiak
          </li>
          <li><a
          href="http://webtide.intalio.com/2011/08/sifting-logs-in-jetty-with-logback/">Sifting
          Logs in Jetty with Logback</a> by Joakim Erdfelt
          </li>
    
          <li><a
          href="http://www.nullin.com/2010/07/28/logging-tests-to-separate-files/">Logging
          tests to separate files</a> by Nalin Makar</li>
    
       
          <li><a href="logback.ppt">Logback project</a>, by Ceki
          G&#252;lc&#252; and S&eacute;bastien Pennec.
          </li>
    
          <li><a
          href="http://beta.parleys.com/#id=1701&st=5&sl=1"><b>Devoxx-2009
          video presentation</b></a>, by C. G&#252;lc&#252;
          </li>
    
          <li><a href="http://www.infoq.com/news/2007/08/logback">Logback:
          Evolving Java Logging</a> by Geoffrey Wiseman
          </li>
    
          <li><a
          href="http://ekkes-corner.blogspot.com/2008/10/index-blogseries-logging-in-osgi.html">Logging
          in OSGI Enterprise Applications</a>, by Ekkehard Gentz
          </li>
    
          <li><a
          href="http://blog.kornr.net/index.php/2008/12/09/understanding-the-osgi-logging-service">Understanding
          the OSGI logging service</a> by Nogunner</li>
    
          <li><a href="http://code.oixx.se/#post0">Logback in RCP
          application</a> by David Virdefors
    
          </li>
        </ul>
    
        <h4>In french</h4>
    
        <ul>
          <li><a
          href="http://www.insideit.fr/post/2009/11/23/SLF4J-LOGBack">SLF4J
          &amp; LOGBack : simplifiez-vous les logs</a> by Ludovic Meurillon
          </li>
    
    
          <li><a
          href="http://blog.xebia.fr/2010/07/07/java-en-production-les-fichiers-de-logs/">Java
          en Production - Les fichiers de logs</a> by Cyrille Le Clerc
          </li>
    
          <li>
          <a
          href="http://blog.courtine.org/2010/09/13/logback-ou-log4j/">Logback
          ou Log4J?</a> by Benoit Courtine
          </li>
    
        </ul>
    
        <script src="templates/footer.js" type="text/javascript"></script>
    </div>
    </body>
    </html>
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/���������������������������������������������������������������������0000755�0001750�0001750�00000000000�12203357067�016202� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/�����������������������������������������������������������������0000755�0001750�0001750�00000000000�11506604156�016770� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/������������������������������������������������������������0000755�0001750�0001750�00000000000�12133256242�017710� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/groovy/�����������������������������������������������������0000755�0001750�0001750�00000000000�11506604155�021240� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/groovy/ch/��������������������������������������������������0000755�0001750�0001750�00000000000�11506604155�021632� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/groovy/ch/qos/����������������������������������������������0000755�0001750�0001750�00000000000�11506604155�022434� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/groovy/ch/qos/logback/��������������������������������������0000755�0001750�0001750�00000000000�11506604155�024036� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/groovy/ch/qos/logback/classic/������������������������������0000755�0001750�0001750�00000000000�12136177166�025466� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/groovy/ch/qos/logback/classic/gaffer/�����������������������0000755�0001750�0001750�00000000000�12203357067�026713� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/groovy/ch/qos/logback/classic/gaffer/NestedType.groovy������0000644�0001750�0001750�00000001162�11377016712�032246� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2010, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.gaffer
    
    /**
     * @author Ceki G&uuml;c&uuml;
     */
    
    enum NestingType {
      NA, SINGLE, AS_COLLECTION;
    }
    
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000152�00000000000�011563� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/groovy/ch/qos/logback/classic/gaffer/ConfigurationDelegate.groovy�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/groovy/ch/qos/logback/classic/gaffer/ConfigurationDelegate.g0000644�0001750�0001750�00000021103�12143151241�033307� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2010, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.gaffer;
    
    
    import ch.qos.logback.classic.Level
    import ch.qos.logback.classic.Logger
    import ch.qos.logback.classic.LoggerContext
    import ch.qos.logback.classic.jmx.JMXConfigurator
    import ch.qos.logback.classic.jmx.MBeanUtil
    import ch.qos.logback.classic.net.ReceiverBase
    import ch.qos.logback.classic.turbo.ReconfigureOnChangeFilter
    import ch.qos.logback.classic.turbo.TurboFilter
    import ch.qos.logback.core.Appender
    import ch.qos.logback.core.CoreConstants
    import ch.qos.logback.core.spi.ContextAwareBase
    import ch.qos.logback.core.status.StatusListener
    import ch.qos.logback.core.util.CachingDateFormatter
    import ch.qos.logback.core.util.Duration
    import ch.qos.logback.core.spi.LifeCycle
    import ch.qos.logback.core.spi.ContextAware
    
    import javax.management.MalformedObjectNameException
    import javax.management.ObjectName
    import java.lang.management.ManagementFactory
    
    /**
     * @author Ceki G&uuml;c&uuml;
     */
    
    public class ConfigurationDelegate extends ContextAwareBase {
    
      List<Appender> appenderList = [];
    
      Object getDeclaredOrigin() {
        return this;
      }
    
    
    
    
      void scan(String scanPeriodStr = null) {
        ReconfigureOnChangeFilter rocf = new ReconfigureOnChangeFilter();
        rocf.setContext(context);
        if (scanPeriodStr) {
          try {
            Duration duration = Duration.valueOf(scanPeriodStr);
            rocf.setRefreshPeriod(duration.getMilliseconds());
            addInfo("Setting ReconfigureOnChangeFilter scanning period to "
                    + duration);
          } catch (NumberFormatException nfe) {
            addError("Error while converting [" + scanAttrib + "] to long", nfe);
          }
        }
        rocf.start();
        addInfo("Adding ReconfigureOnChangeFilter as a turbo filter");
        context.addTurboFilter(rocf);
      }
    
      void statusListener(Class listenerClass) {
        StatusListener statusListener = listenerClass.newInstance()
        context.statusManager.add(statusListener)
        if(statusListener instanceof ContextAware) {
          ((ContextAware) statusListener).setContext(context);
        }
        if(statusListener instanceof LifeCycle) {
          ((LifeCycle) statusListener).start();
        }
        addInfo("Added status listener of type [${listenerClass.canonicalName}]");
      }
    
      void conversionRule(String conversionWord, Class converterClass) {
        String converterClassName = converterClass.getName();
    
        Map<String, String> ruleRegistry = (Map) context.getObject(CoreConstants.PATTERN_RULE_REGISTRY);
        if (ruleRegistry == null) {
          ruleRegistry = new HashMap<String, String>();
          context.putObject(CoreConstants.PATTERN_RULE_REGISTRY, ruleRegistry);
        }
        // put the new rule into the rule registry
        addInfo("registering conversion word " + conversionWord + " with class [" + converterClassName + "]");
        ruleRegistry.put(conversionWord, converterClassName);
      }
    
      void root(Level level, List<String> appenderNames = []) {
        if (level == null) {
          addError("Root logger cannot be set to level null");
        } else {
          logger(org.slf4j.Logger.ROOT_LOGGER_NAME, level, appenderNames);
        }
      }
    
      void logger(String name, Level level, List<String> appenderNames = [], Boolean additivity = null) {
        if (name) {
          Logger logger = ((LoggerContext) context).getLogger(name);
          logger.level = level;
    
          if (appenderNames) {
            appenderNames.each { aName ->
              Appender appender = appenderList.find { it -> it.name == aName };
              if (appender != null) {
                logger.addAppender(appender);
              } else {
                addError("Failed to find appender named [${aName}]");
              }
            }
          }
    
          if (additivity != null) {
            logger.additive = additivity;
          }
        } else {
          addInfo("No name attribute for logger");
        }
      }
    
      void appender(String name, Class clazz, Closure closure = null) {
        addInfo("About to instantiate appender of type [" + clazz.name + "]");
        Appender appender = clazz.newInstance();
        addInfo("Naming appender as [" + name + "]");
        appender.name = name
        appender.context = context
        appenderList.add(appender)
        if (closure != null) {
          AppenderDelegate ad = new AppenderDelegate(appender);
          copyContributions(ad, appender)
          ad.context = context;
          closure.delegate = ad;
          closure.resolveStrategy = Closure.DELEGATE_FIRST
          closure();
        }
        try {
          appender.start()
        } catch (RuntimeException e) {
          addError("Failed to start apppender named [" + name + "]", e)
        }
      }
    
      void receiver(String name, Class aClass, Closure closure = null) {
        addInfo("About to instantiate receiver of type [" + clazz.name + "]");
        ReceiverBase receiver = aClass.newInstance();
        receiver.context = context;
        if(closure != null) {
          ComponentDelegate componentDelegate = new ComponentDelegate(receiver);
          componentDelegate.context = context;
          closure.delegate = componentDelegate;
          closure.resolveStrategy = Closure.DELEGATE_FIRST
          closure();
        }
        try {
          receiver.start()
        } catch (RuntimeException e) {
          addError("Failed to start receiver of type [" + aClass.getName() + "]", e)
        }
      }
    
      private void copyContributions(AppenderDelegate appenderDelegate, Appender appender) {
        if (appender instanceof ConfigurationContributor) {
          ConfigurationContributor cc = (ConfigurationContributor) appender;
          cc.getMappings().each() { oldName, newName ->
            appenderDelegate.metaClass."${newName}" = appender.&"$oldName"
          }
        }
      }
    
      void turboFilter(Class clazz, Closure closure = null) {
        addInfo("About to instantiate turboFilter of type [" + clazz.name + "]");
        TurboFilter turboFilter = clazz.newInstance();
        turboFilter.context = context
    
        if (closure != null) {
          ComponentDelegate componentDelegate = new ComponentDelegate(turboFilter);
          componentDelegate.context = context;
          closure.delegate = componentDelegate;
          closure.resolveStrategy = Closure.DELEGATE_FIRST
          closure();
        }
        turboFilter.start();
        addInfo("Adding aforementioned turbo filter to context");
        context.addTurboFilter(turboFilter)
      }
    
      String timestamp(String datePattern, long timeReference = -1) {
        long now = -1;
    
        if (timeReference == -1) {
          addInfo("Using current interpretation time, i.e. now, as time reference.");
          now = System.currentTimeMillis()
        } else {
          now = timeReference
          addInfo("Using " + now + " as time reference.");
        }
        CachingDateFormatter sdf = new CachingDateFormatter(datePattern);
        sdf.format(now)
      }
    
        /**
         * Creates and registers a {@link JMXConfigurator} with the platform MBean Server.
         * Allows specifying a custom context name to derive the used ObjectName, or a complete
         * ObjectName string representation to determine your own (the syntax automatically determines the intent).
         *
         * @param name custom context name or full ObjectName string representation (defaults to null)
         */
      void jmxConfigurator(String name = null) {
        def objectName = null
        def contextName = context.name
        if (name != null) {
          // check if this is a valid ObjectName
          try {
            objectName = new ObjectName(name)
          } catch (MalformedObjectNameException e) {
            contextName = name
          }
        }
        if (objectName == null) {
          def objectNameAsStr = MBeanUtil.getObjectNameFor(contextName, JMXConfigurator.class)
          objectName = MBeanUtil.string2ObjectName(context, this, objectNameAsStr)
          if (objectName == null) {
            addError("Failed to construct ObjectName for [${objectNameAsStr}]")
            return
          }
        }
    
        def platformMBeanServer = ManagementFactory.platformMBeanServer
        if (!MBeanUtil.isRegistered(platformMBeanServer, objectName)) {
          JMXConfigurator jmxConfigurator = new JMXConfigurator((LoggerContext) context, platformMBeanServer, objectName)
          try {
            platformMBeanServer.registerMBean(jmxConfigurator, objectName)
          } catch (all) {
            addError("Failed to create mbean", all)
          }
        }
      }
    
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000146�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/groovy/ch/qos/logback/classic/gaffer/ComponentDelegate.groovy���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/groovy/ch/qos/logback/classic/gaffer/ComponentDelegate.groov0000644�0001750�0001750�00000010753�12136042271�033365� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2010, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.gaffer
    
    import ch.qos.logback.core.spi.ContextAwareBase
    import ch.qos.logback.core.spi.LifeCycle
    import ch.qos.logback.core.spi.ContextAware
    import ch.qos.logback.core.joran.spi.NoAutoStartUtil
    
    /**
     * @author Ceki G&uuml;c&uuml;
     */
    class ComponentDelegate extends ContextAwareBase {
    
      final Object component;
    
      final List fieldsToCascade = [];
    
      ComponentDelegate(Object component) {
        this.component = component;
      }
    
      String getLabel() { "component" }
    
      String getLabelFistLetterInUpperCase() { getLabel()[0].toUpperCase() + getLabel().substring(1) }
    
      void methodMissing(String name, def args) {
        NestingType nestingType = PropertyUtil.nestingType(component, name);
        if (nestingType == NestingType.NA) {
          addError("${getLabelFistLetterInUpperCase()} ${getComponentName()} of type [${component.getClass().canonicalName}] has no appplicable [${name}] property ")
          return;
        }
    
        String subComponentName
        Class clazz
        Closure closure
        (subComponentName, clazz, closure) = analyzeArgs(args)
        if (clazz != null) {
          Object subComponent = clazz.newInstance()
          if (subComponentName && subComponent.hasProperty(name)) {
            subComponent.name = subComponentName;
          }
          if (subComponent instanceof ContextAware) {
            subComponent.context = context;
          }
          if (closure) {
            ComponentDelegate subDelegate = new ComponentDelegate(subComponent)
    
            cascadeFields(subDelegate)
            subDelegate.context = context
            injectParent(subComponent)
            closure.delegate = subDelegate
            closure.resolveStrategy = Closure.DELEGATE_FIRST
            closure()
          }
          if (subComponent instanceof LifeCycle && NoAutoStartUtil.notMarkedWithNoAutoStart(subComponent)) {
            subComponent.start();
          }
          PropertyUtil.attach(nestingType, component, subComponent, name)
        } else {
          addError("No 'class' argument specified for [${name}] in ${getLabel()} ${getComponentName()} of type [${component.getClass().canonicalName}]");
        }
      }
    
      void cascadeFields(ComponentDelegate subDelegate) {
        for (String k: fieldsToCascade) {
          subDelegate.metaClass."${k}" = this."${k}"
        }
      }
    
      void injectParent(Object subComponent) {
        if(subComponent.hasProperty("parent")) {
          subComponent.parent = component;
        }
      }
    
      void propertyMissing(String name, def value) {
        NestingType nestingType = PropertyUtil.nestingType(component, name);
        if (nestingType == NestingType.NA) {
          addError("${getLabelFistLetterInUpperCase()} ${getComponentName()} of type [${component.getClass().canonicalName}] has no appplicable [${name}] property ")
          return;
        }
        PropertyUtil.attach(nestingType, component, value, name)
      }
    
    
      def analyzeArgs(Object[] args) {
        String name;
        Class clazz;
        Closure closure;
    
        if (args.size() > 3) {
          addError("At most 3 arguments allowed but you passed $args")
          return [name, clazz, closure]
        }
    
        if (args[-1] instanceof Closure) {
          closure = args[-1]
          args -= args[-1]
        }
    
        if (args.size() == 1) {
          clazz = parseClassArgument(args[0])
        }
    
        if (args.size() == 2) {
          name = parseNameArgument(args[0])
          clazz = parseClassArgument(args[1])
        }
    
        return [name, clazz, closure]
      }
    
      Class parseClassArgument(arg) {
        if (arg instanceof Class) {
          return arg
        } else if (arg instanceof String) {
          return Class.forName(arg)
        } else {
          addError("Unexpected argument type ${arg.getClass().canonicalName}")
          return null;
        }
      }
    
      String parseNameArgument(arg) {
        if (arg instanceof String) {
          return arg
        } else {
          addError("With 2 or 3 arguments, the first argument must be the component name, i.e of type string")
          return null;
        }
      }
    
      String getComponentName() {
        if (component.hasProperty("name"))
          return "[${component.name}]"
        else
          return ""
    
      }
    }���������������������logback_1.0.13/logback-classic/src/main/groovy/ch/qos/logback/classic/gaffer/PropertyUtil.groovy����0000644�0001750�0001750�00000004125�11377016712�032646� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2010, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.gaffer
    
    import java.lang.reflect.Method
    import java.beans.Introspector
    
    /**
     * @author Ceki G&uuml;c&uuml;
     */
    class PropertyUtil {
    
      static boolean hasAdderMethod(Object obj, String name) {
        String addMethod = "add${upperCaseFirstLetter(name)}";
        return obj.metaClass.respondsTo(obj, addMethod);
      }
    
      static NestingType nestingType(Object obj, String name) {
        def decapitalizedName = Introspector.decapitalize(name)
        if (obj.hasProperty(decapitalizedName)) {
          return NestingType.SINGLE;
        }
        if (hasAdderMethod(obj, name)) {
          return NestingType.AS_COLLECTION;
        }
        return NestingType.NA;
      }
    
      static void attach(NestingType nestingType, Object component, Object subComponent, String name) {
        switch (nestingType) {
          case NestingType.SINGLE:
            name = Introspector.decapitalize(name)
            component."${name}" = subComponent;
            break;
          case NestingType.AS_COLLECTION:
            String firstUpperName = PropertyUtil.upperCaseFirstLetter(name)
            component."add${firstUpperName}"(subComponent);
            break;
        }
      }
    
      static String transformFirstLetter(String s, Closure closure) {
        if (s == null || s.length() == 0)
          return s;
    
        String firstLetter = new String(s.getAt(0));
    
        String modifiedFistLetter = closure(firstLetter);
    
        if (s.length() == 1)
          return modifiedFistLetter
        else
          return modifiedFistLetter + s.substring(1);
    
      }
    
      static String upperCaseFirstLetter(String s) {
        return transformFirstLetter(s, {String it -> it.toUpperCase()})
      }
    
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000147�00000000000�011567� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/groovy/ch/qos/logback/classic/gaffer/GafferConfigurator.groovy��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/groovy/ch/qos/logback/classic/gaffer/GafferConfigurator.groo0000644�0001750�0001750�00000005730�12136177166�033372� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2010, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.gaffer
    
    import ch.qos.logback.classic.Level
    import ch.qos.logback.classic.LoggerContext
    import ch.qos.logback.classic.encoder.PatternLayoutEncoder
    import ch.qos.logback.classic.sift.SiftingAppender
    import ch.qos.logback.core.util.ContextUtil
    
    import ch.qos.logback.core.joran.util.ConfigurationWatchListUtil
    import org.codehaus.groovy.control.CompilerConfiguration
    import org.codehaus.groovy.control.customizers.ImportCustomizer
    
    class GafferConfigurator {
    
      LoggerContext context
                             
      GafferConfigurator(LoggerContext context) {
        this.context = context
      }
    
      protected void informContextOfURLUsedForConfiguration(URL url) {
        ConfigurationWatchListUtil.setMainWatchURL(context, url);
      }
    
      void run(URL url) {
        informContextOfURLUsedForConfiguration(url);
        run(url.text);
      }
    
      void run(File file) {
        informContextOfURLUsedForConfiguration(file.toURI().toURL());
        run(file.text);
      }
    
      void run(String dslText) {
        Binding binding = new Binding();
        binding.setProperty("hostname", ContextUtil.localHostName);
    
        def configuration = new CompilerConfiguration()
        configuration.addCompilationCustomizers(importCustomizer())
    
        // caller data should take into account groovy frames
        new ContextUtil(context).addGroovyPackages(context.getFrameworkPackages());
    
        Script dslScript = new GroovyShell(binding, configuration).parse(dslText)
    
        dslScript.metaClass.mixin(ConfigurationDelegate)
        dslScript.setContext(context)
        dslScript.metaClass.getDeclaredOrigin = { dslScript }
    
        dslScript.run()
      }
    
      protected ImportCustomizer importCustomizer() {
        def customizer = new ImportCustomizer()
    
    
        def core = 'ch.qos.logback.core'
        customizer.addStarImports(core, "${core}.encoder", "${core}.read", "${core}.rolling", "${core}.status",
                "ch.qos.logback.classic.net")
    
        customizer.addImports(PatternLayoutEncoder.class.name)
    
        customizer.addStaticStars(Level.class.name)
    
        customizer.addStaticImport('off', Level.class.name, 'OFF')
        customizer.addStaticImport('error', Level.class.name, 'ERROR')
        customizer.addStaticImport('warn', Level.class.name, 'WARN')
        customizer.addStaticImport('info', Level.class.name, 'INFO')
        customizer.addStaticImport('debug', Level.class.name, 'DEBUG')
        customizer.addStaticImport('trace', Level.class.name, 'TRACE')
        customizer.addStaticImport('all', Level.class.name, 'ALL')
    
        customizer
      }
    
    }����������������������������������������logback_1.0.13/logback-classic/src/main/groovy/ch/qos/logback/classic/gaffer/AppenderDelegate.groovy0000644�0001750�0001750�00000001477�12136042142�033352� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.gaffer
    
    import ch.qos.logback.core.Appender
    import ch.qos.logback.core.spi.ContextAwareBase
    
    /**
     * @author Ceki G&uuml;c&uuml;
     */
    class AppenderDelegate extends ComponentDelegate {
    
      AppenderDelegate(Appender appender) {
        super(appender)
      }
    
      String getLabel() {
        "appender"  
      }
    
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000155�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/groovy/ch/qos/logback/classic/gaffer/ConfigurationContributor.groovy��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/groovy/ch/qos/logback/classic/gaffer/ConfigurationContributo0000644�0001750�0001750�00000001666�11377016712�033527� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2010, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.gaffer
    
    /**
     * @author Ceki G&uuml;c&uuml;
     */
    public interface ConfigurationContributor {
    
      /**
       * The list of method mapping from the contributor into the configuration mechanism,
       * e.g. the ConfiguratorDelegate
       *
       * <p>The key in the map is the method being contributed and the value is the name of
       * the method in the target class.
       * @return
       */
      public Map<String, String> getMappings()
    
    }
    ��������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/groovy/ch/qos/logback/classic/boolex/�����������������������0000755�0001750�0001750�00000000000�12203357067�026751� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000146�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/groovy/ch/qos/logback/classic/boolex/EvaluatorTemplate.groovy���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/groovy/ch/qos/logback/classic/boolex/EvaluatorTemplate.groov0000644�0001750�0001750�00000002205�11652530046�033461� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2010, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.boolex
    
    import ch.qos.logback.classic.spi.ILoggingEvent
    
    import static ch.qos.logback.classic.Level.TRACE;
    import static ch.qos.logback.classic.Level.DEBUG;
    import static ch.qos.logback.classic.Level.INFO;
    import static ch.qos.logback.classic.Level.WARN;
    import static ch.qos.logback.classic.Level.ERROR;
    
    // WARNING
    // If this file is renamed, this should be reflected in
    // logback-classic/pom.xml  resources section.
    
    /**
     * @author Ceki G&uuml;c&uuml;
     */
    public class EvaluatorTemplate implements IEvaluator {
    
      boolean doEvaluate(ILoggingEvent event) {
        ILoggingEvent e = event;
        //EXPRESSION
      }
    
    
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/�������������������������������������������������������0000755�0001750�0001750�00000000000�11701357673�020643� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/org/���������������������������������������������������0000755�0001750�0001750�00000000000�11506604156�021424� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/org/slf4j/���������������������������������������������0000755�0001750�0001750�00000000000�12203357067�022447� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/org/slf4j/package.html���������������������������������0000644�0001750�0001750�00000000523�11377016712�024730� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
    
    <html> 
      <head>
        <title></title>
      </head>
      
      <body>
        
        <p>Contains SLF4J implementations binding logback classes to the SLF4J framework. The
        complete javadoc for SLF4J can be found on the <a href="http://www.slf4j.org">SLF4J website</a>.</p>
    
      </body> 
    </html>�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/org/slf4j/impl/����������������������������������������0000755�0001750�0001750�00000000000�12203357067�023410� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/org/slf4j/impl/StaticMDCBinder.java��������������������0000644�0001750�0001750�00000002272�12136042271�027146� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package org.slf4j.impl;
    
    import org.slf4j.spi.MDCAdapter;
    
    import ch.qos.logback.classic.util.LogbackMDCAdapter;
    
    
    /**
     * This implementation is bound to {@link LogbackMDCAdapter}.
     *
     * @author Ceki G&uuml;lc&uuml;
     */
    public class StaticMDCBinder {
    
      
      /**
       * The unique instance of this class.
       */
      public static final StaticMDCBinder SINGLETON = new StaticMDCBinder();
    
      private StaticMDCBinder() {
      }
      
      /**
       * Currently this method always returns an instance of 
       * {@link StaticMDCBinder}.
       */
      public MDCAdapter getMDCA() {
         return new LogbackMDCAdapter();
      }
      
      public String  getMDCAdapterClassStr() {
        return LogbackMDCAdapter.class.getName();
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/org/slf4j/impl/StaticLoggerBinder.java�����������������0000644�0001750�0001750�00000007206�12136042271�027764� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package org.slf4j.impl;
    
    import ch.qos.logback.core.status.StatusUtil;
    import org.slf4j.ILoggerFactory;
    import org.slf4j.LoggerFactory;
    import org.slf4j.helpers.Util;
    import org.slf4j.spi.LoggerFactoryBinder;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.util.ContextInitializer;
    import ch.qos.logback.classic.util.ContextSelectorStaticBinder;
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.util.StatusPrinter;
    
    /**
     * 
     * The binding of {@link LoggerFactory} class with an actual instance of
     * {@link ILoggerFactory} is performed using information returned by this class.
     * 
     * @author Ceki G&uuml;lc&uuml;</a>
     */
    public class StaticLoggerBinder implements LoggerFactoryBinder {
    
      /**
       * Declare the version of the SLF4J API this implementation is compiled
       * against. The value of this field is usually modified with each release.
       */
      // to avoid constant folding by the compiler, this field must *not* be final
      public static String REQUESTED_API_VERSION = "1.6"; // !final
    
      final static String NULL_CS_URL = CoreConstants.CODES_URL + "#null_CS";
    
      /**
       * The unique instance of this class.
       */
      private static StaticLoggerBinder SINGLETON = new StaticLoggerBinder();
    
      private static Object KEY = new Object();
    
      static {
        SINGLETON.init();
      }
    
      private boolean initialized = false;
      private LoggerContext defaultLoggerContext = new LoggerContext();
      private final ContextSelectorStaticBinder contextSelectorBinder = ContextSelectorStaticBinder
          .getSingleton();
    
      private StaticLoggerBinder() {
        defaultLoggerContext.setName(CoreConstants.DEFAULT_CONTEXT_NAME);
      }
    
      public static StaticLoggerBinder getSingleton() {
        return SINGLETON;
      }
    
      /**
       * Package access for testing purposes.
       */
      static void reset() {
        SINGLETON = new StaticLoggerBinder();
        SINGLETON.init();
      }
    
      /**
       * Package access for testing purposes.
       */
      void init() {
        try {
          try {
            new ContextInitializer(defaultLoggerContext).autoConfig();
          } catch (JoranException je) {
            Util.report("Failed to auto configure default logger context", je);
          }
          // logback-292
          if(!StatusUtil.contextHasStatusListener(defaultLoggerContext)) {
            StatusPrinter.printInCaseOfErrorsOrWarnings(defaultLoggerContext);
          }
          contextSelectorBinder.init(defaultLoggerContext, KEY);
          initialized = true;
        } catch (Throwable t) {
          // we should never get here
          Util.report("Failed to instantiate [" + LoggerContext.class.getName()
              + "]", t);
        }
      }
    
      public ILoggerFactory getLoggerFactory() {
        if (!initialized) {
          return defaultLoggerContext;
        }
    
        if (contextSelectorBinder.getContextSelector() == null) {
          throw new IllegalStateException(
              "contextSelector cannot be null. See also " + NULL_CS_URL);
        }
        return contextSelectorBinder.getContextSelector().getLoggerContext();
      }
    
      public String getLoggerFactoryClassStr() {
        return contextSelectorBinder.getClass().getName();
      }
    
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/org/slf4j/impl/StaticMarkerBinder.java�����������������0000644�0001750�0001750�00000003104�12136042271�027757� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package org.slf4j.impl;
    
    import org.slf4j.IMarkerFactory;
    import org.slf4j.MarkerFactory;
    import org.slf4j.helpers.BasicMarkerFactory;
    import org.slf4j.spi.MarkerFactoryBinder;
    
    /**
     * 
     * The binding of {@link MarkerFactory} class with an actual instance of 
     * {@link IMarkerFactory} is performed using information returned by this class. 
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public class StaticMarkerBinder implements MarkerFactoryBinder {
    
      /**
       * The unique instance of this class.
       */
      public static final StaticMarkerBinder SINGLETON = new StaticMarkerBinder();
      
      final IMarkerFactory markerFactory = new BasicMarkerFactory();
      
      private StaticMarkerBinder() {
      }
      
      /**
       * Currently this method always returns an instance of 
       * {@link BasicMarkerFactory}.
       */
      public IMarkerFactory getMarkerFactory() {
        return markerFactory;
      }
      
      /**
       * Currently, this method returns the class name of
       * {@link BasicMarkerFactory}.
       */
      public String getMarkerFactoryClassStr() {
        return BasicMarkerFactory.class.getName();
      }
      
      
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/����������������������������������������������������0000755�0001750�0001750�00000000000�11506604155�021226� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/������������������������������������������������0000755�0001750�0001750�00000000000�11506604155�022030� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/����������������������������������������0000755�0001750�0001750�00000000000�11506604155�023432� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/��������������������������������0000755�0001750�0001750�00000000000�12203357067�025055� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/LoggerContext.java��������������0000644�0001750�0001750�00000026536�12140150756�030514� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic;
    
    import java.util.*;
    import java.util.concurrent.ConcurrentHashMap;
    
    import ch.qos.logback.classic.util.LoggerNameUtil;
    import org.slf4j.ILoggerFactory;
    import org.slf4j.Marker;
    
    import ch.qos.logback.classic.spi.LoggerComparator;
    import ch.qos.logback.classic.spi.LoggerContextListener;
    import ch.qos.logback.classic.spi.LoggerContextVO;
    import ch.qos.logback.classic.spi.TurboFilterList;
    import ch.qos.logback.classic.turbo.TurboFilter;
    import ch.qos.logback.core.ContextBase;
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.spi.FilterReply;
    import ch.qos.logback.core.spi.LifeCycle;
    import ch.qos.logback.core.status.StatusListener;
    import ch.qos.logback.core.status.StatusManager;
    import ch.qos.logback.core.status.WarnStatus;
    
    /**
     * LoggerContext glues many of the logback-classic components together. In
     * principle, every logback-classic component instance is attached either
     * directly or indirectly to a LoggerContext instance. Just as importantly
     * LoggerContext implements the {@link ILoggerFactory} acting as the
     * manufacturing source of {@link Logger} instances.
     *
     * @author Ceki Gulcu
     */
    public class LoggerContext extends ContextBase implements ILoggerFactory,
            LifeCycle {
    
      final Logger root;
      private int size;
      private int noAppenderWarning = 0;
      final private List<LoggerContextListener> loggerContextListenerList = new ArrayList<LoggerContextListener>();
    
      private Map<String, Logger> loggerCache;
    
      private LoggerContextVO loggerContextRemoteView;
      private final TurboFilterList turboFilterList = new TurboFilterList();
      private boolean packagingDataEnabled = true;
    
      private int maxCallerDataDepth = ClassicConstants.DEFAULT_MAX_CALLEDER_DATA_DEPTH;
    
      int resetCount = 0;
      private List<String> frameworkPackages;
    
      public LoggerContext() {
        super();
        this.loggerCache = new ConcurrentHashMap<String, Logger>();
    
        this.loggerContextRemoteView = new LoggerContextVO(this);
        this.root = new Logger(Logger.ROOT_LOGGER_NAME, null, this);
        this.root.setLevel(Level.DEBUG);
        loggerCache.put(Logger.ROOT_LOGGER_NAME, root);
        initEvaluatorMap();
        size = 1;
        this.frameworkPackages = new ArrayList<String>();
      }
    
      void initEvaluatorMap() {
        putObject(CoreConstants.EVALUATOR_MAP, new HashMap());
      }
    
      /**
       * A new instance of LoggerContextRemoteView needs to be created each time the
       * name or propertyMap (including keys or values) changes.
       */
      private void updateLoggerContextVO() {
        loggerContextRemoteView = new LoggerContextVO(this);
      }
    
      @Override
      public void putProperty(String key, String val) {
        super.putProperty(key, val);
        updateLoggerContextVO();
      }
    
      @Override
      public void setName(String name) {
        super.setName(name);
        updateLoggerContextVO();
      }
    
      public final Logger getLogger(final Class clazz) {
        return getLogger(clazz.getName());
      }
    
      public final Logger getLogger(final String name) {
    
        if (name == null) {
          throw new IllegalArgumentException("name argument cannot be null");
        }
    
        // if we are asking for the root logger, then let us return it without
        // wasting time
        if (Logger.ROOT_LOGGER_NAME.equalsIgnoreCase(name)) {
          return root;
        }
    
        int i = 0;
        Logger logger = root;
    
        // check if the desired logger exists, if it does, return it
        // without further ado.
        Logger childLogger = (Logger) loggerCache.get(name);
        // if we have the child, then let us return it without wasting time
        if (childLogger != null) {
          return childLogger;
        }
    
        // if the desired logger does not exist, them create all the loggers
        // in between as well (if they don't already exist)
        String childName;
        while (true) {
          int h = LoggerNameUtil.getSeparatorIndexOf(name, i);
          if (h == -1) {
            childName = name;
          } else {
            childName = name.substring(0, h);
          }
          // move i left of the last point
          i = h + 1;
          synchronized (logger) {
            childLogger = logger.getChildByName(childName);
            if (childLogger == null) {
              childLogger = logger.createChildByName(childName);
              loggerCache.put(childName, childLogger);
              incSize();
            }
          }
          logger = childLogger;
          if (h == -1) {
            return childLogger;
          }
        }
      }
    
      private void incSize() {
        size++;
      }
    
      int size() {
        return size;
      }
    
      /**
       * Check if the named logger exists in the hierarchy. If so return its
       * reference, otherwise returns <code>null</code>.
       *
       * @param name the name of the logger to search for.
       */
      public Logger exists(String name) {
        return (Logger) loggerCache.get(name);
      }
    
      final void noAppenderDefinedWarning(final Logger logger) {
        if (noAppenderWarning++ == 0) {
          getStatusManager().add(
                  new WarnStatus("No appenders present in context [" + getName()
                          + "] for logger [" + logger.getName() + "].", logger));
        }
      }
    
      public List<Logger> getLoggerList() {
        Collection<Logger> collection = loggerCache.values();
        List<Logger> loggerList = new ArrayList<Logger>(collection);
        Collections.sort(loggerList, new LoggerComparator());
        return loggerList;
      }
    
      public LoggerContextVO getLoggerContextRemoteView() {
        return loggerContextRemoteView;
      }
    
      public void setPackagingDataEnabled(boolean packagingDataEnabled) {
        this.packagingDataEnabled = packagingDataEnabled;
      }
    
      public boolean isPackagingDataEnabled() {
        return packagingDataEnabled;
      }
    
      /**
       * This method clears all internal properties, except internal status messages,
       * closes all appenders, removes any turboFilters, fires an OnReset event,
       * removes all status listeners, removes all context listeners
       * (except those which are reset resistant).
       * <p/>
       * As mentioned above, internal status messages survive resets.
       */
      @Override
      public void reset() {
        resetCount++;
        super.reset();
        initEvaluatorMap();
        root.recursiveReset();
        resetTurboFilterList();
        fireOnReset();
        resetListenersExceptResetResistant();
        resetStatusListeners();
      }
    
      private void resetStatusListeners() {
        StatusManager sm = getStatusManager();
        for (StatusListener sl : sm.getCopyOfStatusListenerList()) {
          sm.remove(sl);
        }
      }
    
      public TurboFilterList getTurboFilterList() {
        return turboFilterList;
      }
    
      public void addTurboFilter(TurboFilter newFilter) {
        turboFilterList.add(newFilter);
      }
    
      /**
       * First processPriorToRemoval all registered turbo filters and then clear the registration
       * list.
       */
      public void resetTurboFilterList() {
        for (TurboFilter tf : turboFilterList) {
          tf.stop();
        }
        turboFilterList.clear();
      }
    
      final FilterReply getTurboFilterChainDecision_0_3OrMore(final Marker marker,
                                                              final Logger logger, final Level level, final String format,
                                                              final Object[] params, final Throwable t) {
        if (turboFilterList.size() == 0) {
          return FilterReply.NEUTRAL;
        }
        return turboFilterList.getTurboFilterChainDecision(marker, logger, level,
                format, params, t);
      }
    
      final FilterReply getTurboFilterChainDecision_1(final Marker marker,
                                                      final Logger logger, final Level level, final String format,
                                                      final Object param, final Throwable t) {
        if (turboFilterList.size() == 0) {
          return FilterReply.NEUTRAL;
        }
        return turboFilterList.getTurboFilterChainDecision(marker, logger, level,
                format, new Object[]{param}, t);
      }
    
      final FilterReply getTurboFilterChainDecision_2(final Marker marker,
                                                      final Logger logger, final Level level, final String format,
                                                      final Object param1, final Object param2, final Throwable t) {
        if (turboFilterList.size() == 0) {
          return FilterReply.NEUTRAL;
        }
        return turboFilterList.getTurboFilterChainDecision(marker, logger, level,
                format, new Object[]{param1, param2}, t);
      }
    
      // === start listeners ==============================================
      public void addListener(LoggerContextListener listener) {
        loggerContextListenerList.add(listener);
      }
    
      public void removeListener(LoggerContextListener listener) {
        loggerContextListenerList.remove(listener);
      }
    
      private void resetListenersExceptResetResistant() {
        List<LoggerContextListener> toRetain = new ArrayList<LoggerContextListener>();
    
        for (LoggerContextListener lcl : loggerContextListenerList) {
          if (lcl.isResetResistant()) {
            toRetain.add(lcl);
          }
        }
        loggerContextListenerList.retainAll(toRetain);
      }
    
      private void resetAllListeners() {
        loggerContextListenerList.clear();
      }
    
      public List<LoggerContextListener> getCopyOfListenerList() {
        return new ArrayList<LoggerContextListener>(loggerContextListenerList);
      }
    
      void fireOnLevelChange(Logger logger, Level level) {
        for (LoggerContextListener listener : loggerContextListenerList) {
          listener.onLevelChange(logger, level);
        }
      }
    
      private void fireOnReset() {
        for (LoggerContextListener listener : loggerContextListenerList) {
          listener.onReset(this);
        }
      }
    
      private void fireOnStart() {
        for (LoggerContextListener listener : loggerContextListenerList) {
          listener.onStart(this);
        }
      }
    
      private void fireOnStop() {
        for (LoggerContextListener listener : loggerContextListenerList) {
          listener.onStop(this);
        }
      }
    
      // === end listeners ==============================================
    
      public void start() {
        super.start();
        fireOnStart();
      }
    
      public void stop() {
        reset();
        fireOnStop();
        resetAllListeners();
        super.stop();
      }
    
      @Override
      public String toString() {
        return this.getClass().getName() + "[" + getName() + "]";
      }
    
      public int getMaxCallerDataDepth() {
        return maxCallerDataDepth;
      }
    
      public void setMaxCallerDataDepth(int maxCallerDataDepth) {
        this.maxCallerDataDepth = maxCallerDataDepth;
      }
    
      /**
       * List of packages considered part of the logging framework such that they are never considered
       * as callers of the logging framework. This list used to compute the caller for logging events.
       * <p/>
       * To designate package "com.foo" as well as all its subpackages as being part of the logging framework, simply add
       * "com.foo" to this list.
       *
       * @return list of framework packages
       */
      public List<String> getFrameworkPackages() {
        return frameworkPackages;
      }
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/jmx/����������������������������0000755�0001750�0001750�00000000000�12203357067�025653� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/jmx/MBeanUtil.java��������������0000644�0001750�0001750�00000006102�12136042271�030326� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.jmx;
    
    import javax.management.InstanceNotFoundException;
    import javax.management.MBeanRegistrationException;
    import javax.management.MBeanServer;
    import javax.management.MalformedObjectNameException;
    import javax.management.ObjectName;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.status.StatusUtil;
    
    public class MBeanUtil {
    
      static final String DOMAIN = "ch.qos.logback.classic";
    
      static public String getObjectNameFor(String contextName, Class type) {
        return DOMAIN + ":Name=" + contextName + ",Type="
            + type.getName();
      }
    
      public static ObjectName string2ObjectName(Context context, Object caller,
          String objectNameAsStr) {
        String msg = "Failed to convert [" + objectNameAsStr + "] to ObjectName";
    
        StatusUtil statusUtil = new StatusUtil(context);
        try {
          return new ObjectName(objectNameAsStr);
        } catch (MalformedObjectNameException e) {
          statusUtil.addError(caller, msg, e);
          return null;
        } catch (NullPointerException e) {
          statusUtil.addError(caller, msg, e);
          return null;
        }
      }
    
      public static boolean isRegistered(MBeanServer mbs, ObjectName objectName) {
        return mbs.isRegistered(objectName);
      }
    
      public static void createAndRegisterJMXConfigurator(
          MBeanServer mbs, LoggerContext loggerContext,
          JMXConfigurator jmxConfigurator, ObjectName objectName, Object caller) {
        try {
          mbs.registerMBean(jmxConfigurator, objectName);
        } catch (Exception e) {
          StatusUtil statusUtil = new StatusUtil(loggerContext);
          statusUtil.addError(caller, "Failed to create mbean", e);
        }
      }
    
      public static void unregister(LoggerContext loggerContext, MBeanServer mbs,
          ObjectName objectName, Object caller) {
    
        StatusUtil statusUtil = new StatusUtil(loggerContext);
        if (mbs.isRegistered(objectName)) {
          try {
            statusUtil.addInfo(caller, "Unregistering mbean ["
                + objectName + "]");
            mbs.unregisterMBean(objectName);
          } catch (InstanceNotFoundException e) {
            // this is theoretically impossible
            statusUtil.addError(caller, "Failed to unregister mbean"
                + objectName, e);
          } catch (MBeanRegistrationException e) {
            // this is theoretically impossible
            statusUtil.addError(caller, "Failed to unregister mbean"
                + objectName, e);
          }
        } else {
          statusUtil.addInfo(caller, "mbean [" + objectName
              + "] does not seem to be registered");
        }
      }
    
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/jmx/JMXConfigurator.java��������0000644�0001750�0001750�00000021706�12136042271�031536� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.jmx;
    
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    
    import javax.management.InstanceNotFoundException;
    import javax.management.MBeanRegistrationException;
    import javax.management.MBeanServer;
    import javax.management.ObjectName;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.classic.spi.LoggerContextListener;
    import ch.qos.logback.classic.util.ContextInitializer;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.spi.ContextAwareBase;
    import ch.qos.logback.core.status.Status;
    import ch.qos.logback.core.status.StatusListener;
    import ch.qos.logback.core.status.StatusListenerAsList;
    import ch.qos.logback.core.status.StatusManager;
    import ch.qos.logback.core.util.StatusPrinter;
    
    /**
     * A class that provides access to logback components via JMX.
     * 
     * <p>Since this class implements {@link JMXConfiguratorMBean} it has to be
     * named as JMXConfigurator}.
     * 
     * @author Ceki G&uuml;lc&uuml;
     * @author S&eacute;bastien Pennec
     * 
     * Contributor: Sebastian Davids See http://bugzilla.qos.ch/show_bug.cgi?id=35
     */
    public class JMXConfigurator extends ContextAwareBase implements
        JMXConfiguratorMBean, LoggerContextListener {
    
      private static String EMPTY = "";
    
      LoggerContext loggerContext;
      MBeanServer mbs;
      ObjectName objectName;
      String objectNameAsString;
    
      // whether to output status events on the console when reloading the
      // configuration
      boolean debug = true;
    
      boolean started;
    
      public JMXConfigurator(LoggerContext loggerContext, MBeanServer mbs,
          ObjectName objectName) {
        started = true;
        this.context = loggerContext;
        this.loggerContext = loggerContext;
        this.mbs = mbs;
        this.objectName = objectName;
        this.objectNameAsString = objectName.toString();
        if (previouslyRegisteredListenerWithSameObjectName()) {
          addError("Previously registered JMXConfigurator named ["
              + objectNameAsString + "] in the logger context named ["
              + loggerContext.getName() + "]");
        } else {
          // register as a listener only if there are no homonyms
          loggerContext.addListener(this);
        }
      }
    
      private boolean previouslyRegisteredListenerWithSameObjectName() {
        List<LoggerContextListener> lcll = loggerContext.getCopyOfListenerList();
        for (LoggerContextListener lcl : lcll) {
          if (lcl instanceof JMXConfigurator) {
            JMXConfigurator jmxConfigurator = (JMXConfigurator) lcl;
            if (objectName.equals(jmxConfigurator.objectName)) {
              return true;
            }
          }
        }
        return false;
      }
    
      public void reloadDefaultConfiguration() throws JoranException {
        ContextInitializer ci = new ContextInitializer(loggerContext);
        URL url = ci.findURLOfDefaultConfigurationFile(true);
        reloadByURL(url);
      }
    
      public void reloadByFileName(String fileName) throws JoranException,
          FileNotFoundException {
        File f = new File(fileName);
        if (f.exists() && f.isFile()) {
          URL url;
          try {
            url = f.toURI().toURL();
            reloadByURL(url);
          } catch (MalformedURLException e) {
            throw new RuntimeException(
                "Unexpected MalformedURLException occured. See nexted cause.", e);
          }
    
        } else {
          String errMsg = "Could not find [" + fileName + "]";
          addInfo(errMsg);
          throw new FileNotFoundException(errMsg);
        }
      }
    
      void addStatusListener(StatusListener statusListener) {
        StatusManager sm = loggerContext.getStatusManager();
        sm.add(statusListener);
      }
    
      void removeStatusListener(StatusListener statusListener) {
        StatusManager sm = loggerContext.getStatusManager();
        sm.remove(statusListener);
      }
    
      public void reloadByURL(URL url) throws JoranException {
        StatusListenerAsList statusListenerAsList = new StatusListenerAsList();
    
        addStatusListener(statusListenerAsList);
        addInfo("Resetting context: " + loggerContext.getName());
        loggerContext.reset();
        // after a reset the statusListenerAsList gets removed as a listener
        addStatusListener(statusListenerAsList);
    
        try {
          JoranConfigurator configurator = new JoranConfigurator();
          configurator.setContext(loggerContext);
          configurator.doConfigure(url);
          addInfo("Context: " + loggerContext.getName() + " reloaded.");
        } finally {
          removeStatusListener(statusListenerAsList);
          if (debug) {
            StatusPrinter.print(statusListenerAsList.getStatusList());
          }
        }
      }
    
      public void setLoggerLevel(String loggerName, String levelStr) {
        if (loggerName == null) {
          return;
        }
        if (levelStr == null) {
          return;
        }
        loggerName = loggerName.trim();
        levelStr = levelStr.trim();
    
        addInfo("Trying to set level " + levelStr + " to logger " + loggerName);
        LoggerContext lc = (LoggerContext) context;
    
        Logger logger = lc.getLogger(loggerName);
        if ("null".equalsIgnoreCase(levelStr)) {
          logger.setLevel(null);
        } else {
          Level level = Level.toLevel(levelStr, null);
          if (level != null) {
            logger.setLevel(level);
          }
        }
      }
    
      public String getLoggerLevel(String loggerName) {
        if (loggerName == null) {
          return EMPTY;
        }
    
        loggerName = loggerName.trim();
    
        LoggerContext lc = (LoggerContext) context;
        Logger logger = lc.exists(loggerName);
        if (logger != null && logger.getLevel() != null) {
          return logger.getLevel().toString();
        } else {
          return EMPTY;
        }
      }
    
      public String getLoggerEffectiveLevel(String loggerName) {
        if (loggerName == null) {
          return EMPTY;
        }
    
        loggerName = loggerName.trim();
    
        LoggerContext lc = (LoggerContext) context;
        Logger logger = lc.exists(loggerName);
        if (logger != null) {
          return logger.getEffectiveLevel().toString();
        } else {
          return EMPTY;
        }
      }
    
      public List<String> getLoggerList() {
        LoggerContext lc = (LoggerContext) context;
        List<String> strList = new ArrayList<String>();
        Iterator<Logger> it = lc.getLoggerList().iterator();
        while (it.hasNext()) {
          Logger log = it.next();
          strList.add(log.getName());
        }
        return strList;
      }
    
      public List<String> getStatuses() {
        List<String> list = new ArrayList<String>();
        Iterator<Status> it = context.getStatusManager().getCopyOfStatusList()
            .iterator();
        while (it.hasNext()) {
          list.add(it.next().toString());
        }
        return list;
      }
    
      /**
       * When the associated LoggerContext is stopped, this configurator must be
       * unregistered
       */
      public void onStop(LoggerContext context) {
        if (!started) {
          addInfo("onStop() method called on a stopped JMXActivator ["
              + objectNameAsString + "]");
          return;
        }
        if (mbs.isRegistered(objectName)) {
          try {
            addInfo("Unregistering mbean [" + objectNameAsString + "]");
            mbs.unregisterMBean(objectName);
          } catch (InstanceNotFoundException e) {
            // this is theoretically impossible
            addError("Unable to find a verifiably registered mbean ["
                + objectNameAsString + "]", e);
          } catch (MBeanRegistrationException e) {
            addError("Failed to unregister [" + objectNameAsString + "]", e);
          }
        } else {
          addInfo("mbean [" + objectNameAsString
              + "] was not in the mbean registry. This is OK.");
        }
        stop();
      }
    
      public void onLevelChange(Logger logger, Level level) {
        // nothing to do
      }
    
      public void onReset(LoggerContext context) {
        addInfo("onReset() method called JMXActivator [" + objectNameAsString + "]");
      }
    
      /**
       * JMXConfigurator should not be removed subsequent to a LoggerContext reset.
       * 
       * @return
       */
      public boolean isResetResistant() {
        return true;
      }
    
      private void clearFields() {
        mbs = null;
        objectName = null;
        loggerContext = null;
      }
    
      private void stop() {
        started = false;
        clearFields();
      }
    
      public void onStart(LoggerContext context) {
        // nop
      }
    
      @Override
      public String toString() {
        return this.getClass().getName() + "(" + context.getName() + ")";
      }
    }
    ����������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/jmx/JMXConfiguratorMBean.java���0000644�0001750�0001750�00000002215�12136042271�032433� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.jmx;
    
    import java.io.FileNotFoundException;
    import java.net.URL;
    import java.util.List;
    
    import ch.qos.logback.core.joran.spi.JoranException;
    
    public interface JMXConfiguratorMBean {
      
      void reloadDefaultConfiguration() throws JoranException;
      
      void reloadByFileName(String fileName) throws JoranException, FileNotFoundException;
      
      void reloadByURL(URL url) throws JoranException;
      
      void setLoggerLevel(String loggerName, String levelStr);
      
      String getLoggerLevel(String loggerName);
      
      String getLoggerEffectiveLevel(String loggerName);
    
      List<String> getLoggerList();
      
      List<String> getStatuses();
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/package.html��������������������0000644�0001750�0001750�00000000301�11377016712�027330� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
    
    <html> 
      <head>
        <title></title>
      </head>
      
      <body>
        
        <p>Contains logback classic main classes.</p>
    
      </body> 
    </html>�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/ViewStatusMessagesServlet.java��0000644�0001750�0001750�00000002633�12136042271�033070� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.slf4j.LoggerFactory;
    
    import ch.qos.logback.core.status.StatusManager;
    import ch.qos.logback.core.status.ViewStatusMessagesServletBase;
    
    public class ViewStatusMessagesServlet extends ViewStatusMessagesServletBase {
    
      private static final long serialVersionUID = 443878494348593337L;
    
    
      @Override
      protected StatusManager getStatusManager(HttpServletRequest req, HttpServletResponse resp) {
        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
        return lc.getStatusManager();
      }
    
      @Override
      protected String getPageTitle(HttpServletRequest req, HttpServletResponse resp) {
        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
        return "<h2>Status messages for LoggerContext named ["
            + lc.getName() + "]</h2>\r\n";
      }
    
    }
    �����������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/util/���������������������������0000755�0001750�0001750�00000000000�12203357067�026032� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/util/LevelToSyslogSeverity.java�0000644�0001750�0001750�00000002666�12136042271�033206� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.util;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.net.SyslogConstants;
    
    public class LevelToSyslogSeverity {
    
      /*
       * Convert a level to equivalent syslog severity. Only levels for printing
       * methods i.e TRACE, DEBUG, WARN, INFO and ERROR are converted.
       * 
       */
      static public int convert(ILoggingEvent event) {
    
        Level level = event.getLevel();
    
        switch (level.levelInt) {
        case Level.ERROR_INT:
          return SyslogConstants.ERROR_SEVERITY;
        case Level.WARN_INT:
          return SyslogConstants.WARNING_SEVERITY;
        case Level.INFO_INT:
          return SyslogConstants.INFO_SEVERITY;
        case Level.DEBUG_INT:
        case Level.TRACE_INT:
          return SyslogConstants.DEBUG_SEVERITY;
        default:
          throw new IllegalArgumentException("Level " + level
              + " is not a valid level for a printing method");
        }
      }
    }
    ��������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/util/package.html���������������0000644�0001750�0001750�00000000264�11377016712�030315� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
    
    <html> 
      <head>
        <title></title>
      </head>
      
      <body>
        
        <p>Contains utility classes.</p>
    
      </body> 
    </html>��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000152�00000000000�011563� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/util/DefaultNestedComponentRules.java�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/util/DefaultNestedComponentRules0000644�0001750�0001750�00000003411�12136042271�033372� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.util;
    
    import ch.qos.logback.classic.PatternLayout;
    import ch.qos.logback.classic.boolex.JaninoEventEvaluator;
    import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
    import ch.qos.logback.core.AppenderBase;
    import ch.qos.logback.core.UnsynchronizedAppenderBase;
    import ch.qos.logback.core.filter.EvaluatorFilter;
    import ch.qos.logback.core.joran.spi.DefaultNestedComponentRegistry;
    import ch.qos.logback.core.net.ssl.SSLNestedComponentRegistryRules;
    
    /**
     * Contains mappings for the default type of nested components in
     * logback-classic.
     * 
     * @author Ceki Gulcu
     * 
     */
    public class DefaultNestedComponentRules {
    
      static public void addDefaultNestedComponentRegistryRules(
          DefaultNestedComponentRegistry registry) {
        registry.add(AppenderBase.class, "layout", PatternLayout.class);
        registry.add(UnsynchronizedAppenderBase.class, "layout", PatternLayout.class);
        
        registry.add(AppenderBase.class, "encoder", PatternLayoutEncoder.class);
        registry.add(UnsynchronizedAppenderBase.class, "encoder", PatternLayoutEncoder.class);
        
        registry
            .add(EvaluatorFilter.class, "evaluator", JaninoEventEvaluator.class);
    
        SSLNestedComponentRegistryRules.addDefaultNestedComponentRegistryRules(registry);
      }
    
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/util/LogbackMDCAdapter.java�����0000644�0001750�0001750�00000014527�12136042271�032066� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.util;
    
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Collections;
    import java.util.Set;
    
    
    import org.slf4j.spi.MDCAdapter;
    
    /**
     * A <em>Mapped Diagnostic Context</em>, or MDC in short, is an instrument for
     * distinguishing interleaved log output from different sources. Log output is
     * typically interleaved when a server handles multiple clients
     * near-simultaneously.
     * <p/>
     * <b><em>The MDC is managed on a per thread basis</em></b>. A child thread
     * automatically inherits a <em>copy</em> of the mapped diagnostic context of
     * its parent.
     * <p/>
     * <p/>
     * For more information about MDC, please refer to the online manual at
     * http://logback.qos.ch/manual/mdc.html
     *
     * @author Ceki G&uuml;lc&uuml;
     */
    public final class LogbackMDCAdapter implements MDCAdapter {
    
      // We wish to avoid unnecessarily copying of the map. To ensure
      // efficient/timely copying, we have a variable keeping track of the last
      // operation. A copy is necessary on 'put' or 'remove' but only if the last
      // operation was a 'get'. Get operations never necessitate a copy nor
      // successive 'put/remove' operations, only a get followed by a 'put/remove'
      // requires copying the map.
      // See http://jira.qos.ch/browse/LBCLASSIC-254 for the original discussion.
    
      // We no longer use CopyOnInheritThreadLocal in order to solve LBCLASSIC-183
      // Initially the contents of the thread local in parent and child threads
      // reference the same map. However, as soon as a thread invokes the put()
      // method, the maps diverge as they should.
      final InheritableThreadLocal<Map<String, String>> copyOnInheritThreadLocal = new InheritableThreadLocal<Map<String, String>>();
    
      private static final int WRITE_OPERATION = 1;
      private static final int READ_OPERATION = 2;
    
      // keeps track of the last operation performed
      final ThreadLocal<Integer> lastOperation = new ThreadLocal<Integer>();
    
      private Integer getAndSetLastOperation(int op) {
        Integer lastOp = lastOperation.get();
        lastOperation.set(op);
        return lastOp;
      }
    
      private boolean wasLastOpReadOrNull(Integer lastOp) {
        return lastOp == null || lastOp.intValue() == READ_OPERATION;
      }
    
      private Map<String, String> duplicateAndInsertNewMap(Map<String, String> oldMap) {
        Map<String, String> newMap = Collections.synchronizedMap(new HashMap<String, String>());
        if (oldMap != null) {
            // we don't want the parent thread modifying oldMap while we are
            // iterating over it
            synchronized (oldMap) {
              newMap.putAll(oldMap);
            }
        }
    
        copyOnInheritThreadLocal.set(newMap);
        return newMap;
      }
    
      /**
       * Put a context value (the <code>val</code> parameter) as identified with the
       * <code>key</code> parameter into the current thread's context map. Note that
       * contrary to log4j, the <code>val</code> parameter can be null.
       * <p/>
       * <p/>
       * If the current thread does not have a context map it is created as a side
       * effect of this call.
       *
       * @throws IllegalArgumentException in case the "key" parameter is null
       */
      public void put(String key, String val) throws IllegalArgumentException {
        if (key == null) {
          throw new IllegalArgumentException("key cannot be null");
        }
    
        Map<String, String> oldMap = copyOnInheritThreadLocal.get();
        Integer lastOp = getAndSetLastOperation(WRITE_OPERATION);
    
        if (wasLastOpReadOrNull(lastOp) || oldMap == null) {
          Map<String, String> newMap = duplicateAndInsertNewMap(oldMap);
          newMap.put(key, val);
        } else {
          oldMap.put(key, val);
        }
      }
    
      /**
       * Remove the the context identified by the <code>key</code> parameter.
       * <p/>
       */
      public void remove(String key) {
        if (key == null) {
          return;
        }
        Map<String, String> oldMap = copyOnInheritThreadLocal.get();
        if (oldMap == null) return;
    
        Integer lastOp = getAndSetLastOperation(WRITE_OPERATION);
    
        if (wasLastOpReadOrNull(lastOp)) {
          Map<String, String> newMap = duplicateAndInsertNewMap(oldMap);
          newMap.remove(key);
        } else {
          oldMap.remove(key);
        }
      }
    
    
      /**
       * Clear all entries in the MDC.
       */
      public void clear() {
        lastOperation.set(WRITE_OPERATION);
        copyOnInheritThreadLocal.remove();
      }
    
      /**
       * Get the context identified by the <code>key</code> parameter.
       * <p/>
       */
      public String get(String key) {
        Map<String, String> map = getPropertyMap();
        if ((map != null) && (key != null)) {
          return map.get(key);
        } else {
          return null;
        }
      }
    
      /**
       * Get the current thread's MDC as a map. This method is intended to be used
       * internally.
       */
      public Map<String, String> getPropertyMap() {
        lastOperation.set(READ_OPERATION);
        return copyOnInheritThreadLocal.get();
      }
    
      /**
       * Returns the keys in the MDC as a {@link Set}. The returned value can be
       * null.
       */
      public Set<String> getKeys() {
        Map<String, String> map = getPropertyMap();
    
        if (map != null) {
          return map.keySet();
        } else {
          return null;
        }
      }
    
      /**
       * Return a copy of the current thread's context map. Returned value may be
       * null.
       */
      public Map getCopyOfContextMap() {
        lastOperation.set(READ_OPERATION);
        Map<String, String> hashMap = copyOnInheritThreadLocal.get();
        if (hashMap == null) {
          return null;
        } else {
          return new HashMap<String, String>(hashMap);
        }
      }
    
      @SuppressWarnings("unchecked")
      public void setContextMap(Map contextMap) {
        lastOperation.set(WRITE_OPERATION);
    
        Map<String, String> newMap = Collections.synchronizedMap(new HashMap<String, String>());
        newMap.putAll(contextMap);
    
        // the newMap replaces the old one for serialisation's sake
        copyOnInheritThreadLocal.set(newMap);
      }
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000151�00000000000�011562� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/util/StatusListenerConfigHelper.java������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/util/StatusListenerConfigHelper.0000644�0001750�0001750�00000004472�12136516312�033314� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.util;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.core.spi.ContextAware;
    import ch.qos.logback.core.spi.LifeCycle;
    import ch.qos.logback.core.status.OnConsoleStatusListener;
    import ch.qos.logback.core.status.StatusListener;
    import ch.qos.logback.core.util.OptionHelper;
    
    public class StatusListenerConfigHelper {
    
      static void installIfAsked(LoggerContext loggerContext) {
        String slClass = OptionHelper.getSystemProperty(
            ContextInitializer.STATUS_LISTENER_CLASS);
        if (!OptionHelper.isEmpty(slClass)) {
          addStatusListener(loggerContext, slClass);
        }
      }
    
      private static void addStatusListener(LoggerContext loggerContext,
          String listenerClass) {
        StatusListener listener = null;
        if (ContextInitializer.SYSOUT.equalsIgnoreCase(listenerClass)) {
          listener = new OnConsoleStatusListener();
        } else {
          listener = createListenerPerClassName(loggerContext, listenerClass);
        }
        initListener(loggerContext, listener);
      }
    
      private static void initListener(LoggerContext loggerContext, StatusListener listener) {
        if (listener != null) {
          if(listener instanceof ContextAware) // LOGBACK-767
            ((ContextAware) listener).setContext(loggerContext);
          if(listener instanceof LifeCycle)  // LOGBACK-767
            ((LifeCycle) listener).start();
          loggerContext.getStatusManager().add(listener);
        }
      }
    
      private static StatusListener createListenerPerClassName(LoggerContext loggerContext, String listenerClass) {
        try {
          return (StatusListener) OptionHelper.instantiateByClassName(
                  listenerClass, StatusListener.class, loggerContext);
        } catch (Exception e) {
          // printing on the console is the best we can do
          e.printStackTrace();
          return null;
        }
      }
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/util/EnvUtil.java���������������0000644�0001750�0001750�00000001705�12136042271�030257� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.util;
    
    import ch.qos.logback.core.util.Loader;
    
    /**
     * @author Ceki G&uuml;c&uuml;
     */
    public class EnvUtil {
    
    
      static public boolean isGroovyAvailable() {
        ClassLoader classLoader = Loader.getClassLoaderOfClass(EnvUtil.class);
        try {
          Class bindingClass = classLoader.loadClass("groovy.lang.Binding");
          return (bindingClass != null);
        } catch (ClassNotFoundException e) {
          return false;
        }
      }
    
    }
    �����������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/util/LoggerNameUtil.java��������0000644�0001750�0001750�00000003263�12136042271�031550� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.util;
    
    import ch.qos.logback.core.CoreConstants;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * Utility class for analysing logger names.
     */
    public class LoggerNameUtil {
    
    
      public static int getFirstSeparatorIndexOf(String name) {
        return getSeparatorIndexOf(name, 0);
      }
    
      /**
       * Get the position of the separator character, if any, starting at position
       * 'fromIndex'.
       *
       * @param name
       * @param fromIndex
       * @return
       */
      public static int getSeparatorIndexOf(String name, int fromIndex) {
        int i = name.indexOf(CoreConstants.DOT, fromIndex);
        if (i != -1) {
          return i;
        } else {
          return name.indexOf(CoreConstants.DOLLAR, fromIndex);
        }
      }
    
      public static List<String> computeNameParts(String loggerName) {
        List<String> partList = new ArrayList<String>();
    
        int fromIndex = 0;
        while(true) {
          int index = getSeparatorIndexOf(loggerName, fromIndex);
          if(index == -1) {
           partList.add(loggerName.substring(fromIndex));
           break;
          }
          partList.add(loggerName.substring(fromIndex, index));
          fromIndex = index+1;
        }
        return partList;
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/util/JNDIUtil.java��������������0000644�0001750�0001750�00000002175�12136042271�030255� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.util;
    
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
    
    /**
     * A simple utility class to create and use a JNDI Context.
     *
     * @author Ceki G&uuml;lc&uuml;
     * @author S&eacute;bastien Pennec
     */
    
    public class JNDIUtil {
      
      public static Context getInitialContext() throws NamingException {
        return new InitialContext();
      }
    
      public static String lookup(Context ctx, String name) {
        if (ctx == null) {
          return null;
        }
        try {
          return (String) ctx.lookup(name);
        } catch (NamingException e) {
          return null;
        }
      }
    }���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000147�00000000000�011567� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/util/CopyOnInheritThreadLocal.java��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/util/CopyOnInheritThreadLocal.ja0000644�0001750�0001750�00000002166�12136042271�033201� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.util;
    
    import java.util.HashMap;
    
    /**
     * This class extends InheritableThreadLocal so that children threads get a copy
     * of the parent's hashmap.
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public class CopyOnInheritThreadLocal extends
        InheritableThreadLocal<HashMap<String, String>> {
    
      /**
       * Child threads should get a copy of the parent's hashmap.
       */
      @Override
      protected HashMap<String, String> childValue(
          HashMap<String, String> parentValue) {
        if (parentValue == null) {
          return null;
        } else {
          return new HashMap<String, String>(parentValue);
        }
      }
    
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000152�00000000000�011563� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/util/ContextSelectorStaticBinder.java�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/util/ContextSelectorStaticBinder0000644�0001750�0001750�00000007525�12136042271�033400� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.util;
    
    import java.lang.reflect.Constructor;
    import java.lang.reflect.InvocationTargetException;
    
    import ch.qos.logback.classic.ClassicConstants;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.selector.ContextJNDISelector;
    import ch.qos.logback.classic.selector.ContextSelector;
    import ch.qos.logback.classic.selector.DefaultContextSelector;
    import ch.qos.logback.core.util.Loader;
    import ch.qos.logback.core.util.OptionHelper;
    
    /**
     * Holds the context selector for use in the current environment.
     * 
     * @author Ceki G&uuml;lc&uuml;
     * @since 0.9.19
     */
    public class ContextSelectorStaticBinder {
    
      static ContextSelectorStaticBinder singleton = new ContextSelectorStaticBinder();
    
      ContextSelector contextSelector;
      Object key;
      
      public static ContextSelectorStaticBinder getSingleton() {
        return singleton;
      }
    
      /**
       * FOR INTERNAL USE. This method is intended for use by  StaticLoggerBinder.
       *  
       * @param defaultLoggerContext
       * @throws ClassNotFoundException
       * @throws NoSuchMethodException
       * @throws InstantiationException
       * @throws IllegalAccessException
       * @throws InvocationTargetException
       */
      public void init(LoggerContext defaultLoggerContext, Object key) throws ClassNotFoundException,
          NoSuchMethodException, InstantiationException, IllegalAccessException,
          InvocationTargetException  {
        if(this.key == null) {
          this.key = key;
        } else if (this.key != key) {
          throw new IllegalAccessException("Only certain classes can access this method.");
        }
        
        
        String contextSelectorStr = OptionHelper
            .getSystemProperty(ClassicConstants.LOGBACK_CONTEXT_SELECTOR);
        if (contextSelectorStr == null) {
          contextSelector = new DefaultContextSelector(defaultLoggerContext);
        } else if (contextSelectorStr.equals("JNDI")) {
          // if jndi is specified, let's use the appropriate class
          contextSelector = new ContextJNDISelector(defaultLoggerContext);
        } else {
          contextSelector = dynamicalContextSelector(defaultLoggerContext,
              contextSelectorStr);
        }
      }
      
      /**
       * Instantiate the context selector class designated by the user. The selector
       * must have a constructor taking a LoggerContext instance as an argument.
       * 
       * @param defaultLoggerContext
       * @param contextSelectorStr
       * @return an instance of the designated context selector class
       * @throws ClassNotFoundException
       * @throws SecurityException
       * @throws NoSuchMethodException
       * @throws IllegalArgumentException
       * @throws InstantiationException
       * @throws IllegalAccessException
       * @throws InvocationTargetException
       */
      static ContextSelector dynamicalContextSelector(
          LoggerContext defaultLoggerContext, String contextSelectorStr)
          throws ClassNotFoundException, SecurityException, NoSuchMethodException,
          IllegalArgumentException, InstantiationException, IllegalAccessException,
          InvocationTargetException {
        Class<?> contextSelectorClass = Loader.loadClass(contextSelectorStr);
        Constructor cons = contextSelectorClass
            .getConstructor(new Class[] { LoggerContext.class });
        return (ContextSelector) cons.newInstance(defaultLoggerContext);
      }
      
      public ContextSelector getContextSelector() {
        return contextSelector;
      }
    
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/util/ContextInitializer.java����0000644�0001750�0001750�00000015065�12136042271�032525� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.util;
    
    import java.io.File;
    import java.io.IOException;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.util.Set;
    
    import ch.qos.logback.classic.BasicConfigurator;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.gaffer.GafferUtil;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.status.ErrorStatus;
    import ch.qos.logback.core.status.InfoStatus;
    import ch.qos.logback.core.status.StatusManager;
    import ch.qos.logback.core.status.WarnStatus;
    import ch.qos.logback.core.util.Loader;
    import ch.qos.logback.core.util.OptionHelper;
    
    // contributors
    // Ted Graham, Matt Fowles, see also http://jira.qos.ch/browse/LBCORE-32
    
    /**
     * This class contains logback's logic for automatic configuration
     *
     * @author Ceki Gulcu
     */
    public class ContextInitializer {
    
      final public static String GROOVY_AUTOCONFIG_FILE = "logback.groovy";
      final public static String AUTOCONFIG_FILE = "logback.xml";
      final public static String TEST_AUTOCONFIG_FILE = "logback-test.xml";
      final public static String CONFIG_FILE_PROPERTY = "logback.configurationFile";
      final public static String STATUS_LISTENER_CLASS = "logback.statusListenerClass";
      final public static String SYSOUT = "SYSOUT";
    
      final LoggerContext loggerContext;
    
      public ContextInitializer(LoggerContext loggerContext) {
        this.loggerContext = loggerContext;
      }
    
      public void configureByResource(URL url) throws JoranException {
        if (url == null) {
          throw new IllegalArgumentException("URL argument cannot be null");
        }
        if (url.toString().endsWith("groovy")) {
          if (EnvUtil.isGroovyAvailable()) {
            // avoid directly referring to GafferConfigurator so as to avoid
            // loading  groovy.lang.GroovyObject . See also http://jira.qos.ch/browse/LBCLASSIC-214
            GafferUtil.runGafferConfiguratorOn(loggerContext, this, url);
          } else {
            StatusManager sm = loggerContext.getStatusManager();
            sm.add(new ErrorStatus("Groovy classes are not available on the class path. ABORTING INITIALIZATION.",
                    loggerContext));
          }
        }
        if (url.toString().endsWith("xml")) {
          JoranConfigurator configurator = new JoranConfigurator();
          configurator.setContext(loggerContext);
          configurator.doConfigure(url);
        }
      }
    
      void joranConfigureByResource(URL url) throws JoranException {
        JoranConfigurator configurator = new JoranConfigurator();
        configurator.setContext(loggerContext);
        configurator.doConfigure(url);
      }
    
      private URL findConfigFileURLFromSystemProperties(ClassLoader classLoader, boolean updateStatus) {
        String logbackConfigFile = OptionHelper.getSystemProperty(CONFIG_FILE_PROPERTY);
        if (logbackConfigFile != null) {
          URL result = null;
          try {
            result = new URL(logbackConfigFile);
            return result;
          } catch (MalformedURLException e) {
            // so, resource is not a URL:
            // attempt to get the resource from the class path
            result = Loader.getResource(logbackConfigFile, classLoader);
            if (result != null) {
              return result;
            }
            File f = new File(logbackConfigFile);
            if (f.exists() && f.isFile()) {
              try {
                result = f.toURI().toURL();
                return result;
              } catch (MalformedURLException e1) {
              }
            }
          } finally {
            if (updateStatus) {
              statusOnResourceSearch(logbackConfigFile, classLoader, result);
            }
          }
        }
        return null;
      }
    
      public URL findURLOfDefaultConfigurationFile(boolean updateStatus) {
        ClassLoader myClassLoader = Loader.getClassLoaderOfObject(this);
        URL url = findConfigFileURLFromSystemProperties(myClassLoader, updateStatus);
        if (url != null) {
          return url;
        }
    
        url = getResource(GROOVY_AUTOCONFIG_FILE, myClassLoader, updateStatus);
        if (url != null) {
          return url;
        }
    
        url = getResource(TEST_AUTOCONFIG_FILE, myClassLoader, updateStatus);
        if (url != null) {
          return url;
        }
    
        return getResource(AUTOCONFIG_FILE, myClassLoader, updateStatus);
      }
    
      private URL getResource(String filename, ClassLoader myClassLoader, boolean updateStatus) {
        URL url = Loader.getResource(filename, myClassLoader);
        if (updateStatus) {
          statusOnResourceSearch(filename, myClassLoader, url);
        }
        return url;
      }
    
      public void autoConfig() throws JoranException {
        StatusListenerConfigHelper.installIfAsked(loggerContext);
        URL url = findURLOfDefaultConfigurationFile(true);
        if (url != null) {
          configureByResource(url);
        } else {
          BasicConfigurator.configure(loggerContext);
        }
      }
    
      private void multiplicityWarning(String resourceName, ClassLoader classLoader) {
        Set<URL> urlSet = null;
        StatusManager sm = loggerContext.getStatusManager();
        try {
          urlSet = Loader.getResourceOccurrenceCount(resourceName, classLoader);
        } catch (IOException e) {
          sm.add(new ErrorStatus("Failed to get url list for resource [" + resourceName + "]",
                  loggerContext, e));
        }
        if (urlSet != null && urlSet.size() > 1) {
          sm.add(new WarnStatus("Resource [" + resourceName + "] occurs multiple times on the classpath.",
                  loggerContext));
          for (URL url : urlSet) {
            sm.add(new WarnStatus("Resource [" + resourceName + "] occurs at [" + url.toString() + "]",
                    loggerContext));
          }
        }
      }
    
      private void statusOnResourceSearch(String resourceName, ClassLoader classLoader, URL url) {
        StatusManager sm = loggerContext.getStatusManager();
        if (url == null) {
          sm.add(new InfoStatus("Could NOT find resource [" + resourceName + "]",
                  loggerContext));
        } else {
          sm.add(new InfoStatus("Found resource [" + resourceName + "] at [" + url.toString() + "]",
                  loggerContext));
          multiplicityWarning(resourceName, classLoader);
        }
      }
    
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/pattern/������������������������0000755�0001750�0001750�00000000000�12203357067�026532� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/pattern/ClassicConverter.java���0000644�0001750�0001750�00000001545�12136042271�032644� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.pattern;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.pattern.DynamicConverter;
    
    /**
     * This class serves the super-class of all converters in logback. It extends
     * {@link DynamicConverter}.
     *
     * @author Ceki Gulcu
     */
    abstract public class ClassicConverter extends DynamicConverter<ILoggingEvent>  {
    
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000146�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/pattern/ContextNameConverter.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/pattern/ContextNameConverter.jav0000644�0001750�0001750�00000001627�12136042271�033350� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.pattern;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    
    /**
     * Converts an event to the logger context's name.
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public class ContextNameConverter extends ClassicConverter {
    
      /**
       * Return the name of the logger context's name.
       */
      public String convert(ILoggingEvent event) {
        return event.getLoggerContextVO().getName();
      }
    
    }
    ���������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/pattern/PropertyConverter.java��0000644�0001750�0001750�00000002411�12136042271�033100� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.pattern;
    
    import java.util.Map;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.classic.spi.LoggerContextVO;
    
    public final class PropertyConverter extends ClassicConverter {
    
      String key;
    
      public void start() {
        String optStr = getFirstOption();
        if (optStr != null) {
          key = optStr;
          super.start();
        }
      }
    
      public String convert(ILoggingEvent event) {
        if (key == null) {
          return "Property_HAS_NO_KEY";
        } else {
          LoggerContextVO lcvo = event.getLoggerContextVO();
          Map<String, String> map = lcvo.getPropertyMap();
          String val = map.get(key);
          if (val != null) {
            return val;
          } else {
            return System.getProperty(key);
          }
        }
      }
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/pattern/package.html������������0000644�0001750�0001750�00000000342�11377016712�031012� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
    
    <html> 
      <head>
        <title></title>
      </head>
      
      <body>
        
        <p>Provides classes implementing format specifiers in conversion patterns.</p>
    
      </body> 
    </html>����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/pattern/ThreadConverter.java����0000644�0001750�0001750�00000001510�12136042271�032462� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.pattern;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    
    /**
     * Return the events thread (usually the current thread).
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public class ThreadConverter extends ClassicConverter {
    
      public String convert(ILoggingEvent event) {
        return event.getThreadName();
      }
    
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000150�00000000000�011561� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/pattern/ClassOfCallerConverter.java�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/pattern/ClassOfCallerConverter.j0000644�0001750�0001750�00000001672�12136042271�033251� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.pattern;
    
    import ch.qos.logback.classic.spi.CallerData;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    
    public class ClassOfCallerConverter extends NamedConverter {
    
      protected String getFullyQualifiedName(ILoggingEvent event) {
        
        StackTraceElement[] cda = event.getCallerData();
        if (cda != null && cda.length > 0) {
          return cda[0].getClassName();
        } else {
          return CallerData.NA;
        }
      }
    }
    ����������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/pattern/MarkerConverter.java����0000644�0001750�0001750�00000001740�12136042271�032501� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.pattern;
    
    import org.slf4j.Marker;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    
    /**
     * Return the event's marker value(s).
     * 
     * @author S&eacute;bastien Pennec
     */
    public class MarkerConverter extends ClassicConverter {
    
      private static String EMPTY = "";
    
      public String convert(ILoggingEvent le) {
        Marker marker = le.getMarker();
        if (marker == null) {
          return EMPTY;
        } else {
          return marker.toString();
        }
      }
    
    }
    ��������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/pattern/Util.java���������������0000644�0001750�0001750�00000002445�12136042271�030310� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.pattern;
    
    import java.util.HashMap;
    import java.util.Map;
    
    import org.slf4j.Marker;
    
    import ch.qos.logback.classic.spi.ClassPackagingData;
    
    /**
     * 
     * @author Ceki Gulcu
     */
    public class Util {
    
      static Map<String, ClassPackagingData> cache = new HashMap<String, ClassPackagingData>();
    
      static public boolean match(Marker marker, Marker[] markerArray) {
        if (markerArray == null) {
          throw new IllegalArgumentException("markerArray should not be null");
        }
    
        // System.out.println("event marker="+marker);
    
        final int size = markerArray.length;
        for (int i = 0; i < size; i++) {
          // System.out.println("other:"+markerArray[i]);
    
          if (marker.contains(markerArray[i])) {
            return true;
          }
        }
        return false;
      }
    
     
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/pattern/LoggerConverter.java����0000644�0001750�0001750�00000001352�12136042271�032476� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.pattern;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    
    public class LoggerConverter extends NamedConverter {
    
      protected String getFullyQualifiedName(ILoggingEvent event) {
        return event.getLoggerName();
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000147�00000000000�011567� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/pattern/LineOfCallerConverter.java��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/pattern/LineOfCallerConverter.ja0000644�0001750�0001750�00000001663�12136042271�033234� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.pattern;
    
    import ch.qos.logback.classic.spi.CallerData;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    
    public class LineOfCallerConverter extends ClassicConverter {
    
      public String convert(ILoggingEvent le) {
        StackTraceElement[] cda = le.getCallerData();
        if (cda != null && cda.length > 0) {
          return Integer.toString(cda[0].getLineNumber());
        } else {
          return CallerData.NA;
        }
      }
    
    }
    �����������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/pattern/NamedConverter.java�����0000644�0001750�0001750�00000003165�12136042271�032307� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.pattern;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    
    public abstract class NamedConverter extends ClassicConverter {
    
      Abbreviator abbreviator = null;
    
      /**
       * Gets fully qualified name from event.
       * 
       * @param event
       *          The LoggingEvent to process, cannot not be null.
       * @return name, must not be null.
       */
      protected abstract String getFullyQualifiedName(final ILoggingEvent event);
    
      public void start() {
        String optStr = getFirstOption();
        if (optStr != null) {
          try {
            int targetLen = Integer.parseInt(optStr);
            if (targetLen == 0) {
              abbreviator = new ClassNameOnlyAbbreviator();
            } else if (targetLen > 0) {
              abbreviator = new TargetLengthBasedClassNameAbbreviator(targetLen);
            }
          } catch (NumberFormatException nfe) {
            // FIXME: better error reporting
          }
        }
      }
    
      public String convert(ILoggingEvent event) {
        String fqn = getFullyQualifiedName(event);
    
        if (abbreviator == null) {
          return fqn;
        } else {
          return abbreviator.abbreviate(fqn);
        }
      }
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000154�00000000000�011565� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/pattern/ThrowableHandlingConverter.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/pattern/ThrowableHandlingConvert0000644�0001750�0001750�00000001367�12136042271�033412� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.pattern;
    
    
    
    /**
     * Converter which handle throwables should be derived from this class.
     *
     */
    public abstract class ThrowableHandlingConverter extends ClassicConverter {
      
      boolean handlesThrowable() {
        return true;
      }
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000162�00000000000�011564� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/pattern/NopThrowableInformationConverter.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/pattern/NopThrowableInformationC0000644�0001750�0001750�00000002651�12136042271�033367� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.pattern;
    
    import ch.qos.logback.classic.PatternLayout;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.CoreConstants;
    
    
    
    /**
     * Always returns an empty string.
     * <p>
     * This converter is useful to pretend that the converter chain for
     * PatternLayout actually handles exceptions, when in fact it does not.
     * By adding %nopex to the conversion pattern, the user can bypass
     * the automatic addition of %ex conversion pattern for patterns 
     * which do not contain a converter handling exceptions.
     * 
     * <p>Users can ignore the existence of this converter, unless they
     * want to suppress the automatic printing of exceptions by 
     * {@link PatternLayout}.
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public class NopThrowableInformationConverter extends ThrowableHandlingConverter {
    
      public String convert(ILoggingEvent event) {
        return CoreConstants.EMPTY_STRING;
      }
     
    }
    ���������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000151�00000000000�011562� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/pattern/MethodOfCallerConverter.java������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/pattern/MethodOfCallerConverter.0000644�0001750�0001750�00000001643�12136042271�033250� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.pattern;
    
    import ch.qos.logback.classic.spi.CallerData;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    
    public class MethodOfCallerConverter extends ClassicConverter {
    
      public String convert(ILoggingEvent le) {
        StackTraceElement[] cda = le.getCallerData();
        if (cda != null && cda.length > 0) {
          return cda[0].getMethodName();
        } else {
          return CallerData.NA;
        }
      }
    
    }
    ���������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000147�00000000000�011567� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/pattern/RelativeTimeConverter.java��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/pattern/RelativeTimeConverter.ja0000644�0001750�0001750�00000002114�12136042271�033317� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.pattern;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    
    public class RelativeTimeConverter extends ClassicConverter {
    
      long lastTimestamp = -1;
      String timesmapCache = null;
    
      public String convert(ILoggingEvent event) {
        long now = event.getTimeStamp();
    
        synchronized (this) {
          // update timesmapStrCache only if now !=  lastTimestamp
          if (now != lastTimestamp) {
            lastTimestamp = now;
            timesmapCache = Long.toString(now - event.getLoggerContextVO().getBirthTime());      
          }
          return timesmapCache;
        }
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/pattern/Abbreviator.java��������0000644�0001750�0001750�00000001315�12136042271�031626� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.pattern;
    
    /**
     * An interface used for abbreviating strings according to different policies.
     * 
     * @author Ceki Gulcu
     */
    public interface Abbreviator {
    
      String abbreviate(String in);
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000152�00000000000�011563� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/pattern/ClassNameOnlyAbbreviator.java�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/pattern/ClassNameOnlyAbbreviator0000644�0001750�0001750�00000002357�12136042271�033346� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.pattern;
    
    import ch.qos.logback.core.CoreConstants;
    
    /**
     * This abbreviator returns the class name from a fully qualified class name,
     * removing the leading package name.
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public class ClassNameOnlyAbbreviator implements Abbreviator {
    
      public String abbreviate(String fqClassName) {
        // we ignore the fact that the separator character can also be a dollar
        // If the inner class is org.good.AClass#Inner, returning
        // AClass#Inner seems most appropriate
        int lastIndex = fqClassName.lastIndexOf(CoreConstants.DOT);
        if (lastIndex != -1) {
          return fqClassName.substring(lastIndex + 1, fqClassName.length());
        } else {
          return fqClassName;
        }
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/pattern/CallerDataConverter.java0000644�0001750�0001750�00000010373�12136042271�033256� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.pattern;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    
    import ch.qos.logback.classic.spi.CallerData;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.boolex.EvaluationException;
    import ch.qos.logback.core.boolex.EventEvaluator;
    import ch.qos.logback.core.status.ErrorStatus;
    
    /**
     * This converter outputs caller data depending on depth and marker data.
     * 
     * @author Ceki Gulcu
     */
    public class CallerDataConverter extends ClassicConverter {
    
      public static final String DEFAULT_CALLER_LINE_PREFIX = "Caller+";
    
      int depth = 5;
      List<EventEvaluator<ILoggingEvent>> evaluatorList = null;
    
    
      final int MAX_ERROR_COUNT = 4;
      int errorCount = 0;
    
      @SuppressWarnings("unchecked")
      public void start() {
        String depthStr = getFirstOption();
        if (depthStr == null) {
          return;
        }
    
        try {
          depth = Integer.parseInt(depthStr);
        } catch (NumberFormatException nfe) {
          addError("Failed to parse depth option [" + depthStr + "]", nfe);
        }
    
        final List optionList = getOptionList();
    
        if (optionList != null && optionList.size() > 1) {
          final int optionListSize = optionList.size();
          for (int i = 1; i < optionListSize; i++) {
            String evaluatorStr = (String) optionList.get(i);
            Context context = getContext();
            if (context != null) {
              Map evaluatorMap = (Map) context
                  .getObject(CoreConstants.EVALUATOR_MAP);
              EventEvaluator<ILoggingEvent> ee = (EventEvaluator<ILoggingEvent>) evaluatorMap
                  .get(evaluatorStr);
              if (ee != null) {
                addEvaluator(ee);
              }
            }
          }
        }
      }
    
      private void addEvaluator(EventEvaluator<ILoggingEvent> ee) {
        if (evaluatorList == null) {
          evaluatorList = new ArrayList<EventEvaluator<ILoggingEvent>>();
        }
        evaluatorList.add(ee);
      }
    
      public String convert(ILoggingEvent le) {
        StringBuilder buf = new StringBuilder();
    
        if (evaluatorList != null) {
          boolean printCallerData = false;
          for (int i = 0; i < evaluatorList.size(); i++) {
            EventEvaluator<ILoggingEvent> ee = evaluatorList.get(i);
            try {
              if (ee.evaluate(le)) {
                printCallerData = true;
                break;
              }
            } catch (EvaluationException eex) {
              errorCount++;
              if (errorCount < MAX_ERROR_COUNT) {
                addError("Exception thrown for evaluator named [" + ee.getName()
                    + "]", eex);
              } else if (errorCount == MAX_ERROR_COUNT) {
                ErrorStatus errorStatus = new ErrorStatus(
                    "Exception thrown for evaluator named [" + ee.getName() + "].",
                    this, eex);
                errorStatus.add(new ErrorStatus(
                    "This was the last warning about this evaluator's errors."
                        + "We don't want the StatusManager to get flooded.", this));
                addStatus(errorStatus);
              }
    
            }
          }
    
          if (!printCallerData) {
            return CoreConstants.EMPTY_STRING;
          }
        }
    
        StackTraceElement[] cda = le.getCallerData();
        if (cda != null && cda.length > 0) {
          int limit = depth < cda.length ? depth : cda.length;
    
          for (int i = 0; i < limit; i++) {
            buf.append(getCallerLinePrefix());
            buf.append(i);
            buf.append("\t at ");
            buf.append(cda[i]);
            buf.append(CoreConstants.LINE_SEPARATOR);
          }
          return buf.toString();
        } else {
          return CallerData.CALLER_DATA_NA;
        }
      }
    
      protected String getCallerLinePrefix() {
        return DEFAULT_CALLER_LINE_PREFIX;
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000167�00000000000�011571� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/pattern/RootCauseFirstThrowableProxyConverter.java����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/pattern/RootCauseFirstThrowableP0000644�0001750�0001750�00000004143�12136042271�033354� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.pattern;
    
    import ch.qos.logback.classic.spi.IThrowableProxy;
    import ch.qos.logback.classic.spi.StackTraceElementProxy;
    import ch.qos.logback.classic.spi.ThrowableProxyUtil;
    import ch.qos.logback.core.CoreConstants;
    
    /**
     * @author Tomasz Nurkiewicz
     * @since 0.9.30
     */
    public class RootCauseFirstThrowableProxyConverter extends ExtendedThrowableProxyConverter {
    
      @Override
      protected String throwableProxyToString(IThrowableProxy tp) {
        StringBuilder buf = new StringBuilder(2048);
        subjoinRootCauseFirst(tp, buf);
        return buf.toString();
      }
    
      private void subjoinRootCauseFirst(IThrowableProxy tp, StringBuilder buf) {
        if (tp.getCause() != null)
          subjoinRootCauseFirst(tp.getCause(), buf);
        subjoinRootCause(tp, buf);
      }
    
      private void subjoinRootCause(IThrowableProxy tp, StringBuilder buf) {
        ThrowableProxyUtil.subjoinFirstLineRootCauseFirst(buf, tp);
        buf.append(CoreConstants.LINE_SEPARATOR);
        StackTraceElementProxy[] stepArray = tp.getStackTraceElementProxyArray();
        int commonFrames = tp.getCommonFrames();
    
        boolean unrestrictedPrinting = lengthOption > stepArray.length;
    
    
        int maxIndex = (unrestrictedPrinting) ? stepArray.length : lengthOption;
        if (commonFrames > 0 && unrestrictedPrinting) {
          maxIndex -= commonFrames;
        }
    
        for (int i = 0; i < maxIndex; i++) {
          String string = stepArray[i].toString();
          buf.append(CoreConstants.TAB);
          buf.append(string);
          extraData(buf, stepArray[i]); // allow other data to be added
          buf.append(CoreConstants.LINE_SEPARATOR);
        }
    
      }
    
    
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/pattern/LevelConverter.java�����0000644�0001750�0001750�00000001452�12136042271�032327� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.pattern;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    
    /**
     * Return the event's level.
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public class LevelConverter extends ClassicConverter {
    
      public String convert(ILoggingEvent le) {
        return le.getLevel().toString();
      }
    
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000151�00000000000�011562� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/pattern/EnsureExceptionHandling.java������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/pattern/EnsureExceptionHandling.0000644�0001750�0001750�00000004526�12136042271�033320� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.pattern;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.pattern.Converter;
    import ch.qos.logback.core.pattern.ConverterUtil;
    import ch.qos.logback.core.pattern.PostCompileProcessor;
    
    public class EnsureExceptionHandling implements
        PostCompileProcessor<ILoggingEvent> {
    
      /**
       * This implementation checks if any of the converters in the chain handles
       * exceptions. If not, then this method adds a
       * {@link ExtendedThrowableProxyConverter} instance to the end of the chain.
       * <p>
       * This allows appenders using this layout to output exception information
       * event if the user forgets to add %ex to the pattern. Note that the
       * appenders defined in the Core package are not aware of exceptions nor
       * LoggingEvents.
       * <p>
       * If for some reason the user wishes to NOT print exceptions, then she can
       * add %nopex to the pattern.
       * 
       * 
       */
      public void process(Converter<ILoggingEvent> head) {
        if(head == null) {
          // this should never happen
          throw new IllegalArgumentException("cannot process empty chain");
        }
        if (!chainHandlesThrowable(head)) {
          Converter<ILoggingEvent> tail = ConverterUtil.findTail(head);
          Converter<ILoggingEvent> exConverter = new ExtendedThrowableProxyConverter();
          tail.setNext(exConverter);
        }
      }
    
      /**
       * This method computes whether a chain of converters handles exceptions or
       * not.
       * 
       * @param head
       *                The first element of the chain
       * @return true if can handle throwables contained in logging events
       */
      public boolean chainHandlesThrowable(Converter head) {
        Converter c = head;
        while (c != null) {
          if (c instanceof ThrowableHandlingConverter) {
            return true;
          }
          c = c.getNext();
        }
        return false;
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000167�00000000000�011571� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/pattern/TargetLengthBasedClassNameAbbreviator.java����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/pattern/TargetLengthBasedClassNa0000644�0001750�0001750�00000007671�12136042271�033255� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.pattern;
    
    import ch.qos.logback.classic.ClassicConstants;
    import ch.qos.logback.core.CoreConstants;
    
    public class TargetLengthBasedClassNameAbbreviator implements Abbreviator {
    
      final int targetLength;
    
      public TargetLengthBasedClassNameAbbreviator(int targetLength) {
        this.targetLength = targetLength;
      }
    
      public String abbreviate(String fqClassName) {
        StringBuilder buf = new StringBuilder(targetLength);
        if (fqClassName == null) {
          throw new IllegalArgumentException("Class name may not be null");
        }
    
        int inLen = fqClassName.length();
        if (inLen < targetLength) {
          return fqClassName;
        }
    
        int[] dotIndexesArray = new int[ClassicConstants.MAX_DOTS];
        // a.b.c contains 2 dots but 2+1 parts.
        // see also http://jira.qos.ch/browse/LBCLASSIC-110
        int[] lengthArray = new int[ClassicConstants.MAX_DOTS + 1];
    
        int dotCount = computeDotIndexes(fqClassName, dotIndexesArray);
    
        // System.out.println();
        // System.out.println("Dot count for [" + className + "] is " + dotCount);
        // if there are not dots than abbreviation is not possible
        if (dotCount == 0) {
          return fqClassName;
        }
        // printArray("dotArray: ", dotArray);
        computeLengthArray(fqClassName, dotIndexesArray, lengthArray, dotCount);
        // printArray("lengthArray: ", lengthArray);
        for (int i = 0; i <= dotCount; i++) {
          if (i == 0) {
            buf.append(fqClassName.substring(0, lengthArray[i] - 1));
          } else {
            buf.append(fqClassName.substring(dotIndexesArray[i - 1],
                dotIndexesArray[i - 1] + lengthArray[i]));
          }
          // System.out.println("i=" + i + ", buf=" + buf);
        }
    
        return buf.toString();
      }
    
      static int computeDotIndexes(final String className, int[] dotArray) {
        int dotCount = 0;
        int k = 0;
        while (true) {
          // ignore the $ separator in our computations. This is both convenient
          // and sensible.
          k = className.indexOf(CoreConstants.DOT, k);
          if (k != -1 && dotCount < ClassicConstants.MAX_DOTS) {
            dotArray[dotCount] = k;
            dotCount++;
            k++;
          } else {
            break;
          }
        }
        return dotCount;
      }
    
      void computeLengthArray(final String className, int[] dotArray,
          int[] lengthArray, int dotCount) {
        int toTrim = className.length() - targetLength;
        // System.out.println("toTrim=" + toTrim);
    
        // int toTrimAvarage = 0;
    
        int len;
        for (int i = 0; i < dotCount; i++) {
          int previousDotPosition = -1;
          if (i > 0) {
            previousDotPosition = dotArray[i - 1];
          }
          int available = dotArray[i] - previousDotPosition - 1;
          // System.out.println("i=" + i + ", available = " + available);
    
          len = (available < 1) ? available : 1;
          // System.out.println("i=" + i + ", toTrim = " + toTrim);
    
          if (toTrim > 0) {
            len = (available < 1) ? available : 1;
          } else {
            len = available;
          }
          toTrim -= (available - len);
          lengthArray[i] = len + 1;
        }
    
        int lastDotIndex = dotCount - 1;
        lengthArray[dotCount] = className.length() - dotArray[lastDotIndex];
      }
    
      static void printArray(String msg, int[] ia) {
        System.out.print(msg);
        for (int i = 0; i < ia.length; i++) {
          if (i == 0) {
            System.out.print(ia[i]);
          } else {
            System.out.print(", " + ia[i]);
          }
        }
        System.out.println();
      }
    }�����������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/pattern/MDCConverter.java�������0000644�0001750�0001750�00000004203�12136042271�031660� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.pattern;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    
    import java.util.Map;
    
    import static ch.qos.logback.core.util.OptionHelper.extractDefaultReplacement;
    
    public class MDCConverter extends ClassicConverter {
    
      private String key;
      private String defaultValue = "";
    
      @Override
      public void start() {
    		String[] keyInfo = extractDefaultReplacement(getFirstOption());
    		key = keyInfo[0];
        if (keyInfo[1] != null) {
          defaultValue = keyInfo[1];
        }
        super.start();
      }
    
      @Override
      public void stop() {
        key = null;
        super.stop();
      }
    
      @Override
      public String convert(ILoggingEvent event) {
        Map<String, String> mdcPropertyMap = event.getMDCPropertyMap();
    
        if (mdcPropertyMap == null) {
          return defaultValue;
        }
    
        if (key == null) {
          return outputMDCForAllKeys(mdcPropertyMap);
        } else {
    
          String value = event.getMDCPropertyMap().get(key);
          if (value != null) {
            return value;
          } else {
            return defaultValue;
          }
        }
      }
    
      /**
       * if no key is specified, return all the values present in the MDC, in the format "k1=v1, k2=v2, ..."
       */
      private String outputMDCForAllKeys(Map<String, String> mdcPropertyMap) {
        StringBuilder buf = new StringBuilder();
        boolean first = true;
        for (Map.Entry<String, String> entry : mdcPropertyMap.entrySet()) {
          if (first) {
            first = false;
          } else {
            buf.append(", ");
          }
          //format: key0=value0, key1=value1
          buf.append(entry.getKey()).append('=').append(entry.getValue());
        }
        return buf.toString();
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000161�00000000000�011563� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/pattern/ExtendedThrowableProxyConverter.java����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/pattern/ExtendedThrowableProxyCo0000644�0001750�0001750�00000002033�12136042271�033400� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.pattern;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.classic.spi.StackTraceElementProxy;
    import ch.qos.logback.classic.spi.ThrowableProxyUtil;
    
    public class ExtendedThrowableProxyConverter extends ThrowableProxyConverter {
    
      @Override
      protected void extraData(StringBuilder builder, StackTraceElementProxy step) {
        if (step != null) {
          ThrowableProxyUtil.subjoinPackagingData(builder, step);
        }
      }
    
      protected void prepareLoggingEvent(ILoggingEvent event) {
        
      }
    
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000151�00000000000�011562� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/pattern/ThrowableProxyConverter.java������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/pattern/ThrowableProxyConverter.0000644�0001750�0001750�00000013427�12136042271�033414� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.pattern;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.classic.spi.IThrowableProxy;
    import ch.qos.logback.classic.spi.StackTraceElementProxy;
    import ch.qos.logback.classic.spi.ThrowableProxyUtil;
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.boolex.EvaluationException;
    import ch.qos.logback.core.boolex.EventEvaluator;
    import ch.qos.logback.core.status.ErrorStatus;
    
    /**
     * Add a stack trace in case the event contains a Throwable.
     *
     * @author Ceki G&uuml;lc&uuml;
     */
    public class ThrowableProxyConverter extends ThrowableHandlingConverter {
    
      int lengthOption;
      List<EventEvaluator<ILoggingEvent>> evaluatorList = null;
    
      int errorCount = 0;
    
      @SuppressWarnings("unchecked")
      public void start() {
    
        String lengthStr = getFirstOption();
    
        if (lengthStr == null) {
          lengthOption = Integer.MAX_VALUE;
        } else {
          lengthStr = lengthStr.toLowerCase();
          if ("full".equals(lengthStr)) {
            lengthOption = Integer.MAX_VALUE;
          } else if ("short".equals(lengthStr)) {
            lengthOption = 2;
          } else {
            try {
              // we add one because, printing starts at offset 1
              lengthOption = Integer.parseInt(lengthStr) + 1;
            } catch (NumberFormatException nfe) {
              addError("Could not parse [" + lengthStr + "] as an integer");
              lengthOption = Integer.MAX_VALUE;
            }
          }
        }
    
        final List optionList = getOptionList();
    
        if (optionList != null && optionList.size() > 1) {
          final int optionListSize = optionList.size();
          for (int i = 1; i < optionListSize; i++) {
            String evaluatorStr = (String) optionList.get(i);
            Context context = getContext();
            Map evaluatorMap = (Map) context.getObject(CoreConstants.EVALUATOR_MAP);
            EventEvaluator<ILoggingEvent> ee = (EventEvaluator<ILoggingEvent>) evaluatorMap
                    .get(evaluatorStr);
            addEvaluator(ee);
          }
        }
        super.start();
      }
    
      private void addEvaluator(EventEvaluator<ILoggingEvent> ee) {
        if (evaluatorList == null) {
          evaluatorList = new ArrayList<EventEvaluator<ILoggingEvent>>();
        }
        evaluatorList.add(ee);
      }
    
      public void stop() {
        evaluatorList = null;
        super.stop();
      }
    
      protected void extraData(StringBuilder builder, StackTraceElementProxy step) {
        // nop
      }
    
      public String convert(ILoggingEvent event) {
    
        IThrowableProxy tp = event.getThrowableProxy();
        if (tp == null) {
          return CoreConstants.EMPTY_STRING;
        }
    
        // an evaluator match will cause stack printing to be skipped
        if (evaluatorList != null) {
          boolean printStack = true;
          for (int i = 0; i < evaluatorList.size(); i++) {
            EventEvaluator<ILoggingEvent> ee = evaluatorList.get(i);
            try {
              if (ee.evaluate(event)) {
                printStack = false;
                break;
              }
            } catch (EvaluationException eex) {
              errorCount++;
              if (errorCount < CoreConstants.MAX_ERROR_COUNT) {
                addError("Exception thrown for evaluator named [" + ee.getName()
                        + "]", eex);
              } else if (errorCount == CoreConstants.MAX_ERROR_COUNT) {
                ErrorStatus errorStatus = new ErrorStatus(
                        "Exception thrown for evaluator named [" + ee.getName() + "].",
                        this, eex);
                errorStatus.add(new ErrorStatus(
                        "This was the last warning about this evaluator's errors."
                                + "We don't want the StatusManager to get flooded.", this));
                addStatus(errorStatus);
              }
            }
          }
    
          if (!printStack) {
            return CoreConstants.EMPTY_STRING;
          }
        }
    
        return throwableProxyToString(tp);
      }
    
      protected String throwableProxyToString(IThrowableProxy tp) {
        StringBuilder buf = new StringBuilder(32);
        IThrowableProxy currentThrowable = tp;
        while (currentThrowable != null) {
          subjoinThrowableProxy(buf, currentThrowable);
          currentThrowable = currentThrowable.getCause();
        }
        return buf.toString();
      }
    
      void subjoinThrowableProxy(StringBuilder buf, IThrowableProxy tp) {
        ThrowableProxyUtil.subjoinFirstLine(buf, tp);
        buf.append(CoreConstants.LINE_SEPARATOR);
        StackTraceElementProxy[] stepArray = tp.getStackTraceElementProxyArray();
        int commonFrames = tp.getCommonFrames();
    
        boolean unrestrictedPrinting = lengthOption > stepArray.length;
    
    
        int maxIndex = (unrestrictedPrinting) ? stepArray.length : lengthOption;
        if (commonFrames > 0 && unrestrictedPrinting) {
          maxIndex -= commonFrames;
        }
    
        for (int i = 0; i < maxIndex; i++) {
          String string = stepArray[i].toString();
          buf.append(CoreConstants.TAB);
          buf.append(string);
          extraData(buf, stepArray[i]); // allow other data to be added
          buf.append(CoreConstants.LINE_SEPARATOR);
        }
    
        if (commonFrames > 0 && unrestrictedPrinting) {
          buf.append("\t... ").append(tp.getCommonFrames()).append(
                  " common frames omitted").append(CoreConstants.LINE_SEPARATOR);
        }
      }
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000146�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/pattern/SyslogStartConverter.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/pattern/SyslogStartConverter.jav0000644�0001750�0001750�00000005645�12136042271�033425� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.pattern;
    
    import java.net.InetAddress;
    import java.net.UnknownHostException;
    import java.text.DateFormatSymbols;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Locale;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.classic.util.LevelToSyslogSeverity;
    import ch.qos.logback.core.net.SyslogAppenderBase;
    
    public class SyslogStartConverter extends ClassicConverter {
    
      long lastTimestamp = -1;
      String timesmapStr = null;
      SimpleDateFormat simpleFormat;
      String localHostName;
      int facility;
    
      public void start() {
        int errorCount = 0;
        
        String facilityStr = getFirstOption();
        if (facilityStr == null) {
          addError("was expecting a facility string as an option");
          return;
        }
    
        facility = SyslogAppenderBase.facilityStringToint(facilityStr);
      
        localHostName = getLocalHostname();
        try {
          // hours should be in 0-23, see also http://jira.qos.ch/browse/LBCLASSIC-48
          simpleFormat = new SimpleDateFormat("MMM dd HH:mm:ss", new DateFormatSymbols(Locale.US));
        } catch (IllegalArgumentException e) {
          addError("Could not instantiate SimpleDateFormat", e);
          errorCount++;
        }
    
        if(errorCount == 0) {
          super.start();
        }
      }
    
      public String convert(ILoggingEvent event) {
        StringBuilder sb = new StringBuilder();
    
        int pri = facility + LevelToSyslogSeverity.convert(event);
      
        sb.append("<");
        sb.append(pri);
        sb.append(">");
        sb.append(computeTimeStampString(event.getTimeStamp()));
        sb.append(' ');
        sb.append(localHostName);
        sb.append(' ');
    
        return sb.toString();
      }
    
      /**
       * This method gets the network name of the machine we are running on.
       * Returns "UNKNOWN_LOCALHOST" in the unlikely case where the host name 
       * cannot be found.
       * @return String the name of the local host
       */
      public String getLocalHostname() {
        try {
          InetAddress addr = InetAddress.getLocalHost();
          return addr.getHostName();
        } catch (UnknownHostException uhe) {
          addError("Could not determine local host name", uhe);
          return "UNKNOWN_LOCALHOST";
        }
      }
    
      String computeTimeStampString(long now) {
        synchronized (this) {
          if (now != lastTimestamp) {
            lastTimestamp = now;
            timesmapStr = simpleFormat.format(new Date(now));
          }
          return timesmapStr;
        }
      }  
    }
    �������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/pattern/DateConverter.java������0000644�0001750�0001750�00000004044�12136042271�032135� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.pattern;
    
    import java.util.List;
    import java.util.TimeZone;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.util.CachingDateFormatter;
    
    public class DateConverter extends ClassicConverter {
    
      long lastTimestamp = -1;
      String timestampStrCache = null;
      CachingDateFormatter cachingDateFormatter = null;
    
      public void start() {
    
    
        String datePattern = getFirstOption();
        if (datePattern == null) {
          datePattern = CoreConstants.ISO8601_PATTERN;
        }
    
        if (datePattern.equals(CoreConstants.ISO8601_STR)) {
          datePattern = CoreConstants.ISO8601_PATTERN;
        }
    
        try {
          cachingDateFormatter = new CachingDateFormatter(datePattern);
          // maximumCacheValidity =
          // CachedDateFormat.getMaximumCacheValidity(pattern);
        } catch (IllegalArgumentException e) {
          addWarn("Could not instantiate SimpleDateFormat with pattern "
              + datePattern, e);
          // default to the ISO8601 format
          cachingDateFormatter = new CachingDateFormatter(CoreConstants.ISO8601_PATTERN);
        }
    
        List optionList = getOptionList();
    
        // if the option list contains a TZ option, then set it.
        if (optionList != null && optionList.size() > 1) {
          TimeZone tz = TimeZone.getTimeZone((String) optionList.get(1));
          cachingDateFormatter.setTimeZone(tz);
        }
      }
    
      public String convert(ILoggingEvent le) {
        long timestamp = le.getTimeStamp();
        return cachingDateFormatter.format(timestamp);
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/pattern/MessageConverter.java���0000644�0001750�0001750�00000001476�12136042271�032652� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.pattern;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    
    /**
     * Return the event's formatted message.
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public class MessageConverter extends ClassicConverter {
    
      public String convert(ILoggingEvent event) {
        return event.getFormattedMessage();
      }
    
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000147�00000000000�011567� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/pattern/FileOfCallerConverter.java��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/pattern/FileOfCallerConverter.ja0000644�0001750�0001750�00000001637�12136042271�033225� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.pattern;
    
    import ch.qos.logback.classic.spi.CallerData;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    
    public class FileOfCallerConverter extends ClassicConverter {
    
      public String convert(ILoggingEvent le) {
        StackTraceElement[] cda = le.getCallerData();
        if (cda != null && cda.length > 0) {
          return cda[0].getFileName();
        } else {
          return CallerData.NA;
        }
      }
    
    }
    �������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000150�00000000000�011561� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/pattern/LineSeparatorConverter.java�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/pattern/LineSeparatorConverter.j0000644�0001750�0001750�00000001426�12136042271�033341� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.pattern;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.CoreConstants;
    
    public class LineSeparatorConverter extends ClassicConverter {
    
      public String convert(ILoggingEvent event) {
        return CoreConstants.LINE_SEPARATOR;
      }
    
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/pattern/color/������������������0000755�0001750�0001750�00000000000�12203357067�027650� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000166�00000000000�011570� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/pattern/color/HighlightingCompositeConverter.java�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/pattern/color/HighlightingCompos0000644�0001750�0001750�00000002555�12136042271�033361� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.pattern.color;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import static ch.qos.logback.core.pattern.color.ANSIConstants.*;
    import ch.qos.logback.core.pattern.color.ForegroundCompositeConverterBase;
    
    
    /**
     * Highlights inner-text depending on the level, in bold red for events of level ERROR, in red for WARN,
     * in BLUE for INFO, and in the default color for other levels.
     */
    public class HighlightingCompositeConverter extends ForegroundCompositeConverterBase<ILoggingEvent> {
    
      @Override
      protected String getForegroundColorCode(ILoggingEvent event) {
        Level level = event.getLevel();
        switch (level.toInt()) {
          case Level.ERROR_INT: return BOLD+RED_FG;
          case Level.WARN_INT: return RED_FG;
          case Level.INFO_INT: return BLUE_FG;
          default: return DEFAULT_FG;
        }
    
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/ClassicConstants.java�����������0000644�0001750�0001750�00000004063�12136511545�031177� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic;
    
    import org.slf4j.Marker;
    import org.slf4j.MarkerFactory;
    
    public class ClassicConstants {
      public static final String USER_MDC_KEY = "user";
    
      public static final String LOGBACK_CONTEXT_SELECTOR = "logback.ContextSelector";
      public static final String JNDI_CONFIGURATION_RESOURCE = "java:comp/env/logback/configuration-resource";
      public static final String JNDI_CONTEXT_NAME = "java:comp/env/logback/context-name";
    
      /**
       * The maximum number of package separators (dots) that abbreviation
       * algorithms can handle. Class or logger names with more separators will have
       * their first MAX_DOTS parts shortened.
       * 
       */
      public static final int MAX_DOTS = 16;
    
      /**
       * The default stack data depth computed during caller data extraction.
       */
      public static final int DEFAULT_MAX_CALLEDER_DATA_DEPTH = 8;
      
      public static final String REQUEST_REMOTE_HOST_MDC_KEY = "req.remoteHost";
      public static final String REQUEST_USER_AGENT_MDC_KEY = "req.userAgent";
      public static final String REQUEST_REQUEST_URI = "req.requestURI";
      public static final String REQUEST_QUERY_STRING = "req.queryString";
      public static final String REQUEST_REQUEST_URL = "req.requestURL";
      public static final String REQUEST_X_FORWARDED_FOR = "req.xForwardedFor";
    
      public static final String GAFFER_CONFIGURATOR_FQCN = "ch.qos.logback.classic.gaffer.GafferConfigurator";
    
      public static final String FINALIZE_SESSION = "FINALIZE_SESSION";
      public static final Marker FINALIZE_SESSION_MARKER = MarkerFactory.getMarker(FINALIZE_SESSION);
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/encoder/������������������������0000755�0001750�0001750�00000000000�12203357067�026474� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000146�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/encoder/PatternLayoutEncoder.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/encoder/PatternLayoutEncoder.jav0000644�0001750�0001750�00000002136�12136042271�033304� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.encoder;
    
    import ch.qos.logback.classic.PatternLayout;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.pattern.PatternLayoutEncoderBase;
    
    public class PatternLayoutEncoder extends PatternLayoutEncoderBase<ILoggingEvent> {
    
      @Override
      public void start() {
        PatternLayout patternLayout = new PatternLayout();
        patternLayout.setContext(context);
        patternLayout.setPattern(getPattern());
        patternLayout.setOutputPatternAsHeader(outputPatternAsHeader);
        patternLayout.start();
        this.layout = patternLayout;
        super.start();
      }
       
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/html/���������������������������0000755�0001750�0001750�00000000000�12203357067�026021� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000147�00000000000�011567� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/html/DefaultThrowableRenderer.java��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/html/DefaultThrowableRenderer.ja0000644�0001750�0001750�00000004512�12136042271�033253� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.html;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.classic.spi.IThrowableProxy;
    import ch.qos.logback.classic.spi.StackTraceElementProxy;
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.helpers.Transform;
    import ch.qos.logback.core.html.IThrowableRenderer;
    
    public class DefaultThrowableRenderer implements
        IThrowableRenderer<ILoggingEvent> {
    
      static final String TRACE_PREFIX = "<br />&nbsp;&nbsp;&nbsp;&nbsp;";
    
      public void render(StringBuilder sbuf, ILoggingEvent event) {
        IThrowableProxy tp = event.getThrowableProxy();
        sbuf.append("<tr><td class=\"Exception\" colspan=\"6\">");
        while (tp != null) {
          render(sbuf, tp);
          tp = tp.getCause();
        }
        sbuf.append("</td></tr>");
      }
    
      void render(StringBuilder sbuf, IThrowableProxy tp) {
        printFirstLine(sbuf, tp);
        
        int commonFrames = tp.getCommonFrames();
        StackTraceElementProxy[] stepArray = tp.getStackTraceElementProxyArray();
        
        for (int i = 0; i < stepArray.length - commonFrames; i++) {
          StackTraceElementProxy step = stepArray[i];
          sbuf.append(TRACE_PREFIX);
          sbuf.append(Transform.escapeTags(step.toString()));
          sbuf.append(CoreConstants.LINE_SEPARATOR);
        }
        
        if (commonFrames > 0) {
          sbuf.append(TRACE_PREFIX);
          sbuf.append("\t... " + commonFrames).append(" common frames omitted")
              .append(CoreConstants.LINE_SEPARATOR);
        }
      }
    
      public void printFirstLine(StringBuilder sb, IThrowableProxy tp) {
        int commonFrames = tp.getCommonFrames();
        if (commonFrames > 0) {
          sb.append("<br />").append(CoreConstants.CAUSED_BY);
        }
        sb.append(tp.getClassName()).append(": ").append(
            Transform.escapeTags(tp.getMessage()));
        sb.append(CoreConstants.LINE_SEPARATOR);
      }
    
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/html/UrlCssBuilder.java���������0000644�0001750�0001750�00000002270�12136042271�031400� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.html;
    
    import ch.qos.logback.core.html.CssBuilder;
    
    
    /**
     * This class helps the HTMLLayout build the CSS link.
     * It either provides the HTMLLayout with a default css file,
     * or builds the link to an external, user-specified, file.
     *
     * @author S&eacute;bastien Pennec
     */
    public class UrlCssBuilder implements CssBuilder {
    
      String url = "http://logback.qos.ch/css/classic.css";
      
      public String getUrl() {
        return url;
      }
      
      public void setUrl(String url) {
        this.url = url;
      }
      
      public void addCss(StringBuilder sbuf) {
        sbuf.append("<link REL=StyleSheet HREF=\"");
        sbuf.append(url);
        sbuf.append("\" TITLE=\"Basic\" />");
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/html/package.html���������������0000644�0001750�0001750�00000000311�11377016712�030275� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
    
    <html> 
      <head>
        <title></title>
      </head>
      
      <body>
        
        <p>Contains classes to format log output in HTML.</p>
    
      </body> 
    </html>�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/html/DefaultCssBuilder.java�����0000644�0001750�0001750�00000004753�12136042271�032232� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.html;
    
    
    import ch.qos.logback.core.CoreConstants;
    import static ch.qos.logback.core.CoreConstants.LINE_SEPARATOR;
    import ch.qos.logback.core.html.CssBuilder;
    
    /**
     * This class helps the HTMLLayout build the CSS link. It either provides the
     * HTMLLayout with a default css file, or builds the link to an external,
     * user-specified, file.
     * 
     * @author S&eacute;bastien Pennec
     */
    public class DefaultCssBuilder implements CssBuilder {
    
      public void addCss(StringBuilder sbuf) {
        sbuf.append("<style  type=\"text/css\">");
        sbuf.append(LINE_SEPARATOR);
        sbuf
            .append("table { margin-left: 2em; margin-right: 2em; border-left: 2px solid #AAA; }");
        sbuf.append(LINE_SEPARATOR);
    
        sbuf.append("TR.even { background: #FFFFFF; }");
        sbuf.append(LINE_SEPARATOR);
    
        sbuf.append("TR.odd { background: #EAEAEA; }");
        sbuf.append(LINE_SEPARATOR);
    
        sbuf
            .append("TR.warn TD.Level, TR.error TD.Level, TR.fatal TD.Level {font-weight: bold; color: #FF4040 }");
        sbuf.append(CoreConstants.LINE_SEPARATOR);
    
        sbuf
            .append("TD { padding-right: 1ex; padding-left: 1ex; border-right: 2px solid #AAA; }");
        sbuf.append(LINE_SEPARATOR);
    
        sbuf
            .append("TD.Time, TD.Date { text-align: right; font-family: courier, monospace; font-size: smaller; }");
        sbuf.append(LINE_SEPARATOR);
    
        sbuf.append("TD.Thread { text-align: left; }");
        sbuf.append(LINE_SEPARATOR);
    
        sbuf.append("TD.Level { text-align: right; }");
        sbuf.append(LINE_SEPARATOR);
    
        sbuf.append("TD.Logger { text-align: left; }");
        sbuf.append(LINE_SEPARATOR);
    
        sbuf
            .append("TR.header { background: #596ED5; color: #FFF; font-weight: bold; font-size: larger; }");
        sbuf.append(CoreConstants.LINE_SEPARATOR);
    
        sbuf
            .append("TD.Exception { background: #A2AEE8; font-family: courier, monospace;}");
        sbuf.append(LINE_SEPARATOR);
    
        sbuf.append("</style>");
        sbuf.append(LINE_SEPARATOR);
      }
    }
    ���������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/html/HTMLLayout.java������������0000644�0001750�0001750�00000010106�12136042271�030615� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.html;
    
    import java.util.Map;
    
    import ch.qos.logback.classic.PatternLayout;
    import ch.qos.logback.classic.pattern.MDCConverter;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.classic.html.DefaultCssBuilder;
    import ch.qos.logback.core.html.HTMLLayoutBase;
    import ch.qos.logback.core.html.IThrowableRenderer;
    import ch.qos.logback.core.pattern.Converter;
    import static ch.qos.logback.core.CoreConstants.LINE_SEPARATOR;
    
    /**
     * 
     * HTMLLayout outputs events in an HTML table. <p> The content of the table
     * columns are specified using a conversion pattern. See
     * {@link ch.qos.logback.classic.PatternLayout} for documentation on the
     * available patterns. <p> For more information about this layout, please refer
     * to the online manual at
     * http://logback.qos.ch/manual/layouts.html#ClassicHTMLLayout
     * 
     * @author Ceki G&uuml;lc&uuml;
     * @author S&eacute;bastien Pennec
     */
    public class HTMLLayout extends HTMLLayoutBase<ILoggingEvent> {
    
      /**
       * Default pattern string for log output.
       */
      static final String DEFAULT_CONVERSION_PATTERN = "%date%thread%level%logger%mdc%msg";
    
      IThrowableRenderer<ILoggingEvent> throwableRenderer;
    
      /**
       * Constructs a PatternLayout using the DEFAULT_LAYOUT_PATTERN.
       * 
       * The default pattern just produces the application supplied message.
       */
      public HTMLLayout() {
        pattern = DEFAULT_CONVERSION_PATTERN;
        throwableRenderer = new DefaultThrowableRenderer();
        cssBuilder = new DefaultCssBuilder();
      }
    
      @Override
      public void start() {
        int errorCount = 0;
        if (throwableRenderer == null) {
          addError("ThrowableRender cannot be null.");
          errorCount++;
        }
        if (errorCount == 0) {
          super.start();
        }
      }
    
      protected Map<String, String> getDefaultConverterMap() {
        return PatternLayout.defaultConverterMap;
      }
    
      public String doLayout(ILoggingEvent event) {
        StringBuilder buf = new StringBuilder();
        startNewTableIfLimitReached(buf);
    
        boolean odd = true;
        if (((counter++) & 1) == 0) {
          odd = false;
        }
    
        String level = event.getLevel().toString().toLowerCase();
    
        buf.append(LINE_SEPARATOR);
        buf.append("<tr class=\"");
        buf.append(level);
        if (odd) {
          buf.append(" odd\">");
        } else {
          buf.append(" even\">");
        }
        buf.append(LINE_SEPARATOR);
    
        Converter<ILoggingEvent> c = head;
        while (c != null) {
          appendEventToBuffer(buf, c, event);
          c = c.getNext();
        }
        buf.append("</tr>");
        buf.append(LINE_SEPARATOR);
    
        if (event.getThrowableProxy() != null) {
          throwableRenderer.render(buf, event);
        }
        return buf.toString();
      }
    
      private void appendEventToBuffer(StringBuilder buf,
          Converter<ILoggingEvent> c, ILoggingEvent event) {
        buf.append("<td class=\"");
        buf.append(computeConverterName(c));
        buf.append("\">");
        c.write(buf, event);
        buf.append("</td>");
        buf.append(LINE_SEPARATOR);
      }
    
      public IThrowableRenderer getThrowableRenderer() {
        return throwableRenderer;
      }
    
      public void setThrowableRenderer(IThrowableRenderer<ILoggingEvent> throwableRenderer) {
        this.throwableRenderer = throwableRenderer;
      }
      
      @Override
      protected String computeConverterName(Converter c) {
        if(c instanceof MDCConverter) {
          MDCConverter mc = (MDCConverter) c;
          String key = mc.getFirstOption();
          if(key != null) {
            return key;
          } else {
            return "MDC";
          }
        } else {    
          return super.computeConverterName(c);
        }
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/jul/����������������������������0000755�0001750�0001750�00000000000�12203357067�025647� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/jul/JULHelper.java��������������0000644�0001750�0001750�00000004307�12136042271�030301� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.jul;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.Logger;
    
    public class JULHelper {
    
    
      static public final boolean isRegularNonRootLogger(java.util.logging.Logger julLogger) {
        if (julLogger == null)
          return false;
        return !julLogger.getName().equals("");
      }
    
      static public final boolean isRoot(java.util.logging.Logger julLogger) {
        if (julLogger == null)
          return false;
        return julLogger.getName().equals("");
      }
    
      static public java.util.logging.Level asJULLevel(Level lbLevel) {
        switch (lbLevel.levelInt) {
          case Level.ALL_INT:
            return java.util.logging.Level.ALL;
          case Level.TRACE_INT:
            return java.util.logging.Level.FINEST;
          case Level.DEBUG_INT:
            return java.util.logging.Level.FINE;
          case Level.INFO_INT:
            return java.util.logging.Level.INFO;
          case Level.WARN_INT:
            return java.util.logging.Level.WARNING;
          case Level.ERROR_INT:
            return java.util.logging.Level.SEVERE;
          case Level.OFF_INT:
            return java.util.logging.Level.OFF;
          default:
            throw new IllegalArgumentException("Unexpected level [" + lbLevel + "]");
        }
      }
    
      static public String asJULLoggerName(String loggerName) {
        if (Logger.ROOT_LOGGER_NAME.equals(loggerName))
          return "";
        else
          return loggerName;
      }
    
      static public java.util.logging.Logger asJULLogger(String loggerName) {
        String julLoggerName = asJULLoggerName(loggerName);
        return java.util.logging.Logger.getLogger(julLoggerName);
      }
    
      static public java.util.logging.Logger asJULLogger(Logger logger) {
        return asJULLogger(logger.getName());
      }
    
    }
    
    
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/jul/package.html����������������0000644�0001750�0001750�00000000142�11456067317�030132� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
    <html>
    
    
    <body>
      Logback &lt;-&gt; java.util.logging (JUL) integration.
    </body>
    
    </html>������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/jul/LevelChangePropagator.java��0000644�0001750�0001750�00000006256�12136042271�032730� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.jul;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.spi.LoggerContextListener;
    import ch.qos.logback.core.spi.ContextAwareBase;
    import ch.qos.logback.core.spi.LifeCycle;
    
    import java.util.Enumeration;
    import java.util.HashSet;
    import java.util.List;
    import java.util.Set;
    import java.util.logging.LogManager;
    
    
    /**
     * Propagate level changes made to a logback logger into the equivalent logger in j.u.l.
     */
    public class LevelChangePropagator extends ContextAwareBase implements LoggerContextListener, LifeCycle {
    
      private Set julLoggerSet = new HashSet();
      boolean isStarted = false;
      boolean resetJUL = false;
    
      public void setResetJUL(boolean resetJUL) {
        this.resetJUL = resetJUL;
      }
      
      public boolean isResetResistant() {
        return false;
      }
    
      public void onStart(LoggerContext context) {
      }
    
      public void onReset(LoggerContext context) {
      }
    
      public void onStop(LoggerContext context) {
      }
    
      public void onLevelChange(Logger logger, Level level) {
        propagate(logger, level);
      }
    
      private void propagate(Logger logger, Level level) {
        addInfo("Propagating " + level + " level on " + logger + " onto the JUL framework");
        java.util.logging.Logger julLogger = JULHelper.asJULLogger(logger);
        // prevent garbage collection of jul loggers whose level we set
        // see also  http://jira.qos.ch/browse/LBCLASSIC-256
        julLoggerSet.add(julLogger);
        java.util.logging.Level julLevel = JULHelper.asJULLevel(level);
        julLogger.setLevel(julLevel);
      }
    
      public void resetJULLevels() {
        LogManager lm = LogManager.getLogManager();
    
        Enumeration e = lm.getLoggerNames();
        while (e.hasMoreElements()) {
          String loggerName = (String) e.nextElement();
          java.util.logging.Logger julLogger = lm.getLogger(loggerName);
          if (JULHelper.isRegularNonRootLogger(julLogger) && julLogger.getLevel() != null) {
            addInfo("Setting level of jul logger [" + loggerName + "] to null");
            julLogger.setLevel(null);
          }
        }
      }
    
      private void propagateExistingLoggerLevels() {
        LoggerContext loggerContext = (LoggerContext) context;
        List<Logger> loggerList = loggerContext.getLoggerList();
        for (Logger l : loggerList) {
          if (l.getLevel() != null) {
            propagate(l, l.getLevel());
          }
        }
      }
    
      public void start() {
        if (resetJUL) {
          resetJULLevels();
        }
        propagateExistingLoggerLevels();
    
        isStarted = true;
      }
    
      public void stop() {
        isStarted = false;
      }
    
      public boolean isStarted() {
        return isStarted;
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/BasicConfigurator.java����������0000644�0001750�0001750�00000004046�12136042271�031321� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic;
    
    import org.slf4j.LoggerFactory;
    
    import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.ConsoleAppender;
    import ch.qos.logback.core.status.InfoStatus;
    import ch.qos.logback.core.status.StatusManager;
    
    /**
     * BasicConfigurator configures logback-classic by attaching a 
     * {@link ConsoleAppender} to the root logger. The console appender's layout 
     * is set to a {@link  PatternLayout} with the pattern 
     * "%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n".
     * 
     * @author Ceki Gulcu
     */
    public class BasicConfigurator {
    
      final static BasicConfigurator hiddenSingleton = new BasicConfigurator();
        
      private BasicConfigurator() {
      }
      
      public static void configure(LoggerContext lc) {
        StatusManager sm = lc.getStatusManager();
        if(sm != null)  {
         sm.add(new InfoStatus("Setting up default configuration.", lc));
        }
        ConsoleAppender<ILoggingEvent> ca = new ConsoleAppender<ILoggingEvent>();
        ca.setContext(lc);
        ca.setName("console");
        PatternLayoutEncoder pl = new PatternLayoutEncoder();
        pl.setContext(lc);
        pl.setPattern("%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n");
        pl.start();
    
        ca.setEncoder(pl);
        ca.start();
        Logger rootLogger = lc.getLogger(Logger.ROOT_LOGGER_NAME);
        rootLogger.addAppender(ca);
      }
    
      public static void configureDefaultContext() {
        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
        configure(lc);
      }
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/sift/���������������������������0000755�0001750�0001750�00000000000�12203357067�026022� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/sift/MDCBasedDiscriminator.java�0000644�0001750�0001750�00000005353�12136563562�032771� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.sift;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.sift.AbstractDiscriminator;
    import ch.qos.logback.core.util.OptionHelper;
    
    import java.util.Map;
    
    /**
     * MDCBasedDiscriminator essentially returns the value mapped to an MDC key. If
     * the said value is null, then a default value is returned.
     * <p/>
     * <p>Both Key and the DefaultValue are user specified properties.
     *
     * @author Ceki G&uuml;lc&uuml;
     */
    public class MDCBasedDiscriminator extends AbstractDiscriminator<ILoggingEvent> {
    
      private String key;
      private String defaultValue;
    
      /**
       * Return the value associated with an MDC entry designated by the Key
       * property. If that value is null, then return the value assigned to the
       * DefaultValue property.
       */
      public String getDiscriminatingValue(ILoggingEvent event) {
        // http://jira.qos.ch/browse/LBCLASSIC-213
        Map<String, String> mdcMap = event.getMDCPropertyMap();
        if (mdcMap == null) {
          return defaultValue;
        }
        String mdcValue = mdcMap.get(key);
        if (mdcValue == null) {
          return defaultValue;
        } else {
          return mdcValue;
        }
      }
    
      @Override
      public void start() {
        int errors = 0;
        if (OptionHelper.isEmpty(key)) {
          errors++;
          addError("The \"Key\" property must be set");
        }
        if (OptionHelper.isEmpty(defaultValue)) {
          errors++;
          addError("The \"DefaultValue\" property must be set");
        }
        if (errors == 0) {
          started = true;
        }
      }
    
      public String getKey() {
        return key;
      }
    
      public void setKey(String key) {
        this.key = key;
      }
    
      /**
       * @return
       * @see #setDefaultValue(String)
       */
      public String getDefaultValue() {
        return defaultValue;
      }
    
      /**
       * The default MDC value in case the MDC is not set for
       * {@link #setKey(String) mdcKey}.
       * <p/>
       * <p> For example, if {@link #setKey(String) Key} is set to the value
       * "someKey", and the MDC is not set for "someKey", then this appender will
       * use the default value, which you can set with the help of this method.
       *
       * @param defaultValue
       */
      public void setDefaultValue(String defaultValue) {
        this.defaultValue = defaultValue;
      }
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/sift/SiftingAppender.java�������0000644�0001750�0001750�00000003231�12136042271�031737� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.sift;
    
    import ch.qos.logback.classic.ClassicConstants;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.joran.spi.DefaultClass;
    import ch.qos.logback.core.sift.Discriminator;
    import ch.qos.logback.core.sift.SiftingAppenderBase;
    import org.slf4j.Marker;
    
    /**
     * This appender can contains other appenders which it can build dynamically
     * depending on MDC values. The built appender is specified as part of a
     * configuration file.
     * 
     * <p>See the logback manual for further details.
     * 
     * 
     * @author Ceki Gulcu
     */
    public class SiftingAppender extends SiftingAppenderBase<ILoggingEvent> {
    
      @Override
      protected long getTimestamp(ILoggingEvent event) {
        return event.getTimeStamp();
      }
      
    
      @Override
      @DefaultClass(MDCBasedDiscriminator.class)
      public void setDiscriminator(Discriminator<ILoggingEvent> discriminator) {
        super.setDiscriminator(discriminator);
      }
    
      protected boolean eventMarksEndOfLife(ILoggingEvent event) {
        Marker marker = event.getMarker();
        if(marker == null)
          return false;
    
        return marker.contains(ClassicConstants.FINALIZE_SESSION_MARKER);
      }
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/sift/SiftAction.java������������0000644�0001750�0001750�00000003531�12136260235�030725� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.sift;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    
    import org.xml.sax.Attributes;
    
    import ch.qos.logback.core.joran.action.Action;
    import ch.qos.logback.core.joran.event.InPlayListener;
    import ch.qos.logback.core.joran.event.SaxEvent;
    import ch.qos.logback.core.joran.spi.ActionException;
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    
    public class SiftAction extends Action implements InPlayListener {
      List<SaxEvent> seList;
    
      @Override
      public void begin(InterpretationContext ic, String name, Attributes attributes)
          throws ActionException {
        seList = new ArrayList<SaxEvent>();
        ic.addInPlayListener(this);
      }
    
      @Override
      public void end(InterpretationContext ic, String name) throws ActionException {
        ic.removeInPlayListener(this);
        Object o = ic.peekObject();
        if (o instanceof SiftingAppender) {
          SiftingAppender sa = (SiftingAppender) o;
          Map<String, String> propertyMap = ic.getCopyOfPropertyMap();
          AppenderFactoryUsingJoran appenderFactory = new AppenderFactoryUsingJoran(seList, sa
              .getDiscriminatorKey(), propertyMap);
          sa.setAppenderFactory(appenderFactory);
        }
      }
    
      public void inPlay(SaxEvent event) {
        seList.add(event);
      }
    
      public List<SaxEvent> getSeList() {
        return seList;
      }
    
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000150�00000000000�011561� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/sift/ContextBasedDiscriminator.java�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/sift/ContextBasedDiscriminator.j0000644�0001750�0001750�00000003733�12136563562�033322� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.sift;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.sift.AbstractDiscriminator;
    
    /**
     * This discriminator returns the value context to which this event is attached
     * to. If the said value is null, then a default value is returned.
     * 
     * <p>
     * Both Key and the DefaultValue are user specified properties.
     * 
     * @author Ceki G&uuml;lc&uuml;
     * 
     */
    public class ContextBasedDiscriminator extends AbstractDiscriminator<ILoggingEvent> {
    
      private static final String KEY = "contextName";
      private String defaultValue;
    
      /**
       * Return the name of the current context name as found in the logging event.
       */
      public String getDiscriminatingValue(ILoggingEvent event) {
        String contextName = event.getLoggerContextVO().getName();
    
        if (contextName == null) {
          return defaultValue;
        } else {
          return contextName;
        }
      }
    
      public String getKey() {
        return KEY;
      }
    
      public void setKey(String key) {
        throw new UnsupportedOperationException(
            "Key cannot be set. Using fixed key " + KEY);
      }
    
      /**
       * @see #setDefaultValue(String)
       * @return
       */
      public String getDefaultValue() {
        return defaultValue;
      }
    
      /**
       * The default context name in case the context name is not set for the
       * current logging event.
       * 
       * @param defaultValue
       */
      public void setDefaultValue(String defaultValue) {
        this.defaultValue = defaultValue;
      }
    }
    �������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000147�00000000000�011567� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/sift/SiftingJoranConfigurator.java��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/sift/SiftingJoranConfigurator.ja0000644�0001750�0001750�00000005532�12140150756�033317� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.sift;
    
    import java.util.Collection;
    import java.util.HashMap;
    import java.util.Map;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.classic.util.DefaultNestedComponentRules;
    import ch.qos.logback.core.Appender;
    import ch.qos.logback.core.joran.action.ActionConst;
    import ch.qos.logback.core.joran.action.AppenderAction;
    import ch.qos.logback.core.joran.spi.DefaultNestedComponentRegistry;
    import ch.qos.logback.core.joran.spi.ElementPath;
    import ch.qos.logback.core.joran.spi.ElementSelector;
    import ch.qos.logback.core.joran.spi.RuleStore;
    import ch.qos.logback.core.sift.SiftingJoranConfiguratorBase;
    
    public class SiftingJoranConfigurator  extends SiftingJoranConfiguratorBase<ILoggingEvent> {
    
    
      SiftingJoranConfigurator(String key, String value, Map<String, String> parentPropertyMap) {
        super(key, value, parentPropertyMap);
      }
      
      @Override
      protected ElementPath initialElementPath() {
        return new ElementPath("configuration");
      }
      
      @Override
      protected void addInstanceRules(RuleStore rs) {
        super.addInstanceRules(rs);
        rs.addRule(new ElementSelector("configuration/appender"), new AppenderAction());
      }
    
    
      @Override
      protected void addDefaultNestedComponentRegistryRules(
          DefaultNestedComponentRegistry registry) {
        DefaultNestedComponentRules.addDefaultNestedComponentRegistryRules(registry);
      }
        
      @Override
      protected void buildInterpreter() {
        super.buildInterpreter();
        Map<String, Object> omap = interpreter.getInterpretationContext().getObjectMap();
        omap.put(ActionConst.APPENDER_BAG, new HashMap());
        omap.put(ActionConst.FILTER_CHAIN_BAG, new HashMap());
        Map<String, String> propertiesMap = new HashMap<String, String>();
        propertiesMap.putAll(parentPropertyMap);
        propertiesMap.put(key, value);
        interpreter.setInterpretationContextPropertiesMap(propertiesMap);
      }
    
      @SuppressWarnings("unchecked")
      public Appender<ILoggingEvent> getAppender() {
        Map<String, Object> omap = interpreter.getInterpretationContext().getObjectMap();
        HashMap appenderMap = (HashMap) omap.get(ActionConst.APPENDER_BAG);
        oneAndOnlyOneCheck(appenderMap);
        Collection values = appenderMap.values();
        if(values.size() == 0) {
          return null;
        }
        return (Appender<ILoggingEvent>) values.iterator().next();
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000154�00000000000�011565� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/sift/JNDIBasedContextDiscriminator.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/sift/JNDIBasedContextDiscriminat0000644�0001750�0001750�00000004406�12136563562�033174� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.sift;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.selector.ContextSelector;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.classic.util.ContextSelectorStaticBinder;
    import ch.qos.logback.core.sift.AbstractDiscriminator;
    
    /**
     * This discriminator returns the value context as determined by JNDI. If the
     * said value is null, then a default value is returned.
     * 
     * <p>
     * Both Key and the DefaultValue are user specified properties.
     * 
     * @author Ceki G&uuml;lc&uuml;
     * 
     */
    public class JNDIBasedContextDiscriminator extends AbstractDiscriminator<ILoggingEvent> {
    
      private static final String KEY = "contextName";
      private String defaultValue;
    
      /**
       * Return the name of the current context name as found in the logging event.
       */
      public String getDiscriminatingValue(ILoggingEvent event) {
        ContextSelector selector = ContextSelectorStaticBinder.getSingleton()
            .getContextSelector();
    
        if (selector == null) {
          return defaultValue;
        }
    
        LoggerContext lc = selector.getLoggerContext();
        if (lc == null) {
          return defaultValue;
        }
    
        return lc.getName();
      }
    
      public String getKey() {
        return KEY;
      }
    
      public void setKey(String key) {
        throw new UnsupportedOperationException(
            "Key cannot be set. Using fixed key " + KEY);
      }
    
      /**
       * @see #setDefaultValue(String)
       * @return
       */
      public String getDefaultValue() {
        return defaultValue;
      }
    
      /**
       * The default context name in case the context name is not set for the
       * current logging event.
       * 
       * @param defaultValue
       */
      public void setDefaultValue(String defaultValue) {
        this.defaultValue = defaultValue;
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000150�00000000000�011561� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/sift/AppenderFactoryUsingJoran.java�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/sift/AppenderFactoryUsingJoran.j0000644�0001750�0001750�00000002420�12136260235�033254� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.sift;
    
    import java.util.List;
    import java.util.Map;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.joran.event.SaxEvent;
    import ch.qos.logback.core.sift.AbstractAppenderFactoryUsingJoran;
    import ch.qos.logback.core.sift.SiftingJoranConfiguratorBase;
    
    /**
     *
     */
    public class AppenderFactoryUsingJoran extends AbstractAppenderFactoryUsingJoran<ILoggingEvent> {
    
    
      AppenderFactoryUsingJoran(List<SaxEvent> eventList, String key, Map<String, String> parentPropertyMap) {
        super(eventList, key, parentPropertyMap);
      }
    
      public SiftingJoranConfiguratorBase<ILoggingEvent> getSiftingJoranConfigurator(String discriminatingValue) {
        return new SiftingJoranConfigurator(key, discriminatingValue, parentPropertyMap);
      }
    
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/joran/��������������������������0000755�0001750�0001750�00000000000�12203357067�026166� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/joran/action/�������������������0000755�0001750�0001750�00000000000�12203357067�027443� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/joran/action/LevelAction.java���0000644�0001750�0001750�00000004022�12136042271�032502� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.joran.action;
    
    import org.xml.sax.Attributes;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.core.joran.action.Action;
    import ch.qos.logback.core.joran.action.ActionConst;
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    
    /**
     * Action to handle the <level> element nested within <logger> element. 
     * 
     * <p>This action is <b>deprecated</b>. Use the level attribute within the logger
     * element.
     * 
     * @author Ceki Gulcu
     */
    public class LevelAction extends Action {
    
      boolean inError = false;
    
      public void begin(InterpretationContext ec, String name, Attributes attributes) {
        Object o = ec.peekObject();
    
        if (!(o instanceof Logger)) {
          inError = true;
          addError("For element <level>, could not find a logger at the top of execution stack.");
          return;
        }
    
        Logger l = (Logger) o;
    
        String loggerName = l.getName();
    
        String levelStr = ec.subst(attributes.getValue(ActionConst.VALUE_ATTR));
        //addInfo("Encapsulating logger name is [" + loggerName
        //    + "], level value is  [" + levelStr + "].");
    
        if (ActionConst.INHERITED.equalsIgnoreCase(levelStr) || ActionConst.NULL.equalsIgnoreCase(levelStr)) {
          l.setLevel(null);
        } else {
          l.setLevel(Level.toLevel(levelStr, Level.DEBUG));
        }
    
        addInfo(loggerName + " level set to " + l.getLevel());
      }
    
      public void finish(InterpretationContext ec) {
      }
    
      public void end(InterpretationContext ec, String e) {
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000152�00000000000�011563� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/joran/action/ConsolePluginAction.java�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/joran/action/ConsolePluginAction0000644�0001750�0001750�00000004067�12136042271�033305� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.joran.action;
    
    import org.xml.sax.Attributes;
    
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.net.SocketAppender;
    import ch.qos.logback.core.joran.action.Action;
    import ch.qos.logback.core.joran.spi.ActionException;
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    
    public class ConsolePluginAction extends Action {
    
      private static final String PORT_ATTR = "port";
      private static final Integer DEFAULT_PORT = 4321;
    
      @Override
      public void begin(InterpretationContext ec, String name, Attributes attributes)
          throws ActionException {
        String portStr = attributes.getValue(PORT_ATTR);
        Integer port = null;
        
        if (portStr == null) {
          port = DEFAULT_PORT;
        } else {
          try {
            port = Integer.valueOf(portStr);
          } catch (NumberFormatException ex) {
            addError("Port " + portStr
                + " in ConsolePlugin config is not a correct number");
          }
        }
    
        LoggerContext lc = (LoggerContext)ec.getContext();
        SocketAppender appender = new SocketAppender();
        appender.setContext(lc);
        appender.setIncludeCallerData(true);
        appender.setRemoteHost("localhost");
        appender.setPort(port.intValue());
        appender.start();
        Logger root = lc.getLogger(Logger.ROOT_LOGGER_NAME);
        root.addAppender(appender);
        
        addInfo("Sending LoggingEvents to the plugin using port " + port);
      }
    
      @Override
      public void end(InterpretationContext ec, String name) throws ActionException {
    
      }
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000152�00000000000�011563� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/joran/action/ConfigurationAction.java�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/joran/action/ConfigurationAction0000644�0001750�0001750�00000007364�12136042271�033336� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.joran.action;
    
    import ch.qos.logback.classic.util.EnvUtil;
    import ch.qos.logback.core.status.OnConsoleStatusListener;
    import org.xml.sax.Attributes;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.turbo.ReconfigureOnChangeFilter;
    import ch.qos.logback.core.joran.action.Action;
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    import ch.qos.logback.core.util.ContextUtil;
    import ch.qos.logback.core.util.Duration;
    import ch.qos.logback.core.util.OptionHelper;
    
    public class ConfigurationAction extends Action {
      static final String INTERNAL_DEBUG_ATTR = "debug";
      static final String SCAN_ATTR = "scan";
      static final String SCAN_PERIOD_ATTR = "scanPeriod";
      static final String DEBUG_SYSTEM_PROPERTY_KEY = "logback.debug";
    
      long threshold = 0;
    
      public void begin(InterpretationContext ic, String name, Attributes attributes) {
        threshold = System.currentTimeMillis();
    
        // See LOGBACK-527 (the system property is looked up first. Thus, it overrides
        // the equivalent property in the config file. This reversal of scope priority is justified
        // by the use case: the admin trying to chase rogue config file
        String debugAttrib = System.getProperty(DEBUG_SYSTEM_PROPERTY_KEY);
        if (debugAttrib == null) {
          debugAttrib = ic.subst(attributes.getValue(INTERNAL_DEBUG_ATTR));
        }
    
        if (OptionHelper.isEmpty(debugAttrib) || debugAttrib.equalsIgnoreCase("false")
                || debugAttrib.equalsIgnoreCase("null")) {
          addInfo(INTERNAL_DEBUG_ATTR + " attribute not set");
        } else {
          OnConsoleStatusListener.addNewInstanceToContext(context);
        }
    
        processScanAttrib(ic, attributes);
    
        ContextUtil contextUtil = new ContextUtil(context);
        contextUtil.addHostNameAsProperty();
    
        if(EnvUtil.isGroovyAvailable()) {
          LoggerContext lc = (LoggerContext) context;
          contextUtil.addGroovyPackages(lc.getFrameworkPackages());
        }
    
        // the context is turbo filter attachable, so it is pushed on top of the
        // stack
        ic.pushObject(getContext());
      }
    
      void processScanAttrib(InterpretationContext ic, Attributes attributes) {
        String scanAttrib = ic.subst(attributes.getValue(SCAN_ATTR));
        if (!OptionHelper.isEmpty(scanAttrib)
                && !"false".equalsIgnoreCase(scanAttrib)) {
          ReconfigureOnChangeFilter rocf = new ReconfigureOnChangeFilter();
          rocf.setContext(context);
          String scanPeriodAttrib = ic.subst(attributes.getValue(SCAN_PERIOD_ATTR));
          if (!OptionHelper.isEmpty(scanPeriodAttrib)) {
            try {
              Duration duration = Duration.valueOf(scanPeriodAttrib);
              rocf.setRefreshPeriod(duration.getMilliseconds());
              addInfo("Setting ReconfigureOnChangeFilter scanning period to "
                      + duration);
            } catch (NumberFormatException nfe) {
              addError("Error while converting [" + scanAttrib + "] to long", nfe);
            }
          }
          rocf.start();
          LoggerContext lc = (LoggerContext) context;
          addInfo("Adding ReconfigureOnChangeFilter as a turbo filter");
          lc.addTurboFilter(rocf);
        }
      }
    
      public void end(InterpretationContext ec, String name) {
        addInfo("End of configuration.");
        ec.popObject();
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000150�00000000000�011561� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/joran/action/ContextNameAction.java�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/joran/action/ContextNameAction.j0000644�0001750�0001750�00000002371�12136042271�033175� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.joran.action;
    
    import org.xml.sax.Attributes;
    
    import ch.qos.logback.core.joran.action.Action;
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    
    public class ContextNameAction extends Action {
    
      public void begin(InterpretationContext ec, String name, Attributes attributes) {
      }
    
      public void body(InterpretationContext ec, String body) {
    
        String finalBody = ec.subst(body);
        addInfo("Setting logger context name as [" + finalBody + "]");
        try {
          context.setName(finalBody);
        } catch (IllegalStateException e) {
          addError("Failed to rename context [" + context.getName() + "] as ["
              + finalBody + "]", e);
        }
      }
    
      public void end(InterpretationContext ec, String name) {
      }
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000154�00000000000�011565� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/joran/action/JMXConfiguratorAction.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/joran/action/JMXConfiguratorActi0000644�0001750�0001750�00000005770�12136042271�033212� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.joran.action;
    
    import java.lang.management.ManagementFactory;
    
    import javax.management.MBeanServer;
    import javax.management.ObjectName;
    
    import org.xml.sax.Attributes;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.jmx.JMXConfigurator;
    import ch.qos.logback.classic.jmx.MBeanUtil;
    import ch.qos.logback.core.joran.action.Action;
    import ch.qos.logback.core.joran.spi.ActionException;
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    import ch.qos.logback.core.util.OptionHelper;
    
    public class JMXConfiguratorAction extends Action {
    
      static final String OBJECT_NAME_ATTRIBUTE_NAME = "objectName";
      static final String CONTEXT_NAME_ATTRIBUTE_NAME = "contextName";
      static final char JMX_NAME_SEPARATOR = ',';
      
      @Override
      public void begin(InterpretationContext ec, String name, Attributes attributes)
          throws ActionException {
        addInfo("begin");
    
    
        String contextName = context.getName();
        String contextNameAttributeVal = attributes
        .getValue(CONTEXT_NAME_ATTRIBUTE_NAME);
        if(!OptionHelper.isEmpty(contextNameAttributeVal)) {
          contextName = contextNameAttributeVal;
        }
    
        String objectNameAsStr;
        String objectNameAttributeVal = attributes
            .getValue(OBJECT_NAME_ATTRIBUTE_NAME);
        if (OptionHelper.isEmpty(objectNameAttributeVal)) {
          objectNameAsStr = MBeanUtil.getObjectNameFor(contextName,
              JMXConfigurator.class);
        } else {
          objectNameAsStr = objectNameAttributeVal;
        }
    
        ObjectName objectName = MBeanUtil.string2ObjectName(context, this,
            objectNameAsStr);
        if (objectName == null) {
          addError("Failed construct ObjectName for ["+objectNameAsStr+"]");
          return;
        }
        
        MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
        if(!MBeanUtil.isRegistered(mbs, objectName)) {
          // register only of the named JMXConfigurator has not been previously
          // registered. Unregistering an MBean within invocation of itself
          // caused jconsole to throw an NPE. (This occurs when the reload* method
          // unregisters the 
          JMXConfigurator jmxConfigurator = new JMXConfigurator((LoggerContext) context, mbs,
              objectName);
          try {     
            mbs.registerMBean(jmxConfigurator, objectName);
          } catch (Exception e) {
            addError("Failed to create mbean", e);
          }
        }
    
      }
    
      @Override
      public void end(InterpretationContext ec, String name) throws ActionException {
    
      }
    
    }
    ��������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000147�00000000000�011567� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/joran/action/RootLoggerAction.java��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/joran/action/RootLoggerAction.ja0000644�0001750�0001750�00000003600�12136042271�033170� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.joran.action;
    
    import org.xml.sax.Attributes;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.core.joran.action.Action;
    import ch.qos.logback.core.joran.action.ActionConst;
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    import ch.qos.logback.core.util.OptionHelper;
    
    public class RootLoggerAction extends Action {
     
      Logger root;
      boolean inError = false;
    
      public void begin(InterpretationContext ec, String name, Attributes attributes) {
        inError = false;
    
        LoggerContext loggerContext = (LoggerContext) this.context;
        root = loggerContext.getLogger(Logger.ROOT_LOGGER_NAME);
    
        String levelStr =  ec.subst(attributes.getValue(ActionConst.LEVEL_ATTRIBUTE));
        if (!OptionHelper.isEmpty(levelStr)) {
          Level level = Level.toLevel(levelStr);
          addInfo("Setting level of ROOT logger to " + level);
          root.setLevel(level);
        }
        ec.pushObject(root);
      }
    
      public void end(InterpretationContext ec, String name) {
        if (inError) {
          return;
        }
        Object o = ec.peekObject();
        if (o != root) {
          addWarn("The object on the top the of the stack is not the root logger");
          addWarn("It is: " + o);
        } else {
          ec.popObject();
        }
      }
    
      public void finish(InterpretationContext ec) {
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000153�00000000000�011564� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/joran/action/InsertFromJNDIAction.java����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/joran/action/InsertFromJNDIActio0000644�0001750�0001750�00000005202�12136042271�033073� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.joran.action;
    
    import javax.naming.Context;
    import javax.naming.NamingException;
    
    import org.xml.sax.Attributes;
    
    import ch.qos.logback.classic.util.JNDIUtil;
    import ch.qos.logback.core.joran.action.Action;
    import ch.qos.logback.core.joran.action.ActionUtil;
    import ch.qos.logback.core.joran.action.ActionUtil.Scope;
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    import ch.qos.logback.core.util.OptionHelper;
    
    /**
     * Insert an env-entry found in JNDI as a new context variable  
    
     * @author Ceki Gulcu
     *
     */
    public class InsertFromJNDIAction extends Action {
    
      public static final String ENV_ENTRY_NAME_ATTR="env-entry-name";
      public static final String AS_ATTR="as";
      
      public void begin(InterpretationContext ec, String name, Attributes attributes) {
    
        int errorCount = 0;
        String envEntryName = ec.subst(attributes.getValue(ENV_ENTRY_NAME_ATTR));
        String asKey = ec.subst(attributes.getValue(AS_ATTR));
    
        String scopeStr = attributes.getValue(SCOPE_ATTRIBUTE);
        Scope scope = ActionUtil.stringToScope(scopeStr);
    
        String envEntryValue;
        
        if(OptionHelper.isEmpty(envEntryName)) {
          String lineColStr = getLineColStr(ec);
          addError("["+ENV_ENTRY_NAME_ATTR+"] missing, around "+lineColStr);
          errorCount++;
        }
        
        if(OptionHelper.isEmpty(asKey)) {
          String lineColStr = getLineColStr(ec);
          addError("["+AS_ATTR+"] missing, around "+lineColStr);
          errorCount++;
        }
        
        if(errorCount != 0) {
          return;
        }
        
        try {
          Context ctx = JNDIUtil.getInitialContext();
          envEntryValue = JNDIUtil.lookup(ctx, envEntryName);
          if(OptionHelper.isEmpty(envEntryValue)) {
            addError("["+envEntryName+"] has null or empty value");
          } else {
            addInfo("Setting variable ["+asKey+"] to ["+envEntryValue+"] in ["+scope+"] scope");
            ActionUtil.setProperty(ec, asKey, envEntryValue, scope);
          }
        } catch (NamingException e) {
          addError("Failed to lookup JNDI env-entry ["+envEntryName+"]");
        }
        
        
      }
    
      public void end(InterpretationContext ec, String name) {
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/joran/action/ReceiverAction.java0000644�0001750�0001750�00000004544�12143151241�033204� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.joran.action;
    
    import org.xml.sax.Attributes;
    
    import ch.qos.logback.classic.net.ReceiverBase;
    import ch.qos.logback.classic.net.SocketReceiver;
    import ch.qos.logback.core.joran.action.Action;
    import ch.qos.logback.core.joran.spi.ActionException;
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    import ch.qos.logback.core.util.OptionHelper;
    
    /**
     * A Joran {@link Action} for a {@link SocketReceiver} configuration.
     *
     * @author Carl Harris
     */
    public class ReceiverAction extends Action {
    
      private ReceiverBase receiver;
      private boolean inError;
      
      @Override
      public void begin(InterpretationContext ic, String name,
          Attributes attributes) throws ActionException {
        
        String className = attributes.getValue(CLASS_ATTRIBUTE);
        if (OptionHelper.isEmpty(className)) {
          addError("Missing class name for receiver. Near [" + name
              + "] line " + getLineNumber(ic));
          inError = true;
          return;
        }
    
        try {
          addInfo("About to instantiate receiver of type [" + className + "]");
    
          receiver = (ReceiverBase) OptionHelper.instantiateByClassName(
              className, ReceiverBase.class, context);
          receiver.setContext(context);
          
          ic.pushObject(receiver);
        }
        catch (Exception ex) {
          inError = true;
          addError("Could not create a receiver of type [" + className + "].", ex);
          throw new ActionException(ex);
        }
      }
    
      @Override
      public void end(InterpretationContext ic, String name)
          throws ActionException {
        
        if (inError) return;
        
        ic.getContext().register(receiver);
        receiver.start();
        
        Object o = ic.peekObject();
        if (o != receiver) {
          addWarn("The object at the of the stack is not the remote " +
          		"pushed earlier.");
        } else {
          ic.popObject();
        }
      }
    
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000146�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/joran/action/EvaluatorAction.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/joran/action/EvaluatorAction.jav0000644�0001750�0001750�00000001503�12136042271�033235� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.joran.action;
    
    import ch.qos.logback.classic.boolex.JaninoEventEvaluator;
    import ch.qos.logback.core.joran.action.AbstractEventEvaluatorAction;
    
    public class EvaluatorAction extends AbstractEventEvaluatorAction {
      protected String defaultClassName() {
        return JaninoEventEvaluator.class.getName();
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000162�00000000000�011564� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/joran/action/LoggerContextListenerAction.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/joran/action/LoggerContextListen0000644�0001750�0001750�00000005107�12136042271�033325� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.joran.action;
    
    import ch.qos.logback.classic.spi.LoggerContextListener;
    import ch.qos.logback.core.spi.ContextAware;
    import ch.qos.logback.core.spi.LifeCycle;
    import org.xml.sax.Attributes;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.core.joran.action.Action;
    import ch.qos.logback.core.joran.spi.ActionException;
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    import ch.qos.logback.core.util.OptionHelper;
    
    public class LoggerContextListenerAction extends Action {
      boolean inError = false;
      LoggerContextListener lcl;
    
      @Override
      public void begin(InterpretationContext ec, String name, Attributes attributes)
              throws ActionException {
    
        inError = false;
    
        String className = attributes.getValue(CLASS_ATTRIBUTE);
        if (OptionHelper.isEmpty(className)) {
          addError("Mandatory \"" + CLASS_ATTRIBUTE
                  + "\" attribute not set for <loggerContextListener> element");
          inError = true;
          return;
        }
    
        try {
          lcl = (LoggerContextListener) OptionHelper.instantiateByClassName(
                  className, LoggerContextListener.class, context);
    
          if(lcl instanceof ContextAware) {
            ((ContextAware) lcl).setContext(context);
          }
    
          ec.pushObject(lcl);
          addInfo("Adding LoggerContextListener of type [" + className
                  + "] to the object stack");
    
        } catch (Exception oops) {
          inError = true;
          addError("Could not create LoggerContextListener of type " + className + "].", oops);
        }
      }
    
      @Override
      public void end(InterpretationContext ec, String name) throws ActionException {
        if (inError) {
          return;
        }
        Object o = ec.peekObject();
    
        if (o != lcl) {
          addWarn("The object on the top the of the stack is not the LoggerContextListener pushed earlier.");
        } else {
          if (lcl instanceof LifeCycle) {
            ((LifeCycle) lcl).start();
            addInfo("Starting LoggerContextListener");
          }
          ((LoggerContext) context).addListener(lcl);
          ec.popObject();
        }
      }
    
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/joran/action/LoggerAction.java��0000644�0001750�0001750�00000006116�12136042271�032660� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.joran.action;
    
    import org.xml.sax.Attributes;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.core.joran.action.Action;
    import ch.qos.logback.core.joran.action.ActionConst;
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    import ch.qos.logback.core.util.OptionHelper;
    
    /**
     * Action which handles <logger> elements in configuration files.
     * 
     * @author Ceki Gulcu
     */
    public class LoggerAction extends Action {
      public static final String LEVEL_ATTRIBUTE = "level";
    
      boolean inError = false;
      Logger logger;
      public void begin(InterpretationContext ec, String name, Attributes attributes) {
        // Let us forget about previous errors (in this object)
        inError = false;
        logger = null;
        
        LoggerContext loggerContext = (LoggerContext) this.context;
    
        String loggerName = ec.subst(attributes.getValue(NAME_ATTRIBUTE));
    
        if (OptionHelper.isEmpty(loggerName)) {
          inError = true;
          String aroundLine = getLineColStr(ec);
          String errorMsg = "No 'name' attribute in element " + name + ", around " +aroundLine;
          addError(errorMsg);
          return;
        }
    
        logger = loggerContext.getLogger(loggerName);
    
        String levelStr =  ec.subst(attributes.getValue(LEVEL_ATTRIBUTE));
        
        if (!OptionHelper.isEmpty(levelStr)) {
          if (ActionConst.INHERITED.equalsIgnoreCase(levelStr)
              || ActionConst.NULL.equalsIgnoreCase(levelStr)) {
            addInfo("Setting level of logger [" + loggerName
                + "] to null, i.e. INHERITED");
            logger.setLevel(null);
          } else {
            Level level = Level.toLevel(levelStr);
            addInfo("Setting level of logger [" + loggerName + "] to " + level);
            logger.setLevel(level);
          }
        }
    
        String additivityStr =  ec.subst(attributes.getValue(ActionConst.ADDITIVITY_ATTRIBUTE));
        if (!OptionHelper.isEmpty(additivityStr)) {
          boolean additive = OptionHelper.toBoolean(additivityStr, true);
          addInfo("Setting additivity of logger [" + loggerName + "] to "
              + additive);
          logger.setAdditive(additive);
        }
        ec.pushObject(logger);
      }
    
      public void end(InterpretationContext ec, String e) {
        if (inError) {
          return;
        }
        Object o = ec.peekObject();
        if (o != logger) {
          addWarn("The object on the top the of the stack is not "+logger+" pushed earlier");
          addWarn("It is: " + o);
        } else {
          ec.popObject();
        }
      }
    
      public void finish(InterpretationContext ec) {
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/joran/package.html��������������0000644�0001750�0001750�00000000300�11377016712�030440� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
    
    <html> 
      <head>
        <title></title>
      </head>
      
      <body>
        
        <p>Contains Joran configuration classes.</p>
    
      </body> 
    </html>��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/joran/JoranConfigurator.java����0000644�0001750�0001750�00000007754�12140150756�032476� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.joran;
    
    import ch.qos.logback.classic.joran.action.*;
    import ch.qos.logback.classic.sift.SiftAction;
    import ch.qos.logback.classic.spi.PlatformInfo;
    import ch.qos.logback.classic.util.DefaultNestedComponentRules;
    import ch.qos.logback.core.joran.JoranConfiguratorBase;
    import ch.qos.logback.core.joran.action.AppenderRefAction;
    import ch.qos.logback.core.joran.action.IncludeAction;
    import ch.qos.logback.core.joran.action.NOPAction;
    import ch.qos.logback.core.joran.conditional.ElseAction;
    import ch.qos.logback.core.joran.conditional.IfAction;
    import ch.qos.logback.core.joran.conditional.ThenAction;
    import ch.qos.logback.core.joran.spi.DefaultNestedComponentRegistry;
    import ch.qos.logback.core.joran.spi.ElementSelector;
    import ch.qos.logback.core.joran.spi.RuleStore;
    
    /**
     * JoranConfigurator class adds rules specific to logback-classic.
     *
     * @author Ceki G&uuml;lc&uuml;
     */
    public class JoranConfigurator extends JoranConfiguratorBase {
    
      @Override
      public void addInstanceRules(RuleStore rs) {
        // parent rules already added
        super.addInstanceRules(rs);
    
        rs.addRule(new ElementSelector("configuration"), new ConfigurationAction());
    
        rs.addRule(new ElementSelector("configuration/contextName"),
            new ContextNameAction());
          rs.addRule(new ElementSelector("configuration/contextListener"),
            new LoggerContextListenerAction());
        rs.addRule(new ElementSelector("configuration/insertFromJNDI"),
            new InsertFromJNDIAction());
        rs.addRule(new ElementSelector("configuration/evaluator"), new EvaluatorAction());
    
        rs.addRule(new ElementSelector("configuration/appender/sift"), new SiftAction());
        rs.addRule(new ElementSelector("configuration/appender/sift/*"), new NOPAction());
    
        rs.addRule(new ElementSelector("configuration/logger"), new LoggerAction());
        rs.addRule(new ElementSelector("configuration/logger/level"), new LevelAction());
    
        rs.addRule(new ElementSelector("configuration/root"), new RootLoggerAction());
        rs.addRule(new ElementSelector("configuration/root/level"), new LevelAction());
        rs.addRule(new ElementSelector("configuration/logger/appender-ref"),
            new AppenderRefAction());
        rs.addRule(new ElementSelector("configuration/root/appender-ref"),
            new AppenderRefAction());
        
        // add if-then-else support
        rs.addRule(new ElementSelector("*/if"), new IfAction());
        rs.addRule(new ElementSelector("*/if/then"), new ThenAction());
        rs.addRule(new ElementSelector("*/if/then/*"), new NOPAction());
        rs.addRule(new ElementSelector("*/if/else"), new ElseAction());
        rs.addRule(new ElementSelector("*/if/else/*"), new NOPAction());
        
        // add jmxConfigurator only if we have JMX available.
        // If running under JDK 1.4 (retrotranslateed logback) then we
        // might not have JMX.
        if (PlatformInfo.hasJMXObjectName()) {
          rs.addRule(new ElementSelector("configuration/jmxConfigurator"),
              new JMXConfiguratorAction());
        }
        rs.addRule(new ElementSelector("configuration/include"), new IncludeAction());
    
        rs.addRule(new ElementSelector("configuration/consolePlugin"),
            new ConsolePluginAction());
        
        rs.addRule(new ElementSelector("configuration/receiver"),
            new ReceiverAction());
        
      }
    
      @Override
      protected void addDefaultNestedComponentRegistryRules(
          DefaultNestedComponentRegistry registry) {
        DefaultNestedComponentRules.addDefaultNestedComponentRegistryRules(registry);
      }
    
    }
    ��������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/gaffer/�������������������������0000755�0001750�0001750�00000000000�12203357067�026307� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/gaffer/GafferUtil.java����������0000644�0001750�0001750�00000005536�12136042271�031204� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.gaffer;
    
    import ch.qos.logback.classic.ClassicConstants;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.core.status.ErrorStatus;
    import ch.qos.logback.core.status.StatusManager;
    
    import java.io.File;
    import java.lang.reflect.Constructor;
    import java.lang.reflect.InvocationTargetException;
    import java.net.URL;
    
    /**
     * @author Ceki G&uuml;c&uuml;
     */
    public class GafferUtil {
    
      private static String ERROR_MSG = "Failed to instantiate " + ClassicConstants.GAFFER_CONFIGURATOR_FQCN;
    
      public static void runGafferConfiguratorOn(LoggerContext loggerContext, Object origin, File configFile) {
        GafferConfigurator gafferConfigurator = GafferUtil.newGafferConfiguratorInstance(loggerContext, origin);
        if (gafferConfigurator != null) {
          gafferConfigurator.run(configFile);
        }
      }
    
      public static void runGafferConfiguratorOn(LoggerContext loggerContext, Object origin, URL configFile) {
        GafferConfigurator gafferConfigurator = GafferUtil.newGafferConfiguratorInstance(loggerContext, origin);
        if (gafferConfigurator != null) {
          gafferConfigurator.run(configFile);
        }
      }
    
      private static GafferConfigurator newGafferConfiguratorInstance(LoggerContext loggerContext, Object origin) {
    
        try {
          Class gcClass = Class.forName(ClassicConstants.GAFFER_CONFIGURATOR_FQCN);
          Constructor c = gcClass.getConstructor(LoggerContext.class);
          return (GafferConfigurator) c.newInstance(loggerContext);
        } catch (ClassNotFoundException e) {
          addError(loggerContext, origin, ERROR_MSG, e);
        } catch (NoSuchMethodException e) {
          addError(loggerContext, origin, ERROR_MSG, e);
        } catch (InvocationTargetException e) {
          addError(loggerContext, origin, ERROR_MSG, e);
        } catch (InstantiationException e) {
          addError(loggerContext, origin, ERROR_MSG, e);
        } catch (IllegalAccessException e) {
          addError(loggerContext, origin, ERROR_MSG, e);
        }
        return null;
      }
    
      private static void addError(LoggerContext context, Object origin, String msg) {
        addError(context, origin, msg, null);
      }
    
      private static void addError(LoggerContext context, Object origin, String msg, Throwable t) {
        StatusManager sm = context.getStatusManager();
        if (sm == null) {
          return;
        }
        sm.add(new ErrorStatus(msg, origin, t));
      }
    
    
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/Level.java����������������������0000644�0001750�0001750�00000020766�12136042271�026773� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic;
    
    import org.slf4j.spi.LocationAwareLogger;
    
    /**
     * Defines the set of levels recognized by logback-classic, that is {@link #OFF},
     * {@link #ERROR}, {@link #WARN}, {@link #INFO}, {@link #DEBUG},
     * {@link #TRACE} and {@link #ALL}. <p/> The <code>Level</code> class is
     * final and cannot be sub-classed.
     * </p>
     */
    public final class Level implements java.io.Serializable {
    
      private static final long serialVersionUID = -814092767334282137L;
    
      public static final int OFF_INT = Integer.MAX_VALUE;
      public static final int ERROR_INT = 40000;
      public static final int WARN_INT = 30000;
      public static final int INFO_INT = 20000;
      public static final int DEBUG_INT = 10000;
      public static final int TRACE_INT = 5000;
      public static final int ALL_INT = Integer.MIN_VALUE;
    
      public static final Integer OFF_INTEGER = OFF_INT;
      public static final Integer ERROR_INTEGER = ERROR_INT;
      public static final Integer WARN_INTEGER = WARN_INT;
      public static final Integer INFO_INTEGER = INFO_INT;
      public static final Integer DEBUG_INTEGER = DEBUG_INT;
      public static final Integer TRACE_INTEGER = TRACE_INT;
      public static final Integer ALL_INTEGER = ALL_INT;
    
      /**
       * The <code>OFF</code> is used to turn off logging.
       */
      public static final Level OFF = new Level(OFF_INT, "OFF");
    
      /**
       * The <code>ERROR</code> level designates error events which may or not
       * be fatal to the application.
       */
      public static final Level ERROR = new Level(ERROR_INT, "ERROR");
    
      /**
       * The <code>WARN</code> level designates potentially harmful situations.
       */
      public static final Level WARN = new Level(WARN_INT, "WARN");
    
      /**
       * The <code>INFO</code> level designates informational messages
       * highlighting overall progress of the application.
       */
      public static final Level INFO = new Level(INFO_INT, "INFO");
    
      /**
       * The <code>DEBUG</code> level designates informational events of lower
       * importance.
       */
      public static final Level DEBUG = new Level(DEBUG_INT, "DEBUG");
    
      /**
       * The <code>TRACE</code> level designates informational events of very low
       * importance.
       */
      public static final Level TRACE = new Level(TRACE_INT, "TRACE");
    
      /**
       * The <code>ALL</code> is used to turn on all logging.
       */
      public static final Level ALL = new Level(ALL_INT, "ALL");
    
      public final int levelInt;
      public final String levelStr;
    
      /**
       * Instantiate a Level object.
       */
      private Level(int levelInt, String levelStr) {
        this.levelInt = levelInt;
        this.levelStr = levelStr;
      }
    
      /**
       * Returns the string representation of this Level.
       */
      public String toString() {
        return levelStr;
      }
    
      /**
       * Returns the integer representation of this Level.
       */
      public int toInt() {
        return levelInt;
      }
    
      /**
       * Convert a Level to an Integer object.
       *
       * @return This level's Integer mapping.
       */
      public Integer toInteger() {
        switch (levelInt) {
          case ALL_INT:
            return ALL_INTEGER;
          case TRACE_INT:
            return TRACE_INTEGER;
          case DEBUG_INT:
            return DEBUG_INTEGER;
          case INFO_INT:
            return INFO_INTEGER;
          case WARN_INT:
            return WARN_INTEGER;
          case ERROR_INT:
            return ERROR_INTEGER;
          case OFF_INT:
            return OFF_INTEGER;
          default:
            throw new IllegalStateException("Level " + levelStr + ", " + levelInt
                    + " is unknown.");
        }
      }
    
      /**
       * Returns <code>true</code> if this Level has a higher or equal Level than
       * the Level passed as argument, <code>false</code> otherwise.
       */
      public boolean isGreaterOrEqual(Level r) {
        return levelInt >= r.levelInt;
      }
    
      /**
       * Convert the string passed as argument to a Level. If the conversion fails,
       * then this method returns {@link #DEBUG}.
       */
      public static Level toLevel(String sArg) {
        return toLevel(sArg, Level.DEBUG);
      }
    
    
      /**
       * This method exists in order to comply with Joran's valueOf convention.
       *
       * @param sArg
       * @return
       */
      public static Level valueOf(String sArg) {
        return toLevel(sArg, Level.DEBUG);
      }
    
    
      /**
       * Convert an integer passed as argument to a Level. If the conversion fails,
       * then this method returns {@link #DEBUG}.
       */
      public static Level toLevel(int val) {
        return toLevel(val, Level.DEBUG);
      }
    
      /**
       * Convert an integer passed as argument to a Level. If the conversion fails,
       * then this method returns the specified default.
       */
      public static Level toLevel(int val, Level defaultLevel) {
        switch (val) {
          case ALL_INT:
            return ALL;
          case TRACE_INT:
            return TRACE;
          case DEBUG_INT:
            return DEBUG;
          case INFO_INT:
            return INFO;
          case WARN_INT:
            return WARN;
          case ERROR_INT:
            return ERROR;
          case OFF_INT:
            return OFF;
          default:
            return defaultLevel;
        }
      }
    
      /**
       * Convert the string passed as argument to a Level. If the conversion fails,
       * then this method returns the value of <code>defaultLevel</code>.
       */
      public static Level toLevel(String sArg, Level defaultLevel) {
        if (sArg == null) {
          return defaultLevel;
        }
    
        if (sArg.equalsIgnoreCase("ALL")) {
          return Level.ALL;
        }
        if (sArg.equalsIgnoreCase("TRACE")) {
          return Level.TRACE;
        }
        if (sArg.equalsIgnoreCase("DEBUG")) {
          return Level.DEBUG;
        }
        if (sArg.equalsIgnoreCase("INFO")) {
          return Level.INFO;
        }
        if (sArg.equalsIgnoreCase("WARN")) {
          return Level.WARN;
        }
        if (sArg.equalsIgnoreCase("ERROR")) {
          return Level.ERROR;
        }
        if (sArg.equalsIgnoreCase("OFF")) {
          return Level.OFF;
        }
        return defaultLevel;
      }
    
      /**
       * Return the flyweight instance of the level received through serizalization,
       * i.e. 'this'.
       *
       * @return The appropriate flyweight instance
       */
      private Object readResolve() {
        return toLevel(this.levelInt);
      }
    
      /**
       * Convert one of the integer values defined in {@link LocationAwareLogger}
       * interface to an instance of this class, i.e. a Level.
       *
       * @param levelInt An integer value representing a level as defined in LocationAwareLogger
       * @return an instance of this class, i.e. a Level.
       * @since 1.0.1
       */
      public static Level fromLocationAwareLoggerInteger(int levelInt) {
        Level level;
        switch (levelInt) {
          case LocationAwareLogger.TRACE_INT:
            level = TRACE;
            break;
          case LocationAwareLogger.DEBUG_INT:
            level = DEBUG;
            break;
          case LocationAwareLogger.INFO_INT:
            level = INFO;
            break;
          case LocationAwareLogger.WARN_INT:
            level = WARN;
            break;
          case LocationAwareLogger.ERROR_INT:
            level = ERROR;
            break;
          default:
            throw new IllegalArgumentException(levelInt + " not a valid level value");
        }
        return level;
      }
    
      /**
       * Convert this level instance to an integer  value defined in the
       * {@link LocationAwareLogger} interface.
       *
       * @param level The level to convert to LocationAwareLogger integer
       * @return int An integer corresponding to this level as defined in LocationAwareLogger
       * @since 1.0.1
       */
      public static int toLocationAwareLoggerInteger(Level level) {
        if (level == null)
          throw new IllegalArgumentException("null level parameter is not admitted");
        switch (level.toInt()) {
          case Level.TRACE_INT:
            return LocationAwareLogger.TRACE_INT;
          case Level.DEBUG_INT:
            return LocationAwareLogger.DEBUG_INT;
          case Level.INFO_INT:
            return LocationAwareLogger.INFO_INT;
          case Level.WARN_INT:
            return LocationAwareLogger.WARN_INT;
          case Level.ERROR_INT:
            return LocationAwareLogger.ERROR_INT;
          default:
            throw new IllegalArgumentException(level + " not a valid level value");
        }
      }
    }
    ����������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/turbo/��������������������������0000755�0001750�0001750�00000000000�12203357067�026210� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000146�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/turbo/DuplicateMessageFilter.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/turbo/DuplicateMessageFilter.jav0000644�0001750�0001750�00000004335�12136042271�033275� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.turbo;
    
    import org.slf4j.Marker;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.core.spi.FilterReply;
    
    /**
     * 
     * See {@link http://logback.qos.ch/manual/filters.html#DuplicateMessageFilter}
     * for details.
     * 
     * @author Ceki Gulcu
     * 
     */
    public class DuplicateMessageFilter extends TurboFilter {
    
      /**
       * The default cache size.
       */
      public static final int DEFAULT_CACHE_SIZE = 100;
      /**
       * The default number of allows repetitions.
       */
      public static final int DEFAULT_ALLOWED_REPETITIONS = 5;
    
      public int allowedRepetitions = DEFAULT_ALLOWED_REPETITIONS;
      public int cacheSize = DEFAULT_CACHE_SIZE;
    
      private LRUMessageCache msgCache;
    
      @Override
      public void start() {
        msgCache = new LRUMessageCache(cacheSize);
        super.start();
      }
    
      @Override
      public void stop() {
        msgCache.clear();
        msgCache = null;
        super.stop();
      }
    
      @Override
      public FilterReply decide(Marker marker, Logger logger, Level level,
          String format, Object[] params, Throwable t) {
        int count = msgCache.getMessageCountAndThenIncrement(format);
        if (count <= allowedRepetitions) {
          return FilterReply.NEUTRAL;
        } else {
          return FilterReply.DENY;
        }
      }
    
      public int getAllowedRepetitions() {
        return allowedRepetitions;
      }
    
      /**
       * The allowed number of repetitions before
       * 
       * @param allowedRepetitions
       */
      public void setAllowedRepetitions(int allowedRepetitions) {
        this.allowedRepetitions = allowedRepetitions;
      }
    
      public int getCacheSize() {
        return cacheSize;
      }
    
      public void setCacheSize(int cacheSize) {
        this.cacheSize = cacheSize;
      }
    
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/turbo/LRUMessageCache.java������0000644�0001750�0001750�00000003511�12136042271�031737� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.turbo;
    
    import java.util.LinkedHashMap;
    import java.util.Map;
    
    /**
     * Clients of this class should only use the  {@link #getMessageCountAndThenIncrement} method. Other methods inherited
     * via LinkedHashMap are not thread safe.
     */
    class LRUMessageCache extends LinkedHashMap<String, Integer> {
    
      private static final long serialVersionUID = 1L;
      final int cacheSize;
    
      LRUMessageCache(int cacheSize) {
        super((int) (cacheSize * (4.0f / 3)), 0.75f, true);
        if (cacheSize < 1) {
          throw new IllegalArgumentException("Cache size cannot be smaller than 1");
        }
        this.cacheSize = cacheSize;
      }
    
      int getMessageCountAndThenIncrement(String msg) {
        // don't insert null elements
        if (msg == null) {
          return 0;
        }
    
        Integer i;
        // LinkedHashMap is not LinkedHashMap. See also LBCLASSIC-255
        synchronized (this) {
          i = super.get(msg);
          if (i == null) {
            i = 0;
          } else {
            i = i + 1;
          }
          super.put(msg, i);
        }
        return i;
      }
    
      // called indirectly by get() or put() which are already supposed to be
      // called from within a synchronized block
      protected boolean removeEldestEntry(Map.Entry eldest) {
        return (size() > cacheSize);
      }
    
      @Override
      synchronized public void clear() {
        super.clear();
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000146�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/turbo/DynamicThresholdFilter.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/turbo/DynamicThresholdFilter.jav0000644�0001750�0001750�00000021251�12136042271�033313� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.turbo;
    
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.core.spi.FilterReply;
    import org.slf4j.Marker;
    import org.slf4j.MDC;
    
    import java.util.Map;
    import java.util.HashMap;
    
    /**
     * This filter allows for efficient course grained filtering based on criteria
     * such as product name or company name that would be associated with requests
     * as they are processed.
     * 
     * <p> This filter will allow you to associate threshold levels to a key put in
     * the MDC. This key can be any value specified by the user. Furthermore, you
     * can pass MDC value and level threshold associations, which are then looked up
     * to find the level threshold to apply to the current logging request. If no
     * level threshold could be found, then a 'default' value specified by the user
     * is applied. We call this value 'levelAssociatedWithMDCValue'.
     * 
     * <p> If 'levelAssociatedWithMDCValue' is higher or equal to the level of the
     * current logger request, the
     * {@link #decide(Marker, Logger, Level, String, Object[], Throwable) decide()}
     * method returns the value of {@link #getOnHigherOrEqual() onHigherOrEqual},
     * if it is lower then the value of {@link #getOnLower() onLower} is returned.
     * Both 'onHigherOrEqual' and 'onLower' can be set by the user. By default,
     * 'onHigherOrEqual' is set to NEUTRAL and 'onLower' is set to DENY. Thus, if
     * the current logger request's level is lower than
     * 'levelAssociatedWithMDCValue', then the request is denied, and if it is
     * higher or equal, then this filter decides NEUTRAL letting subsequent filters
     * to make the decision on the fate of the logging request.
     * 
     * <p> The example below illustrates how logging could be enabled for only
     * individual users. In this example all events for logger names matching
     * "com.mycompany" will be logged if they are for 'user1' and at a level higher
     * than equals to DEBUG, and for 'user2' if they are at a level higher than or
     * equal to TRACE, and for other users only if they are at level ERROR or
     * higher. Events issued by loggers other than "com.mycompany" will only be
     * logged if they are at level ERROR or higher since that is all the root logger
     * allows.
     * 
     * <pre>
     * &lt;configuration&gt;
     *   &lt;appender name="STDOUT"
     *             class="ch.qos.logback.core.ConsoleAppender"&gt;
     *     &lt;layout class="ch.qos.logback.classic.PatternLayout"&gt;
     *       &lt;Pattern>TEST %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n&lt;/Pattern>
     *     &lt;/layout&gt;
     *   &lt;/appender&gt;
     *   
     *   &lt;turboFilter class=&quot;ch.qos.logback.classic.turbo.DynamicThresholdFilter&quot;&gt;
     *     &lt;Key&gt;userId&lt;/Key&gt;
     *     &lt;DefaultThreshold&gt;ERROR&lt;/DefaultThreshold&gt;
     *     &lt;MDCValueLevelPair&gt;
     *       &lt;value&gt;user1&lt;/value&gt;
     *       &lt;level&gt;DEBUG&lt;/level&gt;
     *     &lt;/MDCValueLevelPair&gt;
     *     &lt;MDCValueLevelPair&gt;
     *       &lt;value&gt;user2&lt;/value&gt;
     *       &lt;level&gt;TRACE&lt;/level&gt;
     *     &lt;/MDCValueLevelPair&gt;
     *   &lt;/turboFilter&gt;
     *   
     *   &lt;logger name="com.mycompany" level="TRACE"/&gt;
     *   
     *   &lt;root level="ERROR" &gt;
     *     &lt;appender-ref ref="STDOUT" /&gt;
     *   &lt;/root&gt;
     * &lt;/configuration&gt;
     * </pre>
     * 
     * In the next configuration events from user1 and user2 will be logged
     * regardless of the logger levels. Events for other users and records without a
     * userid in the MDC will be logged if they are ERROR level messages. With this
     * configuration, the root level is never checked since DynamicThresholdFilter
     * will either accept or deny all records.
     * 
     * <pre>
     * &lt;configuration&gt;
     *   &lt;appender name="STDOUT"
     *             class="ch.qos.logback.core.ConsoleAppender"&gt;
     *     &lt;layout class="ch.qos.logback.classic.PatternLayout"&gt;
     *        &lt;Pattern>TEST %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n&lt;/Pattern>
     *     &lt;/layout&gt;
     *   &lt;/appender&gt;
     *   
     *   &lt;turboFilter class=&quot;ch.qos.logback.classic.turbo.DynamicThresholdFilter&quot;&gt;
     *     &lt;Key&gt;userId&lt;/Key&gt;
     *     &lt;DefaultThreshold&gt;ERROR&lt;/DefaultThreshold&gt;
     *     &lt;OnHigherOrEqual&gt;ACCEPT&lt;/OnHigherOrEqual&gt;
     *     &lt;OnLower&gt;DENY&lt;/OnLower&gt;
     *     &lt;MDCValueLevelPair&gt;
     *       &lt;value&gt;user1&lt;/value&gt;
     *       &lt;level&gt;TRACE&lt;/level&gt;
     *     &lt;/MDCValueLevelPair&gt;
     *     &lt;MDCValueLevelPair&gt;
     *       &lt;value&gt;user2&lt;/value&gt;
     *       &lt;level&gt;TRACE&lt;/level&gt;
     *     &lt;/MDCValueLevelPair&gt;
     *   &lt;/turboFilter&gt;
     *   
     *   &lt;root level="DEBUG" &gt;
     *     &lt;appender-ref ref="STDOUT" /&gt;
     *   &lt;/root&gt;
     * &lt;/configuration&gt;
     * </pre>
     * 
     * @author Raplh Goers
     * @author Ceki G&uuml;lc&uuml;
     */
    public class DynamicThresholdFilter extends TurboFilter {
      private Map<String, Level> valueLevelMap = new HashMap<String, Level>();
      private Level defaultThreshold = Level.ERROR;
      private String key;
    
      private FilterReply onHigherOrEqual = FilterReply.NEUTRAL;
      private FilterReply onLower = FilterReply.DENY;
    
      /**
       * Get the MDC key whose value will be used as a level threshold
       * 
       * @return the name of the MDC key.
       */
      public String getKey() {
        return this.key;
      }
    
      /**
       * @see setKey
       */
      public void setKey(String key) {
        this.key = key;
      }
    
      /**
       * Get the default threshold value when the MDC key is not set.
       * 
       * @return the default threshold value in the absence of a set MDC key
       */
      public Level getDefaultThreshold() {
        return defaultThreshold;
      }
    
      public void setDefaultThreshold(Level defaultThreshold) {
        this.defaultThreshold = defaultThreshold;
      }
    
      /**
       * Get the FilterReply when the effective level is higher or equal to the
       * level of current logging request
       * 
       * @return FilterReply
       */
      public FilterReply getOnHigherOrEqual() {
        return onHigherOrEqual;
      }
    
      public void setOnHigherOrEqual(FilterReply onHigherOrEqual) {
        this.onHigherOrEqual = onHigherOrEqual;
      }
    
      /**
       * Get the FilterReply when the effective level is lower than the level of
       * current logging request
       * 
       * @return FilterReply
       */
      public FilterReply getOnLower() {
        return onLower;
      }
    
      public void setOnLower(FilterReply onLower) {
        this.onLower = onLower;
      }
    
      /**
       * Add a new MDCValuePair
       */
      public void addMDCValueLevelPair(MDCValueLevelPair mdcValueLevelPair) {
        if (valueLevelMap.containsKey(mdcValueLevelPair.getValue())) {
          addError(mdcValueLevelPair.getValue() + " has been already set");
        } else {
          valueLevelMap.put(mdcValueLevelPair.getValue(), mdcValueLevelPair
              .getLevel());
        }
      }
    
      /**
       * 
       */
      @Override
      public void start() {
        if (this.key == null) {
          addError("No key name was specified");
        }
        super.start();
      }
    
      /**
       * This method first finds the MDC value for 'key'. It then finds the level
       * threshold associated with this MDC value from the list of MDCValueLevelPair
       * passed to this filter. This value is stored in a variable called
       * 'levelAssociatedWithMDCValue'. If it null, then it is set to the
       * 
       * @{link #defaultThreshold} value.
       * 
       * If no such value exists, then
       * 
       * 
       * @param marker
       * @param logger
       * @param level
       * @param s
       * @param objects
       * @param throwable
       * 
       * @return FilterReply - this filter's decision
       */
      @Override
      public FilterReply decide(Marker marker, Logger logger, Level level,
          String s, Object[] objects, Throwable throwable) {
    
        String mdcValue = MDC.get(this.key);
        if (!isStarted()) {
          return FilterReply.NEUTRAL;
        }
    
        Level levelAssociatedWithMDCValue = null;
        if (mdcValue != null) {
          levelAssociatedWithMDCValue = valueLevelMap.get(mdcValue);
        }
        if (levelAssociatedWithMDCValue == null) {
          levelAssociatedWithMDCValue = defaultThreshold;
        }
        if (level.isGreaterOrEqual(levelAssociatedWithMDCValue)) {
          return onHigherOrEqual;
        } else {
          return onLower;
        }
      }
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/turbo/MarkerFilter.java���������0000644�0001750�0001750�00000003262�12136042271�031436� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.turbo;
    
    import org.slf4j.Marker;
    import org.slf4j.MarkerFactory;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.core.spi.FilterReply;
    
    /**
     * Checks whether the marker in the event matches the marker specified by the 
     * user.
     */
    public class MarkerFilter extends MatchingFilter {
    
      Marker markerToMatch;
    
      @Override
      public void start() {
        if(markerToMatch != null) {
          super.start();
        } else {
          addError("The marker property must be set for ["+getName()+"]");
        }
      }
      
      @Override
      public FilterReply decide(Marker marker, Logger logger, Level level, String format, Object[] params, Throwable t) {
        if(!isStarted()) {
          return FilterReply.NEUTRAL;
        }
        
        if(marker == null) {
          return onMismatch;
        } 
        
        if(marker.contains(markerToMatch)) {
          return onMatch;
        } else {
          return onMismatch;
        }
      }
    
      /**
       * The marker to match in the event.
       * 
       * @param markerStr
       */
      public void setMarker(String markerStr) {
        if(markerStr != null) {
          this.markerToMatch = MarkerFactory.getMarker(markerStr);
        }
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/turbo/MDCFilter.java������������0000644�0001750�0001750�00000003657�12136042271�030630� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.turbo;
    
    import org.slf4j.MDC;
    import org.slf4j.Marker;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.core.spi.FilterReply;
    
    /**
     * This class allows output for a given MDC value.
     * 
     * <p>
     * When the given value is identified by this TurboFilter, 
     * the reply is based on the OnMatch option.
     * The information is taken from the MDC. For this TurboFilter to work,
     * one must set the key that will be used to 
     * access the information in the MDC.
     * 
     * <p>
     * To allow output for the value, set the OnMatch option
     * to ACCEPT. To disable output for the given value, set
     * the OnMatch option to DENY.
     * 
     * <p>
     * By default, values of the OnMatch and OnMisMatch
     * options are set to NEUTRAL.
     * 
     *
     * @author Ceki G&uuml;lc&uuml;
     * @author S&eacute;bastien Pennec
     */
    public class MDCFilter extends MatchingFilter {
    
      String MDCKey;
      String value;
      
      @Override
      public FilterReply decide(Marker marker, Logger logger, Level level, String format, Object[] params, Throwable t) {
        if (MDCKey == null) {
          return FilterReply.NEUTRAL;
        }
        
        String value = MDC.get(MDCKey);
        if (this.value.equals(value)) {
          return onMatch;
        }
        return onMismatch;
      }
      
      public void setValue(String value) {
        this.value = value;
      }
      
      public void setMDCKey(String MDCKey) {
        this.MDCKey = MDCKey;
      }
    
    }
    ���������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/turbo/MatchingFilter.java�������0000644�0001750�0001750�00000003005�12136042271�031742� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.turbo;
    
    import ch.qos.logback.core.spi.FilterReply;
    
    /**
     * An abstract class containing support for {@link #onMatch} on {@link #onMismatch} 
     * attributes, shared by many but not all turbo filters.
     *  
     * @author Ceki Gulcu
     */
    public abstract class MatchingFilter extends TurboFilter {
    
      protected FilterReply onMatch = FilterReply.NEUTRAL;
      protected FilterReply onMismatch = FilterReply.NEUTRAL;
        
      final public void setOnMatch(String action) {
        if ("NEUTRAL".equals(action)) {
          onMatch = FilterReply.NEUTRAL;
        } else if ("ACCEPT".equals(action)) {
          onMatch = FilterReply.ACCEPT;
        } else if ("DENY".equals(action)) {
          onMatch = FilterReply.DENY;
        }
      }
    
      final public void setOnMismatch(String action) {
        if ("NEUTRAL".equals(action)) {
          onMismatch = FilterReply.NEUTRAL;
        } else if ("ACCEPT".equals(action)) {
          onMismatch = FilterReply.ACCEPT;
        } else if ("DENY".equals(action)) {
          onMismatch = FilterReply.DENY;
        }
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000151�00000000000�011562� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/turbo/ReconfigureOnChangeFilter.java������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/turbo/ReconfigureOnChangeFilter.0000644�0001750�0001750�00000022204�12140451064�033222� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.turbo;
    
    import java.io.File;
    import java.net.URL;
    import java.util.List;
    
    import ch.qos.logback.classic.gaffer.GafferUtil;
    import ch.qos.logback.classic.util.EnvUtil;
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.joran.event.SaxEvent;
    import ch.qos.logback.core.joran.spi.ConfigurationWatchList;
    import ch.qos.logback.core.joran.util.ConfigurationWatchListUtil;
    import ch.qos.logback.core.status.StatusUtil;
    import org.slf4j.Marker;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.spi.FilterReply;
    
    import static ch.qos.logback.core.CoreConstants.MILLIS_IN_ONE_SECOND;
    
    /**
     * Reconfigure a LoggerContext when the configuration file changes.
     *
     * @author Ceki Gulcu
     */
    public class ReconfigureOnChangeFilter extends TurboFilter {
    
      /**
       * Scan for changes in configuration file once every minute.
       */
      // 1 minute - value mentioned in documentation
      public final static long DEFAULT_REFRESH_PERIOD = 60 * MILLIS_IN_ONE_SECOND;
    
      long refreshPeriod = DEFAULT_REFRESH_PERIOD;
      URL mainConfigurationURL;
      protected volatile long nextCheck;
    
      ConfigurationWatchList configurationWatchList;
    
      @Override
      public void start() {
        configurationWatchList = ConfigurationWatchListUtil.getConfigurationWatchList(context);
        if (configurationWatchList != null) {
          mainConfigurationURL = configurationWatchList.getMainURL();
          if(mainConfigurationURL == null) {
            addWarn("Due to missing top level configuration file, automatic reconfiguration is impossible.");
            return;
          }
          List<File> watchList = configurationWatchList.getCopyOfFileWatchList();
          long inSeconds = refreshPeriod / 1000;
          addInfo("Will scan for changes in [" + watchList + "] every "
                  + inSeconds + " seconds. ");
          synchronized (configurationWatchList) {
            updateNextCheck(System.currentTimeMillis());
          }
          super.start();
        } else {
          addWarn("Empty ConfigurationWatchList in context");
        }
      }
    
      @Override
      public String toString() {
        return "ReconfigureOnChangeFilter{" +
                "invocationCounter=" + invocationCounter +
                '}';
      }
    
      // The next fields counts the number of time the decide method is called
      //
      // IMPORTANT: This field can be updated by multiple threads. It follows that
      // its values may *not* be incremented sequentially. However, we don't care
      // about the actual value of the field except that from time to time the
      // expression (invocationCounter++ & mask) == mask) should be true.
      private long invocationCounter = 0;
    
      private volatile long mask = 0xF;
      private volatile long lastMaskCheck = System.currentTimeMillis();
    
    
      @Override
      public FilterReply decide(Marker marker, Logger logger, Level level,
                                String format, Object[] params, Throwable t) {
        if (!isStarted()) {
          return FilterReply.NEUTRAL;
        }
    
        // for performance reasons, skip change detection (MASK-1) times out of MASK.
        // Only once every MASK calls is change detection code executed
        // Note that MASK is a variable itself.
        if (((invocationCounter++) & mask) != mask) {
          return FilterReply.NEUTRAL;
        }
    
        long now = System.currentTimeMillis();
    
        synchronized (configurationWatchList) {
          updateMaskIfNecessary(now);
          if (changeDetected(now)) {
            // Even though reconfiguration involves resetting the loggerContext,
            // which clears the list of turbo filters including this instance, it is
            // still possible for this instance to be subsequently invoked by another
            // thread if it was already executing when the context was reset.
            disableSubsequentReconfiguration();
            detachReconfigurationToNewThread();
          }
        }
    
        return FilterReply.NEUTRAL;
      }
    
      // experiments indicate that even for CPU intensive applications with 200 or more threads MASK
      // values in the order of 0xFFFF is appropriate
      private static final int MAX_MASK = 0xFFFF;
    
    
      // if less  than MASK_INCREASE_THRESHOLD milliseconds elapse between invocations of updateMaskIfNecessary() method,
      // then the mask should be increased
      private static final long MASK_INCREASE_THRESHOLD = 100;
    
      // if more than MASK_DECREASE_THRESHOLD milliseconds elapse between invocations of updateMaskIfNecessary() method,
      // then the mask should be decreased
      private static final long MASK_DECREASE_THRESHOLD = MASK_INCREASE_THRESHOLD*8;
    
      // update the mask so as to execute change detection code about once every 100 to 8000 milliseconds.
      private void updateMaskIfNecessary(long now) {
        final long timeElapsedSinceLastMaskUpdateCheck = now - lastMaskCheck;
        lastMaskCheck = now;
        if (timeElapsedSinceLastMaskUpdateCheck < MASK_INCREASE_THRESHOLD && (mask < MAX_MASK)) {
            mask = (mask << 1) | 1;
        } else if (timeElapsedSinceLastMaskUpdateCheck > MASK_DECREASE_THRESHOLD) {
          mask = mask >>> 2;
        }
      }
    
      // by detaching reconfiguration to a new thread, we release the various
      // locks held by the current thread, in particular, the AppenderAttachable
      // reader lock.
      void detachReconfigurationToNewThread() {
        addInfo("Detected change in [" + configurationWatchList.getCopyOfFileWatchList() + "]");
        context.getExecutorService().submit(new ReconfiguringThread());
      }
    
      void updateNextCheck(long now) {
        nextCheck = now + refreshPeriod;
      }
    
      protected boolean changeDetected(long now) {
        if (now >= nextCheck) {
          updateNextCheck(now);
          return configurationWatchList.changeDetected();
        }
        return false;
      }
    
      void disableSubsequentReconfiguration() {
        nextCheck = Long.MAX_VALUE;
      }
    
      public long getRefreshPeriod() {
        return refreshPeriod;
      }
    
      public void setRefreshPeriod(long refreshPeriod) {
        this.refreshPeriod = refreshPeriod;
      }
    
      class ReconfiguringThread implements Runnable {
        public void run() {
          if (mainConfigurationURL == null) {
            addInfo("Due to missing top level configuration file, skipping reconfiguration");
            return;
          }
          LoggerContext lc = (LoggerContext) context;
          addInfo(CoreConstants.RESET_MSG_PREFIX + "named [" + context.getName() + "]");
          if (mainConfigurationURL.toString().endsWith("xml")) {
            performXMLConfiguration(lc);
          } else if (mainConfigurationURL.toString().endsWith("groovy")) {
            if (EnvUtil.isGroovyAvailable()) {
              lc.reset();
              // avoid directly referring to GafferConfigurator so as to avoid
              // loading  groovy.lang.GroovyObject . See also http://jira.qos.ch/browse/LBCLASSIC-214
              GafferUtil.runGafferConfiguratorOn(lc, this, mainConfigurationURL);
            } else {
              addError("Groovy classes are not available on the class path. ABORTING INITIALIZATION.");
            }
          }
        }
    
        private void performXMLConfiguration(LoggerContext lc) {
          JoranConfigurator jc = new JoranConfigurator();
          jc.setContext(context);
          StatusUtil statusUtil = new StatusUtil(context);
          List<SaxEvent> eventList = jc.recallSafeConfiguration();
          URL mainURL = ConfigurationWatchListUtil.getMainWatchURL(context);
          lc.reset();
          long threshold = System.currentTimeMillis();
          try {
            jc.doConfigure(mainConfigurationURL);
            if (statusUtil.hasXMLParsingErrors(threshold)) {
              fallbackConfiguration(lc, eventList, mainURL);
            }
          } catch (JoranException e) {
            fallbackConfiguration(lc, eventList, mainURL);
          }
        }
    
        private void fallbackConfiguration(LoggerContext lc, List<SaxEvent> eventList, URL mainURL) {
          JoranConfigurator joranConfigurator = new JoranConfigurator();
          joranConfigurator.setContext(context);
          if (eventList != null) {
            addWarn("Falling back to previously registered safe configuration.");
            try {
              lc.reset();
              joranConfigurator.informContextOfURLUsedForConfiguration(context, mainURL);
              joranConfigurator.doConfigure(eventList);
              addInfo("Re-registering previous fallback configuration once more as a fallback configuration point");
              joranConfigurator.registerSafeConfiguration();
            } catch (JoranException e) {
              addError("Unexpected exception thrown by a configuration considered safe.", e);
            }
          } else {
            addWarn("No previous configuration to fall back on.");
          }
        }
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/turbo/MDCValueLevelPair.java����0000644�0001750�0001750�00000002003�12136042271�032243� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.turbo;
    
    import ch.qos.logback.classic.Level;
    
    
    /**
     * Bean pairing an MDC value with a log level.
     * 
     * @author Raplh Goers
     * @author Ceki G&uuml;lc&uuml;
     */
    public class MDCValueLevelPair {
      private String value;
      private Level level;
    
      public String getValue() {
        return value;
      }
    
      public void setValue(String name) {
        this.value = name;
      }
    
      public Level getLevel() {
        return level;
      }
    
      public void setLevel(Level level) {
        this.level = level;
      }
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/turbo/TurboFilter.java����������0000644�0001750�0001750�00000004131�12136042271�031304� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.turbo;
    
    import org.slf4j.Marker;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.core.spi.ContextAwareBase;
    import ch.qos.logback.core.spi.FilterReply;
    import ch.qos.logback.core.spi.LifeCycle;
    
    /**
     * TurboFilter is a specialized filter with a decide method that takes a bunch 
     * of parameters instead of a single event object. The latter is cleaner but 
     * the latter is much more performant.
     * <p>
     * For more information about turbo filters, please refer to the online manual at
     * http://logback.qos.ch/manual/filters.html#TurboFilter
     * 
     * @author Ceki Gulcu
     */
    public abstract class TurboFilter extends ContextAwareBase implements LifeCycle {
    
      private String name;
      boolean start = false;  
     
     
      /**
       * Make a decision based on the multiple parameters passed as arguments.
       * The returned value should be one of <code>{@link FilterReply#DENY}</code>, 
       * <code>{@link FilterReply#NEUTRAL}</code>, or <code>{@link FilterReply#ACCEPT}</code>.
      
       * @param marker
       * @param logger
       * @param level
       * @param format
       * @param params
       * @param t
       * @return
       */
      public abstract FilterReply decide(Marker marker, Logger logger,
          Level level, String format, Object[] params, Throwable t);
    
      public void start() {
        this.start = true;
      }
      
      public boolean isStarted() {
        return this.start;
      }
     
      public void stop() {
        this.start = false;
      }
    
    
      public String getName() {
        return name;
      }
    
      public void setName(String name) {
        this.name = name;
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/log4j/��������������������������0000755�0001750�0001750�00000000000�12203357067�026074� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/log4j/package.html��������������0000644�0001750�0001750�00000000305�11377016712�030353� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
    
    <html> 
      <head>
        <title></title>
      </head>
      
      <body>
        
        <p>Contains support for log4j output formats.</p>
    
      </body> 
    </html>���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/log4j/XMLLayout.java������������0000644�0001750�0001750�00000013627�12136042271�030577� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.log4j;
    
    import java.util.Map;
    import java.util.Set;
    import java.util.Map.Entry;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.classic.spi.IThrowableProxy;
    import ch.qos.logback.classic.spi.StackTraceElementProxy;
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.LayoutBase;
    import ch.qos.logback.core.helpers.Transform;
    
    // Code is based on revision 309623 of org.apache.log4j.xml.XMLLayout dated "Wed
    // Jul 31 09:25:14 2002 UTC" as authored by Ceki Gulcu.
    // See also http://tinyurl.com/dch9mr
    
    /**
     * 
     * Generates log4j.dtd compliant XML documents.
     * 
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public class XMLLayout extends LayoutBase<ILoggingEvent> {
    
      private final int DEFAULT_SIZE = 256;
      private final int UPPER_LIMIT = 2048;
    
      private StringBuilder buf = new StringBuilder(DEFAULT_SIZE);
      private boolean locationInfo = false;
      private boolean properties = false;
    
      @Override
      public void start() {
        super.start();
      }
    
      /**
       * The <b>LocationInfo</b> option takes a boolean value. By default, it is
       * set to false which means there will be no location information output by
       * this layout. If the the option is set to true, then the file name and line
       * number of the statement at the origin of the log statement will be output.
       * 
       * <p>If you are embedding this layout within an {@link
       * org.apache.log4j.net.SMTPAppender} then make sure to set the
       * <b>LocationInfo</b> option of that appender as well.
       */
      public void setLocationInfo(boolean flag) {
        locationInfo = flag;
      }
    
      /**
       * Returns the current value of the <b>LocationInfo</b> option.
       */
      public boolean getLocationInfo() {
        return locationInfo;
      }
    
      /**
       * Sets whether MDC key-value pairs should be output, default false.
       * 
       * @param flag
       *                new value.
       * @since 1.2.15
       */
      public void setProperties(final boolean flag) {
        properties = flag;
      }
    
      /**
       * Gets whether MDC key-value pairs should be output.
       * 
       * @return true if MDC key-value pairs are output.
       * @since 1.2.15
       */
      public boolean getProperties() {
        return properties;
      }
    
      /**
       * Formats a {@link ILoggingEvent} in conformity with the log4j.dtd.
       */
      public String doLayout(ILoggingEvent event) {
    
        // Reset working buffer. If the buffer is too large, then we need a new
        // one in order to avoid the penalty of creating a large array.
        if (buf.capacity() > UPPER_LIMIT) {
          buf = new StringBuilder(DEFAULT_SIZE);
        } else {
          buf.setLength(0);
        }
    
        // We yield to the \r\n heresy.
    
        buf.append("<log4j:event logger=\"");
        buf.append(event.getLoggerName());
        buf.append("\"\r\n");
        buf.append("             timestamp=\"");
        buf.append(event.getTimeStamp());
        buf.append("\" level=\"");
        buf.append(event.getLevel());
        buf.append("\" thread=\"");
        buf.append(event.getThreadName());
        buf.append("\">\r\n");
    
        buf.append("  <log4j:message><![CDATA[");
        // Append the rendered message. Also make sure to escape any
        // existing CDATA sections.
        Transform.appendEscapingCDATA(buf, event.getFormattedMessage());
        buf.append("]]></log4j:message>\r\n");
    
        // logback does not support NDC
        // String ndc = event.getNDC();
    
    
        IThrowableProxy tp = event.getThrowableProxy();
        if (tp != null) {
          StackTraceElementProxy[] stepArray = tp.getStackTraceElementProxyArray();
          buf.append("  <log4j:throwable><![CDATA[");
          for (StackTraceElementProxy step : stepArray) {
            buf.append(CoreConstants.TAB);
            buf.append(step.toString());
            buf.append("\r\n");
          }
          buf.append("]]></log4j:throwable>\r\n");
        }
    
        if (locationInfo) {
          StackTraceElement[] callerDataArray = event.getCallerData();
          if (callerDataArray != null && callerDataArray.length > 0) {
            StackTraceElement immediateCallerData = callerDataArray[0];
            buf.append("  <log4j:locationInfo class=\"");
            buf.append(immediateCallerData.getClassName());
            buf.append("\"\r\n");
            buf.append("                      method=\"");
            buf.append(Transform.escapeTags(immediateCallerData.getMethodName()));
            buf.append("\" file=\"");
            buf.append(immediateCallerData.getFileName());
            buf.append("\" line=\"");
            buf.append(immediateCallerData.getLineNumber());
            buf.append("\"/>\r\n");
          }
        }
    
        /*
         * <log4j:properties> <log4j:data name="name" value="value"/>
         * </log4j:properties>
         */
        if (this.getProperties()) {
          Map<String, String> propertyMap = event.getMDCPropertyMap();
    
          if ((propertyMap != null) && (propertyMap.size() != 0)) {
            Set<Entry<String, String>> entrySet = propertyMap.entrySet();
            buf.append("  <log4j:properties>");
            for (Entry<String, String> entry : entrySet) {
              buf.append("\r\n    <log4j:data");
              buf.append(" name='" + Transform.escapeTags(entry.getKey()) + "'");
              buf.append(" value='" + Transform.escapeTags(entry.getValue()) + "'");
              buf.append(" />");
            }
            buf.append("\r\n  </log4j:properties>");
          }
        }
    
        buf.append("\r\n</log4j:event>\r\n\r\n");
    
        return buf.toString();
      }
    
      @Override
      public String getContentType() {
        return "text/xml";
      }
    
    }
    ���������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/boolex/�������������������������0000755�0001750�0001750�00000000000�12203357067�026345� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/boolex/IEvaluator.java����������0000644�0001750�0001750�00000001400�12136042271�031247� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.boolex;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    
    /**
     * An <b>internal</b> interface used by the GEventEvaluator.
     * 
     * @author Ceki G&uuml;c&uuml;
     */
    public interface IEvaluator {
      boolean doEvaluate(ILoggingEvent event);
    }
     ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/boolex/JaninoEventEvaluator.java0000644�0001750�0001750�00000012645�12136042271�033314� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.boolex;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    
    import org.slf4j.Marker;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.classic.spi.IThrowableProxy;
    import ch.qos.logback.classic.spi.LoggerContextVO;
    import ch.qos.logback.classic.spi.ThrowableProxy;
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.boolex.JaninoEventEvaluatorBase;
    import ch.qos.logback.core.boolex.Matcher;
    
    public class JaninoEventEvaluator extends
        JaninoEventEvaluatorBase<ILoggingEvent> {
    
      public final static String IMPORT_LEVEL = "import ch.qos.logback.classic.Level;\r\n";
    
      public final static List<String> DEFAULT_PARAM_NAME_LIST = new ArrayList<String>();
      public final static List<Class> DEFAULT_PARAM_TYPE_LIST = new ArrayList<Class>();
    
      static {
        DEFAULT_PARAM_NAME_LIST.add("DEBUG");
        DEFAULT_PARAM_NAME_LIST.add("INFO");
        DEFAULT_PARAM_NAME_LIST.add("WARN");
        DEFAULT_PARAM_NAME_LIST.add("ERROR");
    
        DEFAULT_PARAM_NAME_LIST.add("event");
        DEFAULT_PARAM_NAME_LIST.add("message");
    
        DEFAULT_PARAM_NAME_LIST.add("formattedMessage");
        DEFAULT_PARAM_NAME_LIST.add("logger");
        DEFAULT_PARAM_NAME_LIST.add("loggerContext");
        DEFAULT_PARAM_NAME_LIST.add("level");
        DEFAULT_PARAM_NAME_LIST.add("timeStamp");
        DEFAULT_PARAM_NAME_LIST.add("marker");
        DEFAULT_PARAM_NAME_LIST.add("mdc");
        DEFAULT_PARAM_NAME_LIST.add("throwableProxy");
        DEFAULT_PARAM_NAME_LIST.add("throwable");
    
        DEFAULT_PARAM_TYPE_LIST.add(int.class);
        DEFAULT_PARAM_TYPE_LIST.add(int.class);
        DEFAULT_PARAM_TYPE_LIST.add(int.class);
        DEFAULT_PARAM_TYPE_LIST.add(int.class);
    
        DEFAULT_PARAM_TYPE_LIST.add(ILoggingEvent.class);
        DEFAULT_PARAM_TYPE_LIST.add(String.class);
        DEFAULT_PARAM_TYPE_LIST.add(String.class);
        DEFAULT_PARAM_TYPE_LIST.add(String.class);
        DEFAULT_PARAM_TYPE_LIST.add(LoggerContextVO.class);
        DEFAULT_PARAM_TYPE_LIST.add(int.class);
        DEFAULT_PARAM_TYPE_LIST.add(long.class);
        DEFAULT_PARAM_TYPE_LIST.add(Marker.class);
        DEFAULT_PARAM_TYPE_LIST.add(Map.class);
        DEFAULT_PARAM_TYPE_LIST.add(IThrowableProxy.class);
        DEFAULT_PARAM_TYPE_LIST.add(Throwable.class);
      }
    
      protected String getDecoratedExpression() {
        String expression = getExpression();
        if(!expression.contains("return")) {
          expression = "return "+expression +";";
          addInfo("Adding [return] prefix and a semicolon suffix. Expression becomes ["+expression+"]");
          addInfo("See also "+CoreConstants.CODES_URL+"#block");
    
        }
        return IMPORT_LEVEL + expression;
      }
    
      protected String[] getParameterNames() {
        List<String> fullNameList = new ArrayList<String>();
        fullNameList.addAll(DEFAULT_PARAM_NAME_LIST);
    
        for (int i = 0; i < matcherList.size(); i++) {
          Matcher m = (Matcher) matcherList.get(i);
          fullNameList.add(m.getName());
        }
    
        return (String[]) fullNameList.toArray(CoreConstants.EMPTY_STRING_ARRAY);
      }
    
      protected Class[] getParameterTypes() {
        List<Class> fullTypeList = new ArrayList<Class>();
        fullTypeList.addAll(DEFAULT_PARAM_TYPE_LIST);
        for (int i = 0; i < matcherList.size(); i++) {
          fullTypeList.add(Matcher.class);
        }
        return (Class[]) fullTypeList.toArray(CoreConstants.EMPTY_CLASS_ARRAY);
      }
    
      protected Object[] getParameterValues(ILoggingEvent loggingEvent) {
        final int matcherListSize = matcherList.size();
    
        int i = 0;
        Object[] values = new Object[DEFAULT_PARAM_NAME_LIST.size()
            + matcherListSize];
    
        values[i++] = Level.DEBUG_INTEGER;
        values[i++] = Level.INFO_INTEGER;
        values[i++] = Level.WARN_INTEGER;
        values[i++] = Level.ERROR_INTEGER;
    
        values[i++] = loggingEvent;
        values[i++] = loggingEvent.getMessage();
        values[i++] = loggingEvent.getFormattedMessage();
        values[i++] = loggingEvent.getLoggerName();
        values[i++] = loggingEvent.getLoggerContextVO();
        values[i++] = loggingEvent.getLevel().toInteger();
        values[i++] = loggingEvent.getTimeStamp();
        // In order to avoid NullPointerException, we could push a dummy marker if
        // the event's marker is null. However, this would surprise user who
        // expect to see a null marker instead of a dummy one.
        values[i++] = loggingEvent.getMarker();
        values[i++] = loggingEvent.getMDCPropertyMap();
    
        IThrowableProxy iThrowableProxy = loggingEvent.getThrowableProxy();
    
        if (iThrowableProxy != null) {
          values[i++] = iThrowableProxy;
          if (iThrowableProxy instanceof ThrowableProxy) {
            values[i++] = ((ThrowableProxy) iThrowableProxy).getThrowable();
          } else {
            values[i++] = null;
          }
        } else {
          values[i++] = null;
          values[i++] = null;
        }
    
        for (int j = 0; j < matcherListSize; j++) {
          values[i++] = (Matcher) matcherList.get(j);
        }
    
        return values;
      }
    
    }
    �������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/boolex/OnMarkerEvaluator.java���0000644�0001750�0001750�00000003144�12136042271�032604� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.boolex;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import org.slf4j.Marker;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.boolex.EvaluationException;
    import ch.qos.logback.core.boolex.EventEvaluatorBase;
    
    /**
     * Evaluates to true when the logging event passed as parameter contains one of
     * the user-specified markers.
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public class OnMarkerEvaluator extends EventEvaluatorBase<ILoggingEvent> {
    
      List<String> markerList = new ArrayList<String>();
    
      public void addMarker(String markerStr) {
        markerList.add(markerStr);
      }
    
      /**
       * Return true if event passed as parameter contains one of the specified
       * user-markers.
       */
      public boolean evaluate(ILoggingEvent event) throws NullPointerException,
          EvaluationException {
    
        Marker eventsMarker = event.getMarker();
        if (eventsMarker == null) {
          return false;
        }
    
        for (String markerStr : markerList) {
          if (eventsMarker.contains(markerStr)) {
            return true;
          }
        }
        return false;
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/boolex/GEventEvaluator.java�����0000644�0001750�0001750�00000005304�12136042271�032256� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.boolex;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.boolex.EvaluationException;
    import ch.qos.logback.core.boolex.EventEvaluatorBase;
    import ch.qos.logback.core.util.FileUtil;
    import groovy.lang.*;
    import org.codehaus.groovy.control.CompilationFailedException;
    
    /**
     * @author Ceki G&uuml;lc&uuml;
     */
    public class GEventEvaluator extends EventEvaluatorBase<ILoggingEvent> {
    
      String expression;
    
      IEvaluator delegateEvaluator;
      Script script;
    
      public String getExpression() {
        return expression;
      }
    
      public void setExpression(String expression) {
        this.expression = expression;
      }
    
      public void start() {
        int errors = 0;
        if (expression == null || expression.length() == 0) {
          addError("Empty expression");
          return;
        } else {
          addInfo("Expression to evaluate [" + expression + "]");
        }
    
    
        ClassLoader classLoader = getClass().getClassLoader();
        String currentPackageName = this.getClass().getPackage().getName();
        currentPackageName = currentPackageName.replace('.', '/');
    
        FileUtil fileUtil = new FileUtil(getContext());
        String scriptText = fileUtil.resourceAsString(classLoader, currentPackageName + "/EvaluatorTemplate.groovy");
        if (scriptText == null) {
          return;
        }
    
        // insert the expression into script text
        scriptText = scriptText.replace("//EXPRESSION", expression);
    
        GroovyClassLoader gLoader = new GroovyClassLoader(classLoader);
        try {
          Class scriptClass = gLoader.parseClass(scriptText);
    
          GroovyObject goo = (GroovyObject) scriptClass.newInstance();
          delegateEvaluator = (IEvaluator) goo;
    
        } catch (CompilationFailedException cfe) {
          addError("Failed to compile expression [" + expression + "]", cfe);
          errors++;
        } catch (Exception e) {
          addError("Failed to compile expression [" + expression + "]", e);
          errors++;
        }
        if (errors == 0)
          super.start();
      }
    
      public boolean evaluate(ILoggingEvent event) throws NullPointerException, EvaluationException {
        if (delegateEvaluator == null) {
          return false;
        }
        return delegateEvaluator.doEvaluate(event);
      }
    
    
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/boolex/OnErrorEvaluator.java����0000644�0001750�0001750�00000002336�12136042271�032456� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.boolex;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.boolex.EvaluationException;
    import ch.qos.logback.core.boolex.EventEvaluatorBase;
    
    /**
     * Evaluates to true when the logging event passed as parameter has level ERROR
     * or higher.
     * 
     * @author Ceki G&uuml;lc&uuml;
     * 
     */
    public class OnErrorEvaluator extends EventEvaluatorBase<ILoggingEvent> {
    
      /**
       * Return true if event passed as parameter has level ERROR or higher, returns
       * false otherwise.
       */
      public boolean evaluate(ILoggingEvent event) throws NullPointerException,
          EvaluationException {
        return event.getLevel().levelInt >= Level.ERROR_INT;
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/AsyncAppender.java��������������0000644�0001750�0001750�00000003365�12136042271�030454� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.AsyncAppenderBase;
    
    /**
     * In order to optimize performance this appender deems events of level TRACE, DEBUG and INFO as discardable. See the
     * <a href="http://logback.qos.ch/manual/appenders.html#AsyncAppender">chapter on appenders</a> in the manual for
     * further information.
     *
     *
     * @author Ceki G&uuml;lc&uuml;
     * @since 1.0.4
     */
    public class AsyncAppender extends AsyncAppenderBase<ILoggingEvent> {
    
    
      boolean includeCallerData = false;
    
    
      /**
       * Events of level TRACE, DEBUG and INFO are deemed to be discardable.
       * @param event
       * @return true if the event is of level TRACE, DEBUG or INFO false otherwise.
       */
      protected boolean isDiscardable(ILoggingEvent event) {
        Level level = event.getLevel();
        return level.toInt() <= Level.INFO_INT;
      }
    
      protected void preprocess(ILoggingEvent eventObject) {
        eventObject.prepareForDeferredProcessing();
        if(includeCallerData)
          eventObject.getCallerData();
      }
    
      public boolean isIncludeCallerData() {
        return includeCallerData;
      }
    
      public void setIncludeCallerData(boolean includeCallerData) {
        this.includeCallerData = includeCallerData;
      }
    
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/Logger.java���������������������0000644�0001750�0001750�00000061456�12136042271�027144� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic;
    
    import java.io.ObjectStreamException;
    import java.io.Serializable;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Iterator;
    import java.util.List;
    
    import ch.qos.logback.classic.util.LoggerNameUtil;
    import org.slf4j.LoggerFactory;
    import org.slf4j.Marker;
    import org.slf4j.spi.LocationAwareLogger;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.classic.spi.LoggingEvent;
    import ch.qos.logback.core.Appender;
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.spi.AppenderAttachable;
    import ch.qos.logback.core.spi.AppenderAttachableImpl;
    import ch.qos.logback.core.spi.FilterReply;
    
    public final class Logger implements org.slf4j.Logger, LocationAwareLogger,
        AppenderAttachable<ILoggingEvent>, Serializable {
    
      private static final long serialVersionUID = 5454405123156820674L; //8745934908040027998L;
    
      /**
       * The fully qualified name of this class. Used in gathering caller
       * information.
       */
      public static final String FQCN = ch.qos.logback.classic.Logger.class
          .getName();
    
      /**
       * The name of this logger
       */
      private String name;
    
      // The assigned levelInt of this logger. Can be null.
      transient private Level level;
    
      // The effective levelInt is the assigned levelInt and if null, a levelInt is
      // inherited form a parent.
      transient private int effectiveLevelInt;
    
      /**
       * The parent of this category. All categories have at least one ancestor
       * which is the root category.
       */
      transient private Logger parent;
    
      /**
       * The children of this logger. A logger may have zero or more children.
       */
      transient private List<Logger> childrenList;
    
      /**
       * It is assumed that once the 'aai' variable is set to a non-null value, it
       * will never be reset to null. it is further assumed that only place where
       * the 'aai'ariable is set is within the addAppender method. This method is
       * synchronized on 'this' (Logger) protecting against simultaneous
       * re-configuration of this logger (a very unlikely scenario).
       * 
       * <p>
       * It is further assumed that the AppenderAttachableImpl is responsible for
       * its internal synchronization and thread safety. Thus, we can get away with
       * *not* synchronizing on the 'aai' (check null/ read) because
       * <p>
       * 1) the 'aai' variable is immutable once set to non-null
       * <p>
       * 2) 'aai' is getAndSet only within addAppender which is synchronized
       * <p>
       * 3) all the other methods check whether 'aai' is null
       * <p>
       * 4) AppenderAttachableImpl is thread safe
       */
      transient private AppenderAttachableImpl<ILoggingEvent> aai;
      /**
       * Additivity is set to true by default, that is children inherit the
       * appenders of their ancestors by default. If this variable is set to
       * <code>false</code> then the appenders located in the ancestors of this
       * logger will not be used. However, the children of this logger will inherit
       * its appenders, unless the children have their additivity flag set to
       * <code>false</code> too. See the user manual for more details.
       */
      transient private boolean additive = true;
    
      final transient LoggerContext loggerContext;
    
      Logger(String name, Logger parent, LoggerContext loggerContext) {
        this.name = name;
        this.parent = parent;
        this.loggerContext = loggerContext;
      }
    
      public Level getEffectiveLevel() {
        return Level.toLevel(effectiveLevelInt);
      }
    
      int getEffectiveLevelInt() {
        return effectiveLevelInt;
      }
    
      public Level getLevel() {
        return level;
      }
    
      public String getName() {
        return name;
      }
    
      private boolean isRootLogger() {
        // only the root logger has a null parent
        return parent == null;
      }
    
      Logger getChildByName(final String childName) {
        if (childrenList == null) {
          return null;
        } else {
          int len = this.childrenList.size();
          for (int i = 0; i < len; i++) {
            final Logger childLogger_i = (Logger) childrenList.get(i);
            final String childName_i = childLogger_i.getName();
    
            if (childName.equals(childName_i)) {
              return childLogger_i;
            }
          }
          // no child found
          return null;
        }
      }
    
      public synchronized void setLevel(Level newLevel) {
        if (level == newLevel) {
          // nothing to do;
          return;
        }
        if (newLevel == null && isRootLogger()) {
          throw new IllegalArgumentException(
              "The level of the root logger cannot be set to null");
        }
    
        level = newLevel;
        if (newLevel == null) {
          effectiveLevelInt = parent.effectiveLevelInt;
        } else {
          effectiveLevelInt = newLevel.levelInt;
        }
    
        if (childrenList != null) {
          int len = childrenList.size();
          for (int i = 0; i < len; i++) {
            Logger child = (Logger) childrenList.get(i);
            // tell child to handle parent levelInt change
            child.handleParentLevelChange(effectiveLevelInt);
          }
        }
        // inform listeners
        loggerContext.fireOnLevelChange(this, newLevel);
      }
    
      /**
       * This method is invoked by parent logger to let this logger know that the
       * prent's levelInt changed.
       * 
       * @param newParentLevelInt
       */
      private synchronized void handleParentLevelChange(int newParentLevelInt) {
        // changes in the parent levelInt affect children only if their levelInt is
        // null
        if (level == null) {
          effectiveLevelInt = newParentLevelInt;
    
          // propagate the parent levelInt change to this logger's children
          if (childrenList != null) {
            int len = childrenList.size();
            for (int i = 0; i < len; i++) {
              Logger child = (Logger) childrenList.get(i);
              child.handleParentLevelChange(newParentLevelInt);
            }
          }
        }
      }
    
      /**
       * Remove all previously added appenders from this logger instance.
       * <p/>
       * This is useful when re-reading configuration information.
       */
      public void detachAndStopAllAppenders() {
        if (aai != null) {
          aai.detachAndStopAllAppenders();
        }
      }
    
      public boolean detachAppender(String name) {
        if (aai == null) {
          return false;
        }
        return aai.detachAppender(name);
      }
    
      // this method MUST be synchronized. See comments on 'aai' field for further
      // details.
      public synchronized void addAppender(Appender<ILoggingEvent> newAppender) {
        if (aai == null) {
          aai = new AppenderAttachableImpl<ILoggingEvent>();
        }
        aai.addAppender(newAppender);
      }
    
      public boolean isAttached(Appender<ILoggingEvent> appender) {
        if (aai == null) {
          return false;
        }
        return aai.isAttached(appender);
      }
    
      @SuppressWarnings("unchecked")
      public Iterator<Appender<ILoggingEvent>> iteratorForAppenders() {
        if (aai == null) {
          return Collections.EMPTY_LIST.iterator();
        }
        return aai.iteratorForAppenders();
      }
    
      public Appender<ILoggingEvent> getAppender(String name) {
        if (aai == null) {
          return null;
        }
        return aai.getAppender(name);
      }
    
      /**
       * Invoke all the appenders of this logger.
       * 
       * @param event
       *          The event to log
       */
      public void callAppenders(ILoggingEvent event) {
        int writes = 0;
        for (Logger l = this; l != null; l = l.parent) {
          writes += l.appendLoopOnAppenders(event);
          if (!l.additive) {
            break;
          }
        }
        // No appenders in hierarchy
        if (writes == 0) {
          loggerContext.noAppenderDefinedWarning(this);
        }
      }
    
      private int appendLoopOnAppenders(ILoggingEvent event) {
        if (aai != null) {
          return aai.appendLoopOnAppenders(event);
        } else {
          return 0;
        }
      }
    
      /**
       * Remove the appender passed as parameter form the list of appenders.
       */
      public boolean detachAppender(Appender<ILoggingEvent> appender) {
        if (aai == null) {
          return false;
        }
        return aai.detachAppender(appender);
      }
    
    
    
      /**
       * Create a child of this logger by suffix, that is, the part of the name
       * extending this logger. For example, if this logger is named "x.y" and the
       * lastPart is "z", then the created child logger will be named "x.y.z".
       * 
       * <p>
       * IMPORTANT: Calls to this method must be within a synchronized block on this
       * logger.
       * 
       * @param lastPart
       *          the suffix (i.e. last part) of the child logger name. This
       *          parameter may not include dots, i.e. the logger separator
       *          character.
       * @return
       */
      Logger createChildByLastNamePart(final String lastPart) {
        int i_index = LoggerNameUtil.getFirstSeparatorIndexOf(lastPart);
        if (i_index != -1) {
          throw new IllegalArgumentException("Child name [" + lastPart
              + " passed as parameter, may not include [" + CoreConstants.DOT + "]");
        }
    
        if (childrenList == null) {
          childrenList = new ArrayList<Logger>();
        }
        Logger childLogger;
        if (this.isRootLogger()) {
          childLogger = new Logger(lastPart, this, this.loggerContext);
        } else {
          childLogger = new Logger(name + CoreConstants.DOT + lastPart, this,
              this.loggerContext);
        }
        childrenList.add(childLogger);
        childLogger.effectiveLevelInt = this.effectiveLevelInt;
        return childLogger;
      }
    
      private void localLevelReset() {
        effectiveLevelInt = Level.DEBUG_INT;
        if (isRootLogger()) {
          level = Level.DEBUG;
        } else {
          level = null;
        }
      }
    
      void recursiveReset() {
        detachAndStopAllAppenders();
        localLevelReset();
        additive = true;
        if (childrenList == null) {
          return;
        }
        for (Logger childLogger : childrenList) {
          childLogger.recursiveReset();
        }
      }
    
      /**
       * The default size of child list arrays. The JDK 1.5 default is 10. We use a
       * smaller value to save a little space.
       */
      private static final int DEFAULT_CHILD_ARRAY_SIZE = 5;
    
      Logger createChildByName(final String childName) {
        int i_index = LoggerNameUtil.getSeparatorIndexOf(childName, this.name.length() + 1);
        if (i_index != -1) {
          throw new IllegalArgumentException("For logger [" + this.name
              + "] child name [" + childName
              + " passed as parameter, may not include '.' after index"
              + (this.name.length() + 1));
        }
    
        if (childrenList == null) {
          childrenList = new ArrayList<Logger>(DEFAULT_CHILD_ARRAY_SIZE);
        }
        Logger childLogger;
        childLogger = new Logger(childName, this, this.loggerContext);
        childrenList.add(childLogger);
        childLogger.effectiveLevelInt = this.effectiveLevelInt;
        return childLogger;
      }
    
      /**
       * The next methods are not merged into one because of the time we gain by not
       * creating a new Object[] with the params. This reduces the cost of not
       * logging by about 20 nanoseconds.
       */
    
      private void filterAndLog_0_Or3Plus(final String localFQCN,
          final Marker marker, final Level level, final String msg,
          final Object[] params, final Throwable t) {
    
        final FilterReply decision = loggerContext
            .getTurboFilterChainDecision_0_3OrMore(marker, this, level, msg,
                params, t);
    
        if (decision == FilterReply.NEUTRAL) {
          if (effectiveLevelInt > level.levelInt) {
            return;
          }
        } else if (decision == FilterReply.DENY) {
          return;
        }
    
        buildLoggingEventAndAppend(localFQCN, marker, level, msg, params, t);
      }
    
      private void filterAndLog_1(final String localFQCN,
          final Marker marker, final Level level, final String msg,
          final Object param, final Throwable t) {
    
        final FilterReply decision = loggerContext.getTurboFilterChainDecision_1(
            marker, this, level, msg, param, t);
    
        if (decision == FilterReply.NEUTRAL) {
          if (effectiveLevelInt > level.levelInt) {
            return;
          }
        } else if (decision == FilterReply.DENY) {
          return;
        }
    
        buildLoggingEventAndAppend(localFQCN, marker, level, msg,
            new Object[] { param }, t);
      }
    
      private void filterAndLog_2(final String localFQCN,
          final Marker marker, final Level level, final String msg,
          final Object param1, final Object param2, final Throwable t) {
    
        final FilterReply decision = loggerContext.getTurboFilterChainDecision_2(
            marker, this, level, msg, param1, param2, t);
    
        if (decision == FilterReply.NEUTRAL) {
          if (effectiveLevelInt > level.levelInt) {
            return;
          }
        } else if (decision == FilterReply.DENY) {
          return;
        }
    
        buildLoggingEventAndAppend(localFQCN, marker, level, msg, new Object[] {
            param1, param2 }, t);
      }
    
      private void buildLoggingEventAndAppend(final String localFQCN,
          final Marker marker, final Level level, final String msg,
          final Object[] params, final Throwable t) {
        LoggingEvent le = new LoggingEvent(localFQCN, this, level, msg, t, params);
        le.setMarker(marker);
        callAppenders(le);
      }
    
      public void trace(String msg) {
        filterAndLog_0_Or3Plus(FQCN, null, Level.TRACE, msg, null, null);
      }
    
      public void trace(String format, Object arg) {
        filterAndLog_1(FQCN, null, Level.TRACE, format, arg, null);
      }
    
      public void trace(String format, Object arg1, Object arg2) {
        filterAndLog_2(FQCN, null, Level.TRACE, format, arg1, arg2, null);
      }
    
      public void trace(String format, Object[] argArray) {
        filterAndLog_0_Or3Plus(FQCN, null, Level.TRACE, format, argArray, null);
      }
    
      public void trace(String msg, Throwable t) {
        filterAndLog_0_Or3Plus(FQCN, null, Level.TRACE, msg, null, t);
      }
    
      public void trace(Marker marker, String msg) {
        filterAndLog_0_Or3Plus(FQCN, marker, Level.TRACE, msg, null, null);
      }
    
      public void trace(Marker marker, String format, Object arg) {
        filterAndLog_1(FQCN, marker, Level.TRACE, format, arg, null);
      }
    
      public void trace(Marker marker, String format, Object arg1, Object arg2) {
        filterAndLog_2(FQCN, marker, Level.TRACE, format, arg1, arg2, null);
      }
    
      public void trace(Marker marker, String format, Object[] argArray) {
        filterAndLog_0_Or3Plus(FQCN, marker, Level.TRACE, format, argArray, null);
      }
    
      public void trace(Marker marker, String msg, Throwable t) {
        filterAndLog_0_Or3Plus(FQCN, marker, Level.TRACE, msg, null, t);
      }
    
      public boolean isDebugEnabled() {
        return isDebugEnabled(null);
      }
    
      public boolean isDebugEnabled(Marker marker) {
        final FilterReply decision = callTurboFilters(marker, Level.DEBUG);
        if (decision == FilterReply.NEUTRAL) {
          return effectiveLevelInt <= Level.DEBUG_INT;
        } else if (decision == FilterReply.DENY) {
          return false;
        } else if (decision == FilterReply.ACCEPT) {
          return true;
        } else {
          throw new IllegalStateException("Unknown FilterReply value: " + decision);
        }
      }
    
      public void debug(String msg) {
        filterAndLog_0_Or3Plus(FQCN, null, Level.DEBUG, msg, null, null);
      }
    
      public void debug(String format, Object arg) {
        filterAndLog_1(FQCN, null, Level.DEBUG, format, arg, null);
      }
    
      public void debug(String format, Object arg1, Object arg2) {
        filterAndLog_2(FQCN, null, Level.DEBUG, format, arg1, arg2, null);
      }
    
      public void debug(String format, Object[] argArray) {
        filterAndLog_0_Or3Plus(FQCN, null, Level.DEBUG, format, argArray, null);
      }
    
      public void debug(String msg, Throwable t) {
        filterAndLog_0_Or3Plus(FQCN, null, Level.DEBUG, msg, null, t);
      }
    
      public void debug(Marker marker, String msg) {
        filterAndLog_0_Or3Plus(FQCN, marker, Level.DEBUG, msg, null, null);
      }
    
      public void debug(Marker marker, String format, Object arg) {
        filterAndLog_1(FQCN, marker, Level.DEBUG, format, arg, null);
      }
    
      public void debug(Marker marker, String format, Object arg1, Object arg2) {
        filterAndLog_2(FQCN, marker, Level.DEBUG, format, arg1, arg2, null);
      }
    
      public void debug(Marker marker, String format, Object[] argArray) {
        filterAndLog_0_Or3Plus(FQCN, marker, Level.DEBUG, format, argArray, null);
      }
    
      public void debug(Marker marker, String msg, Throwable t) {
        filterAndLog_0_Or3Plus(FQCN, marker, Level.DEBUG, msg, null, t);
      }
    
      public void error(String msg) {
        filterAndLog_0_Or3Plus(FQCN, null, Level.ERROR, msg, null, null);
      }
    
      public void error(String format, Object arg) {
        filterAndLog_1(FQCN, null, Level.ERROR, format, arg, null);
      }
    
      public void error(String format, Object arg1, Object arg2) {
        filterAndLog_2(FQCN, null, Level.ERROR, format, arg1, arg2, null);
      }
    
      public void error(String format, Object[] argArray) {
        filterAndLog_0_Or3Plus(FQCN, null, Level.ERROR, format, argArray, null);
      }
    
      public void error(String msg, Throwable t) {
        filterAndLog_0_Or3Plus(FQCN, null, Level.ERROR, msg, null, t);
      }
    
      public void error(Marker marker, String msg) {
        filterAndLog_0_Or3Plus(FQCN, marker, Level.ERROR, msg, null, null);
      }
    
      public void error(Marker marker, String format, Object arg) {
        filterAndLog_1(FQCN, marker, Level.ERROR, format, arg, null);
      }
    
      public void error(Marker marker, String format, Object arg1, Object arg2) {
        filterAndLog_2(FQCN, marker, Level.ERROR, format, arg1, arg2, null);
      }
    
      public void error(Marker marker, String format, Object[] argArray) {
        filterAndLog_0_Or3Plus(FQCN, marker, Level.ERROR, format, argArray, null);
      }
    
      public void error(Marker marker, String msg, Throwable t) {
        filterAndLog_0_Or3Plus(FQCN, marker, Level.ERROR, msg, null, t);
      }
    
      public boolean isInfoEnabled() {
        return isInfoEnabled(null);
      }
    
      public boolean isInfoEnabled(Marker marker) {
        FilterReply decision = callTurboFilters(marker, Level.INFO);
        if (decision == FilterReply.NEUTRAL) {
          return effectiveLevelInt <= Level.INFO_INT;
        } else if (decision == FilterReply.DENY) {
          return false;
        } else if (decision == FilterReply.ACCEPT) {
          return true;
        } else {
          throw new IllegalStateException("Unknown FilterReply value: " + decision);
        }
      }
    
      public void info(String msg) {
        filterAndLog_0_Or3Plus(FQCN, null, Level.INFO, msg, null, null);
      }
    
      public void info(String format, Object arg) {
        filterAndLog_1(FQCN, null, Level.INFO, format, arg, null);
      }
    
      public void info(String format, Object arg1, Object arg2) {
        filterAndLog_2(FQCN, null, Level.INFO, format, arg1, arg2, null);
      }
    
      public void info(String format, Object[] argArray) {
        filterAndLog_0_Or3Plus(FQCN, null, Level.INFO, format, argArray, null);
      }
    
      public void info(String msg, Throwable t) {
        filterAndLog_0_Or3Plus(FQCN, null, Level.INFO, msg, null, t);
      }
    
      public void info(Marker marker, String msg) {
        filterAndLog_0_Or3Plus(FQCN, marker, Level.INFO, msg, null, null);
      }
    
      public void info(Marker marker, String format, Object arg) {
        filterAndLog_1(FQCN, marker, Level.INFO, format, arg, null);
      }
    
      public void info(Marker marker, String format, Object arg1, Object arg2) {
        filterAndLog_2(FQCN, marker, Level.INFO, format, arg1, arg2, null);
      }
    
      public void info(Marker marker, String format, Object[] argArray) {
        filterAndLog_0_Or3Plus(FQCN, marker, Level.INFO, format, argArray, null);
      }
    
      public void info(Marker marker, String msg, Throwable t) {
        filterAndLog_0_Or3Plus(FQCN, marker, Level.INFO, msg, null, t);
      }
    
      public boolean isTraceEnabled() {
        return isTraceEnabled(null);
      }
    
      public boolean isTraceEnabled(Marker marker) {
        final FilterReply decision = callTurboFilters(marker, Level.TRACE);
        if (decision == FilterReply.NEUTRAL) {
          return effectiveLevelInt <= Level.TRACE_INT;
        } else if (decision == FilterReply.DENY) {
          return false;
        } else if (decision == FilterReply.ACCEPT) {
          return true;
        } else {
          throw new IllegalStateException("Unknown FilterReply value: " + decision);
        }
      }
    
      public boolean isErrorEnabled() {
        return isErrorEnabled(null);
      }
    
      public boolean isErrorEnabled(Marker marker) {
        FilterReply decision = callTurboFilters(marker, Level.ERROR);
        if (decision == FilterReply.NEUTRAL) {
          return effectiveLevelInt <= Level.ERROR_INT;
        } else if (decision == FilterReply.DENY) {
          return false;
        } else if (decision == FilterReply.ACCEPT) {
          return true;
        } else {
          throw new IllegalStateException("Unknown FilterReply value: " + decision);
        }
      }
    
      public boolean isWarnEnabled() {
        return isWarnEnabled(null);
      }
    
      public boolean isWarnEnabled(Marker marker) {
        FilterReply decision = callTurboFilters(marker, Level.WARN);
        if (decision == FilterReply.NEUTRAL) {
          return effectiveLevelInt <= Level.WARN_INT;
        } else if (decision == FilterReply.DENY) {
          return false;
        } else if (decision == FilterReply.ACCEPT) {
          return true;
        } else {
          throw new IllegalStateException("Unknown FilterReply value: " + decision);
        }
    
      }
    
      public boolean isEnabledFor(Marker marker, Level level) {
        FilterReply decision = callTurboFilters(marker, level);
        if (decision == FilterReply.NEUTRAL) {
          return effectiveLevelInt <= level.levelInt;
        } else if (decision == FilterReply.DENY) {
          return false;
        } else if (decision == FilterReply.ACCEPT) {
          return true;
        } else {
          throw new IllegalStateException("Unknown FilterReply value: " + decision);
        }
      }
    
      public boolean isEnabledFor(Level level) {
        return isEnabledFor(null, level);
      }
    
      public void warn(String msg) {
        filterAndLog_0_Or3Plus(FQCN, null, Level.WARN, msg, null, null);
      }
    
      public void warn(String msg, Throwable t) {
        filterAndLog_0_Or3Plus(FQCN, null, Level.WARN, msg, null, t);
      }
    
      public void warn(String format, Object arg) {
        filterAndLog_1(FQCN, null, Level.WARN, format, arg, null);
      }
    
      public void warn(String format, Object arg1, Object arg2) {
        filterAndLog_2(FQCN, null, Level.WARN, format, arg1, arg2, null);
      }
    
      public void warn(String format, Object[] argArray) {
        filterAndLog_0_Or3Plus(FQCN, null, Level.WARN, format, argArray, null);
      }
    
      public void warn(Marker marker, String msg) {
        filterAndLog_0_Or3Plus(FQCN, marker, Level.WARN, msg, null, null);
      }
    
      public void warn(Marker marker, String format, Object arg) {
        filterAndLog_1(FQCN, marker, Level.WARN, format, arg, null);
      }
    
      public void warn(Marker marker, String format, Object[] argArray) {
        filterAndLog_0_Or3Plus(FQCN, marker, Level.WARN, format, argArray, null);
      }
    
      public void warn(Marker marker, String format, Object arg1, Object arg2) {
        filterAndLog_2(FQCN, marker, Level.WARN, format, arg1, arg2, null);
      }
    
      public void warn(Marker marker, String msg, Throwable t) {
        filterAndLog_0_Or3Plus(FQCN, marker, Level.WARN, msg, null, t);
      }
    
      public boolean isAdditive() {
        return additive;
      }
    
      public void setAdditive(boolean additive) {
        this.additive = additive;
      }
    
      public String toString() {
        return "Logger[" + name + "]";
      }
    
      /**
       * Method that calls the attached TurboFilter objects based on the logger and
       * the level.
       * 
       * It is used by isYYYEnabled() methods.
       * 
       * It returns the typical FilterReply values: ACCEPT, NEUTRAL or DENY.
       * 
       * @param level
       * @return the reply given by the TurboFilters
       */
      private FilterReply callTurboFilters(Marker marker, Level level) {
        return loggerContext.getTurboFilterChainDecision_0_3OrMore(marker, this,
            level, null, null, null);
      }
    
      /**
       * Return the context for this logger.
       * 
       * @return the context
       */
      public LoggerContext getLoggerContext() {
        return loggerContext;
      }
    
      public void log(Marker marker, String fqcn, int levelInt, String message,
          Object[] argArray, Throwable t) {
        Level level = Level.fromLocationAwareLoggerInteger(levelInt);
        filterAndLog_0_Or3Plus(fqcn, marker, level, message, argArray, t);
      }
    
      /**
       * After serialization, the logger instance does not know its LoggerContext.
       * The best we can do here, is to return a logger with the same name
       * returned by org.slf4j.LoggerFactory.
       * 
       * @return Logger instance with the same name
       * @throws ObjectStreamException
       */
      protected Object readResolve() throws ObjectStreamException {
        return LoggerFactory.getLogger(getName());
      }
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/filter/�������������������������0000755�0001750�0001750�00000000000�12203357067�026342� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/filter/LevelFilter.java���������0000644�0001750�0001750�00000002760�12136042271�031420� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.filter;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.filter.AbstractMatcherFilter;
    import ch.qos.logback.core.spi.FilterReply;
    
    /**
     * A class that filters events by the level equality.
    
     * <p>
     * For more information about this filter, please refer to the online manual at
     * http://logback.qos.ch/manual/filters.html#levelFilter
     * 
     * @author Ceki G&uuml;lc&uuml;
     * @author S&eacute;bastien Pennec
     */
    public class LevelFilter extends AbstractMatcherFilter<ILoggingEvent> {
    
      Level level;
    
      @Override
      public FilterReply decide(ILoggingEvent event) {
        if (!isStarted()) {
          return FilterReply.NEUTRAL;
        }
    
        if (event.getLevel().equals(level)) {
          return onMatch;
        } else {
          return onMismatch;
        }
      }
    
      public void setLevel(Level level) {
        this.level = level;
      }
    
      public void start() {
        if (this.level != null) {
          super.start();
        }
      }
    }
    ����������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/filter/ThresholdFilter.java�����0000644�0001750�0001750�00000003324�12136042271�032302� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.filter;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.filter.Filter;
    import ch.qos.logback.core.spi.FilterReply;
    
    /**
     * Filters events below the threshold level.
     * 
     * Events with a level below the specified
     * level will be denied, while events with a level
     * equal or above the specified level will trigger a
     * FilterReply.NEUTRAL result, to allow the rest of the
     * filter chain process the event.
     * 
     * For more information about filters, please refer to the online manual at
     * http://logback.qos.ch/manual/filters.html#thresholdFilter
     *
     * @author S&eacute;bastien Pennec
     */
    public class ThresholdFilter extends Filter<ILoggingEvent> {
    
      Level level;
      
      @Override
      public FilterReply decide(ILoggingEvent event) {
        if (!isStarted()) {
          return FilterReply.NEUTRAL;
        }
        
        if (event.getLevel().isGreaterOrEqual(level)) {
          return FilterReply.NEUTRAL;
        } else {
          return FilterReply.DENY;
        }
      }
      
      public void setLevel(String level) {
        this.level = Level.toLevel(level);
      }
      
      public void start() {
        if (this.level != null) {
          super.start();
        }
      }
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/db/�����������������������������0000755�0001750�0001750�00000000000�12203357067�025442� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/db/package.html�����������������0000644�0001750�0001750�00000001165�11616526115�027725� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
    
    <html> 
      <head>
        <title></title>
      </head>
      
      <body>
    
    <p>The ch.qos.logback.classic.db package provides means to append logging events 
    into various databases.
    </p>
    
    <p>Most popular database systems, such as PostgreSQL, MySQL, Oracle, DB2 and MsSQL
    are supported.
    </p>
    
    <p>Just as importantly, the way for obtaining JDBC connections is pluggable. Connections can
    be obtained through the traditional way of DriverManager, or alternatively as a DataSource.
    A DataSource can be instantiated directly or it can obtained through JNDI.
    </p>
      </body> 
    </html>�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/db/script/����������������������0000755�0001750�0001750�00000000000�12203357067�026746� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/db/script/db2.sql���������������0000644�0001750�0001750�00000003555�11377016712�030146� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Logback: the reliable, generic, fast and flexible logging framework.
    # Copyright (C) 1999-2010, QOS.ch. All rights reserved.
    #
    # See http://logback.qos.ch/license.html for the applicable licensing 
    # conditions.
    
    # This SQL script creates the required tables by ch.qos.logback.classic.db.DBAppender
    #
    # It is intended for IBM DB2 databases.
    #
    # WARNING  WARNING WARNING  WARNING 
    # =================================
    # This SQL script has not been tested on an actual DB2
    # instance. It may contain errors or even invalid SQL
    # statements.
    
    DROP TABLE  logging_event_property;
    DROP TABLE  logging_event_exception;
    DROP TABLE  logging_event;
    
    CREATE TABLE logging_event 
      (
        timestmp          BIGINT NOT NULL,
       	formatted_message VARCHAR(4000) NOT NULL,
        logger_name       VARCHAR(254) NOT NULL,
        level_string      VARCHAR(254) NOT NULL,
        thread_name       VARCHAR(254),
        reference_flag    SMALLINT,
        arg0              VARCHAR(254),
        arg1              VARCHAR(254),
        arg2              VARCHAR(254),
        arg3              VARCHAR(254),
        caller_filename   VARCHAR(254) NOT NULL,
        caller_class      VARCHAR(254) NOT NULL,
        caller_method     VARCHAR(254) NOT NULL,
        caller_line       CHAR(4) NOT NULL,
        event_id           INTEGER GENERATED ALWAYS AS IDENTITY (START WITH 1)
      );
    
    CREATE TABLE logging_event_property
      (
        event_id	      INTEGER NOT NULL,
        mapped_key        VARCHAR(254) NOT NULL,
        mapped_value      VARCHAR(1024),
        PRIMARY KEY(event_id, mapped_key),
        FOREIGN KEY (event_id) REFERENCES logging_event(event_id)
      );
    
    CREATE TABLE logging_event_exception
      (
        event_id         INTEGER NOT NULL,
        i                SMALLINT NOT NULL,
        trace_line       VARCHAR(254) NOT NULL,
        PRIMARY KEY(event_id, i),
        FOREIGN KEY (event_id) REFERENCES logging_event(event_id)
      );
    ���������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/db/script/sybaseSqlAnywhere.sql�0000644�0001750�0001750�00000003126�11377016712�033142� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������-- Logback: the reliable, generic, fast and flexible logging framework.
    -- Copyright (C) 1999-2010, QOS.ch. All rights reserved.
    --
    -- See http://logback.qos.ch/license.html for the applicable licensing 
    -- conditions.
    
    -- This SQL script creates the required tables by ch.qos.logback.classic.db.DBAppender
    -- for Sybase SQLAnywhere.  Tested on SQLAnywhere 10.0.1.
    
    DROP TABLE logging_event_property 
    DROP TABLE logging_event_exception 
    DROP TABLE logging_event 
    
    CREATE TABLE logging_event 
    ( 
      timestmp         bigint NOT NULL,
      formatted_message  LONG VARCHAR NOT NULL,
      logger_name       VARCHAR(254) NOT NULL,
      level_string      VARCHAR(254) NOT NULL,
      thread_name       VARCHAR(254),
      reference_flag    SMALLINT,
      arg0              VARCHAR(254),
      arg1              VARCHAR(254),
      arg2              VARCHAR(254),
      arg3              VARCHAR(254),  
      caller_filename   VARCHAR(254) NOT NULL,
      caller_class      VARCHAR(254) NOT NULL,
      caller_method     VARCHAR(254) NOT NULL,
      caller_line       varCHAR(4) NOT NULL,
      event_id          int NOT NULL DEFAULT AUTOINCREMENT,
      PRIMARY KEY(event_id) 
    ) 			
    
    CREATE TABLE logging_event_property 
      ( 
    	event_id          int NOT NULL REFERENCES logging_event(event_id), 
    	mapped_key        VARCHAR(254) NOT NULL, 
    	mapped_value      LONG VARCHAR, 
    	PRIMARY KEY(event_id, mapped_key) 
      ) 
    
    CREATE TABLE logging_event_exception 
      ( 
    	event_id         int NOT NULL REFERENCES logging_event(event_id) , 
    	i                SMALLINT NOT NULL, 
    	trace_line       VARCHAR(254) NOT NULL, 
    	PRIMARY KEY(event_id, i) 
      )
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/db/script/hsqldb.sql������������0000644�0001750�0001750�00000002673�11377016712�030754� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Logback: the reliable, generic, fast and flexible logging framework.
    # Copyright (C) 1999-2010, QOS.ch. All rights reserved.
    #
    # See http://logback.qos.ch/license.html for the applicable licensing 
    # conditions.
    
    
    # This SQL script creates the required tables by ch.qos.logback.classic.db.DBAppender.
    #
    # It is intended for HSQL databases. It has been tested on HSQL 1.8.07.
    
    DROP TABLE logging_event_exception IF EXISTS;
    DROP TABLE logging_event_property IF EXISTS;
    DROP TABLE logging_event IF EXISTS;
    
    CREATE TABLE logging_event (
      timestmp BIGINT NOT NULL,
      formatted_message LONGVARCHAR NOT NULL,
      logger_name VARCHAR(256) NOT NULL,
      level_string VARCHAR(256) NOT NULL,
      thread_name VARCHAR(256),
      reference_flag SMALLINT,
      arg0 VARCHAR(256),
      arg1 VARCHAR(256),
      arg2 VARCHAR(256),
      arg3 VARCHAR(256),
      caller_filename VARCHAR(256), 
      caller_class VARCHAR(256), 
      caller_method VARCHAR(256), 
      caller_line CHAR(4),
      event_id BIGINT NOT NULL IDENTITY);
    
    
    CREATE TABLE logging_event_property (
      event_id BIGINT NOT NULL,
      mapped_key  VARCHAR(254) NOT NULL,
      mapped_value LONGVARCHAR,
      PRIMARY KEY(event_id, mapped_key),
      FOREIGN KEY (event_id) REFERENCES logging_event(event_id));
    
    CREATE TABLE logging_event_exception (
      event_id BIGINT NOT NULL,
      i SMALLINT NOT NULL,
      trace_line VARCHAR(256) NOT NULL,
      PRIMARY KEY(event_id, i),
      FOREIGN KEY (event_id) REFERENCES logging_event(event_id));���������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/db/script/h2.sql����������������0000644�0001750�0001750�00000002622�11647322057�030004� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Logback: the reliable, generic, fast and flexible logging framework.
    # Copyright (C) 1999-2010, QOS.ch. All rights reserved.
    #
    # See http://logback.qos.ch/license.html for the applicable licensing 
    # conditions.
    
    # This SQL script creates the required tables by ch.qos.logback.classic.db.DBAppender.
    #
    # It is intended for H2 databases. 
    
    
    DROP TABLE logging_event_exception IF EXISTS;
    DROP TABLE logging_event_property IF EXISTS;
    DROP TABLE logging_event IF EXISTS;
    
    CREATE TABLE logging_event (
      timestmp BIGINT NOT NULL,
      formatted_message LONGVARCHAR NOT NULL,
      logger_name VARCHAR(256) NOT NULL,
      level_string VARCHAR(256) NOT NULL,
      thread_name VARCHAR(256),
      reference_flag SMALLINT,
      arg0 VARCHAR(256),
      arg1 VARCHAR(256),
      arg2 VARCHAR(256),
      arg3 VARCHAR(256),
      caller_filename VARCHAR(256), 
      caller_class VARCHAR(256), 
      caller_method VARCHAR(256), 
      caller_line CHAR(4),
      event_id IDENTITY NOT NULL);
    
    
    CREATE TABLE logging_event_property (
      event_id BIGINT NOT NULL,
      mapped_key  VARCHAR(254) NOT NULL,
      mapped_value LONGVARCHAR,
      PRIMARY KEY(event_id, mapped_key),
      FOREIGN KEY (event_id) REFERENCES logging_event(event_id));
    
    CREATE TABLE logging_event_exception (
      event_id BIGINT NOT NULL,
      i SMALLINT NOT NULL,
      trace_line VARCHAR(256) NOT NULL,
      PRIMARY KEY(event_id, i),
      FOREIGN KEY (event_id) REFERENCES logging_event(event_id));
    ��������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/db/script/mssql.sql�������������0000644�0001750�0001750�00000003403�11377016712�030626� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������-- Logback: the reliable, generic, fast and flexible logging framework.
    -- Copyright (C) 1999-2010, QOS.ch. All rights reserved.
    --
    -- See http://logback.qos.ch/license.html for the applicable licensing 
    -- conditions.
    
    -- This SQL script creates the required tables by ch.qos.logback.classic.db.DBAppender
    -- 
    -- The event_id column type was recently changed from INT to DECIMAL(40)
    -- without testing.
    
    DROP TABLE logging_event_property 
    DROP TABLE logging_event_exception 
    DROP TABLE logging_event 
    
    CREATE TABLE logging_event 
      ( 
        timestmp         DECIMAL(20) NOT NULL,
       	formatted_message  VARCHAR(4000) NOT NULL,
        logger_name       VARCHAR(254) NOT NULL,
        level_string      VARCHAR(254) NOT NULL,
        thread_name       VARCHAR(254),
        reference_flag    SMALLINT,
        arg0              VARCHAR(254),
        arg1              VARCHAR(254),
        arg2              VARCHAR(254),
        arg3              VARCHAR(254),
        caller_filename   VARCHAR(254) NOT NULL,
        caller_class      VARCHAR(254) NOT NULL,
        caller_method     VARCHAR(254) NOT NULL,
        caller_line       CHAR(4) NOT NULL,
        event_id          DECIMAL(40) NOT NULL identity,
        PRIMARY KEY(event_id) 
      ) 
    
    CREATE TABLE logging_event_property 
      ( 
        event_id          DECIMAL(40) NOT NULL, 
        mapped_key        VARCHAR(254) NOT NULL, 
        mapped_value      VARCHAR(1024), 
        PRIMARY KEY(event_id, mapped_key), 
        FOREIGN KEY (event_id) REFERENCES logging_event(event_id) 
      ) 
    
    CREATE TABLE logging_event_exception 
      ( 
        event_id         DECIMAL(40) NOT NULL, 
        i                SMALLINT NOT NULL, 
        trace_line       VARCHAR(254) NOT NULL, 
        PRIMARY KEY(event_id, i), 
        FOREIGN KEY (event_id) REFERENCES logging_event(event_id) 
      ) 
    
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/db/script/mysql.sql�������������0000644�0001750�0001750�00000003423�11377016712�030636� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Logback: the reliable, generic, fast and flexible logging framework.
    # Copyright (C) 1999-2010, QOS.ch. All rights reserved.
    #
    # See http://logback.qos.ch/license.html for the applicable licensing 
    # conditions.
    
    # This SQL script creates the required tables by ch.qos.logback.classic.db.DBAppender.
    #
    # It is intended for MySQL databases. It has been tested on MySQL 5.1.37 
    # on Linux
    
    
    BEGIN;
    DROP TABLE IF EXISTS logging_event_property;
    DROP TABLE IF EXISTS logging_event_exception;
    DROP TABLE IF EXISTS logging_event;
    COMMIT;
    
    
    BEGIN;
    CREATE TABLE logging_event 
      (
        timestmp         BIGINT NOT NULL,
        formatted_message  TEXT NOT NULL,
        logger_name       VARCHAR(254) NOT NULL,
        level_string      VARCHAR(254) NOT NULL,
        thread_name       VARCHAR(254),
        reference_flag    SMALLINT,
        arg0              VARCHAR(254),
        arg1              VARCHAR(254),
        arg2              VARCHAR(254),
        arg3              VARCHAR(254),
        caller_filename   VARCHAR(254) NOT NULL,
        caller_class      VARCHAR(254) NOT NULL,
        caller_method     VARCHAR(254) NOT NULL,
        caller_line       CHAR(4) NOT NULL,
        event_id          BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY
      );
    COMMIT;
    
    BEGIN;
    CREATE TABLE logging_event_property
      (
        event_id	      BIGINT NOT NULL,
        mapped_key        VARCHAR(254) NOT NULL,
        mapped_value      TEXT,
        PRIMARY KEY(event_id, mapped_key),
        FOREIGN KEY (event_id) REFERENCES logging_event(event_id)
      );
    COMMIT;
    
    BEGIN;
    CREATE TABLE logging_event_exception
      (
        event_id         BIGINT NOT NULL,
        i                SMALLINT NOT NULL,
        trace_line       VARCHAR(254) NOT NULL,
        PRIMARY KEY(event_id, i),
        FOREIGN KEY (event_id) REFERENCES logging_event(event_id)
      );
    COMMIT;���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/db/script/oracle.sql������������0000644�0001750�0001750�00000004646�11377016712�030746� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������-- Logback: the reliable, generic, fast and flexible logging framework.
    -- Copyright (C) 1999-2010, QOS.ch. All rights reserved.
    --
    -- See http://logback.qos.ch/license.html for the applicable licensing 
    -- conditions.
    
    
    -- This SQL script creates the required tables by ch.qos.logback.classic.db.DBAppender
    --
    -- It is intended for Oracle 9i, 10g and 11g databases. Tested on version 9.2, 
    -- 10g and 11g.
    
    -- The following lines are useful in cleaning any previously existing tables 
    
    --drop TRIGGER logging_event_id_seq_trig; 
    --drop SEQUENCE logging_event_id_seq; 
    --drop table logging_event_property; 
    --drop table logging_event_exception; 
    --drop table logging_event; 
    
    
    CREATE SEQUENCE logging_event_id_seq MINVALUE 1 START WITH 1;
    
    CREATE TABLE logging_event 
      (
        timestmp         NUMBER(20) NOT NULL,
        formatted_message  VARCHAR2(4000) NOT NULL,
        logger_name       VARCHAR(254) NOT NULL,
        level_string      VARCHAR(254) NOT NULL,
        thread_name       VARCHAR(254),
        reference_flag    SMALLINT,
        arg0              VARCHAR(254),
        arg1              VARCHAR(254),
        arg2              VARCHAR(254),
        arg3              VARCHAR(254),
        caller_filename   VARCHAR(254) NOT NULL,
        caller_class      VARCHAR(254) NOT NULL,
        caller_method     VARCHAR(254) NOT NULL,
        caller_line       CHAR(4) NOT NULL,
        event_id          NUMBER(10) PRIMARY KEY
      );
    
    
    -- the / suffix may or may not be needed depending on your SQL Client
    -- Some SQL Clients, e.g. SQuirrel SQL has trouble with the following
    -- trigger creation command, while SQLPlus (the basic SQL Client which
    -- ships with Oracle) has no trouble at all.
    
    CREATE TRIGGER logging_event_id_seq_trig
      BEFORE INSERT ON logging_event
      FOR EACH ROW  
      BEGIN  
        SELECT logging_event_id_seq.NEXTVAL 
        INTO   :NEW.event_id 
        FROM   DUAL;  
      END;
    /
    
    
    CREATE TABLE logging_event_property
      (
        event_id	      NUMBER(10) NOT NULL,
        mapped_key        VARCHAR2(254) NOT NULL,
        mapped_value      VARCHAR2(1024),
        PRIMARY KEY(event_id, mapped_key),
        FOREIGN KEY (event_id) REFERENCES logging_event(event_id)
      );
      
    CREATE TABLE logging_event_exception
      (
        event_id         NUMBER(10) NOT NULL,
        i                SMALLINT NOT NULL,
        trace_line       VARCHAR2(254) NOT NULL,
        PRIMARY KEY(event_id, i),
        FOREIGN KEY (event_id) REFERENCES logging_event(event_id)
      );
      
    
    
    
    ������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/db/script/sqllite.sql�����������0000644�0001750�0001750�00000003466�11753207111�031146� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������--# Logback: the reliable, generic, fast and flexible logging framework.
    --# Copyright (C) 1999-2012, QOS.ch. All rights reserved.
    --#
    --# See http://logback.qos.ch/license.html for the applicable licensing
    --# conditions.
    --#
    --# This SQL script creates the required tables by ch.qos.logback.classic.db.DBAppender.
    --#
    --# It is intended for SQLite3 databases. It has been tested on SQLite 3.7.4
    --# on Android ICS (4.0.3).
    
    
    BEGIN;
    DROP TABLE IF EXISTS logging_event_property;
    DROP TABLE IF EXISTS logging_event_exception;
    DROP TABLE IF EXISTS logging_event;
    COMMIT;
    
    
    BEGIN;
    CREATE TABLE logging_event
      (
        timestmp         BIGINT NOT NULL,
        formatted_message  TEXT NOT NULL,
        logger_name       VARCHAR(254) NOT NULL,
        level_string      VARCHAR(254) NOT NULL,
        thread_name       VARCHAR(254),
        reference_flag    SMALLINT,
        arg0              VARCHAR(254),
        arg1              VARCHAR(254),
        arg2              VARCHAR(254),
        arg3              VARCHAR(254),
        caller_filename   VARCHAR(254) NOT NULL,
        caller_class      VARCHAR(254) NOT NULL,
        caller_method     VARCHAR(254) NOT NULL,
        caller_line       CHAR(4) NOT NULL,
        event_id          INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT
      );
    COMMIT;
    
    BEGIN;
    CREATE TABLE logging_event_property
      (
        event_id	      BIGINT NOT NULL,
        mapped_key        VARCHAR(254) NOT NULL,
        mapped_value      TEXT,
        PRIMARY KEY(event_id, mapped_key),
        FOREIGN KEY (event_id) REFERENCES logging_event(event_id)
      );
    COMMIT;
    
    BEGIN;
    CREATE TABLE logging_event_exception
      (
        event_id         BIGINT NOT NULL,
        i                SMALLINT NOT NULL,
        trace_line       VARCHAR(254) NOT NULL,
        PRIMARY KEY(event_id, i),
        FOREIGN KEY (event_id) REFERENCES logging_event(event_id)
      );
    COMMIT;����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/db/script/postgresql.sql��������0000644�0001750�0001750�00000003422�11377016712�031673� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������-- Logback: the reliable, generic, fast and flexible logging framework.
    -- Copyright (C) 1999-2010, QOS.ch. All rights reserved.
    --
    -- See http://logback.qos.ch/license.html for the applicable licensing 
    -- conditions.
    
    -- This SQL script creates the required tables by ch.qos.logback.classic.db.DBAppender
    --
    -- It is intended for PostgreSQL databases.
    
    DROP TABLE    logging_event_property;
    DROP TABLE    logging_event_exception;
    DROP TABLE    logging_event;
    DROP SEQUENCE logging_event_id_seq;
    
    
    CREATE SEQUENCE logging_event_id_seq MINVALUE 1 START 1;
    
    
    CREATE TABLE logging_event 
      (
        timestmp         BIGINT NOT NULL,
        formatted_message  TEXT NOT NULL,
        logger_name       VARCHAR(254) NOT NULL,
        level_string      VARCHAR(254) NOT NULL,
        thread_name       VARCHAR(254),
        reference_flag    SMALLINT,
        arg0              VARCHAR(254),
        arg1              VARCHAR(254),
        arg2              VARCHAR(254),
        arg3              VARCHAR(254),
        caller_filename   VARCHAR(254) NOT NULL,
        caller_class      VARCHAR(254) NOT NULL,
        caller_method     VARCHAR(254) NOT NULL,
        caller_line       CHAR(4) NOT NULL,
        event_id          BIGINT DEFAULT nextval('logging_event_id_seq') PRIMARY KEY
      );
    
    CREATE TABLE logging_event_property
      (
        event_id	      BIGINT NOT NULL,
        mapped_key        VARCHAR(254) NOT NULL,
        mapped_value      VARCHAR(1024),
        PRIMARY KEY(event_id, mapped_key),
        FOREIGN KEY (event_id) REFERENCES logging_event(event_id)
      );
    
    CREATE TABLE logging_event_exception
      (
        event_id         BIGINT NOT NULL,
        i                SMALLINT NOT NULL,
        trace_line       VARCHAR(254) NOT NULL,
        PRIMARY KEY(event_id, i),
        FOREIGN KEY (event_id) REFERENCES logging_event(event_id)
      );
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/db/DBHelper.java����������������0000644�0001750�0001750�00000002540�12136042271�027724� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.db;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    
    /**
     * @author Ceki G&uuml;lc&uuml;
     * 
     */
    public class DBHelper {
    
      public static final short PROPERTIES_EXIST = 0x01;
      public static final short EXCEPTION_EXISTS = 0x02;
    
      public static short computeReferenceMask(ILoggingEvent event) {
        short mask = 0;
    
        int mdcPropSize = 0;
        if (event.getMDCPropertyMap() != null) {
          mdcPropSize = event.getMDCPropertyMap().keySet().size();
        }
        int contextPropSize = 0;
        if (event.getLoggerContextVO().getPropertyMap() != null) {
          contextPropSize = event.getLoggerContextVO().getPropertyMap().size();
        }
    
        if (mdcPropSize > 0 || contextPropSize > 0) {
          mask = PROPERTIES_EXIST;
        }
        if (event.getThrowableProxy() != null) {
          mask |= EXCEPTION_EXISTS;
        }
        return mask;
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/db/SQLBuilder.java��������������0000644�0001750�0001750�00000006570�12136042271�030254� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.db;
    
    import ch.qos.logback.classic.db.names.*;
    
    /**
     * @author Tomasz Nurkiewicz
     * @since 2010-03-16
     */
    public class SQLBuilder {
    
      static String buildInsertPropertiesSQL(DBNameResolver dbNameResolver) {
        StringBuilder sqlBuilder = new StringBuilder("INSERT INTO ");
        sqlBuilder.append(dbNameResolver.getTableName(TableName.LOGGING_EVENT_PROPERTY)).append(" (");
        sqlBuilder.append(dbNameResolver.getColumnName(ColumnName.EVENT_ID)).append(", ");
        sqlBuilder.append(dbNameResolver.getColumnName(ColumnName.MAPPED_KEY)).append(", ");
        sqlBuilder.append(dbNameResolver.getColumnName(ColumnName.MAPPED_VALUE)).append(") ");
        sqlBuilder.append("VALUES (?, ?, ?)");
        return sqlBuilder.toString();
      }
    
      static String buildInsertExceptionSQL(DBNameResolver dbNameResolver) {
        StringBuilder sqlBuilder = new StringBuilder("INSERT INTO ");
        sqlBuilder.append(dbNameResolver.getTableName(TableName.LOGGING_EVENT_EXCEPTION)).append(" (");
        sqlBuilder.append(dbNameResolver.getColumnName(ColumnName.EVENT_ID)).append(", ");
        sqlBuilder.append(dbNameResolver.getColumnName(ColumnName.I)).append(", ");
        sqlBuilder.append(dbNameResolver.getColumnName(ColumnName.TRACE_LINE)).append(") ");
        sqlBuilder.append("VALUES (?, ?, ?)");
        return sqlBuilder.toString();
      }
    
      static String buildInsertSQL(DBNameResolver dbNameResolver) {
        StringBuilder sqlBuilder = new StringBuilder("INSERT INTO ");
        sqlBuilder.append(dbNameResolver.getTableName(TableName.LOGGING_EVENT)).append(" (");
        sqlBuilder.append(dbNameResolver.getColumnName(ColumnName.TIMESTMP)).append(", ");
        sqlBuilder.append(dbNameResolver.getColumnName(ColumnName.FORMATTED_MESSAGE)).append(", ");
        sqlBuilder.append(dbNameResolver.getColumnName(ColumnName.LOGGER_NAME)).append(", ");
        sqlBuilder.append(dbNameResolver.getColumnName(ColumnName.LEVEL_STRING)).append(", ");
        sqlBuilder.append(dbNameResolver.getColumnName(ColumnName.THREAD_NAME)).append(", ");
        sqlBuilder.append(dbNameResolver.getColumnName(ColumnName.REFERENCE_FLAG)).append(", ");
        sqlBuilder.append(dbNameResolver.getColumnName(ColumnName.ARG0)).append(", ");
        sqlBuilder.append(dbNameResolver.getColumnName(ColumnName.ARG1)).append(", ");
        sqlBuilder.append(dbNameResolver.getColumnName(ColumnName.ARG2)).append(", ");
        sqlBuilder.append(dbNameResolver.getColumnName(ColumnName.ARG3)).append(", ");
        sqlBuilder.append(dbNameResolver.getColumnName(ColumnName.CALLER_FILENAME)).append(", ");
        sqlBuilder.append(dbNameResolver.getColumnName(ColumnName.CALLER_CLASS)).append(", ");
        sqlBuilder.append(dbNameResolver.getColumnName(ColumnName.CALLER_METHOD)).append(", ");
        sqlBuilder.append(dbNameResolver.getColumnName(ColumnName.CALLER_LINE)).append(") ");
        sqlBuilder.append("VALUES (?, ?, ? ,?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
        return sqlBuilder.toString();
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/db/DBAppender.java��������������0000644�0001750�0001750�00000024472�12136042271�030253� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.db;
    
    import java.lang.reflect.Method;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Map;
    import java.util.Set;
    
    import ch.qos.logback.classic.db.names.DBNameResolver;
    import ch.qos.logback.classic.db.names.DefaultDBNameResolver;
    import ch.qos.logback.classic.spi.*;
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.db.DBAppenderBase;
    
    /**
     * The DBAppender inserts logging events into three database tables in a format
     * independent of the Java programming language.
     *
     * For more information about this appender, please refer to the online manual
     * at http://logback.qos.ch/manual/appenders.html#DBAppender
     *
     * @author Ceki G&uuml;lc&uuml;
     * @author Ray DeCampo
     * @author S&eacute;bastien Pennec
     */
    public class DBAppender extends DBAppenderBase<ILoggingEvent> {
      protected String insertPropertiesSQL;
      protected String insertExceptionSQL;
      protected String insertSQL;
      protected static final Method GET_GENERATED_KEYS_METHOD;
    
      private DBNameResolver dbNameResolver;
    
      static final int TIMESTMP_INDEX = 1;
      static final int  FORMATTED_MESSAGE_INDEX  = 2;
      static final int  LOGGER_NAME_INDEX = 3;
      static final int  LEVEL_STRING_INDEX = 4;
      static final int  THREAD_NAME_INDEX = 5;
      static final int  REFERENCE_FLAG_INDEX = 6;
      static final int  ARG0_INDEX = 7;
      static final int  ARG1_INDEX = 8;
      static final int  ARG2_INDEX = 9;
      static final int  ARG3_INDEX = 10;
      static final int  CALLER_FILENAME_INDEX = 11;
      static final int  CALLER_CLASS_INDEX = 12;
      static final int  CALLER_METHOD_INDEX = 13;
      static final int  CALLER_LINE_INDEX = 14;
      static final int  EVENT_ID_INDEX  = 15;
    
      static final StackTraceElement EMPTY_CALLER_DATA = CallerData.naInstance();
    
      static {
        // PreparedStatement.getGeneratedKeys() method was added in JDK 1.4
        Method getGeneratedKeysMethod;
        try {
          // the
          getGeneratedKeysMethod = PreparedStatement.class.getMethod(
              "getGeneratedKeys", (Class[]) null);
        } catch (Exception ex) {
          getGeneratedKeysMethod = null;
        }
        GET_GENERATED_KEYS_METHOD = getGeneratedKeysMethod;
      }
    
      public void setDbNameResolver(DBNameResolver dbNameResolver) {
        this.dbNameResolver = dbNameResolver;
      }
    
      @Override
      public void start() {
        if (dbNameResolver == null)
          dbNameResolver = new DefaultDBNameResolver();
        insertExceptionSQL = SQLBuilder.buildInsertExceptionSQL(dbNameResolver);
        insertPropertiesSQL = SQLBuilder.buildInsertPropertiesSQL(dbNameResolver);
        insertSQL = SQLBuilder.buildInsertSQL(dbNameResolver);
        super.start();
      }
    
      @Override
      protected void subAppend(ILoggingEvent event, Connection connection,
          PreparedStatement insertStatement) throws Throwable {
    
        bindLoggingEventWithInsertStatement(insertStatement, event);
        bindLoggingEventArgumentsWithPreparedStatement(insertStatement, event.getArgumentArray());
    
        // This is expensive... should we do it every time?
        bindCallerDataWithPreparedStatement(insertStatement, event.getCallerData());
    
        int updateCount = insertStatement.executeUpdate();
        if (updateCount != 1) {
          addWarn("Failed to insert loggingEvent");
        }
      }
    
      protected void secondarySubAppend(ILoggingEvent event, Connection connection,
          long eventId) throws Throwable {
        Map<String, String> mergedMap = mergePropertyMaps(event);
        insertProperties(mergedMap, connection, eventId);
    
        if (event.getThrowableProxy() != null) {
          insertThrowable(event.getThrowableProxy(), connection, eventId);
        }
      }
    
      void bindLoggingEventWithInsertStatement(PreparedStatement stmt,
          ILoggingEvent event) throws SQLException {
        stmt.setLong(TIMESTMP_INDEX, event.getTimeStamp());
        stmt.setString(FORMATTED_MESSAGE_INDEX, event.getFormattedMessage());
        stmt.setString(LOGGER_NAME_INDEX, event.getLoggerName());
        stmt.setString(LEVEL_STRING_INDEX, event.getLevel().toString());
        stmt.setString(THREAD_NAME_INDEX, event.getThreadName());
        stmt.setShort(REFERENCE_FLAG_INDEX, DBHelper.computeReferenceMask(event));
      }
    
      void bindLoggingEventArgumentsWithPreparedStatement(PreparedStatement stmt,
          Object[] argArray) throws SQLException {
    
        int arrayLen = argArray != null ? argArray.length : 0;
    
        for(int i = 0; i < arrayLen && i < 4; i++) {
          stmt.setString(ARG0_INDEX+i, asStringTruncatedTo254(argArray[i]));
        }
        if(arrayLen < 4) {
          for(int i = arrayLen; i < 4; i++) {
            stmt.setString(ARG0_INDEX+i, null);
          }
        }
      }
    
      String asStringTruncatedTo254(Object o) {
         String s = null;
         if(o != null) {
             s= o.toString();
         }
    
        if(s == null) {
          return null;
        }
        if(s.length() <= 254) {
          return s;
        } else {
          return s.substring(0, 254);
        }
      }
    
      void bindCallerDataWithPreparedStatement(PreparedStatement stmt,
          StackTraceElement[] callerDataArray) throws SQLException {
    
        StackTraceElement caller = extractFirstCaller(callerDataArray);
    
        stmt.setString(CALLER_FILENAME_INDEX, caller.getFileName());
        stmt.setString(CALLER_CLASS_INDEX, caller.getClassName());
        stmt.setString(CALLER_METHOD_INDEX, caller.getMethodName());
        stmt.setString(CALLER_LINE_INDEX, Integer.toString(caller.getLineNumber()));
      }
    
      private StackTraceElement extractFirstCaller(StackTraceElement[] callerDataArray) {
        StackTraceElement caller = EMPTY_CALLER_DATA;
        if(hasAtLeastOneNonNullElement(callerDataArray))
          caller = callerDataArray[0];
        return caller;
      }
    
      private boolean hasAtLeastOneNonNullElement(StackTraceElement[] callerDataArray) {
        return callerDataArray != null && callerDataArray.length > 0 && callerDataArray[0] != null;
      }
    
      Map<String, String> mergePropertyMaps(ILoggingEvent event) {
        Map<String, String> mergedMap = new HashMap<String, String>();
        // we add the context properties first, then the event properties, since
        // we consider that event-specific properties should have priority over
        // context-wide properties.
        Map<String, String> loggerContextMap = event.getLoggerContextVO()
            .getPropertyMap();
        Map<String, String> mdcMap = event.getMDCPropertyMap();
        if (loggerContextMap != null) {
          mergedMap.putAll(loggerContextMap);
        }
        if (mdcMap != null) {
          mergedMap.putAll(mdcMap);
        }
    
        return mergedMap;
      }
    
      @Override
      protected Method getGeneratedKeysMethod() {
        return GET_GENERATED_KEYS_METHOD;
      }
    
      @Override
      protected String getInsertSQL() {
        return insertSQL;
      }
    
      protected void insertProperties(Map<String, String> mergedMap,
          Connection connection, long eventId) throws SQLException {
        Set propertiesKeys = mergedMap.keySet();
        if (propertiesKeys.size() > 0) {
          PreparedStatement insertPropertiesStatement = connection
              .prepareStatement(insertPropertiesSQL);
    
          for (Iterator i = propertiesKeys.iterator(); i.hasNext();) {
            String key = (String) i.next();
            String value = (String) mergedMap.get(key);
    
            insertPropertiesStatement.setLong(1, eventId);
            insertPropertiesStatement.setString(2, key);
            insertPropertiesStatement.setString(3, value);
    
            if (cnxSupportsBatchUpdates) {
              insertPropertiesStatement.addBatch();
            } else {
              insertPropertiesStatement.execute();
            }
          }
    
          if (cnxSupportsBatchUpdates) {
            insertPropertiesStatement.executeBatch();
          }
    
          insertPropertiesStatement.close();
        }
      }
    
      /**
       * Add an exception statement either as a batch or execute immediately if
       * batch updates are not supported.
       */
      void updateExceptionStatement(PreparedStatement exceptionStatement,
          String txt, short i, long eventId) throws SQLException {
        exceptionStatement.setLong(1, eventId);
        exceptionStatement.setShort(2, i);
        exceptionStatement.setString(3, txt);
        if (cnxSupportsBatchUpdates) {
          exceptionStatement.addBatch();
        } else {
          exceptionStatement.execute();
        }
      }
    
      short buildExceptionStatement(IThrowableProxy tp, short baseIndex,
          PreparedStatement insertExceptionStatement, long eventId)
          throws SQLException {
    
        StringBuilder buf = new StringBuilder();
        ThrowableProxyUtil.subjoinFirstLine(buf, tp);
        updateExceptionStatement(insertExceptionStatement, buf.toString(),
            baseIndex++, eventId);
    
        int commonFrames = tp.getCommonFrames();
        StackTraceElementProxy[] stepArray = tp.getStackTraceElementProxyArray();
        for (int i = 0; i < stepArray.length - commonFrames; i++) {
          StringBuilder sb = new StringBuilder();
          sb.append(CoreConstants.TAB);
          ThrowableProxyUtil.subjoinSTEP(sb, stepArray[i]);
          updateExceptionStatement(insertExceptionStatement, sb.toString(),
              baseIndex++, eventId);
        }
    
        if (commonFrames > 0) {
          StringBuilder sb = new StringBuilder();
          sb.append(CoreConstants.TAB).append("... ").append(commonFrames).append(
              " common frames omitted");
          updateExceptionStatement(insertExceptionStatement, sb.toString(),
              baseIndex++, eventId);
        }
    
        return baseIndex;
      }
    
      protected void insertThrowable(IThrowableProxy tp, Connection connection,
          long eventId) throws SQLException {
    
        PreparedStatement exceptionStatement = connection
            .prepareStatement(insertExceptionSQL);
    
        short baseIndex = 0;
        while (tp != null) {
          baseIndex = buildExceptionStatement(tp, baseIndex, exceptionStatement,
              eventId);
          tp = tp.getCause();
        }
    
        if (cnxSupportsBatchUpdates) {
          exceptionStatement.executeBatch();
        }
        exceptionStatement.close();
      }
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/db/names/�����������������������0000755�0001750�0001750�00000000000�12203357067�026545� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/db/names/TableName.java���������0000644�0001750�0001750�00000001264�12136042271�031234� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.db.names;
    
    /**
     * @author Tomasz Nurkiewicz
     * @since 0.9.19
     */
    public enum TableName {
    
      LOGGING_EVENT,
      LOGGING_EVENT_PROPERTY,
      LOGGING_EVENT_EXCEPTION
    
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000150�00000000000�011561� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/db/names/DefaultDBNameResolver.java�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/db/names/DefaultDBNameResolver.j0000644�0001750�0001750�00000002007�12136042271�033025� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.db.names;
    
    /**
     * The default name resolver simply returns the enum passes as parameter
     * as a lower case string.
     * 
     * @author Tomasz Nurkiewicz
     * @author Ceki Gulcu
     * @since  0.9.19
     */
    public class DefaultDBNameResolver implements DBNameResolver {
    
      public <N extends Enum<?>> String getTableName(N tableName) {
        return tableName.toString().toLowerCase();
      }
    
      public <N extends Enum<?>> String getColumnName(N columnName) {
        return columnName.toString().toLowerCase();
      }
    
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/db/names/ColumnName.java��������0000644�0001750�0001750�00000001531�12136042271�031437� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.db.names;
    
    public enum ColumnName {
    
      EVENT_ID,
      
      TIMESTMP,
      FORMATTED_MESSAGE,
      LOGGER_NAME,
      LEVEL_STRING,
      THREAD_NAME,
      REFERENCE_FLAG,
      ARG0,
      ARG1,
      ARG2,
      ARG3,
      CALLER_FILENAME,
      CALLER_CLASS,
      CALLER_METHOD,
      CALLER_LINE,
      
      // MDC
      MAPPED_KEY,
      MAPPED_VALUE,
    
      I,
      TRACE_LINE;
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000147�00000000000�011567� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/db/names/SimpleDBNameResolver.java��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/db/names/SimpleDBNameResolver.ja0000644�0001750�0001750�00000003354�12136042271�033041� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.db.names;
    
    /**
     * Adds custom prefix/suffix to table and column names.
     *
     * @author Tomasz Nurkiewicz
     * @since 0.9.20
     */
    public class SimpleDBNameResolver implements DBNameResolver {
    
      private String tableNamePrefix = "";
    
      private String tableNameSuffix = "";
    
      private String columnNamePrefix = "";
    
      private String columnNameSuffix = "";
    
      public <N extends Enum<?>> String getTableName(N tableName) {
        return tableNamePrefix + tableName.name().toLowerCase() + tableNameSuffix;
      }
    
      public <N extends Enum<?>> String getColumnName(N columnName) {
        return columnNamePrefix + columnName.name().toLowerCase() + columnNameSuffix;
      }
    
      public void setTableNamePrefix(String tableNamePrefix) {
        this.tableNamePrefix = tableNamePrefix != null? tableNamePrefix : "";
      }
    
      public void setTableNameSuffix(String tableNameSuffix) {
        this.tableNameSuffix = tableNameSuffix != null? tableNameSuffix : "";
      }
    
      public void setColumnNamePrefix(String columnNamePrefix) {
        this.columnNamePrefix = columnNamePrefix != null? columnNamePrefix : "";
      }
    
      public void setColumnNameSuffix(String columnNameSuffix) {
        this.columnNameSuffix = columnNameSuffix != null? columnNameSuffix : "";
      }
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/db/names/DBNameResolver.java����0000644�0001750�0001750�00000002170�12136042271�032211� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.db.names;
    
    /**
     * Source of table and column names used in SQL queries generated by {@link ch.qos.logback.classic.db.DBAppender}
     *
     * Implement this interface to override default table and/or column names used by {@link ch.qos.logback.classic.db.DBAppender}.
     *
     * @author Tomasz Nurkiewicz
     * @author Ceki Gulcu
     * @since 0.9.19
     * @see ch.qos.logback.classic.db.names.DefaultDBNameResolver
     * @see ch.qos.logback.classic.db.names.CustomDBNameResolver
     */
    public interface DBNameResolver {
    
      <N extends Enum<?>> String getTableName(N tableName);
    
      <N extends Enum<?>> String getColumnName(N columnName);
    }��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/spi/����������������������������0000755�0001750�0001750�00000000000�12203357067�025650� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggerContextListener.java��0000644�0001750�0001750�00000002124�12136042271�032775� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.spi;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    
    public interface LoggerContextListener {
      
    
      /**
       * Some listeners should not be removed when the LoggerContext is
       * reset. Such listeners are said to be reset resistant.
       * @return whether this listener is reset resistant or not.
       */
      boolean isResetResistant();
      void onStart(LoggerContext context);
      void onReset(LoggerContext context);
      void onStop(LoggerContext context);
      void onLevelChange(Logger logger, Level level);
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggerContextAwareBase.java�0000644�0001750�0001750�00000003141�12136042271�033042� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.spi;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.spi.ContextAwareBase;
    
    
    public class LoggerContextAwareBase extends ContextAwareBase implements LoggerContextAware {
      
      /**
       * Set the owning context. The owning context cannot be set more than
       * once.
       */
      public void setLoggerContext(LoggerContext context) {
        super.setContext(context);
      }
    
      public void setContext(Context context) {
        // check that the context is of type LoggerContext. Otherwise, throw an exception
        // Context == null is a degenerate case but nonetheless permitted.
        if(context instanceof LoggerContext || context == null) {
          super.setContext(context);
        } else {
          throw new IllegalArgumentException("LoggerContextAwareBase only accepts contexts of type c.l.classic.LoggerContext");
        }
      }
    
      /**
       * Return the {@link LoggerContext} this component is attached to.
       * 
       * @return The owning LoggerContext
       */
      public LoggerContext getLoggerContext() {
        return (LoggerContext) context;
      }
      
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/spi/package.html����������������0000644�0001750�0001750�00000000304�11377016712�030126� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
    
    <html> 
      <head>
        <title></title>
      </head>
      
      <body>
        
        <p>Contains core classes of logback classic.</p>
    
      </body> 
    </html>����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/spi/STEUtil.java����������������0000644�0001750�0001750�00000003160�12136042271�027775� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.spi;
    
    public class STEUtil {
    
      
      static int UNUSED_findNumberOfCommonFrames(StackTraceElement[] steArray,
          StackTraceElement[] otherSTEArray) {
        if (otherSTEArray == null) {
          return 0;
        }
    
        int steIndex = steArray.length - 1;
        int parentIndex = otherSTEArray.length - 1;
        int count = 0;
        while (steIndex >= 0 && parentIndex >= 0) {
          if (steArray[steIndex].equals(otherSTEArray[parentIndex])) {
            count++;
          } else {
            break;
          }
          steIndex--;
          parentIndex--;
        }
        return count;
      }
      
      
      static int findNumberOfCommonFrames(StackTraceElement[] steArray,
          StackTraceElementProxy[] otherSTEPArray) {
        if (otherSTEPArray == null) {
          return 0;
        }
    
        int steIndex = steArray.length - 1;
        int parentIndex = otherSTEPArray.length - 1;
        int count = 0;
        while (steIndex >= 0 && parentIndex >= 0) {
          if (steArray[steIndex].equals(otherSTEPArray[parentIndex].ste)) {
            count++;
          } else {
            break;
          }
          steIndex--;
          parentIndex--;
        }
        return count;
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/spi/StackTraceElementProxy.java�0000644�0001750�0001750�00000004350�12136042271�033106� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.spi;
    
    import java.io.Serializable;
    
    public class StackTraceElementProxy implements Serializable {
    
      private static final long serialVersionUID = -2374374378980555982L;
      
      final StackTraceElement ste;
      // save a byte or two during serialization, as we can
      // reconstruct this field from 'ste'
      transient private String steAsString;
      private ClassPackagingData cpd;
    
      public StackTraceElementProxy(StackTraceElement ste) {
        if (ste == null) {
          throw new IllegalArgumentException("ste cannot be null");
        }
        this.ste = ste;
      }
    
      
      public String getSTEAsString() {
        if (steAsString == null) {
          steAsString = "at " + ste.toString();
        }
        return steAsString;
      }
      
      public StackTraceElement getStackTraceElement() {
        return ste;
      }
      
      public void setClassPackagingData(ClassPackagingData cpd) {
        if(this.cpd != null) {
          throw new IllegalStateException("Packaging data has been already set");
        }
        this.cpd = cpd;
      }
    
      public ClassPackagingData getClassPackagingData() {
        return cpd;
      }
    
      @Override
      public int hashCode() {
        return ste.hashCode();
      }
    
      @Override
      public boolean equals(Object obj) {
        if (this == obj)
          return true;
        if (obj == null)
          return false;
        if (getClass() != obj.getClass())
          return false;
        final StackTraceElementProxy other = (StackTraceElementProxy) obj;
    
        if (!ste.equals(other.ste)) {
          return false;
        }
        if (cpd == null) {
          if (other.cpd != null) {
            return false;
          }
        } else if (!cpd.equals(other.cpd)) {
          return false;
        }
        return true;
      }
    
      @Override
      public String toString() {
        return getSTEAsString();
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/spi/PackagingDataCalculator.java0000644�0001750�0001750�00000020074�12136042271�033177� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.spi;
    
    import java.net.URL;
    import java.util.HashMap;
    
    import sun.reflect.Reflection;
    // import java.security.AccessControlException; import java.security.AccessController;import java.security.PrivilegedAction;
    /**
     * Given a classname locate associated PackageInfo (jar name, version name).
     *
     * @author James Strachan
     * @Ceki G&uuml;lc&uuml;
     */
    public class PackagingDataCalculator {
    
      final static StackTraceElementProxy[] STEP_ARRAY_TEMPLATE = new StackTraceElementProxy[0];
    
      HashMap<String, ClassPackagingData> cache = new HashMap<String, ClassPackagingData>();
    
      private static boolean GET_CALLER_CLASS_METHOD_AVAILABLE = false; //private static boolean HAS_GET_CLASS_LOADER_PERMISSION = false;
    
      static {
        // if either the Reflection class or the getCallerClass method
        // are unavailable, then we won't invoke Reflection.getCallerClass()
        // This approach ensures that this class will *run* on JDK's lacking
        // sun.reflect.Reflection class. However, this class will *not compile*
        // on JDKs lacking sun.reflect.Reflection.
        try {
          Reflection.getCallerClass(2);
          GET_CALLER_CLASS_METHOD_AVAILABLE = true;
        } catch (NoClassDefFoundError e) {
        } catch (NoSuchMethodError e) {
        } catch (Throwable e) {
          System.err.println("Unexpected exception");
          e.printStackTrace();
        }
      }
    
    
      public void calculate(IThrowableProxy tp) {
        while (tp != null) {
          populateFrames(tp.getStackTraceElementProxyArray());
          IThrowableProxy[] suppressed = tp.getSuppressed();
          if(suppressed != null) {
            for(IThrowableProxy current:suppressed) {
              populateFrames(current.getStackTraceElementProxyArray());
            }
          }
          tp = tp.getCause();
        }
      }
    
      void populateFrames(StackTraceElementProxy[] stepArray) {
        // in the initial part of this method we populate package information for
        // common stack frames
        final Throwable t = new Throwable("local stack reference");
        final StackTraceElement[] localteSTEArray = t.getStackTrace();
        final int commonFrames = STEUtil.findNumberOfCommonFrames(localteSTEArray,
                stepArray);
        final int localFirstCommon = localteSTEArray.length - commonFrames;
        final int stepFirstCommon = stepArray.length - commonFrames;
    
        ClassLoader lastExactClassLoader = null;
        ClassLoader firsExactClassLoader = null;
    
        int missfireCount = 0;
        for (int i = 0; i < commonFrames; i++) {
          Class callerClass = null;
          if (GET_CALLER_CLASS_METHOD_AVAILABLE) {
            callerClass = Reflection.getCallerClass(localFirstCommon + i
                    - missfireCount + 1);
          }
          StackTraceElementProxy step = stepArray[stepFirstCommon + i];
          String stepClassname = step.ste.getClassName();
    
          if (callerClass != null && stepClassname.equals(callerClass.getName())) {
            // see also LBCLASSIC-263
            lastExactClassLoader = callerClass.getClassLoader();
            if (firsExactClassLoader == null) {
              firsExactClassLoader = lastExactClassLoader;
            }
            ClassPackagingData pi = calculateByExactType(callerClass);
            step.setClassPackagingData(pi);
          } else {
            missfireCount++;
            ClassPackagingData pi = computeBySTEP(step, lastExactClassLoader);
            step.setClassPackagingData(pi);
          }
        }
        populateUncommonFrames(commonFrames, stepArray, firsExactClassLoader);
      }
    
      void populateUncommonFrames(int commonFrames,
                                  StackTraceElementProxy[] stepArray, ClassLoader firstExactClassLoader) {
        int uncommonFrames = stepArray.length - commonFrames;
        for (int i = 0; i < uncommonFrames; i++) {
          StackTraceElementProxy step = stepArray[i];
          ClassPackagingData pi = computeBySTEP(step, firstExactClassLoader);
          step.setClassPackagingData(pi);
        }
      }
    
      private ClassPackagingData calculateByExactType(Class type) {
        String className = type.getName();
        ClassPackagingData cpd = cache.get(className);
        if (cpd != null) {
          return cpd;
        }
        String version = getImplementationVersion(type);
        String codeLocation = getCodeLocation(type);
        cpd = new ClassPackagingData(codeLocation, version);
        cache.put(className, cpd);
        return cpd;
      }
    
      private ClassPackagingData computeBySTEP(StackTraceElementProxy step,
                                               ClassLoader lastExactClassLoader) {
        String className = step.ste.getClassName();
        ClassPackagingData cpd = cache.get(className);
        if (cpd != null) {
          return cpd;
        }
        Class type = bestEffortLoadClass(lastExactClassLoader, className);
        String version = getImplementationVersion(type);
        String codeLocation = getCodeLocation(type);
        cpd = new ClassPackagingData(codeLocation, version, false);
        cache.put(className, cpd);
        return cpd;
      }
    
      String getImplementationVersion(Class type) {
        if (type == null) {
          return "na";
        }
        Package aPackage = type.getPackage();
        if (aPackage != null) {
          String v = aPackage.getImplementationVersion();
          if (v == null) {
            return "na";
          } else {
            return v;
          }
        }
        return "na";
    
      }
    
      String getCodeLocation(Class type) {
        try {
          if (type != null) {
            // file:/C:/java/maven-2.0.8/repo/com/icegreen/greenmail/1.3/greenmail-1.3.jar
            URL resource = type.getProtectionDomain().getCodeSource().getLocation();
            if (resource != null) {
              String locationStr = resource.toString();
              // now lets remove all but the file name
              String result = getCodeLocation(locationStr, '/');
              if (result != null) {
                return result;
              }
              return getCodeLocation(locationStr, '\\');
            }
          }
        } catch (Exception e) {
          // ignore
        }
        return "na";
      }
    
      private String getCodeLocation(String locationStr, char separator) {
        int idx = locationStr.lastIndexOf(separator);
        if (isFolder(idx, locationStr)) {
          idx = locationStr.lastIndexOf(separator, idx - 1);
          return locationStr.substring(idx + 1);
        } else if (idx > 0) {
          return locationStr.substring(idx + 1);
        }
        return null;
      }
    
      private boolean isFolder(int idx, String text) {
        return (idx != -1 && idx + 1 == text.length());
      }
    
      private Class loadClass(ClassLoader cl, String className) {
        if (cl == null) {
          return null;
        }
        try {
          return cl.loadClass(className);
        } catch (ClassNotFoundException e1) {
          return null;
        } catch (NoClassDefFoundError e1) {
          return null;
        } catch (Exception e) {
          e.printStackTrace(); // this is unexpected
          return null;
        }
    
      }
    
      /**
       * @param lastGuaranteedClassLoader may be null
       * @param className
       * @return
       */
      private Class bestEffortLoadClass(ClassLoader lastGuaranteedClassLoader,
                                        String className) {
        Class result = loadClass(lastGuaranteedClassLoader, className);
        if (result != null) {
          return result;
        }
        ClassLoader tccl = Thread.currentThread().getContextClassLoader();
        if (tccl != lastGuaranteedClassLoader) {
          result = loadClass(tccl, className);
        }
        if (result != null) {
          return result;
        }
    
        try {
          return Class.forName(className);
        } catch (ClassNotFoundException e1) {
          return null;
        } catch (NoClassDefFoundError e1) {
          return null;
        } catch (Exception e) {
          e.printStackTrace(); // this is unexpected
          return null;
        }
      }
    
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEvent.java�����������0000644�0001750�0001750�00000024574�12136042271�031110� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.spi;
    
    import java.io.IOException;
    import java.io.ObjectOutputStream;
    import java.util.HashMap;
    import java.util.Map;
    
    import org.slf4j.MDC;
    import org.slf4j.Marker;
    import org.slf4j.helpers.FormattingTuple;
    import org.slf4j.helpers.MessageFormatter;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.util.LogbackMDCAdapter;
    import org.slf4j.spi.MDCAdapter;
    
    /**
     * The internal representation of logging events. When an affirmative decision
     * is made to log then a <code>LoggingEvent</code> instance is created. This
     * instance is passed around to the different logback-classic components.
     * <p/>
     * <p>
     * Writers of logback-classic components such as appenders should be aware of
     * that some of the LoggingEvent fields are initialized lazily. Therefore, an
     * appender wishing to output data to be later correctly read by a receiver,
     * must initialize "lazy" fields prior to writing them out. See the
     * {@link #prepareForDeferredProcessing()} method for the exact list.
     * </p>
     *
     * @author Ceki G&uuml;lc&uuml;
     * @author S&eacute;bastien Pennec
     */
    public class LoggingEvent implements ILoggingEvent {
    
      /**
       * Fully qualified name of the calling Logger class. This field does not
       * survive serialization.
       * <p/>
       * <p/>
       * Note that the getCallerInformation() method relies on this fact.
       */
      transient String fqnOfLoggerClass;
    
      /**
       * The name of thread in which this logging event was generated.
       */
      private String threadName;
    
      private String loggerName;
      private LoggerContext loggerContext;
      private LoggerContextVO loggerContextVO;
    
      /**
       * Level of logging event.
       * <p/>
       * <p>
       * This field should not be accessed directly. You should use the
       * {@link #getLevel} method instead.
       * </p>
       */
      private transient Level level;
    
      private String message;
    
      // we gain significant space at serialization time by marking
      // formattedMessage as transient and constructing it lazily in
      // getFormattedMessage()
      private transient String formattedMessage;
    
      private transient Object[] argumentArray;
    
      private ThrowableProxy throwableProxy;
    
      private StackTraceElement[] callerDataArray;
    
      private Marker marker;
    
      private Map<String, String> mdcPropertyMap;
      private static final Map<String, String> CACHED_NULL_MAP = new HashMap<String, String>();
    
      /**
       * The number of milliseconds elapsed from 1/1/1970 until logging event was
       * created.
       */
      private long timeStamp;
    
      public LoggingEvent() {
      }
    
      public LoggingEvent(String fqcn, Logger logger, Level level, String message,
                          Throwable throwable, Object[] argArray) {
        this.fqnOfLoggerClass = fqcn;
        this.loggerName = logger.getName();
        this.loggerContext = logger.getLoggerContext();
        this.loggerContextVO = loggerContext.getLoggerContextRemoteView();
        this.level = level;
    
        this.message = message;
    
        FormattingTuple ft = MessageFormatter.arrayFormat(message, argArray);
        formattedMessage = ft.getMessage();
    
        if (throwable == null) {
          argumentArray = ft.getArgArray();
          throwable = ft.getThrowable();
        } else {
          this.argumentArray = argArray;
        }
    
        if (throwable != null) {
          this.throwableProxy = new ThrowableProxy(throwable);
          LoggerContext lc = logger.getLoggerContext();
          if (lc.isPackagingDataEnabled()) {
            this.throwableProxy.calculatePackagingData();
          }
        }
    
        timeStamp = System.currentTimeMillis();
      }
    
      public void setArgumentArray(Object[] argArray) {
        if (this.argumentArray != null) {
          throw new IllegalStateException("argArray has been already set");
        }
        this.argumentArray = argArray;
      }
    
      public Object[] getArgumentArray() {
        return this.argumentArray;
      }
    
      public Level getLevel() {
        return level;
      }
    
      public String getLoggerName() {
        return loggerName;
      }
    
      public void setLoggerName(String loggerName) {
        this.loggerName = loggerName;
      }
    
      public String getThreadName() {
        if (threadName == null) {
          threadName = (Thread.currentThread()).getName();
        }
        return threadName;
      }
    
      /**
       * @param threadName The threadName to set.
       * @throws IllegalStateException If threadName has been already set.
       */
      public void setThreadName(String threadName) throws IllegalStateException {
        if (this.threadName != null) {
          throw new IllegalStateException("threadName has been already set");
        }
        this.threadName = threadName;
      }
    
      /**
       * Returns the throwable information contained within this event. May be
       * <code>null</code> if there is no such information.
       */
      public IThrowableProxy getThrowableProxy() {
        return throwableProxy;
      }
    
      /**
       * Set this event's throwable information.
       */
      public void setThrowableProxy(ThrowableProxy tp) {
        if (throwableProxy != null) {
          throw new IllegalStateException("ThrowableProxy has been already set.");
        } else {
          throwableProxy = tp;
        }
      }
    
      /**
       * This method should be called prior to serializing an event. It should also
       * be called when using asynchronous or deferred logging.
       * <p/>
       * <p/>
       * Note that due to performance concerns, this method does NOT extract caller
       * data. It is the responsibility of the caller to extract caller information.
       */
      public void prepareForDeferredProcessing() {
        this.getFormattedMessage();
        this.getThreadName();
        // fixes http://jira.qos.ch/browse/LBCLASSIC-104
        this.getMDCPropertyMap();
      }
    
      public LoggerContextVO getLoggerContextVO() {
        return loggerContextVO;
      }
    
      public void setLoggerContextRemoteView(LoggerContextVO loggerContextVO) {
        this.loggerContextVO = loggerContextVO;
      }
    
      public String getMessage() {
        return message;
      }
    
      public void setMessage(String message) {
        if (this.message != null) {
          throw new IllegalStateException(
                  "The message for this event has been set already.");
        }
        this.message = message;
      }
    
      public long getTimeStamp() {
        return timeStamp;
      }
    
      public void setTimeStamp(long timeStamp) {
        this.timeStamp = timeStamp;
      }
    
      public void setLevel(Level level) {
        if (this.level != null) {
          throw new IllegalStateException(
                  "The level has been already set for this event.");
        }
        this.level = level;
      }
    
      /**
       * Get the caller information for this logging event. If caller information is
       * null at the time of its invocation, this method extracts location
       * information. The collected information is cached for future use.
       * <p/>
       * <p>
       * Note that after serialization it is impossible to correctly extract caller
       * information.
       * </p>
       */
      public StackTraceElement[] getCallerData() {
        if (callerDataArray == null) {
          callerDataArray = CallerData.extract(new Throwable(), fqnOfLoggerClass,
                  loggerContext.getMaxCallerDataDepth(), loggerContext.getFrameworkPackages());
        }
        return callerDataArray;
      }
    
      public boolean hasCallerData() {
        return (callerDataArray != null);
      }
    
      public void setCallerData(StackTraceElement[] callerDataArray) {
        this.callerDataArray = callerDataArray;
      }
    
      public Marker getMarker() {
        return marker;
      }
    
      public void setMarker(Marker marker) {
        if (this.marker != null) {
          throw new IllegalStateException(
                  "The marker has been already set for this event.");
        }
        this.marker = marker;
      }
    
      public long getContextBirthTime() {
        return loggerContextVO.getBirthTime();
      }
    
      // computer formatted lazy as suggested in
      // http://jira.qos.ch/browse/LBCLASSIC-47
      public String getFormattedMessage() {
        if (formattedMessage != null) {
          return formattedMessage;
        }
        if (argumentArray != null) {
          formattedMessage = MessageFormatter.arrayFormat(message, argumentArray)
                  .getMessage();
        } else {
          formattedMessage = message;
        }
    
        return formattedMessage;
      }
    
      public Map<String, String> getMDCPropertyMap() {
        // populate mdcPropertyMap if null
        if (mdcPropertyMap == null) {
          MDCAdapter mdc = MDC.getMDCAdapter();
          if (mdc instanceof LogbackMDCAdapter)
            mdcPropertyMap = ((LogbackMDCAdapter) mdc).getPropertyMap();
          else
            mdcPropertyMap = mdc.getCopyOfContextMap();
        }
        // mdcPropertyMap still null, use CACHED_NULL_MAP
        if (mdcPropertyMap == null)
          mdcPropertyMap = CACHED_NULL_MAP;
    
        return mdcPropertyMap;
      }
    
      /**
       * Set the MDC map for this event.
       *
       * @param map
       * @since 1.0.8
       */
      public void setMDCPropertyMap(Map<String, String> map) {
        if (mdcPropertyMap != null) {
          throw new IllegalStateException(
                  "The MDCPropertyMap has been already set for this event.");
        }
        this.mdcPropertyMap = map;
    
      }
    
      /**
       * Synonym for [@link #getMDCPropertyMap}.
       *
       * @deprecated Replaced by [@link #getMDCPropertyMap}
       */
      public Map<String, String> getMdc() {
        return getMDCPropertyMap();
      }
    
      @Override
      public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append('[');
        sb.append(level).append("] ");
        sb.append(getFormattedMessage());
        return sb.toString();
      }
    
      /**
       * LoggerEventVO instances should be used for serialization. Use
       * {@link LoggingEventVO#build(LoggingEvent) build} method to create the LoggerEventVO instance.
       *
       * @since 1.0.11
       */
      private void writeObject(ObjectOutputStream out) throws IOException {
        throw new UnsupportedOperationException(this.getClass() + " does not support serialization. " +
                "Use LoggerEventVO instance instead. See also LoggerEventVO.build method.");
      }
    
    }
    ������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggerContextAware.java�����0000644�0001750�0001750�00000002067�12136042271�032255� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.spi;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.core.spi.ContextAware;
    
    
    public interface LoggerContextAware extends ContextAware {
    
    
      /** 
       * Set owning logger context for this component. This operation can
       * only be performed once. Once set, the owning context cannot be changed.
       *   
       * @param context The context where this component is attached.
       * @throws IllegalStateException If you try to change the context after it
       * has been set.
       **/
      void setLoggerContext(LoggerContext context);
     
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableProxyVO.java�������0000644�0001750�0001750�00000006400�12136042271�031742� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.spi;
    
    import java.io.Serializable;
    import java.util.Arrays;
    
    public class ThrowableProxyVO implements IThrowableProxy, Serializable {
    
      private static final long serialVersionUID = -773438177285807139L;
    
      private String className;
      private String message;
      private int commonFramesCount;
      private StackTraceElementProxy[] stackTraceElementProxyArray;
      private IThrowableProxy cause;
      private IThrowableProxy[] suppressed;
    
    
      public String getMessage() {
        return message;
      }
      
      public String getClassName() {
        return className;
      }
    
      public int getCommonFrames() {
        return commonFramesCount;
      }
    
      public IThrowableProxy getCause() {
        return cause;
      }
      
      public StackTraceElementProxy[] getStackTraceElementProxyArray() {
        return stackTraceElementProxyArray;
      }
    
      public IThrowableProxy[] getSuppressed() {
        return suppressed;
      }
    
      @Override
      public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result
            + ((className == null) ? 0 : className.hashCode());
        return result;
      }
    
      @Override
      public boolean equals(Object obj) {
        if (this == obj)
          return true;
        if (obj == null)
          return false;
        if (getClass() != obj.getClass())
          return false;
        final ThrowableProxyVO other = (ThrowableProxyVO) obj;
    
        if (className == null) {
          if (other.className != null)
            return false;
        } else if (!className.equals(other.className))
          return false;
    
        if (!Arrays.equals(stackTraceElementProxyArray, other.stackTraceElementProxyArray))
          return false;
        
        if (!Arrays.equals(suppressed, other.suppressed))
          return false;
    
        if (cause == null) {
          if (other.cause != null)
            return false;
        } else if (!cause.equals(other.cause))
          return false;
        
        return true;
      }
    
      public static ThrowableProxyVO build(IThrowableProxy throwableProxy) {
        if(throwableProxy == null) {
          return null;
        }
        ThrowableProxyVO tpvo = new ThrowableProxyVO();
        tpvo.className = throwableProxy.getClassName();
        tpvo.message = throwableProxy.getMessage();
        tpvo.commonFramesCount = throwableProxy.getCommonFrames();
        tpvo.stackTraceElementProxyArray = throwableProxy.getStackTraceElementProxyArray();
        IThrowableProxy cause = throwableProxy.getCause();
        if(cause != null) {
          tpvo.cause = ThrowableProxyVO.build(cause);
        }
        IThrowableProxy[] suppressed = throwableProxy.getSuppressed();
        if(suppressed != null) {
          tpvo.suppressed = new IThrowableProxy[suppressed.length];
          for(int i = 0;i<suppressed.length;i++) {
            tpvo.suppressed[i] = ThrowableProxyVO.build(suppressed[i]);
          }
        }
        return tpvo;
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/spi/IThrowableProxy.java��������0000644�0001750�0001750�00000001403�12136042271�031604� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.spi;
    
    public interface IThrowableProxy {
      String getMessage();
      String getClassName();
      StackTraceElementProxy[] getStackTraceElementProxyArray();
      int getCommonFrames();
      IThrowableProxy getCause();
      IThrowableProxy[] getSuppressed();
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggerComparator.java�������0000644�0001750�0001750�00000001752�12136042271�031760� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.spi;
    
    import java.util.Comparator;
    
    import ch.qos.logback.classic.Logger;
    
    public class LoggerComparator implements Comparator<Logger> {
    
      public int compare(Logger l1, Logger l2) {
        if (l1.getName().equals(l2.getName())) {
          return 0;
        }
        if (l1.getName().equals(Logger.ROOT_LOGGER_NAME)) {
          return -1;
        }
        if (l2.getName().equals(Logger.ROOT_LOGGER_NAME)) {
          return 1;
        }
        return l1.getName().compareTo(l2.getName());
      }
    
    }
    ����������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableProxyUtil.java�����0000644�0001750�0001750�00000014033�12136042271�032334� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.spi;
    
    import ch.qos.logback.core.CoreConstants;
    
    /**
     * Convert a throwable into an array of ThrowableDataPoint objects.
     * 
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public class ThrowableProxyUtil {
    
      public static final int REGULAR_EXCEPTION_INDENT = 1;
      public static final int SUPPRESSED_EXCEPTION_INDENT = 2;
    
      public static void build(ThrowableProxy nestedTP, Throwable nestedThrowable,
          ThrowableProxy parentTP) {
    
        StackTraceElement[] nestedSTE = nestedThrowable.getStackTrace();
    
        int commonFramesCount = -1;
        if (parentTP != null) {
          commonFramesCount = findNumberOfCommonFrames(nestedSTE, parentTP
              .getStackTraceElementProxyArray());
        }
    
        nestedTP.commonFrames = commonFramesCount;
        nestedTP.stackTraceElementProxyArray = steArrayToStepArray(nestedSTE);
      }
    
      static StackTraceElementProxy[] steArrayToStepArray(StackTraceElement[] stea) {
        if(stea == null) {
          return new StackTraceElementProxy[0];
        }
        StackTraceElementProxy[] stepa = new StackTraceElementProxy[stea.length];
        for (int i = 0; i < stepa.length; i++) {
          stepa[i] = new StackTraceElementProxy(stea[i]);
        }
        return stepa;
      }
    
      static int findNumberOfCommonFrames(StackTraceElement[] steArray,
          StackTraceElementProxy[] parentSTEPArray) {
        if (parentSTEPArray == null || steArray == null) {
          return 0;
        }
    
        int steIndex = steArray.length - 1;
        int parentIndex = parentSTEPArray.length - 1;
        int count = 0;
        while (steIndex >= 0 && parentIndex >= 0) {
          StackTraceElement ste = steArray[steIndex];
          StackTraceElement otherSte = parentSTEPArray[parentIndex].ste;
          if (ste.equals(otherSte)) {
            count++;
          } else {
            break;
          }
          steIndex--;
          parentIndex--;
        }
        return count;
      }
    
      public static String asString(IThrowableProxy tp) {
        StringBuilder sb = new StringBuilder();
    
        recursiveAppend(sb, null, REGULAR_EXCEPTION_INDENT, tp);
    
        return sb.toString();
      }
    
      private static void recursiveAppend(StringBuilder sb, String prefix, int indent, IThrowableProxy tp) {
        if(tp == null)
          return;
        subjoinFirstLine(sb, prefix, tp);
        sb.append(CoreConstants.LINE_SEPARATOR);
        subjoinSTEPArray(sb, indent, tp);
        IThrowableProxy[] suppressed = tp.getSuppressed();
        if(suppressed != null) {
          for(IThrowableProxy current : suppressed) {
            recursiveAppend(sb, CoreConstants.SUPPRESSED, SUPPRESSED_EXCEPTION_INDENT, current);
          }
        }
        recursiveAppend(sb, CoreConstants.CAUSED_BY, REGULAR_EXCEPTION_INDENT, tp.getCause());
      }
    
      private static void subjoinFirstLine(StringBuilder buf, String prefix, IThrowableProxy tp) {
        if (prefix != null) {
          buf.append(prefix);
        }
        subjoinExceptionMessage(buf, tp);
      }
    
      public static void subjoinPackagingData(StringBuilder builder, StackTraceElementProxy step) {
        if (step != null) {
          ClassPackagingData cpd = step.getClassPackagingData();
          if (cpd != null) {
            if (!cpd.isExact()) {
              builder.append(" ~[");
            } else {
              builder.append(" [");
            }
       
            builder.append(cpd.getCodeLocation()).append(':').append(
                cpd.getVersion()).append(']');
          }
        }
      }
      
      public static void subjoinSTEP(StringBuilder sb, StackTraceElementProxy step) {
        sb.append(step.toString());
        subjoinPackagingData(sb, step);
      }
    
      /**
       * @param sb The StringBuilder the STEPs are appended to.
       * @param tp the IThrowableProxy containing the STEPs.
       * @deprecated Use subjoinSTEPArray(StringBuilder sb, int indentLevel, IThrowableProxy tp) instead.
       */
      public static void subjoinSTEPArray(StringBuilder sb, IThrowableProxy tp) {
        // not called anymore - but it is public
        subjoinSTEPArray(sb, REGULAR_EXCEPTION_INDENT, tp);
      }
    
      /**
       * @param sb The StringBuilder the STEPs are appended to.
       * @param indentLevel indentation level used for the STEPs, usually either REGULAR_EXCEPTION_INDENT or SUPPRESSED_EXCEPTION_INDENT.
       * @param tp the IThrowableProxy containing the STEPs.
       */
      public static void subjoinSTEPArray(StringBuilder sb, int indentLevel, IThrowableProxy tp) {
        StackTraceElementProxy[] stepArray = tp.getStackTraceElementProxyArray();
        int commonFrames = tp.getCommonFrames();
    
        for (int i = 0; i < stepArray.length - commonFrames; i++) {
          StackTraceElementProxy step = stepArray[i];
          for(int j = 0; j < indentLevel ; j++) {
            sb.append(CoreConstants.TAB);
          }
          subjoinSTEP(sb, step);
          sb.append(CoreConstants.LINE_SEPARATOR);
        }
        
        if (commonFrames > 0) {
          for(int j = 0; j < indentLevel ; j++) {
            sb.append(CoreConstants.TAB);
          }
          sb.append("... ").append(commonFrames).append(" common frames omitted")
              .append(CoreConstants.LINE_SEPARATOR);
        }
        
      }
    
      public static void subjoinFirstLine(StringBuilder buf, IThrowableProxy tp) {
        int commonFrames = tp.getCommonFrames();
        if (commonFrames > 0) {
          buf.append(CoreConstants.CAUSED_BY);
        }
        subjoinExceptionMessage(buf, tp);
      }
    
      public static void subjoinFirstLineRootCauseFirst(StringBuilder buf, IThrowableProxy tp) {
        if (tp.getCause() != null) {
          buf.append(CoreConstants.WRAPPED_BY);
        }
        subjoinExceptionMessage(buf, tp);
      }
    
      private static void subjoinExceptionMessage(StringBuilder buf, IThrowableProxy tp) {
        buf.append(tp.getClassName()).append(": ").append(tp.getMessage());
      }
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/spi/ClassPackagingData.java�����0000644�0001750�0001750�00000004220�12136042271�032146� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.spi;
    
    import java.io.Serializable;
    
    public class ClassPackagingData implements Serializable {
    
      private static final long serialVersionUID = -804643281218337001L;
      final String codeLocation;
      final String version;
      private final boolean exact;
      
      public ClassPackagingData(String codeLocation, String version) {
        this.codeLocation = codeLocation;
        this.version = version;
        this.exact = true;
      }
    
      public ClassPackagingData(String classLocation, String version, boolean exact) {
        this.codeLocation = classLocation;
        this.version = version;
        this.exact = exact;
      }
      
      public String getCodeLocation() {
        return codeLocation;
      }
    
      public String getVersion() {
        return version;
      }
    
      public boolean isExact() {
        return exact;
      }
    
      @Override
      public int hashCode() {
        final int PRIME = 31;
        int result = 1;
        result = PRIME * result + ((codeLocation == null) ? 0 : codeLocation.hashCode());
        return result;
      }
    
      @Override
      public boolean equals(Object obj) {
        if (this == obj)
          return true;
        if (obj == null)
          return false;
        if (getClass() != obj.getClass())
          return false;
        final ClassPackagingData other = (ClassPackagingData) obj;
        if (codeLocation == null) {
          if (other.codeLocation != null)
            return false;
        } else if (!codeLocation.equals(other.codeLocation))
          return false;
        if (exact != other.exact)
          return false;
        if (version == null) {
          if (other.version != null)
            return false;
        } else if (!version.equals(other.version))
          return false;
        return true;
      }
      
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggerContextVO.java��������0000644�0001750�0001750�00000005717�12136042271�031547� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.spi;
    
    import java.io.Serializable;
    import java.util.Map;
    
    import ch.qos.logback.classic.LoggerContext;
    
    /**
     * LoggerContextVO offers a restricted view of LoggerContext intended to be
     * exposed by LoggingEvent to remote systems. This restricted view is optimized
     * for serialization.
     * 
     * <p>
     * Some of the LoggerContext or Logger attributes MUST not survive
     * serialization, e.g appenders, level values etc, as these attributes may have
     * other values on the remote platform. LoggerContextVO class exposes the
     * minimal and relevant attributes to the remote host, instead of having to deal
     * with an incomplete LoggerContext with many null references.
     * 
     * @author Ceki G&uuml;lc&uuml;
     * @author S&eacute;bastien Pennec
     */
    public class LoggerContextVO implements Serializable {
    
      private static final long serialVersionUID = 5488023392483144387L;
    
      final String name;
      final Map<String, String> propertyMap;
      final long birthTime;
    
      public LoggerContextVO(LoggerContext lc) {
        this.name = lc.getName();
        this.propertyMap = lc.getCopyOfPropertyMap();
        this.birthTime = lc.getBirthTime();
      }
    
      public LoggerContextVO(String name, Map<String,String> propertyMap, long birthTime) {
        this.name = name;
        this.propertyMap = propertyMap;
        this.birthTime = birthTime;
      }
    
      public String getName() {
        return name;
      }
    
      public Map<String, String> getPropertyMap() {
        return propertyMap;
      }
    
      public long getBirthTime() {
        return birthTime;
      }
    
    
      @Override
      public String toString() {
        return "LoggerContextVO{" +
                "name='" + name + '\'' +
                ", propertyMap=" + propertyMap +
                ", birthTime=" + birthTime +
                '}';
      }
      @Override
      public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof LoggerContextVO)) return false;
    
        LoggerContextVO that = (LoggerContextVO) o;
    
        if (birthTime != that.birthTime) return false;
        if (name != null ? !name.equals(that.name) : that.name != null) return false;
        if (propertyMap != null ? !propertyMap.equals(that.propertyMap) : that.propertyMap != null) return false;
    
        return true;
      }
    
      @Override
      public int hashCode() {
        int result = name != null ? name.hashCode() : 0;
        result = 31 * result + (propertyMap != null ? propertyMap.hashCode() : 0);
        result = 31 * result + (int) (birthTime ^ (birthTime >>> 32));
    
        return result;
      }
    }
    �������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/spi/ThrowableProxy.java���������0000644�0001750�0001750�00000011614�12136042271�031500� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.spi;
    
    import ch.qos.logback.core.CoreConstants;
    
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    
    public class ThrowableProxy implements IThrowableProxy {
    
      private Throwable throwable;
      private String className;
      private String message;
      // package-private because of ThrowableProxyUtil
      StackTraceElementProxy[] stackTraceElementProxyArray;
      // package-private because of ThrowableProxyUtil
      int commonFrames;
      private ThrowableProxy cause;
      private ThrowableProxy[] suppressed=NO_SUPPRESSED;
    
      private transient PackagingDataCalculator packagingDataCalculator;
      private boolean calculatedPackageData = false;
    
      private static final Method GET_SUPPRESSED_METHOD;
    
      static {
        Method method = null;
        try {
          method = Throwable.class.getMethod("getSuppressed");
        } catch (NoSuchMethodException e) {
          // ignore, will get thrown in Java < 7
        }
        GET_SUPPRESSED_METHOD = method;
      }
    
      private static final ThrowableProxy[] NO_SUPPRESSED=new ThrowableProxy[0];
    
      public ThrowableProxy(Throwable throwable) {
       
        this.throwable = throwable;
        this.className = throwable.getClass().getName();
        this.message = throwable.getMessage();
        this.stackTraceElementProxyArray = ThrowableProxyUtil.steArrayToStepArray(throwable
            .getStackTrace());
        
        Throwable nested = throwable.getCause();
        
        if (nested != null) {
          this.cause = new ThrowableProxy(nested);
          this.cause.commonFrames = ThrowableProxyUtil
              .findNumberOfCommonFrames(nested.getStackTrace(),
                  stackTraceElementProxyArray);
        }
        if(GET_SUPPRESSED_METHOD != null) {
          // this will only execute on Java 7
          try {
            Object obj = GET_SUPPRESSED_METHOD.invoke(throwable);
            if(obj instanceof Throwable[]) {
              Throwable[] throwableSuppressed = (Throwable[]) obj;
              if(throwableSuppressed.length > 0) {
                suppressed = new ThrowableProxy[throwableSuppressed.length];
                for(int i=0;i<throwableSuppressed.length;i++) {
                  this.suppressed[i] = new ThrowableProxy(throwableSuppressed[i]);
                  this.suppressed[i].commonFrames = ThrowableProxyUtil
                      .findNumberOfCommonFrames(throwableSuppressed[i].getStackTrace(),
                          stackTraceElementProxyArray);
                }
              }
            }
          } catch (IllegalAccessException e) {
            // ignore
          } catch (InvocationTargetException e) {
            // ignore
          }
        }
    
      }
    
    
      public Throwable getThrowable() {
        return throwable;
      }
    
      public String getMessage() {
        return message;
      }
    
      /*
       * (non-Javadoc)
       * 
       * @see ch.qos.logback.classic.spi.IThrowableProxy#getClassName()
       */
      public String getClassName() {
        return className;
      }
    
      public StackTraceElementProxy[] getStackTraceElementProxyArray() {
        return stackTraceElementProxyArray;
      }
    
      public int getCommonFrames() {
        return commonFrames;
      }
    
      /*
       * (non-Javadoc)
       * 
       * @see ch.qos.logback.classic.spi.IThrowableProxy#getCause()
       */
      public IThrowableProxy getCause() {
        return cause;
      }
    
      public IThrowableProxy[] getSuppressed() {
        return suppressed;
      }
    
      public PackagingDataCalculator getPackagingDataCalculator() {
        // if original instance (non-deserialized), and packagingDataCalculator
        // is not already initialized, then create an instance.
        // here we assume that (throwable == null) for deserialized instances
        if (throwable != null && packagingDataCalculator == null) {
          packagingDataCalculator = new PackagingDataCalculator();
        }
        return packagingDataCalculator;
      }
    
      public void calculatePackagingData() {
        if (calculatedPackageData) {
          return;
        }
        PackagingDataCalculator pdc = this.getPackagingDataCalculator();
        if (pdc != null) {
          calculatedPackageData = true;
          pdc.calculate(this);
        }
      }
    
    
    
      public void fullDump() {
        StringBuilder builder = new StringBuilder();
        for (StackTraceElementProxy step : stackTraceElementProxyArray) {
          String string = step.toString();
          builder.append(CoreConstants.TAB).append(string);
          ThrowableProxyUtil.subjoinPackagingData(builder, step);
          builder.append(CoreConstants.LINE_SEPARATOR);
        }
        System.out.println(builder.toString());
      }
    
    
    }
    ��������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/spi/TurboFilterList.java��������0000644�0001750�0001750�00000004630�12136042271�031604� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.spi;
    
    import java.util.concurrent.CopyOnWriteArrayList;
    
    import org.slf4j.Marker;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.turbo.TurboFilter;
    import ch.qos.logback.core.spi.FilterReply;
    
    /**
     * Implementation of TurboFilterAttachable.
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    final public class TurboFilterList extends CopyOnWriteArrayList<TurboFilter> {
    
      private static final long serialVersionUID = 1L;
    
      /**
       * Loop through the filters in the chain. As soon as a filter decides on
       * ACCEPT or DENY, then that value is returned. If all of the filters return
       * NEUTRAL, then NEUTRAL is returned.
       */
      public FilterReply getTurboFilterChainDecision(final Marker marker,
          final Logger logger, final Level level, final String format,
          final Object[] params, final Throwable t) {
        
        
        final int size = size();
    //    if (size == 0) {
    //      return FilterReply.NEUTRAL;
    //    }
        if (size == 1) {
          try {
            TurboFilter tf = get(0);
            return tf.decide(marker, logger, level, format, params, t);
          } catch (IndexOutOfBoundsException iobe) {
            return FilterReply.NEUTRAL;
          }
        }
        
        Object[] tfa = toArray();
        final int len = tfa.length;
        for (int i = 0; i < len; i++) {
        //for (TurboFilter tf : this) {
          final TurboFilter tf = (TurboFilter) tfa[i];
          final FilterReply r = tf.decide(marker, logger, level, format, params, t);
          if (r == FilterReply.DENY || r == FilterReply.ACCEPT) {
            return r;
          }
        }
        return FilterReply.NEUTRAL;
      }
    
      // public boolean remove(TurboFilter turboFilter) {
      // return tfList.remove(turboFilter);
      // }
      //
      // public TurboFilter remove(int index) {
      // return tfList.remove(index);
      // }
      //
      // final public int size() {
      // return tfList.size();
      // }
    
    }
    ��������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggerRemoteView.java�������0000644�0001750�0001750�00000002644�12136042271�031740� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.spi;
    
    import java.io.Serializable;
    
    import ch.qos.logback.classic.LoggerContext;
    
    /**
     * An interface that allows Logger objects and LoggerSer objects to be used the
     * same way be client of the LoggingEvent object.
     * <p>
     * See {@link LoggerContextVO} for the rationale of this class.
     * 
     * @author Ceki G&uuml;lc&uuml;
     * @author S&eacute;bastien Pennec
     */
    public class LoggerRemoteView implements Serializable {
    
      private static final long serialVersionUID = 5028223666108713696L;
    
      final LoggerContextVO loggerContextView;
      final String name;
    
      public LoggerRemoteView(String name, LoggerContext lc) {
        this.name = name;
        assert lc.getLoggerContextRemoteView() != null;
        loggerContextView = lc.getLoggerContextRemoteView();
      }
    
      public LoggerContextVO getLoggerContextView() {
        return loggerContextView;
      }
    
      public String getName() {
        return name;
      }
      
    
    }
    ��������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/spi/ILoggingEvent.java����������0000644�0001750�0001750�00000004355�12136042271�031214� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.spi;
    
    import java.util.Map;
    
    import org.slf4j.Marker;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.core.spi.DeferredProcessingAware;
    
    /**
     * The central interface in logback-classic. In a nutshell, logback-classic is
     * nothing more than a processing chain built around this interface.
     * 
     * @author Ceki G&uuml;lc&uuml;
     * @since 0.9.16
     */
    public interface ILoggingEvent extends DeferredProcessingAware {
    
      String getThreadName();
    
      Level getLevel();
    
      String getMessage();
    
      Object[] getArgumentArray();
    
      String getFormattedMessage();
    
      String getLoggerName();
    
      LoggerContextVO getLoggerContextVO();
    
      IThrowableProxy getThrowableProxy();
    
      /**
       * Return caller data associated with this event. Note that calling this event
       * may trigger the computation of caller data.
       * 
       * @return the caller data associated with this event.
       * 
       * @see #hasCallerData()
       */
      StackTraceElement[] getCallerData();
    
      /**
       * If this event has caller data, then true is returned. Otherwise the
       * returned value is null.
       * 
       * <p>Logback components wishing to use caller data if available without
       * causing it to be computed can invoke this method before invoking
       * {@link #getCallerData()}.
       * 
       * @return whether this event has caller data
       */
      boolean hasCallerData();
    
      Marker getMarker();
    
      /**
       * Returns the MDC map. The returned value can be an empty map but not null.
       */
      Map<String, String> getMDCPropertyMap();
    
      /**
       * Synonym for [@link #getMDCPropertyMap}.
       * @deprecated  Replaced by [@link #getMDCPropertyMap}
       */
      Map<String, String> getMdc();
      long getTimeStamp();
    
      void prepareForDeferredProcessing();
    
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/spi/CallerData.java�������������0000644�0001750�0001750�00000010261�12136042271�030500� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.spi;
    
    import ch.qos.logback.core.CoreConstants;
    
    import java.util.List;
    
    /**
     * This class computes caller data returning the result in the form
     * of a StackTraceElement array.
     *
     * @author Ceki G&uuml;lc&uuml;
     */
    public class CallerData {
    
    
      /**
       * When caller information is not available this constant is used for file
       * name, method name, etc.
       */
      public static final String NA = "?";
    
      // All logger call's in log4j-over-slf4j use the Category class
      private static final String LOG4J_CATEGORY = "org.apache.log4j.Category";
      private static final String SLF4J_BOUNDARY = "org.slf4j.Logger";
    
      /**
       * When caller information is not available this constant is used for the line
       * number.
       */
      public static final int LINE_NA = -1;
    
      public static final String CALLER_DATA_NA = "?#?:?" + CoreConstants.LINE_SEPARATOR;
    
      /**
       * This value is returned in case no caller data could be extracted.
       */
      public static final StackTraceElement[] EMPTY_CALLER_DATA_ARRAY = new StackTraceElement[0];
    
    
      /**
       * Extract caller data information as an array based on a Throwable passed as
       * parameter
       */
      public static StackTraceElement[] extract(Throwable t,
                                                String fqnOfInvokingClass, final int maxDepth,
                                                List<String> frameworkPackageList) {
        if (t == null) {
          return null;
        }
    
        StackTraceElement[] steArray = t.getStackTrace();
        StackTraceElement[] callerDataArray;
    
        int found = LINE_NA;
        for (int i = 0; i < steArray.length; i++) {
          if (isInFrameworkSpace(steArray[i].getClassName(),
                  fqnOfInvokingClass, frameworkPackageList)) {
            // the caller is assumed to be the next stack frame, hence the +1.
            found = i + 1;
          } else {
            if (found != LINE_NA) {
              break;
            }
          }
        }
    
        // we failed to extract caller data
        if (found == LINE_NA) {
          return EMPTY_CALLER_DATA_ARRAY;
        }
    
        int availableDepth = steArray.length - found;
        int desiredDepth = maxDepth < (availableDepth) ? maxDepth : availableDepth;
    
        callerDataArray = new StackTraceElement[desiredDepth];
        for (int i = 0; i < desiredDepth; i++) {
          callerDataArray[i] = steArray[found + i];
        }
        return callerDataArray;
      }
    
      static boolean isInFrameworkSpace(String currentClass,
                                        String fqnOfInvokingClass, List<String> frameworkPackageList) {
        // the check for org.apache.log4j.Category class is intended to support
        // log4j-over-slf4j. it solves http://bugzilla.slf4j.org/show_bug.cgi?id=66
        if (currentClass.equals(fqnOfInvokingClass) || currentClass.equals(LOG4J_CATEGORY)
                || currentClass.startsWith(SLF4J_BOUNDARY) || isInFrameworkSpaceList(currentClass, frameworkPackageList)) {
          return true;
        } else {
          return false;
        }
      }
    
      /**
       * Is currentClass present in the list of packages considered part of the logging framework?
       */
      private static boolean isInFrameworkSpaceList(String currentClass, List<String> frameworkPackageList) {
        if (frameworkPackageList == null)
          return false;
    
        for (String s : frameworkPackageList) {
          if (currentClass.startsWith(s))
            return true;
        }
        return false;
      }
    
      /**
       * Returns a StackTraceElement where all string fields are set to {@link #NA} and line number is set to {@link #LINE_NA}.
       *
       * @return StackTraceElement with values set to NA constants.
       * @since 1.0.10
       */
      public static StackTraceElement naInstance() {
        return new StackTraceElement(NA, NA, NA, LINE_NA);
      }
    
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEventVO.java���������0000644�0001750�0001750�00000015327�12136042271�031351� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.spi;
    
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.io.Serializable;
    import java.util.Map;
    
    import org.slf4j.Marker;
    import org.slf4j.helpers.MessageFormatter;
    
    import ch.qos.logback.classic.Level;
    
    // http://www.riehle.org/computer-science/research/1998/ubilab-tr-1998-10-1.html
    
    /**
     * A read-only and serializable implementation of {@link ILoggingEvent}.
     * 
     * @author Ceki G&uuml;lc&uuml;
     * @since 0.9.16
     */
    public class LoggingEventVO implements ILoggingEvent, Serializable {
    
      private static final long serialVersionUID = 6553722650255690312L;
    
      private static final int NULL_ARGUMENT_ARRAY = -1;
      private static final String NULL_ARGUMENT_ARRAY_ELEMENT = "NULL_ARGUMENT_ARRAY_ELEMENT";
    
      private String threadName;
      private String loggerName;
      private LoggerContextVO loggerContextVO;
    
      private transient Level level;
      private String message;
    
      // we gain significant space at serialization time by marking
      // formattedMessage as transient and constructing it lazily in
      // getFormattedMessage()
      private transient String formattedMessage;
    
      private transient Object[] argumentArray;
    
      private ThrowableProxyVO throwableProxy;
      private StackTraceElement[] callerDataArray;
      private Marker marker;
      private Map<String, String> mdcPropertyMap;
      private long timeStamp;
    
      public static LoggingEventVO build(ILoggingEvent le) {
        LoggingEventVO ledo = new LoggingEventVO();
        ledo.loggerName = le.getLoggerName();
        ledo.loggerContextVO = le.getLoggerContextVO();
        ledo.threadName = le.getThreadName();
        ledo.level = (le.getLevel());
        ledo.message = (le.getMessage());
        ledo.argumentArray = (le.getArgumentArray());
        ledo.marker = le.getMarker();
        ledo.mdcPropertyMap = le.getMDCPropertyMap();
        ledo.timeStamp = le.getTimeStamp();
        ledo.throwableProxy = ThrowableProxyVO.build(le.getThrowableProxy());
        // add caller data only if it is there already
        // fixes http://jira.qos.ch/browse/LBCLASSIC-145
        if (le.hasCallerData()) {
          ledo.callerDataArray = le.getCallerData();
        }
        return ledo;
      }
    
      public String getThreadName() {
        return threadName;
      }
    
      public LoggerContextVO getLoggerContextVO() {
        return loggerContextVO;
      }
    
      public String getLoggerName() {
        return loggerName;
      }
    
      public Level getLevel() {
        return level;
      }
    
      public String getMessage() {
        return message;
      }
    
      public String getFormattedMessage() {
        if (formattedMessage != null) {
          return formattedMessage;
        }
    
        if (argumentArray != null) {
          formattedMessage = MessageFormatter.arrayFormat(message, argumentArray)
              .getMessage();
        } else {
          formattedMessage = message;
        }
    
        return formattedMessage;
      }
    
      public Object[] getArgumentArray() {
        return argumentArray;
      }
    
      public IThrowableProxy getThrowableProxy() {
        return throwableProxy;
      }
    
      public StackTraceElement[] getCallerData() {
        return callerDataArray;
      }
    
      public boolean hasCallerData() {
        return callerDataArray != null;
      }
    
      public Marker getMarker() {
        return marker;
      }
    
      public long getTimeStamp() {
        return timeStamp;
      }
    
      public long getContextBirthTime() {
        return loggerContextVO.getBirthTime();
      }
    
      public LoggerContextVO getContextLoggerRemoteView() {
        return loggerContextVO;
      }
    
      public Map<String, String> getMDCPropertyMap() {
        return mdcPropertyMap;
      }
      public Map<String, String> getMdc() {
        return mdcPropertyMap;
      }
      
      public void prepareForDeferredProcessing() {
      }
    
      private void writeObject(ObjectOutputStream out) throws IOException {
        out.defaultWriteObject();
        out.writeInt(level.levelInt);
        if (argumentArray != null) {
          int len = argumentArray.length;
          out.writeInt(len);
          for (int i = 0; i < argumentArray.length; i++) {
            if (argumentArray[i] != null) {
              out.writeObject(argumentArray[i].toString());
            } else {
              out.writeObject(NULL_ARGUMENT_ARRAY_ELEMENT);
            }
          }
        } else {
          out.writeInt(NULL_ARGUMENT_ARRAY);
        }
    
      }
    
      private void readObject(ObjectInputStream in) throws IOException,
          ClassNotFoundException {
        in.defaultReadObject();
        int levelInt = in.readInt();
        level = Level.toLevel(levelInt);
    
        int argArrayLen = in.readInt();
        if (argArrayLen != NULL_ARGUMENT_ARRAY) {
          argumentArray = new String[argArrayLen];
          for (int i = 0; i < argArrayLen; i++) {
            Object val = in.readObject();
            if (!NULL_ARGUMENT_ARRAY_ELEMENT.equals(val)) {
              argumentArray[i] = val;
            }
          }
        }
      }
    
      @Override
      public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((message == null) ? 0 : message.hashCode());
        result = prime * result
            + ((threadName == null) ? 0 : threadName.hashCode());
        result = prime * result + (int) (timeStamp ^ (timeStamp >>> 32));
        return result;
      }
    
      @Override
      public boolean equals(Object obj) {
        if (this == obj)
          return true;
        if (obj == null)
          return false;
        if (getClass() != obj.getClass())
          return false;
        final LoggingEventVO other = (LoggingEventVO) obj;
        if (message == null) {
          if (other.message != null)
            return false;
        } else if (!message.equals(other.message))
          return false;
    
        if (loggerName == null) {
          if (other.loggerName != null)
            return false;
        } else if (!loggerName.equals(other.loggerName))
          return false;
    
        if (threadName == null) {
          if (other.threadName != null)
            return false;
        } else if (!threadName.equals(other.threadName))
          return false;
        if (timeStamp != other.timeStamp)
          return false;
    
        if (marker == null) {
          if (other.marker != null)
            return false;
        } else if (!marker.equals(other.marker))
          return false;
    
        if (mdcPropertyMap == null) {
          if (other.mdcPropertyMap != null)
            return false;
        } else if (!mdcPropertyMap.equals(other.mdcPropertyMap))
          return false;
        return true;
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/spi/PlatformInfo.java�����������0000644�0001750�0001750�00000002073�12136042271�031106� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.spi;
    
    /**
     * This class provides information about the runtime platform.
     *
     * @author Ceki Gulcu
     * */
    public class PlatformInfo {
    
      private static final int UNINITIALIZED = -1;
    
      private static int hasJMXObjectName = UNINITIALIZED;
      
      public static boolean hasJMXObjectName() {
        if (hasJMXObjectName == UNINITIALIZED) {
          try {
            Class.forName("javax.management.ObjectName");
            hasJMXObjectName = 1;
          } catch (Throwable e) {
            hasJMXObjectName = 0;
          }
        }
        return (hasJMXObjectName == 1);
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/net/����������������������������0000755�0001750�0001750�00000000000�12203357067�025643� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/net/package.html����������������0000644�0001750�0001750�00000000307�11377016712�030124� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
    
    <html> 
      <head>
        <title></title>
      </head>
      
      <body>
        
        <p>Contains classes used to log through a network</p>
      </body> 
    </html>�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/net/SocketReceiver.java���������0000644�0001750�0001750�00000015226�12143151241�031416� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net;
    
    import java.io.EOFException;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.net.ConnectException;
    import java.net.InetAddress;
    import java.net.Socket;
    import java.net.UnknownHostException;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.Future;
    import java.util.concurrent.RejectedExecutionException;
    
    import javax.net.SocketFactory;
    
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.net.DefaultSocketConnector;
    import ch.qos.logback.core.net.AbstractSocketAppender;
    import ch.qos.logback.core.net.SocketConnector;
    import ch.qos.logback.core.util.CloseUtil;
    
    /**
     * A component that receives serialized {@link ILoggingEvent} objects from a
     * remote appender over a {@link Socket}.
     *
     * @author Carl Harris
     */
    public class SocketReceiver extends ReceiverBase
            implements Runnable, SocketConnector.ExceptionHandler {
    
      private static final int DEFAULT_ACCEPT_CONNECTION_DELAY = 5000;
    
      private String remoteHost;
      private InetAddress address;
      private int port;
      private int reconnectionDelay;
      private int acceptConnectionTimeout = DEFAULT_ACCEPT_CONNECTION_DELAY;
    
      private String receiverId;
      private volatile Socket socket;
      private Future<Socket> connectorTask;
    
      /**
       * {@inheritDoc}
       */
      protected boolean shouldStart() {
        int errorCount = 0;
        if (port == 0) {
          errorCount++;
          addError("No port was configured for receiver. "
                  + "For more information, please visit http://logback.qos.ch/codes.html#receiver_no_port");
        }
    
        if (remoteHost == null) {
          errorCount++;
          addError("No host name or address was configured for receiver. "
                  + "For more information, please visit http://logback.qos.ch/codes.html#receiver_no_host");
        }
    
        if (reconnectionDelay == 0) {
          reconnectionDelay = AbstractSocketAppender.DEFAULT_RECONNECTION_DELAY;
        }
    
        if (errorCount == 0) {
          try {
            address = InetAddress.getByName(remoteHost);
          } catch (UnknownHostException ex) {
            addError("unknown host: " + remoteHost);
            errorCount++;
          }
        }
    
        if (errorCount == 0) {
          receiverId = "receiver " + remoteHost + ":" + port + ": ";
        }
    
        return errorCount == 0;
      }
    
      /**
       * {@inheritDoc}
       */
      protected void onStop() {
        if (socket != null) {
          CloseUtil.closeQuietly(socket);
        }
      }
    
      @Override
      protected Runnable getRunnableTask() {
        return this;
      }
    
      /**
       * {@inheritDoc}
       */
      public void run() {
        try {
          LoggerContext lc = (LoggerContext) getContext();
          while (!Thread.currentThread().isInterrupted()) {
            SocketConnector connector = createConnector(address, port, 0,
                    reconnectionDelay);
            connectorTask = activateConnector(connector);
            if (connectorTask == null)
              break;
            socket = waitForConnectorToReturnASocket();
            if (socket == null)
              break;
            dispatchEvents(lc);
          }
        } catch (InterruptedException ex) {
          assert true;    // ok... we'll exit now
        }
        addInfo("shutting down");
      }
    
      private SocketConnector createConnector(InetAddress address, int port,
                                              int initialDelay, int retryDelay) {
        SocketConnector connector = newConnector(address, port, initialDelay,
                retryDelay);
        connector.setExceptionHandler(this);
        connector.setSocketFactory(getSocketFactory());
        return connector;
      }
    
    
      private Future<Socket> activateConnector(SocketConnector connector) {
        try {
          return getContext().getExecutorService().submit(connector);
        } catch (RejectedExecutionException ex) {
          return null;
        }
      }
    
      private Socket waitForConnectorToReturnASocket() throws InterruptedException {
        try {
          Socket s = connectorTask.get();
          connectorTask = null;
          return s;
        } catch (ExecutionException e) {
          return null;
        }
      }
    
      private void dispatchEvents(LoggerContext lc) {
        try {
          socket.setSoTimeout(acceptConnectionTimeout);
          ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
          socket.setSoTimeout(0);
          addInfo(receiverId + "connection established");
          while (true) {
            ILoggingEvent event = (ILoggingEvent) ois.readObject();
            Logger remoteLogger = lc.getLogger(event.getLoggerName());
            if (remoteLogger.isEnabledFor(event.getLevel())) {
              remoteLogger.callAppenders(event);
            }
          }
        } catch (EOFException ex) {
          addInfo(receiverId + "end-of-stream detected");
        } catch (IOException ex) {
          addInfo(receiverId + "connection failed: " + ex);
        } catch (ClassNotFoundException ex) {
          addInfo(receiverId + "unknown event class: " + ex);
        } finally {
          CloseUtil.closeQuietly(socket);
          socket = null;
          addInfo(receiverId + "connection closed");
        }
      }
    
      /**
       * {@inheritDoc}
       */
      public void connectionFailed(SocketConnector connector, Exception ex) {
        if (ex instanceof InterruptedException) {
          addInfo("connector interrupted");
        } else if (ex instanceof ConnectException) {
          addInfo(receiverId + "connection refused");
        } else {
          addInfo(receiverId + ex);
        }
      }
    
    
      protected SocketConnector newConnector(InetAddress address,
                                             int port, int initialDelay, int retryDelay) {
        return new DefaultSocketConnector(address, port, initialDelay, retryDelay);
      }
    
      protected SocketFactory getSocketFactory() {
        return SocketFactory.getDefault();
      }
    
      public void setRemoteHost(String remoteHost) {
        this.remoteHost = remoteHost;
      }
    
      public void setPort(int port) {
        this.port = port;
      }
    
      public void setReconnectionDelay(int reconnectionDelay) {
        this.reconnectionDelay = reconnectionDelay;
      }
    
      public void setAcceptConnectionTimeout(int acceptConnectionTimeout) {
        this.acceptConnectionTimeout = acceptConnectionTimeout;
      }
    
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/net/SimpleSSLSocketServer.java��0000644�0001750�0001750�00000006744�12136042271�032665� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net;
    
    import java.security.NoSuchAlgorithmException;
    
    import javax.net.ServerSocketFactory;
    import javax.net.ssl.SSLContext;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.core.net.ssl.ConfigurableSSLServerSocketFactory;
    import ch.qos.logback.core.net.ssl.SSLParametersConfiguration;
    
    /**
     * A {@link SimpleSocketServer} that supports SSL.
     * 
     * <pre>
     *      &lt;b&gt;Usage:&lt;/b&gt; java ch.qos.logback.classic.net.ssl.SimpleSSLSocketServer port configFile
     * </pre>
     * 
     * where <em>port</em> is a port number where the server listens and
     * <em>configFile</em> is an xml configuration file fed to
     * {@link JoranConfigurator}.
     * 
     * When running the SimpleSSLServerFactory as shown above, it is necessary to
     * configure JSSE system properties using {@code -Dname=value} on the
     * command-line when starting the server. In particular, you will probably
     * want/need to configure the following system properties:
     * <ul>
     * <li>javax.net.ssl.keyStore</li>
     * <li>javax.net.ssl.keyStorePassword</li>
     * <li>javax.net.ssl.keyStoreType</li>
     * <li>javax.net.ssl.trustStore</li>
     * <li>javax.net.ssl.trustStorePassword</li>
     * <li>javax.net.ssl.trustStoreType</li>
     * </ul>
     * <p>
     * See the <a href=
     * "http://docs.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#InstallationAndCustomization">
     * Customizing the JSSE</a> in the JSSE Reference Guide for details on how to
     * set these system properties.
     * 
     * @author Carl Harris
     */
    public class SimpleSSLSocketServer extends SimpleSocketServer {
    
      private final ServerSocketFactory socketFactory;
    
      public static void main(String argv[]) throws Exception {
        doMain(SimpleSSLSocketServer.class, argv);
      }
    
      /**
       * Creates a new server using the default SSL context.
       * @param lc logger context for received events
       * @param port port on which the server is to listen
       * @throws NoSuchAlgorithmException if the default SSL context cannot be
       *         created
       */
      public SimpleSSLSocketServer(LoggerContext lc, int port)
          throws NoSuchAlgorithmException {
        this(lc, port, SSLContext.getDefault());
      }
    
      /**
       * Creates a new server using a custom SSL context.
       * @param lc logger context for received events
       * @param port port on which the server is to listen
       * @param sslContext custom SSL context
       */
      public SimpleSSLSocketServer(LoggerContext lc, int port, 
          SSLContext sslContext) {
        super(lc, port);
        if (sslContext == null) {
          throw new NullPointerException("SSL context required");
        }
        SSLParametersConfiguration parameters = new SSLParametersConfiguration();
        
        parameters.setContext(lc);
        this.socketFactory = new ConfigurableSSLServerSocketFactory(
            parameters, sslContext.getServerSocketFactory());
      }
    
      @Override
      protected ServerSocketFactory getServerSocketFactory() {
        return socketFactory;
      }
    
    }
    ����������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/net/SocketNode.java�������������0000644�0001750�0001750�00000007345�12136042271�030546� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net;
    
    import java.io.BufferedInputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.net.Socket;
    import java.net.SocketAddress;
    
    import ch.qos.logback.classic.Logger;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    
    // Contributors: Moses Hohman <mmhohman@rainbow.uchicago.edu>
    
    /**
     * Read {@link ILoggingEvent} objects sent from a remote client using Sockets
     * (TCP). These logging events are logged according to local policy, as if they
     * were generated locally.
     * 
     * <p>
     * For example, the socket node might decide to log events to a local file and
     * also resent them to a second socket node.
     * 
     * @author Ceki G&uuml;lc&uuml;
     * @author S&eacute;bastien Pennec
     * 
     * @since 0.8.4
     */
    public class SocketNode implements Runnable {
    
      Socket socket;
      LoggerContext context;
      ObjectInputStream ois;
      SocketAddress remoteSocketAddress;
      
      Logger logger;
      boolean closed = false;
      SimpleSocketServer socketServer;
      
      public SocketNode(SimpleSocketServer socketServer, Socket socket, LoggerContext context) {
        this.socketServer = socketServer;
        this.socket = socket;
        remoteSocketAddress = socket.getRemoteSocketAddress();
        this.context = context;
        logger = context.getLogger(SocketNode.class);
    
        try {
          ois = new ObjectInputStream(new BufferedInputStream(socket
              .getInputStream()));
        } catch (Exception e) {
          logger.error("Could not open ObjectInputStream to " + socket, e);
        }
      }
    
      // public
      // void finalize() {
      // System.err.println("-------------------------Finalize called");
      // System.err.flush();
      // }
    
      public void run() {
        ILoggingEvent event;
        Logger remoteLogger;
    
        try {
          while (!closed) {
            // read an event from the wire
            event = (ILoggingEvent) ois.readObject();
            // get a logger from the hierarchy. The name of the logger is taken to
            // be the name contained in the event.
            remoteLogger = context.getLogger(event.getLoggerName());
            // apply the logger-level filter
            if (remoteLogger.isEnabledFor(event.getLevel())) {
              // finally log the event as if was generated locally
              remoteLogger.callAppenders(event);
            }
          }
        } catch (java.io.EOFException e) {
          logger.info("Caught java.io.EOFException closing connection.");
        } catch (java.net.SocketException e) {
          logger.info("Caught java.net.SocketException closing connection.");
        } catch (IOException e) {
          logger.info("Caught java.io.IOException: " + e);
          logger.info("Closing connection.");
        } catch (Exception e) {
          logger.error("Unexpected exception. Closing connection.", e);
        }
    
        socketServer.socketNodeClosing(this);
        close();
      }
      
      void close() {
        if(closed) {
          return;
        }
        closed = true;
        if (ois != null) {
          try {
            ois.close();
          } catch (IOException e) {
            logger.warn("Could not close connection.", e);
          } finally {
            ois = null;
          }
        }
      }
      
      @Override
      public String toString() {
        return this.getClass().getName()+remoteSocketAddress.toString();
      }
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/net/server/���������������������0000755�0001750�0001750�00000000000�12203357067�027151� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000151�00000000000�011562� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/net/server/ServerSocketReceiver.java������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/net/server/ServerSocketReceiver.0000644�0001750�0001750�00000011245�12143151241�033246� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net.server;
    
    import java.io.IOException;
    import java.net.InetAddress;
    import java.net.ServerSocket;
    import java.net.UnknownHostException;
    import java.util.concurrent.Executor;
    
    import javax.net.ServerSocketFactory;
    
    import ch.qos.logback.classic.net.ReceiverBase;
    import ch.qos.logback.core.net.AbstractSocketAppender;
    import ch.qos.logback.core.net.server.ServerListener;
    import ch.qos.logback.core.net.server.ServerRunner;
    import ch.qos.logback.core.util.CloseUtil;
    
    /**
     * A logging socket server that is configurable using Joran.
     *
     * @author Carl Harris
     */
    public class ServerSocketReceiver extends ReceiverBase {
      
      /**
       * Default {@link ServerSocket} backlog
       */
      public static final int DEFAULT_BACKLOG = 50;
    
      private int port = AbstractSocketAppender.DEFAULT_PORT;
      private int backlog = DEFAULT_BACKLOG;
      
      private String address;
    
      private ServerSocket serverSocket;
      private ServerRunner runner;
      
      /**
       * Starts the server.
       */
      protected boolean shouldStart() {
        try {
          ServerSocket serverSocket = getServerSocketFactory().createServerSocket(
              getPort(), getBacklog(), getInetAddress());    
    
          ServerListener<RemoteAppenderClient> listener = 
              createServerListener(serverSocket);
          
          runner = createServerRunner(listener, getContext().getExecutorService());
          runner.setContext(getContext());
          return true;
        }
        catch (Exception ex) {
          addError("server startup error: " + ex, ex);
          CloseUtil.closeQuietly(serverSocket);
          return false;
        }
      }
    
      protected ServerListener<RemoteAppenderClient> createServerListener(
          ServerSocket socket) {
        return new RemoteAppenderServerListener(socket);
      }
      
      protected ServerRunner createServerRunner(
          ServerListener<RemoteAppenderClient> listener,
          Executor executor) {
        return new RemoteAppenderServerRunner(listener, executor);
      }
      
      @Override
      protected Runnable getRunnableTask() {
        return runner;
      }
    
      /**
       * {@inheritDoc}
       */
      protected void onStop() {
        try {
          if (runner == null) return;
          runner.stop();
        }
        catch (IOException ex) {
          addError("server shutdown error: " + ex, ex);
        }
      }
    
      /**
       * Gets the server socket factory.
       * <p>
       * Subclasses may override to provide a custom factory.
       * @return server socket factory
       * @throws Exception
       */
      protected ServerSocketFactory getServerSocketFactory() throws Exception {
        return ServerSocketFactory.getDefault();
      }
        
      /**
       * Gets the local address for the listener.
       * @return an {@link InetAddress} representation of the local address.
       * @throws UnknownHostException
       */
      protected InetAddress getInetAddress() throws UnknownHostException {
        if (getAddress() == null) return null;
        return InetAddress.getByName(getAddress());
      }
      
      /**
       * Gets the local port for the listener.
       * @return local port
       */
      public int getPort() {
        return port;
      }
    
      /**
       * Sets the local port for the listener.
       * @param port the local port to set
       */
      public void setPort(int port) {
        this.port = port;
      }
    
      /**
       * Gets the listener queue depth.
       * <p>
       * This represents the number of connected clients whose connections 
       * have not yet been accepted.
       * @return queue depth
       * @see java.net.ServerSocket
       */
      public int getBacklog() {
        return backlog;
      }
    
      /**
       * Sets the listener queue depth.
       * <p>
       * This represents the number of connected clients whose connections 
       * have not yet been accepted.
       * @param backlog the queue depth to set
       * @see java.net.ServerSocket
       */
      public void setBacklog(int backlog) {
        this.backlog = backlog;
      }
    
      /**
       * Gets the local address for the listener.
       * @return a string representation of the local address
       */
      public String getAddress() {
        return address;
      }
    
      /**
       * Sets the local address for the listener.
       * @param address a host name or a string representation of an IP address
       */
      public void setAddress(String address) {
        this.address = address;
      }
    
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/net/server/package.html���������0000644�0001750�0001750�00000000701�12136042143�031417� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
    <html> 
      <head>
        <title></title>
      </head>
      <body>    
        <p>Provides a robust logging server</p>
        <p>The <a link="ServerSocket.html"><code>ServerSocket</code></a> can 
           be configured in any Joran configuration file, effectively turning 
           any application that uses logback into a potential log message receiver 
           for remote loggers.
        </p>
      </body> 
    </html>
    ���������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000161�00000000000�011563� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/net/server/RemoteAppenderServerListener.java����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/net/server/RemoteAppenderServerL0000644�0001750�0001750�00000002556�12143151241�033306� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net.server;
    
    import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    import ch.qos.logback.core.net.server.ServerListener;
    import ch.qos.logback.core.net.server.ServerSocketListener;
    
    /**
     * A {@link ServerListener} for remote appenders.
     *
     * @author Carl Harris
     */
    class RemoteAppenderServerListener
        extends ServerSocketListener<RemoteAppenderClient>  {
    
      /**
       * Constructs a new listener.
       * @param serverSocket the {@link ServerSocket} from which to accept
       *    new client connections
       */
      public RemoteAppenderServerListener(ServerSocket serverSocket) {
        super(serverSocket);
      }
    
      /**
       * {@inheritDoc}
       */
      @Override
      protected RemoteAppenderClient createClient(String id, Socket socket) 
          throws IOException {
        return new RemoteAppenderStreamClient(id, socket);
      }
    
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000154�00000000000�011565� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/net/server/SSLServerSocketAppender.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/net/server/SSLServerSocketAppend0000644�0001750�0001750�00000003111�12136042271�033212� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net.server;
    
    import ch.qos.logback.classic.net.LoggingEventPreSerializationTransformer;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.net.server.SSLServerSocketAppenderBase;
    import ch.qos.logback.core.spi.PreSerializationTransformer;
    
    /**
     * A {@Link ServerSocketAppender} that supports SSL.
     *
     * @author Carl Harris
     */
    public class SSLServerSocketAppender 
        extends SSLServerSocketAppenderBase<ILoggingEvent> {
    
      private static final PreSerializationTransformer<ILoggingEvent> pst = 
          new LoggingEventPreSerializationTransformer();
    
      private boolean includeCallerData;
      
      @Override
      protected void postProcessEvent(ILoggingEvent event) {
        if (isIncludeCallerData()) {
          event.getCallerData();
        }
      }
    
      @Override
      protected PreSerializationTransformer<ILoggingEvent> getPST() {
        return pst;
      }
    
      public boolean isIncludeCallerData() {
        return includeCallerData;
      }
    
      public void setIncludeCallerData(boolean includeCallerData) {
        this.includeCallerData = includeCallerData;
      }
    
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000154�00000000000�011565� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/net/server/SSLServerSocketReceiver.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/net/server/SSLServerSocketReceiv0000644�0001750�0001750�00000004073�12136042271�033230� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net.server;
    
    import javax.net.ServerSocketFactory;
    import javax.net.ssl.SSLContext;
    
    import ch.qos.logback.core.net.ssl.ConfigurableSSLServerSocketFactory;
    import ch.qos.logback.core.net.ssl.SSLComponent;
    import ch.qos.logback.core.net.ssl.SSLConfiguration;
    import ch.qos.logback.core.net.ssl.SSLParametersConfiguration;
    
    /**
     * A {@link ServerSocketReceiver} that supports SSL.
     *
     * @author Carl Harris
     */
    public class SSLServerSocketReceiver extends ServerSocketReceiver 
        implements SSLComponent {
    
      private SSLConfiguration ssl;
      private ServerSocketFactory socketFactory;
      
      /**
       * {@inheritDoc}
       */
      @Override
      protected ServerSocketFactory getServerSocketFactory() throws Exception {
        if (socketFactory == null) {
          SSLContext sslContext = getSsl().createContext(this);
          SSLParametersConfiguration parameters = getSsl().getParameters();
          parameters.setContext(getContext());
          socketFactory = new ConfigurableSSLServerSocketFactory(
            parameters, sslContext.getServerSocketFactory());
        }
        return socketFactory;
      }
    
      /**
       * Gets the server's SSL configuration.
       * @return SSL configuration; if no SSL configuration was provided
       *    a default configuration is returned
       */
      public SSLConfiguration getSsl() {
        if (ssl == null) {
          ssl = new SSLConfiguration();
        }
        return ssl;
      }
    
      /**
       * Gets the server's SSL configuration.
       * @param ssl the SSL configuration to set.
       */
      public void setSsl(SSLConfiguration ssl) {
        this.ssl = ssl;
      }
    
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000151�00000000000�011562� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/net/server/ServerSocketAppender.java������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/net/server/ServerSocketAppender.0000644�0001750�0001750�00000003277�12140555240�033252� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net.server;
    
    import ch.qos.logback.classic.net.LoggingEventPreSerializationTransformer;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.net.server.AbstractServerSocketAppender;
    import ch.qos.logback.core.spi.PreSerializationTransformer;
    
    /**
     * An appender that listens on a TCP port for connections from remote
     * loggers.  Each event delivered to this appender is delivered to all
     * connected remote loggers. 
     *
     * @author Carl Harris
     */
    public class ServerSocketAppender
        extends AbstractServerSocketAppender<ILoggingEvent> {
    
      private static final PreSerializationTransformer<ILoggingEvent> pst = 
          new LoggingEventPreSerializationTransformer();
    
      private boolean includeCallerData;
      
      @Override
      protected void postProcessEvent(ILoggingEvent event) {
        if (isIncludeCallerData()) {
          event.getCallerData();
        }
      }
    
      @Override
      protected PreSerializationTransformer<ILoggingEvent> getPST() {
        return pst;
      }
    
      public boolean isIncludeCallerData() {
        return includeCallerData;
      }
    
      public void setIncludeCallerData(boolean includeCallerData) {
        this.includeCallerData = includeCallerData;
      }
    
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000157�00000000000�011570� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/net/server/RemoteAppenderServerRunner.java������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/net/server/RemoteAppenderServerR0000644�0001750�0001750�00000003124�12143151241�033304� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net.server;
    
    import java.util.concurrent.Executor;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.core.net.server.ConcurrentServerRunner;
    import ch.qos.logback.core.net.server.ServerListener;
    import ch.qos.logback.core.net.server.ServerRunner;
    
    /**
     * A {@link ServerRunner} that receives logging events from remote appender
     * clients.
     *
     * @author Carl Harris
     */
    class RemoteAppenderServerRunner
        extends ConcurrentServerRunner<RemoteAppenderClient> {
    
      /**
       * Constructs a new server runner.
       * @param listener the listener from which the server will accept new
       *    clients
       * @param executor that will be used to execute asynchronous tasks 
       *    on behalf of the runner.
       */
      public RemoteAppenderServerRunner(
          ServerListener<RemoteAppenderClient> listener, Executor executor) {
        super(listener, executor);
      }
    
      /**
       * {@inheritDoc}
       */
      @Override
      protected boolean configureClient(RemoteAppenderClient client) {
        client.setLoggerContext((LoggerContext) getContext());
        return true;
      }
      
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000151�00000000000�011562� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/net/server/RemoteAppenderClient.java������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/net/server/RemoteAppenderClient.0000644�0001750�0001750�00000002367�12143151241�033220� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net.server;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.core.net.server.Client;
    import ch.qos.logback.core.net.server.ServerRunner;
    
    
    /**
     * A client of a {@link ServerRunner} that receives events from a remote
     * appender.
     *  
     * @author Carl Harris
     */
    interface RemoteAppenderClient extends Client {
    
      /**
       * Sets the client's logger context.
       * <p>
       * This provides the local logging context to the client's service thread,
       * and is used as the destination for logging events received from the
       * client.
       * <p>
       * This method <em>must</em> be invoked before the {@link #run()} method.
       * @param lc the logger context to set
       */
      void setLoggerContext(LoggerContext lc);
      
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000157�00000000000�011570� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/net/server/RemoteAppenderStreamClient.java������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/net/server/RemoteAppenderStreamC0000644�0001750�0001750�00000007604�12143151241�033261� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net.server;
    
    import java.io.EOFException;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.ObjectInputStream;
    import java.net.Socket;
    
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.util.CloseUtil;
    
    /**
     * A {@link RemoteAppenderClient} that reads serialized {@link ILoggingEvent} 
     * objects from an {@link InputStream}.
     *
     * @author Carl Harris
     */
    class RemoteAppenderStreamClient implements RemoteAppenderClient {
    
      private final String id;
      private final Socket socket;
      private final InputStream inputStream;
      
      private LoggerContext lc;
      private Logger logger;
      
      /**
       * Constructs a new client.  
       * @param id a display name for the client
       * @param inputStream input stream from which events will be read
       */
      public RemoteAppenderStreamClient(String id, Socket socket) {
        this.id = id;
        this.socket = socket;
        this.inputStream = null;
      }
    
      /**
       * Constructs a new client.
       * <p>
       * This constructor is provided primarily to support unit tests for which
       * it is inconvenient to create a socket.
       *  
       * @param id a display name for the client
       * @param inputStream input stream from which events will be read
       */
      public RemoteAppenderStreamClient(String id, InputStream inputStream) {
        this.id = id;
        this.socket = null;
        this.inputStream = inputStream;
      }
    
      /**
       * {@inheritDoc}
       */
      public void setLoggerContext(LoggerContext lc) {
        this.lc = lc;
        this.logger = lc.getLogger(getClass().getPackage().getName());
      }
    
      /**
       * {@inheritDoc}
       */
      public void close() {
        if (socket == null) return;
        CloseUtil.closeQuietly(socket);
      }
    
      /**
       * {@inheritDoc}
       */
      public void run() {
        logger.info(this + ": connected"); 
        ObjectInputStream ois = null;
        try {
          ois = createObjectInputStream();
          while (true) {
            // read an event from the wire
            ILoggingEvent event = (ILoggingEvent) ois.readObject();
            // get a logger from the hierarchy. The name of the logger is taken to
            // be the name contained in the event.
            Logger remoteLogger = lc.getLogger(event.getLoggerName());
            // apply the logger-level filter
            if (remoteLogger.isEnabledFor(event.getLevel())) {
              // finally log the event as if was generated locally
              remoteLogger.callAppenders(event);
            }
          }
        }
        catch (EOFException ex) {
          // this is normal and expected
          assert true;    
        }
        catch (IOException ex) {
          logger.info(this + ": " + ex);
        }
        catch (ClassNotFoundException ex) {
          logger.error(this + ": unknown event class");      
        }
        catch (RuntimeException ex) {
          logger.error(this + ": " + ex);
        }
        finally {
          if (ois != null) {
            CloseUtil.closeQuietly(ois);
          }
          close();
          logger.info(this + ": connection closed");
        }
      }
    
      private ObjectInputStream createObjectInputStream() throws IOException {
        if (inputStream != null) {
          return new ObjectInputStream(inputStream);
        }
        return new ObjectInputStream(socket.getInputStream());
      }
      
      /**
       * {@inheritDoc}
       */
      @Override
      public String toString() {
        return "client " + id;
      }
    
    }
    ����������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/net/ReceiverBase.java�����������0000644�0001750�0001750�00000004412�12143151241�031033� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net;
    
    import ch.qos.logback.core.spi.ContextAwareBase;
    import ch.qos.logback.core.spi.LifeCycle;
    
    /**
     * An abstract base for components that receive logging events from a remote
     * peer and log according to local policy
     *
     * @author Carl Harris
     */
    public abstract class ReceiverBase extends ContextAwareBase 
        implements LifeCycle {
    
      private boolean started;
      
      /**
       * {@inheritDoc}
       */
      public final void start() {
        if (isStarted()) return;
        if (getContext() == null) {
          throw new IllegalStateException("context not set");
        }
        if (shouldStart()) {
          getContext().getExecutorService().execute(getRunnableTask());
          started = true;
        }
      }
    
      /**
       * {@inheritDoc}
       */
      public final void stop() {
        if (!isStarted()) return;
        try {
          onStop();
        }
        catch (RuntimeException ex) {
          addError("on stop: " + ex, ex);
        }
        started = false;
      }
      
      /**
       * {@inheritDoc}
       */
      public final boolean isStarted() {
        return started;
      }
    
      /**
       * Determines whether this receiver should start.
       * <p>
       * Subclasses will implement this method to do any subclass-specific
       * validation.  The subclass's {@link #getRunnableTask()} method will be 
       * invoked (and the task returned will be submitted to the executor)
       * if and only if this method returns {@code true} 
       * @return flag indicating whether this receiver should start
       */
      protected abstract boolean shouldStart();
      
      /**
       * Allows a subclass to participate in receiver shutdown.
       */
      protected abstract void onStop();
      
      /**
       * Provides the runnable task this receiver will execute.
       * @return runnable task
       */
      protected abstract Runnable getRunnableTask();
      
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/net/JMSTopicSink.java�����������0000644�0001750�0001750�00000012036�12136042271�030756� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.util.Properties;
    
    import javax.jms.JMSException;
    import javax.jms.ObjectMessage;
    import javax.jms.Session;
    import javax.jms.Topic;
    import javax.jms.TopicConnection;
    import javax.jms.TopicConnectionFactory;
    import javax.jms.TopicSession;
    import javax.jms.TopicSubscriber;
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.naming.NameNotFoundException;
    import javax.naming.NamingException;
    
    import org.slf4j.LoggerFactory;
    
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.classic.util.ContextInitializer;
    
    /**
     * A simple application that consumes logging events sent by a {@link
     * JMSTopicAppender}.
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public class JMSTopicSink implements javax.jms.MessageListener {
    
      private Logger logger = (Logger)LoggerFactory.getLogger(JMSTopicSink.class);
    
      static public void main(String[] args) throws Exception {
        if (args.length < 2) {
          usage("Wrong number of arguments.");
        }
    
        String tcfBindingName = args[0];
        String topicBindingName = args[1];
        String username = null;
        String password = null;
        if (args.length == 4) {
          username = args[2];
          password = args[3];
        }
    
        LoggerContext loggerContext = (LoggerContext) LoggerFactory
            .getILoggerFactory();
        new ContextInitializer(loggerContext).autoConfig();
    
        new JMSTopicSink(tcfBindingName, topicBindingName, username, password);
    
        BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
        // Loop until the word "exit" is typed
        System.out.println("Type \"exit\" to quit JMSTopicSink.");
        while (true) {
          String s = stdin.readLine();
          if (s.equalsIgnoreCase("exit")) {
            System.out.println("Exiting. Kill the application if it does not exit "
                + "due to daemon threads.");
            return;
          }
        }
      }
    
      public JMSTopicSink(String tcfBindingName, String topicBindingName,
          String username, String password) {
    
        try {
          Properties env = new Properties();
          env.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.activemq.jndi.ActiveMQInitialContextFactory");
          env.put(Context.PROVIDER_URL, "tcp://localhost:61616");
          Context ctx = new InitialContext(env);
          TopicConnectionFactory topicConnectionFactory;
          topicConnectionFactory = (TopicConnectionFactory) lookup(ctx,
              tcfBindingName);
          System.out.println("Topic Cnx Factory found");
          Topic topic = (Topic) ctx.lookup(topicBindingName);
          System.out.println("Topic found: " + topic.getTopicName());
    
          TopicConnection topicConnection = topicConnectionFactory
              .createTopicConnection(username, password);
          System.out.println("Topic Connection created");
          
          TopicSession topicSession = topicConnection.createTopicSession(false,
              Session.AUTO_ACKNOWLEDGE);
    
          TopicSubscriber topicSubscriber = topicSession.createSubscriber(topic);
    
          topicSubscriber.setMessageListener(this);
          
          topicConnection.start();
          System.out.println("Topic Connection started");
          
        } catch (Exception e) {
          logger.error("Could not read JMS message.", e);
        }
      }
    
      public void onMessage(javax.jms.Message message) {
        ILoggingEvent event;
        try {
          if (message instanceof ObjectMessage) {
            ObjectMessage objectMessage = (ObjectMessage) message;
            event = (ILoggingEvent) objectMessage.getObject();
            Logger log = (Logger) LoggerFactory.getLogger(event.getLoggerName());
            log.callAppenders(event);
          } else {
            logger.warn("Received message is of type " + message.getJMSType()
                + ", was expecting ObjectMessage.");
          }
        } catch (JMSException jmse) {
          logger.error("Exception thrown while processing incoming message.", jmse);
        }
      }
    
      protected Object lookup(Context ctx, String name)
          throws NamingException {
        try {
          return ctx.lookup(name);
        } catch (NameNotFoundException e) {
          logger.error("Could not find name [" + name + "].");
          throw e;
        }
      }
    
      static void usage(String msg) {
        System.err.println(msg);
        System.err
            .println("Usage: java "
                + JMSTopicSink.class.getName()
                + " TopicConnectionFactoryBindingName TopicBindingName Username Password");
        System.exit(1);
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/net/SMTPAppender.java�����������0000644�0001750�0001750�00000007656�12136042271�030757� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net;
    
    import ch.qos.logback.classic.ClassicConstants;
    import ch.qos.logback.classic.PatternLayout;
    import ch.qos.logback.classic.boolex.OnErrorEvaluator;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.Layout;
    import ch.qos.logback.core.boolex.EventEvaluator;
    import ch.qos.logback.core.helpers.CyclicBuffer;
    import ch.qos.logback.core.net.SMTPAppenderBase;
    import org.slf4j.Marker;
    
    /**
     * Send an e-mail when a specific logging event occurs, typically on errors or
     * fatal errors.
     * 
     * For more information about this appender, please refer to the online manual at
     * http://logback.qos.ch/manual/appenders.html#SMTPAppender
     * 
     * @author Ceki G&uuml;lc&uuml;
     * @author S&eacute;bastien Pennec
     * 
     */
    public class SMTPAppender extends SMTPAppenderBase<ILoggingEvent> {
    
      // value "%logger{20} - %m" is referenced in the docs!
      static final String DEFAULT_SUBJECT_PATTERN = "%logger{20} - %m";
      
      private int bufferSize = 512;
      private boolean includeCallerData = false;
    
    
    
      /**
       * The default constructor will instantiate the appender with a
       * {@link EventEvaluator} that will trigger on events with level
       * ERROR or higher.
       */
      public SMTPAppender() {
    
      }
      
      public void start() {    
        if (eventEvaluator == null) {
          OnErrorEvaluator onError = new OnErrorEvaluator();
          onError.setContext(getContext());
          onError.setName("onError");
          onError.start();
          this.eventEvaluator = onError;      
        }
        super.start();
      }
    
      /**
       * Use the parameter as the {@link
       * EventEvaluator} for this SMTPAppender.
       */
      public SMTPAppender(EventEvaluator<ILoggingEvent> eventEvaluator) {
        this.eventEvaluator = eventEvaluator;
      }
    
      /**
       * Perform SMTPAppender specific appending actions, mainly adding the event to
       * a cyclic buffer.
       */
      protected void subAppend(CyclicBuffer<ILoggingEvent> cb, ILoggingEvent event) {
        if(includeCallerData) {
          event.getCallerData();
        }
        event.prepareForDeferredProcessing();
        cb.add(event);
      }
    
      @Override
      protected void fillBuffer(CyclicBuffer<ILoggingEvent> cb, StringBuffer sbuf) {
        int len = cb.length();
        for (int i = 0; i < len; i++) {
          ILoggingEvent event = cb.get();
          sbuf.append(layout.doLayout(event));
        }
      }
    
      protected boolean eventMarksEndOfLife(ILoggingEvent eventObject) {
        Marker marker = eventObject.getMarker();
        if(marker == null)
          return false;
    
        return marker.contains(ClassicConstants.FINALIZE_SESSION_MARKER);
      }
    
    
      @Override
      protected Layout<ILoggingEvent> makeSubjectLayout(String subjectStr) {
        if(subjectStr == null) {
          subjectStr = DEFAULT_SUBJECT_PATTERN;
        }
        PatternLayout pl = new PatternLayout();
        pl.setContext(getContext());
        pl.setPattern(subjectStr);
        // we don't want a ThrowableInformationConverter appended
        // to the end of the converter chain
        // This fixes issue LBCLASSIC-67
        pl.setPostCompileProcessor(null);
        pl.start();
        return pl;
      }
    
    
      protected PatternLayout makeNewToPatternLayout(String toPattern) {
        PatternLayout pl = new PatternLayout();
        pl.setPattern(toPattern+"%nopex");
        return pl;
      }
    
      public boolean isIncludeCallerData() {
        return includeCallerData;
      }
    
      public void setIncludeCallerData(boolean includeCallerData) {
        this.includeCallerData = includeCallerData;
      }
    }
    ����������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/net/SyslogAppender.java���������0000644�0001750�0001750�00000013230�12136042271�031435� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net;
    
    import java.io.IOException;
    import java.io.OutputStream;
    
    import ch.qos.logback.classic.PatternLayout;
    import ch.qos.logback.classic.pattern.SyslogStartConverter;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.classic.spi.IThrowableProxy;
    import ch.qos.logback.classic.spi.StackTraceElementProxy;
    import ch.qos.logback.classic.util.LevelToSyslogSeverity;
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.Layout;
    import ch.qos.logback.core.net.SyslogAppenderBase;
    
    /**
     * This appender can be used to send messages to a remote syslog daemon. <p> For
     * more information about this appender, please refer to the online manual at
     * http://logback.qos.ch/manual/appenders.html#SyslogAppender
     *
     * @author Ceki G&uuml;lc&uuml;
     */
    public class SyslogAppender extends SyslogAppenderBase<ILoggingEvent> {
    
      static final public String DEFAULT_SUFFIX_PATTERN = "[%thread] %logger %msg";
      static final public String DEFAULT_STACKTRACE_PATTERN = "" + CoreConstants.TAB;
    
      PatternLayout stackTraceLayout = new PatternLayout();
      String stackTracePattern = DEFAULT_STACKTRACE_PATTERN;
    
      boolean throwableExcluded = false;
    
    
      public void start() {
        super.start();
        setupStackTraceLayout();
      }
    
      String getPrefixPattern() {
        return "%syslogStart{" + getFacility() + "}%nopex{}";
      }
    
      /*
       * Convert a level to equivalent syslog severity. Only levels for printing
       * methods i.e DEBUG, WARN, INFO and ERROR are converted.
       * 
       * @see ch.qos.logback.core.net.SyslogAppenderBase#getSeverityForEvent(java.lang.Object)
       */
      @Override
      public int getSeverityForEvent(Object eventObject) {
        ILoggingEvent event = (ILoggingEvent) eventObject;
        return LevelToSyslogSeverity.convert(event);
      }
    
      @Override
      protected void postProcess(Object eventObject, OutputStream sw) {
        if (throwableExcluded)
          return;
    
        ILoggingEvent event = (ILoggingEvent) eventObject;
        IThrowableProxy tp = event.getThrowableProxy();
    
        if (tp == null)
          return;
    
        String stackTracePrefix = stackTraceLayout.doLayout(event);
        boolean isRootException = true;
        while (tp != null) {
          StackTraceElementProxy[] stepArray = tp.getStackTraceElementProxyArray();
          try {
            handleThrowableFirstLine(sw, tp, stackTracePrefix, isRootException);
            isRootException = false;
            for (StackTraceElementProxy step : stepArray) {
              StringBuilder sb = new StringBuilder();
              sb.append(stackTracePrefix).append(step);
              sw.write(sb.toString().getBytes());
              sw.flush();
            }
          } catch (IOException e) {
            break;
          }
          tp = tp.getCause();
        }
      }
    
      // LOGBACK-411 and  LOGBACK-750
      private void handleThrowableFirstLine(OutputStream sw, IThrowableProxy tp, String stackTracePrefix, boolean isRootException) throws IOException {
        StringBuilder sb = new StringBuilder().append(stackTracePrefix);
    
        if (!isRootException) {
          sb.append(CoreConstants.CAUSED_BY);
        }
        sb.append(tp.getClassName()).append(": ").append(tp.getMessage());
        sw.write(sb.toString().getBytes());
        sw.flush();
      }
    
      boolean stackTraceHeaderLine(StringBuilder sb, boolean topException) {
    
        return false;
      }
    
      public Layout<ILoggingEvent> buildLayout() {
        PatternLayout layout = new PatternLayout();
        layout.getInstanceConverterMap().put("syslogStart",
                SyslogStartConverter.class.getName());
        if (suffixPattern == null) {
          suffixPattern = DEFAULT_SUFFIX_PATTERN;
        }
        layout.setPattern(getPrefixPattern() + suffixPattern);
        layout.setContext(getContext());
        layout.start();
        return layout;
      }
    
      private void setupStackTraceLayout() {
        stackTraceLayout.getInstanceConverterMap().put("syslogStart",
                SyslogStartConverter.class.getName());
    
        stackTraceLayout.setPattern(getPrefixPattern() + stackTracePattern);
        stackTraceLayout.setContext(getContext());
        stackTraceLayout.start();
      }
    
      public boolean isThrowableExcluded() {
        return throwableExcluded;
      }
    
      /**
       * Setting throwableExcluded to true causes no Throwable's stack trace data to be sent to
       * the syslog daemon. By default, stack trace data is sent to syslog daemon.
       *
       * @param throwableExcluded
       * @since 1.0.4
       */
      public void setThrowableExcluded(boolean throwableExcluded) {
        this.throwableExcluded = throwableExcluded;
      }
    
      /**
       * See {@link #setStackTracePattern(String).
       *
       * @return the stackTraceSuffixPattern
       * @since 1.0.4
       */
      public String getStackTracePattern() {
        return stackTracePattern;
      }
    
      /**
       * Stack trace lines are sent to the syslog server separately from the main message
       * For stack trace lines, the stackTracePattern is used instead of {@link #suffixPattern}.
       * The <b>stackTracePattern</b> option allows specification of a separately format for the
       * non-standardized part of stack trace lines.
       *
       * @param stackTracePattern
       * @since 1.0.4
       */
      public void setStackTracePattern(String stackTracePattern) {
        this.stackTracePattern = stackTracePattern;
      }
    }������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/net/SocketAcceptor.java���������0000644�0001750�0001750�00000001154�12136042271�031411� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net;
    
    class SocketAcceptor extends Thread {
    
      
      @Override
      public void run() {
        
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000165�00000000000�011567� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/net/LoggingEventPreSerializationTransformer.java������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/net/LoggingEventPreSerialization0000644�0001750�0001750�00000002414�12136042271�033355� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net;
    
    import java.io.Serializable;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.classic.spi.LoggingEvent;
    import ch.qos.logback.classic.spi.LoggingEventVO;
    import ch.qos.logback.core.spi.PreSerializationTransformer;
    
    public class LoggingEventPreSerializationTransformer implements
        PreSerializationTransformer<ILoggingEvent> {
    
      public Serializable transform(ILoggingEvent event) {
        if(event == null) {
          return null;
        }
        if (event instanceof LoggingEvent) {
          return LoggingEventVO.build(event);
        } else if (event instanceof LoggingEventVO) {
          return (LoggingEventVO)  event;
        } else {
          throw new IllegalArgumentException("Unsupported type "+event.getClass().getName());
        }
      }
    
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/net/SimpleSocketServer.java�����0000644�0001750�0001750�00000014503�12136042271�032273� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net;
    
    import java.io.IOException;
    import java.lang.reflect.Constructor;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.concurrent.CountDownLatch;
    
    import javax.net.ServerSocketFactory;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.core.joran.spi.JoranException;
    
    /**
     * A simple {@link SocketNode} based server.
     * 
     * <pre>
     *      &lt;b&gt;Usage:&lt;/b&gt; java ch.qos.logback.classic.net.SimpleSocketServer port configFile
     * </pre>
     * 
     * where <em>port</em> is a port number where the server listens and
     * <em>configFile</em> is an xml configuration file fed to
     * {@link JoranConfigurator}.
     * 
     * </pre>
     * 
     * @author Ceki G&uuml;lc&uuml;
     * @author S&eacute;bastien Pennec
     * 
     * @since 0.8.4
     */
    public class SimpleSocketServer extends Thread {
    
      Logger logger = LoggerFactory.getLogger(SimpleSocketServer.class);
    
      private final int port;
      private final LoggerContext lc;
      private boolean closed = false;
      private ServerSocket serverSocket;
      private List<SocketNode> socketNodeList = new ArrayList<SocketNode>();
    
      // used for testing purposes
      private CountDownLatch latch;
    
      public static void main(String argv[]) throws Exception {
        doMain(SimpleSocketServer.class, argv);
      }
    
      protected static void doMain(Class<? extends SimpleSocketServer> serverClass,
          String argv[]) throws Exception {
        int port = -1;
        if (argv.length == 2) {
          port = parsePortNumber(argv[0]);
        } else {
          usage("Wrong number of arguments.");
        }
    
        String configFile = argv[1];
        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
        configureLC(lc, configFile);
    
        SimpleSocketServer sss = createServer(serverClass, lc, port);
        sss.start();
      }
    
      private static SimpleSocketServer createServer(
          Class<? extends SimpleSocketServer> serverClass,
          LoggerContext lc, int port) throws Exception {
        
        Constructor<? extends SimpleSocketServer> constructor = 
            serverClass.getConstructor(LoggerContext.class, int.class);
        
        return constructor.newInstance(lc, port);
      }
      
      public SimpleSocketServer(LoggerContext lc, int port) {
        this.lc = lc;
        this.port = port;
      }
    
    
      public void run() {
        try {
          logger.info("Listening on port " + port);
          serverSocket = getServerSocketFactory().createServerSocket(port);
          while (!closed) {
            logger.info("Waiting to accept a new client.");
            signalAlmostReadiness();
            Socket socket = serverSocket.accept();
            logger.info("Connected to client at " + socket.getInetAddress());
            logger.info("Starting new socket node.");
            SocketNode newSocketNode = new SocketNode(this, socket, lc); 
            synchronized (socketNodeList) {
              socketNodeList.add(newSocketNode);
            }
            new Thread(newSocketNode).start();
          }
        } catch (Exception e) {
          if(closed) {
            logger.info("Exception in run method for a closed server. This is normal.");
          } else {
            logger.error("Unexpected failure in run method", e);
          }
        }
      }
    
      /**
       * Gets the platform default {@link ServerSocketFactory}.
       * <p>
       * Subclasses may override to provide a custom server socket factory.
       */
      protected ServerSocketFactory getServerSocketFactory() {
        return ServerSocketFactory.getDefault();
      }
    
      /**
       * Signal another thread that we have established a connection
       * This is useful for testing purposes.
       */
      void signalAlmostReadiness() {
        if(latch != null && latch.getCount() != 0) {
          //System.out.println("signalAlmostReadiness() with latch "+latch);
          latch.countDown();
        }
      }
    
      /**
       * Used for testing purposes
       * @param latch
       */
      void setLatch(CountDownLatch latch) {
        this.latch = latch;
      }
      /**
        * Used for testing purposes
        */
      public CountDownLatch getLatch() {
        return latch;
      }
      public boolean isClosed() {
        return closed;
      }
    
      public void close() {
        closed = true;
        if (serverSocket != null) {
          try {
            serverSocket.close();
          } catch (IOException e) {
            logger.error("Failed to close serverSocket", e);
          } finally {
            serverSocket = null;
          }
        }
    
        logger.info("closing this server");
        synchronized (socketNodeList) {
          for(SocketNode sn: socketNodeList) {
            sn.close();
          }
        }
        if(socketNodeList.size() != 0) {
          logger.warn("Was expecting a 0-sized socketNodeList after server shutdown");
        }
    
      }
    
      public void socketNodeClosing(SocketNode sn) {
        logger.debug("Removing {}", sn);
    
        // don't allow simultaneous access to the socketNodeList
        // (e.g. removal whole iterating on the list causes
        // java.util.ConcurrentModificationException
        synchronized (socketNodeList) {
          socketNodeList.remove(sn);
        }
      }
    
      static void usage(String msg) {
        System.err.println(msg);
        System.err.println("Usage: java " + SimpleSocketServer.class.getName()
            + " port configFile");
        System.exit(1);
      }
    
      static int parsePortNumber(String portStr) {
        try {
          return Integer.parseInt(portStr);
        } catch (java.lang.NumberFormatException e) {
          e.printStackTrace();
          usage("Could not interpret port number [" + portStr + "].");
          // we won't get here
          return -1;
        }
      }
    
      static public void configureLC(LoggerContext lc, String configFile)
          throws JoranException {
        JoranConfigurator configurator = new JoranConfigurator();
        lc.reset();
        configurator.setContext(lc);
        configurator.doConfigure(configFile);
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/net/SocketAppender.java���������0000644�0001750�0001750�00000004171�12140555240�031411� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    // Contributors: Dan MacDonald <dan@redknee.com>
    package ch.qos.logback.classic.net;
    
    import java.net.InetAddress;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.net.AbstractSocketAppender;
    import ch.qos.logback.core.spi.PreSerializationTransformer;
    
    /**
     * Sends {@link ILoggingEvent} objects to a remote a log server, usually a
     * {@link SocketNode}.
     * 
     * For more information on this appender, please refer to the online manual
     * at http://logback.qos.ch/manual/appenders.html#SocketAppender
     * 
     * @author Ceki G&uuml;lc&uuml;
     * @author S&eacute;bastien Pennec
     */
    
    public class SocketAppender extends AbstractSocketAppender<ILoggingEvent> {
    
      private static final PreSerializationTransformer<ILoggingEvent> pst = 
          new LoggingEventPreSerializationTransformer();
      
      private boolean includeCallerData = false;
    
      public SocketAppender() {
      }
    
      /**
       * Connects to remote server at <code>host</code> and <code>port</code>.
       */
      @Deprecated
      public SocketAppender(String host, int port) {
        super(host, port);
      }
    
      /**
       * Connects to remote server at <code>address</code> and <code>port</code>.
       */
      @Deprecated
      public SocketAppender(InetAddress address, int port) {
        super(address.getHostAddress(), port);
      }
    
      @Override
      protected void postProcessEvent(ILoggingEvent event) {
        if (includeCallerData) {
          event.getCallerData();
        }
      }
    
      public void setIncludeCallerData(boolean includeCallerData) {
        this.includeCallerData = includeCallerData;
      }
      
      public PreSerializationTransformer<ILoggingEvent> getPST() {
        return pst;
      }
      
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/net/SSLSocketReceiver.java������0000644�0001750�0001750�00000004462�12137261161�032006� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net;
    
    import javax.net.SocketFactory;
    import javax.net.ssl.SSLContext;
    
    import ch.qos.logback.core.net.ssl.ConfigurableSSLSocketFactory;
    import ch.qos.logback.core.net.ssl.SSLComponent;
    import ch.qos.logback.core.net.ssl.SSLConfiguration;
    import ch.qos.logback.core.net.ssl.SSLParametersConfiguration;
    
    /**
     * A {@link SocketReceiver} that supports SSL.
     *
     * @author Carl Harris
     */
    public class SSLSocketReceiver extends SocketReceiver 
        implements SSLComponent {
    
      private SSLConfiguration ssl;
      private SocketFactory socketFactory;
    
      /**
       * Gets an {@link SocketFactory} that produces SSL sockets using an
       * {@link SSLContext} that is derived from the receiver's configuration.
       * @return socket factory
       */
      @Override
      protected SocketFactory getSocketFactory() {
        return socketFactory;
      }
    
      /**
       * {@inheritDoc}
       */
      @Override
      protected boolean shouldStart() {
        try {
          SSLContext sslContext = getSsl().createContext(this);
          SSLParametersConfiguration parameters = getSsl().getParameters();
          parameters.setContext(getContext());
          socketFactory = new ConfigurableSSLSocketFactory(parameters, 
              sslContext.getSocketFactory());
          return super.shouldStart();
        }
        catch (Exception ex) {
          addError(ex.getMessage(), ex);
          return false;
        }
      }
    
      /**
       * Gets the SSL configuration.
       * @return SSL configuration; if no configuration has been set, a
       *    default configuration is returned
       */
      public SSLConfiguration getSsl() {
        if (ssl == null) {
          ssl = new SSLConfiguration();
        }
        return ssl;
      }
    
      /**
       * Sets the SSL configuration.
       * @param ssl the SSL configuration to set
       */
      public void setSsl(SSLConfiguration ssl) {
        this.ssl = ssl;
      }
    
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/net/JMSQueueSink.java�����������0000644�0001750�0001750�00000012030�12136042271�030756� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.util.Properties;
    
    import javax.jms.JMSException;
    import javax.jms.MessageConsumer;
    import javax.jms.ObjectMessage;
    import javax.jms.Queue;
    import javax.jms.QueueConnection;
    import javax.jms.QueueConnectionFactory;
    import javax.jms.QueueSession;
    import javax.jms.Session;
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.naming.NameNotFoundException;
    import javax.naming.NamingException;
    
    import org.slf4j.LoggerFactory;
    
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.classic.util.ContextInitializer;
    
    /**
     * A simple application that consumes logging events sent by a {@link
     * JMSQueueAppender}.
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public class JMSQueueSink implements javax.jms.MessageListener {
    
      private Logger logger = (Logger)LoggerFactory.getLogger(JMSTopicSink.class);
    
      static public void main(String[] args) throws Exception {
        if (args.length < 2) {
          usage("Wrong number of arguments.");
        }
    
        String qcfBindingName = args[0];
        String queueBindingName = args[1];
        String username = null;
        String password = null;
        if (args.length == 4) {
          username = args[2];
          password = args[3];
        }
    
        LoggerContext loggerContext = (LoggerContext) LoggerFactory
            .getILoggerFactory();
        new ContextInitializer(loggerContext).autoConfig();
    
        new JMSQueueSink(qcfBindingName, queueBindingName, username, password);
    
        BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
        // Loop until the word "exit" is typed
        System.out.println("Type \"exit\" to quit JMSQueueSink.");
        while (true) {
          String s = stdin.readLine();
          if (s.equalsIgnoreCase("exit")) {
            System.out.println("Exiting. Kill the application if it does not exit "
                + "due to daemon threads.");
            return;
          }
        }
      }
    
      public JMSQueueSink(String qcfBindingName, String queueBindingName,
          String username, String password) {
    
        try {
          Properties env = new Properties();
          env.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.activemq.jndi.ActiveMQInitialContextFactory");
          env.put(Context.PROVIDER_URL, "tcp://localhost:61616");
          Context ctx = new InitialContext(env);
          QueueConnectionFactory queueConnectionFactory;
          queueConnectionFactory = (QueueConnectionFactory) lookup(ctx,
              qcfBindingName);
          System.out.println("Queue Cnx Factory found");
          Queue queue = (Queue) ctx.lookup(queueBindingName);
          System.out.println("Queue found: " + queue.getQueueName());
    
          QueueConnection queueConnection = queueConnectionFactory
              .createQueueConnection(username, password);
          System.out.println("Queue Connection created");
          
          QueueSession queueSession = queueConnection.createQueueSession(false,
              Session.AUTO_ACKNOWLEDGE);
    
          MessageConsumer queueConsumer = queueSession.createConsumer(queue);
    
          queueConsumer.setMessageListener(this);
          
          queueConnection.start();
          System.out.println("Queue Connection started");
          
        } catch (Exception e) {
          logger.error("Could not read JMS message.", e);
        }
      }
    
      public void onMessage(javax.jms.Message message) {
        ILoggingEvent event;
        try {
          if (message instanceof ObjectMessage) {
            ObjectMessage objectMessage = (ObjectMessage) message;
            event = (ILoggingEvent) objectMessage.getObject();
            Logger log = (Logger) LoggerFactory.getLogger(event.getLoggerName());
            log.callAppenders(event);
          } else {
            logger.warn("Received message is of type " + message.getJMSType()
                + ", was expecting ObjectMessage.");
          }
        } catch (JMSException jmse) {
          logger.error("Exception thrown while processing incoming message.", jmse);
        }
      }
    
      protected Object lookup(Context ctx, String name)
          throws NamingException {
        try {
          return ctx.lookup(name);
        } catch (NameNotFoundException e) {
          logger.error("Could not find name [" + name + "].");
          throw e;
        }
      }
    
      static void usage(String msg) {
        System.err.println(msg);
        System.err
            .println("Usage: java "
                + JMSQueueSink.class.getName()
                + " QueueConnectionFactoryBindingName QueueBindingName Username Password");
        System.exit(1);
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/net/SSLSocketAppender.java������0000644�0001750�0001750�00000003761�12143151241�031773� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net;
    
    import java.net.InetAddress;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.net.AbstractSSLSocketAppender;
    import ch.qos.logback.core.spi.PreSerializationTransformer;
    
    /**
     * A {@link SocketAppender} that supports SSL.
     * <p>
     * For more information on this appender, please refer to the online manual
     * at http://logback.qos.ch/manual/appenders.html#SSLSocketAppender
     * 
     * @author Carl Harris
     */
    public class SSLSocketAppender extends AbstractSSLSocketAppender<ILoggingEvent> {
    
      private final PreSerializationTransformer<ILoggingEvent> pst = 
          new LoggingEventPreSerializationTransformer();
    
      private boolean includeCallerData;
      
      public SSLSocketAppender() {
      }
    
      /**
       * Connects to remote server at <code>address</code> and <code>port</code>.
       */
      @Deprecated
      public SSLSocketAppender(String host, int port) {
        super(host, port);
      }
    
      /**
       * Connects to remote server at <code>address</code> and <code>port</code>.
       */
      @Deprecated
      public SSLSocketAppender(InetAddress address, int port) {
        super(address.getHostAddress(), port);
      }
    
      @Override
      protected void postProcessEvent(ILoggingEvent event) {
        if (includeCallerData) {
          event.getCallerData();
        }
      }
    
      public void setIncludeCallerData(boolean includeCallerData) {
        this.includeCallerData = includeCallerData;
      }
      
      public PreSerializationTransformer<ILoggingEvent> getPST() {
        return pst;
      }
       
    }
    ���������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/net/JMSQueueAppender.java�������0000644�0001750�0001750�00000014272�12136042271�031622� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net;
    
    import java.io.Serializable;
    
    import javax.jms.ObjectMessage;
    import javax.jms.Queue;
    import javax.jms.QueueConnection;
    import javax.jms.QueueConnectionFactory;
    import javax.jms.QueueSender;
    import javax.jms.QueueSession;
    import javax.jms.Session;
    import javax.naming.Context;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.AppenderBase;
    import ch.qos.logback.core.net.JMSAppenderBase;
    import ch.qos.logback.core.spi.PreSerializationTransformer;
    
    /**
     * A simple appender that publishes events to a JMS Queue. The events are
     * serialized and transmitted as JMS message type {@link
     * javax.jms.ObjectMessage}.
     * <p>
     * For more information about this appender, please refer to:
     * http://logback.qos.ch/manual/appenders.html#JMSQueueAppender
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public class JMSQueueAppender extends JMSAppenderBase<ILoggingEvent> {
    
      static int SUCCESSIVE_FAILURE_LIMIT = 3;
    
      String queueBindingName;
      String qcfBindingName;
      QueueConnection queueConnection;
      QueueSession queueSession;
      QueueSender queueSender;
    
      int successiveFailureCount = 0;
    
      private PreSerializationTransformer<ILoggingEvent> pst = new LoggingEventPreSerializationTransformer();
      
      /**
       * The <b>QueueConnectionFactoryBindingName</b> option takes a string value.
       * Its value will be used to lookup the appropriate
       * <code>QueueConnectionFactory</code> from the JNDI context.
       */
      public void setQueueConnectionFactoryBindingName(String qcfBindingName) {
        this.qcfBindingName = qcfBindingName;
      }
    
      /**
       * Returns the value of the <b>QueueConnectionFactoryBindingName</b> option.
       */
      public String getQueueConnectionFactoryBindingName() {
        return qcfBindingName;
      }
    
      /**
       * The <b>QueueBindingName</b> option takes a string value. Its value will be
       * used to lookup the appropriate <code>Queue</code> from the JNDI context.
       */
      public void setQueueBindingName(String queueBindingName) {
        this.queueBindingName = queueBindingName;
      }
    
      /**
       * Returns the value of the <b>QueueBindingName</b> option.
       */
      public String getQueueBindingName() {
        return queueBindingName;
      }
    
      /**
       * Options are activated and become effective only after calling this method.
       */
      public void start() {
        QueueConnectionFactory queueConnectionFactory;
    
        try {
          Context jndi = buildJNDIContext();
    
          // addInfo("Looking up [" + qcfBindingName + "]");
          queueConnectionFactory = (QueueConnectionFactory) lookup(jndi,
              qcfBindingName);
          // addInfo("About to create QueueConnection.");
          if (userName != null) {
            this.queueConnection = queueConnectionFactory.createQueueConnection(
                userName, password);
          } else {
            this.queueConnection = queueConnectionFactory.createQueueConnection();
          }
    
          // addInfo(
          // "Creating QueueSession, non-transactional, "
          // + "in AUTO_ACKNOWLEDGE mode.");
          this.queueSession = queueConnection.createQueueSession(false,
              Session.AUTO_ACKNOWLEDGE);
    
          // addInfo("Looking up queue name [" + queueBindingName + "].");
          Queue queue = (Queue) lookup(jndi, queueBindingName);
    
          // addInfo("Creating QueueSender.");
          this.queueSender = queueSession.createSender(queue);
    
          // addInfo("Starting QueueConnection.");
          queueConnection.start();
    
          jndi.close();
        } catch (Exception e) {
          addError("Error while activating options for appender named [" + name
              + "].", e);
        }
    
        if (this.queueConnection != null && this.queueSession != null
            && this.queueSender != null) {
          super.start();
        }
      }
    
      /**
       * Close this JMSAppender. Closing releases all resources used by the
       * appender. A closed appender cannot be re-opened.
       */
      public synchronized void stop() {
        // The synchronized modifier avoids concurrent append and close operations
        if (!this.started) {
          return;
        }
    
        this.started = false;
    
        try {
          if (queueSession != null) {
            queueSession.close();
          }
          if (queueConnection != null) {
            queueConnection.close();
          }
        } catch (Exception e) {
          addError("Error while closing JMSAppender [" + name + "].", e);
        }
    
        // Help garbage collection
        queueSender = null;
        queueSession = null;
        queueConnection = null;
      }
    
      /**
       * This method called by {@link AppenderBase#doAppend} method to do most
       * of the real appending work.
       */
      public void append(ILoggingEvent event) {
        if (!isStarted()) {
          return;
        }
    
        try {
          ObjectMessage msg = queueSession.createObjectMessage();
          Serializable so = pst.transform(event);
          msg.setObject(so);
          queueSender.send(msg);
          successiveFailureCount = 0;
        } catch (Exception e) {
          successiveFailureCount++;
          if (successiveFailureCount > SUCCESSIVE_FAILURE_LIMIT) {
            stop();
          }
          addError("Could not send message in JMSQueueAppender [" + name + "].", e);
    
        }
      }
    
      /**
       * Returns the QueueConnection used for this appender. Only valid after
       * start() method has been invoked.
       */
      protected QueueConnection getQueueConnection() {
        return queueConnection;
      }
    
      /**
       * Returns the QueueSession used for this appender. Only valid after start()
       * method has been invoked.
       */
      protected QueueSession getQueueSession() {
        return queueSession;
      }
    
      /**
       * Returns the QueueSender used for this appender. Only valid after start()
       * method has been invoked.
       */
      protected QueueSender getQueueSender() {
        return queueSender;
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/net/JMSTopicAppender.java�������0000644�0001750�0001750�00000014345�12136042271�031615� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net;
    
    import java.io.Serializable;
    
    import javax.jms.ObjectMessage;
    import javax.jms.Session;
    import javax.jms.Topic;
    import javax.jms.TopicConnection;
    import javax.jms.TopicConnectionFactory;
    import javax.jms.TopicPublisher;
    import javax.jms.TopicSession;
    import javax.naming.Context;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.AppenderBase;
    import ch.qos.logback.core.net.JMSAppenderBase;
    import ch.qos.logback.core.spi.PreSerializationTransformer;
    
    /**
     * A simple appender that publishes events to a JMS Topic. The events are
     * serialized and transmitted as JMS message type {@link
     * javax.jms.ObjectMessage}.
     * 
     * For more information about this appender, please refer to
     * http://logback.qos.ch/manual/appenders.html#JMSTopicAppender
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public class JMSTopicAppender extends JMSAppenderBase<ILoggingEvent> {
    
      static int SUCCESSIVE_FAILURE_LIMIT = 3;
    
      String topicBindingName;
      String tcfBindingName;
      TopicConnection topicConnection;
      TopicSession topicSession;
      TopicPublisher topicPublisher;
    
      int successiveFailureCount = 0;
      
      private PreSerializationTransformer<ILoggingEvent> pst = new LoggingEventPreSerializationTransformer();
      
      /**
       * The <b>TopicConnectionFactoryBindingName</b> option takes a string value.
       * Its value will be used to lookup the appropriate
       * <code>TopicConnectionFactory</code> from the JNDI context.
       */
      public void setTopicConnectionFactoryBindingName(String tcfBindingName) {
        this.tcfBindingName = tcfBindingName;
      }
    
      /**
       * Returns the value of the <b>TopicConnectionFactoryBindingName</b> option.
       */
      public String getTopicConnectionFactoryBindingName() {
        return tcfBindingName;
      }
    
      /**
       * The <b>TopicBindingName</b> option takes a string value. Its value will be
       * used to lookup the appropriate <code>Topic</code> from the JNDI context.
       */
      public void setTopicBindingName(String topicBindingName) {
        this.topicBindingName = topicBindingName;
      }
    
      /**
       * Returns the value of the <b>TopicBindingName</b> option.
       */
      public String getTopicBindingName() {
        return topicBindingName;
      }
    
      /**
       * Options are activated and become effective only after calling this method.
       */
      public void start() {
        TopicConnectionFactory topicConnectionFactory;
    
        try {
          Context jndi = buildJNDIContext();
    
          // addInfo("Looking up [" + tcfBindingName + "]");
          topicConnectionFactory = (TopicConnectionFactory) lookup(jndi,
              tcfBindingName);
          // addInfo("About to create TopicConnection.");
          if (userName != null) {
            this.topicConnection = topicConnectionFactory.createTopicConnection(
                userName, password);
          } else {
            this.topicConnection = topicConnectionFactory.createTopicConnection();
          }
    
          // addInfo(
          // "Creating TopicSession, non-transactional, "
          // + "in AUTO_ACKNOWLEDGE mode.");
          this.topicSession = topicConnection.createTopicSession(false,
              Session.AUTO_ACKNOWLEDGE);
    
          // addInfo("Looking up topic name [" + topicBindingName + "].");
          Topic topic = (Topic) lookup(jndi, topicBindingName);
    
          // addInfo("Creating TopicPublisher.");
          this.topicPublisher = topicSession.createPublisher(topic);
    
          // addInfo("Starting TopicConnection.");
          topicConnection.start();
    
          jndi.close();
        } catch (Exception e) {
          addError("Error while activating options for appender named [" + name
              + "].", e);
        }
    
        if (this.topicConnection != null && this.topicSession != null
            && this.topicPublisher != null) {
          super.start();
        }
      }
    
      /**
       * Close this JMSAppender. Closing releases all resources used by the
       * appender. A closed appender cannot be re-opened.
       */
      public synchronized void stop() {
        // The synchronized modifier avoids concurrent append and close operations
        if (!this.started) {
          return;
        }
    
        this.started = false;
    
        try {
          if (topicSession != null) {
            topicSession.close();
          }
          if (topicConnection != null) {
            topicConnection.close();
          }
        } catch (Exception e) {
          addError("Error while closing JMSAppender [" + name + "].", e);
        }
    
        // Help garbage collection
        topicPublisher = null;
        topicSession = null;
        topicConnection = null;
      }
    
    
      /**
       * This method called by {@link AppenderBase#doAppend} method to do most
       * of the real appending work.
       */
      public void append(ILoggingEvent event) {
        if (!isStarted()) {
          return;
        }
    
        try {
          ObjectMessage msg = topicSession.createObjectMessage();
          Serializable so = pst.transform(event);
          msg.setObject(so);
          topicPublisher.publish(msg);
          successiveFailureCount = 0;
        } catch (Exception e) {
          successiveFailureCount++;
          if (successiveFailureCount > SUCCESSIVE_FAILURE_LIMIT) {
            stop();
          }
          addError("Could not publish message in JMSTopicAppender [" + name + "].", e);
        }
      }
    
      /**
       * Returns the TopicConnection used for this appender. Only valid after
       * start() method has been invoked.
       */
      protected TopicConnection getTopicConnection() {
        return topicConnection;
      }
    
      /**
       * Returns the TopicSession used for this appender. Only valid after start()
       * method has been invoked.
       */
      protected TopicSession getTopicSession() {
        return topicSession;
      }
    
      /**
       * Returns the TopicPublisher used for this appender. Only valid after start()
       * method has been invoked.
       */
      protected TopicPublisher getTopicPublisher() {
        return topicPublisher;
      }
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/helpers/������������������������0000755�0001750�0001750�00000000000�12203357067�026517� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/helpers/package.html������������0000644�0001750�0001750�00000000254�11377016712�031001� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
    
    <html> 
      <head>
        <title></title>
      </head>
      
      <body>
        
        <p>Contains helpers.</p>
    
      </body> 
    </html>����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000153�00000000000�011564� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/helpers/MDCInsertingServletFilter.java����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/helpers/MDCInsertingServletFilte0000644�0001750�0001750�00000005652�12136042271�033262� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.helpers;
    
    import java.io.IOException;
    
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    
    import org.slf4j.MDC;
    
    import ch.qos.logback.classic.ClassicConstants;
    
    /**
     * A servlet filter that inserts various values retrieved from the incoming http
     * request into the MDC.
     * <p/>
     * <p/>
     * The values are removed after the request is processed.
     *
     * @author Ceki G&uuml;lc&uuml;
     */
    public class MDCInsertingServletFilter implements Filter {
    
      public void destroy() {
        // do nothing
      }
    
      public void doFilter(ServletRequest request, ServletResponse response,
                           FilterChain chain) throws IOException, ServletException {
    
    
        insertIntoMDC(request);
        try {
          chain.doFilter(request, response);
        } finally {
          clearMDC();
        }
      }
    
      void insertIntoMDC(ServletRequest request) {
    
        MDC.put(ClassicConstants.REQUEST_REMOTE_HOST_MDC_KEY, request
                .getRemoteHost());
    
        if (request instanceof HttpServletRequest) {
          HttpServletRequest httpServletRequest = (HttpServletRequest) request;
          MDC.put(ClassicConstants.REQUEST_REQUEST_URI, httpServletRequest
                  .getRequestURI());
          StringBuffer requestURL = httpServletRequest.getRequestURL();
          if (requestURL != null) {
            MDC.put(ClassicConstants.REQUEST_REQUEST_URL, requestURL.toString());
          }
          MDC.put(ClassicConstants.REQUEST_QUERY_STRING, httpServletRequest.getQueryString());
          MDC.put(ClassicConstants.REQUEST_USER_AGENT_MDC_KEY, httpServletRequest
                  .getHeader("User-Agent"));
          MDC.put(ClassicConstants.REQUEST_X_FORWARDED_FOR, httpServletRequest
                  .getHeader("X-Forwarded-For"));
        }
    
      }
    
      void clearMDC() {
        MDC.remove(ClassicConstants.REQUEST_REMOTE_HOST_MDC_KEY);
        MDC.remove(ClassicConstants.REQUEST_REQUEST_URI);
        MDC.remove(ClassicConstants.REQUEST_QUERY_STRING);
        // removing possibly inexistent item is OK
        MDC.remove(ClassicConstants.REQUEST_REQUEST_URL);
        MDC.remove(ClassicConstants.REQUEST_USER_AGENT_MDC_KEY);
        MDC.remove(ClassicConstants.REQUEST_X_FORWARDED_FOR);
      }
    
      public void init(FilterConfig arg0) throws ServletException {
        // do nothing
      }
    }
    ��������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/PatternLayout.java��������������0000644�0001750�0001750�00000017703�12136042271�030534� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic;
    
    import java.util.HashMap;
    import java.util.Map;
    
    import ch.qos.logback.classic.pattern.CallerDataConverter;
    import ch.qos.logback.classic.pattern.ClassOfCallerConverter;
    import ch.qos.logback.classic.pattern.ContextNameConverter;
    import ch.qos.logback.classic.pattern.PropertyConverter;
    import ch.qos.logback.classic.pattern.DateConverter;
    import ch.qos.logback.classic.pattern.EnsureExceptionHandling;
    import ch.qos.logback.classic.pattern.ExtendedThrowableProxyConverter;
    import ch.qos.logback.classic.pattern.FileOfCallerConverter;
    import ch.qos.logback.classic.pattern.LevelConverter;
    import ch.qos.logback.classic.pattern.LineOfCallerConverter;
    import ch.qos.logback.classic.pattern.LineSeparatorConverter;
    import ch.qos.logback.classic.pattern.LoggerConverter;
    import ch.qos.logback.classic.pattern.MDCConverter;
    import ch.qos.logback.classic.pattern.MarkerConverter;
    import ch.qos.logback.classic.pattern.MessageConverter;
    import ch.qos.logback.classic.pattern.MethodOfCallerConverter;
    import ch.qos.logback.classic.pattern.NopThrowableInformationConverter;
    import ch.qos.logback.classic.pattern.RelativeTimeConverter;
    import ch.qos.logback.classic.pattern.RootCauseFirstThrowableProxyConverter;
    import ch.qos.logback.classic.pattern.ThreadConverter;
    import ch.qos.logback.classic.pattern.ThrowableProxyConverter;
    import ch.qos.logback.classic.pattern.color.HighlightingCompositeConverter;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.pattern.PatternLayoutBase;
    import ch.qos.logback.core.pattern.color.*;
    import ch.qos.logback.core.pattern.parser.Parser;
    
    /**
     * <p>
     * A flexible layout configurable with pattern string. The goal of this class is
     * to {@link #format format} a {@link ILoggingEvent} and return the results in a
     * {#link String}. The format of the result depends on the
     * <em>conversion pattern</em>.
     * <p>
     * For more information about this layout, please refer to the online manual at
     * http://logback.qos.ch/manual/layouts.html#PatternLayout
     * 
     */
    
    public class PatternLayout extends PatternLayoutBase<ILoggingEvent> {
    
      public static final Map<String, String> defaultConverterMap = new HashMap<String, String>();
      public static final String HEADER_PREFIX = "#logback.classic pattern: ";
      
      static {
        defaultConverterMap.putAll(Parser.DEFAULT_COMPOSITE_CONVERTER_MAP);
    
        defaultConverterMap.put("d", DateConverter.class.getName());
        defaultConverterMap.put("date", DateConverter.class.getName());
    
        defaultConverterMap.put("r", RelativeTimeConverter.class.getName());
        defaultConverterMap.put("relative", RelativeTimeConverter.class.getName());
    
        defaultConverterMap.put("level", LevelConverter.class.getName());
        defaultConverterMap.put("le", LevelConverter.class.getName());
        defaultConverterMap.put("p", LevelConverter.class.getName());
    
        defaultConverterMap.put("t", ThreadConverter.class.getName());
        defaultConverterMap.put("thread", ThreadConverter.class.getName());
    
        defaultConverterMap.put("lo", LoggerConverter.class.getName());
        defaultConverterMap.put("logger", LoggerConverter.class.getName());
        defaultConverterMap.put("c", LoggerConverter.class.getName());
    
        defaultConverterMap.put("m", MessageConverter.class.getName());
        defaultConverterMap.put("msg", MessageConverter.class.getName());
        defaultConverterMap.put("message", MessageConverter.class.getName());
    
        defaultConverterMap.put("C", ClassOfCallerConverter.class.getName());
        defaultConverterMap.put("class", ClassOfCallerConverter.class.getName());
    
        defaultConverterMap.put("M", MethodOfCallerConverter.class.getName());
        defaultConverterMap.put("method", MethodOfCallerConverter.class.getName());
    
        defaultConverterMap.put("L", LineOfCallerConverter.class.getName());
        defaultConverterMap.put("line", LineOfCallerConverter.class.getName());
    
        defaultConverterMap.put("F", FileOfCallerConverter.class.getName());
        defaultConverterMap.put("file", FileOfCallerConverter.class.getName());
    
        defaultConverterMap.put("X", MDCConverter.class.getName());
        defaultConverterMap.put("mdc", MDCConverter.class.getName());
    
        defaultConverterMap.put("ex", ThrowableProxyConverter.class.getName());
        defaultConverterMap.put("exception", ThrowableProxyConverter.class
            .getName());
        defaultConverterMap.put("rEx", RootCauseFirstThrowableProxyConverter.class.getName());
        defaultConverterMap.put("rootException", RootCauseFirstThrowableProxyConverter.class
            .getName());
        defaultConverterMap.put("throwable", ThrowableProxyConverter.class
            .getName());
    
        defaultConverterMap.put("xEx", ExtendedThrowableProxyConverter.class.getName());
        defaultConverterMap.put("xException", ExtendedThrowableProxyConverter.class
            .getName());
        defaultConverterMap.put("xThrowable", ExtendedThrowableProxyConverter.class
            .getName());
    
        defaultConverterMap.put("nopex", NopThrowableInformationConverter.class
            .getName());
        defaultConverterMap.put("nopexception",
            NopThrowableInformationConverter.class.getName());
    
        defaultConverterMap.put("cn", ContextNameConverter.class.getName());
        defaultConverterMap.put("contextName", ContextNameConverter.class.getName());
        
        defaultConverterMap.put("caller", CallerDataConverter.class.getName());
    
        defaultConverterMap.put("marker", MarkerConverter.class.getName());
    
        defaultConverterMap.put("property", PropertyConverter.class.getName());
    
        defaultConverterMap.put("n", LineSeparatorConverter.class.getName());
    
        defaultConverterMap.put("black", BlackCompositeConverter.class.getName());
        defaultConverterMap.put("red", RedCompositeConverter.class.getName());
        defaultConverterMap.put("green", GreenCompositeConverter.class.getName());
        defaultConverterMap.put("yellow", YellowCompositeConverter.class.getName());
        defaultConverterMap.put("blue", BlueCompositeConverter.class.getName());
        defaultConverterMap.put("magenta", MagentaCompositeConverter.class.getName());
        defaultConverterMap.put("cyan", CyanCompositeConverter.class.getName());
        defaultConverterMap.put("white", WhiteCompositeConverter.class.getName());
        defaultConverterMap.put("gray", GrayCompositeConverter.class.getName());
        defaultConverterMap.put("boldRed", BoldRedCompositeConverter.class.getName());
        defaultConverterMap.put("boldGreen", BoldGreenCompositeConverter.class.getName());
        defaultConverterMap.put("boldYellow", BoldYellowCompositeConverter.class.getName());
        defaultConverterMap.put("boldBlue", BoldBlueCompositeConverter.class.getName());
        defaultConverterMap.put("boldMagenta", BoldMagentaCompositeConverter.class.getName());
        defaultConverterMap.put("boldCyan", BoldCyanCompositeConverter.class.getName());
        defaultConverterMap.put("boldWhite", BoldWhiteCompositeConverter.class.getName());
        defaultConverterMap.put("highlight", HighlightingCompositeConverter.class.getName());
    
    
    
      }
    
      public PatternLayout() {
        this.postCompileProcessor = new EnsureExceptionHandling();
      }
    
      public Map<String, String> getDefaultConverterMap() {
        return defaultConverterMap;
      }
    
      public String doLayout(ILoggingEvent event) {
        if (!isStarted()) {
          return CoreConstants.EMPTY_STRING;
        }
        return writeLoopOnConverters(event);
      }
    
      @Override
      protected String getPresentationHeaderPrefix() {
        return HEADER_PREFIX;
      }
    }
    �������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/selector/�����������������������0000755�0001750�0001750�00000000000�12203357067�026675� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/selector/servlet/���������������0000755�0001750�0001750�00000000000�12203357067�030361� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000156�00000000000�011567� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/selector/servlet/ContextDetachingSCL.java�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/selector/servlet/ContextDetachin0000644�0001750�0001750�00000004433�12136231000�033353� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.selector.servlet;
    
    import static ch.qos.logback.classic.ClassicConstants.JNDI_CONTEXT_NAME;
    
    import javax.naming.Context;
    import javax.naming.NamingException;
    import javax.servlet.ServletContextEvent;
    import javax.servlet.ServletContextListener;
    
    import org.slf4j.Logger;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.selector.ContextSelector;
    import ch.qos.logback.classic.util.ContextSelectorStaticBinder;
    import ch.qos.logback.classic.util.JNDIUtil;
    
    public class ContextDetachingSCL implements ServletContextListener {
    
      public void contextDestroyed(ServletContextEvent servletContextEvent) {
        String loggerContextName = null;
        
        try {
          Context ctx = JNDIUtil.getInitialContext();
          loggerContextName = (String) JNDIUtil.lookup(ctx, JNDI_CONTEXT_NAME);
        } catch (NamingException ne) {
        }
        
        if (loggerContextName != null) {
          System.out.println("About to detach context named " + loggerContextName);
          
          ContextSelector selector = ContextSelectorStaticBinder.getSingleton().getContextSelector();
          if(selector == null) {
            System.out.println("Selector is null, cannot detach context. Skipping.");
            return;
          }
          LoggerContext context = selector.detachLoggerContext(loggerContextName);
          if (context != null) {
            Logger logger = context.getLogger(Logger.ROOT_LOGGER_NAME);
            logger.warn("Stopping logger context " + loggerContextName);
            // when the web-app is destroyed, its logger context should be stopped
            context.stop();
          } else {
            System.out.println("No context named " + loggerContextName + " was found.");
          }
        }
      }
    
      public void contextInitialized(ServletContextEvent arg0) {
        // do nothing
      }
    
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000156�00000000000�011567� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/selector/servlet/LoggerContextFilter.java�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/selector/servlet/LoggerContextFi0000644�0001750�0001750�00000004670�12136042271�033347� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.selector.servlet;
    
    import java.io.IOException;
    
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    
    import org.slf4j.LoggerFactory;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.selector.ContextJNDISelector;
    import ch.qos.logback.classic.selector.ContextSelector;
    import ch.qos.logback.classic.util.ContextSelectorStaticBinder;
    
    /**
     * A servlet filter that puts the environment dependent LoggerContext in a
     * ThreadLocal variable, removing it after the request is processed.
     * 
     * <p>To use it, add the following lines to a web.xml file
     *  
     * <filter>
     *   <filter-name>LoggerContextFilter</filter-name>
     *   <filter-class>
     *     ch.qos.logback.classic.selector.servlet.LoggerContextFilter
     *   </filter-class>
     * </filter>
     * <filter-mapping>
     *   <filter-name>LoggerContextFilter</filter-name>
     *   <url-pattern>/*</url-pattern>
     * </filter-mapping>
     * 
     * @author S&eacute;bastien Pennec
     */
    public class LoggerContextFilter implements Filter {
    
      public void destroy() {
        //do nothing
      }
    
      public void doFilter(ServletRequest request, ServletResponse response,
          FilterChain chain) throws IOException, ServletException {
    
        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
        ContextSelector selector = ContextSelectorStaticBinder.getSingleton().getContextSelector();
        ContextJNDISelector sel = null;
    
        if (selector instanceof ContextJNDISelector) {
          sel = (ContextJNDISelector)selector;
          sel.setLocalContext(lc);
        }
    
        try {
          chain.doFilter(request, response);
        } finally {
          if (sel != null) {
            sel.removeLocalContext();
          }
        }
      }
    
      public void init(FilterConfig arg0) throws ServletException {
        //do nothing
      }
    }
    ������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000146�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/selector/ContextJNDISelector.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/selector/ContextJNDISelector.jav0000644�0001750�0001750�00000015114�12136042271�033164� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.selector;
    
    import static ch.qos.logback.classic.ClassicConstants.JNDI_CONFIGURATION_RESOURCE;
    import static ch.qos.logback.classic.ClassicConstants.JNDI_CONTEXT_NAME;
    
    import java.net.URL;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import javax.naming.Context;
    import javax.naming.NamingException;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.classic.util.ContextInitializer;
    import ch.qos.logback.classic.util.JNDIUtil;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.status.InfoStatus;
    import ch.qos.logback.core.status.StatusManager;
    import ch.qos.logback.core.status.StatusUtil;
    import ch.qos.logback.core.status.WarnStatus;
    import ch.qos.logback.core.util.Loader;
    import ch.qos.logback.core.util.StatusPrinter;
    
    /**
     * A class that allows the LoggerFactory to access an environment-based
     * LoggerContext.
     * <p/>
     * To add in catalina.sh
     * <p/>
     * JAVA_OPTS="$JAVA_OPTS "-Dlogback.ContextSelector=JNDI""
     *
     * @author Ceki G&uuml;lc&uuml;
     * @author S&eacute;bastien Pennec
     */
    public class ContextJNDISelector implements ContextSelector {
    
      private final Map<String, LoggerContext> synchronizedContextMap;
      private final LoggerContext defaultContext;
    
      private static final ThreadLocal<LoggerContext> threadLocal = new ThreadLocal<LoggerContext>();
    
      public ContextJNDISelector(LoggerContext context) {
        synchronizedContextMap = Collections
                .synchronizedMap(new HashMap<String, LoggerContext>());
        defaultContext = context;
      }
    
      public LoggerContext getDefaultLoggerContext() {
        return defaultContext;
      }
    
      public LoggerContext detachLoggerContext(String loggerContextName) {
        return synchronizedContextMap.remove(loggerContextName);
      }
    
      public LoggerContext getLoggerContext() {
        String contextName = null;
        Context ctx = null;
    
        // First check if ThreadLocal has been set already
        LoggerContext lc = threadLocal.get();
        if (lc != null) {
          return lc;
        }
    
        try {
          // We first try to find the name of our
          // environment's LoggerContext
          ctx = JNDIUtil.getInitialContext();
          contextName = (String) JNDIUtil.lookup(ctx, JNDI_CONTEXT_NAME);
        } catch (NamingException ne) {
          // We can't log here
        }
    
        if (contextName == null) {
          // We return the default context
          return defaultContext;
        } else {
          // Let's see if we already know such a context
          LoggerContext loggerContext = synchronizedContextMap.get(contextName);
    
          if (loggerContext == null) {
            // We have to create a new LoggerContext
            loggerContext = new LoggerContext();
            loggerContext.setName(contextName);
            synchronizedContextMap.put(contextName, loggerContext);
            URL url = findConfigFileURL(ctx, loggerContext);
            if (url != null) {
              configureLoggerContextByURL(loggerContext, url);
            } else {
              try {
                new ContextInitializer(loggerContext).autoConfig();
              } catch (JoranException je) {
              }
            }
            // logback-292
            if (!StatusUtil.contextHasStatusListener(loggerContext))
              StatusPrinter.printInCaseOfErrorsOrWarnings(loggerContext);
          }
          return loggerContext;
        }
      }
    
      private String conventionalConfigFileName(String contextName) {
        return "logback-" + contextName + ".xml";
      }
    
      private URL findConfigFileURL(Context ctx, LoggerContext loggerContext) {
        StatusManager sm = loggerContext.getStatusManager();
    
        String jndiEntryForConfigResource = JNDIUtil.lookup(ctx,
                JNDI_CONFIGURATION_RESOURCE);
        // Do we have a dedicated configuration file?
        if (jndiEntryForConfigResource != null) {
          sm.add(new InfoStatus("Searching for [" + jndiEntryForConfigResource
                  + "]", this));
          URL url = urlByResourceName(sm, jndiEntryForConfigResource);
          if (url == null) {
            String msg = "The jndi resource [" + jndiEntryForConfigResource
                    + "] for context [" + loggerContext.getName()
                    + "] does not lead to a valid file";
            sm.add(new WarnStatus(msg, this));
          }
          return url;
        } else {
          String resourceByConvention = conventionalConfigFileName(loggerContext
                  .getName());
          return urlByResourceName(sm, resourceByConvention);
        }
      }
    
      private URL urlByResourceName(StatusManager sm, String resourceName) {
        sm.add(new InfoStatus("Searching for [" + resourceName + "]",
                this));
        URL url = Loader.getResource(resourceName, Loader.getTCL());
        if (url != null) {
          return url;
        }
        return Loader.getResourceBySelfClassLoader(resourceName);
      }
    
      private void configureLoggerContextByURL(LoggerContext context, URL url) {
        try {
          JoranConfigurator configurator = new JoranConfigurator();
          context.reset();
          configurator.setContext(context);
          configurator.doConfigure(url);
        } catch (JoranException e) {
        }
        StatusPrinter.printInCaseOfErrorsOrWarnings(context);
      }
    
      public List<String> getContextNames() {
        List<String> list = new ArrayList<String>();
        list.addAll(synchronizedContextMap.keySet());
        return list;
      }
    
      public LoggerContext getLoggerContext(String name) {
        return synchronizedContextMap.get(name);
      }
    
      /**
       * Returns the number of managed contexts Used for testing purposes
       *
       * @return the number of managed contexts
       */
      public int getCount() {
        return synchronizedContextMap.size();
      }
    
      /**
       * These methods are used by the LoggerContextFilter.
       * <p/>
       * They provide a way to tell the selector which context to use, thus saving
       * the cost of a JNDI call at each new request.
       *
       * @param context
       */
      public void setLocalContext(LoggerContext context) {
        threadLocal.set(context);
      }
    
      public void removeLocalContext() {
        threadLocal.remove();
      }
    
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/selector/ContextSelector.java���0000644�0001750�0001750�00000002155�12136042271�032661� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.selector;
    
    import java.util.List;
    
    import ch.qos.logback.classic.LoggerContext;
    
    /**
     * An interface that provides access to different contexts.
     * 
     * It is used by the LoggerFactory to access the context
     * it will use to retrieve loggers.
     *
     * @author Ceki G&uuml;lc&uuml;
     * @author S&eacute;bastien Pennec
     */
    public interface ContextSelector {
    
      LoggerContext getLoggerContext();
      
      LoggerContext getLoggerContext(String name);
      
      LoggerContext getDefaultLoggerContext();
      
      LoggerContext detachLoggerContext(String loggerContextName);
      
      List<String> getContextNames();
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000151�00000000000�011562� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/selector/DefaultContextSelector.java������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/main/java/ch/qos/logback/classic/selector/DefaultContextSelector.0000644�0001750�0001750�00000002671�12136042271�033327� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.selector;
    
    import java.util.Arrays;
    import java.util.List;
    
    import ch.qos.logback.classic.LoggerContext;
    
    public class DefaultContextSelector implements ContextSelector {
    
      private LoggerContext defaultLoggerContext;
      
      public DefaultContextSelector(LoggerContext context) {
        this.defaultLoggerContext = context;
      }
      
      public LoggerContext getLoggerContext() {
        return getDefaultLoggerContext();
      }
    
      public LoggerContext getDefaultLoggerContext() {
        return defaultLoggerContext;
      }
    
      public LoggerContext detachLoggerContext(String loggerContextName) {
        return defaultLoggerContext;
      }
      
      public List<String> getContextNames() {
        return Arrays.asList(defaultLoggerContext.getName());
      }
      
      public LoggerContext getLoggerContext(String name) {
        if (defaultLoggerContext.getName().equals(name)) {
          return defaultLoggerContext;
        } else {
          return null;
        }
      }
    }
    �����������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/������������������������������������������������������������0000755�0001750�0001750�00000000000�12203357067�017750� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/allInOneSafeMode.sh�����������������������������������������0000644�0001750�0001750�00000002162�11377016712�023412� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Use this script both generate and check the results.  It only works
    # if there is only one instance of this script
    
    if [ $# -lt 3 ]
    then 
      echo "Usage: allInOneSafeMode.sh filename runLen stamp0 ... stampN"
      exit 1;
    fi
    
    echo "File name $1"
    echo "run length $2"
    
    
    
    
    #On windows
    #CLASSPATH="${CLASSPATH}\;./target/classes/"
    #CLASSPATH="${CLASSPATH}\;./target/test-classes/"
    #CLASSPATH="${CLASSPATH}\;../logback-core/target/classes"
    #LASSPATH="${CLASSPATH}\;../logback-examples/lib/slf4j-api-1.5.10.jar"
    echo $CLASSPATH
    
    # On Unix
    #CLASSPATH="${CLASSPATH}:./target/classes/"
    #CLASSPATH="${CLASSPATH}:./target/test-classes/"
    #CLASSPATH="${CLASSPATH}:../logback-core/target/classes"
    #CLASSPATH="${CLASSPATH}:../logback-examples/lib/slf4j-api-1.5.10.jar"
    
    if [ -f $1 ]
    then
     echo Removing $1 before tests
     rm $1;
    fi
    
    
    
    FILENAME=$1
    LEN=$2
    
    shift 2
    
    for stamp in $@
    do 
      echo running safe mode with $stamp
      java ch.qos.logback.classic.multiJVM.SafeModeFileAppender $stamp $LEN $FILENAME &
    done
    
    wait
    
    echo Checking results...
    java ch.qos.logback.classic.multiJVM.Checker $LEN $FILENAME $*
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/groovy/�����������������������������������������������������0000755�0001750�0001750�00000000000�12136042143�021264� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/groovy/ch/��������������������������������������������������0000755�0001750�0001750�00000000000�11506604156�021666� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/groovy/ch/qos/����������������������������������������������0000755�0001750�0001750�00000000000�11506604156�022470� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/groovy/ch/qos/logback/��������������������������������������0000755�0001750�0001750�00000000000�11506604156�024072� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/groovy/ch/qos/logback/classic/������������������������������0000755�0001750�0001750�00000000000�12136177166�025521� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/groovy/ch/qos/logback/classic/gaffer/�����������������������0000755�0001750�0001750�00000000000�12203357067�026746� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/groovy/ch/qos/logback/classic/gaffer/PropertyUtilTest.groovy0000644�0001750�0001750�00000001670�12136042143�033532� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.gaffer
    
    import org.junit.Test
    import static junit.framework.Assert.assertEquals
    
    /**
     * @author Ceki G&uuml;c&uuml;
     */
    class PropertyUtilTest {
    
    
      @Test
      void empty() {
        assertEquals("", PropertyUtil.upperCaseFirstLetter(""));
        assertEquals(null, PropertyUtil.upperCaseFirstLetter(null));
      }
    
    
    
      @Test
      void smoke() {
        assertEquals("Hello", PropertyUtil.upperCaseFirstLetter("hello"));
      }
    
    
    }
    ������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000156�00000000000�011567� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/groovy/ch/qos/logback/classic/gaffer/ConfigurationDelegateTest.groovy�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/groovy/ch/qos/logback/classic/gaffer/ConfigurationDelegateTe0000644�0001750�0001750�00000024330�12136042143�033415� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.gaffer
    
    import ch.qos.logback.classic.LoggerContext
    import org.junit.Before
    import org.junit.Test
    
    import javax.management.InstanceNotFoundException
    import javax.management.ObjectName
    import java.lang.management.ManagementFactory
    
    import static org.junit.Assert.*
    import ch.qos.logback.core.status.StatusChecker
    import ch.qos.logback.classic.turbo.TurboFilter
    import ch.qos.logback.classic.turbo.ReconfigureOnChangeFilter
    import ch.qos.logback.classic.Level
    import ch.qos.logback.core.testUtil.RandomUtil
    import ch.qos.logback.classic.Logger
    import ch.qos.logback.core.Appender
    import ch.qos.logback.core.helpers.NOPAppender
    import ch.qos.logback.core.ConsoleAppender
    import ch.qos.logback.core.encoder.LayoutWrappingEncoder
    import ch.qos.logback.classic.PatternLayout
    import ch.qos.logback.core.util.StatusPrinter
    import ch.qos.logback.classic.net.SMTPAppender
    import ch.qos.logback.core.rolling.RollingFileAppender
    import ch.qos.logback.core.rolling.TimeBasedRollingPolicy
    import ch.qos.logback.classic.encoder.PatternLayoutEncoder
    import ch.qos.logback.core.util.CoreTestConstants
    import ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP
    import ch.qos.logback.core.joran.action.TimestampAction
    
    /**
     * @author Ceki G&uuml;c&uuml;
     */
    class ConfigurationDelegateTest {
    
      LoggerContext context = new LoggerContext()
      ConfigurationDelegate configurationDelegate = new ConfigurationDelegate();
      StatusChecker statusChecker = new StatusChecker(context)
      int diff = RandomUtil.getPositiveInt();
    
      String randomOutputDir = CoreTestConstants.OUTPUT_DIR_PREFIX + diff + "/";
    
      @Before
      void setUp() {
        context.name = "ConfigurationDelegateTest"
        configurationDelegate.context = context;
      }
    
      @Test
      void contextAwareMixin() {
        configurationDelegate.addInfo("smoke")
        assertTrue(statusChecker.containsMatch("smoke"))
      }
    
      @Test
      void scan() {
        configurationDelegate.scan("10seconds")
        assertTrue(statusChecker.containsMatch("Setting ReconfigureOnChangeFilter"))
        assertTrue(statusChecker.containsMatch("Adding ReconfigureOnChangeFilter as a turbo filter"))
    
        TurboFilter filter = context.turboFilterList[0]
        assertTrue(filter instanceof ReconfigureOnChangeFilter)
        ReconfigureOnChangeFilter rocf = (ReconfigureOnChangeFilter) filter;
        assertEquals(10 * 1000, rocf.refreshPeriod)
      }
    
      @Test
      void timestamp() {
        String result = configurationDelegate.timestamp("yyyy")
        long year = Calendar.getInstance().get(Calendar.YEAR);
        assertEquals(year.toString(), result)
      }
    
      @Test
      void timestampWithContextBirthAsReference() {
        String result = configurationDelegate.timestamp("yyyy", context.birthTime)
        long year = Calendar.getInstance().get(Calendar.YEAR);
        assertEquals(year.toString(), result)
      }
    
    
      @Test
      void loggerWithoutName() {
        configurationDelegate.logger("", Level.DEBUG)
        assertTrue(statusChecker.containsMatch("No name attribute for logger"))
      }
    
      @Test
      void loggerSetLevel() {
        configurationDelegate.logger("setLevel" + diff, Level.INFO)
        Logger smokeLogger = context.getLogger("setLevel" + diff);
        assertEquals(Level.INFO, smokeLogger.level)
      }
    
    
      @Test
      void loggerAppenderRef() {
        Appender fooAppender = new NOPAppender();
        fooAppender.name = "FOO"
        configurationDelegate.appenderList = [fooAppender]
        configurationDelegate.logger("test" + diff, Level.INFO, ["FOO"])
        Logger logger = context.getLogger("test" + diff);
        assertEquals(Level.INFO, logger.level)
        assertEquals(fooAppender, logger.getAppender("FOO"))
      }
    
      @Test
      void loggerAdditivity() {
        Appender fooAppender = new NOPAppender();
        fooAppender.name = "FOO"
        configurationDelegate.appenderList = [fooAppender]
        configurationDelegate.logger("test" + diff, Level.INFO, ["FOO"], false)
        Logger logger = context.getLogger("test" + diff);
        assertEquals(Level.INFO, logger.level)
        assertEquals(fooAppender, logger.getAppender("FOO"))
        assertEquals(false, logger.additive)
      }
    
      @Test
      void loggerAdditivittWithEmptyList() {
        configurationDelegate.logger("test" + diff, Level.INFO, [], false)
        Logger logger = context.getLogger("test" + diff);
        assertEquals(Level.INFO, logger.level)
        assertEquals(null, logger.getAppender("FOO"))
        assertEquals(false, logger.additive)
      }
    
      @Test
      void root_LEVEL() {
        configurationDelegate.root(Level.ERROR)
        Logger root = context.getLogger(Logger.ROOT_LOGGER_NAME);
        assertEquals(Level.ERROR, root.level)
        assertEquals(null, root.getAppender("FOO"))
      }
    
      @Test
      void root_WithList() {
        Appender fooAppender = new NOPAppender();
        fooAppender.name = "FOO"
        configurationDelegate.appenderList = [fooAppender]
        configurationDelegate.root(Level.WARN, ["FOO"])
        Logger root = context.getLogger(Logger.ROOT_LOGGER_NAME);
        assertEquals(Level.WARN, root.level)
        assertEquals(fooAppender, root.getAppender("FOO"))
      }
    
      @Test
      void appender0() {
        configurationDelegate.appender("A", NOPAppender);
        Appender back = configurationDelegate.appenderList.find {it.name = "A"}
        assertNotNull(back)
        assertEquals("A", back.name)
      }
    
      @Test
      void appender1() {
        configurationDelegate.appender("C", ConsoleAppender) {
          target = "System.err"
        }
        Appender back = configurationDelegate.appenderList.find {it.name = "C"}
        assertNotNull(back)
        assertEquals("C", back.name)
        assertEquals("System.err", back.target)
      }
    
    
      @Test
      void appenderWithEncoder() {
        configurationDelegate.appender("C", ConsoleAppender) {
          encoder(LayoutWrappingEncoder) {
            layout(PatternLayout) {
              pattern = "%m%n"
            }
          }
        }
        Appender back = configurationDelegate.appenderList.find {it.name = "C"}
        assertNotNull(back)
        assertEquals("C", back.name)
        ConsoleAppender ca = back
        assertNotNull(ca.encoder)
        assertNotNull(ca.encoder.layout)
        PatternLayout layout = ca.encoder.layout
        assertEquals("%m%n", layout.pattern)
    
      }
    
      @Test
      void appenderSMTP() {
        configurationDelegate.appender("SMTP", SMTPAppender) {
          to = "a"
          to = "b"
          layout(PatternLayout) {
            pattern = "%m%n"
          }
        }
        //StatusPrinter.print context
        Appender back = configurationDelegate.appenderList.find {it.name = "SMTP"}
        assertNotNull(back)
        assertEquals("SMTP", back.name)
        SMTPAppender sa = back
        PatternLayout layout = sa.layout
        assertEquals("%m%n", layout.pattern)
    
        assertEquals(["a%nopex", "b%nopex"], sa.getToAsListOfString().sort());
      }
    
      // test parent injection
    
      @Test
      void appenderRolling() {
    
        String logFile = randomOutputDir + "log.txt";
    
        configurationDelegate.appender("ROLLING", RollingFileAppender) {
          file = logFile
          rollingPolicy(TimeBasedRollingPolicy) {
            fileNamePattern = randomOutputDir + "log.%d{yyyy-MM}.log.zip"
          }
          encoder(PatternLayoutEncoder) {
            pattern = '%msg%n'
          }
        }
        // StatusPrinter.print context
        RollingFileAppender back = configurationDelegate.appenderList.find {it.name = "ROLLING"}
        assertNotNull(back)
        assertEquals(logFile, back.rollingPolicy.getParentsRawFileProperty())
      }
    
    
      // See LBCLASSIC-231
      @Test
      void withSizeAndTimeBasedFNATP() {
        String logFile = randomOutputDir + "log.txt";
        configurationDelegate.appender("ROLLING", RollingFileAppender) {
          file = logFile
          rollingPolicy(TimeBasedRollingPolicy) {
            fileNamePattern = "mylog-%d{yyyy-MM-dd}.%i.txt"
            timeBasedFileNamingAndTriggeringPolicy(SizeAndTimeBasedFNATP) {
              maxFileSize = "100MB"
            }
          }
          encoder(PatternLayoutEncoder) {
            pattern = "%msg%n"
          }
        }
        RollingFileAppender back = configurationDelegate.appenderList.find {it.name = "ROLLING"}
        assertNotNull(back)
        assertEquals(logFile, back.rollingPolicy.getParentsRawFileProperty())
        assertTrue(back.rollingPolicy.timeBasedFileNamingAndTriggeringPolicy.isStarted())
      }
    
      @Test
      void jmxConfiguratorWithDefaults() {
        ObjectName name = new ObjectName(
                "ch.qos.logback.classic:Name=ConfigurationDelegateTest,Type=ch.qos.logback.classic.jmx.JMXConfigurator")
        try {
           ManagementFactory.platformMBeanServer.getObjectInstance(name)
           fail("Should not have found JMXConfigurator MBean")
        } catch (InstanceNotFoundException expected) {
        }
        configurationDelegate.jmxConfigurator()
        def mbean = ManagementFactory.platformMBeanServer.getObjectInstance(name)
        assertNotNull(mbean)
      }
    
        @Test
        void jmxConfiguratorWithNonDefaultContextName() {
            ObjectName name = new ObjectName(
                    "ch.qos.logback.classic:Name=CustomName,Type=ch.qos.logback.classic.jmx.JMXConfigurator")
            try {
                ManagementFactory.platformMBeanServer.getObjectInstance(name)
                fail("Should not have found JMXConfigurator MBean")
            } catch (InstanceNotFoundException expected) {
            }
            configurationDelegate.jmxConfigurator("CustomName")
            def mbean = ManagementFactory.platformMBeanServer.getObjectInstance(name)
            assertNotNull(mbean)
        }
    
        @Test
        void jmxConfiguratorWithNonDefaultObjectName() {
            ObjectName name = new ObjectName("customDomain:Name=JMX")
            try {
                ManagementFactory.platformMBeanServer.getObjectInstance(name)
                fail("Should not have found JMXConfigurator MBean")
            } catch (InstanceNotFoundException expected) {
            }
            configurationDelegate.jmxConfigurator("customDomain:Name=JMX")
            def mbean = ManagementFactory.platformMBeanServer.getObjectInstance(name)
            assertNotNull(mbean)
        }
    
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000153�00000000000�011564� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/groovy/ch/qos/logback/classic/gaffer/GafferConfiguratorTest.groovy����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/groovy/ch/qos/logback/classic/gaffer/GafferConfiguratorTest.0000644�0001750�0001750�00000013211�12136042271�033353� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.gaffer
    
    import ch.qos.logback.classic.ClassicTestConstants
    import ch.qos.logback.classic.LoggerContext
    import org.junit.Before
    import ch.qos.logback.core.testUtil.RandomUtil
    import org.junit.Ignore
    import org.junit.Test
    import ch.qos.logback.classic.Logger
    import ch.qos.logback.classic.Level
    import static junit.framework.Assert.assertNotNull
    import static junit.framework.Assert.assertEquals
    import ch.qos.logback.core.ConsoleAppender
    import ch.qos.logback.classic.PatternLayout
    import ch.qos.logback.classic.spi.ILoggingEvent
    import ch.qos.logback.core.testUtil.StringListAppender
    import ch.qos.logback.classic.testUtil.SampleConverter
    import ch.qos.logback.core.util.StatusPrinter
    
    import ch.qos.logback.classic.boolex.JaninoEventEvaluator
    import ch.qos.logback.core.filter.EvaluatorFilter
    import ch.qos.logback.core.boolex.Matcher
    import static org.junit.Assert.assertTrue
    
    /**
     * @author Ceki G&uuml;c&uuml;
     */
    class GafferConfiguratorTest {
    
        LoggerContext context = new LoggerContext();
        Logger root = context.getLogger(Logger.ROOT_LOGGER_NAME)
        Logger logger = context.getLogger(this.getClass())
        int diff = RandomUtil.getPositiveInt();
        GafferConfigurator configurator = new GafferConfigurator(context);
    
        @Before
        void setUp() {
    
        }
    
        @Test
        void smoke() {
            File file = new File(ClassicTestConstants.GAFFER_INPUT_PREFIX + "smoke.groovy")
            String dslText = file.text
            configurator.run dslText
            Logger root = context.getLogger(Logger.ROOT_LOGGER_NAME);
            assertEquals(Level.WARN, root.level)
            assertNotNull(root.getAppender("C"))
            ConsoleAppender ca = root.getAppender("C")
            assertNotNull(ca.encoder)
            assertNotNull(ca.encoder.layout)
            PatternLayout layout = ca.encoder.layout
            assertEquals("%m%n", layout.pattern)
        }
    
        @Test
        void onTheFly() {
            File file = new File(ClassicTestConstants.GAFFER_INPUT_PREFIX + "onTheFly.groovy")
            String dslText = file.text
            configurator.run dslText
        }
    
        @Test
        void contextName() {
            String dslText = "context.name = 'a'"
            configurator.run dslText
            assertEquals("a", context.name)
        }
    
        @Test
        void contextProperty() {
            String dslText = "context.putProperty('x', 'a')"
            configurator.run dslText
            assertEquals("a", context.getProperty("x"))
        }
    
        @Test
        void conversionRule() {
            File file = new File(ClassicTestConstants.GAFFER_INPUT_PREFIX + "conversionRule.groovy")
            String dslText = file.text
            configurator.run dslText
    
            StringListAppender<ILoggingEvent> sla = (StringListAppender<ILoggingEvent>) root.getAppender("LIST");
            assertNotNull(sla);
            assertEquals(0, sla.strList.size());
    
            assertEquals(Level.DEBUG, root.level);
    
            String msg = "Simon says";
            logger.debug(msg);
            StatusPrinter.print context
            assertEquals(1, sla.strList.size());
            assertEquals(SampleConverter.SAMPLE_STR + " - " + msg, sla.strList.get(0));
        }
    
        @Test
        void evaluatorWithMatcher() {
            File file = new File(ClassicTestConstants.GAFFER_INPUT_PREFIX + "evaluatorWithMatcher.groovy")
            String dslText = file.text
            configurator.run dslText
    
            ConsoleAppender ca = (ConsoleAppender) root.getAppender("STDOUT");
            assertTrue ca.isStarted()
    
            EvaluatorFilter ef = ca.getCopyOfAttachedFiltersList()[0];
            assertTrue ef.isStarted()
    
            JaninoEventEvaluator jee = ef.evaluator
            assertTrue jee.isStarted()
            Matcher m = jee.matcherList[0]
            assertTrue m.isStarted()
        }
    
        @Test
        void propertyCascading0() {
            File file = new File(ClassicTestConstants.GAFFER_INPUT_PREFIX + "propertyCascading0.groovy")
            String dslText = file.text
            configurator.run dslText
    
            ConsoleAppender ca = (ConsoleAppender) root.getAppender("STDOUT");
            assertTrue ca.isStarted()
    
            assertEquals("HELLO %m%n", ca.encoder.layout.pattern)
        }
    
        @Test
        void propertyCascading1() {
            File file = new File(ClassicTestConstants.GAFFER_INPUT_PREFIX + "propertyCascading1.groovy")
            String dslText = file.text
            configurator.run dslText
    
            ConsoleAppender ca = (ConsoleAppender) root.getAppender("STDOUT");
            assertTrue ca.isStarted()
            assertEquals("HELLO %m%n", ca.encoder.getLayout().pattern)
        }
    
        @Test
        void propertyCascading2() {
            context.putProperty("p", "HELLO");
            File file = new File(ClassicTestConstants.GAFFER_INPUT_PREFIX + "propertyCascading2.groovy")
            String dslText = file.text
            configurator.run dslText
    
            ConsoleAppender ca = (ConsoleAppender) root.getAppender("STDOUT");
            assertTrue ca.isStarted()
            assertEquals("HELLO %m%n", ca.encoder.getLayout().pattern)
        }
    
    
        @Test
        @Ignore
        void receiver() {
            File file = new File(ClassicTestConstants.GAFFER_INPUT_PREFIX + "propertyCascading2.groovy")
            String dslText = file.text
            configurator.run dslText
        }
    
    
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/groovy/issues/����������������������������������������������0000755�0001750�0001750�00000000000�12136042143�022577� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/groovy/issues/logback811/�����������������������������������0000755�0001750�0001750�00000000000�12203357067�024444� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/groovy/issues/logback811/logback._groovy��������������������0000644�0001750�0001750�00000000476�12136042143�027452� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
    import ch.qos.logback.classic.encoder.PatternLayoutEncoder
    import ch.qos.logback.core.ConsoleAppender
    import static ch.qos.logback.classic.Level.*
    
    appender("STDOUT", ConsoleAppender) {
       encoder(PatternLayoutEncoder) {
         pattern = "%date [%-5level] [%4.4line] - %msg%n"
       }
    }
    
    root(DEBUG, ["STDOUT"])��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/groovy/issues/logback811/LineNumTest.groovy�����������������0000644�0001750�0001750�00000001564�12136042143�030117� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package issues.logback811
    
    import ch.qos.logback.core.util.StatusPrinter
    import org.junit.Test
    import org.slf4j.Logger
    import org.slf4j.LoggerFactory
    
    class LineNumTest {
    
      // move logback.groovy to src/test/resources and runManually()
    
      @Test
      void runMannually() {
        Logger logger = LoggerFactory.getLogger(this.class)
        logger.debug("hello from logger on line 28")
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/checkResults.sh���������������������������������������������0000644�0001750�0001750�00000000636�11377016712�022750� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Use this script to check the output generated by 
    # the generateLogsInSafeMode.sh script
    # Note that you can pass multiple stamps
    
    echo "File name $1"
    echo "run length $2"
    
    if [ $# -lt 3 ]
    then 
      echo "Usage: checkResults.sh filename runLen stamp0 ... stampN"
      exit 1;
    fi
    
    FILENAME=$1
    LEN=$2
    
    shift 2
    
    echo Checking results...
    java ch.qos.logback.classic.multiJVM.Checker $LEN $FILENAME $*
    ��������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/generateRollingLogsInSafeMode.sh����������������������������0000644�0001750�0001750�00000001674�11377016712�026155� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������echo "File name $1"
    echo "run length $2"
    
    
    
    #On windows
    #CLASSPATH="${CLASSPATH};./target/classes/"
    #CLASSPATH="${CLASSPATH};./target/test-classes/"
    #CLASSPATH="${CLASSPATH};../logback-core/target/classes"
    #CLASSPATH="${CLASSPATH};../logback-examples/lib/slf4j-api-1.5.5.jar"
    
    # On Unix
    #CLASSPATH="${CLASSPATH}:./target/classes/"
    #CLASSPATH="${CLASSPATH}:./target/test-classes/"
    #CLASSPATH="${CLASSPATH}:../logback-core/target/classes"
    #CLASSPATH="${CLASSPATH}:../logback-examples/lib/slf4j-api-1.5.5.jar"
    
    
    if [ $# -lt 3 ]
    then 
      echo "Usage: generateRollingLogsInSafeMode.sh filename runLen stamp0 ... stampN"
      exit 1;
    fi
    
    FILENAME=$1
    LEN=$2
    
    shift 2
    
    for stamp in $@
    do 
      echo running safe mode with $stamp
      java ch.qos.logback.classic.multiJVM.SafeModeRollingFileAppender $stamp $LEN $FILENAME &
    done
    
    wait
    
    echo "To test the results issue the following command"
    echo "./checkResults.sh $FILENAME $LEN $*"
    
    ��������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/������������������������������������������������������0000755�0001750�0001750�00000000000�12203357067�021107� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/issue/������������������������������������������������0000755�0001750�0001750�00000000000�12203357067�022237� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/issue/lbcore63.xml������������������������������������0000644�0001750�0001750�00000002021�11377016712�024373� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <configuration>
    
      <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
          <pattern>%d{HH:mm:ss.SSS} - %msg%n</pattern>
        </layout>
      </appender>
    
      <appender name="FILE-MAIN"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>logs/main.log</file>
        <rollingPolicy
          class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
          <FileNamePattern>logs/main-%i.log</FileNamePattern>
          <MinIndex>1</MinIndex>
          <MaxIndex>3</MaxIndex>
        </rollingPolicy>
        <triggeringPolicy
          class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
          <MaxFileSize>500MB</MaxFileSize>
        </triggeringPolicy>
        <layout class="ch.qos.logback.classic.PatternLayout">
          <Pattern>%-25(%7r [%thread]) - %msg%n</Pattern>
        </layout>
      </appender>
    
      <root>
        <appender-ref ref="FILE-MAIN" />
        <level value="DEBUG" />
      </root>
    
    </configuration>���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/issue/lbcore26.xml������������������������������������0000644�0001750�0001750�00000001126�11377016712�024377� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration scan="true">
      <appender name="LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>target/test-output/lbcore26.log </file>
        
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
          <FileNamePattern>target/test-output/lbcore26.%d{yyyy-MM-dd}.log</FileNamePattern>
          <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        
        <layout>
          <Pattern>%date [%thread] %-5level %logger - %msg%n</Pattern>
        </layout>
      </appender>
      
      <root level="info">
        <appender-ref ref="LOG" />
      </root>
    </configuration> ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/issue/logback292.xml����������������������������������0000644�0001750�0001750�00000000053�12136042143�024605� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
      <bla/>
    </configuration>�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/socket/�����������������������������������������������0000755�0001750�0001750�00000000000�12203357067�022377� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/socket/clientConfig.xml�������������������������������0000644�0001750�0001750�00000001164�11377016712�025527� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?>
    
    <configuration>
    
    	<appender name="STDOUT"
    		class="ch.qos.logback.core.ConsoleAppender">
    		<layout class="ch.qos.logback.classic.PatternLayout">
    			<param name="pattern"
    				value="CLI: %-4relative [%thread] %-5level %class - %msg%n" />
    		</layout>
    	</appender>
    
    	<appender name="SOCKET"
    		class="ch.qos.logback.classic.net.SocketAppender">
    		<param name="remoteHost" value="127.0.0.1" />
    		<param name="port" value="4560" />
    	</appender>
    
    	<root>
    		<level value="debug" />
    		<appender-ref ref="STDOUT" />
    		<appender-ref ref="SOCKET" />
    	</root>
    </configuration>
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/socket/serverConfig.xml�������������������������������0000644�0001750�0001750�00000000631�11377016712�025555� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?>
    
    <configuration>
    
    	<appender name="stdout"
    		class="ch.qos.logback.core.ConsoleAppender">
    		<layout class="ch.qos.logback.classic.PatternLayout">
    			<param name="pattern" value="SERV: %p %t %c - %m%n" />
    		</layout>
    	</appender>
    
    	<root>
    		<level value="debug" />
    		<appender-ref ref="stdout" />
    		<appender-ref ref="rolling" />
    	</root>
    </configuration>�������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/serialization/����������������������������������������0000755�0001750�0001750�00000000000�12203357067�023764� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/serialization/logger_v1.0.11.ser����������������������0000644�0001750�0001750�00000002235�12136042271�026735� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sr�ch.qos.logback.classic.LoggerKB�Z�additiveI�effectiveLevelIntL�childrenListt�Ljava/util/List;L�levelt�Lch/qos/logback/classic/Level;L�loggerRemoteViewt�-Lch/qos/logback/classic/spi/LoggerRemoteView;L�namet�Ljava/lang/String;L�parentt�Lch/qos/logback/classic/Logger;xp��'ppsr�+ch.qos.logback.classic.spi.LoggerRemoteViewEȝJ�L�loggerContextViewt�,Lch/qos/logback/classic/spi/LoggerContextVO;L�nameq�~�xpsr�*ch.qos.logback.classic.spi.LoggerContextVOL)`2�J�	birthTimeL�nameq�~�L�propertyMapt�Ljava/util/Map;xp��=?קt�testContextsr�java.util.HashMap`�F�
    loadFactorI�	thresholdxp?@�����w�������xt�aq�~�sq�~����'sr�java.util.ArrayListxa�I�sizexp���w���sq�~����'sq�~����w���sq�~����'sq�~����w���sq�~����'sq�~����w���sq�~����'sq�~����w���sq�~����'ppsq�~�q�~�t�.ch.qos.logback.classic.LoggerSerializationTestq�~�q�~�xpsq�~�q�~�t�ch.qos.logback.classicq�~� q�~�xpsq�~�q�~�t�ch.qos.logbackq�~�"q�~�xpsq�~�q�~�t�ch.qosq�~�$q�~�xpsq�~�q�~�t�chq�~�&q�~�q�~�xsr�ch.qos.logback.classic.LevelLg�I�levelIntL�levelStrq�~�xp��'t�DEBUGsq�~�q�~�t�ROOTq�~�+p�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/serialization/logger_v1.0.12.ser����������������������0000644�0001750�0001750�00000000122�12136042271�026727� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sr�ch.qos.logback.classic.LoggerKB�L�namet�Ljava/lang/String;xpt�a����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/integration/������������������������������������������0000755�0001750�0001750�00000000000�11506604156�023431� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/integration/autoInit/���������������������������������0000755�0001750�0001750�00000000000�12203357067�025226� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/integration/autoInit/logback.xml����������������������0000644�0001750�0001750�00000000257�11405713345�027354� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
    <configuration>
    
      <appender name="LIST" class="ch.qos.logback.core.read.ListAppender"/>
      <root level="DEBUG">
    		<appender-ref ref="LIST" />
    	</root>
    </configuration>�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/integration/db/���������������������������������������0000755�0001750�0001750�00000000000�12203357067�024017� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/integration/db/oracle11g-with-driver.xml��������������0000644�0001750�0001750�00000000775�11377016712�030572� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <configuration>
    
    	<appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
    		<connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
    			<driverClass>oracle.jdbc.OracleDriver</driverClass>
    			<url>jdbc:oracle:thin:@localhost:1521:orcl</url>
    			<user>SCOTT</user>
    			<password>SCOTT</password>
    		</connectionSource>
    	</appender>
    	
    	<root>
    		<level value="debug" />
    		<appender-ref ref="DB" />
    	</root>
    </configuration>
    ���logback_1.0.13/logback-classic/src/test/input/integration/db/oracle10g-with-driver.xml��������������0000644�0001750�0001750�00000001022�11377016712�030553� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <configuration>
    
      <appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
        <connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
          <driverClass>oracle.jdbc.OracleDriver</driverClass>
          <url>jdbc:oracle:thin:@localhost:1521:xe</url>
          <user>test</user>
          <password>test</password>
        </connectionSource>
      </appender>
      
      <root>
        <level value="debug" />
        <appender-ref ref="DB" />
      </root>
    </configuration>
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/integration/db/postgresql-with-driver.xml�������������0000644�0001750�0001750�00000001021�11377016712�031200� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <configuration>
    
      <appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
        <connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
          <driverClass>org.postgresql.Driver</driverClass>
          <url>jdbc:postgresql://localhost:5432/test</url>
          <user>test</user>
          <password>test</password>
        </connectionSource>
      </appender>
      
      <root>
        <level value="DEBUG" />
        <appender-ref ref="DB" />
      </root>
    </configuration>
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/integration/db/mysql-with-driver.xml������������������0000644�0001750�0001750�00000001014�11377016712�030144� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <configuration>
    
      <appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
        <connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
          <driverClass>com.mysql.jdbc.Driver</driverClass>
          <url>jdbc:mysql://127.0.0.1:3306/test</url>
          <user>test</user>
          <password>test</password>
        </connectionSource>
      </appender>
      
      <root>
        <level value="debug" />
        <appender-ref ref="DB" />
      </root>
    </configuration>
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/integration/db/sqlserver-with-driver.xml��������������0000644�0001750�0001750�00000001045�11377016712�031031� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <configuration>
    
    	<appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
    		<connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
    			<driverClass>com.microsoft.sqlserver.jdbc.SQLServerDriver</driverClass>
    			<url>jdbc:sqlserver://localhost:1987;databaseName=logback;</url>
    			<user>logback</user>
    			<password>logback</password>
    		</connectionSource>
    	</appender>
    	
    	<root>
    		<level value="debug" />
    		<appender-ref ref="DB" />
    	</root>
    </configuration>
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/������������������������������������������������0000755�0001750�0001750�00000000000�12203357067�022220� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/smtp/�������������������������������������������0000755�0001750�0001750�00000000000�12203357067�023203� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/smtp/customEvaluator.xml������������������������0000644�0001750�0001750�00000001266�12136042271�027120� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    
      <appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
        <SMTPHost>localhost</SMTPHost>
        <SMTPPort>${port}</SMTPPort>
        <To>nospam@qos.ch</To>
        <From>user@host.dom</From>
        <Subject>testCustomEvaluator %logger - %m</Subject>
        <evaluator class="ch.qos.logback.classic.net.CounterBasedEvaluator">
          <limit>2</limit>
        </evaluator>
        <layout class="ch.qos.logback.classic.PatternLayout">
          <Pattern>%message</Pattern>
          <outputPatternAsPresentationHeader>false</outputPatternAsPresentationHeader>
        </layout>
      </appender>
    
      <root level="debug">
        <appender-ref ref="EMAIL" />
      </root>
    </configuration>
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/smtp/customBufferSize.xml�����������������������0000644�0001750�0001750�00000001330�12136177166�027226� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    
      <appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
        <SMTPHost>localhost</SMTPHost>
        <SMTPPort>${port}</SMTPPort>
        <To>nospam@qos.ch</To>
        <From>user@host.dom</From>
        <Subject>testCustomBufferSize %logger - %m</Subject>
    
        <CyclicBufferTracker class="ch.qos.logback.core.spi.CyclicBufferTracker">
          <bufferSize>1</bufferSize>
        </CyclicBufferTracker>
        
        <layout class="ch.qos.logback.classic.PatternLayout">
          <pattern>%message</pattern>
          <outputPatternAsPresentationHeader>false</outputPatternAsPresentationHeader>
        </layout>
      </appender>
    
      <root level="debug">
        <appender-ref ref="EMAIL" />
      </root>
    </configuration>
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/levelFilter.xml���������������������������������0000644�0001750�0001750�00000000514�11377016712�025217� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    
      <appender name="LIST" class="ch.qos.logback.core.read.ListAppender">
    
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
          <OnMatch>DENY</OnMatch>
          <level>ERROR</level>
        </filter>
      </appender>
    
      <root level="debug">
        <appender-ref ref="LIST" />
      </root>
    </configuration>������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/rolling/����������������������������������������0000755�0001750�0001750�00000000000�12203357067�023666� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/rolling/timeAndSize.xml�������������������������0000644�0001750�0001750�00000001527�11726463615�026637� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    
      <appender name="ROLLING"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${randomOutputDir}z${testId}</File>
        <rollingPolicy
          class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
          <FileNamePattern>
            ${randomOutputDir}${testId}-%d{yyyy-MM-dd_HH_mm_ss}.%i
          </FileNamePattern>
          <TimeBasedFileNamingAndTriggeringPolicy
            class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
            <MaxFileSize>${sizeThreshold}</MaxFileSize>
          </TimeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder>
          <Pattern>%msg%n</Pattern>
          <outputPatternAsPresentationHeader>false</outputPatternAsPresentationHeader>
        </encoder>
      </appender>
    
    
      <root level="debug">
        <appender-ref ref="ROLLING" />
      </root>
    
    </configuration>
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/rolling/basic.xml�������������������������������0000644�0001750�0001750�00000001173�11732362373�025475� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    
      <appender name="ROLLING"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${randomOutputDir}z${testId}</File>
        <rollingPolicy
          class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
          <FileNamePattern>
            ${randomOutputDir}${testId}-%d{yyyy-MM-dd_HH_mm_ss}
          </FileNamePattern>
        </rollingPolicy>
        <encoder>
          <pattern>%msg%n</pattern>
          <outputPatternAsPresentationHeader>false</outputPatternAsPresentationHeader>
        </encoder>
      </appender>
    
    
      <root level="debug">
        <appender-ref ref="ROLLING" />
      </root>
    
    </configuration>
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/compatibility/����������������������������������0000755�0001750�0001750�00000000000�12203357067�025071� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/compatibility/layoutInsteadOfEncoder.xml��������0000644�0001750�0001750�00000000633�11377016712�032227� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    
      <appender name="LIOE" class="ch.qos.logback.core.FileAppender">
        <file>target/test-output/layoutInsteadOfEncoder.log</file>
        <append>true</append>
                    
        <layout class="ch.qos.logback.classic.PatternLayout">
          <pattern>%msg%n</pattern>
        </layout>
      </appender>
            
      <root level="debug">
        <appender-ref ref="LIOE" />
      </root>
    </configuration>�����������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/evaluatorFilter.xml�����������������������������0000644�0001750�0001750�00000000750�11377016712�026114� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    
      <appender name="LIST"
                 class="ch.qos.logback.core.read.ListAppender">
    
        <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
          <Name>myFilter</Name>
          <OnMatch>DENY</OnMatch>
          <Evaluator>
            <Name>mdcEvaluator</Name>
            <Expression>"to be ignored".equals(message)</Expression>
          </Evaluator>
        </filter>
      </appender>
    
      <root level="debug">
        <appender-ref ref="LIST" />
      </root>
    </configuration>������������������������logback_1.0.13/logback-classic/src/test/input/joran/appenderRefByProperty.xml�����������������������0000644�0001750�0001750�00000000711�11456067317�027241� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration>
    
    <configuration debug="false">
    
      <appender name="A" class="ch.qos.logback.core.read.ListAppender"/>
      <appender name="B" class="ch.qos.logback.core.read.ListAppender"/>
    
      <logger name="ch.qos.logback.classic.joran" level="INFO">
        <appender-ref ref="${logback.appenderRef}"/>
      </logger>
    
      <root level="ERROR">
        <appender-ref ref="LIST"/>
      </root>
    
    </configuration>
    �������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/turboDynamicThreshold.xml�����������������������0000644�0001750�0001750�00000001170�11377016712�027256� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration>
    
    <configuration>
    
    	<turboFilter class="ch.qos.logback.classic.turbo.DynamicThresholdFilter">
    		<Key>userId</Key>
    		<DefaultThreshold>ERROR</DefaultThreshold>
    		<MDCValueLevelPair>
    			<value>user1</value>
    			<level>INFO</level>
    		</MDCValueLevelPair>
    		<MDCValueLevelPair>
    			<value>user2</value>
    			<level>TRACE</level>
    		</MDCValueLevelPair>
    
    	</turboFilter>
    
    
    	<appender name="LIST"
    		class="ch.qos.logback.core.read.ListAppender">
    	</appender>
    
    	<root>
    		<level value="DEBUG" />
    		<appender-ref ref="LIST" />
    	</root>
    </configuration>
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/pattern/����������������������������������������0000755�0001750�0001750�00000000000�12203357067�023675� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/pattern/replace0.xml����������������������������0000644�0001750�0001750�00000000710�11504335741�026106� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    
      <conversionRule conversionWord="sample"
        converterClass="ch.qos.logback.classic.testUtil.SampleConverter" />
    
      <appender name="LIST" class="ch.qos.logback.core.testUtil.StringListAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
          <Pattern>%replace(%msg){'\d{14,16}', 'XXXX'}</Pattern>
        </layout>
      </appender>
    
      <root level="debug">
        <appender-ref ref="LIST" />
      </root>
    </configuration>��������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/conditional/������������������������������������0000755�0001750�0001750�00000000000�12203357067�024523� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/conditional/conditionalIncludeInexistentFile.xml0000644�0001750�0001750�00000000640�11640310174�033717� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
    <configuration>
    
      <define name="INCLUDED_FILE_EXISTS" 
              class="ch.qos.logback.core.property.FileExistsPropertyDefiner">
          <path>src/test/input/joran/conditional/inexistent.xml</path>
      </define>
      
       <if condition='property("INCLUDED_FILE_EXISTS").equals("true")'>
        <then>
            <include file="src/test/input/joran/conditional/inexistent.xml"/>
        </then>
      </if> 
    </configuration>������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/conditional/conditionalConsoleApp.xml�����������0000644�0001750�0001750�00000001267�11377016712�031542� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
    <configuration>
    
      <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>${randomOutputDir}/conditional.log</file>
        <encoder>
          <pattern>%d %-5level %logger{35} - %msg %n</pattern>
       </encoder>
      </appender>
    
      <root level="ERROR">
         <appender-ref ref="FILE" />
      </root>
    
    
      <if condition='property("HOSTNAME").contains("${aHost}")'>
        <then>
          <appender name="CON" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
              <pattern>%d %-5level %logger{35} - %msg %n</pattern>
            </encoder>
          </appender>
          <root>
            <appender-ref ref="CON" />
          </root>
        </then>
      </if>
    
    </configuration>�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/conditional/conditionalIncludeExistingFile.xml��0000644�0001750�0001750�00000000644�11640310174�033363� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
    <configuration>
    
      <define name="INCLUDED_FILE_EXISTS" 
              class="ch.qos.logback.core.property.FileExistsPropertyDefiner">
          <path>src/test/input/joran/conditional/includedFile.xml</path>
      </define>
      
       <if condition='property("INCLUDED_FILE_EXISTS").equals("true")'>
        <then>
            <include file="src/test/input/joran/conditional/includedFile.xml"/>
        </then>
      </if> 
    </configuration>��������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/conditional/withoutJanino.xml�������������������0000644�0001750�0001750�00000000415�11524006373�030103� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
    <configuration>
    
      <logger name="a" level="WARN"/>
    
      <if condition='property("HOSTNAME") != null'>
        <then>
          <root level="ERROR"/>
        </then>
        <else>
          <root level="INFO"/>
        </else>
      </if>
    
      <root level="WARN"/>
    
    
    </configuration>���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/conditional/includedFile.xml��������������������0000644�0001750�0001750�00000000372�11640310174�027626� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<included>
      <appender name="CON" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
          <pattern>%d %-5level %logger{35} - %msg %n</pattern>
        </encoder>
      </appender>
      <root>
        <appender-ref ref="CON"/>
      </root>
    </included>����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/conditional/conditionalConsoleApp_ELSE.xml������0000644�0001750�0001750�00000001546�11377016712�032352� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
    <configuration>
    
      <if condition='property("HOSTNAME").equals("XYZ87")'>
        <then>
    
          <appender name="CON" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
              <pattern>%d %-5level %logger{35} - %msg %n</pattern>
            </encoder>
          </appender>
          <root>
            <appender-ref ref="CON" />
          </root>
    
        </then>
        <else>
    
          <appender name="LIST" class="ch.qos.logback.core.read.ListAppender"/>
          <root>
            <appender-ref ref="LIST" />
          </root>
    
        </else>
      </if>
    
      <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>${randomOutputDir}/conditional.log</file>
        <encoder>
          <pattern>%d %-5level %logger{35} - %msg %n</pattern>
       </encoder>
      </appender>
    
      <root level="ERROR">
         <appender-ref ref="FILE" />
      </root>
    
    
    
    
    </configuration>����������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/timestamp-local.xml�����������������������������0000644�0001750�0001750�00000000363�12136042271�026030� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
      <timestamp key="testTimestamp" datePattern="yyyy-MM"/>
      <property scope="system"  
      	name="ch.qos.logback.classic.joran.JoranConfiguratorTest.timestampLocal" 
      	value="today is ${testTimestamp}"/>
    </configuration>
      �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/ignore.xml��������������������������������������0000644�0001750�0001750�00000001012�11377016712�024217� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration>
    
    <configuration>
      <evaluator name="IGNORE_EVAL">
       <Expression>(marker.contains("IGNORE"))</Expression>
      </evaluator>
    
     <appender name="LIST" class="ch.qos.logback.core.read.ListAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
          <Pattern>%date %level - %m%n%ex{full, IGNORE_EVAL}</Pattern>
        </layout>
      </appender>
      
      <root level="DEBUG">
        <appender-ref ref="CONSOLE" />
      </root>
      
    </configuration>
      ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/onConsoleRetro.xml������������������������������0000644�0001750�0001750�00000000507�11457576072�025730� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <configuration>
    
    
      <appender name="LIST" class="ch.qos.logback.core.read.ListAppender"/>
    
      <root>
        <level value="DEBUG"/>
        <appender-ref ref="LIST"/>
      </root>
             <statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener"/>
    </configuration>
      �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/callerData.xml����������������������������������0000644�0001750�0001750�00000001166�11377016712�025002� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration>
    
    <configuration>
    
      <evaluator name="helloEval">
        <Expression>m.matches(message)</Expression>
        <matcher>
          <name>m</name>
          <regex>^hello.*</regex>
          <CaseSensitive>false</CaseSensitive>
        </matcher>
      </evaluator>
    
      <appender name="STR_LIST"
        class="ch.qos.logback.core.testUtil.StringListAppender">   
        <layout>
          <Pattern>%caller{4, helloEval}%d %level - %m%n</Pattern>
        </layout>
      </appender>
    
      <root>
        <level value="DEBUG" />
        <appender-ref ref="STR_LIST" />
      </root>
    
    
    
    </configuration>
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/syslog_LBCLASSIC_50.xml�������������������������0000644�0001750�0001750�00000000711�11377016712�026144� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?>
    <configuration debug="true">
      <appender name="aSYSLOG" class="ch.qos.logback.classic.net.SyslogAppender">
        <SyslogHost>127.0.0.1</SyslogHost>
        <Facility>LOCAL7</Facility>
        <layout class="ch.qos.logback.classic.PatternLayout">
          <pattern>%d %p [%t] %c::%m%n</pattern>
        </layout>
      </appender>
      <root>
        <level value="TRACE"/>
        <appender-ref ref="aSYSLOG"/>
      </root>
    </configuration>�������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/timestamp-context.xml���������������������������0000644�0001750�0001750�00000000157�12136042271�026423� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
      <timestamp key="testTimestamp" datePattern="yyyy-MM" scope="context"/>
    </configuration>
      �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/jul/��������������������������������������������0000755�0001750�0001750�00000000000�12203357067�023012� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/jul/levelChangePropagator0.xml������������������0000644�0001750�0001750�00000000401�12136042271�030054� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration debug="false">
    
      <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
        <resetJUL>true</resetJUL>
      </contextListener>
      <logger name="a.b.c.${diff}" level="WARN" />
      <root level="TRACE"/>
    
    </configuration>
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/jul/levelChangePropagator1.xml������������������0000644�0001750�0001750�00000000317�12136042271�030063� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration debug="false">
    
      <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"/>
    
      <logger name="a.b.c.${diff}" level="WARN" />
      <root level="TRACE"/>
    
    </configuration>
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/rootLevelByProperty.xml�������������������������0000644�0001750�0001750�00000000431�11377016712�026753� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration>
    
    <configuration debug="false">
    
      <appender name="LIST" class="ch.qos.logback.core.read.ListAppender" />
    
      <root level="${logback.level}">
      
        <appender-ref ref="LIST" />
      </root>
    
    </configuration>
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/simpleLevel.xml���������������������������������0000644�0001750�0001750�00000000513�11377016712�025222� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration>
    
    <configuration debug="false">
    
      <appender name="LIST" class="ch.qos.logback.core.read.ListAppender" />
    
      <logger name="ch.qos.logback.classic.joran" level="INFO" />
    
      <root level="DEBUG">
        <appender-ref ref="LIST" />
      </root>
    
    </configuration>
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/scan1.xml���������������������������������������0000644�0001750�0001750�00000000355�12143164221�023741� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration scan="true" scanPeriod="1 millisecond">
    
      <appender name="LIST" class="ch.qos.logback.core.read.ListAppender"/>
        
      <root level="TRACE">  
        <appender-ref ref="LIST" />
      </root>
      
    </configuration> 
           �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/loggerLevelByProperty.xml�����������������������0000644�0001750�0001750�00000000525�11465030757�027256� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration>
    
    <configuration debug="false">
    
      <appender name="LIST" class="ch.qos.logback.core.read.ListAppender" />
    
     <logger name="ch.qos.logback.classic.joran" level="${logback.level}"/>
    
      <root level="ERROR">
        <appender-ref ref="LIST" />
      </root>
    
    </configuration>
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/turbo2.xml��������������������������������������0000644�0001750�0001750�00000001036�11377016712�024157� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration>
    
    <configuration>
      <turboFilter class="ch.qos.logback.classic.turbo.DebugUsersTurboFilter">
        <user>seb</user>
        <user>ceki</user>
      </turboFilter>
    
      <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
          <Pattern>%d %level - %m%n</Pattern>
        </layout>
      </appender>
      
      <root>
        <level value="DEBUG" />
        <appender-ref ref="CONSOLE" />
      </root>
    </configuration>
      ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/sift/�������������������������������������������0000755�0001750�0001750�00000000000�12203357067�023165� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/sift/completeCycle.xml��������������������������0000644�0001750�0001750�00000001013�11377016712�026472� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration>
    
    <configuration debug="true">
    
      <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
    
        <discriminator>
          <Key>cycle</Key>
          <defaultValue>cycleDefault</defaultValue>
        </discriminator>
        <sift>
          <appender name="list-${cycle}"
            class="ch.qos.logback.core.read.ListAppender" />
        </sift>
      </appender>
    
      <root level="DEBUG">
        <appender-ref ref="SIFT" />
      </root>
    
    </configuration>
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/sift/lingering.xml������������������������������0000644�0001750�0001750�00000001007�12136244421�025655� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration>
    
    <configuration debug="true">
    
      <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
    
        <discriminator>
          <key>linger</key>
          <defaultValue>linger</defaultValue>
        </discriminator>
        <sift>
          <appender name="list-${linger}"
            class="ch.qos.logback.core.read.ListAppender" />
        </sift>
      </appender>
    
      <root level="DEBUG">
        <appender-ref ref="SIFT" />
      </root>
    
    </configuration>
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/sift/smoke.xml����������������������������������0000644�0001750�0001750�00000001015�12136250322�025011� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration>
    
    <configuration debug="true">
    
      <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
    
        <discriminator>
          <key>userid</key>
          <defaultValue>smokeDefault</defaultValue>
        </discriminator>
        <sift>
          <appender name="list-${userid}"
            class="ch.qos.logback.core.read.ListAppender" />
        </sift>
      </appender>
    
      <root level="DEBUG">
        <appender-ref ref="SIFT" />
      </root>
    
    </configuration>
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/sift/multipleNesting.xml������������������������0000644�0001750�0001750�00000001132�12136250436�027064� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration>
    
    <configuration debug="true">
    
      <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
    
        <discriminator>
          <key>userid</key>
          <defaultValue>multipleDefault</defaultValue>
        </discriminator>
        <sift>
          <appender name="a-${userid}" class="ch.qos.logback.core.read.ListAppender" />
          <appender name="b-${userid}"  class="ch.qos.logback.core.read.ListAppender" />
        </sift>
      </appender>
    
      <root level="DEBUG">
        <appender-ref ref="SIFT" />
      </root>
    
    </configuration>
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/sift/compositeProperty.xml����������������������0000644�0001750�0001750�00000001262�12136244530�027452� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
    <configuration debug="true">
    
      <property name="X" value="composite"/>  
    
      <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
        <discriminator>
          <key>compositeProperty</key>
          <defaultValue>default</defaultValue>
        </discriminator>
        <sift>
          <property name="Z" value="${X}"/>  
    
          <appender name="LIST-${compositeProperty}"
            class="ch.qos.logback.core.testUtil.StringListAppender">
            <layout>
              <pattern>${Z}%msg</pattern>                       
            </layout>
          </appender>
        </sift>
      </appender>
    
      <root level="DEBUG">
        <appender-ref ref="SIFT" />
      </root>
    
    </configuration>
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/sift/propertyDefinedInSiftElement.xml�����������0000644�0001750�0001750�00000001217�12136244637�031505� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration debug="true">
    
      <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
        <discriminator>
          <key>propertyDefinedWithinSift</key>
          <defaultValue>default</defaultValue>
        </discriminator>
        <sift>
          <property name="X" value="Y"/>  
    
          <appender name="LIST-${propertyDefinedWithinSift}"
            class="ch.qos.logback.core.testUtil.StringListAppender">
            <layout>
              <pattern>${X}%msg</pattern>                       
            </layout>
          </appender>
        </sift>
      </appender>
    
      <root level="DEBUG">
        <appender-ref ref="SIFT" />
      </root>
    
    </configuration>
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/sift/lbclassic203.xml���������������������������0000644�0001750�0001750�00000001176�12136244564�026102� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration>
    
    <configuration debug="true">
    
      <statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />  
        
    
      <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
    
        <discriminator>
          <key>userid</key>
          <defaultValue>smoke</defaultValue>
        </discriminator>
        <sift>
          <appender name="list-${userid}"
            class="ch.qos.logback.classic.issue.lbclassic203.InstanceCountingAppender" />
        </sift>
      </appender>
    
      <root level="DEBUG">
        <appender-ref ref="SIFT" />
      </root>
    
    </configuration>
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/sift/defaultLayoutRule.xml����������������������0000644�0001750�0001750�00000001053�12136244540�027354� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration debug="true">
    
      <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
        <discriminator>
          <key>userid</key>
          <defaultValue>default</defaultValue>
        </discriminator>
        <sift>
          <appender name="LIST-${userid}"
            class="ch.qos.logback.core.testUtil.StringListAppender">
            <layout>
              <pattern>%level %msg</pattern>
            </layout>
          </appender>
        </sift>
      </appender>
    
      <root level="DEBUG">
        <appender-ref ref="SIFT" />
      </root>
    
    </configuration>
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/sift/zeroNesting.xml����������������������������0000644�0001750�0001750�00000000660�12136250735�026217� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration>
    
    <configuration debug="true">
    
      <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
    
        <discriminator>
          <key>userid</key>
          <defaultValue>zeroDefault</defaultValue>
        </discriminator>
        <sift>     
        </sift>
      </appender>
    
      <root level="DEBUG">
        <appender-ref ref="SIFT" />
      </root>
    
    </configuration>
    ��������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/sift/propertyPropagation.xml��������������������0000644�0001750�0001750�00000001165�12136244650�030000� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration debug="true">
    
    
      <property name="X" value="Y"/>  
    
      <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
        <discriminator>
          <key>localProperty</key>
          <defaultValue>default</defaultValue>
        </discriminator>
        <sift>
          <appender name="LIST-${localProperty}"
            class="ch.qos.logback.core.testUtil.StringListAppender">
            <layout>
              <pattern>${X}%msg</pattern>                       
            </layout>
          </appender>
        </sift>
      </appender>
    
      <root level="DEBUG">
        <appender-ref ref="SIFT" />
      </root>
    
    </configuration>
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/sift/hoard0.xml���������������������������������0000644�0001750�0001750�00000001262�12136244505�025062� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration>
    
    <configuration debug="true">
    
      <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
    
        <mdcKey>userid</mdcKey>
        <default>asdad</default>
        <sift>
          <appender name="FILE-${userid}" class="ch.qos.logback.core.FileAppender">
            <file>${userid}.log</file>
            <append>true</append>
            <layout class="ch.qos.logback.classic.PatternLayout">
              <pattern>%d [%thread] %level %logger{35} - %msg%n</pattern>
            </layout>
          </appender>
        </sift>
      </appender>
    
      <root level="DEBUG">
        <appender-ref ref="SIFT" />
      </root>
    
    </configuration>
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/sift/maxAppenderCount.xml�����������������������0000644�0001750�0001750�00000001153�12136475014�027162� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration>
    
    <configuration debug="true">
    
        <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
            <discriminator>
                <key>max</key>
                <defaultValue>default</defaultValue>
            </discriminator>
            <maxAppenderCount>5</maxAppenderCount>
            <sift>
                <appender name="list-${userid}"
                          class="ch.qos.logback.core.read.ListAppender"/>
            </sift>
        </appender>
    
        <root level="DEBUG">
            <appender-ref ref="SIFT"/>
        </root>
    
    </configuration>���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/sift/unsetDefaultValueProperty.xml��������������0000644�0001750�0001750�00000000734�12136244663�031122� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration>
    
    <configuration debug="true">
    
      <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
    
        <discriminator>
          <key>userid</key>
        </discriminator>
        <sift>
          <appender name="list-${userid}"
            class="ch.qos.logback.core.read.ListAppender" />
        </sift>
      </appender>
    
      <root level="DEBUG">
        <appender-ref ref="SIFT" />
      </root>
    
    </configuration>
    ������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/sift/timeout.xml��������������������������������0000644�0001750�0001750�00000001146�12136505335�025375� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration>
    
    <configuration debug="true">
    
        <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
    
            <discriminator>
                <key>timeout</key>
                <defaultValue>smoke</defaultValue>
            </discriminator>
            <timeout>30 seconds</timeout>
            <sift>
                <appender name="list-${userid}"
                          class="ch.qos.logback.core.read.ListAppender"/>
            </sift>
        </appender>
    
        <root level="DEBUG">
            <appender-ref ref="SIFT"/>
        </root>
    
    </configuration>��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/simpleEvaluator.xml�����������������������������0000644�0001750�0001750�00000000402�11377016712�026112� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
      <evaluator name="msgEval">
        <Expression>m.matches(message)</Expression>
        <matcher>
          <Name>m</Name>
          <regex>^hello.*</regex>
          <CaseSensitive>false</CaseSensitive>
        </matcher>
      </evaluator>
    </configuration>
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/issues/�����������������������������������������0000755�0001750�0001750�00000000000�12203357067�023533� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/issues/lbcore254.properties���������������������0000644�0001750�0001750�00000000005�11745463075�027354� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������k0=v0���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/issues/lbcore254.xml����������������������������0000644�0001750�0001750�00000000123�11745462536�025762� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    
      <property file="${k.lbcore254}.properties"/>
    </configuration>���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/issues/lbcore193.xml����������������������������0000644�0001750�0001750�00000001115�11524751267�025763� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration debug="${log.debug:-false}">
        <!-- <property resource="configuration.properties"/> -->
    
        <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                 <!-- <pattern>%date %level [%thread] %logger(%file:%line\\) - %msg%n</pattern>     -->
                <pattern>%date %level [%thread] %logger(%file:%line\)</pattern>
            </encoder>
        </appender>
    
        <logger name="scratch" level="${log.level:-INFO}"/>
    
        <root level="${log-all.level:-DEBUG}">
            <appender-ref ref="STDOUT"/>
        </root>
    </configuration>���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/conversionRule/���������������������������������0000755�0001750�0001750�00000000000�12203357067�025235� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/conversionRule/patternLayout0.xml���������������0000644�0001750�0001750�00000000663�11377016712�030717� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    
      <conversionRule conversionWord="sample"
        converterClass="ch.qos.logback.classic.testUtil.SampleConverter" />
    
      <appender name="LIST" class="ch.qos.logback.core.testUtil.StringListAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
          <Pattern>%sample - %msg</Pattern>
        </layout>
      </appender>
    
      <root level="debug">
        <appender-ref ref="LIST" />
      </root>
    </configuration>�����������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/conversionRule/htmlLayout0.xml������������������0000644�0001750�0001750�00000000662�11377016712�030205� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    
      <conversionRule conversionWord="sample"
        converterClass="ch.qos.logback.classic.testUtil.SampleConverter" />
    
      <appender name="LIST" class="ch.qos.logback.core.testUtil.StringListAppender">
        <layout class="ch.qos.logback.classic.html.HTMLLayout">
          <Pattern>%sample%msg</Pattern>
        </layout>
      </appender>
    
      <root level="debug">
        <appender-ref ref="LIST" />
      </root>
    </configuration>������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/properties.xml����������������������������������0000644�0001750�0001750�00000000534�11650024463�025134� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration debug="false">
      <property                 name="transientKey0" value="v"/>
      <property scope="local"   name="transientKey1" value="v"/>
      <property scope="context" name="nodeId" value="node0"/>
      <property scope="system"  name="sys" value="tem"/>
    
      <property scope="context" name="path" value ="${PATH}"/>
    </configuration>
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/turbo.xml���������������������������������������0000644�0001750�0001750�00000000745�11377016712�024103� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration>
    
    <configuration>
      <turboFilter class="ch.qos.logback.classic.turbo.NOPTurboFilter" />
    
      <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
          <Pattern>%caller{4} %d %level - %m%n</Pattern>
        </layout>
      </appender>
      
      <root>
        <level value="DEBUG" />
        <appender-ref ref="CONSOLE" />
      </root>
    </configuration>
      ���������������������������logback_1.0.13/logback-classic/src/test/input/joran/turboDynamicThreshold2.xml����������������������0000644�0001750�0001750�00000001272�11377016712�027343� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration>
    
    <configuration>
    
    	<turboFilter
    		class="ch.qos.logback.classic.turbo.DynamicThresholdFilter">
    		<Key>userId</Key>
    		<DefaultThreshold>ERROR</DefaultThreshold>
    		<OnMatch>ACCEPT</OnMatch>
    		<OnMismatch>DENY</OnMismatch>
    		<MDCValueLevelPair>
    			<value>user1</value>
    			<level>DEBUG</level>
    		</MDCValueLevelPair>
    		<MDCValueLevelPair>
    			<value>user2</value>
    			<level>TRACE</level>
    		</MDCValueLevelPair>
    
    	</turboFilter>
    
    
    	<appender name="LIST"
    		class="ch.qos.logback.core.read.ListAppender">
    	</appender>
    
    	<root>
    		<level value="DEBUG" />
    		<appender-ref ref="LIST" />
    	</root>
    </configuration>
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/unique.xml��������������������������������������0000644�0001750�0001750�00000000711�11377016712�024247� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
      <timestamp key="dayTimestamp" datePattern="yyyyMMdd'T'HHmmss" />
    
      <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <File>target/test-output/TS_${dayTimestamp}log.txt</File>
        <Append>false</Append>
        <encoder>
          <Pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</Pattern>
        </encoder>
      </appender>
    
      <root level="debug">
        <appender-ref ref="FILE" />
      </root>
    </configuration>
    �������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/statusListener.xml������������������������������0000644�0001750�0001750�00000000714�11377016712�025775� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration>
    
    <configuration debug="false">
    
    
      <statusListener class="ch.qos.logback.classic.joran.TrivialStatusListener"/>
      
      <appender name="LIST" class="ch.qos.logback.core.read.ListAppender"/>
       <logger name="ch.qos.logback.classic.joran">
        <level value="INFO" />
      </logger>
    
      <root>
        <level value="DEBUG" />
        <appender-ref ref="LIST" />
      </root>
      
    </configuration>
      ����������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/simpleList.xml����������������������������������0000644�0001750�0001750�00000000506�11377016712�025070� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration>
    
    <configuration xmlns:logback='http://ch.qos.logback/' debug="true">
    
      <appender name="LIST" class="ch.qos.logback.core.read.ListAppender"/>
        
      <root>
        <level value="DEBUG" />
        <appender-ref ref="LIST" />
      </root>
      
    </configuration>
      ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/encoderCharset.xml������������������������������0000644�0001750�0001750�00000000605�11377016712�025674� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration>
    
    <configuration debug="true">
    
      <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
          <pattern>%d - %m%n</pattern>
          <charset>UTF-8</charset>
        </encoder>
      </appender>
        
      <root level="DEBUG">
        <appender-ref ref="CONSOLE" />
      </root>
      
    </configuration>
      ���������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/contextRename.xml�������������������������������0000644�0001750�0001750�00000000106�11377016712�025553� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
      <contextName>wombat</contextName>
    </configuration>����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/simple2.xml�������������������������������������0000644�0001750�0001750�00000000640�11377016712�024315� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration>
    
    <configuration debug="true">
    
      <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
          <param name="Pattern"  value="%d - %m%n"/>  
        </layout>
      </appender>
        
      <root level="DEBUG">
        <appender-ref ref="CONSOLE" />
      </root>
      
    </configuration>
      ������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/joran/additivity.xml����������������������������������0000644�0001750�0001750�00000000271�11465030757�025117� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration>
    
    <configuration debug="false">
     <logger name="additivityTest" level="DEBUG" additivity="false"/>
    </configuration>
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/gaffer/�����������������������������������������������0000755�0001750�0001750�00000000000�12203357067�022341� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/gaffer/onTheFly.groovy��������������������������������0000644�0001750�0001750�00000000360�11377016712�025337� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������import ch.qos.logback.core.ConsoleAppender
    import ch.qos.logback.core.encoder.LayoutWrappingEncoder
    import ch.qos.logback.classic.PatternLayout
    import ch.qos.logback.classic.Level
    
    
    scan ()
    metaClass.xxx = { println "xxxxx"}
    xxx()
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/gaffer/evaluatorWithMatcher.groovy��������������������0000644�0001750�0001750�00000002327�12021754417�027754� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������//
    // Built on Wed May 19 20:51:44 CEST 2010 by logback-translator
    // For more information on configuration files in Groovy
    // please see http://logback.qos.ch/manual/groovy.html
    //
    
    import ch.qos.logback.classic.boolex.JaninoEventEvaluator
    import ch.qos.logback.classic.encoder.PatternLayoutEncoder
    import ch.qos.logback.core.ConsoleAppender
    import ch.qos.logback.core.filter.EvaluatorFilter
    
    import static ch.qos.logback.classic.Level.DEBUG
    import static ch.qos.logback.core.spi.FilterReply.DENY
    import static ch.qos.logback.core.spi.FilterReply.NEUTRAL
    import ch.qos.logback.core.boolex.Matcher
    import ch.qos.logback.core.spi.LifeCycle
    
    appender("STDOUT", ConsoleAppender) {
      filter(EvaluatorFilter) {
        evaluator(JaninoEventEvaluator) {
          Matcher aMatcher = new Matcher()
          aMatcher.name = "odd"
          aMatcher.regex = "statement [13579]"
          if(aMatcher instanceof LifeCycle)
            aMatcher.start();
          aMatcher.start();
          matcher = aMatcher
          expression = "odd.matches(formattedMessage)"
        }
        OnMismatch = NEUTRAL
        OnMatch = DENY
      }
      encoder(PatternLayoutEncoder) {
        pattern = "%-4relative [%thread] %-5level %logger - %msg%n"
      }
    }
    root(DEBUG, ["STDOUT"])
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/gaffer/smoke.groovy�����������������������������������0000644�0001750�0001750�00000000675�11377016712�024736� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������import ch.qos.logback.core.ConsoleAppender
    import ch.qos.logback.core.encoder.LayoutWrappingEncoder
    import ch.qos.logback.classic.PatternLayout
    import ch.qos.logback.classic.Level
    import ch.qos.logback.core.status.OnConsoleStatusListener
    import ch.qos.logback.classic.Logger
    
    appender("C", ConsoleAppender) {
      encoder(LayoutWrappingEncoder) {
        layout(PatternLayout) {
          pattern = "%m%n"
        }
      }
    }
    root Level.WARN, ["C"]
    �������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/gaffer/sift/������������������������������������������0000755�0001750�0001750�00000000000�12203357067�023306� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/gaffer/sift/sample1.groovy����������������������������0000644�0001750�0001750�00000001477�11465030757�026133� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * @author Ceki G&uuml;c&uuml;
     */
    
    import ch.qos.logback.classic.encoder.PatternLayoutEncoder
    
    import static ch.qos.logback.classic.Level.DEBUG
    import ch.qos.logback.classic.sift.GSiftingAppender
    import ch.qos.logback.classic.sift.MDCBasedDiscriminator
    import ch.qos.logback.core.FileAppender
    import static ch.qos.logback.classic.ClassicTestConstants.OUTPUT_DIR_PREFIX;
    
    appender("SIFT", GSiftingAppender) {
      discriminator(MDCBasedDiscriminator) {
        key = "userid"
        defaultValue = "unknown"
      }
      sift {
        appender("FILE-${userid}", FileAppender) {
          file = OUTPUT_DIR_PREFIX+"test-${userid}.log"
          append = false
          encoder(PatternLayoutEncoder) {
            println "in encoder userid=${userid}"
            pattern = "${userid} - %msg%n"
          }
        }
      }
    }
    
    root(DEBUG, ["SIFT"])
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/gaffer/sift/sample0.groovy����������������������������0000644�0001750�0001750�00000001157�11377016712�026122� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * @author Ceki G&uuml;c&uuml;
     */
    
    import ch.qos.logback.classic.encoder.PatternLayoutEncoder
    
    import static ch.qos.logback.classic.Level.DEBUG
    import ch.qos.logback.classic.sift.GSiftingAppender
    import ch.qos.logback.classic.sift.MDCBasedDiscriminator
    import ch.qos.logback.core.FileAppender
    import ch.qos.logback.core.read.ListAppender
    
    
    appender("SIFT", GSiftingAppender) {
      discriminator(MDCBasedDiscriminator) {
        key = "userid"
        defaultValue = "unknown"
      }
      sift {
        appender("LIST-${userid}", ListAppender) {
          println "USERID=$userid"
        }
      }
    }
    
    root(DEBUG, ["SIFT"])
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/gaffer/sift/noDiscriminator.groovy��������������������0000644�0001750�0001750�00000001016�11377016712�027717� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * @author Ceki G&uuml;c&uuml;
     */
    
    import ch.qos.logback.classic.encoder.PatternLayoutEncoder
    
    import static ch.qos.logback.classic.Level.DEBUG
    import ch.qos.logback.classic.sift.GSiftingAppender
    import ch.qos.logback.classic.sift.MDCBasedDiscriminator
    import ch.qos.logback.core.FileAppender
    import ch.qos.logback.core.read.ListAppender
    
    
    appender("SIFT", GSiftingAppender) {
      sift {
        appender("FILE-${userid}", ListAppender) {
          println "USERID=$userid"
        }
      }
    }
    
    root(DEBUG, ["SIFT"])
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/gaffer/propertyCascading0.groovy����������������������0000644�0001750�0001750�00000001106�11377016712�027347� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������//
    // Built on Wed May 19 20:51:44 CEST 2010 by logback-translator
    // For more information on configuration files in Groovy
    // please see http://logback.qos.ch/manual/groovy.html
    //
    
    import ch.qos.logback.core.ConsoleAppender
    
    import static ch.qos.logback.classic.Level.DEBUG
    import ch.qos.logback.core.encoder.LayoutWrappingEncoder
    import ch.qos.logback.classic.PatternLayout
    
    
    def p = "HELLO"
    appender("STDOUT", ConsoleAppender) {
      encoder(LayoutWrappingEncoder) {
        layout(PatternLayout) {
          pattern = "${p} %m%n"
        }
      }
    }
    root(DEBUG, ["STDOUT"])
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/gaffer/conversionRule.groovy��������������������������0000644�0001750�0001750�00000000600�11377016712�026621� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������import ch.qos.logback.classic.PatternLayout
    import ch.qos.logback.classic.testUtil.SampleConverter
    import ch.qos.logback.core.testUtil.StringListAppender
    
    import static ch.qos.logback.classic.Level.DEBUG
    
    conversionRule("sample", SampleConverter)
    appender("LIST", StringListAppender) {
      layout(PatternLayout) {
        Pattern = "%sample - %msg"
      }
    }
    root(DEBUG, ["LIST"])
    ��������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/gaffer/x.groovy���������������������������������������0000644�0001750�0001750�00000003130�11532660375�024057� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������import ch.qos.logback.classic.PatternLayout
    import ch.qos.logback.classic.filter.ThresholdFilter
    import ch.qos.logback.classic.net.SMTPAppender
    import ch.qos.logback.core.ConsoleAppender
    import ch.qos.logback.core.rolling.FixedWindowRollingPolicy
    import ch.qos.logback.core.rolling.RollingFileAppender
    import ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy
    
    
    import static ch.qos.logback.classic.Level.ERROR
    import static ch.qos.logback.classic.Level.INFO
    
    
    
    appender("RootFileAppender", RollingFileAppender) {
      file = "project"
      append = true
      filter(ThresholdFilter) {
        level = INFO
      }
      rollingPolicy(FixedWindowRollingPolicy) {
        fileNamePattern = "project_log.%i"
        maxIndex = 1
      }
      triggeringPolicy(SizeBasedTriggeringPolicy) {
        maxFileSize = 1000000
      }
    
      layout(PatternLayout) {
        pattern = "%d{yyyy-MM-dd HH:mm:ss}, %p, %c, %t, %ex, %F, %L, %C{1}, %M %m%n"
      }
    }
    
    appender("RootConsoleAppender", ConsoleAppender) {
      filter(ThresholdFilter) {
        level = INFO
      }
    
      layout(PatternLayout) {
        pattern = "%d{yyyy-MM-dd HH:mm:ss}, %p, %c, %t %m%n"
      }
    }
    
    appender("RootEmailAppender", SMTPAppender) {
      filter(ThresholdFilter) {
        level = ERROR
      }
      bufferSize = 10
      SMTPHost = "smtp.hostaddress"
      to = "logback.user@xyz.com"
      from = " logback.user@xyz.com "
      username = "user"
      password = "password"
      subject = "Logback Error"
    
      layout(PatternLayout) {
        pattern = "%d{yyyy-MM-dd HH:mm:ss}, %p, %c, %t, %ex, %F, %L, %C{1}, %M %m%n"
      }
    
    }
    
    root(INFO, ["RootFileAppender", "RootConsoleAppender", "RootEmailAppender"])����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/gaffer/propertyCascading2.groovy����������������������0000644�0001750�0001750�00000001117�11377016712�027353� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������//
    // Built on Wed May 19 20:51:44 CEST 2010 by logback-translator
    // For more information on configuration files in Groovy
    // please see http://logback.qos.ch/manual/groovy.html
    //
    
    import ch.qos.logback.core.ConsoleAppender
    
    import static ch.qos.logback.classic.Level.DEBUG
    import ch.qos.logback.core.encoder.LayoutWrappingEncoder
    import ch.qos.logback.classic.PatternLayout
    
    
    
    appender("STDOUT", ConsoleAppender) {
       encoder(LayoutWrappingEncoder) {
        layout(PatternLayout) {
          pattern = "${context.getProperty('p')} %m%n"
        }
      }
    }
    root(DEBUG, ["STDOUT"])
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/gaffer/propertyCascading1.groovy����������������������0000644�0001750�0001750�00000001114�11377016712�027347� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������//
    // Built on Wed May 19 20:51:44 CEST 2010 by logback-translator
    // For more information on configuration files in Groovy
    // please see http://logback.qos.ch/manual/groovy.html
    //
    
    import ch.qos.logback.core.ConsoleAppender
    
    import static ch.qos.logback.classic.Level.DEBUG
    
    import ch.qos.logback.core.encoder.LayoutWrappingEncoder
    import ch.qos.logback.classic.PatternLayout
    
    
    
    appender("STDOUT", ConsoleAppender) {
      def p = "HELLO"
      encoder(LayoutWrappingEncoder) {
        layout(PatternLayout) {
          pattern = "${p} %m%n"
        }
      }
    }
    root(DEBUG, ["STDOUT"])
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/autoConfig.xml����������������������������������������0000644�0001750�0001750�00000000574�11377016712�023735� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?>
    
    <configuration>
    
    	<appender name="AUTO_BY_SYSTEM_PROPERTY" class="ch.qos.logback.core.ConsoleAppender">
    		<layout class="ch.qos.logback.classic.PatternLayout">
    			<pattern>%msg%n"</pattern>
    		</layout>
    	</appender>
    
    	<root>
    		<level value="debug" />
    		<appender-ref ref="AUTO_BY_SYSTEM_PROPERTY" />
    	</root>
    </configuration>
    ������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/turbo/������������������������������������������������0000755�0001750�0001750�00000000000�12203357067�022242� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/turbo/inclusion/��������������������������������������0000755�0001750�0001750�00000000000�12203357067�024245� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/turbo/inclusion/topLevel0.xml�������������������������0000644�0001750�0001750�00000000334�11746201667�026646� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration>
    
    <configuration scan="true" scanPeriod="50 milliseconds">
    
      <include file="src/test/input/turbo/inclusion/inner0.xml"/>
    
    </configuration> 
           ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/turbo/inclusion/inner0.xml����������������������������0000644�0001750�0001750�00000000066�12124130066�026152� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<included>
      <root level="ERROR"/>    
    </included>
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/turbo/inclusion/topByResource.xml���������������������0000644�0001750�0001750�00000000300�11746201667�027572� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE x>
    
    
    <configuration scan="true" scanPeriod="50 milliseconds">
      <include resource="asResource/inner1.xml"/>
    </configuration> 
           
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/turbo/scan 1.xml��������������������������������������0000644�0001750�0001750�00000000271�12124130066�024017� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration>
    
    <configuration scan="true" scanPeriod="50 millisecond">
    
      <root level="ERROR"/>    
    
    </configuration> 
           ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/turbo/scan_logback_474.xml����������������������������0000644�0001750�0001750�00000000517�12143164226�025767� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
    <configuration scan="true" scanPeriod="50 millisecond">
    
      <appender name="default" class="ch.qos.logback.classic.issue.logback474.LoggingAppender">
      </appender>
    
      <logger name="Ignore" level="ERROR" additivity="false"/>
    
      <root level="INFO">    
        <appender-ref ref="default"/>
      </root> 
    
    </configuration> 
           ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/turbo/scan_perf.xml�����������������������������������0000644�0001750�0001750�00000001151�11746200065�024716� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration>
    
    <configuration debug="true" scan="true" scanPeriod="30 seconds">
    
      <appender name="FILE" class="ch.qos.logback.core.FileAppender">
       <File>target/test-output/testFile.log</File>
       <Append>true</Append>
                    
       <layout class="ch.qos.logback.classic.PatternLayout">
         <Pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</Pattern>
       </layout>
      </appender>
    
    
      <!-- level should be ERROR so as not to incur IO -->
      <root level="ERROR">
        <appender-ref ref="FILE"/>
      </root> 
    
    </configuration> 
           �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/turbo/scan 1.groovy�����������������������������������0000644�0001750�0001750�00000000142�12124130071�024535� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������import static ch.qos.logback.classic.Level.ERROR
    
    scan("50 millisecond")
    root(ERROR)
    
           ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/osgi/�������������������������������������������������0000755�0001750�0001750�00000000000�12203357067�022050� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/input/osgi/simple.xml���������������������������������������0000644�0001750�0001750�00000000720�11377016712�024062� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration>
    
    <configuration debug="false">
    
      <appender name="LIST" class="ch.qos.logback.core.FileAppender">
        <file>target/test-output/osgi-test.log</file>
        <layout>
          <pattern>%d %level - %m%n</pattern>
        </layout>
      </appender>
      
      <logger name="ch.qos.logback.classic.joran" level="INFO" />
    
      <root level="DEBUG">
        <appender-ref ref="LIST" />
      </root>
    
    </configuration>
    ������������������������������������������������logback_1.0.13/logback-classic/src/test/java/�������������������������������������������������������0000755�0001750�0001750�00000000000�12120365654�020670� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/integrator/��������������������������������������������0000755�0001750�0001750�00000000000�12203357067�023047� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/integrator/Activator.java������������������������������0000644�0001750�0001750�00000004054�12136042271�025642� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package integrator;
    
    import org.osgi.framework.Bundle;
    import org.osgi.framework.BundleActivator;
    import org.osgi.framework.BundleContext;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.util.StatusPrinter;
    
    /**
     * A BundleActivator which invokes slf4j loggers
     * @author Ceki G&uuml;lc&uuml;
     *
     */
    public class Activator implements BundleActivator {
    
      private BundleContext m_context = null;
    
      public void start(BundleContext context) {
        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
        
        try {
          JoranConfigurator configurator = new JoranConfigurator();
          configurator.setContext(lc);
          // the context was probably already configured by default configuration 
          // rules
          lc.reset(); 
          configurator.doConfigure("src/test/input/osgi/simple.xml");
        } catch (JoranException je) {
           je.printStackTrace();
        }
        StatusPrinter.printInCaseOfErrorsOrWarnings(lc);
    
        
        Logger logger = LoggerFactory.getLogger(this.getClass());
        logger.info("Activator.start()");
        m_context = context;
      }
    
      public void stop(BundleContext context) {
        m_context = null;
        Logger logger = LoggerFactory.getLogger(this.getClass());
        logger.info("Activator.stop");
      }
    
      public Bundle[] getBundles() {
        if (m_context != null) {
          return m_context.getBundles();
        }
        return null;
      }
    }������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/org/���������������������������������������������������0000755�0001750�0001750�00000000000�11506604157�021460� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/org/slf4j/���������������������������������������������0000755�0001750�0001750�00000000000�12203357067�022502� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/org/slf4j/test_osgi/�����������������������������������0000755�0001750�0001750�00000000000�12203357067�024502� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/org/slf4j/test_osgi/FrameworkErrorListener.java��������0000644�0001750�0001750�00000002727�12136042271�032023� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package org.slf4j.test_osgi;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import org.osgi.framework.FrameworkEvent;
    import org.osgi.framework.FrameworkListener;
    
    public class FrameworkErrorListener implements FrameworkListener {
    
      public List errorList = new ArrayList();
      
      @SuppressWarnings("unchecked")
      public void frameworkEvent(FrameworkEvent fe) {
        if (fe.getType() == FrameworkEvent.ERROR) {
          errorList.add(fe);
        }
      }
      
      private void dump(FrameworkEvent fe) {
        Throwable t = fe.getThrowable();
        String tString = null;
        if (t != null) {
          tString = t.toString();
        }
        System.out.println("Framework ERROR:" + ", source " + fe.getSource()
            + ", bundle=" + fe.getBundle() + ", ex=" + tString);
        if(t != null) {
          t.printStackTrace();
        }
      }
    
      public void dumpAll() {
        for(int i = 0; i < errorList.size(); i++) {
          FrameworkEvent fe = (FrameworkEvent) errorList.get(i);
          dump(fe);
        }
      }
    }
    �����������������������������������������logback_1.0.13/logback-classic/src/test/java/org/slf4j/test_osgi/CheckingBundleListener.java��������0000644�0001750�0001750�00000003071�12136042271�031712� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package org.slf4j.test_osgi;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import org.osgi.framework.Bundle;
    import org.osgi.framework.BundleEvent;
    import org.osgi.framework.BundleListener;
    
    public class CheckingBundleListener implements BundleListener {
    
      List eventList = new ArrayList();
    
      @SuppressWarnings("unchecked")
      public void bundleChanged(BundleEvent be) {
        eventList.add(be);
      }
    
      private void dump(BundleEvent be) {
        System.out.println("BE:" + ", source " + be.getSource() + ", bundle="
            + be.getBundle() + ", type=" + be.getType());
    
      }
    
      public void dumpAll() {
        for (int i = 0; i < eventList.size(); i++) {
          BundleEvent fe = (BundleEvent) eventList.get(i);
          dump(fe);
        }
      }
    
      boolean exists(String bundleName) {
        for (int i = 0; i < eventList.size(); i++) {
          BundleEvent fe = (BundleEvent) eventList.get(i);
          Bundle b = fe.getBundle();
          System.out.println("===["+b+"]");
          if (bundleName.equals(b.getSymbolicName())) {
            return true;
          }
        }
        return false;
      }
    
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/org/slf4j/test_osgi/BundleTest.java��������������������0000644�0001750�0001750�00000002527�12136042271�027415� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package org.slf4j.test_osgi;
    
    import java.io.File;
    
    import junit.framework.TestCase;
    
    public class BundleTest extends TestCase {
    
      FrameworkErrorListener fel = new FrameworkErrorListener();
      CheckingBundleListener mbl = new CheckingBundleListener();
      
      FelixHost felixHost = new FelixHost(fel, mbl);
      
      protected void setUp() throws Exception {
        super.setUp();
        felixHost.doLaunch();
      }
    
      protected void tearDown() throws Exception {
        super.tearDown();
        felixHost.stop();
      }
    
      public void testSmoke() {
        System.out.println("==========="+new File(".").getAbsolutePath());
        mbl.dumpAll();
        // check that the bundle was installed
        assertTrue(mbl.exists("iBundle"));
        if(fel.errorList.size() != 0) {
          fel.dumpAll(); 
        }
        // check that no errors occured
        assertEquals(0, fel.errorList.size());
      }
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/org/slf4j/test_osgi/FelixHost.java���������������������0000644�0001750�0001750�00000010144�12136042271�027243� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package org.slf4j.test_osgi;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    import java.util.Properties;
    
    import org.apache.felix.framework.Felix;
    import org.apache.felix.framework.util.FelixConstants;
    import org.apache.felix.framework.util.StringMap;
    import org.apache.felix.main.AutoProcessor;
    import org.osgi.framework.Bundle;
    import org.osgi.framework.BundleContext;
    import org.osgi.framework.BundleException;
    import org.osgi.framework.Constants;
    
    /**
     * Runs a hosted version of Felix for testing purposes. Any bundle errors are
     * reported via the FrameworkListener passed to the constructor.
     * 
     * @author Ceki G&uuml;c&uuml;
     */
    public class FelixHost {
    
      private Felix felix = null;
    
      Properties otherProps = new Properties();
    
      final FrameworkErrorListener frameworkErrorListener;
      final CheckingBundleListener myBundleListener;
    
      public FelixHost(FrameworkErrorListener frameworkErrorListener,
          CheckingBundleListener myBundleListener) {
        this.frameworkErrorListener = frameworkErrorListener;
        this.myBundleListener = myBundleListener;
      }
    
      @SuppressWarnings("unchecked")
      public void doLaunch() {
        // Create a case-insensitive configuration property map.
        Map configMap = new StringMap(false);
        // Configure the Felix instance to be embedded.
        // configMap.put(FelixConstants.EMBEDDED_EXECUTION_PROP, "true");
        // Add core OSGi packages to be exported from the class path
        // via the system bundle.
        configMap.put(Constants.FRAMEWORK_SYSTEMPACKAGES,
            "org.osgi.framework; version=1.3.0,"
                + "org.osgi.service.packageadmin; version=1.2.0,"
                + "org.osgi.service.startlevel; version=1.0.0,"
                + "org.osgi.service.url; version=1.0.0");
    
        configMap.put(Constants.FRAMEWORK_STORAGE_CLEAN,
            Constants.FRAMEWORK_STORAGE_CLEAN_ONFIRSTINIT);
    
        // Explicitly specify the directory to use for caching bundles.
        // configMap.put(BundleCache.CACHE_PROFILE_DIR_PROP, "cache");
    
        try {
          // Create host activator;
    
          List list = new ArrayList();
    
          // list.add(new HostActivator());
          configMap.put(Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA,
              "org.xml.sax, org.xml.sax.helpers, javax.xml.parsers, javax.naming");
          configMap.put(FelixConstants.SYSTEMBUNDLE_ACTIVATORS_PROP, list);
          configMap.put("felix.log.level", "4");
    
          // Now create an instance of the framework with
          // our configuration properties and activator.
          felix = new Felix(configMap);
          felix.init();
    
          // otherProps.put(Constants.FRAMEWORK_STORAGE, "bundles");
    
           otherProps.put(AutoProcessor.AUTO_DEPLOY_DIR_PROPERY,
           AutoProcessor.AUTO_DEPLOY_DIR_VALUE);
          otherProps.put(AutoProcessor.AUTO_DEPLOY_ACTION_PROPERY,
              AutoProcessor.AUTO_DEPLOY_START_VALUE + ","
                  + AutoProcessor.AUTO_DEPLOY_INSTALL_VALUE);
    
          BundleContext felixBudleContext = felix.getBundleContext();
    
          AutoProcessor.process(otherProps, felixBudleContext);
          // listen to errors
          felixBudleContext.addFrameworkListener(frameworkErrorListener);
          felixBudleContext.addBundleListener(myBundleListener);
          // Now start Felix instance.
          felix.start();
          System.out.println("felix started");
    
        } catch (Exception ex) {
          ex.printStackTrace();
        }
      }
    
      public void stop() throws BundleException {
        felix.stop();
      }
    
      public Bundle[] getInstalledBundles() {
        // Use the system bundle activator to gain external
        // access to the set of installed bundles.
        return null;// m_activator.getBundles();
      }
    }����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/org/slf4j/LoggerFactoryFriend.java���������������������0000644�0001750�0001750�00000001145�12136042271�027236� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package org.slf4j;
    
    public class LoggerFactoryFriend {
      static public void reset() {
        LoggerFactory.reset(); 
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/org/slf4j/impl/����������������������������������������0000755�0001750�0001750�00000000000�12203357067�023443� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/org/slf4j/impl/InitializationOutputTest.java�����������0000644�0001750�0001750�00000004120�12136042271�031344� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package org.slf4j.impl;
    
    import ch.qos.logback.classic.ClassicTestConstants;
    import ch.qos.logback.classic.util.ContextInitializer;
    import ch.qos.logback.core.status.NopStatusListener;
    import ch.qos.logback.core.testUtil.RandomUtil;
    import ch.qos.logback.core.util.TeeOutputStream;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import java.io.PrintStream;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.fail;
    
    /**
     * @author Ceki G&uuml;c&uuml;
     */
    public class InitializationOutputTest {
    
      int diff = RandomUtil.getPositiveInt();
    
      TeeOutputStream tee;
      PrintStream original;
    
      @Before
      public void setUp()  {
        original = System.out;
        // tee will output bytes on System out but it will also
        // collect them so that the output can be compared against
        // some expected output data
    
        // keep the console quiet
        tee = new TeeOutputStream(null);
    
        // redirect System.out to tee
        System.setOut(new PrintStream(tee));
      }
    
      @After
      public void tearDown()  {
        System.setOut(original);
        System.clearProperty(ContextInitializer.CONFIG_FILE_PROPERTY);
        System.clearProperty(ContextInitializer.STATUS_LISTENER_CLASS);
      }
    
    
      @Test
      public void noOutputIfContextHasAStatusListener() {
        System.setProperty(ContextInitializer.CONFIG_FILE_PROPERTY, ClassicTestConstants.INPUT_PREFIX + "issue/logback292.xml");
        System.setProperty(ContextInitializer.STATUS_LISTENER_CLASS, NopStatusListener.class.getName());
    
        StaticLoggerBinderFriend.reset();
        assertEquals(0, tee.baos.size());
      }
    
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/org/slf4j/impl/PackageTest.java������������������������0000644�0001750�0001750�00000001507�12136042271�026475� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package org.slf4j.impl;
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    import org.junit.runners.Suite.SuiteClasses;
    
    import ch.qos.logback.classic.LoggerPerfTest;
    
    @RunWith(Suite.class)
    @SuiteClasses( { RecursiveInitializationTest.class, LoggerPerfTest.class, InitializationOutputTest.class})
    public class PackageTest {
    
    }�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/org/slf4j/impl/StaticLoggerBinderFriend.java�����������0000644�0001750�0001750�00000001432�12136042271�031142� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package org.slf4j.impl;
    
    /**
     * This class grants public access to package protected methods of
     * StaticLoggerBinder. Used for testing purposes.
     * 
     * @author Ceki Gulcu
     * 
     */
    public class StaticLoggerBinderFriend {
     
      static public void reset() {
        StaticLoggerBinder.reset();
      }
    
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/org/slf4j/impl/RecursiveLBAppender.java����������������0000644�0001750�0001750�00000003063�12136042271�030145� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package org.slf4j.impl;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import ch.qos.logback.classic.PatternLayout;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.AppenderBase;
    import ch.qos.logback.core.testUtil.RandomUtil;
    
    public class RecursiveLBAppender extends AppenderBase<ILoggingEvent> {
    
      public List<ILoggingEvent> list = new ArrayList<ILoggingEvent>();
      public List<String> stringList = new ArrayList<String>();
      
      PatternLayout layout;
      
      public RecursiveLBAppender() {
        this(null);
      }
      
      public RecursiveLBAppender(PatternLayout layout) {
        this.layout = layout;
      }
      
      @Override
      public void start() {
        int diff = RandomUtil.getPositiveInt();
        Logger logger = LoggerFactory.getLogger("ResursiveLBAppender"+diff);
        logger.info("testing");
        super.start();
      }
      
      protected void append(ILoggingEvent e) {
        list.add(e);
        if(layout != null) {
          String s = layout.doLayout(e);
          stringList.add(s);
        }
      }
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/org/slf4j/impl/RecursiveInitializationTest.java��������0000644�0001750�0001750�00000003742�12136042271�032024� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package org.slf4j.impl;
    
    import static org.junit.Assert.assertEquals;
    
    import ch.qos.logback.core.status.StatusChecker;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.slf4j.LoggerFactoryFriend;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.util.ContextInitializer;
    import ch.qos.logback.core.status.Status;
    import ch.qos.logback.core.testUtil.RandomUtil;
    import ch.qos.logback.core.util.StatusPrinter;
    
    public class RecursiveInitializationTest {
    
      int diff = RandomUtil.getPositiveInt();
    
      @Before
      public void setUp() throws Exception {
        System.setProperty(ContextInitializer.CONFIG_FILE_PROPERTY,
            "recursiveInit.xml");
        StaticLoggerBinderFriend.reset();
        LoggerFactoryFriend.reset();
    
      }
    
      @After
      public void tearDown() throws Exception {
        System.clearProperty(ContextInitializer.CONFIG_FILE_PROPERTY);
      }
    
      @Test
      public void recursiveLogbackInitialization() {
        Logger logger = LoggerFactory.getLogger("RecursiveInitializationTest"
            + diff);
        logger.info("RecursiveInitializationTest");
    
        LoggerContext loggerContext = (LoggerContext) LoggerFactory
            .getILoggerFactory();
        StatusPrinter.printInCaseOfErrorsOrWarnings(loggerContext);
        StatusChecker statusChecker = new StatusChecker(loggerContext);
        assertEquals("Was expecting no errors", Status.WARN, statusChecker.getHighestLevel(0));
      }
    
    }
    ������������������������������logback_1.0.13/logback-classic/src/test/java/org/dummy/���������������������������������������������0000755�0001750�0001750�00000000000�12203357067�022613� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/org/dummy/Log4jInvocation.java�������������������������0000644�0001750�0001750�00000005024�12136042271�026461� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package org.dummy;
    
    import static org.junit.Assert.assertEquals;
    
    import org.apache.log4j.Logger;
    import org.junit.Before;
    import org.junit.Test;
    import org.slf4j.LoggerFactory;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.PatternLayout;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    
    /**
     * Used to test log4j-over-slf4j
     * 
     * @author Ceki Gulcu
     *
     */
    public class Log4jInvocation {
    
      static final String HELLO = "Hello";
    
      DummyLBAppender listAppender;
      LoggerContext lc;
      ch.qos.logback.classic.Logger rootLogger;
      
      @Before
      public void fixture() {
        lc = (LoggerContext) LoggerFactory.getILoggerFactory();
        lc.reset();
    
        listAppender = new DummyLBAppender();
        listAppender.setContext(lc);
        listAppender.start();
        rootLogger = lc.getLogger("root");
        rootLogger.addAppender(listAppender);
      }
    
      @Test
      public void basic() {
        assertEquals(0, listAppender.list.size());
    
        Logger logger = Logger.getLogger("basic-test");
        logger.debug(HELLO);
    
        assertEquals(1, listAppender.list.size());
        ILoggingEvent event = (ILoggingEvent) listAppender.list.get(0);
        assertEquals(HELLO, event.getMessage());
      }
    
      @Test
      public void callerData() {
        assertEquals(0, listAppender.list.size());
    
        PatternLayout pl = new PatternLayout();
        pl.setPattern("%-5level [%class] %logger - %msg");
        pl.setContext(lc);
        pl.start();
        listAppender.layout = pl;
    
        Logger logger = Logger.getLogger("basic-test");
        logger.trace("none");
        assertEquals(0, listAppender.list.size());
        
        rootLogger.setLevel(Level.TRACE);
        logger.trace(HELLO);
        assertEquals(1, listAppender.list.size());
    
        ILoggingEvent event = (ILoggingEvent) listAppender.list.get(0);
        assertEquals(HELLO, event.getMessage());
    
        assertEquals(1, listAppender.stringList.size());
        assertEquals("TRACE [" + Log4jInvocation.class.getName()
            + "] basic-test - Hello", listAppender.stringList.get(0));
      }
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/org/dummy/DummyLBAppender.java�������������������������0000644�0001750�0001750�00000002317�12136042271�026442� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package org.dummy;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import ch.qos.logback.classic.PatternLayout;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.AppenderBase;
    
    public class DummyLBAppender extends AppenderBase<ILoggingEvent> {
    
      public List<ILoggingEvent> list = new ArrayList<ILoggingEvent>();
      public List<String> stringList = new ArrayList<String>();
      
      PatternLayout layout;
      
      DummyLBAppender() {
        this(null);
      }
      
      DummyLBAppender(PatternLayout layout) {
        this.layout = layout;
      }
      
      protected void append(ILoggingEvent e) {
        list.add(e);
        if(layout != null) {
          String s = layout.doLayout(e);
          stringList.add(s);
        }
      }
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/����������������������������������������������������0000755�0001750�0001750�00000000000�11506604157�021263� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/������������������������������������������������0000755�0001750�0001750�00000000000�11506604157�022065� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/����������������������������������������0000755�0001750�0001750�00000000000�11506604157�023467� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/��������������������������������0000755�0001750�0001750�00000000000�12203357067�025110� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/LoggerTestHelper.java�����������0000644�0001750�0001750�00000002113�12136042271�031160� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.Logger;
    import junit.framework.*;
    
    public class LoggerTestHelper extends TestCase {
    
    
      static void assertNameEquals(Logger logger, String name)  {
        assertNotNull(logger);
        assertEquals(name, logger.getName());
      }
      static void assertLevels(Level level, Logger logger, Level effectiveLevel)  {
        if(level == null) {
        assertNull(logger.getLevel());
        } else {
          assertEquals(level, logger.getLevel());
        }
        assertEquals(effectiveLevel, logger.getEffectiveLevel());
      }
    }�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/AllClassicTest.java�������������0000644�0001750�0001750�00000003345�12136042271�030623� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic;
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    import org.junit.runners.Suite.SuiteClasses;
    
    @RunWith(Suite.class)
    @SuiteClasses({org.slf4j.impl.PackageTest.class,
            ch.qos.logback.classic.PackageTest.class,
            ch.qos.logback.classic.util.PackageTest.class,
            ch.qos.logback.classic.control.PackageTest.class,
            ch.qos.logback.classic.joran.PackageTest.class,
            ch.qos.logback.classic.rolling.PackageTest.class,
            ch.qos.logback.classic.jmx.PackageTest.class,
            ch.qos.logback.classic.boolex.PackageTest.class,
            ch.qos.logback.classic.selector.PackageTest.class,
            ch.qos.logback.classic.html.PackageTest.class, 
            ch.qos.logback.classic.net.PackageTest.class,
            ch.qos.logback.classic.pattern.PackageTest.class,
            ch.qos.logback.classic.encoder.PackageTest.class,
            ch.qos.logback.classic.db.PackageTest.class,
            ch.qos.logback.classic.spi.PackageTest.class,
            ch.qos.logback.classic.turbo.PackageTest.class,
            ch.qos.logback.classic.sift.PackageTest.class,
            ch.qos.logback.classic.jul.PackageTest.class,
            ch.qos.logback.classic.issue.PackageTest.class})
    public class AllClassicTest {
    
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/HLogger.java��������������������0000644�0001750�0001750�00000026714�12136042271�027305� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Map;
    
    import org.slf4j.helpers.MarkerIgnoringBase;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.Appender;
    import ch.qos.logback.core.CoreConstants;
    
    
    public class HLogger extends MarkerIgnoringBase {
    
      private static final long serialVersionUID = 1L;
    
      static int instanceCount = 0;
    
      /**
       * The name of this logger
       */
      private String name;
    
      // The assigned levelInt of this logger. Can be null.
      private Level level;
    
      // The effective levelInt is the assigned levelInt and if null, a levelInt is
      // inherited form a parent.
      private Level effectiveLevel;
    
      /**
       * The parent of this category. All categories have at least one ancestor
       * which is the root category.
       */
      HLogger parent;
    
      /**
       * The children of this logger. A logger may have zero or more children.
       */
      Map<String, HLogger> childrenMap;
    
      /**
       * Array of appenders.
       */
      private ArrayList<Appender<ILoggingEvent>> appenderList;
    
      /**
       * Additivity is set to true by default, that is children inherit the
       * appenders of their ancestors by default. If this variable is set to
       * <code>false</code> then the appenders located in the ancestors of this
       * logger will not be used. However, the children of this logger will inherit
       * its appenders, unless the children have their additivity flag set to
       * <code>false</code> too. See the user manual for more details.
       */
      protected boolean additive = true;
    
      HLogger(String name, HLogger parent) {
        this.name = name;
        this.parent = parent;
        instanceCount++;
      }
    
      Level getEffectiveLevel() {
        return effectiveLevel;
      }
    
      Level getLevel() {
        return level;
      }
    
      public String getName() {
        return name;
      }
    
      private boolean isRootLogger() {
        // only the root logger has a null parent
        return parent == null;
      }
    
      /**
       * Get a child by its suffix.
       * 
       * <p>
       * IMPORTANT: Calls to this method must be within a syncronized block on this
       * logger!
       * 
       * @param suffix
       * @return
       */
      HLogger getChildBySuffix(final String suffix) {
        if (childrenMap == null) {
          return null;
        } else {
          return (HLogger) childrenMap.get(suffix);
        }
      }
    
      public synchronized void setLevel(Level newLevel) {
        if (level == newLevel) {
          // nothing to do;
          return;
        }
    
        level = newLevel;
        effectiveLevel = newLevel;
        if (childrenMap != null) {
          for (Iterator<HLogger> i = childrenMap.values().iterator(); i.hasNext();) {
            HLogger child = (HLogger) i.next();
    
            // tell child to handle parent levelInt change
            child.handleParentLevelChange(effectiveLevel);
          }
        }
      }
    
      /**
       * This method is invoked by parent logger to let this logger know that the
       * prent's levelInt changed.
       * 
       * @param newParentLevel
       */
      private synchronized void handleParentLevelChange(Level newParentLevel) {
        // changes in the parent levelInt affect children only if their levelInt is
        // null
        if (level == null) {
          effectiveLevel = newParentLevel;
    
          // propagate the parent levelInt change to this logger's children
          if (childrenMap != null) {
            for (Iterator<HLogger> i = childrenMap.values().iterator(); i.hasNext();) {
              HLogger child = (HLogger) i.next();
              // tell child to handle parent levelInt change
              child.handleParentLevelChange(effectiveLevel);
            }
          }
        }
      }
    
      /**
       * Remove all previously added appenders from this logger instance. <p/> This
       * is useful when re-reading configuration information.
       */
      public synchronized void removeAllAppenders() {
        if (appenderList != null) {
          int len = appenderList.size();
          for (int i = 0; i < len; i++) {
            Appender<ILoggingEvent> a = appenderList.get(i);
            a.stop();
          }
          appenderList.clear();
          appenderList = null;
        }
      }
    
      /**
       * Invoke all the appenders of this logger.
       * 
       * @param event
       *          The event to log
       */
      public void callAppenders(ILoggingEvent event) {
        int writes = 0;
    
        for (HLogger l = this; l != null; l = l.parent) {
          // Protected against simultaneous call to addAppender, removeAppender,...
          synchronized (l) {
            if (l.appenderList != null) {
              writes += l.appendLoopOnAppenders(event);
            }
            if (!l.additive) {
              break;
            }
          }
        }
    
        // No appenders in hierarchy, warn user only once.
        // if(!hierarchy.emittedNoAppenderWarning && writes == 0) {
        // LogLog.error("No appenders could be found for category (" +
        // this.getName() + ").");
        // LogLog.error("Please initialize the log4j system properly.");
        // hierarchy.emittedNoAppenderWarning = true;
        // }
      }
    
      private int appendLoopOnAppenders(ILoggingEvent event) {
        int size = 0;
        Appender<ILoggingEvent> appender;
    
        if (appenderList != null) {
          size = appenderList.size();
          for (int i = 0; i < size; i++) {
            appender = appenderList.get(i);
            appender.doAppend(event);
          }
        }
        return size;
      }
    
      /**
       * Remove the appender passed as parameter form the list of appenders.
       */
      public synchronized void removeAppender(Appender<ILoggingEvent> appender) {
        if ((appender == null) || (appenderList == null)) {
        }
        appenderList.remove(appender);
      }
    
      /**
       * Create a child of this logger by suffix, that is, the part of the name
       * extending this logger. For example, if this logger is named "x.y" and the
       * lastPart is "z", then the created child logger will be named "x.y.z".
       * 
       * <p>
       * IMPORTANT: Calls to this method must be within a syncronized block on this
       * logger.
       * 
       * @param lastPart
       *          the suffix (i.e. last part) of the child logger name. This
       *          parameter may not include dots, i.e. the logger separator
       *          character.
       * @return
       */
      HLogger createChildByLastNamePart(final String lastPart) {
        int i_index = lastPart.indexOf(CoreConstants.DOT);
        if (i_index != -1) {
          throw new IllegalArgumentException("Child name [" + lastPart
              + " passed as parameter, may not include [" + CoreConstants.DOT
              + "]");
        }
    
        if (childrenMap == null) {
          childrenMap = new HashMap<String, HLogger>(2);
        }
        HLogger childHLogger;
        if (this.isRootLogger()) {
          childHLogger = new HLogger(lastPart, this);
        } else {
          childHLogger = new HLogger(name + CoreConstants.DOT + lastPart,
              this);
        }
        childrenMap.put(lastPart, childHLogger);
        childHLogger.effectiveLevel = this.effectiveLevel;
        return childHLogger;
      }
      
      public final void trace(String msg) {
        if (effectiveLevel.levelInt <= Level.TRACE_INT) {
          throw new UnsupportedOperationException("not yet implemented");
        }
      }
    
      public void trace(String msg, Throwable t) {
        // To change body of implemented methods use File | Settings | File
        // Templates.
      }
    
      public void trace(Object parameterizedMsg, Object param1) {
        // To change body of implemented methods use File | Settings | File
        // Templates.
      }
    
      public void trace(String parameterizedMsg, Object param1, Object param2) {
        // To change body of implemented methods use File | Settings | File
        // Templates.
      }
    
      
    
      public final void debug(String msg) {
        if (effectiveLevel.levelInt <= Level.DEBUG_INT) {
          throw new UnsupportedOperationException("not yet implemented");
        }
      }
    
      public void debug(String msg, Throwable t) {
        // To change body of implemented methods use File | Settings | File
        // Templates.
      }
    
      public void debug(Object parameterizedMsg, Object param1) {
        // To change body of implemented methods use File | Settings | File
        // Templates.
      }
    
      public void debug(String parameterizedMsg, Object param1, Object param2) {
        // To change body of implemented methods use File | Settings | File
        // Templates.
      }
    
      public void error(String msg) {
        // To change body of implemented methods use File | Settings | File
        // Templates.
      }
    
      public void error(String msg, Throwable t) {
        // To change body of implemented methods use File | Settings | File
        // Templates.
      }
    
      public void error(String parameterizedMsg, Object param1) {
        // To change body of implemented methods use File | Settings | File
        // Templates.
      }
    
      public void error(String parameterizedMsg, Object param1, Object param2) {
        // To change body of implemented methods use File | Settings | File
        // Templates.
      }
    
      public void info(String msg) {
        // To change body of implemented methods use File | Settings | File
        // Templates.
      }
    
      public void info(String msg, Throwable t) {
        // To change body of implemented methods use File | Settings | File
        // Templates.
      }
    
      public void info(String parameterizedMsg, Object param1) {
        // To change body of implemented methods use File | Settings | File
        // Templates.
      }
    
      public void info(String parameterizedMsg, Object param1, Object param2) {
        // To change body of implemented methods use File | Settings | File
        // Templates.
      }
    
      public boolean isTraceEnabled() {
        return false; 
      }
      
      public boolean isDebugEnabled() {
        return false; 
      }
    
      public boolean isErrorEnabled() {
        return false; // To change body of implemented methods use File | Settings |
        // File Templates.
      }
    
      public boolean isInfoEnabled() {
        return false; // To change body of implemented methods use File | Settings |
        // File Templates.
      }
    
      public boolean isWarnEnabled() {
        return false; // To change body of implemented methods use File | Settings |
        // File Templates.
      }
    
      public void warn(String msg) {
        // To change body of implemented methods use File | Settings | File
        // Templates.
      }
    
      public void warn(String msg, Throwable t) {
        // To change body of implemented methods use File | Settings | File
        // Templates.
      }
    
      public void warn(String parameterizedMsg, Object param1) {
        // To change body of implemented methods use File | Settings | File
        // Templates.
      }
    
      public void warn(String parameterizedMsg, Object param1, Object param2) {
        // To change body of implemented methods use File | Settings | File
        // Templates.
      }
    
      public void trace(String format, Object arg) {
      }
    
      public void trace(String format, Object[] argArray) {
      }
      
      public void debug(String format, Object arg) {
      }
    
      public void debug(String format, Object[] argArray) {
      }
    
      public void info(String format, Object[] argArray) {
      }
    
      public void warn(String format, Object[] argArray) {
      }
    
      public void error(String format, Object[] argArray) {
      }
    }
    ����������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/control/������������������������0000755�0001750�0001750�00000000000�12203357067�026570� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/control/CreateLogger.java�������0000644�0001750�0001750�00000001521�12136042271�031766� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.control;
    
    
    public class CreateLogger extends ScenarioAction {
    
      final String loggerName;
    
      public CreateLogger(String loggerName) {
        this.loggerName = loggerName;
      }
    
      public String getLoggerName() {
        return loggerName;
      }
    
      public String toString() {
        return "CreateLogger("+loggerName+")";
      }
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/control/Scenario.java�����������0000644�0001750�0001750�00000002044�12136042271�031167� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.control;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Vector;
    
    public class Scenario {
    
      private List<ScenarioAction> actionList = new Vector<ScenarioAction>();
    
      public void add(ScenarioAction action) {
        actionList.add(action);
      }
    
      public List<ScenarioAction> getActionList() {
        return new ArrayList<ScenarioAction>(actionList);
      }
    
      public int size() {
        return actionList.size();
      }
    
      public ScenarioAction get(int i) {
        return (ScenarioAction) actionList.get(i);
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/control/CLCTest.java������������0000644�0001750�0001750�00000003251�12136042271�030666� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.control;
    
    import junit.framework.TestCase;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.control.ControlLogger;
    import ch.qos.logback.classic.control.ControlLoggerContext;
    
    
    /**
     * This class is for testing ControlLoggerContext which is a control class for testing HLoggerContext.
     */
    public class CLCTest extends TestCase {
      ControlLoggerContext clc;
    
    
      protected void setUp() throws Exception {
        clc = new ControlLoggerContext();
      }
    
      public void test1() {
        ControlLogger x = clc.getLogger("x");
        assertEquals("x", x.getName());
        assertEquals(clc.getRootLogger(), x.parent);
    
        ControlLogger abc = clc.getLogger("a.b.c");
        assertEquals("a.b.c", abc.getName());
        assertEquals(Level.DEBUG, abc.getEffectiveLevel());
      }
    
      public void testCreation() {
        ControlLogger xyz = clc.getLogger("x.y.z");
        assertEquals("x.y.z", xyz.getName());
        assertEquals("x.y", xyz.parent.getName());
        assertEquals("x", xyz.parent.parent.getName());
        assertEquals("root", xyz.parent.parent.parent.getName());
    
        ControlLogger xyz_ = clc.exists("x.y.z");
        assertEquals("x.y.z", xyz_.getName());
    
    
      }
    }�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/control/ControlLogger.java������0000644�0001750�0001750�00000013205�12136042271�032205� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.control;
    
    import org.slf4j.helpers.MarkerIgnoringBase;
    
    import ch.qos.logback.classic.Level;
    
    /**
     * See javadoc for ControlLoggerContext.
     */
    public class ControlLogger extends MarkerIgnoringBase {
    
      private static final long serialVersionUID = 1L;
      final ControlLogger parent;
      final String name;
      Level level;
    
    
      public ControlLogger(String name, ControlLogger parent) {
        if(name == null){
         throw new IllegalArgumentException("name cannot be null");
        }
        this.name = name;
        this.parent = parent;
      }
      public String getName() {
        return name;
      }
    
      public Level getLevel() {
        return level;
      }
    
      public void setLevel(Level level) {
        this.level = level;
      }
    
      public final Level getEffectiveLevel() {
        for(ControlLogger cl = this; cl != null; cl=cl.parent) {
          if(cl.level != null)
            return cl.level;
        }
        return null; // If reached will cause an NullPointerException.
      }
    
      public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof ControlLogger)) return false;
    
        final ControlLogger controlLogger = (ControlLogger) o;
        return name.equals(controlLogger.name);
      }
    
      public int hashCode() {
        return name.hashCode();
      }
    
      public final void trace(String o) {
        if(getEffectiveLevel().levelInt <= Level.TRACE_INT ) {
          throw new UnsupportedOperationException("not yet implemented");
        }
      }
    
      public void trace(String msg, Throwable t) {
        //To change body of implemented methods use File | Settings | File Templates.
      }
    
      public void trace(String parameterizedMsg, Object param1) {
        //To change body of implemented methods use File | Settings | File Templates.
      }
    
      public void trace(String parameterizedMsg, Object param1, Object param2) {
        //To change body of implemented methods use File | Settings | File Templates.
      }
      
      public final void debug(String o) {
        if(getEffectiveLevel().levelInt <= Level.DEBUG_INT ) {
          throw new UnsupportedOperationException("not yet implemented");
        }
      }
    
      public void debug(String msg, Throwable t) {
        //To change body of implemented methods use File | Settings | File Templates.
      }
    
      public void debug(String parameterizedMsg, Object param1) {
        //To change body of implemented methods use File | Settings | File Templates.
      }
    
      public void debug(String parameterizedMsg, Object param1, Object param2) {
        //To change body of implemented methods use File | Settings | File Templates.
      }
    
      public void error(String msg) {
        //To change body of implemented methods use File | Settings | File Templates.
      }
    
      public void error(String msg, Throwable t) {
        //To change body of implemented methods use File | Settings | File Templates.
      }
    
      public void error(String parameterizedMsg, Object param1) {
        //To change body of implemented methods use File | Settings | File Templates.
      }
    
      public void error(String parameterizedMsg, Object param1, Object param2) {
        //To change body of implemented methods use File | Settings | File Templates.
      }
    
      public void info(String msg) {
        //To change body of implemented methods use File | Settings | File Templates.
      }
    
      public void info(String msg, Throwable t) {
        //To change body of implemented methods use File | Settings | File Templates.
      }
    
      public void info(String parameterizedMsg, Object param1) {
        //To change body of implemented methods use File | Settings | File Templates.
      }
    
      public void info(String parameterizedMsg, Object param1, Object param2) {
        //To change body of implemented methods use File | Settings | File Templates.
      }
    
      public boolean isTraceEnabled() {
        return false;  
      }
      
      public boolean isDebugEnabled() {
        return false;  //To change body of implemented methods use File | Settings | File Templates.
      }
    
      public boolean isErrorEnabled() {
        return false;  //To change body of implemented methods use File | Settings | File Templates.
      }
    
      public boolean isInfoEnabled() {
        return false;  //To change body of implemented methods use File | Settings | File Templates.
      }
    
      public boolean isWarnEnabled() {
        return false;  //To change body of implemented methods use File | Settings | File Templates.
      }
    
      public void warn(String msg) {
        //To change body of implemented methods use File | Settings | File Templates.
      }
    
      public void warn(String msg, Throwable t) {
        //To change body of implemented methods use File | Settings | File Templates.
      }
    
      public void warn(String parameterizedMsg, Object param1) {
        //To change body of implemented methods use File | Settings | File Templates.
      }
    
      public void warn(String parameterizedMsg, Object param1, Object param2) {
        //To change body of implemented methods use File | Settings | File Templates.
      }
    
      public void trace(String format, Object[] argArray) {
      }
      public void debug(String format, Object[] argArray) {
      }
      public void info(String format, Object[] argArray) {
      }
      public void warn(String format, Object[] argArray) {
      }
      public void error(String format, Object[] argArray) {
      }
    
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/control/PackageTest.java��������0000644�0001750�0001750�00000001315�12136042271�031617� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.control;
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    import org.junit.runners.Suite.SuiteClasses;
    
    
    @RunWith(Suite.class)
    @SuiteClasses({})
    public class PackageTest {
    }�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000146�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/control/ControlLoggerContext.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/control/ControlLoggerContext.jav0000644�0001750�0001750�00000006374�12136042271�033422� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.control;
    
    import java.util.HashMap;
    import java.util.Map;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.core.CoreConstants;
    
    /**
     * This logger context quite optimized for logger retrieval.
     * 
     * <p>It uses a single loggerMap where the key is the logger name and the value
     * is the logger.
     * 
     * <p>This approach acts a lower limit for what is achievable for low memory
     * usage as well as low creation/retrieval times. However, this simplicity also
     * results in slow effective level evaluation, the most frequently exercised
     * part of the API.
     * 
     * <p>This class is expected to contain correct results, and serve to verify
     * the correctness of a more sophisticated implementation.
     * 
     * @author ceki
     */
    public class ControlLoggerContext {
    
      private ControlLogger root;
      //
      // Hashtable loggerMap = new Hashtable();
      Map<String, ControlLogger> loggerMap = new HashMap<String, ControlLogger>();
    
      public ControlLoggerContext() {
        this.root = new ControlLogger("root", null);
        this.root.setLevel(Level.DEBUG);
      }
    
      /**
       * Return this contexts root logger
       * 
       * @return
       */
      public ControlLogger getRootLogger() {
        return root;
      }
    
      public ControlLogger exists(String name) {
        if (name == null) {
          throw new IllegalArgumentException("name parameter cannot be null");
        }
    
        synchronized (loggerMap) {
          return (ControlLogger) loggerMap.get(name);
        }
      }
    
      public final ControlLogger getLogger(String name) {
        if (name == null) {
          throw new IllegalArgumentException("name parameter cannot be null");
        }
    
        synchronized (loggerMap) {
          ControlLogger cl = (ControlLogger) loggerMap.get(name);
          if (cl != null) {
            return cl;
          }
          ControlLogger parent = this.root;
    
          int i = 0;
          while (true) {
            i = name.indexOf(CoreConstants.DOT, i);
            if (i == -1) {
              // System.out.println("FINAL-Creating logger named [" + name + "] with
              // parent " + parent.getName());
              cl = new ControlLogger(name, parent);
              loggerMap.put(name, cl);
              return cl;
            } else {
              String parentName = name.substring(0, i);
              ControlLogger p = (ControlLogger) loggerMap.get(parentName);
              if (p == null) {
                // System.out.println("INTERMEDIARY-Creating logger [" + parentName
                // + "] with parent " + parent.getName());
                p = new ControlLogger(parentName, parent);
                loggerMap.put(parentName, p);
              }
              parent = p;
            }
            // make i move past the last found dot.
            i++;
          }
        }
      }
    
      public Map<String, ControlLogger> getLoggerMap() {
        return loggerMap;
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/control/SetLevel.java�����������0000644�0001750�0001750�00000001745�12136042271�031156� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.control;
    
    import ch.qos.logback.classic.Level;
    
    public class SetLevel extends ScenarioAction {
      final String loggerName;
      final Level level;
    
      public SetLevel(Level level, String loggerName) {
        this.level = level;
        this.loggerName = loggerName;
      }
    
      public Level getLevel() {
        return level;
      }
    
      public String getLoggerName() {
        return loggerName;
      }
      public String toString() {
        return "SetLevel("+level+", "+loggerName+")";
      }
    }
    ���������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/control/ScenarioMaker.java������0000644�0001750�0001750�00000006645�12136042271�032162� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.control;
    
    import java.util.LinkedList;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.core.CoreConstants;
    
    public class ScenarioMaker {
    
      private final static int AVERAGE_LOGGER_DEPTH = 4;
      private final static int LOGGER_DEPT_DEV = 2;
      // the frequency of a set levelInt event for every create logger event
      private final static int CREATE_LOGGER_TO_SET_LEVEL_FREQUENCY = 5;
      private final static int SECOND_SET_LEVEL_FREQUENCY = 3;
    
      private static long count = 0;
    
      /**
       * Makes a scenario with len logger creations. Logger names are generated
       * independently such that the overwhelming majority of logger names will be
       * unrelated to each other. Each logger creation may be followed with a
       * randomly generated set levelInt action on that logger.
       * 
       * @param len
       * @return
       */
      static public Scenario makeTypeAScenario(int len) {
        Scenario scenario = new Scenario();
        ;
        for (int i = 0; i < len; i++) {
          String loggerName = ScenarioRandomUtil.randomLoggerName(
              AVERAGE_LOGGER_DEPTH, LOGGER_DEPT_DEV);
          scenario.add(new CreateLogger(loggerName));
        }
        return scenario;
      }
    
      static public Scenario makeRealisticCreationScenario(int len) {
        Scenario scenario = new Scenario();
        LinkedList<String> queue = new LinkedList<String>();
        int loggerCreationCount = 0;
    
        // add an empty string to get going
        queue.add("");
    
        while (loggerCreationCount < len) {
          if ((count % 100) == 0) {
            System.out.println("count=" + count);
          }
    
          String loggerName = (String) queue.removeFirst();
          int randomChildrenCount = ScenarioRandomUtil
              .randomChildrenCount(loggerName);
    
          if (randomChildrenCount == 0) {
            scenario.add(new CreateLogger(loggerName));
            addSetLevelSubScenario(scenario, loggerName);
            loggerCreationCount++;
          } else {
            for (int i = 0; i < randomChildrenCount; i++) {
              String childName;
              if (loggerName.equals("")) {
                childName = ScenarioRandomUtil.randomId();
                count += childName.length();
              } else {
                childName = loggerName + CoreConstants.DOT
                    + ScenarioRandomUtil.randomId();
                count += childName.length();
              }
              queue.add(childName);
              addSetLevelSubScenario(scenario, loggerName);
              loggerCreationCount++;
            }
          }
        }
        return scenario;
      }
    
      static void addSetLevelSubScenario(Scenario scenario, String loggerName) {
        if (ScenarioRandomUtil.oneInFreq(CREATE_LOGGER_TO_SET_LEVEL_FREQUENCY)) {
          Level l = ScenarioRandomUtil.randomLevel();
          scenario.add(new SetLevel(l, loggerName));
          if (ScenarioRandomUtil.oneInFreq(SECOND_SET_LEVEL_FREQUENCY)) {
            l = ScenarioRandomUtil.randomLevel();
            scenario.add(new SetLevel(l, loggerName));
          }
        }
      }
    
    }�������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/control/ScenarioRandomUtil.java�0000644�0001750�0001750�00000007106�12136042271�033172� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.control;
    
    import java.util.Random;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.corpus.RandomUtil;
    
    public class ScenarioRandomUtil {
      private final static long SEED = 74130;
    
      private final static Random random = new Random(SEED);
      private final static int AVERAGE_ID_LEN = 32;
      private final static int AVERAGE_ID_DEV = 16;
    
      private final static int AVERAGE_CHILDREN_COUNT = 30;
      private final static int CHILDREN_COUNT_VAR = 10;
    
      public static boolean oneInFreq(int freq) {
        return (random.nextInt(freq) % freq) == 0;
      }
    
      public static Level randomLevel() {
        int rl = random.nextInt(6);
        switch (rl) {
        case 0:
          return null;
        case 1:
          return Level.TRACE;
        case 2:
          return Level.DEBUG;
        case 3:
          return Level.INFO;
        case 4:
          return Level.WARN;
        case 5:
          return Level.ERROR;
        default:
          throw new IllegalStateException(
              "rl should have been a value between 0 to 5, but it is " + rl);
        }
      }
    
      public static String randomLoggerName(int average, int stdDeviation) {
        int depth = RandomUtil.gaussianAsPositiveInt(random, average, stdDeviation);
        StringBuffer buf = new StringBuffer();
        for (int i = 0; i < depth; i++) {
          if (i != 0) {
            buf.append('.');
          }
          buf.append(randomId());
        }
        return buf.toString();
      }
    
      public static String randomId() {
    
        int len = RandomUtil.gaussianAsPositiveInt(random, AVERAGE_ID_LEN, AVERAGE_ID_DEV);
        StringBuffer buf = new StringBuffer();
        for (int i = 0; i < len; i++) {
          int offset = random.nextInt(26);
          char c = (char) ('a' + offset);
          buf.append(c);
        }
        return buf.toString();
      }
    
    
      /**
       * Returns 3 for root, 3 for children of root, 9 for offspring of generation 2
       * and 3, and for generations 4 and later, return 0 with probability 0.5 and a
       * gaussian (average=AVERAGE_CHILDREN_COUNT) with probability 0.5.
       * 
       * @param name
       * @return
       */
      public static int randomChildrenCount(String name) {
        int dots = dotCount(name);
        if (dots <= 1) {
          return 3;
        } else if (dots == 2 || dots == 3) {
          return 9;
        } else {
          if (shouldHaveChildrenWithProbabilitz(0.5)) {
            return RandomUtil.gaussianAsPositiveInt(random, AVERAGE_CHILDREN_COUNT, CHILDREN_COUNT_VAR);
          } else {
            return 0;
          }
        }
    
      }
    
      /**
       * Returns true with probability p.
       * 
       * @param p
       * @return
       */
      static boolean shouldHaveChildrenWithProbabilitz(double p) {
        if (p < 0 || p > 1.0) {
          throw new IllegalArgumentException(
              "p must be a value between 0 and 1.0, it was " + p + " instead.");
        }
        double r = random.nextDouble();
        if (r < p) {
          return true;
        } else {
          return false;
        }
      }
    
      static int dotCount(String s) {
        int count = 0;
        int len = s.length();
        for (int i = 0; i < len; i++) {
          char c = s.charAt(i);
          if (c == '.') {
            count++;
          }
        }
        return count;
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/control/ScenarioAction.java�����0000644�0001750�0001750�00000001065�12136042271�032327� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.control;
    
    public class ScenarioAction {
    
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/LoggerPerfTest.java�������������0000644�0001750�0001750�00000020357�12136042271�030647� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic;
    
    import static org.junit.Assert.assertTrue;
    
    import ch.qos.logback.core.testUtil.EnvUtilForTests;
    import org.junit.Before;
    import org.junit.Ignore;
    import org.junit.Test;
    import org.slf4j.helpers.BogoPerf;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.classic.turbo.NOPTurboFilter;
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.UnsynchronizedAppenderBase;
    import ch.qos.logback.core.helpers.NOPAppender;
    
    
    @Ignore
    public class LoggerPerfTest {
    
      static final long NANOS_IN_ONE_SEC = 1000 * 1000 * 1000L;
      static long NORMAL_RUN_LENGTH = 1 * 1000 * 1000;
      static long SHORTENED_RUN_LENGTH = 500 * 1000;
    
      LoggerContext lc = new LoggerContext();
      Logger lbLogger = lc.getLogger(this.getClass());
      org.slf4j.Logger logger = lbLogger;
    
      @Before
      public void setUp() throws Exception {
      }
    
      // ===========================================================================
      @Test
      public void durationOfDisabledLogsWith_1_NOPFilter() {
        double avg = computeDurationOfDisabledLogsWith_1_NOPFilter(1,
                NORMAL_RUN_LENGTH);
        System.out.println("durationOfDisabledLogsWith_1_NOPFilter=" + avg);
        long referencePerf = 60;
    
        BogoPerf.assertDuration(avg, referencePerf, CoreConstants.REFERENCE_BIPS);
      }
    
      double computeDurationOfDisabledLogsWith_1_NOPFilter(int numOfFilters,
                                                           long len) {
        for (int i = 0; i < numOfFilters; i++) {
          lc.addTurboFilter(new NOPTurboFilter());
        }
        lbLogger.setLevel(Level.OFF);
        for (long i = 0; i < len; i++)
          logger.debug("Toto");
    
        long start = System.nanoTime();
        for (long i = 0; i < len; i++)
          logger.debug("Toto");
    
        return (System.nanoTime() - start) / len;
      }
    
      // ===========================================================================
      @Test
      public void durationOfIsDebugEnabled() {
        double avg = computedurationOfIsDebugEnabled(10 * NORMAL_RUN_LENGTH);
        System.out.println("durationOfIsDebugEnabled=" + avg);
    
        long referencePerf = 15;
        BogoPerf.assertDuration(avg, referencePerf, CoreConstants.REFERENCE_BIPS);
      }
    
      double computedurationOfIsDebugEnabled(final long len) {
        lbLogger.setLevel(Level.OFF);
        for (long i = 0; i < len; i++)
          logger.isDebugEnabled();
        Thread.yield();
        for (long i = 0; i < len; i++)
          logger.isDebugEnabled();
    
        long start = System.nanoTime();
        for (long i = 0; i < len; i++)
          logger.isDebugEnabled();
        return (System.nanoTime() - start) / len;
      }
    
      // ===========================================================================
      @Test
      public void durationOfDisabledLog_NoParameters() {
        double avg = computeDurationOfDisabledLog_NoParameters(10 * NORMAL_RUN_LENGTH);
        System.out.println("durationOfDisabledLog_NoParameters=" + avg);
    
        long referencePerf = 18;
        BogoPerf.assertDuration(avg, referencePerf, CoreConstants.REFERENCE_BIPS);
      }
    
      double computeDurationOfDisabledLog_NoParameters(final long len) {
        lbLogger.setLevel(Level.OFF);
        for (long i = 0; i < len; i++)
          logger.debug("Toto");
        Thread.yield();
        for (long i = 0; i < len; i++)
          logger.debug("Toto");
        Thread.yield();
    
        long start = System.nanoTime();
        for (long i = 0; i < len; i++)
          logger.debug("Toto");
        return (System.nanoTime() - start) / len;
      }
    
      // ===========================================================================
    
      @Test
      public void durationOfDisabledLog_1_Parameter() {
        double avgDuration = computeDurationOfDisabledLog_1_Parameter(NORMAL_RUN_LENGTH);
        System.out.println("durationOfDisabledLog_1_Parameter=" + avgDuration);
    
        long referencePerf = 30;
        BogoPerf.assertDuration(avgDuration, referencePerf,
                CoreConstants.REFERENCE_BIPS);
      }
    
      double computeDurationOfDisabledLog_1_Parameter(long len) {
        lbLogger.setLevel(Level.OFF);
        final Object o = new Object();
        for (long i = 0; i < len; i++)
          logger.debug("Toto {}", o);
    
        long start = System.nanoTime();
        for (long i = 0; i < len; i++)
          logger.debug("Toto {}", o);
    
        long end = System.nanoTime();
        return (end - start) / len;
      }
    
      // ===========================================================================
    
      @Test
      public void durationOfEnabledLog() {
        if (EnvUtilForTests.isLinux()) {
          // the JIT on Linux behaves very differently
          return;
        }
        double avgDuration = computeDurationOfEnabledLog(SHORTENED_RUN_LENGTH);
        System.out.println("durationOfEnabledLog=" + avgDuration);
    
        long referencePerf = 800;
        BogoPerf.assertDuration(avgDuration, referencePerf,
                CoreConstants.REFERENCE_BIPS);
      }
    
      double computeDurationOfEnabledLog(long len) {
        lbLogger.setLevel(Level.ALL);
    
        NOPAppender<ILoggingEvent> nopAppender = new NOPAppender<ILoggingEvent>();
        nopAppender.start();
        ((ch.qos.logback.classic.Logger) logger).addAppender(nopAppender);
        for (long i = 0; i < len; i++) {
          logger.debug("Toto");
        }
        long start = System.nanoTime();
        for (long i = 0; i < len; i++) {
          logger.debug("Toto");
        }
        long end = System.nanoTime();
        return (end - start) / len;
      }
    
      // ===========================================================================
    
      @Test
      public void testThreadedLogging() throws InterruptedException {
        SleepAppender<ILoggingEvent> appender = new SleepAppender<ILoggingEvent>();
    
        int MILLIS_PER_CALL = 250;
        int NANOS_PER_CALL = 250 * 1000 * 1000;
    
        appender.setDuration(MILLIS_PER_CALL);
        appender.start();
    
        lbLogger.addAppender(appender);
        lbLogger.setLevel(Level.DEBUG);
        long start;
        long end;
        int threadCount = 10;
        int iterCount = 5;
        TestRunner[] threads = new TestRunner[threadCount];
        for (int i = 0; i < threads.length; ++i) {
          threads[i] = new TestRunner(logger, iterCount);
        }
        start = System.nanoTime();
        for (Thread thread : threads) {
          thread.start();
        }
        for (TestRunner thread : threads) {
          thread.join();
        }
        end = System.nanoTime();
        double tolerance = threadCount * .125; // Very little thread contention
        // should occur in this test.
        double max = ((((double) NANOS_PER_CALL) / NANOS_IN_ONE_SEC) * iterCount)
                * tolerance;
        double serialized = (((double) NANOS_PER_CALL) / NANOS_IN_ONE_SEC)
                * iterCount * threadCount;
        double actual = ((double) (end - start)) / NANOS_IN_ONE_SEC;
        System.out
                .printf(
                        "Sleep duration: %,.4f seconds. Max expected: %,.4f seconds, Serialized: %,.4f\n",
                        actual, max, serialized);
        assertTrue("Exceeded maximum expected time.", actual < max);
      }
    
      // ============================================================
      private static class TestRunner extends Thread {
        private org.slf4j.Logger logger;
        private long len;
    
        public TestRunner(org.slf4j.Logger logger, long len) {
          this.logger = logger;
          this.len = len;
        }
    
        public void run() {
          Thread.yield();
          for (long i = 0; i < len; i++) {
            logger.debug("Toto");
          }
        }
      }
    
      // ============================================================
      public static class SleepAppender<E> extends UnsynchronizedAppenderBase<E> {
        private static long duration = 500;
    
        public void setDuration(long millis) {
          duration = millis;
        }
    
        @Override
        protected void append(E eventObject) {
          try {
            Thread.sleep(duration);
          } catch (InterruptedException ie) {
            // Ignore
          }
        }
      }
      // ============================================================
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/testUtil/�����������������������0000755�0001750�0001750�00000000000�12203357067�026725� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/testUtil/SampleConverter.java���0000644�0001750�0001750�00000001522�12136042271�032672� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.testUtil;
    
    import ch.qos.logback.classic.pattern.ClassicConverter;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    
    public class SampleConverter extends ClassicConverter {
    
      static public final String SAMPLE_STR = "sample";
      
      @Override
      public String convert(ILoggingEvent event) {
        return SAMPLE_STR;
      }
    
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/multiJVM/�����������������������0000755�0001750�0001750�00000000000�12203357067�026617� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000147�00000000000�011567� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/multiJVM/SafeModeFileAppender.java��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/multiJVM/SafeModeFileAppender.ja0000644�0001750�0001750�00000006062�12136042271�033072� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.multiJVM;
    
    import org.slf4j.Logger;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.FileAppender;
    
    /**
     * An application to write to a file using a FileAppender in safe mode.
     * 
     * @author Ceki Gulcu
     * 
     */
    public class SafeModeFileAppender {
    
      static long LEN;
      static String FILENAME;
      static String STAMP;
    
      static public void main(String[] argv) throws Exception {
        if (argv.length != 3) {
          usage("Wrong number of arguments.");
        }
    
        STAMP = argv[0];
        LEN = Integer.parseInt(argv[1]);
        FILENAME = argv[2];
        writeContinously(STAMP, FILENAME, true);
      }
    
      static void usage(String msg) {
        System.err.println(msg);
        System.err.println("Usage: java " + SafeModeFileAppender.class.getName()
            + " stamp runLength filename\n" + " stamp JVM instance stamp\n"
            + "   runLength (integer) the number of logs to generate perthread"
            + "    filename (string) the filename where to write\n");
        System.exit(1);
      }
    
      static LoggerContext buildLoggerContext(String stamp, String filename,
          boolean safetyMode) {
        LoggerContext loggerContext = new LoggerContext();
    
        FileAppender<ILoggingEvent> fa = new FileAppender<ILoggingEvent>();
    
        PatternLayoutEncoder patternLayout = new PatternLayoutEncoder();
        patternLayout.setPattern(stamp + " %5p - %m%n");
        patternLayout.setContext(loggerContext);
        patternLayout.start();
    
        fa.setEncoder(patternLayout);
        fa.setFile(filename);
        fa.setAppend(true);
        fa.setPrudent(safetyMode);
        fa.setContext(loggerContext);
        fa.start();
    
        ch.qos.logback.classic.Logger root = loggerContext
            .getLogger(Logger.ROOT_LOGGER_NAME);
        root.addAppender(fa);
    
        return loggerContext;
      }
    
      static void writeContinously(String stamp, String filename, boolean safetyMode)
          throws Exception {
        LoggerContext lc = buildLoggerContext(stamp, filename, safetyMode);
        Logger logger = lc.getLogger(SafeModeFileAppender.class);
    
        long before = System.nanoTime();
        for (int i = 0; i < LEN; i++) {
          logger.debug(LoggingThread.msgLong + " " + i);
        }
        lc.stop();
        double durationPerLog = (System.nanoTime() - before) / (LEN * 1000.0);
    
        System.out.println("Average duration of " + (durationPerLog)
            + " microseconds per log. Safety mode " + safetyMode);
        System.out.println("------------------------------------------------");
      }
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/multiJVM/LoggingThread.java�����0000644�0001750�0001750�00000002453�12136042271�032175� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.multiJVM;
    
    import org.slf4j.Logger;
    
    public class LoggingThread extends Thread {
      static String msgLong = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
    
      final long len;
      final Logger logger;
      private double durationPerLog;
    
      public LoggingThread(Logger logger, long len) {
        this.logger = logger;
        this.len = len;
      }
    
      public void run() {
        long before = System.nanoTime();
        for (int i = 0; i < len; i++) {
          logger.debug(msgLong + " " + i);
    //      try {
    //        Thread.sleep(100);
    //      } catch (InterruptedException e) {
    //      }
        }
        // in microseconds
        durationPerLog = (System.nanoTime() - before) / (len * 1000.0);
      }
    
      public double getDurationPerLogInMicroseconds() {
        return durationPerLog;
      }
      
      
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/multiJVM/Checker.java�����������0000644�0001750�0001750�00000005066�12136042271�031026� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.multiJVM;
    
    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class Checker {
    
      static long LEN;
      static String FILENAME;
    
      static void usage(String msg) {
        System.err.println(msg);
        System.err
            .println("Usage: java "
                + Checker.class.getName()
                + " runLength filename stamp0 stamp1 ..stampN\n"
                + "   runLength (integer) the number of logs to generate perthread\n"
                + "    filename (string) the filename where to write\n"
                + "   stamp0 JVM instance stamp0\n"
                + "   stamp1 JVM instance stamp1\n");
        System.exit(1);
      }
    
      public static void main(String[] argv) throws Exception {
        if (argv.length < 3) {
          usage("Wrong number of arguments.");
        }
    
        LEN = Integer.parseInt(argv[0]);
        FILENAME = argv[1];
    
        for (int i = 2; i < argv.length; i++) {
          check(argv[i], FILENAME, true);
        }
      }
    
      static void check(String stamp, String filename, boolean safetyMode)
          throws Exception {
    
        FileReader fr = new FileReader(FILENAME);
        BufferedReader br = new BufferedReader(fr);
    
        String regExp = "^" + stamp + " DEBUG - " + LoggingThread.msgLong
            + " (\\d+)$";
        Pattern p = Pattern.compile(regExp);
    
        String line;
        int expected = 0;
        while ((line = br.readLine()) != null) {
          Matcher m = p.matcher(line);
          if (m.matches()) {
            String g = m.group(1);
            int num = Integer.parseInt(g);
            if (num != expected) {
              System.err.println("ERROR: out of sequence line: ");
              System.err.println(line);
              return;
            }
            expected++;
          }
        }
    
        if (expected != LEN) {
          System.err.println("ERROR: For JVM stamp " + stamp + " found " + expected
              + " was expecting " + LEN);
        } else {
          System.out.println("For JVM stamp " + stamp + " found " + LEN
              + " lines in correct sequence");
        }
        fr.close();
        br.close();
      }
    }��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/multiJVM/FileAppenderPerf.java��0000644�0001750�0001750�00000005642�12136042271�032635� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.multiJVM;
    
    import org.slf4j.Logger;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.FileAppender;
    import ch.qos.logback.core.testUtil.RandomUtil;
    
    public class FileAppenderPerf {
      static String msgLong = "ABCDEGHIJKLMNOPQRSTUVWXYZabcdeghijklmnopqrstuvwxyz1234567890";
    
      static long LEN = 100 * 1000;
      static int DIFF = RandomUtil.getPositiveInt() % 1000;
      static String FILENAME;
    
      static LoggerContext buildLoggerContext(String filename, boolean safetyMode) {
        LoggerContext loggerContext = new LoggerContext();
    
        FileAppender<ILoggingEvent> fa = new FileAppender<ILoggingEvent>();
    
        PatternLayoutEncoder patternLayout = new PatternLayoutEncoder();
        patternLayout.setPattern("%5p %c - %m%n");
        patternLayout.setContext(loggerContext);
        patternLayout.start();
    
        fa.setEncoder(patternLayout);
        fa.setFile(filename);
        fa.setAppend(false);
        fa.setPrudent(safetyMode);
        fa.setContext(loggerContext);
        fa.start();
    
        ch.qos.logback.classic.Logger root = loggerContext
            .getLogger(Logger.ROOT_LOGGER_NAME);
        root.addAppender(fa);
    
        return loggerContext;
      }
    
      static void usage(String msg) {
        System.err.println(msg);
        System.err.println("Usage: java " + FileAppenderPerf.class.getName()
            + " filename");
    
        System.exit(1);
      }
    
      public static void main(String[] argv) throws Exception {
        if (argv.length > 1) {
          usage("Wrong number of arguments.");
        }
    
        if (argv.length == 0) {
          FILENAME = DIFF+"";
        } else {
          FILENAME = argv[0];
        }
    
        perfCase(false);
        perfCase(true);
      }
    
      static void perfCase(boolean safetyMode) throws Exception {
        LoggerContext lc = buildLoggerContext(FILENAME + "-" + safetyMode + ".log",
            safetyMode);
        Logger logger = lc.getLogger(FileAppenderPerf.class);
    
        long start = System.nanoTime();
        for (int i = 0; i < LEN; i++) {
          logger.debug(msgLong + " " + i);
        }
        // in microseconds
        double durationPerLog = (System.nanoTime() - start) / (LEN * 1000.0);
    
        lc.stop();
    
        System.out.println("Average duration of " + (durationPerLog)
            + " microseconds per log. Prudent mode=" + safetyMode);
        System.out.println("------------------------------------------------");
      }
    
    }
    ����������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000156�00000000000�011567� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/multiJVM/SafeModeRollingFileAppender.java�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/multiJVM/SafeModeRollingFileAppe0000644�0001750�0001750�00000007065�12136042271�033163� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.multiJVM;
    
    import org.slf4j.Logger;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.rolling.RollingFileAppender;
    import ch.qos.logback.core.rolling.TimeBasedRollingPolicy;
    import ch.qos.logback.core.util.StatusPrinter;
    
    /**
     * An application to write to a file using a RollingFileAppender in safe mode.
     * 
     * @author Ceki Gulcu
     * 
     */
    public class SafeModeRollingFileAppender {
    
      static long LEN;
      static String FILENAME;
      static String STAMP;
      
      static final String DATE_PATTERN = "yyyy-MM-dd_HH_mm_ss";
    
      static public void main(String[] argv) throws Exception {
        if (argv.length != 3) {
          usage("Wrong number of arguments.");
        }
    
        STAMP = argv[0];
        LEN = Integer.parseInt(argv[1]);
        FILENAME = argv[2];
        writeContinously(STAMP, FILENAME, true);
      }
    
      static void usage(String msg) {
        System.err.println(msg);
        System.err.println("Usage: java " + SafeModeRollingFileAppender.class.getName()
            + " stamp runLength filename\n" + " stamp JVM instance stamp\n"
            + "   runLength (integer) the number of logs to generate perthread"
            + "    filename (string) the filename where to write\n");
        System.exit(1);
      }
    
      static LoggerContext buildLoggerContext(String stamp, String filename,
          boolean safetyMode) {
        LoggerContext loggerContext = new LoggerContext();
    
        RollingFileAppender<ILoggingEvent> rfa = new RollingFileAppender<ILoggingEvent>();
        PatternLayoutEncoder patternLayout = new PatternLayoutEncoder();
        patternLayout.setPattern(stamp + " %5p - %-50m%n");
        patternLayout.setContext(loggerContext);
        patternLayout.start();
    
        rfa.setEncoder(patternLayout);
        
        rfa.setAppend(true);
        rfa.setPrudent(safetyMode);
        rfa.setContext(loggerContext);
    
        TimeBasedRollingPolicy tbrp = new TimeBasedRollingPolicy();
        
        tbrp.setContext(loggerContext);
        tbrp.setFileNamePattern(filename+"-%d{"+DATE_PATTERN+"}.log");
        tbrp.setParent(rfa);
        tbrp.start();
      
        rfa.setRollingPolicy(tbrp);
    
        
        rfa.start();
    
        ch.qos.logback.classic.Logger root = loggerContext
            .getLogger(Logger.ROOT_LOGGER_NAME);
        root.addAppender(rfa);
    
        return loggerContext;
      }
    
      static void writeContinously(String stamp, String filename, boolean safetyMode)
          throws Exception {
        LoggerContext lc = buildLoggerContext(stamp, filename, safetyMode);
        Logger logger = lc.getLogger(SafeModeRollingFileAppender.class);
    
        long before = System.nanoTime();
        for (int i = 0; i < LEN; i++) {
          logger.debug(LoggingThread.msgLong + " " + i);
        }
        lc.stop();
        StatusPrinter.print(lc);
        double durationPerLog = (System.nanoTime() - before) / (LEN * 1000.0);
    
        System.out.println("Average duration of " + (durationPerLog)
            + " microseconds per log. Safety mode " + safetyMode);
        System.out.println("------------------------------------------------");
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/��������������������������0000755�0001750�0001750�00000000000�12203357067�026240� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbcore26/�����������������0000755�0001750�0001750�00000000000�12203357067�027656� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbcore26/Main.java��������0000644�0001750�0001750�00000002657�12136042271�031410� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.issue.lbcore26;
    
    import java.util.Date;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import ch.qos.logback.classic.ClassicTestConstants;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.util.StatusPrinter;
    
    public class Main {
    
      public static void main(String[] args) throws JoranException {
    
        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
        JoranConfigurator configurator = new JoranConfigurator();
        configurator.setContext(lc);
        configurator.doConfigure(ClassicTestConstants.INPUT_PREFIX
            + "issue/lbcore26.xml");
    
        StatusPrinter.printInCaseOfErrorsOrWarnings(lc);
        Logger logger = LoggerFactory.getLogger(Main.class);
        for (int i = 0; i < 16; i++) {
          logger.info("hello " + new Date());
        }
    
      }
    
    }
    ���������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/LBCORE63.java�������������0000644�0001750�0001750�00000006701�12136042271�030217� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.issue;
    
    import java.util.Date;
    import java.util.concurrent.ScheduledThreadPoolExecutor;
    import java.util.concurrent.TimeUnit;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.util.StatusPrinter;
    
    public class LBCORE63 extends Thread {
      private final static String LOGGER_CONFIGURATION_FILE = "./src/test/input/issue/lbcore63.xml";
      private final Logger logger = LoggerFactory.getLogger(LBCORE63.class);
    
      private final long start;
    
      public LBCORE63() throws JoranException {
        start = new Date().getTime();
        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
        JoranConfigurator configurator = new JoranConfigurator();
        lc.reset();
        configurator.setContext(lc);
        configurator.doConfigure(LOGGER_CONFIGURATION_FILE);
        StatusPrinter.printInCaseOfErrorsOrWarnings(lc);
      }
    
      public void start() {
        ScheduledThreadPoolExecutor ex1 = new ScheduledThreadPoolExecutor(1);
        ScheduledThreadPoolExecutor ex2 = new ScheduledThreadPoolExecutor(1);
        ScheduledThreadPoolExecutor ex3 = new ScheduledThreadPoolExecutor(1);
        ScheduledThreadPoolExecutor ex4 = new ScheduledThreadPoolExecutor(1);
        ScheduledThreadPoolExecutor ex5 = new ScheduledThreadPoolExecutor(1);
        ex1.scheduleAtFixedRate(new Task("EX1"), 10, 10, TimeUnit.MICROSECONDS);
        ex2.scheduleAtFixedRate(new Task("EX2"), 10, 10, TimeUnit.MICROSECONDS);
        ex3.scheduleAtFixedRate(new Task("EX3"), 10, 10, TimeUnit.MICROSECONDS);
        ex4.scheduleAtFixedRate(new Task("EX4"), 10, 10, TimeUnit.MICROSECONDS);
        ex5.scheduleAtFixedRate(new Task("EX5"), 10, 10, TimeUnit.MICROSECONDS);
    
        super.start();
      }
    
      public void run() {
        try {
          while (true) {
            logger.debug("[MAIN] {}", new Date().getTime() - start);
            Thread.sleep(10);
          }
        } catch (InterruptedException e) {
          logger.info("[MAIN]: Interrupted: {}", e.getMessage());
        }
      }
    
      public static void main(String[] args) {
        try {
          LBCORE63 main = new LBCORE63();
          main.start();
        } catch (JoranException e) {
          System.out.println("Failed to load application: " + e.getMessage());
        }
      }
    
      class Task implements Runnable {
        private final Logger logger = LoggerFactory.getLogger(Task.class);
        //private final Logger logger_main = LoggerFactory.getLogger(LBCORE63.class);
        final String name;
        private final long start;
    
        int counter = 0;
        public long diff;
        
        public Task(final String name) {
          this.name = name;
          start = new Date().getTime();
        }
    
        public void run() {
          counter++;
          diff = new Date().getTime() - start;
          logger.debug("counter={}", counter);
          //logger_main.debug("[MAIN] - [{}] {}", name, new Date().getTime() - start);
        }
      }
    }
    ���������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic135/�������������0000755�0001750�0001750�00000000000�12203357067�030430� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic135/lbclassic139/0000755�0001750�0001750�00000000000�12203357067�032624� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000162�00000000000�011564� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic135/lbclassic139/Accessor.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic135/lbclassic139/0000644�0001750�0001750�00000002566�12136042271�032630� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.issue.lbclassic135.lbclassic139;
    
    import org.slf4j.Logger;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.core.contention.RunnableWithCounterAndDone;
    
    /**
     * 
     * @author Olivier Cailloux
     * 
     */
    public class Accessor extends RunnableWithCounterAndDone {
      private Logger logger;
      final Worker worker;
      final LoggerContext loggerContext;
    
      
      Accessor(Worker worker, LoggerContext lc) {
        this.worker = worker;
        this.loggerContext = lc;
        logger = lc.getLogger(this.getClass());
      }
    
      public void run() {
        print("entered run()");
        //Thread.yield();
        while (!isDone()) {
          logger.info("Current worker status is: {}.", worker);
        }
        print("leaving run()");
      }
      
      void print(String msg) {
        String thread = Thread.currentThread().getName();
        System.out.println("["+thread+"] "+msg);
      }
    }
    ������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000160�00000000000�011562� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic135/lbclassic139/Worker.java�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic135/lbclassic139/0000644�0001750�0001750�00000003702�12136042271�032621� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.issue.lbclassic135.lbclassic139;
    
    import java.util.Vector;
    
    import org.slf4j.Logger;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.core.contention.RunnableWithCounterAndDone;
    
    /**
     * 
     * @author Olivier Cailloux
     * 
     */
    public class Worker extends RunnableWithCounterAndDone {
      static final int SLEEP_DUIRATION = 50;
      
      private Logger logger; 
      private final Vector lock = new Vector();
    
      final LoggerContext loggerContext;
      Worker(LoggerContext lc) {
        loggerContext = lc;
        logger = lc.getLogger(this.getClass());
      }
      
      public void run() {
        print("entered run()");
        while (!isDone()) {
          synchronized (lock) {
            sleep();
            logger.info("lock the logger");
          }
        }
        print("leaving run()");
      }
    
      @Override
      public String toString() {
        print("In Worker.toString() - about to access lock");
        synchronized (lock) {
          print("In Worker.toString() - got the lock");
          //sleep();
          final StringBuffer buf = new StringBuffer("STATUS");
          return buf.toString();
        }
      }
      
      public void sleep() {
        try {
          print("About to go to sleep");
          Thread.sleep(SLEEP_DUIRATION);
          print("just woke up");
        } catch (InterruptedException exc) {
          exc.printStackTrace();
        }
      }
      
      void print(String msg) {
        String thread = Thread.currentThread().getName();
        System.out.println("["+thread+"] "+msg);
      }
    }��������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000174�00000000000�011567� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic135/lbclassic139/LB139_DeadlockTest.java�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic135/lbclassic139/0000644�0001750�0001750�00000003135�12136042271�032621� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.issue.lbclassic135.lbclassic139;
    
    import org.junit.Before;
    import org.junit.Test;
    
    import ch.qos.logback.classic.BasicConfigurator;
    import ch.qos.logback.classic.LoggerContext;
    
    public class LB139_DeadlockTest {
    
      LoggerContext loggerContext = new LoggerContext();
      
      @Before
      public void setUp() {
        loggerContext.setName("LB139");
        BasicConfigurator.configure(loggerContext);
      }
      
      @Test //(timeout=3000)
      public void test() throws Exception {
        Worker worker = new Worker(loggerContext);
        Accessor accessor = new Accessor(worker, loggerContext);
        
        Thread workerThread = new Thread(worker, "WorkerThread");
        Thread accessorThread = new Thread(accessor, "AccessorThread");
        
        workerThread.start();
        accessorThread.start();
    
        int sleep = Worker.SLEEP_DUIRATION*10;
        
        System.out.println("Will sleep for "+sleep+" millis");
        Thread.sleep(sleep);
        System.out.println("Done sleeping ("+sleep+" millis)");
        worker.setDone(true);
        accessor.setDone(true);
        
        workerThread.join();
        accessorThread.join();
      }
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000165�00000000000�011567� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic135/lbclassic139/PackageTest.java������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic135/lbclassic139/0000644�0001750�0001750�00000001371�12136042271�032621� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.issue.lbclassic135.lbclassic139;
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    import org.junit.runners.Suite.SuiteClasses;
    
    @RunWith(Suite.class)
    @SuiteClasses(LB139_DeadlockTest.class)
    public class PackageTest {
    }�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000164�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic135/LoggingToFileThroughput.java�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic135/LoggingToFile0000644�0001750�0001750�00000010222�12136042271�033032� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.issue.lbclassic135;
    
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.FileAppender;
    import ch.qos.logback.core.contention.ThreadedThroughputCalculator;
    
    /**
     * Short sample code testing the throughput of a fair lock.
     * 
     * @author Ceki Gulcu
     */
    public class LoggingToFileThroughput {
    
      static int THREAD_COUNT = 1;
      static long OVERALL_DURATION_IN_MILLIS = 5000;
    
      public static void main(String args[]) throws InterruptedException {
    
        ThreadedThroughputCalculator tp = new ThreadedThroughputCalculator(
            OVERALL_DURATION_IN_MILLIS);
        tp.printEnvironmentInfo("lbclassic135  LoggingToFileThrouhput");
    
        LoggerContext lc = new LoggerContext();
        Logger logger = buildLoggerContext(lc);
        
        for (int i = 0; i < 2; i++) {
          tp.execute(buildArray(logger));
        }
    
        tp.execute(buildArray(logger));
        tp.printThroughput("File:   ");
        lc.stop();
      }
    
      static Logger buildLoggerContext(LoggerContext lc) {
        Logger root = lc.getLogger(Logger.ROOT_LOGGER_NAME);
    
        PatternLayoutEncoder patternLayout = new PatternLayoutEncoder();
        patternLayout.setContext(lc);
        patternLayout.setPattern("%d %l [%t] - %msg%n");
        patternLayout.start();
        FileAppender<ILoggingEvent> fileAppender = new FileAppender<ILoggingEvent>();
        fileAppender.setContext(lc);
        fileAppender.setFile("target/lbclassic135.log");
        fileAppender.setEncoder(patternLayout);
        fileAppender.setAppend(false);
        fileAppender.start();
        root.addAppender(fileAppender);
        return lc.getLogger(LoggingToFileThroughput.class);
      }
    
      static LoggingRunnable[] buildArray(Logger logger) {
       
        LoggingRunnable[] array = new LoggingRunnable[THREAD_COUNT];
        for (int i = 0; i < THREAD_COUNT; i++) {
          array[i] = new LoggingRunnable(logger);
        }
        return array;
      }
    }
    
    //=== lbclassic135  LoggingToFileThrouhput === 
    // ******** 10 Threads *****
    // synchronized doAppend() method
    //
    // java.runtime.version = 1.6.0_05-b13
    // java.vendor          = Sun Microsystems Inc.
    // os.name              = Windows XP
    //
    // Threads 1:   total of 485077 operations, or 97 operations per millisecond
    // Threads 10:  total of 309402 operations, or 61 operations per millisecond
    
    //* After revision 2310
    //* Threads 1:  total of 462465 operations, or 92 operations per millisecond
    //* Threads 10: total of 243362 operations, or 48 operations per millisecond
    
    // ==================== Linux ======================== 
    
    // java.runtime.version = 1.6.0_11-b03
    // java.vendor          = Sun Microsystems Inc.
    // os.name              = Linux
    // os.version           = 2.6.25-gentoo-r6
    // Threads 1:  total of 356355 operations, or 71 operations per millisecond
    // Threads 10: total of 287943 operations, or 57 operations per millisecond
    
    //* After revision 2310
    //* Threads 1:  total of 331494 operations, or 66 operations per millisecond
    //* Threads 10: total of 311104 operations, or 58 operations per millisecond
    
    // java.runtime.version = jvmxa6460-20081105_25433
    // java.vendor          = IBM Corporation
    // java.version         = 1.6.0
    // os.name              = Linux
    // os.version           = 2.6.25-gentoo-r6
    // Threads 1:  total of 280381 operations, or 56 operations per millisecond
    // Threads 10  total of 142989 operations, or 28 operations per millisecond
    
    //* After revision 2310
    //* Threads 1:   total of 305638 operations, or 61 operations per millisecond
    //* Threads 10:  total of 147660 operations, or 29 operations per millisecond������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000154�00000000000�011565� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic135/LoggingRunnable.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic135/LoggingRunnab0000644�0001750�0001750�00000002433�12136042271�033102� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.issue.lbclassic135;
    
    import org.slf4j.Logger;
    import ch.qos.logback.core.contention.RunnableWithCounterAndDone;
    
    public class LoggingRunnable extends RunnableWithCounterAndDone {
    
      final Logger logger;
      final int burstLength;
    
    
      public LoggingRunnable(Logger logger, int burstLength) {
        this.logger = logger;
        this.burstLength = burstLength;
      }
    
      public LoggingRunnable(Logger logger) {
        this(logger, 100);
      }
    
      public void run() {
        while (!isDone()) {
          logger.info("hello world ABCDEFGHI");
          counter++;
          // don't hog the CPU forever
          if (counter % burstLength == 0) {
            try {
              Thread.sleep(1);
            } catch (InterruptedException e) {
              e.printStackTrace();
            }
          }
        }
      }
    
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbcore211/����������������0000755�0001750�0001750�00000000000�12203357067�027732� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbcore211/Lbcore211.java��0000644�0001750�0001750�00000002564�12136042271�032227� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.issue.lbcore211;
    
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.util.StatusPrinter;
    import org.junit.Test;
    import org.slf4j.LoggerFactory;
    
    /**
     * @author Ceki G&uuml;c&uuml;
     */
    public class Lbcore211 {
    
      @Test
      public void lbcore211() throws JoranException {
    
        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
    
        JoranConfigurator configurator = new JoranConfigurator();
        configurator.setContext(lc);
        lc.reset();
        configurator.doConfigure("/home/ceki/lbcore211.xml");
    
        Logger l = lc.getLogger("file.logger");
        StatusPrinter.print(lc);
        for (int i = 0; i < 10; i++) {
          l.info("hello " + i);
        }
    
        lc.stop();
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/logback474/���������������0000755�0001750�0001750�00000000000�12203357067�030101� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000152�00000000000�011563� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/logback474/LoggingAppender.java�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/logback474/LoggingAppender0000644�0001750�0001750�00000002113�12136042271�033057� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.issue.logback474;
    
    import org.slf4j.Logger;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.AppenderBase;
    
    /**
     * An appender which calls logback recursively
     * 
     * @author Ralph Goers
     */
    
    public class LoggingAppender extends AppenderBase<ILoggingEvent> {
    
      Logger logger;
    
      public void start() {
        super.start();
        logger = ((LoggerContext) getContext()).getLogger("Ignore");
      }
    
      protected void append(ILoggingEvent eventObject) {
        logger.debug("Ignore this");
      }
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbcore243/����������������0000755�0001750�0001750�00000000000�12203357067�027737� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbcore243/Common.java�����0000644�0001750�0001750�00000001203�12136042271�032017� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.issue.lbcore243;
    
    public class Common {
    
       // How many times should we try to log:
       static int loop = 800*1000;
    
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000167�00000000000�011571� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbcore243/logback_without_immediateFlush.xml����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbcore243/logback_without_0000644�0001750�0001750�00000001641�11750522656�033214� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
      <appender name="TestLogfile" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>target/test-output/perf/logback_without_flush.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
          <fileNamePattern>target/test-output/perf/logback_without_flush.log.%i</fileNamePattern>
          <minIndex>1</minIndex>
          <maxIndex>1</maxIndex>
        </rollingPolicy>
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
          <maxFileSize>1000KB</maxFileSize>
        </triggeringPolicy>
        <encoder>
          <Pattern>%d{ISO8601} %5p [%t] %c - %m%n</Pattern>
          <immediateFlush>false</immediateFlush>
          <outputPatternAsHeader>true</outputPatternAsHeader>
          <charset>UTF-8</charset>
        </encoder>
      </appender>
      <root>
        <level value="debug"/>
        <appender-ref ref="TestLogfile"/>
      </root>
    </configuration>�����������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000164�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbcore243/logback_with_immediateFlush.xml�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbcore243/logback_with_imm0000644�0001750�0001750�00000001546�11750312067�033164� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
      <appender name="TestLogfile" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>target/test-output/perf/logback_with_flush.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
          <fileNamePattern>target/test-output/perf/logback_with_flush.log.%i</fileNamePattern>
          <minIndex>1</minIndex>
          <maxIndex>1</maxIndex>
        </rollingPolicy>
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
          <maxFileSize>1000KB</maxFileSize>
        </triggeringPolicy>
        <encoder>
          <Pattern>%d{ISO8601} %5p [%t] %c - %m%n</Pattern>
          <immediateFlush>true</immediateFlush>
          <!--<charset>UTF-8</charset>-->
        </encoder>
      </appender>
      <root>
        <level value="debug"/>
        <appender-ref ref="TestLogfile"/>
      </root>
    </configuration>����������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000166�00000000000�011570� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbcore243/PerformanceComparatorLogback.java�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbcore243/PerformanceCompa0000644�0001750�0001750�00000005305�12136042271�033077� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.issue.lbcore243;
    
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.core.joran.spi.JoranException;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    // Results AMD Phenom II X6 1110T processor and SSD disk
    //Logback  with    immediate flush: 8356 nanos per call
    //Logback  without immediate flush: 1758 nanos per call
    
    public class PerformanceComparatorLogback {
      static Logger logbacklogger = LoggerFactory.getLogger(PerformanceComparatorLogback.class);
    
      public static void main(String[] args) throws JoranException, InterruptedException {
        initLogbackWithoutImmediateFlush();
        logbackParametrizedDebugCall();
    
        initLogbackWithImmediateFlush();
        logbackParametrizedDebugCall();
        System.out.println("###############################################");
        System.out.println("Logback  with    immediate flush: " + logbackParametrizedDebugCall() + " nanos per call");
    
        initLogbackWithoutImmediateFlush();
        System.out.println("Logback  without immediate flush: " + logbackParametrizedDebugCall() + " nanos per call");
    
        System.out.println("###############################################");
      }
    
      private static long logbackParametrizedDebugCall() {
    
        Integer j = new Integer(2);
        long start = System.nanoTime();
        for (int i = 0; i < Common.loop; i++) {
          logbacklogger.debug("SEE IF THIS IS LOGGED {}.", j);
        }
        return (System.nanoTime() - start) / Common.loop;
      }
    
      static String DIR_PREFIX = "src/test/java/ch/qos/logback/classic/issue/lbcore243/";
    
    
      static void configure(String file)  throws JoranException {
        LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
          JoranConfigurator jc = new JoranConfigurator();
          jc.setContext(loggerContext);
          loggerContext.reset();
          jc.doConfigure(file);
      }
    
    
      private static void initLogbackWithoutImmediateFlush() throws JoranException {
        configure(DIR_PREFIX + "logback_without_immediateFlush.xml");
      }
    
      private static void initLogbackWithImmediateFlush() throws JoranException {
        configure(DIR_PREFIX + "logback_with_immediateFlush.xml");
      }
    }���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000165�00000000000�011567� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbcore243/log4j_without_immediateFlush.xml������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbcore243/log4j_without_im0000644�0001750�0001750�00000001362�11746451115�033153� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
    <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">
      <appender name="TestLogfile" class="org.apache.log4j.RollingFileAppender">
        <param name="File" value="c:/test/log4j_without_flush.log"/>
        <param name="MaxFileSize" value="1000KB"/>
        <param name="maxBackupIndex" value="1"/>
        <param name="immediateFlush" value="false"/>
        <layout class="org.apache.log4j.PatternLayout">
          <param name="ConversionPattern" value="%d{ISO8601} %5p [%t] %c %X{transactionId} - %m%n"/>
        </layout>
      </appender>
      <root>
        <level value="debug"/>
        <appender-ref ref="TestLogfile"/>
      </root>
    </log4j:configuration>������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000162�00000000000�011564� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbcore243/log4j_with_immediateFlush.xml���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbcore243/log4j_with_immed0000644�0001750�0001750�00000001356�11746341303�033111� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
    <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">
      <appender name="TestLogfile" class="org.apache.log4j.RollingFileAppender">
        <param name="File" value="d:/test/log4j_with_flush.log"/>
        <param name="MaxFileSize" value="1000KB"/>
        <param name="maxBackupIndex" value="1"/>
        <param name="immediateFlush" value="true"/>
        <layout class="org.apache.log4j.PatternLayout">
          <param name="ConversionPattern" value="%d{ISO8601} %5p [%t] %c %X{transactionId} - %m%n"/>
        </layout>
      </appender>
      <root>
        <level value="debug"/>
        <appender-ref ref="TestLogfile"/>
      </root>
    </log4j:configuration>����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000164�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbcore243/PerformanceComparatorLog4j.java�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbcore243/PerformanceCompa0000644�0001750�0001750�00000004520�12136042271�033075� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.issue.lbcore243;
    
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.core.joran.spi.JoranException;
    import org.apache.log4j.xml.DOMConfigurator;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    
    // WARNING This code compiles but does not measure anything useful because log4j-over-slf4j is a dependency. Log4j
    // should be used instead
    
    public class PerformanceComparatorLog4j {
    
       static org.apache.log4j.Logger log4jlogger = org.apache.log4j.Logger.getLogger(PerformanceComparatorLog4j.class);
    
       public static void main(String[] args) throws JoranException, InterruptedException {
         initLog4jWithoutImmediateFlush();
    
         // Let's run once for Just In Time compiler
         log4jDirectDebugCall();
    
         System.out.println("###############################################");
         System.out.println("Log4j    without immediate flush: " + log4jDirectDebugCall()+ " nanos per call");
         System.out.println("###############################################");
       }
    
       private static long log4jDirectDebugCall() {
         Integer j = new Integer(2);
         long start = System.nanoTime();
         for (int i = 0; i < Common.loop; i++) {
           log4jlogger.debug("SEE IF THIS IS LOGGED " + j + ".");
         }
         return (System.nanoTime() - start) / Common.loop;
       }
    
       static String DIR_PREFIX = "src/test/java/ch/qos/logback/classic/issue/lbcore243/";
    
       static void initLog4jWithoutImmediateFlush() {
         DOMConfigurator domConfigurator = new DOMConfigurator();
         domConfigurator.configure(DIR_PREFIX+"log4j_without_immediateFlush.xml");
       }
       static void initLog4jWithImmediateFlush() {
         DOMConfigurator domConfigurator = new DOMConfigurator();
         domConfigurator.configure(DIR_PREFIX+"log4j_with_immediateFlush.xml");
       }
    }��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic323/�������������0000755�0001750�0001750�00000000000�12203357067�030427� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000146�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic323/Barebones.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic323/Barebones.jav0000644�0001750�0001750�00000002377�12136042271�033033� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.issue.lbclassic323;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.ContextBase;
    
    public class Barebones {
    
      public static void main(String[] args) {
        Context context = new ContextBase();
        for(int i = 0; i < 3; i++) {
          SenderRunnable senderRunnable = new SenderRunnable(""+i);
          context.getExecutorService().execute(senderRunnable);
        }
        System.out.println("done");
        //System.exit(0);
      }
    
      static class SenderRunnable implements Runnable {
        String id;
        SenderRunnable(String id) {
          this.id = id;
        }
    
        public void run() {
          try {
            Thread.sleep(2000);
          } catch (InterruptedException e) {
          }
          System.out.println("SenderRunnable " +id);
        }
      }
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic323/Simple.java��0000644�0001750�0001750�00000003040�12136042271�032511� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.issue.lbclassic323;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.core.joran.spi.JoranException;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    /**
     */
    public class Simple {
    
      static Logger logger = LoggerFactory.getLogger(Simple.class);
      static String DIR_PREFIX = "src/test/java/ch/qos/logback/classic/issue/lbclassic323/";
    
      public static void main(String[] args) throws JoranException, InterruptedException {
        init(DIR_PREFIX + "logback_smtp.xml");
    
        for (int i = 0; i < 10; i++) {
          logger.debug("SEE IF THIS IS LOGGED {}.", i);
        }
        logger.error("trigger");
        System.out.println("done");
        System.exit(0);
      }
    
    
      static void init(String file) throws JoranException {
        LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
        JoranConfigurator jc = new JoranConfigurator();
        jc.setContext(loggerContext);
        loggerContext.reset();
        jc.doConfigure(file);
      }
    
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000150�00000000000�011561� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic323/logback_smtp.xml�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic323/logback_smtp.0000644�0001750�0001750�00000001302�11751202653�033066� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration scan="true" scanPeriod="3 seconds" debug="true">
      <appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
        <smtpHost>smtp.gmail.com</smtpHost>
        <smtpPort>465</smtpPort>
        <to>${destination}</to>
        <password>${password}</password>
        <from>noreply@qos.ch</from>
        <subject>%logger{20} - %m</subject>
        <username>${destination}</username>
        <SSL>true</SSL>
        <asynchronousSending>true</asynchronousSending>
        <layout class="ch.qos.logback.classic.PatternLayout">
          <pattern>%date %-5level %logger{35} - %message%n</pattern>
        </layout>
      </appender>
      <root level="DEBUG">
        <appender-ref ref="EMAIL"/>
      </root>
    </configuration>������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbcore_155/���������������0000755�0001750�0001750�00000000000�12203357067�030100� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbcore_155/OThread.java���0000644�0001750�0001750�00000002564�12136042271�032271� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.issue.lbcore_155;
    
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    /**
     * @author Ceki G&uuml;c&uuml;
     */
    public class OThread extends Thread {
    
    
      static int NANOS_IN_MILLI = 1000 * 1000;
    
      static int WAIT_MILLIS = 10;
    
      Logger logger = LoggerFactory.getLogger(this.getClass());
    
      public void run() {
    
        while (!isInterrupted()) {
          long start = System.nanoTime();
          for (long now = System.nanoTime(); now < start + 2*WAIT_MILLIS*NANOS_IN_MILLI; now = System.nanoTime()) {
            logger.info("in time loop");
          }
    
          logger.info("before 2nd sleep");
         
          try {
            sleep(1000);
          } catch (InterruptedException e) {
            logger.info("While sleeping", e);
            e.printStackTrace();
            break;
          }
          logger.info("after sleep");
        }
        logger.info("exiting WHILE");
    
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbcore_155/Main.java������0000644�0001750�0001750�00000002311�12136042271�031615� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.issue.lbcore_155;
    
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.core.util.StatusPrinter;
    import org.slf4j.LoggerFactory;
    
    /**
     * @author Ceki G&uuml;c&uuml;
     */
    public class Main {
    
      public static void main(String[] args) throws InterruptedException {
    
        Logger logger = (Logger) LoggerFactory.getLogger(Main.class);
        StatusPrinter.print((LoggerContext) LoggerFactory.getILoggerFactory());
        OThread ot = new OThread();
        ot.start();
        Thread.sleep(OThread.WAIT_MILLIS-500);
        logger.info("About to interrupt");
        ot.interrupt();
        logger.info("After interrupt");
        logger.info("Leaving main");
    
      }
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic36/��������������0000755�0001750�0001750�00000000000�12203357067�030350� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000173�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic36/SelectiveDateFormattingRunnable.java������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic36/SelectiveDateF0000644�0001750�0001750�00000004373�12136042271�033122� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.issue.lbclassic36;
    
    import java.text.SimpleDateFormat;
    //import org.joda.time.format.DateTimeFormat;
    //import org.joda.time.format.DateTimeFormatter;
    
    import ch.qos.logback.core.contention.RunnableWithCounterAndDone;
    
    /**
     * A runnable which behaves differently depending on the desired locking model.
     * 
     * @author Raplh Goers
     * @author Ceki Gulcu
     */
    public class SelectiveDateFormattingRunnable extends
        RunnableWithCounterAndDone {
    
      public static final String ISO8601_PATTERN = "yyyy-MM-dd HH:mm:ss,SSS";
    
      enum FormattingModel {
        SDF, JODA;
      }
    
      FormattingModel model;
      static long CACHE = 0;
    
      static SimpleDateFormat SDF = new SimpleDateFormat(ISO8601_PATTERN);
    //  static final DateTimeFormatter JODA = DateTimeFormat
    //      .forPattern(ISO8601_PATTERN);
    
      SelectiveDateFormattingRunnable(FormattingModel model) {
        this.model = model;
      }
    
      public void run() {
        switch (model) {
        case SDF:
          sdfRun();
          break;
        case JODA:
          jodaRun();
          break;
        }
      }
    
      void sdfRun() {
    
        for (;;) {
          synchronized (SDF) {
            long now = System.currentTimeMillis();
            if (CACHE != now) {
              CACHE = now;
              SDF.format(now);
            }
          }
          counter++;
          if (done) {
            return;
          }
        }
      }
    
      void jodaRun() {
        for (;;) {
          long now = System.currentTimeMillis();
          if (isCacheStale(now)) {
            //JODA.print(now);
          }
          counter++;
          if (done) {
            return;
          }
        }
      }
      
      private static boolean isCacheStale(long now) {
    //    synchronized (JODA) {
    //      if (CACHE != now) {
    //        CACHE = now;
    //        return true;
    //      }
    //    }
        return false;
      }
    
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000157�00000000000�011570� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic36/DateFormatPerf_Tapp.java������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic36/DateFormatPerf0000644�0001750�0001750�00000003665�12136042271�033141� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.issue.lbclassic36;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    //import org.joda.time.format.DateTimeFormat;
    //import org.joda.time.format.DateTimeFormatter;
    
    public class DateFormatPerf_Tapp {
      public static final String ISO8601_PATTERN = "yyyy-MM-dd HH:mm:ss,SSS";
      static final long NANOS_IN_ONE_SEC = 1000 * 1000 * 1000L;
    
      static long RUN_LENGTH = 1000 * 1000;
    
      public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
          doRawJoda();
          doRawSDF();
        }
    
        print("Raw Joda:     ", doRawJoda());
        print("Raw SDF:      ", doRawSDF());
      }
    
      static void print(String msg, double avg) {
        System.out.println(msg + " average tick " + avg + " nanoseconds");
      }
    
      static double doRawJoda() {
    //    DateTimeFormatter jodaFormat = DateTimeFormat.forPattern(ISO8601_PATTERN);
        long timeInMillis = new Date().getTime();
        long start = System.nanoTime();
        for (int i = 0; i < RUN_LENGTH; ++i) {
    //      jodaFormat.print(timeInMillis);
        }
        return (System.nanoTime() - start) * 1.0d / RUN_LENGTH;
      }
    
      static double doRawSDF() {
        SimpleDateFormat simpleFormat = new SimpleDateFormat(ISO8601_PATTERN);
        long timeInMillis = new Date().getTime();
        long start = System.nanoTime();
        for (int i = 0; i < RUN_LENGTH; ++i) {
          simpleFormat.format(timeInMillis);
        }
        return (System.nanoTime() - start) * 1.0d / RUN_LENGTH;
      }
    
    }
    ���������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000206�00000000000�011563� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic36/DateFormattingThreadedThroughputCalculator.java�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic36/DateFormatting0000644�0001750�0001750�00000003527�12136042271�033203� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.issue.lbclassic36;
    
    import ch.qos.logback.classic.issue.lbclassic36.SelectiveDateFormattingRunnable.FormattingModel;
    import ch.qos.logback.core.contention.ThreadedThroughputCalculator;
    
    /**
     * Measure the threaded throughtput of date formatting operations
     * 
     * @author Joern Huxhorn
     * @author Ceki Gulcu
     */
    public class DateFormattingThreadedThroughputCalculator {
    
      static int THREAD_COUNT = 16;
      static long OVERALL_DURATION_IN_MILLIS = 3000;
    
      public static void main(String args[]) throws InterruptedException {
    
        ThreadedThroughputCalculator tp = new ThreadedThroughputCalculator(
            OVERALL_DURATION_IN_MILLIS);
        tp.printEnvironmentInfo("DateFormatting");
    
        for (int i = 0; i < 2; i++) {
          tp.execute(buildArray(FormattingModel.SDF));
          tp.execute(buildArray(FormattingModel.JODA));
        }
    
        tp.execute(buildArray(FormattingModel.JODA));
        tp.printThroughput("JODA: ");
        
        tp.execute(buildArray(FormattingModel.SDF));
        tp.printThroughput("SDF:  ");
    
    
      }
    
      static SelectiveDateFormattingRunnable[] buildArray(FormattingModel model) {
        SelectiveDateFormattingRunnable[] array = new SelectiveDateFormattingRunnable[THREAD_COUNT];
        for (int i = 0; i < THREAD_COUNT; i++) {
          array[i] = new SelectiveDateFormattingRunnable(model);
        }
        return array;
      }
    
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000164�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic36/DateFormatOriginal_tzest.java�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic36/DateFormatOrig0000644�0001750�0001750�00000017017�12136042271�033141� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.issue.lbclassic36;
    
    import junit.framework.TestCase;
    import junit.framework.Test;
    import junit.framework.TestSuite;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    //import org.joda.time.format.DateTimeFormatter;
    //import org.joda.time.format.DateTimeFormat;
    //import org.joda.time.DateTime;
    
    public class DateFormatOriginal_tzest extends TestCase {
      public static final String ISO8601_PATTERN = "yyyy-MM-dd HH:mm:ss,SSS";
      static final long NANOS_IN_ONE_SEC = 1000 * 1000 * 1000L;
    
      /**
       * Create the test case
       * 
       * @param testName
       *                name of the test case
       */
      public DateFormatOriginal_tzest(String testName) {
        super(testName);
      }
    
      /**
       * @return the suite of tests being tested
       */
      public static Test suite() {
        return new TestSuite(DateFormatOriginal_tzest.class);
      }
    
      public static void main(String[] args) {
        junit.textui.TestRunner.run(suite());
      }
    
      public void setUp() throws Exception {
        super.setUp();
      }
    
      public void tearDown() throws Exception {
        super.tearDown();
      }
    
    //  public void testRaw() throws Exception {
    //    SimpleDateFormat simpleFormat = new SimpleDateFormat(ISO8601_PATTERN);
    //    DateTimeFormatter jodaFormat = DateTimeFormat.forPattern(ISO8601_PATTERN);
    //
    //    Date date = new Date();
    //    DateTime dateTime = new DateTime(date);
    //
    //    long start = System.nanoTime();
    //    for (int i = 0; i < 100000; ++i) {
    //      jodaFormat.print(dateTime);
    //    }
    //    long jodaAvg = (System.nanoTime() - start) / 100000;
    //
    //
    //     start = System.nanoTime();
    //    for (int i = 0; i < 100000; ++i) {
    //      simpleFormat.format(date);
    //    }
    //    long simpleAvg = (System.nanoTime() - start) / 100000;
    //
    //    float diff = (((float) (simpleAvg - jodaAvg)) / simpleAvg) * 100;
    //    System.out.println("Raw - JDK: " + simpleAvg + " ns Joda: " + jodaAvg
    //        + " ns - Difference: " + diff + "%");
    //  }
    
      public void testSynchronized() throws Exception {
        SynchronizedDateFormatter formatter = new SynchronizedDateFormatter();
        int threads = 10;
        int iterations = 10000;
        Thread[] formatThreads = new Thread[threads];
        Date date = new Date();
    
        for (int i = 0; i < threads; i++) {
          formatThreads[i] = new DateFormatThread(formatter, date, iterations);
        }
        long start = System.nanoTime();
        for (Thread thread : formatThreads) {
          thread.start();
        }
        for (Thread thread : formatThreads) {
          thread.join();
        }
        long end = System.nanoTime();
        double actual = ((double) (end - start)) / NANOS_IN_ONE_SEC;
        System.out.printf("Synchronized DateFormat: %,.4f seconds\n", actual);
    
      }
    
      public void testUnSynchronized() throws Exception {
        UnsynchronizedDateFormatter formatter = new UnsynchronizedDateFormatter();
        int threads = 10;
        int iterations = 10000;
        Thread[] formatThreads = new Thread[threads];
        Date date = new Date();
    
        for (int i = 0; i < threads; i++) {
          formatThreads[i] = new DateFormatThread(formatter, date, iterations);
        }
        long start = System.nanoTime();
        for (Thread thread : formatThreads) {
          thread.start();
        }
        for (Thread thread : formatThreads) {
          thread.join();
        }
        long end = System.nanoTime();
        double actual = ((double) (end - start)) / NANOS_IN_ONE_SEC;
        System.out.printf("Unsynchronized DateFormat: %,.4f seconds\n", actual);
    
      }
    
      public void testThreadLocal() throws Exception {
        ThreadLocalDateFormatter formatter = new ThreadLocalDateFormatter();
        int threads = 10;
        int iterations = 10000;
        Thread[] formatThreads = new Thread[threads];
        Date date = new Date();
    
        for (int i = 0; i < threads; i++) {
          formatThreads[i] = new DateFormatThread(formatter, date, iterations);
        }
        long start = System.nanoTime();
        for (Thread thread : formatThreads) {
          thread.start();
        }
        for (Thread thread : formatThreads) {
          thread.join();
        }
        long end = System.nanoTime();
        double actual = ((double) (end - start)) / NANOS_IN_ONE_SEC;
        System.out.printf("ThreadLocal DateFormat: %,.4f seconds\n", actual);
    
      }
    
    //  public void testDateTimeFormatter() throws Exception {
    //    int threads = 10;
    //    int iterations = 10000;
    //    Thread[] formatThreads = new DateTimeFormatThread[threads];
    //    JodaFormatter formatter = new JodaFormatter();
    //    Date date = new Date();
    //    DateTime dateTime = new DateTime(date);
    //
    //    for (int i = 0; i < threads; i++) {
    //      formatThreads[i] = new DateTimeFormatThread(formatter, dateTime,
    //          iterations);
    //    }
    //    long start = System.nanoTime();
    //    for (Thread thread : formatThreads) {
    //      thread.start();
    //    }
    //    for (Thread thread : formatThreads) {
    //      thread.join();
    //    }
    //    long end = System.nanoTime();
    //    double actual = ((double) (end - start)) / NANOS_IN_ONE_SEC;
    //    System.out.printf("Joda DateTimeFormatter: %,.4f seconds\n", actual);
    //
    //  }
    
      public interface Formatter {
        String format(Date date);
      }
    
      public static class SynchronizedDateFormatter implements Formatter {
        SimpleDateFormat simpleFormat = new SimpleDateFormat(ISO8601_PATTERN);
    
        public synchronized String format(Date date) {
          return simpleFormat.format(date);
        }
      }
    
      public static class UnsynchronizedDateFormatter implements Formatter {
        public synchronized String format(Date date) {
          return new SimpleDateFormat(ISO8601_PATTERN).format(date);
        }
      }
    
      public static class ThreadLocalDateFormatter implements Formatter {
        ThreadLocal<SimpleDateFormat> formatter = new ThreadLocal<SimpleDateFormat>() {
          protected synchronized SimpleDateFormat initialValue() {
            return new SimpleDateFormat(ISO8601_PATTERN);
          }
        };
    
        public String format(Date date) {
          return formatter.get().format(date);
        }
      }
    
    //  public static class JodaFormatter {
    //    DateTimeFormatter formatter = DateTimeFormat.forPattern(ISO8601_PATTERN);
    //
    //    public String format(DateTime date) {
    //      return formatter.print(date);
    //    }
    //  }
    
      public static class DateFormatThread extends Thread {
        Formatter formatter;
        Date date;
        long iterCount;
    
        public DateFormatThread(Formatter f, Date date, long iterations) {
          this.formatter = f;
          this.date = date;
          this.iterCount = iterations;
        }
    
        public void run() {
          for (int i = 0; i < iterCount; i++) {
            formatter.format(this.date);
          }
        }
      }
    
    //  public static class DateTimeFormatThread extends Thread {
    //    JodaFormatter formatter;
    //    DateTime date;
    //    long iterCount;
    //
    //    public DateTimeFormatThread(JodaFormatter f, DateTime date, long iterations) {
    //      this.formatter = f;
    //      this.date = date;
    //      this.iterCount = iterations;
    //    }
    //
    //    public void run() {
    //      for (int i = 0; i < iterCount; i++) {
    //        formatter.format(this.date);
    //      }
    //    }
    //  }
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic330/�������������0000755�0001750�0001750�00000000000�12203357067�030425� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic330/logback.xml��0000644�0001750�0001750�00000002203�11752517061�032546� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration scan="true" scanPeriod="30 seconds" debug="true">
    
      <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <target>System.out</target>
        <encoder>
          <pattern>| [%-5level] [%date{ISO8601}] [%logger] [%thread] [%X{akkaSource}] - %msg %rootException %n</pattern>
        </encoder>
        sdfsadf
      </appender>
    
      <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>server.log</file>
    
        <!-- only keep 3 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
          <fileNamePattern>server.%i.log</fileNamePattern>
          <minIndex>1</minIndex>
          <maxIndex>3</maxIndex>
        </rollingPolicy>
    
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
          <maxFileSize>1MB</maxFileSize>
        </triggeringPolicy>
    
        <encoder>
          <pattern>| [%-5level] [%date{ISO8601}] [%logger] [%thread] [%X{akkaSource}] - %msg %rootException %n</pattern>
        </encoder>
      </appender>
    
      <root level="DEBUG">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="ROLLING"/>
      </root>
    
    </configuration>���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic330/Main.java����0000644�0001750�0001750�00000002577�12136042271�032160� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.issue.lbclassic330;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.core.joran.spi.JoranException;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    
    public class Main {
    
      static Logger logger = LoggerFactory.getLogger(Main.class);
       static String DIR_PREFIX = "src/test/java/ch/qos/logback/classic/issue/lbclassic330/";
    
       public static void main(String[] args) throws JoranException, InterruptedException {
         init(DIR_PREFIX + "logback.xml");
         logger.debug("hello");
       }
    
    
       static void init(String file) throws JoranException {
         LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
         JoranConfigurator jc = new JoranConfigurator();
         jc.setContext(loggerContext);
         loggerContext.reset();
         jc.doConfigure(file);
       }
    }
    ���������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic203/�������������0000755�0001750�0001750�00000000000�12203357067�030424� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000162�00000000000�011564� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic203/ConcurrentSiftingTest.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic203/ConcurrentSif0000644�0001750�0001750�00000004432�12136042271�033127� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.issue.lbclassic203;
    
    import ch.qos.logback.classic.ClassicTestConstants;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.issue.lbclassic135.LoggingRunnable;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.core.contention.MultiThreadedHarness;
    import ch.qos.logback.core.contention.RunnableWithCounterAndDone;
    import ch.qos.logback.core.joran.spi.JoranException;
    import org.junit.Test;
    
    import static org.junit.Assert.assertEquals;
    
    public class ConcurrentSiftingTest {
      final static int THREAD_COUNT = 5;
      static String FOLDER_PREFIX = ClassicTestConstants.JORAN_INPUT_PREFIX
          + "sift/";
    
      LoggerContext loggerContext = new LoggerContext();
      protected Logger logger = loggerContext.getLogger(this.getClass().getName());
      protected Logger root = loggerContext.getLogger(Logger.ROOT_LOGGER_NAME);
    
      int totalTestDuration = 50;
      MultiThreadedHarness harness = new MultiThreadedHarness(totalTestDuration);
      RunnableWithCounterAndDone[] runnableArray = buildRunnableArray();
    
      protected void configure(String file) throws JoranException {
        JoranConfigurator jc = new JoranConfigurator();
        jc.setContext(loggerContext);
        jc.doConfigure(file);
      }
    
      RunnableWithCounterAndDone[] buildRunnableArray() {
        RunnableWithCounterAndDone[] rArray = new RunnableWithCounterAndDone[THREAD_COUNT];
        for (int i = 0; i < THREAD_COUNT; i++) {
          rArray[i] = new LoggingRunnable(logger);
        }
        return rArray;
      }
    
      @Test
      public void concurrentAccess() throws JoranException, InterruptedException {
        configure(FOLDER_PREFIX + "lbclassic203.xml");
        harness.execute(runnableArray);
        assertEquals(1, InstanceCountingAppender.INSTANCE_COUNT);
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000165�00000000000�011567� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic203/InstanceCountingAppender.java������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic203/InstanceCount0000644�0001750�0001750�00000001574�12136042271�033124� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.issue.lbclassic203;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.AppenderBase;
    
    public class InstanceCountingAppender extends AppenderBase<ILoggingEvent> {
      
      static public volatile int INSTANCE_COUNT = 0;
    
      public InstanceCountingAppender() {
        INSTANCE_COUNT++;
      }
    
      protected void append(ILoggingEvent e) {
      }
      
    }
    ������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000150�00000000000�011561� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic203/PackageTest.java�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic203/PackageTest.j0000644�0001750�0001750�00000001357�12136042271�032771� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.issue.lbclassic203;
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    import org.junit.runners.Suite.SuiteClasses;
    
    @RunWith(Suite.class)
    @SuiteClasses(ConcurrentSiftingTest.class)
    public class PackageTest {
    }���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/PackageTest.java����������0000644�0001750�0001750�00000001717�12136042271�031275� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.issue;
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    import org.junit.runners.Suite.SuiteClasses;
    
    import ch.qos.logback.classic.issue.lbclassic135.lbclassic139.LB139_DeadlockTest;
    
    @RunWith(Suite.class)
    @SuiteClasses({LB139_DeadlockTest.class,
            ch.qos.logback.classic.issue.lbclassic135.lbclassic139.PackageTest.class,
            ch.qos.logback.classic.issue.lbclassic203.PackageTest.class})
    public class PackageTest {
    }�������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic180/�������������0000755�0001750�0001750�00000000000�12203357067�030430� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000170�00000000000�011563� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic180/HtmlEscapedMessageConverter.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic180/HtmlEscapedMe0000644�0001750�0001750�00000001566�12136042271�033027� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.issue.lbclassic180;
    
    import ch.qos.logback.classic.pattern.ClassicConverter;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.helpers.Transform;
    
    public class HtmlEscapedMessageConverter extends ClassicConverter {
    
      public String convert(ILoggingEvent event) {
        return Transform.escapeTags(event.getFormattedMessage());
      }
    }
    ������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic180/logback.xml��0000644�0001750�0001750�00000001136�11752527562�032564� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration debug="true">
    
      <conversionRule conversionWord="htmlEscapedMessage"
                      converterClass="ch.qos.logback.classic.issue.lbclassic180.HtmlEscapedMessageConverter"/>
    
      <appender name="CON" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
          <layout class="ch.qos.logback.classic.html.HTMLLayout">
            <pattern>%d{HH:mm:ss.SSS}%logger{1}%htmlEscapedMessage</pattern>
          </layout>
        </encoder>
      </appender>
      <root level="DEBUG">
        <appender-ref ref="CON"/>
      </root>
    </configuration>����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbclassic180/Main.java����0000644�0001750�0001750�00000002606�12136042271�032154� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.issue.lbclassic180;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.core.joran.spi.JoranException;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    
    public class Main {
    
      static Logger logger = LoggerFactory.getLogger(Main.class);
       static String DIR_PREFIX = "src/test/java/ch/qos/logback/classic/issue/lbclassic180/";
    
       public static void main(String[] args) throws JoranException, InterruptedException {
         init(DIR_PREFIX + "logback.xml");
         logger.debug("<p>hello</p>");
       }
    
    
       static void init(String file) throws JoranException {
         LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
         JoranConfigurator jc = new JoranConfigurator();
         jc.setContext(loggerContext);
         loggerContext.reset();
         jc.doConfigure(file);
       }
    }
    ��������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbcore224/����������������0000755�0001750�0001750�00000000000�12203357067�027736� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbcore224/Reduce.java�����0000644�0001750�0001750�00000012245�12136042271�032005� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.issue.lbcore224;
    
    import java.io.*;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    /**
     * Reduce a file consisting of lock and unlock operations by removing matching lock/unlocks.
     */
    public class Reduce {
    
      static int NA = -1;
    
      enum OperationType {LOCK, UNLOCK}
    
      public static void main(String[] args) throws IOException {
        File inputFile = new File(args[0]);
        if(!inputFile.exists()) {
          throw new IllegalArgumentException("Missing file ["+args[0]+"]");
        }
        List<String> lines = readFile(inputFile);
        System.out.println("Lines count=" + lines.size());
        List<Structure> structuredLines = structure(lines);
        List<Structure> reduction = reduce(structuredLines);
        if (reduction.isEmpty()) {
          System.out.println("Reduction is EMPTY as it should be.");
        } else {
          System.out.println("Non-empty reduction!!! WTF?");
          System.out.println(reduction);
        }
    
    
      }
    
      private static List<String> readFile(File  inputFile) throws IOException {
        BufferedReader reader = null;
        List<String> lines = new ArrayList();
        try {
          reader = new BufferedReader(new FileReader(inputFile));
          String line;
          while ((line = reader.readLine()) != null) {
            lines.add(line);
          }
        } finally {
          if (reader != null)
            try {
              reader.close();
            } catch (IOException e) {
            }
        }
        return lines;
      }
    
      private static List<Structure> reduce(List<Structure> structuredLines) {
        List<Structure> matching = new ArrayList<Structure>();
        int lockIndex = 0;
        while (lockIndex < structuredLines.size()) {
          lockIndex = findNearestLock(structuredLines, lockIndex);
          if (lockIndex == NA)
            break;
          else {
            int unlockIndex = findNearestUnlockInSameThread(structuredLines, lockIndex);
            if (unlockIndex != NA) {
              matching.add(structuredLines.get(lockIndex));
              matching.add(structuredLines.get(unlockIndex));
            }
            lockIndex++;
          }
        }
        System.out.println("matching list size: " + matching.size());
        List<Structure> reduction = new ArrayList<Structure>();
        for (Structure s : structuredLines) {
          if (!matching.contains(s)) {
            reduction.add(s);
          }
        }
        return reduction;
    
      }
    
      private static int findNearestLock(List<Structure> reduction, int index) {
        for (int i = index; i < reduction.size(); i++) {
          Structure s = reduction.get(i);
          if (s.operationType == OperationType.LOCK) {
            return i;
          }
        }
        return NA;
      }
    
      private static int findNearestUnlockInSameThread(List<Structure> reduction, int lockIndex) {
        int firstCandidateIndex = lockIndex+1;
        Structure lockStructure = reduction.get(lockIndex);
        for (int i = firstCandidateIndex; i < reduction.size(); i++) {
          Structure s = reduction.get(i);
          if (s.operationType == OperationType.UNLOCK && lockStructure.thread.equals(s.thread)) {
            return i;
          }
        }
        return NA;
      }
    
      static List<Structure> structure(List<String> lines) {
        List<Structure> structuredLines = new ArrayList();
        Pattern p = Pattern.compile("(\\d{2,5})\\ +(.*) (LOCK|UNLOCK)");
    
        for (String line : lines) {
          Matcher m = p.matcher(line);
          if (m.matches()) {
            String relTime = m.group(1);
            String t = m.group(2);
            String opStr = m.group(3);
            Structure structure = buildStructure(relTime, t, opStr);
            structuredLines.add(structure);
          } else {
            System.out.println("NON MATCHING LINE: ["+ line+"]");
          }
    
        }
        return structuredLines;
      }
    
      private static Structure buildStructure(String relTime, String t, String opStr) {
        long r = Long.parseLong(relTime);
        OperationType operationType;
        if (opStr.equals("LOCK"))
          operationType = OperationType.LOCK;
        else if (opStr.equals("UNLOCK")) {
          operationType = OperationType.UNLOCK;
        } else {
          throw new IllegalArgumentException(opStr + " is not LOCK|UNLOCK");
        }
        return new Structure(r, t, operationType);
      }
    
    
      static class Structure {
        long time;
        String thread;
        OperationType operationType;
    
        Structure(long time, String thread, OperationType operationType) {
          this.time = time;
          this.thread = thread;
          this.operationType = operationType;
        }
    
        @Override
        public String toString() {
          return "Structure{" +
                  "time=" + time +
                  ", thread='" + thread + '\'' +
                  ", operationType=" + operationType +
                  '}';
        }
      }
    
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000152�00000000000�011563� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbcore224/WithZookeperTest._ava�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/lbcore224/WithZookeperTest0000644�0001750�0001750�00000002405�11642616374�033161� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������package ch.qos.logback.classic.issue.lbcore224;
    
    import org.apache.zookeeper.test.QuorumUtil;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    
    
    // This test requires zookeeper 3.4.0 built from SVN trunk and setting
    // "build.test.dir" system property
    
    // recommended logback-test.xml file contents for this test:
    <configuration>
      <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>lbcore224.log</file>
        <encoder>
          <pattern>%logger{35} - %msg%n</pattern>
        </encoder>
      </appender>
    
      <root>
        <level value="INFO" />
        <appender-ref ref="FILE" />
      </root>
    </configuration>
    
    
    public class WithZookeperTest {
      static final String BUILT_TEST_DIR_PROP_KEY = "build.test.dir";
      QuorumUtil qU;
    
      @Before
      public void before() {
        System.setProperty(BUILT_TEST_DIR_PROP_KEY, "/tmp/zoo");
        qU = new QuorumUtil(1);
      }
    
      @After
      public void after() throws Exception {
        qU.tearDown();
        System.clearProperty(BUILT_TEST_DIR_PROP_KEY);
      }
    
      @Test
      public void shouldNotThrowIllegalMonitorStateException () throws Exception {
        for (int i = 0; i < 10; i++) {
          qU.startQuorum();
          qU.shutdownAll();
          System.out.println("iteration "+i);
        }
      }
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/DarioCampagna/������������0000755�0001750�0001750�00000000000�12203357067�030726� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/DarioCampagna/Main.java���0000644�0001750�0001750�00000003357�12136042271�032456� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.issue.DarioCampagna;
    
    import ch.qos.cal10n.IMessageConveyor;
    import ch.qos.cal10n.MessageConveyor;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.core.joran.spi.JoranException;
    import org.slf4j.LoggerFactory;
    import org.slf4j.Marker;
    import org.slf4j.MarkerFactory;
    import org.slf4j.cal10n.LocLogger;
    import org.slf4j.cal10n.LocLoggerFactory;
    
    import java.util.Locale;
    
    public class Main {
      public static void main(String[] args) throws JoranException {
    
        LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
        context.reset();
        JoranConfigurator joranConfigurator = new JoranConfigurator();
        joranConfigurator.setContext(context);
        joranConfigurator.doConfigure("src/test/java/ch/qos/logback/classic/issue/DarioCampagna/logback-marker.xml");
        IMessageConveyor mc = new MessageConveyor(Locale.getDefault());
        LocLoggerFactory llFactory_default = new LocLoggerFactory(mc);
        LocLogger locLogger = llFactory_default.getLocLogger("defaultLocLogger");
        Marker alwaysMarker = MarkerFactory.getMarker("ALWAYS");
        locLogger.info(alwaysMarker, "This will always appear.");
        locLogger.info("Hello!");
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000153�00000000000�011564� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/DarioCampagna/logback-marker.xml����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/issue/DarioCampagna/logback-mark0000644�0001750�0001750�00000000743�11765174104�033210� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration debug="true">
    
      <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
          <pattern>%level - %date - %marker - %msg%n</pattern>
        </encoder>
      </appender>
    
      <turboFilter class="ch.qos.logback.classic.turbo.MarkerFilter">
        <Marker>ALWAYS</Marker>
        <OnMatch>ACCEPT</OnMatch>
        <OnMismatch>NEUTRAL</OnMismatch>
      </turboFilter>
    
      <root level="WARN">
        <appender-ref ref="STDOUT"/>
      </root>
    
    </configuration>�����������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/jmx/����������������������������0000755�0001750�0001750�00000000000�12203357067�025706� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/jmx/JMXConfiguratorTest.java����0000644�0001750�0001750�00000012676�12136213375�032444� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.jmx;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertFalse;
    import static org.junit.Assert.assertNotNull;
    import static org.junit.Assert.assertNull;
    import static org.junit.Assert.assertTrue;
    
    import java.lang.management.ManagementFactory;
    import java.util.List;
    
    import javax.management.MBeanServer;
    import javax.management.ObjectName;
    
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.spi.LoggerContextListener;
    import ch.qos.logback.core.testUtil.RandomUtil;
    
    public class JMXConfiguratorTest {
    
      MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
      LoggerContext lc = new LoggerContext();
      Logger testLogger  = lc.getLogger(this.getClass());
    
      List<LoggerContextListener> listenerList;
      int diff = RandomUtil.getPositiveInt();
    
      
      @Before
      public void setUp() throws Exception {
        lc.setName("context-" + diff);
        assertNotNull(mbs);
      }
    
      @After
      public void tearDown() throws Exception {
        lc.stop();
      }
    
      @Override
      public String toString() {
        return this.getClass().getName() + "(" + lc.getName() + ")";
      }
    
      @Test
      public void contextReset() throws Exception {
        String randomizedObjectNameAsStr = "ch.qos.logback."+diff + ":Name=" + lc.getName()
            + ",Type=" + this.getClass().getName();
    
        ObjectName objectName = MBeanUtil.string2ObjectName(lc, this, randomizedObjectNameAsStr);
        JMXConfigurator jmxConfigurator = new JMXConfigurator(lc, mbs, objectName);
        mbs.registerMBean(jmxConfigurator, objectName);
        
        listenerList = lc.getCopyOfListenerList();
        assertEquals(1, listenerList.size());
        
        lc.reset();
        
        // check that after lc.reset, jmxConfigurator should still be
        // registered as a listener in the loggerContext and also as an
        // MBean in mbs
        listenerList = lc.getCopyOfListenerList();
        assertEquals(1, listenerList.size());
        assertTrue(listenerList.contains(jmxConfigurator));
    
        assertTrue(mbs.isRegistered(objectName));
      }
      
      @Test
      public void contextStop() throws Exception {
        String randomizedObjectNameAsStr = "ch.qos.logback."+diff + ":Name=" + lc.getName()
            + ",Type=" + this.getClass().getName();
    
        ObjectName objectName = MBeanUtil.string2ObjectName(lc, this, randomizedObjectNameAsStr);
        JMXConfigurator jmxConfigurator = new JMXConfigurator(lc, mbs, objectName);
        mbs.registerMBean(jmxConfigurator, objectName);
        
        listenerList = lc.getCopyOfListenerList();
        assertEquals(1, listenerList.size());
        
        lc.stop();
        
        // check that after lc.processPriorToRemoval, jmxConfigurator is no longer
        // registered as a listener in the loggerContext nor as an
        // MBean in mbs
        listenerList = lc.getCopyOfListenerList();
        assertEquals(0, listenerList.size());
    
        assertFalse(mbs.isRegistered(objectName));
      }
    
      @Test
      public void testNonRemovalOfPreviousIntanceFromTheContextListenerList() {
        String objectNameAsStr = "ch.qos.logback.toto" + ":Name=" + lc.getName()
            + ",Type=" + this.getClass().getName();
        ObjectName objectName = MBeanUtil.string2ObjectName(lc, this, objectNameAsStr);
        JMXConfigurator jmxConfigurator0 = new JMXConfigurator(lc, mbs, objectName);
        
        listenerList = lc.getCopyOfListenerList();
        assertTrue(listenerList.contains(jmxConfigurator0));
    
        JMXConfigurator jmxConfigurator1 = new JMXConfigurator(lc, mbs, objectName);
        listenerList = lc.getCopyOfListenerList();
        assertEquals(1, listenerList.size());
        assertTrue("old configurator should be present", listenerList
            .contains(jmxConfigurator0));
        assertFalse("new configurator should be absent", listenerList
            .contains(jmxConfigurator1));
      }
    
      @Test
      public void getLoggerLevel_LBCLASSIC_78() {
        String objectNameAsStr = "ch.qos"+diff + ":Name=" + lc.getName()
            + ",Type=" + this.getClass().getName();
    
        ObjectName on = MBeanUtil.string2ObjectName(lc, this, objectNameAsStr);
        JMXConfigurator configurator = new JMXConfigurator(lc, mbs, on);
        assertEquals("", configurator.getLoggerLevel(testLogger.getName()));
        MBeanUtil.unregister(lc, mbs, on, this);
      }
    
      
      @Test
      public void setLoggerLevel_LBCLASSIC_79() {
        String objectNameAsStr = "ch.qos"+diff + ":Name=" + lc.getName()
            + ",Type=" + this.getClass().getName();
    
        ObjectName on = MBeanUtil.string2ObjectName(lc, this, objectNameAsStr);
        JMXConfigurator configurator = new JMXConfigurator(lc, mbs, on);
        configurator.setLoggerLevel(testLogger.getName(), "DEBUG");
        assertEquals(Level.DEBUG,  testLogger.getLevel());
        
        configurator.setLoggerLevel(testLogger.getName(), "null");
        assertNull(testLogger.getLevel());
           
        MBeanUtil.unregister(lc, mbs, on, this);
      }
    
    }
    ������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/jmx/PackageTest.java������������0000644�0001750�0001750�00000001345�12136042271�030740� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.jmx;
    
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    import org.junit.runners.Suite.SuiteClasses;
    
    @RunWith(Suite.class)
    @SuiteClasses(JMXConfiguratorTest.class)
    public class PackageTest  {
      
    }�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/rolling/������������������������0000755�0001750�0001750�00000000000�12203357067�026556� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/rolling/UniqueFileTest.java�����0000644�0001750�0001750�00000004155�12136042271�032325� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.rolling;
    
    import static org.junit.Assert.assertTrue;
    
    import ch.qos.logback.core.util.CachingDateFormatter;
    import ch.qos.logback.core.util.StatusPrinter;
    import org.junit.Test;
    
    import ch.qos.logback.classic.ClassicTestConstants;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.rolling.ScaffoldingForRollingTests;
    import ch.qos.logback.core.status.StatusChecker;
    import ch.qos.logback.core.util.CoreTestConstants;
    
    /**
     * Test that we can create time-stamped log files with the help of
     * the &lt;timestamp> element in configuration files.
     * 
     * @author Ceki G&uuml;lc&uuml;
     *
     */
    public class UniqueFileTest {
    
      LoggerContext lc = new LoggerContext();
      StatusChecker sc = new StatusChecker(lc);
      Logger logger = lc.getLogger(this.getClass());
    
    
      void loadConfig(String confifFile) throws JoranException {
        JoranConfigurator jc = new JoranConfigurator();
        jc.setContext(lc);
        jc.doConfigure(confifFile);
      }
    
      @Test
      public void basic() throws Exception {
        loadConfig(ClassicTestConstants.JORAN_INPUT_PREFIX + "unique.xml");
        CachingDateFormatter sdf = new CachingDateFormatter("yyyyMMdd'T'HHmmss");
        String timestamp = sdf.format(System.currentTimeMillis());
    
        sc.assertIsErrorFree();
    
        Logger root = lc.getLogger(Logger.ROOT_LOGGER_NAME);
        root.info("hello");
        
        ScaffoldingForRollingTests.existenceCheck(CoreTestConstants.OUTPUT_DIR_PREFIX+"TS_"+timestamp+"log.txt");
      }
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/rolling/PackageTest.java��������0000644�0001750�0001750�00000001414�12136042271�031605� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.rolling;
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    import org.junit.runners.Suite.SuiteClasses;
    
    @RunWith(Suite.class)
    @SuiteClasses( { UniqueFileTest.class, TimeBasedRollingWithConfigFileTest.class })
    public class PackageTest {
    }����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000164�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/rolling/TimeBasedRollingWithConfigFileTest.java�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/rolling/TimeBasedRollingWithConf0000644�0001750�0001750�00000015152�12136042271�033324� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.rolling;
    
    import static org.junit.Assert.assertTrue;
    
    import java.util.Date;
    
    import ch.qos.logback.core.util.StatusPrinter;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import ch.qos.logback.classic.ClassicTestConstants;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.rolling.RollingFileAppender;
    import ch.qos.logback.core.rolling.ScaffoldingForRollingTests;
    import ch.qos.logback.core.rolling.TimeBasedFileNamingAndTriggeringPolicy;
    import ch.qos.logback.core.rolling.TimeBasedRollingPolicy;
    import ch.qos.logback.core.status.StatusChecker;
    
    public class TimeBasedRollingWithConfigFileTest extends
            ScaffoldingForRollingTests {
    
      LoggerContext lc = new LoggerContext();
      StatusChecker statusChecker = new StatusChecker(lc);
      Logger logger = lc.getLogger(this.getClass());
      int fileSize = 0;
      int fileIndexCounter = -1;
      int sizeThreshold;
    
      @Before
      @Override
      public void setUp() {
        lc.setName("test");
        super.setUp();
        lc.putProperty("randomOutputDir", randomOutputDir);
      }
    
      @After
      public void tearDown() throws Exception {
      }
    
      void loadConfig(String confifFile) throws JoranException {
        JoranConfigurator jc = new JoranConfigurator();
        jc.setContext(lc);
        jc.doConfigure(confifFile);
        currentTime = System.currentTimeMillis();
        recomputeRolloverThreshold(currentTime);
      }
    
      @Test
      public void basic() throws Exception {
        String testId = "basic";
        lc.putProperty("testId", testId);
        loadConfig(ClassicTestConstants.JORAN_INPUT_PREFIX + "rolling/" + testId
                + ".xml");
        statusChecker.assertIsErrorFree();
    
        Logger root = lc.getLogger(Logger.ROOT_LOGGER_NAME);
    
        expectedFilenameList.add(randomOutputDir + "z" + testId);
    
        RollingFileAppender<ILoggingEvent> rfa = (RollingFileAppender<ILoggingEvent>) root
                .getAppender("ROLLING");
    
        TimeBasedRollingPolicy tprp = (TimeBasedRollingPolicy<ILoggingEvent>) rfa
                .getTriggeringPolicy();
        TimeBasedFileNamingAndTriggeringPolicy tbnatp = tprp
                .getTimeBasedFileNamingAndTriggeringPolicy();
    
        String prefix = "Hello---";
        int runLength = 4;
        for (int i = 0; i < runLength; i++) {
          logger.debug(prefix + i);
          addExpectedFileNamedIfItsTime_ByDate(randomOutputDir, testId, false);
          incCurrentTime(500);
          tbnatp.setCurrentTime(currentTime);
        }
    
        existenceCheck(expectedFilenameList);
        sortedContentCheck(randomOutputDir, runLength, prefix);
      }
    
      @Test
      public void timeAndSize() throws Exception {
        String testId = "timeAndSize";
        lc.putProperty("testId", testId);
        String prefix = "Hello-----";
    
        // the number of times the log file will be written to before time based
        // roll-over occurs
        int approxWritesPerPeriod = 64;
        sizeThreshold = prefix.length() * approxWritesPerPeriod;
        lc.putProperty("sizeThreshold", "" + sizeThreshold);
        loadConfig(ClassicTestConstants.JORAN_INPUT_PREFIX + "rolling/" + testId
                + ".xml");
        Logger root = lc.getLogger(Logger.ROOT_LOGGER_NAME);
    
        expectedFilenameList.add(randomOutputDir + "z" + testId);
    
        RollingFileAppender<ILoggingEvent> rfa = (RollingFileAppender<ILoggingEvent>) root
                .getAppender("ROLLING");
    
        statusChecker.assertIsErrorFree();
    
        TimeBasedRollingPolicy tprp = (TimeBasedRollingPolicy<ILoggingEvent>) rfa
                .getTriggeringPolicy();
        TimeBasedFileNamingAndTriggeringPolicy tbnatp = tprp
                .getTimeBasedFileNamingAndTriggeringPolicy();
    
        int timeIncrement = 1000 / approxWritesPerPeriod;
        int runLength = approxWritesPerPeriod * 3;
        for (int i = 0; i < runLength; i++) {
          String msg = prefix + i;
          logger.debug(msg);
          addExpectedFileNamedIfItsTime(testId, msg, false);
          incCurrentTime(timeIncrement);
          tbnatp.setCurrentTime(currentTime);
        }
    
        sortedContentCheck(randomOutputDir, runLength, prefix);
        int eCount = existenceCount(expectedFilenameList);
        // for various reasons, it is extremely difficult to have the files
        // match exactly the expected archive files. Thus, we aim for
        // an approximate match
        assertTrue("exitenceCount=" + eCount + ", expectedFilenameList.size="
                + expectedFilenameList.size(), eCount >= 4
                && eCount > expectedFilenameList.size() / 2);
      }
    
      void addExpectedFileNamedIfItsTime(String testId, String msg,
                                         boolean gzExtension) {
        fileSize += msg.getBytes().length;
    
        if (passThresholdTime(nextRolloverThreshold)) {
          fileIndexCounter = 0;
          fileSize = 0;
          addExpectedFileName(testId, getDateOfPreviousPeriodsStart(),
                  fileIndexCounter, gzExtension);
          recomputeRolloverThreshold(currentTime);
          return;
        }
    
        // windows can delay file size changes, so we only allow for
        // fileIndexCounter 0 and 1
        if ((fileIndexCounter < 1) && fileSize > sizeThreshold) {
          addExpectedFileName(testId, getDateOfPreviousPeriodsStart(),
                  ++fileIndexCounter, gzExtension);
          fileSize = -1;
          return;
        }
      }
    
      void addExpectedFileName(String testId, Date date, int fileIndexCounter,
                               boolean gzExtension) {
    
        String fn = randomOutputDir + testId + "-" + SDF.format(date) + "."
                + fileIndexCounter;
        System.out.println("Adding " + fn);
        if (gzExtension) {
          fn += ".gz";
        }
        expectedFilenameList.add(fn);
      }
    
      @Override
      protected void addExpectedFileNamedIfItsTime_ByDate(String outputDir, String testId,
                                                          boolean gzExtension) {
        if (passThresholdTime(nextRolloverThreshold)) {
          addExpectedFileName_ByDate(outputDir, testId, getDateOfPreviousPeriodsStart(),
                  gzExtension);
          recomputeRolloverThreshold(currentTime);
        }
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/util/���������������������������0000755�0001750�0001750�00000000000�12203357067�026065� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/util/MockInitialContext.java����0000644�0001750�0001750�00000002003�12136042271�032464� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.util;
    
    import java.util.HashMap;
    import java.util.Map;
    
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
    
    public class MockInitialContext extends InitialContext {
    
      public Map<String, Object> map = new HashMap<String, Object>();
    
      public MockInitialContext() throws NamingException {
        super();
      }
    
      @Override
      public Object lookup(String name) throws NamingException {
        if (name == null) {
          return null;
        }
    
        return map.get(name);
      }
    
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/util/LoggerNameUtilTest.java����0000644�0001750�0001750�00000004367�12136042271�032451� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.util;
    
    import org.junit.Test;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import static org.junit.Assert.assertEquals;
    
    public class LoggerNameUtilTest {
    
    
      @Test
      public void smoke0() {
        List<String> witnessList = new ArrayList<String>();
        witnessList.add("a");
        witnessList.add("b");
        witnessList.add("c");
        List<String> partList = LoggerNameUtil.computeNameParts("a.b.c");
        assertEquals(witnessList, partList);
      }
    
      @Test
      public void smoke1() {
        List<String> witnessList = new ArrayList<String>();
        witnessList.add("com");
        witnessList.add("foo");
        witnessList.add("Bar");
        List<String> partList = LoggerNameUtil.computeNameParts("com.foo.Bar");
        assertEquals(witnessList, partList);
      }
    
      @Test
      public void emptyStringShouldReturnAListContainingOneEmptyString() {
        List<String> witnessList = new ArrayList<String>();
        witnessList.add("");
        List<String> partList = LoggerNameUtil.computeNameParts("");
        assertEquals(witnessList, partList);
      }
    
      @Test
      public void dotAtLastPositionShouldReturnAListWithAnEmptyStringAsLastElement() {
        List<String> witnessList = new ArrayList<String>();
        witnessList.add("com");
        witnessList.add("foo");
        witnessList.add("");
    
        List<String> partList = LoggerNameUtil.computeNameParts("com.foo.");
        assertEquals(witnessList, partList);
      }
    
      @Test
      public void supportNestedClasses() {
        List<String> witnessList = new ArrayList<String>();
        witnessList.add("com");
        witnessList.add("foo");
        witnessList.add("Bar");
        witnessList.add("Nested");
    
        List<String> partList = LoggerNameUtil.computeNameParts("com.foo.Bar$Nested");
        assertEquals(witnessList, partList);
      }
    
    
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000150�00000000000�011561� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/util/LevelToSyslogSeverityTest.java�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/util/LevelToSyslogSeverityTest.j0000644�0001750�0001750�00000003177�12136042271�033407� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.util;
    
    import static org.junit.Assert.assertEquals;
    
    import org.junit.Test;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.classic.spi.LoggingEvent;
    import ch.qos.logback.core.net.SyslogConstants;
    
    public class LevelToSyslogSeverityTest {
    
      @Test
      public void smoke() {
    
        assertEquals(SyslogConstants.DEBUG_SEVERITY, LevelToSyslogSeverity
            .convert(createEventOfLevel(Level.TRACE)));
    
        assertEquals(SyslogConstants.DEBUG_SEVERITY, LevelToSyslogSeverity
            .convert(createEventOfLevel(Level.DEBUG)));
    
        assertEquals(SyslogConstants.INFO_SEVERITY, LevelToSyslogSeverity
            .convert(createEventOfLevel(Level.INFO)));
    
        assertEquals(SyslogConstants.WARNING_SEVERITY, LevelToSyslogSeverity
            .convert(createEventOfLevel(Level.WARN)));
    
        assertEquals(SyslogConstants.ERROR_SEVERITY, LevelToSyslogSeverity
            .convert(createEventOfLevel(Level.ERROR)));
    
      }
    
      ILoggingEvent createEventOfLevel(Level level) {
        LoggingEvent event = new LoggingEvent();
        event.setLevel(level);
        return event;
      }
    
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000154�00000000000�011565� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/util/InitializationIntegrationTest.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/util/InitializationIntegrationTe0000644�0001750�0001750�00000002240�12136042271�033463� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.util;
    
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.core.read.ListAppender;
    import ch.qos.logback.core.util.StatusPrinter;
    import org.junit.Test;
    import org.slf4j.LoggerFactory;
    
    import static org.junit.Assert.assertNotNull;
    
    /**
     * @author Ceki G&uuml;c&uuml;
     */
    public class InitializationIntegrationTest {
    
      @Test
      public void smoke() {
        Logger logger = (Logger) LoggerFactory.getLogger(this.getClass());
        Logger root = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
        ListAppender la = (ListAppender) root.getAppender("LIST");
        assertNotNull(la);
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000157�00000000000�011570� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/util/ContextInitializerAutoConfigTest.java������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/util/ContextInitializerAutoConfi0000644�0001750�0001750�00000003754�12136042271�033452� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.util;
    
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.Appender;
    import ch.qos.logback.core.ConsoleAppender;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Ignore;
    import org.junit.Test;
    import org.slf4j.LoggerFactory;
    
    import static org.junit.Assert.assertNotNull;
    import static org.junit.Assert.assertTrue;
    
    public class ContextInitializerAutoConfigTest {
    
      org.slf4j.Logger logger = LoggerFactory.getLogger(this.getClass());
      Logger root = (Logger) LoggerFactory.getLogger("root");
    
      @Before
      public void setUp() throws Exception {
        logger.debug("Hello-didily-odily");
      }
    
      @After
      public void tearDown() throws Exception {
        System.clearProperty(ContextInitializer.CONFIG_FILE_PROPERTY);
        System.clearProperty(ContextInitializer.STATUS_LISTENER_CLASS);
      }
    
      @Test
      @Ignore
      // this test works only if logback-test.xml or logback.xml files are on the classpath.
      // However, this is something we try to avoid in order to simplify the life
      // of users trying to follows the manual and logback-examples from an IDE
      public void autoconfig() {
        LoggerContext iLoggerFactory = (LoggerContext) LoggerFactory.getILoggerFactory();
        iLoggerFactory.reset();
        Appender<ILoggingEvent> appender = root.getAppender("STDOUT");
        assertNotNull(appender);
        assertTrue(appender instanceof ConsoleAppender);
      }
    }
    ��������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/util/PackageTest.java�����������0000644�0001750�0001750�00000001527�12136042271�031121� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.util;
    
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    import org.junit.runners.Suite.SuiteClasses;
    
    @RunWith(Suite.class)
    @SuiteClasses({ContextInitializerTest.class, ContextInitializerAutoConfigTest.class,
            LogbackMDCAdapterTest.class, LevelToSyslogSeverityTest.class})
    
    public class PackageTest {
    }�������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000150�00000000000�011561� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/util/MockInitialContextFactory.java�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/util/MockInitialContextFactory.j0000644�0001750�0001750�00000002356�12136042271�033337� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.util;
    
    import java.util.Hashtable;
    
    import javax.naming.Context;
    import javax.naming.NamingException;
    import javax.naming.spi.InitialContextFactory;
    
    
    public class MockInitialContextFactory implements InitialContextFactory {
      static MockInitialContext mic;
    
      static {
        System.out.println("MockInitialContextFactory static called");
        initialize();
      }
     
      public static void initialize() {
        try {
          mic = new MockInitialContext();
        } catch (NamingException e) {
          e.printStackTrace();
        }
      }
      
      public Context getInitialContext(Hashtable<?, ?> environment)
          throws NamingException {
        return mic;
      }
      
      public static MockInitialContext getContext() {
        return mic;
      }
    
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/util/LogbackMDCAdapterTest.java�0000644�0001750�0001750�00000017017�12136042271�032756� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.util;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertNotNull;
    import static org.junit.Assert.assertNull;
    import static org.junit.Assert.assertTrue;
    
    import java.util.HashMap;
    import java.util.Map;
    import java.util.concurrent.CountDownLatch;
    
    import org.junit.Test;
    import ch.qos.logback.core.testUtil.RandomUtil;
    
    public class LogbackMDCAdapterTest {
    
      final static String A_SUFFIX = "A_SUFFIX";
      final static String B_SUFFIX = "B_SUFFIX";
    
      int diff = RandomUtil.getPositiveInt();
    
      private final LogbackMDCAdapter mdcAdapter = new LogbackMDCAdapter();
    
    
      /**
       * Test that CopyOnInheritThreadLocal does not barf when the
       * MDC hashmap is null
       *
       * @throws InterruptedException
       */
      @Test
      public void lbclassic77Test() throws InterruptedException {
        Map<String, String> parentHM = getMapFromMDCAdapter(mdcAdapter);
        assertNull(parentHM);
    
        ChildThreadForMDCAdapter childThread = new ChildThreadForMDCAdapter(mdcAdapter);
        childThread.start();
        childThread.join();
        assertTrue(childThread.successul);
        assertNull(childThread.childHM);
      }
    
      @Test
      public void removeForNullKeyTest() {
        mdcAdapter.remove(null);
      }
    
      @Test
      public void removeInexistentKey() {
        mdcAdapter.remove("abcdlw0");
      }
    
    
      @Test
      public void sequenceWithGet() {
        mdcAdapter.put("k0", "v0");
        Map<String, String> map0 = mdcAdapter.copyOnInheritThreadLocal.get();
        mdcAdapter.get("k0");  // point 0
        mdcAdapter.put("k0", "v1");
        // verify that map0 is that in point 0
        assertEquals("v0", map0.get("k0"));
      }
    
      @Test
      public void sequenceWithGetPropertyMap() {
        mdcAdapter.put("k0", "v0");
        Map<String, String> map0 = mdcAdapter.getPropertyMap();  // point 0
        mdcAdapter.put("k0", "v1");
        // verify that map0 is that in point 0
        assertEquals("v0", map0.get("k0"));
      }
    
      // =================================================
    
      /**
       * Test that LogbackMDCAdapter copies its hashmap when a child
       * thread inherits it.
       *
       * @throws InterruptedException
       */
      @Test
      public void copyOnInheritenceTest() throws InterruptedException {
        CountDownLatch countDownLatch = new CountDownLatch(1);
        String firstKey = "x" + diff;
        String secondKey = "o" + diff;
        mdcAdapter.put(firstKey, firstKey + A_SUFFIX);
    
        ChildThread childThread = new ChildThread(mdcAdapter, firstKey, secondKey, countDownLatch);
        childThread.start();
        countDownLatch.await();
        mdcAdapter.put(firstKey, firstKey + B_SUFFIX);
        childThread.join();
    
        assertNull(mdcAdapter.get(secondKey));
        assertTrue(childThread.successful);
    
        Map<String, String> parentHM = getMapFromMDCAdapter(mdcAdapter);
        assertTrue(parentHM != childThread.childHM);
    
        HashMap<String, String> parentHMWitness = new HashMap<String, String>();
        parentHMWitness.put(firstKey, firstKey + B_SUFFIX);
        assertEquals(parentHMWitness, parentHM);
    
        HashMap<String, String> childHMWitness = new HashMap<String, String>();
        childHMWitness.put(firstKey, firstKey + A_SUFFIX);
        childHMWitness.put(secondKey, secondKey + A_SUFFIX);
        assertEquals(childHMWitness, childThread.childHM);
    
      }
    
      // see also http://jira.qos.ch/browse/LBCLASSIC-253
      @Test
      public void clearOnChildThreadShouldNotAffectParent() throws InterruptedException {
        String firstKey = "x" + diff;
        String secondKey = "o" + diff;
    
        mdcAdapter.put(firstKey, firstKey + A_SUFFIX);
        assertEquals(firstKey + A_SUFFIX, mdcAdapter.get(firstKey));
    
        Thread clearer = new ChildThread(mdcAdapter, firstKey, secondKey) {
          @Override
          public void run() {
            mdcAdapter.clear();
            assertNull(mdcAdapter.get(firstKey));
          }
        };
    
        clearer.start();
        clearer.join();
    
        assertEquals(firstKey + A_SUFFIX, mdcAdapter.get(firstKey));
      }
    
      // see http://jira.qos.ch/browse/LBCLASSIC-289
      // this test used to fail without synchronization code in LogbackMDCAdapter
      @Test
      public void nearSimultaneousPutsShouldNotCauseConcurrentModificationException() throws InterruptedException {
        // For the weirdest reason, modifications to mdcAdapter must be done
        // before the definition anonymous ChildThread class below. Otherwise, the
        // map in the child thread, the one contained in mdcAdapter.copyOnInheritThreadLocal,
        // is null. How strange is that?
    
        // let the map have lots of elements so that copying it takes time
         for (int i = 0; i < 2048; i++) {
          mdcAdapter.put("k" + i, "v" + i);
        }
    
        ChildThread childThread = new ChildThread(mdcAdapter, null, null) {
          @Override
          public void run() {
            for (int i = 0; i < 16; i++) {
              mdcAdapter.put("ck" + i, "cv" + i);
              Thread.yield();
            }
            successful = true;
          }
        };
    
    
        childThread.start();
        Thread.sleep(1);
        for (int i = 0; i < 16; i++) {
          mdcAdapter.put("K" + i, "V" + i);
        }
        childThread.join();
        assertTrue(childThread.successful);
      }
    
    
      Map<String, String> getMapFromMDCAdapter(LogbackMDCAdapter lma) {
        InheritableThreadLocal<Map<String, String>> copyOnInheritThreadLocal = lma.copyOnInheritThreadLocal;
        return copyOnInheritThreadLocal.get();
      }
    
      // ==========================    various thread classes
      class ChildThreadForMDCAdapter extends Thread {
    
        LogbackMDCAdapter logbackMDCAdapter;
        boolean successul;
        Map<String, String> childHM;
    
        ChildThreadForMDCAdapter(LogbackMDCAdapter logbackMDCAdapter) {
          this.logbackMDCAdapter = logbackMDCAdapter;
        }
    
        @Override
        public void run() {
          childHM = getMapFromMDCAdapter(logbackMDCAdapter);
          logbackMDCAdapter.get("");
          successul = true;
        }
      }
    
    
      class ChildThread extends Thread {
    
        LogbackMDCAdapter logbackMDCAdapter;
        String firstKey;
        String secondKey;
        boolean successful;
        Map<String, String> childHM;
        CountDownLatch countDownLatch;
    
        ChildThread(LogbackMDCAdapter logbackMDCAdapter) {
          this(logbackMDCAdapter, null, null);
        }
    
        ChildThread(LogbackMDCAdapter logbackMDCAdapter, String firstKey, String secondKey) {
          this(logbackMDCAdapter, firstKey, secondKey, null);
        }
    
        ChildThread(LogbackMDCAdapter logbackMDCAdapter, String firstKey, String secondKey, CountDownLatch countDownLatch) {
          super("chil");
          this.logbackMDCAdapter  = logbackMDCAdapter;
          this.firstKey = firstKey;
          this.secondKey = secondKey;
          this.countDownLatch = countDownLatch;
        }
    
        @Override
        public void run() {
          logbackMDCAdapter.put(secondKey, secondKey + A_SUFFIX);
          assertNotNull(logbackMDCAdapter.get(firstKey));
          assertEquals(firstKey + A_SUFFIX, logbackMDCAdapter.get(firstKey));
          if (countDownLatch != null) countDownLatch.countDown();
          assertEquals(secondKey + A_SUFFIX, logbackMDCAdapter.get(secondKey));
          successful = true;
          childHM = getMapFromMDCAdapter(logbackMDCAdapter);
        }
      }
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/util/ContextInitializerTest.java0000644�0001750�0001750�00000011012�12136042271�033404� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.util;
    
    
    import static org.junit.Assert.assertNotNull;
    import static org.junit.Assert.assertNull;
    import static org.junit.Assert.assertTrue;
    import static org.junit.Assert.assertEquals;
    
    import java.util.List;
    
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Ignore;
    import org.junit.Test;
    import org.slf4j.ILoggerFactory;
    import org.slf4j.LoggerFactory;
    
    import ch.qos.logback.classic.ClassicTestConstants;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.Appender;
    import ch.qos.logback.core.ConsoleAppender;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.status.StatusListener;
    import ch.qos.logback.core.status.TrivialStatusListener;
    import sun.security.jca.ProviderList;
    
    public class ContextInitializerTest {
    
      LoggerContext loggerContext = new LoggerContext();
      Logger root = loggerContext.getLogger(Logger.ROOT_LOGGER_NAME);
    
      @Before
      public void setUp() throws Exception {
      }
    
      @After
      public void tearDown() throws Exception {
        System.clearProperty(ContextInitializer.CONFIG_FILE_PROPERTY);
        System.clearProperty(ContextInitializer.STATUS_LISTENER_CLASS);
      }
    
    
      @Test
      @Ignore  
      // this test works only if logback-test.xml or logback.xml files are on the classpath. 
      // However, this is something we try to avoid in order to simplify the life
      // of users trying to follow the manual and logback-examples from an IDE
      public void reset() throws JoranException {
        {
          new ContextInitializer(loggerContext).autoConfig();
          Appender appender = root.getAppender("STDOUT");
          assertNotNull(appender);
          assertTrue(appender instanceof ConsoleAppender);
        }
        {
          loggerContext.stop();
          Appender<ILoggingEvent> appender = root.getAppender("STDOUT");
          assertNull(appender);
        }
      }
    
      @Test
      public void autoConfigFromSystemProperties() throws JoranException  {
        doAutoConfigFromSystemProperties(ClassicTestConstants.INPUT_PREFIX + "autoConfig.xml");
        doAutoConfigFromSystemProperties("autoConfigAsResource.xml");
        // test passing a URL. note the relative path syntax with file:src/test/...
        doAutoConfigFromSystemProperties("file:"+ClassicTestConstants.INPUT_PREFIX + "autoConfig.xml"); 
      }
      
      public void doAutoConfigFromSystemProperties(String val) throws JoranException {
        //lc.reset();
        System.setProperty(ContextInitializer.CONFIG_FILE_PROPERTY, val);
        new ContextInitializer(loggerContext).autoConfig();
        Appender<ILoggingEvent> appender = root.getAppender("AUTO_BY_SYSTEM_PROPERTY");
        assertNotNull(appender);
      }
      
      @Test
      public void autoStatusListener() throws JoranException {
        System.setProperty(ContextInitializer.STATUS_LISTENER_CLASS, TrivialStatusListener.class.getName());
        List<StatusListener> statusListenerList = loggerContext.getStatusManager().getCopyOfStatusListenerList();
        assertEquals(0, statusListenerList.size());
        doAutoConfigFromSystemProperties(ClassicTestConstants.INPUT_PREFIX + "autoConfig.xml");
        statusListenerList = loggerContext.getStatusManager().getCopyOfStatusListenerList();
        assertTrue(statusListenerList.size() +" should be 1", statusListenerList.size() == 1);
        // LOGBACK-767
        TrivialStatusListener tsl = (TrivialStatusListener) statusListenerList.get(0);
        assertTrue("expecting at least one event in list", tsl.list.size() > 0);
      }
      
      @Test
      public void autoOnConsoleStatusListener() throws JoranException {
        System.setProperty(ContextInitializer.STATUS_LISTENER_CLASS,  ContextInitializer.SYSOUT);
        List<StatusListener> sll = loggerContext.getStatusManager().getCopyOfStatusListenerList();
        assertEquals(0, sll.size());
        doAutoConfigFromSystemProperties(ClassicTestConstants.INPUT_PREFIX + "autoConfig.xml");
        sll = loggerContext.getStatusManager().getCopyOfStatusListenerList();
        assertTrue(sll.size() +" should be 1", sll.size() == 1);
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/util/TeztHelper.java������������0000644�0001750�0001750�00000003037�12136042271�031012� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.util;
    
    public class TeztHelper {
    
      
      static public Throwable makeNestedException(int level) {
        if (level == 0) {
          return new Exception("nesting level=" + level);
        }
        Throwable cause = makeNestedException(level - 1);
        return new Exception("nesting level =" + level, cause);
      }
    
      /**
       * Usage:
       * <pre>
       * String s = "123";
       * positionOf("1").in(s) < positionOf("3").in(s)
       * </pre>
       *
       * @param pattern Plain text to be found
       * @return StringPosition fluent interface
       */
      public static StringPosition positionOf(String pattern) {
        return new StringPosition(pattern);
      }
    
      public static class StringPosition {
        private final String pattern;
    
        public StringPosition(String pattern) {
          this.pattern = pattern;
        }
    
        public int in(String s) {
          final int position = s.indexOf(pattern);
          if(position < 0)
            throw new IllegalArgumentException("String '" + pattern + "' not found in: '" + s + "'");
          return position;
        }
    
      }
    
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/pattern/������������������������0000755�0001750�0001750�00000000000�12203357067�026565� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/pattern/ConverterTest.java������0000644�0001750�0001750�00000027642�12136042271�032243� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.pattern;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertTrue;
    import static org.junit.Assert.fail;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import org.junit.Before;
    import org.junit.Test;
    import org.slf4j.MDC;
    import org.slf4j.MarkerFactory;
    
    import ch.qos.logback.classic.ClassicConstants;
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.ClassicTestConstants;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.classic.spi.LoggingEvent;
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.net.SyslogConstants;
    import ch.qos.logback.core.pattern.DynamicConverter;
    import ch.qos.logback.core.pattern.FormatInfo;
    
    public class ConverterTest {
    
      LoggerContext lc = new LoggerContext();
      Logger logger = lc.getLogger(ConverterTest.class);
      LoggingEvent le;
      List<String> optionList = new ArrayList<String>();
    
      // The LoggingEvent is massaged with an FCQN of FormattingConverter. This
      // forces the returned caller information to match the caller stack for this
      // this particular test.
      LoggingEvent makeLoggingEvent(Exception ex) {
        return new LoggingEvent(
            ch.qos.logback.core.pattern.FormattingConverter.class.getName(),
            logger, Level.INFO, "Some message", ex, null);
      }
    
      Exception getException(String msg, Exception cause) {
        return new Exception(msg, cause);
      }
    
      @Before
      public void setUp() throws Exception {
        Exception rootEx = getException("Innermost", null);
        Exception nestedEx = getException("Nested", rootEx);
    
        Exception ex = new Exception("Bogus exception", nestedEx);
    
        le = makeLoggingEvent(ex);
      }
    
      @Test
      public void testLineOfCaller() {
        {
          DynamicConverter<ILoggingEvent> converter = new LineOfCallerConverter();
          StringBuilder buf = new StringBuilder();
          converter.write(buf, le);
          // the number below should be the line number of the previous line
          assertEquals("75", buf.toString());
        }
      }
    
      @Test
      public void testLevel() {
        {
          DynamicConverter<ILoggingEvent> converter = new LevelConverter();
          StringBuilder buf = new StringBuilder();
          converter.write(buf, le);
          assertEquals("INFO", buf.toString());
        }
        {
          DynamicConverter<ILoggingEvent> converter = new LevelConverter();
          converter.setFormattingInfo(new FormatInfo(1, 1, true, false));
          StringBuilder buf = new StringBuilder();
          converter.write(buf, le);
          assertEquals("I", buf.toString());
        }
      }
    
      @Test
      public void testThread() {
        DynamicConverter<ILoggingEvent> converter = new ThreadConverter();
        StringBuilder buf = new StringBuilder();
        converter.write(buf, le);
        System.out.println(buf.toString());
        String regex = ClassicTestConstants.NAKED_MAIN_REGEX;
        assertTrue(buf.toString().matches(regex));
      }
    
      @Test
      public void testMessage() {
        DynamicConverter<ILoggingEvent> converter = new MessageConverter();
        StringBuilder buf = new StringBuilder();
        converter.write(buf, le);
        assertEquals("Some message", buf.toString());
      }
    
      @Test
      public void testLineSeparator() {
        DynamicConverter<ILoggingEvent> converter = new LineSeparatorConverter();
        StringBuilder buf = new StringBuilder();
        converter.write(buf, le);
        assertEquals(CoreConstants.LINE_SEPARATOR, buf.toString());
      }
    
      @Test
      public void testException() {
        {
          DynamicConverter<ILoggingEvent> converter = new ThrowableProxyConverter();
          StringBuilder buf = new StringBuilder();
          converter.write(buf, le);
        }
    
        {
          DynamicConverter<ILoggingEvent> converter = new ThrowableProxyConverter();
          this.optionList.add("3");
          converter.setOptionList(this.optionList);
          StringBuilder buf = new StringBuilder();
          converter.write(buf, le);
        }
      }
    
      @Test
      public void testLogger() {
        {
          ClassicConverter converter = new LoggerConverter();
          StringBuilder buf = new StringBuilder();
          converter.write(buf, le);
          assertEquals(this.getClass().getName(), buf.toString());
        }
    
        {
          ClassicConverter converter = new LoggerConverter();
          this.optionList.add("20");
          converter.setOptionList(this.optionList);
          converter.start();
          StringBuilder buf = new StringBuilder();
          converter.write(buf, le);
          assertEquals("c.q.l.c.p.ConverterTest", buf.toString());
        }
    
        {
          DynamicConverter<ILoggingEvent> converter = new LoggerConverter();
          this.optionList.clear();
          this.optionList.add("0");
          converter.setOptionList(this.optionList);
          converter.start();
          StringBuilder buf = new StringBuilder();
          converter.write(buf, le);
          assertEquals("ConverterTest", buf.toString());
        }
      }
    
      @Test
      public void testVeryLongLoggerName() {
        ClassicConverter converter = new LoggerConverter();
        this.optionList.add("5");
        converter.setOptionList(this.optionList);
        converter.start();
        StringBuilder buf = new StringBuilder();
        
        char c = 'a';
        int extraParts = 3;
        int totalParts = ClassicConstants.MAX_DOTS + extraParts;
        StringBuilder loggerNameBuf = new StringBuilder();
        StringBuilder witness = new StringBuilder();
        
        for(int i = 0; i < totalParts ; i++) {
          loggerNameBuf.append(c).append(c).append(c); 
          if(i < ClassicConstants.MAX_DOTS) {
            witness.append(c);
          } else {
            witness.append(c).append(c).append(c);
          }
          loggerNameBuf.append('.');
          witness.append('.');
        }
        loggerNameBuf.append("zzzzzz");
        witness.append("zzzzzz");
        
        le.setLoggerName(loggerNameBuf.toString());
        converter.write(buf, le);
        assertEquals(witness.toString(), buf.toString());
      }
      
      @Test
      public void testClass() {
        DynamicConverter<ILoggingEvent> converter = new ClassOfCallerConverter();
        StringBuilder buf = new StringBuilder();
        converter.write(buf, le);
        assertEquals(this.getClass().getName(), buf.toString());
      }
    
      @Test
      public void testMethodOfCaller() {
        DynamicConverter<ILoggingEvent> converter = new MethodOfCallerConverter();
        StringBuilder buf = new StringBuilder();
        converter.write(buf, le);
        assertEquals("testMethodOfCaller", buf.toString());
      }
    
      @Test
      public void testFileOfCaller() {
        DynamicConverter<ILoggingEvent> converter = new FileOfCallerConverter();
        StringBuilder buf = new StringBuilder();
        converter.write(buf, le);
        assertEquals("ConverterTest.java", buf.toString());
      }
    
      @Test
      public void testCallerData() {
        {
          DynamicConverter<ILoggingEvent> converter = new CallerDataConverter();
          converter.start();
    
          StringBuilder buf = new StringBuilder();
          converter.write(buf, le);
          if (buf.length() < 10) {
            fail("buf is too short");
          }
        }
    
        {
          DynamicConverter<ILoggingEvent> converter = new CallerDataConverter();
          this.optionList.add("2");
          this.optionList.add("XXX");
          converter.setOptionList(this.optionList);
          converter.start();
    
          StringBuilder buf = new StringBuilder();
          LoggingEvent event = makeLoggingEvent(null);
          event.setMarker(MarkerFactory.getMarker("XXX"));
          converter.write(buf, event);
          if (buf.length() < 10) {
            fail("buf is too short");
          }
        }
    
        {
          DynamicConverter<ILoggingEvent> converter = new CallerDataConverter();
          this.optionList.clear();
          this.optionList.add("2");
          this.optionList.add("XXX");
          this.optionList.add("*");
          converter.setOptionList(this.optionList);
          converter.start();
    
          StringBuilder buf = new StringBuilder();
          LoggingEvent event = makeLoggingEvent(null);
          event.setMarker(MarkerFactory.getMarker("YYY"));
          converter.write(buf, event);
          if (buf.length() < 10) {
            fail("buf is too short");
          }
        }
        {
          DynamicConverter<ILoggingEvent> converter = new CallerDataConverter();
          this.optionList.clear();
          this.optionList.add("2");
          this.optionList.add("XXX");
          this.optionList.add("+");
          converter.setOptionList(this.optionList);
          converter.start();
    
          StringBuilder buf = new StringBuilder();
          LoggingEvent event = makeLoggingEvent(null);
          event.setMarker(MarkerFactory.getMarker("YYY"));
          converter.write(buf, event);
          if (buf.length() < 10) {
            fail("buf is too short");
          }
        }
    
        {
          DynamicConverter<ILoggingEvent> converter = new CallerDataConverter();
          this.optionList.clear();
          this.optionList.add("2");
          this.optionList.add("XXX");
          this.optionList.add("*");
          converter.setOptionList(this.optionList);
          converter.start();
    
          StringBuilder buf = new StringBuilder();
          converter.write(buf, le);
          if (buf.length() < 10) {
            fail("buf is too short");
          }
          // System.out.println(buf);
        }
    
      }
    
      @Test
      public void testRelativeTime() throws Exception {
        DynamicConverter<ILoggingEvent> converter = new RelativeTimeConverter();
        StringBuilder buf0 = new StringBuilder();
        StringBuilder buf1 = new StringBuilder();
        ILoggingEvent e0 = makeLoggingEvent(null);
        ILoggingEvent e1 = makeLoggingEvent(null);
        converter.write(buf0, e0);
        converter.write(buf1, e1);
        assertEquals(buf0.toString(), buf1.toString());
      }
    
      @Test
      public void testSyslogStart() throws Exception {
        DynamicConverter<ILoggingEvent> converter = new SyslogStartConverter();
        this.optionList.clear();
        this.optionList.add("MAIL");
        converter.setOptionList(this.optionList);
        converter.start();
    
        ILoggingEvent event = makeLoggingEvent(null);
    
        StringBuilder buf = new StringBuilder();
        converter.write(buf, event);
    
        String expected = "<"
            + (SyslogConstants.LOG_MAIL + SyslogConstants.INFO_SEVERITY) + ">";
        assertTrue(buf.toString().startsWith(expected));
      }
    
      @Test
      public void testMDCConverter() throws Exception {
        MDC.clear();
        MDC.put("someKey", "someValue");
        MDCConverter converter = new MDCConverter();
        this.optionList.clear();
        this.optionList.add("someKey");
        converter.setOptionList(optionList);
        converter.start();
    
        ILoggingEvent event = makeLoggingEvent(null);
    
        String result = converter.convert(event);
        assertEquals("someValue", result);
      }
    
      @Test
      public void contextNameConverter() {
        ClassicConverter converter = new ContextNameConverter();
        // see http://jira.qos.ch/browse/LBCLASSIC-149
        LoggerContext lcOther = new LoggerContext();
        lcOther.setName("another");
        converter.setContext(lcOther);
        
        lc.setName("aValue");
        ILoggingEvent event = makeLoggingEvent(null);
    
        String result = converter.convert(event);
        assertEquals("aValue", result);
      }
      
      @Test 
      public void contextProperty() {
        PropertyConverter converter = new PropertyConverter();
        converter.setContext(lc);
        List<String> ol = new ArrayList<String>();
        ol.add("k");
        converter.setOptionList(ol);
        converter.start();
        lc.setName("aValue");
        lc.putProperty("k", "v");
        ILoggingEvent event = makeLoggingEvent(null);
    
        String result = converter.convert(event);
        assertEquals("v", result);
      }
    }
    ����������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000155�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/pattern/ThrowableProxyConverterTest.java��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/pattern/ThrowableProxyConverterT0000644�0001750�0001750�00000004103�12136042271�033504� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.pattern;
    
    import static org.junit.Assert.assertEquals;
    
    import java.io.PrintWriter;
    import java.io.StringWriter;
    
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.classic.spi.LoggingEvent;
    import ch.qos.logback.classic.util.TeztHelper;
    
    public class ThrowableProxyConverterTest {
    
      LoggerContext lc = new LoggerContext();
      ThrowableProxyConverter tpc = new ThrowableProxyConverter();
      StringWriter sw = new StringWriter();
      PrintWriter pw = new PrintWriter(sw);
    
      @Before
      public void setUp() throws Exception {
        tpc.setContext(lc);
        tpc.start();
      }
    
      @After
      public void tearDown() throws Exception {
      }
    
      private ILoggingEvent createLoggingEvent(Throwable t) {
        return new LoggingEvent(this.getClass().getName(), lc
            .getLogger(Logger.ROOT_LOGGER_NAME), Level.DEBUG, "test message", t,
            null);
      }
    
      @Test
      public void smoke() {
        Exception t = new Exception("smoke");
        verify(t);
      }
    
      @Test
      public void nested() {
        Throwable t = TeztHelper.makeNestedException(1);
        verify(t);
      }
    
      void verify(Throwable t) {
        t.printStackTrace(pw);
    
        ILoggingEvent le = createLoggingEvent(t);
        String result = tpc.convert(le);
        System.out.println(result);
        result = result.replace("common frames omitted", "more");
        assertEquals(sw.toString(), result);
      }
    
    
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/pattern/MarkerConverterTest.java0000644�0001750�0001750�00000005461�12136042271�033400� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.pattern;
    
    import static org.junit.Assert.assertEquals;
    
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    import org.slf4j.IMarkerFactory;
    import org.slf4j.Marker;
    import org.slf4j.helpers.BasicMarkerFactory;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.classic.spi.LoggingEvent;
    
    public class MarkerConverterTest {
      
      LoggerContext lc;
      MarkerConverter converter;
      // use a different facotry for each test so that they are independent
      IMarkerFactory markerFactory = new BasicMarkerFactory();
      
      @Before
      public void setUp() throws Exception {
        lc = new LoggerContext();
        converter = new MarkerConverter();
        converter.start();
      }
      
      @After
      public void tearDown() throws Exception {
        lc = null;
        converter.stop();
        converter = null;
      }
    
      @Test
      public void testWithNullMarker() {
        String result = converter.convert(createLoggingEvent(null));
        assertEquals("", result);
      }
      
      @Test
      public void testWithMarker() {
        String name = "test";
        Marker marker = markerFactory.getMarker(name);
        String result = converter.convert(createLoggingEvent(marker));
        assertEquals(name, result);
      }
      
      @Test
      public void testWithOneChildMarker() {
        Marker marker = markerFactory.getMarker("test");
        marker.add(markerFactory.getMarker("child"));
        
        String result = converter.convert(createLoggingEvent(marker));
        
        assertEquals("test [ child ]", result);
      }
      
      @Test
      public void testWithSeveralChildMarker() {
        Marker marker = markerFactory.getMarker("testParent");
        marker.add(markerFactory.getMarker("child1"));
        marker.add(markerFactory.getMarker("child2"));
        marker.add(markerFactory.getMarker("child3"));
        
        String result = converter.convert(createLoggingEvent(marker));
        
        assertEquals("testParent [ child1, child2, child3 ]", result);
      }
      
      private ILoggingEvent createLoggingEvent(Marker marker) {
        LoggingEvent le = new LoggingEvent(this.getClass().getName(), lc.getLogger(Logger.ROOT_LOGGER_NAME),
            Level.DEBUG, "test message", null, null);
        le.setMarker(marker);
        return le;
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/pattern/PackageTest.java��������0000644�0001750�0001750�00000001747�12136042271�031625� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.pattern;
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    import org.junit.runners.Suite.SuiteClasses;
    
    @RunWith(Suite.class)
    @SuiteClasses({ConverterTest.class,
            TargetLengthBasedClassNameAbbreviatorTest.class, MDCConverterTest.class,
            MarkerConverterTest.class, ExtendedThrowableProxyConverterTest.class,
            ThrowableProxyConverterTest.class,
            RootCauseFirstThrowableProxyConverterTest.class})
    public class PackageTest {
    
    }�������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000173�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/pattern/TargetLengthBasedClassNameAbbreviatorTest.java������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/pattern/TargetLengthBasedClassNa0000644�0001750�0001750�00000012455�12136042271�033304� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.pattern;
    
    import static org.junit.Assert.*;
    
    import org.junit.Test;
    
    import ch.qos.logback.classic.pattern.TargetLengthBasedClassNameAbbreviator;
    
    public class TargetLengthBasedClassNameAbbreviatorTest  {
    
    
      @Test
      public void testShortName() {
        {
          TargetLengthBasedClassNameAbbreviator abbreviator = new TargetLengthBasedClassNameAbbreviator(100);
          String name = "hello";
          assertEquals(name, abbreviator.abbreviate(name));
        }
        {
          TargetLengthBasedClassNameAbbreviator abbreviator = new TargetLengthBasedClassNameAbbreviator(100);
          String name = "hello.world";
          assertEquals(name, abbreviator.abbreviate(name));
        }
      }
    
      @Test
      public void testNoDot() {
        TargetLengthBasedClassNameAbbreviator abbreviator = new TargetLengthBasedClassNameAbbreviator(1);
        String name = "hello";
        assertEquals(name, abbreviator.abbreviate(name));
      }
    
      @Test
      public void testOneDot() {
        {
          TargetLengthBasedClassNameAbbreviator abbreviator = new TargetLengthBasedClassNameAbbreviator(1);
          String name = "hello.world";
          assertEquals("h.world", abbreviator.abbreviate(name));
        }
    
        {
          TargetLengthBasedClassNameAbbreviator abbreviator = new TargetLengthBasedClassNameAbbreviator(1);
          String name = "h.world";
          assertEquals("h.world", abbreviator.abbreviate(name));
        }
    
        {
          TargetLengthBasedClassNameAbbreviator abbreviator = new TargetLengthBasedClassNameAbbreviator(1);
          String name = ".world";
          assertEquals(".world", abbreviator.abbreviate(name));
        }
      }
    
      @Test
      public void testTwoDot() {
        {
          TargetLengthBasedClassNameAbbreviator abbreviator = new TargetLengthBasedClassNameAbbreviator(1);
          String name = "com.logback.Foobar";
          assertEquals("c.l.Foobar", abbreviator.abbreviate(name));
        }
    
        {
          TargetLengthBasedClassNameAbbreviator abbreviator = new TargetLengthBasedClassNameAbbreviator(1);
          String name = "c.logback.Foobar";
          assertEquals("c.l.Foobar", abbreviator.abbreviate(name));
        }
    
        {
          TargetLengthBasedClassNameAbbreviator abbreviator = new TargetLengthBasedClassNameAbbreviator(1);
          String name = "c..Foobar";
          assertEquals("c..Foobar", abbreviator.abbreviate(name));
        }
        {
          TargetLengthBasedClassNameAbbreviator abbreviator = new TargetLengthBasedClassNameAbbreviator(1);
          String name = "..Foobar";
          assertEquals("..Foobar", abbreviator.abbreviate(name));
        }
      }
      
      @Test
      public void test3Dot() {
        {
          TargetLengthBasedClassNameAbbreviator abbreviator = new TargetLengthBasedClassNameAbbreviator(1);
          String name = "com.logback.xyz.Foobar";
          assertEquals("c.l.x.Foobar", abbreviator.abbreviate(name));
        }
        {
          TargetLengthBasedClassNameAbbreviator abbreviator = new TargetLengthBasedClassNameAbbreviator(13);
          String name = "com.logback.xyz.Foobar";
          assertEquals("c.l.x.Foobar", abbreviator.abbreviate(name));
        }
        {
          TargetLengthBasedClassNameAbbreviator abbreviator = new TargetLengthBasedClassNameAbbreviator(14);
          String name = "com.logback.xyz.Foobar";
          assertEquals("c.l.xyz.Foobar", abbreviator.abbreviate(name));
        }
        
        {
          TargetLengthBasedClassNameAbbreviator abbreviator = new TargetLengthBasedClassNameAbbreviator(15);
          String name = "com.logback.alligator.Foobar";
          assertEquals("c.l.a.Foobar", abbreviator.abbreviate(name));
        }
      }
      @Test
      public void testXDot() {
        {
          TargetLengthBasedClassNameAbbreviator abbreviator = new TargetLengthBasedClassNameAbbreviator(21);
          String name = "com.logback.wombat.alligator.Foobar";
          assertEquals("c.l.w.a.Foobar", abbreviator.abbreviate(name));
        }
        
        {
          TargetLengthBasedClassNameAbbreviator abbreviator = new TargetLengthBasedClassNameAbbreviator(22);
          String name = "com.logback.wombat.alligator.Foobar";
          assertEquals("c.l.w.alligator.Foobar", abbreviator.abbreviate(name));
        }
        
        {
          TargetLengthBasedClassNameAbbreviator abbreviator = new TargetLengthBasedClassNameAbbreviator(1);
          String name = "com.logback.wombat.alligator.tomato.Foobar";
          assertEquals("c.l.w.a.t.Foobar", abbreviator.abbreviate(name));
        }
        
        {
          TargetLengthBasedClassNameAbbreviator abbreviator = new TargetLengthBasedClassNameAbbreviator(21);
          String name = "com.logback.wombat.alligator.tomato.Foobar";
          assertEquals("c.l.w.a.tomato.Foobar", abbreviator.abbreviate(name));
        }
        
        {
          TargetLengthBasedClassNameAbbreviator abbreviator = new TargetLengthBasedClassNameAbbreviator(29);
          String name = "com.logback.wombat.alligator.tomato.Foobar";
          assertEquals("c.l.w.alligator.tomato.Foobar", abbreviator.abbreviate(name));
        }
      }
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000165�00000000000�011567� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/pattern/ExtendedThrowableProxyConverterTest.java������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/pattern/ExtendedThrowableProxyCo0000644�0001750�0001750�00000005724�12136042271�033445� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.pattern;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertTrue;
    
    import java.io.PrintWriter;
    import java.io.StringWriter;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.PatternLayout;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.classic.spi.LoggingEvent;
    
    public class ExtendedThrowableProxyConverterTest {
    
      LoggerContext lc = new LoggerContext();
      ExtendedThrowableProxyConverter etpc = new ExtendedThrowableProxyConverter();
      StringWriter sw = new StringWriter();
      PrintWriter pw = new PrintWriter(sw);
    
      @Before
      public void setUp() throws Exception {
        etpc.setContext(lc);
        etpc.start();
      }
    
      @After
      public void tearDown() throws Exception {
      }
    
      private ILoggingEvent createLoggingEvent(Throwable t) {
        return new LoggingEvent(this.getClass().getName(), lc
            .getLogger(Logger.ROOT_LOGGER_NAME), Level.DEBUG, "test message", t,
            null);
      }
    
      @Test
      public void integration() {
        PatternLayout pl = new PatternLayout();
        pl.setContext(lc);
        pl.setPattern("%m%n");
        pl.start();
        ILoggingEvent e = createLoggingEvent(new Exception("x"));
        String res = pl.doLayout(e);
    
        // make sure that at least some package data was output
        Pattern p = Pattern.compile(" \\[junit.*\\]");
        Matcher m = p.matcher(res);
        int i = 0;
        while(m.find()) {
          i++;
        }
        assertTrue(i+ " should be larger than 5", i > 5);
      }
    
      @Test
      public void smoke() {
        Exception t = new Exception("smoke");
        verify(t);
      }
    
      @Test
      public void nested() {
        Throwable t = makeNestedException(1);
        verify(t);
      }
    
      void verify(Throwable t) {
        t.printStackTrace(pw);
    
        ILoggingEvent le = createLoggingEvent(t);
        String result = etpc.convert(le);
        result = result.replace("common frames omitted", "more");
        result = result.replaceAll(" ~?\\[.*\\]", "");
        assertEquals(sw.toString(), result);
      }
    
      Throwable makeNestedException(int level) {
        if (level == 0) {
          return new Exception("nesting level=" + level);
        }
        Throwable cause = makeNestedException(level - 1);
        return new Exception("nesting level =" + level, cause);
      }
    }
    ��������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/pattern/MDCConverterTest.java���0000644�0001750�0001750�00000004245�12136042271�032561� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.pattern;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertTrue;
    
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    import org.slf4j.MDC;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.classic.spi.LoggingEvent;
    import ch.qos.logback.core.util.SystemInfo;
    
    public class MDCConverterTest {
    
      LoggerContext lc;
      MDCConverter converter;
    
      @Before
      public void setUp() throws Exception {
        lc = new LoggerContext();
        converter = new MDCConverter();
        converter.start();
      }
    
      @After
      public void tearDown() throws Exception {
        lc = null;
        converter.stop();
        converter = null;
      }
    
      @Test
      public void testConvertWithOneEntry() {
        MDC.clear();
        MDC.put("testKey", "testValue");
        ILoggingEvent le = createLoggingEvent();
        String result = converter.convert(le);
        assertEquals("testKey=testValue", result);
      }
    
      @Test
      public void testConvertWithMultipleEntries() {
        MDC.clear();
        MDC.put("testKey", "testValue");
        MDC.put("testKey2", "testValue2");
        ILoggingEvent le = createLoggingEvent();
        String result = converter.convert(le);
        boolean isConform = result.matches("testKey2?=testValue2?, testKey2?=testValue2?");
        assertTrue(result + " is not conform", isConform);
      }
    
      private ILoggingEvent createLoggingEvent() {
        return new LoggingEvent(this.getClass().getName(), lc
            .getLogger(Logger.ROOT_LOGGER_NAME), Level.DEBUG, "test message", null,
            null);
      }
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000173�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/pattern/RootCauseFirstThrowableProxyConverterTest.java������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/pattern/RootCauseFirstThrowableP0000644�0001750�0001750�00000007013�12136042271�033406� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.pattern;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.PatternLayout;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.classic.spi.LoggingEvent;
    import org.junit.Before;
    import org.junit.Test;
    
    import java.io.PrintWriter;
    import java.io.StringWriter;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    import static ch.qos.logback.classic.util.TeztHelper.makeNestedException;
    import static ch.qos.logback.classic.util.TeztHelper.positionOf;
    import static org.fest.assertions.Assertions.assertThat;
    
    /**
     * @author Tomasz Nurkiewicz
     * @since 2010-08-15, 18:34:21
     */
    public class RootCauseFirstThrowableProxyConverterTest {
    
      private LoggerContext context = new LoggerContext();
      private ThrowableProxyConverter converter = new RootCauseFirstThrowableProxyConverter();
      private StringWriter stringWriter = new StringWriter();
      private PrintWriter printWriter = new PrintWriter(stringWriter);
    
      @Before
      public void setUp() throws Exception {
        converter.setContext(context);
        converter.start();
      }
    
      private ILoggingEvent createLoggingEvent(Throwable t) {
        return new LoggingEvent(this.getClass().getName(), context
            .getLogger(Logger.ROOT_LOGGER_NAME), Level.DEBUG, "test message", t,
            null);
      }
    
      @Test
      public void integration() {
        //given
        PatternLayout pl = new PatternLayout();
        pl.setContext(context);
        pl.setPattern("%m%rEx%n");
        pl.start();
    
        //when
        ILoggingEvent e = createLoggingEvent(new Exception("x"));
        String result = pl.doLayout(e);
    
        //then
        // make sure that at least some package data was output
        Pattern p = Pattern.compile(" \\[junit.*\\]");
        Matcher m = p.matcher(result);
        int i = 0;
        while(m.find()) {
          i++;
        }
        assertThat(i).isGreaterThan(5);
      }
    
      @Test
      public void smoke() {
        //given
        Exception exception = new Exception("smoke");
        exception.printStackTrace(printWriter);
    
        //when
        ILoggingEvent le = createLoggingEvent(exception);
        String result = converter.convert(le);
    
        //then
        result = result.replace("common frames omitted", "more");
        result = result.replaceAll(" ~?\\[.*\\]", "");
        assertThat(result).isEqualTo(stringWriter.toString());
      }
    
      @Test
      public void nested() {
        //given
        Throwable nestedException = makeNestedException(2);
        nestedException.printStackTrace(printWriter);
    
        //when
        ILoggingEvent le = createLoggingEvent(nestedException);
        String result = converter.convert(le);
    
        //then
        assertThat(result).startsWith("java.lang.Exception: nesting level=0");
        assertThat(
                positionOf("nesting level=0").in(result)).isLessThan(
                positionOf("nesting level =1").in(result));
        assertThat(
                positionOf("nesting level =1").in(result)).isLessThan(
                positionOf("nesting level =2").in(result));
      }
    
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/AsyncAppenderTest.java����������0000644�0001750�0001750�00000006046�12136042271�031346� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic;
    
    import ch.qos.logback.classic.net.testObjectBuilders.LoggingEventBuilderInContext;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.UnsynchronizedAppenderBase;
    import ch.qos.logback.core.read.ListAppender;
    import ch.qos.logback.core.status.OnConsoleStatusListener;
    import ch.qos.logback.core.testUtil.RandomUtil;
    import org.junit.Before;
    import org.junit.Test;
    import org.slf4j.MDC;
    
    import static org.junit.Assert.*;
    
    /**
     * @author Ceki G&uuml;lc&uuml;
     * @author Torsten Juergeleit
     */
    public class AsyncAppenderTest {
    
      String thisClassName = this.getClass().getName();
      LoggerContext context = new LoggerContext();
      AsyncAppender asyncAppender = new AsyncAppender();
      ListAppender<ILoggingEvent> listAppender = new ListAppender<ILoggingEvent>();
      OnConsoleStatusListener onConsoleStatusListener = new OnConsoleStatusListener();
      LoggingEventBuilderInContext builder = new LoggingEventBuilderInContext(context, thisClassName, UnsynchronizedAppenderBase.class.getName());
      int diff = RandomUtil.getPositiveInt();
    
      @Before
      public void setUp() {
        onConsoleStatusListener.setContext(context);
        context.getStatusManager().add(onConsoleStatusListener);
        onConsoleStatusListener.start();
    
        asyncAppender.setContext(context);
        listAppender.setContext(context);
        listAppender.setName("list");
        listAppender.start();
      }
    
      @Test
      public void eventWasPreparedForDeferredProcessing() {
        asyncAppender.addAppender(listAppender);
        asyncAppender.start();
    
        String k = "k" + diff;
        MDC.put(k, "v");
        asyncAppender.doAppend(builder.build(diff));
        MDC.clear();
    
        asyncAppender.stop();
        assertFalse(asyncAppender.isStarted());
    
        // check the event
        assertEquals(1, listAppender.list.size());
        ILoggingEvent e = listAppender.list.get(0);
    
        // check that MDC values were correctly retained
        assertEquals("v", e.getMDCPropertyMap().get(k));
        assertFalse(e.hasCallerData());
      }
    
    
      @Test
      public void settingIncludeCallerDataPropertyCausedCallerDataToBeIncluded() {
        asyncAppender.addAppender(listAppender);
        asyncAppender.setIncludeCallerData(true);
        asyncAppender.start();
    
    
        asyncAppender.doAppend(builder.build(diff));
        asyncAppender.stop();
    
        // check the event
        assertEquals(1, listAppender.list.size());
        ILoggingEvent e = listAppender.list.get(0);
        assertTrue(e.hasCallerData());
        StackTraceElement ste = e.getCallerData()[0];
        assertEquals(thisClassName, ste.getClassName());
      }
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/LoggerContextPerfTest.java������0000644�0001750�0001750�00000005505�12136042143�032210� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic;
    
    
    import ch.qos.logback.classic.corpus.CorpusModel;
    import ch.qos.logback.core.contention.*;
    import org.junit.Before;
    import org.junit.Ignore;
    import org.junit.Test;
    
    import static org.junit.Assert.fail;
    
    public class LoggerContextPerfTest {
    
      static int THREAD_COUNT = 10000;
      int totalTestDuration = 4000;
    
      LoggerContext loggerContext = new LoggerContext();
    
      ThreadedThroughputCalculator harness = new ThreadedThroughputCalculator(totalTestDuration);
      RunnableWithCounterAndDone[] runnableArray = buildRunnableArray();
    
      CorpusModel corpusMaker;
    
      @Before
      public void setUp() throws Exception {
      }
    
      private RunnableWithCounterAndDone[] buildRunnableArray() {
        RunnableWithCounterAndDone[] runnableArray = new  RunnableWithCounterAndDone[THREAD_COUNT];
        for(int i = 0; i < THREAD_COUNT; i++) {
          runnableArray[i] = new GetLoggerRunnable();
        }
        return runnableArray;
      }
    
      // Results computed on a Intel i7
      // 1 thread
      // 13'107 ops per milli using Hashtable for LoggerContext.loggerCache
      // 15'258 ops per milli using ConcurrentHashMap for LoggerContext.loggerCache
    
      // 10 threads
      //  8'468 ops per milli using Hashtable for LoggerContext.loggerCache
      // 58'945 ops per milli using ConcurrentHashMap for LoggerContext.loggerCache
    
      // 100 threads
      //  8'863 ops per milli using Hashtable for LoggerContext.loggerCache
      // 34'810 ops per milli using ConcurrentHashMap for LoggerContext.loggerCache
    
      // 1'000 threads
      //  8'188 ops per milli using Hashtable for LoggerContext.loggerCache
      // 24'012 ops per milli using ConcurrentHashMap for LoggerContext.loggerCache
    
      // 10'000 threads
      // 7'595 ops per milli using Hashtable for LoggerContext.loggerCache
      // 8'989 ops per milli using ConcurrentHashMap for LoggerContext.loggerCache
    
      @Test
      public void computeResults() throws InterruptedException {
        harness.execute(runnableArray);
        harness.printThroughput("getLogger performance: ", true);
      }
    
      private class GetLoggerRunnable extends RunnableWithCounterAndDone {
    
        final int burstLength = 3;
        public void run() {
          while (!isDone()) {
            long i = counter % burstLength;
    
            loggerContext.getLogger("a"+i);
            counter++;
            if(i == 0) {
              Thread.yield();
            }
          }
        }
      }
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/encoder/������������������������0000755�0001750�0001750�00000000000�12203357067�026527� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/encoder/PackageTest.java��������0000644�0001750�0001750�00000001415�12136042271�031557� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.encoder;
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    import org.junit.runners.Suite.SuiteClasses;
    
    @RunWith(Suite.class)
    @SuiteClasses( { PatternLayoutEncoderTest.class, LayoutInsteadOfEncoderTest.class})
    public class PackageTest {
    }���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000154�00000000000�011565� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/encoder/LayoutInsteadOfEncoderTest.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/encoder/LayoutInsteadOfEncoderTe0000644�0001750�0001750�00000004640�12136042271�033312� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.encoder;
    
    import static ch.qos.logback.core.CoreConstants.CODES_URL;
    import static org.junit.Assert.assertTrue;
    
    import org.junit.Before;
    import org.junit.Test;
    import org.slf4j.Logger;
    
    import ch.qos.logback.classic.ClassicTestConstants;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.FileAppender;
    import ch.qos.logback.core.encoder.LayoutWrappingEncoder;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.status.Status;
    import ch.qos.logback.core.status.StatusChecker;
    import ch.qos.logback.core.util.StatusPrinter;
    
    public class LayoutInsteadOfEncoderTest {
    
      // TeztConstants.TEST_SRC_PREFIX + "input/joran/ignore.xml"
      JoranConfigurator jc = new JoranConfigurator();
      LoggerContext loggerContext = new LoggerContext();
    
      @Before
      public void setUp() {
        jc.setContext(loggerContext);
    
      }
    
      // jc.doConfigure(TeztConstants.TEST_SRC_PREFIX + "input/joran/ignore.xml");
    
      @Test
      public void layoutInsteadOfEncoer() throws JoranException {
        jc.doConfigure(ClassicTestConstants.JORAN_INPUT_PREFIX
            + "compatibility/layoutInsteadOfEncoder.xml");
        StatusPrinter.print(loggerContext);
        StatusChecker checker = new StatusChecker(loggerContext);
        checker.assertContainsMatch(Status.WARN, "This appender no longer admits a layout as a sub-component");
        checker.assertContainsMatch(Status.WARN, "See also "+CODES_URL+"#layoutInsteadOfEncoder for details");
        
        ch.qos.logback.classic.Logger root = (ch.qos.logback.classic.Logger) loggerContext.getLogger(Logger.ROOT_LOGGER_NAME);
        FileAppender<ILoggingEvent> fileAppender = (FileAppender<ILoggingEvent>) root.getAppender("LIOE");
        assertTrue(fileAppender.isStarted());
        assertTrue(fileAppender.getEncoder() instanceof LayoutWrappingEncoder);
      }
    }
    ������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000152�00000000000�011563� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/encoder/PatternLayoutEncoderTest.java�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/encoder/PatternLayoutEncoderTest0000644�0001750�0001750�00000004367�12136042271�033430� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.encoder;
    
    import static org.junit.Assert.*;
    
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.nio.charset.Charset;
    
    import ch.qos.logback.classic.PatternLayout;
    import org.junit.Before;
    import org.junit.Test;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.classic.spi.LoggingEvent;
    
    public class PatternLayoutEncoderTest {
    
      PatternLayoutEncoder ple = new PatternLayoutEncoder();
      LoggerContext context = new LoggerContext();
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
      Logger logger = context.getLogger(PatternLayoutEncoderTest.class);
      Charset utf8Charset = Charset.forName("UTF-8");
      
      @Before
      public void setUp() {
        ple.setPattern("%m");
        ple.setContext(context);
      }
    
      ILoggingEvent makeLoggingEvent(String message) {
        return new LoggingEvent("", logger, Level.DEBUG, message, null, null);
      }
    
      @Test
      public void smoke() throws IOException {
        init(baos);
        String msg = "hello";
        ILoggingEvent event = makeLoggingEvent(msg);
        ple.doEncode(event);
        ple.close();
        assertEquals(msg, baos.toString());
      }
    
      void init(ByteArrayOutputStream baos) throws IOException {
        ple.start();
        ((PatternLayout) ple.getLayout()).setOutputPatternAsHeader(false);
        ple.init(baos);
      }
    
      @Test
      public void charset() throws IOException {
        ple.setCharset(utf8Charset);
        init(baos);
        String msg = "\u03b1";
        ILoggingEvent event = makeLoggingEvent(msg);
        ple.doEncode(event);
        ple.close();
        assertEquals(msg, new String(baos.toByteArray(), utf8Charset.name()));
      }
    
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/html/���������������������������0000755�0001750�0001750�00000000000�12203357067�026054� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/html/PackageTest.java�����������0000644�0001750�0001750�00000001332�12136042271�031102� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.html;
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    import org.junit.runners.Suite.SuiteClasses;
    
    @RunWith(Suite.class)
    @SuiteClasses(HTMLLayoutTest.class)
    public class PackageTest {
    }������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/html/HTMLLayoutTest.java��������0000644�0001750�0001750�00000021646�12136042271�031523� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.html;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertFalse;
    import static org.junit.Assert.assertNotNull;
    import static org.junit.Assert.assertTrue;
    
    import java.io.ByteArrayInputStream;
    import java.util.List;
    
    import org.dom4j.Document;
    import org.dom4j.Element;
    import org.dom4j.io.SAXReader;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Ignore;
    import org.junit.Test;
    import org.xml.sax.EntityResolver;
    
    import ch.qos.logback.classic.ClassicTestConstants;
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.classic.spi.DummyThrowableProxy;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.classic.spi.LoggingEvent;
    import ch.qos.logback.classic.spi.StackTraceElementProxy;
    import ch.qos.logback.classic.spi.ThrowableProxy;
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.testUtil.StringListAppender;
    import ch.qos.logback.core.util.StatusPrinter;
    
    public class HTMLLayoutTest {
    
      LoggerContext lc;
      Logger root;
      HTMLLayout layout;
    
      @Before
      public void setUp() throws Exception {
        lc = new LoggerContext();
        lc.setName("default");
    
        layout = new HTMLLayout();
        layout.setThrowableRenderer(new DefaultThrowableRenderer());
        layout.setContext(lc);
        layout.setPattern("%level%thread%msg");
        layout.start();
    
        root = lc.getLogger(Logger.ROOT_LOGGER_NAME);
    
      }
    
      @After
      public void tearDown() throws Exception {
        lc = null;
        layout = null;
      }
    
      @Test
      public void testHeader() throws Exception {
        String header = layout.getFileHeader();
        // System.out.println(header);
    
        Document doc = parseOutput(header + "</body></html>");
        Element rootElement = doc.getRootElement();
        assertNotNull(rootElement.element("body"));
      }
    
      @SuppressWarnings("unchecked")
      @Test
      public void testPresentationHeader() throws Exception {
        String header = layout.getFileHeader();
        String presentationHeader = layout.getPresentationHeader();
        header = header + presentationHeader;
        // System.out.println(header);
    
        Document doc = parseOutput(header + "</table></body></html>");
        Element rootElement = doc.getRootElement();
        Element bodyElement = rootElement.element("body");
        Element tableElement = bodyElement.element("table");
        Element trElement = tableElement.element("tr");
        List<Element> elementList = trElement.elements();
        assertEquals("Level", elementList.get(0).getText());
        assertEquals("Thread", elementList.get(1).getText());
        assertEquals("Message", elementList.get(2).getText());
      }
    
      @Test
      public void testAppendThrowable() throws Exception {
        StringBuilder buf = new StringBuilder();
        DummyThrowableProxy tp = new DummyThrowableProxy();
        tp.setClassName("test1");
        tp.setMessage("msg1");
        
        StackTraceElement ste1 = new StackTraceElement("c1", "m1", "f1", 1);
        StackTraceElement ste2 = new StackTraceElement("c2", "m2", "f2", 2);
        
        StackTraceElementProxy[] stepArray = { new StackTraceElementProxy(ste1),
            new StackTraceElementProxy(ste2) };
        tp.setStackTraceElementProxyArray(stepArray);
        DefaultThrowableRenderer renderer = (DefaultThrowableRenderer) layout
            .getThrowableRenderer();
    
        renderer.render(buf, tp);
        System.out.println(buf.toString());
        String[] result = buf.toString().split(CoreConstants.LINE_SEPARATOR);
        System.out.println(result[0]);
        assertEquals("test1: msg1", result[0]);
        assertEquals(DefaultThrowableRenderer.TRACE_PREFIX + "at c1.m1(f1:1)", result[1]);
      }
    
      @Test
      public void testDoLayout() throws Exception {
        ILoggingEvent le = createLoggingEvent();
    
        String result = layout.getFileHeader();
        result += layout.getPresentationHeader();
        result += layout.doLayout(le);
        result += layout.getPresentationFooter();
        result += layout.getFileFooter();
    
        Document doc = parseOutput(result);
        Element rootElement = doc.getRootElement();
        rootElement.toString();
    
        // the rest of this test is very dependent of the output generated
        // by HTMLLayout. Given that the XML parser already verifies
        // that the result conforms to xhtml-strict, we may want to
        // skip the assertions below. However, the assertions below are another
        // *independent* way to check the output format.
    
        // head, body
        assertEquals(2, rootElement.elements().size());
        Element bodyElement = (Element) rootElement.elements().get(1);
        Element tableElement = (Element) bodyElement.elements().get(3);
        assertEquals("table", tableElement.getName());
        Element trElement = (Element) tableElement.elements().get(1);
        {
          Element tdElement = (Element) trElement.elements().get(0);
          assertEquals("DEBUG", tdElement.getText());
        }
        {
          Element tdElement = (Element) trElement.elements().get(1);
          String regex = ClassicTestConstants.NAKED_MAIN_REGEX;
          System.out.println(tdElement.getText());
          assertTrue(tdElement.getText().matches(regex));
        }
        {
          Element tdElement = (Element) trElement.elements().get(2);
          assertEquals("test message", tdElement.getText());
        }
      }
    
      @SuppressWarnings("unchecked")
      @Test
      public void layoutWithException() throws Exception {
        layout.setPattern("%level %thread %msg %ex");
        LoggingEvent le = createLoggingEvent();
        le.setThrowableProxy(new ThrowableProxy(new Exception("test Exception")));
        String result = layout.doLayout(le);
    
        String stringToParse = layout.getFileHeader();
        stringToParse = stringToParse + layout.getPresentationHeader();
        stringToParse += result;
        stringToParse += "</table></body></html>";
    
        // System.out.println(stringToParse);
    
        Document doc = parseOutput(stringToParse);
        Element rootElement = doc.getRootElement();
        Element bodyElement = rootElement.element("body");
        Element tableElement = bodyElement.element("table");
        List<Element> trElementList = tableElement.elements();
        Element exceptionRowElement = trElementList.get(2);
        Element exceptionElement = exceptionRowElement.element("td");
    
        assertEquals(3, tableElement.elements().size());
        assertTrue(exceptionElement.getText().contains(
            "java.lang.Exception: test Exception"));
      }
    
      @Test
      @Ignore
      public void rawLimit() throws Exception {
        StringBuilder sb = new StringBuilder();
        String header = layout.getFileHeader();
        assertTrue(header
            .startsWith("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">"));
        sb.append(header);
        sb.append(layout.getPresentationHeader());
        for (int i = 0; i < CoreConstants.TABLE_ROW_LIMIT * 3; i++) {
          sb.append(layout.doLayout(new LoggingEvent(this.getClass().getName(),
              root, Level.DEBUG, "test message" + i, null, null)));
        }
        sb.append(layout.getPresentationFooter());
        sb.append(layout.getFileFooter());
        // check that the output adheres to xhtml-strict.dtd
        parseOutput(sb.toString());
      }
    
      private LoggingEvent createLoggingEvent() {
        return new LoggingEvent(this.getClass().getName(), root,
            Level.DEBUG, "test message", null, null);
      }
    
      Document parseOutput(String output) throws Exception {
        EntityResolver resolver = new XHTMLEntityResolver();
        SAXReader reader = new SAXReader();
        reader.setValidation(true);
        reader.setEntityResolver(resolver);
        return reader.read(new ByteArrayInputStream(output.getBytes()));
      }
    
      void configure(String file) throws JoranException {
        JoranConfigurator jc = new JoranConfigurator();
        jc.setContext(lc);
        jc.doConfigure(file);
      }
    
      @Test
      public void testConversionRuleSupportInHtmlLayout() throws JoranException {
        configure(ClassicTestConstants.JORAN_INPUT_PREFIX
            + "conversionRule/htmlLayout0.xml");
       
        root.getAppender("LIST");
        String msg = "Simon says";
        root.debug(msg);
        StringListAppender<ILoggingEvent> sla = (StringListAppender<ILoggingEvent>) root
            .getAppender("LIST");
        assertNotNull(sla);
        StatusPrinter.print(lc);
        assertEquals(1, sla.strList.size());
        assertFalse(sla.strList.get(0).contains("PARSER_ERROR"));
      }
    }
    ������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/html/XHTMLEntityResolver.java���0000644�0001750�0001750�00000003320�12136042271�032521� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.html;
    
    import java.io.InputStream;
    import java.util.HashMap;
    import java.util.Map;
    
    import org.xml.sax.EntityResolver;
    import org.xml.sax.InputSource;
    
    public class XHTMLEntityResolver implements EntityResolver {
    
      // key: public id, value: relative path to DTD file
      static Map<String, String> entityMap = new HashMap<String, String>();
    
      static {
        entityMap.put("-//W3C//DTD XHTML 1.0 Strict//EN",
            "/dtd/xhtml1-strict.dtd");
        entityMap.put("-//W3C//ENTITIES Latin 1 for XHTML//EN",
            "/dtd/xhtml-lat1.ent");
        entityMap.put("-//W3C//ENTITIES Symbols for XHTML//EN",
            "/dtd/xhtml-symbol.ent");
        entityMap.put("-//W3C//ENTITIES Special for XHTML//EN",
            "/dtd/xhtml-special.ent");
      }
    
      public InputSource resolveEntity(String publicId, String systemId) {
        //System.out.println(publicId);
        final String relativePath = (String)entityMap.get(publicId);
    
        if (relativePath != null) {
          Class clazz = getClass();
          InputStream in =
            clazz.getResourceAsStream(relativePath);
          if (in == null) {
            return null;
          } else {
            return new InputSource(in);
          }
        } else {
          return null;
        }
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/jul/����������������������������0000755�0001750�0001750�00000000000�12203357067�025702� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000147�00000000000�011567� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/jul/LevelChangePropagatorTest.java��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/jul/LevelChangePropagatorTest.ja0000644�0001750�0001750�00000004247�12136042271�033272� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.jul;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.core.testUtil.RandomUtil;
    import org.junit.Before;
    import org.junit.Test;
    
    import static org.junit.Assert.assertEquals;
    
    public class LevelChangePropagatorTest {
      int rand = RandomUtil.getPositiveInt();
      LoggerContext loggerContext = new LoggerContext();
      LevelChangePropagator levelChangePropagator = new LevelChangePropagator();
    
      @Before
      public void setUp() {
        levelChangePropagator.setContext(loggerContext);
        loggerContext.addListener(levelChangePropagator);
      }
    
      void checkLevelChange(String loggerName, Level level) {
        Logger logger = loggerContext.getLogger(loggerName);
        logger.setLevel(level);
        java.util.logging.Logger julLogger = JULHelper.asJULLogger(logger);
        java.util.logging.Level julLevel = JULHelper.asJULLevel(level);
    
        assertEquals(julLevel, julLogger.getLevel());
      }
    
      @Test
      public void smoke() {
        checkLevelChange("a", Level.INFO);
        checkLevelChange("a.b", Level.DEBUG);
      }
    
      @Test
      public void root() {
        checkLevelChange(Logger.ROOT_LOGGER_NAME, Level.TRACE);
      }
    
      // see http://jira.qos.ch/browse/LBCLASSIC-256
      @Test
      public void gc() {
        Logger logger = loggerContext.getLogger("gc"+rand);
        logger.setLevel(Level.INFO);
        // invoke GC so that the relevant julLogger can be garbage collected.
        System.gc();
        java.util.logging.Logger julLogger = JULHelper.asJULLogger(logger);
        java.util.logging.Level julLevel = JULHelper.asJULLevel(Level.INFO);
    
        assertEquals(julLevel, julLogger.getLevel());
     }
    
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/jul/PackageTest.java������������0000644�0001750�0001750�00000001346�12136042271�030735� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.jul;
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    import org.junit.runners.Suite.SuiteClasses;
    
    @RunWith(Suite.class)
    @SuiteClasses({LevelChangePropagatorTest.class})
    public class PackageTest {
    }������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/LoggerSerializationTest.java����0000644�0001750�0001750�00000011533�12136042271�032564� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic;
    
    import java.io.*;
    
    import ch.qos.logback.core.util.CoreTestConstants;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    import org.slf4j.LoggerFactory;
    
    import static junit.framework.Assert.assertEquals;
    import static org.junit.Assert.assertTrue;
    
    public class LoggerSerializationTest {
    
      static final String SERIALIZATION_PREFIX = CoreTestConstants.TEST_INPUT_PREFIX+"/serialization/";
    
      // force SLF4J initialization for subsequent Logger readResolce ooperaiton
      org.slf4j.Logger unused = LoggerFactory.getLogger(this.getClass());
      LoggerContext lc;
      Logger logger;
    
      ByteArrayOutputStream bos;
      ObjectOutputStream oos;
      ObjectInputStream inputStream;
    
      @Before
      public void setUp() throws Exception {
        lc = new LoggerContext();
        lc.setName("testContext");
        logger = lc.getLogger(LoggerSerializationTest.class);
        // create the byte output stream
        bos = new ByteArrayOutputStream();
        oos = new ObjectOutputStream(bos);
      }
    
      @After
      public void tearDown() throws Exception {
        lc = null;
        logger = null;
      }
    
      @Test
      public void basicSerialization() throws IOException, ClassNotFoundException {
        Foo foo = new Foo(logger);
        foo.doFoo();
        Foo fooBack = writeAndRead(foo);
        fooBack.doFoo();
      }
    
      @Test
      public void deepTreeSerialization() throws IOException {
        // crate a tree of loggers under "aaaaaaaa"
        Logger a = lc.getLogger("aaaaaaaa");
        lc.getLogger("aaaaaaaa.a");
        lc.getLogger("aaaaaaaa.a.a");
        lc.getLogger("aaaaaaaa.a.b");
        lc.getLogger("aaaaaaaa.a.c");
        lc.getLogger("aaaaaaaa.a.d");
    
        lc.getLogger("aaaaaaaa.b");
        lc.getLogger("aaaaaaaa.b.a");
        lc.getLogger("aaaaaaaa.b.b");
        lc.getLogger("aaaaaaaa.b.c");
        lc.getLogger("aaaaaaaa.b.d");
    
        lc.getLogger("aaaaaaaa.c");
        lc.getLogger("aaaaaaaa.c.a");
        lc.getLogger("aaaaaaaa.c.b");
        lc.getLogger("aaaaaaaa.c.c");
        lc.getLogger("aaaaaaaa.c.d");
    
        lc.getLogger("aaaaaaaa.d");
        lc.getLogger("aaaaaaaa.d.a");
        lc.getLogger("aaaaaaaa.d.b");
        lc.getLogger("aaaaaaaa.d.c");
        lc.getLogger("aaaaaaaa.d.d");
    
        Logger b = lc.getLogger("b");
    
        writeObject(oos, a);
        oos.close();
        int sizeA = bos.size();
    
        bos = new ByteArrayOutputStream();
        oos = new ObjectOutputStream(bos);
    
        writeObject(oos, b);
        oos.close();
        int sizeB = bos.size();
    
        assertTrue("serialized logger should be less than 100 bytes", sizeA < 100);
        // logger tree should not influnce serialization
        assertTrue("serialized loggers should be nearly the same size a:" + sizeA + ", sizeB:" + sizeB, (sizeA - sizeB) < 10);
      }
    
      private Foo writeAndRead(Foo foo) throws IOException,
              ClassNotFoundException {
        writeObject(oos, foo);
        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
        inputStream = new ObjectInputStream(bis);
        Foo fooBack = readFooObject(inputStream);
        inputStream.close();
        return fooBack;
      }
    
      Foo readFooObject(ObjectInputStream inputStream) throws IOException, ClassNotFoundException {
        return (Foo) readObject(inputStream);
      }
      private Object readObject(ObjectInputStream inputStream) throws IOException, ClassNotFoundException {
        return inputStream.readObject();
      }
    
      private void writeObject(ObjectOutputStream oos, Object o) throws IOException {
        oos.writeObject(o);
        oos.flush();
        oos.close();
      }
    
      @Test
      public void testCompatibilityWith_v1_0_11 () throws IOException, ClassNotFoundException {
        FileInputStream fis = new FileInputStream(SERIALIZATION_PREFIX+"logger_v1.0.11.ser");
        ObjectInputStream ois = new ObjectInputStream(fis);
        Logger a = (Logger) ois.readObject();
        ois.close();
        assertEquals("a", a.getName());
      }
    
      // interestingly enough, logback 1.0.11 and earlier can also read loggers serialized by 1.0.12.
      // fields not serialized are set to their default values and since the fields are not
      // used, it works out nicely
      @Test
      public void testCompatibilityWith_v1_0_12 () throws IOException, ClassNotFoundException {
        FileInputStream fis = new FileInputStream(SERIALIZATION_PREFIX+"logger_v1.0.12.ser");
        ObjectInputStream ois = new ObjectInputStream(fis);
        Logger a = (Logger) ois.readObject();
        ois.close();
        assertEquals("a", a.getName());
      }
    
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/LoggerContextTest.java����������0000644�0001750�0001750�00000016002�12136042271�031367� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertFalse;
    import static org.junit.Assert.assertNotNull;
    import static org.junit.Assert.assertNull;
    import static org.junit.Assert.assertTrue;
    import static org.junit.Assert.fail;
    
    import org.junit.Before;
    import org.junit.Test;
    
    import ch.qos.logback.classic.turbo.NOPTurboFilter;
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.status.StatusManager;
    
    public class LoggerContextTest {
      LoggerContext lc;
    
      @Before
      public void setUp() throws Exception {
        lc = new LoggerContext();
        lc.setName("x");
      }
    
      @Test
      public void testRootGetLogger() {
        Logger root = lc.getLogger(Logger.ROOT_LOGGER_NAME);
        assertEquals(Level.DEBUG, root.getLevel());
        assertEquals(Level.DEBUG, root.getEffectiveLevel());
      }
    
      @Test
      public void testLoggerX() {
        Logger x = lc.getLogger("x");
        assertNotNull(x);
        assertEquals("x", x.getName());
        assertNull(x.getLevel());
        assertEquals(Level.DEBUG, x.getEffectiveLevel());
      }
    
      @Test
      public void testNull() {
        try {
          lc.getLogger((String) null);
          fail("null should cause an exception");
        } catch (IllegalArgumentException e) {
        }
      }
    
      @Test
      public void testEmpty() {
        Logger empty = lc.getLogger("");
        LoggerTestHelper.assertNameEquals(empty, "");
        LoggerTestHelper.assertLevels(null, empty, Level.DEBUG);
    
        Logger dot = lc.getLogger(".");
        LoggerTestHelper.assertNameEquals(dot, ".");
        // LoggerTestHelper.assertNameEquals(dot.parent, "");
        // LoggerTestHelper.assertNameEquals(dot.parent.parent, "root");
    
        // assertNull(dot.parent.parent.parent);
        LoggerTestHelper.assertLevels(null, dot, Level.DEBUG);
    
    
        assertEquals(3, lc.getLoggerList().size());
      }
    
      @Test
      public void testDotDot() {
        Logger dotdot = lc.getLogger("..");
        assertEquals(4, lc.getLoggerList().size());
        LoggerTestHelper.assertNameEquals(dotdot, "..");
        // LoggerTestHelper.assertNameEquals(dotdot.parent, ".");
        // LoggerTestHelper.assertNameEquals(dotdot.parent.parent, "");
        // LoggerTestHelper.assertNameEquals(dotdot.parent.parent.parent, "root");
      }
    
      int instanceCount() {
        return lc.getLoggerList().size();
      }
    
      @Test
      public void testLoggerXY() {
        assertEquals(1, lc.getLoggerList().size());
    
        Logger xy = lc.getLogger("x.y");
        assertEquals(3, instanceCount());
        LoggerTestHelper.assertNameEquals(xy, "x.y");
        LoggerTestHelper.assertLevels(null, xy, Level.DEBUG);
    
        Logger x = lc.getLogger("x");
        assertEquals(3, instanceCount());
    
        Logger xy2 = lc.getLogger("x.y");
        assertEquals(xy, xy2);
    
        Logger x2 = lc.getLogger("x");
        assertEquals(x, x2);
        assertEquals(3, instanceCount());
      }
    
      @Test
      public void testLoggerMultipleChildren() {
        assertEquals(1, instanceCount());
        Logger xy0 = lc.getLogger("x.y0");
        LoggerTestHelper.assertNameEquals(xy0, "x.y0");
    
        Logger xy1 = lc.getLogger("x.y1");
        LoggerTestHelper.assertNameEquals(xy1, "x.y1");
    
        LoggerTestHelper.assertLevels(null, xy0, Level.DEBUG);
        LoggerTestHelper.assertLevels(null, xy1, Level.DEBUG);
        assertEquals(4, instanceCount());
    
        for (int i = 0; i < 100; i++) {
          Logger xy_i = lc.getLogger("x.y" + i);
          LoggerTestHelper.assertNameEquals(xy_i, "x.y" + i);
          LoggerTestHelper.assertLevels(null, xy_i, Level.DEBUG);
        }
        assertEquals(102, instanceCount());
      }
    
      @Test
      public void testMultiLevel() {
        Logger wxyz = lc.getLogger("w.x.y.z");
        LoggerTestHelper.assertNameEquals(wxyz, "w.x.y.z");
        LoggerTestHelper.assertLevels(null, wxyz, Level.DEBUG);
    
        Logger wx = lc.getLogger("w.x");
        wx.setLevel(Level.INFO);
        LoggerTestHelper.assertNameEquals(wx, "w.x");
        LoggerTestHelper.assertLevels(Level.INFO, wx, Level.INFO);
        LoggerTestHelper.assertLevels(null, lc.getLogger("w.x.y"), Level.INFO);
        LoggerTestHelper.assertLevels(null, wxyz, Level.INFO);
      }
    
      @Test
      public void testStatusWithUnconfiguredContext() {
        Logger logger = lc.getLogger(LoggerContextTest.class);
    
        for (int i = 0; i < 3; i++) {
          logger.debug("test");
        }
    
        logger = lc.getLogger("x.y.z");
    
        for (int i = 0; i < 3; i++) {
          logger.debug("test");
        }
    
        StatusManager sm = lc.getStatusManager();
        assertTrue("StatusManager has recieved too many messages",
                sm.getCount() == 1);
      }
    
    
      @Test
      public void resetTest() {
    
        Logger root = lc.getLogger(Logger.ROOT_LOGGER_NAME);
        Logger a = lc.getLogger("a");
        Logger ab = lc.getLogger("a.b");
    
        ab.setLevel(Level.WARN);
        root.setLevel(Level.INFO);
        lc.reset();
        assertEquals(Level.DEBUG, root.getEffectiveLevel());
        assertTrue(root.isDebugEnabled());
        assertEquals(Level.DEBUG, a.getEffectiveLevel());
        assertEquals(Level.DEBUG, ab.getEffectiveLevel());
    
        assertEquals(Level.DEBUG, root.getLevel());
        assertNull(a.getLevel());
        assertNull(ab.getLevel());
      }
    
      // http://jira.qos.ch/browse/LBCLASSIC-89
      @Test
      public void turboFilterStopOnReset() {
        NOPTurboFilter nopTF = new NOPTurboFilter();
        nopTF.start();
        lc.addTurboFilter(nopTF);
        assertTrue(nopTF.isStarted());
        lc.reset();
        assertFalse(nopTF.isStarted());
      }
    
      @Test
      public void resetTest_LBCORE_104() {
        lc.putProperty("keyA", "valA");
        lc.putObject("keyA", "valA");
        assertEquals("valA", lc.getProperty("keyA"));
        assertEquals("valA", lc.getObject("keyA"));
        lc.reset();
        assertNull(lc.getProperty("keyA"));
        assertNull(lc.getObject("keyA"));
      }
    
      @Test
      public void levelResetTest() {
        Logger root = lc.getLogger(Logger.ROOT_LOGGER_NAME);
        root.setLevel(Level.TRACE);
        assertTrue(root.isTraceEnabled());
        lc.reset();
        assertFalse(root.isTraceEnabled());
        assertTrue(root.isDebugEnabled());
      }
    
      @Test
      public void evaluatorMapPostReset() {
        lc.reset();
        assertNotNull(lc.getObject(CoreConstants.EVALUATOR_MAP));
      }
    
      // http://jira.qos.ch/browse/LOGBACK-142
      @Test
      public void concurrentModification() {
        final int runLen = 100;
        Thread thread = new Thread(new Runnable() {
          public void run() {
            for (int i = 0; i < runLen; i++)  {
              lc.getLogger("a" + i);
              Thread.yield();
            }
          }
        });
        thread.start();
    
        for (int i = 0; i < runLen; i++) {
          lc.putProperty("a" + i, "val");
          Thread.yield();
        }
    
      }
    
    }������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/HLoggerContext.java�������������0000644�0001750�0001750�00000005317�12136042271�030646� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic;
    
    import ch.qos.logback.classic.Level;
    
    
    
    /**
     * @author ceki
     */
    public class HLoggerContext {
    
      private HLogger root;
      private int size;
    
      public HLoggerContext() {
        this.root = new HLogger("root", null);
        this.root.setLevel(Level.DEBUG);
        size = 1;
      }
    
      /**
       * Return this contexts root logger
       *
       * @return
       */
      public HLogger getRootLogger() {
        return root;
      }
    
      public HLogger getLogger(final String name) {
    
        int i = 0;
        HLogger HLogger = root;
        HLogger childHLogger = null;
        String childName;
    
        while (true) {
          int h = name.indexOf('.', i);
          if (h == -1) {
            childName = name.substring(i);
          } else {
            childName = name.substring(i, h);
          }
          // move i left of the last point
          i = h + 1;
    
          synchronized (HLogger) {
            childHLogger = HLogger.getChildBySuffix(childName);
            if (childHLogger == null) {
              childHLogger = HLogger.createChildByLastNamePart(childName);
              incSize();
            }
          }
          HLogger = childHLogger;
          if (h == -1) {
            return childHLogger;
          }
        }
      }
    
      private synchronized  void incSize() {
        size++;
      }
    
      int size() {
        return size;
      }
      /**
       * Check if the named logger exists in the hierarchy. If so return
       * its reference, otherwise returns <code>null</code>.
       *
       * @param name the name of the logger to search for.
       */
      HLogger exists(String name) {
        int i = 0;
        HLogger HLogger = root;
        HLogger childHLogger = null;
        String childName;
        while (true) {
          int h = name.indexOf('.', i);
          if (h == -1) {
            childName = name.substring(i);
          } else {
            childName = name.substring(i, h);
          }
          // move i left of the last point
          i = h + 1;
    
          synchronized (HLogger) {
            childHLogger = HLogger.getChildBySuffix(childName);
            if (childHLogger == null) {
              return null;
            }
          }
          HLogger = childHLogger;
          if (h == -1) {
            if (childHLogger.getName().equals(name)) {
              return childHLogger;
            } else {
              return null;
            }
          }
        }
      }
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/MessageFormattingTest.java������0000644�0001750�0001750�00000005225�12136042271�032227� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic;
    
    import static org.junit.Assert.assertEquals;
    
    import org.junit.Before;
    import org.junit.Test;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.read.ListAppender;
    
    public class MessageFormattingTest  {
    
      LoggerContext lc;
      ListAppender<ILoggingEvent> listAppender;
    
      @Before
      public void setUp() {
        lc = new LoggerContext();
        Logger logger = lc.getLogger(Logger.ROOT_LOGGER_NAME);
        listAppender = new ListAppender<ILoggingEvent>();
        listAppender.setContext(lc);
        listAppender.start();
        logger.addAppender(listAppender);
      }
    
      @Test
      public void testFormattingOneArg() {
        Logger logger = lc.getLogger(Logger.ROOT_LOGGER_NAME);
        logger.debug("{}", new Integer(12));
        ILoggingEvent event = (ILoggingEvent) listAppender.list.get(0);
        assertEquals("12", event.getFormattedMessage());
      }
    
      @Test
      public void testFormattingTwoArg() {
        Logger logger = lc.getLogger(Logger.ROOT_LOGGER_NAME);
        logger.debug("{}-{}", new Integer(12), new Integer(13));
        ILoggingEvent event = (ILoggingEvent) listAppender.list.get(0);
        assertEquals("12-13", event.getFormattedMessage());
      }
    
      @Test
      public void testNoFormatting() {
        Logger logger = lc.getLogger(Logger.ROOT_LOGGER_NAME);
        logger.debug("test", new Integer(12), new Integer(13));
        ILoggingEvent event = (ILoggingEvent) listAppender.list.get(0);
        assertEquals("test", event.getFormattedMessage());
      }
    
      @Test
      public void testNoFormatting2() {
        Logger logger = lc.getLogger(Logger.ROOT_LOGGER_NAME);
        logger.debug("test");
        ILoggingEvent event = (ILoggingEvent) listAppender.list.get(0);
        assertEquals("test", event.getFormattedMessage());
      }
    
      @Test
      public void testMessageConverter() {
        Logger logger = lc.getLogger(Logger.ROOT_LOGGER_NAME);
        logger.debug("{}", 12);
        ILoggingEvent event = (ILoggingEvent) listAppender.list.get(0);
        PatternLayout layout = new PatternLayout();
        layout.setContext(lc);
        layout.setPattern("%m");
        layout.start();
        String formattedMessage = layout.doLayout(event);
        assertEquals("12", formattedMessage);
      }
    
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/PackageTest.java����������������0000644�0001750�0001750�00000001764�12136042271�030147� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic;
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    import org.junit.runners.Suite.SuiteClasses;
    
    @RunWith(Suite.class)
    @SuiteClasses({LoggerContextTest.class, LoggerPerfTest.class,
            ScenarioBasedLoggerContextTest.class, PatternLayoutTest.class,
            LoggerTest.class, LoggerSerializationTest.class,
            MessageFormattingTest.class, MDCTest.class,
            TurboFilteringInLoggerTest.class,
            AsyncAppenderTest.class})
    public class PackageTest {
    }������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/sift/���������������������������0000755�0001750�0001750�00000000000�12203357067�026055� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000150�00000000000�011561� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/sift/MDCBasedDiscriminatorTest.java�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/sift/MDCBasedDiscriminatorTest.j0000644�0001750�0001750�00000004351�12136042271�033156� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.sift;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    
    import ch.qos.logback.classic.spi.LoggingEvent;
    import ch.qos.logback.core.testUtil.RandomUtil;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import org.slf4j.MDC;
    
    import java.util.HashMap;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertTrue;
    
    /**
     * @author Ceki G&uuml;c&uuml;
     */
    public class MDCBasedDiscriminatorTest {
    
      static String DEFAULT_VAL = "DEFAULT_VAL";
    
      MDCBasedDiscriminator discriminator = new MDCBasedDiscriminator();
      LoggerContext context = new LoggerContext();
      Logger logger = context.getLogger(this.getClass());
    
      int diff = RandomUtil.getPositiveInt();
      String key = "k" + diff;
      String value = "val" + diff;
      LoggingEvent event;
    
      @Before
      public void setUp() {
        discriminator.setContext(context);
        discriminator.setKey(key);
        discriminator.setDefaultValue(DEFAULT_VAL);
        discriminator.start();
        assertTrue(discriminator.isStarted());
      }
    
      @After
      public void teaDown() {
        MDC.clear();
      }
    
      @Test
      public void smoke() {
        MDC.put(key, value);
        event = new LoggingEvent("a", logger, Level.DEBUG, "", null, null);
    
        String discriminatorValue = discriminator.getDiscriminatingValue(event);
        assertEquals(value, discriminatorValue);
      }
    
      @Test
      public void nullMDC() {
        event = new LoggingEvent("a", logger, Level.DEBUG, "", null, null);
        assertEquals(new HashMap(), event.getMDCPropertyMap());
        String discriminatorValue = discriminator.getDiscriminatingValue(event);
        assertEquals(DEFAULT_VAL, discriminatorValue);
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/sift/PackageTest.java�����������0000644�0001750�0001750�00000001403�12136042271�031102� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.sift;
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    import org.junit.runners.Suite.SuiteClasses;
    
    @RunWith(Suite.class)
    @SuiteClasses({MDCBasedDiscriminatorTest.class, SiftingAppenderTest.class})
    public class PackageTest  {
    }�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/sift/SiftingAppenderTest.java���0000644�0001750�0001750�00000025046�12136500062�032637� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.sift;
    
    import ch.qos.logback.classic.*;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.classic.spi.LoggingEvent;
    import ch.qos.logback.core.Appender;
    import ch.qos.logback.core.helpers.NOPAppender;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.read.ListAppender;
    import ch.qos.logback.core.sift.AppenderTracker;
    import ch.qos.logback.core.spi.AbstractComponentTracker;
    import ch.qos.logback.core.spi.ComponentTracker;
    import ch.qos.logback.core.status.ErrorStatus;
    import ch.qos.logback.core.status.StatusChecker;
    import ch.qos.logback.core.testUtil.RandomUtil;
    import ch.qos.logback.core.testUtil.StringListAppender;
    import ch.qos.logback.core.util.StatusPrinter;
    import org.junit.Test;
    import org.slf4j.MDC;
    
    import java.util.List;
    
    import static org.junit.Assert.*;
    import static org.junit.Assert.assertEquals;
    
    public class SiftingAppenderTest {
    
      static String SIFT_FOLDER_PREFIX = ClassicTestConstants.JORAN_INPUT_PREFIX + "sift/";
    
      LoggerContext loggerContext = new LoggerContext();
      Logger logger = loggerContext.getLogger(this.getClass().getName());
      Logger root = loggerContext.getLogger(Logger.ROOT_LOGGER_NAME);
      StatusChecker statusChecker = new StatusChecker(loggerContext);
      int diff = RandomUtil.getPositiveInt();
      int now = 0;
    
      protected void configure(String file) throws JoranException {
        JoranConfigurator jc = new JoranConfigurator();
        jc.setContext(loggerContext);
        jc.doConfigure(file);
      }
    
      @Test
      public void unsetDefaultValueProperty() throws JoranException {
        configure(SIFT_FOLDER_PREFIX + "unsetDefaultValueProperty.xml");
        logger.debug("hello");
        SiftingAppender sa = (SiftingAppender) root.getAppender("SIFT");
        assertFalse(sa.isStarted());
      }
    
      @Test
      public void smoke() throws JoranException {
        configure(SIFT_FOLDER_PREFIX + "smoke.xml");
        logger.debug("smoke");
        Appender<ILoggingEvent> appender = getAppenderTracker().find("smokeDefault");
        assertNotNull(appender);
        ListAppender<ILoggingEvent> listAppender = (ListAppender<ILoggingEvent>) appender;
        List<ILoggingEvent> eventList = listAppender.list;
        assertEquals(1, listAppender.list.size());
        assertEquals("smoke", eventList.get(0).getMessage());
      }
    
      private AppenderTracker<ILoggingEvent> getAppenderTracker() {
        SiftingAppender ha = (SiftingAppender) root.getAppender("SIFT");
        return ha.getAppenderTracker();
      }
    
      @Test
      public void zeroNesting() throws JoranException {
        configure(SIFT_FOLDER_PREFIX + "zeroNesting.xml");
        logger.debug("hello");
        logger.debug("hello");
        logger.debug("hello");
        logger.debug("hello");
        logger.debug("hello");
        SiftingAppender sa = (SiftingAppender) root.getAppender("SIFT");
    
        Appender<ILoggingEvent> appender = getAppenderTracker().find("zeroDefault");
        assertNotNull(appender);
        NOPAppender<ILoggingEvent> nopa = (NOPAppender<ILoggingEvent>) appender;
        StatusPrinter.printInCaseOfErrorsOrWarnings(loggerContext);
    
        statusChecker.assertContainsMatch(ErrorStatus.ERROR, "No nested appenders found");
      }
    
      @Test
      public void multipleNesting() throws JoranException {
        configure(SIFT_FOLDER_PREFIX + "multipleNesting.xml");
        logger.debug("hello");
        logger.debug("hello");
        logger.debug("hello");
    
        Appender<ILoggingEvent> listAppender = getAppenderTracker().find("multipleDefault");
        StatusPrinter.printInCaseOfErrorsOrWarnings(loggerContext);
    
        assertNotNull(listAppender);
        statusChecker.assertContainsMatch(ErrorStatus.ERROR,
                "Only and only one appender can be nested");
      }
    
      @Test
      public void defaultLayoutRule() throws JoranException {
        configure(SIFT_FOLDER_PREFIX + "defaultLayoutRule.xml");
        logger.debug("hello");
        SiftingAppender ha = (SiftingAppender) root.getAppender("SIFT");
        StringListAppender<ILoggingEvent> listAppender = (StringListAppender<ILoggingEvent>) ha
                .getAppenderTracker().find("default");
    
        assertNotNull(listAppender);
        List<String> strList = listAppender.strList;
        assertEquals(1, strList.size());
        assertEquals("DEBUG hello", strList.get(0));
      }
    
      @Test
      public void testWholeCycle() throws JoranException {
        String mdcKey = "cycle";
        configure(SIFT_FOLDER_PREFIX + "completeCycle.xml");
        MDC.put(mdcKey, "a");
        logger.debug("smoke");
        long timestamp = System.currentTimeMillis();
        SiftingAppender sa = (SiftingAppender) root.getAppender("SIFT");
        ListAppender<ILoggingEvent> listAppender = (ListAppender<ILoggingEvent>)
                sa.getAppenderTracker().find("a");
        assertNotNull(listAppender);
        List<ILoggingEvent> eventList = listAppender.list;
        assertEquals(1, listAppender.list.size());
        assertEquals("smoke", eventList.get(0).getMessage());
    
        MDC.remove(mdcKey);
        LoggingEvent le = new LoggingEvent("x", logger, Level.INFO, "hello", null,
                null);
        le.setTimeStamp(timestamp + ComponentTracker.DEFAULT_TIMEOUT + 1);
        sa.doAppend(le);
        assertFalse(listAppender.isStarted());
        assertEquals(1, sa.getAppenderTracker().allKeys().size());
        assertTrue(sa.getAppenderTracker().allKeys().contains("cycleDefault"));
      }
    
      @Test
      public void sessionFinalizationShouldCauseLingering() throws JoranException {
        String mdcKey = "linger";
        String mdcVal = "session" + diff;
        configure(SIFT_FOLDER_PREFIX + "lingering.xml");
        MDC.put(mdcKey, mdcVal);
        logger.debug("linger 1");
        logger.debug(ClassicConstants.FINALIZE_SESSION_MARKER, "linger 2");
        long now = System.currentTimeMillis();
        SiftingAppender sa = (SiftingAppender) root.getAppender("SIFT");
        AppenderTracker<ILoggingEvent> tracker = sa.getAppenderTracker();
    
        assertEquals(1, tracker.allKeys().size());
        Appender<ILoggingEvent> appender = tracker.find(mdcVal);
        assertTrue(appender.isStarted());
    
        tracker.removeStaleComponents(now + AppenderTracker.LINGERING_TIMEOUT + 1);
        // previously lingering appenders should be closed upon timeout
        assertFalse(appender.isStarted());
        // and they should be gone
        assertEquals(0, tracker.allKeys().size());
      }
    
      @Test
      public void localPropertiesShouldBeVisible() throws JoranException {
        String mdcKey = "localProperty";
        String mdcVal = "" + diff;
        String msg = "localPropertiesShouldBeVisible";
        String prefix = "Y";
        configure(SIFT_FOLDER_PREFIX + "propertyPropagation.xml");
        MDC.put(mdcKey, mdcVal);
        logger.debug(msg);
        SiftingAppender sa = (SiftingAppender) root.getAppender("SIFT");
        StringListAppender<ILoggingEvent> listAppender = (StringListAppender<ILoggingEvent>) sa
                .getAppenderTracker().find(mdcVal);
        assertNotNull(listAppender);
        List<String> strList = listAppender.strList;
        assertEquals(1, listAppender.strList.size());
        assertEquals(prefix + msg, strList.get(0));
      }
    
      @Test
      public void propertyDefinedWithinSiftElementShouldBeVisible() throws JoranException {
        String mdcKey = "propertyDefinedWithinSift";
        String mdcVal = "" + diff;
        String msg = "propertyDefinedWithinSiftElementShouldBeVisible";
        String prefix = "Y";
        configure(SIFT_FOLDER_PREFIX + "propertyDefinedInSiftElement.xml");
        MDC.put(mdcKey, mdcVal);
        logger.debug(msg);
        SiftingAppender sa = (SiftingAppender) root.getAppender("SIFT");
        StringListAppender<ILoggingEvent> listAppender = (StringListAppender<ILoggingEvent>) sa
                .getAppenderTracker().find(mdcVal);
        assertNotNull(listAppender);
        List<String> strList = listAppender.strList;
        assertEquals(1, listAppender.strList.size());
        assertEquals(prefix + msg, strList.get(0));
      }
    
      @Test
      public void compositePropertyShouldCombineWithinAndWithoutSiftElement() throws JoranException {
        String mdcKey = "compositeProperty";
        String mdcVal = "" + diff;
        String msg = "compositePropertyShouldCombineWithinAndWithoutSiftElement";
        String prefix = "composite";
        configure(SIFT_FOLDER_PREFIX + "compositeProperty.xml");
        MDC.put(mdcKey, mdcVal);
        logger.debug(msg);
        SiftingAppender sa = (SiftingAppender) root.getAppender("SIFT");
        StringListAppender<ILoggingEvent> listAppender = (StringListAppender<ILoggingEvent>) sa
                .getAppenderTracker().find(mdcVal);
        assertNotNull(listAppender);
        List<String> strList = listAppender.strList;
        assertEquals(1, listAppender.strList.size());
        assertEquals(prefix + msg, strList.get(0));
      }
    
      @Test
      public void maxAppendersCountPropertyShouldBeHonored() throws JoranException {
        configure(SIFT_FOLDER_PREFIX + "maxAppenderCount.xml");
        int max = 5;
        SiftingAppender sa = (SiftingAppender) root.getAppender("SIFT");
        String mdcKey = "max";
        for(int i = 0; i <= max; i++) {
          MDC.put(mdcKey, "" + (diff + i));
          LoggingEvent event = new LoggingEvent("", logger, Level.DEBUG, "max"+i, null, null);
          event.setTimeStamp(now);
          sa.doAppend(event);
          now += AbstractComponentTracker.WAIT_BETWEEN_SUCCESSIVE_REMOVAL_ITERATIONS;
        }
        AppenderTracker<ILoggingEvent> tracker = sa.getAppenderTracker();
        assertEquals(max, tracker.allKeys().size());
        assertNull(tracker.find("" + (diff + 0)));
        for(int i = 1; i <= max; i++) {
          assertNotNull(tracker.find("" + (diff + i)));
        }
      }
    
      @Test
      public void timeoutPropertyShouldBeHonored() throws JoranException, InterruptedException {
        configure(SIFT_FOLDER_PREFIX + "timeout.xml");
        long timeout = 30*1000;
        SiftingAppender sa = (SiftingAppender) root.getAppender("SIFT");
    
        LoggingEvent event = new LoggingEvent("", logger, Level.DEBUG, "timeout", null, null);
        event.setTimeStamp(now);
        sa.doAppend(event);
    
        AppenderTracker<ILoggingEvent> tracker = sa.getAppenderTracker();
    
        assertEquals(1, tracker.getComponentCount());
    
        now += timeout+1;
        tracker.removeStaleComponents(now);
        assertEquals(0, tracker.getComponentCount());
        statusChecker.assertIsErrorFree();
      }
    
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/joran/��������������������������0000755�0001750�0001750�00000000000�12203357067�026221� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/joran/EvaluatorJoranTest.java���0000644�0001750�0001750�00000010016�12136042271�032647� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.joran;
    
    import static org.junit.Assert.assertFalse;
    import static org.junit.Assert.assertNotNull;
    import static org.junit.Assert.assertTrue;
    
    import java.util.Map;
    
    import org.junit.Test;
    import org.slf4j.Marker;
    import org.slf4j.MarkerFactory;
    
    import ch.qos.logback.classic.ClassicTestConstants;
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.boolex.JaninoEventEvaluator;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.classic.spi.LoggingEvent;
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.boolex.EvaluationException;
    import ch.qos.logback.core.joran.spi.JoranException;
    
    
    public class EvaluatorJoranTest  {
    
      @Test
      public void testSimpleEvaluator() throws NullPointerException, EvaluationException, JoranException {
        JoranConfigurator jc = new JoranConfigurator();
        LoggerContext loggerContext = new LoggerContext();
        jc.setContext(loggerContext);
        jc.doConfigure(ClassicTestConstants.JORAN_INPUT_PREFIX + "simpleEvaluator.xml");
        
        
        Map evalMap = (Map) loggerContext.getObject(CoreConstants.EVALUATOR_MAP);
        assertNotNull(evalMap);
        JaninoEventEvaluator evaluator = (JaninoEventEvaluator) evalMap.get("msgEval");
        assertNotNull(evaluator);
        
        Logger logger = loggerContext.getLogger("xx");
        ILoggingEvent event0 = new LoggingEvent("foo", logger, Level.DEBUG, "Hello world", null, null);
        assertTrue(evaluator.evaluate(event0));
        
        ILoggingEvent event1 = new LoggingEvent("foo", logger, Level.DEBUG, "random blurb", null, null);
        assertFalse(evaluator.evaluate(event1));
      }
      
      @Test
      public void testIgnoreMarker() throws NullPointerException, EvaluationException, JoranException {
        JoranConfigurator jc = new JoranConfigurator();
        LoggerContext loggerContext = new LoggerContext();
        jc.setContext(loggerContext);
        jc.doConfigure(ClassicTestConstants.JORAN_INPUT_PREFIX + "ignore.xml");
        
        Map evalMap = (Map) loggerContext.getObject(CoreConstants.EVALUATOR_MAP);
        assertNotNull(evalMap);
        
        Logger logger = loggerContext.getLogger("xx");
        
        JaninoEventEvaluator evaluator = (JaninoEventEvaluator) evalMap.get("IGNORE_EVAL");
        LoggingEvent event = new LoggingEvent("foo", logger, Level.DEBUG, "Hello world",null, null);
    
        Marker ignoreMarker = MarkerFactory.getMarker("IGNORE");
        event.setMarker(ignoreMarker);
        assertTrue(evaluator.evaluate(event));
        
        logger.debug("hello", new Exception("test"));
        logger.debug(ignoreMarker, "hello ignore", new Exception("test"));
        
        //logger.debug("hello", new Exception("test"));
        
        //StatusPrinter.print(loggerContext.getStatusManager());
      }
      
      @Test
      public void testMultipleConditionsInExpression() throws NullPointerException, EvaluationException {
        LoggerContext loggerContext = new LoggerContext();
        Logger logger = loggerContext.getLogger("xx");
        JaninoEventEvaluator ee = new JaninoEventEvaluator();
        ee.setName("testEval");
        ee.setContext(loggerContext);
        //&#38;&#38;
        //&amp;&amp;
        ee.setExpression("message.contains(\"stacktrace\") && message.contains(\"logging\")");
        ee.start();
        //StatusPrinter.print(loggerContext);
        
        String message = "stacktrace bla bla logging";
        ILoggingEvent event = new LoggingEvent(this.getClass().getName(), logger, Level.DEBUG, message, null, null);
        
        assertTrue(ee.evaluate(event));
      }
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/joran/conditional/��������������0000755�0001750�0001750�00000000000�12203357067�030524� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000153�00000000000�011564� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/joran/conditional/ConditionalTest.java����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/joran/conditional/ConditionalTes0000644�0001750�0001750�00000012763�12136042271�033370� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.joran.conditional;
    
    import static org.junit.Assert.assertNotNull;
    import static org.junit.Assert.assertNull;
    import static org.junit.Assert.assertTrue;
    
    import java.io.IOException;
    import java.net.InetAddress;
    import java.net.UnknownHostException;
    
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import ch.qos.logback.classic.ClassicTestConstants;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.core.ConsoleAppender;
    import ch.qos.logback.core.FileAppender;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.read.ListAppender;
    import ch.qos.logback.core.status.StatusChecker;
    import ch.qos.logback.core.testUtil.RandomUtil;
    import ch.qos.logback.core.util.CoreTestConstants;
    import ch.qos.logback.core.util.StatusPrinter;
    
    public class ConditionalTest {
    
      LoggerContext context = new LoggerContext();
      Logger root = context.getLogger(Logger.ROOT_LOGGER_NAME);
    
      int diff = RandomUtil.getPositiveInt();
      String randomOutputDir = CoreTestConstants.OUTPUT_DIR_PREFIX + diff + "/";
    
      @Before
      public void setUp() throws UnknownHostException {
        context.setName("c" + diff);
        context.putProperty("randomOutputDir", randomOutputDir);
      }
    
      @After
      public void tearDown() {
        StatusPrinter.printIfErrorsOccured(context);
      }
    
      void configure(String file) throws JoranException {
        JoranConfigurator jc = new JoranConfigurator();
        jc.setContext(context);
        jc.doConfigure(file);
      }
    
      @SuppressWarnings("rawtypes")
      @Test
      public void conditionalConsoleApp_IF_THEN_True() throws JoranException,
              IOException, InterruptedException {
        InetAddress localhost = InetAddress.getLocalHost();
        System.out.println("In conditionalConsoleApp_IF_THEN_True, canonicalHostName=\"" + localhost.getCanonicalHostName() + "] and hostNmae=\"" + localhost.getHostName() + "\"");
        context.putProperty("aHost", localhost.getHostName());
    
        String configFileAsStr = ClassicTestConstants.JORAN_INPUT_PREFIX
                + "conditional/conditionalConsoleApp.xml";
        configure(configFileAsStr);
        FileAppender fileAppender = (FileAppender) root.getAppender("FILE");
        assertNotNull(fileAppender);
    
        ConsoleAppender consoleAppender = (ConsoleAppender) root.getAppender("CON");
        assertNotNull(consoleAppender);
        StatusChecker checker = new StatusChecker(context);
        checker.assertIsErrorFree();
      }
    
      @SuppressWarnings("rawtypes")
      @Test
      public void conditionalConsoleApp_IF_THEN_False() throws JoranException,
              IOException, InterruptedException {
    
        String configFileAsStr = ClassicTestConstants.JORAN_INPUT_PREFIX
                + "conditional/conditionalConsoleApp.xml";
        configure(configFileAsStr);
        FileAppender fileAppender = (FileAppender) root.getAppender("FILE");
        assertNotNull(fileAppender);
    
        ConsoleAppender consoleAppender = (ConsoleAppender) root.getAppender("CON");
        assertNull(consoleAppender);
        StatusChecker checker = new StatusChecker(context);
        checker.assertIsErrorFree();
      }
    
      @SuppressWarnings("rawtypes")
      @Test
      public void conditionalConsoleApp_IF_THEN_ELSE() throws JoranException,
              IOException, InterruptedException {
    
        String configFileAsStr = ClassicTestConstants.JORAN_INPUT_PREFIX
                + "conditional/conditionalConsoleApp_ELSE.xml";
        configure(configFileAsStr);
    
    	FileAppender fileAppender = (FileAppender) root.getAppender("FILE");
        assertNotNull(fileAppender);
    
        ConsoleAppender consoleAppender = (ConsoleAppender) root.getAppender("CON");
        assertNull(consoleAppender);
    
        ListAppender listAppender = (ListAppender) root.getAppender("LIST");
        assertNotNull(listAppender);
    
        // StatusPrinter.printIfErrorsOccured(context);
        StatusChecker checker = new StatusChecker(context);
        checker.assertIsErrorFree();
      }
    
      @Test
      public void conditionalInclusionWithExistingFile() throws JoranException,
               IOException, InterruptedException {
    
         String configFileAsStr = ClassicTestConstants.JORAN_INPUT_PREFIX
                 + "conditional/conditionalIncludeExistingFile.xml";
         configure(configFileAsStr);
    
         ConsoleAppender consoleAppender = (ConsoleAppender) root.getAppender("CON");
         assertNotNull(consoleAppender);
         StatusChecker checker = new StatusChecker(context);
        checker.assertIsErrorFree();
       }
      @Test
    
      public void conditionalInclusionWithInexistentFile() throws JoranException,
               IOException, InterruptedException {
    
         String configFileAsStr = ClassicTestConstants.JORAN_INPUT_PREFIX
                 + "conditional/conditionalIncludeInexistentFile.xml";
         configure(configFileAsStr);
    
         ConsoleAppender consoleAppender = (ConsoleAppender) root.getAppender("CON");
         assertNull(consoleAppender);
         StatusChecker checker = new StatusChecker(context);
         checker.assertIsErrorFree();
       }
    
    
    }
    �������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000147�00000000000�011567� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/joran/conditional/PackageTest.java��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/joran/conditional/PackageTest.ja0000644�0001750�0001750�00000001356�12136042271�033231� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.joran.conditional;
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    import org.junit.runners.Suite.SuiteClasses;
    
    
    @RunWith(Suite.class)
    @SuiteClasses( { ConditionalTest.class})
    public class PackageTest {
    }����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/joran/PackageTest.java����������0000644�0001750�0001750�00000001502�12136042271�031246� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.joran;
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    import org.junit.runners.Suite.SuiteClasses;
    
    @RunWith(Suite.class)
    @SuiteClasses( { JoranConfiguratorTest.class, EvaluatorJoranTest.class,
        ch.qos.logback.classic.joran.conditional.PackageTest.class })
    public class PackageTest {
    }����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/joran/JoranConfiguratorTest.java0000644�0001750�0001750�00000041625�12136042271�033361� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.joran;
    
    import java.io.File;
    import java.io.IOException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.concurrent.TimeUnit;
    
    import ch.qos.logback.classic.jul.JULHelper;
    import ch.qos.logback.core.pattern.parser.Parser;
    import ch.qos.logback.core.spi.ScanException;
    import ch.qos.logback.core.status.Status;
    import ch.qos.logback.core.testUtil.RandomUtil;
    import ch.qos.logback.core.util.CachingDateFormatter;
    import org.junit.Ignore;
    import org.junit.Test;
    import org.slf4j.MDC;
    
    import ch.qos.logback.classic.ClassicTestConstants;
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.classic.turbo.DebugUsersTurboFilter;
    import ch.qos.logback.classic.turbo.NOPTurboFilter;
    import ch.qos.logback.classic.turbo.TurboFilter;
    import ch.qos.logback.core.ConsoleAppender;
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.encoder.LayoutWrappingEncoder;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.read.ListAppender;
    import ch.qos.logback.core.status.StatusChecker;
    import ch.qos.logback.core.testUtil.StringListAppender;
    
    
    import static org.junit.Assert.*;
    
    public class JoranConfiguratorTest {
    
      LoggerContext loggerContext = new LoggerContext();
      Logger logger = loggerContext.getLogger(this.getClass().getName());
      Logger root = loggerContext.getLogger(Logger.ROOT_LOGGER_NAME);
      StatusChecker checker = new StatusChecker(loggerContext);
      int diff = RandomUtil.getPositiveInt();
    
      void configure(String file) throws JoranException {
        JoranConfigurator jc = new JoranConfigurator();
        jc.setContext(loggerContext);
        loggerContext.putProperty("diff", "" + diff);
        jc.doConfigure(file);
      }
    
      @Test
      public void simpleList() throws JoranException {
        configure(ClassicTestConstants.JORAN_INPUT_PREFIX + "simpleList.xml");
    
        Logger logger = loggerContext.getLogger(this.getClass().getName());
        Logger root = loggerContext.getLogger(Logger.ROOT_LOGGER_NAME);
        ListAppender listAppender = (ListAppender) root.getAppender("LIST");
        assertEquals(0, listAppender.list.size());
        String msg = "hello world";
        logger.debug(msg);
        assertEquals(1, listAppender.list.size());
        ILoggingEvent le = (ILoggingEvent) listAppender.list.get(0);
        assertEquals(msg, le.getMessage());
      }
    
      @Test
      public void level() throws JoranException {
        configure(ClassicTestConstants.JORAN_INPUT_PREFIX + "simpleLevel.xml");
        ListAppender listAppender = (ListAppender) root.getAppender("LIST");
        assertEquals(0, listAppender.list.size());
        String msg = "hello world";
        logger.debug(msg);
        assertEquals(0, listAppender.list.size());
      }
    
      @Test
      public void additivity() throws JoranException {
        configure(ClassicTestConstants.JORAN_INPUT_PREFIX + "additivity.xml");
        Logger logger = loggerContext.getLogger("additivityTest");
        assertFalse(logger.isAdditive());
      }
    
      @Test
      public void rootLoggerLevelSettingBySystemProperty() throws JoranException {
        String propertyName = "logback.level";
    
        System.setProperty(propertyName, "INFO");
        configure(ClassicTestConstants.JORAN_INPUT_PREFIX
                + "rootLevelByProperty.xml");
        // StatusPrinter.print(loggerContext);
        ListAppender listAppender = (ListAppender) root.getAppender("LIST");
        assertEquals(0, listAppender.list.size());
        String msg = "hello world";
        logger.debug(msg);
        assertEquals(0, listAppender.list.size());
        System.clearProperty(propertyName);
      }
    
      @Test
      public void loggerLevelSettingBySystemProperty() throws JoranException {
        String propertyName = "logback.level";
        System.setProperty(propertyName, "DEBUG");
        configure(ClassicTestConstants.JORAN_INPUT_PREFIX
                + "loggerLevelByProperty.xml");
        // StatusPrinter.print(loggerContext);
        ListAppender listAppender = (ListAppender) root.getAppender("LIST");
        assertEquals(0, listAppender.list.size());
        String msg = "hello world";
        logger.debug(msg);
        assertEquals(1, listAppender.list.size());
        System.clearProperty(propertyName);
      }
    
      @Test
      public void appenderRefSettingBySystemProperty() throws JoranException {
        final String propertyName = "logback.appenderRef";
        System.setProperty(propertyName, "A");
        configure(ClassicTestConstants.JORAN_INPUT_PREFIX
                + "appenderRefByProperty.xml");
        final Logger logger = loggerContext
                .getLogger("ch.qos.logback.classic.joran");
        final ListAppender listAppender = (ListAppender) logger.getAppender("A");
        assertEquals(0, listAppender.list.size());
        final String msg = "hello world";
        logger.info(msg);
        assertEquals(1, listAppender.list.size());
        System.clearProperty(propertyName);
      }
    
      @Test
      public void statusListener() throws JoranException {
        configure(ClassicTestConstants.JORAN_INPUT_PREFIX + "statusListener.xml");
      }
    
      @Test
      public void contextRename() throws JoranException {
        loggerContext.setName(CoreConstants.DEFAULT_CONTEXT_NAME);
        configure(ClassicTestConstants.JORAN_INPUT_PREFIX + "contextRename.xml");
        assertEquals("wombat", loggerContext.getName());
      }
    
      @Test
      public void eval() throws JoranException {
        configure(ClassicTestConstants.JORAN_INPUT_PREFIX + "callerData.xml");
    
        String msg = "hello world";
        logger.debug("toto");
        logger.debug(msg);
    
        StringListAppender<ILoggingEvent> slAppender = (StringListAppender<ILoggingEvent>) loggerContext
                .getLogger("root").getAppender("STR_LIST");
        assertNotNull(slAppender);
        assertEquals(2, slAppender.strList.size());
        assertTrue(slAppender.strList.get(0).contains(" DEBUG - toto"));
    
        String str1 = slAppender.strList.get(1);
        assertTrue(str1.contains("Caller+0"));
        assertTrue(str1.contains(" DEBUG - hello world"));
      }
    
      @Test
      public void turboFilter() throws JoranException {
        // Although this test uses turbo filters, it only checks
        // that Joran can see the xml element and create
        // and place the relevant object correctly.
        configure(ClassicTestConstants.JORAN_INPUT_PREFIX + "turbo.xml");
    
        TurboFilter filter = loggerContext.getTurboFilterList().get(0);
        assertTrue(filter instanceof NOPTurboFilter);
      }
    
      @Test
      public void testTurboFilterWithStringList() throws JoranException {
        // Although this test uses turbo filters, it only checks
        // that Joran can see <user> elements, and behave correctly
        // that is call the addUser method and pass the correct values
        // to that method.
        configure(ClassicTestConstants.JORAN_INPUT_PREFIX + "turbo2.xml");
    
        // StatusPrinter.print(loggerContext.getStatusManager());
    
        TurboFilter filter = loggerContext.getTurboFilterList().get(0);
        assertTrue(filter instanceof DebugUsersTurboFilter);
        DebugUsersTurboFilter dutf = (DebugUsersTurboFilter) filter;
        assertEquals(2, dutf.getUsers().size());
      }
    
      @Test
      public void testLevelFilter() throws JoranException {
        configure(ClassicTestConstants.JORAN_INPUT_PREFIX + "levelFilter.xml");
    
        // StatusPrinter.print(loggerContext);
    
        logger.warn("hello");
        logger.error("to be ignored");
    
        @SuppressWarnings("unchecked")
        ListAppender<ILoggingEvent> listAppender = (ListAppender) root
                .getAppender("LIST");
    
        assertNotNull(listAppender);
        assertEquals(1, listAppender.list.size());
        ILoggingEvent back = listAppender.list.get(0);
        assertEquals(Level.WARN, back.getLevel());
        assertEquals("hello", back.getMessage());
      }
    
      @Test
      public void testEvaluatorFilter() throws JoranException {
        configure(ClassicTestConstants.JORAN_INPUT_PREFIX + "evaluatorFilter.xml");
    
        // StatusPrinter.print(loggerContext);
    
        logger.warn("hello");
        logger.error("to be ignored");
    
        @SuppressWarnings("unchecked")
        ListAppender<ILoggingEvent> listAppender = (ListAppender) root
                .getAppender("LIST");
    
        assertNotNull(listAppender);
        assertEquals(1, listAppender.list.size());
        ILoggingEvent back = listAppender.list.get(0);
        assertEquals(Level.WARN, back.getLevel());
        assertEquals("hello", back.getMessage());
      }
    
      @Test
      public void testTurboDynamicThreshold() throws JoranException {
        configure(ClassicTestConstants.JORAN_INPUT_PREFIX
                + "turboDynamicThreshold.xml");
    
        ListAppender listAppender = (ListAppender) root.getAppender("LIST");
        assertEquals(0, listAppender.list.size());
    
        // this one should be denied
        MDC.put("userId", "user1");
        logger.debug("hello user1");
        // this one should log
        MDC.put("userId", "user2");
        logger.debug("hello user2");
    
        assertEquals(1, listAppender.list.size());
        ILoggingEvent le = (ILoggingEvent) listAppender.list.get(0);
        assertEquals("hello user2", le.getMessage());
      }
    
      @Test
      public void testTurboDynamicThreshold2() throws JoranException {
        configure(ClassicTestConstants.JORAN_INPUT_PREFIX
                + "turboDynamicThreshold2.xml");
    
        ListAppender listAppender = (ListAppender) root.getAppender("LIST");
        assertEquals(0, listAppender.list.size());
    
        // this one should log
        MDC.put("userId", "user1");
        logger.debug("hello user1");
        // this one should log
        MDC.put("userId", "user2");
        logger.debug("hello user2");
        // this one should fail
        MDC.put("userId", "user3");
        logger.debug("hello user3");
    
        assertEquals(2, listAppender.list.size());
        ILoggingEvent le = (ILoggingEvent) listAppender.list.get(0);
        assertEquals("hello user1", le.getMessage());
        le = (ILoggingEvent) listAppender.list.get(1);
        assertEquals("hello user2", le.getMessage());
      }
    
      // Tests whether ConfigurationAction is installing ReconfigureOnChangeFilter
      @Test
      public void autoscanShouldReconfigureOnFileChange() throws Exception {
    
        String configFileAsStr = ClassicTestConstants.JORAN_INPUT_PREFIX
                + "scan1.xml";
        configure(configFileAsStr);
    
        File file = new File(configFileAsStr);
        file.setLastModified(System.currentTimeMillis());
    
        Thread.sleep(10);
        // scanning requires 16 logs
        for (int i = 0; i < 16; i++) {
          logger.debug("after " + i);
        }
    
        loggerContext.getExecutorService().shutdown();
        loggerContext.getExecutorService().awaitTermination(1000, TimeUnit.MILLISECONDS);
    
        StatusChecker checker = new StatusChecker(loggerContext);
        checker.assertIsErrorFree();
        checker.assertContainsMatch(CoreConstants.RESET_MSG_PREFIX);
      }
    
      @Test
      public void timestamp() throws JoranException, IOException,
              InterruptedException {
    
        String configFileAsStr = ClassicTestConstants.JORAN_INPUT_PREFIX
                + "timestamp-context.xml";
        configure(configFileAsStr);
    
        String r = loggerContext.getProperty("testTimestamp");
        assertNotNull(r);
        CachingDateFormatter sdf = new CachingDateFormatter("yyyy-MM");
        String expected = sdf.format(System.currentTimeMillis());
        assertEquals("expected \"" + expected + "\" but got " + r, expected, r);
      }
    
      @Test
      public void timestampLocal() throws JoranException, IOException,
              InterruptedException {
    
        String sysProp = "ch.qos.logback.classic.joran.JoranConfiguratorTest.timestampLocal";
        System.setProperty(sysProp, "");
    
        String configFileAsStr = ClassicTestConstants.JORAN_INPUT_PREFIX
                + "timestamp-local.xml";
        configure(configFileAsStr);
    
        // It's hard to test the local variable has been set, as it's not
        // visible from here. But instead we test that it's not set in the
        // context. And check that a system property has been replaced with the
        // contents of the local variable
    
        String r = loggerContext.getProperty("testTimestamp");
        assertNull(r);
    
        String expected = "today is " + new SimpleDateFormat("yyyy-MM").format(new Date());
        String sysPropValue = System.getProperty(sysProp);
        assertEquals(expected, sysPropValue);
      }
    
      @Test
      public void encoderCharset() throws JoranException, IOException,
              InterruptedException {
    
        String configFileAsStr = ClassicTestConstants.JORAN_INPUT_PREFIX
                + "encoderCharset.xml";
        configure(configFileAsStr);
    
        ConsoleAppender<ILoggingEvent> consoleAppender = (ConsoleAppender<ILoggingEvent>) root.getAppender("CONSOLE");
        assertNotNull(consoleAppender);
        LayoutWrappingEncoder<ILoggingEvent> encoder = (LayoutWrappingEncoder<ILoggingEvent>) consoleAppender.getEncoder();
    
        assertEquals("UTF-8", encoder.getCharset().displayName());
    
        StatusChecker checker = new StatusChecker(loggerContext);
        checker.assertIsErrorFree();
      }
    
      void verifyJULLevel(String loggerName, Level expectedLevel) {
        java.util.logging.Logger julLogger = JULHelper.asJULLogger(loggerName);
        java.util.logging.Level julLevel = julLogger.getLevel();
    
        if (expectedLevel == null) {
          assertNull(julLevel);
        } else {
          assertEquals(JULHelper.asJULLevel(expectedLevel), julLevel);
        }
    
    
      }
    
      @Test
      public void levelChangePropagator0() throws JoranException, IOException,
              InterruptedException {
        String loggerName = "changePropagator0" + diff;
        java.util.logging.Logger.getLogger(loggerName).setLevel(java.util.logging.Level.INFO);
        String configFileAsStr = ClassicTestConstants.JORAN_INPUT_PREFIX
                + "/jul/levelChangePropagator0.xml";
        configure(configFileAsStr);
        StatusChecker checker = new StatusChecker(loggerContext);
        checker.assertIsErrorFree();
        verifyJULLevel(loggerName, null);
        verifyJULLevel("a.b.c." + diff, Level.WARN);
        verifyJULLevel(Logger.ROOT_LOGGER_NAME, Level.TRACE);
      }
    
      @Test
      public void levelChangePropagator1() throws JoranException, IOException,
              InterruptedException {
        String loggerName = "changePropagator1" + diff;
        java.util.logging.Logger.getLogger(loggerName).setLevel(java.util.logging.Level.INFO);
        verifyJULLevel(loggerName, Level.INFO);
        String configFileAsStr = ClassicTestConstants.JORAN_INPUT_PREFIX
                + "/jul/levelChangePropagator1.xml";
        configure(configFileAsStr);
        StatusChecker checker = new StatusChecker(loggerContext);
        checker.assertIsErrorFree();
        verifyJULLevel(loggerName, Level.INFO);
        verifyJULLevel("a.b.c." + diff, Level.WARN);
        verifyJULLevel(Logger.ROOT_LOGGER_NAME, Level.TRACE);
      }
    
      @Test
      @Ignore
      public void onConsoleRetro() throws JoranException, IOException, InterruptedException {
        String configFileAsStr = ClassicTestConstants.JORAN_INPUT_PREFIX
                + "/onConsoleRetro.xml";
        configure(configFileAsStr);
        System.out.println("xxxxxxxxxxxxx");
        Thread.sleep(400);
    
        loggerContext.reset();
        configure(configFileAsStr);
      }
    
      @Test
      public void lbcore193() throws JoranException {
        String configFileAsStr = ClassicTestConstants.ISSUES_PREFIX + "lbcore193.xml";
        configure(configFileAsStr);
        checker.asssertContainsException(ScanException.class);
        checker.assertContainsMatch(Status.ERROR, "Expecting RIGHT_PARENTHESIS token but got null");
        checker.assertContainsMatch(Status.ERROR, "See also " + Parser.MISSING_RIGHT_PARENTHESIS);
      }
    
    
      @Test
      public void properties() throws JoranException {
        String configFileAsStr = ClassicTestConstants.JORAN_INPUT_PREFIX
                + "properties.xml";
        assertNull(loggerContext.getProperty(CoreConstants.HOSTNAME_KEY));
        assertNull(System.getProperty("sys"));
    
        configure(configFileAsStr);
        assertNotNull(loggerContext.getProperty(CoreConstants.HOSTNAME_KEY));
        assertNull(loggerContext.getProperty("transientKey1"));
        assertNull(loggerContext.getProperty("transientKey2"));
        assertEquals("node0", loggerContext.getProperty("nodeId"));
        assertEquals("tem", System.getProperty("sys"));
        assertNotNull(loggerContext.getProperty("path"));
        checker.assertIsErrorFree();
      }
    
    
      // see also http://jira.qos.ch/browse/LBCORE-254
      @Test
      public void sysProps() throws JoranException {
        System.setProperty("k.lbcore254", ClassicTestConstants.ISSUES_PREFIX + "lbcore254");
        JoranConfigurator configurator = new JoranConfigurator();
        configurator.setContext(loggerContext);
        configurator.doConfigure(ClassicTestConstants.ISSUES_PREFIX + "lbcore254.xml");
    
        checker.assertIsErrorFree();
      }
    }
    �����������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/TurboFilteringInLoggerTest.java�0000644�0001750�0001750�00000011207�12136042271�033173� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertFalse;
    import static org.junit.Assert.assertNotNull;
    import static org.junit.Assert.assertTrue;
    
    import org.junit.Before;
    import org.junit.Test;
    import org.slf4j.Marker;
    import org.slf4j.MarkerFactory;
    
    import ch.qos.logback.classic.turbo.MarkerFilter;
    import ch.qos.logback.classic.turbo.TurboFilter;
    import ch.qos.logback.core.spi.FilterReply;
    
    
    public class TurboFilteringInLoggerTest  {
    
      static final String BLUE = "BLUE";
      LoggerContext context;
      Logger logger;
      Marker blueMarker = MarkerFactory.getMarker(BLUE);
    
      @Before
      public void setUp() throws Exception {
        context = new LoggerContext();
        context.setName("test");
        context.start();
        logger = context.getLogger(TurboFilteringInLoggerTest.class);
      }
    
     
      private void addYesFilter() {
        YesFilter filter = new YesFilter();
        filter.start();
        context.addTurboFilter(filter);
      }
    
      private void addNoFilter() {
        NoFilter filter = new NoFilter();
        filter.start();
        context.addTurboFilter(filter);
      }
    
      private void addAcceptBLUEFilter() {
        MarkerFilter filter = new MarkerFilter();
        filter.setMarker(BLUE);
        filter.setOnMatch("ACCEPT");
        filter.start();
        context.addTurboFilter(filter);
      }
    
      private void addDenyBLUEFilter() {
        MarkerFilter filter = new MarkerFilter();
        filter.setMarker(BLUE);
        filter.setOnMatch("DENY");
        filter.start();
        context.addTurboFilter(filter);
      }
    
      @Test
      public void testIsDebugEnabledWithYesFilter() {
        addYesFilter();
        logger.setLevel(Level.INFO);
        assertTrue(logger.isDebugEnabled());
      }
    
      @Test
      public void testIsInfoEnabledWithYesFilter() {
        addYesFilter();
        logger.setLevel(Level.WARN);
        assertTrue(logger.isInfoEnabled());
      }
    
      @Test
      public void testIsWarnEnabledWithYesFilter() {
        addYesFilter();
        logger.setLevel(Level.ERROR);
        assertTrue(logger.isWarnEnabled());
      }
    
      @Test
      public void testIsErrorEnabledWithYesFilter() {
        addYesFilter();
        logger.setLevel(Level.OFF);
        assertTrue(logger.isErrorEnabled());
      }
    
      @Test
      public void testIsEnabledForWithYesFilter() {
        addYesFilter();
        logger.setLevel(Level.ERROR);
        assertTrue(logger.isEnabledFor(Level.INFO));
      }
    
      @Test
      public void testIsEnabledForWithNoFilter() {
        addNoFilter();
        logger.setLevel(Level.DEBUG);
        assertFalse(logger.isEnabledFor(Level.INFO));
      }
    
      @Test
      public void testIsDebugEnabledWithNoFilter() {
        addNoFilter();
        logger.setLevel(Level.DEBUG);
        assertFalse(logger.isDebugEnabled());
      }
    
      @Test
      public void testIsInfoEnabledWithNoFilter() {
        addNoFilter();
        logger.setLevel(Level.DEBUG);
        assertFalse(logger.isInfoEnabled());
      }
    
      @Test
      public void testIsWarnEnabledWithNoFilter() {
        addNoFilter();
        logger.setLevel(Level.DEBUG);
        assertFalse(logger.isWarnEnabled());
      }
    
      @Test
      public void testIsErrorEnabledWithNoFilter() {
        addNoFilter();
        logger.setLevel(Level.DEBUG);
        assertFalse(logger.isErrorEnabled());
      }
    
      @Test
      public void testIsErrorEnabledWithAcceptBlueFilter() {
        addAcceptBLUEFilter();
        logger.setLevel(Level.ERROR);
        assertTrue(logger.isDebugEnabled(blueMarker));
      }
    
      @Test
      public void testIsErrorEnabledWithDenyBlueFilter() {
        addDenyBLUEFilter();
        logger.setLevel(Level.ALL);
        assertFalse(logger.isDebugEnabled(blueMarker));
      }
    
      @Test
      public void testLoggingContextReset() {
        addYesFilter();
        assertNotNull(context.getTurboFilterList().get(0));
        context.reset();
        assertEquals(0, context.getTurboFilterList().size());
      }
    
    }
    
    class YesFilter extends TurboFilter {
      @Override
      public FilterReply decide(Marker marker, Logger logger, Level level,
          String format, Object[] params, Throwable t) {
        return FilterReply.ACCEPT;
      }
    }
    
    class NoFilter extends TurboFilter {
      @Override
      public FilterReply decide(Marker marker, Logger logger, Level level,
          String format, Object[] params, Throwable t) {
        return FilterReply.DENY;
      }
    }�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/corpusTest/���������������������0000755�0001750�0001750�00000000000�12203357067�027263� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/corpusTest/RandomUtilTest.java��0000644�0001750�0001750�00000003013�12136042271�033032� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.corpusTest;
    
    import static org.junit.Assert.assertEquals;
    
    import java.util.Random;
    
    import org.junit.Before;
    import org.junit.Test;
    
    import ch.qos.logback.classic.corpus.RandomUtil;
    
    
    public class RandomUtilTest {
      long now = System.currentTimeMillis();
      
      @Before
      public void setup() {
        System.out.println(RandomUtilTest.class.getName()+" now="+now);
      }
      
      @Test
      public void smoke() {
        
        int EXPECTED_AVERAGE = 6;
        int EXPECTED_STD_DEVIATION = 3;
        
    
        System.out.println();
        Random r = new Random(now);
        int len = 3000;
        int[] valArray = new int[len];
        for(int i = 0; i < len; i++) {
          valArray[i] = RandomUtil.gaussianAsPositiveInt(r, EXPECTED_AVERAGE, EXPECTED_STD_DEVIATION);
        }
        double avg = average(valArray);
    
        assertEquals(EXPECTED_AVERAGE, avg, 0.3);
      }
      
      public double average(int[] va) {
        double avg = 0;
        for(int i = 0; i < va.length; i++) {
          avg = (avg*i+va[i])/(i+1); 
        }
        return avg;
      }
      
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/corpusTest/TextFileUtilTest.java0000644�0001750�0001750�00000002732�12136042271�033345� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.corpusTest;
    
    import static org.junit.Assert.*;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.StringReader;
    import java.util.List;
    
    import org.junit.Test;
    
    import ch.qos.logback.classic.corpus.TextFileUtil;
    
    public class TextFileUtilTest {
    
      @Test
      public void smoke() throws IOException {
        String s = "When on board H.M.S. 'Beagle,' as naturalist, I was much struck with\r\n"
            + "certain facts in the distribution of the inhabitants of South America,\r\n"
            + "and in the geological relations of the present to the past inhabitants\r\n"
            + "of that continent.";
        
        StringReader sr = new StringReader(s);
        BufferedReader br = new BufferedReader(sr);
        List<String> wordList = TextFileUtil.toWords(br);
        assertEquals(38, wordList.size());
        assertEquals("When", wordList.get(0));
        assertEquals("'Beagle,'", wordList.get(4));
        assertEquals("of", wordList.get(17));
        
      }
    }
    ��������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/turbo/��������������������������0000755�0001750�0001750�00000000000�12203357067�026243� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/turbo/ReconfigurePerf.java������0000644�0001750�0001750�00000006422�12136042271�032170� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.turbo;
    
    import java.io.File;
    import java.io.IOException;
    
    import ch.qos.logback.core.testUtil.EnvUtilForTests;
    import org.junit.Before;
    import org.junit.Ignore;
    import org.junit.Test;
    
    import ch.qos.logback.classic.ClassicTestConstants;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.issue.lbclassic135.LoggingRunnable;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.core.contention.MultiThreadedHarness;
    import ch.qos.logback.core.contention.RunnableWithCounterAndDone;
    import ch.qos.logback.core.joran.spi.JoranException;
    
    @Ignore
    public class ReconfigurePerf {
      final static int THREAD_COUNT = 500;
      //final static int LOOP_LEN = 1000 * 1000;
    
      // the space in the file name mandated by
      // http://jira.qos.ch/browse/LBCORE-119
      final static String CONF_FILE_AS_STR = ClassicTestConstants.INPUT_PREFIX
          + "turbo/scan_perf.xml";
    
      // it actually takes time for Windows to propagate file modification changes
      // values below 100 milliseconds can be problematic the same propagation
      // latency occurs in Linux but is even larger (>600 ms)
      final static int DEFAULT_SLEEP_BETWEEN_UPDATES = 110;
    
      int sleepBetweenUpdates = DEFAULT_SLEEP_BETWEEN_UPDATES;
    
      static int numberOfCycles = 100;
      static int totalTestDuration;
    
      LoggerContext loggerContext = new LoggerContext();
      Logger logger = loggerContext.getLogger(this.getClass());
      MultiThreadedHarness harness;
    
      @Before
      public void setUp() {
        // take into account propagation latency occurs on Linux
        if (EnvUtilForTests.isLinux()) {
          sleepBetweenUpdates = 850;
          totalTestDuration = sleepBetweenUpdates * numberOfCycles;
        } else {
          totalTestDuration = sleepBetweenUpdates * numberOfCycles * 2;
        }
        harness = new MultiThreadedHarness(totalTestDuration);
      }
    
      void configure(File file) throws JoranException {
        JoranConfigurator jc = new JoranConfigurator();
        jc.setContext(loggerContext);
        jc.doConfigure(file);
      }
    
      RunnableWithCounterAndDone[] buildRunnableArray() {
        RunnableWithCounterAndDone[] rArray = new RunnableWithCounterAndDone[THREAD_COUNT];
        for (int i = 0; i < THREAD_COUNT; i++) {
          rArray[i] = new LoggingRunnable(logger);
        }
        return rArray;
      }
    
      // Tests whether ConfigurationAction is installing ReconfigureOnChangeFilter
      @Test
      public void scan1() throws JoranException, IOException, InterruptedException {
        File file = new File(CONF_FILE_AS_STR);
        configure(file);
        System.out.println("Running scan1()");
        doRun();
      }
    
      void doRun() throws InterruptedException {
        RunnableWithCounterAndDone[] runnableArray = buildRunnableArray();
        harness.execute(runnableArray);
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/turbo/LRUMessageCacheTest.java��0000644�0001750�0001750�00000003153�12136042271�032634� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.turbo;
    
    import junit.framework.Assert;
    
    import org.junit.Test;
    
    public class LRUMessageCacheTest {
    
      @Test
      public void testEldestEntriesRemoval() {
        final LRUMessageCache cache = new LRUMessageCache(2);
        Assert.assertEquals(0, cache.getMessageCountAndThenIncrement("0"));
        Assert.assertEquals(1, cache.getMessageCountAndThenIncrement("0"));
        Assert.assertEquals(0, cache.getMessageCountAndThenIncrement("1"));
        Assert.assertEquals(1, cache.getMessageCountAndThenIncrement("1"));
        // 0 entry should have been removed.
        Assert.assertEquals(0, cache.getMessageCountAndThenIncrement("2"));
        // So it is expected a returned value of 0 instead of 2.
        // 1 entry should have been removed.
        Assert.assertEquals(0, cache.getMessageCountAndThenIncrement("0"));
        // So it is expected a returned value of 0 instead of 2.
        // 2 entry should have been removed.
        Assert.assertEquals(0, cache.getMessageCountAndThenIncrement("1"));
        // So it is expected a returned value of 0 instead of 2.
        Assert.assertEquals(0, cache.getMessageCountAndThenIncrement("2"));
      }
    
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/turbo/DebugUsersTurboFilter.java0000644�0001750�0001750�00000003703�12136042271�033334� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.turbo;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import org.slf4j.MDC;
    import org.slf4j.Marker;
    
    import ch.qos.logback.classic.ClassicConstants;
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.core.spi.FilterReply;
    
    /**
     * This class allows output of debug level events to a certain list of users.
     * 
     * If the level passed as a parameter is of level DEBUG, then the "user" value
     * taken from the MDC is checked against the configured user list. When the user
     * belongs to the list, the request is accepted. Otherwise a NEUTRAL response
     * is sent, thus not influencing the filter chain.  
     *
     * @author Ceki G&uuml;lc&uuml;
     * @author S&eacute;bastien Pennec
     */
    public class DebugUsersTurboFilter extends TurboFilter {
    
      List<String> userList = new ArrayList<String>(); 
      
      @Override
      public FilterReply decide(Marker marker, Logger logger, Level level, String format, Object[] params, Throwable t) {
        if (!level.equals(Level.DEBUG)) {
          return FilterReply.NEUTRAL;
        } 
        String user = MDC.get(ClassicConstants.USER_MDC_KEY);
        if (user != null && userList.contains(user)) {
          return FilterReply.ACCEPT;
        }
        return FilterReply.NEUTRAL;
      }
      
      public void addUser(String user) {
        userList.add(user);
      }
      
      //test in BasicJoranTest only, to be removed asap.
      public List<String> getUsers() {
        return userList;
      }
    
    }
    �������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000152�00000000000�011563� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/turbo/DuplicateMessageFilterTest.java�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/turbo/DuplicateMessageFilterTest0000644�0001750�0001750�00000005524�12136042271�033412� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.turbo;
    
    import static org.junit.Assert.*;
    
    import org.junit.Test;
    
    import ch.qos.logback.core.spi.FilterReply;
    
    public class DuplicateMessageFilterTest {
    
      @Test
      public void smoke() {
        DuplicateMessageFilter dmf = new DuplicateMessageFilter();
        dmf.setAllowedRepetitions(0);
        dmf.start();
        assertEquals(FilterReply.NEUTRAL, dmf.decide(null, null, null, "x", null,
            null));
        assertEquals(FilterReply.NEUTRAL, dmf.decide(null, null, null, "y", null,
            null));
        assertEquals(FilterReply.DENY, dmf
            .decide(null, null, null, "x", null, null));
        assertEquals(FilterReply.DENY, dmf
            .decide(null, null, null, "y", null, null));
      }
    
      @Test
      public void memoryLoss() {
        DuplicateMessageFilter dmf = new DuplicateMessageFilter();
        dmf.setAllowedRepetitions(1);
        dmf.setCacheSize(1);
        dmf.start();
        assertEquals(FilterReply.NEUTRAL, dmf.decide(null, null, null, "a", null,
            null));
        assertEquals(FilterReply.NEUTRAL, dmf.decide(null, null, null, "b", null,
            null));
        assertEquals(FilterReply.NEUTRAL, dmf.decide(null, null, null, "a", null,
            null));
      }
    
      @Test
      public void many() {
        DuplicateMessageFilter dmf = new DuplicateMessageFilter();
        dmf.setAllowedRepetitions(0);
        int cacheSize = 10;
        int margin = 2;
        dmf.setCacheSize(cacheSize);
        dmf.start();
        for (int i = 0; i < cacheSize + margin; i++) {
          assertEquals(FilterReply.NEUTRAL, dmf.decide(null, null, null, "a" + i,
              null, null));
        }
        for (int i = cacheSize - 1; i >= margin; i--) {
          assertEquals(FilterReply.DENY, dmf.decide(null, null, null, "a" + i,
              null, null));
        }
        for (int i = margin - 1; i >= 0; i--) {
          assertEquals(FilterReply.NEUTRAL, dmf.decide(null, null, null, "a" + i,
              null, null));
        }
      }
    
      @Test
      // isXXXEnabled invokes decide with a null format
      // http://jira.qos.ch/browse/LBCLASSIC-134
      public void nullFormat() {
        DuplicateMessageFilter dmf = new DuplicateMessageFilter();
        dmf.setAllowedRepetitions(0);
        dmf.setCacheSize(10);
        dmf.start();
        assertEquals(FilterReply.NEUTRAL, dmf.decide(null, null, null, null, null,
            null));
        assertEquals(FilterReply.NEUTRAL, dmf.decide(null, null, null, null, null,
            null));
      }
    
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000147�00000000000�011567� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/turbo/ReconfigureOnChangeTest.java��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/turbo/ReconfigureOnChangeTest.ja0000644�0001750�0001750�00000040174�12140150756�033274� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.turbo;
    
    import ch.qos.logback.classic.ClassicTestConstants;
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.gaffer.GafferConfigurator;
    import ch.qos.logback.classic.issue.lbclassic135.LoggingRunnable;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.classic.spi.TurboFilterList;
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.contention.AbstractMultiThreadedHarness;
    import ch.qos.logback.core.contention.RunnableWithCounterAndDone;
    import ch.qos.logback.core.contention.WaitOnExecutionMultiThreadedHarness;
    import ch.qos.logback.core.joran.spi.ConfigurationWatchList;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.joran.util.ConfigurationWatchListUtil;
    import ch.qos.logback.core.status.InfoStatus;
    import ch.qos.logback.core.status.Status;
    import ch.qos.logback.core.status.StatusChecker;
    import ch.qos.logback.core.testUtil.EnvUtilForTests;
    import ch.qos.logback.core.testUtil.FileTestUtil;
    import ch.qos.logback.core.testUtil.RandomUtil;
    import ch.qos.logback.core.util.CoreTestConstants;
    import ch.qos.logback.core.util.StatusPrinter;
    import org.junit.*;
    import org.slf4j.helpers.BogoPerf;
    
    import java.io.*;
    import java.net.MalformedURLException;
    import java.util.List;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.ThreadPoolExecutor;
    import java.util.concurrent.TimeUnit;
    
    import static org.junit.Assert.*;
    
    public class ReconfigureOnChangeTest {
      final static int THREAD_COUNT = 5;
      final static int LOOP_LEN = 1000 * 1000;
    
      int diff = RandomUtil.getPositiveInt();
    
      // the space in the file name mandated by
      // http://jira.qos.ch/browse/LBCORE-119
      final static String SCAN1_FILE_AS_STR = ClassicTestConstants.INPUT_PREFIX
              + "turbo/scan 1.xml";
    
      final static String G_SCAN1_FILE_AS_STR = ClassicTestConstants.INPUT_PREFIX
              + "turbo/scan 1.groovy";
    
      final static String SCAN_LOGBACK_474_FILE_AS_STR = ClassicTestConstants.INPUT_PREFIX
              + "turbo/scan_logback_474.xml";
    
      final static String INCLUSION_SCAN_TOPLEVEL0_AS_STR = ClassicTestConstants.INPUT_PREFIX
              + "turbo/inclusion/topLevel0.xml";
    
      final static String INCLUSION_SCAN_TOP_BY_RESOURCE_AS_STR = ClassicTestConstants.INPUT_PREFIX
              + "turbo/inclusion/topByResource.xml";
    
      final static String INCLUSION_SCAN_INNER0_AS_STR = ClassicTestConstants.INPUT_PREFIX
              + "turbo/inclusion/inner0.xml";
    
      final static String INCLUSION_SCAN_INNER1_AS_STR = "target/test-classes/asResource/inner1.xml";
    
      // it actually takes time for Windows to propagate file modification changes
      // values below 100 milliseconds can be problematic the same propagation
      // latency occurs in Linux but is even larger (>600 ms)
      // final static int DEFAULT_SLEEP_BETWEEN_UPDATES = 60;
    
      int sleepBetweenUpdates = 100;
    
      LoggerContext loggerContext = new LoggerContext();
      Logger logger = loggerContext.getLogger(this.getClass());
      ExecutorService executorService = loggerContext.getExecutorService();
    
      StatusChecker checker = new StatusChecker(loggerContext);
      AbstractMultiThreadedHarness harness;
    
      ThreadPoolExecutor executor = (ThreadPoolExecutor) loggerContext.getExecutorService();
    
      int expectedResets = 2;
    
      @BeforeClass
      static public void classSetup() {
        FileTestUtil.makeTestOutputDir();
      }
    
      @Before
      public void setUp() {
        harness = new WaitOnExecutionMultiThreadedHarness(executor, expectedResets);
      }
    
      @After
      public void tearDown() {
      }
    
      void configure(File file) throws JoranException {
        JoranConfigurator jc = new JoranConfigurator();
        jc.setContext(loggerContext);
        jc.doConfigure(file);
      }
    
      void configure(InputStream is) throws JoranException {
        JoranConfigurator jc = new JoranConfigurator();
        jc.setContext(loggerContext);
        jc.doConfigure(is);
      }
    
      void gConfigure(File file) throws JoranException {
        GafferConfigurator gc = new GafferConfigurator(loggerContext);
        gc.run(file);
      }
    
      RunnableWithCounterAndDone[] buildRunnableArray(File configFile, UpdateType updateType) {
        RunnableWithCounterAndDone[] rArray = new RunnableWithCounterAndDone[THREAD_COUNT];
        rArray[0] = new Updater(configFile, updateType);
        for (int i = 1; i < THREAD_COUNT; i++) {
          rArray[i] = new LoggingRunnable(logger);
        }
        return rArray;
      }
    
      // Tests whether ConfigurationAction is installing ReconfigureOnChangeFilter
      @Test
      public void installFilter() throws JoranException, IOException, InterruptedException {
        File file = new File(SCAN1_FILE_AS_STR);
        configure(file);
        List<File> fileList = getConfigurationFileList(loggerContext);
        assertThatListContainsFile(fileList, file);
        assertThatFirstFilterIsROCF();
        StatusPrinter.print(loggerContext);
      }
    
    
      @Test
      public void gafferInstallFilter() throws JoranException, IOException, InterruptedException {
        File file = new File(G_SCAN1_FILE_AS_STR);
        gConfigure(file);
        List<File> fileList = getConfigurationFileList(loggerContext);
        assertThatListContainsFile(fileList, file);
        assertThatFirstFilterIsROCF();
    
        rocfDetachReconfigurationToNewThreadAndAwaitTermination();
    
        fileList = getConfigurationFileList(loggerContext);
        assertThatListContainsFile(fileList, file);
        assertThatFirstFilterIsROCF();
    
        // check that rcof filter installed on two occasions
        assertEquals(2, checker.matchCount("Will scan for changes in"));
      }
    
      private void rocfDetachReconfigurationToNewThreadAndAwaitTermination() throws InterruptedException {
        ReconfigureOnChangeFilter reconfigureOnChangeFilter = (ReconfigureOnChangeFilter) getFirstTurboFilter();
        reconfigureOnChangeFilter.detachReconfigurationToNewThread();
        executorService.shutdown();
        executorService.awaitTermination(1000, TimeUnit.MILLISECONDS);
      }
    
      List<File> getConfigurationFileList(LoggerContext context) {
        ConfigurationWatchList configurationWatchList = ConfigurationWatchListUtil.getConfigurationWatchList(loggerContext);
        return configurationWatchList.getCopyOfFileWatchList();
      }
    
      @Test(timeout = 4000L)
      public void scanWithFileInclusion() throws JoranException, IOException, InterruptedException {
        File topLevelFile = new File(INCLUSION_SCAN_TOPLEVEL0_AS_STR);
        File innerFile = new File(INCLUSION_SCAN_INNER0_AS_STR);
        configure(topLevelFile);
        List<File> fileList = getConfigurationFileList(loggerContext);
        assertThatListContainsFile(fileList, topLevelFile);
        assertThatListContainsFile(fileList, innerFile);
      }
    
      @Test(timeout = 4000L)
      public void scanWithResourceInclusion() throws JoranException, IOException, InterruptedException {
        File topLevelFile = new File(INCLUSION_SCAN_TOP_BY_RESOURCE_AS_STR);
        File innerFile = new File(INCLUSION_SCAN_INNER1_AS_STR);
        configure(topLevelFile);
    
        List<File> fileList = getConfigurationFileList(loggerContext);
        assertThatListContainsFile(fileList, topLevelFile);
        assertThatListContainsFile(fileList, innerFile);
      }
    
      // See also http://jira.qos.ch/browse/LOGBACK-338
      @Test
      public void includeScanViaInputStreamSuppliedConfigFile() throws IOException, JoranException, InterruptedException {
        String configurationStr = "<configuration scan=\"true\" scanPeriod=\"50 millisecond\"><include resource=\"asResource/inner1.xml\"/></configuration>";
        configure(new ByteArrayInputStream(configurationStr.getBytes("UTF-8")));
    
        ConfigurationWatchList configurationWatchList = ConfigurationWatchListUtil.getConfigurationWatchList(loggerContext);
        assertNull(configurationWatchList.getMainURL());
    
        ReconfigureOnChangeFilter reconfigureOnChangeFilter = (ReconfigureOnChangeFilter) getFirstTurboFilter();
        // without a top level file, reconfigureOnChangeFilter should not start
        assertFalse(reconfigureOnChangeFilter.isStarted());
      }
    
      @Test(timeout = 4000L)
      public void fallbackToSafe() throws IOException, JoranException, InterruptedException {
        String path = CoreTestConstants.OUTPUT_DIR_PREFIX + "reconfigureOnChangeConfig_fallbackToSafe-" + diff + ".xml";
        File topLevelFile = new File(path);
        writeToFile(topLevelFile, "<configuration scan=\"true\" scanPeriod=\"50 millisecond\"><root level=\"ERROR\"/></configuration> ");
        configure(topLevelFile);
    
        writeToFile(topLevelFile, "<configuration scan=\"true\" scanPeriod=\"50 millisecond\">\n" +
                "  <root></configuration>");
    
        rocfDetachReconfigurationToNewThreadAndAwaitTermination();
    
        checker.assertContainsMatch(Status.WARN, "Falling back to previously registered safe configuration.");
        checker.assertContainsMatch(Status.INFO, "Re-registering previous fallback configuration once more");
    
        assertThatFirstFilterIsROCF();
      }
    
      @Test(timeout = 4000L)
      public void fallbackToSafeWithIncludedFile() throws IOException, JoranException, InterruptedException {
        String topLevelFileAsStr = CoreTestConstants.OUTPUT_DIR_PREFIX + "reconfigureOnChangeConfig_top-" + diff + ".xml";
        String innerFileAsStr = CoreTestConstants.OUTPUT_DIR_PREFIX + "reconfigureOnChangeConfig_inner-" + diff + ".xml";
        File topLevelFile = new File(topLevelFileAsStr);
        writeToFile(topLevelFile, "<configuration scan=\"true\" scanPeriod=\"50 millisecond\"><include file=\"" + innerFileAsStr + "\"/></configuration> ");
    
        File innerFile = new File(innerFileAsStr);
        writeToFile(innerFile, "<included><root level=\"ERROR\"/></included> ");
        configure(topLevelFile);
        writeToFile(innerFile, "<included>\n<root>\n</included>");
        rocfDetachReconfigurationToNewThreadAndAwaitTermination();
    
        checker.assertContainsMatch(Status.WARN, "Falling back to previously registered safe configuration.");
        checker.assertContainsMatch(Status.INFO, "Re-registering previous fallback configuration once more");
    
        assertThatFirstFilterIsROCF();
      }
    
    
      // check for deadlocks
      @Test(timeout = 4000L)
      public void scan_LOGBACK_474() throws JoranException, IOException,
              InterruptedException {
        File file = new File(SCAN_LOGBACK_474_FILE_AS_STR);
        configure(file);
    
        RunnableWithCounterAndDone[] runnableArray = buildRunnableArray(file, UpdateType.TOUCH);
        harness.execute(runnableArray);
    
        loggerContext.getStatusManager().add(
                new InfoStatus("end of execution ", this));
    
        verify(expectedResets);
      }
    
    
      private void assertThatListContainsFile(List<File> fileList, File file) {
        // conversion to absolute file seems to work nicely
        assertTrue(fileList.contains(file.getAbsoluteFile()));
      }
    
      private TurboFilter getFirstTurboFilter() {
        TurboFilterList turboFilterList = loggerContext.getTurboFilterList();
        return turboFilterList.get(0);
      }
    
    
      private void assertThatFirstFilterIsROCF() {
        assertTrue(getFirstTurboFilter() instanceof ReconfigureOnChangeFilter);
      }
    
    
      private void verify(int expected) {
        StatusChecker checker = new StatusChecker(loggerContext);
        //StatusPrinter.print(loggerContext);
        checker.assertIsErrorFree();
    
        int effectiveResets = checker
                .matchCount(CoreConstants.RESET_MSG_PREFIX);
    
        String failMsg = "effective=" + effectiveResets + ", expected="
                + expected;
    
        // there might be more effective resets than the expected amount
        // since the harness may be sleeping while a reset occurs
        assertTrue(failMsg, expected <= effectiveResets && (expected + 2) >= effectiveResets);
    
      }
    
      ReconfigureOnChangeFilter initROCF() throws MalformedURLException {
        ReconfigureOnChangeFilter rocf = new ReconfigureOnChangeFilter();
        rocf.setContext(loggerContext);
        File file = new File(SCAN1_FILE_AS_STR);
        ConfigurationWatchListUtil.setMainWatchURL(loggerContext, file.toURI().toURL());
        rocf.start();
        return rocf;
      }
    
      @Test
      @Ignore
      public void directPerfTest() throws MalformedURLException {
        if (EnvUtilForTests.isLinux()) {
          // for some reason this test does not pass on Linux (AMD 64 bit,
          // Dual Core Opteron 170)
          return;
        }
    
        ReconfigureOnChangeFilter rocf = initROCF();
        assertTrue(rocf.isStarted());
    
        for (int i = 0; i < 30; i++) {
          directLoop(rocf);
        }
        double avg = directLoop(rocf);
        System.out.println("directPerfTest: " + avg);
      }
    
      public double directLoop(ReconfigureOnChangeFilter rocf) {
        long start = System.nanoTime();
        for (int i = 0; i < LOOP_LEN; i++) {
          rocf.decide(null, logger, Level.DEBUG, " ", null, null);
        }
        long end = System.nanoTime();
        return (end - start) / (1.0d * LOOP_LEN);
      }
    
      @Ignore
      @Test
      public void indirectPerfTest() throws MalformedURLException {
        if (EnvUtilForTests.isLinux()) {
          // for some reason this test does not pass on Linux (AMD 64 bit,
          // Dual Core
          // Opteron 170)
          return;
        }
    
        ReconfigureOnChangeFilter rocf = initROCF();
        assertTrue(rocf.isStarted());
        loggerContext.addTurboFilter(rocf);
        logger.setLevel(Level.ERROR);
    
        indirectLoop();
        double avg = indirectLoop();
        System.out.println(avg);
        // the reference was computed on Orion (Ceki's computer)
        long referencePerf = 68;
        BogoPerf.assertDuration(avg, referencePerf, CoreConstants.REFERENCE_BIPS);
      }
    
      void addInfo(String msg, Object o) {
        loggerContext.getStatusManager().add(new InfoStatus(msg, o));
      }
    
      public double indirectLoop() {
        long start = System.nanoTime();
        for (int i = 0; i < LOOP_LEN; i++) {
          logger.debug("hello");
        }
        long end = System.nanoTime();
        return (end - start) / (1.0d * LOOP_LEN);
      }
    
      enum UpdateType {TOUCH, MALFORMED, MALFORMED_INNER}
    
      void writeToFile(File file, String contents) throws IOException {
        FileWriter fw = new FileWriter(file);
        fw.write(contents);
        fw.close();
      }
    
      class Updater extends RunnableWithCounterAndDone {
        File configFile;
        UpdateType updateType;
    
        Updater(File configFile, UpdateType updateType) {
          this.configFile = configFile;
          this.updateType = updateType;
        }
    
        Updater(File configFile) {
          this(configFile, UpdateType.TOUCH);
        }
    
        public void run() {
          while (!isDone()) {
            try {
              Thread.sleep(sleepBetweenUpdates);
            } catch (InterruptedException e) {
            }
            if (isDone()) {
              return;
            }
            counter++;
            ReconfigureOnChangeTest.this.addInfo("***settting last modified", this);
            switch (updateType) {
              case TOUCH:
                touchFile();
                break;
              case MALFORMED:
                try {
                  malformedUpdate();
                } catch (IOException e) {
                  e.printStackTrace();
                  fail("malformedUpdate failed");
                }
                break;
              case MALFORMED_INNER:
                try {
                  malformedInnerUpdate();
                } catch (IOException e) {
                  e.printStackTrace();
                  fail("malformedInnerUpdate failed");
                }
            }
          }
        }
    
        private void malformedUpdate() throws IOException {
          writeToFile(configFile, "<configuration scan=\"true\" scanPeriod=\"50 millisecond\">\n" +
                  "  <root level=\"ERROR\">\n" +
                  "</configuration>");
        }
    
        private void malformedInnerUpdate() throws IOException {
          writeToFile(configFile, "<included>\n" +
                  "  <root>\n" +
                  "</included>");
        }
    
        void touchFile() {
          configFile.setLastModified(System.currentTimeMillis());
        }
      }
    
    
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/turbo/MarkerFilterTest.java�����0000644�0001750�0001750�00000004520�12136042271�032327� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.turbo;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertFalse;
    import static org.junit.Assert.assertTrue;
    
    import org.junit.Test;
    import org.slf4j.Marker;
    import org.slf4j.MarkerFactory;
    
    import ch.qos.logback.core.spi.FilterReply;
    
    public class MarkerFilterTest {
    
      static String TOTO = "TOTO";
      static String COMPOSITE = "COMPOSITE";
    
      Marker totoMarker = MarkerFactory.getMarker(TOTO);
    
    
      @Test
      public void testNoMarker() {
        MarkerFilter mkt = new MarkerFilter();
        mkt.start();
        assertFalse(mkt.isStarted());
        assertEquals(FilterReply.NEUTRAL, mkt.decide(totoMarker, null, null, null, null, null));
        assertEquals(FilterReply.NEUTRAL, mkt.decide(null, null, null, null, null, null));
    
      }
    
    
      @Test
      public void testBasic() {
        MarkerFilter mkt = new MarkerFilter();
        mkt.setMarker(TOTO);
        mkt.setOnMatch("ACCEPT");
        mkt.setOnMismatch("DENY");
    
        mkt.start();
        assertTrue(mkt.isStarted());
        assertEquals(FilterReply.DENY, mkt.decide(null, null, null, null, null, null));
        assertEquals(FilterReply.ACCEPT, mkt.decide(totoMarker, null, null, null, null, null));
      }
    
      @Test
      public void testComposite() {
        String compositeMarkerName = COMPOSITE;
        Marker compositeMarker = MarkerFactory.getMarker(compositeMarkerName);
        compositeMarker.add(totoMarker);
    
        MarkerFilter mkt = new MarkerFilter();
        mkt.setMarker(TOTO);
        mkt.setOnMatch("ACCEPT");
        mkt.setOnMismatch("DENY");
    
        mkt.start();
    
        assertTrue(mkt.isStarted());
        assertEquals(FilterReply.DENY, mkt.decide(null, null, null, null, null, null));
        assertEquals(FilterReply.ACCEPT, mkt.decide(totoMarker, null, null, null, null, null));
        assertEquals(FilterReply.ACCEPT, mkt.decide(compositeMarker, null, null, null, null, null));
      }
    
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/turbo/PackageTest.java����������0000644�0001750�0001750�00000001450�12136042271�031272� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.turbo;
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    import org.junit.runners.Suite.SuiteClasses;
    
    @RunWith(Suite.class)
    @SuiteClasses( { ReconfigureOnChangeTest.class, MarkerFilterTest.class,
        DuplicateMessageFilterTest.class })
    public class PackageTest {
    }������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/turbo/lru/����������������������0000755�0001750�0001750�00000000000�12203357067�027045� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/turbo/lru/T_LRUCache.java�������0000644�0001750�0001750�00000004374�12136042271�031562� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.turbo.lru;
    
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.LinkedList;
    import java.util.List;
    
    /**
     * This is an alternative (slower) implementation of LRUCache for testing
     * purposes.
     * 
     * @author Ceki Gulcu
     */
    public class T_LRUCache<K> {
    
      int sequenceNumber;
      final int cacheSize;
      List<T_Entry<K>> cacheList = new LinkedList<T_Entry<K>>();
    
      public T_LRUCache(int size) {
        this.cacheSize = size;
      }
    
      @SuppressWarnings("unchecked")
      synchronized public void put(K k) {
        sequenceNumber++;
        T_Entry<K> te = getEntry(k);
        if (te != null) {
          te.sequenceNumber = sequenceNumber;
        } else {
          te = new T_Entry<K>(k, sequenceNumber);
          cacheList.add(te);
        }
        Collections.sort(cacheList);
        while(cacheList.size() > cacheSize) {
          cacheList.remove(0);    
        }
      }
    
      @SuppressWarnings("unchecked")
      synchronized public K get(K k) {
        T_Entry<K> te = getEntry(k);
        if (te == null) {
          return null;
        } else {
          te.sequenceNumber = ++sequenceNumber;
          Collections.sort(cacheList);
          return te.k;
        }
      }
    
      synchronized public List<K> keyList() {
        List<K> keyList = new ArrayList<K>();
        for (T_Entry<K> e : cacheList) {
          keyList.add(e.k);
        }
        return keyList;
      }
    
      private T_Entry<K> getEntry(K k) {
        for (int i = 0; i < cacheList.size(); i++) {
          T_Entry<K> te = cacheList.get(i);
          if (te.k.equals(k)) {
            return te;
          }
        }
        return null;
      }
    
    
      public void dump() {
        System.out.print("T:");
        for (T_Entry<K> te : cacheList) {
          //System.out.print(te.toString()+"->");
          System.out.print(te.k+", ");
        }
        System.out.println();
      }
    
    }
    
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/turbo/lru/LRUCache.java���������0000644�0001750�0001750�00000002550�12136042271�031271� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.turbo.lru;
    
    import java.util.ArrayList;
    import java.util.LinkedHashMap;
    import java.util.List;
    import java.util.Map;
    
    /**
     * An lru cache based on Java's LinkedHashMap.
     * 
     * @author Ceki Gulcu
     *
     * @param <K>
     * @param <V>
     */
    public class LRUCache<K, V> extends LinkedHashMap<K, V> {
      private static final long serialVersionUID = -6592964689843698200L;
    
      final int cacheSize;
    
      public LRUCache(int cacheSize) {
        super((int) (cacheSize*(4.0f/3)), 0.75f, true);
        if(cacheSize < 1) {
          throw new IllegalArgumentException("Cache size cannnot be smaller than 1");
       } 
        this.cacheSize = cacheSize;
      }
      
      protected boolean removeEldestEntry(Map.Entry eldest) {
        return (size() > cacheSize);
      }
      
      List<K> keyList() {
        ArrayList<K> al = new ArrayList<K>();
        al.addAll(keySet());
        return al;
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/turbo/lru/LRUCacheTest.java�����0000644�0001750�0001750�00000007743�12136042271�032142� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.turbo.lru;
    
    import static org.junit.Assert.assertEquals;
    
    import java.util.LinkedList;
    import java.util.List;
    
    import org.junit.Ignore;
    import org.junit.Test;
    
    @Ignore
    public class LRUCacheTest {
    
      @Test
      public void smoke() {
        
        LRUCache<String, String> cache = new LRUCache<String, String>(2);
        cache.put("a", "a");
        cache.put("b", "b");
        cache.put("c", "c");
        List<String> witness = new LinkedList<String>();
        witness.add("b");
        witness.add("c");
        assertEquals(witness, cache.keyList());
      }
    
      @Test
      public void typicalScenarioTest() {
        int simulationLen = 1000 * 10;
        int cacheSize = 100;
        int worldSize = 1000;
        doScenario(simulationLen, cacheSize, worldSize);
      }
    
      @Test
      public void scenarioCoverageTest() {
        int simulationLen = 1000 * 10;
    
        int[] cacheSizes = new int[] { 1, 10, 100};
        // tests with large worldSizes are slow because with a large
        // world size the probability of a cache miss is high.
        int[] worldSizes = new int[] { 1, 10, 100 };
    
        for (int i = 0; i < cacheSizes.length; i++) {
          for (int j = 0; j < worldSizes.length; j++) {
            doScenario(simulationLen, cacheSizes[i], worldSizes[j]);
          }
        }
      }
    
      void doScenario(int simulationLen, int cacheSize, int worldSize) {
        int get2PutRatio = 10;
        Simulator simulator = new Simulator(worldSize, get2PutRatio, false);
        List<Event> scenario = simulator.generateScenario(simulationLen);
        LRUCache<String, String> lruCache = new LRUCache<String, String>(cacheSize);
        T_LRUCache<String> tlruCache = new T_LRUCache<String>(cacheSize);
        long start = System.nanoTime();
        simulator.simulate(scenario, lruCache, tlruCache);
        //assertEquals(tlruCache.keyList(), lruCache.keyList());
        long end = System.nanoTime();
        System.out.println("cacheSize=" + cacheSize + ", worldSize=" + worldSize
            + ", elapsed time=" + ((end - start) / (1000 * 1000)) + " in millis");
      }
      
      
      
      @Test
      @Ignore // slow test that is known to pass
      public void multiThreadedScenario() throws InterruptedException {
        int cacheSize = 100;
        int worldSize = cacheSize*2;
        LRUCache<String, String> lruCache = new LRUCache<String, String>(cacheSize);
        T_LRUCache<String> tlruCache = new T_LRUCache<String>(cacheSize);
        SimulatorRunnable[] simulatorArray = new SimulatorRunnable[5];
        for(int i = 0; i < simulatorArray.length; i++) {
          simulatorArray[i] = new SimulatorRunnable(lruCache, tlruCache, worldSize);
        }
        for(int i = 0; i < simulatorArray.length; i++) {
          simulatorArray[i].start();
        }
        for(int i = 0; i < simulatorArray.length; i++) {
          simulatorArray[i].join();
        }
        assertEquals(tlruCache.keyList(), lruCache.keyList());
      }
      
      private class SimulatorRunnable extends Thread {
    
        LRUCache<String, String> lruCache;
        T_LRUCache<String> tlruCache;
        int worldSize;
        
        SimulatorRunnable(LRUCache<String, String> lruCache, T_LRUCache<String> tlruCache, int worldSize) {
          this.lruCache = lruCache;
          this.tlruCache = tlruCache;
          this.worldSize = worldSize;
        }
        
        public void run() {
          int get2PutRatio = 10;
          int simulationLen = 1000*50;
          Simulator simulator = new Simulator(worldSize, get2PutRatio, true);
          List<Event> scenario = simulator.generateScenario(simulationLen);
          simulator.simulate(scenario, lruCache, tlruCache);
          System.out.println("done");
        }
      }
      
    }
    �����������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/turbo/lru/T_Entry.java����������0000644�0001750�0001750�00000002245�12136042271�031270� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.turbo.lru;
    
    public class T_Entry<K> implements Comparable {
    
      K k;
      long sequenceNumber;
    
      T_Entry(K k, long sn) {
        this.k = k;
        this.sequenceNumber = sn;
      }
    
      public int compareTo(Object o) {
        if(!(o instanceof T_Entry)) {
          throw new IllegalArgumentException("arguments must be of type "+T_Entry.class);
        }
        
        T_Entry other = (T_Entry) o;
        if(sequenceNumber > other.sequenceNumber) {
          return 1;
        }
        if(sequenceNumber == other.sequenceNumber) {
          return 0;
        }
        return -1;
      }
      @Override
      public String toString() {
        return "("+k+","+sequenceNumber+")";
        //return "("+k+")";
      }
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/turbo/lru/Event.java������������0000644�0001750�0001750�00000001501�12136042271�030757� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.turbo.lru;
    
    public class Event<K> {
    
      final public boolean put;
      final public K k;
      
      public Event(boolean put, K k) {
        this.put = put;
        this.k = k;
      }
      
      public String toString() {
        if(put) {
          return "Event: put, "+k;
        } else {
          return "Event: get, "+k;
        }
      }
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/turbo/lru/Simulator.java��������0000644�0001750�0001750�00000005064�12136042271�031665� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.turbo.lru;
    
    import static org.junit.Assert.assertEquals;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Random;
    
    public class Simulator {
    
      Random random;
    
      int worldSize;
      int get2PutRatio;
      boolean multiThreaded;
    
      public Simulator(int worldSize, int get2PutRatio, boolean multiThreaded) {
        this.worldSize = worldSize;
        this.get2PutRatio = get2PutRatio;
        long seed = System.nanoTime();
        // System.out.println("seed is "+seed);
        random = new Random(seed);
        this.multiThreaded = multiThreaded;
      }
    
      public List<Event> generateScenario(int len) {
        List<Event> scenario = new ArrayList<Event>();
    
        for (int i = 0; i < len; i++) {
    
          int r = random.nextInt(get2PutRatio);
          boolean put = false;
          if (r == 0) {
            put = true;
          }
          r = random.nextInt(worldSize);
          Event<String> e = new Event<String>(put, String.valueOf(r));
          scenario.add(e);
        }
        return scenario;
      }
    
      public void simulate(List<Event> scenario, LRUCache<String, String> lruCache,
          T_LRUCache<String> tlruCache) {
        for (Event<String> e : scenario) {
          if (e.put) {
            lruCache.put(e.k, e.k);
            tlruCache.put(e.k);
          } else {
            String r0 = lruCache.get(e.k);
            String r1 = tlruCache.get(e.k);
            if (!multiThreaded) {
              // if the simulation is used in a multi-threaded
              // context, then the state of lruCache may be different than
              // that of tlruCache. In single threaded mode, they should
              // return the same values all the time
              if (r0 != null) {
                assertEquals(r0, e.k);
              }
              assertEquals(r0, r1);
            }
          }
        }
      }
    
      // void compareAndDumpIfDifferent(LRUCache<String, String> lruCache,
      // T_LRUCache<String> tlruCache) {
      // lruCache.dump();
      // tlruCache.dump();
      // if(!lruCache.keyList().equals(tlruCache.ketList())) {
      // lruCache.dump();
      // tlruCache.dump();
      // throw new AssertionFailedError("s");
      // }
      // }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/turbo/lru/X_LRUCache.java�������0000644�0001750�0001750�00000002554�12136042271�031564� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.turbo.lru;
    
    import java.util.ArrayList;
    import java.util.LinkedHashMap;
    import java.util.List;
    import java.util.Map;
    
    /**
     * An lru cache based on Java's LinkedHashMap.
     * 
     * @author Ceki Gulcu
     *
     * @param <K>
     * @param <V>
     */
    public class X_LRUCache<K, V> extends LinkedHashMap<K, V> {
      private static final long serialVersionUID = -6592964689843698200L;
    
      final int cacheSize;
    
      public X_LRUCache(int cacheSize) {
        super((int) (cacheSize*(4.0f/3)), 0.75f, true);
        if(cacheSize < 1) {
          throw new IllegalArgumentException("Cache size cannnot be smaller than 1");
       } 
        this.cacheSize = cacheSize;
      }
      
      protected boolean removeEldestEntry(Map.Entry eldest) {
        return (size() > cacheSize);
      }
      
      List<K> keyList() {
        ArrayList<K> al = new ArrayList<K>();
        al.addAll(keySet());
        return al;
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/turbo/NOPTurboFilter.java�������0000644�0001750�0001750�00000001673�12136042271�031724� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.turbo;
    
    import org.slf4j.Marker;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.core.spi.FilterReply;
    
    public class NOPTurboFilter extends TurboFilter {
    
      @Override
      public FilterReply decide(final Marker marker, final Logger logger, final Level level, final String format,
          final Object[] params, final Throwable t) {
       
        return FilterReply.NEUTRAL;
      }
    
    }
    ���������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/Foo.java������������������������0000644�0001750�0001750�00000001422�12136042271�026466� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic;
    
    import java.io.Serializable;
    
    class Foo implements Serializable {
      private static final long serialVersionUID = 1L;
      final Logger logger;
      
      Foo(Logger logger) {
        this.logger = logger;
      }
      
      void doFoo() {
        logger.debug("hello");
      }
    }
    
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000150�00000000000�011561� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/ScenarioBasedLoggerContextTest.java�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/ScenarioBasedLoggerContextTest.j0000644�0001750�0001750�00000007055�12136042271�033332� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertNull;
    
    import java.util.List;
    import java.util.Map;
    
    import org.junit.Ignore;
    import org.junit.Test;
    
    import ch.qos.logback.classic.control.ControlLogger;
    import ch.qos.logback.classic.control.ControlLoggerContext;
    import ch.qos.logback.classic.control.CreateLogger;
    import ch.qos.logback.classic.control.ScenarioAction;
    import ch.qos.logback.classic.control.ScenarioMaker;
    import ch.qos.logback.classic.control.SetLevel;
    import ch.qos.logback.classic.control.Scenario;
    
    
    public class ScenarioBasedLoggerContextTest  {
      LoggerContext lc;
    
      
      @Test
      public void testLen3() {
        doScenarioedTest(3);
      }
    
      @Test
      public void testLength_30() {
        doScenarioedTest(30);
      }
    
      @Test
      public void testLength_20000() {
        doScenarioedTest(20*1000);
      }
    
      @Test
      @Ignore
      public void testLengthLong() {
        doScenarioedTest(100*1000);
      }
    
      private void doScenarioedTest(int len) {
        LoggerContext lc = new LoggerContext();
        ControlLoggerContext controlContext = new ControlLoggerContext();
        Scenario s = ScenarioMaker.makeRealisticCreationScenario(len);
        List actionList = s.getActionList();
        int size = actionList.size();
        for (int i = 0; i < size; i++) {
          ScenarioAction action = (ScenarioAction) actionList.get(i);
          if (action instanceof CreateLogger) {
            CreateLogger cl = (CreateLogger) action;
            lc.getLogger(cl.getLoggerName());
            controlContext.getLogger(cl.getLoggerName());
          } else if (action instanceof SetLevel) {
            SetLevel sl = (SetLevel) action;
            Logger l = lc.getLogger(sl.getLoggerName());
            ControlLogger controlLogger = controlContext.getLogger(sl.getLoggerName());
            l.setLevel(sl.getLevel());
            controlLogger.setLevel(sl.getLevel());
          }
        }
    
        compareLoggerContexts(controlContext, lc);
      }
    
      void compareLoggerContexts(ControlLoggerContext controlLC, LoggerContext lc) {
        Map<String, ControlLogger> controlLoggerMap = controlLC.getLoggerMap();
    
        assertEquals(controlLoggerMap.size()+1, lc.size());
    
        for (String loggerName: controlLoggerMap.keySet()) {
            
          Logger logger = lc.exists(loggerName);
          ControlLogger controlLogger = (ControlLogger) controlLoggerMap.get(loggerName);
          if (logger == null) {
            throw new IllegalStateException("logger" + loggerName + " should exist");
          }
          assertEquals(loggerName, logger.getName());
          assertEquals(loggerName, controlLogger.getName());
    
          compareLoggers(controlLogger, logger);
        }
      }
    
      void compareLoggers(ControlLogger controlLogger, Logger logger) {
        assertEquals(controlLogger.getName(), logger.getName());
        assertEquals(controlLogger.getEffectiveLevel(), logger.getEffectiveLevel());
    
        Level controlLevel = controlLogger.getLevel();
        Level level = logger.getLevel();
    
        if (controlLevel == null) {
          assertNull(level);
        } else {
          assertEquals(controlLevel, level);
        }
      }
    }�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/boolex/�������������������������0000755�0001750�0001750�00000000000�12203357067�026400� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/boolex/GEventEvaluatorTest.java�0000644�0001750�0001750�00000012237�12136042271�033154� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.boolex;
    
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.classic.spi.LoggingEvent;
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.boolex.EvaluationException;
    import ch.qos.logback.core.status.StatusChecker;
    import ch.qos.logback.core.util.ContextUtil;
    import ch.qos.logback.core.util.StatusPrinter;
    import org.junit.Before;
    import org.junit.Ignore;
    import org.junit.Test;
    import org.slf4j.MDC;
    import org.slf4j.Marker;
    import org.slf4j.MarkerFactory;
    import org.slf4j.helpers.BogoPerf;
    
    import static junit.framework.Assert.assertEquals;
    import static org.junit.Assert.assertTrue;
    
    /**
     * @author Ceki G&uuml;c&uuml;
     */
    
    public class GEventEvaluatorTest {
    
      LoggerContext context = new LoggerContext();
      StatusChecker statusChecker = new StatusChecker(context);
      int LEN = 100 * 1000;
    
      Logger logger = context.getLogger(this.getClass());
      Marker markerA = MarkerFactory.getMarker("A");
    
      GEventEvaluator gee = new GEventEvaluator();
    
      @Before
      public void setUp() {
        gee.setContext(context);
      }
    
      LoggingEvent makeEvent(String msg) {
        return makeEvent(Level.DEBUG, msg, null, null);
      }
    
      LoggingEvent makeEvent(Level level, String msg, Throwable t, Object[] argArray) {
        return new LoggingEvent(this.getClass().getName(), logger, level, msg, t, argArray);
      }
    
      void doEvaluateAndCheck(String expression, ILoggingEvent event, boolean expected) throws EvaluationException {
        gee.setExpression(expression);
        gee.start();
    
        StatusPrinter.printInCaseOfErrorsOrWarnings(context);
        assertTrue(statusChecker.isErrorFree(0));
    
        ContextUtil contextUtil = new ContextUtil(context);
        contextUtil.addGroovyPackages(context.getFrameworkPackages());
        contextUtil.addFrameworkPackage(context.getFrameworkPackages(), "ch.qos.logback.classic.boolex");
    
        boolean result = gee.evaluate(event);
        assertEquals(expected, result);
      }
    
      @Test
      public void smoke() throws EvaluationException {
        doEvaluateAndCheck("1==1", null, true);
      }
    
      @Test
      public void event() throws EvaluationException {
        ILoggingEvent event = makeEvent("x");
        event.getLoggerContextVO();
        doEvaluateAndCheck("e.message == 'x'", event, true);
      }
    
      @Test
      public void msgRegex() throws EvaluationException {
        LoggingEvent event = makeEvent("Hello world");
        // partial match
        doEvaluateAndCheck("e.message =~ /xyz|wor/", event, true);
        // full match
        doEvaluateAndCheck("e.message ==~ /xyz|wor/", event, false);
      }
    
      @Test
      public void level() throws EvaluationException {
        LoggingEvent event = makeEvent("x");
        doEvaluateAndCheck("e.level == DEBUG", event, true);
      }
    
    
      @Test
      public void nullMarker() throws EvaluationException {
        LoggingEvent event = makeEvent("x");
        doEvaluateAndCheck("e.marker?.name == 'YELLOW'", event, false);
      }
    
      @Test
      public void marker() throws EvaluationException {
        LoggingEvent event = makeEvent("x");
        event.setMarker(markerA);
        doEvaluateAndCheck("e.marker?.name == 'A'", event, true);
      }
    
      @Test
      public void nullMDC() throws EvaluationException {
        LoggingEvent event = makeEvent("x");
        doEvaluateAndCheck("e.mdc?.get('key') == 'val'", event, false);
      }
    
      @Test
      public void mdc() throws EvaluationException {
        MDC.put("key", "val");
        LoggingEvent event = makeEvent("x");
        doEvaluateAndCheck("e.mdc['key'] == 'val'", event, true);
        MDC.clear();
      }
    
      @Test
      public void callerData() throws EvaluationException {
        LoggingEvent event = makeEvent("x");
        doEvaluateAndCheck("e.callerData.find{ it.className =~ /junit/ }", event, true);
      }
    
      double loop(GEventEvaluator gee) throws EvaluationException {
        long start = System.nanoTime();
        ILoggingEvent event = makeEvent("x");
        for (int i = 0; i < LEN; i++) {
          gee.evaluate(event);
        }
        long end = System.nanoTime();
        return (end - start) / LEN;
      }
    
    
      @Test
      public void startMakesIsStartedReturnTrue() {
        gee.setExpression("return true");
        gee.start();
        assertTrue(gee.isStarted());
      }
    
      @Test
      @Ignore
      public void MANUAL_perfTest() throws EvaluationException {
        gee.setExpression("event.timeStamp < 100 && event.message != 'xx' ");
        gee.start();
    
        loop(gee);
        loop(gee);
        double avgDuration = loop(gee);
    
        long referencePerf = 500;
        BogoPerf.assertDuration(avgDuration, referencePerf,
                CoreConstants.REFERENCE_BIPS);
        System.out.println("Average duration " + avgDuration);
      }
    
    }�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000151�00000000000�011562� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/boolex/ConditionalWithoutJanino.java������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/boolex/ConditionalWithoutJanino.0000644�0001750�0001750�00000004133�12136042271�033361� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.boolex;
    
    import ch.qos.logback.classic.ClassicTestConstants;
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.core.joran.conditional.IfAction;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.status.StatusChecker;
    import ch.qos.logback.core.util.StatusPrinter;
    import org.junit.Test;
    
    import static org.junit.Assert.*;
    
    /**
     * @author Ceki G&uuml;c&uuml;
     */
    public class ConditionalWithoutJanino {
    
      LoggerContext loggerContext = new LoggerContext();
      Logger root = loggerContext.getLogger(Logger.ROOT_LOGGER_NAME);
    
      void configure(String file) throws JoranException {
        JoranConfigurator jc = new JoranConfigurator();
        jc.setContext(loggerContext);
        jc.doConfigure(file);
      }
    
      // assume that janino.jar ia NOT on the classpath
      @Test
      public void conditionalWithoutJanino() throws JoranException {
        String configFile = ClassicTestConstants.JORAN_INPUT_PREFIX + "conditional/withoutJanino.xml";
        String currentDir = System.getProperty("user.dir");
        if(!currentDir.contains("logback-classic")) {
             configFile =  "logback-classic/"+configFile;
        }
        configure(configFile);
        StatusPrinter.print(loggerContext);
        StatusChecker checker = new StatusChecker(loggerContext);
        checker.assertContainsMatch(IfAction.MISSING_JANINO_MSG);
    
        assertSame(Level.WARN, loggerContext.getLogger("a").getLevel());
        assertSame(Level.WARN, root.getLevel());
      }
    
    }
    
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/boolex/PackageTest.java���������0000644�0001750�0001750�00000001405�12136042271�031427� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.boolex;
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    import org.junit.runners.Suite.SuiteClasses;
    
    @RunWith(Suite.class)
    @SuiteClasses({JaninoEventEvaluatorTest.class, OnMarkerEvaluatorTest.class})
    public class PackageTest {
    }�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000151�00000000000�011562� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/boolex/JaninoEventEvaluatorTest.java������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/boolex/JaninoEventEvaluatorTest.0000644�0001750�0001750�00000017035�12136213375�033350� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.boolex;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertFalse;
    import static org.junit.Assert.assertTrue;
    import static org.junit.Assert.fail;
    
    import java.io.IOException;
    
    import org.junit.Test;
    import org.slf4j.MDC;
    import org.slf4j.MarkerFactory;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.pattern.ConverterTest;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.classic.spi.LoggingEvent;
    import ch.qos.logback.core.boolex.EvaluationException;
    import ch.qos.logback.core.boolex.JaninoEventEvaluatorBase;
    import ch.qos.logback.core.boolex.Matcher;
    import ch.qos.logback.core.filter.EvaluatorFilter;
    import ch.qos.logback.core.spi.FilterReply;
    import ch.qos.logback.core.testUtil.RandomUtil;
    import ch.qos.logback.core.util.StatusPrinter;
    
    public class JaninoEventEvaluatorTest {
    
      LoggerContext loggerContext = new LoggerContext();
      Logger logger = loggerContext.getLogger(ConverterTest.class);
    
      Matcher matcherX = new Matcher();
    
      JaninoEventEvaluator jee = new JaninoEventEvaluator();
    
      int diff = RandomUtil.getPositiveInt();
      
      public JaninoEventEvaluatorTest() {
        jee.setContext(loggerContext);
    
        matcherX.setName("x");
        matcherX.setRegex("^Some\\s.*");
        matcherX.start();
    
      }
    
      LoggingEvent makeLoggingEvent(Exception ex) {
        return new LoggingEvent(
            ch.qos.logback.core.pattern.FormattingConverter.class.getName(),
            logger, Level.INFO, "Some message", ex, null);
      }
    
      @Test
      public void testBasic() throws Exception {
        jee.setExpression("message.equals(\"Some message\")");
        jee.start();
    
        StatusPrinter.print(loggerContext);
        ILoggingEvent event = makeLoggingEvent(null);
        assertTrue(jee.evaluate(event));
      }
    
      @Test
      public void testLevel() throws Exception {
        jee.setExpression("level > DEBUG");
        jee.start();
    
        ILoggingEvent event = makeLoggingEvent(null);
        assertTrue(jee.evaluate(event));
      }
    
      @Test
      public void testtimeStamp() throws Exception {
        jee.setExpression("timeStamp > 10");
        jee.start();
    
        ILoggingEvent event = makeLoggingEvent(null);
        assertTrue(jee.evaluate(event));
      }
    
      @Test
      public void testWithMatcher() throws Exception {
        jee.setExpression("x.matches(message)");
        jee.addMatcher(matcherX);
        jee.start();
    
        ILoggingEvent event = makeLoggingEvent(null);
        assertTrue(jee.evaluate(event));
      }
    
    
      @Test
      public void mdcAsString() throws Exception {
        String k = "key"+diff;
        
        MDC.put("key"+diff, "value"+diff);
        jee.setExpression("((String) mdc.get(\""+k+"\")).contains(\"alue\")");
        jee.start();
        StatusPrinter.printInCaseOfErrorsOrWarnings(loggerContext);
        
        LoggingEvent event = makeLoggingEvent(null);
        assertTrue(jee.evaluate(event));
        MDC.remove(k);
      }
      
      @Test
      public void marker() throws Exception {
        jee.setExpression("marker.contains(\"BLUE\")");
        jee.start();
    
        LoggingEvent event = makeLoggingEvent(null);
        event.setMarker(MarkerFactory.getMarker("BLUE"));
        assertTrue(jee.evaluate(event));
      }
    
      
      @Test
      public void withNullMarker_LBCORE_118() throws Exception {
        jee.setExpression("marker.contains(\"BLUE\")");
        jee.start();
    
        ILoggingEvent event = makeLoggingEvent(null);
        try {
          jee.evaluate(event);
          fail("We should not reach this point");
        } catch (EvaluationException ee) {
          // received an exception as expected
        }
      }
    
      @Test
      public void evaluatorFilterWithNullMarker_LBCORE_118() throws Exception {
        EvaluatorFilter<ILoggingEvent> ef = new EvaluatorFilter<ILoggingEvent>();
        ef.setContext(loggerContext);
    
        ef.setOnMatch(FilterReply.ACCEPT);
        ef.setOnMismatch(FilterReply.DENY);
    
        jee.setExpression("marker.contains(\"BLUE\")");
        jee.start();
    
        ef.setEvaluator(jee);
        ef.start();
        ILoggingEvent event = makeLoggingEvent(null);
        assertEquals(FilterReply.NEUTRAL, ef.decide(event));
        
      }
    
      @Test
      public void testComplex() throws Exception {
        jee
            .setExpression("level >= INFO && x.matches(message) && marker.contains(\"BLUE\")");
        jee.addMatcher(matcherX);
        jee.start();
    
        LoggingEvent event = makeLoggingEvent(null);
        event.setMarker(MarkerFactory.getMarker("BLUE"));
        assertTrue(jee.evaluate(event));
      }
    
      /**
       * check that evaluator with bogus exp does not start
       * 
       * @throws Exception
       */
      @Test
      public void testBogusExp1() {
        jee.setExpression("mzzzz.get(\"key\").equals(null)");
        jee.setName("bogus");
        jee.start();
    
        assertFalse(jee.isStarted());
      }
    
      // check that eval stops after errors
      @Test
      public void testBogusExp2() {
        jee.setExpression("mdc.get(\"keyXN89\").equals(null)");
        jee.setName("bogus");
        jee.start();
    
        assertTrue(jee.isStarted());
    
        ILoggingEvent event = makeLoggingEvent(null);
    
        for (int i = 0; i < JaninoEventEvaluatorBase.ERROR_THRESHOLD; i++) {
          try {
            jee.evaluate(event);
            fail("should throw an exception");
          } catch (EvaluationException e) {
          }
        }
        // after a few attempts the evaluator should processPriorToRemoval
        assertFalse(jee.isStarted());
    
      }
    
      static final long LEN = 10 * 1000;
    
      // with 6 parameters 400 nanos
      // with 7 parameters 460 nanos (all levels + selected fields from
      // LoggingEvent)
      // with 10 parameters 510 nanos (all levels + fields)
      void loop(JaninoEventEvaluator jee, String msg) throws Exception {
        ILoggingEvent event = makeLoggingEvent(null);
        // final long start = System.nanoTime();
        for (int i = 0; i < LEN; i++) {
          jee.evaluate(event);
        }
        // final long end = System.nanoTime();
        // System.out.println(msg + (end - start) / LEN + " nanos");
      }
    
      @Test
      public void testLoop1() throws Exception {
        jee.setExpression("timeStamp > 10");
        jee.start();
    
        loop(jee, "timestamp > 10]: ");
      }
    
      @Test
      public void testLoop2() throws Exception {
        jee.setExpression("x.matches(message)");
        jee.addMatcher(matcherX);
        jee.start();
    
        loop(jee, "x.matches(message): ");
      }
    
      @Test
      public void throwable_LBCLASSIC_155_I() throws EvaluationException {
        jee.setExpression("throwable instanceof java.io.IOException");
        jee.start();
    
        LoggingEvent event = makeLoggingEvent(new IOException(""));
        assertTrue(jee.evaluate(event));
      }
    
      @Test
      public void throwable_LBCLASSIC_155_II() throws EvaluationException {
        jee.setExpression("throwableProxy.getClassName().contains(\"IO\")");
        jee.start();
    
        LoggingEvent event = makeLoggingEvent(new IOException(""));
        assertTrue(jee.evaluate(event));
      }
    
    
      @Test
      public void nullMDC() throws EvaluationException {
        MDC.clear();
        jee.setExpression("mdc.isEmpty()");
        jee.start();
    
        LoggingEvent event = makeLoggingEvent(null);
        assertTrue(jee.evaluate(event));
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000146�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/boolex/OnMarkerEvaluatorTest.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/boolex/OnMarkerEvaluatorTest.jav0000644�0001750�0001750�00000003530�12136042271�033335� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.boolex;
    
    import static org.junit.Assert.assertFalse;
    import static org.junit.Assert.assertTrue;
    
    import org.junit.Before;
    import org.junit.Test;
    import org.slf4j.MarkerFactory;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.spi.LoggingEvent;
    import ch.qos.logback.core.boolex.EvaluationException;
    
    
    public class OnMarkerEvaluatorTest {
    
      
      LoggerContext lc = new LoggerContext();
      LoggingEvent event = makeEvent();
      OnMarkerEvaluator evaluator = new OnMarkerEvaluator();
    
      @Before
      public void before() {
        evaluator.setContext(lc);
      }
      
      @Test
      public void smoke() throws EvaluationException {
        evaluator.addMarker("M");
        evaluator.start();
       
        event.setMarker(MarkerFactory.getMarker("M"));
        assertTrue(evaluator.evaluate(event));
      }
      
      @Test
      public void nullMarkerInEvent() throws EvaluationException {
        evaluator.addMarker("M");
        evaluator.start();
        assertFalse(evaluator.evaluate(event));
      }
      
      @Test
      public void nullMarkerInEvaluator() throws EvaluationException {
        evaluator.addMarker("M");
        evaluator.start();
        assertFalse(evaluator.evaluate(event));
      }
      
      
      LoggingEvent makeEvent() {
        return new LoggingEvent("x", lc.getLogger("x"), Level.DEBUG, "msg", null, null);
      }
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/LoggerTest.java�����������������0000644�0001750�0001750�00000015525�12136042271�030033� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertFalse;
    import static org.junit.Assert.assertNotNull;
    import static org.junit.Assert.assertTrue;
    import static org.junit.Assert.fail;
    
    import java.util.List;
    
    import org.junit.Test;
    import org.slf4j.LoggerFactory;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.read.ListAppender;
    import ch.qos.logback.core.status.Status;
    
    public class LoggerTest {
    
      LoggerContext lc = new LoggerContext();
      Logger root = lc.getLogger(Logger.ROOT_LOGGER_NAME);
      Logger loggerTest = lc.getLogger(LoggerTest.class);
    
      ListAppender<ILoggingEvent> listAppender = new ListAppender<ILoggingEvent>();
    
      @Test
      public void smoke() {
        ListAppender<ILoggingEvent> listAppender = new ListAppender<ILoggingEvent>();
        listAppender.start();
        root.addAppender(listAppender);
        Logger logger = lc.getLogger(LoggerTest.class);
        assertEquals(0, listAppender.list.size());
        logger.debug("hello");
        assertEquals(1, listAppender.list.size());
      }
    
      @Test
      public void testNoStart() {
        // listAppender.start();
        listAppender.setContext(lc);
        root.addAppender(listAppender);
        Logger logger = lc.getLogger(LoggerTest.class);
        logger.debug("hello");
    
        List<Status> statusList = lc.getStatusManager().getCopyOfStatusList();
        Status s0 = statusList.get(0);
        assertEquals(Status.WARN, s0.getLevel());
        assertTrue(s0.getMessage().startsWith("Attempted to append to non started"));
      }
    
      @Test
      public void testAdditive() {
        listAppender.start();
        root.addAppender(listAppender);
        loggerTest.addAppender(listAppender);
        loggerTest.setAdditive(false);
        loggerTest.debug("hello");
        // 1 instead of two, since logger is not additive
        assertEquals(1, listAppender.list.size());
      }
    
      @Test
      public void testRootLogger() {
        Logger logger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
        LoggerContext lc = logger.getLoggerContext();
    
        assertNotNull("Returned logger is null", logger);
        assertEquals("Return logger isn't named root", logger.getName(),
            Logger.ROOT_LOGGER_NAME);
        assertTrue("logger instances should be indentical", logger == lc.root);
      }
    
      @Test
      public void testBasicFiltering() throws Exception {
        listAppender.start();
        root.addAppender(listAppender);
        root.setLevel(Level.INFO);
        loggerTest.debug("x");
        assertEquals(0, listAppender.list.size());
        loggerTest.info("x");
        loggerTest.warn("x");
        loggerTest.error("x");
        assertEquals(3, listAppender.list.size());
      }
    
      void checkLevelThreshold(Logger logger, Level threshold) {
    
        if (Level.ERROR_INT >= threshold.levelInt) {
          assertTrue(logger.isErrorEnabled());
          assertTrue(logger.isEnabledFor(Level.ERROR));
        } else {
          assertFalse(logger.isErrorEnabled());
          assertFalse(logger.isEnabledFor(Level.ERROR));
        }
    
        if (Level.WARN_INT >= threshold.levelInt) {
          assertTrue(logger.isWarnEnabled());
          assertTrue(logger.isEnabledFor(Level.WARN));
        } else {
          assertFalse(logger.isWarnEnabled());
          assertFalse(logger.isEnabledFor(Level.WARN));
        }
        if (Level.INFO_INT >= threshold.levelInt) {
          assertTrue(logger.isInfoEnabled());
          assertTrue(logger.isEnabledFor(Level.INFO));
        } else {
          assertFalse(logger.isInfoEnabled());
          assertFalse(logger.isEnabledFor(Level.INFO));
        }
        if (Level.DEBUG_INT >= threshold.levelInt) {
          assertTrue(logger.isDebugEnabled());
          assertTrue(logger.isEnabledFor(Level.DEBUG));
        } else {
          assertFalse(logger.isDebugEnabled());
          assertFalse(logger.isEnabledFor(Level.DEBUG));
        }
        if (Level.TRACE_INT >= threshold.levelInt) {
          assertTrue(logger.isTraceEnabled());
          assertTrue(logger.isEnabledFor(Level.TRACE));
        } else {
          assertFalse(logger.isTraceEnabled());
          assertFalse(logger.isEnabledFor(Level.TRACE));
        }
      }
    
      @Test
      public void  innerClass_I() {
        root.setLevel(Level.DEBUG);
        Logger a = lc.getLogger("a");
        a.setLevel(Level.INFO);
        Logger a_b = lc.getLogger("a$b");
        assertEquals(Level.INFO, a_b.getEffectiveLevel());
      }
    
      @Test
      public void  innerClass_II() {
        root.setLevel(Level.DEBUG);
        Logger a = lc.getLogger(this.getClass());
        a.setLevel(Level.INFO);
        Logger a_b = lc.getLogger(new Inner().getClass());
        assertEquals(Level.INFO, a_b.getEffectiveLevel());
      }
    
      
      class Inner {
      }
      
      @Test
      public void testEnabled_All() throws Exception {
        root.setLevel(Level.ALL);
        checkLevelThreshold(loggerTest, Level.ALL);
      }
    
      @Test
      public void testEnabled_Debug() throws Exception {
        root.setLevel(Level.DEBUG);
        checkLevelThreshold(loggerTest, Level.DEBUG);
      }
    
      @Test
      public void testEnabled_Info() throws Exception {
        root.setLevel(Level.INFO);
        checkLevelThreshold(loggerTest, Level.INFO);
      }
    
      @Test
      public void testEnabledX_Warn() throws Exception {
        root.setLevel(Level.WARN);
        checkLevelThreshold(loggerTest, Level.WARN);
      }
    
      public void testEnabledX_Errror() throws Exception {
        root.setLevel(Level.ERROR);
        checkLevelThreshold(loggerTest, Level.ERROR);
      }
    
      @Test
      public void testEnabledX_Off() throws Exception {
        root.setLevel(Level.OFF);
        checkLevelThreshold(loggerTest, Level.OFF);
      }
    
      @Test
      public void setRootLevelToNull() {
        try {
          root.setLevel(null);
          fail("The level of the root logger should not be settable to null");
        } catch (IllegalArgumentException e) {
        }
      }
    
      @Test
      public void setLevelToNull_A() {
        loggerTest.setLevel(null);
        assertEquals(root.getEffectiveLevel(), loggerTest.getEffectiveLevel());
      }
      
      @Test
      public void setLevelToNull_B() {
        loggerTest.setLevel(Level.DEBUG);
        loggerTest.setLevel(null);
        assertEquals(root.getEffectiveLevel(), loggerTest.getEffectiveLevel());
      }
      
      @Test
      public void setLevelToNull_LBCLASSIC_91() {
        loggerTest.setLevel(Level.DEBUG);
        ch.qos.logback.classic.Logger child = lc.getLogger(loggerTest.getName() + ".child");
        loggerTest.setLevel(null);
        assertEquals(root.getEffectiveLevel(), loggerTest.getEffectiveLevel());
        assertEquals(root.getEffectiveLevel(), child.getEffectiveLevel());
      }
    
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/corpus/�������������������������0000755�0001750�0001750�00000000000�12203357067�026423� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/corpus/RandomUtil.java����������0000644�0001750�0001750�00000002402�12136042271�031333� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.corpus;
    
    import java.util.Random;
    
    public class RandomUtil {
    
      
      /**
       * Approximate a gaussian distrib with only positive integer values
       * 
       * @param average
       * @param stdDeviation
       * @return
       */
      static public int gaussianAsPositiveInt(Random random, int average, int stdDeviation) {
        if (average < 1) {
          throw new IllegalArgumentException(
              "The average must not be smaller than 1.");
        }
    
        if (stdDeviation < 1) {
          throw new IllegalArgumentException(
              "The stdDeviation must not be smaller than 1.");
        }
    
        double d = random.nextGaussian() * stdDeviation + average;
        int result = 1;
        if (d > 1.0) {
          result = (int) Math.round(d);
        }
        return result;
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/corpus/ExceptionBuilder.java����0000644�0001750�0001750�00000002650�12136042271�032527� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.corpus;
    
    import java.util.Random;
    
    import javax.management.remote.JMXProviderException;
    
    public class ExceptionBuilder {
    
      static Throwable build(Random r, double nestingProbability) {
        double rn = r.nextDouble();
        boolean nested = false;
        if (rn < nestingProbability) {
          nested = true;
        }
    
        Throwable cause = null;
        if(nested) {
          cause = makeThrowable(r, null);
        } 
        return makeThrowable(r, cause);
      }
    
      private static Throwable makeThrowable(Random r, Throwable cause) {
        int exType = r.nextInt(4);
        switch(exType) {
        case 0: return new IllegalArgumentException("an illegal argument was passed", cause);
        case 1: return new Exception("this is a test", cause);
        case 2: return new JMXProviderException("jmx provider exception error occured", cause);
        case 3: return new OutOfMemoryError("ran out of memory");
        }
        return null;
      }
      
    }
    ����������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/corpus/MessageArgumentTuple.java0000644�0001750�0001750�00000001534�12136042271�033363� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.corpus;
    
    public class MessageArgumentTuple {
      
      final String message;
      final int numberOfArguments;
    
      MessageArgumentTuple(String message) {
        this(message, 0);
      }
    
      public MessageArgumentTuple(String message, int numberOfArguments) {
        this.message = message;
        this.numberOfArguments = numberOfArguments;
      }
    
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/corpus/CorpusModel.java���������0000644�0001750�0001750�00000025117�12136042271�031521� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.corpus;
    
    import java.util.List;
    import java.util.Random;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.spi.ClassPackagingData;
    import ch.qos.logback.classic.spi.LoggerContextVO;
    import ch.qos.logback.classic.spi.StackTraceElementProxy;
    import ch.qos.logback.classic.spi.ThrowableProxy;
    import ch.qos.logback.classic.spi.ThrowableProxyVO;
    
    /**
     * Models the corpus.
     * 
     * <p>This contains the probability distributions of levels, logger names,
     * messages, message arguments.
     * 
     * @author Ceki G&uuml;lc&uuml;
     * 
     */
    public class CorpusModel {
    
      // N(u,s) denotes a random variable normally distributed with mean u and
      // variance sqrt(s), where sqrt() is the square root function. For an
      // explanation of normal distribution please see
      // http://en.wikipedia.org/wiki/Normal_distribution
    
      // It is assumed that the number of parts in a logger name is a random
      // variable normally distributed with mean AVERAGE_LOGGER_NAME_PARTS and
      // standard deviation STD_DEV_FOR_LOGGER_NAME_PARTS
      static final int AVERAGE_LOGGER_NAME_PARTS = 6;
      static final int STD_DEV_FOR_LOGGER_NAME_PARTS = 3;
    
      // It is assumed that there are LOGGER_POOL_SIZE logger names
      // in our model corpus.
      static final int LOGGER_POOL_SIZE = 1000;
    
      // It is assumed that there are LOG_STATEMENT_POOL_SIZE log statements
      // in our model corpus.
      static final int LOG_STATEMENT_POOL_SIZE = LOGGER_POOL_SIZE * 8;
    
      // level distribution is determined by the following table
      // It corresponds to TRACE 3%, DEBUG 30%, INFO 30%, WARN 5%,
      // ERROR 5%. See also getRandomLevel() method.
      static final double[] LEVEL_DISTRIBUTION = new double[] { .3, .3, .9, .95 };
    
      // It is assumed that the number of words in the message (contained in a log
      // statement) is a random variable normally distributed with mean
      // AVERAGE_MESSAGE_WORDS and standard deviation STD_DEV_FOR_MESSAGE_WORDS
      static final int AVERAGE_MESSAGE_WORDS = 8;
      static final int STD_DEV_FOR_MESSAGE_WORDS = 4;
    
      // messages will have no arguments 80% of the time, one argument in 8%, two
      // arguments in 7% and three arguments in 5% of cases
      static final double[] ARGUMENT_DISTRIBUTION = new double[] { .80, .88, 0.95 };
    
      static final double THROWABLE_PROPABILITY_FOR_WARNING = .1;
      static final double THROWABLE_PROPABILITY_FOR_ERRORS = .3;
      // .5 of throwables are nested once
      static final double NESTING_PROBABILITY = .5;
    
      // For each logging event the timer is incremented by a certain value. it is
      // assumed that this value is a random variable normally distributed with mean
      // AVERAGE_MILLIS_INCREMENT and standard deviation
      // STD_DEV_FOR_MILLIS_INCREMENT
      static final int AVERAGE_MILLIS_INCREMENT = 10;
      static final int STD_DEV_FOR_MILLIS_INCREMENT = 5;
    
      // assume that there are THREAD_POOL_SIZE threads in the corpus
      static final int THREAD_POOL_SIZE = 10;
    
      final Random random;
      final List<String> worldList;
      String[] threadNamePool;
      LogStatement[] logStatementPool;
      String[] loggerNamePool;
    
      // 2009-03-06 13:08 GMT
      long lastTimeStamp = 1236344888578L;
    
      public CorpusModel(long seed, List<String> worldList) {
        random = new Random(seed);
        this.worldList = worldList;
        buildThreadNamePool();
        buildLoggerNamePool();
        buildLogStatementPool();
      }
    
      private void buildThreadNamePool() {
        threadNamePool = new String[THREAD_POOL_SIZE];
        for (int i = 0; i < THREAD_POOL_SIZE; i++) {
          threadNamePool[i] = "CorpusMakerThread-" + i;
        }
      }
    
      private void buildLoggerNamePool() {
        loggerNamePool = new String[LOGGER_POOL_SIZE];
        for (int i = 0; i < LOGGER_POOL_SIZE; i++) {
          loggerNamePool[i] = makeRandomLoggerName();
        }
      }
    
      private void buildLogStatementPool() {
        logStatementPool = new LogStatement[LOG_STATEMENT_POOL_SIZE];
        for (int i = 0; i < LOG_STATEMENT_POOL_SIZE; i++) {
          logStatementPool[i] = makeRandomLogStatement(loggerNamePool);
        }
      }
    
      private int[] getRandomAnchorPositions(int wordCount, int numAnchors) {
        // note that the same position may appear multiple times in
        // positionsIndex, but without serious consequences
        int[] positionsIndex = new int[numAnchors];
        for (int i = 0; i < numAnchors; i++) {
          positionsIndex[i] = random.nextInt(wordCount);
        }
        return positionsIndex;
      }
    
      private String[] getRandomWords(int n) {
        String[] wordArray = new String[n];
        for (int i = 0; i < n; i++) {
          wordArray[i] = getRandomWord();
        }
        return wordArray;
      }
    
      public long getRandomLong() {
        return random.nextLong();
      }
    
      public String getRandomThreadNameFromPool() {
        int index = random.nextInt(THREAD_POOL_SIZE);
        return threadNamePool[index];
      }
    
      public LogStatement getRandomLogStatementFromPool() {
        int index = random.nextInt(logStatementPool.length);
        return logStatementPool[index];
      }
    
      private String getRandomLoggerNameFromPool(String[] loggerNamePool) {
        int index = random.nextInt(loggerNamePool.length);
        return loggerNamePool[index];
      }
    
      public long getRandomTimeStamp() {
        // subtract 1 so that 0 is allowed
        lastTimeStamp += RandomUtil.gaussianAsPositiveInt(random,
            AVERAGE_MILLIS_INCREMENT, STD_DEV_FOR_MILLIS_INCREMENT) - 1;
        return lastTimeStamp;
      }
    
      LoggerContextVO getRandomlyNamedLoggerContextVO() {
        LoggerContext lc = new LoggerContext();
        lc.setName(getRandomJavaIdentifier());
        return new LoggerContextVO(lc);
      }
    
      String getRandomWord() {
        int size = worldList.size();
        int randomIndex = random.nextInt(size);
        return worldList.get(randomIndex);
      }
    
      String extractLastPart(String loggerName) {
        int i = loggerName.lastIndexOf('.');
        if (i == -1) {
          return loggerName;
        } else {
          return loggerName.substring(i + 1);
        }
      }
    
      public StackTraceElement[] getRandomCallerData(int depth, String loggerName) {
        StackTraceElement[] cda = new StackTraceElement[depth];
        StackTraceElement cd = new StackTraceElement(loggerName,
            getRandomJavaIdentifier(), extractLastPart(loggerName), 0);
        cda[0] = cd;
        for (int i = 1; i < depth; i++) {
          String ln = getRandomLoggerNameFromPool(loggerNamePool);
          cda[i] = new StackTraceElement(ln, getRandomJavaIdentifier(),
              extractLastPart(ln), i * 10);
        }
        return cda;
      }
    
      public Object[] getRandomArgumentArray(int numOfArguments) {
        if (numOfArguments == 0) {
          return null;
        }
        Object[] argumentArray = new Object[numOfArguments];
        for (int i = 0; i < numOfArguments; i++) {
          argumentArray[i] = new Long(random.nextLong());
        }
        return argumentArray;
      }
    
      private MessageArgumentTuple makeRandomMessageArgumentTuple() {
        int numOfArguments = getNumberOfMessageArguments();
    
        int wordCount = RandomUtil.gaussianAsPositiveInt(random,
            AVERAGE_MESSAGE_WORDS, STD_DEV_FOR_MESSAGE_WORDS);
        String[] wordArray = getRandomWords(wordCount);
    
        int[] anchorPositions = getRandomAnchorPositions(wordCount, numOfArguments);
    
        for (int anchorIndex : anchorPositions) {
          wordArray[anchorIndex] = "{}";
        }
    
        StringBuilder sb = new StringBuilder();
        for (int i = 1; i < wordCount; i++) {
          sb.append(wordArray[i]).append(' ');
        }
        sb.append(getRandomWord());
        return new MessageArgumentTuple(sb.toString(), numOfArguments);
      }
    
      private LogStatement makeRandomLogStatement(String[] loggerNamePool) {
        MessageArgumentTuple mat = makeRandomMessageArgumentTuple();
        String loggerName = getRandomLoggerNameFromPool(loggerNamePool);
        Level randomLevel = getRandomLevel();
        Throwable t = getRandomThrowable(randomLevel);
        ThrowableProxyVO throwableProxy = null;
        if (t != null) {
          throwableProxy = ThrowableProxyVO.build(new ThrowableProxy(t));
          pupulateWithPackagingData(throwableProxy.getStackTraceElementProxyArray());
        }
        return new LogStatement(loggerName, randomLevel, mat,
            throwableProxy);
      }
    
      private Throwable getRandomThrowable(Level level) {
        double rn = random.nextDouble();
        if ((level == Level.WARN && rn < THROWABLE_PROPABILITY_FOR_WARNING)
            || (level == Level.ERROR && rn < THROWABLE_PROPABILITY_FOR_ERRORS)) {
          return ExceptionBuilder.build(random, NESTING_PROBABILITY);
        } else {
          return null;
        }
      }
    
      private void pupulateWithPackagingData(StackTraceElementProxy[] stepArray) {
        int i = 0;
        for (StackTraceElementProxy step : stepArray) {
          String identifier = "na";
          String version = "na";
          if (i++ % 2 == 0) {
            identifier = getRandomJavaIdentifier();
            version = getRandomJavaIdentifier();
          }
          ClassPackagingData cpd = new ClassPackagingData(identifier, version);
          step.setClassPackagingData(cpd);
        }
      }
    
      private int getNumberOfMessageArguments() {
        double rn = random.nextDouble();
        if (rn < ARGUMENT_DISTRIBUTION[0]) {
          return 0;
        }
        if (rn < ARGUMENT_DISTRIBUTION[1]) {
          return 1;
        }
        if (rn < ARGUMENT_DISTRIBUTION[2]) {
          return 2;
        }
        return 3;
      }
    
      String getRandomJavaIdentifier() {
        String w = getRandomWord();
        w = w.replaceAll("\\p{Punct}", "");
        return w;
      }
    
      private String makeRandomLoggerName() {
        int parts = RandomUtil.gaussianAsPositiveInt(random,
            AVERAGE_LOGGER_NAME_PARTS, STD_DEV_FOR_LOGGER_NAME_PARTS);
        StringBuilder sb = new StringBuilder();
        for (int i = 1; i < parts; i++) {
          sb.append(getRandomJavaIdentifier()).append('.');
        }
        sb.append(getRandomJavaIdentifier());
        return sb.toString();
      }
    
      private Level getRandomLevel() {
        double rn = random.nextDouble();
        if (rn < LEVEL_DISTRIBUTION[0]) {
          return Level.TRACE;
        }
        if (rn < LEVEL_DISTRIBUTION[1]) {
          return Level.DEBUG;
        }
    
        if (rn < LEVEL_DISTRIBUTION[2]) {
          return Level.INFO;
        }
    
        if (rn < LEVEL_DISTRIBUTION[3]) {
          return Level.WARN;
        }
    
        return Level.ERROR;
      }
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/corpus/LogStatement.java��������0000644�0001750�0001750�00000002427�12136042271�031672� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.corpus;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.spi.IThrowableProxy;
    
    /**
     * Captures the data contained within a log statement, that is the data that the
     * developer puts in the source code when he writes:
     * 
     * <p>logger.debug("hello world");
     * 
     * @author Ceki G&uuml;lc&uuml; 
     */
    public class LogStatement {
    
      final String loggerName;
      final MessageArgumentTuple mat;
      final Level level;
      final IThrowableProxy throwableProxy;
    
      public LogStatement(String loggerName, Level level, MessageArgumentTuple mat,
          IThrowableProxy tp) {
        this.loggerName = loggerName;
        this.level = level;
        this.mat = mat;
        this.throwableProxy = tp;
      }
    
    
      public String getLoggerName() {
        return loggerName;
      }
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/corpus/TextFileUtil.java��������0000644�0001750�0001750�00000003422�12136042271�031642� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.corpus;
    
    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.URL;
    import java.util.ArrayList;
    import java.util.List;
    
    public class TextFileUtil {
    
      
      public static List<String> toWords(URL url) throws IOException {
        InputStream is = url.openStream();
        InputStreamReader reader = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(reader);
        return toWords(br);
      }
    
      public static List<String> toWords(String filename) throws IOException {
        FileReader fr = new FileReader(filename);
        BufferedReader br = new BufferedReader(fr);
        return toWords(br);
      }
      
      public static List<String> toWords(BufferedReader br) throws IOException {
    
        // (\\d+)$
        //String regExp = "^(\\d+) "+ msg +  " ([\\dabcdef-]+)$";
        //Pattern p = Pattern.compile(regExp);
        String line;
        
       List<String> wordList = new ArrayList<String>();
        
        while ((line = br.readLine()) != null) {
          //line = line.replaceAll("\\p{Punct}+", " ");
          String[] words = line.split("\\s");
          for(String word: words) {
            wordList.add(word);
          }
        }  
        br.close();
      
        return wordList;
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/corpus/Corpus.java��������������0000644�0001750�0001750�00000007670�12136042271�030544� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.corpus;
    
    import java.io.FileWriter;
    import java.io.IOException;
    import java.net.URL;
    import java.util.List;
    
    import ch.qos.logback.classic.ClassicConstants;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.classic.spi.IThrowableProxy;
    import ch.qos.logback.classic.spi.LoggerContextVO;
    import ch.qos.logback.classic.spi.PubLoggingEventVO;
    import ch.qos.logback.classic.spi.ThrowableProxyUtil;
    import ch.qos.logback.core.CoreConstants;
    
    /**
     * 
     * <p>Usage:
     * 
     * <p><code>ILoggingEvent[] eventArray = Corpus.makeStandardCorpus();</code>
     * 
     * <p>if you wish to dump the events into a file, say "/corpus.log" :
     * 
     * <p> <code>Corpus.dump(eventArray, "/corpus.log");
     * 
     * <p>For the model behind the corpus, refer to {@link CorpusModel}.
     * 
     * @author Ceki G&uuml;lc&uuml;
     *
     */
    public class Corpus {
    
      static public final int STANDARD_CORPUS_SIZE = 50 * 1000;
      private static final int STANDARD_SEED = 34780;
    
      static public List<String> getStandatdCorpusWordList() throws IOException {
        ClassLoader classLoader = Corpus.class.getClassLoader();
        URL originOfSpeciesURL = classLoader
            .getResource("corpus/origin_of_species.txt");
        return TextFileUtil.toWords(originOfSpeciesURL);
      }
    
      /**
       * Make a standard corpus. The standard corpus has
       * {@link #STANDARD_CORPUS_SIZE} elements.
       * 
       * @return event array representing the standard corpus
       * @throws IOException
       */
      static public ILoggingEvent[] makeStandardCorpus() throws IOException {
        List<String> worldList = getStandatdCorpusWordList();
        CorpusModel corpusMaker = new CorpusModel(STANDARD_SEED, worldList);
        return make(corpusMaker, STANDARD_CORPUS_SIZE, true);
      }
    
      static public ILoggingEvent[] make(CorpusModel corpusModel, int n,
          boolean withCallerData) {
        LoggerContextVO lcVO = corpusModel.getRandomlyNamedLoggerContextVO();
        PubLoggingEventVO[] plevoArray = new PubLoggingEventVO[n];
        for (int i = 0; i < n; i++) {
          PubLoggingEventVO e = new PubLoggingEventVO();
          plevoArray[i] = e;
          e.loggerContextVO = lcVO;
          e.timeStamp = corpusModel.getRandomTimeStamp();
    
          LogStatement logStatement = corpusModel.getRandomLogStatementFromPool();
          e.loggerName = logStatement.loggerName;
          e.level = logStatement.level;
          e.message = logStatement.mat.message;
          e.argumentArray = corpusModel
              .getRandomArgumentArray(logStatement.mat.numberOfArguments);
    
          if (withCallerData) {
            e.callerDataArray = corpusModel.getRandomCallerData(
                ClassicConstants.DEFAULT_MAX_CALLEDER_DATA_DEPTH, e.loggerName);
          }
          e.throwableProxy = logStatement.throwableProxy;
          e.threadName = corpusModel.getRandomThreadNameFromPool();
        }
        return plevoArray;
      }
    
      /**
       * Dump the events passed as argument into the file named targetFile.
       * 
       * @param eventArray
       * @param targetFile
       * @throws IOException
       */
      public static void dump(ILoggingEvent[] eventArray, String targetFile)
          throws IOException {
        FileWriter fw = new FileWriter(targetFile);
        for (ILoggingEvent e : eventArray) {
          fw.write(e.toString());
          fw.append(CoreConstants.LINE_SEPARATOR);
          if (e.getThrowableProxy() != null) {
            IThrowableProxy tp = e.getThrowableProxy();
            fw.write(ThrowableProxyUtil.asString(tp));
          }
        }
        fw.flush();
        fw.close();
      }
    
    }
    ������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/db/�����������������������������0000755�0001750�0001750�00000000000�12203357067�025475� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000146�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/db/DBAppenderHSQLTestFixture.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/db/DBAppenderHSQLTestFixture.jav0000644�0001750�0001750�00000012505�12136042271�033036� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.db;
    
    import static org.junit.Assert.assertNotNull;
    
    import java.io.PrintWriter;
    import java.sql.Connection;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.Properties;
    
    import org.hsqldb.Server;
    import org.hsqldb.ServerConstants;
    import org.hsqldb.jdbcDriver;
    
    public class DBAppenderHSQLTestFixture  {
    
      public static final String HSQLDB_DRIVER_CLASS = "org.hsqldb.jdbcDriver";
      // String serverProps;
      String url = null;
      String user = "sa";
      String password = "";
      Server server;
    
      // boolean isNetwork = true;
      HsqlMode mode = HsqlMode.MEM;
    
      public void setUp() throws SQLException {
    
        switch (mode) {
        case NET:
          url = "jdbc:hsqldb:hsql://localhost:4808/test";
          break;
        case MEM:
          url = "jdbc:hsqldb:mem:test;sql.enforce_strict_size=true";
          server = new Server();
          server.setDatabaseName(0, "test");
          server.setDatabasePath(0, url);
          server.setLogWriter(new PrintWriter(System.out));
          server.setErrWriter(new PrintWriter(System.out));
          server.setTrace(false);
          server.setSilent(false);
          server.start();
    
          break;
        case FILE:
          url = "jdbc:hsqldb:file:test;sql.enforce_strict_size=true";
          break;
    
        }
    
        // try {
        // Class.forName(DRIVER_CLASS);
        // } catch (Exception e) {
        // e.printStackTrace();
        // System.out.println(this + ".setUp() error: " + e.getMessage());
        // }
        // Thread.yield();
        System.out.println(server.getState());
    
        int waitCount = 0;
        while (server.getState() != ServerConstants.SERVER_STATE_ONLINE
            && waitCount < 5) {
          try {
            waitCount++;
            Thread.sleep(1);
          } catch (InterruptedException e) {
          }
        }
        createTables();
      }
    
      public void tearDown() throws SQLException {
        dropTables();
    
        if (mode == HsqlMode.MEM) {
          server.stop();
          server = null;
        }
      }
    
      Connection newConnection() throws SQLException {
        jdbcDriver driver = new jdbcDriver();
        Properties props = new Properties();
        props.setProperty("user", user);
        props.setProperty("password", password);
        return driver.connect(url, props);
    
        // return DriverManager.getConnection(url, user, password);
      }
    
      private void createTables() throws SQLException {
        Connection conn = newConnection();
        assertNotNull(conn);
        StringBuffer buf = new StringBuffer();
        buf.append("CREATE TABLE LOGGING_EVENT (");
        buf.append("TIMESTMP BIGINT NOT NULL,");
        buf.append("FORMATTED_MESSAGE LONGVARCHAR NOT NULL,");
        buf.append("LOGGER_NAME VARCHAR(256) NOT NULL,");
        buf.append("LEVEL_STRING VARCHAR(256) NOT NULL,");
        buf.append("THREAD_NAME VARCHAR(256),");
        buf.append("REFERENCE_FLAG SMALLINT,");
        
        buf.append("ARG0 VARCHAR(256),");
        buf.append("ARG1 VARCHAR(256),");
        buf.append("ARG2 VARCHAR(256),");
        buf.append("ARG3 VARCHAR(256),");
        
        
        buf.append("CALLER_FILENAME VARCHAR(256), ");
        buf.append("CALLER_CLASS VARCHAR(256), ");
        buf.append("CALLER_METHOD VARCHAR(256), ");
        buf.append("CALLER_LINE CHAR(4), ");
        buf.append("EVENT_ID BIGINT NOT NULL IDENTITY);");
        query(conn, buf.toString());
    
        buf = new StringBuffer();
        buf.append("CREATE TABLE LOGGING_EVENT_PROPERTY (");
        buf.append("EVENT_ID BIGINT NOT NULL,");
        buf.append("MAPPED_KEY  VARCHAR(254) NOT NULL,");
        buf.append("MAPPED_VALUE LONGVARCHAR,");
        buf.append("PRIMARY KEY(EVENT_ID, MAPPED_KEY),");
        buf.append("FOREIGN KEY (EVENT_ID) REFERENCES LOGGING_EVENT(EVENT_ID));");
        query(conn, buf.toString());
    
        buf = new StringBuffer();
        buf.append("CREATE TABLE LOGGING_EVENT_EXCEPTION (");
        buf.append("EVENT_ID BIGINT NOT NULL,");
        buf.append("I SMALLINT NOT NULL,");
        buf.append("TRACE_LINE VARCHAR(256) NOT NULL,");
        buf.append("PRIMARY KEY(EVENT_ID, I),");
        buf.append("FOREIGN KEY (EVENT_ID) REFERENCES LOGGING_EVENT(EVENT_ID));");
        query(conn, buf.toString());
      }
    
      private  void dropTables() throws SQLException {
        Connection conn = newConnection();
        StringBuffer buf = new StringBuffer();
        buf.append("DROP TABLE LOGGING_EVENT_EXCEPTION IF EXISTS;");
        query(conn, buf.toString());
    
        buf = new StringBuffer();
        buf.append("DROP TABLE LOGGING_EVENT_PROPERTY IF EXISTS;");
        query(conn, buf.toString());
    
        buf = new StringBuffer();
        buf.append("DROP TABLE LOGGING_EVENT IF EXISTS;");
        query(conn, buf.toString());
      }
    
      private  void query(Connection conn, String expression) throws SQLException {
    
        Statement st = null;
        st = conn.createStatement();
        int i = st.executeUpdate(expression);
        if (i == -1) {
          System.out.println("db error : " + expression);
        }
        st.close();
      }
    
      public enum HsqlMode {
        MEM, FILE, NET;
      }
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/db/SQLBuilderTest.java����������0000644�0001750�0001750�00000010242�12136042271�031136� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.db;
    
    import static org.fest.assertions.Assertions.assertThat;
    
    import org.junit.Test;
    
    import ch.qos.logback.classic.db.names.DBNameResolver;
    import ch.qos.logback.classic.db.names.DefaultDBNameResolver;
    import ch.qos.logback.classic.db.names.SimpleDBNameResolver;
    
    /**
     * @author Tomasz Nurkiewicz
     * @since 2010-03-22
     */
    public class SQLBuilderTest {
    
      @Test
      public void shouldReturnDefaultSqlInsertLoggingEventQuery() throws Exception {
        //given
        DBNameResolver nameResolver = new DefaultDBNameResolver();
    
        //when
        String sql = SQLBuilder.buildInsertSQL(nameResolver);
    
        //then
        final String expected = "INSERT INTO logging_event (timestmp, formatted_message, logger_name, level_string, thread_name, reference_flag, arg0, arg1, arg2, arg3, caller_filename, caller_class, caller_method, caller_line) VALUES (?, ?, ? ,?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
        assertThat(sql).isEqualTo(expected);
      }
    
      @Test
      public void shouldReturnDefaultSqlInsertExceptionQuery() throws Exception {
        //given
        DBNameResolver nameResolver = new DefaultDBNameResolver();
    
        //when
        String sql = SQLBuilder.buildInsertExceptionSQL(nameResolver);
    
        //then
        final String expected = "INSERT INTO logging_event_exception (event_id, i, trace_line) VALUES (?, ?, ?)";
        assertThat(sql).isEqualTo(expected);
      }
    
      @Test
      public void shouldReturnDefaultSqlInsertLoggingPropertyQuery() throws Exception {
        //given
        DBNameResolver nameResolver = new DefaultDBNameResolver();
    
        //when
        String sql = SQLBuilder.buildInsertPropertiesSQL(nameResolver);
    
        //then
        final String expected = "INSERT INTO logging_event_property (event_id, mapped_key, mapped_value) VALUES (?, ?, ?)";
        assertThat(sql).isEqualTo(expected);
      }
    
    
      private DBNameResolver createSimpleDBNameResolver() {
        final SimpleDBNameResolver nameResolver = new SimpleDBNameResolver();
        nameResolver.setTableNamePrefix("tp_");
        nameResolver.setTableNameSuffix("_ts");
        nameResolver.setColumnNamePrefix("cp_");
        nameResolver.setColumnNameSuffix("_cs");
        return nameResolver;
      }
    
      @Test
      public void shouldReturnSimpleSqlInsertLoggingEventQuery() throws Exception {
        //given
        DBNameResolver nameResolver = createSimpleDBNameResolver();
    
        //when
        String sql = SQLBuilder.buildInsertSQL(nameResolver);
    
        //then
        final String expected = "INSERT INTO tp_logging_event_ts (cp_timestmp_cs, cp_formatted_message_cs, cp_logger_name_cs, cp_level_string_cs, cp_thread_name_cs, cp_reference_flag_cs, cp_arg0_cs, cp_arg1_cs, cp_arg2_cs, cp_arg3_cs, cp_caller_filename_cs, cp_caller_class_cs, cp_caller_method_cs, cp_caller_line_cs) VALUES (?, ?, ? ,?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
        assertThat(sql).isEqualTo(expected);
      }
    
      @Test
      public void shouldReturnSimpleSqlInsertExceptionQuery() throws Exception {
        //given
        DBNameResolver nameResolver = createSimpleDBNameResolver();
    
        //when
        String sql = SQLBuilder.buildInsertExceptionSQL(nameResolver);
    
        //then
        final String expected = "INSERT INTO tp_logging_event_exception_ts (cp_event_id_cs, cp_i_cs, cp_trace_line_cs) VALUES (?, ?, ?)";
        assertThat(sql).isEqualTo(expected);
      }
    
      @Test
      public void shouldReturnSimpleSqlInsertLoggingPropertyQuery() throws Exception {
        //given
        DBNameResolver nameResolver = createSimpleDBNameResolver();
    
        //when
        String sql = SQLBuilder.buildInsertPropertiesSQL(nameResolver);
    
        //then
        final String expected = "INSERT INTO tp_logging_event_property_ts (cp_event_id_cs, cp_mapped_key_cs, cp_mapped_value_cs) VALUES (?, ?, ?)";
        assertThat(sql).isEqualTo(expected);
      }
    
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/db/DBAppenderHSQLTest.java������0000644�0001750�0001750�00000015502�12136042271�031630� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.db;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertTrue;
    import static org.junit.Assert.fail;
    
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.Map;
    
    import org.apache.log4j.MDC;
    import org.junit.*;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.classic.spi.LoggingEvent;
    import ch.qos.logback.core.db.DriverManagerConnectionSource;
    import ch.qos.logback.core.testUtil.RandomUtil;
    import ch.qos.logback.core.util.StatusPrinter;
    
    public class DBAppenderHSQLTest  {
    
      LoggerContext lc;
      Logger logger;
      DBAppender appender;
      DriverManagerConnectionSource connectionSource;
    
      static DBAppenderHSQLTestFixture DB_APPENDER_HSQL_TEST_FIXTURE;
      int diff = RandomUtil.getPositiveInt();
      int existingRowCount;
      Statement stmt;
    
      @BeforeClass
      public static void beforeClass() throws SQLException {
        DB_APPENDER_HSQL_TEST_FIXTURE = new DBAppenderHSQLTestFixture();
        DB_APPENDER_HSQL_TEST_FIXTURE.setUp();
      }
    
      @AfterClass
      public static void afterClass() throws SQLException {
        DB_APPENDER_HSQL_TEST_FIXTURE.tearDown();
      }
    
      @Before
      public void setUp() throws SQLException {
        lc = new LoggerContext();
        lc.setName("default");
        logger = lc.getLogger("root");
        appender = new DBAppender();
        appender.setName("DB");
        appender.setContext(lc);
        connectionSource = new DriverManagerConnectionSource();
        connectionSource.setContext(lc);
        connectionSource.setDriverClass(DBAppenderHSQLTestFixture.HSQLDB_DRIVER_CLASS);
        connectionSource.setUrl(DB_APPENDER_HSQL_TEST_FIXTURE.url);
        connectionSource.setUser(DB_APPENDER_HSQL_TEST_FIXTURE.user);
        connectionSource.setPassword(DB_APPENDER_HSQL_TEST_FIXTURE.password);
        connectionSource.start();
        appender.setConnectionSource(connectionSource);
        appender.start();
    
        stmt = connectionSource.getConnection().createStatement();
        existingRowCount = existingRowCount(stmt);
    
      }
      
    
    
      @After
      public void tearDown() throws SQLException {
        logger = null;
        lc = null;
        appender = null;
        connectionSource = null;
        stmt.close();
      }
    
      int existingRowCount(Statement stmt) throws SQLException {
        ResultSet rs = stmt.executeQuery("SELECT count(*) FROM logging_event");
        int result = -1;
        if (rs.next()) {
          result = rs.getInt(1);
        }
        rs.close();
        return result;
      }
    
      @Test
      public void testAppendLoggingEvent() throws SQLException {
    
    
        ILoggingEvent event = createLoggingEvent();
        appender.append(event);
        StatusPrinter.printInCaseOfErrorsOrWarnings(lc);
        
        ResultSet rs = null;
        rs = stmt.executeQuery("SELECT * FROM logging_event where EVENT_ID = "+ existingRowCount);
        if (rs.next()) {
          assertEquals(event.getTimeStamp(), rs.getLong(DBAppender.TIMESTMP_INDEX));
          assertEquals(event.getFormattedMessage(), rs.getString(DBAppender.FORMATTED_MESSAGE_INDEX));
          assertEquals(event.getLoggerName(), rs.getString(DBAppender.LOGGER_NAME_INDEX));
          assertEquals(event.getLevel().toString(), rs.getString(DBAppender.LEVEL_STRING_INDEX));
          assertEquals(event.getThreadName(), rs.getString(DBAppender.THREAD_NAME_INDEX));
          assertEquals(DBHelper.computeReferenceMask(event), rs.getShort(DBAppender.REFERENCE_FLAG_INDEX));
          assertEquals(String.valueOf(diff), rs.getString(DBAppender.ARG0_INDEX));
          StackTraceElement callerData = event.getCallerData()[0];
          assertEquals(callerData.getFileName(), rs.getString(DBAppender.CALLER_FILENAME_INDEX));
          assertEquals(callerData.getClassName(), rs.getString(DBAppender.CALLER_CLASS_INDEX));
          assertEquals(callerData.getMethodName(), rs.getString(DBAppender.CALLER_METHOD_INDEX));
        } else {
          fail("No row was inserted in the database");
        }
        rs.close();
      }
    
    
      
      @Test
      public void testAppendThrowable() throws SQLException {
        ILoggingEvent event = createLoggingEvent();
        appender.append(event);
        
        ResultSet rs = null;
        rs = stmt.executeQuery("SELECT * FROM LOGGING_EVENT_EXCEPTION where EVENT_ID = "+ existingRowCount);
        
        rs.next();
        String expected = "java.lang.Exception: test Ex";
        String firstLine = rs.getString(3);
        assertTrue("["+firstLine+"] does not match ["+expected+"]", firstLine.contains(expected));
        
        int i = 0;
        while (rs.next()) {
          expected = event.getThrowableProxy().getStackTraceElementProxyArray()[i].toString();
          String st = rs.getString(3);
          assertTrue("["+st+"] does not match ["+expected+"]", st.contains(expected));
          i++;
        }
        assertTrue(i != 0);
        rs.close();
      }
      
      @Test
      public void testContextInfo() throws SQLException {
        lc.putProperty("testKey1", "testValue1");
        MDC.put("k"+diff, "v"+diff);
        ILoggingEvent event = createLoggingEvent();
        
        appender.append(event);
        
        Statement stmt = connectionSource.getConnection().createStatement();
        ResultSet rs = null;
        rs = stmt.executeQuery("SELECT * FROM LOGGING_EVENT_PROPERTY  WHERE EVENT_ID = "+ existingRowCount);
        Map<String, String> map = appender.mergePropertyMaps(event);
        System.out.println("ma.size="+map.size());
        int i = 0;
        while (rs.next()) {
          String key = rs.getString(2);
          assertEquals(map.get(key), rs.getString(3));
          i++;
        }
        assertTrue(map.size() != 0);
        assertEquals(map.size(), i);
        rs.close();
      }
      
      @Test
      public void testAppendMultipleEvents() throws SQLException {
        int numEvents = 3;
        for (int i = 0; i < numEvents; i++) {
          ILoggingEvent event = createLoggingEvent();
          appender.append(event);
        }
        
        Statement stmt = connectionSource.getConnection().createStatement();
        ResultSet rs = null;
        rs = stmt.executeQuery("SELECT * FROM logging_event WHERE EVENT_ID >="+ existingRowCount);
        int count = 0;
        while (rs.next()) {
          count++;
        }
        assertEquals(numEvents, count);
        rs.close();
      }
    
    
      private ILoggingEvent createLoggingEvent() {
        return new LoggingEvent(this.getClass().getName(), logger,
            Level.DEBUG, "test message", new Exception("test Ex"), new Integer[]{diff});
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/db/PackageTest.java�������������0000644�0001750�0001750�00000001554�12136042271�030531� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.db;
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    import org.junit.runners.Suite.SuiteClasses;
    
    @RunWith(Suite.class)
    @SuiteClasses( { DBAppenderHSQLTest.class, DBAppenderH2Test.class,
        DBAppenderIntegrationTest.class, SQLBuilderTest.class,
        ch.qos.logback.classic.db.names.PackageTest.class})
    public class PackageTest {
    }����������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000146�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/db/DBAppenderIntegrationTest.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/db/DBAppenderIntegrationTest.jav0000644�0001750�0001750�00000017327�12136042271�033212� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.db;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.core.db.DriverManagerConnectionSource;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.status.StatusChecker;
    import ch.qos.logback.core.testUtil.RandomUtil;
    import ch.qos.logback.core.util.EnvUtil;
    import ch.qos.logback.core.util.StatusPrinter;
    import org.junit.*;
    import org.slf4j.Logger;
    import org.slf4j.MDC;
    
    import java.net.InetAddress;
    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.HashMap;
    import java.util.Map;
    
    import static org.junit.Assert.*;
    
    public class DBAppenderIntegrationTest {
    
      static String LOCAL_HOST_NAME;
      static String[] CONFORMING_HOST_LIST = new String[] { "Orion" };
      static String[] POSTGRES_CONFORMING_HOST_LIST = new String[] { "haro" };
      static String[] MYSQL_CONFORMING_HOST_LIST = new String[] { "xharo" };
      static String[] ORACLE_CONFORMING_HOST_LIST = new String[] { "xharo" };
    
      int diff = RandomUtil.getPositiveInt();
      LoggerContext lc = new LoggerContext();
    
      @BeforeClass
      public static void setUpBeforeClass() throws Exception {
        InetAddress localhostIA = InetAddress.getLocalHost();
        LOCAL_HOST_NAME = localhostIA.getHostName();
      }
    
      @AfterClass
      public static void tearDownAfterClass() throws Exception {
      }
    
      @Before
      public void setUp() throws Exception {
        lc.setName("lc" + diff);
      }
    
      @After
      public void tearDown() throws Exception {
        // lc will never be used again
        lc.stop();
      }
    
      DriverManagerConnectionSource getConnectionSource() {
        ch.qos.logback.classic.Logger root = (ch.qos.logback.classic.Logger) lc
            .getLogger(Logger.ROOT_LOGGER_NAME);
    
        DBAppender dbAppender = (DBAppender) root.getAppender("DB");
        assertNotNull(dbAppender);
        return (DriverManagerConnectionSource) dbAppender.getConnectionSource();
    
      }
    
      public void doTest(String configFile) throws JoranException, SQLException {
        JoranConfigurator configurator = new JoranConfigurator();
        configurator.setContext(lc);
        configurator.doConfigure(configFile);
    
        Logger logger = lc.getLogger(DBAppenderIntegrationTest.class);
    
        // the key userid is used in SiftingAppender test
        // suffix with diff to avoid collision
        MDC.put("userid"+diff, "user" + diff);
        int runLength = 5;
        for (int i = 1; i <= runLength; i++) {
          logger.debug("This is a debug message. Message number: " + (diff + i));
        }
    
        Exception e = new Exception("Just testing", getCause());
        logger.error("At last an error.", e);
    
        StatusPrinter.printInCaseOfErrorsOrWarnings(lc);
        
        long lastEventId = getLastEventId();
        verify(lastEventId);
    
        // check that there were no errors
        StatusChecker checker = new StatusChecker(lc);
        checker.assertIsErrorFree();
      }
    
      long getLastEventId() throws SQLException {
        DriverManagerConnectionSource cs = getConnectionSource();
    
        Connection con = cs.getConnection();
        Statement statement = con.createStatement();
        statement.setMaxRows(1);
        ResultSet rs = statement
            .executeQuery("select event_id from logging_event order by event_id desc");
        rs.next();
        long eventId = rs.getLong(1);
        rs.close();
        statement.close();
        return eventId;
      }
    
      void verify(long lastEventId) throws SQLException {
        verifyDebugMsg(lastEventId);
        verifyException(lastEventId);
        verifyProperty(lastEventId);
    
      }
    
      void verifyDebugMsg(long lastEventId) throws SQLException {
        DriverManagerConnectionSource cs = getConnectionSource();
        Connection con = cs.getConnection();
        Statement statement = con.createStatement();
        ResultSet rs = statement
            .executeQuery("select formatted_message from logging_event where event_id='"
                + (lastEventId - 1) + "'");
        rs.next();
        String msg = rs.getString(1);
        assertEquals("This is a debug message. Message number: " + (diff + 5), msg);
      }
    
      @SuppressWarnings("unchecked")
      void verifyProperty(long lastEventId) throws SQLException {
        DriverManagerConnectionSource cs = getConnectionSource();
        Connection con = cs.getConnection();
        Statement statement = con.createStatement();
        ResultSet rs = statement
            .executeQuery("select mapped_key, mapped_value from logging_event_property where event_id='"
                + (lastEventId - 1) + "'");
      
        Map<String, String> witness = lc.getCopyOfPropertyMap();
        witness.putAll(MDC.getCopyOfContextMap());
        
        Map<String, String> map = new HashMap<String, String>();
        while (rs.next()) {
          String key = rs.getString(1);
          String val = rs.getString(2);
          map.put(key, val);
        }
        
        assertEquals(witness, map);
      }
    
      void verifyException(long lastEventId) throws SQLException {
        DriverManagerConnectionSource cs = getConnectionSource();
        Connection con = cs.getConnection();
        Statement statement = con.createStatement();
        ResultSet rs = statement
            .executeQuery("select trace_line from logging_event_exception where event_id='"
                + (lastEventId) + "' AND I='0'");
        rs.next();
        String traceLine = rs.getString(1);
        assertEquals("java.lang.Exception: Just testing", traceLine);
      }
    
      Throwable getCause() {
        return new IllegalStateException("test cause");
      }
    
      static boolean isConformingHostAndJDK16OrHigher(String[] conformingHostList) {
        if (!EnvUtil.isJDK6OrHigher()) {
          return false;
        }
        for (String conformingHost : conformingHostList) {
          if (conformingHost.equalsIgnoreCase(LOCAL_HOST_NAME)) {
            return true;
          }
        }
        return false;
      }
    
      static boolean isConformingHostAndJDK16OrHigher() {
        return isConformingHostAndJDK16OrHigher(CONFORMING_HOST_LIST);
      }
    
      @Test
      public void sqlserver() throws Exception {
        // perform test only on conforming hosts
        if (!isConformingHostAndJDK16OrHigher()) {
          return;
        }
        doTest("src/test/input/integration/db/sqlserver-with-driver.xml");
      }
    
      @Test
      public void oracle10g() throws Exception {
        // perform test only on conforming hosts
        if (!isConformingHostAndJDK16OrHigher(ORACLE_CONFORMING_HOST_LIST)) {
          return;
        }
        doTest("src/test/input/integration/db/oracle10g-with-driver.xml");
      }
    
      @Test
      @Ignore
      public void oracle11g() throws Exception {
        // perform test only on conforming hosts
        if (!isConformingHostAndJDK16OrHigher()) {
          return;
        }
        doTest("src/test/input/integration/db/oracle11g-with-driver.xml");
      }
    
      @Test
      public void mysql() throws Exception {
        // perform test only on conforming hosts
        if (!isConformingHostAndJDK16OrHigher(MYSQL_CONFORMING_HOST_LIST)) {
          return;
        }
        doTest("src/test/input/integration/db/mysql-with-driver.xml");
      }
    
      @Test
      public void postgres() throws Exception {
        // perform test only on conforming hosts
        if (!isConformingHostAndJDK16OrHigher(POSTGRES_CONFORMING_HOST_LIST)) {
          return;
        }
        System.out.println("running postgres() test");
        doTest("src/test/input/integration/db/postgresql-with-driver.xml");
      }
    
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/db/DBAppenderH2Test.java��������0000644�0001750�0001750�00000017222�12136042271�031333� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.db;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertTrue;
    import static org.junit.Assert.fail;
    
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.Date;
    import java.util.Map;
    
    import ch.qos.logback.classic.spi.CallerData;
    import ch.qos.logback.core.status.StatusChecker;
    import org.apache.log4j.MDC;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.classic.spi.LoggingEvent;
    import ch.qos.logback.core.db.DriverManagerConnectionSource;
    import ch.qos.logback.core.testUtil.RandomUtil;
    import ch.qos.logback.core.util.StatusPrinter;
    
    public class DBAppenderH2Test {
    
      LoggerContext loggerContext = new LoggerContext();;
      Logger logger;
      DBAppender appender;
      DriverManagerConnectionSource connectionSource;
      DBAppenderH2TestFixture dbAppenderH2TestFixture;
      int diff = RandomUtil.getPositiveInt();
      StatusChecker checker = new StatusChecker(loggerContext);
    
      @Before
      public void setUp() throws SQLException {
        dbAppenderH2TestFixture = new DBAppenderH2TestFixture();
        dbAppenderH2TestFixture.setUp();
        loggerContext.setName("default");
        logger = loggerContext.getLogger("root");
        appender = new DBAppender();
        appender.setName("DB");
        appender.setContext(loggerContext);
        connectionSource = new DriverManagerConnectionSource();
        connectionSource.setContext(loggerContext);
        connectionSource.setDriverClass(DBAppenderH2TestFixture.H2_DRIVER_CLASS);
        connectionSource.setUrl(dbAppenderH2TestFixture.url);
        System.out.println("cs.url=" + dbAppenderH2TestFixture.url);
        connectionSource.setUser(dbAppenderH2TestFixture.user);
        connectionSource.setPassword(dbAppenderH2TestFixture.password);
    
    
        connectionSource.start();
        appender.setConnectionSource(connectionSource);
        appender.start();
      }
    
      @After
      public void tearDown() throws SQLException {
        logger = null;
        loggerContext = null;
        appender = null;
        connectionSource = null;
        dbAppenderH2TestFixture.tearDown();
      }
    
      @Test
      public void testAppendLoggingEvent() throws SQLException {
        ILoggingEvent event = createLoggingEvent();
    
        appender.append(event);
    
        StatusPrinter.print(loggerContext);
    
        Statement stmt = connectionSource.getConnection().createStatement();
        ResultSet rs = null;
        rs = stmt.executeQuery("SELECT * FROM logging_event");
        if (rs.next()) {
          assertEquals(event.getTimeStamp(), rs.getLong(DBAppender.TIMESTMP_INDEX));
          assertEquals(event.getFormattedMessage(), rs.getString(DBAppender.FORMATTED_MESSAGE_INDEX));
          assertEquals(event.getLoggerName(), rs.getString(DBAppender.LOGGER_NAME_INDEX));
          assertEquals(event.getLevel().toString(), rs.getString(DBAppender.LEVEL_STRING_INDEX));
          assertEquals(event.getThreadName(), rs.getString(DBAppender.THREAD_NAME_INDEX));
          assertEquals(DBHelper.computeReferenceMask(event), rs.getShort(DBAppender.REFERENCE_FLAG_INDEX));
          assertEquals(String.valueOf(diff), rs.getString(DBAppender.ARG0_INDEX));
          StackTraceElement callerData = event.getCallerData()[0];
          assertEquals(callerData.getFileName(), rs.getString(DBAppender.CALLER_FILENAME_INDEX));
          assertEquals(callerData.getClassName(), rs.getString(DBAppender.CALLER_CLASS_INDEX));
          assertEquals(callerData.getMethodName(), rs.getString(DBAppender.CALLER_METHOD_INDEX));
        } else {
          fail("No row was inserted in the database");
        }
    
        rs.close();
        stmt.close();
      }
    
      @Test
      public void testAppendThrowable() throws SQLException {
        ILoggingEvent event = createLoggingEvent();
        appender.append(event);
        Statement stmt = connectionSource.getConnection().createStatement();
        ResultSet rs = null;
        rs = stmt.executeQuery("SELECT * FROM LOGGING_EVENT_EXCEPTION WHERE EVENT_ID=1");
        rs.next();
        String expected = "java.lang.Exception: test Ex";
        String firstLine = rs.getString(3);
        assertTrue("[" + firstLine + "] does not match [" + expected + "]", firstLine.contains(expected));
    
        int i = 0;
        while (rs.next()) {
          expected = event.getThrowableProxy().getStackTraceElementProxyArray()[i].toString();
          String st = rs.getString(3);
          assertTrue("[" + st + "] does not match [" + expected + "]", st.contains(expected));
          i++;
        }
        assertTrue(i != 0);
    
        rs.close();
        stmt.close();
      }
    
      @Test
      public void withNullArgument() throws SQLException {
        ILoggingEvent event = createLoggingEvent("Processing code {}; code type is {}; request date {}; record from date {}", new Object[] { 1, 2, new Date(), null });
        appender.append(event);
    
    
        Statement stmt = connectionSource.getConnection().createStatement();
        ResultSet rs = null;
        rs = stmt.executeQuery("SELECT * FROM logging_event");
        if (rs.next()) {
          assertEquals(event.getTimeStamp(), rs.getLong(DBAppender.TIMESTMP_INDEX));
          assertEquals(event.getFormattedMessage(), rs.getString(DBAppender.FORMATTED_MESSAGE_INDEX));
        }
      }
    
      @Test
      public void testContextInfo() throws SQLException {
        loggerContext.putProperty("testKey1", "testValue1");
        MDC.put("k" + diff, "v" + diff);
        ILoggingEvent event = createLoggingEvent();
    
        appender.append(event);
    
        Statement stmt = connectionSource.getConnection().createStatement();
        ResultSet rs = null;
        rs = stmt.executeQuery("SELECT * FROM LOGGING_EVENT_PROPERTY WHERE EVENT_ID=1");
        Map<String, String> map = appender.mergePropertyMaps(event);
        int i = 0;
        while (rs.next()) {
          String key = rs.getString(2);
          assertEquals(map.get(key), rs.getString(3));
          i++;
        }
        assertTrue(map.size() != 0);
        assertEquals(map.size(), i);
        rs.close();
        stmt.close();
      }
    
    
      @Test
      public void testAppendMultipleEvents() throws SQLException {
        for (int i = 0; i < 10; i++) {
          ILoggingEvent event = createLoggingEvent();
          appender.append(event);
        }
    
        Statement stmt = connectionSource.getConnection().createStatement();
        ResultSet rs = null;
        rs = stmt.executeQuery("SELECT * FROM logging_event");
        int count = 0;
        while (rs.next()) {
          count++;
        }
        assertEquals(10, count);
    
        rs.close();
        stmt.close();
      }
    
      // http://jira.qos.ch/browse/LOGBACK-805
      @Test
      public void emptyCallerDataShouldBeHandledGracefully() {
        LoggingEvent event = createLoggingEvent();
        event.setCallerData(new StackTraceElement[0]);
        appender.append(event);
    
        event.setCallerData(new StackTraceElement[] {null});
        appender.append(event);
    
        checker.assertIsErrorFree();
      }
    
    
      private LoggingEvent createLoggingEvent(String msg, Object[] args) {
        return new LoggingEvent(this.getClass().getName(), logger,
                Level.DEBUG, msg, new Exception("test Ex"), args);
      }
    
    
      private LoggingEvent createLoggingEvent() {
        return createLoggingEvent("test message", new Integer[]{diff});
      }
    
    
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/db/names/�����������������������0000755�0001750�0001750�00000000000�12203357067�026600� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000153�00000000000�011564� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/db/names/SimpleDBNameResolverTest.java����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/db/names/SimpleDBNameResolverTes0000644�0001750�0001750�00000010433�12136042271�033153� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.db.names;
    
    import org.junit.Before;
    import org.junit.Test;
    
    import static org.fest.assertions.Assertions.assertThat;
    
    /**
     * @author Tomasz Nurkiewicz
     * @since 2010-03-22
     */
    public class SimpleDBNameResolverTest {
    
      private SimpleDBNameResolver nameResolver;
    
      @Before
      public void setUp() throws Exception {
        nameResolver = new SimpleDBNameResolver();
        /*nameResolver.setTableNameSuffix("_ts");
        nameResolver.setColumnNamePrefix("cp_");
        nameResolver.setColumnNameSuffix("_cs");*/
      }
    
      @Test
      public void shouldReturnTableNameWithPrefix() throws Exception {
        //given
    
        //when
        nameResolver.setTableNamePrefix("tp_");
    
        //then
        assertThat(nameResolver.getTableName(TableName.LOGGING_EVENT)).isEqualTo("tp_logging_event");
        assertThat(nameResolver.getColumnName(ColumnName.THREAD_NAME)).isEqualTo("thread_name");
      }
    
      @Test
      public void shouldReturnTableNameWithSuffix() throws Exception {
        //given
    
        //when
        nameResolver.setTableNameSuffix("_ts");
    
        //then
        assertThat(nameResolver.getTableName(TableName.LOGGING_EVENT)).isEqualTo("logging_event_ts");
        assertThat(nameResolver.getColumnName(ColumnName.THREAD_NAME)).isEqualTo("thread_name");
      }
    
      @Test
      public void shouldReturnTableNameWithBothPrefixAndSuffix() throws Exception {
        //given
    
        //when
        nameResolver.setTableNamePrefix("tp_");
        nameResolver.setTableNameSuffix("_ts");
    
        //then
        assertThat(nameResolver.getTableName(TableName.LOGGING_EVENT)).isEqualTo("tp_logging_event_ts");
        assertThat(nameResolver.getColumnName(ColumnName.THREAD_NAME)).isEqualTo("thread_name");
      }
    
      @Test
      public void shouldReturnColumnNameWithPrefix() throws Exception {
        //given
    
        //when
        nameResolver.setColumnNamePrefix("cp_");
    
        //then
        assertThat(nameResolver.getTableName(TableName.LOGGING_EVENT)).isEqualTo("logging_event");
        assertThat(nameResolver.getColumnName(ColumnName.THREAD_NAME)).isEqualTo("cp_thread_name");
      }
    
      @Test
      public void shouldReturnColumnNameWithSuffix() throws Exception {
        //given
    
        //when
        nameResolver.setColumnNameSuffix("_cs");
    
        //then
        assertThat(nameResolver.getTableName(TableName.LOGGING_EVENT)).isEqualTo("logging_event");
        assertThat(nameResolver.getColumnName(ColumnName.THREAD_NAME)).isEqualTo("thread_name_cs");
      }
    
      @Test
      public void shouldReturnColumnNameWithBothPrefixAndSuffix() throws Exception {
        //given
    
        //when
        nameResolver.setColumnNamePrefix("cp_");
        nameResolver.setColumnNameSuffix("_cs");
    
        //then
        assertThat(nameResolver.getTableName(TableName.LOGGING_EVENT)).isEqualTo("logging_event");
        assertThat(nameResolver.getColumnName(ColumnName.THREAD_NAME)).isEqualTo("cp_thread_name_cs");
      }
    
      @Test
      public void shouldReturnTableAndColumnNamesWithBothPrefixAndSuffix() throws Exception {
        //given
    
        //when
        nameResolver.setTableNamePrefix("tp_");
        nameResolver.setTableNameSuffix("_ts");
        nameResolver.setColumnNamePrefix("cp_");
        nameResolver.setColumnNameSuffix("_cs");
    
        //then
        assertThat(nameResolver.getTableName(TableName.LOGGING_EVENT)).isEqualTo("tp_logging_event_ts");
        assertThat(nameResolver.getColumnName(ColumnName.THREAD_NAME)).isEqualTo("cp_thread_name_cs");
      }
    
      @Test
      public void shouldHandleNullsAsEmptyStrings() throws Exception {
        //given
    
        //when
        nameResolver.setTableNamePrefix(null);
        nameResolver.setTableNameSuffix(null);
        nameResolver.setColumnNamePrefix(null);
        nameResolver.setColumnNameSuffix(null);
    
        //then
        assertThat(nameResolver.getTableName(TableName.LOGGING_EVENT)).isEqualTo("logging_event");
        assertThat(nameResolver.getColumnName(ColumnName.THREAD_NAME)).isEqualTo("thread_name");
      }
    
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/db/names/PackageTest.java�������0000644�0001750�0001750�00000001423�12136042271�031627� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.db.names;
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    import org.junit.runners.Suite.SuiteClasses;
    
    @RunWith(Suite.class)
    @SuiteClasses( { DefaultDBNameResolverTest.class,
        SimpleDBNameResolverTest.class })
    public class PackageTest {
    }���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000154�00000000000�011565� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/db/names/DefaultDBNameResolverTest.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/db/names/DefaultDBNameResolverTe0000644�0001750�0001750�00000003505�12136042271�033125� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.db.names;
    
    import org.junit.Before;
    import org.junit.Test;
    
    import static org.fest.assertions.Assertions.assertThat;
    
    /**
     * @author Tomasz Nurkiewicz
     * @since 2010-03-18
     */
    public class DefaultDBNameResolverTest {
    
      private DefaultDBNameResolver resolver;
    
      @Before
      public void setUp() throws Exception {
        resolver = new DefaultDBNameResolver();
      }
    
      @Test
      public void testGetLoggingEventColumnName() throws Exception {
        //when
        String columnName = resolver.getColumnName(ColumnName.LOGGER_NAME);
    
        //then
        assertThat(columnName).isEqualTo("logger_name");
      }
    
      @Test
      public void testGetLoggingEventPropertyColumnName() throws Exception {
        //when
        String columnName = resolver.getColumnName(ColumnName.MAPPED_KEY);
    
        //then
        assertThat(columnName).isEqualTo("mapped_key");
      }
    
      @Test
      public void testGetLoggingEventExceptionColumnName() throws Exception {
        //when
        String columnName = resolver.getColumnName(ColumnName.TRACE_LINE);
    
        //then
        assertThat(columnName).isEqualTo("trace_line");
      }
    
      @Test
      public void testGetTableName() throws Exception {
        //when
        String tableName = resolver.getTableName(TableName.LOGGING_EVENT_EXCEPTION);
    
        //then
        assertThat(tableName).isEqualTo("logging_event_exception");
      }
    
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/db/DBAppenderH2TestFixture.java�0000644�0001750�0001750�00000010627�12136042271�032704� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.db;
    
    import static org.junit.Assert.assertNotNull;
    
    import java.sql.Connection;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.Properties;
    
    import org.h2.Driver;
    
    import ch.qos.logback.core.testUtil.RandomUtil;
    
    public class DBAppenderH2TestFixture  {
    
      public enum H2Mode {
        MEM, FILE, NET;
      }
      
      public static final String H2_DRIVER_CLASS = "org.h2.Driver";
      String url = null;
      String user = "sa";
      String password = "";
    
      // boolean isNetwork = true;
      H2Mode mode = H2Mode.MEM;
    
      int diff = RandomUtil.getPositiveInt();
      
      Connection connection;
      
      public void setUp() throws SQLException {
    
        switch (mode) {
        case NET:
          url = "jdbc:h2:tcp://localhost:4808/test";
          break;
        case MEM:
          url = "jdbc:h2:mem:test"+diff;
          break;
        case FILE:
          url = "jdbc:hsqldb:file:test;sql.enforce_strict_size=true";
          break;
    
        }
        connection = newConnection();
        createTables();
      }
    
      public void tearDown() throws SQLException {
        dropTables();
        connection.close();
      }
    
      Connection newConnection() throws SQLException {
        System.out.println("url="+url);
        org.h2.Driver driver = Driver.load();
        Properties props = new Properties();
        props.setProperty("user", user);
        props.setProperty("password", password);
        return driver.connect(url, props);
      }
    
      private void createTables() throws SQLException {
        assertNotNull(connection);
        StringBuffer buf = new StringBuffer();
        buf.append("CREATE TABLE LOGGING_EVENT (");
        buf.append("TIMESTMP BIGINT NOT NULL,");
        buf.append("FORMATTED_MESSAGE LONGVARCHAR NOT NULL,");
        buf.append("LOGGER_NAME VARCHAR(256) NOT NULL,");
        buf.append("LEVEL_STRING VARCHAR(256) NOT NULL,");
        buf.append("THREAD_NAME VARCHAR(256),");
        buf.append("REFERENCE_FLAG SMALLINT,");
        buf.append("ARG0 VARCHAR(256),");
        buf.append("ARG1 VARCHAR(256),");
        buf.append("ARG2 VARCHAR(256),");
        buf.append("ARG3 VARCHAR(256),");
        buf.append("CALLER_FILENAME VARCHAR(256), ");
        buf.append("CALLER_CLASS VARCHAR(256), ");
        buf.append("CALLER_METHOD VARCHAR(256), ");
        buf.append("CALLER_LINE CHAR(4), ");
        buf.append("EVENT_ID IDENTITY NOT NULL);");
        executeQuery(connection, buf.toString());
    
        buf = new StringBuffer();
        buf.append("CREATE TABLE LOGGING_EVENT_PROPERTY (");
        buf.append("EVENT_ID BIGINT NOT NULL,");
        buf.append("MAPPED_KEY  VARCHAR(254) NOT NULL,");
        buf.append("MAPPED_VALUE LONGVARCHAR,");
        buf.append("PRIMARY KEY(EVENT_ID, MAPPED_KEY),");
        buf.append("FOREIGN KEY (EVENT_ID) REFERENCES LOGGING_EVENT(EVENT_ID));");
        executeQuery(connection, buf.toString());
    
        buf = new StringBuffer();
        buf.append("CREATE TABLE LOGGING_EVENT_EXCEPTION (");
        buf.append("EVENT_ID BIGINT NOT NULL,");
        buf.append("I SMALLINT NOT NULL,");
        buf.append("TRACE_LINE VARCHAR(256) NOT NULL,");
        buf.append("PRIMARY KEY(EVENT_ID, I),");
        buf.append("FOREIGN KEY (EVENT_ID) REFERENCES LOGGING_EVENT(EVENT_ID));");
        executeQuery(connection, buf.toString());
      }
    
      private  void dropTables() throws SQLException {
        StringBuffer buf = new StringBuffer();
        buf.append("DROP TABLE LOGGING_EVENT_EXCEPTION IF EXISTS;");
        executeQuery(connection, buf.toString());
    
        buf = new StringBuffer();
        buf.append("DROP TABLE LOGGING_EVENT_PROPERTY IF EXISTS;");
        executeQuery(connection, buf.toString());
    
        buf = new StringBuffer();
        buf.append("DROP TABLE LOGGING_EVENT IF EXISTS;");
        executeQuery(connection, buf.toString());
      }
    
      private  void executeQuery(Connection conn, String expression) throws SQLException {
        Statement st = null;
        st = conn.createStatement();
        int i = st.executeUpdate(expression);
        if (i == -1) {
          throw new IllegalStateException("db error : " + expression);
        }
        st.close();
      }
    
    
    }
    ���������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/spi/����������������������������0000755�0001750�0001750�00000000000�12203357067�025703� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/spi/ThrowableProxyTest.java�����0000644�0001750�0001750�00000011357�12136042271�032377� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.spi;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assume.assumeNotNull;
    
    import java.io.PrintWriter;
    import java.io.StringWriter;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    public class ThrowableProxyTest {
    
      StringWriter sw = new StringWriter();
      PrintWriter pw = new PrintWriter(sw);
    
      private static final Method ADD_SUPPRESSED_METHOD;
    
      static {
        Method method = null;
        try {
          method = Throwable.class.getMethod("addSuppressed", Throwable.class);
        } catch (NoSuchMethodException e) {
          // ignore, will get thrown in Java < 7
        }
        ADD_SUPPRESSED_METHOD = method;
      }
    
      private static void addSuppressed(Throwable outer, Throwable suppressed) throws InvocationTargetException, IllegalAccessException
      {
        if(ADD_SUPPRESSED_METHOD != null) {
          ADD_SUPPRESSED_METHOD.invoke(outer, suppressed);
        }
      }
    
      @Before
      public void setUp() throws Exception {
      }
    
      @After
      public void tearDown() throws Exception {
      }
    
      public void verify(Throwable t) {
        t.printStackTrace(pw);
    
        IThrowableProxy tp = new ThrowableProxy(t);
    
        String result = ThrowableProxyUtil.asString(tp);
        result = result.replace("common frames omitted", "more");
    
        String expected = sw.toString();
    
        System.out.println("========expected");
        System.out.println(expected);
    
        System.out.println("========result");
        System.out.println(result);
    
        assertEquals(expected, result);
      }
    
      @Test
      public void smoke() {
        Exception e = new Exception("smoke");
        verify(e);
      }
    
      @Test
      public void nested() {
        Exception w = null;
        try {
          someMethod();
        } catch (Exception e) {
          w = new Exception("wrapping", e);
        }
        verify(w);
      }
    
      @Test
      public void suppressed() throws InvocationTargetException, IllegalAccessException
      {
        assumeNotNull(ADD_SUPPRESSED_METHOD); // only execute on Java 7, would work anyway but doesn't make sense.
        Exception ex = null;
        try {
          someMethod();
        } catch (Exception e) {
          Exception fooException = new Exception("Foo");
          Exception barException = new Exception("Bar");
          addSuppressed(e, fooException);
          addSuppressed(e, barException);
          ex = e;
        }
        verify(ex);
      }
    
      @Test
      public void suppressedWithCause() throws InvocationTargetException, IllegalAccessException
      {
        assumeNotNull(ADD_SUPPRESSED_METHOD); // only execute on Java 7, would work anyway but doesn't make sense.
        Exception ex = null;
        try {
          someMethod();
        } catch (Exception e) {
          ex=new Exception("Wrapper", e);
          Exception fooException = new Exception("Foo");
          Exception barException = new Exception("Bar");
          addSuppressed(ex, fooException);
          addSuppressed(e, barException);
        }
        verify(ex);
      }
    
      // see also http://jira.qos.ch/browse/LBCLASSIC-216
      @Test
      public void nullSTE() {
        Throwable t = new Exception("someMethodWithNullException") {
          @Override
          public StackTraceElement[] getStackTrace() {
            return null;
          }
        };
        // we can't test output as Throwable.printStackTrace method uses
        // the private getOurStackTrace method instead of getStackTrace
    
        // tests  ThrowableProxyUtil.steArrayToStepArray
        new ThrowableProxy(t);
    
        // tests  ThrowableProxyUtil.findNumberOfCommonFrames
        Exception top = new Exception("top", t);
        new ThrowableProxy(top);
      }
    
      @Test
      public void multiNested() {
        Exception w = null;
        try {
          someOtherMethod();
        } catch (Exception e) {
          w = new Exception("wrapping", e);
        }
        verify(w);
      }
    
      void someMethod() throws Exception {
        throw new Exception("someMethod");
      }
    
      void someMethodWithNullException() throws Exception {
        throw new Exception("someMethodWithNullException") {
          @Override
          public StackTraceElement[] getStackTrace() {
            return null;
          }
        };
      }
    
      void someOtherMethod() throws Exception {
        try {
          someMethod();
        } catch (Exception e) {
          throw new Exception("someOtherMethod", e);
        }
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/spi/CPDCSpecial.java������������0000644�0001750�0001750�00000001215�12136042271�030550� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.spi;
    
    public interface CPDCSpecial {
    
      void doTest();
    
      Throwable getThrowable();
    
      IThrowableProxy getThrowableProxy();
    
    }�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/spi/BogusClassLoader.java�������0000644�0001750�0001750�00000002664�12136042271�031743� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.spi;
    
    import java.net.URL;
    import java.net.URLClassLoader;
    
    /**
     * A trivial class loader which throws a NoClassDefFoundError if the requested
     * class name contains the string "Bogus".
     * 
     * @author Ceki Gulcu
     */
    public class BogusClassLoader extends URLClassLoader {
    
      public BogusClassLoader(URL[] urls) {
        super(urls);
      }
    
      public BogusClassLoader(URL[] urls, ClassLoader parent) {
        super(urls, parent);
      }
    
      public Class<?> loadClass(String name) throws ClassNotFoundException {
        return loadClass(name, false);
      }
    
      /**
       * Throw NoClassDefFoundError if the requested class contains the string
       * "Bogus". Otherwise, delegate to super-class.
       */
      protected Class<?> loadClass(String name, boolean resolve)
          throws ClassNotFoundException {
    
        if (name.contains("Bogus")) {
          throw new NoClassDefFoundError();
        }
    
        return super.loadClass(name, resolve);
      }
    }
    ����������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/spi/LuckyCharms.java������������0000644�0001750�0001750�00000001325�12136042271�030765� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.spi;
    
    // non serializable object
    public class LuckyCharms {
      int id;
      
      LuckyCharms(int id) {
        this.id= id;
      }
      
      @Override
      public String toString() {
        return "LC("+id+")";
      }
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/spi/ContextListenerTest.java����0000644�0001750�0001750�00000004453�12136042271�032537� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.spi;
    
    import static org.junit.Assert.assertEquals;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.Logger;
    import org.junit.Before;
    import org.junit.Test;
    
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.spi.BasicContextListener.UpdateType;
    
    public class ContextListenerTest {
    
      LoggerContext context;
      BasicContextListener listener;
    
      @Before
      public void setUp() throws Exception {
        context = new LoggerContext();
        listener = new BasicContextListener();
        context.addListener(listener);
      }
    
      @Test
      public void testNotifyOnReset() {
        context.reset();
        assertEquals(UpdateType.RESET, listener.updateType);
        assertEquals(listener.context, context);
      }
    
      @Test
      public void testNotifyOnStopResistant() {
        listener.setResetResistant(true);
        context.stop();
        assertEquals(UpdateType.STOP, listener.updateType);
        assertEquals(listener.context, context);
      }
    
      @Test
      public void testNotifyOnStopNotResistant() {
        context.stop();
        assertEquals(UpdateType.RESET, listener.updateType);
        assertEquals(listener.context, context);
      }
    
      @Test
      public void testNotifyOnStart() {
        context.start();
        assertEquals(UpdateType.START, listener.updateType);
        assertEquals(listener.context, context);
      }
    
      void checkLevelChange(String loggerName, Level level) {
        Logger logger = context.getLogger(loggerName);
        logger.setLevel(level);
    
        assertEquals(UpdateType.LEVEL_CHANGE, listener.updateType);
        assertEquals(listener.logger, logger);
        assertEquals(listener.level, level);
    
      }
    
      @Test
      public void testLevelChange() {
        checkLevelChange("a", Level.INFO);
        checkLevelChange("a.b", Level.ERROR);
        checkLevelChange("a.b.c", Level.DEBUG);
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/spi/CallerDataTest.java���������0000644�0001750�0001750�00000002642�12136042271�031377� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.spi;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertNotNull;
    import static org.junit.Assert.assertTrue;
    
    import org.junit.Test;
    
    public class CallerDataTest  {
    
    
      @Test
      public void testBasic() {
        Throwable t = new Throwable();
        StackTraceElement[] steArray = t.getStackTrace();
        
        StackTraceElement[] cda = CallerData.extract(t, CallerDataTest.class.getName(), 50, null);
        assertNotNull(cda);
        assertTrue(cda.length > 0);
        assertEquals(steArray.length - 1, cda.length);
      }
      
      /**
       * This test verifies that in case caller data cannot be
       * extracted, CallerData.extract does not throw an exception
       *
       */
      @Test
      public void testDeferredProcessing() {
        StackTraceElement[] cda = CallerData.extract(new Throwable(), "com.inexistent.foo", 10, null);
        assertNotNull(cda);
        assertEquals(0, cda.length);
      }
      
    }
    ����������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/spi/LoggerComparatorTest.java���0000644�0001750�0001750�00000002630�12136042271�032647� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.spi;
    
    import org.junit.Before;
    import org.junit.Test;
    import static org.junit.Assert.*;
    
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    
    
    public class LoggerComparatorTest {
    
      LoggerComparator comparator = new LoggerComparator();
      LoggerContext lc = new LoggerContext();
    
      Logger root = lc.getLogger("root");
    
      Logger a = lc.getLogger("a");
      Logger b = lc.getLogger("b");
    
      @Before
      public void setUp() throws Exception {
      
      }
    
      
      
      @Test
      public void testSmoke() {
        assertEquals(0, comparator.compare(a, a));
        assertEquals(-1, comparator.compare(a, b));
        assertEquals(1, comparator.compare(b, a));
        assertEquals(-1, comparator.compare(root, a));
        // following two tests failed before bug #127 was fixed
        assertEquals(1, comparator.compare(a, root));
        assertEquals(0, comparator.compare(root, root));
      }
    }
    ��������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/spi/BasicContextListener.java���0000644�0001750�0001750�00000003160�12136042271�032633� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.spi;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    
    public class BasicContextListener implements LoggerContextListener {
    
      enum UpdateType { NONE, START, RESET, STOP , LEVEL_CHANGE};
      
      UpdateType updateType = UpdateType.NONE;
      LoggerContext context;
      Logger logger;
      Level level;
      
      boolean resetResistant;
      
      public void setResetResistant(boolean resetResistant) {
        this.resetResistant = resetResistant;
      }
      
      public void onReset(LoggerContext context) {
        updateType =  UpdateType.RESET;
        this.context = context;
        
      }
      public void onStart(LoggerContext context) {
        updateType =  UpdateType.START;;
        this.context = context;
      }
      
      public void onStop(LoggerContext context) {
        updateType =  UpdateType.STOP;;
        this.context = context;
      }
    
      public boolean isResetResistant() {
        return resetResistant;
      }
    
      public void onLevelChange(Logger logger, Level level) {
        updateType = UpdateType.LEVEL_CHANGE;
        this.logger = logger;
        this.level = level;
      }
      
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/spi/PackageTest.java������������0000644�0001750�0001750�00000001660�12136042271�030735� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.spi;
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    import org.junit.runners.Suite.SuiteClasses;
    
    @RunWith(Suite.class)
    @SuiteClasses( { ContextListenerTest.class, CallerDataTest.class,
        LoggerComparatorTest.class, LoggingEventSerializationTest.class,
        LoggingEventSerializationPerfTest.class, ThrowableProxyTest.class,
        PackagingDataCalculatorTest.class })
    public class PackageTest  {
    }��������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000151�00000000000�011562� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/spi/PackagingDataCalculatorTest.java������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/spi/PackagingDataCalculatorTest.0000644�0001750�0001750�00000007700�12136042271�033231� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.spi;
    
    import static org.junit.Assert.assertNotNull;
    import static org.junit.Assert.assertTrue;
    
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.net.URLClassLoader;
    
    import org.junit.Test;
    
    import ch.qos.logback.classic.util.TeztHelper;
    import ch.qos.logback.core.util.SystemInfo;
    
    public class PackagingDataCalculatorTest {
    
      public void verify(ThrowableProxy tp) {
        for (StackTraceElementProxy step : tp.getStackTraceElementProxyArray()) {
          if (step != null) {
            assertNotNull(step.getClassPackagingData());
          }
        }
      }
    
      @Test
      public void smoke() throws Exception {
        Throwable t = new Throwable("x");
        ThrowableProxy tp = new ThrowableProxy(t);
        PackagingDataCalculator pdc = tp.getPackagingDataCalculator();
        pdc.calculate(tp);
        verify(tp);
        tp.fullDump();
      }
    
      @Test
      public void nested() throws Exception {
        Throwable t = TeztHelper.makeNestedException(3);
        ThrowableProxy tp = new ThrowableProxy(t);
        PackagingDataCalculator pdc = tp.getPackagingDataCalculator();
        pdc.calculate(tp);
        verify(tp);
      }
    
      public void doCalculateClassPackagingData(
          boolean withClassPackagingCalculation) {
        try {
          throw new Exception("testing");
        } catch (Throwable e) {
          ThrowableProxy tp = new ThrowableProxy(e);
          if (withClassPackagingCalculation) {
            PackagingDataCalculator pdc = tp.getPackagingDataCalculator();
            pdc.calculate(tp);
          }
        }
      }
    
      double loop(int len, boolean withClassPackagingCalculation) {
        long start = System.nanoTime();
        for (int i = 0; i < len; i++) {
          doCalculateClassPackagingData(withClassPackagingCalculation);
        }
        return (1.0 * System.nanoTime() - start) / len / 1000;
      }
    
      @Test
      public void perfTest() {
        int len = 1000;
        loop(len, false);
        loop(len, true);
    
        double d0 = loop(len, false);
        System.out.println("without packaging info " + d0 + " microseconds");
    
        double d1 = loop(len, true);
        System.out.println("with    packaging info " + d1 + " microseconds");
    
        int slackFactor = 8;
        if (!SystemInfo.getJavaVendor().contains("Sun")) {
          // be more lenient with other JDKs
          slackFactor = 10;
        }
        assertTrue("computing class packaging data (" + d1
            + ") should have been less than " + slackFactor
            + " times the time it takes to process an exception "
            + (d0 * slackFactor), d0 * slackFactor > d1);
    
      }
    
      private ClassLoader makeBogusClassLoader() throws MalformedURLException {
        ClassLoader currentClassLoader = this.getClass().getClassLoader();
        return new BogusClassLoader(new URL[] {},
            currentClassLoader);
      }
    
      @Test
      // Test http://jira.qos.ch/browse/LBCLASSIC-125
      public void noClassDefFoundError_LBCLASSIC_125Test()
          throws MalformedURLException {
        ClassLoader cl = (URLClassLoader) makeBogusClassLoader();
        Thread.currentThread().setContextClassLoader(cl);
        Throwable t = new Throwable("x");
        ThrowableProxy tp = new ThrowableProxy(t);
        StackTraceElementProxy[] stepArray = tp.getStackTraceElementProxyArray();
        StackTraceElement bogusSTE = new StackTraceElement("com.Bogus", "myMethod",
            "myFile", 12);
        stepArray[0] = new StackTraceElementProxy(bogusSTE);
        PackagingDataCalculator pdc = tp.getPackagingDataCalculator();
        // NoClassDefFoundError should be caught
        pdc.calculate(tp);
    
      }
    
    }
    ����������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000153�00000000000�011564� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/spi/LoggingEventSerializationTest.java����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/spi/LoggingEventSerializationTes0000644�0001750�0001750�00000016124�12136042271�033425� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.spi;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertNotNull;
    import static org.junit.Assert.assertNull;
    
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.io.Serializable;
    import java.util.Map;
    
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    import org.slf4j.MDC;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.net.LoggingEventPreSerializationTransformer;
    import ch.qos.logback.core.spi.PreSerializationTransformer;
    
    public class LoggingEventSerializationTest {
    
      LoggerContext lc;
      Logger logger;
    
      ByteArrayOutputStream bos;
      ObjectOutputStream oos;
      ObjectInputStream inputStream;
      PreSerializationTransformer<ILoggingEvent> pst = new LoggingEventPreSerializationTransformer();
    
      @Before
      public void setUp() throws Exception {
        lc = new LoggerContext();
        lc.setName("testContext");
        logger = lc.getLogger(Logger.ROOT_LOGGER_NAME);
        // create the byte output stream
        bos = new ByteArrayOutputStream();
        oos = new ObjectOutputStream(bos);
      }
    
      @After
      public void tearDown() throws Exception {
        lc = null;
        logger = null;
        oos.close();
      }
    
      @Test
      public void smoke() throws Exception {
        ILoggingEvent event = createLoggingEvent();
        ILoggingEvent remoteEvent = writeAndRead(event);
        checkForEquality(event, remoteEvent);
      }
    
      @Test
      public void context() throws Exception {
        lc.putProperty("testKey", "testValue");
        ILoggingEvent event = createLoggingEvent();
        ILoggingEvent remoteEvent = writeAndRead(event);
        checkForEquality(event, remoteEvent);
    
        assertNotNull(remoteEvent.getLoggerName());
        assertEquals(Logger.ROOT_LOGGER_NAME, remoteEvent.getLoggerName());
    
        LoggerContextVO loggerContextRemoteView = remoteEvent.getLoggerContextVO();
        assertNotNull(loggerContextRemoteView);
        assertEquals("testContext", loggerContextRemoteView.getName());
        Map<String, String> props = loggerContextRemoteView.getPropertyMap();
        assertNotNull(props);
        assertEquals("testValue", props.get("testKey"));
      }
    
      @Test
      public void MDC() throws Exception {
        MDC.put("key", "testValue");
        ILoggingEvent event = createLoggingEvent();
        ILoggingEvent remoteEvent = writeAndRead(event);
        checkForEquality(event, remoteEvent);
        Map<String, String> MDCPropertyMap = remoteEvent.getMDCPropertyMap();
        assertEquals("testValue", MDCPropertyMap.get("key"));
      }
    
      @Test
      public void updatedMDC() throws Exception {
        MDC.put("key", "testValue");
        ILoggingEvent event1 = createLoggingEvent();
        Serializable s1 = pst.transform(event1);
        oos.writeObject(s1);
    
        MDC.put("key", "updatedTestValue");
        ILoggingEvent event2 = createLoggingEvent();
        Serializable s2 = pst.transform(event2);
        oos.writeObject(s2);
    
        // create the input stream based on the ouput stream
        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
        inputStream = new ObjectInputStream(bis);
    
        // skip over one object
        inputStream.readObject();
        ILoggingEvent remoteEvent2 = (ILoggingEvent) inputStream.readObject();
    
        // We observe the second logging event. It should provide us with
        // the updated MDC property.
        Map<String, String> MDCPropertyMap = remoteEvent2.getMDCPropertyMap();
        assertEquals("updatedTestValue", MDCPropertyMap.get("key"));
      }
    
      @Test
      public void nonSerializableParameters() throws Exception {
        LoggingEvent event = createLoggingEvent();
        LuckyCharms lucky0 = new LuckyCharms(0);
        event.setArgumentArray(new Object[] { lucky0, null });
        ILoggingEvent remoteEvent = writeAndRead(event);
        checkForEquality(event, remoteEvent);
    
        Object[] aa = remoteEvent.getArgumentArray();
        assertNotNull(aa);
        assertEquals(2, aa.length);
        assertEquals("LC(0)", aa[0]);
        assertNull(aa[1]);
      }
    
      @Test
      public void _Throwable() throws Exception {
        LoggingEvent event = createLoggingEvent();
        Throwable throwable = new Throwable("just testing");
        ThrowableProxy tp = new ThrowableProxy(throwable);
        event.setThrowableProxy(tp);
        ILoggingEvent remoteEvent = writeAndRead(event);
        checkForEquality(event, remoteEvent);
      }
    
      @Test
      public void extendendeThrowable() throws Exception {
        LoggingEvent event = createLoggingEvent();
        Throwable throwable = new Throwable("just testing");
        ThrowableProxy tp = new ThrowableProxy(throwable);
        event.setThrowableProxy(tp);
        tp.calculatePackagingData();
    
        ILoggingEvent remoteEvent = writeAndRead(event);
        checkForEquality(event, remoteEvent);
      }
    
      @Test
      public void serializeLargeArgs() throws Exception {
    
        StringBuffer buffer = new StringBuffer();
        for (int i = 0; i < 100000; i++) {
          buffer.append("X");
        }
        String largeString = buffer.toString();
        Object[] argArray = new Object[] { new LuckyCharms(2), largeString };
    
        LoggingEvent event = createLoggingEvent();
        event.setArgumentArray(argArray);
    
        ILoggingEvent remoteEvent = writeAndRead(event);
        checkForEquality(event, remoteEvent);
        Object[] aa = remoteEvent.getArgumentArray();
        assertNotNull(aa);
        assertEquals(2, aa.length);
        String stringBack = (String) aa[1];
        assertEquals(largeString, stringBack);
      }
    
      private LoggingEvent createLoggingEvent() {
        return new LoggingEvent(this.getClass().getName(), logger,
            Level.DEBUG, "test message", null, null);
      }
    
      private void checkForEquality(ILoggingEvent original,
          ILoggingEvent afterSerialization) {
        assertEquals(original.getLevel(), afterSerialization.getLevel());
        assertEquals(original.getFormattedMessage(), afterSerialization
            .getFormattedMessage());
        assertEquals(original.getMessage(), afterSerialization.getMessage());
    
        System.out.println();
    
        ThrowableProxyVO witness = ThrowableProxyVO.build(original
            .getThrowableProxy());
        assertEquals(witness, afterSerialization.getThrowableProxy());
    
      }
    
      private ILoggingEvent writeAndRead(ILoggingEvent event) throws IOException,
          ClassNotFoundException {
        Serializable ser = pst.transform(event);
        oos.writeObject(ser);
        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
        inputStream = new ObjectInputStream(bis);
    
        return (ILoggingEvent) inputStream.readObject();
      }
    
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/spi/LocalFirstClassLoader.java��0000644�0001750�0001750�00000004062�12136042271�032720� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.spi;
    
    import java.net.URL;
    import java.net.URLClassLoader;
    
    /**
     * An almost trivial no fuss implementation of a class loader following the
     * child-first delegation model.
     * 
     * @author Ceki Gulcu
     */
    public class LocalFirstClassLoader extends URLClassLoader {
    
      public LocalFirstClassLoader(URL[] urls) {
        super(urls);
      }
    
      public LocalFirstClassLoader(URL[] urls, ClassLoader parent) {
        super(urls, parent);
      }
    
      public void addURL(URL url) {
        super.addURL(url);
      }
    
      public Class<?> loadClass(String name) throws ClassNotFoundException {
        return loadClass(name, false);
      }
    
      /**
       * We override the parent-first behavior established by java.lang.Classloader.
       * 
       * The implementation is surprisingly straightforward.
       */
      protected Class<?> loadClass(String name, boolean resolve)
          throws ClassNotFoundException {
    
        // First, check if the class has already been loaded
        Class c = findLoadedClass(name);
    
        // if not loaded, search the local (child) resources
        if (c == null) {
          try {
            c = findClass(name);
          } catch (ClassNotFoundException cnfe) {
            // ignore
          }
        }
    
        // if we could not find it, delegate to parent
        // Note that we don't attempt to catch any ClassNotFoundException
        if (c == null) {
          if (getParent() != null) {
            c = getParent().loadClass(name);
          } else {
            c = getSystemClassLoader().loadClass(name);
          }
        }
    
        if (resolve) {
          resolveClass(c);
        }
    
        return c;
      }
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000157�00000000000�011570� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/spi/LoggingEventSerializationPerfTest.java������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/spi/LoggingEventSerializationPer0000644�0001750�0001750�00000010437�12136042271�033421� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.spi;
    
    import static org.junit.Assert.assertTrue;
    import static org.junit.Assert.fail;
    
    import java.io.IOException;
    import java.io.ObjectOutputStream;
    
    import ch.qos.logback.core.testUtil.EnvUtilForTests;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    import org.slf4j.MDC;
    import org.slf4j.helpers.BogoPerf;
    
    import ch.qos.logback.classic.net.NOPOutputStream;
    import ch.qos.logback.classic.net.testObjectBuilders.Builder;
    import ch.qos.logback.classic.net.testObjectBuilders.LoggingEventWithParametersBuilder;
    import ch.qos.logback.classic.net.testObjectBuilders.TrivialLoggingEventBuilder;
    import ch.qos.logback.core.CoreConstants;
    
    // As of logback 0.9.15, 
    //   average time  per logging event: 3979 nanoseconds
    //   size 545'648 bytes
    // 
    // Using LoggingEventDO
    // 
    //   average time  per logging event: 4052 nanoseconds
    //   average size=45,  with params, average size=136
    //
    // Using LoggerEventVO, with loggerName, and loggerContextRemoteView
    //   average time per logging event: 4034
    //   average size 57, with params, average size=148
    
    public class LoggingEventSerializationPerfTest {
    
      static int LOOP_LEN = 10 * 1000;
    
      NOPOutputStream noos = new NOPOutputStream();
      ObjectOutputStream oos;
    
      @Before
      public void setUp() throws Exception {
        MDC.clear();
        oos = new ObjectOutputStream(noos);
      }
    
      @After
      public void tearDown() throws Exception {
      }
    
      double doLoop(Builder builder, int loopLen) {
        long start = System.nanoTime();
        int resetCounter = 0;
        for (int i = 0; i < loopLen; i++) {
          try {
            ILoggingEvent le = (ILoggingEvent) builder.build(i);
            oos.writeObject(LoggingEventVO.build(le));
    
            oos.flush();
            if (++resetCounter >= CoreConstants.OOS_RESET_FREQUENCY) {
              oos.reset();
              resetCounter = 0;
            }
    
          } catch (IOException ex) {
            fail(ex.getMessage());
          }
        }
        long end = System.nanoTime();
        return (end - start) / (1.0d * loopLen);
      }
    
      @Test
      public void testPerformance() {
        if (EnvUtilForTests.isLinux()) {
          return;
        }
        TrivialLoggingEventBuilder builder = new TrivialLoggingEventBuilder();
    
        for (int i = 0; i < 3; i++) {
          doLoop(builder, LOOP_LEN);
          noos.reset();
        }
        double rt = doLoop(builder, LOOP_LEN);
        System.out
            .println("average time per logging event " + rt + " nanoseconds");
    
        long averageSize = (long) (noos.size() / (LOOP_LEN));
        System.out.println("noos size " + noos.size() + " average size="
            + averageSize);
        double averageSizeLimit = 62.1;
    
        assertTrue("average size " + averageSize + " should be less than "
            + averageSizeLimit, averageSizeLimit > averageSize);
    
        // the reference was computed on Orion (Ceki's computer)
        long referencePerf = 5000;
        BogoPerf.assertDuration(rt, referencePerf, CoreConstants.REFERENCE_BIPS);
      }
    
      @Test
      public void testPerformanceWithParameters() {
        if (EnvUtilForTests.isLinux()) {
          return;
        }
        LoggingEventWithParametersBuilder builder = new LoggingEventWithParametersBuilder();
    
        // warm up
        for (int i = 0; i < 3; i++) {
          doLoop(builder, LOOP_LEN);
          noos.reset();
        }
        double rt = doLoop(builder, LOOP_LEN);
        long averageSize = (long) (noos.size() / (LOOP_LEN));
    
        System.out.println("noos size " + noos.size() + " average size="
            + averageSize);
    
        double averageSizeLimit = 160;
        assertTrue("averageSize " + averageSize + " should be less than "
            + averageSizeLimit, averageSizeLimit > averageSize);
    
        // the reference was computed on Orion (Ceki's computer)
        long referencePerf = 7000;
        BogoPerf.assertDuration(rt, referencePerf, CoreConstants.REFERENCE_BIPS);
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/spi/PubLoggingEventVO.java������0000644�0001750�0001750�00000014007�12136042271�032045� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.spi;
    
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.io.Serializable;
    import java.util.Map;
    
    import org.slf4j.Marker;
    import org.slf4j.helpers.MessageFormatter;
    
    import ch.qos.logback.classic.Level;
    
    /**
     * A read/write and serializable implementation of {@link ILoggingEvent}.
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public class PubLoggingEventVO implements ILoggingEvent, Serializable {
    
      private static final long serialVersionUID = -3385765861078946218L;
    
      private static final int NULL_ARGUMENT_ARRAY = -1;
      private static final String NULL_ARGUMENT_ARRAY_ELEMENT = "NULL_ARGUMENT_ARRAY_ELEMENT";
    
      public String threadName;
      public String loggerName;
      public LoggerContextVO loggerContextVO;
    
      public transient Level level;
      public String message;
    
      private transient String formattedMessage;
    
      public Object[] argumentArray;
    
      public IThrowableProxy throwableProxy;
      public StackTraceElement[] callerDataArray;
      public Marker marker;
      public Map<String, String> mdcPropertyMap;
      public long timeStamp;
    
      public String getThreadName() {
        return threadName;
      }
    
      public LoggerContextVO getLoggerContextVO() {
        return loggerContextVO;
      }
    
      public String getLoggerName() {
        return loggerName;
      }
    
      public Level getLevel() {
        return level;
      }
    
      public String getMessage() {
        return message;
      }
    
      public String getFormattedMessage() {
        if (formattedMessage != null) {
          return formattedMessage;
        }
    
        if (argumentArray != null) {
          formattedMessage = MessageFormatter.arrayFormat(message, argumentArray)
              .getMessage();
        } else {
          formattedMessage = message;
        }
    
        return formattedMessage;
      }
    
      public Object[] getArgumentArray() {
        return argumentArray;
      }
    
      public IThrowableProxy getThrowableProxy() {
        return throwableProxy;
      }
    
      public StackTraceElement[] getCallerData() {
        return callerDataArray;
      }
    
      public boolean hasCallerData() {
        return callerDataArray != null;
      }
    
      public Marker getMarker() {
        return marker;
      }
    
      public long getTimeStamp() {
        return timeStamp;
      }
    
      public long getContextBirthTime() {
        return loggerContextVO.getBirthTime();
      }
    
      public LoggerContextVO getContextLoggerRemoteView() {
        return loggerContextVO;
      }
    
      public Map<String, String> getMDCPropertyMap() {
        return mdcPropertyMap;
      }
    
      public Map<String, String> getMdc() {
        return mdcPropertyMap;
      }
    
      public void prepareForDeferredProcessing() {
      }
    
      private void writeObject(ObjectOutputStream out) throws IOException {
        out.defaultWriteObject();
        out.writeInt(level.levelInt);
        if (argumentArray != null) {
          int len = argumentArray.length;
          out.writeInt(len);
          for (int i = 0; i < argumentArray.length; i++) {
            if (argumentArray[i] != null) {
              out.writeObject(argumentArray[i].toString());
            } else {
              out.writeObject(NULL_ARGUMENT_ARRAY_ELEMENT);
            }
          }
        } else {
          out.writeInt(NULL_ARGUMENT_ARRAY);
        }
    
      }
    
      private void readObject(ObjectInputStream in) throws IOException,
          ClassNotFoundException {
        in.defaultReadObject();
        int levelInt = in.readInt();
        level = Level.toLevel(levelInt);
    
        int argArrayLen = in.readInt();
        if (argArrayLen != NULL_ARGUMENT_ARRAY) {
          argumentArray = new String[argArrayLen];
          for (int i = 0; i < argArrayLen; i++) {
            Object val = in.readObject();
            if (!NULL_ARGUMENT_ARRAY_ELEMENT.equals(val)) {
              argumentArray[i] = val;
            }
          }
        }
      }
    
      @Override
      public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((message == null) ? 0 : message.hashCode());
        result = prime * result
            + ((threadName == null) ? 0 : threadName.hashCode());
        result = prime * result + (int) (timeStamp ^ (timeStamp >>> 32));
        return result;
      }
    
      @Override
      public boolean equals(Object obj) {
        if (this == obj)
          return true;
        if (obj == null)
          return false;
        if (getClass() != obj.getClass())
          return false;
        final PubLoggingEventVO other = (PubLoggingEventVO) obj;
        if (message == null) {
          if (other.message != null)
            return false;
        } else if (!message.equals(other.message))
          return false;
    
        if (loggerName == null) {
          if (other.loggerName != null)
            return false;
        } else if (!loggerName.equals(other.loggerName))
          return false;
    
        if (threadName == null) {
          if (other.threadName != null)
            return false;
        } else if (!threadName.equals(other.threadName))
          return false;
        if (timeStamp != other.timeStamp)
          return false;
    
        if (marker == null) {
          if (other.marker != null)
            return false;
        } else if (!marker.equals(other.marker))
          return false;
    
        if (mdcPropertyMap == null) {
          if (other.mdcPropertyMap != null)
            return false;
        } else if (!mdcPropertyMap.equals(other.mdcPropertyMap))
          return false;
        return true;
      }
    
      public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append(timeStamp);
        sb.append(" ");
        sb.append(level);
        sb.append(" [");
        sb.append(threadName);
        sb.append("] ");
        sb.append(loggerName);
        sb.append(" - ");
        sb.append(getFormattedMessage());
        return sb.toString();
      }
    
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/spi/special/��������������������0000755�0001750�0001750�00000000000�12203357067�027323� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/spi/special/CPDCSpecialImpl.java0000644�0001750�0001750�00000002425�12136042271�033016� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.spi.special;
    
    import ch.qos.logback.classic.spi.CPDCSpecial;
    import ch.qos.logback.classic.spi.IThrowableProxy;
    import ch.qos.logback.classic.spi.PackagingDataCalculator;
    import ch.qos.logback.classic.spi.ThrowableProxy;
    
    
    public class CPDCSpecialImpl implements CPDCSpecial {
    
      
      Throwable throwable;
      IThrowableProxy throwableProxy;
      
      public void doTest() {
        nesting();
      }
      
      private void nesting() {
        throwable = new Throwable("x");
        throwableProxy = new ThrowableProxy(throwable);
        PackagingDataCalculator pdc = new PackagingDataCalculator();
        pdc.calculate(throwableProxy);
      }
      
      public Throwable getThrowable() {
        return throwable;
      }
      public IThrowableProxy getThrowableProxy() {
        return throwableProxy;
      }
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/spi/DummyThrowableProxy.java����0000644�0001750�0001750�00000003600�12136042271�032543� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.spi;
    
    public class DummyThrowableProxy implements IThrowableProxy {
      
      private String className;
      private String message;
      private int commonFramesCount;
      private StackTraceElementProxy[] stackTraceElementProxyArray;
      private IThrowableProxy cause;
      private IThrowableProxy[] suppressed;
    
      public String getClassName() {
        return className;
      }
      public void setClassName(String className) {
        this.className = className;
      }
      public String getMessage() {
        return message;
      }
      public void setMessage(String message) {
        this.message = message;
      }
      public int getCommonFrames() {
        return commonFramesCount;
      }
      public void setCommonFramesCount(int commonFramesCount) {
        this.commonFramesCount = commonFramesCount;
      }
    
      public StackTraceElementProxy[] getStackTraceElementProxyArray() {
        return stackTraceElementProxyArray;
      }
      public void setStackTraceElementProxyArray(
          StackTraceElementProxy[] stackTraceElementProxyArray) {
        this.stackTraceElementProxyArray = stackTraceElementProxyArray;
      }
      public IThrowableProxy getCause() {
        return cause;
      }
      public void setCause(IThrowableProxy cause) {
        this.cause = cause;
      }
    
      public IThrowableProxy[] getSuppressed() {
        return suppressed;
      }
    
      public void setSuppressed(IThrowableProxy[] suppressed) {
        this.suppressed = suppressed;
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/����������������������������0000755�0001750�0001750�00000000000�12203357067�025676� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/SMTPAppender_GreenTest.java�0000644�0001750�0001750�00000030734�12136545064�032773� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net;
    
    import ch.qos.logback.classic.ClassicTestConstants;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.PatternLayout;
    import ch.qos.logback.classic.html.HTMLLayout;
    import ch.qos.logback.classic.html.XHTMLEntityResolver;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.Layout;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.status.OnConsoleStatusListener;
    import ch.qos.logback.core.testUtil.EnvUtilForTests;
    import ch.qos.logback.core.testUtil.RandomUtil;
    import ch.qos.logback.core.util.CoreTestConstants;
    import com.icegreen.greenmail.util.GreenMail;
    import com.icegreen.greenmail.util.GreenMailUtil;
    import com.icegreen.greenmail.util.ServerSetup;
    import org.dom4j.DocumentException;
    import org.dom4j.io.SAXReader;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    import org.slf4j.MDC;
    
    import javax.mail.MessagingException;
    import javax.mail.internet.MimeMessage;
    import javax.mail.internet.MimeMultipart;
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.concurrent.TimeUnit;
    
    import static org.junit.Assert.*;
    
    public class SMTPAppender_GreenTest {
    
      static final String HEADER = "HEADER\n";
      static final String FOOTER = "FOOTER\n";
      static final String DEFAULT_PATTERN = "%-4relative %mdc [%thread] %-5level %class - %msg%n";
    
      static final boolean SYNCHRONOUS = false;
      static final boolean ASYNCHRONOUS = true;
    
      int port = RandomUtil.getRandomServerPort();
      // GreenMail cannot be static. As a shared server induces race conditions
      GreenMail greenMailServer;
    
      SMTPAppender smtpAppender;
      LoggerContext loggerContext = new LoggerContext();
      Logger logger = loggerContext.getLogger(this.getClass());
    
    
      @Before
      public void setUp() throws Exception {
    
        OnConsoleStatusListener.addNewInstanceToContext(loggerContext);
        MDC.clear();
        ServerSetup serverSetup = new ServerSetup(port, "localhost",
                ServerSetup.PROTOCOL_SMTP);
        greenMailServer = new GreenMail(serverSetup);
        greenMailServer.start();
        // give the server a head start
        if (EnvUtilForTests.isRunningOnSlowJenkins()) {
          Thread.currentThread().sleep(2000);
        } else {
          Thread.currentThread().sleep(50);
        }
      }
    
      @After
      public void tearDown() throws Exception {
        greenMailServer.stop();
      }
    
      void buildSMTPAppender(String subject, boolean synchronicity) throws Exception {
        smtpAppender = new SMTPAppender();
        smtpAppender.setContext(loggerContext);
        smtpAppender.setName("smtp");
        smtpAppender.setFrom("user@host.dom");
        smtpAppender.setSMTPHost("localhost");
        smtpAppender.setSMTPPort(port);
        smtpAppender.setSubject(subject);
        smtpAppender.addTo("nospam@qos.ch");
        smtpAppender.setAsynchronousSending(synchronicity);
      }
    
      private Layout<ILoggingEvent> buildPatternLayout(String pattern) {
        PatternLayout layout = new PatternLayout();
        layout.setContext(loggerContext);
        layout.setFileHeader(HEADER);
        layout.setOutputPatternAsHeader(false);
        layout.setPattern(pattern);
        layout.setFileFooter(FOOTER);
        layout.start();
        return layout;
      }
    
      private Layout<ILoggingEvent> buildHTMLLayout() {
        HTMLLayout layout = new HTMLLayout();
        layout.setContext(loggerContext);
        layout.setPattern("%level%class%msg");
        layout.start();
        return layout;
      }
    
      private void waitForServerToReceiveEmails(int emailCount) throws InterruptedException {
        greenMailServer.waitForIncomingEmail(5000, emailCount);
      }
    
      private MimeMultipart verifyAndExtractMimeMultipart(String subject) throws MessagingException,
              IOException, InterruptedException {
        int oldCount = 0;
        int expectedEmailCount = 1;
        // wait for the server to receive the messages
        waitForServerToReceiveEmails(expectedEmailCount);
        MimeMessage[] mma = greenMailServer.getReceivedMessages();
        assertNotNull(mma);
        assertEquals(expectedEmailCount, mma.length);
        MimeMessage mm = mma[oldCount];
        // http://jira.qos.ch/browse/LBCLASSIC-67
        assertEquals(subject, mm.getSubject());
        return (MimeMultipart) mm.getContent();
      }
    
      void waitUntilEmailIsSent() throws InterruptedException {
        loggerContext.getExecutorService().shutdown();
        loggerContext.getExecutorService().awaitTermination(1000, TimeUnit.MILLISECONDS);
      }
    
      @Test
      public void synchronousSmoke() throws Exception {
        String subject = "synchronousSmoke";
        buildSMTPAppender(subject, SYNCHRONOUS);
    
        smtpAppender.setLayout(buildPatternLayout(DEFAULT_PATTERN));
        smtpAppender.start();
        logger.addAppender(smtpAppender);
        logger.debug("hello");
        logger.error("en error", new Exception("an exception"));
    
        MimeMultipart mp = verifyAndExtractMimeMultipart(subject);
        String body = GreenMailUtil.getBody(mp.getBodyPart(0));
        assertTrue(body.startsWith(HEADER.trim()));
        assertTrue(body.endsWith(FOOTER.trim()));
      }
    
      @Test
      public void asynchronousSmoke() throws Exception {
        String subject = "asynchronousSmoke";
        buildSMTPAppender(subject, ASYNCHRONOUS);
        smtpAppender.setLayout(buildPatternLayout(DEFAULT_PATTERN));
        smtpAppender.start();
        logger.addAppender(smtpAppender);
        logger.debug("hello");
        logger.error("en error", new Exception("an exception"));
    
        waitUntilEmailIsSent();
        MimeMultipart mp = verifyAndExtractMimeMultipart(subject);
        String body = GreenMailUtil.getBody(mp.getBodyPart(0));
        assertTrue(body.startsWith(HEADER.trim()));
        assertTrue(body.endsWith(FOOTER.trim()));
      }
    
      // See also http://jira.qos.ch/browse/LOGBACK-734
      @Test
      public void callerDataShouldBeCorrectlySetWithAsynchronousSending() throws Exception {
        String subject = "LOGBACK-734";
        buildSMTPAppender("LOGBACK-734", ASYNCHRONOUS);
        smtpAppender.setLayout(buildPatternLayout(DEFAULT_PATTERN));
        smtpAppender.setIncludeCallerData(true);
        smtpAppender.start();
        logger.addAppender(smtpAppender);
        logger.debug("LOGBACK-734");
        logger.error("callerData", new Exception("ShouldBeCorrectlySetWithAsynchronousSending"));
    
        waitUntilEmailIsSent();
        MimeMultipart mp = verifyAndExtractMimeMultipart(subject);
        String body = GreenMailUtil.getBody(mp.getBodyPart(0));
        assertTrue("actual [" + body + "]", body.contains("DEBUG " + this.getClass().getName() + " - LOGBACK-734"));
      }
    
      // lost MDC
      @Test
      public void LBCLASSIC_104() throws Exception {
        String subject = "LBCLASSIC_104";
        buildSMTPAppender(subject, SYNCHRONOUS);
        smtpAppender.setAsynchronousSending(false);
        smtpAppender.setLayout(buildPatternLayout(DEFAULT_PATTERN));
        smtpAppender.start();
        logger.addAppender(smtpAppender);
        MDC.put("key", "val");
        logger.debug("LBCLASSIC_104");
        MDC.clear();
        logger.error("en error", new Exception("test"));
    
        MimeMultipart mp = verifyAndExtractMimeMultipart(subject);
        String body = GreenMailUtil.getBody(mp.getBodyPart(0));
        assertTrue(body.startsWith(HEADER.trim()));
        System.out.println(body);
        assertTrue(body.contains("key=val"));
        assertTrue(body.endsWith(FOOTER.trim()));
      }
    
      @Test
      public void html() throws Exception {
        String subject = "html";
        buildSMTPAppender(subject, SYNCHRONOUS);
        smtpAppender.setAsynchronousSending(false);
        smtpAppender.setLayout(buildHTMLLayout());
        smtpAppender.start();
        logger.addAppender(smtpAppender);
        logger.debug("html");
        logger.error("en error", new Exception("an exception"));
    
        MimeMultipart mp = verifyAndExtractMimeMultipart(subject);
    
        // verifyAndExtractMimeMultipart strict adherence to xhtml1-strict.dtd
        SAXReader reader = new SAXReader();
        reader.setValidation(true);
        reader.setEntityResolver(new XHTMLEntityResolver());
        byte[] messageBytes = getAsByteArray(mp.getBodyPart(0).getInputStream());
        ByteArrayInputStream bais = new ByteArrayInputStream(messageBytes);
        try {
          reader.read(bais);
        } catch (DocumentException de) {
          System.out.println("incoming message:");
          System.out.println(new String(messageBytes));
          throw de;
        }
      }
    
      private byte[] getAsByteArray(InputStream inputStream) throws IOException {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
    
        byte[] buffer = new byte[1024];
        int n = -1;
        while ((n = inputStream.read(buffer)) != -1) {
          baos.write(buffer, 0, n);
        }
        return baos.toByteArray();
      }
    
      private void configure(String file) throws JoranException {
        JoranConfigurator jc = new JoranConfigurator();
        jc.setContext(loggerContext);
        loggerContext.putProperty("port", "" + port);
        jc.doConfigure(file);
      }
    
      @Test
      public void testCustomEvaluator() throws Exception {
        configure(ClassicTestConstants.JORAN_INPUT_PREFIX
                + "smtp/customEvaluator.xml");
    
        logger.debug("test");
        String msg2 = "CustomEvaluator";
        logger.debug(msg2);
        logger.debug("invisible");
        waitUntilEmailIsSent();
        MimeMultipart mp = verifyAndExtractMimeMultipart("testCustomEvaluator " + this.getClass().getName() + " - " + msg2);
        String body = GreenMailUtil.getBody(mp.getBodyPart(0));
        assertEquals("testCustomEvaluator", body);
      }
    
      @Test
      public void testCustomBufferSize() throws Exception {
        configure(ClassicTestConstants.JORAN_INPUT_PREFIX
                + "smtp/customBufferSize.xml");
    
        logger.debug("invisible1");
        logger.debug("invisible2");
        String msg = "hello";
        logger.error(msg);
        waitUntilEmailIsSent();
        MimeMultipart mp = verifyAndExtractMimeMultipart("testCustomBufferSize " + this.getClass().getName() + " - " + msg);
        String body = GreenMailUtil.getBody(mp.getBodyPart(0));
        assertEquals(msg, body);
      }
    
      // this test fails intermittently on Jenkins.
      @Test
      public void testMultipleTo() throws Exception {
        buildSMTPAppender("testMultipleTo", SYNCHRONOUS);
        smtpAppender.setLayout(buildPatternLayout(DEFAULT_PATTERN));
        // buildSMTPAppender() already added one destination address
        smtpAppender.addTo("Test <test@example.com>, other-test@example.com");
        smtpAppender.start();
        logger.addAppender(smtpAppender);
        logger.debug("testMultipleTo hello");
        logger.error("testMultipleTo en error", new Exception("an exception"));
        Thread.yield();
        int expectedEmailCount = 3;
        waitForServerToReceiveEmails(expectedEmailCount);
        MimeMessage[] mma = greenMailServer.getReceivedMessages();
        assertNotNull(mma);
        assertEquals(expectedEmailCount, mma.length);
      }
    
      // http://jira.qos.ch/browse/LBCLASSIC-221
      @Test
      public void bufferShouldBeResetBetweenMessages() throws Exception {
        buildSMTPAppender("bufferShouldBeResetBetweenMessages", SYNCHRONOUS);
        smtpAppender.setLayout(buildPatternLayout(DEFAULT_PATTERN));
        smtpAppender.start();
        logger.addAppender(smtpAppender);
        String msg0 = "hello zero";
        logger.debug(msg0);
        logger.error("error zero");
    
        String msg1 = "hello one";
        logger.debug(msg1);
        logger.error("error one");
    
        Thread.yield();
        int oldCount = 0;
        int expectedEmailCount = oldCount + 2;
        waitForServerToReceiveEmails(expectedEmailCount);
    
        MimeMessage[] mma = greenMailServer.getReceivedMessages();
        assertNotNull(mma);
        assertEquals(expectedEmailCount, mma.length);
    
        MimeMessage mm0 = mma[oldCount];
        MimeMultipart content0 = (MimeMultipart) mm0.getContent();
        String body0 = GreenMailUtil.getBody(content0.getBodyPart(0));
    
        MimeMessage mm1 = mma[oldCount + 1];
        MimeMultipart content1 = (MimeMultipart) mm1.getContent();
        String body1 = GreenMailUtil.getBody(content1.getBodyPart(0));
        // second body should not contain content from first message
        assertFalse(body1.contains(msg0));
      }
    }
    ������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/JMSTopicAppenderTestApp.java0000644�0001750�0001750�00000004021�12136042271�033137� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net;
    
    import org.slf4j.LoggerFactory;
    
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.core.util.StatusPrinter;
    
    public class JMSTopicAppenderTestApp {
      
      public static void main(String[] args) {
        Logger logger = (Logger)LoggerFactory.getLogger(JMSTopicAppenderTestApp.class);
        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
        lc.reset();
        
        JMSTopicAppender appender = new JMSTopicAppender();
        appender.setContext(lc);
        appender.setName("jmsTopic");
        appender.setInitialContextFactoryName("org.apache.activemq.jndi.ActiveMQInitialContextFactory");
        //appender.setPassword("");
        appender.setProviderURL("tcp://localhost:61616");
        //appender.setSecurityCredentials("");
        //appender.setSecurityPrincipalName("");
        appender.setTopicBindingName("MyTopic");
        appender.setTopicConnectionFactoryBindingName("ConnectionFactory");
        //appender.setURLPkgPrefixes("");
        //appender.setUserName("");
        
        appender.start();
        logger.addAppender(appender);
        
        
        //JIT
        for (int i = 0; i < 10000; i++) {
          logger.debug("** Hello world. n=" + i);
        }
        
        long before = System.nanoTime();
        for (int i = 0; i < 10000; i++) {
          logger.debug("** Hello world. n=" + i);
        }
        long after = System.nanoTime();
        
        System.out.println("Time per logs for 10'000 logs: " + (after-before)/10000);
        
        StatusPrinter.print(lc.getStatusManager());
      }
    
    }���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/testObjectBuilders/���������0000755�0001750�0001750�00000000000�12203357067�031476� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000202�00000000000�011557� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/testObjectBuilders/LoggingEventWithParametersBuilder.java�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/testObjectBuilders/LoggingEv0000644�0001750�0001750�00000003226�12136042271�033276� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net.testObjectBuilders;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.spi.LoggingEvent;
    
    public class LoggingEventWithParametersBuilder implements Builder<LoggingEvent> {
    
      final String MSG = "aaaaabbbbbcccc {} cdddddaaaaabbbbbcccccdddddaaaa {}";
    
      LoggerContext loggerContext = new LoggerContext();
      private Logger logger = loggerContext.getLogger(Logger.ROOT_LOGGER_NAME);
    
      public LoggingEvent build(int i) {
    
        LoggingEvent le = new LoggingEvent();
        le.setTimeStamp(System.currentTimeMillis());
    
        Object[] aa = new Object[] { i, "HELLO WORLD [========== ]" + i };
    
        le.setArgumentArray(aa);
        String msg = MSG + i;
        le.setMessage(msg);
    
        // compute formatted message
        // this forces le.formmatedMessage to be set (this is the whole point of the
        // exercise)
        le.getFormattedMessage();
        le.setLevel(Level.DEBUG);
        le.setLoggerName(logger.getName());
        le.setLoggerContextRemoteView(loggerContext.getLoggerContextRemoteView());
        le.setThreadName("threadName");
        return le;
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000173�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/testObjectBuilders/TrivialLoggingEventBuilder.java������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/testObjectBuilders/TrivialLo0000644�0001750�0001750�00000002410�12136042271�033314� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net.testObjectBuilders;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.spi.LoggingEvent;
    
    public class TrivialLoggingEventBuilder implements Builder {
    
      LoggerContext loggerContext = new LoggerContext();
    
      private Logger logger = loggerContext.getLogger(Logger.ROOT_LOGGER_NAME);
    
      public Object build(int i) {
        LoggingEvent le = new LoggingEvent();
        le.setTimeStamp(System.currentTimeMillis());
        le.setLevel(Level.DEBUG);
        le.setLoggerName(logger.getName());
        le.setLoggerContextRemoteView(loggerContext.getLoggerContextRemoteView());
        le.setMessage(MSG_PREFIX);
        le.setThreadName("threadName");
        return le;
      } 
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000175�00000000000�011570� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/testObjectBuilders/TrivialLoggingEventVOBuilder.java����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/testObjectBuilders/TrivialLo0000644�0001750�0001750�00000001742�12136042271�033323� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net.testObjectBuilders;
    
    import ch.qos.logback.classic.spi.LoggingEvent;
    import ch.qos.logback.classic.spi.LoggingEventVO;
    
    /**
     * @author Pierre Queinnec
     */
    public class TrivialLoggingEventVOBuilder implements Builder {
    
      public Object build(int i) {
        TrivialLoggingEventBuilder loggingEventBuilder = new TrivialLoggingEventBuilder();
        LoggingEvent event = (LoggingEvent) loggingEventBuilder.build(i);
    
        return LoggingEventVO.build(event);
      }
    
    }
    ������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000175�00000000000�011570� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/testObjectBuilders/LoggingEventBuilderInContext.java����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/testObjectBuilders/LoggingEv0000644�0001750�0001750�00000002443�12136042271�033276� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net.testObjectBuilders;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.classic.spi.LoggingEvent;
    
    public class LoggingEventBuilderInContext implements Builder<ILoggingEvent> {
    
    
      LoggerContext loggerContext;
      Logger logger;
      String fqcn;
      public LoggingEventBuilderInContext(LoggerContext loggerContext, String loggerName, String fqcn) {
        this.loggerContext = loggerContext;
        logger = loggerContext.getLogger(loggerName);
        this.fqcn = fqcn;
      }
    
    
      public ILoggingEvent build(int i) {
        LoggingEvent le = new LoggingEvent(fqcn, logger, Level.DEBUG, "hello " + i,
                null, null);
        return le;
      }
    
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000162�00000000000�011564� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/testObjectBuilders/MinimalSerBuilder.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/testObjectBuilders/MinimalSe0000644�0001750�0001750�00000001613�12136042271�033271� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net.testObjectBuilders;
    
    import java.io.Serializable;
    
    
    public class MinimalSerBuilder implements Builder{
    
    	public Object build(int i) {
    		return new MinimalSer(i);
    	}
    
    }
    
    class MinimalSer implements Serializable {
    
    	private static final long serialVersionUID = 2807646397580899815L;
    
    	String message;
    
    	public MinimalSer(int i) {
    		message = Builder.MSG_PREFIX;
    	}
    }���������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000150�00000000000�011561� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/testObjectBuilders/Builder.java�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/testObjectBuilders/Builder.j0000644�0001750�0001750�00000001343�12136042271�033231� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net.testObjectBuilders;
    
    public interface Builder<E> {
    
      // 45 characters message
      String MSG_PREFIX = "aaaaabbbbbcccccdddddaaaaabbbbbcccccdddddaaaa";
    
      // final String MSG_PREFIX = "a";
    
      E build(int i);
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/NOPOutputStream.java��������0000644�0001750�0001750�00000001627�12136042271�031571� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net;
    
    import java.io.IOException;
    import java.io.OutputStream;
    
    public class NOPOutputStream extends OutputStream {
    
      long count;
    
      @Override
      public void write(int b) throws IOException {
        count++;
        // do nothing
      }
    
      public long getCount() {
        return count;
      }
    
      public long size() {
        return count;
      }
    
      
      public void reset() {
        count = 0;
      }
    
    }
    ���������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/JMSTopicAppenderTest.java���0000644�0001750�0001750�00000020511�12136042271�032500� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertFalse;
    import static org.junit.Assert.assertTrue;
    import static org.junit.Assert.fail;
    
    import java.io.Serializable;
    import java.util.Properties;
    
    import javax.jms.ObjectMessage;
    import javax.naming.Context;
    
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.net.mock.MockTopic;
    import ch.qos.logback.classic.net.mock.MockTopicConnectionFactory;
    import ch.qos.logback.classic.net.mock.MockTopicPublisher;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.classic.spi.LoggingEvent;
    import ch.qos.logback.classic.util.MockInitialContext;
    import ch.qos.logback.classic.util.MockInitialContextFactory;
    import ch.qos.logback.core.ContextBase;
    import ch.qos.logback.core.spi.PreSerializationTransformer;
    
    public class JMSTopicAppenderTest  {
    
      ch.qos.logback.core.Context context;
      JMSTopicAppender appender;
      PreSerializationTransformer<ILoggingEvent> pst = new LoggingEventPreSerializationTransformer();
      
    
      @Before
      public void setUp() throws Exception {
        context = new ContextBase();
        appender = new JMSTopicAppender();
        appender.setContext(context);
        appender.setName("jmsTopic");
        appender.tcfBindingName = "topicCnxFactory";
        appender.topicBindingName = "testTopic";
        appender.setProviderURL("url");
        appender.setInitialContextFactoryName(MockInitialContextFactory.class.getName());
        
        MockInitialContext mic = MockInitialContextFactory.getContext();
        mic.map.put(appender.tcfBindingName, new MockTopicConnectionFactory());
        mic.map.put(appender.topicBindingName, new MockTopic(appender.topicBindingName));
    
      }
    
    
      @After
      public void tearDown() throws Exception {
        appender = null;
        context = null;
      }
    
      @Test
      public void testAppendOk() { 
        appender.start();
    
        ILoggingEvent le = createLoggingEvent();
        appender.append(le);
        
        MockTopicPublisher tp = (MockTopicPublisher)appender.topicPublisher;
        assertEquals(1, tp.getMessageList().size());
        ObjectMessage message = (ObjectMessage) tp.getMessageList().get(0);
        try {
          Serializable witness = pst.transform(le);
          assertEquals(witness, message.getObject());
        } catch (Exception e) {
          fail();
        }
      }
    
      @Test
      public void testAppendFailure() {
        appender.start();
        
        //make sure the append method does not work
        appender.topicPublisher = null;
        
        ILoggingEvent le = createLoggingEvent();
        for (int i = 1; i <= 3; i++) {
          appender.append(le);
          assertEquals(i, context.getStatusManager().getCount());
          assertTrue(appender.isStarted());
        }
        appender.append(le);
        assertEquals(4, context.getStatusManager().getCount());
        assertFalse(appender.isStarted());
      }
    
      @Test
      public void testBuildEnvProperties() {
        appender.setInitialContextFactoryName("icfn");
        appender.setProviderURL("url");
        appender.setURLPkgPrefixes("pkgPref");
        appender.setSecurityPrincipalName("user");
        appender.setSecurityCredentials("cred");
    
        Properties props = appender.buildEnvProperties();
        assertEquals(5, props.size());
        assertEquals(appender.getInitialContextFactoryName(), props
            .getProperty(Context.INITIAL_CONTEXT_FACTORY));
        assertEquals(appender.getProviderURL(), props.getProperty(Context.PROVIDER_URL));
        assertEquals(appender.getURLPkgPrefixes(), props
            .getProperty(Context.URL_PKG_PREFIXES));
        assertEquals(appender.getSecurityPrincipalName(), props
            .getProperty(Context.SECURITY_PRINCIPAL));
        assertEquals(appender.getSecurityCredentials(), props
            .getProperty(Context.SECURITY_CREDENTIALS));
      }
    
      @Test
      public void testBuildEnvPropertiesWithNullProviderURL() {
        appender.setInitialContextFactoryName("icfn");
        appender.setProviderURL(null);
        appender.setURLPkgPrefixes("pkgPref");
        appender.setSecurityPrincipalName("user");
        appender.setSecurityCredentials("cred");
    
        Properties props = appender.buildEnvProperties();
        assertEquals(4, props.size());
        assertEquals(appender.getInitialContextFactoryName(), props
            .getProperty(Context.INITIAL_CONTEXT_FACTORY));
        assertEquals(null, props.getProperty(Context.PROVIDER_URL));
        assertEquals(appender.getURLPkgPrefixes(), props
            .getProperty(Context.URL_PKG_PREFIXES));
        assertEquals(appender.getSecurityPrincipalName(), props
            .getProperty(Context.SECURITY_PRINCIPAL));
        assertEquals(appender.getSecurityCredentials(), props
            .getProperty(Context.SECURITY_CREDENTIALS));
    
        assertEquals(1, context.getStatusManager().getCount());
      }
    
      @Test
      public void testBuildEnvPropertiesWithNullCredentials() {
        appender.setInitialContextFactoryName("icfn");
        appender.setProviderURL("url");
        appender.setURLPkgPrefixes("pkgPref");
        appender.setSecurityPrincipalName("user");
        appender.setSecurityCredentials(null);
    
        Properties props = appender.buildEnvProperties();
        assertEquals(4, props.size());
        assertEquals(appender.getInitialContextFactoryName(), props
            .getProperty(Context.INITIAL_CONTEXT_FACTORY));
        assertEquals(appender.getProviderURL(), props.getProperty(Context.PROVIDER_URL));
        assertEquals(appender.getURLPkgPrefixes(), props
            .getProperty(Context.URL_PKG_PREFIXES));
        assertEquals(appender.getSecurityPrincipalName(), props
            .getProperty(Context.SECURITY_PRINCIPAL));
        assertEquals(null, props
            .getProperty(Context.SECURITY_CREDENTIALS));
    
        assertEquals(1, context.getStatusManager().getCount());
      }
      
      @Test
      public void testBuildEnvPropertiesWithPkgNull() {
        appender.setInitialContextFactoryName("icfn");
        appender.setProviderURL("url");
        appender.setURLPkgPrefixes(null);
        appender.setSecurityPrincipalName("user");
        appender.setSecurityCredentials("cred");
    
        Properties props = appender.buildEnvProperties();
        assertEquals(4, props.size());
        assertEquals(appender.getInitialContextFactoryName(), props
            .getProperty(Context.INITIAL_CONTEXT_FACTORY));
        assertEquals(appender.getProviderURL(), props.getProperty(Context.PROVIDER_URL));
        assertEquals(null, props
            .getProperty(Context.URL_PKG_PREFIXES));
        assertEquals(appender.getSecurityPrincipalName(), props
            .getProperty(Context.SECURITY_PRINCIPAL));
        assertEquals(appender.getSecurityCredentials(), props
            .getProperty(Context.SECURITY_CREDENTIALS));
    
        assertEquals(0, context.getStatusManager().getCount());
      }
    
      @Test
      public void testStartMinimalInfo() {
        //let's leave only what's in the setup()
        //method, minus the providerURL
        appender.setProviderURL(null);
        appender.start();
        
        assertTrue(appender.isStarted());
        
        try {
          assertEquals(appender.topicBindingName, appender.topicPublisher.getTopic().getTopicName());
        } catch (Exception e) {
          fail();
        }
      }
      
      @Test
      public void testStartUserPass() {
        appender.setUserName("test");
        appender.setPassword("test");
        
        appender.start();
        
        assertTrue(appender.isStarted());
        
        try {
          assertEquals(appender.topicBindingName, appender.topicPublisher.getTopic().getTopicName());
        } catch (Exception e) {
          fail();
        }
      }
      
      @Test
      public void testStartFails() {
        appender.topicBindingName = null;
        
        appender.start();
        
        assertFalse(appender.isStarted());
      }
    
      private ILoggingEvent createLoggingEvent() {
        LoggingEvent le = new LoggingEvent();
        le.setLevel(Level.DEBUG);
        le.setMessage("test message");
        le.setTimeStamp(System.currentTimeMillis());
        le.setThreadName(Thread.currentThread().getName());
        return le;
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/JMSQueueAppenderTest.java���0000644�0001750�0001750�00000010505�12136042271�032510� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net;
    
    import java.io.Serializable;
    
    import javax.jms.ObjectMessage;
    
    import junit.framework.TestCase;
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.net.mock.MockQueue;
    import ch.qos.logback.classic.net.mock.MockQueueConnectionFactory;
    import ch.qos.logback.classic.net.mock.MockQueueSender;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.classic.spi.LoggingEvent;
    import ch.qos.logback.classic.util.MockInitialContext;
    import ch.qos.logback.classic.util.MockInitialContextFactory;
    import ch.qos.logback.core.ContextBase;
    import ch.qos.logback.core.spi.PreSerializationTransformer;
    
    public class JMSQueueAppenderTest extends TestCase {
    
      ch.qos.logback.core.Context context;
      JMSQueueAppender appender;
      PreSerializationTransformer<ILoggingEvent> pst = new LoggingEventPreSerializationTransformer();
      
      @Override
      protected void setUp() throws Exception {
        context = new ContextBase();
        appender = new JMSQueueAppender();
        appender.setContext(context);
        appender.setName("jmsQueue");
        appender.qcfBindingName = "queueCnxFactory";
        appender.queueBindingName = "testQueue";
        appender.setProviderURL("url");
        appender.setInitialContextFactoryName(MockInitialContextFactory.class.getName());
        
        MockInitialContext mic = MockInitialContextFactory.getContext();
        mic.map.put(appender.qcfBindingName, new MockQueueConnectionFactory());
        mic.map.put(appender.queueBindingName, new MockQueue(appender.queueBindingName));
        
        super.setUp();
      }
    
      @Override
      protected void tearDown() throws Exception {
        appender = null;
        context = null;
        super.tearDown();
      }
    
      public void testAppendOk() { 
        appender.start();
    
        ILoggingEvent le = createLoggingEvent();
        appender.append(le);
        
        MockQueueSender qs = (MockQueueSender)appender.queueSender;
        assertEquals(1, qs.getMessageList().size());
        ObjectMessage message = (ObjectMessage) qs.getMessageList().get(0);
        try {
          Serializable witness = pst.transform(le);
          assertEquals(witness, message.getObject());
        } catch (Exception e) {
          fail();
        }
      }
    
      public void testAppendFailure() {
        appender.start();
        
        //make sure the append method does not work
        appender.queueSender = null;
        
        ILoggingEvent le = createLoggingEvent();
        for (int i = 1; i <= 3; i++) {
          appender.append(le);
          assertEquals(i, context.getStatusManager().getCount());
          assertTrue(appender.isStarted());
        }
        appender.append(le);
        assertEquals(4, context.getStatusManager().getCount());
        assertFalse(appender.isStarted());
      }
    
      public void testStartMinimalInfo() {
        //let's leave only what's in the setup()
        //method, minus the providerURL
        appender.setProviderURL(null);
        appender.start();
        
        assertTrue(appender.isStarted());
        
        try {
          assertEquals(appender.queueBindingName, appender.queueSender.getQueue().getQueueName());
        } catch (Exception e) {
          fail();
        }
      }
      
      public void testStartUserPass() {
        appender.setUserName("test");
        appender.setPassword("test");
        
        appender.start();
        
        assertTrue(appender.isStarted());
        
        try {
          assertEquals(appender.queueBindingName, appender.queueSender.getQueue().getQueueName());
        } catch (Exception e) {
          fail();
        }
      }
      
      public void testStartFails() {
        appender.queueBindingName = null;
        
        appender.start();
        
        assertFalse(appender.isStarted());
      }
    
      private ILoggingEvent createLoggingEvent() {
        LoggingEvent le = new LoggingEvent();
        le.setLevel(Level.DEBUG);
        le.setMessage("test message");
        le.setTimeStamp(System.currentTimeMillis());
        le.setThreadName(Thread.currentThread().getName());
        return le;
      }
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/server/���������������������0000755�0001750�0001750�00000000000�12203357067�027204� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000151�00000000000�011562� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/server/MockSSLConfiguration.java������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/server/MockSSLConfiguration.0000644�0001750�0001750�00000003025�12136042271�033201� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net.server;
    
    import java.security.KeyManagementException;
    import java.security.KeyStoreException;
    import java.security.NoSuchAlgorithmException;
    import java.security.NoSuchProviderException;
    import java.security.UnrecoverableKeyException;
    import java.security.cert.CertificateException;
    
    import javax.net.ssl.SSLContext;
    
    import ch.qos.logback.core.net.ssl.SSLConfiguration;
    import ch.qos.logback.core.spi.ContextAware;
    
    /**
     * A mock {@link SSLConfiguration} with instrumentation for unit testing.
     *
     * @author Carl Harris
     */
    class MockSSLConfiguration extends SSLConfiguration {
    
      private boolean contextCreated;
      
      @Override
      public SSLContext createContext(ContextAware context)
          throws NoSuchProviderException, NoSuchAlgorithmException,
          KeyManagementException, UnrecoverableKeyException, KeyStoreException,
          CertificateException {
        contextCreated = true;
        return super.createContext(context);
      }
    
      public boolean isContextCreated() {
        return contextCreated;
      }
    
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000155�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/server/ServerSocketReceiverTest.java��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/server/ServerSocketReceiverT0000644�0001750�0001750�00000006143�12143151241�033350� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net.server;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertFalse;
    import static org.junit.Assert.assertNotNull;
    import static org.junit.Assert.assertSame;
    import static org.junit.Assert.assertTrue;
    
    import java.io.IOException;
    import java.net.ServerSocket;
    
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import ch.qos.logback.core.net.mock.MockContext;
    import ch.qos.logback.core.net.server.MockServerListener;
    import ch.qos.logback.core.net.server.MockServerRunner;
    import ch.qos.logback.core.net.server.ServerSocketUtil;
    import ch.qos.logback.core.status.ErrorStatus;
    import ch.qos.logback.core.status.Status;
    
    /**
     * Unit tests for {@link ServerSocketReceiver}.
     *
     * @author Carl Harris
     */
    public class ServerSocketReceiverTest {
    
      private MockContext context = new MockContext();
      
      private MockServerRunner<RemoteAppenderClient> runner = 
          new MockServerRunner<RemoteAppenderClient>();
      
      private MockServerListener<RemoteAppenderClient> listener = 
          new MockServerListener<RemoteAppenderClient>();
      
      private ServerSocket serverSocket;
      private InstrumentedServerSocketReceiver receiver;
      
      @Before
      public void setUp() throws Exception {
        serverSocket = ServerSocketUtil.createServerSocket();
        receiver = new InstrumentedServerSocketReceiver(serverSocket, listener, runner);
        receiver.setContext(context);
      }
      
      @After
      public void tearDown() throws Exception {
        serverSocket.close();
      }
      
      @Test
      public void testStartStop() throws Exception {
        receiver.start();
        assertTrue(runner.isContextInjected());
        assertTrue(runner.isRunning());
        assertSame(listener, receiver.getLastListener());
        
        receiver.stop();
        assertFalse(runner.isRunning());
      }
    
      @Test
      public void testStartWhenAlreadyStarted() throws Exception {
        receiver.start();
        receiver.start();
        assertEquals(1, runner.getStartCount());
      }
    
      @Test
      public void testStopThrowsException() throws Exception {
        receiver.start();
        assertTrue(receiver.isStarted());
        IOException ex = new IOException("test exception");
        runner.setStopException(ex);
        receiver.stop();
        
        Status status = context.getLastStatus();
        assertNotNull(status);    
        assertTrue(status instanceof ErrorStatus);
        assertTrue(status.getMessage().contains(ex.getMessage()));
        assertSame(ex, status.getThrowable());
      }
    
      @Test
      public void testStopWhenNotStarted() throws Exception {
        receiver.stop();
        assertEquals(0, runner.getStartCount());
      }
    
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000163�00000000000�011565� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/server/MockSSLParametersConfiguration.java��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/server/MockSSLParametersConf0000644�0001750�0001750�00000002076�12136042271�033232� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net.server;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.net.ssl.SSLParametersConfiguration;
    
    /**
     * A mock {@link SSLParametersConfiguration} with instrumentation for
     * unit testing.
     *
     * @author Carl Harris
     */
    class MockSSLParametersConfiguration extends SSLParametersConfiguration {
    
      private boolean contextInjected;
      
      @Override
      public void setContext(Context context) {
        contextInjected = true;
        super.setContext(context);
      }
    
      public boolean isContextInjected() {
        return contextInjected;
      }
      
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000167�00000000000�011571� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/server/ServerSocketReceiverFunctionalTest.java����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/server/ServerSocketReceiverF0000644�0001750�0001750�00000007055�12136042271�033341� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net.server;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertNotNull;
    import static org.junit.Assert.assertTrue;
    
    import java.io.ObjectOutputStream;
    import java.net.InetAddress;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.TimeUnit;
    
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.net.mock.MockAppender;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.classic.spi.LoggingEvent;
    import ch.qos.logback.classic.spi.LoggingEventVO;
    import ch.qos.logback.core.net.server.ServerSocketUtil;
    
    /**
     * A functional test for {@link ServerSocketReceiver}.
     * <p>
     * In this test we create a SocketServer, connect to it over the local
     * network interface, and validate that it receives messages and delivers
     * them to its appender.
     */
    public class ServerSocketReceiverFunctionalTest {
    
      private static final int EVENT_COUNT = 10;
      private static final int SHUTDOWN_DELAY = 10000;
      
      private MockAppender appender;
      private Logger logger;
      private ServerSocket serverSocket;
      private InstrumentedServerSocketReceiver receiver;
      private LoggerContext lc;
      
      @Before
      public void setUp() throws Exception {
        lc = new LoggerContext();
        
        appender = new MockAppender();
        appender.start();
       
        logger = lc.getLogger(getClass());
        logger.addAppender(appender);
    
        serverSocket = ServerSocketUtil.createServerSocket();
        
        receiver = new InstrumentedServerSocketReceiver(serverSocket);
            
        receiver.setContext(lc);
        receiver.start();
      }
      
      @After
      public void tearDown() throws Exception {
        receiver.stop();
        ExecutorService executor = lc.getExecutorService();
        executor.shutdownNow();
        executor.awaitTermination(SHUTDOWN_DELAY, TimeUnit.MILLISECONDS);
        assertTrue(executor.isTerminated());
      }
      
      @Test
      public void testLogEventFromClient() throws Exception {
        ILoggingEvent event = new LoggingEvent(logger.getName(), logger, 
            Level.DEBUG, "test message", null, new Object[0]);
        Socket socket = new Socket(InetAddress.getLocalHost(), 
            serverSocket.getLocalPort());
        
        try {      
          LoggingEventVO eventVO = LoggingEventVO.build(event);
          
          ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
          for (int i = 0; i < EVENT_COUNT; i++) {
            oos.writeObject(eventVO);
          }
    
          oos.writeObject(eventVO);
          oos.flush();
        }
        finally {
          socket.close();
        }
        
        ILoggingEvent rcvdEvent = appender.awaitAppend(SHUTDOWN_DELAY);
        assertNotNull(rcvdEvent);
        assertEquals(event.getLoggerName(), rcvdEvent.getLoggerName());
        assertEquals(event.getLevel(), rcvdEvent.getLevel());
        assertEquals(event.getMessage(), rcvdEvent.getMessage());
      }
    
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000160�00000000000�011562� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/server/SSLServerSocketReceiverTest.java�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/server/SSLServerSocketReceiv0000644�0001750�0001750�00000003175�12140555240�033265� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net.server;
    
    import static org.junit.Assert.assertNotNull;
    import static org.junit.Assert.assertTrue;
    
    import javax.net.ServerSocketFactory;
    
    import org.junit.Before;
    import org.junit.Test;
    
    import ch.qos.logback.core.net.mock.MockContext;
    
    /**
     * Unit tests for {@link SSLServerSocketReceiver}.
     *
     * @author Carl Harris
     */
    public class SSLServerSocketReceiverTest {
    
      private MockContext context = new MockContext();
      
      private MockSSLConfiguration ssl = new MockSSLConfiguration();
      
      private MockSSLParametersConfiguration parameters = 
          new MockSSLParametersConfiguration();
      
      private SSLServerSocketReceiver receiver = new SSLServerSocketReceiver();
      
      @Before
      public void setUp() throws Exception {
        receiver.setContext(context);
        receiver.setSsl(ssl);
        ssl.setParameters(parameters);
      }
      
      @Test
      public void testGetServerSocketFactory() throws Exception {
        ServerSocketFactory socketFactory = receiver.getServerSocketFactory();
        assertNotNull(socketFactory);
        assertTrue(ssl.isContextCreated());
        assertTrue(parameters.isContextInjected());
      }
    
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000163�00000000000�011565� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/server/RemoteAppenderStreamClientTest.java��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/server/RemoteAppenderStreamC0000644�0001750�0001750�00000005447�12143151241�033317� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net.server;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertNull;
    
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.ObjectOutputStream;
    
    import org.junit.Before;
    import org.junit.Test;
    import org.slf4j.LoggerFactory;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.net.mock.MockAppender;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.classic.spi.LoggingEvent;
    import ch.qos.logback.classic.spi.LoggingEventVO;
    
    /**
     * Unit tests for {@link RemoteAppenderStreamClient}.
     *
     * @author Carl Harris
     */
    public class RemoteAppenderStreamClientTest {
    
      private MockAppender appender;
      private Logger logger;
      private LoggingEvent event;
      private RemoteAppenderStreamClient client;
    
      @Before
      public void setUp() throws Exception {
        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
        
        appender = new MockAppender();
        appender.start();
       
        logger = lc.getLogger(getClass());
        logger.addAppender(appender);
    
        event = new LoggingEvent(logger.getName(), logger, 
            Level.DEBUG, "test message", null, new Object[0]);
        
        LoggingEventVO eventVO = LoggingEventVO.build(event);
        
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        oos.writeObject(eventVO);
        oos.close();
       
        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
        client = new RemoteAppenderStreamClient("some client ID", bis);
        client.setLoggerContext(lc);
      }
      
      @Test
      public void testWithEnabledLevel() throws Exception {
        logger.setLevel(Level.DEBUG);
        client.run();
        client.close();
        
        ILoggingEvent rcvdEvent = appender.getLastEvent();
        assertEquals(event.getLoggerName(), rcvdEvent.getLoggerName());
        assertEquals(event.getLevel(), rcvdEvent.getLevel());
        assertEquals(event.getMessage(), rcvdEvent.getMessage());
      }
    
      @Test
      public void testWithDisabledLevel() throws Exception {
        logger.setLevel(Level.INFO);
        client.run();
        client.close();
        assertNull(appender.getLastEvent());
      }
    
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000165�00000000000�011567� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/server/InstrumentedServerSocketReceiver.java������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/server/InstrumentedServerSoc0000644�0001750�0001750�00000005645�12143151241�033443� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net.server;
    
    import java.io.IOException;
    import java.net.InetAddress;
    import java.net.ServerSocket;
    import java.util.concurrent.Executor;
    
    import javax.net.ServerSocketFactory;
    
    import ch.qos.logback.classic.net.server.RemoteAppenderClient;
    import ch.qos.logback.classic.net.server.RemoteAppenderServerListener;
    import ch.qos.logback.classic.net.server.ServerSocketReceiver;
    import ch.qos.logback.core.net.server.ServerListener;
    import ch.qos.logback.core.net.server.ServerRunner;
    
    
    /**
     * A {@link ServerSocketReceiver} with instrumentation for unit testing.
     *
     * @author Carl Harris
     */
    public class InstrumentedServerSocketReceiver extends ServerSocketReceiver {
      
      private final ServerSocket serverSocket;
      private final ServerListener<RemoteAppenderClient> listener;
      private final ServerRunner<RemoteAppenderClient> runner;
      
      private ServerListener lastListener;
      
      public InstrumentedServerSocketReceiver(ServerSocket serverSocket) {
        this(serverSocket, new RemoteAppenderServerListener(serverSocket), null);
      }
      
      public InstrumentedServerSocketReceiver(ServerSocket serverSocket,
          ServerListener<RemoteAppenderClient> listener, 
          ServerRunner<RemoteAppenderClient> runner) {
        this.serverSocket = serverSocket;
        this.listener = listener;
        this.runner = runner;
      }
    
      @Override
      protected ServerSocketFactory getServerSocketFactory() throws Exception {
        return new ServerSocketFactory() {
    
          @Override
          public ServerSocket createServerSocket(int port) throws IOException {
            return serverSocket;
          }
    
          @Override
          public ServerSocket createServerSocket(int port, int backlog)
              throws IOException {
            return serverSocket;
          }
    
          @Override
          public ServerSocket createServerSocket(int port, int backlog,
              InetAddress ifAddress) throws IOException {
            return serverSocket;
          }        
        };
      }
    
      @Override
      protected ServerRunner createServerRunner(
          ServerListener<RemoteAppenderClient> listener,
          Executor executor) {
        lastListener = listener;
        return runner != null ? runner : super.createServerRunner(listener, executor);
      }
    
      @Override
      protected ServerListener<RemoteAppenderClient> createServerListener(
          ServerSocket socket) {
        return listener;
      }
    
      public ServerListener getLastListener() {
        return lastListener;
      }
    
    }�������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000146�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/ExternalMockSocketServer.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/ExternalMockSocketServer.jav0000644�0001750�0001750�00000005016�12136042271�033327� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net;
    
    import java.io.InputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.ArrayList;
    import java.util.List;
    
    public class ExternalMockSocketServer {
    
    	static final String LOGGINGEVENT = "LoggingEvent";
    	static final String LOGGINGEVENT2 = "LoggingEvent2";
    	static final String MINIMALEXT = "MinimalExt";
    	static final String MINIMALSER = "MinimalSer";
    
    	static final int PORT = 4560;
    
    	//static int loopLen;
    	static int clientNumber;
    
    	static List<String> msgList = new ArrayList<String>();
    	static boolean finished = false;
    
    	String className = LOGGINGEVENT;
    
    	public static void main(String[] args) {
    		if (args.length == 1) {
    			clientNumber = Integer.parseInt(args[0]);
    			//loopLen = Integer.parseInt((args[1]));
    			runServer();
    		} else {
    			usage("Wrong number of arguments.");
    		}
    	}
    
    	static void usage(String msg) {
    		System.err.println(msg);
    		System.err
    				.println("Usage: java " + ExternalMockSocketServer.class.getName()
    						+ " loopNumber");
    		System.exit(1);
    	}
    
    	static void runServer() {
    
    		try {
    			System.out.println("Starting Server...");
    			ServerSocket serverSocket = new ServerSocket(PORT);
    			System.out.println("Listening on port " + PORT);
    			for (int j = 0; j < clientNumber; j++) {
    				Socket socket = serverSocket.accept();
    				System.out.println("New client accepted.");
    				System.out.println("Connected to client at " + socket.getInetAddress());
    
    				InputStream is = socket.getInputStream();
    				long sum = 0;
    			
    				while (true) {
    					// this call is blocking
    					int val = is.read();
    					if(val == -1) {
    						break;
    					}
    					// if a byte is available, we skip it.
    					// this allows to pass all available bytes in a quick manner.
    					int a = is.available();
    					sum += a + 1;
    					is.skip(a);
    				}
    			  System.out.println(sum/1000 + " KB");
    			}
    			serverSocket.close();
    		} catch (Exception se) {
    			se.printStackTrace();
    		}
    		System.out.println("Server finished.");
    		finished = true;
    	}
    
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/DilutedSMTPAppenderTest.java0000644�0001750�0001750�00000007544�12136177166�033175� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertTrue;
    import static org.junit.Assert.fail;
    
    import javax.mail.Address;
    import javax.mail.MessagingException;
    
    import ch.qos.logback.core.helpers.CyclicBuffer;
    import ch.qos.logback.core.spi.CyclicBufferTracker;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.PatternLayout;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.classic.spi.LoggingEvent;
    import ch.qos.logback.core.Layout;
    
    public class DilutedSMTPAppenderTest {
    
      SMTPAppender appender;
      CyclicBufferTracker<ILoggingEvent> cbTracker;
      CyclicBuffer<ILoggingEvent> cb;
    
      @Before
      public void setUp() throws Exception {
        LoggerContext lc = new LoggerContext();
        appender = new SMTPAppender();
        appender.setContext(lc);
        appender.setName("smtp");
        appender.setFrom("user@host.dom");
        appender.setLayout(buildLayout(lc));
        appender.setSMTPHost("mail2.qos.ch");
        appender.setSubject("logging report");
        appender.addTo("sebastien.nospam@qos.ch");
        appender.start();
        cbTracker = appender.getCyclicBufferTracker();
        cb = cbTracker.getOrCreate("", 0);
    
      }
    
      private static Layout<ILoggingEvent> buildLayout(LoggerContext lc) {
        PatternLayout layout = new PatternLayout();
        layout.setContext(lc);
        layout.setFileHeader("Some header\n");
        layout.setPattern("%-4relative [%thread] %-5level %class - %msg%n");
        layout.setFileFooter("Some footer");
        layout.start();
        return layout;
      }
      
      @After
      public void tearDown() throws Exception {
        appender = null;
      }
    
      @Test
      public void testStart() {
        try {
          Address[] addressArray = appender.getMessage().getFrom();
          Address address = addressArray[0];
          assertEquals("user@host.dom", address.toString());
    
          addressArray = null;
          address = null;
    
          assertEquals("sebastien.nospam@qos.ch%nopex", appender.getToAsListOfString().get(0));
    
          assertEquals("logging report", appender.getSubject());
    
          assertTrue(appender.isStarted());
    
        } catch (MessagingException ex) {
          fail("Unexpected exception.");
        }
      }
    
      @Test
      public void testAppendNonTriggeringEvent() {
        LoggingEvent event = new LoggingEvent();
        event.setThreadName("thead name");
        event.setLevel(Level.DEBUG);
        appender.subAppend(cb, event);
        assertEquals(1, cb.length());
      }
    
      @Test
      public void testEntryConditionsCheck() {
        appender.checkEntryConditions();
        assertEquals(0, appender.getContext().getStatusManager().getCount());
      }
    
      @Test
      public void testEntryConditionsCheckNoMessage() {
        appender.setMessage(null);
        appender.checkEntryConditions();
        assertEquals(1, appender.getContext().getStatusManager().getCount());
      }
    
      @Test
      public void testTriggeringPolicy() {
        appender.setEvaluator(null);
        appender.checkEntryConditions();
        assertEquals(1, appender.getContext().getStatusManager().getCount());
      }
      
      @Test
      public void testEntryConditionsCheckNoLayout() {
        appender.setLayout(null);
        appender.checkEntryConditions();
        assertEquals(1, appender.getContext().getStatusManager().getCount());
      }
      
      
    
      
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/SocketMin.java��������������0000644�0001750�0001750�00000006027�12137261161�030435� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net;
    
    import java.io.InputStreamReader;
    
    import org.slf4j.LoggerFactory;
    
    import ch.qos.logback.classic.BasicConfigurator;
    import ch.qos.logback.classic.Logger;
    
    public class SocketMin {
    
      static Logger logger = (Logger) LoggerFactory.getLogger(SocketMin.class
          .getName());
      static SocketAppender s;
    
      public static void main(String argv[]) {
        if (argv.length == 3) {
          init(argv[0], argv[1]);
        } else {
          usage("Wrong number of arguments.");
        }
    
        // NDC.push("some context");
        if (argv[2].equals("true")) {
          loop();
        } else {
          test();
        }
    
        s.stop();
      }
    
      static void usage(String msg) {
        System.err.println(msg);
        System.err.println("Usage: java " + SocketMin.class
            + " host port true|false");
        System.exit(1);
      }
    
      static void init(String host, String portStr) {
        Logger root = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
        BasicConfigurator.configure(root.getLoggerContext());
        try {
          int port = Integer.parseInt(portStr);
          logger.info("Creating socket appender (" + host + "," + port + ").");
          s = new SocketAppender();
          s.setRemoteHost(host);
          s.setPort(port);
          s.setName("S");
          root.addAppender(s);
        } catch (java.lang.NumberFormatException e) {
          e.printStackTrace();
          usage("Could not interpret port number [" + portStr + "].");
        } catch (Exception e) {
          System.err.println("Could not start!");
          e.printStackTrace();
          System.exit(1);
        }
      }
    
      static void loop() {
        Logger root = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
        InputStreamReader in = new InputStreamReader(System.in);
        System.out.println("Type 'q' to quit");
        int i;
        int k = 0;
        while (true) {
          logger.debug("Message " + k++);
          logger.info("Message " + k++);
          logger.warn("Message " + k++);
          logger.error("Message " + k++, new Exception("Just testing"));
          try {
            i = in.read();
          } catch (Exception e) {
            return;
          }
          if (i == -1)
            break;
          if (i == 'q')
            break;
          if (i == 'r') {
            System.out.println("Removing appender S");
            root.detachAppender("S");
          }
        }
      }
    
      static void test() {
        int i = 0;
        logger.debug("Message " + i++);
        logger.info("Message " + i++);
        logger.warn("Message " + i++);
        logger.error("Message " + i++);
        logger.debug("Message " + i++, new Exception("Just testing."));
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/PackageTest.java������������0000644�0001750�0001750�00000001715�12140555240�030731� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net;
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    import org.junit.runners.Suite.SuiteClasses;
    
    @RunWith(Suite.class)
    @SuiteClasses( { SyslogAppenderTest.class, DilutedSMTPAppenderTest.class,
            JMSQueueAppenderTest.class, JMSTopicAppenderTest.class,
            SMTPAppender_GreenTest.class, SMTPAppender_SubethaSMTPTest.class,
            SocketReceiverTest.class, SSLSocketReceiverTest.class })
    public class PackageTest {
    }���������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000152�00000000000�011563� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/SMTPAppender_SubethaSMTPTest.java�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/SMTPAppender_SubethaSMTPTest0000644�0001750�0001750�00000031434�12136042271�033100� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertNotNull;
    import static org.junit.Assert.assertTrue;
    
    import java.io.ByteArrayOutputStream;
    import java.util.List;
    import java.util.Random;
    import java.util.concurrent.ThreadPoolExecutor;
    import java.util.concurrent.TimeUnit;
    
    import javax.mail.Part;
    import javax.mail.internet.MimeMessage;
    import javax.mail.internet.MimeMultipart;
    
    import org.dom4j.io.SAXReader;
    import org.junit.*;
    import org.subethamail.smtp.AuthenticationHandler;
    import org.subethamail.smtp.AuthenticationHandlerFactory;
    import org.subethamail.smtp.auth.LoginAuthenticationHandler;
    import org.subethamail.smtp.auth.LoginFailedException;
    import org.subethamail.smtp.auth.PlainAuthenticationHandler;
    import org.subethamail.smtp.auth.PluginAuthenticationHandler;
    import org.subethamail.smtp.auth.UsernamePasswordValidator;
    import org.subethamail.smtp.server.MessageListenerAdapter;
    import org.subethamail.wiser.Wiser;
    import org.subethamail.wiser.WiserMessage;
    
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.PatternLayout;
    import ch.qos.logback.classic.html.HTMLLayout;
    import ch.qos.logback.classic.html.XHTMLEntityResolver;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.Layout;
    import ch.qos.logback.core.util.StatusPrinter;
    
    public class SMTPAppender_SubethaSMTPTest {
      static final String TEST_SUBJECT = "test subject";
      static final String HEADER = "HEADER\n";
      static final String FOOTER = "FOOTER\n";
    
      static int DIFF = 1024 + new Random().nextInt(30000);
      static Wiser WISER;
    
      SMTPAppender smtpAppender;
      LoggerContext loggerContext = new LoggerContext();
    
      int numberOfOldMessages;
    
    
      @BeforeClass
      static public void beforeClass() {
        WISER = new Wiser();
        WISER.setPort(DIFF);
        WISER.start();
      }
    
      @AfterClass
      static public void afterClass() throws Exception {
        WISER.stop();
      }
    
      @Before
      public void setUp() throws Exception {
        numberOfOldMessages = WISER.getMessages().size();
        buildSMTPAppender();
      }
    
      @After
      public void tearDown() {
        // clear any authentication handler factory
        MessageListenerAdapter mla = (MessageListenerAdapter) WISER.getServer().getMessageHandlerFactory();
        mla.setAuthenticationHandlerFactory(null);
      }
    
      void buildSMTPAppender() throws Exception {
        smtpAppender = new SMTPAppender();
        smtpAppender.setContext(loggerContext);
        smtpAppender.setName("smtp");
        smtpAppender.setFrom("user@host.dom");
        smtpAppender.setSMTPHost("localhost");
        smtpAppender.setSMTPPort(DIFF);
        smtpAppender.setSubject(TEST_SUBJECT);
        smtpAppender.addTo("noreply@qos.ch");
      }
    
      private Layout<ILoggingEvent> buildPatternLayout(LoggerContext lc) {
        PatternLayout layout = new PatternLayout();
        layout.setContext(lc);
        layout.setFileHeader(HEADER);
        layout.setPattern("%-4relative [%thread] %-5level %logger %class - %msg%n");
        layout.setFileFooter(FOOTER);
        layout.start();
        return layout;
      }
    
      private Layout<ILoggingEvent> buildHTMLLayout(LoggerContext lc) {
        HTMLLayout layout = new HTMLLayout();
        layout.setContext(lc);
        // layout.setFileHeader(HEADER);
        layout.setPattern("%level%class%msg");
        // layout.setFileFooter(FOOTER);
        layout.start();
        return layout;
      }
    
    
      private static String getWholeMessage(Part msg) {
        try {
          ByteArrayOutputStream bodyOut = new ByteArrayOutputStream();
          msg.writeTo(bodyOut);
          return bodyOut.toString("US-ASCII").trim();
        } catch (Exception e) {
          throw new RuntimeException(e);
        }
      }
    
      void waitUntilEmailIsSent() throws Exception {
        System.out.println("About to wait for sending thread to finish");
        loggerContext.getExecutorService().shutdown();
        loggerContext.getExecutorService().awaitTermination(3000, TimeUnit.MILLISECONDS);
      }
    
      private static String getBody(Part msg) {
        String all = getWholeMessage(msg);
        int i = all.indexOf("\r\n\r\n");
        return all.substring(i + 4, all.length());
      }
    
      @Test
      public void smoke() throws Exception {
        smtpAppender.setLayout(buildPatternLayout(loggerContext));
        smtpAppender.start();
        Logger logger = loggerContext.getLogger("test");
        logger.addAppender(smtpAppender);
        logger.debug("hello");
        logger.error("en error", new Exception("an exception"));
    
        waitUntilEmailIsSent();
        System.out.println("*** " + ((ThreadPoolExecutor) loggerContext.getExecutorService()).getCompletedTaskCount());
        List<WiserMessage> wiserMsgList = WISER.getMessages();
    
        assertNotNull(wiserMsgList);
        assertEquals(numberOfOldMessages+1, wiserMsgList.size());
        WiserMessage wm = wiserMsgList.get(numberOfOldMessages);
        // http://jira.qos.ch/browse/LBCLASSIC-67
        MimeMessage mm = wm.getMimeMessage();
        assertEquals(TEST_SUBJECT, mm.getSubject());
    
        MimeMultipart mp = (MimeMultipart) mm.getContent();
        String body = getBody(mp.getBodyPart(0));
        System.out.println("[" + body);
        assertTrue(body.startsWith(HEADER.trim()));
        assertTrue(body.endsWith(FOOTER.trim()));
      }
    
    
      @Test
      public void html() throws Exception {
    
        smtpAppender.setLayout(buildHTMLLayout(loggerContext));
        smtpAppender.start();
        Logger logger = loggerContext.getLogger("test");
        logger.addAppender(smtpAppender);
        logger.debug("hello");
        logger.error("en error", new Exception("an exception"));
        waitUntilEmailIsSent();
    
        List<WiserMessage> wiserMsgList = WISER.getMessages();
    
        assertNotNull(wiserMsgList);
        assertEquals(numberOfOldMessages + 1, wiserMsgList.size());
        WiserMessage wm = wiserMsgList.get(numberOfOldMessages);
        MimeMessage mm = wm.getMimeMessage();
        assertEquals(TEST_SUBJECT, mm.getSubject());
    
        MimeMultipart mp = (MimeMultipart) mm.getContent();
    
        // verify strict adherence to xhtml1-strict.dtd
        SAXReader reader = new SAXReader();
        reader.setValidation(true);
        reader.setEntityResolver(new XHTMLEntityResolver());
        reader.read(mp.getBodyPart(0).getInputStream());
        // System.out.println(GreenMailUtil.getBody(mp.getBodyPart(0)));
      }
    
      @Test
      /**
       * Checks that even when many events are processed, the output is still
       * conforms to xhtml-strict.dtd.
       *
       * Note that SMTPAppender only keeps only 500 or so (=buffer size) events. So
       * the generated output will be rather short.
       */
      public void htmlLong() throws Exception {
        smtpAppender.setLayout(buildHTMLLayout(loggerContext));
        smtpAppender.start();
        Logger logger = loggerContext.getLogger("test");
        logger.addAppender(smtpAppender);
        for (int i = 0; i < CoreConstants.TABLE_ROW_LIMIT * 3; i++) {
          logger.debug("hello " + i);
        }
        logger.error("en error", new Exception("an exception"));
        waitUntilEmailIsSent();
        List<WiserMessage> wiserMsgList = WISER.getMessages();
    
        assertNotNull(wiserMsgList);
        assertEquals(numberOfOldMessages + 1, wiserMsgList.size());
        WiserMessage wm = wiserMsgList.get(numberOfOldMessages);
        MimeMessage mm = wm.getMimeMessage();
        assertEquals(TEST_SUBJECT, mm.getSubject());
    
        MimeMultipart mp = (MimeMultipart) mm.getContent();
    
        // verify strict adherence to xhtml1-strict.dtd
        SAXReader reader = new SAXReader();
        reader.setValidation(true);
        reader.setEntityResolver(new XHTMLEntityResolver());
        reader.read(mp.getBodyPart(0).getInputStream());
      }
    
      @Test
      public void authenticated() throws Exception {
        MessageListenerAdapter mla = (MessageListenerAdapter) WISER.getServer().getMessageHandlerFactory();
        mla.setAuthenticationHandlerFactory(new TrivialAuthHandlerFactory());
    
        smtpAppender.setUsername("x");
        smtpAppender.setPassword("x");
    
        smtpAppender.setLayout(buildPatternLayout(loggerContext));
        smtpAppender.start();
        Logger logger = loggerContext.getLogger("test");
        logger.addAppender(smtpAppender);
        logger.debug("hello");
        logger.error("en error", new Exception("an exception"));
        waitUntilEmailIsSent();
        List<WiserMessage> wiserMsgList = WISER.getMessages();
    
        assertNotNull(wiserMsgList);
        assertEquals(numberOfOldMessages + 1, wiserMsgList.size());
        WiserMessage wm = wiserMsgList.get(numberOfOldMessages);
        // http://jira.qos.ch/browse/LBCLASSIC-67
        MimeMessage mm = wm.getMimeMessage();
        assertEquals(TEST_SUBJECT, mm.getSubject());
    
        MimeMultipart mp = (MimeMultipart) mm.getContent();
        String body = getBody(mp.getBodyPart(0));
        assertTrue(body.startsWith(HEADER.trim()));
        assertTrue(body.endsWith(FOOTER.trim()));
      }
    
      @Test
      @Ignore
      // Unfortunately, there seems to be a problem with SubethaSMTP's implementation
      // of startTLS. The same SMTPAppender code works fine when tested with gmail.
      public void authenticatedSSL() throws Exception {
        MessageListenerAdapter mla = (MessageListenerAdapter) WISER.getServer().getMessageHandlerFactory();
        mla.setAuthenticationHandlerFactory(new TrivialAuthHandlerFactory());
    
    
        smtpAppender.setSTARTTLS(true);
        smtpAppender.setUsername("xx");
        smtpAppender.setPassword("xx");
    
        smtpAppender.setLayout(buildPatternLayout(loggerContext));
        smtpAppender.start();
        Logger logger = loggerContext.getLogger("test");
        logger.addAppender(smtpAppender);
        logger.debug("hello");
        logger.error("en error", new Exception("an exception"));
    
        waitUntilEmailIsSent();
        List<WiserMessage> wiserMsgList = WISER.getMessages();
    
        assertNotNull(wiserMsgList);
        assertEquals(1, wiserMsgList.size());
      }
    
      @Test
      @Ignore
      public void authenticatedGmailStartTLS() throws Exception {
        smtpAppender.setSMTPHost("smtp.gmail.com");
        smtpAppender.setSMTPPort(587);
    
        smtpAppender.addTo("XXX@gmail.com");
        smtpAppender.setSTARTTLS(true);
        smtpAppender.setUsername("XXX@gmail.com");
        smtpAppender.setPassword("XXX");
    
        smtpAppender.setLayout(buildPatternLayout(loggerContext));
        smtpAppender.start();
        Logger logger = loggerContext.getLogger("authenticatedGmailSTARTTLS");
        logger.addAppender(smtpAppender);
        logger.debug("hello");
        logger.error("en error", new Exception("an exception"));
    
        StatusPrinter.print(loggerContext);
      }
    
      @Test
      @Ignore
      public void authenticatedGmail_SSL() throws Exception {
        smtpAppender.setSMTPHost("smtp.gmail.com");
        smtpAppender.setSMTPPort(465);
    
        smtpAppender.addTo("XXX@gmail.com");
        smtpAppender.setSSL(true);
        smtpAppender.setUsername("XXX@gmail.com");
        smtpAppender.setPassword("XXX");
    
        smtpAppender.setLayout(buildPatternLayout(loggerContext));
        smtpAppender.start();
        Logger logger = loggerContext.getLogger("authenticatedGmail_SSL");
        logger.addAppender(smtpAppender);
        logger.debug("hello");
        logger.error("en error", new Exception("an exception"));
    
        StatusPrinter.print(loggerContext);
      }
    
      @Test
      public void testMultipleTo() throws Exception {
        smtpAppender.setLayout(buildPatternLayout(loggerContext));
        smtpAppender.addTo("Test <test@example.com>, other-test@example.com");
        smtpAppender.start();
        Logger logger = loggerContext.getLogger("test");
        logger.addAppender(smtpAppender);
        logger.debug("hello");
        logger.error("en error", new Exception("an exception"));
        waitUntilEmailIsSent();
    
        List<WiserMessage> wiserMsgList = WISER.getMessages();
        assertNotNull(wiserMsgList);
        assertEquals(numberOfOldMessages + 3, wiserMsgList.size());
      }
    
      public class TrivialAuthHandlerFactory implements AuthenticationHandlerFactory {
        public AuthenticationHandler create() {
          PluginAuthenticationHandler ret = new PluginAuthenticationHandler();
          UsernamePasswordValidator validator = new UsernamePasswordValidator() {
            public void login(String username, String password)
                    throws LoginFailedException {
              if (!username.equals(password)) {
                throw new LoginFailedException("username=" + username + ", password=" + password);
              }
            }
          };
          ret.addPlugin(new PlainAuthenticationHandler(validator));
          ret.addPlugin(new LoginAuthenticationHandler(validator));
          return ret;
        }
      }
    
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/SocketReceiverTest.java�����0000644�0001750�0001750�00000021736�12143151241�032314� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertFalse;
    import static org.junit.Assert.assertNotNull;
    import static org.junit.Assert.assertNull;
    import static org.junit.Assert.assertTrue;
    
    import java.io.IOException;
    import java.io.ObjectOutputStream;
    import java.net.InetAddress;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.net.UnknownHostException;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.TimeUnit;
    
    import javax.net.SocketFactory;
    
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.net.mock.MockAppender;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.classic.spi.LoggingEvent;
    import ch.qos.logback.classic.spi.LoggingEventVO;
    import ch.qos.logback.core.net.SocketConnector;
    import ch.qos.logback.core.net.server.ServerSocketUtil;
    import ch.qos.logback.core.status.Status;
    
    /**
     * Unit tests for {@link SocketReceiver}.
     *
     * @author Carl Harris
     */
    public class SocketReceiverTest {
    
      private static final int DELAY = 1000;
      private static final String TEST_HOST_NAME = "NOT.A.VALID.HOST.NAME";
    
    
      private ServerSocket serverSocket;
      private Socket socket;
      private MockSocketFactory socketFactory = new MockSocketFactory();
      private MockSocketConnector connector;
      private MockAppender appender;
      private LoggerContext lc;
      private Logger logger;
      
      private InstrumentedSocketReceiver receiver = 
          new InstrumentedSocketReceiver();
      
      @Before
      public void setUp() throws Exception {
        serverSocket = ServerSocketUtil.createServerSocket();
        socket = new Socket(serverSocket.getInetAddress(), 
            serverSocket.getLocalPort());
        connector = new MockSocketConnector(socket);
    
        lc = new LoggerContext();
        lc.reset();
        receiver.setContext(lc);    
        appender = new MockAppender();
        appender.start();
        logger = lc.getLogger(getClass());
        logger.addAppender(appender);
      }
      
      @After
      public void tearDown() throws Exception {
        receiver.stop();
        ExecutorService executor = lc.getExecutorService();
        executor.shutdownNow();
        assertTrue(executor.awaitTermination(DELAY, TimeUnit.MILLISECONDS));
        socket.close();
        serverSocket.close();
        lc.stop();
      }
      
      @Test
      public void testStartNoRemoteAddress() throws Exception {
        receiver.start();
        assertFalse(receiver.isStarted());
        int count = lc.getStatusManager().getCount();
        Status status = lc.getStatusManager().getCopyOfStatusList().get(count - 1);
        assertTrue(status.getMessage().contains("host"));
      }
    
      @Test
      public void testStartNoPort() throws Exception {
        receiver.setRemoteHost(TEST_HOST_NAME);
        receiver.start();
        assertFalse(receiver.isStarted());
        int count = lc.getStatusManager().getCount();
        Status status = lc.getStatusManager().getCopyOfStatusList().get(count - 1);
        assertTrue(status.getMessage().contains("port"));
      }
    
      @Test
      public void testStartUnknownHost() throws Exception {
        receiver.setPort(6000);
        receiver.setRemoteHost(TEST_HOST_NAME);
        receiver.start();
        assertFalse(receiver.isStarted());
        int count = lc.getStatusManager().getCount();
        Status status = lc.getStatusManager().getCopyOfStatusList().get(count - 1);
        assertTrue(status.getMessage().contains("unknown host"));
      }
      
      @Test
      public void testStartStop() throws Exception {
        receiver.setRemoteHost(InetAddress.getLocalHost().getHostName());
        receiver.setPort(6000);
        receiver.setAcceptConnectionTimeout(DELAY / 2);
        receiver.start();
        assertTrue(receiver.isStarted());
        receiver.awaitConnectorCreated(DELAY);
        receiver.stop();
        assertFalse(receiver.isStarted());
      }
      
      @Test
      public void testServerSlowToAcceptConnection() throws Exception {
        receiver.setRemoteHost(InetAddress.getLocalHost().getHostName());
        receiver.setPort(6000);
        receiver.setAcceptConnectionTimeout(DELAY / 4);
        receiver.start();
        assertTrue(receiver.awaitConnectorCreated(DELAY / 2));
        // note that we don't call serverSocket.accept() here
        // but processPriorToRemoval (in tearDown) should still clean up everything
      }
    
      @Test
      public void testServerDropsConnection() throws Exception {
        receiver.setRemoteHost(InetAddress.getLocalHost().getHostName());
        receiver.setPort(6000);
        receiver.start();
        assertTrue(receiver.awaitConnectorCreated(DELAY));
        Socket socket = serverSocket.accept();
        socket.close();
      }
      
      @Test
      public void testDispatchEventForEnabledLevel() throws Exception {
        receiver.setRemoteHost(InetAddress.getLocalHost().getHostName());
        receiver.setPort(6000);
        receiver.start();
        assertTrue(receiver.awaitConnectorCreated(DELAY));
        Socket socket = serverSocket.accept();
    
        ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
        
        logger.setLevel(Level.DEBUG);
        ILoggingEvent event = new LoggingEvent(logger.getName(), logger, 
            Level.DEBUG, "test message", null, new Object[0]);
    
        LoggingEventVO eventVO = LoggingEventVO.build(event);
        oos.writeObject(eventVO);
        oos.flush();
    
        ILoggingEvent rcvdEvent = appender.awaitAppend(DELAY);
        assertNotNull(rcvdEvent);
        assertEquals(event.getLoggerName(), rcvdEvent.getLoggerName());
        assertEquals(event.getLevel(), rcvdEvent.getLevel());
        assertEquals(event.getMessage(), rcvdEvent.getMessage());
      }
    
      @Test
      public void testNoDispatchEventForDisabledLevel() throws Exception {
        receiver.setRemoteHost(InetAddress.getLocalHost().getHostName());
        receiver.setPort(6000);
        receiver.start();
        assertTrue(receiver.awaitConnectorCreated(DELAY));
        Socket socket = serverSocket.accept();
    
        ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
        
        logger.setLevel(Level.INFO);
        ILoggingEvent event = new LoggingEvent(logger.getName(), logger, 
            Level.DEBUG, "test message", null, new Object[0]);
    
        LoggingEventVO eventVO = LoggingEventVO.build(event);
        oos.writeObject(eventVO);
        oos.flush();
    
        assertNull(appender.awaitAppend(DELAY));
      }
    
      /**
       * A {@link SocketReceiver} with instrumentation for unit testing.
       */
      private class InstrumentedSocketReceiver extends SocketReceiver {
    
        private boolean connectorCreated;
    
        @Override
        protected synchronized SocketConnector newConnector(
            InetAddress address, int port, int initialDelay, int retryDelay) {
          connectorCreated = true;
          notifyAll();
          return connector;
        }
    
        @Override
        protected SocketFactory getSocketFactory() {
          return socketFactory;
        }
    
        public synchronized boolean awaitConnectorCreated(long delay) 
            throws InterruptedException {
          while (!connectorCreated) {
            wait(delay);
          }
          return connectorCreated;
        }
    
      }
      
      /**
       * A {@link SocketConnector} with instrumentation for unit testing.
       */
      private static class MockSocketConnector implements SocketConnector {
    
        private final Socket socket;
        
        public MockSocketConnector(Socket socket) {
          this.socket = socket;
        }
    
        public Socket call() throws InterruptedException {
          return socket;
        }
    
        public void setExceptionHandler(ExceptionHandler exceptionHandler) {
        }
    
        public void setSocketFactory(SocketFactory socketFactory) {
        }
    
      }
    
      /**
       * A no-op {@link SocketFactory} to support unit testing.
       */
      private static class MockSocketFactory extends SocketFactory {
    
        @Override
        public Socket createSocket(InetAddress address, int port,
            InetAddress localAddress, int localPort) throws IOException {
          throw new UnsupportedOperationException();
        }
    
        @Override
        public Socket createSocket(InetAddress host, int port) throws IOException {
          throw new UnsupportedOperationException();
        }
    
        @Override
        public Socket createSocket(String host, int port, InetAddress localHost,
            int localPort) throws IOException, UnknownHostException {
          throw new UnsupportedOperationException();
        }
    
        @Override
        public Socket createSocket(String host, int port) throws IOException,
            UnknownHostException {
          throw new UnsupportedOperationException();
        }
        
      }
      
    }
    ����������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/JMSQueueAppenderTestApp.java0000644�0001750�0001750�00000004013�12136042271�033146� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net;
    
    import org.slf4j.LoggerFactory;
    
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.core.util.StatusPrinter;
    
    public class JMSQueueAppenderTestApp {
      
      public static void main(String[] args) {
        Logger logger = (Logger)LoggerFactory.getLogger(JMSTopicAppenderTestApp.class);
        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
        lc.reset();
        
        JMSQueueAppender appender = new JMSQueueAppender();
        appender.setContext(lc);
        appender.setName("jmsQueue");
        appender.setInitialContextFactoryName("org.apache.activemq.jndi.ActiveMQInitialContextFactory");
        //appender.setPassword("");
        appender.setProviderURL("tcp://localhost:61616");
        //appender.setSecurityCredentials("");
        //appender.setSecurityPrincipalName("");
        appender.setQueueBindingName("MyQueue");
        appender.setQueueConnectionFactoryBindingName("ConnectionFactory");
        //appender.setURLPkgPrefixes("");
        //appender.setUserName("");
        
        appender.start();
        logger.addAppender(appender);
        
        //JIT
        for (int i = 0; i < 10000; i++) {
          logger.debug("** Hello world. n=" + i);
        }
        
        long before = System.nanoTime();
        for (int i = 0; i < 10000; i++) {
          logger.debug("** Hello world. n=" + i);
        }
        long after = System.nanoTime();
        
        System.out.println("Time per logs for 10'000 logs: " + (after-before)/10000);
        
        StatusPrinter.print(lc.getStatusManager());
      }
    
    }���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/SyslogAppenderTest.java�����0000644�0001750�0001750�00000017421�12136042271�032336� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertTrue;
    
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    import org.slf4j.LoggerFactory;
    
    import ch.qos.logback.classic.ClassicTestConstants;
    import ch.qos.logback.classic.Logger;
    import ch.qos.logback.classic.LoggerContext;
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.classic.net.mock.MockSyslogServer;
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.net.SyslogConstants;
    import ch.qos.logback.core.recovery.RecoveryCoordinator;
    import ch.qos.logback.core.testUtil.RandomUtil;
    import ch.qos.logback.core.util.StatusPrinter;
    
    public class SyslogAppenderTest {
    
      LoggerContext lc = new LoggerContext();
      SyslogAppender sa = new SyslogAppender();
      MockSyslogServer mockServer;
      String loggerName = this.getClass().getName();
      Logger logger = lc.getLogger(loggerName);
    
      @Before
      public void setUp() throws Exception {
        lc.setName("test");
        sa.setContext(lc);
      }
    
      @After
      public void tearDown() throws Exception {
      }
    
      public void setMockServerAndConfigure(int expectedCount, String suffixPattern)
          throws InterruptedException {
        int port = RandomUtil.getRandomServerPort();
    
        mockServer = new MockSyslogServer(expectedCount, port);
        mockServer.start();
        // give MockSyslogServer head start
    
        Thread.sleep(100);
    
        sa.setSyslogHost("localhost");
        sa.setFacility("MAIL");
        sa.setPort(port);
        sa.setSuffixPattern(suffixPattern);
        sa.setStackTracePattern("[%thread] foo "+CoreConstants.TAB);
        sa.start();
        assertTrue(sa.isStarted());
    
        String loggerName = this.getClass().getName();
        Logger logger = lc.getLogger(loggerName);
        logger.addAppender(sa);
    
      }
      
      public void setMockServerAndConfigure(int expectedCount)
    	      throws InterruptedException {
    	 this.setMockServerAndConfigure(expectedCount, "[%thread] %logger %msg");   
      }
    
      @Test
      public void basic() throws InterruptedException {
    
        setMockServerAndConfigure(1);
        String logMsg = "hello";
        logger.debug(logMsg);
    
        // wait max 2 seconds for mock server to finish. However, it should
        // much sooner than that.
        mockServer.join(8000);
    
        assertTrue(mockServer.isFinished());
        assertEquals(1, mockServer.getMessageList().size());
        String msg = mockServer.getMessageList().get(0);
    
        String threadName = Thread.currentThread().getName();
    
        String expected = "<"
            + (SyslogConstants.LOG_MAIL + SyslogConstants.DEBUG_SEVERITY) + ">";
        assertTrue(msg.startsWith(expected));
    
        String first = "<\\d{2}>\\w{3} \\d{2} \\d{2}(:\\d{2}){2} [\\w.-]* ";
        checkRegexMatch(msg, first + "\\[" + threadName + "\\] " + loggerName + " "
            + logMsg);
    
      }
      
      @Test
      public void suffixPatternWithTag() throws InterruptedException {
        setMockServerAndConfigure(1, "test/something [%thread] %logger %msg");
        String logMsg = "hello";
        logger.debug(logMsg);
    
        // wait max 2 seconds for mock server to finish. However, it should
        // much sooner than that.
        mockServer.join(8000);
    
        assertTrue(mockServer.isFinished());
        assertEquals(1, mockServer.getMessageList().size());
        String msg = mockServer.getMessageList().get(0);
    
        String threadName = Thread.currentThread().getName();
    
        String expected = "<"
            + (SyslogConstants.LOG_MAIL + SyslogConstants.DEBUG_SEVERITY) + ">";
        assertTrue(msg.startsWith(expected));
    
        String first = "<\\d{2}>\\w{3} \\d{2} \\d{2}(:\\d{2}){2} [\\w.-]* ";
        checkRegexMatch(msg, first + "test/something \\[" + threadName + "\\] " + loggerName + " "
                + logMsg);
    
      }
    
      @Test
      public void tException() throws InterruptedException {
        setMockServerAndConfigure(21);
    
        String logMsg = "hello";
        String exMsg = "just testing";
        Exception ex = new Exception(exMsg);
        logger.debug(logMsg, ex);
        StatusPrinter.print(lc);
    
        // wait max 2 seconds for mock server to finish. However, it should
        // much sooner than that.
        mockServer.join(8000);
        assertTrue(mockServer.isFinished());
    
        // message + 20 lines of stacktrace
        assertEquals(21, mockServer.getMessageList().size());
        // int i = 0;
        // for (String line: mockServer.msgList) {
        // System.out.println(i++ + ": " + line);
        // }
    
        String msg = mockServer.getMessageList().get(0);
        String expected = "<"
            + (SyslogConstants.LOG_MAIL + SyslogConstants.DEBUG_SEVERITY) + ">";
        assertTrue(msg.startsWith(expected));
    
        String expectedPrefix = "<\\d{2}>\\w{3} \\d{2} \\d{2}(:\\d{2}){2} [\\w.-]* ";
        String threadName = Thread.currentThread().getName();
        String regex = expectedPrefix + "\\[" + threadName + "\\] " + loggerName
            + " " + logMsg;
        checkRegexMatch(msg, regex);
    
        msg = mockServer.getMessageList().get(1);
        assertTrue(msg.contains(ex.getClass().getName()));
        assertTrue(msg.contains(ex.getMessage()));
    
        msg = mockServer.getMessageList().get(2);
        assertTrue(msg.startsWith(expected));
        regex = expectedPrefix + "\\[" + threadName + "\\] " +  "foo "+CoreConstants.TAB + "at ch\\.qos.*";
        checkRegexMatch(msg, regex);
      }
    
      private void checkRegexMatch(String s, String regex) {
        assertTrue("The string [" + s + "] did not match regex [" + regex + "]", s
            .matches(regex));
      }
    
      @Test
      public void large() throws InterruptedException {
        setMockServerAndConfigure(2);
        StringBuilder largeBuf = new StringBuilder();
        for (int i = 0; i < 2 * 1024 * 1024; i++) {
          largeBuf.append('a');
        }
        logger.debug(largeBuf.toString());
    
        String logMsg = "hello";
        logger.debug(logMsg);
        Thread.sleep(RecoveryCoordinator.BACKOFF_COEFFICIENT_MIN+10);
        logger.debug(logMsg);
        
        mockServer.join(8000);
        assertTrue(mockServer.isFinished());
     
       // both messages received
        assertEquals(2, mockServer.getMessageList().size());
    
       String expected = "<"
            + (SyslogConstants.LOG_MAIL + SyslogConstants.DEBUG_SEVERITY) + ">";
        String expectedPrefix = "<\\d{2}>\\w{3} \\d{2} \\d{2}(:\\d{2}){2} [\\w.-]* ";
        String threadName = Thread.currentThread().getName();
    
        // large message is truncated
        String largeMsg = mockServer.getMessageList().get(0);
        assertTrue(largeMsg.startsWith(expected));
        String largeRegex = expectedPrefix + "\\[" + threadName + "\\] " + loggerName
            + " " + "a{64000,66000}";
        checkRegexMatch(largeMsg, largeRegex);
    
        String msg = mockServer.getMessageList().get(1);
        assertTrue(msg.startsWith(expected));
        String regex = expectedPrefix + "\\[" + threadName + "\\] " + loggerName
            + " " + logMsg;
        checkRegexMatch(msg, regex);
      }
    
      @Test
      public void LBCLASSIC_50() throws JoranException {
    
        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
    
        JoranConfigurator configurator = new JoranConfigurator();
        configurator.setContext(lc);
        lc.reset();
        configurator.doConfigure(ClassicTestConstants.JORAN_INPUT_PREFIX
            + "syslog_LBCLASSIC_50.xml");
    
        org.slf4j.Logger logger = LoggerFactory.getLogger(this.getClass());
        logger.info("hello");
      }
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/CounterBasedEvaluator.java��0000644�0001750�0001750�00000003327�12136042271�033000� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net;
    
    import ch.qos.logback.core.boolex.EvaluationException;
    import ch.qos.logback.core.boolex.EventEvaluator;
    import ch.qos.logback.core.spi.ContextAwareBase;
    
    /**
     * A simple EventEvaluator implementation that triggers email transmission after
     * a given number of events occur, regardless of event level.
     * 
     * <p>By default, the limit is 1024.
     */
    public class CounterBasedEvaluator extends ContextAwareBase implements EventEvaluator {
    
      static int DEFAULT_LIMIT = 1024;
      int limit = DEFAULT_LIMIT;
      int counter = 0;
      String name;
      boolean started;
    
      public boolean evaluate(Object event) throws NullPointerException,
          EvaluationException {
        counter++;
    
        if (counter == limit) {
          counter = 0;
          return true;
        } else {
          return false;
        }
      }
    
      public String getName() {
        return name;
      }
    
      public void setName(String name) {
        this.name = name;
      }
    
      public boolean isStarted() {
        return started;
      }
    
      public void start() {
        started = true;
      }
    
      public void stop() {
        started = false;
      }
    
      public int getLimit() {
        return limit;
      }
    
      public void setLimit(int limit) {
        this.limit = limit;
      }
      
      
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/SerializationPerfTest.java��0000644�0001750�0001750�00000016120�12136042271�033024� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net;
    
    import java.io.IOException;
    import java.io.ObjectOutputStream;
    import java.net.Socket;
    
    import junit.framework.TestCase;
    import ch.qos.logback.classic.net.testObjectBuilders.Builder;
    import ch.qos.logback.classic.net.testObjectBuilders.MinimalSerBuilder;
    import ch.qos.logback.classic.net.testObjectBuilders.TrivialLoggingEventVOBuilder;
    
    public class SerializationPerfTest extends TestCase {
    
      ObjectOutputStream oos;
    
      int loopNumber = 10000;
      int resetFrequency = 100;
      int pauseFrequency = 10;
      long pauseLengthInMillis = 20;
    
      /**
       * <p>
       * Run the test with a MockSocketServer or with a NOPOutputStream
       * 
       * <p>
       * Run with external mock can be done using the ExternalMockSocketServer. It
       * needs to be launched from a separate JVM. The ExternalMockSocketServer does
       * not consume the events but passes through the available bytes that it is
       * receiving.
       * 
       * <p>
       * For example, with 4 test methods, you can launch the
       * ExternalMockSocketServer this way:
       * </p>
       * <p>
       * <code>java ch.qos.logback.classic.net.ExternalMockSocketServer 4</code>
       * </p>
       */
      boolean runWithExternalMockServer = true;
    
            /**
             * Last results:
             * Data sent mesured in kilobytes.
             * Avg time mesured in microsecs.
             * 
             * NOPOutputStream: 
             *   |                |  Runs | Avg time | Data sent |
             *   | MinimalObj Ext | 10000 |          |           |
             *   | MinimalObj Ser | 10000 |          |           |
             *   | LoggEvent Ext  | 10000 |          |           |
             *   | LoggEvent Ser  | 10000 |          |           |
             * 
             * External MockServer with 45 letters-long message: on localhost
             * (always the same message)
             *       |                |  Runs | Avg time | Data sent |
             *   | MinimalObj Ext | 10000 |      -   |       -   |
             *   | MinimalObj Ser | 10000 |     74   |     248   |
             *   | LoggEvent Ext  | 10000 |      -   |       -   |
             *   | LoggEvent Ser  | 10000 |    156   |     835   |
             *       pauseFrequency = 10 and pauseLengthInMillis = 20
             *
             * External MockServer with 45 letters-long message: on localhost
             * (different message each time)
             *       |                |  Runs | Avg time | Data sent |
             *   | MinimalObj Ext | 10000 |          |           |
             *   | MinimalObj Ser | 10000 |     73   |    1139   |
             *   | LoggEvent Ext  | 10000 |          |           |
             *   | LoggEvent Ser  | 10000 |    162   |    1752   |
             *       pauseFrequency = 10 and pauseLengthInMillis = 20
             *
             * External MockServer with 45 letters-long message: on PIXIE
             * (always the same message)
             *       |                |  Runs | Avg time | Data sent |
             *   | MinimalObj Ext | 10000 |      -   |       -   |
             *   | MinimalObj Ser | 10000 |     29   |     248   |
             *   | LoggEvent Ext  | 10000 |      -   |       -   |
             *   | LoggEvent Ser  | 10000 |     42   |     835   |
             *       pauseFrequency = 10 and pauseLengthInMillis = 20
             *
             * External MockServer with 45 letters-long message: on PIXIE
             * (different message each time)
             *       |                |  Runs | Avg time | Data sent |
             *   | MinimalObj Ext | 10000 |          |           |
             *   | MinimalObj Ser | 10000 |     27   |    1139   |
             *   | LoggEvent Ext  | 10000 |          |           |
             *   | LoggEvent Ser  | 10000 |     44   |    1752   |
             *       pauseFrequency = 10 and pauseLengthInMillis = 20
             *
             */
    
      public void setUp() throws Exception {
        super.setUp();
        if (runWithExternalMockServer) {
          oos = new ObjectOutputStream(new Socket("localhost",
              ExternalMockSocketServer.PORT).getOutputStream());
        } else {
          oos = new ObjectOutputStream(new NOPOutputStream());
        }
      }
    
      public void tearDown() throws Exception {
        super.tearDown();
        oos.close();
        oos = null;
      }
    
      public void runPerfTest(Builder builder, String label) throws Exception {
        // long time1 = System.nanoTime();
    
        // Object builtObject = builder.build(1);
    
        // first run for just in time compiler
        int resetCounter = 0;
        int pauseCounter = 0;
        for (int i = 0; i < loopNumber; i++) {
          try {
            oos.writeObject(builder.build(i));
            oos.flush();
            if (++resetCounter >= resetFrequency) {
              oos.reset();
              resetCounter = 0;
            }
            if (++pauseCounter >= pauseFrequency) {
              Thread.sleep(pauseLengthInMillis);
              pauseCounter = 0;
            }
    
          } catch (IOException ex) {
            fail(ex.getMessage());
          }
        }
    
        // second run
        Long t1;
        Long t2;
        Long total = 0L;
        resetCounter = 0;
        pauseCounter = 0;
        // System.out.println("Beginning mesured run");
        for (int i = 0; i < loopNumber; i++) {
          try {
            t1 = System.nanoTime();
            oos.writeObject(builder.build(i));
            oos.flush();
            t2 = System.nanoTime();
            total += (t2 - t1);
            if (++resetCounter >= resetFrequency) {
              oos.reset();
              resetCounter = 0;
            }
            if (++pauseCounter >= pauseFrequency) {
              Thread.sleep(pauseLengthInMillis);
              pauseCounter = 0;
            }
          } catch (IOException ex) {
            fail(ex.getMessage());
          }
        }
        total /= 1000;
        System.out.println(label + " : average time = " + total / loopNumber
            + " microsecs after " + loopNumber + " writes.");
    
        // long time2 = System.nanoTime();
        // System.out.println("********* -> Time needed to run the test method: " +
        // Long.toString(time2-time1));
      }
    
      // public void testWithMinimalExternalization() throws Exception {
      // Builder builder = new MinimalExtBuilder();
      // runPerfTest(builder, "Minimal object externalization");
      // }
    
      public void testWithMinimalSerialization() throws Exception {
        Builder builder = new MinimalSerBuilder();
        runPerfTest(builder, "Minimal object serialization");
      }
    
      // public void testWithExternalization() throws Exception {
      // Builder builder = new LoggingEventExtBuilder();
      // runPerfTest(builder, "LoggingEvent object externalization");
      // }
    
      public void testWithSerialization() throws Exception {
        Builder builder = new TrivialLoggingEventVOBuilder();
        runPerfTest(builder, "LoggingEventVO object serialization");
      }
      
      
      
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/SSLSocketReceiverTest.java��0000644�0001750�0001750�00000002623�12136042271�032674� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net;
    
    import static org.junit.Assert.assertNotNull;
    
    import java.net.InetAddress;
    
    import org.junit.Before;
    import org.junit.Test;
    import org.slf4j.LoggerFactory;
    
    import ch.qos.logback.classic.LoggerContext;
    
    /**
     * Unit tests for {@link SSLSocketReceiver}.
     *
     * @author Carl Harris
     */
    public class SSLSocketReceiverTest {
    
      private SSLSocketReceiver remote =
          new SSLSocketReceiver();
      
      @Before
      public void setUp() throws Exception {
        LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
        remote.setContext(lc);
      }
      
      @Test
      public void testUsingDefaultConfig() throws Exception {
        // should be able to start successfully with no SSL configuration at all
        remote.setRemoteHost(InetAddress.getLocalHost().getHostAddress());
        remote.setPort(6000);
        remote.start();
        assertNotNull(remote.getSocketFactory());
      }
      
    }
    �������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/mock/�����������������������0000755�0001750�0001750�00000000000�12203357067�026627� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/mock/MockTopic.java���������0000644�0001750�0001750�00000001443�12136042271�031355� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net.mock;
    
    import javax.jms.JMSException;
    import javax.jms.Topic;
    
    public class MockTopic implements Topic {
    
      String name;
      
      public MockTopic(String name) {
        this.name = name;
      }
      
      public String getTopicName() throws JMSException {
        return name;
      }
    
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/mock/MockAppender.java������0000644�0001750�0001750�00000003315�12143151241�032031� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net.mock;
    
    import java.util.concurrent.BlockingQueue;
    import java.util.concurrent.LinkedBlockingQueue;
    import java.util.concurrent.TimeUnit;
    import java.util.concurrent.locks.Condition;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.core.AppenderBase;
    
    /**
     * A mock {@link AppenderBase} with instrumentation for unit testing.
     *
     * @author Carl Harris
     */
    public class MockAppender extends AppenderBase<ILoggingEvent> {
    
      private final Lock lock = new ReentrantLock();
      private final Condition appendCondition = lock.newCondition();
      private final BlockingQueue<ILoggingEvent> events = 
          new LinkedBlockingQueue<ILoggingEvent>();
      
      @Override
      protected void append(ILoggingEvent eventObject) {
        lock.lock();
        try {
          events.offer(eventObject);
          appendCondition.signalAll();
        }
        finally {
          lock.unlock();
        }
      }
      
      public ILoggingEvent awaitAppend(long delay) throws InterruptedException {
        return events.poll(delay, TimeUnit.MILLISECONDS);
      }
    
      public ILoggingEvent getLastEvent() {
        return events.peek();
      }
    
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/mock/MockQueueSender.java���0000644�0001750�0001750�00000005200�12136042271�032517� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net.mock;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.jms.Destination;
    import javax.jms.JMSException;
    import javax.jms.Message;
    import javax.jms.Queue;
    import javax.jms.QueueSender;
    
    public class MockQueueSender implements QueueSender {
    
      List<Message> messageList = new ArrayList<Message>();
      Queue queue;
      
      public MockQueueSender(Queue queue) {
        this.queue = queue;
      }
      
      public List<Message> getMessageList() {
        return messageList;
      }
      
      public Queue getQueue() throws JMSException {
        return queue;
      }
    
      public void send(Message message) throws JMSException {
        messageList.add(message);
        
      }
    
      public void send(Queue arg0, Message arg1) throws JMSException {
    
        
      }
    
      public void send(Message arg0, int arg1, int arg2, long arg3) throws JMSException {
    
        
      }
    
      public void send(Queue arg0, Message arg1, int arg2, int arg3, long arg4) throws JMSException {
    
        
      }
    
      public void close() throws JMSException {
    
        
      }
    
      public int getDeliveryMode() throws JMSException {
    
        return 0;
      }
    
      public Destination getDestination() throws JMSException {
    
        return null;
      }
    
      public boolean getDisableMessageID() throws JMSException {
    
        return false;
      }
    
      public boolean getDisableMessageTimestamp() throws JMSException {
    
        return false;
      }
    
      public int getPriority() throws JMSException {
    
        return 0;
      }
    
      public long getTimeToLive() throws JMSException {
    
        return 0;
      }
    
      public void send(Destination arg0, Message arg1) throws JMSException {
    
        
      }
    
      public void send(Destination arg0, Message arg1, int arg2, int arg3, long arg4) throws JMSException {
    
        
      }
    
      public void setDeliveryMode(int arg0) throws JMSException {
    
        
      }
    
      public void setDisableMessageID(boolean arg0) throws JMSException {
    
        
      }
    
      public void setDisableMessageTimestamp(boolean arg0) throws JMSException {
    
        
      }
    
      public void setPriority(int arg0) throws JMSException {
    
        
      }
    
      public void setTimeToLive(long arg0) throws JMSException {
    
        
      }
      
      
    
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000155�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/mock/MockTopicConnectionFactory.java��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/mock/MockTopicConnectionFact0000644�0001750�0001750�00000002321�12136042271�033247� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net.mock;
    
    import javax.jms.Connection;
    import javax.jms.JMSException;
    import javax.jms.TopicConnection;
    import javax.jms.TopicConnectionFactory;
    
    public class MockTopicConnectionFactory implements TopicConnectionFactory {
    
      MockTopicConnection cnx = new MockTopicConnection();
      
      public TopicConnection createTopicConnection() throws JMSException {
        return cnx;
      }
    
      public TopicConnection createTopicConnection(String user, String pass) throws JMSException {
        
        return cnx;
      }
    
      public Connection createConnection() throws JMSException {
        return null;
      }
    
      public Connection createConnection(String arg0, String arg1) throws JMSException {
        return null;
      }
    
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/mock/MockObjectMessage.java�0000644�0001750�0001750�00000011704�12136042271�033013� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net.mock;
    
    import java.io.Serializable;
    import java.util.Enumeration;
    
    import javax.jms.Destination;
    import javax.jms.JMSException;
    import javax.jms.ObjectMessage;
    
    public class MockObjectMessage implements ObjectMessage {
    
      Serializable object; 
      
      public Serializable getObject() throws JMSException {
        return object;
      }
    
      public void setObject(Serializable object) throws JMSException {
        this.object = object;
      }
    
      public void acknowledge() throws JMSException {
        
        
      }
    
      public void clearBody() throws JMSException {
        
        
      }
    
      public void clearProperties() throws JMSException {
        
        
      }
    
      public boolean getBooleanProperty(String arg0) throws JMSException {
        
        return false;
      }
    
      public byte getByteProperty(String arg0) throws JMSException {
        
        return 0;
      }
    
      public double getDoubleProperty(String arg0) throws JMSException {
        
        return 0;
      }
    
      public float getFloatProperty(String arg0) throws JMSException {
        
        return 0;
      }
    
      public int getIntProperty(String arg0) throws JMSException {
        
        return 0;
      }
    
      public String getJMSCorrelationID() throws JMSException {
        
        return null;
      }
    
      public byte[] getJMSCorrelationIDAsBytes() throws JMSException {
        
        return null;
      }
    
      public int getJMSDeliveryMode() throws JMSException {
        
        return 0;
      }
    
      public Destination getJMSDestination() throws JMSException {
        
        return null;
      }
    
      public long getJMSExpiration() throws JMSException {
        
        return 0;
      }
    
      public String getJMSMessageID() throws JMSException {
        
        return null;
      }
    
      public int getJMSPriority() throws JMSException {
        
        return 0;
      }
    
      public boolean getJMSRedelivered() throws JMSException {
        
        return false;
      }
    
      public Destination getJMSReplyTo() throws JMSException {
        
        return null;
      }
    
      public long getJMSTimestamp() throws JMSException {
        
        return 0;
      }
    
      public String getJMSType() throws JMSException {
        
        return null;
      }
    
      public long getLongProperty(String arg0) throws JMSException {
        
        return 0;
      }
    
      public Object getObjectProperty(String arg0) throws JMSException {
        
        return null;
      }
    
      public Enumeration getPropertyNames() throws JMSException {
        
        return null;
      }
    
      public short getShortProperty(String arg0) throws JMSException {
        
        return 0;
      }
    
      public String getStringProperty(String arg0) throws JMSException {
        
        return null;
      }
    
      public boolean propertyExists(String arg0) throws JMSException {
        
        return false;
      }
    
      public void setBooleanProperty(String arg0, boolean arg1) throws JMSException {
        
        
      }
    
      public void setByteProperty(String arg0, byte arg1) throws JMSException {
        
        
      }
    
      public void setDoubleProperty(String arg0, double arg1) throws JMSException {
        
        
      }
    
      public void setFloatProperty(String arg0, float arg1) throws JMSException {
        
        
      }
    
      public void setIntProperty(String arg0, int arg1) throws JMSException {
        
        
      }
    
      public void setJMSCorrelationID(String arg0) throws JMSException {
        
        
      }
    
      public void setJMSCorrelationIDAsBytes(byte[] arg0) throws JMSException {
        
        
      }
    
      public void setJMSDeliveryMode(int arg0) throws JMSException {
        
        
      }
    
      public void setJMSDestination(Destination arg0) throws JMSException {
        
        
      }
    
      public void setJMSExpiration(long arg0) throws JMSException {
        
        
      }
    
      public void setJMSMessageID(String arg0) throws JMSException {
        
        
      }
    
      public void setJMSPriority(int arg0) throws JMSException {
        
        
      }
    
      public void setJMSRedelivered(boolean arg0) throws JMSException {
        
        
      }
    
      public void setJMSReplyTo(Destination arg0) throws JMSException {
        
        
      }
    
      public void setJMSTimestamp(long arg0) throws JMSException {
        
        
      }
    
      public void setJMSType(String arg0) throws JMSException {
        
        
      }
    
      public void setLongProperty(String arg0, long arg1) throws JMSException {
        
        
      }
    
      public void setObjectProperty(String arg0, Object arg1) throws JMSException {
        
        
      }
    
      public void setShortProperty(String arg0, short arg1) throws JMSException {
        
        
      }
    
      public void setStringProperty(String arg0, String arg1) throws JMSException {
        
        
      }
    
    }
    ������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000146�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/mock/MockTopicConnection.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/mock/MockTopicConnection.jav0000644�0001750�0001750�00000004536�12136042271�033242� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net.mock;
    
    import javax.jms.ConnectionConsumer;
    import javax.jms.ConnectionMetaData;
    import javax.jms.Destination;
    import javax.jms.ExceptionListener;
    import javax.jms.JMSException;
    import javax.jms.ServerSessionPool;
    import javax.jms.Session;
    import javax.jms.Topic;
    import javax.jms.TopicConnection;
    import javax.jms.TopicSession;
    
    public class MockTopicConnection implements TopicConnection {
    
      MockTopicSession session = new MockTopicSession();
      
      public TopicSession createTopicSession(boolean arg0, int arg1) throws JMSException {
        return session;
      }
      
      public ConnectionConsumer createConnectionConsumer(Topic arg0, String arg1, ServerSessionPool arg2, int arg3) throws JMSException {
        
        return null;
      }
    
      public ConnectionConsumer createDurableConnectionConsumer(Topic arg0, String arg1, String arg2, ServerSessionPool arg3, int arg4) throws JMSException {
        
        return null;
      }
    
      public void close() throws JMSException {
        
        
      }
    
      public ConnectionConsumer createConnectionConsumer(Destination arg0, String arg1, ServerSessionPool arg2, int arg3) throws JMSException {
        
        return null;
      }
    
      public Session createSession(boolean arg0, int arg1) throws JMSException {
        
        return null;
      }
    
      public String getClientID() throws JMSException {
        
        return null;
      }
    
      public ExceptionListener getExceptionListener() throws JMSException {
        
        return null;
      }
    
      public ConnectionMetaData getMetaData() throws JMSException {
        
        return null;
      }
    
      public void setClientID(String arg0) throws JMSException {
        
        
      }
    
      public void setExceptionListener(ExceptionListener arg0) throws JMSException {
        
        
      }
    
      public void start() throws JMSException {
        
        
      }
    
      public void stop() throws JMSException {
        
        
      }
    
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/mock/MockTopicSession.java��0000644�0001750�0001750�00000010701�12136042271�032716� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net.mock;
    
    import java.io.Serializable;
    
    import javax.jms.BytesMessage;
    import javax.jms.Destination;
    import javax.jms.JMSException;
    import javax.jms.MapMessage;
    import javax.jms.Message;
    import javax.jms.MessageConsumer;
    import javax.jms.MessageListener;
    import javax.jms.MessageProducer;
    import javax.jms.ObjectMessage;
    import javax.jms.Queue;
    import javax.jms.QueueBrowser;
    import javax.jms.StreamMessage;
    import javax.jms.TemporaryQueue;
    import javax.jms.TemporaryTopic;
    import javax.jms.TextMessage;
    import javax.jms.Topic;
    import javax.jms.TopicPublisher;
    import javax.jms.TopicSession;
    import javax.jms.TopicSubscriber;
    
    public class MockTopicSession implements TopicSession {
    
      public ObjectMessage createObjectMessage() throws JMSException {
        return new MockObjectMessage();
      }
      
      public TopicPublisher createPublisher(Topic topic) throws JMSException {
        if (topic == null) {
          return null;
        }
        return new MockTopicPublisher(topic);
      }
      
      
      public TopicSubscriber createDurableSubscriber(Topic arg0, String arg1) throws JMSException {
        return null;
      }
    
      public TopicSubscriber createDurableSubscriber(Topic arg0, String arg1, String arg2, boolean arg3) throws JMSException {
        return null;
      }
    
      public TopicSubscriber createSubscriber(Topic arg0) throws JMSException {
        return null;
      }
    
      public TopicSubscriber createSubscriber(Topic arg0, String arg1, boolean arg2) throws JMSException {
        return null;
      }
    
      public TemporaryTopic createTemporaryTopic() throws JMSException {
        return null;
      }
    
      public Topic createTopic(String arg0) throws JMSException {
        return null;
      }
    
      public void unsubscribe(String arg0) throws JMSException {
        
      }
    
      public void close() throws JMSException {
        
      }
    
      public void commit() throws JMSException {
        
      }
    
      public QueueBrowser createBrowser(Queue arg0) throws JMSException {
        
        return null;
      }
    
      public QueueBrowser createBrowser(Queue arg0, String arg1) throws JMSException {
        
        return null;
      }
    
      public BytesMessage createBytesMessage() throws JMSException {
        
        return null;
      }
    
      public MessageConsumer createConsumer(Destination arg0) throws JMSException {
        
        return null;
      }
    
      public MessageConsumer createConsumer(Destination arg0, String arg1) throws JMSException {
        
        return null;
      }
    
      public MessageConsumer createConsumer(Destination arg0, String arg1, boolean arg2) throws JMSException {
        
        return null;
      }
    
      public MapMessage createMapMessage() throws JMSException {
        
        return null;
      }
    
      public Message createMessage() throws JMSException {
        
        return null;
      }
    
      public ObjectMessage createObjectMessage(Serializable arg0) throws JMSException {
        
        return null;
      }
    
      public MessageProducer createProducer(Destination arg0) throws JMSException {
        
        return null;
      }
    
      public Queue createQueue(String arg0) throws JMSException {
        
        return null;
      }
    
      public StreamMessage createStreamMessage() throws JMSException {
        
        return null;
      }
    
      public TemporaryQueue createTemporaryQueue() throws JMSException {
        
        return null;
      }
    
      public TextMessage createTextMessage() throws JMSException {
        
        return null;
      }
    
      public TextMessage createTextMessage(String arg0) throws JMSException {
        
        return null;
      }
    
      public int getAcknowledgeMode() throws JMSException {
        
        return 0;
      }
    
      public MessageListener getMessageListener() throws JMSException {
        
        return null;
      }
    
      public boolean getTransacted() throws JMSException {
        
        return false;
      }
    
      public void recover() throws JMSException {
        
        
      }
    
      public void rollback() throws JMSException {
        
        
      }
    
      public void run() {
        
        
      }
    
      public void setMessageListener(MessageListener arg0) throws JMSException {
        
        
      }
    
    }
    ���������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000146�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/mock/MockQueueConnection.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/mock/MockQueueConnection.jav0000644�0001750�0001750�00000004567�12136042271�033254� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net.mock;
    
    import javax.jms.ConnectionConsumer;
    import javax.jms.ConnectionMetaData;
    import javax.jms.Destination;
    import javax.jms.ExceptionListener;
    import javax.jms.JMSException;
    import javax.jms.Queue;
    import javax.jms.QueueConnection;
    import javax.jms.QueueSession;
    import javax.jms.ServerSessionPool;
    import javax.jms.Session;
    import javax.jms.Topic;
    
    public class MockQueueConnection implements QueueConnection {
    
      MockQueueSession session = new MockQueueSession();
      
      public QueueSession createQueueSession(boolean arg0, int arg1) throws JMSException {
        return session;
      }
    
      public ConnectionConsumer createConnectionConsumer(Queue arg0, String arg1, ServerSessionPool arg2, int arg3) throws JMSException {
        
        return null;
      }
      
      public void close() throws JMSException {
        
        
      }
    
      public ConnectionConsumer createConnectionConsumer(Destination arg0, String arg1, ServerSessionPool arg2, int arg3) throws JMSException {
        
        return null;
      }
    
      public ConnectionConsumer createDurableConnectionConsumer(Topic arg0, String arg1, String arg2, ServerSessionPool arg3, int arg4) throws JMSException {
        
        return null;
      }
    
      public Session createSession(boolean arg0, int arg1) throws JMSException {
        
        return null;
      }
    
      public String getClientID() throws JMSException {
        
        return null;
      }
    
      public ExceptionListener getExceptionListener() throws JMSException {
        
        return null;
      }
    
      public ConnectionMetaData getMetaData() throws JMSException {
        
        return null;
      }
    
      public void setClientID(String arg0) throws JMSException {
        
        
      }
    
      public void setExceptionListener(ExceptionListener arg0) throws JMSException {
        
        
      }
    
      public void start() throws JMSException {
        
        
      }
    
      public void stop() throws JMSException {
        
        
      }
    
    }
    �����������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/mock/MockQueue.java���������0000644�0001750�0001750�00000001443�12136042271�031363� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net.mock;
    
    import javax.jms.JMSException;
    import javax.jms.Queue;
    
    public class MockQueue implements Queue {
    
      String name;
      
      public MockQueue(String name) {
        this.name = name;
      }
      
      public String getQueueName() throws JMSException {
        return name;
      }
    
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/mock/MockQueueSession.java��0000644�0001750�0001750�00000010570�12136042271�032730� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net.mock;
    
    import java.io.Serializable;
    
    import javax.jms.BytesMessage;
    import javax.jms.Destination;
    import javax.jms.JMSException;
    import javax.jms.MapMessage;
    import javax.jms.Message;
    import javax.jms.MessageConsumer;
    import javax.jms.MessageListener;
    import javax.jms.MessageProducer;
    import javax.jms.ObjectMessage;
    import javax.jms.Queue;
    import javax.jms.QueueBrowser;
    import javax.jms.QueueReceiver;
    import javax.jms.QueueSender;
    import javax.jms.QueueSession;
    import javax.jms.StreamMessage;
    import javax.jms.TemporaryQueue;
    import javax.jms.TemporaryTopic;
    import javax.jms.TextMessage;
    import javax.jms.Topic;
    import javax.jms.TopicSubscriber;
    
    public class MockQueueSession implements QueueSession {
    
      public ObjectMessage createObjectMessage() throws JMSException {
        return new MockObjectMessage();
      }
      
      public QueueSender createSender(Queue queue) throws JMSException {
        if (queue == null) {
          return null;
        }
        return new MockQueueSender(queue);
      }
    
      public QueueBrowser createBrowser(Queue arg0) throws JMSException {
    
        return null;
      }
    
      public QueueBrowser createBrowser(Queue arg0, String arg1) throws JMSException {
    
        return null;
      }
    
      public Queue createQueue(String arg0) throws JMSException {
    
        return null;
      }
    
      public QueueReceiver createReceiver(Queue arg0) throws JMSException {
    
        return null;
      }
    
      public QueueReceiver createReceiver(Queue arg0, String arg1) throws JMSException {
    
        return null;
      }
    
      public TemporaryQueue createTemporaryQueue() throws JMSException {
    
        return null;
      }
    
      public void close() throws JMSException {
    
        
      }
    
      public void commit() throws JMSException {
    
        
      }
    
      public BytesMessage createBytesMessage() throws JMSException {
    
        return null;
      }
    
      public MessageConsumer createConsumer(Destination arg0) throws JMSException {
    
        return null;
      }
    
      public MessageConsumer createConsumer(Destination arg0, String arg1) throws JMSException {
    
        return null;
      }
    
      public MessageConsumer createConsumer(Destination arg0, String arg1, boolean arg2) throws JMSException {
    
        return null;
      }
    
      public TopicSubscriber createDurableSubscriber(Topic arg0, String arg1) throws JMSException {
    
        return null;
      }
    
      public TopicSubscriber createDurableSubscriber(Topic arg0, String arg1, String arg2, boolean arg3) throws JMSException {
    
        return null;
      }
    
      public MapMessage createMapMessage() throws JMSException {
    
        return null;
      }
    
      public Message createMessage() throws JMSException {
    
        return null;
      }
    
      public ObjectMessage createObjectMessage(Serializable arg0) throws JMSException {
    
        return null;
      }
    
      public MessageProducer createProducer(Destination arg0) throws JMSException {
    
        return null;
      }
    
      public StreamMessage createStreamMessage() throws JMSException {
    
        return null;
      }
    
      public TemporaryTopic createTemporaryTopic() throws JMSException {
    
        return null;
      }
    
      public TextMessage createTextMessage() throws JMSException {
    
        return null;
      }
    
      public TextMessage createTextMessage(String arg0) throws JMSException {
    
        return null;
      }
    
      public Topic createTopic(String arg0) throws JMSException {
    
        return null;
      }
    
      public int getAcknowledgeMode() throws JMSException {
    
        return 0;
      }
    
      public MessageListener getMessageListener() throws JMSException {
    
        return null;
      }
    
      public boolean getTransacted() throws JMSException {
    
        return false;
      }
    
      public void recover() throws JMSException {
    
        
      }
    
      public void rollback() throws JMSException {
    
        
      }
    
      public void run() {
    
        
      }
    
      public void setMessageListener(MessageListener arg0) throws JMSException {
    
        
      }
    
      public void unsubscribe(String arg0) throws JMSException {
    
        
      }
      
    
    }
    ����������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000155�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/mock/MockQueueConnectionFactory.java��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/mock/MockQueueConnectionFact0000644�0001750�0001750�00000002321�12136042271�033255� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net.mock;
    
    import javax.jms.Connection;
    import javax.jms.JMSException;
    import javax.jms.QueueConnection;
    import javax.jms.QueueConnectionFactory;
    
    public class MockQueueConnectionFactory implements QueueConnectionFactory {
    
      MockQueueConnection cnx = new MockQueueConnection();
      
      public QueueConnection createQueueConnection() throws JMSException {
        return cnx;
      }
    
      public QueueConnection createQueueConnection(String user, String pass) throws JMSException {
        
        return cnx;
      }
    
      public Connection createConnection() throws JMSException {
        return null;
      }
    
      public Connection createConnection(String arg0, String arg1) throws JMSException {
        return null;
      }
    
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/mock/MockTopicPublisher.java0000644�0001750�0001750�00000005600�12136042271�033232� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net.mock;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.jms.Destination;
    import javax.jms.JMSException;
    import javax.jms.Message;
    import javax.jms.Topic;
    import javax.jms.TopicPublisher;
    
    public class MockTopicPublisher implements TopicPublisher {
    
      List<Message> messageList = new ArrayList<Message>();
      Topic topic;
      
      public MockTopicPublisher(Topic topic) {
        this.topic = topic;
      }
      
      public void publish(Message message) throws JMSException {
        messageList.add(message);
      }
      
      public List<Message> getMessageList() {
        return messageList;
      }
      
      public Topic getTopic() throws JMSException {
        return topic;
      }
    
      public void publish(Message arg0, int arg1, int arg2, long arg3) throws JMSException {
         
      }
    
      public void publish(Topic arg0, Message arg1, int arg2, int arg3, long arg4) throws JMSException {
        
        
      }
    
      public void publish(Topic arg0, Message arg1) throws JMSException {
        
        
      }
    
      public void close() throws JMSException {
        
        
      }
    
      public int getDeliveryMode() throws JMSException {
        
        return 0;
      }
    
      public Destination getDestination() throws JMSException {
        
        return null;
      }
    
      public boolean getDisableMessageID() throws JMSException {
        
        return false;
      }
    
      public boolean getDisableMessageTimestamp() throws JMSException {
        
        return false;
      }
    
      public int getPriority() throws JMSException {
        
        return 0;
      }
    
      public long getTimeToLive() throws JMSException {
        
        return 0;
      }
    
      public void send(Destination arg0, Message arg1, int arg2, int arg3, long arg4) throws JMSException {
        
        
      }
    
      public void send(Destination arg0, Message arg1) throws JMSException {
        
        
      }
    
      public void send(Message arg0, int arg1, int arg2, long arg3) throws JMSException {
        
        
      }
    
      public void send(Message arg0) throws JMSException {
        
        
      }
    
      public void setDeliveryMode(int arg0) throws JMSException {
        
        
      }
    
      public void setDisableMessageID(boolean arg0) throws JMSException {
        
        
      }
    
      public void setDisableMessageTimestamp(boolean arg0) throws JMSException {
        
        
      }
    
      public void setPriority(int arg0) throws JMSException {
        
        
      }
    
      public void setTimeToLive(long arg0) throws JMSException {
        
        
      }
    
    }
    ��������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/net/mock/MockSyslogServer.java��0000644�0001750�0001750�00000003517�12136042271�032752� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.net.mock;
    
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public class MockSyslogServer extends Thread {
    
      final int loopLen;
      final int port;
      
      List<String> msgList = new ArrayList<String>();
      boolean finished = false;
      
      public MockSyslogServer(int loopLen, int port) {
        super();
        this.loopLen = loopLen;
        this.port = port;
      }
    
      @Override
      public void run() {
        //System.out.println("MockSyslogServer listening on port "+port);
        DatagramSocket socket = null;
        try {
          socket = new DatagramSocket(port);
    
          for (int i = 0; i < loopLen; i++) {
            byte[] buf = new byte[65536];
            DatagramPacket packet = new DatagramPacket(buf, buf.length);
            //System.out.println("Waiting for message");
            socket.receive(packet);
            String msg = new String(buf, 0, packet.getLength());
            msgList.add(msg);
          }
        } catch (Exception se) {
          se.printStackTrace();
        } finally {
          if(socket != null) {
    	  try {socket.close();} catch(Exception e) {}
          }
        }
        finished = true;
      }
      
      public boolean isFinished() {
        return finished;
      }
      
      public List<String> getMessageList() {
        return msgList;
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/ClassicTestConstants.java�������0000644�0001750�0001750�00000002437�12136042271�032070� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic;
    
    import ch.qos.logback.core.util.CoreTestConstants;
    
    public class ClassicTestConstants {
      final static public String ISO_REGEX = "\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2},\\d{3}";
      //pool-1-thread-47
      final static public String NAKED_MAIN_REGEX = "([mM]ain|pool-\\d-)([Tt]hread)?(-\\d{1,3})?";
    
    
      final static public String MAIN_REGEX = "\\[" + NAKED_MAIN_REGEX + "\\]";
      final static public String INPUT_PREFIX = "src/test/input/";
      final static public String JORAN_INPUT_PREFIX = INPUT_PREFIX + "joran/";
      final static public String ISSUES_PREFIX =   ClassicTestConstants.JORAN_INPUT_PREFIX+"issues/";
      final static public String GAFFER_INPUT_PREFIX = INPUT_PREFIX + "gaffer/";
      final static public String OUTPUT_DIR_PREFIX= CoreTestConstants.OUTPUT_DIR_PREFIX;
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/LoggerContextDeadlockTest.java��0000644�0001750�0001750�00000003651�12136042271�033024� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic;
    
    import java.io.ByteArrayInputStream;
    
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.core.joran.spi.JoranException;
    
    public class LoggerContextDeadlockTest {
    
      LoggerContext loggerContext = new LoggerContext();
      JoranConfigurator jc = new JoranConfigurator();
      GetLoggerThread getLoggerThread = new GetLoggerThread(loggerContext);
    
      @Before
      public void setUp() throws Exception {
        jc.setContext(loggerContext);
      }
    
      @After
      public void tearDown() throws Exception {
      }
    
      @Test(timeout = 20000)
      public void testLBCLASSIC_81() throws JoranException {
    
    
        getLoggerThread.start();
        for (int i = 0; i < 500; i++) {
          ByteArrayInputStream baos = new ByteArrayInputStream(
                  "<configuration><root level=\"DEBUG\"/></configuration>".getBytes());
          jc.doConfigure(baos);
        }
      }
    
      class GetLoggerThread extends Thread {
    
        final LoggerContext loggerContext;
    
        GetLoggerThread(LoggerContext loggerContext) {
          this.loggerContext = loggerContext;
        }
    
        @Override
        public void run() {
          for (int i = 0; i < 10000; i++) {
            if (i % 100 == 0) {
              try {
                Thread.sleep(1);
              } catch (InterruptedException e) {
              }
            }
            loggerContext.getLogger("a" + i);
          }
        }
      }
    
    }
    ���������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/MDCTest.java��������������������0000644�0001750�0001750�00000002407�12136042271�027212� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertNull;
    
    import java.util.HashMap;
    
    import org.junit.Test;
    import org.slf4j.MDC;
    
    public class MDCTest {
    
      @Test
      public void test() throws InterruptedException {
        MDCTestThread threadA = new MDCTestThread("a");
        threadA.start();
    
        MDCTestThread threadB = new MDCTestThread("b");
        threadB.start();
    
        threadA.join();
        threadB.join();
    
        assertNull(threadA.x0);
        assertEquals("a", threadA.x1);
        assertNull(threadA.x2);
    
        assertNull(threadB.x0);
        assertEquals("b", threadB.x1);
        assertNull(threadB.x2);
    
      }
    
      @Test
      public void testLBCLASSIC_98() {
        MDC.setContextMap(new HashMap<String, String>());
      }
      
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/MDCTestThread.java��������������0000644�0001750�0001750�00000001641�12136042271�030341� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic;
    
    import org.slf4j.MDC;
    
    public class MDCTestThread extends Thread {
      
      String val;
      
      public MDCTestThread(String val) {
        super();
        this.val = val;
      }
      
      String x0;
      String x1;
      String x2;
      
      public void run() {
        x0 = MDC.get("x");
        MDC.put("x", val);
        x1 = MDC.get("x");
        MDC.clear();
        x2 = MDC.get("x");
        //System.out.println("Exiting "+val);
      }
    } �����������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/PatternLayoutTest.java����������0000644�0001750�0001750�00000015676�12143151241�031432� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic;
    
    import ch.qos.logback.classic.joran.JoranConfigurator;
    import ch.qos.logback.classic.pattern.ConverterTest;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.classic.spi.LoggingEvent;
    import ch.qos.logback.classic.testUtil.SampleConverter;
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.pattern.PatternLayoutBase;
    import ch.qos.logback.core.pattern.parser.AbstractPatternLayoutBaseTest;
    import ch.qos.logback.core.testUtil.StringListAppender;
    import ch.qos.logback.core.util.OptionHelper;
    import ch.qos.logback.core.util.StatusPrinter;
    import org.junit.Before;
    import org.junit.Test;
    import org.slf4j.MDC;
    
    import static ch.qos.logback.classic.ClassicTestConstants.ISO_REGEX;
    import static ch.qos.logback.classic.ClassicTestConstants.MAIN_REGEX;
    import static org.junit.Assert.*;
    
    public class PatternLayoutTest extends AbstractPatternLayoutBaseTest<ILoggingEvent> {
    
      private PatternLayout pl = new PatternLayout();
      private LoggerContext lc = new LoggerContext();
      Logger logger = lc.getLogger(ConverterTest.class);
      Logger root = lc.getLogger(Logger.ROOT_LOGGER_NAME);
    
      ILoggingEvent le;
    
    	public PatternLayoutTest() {
        super();
        Exception ex = new Exception("Bogus exception");
        le = makeLoggingEvent(ex);
      }
    
      @Before
      public void setUp() {
        pl.setContext(lc);
      }
    
      ILoggingEvent makeLoggingEvent(Exception ex) {
        return new LoggingEvent(
                ch.qos.logback.core.pattern.FormattingConverter.class.getName(),
                logger, Level.INFO, "Some message", ex, null);
      }
    
      @Override
      public ILoggingEvent getEventObject() {
        return makeLoggingEvent(null);
      }
    
      public PatternLayoutBase<ILoggingEvent> getPatternLayoutBase() {
        return new PatternLayout();
      }
    
      @Test
      public void testOK() {
        pl.setPattern("%d %le [%t] %lo{30} - %m%n");
        pl.start();
        String val = pl.doLayout(getEventObject());
        // 2006-02-01 22:38:06,212 INFO [main] c.q.l.pattern.ConverterTest - Some
        // message
        //2010-12-29 19:04:26,137 INFO [pool-1-thread-47] c.q.l.c.pattern.ConverterTest - Some message
        String regex = ISO_REGEX + " INFO " + MAIN_REGEX
                + " c.q.l.c.pattern.ConverterTest - Some message\\s*";
    
        assertTrue("val="+val, val.matches(regex));
      }
    
      @Test
      public void testNoExeptionHandler() {
        pl.setPattern("%m%n");
        pl.start();
        String val = pl.doLayout(le);
        assertTrue(val.contains("java.lang.Exception: Bogus exception"));
      }
    
      @Test
      public void testCompositePattern() {
        pl.setPattern("%-56(%d %lo{20}) - %m%n");
        pl.start();
        String val = pl.doLayout(getEventObject());
        // 2008-03-18 21:55:54,250 c.q.l.c.pattern.ConverterTest - Some message
        String regex = ISO_REGEX
                + " c.q.l.c.p.ConverterTest          - Some message\\s*";
        assertTrue(val.matches(regex));
      }
    
      @Test
      public void contextProperty() {
        pl.setPattern("%property{a}");
        pl.start();
        lc.putProperty("a", "b");
    
        String val = pl.doLayout(getEventObject());
        assertEquals("b", val);
      }
    
      @Test
      public void testNopExeptionHandler() {
        pl.setPattern("%nopex %m%n");
        pl.start();
        String val = pl.doLayout(le);
        assertTrue(!val.contains("java.lang.Exception: Bogus exception"));
      }
    
      @Test
      public void testWithParenthesis() {
        pl.setPattern("\\(%msg:%msg\\) %msg");
        pl.start();
        le = makeLoggingEvent(null);
        String val = pl.doLayout(le);
        // System.out.println("VAL == " + val);
        assertEquals("(Some message:Some message) Some message", val);
      }
    
      @Test
      public void testWithLettersComingFromLog4j() {
        // Letters: p = level and c = logger
        pl.setPattern("%d %p [%t] %c{30} - %m%n");
        pl.start();
        String val = pl.doLayout(getEventObject());
        // 2006-02-01 22:38:06,212 INFO [main] c.q.l.pattern.ConverterTest - Some
        // message
        String regex = ClassicTestConstants.ISO_REGEX + " INFO " + MAIN_REGEX
                + " c.q.l.c.pattern.ConverterTest - Some message\\s*";
        assertTrue(val.matches(regex));
      }
    
      @Test
      public void mdcWithDefaultValue() {
        String pattern = "%msg %mdc{foo} %mdc{bar:-[null]}";
        pl.setPattern(OptionHelper.substVars(pattern, lc));
        pl.start();
        MDC.put("foo", "foo");
        try {
          String val = pl.doLayout(getEventObject());
          assertEquals("Some message foo [null]", val);
        } finally {
          MDC.remove("foo");
        }
      }
    
    
      @Test
      public void contextNameTest() {
        pl.setPattern("%contextName");
        lc.setName("aValue");
        pl.start();
        String val = pl.doLayout(getEventObject());
        assertEquals("aValue", val);
      }
    
      @Test
      public void cnTest() {
        pl.setPattern("%cn");
        lc.setName("aValue");
        pl.start();
        String val = pl.doLayout(getEventObject());
        assertEquals("aValue", val);
      }
    
      @Override
      public Context getContext() {
        return lc;
      }
    
      void configure(String file) throws JoranException {
        JoranConfigurator jc = new JoranConfigurator();
        jc.setContext(lc);
        jc.doConfigure(file);
      }
    
      @Test
      public void testConversionRuleSupportInPatternLayout() throws JoranException {
        configure(ClassicTestConstants.JORAN_INPUT_PREFIX + "conversionRule/patternLayout0.xml");
        root.getAppender("LIST");
        String msg = "Simon says";
        logger.debug(msg);
        StringListAppender<ILoggingEvent> sla = (StringListAppender<ILoggingEvent>) root.getAppender("LIST");
        assertNotNull(sla);
        assertEquals(1, sla.strList.size());
        assertEquals(SampleConverter.SAMPLE_STR + " - " + msg, sla.strList.get(0));
      }
    
      @Test
      public void somekeReplace() {
        pl.setPattern("%replace(a1234b){'\\d{4}', 'XXXX'}");
        pl.start();
        StatusPrinter.print(lc);
        String val = pl.doLayout(getEventObject());
        assertEquals("aXXXXb", val);
      }
    
      @Test
      public void replaceWithJoran() throws JoranException {
        configure(ClassicTestConstants.JORAN_INPUT_PREFIX + "pattern/replace0.xml");
        StatusPrinter.print(lc);
        root.getAppender("LIST");
        String msg = "And the number is 4111111111110000, expiring on 12/2010";
        logger.debug(msg);
        StringListAppender<ILoggingEvent> sla = (StringListAppender<ILoggingEvent>) root.getAppender("LIST");
        assertNotNull(sla);
        assertEquals(1, sla.strList.size());
        assertEquals("And the number is XXXX, expiring on 12/2010", sla.strList.get(0));
      }
    
    
    }
    ������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/selector/�����������������������0000755�0001750�0001750�00000000000�12203357067�026730� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000152�00000000000�011563� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/selector/ContextJNDISelectorTest.java�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/selector/ContextJNDISelectorTest0000644�0001750�0001750�00000006061�12136042271�033301� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.selector;
    
    import static org.junit.Assert.assertEquals;
    
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    import org.slf4j.LoggerFactory;
    import org.slf4j.impl.StaticLoggerBinderFriend;
    
    import ch.qos.logback.classic.ClassicConstants;
    import ch.qos.logback.classic.util.ContextSelectorStaticBinder;
    import ch.qos.logback.classic.util.MockInitialContext;
    import ch.qos.logback.classic.util.MockInitialContextFactory;
    import ch.qos.logback.core.Context;
    
    public class ContextJNDISelectorTest  {
      
      static String INITIAL_CONTEXT_KEY = "java.naming.factory.initial";
    
      @Before
      public void setUp() throws Exception {    
        
        System.setProperty(ClassicConstants.LOGBACK_CONTEXT_SELECTOR, "JNDI");
        StaticLoggerBinderFriend.reset();
        
        MockInitialContextFactory.initialize();
        MockInitialContext mic = MockInitialContextFactory.getContext();
        mic.map.put(ClassicConstants.JNDI_CONTEXT_NAME, "toto");
        
        //The property must be set after we setup the Mock
        System.setProperty(INITIAL_CONTEXT_KEY, MockInitialContextFactory.class.getName());
        
        //this call will create the context "toto"
        LoggerFactory.getLogger(ContextDetachingSCLTest.class);
      }
    
      @After
      public void tearDown() throws Exception {
        System.clearProperty(INITIAL_CONTEXT_KEY);
      }
    
      @Test
      public void testGetExistingContext() {
        ContextSelector selector = ContextSelectorStaticBinder.getSingleton().getContextSelector();
        Context context = selector.getLoggerContext();
        assertEquals("toto", context.getName());
      }
      
      @Test
      public void testCreateContext() {
        MockInitialContext mic = MockInitialContextFactory.getContext();
        mic.map.put(ClassicConstants.JNDI_CONTEXT_NAME, "tata");
        
        LoggerFactory.getLogger(ContextDetachingSCLTest.class);
        
        ContextJNDISelector selector = (ContextJNDISelector)ContextSelectorStaticBinder.getSingleton().getContextSelector();
        Context context = selector.getLoggerContext();
        assertEquals("tata", context.getName());
        System.out.println(selector.getContextNames());
        assertEquals(2, selector.getCount());
      }
      
      @Test
      public void defaultContext() {
        MockInitialContext mic = MockInitialContextFactory.getContext();
        mic.map.put(ClassicConstants.JNDI_CONTEXT_NAME, null);
    
        ContextJNDISelector selector = (ContextJNDISelector)ContextSelectorStaticBinder.getSingleton().getContextSelector();
        Context context = selector.getLoggerContext();
        
        assertEquals("default", context.getName());    
      }
      
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/selector/PackageTest.java�������0000644�0001750�0001750�00000001411�12136042271�031754� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.selector;
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    import org.junit.runners.Suite.SuiteClasses;
    
    @RunWith(Suite.class)
    @SuiteClasses({ContextJNDISelectorTest.class, ContextDetachingSCLTest.class})
    public class PackageTest  {
    }�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000152�00000000000�011563� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/selector/ContextDetachingSCLTest.java�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/java/ch/qos/logback/classic/selector/ContextDetachingSCLTest0000644�0001750�0001750�00000006201�12136042271�033300� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.classic.selector;
    
    import static org.junit.Assert.assertEquals;
    
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    import org.slf4j.LoggerFactory;
    
    import ch.qos.logback.classic.ClassicConstants;
    import ch.qos.logback.classic.selector.servlet.ContextDetachingSCL;
    import ch.qos.logback.classic.util.ContextSelectorStaticBinder;
    import ch.qos.logback.classic.util.MockInitialContext;
    import ch.qos.logback.classic.util.MockInitialContextFactory;
    import org.slf4j.LoggerFactoryFriend;
    import org.slf4j.impl.StaticLoggerBinderFriend;
    
    public class ContextDetachingSCLTest  {
      
      static String INITIAL_CONTEXT_KEY = "java.naming.factory.initial";
    
      ContextDetachingSCL contextDetachingSCL;
      
      @Before
      public void setUp() throws Exception {
    
        System.setProperty(ClassicConstants.LOGBACK_CONTEXT_SELECTOR, "JNDI");
    
        contextDetachingSCL = new ContextDetachingSCL();
        
        MockInitialContextFactory.initialize();
        MockInitialContext mic = MockInitialContextFactory.getContext();
        mic.map.put(ClassicConstants.JNDI_CONTEXT_NAME, "toto");
        
        //The property must be set after we setup the Mock
        System.setProperty(INITIAL_CONTEXT_KEY, MockInitialContextFactory.class.getName());
    
        // reinitialize the LoggerFactory, These reset methods are reserved for internal use
        StaticLoggerBinderFriend.reset();
        LoggerFactoryFriend.reset();
    
        //this call will create the context "toto"
        LoggerFactory.getLogger(ContextDetachingSCLTest.class);
      }
    
      @After
      public void tearDown() throws Exception {
        System.clearProperty(INITIAL_CONTEXT_KEY);
        // reinitialize the LoggerFactory, These resets method are reserved for internal use
        StaticLoggerBinderFriend.reset();
        LoggerFactoryFriend.reset();
      }
    
      @Test
      public void testDetach() {
        ContextJNDISelector selector = (ContextJNDISelector) ContextSelectorStaticBinder.getSingleton().getContextSelector();
        contextDetachingSCL.contextDestroyed(null);
        assertEquals(0, selector.getCount());
      }
      
    
      @Test
      public void testDetachWithMissingContext() {
        MockInitialContext mic = MockInitialContextFactory.getContext();
        mic.map.put(ClassicConstants.JNDI_CONTEXT_NAME, "tata");
        ContextJNDISelector selector = (ContextJNDISelector) ContextSelectorStaticBinder.getSingleton().getContextSelector();
        assertEquals("tata", selector.getLoggerContext().getName());
    
        mic.map.put(ClassicConstants.JNDI_CONTEXT_NAME, "titi");
        assertEquals("titi", selector.getLoggerContext().getName());
        contextDetachingSCL.contextDestroyed(null);
    
        assertEquals(2, selector.getCount());
      }
      
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/generateLogsInSafeMode.sh�����������������������������������0000644�0001750�0001750�00000001656�11377016712�024626� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������echo "File name $1"
    echo "run length $2"
    
    
    
    #On windows
    #CLASSPATH="${CLASSPATH};./target/classes/"
    #CLASSPATH="${CLASSPATH};./target/test-classes/"
    #CLASSPATH="${CLASSPATH};../logback-core/target/classes"
    #CLASSPATH="${CLASSPATH};../logback-examples/lib/slf4j-api-1.5.5.jar"
    
    # On Unix
    #CLASSPATH="${CLASSPATH}:./target/classes/"
    #CLASSPATH="${CLASSPATH}:./target/test-classes/"
    #CLASSPATH="${CLASSPATH}:../logback-core/target/classes"
    #CLASSPATH="${CLASSPATH}:../logback-examples/lib/slf4j-api-1.5.5.jar"
    
    
    if [ $# -lt 3 ]
    then 
      echo "Usage: generateLogsInSafeMode.sh filename runLen stamp0 ... stampN"
      exit 1;
    fi
    
    FILENAME=$1
    LEN=$2
    
    shift 2
    
    for stamp in $@
    do 
      echo running safe mode with $stamp
      java ch.qos.logback.classic.multiJVM.SafeModeFileAppender $stamp $LEN $FILENAME &
    done
    
    wait
    
    echo "To test the results issue the following command"
    echo "./checkResults.sh $FILENAME $LEN $*"
    
    ����������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/resources/��������������������������������������������������0000755�0001750�0001750�00000000000�12203357067�021762� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/resources/asResource/���������������������������������������0000755�0001750�0001750�00000000000�12203357067�024075� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/resources/asResource/inner1.xml�����������������������������0000644�0001750�0001750�00000000066�11517502017�026007� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<included>
      <root level="ERROR"/>    
    </included>
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/resources/dtd/����������������������������������������������0000755�0001750�0001750�00000000000�12203357067�022535� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/resources/dtd/xhtml-lat1.ent��������������������������������0000644�0001750�0001750�00000027303�11377016712�025245� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!-- Portions (C) International Organization for Standardization 1986
         Permission to copy in any form is granted for use with
         conforming SGML systems and applications as defined in
         ISO 8879, provided this notice is included in all copies.
    -->
    <!-- Character entity set. Typical invocation:
        <!ENTITY % HTMLlat1 PUBLIC
           "-//W3C//ENTITIES Latin 1 for XHTML//EN"
           "http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent">
        %HTMLlat1;
    -->
    
    <!ENTITY nbsp   "&#160;"> <!-- no-break space = non-breaking space,
                                      U+00A0 ISOnum -->
    <!ENTITY iexcl  "&#161;"> <!-- inverted exclamation mark, U+00A1 ISOnum -->
    <!ENTITY cent   "&#162;"> <!-- cent sign, U+00A2 ISOnum -->
    <!ENTITY pound  "&#163;"> <!-- pound sign, U+00A3 ISOnum -->
    <!ENTITY curren "&#164;"> <!-- currency sign, U+00A4 ISOnum -->
    <!ENTITY yen    "&#165;"> <!-- yen sign = yuan sign, U+00A5 ISOnum -->
    <!ENTITY brvbar "&#166;"> <!-- broken bar = broken vertical bar,
                                      U+00A6 ISOnum -->
    <!ENTITY sect   "&#167;"> <!-- section sign, U+00A7 ISOnum -->
    <!ENTITY uml    "&#168;"> <!-- diaeresis = spacing diaeresis,
                                      U+00A8 ISOdia -->
    <!ENTITY copy   "&#169;"> <!-- copyright sign, U+00A9 ISOnum -->
    <!ENTITY ordf   "&#170;"> <!-- feminine ordinal indicator, U+00AA ISOnum -->
    <!ENTITY laquo  "&#171;"> <!-- left-pointing double angle quotation mark
                                      = left pointing guillemet, U+00AB ISOnum -->
    <!ENTITY not    "&#172;"> <!-- not sign = angled dash,
                                      U+00AC ISOnum -->
    <!ENTITY shy    "&#173;"> <!-- soft hyphen = discretionary hyphen,
                                      U+00AD ISOnum -->
    <!ENTITY reg    "&#174;"> <!-- registered sign = registered trade mark sign,
                                      U+00AE ISOnum -->
    <!ENTITY macr   "&#175;"> <!-- macron = spacing macron = overline
                                      = APL overbar, U+00AF ISOdia -->
    <!ENTITY deg    "&#176;"> <!-- degree sign, U+00B0 ISOnum -->
    <!ENTITY plusmn "&#177;"> <!-- plus-minus sign = plus-or-minus sign,
                                      U+00B1 ISOnum -->
    <!ENTITY sup2   "&#178;"> <!-- superscript two = superscript digit two
                                      = squared, U+00B2 ISOnum -->
    <!ENTITY sup3   "&#179;"> <!-- superscript three = superscript digit three
                                      = cubed, U+00B3 ISOnum -->
    <!ENTITY acute  "&#180;"> <!-- acute accent = spacing acute,
                                      U+00B4 ISOdia -->
    <!ENTITY micro  "&#181;"> <!-- micro sign, U+00B5 ISOnum -->
    <!ENTITY para   "&#182;"> <!-- pilcrow sign = paragraph sign,
                                      U+00B6 ISOnum -->
    <!ENTITY middot "&#183;"> <!-- middle dot = Georgian comma
                                      = Greek middle dot, U+00B7 ISOnum -->
    <!ENTITY cedil  "&#184;"> <!-- cedilla = spacing cedilla, U+00B8 ISOdia -->
    <!ENTITY sup1   "&#185;"> <!-- superscript one = superscript digit one,
                                      U+00B9 ISOnum -->
    <!ENTITY ordm   "&#186;"> <!-- masculine ordinal indicator,
                                      U+00BA ISOnum -->
    <!ENTITY raquo  "&#187;"> <!-- right-pointing double angle quotation mark
                                      = right pointing guillemet, U+00BB ISOnum -->
    <!ENTITY frac14 "&#188;"> <!-- vulgar fraction one quarter
                                      = fraction one quarter, U+00BC ISOnum -->
    <!ENTITY frac12 "&#189;"> <!-- vulgar fraction one half
                                      = fraction one half, U+00BD ISOnum -->
    <!ENTITY frac34 "&#190;"> <!-- vulgar fraction three quarters
                                      = fraction three quarters, U+00BE ISOnum -->
    <!ENTITY iquest "&#191;"> <!-- inverted question mark
                                      = turned question mark, U+00BF ISOnum -->
    <!ENTITY Agrave "&#192;"> <!-- latin capital letter A with grave
                                      = latin capital letter A grave,
                                      U+00C0 ISOlat1 -->
    <!ENTITY Aacute "&#193;"> <!-- latin capital letter A with acute,
                                      U+00C1 ISOlat1 -->
    <!ENTITY Acirc  "&#194;"> <!-- latin capital letter A with circumflex,
                                      U+00C2 ISOlat1 -->
    <!ENTITY Atilde "&#195;"> <!-- latin capital letter A with tilde,
                                      U+00C3 ISOlat1 -->
    <!ENTITY Auml   "&#196;"> <!-- latin capital letter A with diaeresis,
                                      U+00C4 ISOlat1 -->
    <!ENTITY Aring  "&#197;"> <!-- latin capital letter A with ring above
                                      = latin capital letter A ring,
                                      U+00C5 ISOlat1 -->
    <!ENTITY AElig  "&#198;"> <!-- latin capital letter AE
                                      = latin capital ligature AE,
                                      U+00C6 ISOlat1 -->
    <!ENTITY Ccedil "&#199;"> <!-- latin capital letter C with cedilla,
                                      U+00C7 ISOlat1 -->
    <!ENTITY Egrave "&#200;"> <!-- latin capital letter E with grave,
                                      U+00C8 ISOlat1 -->
    <!ENTITY Eacute "&#201;"> <!-- latin capital letter E with acute,
                                      U+00C9 ISOlat1 -->
    <!ENTITY Ecirc  "&#202;"> <!-- latin capital letter E with circumflex,
                                      U+00CA ISOlat1 -->
    <!ENTITY Euml   "&#203;"> <!-- latin capital letter E with diaeresis,
                                      U+00CB ISOlat1 -->
    <!ENTITY Igrave "&#204;"> <!-- latin capital letter I with grave,
                                      U+00CC ISOlat1 -->
    <!ENTITY Iacute "&#205;"> <!-- latin capital letter I with acute,
                                      U+00CD ISOlat1 -->
    <!ENTITY Icirc  "&#206;"> <!-- latin capital letter I with circumflex,
                                      U+00CE ISOlat1 -->
    <!ENTITY Iuml   "&#207;"> <!-- latin capital letter I with diaeresis,
                                      U+00CF ISOlat1 -->
    <!ENTITY ETH    "&#208;"> <!-- latin capital letter ETH, U+00D0 ISOlat1 -->
    <!ENTITY Ntilde "&#209;"> <!-- latin capital letter N with tilde,
                                      U+00D1 ISOlat1 -->
    <!ENTITY Ograve "&#210;"> <!-- latin capital letter O with grave,
                                      U+00D2 ISOlat1 -->
    <!ENTITY Oacute "&#211;"> <!-- latin capital letter O with acute,
                                      U+00D3 ISOlat1 -->
    <!ENTITY Ocirc  "&#212;"> <!-- latin capital letter O with circumflex,
                                      U+00D4 ISOlat1 -->
    <!ENTITY Otilde "&#213;"> <!-- latin capital letter O with tilde,
                                      U+00D5 ISOlat1 -->
    <!ENTITY Ouml   "&#214;"> <!-- latin capital letter O with diaeresis,
                                      U+00D6 ISOlat1 -->
    <!ENTITY times  "&#215;"> <!-- multiplication sign, U+00D7 ISOnum -->
    <!ENTITY Oslash "&#216;"> <!-- latin capital letter O with stroke
                                      = latin capital letter O slash,
                                      U+00D8 ISOlat1 -->
    <!ENTITY Ugrave "&#217;"> <!-- latin capital letter U with grave,
                                      U+00D9 ISOlat1 -->
    <!ENTITY Uacute "&#218;"> <!-- latin capital letter U with acute,
                                      U+00DA ISOlat1 -->
    <!ENTITY Ucirc  "&#219;"> <!-- latin capital letter U with circumflex,
                                      U+00DB ISOlat1 -->
    <!ENTITY Uuml   "&#220;"> <!-- latin capital letter U with diaeresis,
                                      U+00DC ISOlat1 -->
    <!ENTITY Yacute "&#221;"> <!-- latin capital letter Y with acute,
                                      U+00DD ISOlat1 -->
    <!ENTITY THORN  "&#222;"> <!-- latin capital letter THORN,
                                      U+00DE ISOlat1 -->
    <!ENTITY szlig  "&#223;"> <!-- latin small letter sharp s = ess-zed,
                                      U+00DF ISOlat1 -->
    <!ENTITY agrave "&#224;"> <!-- latin small letter a with grave
                                      = latin small letter a grave,
                                      U+00E0 ISOlat1 -->
    <!ENTITY aacute "&#225;"> <!-- latin small letter a with acute,
                                      U+00E1 ISOlat1 -->
    <!ENTITY acirc  "&#226;"> <!-- latin small letter a with circumflex,
                                      U+00E2 ISOlat1 -->
    <!ENTITY atilde "&#227;"> <!-- latin small letter a with tilde,
                                      U+00E3 ISOlat1 -->
    <!ENTITY auml   "&#228;"> <!-- latin small letter a with diaeresis,
                                      U+00E4 ISOlat1 -->
    <!ENTITY aring  "&#229;"> <!-- latin small letter a with ring above
                                      = latin small letter a ring,
                                      U+00E5 ISOlat1 -->
    <!ENTITY aelig  "&#230;"> <!-- latin small letter ae
                                      = latin small ligature ae, U+00E6 ISOlat1 -->
    <!ENTITY ccedil "&#231;"> <!-- latin small letter c with cedilla,
                                      U+00E7 ISOlat1 -->
    <!ENTITY egrave "&#232;"> <!-- latin small letter e with grave,
                                      U+00E8 ISOlat1 -->
    <!ENTITY eacute "&#233;"> <!-- latin small letter e with acute,
                                      U+00E9 ISOlat1 -->
    <!ENTITY ecirc  "&#234;"> <!-- latin small letter e with circumflex,
                                      U+00EA ISOlat1 -->
    <!ENTITY euml   "&#235;"> <!-- latin small letter e with diaeresis,
                                      U+00EB ISOlat1 -->
    <!ENTITY igrave "&#236;"> <!-- latin small letter i with grave,
                                      U+00EC ISOlat1 -->
    <!ENTITY iacute "&#237;"> <!-- latin small letter i with acute,
                                      U+00ED ISOlat1 -->
    <!ENTITY icirc  "&#238;"> <!-- latin small letter i with circumflex,
                                      U+00EE ISOlat1 -->
    <!ENTITY iuml   "&#239;"> <!-- latin small letter i with diaeresis,
                                      U+00EF ISOlat1 -->
    <!ENTITY eth    "&#240;"> <!-- latin small letter eth, U+00F0 ISOlat1 -->
    <!ENTITY ntilde "&#241;"> <!-- latin small letter n with tilde,
                                      U+00F1 ISOlat1 -->
    <!ENTITY ograve "&#242;"> <!-- latin small letter o with grave,
                                      U+00F2 ISOlat1 -->
    <!ENTITY oacute "&#243;"> <!-- latin small letter o with acute,
                                      U+00F3 ISOlat1 -->
    <!ENTITY ocirc  "&#244;"> <!-- latin small letter o with circumflex,
                                      U+00F4 ISOlat1 -->
    <!ENTITY otilde "&#245;"> <!-- latin small letter o with tilde,
                                      U+00F5 ISOlat1 -->
    <!ENTITY ouml   "&#246;"> <!-- latin small letter o with diaeresis,
                                      U+00F6 ISOlat1 -->
    <!ENTITY divide "&#247;"> <!-- division sign, U+00F7 ISOnum -->
    <!ENTITY oslash "&#248;"> <!-- latin small letter o with stroke,
                                      = latin small letter o slash,
                                      U+00F8 ISOlat1 -->
    <!ENTITY ugrave "&#249;"> <!-- latin small letter u with grave,
                                      U+00F9 ISOlat1 -->
    <!ENTITY uacute "&#250;"> <!-- latin small letter u with acute,
                                      U+00FA ISOlat1 -->
    <!ENTITY ucirc  "&#251;"> <!-- latin small letter u with circumflex,
                                      U+00FB ISOlat1 -->
    <!ENTITY uuml   "&#252;"> <!-- latin small letter u with diaeresis,
                                      U+00FC ISOlat1 -->
    <!ENTITY yacute "&#253;"> <!-- latin small letter y with acute,
                                      U+00FD ISOlat1 -->
    <!ENTITY thorn  "&#254;"> <!-- latin small letter thorn,
                                      U+00FE ISOlat1 -->
    <!ENTITY yuml   "&#255;"> <!-- latin small letter y with diaeresis,
                                      U+00FF ISOlat1 -->
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/resources/dtd/xhtml-special.ent�����������������������������0000644�0001750�0001750�00000010163�11377016712�026020� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!-- Special characters for XHTML -->
    
    <!-- Character entity set. Typical invocation:
         <!ENTITY % HTMLspecial PUBLIC
            "-//W3C//ENTITIES Special for XHTML//EN"
            "http://www.w3.org/TR/xhtml1/DTD/xhtml-special.ent">
         %HTMLspecial;
    -->
    
    <!-- Portions (C) International Organization for Standardization 1986:
         Permission to copy in any form is granted for use with
         conforming SGML systems and applications as defined in
         ISO 8879, provided this notice is included in all copies.
    -->
    
    <!-- Relevant ISO entity set is given unless names are newly introduced.
         New names (i.e., not in ISO 8879 list) do not clash with any
         existing ISO 8879 entity names. ISO 10646 character numbers
         are given for each character, in hex. values are decimal
         conversions of the ISO 10646 values and refer to the document
         character set. Names are Unicode names. 
    -->
    
    <!-- C0 Controls and Basic Latin -->
    <!ENTITY quot    "&#34;"> <!--  quotation mark, U+0022 ISOnum -->
    <!ENTITY amp     "&#38;#38;"> <!--  ampersand, U+0026 ISOnum -->
    <!ENTITY lt      "&#38;#60;"> <!--  less-than sign, U+003C ISOnum -->
    <!ENTITY gt      "&#62;"> <!--  greater-than sign, U+003E ISOnum -->
    <!ENTITY apos	 "&#39;"> <!--  apostrophe = APL quote, U+0027 ISOnum -->
    
    <!-- Latin Extended-A -->
    <!ENTITY OElig   "&#338;"> <!--  latin capital ligature OE,
                                        U+0152 ISOlat2 -->
    <!ENTITY oelig   "&#339;"> <!--  latin small ligature oe, U+0153 ISOlat2 -->
    <!-- ligature is a misnomer, this is a separate character in some languages -->
    <!ENTITY Scaron  "&#352;"> <!--  latin capital letter S with caron,
                                        U+0160 ISOlat2 -->
    <!ENTITY scaron  "&#353;"> <!--  latin small letter s with caron,
                                        U+0161 ISOlat2 -->
    <!ENTITY Yuml    "&#376;"> <!--  latin capital letter Y with diaeresis,
                                        U+0178 ISOlat2 -->
    
    <!-- Spacing Modifier Letters -->
    <!ENTITY circ    "&#710;"> <!--  modifier letter circumflex accent,
                                        U+02C6 ISOpub -->
    <!ENTITY tilde   "&#732;"> <!--  small tilde, U+02DC ISOdia -->
    
    <!-- General Punctuation -->
    <!ENTITY ensp    "&#8194;"> <!-- en space, U+2002 ISOpub -->
    <!ENTITY emsp    "&#8195;"> <!-- em space, U+2003 ISOpub -->
    <!ENTITY thinsp  "&#8201;"> <!-- thin space, U+2009 ISOpub -->
    <!ENTITY zwnj    "&#8204;"> <!-- zero width non-joiner,
                                        U+200C NEW RFC 2070 -->
    <!ENTITY zwj     "&#8205;"> <!-- zero width joiner, U+200D NEW RFC 2070 -->
    <!ENTITY lrm     "&#8206;"> <!-- left-to-right mark, U+200E NEW RFC 2070 -->
    <!ENTITY rlm     "&#8207;"> <!-- right-to-left mark, U+200F NEW RFC 2070 -->
    <!ENTITY ndash   "&#8211;"> <!-- en dash, U+2013 ISOpub -->
    <!ENTITY mdash   "&#8212;"> <!-- em dash, U+2014 ISOpub -->
    <!ENTITY lsquo   "&#8216;"> <!-- left single quotation mark,
                                        U+2018 ISOnum -->
    <!ENTITY rsquo   "&#8217;"> <!-- right single quotation mark,
                                        U+2019 ISOnum -->
    <!ENTITY sbquo   "&#8218;"> <!-- single low-9 quotation mark, U+201A NEW -->
    <!ENTITY ldquo   "&#8220;"> <!-- left double quotation mark,
                                        U+201C ISOnum -->
    <!ENTITY rdquo   "&#8221;"> <!-- right double quotation mark,
                                        U+201D ISOnum -->
    <!ENTITY bdquo   "&#8222;"> <!-- double low-9 quotation mark, U+201E NEW -->
    <!ENTITY dagger  "&#8224;"> <!-- dagger, U+2020 ISOpub -->
    <!ENTITY Dagger  "&#8225;"> <!-- double dagger, U+2021 ISOpub -->
    <!ENTITY permil  "&#8240;"> <!-- per mille sign, U+2030 ISOtech -->
    <!ENTITY lsaquo  "&#8249;"> <!-- single left-pointing angle quotation mark,
                                        U+2039 ISO proposed -->
    <!-- lsaquo is proposed but not yet ISO standardized -->
    <!ENTITY rsaquo  "&#8250;"> <!-- single right-pointing angle quotation mark,
                                        U+203A ISO proposed -->
    <!-- rsaquo is proposed but not yet ISO standardized -->
    
    <!-- Currency Symbols -->
    <!ENTITY euro   "&#8364;"> <!--  euro sign, U+20AC NEW -->
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/resources/dtd/xhtml1-strict.dtd�����������������������������0000644�0001750�0001750�00000063522�11377016712�025765� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!--
       Extensible HTML version 1.0 Strict DTD
    
       This is the same as HTML 4 Strict except for
       changes due to the differences between XML and SGML.
    
       Namespace = http://www.w3.org/1999/xhtml
    
       For further information, see: http://www.w3.org/TR/xhtml1
    
       Copyright (c) 1998-2002 W3C (MIT, INRIA, Keio),
       All Rights Reserved. 
    
       This DTD module is identified by the PUBLIC and SYSTEM identifiers:
    
       PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
       SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
    
       $Revision: 1.1 $
       $Date: 2002/08/01 13:56:03 $
    
    -->
    
    <!--================ Character mnemonic entities =========================-->
    
    <!ENTITY % HTMLlat1 PUBLIC
       "-//W3C//ENTITIES Latin 1 for XHTML//EN"
       "xhtml-lat1.ent">
    %HTMLlat1;
    
    <!ENTITY % HTMLsymbol PUBLIC
       "-//W3C//ENTITIES Symbols for XHTML//EN"
       "xhtml-symbol.ent">
    %HTMLsymbol;
    
    <!ENTITY % HTMLspecial PUBLIC
       "-//W3C//ENTITIES Special for XHTML//EN"
       "xhtml-special.ent">
    %HTMLspecial;
    
    <!--================== Imported Names ====================================-->
    
    <!ENTITY % ContentType "CDATA">
        <!-- media type, as per [RFC2045] -->
    
    <!ENTITY % ContentTypes "CDATA">
        <!-- comma-separated list of media types, as per [RFC2045] -->
    
    <!ENTITY % Charset "CDATA">
        <!-- a character encoding, as per [RFC2045] -->
    
    <!ENTITY % Charsets "CDATA">
        <!-- a space separated list of character encodings, as per [RFC2045] -->
    
    <!ENTITY % LanguageCode "NMTOKEN">
        <!-- a language code, as per [RFC3066] -->
    
    <!ENTITY % Character "CDATA">
        <!-- a single character, as per section 2.2 of [XML] -->
    
    <!ENTITY % Number "CDATA">
        <!-- one or more digits -->
    
    <!ENTITY % LinkTypes "CDATA">
        <!-- space-separated list of link types -->
    
    <!ENTITY % MediaDesc "CDATA">
        <!-- single or comma-separated list of media descriptors -->
    
    <!ENTITY % URI "CDATA">
        <!-- a Uniform Resource Identifier, see [RFC2396] -->
    
    <!ENTITY % UriList "CDATA">
        <!-- a space separated list of Uniform Resource Identifiers -->
    
    <!ENTITY % Datetime "CDATA">
        <!-- date and time information. ISO date format -->
    
    <!ENTITY % Script "CDATA">
        <!-- script expression -->
    
    <!ENTITY % StyleSheet "CDATA">
        <!-- style sheet data -->
    
    <!ENTITY % Text "CDATA">
        <!-- used for titles etc. -->
    
    <!ENTITY % Length "CDATA">
        <!-- nn for pixels or nn% for percentage length -->
    
    <!ENTITY % MultiLength "CDATA">
        <!-- pixel, percentage, or relative -->
    
    <!ENTITY % Pixels "CDATA">
        <!-- integer representing length in pixels -->
    
    <!-- these are used for image maps -->
    
    <!ENTITY % Shape "(rect|circle|poly|default)">
    
    <!ENTITY % Coords "CDATA">
        <!-- comma separated list of lengths -->
    
    <!--=================== Generic Attributes ===============================-->
    
    <!-- core attributes common to most elements
      id       document-wide unique id
      class    space separated list of classes
      style    associated style info
      title    advisory title/amplification
    -->
    <!ENTITY % coreattrs
     "id          ID             #IMPLIED
      class       CDATA          #IMPLIED
      style       %StyleSheet;   #IMPLIED
      title       %Text;         #IMPLIED"
      >
    
    <!-- internationalization attributes
      lang        language code (backwards compatible)
      xml:lang    language code (as per XML 1.0 spec)
      dir         direction for weak/neutral text
    -->
    <!ENTITY % i18n
     "lang        %LanguageCode; #IMPLIED
      xml:lang    %LanguageCode; #IMPLIED
      dir         (ltr|rtl)      #IMPLIED"
      >
    
    <!-- attributes for common UI events
      onclick     a pointer button was clicked
      ondblclick  a pointer button was double clicked
      onmousedown a pointer button was pressed down
      onmouseup   a pointer button was released
      onmousemove a pointer was moved onto the element
      onmouseout  a pointer was moved away from the element
      onkeypress  a key was pressed and released
      onkeydown   a key was pressed down
      onkeyup     a key was released
    -->
    <!ENTITY % events
     "onclick     %Script;       #IMPLIED
      ondblclick  %Script;       #IMPLIED
      onmousedown %Script;       #IMPLIED
      onmouseup   %Script;       #IMPLIED
      onmouseover %Script;       #IMPLIED
      onmousemove %Script;       #IMPLIED
      onmouseout  %Script;       #IMPLIED
      onkeypress  %Script;       #IMPLIED
      onkeydown   %Script;       #IMPLIED
      onkeyup     %Script;       #IMPLIED"
      >
    
    <!-- attributes for elements that can get the focus
      accesskey   accessibility key character
      tabindex    position in tabbing order
      onfocus     the element got the focus
      onblur      the element lost the focus
    -->
    <!ENTITY % focus
     "accesskey   %Character;    #IMPLIED
      tabindex    %Number;       #IMPLIED
      onfocus     %Script;       #IMPLIED
      onblur      %Script;       #IMPLIED"
      >
    
    <!ENTITY % attrs "%coreattrs; %i18n; %events;">
    
    <!--=================== Text Elements ====================================-->
    
    <!ENTITY % special.pre
       "br | span | bdo | map">
    
    
    <!ENTITY % special
       "%special.pre; | object | img ">
    
    <!ENTITY % fontstyle "tt | i | b | big | small ">
    
    <!ENTITY % phrase "em | strong | dfn | code | q |
                       samp | kbd | var | cite | abbr | acronym | sub | sup ">
    
    <!ENTITY % inline.forms "input | select | textarea | label | button">
    
    <!-- these can occur at block or inline level -->
    <!ENTITY % misc.inline "ins | del | script">
    
    <!-- these can only occur at block level -->
    <!ENTITY % misc "noscript | %misc.inline;">
    
    <!ENTITY % inline "a | %special; | %fontstyle; | %phrase; | %inline.forms;">
    
    <!-- %Inline; covers inline or "text-level" elements -->
    <!ENTITY % Inline "(#PCDATA | %inline; | %misc.inline;)*">
    
    <!--================== Block level elements ==============================-->
    
    <!ENTITY % heading "h1|h2|h3|h4|h5|h6">
    <!ENTITY % lists "ul | ol | dl">
    <!ENTITY % blocktext "pre | hr | blockquote | address">
    
    <!ENTITY % block
         "p | %heading; | div | %lists; | %blocktext; | fieldset | table">
    
    <!ENTITY % Block "(%block; | form | %misc;)*">
    
    <!-- %Flow; mixes block and inline and is used for list items etc. -->
    <!ENTITY % Flow "(#PCDATA | %block; | form | %inline; | %misc;)*">
    
    <!--================== Content models for exclusions =====================-->
    
    <!-- a elements use %Inline; excluding a -->
    
    <!ENTITY % a.content
       "(#PCDATA | %special; | %fontstyle; | %phrase; | %inline.forms; | %misc.inline;)*">
    
    <!-- pre uses %Inline excluding big, small, sup or sup -->
    
    <!ENTITY % pre.content
       "(#PCDATA | a | %fontstyle; | %phrase; | %special.pre; | %misc.inline;
          | %inline.forms;)*">
    
    <!-- form uses %Block; excluding form -->
    
    <!ENTITY % form.content "(%block; | %misc;)*">
    
    <!-- button uses %Flow; but excludes a, form and form controls -->
    
    <!ENTITY % button.content
       "(#PCDATA | p | %heading; | div | %lists; | %blocktext; |
        table | %special; | %fontstyle; | %phrase; | %misc;)*">
    
    <!--================ Document Structure ==================================-->
    
    <!-- the namespace URI designates the document profile -->
    
    <!ELEMENT html (head, body)>
    <!ATTLIST html
      %i18n;
      id          ID             #IMPLIED
      xmlns       %URI;          #FIXED 'http://www.w3.org/1999/xhtml'
      >
    
    <!--================ Document Head =======================================-->
    
    <!ENTITY % head.misc "(script|style|meta|link|object)*">
    
    <!-- content model is %head.misc; combined with a single
         title and an optional base element in any order -->
    
    <!ELEMENT head (%head.misc;,
         ((title, %head.misc;, (base, %head.misc;)?) |
          (base, %head.misc;, (title, %head.misc;))))>
    
    <!ATTLIST head
      %i18n;
      id          ID             #IMPLIED
      profile     %URI;          #IMPLIED
      >
    
    <!-- The title element is not considered part of the flow of text.
           It should be displayed, for example as the page header or
           window title. Exactly one title is required per document.
        -->
    <!ELEMENT title (#PCDATA)>
    <!ATTLIST title 
      %i18n;
      id          ID             #IMPLIED
      >
    
    <!-- document base URI -->
    
    <!ELEMENT base EMPTY>
    <!ATTLIST base
      href        %URI;          #REQUIRED
      id          ID             #IMPLIED
      >
    
    <!-- generic metainformation -->
    <!ELEMENT meta EMPTY>
    <!ATTLIST meta
      %i18n;
      id          ID             #IMPLIED
      http-equiv  CDATA          #IMPLIED
      name        CDATA          #IMPLIED
      content     CDATA          #REQUIRED
      scheme      CDATA          #IMPLIED
      >
    
    <!--
      Relationship values can be used in principle:
    
       a) for document specific toolbars/menus when used
          with the link element in document head e.g.
            start, contents, previous, next, index, end, help
       b) to link to a separate style sheet (rel="stylesheet")
       c) to make a link to a script (rel="script")
       d) by stylesheets to control how collections of
          html nodes are rendered into printed documents
       e) to make a link to a printable version of this document
          e.g. a PostScript or PDF version (rel="alternate" media="print")
    -->
    
    <!ELEMENT link EMPTY>
    <!ATTLIST link
      %attrs;
      charset     %Charset;      #IMPLIED
      href        %URI;          #IMPLIED
      hreflang    %LanguageCode; #IMPLIED
      type        %ContentType;  #IMPLIED
      rel         %LinkTypes;    #IMPLIED
      rev         %LinkTypes;    #IMPLIED
      media       %MediaDesc;    #IMPLIED
      >
    
    <!-- style info, which may include CDATA sections -->
    <!ELEMENT style (#PCDATA)>
    <!ATTLIST style
      %i18n;
      id          ID             #IMPLIED
      type        %ContentType;  #REQUIRED
      media       %MediaDesc;    #IMPLIED
      title       %Text;         #IMPLIED
      xml:space   (preserve)     #FIXED 'preserve'
      >
    
    <!-- script statements, which may include CDATA sections -->
    <!ELEMENT script (#PCDATA)>
    <!ATTLIST script
      id          ID             #IMPLIED
      charset     %Charset;      #IMPLIED
      type        %ContentType;  #REQUIRED
      src         %URI;          #IMPLIED
      defer       (defer)        #IMPLIED
      xml:space   (preserve)     #FIXED 'preserve'
      >
    
    <!-- alternate content container for non script-based rendering -->
    
    <!ELEMENT noscript %Block;>
    <!ATTLIST noscript
      %attrs;
      >
    
    <!--=================== Document Body ====================================-->
    
    <!ELEMENT body %Block;>
    <!ATTLIST body
      %attrs;
      onload          %Script;   #IMPLIED
      onunload        %Script;   #IMPLIED
      >
    
    <!ELEMENT div %Flow;>  <!-- generic language/style container -->
    <!ATTLIST div
      %attrs;
      >
    
    <!--=================== Paragraphs =======================================-->
    
    <!ELEMENT p %Inline;>
    <!ATTLIST p
      %attrs;
      >
    
    <!--=================== Headings =========================================-->
    
    <!--
      There are six levels of headings from h1 (the most important)
      to h6 (the least important).
    -->
    
    <!ELEMENT h1  %Inline;>
    <!ATTLIST h1
       %attrs;
       >
    
    <!ELEMENT h2 %Inline;>
    <!ATTLIST h2
       %attrs;
       >
    
    <!ELEMENT h3 %Inline;>
    <!ATTLIST h3
       %attrs;
       >
    
    <!ELEMENT h4 %Inline;>
    <!ATTLIST h4
       %attrs;
       >
    
    <!ELEMENT h5 %Inline;>
    <!ATTLIST h5
       %attrs;
       >
    
    <!ELEMENT h6 %Inline;>
    <!ATTLIST h6
       %attrs;
       >
    
    <!--=================== Lists ============================================-->
    
    <!-- Unordered list -->
    
    <!ELEMENT ul (li)+>
    <!ATTLIST ul
      %attrs;
      >
    
    <!-- Ordered (numbered) list -->
    
    <!ELEMENT ol (li)+>
    <!ATTLIST ol
      %attrs;
      >
    
    <!-- list item -->
    
    <!ELEMENT li %Flow;>
    <!ATTLIST li
      %attrs;
      >
    
    <!-- definition lists - dt for term, dd for its definition -->
    
    <!ELEMENT dl (dt|dd)+>
    <!ATTLIST dl
      %attrs;
      >
    
    <!ELEMENT dt %Inline;>
    <!ATTLIST dt
      %attrs;
      >
    
    <!ELEMENT dd %Flow;>
    <!ATTLIST dd
      %attrs;
      >
    
    <!--=================== Address ==========================================-->
    
    <!-- information on author -->
    
    <!ELEMENT address %Inline;>
    <!ATTLIST address
      %attrs;
      >
    
    <!--=================== Horizontal Rule ==================================-->
    
    <!ELEMENT hr EMPTY>
    <!ATTLIST hr
      %attrs;
      >
    
    <!--=================== Preformatted Text ================================-->
    
    <!-- content is %Inline; excluding "img|object|big|small|sub|sup" -->
    
    <!ELEMENT pre %pre.content;>
    <!ATTLIST pre
      %attrs;
      xml:space (preserve) #FIXED 'preserve'
      >
    
    <!--=================== Block-like Quotes ================================-->
    
    <!ELEMENT blockquote %Block;>
    <!ATTLIST blockquote
      %attrs;
      cite        %URI;          #IMPLIED
      >
    
    <!--=================== Inserted/Deleted Text ============================-->
    
    <!--
      ins/del are allowed in block and inline content, but its
      inappropriate to include block content within an ins element
      occurring in inline content.
    -->
    <!ELEMENT ins %Flow;>
    <!ATTLIST ins
      %attrs;
      cite        %URI;          #IMPLIED
      datetime    %Datetime;     #IMPLIED
      >
    
    <!ELEMENT del %Flow;>
    <!ATTLIST del
      %attrs;
      cite        %URI;          #IMPLIED
      datetime    %Datetime;     #IMPLIED
      >
    
    <!--================== The Anchor Element ================================-->
    
    <!-- content is %Inline; except that anchors shouldn't be nested -->
    
    <!ELEMENT a %a.content;>
    <!ATTLIST a
      %attrs;
      %focus;
      charset     %Charset;      #IMPLIED
      type        %ContentType;  #IMPLIED
      name        NMTOKEN        #IMPLIED
      href        %URI;          #IMPLIED
      hreflang    %LanguageCode; #IMPLIED
      rel         %LinkTypes;    #IMPLIED
      rev         %LinkTypes;    #IMPLIED
      shape       %Shape;        "rect"
      coords      %Coords;       #IMPLIED
      >
    
    <!--===================== Inline Elements ================================-->
    
    <!ELEMENT span %Inline;> <!-- generic language/style container -->
    <!ATTLIST span
      %attrs;
      >
    
    <!ELEMENT bdo %Inline;>  <!-- I18N BiDi over-ride -->
    <!ATTLIST bdo
      %coreattrs;
      %events;
      lang        %LanguageCode; #IMPLIED
      xml:lang    %LanguageCode; #IMPLIED
      dir         (ltr|rtl)      #REQUIRED
      >
    
    <!ELEMENT br EMPTY>   <!-- forced line break -->
    <!ATTLIST br
      %coreattrs;
      >
    
    <!ELEMENT em %Inline;>   <!-- emphasis -->
    <!ATTLIST em %attrs;>
    
    <!ELEMENT strong %Inline;>   <!-- strong emphasis -->
    <!ATTLIST strong %attrs;>
    
    <!ELEMENT dfn %Inline;>   <!-- definitional -->
    <!ATTLIST dfn %attrs;>
    
    <!ELEMENT code %Inline;>   <!-- program code -->
    <!ATTLIST code %attrs;>
    
    <!ELEMENT samp %Inline;>   <!-- sample -->
    <!ATTLIST samp %attrs;>
    
    <!ELEMENT kbd %Inline;>  <!-- something user would type -->
    <!ATTLIST kbd %attrs;>
    
    <!ELEMENT var %Inline;>   <!-- variable -->
    <!ATTLIST var %attrs;>
    
    <!ELEMENT cite %Inline;>   <!-- citation -->
    <!ATTLIST cite %attrs;>
    
    <!ELEMENT abbr %Inline;>   <!-- abbreviation -->
    <!ATTLIST abbr %attrs;>
    
    <!ELEMENT acronym %Inline;>   <!-- acronym -->
    <!ATTLIST acronym %attrs;>
    
    <!ELEMENT q %Inline;>   <!-- inlined quote -->
    <!ATTLIST q
      %attrs;
      cite        %URI;          #IMPLIED
      >
    
    <!ELEMENT sub %Inline;> <!-- subscript -->
    <!ATTLIST sub %attrs;>
    
    <!ELEMENT sup %Inline;> <!-- superscript -->
    <!ATTLIST sup %attrs;>
    
    <!ELEMENT tt %Inline;>   <!-- fixed pitch font -->
    <!ATTLIST tt %attrs;>
    
    <!ELEMENT i %Inline;>   <!-- italic font -->
    <!ATTLIST i %attrs;>
    
    <!ELEMENT b %Inline;>   <!-- bold font -->
    <!ATTLIST b %attrs;>
    
    <!ELEMENT big %Inline;>   <!-- bigger font -->
    <!ATTLIST big %attrs;>
    
    <!ELEMENT small %Inline;>   <!-- smaller font -->
    <!ATTLIST small %attrs;>
    
    <!--==================== Object ======================================-->
    <!--
      object is used to embed objects as part of HTML pages.
      param elements should precede other content. Parameters
      can also be expressed as attribute/value pairs on the
      object element itself when brevity is desired.
    -->
    
    <!ELEMENT object (#PCDATA | param | %block; | form | %inline; | %misc;)*>
    <!ATTLIST object
      %attrs;
      declare     (declare)      #IMPLIED
      classid     %URI;          #IMPLIED
      codebase    %URI;          #IMPLIED
      data        %URI;          #IMPLIED
      type        %ContentType;  #IMPLIED
      codetype    %ContentType;  #IMPLIED
      archive     %UriList;      #IMPLIED
      standby     %Text;         #IMPLIED
      height      %Length;       #IMPLIED
      width       %Length;       #IMPLIED
      usemap      %URI;          #IMPLIED
      name        NMTOKEN        #IMPLIED
      tabindex    %Number;       #IMPLIED
      >
    
    <!--
      param is used to supply a named property value.
      In XML it would seem natural to follow RDF and support an
      abbreviated syntax where the param elements are replaced
      by attribute value pairs on the object start tag.
    -->
    <!ELEMENT param EMPTY>
    <!ATTLIST param
      id          ID             #IMPLIED
      name        CDATA          #IMPLIED
      value       CDATA          #IMPLIED
      valuetype   (data|ref|object) "data"
      type        %ContentType;  #IMPLIED
      >
    
    <!--=================== Images ===========================================-->
    
    <!--
       To avoid accessibility problems for people who aren't
       able to see the image, you should provide a text
       description using the alt and longdesc attributes.
       In addition, avoid the use of server-side image maps.
       Note that in this DTD there is no name attribute. That
       is only available in the transitional and frameset DTD.
    -->
    
    <!ELEMENT img EMPTY>
    <!ATTLIST img
      %attrs;
      src         %URI;          #REQUIRED
      alt         %Text;         #REQUIRED
      longdesc    %URI;          #IMPLIED
      height      %Length;       #IMPLIED
      width       %Length;       #IMPLIED
      usemap      %URI;          #IMPLIED
      ismap       (ismap)        #IMPLIED
      >
    
    <!-- usemap points to a map element which may be in this document
      or an external document, although the latter is not widely supported -->
    
    <!--================== Client-side image maps ============================-->
    
    <!-- These can be placed in the same document or grouped in a
         separate document although this isn't yet widely supported -->
    
    <!ELEMENT map ((%block; | form | %misc;)+ | area+)>
    <!ATTLIST map
      %i18n;
      %events;
      id          ID             #REQUIRED
      class       CDATA          #IMPLIED
      style       %StyleSheet;   #IMPLIED
      title       %Text;         #IMPLIED
      name        NMTOKEN        #IMPLIED
      >
    
    <!ELEMENT area EMPTY>
    <!ATTLIST area
      %attrs;
      %focus;
      shape       %Shape;        "rect"
      coords      %Coords;       #IMPLIED
      href        %URI;          #IMPLIED
      nohref      (nohref)       #IMPLIED
      alt         %Text;         #REQUIRED
      >
    
    <!--================ Forms ===============================================-->
    <!ELEMENT form %form.content;>   <!-- forms shouldn't be nested -->
    
    <!ATTLIST form
      %attrs;
      action      %URI;          #REQUIRED
      method      (get|post)     "get"
      enctype     %ContentType;  "application/x-www-form-urlencoded"
      onsubmit    %Script;       #IMPLIED
      onreset     %Script;       #IMPLIED
      accept      %ContentTypes; #IMPLIED
      accept-charset %Charsets;  #IMPLIED
      >
    
    <!--
      Each label must not contain more than ONE field
      Label elements shouldn't be nested.
    -->
    <!ELEMENT label %Inline;>
    <!ATTLIST label
      %attrs;
      for         IDREF          #IMPLIED
      accesskey   %Character;    #IMPLIED
      onfocus     %Script;       #IMPLIED
      onblur      %Script;       #IMPLIED
      >
    
    <!ENTITY % InputType
      "(text | password | checkbox |
        radio | submit | reset |
        file | hidden | image | button)"
       >
    
    <!-- the name attribute is required for all but submit & reset -->
    
    <!ELEMENT input EMPTY>     <!-- form control -->
    <!ATTLIST input
      %attrs;
      %focus;
      type        %InputType;    "text"
      name        CDATA          #IMPLIED
      value       CDATA          #IMPLIED
      checked     (checked)      #IMPLIED
      disabled    (disabled)     #IMPLIED
      readonly    (readonly)     #IMPLIED
      size        CDATA          #IMPLIED
      maxlength   %Number;       #IMPLIED
      src         %URI;          #IMPLIED
      alt         CDATA          #IMPLIED
      usemap      %URI;          #IMPLIED
      onselect    %Script;       #IMPLIED
      onchange    %Script;       #IMPLIED
      accept      %ContentTypes; #IMPLIED
      >
    
    <!ELEMENT select (optgroup|option)+>  <!-- option selector -->
    <!ATTLIST select
      %attrs;
      name        CDATA          #IMPLIED
      size        %Number;       #IMPLIED
      multiple    (multiple)     #IMPLIED
      disabled    (disabled)     #IMPLIED
      tabindex    %Number;       #IMPLIED
      onfocus     %Script;       #IMPLIED
      onblur      %Script;       #IMPLIED
      onchange    %Script;       #IMPLIED
      >
    
    <!ELEMENT optgroup (option)+>   <!-- option group -->
    <!ATTLIST optgroup
      %attrs;
      disabled    (disabled)     #IMPLIED
      label       %Text;         #REQUIRED
      >
    
    <!ELEMENT option (#PCDATA)>     <!-- selectable choice -->
    <!ATTLIST option
      %attrs;
      selected    (selected)     #IMPLIED
      disabled    (disabled)     #IMPLIED
      label       %Text;         #IMPLIED
      value       CDATA          #IMPLIED
      >
    
    <!ELEMENT textarea (#PCDATA)>     <!-- multi-line text field -->
    <!ATTLIST textarea
      %attrs;
      %focus;
      name        CDATA          #IMPLIED
      rows        %Number;       #REQUIRED
      cols        %Number;       #REQUIRED
      disabled    (disabled)     #IMPLIED
      readonly    (readonly)     #IMPLIED
      onselect    %Script;       #IMPLIED
      onchange    %Script;       #IMPLIED
      >
    
    <!--
      The fieldset element is used to group form fields.
      Only one legend element should occur in the content
      and if present should only be preceded by whitespace.
    -->
    <!ELEMENT fieldset (#PCDATA | legend | %block; | form | %inline; | %misc;)*>
    <!ATTLIST fieldset
      %attrs;
      >
    
    <!ELEMENT legend %Inline;>     <!-- fieldset label -->
    <!ATTLIST legend
      %attrs;
      accesskey   %Character;    #IMPLIED
      >
    
    <!--
     Content is %Flow; excluding a, form and form controls
    --> 
    <!ELEMENT button %button.content;>  <!-- push button -->
    <!ATTLIST button
      %attrs;
      %focus;
      name        CDATA          #IMPLIED
      value       CDATA          #IMPLIED
      type        (button|submit|reset) "submit"
      disabled    (disabled)     #IMPLIED
      >
    
    <!--======================= Tables =======================================-->
    
    <!-- Derived from IETF HTML table standard, see [RFC1942] -->
    
    <!--
     The border attribute sets the thickness of the frame around the
     table. The default units are screen pixels.
    
     The frame attribute specifies which parts of the frame around
     the table should be rendered. The values are not the same as
     CALS to avoid a name clash with the valign attribute.
    -->
    <!ENTITY % TFrame "(void|above|below|hsides|lhs|rhs|vsides|box|border)">
    
    <!--
     The rules attribute defines which rules to draw between cells:
    
     If rules is absent then assume:
         "none" if border is absent or border="0" otherwise "all"
    -->
    
    <!ENTITY % TRules "(none | groups | rows | cols | all)">
      
    <!-- horizontal alignment attributes for cell contents
    
      char        alignment char, e.g. char=':'
      charoff     offset for alignment char
    -->
    <!ENTITY % cellhalign
      "align      (left|center|right|justify|char) #IMPLIED
       char       %Character;    #IMPLIED
       charoff    %Length;       #IMPLIED"
      >
    
    <!-- vertical alignment attributes for cell contents -->
    <!ENTITY % cellvalign
      "valign     (top|middle|bottom|baseline) #IMPLIED"
      >
    
    <!ELEMENT table
         (caption?, (col*|colgroup*), thead?, tfoot?, (tbody+|tr+))>
    <!ELEMENT caption  %Inline;>
    <!ELEMENT thead    (tr)+>
    <!ELEMENT tfoot    (tr)+>
    <!ELEMENT tbody    (tr)+>
    <!ELEMENT colgroup (col)*>
    <!ELEMENT col      EMPTY>
    <!ELEMENT tr       (th|td)+>
    <!ELEMENT th       %Flow;>
    <!ELEMENT td       %Flow;>
    
    <!ATTLIST table
      %attrs;
      summary     %Text;         #IMPLIED
      width       %Length;       #IMPLIED
      border      %Pixels;       #IMPLIED
      frame       %TFrame;       #IMPLIED
      rules       %TRules;       #IMPLIED
      cellspacing %Length;       #IMPLIED
      cellpadding %Length;       #IMPLIED
      >
    
    <!ATTLIST caption
      %attrs;
      >
    
    <!--
    colgroup groups a set of col elements. It allows you to group
    several semantically related columns together.
    -->
    <!ATTLIST colgroup
      %attrs;
      span        %Number;       "1"
      width       %MultiLength;  #IMPLIED
      %cellhalign;
      %cellvalign;
      >
    
    <!--
     col elements define the alignment properties for cells in
     one or more columns.
    
     The width attribute specifies the width of the columns, e.g.
    
         width=64        width in screen pixels
         width=0.5*      relative width of 0.5
    
     The span attribute causes the attributes of one
     col element to apply to more than one column.
    -->
    <!ATTLIST col
      %attrs;
      span        %Number;       "1"
      width       %MultiLength;  #IMPLIED
      %cellhalign;
      %cellvalign;
      >
    
    <!--
        Use thead to duplicate headers when breaking table
        across page boundaries, or for static headers when
        tbody sections are rendered in scrolling panel.
    
        Use tfoot to duplicate footers when breaking table
        across page boundaries, or for static footers when
        tbody sections are rendered in scrolling panel.
    
        Use multiple tbody sections when rules are needed
        between groups of table rows.
    -->
    <!ATTLIST thead
      %attrs;
      %cellhalign;
      %cellvalign;
      >
    
    <!ATTLIST tfoot
      %attrs;
      %cellhalign;
      %cellvalign;
      >
    
    <!ATTLIST tbody
      %attrs;
      %cellhalign;
      %cellvalign;
      >
    
    <!ATTLIST tr
      %attrs;
      %cellhalign;
      %cellvalign;
      >
    
    
    <!-- Scope is simpler than headers attribute for common tables -->
    <!ENTITY % Scope "(row|col|rowgroup|colgroup)">
    
    <!-- th is for headers, td for data and for cells acting as both -->
    
    <!ATTLIST th
      %attrs;
      abbr        %Text;         #IMPLIED
      axis        CDATA          #IMPLIED
      headers     IDREFS         #IMPLIED
      scope       %Scope;        #IMPLIED
      rowspan     %Number;       "1"
      colspan     %Number;       "1"
      %cellhalign;
      %cellvalign;
      >
    
    <!ATTLIST td
      %attrs;
      abbr        %Text;         #IMPLIED
      axis        CDATA          #IMPLIED
      headers     IDREFS         #IMPLIED
      scope       %Scope;        #IMPLIED
      rowspan     %Number;       "1"
      colspan     %Number;       "1"
      %cellhalign;
      %cellvalign;
      >
    
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/resources/dtd/xhtml-symbol.ent������������������������������0000644�0001750�0001750�00000033405�11377016712�025711� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!-- Mathematical, Greek and Symbolic characters for XHTML -->
    
    <!-- Character entity set. Typical invocation:
         <!ENTITY % HTMLsymbol PUBLIC
            "-//W3C//ENTITIES Symbols for XHTML//EN"
            "http://www.w3.org/TR/xhtml1/DTD/xhtml-symbol.ent">
         %HTMLsymbol;
    -->
    
    <!-- Portions (C) International Organization for Standardization 1986:
         Permission to copy in any form is granted for use with
         conforming SGML systems and applications as defined in
         ISO 8879, provided this notice is included in all copies.
    -->
    
    <!-- Relevant ISO entity set is given unless names are newly introduced.
         New names (i.e., not in ISO 8879 list) do not clash with any
         existing ISO 8879 entity names. ISO 10646 character numbers
         are given for each character, in hex. values are decimal
         conversions of the ISO 10646 values and refer to the document
         character set. Names are Unicode names. 
    -->
    
    <!-- Latin Extended-B -->
    <!ENTITY fnof     "&#402;"> <!-- latin small letter f with hook = function
                                        = florin, U+0192 ISOtech -->
    
    <!-- Greek -->
    <!ENTITY Alpha    "&#913;"> <!-- greek capital letter alpha, U+0391 -->
    <!ENTITY Beta     "&#914;"> <!-- greek capital letter beta, U+0392 -->
    <!ENTITY Gamma    "&#915;"> <!-- greek capital letter gamma,
                                        U+0393 ISOgrk3 -->
    <!ENTITY Delta    "&#916;"> <!-- greek capital letter delta,
                                        U+0394 ISOgrk3 -->
    <!ENTITY Epsilon  "&#917;"> <!-- greek capital letter epsilon, U+0395 -->
    <!ENTITY Zeta     "&#918;"> <!-- greek capital letter zeta, U+0396 -->
    <!ENTITY Eta      "&#919;"> <!-- greek capital letter eta, U+0397 -->
    <!ENTITY Theta    "&#920;"> <!-- greek capital letter theta,
                                        U+0398 ISOgrk3 -->
    <!ENTITY Iota     "&#921;"> <!-- greek capital letter iota, U+0399 -->
    <!ENTITY Kappa    "&#922;"> <!-- greek capital letter kappa, U+039A -->
    <!ENTITY Lambda   "&#923;"> <!-- greek capital letter lamda,
                                        U+039B ISOgrk3 -->
    <!ENTITY Mu       "&#924;"> <!-- greek capital letter mu, U+039C -->
    <!ENTITY Nu       "&#925;"> <!-- greek capital letter nu, U+039D -->
    <!ENTITY Xi       "&#926;"> <!-- greek capital letter xi, U+039E ISOgrk3 -->
    <!ENTITY Omicron  "&#927;"> <!-- greek capital letter omicron, U+039F -->
    <!ENTITY Pi       "&#928;"> <!-- greek capital letter pi, U+03A0 ISOgrk3 -->
    <!ENTITY Rho      "&#929;"> <!-- greek capital letter rho, U+03A1 -->
    <!-- there is no Sigmaf, and no U+03A2 character either -->
    <!ENTITY Sigma    "&#931;"> <!-- greek capital letter sigma,
                                        U+03A3 ISOgrk3 -->
    <!ENTITY Tau      "&#932;"> <!-- greek capital letter tau, U+03A4 -->
    <!ENTITY Upsilon  "&#933;"> <!-- greek capital letter upsilon,
                                        U+03A5 ISOgrk3 -->
    <!ENTITY Phi      "&#934;"> <!-- greek capital letter phi,
                                        U+03A6 ISOgrk3 -->
    <!ENTITY Chi      "&#935;"> <!-- greek capital letter chi, U+03A7 -->
    <!ENTITY Psi      "&#936;"> <!-- greek capital letter psi,
                                        U+03A8 ISOgrk3 -->
    <!ENTITY Omega    "&#937;"> <!-- greek capital letter omega,
                                        U+03A9 ISOgrk3 -->
    
    <!ENTITY alpha    "&#945;"> <!-- greek small letter alpha,
                                        U+03B1 ISOgrk3 -->
    <!ENTITY beta     "&#946;"> <!-- greek small letter beta, U+03B2 ISOgrk3 -->
    <!ENTITY gamma    "&#947;"> <!-- greek small letter gamma,
                                        U+03B3 ISOgrk3 -->
    <!ENTITY delta    "&#948;"> <!-- greek small letter delta,
                                        U+03B4 ISOgrk3 -->
    <!ENTITY epsilon  "&#949;"> <!-- greek small letter epsilon,
                                        U+03B5 ISOgrk3 -->
    <!ENTITY zeta     "&#950;"> <!-- greek small letter zeta, U+03B6 ISOgrk3 -->
    <!ENTITY eta      "&#951;"> <!-- greek small letter eta, U+03B7 ISOgrk3 -->
    <!ENTITY theta    "&#952;"> <!-- greek small letter theta,
                                        U+03B8 ISOgrk3 -->
    <!ENTITY iota     "&#953;"> <!-- greek small letter iota, U+03B9 ISOgrk3 -->
    <!ENTITY kappa    "&#954;"> <!-- greek small letter kappa,
                                        U+03BA ISOgrk3 -->
    <!ENTITY lambda   "&#955;"> <!-- greek small letter lamda,
                                        U+03BB ISOgrk3 -->
    <!ENTITY mu       "&#956;"> <!-- greek small letter mu, U+03BC ISOgrk3 -->
    <!ENTITY nu       "&#957;"> <!-- greek small letter nu, U+03BD ISOgrk3 -->
    <!ENTITY xi       "&#958;"> <!-- greek small letter xi, U+03BE ISOgrk3 -->
    <!ENTITY omicron  "&#959;"> <!-- greek small letter omicron, U+03BF NEW -->
    <!ENTITY pi       "&#960;"> <!-- greek small letter pi, U+03C0 ISOgrk3 -->
    <!ENTITY rho      "&#961;"> <!-- greek small letter rho, U+03C1 ISOgrk3 -->
    <!ENTITY sigmaf   "&#962;"> <!-- greek small letter final sigma,
                                        U+03C2 ISOgrk3 -->
    <!ENTITY sigma    "&#963;"> <!-- greek small letter sigma,
                                        U+03C3 ISOgrk3 -->
    <!ENTITY tau      "&#964;"> <!-- greek small letter tau, U+03C4 ISOgrk3 -->
    <!ENTITY upsilon  "&#965;"> <!-- greek small letter upsilon,
                                        U+03C5 ISOgrk3 -->
    <!ENTITY phi      "&#966;"> <!-- greek small letter phi, U+03C6 ISOgrk3 -->
    <!ENTITY chi      "&#967;"> <!-- greek small letter chi, U+03C7 ISOgrk3 -->
    <!ENTITY psi      "&#968;"> <!-- greek small letter psi, U+03C8 ISOgrk3 -->
    <!ENTITY omega    "&#969;"> <!-- greek small letter omega,
                                        U+03C9 ISOgrk3 -->
    <!ENTITY thetasym "&#977;"> <!-- greek theta symbol,
                                        U+03D1 NEW -->
    <!ENTITY upsih    "&#978;"> <!-- greek upsilon with hook symbol,
                                        U+03D2 NEW -->
    <!ENTITY piv      "&#982;"> <!-- greek pi symbol, U+03D6 ISOgrk3 -->
    
    <!-- General Punctuation -->
    <!ENTITY bull     "&#8226;"> <!-- bullet = black small circle,
                                         U+2022 ISOpub  -->
    <!-- bullet is NOT the same as bullet operator, U+2219 -->
    <!ENTITY hellip   "&#8230;"> <!-- horizontal ellipsis = three dot leader,
                                         U+2026 ISOpub  -->
    <!ENTITY prime    "&#8242;"> <!-- prime = minutes = feet, U+2032 ISOtech -->
    <!ENTITY Prime    "&#8243;"> <!-- double prime = seconds = inches,
                                         U+2033 ISOtech -->
    <!ENTITY oline    "&#8254;"> <!-- overline = spacing overscore,
                                         U+203E NEW -->
    <!ENTITY frasl    "&#8260;"> <!-- fraction slash, U+2044 NEW -->
    
    <!-- Letterlike Symbols -->
    <!ENTITY weierp   "&#8472;"> <!-- script capital P = power set
                                         = Weierstrass p, U+2118 ISOamso -->
    <!ENTITY image    "&#8465;"> <!-- black-letter capital I = imaginary part,
                                         U+2111 ISOamso -->
    <!ENTITY real     "&#8476;"> <!-- black-letter capital R = real part symbol,
                                         U+211C ISOamso -->
    <!ENTITY trade    "&#8482;"> <!-- trade mark sign, U+2122 ISOnum -->
    <!ENTITY alefsym  "&#8501;"> <!-- alef symbol = first transfinite cardinal,
                                         U+2135 NEW -->
    <!-- alef symbol is NOT the same as hebrew letter alef,
         U+05D0 although the same glyph could be used to depict both characters -->
    
    <!-- Arrows -->
    <!ENTITY larr     "&#8592;"> <!-- leftwards arrow, U+2190 ISOnum -->
    <!ENTITY uarr     "&#8593;"> <!-- upwards arrow, U+2191 ISOnum-->
    <!ENTITY rarr     "&#8594;"> <!-- rightwards arrow, U+2192 ISOnum -->
    <!ENTITY darr     "&#8595;"> <!-- downwards arrow, U+2193 ISOnum -->
    <!ENTITY harr     "&#8596;"> <!-- left right arrow, U+2194 ISOamsa -->
    <!ENTITY crarr    "&#8629;"> <!-- downwards arrow with corner leftwards
                                         = carriage return, U+21B5 NEW -->
    <!ENTITY lArr     "&#8656;"> <!-- leftwards double arrow, U+21D0 ISOtech -->
    <!-- Unicode does not say that lArr is the same as the 'is implied by' arrow
        but also does not have any other character for that function. So lArr can
        be used for 'is implied by' as ISOtech suggests -->
    <!ENTITY uArr     "&#8657;"> <!-- upwards double arrow, U+21D1 ISOamsa -->
    <!ENTITY rArr     "&#8658;"> <!-- rightwards double arrow,
                                         U+21D2 ISOtech -->
    <!-- Unicode does not say this is the 'implies' character but does not have 
         another character with this function so rArr can be used for 'implies'
         as ISOtech suggests -->
    <!ENTITY dArr     "&#8659;"> <!-- downwards double arrow, U+21D3 ISOamsa -->
    <!ENTITY hArr     "&#8660;"> <!-- left right double arrow,
                                         U+21D4 ISOamsa -->
    
    <!-- Mathematical Operators -->
    <!ENTITY forall   "&#8704;"> <!-- for all, U+2200 ISOtech -->
    <!ENTITY part     "&#8706;"> <!-- partial differential, U+2202 ISOtech  -->
    <!ENTITY exist    "&#8707;"> <!-- there exists, U+2203 ISOtech -->
    <!ENTITY empty    "&#8709;"> <!-- empty set = null set, U+2205 ISOamso -->
    <!ENTITY nabla    "&#8711;"> <!-- nabla = backward difference,
                                         U+2207 ISOtech -->
    <!ENTITY isin     "&#8712;"> <!-- element of, U+2208 ISOtech -->
    <!ENTITY notin    "&#8713;"> <!-- not an element of, U+2209 ISOtech -->
    <!ENTITY ni       "&#8715;"> <!-- contains as member, U+220B ISOtech -->
    <!ENTITY prod     "&#8719;"> <!-- n-ary product = product sign,
                                         U+220F ISOamsb -->
    <!-- prod is NOT the same character as U+03A0 'greek capital letter pi' though
         the same glyph might be used for both -->
    <!ENTITY sum      "&#8721;"> <!-- n-ary summation, U+2211 ISOamsb -->
    <!-- sum is NOT the same character as U+03A3 'greek capital letter sigma'
         though the same glyph might be used for both -->
    <!ENTITY minus    "&#8722;"> <!-- minus sign, U+2212 ISOtech -->
    <!ENTITY lowast   "&#8727;"> <!-- asterisk operator, U+2217 ISOtech -->
    <!ENTITY radic    "&#8730;"> <!-- square root = radical sign,
                                         U+221A ISOtech -->
    <!ENTITY prop     "&#8733;"> <!-- proportional to, U+221D ISOtech -->
    <!ENTITY infin    "&#8734;"> <!-- infinity, U+221E ISOtech -->
    <!ENTITY ang      "&#8736;"> <!-- angle, U+2220 ISOamso -->
    <!ENTITY and      "&#8743;"> <!-- logical and = wedge, U+2227 ISOtech -->
    <!ENTITY or       "&#8744;"> <!-- logical or = vee, U+2228 ISOtech -->
    <!ENTITY cap      "&#8745;"> <!-- intersection = cap, U+2229 ISOtech -->
    <!ENTITY cup      "&#8746;"> <!-- union = cup, U+222A ISOtech -->
    <!ENTITY int      "&#8747;"> <!-- integral, U+222B ISOtech -->
    <!ENTITY there4   "&#8756;"> <!-- therefore, U+2234 ISOtech -->
    <!ENTITY sim      "&#8764;"> <!-- tilde operator = varies with = similar to,
                                         U+223C ISOtech -->
    <!-- tilde operator is NOT the same character as the tilde, U+007E,
         although the same glyph might be used to represent both  -->
    <!ENTITY cong     "&#8773;"> <!-- approximately equal to, U+2245 ISOtech -->
    <!ENTITY asymp    "&#8776;"> <!-- almost equal to = asymptotic to,
                                         U+2248 ISOamsr -->
    <!ENTITY ne       "&#8800;"> <!-- not equal to, U+2260 ISOtech -->
    <!ENTITY equiv    "&#8801;"> <!-- identical to, U+2261 ISOtech -->
    <!ENTITY le       "&#8804;"> <!-- less-than or equal to, U+2264 ISOtech -->
    <!ENTITY ge       "&#8805;"> <!-- greater-than or equal to,
                                         U+2265 ISOtech -->
    <!ENTITY sub      "&#8834;"> <!-- subset of, U+2282 ISOtech -->
    <!ENTITY sup      "&#8835;"> <!-- superset of, U+2283 ISOtech -->
    <!ENTITY nsub     "&#8836;"> <!-- not a subset of, U+2284 ISOamsn -->
    <!ENTITY sube     "&#8838;"> <!-- subset of or equal to, U+2286 ISOtech -->
    <!ENTITY supe     "&#8839;"> <!-- superset of or equal to,
                                         U+2287 ISOtech -->
    <!ENTITY oplus    "&#8853;"> <!-- circled plus = direct sum,
                                         U+2295 ISOamsb -->
    <!ENTITY otimes   "&#8855;"> <!-- circled times = vector product,
                                         U+2297 ISOamsb -->
    <!ENTITY perp     "&#8869;"> <!-- up tack = orthogonal to = perpendicular,
                                         U+22A5 ISOtech -->
    <!ENTITY sdot     "&#8901;"> <!-- dot operator, U+22C5 ISOamsb -->
    <!-- dot operator is NOT the same character as U+00B7 middle dot -->
    
    <!-- Miscellaneous Technical -->
    <!ENTITY lceil    "&#8968;"> <!-- left ceiling = APL upstile,
                                         U+2308 ISOamsc  -->
    <!ENTITY rceil    "&#8969;"> <!-- right ceiling, U+2309 ISOamsc  -->
    <!ENTITY lfloor   "&#8970;"> <!-- left floor = APL downstile,
                                         U+230A ISOamsc  -->
    <!ENTITY rfloor   "&#8971;"> <!-- right floor, U+230B ISOamsc  -->
    <!ENTITY lang     "&#9001;"> <!-- left-pointing angle bracket = bra,
                                         U+2329 ISOtech -->
    <!-- lang is NOT the same character as U+003C 'less than sign' 
         or U+2039 'single left-pointing angle quotation mark' -->
    <!ENTITY rang     "&#9002;"> <!-- right-pointing angle bracket = ket,
                                         U+232A ISOtech -->
    <!-- rang is NOT the same character as U+003E 'greater than sign' 
         or U+203A 'single right-pointing angle quotation mark' -->
    
    <!-- Geometric Shapes -->
    <!ENTITY loz      "&#9674;"> <!-- lozenge, U+25CA ISOpub -->
    
    <!-- Miscellaneous Symbols -->
    <!ENTITY spades   "&#9824;"> <!-- black spade suit, U+2660 ISOpub -->
    <!-- black here seems to mean filled as opposed to hollow -->
    <!ENTITY clubs    "&#9827;"> <!-- black club suit = shamrock,
                                         U+2663 ISOpub -->
    <!ENTITY hearts   "&#9829;"> <!-- black heart suit = valentine,
                                         U+2665 ISOpub -->
    <!ENTITY diams    "&#9830;"> <!-- black diamond suit, U+2666 ISOpub -->
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/resources/autoConfigAsResource.xml��������������������������0000644�0001750�0001750�00000000601�11377016712�026573� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8"?>
    
    <configuration>
    
      <appender name="AUTO_BY_SYSTEM_PROPERTY"
        class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
          <pattern>%msg%n"</pattern>
        </layout>
      </appender>
    
      <root level="debug">
        <appender-ref ref="AUTO_BY_SYSTEM_PROPERTY" />
      </root>
    </configuration>
    �������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/resources/corpus/�������������������������������������������0000755�0001750�0001750�00000000000�12203357067�023275� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/resources/corpus/origin_of_species.txt����������������������0000644�0001750�0001750�00000236471�11377016712�027541� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Darwin, Charles, 1809-1882
    
    ON THE ORIGIN OF SPECIES.
    
    INTRODUCTION.
    
    When on board H.M.S. 'Beagle,' as naturalist, I was much struck with
    certain facts in the distribution of the inhabitants of South America,
    and in the geological relations of the present to the past inhabitants
    of that continent. These facts seemed to me to throw some light on the
    origin of species--that mystery of mysteries, as it has been called by
    one of our greatest philosophers. On my return home, it occurred to
    me, in 1837, that something might perhaps be made out on this question
    by patiently accumulating and reflecting on all sorts of facts which
    could possibly have any bearing on it. After five years' work I
    allowed myself to speculate on the subject, and drew up some short
    notes; these I enlarged in 1844 into a sketch of the conclusions,
    which then seemed to me probable: from that period to the present day
    I have steadily pursued the same object. I hope that I may be excused
    for entering on these personal details, as I give them to show that I
    have not been hasty in coming to a decision.
    
    My work is now nearly finished; but as it will take me two or three
    more years to complete it, and as my health is far from strong, I have
    been urged to publish this Abstract. I have more especially been
    induced to do this, as Mr. Wallace, who is now studying the natural
    history of the Malay archipelago, has arrived at almost exactly the
    same general conclusions that I have on the origin of species. Last
    year he sent to me a memoir on this subject, with a request that I
    would forward it to Sir Charles Lyell, who sent it to the Linnean
    Society, and it is published in the third volume of the Journal of
    that Society. Sir C. Lyell and Dr. Hooker, who both knew of my
    work--the latter having read my sketch of 1844--honoured me by
    thinking it advisable to publish, with Mr. Wallace's excellent memoir,
    some brief extracts from my manuscripts.
    
    This Abstract, which I now publish, must necessarily be imperfect. I
    cannot here give references and authorities for my several statements;
    and I must trust to the reader reposing some confidence in my
    accuracy. No doubt errors will have crept in, though I hope I have
    always been cautious in trusting to good authorities alone. I can here
    give only the general conclusions at which I have arrived, with a few
    facts in illustration, but which, I hope, in most cases will suffice.
    No one can feel more sensible than I do of the necessity of hereafter
    publishing in detail all the facts, with references, on which my
    conclusions have been grounded; and I hope in a future work to do
    this. For I am well aware that scarcely a single point is discussed in
    this volume on which facts cannot be adduced, often apparently leading
    to conclusions directly opposite to those at which I have arrived. A
    fair result can be obtained only by fully stating and balancing the
    facts and arguments on both sides of each question; and this cannot
    possibly be here done.
    
    I much regret that want of space prevents my having the satisfaction
    of acknowledging the generous assistance which I have received from
    very many naturalists, some of them personally unknown to me. I
    cannot, however, let this opportunity pass without expressing my deep
    obligations to Dr. Hooker, who for the last fifteen years has aided me
    in every possible way by his large stores of knowledge and his
    excellent judgment.
    
    In considering the Origin of Species, it is quite conceivable that a
    naturalist, reflecting on the mutual affinities of organic beings, on
    their embryological relations, their geographical distribution,
    geological succession, and other such facts, might come to the
    conclusion that each species had not been independently created, but
    had descended, like varieties, from other species. Nevertheless, such
    a conclusion, even if well founded, would be unsatisfactory, until it
    could be shown how the innumerable species inhabiting this world have
    been modified, so as to acquire that perfection of structure and
    coadaptation which most justly excites our admiration. Naturalists
    continually refer to external conditions, such as climate, food, etc.,
    as the only possible cause of variation. In one very limited sense, as
    we shall hereafter see, this may be true; but it is preposterous to
    attribute to mere external conditions, the structure, for instance, of
    the woodpecker, with its feet, tail, beak, and tongue, so admirably
    adapted to catch insects under the bark of trees. In the case of the
    misseltoe, which draws its nourishment from certain trees, which has
    seeds that must be transported by certain birds, and which has flowers
    with separate sexes absolutely requiring the agency of certain insects
    to bring pollen from one flower to the other, it is equally
    preposterous to account for the structure of this parasite, with its
    relations to several distinct organic beings, by the effects of
    external conditions, or of habit, or of the volition of the plant
    itself.
    
    The author of the 'Vestiges of Creation' would, I presume, say that,
    after a certain unknown number of generations, some bird had given
    birth to a woodpecker, and some plant to the misseltoe, and that these
    had been produced perfect as we now see them; but this assumption
    seems to me to be no explanation, for it leaves the case of the
    coadaptations of organic beings to each other and to their physical
    conditions of life, untouched and unexplained.
    
    It is, therefore, of the highest importance to gain a clear insight
    into the means of modification and coadaptation. At the commencement
    of my observations it seemed to me probable that a careful study of
    domesticated animals and of cultivated plants would offer the best
    chance of making out this obscure problem. Nor have I been
    disappointed; in this and in all other perplexing cases I have
    invariably found that our knowledge, imperfect though it be, of
    variation under domestication, afforded the best and safest clue. I
    may venture to express my conviction of the high value of such
    studies, although they have been very commonly neglected by
    naturalists.
    
    From these considerations, I shall devote the first chapter of this
    Abstract to Variation under Domestication. We shall thus see that a
    large amount of hereditary modification is at least possible, and,
    what is equally or more important, we shall see how great is the power
    of man in accumulating by his Selection successive slight variations.
    I will then pass on to the variability of species in a state of
    nature; but I shall, unfortunately, be compelled to treat this subject
    far too briefly, as it can be treated properly only by giving long
    catalogues of facts. We shall, however, be enabled to discuss what
    circumstances are most favourable to variation. In the next chapter
    the Struggle for Existence amongst all organic beings throughout the
    world, which inevitably follows from their high geometrical powers of
    increase, will be treated of. This is the doctrine of Malthus, applied
    to the whole animal and vegetable kingdoms. As many more individuals
    of each species are born than can possibly survive; and as,
    consequently, there is a frequently recurring struggle for existence,
    it follows that any being, if it vary however slightly in any manner
    profitable to itself, under the complex and sometimes varying
    conditions of life, will have a better chance of surviving, and thus
    be NATURALLY SELECTED. From the strong principle of inheritance, any
    selected variety will tend to propagate its new and modified form.
    
    This fundamental subject of Natural Selection will be treated at some
    length in the fourth chapter; and we shall then see how Natural
    Selection almost inevitably causes much Extinction of the less
    improved forms of life and induces what I have called Divergence of
    Character. In the next chapter I shall discuss the complex and little
    known laws of variation and of correlation of growth. In the four
    succeeding chapters, the most apparent and gravest difficulties on the
    theory will be given: namely, first, the difficulties of transitions,
    or in understanding how a simple being or a simple organ can be
    changed and perfected into a highly developed being or elaborately
    constructed organ; secondly the subject of Instinct, or the mental
    powers of animals, thirdly, Hybridism, or the infertility of species
    and the fertility of varieties when intercrossed; and fourthly, the
    imperfection of the Geological Record. In the next chapter I shall
    consider the geological succession of organic beings throughout time;
    in the eleventh and twelfth, their geographical distribution
    throughout space; in the thirteenth, their classification or mutual
    affinities, both when mature and in an embryonic condition. In the
    last chapter I shall give a brief recapitulation of the whole work,
    and a few concluding remarks.
    
    No one ought to feel surprise at much remaining as yet unexplained in
    regard to the origin of species and varieties, if he makes due
    allowance for our profound ignorance in regard to the mutual relations
    of all the beings which live around us. Who can explain why one
    species ranges widely and is very numerous, and why another allied
    species has a narrow range and is rare? Yet these relations are of the
    highest importance, for they determine the present welfare, and, as I
    believe, the future success and modification of every inhabitant of
    this world. Still less do we know of the mutual relations of the
    innumerable inhabitants of the world during the many past geological
    epochs in its history. Although much remains obscure, and will long
    remain obscure, I can entertain no doubt, after the most deliberate
    study and dispassionate judgment of which I am capable, that the view
    which most naturalists entertain, and which I formerly
    entertained--namely, that each species has been independently
    created--is erroneous. I am fully convinced that species are not
    immutable; but that those belonging to what are called the same genera
    are lineal descendants of some other and generally extinct species, in
    the same manner as the acknowledged varieties of any one species are
    the descendants of that species. Furthermore, I am convinced that
    Natural Selection has been the main but not exclusive means of
    modification.
    
    CHAPTER 1. VARIATION UNDER DOMESTICATION.
    
    Causes of Variability.
    Effects of Habit.
    Correlation of Growth.
    Inheritance.
    Character of Domestic Varieties.
    Difficulty of distinguishing between Varieties and Species.
    Origin of Domestic Varieties from one or more Species.
    Domestic Pigeons, their Differences and Origin.
    Principle of Selection anciently followed, its Effects.
    Methodical and Unconscious Selection.
    Unknown Origin of our Domestic Productions.
    Circumstances favourable to Man's power of Selection.
    
    When we look to the individuals of the same variety or sub-variety of
    our older cultivated plants and animals, one of the first points which
    strikes us, is, that they generally differ much more from each other,
    than do the individuals of any one species or variety in a state of
    nature. When we reflect on the vast diversity of the plants and
    animals which have been cultivated, and which have varied during all
    ages under the most different climates and treatment, I think we are
    driven to conclude that this greater variability is simply due to our
    domestic productions having been raised under conditions of life not
    so uniform as, and somewhat different from, those to which the
    parent-species have been exposed under nature. There is, also, I
    think, some probability in the view propounded by Andrew Knight, that
    this variability may be partly connected with excess of food. It seems
    pretty clear that organic beings must be exposed during several
    generations to the new conditions of life to cause any appreciable
    amount of variation; and that when the organisation has once begun to
    vary, it generally continues to vary for many generations. No case is
    on record of a variable being ceasing to be variable under
    cultivation. Our oldest cultivated plants, such as wheat, still often
    yield new varieties: our oldest domesticated animals are still capable
    of rapid improvement or modification.
    
    It has been disputed at what period of life the causes of variability,
    whatever they may be, generally act; whether during the early or late
    period of development of the embryo, or at the instant of conception.
    Geoffroy St. Hilaire's experiments show that unnatural treatment of
    the embryo causes monstrosities; and monstrosities cannot be separated
    by any clear line of distinction from mere variations. But I am
    strongly inclined to suspect that the most frequent cause of
    variability may be attributed to the male and female reproductive
    elements having been affected prior to the act of conception. Several
    reasons make me believe in this; but the chief one is the remarkable
    effect which confinement or cultivation has on the functions of the
    reproductive system; this system appearing to be far more susceptible
    than any other part of the organisation, to the action of any change
    in the conditions of life. Nothing is more easy than to tame an
    animal, and few things more difficult than to get it to breed freely
    under confinement, even in the many cases when the male and female
    unite. How many animals there are which will not breed, though living
    long under not very close confinement in their native country! This is
    generally attributed to vitiated instincts; but how many cultivated
    plants display the utmost vigour, and yet rarely or never seed! In
    some few such cases it has been found out that very trifling changes,
    such as a little more or less water at some particular period of
    growth, will determine whether or not the plant sets a seed. I cannot
    here enter on the copious details which I have collected on this
    curious subject; but to show how singular the laws are which determine
    the reproduction of animals under confinement, I may just mention that
    carnivorous animals, even from the tropics, breed in this country
    pretty freely under confinement, with the exception of the
    plantigrades or bear family; whereas, carnivorous birds, with the
    rarest exceptions, hardly ever lay fertile eggs. Many exotic plants
    have pollen utterly worthless, in the same exact condition as in the
    most sterile hybrids. When, on the one hand, we see domesticated
    animals and plants, though often weak and sickly, yet breeding quite
    freely under confinement; and when, on the other hand, we see
    individuals, though taken young from a state of nature, perfectly
    tamed, long-lived, and healthy (of which I could give numerous
    instances), yet having their reproductive system so seriously affected
    by unperceived causes as to fail in acting, we need not be surprised
    at this system, when it does act under confinement, acting not quite
    regularly, and producing offspring not perfectly like their parents or
    variable.
    
    Sterility has been said to be the bane of horticulture; but on this
    view we owe variability to the same cause which produces sterility;
    and variability is the source of all the choicest productions of the
    garden. I may add, that as some organisms will breed most freely under
    the most unnatural conditions (for instance, the rabbit and ferret
    kept in hutches), showing that their reproductive system has not been
    thus affected; so will some animals and plants withstand domestication
    or cultivation, and vary very slightly--perhaps hardly more than in a
    state of nature.
    
    A long list could easily be given of "sporting plants;" by this term
    gardeners mean a single bud or offset, which suddenly assumes a new
    and sometimes very different character from that of the rest of the
    plant. Such buds can be propagated by grafting, etc., and sometimes by
    seed. These "sports" are extremely rare under nature, but far from
    rare under cultivation; and in this case we see that the treatment of
    the parent has affected a bud or offset, and not the ovules or pollen.
    But it is the opinion of most physiologists that there is no essential
    difference between a bud and an ovule in their earliest stages of
    formation; so that, in fact, "sports" support my view, that
    variability may be largely attributed to the ovules or pollen, or to
    both, having been affected by the treatment of the parent prior to the
    act of conception. These cases anyhow show that variation is not
    necessarily connected, as some authors have supposed, with the act of
    generation.
    
    Seedlings from the same fruit, and the young of the same litter,
    sometimes differ considerably from each other, though both the young
    and the parents, as Muller has remarked, have apparently been exposed
    to exactly the same conditions of life; and this shows how unimportant
    the direct effects of the conditions of life are in comparison with
    the laws of reproduction, and of growth, and of inheritance; for had
    the action of the conditions been direct, if any of the young had
    varied, all would probably have varied in the same manner. To judge
    how much, in the case of any variation, we should attribute to the
    direct action of heat, moisture, light, food, etc., is most difficult:
    my impression is, that with animals such agencies have produced very
    little direct effect, though apparently more in the case of plants.
    Under this point of view, Mr. Buckman's recent experiments on plants
    seem extremely valuable. When all or nearly all the individuals
    exposed to certain conditions are affected in the same way, the change
    at first appears to be directly due to such conditions; but in some
    cases it can be shown that quite opposite conditions produce similar
    changes of structure. Nevertheless some slight amount of change may, I
    think, be attributed to the direct action of the conditions of
    life--as, in some cases, increased size from amount of food, colour
    from particular kinds of food and from light, and perhaps the
    thickness of fur from climate.
    
    Habit also has a decided influence, as in the period of flowering with
    plants when transported from one climate to another. In animals it has
    a more marked effect; for instance, I find in the domestic duck that
    the bones of the wing weigh less and the bones of the leg more, in
    proportion to the whole skeleton, than do the same bones in the
    wild-duck; and I presume that this change may be safely attributed to
    the domestic duck flying much less, and walking more, than its wild
    parent. The great and inherited development of the udders in cows and
    goats in countries where they are habitually milked, in comparison
    with the state of these organs in other countries, is another instance
    of the effect of use. Not a single domestic animal can be named which
    has not in some country drooping ears; and the view suggested by some
    authors, that the drooping is due to the disuse of the muscles of the
    ear, from the animals not being much alarmed by danger, seems
    probable.
    
    There are many laws regulating variation, some few of which can be
    dimly seen, and will be hereafter briefly mentioned. I will here only
    allude to what may be called correlation of growth. Any change in the
    embryo or larva will almost certainly entail changes in the mature
    animal. In monstrosities, the correlations between quite distinct
    parts are very curious; and many instances are given in Isidore
    Geoffroy St. Hilaire's great work on this subject. Breeders believe
    that long limbs are almost always accompanied by an elongated head.
    Some instances of correlation are quite whimsical; thus cats with blue
    eyes are invariably deaf; colour and constitutional peculiarities go
    together, of which many remarkable cases could be given amongst
    animals and plants. From the facts collected by Heusinger, it appears
    that white sheep and pigs are differently affected from coloured
    individuals by certain vegetable poisons. Hairless dogs have imperfect
    teeth; long-haired and coarse-haired animals are apt to have, as is
    asserted, long or many horns; pigeons with feathered feet have skin
    between their outer toes; pigeons with short beaks have small feet,
    and those with long beaks large feet. Hence, if man goes on selecting,
    and thus augmenting, any peculiarity, he will almost certainly
    unconsciously modify other parts of the structure, owing to the
    mysterious laws of the correlation of growth.
    
    The result of the various, quite unknown, or dimly seen laws of
    variation is infinitely complex and diversified. It is well worth
    while carefully to study the several treatises published on some of
    our old cultivated plants, as on the hyacinth, potato, even the
    dahlia, etc.; and it is really surprising to note the endless points
    in structure and constitution in which the varieties and sub-varieties
    differ slightly from each other. The whole organisation seems to have
    become plastic, and tends to depart in some small degree from that of
    the parental type.
    
    Any variation which is not inherited is unimportant for us. But the
    number and diversity of inheritable deviations of structure, both
    those of slight and those of considerable physiological importance, is
    endless. Dr. Prosper Lucas's treatise, in two large volumes, is the
    fullest and the best on this subject. No breeder doubts how strong is
    the tendency to inheritance: like produces like is his fundamental
    belief: doubts have been thrown on this principle by theoretical
    writers alone. When a deviation appears not unfrequently, and we see
    it in the father and child, we cannot tell whether it may not be due
    to the same original cause acting on both; but when amongst
    individuals, apparently exposed to the same conditions, any very rare
    deviation, due to some extraordinary combination of circumstances,
    appears in the parent--say, once amongst several million
    individuals--and it reappears in the child, the mere doctrine of
    chances almost compels us to attribute its reappearance to
    inheritance. Every one must have heard of cases of albinism, prickly
    skin, hairy bodies, etc., appearing in several members of the same
    family. If strange and rare deviations of structure are truly
    inherited, less strange and commoner deviations may be freely admitted
    to be inheritable. Perhaps the correct way of viewing the whole
    subject, would be, to look at the inheritance of every character
    whatever as the rule, and non-inheritance as the anomaly.
    
    The laws governing inheritance are quite unknown; no one can say why
    the same peculiarity in different individuals of the same species, and
    in individuals of different species, is sometimes inherited and
    sometimes not so; why the child often reverts in certain characters to
    its grandfather or grandmother or other much more remote ancestor; why
    a peculiarity is often transmitted from one sex to both sexes or to
    one sex alone, more commonly but not exclusively to the like sex. It
    is a fact of some little importance to us, that peculiarities
    appearing in the males of our domestic breeds are often transmitted
    either exclusively, or in a much greater degree, to males alone. A
    much more important rule, which I think may be trusted, is that, at
    whatever period of life a peculiarity first appears, it tends to
    appear in the offspring at a corresponding age, though sometimes
    earlier. In many cases this could not be otherwise: thus the inherited
    peculiarities in the horns of cattle could appear only in the
    offspring when nearly mature; peculiarities in the silkworm are known
    to appear at the corresponding caterpillar or cocoon stage. But
    hereditary diseases and some other facts make me believe that the rule
    has a wider extension, and that when there is no apparent reason why a
    peculiarity should appear at any particular age, yet that it does tend
    to appear in the offspring at the same period at which it first
    appeared in the parent. I believe this rule to be of the highest
    importance in explaining the laws of embryology. These remarks are of
    course confined to the first APPEARANCE of the peculiarity, and not to
    its primary cause, which may have acted on the ovules or male element;
    in nearly the same manner as in the crossed offspring from a
    short-horned cow by a long-horned bull, the greater length of horn,
    though appearing late in life, is clearly due to the male element.
    
    Having alluded to the subject of reversion, I may here refer to a
    statement often made by naturalists--namely, that our domestic
    varieties, when run wild, gradually but certainly revert in character
    to their aboriginal stocks. Hence it has been argued that no
    deductions can be drawn from domestic races to species in a state of
    nature. I have in vain endeavoured to discover on what decisive facts
    the above statement has so often and so boldly been made. There would
    be great difficulty in proving its truth: we may safely conclude that
    very many of the most strongly-marked domestic varieties could not
    possibly live in a wild state. In many cases we do not know what the
    aboriginal stock was, and so could not tell whether or not nearly
    perfect reversion had ensued. It would be quite necessary, in order to
    prevent the effects of intercrossing, that only a single variety
    should be turned loose in its new home. Nevertheless, as our varieties
    certainly do occasionally revert in some of their characters to
    ancestral forms, it seems to me not improbable, that if we could
    succeed in naturalising, or were to cultivate, during many
    generations, the several races, for instance, of the cabbage, in very
    poor soil (in which case, however, some effect would have to be
    attributed to the direct action of the poor soil), that they would to
    a large extent, or even wholly, revert to the wild aboriginal stock.
    Whether or not the experiment would succeed, is not of great
    importance for our line of argument; for by the experiment itself the
    conditions of life are changed. If it could be shown that our domestic
    varieties manifested a strong tendency to reversion,--that is, to lose
    their acquired characters, whilst kept under unchanged conditions, and
    whilst kept in a considerable body, so that free intercrossing might
    check, by blending together, any slight deviations of structure, in
    such case, I grant that we could deduce nothing from domestic
    varieties in regard to species. But there is not a shadow of evidence
    in favour of this view: to assert that we could not breed our cart and
    race-horses, long and short-horned cattle, and poultry of various
    breeds, and esculent vegetables, for an almost infinite number of
    generations, would be opposed to all experience. I may add, that when
    under nature the conditions of life do change, variations and
    reversions of character probably do occur; but natural selection, as
    will hereafter be explained, will determine how far the new characters
    thus arising shall be preserved.
    
    When we look to the hereditary varieties or races of our domestic
    animals and plants, and compare them with species closely allied
    together, we generally perceive in each domestic race, as already
    remarked, less uniformity of character than in true species. Domestic
    races of the same species, also, often have a somewhat monstrous
    character; by which I mean, that, although differing from each other,
    and from the other species of the same genus, in several trifling
    respects, they often differ in an extreme degree in some one part,
    both when compared one with another, and more especially when compared
    with all the species in nature to which they are nearest allied. With
    these exceptions (and with that of the perfect fertility of varieties
    when crossed,--a subject hereafter to be discussed), domestic races of
    the same species differ from each other in the same manner as, only in
    most cases in a lesser degree than, do closely-allied species of the
    same genus in a state of nature. I think this must be admitted, when
    we find that there are hardly any domestic races, either amongst
    animals or plants, which have not been ranked by some competent judges
    as mere varieties, and by other competent judges as the descendants of
    aboriginally distinct species. If any marked distinction existed
    between domestic races and species, this source of doubt could not so
    perpetually recur. It has often been stated that domestic races do not
    differ from each other in characters of generic value. I think it
    could be shown that this statement is hardly correct; but naturalists
    differ most widely in determining what characters are of generic
    value; all such valuations being at present empirical. Moreover, on
    the view of the origin of genera which I shall presently give, we have
    no right to expect often to meet with generic differences in our
    domesticated productions.
    
    When we attempt to estimate the amount of structural difference
    between the domestic races of the same species, we are soon involved
    in doubt, from not knowing whether they have descended from one or
    several parent-species. This point, if it could be cleared up, would
    be interesting; if, for instance, it could be shown that the
    greyhound, bloodhound, terrier, spaniel, and bull-dog, which we all
    know propagate their kind so truly, were the offspring of any single
    species, then such facts would have great weight in making us doubt
    about the immutability of the many very closely allied and natural
    species--for instance, of the many foxes--inhabiting different
    quarters of the world. I do not believe, as we shall presently see,
    that all our dogs have descended from any one wild species; but, in
    the case of some other domestic races, there is presumptive, or even
    strong, evidence in favour of this view.
    
    It has often been assumed that man has chosen for domestication
    animals and plants having an extraordinary inherent tendency to vary,
    and likewise to withstand diverse climates. I do not dispute that
    these capacities have added largely to the value of most of our
    domesticated productions; but how could a savage possibly know, when
    he first tamed an animal, whether it would vary in succeeding
    generations, and whether it would endure other climates? Has the
    little variability of the ass or guinea-fowl, or the small power of
    endurance of warmth by the rein-deer, or of cold by the common camel,
    prevented their domestication? I cannot doubt that if other animals
    and plants, equal in number to our domesticated productions, and
    belonging to equally diverse classes and countries, were taken from a
    state of nature, and could be made to breed for an equal number of
    generations under domestication, they would vary on an average as
    largely as the parent species of our existing domesticated productions
    have varied.
    
    In the case of most of our anciently domesticated animals and plants,
    I do not think it is possible to come to any definite conclusion,
    whether they have descended from one or several species. The argument
    mainly relied on by those who believe in the multiple origin of our
    domestic animals is, that we find in the most ancient records, more
    especially on the monuments of Egypt, much diversity in the breeds;
    and that some of the breeds closely resemble, perhaps are identical
    with, those still existing. Even if this latter fact were found more
    strictly and generally true than seems to me to be the case, what does
    it show, but that some of our breeds originated there, four or five
    thousand years ago? But Mr. Horner's researches have rendered it in
    some degree probable that man sufficiently civilized to have
    manufactured pottery existed in the valley of the Nile thirteen or
    fourteen thousand years ago; and who will pretend to say how long
    before these ancient periods, savages, like those of Tierra del Fuego
    or Australia, who possess a semi-domestic dog, may not have existed in
    Egypt?
    
    The whole subject must, I think, remain vague; nevertheless, I may,
    without here entering on any details, state that, from geographical
    and other considerations, I think it highly probable that our domestic
    dogs have descended from several wild species. In regard to sheep and
    goats I can form no opinion. I should think, from facts communicated
    to me by Mr. Blyth, on the habits, voice, and constitution, etc., of
    the humped Indian cattle, that these had descended from a different
    aboriginal stock from our European cattle; and several competent
    judges believe that these latter have had more than one wild parent.
    With respect to horses, from reasons which I cannot give here, I am
    doubtfully inclined to believe, in opposition to several authors, that
    all the races have descended from one wild stock. Mr. Blyth, whose
    opinion, from his large and varied stores of knowledge, I should value
    more than that of almost any one, thinks that all the breeds of
    poultry have proceeded from the common wild Indian fowl (Gallus
    bankiva). In regard to ducks and rabbits, the breeds of which differ
    considerably from each other in structure, I do not doubt that they
    all have descended from the common wild duck and rabbit.
    
    The doctrine of the origin of our several domestic races from several
    aboriginal stocks, has been carried to an absurd extreme by some
    authors. They believe that every race which breeds true, let the
    distinctive characters be ever so slight, has had its wild prototype.
    At this rate there must have existed at least a score of species of
    wild cattle, as many sheep, and several goats in Europe alone, and
    several even within Great Britain. One author believes that there
    formerly existed in Great Britain eleven wild species of sheep
    peculiar to it! When we bear in mind that Britain has now hardly one
    peculiar mammal, and France but few distinct from those of Germany and
    conversely, and so with Hungary, Spain, etc., but that each of these
    kingdoms possesses several peculiar breeds of cattle, sheep, etc., we
    must admit that many domestic breeds have originated in Europe; for
    whence could they have been derived, as these several countries do not
    possess a number of peculiar species as distinct parent-stocks? So it
    is in India. Even in the case of the domestic dogs of the whole world,
    which I fully admit have probably descended from several wild species,
    I cannot doubt that there has been an immense amount of inherited
    variation. Who can believe that animals closely resembling the Italian
    greyhound, the bloodhound, the bull-dog, or Blenheim spaniel, etc.--so
    unlike all wild Canidae--ever existed freely in a state of nature? It
    has often been loosely said that all our races of dogs have been
    produced by the crossing of a few aboriginal species; but by crossing
    we can get only forms in some degree intermediate between their
    parents; and if we account for our several domestic races by this
    process, we must admit the former existence of the most extreme forms,
    as the Italian greyhound, bloodhound, bull-dog, etc., in the wild
    state. Moreover, the possibility of making distinct races by crossing
    has been greatly exaggerated. There can be no doubt that a race may be
    modified by occasional crosses, if aided by the careful selection of
    those individual mongrels, which present any desired character; but
    that a race could be obtained nearly intermediate between two
    extremely different races or species, I can hardly believe. Sir J.
    Sebright expressly experimentised for this object, and failed. The
    offspring from the first cross between two pure breeds is tolerably
    and sometimes (as I have found with pigeons) extremely uniform, and
    everything seems simple enough; but when these mongrels are crossed
    one with another for several generations, hardly two of them will be
    alike, and then the extreme difficulty, or rather utter hopelessness,
    of the task becomes apparent. Certainly, a breed intermediate between
    TWO VERY DISTINCT breeds could not be got without extreme care and
    long-continued selection; nor can I find a single case on record of a
    permanent race having been thus formed.
    
    ON THE BREEDS OF THE DOMESTIC PIGEON.
    
    Believing that it is always best to study some special group, I have,
    after deliberation, taken up domestic pigeons. I have kept every breed
    which I could purchase or obtain, and have been most kindly favoured
    with skins from several quarters of the world, more especially by the
    Honourable W. Elliot from India, and by the Honourable C. Murray from
    Persia. Many treatises in different languages have been published on
    pigeons, and some of them are very important, as being of considerable
    antiquity. I have associated with several eminent fanciers, and have
    been permitted to join two of the London Pigeon Clubs. The diversity
    of the breeds is something astonishing. Compare the English carrier
    and the short-faced tumbler, and see the wonderful difference in their
    beaks, entailing corresponding differences in their skulls. The
    carrier, more especially the male bird, is also remarkable from the
    wonderful development of the carunculated skin about the head, and
    this is accompanied by greatly elongated eyelids, very large external
    orifices to the nostrils, and a wide gape of mouth. The short-faced
    tumbler has a beak in outline almost like that of a finch; and the
    common tumbler has the singular and strictly inherited habit of flying
    at a great height in a compact flock, and tumbling in the air head
    over heels. The runt is a bird of great size, with long, massive beak
    and large feet; some of the sub-breeds of runts have very long necks,
    others very long wings and tails, others singularly short tails. The
    barb is allied to the carrier, but, instead of a very long beak, has a
    very short and very broad one. The pouter has a much elongated body,
    wings, and legs; and its enormously developed crop, which it glories
    in inflating, may well excite astonishment and even laughter. The
    turbit has a very short and conical beak, with a line of reversed
    feathers down the breast; and it has the habit of continually
    expanding slightly the upper part of the oesophagus. The Jacobin has
    the feathers so much reversed along the back of the neck that they
    form a hood, and it has, proportionally to its size, much elongated
    wing and tail feathers. The trumpeter and laugher, as their names
    express, utter a very different coo from the other breeds. The fantail
    has thirty or even forty tail-feathers, instead of twelve or fourteen,
    the normal number in all members of the great pigeon family; and these
    feathers are kept expanded, and are carried so erect that in good
    birds the head and tail touch; the oil-gland is quite aborted. Several
    other less distinct breeds might have been specified.
    
    In the skeletons of the several breeds, the development of the bones
    of the face in length and breadth and curvature differs enormously.
    The shape, as well as the breadth and length of the ramus of the lower
    jaw, varies in a highly remarkable manner. The number of the caudal
    and sacral vertebrae vary; as does the number of the ribs, together
    with their relative breadth and the presence of processes. The size
    and shape of the apertures in the sternum are highly variable; so is
    the degree of divergence and relative size of the two arms of the
    furcula. The proportional width of the gape of mouth, the proportional
    length of the eyelids, of the orifice of the nostrils, of the tongue
    (not always in strict correlation with the length of beak), the size
    of the crop and of the upper part of the oesophagus; the development
    and abortion of the oil-gland; the number of the primary wing and
    caudal feathers; the relative length of wing and tail to each other
    and to the body; the relative length of leg and of the feet; the
    number of scutellae on the toes, the development of skin between the
    toes, are all points of structure which are variable. The period at
    which the perfect plumage is acquired varies, as does the state of the
    down with which the nestling birds are clothed when hatched. The shape
    and size of the eggs vary. The manner of flight differs remarkably; as
    does in some breeds the voice and disposition. Lastly, in certain
    breeds, the males and females have come to differ to a slight degree
    from each other.
    
    Altogether at least a score of pigeons might be chosen, which if shown
    to an ornithologist, and he were told that they were wild birds, would
    certainly, I think, be ranked by him as well-defined species.
    Moreover, I do not believe that any ornithologist would place the
    English carrier, the short-faced tumbler, the runt, the barb, pouter,
    and fantail in the same genus; more especially as in each of these
    breeds several truly-inherited sub-breeds, or species as he might have
    called them, could be shown him.
    
    Great as the differences are between the breeds of pigeons, I am fully
    convinced that the common opinion of naturalists is correct, namely,
    that all have descended from the rock-pigeon (Columba livia),
    including under this term several geographical races or sub-species,
    which differ from each other in the most trifling respects. As several
    of the reasons which have led me to this belief are in some degree
    applicable in other cases, I will here briefly give them. If the
    several breeds are not varieties, and have not proceeded from the
    rock-pigeon, they must have descended from at least seven or eight
    aboriginal stocks; for it is impossible to make the present domestic
    breeds by the crossing of any lesser number: how, for instance, could
    a pouter be produced by crossing two breeds unless one of the
    parent-stocks possessed the characteristic enormous crop? The supposed
    aboriginal stocks must all have been rock-pigeons, that is, not
    breeding or willingly perching on trees. But besides C. livia, with
    its geographical sub-species, only two or three other species of
    rock-pigeons are known; and these have not any of the characters of
    the domestic breeds. Hence the supposed aboriginal stocks must either
    still exist in the countries where they were originally domesticated,
    and yet be unknown to ornithologists; and this, considering their
    size, habits, and remarkable characters, seems very improbable; or
    they must have become extinct in the wild state. But birds breeding on
    precipices, and good fliers, are unlikely to be exterminated; and the
    common rock-pigeon, which has the same habits with the domestic
    breeds, has not been exterminated even on several of the smaller
    British islets, or on the shores of the Mediterranean. Hence the
    supposed extermination of so many species having similar habits with
    the rock-pigeon seems to me a very rash assumption. Moreover, the
    several above-named domesticated breeds have been transported to all
    parts of the world, and, therefore, some of them must have been
    carried back again into their native country; but not one has ever
    become wild or feral, though the dovecot-pigeon, which is the
    rock-pigeon in a very slightly altered state, has become feral in
    several places. Again, all recent experience shows that it is most
    difficult to get any wild animal to breed freely under domestication;
    yet on the hypothesis of the multiple origin of our pigeons, it must
    be assumed that at least seven or eight species were so thoroughly
    domesticated in ancient times by half-civilized man, as to be quite
    prolific under confinement.
    
    An argument, as it seems to me, of great weight, and applicable in
    several other cases, is, that the above-specified breeds, though
    agreeing generally in constitution, habits, voice, colouring, and in
    most parts of their structure, with the wild rock-pigeon, yet are
    certainly highly abnormal in other parts of their structure: we may
    look in vain throughout the whole great family of Columbidae for a
    beak like that of the English carrier, or that of the short-faced
    tumbler, or barb; for reversed feathers like those of the jacobin; for
    a crop like that of the pouter; for tail-feathers like those of the
    fantail. Hence it must be assumed not only that half-civilized man
    succeeded in thoroughly domesticating several species, but that he
    intentionally or by chance picked out extraordinarily abnormal
    species; and further, that these very species have since all become
    extinct or unknown. So many strange contingencies seem to me
    improbable in the highest degree.
    
    Some facts in regard to the colouring of pigeons well deserve
    consideration. The rock-pigeon is of a slaty-blue, and has a white
    rump (the Indian sub-species, C. intermedia of Strickland, having it
    bluish); the tail has a terminal dark bar, with the bases of the outer
    feathers externally edged with white; the wings have two black bars;
    some semi-domestic breeds and some apparently truly wild breeds have,
    besides the two black bars, the wings chequered with black. These
    several marks do not occur together in any other species of the whole
    family. Now, in every one of the domestic breeds, taking thoroughly
    well-bred birds, all the above marks, even to the white edging of the
    outer tail-feathers, sometimes concur perfectly developed. Moreover,
    when two birds belonging to two distinct breeds are crossed, neither
    of which is blue or has any of the above-specified marks, the mongrel
    offspring are very apt suddenly to acquire these characters; for
    instance, I crossed some uniformly white fantails with some uniformly
    black barbs, and they produced mottled brown and black birds; these I
    again crossed together, and one grandchild of the pure white fantail
    and pure black barb was of as beautiful a blue colour, with the white
    rump, double black wing-bar, and barred and white-edged tail-feathers,
    as any wild rock-pigeon! We can understand these facts, on the
    well-known principle of reversion to ancestral characters, if all the
    domestic breeds have descended from the rock-pigeon. But if we deny
    this, we must make one of the two following highly improbable
    suppositions. Either, firstly, that all the several imagined
    aboriginal stocks were coloured and marked like the rock-pigeon,
    although no other existing species is thus coloured and marked, so
    that in each separate breed there might be a tendency to revert to the
    very same colours and markings. Or, secondly, that each breed, even
    the purest, has within a dozen or, at most, within a score of
    generations, been crossed by the rock-pigeon: I say within a dozen or
    twenty generations, for we know of no fact countenancing the belief
    that the child ever reverts to some one ancestor, removed by a greater
    number of generations. In a breed which has been crossed only once
    with some distinct breed, the tendency to reversion to any character
    derived from such cross will naturally become less and less, as in
    each succeeding generation there will be less of the foreign blood;
    but when there has been no cross with a distinct breed, and there is a
    tendency in both parents to revert to a character, which has been lost
    during some former generation, this tendency, for all that we can see
    to the contrary, may be transmitted undiminished for an indefinite
    number of generations. These two distinct cases are often confounded
    in treatises on inheritance.
    
    Lastly, the hybrids or mongrels from between all the domestic breeds
    of pigeons are perfectly fertile. I can state this from my own
    observations, purposely made on the most distinct breeds. Now, it is
    difficult, perhaps impossible, to bring forward one case of the hybrid
    offspring of two animals CLEARLY DISTINCT being themselves perfectly
    fertile. Some authors believe that long-continued domestication
    eliminates this strong tendency to sterility: from the history of the
    dog I think there is some probability in this hypothesis, if applied
    to species closely related together, though it is unsupported by a
    single experiment. But to extend the hypothesis so far as to suppose
    that species, aboriginally as distinct as carriers, tumblers, pouters,
    and fantails now are, should yield offspring perfectly fertile, inter
    se, seems to me rash in the extreme.
    
    From these several reasons, namely, the improbability of man having
    formerly got seven or eight supposed species of pigeons to breed
    freely under domestication; these supposed species being quite unknown
    in a wild state, and their becoming nowhere feral; these species
    having very abnormal characters in certain respects, as compared with
    all other Columbidae, though so like in most other respects to the
    rock-pigeon; the blue colour and various marks occasionally appearing
    in all the breeds, both when kept pure and when crossed; the mongrel
    offspring being perfectly fertile;--from these several reasons, taken
    together, I can feel no doubt that all our domestic breeds have
    descended from the Columba livia with its geographical sub-species.
    
    In favour of this view, I may add, firstly, that C. livia, or the
    rock-pigeon, has been found capable of domestication in Europe and in
    India; and that it agrees in habits and in a great number of points of
    structure with all the domestic breeds. Secondly, although an English
    carrier or short-faced tumbler differs immensely in certain characters
    from the rock-pigeon, yet by comparing the several sub-breeds of these
    breeds, more especially those brought from distant countries, we can
    make an almost perfect series between the extremes of structure.
    Thirdly, those characters which are mainly distinctive of each breed,
    for instance the wattle and length of beak of the carrier, the
    shortness of that of the tumbler, and the number of tail-feathers in
    the fantail, are in each breed eminently variable; and the explanation
    of this fact will be obvious when we come to treat of selection.
    Fourthly, pigeons have been watched, and tended with the utmost care,
    and loved by many people. They have been domesticated for thousands of
    years in several quarters of the world; the earliest known record of
    pigeons is in the fifth Aegyptian dynasty, about 3000 B.C., as was
    pointed out to me by Professor Lepsius; but Mr. Birch informs me that
    pigeons are given in a bill of fare in the previous dynasty. In the
    time of the Romans, as we hear from Pliny, immense prices were given
    for pigeons; "nay, they are come to this pass, that they can reckon up
    their pedigree and race." Pigeons were much valued by Akber Khan in
    India, about the year 1600; never less than 20,000 pigeons were taken
    with the court. "The monarchs of Iran and Turan sent him some very
    rare birds;" and, continues the courtly historian, "His Majesty by
    crossing the breeds, which method was never practised before, has
    improved them astonishingly." About this same period the Dutch were as
    eager about pigeons as were the old Romans. The paramount importance
    of these considerations in explaining the immense amount of variation
    which pigeons have undergone, will be obvious when we treat of
    Selection. We shall then, also, see how it is that the breeds so often
    have a somewhat monstrous character. It is also a most favourable
    circumstance for the production of distinct breeds, that male and
    female pigeons can be easily mated for life; and thus different breeds
    can be kept together in the same aviary.
    
    I have discussed the probable origin of domestic pigeons at some, yet
    quite insufficient, length; because when I first kept pigeons and
    watched the several kinds, knowing well how true they bred, I felt
    fully as much difficulty in believing that they could ever have
    descended from a common parent, as any naturalist could in coming to a
    similar conclusion in regard to the many species of finches, or other
    large groups of birds, in nature. One circumstance has struck me much;
    namely, that all the breeders of the various domestic animals and the
    cultivators of plants, with whom I have ever conversed, or whose
    treatises I have read, are firmly convinced that the several breeds to
    which each has attended, are descended from so many aboriginally
    distinct species. Ask, as I have asked, a celebrated raiser of
    Hereford cattle, whether his cattle might not have descended from long
    horns, and he will laugh you to scorn. I have never met a pigeon, or
    poultry, or duck, or rabbit fancier, who was not fully convinced that
    each main breed was descended from a distinct species. Van Mons, in
    his treatise on pears and apples, shows how utterly he disbelieves
    that the several sorts, for instance a Ribston-pippin or Codlin-apple,
    could ever have proceeded from the seeds of the same tree. Innumerable
    other examples could be given. The explanation, I think, is simple:
    from long-continued study they are strongly impressed with the
    differences between the several races; and though they well know that
    each race varies slightly, for they win their prizes by selecting such
    slight differences, yet they ignore all general arguments, and refuse
    to sum up in their minds slight differences accumulated during many
    successive generations. May not those naturalists who, knowing far
    less of the laws of inheritance than does the breeder, and knowing no
    more than he does of the intermediate links in the long lines of
    descent, yet admit that many of our domestic races have descended from
    the same parents--may they not learn a lesson of caution, when they
    deride the idea of species in a state of nature being lineal
    descendants of other species?
    
    SELECTION.
    
    Let us now briefly consider the steps by which domestic races have
    been produced, either from one or from several allied species. Some
    little effect may, perhaps, be attributed to the direct action of the
    external conditions of life, and some little to habit; but he would be
    a bold man who would account by such agencies for the differences of a
    dray and race horse, a greyhound and bloodhound, a carrier and tumbler
    pigeon. One of the most remarkable features in our domesticated races
    is that we see in them adaptation, not indeed to the animal's or
    plant's own good, but to man's use or fancy. Some variations useful to
    him have probably arisen suddenly, or by one step; many botanists, for
    instance, believe that the fuller's teazle, with its hooks, which
    cannot be rivalled by any mechanical contrivance, is only a variety of
    the wild Dipsacus; and this amount of change may have suddenly arisen
    in a seedling. So it has probably been with the turnspit dog; and this
    is known to have been the case with the ancon sheep. But when we
    compare the dray-horse and race-horse, the dromedary and camel, the
    various breeds of sheep fitted either for cultivated land or mountain
    pasture, with the wool of one breed good for one purpose, and that of
    another breed for another purpose; when we compare the many breeds of
    dogs, each good for man in very different ways; when we compare the
    game-cock, so pertinacious in battle, with other breeds so little
    quarrelsome, with "everlasting layers" which never desire to sit, and
    with the bantam so small and elegant; when we compare the host of
    agricultural, culinary, orchard, and flower-garden races of plants,
    most useful to man at different seasons and for different purposes, or
    so beautiful in his eyes, we must, I think, look further than to mere
    variability. We cannot suppose that all the breeds were suddenly
    produced as perfect and as useful as we now see them; indeed, in
    several cases, we know that this has not been their history. The key
    is man's power of accumulative selection: nature gives successive
    variations; man adds them up in certain directions useful to him. In
    this sense he may be said to make for himself useful breeds.
    
    The great power of this principle of selection is not hypothetical. It
    is certain that several of our eminent breeders have, even within a
    single lifetime, modified to a large extent some breeds of cattle and
    sheep. In order fully to realise what they have done, it is almost
    necessary to read several of the many treatises devoted to this
    subject, and to inspect the animals. Breeders habitually speak of an
    animal's organisation as something quite plastic, which they can model
    almost as they please. If I had space I could quote numerous passages
    to this effect from highly competent authorities. Youatt, who was
    probably better acquainted with the works of agriculturalists than
    almost any other individual, and who was himself a very good judge of
    an animal, speaks of the principle of selection as "that which enables
    the agriculturist, not only to modify the character of his flock, but
    to change it altogether. It is the magician's wand, by means of which
    he may summon into life whatever form and mould he pleases." Lord
    Somerville, speaking of what breeders have done for sheep, says:--"It
    would seem as if they had chalked out upon a wall a form perfect in
    itself, and then had given it existence." That most skilful breeder,
    Sir John Sebright, used to say, with respect to pigeons, that "he
    would produce any given feather in three years, but it would take him
    six years to obtain head and beak." In Saxony the importance of the
    principle of selection in regard to merino sheep is so fully
    recognised, that men follow it as a trade: the sheep are placed on a
    table and are studied, like a picture by a connoisseur; this is done
    three times at intervals of months, and the sheep are each time marked
    and classed, so that the very best may ultimately be selected for
    breeding.
    
    What English breeders have actually effected is proved by the enormous
    prices given for animals with a good pedigree; and these have now been
    exported to almost every quarter of the world. The improvement is by
    no means generally due to crossing different breeds; all the best
    breeders are strongly opposed to this practice, except sometimes
    amongst closely allied sub-breeds. And when a cross has been made, the
    closest selection is far more indispensable even than in ordinary
    cases. If selection consisted merely in separating some very distinct
    variety, and breeding from it, the principle would be so obvious as
    hardly to be worth notice; but its importance consists in the great
    effect produced by the accumulation in one direction, during
    successive generations, of differences absolutely inappreciable by an
    uneducated eye--differences which I for one have vainly attempted to
    appreciate. Not one man in a thousand has accuracy of eye and judgment
    sufficient to become an eminent breeder. If gifted with these
    qualities, and he studies his subject for years, and devotes his
    lifetime to it with indomitable perseverance, he will succeed, and may
    make great improvements; if he wants any of these qualities, he will
    assuredly fail. Few would readily believe in the natural capacity and
    years of practice requisite to become even a skilful pigeon-fancier.
    
    The same principles are followed by horticulturists; but the
    variations are here often more abrupt. No one supposes that our
    choicest productions have been produced by a single variation from the
    aboriginal stock. We have proofs that this is not so in some cases, in
    which exact records have been kept; thus, to give a very trifling
    instance, the steadily-increasing size of the common gooseberry may be
    quoted. We see an astonishing improvement in many florists' flowers,
    when the flowers of the present day are compared with drawings made
    only twenty or thirty years ago. When a race of plants is once pretty
    well established, the seed-raisers do not pick out the best plants,
    but merely go over their seed-beds, and pull up the "rogues," as they
    call the plants that deviate from the proper standard. With animals
    this kind of selection is, in fact, also followed; for hardly any one
    is so careless as to allow his worst animals to breed.
    
    In regard to plants, there is another means of observing the
    accumulated effects of selection--namely, by comparing the diversity
    of flowers in the different varieties of the same species in the
    flower-garden; the diversity of leaves, pods, or tubers, or whatever
    part is valued, in the kitchen-garden, in comparison with the flowers
    of the same varieties; and the diversity of fruit of the same species
    in the orchard, in comparison with the leaves and flowers of the same
    set of varieties. See how different the leaves of the cabbage are, and
    how extremely alike the flowers; how unlike the flowers of the
    heartsease are, and how alike the leaves; how much the fruit of the
    different kinds of gooseberries differ in size, colour, shape, and
    hairiness, and yet the flowers present very slight differences. It is
    not that the varieties which differ largely in some one point do not
    differ at all in other points; this is hardly ever, perhaps never, the
    case. The laws of correlation of growth, the importance of which
    should never be overlooked, will ensure some differences; but, as a
    general rule, I cannot doubt that the continued selection of slight
    variations, either in the leaves, the flowers, or the fruit, will
    produce races differing from each other chiefly in these characters.
    
    It may be objected that the principle of selection has been reduced to
    methodical practice for scarcely more than three-quarters of a
    century; it has certainly been more attended to of late years, and
    many treatises have been published on the subject; and the result, I
    may add, has been, in a corresponding degree, rapid and important. But
    it is very far from true that the principle is a modern discovery. I
    could give several references to the full acknowledgment of the
    importance of the principle in works of high antiquity. In rude and
    barbarous periods of English history choice animals were often
    imported, and laws were passed to prevent their exportation: the
    destruction of horses under a certain size was ordered, and this may
    be compared to the "roguing" of plants by nurserymen. The principle of
    selection I find distinctly given in an ancient Chinese encyclopaedia.
    Explicit rules are laid down by some of the Roman classical writers.
    From passages in Genesis, it is clear that the colour of domestic
    animals was at that early period attended to. Savages now sometimes
    cross their dogs with wild canine animals, to improve the breed, and
    they formerly did so, as is attested by passages in Pliny. The savages
    in South Africa match their draught cattle by colour, as do some of
    the Esquimaux their teams of dogs. Livingstone shows how much good
    domestic breeds are valued by the negroes of the interior of Africa
    who have not associated with Europeans. Some of these facts do not
    show actual selection, but they show that the breeding of domestic
    animals was carefully attended to in ancient times, and is now
    attended to by the lowest savages. It would, indeed, have been a
    strange fact, had attention not been paid to breeding, for the
    inheritance of good and bad qualities is so obvious.
    
    At the present time, eminent breeders try by methodical selection,
    with a distinct object in view, to make a new strain or sub-breed,
    superior to anything existing in the country. But, for our purpose, a
    kind of Selection, which may be called Unconscious, and which results
    from every one trying to possess and breed from the best individual
    animals, is more important. Thus, a man who intends keeping pointers
    naturally tries to get as good dogs as he can, and afterwards breeds
    from his own best dogs, but he has no wish or expectation of
    permanently altering the breed. Nevertheless I cannot doubt that this
    process, continued during centuries, would improve and modify any
    breed, in the same way as Bakewell, Collins, etc., by this very same
    process, only carried on more methodically, did greatly modify, even
    during their own lifetimes, the forms and qualities of their cattle.
    Slow and insensible changes of this kind could never be recognised
    unless actual measurements or careful drawings of the breeds in
    question had been made long ago, which might serve for comparison. In
    some cases, however, unchanged or but little changed individuals of
    the same breed may be found in less civilised districts, where the
    breed has been less improved. There is reason to believe that King
    Charles's spaniel has been unconsciously modified to a large extent
    since the time of that monarch. Some highly competent authorities are
    convinced that the setter is directly derived from the spaniel, and
    has probably been slowly altered from it. It is known that the English
    pointer has been greatly changed within the last century, and in this
    case the change has, it is believed, been chiefly effected by crosses
    with the fox-hound; but what concerns us is, that the change has been
    effected unconsciously and gradually, and yet so effectually, that,
    though the old Spanish pointer certainly came from Spain, Mr. Borrow
    has not seen, as I am informed by him, any native dog in Spain like
    our pointer.
    
    By a similar process of selection, and by careful training, the whole
    body of English racehorses have come to surpass in fleetness and size
    the parent Arab stock, so that the latter, by the regulations for the
    Goodwood Races, are favoured in the weights they carry. Lord Spencer
    and others have shown how the cattle of England have increased in
    weight and in early maturity, compared with the stock formerly kept in
    this country. By comparing the accounts given in old pigeon treatises
    of carriers and tumblers with these breeds as now existing in Britain,
    India, and Persia, we can, I think, clearly trace the stages through
    which they have insensibly passed, and come to differ so greatly from
    the rock-pigeon.
    
    Youatt gives an excellent illustration of the effects of a course of
    selection, which may be considered as unconsciously followed, in so
    far that the breeders could never have expected or even have wished to
    have produced the result which ensued--namely, the production of two
    distinct strains. The two flocks of Leicester sheep kept by Mr.
    Buckley and Mr. Burgess, as Mr. Youatt remarks, "have been purely bred
    from the original stock of Mr. Bakewell for upwards of fifty years.
    There is not a suspicion existing in the mind of any one at all
    acquainted with the subject that the owner of either of them has
    deviated in any one instance from the pure blood of Mr. Bakewell's
    flock, and yet the difference between the sheep possessed by these two
    gentlemen is so great that they have the appearance of being quite
    different varieties."
    
    If there exist savages so barbarous as never to think of the inherited
    character of the offspring of their domestic animals, yet any one
    animal particularly useful to them, for any special purpose, would be
    carefully preserved during famines and other accidents, to which
    savages are so liable, and such choice animals would thus generally
    leave more offspring than the inferior ones; so that in this case
    there would be a kind of unconscious selection going on. We see the
    value set on animals even by the barbarians of Tierra del Fuego, by
    their killing and devouring their old women, in times of dearth, as of
    less value than their dogs.
    
    In plants the same gradual process of improvement, through the
    occasional preservation of the best individuals, whether or not
    sufficiently distinct to be ranked at their first appearance as
    distinct varieties, and whether or not two or more species or races
    have become blended together by crossing, may plainly be recognised in
    the increased size and beauty which we now see in the varieties of the
    heartsease, rose, pelargonium, dahlia, and other plants, when compared
    with the older varieties or with their parent-stocks. No one would
    ever expect to get a first-rate heartsease or dahlia from the seed of
    a wild plant. No one would expect to raise a first-rate melting pear
    from the seed of a wild pear, though he might succeed from a poor
    seedling growing wild, if it had come from a garden-stock. The pear,
    though cultivated in classical times, appears, from Pliny's
    description, to have been a fruit of very inferior quality. I have
    seen great surprise expressed in horticultural works at the wonderful
    skill of gardeners, in having produced such splendid results from such
    poor materials; but the art, I cannot doubt, has been simple, and, as
    far as the final result is concerned, has been followed almost
    unconsciously. It has consisted in always cultivating the best known
    variety, sowing its seeds, and, when a slightly better variety has
    chanced to appear, selecting it, and so onwards. But the gardeners of
    the classical period, who cultivated the best pear they could procure,
    never thought what splendid fruit we should eat; though we owe our
    excellent fruit, in some small degree, to their having naturally
    chosen and preserved the best varieties they could anywhere find.
    
    A large amount of change in our cultivated plants, thus slowly and
    unconsciously accumulated, explains, as I believe, the well-known
    fact, that in a vast number of cases we cannot recognise, and
    therefore do not know, the wild parent-stocks of the plants which have
    been longest cultivated in our flower and kitchen gardens. If it has
    taken centuries or thousands of years to improve or modify most of our
    plants up to their present standard of usefulness to man, we can
    understand how it is that neither Australia, the Cape of Good Hope,
    nor any other region inhabited by quite uncivilised man, has afforded
    us a single plant worth culture. It is not that these countries, so
    rich in species, do not by a strange chance possess the aboriginal
    stocks of any useful plants, but that the native plants have not been
    improved by continued selection up to a standard of perfection
    comparable with that given to the plants in countries anciently
    civilised.
    
    In regard to the domestic animals kept by uncivilised man, it should
    not be overlooked that they almost always have to struggle for their
    own food, at least during certain seasons. And in two countries very
    differently circumstanced, individuals of the same species, having
    slightly different constitutions or structure, would often succeed
    better in the one country than in the other, and thus by a process of
    "natural selection," as will hereafter be more fully explained, two
    sub-breeds might be formed. This, perhaps, partly explains what has
    been remarked by some authors, namely, that the varieties kept by
    savages have more of the character of species than the varieties kept
    in civilised countries.
    
    On the view here given of the all-important part which selection by
    man has played, it becomes at once obvious, how it is that our
    domestic races show adaptation in their structure or in their habits
    to man's wants or fancies. We can, I think, further understand the
    frequently abnormal character of our domestic races, and likewise
    their differences being so great in external characters and relatively
    so slight in internal parts or organs. Man can hardly select, or only
    with much difficulty, any deviation of structure excepting such as is
    externally visible; and indeed he rarely cares for what is internal.
    He can never act by selection, excepting on variations which are first
    given to him in some slight degree by nature. No man would ever try to
    make a fantail, till he saw a pigeon with a tail developed in some
    slight degree in an unusual manner, or a pouter till he saw a pigeon
    with a crop of somewhat unusual size; and the more abnormal or unusual
    any character was when it first appeared, the more likely it would be
    to catch his attention. But to use such an expression as trying to
    make a fantail, is, I have no doubt, in most cases, utterly incorrect.
    The man who first selected a pigeon with a slightly larger tail, never
    dreamed what the descendants of that pigeon would become through
    long-continued, partly unconscious and partly methodical selection.
    Perhaps the parent bird of all fantails had only fourteen
    tail-feathers somewhat expanded, like the present Java fantail, or
    like individuals of other and distinct breeds, in which as many as
    seventeen tail-feathers have been counted. Perhaps the first
    pouter-pigeon did not inflate its crop much more than the turbit now
    does the upper part of its oesophagus,--a habit which is disregarded
    by all fanciers, as it is not one of the points of the breed.
    
    Nor let it be thought that some great deviation of structure would be
    necessary to catch the fancier's eye: he perceives extremely small
    differences, and it is in human nature to value any novelty, however
    slight, in one's own possession. Nor must the value which would
    formerly be set on any slight differences in the individuals of the
    same species, be judged of by the value which would now be set on
    them, after several breeds have once fairly been established. Many
    slight differences might, and indeed do now, arise amongst pigeons,
    which are rejected as faults or deviations from the standard of
    perfection of each breed. The common goose has not given rise to any
    marked varieties; hence the Thoulouse and the common breed, which
    differ only in colour, that most fleeting of characters, have lately
    been exhibited as distinct at our poultry-shows.
    
    I think these views further explain what has sometimes been
    noticed--namely that we know nothing about the origin or history of
    any of our domestic breeds. But, in fact, a breed, like a dialect of a
    language, can hardly be said to have had a definite origin. A man
    preserves and breeds from an individual with some slight deviation of
    structure, or takes more care than usual in matching his best animals
    and thus improves them, and the improved individuals slowly spread in
    the immediate neighbourhood. But as yet they will hardly have a
    distinct name, and from being only slightly valued, their history will
    be disregarded. When further improved by the same slow and gradual
    process, they will spread more widely, and will get recognised as
    something distinct and valuable, and will then probably first receive
    a provincial name. In semi-civilised countries, with little free
    communication, the spreading and knowledge of any new sub-breed will
    be a slow process. As soon as the points of value of the new sub-breed
    are once fully acknowledged, the principle, as I have called it, of
    unconscious selection will always tend,--perhaps more at one period
    than at another, as the breed rises or falls in fashion,--perhaps more
    in one district than in another, according to the state of
    civilisation of the inhabitants--slowly to add to the characteristic
    features of the breed, whatever they may be. But the chance will be
    infinitely small of any record having been preserved of such slow,
    varying, and insensible changes.
    
    I must now say a few words on the circumstances, favourable, or the
    reverse, to man's power of selection. A high degree of variability is
    obviously favourable, as freely giving the materials for selection to
    work on; not that mere individual differences are not amply
    sufficient, with extreme care, to allow of the accumulation of a large
    amount of modification in almost any desired direction. But as
    variations manifestly useful or pleasing to man appear only
    occasionally, the chance of their appearance will be much increased by
    a large number of individuals being kept; and hence this comes to be
    of the highest importance to success. On this principle Marshall has
    remarked, with respect to the sheep of parts of Yorkshire, that "as
    they generally belong to poor people, and are mostly IN SMALL LOTS,
    they never can be improved." On the other hand, nurserymen, from
    raising large stocks of the same plants, are generally far more
    successful than amateurs in getting new and valuable varieties. The
    keeping of a large number of individuals of a species in any country
    requires that the species should be placed under favourable conditions
    of life, so as to breed freely in that country. When the individuals
    of any species are scanty, all the individuals, whatever their quality
    may be, will generally be allowed to breed, and this will effectually
    prevent selection. But probably the most important point of all, is,
    that the animal or plant should be so highly useful to man, or so much
    valued by him, that the closest attention should be paid to even the
    slightest deviation in the qualities or structure of each individual.
    Unless such attention be paid nothing can be effected. I have seen it
    gravely remarked, that it was most fortunate that the strawberry began
    to vary just when gardeners began to attend closely to this plant. No
    doubt the strawberry had always varied since it was cultivated, but
    the slight varieties had been neglected. As soon, however, as
    gardeners picked out individual plants with slightly larger, earlier,
    or better fruit, and raised seedlings from them, and again picked out
    the best seedlings and bred from them, then, there appeared (aided by
    some crossing with distinct species) those many admirable varieties of
    the strawberry which have been raised during the last thirty or forty
    years.
    
    In the case of animals with separate sexes, facility in preventing
    crosses is an important element of success in the formation of new
    races,--at least, in a country which is already stocked with other
    races. In this respect enclosure of the land plays a part. Wandering
    savages or the inhabitants of open plains rarely possess more than one
    breed of the same species. Pigeons can be mated for life, and this is
    a great convenience to the fancier, for thus many races may be kept
    true, though mingled in the same aviary; and this circumstance must
    have largely favoured the improvement and formation of new breeds.
    Pigeons, I may add, can be propagated in great numbers and at a very
    quick rate, and inferior birds may be freely rejected, as when killed
    they serve for food. On the other hand, cats, from their nocturnal
    rambling habits, cannot be matched, and, although so much valued by
    women and children, we hardly ever see a distinct breed kept up; such
    breeds as we do sometimes see are almost always imported from some
    other country, often from islands. Although I do not doubt that some
    domestic animals vary less than others, yet the rarity or absence of
    distinct breeds of the cat, the donkey, peacock, goose, etc., may be
    attributed in main part to selection not having been brought into
    play: in cats, from the difficulty in pairing them; in donkeys, from
    only a few being kept by poor people, and little attention paid to
    their breeding; in peacocks, from not being very easily reared and a
    large stock not kept; in geese, from being valuable only for two
    purposes, food and feathers, and more especially from no pleasure
    having been felt in the display of distinct breeds.
    
    To sum up on the origin of our Domestic Races of animals and plants. I
    believe that the conditions of life, from their action on the
    reproductive system, are so far of the highest importance as causing
    variability. I do not believe that variability is an inherent and
    necessary contingency, under all circumstances, with all organic
    beings, as some authors have thought. The effects of variability are
    modified by various degrees of inheritance and of reversion.
    Variability is governed by many unknown laws, more especially by that
    of correlation of growth. Something may be attributed to the direct
    action of the conditions of life. Something must be attributed to use
    and disuse. The final result is thus rendered infinitely complex. In
    some cases, I do not doubt that the intercrossing of species,
    aboriginally distinct, has played an important part in the origin of
    our domestic productions. When in any country several domestic breeds
    have once been established, their occasional intercrossing, with the
    aid of selection, has, no doubt, largely aided in the formation of new
    sub-breeds; but the importance of the crossing of varieties has, I
    believe, been greatly exaggerated, both in regard to animals and to
    those plants which are propagated by seed. In plants which are
    temporarily propagated by cuttings, buds, etc., the importance of the
    crossing both of distinct species and of varieties is immense; for the
    cultivator here quite disregards the extreme variability both of
    hybrids and mongrels, and the frequent sterility of hybrids; but the
    cases of plants not propagated by seed are of little importance to us,
    for their endurance is only temporary. Over all these causes of Change
    I am convinced that the accumulative action of Selection, whether
    applied methodically and more quickly, or unconsciously and more
    slowly, but more efficiently, is by far the predominant Power.
    
    
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/resources/README.txt����������������������������������������0000644�0001750�0001750�00000000444�11377016712�023462� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
    Few test cases InitializationTest requite the presence of logback.xml or logback-test.xml
    to be present in the classpath. However, this conflict with the logback-examples module. 
    In particular, when users attempt to follow the manual by importing the project in an IDE 
    such as Eclipse.����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/resources/TWO_DATE_logback-test.xml�������������������������0000644�0001750�0001750�00000001260�11674177011�026410� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
      <statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener"/>
    
      <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>test.log</file>
    
    
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
          <!-- rollover every minute -->
          <fileNamePattern>bla-%d{yyyy-MM-dd, SECONDARY}/app.%d{yyyy-MM-dd'T'HH_mm}.log</fileNamePattern>
        </rollingPolicy>
    
        <encoder>
          <pattern>%d{"yyyy-MM-dd HH:mm:ss,SSS"} [%thread] %-5level %logger{36} - %msg%n%xEx</pattern>
        </encoder>
      </appender>
    
      <root level="DEBUG">
        <appender-ref ref="FILE"/>
      </root>
    </configuration>������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/resources/BOO_logback-test.xml������������������������������0000644�0001750�0001750�00000000617�11377016712�025566� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    
      <appender name="STDOUT"
        class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
          <param name="Pattern"
            value="TEST %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />
        </layout>
      </appender>
    
      <root>
        <level value="ERROR" />
        <appender-ref ref="STDOUT" />
      </root>
    </configuration>�����������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/test/resources/recursiveInit.xml���������������������������������0000644�0001750�0001750�00000000751�11377016712�025342� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<configuration>
    
      <appender name="STDOUT"
        class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
          <Pattern>TEST %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</Pattern>
        </encoder>
      </appender>
    
                                                   
      <appender name="RECURSIVE"  class="org.slf4j.impl.RecursiveLBAppender"/>
        
      <root level="DEBUG" >
        <appender-ref ref="STDOUT" />
         <appender-ref ref="RECURSIVE" />
      </root>
    </configuration>�����������������������logback_1.0.13/logback-classic/src/IBUNDLE-META-INF/������������������������������������������������0000755�0001750�0001750�00000000000�12203357067�021211� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/src/IBUNDLE-META-INF/MANIFEST.MF�������������������������������������0000644�0001750�0001750�00000001106�11377016712�022641� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Manifest-Version: 1.0
    Archiver-Version: Plexus Archiver
    Created-By: Apache Maven
    Built-By: ceki
    Build-Jdk: 1.6.0_16
    Bundle-Description: iBundle
    Bundle-Version: 0.1
    Bundle-Activator: integrator.Activator
    Implementation-Title: iBundle
    Bundle-ManifestVersion: 2
    Bundle-SymbolicName: iBundle
    Bundle-Name: abundle
    Bundle-RequiredExecutionEnvironment: J2SE-1.3
    Export-Package: apack
    Import-Package: org.osgi.framework, org.slf4j;version=1.6, ch.qos.logback.core, ch.qos.logback.core.joran.spi, ch.qos.logback.core.util, ch.qos.logback.classic, ch.qos.logback.classic.joran
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/integration.xml������������������������������������������������������0000644�0001750�0001750�00000003262�12136042142�021240� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<project name="integration" default="testAll" basedir=".">
    
    	<!--
    		This build file is usually run indirectly via Maven.
    		
    		When running this build file through Ant directly, you must
    		define the slf4jVersion property on the command line, e.g.:
    		
    		ant  -Dslf4jVersion=1.5.4-SNAPSHOT	
    	-->
    	
    	<echo message="slf4j.version:  ${slf4j.version}" />
    
    	<path id="basicClasspath">
    		<pathelement location="../logback-core/target/classes/" />
    		<pathelement location="../logback-core/target/test-classes/" />
    		<pathelement location="./target/classes/" />
    		<pathelement location="./target/test-classes/" />
    		<pathelement location="./lib/slf4j-api-${slf4j.version}.jar" />
        <pathelement location="./src/test/input/integration/autoInit/" />
    	</path >
    
    
    	<target name="testAll" depends="testWithoutGroovy, testConditionalsWithoutJanino" 
              unless="maven.test.skip">
    	</target>
    
    
    	<target name="testWithoutGroovy" unless="maven.test.skip">
    		<junit printsummary="yes" fork="no" haltonfailure="yes">
    			<classpath refid="basicClasspath" />
    			<formatter type="plain" />
    			<test fork="yes" todir="target/unit-reports" 
                outfile="TEST-NoGroovy" 
                name="ch.qos.logback.classic.util.InitializationIntegrationTest" />
    		</junit>
    	</target>
    
    	<target name="testConditionalsWithoutJanino" unless="maven.test.skip">
    		<junit printsummary="yes" fork="no" haltonfailure="yes">
    			<classpath refid="basicClasspath" />
    			<formatter type="plain" />
    			<test fork="yes" todir="target/unit-reports" 
                outfile="TEST-NoJanino" 
                name="ch.qos.logback.classic.boolex.ConditionalWithoutJanino" />
    		</junit>
    	</target>
    
    
    
    
    </project>����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/pom.xml��������������������������������������������������������������0000644�0001750�0001750�00000027135�12143153471�017523� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    
      <modelVersion>4.0.0</modelVersion>
    
      <parent>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-parent</artifactId>
        <version>1.0.13</version>
      </parent>
    
      <artifactId>logback-classic</artifactId>
      <packaging>jar</packaging>
      <name>Logback Classic Module</name>
      <description>logback-classic module</description>
    
      <url>http://logback.qos.ch</url>
    
      <licenses>
        <license>
          <name>Eclipse Public License - v 1.0</name>
          <url>http://www.eclipse.org/legal/epl-v10.html</url>
        </license>
    
        <license>
          <name>GNU Lesser General Public License</name>
          <url>http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html</url>
        </license>
      </licenses>
    
      <dependencies>
        <dependency>
          <groupId>ch.qos.logback</groupId>
          <artifactId>logback-core</artifactId>
          <scope>compile</scope>
        </dependency>
    
        <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-api</artifactId>
          <scope>compile</scope>
        </dependency>
    
        <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-ext</artifactId>
          <version>${slf4j.version}</version>
          <scope>test</scope>
        </dependency>
    
        <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-api</artifactId>
          <type>test-jar</type>
          <version>${slf4j.version}</version>
          <scope>test</scope>
        </dependency>
    
        <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>log4j-over-slf4j</artifactId>
          <version>${slf4j.version}</version>
          <scope>test</scope>
        </dependency>
    
        <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>jul-to-slf4j</artifactId>
          <version>${slf4j.version}</version>
          <scope>test</scope>
        </dependency>
    
    
        <dependency>
          <groupId>dom4j</groupId>
          <artifactId>dom4j</artifactId>
          <scope>test</scope>
        </dependency>
    
        <dependency>
          <groupId>hsqldb</groupId>
          <artifactId>hsqldb</artifactId>
          <scope>test</scope>
        </dependency>
    
        <dependency>
          <groupId>com.h2database</groupId>
          <artifactId>h2</artifactId>
          <scope>test</scope>
        </dependency>
    
        <dependency>
          <groupId>postgresql</groupId>
          <artifactId>postgresql</artifactId>
          <scope>test</scope>
        </dependency>
    
        <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>5.1.9</version>
          <scope>test</scope>
        </dependency>
    
        <dependency>
          <groupId>javax.mail</groupId>
          <artifactId>mail</artifactId>
          <scope>compile</scope>
          <optional>true</optional>
        </dependency>
    
        <dependency>
          <groupId>org.codehaus.janino</groupId>
          <artifactId>janino</artifactId>
          <scope>compile</scope>
          <optional>true</optional>
        </dependency>
    
        <dependency>
          <groupId>org.codehaus.groovy</groupId>
          <artifactId>groovy-all</artifactId>
          <scope>compile</scope>
          <optional>true</optional>
        </dependency>
    
    
        <dependency>
          <groupId>ch.qos.logback</groupId>
          <artifactId>logback-core</artifactId>
          <type>test-jar</type>
          <scope>test</scope>
        </dependency>
    
        <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>integration</artifactId>
          <version>${slf4j.version}</version>
          <scope>test</scope>
        </dependency>
    
        <dependency>
          <groupId>org.apache.geronimo.specs</groupId>
          <artifactId>geronimo-jms_1.1_spec</artifactId>
          <scope>compile</scope>
          <optional>true</optional>
        </dependency>
    
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>servlet-api</artifactId>
          <scope>compile</scope>
          <optional>true</optional>
        </dependency>
    
        <dependency>
          <groupId>com.icegreen</groupId>
          <artifactId>greenmail</artifactId>
          <version>1.3</version>
          <scope>test</scope>
        </dependency>
    
        <dependency>
          <groupId>org.subethamail</groupId>
          <artifactId>subethasmtp</artifactId>
          <version>2.1.0</version>
          <scope>test</scope>
          <exclusions>
            <exclusion>
              <groupId>org.slf4j</groupId>
              <artifactId>slf4j-api</artifactId>
            </exclusion>
          </exclusions>
        </dependency>
    
        <dependency>
          <groupId>org.apache.felix</groupId>
          <artifactId>org.apache.felix.main</artifactId>
          <version>2.0.2</version>
          <scope>test</scope>
        </dependency>
    
      </dependencies>
    
    
      <build>
    
        <resources>
          <resource>
            <directory>src/main/groovy</directory>
            <includes>
              <include>**/EvaluatorTemplate.groovy</include>
            </includes>
          </resource>
        </resources>
    
    
        <plugins>
          <plugin>
            <groupId>org.codehaus.gmaven</groupId>
            <artifactId>gmaven-plugin</artifactId>
            <version>1.4</version>
            <dependencies>
              <dependency>
                <groupId>org.codehaus.groovy</groupId>
                <artifactId>groovy-all</artifactId>
                <version>${groovy.version}</version>
              </dependency>
            </dependencies>
            <executions>
              <execution>
                <configuration>
                  <providerSelection>1.8</providerSelection>
                </configuration>
                <goals>
                  <goal>generateStubs</goal>
                  <goal>compile</goal>
                  <goal>generateTestStubs</goal>
                  <goal>testCompile</goal>
                </goals>
              </execution>
            </executions>
    
          </plugin>
    
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>${maven-jar-plugin.version}</version>
            <configuration>
              <archive>
                <manifestFile>
                  ${project.build.outputDirectory}/META-INF/MANIFEST.MF
                </manifestFile>
              </archive>
            </configuration>
            <executions>
              <execution>
                <id>bundle-test-jar</id>
                <phase>package</phase>
                <goals>
                  <goal>jar</goal>
                  <goal>test-jar</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
    
    
          <plugin>
            <artifactId>maven-antrun-plugin</artifactId>
            <version>1.4</version>
            <dependencies>
              <dependency>
                <groupId>org.apache.ant</groupId>
                <artifactId>ant-junit</artifactId>
                <version>1.8.1</version>
              </dependency>
              <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit.version}</version>
              </dependency>
    
            </dependencies>
    
            <executions>
              <execution>
                <id>ant-osgi-test</id>
                <phase>package</phase>
                <configuration>
                  <tasks>
                    <property name="currentVersion" value="${project.version}"/>
                    <property name="slf4j.version" value="${slf4j.version}"/>
                    <property name="basedir" value="${basedir}"/>
                    <ant antfile="${basedir}/osgi-build.xml"/>
                  </tasks>
                </configuration>
                <goals>
                  <goal>run</goal>
                </goals>
              </execution>
    
              <execution>
                <id>ant-integration-test</id>
                <phase>package</phase>
                <configuration>
                  <tasks>
                    <property name="slf4j.version" value="${slf4j.version}"/>
                    <ant antfile="${basedir}/integration.xml"/>
                  </tasks>
                </configuration>
                <goals>
                  <goal>run</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
    
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>${maven-surefire-plugin.version}</version>
            <configuration>
              <!-- once, never, pertest, always -->
              <forkMode>once</forkMode>
              <!--<parallel>classes</parallel>-->
              <reportFormat>plain</reportFormat>
              <trimStackTrace>false</trimStackTrace>
              <excludes>
                <exclude>**/AllClassicTest.java</exclude>
                <exclude>**/PackageTest.java</exclude>
                <exclude>**/TestConstants.java</exclude>
                <exclude>**/test_osgi/BundleTest.java</exclude>
                <exclude>**/ch/qos/logback/classic/util/InitializationIntegrationTest.java</exclude>
                <!-- skip performance tests -->
                <exclude>**/*PerfTest.java</exclude>
              </excludes>
            </configuration>
          </plugin>
    
    
          <plugin>
            <groupId>org.apache.felix</groupId>
            <artifactId>maven-bundle-plugin</artifactId>
            <extensions>true</extensions>
            <executions>
              <execution>
                <id>bundle-manifest</id>
                <phase>process-classes</phase>
                <goals>
                  <goal>manifest</goal>
                </goals>
              </execution>
            </executions>
            <configuration>
              <instructions>
                <Export-Package>ch.qos.logback.classic*, org.slf4j.impl;version=${slf4j.version}</Export-Package>
                <!-- LB-CLASSIC It is necessary to specify the rolling
                     file packages as classes are created via IOC (xml
                     config files). They won't be found by Bnd's analysis
                     of java code. -->
    
                <Import-Package>
                  sun.reflect;resolution:=optional,
                  javax.*;resolution:=optional,
                  org.xml.*;resolution:=optional,
                  org.slf4j,
                  ch.qos.logback.core.rolling,
                  ch.qos.logback.core.rolling.helper,
                  ch.qos.logback.core.util,
                  ch.qos.logback.core.read,
                  org.codehaus.groovy.*;resolution:=optional,
                  groovy.lang.*;resolution:=optional,
                  *
                </Import-Package>
    
                <Bundle-RequiredExecutionEnvironment>J2SE-1.5</Bundle-RequiredExecutionEnvironment>
              </instructions>
            </configuration>
          </plugin>
    
        </plugins>
      </build>
    
      <profiles>
    
        <profile>
          <!-- Integration tests require the host-orion profile -->
          <id>host-orion</id>
          <dependencies>
            <!-- locally installed artifact -->
            <dependency>
              <groupId>com.microsoft.sqlserver</groupId>
              <artifactId>sqljdbc4</artifactId>
              <version>2.0</version>
              <scope>test</scope>
            </dependency>
            <!-- locally installed artifact -->
            <dependency>
              <groupId>com.oracle</groupId>
              <artifactId>ojdbc14</artifactId>
              <version>10.2.0.1</version>
              <scope>test</scope>
            </dependency>
          </dependencies>
    
        </profile>
    
        <profile>
          <!-- Integration tests require the host-hora profile -->
          <id>host-hora</id>
          <dependencies>
            <!-- locally installed artifact -->
            <dependency>
              <groupId>com.oracle</groupId>
              <artifactId>ojdbc14</artifactId>
              <version>10.2.0.1</version>
              <scope>test</scope>
            </dependency>
          </dependencies>
        </profile>
      </profiles>
    
    </project>
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-classic/osgi-build.xml�������������������������������������������������������0000644�0001750�0001750�00000006463�11650024463�020767� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<project name="osgi-test" default="testAll">
    
    	<!--
        This build file is intended for testing purposes. It does not
        actually package or create any files with a lifespan beyond that
        of the current test cycle.
        
    		This build file is usually run indirectly via Maven.
    		
    		When running this build file through Ant directly, you must
    		define the currentVersion property on the command line, e.g.:
    		
    		ant  -DcurrentVersion=1.5.4-SNAPSHOT	
    	-->
    	
      <!-- We skip the test if the maven.test.skip system property is set
           to true. See also http://jira.qos.ch/browse/LBCLASSIC-191 -->
    
    	<echo message="compile classpath: ${currentVersion}" />
      	<echo message="slfj4:    ${org.slf4j:slf4j-api:jar}" />
        <echo message="felix   ${org.apache.felix:org.apache.felix.main:jar}" />
    
    
    
      <property name="iBundleJar" value="target/iBundle.jar"/>
      <property name="bundlesDir" value="bundle"/>
    
    
    	<echo message="===============================" />
    	<echo message="basedir:           ${basedir}" />
    	<echo message="===============================" />
                
      <path id="basicCP">
        <pathelement location="${org.apache.felix:org.apache.felix.main:jar}" />    
        <pathelement location="target/classes/" />
        <pathelement location="target/test-classes" />  
    	</path >
    
    
    	<path id="minimal">
    		<pathelement location="target/test-classes/" />
    	</path >
    
      <target name="copySLF4J_JAR">
        <echo>Copying ${org.slf4j:slf4j-api:jar} to lib/</echo>
        <delete>
          <fileset dir="../logback-examples/lib/" includes="slf4j-*SNAPSHOT.jar" />
        </delete>
        <copy file="${org.slf4j:slf4j-api:jar}" todir="lib/" />
      </target>
    
    	<target name="init" depends="copySLF4J_JAR">
    		<mkdir dir="target/unit-reports" />
    	</target>
    
      <target name="createIBundle" unless="maven.test.skip">
        <mkdir dir="${bundlesDir}"/>
        <jar destFile="${iBundleJar}" 
             manifest="src/IBUNDLE-META-INF/MANIFEST.MF"
             basedir="target/test-classes/"
             includes="integrator/**.class"/>
                       
      </target>
    
    	<target name="testAll" depends="init, createIBundle, logback" unless="maven.test.skip">
    	</target>
    
    
      <macrodef name="prepareOSGiHarness">
        <attribute name="binding"/>
        <sequential>
          <delete>
            <fileset dir="${bundlesDir}" includes="*.jar"/>
          </delete>
          <copy file="${iBundleJar}" todir="${bundlesDir}"/>
          <copy file="lib/slf4j-api-${slf4j.version}.jar" todir="${bundlesDir}"/>
          <copy file="../logback-core/target/logback-core-${currentVersion}.jar" todir="${bundlesDir}"/>
          <copy file="target/logback-classic-${currentVersion}.jar" todir="${bundlesDir}"/>
          <echo>value of binding = @{binding}</echo>
        </sequential>
      </macrodef>
    
    
       <!-- for some reason if mvn is invoked from the parent directory, junit gets
            invoked from the parent dir, which messes up theses tests. Hence, the
            fork="yes" dir="${basedir}" -->
    
    	<target name="logback" unless="maven.test.skip">
        <prepareOSGiHarness binding="logback"/>
        <junit printsummary="yes" fork="yes" dir="${basedir}" haltonfailure="yes">    
          <classpath refid="basicCP"/>
          <formatter type="plain" />
          <test fork="yes" todir="target/unit-reports" name="org.slf4j.test_osgi.BundleTest" />
        </junit>
    	</target>
      
    </project>�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/LICENSE.txt��������������������������������������������������������������������������0000644�0001750�0001750�00000000746�11725577626�015030� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Logback LICENSE
    ---------------
    
    Logback: the reliable, generic, fast and flexible logging framework.
    Copyright (C) 1999-2012, QOS.ch. All rights reserved.
    
    This program and the accompanying materials are dual-licensed under
    either the terms of the Eclipse Public License v1.0 as published by
    the Eclipse Foundation
     
      or (per the licensee's choosing)
     
    under the terms of the GNU Lesser General Public License version 2.1
    as published by the Free Software Foundation.
    
    ��������������������������logback_1.0.13/logback-core/������������������������������������������������������������������������0000755�0001750�0001750�00000000000�12203357067�015511� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/��������������������������������������������������������������������0000755�0001750�0001750�00000000000�11506604166�016300� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/���������������������������������������������������������������0000755�0001750�0001750�00000000000�11506604165�017223� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/����������������������������������������������������������0000755�0001750�0001750�00000000000�11506604165�020144� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/�������������������������������������������������������0000755�0001750�0001750�00000000000�11506604165�020536� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/���������������������������������������������������0000755�0001750�0001750�00000000000�11506604165�021340� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/�������������������������������������������0000755�0001750�0001750�00000000000�11506604165�022742� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/��������������������������������������0000755�0001750�0001750�00000000000�12203357067�023673� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/LogbackException.java�����������������0000644�0001750�0001750�00000001461�12136042271�027752� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core;
    
    public class LogbackException extends RuntimeException {
    
      private static final long serialVersionUID = -799956346239073266L;
    
      public LogbackException(String msg) {
        super(msg);
      }
      
      
      public LogbackException(String msg, Throwable nested) {
        super(msg, nested);
      }
      
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/Context.java��������������������������0000644�0001750�0001750�00000006242�12136042271�026157� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core;
    
    import java.util.Map;
    import java.util.concurrent.ExecutorService;
    
    import ch.qos.logback.core.spi.LifeCycle;
    import ch.qos.logback.core.spi.PropertyContainer;
    import ch.qos.logback.core.status.StatusManager;
    
    /**
     * A context is the main anchorage point of all logback components.
     * 
     * @author Ceki Gulcu
     * 
     */
    public interface Context extends PropertyContainer {
    
      /**
       * Return the StatusManager instance in use.
       * 
       * @return the {@link StatusManager} instance in use.
       */
      StatusManager getStatusManager();
    
      /**
       * A Context can act as a store for various objects used by LOGBack
       * components.
       * 
       * @return The object stored under 'key'.
       */
      Object getObject(String key);
    
      /**
       * Store an object under 'key'. If no object can be found, null is returned.
       * 
       * @param key
       * @param value
       */
      void putObject(String key, Object value);
    
      /**
       * Get all the properties for this context as a Map. Note that the returned
       * cop might be a copy not the original. Thus, modifying the returned Map will
       * have no effect (on the original.)
       * 
       * @return
       */
      // public Map<String, String> getPropertyMap();
      /**
       * Get the property of this context.
       */
      String getProperty(String key);
    
      /**
       * Set a property of this context.
       */
      void putProperty(String key, String value);
    
      
      /**
       * Get a copy of the property map
       * @return
       * @since 0.9.20
       */
      Map<String, String> getCopyOfPropertyMap();
      
      /**
       * Contexts are named objects.
       * 
       * @return the name for this context
       */
      String getName();
    
      /**
       * The name of the context can be set only once.
       * 
       * @param name
       */
      void setName(String name);
      
      /**
       * The time at which this context was created, expressed in
       * millisecond elapsed since the epoch (1.1.1970).
       * 
       * @return The time as measured when this class was created.
       */
      long getBirthTime();
      
      /**
       * Object used for synchronization purposes. 
       * INTENDED FOR INTERNAL USAGE.
       */
      Object getConfigurationLock();
    
    
      /**
       * Every context has an ExecutorService which be invoked to execute certain
       * tasks in a separate thread.
       *
       * @return the executor for this context.
       * @since 1.0.0
       */
      ExecutorService getExecutorService();
      
      /**
       * Register a component that participates in the context's life cycle.
       * <p>
       * All components registered via this method will be stopped and removed
       * from the context when the context is reset.
       * 
       * @param component the subject component
       */
      void register(LifeCycle component);
      
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/OutputStreamAppender.java�������������0000644�0001750�0001750�00000014761�12136042271�030673� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core;
    
    import static ch.qos.logback.core.CoreConstants.CODES_URL;
    
    import java.io.IOException;
    import java.io.OutputStream;
    
    import ch.qos.logback.core.encoder.Encoder;
    import ch.qos.logback.core.encoder.LayoutWrappingEncoder;
    import ch.qos.logback.core.spi.LogbackLock;
    import ch.qos.logback.core.spi.DeferredProcessingAware;
    import ch.qos.logback.core.status.ErrorStatus;
    
    /**
     * OutputStreamAppender appends events to a {@link OutputStream}. This class
     * provides basic services that other appenders build upon.
     * 
     * For more information about this appender, please refer to the online manual
     * at http://logback.qos.ch/manual/appenders.html#OutputStreamAppender
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public class OutputStreamAppender<E> extends UnsynchronizedAppenderBase<E> {
    
      
      /**
       * It is the encoder which is ultimately responsible for writing the event to
       * an {@link OutputStream}.
       */
      protected Encoder<E> encoder;
    
      /**
       * All synchronization in this class is done via the lock object.
       */
      protected LogbackLock lock = new LogbackLock();
    
      /**
       * This is the {@link OutputStream outputStream} where output will be written.
       */
      private OutputStream outputStream;
    
      /**
       * The underlying output stream used by this appender.
       * 
       * @return
       */
      public OutputStream getOutputStream() {
        return outputStream;
      }
    
      /**
       * Checks that requires parameters are set and if everything is in order,
       * activates this appender.
       */
      public void start() {
        int errors = 0;
        if (this.encoder == null) {
          addStatus(new ErrorStatus("No encoder set for the appender named \""
              + name + "\".", this));
          errors++;
        }
    
        if (this.outputStream == null) {
          addStatus(new ErrorStatus(
              "No output stream set for the appender named \"" + name + "\".", this));
          errors++;
        }
        // only error free appenders should be activated
        if (errors == 0) {
          super.start();
        }
      }
    
      public void setLayout(Layout<E> layout) {
        addWarn("This appender no longer admits a layout as a sub-component, set an encoder instead.");
        addWarn("To ensure compatibility, wrapping your layout in LayoutWrappingEncoder.");
        addWarn("See also "+CODES_URL+"#layoutInsteadOfEncoder for details");
        LayoutWrappingEncoder<E> lwe = new LayoutWrappingEncoder<E>();
        lwe.setLayout(layout);
        lwe.setContext(context);
        this.encoder = lwe;
      }
    
      @Override
      protected void append(E eventObject) {
        if (!isStarted()) {
          return;
        }
    
        subAppend(eventObject);
      }
    
      /**
       * Stop this appender instance. The underlying stream or writer is also
       * closed.
       * 
       * <p>
       * Stopped appenders cannot be reused.
       */
      public void stop() {
        synchronized (lock) {
          closeOutputStream();
          super.stop();
        }
      }
    
      /**
       * Close the underlying {@link OutputStream}.
       */
      protected void closeOutputStream() {
        if (this.outputStream != null) {
          try {
            // before closing we have to output out layout's footer
            encoderClose();
            this.outputStream.close();
            this.outputStream = null;
          } catch (IOException e) {
            addStatus(new ErrorStatus(
                "Could not close output stream for OutputStreamAppender.", this, e));
          }
        }
      }
    
      void encoderInit() {
        if (encoder != null && this.outputStream != null) {
          try {
            encoder.init(outputStream);
          } catch (IOException ioe) {
            this.started = false;
            addStatus(new ErrorStatus(
                "Failed to initialize encoder for appender named [" + name + "].",
                this, ioe));
          }
        }
      }
    
      void encoderClose() {
        if (encoder != null && this.outputStream != null) {
          try {
            encoder.close();
          } catch (IOException ioe) {
            this.started = false;
            addStatus(new ErrorStatus("Failed to write footer for appender named ["
                + name + "].", this, ioe));
          }
        }
      }
    
      /**
       * <p>
       * Sets the @link OutputStream} where the log output will go. The specified
       * <code>OutputStream</code> must be opened by the user and be writable. The
       * <code>OutputStream</code> will be closed when the appender instance is
       * closed.
       * 
       * @param outputStream
       *          An already opened OutputStream.
       */
      public void setOutputStream(OutputStream outputStream) {
        synchronized (lock) {
          // close any previously opened output stream
          closeOutputStream();
    
          this.outputStream = outputStream;
          if (encoder == null) {
            addWarn("Encoder has not been set. Cannot invoke its init method.");
            return;
          }
    
          encoderInit();
        }
      }
    
      protected void writeOut(E event) throws IOException {
        this.encoder.doEncode(event);
      }
    
      /**
       * Actual writing occurs here.
       * <p>
       * Most subclasses of <code>WriterAppender</code> will need to override this
       * method.
       * 
       * @since 0.9.0
       */
      protected void subAppend(E event) {
        if (!isStarted()) {
          return;
        }
        try {
          // this step avoids LBCLASSIC-139
          if (event instanceof DeferredProcessingAware) {
            ((DeferredProcessingAware) event).prepareForDeferredProcessing();
          }
          // the synchronization prevents the OutputStream from being closed while we
          // are writing. It also prevents multiple threads from entering the same
          // converter. Converters assume that they are in a synchronized block.
          synchronized (lock) {
            writeOut(event);
          }
        } catch (IOException ioe) {
          // as soon as an exception occurs, move to non-started state
          // and add a single ErrorStatus to the SM.
          this.started = false;
          addStatus(new ErrorStatus("IO failure in appender", this, ioe));
        }
      }
    
      public Encoder<E> getEncoder() {
        return encoder;
      }
    
      public void setEncoder(Encoder<E> encoder) {
        this.encoder = encoder;
      }
      
    }
    ���������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/CoreConstants.java��������������������0000644�0001750�0001750�00000013736�12143151241�027322� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core;
    
    import ch.qos.logback.core.util.EnvUtil;
    
    public class CoreConstants {
    
      /**
       * Number of idle threads to retain in a context's executor service.
       */
      // CORE_POOL_SIZE must be 1 for JDK 1.5. For JDK 1.6 or higher it's set to 0
      // so that there are no idle threads
      public static final int CORE_POOL_SIZE = EnvUtil.isJDK5() ? 1 : 0;
    
      /**
       * Maximum number of threads to allow in a context's executor service.
       */
      // if you need a different MAX_POOL_SIZE, please file create a jira issue
      // asking to make MAX_POOL_SIZE a parameter.
      public static final int MAX_POOL_SIZE = 32;
    
      // Note that the line.separator property can be looked up even by
      // applets.
      public static final String LINE_SEPARATOR = System.getProperty("line.separator");
      public static final int LINE_SEPARATOR_LEN = LINE_SEPARATOR.length();
    
    
      public static final String CODES_URL = "http://logback.qos.ch/codes.html";
    
      /**
       * The default context name.
       */
      public static final String DEFAULT_CONTEXT_NAME = "default";
      /**
       * Customized pattern conversion rules are stored under this key in the
       * {@link Context} object store.
       */
      public static final String PATTERN_RULE_REGISTRY = "PATTERN_RULE_REGISTRY";
    
      public static final String ISO8601_STR = "ISO8601";
      public static final String ISO8601_PATTERN = "yyyy-MM-dd HH:mm:ss,SSS";
      public static final String DAILY_DATE_PATTERN = "yyyy-MM-dd";
    
      /**
       * Time format used in Common Log Format
       */
      public static final String CLF_DATE_PATTERN = "dd/MM/yyyy:HH:mm:ss Z";
    
      /**
       * The key used in locating the evaluator map in context's object map.
       */
      public static final String EVALUATOR_MAP = "EVALUATOR_MAP";
    
      /**
       * By convention, we assume that the static method named "valueOf" taking
       * a string argument can restore a given object from its string
       * representation.
       */
      public static final String VALUE_OF = "valueOf";
    
      /**
       * An empty string.
       */
      public static final String EMPTY_STRING = "";
    
      /**
       * An empty string array.
       */
      public static final String[] EMPTY_STRING_ARRAY = new String[]{};
    
      /**
       * An empty Class array.
       */
      public static final Class<?>[] EMPTY_CLASS_ARRAY = new Class[]{};
      public static final String CAUSED_BY = "Caused by: ";
      public static final String SUPPRESSED = "\tSuppressed: ";
      public static final String WRAPPED_BY = "Wrapped by: ";
    
      public static final char PERCENT_CHAR = '%';
      public static final char LEFT_PARENTHESIS_CHAR = '(';
      public static final char RIGHT_PARENTHESIS_CHAR = ')';
    
      public static final char ESCAPE_CHAR = '\\';
      public static final char CURLY_LEFT = '{';
      public static final char CURLY_RIGHT = '}';
      public static final char COMMA_CHAR = ',';
      public static final char DOUBLE_QUOTE_CHAR = '"';
      public static final char SINGLE_QUOTE_CHAR = '\'';
      public static final char COLON_CHAR = ':';
      public static final char DASH_CHAR = '-';
      public static final String DEFAULT_VALUE_SEPARATOR = ":-";
    
    
      /**
       * Number of rows before in an HTML table before,
       * we close the table and create a new one
       */
      public static final int TABLE_ROW_LIMIT = 10000;
    
    
      // reset the ObjectOutputStream every OOS_RESET_FREQUENCY calls
      // this avoid serious memory leaks
      public static final int OOS_RESET_FREQUENCY = 70;
    
      /**
       * The reference bogo instructions per second on
       * Ceki's machine (Orion)
       */
      public static long REFERENCE_BIPS = 9000;
    
    
      // the max number of times an error should be reported
      public static final int MAX_ERROR_COUNT = 4;
    
    
      public static final char DOT = '.';
      public static final char TAB = '\t';
      public static final char DOLLAR = '$';
    
      public static final String SEE_FNP_NOT_SET = "See also http://logback.qos.ch/codes.html#tbr_fnp_not_set";
    
      public static final String CONFIGURATION_WATCH_LIST = "CONFIGURATION_WATCH_LIST";
      public static final String CONFIGURATION_WATCH_LIST_RESET = "CONFIGURATION_WATCH_LIST_RESET";
    
      public static final String SAFE_JORAN_CONFIGURATION = "SAFE_JORAN_CONFIGURATION";
      public static final String XML_PARSING = "XML_PARSING";
    
    
    
      /**
       * The key under which the local host name is registered in the logger
       * context.
       */
      public static final String HOSTNAME_KEY = "HOSTNAME";
    
      /**
       * The key under which the current context name is registered in the logger
       * context.
       */
      public static final String CONTEXT_NAME_KEY = "CONTEXT_NAME";
    
    
      public static final int BYTES_PER_INT = 4;
      public static final int MILLIS_IN_ONE_SECOND = 1000;
      public static final int MILLIS_IN_ONE_MINUTE = MILLIS_IN_ONE_SECOND*60;
      public static final int MILLIS_IN_ONE_HOUR = MILLIS_IN_ONE_MINUTE*60;
      public static final int MILLIS_IN_ONE_DAY = MILLIS_IN_ONE_HOUR*24;
      public static final int MILLIS_IN_ONE_WEEK = MILLIS_IN_ONE_DAY*7;
    
      /**
       * The number of seconds to wait for compression jobs to finish.
       */
      public static final int SECONDS_TO_WAIT_FOR_COMPRESSION_JOBS = 30;
    
      public static final String CONTEXT_SCOPE_VALUE = "context";
    
      public static final String RESET_MSG_PREFIX = "Will reset and reconfigure context ";
    
    
      public static final String JNDI_COMP_PREFIX = "java:comp/env";
    
      public static final String UNDEFINED_PROPERTY_SUFFIX = "_IS_UNDEFINED";
    
      public static final String LEFT_ACCOLADE = new String(new char[] {CURLY_LEFT});
      public static final String RIGHT_ACCOLADE = new String(new char[] {CURLY_RIGHT});
    }
    ����������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/BasicStatusManager.java���������������0000644�0001750�0001750�00000007130�12136042271�030250� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import ch.qos.logback.core.helpers.CyclicBuffer;
    import ch.qos.logback.core.spi.LogbackLock;
    import ch.qos.logback.core.status.Status;
    import ch.qos.logback.core.status.StatusListener;
    import ch.qos.logback.core.status.StatusManager;
    
    public class BasicStatusManager implements StatusManager {
    
      public static final int MAX_HEADER_COUNT = 150;
      public static final int TAIL_SIZE = 150;
    
      int count = 0;
    
      // protected access was requested in http://jira.qos.ch/browse/LBCORE-36
      final protected List<Status> statusList = new ArrayList<Status>();
      final protected CyclicBuffer<Status> tailBuffer = new CyclicBuffer<Status>(
          TAIL_SIZE);
      final protected LogbackLock statusListLock = new LogbackLock();
    
      int level = Status.INFO;
    
      // protected access was requested in http://jira.qos.ch/browse/LBCORE-36
      final protected List<StatusListener> statusListenerList = new ArrayList<StatusListener>();
      final protected LogbackLock statusListenerListLock = new LogbackLock();
    
      // Note on synchronization
      // This class contains two separate locks statusListLock and
      // statusListenerListLock guarding respectively the statusList+tailBuffer and
      // statusListenerList fields. The locks are used internally
      // without cycles. They are exposed to derived classes which should be careful
      // not to create deadlock cycles.
    
      /**
       * Add a new status object.
       * 
       * @param newStatus
       *                the status message to add
       */
      public void add(Status newStatus) {
        // LBCORE-72: fire event before the count check
        fireStatusAddEvent(newStatus);
    
        count++;
        if (newStatus.getLevel() > level) {
          level = newStatus.getLevel();
        }
    
        synchronized (statusListLock) {
          if (statusList.size() < MAX_HEADER_COUNT) {
            statusList.add(newStatus);
          } else {
            tailBuffer.add(newStatus);
          }
        }
    
      }
    
      public List<Status> getCopyOfStatusList() {
        synchronized (statusListLock) {
          List<Status> tList = new ArrayList<Status>(statusList);
          tList.addAll(tailBuffer.asList());
          return tList;
        }
      }
    
      private void fireStatusAddEvent(Status status) {
        synchronized (statusListenerListLock) {
          for (StatusListener sl : statusListenerList) {
            sl.addStatusEvent(status);
          }
        }
      }
    
      public void clear() {
        synchronized (statusListLock) {
          count = 0;
          statusList.clear();
          tailBuffer.clear();
        }
      }
    
      public int getLevel() {
        return level;
      }
    
      public int getCount() {
        return count;
      }
    
      public void add(StatusListener listener) {
        synchronized (statusListenerListLock) {
          statusListenerList.add(listener);
        }
      }
    
      public void remove(StatusListener listener) {
        synchronized (statusListenerListLock) {
          statusListenerList.remove(listener);
        }
      }
    
      public List<StatusListener> getCopyOfStatusListenerList() {
        synchronized (statusListenerListLock) {
          return new ArrayList<StatusListener>(statusListenerList);
        }
      }
    
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/rolling/������������������������������0000755�0001750�0001750�00000000000�12203357067�025341� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/rolling/package.html������������������0000644�0001750�0001750�00000000773�11377016712�027631� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
    
    <html> 
      <head>
        <title></title>
      </head>
      
      <body>
        
        <p>Implements various file rolling policies.</p>
    
        <p>The {@link ch.qos.logback.core.rolling.RollingFileAppender} class
        serves as the linchpin of this package. Its behaviour is
        controlled by two subcomponents of type {@link
        ch.qos.logback.core.rolling.RollingPolicy} and {@link
        ch.qos.logback.core.rolling.TriggeringPolicy}.
        </p>
    
      </body> 
    </html>�����logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/rolling/FixedWindowRollingPolicy.java�0000644�0001750�0001750�00000014303�12136042272�033135� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling;
    
    import java.io.File;
    import java.util.Date;
    
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.rolling.helper.*;
    
    /**
     * When rolling over, <code>FixedWindowRollingPolicy</code> renames files
     * according to a fixed window algorithm.
     * 
     * For more information about this policy, please refer to the online manual at
     * http://logback.qos.ch/manual/appenders.html#FixedWindowRollingPolicy
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public class FixedWindowRollingPolicy extends RollingPolicyBase {
      static final String FNP_NOT_SET = "The \"FileNamePattern\" property must be set before using FixedWindowRollingPolicy. ";
      static final String PRUDENT_MODE_UNSUPPORTED = "See also http://logback.qos.ch/codes.html#tbr_fnp_prudent_unsupported";
      static final String SEE_PARENT_FN_NOT_SET = "Please refer to http://logback.qos.ch/codes.html#fwrp_parentFileName_not_set";
      int maxIndex;
      int minIndex;
      RenameUtil util = new RenameUtil();
      Compressor compressor;
    
      public static final String ZIP_ENTRY_DATE_PATTERN = "yyyy-MM-dd_HHmm";
    
      /**
       * It's almost always a bad idea to have a large window size, say over 20.
       */
      private static int MAX_WINDOW_SIZE = 20;
    
      public FixedWindowRollingPolicy() {
        minIndex = 1;
        maxIndex = 7;
      }
    
      public void start() {
        util.setContext(this.context);
       
        if (fileNamePatternStr != null) {
          fileNamePattern = new FileNamePattern(fileNamePatternStr, this.context);
          determineCompressionMode();
        } else {
          addError(FNP_NOT_SET);
          addError(CoreConstants.SEE_FNP_NOT_SET);
          throw new IllegalStateException(FNP_NOT_SET + CoreConstants.SEE_FNP_NOT_SET);
        }
    
        if(isParentPrudent()) {
          addError("Prudent mode is not supported with FixedWindowRollingPolicy.");
          addError(PRUDENT_MODE_UNSUPPORTED);
          throw new IllegalStateException("Prudent mode is not supported.");
        }
        
        if (getParentsRawFileProperty() == null) {
          addError("The File name property must be set before using this rolling policy.");
          addError(SEE_PARENT_FN_NOT_SET);
          throw new IllegalStateException("The \"File\" option must be set.");
        }
    
        if (maxIndex < minIndex) {
          addWarn("MaxIndex (" + maxIndex + ") cannot be smaller than MinIndex ("
              + minIndex + ").");
          addWarn("Setting maxIndex to equal minIndex.");
          maxIndex = minIndex;
        }
    
        final int maxWindowSize = getMaxWindowSize();
        if ((maxIndex - minIndex) > maxWindowSize) {
          addWarn("Large window sizes are not allowed.");
          maxIndex = minIndex + maxWindowSize;
          addWarn("MaxIndex reduced to " + maxIndex);
        }
    
        IntegerTokenConverter itc = fileNamePattern.getIntegerTokenConverter();
    
        if (itc == null) {
          throw new IllegalStateException("FileNamePattern ["
              + fileNamePattern.getPattern()
              + "] does not contain a valid IntegerToken");
        }
    
        if(compressionMode == CompressionMode.ZIP) {
          String zipEntryFileNamePatternStr = transformFileNamePatternFromInt2Date(fileNamePatternStr);
          zipEntryFileNamePattern = new FileNamePattern(zipEntryFileNamePatternStr, context);
        }
        compressor = new Compressor(compressionMode);
        compressor.setContext(this.context);
        super.start();
      }
    
      /**
       * Subclasses can override this method to increase the max window size, if required.  This is to
       * address LOGBACK-266.
       * @return
       */
      protected int getMaxWindowSize() {
        return MAX_WINDOW_SIZE;
      }
    
      private String transformFileNamePatternFromInt2Date(String fileNamePatternStr) {
        String slashified = FileFilterUtil.slashify(fileNamePatternStr);
        String stemOfFileNamePattern = FileFilterUtil.afterLastSlash(slashified);
        return stemOfFileNamePattern.replace("%i", "%d{"+ZIP_ENTRY_DATE_PATTERN+"}");
      }
    
      public void rollover() throws RolloverFailure {
    
        // Inside this method it is guaranteed that the hereto active log file is
        // closed.
        // If maxIndex <= 0, then there is no file renaming to be done.
        if (maxIndex >= 0) {
          // Delete the oldest file, to keep Windows happy.
          File file = new File(fileNamePattern.convertInt(maxIndex));
    
          if (file.exists()) {
            file.delete();
          }
    
          // Map {(maxIndex - 1), ..., minIndex} to {maxIndex, ..., minIndex+1}
          for (int i = maxIndex - 1; i >= minIndex; i--) {
            String toRenameStr = fileNamePattern.convertInt(i);
            File toRename = new File(toRenameStr);
            // no point in trying to rename an inexistent file
            if (toRename.exists()) {
              util.rename(toRenameStr, fileNamePattern.convertInt(i + 1));
            } else {
              addInfo("Skipping roll-over for inexistent file " + toRenameStr);
            }
          }
    
          // move active file name to min
          switch (compressionMode) {
          case NONE:
            util.rename(getActiveFileName(), fileNamePattern
                .convertInt(minIndex));
            break;
          case GZ:
            compressor.compress(getActiveFileName(), fileNamePattern.convertInt(minIndex), null);
            break;
          case ZIP:
            compressor.compress(getActiveFileName(), fileNamePattern.convertInt(minIndex), zipEntryFileNamePattern.convert(new Date()));
            break;
          }
        }
      }
    
      /**
       * Return the value of the parent's RawFile property.
       */
      public String getActiveFileName() {
        return getParentsRawFileProperty();
      }
    
      public int getMaxIndex() {
        return maxIndex;
      }
    
      public int getMinIndex() {
        return minIndex;
      }
    
      public void setMaxIndex(int maxIndex) {
        this.maxIndex = maxIndex;
      }
    
      public void setMinIndex(int minIndex) {
        this.minIndex = minIndex;
      }
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/rolling/SizeAndTimeBasedFNATP.java����0000644�0001750�0001750�00000011066�12136042272�032106� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling;
    
    import java.io.File;
    import java.util.Date;
    
    import ch.qos.logback.core.joran.spi.NoAutoStart;
    import ch.qos.logback.core.rolling.helper.CompressionMode;
    import ch.qos.logback.core.rolling.helper.FileFilterUtil;
    import ch.qos.logback.core.rolling.helper.SizeAndTimeBasedArchiveRemover;
    import ch.qos.logback.core.util.FileSize;
    
    @NoAutoStart
    public class SizeAndTimeBasedFNATP<E> extends
            TimeBasedFileNamingAndTriggeringPolicyBase<E> {
    
      int currentPeriodsCounter = 0;
      FileSize maxFileSize;
      String maxFileSizeAsString;
    
      @Override
      public void start() {
        // we depend on certain fields having been initialized
        // in super.start()
        super.start();
    
        archiveRemover = new SizeAndTimeBasedArchiveRemover(tbrp.fileNamePattern, rc);
        archiveRemover.setContext(context);
    
        // we need to get the correct value of currentPeriodsCounter.
        // usually the value is 0, unless the appender or the application
        // is stopped and restarted within the same period
        String regex = tbrp.fileNamePattern.toRegexForFixedDate(dateInCurrentPeriod);
        String stemRegex = FileFilterUtil.afterLastSlash(regex);
    
    
        computeCurrentPeriodsHighestCounterValue(stemRegex);
    
        started = true;
      }
    
      void computeCurrentPeriodsHighestCounterValue(final String stemRegex) {
        File file = new File(getCurrentPeriodsFileNameWithoutCompressionSuffix());
        File parentDir = file.getParentFile();
    
        File[] matchingFileArray = FileFilterUtil
                .filesInFolderMatchingStemRegex(parentDir, stemRegex);
    
        if (matchingFileArray == null || matchingFileArray.length == 0) {
          currentPeriodsCounter = 0;
          return;
        }
        currentPeriodsCounter = FileFilterUtil.findHighestCounter(matchingFileArray, stemRegex);
    
        // if parent raw file property is not null, then the next
        // counter is max  found counter+1
        if (tbrp.getParentsRawFileProperty() != null || (tbrp.compressionMode != CompressionMode.NONE)) {
          // TODO test me
          currentPeriodsCounter++;
        }
      }
    
      // IMPORTANT: This field can be updated by multiple threads. It follows that
      // its values may *not* be incremented sequentially. However, we don't care
      // about the actual value of the field except that from time to time the
      // expression (invocationCounter++ & invocationMask) == invocationMask) should be true.
      private int invocationCounter;
      private int invocationMask = 0x1;
    
      public boolean isTriggeringEvent(File activeFile, final E event) {
    
        long time = getCurrentTime();
        if (time >= nextCheck) {
          Date dateInElapsedPeriod = dateInCurrentPeriod;
          elapsedPeriodsFileName = tbrp.fileNamePatternWCS
                  .convertMultipleArguments(dateInElapsedPeriod, currentPeriodsCounter);
          currentPeriodsCounter = 0;
          setDateInCurrentPeriod(time);
          computeNextCheck();
          return true;
        }
    
        // for performance reasons, check for changes every 16,invocationMask invocations
        if (((++invocationCounter) & invocationMask) != invocationMask) {
          return false;
        }
        if (invocationMask < 0x0F) {
          invocationMask = (invocationMask << 1) + 1;
        }
    
        if (activeFile.length() >= maxFileSize.getSize()) {
          elapsedPeriodsFileName = tbrp.fileNamePatternWCS
                  .convertMultipleArguments(dateInCurrentPeriod, currentPeriodsCounter);
          currentPeriodsCounter++;
          return true;
        }
    
        return false;
      }
    
      private String getFileNameIncludingCompressionSuffix(Date date, int counter) {
        return tbrp.fileNamePattern.convertMultipleArguments(
                dateInCurrentPeriod, counter);
      }
    
    
      @Override
      public String getCurrentPeriodsFileNameWithoutCompressionSuffix() {
        return tbrp.fileNamePatternWCS.convertMultipleArguments(
                dateInCurrentPeriod, currentPeriodsCounter);
      }
    
      public String getMaxFileSize() {
        return maxFileSizeAsString;
      }
    
      public void setMaxFileSize(String maxFileSize) {
        this.maxFileSizeAsString = maxFileSize;
        this.maxFileSize = FileSize.valueOf(maxFileSize);
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/rolling/SizeBasedTriggeringPolicy.java0000644�0001750�0001750�00000006126�12136042272�033256� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling;
    
    import java.io.File;
    
    import ch.qos.logback.core.util.FileSize;
    import ch.qos.logback.core.util.InvocationGate;
    
    /**
     * SizeBasedTriggeringPolicy looks at size of the file being currently written
     * to. If it grows bigger than the specified size, the FileAppender using the
     * SizeBasedTriggeringPolicy rolls the file and creates a new one.
     * 
     * For more information about this policy, please refer to the online manual at
     * http://logback.qos.ch/manual/appenders.html#SizeBasedTriggeringPolicy
     * 
     * @author Ceki G&uuml;lc&uuml;
     * 
     */
    public class SizeBasedTriggeringPolicy<E> extends TriggeringPolicyBase<E> {
    
      public static final String SEE_SIZE_FORMAT = "http://logback.qos.ch/codes.html#sbtp_size_format";
      /**
       * The default maximum file size.
       */
      public static final long DEFAULT_MAX_FILE_SIZE = 10 * 1024 * 1024; // 10 MB
    
      String maxFileSizeAsString = Long.toString(DEFAULT_MAX_FILE_SIZE);
      FileSize maxFileSize;
    
      public SizeBasedTriggeringPolicy() {
      }
    
      public SizeBasedTriggeringPolicy(final String maxFileSize) {
        setMaxFileSize(maxFileSize);
      }
    
      private InvocationGate invocationGate = new InvocationGate();
    
      public boolean isTriggeringEvent(final File activeFile, final E event) {
      if(invocationGate.skipFurtherWork())
          return false;
    
        long now = System.currentTimeMillis();
        invocationGate.updateMaskIfNecessary(now);
    
        return (activeFile.length() >= maxFileSize.getSize());
      }
    
      public String getMaxFileSize() {
        return maxFileSizeAsString;
      }
    
      public void setMaxFileSize(String maxFileSize) {
        this.maxFileSizeAsString = maxFileSize;
        this.maxFileSize = FileSize.valueOf(maxFileSize);
      }
    
      long toFileSize(String value) {
        if (value == null)
          return DEFAULT_MAX_FILE_SIZE;
    
        String s = value.trim().toUpperCase();
        long multiplier = 1;
        int index;
    
        if ((index = s.indexOf("KB")) != -1) {
          multiplier = 1024;
          s = s.substring(0, index);
        } else if ((index = s.indexOf("MB")) != -1) {
          multiplier = 1024 * 1024;
          s = s.substring(0, index);
        } else if ((index = s.indexOf("GB")) != -1) {
          multiplier = 1024 * 1024 * 1024;
          s = s.substring(0, index);
        }
        if (s != null) {
          try {
            return Long.valueOf(s).longValue() * multiplier;
          } catch (NumberFormatException e) {
            addError("[" + s + "] is not in proper int format. Please refer to "
                + SEE_SIZE_FORMAT);
            addError("[" + value + "] not in expected format.", e);
          }
        }
        return DEFAULT_MAX_FILE_SIZE;
      }
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/rolling/TriggeringPolicy.java���������0000644�0001750�0001750�00000002323�12136042272�031457� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling;
    
    import java.io.File;
    
    import ch.qos.logback.core.spi.LifeCycle;
    
    
    /**
     * A <code>TriggeringPolicy</code> controls the conditions under which roll-over
     * occurs. Such conditions include time of day, file size, an 
     * external event, the log request or a combination thereof.
     *
     * @author Ceki G&uuml;lc&uuml;
     * */
    
    public interface TriggeringPolicy<E> extends LifeCycle {
      
      /**
       * Should roll-over be triggered at this time?
       * 
       * @param activeFile A reference to the currently active log file. 
       * @param event A reference to the currently event. 
       * @return true if a roll-over should occur.
       */
      boolean isTriggeringEvent(final File activeFile, final E event);
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/rolling/RollingPolicy.java������������0000644�0001750�0001750�00000004047�12136042272�030771� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling;
    
    import ch.qos.logback.core.FileAppender;
    import ch.qos.logback.core.rolling.helper.CompressionMode;
    import ch.qos.logback.core.spi.LifeCycle;
    
    /**
     * A <code>RollingPolicy</code> is responsible for performing the rolling over
     * of the active log file. The <code>RollingPolicy</code> is also responsible
     * for providing the <em>active log file</em>, that is the live file where
     * logging output will be directed.
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public interface RollingPolicy extends LifeCycle {
    
      /**
       * Rolls over log files according to implementation policy.
       * 
       * <p>This method is invoked by {@link RollingFileAppender}, usually at the
       * behest of its {@link TriggeringPolicy}.
       * 
       * @throws RolloverFailure
       *                 Thrown if the rollover operation fails for any reason.
       */
      void rollover() throws RolloverFailure;
    
      /**
       * Get the name of the active log file.
       * 
       * <p>With implementations such as {@link TimeBasedRollingPolicy}, this
       * method returns a new file name, where the actual output will be sent.
       * 
       * <p>On other implementations, this method might return the FileAppender's
       * file property.
       */
      String getActiveFileName();
    
      /**
       * The compression mode for this policy.
       * 
       * @return
       */
      CompressionMode getCompressionMode();
      
      /**
       * This method allows RollingPolicy implementations to be aware of their
       * containing appender.
       * 
       * @param appender
       */
    
      void setParent(FileAppender appender);
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000171�00000000000�011564� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/rolling/DefaultTimeBasedFileNamingAndTriggeringPolicy.java��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/rolling/DefaultTimeBasedFileNamingAndT0000644�0001750�0001750�00000003162�12136042272�033123� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling;
    
    import java.io.File;
    import java.util.Date;
    
    import ch.qos.logback.core.rolling.helper.TimeBasedArchiveRemover;
    
    /**
     * 
     * @author Ceki G&uuml;lc&uuml;
     * 
     * @param <E>
     */
    public class DefaultTimeBasedFileNamingAndTriggeringPolicy<E> extends
        TimeBasedFileNamingAndTriggeringPolicyBase<E> {
    
      @Override
      public void start() {
        super.start();
        archiveRemover = new TimeBasedArchiveRemover(tbrp.fileNamePattern, rc);
        archiveRemover.setContext(context);
        started = true;
      }
    
      public boolean isTriggeringEvent(File activeFile, final E event) {
        long time = getCurrentTime();
        if (time >= nextCheck) {
          Date dateOfElapsedPeriod = dateInCurrentPeriod;
          addInfo("Elapsed period: "+dateOfElapsedPeriod);
          elapsedPeriodsFileName = tbrp.fileNamePatternWCS
              .convert(dateOfElapsedPeriod);
          setDateInCurrentPeriod(time);
          computeNextCheck();
          return true;
        } else {
          return false;
        }
      }
    
      @Override
      public String toString() {
        return "c.q.l.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy";
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/rolling/TriggeringPolicyBase.java�����0000644�0001750�0001750�00000002000�12136042272�032242� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling;
    
    import ch.qos.logback.core.spi.ContextAwareBase;
    
    
    /**
     * SizeBasedTriggeringPolicy looks at size of the file being
     * currently written to.
     * 
     * @author Ceki G&uuml;lc&uuml;
     *
     */
    abstract public class TriggeringPolicyBase<E> extends ContextAwareBase implements TriggeringPolicy<E> {
      
      private boolean start;
    
      public void start() {
        start = true;
      }
    
      public void stop() {
        start = false;
      }
    
      public boolean isStarted() {
        return start;
      }
    
    
    
    }
    logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/rolling/TimeBasedRollingPolicy.java���0000644�0001750�0001750�00000022324�12136042272�032545� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling;
    
    import java.io.File;
    import java.util.Date;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.Future;
    import java.util.concurrent.TimeUnit;
    import java.util.concurrent.TimeoutException;
    
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.rolling.helper.*;
    
    /**
     * <code>TimeBasedRollingPolicy</code> is both easy to configure and quite
     * powerful. It allows the roll over to be made based on time. It is possible to
     * specify that the roll over occur once per day, per week or per month.
     * 
     * <p>For more information, please refer to the online manual at
     * http://logback.qos.ch/manual/appenders.html#TimeBasedRollingPolicy
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public class TimeBasedRollingPolicy<E> extends RollingPolicyBase implements
        TriggeringPolicy<E> {
      static final String FNP_NOT_SET = "The FileNamePattern option must be set before using TimeBasedRollingPolicy. ";
      static final int INFINITE_HISTORY = 0;
    
      // WCS: without compression suffix
      FileNamePattern fileNamePatternWCS;
    
      private Compressor compressor;
      private RenameUtil renameUtil = new RenameUtil();
      Future<?> future;
    
      private int maxHistory = INFINITE_HISTORY;
      private ArchiveRemover archiveRemover;
    
      TimeBasedFileNamingAndTriggeringPolicy<E> timeBasedFileNamingAndTriggeringPolicy;
    
      boolean cleanHistoryOnStart = false;
    
      public void start() {
        // set the LR for our utility object
        renameUtil.setContext(this.context);
    
        // find out period from the filename pattern
        if (fileNamePatternStr != null) {
          fileNamePattern = new FileNamePattern(fileNamePatternStr, this.context);
          determineCompressionMode();
        } else {
          addWarn(FNP_NOT_SET);
          addWarn(CoreConstants.SEE_FNP_NOT_SET);
          throw new IllegalStateException(FNP_NOT_SET
              + CoreConstants.SEE_FNP_NOT_SET);
        }
    
        compressor = new Compressor(compressionMode);
        compressor.setContext(context);
    
        // wcs : without compression suffix
        fileNamePatternWCS = new FileNamePattern(Compressor.computeFileNameStr_WCS(
                fileNamePatternStr, compressionMode), this.context);
    
        addInfo("Will use the pattern " + fileNamePatternWCS
            + " for the active file");
    
         if(compressionMode == CompressionMode.ZIP) {
          String zipEntryFileNamePatternStr = transformFileNamePattern2ZipEntry(fileNamePatternStr);
          zipEntryFileNamePattern = new FileNamePattern(zipEntryFileNamePatternStr, context);
        }
    
        if (timeBasedFileNamingAndTriggeringPolicy == null) {
          timeBasedFileNamingAndTriggeringPolicy = new DefaultTimeBasedFileNamingAndTriggeringPolicy<E>();
        }
        timeBasedFileNamingAndTriggeringPolicy.setContext(context);
        timeBasedFileNamingAndTriggeringPolicy.setTimeBasedRollingPolicy(this);
        timeBasedFileNamingAndTriggeringPolicy.start();
    
        // the maxHistory property is given to TimeBasedRollingPolicy instead of to
        // the TimeBasedFileNamingAndTriggeringPolicy. This makes it more convenient
        // for the user at the cost of inconsistency here.
        if (maxHistory != INFINITE_HISTORY) {
          archiveRemover = timeBasedFileNamingAndTriggeringPolicy.getArchiveRemover();
          archiveRemover.setMaxHistory(maxHistory);
          if(cleanHistoryOnStart) {
            addInfo("Cleaning on start up");
            archiveRemover.clean(new Date(timeBasedFileNamingAndTriggeringPolicy.getCurrentTime()));
          }
        }
    
        super.start();
      }
    
      @Override
      public void stop() {
        if(!isStarted())
          return;
        waitForAsynchronousJobToStop();
        super.stop();
      }
    
    
      private void waitForAsynchronousJobToStop() {
        if(1==1) return;
        if(future != null) {
          try {
            future.get(CoreConstants.SECONDS_TO_WAIT_FOR_COMPRESSION_JOBS, TimeUnit.SECONDS);
          } catch (TimeoutException e) {
            addError("Timeout while waiting for compression job to finish", e);
          } catch (Exception e) {
            addError("Unexpected exception while waiting for compression job to finish", e);
          }
        }
      }
      private String transformFileNamePattern2ZipEntry(String fileNamePatternStr) {
        String slashified = FileFilterUtil.slashify(fileNamePatternStr);
        return FileFilterUtil.afterLastSlash(slashified);
      }
    
      public void setTimeBasedFileNamingAndTriggeringPolicy(
          TimeBasedFileNamingAndTriggeringPolicy<E> timeBasedTriggering) {
        this.timeBasedFileNamingAndTriggeringPolicy = timeBasedTriggering;
      }
    
      public TimeBasedFileNamingAndTriggeringPolicy<E> getTimeBasedFileNamingAndTriggeringPolicy() {
        return timeBasedFileNamingAndTriggeringPolicy;
      }
    
      public void rollover() throws RolloverFailure {
    
        // when rollover is called the elapsed period's file has
        // been already closed. This is a working assumption of this method.
    
        String elapsedPeriodsFileName = timeBasedFileNamingAndTriggeringPolicy
            .getElapsedPeriodsFileName();
    
        String elapsedPeriodStem = FileFilterUtil.afterLastSlash(elapsedPeriodsFileName);
    
        if (compressionMode == CompressionMode.NONE) {
          if (getParentsRawFileProperty() != null) {
            renameUtil.rename(getParentsRawFileProperty(), elapsedPeriodsFileName);
          } // else { nothing to do if CompressionMode == NONE and parentsRawFileProperty == null }
        } else {
          if (getParentsRawFileProperty() == null) {
            future = asyncCompress(elapsedPeriodsFileName, elapsedPeriodsFileName, elapsedPeriodStem);
          } else {
            future = renamedRawAndAsyncCompress(elapsedPeriodsFileName, elapsedPeriodStem);
          }
        }
    
        if (archiveRemover != null) {
          archiveRemover.clean(new Date(timeBasedFileNamingAndTriggeringPolicy.getCurrentTime()));
        }
      }
    
      Future asyncCompress(String nameOfFile2Compress, String nameOfCompressedFile, String innerEntryName)
          throws RolloverFailure {
        AsynchronousCompressor ac = new AsynchronousCompressor(compressor);
        return ac.compressAsynchronously(nameOfFile2Compress, nameOfCompressedFile, innerEntryName);
      }
    
      Future renamedRawAndAsyncCompress(String nameOfCompressedFile, String innerEntryName)
          throws RolloverFailure {
        String parentsRawFile = getParentsRawFileProperty();
        String tmpTarget = parentsRawFile + System.nanoTime() + ".tmp";
        renameUtil.rename(parentsRawFile, tmpTarget);
        return asyncCompress(tmpTarget, nameOfCompressedFile, innerEntryName);
      }
    
      /**
       * 
       * The active log file is determined by the value of the parent's filename
       * option. However, in case the file name is left blank, then, the active log
       * file equals the file name for the current period as computed by the
       * <b>FileNamePattern</b> option.
       * 
       * <p>The RollingPolicy must know whether it is responsible for changing the
       * name of the active file or not. If the active file name is set by the user
       * via the configuration file, then the RollingPolicy must let it like it is.
       * If the user does not specify an active file name, then the RollingPolicy
       * generates one.
       * 
       * <p> To be sure that the file name used by the parent class has been
       * generated by the RollingPolicy and not specified by the user, we keep track
       * of the last generated name object and compare its reference to the parent
       * file name. If they match, then the RollingPolicy knows it's responsible for
       * the change of the file name.
       * 
       */
      public String getActiveFileName() {
        String parentsRawFileProperty = getParentsRawFileProperty();
        if (parentsRawFileProperty != null) {
          return parentsRawFileProperty;
        } else {
          return timeBasedFileNamingAndTriggeringPolicy
              .getCurrentPeriodsFileNameWithoutCompressionSuffix();
        }
      }
    
      public boolean isTriggeringEvent(File activeFile, final E event) {
        return timeBasedFileNamingAndTriggeringPolicy.isTriggeringEvent(activeFile, event);
      }
    
      /**
       * Get the number of archive files to keep.
       * 
       * @return number of archive files to keep
       */
      public int getMaxHistory() {
        return maxHistory;
      }
    
      /**
       * Set the maximum number of archive files to keep.
       * 
       * @param maxHistory
       *                number of archive files to keep
       */
      public void setMaxHistory(int maxHistory) {
        this.maxHistory = maxHistory;
      }
    
    
      public boolean isCleanHistoryOnStart() {
        return cleanHistoryOnStart;
      }
    
      /**
       * Should archive removal be attempted on application start up? Default is false.
       * @since 1.0.1
       * @param cleanHistoryOnStart
       */
      public void setCleanHistoryOnStart(boolean cleanHistoryOnStart) {
        this.cleanHistoryOnStart = cleanHistoryOnStart;
      }
    
    
      @Override
      public String toString() {
        return "c.q.l.core.rolling.TimeBasedRollingPolicy";
      }
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/rolling/RollingFileAppender.java������0000644�0001750�0001750�00000015371�12136042272�032072� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling;
    
    import ch.qos.logback.core.FileAppender;
    import ch.qos.logback.core.rolling.helper.CompressionMode;
    import ch.qos.logback.core.rolling.helper.FileNamePattern;
    
    import java.io.File;
    import java.io.IOException;
    
    import static ch.qos.logback.core.CoreConstants.CODES_URL;
    
    /**
     * <code>RollingFileAppender</code> extends {@link FileAppender} to backup the
     * log files depending on {@link RollingPolicy} and {@link TriggeringPolicy}.
     * <p/>
     * <p/>
     * For more information about this appender, please refer to the online manual
     * at http://logback.qos.ch/manual/appenders.html#RollingFileAppender
     *
     * @author Heinz Richter
     * @author Ceki G&uuml;lc&uuml;
     */
    public class RollingFileAppender<E> extends FileAppender<E> {
      File currentlyActiveFile;
      TriggeringPolicy<E> triggeringPolicy;
      RollingPolicy rollingPolicy;
    
      static private String RFA_NO_TP_URL = CODES_URL + "#rfa_no_tp";
      static private String RFA_NO_RP_URL = CODES_URL + "#rfa_no_rp";
      static private String COLLISION_URL = CODES_URL + "#rfa_collision";
    
      public void start() {
        if (triggeringPolicy == null) {
          addWarn("No TriggeringPolicy was set for the RollingFileAppender named "
                  + getName());
          addWarn("For more information, please visit " + RFA_NO_TP_URL);
          return;
        }
    
        // we don't want to void existing log files
        if (!append) {
          addWarn("Append mode is mandatory for RollingFileAppender");
          append = true;
        }
    
        if (rollingPolicy == null) {
          addError("No RollingPolicy was set for the RollingFileAppender named "
                  + getName());
          addError("For more information, please visit " + RFA_NO_RP_URL);
          return;
        }
    
        // sanity check for http://jira.qos.ch/browse/LOGBACK-796
        if (fileAndPatternCollide()) {
          addError("File property collides with fileNamePattern. Aborting.");
          addError("For more information, please visit " + COLLISION_URL);
          return;
        }
    
        if (isPrudent()) {
          if (rawFileProperty() != null) {
            addWarn("Setting \"File\" property to null on account of prudent mode");
            setFile(null);
          }
          if (rollingPolicy.getCompressionMode() != CompressionMode.NONE) {
            addError("Compression is not supported in prudent mode. Aborting");
            return;
          }
        }
    
        currentlyActiveFile = new File(getFile());
        addInfo("Active log file name: " + getFile());
        super.start();
      }
    
      private boolean fileAndPatternCollide() {
        if (triggeringPolicy instanceof RollingPolicyBase) {
          final RollingPolicyBase base = (RollingPolicyBase) triggeringPolicy;
          final FileNamePattern fileNamePattern = base.fileNamePattern;
          // no use checking if either fileName or  fileNamePattern are null
          if (fileNamePattern != null && fileName != null) {
            String regex = fileNamePattern.toRegex();
            return fileName.matches(regex);
          }
        }
        return false;
      }
    
      @Override
      public void stop() {
        if (rollingPolicy != null) rollingPolicy.stop();
        if (triggeringPolicy != null) triggeringPolicy.stop();
        super.stop();
      }
    
      @Override
      public void setFile(String file) {
        // http://jira.qos.ch/browse/LBCORE-94
        // allow setting the file name to null if mandated by prudent mode
        if (file != null && ((triggeringPolicy != null) || (rollingPolicy != null))) {
          addError("File property must be set before any triggeringPolicy or rollingPolicy properties");
          addError("Visit " + CODES_URL + "#rfa_file_after for more information");
        }
        super.setFile(file);
      }
    
      @Override
      public String getFile() {
        return rollingPolicy.getActiveFileName();
      }
    
      /**
       * Implemented by delegating most of the rollover work to a rolling policy.
       */
      public void rollover() {
        synchronized (lock) {
          // Note: This method needs to be synchronized because it needs exclusive
          // access while it closes and then re-opens the target file.
          //
          // make sure to close the hereto active log file! Renaming under windows
          // does not work for open files.
          this.closeOutputStream();
    
          try {
            rollingPolicy.rollover();
          } catch (RolloverFailure rf) {
            addWarn("RolloverFailure occurred. Deferring roll-over.");
            // we failed to roll-over, let us not truncate and risk data loss
            this.append = true;
          }
    
          try {
            // update the currentlyActiveFile
            // http://jira.qos.ch/browse/LBCORE-90
            currentlyActiveFile = new File(rollingPolicy.getActiveFileName());
    
            // This will also close the file. This is OK since multiple
            // close operations are safe.
            this.openFile(rollingPolicy.getActiveFileName());
          } catch (IOException e) {
            addError("setFile(" + fileName + ", false) call failed.", e);
          }
        }
      }
    
      /**
       * This method differentiates RollingFileAppender from its super class.
       */
      @Override
      protected void subAppend(E event) {
        // The roll-over check must precede actual writing. This is the
        // only correct behavior for time driven triggers.
    
        // We need to synchronize on triggeringPolicy so that only one rollover
        // occurs at a time
        synchronized (triggeringPolicy) {
          if (triggeringPolicy.isTriggeringEvent(currentlyActiveFile, event)) {
            rollover();
          }
        }
    
        super.subAppend(event);
      }
    
      public RollingPolicy getRollingPolicy() {
        return rollingPolicy;
      }
    
      public TriggeringPolicy<E> getTriggeringPolicy() {
        return triggeringPolicy;
      }
    
      /**
       * Sets the rolling policy. In case the 'policy' argument also implements
       * {@link TriggeringPolicy}, then the triggering policy for this appender is
       * automatically set to be the policy argument.
       *
       * @param policy
       */
      @SuppressWarnings("unchecked")
      public void setRollingPolicy(RollingPolicy policy) {
        rollingPolicy = policy;
        if (rollingPolicy instanceof TriggeringPolicy) {
          triggeringPolicy = (TriggeringPolicy<E>) policy;
        }
    
      }
    
      public void setTriggeringPolicy(TriggeringPolicy<E> policy) {
        triggeringPolicy = policy;
        if (policy instanceof RollingPolicy) {
          rollingPolicy = (RollingPolicy) policy;
        }
      }
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/rolling/RollingPolicyBase.java��������0000644�0001750�0001750�00000005435�12136042272�031566� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling;
    
    import ch.qos.logback.core.FileAppender;
    import ch.qos.logback.core.rolling.helper.CompressionMode;
    import ch.qos.logback.core.rolling.helper.FileNamePattern;
    import ch.qos.logback.core.spi.ContextAwareBase;
    
    /**
     * Implements methods common to most, it not all, rolling policies. Currently
     * such methods are limited to a compression mode getter/setter.
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public abstract class RollingPolicyBase extends ContextAwareBase implements
        RollingPolicy {
      protected CompressionMode compressionMode = CompressionMode.NONE;
    
      FileNamePattern fileNamePattern;
      // fileNamePatternStr is always slashified, see setter
      protected String fileNamePatternStr;
    
      private FileAppender parent;
    
      // use to name files within zip file, i.e. the zipEntry
      FileNamePattern zipEntryFileNamePattern;
      private boolean started;
    
      /**
       * Given the FileNamePattern string, this method determines the compression
       * mode depending on last letters of the fileNamePatternStr. Patterns ending
       * with .gz imply GZIP compression, endings with '.zip' imply ZIP compression.
       * Otherwise and by default, there is no compression.
       * 
       */
      protected void determineCompressionMode() {
        if (fileNamePatternStr.endsWith(".gz")) {
          addInfo("Will use gz compression");
          compressionMode = CompressionMode.GZ;
        } else if (fileNamePatternStr.endsWith(".zip")) {
          addInfo("Will use zip compression");
          compressionMode = CompressionMode.ZIP;
        } else {
          addInfo("No compression will be used");
          compressionMode = CompressionMode.NONE;
        }
      }
    
      public void setFileNamePattern(String fnp) {
        fileNamePatternStr = fnp;
      }
    
      public String getFileNamePattern() {
        return fileNamePatternStr;
      }
    
      public CompressionMode getCompressionMode() {
        return compressionMode;
      }
    
      public boolean isStarted() {
        return started;
      }
    
      public void start() {
        started = true;
      }
    
      public void stop() {
        started = false;
      }
    
      public void setParent(FileAppender appender) {
        this.parent = appender;
      }
    
      public boolean isParentPrudent() {
        return parent.isPrudent();
      }
    
      public String getParentsRawFileProperty() {
        return parent.rawFileProperty();
      }
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/�����������������������0000755�0001750�0001750�00000000000�12203357067�026620� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/Compressor.java��������0000644�0001750�0001750�00000020474�12143152550�031617� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling.helper;
    
    import java.io.BufferedInputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.zip.GZIPOutputStream;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipOutputStream;
    
    import ch.qos.logback.core.rolling.RolloverFailure;
    import ch.qos.logback.core.spi.ContextAwareBase;
    import ch.qos.logback.core.status.ErrorStatus;
    import ch.qos.logback.core.status.WarnStatus;
    import ch.qos.logback.core.util.FileUtil;
    
    /**
     * The <code>Compression</code> class implements ZIP and GZ file
     * compression/decompression methods.
     *
     * @author Ceki G&uuml;lc&uuml;
     */
    public class Compressor extends ContextAwareBase {
    
      final CompressionMode compressionMode;
    
      static final int BUFFER_SIZE = 8192;
    
      public Compressor(CompressionMode compressionMode) {
        this.compressionMode = compressionMode;
      }
    
      /**
       * @param nameOfFile2Compress
       * @param nameOfCompressedFile
       * @param innerEntryName       The name of the file within the zip file. Use for ZIP compression.
       */
      public void compress(String nameOfFile2Compress, String nameOfCompressedFile, String innerEntryName) {
        switch (compressionMode) {
          case GZ:
            gzCompress(nameOfFile2Compress, nameOfCompressedFile);
            break;
          case ZIP:
            zipCompress(nameOfFile2Compress, nameOfCompressedFile, innerEntryName);
            break;
          case NONE:
            throw new UnsupportedOperationException(
                    "compress method called in NONE compression mode");
        }
      }
    
      private void zipCompress(String nameOfFile2zip, String nameOfZippedFile, String innerEntryName) {
        File file2zip = new File(nameOfFile2zip);
    
        if (!file2zip.exists()) {
          addStatus(new WarnStatus("The file to compress named [" + nameOfFile2zip
                  + "] does not exist.", this));
    
          return;
        }
    
        if (innerEntryName == null) {
          addStatus(new WarnStatus("The innerEntryName parameter cannot be null", this));
          return;
        }
    
        if (!nameOfZippedFile.endsWith(".zip")) {
          nameOfZippedFile = nameOfZippedFile + ".zip";
        }
    
        File zippedFile = new File(nameOfZippedFile);
    
        if (zippedFile.exists()) {
          addStatus(new WarnStatus("The target compressed file named ["
                  + nameOfZippedFile + "] exist already.", this));
    
          return;
        }
    
        addInfo("ZIP compressing [" + file2zip + "] as ["+zippedFile+"]");
        createMissingTargetDirsIfNecessary(zippedFile);
    
        BufferedInputStream bis = null;
        ZipOutputStream zos = null;
        try {
          bis = new BufferedInputStream(new FileInputStream(nameOfFile2zip));
          zos = new ZipOutputStream(new FileOutputStream(nameOfZippedFile));
    
          ZipEntry zipEntry = computeZipEntry(innerEntryName);
          zos.putNextEntry(zipEntry);
    
          byte[] inbuf = new byte[BUFFER_SIZE];
          int n;
    
          while ((n = bis.read(inbuf)) != -1) {
            zos.write(inbuf, 0, n);
          }
    
          bis.close();
          bis = null;
          zos.close();
          zos = null;
    
          if (!file2zip.delete()) {
            addStatus(new WarnStatus("Could not delete [" + nameOfFile2zip + "].",
                    this));
          }
        } catch (Exception e) {
          addStatus(new ErrorStatus("Error occurred while compressing ["
                  + nameOfFile2zip + "] into [" + nameOfZippedFile + "].", this, e));
        } finally {
          if (bis != null) {
            try {
              bis.close();
            } catch (IOException e) {
              // ignore
            }
          }
          if (zos != null) {
            try {
              zos.close();
            } catch (IOException e) {
              // ignore
            }
          }
        }
    
    
      }
    
      // http://jira.qos.ch/browse/LBCORE-98
      // The name of the compressed file as nested within the zip archive
      //
      // Case 1: RawFile = null, Patern = foo-%d.zip
      // nestedFilename = foo-${current-date}
      //
      // Case 2: RawFile = hello.txt, Pattern = = foo-%d.zip
      // nestedFilename = foo-${current-date}
      //
      // in both cases, the strategy consisting of removing the compression
      // suffix of zip file works reasonably well. The alternative strategy
      // whereby the nested file name was based on the value of the raw file name
      // (applicable to case 2 only) has the disadvantage of the nested files
      // all having the same name, which could make it harder for the user
      // to unzip the file without collisions
      ZipEntry computeZipEntry(File zippedFile) {
        return computeZipEntry(zippedFile.getName());
      }
    
      ZipEntry computeZipEntry(String filename) {
        String nameOfFileNestedWithinArchive = computeFileNameStr_WCS(filename, compressionMode);
        return new ZipEntry(nameOfFileNestedWithinArchive);
      }
    
    
      private void gzCompress(String nameOfFile2gz, String nameOfgzedFile) {
        File file2gz = new File(nameOfFile2gz);
    
        if (!file2gz.exists()) {
          addStatus(new WarnStatus("The file to compress named [" + nameOfFile2gz
                  + "] does not exist.", this));
    
          return;
        }
    
    
        if (!nameOfgzedFile.endsWith(".gz")) {
          nameOfgzedFile = nameOfgzedFile + ".gz";
        }
    
        File gzedFile = new File(nameOfgzedFile);
    
        if (gzedFile.exists()) {
          addWarn("The target compressed file named ["
                  + nameOfgzedFile + "] exist already. Aborting file compression.");
          return;
        }
    
        addInfo("GZ compressing [" + file2gz + "] as ["+gzedFile+"]");
        createMissingTargetDirsIfNecessary(gzedFile);
    
        BufferedInputStream bis = null;
        GZIPOutputStream gzos = null;
        try {
          bis = new BufferedInputStream(new FileInputStream(nameOfFile2gz));
          gzos = new GZIPOutputStream(new FileOutputStream(nameOfgzedFile));
          byte[] inbuf = new byte[BUFFER_SIZE];
          int n;
    
          while ((n = bis.read(inbuf)) != -1) {
            gzos.write(inbuf, 0, n);
          }
    
          bis.close();
          bis = null;
          gzos.close();
          gzos = null;
    
          if (!file2gz.delete()) {
            addStatus(new WarnStatus("Could not delete [" + nameOfFile2gz + "].",
                    this));
          }
        } catch (Exception e) {
          addStatus(new ErrorStatus("Error occurred while compressing ["
                  + nameOfFile2gz + "] into [" + nameOfgzedFile + "].", this, e));
        } finally {
          if (bis != null) {
            try {
              bis.close();
            } catch (IOException e) {
              // ignore
            }
          }
          if (gzos != null) {
            try {
              gzos.close();
            } catch (IOException e) {
              // ignore
            }
          }
        }
      }
    
      static public String computeFileNameStr_WCS(String fileNamePatternStr,
                                                  CompressionMode compressionMode) {
        int len = fileNamePatternStr.length();
        switch (compressionMode) {
          case GZ:
            if (fileNamePatternStr.endsWith(".gz"))
              return fileNamePatternStr.substring(0, len - 3);
            else
              return fileNamePatternStr;
          case ZIP:
            if (fileNamePatternStr.endsWith(".zip"))
              return fileNamePatternStr.substring(0, len - 4);
            else
              return fileNamePatternStr;
          case NONE:
            return fileNamePatternStr;
        }
        throw new IllegalStateException("Execution should not reach this point");
      }
    
    
      void createMissingTargetDirsIfNecessary(File file) {
        if (FileUtil.isParentDirectoryCreationRequired(file)) {
          boolean result = FileUtil.createMissingParentDirectories(file);
          if (!result) {
            addError("Failed to create parent directories for ["
                    + file.getAbsolutePath() + "]");
          } else {
            addInfo("Created missing parent directories for ["
                    + file.getAbsolutePath() + "]");
          }
        }
      }
    
      @Override
      public String toString() {
        return this.getClass().getName();
      }
    
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000151�00000000000�011562� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/AsynchronousCompressor.java������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/AsynchronousCompressor.0000644�0001750�0001750�00000002314�12136042272�033363� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling.helper;
    
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.Future;
    
    public class AsynchronousCompressor {
      Compressor compressor;
    
      public AsynchronousCompressor(Compressor compressor) {
        this.compressor = compressor;
      }
    
      public Future<?> compressAsynchronously(String nameOfFile2Compress,
          String nameOfCompressedFile, String innerEntryName) {
        ExecutorService executor = Executors.newScheduledThreadPool(1);
        Future<?> future = executor.submit(new CompressionRunnable(compressor,
            nameOfFile2Compress, nameOfCompressedFile, innerEntryName));
        executor.shutdown();
        return future;
      }
    
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/ArchiveRemover.java����0000644�0001750�0001750�00000001473�12136042272�032403� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling.helper;
    
    import java.util.Date;
    
    import ch.qos.logback.core.spi.ContextAware;
    
    /**
     * Given a date remove older archived log files.
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public interface ArchiveRemover extends ContextAware {
      void clean(Date now);
      void setMaxHistory(int maxHistory);
    } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/package.html�����������0000644�0001750�0001750�00000000323�11377016712�031077� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
    <html> <head>
    <title></title>
    </head>
    
    <body>
    
    <p>Internal helper classes used by {@link ch.qos.logback.core.rolling} package.</p>
    
    <hr>
    </body> </html>
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/RollingCalendar.java���0000644�0001750�0001750�00000017104�12136042272�032520� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling.helper;
    
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.Date;
    import java.util.GregorianCalendar;
    import java.util.Locale;
    import java.util.TimeZone;
    
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.spi.ContextAwareBase;
    
    /**
     * RollingCalendar is a helper class to
     * {@link ch.qos.logback.core.rolling.TimeBasedRollingPolicy } or similar
     * timed-based rolling policies. Given a periodicity type and the current time,
     * it computes the start of the next interval (i.e. the triggering date).
     *
     * @author Ceki G&uuml;lc&uuml;
     */
    public class RollingCalendar extends GregorianCalendar {
    
      private static final long serialVersionUID = -5937537740925066161L;
    
      // The gmtTimeZone is used only in computeCheckPeriod() method.
      static final TimeZone GMT_TIMEZONE = TimeZone.getTimeZone("GMT");
    
      PeriodicityType periodicityType = PeriodicityType.ERRONEOUS;
    
      public RollingCalendar() {
        super();
      }
    
      public RollingCalendar(TimeZone tz, Locale locale) {
        super(tz, locale);
      }
    
      public void init(String datePattern) {
        periodicityType = computePeriodicityType(datePattern);
      }
    
      private void setPeriodicityType(PeriodicityType periodicityType) {
        this.periodicityType = periodicityType;
      }
    
      public PeriodicityType getPeriodicityType() {
        return periodicityType;
      }
    
      public long getNextTriggeringMillis(Date now) {
        return getNextTriggeringDate(now).getTime();
      }
    
      // This method computes the roll over period by looping over the
      // periods, starting with the shortest, and stopping when the r0 is
      // different from from r1, where r0 is the epoch formatted according
      // the datePattern (supplied by the user) and r1 is the
      // epoch+nextMillis(i) formatted according to datePattern. All date
      // formatting is done in GMT and not local format because the test
      // logic is based on comparisons relative to 1970-01-01 00:00:00
      // GMT (the epoch).
      public PeriodicityType computePeriodicityType(String datePattern) {
        RollingCalendar rollingCalendar = new RollingCalendar(GMT_TIMEZONE, Locale
                .getDefault());
    
        // set sate to 1970-01-01 00:00:00 GMT
        Date epoch = new Date(0);
    
        if (datePattern != null) {
          for (PeriodicityType i : PeriodicityType.VALID_ORDERED_LIST) {
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat(datePattern);
            simpleDateFormat.setTimeZone(GMT_TIMEZONE); // all date formatting done
            // in GMT
    
            String r0 = simpleDateFormat.format(epoch);
            rollingCalendar.setPeriodicityType(i);
    
            Date next = new Date(rollingCalendar.getNextTriggeringMillis(epoch));
            String r1 = simpleDateFormat.format(next);
    
            // System.out.println("Type = "+i+", r0 = "+r0+", r1 = "+r1);
            if ((r0 != null) && (r1 != null) && !r0.equals(r1)) {
              return i;
            }
          }
        }
        // we failed
        return PeriodicityType.ERRONEOUS;
      }
    
      public void printPeriodicity(ContextAwareBase cab) {
        switch (periodicityType) {
          case TOP_OF_MILLISECOND:
            cab.addInfo("Roll-over every millisecond.");
            break;
    
          case TOP_OF_SECOND:
            cab.addInfo("Roll-over every second.");
            break;
    
          case TOP_OF_MINUTE:
            cab.addInfo("Roll-over every minute.");
            break;
    
          case TOP_OF_HOUR:
            cab.addInfo("Roll-over at the top of every hour.");
            break;
    
          case HALF_DAY:
            cab.addInfo("Roll-over at midday and midnight.");
            break;
    
          case TOP_OF_DAY:
            cab.addInfo("Roll-over at midnight.");
            break;
    
          case TOP_OF_WEEK:
            cab.addInfo("Rollover at the start of week.");
            break;
    
          case TOP_OF_MONTH:
            cab.addInfo("Rollover at start of every month.");
            break;
    
          default:
            cab.addInfo("Unknown periodicity.");
        }
      }
    
      public long periodsElapsed(long start, long end) {
        if (start > end)
          throw new IllegalArgumentException("Start cannot come before end");
    
        long diff = end - start;
        switch (periodicityType) {
    
          case TOP_OF_MILLISECOND:
            return diff;
          case TOP_OF_SECOND:
            return diff / CoreConstants.MILLIS_IN_ONE_SECOND;
          case TOP_OF_MINUTE:
            return diff / CoreConstants.MILLIS_IN_ONE_MINUTE;
          case TOP_OF_HOUR:
            return (int) diff / CoreConstants.MILLIS_IN_ONE_HOUR;
          case TOP_OF_DAY:
            return diff / CoreConstants.MILLIS_IN_ONE_DAY;
          case TOP_OF_WEEK:
            return diff / CoreConstants.MILLIS_IN_ONE_WEEK;
          case TOP_OF_MONTH:
            return diffInMonths(start, end);
          default:
            throw new IllegalStateException("Unknown periodicity type.");
        }
      }
    
      public static int diffInMonths(long startTime, long endTime) {
        if (startTime > endTime)
          throw new IllegalArgumentException("startTime cannot be larger than endTime");
        Calendar startCal = Calendar.getInstance();
        startCal.setTimeInMillis(startTime);
        Calendar endCal = Calendar.getInstance();
        endCal.setTimeInMillis(endTime);
        int yearDiff = endCal.get(Calendar.YEAR) - startCal.get(Calendar.YEAR);
        int monthDiff = endCal.get(Calendar.MONTH) - startCal.get(Calendar.MONTH);
        return yearDiff * 12 + monthDiff;
      }
    
      public Date getRelativeDate(Date now, int periods) {
        this.setTime(now);
    
        switch (periodicityType) {
          case TOP_OF_MILLISECOND:
            this.add(Calendar.MILLISECOND, periods);
            break;
    
          case TOP_OF_SECOND:
            this.set(Calendar.MILLISECOND, 0);
            this.add(Calendar.SECOND, periods);
            break;
    
          case TOP_OF_MINUTE:
            this.set(Calendar.SECOND, 0);
            this.set(Calendar.MILLISECOND, 0);
            this.add(Calendar.MINUTE, periods);
            break;
    
          case TOP_OF_HOUR:
            this.set(Calendar.MINUTE, 0);
            this.set(Calendar.SECOND, 0);
            this.set(Calendar.MILLISECOND, 0);
            this.add(Calendar.HOUR_OF_DAY, periods);
            break;
    
          case TOP_OF_DAY:
            this.set(Calendar.HOUR_OF_DAY, 0);
            this.set(Calendar.MINUTE, 0);
            this.set(Calendar.SECOND, 0);
            this.set(Calendar.MILLISECOND, 0);
            this.add(Calendar.DATE, periods);
            break;
    
          case TOP_OF_WEEK:
            this.set(Calendar.DAY_OF_WEEK, getFirstDayOfWeek());
            this.set(Calendar.HOUR_OF_DAY, 0);
            this.set(Calendar.MINUTE, 0);
            this.set(Calendar.SECOND, 0);
            this.set(Calendar.MILLISECOND, 0);
            this.add(Calendar.WEEK_OF_YEAR, periods);
            break;
    
          case TOP_OF_MONTH:
            this.set(Calendar.DATE, 1);
            this.set(Calendar.HOUR_OF_DAY, 0);
            this.set(Calendar.MINUTE, 0);
            this.set(Calendar.SECOND, 0);
            this.set(Calendar.MILLISECOND, 0);
            this.add(Calendar.MONTH, periods);
            break;
    
          default:
            throw new IllegalStateException("Unknown periodicity type.");
        }
    
        return getTime();
      }
    
      public Date getNextTriggeringDate(Date now) {
        return getRelativeDate(now, 1);
      }
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/CompressionMode.java���0000644�0001750�0001750�00000001111�12136042272�032555� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling.helper;
    
    public enum CompressionMode {
      NONE, GZ, ZIP;
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000146�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/CompressionRunnable.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/CompressionRunnable.jav0000644�0001750�0001750�00000002270�12136042272�033305� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling.helper;
    
    
    public class CompressionRunnable implements Runnable {
    
      final Compressor compressor;
      final String nameOfFile2Compress;
      final String nameOfCompressedFile;
      final String innerEntryName;
    
      public CompressionRunnable(Compressor compressor, String nameOfFile2Compress,
                                 String nameOfCompressedFile, String innerEntryName) {
        this.compressor = compressor;
        this.nameOfFile2Compress = nameOfFile2Compress;
        this.nameOfCompressedFile = nameOfCompressedFile;
        this.innerEntryName = innerEntryName;
      }
    
      public void run() {
        compressor.compress(nameOfFile2Compress, nameOfCompressedFile, innerEntryName);
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/RenameUtil.java��������0000644�0001750�0001750�00000010436�12136042272�031526� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling.helper;
    
    
    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.rolling.RollingFileAppender;
    import ch.qos.logback.core.rolling.RolloverFailure;
    import ch.qos.logback.core.spi.ContextAwareBase;
    import ch.qos.logback.core.util.EnvUtil;
    import ch.qos.logback.core.util.FileUtil;
    
    
    /**
     * Utility class to help solving problems encountered while renaming files.
     *
     * @author Ceki Gulcu
     */
    public class RenameUtil extends ContextAwareBase {
    
      static String RENAMING_ERROR_URL = CoreConstants.CODES_URL + "#renamingError";
    
      /**
       * A relatively robust file renaming method which in case of failure due to
       * src and target being on different volumes, falls back onto
       * renaming by copying.
       *
       * @param src
       * @param target
       * @throws RolloverFailure
       */
      public void rename(String src, String target) throws RolloverFailure {
        if (src.equals(target)) {
          addWarn("Source and target files are the same [" + src + "]. Skipping.");
          return;
        }
        File srcFile = new File(src);
    
        if (srcFile.exists()) {
          File targetFile = new File(target);
          createMissingTargetDirsIfNecessary(targetFile);
    
          addInfo("Renaming file [" + srcFile + "] to [" + targetFile + "]");
    
          boolean result = srcFile.renameTo(targetFile);
    
          if (!result) {
            addWarn("Failed to rename file [" + srcFile + "] as [" + targetFile + "].");
            if (areOnDifferentVolumes(srcFile, targetFile)) {
              addWarn("Detected different file systems for source [" + src + "] and target [" + target + "]. Attempting rename by copying.");
              renameByCopying(src, target);
              return;
            } else {
              addWarn("Please consider leaving the [file] option of " + RollingFileAppender.class.getSimpleName() + " empty.");
              addWarn("See also " + RENAMING_ERROR_URL);
            }
          }
        } else {
          throw new RolloverFailure("File [" + src + "] does not exist.");
        }
      }
    
    
      /**
       * Attempts tp determine whether both files are on different volumes. Returns true if we could determine that
       * the files are on different volumes. Returns false otherwise or if an error occurred while doing the check.
       *
       * @param srcFile
       * @param targetFile
       * @return true if on different volumes, false otherwise or if an error occurred
       */
       boolean areOnDifferentVolumes(File srcFile, File targetFile) throws RolloverFailure {
        if (!EnvUtil.isJDK7OrHigher())
          return false;
    
        File parentOfTarget = targetFile.getParentFile();
    
        try {
          boolean onSameFileStore = FileStoreUtil.areOnSameFileStore(srcFile, parentOfTarget);
          return !onSameFileStore;
        } catch (RolloverFailure rf) {
          addWarn("Error while checking file store equality", rf);
          return false;
        }
      }
    
    
    
    
      public void renameByCopying(String src, String target)
              throws RolloverFailure {
    
        FileUtil fileUtil = new FileUtil(getContext());
        fileUtil.copy(src, target);
    
        File srcFile = new File(src);
       if (!srcFile.delete()) {
          addWarn("Could not delete " + src);
        }
    
      }
    
      void createMissingTargetDirsIfNecessary(File toFile) throws RolloverFailure {
        if (FileUtil.isParentDirectoryCreationRequired(toFile)) {
          boolean result = FileUtil.createMissingParentDirectories(toFile);
          if (!result) {
            throw new RolloverFailure("Failed to create parent directories for ["
                    + toFile.getAbsolutePath() + "]");
          }
        }
      }
    
      @Override
      public String toString() {
        return "c.q.l.co.rolling.helper.RenameUtil";
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/MonoTypedConverter.java0000644�0001750�0001750�00000001351�12136042272�033263� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling.helper;
    
    /**
     * Converters which can deal only with one type should implement this interface.
     * 
     * @author Ceki G&ulcu;lc&uuml;
     * 
     */
    public interface MonoTypedConverter {
      boolean isApplicable(Object o);
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/FileNamePattern.java���0000644�0001750�0001750�00000013603�12136042272�032476� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling.helper;
    
    import java.util.Date;
    import java.util.HashMap;
    import java.util.Map;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.pattern.Converter;
    import ch.qos.logback.core.pattern.ConverterUtil;
    import ch.qos.logback.core.pattern.LiteralConverter;
    import ch.qos.logback.core.pattern.parser.Node;
    import ch.qos.logback.core.pattern.parser.Parser;
    import ch.qos.logback.core.spi.ScanException;
    import ch.qos.logback.core.pattern.util.AlmostAsIsEscapeUtil;
    import ch.qos.logback.core.spi.ContextAwareBase;
    
    /**
     * After parsing file name patterns, given a number or a date, instances of this
     * class can be used to compute a file name according to the file name pattern
     * and the given integer or date.
     * 
     * @author Ceki G&uuml;lc&uuml;
     * 
     */
    public class FileNamePattern extends ContextAwareBase {
    
      static final Map<String, String> CONVERTER_MAP = new HashMap<String, String>();
      static {
        CONVERTER_MAP.put(IntegerTokenConverter.CONVERTER_KEY,
            IntegerTokenConverter.class.getName());
        CONVERTER_MAP.put(DateTokenConverter.CONVERTER_KEY,
            DateTokenConverter.class.getName());
      }
    
      String pattern;
      Converter<Object> headTokenConverter;
    
      public FileNamePattern(String patternArg, Context contextArg) {
        // the pattern is slashified
        setPattern(FileFilterUtil.slashify(patternArg));
        setContext(contextArg);
        parse();
        ConverterUtil.startConverters(this.headTokenConverter);
      }
    
      void parse() {
        try {
          // http://jira.qos.ch/browse/LBCORE-130
          // we escape ')' for parsing purposes. Note that the original pattern is preserved
          // because it is shown to the user in status messages. We don't want the escaped version
          // to leak out.
          String patternForParsing = escapeRightParantesis(pattern);
          Parser<Object> p = new Parser<Object>(patternForParsing, new AlmostAsIsEscapeUtil());
          p.setContext(context);
          Node t = p.parse();
          this.headTokenConverter = p.compile(t, CONVERTER_MAP);
    
        } catch (ScanException sce) {
          addError("Failed to parse pattern \"" + pattern + "\".", sce);
        }
      }
    
      String escapeRightParantesis(String in) {
        return pattern.replace(")", "\\)");
      }
    
      public String toString() {
        return pattern;
      }
    
      public DateTokenConverter getPrimaryDateTokenConverter() {
        Converter p = headTokenConverter;
    
        while (p != null) {
          if (p instanceof DateTokenConverter) {
            DateTokenConverter dtc = (DateTokenConverter) p;
            // only primary converters should be returned as
            if(dtc.isPrimary())
              return dtc;
          }
    
          p = p.getNext();
        }
    
        return null;
      }
    
      public IntegerTokenConverter getIntegerTokenConverter() {
        Converter p = headTokenConverter;
    
        while (p != null) {
          if (p instanceof IntegerTokenConverter) {
            return (IntegerTokenConverter) p;
          }
    
          p = p.getNext();
        }
        return null;
      }
    
      public String convertMultipleArguments(Object... objectList) {
        StringBuilder buf = new StringBuilder();
        Converter<Object> c = headTokenConverter;
        while (c != null) {
          if (c instanceof MonoTypedConverter) {
            MonoTypedConverter monoTyped = (MonoTypedConverter) c;
            for (Object o : objectList) {
              if (monoTyped.isApplicable(o)) {
                buf.append(c.convert(o));
              }
            }
          } else {
            buf.append(c.convert(objectList));
          }
          c = c.getNext();
        }
        return buf.toString();
      }
    
      public String convert(Object o) {
        StringBuilder buf = new StringBuilder();
        Converter<Object> p = headTokenConverter;
        while (p != null) {
          buf.append(p.convert(o));
          p = p.getNext();
        }
        return buf.toString();
      }
    
      public String convertInt(int i) {
        return convert(i);
      }
    
      public void setPattern(String pattern) {
        if (pattern != null) {
          // Trailing spaces in the pattern are assumed to be undesired.
          this.pattern = pattern.trim();
        }
      }
    
      public String getPattern() {
        return pattern;
      }
    
      /**
       * Given date, convert this instance to a regular expression.
       *
       * Used to compute sub-regex when the pattern has both %d and %i, and the
       * date is known.
       */
      public String toRegexForFixedDate(Date date) {
        StringBuilder buf = new StringBuilder();
        Converter<Object> p = headTokenConverter;
        while (p != null) {
          if (p instanceof LiteralConverter) {
            buf.append(p.convert(null));
          } else if (p instanceof IntegerTokenConverter) {
            buf.append("(\\d{1,3})");
          } else if (p instanceof DateTokenConverter) {
            buf.append(p.convert(date));
          }
          p = p.getNext();
        }
        return buf.toString();
      }
    
      /**
       * Given date, convert this instance to a regular expression
       */
      public String toRegex() {
        StringBuilder buf = new StringBuilder();
        Converter<Object> p = headTokenConverter;
        while (p != null) {
          if (p instanceof LiteralConverter) {
            buf.append(p.convert(null));
          } else if (p instanceof IntegerTokenConverter) {
            buf.append("\\d{1,2}");
          } else if (p instanceof DateTokenConverter) {
            DateTokenConverter<Object> dtc = (DateTokenConverter<Object>) p;
            buf.append(dtc.toRegex());
          }
          p = p.getNext();
        }
        return buf.toString();
      }
    }
    �����������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000150�00000000000�011561� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/DefaultArchiveRemover.java�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/DefaultArchiveRemover.j0000644�0001750�0001750�00000010670�12136042272�033217� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling.helper;
    
    import java.io.File;
    import java.util.Date;
    
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.pattern.Converter;
    import ch.qos.logback.core.pattern.LiteralConverter;
    import ch.qos.logback.core.spi.ContextAwareBase;
    
    abstract public class DefaultArchiveRemover extends ContextAwareBase implements
            ArchiveRemover {
    
      static protected final long UNINITIALIZED = -1;
      // aim for 64 days, except in case of hourly rollover
      static protected final long INACTIVITY_TOLERANCE_IN_MILLIS = 64L * (long) CoreConstants.MILLIS_IN_ONE_DAY;
      static final int MAX_VALUE_FOR_INACTIVITY_PERIODS = 14 * 24; // 14 days in case of hourly rollover
    
      final FileNamePattern fileNamePattern;
      final RollingCalendar rc;
      int periodOffsetForDeletionTarget;
      final boolean parentClean;
      long lastHeartBeat = UNINITIALIZED;
    
      public DefaultArchiveRemover(FileNamePattern fileNamePattern,
                                   RollingCalendar rc) {
        this.fileNamePattern = fileNamePattern;
        this.rc = rc;
        this.parentClean = computeParentCleaningFlag(fileNamePattern);
      }
    
    
      int computeElapsedPeriodsSinceLastClean(long nowInMillis) {
        long periodsElapsed = 0;
        if (lastHeartBeat == UNINITIALIZED) {
          addInfo("first clean up after appender initialization");
          periodsElapsed = rc.periodsElapsed(nowInMillis, nowInMillis + INACTIVITY_TOLERANCE_IN_MILLIS);
          if (periodsElapsed > MAX_VALUE_FOR_INACTIVITY_PERIODS)
            periodsElapsed = MAX_VALUE_FOR_INACTIVITY_PERIODS;
        } else {
          periodsElapsed = rc.periodsElapsed(lastHeartBeat, nowInMillis);
          if (periodsElapsed < 1) {
            addWarn("Unexpected periodsElapsed value " + periodsElapsed);
            periodsElapsed = 1;
          }
        }
        return (int) periodsElapsed;
      }
    
      public void clean(Date now) {
        long nowInMillis = now.getTime();
        int periodsElapsed = computeElapsedPeriodsSinceLastClean(nowInMillis);
        lastHeartBeat = nowInMillis;
        if (periodsElapsed > 1) {
          addInfo("periodsElapsed = " + periodsElapsed);
        }
        for (int i = 0; i < periodsElapsed; i++) {
          cleanByPeriodOffset(now, periodOffsetForDeletionTarget - i);
        }
      }
    
      abstract void cleanByPeriodOffset(Date now, int periodOffset);
    
      boolean computeParentCleaningFlag(FileNamePattern fileNamePattern) {
        DateTokenConverter dtc = fileNamePattern.getPrimaryDateTokenConverter();
        // if the date pattern has a /, then we need parent cleaning
        if (dtc.getDatePattern().indexOf('/') != -1) {
          return true;
        }
        // if the literal string subsequent to the dtc contains a /, we also
        // need parent cleaning
    
        Converter<Object> p = fileNamePattern.headTokenConverter;
    
        // find the date converter
        while (p != null) {
          if (p instanceof DateTokenConverter) {
            break;
          }
          p = p.getNext();
        }
    
        while (p != null) {
          if (p instanceof LiteralConverter) {
            String s = p.convert(null);
            if (s.indexOf('/') != -1) {
              return true;
            }
          }
          p = p.getNext();
        }
    
        // no /, so we don't need parent cleaning
        return false;
      }
    
      void removeFolderIfEmpty(File dir) {
        removeFolderIfEmpty(dir, 0);
      }
    
      /**
       * Will remove the directory passed as parameter if empty. After that, if the
       * parent is also becomes empty, remove the parent dir as well but at most 3
       * times.
       *
       * @param dir
       * @param depth
       */
      private void removeFolderIfEmpty(File dir, int depth) {
        // we should never go more than 3 levels higher
        if (depth >= 3) {
          return;
        }
        if (dir.isDirectory() && FileFilterUtil.isEmptyDirectory(dir)) {
          addInfo("deleting folder [" + dir + "]");
          dir.delete();
          removeFolderIfEmpty(dir.getParentFile(), depth + 1);
        }
      }
    
      public void setMaxHistory(int maxHistory) {
        this.periodOffsetForDeletionTarget = -maxHistory - 1;
      }
    
    }
    ������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/TokenConverter.java����0000644�0001750�0001750�00000002423�12136042272�032426� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling.helper;
    
    
    /**
     * <code>TokenConverter</code> offers some basic functionality used by more 
     * specific token  converters. 
     * <p>
     * It basically sets up the chained architecture for tokens. It also forces 
     * derived classes to fix their type.
     * 
     * @author Ceki
     * @since 1.3
     */
    public class TokenConverter {
      
      
      static final int IDENTITY = 0;
      static final int INTEGER = 1;
      static final int DATE = 1;
      int type;
      TokenConverter next;
    
      protected TokenConverter(int t) {
        type = t;
      }
    
      public TokenConverter getNext() {
        return next;
      }
    
      public void setNext(TokenConverter next) {
        this.next = next;
      }
     
      public int getType() {
        return type;
      }
    
      public void setType(int i) {
        type = i;
      }
    
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/FileStoreUtil.java�����0000644�0001750�0001750�00000004442�12136042272�032213� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling.helper;
    
    import ch.qos.logback.core.rolling.RolloverFailure;
    
    import java.io.File;
    import java.lang.reflect.Method;
    
    /**
     * A utility class using functionality available since JDK 1.7.
     *
     * @author ceki
     * @since 1.0.10
     */
    public class FileStoreUtil {
    
      static final String PATH_CLASS_STR = "java.nio.file.Path";
      static final String FILES_CLASS_STR = "java.nio.file.Files";
    
      /**
       * This method assumes that both files a and b exists.
       *
       * @param a
       * @param b
       * @return
       * @throws Exception
       */
      static public boolean areOnSameFileStore(File a, File b) throws RolloverFailure {
        if (!a.exists()) {
          throw new IllegalArgumentException("File [" + a + "] does not exist.");
        }
        if (!b.exists()) {
          throw new IllegalArgumentException("File [" + b + "] does not exist.");
        }
    
    // Implements the following by reflection
    //    Path pathA = a.toPath();
    //    Path pathB = b.toPath();
    //
    //    FileStore fileStoreA = Files.getFileStore(pathA);
    //    FileStore fileStoreB = Files.getFileStore(pathB);
    //
    //    return fileStoreA.equals(fileStoreB);
    
        try {
          Class<?> pathClass = Class.forName(PATH_CLASS_STR);
          Class<?> filesClass = Class.forName(FILES_CLASS_STR);
    
          Method toPath = File.class.getMethod("toPath");
          Method getFileStoreMethod = filesClass.getMethod("getFileStore", pathClass);
    
    
          Object pathA = toPath.invoke(a);
          Object pathB = toPath.invoke(b);
    
          Object fileStoreA = getFileStoreMethod.invoke(null, pathA);
          Object fileStoreB = getFileStoreMethod.invoke(null, pathB);
          return fileStoreA.equals(fileStoreB);
        } catch (Exception e) {
          throw new RolloverFailure("Failed to check file store equality for [" + a + "] and [" + b + "]", e);
        }
      }
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000161�00000000000�011563� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/SizeAndTimeBasedArchiveRemover.java����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/SizeAndTimeBasedArchive0000644�0001750�0001750�00000003213�12136042272�033151� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling.helper;
    
    import java.io.File;
    import java.util.Date;
    
    public class SizeAndTimeBasedArchiveRemover extends DefaultArchiveRemover {
    
      public SizeAndTimeBasedArchiveRemover(FileNamePattern fileNamePattern,
          RollingCalendar rc) {
        super(fileNamePattern, rc);
      }
    
      public void cleanByPeriodOffset(Date now, int periodOffset) {
        Date dateOfPeriodToClean = rc.getRelativeDate(now, periodOffset);
    
        String regex = fileNamePattern.toRegexForFixedDate(dateOfPeriodToClean);
        String stemRegex = FileFilterUtil.afterLastSlash(regex);
        File archive0 = new File(fileNamePattern.convertMultipleArguments(
            dateOfPeriodToClean, 0));
        // in case the file has no directory part, i.e. if it's written into the
        // user's current directory.
        archive0 = archive0.getAbsoluteFile();
    
        File parentDir = archive0.getAbsoluteFile().getParentFile();
        File[] matchingFileArray = FileFilterUtil.filesInFolderMatchingStemRegex(
            parentDir, stemRegex);
    
        for (File f : matchingFileArray) {
          f.delete();
        }
    
        if (parentClean) {
          removeFolderIfEmpty(parentDir);
        }
      }
    
    
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/PeriodicityType.java���0000644�0001750�0001750�00000002105�12136042272�032601� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling.helper;
    
    public enum PeriodicityType {
    
      ERRONEOUS, TOP_OF_MILLISECOND, TOP_OF_SECOND, TOP_OF_MINUTE, TOP_OF_HOUR, HALF_DAY, TOP_OF_DAY, TOP_OF_WEEK, TOP_OF_MONTH;
    
      // The followed list consists of valid periodicy types in increasing period
      // lengths
      static PeriodicityType[] VALID_ORDERED_LIST = new PeriodicityType[] {
          TOP_OF_MILLISECOND, PeriodicityType.TOP_OF_SECOND,
          PeriodicityType.TOP_OF_MINUTE, PeriodicityType.TOP_OF_HOUR,
          PeriodicityType.TOP_OF_DAY, PeriodicityType.TOP_OF_WEEK,
          PeriodicityType.TOP_OF_MONTH };
    
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/FileFilterUtil.java����0000644�0001750�0001750�00000007407�12136042272�032350� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling.helper;
    
    import java.io.File;
    import java.io.FilenameFilter;
    import java.util.Arrays;
    import java.util.Comparator;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class FileFilterUtil {
    
      public static void sortFileArrayByName(File[] fileArray) {
        Arrays.sort(fileArray, new Comparator<File>() {
          public int compare(File o1, File o2) {
            String o1Name = o1.getName();
            String o2Name = o2.getName();
            return (o1Name.compareTo(o2Name));
          }
        });
      }
    
      public static void reverseSortFileArrayByName(File[] fileArray) {
        Arrays.sort(fileArray, new Comparator<File>() {
          public int compare(File o1, File o2) {
            String o1Name = o1.getName();
            String o2Name = o2.getName();
            return (o2Name.compareTo(o1Name));
          }
        });
      }
    
      public static String afterLastSlash(String sregex) {
        int i = sregex.lastIndexOf('/');
        if (i == -1) {
          return sregex;
        } else {
          return sregex.substring(i + 1);
        }
      }
    
      static public boolean isEmptyDirectory(File dir) {
        if (!dir.isDirectory()) {
          throw new IllegalArgumentException("[" + dir + "] must be a directory");
        }
        String[] filesInDir = dir.list();
        if (filesInDir == null || filesInDir.length == 0) {
          return true;
        } else {
          return false;
        }
      }
    
      /**
       * Return the set of files matching the stemRegex as found in 'directory'. A
       * stemRegex does not contain any slash characters or any folder separators.
       * 
       * @param file
       * @param stemRegex
       * @return
       */
      public static File[] filesInFolderMatchingStemRegex(File file,
          final String stemRegex) {
    
        if (file == null) {
          return new File[0];
        }
        if (!file.exists() || !file.isDirectory()) {
          return new File[0];
        }
        return file.listFiles(new FilenameFilter() {
          public boolean accept(File dir, String name) {
            return name.matches(stemRegex);
          }
        });
      }
    
      static public int findHighestCounter(File[] matchingFileArray, final String stemRegex) {
        int max = Integer.MIN_VALUE;
        for (File aFile : matchingFileArray) {
          int aCounter = FileFilterUtil.extractCounter(aFile, stemRegex);
          if (max < aCounter)
            max = aCounter;
        }
        return max;
      }
    
      static public int extractCounter(File file, final String stemRegex) {
        Pattern p = Pattern.compile(stemRegex);
        String lastFileName = file.getName();
    
        Matcher m = p.matcher(lastFileName);
        if (!m.matches()) {
          throw new IllegalStateException("The regex [" + stemRegex
              + "] should match [" + lastFileName + "]");
        }
        String counterAsStr = m.group(1);
        return new Integer(counterAsStr).intValue();
      }
    
      public static String slashify(String in) {
        return in.replace('\\', '/');
      }
    
      public static void removeEmptyParentDirectories(File file,
          int recursivityCount) {
        // we should never go more than 3 levels higher
        if (recursivityCount >= 3) {
          return;
        }
        File parent = file.getParentFile();
        if (parent.isDirectory() && FileFilterUtil.isEmptyDirectory(parent)) {
          parent.delete();
          removeEmptyParentDirectories(parent, recursivityCount + 1);
        }
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000152�00000000000�011563� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/TimeBasedArchiveRemover.java�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/TimeBasedArchiveRemover0000644�0001750�0001750�00000002560�12136042272�033237� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling.helper;
    
    import java.io.File;
    import java.util.Date;
    
    public class TimeBasedArchiveRemover extends DefaultArchiveRemover {
    
      public TimeBasedArchiveRemover(FileNamePattern fileNamePattern,
                                     RollingCalendar rc) {
        super(fileNamePattern, rc);
      }
    
      protected void cleanByPeriodOffset(Date now, int periodOffset) {
        Date date2delete = rc.getRelativeDate(now, periodOffset);
        String filename = fileNamePattern.convert(date2delete);
        File file2Delete = new File(filename);
        if (file2Delete.exists() && file2Delete.isFile()) {
          file2Delete.delete();
          addInfo("deleting " + file2Delete);
          if (parentClean) {
            removeFolderIfEmpty(file2Delete.getParentFile());
          }
        }
      }
    
      public String toString() {
        return "c.q.l.core.rolling.helper.TimeBasedArchiveRemover";
      }
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/DateTokenConverter.java0000644�0001750�0001750�00000005360�12136042272�033227� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling.helper;
    
    import java.util.Date;
    import java.util.List;
    
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.pattern.DynamicConverter;
    import ch.qos.logback.core.util.CachingDateFormatter;
    import ch.qos.logback.core.util.DatePatternToRegexUtil;
    
    /**
     * Returns a date formatted by SimpleDateFormatter.
     * 
     * @author Ceki G&uuml;c&uuml;
     */
    public class DateTokenConverter<E> extends DynamicConverter<E> implements MonoTypedConverter {
    
      /**
       * The conversion word/character with which this converter is registered.
       */
      public final static String CONVERTER_KEY = "d";
      public final static String AUXILIARY_TOKEN = "AUX";
      public static final String DEFAULT_DATE_PATTERN = CoreConstants.DAILY_DATE_PATTERN;
    
      private String datePattern;
      private CachingDateFormatter cdf;
      // is this token converter primary or auxiliary? Only the primary converter
      // determines the rolling period
      private boolean primary = true;
      public void start() {
        this.datePattern = getFirstOption();
        if (this.datePattern == null) {
          this.datePattern = DEFAULT_DATE_PATTERN;
        }
    
        final List<String> optionList = getOptionList();
        if(optionList != null && optionList.size()> 1) {
          String secondOption = optionList.get(1);
          if(AUXILIARY_TOKEN.equalsIgnoreCase(secondOption)) {
            primary = false;
          }
        }
        cdf = new CachingDateFormatter(datePattern);
      }
    
      public String convert(Date date) {
        return cdf.format(date.getTime());
      }
    
      public String convert(Object o) {
        if (o == null) {
          throw new IllegalArgumentException("Null argument forbidden");
        }
        if (o instanceof Date) {
          return convert((Date) o);
        } 
        throw new IllegalArgumentException("Cannot convert "+o+" of type"+o.getClass().getName());
      }
    
      /**
       * Return the date pattern.
       */
      public String getDatePattern() {
        return datePattern;
      }
    
      public boolean isApplicable(Object o) {
        return (o instanceof Date);
      }
    
      public String toRegex() {
        DatePatternToRegexUtil datePatternToRegexUtil = new DatePatternToRegexUtil(datePattern);
        return datePatternToRegexUtil.toRegex();
      }
    
      public boolean isPrimary() {
        return primary;
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000150�00000000000�011561� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/IntegerTokenConverter.java�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/rolling/helper/IntegerTokenConverter.j0000644�0001750�0001750�00000002564�12136042272�033262� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling.helper;
    
    import ch.qos.logback.core.pattern.DynamicConverter;
    
    /**
     * When asked to convert an integer, <code>IntegerTokenConverter</code> the
     * string value of that integer.
     * 
     * @author Ceki Gulcu
     */
    public class IntegerTokenConverter extends DynamicConverter implements MonoTypedConverter {
    
      public final static String CONVERTER_KEY = "i";
      
      public String convert(int i) {
        return Integer.toString(i);
      }
    
      public String convert(Object o) {
        if(o == null) {
          throw new IllegalArgumentException("Null argument forbidden");
        }
        if(o instanceof Integer) {
          Integer i = (Integer) o;
          return convert(i.intValue());
        } 
        throw new IllegalArgumentException("Cannot convert "+o+" of type"+o.getClass().getName());
      }
    
      public boolean isApplicable(Object o) {
        return (o instanceof Integer);
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000162�00000000000�011564� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/rolling/TimeBasedFileNamingAndTriggeringPolicy.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/rolling/TimeBasedFileNamingAndTriggeri0000644�0001750�0001750�00000004650�12136042272�033172� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling;
    
    import ch.qos.logback.core.rolling.helper.ArchiveRemover;
    import ch.qos.logback.core.spi.ContextAware;
    
    /**
     * This interface lists the set of methods that need to be implemented by
     * triggering policies which are nested within a {@link TimeBasedRollingPolicy}.
     * 
     * @author Ceki G&uuml;lc&uuml;
     * 
     * @param <E>
     */
    public interface TimeBasedFileNamingAndTriggeringPolicy<E> extends
        TriggeringPolicy<E>, ContextAware {
    
      /**
       * Set the host/parent {@link TimeBasedRollingPolicy}.
       * 
       * @param tbrp
       *                parent TimeBasedRollingPolicy
       */
      void setTimeBasedRollingPolicy(TimeBasedRollingPolicy<E> tbrp);
    
      /**
       * Return the file name for the elapsed periods file name.
       * 
       * @return
       */
      String getElapsedPeriodsFileName();
    
      /**
       * Return the current periods file name without the compression suffix. This
       * value is equivalent to the active file name.
       * 
       * @return current period's file name (without compression suffix)
       */
      String getCurrentPeriodsFileNameWithoutCompressionSuffix();
    
      /**
       * Return the archive remover appropriate for this instance.
       */
      ArchiveRemover getArchiveRemover();
      
      /**
       * Return the current time which is usually the value returned by
       * System.currentMillis(). However, for <b>testing</b> purposed this value
       * may be different than the real time.
       * 
       * @return current time value
       */
      long getCurrentTime();
    
      /**
       * Set the current time. Only unit tests should invoke this method.
       * 
       * @param now
       */
      void setCurrentTime(long now);
    
      /**
       * Set some date in the current period. Only unit tests should invoke this
       * method.
       * 
       * WARNING: method removed. A unit test should not set the
       * date in current period. It is the job of the FNATP to compute that.
       * 
       * @param date
       */
      //void setDateInCurrentPeriod(Date date); 
    }
    ����������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000166�00000000000�011570� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/rolling/TimeBasedFileNamingAndTriggeringPolicyBase.java�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/rolling/TimeBasedFileNamingAndTriggeri0000644�0001750�0001750�00000007066�12136042272�033176� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling;
    
    import java.io.File;
    import java.util.Date;
    
    import ch.qos.logback.core.rolling.helper.ArchiveRemover;
    import ch.qos.logback.core.rolling.helper.DateTokenConverter;
    import ch.qos.logback.core.rolling.helper.RollingCalendar;
    import ch.qos.logback.core.spi.ContextAwareBase;
    
    abstract public class TimeBasedFileNamingAndTriggeringPolicyBase<E> extends
            ContextAwareBase implements TimeBasedFileNamingAndTriggeringPolicy<E> {
    
      protected TimeBasedRollingPolicy<E> tbrp;
    
      protected ArchiveRemover archiveRemover = null;
      protected String elapsedPeriodsFileName;
      protected RollingCalendar rc;
    
      protected long artificialCurrentTime = -1;
      protected Date dateInCurrentPeriod = null;
    
      protected long nextCheck;
      protected boolean started = false;
    
      public boolean isStarted() {
        return started;
      }
    
      public void start() {
        DateTokenConverter dtc = tbrp.fileNamePattern.getPrimaryDateTokenConverter();
        if (dtc == null) {
          throw new IllegalStateException("FileNamePattern ["
                  + tbrp.fileNamePattern.getPattern()
                  + "] does not contain a valid DateToken");
        }
    
        rc = new RollingCalendar();
        rc.init(dtc.getDatePattern());
        addInfo("The date pattern is '" + dtc.getDatePattern()
                + "' from file name pattern '" + tbrp.fileNamePattern.getPattern()
                + "'.");
        rc.printPeriodicity(this);
    
        setDateInCurrentPeriod(new Date(getCurrentTime()));
        if (tbrp.getParentsRawFileProperty() != null) {
          File currentFile = new File(tbrp.getParentsRawFileProperty());
          if (currentFile.exists() && currentFile.canRead()) {
            setDateInCurrentPeriod(new Date(currentFile.lastModified()));
          }
        }
    
        addInfo("Setting initial period to " + dateInCurrentPeriod);
        computeNextCheck();
      }
    
      public void stop() {
        started = false;
      }
    
      protected void computeNextCheck() {
        nextCheck = rc.getNextTriggeringMillis(dateInCurrentPeriod);
      }
    
      protected void setDateInCurrentPeriod(long now) {
        dateInCurrentPeriod.setTime(now);
      }
    
      // allow Test classes to act on the dateInCurrentPeriod field to simulate old
      // log files needing rollover
      public void setDateInCurrentPeriod(Date _dateInCurrentPeriod) {
        this.dateInCurrentPeriod = _dateInCurrentPeriod;
      }
    
      public String getElapsedPeriodsFileName() {
        return elapsedPeriodsFileName;
      }
    
      public String getCurrentPeriodsFileNameWithoutCompressionSuffix() {
        return tbrp.fileNamePatternWCS.convert(dateInCurrentPeriod);
      }
    
      public void setCurrentTime(long timeInMillis) {
        artificialCurrentTime = timeInMillis;
      }
    
      public long getCurrentTime() {
        // if time is forced return the time set by user
        if (artificialCurrentTime >= 0) {
          return artificialCurrentTime;
        } else {
          return System.currentTimeMillis();
        }
      }
    
      public void setTimeBasedRollingPolicy(TimeBasedRollingPolicy<E> _tbrp) {
        this.tbrp = _tbrp;
    
      }
    
      public ArchiveRemover getArchiveRemover() {
        return archiveRemover;
      }
    
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/rolling/RolloverFailure.java����������0000644�0001750�0001750�00000001721�12136042272�031313� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling;
    
    
    import ch.qos.logback.core.LogbackException;
    
    /**
     * A RolloverFailure occurs if, for whatever reason a rollover fails.
     *
     * @author Ceki Gulcu
     */
    public class RolloverFailure extends LogbackException {
    
      private static final long serialVersionUID = -4407533730831239458L;
    
      public RolloverFailure(String msg) {
        super(msg);
      }
    
      public RolloverFailure(String message, Throwable cause) {
        super(message, cause);
      }
    }
    �����������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/package.html��������������������������0000644�0001750�0001750�00000000305�11377016712�026152� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
    
    <html> 
      <head>
        <title></title>
      </head>
      
      <body>
        
        <p>Contains the main classes of logback core.</p>
    
      </body> 
    </html>���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/recovery/�����������������������������0000755�0001750�0001750�00000000000�12203357067�025531� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000146�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/recovery/ResilientOutputStreamBase.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/recovery/ResilientOutputStreamBase.jav0000644�0001750�0001750�00000010467�12136042272�033363� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.recovery;
    
    import java.io.IOException;
    import java.io.OutputStream;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.status.ErrorStatus;
    import ch.qos.logback.core.status.InfoStatus;
    import ch.qos.logback.core.status.Status;
    import ch.qos.logback.core.status.StatusManager;
    
    abstract public class ResilientOutputStreamBase extends OutputStream {
    
      final static int STATUS_COUNT_LIMIT = 2 * 4;
    
      private int noContextWarning = 0;
      private int statusCount = 0;
    
      private Context context;
      private RecoveryCoordinator recoveryCoordinator;
    
      protected OutputStream os;
      protected boolean presumedClean = true;
    
      private boolean isPresumedInError() {
        // existence of recoveryCoordinator indicates failed state
        return (recoveryCoordinator != null && !presumedClean);
      }
    
      public void write(byte b[], int off, int len) {
        if (isPresumedInError()) {
          if (!recoveryCoordinator.isTooSoon()) {
            attemptRecovery();
          }
          return; // return regardless of the success of the recovery attempt
        }
    
        try {
          os.write(b, off, len);
          postSuccessfulWrite();
        } catch (IOException e) {
          postIOFailure(e);
        }
      }
    
      @Override
      public void write(int b) {
        if (isPresumedInError()) {
          if (!recoveryCoordinator.isTooSoon()) {
            attemptRecovery();
          }
          return; // return regardless of the success of the recovery attempt
        }
        try {
          os.write(b);
          postSuccessfulWrite();
        } catch (IOException e) {
          postIOFailure(e);
        }
      }
    
      @Override
      public void flush() {
        if (os != null) {
          try {
            os.flush();
            postSuccessfulWrite();
          } catch (IOException e) {
            postIOFailure(e);
          }
        }
      }
    
      abstract String getDescription();
    
      abstract OutputStream openNewOutputStream() throws IOException;
    
      private void postSuccessfulWrite() {
        if (recoveryCoordinator != null) {
          recoveryCoordinator = null;
          statusCount = 0;
          addStatus(new InfoStatus("Recovered from IO failure on "
              + getDescription(), this));
        }
      }
    
      void postIOFailure(IOException e) {
        addStatusIfCountNotOverLimit(new ErrorStatus("IO failure while writing to "
            + getDescription(), this, e));
        presumedClean = false;
        if (recoveryCoordinator == null) {
          recoveryCoordinator = new RecoveryCoordinator();
        }
      }
    
      @Override
      public void close() throws IOException {
        if (os != null) {
          os.close();
        }
      }
    
      void attemptRecovery() {
        try {
          close();
        } catch (IOException e) {
        }
    
        addStatusIfCountNotOverLimit(new InfoStatus(
            "Attempting to recover from IO failure on " + getDescription(), this));
    
        // subsequent writes must always be in append mode
        try {
          os = openNewOutputStream();
          presumedClean = true;
        } catch (IOException e) {
          addStatusIfCountNotOverLimit(new ErrorStatus("Failed to open "
              + getDescription(), this, e));
        }
      }
    
      void addStatusIfCountNotOverLimit(Status s) {
        ++statusCount;
        if (statusCount < STATUS_COUNT_LIMIT) {
          addStatus(s);
        }
    
        if (statusCount == STATUS_COUNT_LIMIT) {
          addStatus(s);
          addStatus(new InfoStatus("Will supress future messages regarding "
              + getDescription(), this));
        }
      }
    
      public void addStatus(Status status) {
        if (context == null) {
          if (noContextWarning++ == 0) {
            System.out.println("LOGBACK: No context given for " + this);
          }
          return;
        }
        StatusManager sm = context.getStatusManager();
        if (sm != null) {
          sm.add(status);
        }
      }
    
      public Context getContext() {
        return context;
      }
    
      public void setContext(Context context) {
        this.context = context;
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/recovery/RecoveryCoordinator.java�����0000644�0001750�0001750�00000003041�12136042272�032366� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.recovery;
    
    public class RecoveryCoordinator {
    
      public final static long BACKOFF_COEFFICIENT_MIN = 20;
      static long BACKOFF_COEFFICIENT_MAX = 327680;  // BACKOFF_COEFFICIENT_MIN * 4^7
      
      private long backOffCoefficient = BACKOFF_COEFFICIENT_MIN;
      
      private static long UNSET = -1;
      private long currentTime = UNSET;
      long next = System.currentTimeMillis()+getBackoffCoefficient();
      
      public boolean isTooSoon() {
        long now = getCurrentTime();
        if(now > next) {
          next = now + getBackoffCoefficient();
          return false;
        } else {
          return true;
        }
      }
      
      void setCurrentTime(long forcedTime) {
        currentTime = forcedTime;
      }
      
      private long getCurrentTime() {
        if(currentTime != UNSET) {
          return currentTime;
        }
        return System.currentTimeMillis();
      }
      
      private long getBackoffCoefficient() {
        long currentCoeff = backOffCoefficient;
        if(backOffCoefficient < BACKOFF_COEFFICIENT_MAX) {
          backOffCoefficient*=4;
        }
        return currentCoeff;
      }
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000146�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/recovery/ResilientFileOutputStream.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/recovery/ResilientFileOutputStream.jav0000644�0001750�0001750�00000003056�12136042272�033364� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.recovery;
    
    import java.io.*;
    import java.nio.channels.FileChannel;
    
    public class ResilientFileOutputStream extends ResilientOutputStreamBase {
    
      private File file;
      private FileOutputStream fos;
    
    
      public ResilientFileOutputStream(File file, boolean append)
          throws FileNotFoundException {
        this.file = file;
        fos = new FileOutputStream(file, append);
        this.os = new BufferedOutputStream(fos);
        this.presumedClean = true;
      }
    
      public FileChannel getChannel() {
        if (os == null) {
          return null;
        }
        return fos.getChannel();
      }
    
      public File getFile() {
        return file;
      }
    
      @Override
      String getDescription() {
        return "file ["+file+"]";
      }
    
      @Override
      OutputStream openNewOutputStream() throws IOException {
        // see LOGBACK-765
        fos = new FileOutputStream(file, true);
        return new BufferedOutputStream(fos);
      }
      
      @Override
      public String toString() {
        return "c.q.l.c.recovery.ResilientFileOutputStream@"
            + System.identityHashCode(this);
      }
    
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000150�00000000000�011561� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/recovery/ResilientSyslogOutputStream.java�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/recovery/ResilientSyslogOutputStream.j0000644�0001750�0001750�00000002734�12136042272�033440� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.recovery;
    
    import java.io.IOException;
    import java.io.OutputStream;
    import java.net.SocketException;
    import java.net.UnknownHostException;
    
    import ch.qos.logback.core.net.SyslogOutputStream;
    
    public class ResilientSyslogOutputStream extends ResilientOutputStreamBase {
    
    
      String syslogHost;
      int port;
      
      public ResilientSyslogOutputStream(String syslogHost, int port)
          throws UnknownHostException, SocketException {
        this.syslogHost = syslogHost;
        this.port = port;
        super.os = new SyslogOutputStream(syslogHost, port);
        this.presumedClean = true;
      }
    
      @Override
      String getDescription() {
        return "syslog ["+syslogHost+":"+port+"]";
      }
    
      @Override
      OutputStream openNewOutputStream() throws IOException {
        return  new SyslogOutputStream(syslogHost, port);
      }
      
      @Override
      public String toString() {
        return "c.q.l.c.recovery.ResilientSyslogOutputStream@"
            + System.identityHashCode(this);
      }
    
    }
    ������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/util/���������������������������������0000755�0001750�0001750�00000000000�12203357067�024650� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/util/CachingDateFormatter.java��������0000644�0001750�0001750�00000003103�12136042272�031520� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.util;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.TimeZone;
    
    /**
     * A synchronized implementation of  SimpleDateFormat which uses caching internally.
     *
     * @author Ceki G&uuml;c&uuml;
     * @since 0.9.29
     */
    public class CachingDateFormatter {
    
    
      long lastTimestamp = -1;
      String cachedStr = null;
      final SimpleDateFormat sdf;
    
      public CachingDateFormatter(String pattern) {
        sdf = new SimpleDateFormat(pattern);
      }
    
      public final String format(long now) {
    
        // SimpleDateFormat is not thread safe.
    
        // See also the discussion in http://jira.qos.ch/browse/LBCLASSIC-36
        // DateFormattingThreadedThroughputCalculator and SelectiveDateFormattingRunnable
        // are also note worthy
    
        // The now == lastTimestamp guard minimizes synchronization
        synchronized (this) {
          if (now != lastTimestamp) {
            lastTimestamp = now;
            cachedStr = sdf.format(new Date(now));
          }
          return cachedStr;
        }
      }
    
      public void setTimeZone(TimeZone tz) {
        sdf.setTimeZone(tz);
      }
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/util/package.html���������������������0000644�0001750�0001750�00000000246�11377016712�027133� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
    
    <html>
    <head>
    <title></title>
    </head>
    
    <body>
    
    <p>Contains various utility classes.</p>
    
    </body>
    </html>
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/util/TimeUtil.java��������������������0000644�0001750�0001750�00000005154�12136042272�027246� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.util;
    
    import java.util.Calendar;
    import java.util.Date;
    
    public class TimeUtil {
    
      
      public static long computeStartOfNextSecond(long now) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(new Date(now));
        cal.set(Calendar.MILLISECOND, 0);
        cal.add(Calendar.SECOND, 1);
        return cal.getTime().getTime();
      }
    
      public static long computeStartOfNextMinute(long now) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(new Date(now));
        cal.set(Calendar.MILLISECOND, 0);
        cal.set(Calendar.SECOND, 0);
        cal.add(Calendar.MINUTE, 1);
        return cal.getTime().getTime();
      }
    
      public static long computeStartOfNextHour(long now) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(new Date(now));
        cal.set(Calendar.MILLISECOND, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.add(Calendar.HOUR, 1);
        return cal.getTime().getTime();
      }
      
      public static long computeStartOfNextDay(long now) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(new Date(now));
    
        cal.add(Calendar.DAY_OF_MONTH, 1);
        cal.set(Calendar.MILLISECOND, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.HOUR_OF_DAY, 0);
        return cal.getTime().getTime();
      }
      
      public static long computeStartOfNextWeek(long now) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(new Date(now));
        
        cal.set(Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek());
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MILLISECOND, 0);
        cal.add(Calendar.WEEK_OF_YEAR, 1);
        return cal.getTime().getTime();
      }
    
      public static long computeStartOfNextMonth(long now) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(new Date(now));
    
        cal.set(Calendar.DATE, 1);
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MILLISECOND, 0);
        cal.add(Calendar.MONTH, 1);
        return cal.getTime().getTime();
      }
      
      
    
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/util/OptionHelper.java����������������0000644�0001750�0001750�00000021301�12142503511�030105� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.util;
    
    import java.lang.reflect.Constructor;
    import java.util.Properties;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.spi.ContextAware;
    import ch.qos.logback.core.spi.PropertyContainer;
    import ch.qos.logback.core.spi.ScanException;
    import ch.qos.logback.core.subst.NodeToStringTransformer;
    
    /**
     * @author Ceki Gulcu
     */
    public class OptionHelper {
    
      public static Object instantiateByClassName(String className,
                                                  Class<?> superClass, Context context) throws IncompatibleClassException,
              DynamicClassLoadingException {
        ClassLoader classLoader = Loader.getClassLoaderOfObject(context);
        return instantiateByClassName(className, superClass, classLoader);
      }
    
      public static Object instantiateByClassNameAndParameter(String className,
                                                              Class<?> superClass, Context context, Class<?> type, Object param) throws IncompatibleClassException,
              DynamicClassLoadingException {
        ClassLoader classLoader = Loader.getClassLoaderOfObject(context);
        return instantiateByClassNameAndParameter(className, superClass, classLoader, type, param);
      }
    
      public static Object instantiateByClassName(String className,
                                                  Class<?> superClass, ClassLoader classLoader)
              throws IncompatibleClassException, DynamicClassLoadingException {
        return instantiateByClassNameAndParameter(className, superClass, classLoader, null, null);
      }
    
      public static Object instantiateByClassNameAndParameter(String className,
                                                              Class<?> superClass, ClassLoader classLoader, Class<?> type, Object parameter)
              throws IncompatibleClassException, DynamicClassLoadingException {
    
        if (className == null) {
          throw new NullPointerException();
        }
        try {
          Class<?> classObj = null;
          classObj = classLoader.loadClass(className);
          if (!superClass.isAssignableFrom(classObj)) {
            throw new IncompatibleClassException(superClass, classObj);
          }
          if (type == null) {
            return classObj.newInstance();
          } else {
            Constructor<?> constructor = classObj.getConstructor(type);
            return constructor.newInstance(parameter);
          }
        } catch (IncompatibleClassException ice) {
          throw ice;
        } catch (Throwable t) {
          throw new DynamicClassLoadingException("Failed to instantiate type "
                  + className, t);
        }
      }
    
      /**
       * Find the value corresponding to <code>key</code> in <code>props</code>.
       * Then perform variable substitution on the found value.
       */
      // public static String findAndSubst(String key, Properties props) {
      // String value = props.getProperty(key);
      //
      // if (value == null) {
      // return null;
      // }
      //
      // try {
      // return substVars(value, props);
      // } catch (IllegalArgumentException e) {
      // return value;
      // }
      // }
      final static String DELIM_START = "${";
      final static char DELIM_STOP = '}';
      final static String DELIM_DEFAULT = ":-";
    
      final static int DELIM_START_LEN = 2;
      final static int DELIM_STOP_LEN = 1;
      final static int DELIM_DEFAULT_LEN = 2;
    
      final static String _IS_UNDEFINED = "_IS_UNDEFINED";
    
      /**
       * @see #substVars(String, PropertyContainer, PropertyContainer)
       */
      public static String substVars(String val, PropertyContainer pc1) {
        return substVars(val, pc1, null);
      }
    
      /**
       * See  http://logback.qos.ch/manual/configuration.html#variableSubstitution
       */
      public static String substVars(String input, PropertyContainer pc0, PropertyContainer pc1) {
        try {
          String replacement = NodeToStringTransformer.substituteVariable(input, pc0, pc1);
          // for backward compatibility sake, perform one level of recursion
          if(replacement.contains(DELIM_START)) {
            replacement =  NodeToStringTransformer.substituteVariable(replacement, pc0, pc1);
          }
          return replacement;
        } catch (ScanException e) {
          throw new IllegalArgumentException("Failed to parse input [" + input + "]", e);
        }
      }
    
      public static String propertyLookup(String key, PropertyContainer pc1,
                                          PropertyContainer pc2) {
        String value = null;
        // first try the props passed as parameter
        value = pc1.getProperty(key);
    
        // then try  the pc2
        if (value == null && pc2 != null) {
          value = pc2.getProperty(key);
        }
        // then try in System properties
        if (value == null) {
          value = getSystemProperty(key, null);
        }
        if (value == null) {
          value = getEnv(key);
        }
        return value;
      }
    
      /**
       * Very similar to <code>System.getProperty</code> except that the
       * {@link SecurityException} is absorbed.
       *
       * @param key The key to search for.
       * @param def The default value to return.
       * @return the string value of the system property, or the default value if
       *         there is no property with that key.
       */
      public static String getSystemProperty(String key, String def) {
        try {
          return System.getProperty(key, def);
        } catch (SecurityException e) {
          return def;
        }
      }
    
      /**
       * Lookup a key from the environment.
       *
       * @param key
       * @return value corresponding to key from the OS environment
       */
      public static String getEnv(String key) {
        try {
          return System.getenv(key);
        } catch (SecurityException e) {
          return null;
        }
      }
    
    
      /**
       * Very similar to <code>System.getProperty</code> except that the
       * {@link SecurityException} is absorbed.
       *
       * @param key The key to search for.
       * @return the string value of the system property.
       */
      public static String getSystemProperty(String key) {
        try {
          return System.getProperty(key);
        } catch (SecurityException e) {
          return null;
        }
      }
    
      public static void setSystemProperties(ContextAware contextAware, Properties props) {
        for (Object o : props.keySet()) {
          String key = (String) o;
          String value = props.getProperty(key);
          setSystemProperty(contextAware, key, value);
        }
      }
    
      public static void setSystemProperty(ContextAware contextAware, String key, String value) {
        try {
          System.setProperty(key, value);
        } catch (SecurityException e) {
          contextAware.addError("Failed to set system property [" + key + "]", e);
        }
      }
    
      /**
       * Very similar to {@link System#getProperties()} except that the
       * {@link SecurityException} is absorbed.
       *
       * @return the system properties
       */
      public static Properties getSystemProperties() {
        try {
          return System.getProperties();
        } catch (SecurityException e) {
          return new Properties();
        }
      }
    
      /**
       * Return a String[] of size two. The first item containing the key part and the second item
       * containing a default value specified by the user. The second item will be null if no default value
       * is specified.
       *
       * @param key
       * @return
       */
      static public String[] extractDefaultReplacement(String key) {
        String[] result = new String[2];
        if(key == null)
          return result;
    
        result[0] = key;
        int d = key.indexOf(DELIM_DEFAULT);
        if (d != -1) {
          result[0] = key.substring(0, d);
          result[1] = key.substring(d + DELIM_DEFAULT_LEN);
        }
        return result;
      }
    
      /**
       * If <code>value</code> is "true", then <code>true</code> is returned. If
       * <code>value</code> is "false", then <code>true</code> is returned.
       * Otherwise, <code>default</code> is returned.
       * <p/>
       * <p> Case of value is unimportant.
       */
      public static boolean toBoolean(String value, boolean dEfault) {
        if (value == null) {
          return dEfault;
        }
    
        String trimmedVal = value.trim();
    
        if ("true".equalsIgnoreCase(trimmedVal)) {
          return true;
        }
    
        if ("false".equalsIgnoreCase(trimmedVal)) {
          return false;
        }
    
        return dEfault;
      }
    
      public static boolean isEmpty(String str) {
        return ((str == null) || CoreConstants.EMPTY_STRING.equals(str));
      }
    
    
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/util/CloseUtil.java�������������������0000644�0001750�0001750�00000003507�12136042272�027415� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.util;
    
    import java.io.Closeable;
    import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    /**
     * Static utility method for {@link Closeable} objects.
     *
     * @author Carl Harris
     */
    public class CloseUtil {
    
      /**
       * Closes a closeable while suppressing any {@code IOException} that occurs.
       * @param closeable the socket to close
       */
      public static void closeQuietly(Closeable closeable) {
        if (closeable == null) return;
        try {
          closeable.close();
        }
        catch (IOException ex) {
          assert true;  // avoid an empty catch
        }
      }
    
      /**
       * Closes a socket while suppressing any {@code IOException} that occurs.
       * @param socket the socket to close
       */
      public static void closeQuietly(Socket socket) {
        if (socket == null) return;
        try {
          socket.close();
        }
        catch (IOException ex) {
          assert true;  // avoid an empty catch
        }
      }
    
      /**
       * Closes a server socket while suppressing any {@code IOException} that 
       * occurs.
       * @param serverSocket the socket to close
       */
      public static void closeQuietly(ServerSocket serverSocket) {
        if (serverSocket == null) return;
        try {
          serverSocket.close();
        }
        catch (IOException ex) {
          assert true;  // avoid an empty catch
        }
      }
    
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/util/StatusPrinter.java���������������0000644�0001750�0001750�00000013140�12136042272�030333� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.util;
    
    import java.io.PrintStream;
    import java.util.Iterator;
    import java.util.List;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.helpers.ThrowableToStringArray;
    import ch.qos.logback.core.status.*;
    
    import static ch.qos.logback.core.status.StatusUtil.filterStatusListByTimeThreshold;
    
    public class StatusPrinter {
    
      private static PrintStream ps = System.out;
    
      static CachingDateFormatter cachingDateFormat = new CachingDateFormatter(
          "HH:mm:ss,SSS");
    
      public static void setPrintStream(PrintStream printStream) {
        ps = printStream;
      }
    
      /**
       * Print the contents of the context statuses, but only if they contain
       * warnings or errors.
       *
       * @param context
       */
      public static void printInCaseOfErrorsOrWarnings(Context context) {
        printInCaseOfErrorsOrWarnings(context, 0);
      }
    
      /**
       * Print the contents of the context status, but only if they contain
       * warnings or errors occurring later then the threshold.
       *
       * @param context
       */
      public static void printInCaseOfErrorsOrWarnings(Context context, long threshold) {
        if (context == null) {
          throw new IllegalArgumentException("Context argument cannot be null");
        }
    
        StatusManager sm = context.getStatusManager();
        if (sm == null) {
          ps.println("WARN: Context named \"" + context.getName()
              + "\" has no status manager");
        } else {
          StatusUtil statusUtil = new StatusUtil(context);
          if (statusUtil.getHighestLevel(threshold) >= ErrorStatus.WARN) {
            print(sm, threshold);
          }
        }
      }
    
      /**
       * Print the contents of the context statuses, but only if they contain
       * errors.
       *
       * @param context
       */
      public static void printIfErrorsOccured(Context context) {
        if (context == null) {
          throw new IllegalArgumentException("Context argument cannot be null");
        }
    
        StatusManager sm = context.getStatusManager();
        if (sm == null) {
          ps.println("WARN: Context named \"" + context.getName()
              + "\" has no status manager");
        } else {
          StatusUtil statusUtil = new StatusUtil(context);
          if (statusUtil.getHighestLevel(0) == ErrorStatus.ERROR) {
            print(sm);
          }
        }
      }
    
      /**
       * Print the contents of the context's status data.
       *
       * @param context
       */
      public static void print(Context context) {
        print(context, 0);
      }
    
       /**
       * Print context's status data with a timestamp higher than the threshold.
       * @param context
       */
       public static void print(Context context, long threshold) {
         if (context == null) {
           throw new IllegalArgumentException("Context argument cannot be null");
         }
    
         StatusManager sm = context.getStatusManager();
         if (sm == null) {
           ps.println("WARN: Context named \"" + context.getName()
               + "\" has no status manager");
         } else {
           print(sm, threshold);
         }
       }
    
      public static void print(StatusManager sm) {
        print(sm, 0);
      }
    
      public static void print(StatusManager sm, long threshold) {
        StringBuilder sb = new StringBuilder();
        List<Status> filteredList = filterStatusListByTimeThreshold(sm.getCopyOfStatusList(), threshold);
        buildStrFromStatusList(sb, filteredList);
        ps.println(sb.toString());
      }
    
    
      public static void print(List<Status> statusList) {
        StringBuilder sb = new StringBuilder();
        buildStrFromStatusList(sb, statusList);
        ps.println(sb.toString());
      }
    
    
      private static void buildStrFromStatusList(StringBuilder sb, List<Status> statusList) {
        if(statusList == null)
          return;
        for(Status s : statusList) {
          buildStr(sb, "", s);
        }
      }
    
    //  private static void buildStrFromStatusManager(StringBuilder sb, StatusManager sm) {
    //  }
    
    
      private static void appendThrowable(StringBuilder sb, Throwable t) {
        String[] stringRep = ThrowableToStringArray.convert(t);
    
        for (String s : stringRep) {
          if (s.startsWith(CoreConstants.CAUSED_BY)) {
            // nothing
          } else if (Character.isDigit(s.charAt(0))) {
            // if line resembles "48 common frames omitted"
            sb.append("\t... ");
          } else {
            // most of the time. just add a tab+"at"
            sb.append("\tat ");
          }
          sb.append(s).append(CoreConstants.LINE_SEPARATOR);
        }
      }
    
      public static void buildStr(StringBuilder sb, String indentation, Status s) {
        String prefix;
        if (s.hasChildren()) {
          prefix = indentation + "+ ";
        } else {
          prefix = indentation + "|-";
        }
    
        if (cachingDateFormat != null) {
          String dateStr = cachingDateFormat.format(s.getDate());
          sb.append(dateStr).append(" ");
        }
        sb.append(prefix).append(s).append(CoreConstants.LINE_SEPARATOR);
    
        if (s.getThrowable() != null) {
          appendThrowable(sb, s.getThrowable());
        }
        if (s.hasChildren()) {
          Iterator<Status> ite = s.iterator();
          while (ite.hasNext()) {
            Status child = ite.next();
            buildStr(sb, indentation + "  ", child);
          }
        }
      }
    
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/util/FileUtil.java��������������������0000644�0001750�0001750�00000007347�12136042272�027235� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.util;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.rolling.RolloverFailure;
    import ch.qos.logback.core.spi.ContextAwareBase;
    
    import java.io.*;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.net.URLConnection;
    
    public class FileUtil extends ContextAwareBase {
    
      public FileUtil(Context context) {
        setContext(context);
      }
    
      public static URL fileToURL(File file) {
        try {
          return file.toURI().toURL();
        } catch (MalformedURLException e) {
          throw new RuntimeException("Unexpected exception on file [" + file + "]", e);
        }
      }
    
      static public boolean isParentDirectoryCreationRequired(File file) {
        File parent = file.getParentFile();
        if (parent != null && !parent.exists()) {
          return true;
        } else {
          return false;
        }
      }
    
      static public boolean createMissingParentDirectories(File file) {
        File parent = file.getParentFile();
        if (parent == null) {
          throw new IllegalStateException(file + " should not have a null parent");
        }
        if (parent.exists()) {
          throw new IllegalStateException(file + " should not have existing parent directory");
        }
        return parent.mkdirs();
      }
    
    
      public String resourceAsString(ClassLoader classLoader, String resourceName) {
        URL url = classLoader.getResource(resourceName);
        if (url == null) {
          addError("Failed to find resource [" + resourceName + "]");
          return null;
        }
    
        InputStreamReader isr = null;
        try {
          URLConnection urlConnection = url.openConnection();
          urlConnection.setUseCaches(false);
          isr = new InputStreamReader(urlConnection.getInputStream());
          char[] buf = new char[128];
          StringBuilder builder = new StringBuilder();
          int count = -1;
          while ((count = isr.read(buf, 0, buf.length)) != -1) {
            builder.append(buf, 0, count);
          }
          return builder.toString();
        } catch (IOException e) {
          addError("Failed to open " + resourceName, e);
        } finally {
          if (isr != null) {
            try {
              isr.close();
            } catch (IOException e) {
              // ignore
            }
          }
        }
        return null;
      }
    
      static final int BUF_SIZE = 32 * 1024;
    
      public void copy(String src, String destination) throws RolloverFailure {
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        try {
          bis = new BufferedInputStream(new FileInputStream(src));
          bos = new BufferedOutputStream(new FileOutputStream(destination));
          byte[] inbuf = new byte[BUF_SIZE];
          int n;
    
          while ((n = bis.read(inbuf)) != -1) {
            bos.write(inbuf, 0, n);
          }
    
          bis.close();
          bis = null;
          bos.close();
          bos = null;
        } catch (IOException ioe) {
          String msg = "Failed to copy [" + src + "] to [" + destination + "]";
          addError(msg, ioe);
          throw new RolloverFailure(msg);
        } finally {
          if (bis != null) {
            try {
              bis.close();
            } catch (IOException e) {
              // ignore
            }
          }
          if (bos != null) {
            try {
              bos.close();
            } catch (IOException e) {
              // ignore
            }
          }
        }
      }
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/util/EnvUtil.java���������������������0000644�0001750�0001750�00000003605�12136042272�027077� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.util;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * @author Ceki G&uuml;c&uuml;
     */
    public class EnvUtil {
    
    
      static private boolean isJDK_N_OrHigher(int n) {
         List<String> versionList = new ArrayList<String>();
         // this code should work at least until JDK 10 (assuming n parameter is
         // always 6 or more)
         for (int i = 0; i < 5; i++) {
           versionList.add("1." + (n + i));
         }
    
         String javaVersion = System.getProperty("java.version");
         if (javaVersion == null) {
           return false;
         }
         for (String v : versionList) {
           if (javaVersion.startsWith(v))
             return true;
         }
         return false;
       }
    
      static public boolean isJDK5() {
        return isJDK_N_OrHigher(5);
      }
    
       static public boolean isJDK6OrHigher() {
         return isJDK_N_OrHigher(6);
       }
    
       static public boolean isJDK7OrHigher() {
         return isJDK_N_OrHigher(7);
       }
    
      static public boolean isJaninoAvailable() {
        ClassLoader classLoader = EnvUtil.class.getClassLoader();
        try {
          Class<?> bindingClass = classLoader.loadClass("org.codehaus.janino.ScriptEvaluator");
          return (bindingClass != null);
        } catch (ClassNotFoundException e) {
          return false;
        }
      }
    
      public static boolean isWindows() {
        String os = System.getProperty("os.name");
        return os.startsWith("Windows");
      }
    
    }
    ���������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/util/AggregationType.java�������������0000644�0001750�0001750�00000002422�12136042272�030576� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.util;
    
    /**
     * AggregationType classifies how one object is contained within 
     * another object.
     * 
     * 
     * 
     * See also http://en.wikipedia.org/wiki/Class_diagram
     * and http://en.wikipedia.org/wiki/Object_composition
     * 
     * @author Ceki Gulcu
     */
    public enum AggregationType {
      NOT_FOUND, 
      AS_BASIC_PROPERTY, // Long, Integer, Double,..., java primitive, String,
                          // Duration or FileSize
      AS_COMPLEX_PROPERTY, // a complex property, a.k.a. attribute, is any attribute 
                           // not covered by basic attributes, i.e. 
                           // object types defined by the user
      AS_BASIC_PROPERTY_COLLECTION, // a collection of basic attributes
      AS_COMPLEX_PROPERTY_COLLECTION; // a collection of complex attributes
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/util/CharSequenceToRegexMapper.java���0000644�0001750�0001750�00000003563�12136042272�032525� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.util;
    
    /**
     * This class supports mapping character sequences to
     * regular expressions as appropriate for SimpleDateFormatter.
     * 
     * @author Ceki
     * 
     */
    class CharSequenceToRegexMapper {
    
      String toRegex(CharSequenceState css) {
        final int occurrences = css.occurrences;
        final char c = css.c;
        switch (css.c) {
        case 'G':
        case 'z':
          return ".*";
        case 'M':
          if (occurrences >= 3) {
            return ".{3,12}";
          } else {
            return number(occurrences);
          }
        case 'y':
        case 'w':
        case 'W':
        case 'D':
        case 'd':
        case 'F':
        case 'H':
        case 'k':
        case 'K':
        case 'h':
        case 'm':
        case 's':
        case 'S':
          return number(occurrences);
        case 'E':
          return ".{2,12}";
        case 'a':
          return ".{2}";
        case 'Z':
          return "(\\+|-)\\d{4}";
        case '.':
          return "\\.";
        case '\\': 
          throw new IllegalStateException("Forward slashes are not allowed");
        case '\'':
          if (occurrences == 1) {
            return "";
          }
          throw new IllegalStateException("Too many single quotes");
        default:
          if (occurrences == 1) {
            return "" + c;
          } else {
            return c + "{" + occurrences + "}";
          }
        }
      }
    
      private String number(int occurrences) {
        return "\\d{" + occurrences + "}";
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/util/SystemInfo.java������������������0000644�0001750�0001750�00000001243�12136042272�027605� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.util;
    
    
    
    public class SystemInfo {
      
      public static String getJavaVendor() {
        return OptionHelper.getSystemProperty("java.vendor", null);
      }
    
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/util/Duration.java��������������������0000644�0001750�0001750�00000010407�12136504561�027300� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.util;
    
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    /**
     * Duration instances represent a lapse of time. Internally, the duration is
     * stored in milliseconds. This class follows the {@link #valueOf} convention meaning that it can
     * convert an appropriately formatted string into a Duration object.
     *
     * <p>For example, string such as "3.5 minutes" or "5 hours" can be converted into Durations.
     * The recognized units of time are the "millisecond", "second", "minute" "hour" and "day".
     * The unit name may be followed by an "s". Thus, "2 day" and "2 days" are equivalent. In the
     * absence of a time unit specification, milliseconds are assumed.
     * 
     * 
     * @author Ceki Gulcu
     */
    public class Duration {
    
      private final static String DOUBLE_PART = "([0-9]*(.[0-9]+)?)";
      private final static int DOUBLE_GROUP = 1;
    
      private final static String UNIT_PART = "(|milli(second)?|second(e)?|minute|hour|day)s?";
      private final static int UNIT_GROUP = 3;
    
      private static final Pattern DURATION_PATTERN = Pattern.compile(DOUBLE_PART
          + "\\s*" + UNIT_PART, Pattern.CASE_INSENSITIVE);
    
      static final long SECONDS_COEFFICIENT = 1000;
      static final long MINUTES_COEFFICIENT = 60 * SECONDS_COEFFICIENT;
      static final long HOURS_COEFFICIENT = 60 * MINUTES_COEFFICIENT;
      static final long DAYS_COEFFICIENT = 24 * HOURS_COEFFICIENT;
    
      final long millis;
    
      public Duration(long millis) {
        this.millis = millis;
      }
    
      public static Duration buildByMilliseconds(double value) {
        return new Duration((long) (value));
      }
    
      public static Duration buildBySeconds(double value) {
        return new Duration((long) (SECONDS_COEFFICIENT * value));
      }
    
      public static Duration buildByMinutes(double value) {
        return new Duration((long) (MINUTES_COEFFICIENT * value));
      }
    
      public static Duration buildByHours(double value) {
        return new Duration((long) (HOURS_COEFFICIENT * value));
      }
    
      public static Duration buildByDays(double value) {
        return new Duration((long) (DAYS_COEFFICIENT * value));
      }
    
      public static Duration buildUnbounded() {
        return new Duration(Long.MAX_VALUE);
      }
    
      public long getMilliseconds() {
        return millis;
      }
    
      public static Duration valueOf(String durationStr) {
        Matcher matcher = DURATION_PATTERN.matcher(durationStr);
    
        if (matcher.matches()) {
          String doubleStr = matcher.group(DOUBLE_GROUP);
          String unitStr = matcher.group(UNIT_GROUP);
    
          double doubleValue = Double.valueOf(doubleStr);
          if (unitStr.equalsIgnoreCase("milli")
              || unitStr.equalsIgnoreCase("millisecond") || unitStr.length() == 0) {
            return buildByMilliseconds(doubleValue);
          } else if (unitStr.equalsIgnoreCase("second")
              || unitStr.equalsIgnoreCase("seconde")) {
            return buildBySeconds(doubleValue);
          } else if (unitStr.equalsIgnoreCase("minute")) {
            return buildByMinutes(doubleValue);
          } else if (unitStr.equalsIgnoreCase("hour")) {
            return buildByHours(doubleValue);
          } else if (unitStr.equalsIgnoreCase("day")) {
            return buildByDays(doubleValue);
          } else {
            throw new IllegalStateException("Unexpected " + unitStr);
          }
        } else {
          throw new IllegalArgumentException("String value [" + durationStr
              + "] is not in the expected format.");
        }
      }
    
      @Override
      public String toString() {
        if (millis < SECONDS_COEFFICIENT) {
          return millis + " milliseconds";
        } else if (millis < MINUTES_COEFFICIENT) {
          return millis / SECONDS_COEFFICIENT + " seconds";
        } else if (millis < HOURS_COEFFICIENT) {
          return millis / MINUTES_COEFFICIENT + " minutes";
        } else {
          return millis / HOURS_COEFFICIENT + " hours";
        }
    
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/util/DatePatternToRegexUtil.java������0000644�0001750�0001750�00000003664�12136042272�032065� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.util;
    
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * This class is concerned with computing a regex corresponding to a date
     * pattern (in {@link SimpleDateFormat} format).
     *
     * @author Ceki G&uuml;lc&uuml;
     */
    public class DatePatternToRegexUtil {
    
      final String datePattern;
      final int datePatternLength;
      final CharSequenceToRegexMapper regexMapper = new CharSequenceToRegexMapper();
    
      public DatePatternToRegexUtil(String datePattern) {
        this.datePattern = datePattern;
        datePatternLength = datePattern.length();
      }
    
      public String toRegex() {
        List<CharSequenceState> charSequenceList = tokenize();
        StringBuilder sb = new StringBuilder();
        for (CharSequenceState seq : charSequenceList) {
          sb.append(regexMapper.toRegex(seq));
        }
        return sb.toString();
      }
    
      private List<CharSequenceState> tokenize() {
        List<CharSequenceState> sequenceList = new ArrayList<CharSequenceState>();
    
        CharSequenceState lastCharSequenceState = null;
    
        for (int i = 0; i < datePatternLength; i++) {
          char t = datePattern.charAt(i);
          if (lastCharSequenceState == null || lastCharSequenceState.c != t) {
            lastCharSequenceState = new CharSequenceState(t);
            sequenceList.add(lastCharSequenceState);
          } else {
            lastCharSequenceState.incrementOccurrences();
          }
        }
        return sequenceList;
      }
    }
    ����������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/util/PropertySetterException.java�����0000644�0001750�0001750�00000002144�12136042272�032400� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.util;
    
    /**
     * Thrown when an error is encountered whilst attempting to set a property
     * using the {@link ch.qos.logback.core.joran.util.PropertySetter} utility class.
     * 
     * @author Anders Kristensen
     */
    public class PropertySetterException extends Exception {
    
      private static final long serialVersionUID = -2771077768281663949L;
    
      public PropertySetterException(String msg) {
        super(msg);
      }
    
      public PropertySetterException(Throwable rootCause) {
        super(rootCause);
      }
    
      public PropertySetterException(String message, Throwable cause) {
        super(message, cause);
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/util/InvocationGate.java��������������0000644�0001750�0001750�00000004607�12136042272�030426� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.util;
    
    /**
     * This class serves as a gateway for invocations of a "costly" operation on a critical execution path.
     *
     * @author Ceki G&uuml;lc&uuml;
     */
    public class InvocationGate {
    
      // experiments indicate that even for the most CPU intensive applications with 200 or more threads MASK
      // values in the order of 0xFFFF is appropriate
      private static final int MAX_MASK = 0xFFFF;
    
      private volatile long mask = 0xF;
      private volatile long lastMaskCheck = System.currentTimeMillis();
    
    
       // IMPORTANT: This field can be updated by multiple threads. It follows that
      // its values may *not* be incremented sequentially. However, we don't care
      // about the actual value of the field except that from time to time the
      // expression (invocationCounter++ & mask) == mask) should be true.
      private long invocationCounter = 0;
    
    
      // if less than thresholdForMaskIncrease milliseconds elapse between invocations of updateMaskIfNecessary()
      // method, then the mask should be increased
      private static final long thresholdForMaskIncrease = 100;
    
      // if more than thresholdForMaskDecrease milliseconds elapse between invocations of updateMaskIfNecessary() method,
      // then the mask should be decreased
      private final long thresholdForMaskDecrease = thresholdForMaskIncrease*8;
    
    
      public boolean skipFurtherWork() {
         return ((invocationCounter++) & mask) != mask;
      }
    
      // update the mask so as to execute change detection code about once every 100 to 8000 milliseconds.
      public void updateMaskIfNecessary(long now) {
        final long timeElapsedSinceLastMaskUpdateCheck = now - lastMaskCheck;
        lastMaskCheck = now;
        if (timeElapsedSinceLastMaskUpdateCheck < thresholdForMaskIncrease && (mask < MAX_MASK)) {
          mask = (mask << 1) | 1;
        } else if (timeElapsedSinceLastMaskUpdateCheck > thresholdForMaskDecrease) {
          mask = mask >>> 2;
        }
      }
    }
    �������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/util/LocationUtil.java����������������0000644�0001750�0001750�00000004640�12136042272�030117� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.util;
    
    import java.io.FileNotFoundException;
    import java.net.MalformedURLException;
    import java.net.URL;
    
    
    /**
     * A static utility method that converts a string that describes the
     * location of a resource into a {@link URL} object.
     *
     * @author Carl Harris
     */
    public class LocationUtil {
    
      
      /** Regex pattern for a URL scheme (reference RFC 2396 section 3) */
      public static final String SCHEME_PATTERN =
          "^\\p{Alpha}[\\p{Alnum}+.-]*:.*$";
    
      /** Scheme name for a classpath resource */
      public static final String CLASSPATH_SCHEME = "classpath:";
      
      /**
       * Converts a string describing the location of a resource into a URL object.
       * @param location String describing the location
       * @return URL object that refers to {@code location}
       * @throws MalformedURLException if {@code location} is not a syntatically
       *    valid URL
       * @throws FileNotFoundException if {@code location} specifies a non-existent
       *    classpath resource
       * @throws NullPointerException if {@code location} is {@code null}
       */
      public static URL urlForResource(String location) 
          throws MalformedURLException, FileNotFoundException {
        if (location == null) {
          throw new NullPointerException("location is required");
        }
        URL url = null;
        if (!location.matches(SCHEME_PATTERN)) { 
          url = Loader.getResourceBySelfClassLoader(location);
        }
        else if (location.startsWith(CLASSPATH_SCHEME)) {
          String path = location.substring(CLASSPATH_SCHEME.length());
          if (path.startsWith("/")) {
            path = path.substring(1);
          }
          if (path.length() == 0) {
            throw new MalformedURLException("path is required");
          }
          url = Loader.getResourceBySelfClassLoader(path);
        }
        else {
          url = new URL(location); 
        }
        if (url == null) {
          throw new FileNotFoundException(location);
        }
        return url;
      }
      
    }
    ������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/util/ContextUtil.java�����������������0000644�0001750�0001750�00000006600�12136042272�027771� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.util;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.spi.ContextAwareBase;
    
    import java.net.InetAddress;
    import java.net.NetworkInterface;
    import java.net.SocketException;
    import java.net.UnknownHostException;
    import java.util.Enumeration;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Properties;
    
    public class ContextUtil extends ContextAwareBase {
    
      public ContextUtil(Context context) {
        setContext(context);
      }
    
      public static String getLocalHostName() throws UnknownHostException,
              SocketException {
        try {
          InetAddress localhost = InetAddress.getLocalHost();
          return localhost.getHostName();
        } catch (UnknownHostException e) {
          return getLocalAddressAsString();
        }
      }
    
      private static String getLocalAddressAsString() throws UnknownHostException,
              SocketException {
        Enumeration<NetworkInterface> interfaces =
                NetworkInterface.getNetworkInterfaces();
        while (interfaces != null && interfaces.hasMoreElements()) {
          Enumeration<InetAddress> addresses =
                  interfaces.nextElement().getInetAddresses();
          while (addresses != null && addresses.hasMoreElements()) {
            InetAddress address = addresses.nextElement();
            if (acceptableAddress(address)) {
              return address.getHostAddress();
            }
          }
        }
        throw new UnknownHostException();
      }
    
      private static boolean acceptableAddress(InetAddress address) {
        return address != null
                && !address.isLoopbackAddress()
                && !address.isAnyLocalAddress()
                && !address.isLinkLocalAddress();
      }
    
      /**
       * Add the local host's name as a property
       */
      public void addHostNameAsProperty() {
        try {
          String localhostName = getLocalHostName();
          context.putProperty(CoreConstants.HOSTNAME_KEY, localhostName);
        } catch (UnknownHostException e) {
          addError("Failed to get local hostname", e);
        } catch (SocketException e) {
          addError("Failed to get local hostname", e);
        } catch (SecurityException e) {
          addError("Failed to get local hostname", e);
        }
      }
    
      public void addProperties(Properties props) {
        if (props == null) {
          return;
        }
        Iterator i = props.keySet().iterator();
        while (i.hasNext()) {
          String key = (String) i.next();
          context.putProperty(key, props.getProperty(key));
        }
      }
    
    
      public void addGroovyPackages(List<String> frameworkPackages) {
        //addFrameworkPackage(frameworkPackages, "groovy.lang");
        addFrameworkPackage(frameworkPackages, "org.codehaus.groovy.runtime");
      }
    
      public void addFrameworkPackage(List<String> frameworkPackages, String packageName) {
        if (!frameworkPackages.contains(packageName)) {
          frameworkPackages.add(packageName);
        }
      }
    
    
    }
    ��������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/util/FileSize.java��������������������0000644�0001750�0001750�00000005255�12136042272�027226� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.util;
    
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    /**
     * Instances of this class represent the size of a file. Internally, the size is
     * stored as long.>
     * 
     * <p>The {@link #valueOf} method can convert strings such as "3 kb", "5 mb", into
     * FileSize instances. The recognized unit specifications for file size are the
     * "kb", "mb", and "gb". The unit name may be followed by an "s". Thus, "2 kbs"
     * and "2 kb" are equivalent. In the absence of a time unit specification, byte
     * is assumed.
     *  
     * @author Ceki G&uuml;lc&uuml;
     * 
     */
    public class FileSize {
    
      private final static String LENGTH_PART = "([0-9]+)";
      private final static int DOUBLE_GROUP = 1;
    
      private final static String UNIT_PART = "(|kb|mb|gb)s?";
      private final static int UNIT_GROUP = 2;
    
      private static final Pattern FILE_SIZE_PATTERN = Pattern.compile(LENGTH_PART
          + "\\s*" + UNIT_PART, Pattern.CASE_INSENSITIVE);
    
      static final long KB_COEFFICIENT = 1024;
      static final long MB_COEFFICIENT = 1024 * KB_COEFFICIENT;
      static final long GB_COEFFICIENT = 1024 * MB_COEFFICIENT;
    
      final long size;
    
      FileSize(long size) {
        this.size = size;
      }
    
      public long getSize() {
        return size;
      }
    
      static public FileSize valueOf(String fileSizeStr) {
        Matcher matcher = FILE_SIZE_PATTERN.matcher(fileSizeStr);
    
        long coefficient;
        if (matcher.matches()) {
          String lenStr = matcher.group(DOUBLE_GROUP);
          String unitStr = matcher.group(UNIT_GROUP);
    
          long lenValue = Long.valueOf(lenStr);
          if (unitStr.equalsIgnoreCase("")) {
            coefficient = 1;
          } else if (unitStr.equalsIgnoreCase("kb")) {
            coefficient = KB_COEFFICIENT;
          } else if (unitStr.equalsIgnoreCase("mb")) {
            coefficient = MB_COEFFICIENT;
          } else if (unitStr.equalsIgnoreCase("gb")) {
            coefficient = GB_COEFFICIENT;
          } else {
            throw new IllegalStateException("Unexpected " + unitStr);
          }
          return new FileSize(lenValue * coefficient);
        } else {
          throw new IllegalArgumentException("String value [" + fileSizeStr
              + "] is not in the expected format.");
        }
    
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/util/DelayStrategy.java���������������0000644�0001750�0001750�00000001426�12143151241�030264� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.util;
    
    /**
     * A strategy for computing a delay.
     *
     * @author Carl Harris
     * @since 1.1.0
     */
    public interface DelayStrategy {
      /**
       * The value computed by this {@code DelayStrategy} for the next delay.
       * @return a delay value
       */
      int nextDelay();
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/util/DynamicClassLoadingException.java0000644�0001750�0001750�00000001373�12136042272�033240� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.util;
    
    public class DynamicClassLoadingException extends Exception {
    
      private static final long serialVersionUID = 4962278449162476114L;
    
      public DynamicClassLoadingException(String desc, Throwable root ) {
        super(desc, root);
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/util/IncompatibleClassException.java��0000644�0001750�0001750�00000001611�12136042272�032757� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.util;
    
    public class IncompatibleClassException extends Exception {
    
      private static final long serialVersionUID = -5823372159561159549L;
    
      Class<?> requestedClass;
      Class<?> obtainedClass;
      
      IncompatibleClassException(Class<?> requestedClass, Class<?> obtainedClass) {
        super();
        this.requestedClass = requestedClass;
        this.obtainedClass = obtainedClass;
      }
    }
    �����������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/util/ExecutorServiceUtil.java���������0000644�0001750�0001750�00000002743�12140214537�031470� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2011, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    
    package ch.qos.logback.core.util;
    
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.SynchronousQueue;
    import java.util.concurrent.ThreadPoolExecutor;
    import java.util.concurrent.TimeUnit;
    
    import ch.qos.logback.core.CoreConstants;
    
    /**
     * Static utility methods for manipulating an {@link ExecutorService}.
     * 
     * @author Carl Harris
     */
    public class ExecutorServiceUtil {
    
      /**
       * Creates an executor service suitable for use by logback components.
       * @return executor service
       */
      static public ExecutorService newExecutorService() {
        return new ThreadPoolExecutor(CoreConstants.CORE_POOL_SIZE, 
            CoreConstants.MAX_POOL_SIZE,
            0L, TimeUnit.MILLISECONDS,
            new SynchronousQueue<Runnable>());
      }
      
      /**
       * Shuts down an executor service.
       * <p>
       * @param executorService the executor service to shut down
       */
      static public void shutdown(ExecutorService executorService) {
        executorService.shutdownNow();
      }
    
    }
    �����������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/util/Loader.java����������������������0000644�0001750�0001750�00000013664�12136042272�026725� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.util;
    
    import java.io.IOException;
    import java.net.URL;
    import java.security.AccessControlException;
    import java.security.AccessController;
    import java.security.PrivilegedAction;
    import java.util.Enumeration;
    import java.util.Set;
    import java.util.HashSet;
    
    import ch.qos.logback.core.Context;
    
    /**
     * Load resources (or images) from various sources.
     *
     * @author Ceki G&uuml;lc&uuml;
     */
    public class Loader {
      static final String TSTR = "Caught Exception while in Loader.getResource. This may be innocuous.";
    
      private static boolean ignoreTCL = false;
      public static final String IGNORE_TCL_PROPERTY_NAME = "logback.ignoreTCL";
      private static boolean HAS_GET_CLASS_LOADER_PERMISSION = false;
    
      static {
        String ignoreTCLProp = OptionHelper.getSystemProperty(
                IGNORE_TCL_PROPERTY_NAME, null);
    
        if (ignoreTCLProp != null) {
          ignoreTCL = OptionHelper.toBoolean(ignoreTCLProp, true);
        }
    
        HAS_GET_CLASS_LOADER_PERMISSION =
                AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
                  public Boolean run() {
                    try {
                      AccessController.checkPermission(
                              new RuntimePermission("getClassLoader"));
                      return true;
                    } catch (AccessControlException e) {
                      return false;
                    }
                  }
                });
      }
    
      /**
       * Compute the number of occurrences a resource can be found by a class
       * loader.
       *
       * @param resource
       * @param classLoader
       * @return
       * @throws IOException
       */
    
      public static Set<URL> getResourceOccurrenceCount(String resource,
                                                        ClassLoader classLoader) throws IOException {
        // See LBCLASSIC-159
        Set<URL> urlSet = new HashSet<URL>();
        Enumeration<URL> urlEnum = classLoader.getResources(resource);
        while (urlEnum.hasMoreElements()) {
          URL url = urlEnum.nextElement();
          urlSet.add(url);
        }
        return urlSet;
      }
    
      /**
       * Search for a resource using the classloader passed as parameter.
       *
       * @param resource    the resource name to look for
       * @param classLoader the classloader used for the search
       */
      public static URL getResource(String resource, ClassLoader classLoader) {
        try {
          return classLoader.getResource(resource);
        } catch (Throwable t) {
          return null;
        }
      }
    
      /**
       * Attempt to find a resource by using the classloader that loaded this class,
       * namely Loader.class.
       *
       * @param resource
       * @return
       */
      public static URL getResourceBySelfClassLoader(String resource) {
        return getResource(resource, getClassLoaderOfClass(Loader.class));
      }
    
      // private static URL getResourceByTCL(String resource) {
      // return getResource(resource, getTCL());
      // }
    
      /**
       * Get the Thread Context Loader which is a JDK 1.2 feature. If we are running
       * under JDK 1.1 or anything else goes wrong the method returns
       * <code>null<code>.
       */
      public static ClassLoader getTCL() {
        return Thread.currentThread().getContextClassLoader();
      }
    
      public static Class<?> loadClass(String clazz, Context context)
              throws ClassNotFoundException {
        ClassLoader cl = getClassLoaderOfObject(context);
        return cl.loadClass(clazz);
      }
    
      /**
       * Get the class loader of the object passed as argument. Return the system
       * class loader if appropriate.
       *
       * @param o
       * @return
       */
      public static ClassLoader getClassLoaderOfObject(Object o) {
        if (o == null) {
          throw new NullPointerException("Argument cannot be null");
        }
        return getClassLoaderOfClass(o.getClass());
      }
    
      /**
       * Returns the class loader of clazz in an access privileged section.
       *
       * @param clazz
       * @return
       */
      public static ClassLoader getClassLoaderAsPrivileged(final Class<?> clazz) {
        if (!HAS_GET_CLASS_LOADER_PERMISSION)
          return null;
        else
          return AccessController.doPrivileged(
                  new PrivilegedAction<ClassLoader>() {
                    public ClassLoader run() {
                      return clazz.getClassLoader();
                    }
                  });
      }
    
      /**
       * Return the class loader which loaded the class passed as argument. Return
       * the system class loader if appropriate.
       *
       * @param clazz
       * @return
       */
      public static ClassLoader getClassLoaderOfClass(final Class<?> clazz) {
        ClassLoader cl = clazz.getClassLoader();
        if (cl == null) {
          return ClassLoader.getSystemClassLoader();
        } else {
          return cl;
        }
      }
    
      /**
       * If running under JDK 1.2 load the specified class using the
       * <code>Thread</code> <code>contextClassLoader</code> if that fails try
       * Class.forname. Under JDK 1.1 only Class.forName is used.
       */
      public static Class<?> loadClass(String clazz) throws ClassNotFoundException {
        // Just call Class.forName(clazz) if we are running under JDK 1.1
        // or if we are instructed to ignore the TCL.
        if (ignoreTCL) {
          return Class.forName(clazz);
        } else {
          try {
            return getTCL().loadClass(clazz);
          } catch (Throwable e) {
            // we reached here because tcl was null or because of a
            // security exception, or because clazz could not be loaded...
            // In any case we now try one more time
            return Class.forName(clazz);
          }
        }
      }
    }
    ����������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/util/ContentTypeUtil.java�������������0000644�0001750�0001750�00000002401�12136042272�030614� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.util;
    
    /**
     * Various utility methods for processing strings representing context types.
     * 
     * @author Ceki Gulcu
     * 
     */
    public class ContentTypeUtil {
    
      public static boolean isTextual(String contextType) {
        if (contextType == null) {
          return false;
        }
        return contextType.startsWith("text");
      }
    
      public static String getSubType(String contextType) {
        if (contextType == null) {
          return null;
        }
        int index = contextType.indexOf('/');
        if (index == -1) {
          return null;
        } else {
          int subTypeStartIndex = index + 1;
          if (subTypeStartIndex < contextType.length()) {
            return contextType.substring(subTypeStartIndex);
          } else {
            return null;
          }
        }
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/util/FixedDelay.java������������������0000644�0001750�0001750�00000003054�12143151241�027520� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.util;
    
    /**
     * A default {@link DelayStrategy} that implements a simple fixed delay.
     *
     * @author Carl Harris
     * @since 1.1.0
     */
    public class FixedDelay implements DelayStrategy {
    
      private final int subsequentDelay;
      private int nextDelay;
    
      /**
       * Initialize a new {@code FixedDelay} with a given {@code initialDelay} and
       * {@code subsequentDelay}.
       *
       * @param initialDelay    value for the initial delay
       * @param subsequentDelay value for all other delays
       */
      public FixedDelay(int initialDelay, int subsequentDelay) {
        String s = new String();
        this.nextDelay = initialDelay;
        this.subsequentDelay = subsequentDelay;
      }
    
      /**
       * Initialize a new {@code FixedDelay} with fixed delay value given by {@code delay}
       * parameter.
       *
       * @param delay value for all delays
       */
      public FixedDelay(int delay) {
        this(delay, delay);
      }
    
      /**
       * {@inheritDoc}
       */
      public int nextDelay() {
        int delay = nextDelay;
        nextDelay = subsequentDelay;
        return delay;
      }
    
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/util/CharSequenceState.java�����������0000644�0001750�0001750�00000001464�12136042272�031061� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.util;
    
    /**
     *  Used to keep state about a char sequence.
     *  @author Ceki Gulcu
     */
    class CharSequenceState {
      final char c;
      int occurrences;
    
      public CharSequenceState(char c) {
        this.c = c;
        this.occurrences = 1;
      }
    
      void incrementOccurrences() {
        occurrences++;
      }
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/util/StringCollectionUtil.java��������0000644�0001750�0001750�00000007053�12136042272�031632� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.util;
    
    import java.util.Arrays;
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.List;
    import java.util.regex.Pattern;
    
    /**
     * Static utility methods for working with collections of strings.
     *
     * @author Carl Harris
     */
    public class StringCollectionUtil {
    
      /**
       * Retains all values in the subject collection that are matched by
       * at least one of a collection of regular expressions.
       * <p>
       * This method is a convenience overload for
       * {@link #retainMatching(Collection, Collection)}.
       *   
       * @param values subject value collection 
       * @param patterns patterns to match
       */
      @SuppressWarnings("unchecked")
      public static void retainMatching(Collection<String> values, 
          String... patterns) {
        retainMatching(values, Arrays.asList(patterns));
      }
    
      /**
       * Retains all values in the subject collection that are matched by
       * at least one of a collection of regular expressions.
       * <p>
       * The semantics of this method are conceptually similar to
       * {@link Collection#retainAll(Collection)}, but uses pattern matching
       * instead of exact matching.
       * 
       * @param values subject value collection 
       * @param patterns patterns to match
       */
      public static void retainMatching(Collection<String> values,
          Collection<String> patterns) {
        if (patterns.isEmpty()) return;
        List<String> matches = new ArrayList<String>(values.size());
        for (String p : patterns) {
          Pattern pattern = Pattern.compile(p);
          for (String value : values) {
            if (pattern.matcher(value).matches()) {
              matches.add(value);
            }
          }
        }
        values.retainAll(matches);
      }
      
      /**
       * Removes all values in the subject collection that are matched by
       * at least one of a collection of regular expressions.
       * <p>
       * This method is a convenience overload for
       * {@link #removeMatching(Collection, Collection)}.
       * 
       * @param values subject value collection 
       * @param patterns patterns to match
       */
      @SuppressWarnings("unchecked")
      public static void removeMatching(Collection<String> values, 
          String... patterns) {
        removeMatching(values, Arrays.asList(patterns));
      }
    
      /**
       * Removes all values in the subject collection that are matched by
       * at least one of a collection of regular expressions.
       * <p>
       * The semantics of this method are conceptually similar to
       * {@link Collection#removeAll(Collection)}, but uses pattern matching
       * instead of exact matching.
       * 
       * @param values subject value collection 
       * @param patterns patterns to match
       */
      public static void removeMatching(Collection<String> values, 
          Collection<String> patterns) {
        List<String> matches = new ArrayList<String>(values.size());
        for (String p : patterns) {
          Pattern pattern = Pattern.compile(p);
          for (String value : values) {
            if (pattern.matcher(value).matches()) {
              matches.add(value);
            }
          }
        }
        values.removeAll(matches);
      }
    
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/LayoutBase.java�����������������������0000644�0001750�0001750�00000003505�12136042271�026602� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core;
    
    import ch.qos.logback.core.spi.ContextAwareBase;
    
    abstract public class LayoutBase<E> extends ContextAwareBase implements Layout<E>  {
    
      protected boolean started;
      
      String fileHeader;
      String fileFooter;
      String presentationHeader;
      String presentationFooter;
      
      public void setContext(Context context) {
        this.context = context;
      }
    
      public Context getContext() {
        return this.context;
      }
    
      public void start() {
        started = true;
      }
    
      public void stop() {
        started = false;
      }
      
      public boolean isStarted() {
        return started;
      }
      
      public String getFileHeader() {
        return fileHeader;
      }
      
      public String getPresentationHeader() {
        return presentationHeader;
      }
      
      public String getPresentationFooter() {
        return presentationFooter;
      }
      
      public String getFileFooter() {
        return fileFooter;
      }
    
      public String getContentType() {
        return "text/plain";
      }
      
      public void setFileHeader(String header) {
        this.fileHeader = header;
      }
    
      public void setFileFooter(String footer) {
        this.fileFooter = footer;
      }
      
      public void setPresentationHeader(String header) {
        this.presentationHeader = header;
      }
    
      public void setPresentationFooter(String footer) {
        this.presentationFooter = footer;
      }
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/read/���������������������������������0000755�0001750�0001750�00000000000�12203357067�024606� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/read/CyclicBufferAppender.java��������0000644�0001750�0001750�00000003306�12136042272�031464� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.read;
    
    import ch.qos.logback.core.AppenderBase;
    import ch.qos.logback.core.helpers.CyclicBuffer;
    
    /**
     * CyclicBufferAppender stores events in a cyclic buffer of user-specified size. As the 
     * name suggests, if the size of the buffer is N, only the latest N events are available.
     * 
     * 
     * @author Ceki Gulcu
     */
    public class CyclicBufferAppender<E> extends AppenderBase<E> {
    
      CyclicBuffer<E> cb;
      int maxSize = 512;
    
      public void start() {
        cb = new CyclicBuffer<E>(maxSize);
        super.start();
      }
    
      public void stop() {
        cb = null;
        super.stop();
      }
    
      @Override
      protected void append(E eventObject) {
        if (!isStarted()) {
          return;
        }
        cb.add(eventObject);
      }
    
      public int getLength() {
        if (isStarted()) {
          return cb.length();
        } else {
          return 0;
        }
      }
    
      public E get(int i) {
        if (isStarted()) {
          return cb.get(i);
        } else {
          return null;
        }
      }
    
      public void reset() {
        cb.clear();
      }
    
      /**
       * Set the size of the cyclic buffer.
       */
      public int getMaxSize() {
        return maxSize;
      }
    
      public void setMaxSize(int maxSize) {
        this.maxSize = maxSize;
      }
    
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/read/ListAppender.java����������������0000644�0001750�0001750�00000001423�12136042272�030035� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.read;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import ch.qos.logback.core.AppenderBase;
    
    public class ListAppender<E> extends AppenderBase<E> {
    
      public List<E> list = new ArrayList<E>();
      
      protected void append(E e) {
        list.add(e);
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/ConsoleAppender.java������������������0000644�0001750�0001750�00000007464�12136042271�027623� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core;
    
    import java.io.IOException;
    import java.io.OutputStream;
    import java.util.Arrays;
    
    import ch.qos.logback.core.joran.spi.ConsoleTarget;
    import ch.qos.logback.core.status.Status;
    import ch.qos.logback.core.status.WarnStatus;
    import ch.qos.logback.core.util.DynamicClassLoadingException;
    import ch.qos.logback.core.util.EnvUtil;
    import ch.qos.logback.core.util.IncompatibleClassException;
    import ch.qos.logback.core.util.OptionHelper;
    import org.fusesource.jansi.WindowsAnsiOutputStream;
    
    /**
     * ConsoleAppender appends log events to <code>System.out</code> or
     * <code>System.err</code> using a layout specified by the user. The default
     * target is <code>System.out</code>.
     * <p/>
     * For more information about this appender, please refer to the online manual
     * at http://logback.qos.ch/manual/appenders.html#ConsoleAppender
     *
     * @author Ceki G&uuml;lc&uuml;
     * @author Tom SH Liu
     * @author Ruediger Dohna
     */
    
    public class ConsoleAppender<E> extends OutputStreamAppender<E> {
    
      protected ConsoleTarget target = ConsoleTarget.SystemOut;
      protected boolean withJansi = false;
    
      private final static String WindowsAnsiOutputStream_CLASS_NAME = "org.fusesource.jansi.WindowsAnsiOutputStream";
    
      /**
       * Sets the value of the <b>Target</b> option. Recognized values are
       * "System.out" and "System.err". Any other value will be ignored.
       */
      public void setTarget(String value) {
        ConsoleTarget t = ConsoleTarget.findByName(value.trim());
        if (t == null) {
          targetWarn(value);
        } else {
          target = t;
        }
      }
    
      /**
       * Returns the current value of the <b>target</b> property. The default value
       * of the option is "System.out".
       * <p/>
       * See also {@link #setTarget}.
       */
      public String getTarget() {
        return target.getName();
      }
    
      private void targetWarn(String val) {
        Status status = new WarnStatus("[" + val + "] should be one of "
                + Arrays.toString(ConsoleTarget.values()), this);
        status.add(new WarnStatus(
                "Using previously set target, System.out by default.", this));
        addStatus(status);
      }
    
      @Override
      public void start() {
        OutputStream targetStream = target.getStream();
        // enable jansi only on Windows and only if withJansi set to true
        if (EnvUtil.isWindows() && withJansi) {
          targetStream = getTargetStreamForWindows(targetStream);
        }
        setOutputStream(targetStream);
        super.start();
      }
    
      private OutputStream getTargetStreamForWindows(OutputStream targetStream) {
        try {
          addInfo("Enabling JANSI WindowsAnsiOutputStream for the console.");
          Object windowsAnsiOutputStream = OptionHelper.instantiateByClassNameAndParameter(WindowsAnsiOutputStream_CLASS_NAME, Object.class, context,
                  OutputStream.class, targetStream);
          return (OutputStream) windowsAnsiOutputStream;
        } catch (Exception e) {
          addWarn("Failed to create WindowsAnsiOutputStream. Falling back on the default stream.", e);
        }
        return targetStream;
      }
    
      /**
       * @return
       */
      public boolean isWithJansi() {
        return withJansi;
      }
    
      /**
       * If true, this appender will output to a stream which
       *
       * @param withJansi
       * @since 1.0.5
       */
      public void setWithJansi(boolean withJansi) {
        this.withJansi = withJansi;
      }
    
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/������������������������������0000755�0001750�0001750�00000000000�12203357067�025350� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/PatternLayoutEncoderBase.java�0000644�0001750�0001750�00000003721�12136042272�033116� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern;
    
    import ch.qos.logback.core.Layout;
    import ch.qos.logback.core.encoder.LayoutWrappingEncoder;
    
    public class PatternLayoutEncoderBase<E> extends LayoutWrappingEncoder<E> {
    
      String pattern;
    
      // due to popular demand outputPatternAsHeader is set to false by default
      protected boolean outputPatternAsHeader = false;
    
      public String getPattern() {
        return pattern;
      }
    
      public void setPattern(String pattern) {
        this.pattern = pattern;
      }
    
      public boolean isOutputPatternAsHeader() {
        return outputPatternAsHeader;
      }
    
    
      /**
       * Print the pattern string as a header in log files
       *
       * @param outputPatternAsHeader
       * @since 1.0.3
       */
      public void setOutputPatternAsHeader(boolean outputPatternAsHeader) {
        this.outputPatternAsHeader = outputPatternAsHeader;
      }
    
    
      public boolean isOutputPatternAsPresentationHeader() {
        return outputPatternAsHeader;
      }
    
      /**
       * @deprecated replaced by {@link #setOutputPatternAsHeader(boolean)}
       */
      public void setOutputPatternAsPresentationHeader(boolean outputPatternAsHeader) {
        addWarn("[outputPatternAsPresentationHeader] property is deprecated. Please use [outputPatternAsHeader] option instead.");
        this.outputPatternAsHeader = outputPatternAsHeader;
      }
    
      @Override
      public void setLayout(Layout<E> layout) {
        throw new UnsupportedOperationException("one cannot set the layout of "
            + this.getClass().getName());
      }
    
    }
    �����������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/ConverterUtil.java������������0000644�0001750�0001750�00000003521�12136042272�031013� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.spi.ContextAware;
    
    public class ConverterUtil {
    
      /**
       * Start converters in the chain of converters.
       *
       * @param head
       */
      public static <E> void startConverters(Converter<E> head) {
        Converter<E> c = head;
        while (c != null) {
          // CompositeConverter is a subclass of  DynamicConverter
          if (c instanceof CompositeConverter) {
            CompositeConverter<E> cc = (CompositeConverter<E>) c;
            Converter<E> childConverter = cc.childConverter;
            startConverters(childConverter);
            cc.start();
          } else if (c instanceof DynamicConverter) {
            DynamicConverter<E> dc = (DynamicConverter<E>) c;
            dc.start();
          }
          c = c.getNext();
        }
      }
    
    
      public static <E> Converter<E> findTail(Converter<E> head) {
        Converter<E> p = head;
        while (p != null) {
          Converter<E> next = p.getNext();
          if (next == null) {
            break;
          } else {
            p = next;
          }
        }
        return p;
      }
    
      public static <E> void setContextForConverters(Context context, Converter<E> head) {
        Converter<E> c = head;
        while (c != null) {
          if (c instanceof ContextAware) {
            ((ContextAware) c).setContext(context);
          }
          c = c.getNext();
        }
      }
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/package.html������������������0000644�0001750�0001750�00000000517�11377016712�027634� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
    
    <html> 
      <head>
        <title></title>
      </head>
      
      <body>
        
        <p>Contains the base classes used by PatternLayout.</p>
    
        <p>These classes lay the groundwork so that subclasses of PatternLayoutBase
        can use module-specific patterns.
        </p>
    
      </body> 
    </html>���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/util/�������������������������0000755�0001750�0001750�00000000000�12203357067�026325� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/util/RestrictedEscapeUtil.java0000644�0001750�0001750�00000002117�12136042272�033252� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern.util;
    
    /**
     * This implementation is intended for use in PatternLayout.
     *
     * @author Ceki G&uuml;lc&uuml;
     */
    public class RestrictedEscapeUtil implements IEscapeUtil {
    
      public void escape(String escapeChars, StringBuffer buf, char next,
                         int pointer) {
        if (escapeChars.indexOf(next) >= 0) {
          buf.append(next);
        } else {
          // restitute the escape char (because it was consumed
          // before this method was called).
          buf.append("\\");
          // restitute the next character
          buf.append(next);
        }
      }
    
    
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/util/AlmostAsIsEscapeUtil.java0000644�0001750�0001750�00000003205�12136042272�033160� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern.util;
    
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.rolling.helper.FileNamePattern;
    
    /**
     * This implementation is intended for use in {@link FileNamePattern}.
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public class AlmostAsIsEscapeUtil extends RestrictedEscapeUtil {
    
      /**
       * Do not perform any character escaping, except for '%', and ')'.
       * 
       * <p>
       * Here is the rationale. First, filename patterns do not include escape
       * combinations such as \r or \n. Moreover, characters which have special
       * meaning in logback parsers, such as '{', or '}' cannot be part of file
       * names (so me thinks). The left parenthesis character has special meaning
       * only if it is preceded by %. Thus, the only characters that needs escaping
       * are '%' and ')'.
       * 
       * <p>
       * Note that this method assumes that it is called after the escape character
       * has been consumed.
       */
      public void escape(String escapeChars, StringBuffer buf, char next,
          int pointer) {
        super.escape(""+CoreConstants.PERCENT_CHAR+CoreConstants.RIGHT_PARENTHESIS_CHAR, buf, next, pointer);
      }
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/util/AsIsEscapeUtil.java������0000644�0001750�0001750�00000002120�12136042272�031773� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern.util;
    
    /**
     * @author Ceki G&uuml;lc&uuml;
     */
    public class AsIsEscapeUtil implements IEscapeUtil {
    
      /**
       * Do not perform any character escaping.
       * <p/>
       * Note that this method assumes that it is called after the escape character
       * has been consumed.
       */
      public void escape(String escapeChars, StringBuffer buf, char next,
                         int pointer) {
        // restitute the escape char (because it was consumed
        // before this method was called).
        buf.append("\\");
        // restitute the next character
        buf.append(next);
      }
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/util/RegularEscapeUtil.java���0000644�0001750�0001750�00000005137�12136042272�032550� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern.util;
    
    /**
     * This implementation is intended for use in PatternLayout.
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public class RegularEscapeUtil implements IEscapeUtil {
    
      public void escape(String escapeChars, StringBuffer buf, char next,
          int pointer) {
        if (escapeChars.indexOf(next) >= 0) {
          buf.append(next);
        } else
          switch (next) {
          case '_':
            // the \_ sequence is swallowed
            break;
          case '\\':
            buf.append(next);
            break;
          case 't':
            buf.append('\t');
            break;
          case 'r':
            buf.append('\r');
            break;
          case 'n':
            buf.append('\n');
            break;
          default:
            String commaSeperatedEscapeChars = formatEscapeCharsForListing(escapeChars);
            throw new IllegalArgumentException("Illegal char '" + next + " at column "
                + pointer + ". Only \\\\, \\_" + commaSeperatedEscapeChars
                + ", \\t, \\n, \\r combinations are allowed as escape characters.");
          }
      }
    
      String formatEscapeCharsForListing(String escapeChars) {
        StringBuilder commaSeperatedEscapeChars = new StringBuilder();
        for (int i = 0; i < escapeChars.length(); i++) {
          commaSeperatedEscapeChars.append(", \\").append(escapeChars.charAt(i));
        }
        return commaSeperatedEscapeChars.toString();
      }
    
      public static String basicEscape(String s) {
        char c;
        int len = s.length();
        StringBuffer sbuf = new StringBuffer(len);
    
        int i = 0;
        while (i < len) {
          c = s.charAt(i++);
          if (c == '\\') {
            c = s.charAt(i++);
            if (c == 'n') {
              c = '\n';
            } else if (c == 'r') {
              c = '\r';
            } else if (c == 't') {
              c = '\t';
            } else if (c == 'f') {
              c = '\f';
            } else if (c == '\b') {
              c = '\b';
            } else if (c == '\"') {
              c = '\"';
            } else if (c == '\'') {
              c = '\'';
            } else if (c == '\\') {
              c = '\\';
            }
          }
          sbuf.append(c);
        }
        return sbuf.toString();
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/util/IEscapeUtil.java���������0000644�0001750�0001750�00000001216�12136042272�031331� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern.util;
    
    public interface IEscapeUtil {
    
      void escape(String additionalEscapeChars, StringBuffer buf, char next, int pointer);
    }����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000146�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/IdentityCompositeConverter.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/IdentityCompositeConverter.jav0000644�0001750�0001750�00000001265�12136042272�033414� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern;
    
    public class IdentityCompositeConverter<E> extends CompositeConverter<E> {
    
      @Override
      protected String transform(E event, String in) {
        return in;
      }
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/PostCompileProcessor.java�����0000644�0001750�0001750�00000002003�12136042272�032336� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern;
    
    
    /**
     * Implements this to perform post compile processing for a PatternLayout.
     * 
     * For example, PatternLayout in the classic module should add a converter for
     * exception handling (otherwise exceptions would not be printed).
     * 
     * @author Ceki Gulcu
     */
    public interface PostCompileProcessor<E> {
    
      /**
       * Post compile processing of the converter chain.
       * 
       * @param head
       *                The first converter in the chain
       */
      void process(Converter<E> head);
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/parser/�����������������������0000755�0001750�0001750�00000000000�12203357067�026644� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/parser/TokenStream.java�������0000644�0001750�0001750�00000016332�12136042272�031742� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern.parser;
    
    import java.util.List;
    import java.util.ArrayList;
    
    import ch.qos.logback.core.CoreConstants;
    import static ch.qos.logback.core.CoreConstants.CURLY_LEFT;
    import static ch.qos.logback.core.CoreConstants.ESCAPE_CHAR;
    
    import ch.qos.logback.core.pattern.util.IEscapeUtil;
    import ch.qos.logback.core.pattern.util.RegularEscapeUtil;
    import ch.qos.logback.core.pattern.util.RestrictedEscapeUtil;
    import ch.qos.logback.core.spi.ScanException;
    
    /**
     * <p>
     * Return a steady stream of tokens.
     * <p/>
     * <p/>
     * <p>
     * The returned tokens are one of: LITERAL, '%', FORMAT_MODIFIER, SIMPLE_KEYWORD, COMPOSITE_KEYWORD
     * OPTION, LEFT_PARENTHESIS, and RIGHT_PARENTHESIS.
     * </p>
     * <p/>
     * <p>
     * The '\' character is used as escape. It can be used to escape '_', '%', '('
     * and '('.
     * <p>
     * <p/>
     * <p>
     * Note that there is no EOS token returned.
     * </p>
     */
    class TokenStream {
    
      enum TokenizerState { LITERAL_STATE,  FORMAT_MODIFIER_STATE, KEYWORD_STATE, OPTION_STATE,  RIGHT_PARENTHESIS_STATE}
    
      final String pattern;
      final int patternLength;
      final IEscapeUtil escapeUtil;
    
      final IEscapeUtil optionEscapeUtil = new RestrictedEscapeUtil();
    
      TokenizerState state = TokenizerState.LITERAL_STATE;
      int pointer = 0;
    
      // this variant should be used for testing purposes only
      TokenStream(String pattern) {
        this(pattern, new RegularEscapeUtil());
      }
    
      TokenStream(String pattern, IEscapeUtil escapeUtil) {
        if (pattern == null || pattern.length() == 0) {
          throw new IllegalArgumentException(
                  "null or empty pattern string not allowed");
        }
        this.pattern = pattern;
        patternLength = pattern.length();
        this.escapeUtil = escapeUtil;
      }
    
      List tokenize() throws ScanException {
        List<Token> tokenList = new ArrayList<Token>();
        StringBuffer buf = new StringBuffer();
    
        while (pointer < patternLength) {
          char c = pattern.charAt(pointer);
          pointer++;
    
          switch (state) {
            case LITERAL_STATE:
              handleLiteralState(c, tokenList, buf);
              break;
            case FORMAT_MODIFIER_STATE:
              handleFormatModifierState(c, tokenList, buf);
              break;
            case OPTION_STATE:
              processOption(c, tokenList, buf);
              break;
            case KEYWORD_STATE:
              handleKeywordState(c, tokenList, buf);
              break;
            case RIGHT_PARENTHESIS_STATE:
              handleRightParenthesisState(c, tokenList, buf);
              break;
    
            default:
          }
        }
    
        // EOS
        switch (state) {
          case LITERAL_STATE:
            addValuedToken(Token.LITERAL, buf, tokenList);
            break;
          case KEYWORD_STATE:
            tokenList.add(new Token(Token.SIMPLE_KEYWORD, buf.toString()));
            break;
          case RIGHT_PARENTHESIS_STATE:
            tokenList.add(Token.RIGHT_PARENTHESIS_TOKEN);
            break;
    
          case FORMAT_MODIFIER_STATE:
          case OPTION_STATE:
            throw new ScanException("Unexpected end of pattern string");
        }
    
        return tokenList;
      }
    
      private void handleRightParenthesisState(char c, List<Token> tokenList, StringBuffer buf) {
        tokenList.add(Token.RIGHT_PARENTHESIS_TOKEN);
        switch (c) {
          case CoreConstants.RIGHT_PARENTHESIS_CHAR:
            break;
          case CURLY_LEFT:
            state = TokenizerState.OPTION_STATE;
            break;
          case ESCAPE_CHAR:
            escape("%{}", buf);
            state = TokenizerState.LITERAL_STATE;
            break;
          default:
            buf.append(c);
            state = TokenizerState.LITERAL_STATE;
        }
      }
    
      private void processOption(char c, List<Token> tokenList, StringBuffer buf) throws ScanException {
        OptionTokenizer ot = new OptionTokenizer(this);
        ot.tokenize(c, tokenList);
      }
    
      private void handleFormatModifierState(char c, List<Token> tokenList, StringBuffer buf) {
        if (c == CoreConstants.LEFT_PARENTHESIS_CHAR) {
          addValuedToken(Token.FORMAT_MODIFIER, buf, tokenList);
          tokenList.add(Token.BARE_COMPOSITE_KEYWORD_TOKEN);
          state = TokenizerState.LITERAL_STATE;
        } else if (Character.isJavaIdentifierStart(c)) {
          addValuedToken(Token.FORMAT_MODIFIER, buf, tokenList);
          state = TokenizerState.KEYWORD_STATE;
          buf.append(c);
        } else {
          buf.append(c);
        }
      }
    
      private void handleLiteralState(char c, List<Token> tokenList, StringBuffer buf) {
        switch (c) {
          case ESCAPE_CHAR:
            escape("%()", buf);
            break;
    
          case CoreConstants.PERCENT_CHAR:
            addValuedToken(Token.LITERAL, buf, tokenList);
            tokenList.add(Token.PERCENT_TOKEN);
            state = TokenizerState.FORMAT_MODIFIER_STATE;
            break;
    
          case CoreConstants.RIGHT_PARENTHESIS_CHAR:
            addValuedToken(Token.LITERAL, buf, tokenList);
            state = TokenizerState.RIGHT_PARENTHESIS_STATE;
            break;
    
          default:
            buf.append(c);
        }
      }
    
      private void handleKeywordState(char c, List<Token> tokenList, StringBuffer buf) {
    
        if (Character.isJavaIdentifierPart(c)) {
          buf.append(c);
        } else if (c == CURLY_LEFT) {
          addValuedToken(Token.SIMPLE_KEYWORD, buf, tokenList);
          state = TokenizerState.OPTION_STATE;
        } else if (c == CoreConstants.LEFT_PARENTHESIS_CHAR) {
          addValuedToken(Token.COMPOSITE_KEYWORD, buf, tokenList);
          state = TokenizerState.LITERAL_STATE;
        } else if (c == CoreConstants.PERCENT_CHAR) {
          addValuedToken(Token.SIMPLE_KEYWORD, buf, tokenList);
          tokenList.add(Token.PERCENT_TOKEN);
          state = TokenizerState.FORMAT_MODIFIER_STATE;
        } else if (c == CoreConstants.RIGHT_PARENTHESIS_CHAR) {
          addValuedToken(Token.SIMPLE_KEYWORD, buf, tokenList);
          state = TokenizerState.RIGHT_PARENTHESIS_STATE;
        } else {
          addValuedToken(Token.SIMPLE_KEYWORD, buf, tokenList);
          if (c == ESCAPE_CHAR) {
            if ((pointer < patternLength)) {
              char next = pattern.charAt(pointer++);
              escapeUtil.escape("%()", buf, next, pointer);
            }
          } else {
            buf.append(c);
          }
          state = TokenizerState.LITERAL_STATE;
        }
      }
    
      void escape(String escapeChars, StringBuffer buf) {
        if ((pointer < patternLength)) {
          char next = pattern.charAt(pointer++);
          escapeUtil.escape(escapeChars, buf, next, pointer);
        }
      }
    
      void optionEscape(String escapeChars, StringBuffer buf) {
        if ((pointer < patternLength)) {
          char next = pattern.charAt(pointer++);
          optionEscapeUtil.escape(escapeChars, buf, next, pointer);
        }
      }
    
    
    
    
      private void addValuedToken(int type, StringBuffer buf, List<Token> tokenList) {
        if (buf.length() > 0) {
          tokenList.add(new Token(type, buf.toString()));
          buf.setLength(0);
        }
      }
    }������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/parser/OptionTokenizer.java���0000644�0001750�0001750�00000011056�12136042272�032647� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern.parser;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import ch.qos.logback.core.pattern.util.AsIsEscapeUtil;
    import ch.qos.logback.core.pattern.util.IEscapeUtil;
    
    import static ch.qos.logback.core.CoreConstants.CURLY_RIGHT;
    
    
    import static ch.qos.logback.core.CoreConstants.ESCAPE_CHAR;
    import static ch.qos.logback.core.CoreConstants.COMMA_CHAR;
    import static ch.qos.logback.core.CoreConstants.SINGLE_QUOTE_CHAR;
    import static ch.qos.logback.core.CoreConstants.DOUBLE_QUOTE_CHAR;
    
    
    import ch.qos.logback.core.pattern.parser.TokenStream.TokenizerState;
    import ch.qos.logback.core.spi.ScanException;
    
    public class OptionTokenizer {
    
      private final static int EXPECTING_STATE = 0;
      private final static int RAW_COLLECTING_STATE = 1;
      private final static int QUOTED_COLLECTING_STATE = 2;
    
    
      final IEscapeUtil escapeUtil;
      final TokenStream tokenStream;
      final String pattern;
      final int patternLength;
    
      char quoteChar;
      int state = EXPECTING_STATE;
    
      OptionTokenizer(TokenStream tokenStream) {
        this(tokenStream, new AsIsEscapeUtil());
      }
    
      OptionTokenizer(TokenStream tokenStream, IEscapeUtil escapeUtil) {
        this.tokenStream = tokenStream;
        this.pattern = tokenStream.pattern;
        this.patternLength = tokenStream.patternLength;
        this.escapeUtil = escapeUtil;
      }
    
      void tokenize(char firstChar, List<Token> tokenList) throws ScanException {
        StringBuffer buf = new StringBuffer();
        List<String> optionList = new ArrayList<String>();
        char c = firstChar;
    
        while (tokenStream.pointer < patternLength) {
          switch (state) {
            case EXPECTING_STATE:
              switch (c) {
                case ' ':
                case '\t':
                case '\r':
                case '\n':
                case COMMA_CHAR:
                  break;
                case SINGLE_QUOTE_CHAR:
                case DOUBLE_QUOTE_CHAR:
                  state = QUOTED_COLLECTING_STATE;
                  quoteChar = c;
                  break;
                case CURLY_RIGHT:
                  emitOptionToken(tokenList, optionList);
                  return;
                default:
                  buf.append(c);
                  state = RAW_COLLECTING_STATE;
              }
              break;
            case RAW_COLLECTING_STATE:
              switch (c) {
                case COMMA_CHAR:
                  optionList.add(buf.toString().trim());
                  buf.setLength(0);
                  state = EXPECTING_STATE;
                  break;
                case CURLY_RIGHT:
                  optionList.add(buf.toString().trim());
                  emitOptionToken(tokenList, optionList);
                  return;
                default:
                  buf.append(c);
              }
              break;
            case QUOTED_COLLECTING_STATE:
              if (c == quoteChar) {
                optionList.add(buf.toString());
                buf.setLength(0);
                state = EXPECTING_STATE;
              } else if (c == ESCAPE_CHAR) {
                escape(String.valueOf(quoteChar), buf);
              } else {
                buf.append(c);
              }
    
              break;
          }
    
          c = pattern.charAt(tokenStream.pointer);
          tokenStream.pointer++;
        }
    
    
        // EOS
        if (c == CURLY_RIGHT) {
          if(state == EXPECTING_STATE) {
            emitOptionToken(tokenList, optionList);
          } else if(state == RAW_COLLECTING_STATE){
            optionList.add(buf.toString().trim());
            emitOptionToken(tokenList, optionList);
          } else {
            throw new ScanException("Unexpected end of pattern string in OptionTokenizer");
          }
        } else {
          throw new ScanException("Unexpected end of pattern string in OptionTokenizer");
        }
      }
    
      void emitOptionToken( List<Token> tokenList, List<String> optionList) {
         tokenList.add(new Token(Token.OPTION, optionList));
         tokenStream.state = TokenizerState.LITERAL_STATE;
      }
    
      void escape(String escapeChars, StringBuffer buf) {
        if ((tokenStream.pointer < patternLength)) {
          char next = pattern.charAt(tokenStream.pointer++);
          escapeUtil.escape(escapeChars, buf, next, tokenStream.pointer);
        }
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/parser/Token.java�������������0000644�0001750�0001750�00000005614�12136042272�030567� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern.parser;
    
    class Token {
    
    
      static final int PERCENT = 37;
      //static final int LEFT_PARENTHESIS = 40;
      static final int RIGHT_PARENTHESIS = 41;
      static final int MINUS = 45;
      static final int DOT = 46;
      static final int CURLY_LEFT = 123;
      static final int CURLY_RIGHT = 125;
    
      static final int LITERAL = 1000;
      static final int FORMAT_MODIFIER = 1002;
      static final int SIMPLE_KEYWORD = 1004;
      static final int COMPOSITE_KEYWORD = 1005;
      static final int OPTION = 1006;
    
      static final int EOF = Integer.MAX_VALUE;
    
      static Token EOF_TOKEN = new Token(EOF, "EOF");
      static Token RIGHT_PARENTHESIS_TOKEN = new Token(RIGHT_PARENTHESIS);
      static Token BARE_COMPOSITE_KEYWORD_TOKEN = new Token(COMPOSITE_KEYWORD, "BARE");
      static Token PERCENT_TOKEN = new Token(PERCENT);
    
      private final int type;
      private final Object value;
    
    
      public Token(int type) {
        this(type, null);
      }
    
      public Token(int type, Object value) {
        this.type = type;
        this.value = value;
      }
    
      public int getType() {
        return type;
      }
    
      public Object getValue() {
        return value;
      }
    
    
      public String toString() {
        String typeStr = null;
        switch (type) {
    
          case PERCENT:
            typeStr = "%";
            break;
          case FORMAT_MODIFIER:
            typeStr = "FormatModifier";
            break;
          case LITERAL:
            typeStr = "LITERAL";
            break;
          case OPTION:
            typeStr = "OPTION";
            break;
          case SIMPLE_KEYWORD:
            typeStr = "SIMPLE_KEYWORD";
            break;
          case COMPOSITE_KEYWORD:
              typeStr = "COMPOSITE_KEYWORD";
              break;
          case RIGHT_PARENTHESIS:
            typeStr = "RIGHT_PARENTHESIS";
            break;
         default:
            typeStr = "UNKNOWN";
        }
        if (value == null) {
          return "Token(" + typeStr + ")";
    
        } else {
          return "Token(" + typeStr + ", \"" + value + "\")";
        }
      }
    
      public int hashCode() {
        int result;
        result = type;
        result = 29 * result + (value != null ? value.hashCode() : 0);
        return result;
      }
    
    
      public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Token)) return false;
    
        final Token token = (Token) o;
    
        if (type != token.type) return false;
        if (value != null ? !value.equals(token.value) : token.value != null) return false;
    
        return true;
      }
    }
    ��������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/parser/FormattingNode.java����0000644�0001750�0001750�00000002661�12136042272�032426� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern.parser;
    
    import ch.qos.logback.core.pattern.FormatInfo;
    
    public class FormattingNode extends Node {
    
      FormatInfo formatInfo;
    
      FormattingNode(int type) {
        super(type);
      }
    
      FormattingNode(int type, Object value) {
        super(type, value);
      }
    
      public FormatInfo getFormatInfo() {
        return formatInfo;
      }
    
      public void setFormatInfo(FormatInfo formatInfo) {
        this.formatInfo = formatInfo;
      }
    
      public boolean equals(Object o) {
        if (!super.equals(o)) {
          return false;
        }
    
        if(!(o instanceof FormattingNode)) {
            return false;
        }
        FormattingNode r = (FormattingNode) o;
    
        return (formatInfo != null ? formatInfo.equals(r.formatInfo)
            : r.formatInfo == null);
      }
    
      @Override
      public int hashCode() {
        int result = super.hashCode();
        result = 31 * result + (formatInfo != null ? formatInfo.hashCode() : 0);
        return result;
      }
    }
    �������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/parser/SimpleKeywordNode.java�0000644�0001750�0001750�00000003317�12136042272�033111� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern.parser;
    
    import java.util.List;
    
    public class SimpleKeywordNode extends FormattingNode {
    
      List<String> optionList;
    
      SimpleKeywordNode(Object value) {
        super(Node.SIMPLE_KEYWORD, value);
      }
    
      protected  SimpleKeywordNode(int type, Object value) {
        super(type, value);
      }
    
      public List<String> getOptions() {
        return optionList;
      }
    
      public void setOptions(List<String> optionList) {
        this.optionList = optionList;
      }
    
      public boolean equals(Object o) {
        if (!super.equals(o)) {
          return false;
        }
    
        if (!(o instanceof SimpleKeywordNode)) {
          return false;
        }
        SimpleKeywordNode r = (SimpleKeywordNode) o;
    
        return (optionList != null ? optionList.equals(r.optionList)
            : r.optionList == null);
      }
    
      @Override
      public int hashCode() {
        return super.hashCode();
      }
    
      public String toString() {
        StringBuffer buf = new StringBuffer();
        if (optionList == null) {
          buf.append("KeyWord(" + value + "," + formatInfo + ")");
        } else {
          buf.append("KeyWord(" + value + ", " + formatInfo + "," + optionList
              + ")");
        }
        buf.append(printNext());
        return buf.toString();
      }
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/parser/Parser.java������������0000644�0001750�0001750�00000015447�12136042272�030750� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern.parser;
    
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.pattern.Converter;
    import ch.qos.logback.core.pattern.FormatInfo;
    import ch.qos.logback.core.pattern.IdentityCompositeConverter;
    import ch.qos.logback.core.pattern.ReplacingCompositeConverter;
    import ch.qos.logback.core.pattern.util.IEscapeUtil;
    import ch.qos.logback.core.pattern.util.RegularEscapeUtil;
    import ch.qos.logback.core.spi.ContextAwareBase;
    import ch.qos.logback.core.spi.ScanException;
    
    // ~=lamda
    // E = TE|T
    
    // Left factorization
    // E = T(E|~)
    // Eopt = E|~
    // replace E|~ with Eopt in E
    // E = TEopt
    
    // T = LITERAL | '%' C | '%' FORMAT_MODIFIER C
    // C = SIMPLE_KEYWORD OPTION | COMPOSITE_KEYWORD COMPOSITE
    // OPTION = {...} | ~
    // COMPOSITE = E ')' OPTION
    
    
    
    public class Parser<E> extends ContextAwareBase {
    
      public final static String MISSING_RIGHT_PARENTHESIS = CoreConstants.CODES_URL+"#missingRightParenthesis";
      public final static Map<String, String> DEFAULT_COMPOSITE_CONVERTER_MAP = new HashMap<String, String>();
      public final static String REPLACE_CONVERTER_WORD = "replace";
      static {
        DEFAULT_COMPOSITE_CONVERTER_MAP.put(Token.BARE_COMPOSITE_KEYWORD_TOKEN.getValue().toString(),
                IdentityCompositeConverter.class.getName());
        DEFAULT_COMPOSITE_CONVERTER_MAP.put(REPLACE_CONVERTER_WORD,
                 ReplacingCompositeConverter.class.getName());
      }
    
      final List tokenList;
      int pointer = 0;
      
      Parser(TokenStream ts) throws ScanException {
        this.tokenList = ts.tokenize();
      }
    
      public Parser(String pattern) throws ScanException {
        this(pattern, new RegularEscapeUtil());
      }
      
      public Parser(String pattern, IEscapeUtil escapeUtil) throws ScanException {
        try {
          TokenStream ts = new TokenStream(pattern, escapeUtil);
          this.tokenList = ts.tokenize();
        } catch (IllegalArgumentException npe) {
          throw new ScanException("Failed to initialize Parser", npe);
        }
      }
    
      /**
       * When the parsing step is done, the Node list can be transformed into a
       * converter chain.
       *
       * @param top
       * @param converterMap
       * @return
       * @throws ScanException
       */
      public Converter<E> compile(final Node top, Map converterMap) {
        Compiler<E> compiler = new Compiler<E>(top, converterMap);
        compiler.setContext(context);
        //compiler.setStatusManager(statusManager);
        return compiler.compile();
      }
    
      public Node parse() throws ScanException {
        return E();
      }
    
      // E = TEopt
      Node E() throws ScanException {
        Node t = T();
        if (t == null) {
          return null;
        }
        Node eOpt = Eopt();
        if (eOpt != null) {
          t.setNext(eOpt);
        }
        return t;
      }
    
      // Eopt = E|~
      Node Eopt() throws ScanException {
        // System.out.println("in Eopt()");
        Token next = getCurentToken();
        // System.out.println("Current token is " + next);
        if (next == null) {
          return null;
        } else {
          return E();
        }
      }
    
      // T = LITERAL | '%' C | '%' FORMAT_MODIFIER C
      Node T() throws ScanException {
        Token t = getCurentToken();
        expectNotNull(t, "a LITERAL or '%'");
    
        switch (t.getType()) {
        case Token.LITERAL:
          advanceTokenPointer();
          return new Node(Node.LITERAL, t.getValue());
        case Token.PERCENT:
          advanceTokenPointer();
          // System.out.println("% token found");
          FormatInfo fi;
          Token u = getCurentToken();
          FormattingNode c;
          expectNotNull(u, "a FORMAT_MODIFIER, SIMPLE_KEYWORD or COMPOUND_KEYWORD");
          if (u.getType() == Token.FORMAT_MODIFIER) {
            fi = FormatInfo.valueOf((String) u.getValue());
            advanceTokenPointer();
            c = C();
            c.setFormatInfo(fi);
          } else {
            c = C();
          }
          return c;
    
        default:
          return null;
    
        }
    
      }
    
      FormattingNode C() throws ScanException {
        Token t = getCurentToken();
        // System.out.println("in C()");
        // System.out.println("Current token is " + t);
        expectNotNull(t, "a LEFT_PARENTHESIS or KEYWORD");
        int type = t.getType();
        switch (type) {
        case Token.SIMPLE_KEYWORD:
          return SINGLE();
        case Token.COMPOSITE_KEYWORD:
          advanceTokenPointer();
          return COMPOSITE(t.getValue().toString());
        default:
          throw new IllegalStateException("Unexpected token " + t);
        }
      }
    
      FormattingNode SINGLE() throws ScanException {
        // System.out.println("in SINGLE()");
        Token t = getNextToken();
        // System.out.println("==" + t);
        SimpleKeywordNode keywordNode = new SimpleKeywordNode(t.getValue());
    
        Token ot = getCurentToken();
        if (ot != null && ot.getType() == Token.OPTION) {
          List<String> optionList = (List<String>) ot.getValue();
          keywordNode.setOptions(optionList);
          advanceTokenPointer();
        }
        return keywordNode;
      }
    
      FormattingNode COMPOSITE(String keyword) throws ScanException {
        CompositeNode compositeNode = new CompositeNode(keyword);
    
        Node childNode = E();
        compositeNode.setChildNode(childNode);
    
        Token t = getNextToken();
    
        if (t == null || t.getType() != Token.RIGHT_PARENTHESIS) {
            String msg = "Expecting RIGHT_PARENTHESIS token but got " + t;
            addError(msg);
            addError("See also "+MISSING_RIGHT_PARENTHESIS);
            throw new ScanException(msg);
        }
        Token ot = getCurentToken();
        if (ot != null && ot.getType() == Token.OPTION) {
          List<String> optionList = (List<String>) ot.getValue();
          compositeNode.setOptions(optionList);
          advanceTokenPointer();
        }
        return compositeNode;
      }
    
      Token getNextToken() {
        if (pointer < tokenList.size()) {
          return (Token) tokenList.get(pointer++);
        }
        return null;
      }
    
      Token getCurentToken() {
        if (pointer < tokenList.size()) {
          return (Token) tokenList.get(pointer);
        }
        return null;
      }
    
      void advanceTokenPointer() {
        pointer++;
      }
    
      void expectNotNull(Token t, String expected) {
        if (t == null) {
          throw new IllegalStateException("All tokens consumed but was expecting "
              + expected);
        }
      }
    
    //  public void setStatusManager(StatusManager statusManager) {
    //    this.statusManager = statusManager;
    //  }
    }�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/parser/CompositeNode.java�����0000644�0001750�0001750�00000002704�12136042272�032254� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern.parser;
    
    public class CompositeNode extends SimpleKeywordNode {
    	Node childNode;
    
    	CompositeNode(String keyword) {
    		super(Node.COMPOSITE_KEYWORD, keyword);
    
    	}
    
    	public Node getChildNode() {
    		return childNode;
    	}
    
    	public void setChildNode(Node childNode) {
    		this.childNode = childNode;
    	}
    
    	public boolean equals(Object o) {
        if(!super.equals(o)) {
          return false;
        }
        if (!(o instanceof CompositeNode)) {
    			return false;
    		}
    		CompositeNode r = (CompositeNode) o;
    
    		return (childNode != null) ? childNode.equals(r.childNode)
    						: (r.childNode == null);
    	}
    
      @Override
      public int hashCode() {
        return super.hashCode();
      }
    
      public String toString() {
    		StringBuffer buf = new StringBuffer();
    		if(childNode != null) {
    		 buf.append("CompositeNode("+childNode+")");
    		} else {
    			buf.append("CompositeNode(no child)");
    		}
    		buf.append(printNext());
    		return buf.toString();
    	}
    }������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/parser/Node.java��������������0000644�0001750�0001750�00000003735�12136042272�030376� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern.parser;
    
    public class Node {
    	static final int LITERAL = 0;
    	static final int SIMPLE_KEYWORD = 1;
    	static final int COMPOSITE_KEYWORD = 2;
    
    	final int type;
    	final Object value;
    	Node next;
    
    	Node(int type) {
    		this(type, null);
    	}
    
    	Node(int type, Object value) {
    		this.type = type;
    		this.value = value;
    	}
    
    	/**
    	 * @return Returns the type.
    	 */
    	public int getType() {
    		return type;
    	}
    
    	/**
    	 * @return Returns the value.
    	 */
    	public Object getValue() {
    		return value;
    	}
    
    	public Node getNext() {
    		return next;
    	}
    
    	public void setNext(Node next) {
    		this.next = next;
    	}
    
    	public boolean equals(Object o) {
    		if (this == o) {
    			return true;
    		}
    		if (!(o instanceof Node)) {
    			return false;
    		}
    		Node r = (Node) o;
    
    		return (type == r.type)
    				&& (value != null ? value.equals(r.value) : r.value == null)
    				&& (next != null ? next.equals(r.next) : r.next == null);
    	}
    
      @Override
      public int hashCode() {
        int result = type;
        result = 31 * result + (value != null ? value.hashCode() : 0);
        return result;
      }
    
      String printNext() {
    		if (next != null) {
    			return " -> " + next;
    		} else {
    			return "";
    		}
    	}
    
    	public String toString() {
    		StringBuffer buf = new StringBuffer();
    		switch (type) {
    		case LITERAL:
    			buf.append("LITERAL(" + value + ")");
    			break;
    		default:
    			buf.append(super.toString());
    		}
    
    		buf.append(printNext());
    		
    		return buf.toString();
    	}
    }�����������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/parser/Compiler.java����������0000644�0001750�0001750�00000012526�12136042272�031261� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern.parser;
    
    import java.util.Map;
    
    import ch.qos.logback.core.pattern.CompositeConverter;
    import ch.qos.logback.core.pattern.Converter;
    import ch.qos.logback.core.pattern.DynamicConverter;
    import ch.qos.logback.core.pattern.LiteralConverter;
    import ch.qos.logback.core.spi.ContextAwareBase;
    import ch.qos.logback.core.status.ErrorStatus;
    import ch.qos.logback.core.util.OptionHelper;
    
    class Compiler<E> extends ContextAwareBase {
    
      Converter<E> head;
      Converter<E> tail;
      final Node top;
      final Map converterMap;
    
      Compiler(final Node top, final Map converterMap) {
        this.top = top;
        this.converterMap = converterMap;
      }
    
      Converter<E> compile() {
        head = tail = null;
        for (Node n = top; n != null; n = n.next) {
          switch (n.type) {
            case Node.LITERAL:
              addToList(new LiteralConverter<E>((String) n.getValue()));
              break;
            case Node.COMPOSITE_KEYWORD:
              CompositeNode cn = (CompositeNode) n;
              CompositeConverter<E> compositeConverter = createCompositeConverter(cn);
              if(compositeConverter == null) {
                addError("Failed to create converter for [%"+cn.getValue()+"] keyword");
                addToList(new LiteralConverter<E>("%PARSER_ERROR["+cn.getValue()+"]"));
                break;
              }
              compositeConverter.setFormattingInfo(cn.getFormatInfo());
              compositeConverter.setOptionList(cn.getOptions());
              Compiler<E> childCompiler = new Compiler<E>(cn.getChildNode(),
                      converterMap);
              childCompiler.setContext(context);
              Converter<E> childConverter = childCompiler.compile();
              compositeConverter.setChildConverter(childConverter);
              addToList(compositeConverter);
              break;
            case Node.SIMPLE_KEYWORD:
              SimpleKeywordNode kn = (SimpleKeywordNode) n;
              DynamicConverter<E> dynaConverter = createConverter(kn);
              if (dynaConverter != null) {
                dynaConverter.setFormattingInfo(kn.getFormatInfo());
                dynaConverter.setOptionList(kn.getOptions());
                addToList(dynaConverter);
              } else {
                // if the appropriate dynaconverter cannot be found, then replace
                // it with a dummy LiteralConverter indicating an error.
                Converter<E> errConveter = new LiteralConverter<E>("%PARSER_ERROR["
                        + kn.getValue() + "]");
                addStatus(new ErrorStatus("[" + kn.getValue()
                        + "] is not a valid conversion word", this));
                addToList(errConveter);
              }
    
          }
        }
        return head;
      }
    
      private void addToList(Converter<E> c) {
        if (head == null) {
          head = tail = c;
        } else {
          tail.setNext(c);
          tail = c;
        }
      }
    
      /**
       * Attempt to create a converter using the information found in
       * 'converterMap'.
       *
       * @param kn
       * @return
       */
      @SuppressWarnings("unchecked")
      DynamicConverter<E> createConverter(SimpleKeywordNode kn) {
        String keyword = (String) kn.getValue();
        String converterClassStr = (String) converterMap.get(keyword);
    
        if (converterClassStr != null) {
          try {
            return (DynamicConverter) OptionHelper.instantiateByClassName(
                    converterClassStr, DynamicConverter.class, context);
          } catch (Exception e) {
            addError("Failed to instantiate converter class [" + converterClassStr
                    + "] for keyword ["+keyword+"]", e);
            return null;
          }
        } else {
          addError("There is no conversion class registered for conversion word ["
                  + keyword + "]");
          return null;
        }
      }
    
      /**
       * Attempt to create a converter using the information found in
       * 'compositeConverterMap'.
       *
       * @param cn
       * @return
       */
      @SuppressWarnings("unchecked")
      CompositeConverter<E> createCompositeConverter(CompositeNode cn) {
        String keyword = (String) cn.getValue();
        String converterClassStr = (String) converterMap.get(keyword);
    
        if (converterClassStr != null) {
          try {
            return (CompositeConverter) OptionHelper.instantiateByClassName(
                    converterClassStr, CompositeConverter.class, context);
          } catch (Exception e) {
            addError("Failed to instantiate converter class [" + converterClassStr
                    + "] as a composite converter for keyword ["+keyword+"]", e);
            return null;
          }
        } else {
          addError("There is no conversion class registered for composite conversion word ["
                  + keyword + "]");
          return null;
        }
      }
    
    
      // public void setStatusManager(StatusManager statusManager) {
      // this.statusManager = statusManager;
      // }
      //  
      // void addStatus(Status status) {
      // if(statusManager != null) {
      // statusManager.add(status);
      // }
      // }
    }��������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/FormattingConverter.java������0000644�0001750�0001750�00000003517�12136042272�032215� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern;
    
    abstract public class FormattingConverter<E> extends Converter<E> {
    
      static final int INITIAL_BUF_SIZE = 256;
      static final int MAX_CAPACITY = 1024;
    
      
      FormatInfo formattingInfo;
    
      final public FormatInfo getFormattingInfo() {
        return formattingInfo;
      }
    
      final public void setFormattingInfo(FormatInfo formattingInfo) {
        if (this.formattingInfo != null) {
          throw new IllegalStateException("FormattingInfo has been already set");
        }
        this.formattingInfo = formattingInfo;
      }
    
      @Override
      final public void write(StringBuilder buf, E event) {
        String s = convert(event);
        
        if(formattingInfo == null) {
          buf.append(s);
          return;
        }
        
        int min = formattingInfo.getMin();
        int max = formattingInfo.getMax();
    
    
        if (s == null) {
          if (0 < min)
            SpacePadder.spacePad(buf, min);
          return;
        }
    
        int len = s.length();
    
        if (len > max) {
          if(formattingInfo.isLeftTruncate()) {
            buf.append(s.substring(len - max));
          } else {
            buf.append(s.substring(0, max));
          }
        } else if (len < min) {
          if (formattingInfo.isLeftPad()) {
           SpacePadder.leftPad(buf, s, min);
          } else {
            SpacePadder.rightPad(buf, s, min);
          }
        } else {
          buf.append(s);
        }
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/Converter.java����������������0000644�0001750�0001750�00000003136�12136042272�030157� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern;
    
    /**
     * A minimal converter which sets up the general interface for derived classes. 
     * It also implements the functionality to chain converters in a linked list.
     * 
     * @author ceki
     */
    abstract public class Converter<E> {
      
      Converter<E> next;
    
      /**
       * The convert method is responsible for extracting data from the event and
       * storing it for later use by the write method.
       * 
       * @param event
       */
      public abstract String convert(E event);
    
      /**
       * In its simplest incarnation, a convert simply appends the data extracted from
       * the event to the buffer passed as parameter.
       * 
       * @param buf The input buffer where data is appended
       * @param event The event from where data is extracted
       */
      public void write(StringBuilder buf, E event) {
        buf.append(convert(event));
      }
      
      public final void setNext(Converter<E> next) {
        if (this.next != null) {
          throw  new IllegalStateException("Next converter has been already set");
        }
        this.next = next;
      }
    
      public final Converter<E> getNext() {
        return next;
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/CompositeConverter.java�������0000644�0001750�0001750�00000002731�12136042272�032042� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern;
    
    abstract public class CompositeConverter<E> extends DynamicConverter<E> {
    
      Converter<E> childConverter;
    
      public String convert(E event) {
        StringBuilder buf = new StringBuilder();
    
        for (Converter<E> c = childConverter; c != null; c = c.next) {
          c.write(buf, event);
        }
        String intermediary = buf.toString();
        return transform(event, intermediary);
      }
    
      abstract protected String transform(E event, String in);
    
      public Converter<E> getChildConverter() {
        return childConverter;
      }
    
      public void setChildConverter(Converter<E> child) {
        childConverter = child;
      }
    
      public String toString() {
        StringBuilder buf = new StringBuilder();
        buf.append("CompositeConverter<");
    
        if (formattingInfo != null)
          buf.append(formattingInfo);
    
        if (childConverter != null) {
          buf.append(", children: ").append(childConverter);
        }
        buf.append(">");
        return buf.toString();
      }
    }
    ���������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/LiteralConverter.java���������0000644�0001750�0001750�00000001372�12136042272�031474� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern;
    
    public final class LiteralConverter<E> extends Converter<E> {
    
      String literal;
    
      public LiteralConverter(String literal) {
        this.literal = literal;
      }
    
      public String convert(E o) {
        return literal;
      }
      
      
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/DynamicConverter.java���������0000644�0001750�0001750�00000005323�12136042272�031464� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern;
    
    import java.util.List;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.spi.ContextAware;
    import ch.qos.logback.core.spi.ContextAwareBase;
    import ch.qos.logback.core.spi.LifeCycle;
    import ch.qos.logback.core.status.Status;
    
    abstract public class DynamicConverter<E> extends FormattingConverter<E>
        implements LifeCycle, ContextAware {
    
      ContextAwareBase cab = new ContextAwareBase(this);
    
      // Contains a list of option Strings.
      private List<String> optionList;
    
      /**
       * Is this component active?
       */
      protected boolean started = false;
    
      /**
       * Components that depend on options passed during configuration can override
       * this method in order to make appropriate use of those options. For simpler
       * components, the trivial implementation found in this abstract class will be
       * sufficient.
       */
      public void start() {
        started = true;
      }
    
      public void stop() {
        started = false;
      }
    
      public boolean isStarted() {
        return started;
      }
    
      public void setOptionList(List<String> optionList) {
        this.optionList = optionList;
      }
    
      /**
       * Return the first option passed to this component. The returned value may be
       * null if there are no options.
       * 
       * @return First option, may be null.
       */
      public String getFirstOption() {
        if (optionList == null || optionList.size() == 0) {
          return null;
        } else {
          return optionList.get(0);
        }
      }
    
      protected List<String> getOptionList() {
        return optionList;
      }
    
      public void setContext(Context context) {
        cab.setContext(context);
      }
    
      public Context getContext() {
        return cab.getContext();
      }
    
      public void addStatus(Status status) {
        cab.addStatus(status);
      }
    
      public void addInfo(String msg) {
        cab.addInfo(msg);
      }
    
      public void addInfo(String msg, Throwable ex) {
        cab.addInfo(msg, ex);
      }
    
      public void addWarn(String msg) {
        cab.addWarn(msg);
      }
    
      public void addWarn(String msg, Throwable ex) {
        cab.addWarn(msg, ex);
      }
    
      public void addError(String msg) {
        cab.addError(msg);
      }
    
      public void addError(String msg, Throwable ex) {
        cab.addError(msg, ex);
      }
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000147�00000000000�011567� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/ReplacingCompositeConverter.java��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/ReplacingCompositeConverter.ja0000644�0001750�0001750�00000002660�12136042272�033341� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern;
    
    import java.util.List;
    import java.util.regex.Pattern;
    
    public class ReplacingCompositeConverter<E> extends CompositeConverter<E> {
    
      Pattern pattern;
      String regex;
      String replacement;
    
      public void start() {
        final List<String> optionList = getOptionList();
        if (optionList == null) {
          addError("at least two options are expected whereas you have declared none");
          return;
        }
    
        int numOpts = optionList.size();
    
        if (numOpts < 2) {
          addError("at least two options are expected whereas you have declared only " + numOpts + "as [" + optionList + "]");
          return;
        }
        regex = optionList.get(0);
        pattern = Pattern.compile(regex);
        replacement = optionList.get(1);
        super.start();
      }
    
      @Override
      protected String transform(E event, String in) {
        if (!started)
          return in;
        return pattern.matcher(in).replaceAll(replacement);
      }
    }��������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/SpacePadder.java��������������0000644�0001750�0001750�00000003311�12136042272�030356� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern;
    
    public class SpacePadder {
    
      final static String[] SPACES = { " ", "  ", "    ", "        ", // 1,2,4,8
          // spaces
          "                ", // 16 spaces
          "                                " }; // 32 spaces
    
      final static public void leftPad(StringBuilder buf, String s, int desiredLength) {
        int actualLen = 0;
        if (s != null) {
          actualLen = s.length();
        }
        if (actualLen < desiredLength) {
          spacePad(buf, desiredLength - actualLen);
        }
        if (s != null) {
          buf.append(s);
        }
      }
    
      final static public void rightPad(StringBuilder buf, String s, int desiredLength) {
        int actualLen = 0;
        if (s != null) {
          actualLen = s.length();
        }
        if (s != null) {
          buf.append(s);
        }
        if (actualLen < desiredLength) {
          spacePad(buf, desiredLength - actualLen);
        }
      }
      
      /**
       * Fast space padding method.
       */
      final static public void spacePad(StringBuilder sbuf, int length) {
        while (length >= 32) {
          sbuf.append(SPACES[5]);
          length -= 32;
        }
    
        for (int i = 4; i >= 0; i--) {
          if ((length & (1 << i)) != 0) {
            sbuf.append(SPACES[i]);
          }
        }
      }
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/FormatInfo.java���������������0000644�0001750�0001750�00000007450�12136042272�030257� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern;
    
    /**
     * FormattingInfo instances contain the information obtained when parsing
     * formatting modifiers in conversion modifiers.
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public class FormatInfo {
      private int min = Integer.MIN_VALUE;
      private int max = Integer.MAX_VALUE;
      private boolean leftPad = true;
      private boolean leftTruncate = true;
    
      public FormatInfo() {
      }
    
      public FormatInfo(int min, int max) {
        this.min = min;
        this.max = max;
      }
    
      public FormatInfo(int min, int max, boolean leftPad, boolean leftTruncate) {
        this.min = min;
        this.max = max;
        this.leftPad = leftPad;
        this.leftTruncate = leftTruncate;
      }
    
      /**
       * This method is used to parse a string such as "5", ".7", "5.7" or "-5.7" into
       * a FormatInfo.
       * 
       * @param str A String to convert into a FormatInfo object
       * @return A newly created and appropriately initialized FormatInfo object.
       * @throws IllegalArgumentException
       */
      public static FormatInfo valueOf(String str) throws IllegalArgumentException {
        if (str == null) {
          throw new NullPointerException("Argument cannot be null");
        }
    
        FormatInfo fi = new FormatInfo();
    
        int indexOfDot = str.indexOf('.');
        String minPart = null;
        String maxPart = null;
        if (indexOfDot != -1) {
          minPart = str.substring(0, indexOfDot);
          if (indexOfDot + 1 == str.length()) {
            throw new IllegalArgumentException("Formatting string [" + str
                + "] should not end with '.'");
          } else {
            maxPart = str.substring(indexOfDot + 1);
          }
        } else {
          minPart = str;
        }
    
        if (minPart != null && minPart.length() > 0) {
          int min = Integer.parseInt(minPart);
          if (min >= 0) {
            fi.min = min;
          } else {
            fi.min = -min;
            fi.leftPad = false;
          }
        }
    
        if (maxPart != null && maxPart.length() > 0) {
          int max = Integer.parseInt(maxPart);
          if (max >= 0) {
            fi.max = max;
          } else {
            fi.max = -max;
            fi.leftTruncate = false;
          }
        }
    
        return fi;
    
      }
    
      public boolean isLeftPad() {
        return leftPad;
      }
    
      public void setLeftPad(boolean leftAlign) {
        this.leftPad = leftAlign;
      }
    
      public int getMax() {
        return max;
      }
    
      public void setMax(int max) {
        this.max = max;
      }
    
      public int getMin() {
        return min;
      }
    
      public void setMin(int min) {
        this.min = min;
      }
    
      public boolean isLeftTruncate() {
        return leftTruncate;
      }
    
      public void setLeftTruncate(boolean leftTruncate) {
        this.leftTruncate = leftTruncate;
      }
    
      public boolean equals(Object o) {
        if (this == o) {
          return true;
        }
        if (!(o instanceof FormatInfo)) {
          return false;
        }
        FormatInfo r = (FormatInfo) o;
    
        return (min == r.min) && (max == r.max) && (leftPad == r.leftPad)
            && (leftTruncate == r.leftTruncate);
      }
    
      @Override
      public int hashCode() {
        int result = min;
        result = 31 * result + max;
        result = 31 * result + (leftPad ? 1 : 0);
        result = 31 * result + (leftTruncate ? 1 : 0);
        return result;
      }
    
      public String toString() {
        return "FormatInfo(" + min + ", " + max + ", " + leftPad + ", "
            + leftTruncate + ")";
      }
    }������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/PatternLayoutBase.java��������0000644�0001750�0001750�00000011440�12136042272�031613� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.LayoutBase;
    import ch.qos.logback.core.pattern.parser.Node;
    import ch.qos.logback.core.pattern.parser.Parser;
    import ch.qos.logback.core.spi.ScanException;
    import ch.qos.logback.core.status.ErrorStatus;
    import ch.qos.logback.core.status.StatusManager;
    
    import java.util.HashMap;
    import java.util.Map;
    
    
    abstract public class PatternLayoutBase<E> extends LayoutBase<E> {
    
      Converter<E> head;
      String pattern;
      protected PostCompileProcessor<E> postCompileProcessor;
    
    
      Map<String, String> instanceConverterMap = new HashMap<String, String>();
      protected boolean outputPatternAsHeader = false;
    
      /**
       * Concrete implementations of this class are responsible for elaborating the
       * mapping between pattern words and converters.
       * 
       * @return A map associating pattern words to the names of converter classes
       */
      abstract public Map<String, String> getDefaultConverterMap();
    
      /**
       * Returns a map where the default converter map is merged with the map
       * contained in the context.
       */
      public Map<String, String> getEffectiveConverterMap() {
        Map<String, String> effectiveMap = new HashMap<String, String>();
    
        // add the least specific map fist
        Map<String, String> defaultMap = getDefaultConverterMap();
        if (defaultMap != null) {
          effectiveMap.putAll(defaultMap);
        }
    
        // contextMap is more specific than the default map
        Context context = getContext();
        if (context != null) {
          @SuppressWarnings("unchecked")
          Map<String, String> contextMap = (Map<String, String>) context
              .getObject(CoreConstants.PATTERN_RULE_REGISTRY);
          if (contextMap != null) {
            effectiveMap.putAll(contextMap);
          }
        }
        // set the most specific map last
        effectiveMap.putAll(instanceConverterMap);
        return effectiveMap;
      }
    
      public void start() {
        if(pattern == null || pattern.length() == 0) {
          addError("Empty or null pattern.");
          return;
        }
        try { 
          Parser<E> p = new Parser<E>(pattern);
          if (getContext() != null) {
            p.setContext(getContext());
          }
          Node t = p.parse();
          this.head = p.compile(t, getEffectiveConverterMap());
          if (postCompileProcessor != null) {
            postCompileProcessor.process(head);
          }
          ConverterUtil.setContextForConverters(getContext(), head);
          ConverterUtil.startConverters(this.head);
          super.start();
        } catch (ScanException sce) {
          StatusManager sm = getContext().getStatusManager();
          sm.add(new ErrorStatus("Failed to parse pattern \"" + getPattern()
              + "\".", this, sce));
        }
      }
    
      public void setPostCompileProcessor(
          PostCompileProcessor<E> postCompileProcessor) {
        this.postCompileProcessor = postCompileProcessor;
      }
    
      /**
       *
       * @param head
       * @deprecated  Use {@link ConverterUtil#setContextForConverters} instead. This method will
       *  be removed in future releases.
       */
      protected void setContextForConverters(Converter<E> head) {
        ConverterUtil.setContextForConverters(getContext(), head);
      }
    
      protected String writeLoopOnConverters(E event) {
        StringBuilder buf = new StringBuilder(128);
        Converter<E> c = head;
        while (c != null) {
          c.write(buf, event);
          c = c.getNext();
        }
        return buf.toString();
      }
    
      public String getPattern() {
        return pattern;
      }
    
      public void setPattern(String pattern) {
        this.pattern = pattern;
      }
    
      public String toString() {
        return this.getClass().getName() + "(\"" + getPattern() + "\")";
      }
    
      public Map<String, String> getInstanceConverterMap() {
        return instanceConverterMap;
      }
    
      
      protected String getPresentationHeaderPrefix() {
        return CoreConstants.EMPTY_STRING;
      }
    
      public boolean isOutputPatternAsHeader() {
        return outputPatternAsHeader;
      }
    
      public void setOutputPatternAsHeader(boolean outputPatternAsHeader) {
        this.outputPatternAsHeader = outputPatternAsHeader;
      }
    
      @Override
      public String getPresentationHeader() {
        if(outputPatternAsHeader)
          return getPresentationHeaderPrefix()+pattern;
        else
          return super.getPresentationHeader();
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/color/������������������������0000755�0001750�0001750�00000000000�12203357067�026466� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000150�00000000000�011561� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/color/GrayCompositeConverter.java�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/color/GrayCompositeConverter.j0000644�0001750�0001750�00000001712�12136042272�033311� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern.color;
    
    import static ch.qos.logback.core.pattern.color.ANSIConstants.*;
    
    /**
     * Encloses a given set of converter output in gray using the appropriate ANSI
     * escape codes.
     *
     * @param <E>
     * @author  Ceki G&uuml;lc&uuml;
     * @since 1.0.5
     */
    public class GrayCompositeConverter<E> extends ForegroundCompositeConverterBase<E> {
    
      @Override
      protected String getForegroundColorCode(E event) {
        return BOLD + BLACK_FG;
      }
    }
    ������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000157�00000000000�011570� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/color/BoldMagentaCompositeConverter.java������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/color/BoldMagentaCompositeConv0000644�0001750�0001750�00000002042�12136042272�033267� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern.color;
    
    import static ch.qos.logback.core.pattern.color.ANSIConstants.BOLD;
    import static ch.qos.logback.core.pattern.color.ANSIConstants.MAGENTA_FG;
    
    /**
     * Encloses a given set of converter output in bold magenta using the appropriate ANSI escape codes.
     *
     * @param <E>
     * @author Ceki G&uuml;lc&uuml;
     * @since 1.0.5
     */
    public class BoldMagentaCompositeConverter<E> extends ForegroundCompositeConverterBase<E> {
    
      @Override
      protected String getForegroundColorCode(E event) {
        return BOLD + MAGENTA_FG;
      }
    }����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000153�00000000000�011564� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/color/BoldRedCompositeConverter.java����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/color/BoldRedCompositeConverte0000644�0001750�0001750�00000001704�12136042272�033311� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern.color;
    
    import static ch.qos.logback.core.pattern.color.ANSIConstants.*;
    
    /**
     * Encloses a given set of converter output in bold red using the appropriate ANSI escape codes.
     * @param <E>
     * @author  Ceki G&uuml;lc&uuml;
     * @since 1.0.5
     */
    public class BoldRedCompositeConverter <E> extends ForegroundCompositeConverterBase<E> {
    
      @Override
      protected String getForegroundColorCode(E event) {
        return BOLD+RED_FG;
      }
    }������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000155�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/color/BoldGreenCompositeConverter.java��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/color/BoldGreenCompositeConver0000644�0001750�0001750�00000002032�12136042272�033301� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern.color;
    
    import static ch.qos.logback.core.pattern.color.ANSIConstants.BOLD;
    import static ch.qos.logback.core.pattern.color.ANSIConstants.GREEN_FG;
    
    /**
     * Encloses a given set of converter output in bold green using the appropriate ANSI escape codes.
     *
     * @param <E>
     * @author Ceki G&uuml;lc&uuml;
     * @since 1.0.5
     */
    public class BoldGreenCompositeConverter<E> extends ForegroundCompositeConverterBase<E> {
    
      @Override
      protected String getForegroundColorCode(E event) {
        return BOLD + GREEN_FG;
      }
    }������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000154�00000000000�011565� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/color/BoldBlueCompositeConverter.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/color/BoldBlueCompositeConvert0000644�0001750�0001750�00000002026�12136042272�033317� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern.color;
    
    import static ch.qos.logback.core.pattern.color.ANSIConstants.BLUE_FG;
    import static ch.qos.logback.core.pattern.color.ANSIConstants.BOLD;
    
    /**
     * Encloses a given set of converter output in bold blue using the appropriate ANSI escape codes.
     *
     * @param <E>
     * @author Ceki G&uuml;lc&uuml;
     * @since 1.0.5
     */
    public class BoldBlueCompositeConverter<E> extends ForegroundCompositeConverterBase<E> {
    
      @Override
      protected String getForegroundColorCode(E event) {
        return BOLD + BLUE_FG;
      }
    }����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000151�00000000000�011562� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/color/BlackCompositeConverter.java������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/color/BlackCompositeConverter.0000644�0001750�0001750�00000001607�12136042272�033254� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern.color;
    
    /**
     * Encloses a given set of converter output in black using the appropriate ANSI escape codes.
     * @param <E>
     * @author  Ceki G&uuml;lc&uuml;
     * @since 1.0.5
     */
    public class BlackCompositeConverter<E> extends ForegroundCompositeConverterBase<E> {
    
      @Override
      protected String getForegroundColorCode(E event) {
        return ANSIConstants.BLACK_FG;
      }
    }
    �������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000150�00000000000�011561� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/color/BlueCompositeConverter.java�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/color/BlueCompositeConverter.j0000644�0001750�0001750�00000001604�12136042272�033276� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern.color;
    
    /**
     * Encloses a given set of converter output in blue using the appropriate ANSI escape codes.
     * @param <E>
     * @author  Ceki G&uuml;lc&uuml;
     * @since 1.0.5
     */
    public class BlueCompositeConverter<E> extends ForegroundCompositeConverterBase<E> {
    
      @Override
      protected String getForegroundColorCode(E event) {
        return ANSIConstants.BLUE_FG;
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000151�00000000000�011562� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/color/GreenCompositeConverter.java������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/color/GreenCompositeConverter.0000644�0001750�0001750�00000001607�12136042272�033300� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern.color;
    
    /**
     * Encloses a given set of converter output in green using the appropriate ANSI escape codes.
     * @param <E>
     * @author  Ceki G&uuml;lc&uuml;
     * @since 1.0.5
     */
    public class GreenCompositeConverter<E> extends ForegroundCompositeConverterBase<E> {
    
      @Override
      protected String getForegroundColorCode(E event) {
        return ANSIConstants.GREEN_FG;
      }
    }
    �������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000156�00000000000�011567� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/color/BoldYellowCompositeConverter.java�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/color/BoldYellowCompositeConve0000644�0001750�0001750�00000002036�12136042272�033336� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern.color;
    
    import static ch.qos.logback.core.pattern.color.ANSIConstants.BOLD;
    import static ch.qos.logback.core.pattern.color.ANSIConstants.YELLOW_FG;
    
    /**
     * Encloses a given set of converter output in bold yellow using the appropriate ANSI escape codes.
     *
     * @param <E>
     * @author Ceki G&uuml;lc&uuml;
     * @since 1.0.5
     */
    public class BoldYellowCompositeConverter<E> extends ForegroundCompositeConverterBase<E> {
    
      @Override
      protected String getForegroundColorCode(E event) {
        return BOLD + YELLOW_FG;
      }
    }��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000155�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/color/BoldWhiteCompositeConverter.java��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/color/BoldWhiteCompositeConver0000644�0001750�0001750�00000002032�12136042272�033321� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern.color;
    
    import static ch.qos.logback.core.pattern.color.ANSIConstants.BOLD;
    import static ch.qos.logback.core.pattern.color.ANSIConstants.WHITE_FG;
    
    /**
     * Encloses a given set of converter output in bold white using the appropriate ANSI escape codes.
     *
     * @param <E>
     * @author Ceki G&uuml;lc&uuml;
     * @since 1.0.5
     */
    public class BoldWhiteCompositeConverter<E> extends ForegroundCompositeConverterBase<E> {
    
      @Override
      protected String getForegroundColorCode(E event) {
        return BOLD + WHITE_FG;
      }
    }������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000162�00000000000�011564� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/color/ForegroundCompositeConverterBase.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/color/ForegroundCompositeConve0000644�0001750�0001750�00000002702�12136042272�033374� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern.color;
    
    import ch.qos.logback.core.pattern.CompositeConverter;
    import static ch.qos.logback.core.pattern.color.ANSIConstants.*;
    
    /**
     * Base class for all foreground color setting composite converters.
     *
     * @param <E>
     * @since 1.0.5
     */
    abstract public class ForegroundCompositeConverterBase<E> extends CompositeConverter<E> {
    
      final private static String SET_DEFAULT_COLOR = ESC_START+"0;"+DEFAULT_FG+ESC_END;
    
      @Override
      protected String transform(E event, String in) {
        StringBuilder sb = new StringBuilder();
        sb.append(ESC_START);
        sb.append(getForegroundColorCode(event));
        sb.append(ESC_END);
        sb.append(in);
        sb.append(SET_DEFAULT_COLOR);
        return sb.toString();
      }
    
      /**
       * Derived classes return the foreground color specific to the derived class instance.
       * @return  the foreground color for this instance
       */
      abstract protected String getForegroundColorCode(E event);
    }
    ��������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000147�00000000000�011567� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/color/RedCompositeConverter.java��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/color/RedCompositeConverter.ja0000644�0001750�0001750�00000001601�12136042272�033257� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern.color;
    
    /**
     * Encloses a given set of converter output in red using the appropriate ANSI escape codes.
     * @param <E>
     * @author  Ceki G&uuml;lc&uuml;
     * @since 1.0.5
     */
    public class RedCompositeConverter<E> extends ForegroundCompositeConverterBase<E> {
    
      @Override
      protected String getForegroundColorCode(E event) {
        return ANSIConstants.RED_FG;
      }
    }
    �������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000153�00000000000�011564� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/color/MagentaCompositeConverter.java����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/color/MagentaCompositeConverte0000644�0001750�0001750�00000001615�12136042272�033353� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern.color;
    
    /**
     * Encloses a given set of converter output in magenta using the appropriate ANSI escape codes.
     * @param <E>
     * @author  Ceki G&uuml;lc&uuml;
     * @since 1.0.5
     */
    public class MagentaCompositeConverter<E> extends ForegroundCompositeConverterBase<E> {
    
      @Override
      protected String getForegroundColorCode(E event) {
        return ANSIConstants.MAGENTA_FG;
      }
    }
    �������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000150�00000000000�011561� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/color/CyanCompositeConverter.java�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/color/CyanCompositeConverter.j0000644�0001750�0001750�00000001604�12136042272�033301� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern.color;
    
    /**
     * Encloses a given set of converter output in cyan using the appropriate ANSI escape codes.
     * @param <E>
     * @author  Ceki G&uuml;lc&uuml;
     * @since 1.0.5
     */
    public class CyanCompositeConverter<E> extends ForegroundCompositeConverterBase<E> {
    
      @Override
      protected String getForegroundColorCode(E event) {
        return ANSIConstants.CYAN_FG;
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/color/ANSIConstants.java������0000644�0001750�0001750�00000002163�12136042272�031754� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern.color;
    
    public class ANSIConstants {
    
      public final static String ESC_START = "\033[";
      public final static String ESC_END = "m";
      public final static String BOLD = "1;";
    
      public final static String BLACK_FG = "30";
      public final static String RED_FG = "31";
      public final static String GREEN_FG = "32";
      public final static String YELLOW_FG = "33";
      public final static String BLUE_FG  = "34";
      public final static String MAGENTA_FG  = "35";
      public final static String CYAN_FG = "36";
      public final static String WHITE_FG = "37";
      public final static String DEFAULT_FG  = "39";
    
    
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000151�00000000000�011562� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/color/WhiteCompositeConverter.java������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/color/WhiteCompositeConverter.0000644�0001750�0001750�00000001607�12136042272�033320� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern.color;
    
    /**
     * Encloses a given set of converter output in white using the appropriate ANSI escape codes.
     * @param <E>
     * @author  Ceki G&uuml;lc&uuml;
     * @since 1.0.5
     */
    public class WhiteCompositeConverter<E> extends ForegroundCompositeConverterBase<E> {
    
      @Override
      protected String getForegroundColorCode(E event) {
        return ANSIConstants.WHITE_FG;
      }
    }
    �������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000152�00000000000�011563� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/color/YellowCompositeConverter.java�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/color/YellowCompositeConverter0000644�0001750�0001750�00000001612�12136042272�033431� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern.color;
    
    /**
     * Encloses a given set of converter output in yellow using the appropriate ANSI escape codes.
     * @param <E>
     * @author  Ceki G&uuml;lc&uuml;
     * @since 1.0.5
     */
    public class YellowCompositeConverter<E> extends ForegroundCompositeConverterBase<E> {
    
      @Override
      protected String getForegroundColorCode(E event) {
        return ANSIConstants.YELLOW_FG;
      }
    }
    ����������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000154�00000000000�011565� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/color/BoldCyanCompositeConverter.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/pattern/color/BoldCyanCompositeConvert0000644�0001750�0001750�00000002026�12136042272�033322� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern.color;
    
    import static ch.qos.logback.core.pattern.color.ANSIConstants.BOLD;
    import static ch.qos.logback.core.pattern.color.ANSIConstants.CYAN_FG;
    
    /**
     * Encloses a given set of converter output in bold cyan using the appropriate ANSI escape codes.
     *
     * @param <E>
     * @author Ceki G&uuml;lc&uuml;
     * @since 1.0.5
     */
    public class BoldCyanCompositeConverter<E> extends ForegroundCompositeConverterBase<E> {
    
      @Override
      protected String getForegroundColorCode(E event) {
        return BOLD + CYAN_FG;
      }
    }����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/subst/��������������������������������0000755�0001750�0001750�00000000000�12203357067�025033� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/subst/NodeToStringTransformer.java����0000644�0001750�0001750�00000007206�12136042272�032477� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.subst;
    
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.spi.PropertyContainer;
    import ch.qos.logback.core.spi.ScanException;
    import ch.qos.logback.core.util.OptionHelper;
    
    /**
     * Compiles a previously parsed Node chain into a String.
     *
     * @author Ceki G&uuml;c&uuml;
     */
    public class NodeToStringTransformer {
    
      final Node node;
      final PropertyContainer propertyContainer0;
      final PropertyContainer propertyContainer1;
    
      public NodeToStringTransformer(Node node, PropertyContainer propertyContainer0, PropertyContainer propertyContainer1) {
        this.node = node;
        this.propertyContainer0 = propertyContainer0;
        this.propertyContainer1 = propertyContainer1;
      }
    
      public NodeToStringTransformer(Node node, PropertyContainer propertyContainer0) {
        this(node, propertyContainer0, null);
      }
    
      public static String substituteVariable(String input, PropertyContainer pc0, PropertyContainer pc1) throws ScanException {
        Tokenizer tokenizer = new Tokenizer(input);
        Parser parser = new Parser(tokenizer.tokenize());
        Node node = parser.parse();
        NodeToStringTransformer nodeToStringTransformer = new NodeToStringTransformer(node, pc0, pc1);
        return nodeToStringTransformer.transform();
      }
    
      public String transform() {
        StringBuilder stringBuilder = new StringBuilder();
        compileNode(node, stringBuilder);
        return stringBuilder.toString();
      }
    
      private void compileNode(Node inputNode, StringBuilder stringBuilder) {
        Node n = inputNode;
        while (n != null) {
          switch (n.type) {
            case LITERAL:
              handleLiteral(n, stringBuilder);
              break;
            case VARIABLE:
              handleVariable(n, stringBuilder);
              break;
          }
          n = n.next;
        }
      }
    
      private void handleVariable(Node n, StringBuilder stringBuilder) {
        StringBuilder keyBuffer = new StringBuilder();
        Node payload = (Node) n.payload;
        compileNode(payload, keyBuffer);
        String key = keyBuffer.toString();
        String value = lookupKey(key);
        if (value != null) {
          stringBuilder.append(value);
          return;
        }
    
        if (n.defaultPart == null) {
          stringBuilder.append(key + CoreConstants.UNDEFINED_PROPERTY_SUFFIX);
          return;
        }
    
        Node defaultPart = (Node) n.defaultPart;
        StringBuilder defaultPartBuffer = new StringBuilder();
        compileNode(defaultPart, defaultPartBuffer);
        String defaultVal = defaultPartBuffer.toString();
        stringBuilder.append(defaultVal);
      }
    
      private String lookupKey(String key) {
        String value = propertyContainer0.getProperty(key);
        if (value != null)
          return value;
    
        if (propertyContainer1 != null) {
          value = propertyContainer1.getProperty(key);
          if (value != null)
            return value;
        }
    
        value = OptionHelper.getSystemProperty(key, null);
        if (value != null)
          return value;
    
        value = OptionHelper.getEnv(key);
        if (value != null) {
          return value;
        }
    
        return null;
      }
    
    
      private void handleLiteral(Node n, StringBuilder stringBuilder) {
        stringBuilder.append((String) n.payload);
      }
    
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/subst/Tokenizer.java������������������0000644�0001750�0001750�00000007542�12143151241�027645� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.subst;
    
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.spi.ScanException;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class Tokenizer {
    
      enum TokenizerState {LITERAL_STATE, START_STATE, DEFAULT_VAL_STATE}
    
      final String pattern;
      final int patternLength;
    
      public Tokenizer(String pattern) {
        this.pattern = pattern;
        patternLength = pattern.length();
      }
    
      TokenizerState state = TokenizerState.LITERAL_STATE;
      int pointer = 0;
    
      List<Token> tokenize() throws ScanException {
        List<Token> tokenList = new ArrayList<Token>();
        StringBuilder buf = new StringBuilder();
    
        while (pointer < patternLength) {
          char c = pattern.charAt(pointer);
          pointer++;
    
          switch (state) {
            case LITERAL_STATE:
              handleLiteralState(c, tokenList, buf);
              break;
            case START_STATE:
              handleStartState(c, tokenList, buf);
              break;
            case DEFAULT_VAL_STATE:
              handleDefaultValueState(c, tokenList, buf);
            default:
          }
        }
        // EOS
        switch (state) {
          case LITERAL_STATE:
            addLiteralToken(tokenList, buf);
            break;
          case START_STATE:
            throw new ScanException("Unexpected end of pattern string");
        }
        return tokenList;
      }
    
      private void handleDefaultValueState(char c, List<Token> tokenList, StringBuilder stringBuilder) {
        switch(c) {
          case  CoreConstants.DASH_CHAR:
            tokenList.add(Token.DEFAULT_SEP_TOKEN);
            state = TokenizerState.LITERAL_STATE;
            break;
          case CoreConstants.DOLLAR:
            stringBuilder.append(CoreConstants.COLON_CHAR);
            addLiteralToken(tokenList, stringBuilder);
            stringBuilder.setLength(0);
            state = TokenizerState.START_STATE;
            break;
          default:
            stringBuilder.append(CoreConstants.COLON_CHAR).append(c);
            state = TokenizerState.LITERAL_STATE;
            break;
        }
      }
    
      private void handleStartState(char c, List<Token> tokenList, StringBuilder stringBuilder) {
        if (c == CoreConstants.CURLY_LEFT) {
          tokenList.add(Token.START_TOKEN);
        } else {
          stringBuilder.append(CoreConstants.DOLLAR).append(c);
        }
        state = TokenizerState.LITERAL_STATE;
      }
    
      private void handleLiteralState(char c, List<Token> tokenList, StringBuilder stringBuilder) {
        if (c == CoreConstants.DOLLAR) {
          addLiteralToken(tokenList, stringBuilder);
          stringBuilder.setLength(0);
          state = TokenizerState.START_STATE;
        } else if (c == CoreConstants.COLON_CHAR) {
          addLiteralToken(tokenList, stringBuilder);
          stringBuilder.setLength(0);
          state = TokenizerState.DEFAULT_VAL_STATE;
        } else if (c == CoreConstants.CURLY_LEFT) {
          addLiteralToken(tokenList, stringBuilder);
          tokenList.add(Token.CURLY_LEFT_TOKEN);
          stringBuilder.setLength(0);
        } else  if (c == CoreConstants.CURLY_RIGHT) {
          addLiteralToken(tokenList, stringBuilder);
          tokenList.add(Token.CURLY_RIGHT_TOKEN);
          stringBuilder.setLength(0);
        } else {
          stringBuilder.append(c);
        }
    
      }
    
      private void addLiteralToken(List<Token> tokenList, StringBuilder stringBuilder) {
        if (stringBuilder.length() == 0)
          return;
        tokenList.add(new Token(Token.Type.LITERAL, stringBuilder.toString()));
      }
    
    
    }
    
    
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/subst/Token.java����������������������0000644�0001750�0001750�00000003472�12136042272�026756� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.subst;
    
    public class Token {
    
      static public final Token START_TOKEN = new Token(Type.START, null);
      static public final Token CURLY_LEFT_TOKEN = new Token(Type.CURLY_LEFT, null);
      static public final Token CURLY_RIGHT_TOKEN = new Token(Type.CURLY_RIGHT, null);
      static public final Token DEFAULT_SEP_TOKEN = new Token(Type.DEFAULT, null);
    
      public enum Type {LITERAL, START, CURLY_LEFT, CURLY_RIGHT, DEFAULT}
    
      Type type;
      String payload;
    
      public Token(Type type, String payload) {
        this.type = type;
        this.payload = payload;
      }
    
      @Override
      public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
    
        Token token = (Token) o;
    
        if (type != token.type) return false;
        if (payload != null ? !payload.equals(token.payload) : token.payload != null) return false;
    
        return true;
      }
    
      @Override
      public int hashCode() {
        int result = type != null ? type.hashCode() : 0;
        result = 31 * result + (payload != null ? payload.hashCode() : 0);
        return result;
      }
    
      @Override
      public String toString() {
        String result = "Token{" +
                "type=" + type;
        if (payload != null)
          result += ", payload='" + payload + '\'';
    
        result += '}';
        return result;
      }
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/subst/Parser.java���������������������0000644�0001750�0001750�00000007520�12143151241�027123� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.subst;
    
    
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.spi.ScanException;
    
    import java.util.List;
    
    // E = TE|T
    //   = T(E|~)
    // E = TEopt where Eopt = E|~
    // T = LITERAL | { C } |'${' V '}'
    // C = E|E :- E
    //   = E(':-'E|~)
    // V = E|E :- E
    //   = E(':-'E|~)
    
    /**
     * Parse a token list returning a node chain.
     *
     * @author Ceki Gulcu
     */
    public class Parser {
    
      final List<Token> tokenList;
      int pointer = 0;
    
      public Parser(List<Token> tokenList) {
        this.tokenList = tokenList;
      }
    
      public Node parse() throws ScanException {
        return E();
      }
    
      private Node E() throws ScanException {
        Node t = T();
        if (t == null) {
          return null;
        }
        Node eOpt = Eopt();
        if (eOpt != null) {
          t.append(eOpt);
        }
        return t;
      }
    
      // Eopt = E|~
      private Node Eopt() throws ScanException {
        Token next = peekAtCurentToken();
        if (next == null) {
          return null;
        } else {
          return E();
        }
      }
    
      // T = LITERAL | '${' V '}'
      private Node T() throws ScanException {
        Token t = peekAtCurentToken();
    
        switch (t.type) {
          case LITERAL:
            advanceTokenPointer();
            return makeNewLiteralNode(t.payload);
          case CURLY_LEFT:
            advanceTokenPointer();
            Node innerNode = C();
            Token right = peekAtCurentToken();
            expectCurlyRight(right);
            advanceTokenPointer();
            Node curlyLeft = makeNewLiteralNode(CoreConstants.LEFT_ACCOLADE);
            curlyLeft.append(innerNode);
            curlyLeft.append(makeNewLiteralNode(CoreConstants.RIGHT_ACCOLADE));
            return curlyLeft;
          case START:
            advanceTokenPointer();
            Node v = V();
            Token w = peekAtCurentToken();
            expectCurlyRight(w);
            advanceTokenPointer();
            return v;
          default:
            return null;
        }
      }
    
      private Node makeNewLiteralNode(String s) {
        return new Node(Node.Type.LITERAL, s);
      }
    
      // V = E(':='E|~)
      private Node V() throws ScanException {
        Node e = E();
        Node variable = new Node(Node.Type.VARIABLE, e);
        Token t = peekAtCurentToken();
        if (isDefaultToken(t)) {
          advanceTokenPointer();
          Node def = E();
          variable.defaultPart = def;
        }
        return variable;
      }
    
      // C = E(':='E|~)
      private Node C() throws ScanException {
        Node e0 = E();
        Token t = peekAtCurentToken();
        if (isDefaultToken(t)) {
          advanceTokenPointer();
          Node literal = makeNewLiteralNode(CoreConstants.DEFAULT_VALUE_SEPARATOR);
          e0.append(literal);
          Node e1 = E();
          e0.append(e1);
        }
        return e0;
      }
    
      private boolean isDefaultToken(Token t) {
        return t != null && t.type == Token.Type.DEFAULT;
      }
    
      void advanceTokenPointer() {
        pointer++;
      }
    
      void expectNotNull(Token t, String expected) {
        if (t == null) {
          throw new IllegalArgumentException("All tokens consumed but was expecting \""
                  + expected + "\"");
        }
      }
    
      void expectCurlyRight(Token t) throws ScanException {
        expectNotNull(t, "}");
        if (t.type != Token.Type.CURLY_RIGHT) {
          throw new ScanException("Expecting }");
        }
      }
    
      Token peekAtCurentToken() {
        if (pointer < tokenList.size()) {
          return tokenList.get(pointer);
        }
        return null;
      }
    
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/subst/Node.java�����������������������0000644�0001750�0001750�00000006301�12143151241�026550� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.subst;
    
    public class Node {
    
      enum Type {LITERAL, VARIABLE}
    
      Type type;
      Object payload;
      Object defaultPart;
      Node next;
    
    
      public Node(Type type, Object payload) {
        this.type = type;
        this.payload = payload;
      }
    
    
      public Node(Type type, Object payload, Object defaultPart) {
        this.type = type;
        this.payload = payload;
        this.defaultPart = defaultPart;
      }
    
      void append(Node newNode) {
        if(newNode == null)
          return;
        Node n = this;
        while(true) {
          if(n.next == null) {
            n.next = newNode;
            return;
          }
          n = n.next;
        }
      }
    
      @Override
      public String toString() {
        switch (type) {
          case LITERAL:
            return "Node{" +
                    "type=" + type +
                    ", payload='" + payload +
                    "'}";
          case VARIABLE:
            StringBuilder payloadBuf = new StringBuilder();
            StringBuilder defaultPartBuf2 = new StringBuilder();
            if (defaultPart != null)
              recursive((Node) defaultPart, defaultPartBuf2);
    
            recursive((Node) payload, payloadBuf);
            String r = "Node{" +
                    "type=" + type +
                    ", payload='" + payloadBuf.toString()+"'";
            if (defaultPart != null)
              r += ", defaultPart=" + defaultPartBuf2.toString();
            r += '}';
            return r;
        }
        return null;
      }
    
      public void dump() {
        System.out.print(this.toString());
        System.out.print(" -> ");
        if(next != null) {
          next.dump();
        }  else {
          System.out.print(" null");
        }
      }
    
      void recursive(Node n, StringBuilder sb) {
        Node c = n;
        while (c != null) {
          sb.append(c.toString()).append(" --> ");
          c = c.next;
        }
        sb.append("null ");
      }
    
      public void setNext(Node n) {
        this.next = n;
      }
    
      @Override
      public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
    
        Node node = (Node) o;
    
        if (type != node.type) return false;
        if (payload != null ? !payload.equals(node.payload) : node.payload != null) return false;
        if (defaultPart != null ? !defaultPart.equals(node.defaultPart) : node.defaultPart != null) return false;
        if (next != null ? !next.equals(node.next) : node.next != null) return false;
    
    
        return true;
      }
    
      @Override
      public int hashCode() {
        int result = type != null ? type.hashCode() : 0;
        result = 31 * result + (payload != null ? payload.hashCode() : 0);
        result = 31 * result + (defaultPart != null ? defaultPart.hashCode() : 0);
        result = 31 * result + (next != null ? next.hashCode() : 0);
        return result;
      }
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/layout/�������������������������������0000755�0001750�0001750�00000000000�12203357067�025210� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/layout/EchoLayout.java����������������0000644�0001750�0001750�00000001546�12136042272�030127� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.layout;
    
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.LayoutBase;
    
    /**
     * Echos the incoming object adding a line separator character(s) at the end.
     * 
     * @author Ceki
     */
    public class EchoLayout<E> extends LayoutBase<E> {
    
      public String doLayout(E event) {
        return event+CoreConstants.LINE_SEPARATOR;
      }
    
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/LifeCycleManager.java�����������������0000644�0001750�0001750�00000002777�12136042271�027676� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2011, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    
    package ch.qos.logback.core;
    
    import java.util.HashSet;
    import java.util.Set;
    
    import ch.qos.logback.core.spi.LifeCycle;
    
    /**
     * An object that manages a collection of components that implement the
     * {@link LifeCycle} interface.  Each component that is added to the manager
     * will be stopped and removed from the manager when the manager is reset.
     *
     * @author Carl Harris
     */
    public class LifeCycleManager {
    
      private final Set<LifeCycle> components = new HashSet<LifeCycle>();
      
      /**
       * Registers a component with this manager.  
       * <p>
       * @param component the component whose life cycle is to be managed
       */
      public void register(LifeCycle component) {
        components.add(component);
      }
      
      /**
       * Resets this manager.
       * <p>
       * All registered components are stopped and removed from the manager.
       */
      public void reset() {
        for (LifeCycle component : components) {
          if (component.isStarted()) {
            component.stop();
          }
        }
        components.clear();
      }
     
    }
    �logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/encoder/������������������������������0000755�0001750�0001750�00000000000�12203357067�025312� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/encoder/LayoutWrappingEncoder.java����0000644�0001750�0001750�00000010441�12136042272�032434� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.encoder;
    
    import java.io.IOException;
    import java.io.OutputStream;
    import java.io.UnsupportedEncodingException;
    import java.nio.charset.Charset;
    
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.Layout;
    
    public class LayoutWrappingEncoder<E> extends EncoderBase<E> {
    
      protected Layout<E> layout;
    
      /**
       * The charset to use when converting a String into bytes.
       * <p/>
       * By default this property has the value
       * <code>null</null> which corresponds to
       * the system's default charset.
       */
      private Charset charset;
    
      private boolean immediateFlush = true;
    
    
      /**
       * Sets the immediateFlush option. The default value for immediateFlush is 'true'. If set to true,
       * the doEncode() method will immediately flush the underlying OutputStream. Although immediate flushing
       * is safer, it also significantly degrades logging throughput.
       *
       * @since 1.0.3
       */
      public void setImmediateFlush(boolean immediateFlush) {
        this.immediateFlush = immediateFlush;
      }
    
    
      public boolean isImmediateFlush() {
        return immediateFlush;
      }
    
    
      public Layout<E> getLayout() {
        return layout;
      }
    
      public void setLayout(Layout<E> layout) {
        this.layout = layout;
      }
    
      public Charset getCharset() {
        return charset;
      }
    
      /**
       * Set the charset to use when converting the string returned by the layout
       * into bytes.
       * <p/>
       * By default this property has the value
       * <code>null</null> which corresponds to
       * the system's default charset.
       *
       * @param charset
       */
      public void setCharset(Charset charset) {
        this.charset = charset;
      }
    
      public void init(OutputStream os) throws IOException {
        super.init(os);
        writeHeader();
      }
    
      void writeHeader() throws IOException {
        if (layout != null && (outputStream != null)) {
          StringBuilder sb = new StringBuilder();
          appendIfNotNull(sb, layout.getFileHeader());
          appendIfNotNull(sb, layout.getPresentationHeader());
          if (sb.length() > 0) {
            sb.append(CoreConstants.LINE_SEPARATOR);
            // If at least one of file header or presentation header were not
            // null, then append a line separator.
            // This should be useful in most cases and should not hurt.
            outputStream.write(convertToBytes(sb.toString()));
            outputStream.flush();
          }
        }
      }
    
      public void close() throws IOException {
        writeFooter();
      }
    
      void writeFooter() throws IOException {
        if (layout != null && outputStream != null) {
          StringBuilder sb = new StringBuilder();
          appendIfNotNull(sb, layout.getPresentationFooter());
          appendIfNotNull(sb, layout.getFileFooter());
          if (sb.length() > 0) {
            outputStream.write(convertToBytes(sb.toString()));
            outputStream.flush();
          }
        }
      }
    
      private byte[] convertToBytes(String s) {
        if (charset == null) {
          return s.getBytes();
        } else {
          try {
            return s.getBytes(charset.name());
          } catch (UnsupportedEncodingException e) {
            throw new IllegalStateException(
                    "An existing charset cannot possibly be unsupported.");
          }
        }
      }
    
      public void doEncode(E event) throws IOException {
        String txt = layout.doLayout(event);
        outputStream.write(convertToBytes(txt));
        if (immediateFlush)
          outputStream.flush();
      }
    
      public boolean isStarted() {
        return false;
      }
    
      public void start() {
        started = true;
      }
    
      public void stop() {
        started = false;
        if(outputStream != null) {
          try {
            outputStream.flush();
          } catch (IOException e) {
          }
        }
      }
    
      private void appendIfNotNull(StringBuilder sb, String s) {
        if (s != null) {
          sb.append(s);
        }
      }
    
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/encoder/Encoder.java������������������0000644�0001750�0001750�00000004265�12136042272�027535� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.encoder;
    
    import java.io.IOException;
    import java.io.OutputStream;
    
    import ch.qos.logback.core.spi.ContextAware;
    import ch.qos.logback.core.spi.LifeCycle;
    
    /**
     * Encoders are responsible for transform an incoming event into a byte array
     * *and* writing out the byte array onto the appropriate {@link OutputStream}.
     * Thus, encoders have total control of what and when gets written to the
     * {@link OutputStream} maintained by the owning appender.
     * 
     * 
     * @author Ceki G&uuml;lc&uuml;
     * @author Joen Huxhorn
     * @author Maarten Bosteels
     * 
     * @param <E>
     *          event type
     * @since 0.9.19
     */
    public interface Encoder<E> extends ContextAware, LifeCycle {
    
      /**
       * This method is called when the owning appender starts or whenever output
       * needs to be directed to a new OutputStream, for instance as a result of a
       * rollover. Implementing encoders should at the very least remember the
       * OutputStream passed as argument and use it in future operations.
       * 
       * @param os
       * @throws IOException
       */
      void init(OutputStream os) throws IOException;
    
      /**
       * Encode and write an event to the appropriate {@link OutputStream}.
       * Implementations are free to differ writing out of the encoded event and
       * instead write in batches.
       * 
       * @param event
       * @throws IOException
       */
      void doEncode(E event) throws IOException;
    
      /**
       * This method is called prior to the closing of the underling
       * {@link OutputStream}. Implementations MUST not close the underlying
       * {@link OutputStream} which is the responsibility of the owning appender.
       * 
       * @throws IOException
       */
      void close() throws IOException;
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/encoder/EchoEncoder.java��������������0000644�0001750�0001750�00000002446�12136042272�030333� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.encoder;
    
    import java.io.IOException;
    import java.io.OutputStream;
    
    import ch.qos.logback.core.CoreConstants;
    
    public class EchoEncoder<E> extends EncoderBase<E> {
    
      String fileHeader;
      String fileFooter;
    
      public void doEncode(E event) throws IOException {
        String val = event + CoreConstants.LINE_SEPARATOR;
        outputStream.write(val.getBytes());
        // necessary if ResilientFileOutputStream is buffered
        outputStream.flush();
      }
    
      public void close() throws IOException {
        if (fileFooter == null) {
          return;
        }
        outputStream.write(fileFooter.getBytes());
      }
    
      public void init(OutputStream os) throws IOException {
        super.init(os);
        if (fileHeader == null) {
          return;
        }
        outputStream.write(fileHeader.getBytes());
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/encoder/EncoderBase.java��������������0000644�0001750�0001750�00000002061�12136042272�030320� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.encoder;
    
    import java.io.IOException;
    import java.io.OutputStream;
    
    import ch.qos.logback.core.spi.ContextAwareBase;
    
    abstract public class EncoderBase<E> extends ContextAwareBase implements Encoder<E> {
    
      protected boolean started;
    
      protected OutputStream outputStream;
      
      public void init(OutputStream os) throws IOException {
        this.outputStream = os;
      }
      
      public boolean isStarted() {
        return started;
      }
      
      public void start() {
        started = true;
      }
    
      public void stop() {
        started = false;
      }
    }  
    
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/encoder/EventObjectInputStream.java���0000644�0001750�0001750�00000010475�12136042272�032562� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.encoder;
    
    import static ch.qos.logback.core.CoreConstants.BYTES_PER_INT;
    import static ch.qos.logback.core.encoder.ObjectStreamEncoder.START_PEBBLE;
    import static ch.qos.logback.core.encoder.ObjectStreamEncoder.STOP_PEBBLE;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.ObjectInputStream;
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * Restitute the contents of an input stream as java objects.
     * 
     * @author Ceki G&uuml;lc&uuml;
     *
     * @param <E>
     */
    public class EventObjectInputStream<E> extends InputStream {
    
      NonClosableInputStream ncis;
      List<E> buffer = new ArrayList<E>();
    
      int index = 0;
    
      EventObjectInputStream(InputStream is) throws IOException {
        this.ncis = new NonClosableInputStream(is);
      }
    
      @Override
      public int read() throws IOException {
        throw new UnsupportedOperationException(
            "Only the readEvent method is supported.");
      }
    
      /**
       * Returns the number of bytes available
       */
      public int available() throws IOException {
        return ncis.available();
      }
    
      public E readEvent() throws IOException {
    
        E event = getFromBuffer();
        if (event != null) {
          return event;
        }
    
        internalReset();
        int count = readHeader();
        if(count == -1) {
          return null;
        }
        readPayload(count);
        readFooter(count);
        return getFromBuffer();
      }
    
      private void  internalReset() {
        index = 0;
        buffer.clear();
      }
      
      E getFromBuffer() {
        if (index >= buffer.size()) {
          return null;
        }
        return buffer.get(this.index++);
      }
    
      int readHeader() throws IOException {
        byte[] headerBA = new byte[4 * BYTES_PER_INT];
        //System.out.println("available="+ncis.available());
        int bytesRead = ncis.read(headerBA);
        if(bytesRead == -1) {
          return -1;
        }
        //System.out.println("**bytesRead="+bytesRead);
        
        //System.out.println(ByteArrayUtil.toHexString(headerBA));
        
        int offset = 0;
        int startPebble = ByteArrayUtil.readInt(headerBA, offset);
        if (startPebble != START_PEBBLE) {
          throw new IllegalStateException(
              "Does not look like data created by ObjectStreamEncoder");
        }
        offset += BYTES_PER_INT;
        int count = ByteArrayUtil.readInt(headerBA, offset);
        offset += BYTES_PER_INT;
        int endPointer = ByteArrayUtil.readInt(headerBA, offset);
        offset += BYTES_PER_INT;
        int checksum = ByteArrayUtil.readInt(headerBA, offset);
        if (checksum != (START_PEBBLE ^ count)) {
          throw new IllegalStateException("Invalid checksum");
        }
        return count;
      }
    
      @SuppressWarnings("unchecked")
      E readEvents(ObjectInputStream ois) throws IOException {
        E e = null;
        try {
          e = (E) ois.readObject();
          buffer.add(e);
        } catch (ClassNotFoundException e1) {
          // FIXME Auto-generated catch block
          e1.printStackTrace();
        }
        return e;
      }
    
      void readFooter(int count) throws IOException {
        byte[] headerBA = new byte[2 * BYTES_PER_INT];
        ncis.read(headerBA);
        
        int offset = 0;
        int stopPebble = ByteArrayUtil.readInt(headerBA, offset);
        if (stopPebble != STOP_PEBBLE) {
          throw new IllegalStateException(
              "Looks like a corrupt stream");
        }
        offset += BYTES_PER_INT;
        int checksum = ByteArrayUtil.readInt(headerBA, offset);
        if (checksum != (STOP_PEBBLE ^ count)) {
          throw new IllegalStateException("Invalid checksum");
        }
      }
      
      void readPayload(int count) throws IOException {
        List<E> eventList = new ArrayList<E>(count);
        ObjectInputStream ois = new ObjectInputStream(ncis);
        for (int i = 0; i < count; i++) {
          E e = (E) readEvents(ois);
          eventList.add(e);
        }
        ois.close();
      }
    
      public void close() throws IOException {
        ncis.realClose();
      }
    
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/encoder/ObjectStreamEncoder.java������0000644�0001750�0001750�00000005135�12136042272�032035� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.encoder;
    
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.ObjectOutputStream;
    import java.io.OutputStream;
    import java.util.ArrayList;
    import java.util.List;
    
    import ch.qos.logback.core.CoreConstants;
    
    /**
     * Write out events as java objects.
     * 
     * @author Ceki G&uuml;lc&uuml;
     *
     * @param <E>
     */
    public class ObjectStreamEncoder<E> extends EncoderBase<E> {
    
      static public final int START_PEBBLE = 1853421169;
      static public final int STOP_PEBBLE = 640373619;
    
      private int MAX_BUFFER_SIZE = 100;
    
      List<E> bufferList = new ArrayList<E>(MAX_BUFFER_SIZE);
    
      public void doEncode(E event) throws IOException {
        bufferList.add(event);
        if (bufferList.size() == MAX_BUFFER_SIZE) {
          writeBuffer();
        }
      }
    
      void writeHeader(ByteArrayOutputStream baos, int bufferSize) {
        ByteArrayUtil.writeInt(baos, START_PEBBLE);
        ByteArrayUtil.writeInt(baos, bufferSize);
        ByteArrayUtil.writeInt(baos, 0);
        ByteArrayUtil.writeInt(baos, START_PEBBLE^bufferSize);
      }
      
      void writeFooter(ByteArrayOutputStream baos, int bufferSize) {
        ByteArrayUtil.writeInt(baos, STOP_PEBBLE);
        ByteArrayUtil.writeInt(baos, STOP_PEBBLE ^ bufferSize);
      }
      void writeBuffer() throws IOException {
        ByteArrayOutputStream baos = new ByteArrayOutputStream(10000);
        
        int size = bufferList.size();
        writeHeader(baos, size);
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        for (E e : bufferList) {
          oos.writeObject(e);
        }
        bufferList.clear();
        oos.flush();
    
        writeFooter(baos, size);
    
        byte[] byteArray = baos.toByteArray();
        oos.close();
        writeEndPosition(byteArray);
        outputStream.write(byteArray);
        
      }
      
      void writeEndPosition(byte[] byteArray) {
        int offset = 2*CoreConstants.BYTES_PER_INT;
        ByteArrayUtil.writeInt(byteArray,offset, byteArray.length-offset);
      }
    
      @Override
      public void init(OutputStream os) throws IOException {
        super.init(os);
        bufferList.clear();
      }
    
      public void close() throws IOException {
        writeBuffer();
      }
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/encoder/ByteArrayUtil.java������������0000644�0001750�0001750�00000003510�12136042272�030706� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.encoder;
    
    import java.io.ByteArrayOutputStream;
    
    public class ByteArrayUtil {
    
      // big-endian
      static void writeInt(byte[] byteArray, int offset, int i) {
        for (int j = 0; j < 4; j++) {
          int shift = 24 - j * 8;
          byteArray[offset + j] = (byte) (i >>> shift);
        }
      }
    
      static void writeInt(ByteArrayOutputStream baos, int i) {
        for (int j = 0; j < 4; j++) {
          int shift = 24 - j * 8;
          baos.write((byte) (i >>> shift));
        }
      }
      
      // big-endian  
      static int readInt(byte[] byteArray, int offset) {
        int i = 0;
        for (int j = 0; j < 4; j++) {
          int shift = 24 - j * 8;
          i += (byteArray[offset + j] & 0xFF) << shift;
        }
        return i;
      }
      
      static public String toHexString(byte[] ba) {
        StringBuffer sbuf = new StringBuffer();
        for(byte b: ba) {
          String s = Integer.toHexString( (int)(b & 0xff));
          if(s.length() == 1) {
            sbuf.append('0');
          }
          sbuf.append(s);
        }
        return sbuf.toString();
      }
    
      static public byte[] hexStringToByteArray(String s) {
        int len = s.length();
        byte[] ba = new byte[len/2];
    
        for(int i = 0; i < ba.length; i++) {
          int j = i*2;
          int t = Integer.parseInt(s.substring(j, j+2), 16);
          byte b = (byte) (t & 0xFF);
          ba[i] = b;
        }
        return ba;
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/encoder/NonClosableInputStream.java���0000644�0001750�0001750�00000001715�12136042272�032546� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.encoder;
    
    import java.io.FilterInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    
    public class NonClosableInputStream extends FilterInputStream {
    
      NonClosableInputStream(InputStream is) {
        super(is);
      }
    
      /**
       * The whole point of this input stream is to ignore invocations to close()
       */
      @Override
      public void close() {
    
      }
    
      public void realClose() throws IOException {
        super.close();
      }
    
    }
    ���������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/html/���������������������������������0000755�0001750�0001750�00000000000�12203357067�024637� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/html/package.html���������������������0000644�0001750�0001750�00000000335�11377016712�027121� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
    
    <html> 
      <head>
        <title></title>
      </head>
      
      <body>
        
        <p>Contains the base classes needed to format logging events to HTML.</p>
    
      </body> 
    </html>���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/html/HTMLLayoutBase.java��������������0000644�0001750�0001750�00000016230�12136042272�030233� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.html;
    
    import java.util.HashMap;
    import java.util.Map;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.CoreConstants;
    import static ch.qos.logback.core.CoreConstants.LINE_SEPARATOR;
    import ch.qos.logback.core.LayoutBase;
    import ch.qos.logback.core.pattern.Converter;
    import ch.qos.logback.core.pattern.ConverterUtil;
    import ch.qos.logback.core.pattern.parser.Node;
    import ch.qos.logback.core.pattern.parser.Parser;
    import ch.qos.logback.core.spi.ScanException;
    
    /**
     * This class is a base class for HTMLLayout classes part of
     * other logback modules such as logback-classic and logback-access.
     * 
     *
     * @author S&eacute;bastien Pennec
     */
    public abstract class HTMLLayoutBase<E> extends LayoutBase<E> {
    
      protected String pattern;
    
      protected Converter<E> head;
    
      protected String title = "Logback Log Messages";
    
      //It is the responsibility of derived classes to set
      //this variable in their constructor to a default value.
      protected CssBuilder cssBuilder;
    
       // counter keeping track of the rows output
      protected long counter = 0;
      
      /**
       * Set the <b>ConversionPattern </b> option. This is the string which controls
       * formatting and consists of a mix of literal content and conversion
       * specifiers.
       */
      public void setPattern(String conversionPattern) {
        pattern = conversionPattern;
      }
    
      /**
       * Returns the value of the <b>ConversionPattern </b> option.
       */
      public String getPattern() {
        return pattern;
      }
    
      public CssBuilder getCssBuilder() {
        return cssBuilder;
      }
    
      public void setCssBuilder(CssBuilder cssBuilder) {
        this.cssBuilder = cssBuilder;
      }
    
      /**
       * Parses the pattern and creates the Converter linked list.
       */
      @Override
      public void start() {
        int errorCount = 0;
        
        try {
          Parser<E> p = new Parser<E>(pattern);
          p.setContext(getContext());
          Node t = p.parse();
          this.head = p.compile(t, getEffectiveConverterMap());
          ConverterUtil.startConverters(this.head);
        } catch (ScanException ex) {
          addError("Incorrect pattern found", ex);
          errorCount++;
        }
    
        if (errorCount == 0) {
          super.started = true;
        }
      }
      
      protected abstract Map<String, String> getDefaultConverterMap();
    
      
      /**
       * Returns a map where the default converter map is merged with the map
       * contained in the context.
       */
      public Map<String, String> getEffectiveConverterMap() {
        Map<String, String> effectiveMap = new HashMap<String, String>();
    
        // add the least specific map fist
        Map<String, String> defaultMap = getDefaultConverterMap();
        if (defaultMap != null) {
          effectiveMap.putAll(defaultMap);
        }
    
        // contextMap is more specific than the default map
        Context context = getContext();
        if (context != null) {
          @SuppressWarnings("unchecked")
          Map<String, String> contextMap = (Map<String, String>) context
              .getObject(CoreConstants.PATTERN_RULE_REGISTRY);
          if (contextMap != null) {
            effectiveMap.putAll(contextMap);
          }
        }
        return effectiveMap;
      }
      
      /**
       * The <b>Title </b> option takes a String value. This option sets the
       * document title of the generated HTML document.
       * 
       * <p>
       * Defaults to 'Logback Log Messages'.
       */
      public void setTitle(String title) {
        this.title = title;
      }
    
      /**
       * Returns the current value of the <b>Title </b> option.
       */
      public String getTitle() {
        return title;
      }
    
      /**
       * Returns the content type output by this layout, i.e "text/html".
       */
      @Override
      public String getContentType() {
        return "text/html";
      }
    
      /**
       * Returns appropriate HTML headers.
       */
      @Override
      public String getFileHeader() {
        StringBuilder sbuf = new StringBuilder();
        sbuf.append("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"");
        sbuf.append(" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">");
        sbuf.append(LINE_SEPARATOR);
        sbuf.append("<html>");
        sbuf.append(LINE_SEPARATOR);
        sbuf.append("  <head>");
        sbuf.append(LINE_SEPARATOR);
        sbuf.append("    <title>");
        sbuf.append(title);
        sbuf.append("</title>");
        sbuf.append(LINE_SEPARATOR);
        
        cssBuilder.addCss(sbuf);
    
        sbuf.append(LINE_SEPARATOR);
        sbuf.append("  </head>");
        sbuf.append(LINE_SEPARATOR);
        sbuf.append("<body>");
        sbuf.append(LINE_SEPARATOR);
    
        return sbuf.toString();
      }
      
      public String getPresentationHeader() {
        StringBuilder sbuf = new StringBuilder();
        sbuf.append("<hr/>");
        sbuf.append(LINE_SEPARATOR);
        sbuf.append("<p>Log session start time ");
        sbuf.append(new java.util.Date());
        sbuf.append("</p><p></p>");
        sbuf.append(LINE_SEPARATOR);
        sbuf.append(LINE_SEPARATOR);
        sbuf.append("<table cellspacing=\"0\">");
        sbuf.append(LINE_SEPARATOR);
    
        buildHeaderRowForTable(sbuf);
        
        return sbuf.toString();
      }
    
    
      private void buildHeaderRowForTable(StringBuilder sbuf) {
        Converter c = head;
        String name;
        sbuf.append("<tr class=\"header\">");
        sbuf.append(LINE_SEPARATOR);
        while (c != null) {
          name = computeConverterName(c);
          if (name == null) {
            c = c.getNext();
            continue;
          }
          sbuf.append("<td class=\"");
          sbuf.append(computeConverterName(c));
          sbuf.append("\">");
          sbuf.append(computeConverterName(c));
          sbuf.append("</td>");
          sbuf.append(LINE_SEPARATOR);
          c = c.getNext();
        }
        sbuf.append("</tr>");
        sbuf.append(LINE_SEPARATOR);
      }
      
      public String getPresentationFooter() {
        StringBuilder sbuf = new StringBuilder();
        sbuf.append("</table>");
        return sbuf.toString();    
      }
    
      /**
       * Returns the appropriate HTML footers.
       */
      @Override
      public String getFileFooter() {
        StringBuilder sbuf = new StringBuilder();
        sbuf.append(LINE_SEPARATOR);
        sbuf.append("</body></html>");
        return sbuf.toString();
      }
      
      protected void startNewTableIfLimitReached(StringBuilder sbuf) {
        if (this.counter >= CoreConstants.TABLE_ROW_LIMIT) {
          counter = 0;
          sbuf.append("</table>");
          sbuf.append(LINE_SEPARATOR);
          sbuf.append("<p></p>");
          sbuf.append("<table cellspacing=\"0\">");
          sbuf.append(LINE_SEPARATOR);
          buildHeaderRowForTable(sbuf);
        }
      }
    
      protected String computeConverterName(Converter c) {
        String className = c.getClass().getSimpleName();
        int index = className.indexOf("Converter");
        if (index == -1) {
          return className;
        } else {
          return className.substring(0, index);
        }
      }
    
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/html/NOPThrowableRenderer.java��������0000644�0001750�0001750�00000001332�12136042272�031466� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.html;
    
    import ch.qos.logback.core.html.IThrowableRenderer;
    
    
    public class NOPThrowableRenderer implements IThrowableRenderer {
    
      public void render(StringBuilder sbuf, Object event) {
        return;
      }
    
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/html/CssBuilder.java������������������0000644�0001750�0001750�00000001127�12136042272�027534� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.html;
    
    public interface CssBuilder {
    
      void addCss(StringBuilder sbuf);
      
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/html/IThrowableRenderer.java����������0000644�0001750�0001750�00000001157�12136042272�031227� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.html;
    
    
    public interface IThrowableRenderer<E> {
      
      void render(StringBuilder sbuf, E event);
      
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/UnsynchronizedAppenderBase.java�������0000644�0001750�0001750�00000006770�12136042271�032035� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core;
    
    import java.util.List;
    
    import ch.qos.logback.core.filter.Filter;
    import ch.qos.logback.core.spi.ContextAwareBase;
    import ch.qos.logback.core.spi.FilterAttachableImpl;
    import ch.qos.logback.core.spi.FilterReply;
    import ch.qos.logback.core.status.WarnStatus;
    
    /**
     * Similar to AppenderBase except that derived appenders need to handle 
     * thread synchronization on their own.
     * 
     * @author Ceki G&uuml;lc&uuml;
     * @author Ralph Goers
     */
    abstract public class UnsynchronizedAppenderBase<E> extends ContextAwareBase implements
        Appender<E> {
    
      protected boolean started = false;
    
      // using a ThreadLocal instead of a boolean add 75 nanoseconds per
      // doAppend invocation. This is tolerable as doAppend takes at least a few microseconds
      // on a real appender
      /**
       * The guard prevents an appender from repeatedly calling its own doAppend
       * method.
       */
      private ThreadLocal<Boolean> guard = new ThreadLocal<Boolean>();
    
    
      /**
       * Appenders are named.
       */
      protected String name;
    
      private FilterAttachableImpl<E> fai = new FilterAttachableImpl<E>();
    
      public String getName() {
        return name;
      }
    
      private int statusRepeatCount = 0;
      private int exceptionCount = 0;
    
      static final int ALLOWED_REPEATS = 3;
    
      public void doAppend(E eventObject) {
        // WARNING: The guard check MUST be the first statement in the
        // doAppend() method.
          
        // prevent re-entry.
        if (Boolean.TRUE.equals(guard.get())) {
          return;
        }
    
        try {
          guard.set(Boolean.TRUE);
    
          if (!this.started) {
            if (statusRepeatCount++ < ALLOWED_REPEATS) {
              addStatus(new WarnStatus(
                  "Attempted to append to non started appender [" + name + "].",
                  this));
            }
            return;
          }
    
          if (getFilterChainDecision(eventObject) == FilterReply.DENY) {
            return;
          }
    
          // ok, we now invoke derived class' implementation of append
          this.append(eventObject);
    
        } catch (Exception e) {
          if (exceptionCount++ < ALLOWED_REPEATS) {
            addError("Appender [" + name + "] failed to append.", e);
          }
        } finally {
          guard.set(Boolean.FALSE);
        }
      }
    
      abstract protected void append(E eventObject);
    
      /**
       * Set the name of this appender.
       */
      public void setName(String name) {
        this.name = name;
      }
    
      public void start() {
        started = true;
      }
    
      public void stop() {
        started = false;
      }
    
      public boolean isStarted() {
        return started;
      }
    
      public String toString() {
        return this.getClass().getName() + "[" + name + "]";
      }
    
      public void addFilter(Filter<E> newFilter) {
        fai.addFilter(newFilter);
      }
    
      public void clearAllFilters() {
        fai.clearAllFilters();
      }
    
      public List<Filter<E>> getCopyOfAttachedFiltersList() {
        return fai.getCopyOfAttachedFiltersList();
      }
    
      public FilterReply getFilterChainDecision(E event) {
        return fai.getFilterChainDecision(event);
      }
    }
    ��������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/PropertyDefinerBase.java��������������0000644�0001750�0001750�00000001750�12136560032�030446� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core;
    
    import ch.qos.logback.core.spi.ContextAwareBase;
    import ch.qos.logback.core.spi.PropertyDefiner;
    
    /**
     * A skeleton implementation for property definers so that they derive from {@link ContextAwareBase}.
     *  
     * @author Aleksey Didik
     */
    public abstract class PropertyDefinerBase extends ContextAwareBase implements PropertyDefiner {
    
      static protected String booleanAsStr(boolean bool) {
        return bool ? Boolean.TRUE.toString() : Boolean.FALSE.toString();
      }
    
    }
    ������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/ContextBase.java����������������������0000644�0001750�0001750�00000013674�12140214537�026762� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core;
    
    import static ch.qos.logback.core.CoreConstants.CONTEXT_NAME_KEY;
    
    import java.util.HashMap;
    import java.util.Map;
    import java.util.concurrent.ExecutorService;
    
    import ch.qos.logback.core.spi.LifeCycle;
    import ch.qos.logback.core.spi.LogbackLock;
    import ch.qos.logback.core.status.StatusManager;
    import ch.qos.logback.core.util.ExecutorServiceUtil;
    
    public class ContextBase implements Context, LifeCycle {
    
      private long birthTime = System.currentTimeMillis();
    
      private String name;
      private StatusManager sm = new BasicStatusManager();
      // TODO propertyMap should be observable so that we can be notified
      // when it changes so that a new instance of propertyMap can be
      // serialized. For the time being, we ignore this shortcoming.
      Map<String, String> propertyMap = new HashMap<String, String>();
      Map<String, Object> objectMap = new HashMap<String, Object>();
    
      LogbackLock configurationLock = new LogbackLock();
    
      private volatile ExecutorService executorService;
      private LifeCycleManager lifeCycleManager;
      private boolean started;
      
      public StatusManager getStatusManager() {
        return sm;
      }
    
      /**
       * Set the {@link StatusManager} for this context. Note that by default this
       * context is initialized with a {@link BasicStatusManager}. A null value for
       * the 'statusManager' argument is not allowed.
       * <p/>
       * <p> A malicious attacker can set the status manager to a dummy instance,
       * disabling internal error reporting.
       *
       * @param statusManager the new status manager
       */
      public void setStatusManager(StatusManager statusManager) {
        // this method was added in response to http://jira.qos.ch/browse/LBCORE-35
        if (sm == null) {
          throw new IllegalArgumentException("null StatusManager not allowed");
        }
        this.sm = statusManager;
      }
    
      public Map<String, String> getCopyOfPropertyMap() {
        return new HashMap<String, String>(propertyMap);
      }
    
      public void putProperty(String key, String val) {
        this.propertyMap.put(key, val);
      }
    
      /**
       * Given a key, return the corresponding property value. If invoked with
       * the special key "CONTEXT_NAME", the name of the context is returned.
       *
       * @param key
       * @return
       */
      public String getProperty(String key) {
        if (CONTEXT_NAME_KEY.equals(key))
          return getName();
    
        return (String) this.propertyMap.get(key);
      }
    
      public Object getObject(String key) {
        return objectMap.get(key);
      }
    
      public void putObject(String key, Object value) {
        objectMap.put(key, value);
      }
    
      public String getName() {
        return name;
      }
    
      public void start() {
        // We'd like to create the executor service here, but we can't;
        // ContextBase has not always implemented LifeCycle and there are *many*
        // uses (mostly in tests) that would need to be modified.
        started = true;
      }
      
      public void stop() {
        // We don't check "started" here, because the executor service uses
        // lazy initialization, rather than being created in the start method
        stopExecutorService();
        started = false;
      }
    
      public boolean isStarted() {
        return started;
      }
    
      /**
       * Clear the internal objectMap and all properties.
       */
      public void reset() {
        getLifeCycleManager().reset();
        propertyMap.clear();
        objectMap.clear();
      }
    
      /**
       * The context name can be set only if it is not already set, or if the
       * current name is the default context name, namely "default", or if the
       * current name and the old name are the same.
       *
       * @throws IllegalStateException if the context already has a name, other than "default".
       */
      public void setName(String name) throws IllegalStateException {
        if (name != null && name.equals(this.name)) {
          return; // idempotent naming
        }
        if (this.name == null
                || CoreConstants.DEFAULT_CONTEXT_NAME.equals(this.name)) {
          this.name = name;
        } else {
          throw new IllegalStateException("Context has been already given a name");
        }
      }
    
      public long getBirthTime() {
        return birthTime;
      }
    
      public Object getConfigurationLock() {
        return configurationLock;
      }
    
      public ExecutorService getExecutorService() {
        if (executorService == null) {
          synchronized (this) {
            if (executorService == null) {
              executorService = ExecutorServiceUtil.newExecutorService();
            }
          }
        }
        return executorService; 
      }
    
      private synchronized void stopExecutorService() {
        if (executorService != null) {
          ExecutorServiceUtil.shutdown(executorService);
          executorService = null;
        }
      }
      
      public void register(LifeCycle component) {
        getLifeCycleManager().register(component);
      }
    
      /**
       * Gets the life cycle manager for this context.
       * <p>
       * The default implementation lazily initializes an instance of
       * {@link LifeCycleManager}.  Subclasses may override to provide a custom 
       * manager implementation, but must take care to return the same manager
       * object for each call to this method.
       * <p>
       * This is exposed primarily to support instrumentation for unit testing.
       * 
       * @return manager object 
       */
      synchronized LifeCycleManager getLifeCycleManager() {
        if (lifeCycleManager == null) {
          lifeCycleManager = new LifeCycleManager();
        }
        return lifeCycleManager;
      }
      
      @Override
      public String toString() {
        return name;
      }
    
    }
    ��������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/status/�������������������������������0000755�0001750�0001750�00000000000�12203357067�025216� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/status/InfoStatus.java����������������0000644�0001750�0001750�00000001421�12136042272�030150� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.status;
    
    
    
    public class InfoStatus extends StatusBase {
      public InfoStatus(String msg, Object origin) {
        super(Status.INFO, msg, origin);
      }
    
      public InfoStatus(String msg, Object origin, Throwable t) {
        super(Status.INFO, msg, origin, t);
      }
    
     }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/status/StatusBase.java����������������0000644�0001750�0001750�00000010163�12136042272�030132� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.status;
    
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    
    abstract public class StatusBase implements Status {
    
      static private final List<Status> EMPTY_LIST = new ArrayList<Status>(0);
      
      int level;
      final String message;
      final Object origin;
      List<Status> childrenList;
      Throwable throwable;
      long date;
    
      StatusBase(int level, String msg, Object origin) {
        this(level, msg, origin, null);
      }
    
      StatusBase(int level, String msg, Object origin, Throwable t) {
        this.level = level;
        this.message = msg;
        this.origin = origin;
        this.throwable = t;
        this.date = System.currentTimeMillis();
      }
    
      public synchronized void add(Status child) {
        if (child == null) {
          throw new NullPointerException("Null values are not valid Status.");
        }
        if (childrenList == null) {
          childrenList = new ArrayList<Status>();
        }
        childrenList.add(child);
      }
    
      public synchronized boolean hasChildren() {
        return ((childrenList != null) && (childrenList.size() > 0));
      }
    
      public synchronized Iterator<Status> iterator() {
        if (childrenList != null) {
          return childrenList.iterator();
        } else {
          return EMPTY_LIST.iterator();
        }
      }
    
      public synchronized boolean remove(Status statusToRemove) {
        if (childrenList == null) {
          return false;
        }
        // TODO also search in childrens' children
        return childrenList.remove(statusToRemove);
      }
    
      public int getLevel() {
        return level;
      }
    
      // status messages are not supposed to contains cycles.
      // cyclic status arrangements are like to cause deadlocks
      // when this method is called from different thread on
      // different status objects lying on the same cycle
      public synchronized int getEffectiveLevel() {
        int result = level;
        int effLevel;
    
        Iterator it = iterator();
        Status s;
        while (it.hasNext()) {
          s = (Status) it.next();
          effLevel = s.getEffectiveLevel();
          if (effLevel > result) {
            result = effLevel;
          }
        }
        return result;
      }
    
      public String getMessage() {
        return message;
      }
    
      public Object getOrigin() {
        return origin;
      }
    
      public Throwable getThrowable() {
        return throwable;
      }
      
      public Long getDate() {
        return date;
      }
    
      /**
       * @Override
       */
      public String toString() {
        StringBuffer buf = new StringBuffer();
        switch (getEffectiveLevel()) {
        case INFO:
          buf.append("INFO");
          break;
        case WARN:
          buf.append("WARN");
          break;
        case ERROR:
          buf.append("ERROR");
          break;
        }
        if (origin != null) {
          buf.append(" in ");
          buf.append(origin);
          buf.append(" -");
        }
    
        buf.append(" ");
        buf.append(message);
    
        if (throwable != null) {
          buf.append(" ");
          buf.append(throwable);
        }
    
        return buf.toString();
      }
    
      @Override
      public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + level;
        result = prime * result + ((message == null) ? 0 : message.hashCode());
        return result;
      }
    
      @Override
      public boolean equals(Object obj) {
        if (this == obj)
          return true;
        if (obj == null)
          return false;
        if (getClass() != obj.getClass())
          return false;
        final StatusBase other = (StatusBase) obj;
        if (level != other.level)
          return false;
        if (message == null) {
          if (other.message != null)
            return false;
        } else if (!message.equals(other.message))
          return false;
        return true;
      }
    
      
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/status/package.html�������������������0000644�0001750�0001750�00000000270�11377016712�027476� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
    
    <html>
    <head>
    <title></title>
    </head>
    
    <body>
    
    <p>Contains logback's internal error reporting system.</p>
    
    </body>
    </html>
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/status/OnConsoleStatusListener.java���0000644�0001750�0001750�00000002520�12136042272�032663� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.status;
    
    import ch.qos.logback.core.Context;
    
    import java.io.PrintStream;
    
    /**
     * Print all new incoming status messages on the console (System.out).
     *
     * @author Ceki G&uuml;lc&uuml;
     */
    public class OnConsoleStatusListener extends OnPrintStreamStatusListenerBase {
    
      @Override
      protected PrintStream getPrintStream() {
        return System.out;
      }
    
      /**
       * This utility method adds a new OnConsoleStatusListener to the context
       * passed as parameter.
       *
       * @param context
       * @since 1.0.1
       */
      static public void addNewInstanceToContext(Context context) {
        OnConsoleStatusListener onConsoleStatusListener = new OnConsoleStatusListener();
        onConsoleStatusListener.setContext(context);
        onConsoleStatusListener.start();
        context.getStatusManager().add(onConsoleStatusListener);
      }
    
    
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000152�00000000000�011563� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/status/OnPrintStreamStatusListenerBase.java�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/status/OnPrintStreamStatusListenerBase0000644�0001750�0001750�00000004513�12136042272�033410� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.status;
    
    import ch.qos.logback.core.spi.ContextAwareBase;
    import ch.qos.logback.core.spi.LifeCycle;
    import ch.qos.logback.core.util.StatusPrinter;
    
    import java.io.PrintStream;
    import java.util.List;
    
    /**
     *  Print all new incoming status messages on the on the designated PrintStream.
     * @author Ceki G&uuml;c&uuml;
     */
    abstract class OnPrintStreamStatusListenerBase extends ContextAwareBase implements StatusListener, LifeCycle {
    
      boolean isStarted = false;
    
      static final long DEFAULT_RETROSPECTIVE = 300;
      long retrospective = DEFAULT_RETROSPECTIVE;
    
    
      /**
       * The PrintStream used by derived classes
       * @return
       */
      abstract protected PrintStream getPrintStream();
    
      private void print(Status status) {
        StringBuilder sb = new StringBuilder();
        StatusPrinter.buildStr(sb, "", status);
        getPrintStream().print(sb);
      }
    
      public void addStatusEvent(Status status) {
        if (!isStarted)
          return;
        print(status);
      }
    
      /**
       * Print status messages retrospectively
       */
      private void retrospectivePrint() {
        if(context == null)
          return;
        long now = System.currentTimeMillis();
        StatusManager sm = context.getStatusManager();
        List<Status> statusList = sm.getCopyOfStatusList();
        for (Status status : statusList) {
          long timestamp = status.getDate();
          if (now - timestamp < retrospective) {
            print(status);
          }
        }
      }
    
      public void start() {
        isStarted = true;
        if (retrospective > 0) {
          retrospectivePrint();
        }
      }
    
      public void setRetrospective(long retrospective) {
        this.retrospective = retrospective;
      }
    
      public long getRetrospective() {
        return retrospective;
      }
    
      public void stop() {
        isStarted = false;
      }
    
      public boolean isStarted() {
        return isStarted;
      }
    
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000150�00000000000�011561� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/status/ViewStatusMessagesServletBase.java�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/status/ViewStatusMessagesServletBase.j0000644�0001750�0001750�00000014640�12136042272�033336� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.status;
    
    import static ch.qos.logback.core.CoreConstants.LINE_SEPARATOR;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.io.StringWriter;
    import java.util.List;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.helpers.Transform;
    import ch.qos.logback.core.util.CachingDateFormatter;
    
    abstract public class ViewStatusMessagesServletBase extends HttpServlet {
    
      private static final long serialVersionUID = -3551928133801157219L;
      private static CachingDateFormatter SDF = new CachingDateFormatter(
          "yyyy-MM-dd HH:mm:ss");
    
      static String SUBMIT = "submit";
      static String CLEAR = "Clear";
    
      protected abstract StatusManager getStatusManager(HttpServletRequest req, HttpServletResponse resp);
    
      protected abstract String getPageTitle(HttpServletRequest req, HttpServletResponse resp);
    
      int count;
    
      protected void service(HttpServletRequest req, HttpServletResponse resp)
          throws ServletException, IOException {
    
        count = 0;
        StatusManager sm = getStatusManager(req, resp);
    
        resp.setContentType("text/html");
        PrintWriter output = resp.getWriter();
    
        output.append("<html>\r\n");
        output.append("<head>\r\n");
        printCSS(req.getContextPath(), output);
        output.append("</head>\r\n");
        output.append("<body>\r\n");
        output.append(getPageTitle(req, resp));
    
    
        output.append("<form method=\"POST\">\r\n");
        output.append("<input type=\"submit\" name=\""+SUBMIT+"\" value=\""+CLEAR+"\">");
        output.append("</form>\r\n");
    
    
        if(CLEAR.equalsIgnoreCase(req.getParameter(SUBMIT))) {
          sm.clear();
          sm.add(new InfoStatus("Cleared all status messages", this));
        }
        
        output.append("<table>");
        StringBuilder buf = new StringBuilder();
        if(sm != null) {
          printList(buf, sm);
        } else {
          output.append("Could not find status manager");
        }
        output.append(buf);
        output.append("</table>");
        output.append("</body>\r\n");
        output.append("</html>\r\n");
        output.flush();
        output.close();
      }
    
      public void printCSS(String localRef, PrintWriter output) {
        output.append("  <STYLE TYPE=\"text/css\">\r\n");
        output.append("    .warn  { font-weight: bold; color: #FF6600;} \r\n"); // orange
        output.append("    .error { font-weight: bold; color: #CC0000;} \r\n");
        output
            .append("    table { margin-left: 2em; margin-right: 2em; border-left: 2px solid #AAA; }\r\n");
        output.append("    tr.even { background: #FFFFFF; }\r\n");
        output.append("    tr.odd  { background: #EAEAEA; }\r\n");
        output
            .append("    td { padding-right: 1ex; padding-left: 1ex; border-right: 2px solid #AAA; }\r\n");
        output
            .append("    td.date { text-align: right; font-family: courier, monospace; font-size: smaller; }");
        output.append(LINE_SEPARATOR);
    
        output.append("  td.level { text-align: right; }");
        output.append(LINE_SEPARATOR);
        output
            .append("    tr.header { background: #596ED5; color: #FFF; font-weight: bold; font-size: larger; }");
        output.append(CoreConstants.LINE_SEPARATOR);
    
        output
            .append("  td.exception { background: #A2AEE8; white-space: pre; font-family: courier, monospace;}");
        output.append(LINE_SEPARATOR);
    
        output.append("  </STYLE>\r\n");
    
      }
    
      public void printList(StringBuilder buf, StatusManager sm) {
        buf.append("<table>\r\n");
        printHeader(buf);
        List<Status> statusList = sm.getCopyOfStatusList();
        for (Status s : statusList) {
          count++;
          printStatus(buf, s);
        }
        buf.append("</table>\r\n");
      }
    
      public void printHeader(StringBuilder buf) {
        buf.append("  <tr class=\"header\">\r\n");
        buf.append("    <th>Date </th>\r\n");
        buf.append("    <th>Level</th>\r\n");
        buf.append("    <th>Origin</th>\r\n");
        buf.append("    <th>Message</th>\r\n");
        buf.append("  </tr>\r\n");
    
      }
    
      String statusLevelAsString(Status s) {
        switch (s.getEffectiveLevel()) {
        case Status.INFO:
          return "INFO";
        case Status.WARN:
          return "<span class=\"warn\">WARN</span>";
        case Status.ERROR:
          return "<span class=\"error\">ERROR</span>";
        }
        return null;
      }
    
      String abbreviatedOrigin(Status s) {
        Object o = s.getOrigin();
        if (o == null) {
          return null;
        }
        String fqClassName = o.getClass().getName();
        int lastIndex = fqClassName.lastIndexOf(CoreConstants.DOT);
        if (lastIndex != -1) {
          return fqClassName.substring(lastIndex + 1, fqClassName.length());
        } else {
          return fqClassName;
        }
      }
    
      private void printStatus(StringBuilder buf, Status s) {
        String trClass;
        if (count % 2 == 0) {
          trClass = "even";
        } else {
          trClass = "odd";
        }
        buf.append("  <tr class=\"").append(trClass).append("\">\r\n");
        String dateStr = SDF.format(s.getDate());
        buf.append("    <td class=\"date\">").append(dateStr).append("</td>\r\n");
        buf.append("    <td class=\"level\">").append(statusLevelAsString(s))
            .append("</td>\r\n");
        buf.append("    <td>").append(abbreviatedOrigin(s)).append("</td>\r\n");
        buf.append("    <td>").append(s.getMessage()).append("</td>\r\n");
        buf.append("  </tr>\r\n");
        if (s.getThrowable() != null) {
          printThrowable(buf, s.getThrowable());
        }
      }
    
      private void printThrowable(StringBuilder buf, Throwable t) {
        buf.append("  <tr>\r\n");
        buf.append("    <td colspan=\"4\" class=\"exception\"><pre>");
        StringWriter sw = new StringWriter();
        PrintWriter pw = new PrintWriter(sw);
        t.printStackTrace(pw);
        buf.append(Transform.escapeTags(sw.getBuffer()));
        buf.append("    </pre></td>\r\n");
        buf.append("  </tr>\r\n");
    
      }
    }
    ������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/status/StatusListenerAsList.java������0000644�0001750�0001750�00000001701�12136042272�032163� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.status;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * Collect all incoming events in a list.
     * 
     * @author Ceki G&uuml;lc&uuml;
     * 
     */
    public class StatusListenerAsList implements StatusListener {
    
      List<Status> statusList = new ArrayList<Status>();
    
      public void addStatusEvent(Status status) {
        statusList.add(status);
      }
    
      public List<Status> getStatusList() {
        return statusList;
      }
      
      
    }
    ���������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/status/NopStatusListener.java���������0000644�0001750�0001750�00000001376�12136042272�031530� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.status;
    
    /**
     * A no-operation (nop) StatusListener
     *
     * @author Ceki G&uuml;c&uuml;
     * @since 1.0.8
     */
    public class NopStatusListener implements StatusListener {
    
      public void addStatusEvent(Status status) {
       // nothing to do
      }
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/status/StatusUtil.java����������������0000644�0001750�0001750�00000012203�12136042272�030172� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.status;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.CoreConstants;
    
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class StatusUtil {
    
      StatusManager sm;
    
      public StatusUtil(StatusManager sm) {
        this.sm = sm;
      }
    
      public StatusUtil(Context context) {
        this.sm = context.getStatusManager();
      }
    
      /**
       * Returns true if the StatusManager associated with the context passed
       * as parameter has one or more StatusListener instances registered. Returns
       * false otherwise.
       *
       * @param context
       * @return true if one or more StatusListeners registered, false otherwise
       * @since 1.0.8
       */
      static public boolean contextHasStatusListener(Context context) {
        StatusManager sm = context.getStatusManager();
        if(sm == null)
          return false;
        List<StatusListener> listeners = sm.getCopyOfStatusListenerList();
        if(listeners == null || listeners.size() == 0)
          return false;
        else
          return true;
      }
    
      static public List<Status> filterStatusListByTimeThreshold(List<Status> rawList, long threshold) {
        List<Status> filteredList = new ArrayList<Status>();
        for (Status s : rawList) {
          if (s.getDate() >= threshold)
            filteredList.add(s);
        }
        return filteredList;
      }
    
      public void addStatus(Status status) {
        if (sm != null) {
          sm.add(status);
        }
      }
    
      public void addInfo(Object caller, String msg) {
        addStatus(new InfoStatus(msg, caller));
      }
    
      public void addWarn(Object caller, String msg) {
        addStatus(new WarnStatus(msg, caller));
      }
    
      public void addError(Object caller, String msg,
          Throwable t) {
        addStatus(new ErrorStatus(msg, caller, t));
      }
    
      public boolean hasXMLParsingErrors(long threshold) {
        return containsMatch(threshold, Status.ERROR, CoreConstants.XML_PARSING);
      }
    
      public boolean noXMLParsingErrorsOccurred(long threshold) {
        return !hasXMLParsingErrors(threshold);
      }
    
      public int getHighestLevel(long threshold) {
        List<Status> filteredList = filterStatusListByTimeThreshold(sm.getCopyOfStatusList(), threshold);
        int maxLevel = Status.INFO;
        for (Status s : filteredList) {
          if (s.getLevel() > maxLevel)
            maxLevel = s.getLevel();
        }
        return maxLevel;
      }
    
      public boolean isErrorFree(long threshold) {
        return Status.ERROR > getHighestLevel(threshold);
      }
    
      public boolean containsMatch(long threshold, int level, String regex) {
        List<Status> filteredList = filterStatusListByTimeThreshold(sm.getCopyOfStatusList(), threshold);
        Pattern p = Pattern.compile(regex);
    
        for (Status status : filteredList) {
          if (level != status.getLevel()) {
            continue;
          }
          String msg = status.getMessage();
          Matcher matcher = p.matcher(msg);
          if (matcher.lookingAt()) {
            return true;
          }
        }
        return false;
      }
    
      public boolean containsMatch(int level, String regex) {
        return containsMatch(0, level, regex);
      }
    
      public boolean containsMatch(String regex) {
        Pattern p = Pattern.compile(regex);
        for (Status status : sm.getCopyOfStatusList()) {
          String msg = status.getMessage();
          Matcher matcher = p.matcher(msg);
          if (matcher.lookingAt()) {
            return true;
          }
        }
        return false;
      }
    
      public int matchCount(String regex) {
        int count = 0;
        Pattern p = Pattern.compile(regex);
        for (Status status : sm.getCopyOfStatusList()) {
          String msg = status.getMessage();
          Matcher matcher = p.matcher(msg);
          if (matcher.lookingAt()) {
            count++;
          }
        }
        return count;
      }
    
      public boolean containsException(Class<?> exceptionType) {
        Iterator<Status> stati = sm.getCopyOfStatusList().iterator();
        while (stati.hasNext()) {
          Status status = stati.next();
          Throwable t = status.getThrowable();
          if (t != null && t.getClass().getName().equals(exceptionType.getName())) {
            return true;
          }
        }
        return false;
      }
    
      /**
       * Return the time of last reset. -1 if last reset time could not be found
       *
       * @return time of last reset or -1
       */
      public long timeOfLastReset() {
        List<Status> statusList = sm.getCopyOfStatusList();
        if (statusList == null)
          return -1;
    
        int len = statusList.size();
        for (int i = len - 1; i >= 0; i--) {
          Status s = statusList.get(i);
          if (CoreConstants.RESET_MSG_PREFIX.equals(s.getMessage())) {
            return s.getDate();
          }
        }
        return -1;
      }
    
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000147�00000000000�011567� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/status/OnErrorConsoleStatusListener.java��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/status/OnErrorConsoleStatusListener.ja0000644�0001750�0001750�00000001551�12136042272�033351� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.status;
    
    import java.io.PrintStream;
    
    /**
     * Print all new incoming status messages on the error console (System.err).
     *
     * @author Ceki G&uuml;c&uuml;
     * @since 1.0.8
     */
    public class OnErrorConsoleStatusListener extends OnPrintStreamStatusListenerBase {
    
      @Override
      protected PrintStream getPrintStream() {
        return System.err;
      }
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/status/StatusListener.java������������0000644�0001750�0001750�00000001446�12136042272�031051� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.status;
    
    /**
     * A StatusListener registered with logback context's {@link StatusManager} will
     * receive notification of every incoming {@link Status status} message.
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public interface StatusListener {
      void addStatusEvent(Status status);
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/status/Status.java��������������������0000644�0001750�0001750�00000001620�12136042272�027335� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.status;
    
    import java.util.Iterator;
    
    
    public interface Status  {
    
      int INFO = 0;
      int WARN = 1;
      int ERROR = 2;
      
      int getLevel();
      int getEffectiveLevel();
      Object getOrigin();
      String getMessage();
      Throwable getThrowable();
      Long getDate();
      
      boolean hasChildren();
      void add(Status child);
      boolean remove(Status child);
      Iterator<Status> iterator();
    
    }
    ����������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/status/StatusManager.java�������������0000644�0001750�0001750�00000003156�12136042272�030636� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.status;
    
    import java.util.List;
    
    /**
     * Internal error messages (statii) are managed by instances of this interface.
     * 
     * @author Ceki Gulcu
     */
    public interface StatusManager {
    
      /**
       * Add a new status message.
       * 
       * @param status
       */
      void add(Status status);
    
      /**
       * Obtain a copy of the status list maintained by this StatusManager.
       * 
       * @return
       */
      List<Status> getCopyOfStatusList();
    
      /**
       * Return the highest level of all the statii.
       * 
       * @return
       */
      //int getLevel();
    
      /**
       * Return the number of status entries.
       * 
       * @return
       */
      int getCount();
    
      /**
       * Add a status listener.
       * @param listener
       */
      void add(StatusListener listener);
      
      /**
       * Remove a status listener.
       * 
       * @param listener
       */
      void remove(StatusListener listener);
    
    
      /**
       * Clear the list of status messages.
       */
      void clear();
    
      
      /**
       * Obtain a copy of the status listener list maintained by this StatusManager
       * 
       * @return
       */
      List<StatusListener> getCopyOfStatusListenerList();
    
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/status/ErrorStatus.java���������������0000644�0001750�0001750�00000001432�12136042272�030350� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.status;
    
    
    
    public class ErrorStatus extends StatusBase {
      
      public ErrorStatus(String msg, Object origin) {
        super(Status.ERROR, msg, origin);
      }
    
      public ErrorStatus(String msg, Object origin, Throwable t) {
        super(Status.ERROR, msg, origin, t);
      }
    
     }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/status/WarnStatus.java����������������0000644�0001750�0001750�00000001427�12136042272�030172� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.status;
    
    
    
    public class WarnStatus extends StatusBase {
    
     
      public WarnStatus(String msg, Object origin) {
        super(Status.WARN, msg, origin);
      }
    
      public WarnStatus( String msg, Object origin, Throwable t) {
        super(Status.WARN, msg, origin, t);
      }
    
     }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/sift/���������������������������������0000755�0001750�0001750�00000000000�12203357067�024640� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/sift/AbstractDiscriminator.java�������0000644�0001750�0001750�00000001053�12136563562�032001� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������package ch.qos.logback.core.sift;
    
    import ch.qos.logback.core.spi.ContextAwareBase;
    
    /**
     * Base implementation of {@link Discriminator} that provides basic lifecycle management
     *
     * @author Tomasz Nurkiewicz
     * @since 3/29/13, 3:28 PM
     */
    public abstract class AbstractDiscriminator<E> extends ContextAwareBase implements Discriminator<E> {
    
      protected boolean started;
    
      public void start() {
        started = true;
      }
    
      public void stop() {
        started = false;
      }
    
      public boolean isStarted() {
        return started;
      }
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/sift/DefaultDiscriminator.java��������0000644�0001750�0001750�00000001475�12136563562�031632� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.sift;
    
    
    /**
     * @author Ceki G&uuml;c&uuml;
     */
    public class DefaultDiscriminator<E> extends AbstractDiscriminator<E> {
    
      static public final String DEFAULT = "default";
    
      public String getDiscriminatingValue(E e) {
        return DEFAULT;
      }
    
      public String getKey() {
        return DEFAULT;
      }
    
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/sift/SiftingJoranConfiguratorBase.java0000644�0001750�0001750�00000006314�12140150757�033257� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.sift;
    
    import java.util.List;
    import java.util.Map;
    
    import ch.qos.logback.core.Appender;
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.joran.GenericConfigurator;
    import ch.qos.logback.core.joran.action.*;
    import ch.qos.logback.core.joran.event.SaxEvent;
    import ch.qos.logback.core.joran.spi.ElementSelector;
    import ch.qos.logback.core.joran.spi.Interpreter;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.joran.spi.RuleStore;
    
    public abstract class SiftingJoranConfiguratorBase<E> extends
            GenericConfigurator {
    
      protected final String key;
      protected final String value;
      // properties inherited from the main joran run
      protected final Map<String, String> parentPropertyMap;
    
      protected SiftingJoranConfiguratorBase(String key, String value, Map<String, String> parentPropertyMap) {
        this.key = key;
        this.value = value;
        this.parentPropertyMap = parentPropertyMap;
      }
    
      final static String ONE_AND_ONLY_ONE_URL = CoreConstants.CODES_URL
              + "#1andOnly1";
    
      @Override
      protected void addImplicitRules(Interpreter interpreter) {
        NestedComplexPropertyIA nestedComplexIA = new NestedComplexPropertyIA();
        nestedComplexIA.setContext(context);
        interpreter.addImplicitAction(nestedComplexIA);
    
        NestedBasicPropertyIA nestedSimpleIA = new NestedBasicPropertyIA();
        nestedSimpleIA.setContext(context);
        interpreter.addImplicitAction(nestedSimpleIA);
      }
    
      @Override
      protected void addInstanceRules(RuleStore rs) {
        rs.addRule(new ElementSelector("configuration/property"), new PropertyAction());
        rs.addRule(new ElementSelector("configuration/timestamp"), new TimestampAction());
        rs.addRule(new ElementSelector("configuration/define"), new DefinePropertyAction());
      }
    
      abstract public Appender<E> getAppender();
    
      int errorEmmissionCount = 0;
    
      protected void oneAndOnlyOneCheck(Map<?, ?> appenderMap) {
        String errMsg = null;
        if (appenderMap.size() == 0) {
          errorEmmissionCount++;
          errMsg = "No nested appenders found within the <sift> element in SiftingAppender.";
        } else if (appenderMap.size() > 1) {
          errorEmmissionCount++;
          errMsg = "Only and only one appender can be nested the <sift> element in SiftingAppender. See also "
                  + ONE_AND_ONLY_ONE_URL;
        }
    
        if (errMsg != null && errorEmmissionCount < CoreConstants.MAX_ERROR_COUNT) {
          addError(errMsg);
        }
      }
    
      public void doConfigure(final List<SaxEvent> eventList) throws JoranException {
        super.doConfigure(eventList);
      }
    
      @Override
      public String toString() {
        return this.getClass().getName() + "{" + key + "=" + value + '}';
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/sift/SiftingAppenderBase.java���������0000644�0001750�0001750�00000010440�12136505455�031360� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.sift;
    
    import ch.qos.logback.core.Appender;
    import ch.qos.logback.core.AppenderBase;
    import ch.qos.logback.core.util.Duration;
    
    /**
     * This appender serves as the base class for actual SiftingAppenders
     * implemented by the logback-classic and logback-access modules. In a nutshell,
     * a SiftingAppender contains other appenders which it can build dynamically
     * depending on discriminating values supplied by the event currently being
     * processed. The appender to build (dynamically) is specified as part of a
     * configuration file.
     *
     * @author Ceki Gulcu
     */
    public abstract class SiftingAppenderBase<E> extends
            AppenderBase<E> {
    
      protected AppenderTracker<E> appenderTracker;
      AppenderFactory<E> appenderFactory;
      Duration timeout = new Duration(AppenderTracker.DEFAULT_TIMEOUT);
      int maxAppenderCount = AppenderTracker.DEFAULT_MAX_COMPONENTS;
    
      Discriminator<E> discriminator;
    
      public Duration getTimeout() {
        return timeout;
      }
    
      public void setTimeout(Duration timeout) {
        this.timeout = timeout;
      }
    
      public int getMaxAppenderCount() {
        return maxAppenderCount;
      }
    
      public void setMaxAppenderCount(int maxAppenderCount) {
        this.maxAppenderCount = maxAppenderCount;
      }
    
      /**
       * This setter is intended to be invoked by SiftAction. Customers have no reason to invoke
       * this method directly.
       */
      public void setAppenderFactory(AppenderFactory<E> appenderFactory) {
        this.appenderFactory = appenderFactory;
      }
    
      @Override
      public void start() {
        int errors = 0;
        if (discriminator == null) {
          addError("Missing discriminator. Aborting");
          errors++;
        }
        if (!discriminator.isStarted()) {
          addError("Discriminator has not started successfully. Aborting");
          errors++;
        }
        if (appenderFactory == null) {
          addError("AppenderFactory has not been set. Aborting");
          errors++;
        } else {
          appenderTracker = new AppenderTracker<E>(context, appenderFactory);
          appenderTracker.setMaxComponents(maxAppenderCount);
          appenderTracker.setTimeout(timeout.getMilliseconds());
        }
        if (errors == 0) {
          super.start();
        }
      }
    
      @Override
      public void stop() {
        for (Appender<E> appender : appenderTracker.allComponents()) {
          appender.stop();
        }
      }
    
      abstract protected long getTimestamp(E event);
    
      @Override
      protected void append(E event) {
        if (!isStarted()) {
          return;
        }
        String discriminatingValue = discriminator.getDiscriminatingValue(event);
        long timestamp = getTimestamp(event);
    
        Appender<E> appender = appenderTracker.getOrCreate(discriminatingValue, timestamp);
        // marks the appender for removal as specified by the user
        if (eventMarksEndOfLife(event)) {
          appenderTracker.endOfLife(discriminatingValue);
        }
        appenderTracker.removeStaleComponents(timestamp);
        appender.doAppend(event);
      }
    
      protected abstract boolean eventMarksEndOfLife(E event);
    
      public Discriminator<E> getDiscriminator() {
        return discriminator;
      }
    
      public void setDiscriminator(Discriminator<E> discriminator) {
        this.discriminator = discriminator;
      }
    
    
      // sometimes one needs to close a nested appender immediately
      // for example when executing a command which has its own nested appender
      // and the command also cleans up after itself. However, an open file appender
      // will prevent the folder from being deleted
      // see http://www.qos.ch/pipermail/logback-user/2010-March/001487.html
    
      /**
       * @since 0.9.19
       */
      public AppenderTracker<E> getAppenderTracker() {
        return appenderTracker;
      }
    
      public String getDiscriminatorKey() {
        if (discriminator != null) {
          return discriminator.getKey();
        } else {
          return null;
        }
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000152�00000000000�011563� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/sift/AbstractAppenderFactoryUsingJoran.java�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/sift/AbstractAppenderFactoryUsingJoran0000644�0001750�0001750�00000003716�12136260513�033336� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.sift;
    
    import java.util.List;
    import java.util.Map;
    
    import ch.qos.logback.core.Appender;
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.joran.event.SaxEvent;
    import ch.qos.logback.core.joran.spi.JoranException;
    
    /**
     * Builds new appenders dynamically by running SiftingJoranConfigurator instance,
     * a custom configurator tailored for the contents of the sift element.
     * @param <E>
     */
    public abstract class AbstractAppenderFactoryUsingJoran<E> implements AppenderFactory<E> {
    
      final List<SaxEvent> eventList;
      protected String key;
      protected Map<String, String> parentPropertyMap;
    
      protected AbstractAppenderFactoryUsingJoran(List<SaxEvent> eventList, String key, Map<String, String> parentPropertyMap) {
        this.eventList = removeSiftElement(eventList);
        this.key = key;
        this.parentPropertyMap = parentPropertyMap;
        
      }
    
      List<SaxEvent> removeSiftElement(List<SaxEvent> eventList) {
        return eventList.subList(1, eventList.size() - 1);
      }
    
      public abstract SiftingJoranConfiguratorBase<E> getSiftingJoranConfigurator(String k);
      
      public Appender<E> buildAppender(Context context, String discriminatingValue) throws JoranException {
        SiftingJoranConfiguratorBase<E> sjc = getSiftingJoranConfigurator(discriminatingValue);
        sjc.setContext(context);
        sjc.doConfigure(eventList);
        return sjc.getAppender();
      }
    
      public List<SaxEvent> getEventList() {
        return eventList;
      }
    
    }
    ��������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/sift/Discriminator.java���������������0000644�0001750�0001750�00000002405�12136042272�030305� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.sift;
    
    import ch.qos.logback.core.spi.LifeCycle;
    
    /**
     * Implement this interface in order to compute a discriminating value for a
     * given event of type &lt;E&gt;.
     * 
     * <p>The returned value can depend on any data available at the time of the
     * call, including data contained within the currently running thread.
     * 
     * @author Ceki G&uuml;lc&uuml;
     * 
     * @param <E>
     */
    public interface Discriminator<E> extends LifeCycle {
      
      /**
       * Given event 'e' return a discriminating value.
       * 
       * @param e
       * @return
       */
      String getDiscriminatingValue(E e);
    
      /**
       * The key or variable name under which the discriminating value should be
       * exported into the host environment. 
       *
       * @return
       */
      String getKey();
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/sift/AppenderTracker.java�������������0000644�0001750�0001750�00000005003�12136473053�030552� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.sift;
    
    import ch.qos.logback.core.Appender;
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.helpers.NOPAppender;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.spi.AbstractComponentTracker;
    import ch.qos.logback.core.spi.ContextAwareImpl;
    
    /**
     * Track appenders by key. When an appender is not used for
     * longer than {@link #DEFAULT_TIMEOUT} it is stopped and removed.
     *
     * @author Tommy Becker
     * @author Ceki Gulcu
     * @author David Roussel
     */
    public class AppenderTracker<E> extends AbstractComponentTracker<Appender<E>> {
    
      int nopaWarningCount = 0;
    
      final Context context;
      final AppenderFactory<E> appenderFactory;
      final ContextAwareImpl contextAware;
    
      public AppenderTracker(Context context, AppenderFactory<E> appenderFactory) {
        super();
        this.context = context;
        this.appenderFactory = appenderFactory;
        this.contextAware = new ContextAwareImpl(context, this);
      }
    
    
      @Override
      protected void processPriorToRemoval(Appender<E> component) {
        component.stop();
      }
    
      @Override
      protected Appender<E> buildComponent(String key) {
        Appender<E> appender = null;
        try {
          appender = appenderFactory.buildAppender(context, key);
        } catch (JoranException je) {
          contextAware.addError("Error while building appender with discriminating value [" + key + "]");
        }
        if (appender == null) {
          appender = buildNOPAppender(key);
        }
    
        return appender;
      }
    
      private NOPAppender<E> buildNOPAppender(String key) {
        if (nopaWarningCount < CoreConstants.MAX_ERROR_COUNT) {
          nopaWarningCount++;
          contextAware.addError("Building NOPAppender for discriminating value [" + key + "]");
        }
        NOPAppender<E> nopa = new NOPAppender<E>();
        nopa.setContext(context);
        nopa.start();
        return nopa;
      }
    
      @Override
      protected boolean isComponentStale(Appender<E> appender) {
        return !appender.isStarted();
      }
    
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/sift/AppenderFactory.java�������������0000644�0001750�0001750�00000000721�12136260513�030563� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������package ch.qos.logback.core.sift;
    
    import ch.qos.logback.core.Appender;
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.joran.spi.JoranException;
    
    /**
     * Created with IntelliJ IDEA.
     * User: ceki
     * Date: 25.04.13
     * Time: 19:00
     * To change this template use File | Settings | File Templates.
     */
    public interface AppenderFactory<E> {
      Appender<E> buildAppender(Context context, String discriminatingValue) throws JoranException;
    }
    �����������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/��������������������������������0000755�0001750�0001750�00000000000�12203357067�025004� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/action/�������������������������0000755�0001750�0001750�00000000000�12203357067�026261� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000150�00000000000�011561� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/action/NestedComplexPropertyIA.java�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/action/NestedComplexPropertyIA.j0000644�0001750�0001750�00000015321�12140150756�033163� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.action;
    
    import java.util.Stack;
    
    import ch.qos.logback.core.joran.spi.ElementPath;
    import org.xml.sax.Attributes;
    
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    import ch.qos.logback.core.joran.spi.NoAutoStartUtil;
    import ch.qos.logback.core.joran.util.PropertySetter;
    import ch.qos.logback.core.spi.ContextAware;
    import ch.qos.logback.core.spi.LifeCycle;
    import ch.qos.logback.core.util.AggregationType;
    import ch.qos.logback.core.util.Loader;
    import ch.qos.logback.core.util.OptionHelper;
    
    /**
     * This action is responsible for tying together a parent object with a child
     * element for which there is no explicit rule.
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public class NestedComplexPropertyIA extends ImplicitAction {
    
      // actionDataStack contains ActionData instances
      // We use a stack of ActionData objects in order to support nested
      // elements which are handled by the same NestedComplexPropertyIA instance.
      // We push a ActionData instance in the isApplicable method (if the
      // action is applicable) and pop it in the end() method.
      // The XML well-formedness property will guarantee that a push will eventually
      // be followed by a corresponding pop.
      Stack<IADataForComplexProperty> actionDataStack = new Stack<IADataForComplexProperty>();
    
      public boolean isApplicable(ElementPath elementPath, Attributes attributes,
          InterpretationContext ic) {
    
        String nestedElementTagName = elementPath.peekLast();
    
        // calling ic.peekObject with an empty stack will throw an exception
        if (ic.isEmpty()) {
          return false;
        }
    
        Object o = ic.peekObject();
        PropertySetter parentBean = new PropertySetter(o);
        parentBean.setContext(context);
    
        AggregationType aggregationType = parentBean
            .computeAggregationType(nestedElementTagName);
    
        switch (aggregationType) {
        case NOT_FOUND:
        case AS_BASIC_PROPERTY:
        case AS_BASIC_PROPERTY_COLLECTION:
          return false;
    
          // we only push action data if NestComponentIA is applicable
        case AS_COMPLEX_PROPERTY_COLLECTION:
        case AS_COMPLEX_PROPERTY:
          IADataForComplexProperty ad = new IADataForComplexProperty(parentBean,
              aggregationType, nestedElementTagName);
          actionDataStack.push(ad);
    
          return true;
        default:
          addError("PropertySetter.computeAggregationType returned "
              + aggregationType);
          return false;
        }
      }
    
      public void begin(InterpretationContext ec, String localName,
          Attributes attributes) {
        // LogLog.debug("in NestComponentIA begin method");
        // get the action data object pushed in isApplicable() method call
        IADataForComplexProperty actionData = (IADataForComplexProperty) actionDataStack
            .peek();
    
        String className = attributes.getValue(CLASS_ATTRIBUTE);
        // perform variable name substitution
        className = ec.subst(className);
    
        Class<?> componentClass = null;
        try {
    
          if (!OptionHelper.isEmpty(className)) {
            componentClass = Loader.loadClass(className, context);
          } else {
            // guess class name via implicit rules
            PropertySetter parentBean = actionData.parentBean;
            componentClass = parentBean.getClassNameViaImplicitRules(actionData
                .getComplexPropertyName(), actionData.getAggregationType(), ec
                .getDefaultNestedComponentRegistry());
          }
    
          if (componentClass == null) {
            actionData.inError = true;
            String errMsg = "Could not find an appropriate class for property ["
                + localName + "]";
            addError(errMsg);
            return;
          }
    
          if (OptionHelper.isEmpty(className)) {
            addInfo("Assuming default type [" + componentClass.getName()
                + "] for [" + localName + "] property");
          }
    
          actionData.setNestedComplexProperty(componentClass.newInstance());
    
          // pass along the repository
          if (actionData.getNestedComplexProperty() instanceof ContextAware) {
            ((ContextAware) actionData.getNestedComplexProperty())
                .setContext(this.context);
          }
          //addInfo("Pushing component [" + localName
          //    + "] on top of the object stack.");
          ec.pushObject(actionData.getNestedComplexProperty());
    
        } catch (Exception oops) {
          actionData.inError = true;
          String msg = "Could not create component [" + localName + "] of type ["
              + className + "]";
          addError(msg, oops);
        }
    
      }
    
      public void end(InterpretationContext ec, String tagName) {
    
        // pop the action data object pushed in isApplicable() method call
        // we assume that each this begin
        IADataForComplexProperty actionData = (IADataForComplexProperty) actionDataStack
            .pop();
    
        if (actionData.inError) {
          return;
        }
    
        PropertySetter nestedBean = new PropertySetter(actionData
            .getNestedComplexProperty());
        nestedBean.setContext(context);
    
        // have the nested element point to its parent if possible
        if (nestedBean.computeAggregationType("parent") == AggregationType.AS_COMPLEX_PROPERTY) {
          nestedBean.setComplexProperty("parent", actionData.parentBean.getObj());
        }
    
        // start the nested complex property if it implements LifeCycle and is not
        // marked with a @NoAutoStart annotation
        Object nestedComplexProperty = actionData.getNestedComplexProperty();
        if (nestedComplexProperty instanceof LifeCycle
            && NoAutoStartUtil.notMarkedWithNoAutoStart(nestedComplexProperty)) {
          ((LifeCycle) nestedComplexProperty).start();
        }
    
        Object o = ec.peekObject();
    
        if (o != actionData.getNestedComplexProperty()) {
          addError("The object on the top the of the stack is not the component pushed earlier.");
        } else {
          ec.popObject();
          // Now let us attach the component
          switch (actionData.aggregationType) {
          case AS_COMPLEX_PROPERTY:
            actionData.parentBean.setComplexProperty(tagName, actionData
                .getNestedComplexProperty());
    
            break;
          case AS_COMPLEX_PROPERTY_COLLECTION:
            actionData.parentBean.addComplexProperty(tagName, actionData
                .getNestedComplexProperty());
    
            break;
          }
        }
      }
    
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/action/ImplicitAction.java������0000644�0001750�0001750�00000003223�12140150756�032030� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.action;
    
    
    import ch.qos.logback.core.joran.spi.ElementPath;
    import org.xml.sax.Attributes;
    
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    
    
    /**
     * ImplcitActions are like normal (explicit) actions except that are applied
     * by the parser when no other pattern applies. Since there can be many implicit
     * actions, each action is asked whether it applies in the given context. The
     * first implicit action to respond positively is then applied. See also the
     * {@link #isApplicable} method.
     *
     * @author Ceki G&uuml;lc&uuml;
     */
    public abstract class ImplicitAction extends Action {
      
      /**
       * Check whether this implicit action is appropriate in the current context.
       * 
       * @param currentElementPath This pattern contains the tag name of the current
       * element being parsed at the top of the stack.
       * @param attributes The attributes of the current element to process.
       * @param ec
       * @return Whether the implicit action is applicable in the current context
       */
      public abstract boolean isApplicable(
        ElementPath currentElementPath, Attributes attributes, InterpretationContext ec);
      
      
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/action/ParamAction.java���������0000644�0001750�0001750�00000003571�12136042272�031322� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.action;
    
    
    import org.xml.sax.Attributes;
    
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    import ch.qos.logback.core.joran.util.PropertySetter;
    
    
    
    public class ParamAction extends Action {
      static String NO_NAME = "No name attribute in <param> element";
      static String NO_VALUE = "No name attribute in <param> element";
      boolean inError = false;
    
      public void begin(
        InterpretationContext ec, String localName, Attributes attributes) {
        String name = attributes.getValue(NAME_ATTRIBUTE);
        String value = attributes.getValue(VALUE_ATTRIBUTE);
    
        if (name == null) {
          inError = true;
          addError(NO_NAME);
          return;
        }
    
        if (value == null) {
          inError = true;
          addError(NO_VALUE);
          return;
        }
    
        // remove both leading and trailing spaces
        value = value.trim();
    
        Object o = ec.peekObject();
        PropertySetter propSetter = new PropertySetter(o);
        propSetter.setContext(context);
        value = ec.subst(value);
    
        // allow for variable substitution for name as well
        name = ec.subst(name);
    
        //getLogger().debug(
        //  "In ParamAction setting parameter [{}] to value [{}].", name, value);
        propSetter.setProperty(name, value);
      }
    
      public void end(InterpretationContext ec, String localName) {
      }
    
      public void finish(InterpretationContext ec) {
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/action/ActionUtil.java����������0000644�0001750�0001750�00000004157�12136042272�031200� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.action;
    
    import java.util.Properties;
    
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    import ch.qos.logback.core.util.ContextUtil;
    import ch.qos.logback.core.util.OptionHelper;
    
    public class ActionUtil {
    
      public enum Scope {
        LOCAL, CONTEXT, SYSTEM
      };
    
      /**
       * Convert a string into a scope. Scole.LOCAL is returned by default.
       * @param scopeStr
       * @return a scope corresponding to the input string;  Scope.LOCAL by default.
       */
      static public Scope stringToScope(String scopeStr) {
        if(Scope.SYSTEM.toString().equalsIgnoreCase(scopeStr))
          return Scope.SYSTEM;
         if(Scope.CONTEXT.toString().equalsIgnoreCase(scopeStr))
          return Scope.CONTEXT;
    
        return Scope.LOCAL;
      }
    
      static public void setProperty(InterpretationContext ic, String key, String value, Scope scope) {
        switch (scope) {
        case LOCAL:
          ic.addSubstitutionProperty(key, value);
          break;
        case CONTEXT:
          ic.getContext().putProperty(key, value);
          break;
        case SYSTEM:
          OptionHelper.setSystemProperty(ic, key, value);
        }
      }
    
      /**
       * Add all the properties found in the argument named 'props' to an
       * InterpretationContext.
       */
      static public void setProperties(InterpretationContext ic, Properties props,
          Scope scope) {
        switch (scope) {
        case LOCAL:
          ic.addSubstitutionProperties(props);
          break;
        case CONTEXT:
          ContextUtil cu = new ContextUtil(ic.getContext());
          cu.addProperties(props);
          break;
        case SYSTEM:
          OptionHelper.setSystemProperties(ic, props);
        }
      }
    
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/action/PropertyAction.java������0000644�0001750�0001750�00000012746�12136042272�032112� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.action;
    
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.URL;
    import java.util.Properties;
    
    import org.xml.sax.Attributes;
    
    import ch.qos.logback.core.joran.action.ActionUtil.Scope;
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    import ch.qos.logback.core.pattern.util.RegularEscapeUtil;
    import ch.qos.logback.core.util.Loader;
    import ch.qos.logback.core.util.OptionHelper;
    
    /**
     * This class serves as a base for other actions, which similar to the ANT
     * <property> task which add/set properties of a given object.
     * 
     * This action sets new substitution properties in the logging context by name,
     * value pair, or adds all the properties passed in "file" or "resource"
     * attribute.
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public class PropertyAction extends Action {
    
      static final String RESOURCE_ATTRIBUTE = "resource";
    
    
      static String INVALID_ATTRIBUTES = "In <property> element, either the \"file\" attribute alone, or "
              + "the \"resource\" element alone, or both the \"name\" and \"value\" attributes must be set.";
    
    
      /**
       * Set a new property for the execution context by name, value pair, or adds
       * all the properties found in the given file.
       * 
       */
      public void begin(InterpretationContext ec, String localName,
          Attributes attributes) {
    
        if ("substitutionProperty".equals(localName)) {
          addWarn("[substitutionProperty] element has been deprecated. Please use the [property] element instead.");
        }
    
        String name = attributes.getValue(NAME_ATTRIBUTE);
        String value = attributes.getValue(VALUE_ATTRIBUTE);
        String scopeStr = attributes.getValue(SCOPE_ATTRIBUTE);
    
        Scope scope = ActionUtil.stringToScope(scopeStr);
    
        if (checkFileAttributeSanity(attributes)) {
          String file = attributes.getValue(FILE_ATTRIBUTE);
          file = ec.subst(file);
          try {
            FileInputStream istream = new FileInputStream(file);
            loadAndSetProperties(ec, istream, scope);
          } catch (FileNotFoundException e) {
            addError("Could not find properties file [" + file + "].");
          } catch (IOException e1) {
            addError("Could not read properties file [" + file + "].", e1);
          }
        } else if (checkResourceAttributeSanity(attributes)) {
          String resource = attributes.getValue(RESOURCE_ATTRIBUTE);
          resource = ec.subst(resource);
          URL resourceURL = Loader.getResourceBySelfClassLoader(resource);
          if (resourceURL == null) {
            addError("Could not find resource [" + resource + "].");
          } else {
            try {
              InputStream istream = resourceURL.openStream();
              loadAndSetProperties(ec, istream, scope);
            } catch (IOException e) {
              addError("Could not read resource file [" + resource + "].", e);
            }
          }
        } else if (checkValueNameAttributesSanity(attributes)) {
          value = RegularEscapeUtil.basicEscape(value);
          // now remove both leading and trailing spaces
          value = value.trim();
          value = ec.subst(value);
          ActionUtil.setProperty(ec, name, value, scope);
    
        } else {
          addError(INVALID_ATTRIBUTES);
        }
      }
    
      void loadAndSetProperties(InterpretationContext ec, InputStream istream, Scope scope)
          throws IOException {
        Properties props = new Properties();
        props.load(istream);
        istream.close();
        ActionUtil.setProperties(ec, props, scope);
      }
    
      boolean checkFileAttributeSanity(Attributes attributes) {
        String file = attributes.getValue(FILE_ATTRIBUTE);
        String name = attributes.getValue(NAME_ATTRIBUTE);
        String value = attributes.getValue(VALUE_ATTRIBUTE);
        String resource = attributes.getValue(RESOURCE_ATTRIBUTE);
    
        return !(OptionHelper.isEmpty(file))
            && (OptionHelper.isEmpty(name) && OptionHelper.isEmpty(value) && OptionHelper
                .isEmpty(resource));
      }
    
      boolean checkResourceAttributeSanity(Attributes attributes) {
        String file = attributes.getValue(FILE_ATTRIBUTE);
        String name = attributes.getValue(NAME_ATTRIBUTE);
        String value = attributes.getValue(VALUE_ATTRIBUTE);
        String resource = attributes.getValue(RESOURCE_ATTRIBUTE);
    
        return !(OptionHelper.isEmpty(resource))
            && (OptionHelper.isEmpty(name) && OptionHelper.isEmpty(value) && OptionHelper
                .isEmpty(file));
      }
    
      boolean checkValueNameAttributesSanity(Attributes attributes) {
        String file = attributes.getValue(FILE_ATTRIBUTE);
        String name = attributes.getValue(NAME_ATTRIBUTE);
        String value = attributes.getValue(VALUE_ATTRIBUTE);
        String resource = attributes.getValue(RESOURCE_ATTRIBUTE);
    
        return (!(OptionHelper.isEmpty(name) || OptionHelper.isEmpty(value)) && (OptionHelper
            .isEmpty(file) && OptionHelper.isEmpty(resource)));
      }
    
      public void end(InterpretationContext ec, String name) {
      }
    
      public void finish(InterpretationContext ec) {
      }
    }
    ��������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/action/AppenderAction.java������0000644�0001750�0001750�00000006555�12136042272�032025� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.action;
    
    import java.util.HashMap;
    
    import org.xml.sax.Attributes;
    
    import ch.qos.logback.core.Appender;
    import ch.qos.logback.core.joran.spi.ActionException;
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    import ch.qos.logback.core.spi.LifeCycle;
    import ch.qos.logback.core.util.OptionHelper;
    
    public class AppenderAction<E> extends Action {
      Appender<E> appender;
      private boolean inError = false;
    
      /**
       * Instantiates an appender of the given class and sets its name.
       * 
       * The appender thus generated is placed in the {@link InterpretationContext}'s
       * appender bag.
       */
      @SuppressWarnings("unchecked")
      public void begin(InterpretationContext ec, String localName,
          Attributes attributes) throws ActionException {
        // We are just beginning, reset variables
        appender = null;
        inError = false;
    
        String className = attributes.getValue(CLASS_ATTRIBUTE);
        if (OptionHelper.isEmpty(className)) {
          addError("Missing class name for appender. Near [" + localName
              + "] line " + getLineNumber(ec));
          inError = true;
          return;
        }
    
        try {
          addInfo("About to instantiate appender of type [" + className + "]");
    
          appender = (Appender<E>) OptionHelper.instantiateByClassName(className,
              ch.qos.logback.core.Appender.class, context);
    
          appender.setContext(context);
    
          String appenderName = ec.subst(attributes.getValue(NAME_ATTRIBUTE));
    
          if (OptionHelper.isEmpty(appenderName)) {
            addWarn("No appender name given for appender of type " + className
                + "].");
          } else {
            appender.setName(appenderName);
            addInfo("Naming appender as [" + appenderName + "]");
          }
    
          // The execution context contains a bag which contains the appenders
          // created thus far.
          HashMap<String, Appender<E>> appenderBag = (HashMap<String, Appender<E>>) ec.getObjectMap().get(
              ActionConst.APPENDER_BAG);
    
          // add the appender just created to the appender bag.
          appenderBag.put(appenderName, appender);
    
          ec.pushObject(appender);
        } catch (Exception oops) {
          inError = true;
          addError("Could not create an Appender of type [" + className + "].",
              oops);
          throw new ActionException(oops);
        }
      }
    
      /**
       * Once the children elements are also parsed, now is the time to activate the
       * appender options.
       */
      public void end(InterpretationContext ec, String name) {
        if (inError) {
          return;
        }
    
        if (appender instanceof LifeCycle) {
          ((LifeCycle) appender).start();
        }
    
        Object o = ec.peekObject();
    
        if (o != appender) {
          addWarn("The object at the of the stack is not the appender named ["
              + appender.getName() + "] pushed earlier.");
        } else {
          ec.popObject();
        }
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000151�00000000000�011562� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/action/IADataForComplexProperty.java������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/action/IADataForComplexProperty.0000644�0001750�0001750�00000003141�12136042272�033102� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.action;
    
    import ch.qos.logback.core.joran.util.PropertySetter;
    import ch.qos.logback.core.util.AggregationType;
    
    /**
     * Lump together several fields for use by {@link NestedComplexPropertyIA}.
     * 
     * @author Ceki
     */
    public class IADataForComplexProperty {
      final PropertySetter parentBean;
      final AggregationType aggregationType;
      final String complexPropertyName;
      private Object nestedComplexProperty;
      boolean inError;
    
      public IADataForComplexProperty(PropertySetter parentBean, AggregationType aggregationType, String complexPropertyName) {
        this.parentBean = parentBean;
        this.aggregationType = aggregationType;
        this.complexPropertyName = complexPropertyName;
      }
    
      public AggregationType getAggregationType() {
        return aggregationType;
      }
    
      public Object getNestedComplexProperty() {
        return nestedComplexProperty;
      }
    
      public String getComplexPropertyName() {
        return complexPropertyName;
      }
    
      public void setNestedComplexProperty(Object nestedComplexProperty) {
        this.nestedComplexProperty = nestedComplexProperty;
      }
      
      
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/action/DefinePropertyAction.java0000644�0001750�0001750�00000007353�12136042272�033223� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.action;
    
    import ch.qos.logback.core.joran.action.ActionUtil.Scope;
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    import ch.qos.logback.core.joran.spi.ActionException;
    import ch.qos.logback.core.spi.LifeCycle;
    import ch.qos.logback.core.util.OptionHelper;
    import ch.qos.logback.core.spi.PropertyDefiner;
    import org.xml.sax.Attributes;
    
    /**
     * Instantiate class for define property value. Get future property name and
     * property definer class from attributes. Some property definer properties
     * could be used. After defining put new property to context.
     * 
     * @author Aleksey Didik
     */
    public class DefinePropertyAction extends Action {
    
      String scopeStr;
      Scope scope;
      String propertyName;
      PropertyDefiner definer;
      boolean inError;
    
      public void begin(InterpretationContext ec, String localName,
          Attributes attributes) throws ActionException {
        // reset variables
        scopeStr = null;
        scope = null;
        propertyName = null;
        definer = null;
        inError = false;
        
        // read future property name
        propertyName = attributes.getValue(NAME_ATTRIBUTE);
        scopeStr = attributes.getValue(SCOPE_ATTRIBUTE);
        
        scope = ActionUtil.stringToScope(scopeStr);
        if (OptionHelper.isEmpty(propertyName)) {
          addError("Missing property name for property definer. Near [" + localName
              + "] line " + getLineNumber(ec));
          inError = true;
          return;
        }
    
        // read property definer class name
        String className = attributes.getValue(CLASS_ATTRIBUTE);
        if (OptionHelper.isEmpty(className)) {
          addError("Missing class name for property definer. Near [" + localName
              + "] line " + getLineNumber(ec));
          inError = true;
          return;
        }
    
        // try to instantiate property definer
        try {
          addInfo("About to instantiate property definer of type [" + className
              + "]");
          definer = (PropertyDefiner) OptionHelper.instantiateByClassName(
              className, PropertyDefiner.class, context);
          definer.setContext(context);
          if(definer instanceof LifeCycle) {
            ((LifeCycle) definer).start();
          }
          ec.pushObject(definer);
        } catch (Exception oops) {
          inError = true;
          addError("Could not create an PropertyDefiner of type [" + className
              + "].", oops);
          throw new ActionException(oops);
        }
      }
    
      /**
       * Now property definer is initialized by all properties and we can put
       * property value to context
       */
      public void end(InterpretationContext ec, String name) {
        if (inError) {
          return;
        }
    
        Object o = ec.peekObject();
    
        if (o != definer) {
          addWarn("The object at the of the stack is not the property definer for property named ["
              + propertyName + "] pushed earlier.");
        } else {
          addInfo("Popping property definer for property named [" + propertyName
              + "] from the object stack");
          ec.popObject();
          // let's put defined property and value to context but only if it is
          // not null
          String propertyValue = definer.getPropertyValue();
          if(propertyValue != null) {
            ActionUtil.setProperty(ec, propertyName, propertyValue, scope);
          }
        }
      }
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/action/ActionConst.java���������0000644�0001750�0001750�00000003035�12136042272�031343� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.action;
    
    /**
     *
     * This class contains costants used by other Actions.
     * 
     * @author Ceki G&uuml;lc&uuml;
     *
     */
    public abstract class ActionConst {
    	
      public static final String APPENDER_TAG = "appender";
      public static final String REF_ATTRIBUTE = "ref";
      public static final String ADDITIVITY_ATTRIBUTE = "additivity";
      public static final String LEVEL_ATTRIBUTE = "level";
      public static final String CONVERTER_CLASS_ATTRIBUTE = "converterClass";
      public static final String CONVERSION_WORD_ATTRIBUTE = "conversionWord";
      public static final String PATTERN_ATTRIBUTE = "pattern";
      public static final String VALUE_ATTR = "value";
      public static final String ACTION_CLASS_ATTRIBUTE = "actionClass";
    
      public static final String INHERITED = "INHERITED";
      public static final String NULL = "NULL";
      static final Class<?>[] ONE_STRING_PARAM = new Class[] { String.class };
    
      public static final String APPENDER_BAG = "APPENDER_BAG";
      public static final String FILTER_CHAIN_BAG = "FILTER_CHAIN_BAG";
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/action/Action.java��������������0000644�0001750�0001750�00000006225�12140150756�030342� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.action;
    
    import org.xml.sax.Attributes;
    import org.xml.sax.Locator;
    
    import ch.qos.logback.core.joran.spi.ActionException;
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    import ch.qos.logback.core.joran.spi.Interpreter;
    import ch.qos.logback.core.spi.ContextAwareBase;
    
    /**
     *
     * Most of the work for configuring logback is done by Actions.
     *
     * <p>Action methods are invoked as the XML file is parsed.
     *
     * <p>This class is largely inspired from the relevant class in the
     * commons-digester project of the Apache Software Foundation.
     *
     * @author Craig McClanahan
     * @author Christopher Lenz
     * @author Ceki G&uuml;lc&uuml;
     *
     */
    public abstract class Action extends ContextAwareBase {
    
      public static final String NAME_ATTRIBUTE = "name";
      public static final String KEY_ATTRIBUTE = "key";
      public static final String VALUE_ATTRIBUTE = "value";
      public static final String FILE_ATTRIBUTE = "file";
      public static final String CLASS_ATTRIBUTE = "class";
      public static final String PATTERN_ATTRIBUTE = "pattern";
      public static final String SCOPE_ATTRIBUTE = "scope";
    
    
      public static final String ACTION_CLASS_ATTRIBUTE = "actionClass";
    
      /**
       * Called when the parser encounters an element matching a
       * {@link ch.qos.logback.core.joran.spi.ElementSelector Pattern}.
       */
      public abstract void begin(InterpretationContext ic, String name,
          Attributes attributes) throws ActionException;
    
      /**
       * Called to pass the body (as text) contained within an element.
       * @param ic
       * @param body
       * @throws ActionException
       */
      public void body(InterpretationContext ic, String body)
          throws ActionException {
        // NOP
      }
    
      /*
       * Called when the parser encounters an endElement event matching a
       * {@link ch.qos.logback.core.joran.spi.Pattern Pattern}.
       */
      public abstract void end(InterpretationContext ic, String name)
          throws ActionException;
    
      public String toString() {
        return this.getClass().getName();
      }
    
      protected int getColumnNumber(InterpretationContext ic) {
        Interpreter ji = ic.getJoranInterpreter();
        Locator locator = ji.getLocator();
        if (locator != null) {
          return locator.getColumnNumber();
        }
        return -1;
      }
    
      protected int getLineNumber(InterpretationContext ic) {
        Interpreter ji = ic.getJoranInterpreter();
        Locator locator = ji.getLocator();
        if (locator != null) {
          return locator.getLineNumber();
        }
        return -1;
      }
    
      protected String getLineColStr(InterpretationContext ic) {
        return "line: " + getLineNumber(ic) + ", column: "
            + getColumnNumber(ic);
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/action/NewRuleAction.java�������0000644�0001750�0001750�00000004321�12140150756�031637� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.action;
    
    import org.xml.sax.Attributes;
    
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    import ch.qos.logback.core.joran.spi.ElementSelector;
    import ch.qos.logback.core.util.OptionHelper;
    
    
    public class NewRuleAction extends Action {
      boolean inError = false;
    
      /**
       * Instantiates an layout of the given class and sets its name.
       */
      public void begin(InterpretationContext ec, String localName, Attributes attributes) {
        // Let us forget about previous errors (in this object)
        inError = false;
        String errorMsg;
        String pattern = attributes.getValue(Action.PATTERN_ATTRIBUTE);
        String actionClass = attributes.getValue(Action.ACTION_CLASS_ATTRIBUTE);
    
        if (OptionHelper.isEmpty(pattern)) {
          inError = true;
          errorMsg = "No 'pattern' attribute in <newRule>";
          addError(errorMsg);
          return;
        }
    
        if (OptionHelper.isEmpty(actionClass)) {
          inError = true;
          errorMsg = "No 'actionClass' attribute in <newRule>";
          addError(errorMsg);
          return;
        }
    
        try {
          addInfo("About to add new Joran parsing rule [" + pattern + ","
              + actionClass + "].");
          ec.getJoranInterpreter().getRuleStore().addRule(new ElementSelector(pattern),
              actionClass);
        } catch (Exception oops) {
          inError = true;
          errorMsg = "Could not add new Joran parsing rule [" + pattern + ","
              + actionClass + "]";
          addError(errorMsg);
        }
      }
    
      /**
       * Once the children elements are also parsed, now is the time to activate the
       * appender options.
       */
      public void end(InterpretationContext ec, String n) {
      }
    
      public void finish(InterpretationContext ec) {
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000146�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/action/ContextPropertyAction.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/action/ContextPropertyAction.jav0000644�0001750�0001750�00000002150�12136042272�033302� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.action;
    
    import org.xml.sax.Attributes;
    
    import ch.qos.logback.core.joran.spi.ActionException;
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    
    /**
     * @author Ceki Gulcu
     */
    public class ContextPropertyAction extends Action {
    
      @Override
      public void begin(InterpretationContext ec, String name, Attributes attributes)
          throws ActionException {
        addError("The [contextProperty] element has been removed. Please use [substitutionProperty] element instead");
      }
    
      @Override
      public void end(InterpretationContext ec, String name) throws ActionException {
      }
    
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000146�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/action/NestedBasicPropertyIA.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/action/NestedBasicPropertyIA.jav0000644�0001750�0001750�00000007211�12140150756�033123� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.action;
    
    import java.util.Stack;
    
    import ch.qos.logback.core.joran.spi.ElementPath;
    import org.xml.sax.Attributes;
    
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    import ch.qos.logback.core.joran.util.PropertySetter;
    import ch.qos.logback.core.util.AggregationType;
    
    /**
     * This action is responsible for tying together a parent object with one of its
     * <em>simple</em> properties specified as an element but for which there is
     * no explicit rule.
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public class NestedBasicPropertyIA extends ImplicitAction {
    
    
      // We use a stack of IADataForBasicProperty objects in order to 
      // support nested elements which are handled by the same NestedBasicPropertyIA instance.
      // We push a IADataForBasicProperty instance in the isApplicable method (if the
      // action is applicable) and pop it in the end() method.
      // The XML well-formedness property will guarantee that a push will eventually
      // be followed by the corresponding pop.
      Stack<IADataForBasicProperty> actionDataStack = new Stack<IADataForBasicProperty>();
    
      public boolean isApplicable(ElementPath elementPath, Attributes attributes,
          InterpretationContext ec) {
        // System.out.println("in NestedSimplePropertyIA.isApplicable [" + pattern +
        // "]");
        String nestedElementTagName = elementPath.peekLast();
    
        // no point in attempting if there is no parent object
        if (ec.isEmpty()) {
          return false;
        }
    
        Object o = ec.peekObject();
        PropertySetter parentBean = new PropertySetter(o);
        parentBean.setContext(context);
    
        AggregationType aggregationType = parentBean
            .computeAggregationType(nestedElementTagName);
    
        switch (aggregationType) {
        case NOT_FOUND:
        case AS_COMPLEX_PROPERTY:
        case AS_COMPLEX_PROPERTY_COLLECTION:
          return false;
    
        case AS_BASIC_PROPERTY:
        case AS_BASIC_PROPERTY_COLLECTION:
          IADataForBasicProperty ad = new IADataForBasicProperty(parentBean,
              aggregationType, nestedElementTagName);
          actionDataStack.push(ad);
          // addInfo("NestedSimplePropertyIA deemed applicable [" + pattern + "]");
          return true;
        default:
          addError("PropertySetter.canContainComponent returned " + aggregationType);
          return false;
        }
      }
    
      public void begin(InterpretationContext ec, String localName,
          Attributes attributes) {
        // NOP
      }
    
      public void body(InterpretationContext ec, String body) {
    
        String finalBody = ec.subst(body);
        // get the action data object pushed in isApplicable() method call
        IADataForBasicProperty actionData = (IADataForBasicProperty) actionDataStack.peek();
        switch (actionData.aggregationType) {
        case AS_BASIC_PROPERTY:
          actionData.parentBean.setProperty(actionData.propertyName, finalBody);
          break;
        case AS_BASIC_PROPERTY_COLLECTION:
          actionData.parentBean
              .addBasicProperty(actionData.propertyName, finalBody);
        }
      }
    
      public void end(InterpretationContext ec, String tagName) {
        // pop the action data object pushed in isApplicable() method call
        actionDataStack.pop();
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/action/IncludeAction.java�������0000644�0001750�0001750�00000016412�12136520102�031634� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.action;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.MalformedURLException;
    import java.net.URI;
    import java.net.URL;
    import java.util.List;
    
    import ch.qos.logback.core.joran.util.ConfigurationWatchListUtil;
    import org.xml.sax.Attributes;
    
    import ch.qos.logback.core.joran.event.SaxEvent;
    import ch.qos.logback.core.joran.event.SaxEventRecorder;
    import ch.qos.logback.core.joran.spi.ActionException;
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.util.Loader;
    import ch.qos.logback.core.util.OptionHelper;
    
    public class IncludeAction extends Action {
    
      private static final String INCLUDED_TAG = "included";
      private static final String FILE_ATTR = "file";
      private static final String URL_ATTR = "url";
      private static final String RESOURCE_ATTR = "resource";
      private static final String OPTIONAL_ATTR = "optional";
    
      private String attributeInUse;
      private boolean optional;
    
      @Override
      public void begin(InterpretationContext ec, String name, Attributes attributes)
              throws ActionException {
    
        SaxEventRecorder recorder = new SaxEventRecorder(context);
    
        this.attributeInUse = null;
        this.optional = OptionHelper.toBoolean(attributes.getValue(OPTIONAL_ATTR), false);
    
        if (!checkAttributes(attributes)) {
          return;
        }
    
        InputStream in = getInputStream(ec, attributes);
    
        try {
          if (in != null) {
            parseAndRecord(in, recorder);
            // remove the <included> tag from the beginning and </included> from the end
            trimHeadAndTail(recorder);
    
            // offset = 2, because we need to get past this element as well as the end element
            ec.getJoranInterpreter().getEventPlayer().addEventsDynamically(recorder.saxEventList, 2);
          }
        } catch (JoranException e) {
          addError("Error while parsing  " + attributeInUse, e);
        } finally {
          close(in);
        }
    
      }
    
      void close(InputStream in) {
        if (in != null) {
          try {
            in.close();
          } catch (IOException e) {
          }
        }
      }
    
      private boolean checkAttributes(Attributes attributes) {
        String fileAttribute = attributes.getValue(FILE_ATTR);
        String urlAttribute = attributes.getValue(URL_ATTR);
        String resourceAttribute = attributes.getValue(RESOURCE_ATTR);
    
        int count = 0;
    
        if (!OptionHelper.isEmpty(fileAttribute)) {
          count++;
        }
        if (!OptionHelper.isEmpty(urlAttribute)) {
          count++;
        }
        if (!OptionHelper.isEmpty(resourceAttribute)) {
          count++;
        }
    
        if (count == 0) {
          addError("One of \"path\", \"resource\" or \"url\" attributes must be set.");
          return false;
        } else if (count > 1) {
          addError("Only one of \"file\", \"url\" or \"resource\" attributes should be set.");
          return false;
        } else if (count == 1) {
          return true;
        }
        throw new IllegalStateException("Count value [" + count
                + "] is not expected");
      }
    
      private InputStream getInputStreamByFilePath(String pathToFile) {
        try {
          return new FileInputStream(pathToFile);
        } catch (IOException ioe) {
          String errMsg = "File [" + pathToFile + "] does not exist.";
          addError(errMsg, ioe);
          return null;
        }
      }
    
      URL attributeToURL(String urlAttribute) {
        try {
          return new URL(urlAttribute);
        } catch (MalformedURLException mue) {
          String errMsg = "URL [" + urlAttribute + "] is not well formed.";
          addError(errMsg, mue);
          return null;
        }
      }
    
      private InputStream getInputStreamByUrl(URL url) {
        return openURL(url);
      }
    
      InputStream openURL(URL url) {
        try {
          return url.openStream();
        } catch (IOException e) {
          if (!optional) {
            String errMsg = "Failed to open [" + url.toString() + "]";
            addError(errMsg, e);
          }
          return null;
        }
      }
    
      URL resourceAsURL(String resourceAttribute) {
        URL url = Loader.getResourceBySelfClassLoader(resourceAttribute);
        if (url == null) {
          String errMsg = "Could not find resource corresponding to ["
                  + resourceAttribute + "]";
          addError(errMsg);
          return null;
        } else
          return url;
      }
    
      URL filePathAsURL(String path) {
        URI uri = new File(path).toURI();
        try {
          return uri.toURL();
        } catch (MalformedURLException e) {
          // impossible to get here
          e.printStackTrace();
          return null;
        }
      }
    
      private InputStream getInputStreamByResource(URL url) {
        return openURL(url);
      }
    
      URL getInputURL(InterpretationContext ec, Attributes attributes) {
        String fileAttribute = attributes.getValue(FILE_ATTR);
        String urlAttribute = attributes.getValue(URL_ATTR);
        String resourceAttribute = attributes.getValue(RESOURCE_ATTR);
    
        if (!OptionHelper.isEmpty(fileAttribute)) {
          this.attributeInUse = ec.subst(fileAttribute);
          return filePathAsURL(attributeInUse);
        }
    
        if (!OptionHelper.isEmpty(urlAttribute)) {
          this.attributeInUse = ec.subst(urlAttribute);
          return attributeToURL(attributeInUse);
        }
    
        if (!OptionHelper.isEmpty(resourceAttribute)) {
          this.attributeInUse = ec.subst(resourceAttribute);
          return resourceAsURL(attributeInUse);
        }
        // given previous checkAttributes() check we cannot reach this line
        throw new IllegalStateException("A URL stream should have been returned");
    
      }
    
      InputStream getInputStream(InterpretationContext ec, Attributes attributes) {
        URL inputURL = getInputURL(ec, attributes);
        if (inputURL == null)
          return null;
    
        ConfigurationWatchListUtil.addToWatchList(context, inputURL);
        return openURL(inputURL);
      }
    
      private void trimHeadAndTail(SaxEventRecorder recorder) {
        // Let's remove the two <included> events before
        // adding the events to the player.
    
        List<SaxEvent> saxEventList = recorder.saxEventList;
    
        if (saxEventList.size() == 0) {
          return;
        }
    
        SaxEvent first = saxEventList.get(0);
        if (first != null && first.qName.equalsIgnoreCase(INCLUDED_TAG)) {
          saxEventList.remove(0);
        }
    
        SaxEvent last = saxEventList.get(recorder.saxEventList.size() - 1);
        if (last != null && last.qName.equalsIgnoreCase(INCLUDED_TAG)) {
          saxEventList.remove(recorder.saxEventList.size() - 1);
        }
      }
    
      private void parseAndRecord(InputStream inputSource, SaxEventRecorder recorder)
              throws JoranException {
        recorder.setContext(context);
        recorder.recordEvents(inputSource);
      }
    
      @Override
      public void end(InterpretationContext ec, String name) throws ActionException {
        // do nothing
      }
    
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/action/ConversionRuleAction.java0000644�0001750�0001750�00000005157�12136042272�033241� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.action;
    
    import java.util.HashMap;
    import java.util.Map;
    
    
    import org.xml.sax.Attributes;
    
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    import ch.qos.logback.core.util.OptionHelper;
    
    
    
    public class ConversionRuleAction extends Action {
      boolean inError = false;
      
      /**
       * Instantiates an layout of the given class and sets its name.
       *
       */
      @SuppressWarnings("unchecked")
      public void begin(InterpretationContext ec, String localName, Attributes attributes) {
        // Let us forget about previous errors (in this object)
        inError = false;
    
        String errorMsg;
        String conversionWord =
          attributes.getValue(ActionConst.CONVERSION_WORD_ATTRIBUTE);
        String converterClass =
          attributes.getValue(ActionConst.CONVERTER_CLASS_ATTRIBUTE);
    
        if (OptionHelper.isEmpty(conversionWord)) {
          inError = true;
          errorMsg = "No 'conversionWord' attribute in <conversionRule>";
          addError(errorMsg);
    
          return;
        }
    
        if (OptionHelper.isEmpty(converterClass)) {
          inError = true;
          errorMsg = "No 'converterClass' attribute in <conversionRule>";
          ec.addError(errorMsg);
    
          return;
        }
    
        try {
          Map<String, String> ruleRegistry = (Map) context.getObject(CoreConstants.PATTERN_RULE_REGISTRY);
          if(ruleRegistry == null) {
            ruleRegistry = new HashMap<String, String>();
            context.putObject(CoreConstants.PATTERN_RULE_REGISTRY, ruleRegistry);
          }
          // put the new rule into the rule registry
          addInfo("registering conversion word "+conversionWord+" with class ["+converterClass+"]");
          ruleRegistry.put(conversionWord, converterClass);
        } catch (Exception oops) {
          inError = true;
          errorMsg = "Could not add conversion rule to PatternLayout.";
          addError(errorMsg);
        }
      }
    
      /**
       * Once the children elements are also parsed, now is the time to activate
       * the appender options.
       */
      public void end(InterpretationContext ec, String n) {
      }
    
      public void finish(InterpretationContext ec) {
      }
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/action/TimestampAction.java�����0000644�0001750�0001750�00000005605�12136042272�032225� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.action;
    
    import ch.qos.logback.core.util.CachingDateFormatter;
    import org.xml.sax.Attributes;
    
    import ch.qos.logback.core.joran.action.ActionUtil.Scope;
    import ch.qos.logback.core.joran.spi.ActionException;
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    import ch.qos.logback.core.util.OptionHelper;
    
    /**
     * Given a key and a date-and-time pattern, puts a property to the context, with
     * the specified key and value equal to the current time in the format
     * corresponding to the specified date-and-time pattern.
     * 
     * @author Ceki G&uuml;lc&uuml;
     * 
     */
    public class TimestampAction extends Action {
      static String DATE_PATTERN_ATTRIBUTE = "datePattern";
      static String TIME_REFERENCE_ATTRIBUTE = "timeReference";
      static String CONTEXT_BIRTH = "contextBirth";
    
      boolean inError = false;
    
      @Override
      public void begin(InterpretationContext ec, String name, Attributes attributes)
          throws ActionException {
        String keyStr = attributes.getValue(KEY_ATTRIBUTE);
        if (OptionHelper.isEmpty(keyStr)) {
          addError("Attribute named [" + KEY_ATTRIBUTE + "] cannot be empty");
          inError = true;
        }
        String datePatternStr = attributes.getValue(DATE_PATTERN_ATTRIBUTE);
        if (OptionHelper.isEmpty(datePatternStr)) {
          addError("Attribute named [" + DATE_PATTERN_ATTRIBUTE
              + "] cannot be empty");
          inError = true;
        }
    
        String timeReferenceStr = attributes.getValue(TIME_REFERENCE_ATTRIBUTE);
        long timeReference;
        if (CONTEXT_BIRTH.equalsIgnoreCase(timeReferenceStr)) {
          addInfo("Using context birth as time reference.");
          timeReference = context.getBirthTime();
        } else {
          timeReference =  System.currentTimeMillis();
          addInfo("Using current interpretation time, i.e. now, as time reference.");
        }
    
    
        if (inError)
          return;
    
        String scopeStr = attributes.getValue(SCOPE_ATTRIBUTE);
        Scope scope = ActionUtil.stringToScope(scopeStr);
        
        CachingDateFormatter sdf = new CachingDateFormatter(datePatternStr);
        String val = sdf.format(timeReference);
    
        addInfo("Adding property to the context with key=\"" + keyStr
            + "\" and value=\"" + val + "\" to the " + scope + " scope");
        ActionUtil.setProperty(ec, keyStr, val, scope);
      }
    
      @Override
      public void end(InterpretationContext ec, String name) throws ActionException {
      }
    
    }
    ���������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/action/AppenderRefAction.java���0000644�0001750�0001750�00000005175�12136042272�032457� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.action;
    
    import org.xml.sax.Attributes;
    
    import ch.qos.logback.core.Appender;
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    import ch.qos.logback.core.spi.AppenderAttachable;
    import ch.qos.logback.core.util.OptionHelper;
    
    
    import java.util.HashMap;
    
    public class AppenderRefAction<E> extends Action {
      boolean inError = false;
    
      @SuppressWarnings("unchecked")
      public void begin(InterpretationContext ec, String tagName, Attributes attributes) {
        // Let us forget about previous errors (in this object)
        inError = false;
    
        // logger.debug("begin called");
    
        Object o = ec.peekObject();
    
        if (!(o instanceof AppenderAttachable)) {
          String errMsg = "Could not find an AppenderAttachable at the top of execution stack. Near ["
              + tagName + "] line " + getLineNumber(ec);
          inError = true;
          addError(errMsg);
          return;
        }
    
        AppenderAttachable<E> appenderAttachable = (AppenderAttachable<E>) o;
    
        String appenderName = ec.subst(attributes.getValue(ActionConst.REF_ATTRIBUTE));
    
        if (OptionHelper.isEmpty(appenderName)) {
          // print a meaningful error message and return
          String errMsg = "Missing appender ref attribute in <appender-ref> tag.";
          inError = true;
          addError(errMsg);
    
          return;
        }
    
        HashMap<String, Appender<E>> appenderBag = (HashMap<String, Appender<E>>) ec.getObjectMap().get(
            ActionConst.APPENDER_BAG);
        Appender<E> appender = (Appender<E>) appenderBag.get(appenderName);
    
        if (appender == null) {
          String msg = "Could not find an appender named [" + appenderName
              + "]. Did you define it below instead of above in the configuration file?";
          inError = true;
          addError(msg);
          addError("See " + CoreConstants.CODES_URL
              + "#appender_order for more details.");
          return;
        }
    
        addInfo("Attaching appender named [" + appenderName + "] to "
            + appenderAttachable);
        appenderAttachable.addAppender(appender);
      }
    
      public void end(InterpretationContext ec, String n) {
      }
    
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000147�00000000000�011567� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/action/IADataForBasicProperty.java��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/action/IADataForBasicProperty.ja0000644�0001750�0001750�00000002175�12136042272�033035� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.action;
    
    import ch.qos.logback.core.joran.util.PropertySetter;
    import ch.qos.logback.core.util.AggregationType;
    
    /**
     * Lump together several fields for use by {@link NestedBasicPropertyIA}.
     * 
     * @author Ceki Gulcu
     */
    class IADataForBasicProperty {
      final PropertySetter parentBean;
      final AggregationType aggregationType;
      final String propertyName;
      boolean inError;
    
      IADataForBasicProperty(PropertySetter parentBean, AggregationType aggregationType, String propertyName) {
        this.parentBean = parentBean;
        this.aggregationType = aggregationType;
        this.propertyName = propertyName;
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/action/StatusListenerAction.java0000644�0001750�0001750�00000004724�12136042272�033254� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.action;
    
    import ch.qos.logback.core.spi.ContextAware;
    import org.xml.sax.Attributes;
    
    import ch.qos.logback.core.joran.spi.ActionException;
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    import ch.qos.logback.core.spi.LifeCycle;
    import ch.qos.logback.core.status.StatusListener;
    import ch.qos.logback.core.util.OptionHelper;
    
    
    public class StatusListenerAction extends Action {
    
    
      boolean inError = false;
      StatusListener statusListener = null;
    
      public void begin(InterpretationContext ec, String name, Attributes attributes) throws ActionException {
        inError = false;
        String className = attributes.getValue(CLASS_ATTRIBUTE);
        if (OptionHelper.isEmpty(className)) {
          addError("Missing class name for statusListener. Near ["
                  + name + "] line " + getLineNumber(ec));
          inError = true;
          return;
        }
    
        try {
          statusListener = (StatusListener) OptionHelper.instantiateByClassName(
                  className, StatusListener.class, context);
          ec.getContext().getStatusManager().add(statusListener);
          if (statusListener instanceof ContextAware) {
            ((ContextAware) statusListener).setContext(context);
          }
          addInfo("Added status listener of type [" + className + "]");
          ec.pushObject(statusListener);
        } catch (Exception e) {
          inError = true;
          addError(
                  "Could not create an StatusListener of type [" + className + "].", e);
          throw new ActionException(e);
        }
    
      }
    
      public void finish(InterpretationContext ec) {
      }
    
      public void end(InterpretationContext ec, String e) {
        if (inError) {
          return;
        }
        if (statusListener instanceof LifeCycle) {
          ((LifeCycle) statusListener).start();
        }
        Object o = ec.peekObject();
        if (o != statusListener) {
          addWarn("The object at the of the stack is not the statusListener pushed earlier.");
        } else {
          ec.popObject();
        }
      }
    }
    ��������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/action/NOPAction.java�����������0000644�0001750�0001750�00000002116�12136042272�030710� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.action;
    
    import org.xml.sax.Attributes;
    
    import ch.qos.logback.core.joran.action.Action;
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    
    
    /**
     * No operation (NOP) action that does strictly nothing. 
     * Setting a rule to this pattern is sometimes useful in order
     * to prevent implicit actions to kick in.
     *  
     * @author Ceki G&uuml;lc&uuml;
     */
    public class NOPAction extends Action {
      
      public void begin(InterpretationContext ec, String name, Attributes attributes) {
      }
    
    
      public void end(InterpretationContext ec, String name) {
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000155�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/action/AbstractEventEvaluatorAction.java��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/action/AbstractEventEvaluatorAct0000644�0001750�0001750�00000007364�12136042272�033270� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.action;
    
    import java.util.Map;
    
    import org.xml.sax.Attributes;
    
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.boolex.EventEvaluator;
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    import ch.qos.logback.core.spi.LifeCycle;
    import ch.qos.logback.core.util.OptionHelper;
    
    abstract public class AbstractEventEvaluatorAction extends Action {
    
      EventEvaluator<?> evaluator;
      boolean inError = false;
    
      /**
       * Instantiates an evaluator of the given class and sets its name.
       */
      public void begin(InterpretationContext ec, String name, Attributes attributes) {
        // Let us forget about previous errors (in this instance)
        inError = false;
        evaluator = null;
    
        String className = attributes.getValue(CLASS_ATTRIBUTE);
        if (OptionHelper.isEmpty(className)) {
          className = defaultClassName();
          addInfo("Assuming default evaluator class [" + className + "]");
        }
    
        if (OptionHelper.isEmpty(className)) {
          className = defaultClassName();
          inError = true;
          addError("Mandatory \"" + CLASS_ATTRIBUTE
              + "\" attribute not set for <evaluator>");
          return;
        }
    
        String evaluatorName = attributes.getValue(Action.NAME_ATTRIBUTE);
        if (OptionHelper.isEmpty(evaluatorName)) {
          inError = true;
          addError("Mandatory \"" + NAME_ATTRIBUTE
              + "\" attribute not set for <evaluator>");
          return;
        }
        try {
          evaluator = (EventEvaluator<?>) OptionHelper.instantiateByClassName(
              className, ch.qos.logback.core.boolex.EventEvaluator.class, context);
    
          evaluator.setContext(this.context);
          evaluator.setName(evaluatorName);
    
          ec.pushObject(evaluator);
          addInfo("Adding evaluator named [" + evaluatorName
              + "] to the object stack");
    
        } catch (Exception oops) {
          inError = true;
          addError("Could not create evaluator of type " + className + "].", oops);
        }
      }
    
      /**
       * Returns a default class name in case the class attribute is not specified
       * 
       * @return
       */
      abstract protected String defaultClassName();
    
      /**
       * Once the children elements are also parsed, now is the time to activate the
       * evaluator options.
       */
      @SuppressWarnings("unchecked")
      public void end(InterpretationContext ec, String e) {
        if (inError) {
          return;
        }
    
        if (evaluator instanceof LifeCycle) {
          ((LifeCycle) evaluator).start();
          addInfo("Starting evaluator named [" + evaluator.getName() + "]");
        }
    
        Object o = ec.peekObject();
    
        if (o != evaluator) {
          addWarn("The object on the top the of the stack is not the evaluator pushed earlier.");
        } else {
          ec.popObject();
    
          try {
            Map<String, EventEvaluator<?>> evaluatorMap = (Map<String, EventEvaluator<?>>) context
                .getObject(CoreConstants.EVALUATOR_MAP);
            if(evaluatorMap == null) {
              addError("Could not find EvaluatorMap");
            } else {
              evaluatorMap.put(evaluator.getName(), evaluator);
            }
          } catch (Exception ex) {
            addError("Could not set evaluator named [" + evaluator + "].", ex);
          }
        }
      }
    
      public void finish(InterpretationContext ec) {
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/package.html��������������������0000644�0001750�0001750�00000000300�11377016712�027256� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
    
    <html> 
      <head>
        <title></title>
      </head>
      
      <body>
        
        <p>Contains Joran configuration classes.</p>
    
      </body> 
    </html>��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/util/���������������������������0000755�0001750�0001750�00000000000�12203357067�025761� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/util/PropertySetter.java��������0000644�0001750�0001750�00000036206�12136042272�031640� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    // Contributors:  Georg Lundesgaard
    package ch.qos.logback.core.joran.util;
    
    import java.beans.BeanInfo;
    import java.beans.IntrospectionException;
    import java.beans.Introspector;
    import java.beans.MethodDescriptor;
    import java.beans.PropertyDescriptor;
    import java.lang.annotation.Annotation;
    import java.lang.reflect.Method;
    
    import ch.qos.logback.core.joran.spi.DefaultClass;
    import ch.qos.logback.core.joran.spi.DefaultNestedComponentRegistry;
    import ch.qos.logback.core.spi.ContextAwareBase;
    import ch.qos.logback.core.util.AggregationType;
    import ch.qos.logback.core.util.PropertySetterException;
    
    /**
     * General purpose Object property setter. Clients repeatedly invokes
     * {@link #setProperty setProperty(name,value)} in order to invoke setters on
     * the Object specified in the constructor. This class relies on the JavaBeans
     * {@link Introspector} to analyze the given Object Class using reflection.
     * 
     * <p>
     * Usage:
     * 
     * <pre>
     * PropertySetter ps = new PropertySetter(anObject);
     * ps.set(&quot;name&quot;, &quot;Joe&quot;);
     * ps.set(&quot;age&quot;, &quot;32&quot;);
     * ps.set(&quot;isMale&quot;, &quot;true&quot;);
     * </pre>
     * 
     * will cause the invocations anObject.setName("Joe"), anObject.setAge(32), and
     * setMale(true) if such methods exist with those signatures. Otherwise an
     * {@link IntrospectionException} are thrown.
     * 
     * @author Anders Kristensen
     * @author Ceki Gulcu
     */
    public class PropertySetter extends ContextAwareBase {
    
      protected Object obj;
      protected Class<?> objClass;
      protected PropertyDescriptor[] propertyDescriptors;
      protected MethodDescriptor[] methodDescriptors;
    
      /**
       * Create a new PropertySetter for the specified Object. This is done in
       * preparation for invoking {@link #setProperty} one or more times.
       * 
       * @param obj
       *          the object for which to set properties
       */
      public PropertySetter(Object obj) {
        this.obj = obj;
        this.objClass = obj.getClass();
      }
    
      /**
       * Uses JavaBeans {@link Introspector} to computer setters of object to be
       * configured.
       */
      protected void introspect() {
        try {
          BeanInfo bi = Introspector.getBeanInfo(obj.getClass());
          propertyDescriptors = bi.getPropertyDescriptors();
          methodDescriptors = bi.getMethodDescriptors();
        } catch (IntrospectionException ex) {
          addError("Failed to introspect " + obj + ": " + ex.getMessage());
          propertyDescriptors = new PropertyDescriptor[0];
          methodDescriptors = new MethodDescriptor[0];
        }
      }
    
      /**
       * Set a property on this PropertySetter's Object. If successful, this method
       * will invoke a setter method on the underlying Object. The setter is the one
       * for the specified property name and the value is determined partly from the
       * setter argument type and partly from the value specified in the call to
       * this method.
       * 
       * <p>
       * If the setter expects a String no conversion is necessary. If it expects an
       * int, then an attempt is made to convert 'value' to an int using new
       * Integer(value). If the setter expects a boolean, the conversion is by new
       * Boolean(value).
       * 
       * @param name
       *          name of the property
       * @param value
       *          String value of the property
       */
      public void setProperty(String name, String value) {
        if (value == null) {
          return;
        }
    
        name = Introspector.decapitalize(name);
    
        PropertyDescriptor prop = getPropertyDescriptor(name);
    
        if (prop == null) {
          addWarn("No such property [" + name + "] in " + objClass.getName() + ".");
        } else {
          try {
            setProperty(prop, name, value);
          } catch (PropertySetterException ex) {
            addWarn("Failed to set property [" + name + "] to value \"" + value
                + "\". ", ex);
          }
        }
      }
    
      /**
       * Set the named property given a {@link PropertyDescriptor}.
       * 
       * @param prop
       *          A PropertyDescriptor describing the characteristics of the
       *          property to set.
       * @param name
       *          The named of the property to set.
       * @param value
       *          The value of the property.
       */
      public void setProperty(PropertyDescriptor prop, String name, String value)
          throws PropertySetterException {
        Method setter = prop.getWriteMethod();
    
        if (setter == null) {
          throw new PropertySetterException("No setter for property [" + name
              + "].");
        }
    
        Class<?>[] paramTypes = setter.getParameterTypes();
    
        if (paramTypes.length != 1) {
          throw new PropertySetterException("#params for setter != 1");
        }
    
        Object arg;
    
        try {
          arg = StringToObjectConverter.convertArg(this, value, paramTypes[0]);
        } catch (Throwable t) {
          throw new PropertySetterException("Conversion to type [" + paramTypes[0]
              + "] failed. ", t);
        }
    
        if (arg == null) {
          throw new PropertySetterException("Conversion to type [" + paramTypes[0]
              + "] failed.");
        }
        try {
          setter.invoke(obj, arg);
        } catch (Exception ex) {
          throw new PropertySetterException(ex);
        }
      }
    
      public AggregationType computeAggregationType(String name) {
        String cName = capitalizeFirstLetter(name);
    
        Method addMethod = findAdderMethod(cName);
    
        // if the
        if (addMethod != null) {
          AggregationType type = computeRawAggregationType(addMethod);
          switch (type) {
          case NOT_FOUND:
            return AggregationType.NOT_FOUND;
          case AS_BASIC_PROPERTY:
            return AggregationType.AS_BASIC_PROPERTY_COLLECTION;
          case AS_COMPLEX_PROPERTY:
            return AggregationType.AS_COMPLEX_PROPERTY_COLLECTION;
          }
        }
    
        Method setterMethod = findSetterMethod(name);
        if (setterMethod != null) {
          return computeRawAggregationType(setterMethod);
        } else {
          // we have failed
          return AggregationType.NOT_FOUND;
        }
      }
    
      private Method findAdderMethod(String name) {
        name = capitalizeFirstLetter(name);
        return getMethod("add" + name);
      }
    
      private Method findSetterMethod(String name) {
        String dName = Introspector.decapitalize(name);
        PropertyDescriptor propertyDescriptor = getPropertyDescriptor(dName);
        if (propertyDescriptor != null) {
          return propertyDescriptor.getWriteMethod();
        } else {
          return null;
        }
      }
    
      private Class<?> getParameterClassForMethod(Method method) {
        if (method == null) {
          return null;
        }
        Class<?>[] classArray = method.getParameterTypes();
        if (classArray.length != 1) {
          return null;
        } else {
          return classArray[0];
        }
      }
    
      private AggregationType computeRawAggregationType(Method method) {
        Class<?> parameterClass = getParameterClassForMethod(method);
        if (parameterClass == null) {
          return AggregationType.NOT_FOUND;
        }
        if (StringToObjectConverter.canBeBuiltFromSimpleString(parameterClass)) {
          return AggregationType.AS_BASIC_PROPERTY;
        } else {
          return AggregationType.AS_COMPLEX_PROPERTY;
        }
      }
    
      /**
       * Can the given clazz instantiable with certainty?
       * 
       * @param clazz
       *          The class to test for instantiability
       * @return true if clazz can be instantiated, and false otherwise.
       */
      private boolean isUnequivocallyInstantiable(Class<?> clazz) {
        if (clazz.isInterface()) {
          return false;
        }
        // checking for constructors would be more elegant, but in
        // classes without any declared constructors, Class.getConstructor()
        // returns null.
        Object o;
        try {
          o = clazz.newInstance();
          if (o != null) {
            return true;
          } else {
            return false;
          }
        } catch (InstantiationException e) {
          return false;
        } catch (IllegalAccessException e) {
          return false;
        }
      }
    
      public Class<?> getObjClass() {
        return objClass;
      }
    
      public void addComplexProperty(String name, Object complexProperty) {
        Method adderMethod = findAdderMethod(name);
        // first let us use the addXXX method
        if (adderMethod != null) {
          Class<?>[] paramTypes = adderMethod.getParameterTypes();
          if (!isSanityCheckSuccessful(name, adderMethod, paramTypes,
              complexProperty)) {
            return;
          }
          invokeMethodWithSingleParameterOnThisObject(adderMethod, complexProperty);
        } else {
          addError("Could not find method [" + "add" + name + "] in class ["
              + objClass.getName() + "].");
        }
      }
    
      void invokeMethodWithSingleParameterOnThisObject(Method method,
          Object parameter) {
        Class<?> ccc = parameter.getClass();
        try {
          method.invoke(this.obj, parameter);
        } catch (Exception e) {
          addError("Could not invoke method " + method.getName() + " in class "
              + obj.getClass().getName() + " with parameter of type "
              + ccc.getName(), e);
        }
      }
    
      public void addBasicProperty(String name, String strValue) {
    
        if (strValue == null) {
          return;
        }
    
        name = capitalizeFirstLetter(name);
        Method adderMethod = findAdderMethod(name);
    
        if (adderMethod == null) {
          addError("No adder for property [" + name + "].");
          return;
        }
    
        Class<?>[] paramTypes = adderMethod.getParameterTypes();
        isSanityCheckSuccessful(name, adderMethod, paramTypes, strValue);
    
        Object arg;
        try {
          arg = StringToObjectConverter.convertArg(this, strValue, paramTypes[0]);
        } catch (Throwable t) {
          addError("Conversion to type [" + paramTypes[0] + "] failed. ", t);
          return;
        }
        if (arg != null) {
          invokeMethodWithSingleParameterOnThisObject(adderMethod, strValue);
        }
      }
    
      public void setComplexProperty(String name, Object complexProperty) {
        String dName = Introspector.decapitalize(name);
        PropertyDescriptor propertyDescriptor = getPropertyDescriptor(dName);
    
        if (propertyDescriptor == null) {
          addWarn("Could not find PropertyDescriptor for [" + name + "] in "
              + objClass.getName());
    
          return;
        }
    
        Method setter = propertyDescriptor.getWriteMethod();
    
        if (setter == null) {
          addWarn("Not setter method for property [" + name + "] in "
              + obj.getClass().getName());
    
          return;
        }
    
        Class<?>[] paramTypes = setter.getParameterTypes();
    
        if (!isSanityCheckSuccessful(name, setter, paramTypes, complexProperty)) {
          return;
        }
        try {
          invokeMethodWithSingleParameterOnThisObject(setter, complexProperty);
    
        } catch (Exception e) {
          addError("Could not set component " + obj + " for parent component "
              + obj, e);
        }
      }
    
      private boolean isSanityCheckSuccessful(String name, Method method,
          Class<?>[] params, Object complexProperty) {
        Class<?> ccc = complexProperty.getClass();
        if (params.length != 1) {
          addError("Wrong number of parameters in setter method for property ["
              + name + "] in " + obj.getClass().getName());
    
          return false;
        }
    
        if (!params[0].isAssignableFrom(complexProperty.getClass())) {
          addError("A \"" + ccc.getName() + "\" object is not assignable to a \""
              + params[0].getName() + "\" variable.");
          addError("The class \"" + params[0].getName() + "\" was loaded by ");
          addError("[" + params[0].getClassLoader() + "] whereas object of type ");
          addError("\"" + ccc.getName() + "\" was loaded by ["
              + ccc.getClassLoader() + "].");
          return false;
        }
    
        return true;
      }
    
      private String capitalizeFirstLetter(String name) {
        return name.substring(0, 1).toUpperCase() + name.substring(1);
      }
    
      protected Method getMethod(String methodName) {
        if (methodDescriptors == null) {
          introspect();
        }
    
        for (int i = 0; i < methodDescriptors.length; i++) {
          if (methodName.equals(methodDescriptors[i].getName())) {
            return methodDescriptors[i].getMethod();
          }
        }
    
        return null;
      }
    
      protected PropertyDescriptor getPropertyDescriptor(String name) {
        if (propertyDescriptors == null) {
          introspect();
        }
    
        for (int i = 0; i < propertyDescriptors.length; i++) {
          // System.out.println("Comparing " + name + " against "
          // + propertyDescriptors[i].getName());
          if (name.equals(propertyDescriptors[i].getName())) {
            // System.out.println("matched");
            return propertyDescriptors[i];
          }
        }
    
        return null;
      }
    
      public Object getObj() {
        return obj;
      }
    
      Method getRelevantMethod(String name, AggregationType aggregationType) {
        String cName = capitalizeFirstLetter(name);
        Method relevantMethod;
        if (aggregationType == AggregationType.AS_COMPLEX_PROPERTY_COLLECTION) {
          relevantMethod = findAdderMethod(cName);
        } else if (aggregationType == AggregationType.AS_COMPLEX_PROPERTY) {
          relevantMethod = findSetterMethod(cName);
        } else {
          throw new IllegalStateException(aggregationType + " not allowed here");
        }
        return relevantMethod;
      }
    
      <T extends Annotation> T getAnnotation(String name, Class<T> annonationClass,
          Method relevantMethod) {
    
        if (relevantMethod != null) {
          return relevantMethod.getAnnotation(annonationClass);
        } else {
          return null;
        }
      }
    
      Class<?> getDefaultClassNameByAnnonation(String name, Method relevantMethod) {
        DefaultClass defaultClassAnnon = getAnnotation(name, DefaultClass.class,
            relevantMethod);
        if (defaultClassAnnon != null) {
          return defaultClassAnnon.value();
        }
        return null;
      }
    
      Class<?> getByConcreteType(String name, Method relevantMethod) {
    
        Class<?> paramType = getParameterClassForMethod(relevantMethod);
        if (paramType == null) {
          return null;
        }
    
        boolean isUnequivocallyInstantiable = isUnequivocallyInstantiable(paramType);
        if (isUnequivocallyInstantiable) {
          return paramType;
        } else {
          return null;
        }
    
      }
    
      public Class<?> getClassNameViaImplicitRules(String name,
          AggregationType aggregationType, DefaultNestedComponentRegistry registry) {
    
        Class<?> registryResult = registry.findDefaultComponentType(obj.getClass(),
            name);
        if (registryResult != null) {
          return registryResult;
        }
        // find the relevant method for the given property name and aggregationType
        Method relevantMethod = getRelevantMethod(name, aggregationType);
        if (relevantMethod == null) {
          return null;
        }
        Class<?> byAnnotation = getDefaultClassNameByAnnonation(name, relevantMethod);
        if (byAnnotation != null) {
          return byAnnotation;
        }
        return getByConcreteType(name, relevantMethod);
      }
    
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000151�00000000000�011562� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/util/ConfigurationWatchListUtil.java������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/util/ConfigurationWatchListUtil.0000644�0001750�0001750�00000006360�12136042272�033251� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.util;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.joran.spi.ConfigurationWatchList;
    import ch.qos.logback.core.status.InfoStatus;
    import ch.qos.logback.core.status.Status;
    import ch.qos.logback.core.status.StatusManager;
    import ch.qos.logback.core.status.WarnStatus;
    
    import java.net.URL;
    
    /**
     * @author Ceki G&uuml;c&uuml;
     */
    public class ConfigurationWatchListUtil {
    
      final static ConfigurationWatchListUtil origin = new ConfigurationWatchListUtil();
    
      private ConfigurationWatchListUtil() {
      }
    
      public static void setMainWatchURL(Context context, URL url) {
        ConfigurationWatchList cwl = getConfigurationWatchList(context);
        if (cwl == null) {
          cwl = new ConfigurationWatchList();
          cwl.setContext(context);
          context.putObject(CoreConstants.CONFIGURATION_WATCH_LIST, cwl);
        } else {
          cwl.clear();
        }
        setConfigurationWatchListResetFlag(context, true);
        cwl.setMainURL(url);
      }
    
      public static URL getMainWatchURL(Context context) {
        ConfigurationWatchList cwl = getConfigurationWatchList(context);
        if (cwl == null) {
          return null;
        } else {
          return cwl.getMainURL();
        }
      }
    
      public static void addToWatchList(Context context, URL url) {
        ConfigurationWatchList cwl = getConfigurationWatchList(context);
        if (cwl == null) {
          addWarn(context, "Null ConfigurationWatchList. Cannot add " + url);
        } else {
          addInfo(context, "Adding [" + url + "] to configuration watch list.");
          cwl.addToWatchList(url);
        }
      }
    
      public static boolean wasConfigurationWatchListReset(Context context) {
        Object o = context.getObject(CoreConstants.CONFIGURATION_WATCH_LIST_RESET);
        if (o == null)
          return false;
        else {
          return ((Boolean) o).booleanValue();
        }
      }
    
      public static void setConfigurationWatchListResetFlag(Context context, boolean val) {
        context.putObject(CoreConstants.CONFIGURATION_WATCH_LIST_RESET, new Boolean(val));
      }
    
      public static ConfigurationWatchList getConfigurationWatchList(Context context) {
        return (ConfigurationWatchList) context.getObject(CoreConstants.CONFIGURATION_WATCH_LIST);
      }
    
      static void addStatus(Context context, Status s) {
        if (context == null) {
          System.out.println("Null context in " + ConfigurationWatchList.class.getName());
          return;
        }
        StatusManager sm = context.getStatusManager();
        if (sm == null) return;
        sm.add(s);
      }
    
      static void addInfo(Context context, String msg) {
        addStatus(context, new InfoStatus(msg, origin));
      }
    
      static void addWarn(Context context, String msg) {
        addStatus(context, new WarnStatus(msg, origin));
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000146�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/util/StringToObjectConverter.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/util/StringToObjectConverter.jav0000644�0001750�0001750�00000010414�12136042272�033245� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.util;
    
    import java.lang.reflect.Method;
    import java.lang.reflect.Modifier;
    import java.nio.charset.Charset;
    import java.nio.charset.UnsupportedCharsetException;
    
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.spi.ContextAware;
    
    /**
     * Utility class which can convert string into objects.
     * @author Ceki G&uuml;lc&uuml;
     *
     */
    public class StringToObjectConverter {
    
      private static final Class<?>[] STING_CLASS_PARAMETER = new Class[] { String.class };
    
      static public boolean canBeBuiltFromSimpleString(Class<?> parameterClass) {
        Package p = parameterClass.getPackage();
        if (parameterClass.isPrimitive()) {
          return true;
        } else if (p != null && "java.lang".equals(p.getName())) {
          return true;
        } else if (followsTheValueOfConvention(parameterClass)) {
          return true;
        } else if (parameterClass.isEnum()) {
          return true;
        } else if (isOfTypeCharset(parameterClass)) {
          return true;
        }
        return false;
      }
    
      /**
       * Convert <code>val</code> a String parameter to an object of a given type.
       */
      @SuppressWarnings("unchecked")
      public static Object convertArg(ContextAware ca, String val, Class<?> type) {
        if (val == null) {
          return null;
        }
        String v = val.trim();
        if (String.class.isAssignableFrom(type)) {
          return v;
        } else if (Integer.TYPE.isAssignableFrom(type)) {
          return new Integer(v);
        } else if (Long.TYPE.isAssignableFrom(type)) {
          return new Long(v);
        } else if (Float.TYPE.isAssignableFrom(type)) {
          return new Float(v);
        } else if (Double.TYPE.isAssignableFrom(type)) {
          return new Double(v);
        } else if (Boolean.TYPE.isAssignableFrom(type)) {
          if ("true".equalsIgnoreCase(v)) {
            return Boolean.TRUE;
          } else if ("false".equalsIgnoreCase(v)) {
            return Boolean.FALSE;
          }
        } else if (type.isEnum()) {
          return convertToEnum(ca, v, (Class<? extends Enum>) type);
        } else if (StringToObjectConverter.followsTheValueOfConvention(type)) {
          return convertByValueOfMethod(ca, type, v);
        } else if (isOfTypeCharset(type)) {
          return convertToCharset(ca, val);
        }
    
        return null;
      }
    
      static private boolean isOfTypeCharset(Class<?> type) {
        return Charset.class.isAssignableFrom(type);
      }
    
      static private Charset convertToCharset(ContextAware ca, String val) {
        try {
          return Charset.forName(val);
        } catch (UnsupportedCharsetException e) {
          ca.addError("Failed to get charset [" + val + "]", e);
          return null;
        }
      }
    
      static private boolean followsTheValueOfConvention(Class<?> parameterClass) {
        try {
          Method valueOfMethod = parameterClass.getMethod(CoreConstants.VALUE_OF,
              STING_CLASS_PARAMETER);
          int mod = valueOfMethod.getModifiers();
          if (Modifier.isStatic(mod)) {
            return true;
          }
        } catch (SecurityException e) {
          // nop
        } catch (NoSuchMethodException e) {
          // nop
        }
        return false;
      }
    
      private static Object convertByValueOfMethod(ContextAware ca, Class<?> type,
          String val) {
        try {
          Method valueOfMethod = type.getMethod(CoreConstants.VALUE_OF,
              STING_CLASS_PARAMETER);
          return valueOfMethod.invoke(null, val);
        } catch (Exception e) {
          ca.addError("Failed to invoke " + CoreConstants.VALUE_OF
              + "{} method in class [" + type.getName() + "] with value [" + val
              + "]");
          return null;
        }
      }
    
      @SuppressWarnings("unchecked")
      private static Object convertToEnum(ContextAware ca, String val,
          Class<? extends Enum> enumType) {
        return Enum.valueOf(enumType, val);
      }
    
      boolean isBuildableFromSimpleString() {
        return false;
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/conditional/��������������������0000755�0001750�0001750�00000000000�12203357067�027307� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000152�00000000000�011563� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/conditional/ThenOrElseActionBase.java�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/conditional/ThenOrElseActionBase0000644�0001750�0001750�00000005166�12136042272�033175� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.conditional;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Stack;
    
    import org.xml.sax.Attributes;
    
    import ch.qos.logback.core.joran.action.Action;
    import ch.qos.logback.core.joran.event.InPlayListener;
    import ch.qos.logback.core.joran.event.SaxEvent;
    import ch.qos.logback.core.joran.spi.ActionException;
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    
    abstract public class ThenOrElseActionBase extends Action {
    
      Stack<ThenActionState> stateStack = new Stack<ThenActionState>();
    
      @Override
      public void begin(InterpretationContext ic, String name, Attributes attributes)
          throws ActionException {
    
        if(!weAreActive(ic)) return;
    
        ThenActionState state = new ThenActionState();
        if (ic.isListenerListEmpty()) {
          ic.addInPlayListener(state);
          state.isRegistered = true;
        }
        stateStack.push(state);
      }
    
      boolean weAreActive(InterpretationContext ic) {
        Object o = ic.peekObject();
        if(!(o instanceof IfAction)) return false;
        IfAction ifAction = (IfAction) o;
        return ifAction.isActive();
      }
    
      @Override
      public void end(InterpretationContext ic, String name) throws ActionException {
        if(!weAreActive(ic)) return;
    
        ThenActionState state = stateStack.pop();
        if (state.isRegistered) {
          ic.removeInPlayListener(state);
          Object o = ic.peekObject();
          if (o instanceof IfAction) {
            IfAction ifAction = (IfAction) o;
            removeFirstAndLastFromList(state.eventList);
            registerEventList(ifAction, state.eventList);
          } else {
            throw new IllegalStateException("Missing IfAction on top of stack");
          }
        }
      }
      
      abstract void registerEventList(IfAction ifAction, List<SaxEvent> eventList);
    
      void removeFirstAndLastFromList(List<SaxEvent> eventList) {
        eventList.remove(0);
        eventList.remove(eventList.size() - 1);
      }
    
    }
    
    class ThenActionState implements InPlayListener {
    
      List<SaxEvent> eventList = new ArrayList<SaxEvent>();
      boolean isRegistered = false;
      
      public void inPlay(SaxEvent event) {
        eventList.add(event);
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000157�00000000000�011570� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/conditional/PropertyWrapperForScripts.java������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/conditional/PropertyWrapperForSc0000644�0001750�0001750�00000002716�12136042272�033354� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.conditional;
    
    import ch.qos.logback.core.spi.PropertyContainer;
    import ch.qos.logback.core.util.OptionHelper;
    
    public class PropertyWrapperForScripts {
    
      PropertyContainer local;
      PropertyContainer context;
    
      // this method is invoked by reflection in PropertyEvalScriptBuilder
      public void setPropertyContainers(PropertyContainer local, PropertyContainer context) {
        this.local = local;
        this.context = context;
      }
    
      public boolean isNull(String k) {
        String val = OptionHelper.propertyLookup(k, local, context);
        return (val == null);
      }
    
      public boolean isDefined(String k) {
        String val = OptionHelper.propertyLookup(k, local, context);
        return (val != null);
      }
    
      public String p(String k) {
        return property(k);
      }
      
      public String property(String k) {
        String val = OptionHelper.propertyLookup(k, local, context);
        if(val != null)
          return val;
        else
          return "";
      }
    }
    ��������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/conditional/IfAction.java�������0000644�0001750�0001750�00000011037�12136042272�031642� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.conditional;
    
    import java.util.List;
    import java.util.Stack;
    
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.util.EnvUtil;
    import org.xml.sax.Attributes;
    
    import ch.qos.logback.core.joran.action.Action;
    import ch.qos.logback.core.joran.event.SaxEvent;
    import ch.qos.logback.core.joran.spi.ActionException;
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    import ch.qos.logback.core.joran.spi.Interpreter;
    import ch.qos.logback.core.util.OptionHelper;
    
    public class IfAction extends Action {
      private static final String CONDITION_ATTR = "condition";
    
      public static final String MISSING_JANINO_MSG = "Could not find Janino library on the class path. Skipping conditional processing.";
      public static final String MISSING_JANINO_SEE = "See also " + CoreConstants.CODES_URL + "#ifJanino";
    
      Stack<IfState> stack = new Stack<IfState>();
      
      @Override
      public void begin(InterpretationContext ic, String name, Attributes attributes)
          throws ActionException {
    
        IfState state = new IfState();
        boolean emptyStack = stack.isEmpty();
        stack.push(state);
    
        if(!emptyStack) {
          return;
        }
        
        ic.pushObject(this);
        if(!EnvUtil.isJaninoAvailable()) {
           addError(MISSING_JANINO_MSG);
           addError(MISSING_JANINO_SEE);
           return;
         }
    
        state.active = true;
        Condition condition = null;
        String conditionAttribute = attributes.getValue(CONDITION_ATTR);
    
    
        if (!OptionHelper.isEmpty(conditionAttribute)) {
          conditionAttribute = OptionHelper.substVars(conditionAttribute, ic, context);
          PropertyEvalScriptBuilder pesb = new PropertyEvalScriptBuilder(ic);
          pesb.setContext(context);
          try {
            condition = pesb.build(conditionAttribute);
          } catch (Exception e) {
            addError("Failed to parse condition ["+conditionAttribute+"]", e);
          }
         
          if(condition!=null) {
            state.boolResult = condition.evaluate();
          }
          
        }
      }
    
    
      @Override
      public void end(InterpretationContext ic, String name) throws ActionException {
    
        IfState state = stack.pop();
        if(!state.active) {
          return;
        }
       
        
        Object o = ic.peekObject();
        if (o == null) {
          throw new IllegalStateException("Unexpected null object on stack");
        }
        if (!(o instanceof IfAction)) {
          throw new IllegalStateException("Unexpected object of type ["
              + o.getClass() + "] on stack");
        }
    
        if (o != this) {
          throw new IllegalStateException(
              "IfAction different then current one on stack");
        }
        ic.popObject();
    
        if (state.boolResult == null) {
          addError("Failed to determine \"if then else\" result");
          return;
        }
    
        Interpreter interpreter = ic.getJoranInterpreter();
        List<SaxEvent> listToPlay = state.thenSaxEventList;
        if (!state.boolResult) {
          listToPlay = state.elseSaxEventList;
        }
    
        // if boolResult==false & missing else,  listToPlay may be null
        if(listToPlay != null) {
          // insert past this event
          interpreter.getEventPlayer().addEventsDynamically(listToPlay, 1);
        }
    
      }
    
    
      public void setThenSaxEventList(List<SaxEvent> thenSaxEventList) {
        IfState state = stack.firstElement();
        if(state.active) {
          state.thenSaxEventList = thenSaxEventList;
        } else {
          throw new IllegalStateException("setThenSaxEventList() invoked on inactive IfAction");
        }
      }
    
      public void setElseSaxEventList(List<SaxEvent> elseSaxEventList) {
        IfState state = stack.firstElement();
        if(state.active) {
          state.elseSaxEventList = elseSaxEventList;
        } else {
          throw new IllegalStateException("setElseSaxEventList() invoked on inactive IfAction");
        }
    
      }
    
      public boolean isActive() {
        if(stack == null) return false;
        if(stack.isEmpty()) return false;
        return stack.peek().active;
      }
    }
    
    class IfState {
      Boolean boolResult;
      List<SaxEvent> thenSaxEventList;
      List<SaxEvent> elseSaxEventList;
      boolean active;
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/conditional/Condition.java������0000644�0001750�0001750�00000001120�12136042272�032064� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.conditional;
    
    public interface Condition {
      boolean evaluate();
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/conditional/ElseAction.java�����0000644�0001750�0001750�00000001464�12136042272�032177� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.conditional;
    
    import java.util.List;
    
    import ch.qos.logback.core.joran.event.SaxEvent;
    
    public class ElseAction  extends ThenOrElseActionBase {
    
      @Override
      void registerEventList(IfAction ifAction, List<SaxEvent> eventList) {
       ifAction.setElseSaxEventList(eventList);
        
      }
    
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000157�00000000000�011570� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/conditional/PropertyEvalScriptBuilder.java������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/conditional/PropertyEvalScriptBu0000644�0001750�0001750�00000004147�12136042272�033342� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.conditional;
    
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.util.HashMap;
    import java.util.Map;
    
    import ch.qos.logback.core.spi.PropertyContainer;
    import org.codehaus.commons.compiler.CompileException;
    import org.codehaus.janino.ClassBodyEvaluator;
    
    import ch.qos.logback.core.spi.ContextAwareBase;
    
    public class PropertyEvalScriptBuilder extends ContextAwareBase {
    
      private static String SCRIPT_PREFIX = ""
              + "public boolean evaluate() { return ";
      private static String SCRIPT_SUFFIX = "" + "; }";
    
      final PropertyContainer localPropContainer;
    
      PropertyEvalScriptBuilder(PropertyContainer localPropContainer) {
        this.localPropContainer = localPropContainer;
      }
    
      Map<String, String> map = new HashMap<String, String>();
    
      public Condition build(String script) throws IllegalAccessException,
              CompileException,
              InstantiationException,
              SecurityException, NoSuchMethodException, IllegalArgumentException,
              InvocationTargetException {
    
        ClassBodyEvaluator cbe = new ClassBodyEvaluator();
        cbe.setImplementedInterfaces(new Class[]{Condition.class});
        cbe.setExtendedClass(PropertyWrapperForScripts.class);
        cbe.cook(SCRIPT_PREFIX + script + SCRIPT_SUFFIX);
    
        Class<?> clazz = cbe.getClazz();
        Condition instance = (Condition) clazz.newInstance();
        Method setMapMethod = clazz.getMethod("setPropertyContainers", PropertyContainer.class, PropertyContainer.class);
        setMapMethod.invoke(instance, localPropContainer, context);
    
        return instance;
      }
    
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/conditional/ThenAction.java�����0000644�0001750�0001750�00000001456�12136042272�032206� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.conditional;
    
    import java.util.List;
    
    import ch.qos.logback.core.joran.event.SaxEvent;
    
    public class ThenAction  extends ThenOrElseActionBase {
    
      @Override
      void registerEventList(IfAction ifAction, List<SaxEvent> eventList) {
       ifAction.setThenSaxEventList(eventList);
      }
    
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/GenericConfigurator.java��������0000644�0001750�0001750�00000013312�12140150756�031602� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.joran.event.SaxEvent;
    import ch.qos.logback.core.joran.event.SaxEventRecorder;
    import ch.qos.logback.core.joran.spi.*;
    import ch.qos.logback.core.joran.util.ConfigurationWatchListUtil;
    import ch.qos.logback.core.spi.ContextAwareBase;
    import ch.qos.logback.core.status.StatusUtil;
    import org.xml.sax.InputSource;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.URL;
    import java.net.URLConnection;
    import java.util.List;
    
    import static ch.qos.logback.core.CoreConstants.SAFE_JORAN_CONFIGURATION;
    
    public abstract class GenericConfigurator extends ContextAwareBase {
    
      protected Interpreter interpreter;
    
      public final void doConfigure(URL url) throws JoranException {
        InputStream in = null;
        try {
          informContextOfURLUsedForConfiguration(getContext(), url);
          URLConnection urlConnection = url.openConnection();
          // per http://jira.qos.ch/browse/LBCORE-105
          // per http://jira.qos.ch/browse/LBCORE-127
          urlConnection.setUseCaches(false);
    
          in = urlConnection.getInputStream();
          doConfigure(in);
        } catch (IOException ioe) {
          String errMsg = "Could not open URL [" + url + "].";
          addError(errMsg, ioe);
          throw new JoranException(errMsg, ioe);
        } finally {
          if (in != null) {
            try {
              in.close();
            } catch (IOException ioe) {
              String errMsg = "Could not close input stream";
              addError(errMsg, ioe);
              throw new JoranException(errMsg, ioe);
            }
          }
        }
      }
    
      public final void doConfigure(String filename) throws JoranException {
        doConfigure(new File(filename));
      }
    
      public final void doConfigure(File file) throws JoranException {
        FileInputStream fis = null;
        try {
          informContextOfURLUsedForConfiguration(getContext(), file.toURI().toURL());
          fis = new FileInputStream(file);
          doConfigure(fis);
        } catch (IOException ioe) {
          String errMsg = "Could not open [" + file.getPath() + "].";
          addError(errMsg, ioe);
          throw new JoranException(errMsg, ioe);
        } finally {
          if (fis != null) {
            try {
              fis.close();
            } catch (java.io.IOException ioe) {
              String errMsg = "Could not close [" + file.getName() + "].";
              addError(errMsg, ioe);
              throw new JoranException(errMsg, ioe);
            }
          }
        }
      }
    
      public static void informContextOfURLUsedForConfiguration(Context context, URL url) {
        ConfigurationWatchListUtil.setMainWatchURL(context, url);
      }
    
      public final void doConfigure(InputStream inputStream) throws JoranException {
        doConfigure(new InputSource(inputStream));
      }
    
      protected abstract void addInstanceRules(RuleStore rs);
    
      protected abstract void addImplicitRules(Interpreter interpreter);
    
      protected void addDefaultNestedComponentRegistryRules(DefaultNestedComponentRegistry registry) {
    
      }
    
      protected ElementPath initialElementPath() {
        return new ElementPath();
      }
    
      protected void buildInterpreter() {
        RuleStore rs = new SimpleRuleStore(context);
        addInstanceRules(rs);
        this.interpreter = new Interpreter(context, rs, initialElementPath());
        InterpretationContext interpretationContext = interpreter.getInterpretationContext();
        interpretationContext.setContext(context);
        addImplicitRules(interpreter);
        addDefaultNestedComponentRegistryRules(interpretationContext.getDefaultNestedComponentRegistry());
      }
    
      // this is the most inner form of doConfigure whereto other doConfigure
      // methods ultimately delegate
      public final void doConfigure(final InputSource inputSource)
              throws JoranException {
    
        long threshold = System.currentTimeMillis();
        if (!ConfigurationWatchListUtil.wasConfigurationWatchListReset(context)) {
          informContextOfURLUsedForConfiguration(getContext(), null);
        }
        SaxEventRecorder recorder = new SaxEventRecorder(context);
        recorder.recordEvents(inputSource);
        doConfigure(recorder.saxEventList);
        // no exceptions a this level
        StatusUtil statusUtil = new StatusUtil(context);
        if (statusUtil.noXMLParsingErrorsOccurred(threshold)) {
          addInfo("Registering current configuration as safe fallback point");
          registerSafeConfiguration();
        }
      }
    
      public void doConfigure(final List<SaxEvent> eventList)
              throws JoranException {
        buildInterpreter();
        // disallow simultaneous configurations of the same context
        synchronized (context.getConfigurationLock()) {
          interpreter.getEventPlayer().play(eventList);
        }
      }
    
      /**
       * Register the current event list in currently in the interpreter as a safe
       * configuration point.
       *
       * @since 0.9.30
       */
      public void registerSafeConfiguration() {
        context.putObject(SAFE_JORAN_CONFIGURATION, interpreter.getEventPlayer().getCopyOfPlayerEventList());
      }
    
      /**
       * Recall the event list previously registered as a safe point.
       */
      public List<SaxEvent> recallSafeConfiguration() {
        return (List<SaxEvent>) context.getObject(SAFE_JORAN_CONFIGURATION);
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/event/��������������������������0000755�0001750�0001750�00000000000�12203357067�026125� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/event/SaxEventRecorder.java�����0000644�0001750�0001750�00000014250�12140150756�032211� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.event;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.xml.parsers.SAXParser;
    import javax.xml.parsers.SAXParserFactory;
    
    import static ch.qos.logback.core.CoreConstants.XML_PARSING;
    
    import ch.qos.logback.core.joran.spi.ElementPath;
    import ch.qos.logback.core.joran.spi.ElementSelector;
    import org.xml.sax.Attributes;
    import org.xml.sax.InputSource;
    import org.xml.sax.Locator;
    import org.xml.sax.SAXException;
    import org.xml.sax.SAXParseException;
    import org.xml.sax.helpers.DefaultHandler;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.spi.ContextAware;
    import ch.qos.logback.core.spi.ContextAwareImpl;
    import ch.qos.logback.core.status.Status;
    
    public class SaxEventRecorder extends DefaultHandler implements ContextAware {
    
      final ContextAwareImpl cai;
    
      public SaxEventRecorder(Context context) {
        cai = new ContextAwareImpl(context, this);
      }
    
      public List<SaxEvent> saxEventList = new ArrayList<SaxEvent>();
      Locator locator;
      ElementPath globalElementPath = new ElementPath();
    
      final public void recordEvents(InputStream inputStream) throws JoranException {
        recordEvents(new InputSource(inputStream));
      }
    
      public List<SaxEvent> recordEvents(InputSource inputSource)
          throws JoranException {
        SAXParser saxParser = buildSaxParser();
        try {
          saxParser.parse(inputSource, this);
          return saxEventList;
        } catch (IOException ie) {
          handleError("I/O error occurred while parsing xml file", ie);
        } catch(SAXException se) {
          // Exception added into StatusManager via Sax error handling. No need to add it again
          throw new JoranException("Problem parsing XML document. See previously reported errors.", se);
        } catch (Exception ex) {
          handleError("Unexpected exception while parsing XML document.", ex);
        }
        throw new IllegalStateException("This point can never be reached");
      }
    
      private void handleError(String errMsg, Throwable t) throws JoranException {
        addError(errMsg, t);
        throw new JoranException(errMsg, t);
      }
    
      private SAXParser buildSaxParser() throws JoranException {
        try {
          SAXParserFactory spf = SAXParserFactory.newInstance();
          spf.setValidating(false);
          spf.setNamespaceAware(true);
          return spf.newSAXParser();
        } catch (Exception pce) {
          String errMsg = "Parser configuration error occurred";
          addError(errMsg, pce);
          throw new JoranException(errMsg, pce);
        }
      }
    
      public void startDocument() {
      }
    
      public Locator getLocator() {
        return locator;
      }
    
      public void setDocumentLocator(Locator l) {
        locator = l;
      }
    
      public void startElement(String namespaceURI, String localName, String qName,
          Attributes atts) {
    
        String tagName = getTagName(localName, qName);
        globalElementPath.push(tagName);
        ElementPath current = globalElementPath.duplicate();
        saxEventList.add(new StartEvent(current, namespaceURI, localName, qName,
            atts, getLocator()));
      }
    
      public void characters(char[] ch, int start, int length) {
        String bodyStr = new String(ch, start, length);
        SaxEvent lastEvent = getLastEvent();
        if (lastEvent instanceof BodyEvent) {
          BodyEvent be = (BodyEvent) lastEvent;
          be.append(bodyStr);
        } else {
          // ignore space only text if the previous event is not a BodyEvent
          if (!isSpaceOnly(bodyStr)) {
            saxEventList.add(new BodyEvent(bodyStr, getLocator()));
          }
        }
      }
    
      boolean isSpaceOnly(String bodyStr) {
        String bodyTrimmed = bodyStr.trim();
        return (bodyTrimmed.length() == 0);
      }
    
      SaxEvent getLastEvent() {
        if (saxEventList.isEmpty()) {
          return null;
        }
        int size = saxEventList.size();
        return saxEventList.get(size - 1);
      }
    
      public void endElement(String namespaceURI, String localName, String qName) {
        saxEventList
            .add(new EndEvent(namespaceURI, localName, qName, getLocator()));
        globalElementPath.pop();
      }
    
      String getTagName(String localName, String qName) {
        String tagName = localName;
        if ((tagName == null) || (tagName.length() < 1)) {
          tagName = qName;
        }
        return tagName;
      }
    
      public void error(SAXParseException spe) throws SAXException {
        addError(XML_PARSING +" - Parsing error on line " + spe.getLineNumber() + " and column "
            + spe.getColumnNumber(), spe);
      }
    
      public void fatalError(SAXParseException spe) throws SAXException {
        addError(XML_PARSING +" - Parsing fatal error on line " + spe.getLineNumber()
            + " and column " + spe.getColumnNumber(), spe);
      }
    
      public void warning(SAXParseException spe) throws SAXException {
        addWarn(XML_PARSING +" - Parsing warning on line " + spe.getLineNumber() + " and column "
            + spe.getColumnNumber(), spe);
      }
    
      public void addError(String msg) {
        cai.addError(msg);
      }
    
      public void addError(String msg, Throwable ex) {
        cai.addError(msg, ex);
      }
    
      public void addInfo(String msg) {
        cai.addInfo(msg);
      }
    
      public void addInfo(String msg, Throwable ex) {
        cai.addInfo(msg, ex);
      }
    
      public void addStatus(Status status) {
        cai.addStatus(status);
      }
    
      public void addWarn(String msg) {
        cai.addWarn(msg);
      }
    
      public void addWarn(String msg, Throwable ex) {
        cai.addWarn(msg, ex);
      }
    
      public Context getContext() {
        return cai.getContext();
      }
    
      public void setContext(Context context) {
        cai.setContext(context);
      }
    
      public List<SaxEvent> getSaxEventList() {
        return saxEventList;
      }
    
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/event/BodyEvent.java������������0000644�0001750�0001750�00000002231�12136042272�030657� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.event;
    
    import org.xml.sax.Locator;
    
    
    public class BodyEvent extends SaxEvent {
    
      private String text;
    
      BodyEvent(String text, Locator locator) {
        super(null, null, null, locator);
        this.text = text;
      }
    
      /**
       * Always trim trailing spaces from the body text.
       * 
       * @return
       */
      public String getText() {
        if(text != null) {
          return text.trim();
        } 
        return text;
      }
    
      @Override
      public String toString() {
        return "BodyEvent(" + getText() + ")" + locator.getLineNumber() + ","
            + locator.getColumnNumber();
      }
    
      public void append(String str) {
        text += str;
      }
    
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/event/SaxEvent.java�������������0000644�0001750�0001750�00000002424�12136042272�030521� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.event;
    
    import org.xml.sax.Locator;
    import org.xml.sax.helpers.LocatorImpl;
    
    public class SaxEvent {
    
      final public String namespaceURI;
      final public String localName;
      final public String qName;
      final public Locator locator;
    
      SaxEvent(String namespaceURI, String localName, String qName, Locator locator) {
        this.namespaceURI = namespaceURI;
        this.localName = localName;
        this.qName = qName;
        // locator impl is used to take a snapshot!
        this.locator = new LocatorImpl(locator);
      }
    
      public String getLocalName() {
        return localName;
      }
    
      public Locator getLocator() {
        return locator;
      }
    
      public String getNamespaceURI() {
        return namespaceURI;
      }
    
      public String getQName() {
        return qName;
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/event/StartEvent.java�����������0000644�0001750�0001750�00000002556�12140150757�031074� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.event;
    
    import ch.qos.logback.core.joran.spi.ElementPath;
    import org.xml.sax.Attributes;
    import org.xml.sax.Locator;
    import org.xml.sax.helpers.AttributesImpl;
    
    public class StartEvent extends SaxEvent {
    
      final public Attributes attributes;
      final public ElementPath elementPath;
      
      StartEvent(ElementPath elementPath, String namespaceURI, String localName, String qName,
          Attributes attributes, Locator locator) {
        super(namespaceURI, localName, qName, locator);
        // locator impl is used to take a snapshot!
        this.attributes = new AttributesImpl(attributes);
        this.elementPath = elementPath;
      }
    
      public Attributes getAttributes() {
        return attributes;
      }
    
      
      @Override
      public String toString() {
        return "StartEvent("+getQName()+")  ["+locator.getLineNumber()+","+locator.getColumnNumber()+"]";
      }
    
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/event/EndEvent.java�������������0000644�0001750�0001750�00000001615�12136042272�030475� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.event;
    
    import org.xml.sax.Locator;
    
    
    public class EndEvent extends SaxEvent {
    
      EndEvent(String namespaceURI, String localName, String qName, Locator locator) {
        super(namespaceURI, localName, qName, locator);
      }
    
      @Override
      public String toString() {
        return "  EndEvent("+getQName()+")  ["+locator.getLineNumber()+","+locator.getColumnNumber()+"]";
      }
    
    
    }
    �������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/event/InPlayListener.java�������0000644�0001750�0001750�00000001133�12136042272�031662� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.event;
    
    
    public interface InPlayListener {
      void inPlay(SaxEvent event);
    } 
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/JoranConfiguratorBase.java������0000644�0001750�0001750�00000010674�12140150756�032102� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran;
    
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import ch.qos.logback.core.joran.action.ActionConst;
    import ch.qos.logback.core.joran.action.AppenderAction;
    import ch.qos.logback.core.joran.action.AppenderRefAction;
    import ch.qos.logback.core.joran.action.ContextPropertyAction;
    import ch.qos.logback.core.joran.action.ConversionRuleAction;
    import ch.qos.logback.core.joran.action.DefinePropertyAction;
    import ch.qos.logback.core.joran.action.NestedBasicPropertyIA;
    import ch.qos.logback.core.joran.action.NestedComplexPropertyIA;
    import ch.qos.logback.core.joran.action.NewRuleAction;
    import ch.qos.logback.core.joran.action.ParamAction;
    import ch.qos.logback.core.joran.action.PropertyAction;
    import ch.qos.logback.core.joran.action.StatusListenerAction;
    import ch.qos.logback.core.joran.action.TimestampAction;
    import ch.qos.logback.core.joran.spi.ElementSelector;
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    import ch.qos.logback.core.joran.spi.Interpreter;
    import ch.qos.logback.core.joran.spi.RuleStore;
    
    // Based on 310985 revision 310985 as attested by http://tinyurl.com/8njps
    // see also http://tinyurl.com/c2rp5
    
    /**
     * A JoranConfiguratorBase lays most of the groundwork for concrete
     * configurators derived from it. Concrete configurators only need to implement
     * the {@link #addInstanceRules} method.
     * <p>
     * A JoranConfiguratorBase instance should not be used more than once to
     * configure a Context.
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    abstract public class JoranConfiguratorBase extends GenericConfigurator {
    
      public List getErrorList() {
        return null;
      }
    
      @Override
      protected void addInstanceRules(RuleStore rs) {
    
        // is "configuration/variable" referenced in the docs?
        rs.addRule(new ElementSelector("configuration/variable"), new PropertyAction());
        rs.addRule(new ElementSelector("configuration/property"), new PropertyAction());
    
        rs.addRule(new ElementSelector("configuration/substitutionProperty"),
            new PropertyAction());
    
        rs.addRule(new ElementSelector("configuration/timestamp"), new TimestampAction());
    
        rs.addRule(new ElementSelector("configuration/define"), new DefinePropertyAction());
    
        // the contextProperty pattern is deprecated. It is undocumented
        // and will be dropped in future versions of logback
        rs.addRule(new ElementSelector("configuration/contextProperty"),
            new ContextPropertyAction());
    
        rs.addRule(new ElementSelector("configuration/conversionRule"),
            new ConversionRuleAction());
    
        rs.addRule(new ElementSelector("configuration/statusListener"),
            new StatusListenerAction());
    
        rs.addRule(new ElementSelector("configuration/appender"), new AppenderAction());
        rs.addRule(new ElementSelector("configuration/appender/appender-ref"),
            new AppenderRefAction());
        rs.addRule(new ElementSelector("configuration/newRule"), new NewRuleAction());
        rs.addRule(new ElementSelector("*/param"), new ParamAction());
      }
    
      @Override
      protected void addImplicitRules(Interpreter interpreter) {
        // The following line adds the capability to parse nested components
        NestedComplexPropertyIA nestedComplexPropertyIA = new NestedComplexPropertyIA();
        nestedComplexPropertyIA.setContext(context);
        interpreter.addImplicitAction(nestedComplexPropertyIA);
    
        NestedBasicPropertyIA nestedBasicIA = new NestedBasicPropertyIA();
        nestedBasicIA.setContext(context);
        interpreter.addImplicitAction(nestedBasicIA);
      }
    
      @Override
      protected void buildInterpreter() {
        super.buildInterpreter();
        Map<String, Object> omap = interpreter.getInterpretationContext()
            .getObjectMap();
        omap.put(ActionConst.APPENDER_BAG, new HashMap());
        omap.put(ActionConst.FILTER_CHAIN_BAG, new HashMap());
      }
    
      public InterpretationContext getInterpretationContext() {
        return interpreter.getInterpretationContext();
      }
    }
    ��������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/spi/����������������������������0000755�0001750�0001750�00000000000�12203357067�025577� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/spi/RuleStore.java��������������0000644�0001750�0001750�00000003305�12140150757�030364� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.spi;
    
    import java.util.List;
    
    import ch.qos.logback.core.joran.action.Action;
    
    /**
     * 
     * As its name indicates, a RuleStore contains 2-tuples consists of a ElementSelector
     * and an Action.
     * 
     * <p>As a joran configurator goes through the elements in a document, it asks
     * the rule store whether there are rules matching the current pattern by
     * invoking the {@link #matchActions(ElementPath)} method.
     * 
     * @author Ceki G&uuml;lc&uuml;
     * 
     */
    public interface RuleStore {
    
      /**
       * Add a new rule, given by a pattern and a action class (String).
       *
       * @param elementSelector
       * @param actionClassStr
       * @throws ClassNotFoundException
       */
      void addRule(ElementSelector elementSelector, String actionClassStr)
          throws ClassNotFoundException;
    
      /**
       * Add a new rule, given by a pattern and an action instance.
       *
       * @param elementSelector
       * @param action
       */
      void addRule(ElementSelector elementSelector, Action action);
    
      /**
       * Return a list of actions matching a pattern.
       *
       * @param elementPath the path to match for
       * @return list of matching actions
       */
      List<Action> matchActions(ElementPath elementPath);
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/spi/DefaultClass.java�����������0000644�0001750�0001750�00000001463�12136042272�031012� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.spi;
    
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    public @interface DefaultClass {
      Class<?> value();
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/spi/ConsoleTarget.java����������0000644�0001750�0001750�00000004367�12136042272�031217� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.spi;
    
    import java.io.IOException;
    import java.io.OutputStream;
    
    /**
     * The set of console output targets.
    
     * @author Ruediger Dohna
     * @author Ceki G&uuml;lc&uuml;
     * @author Tom SH Liu
     * @author David Roussel
     */
    public enum ConsoleTarget {
    
      SystemOut("System.out", new OutputStream() {
        @Override
        public void write(int b) throws IOException {
          System.out.write(b);
        }
        @Override
        public void write(byte b[]) throws IOException {
          System.out.write(b);
        }
        @Override
        public void write(byte b[], int off, int len) throws IOException {
          System.out.write(b, off, len);
        }
        @Override
        public void flush() throws IOException {
          System.out.flush();
        }
      }),
    
      SystemErr("System.err", new OutputStream() {
        @Override
        public void write(int b) throws IOException {
          System.err.write(b);
        }
        @Override
        public void write(byte b[]) throws IOException {
          System.err.write(b);
        }
        @Override
        public void write(byte b[], int off, int len) throws IOException {
          System.err.write(b, off, len);
        }
        @Override
        public void flush() throws IOException {
          System.err.flush();
        }
      });
    
      public static ConsoleTarget findByName(String name) {
        for (ConsoleTarget target : ConsoleTarget.values()) {
          if (target.name.equalsIgnoreCase(name)) {
            return target;
          }
        }
        return null;
      }
    
      private final String name;
      private final OutputStream stream;
    
      private ConsoleTarget(String name, OutputStream stream) {
        this.name = name;
        this.stream = stream;
      }
    
      public String getName() {
        return name;
      }
    
      public OutputStream getStream() {
        return stream;
      }
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000150�00000000000�011561� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/spi/HostClassAndPropertyDouble.java�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/spi/HostClassAndPropertyDouble.j0000644�0001750�0001750�00000004226�12136042272�033176� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.spi;
    
    /**
     * A 2-tuple (a double) consisting of a Class and a String. The Class references
     * the hosting class of a component and the String represents the property name
     * under which a nested component is referenced the host.
     * 
     * This class is used by {@link DefaultNestedComponentRegistry}.
     * 
     * @author Ceki Gulcu
     * 
     */
    public class HostClassAndPropertyDouble {
    
      final Class<?> hostClass;
      final String propertyName;
    
      public HostClassAndPropertyDouble(Class<?> hostClass, String propertyName) {
        this.hostClass = hostClass;
        this.propertyName = propertyName;
      }
    
      public Class<?> getHostClass() {
        return hostClass;
      }
    
      public String getPropertyName() {
        return propertyName;
      }
    
      @Override
      public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((hostClass == null) ? 0 : hostClass.hashCode());
        result = prime * result
            + ((propertyName == null) ? 0 : propertyName.hashCode());
        return result;
      }
    
      @Override
      public boolean equals(Object obj) {
        if (this == obj)
          return true;
        if (obj == null)
          return false;
        if (getClass() != obj.getClass())
          return false;
        final HostClassAndPropertyDouble other = (HostClassAndPropertyDouble) obj;
        if (hostClass == null) {
          if (other.hostClass != null)
            return false;
        } else if (!hostClass.equals(other.hostClass))
          return false;
        if (propertyName == null) {
          if (other.propertyName != null)
            return false;
        } else if (!propertyName.equals(other.propertyName))
          return false;
        return true;
      }
    
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/spi/ElementSelector.java��������0000644�0001750�0001750�00000010460�12140150757�031532� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.spi;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * ElementSelector extends {@link ElementPath} with matching operations such as {@link #fullPathMatch(ElementPath)},
     * {@link #getPrefixMatchLength(ElementPath)} and {@link #getTailMatchLength(ElementPath)}.
     *
     * <p>Parts of the path may contain '*' for wildcard matching.
     *
     * @author Ceki G&uuml;lc&uuml;
     * @since 1.1.0
     */
    public class ElementSelector extends ElementPath {
    
      public ElementSelector() {
        super();
      }
    
      public ElementSelector(List<String> list) {
        super(list);
      }
    
      /**
       * Build an elementPath from a string.
       *
       * Note that "/x" is considered equivalent to "x" and to "x/"
       *
       */
      public ElementSelector(String p) {
        super(p);
      }
    
      public boolean fullPathMatch(ElementPath path) {
        if (path.size() != size()) {
          return false;
        }
    
        int len = size();
        for (int i = 0; i < len; i++) {
          if (!equalityCheck(get(i), path.get(i))) {
            return false;
          }
        }
        // if everything matches, then the two patterns are equal
        return true;
      }
    
      /**
       * Returns the number of "tail" components that this pattern has in common
       * with the pattern p passed as parameter. By "tail" components we mean the
       * components at the end of the pattern.
       */
      public int getTailMatchLength(ElementPath p) {
        if (p == null) {
          return 0;
        }
    
        int lSize = this.partList.size();
        int rSize = p.partList.size();
    
        // no match possible for empty sets
        if ((lSize == 0) || (rSize == 0)) {
          return 0;
        }
    
        int minLen = (lSize <= rSize) ? lSize : rSize;
        int match = 0;
    
        // loop from the end to the front
        for (int i = 1; i <= minLen; i++) {
          String l = this.partList.get(lSize - i);
          String r = p.partList.get(rSize - i);
    
          if (equalityCheck(l, r)) {
            match++;
          } else {
            break;
          }
        }
        return match;
      }
    
      public boolean isContainedIn(ElementPath p) {
        if(p == null) {
          return false;
        }
        return p.toStableString().contains(toStableString());
      }
    
    
      /**
       * Returns the number of "prefix" components that this pattern has in common
       * with the pattern p passed as parameter. By "prefix" components we mean the
       * components at the beginning of the pattern.
       */
      public int getPrefixMatchLength(ElementPath p) {
        if (p == null) {
          return 0;
        }
    
        int lSize = this.partList.size();
        int rSize = p.partList.size();
    
        // no match possible for empty sets
        if ((lSize == 0) || (rSize == 0)) {
          return 0;
        }
    
        int minLen = (lSize <= rSize) ? lSize : rSize;
        int match = 0;
    
        for (int i = 0; i < minLen; i++) {
          String l = this.partList.get(i);
          String r = p.partList.get(i);
    
          if (equalityCheck(l, r)) {
            match++;
          } else {
            break;
          }
        }
    
        return match;
      }
    
      private boolean equalityCheck(String x, String y) {
        return x.equalsIgnoreCase(y);
      }
    
      @Override
      public boolean equals(Object o) {
        if ((o == null) || !(o instanceof ElementSelector)) {
          return false;
        }
    
        ElementSelector r = (ElementSelector) o;
    
        if (r.size() != size()) {
          return false;
        }
    
        int len = size();
    
        for (int i = 0; i < len; i++) {
          if (!equalityCheck(get(i), r.get(i))) {
            return false;
          }
        }
    
        // if everything matches, then the two patterns are equal
        return true;
      }
    
      @Override
      public int hashCode() {
        int hc = 0;
        int len = size();
    
        for (int i = 0; i < len; i++) {
          // make Pattern comparisons case insensitive
          // http://jira.qos.ch/browse/LBCORE-76
          hc ^= get(i).toLowerCase().hashCode();
        }
        return hc;
      }
    
    
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/spi/ElementPath.java������������0000644�0001750�0001750�00000004762�12140150757�030656� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������package ch.qos.logback.core.joran.spi;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * A element path characterizes a traversal path in an XML document.
     *
     * @author Ceki Gulcu
     * @since 1.1.0
     */
    public class ElementPath {
      // contains String instances
      ArrayList<String> partList = new ArrayList<String>();
    
      public ElementPath() {
      }
    
      public ElementPath(List<String> list) {
        partList.addAll(list);
      }
    
      /**
       * Build an elementPath from a string.
       * <p/>
       * Note that "/x" is considered equivalent to "x" and to "x/"
       */
      public ElementPath(String pathStr) {
        if (pathStr == null) {
          return;
        }
    
        String[] partArray = pathStr.split("/");
        if(partArray == null) return;
    
        for(String part: partArray) {
          if(part.length() >0) {
            partList.add(part);
          }
        }
      }
    
      public ElementPath duplicate() {
        ElementPath p = new ElementPath();
        p.partList.addAll(this.partList);
        return p;
      }
    
      // Joran error skipping relies on the equals method
      @Override
      public boolean equals(Object o) {
        if ((o == null) || !(o instanceof ElementPath)) {
          return false;
        }
    
        ElementPath r = (ElementPath) o;
    
        if (r.size() != size()) {
          return false;
        }
    
        int len = size();
    
        for (int i = 0; i < len; i++) {
          if (!equalityCheck(get(i), r.get(i))) {
            return false;
          }
        }
    
        // if everything matches, then the two patterns are equal
        return true;
      }
    
      private boolean equalityCheck(String x, String y) {
        return x.equalsIgnoreCase(y);
      }
    
      public List<String> getCopyOfPartList() {
        return new ArrayList<String>(partList);
      }
    
      public void push(String s) {
        partList.add(s);
      }
    
      public String get(int i) {
        return (String) partList.get(i);
      }
    
      public void pop() {
        if (!partList.isEmpty()) {
          partList.remove(partList.size() - 1);
        }
      }
    
      public String peekLast() {
        if (!partList.isEmpty()) {
          int size = partList.size();
          return (String) partList.get(size - 1);
        } else {
          return null;
        }
      }
    
      public int size() {
        return partList.size();
      }
    
    
      protected String toStableString() {
        StringBuilder result = new StringBuilder();
        for (String current : partList) {
          result.append("[").append(current).append("]");
        }
        return result.toString();
      }
    
      @Override
      public String toString() {
        return toStableString();
      }
    }
    ��������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/spi/InterpretationContext.java��0000644�0001750�0001750�00000011645�12143152502�033013� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.spi;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.Properties;
    import java.util.Stack;
    
    import org.xml.sax.Locator;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.joran.action.Action;
    import ch.qos.logback.core.joran.event.InPlayListener;
    import ch.qos.logback.core.joran.event.SaxEvent;
    import ch.qos.logback.core.spi.ContextAwareBase;
    import ch.qos.logback.core.spi.PropertyContainer;
    import ch.qos.logback.core.util.OptionHelper;
    
    /**
     * 
     * An InterpretationContext contains the contextual state of a Joran parsing
     * session. {@link Action} objects depend on this context to exchange and store
     * information.
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public class InterpretationContext extends ContextAwareBase implements
        PropertyContainer {
      Stack<Object> objectStack;
      Map<String, Object> objectMap;
      Map<String, String> propertiesMap;
    
      Interpreter joranInterpreter;
      final List<InPlayListener> listenerList = new ArrayList<InPlayListener>();
      DefaultNestedComponentRegistry defaultNestedComponentRegistry = new DefaultNestedComponentRegistry();
    
      public InterpretationContext(Context context, Interpreter joranInterpreter) {
        this.context = context;
        this.joranInterpreter = joranInterpreter;
        objectStack = new Stack<Object>();
        objectMap = new HashMap<String, Object>(5);
        propertiesMap = new HashMap<String, String>(5);
      }
    
      
      public DefaultNestedComponentRegistry getDefaultNestedComponentRegistry() {
        return defaultNestedComponentRegistry;
      }
      
      public Map<String, String> getCopyOfPropertyMap() {
        return new HashMap<String, String>(propertiesMap);
      }
      
      void setPropertiesMap(Map<String, String> propertiesMap) {
        this.propertiesMap = propertiesMap;
      }
    
      String updateLocationInfo(String msg) {
        Locator locator = joranInterpreter.getLocator();
    
        if (locator != null) {
          return msg + locator.getLineNumber() + ":" + locator.getColumnNumber();
        } else {
          return msg;
        }
      }
    
      public Locator getLocator() {
        return joranInterpreter.getLocator();
      }
    
      public Interpreter getJoranInterpreter() {
        return joranInterpreter;
      }
    
      public Stack<Object> getObjectStack() {
        return objectStack;
      }
    
      public boolean isEmpty() {
        return objectStack.isEmpty();
      }
    
      public Object peekObject() {
        return objectStack.peek();
      }
    
      public void pushObject(Object o) {
        objectStack.push(o);
      }
    
      public Object popObject() {
        return objectStack.pop();
      }
    
      public Object getObject(int i) {
        return objectStack.get(i);
      }
    
      public Map<String, Object> getObjectMap() {
        return objectMap;
      }
    
      /**
       * Add a property to the properties of this execution context. If the property
       * exists already, it is overwritten.
       */
      public void addSubstitutionProperty(String key, String value) {
        if (key == null || value == null) {
          return;
        }
        // values with leading or trailing spaces are bad. We remove them now.
        value = value.trim();
        propertiesMap.put(key, value);
      }
    
      public void addSubstitutionProperties(Properties props) {
        if (props == null) {
          return;
        }
        for(Object keyObject: props.keySet()) {
          String key = (String) keyObject;
          String val = props.getProperty(key);
          addSubstitutionProperty(key, val);
        }
      }
    
      /**
       * If a key is found in propertiesMap then return it. Otherwise, delegate to
       * the context.
       */
      public String getProperty(String key) {
        String v = propertiesMap.get(key);
        if (v != null) {
          return v;
        } else {
          return context.getProperty(key);
        }
      }
    
      public String subst(String value) {
        if (value == null) {
          return null;
        }
        return OptionHelper.substVars(value, this, context);
      }
    
    
      
    
      public boolean isListenerListEmpty() {
        return listenerList.isEmpty();
      }
      
      public void addInPlayListener(InPlayListener ipl) {
        if (listenerList.contains(ipl)) {
          addWarn("InPlayListener " + ipl + " has been already registered");
        } else {
          listenerList.add(ipl);
        }
      }
    
      public boolean removeInPlayListener(InPlayListener ipl) {
        return listenerList.remove(ipl);
      }
    
      void fireInPlay(SaxEvent event) {
        for (InPlayListener ipl : listenerList) {
          ipl.inPlay(event);
        }
      }
    }
    �������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/spi/ConfigurationWatchList.java�0000644�0001750�0001750�00000004672�12136042272�033077� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.spi;
    
    
    import ch.qos.logback.core.spi.ContextAwareBase;
    
    import java.io.File;
    import java.net.URL;
    import java.net.URLDecoder;
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * @author Ceki G&uuml;c&uuml;
     */
    public class ConfigurationWatchList extends ContextAwareBase {
    
      URL mainURL;
      List<File> fileWatchList = new ArrayList<File>();
      List<Long> lastModifiedList = new ArrayList<Long>();
    
      public void clear() {
        this.mainURL = null;
        lastModifiedList.clear();
        fileWatchList.clear();
      }
    
      /**
       * The mainURL for the configuration file. Null values are allowed.
       * @param mainURL
       */
      public void setMainURL(URL mainURL) {
        // main url can be null
        this.mainURL = mainURL;
        if (mainURL != null)
          addAsFileToWatch(mainURL);
      }
    
      private void addAsFileToWatch(URL url) {
        File file = convertToFile(url);
        if (file != null) {
          fileWatchList.add(file);
          lastModifiedList.add(file.lastModified());
        }
      }
    
      public void addToWatchList(URL url) {
        addAsFileToWatch(url);
      }
    
      public URL getMainURL() {
        return mainURL;
      }
    
      public List<File> getCopyOfFileWatchList() {
        return new ArrayList<File>(fileWatchList);
      }
    
      public boolean changeDetected() {
        int len = fileWatchList.size();
        for (int i = 0; i < len; i++) {
          long lastModified = lastModifiedList.get(i);
          File file = fileWatchList.get(i);
          if (lastModified != file.lastModified()) {
            return true;
          }
        }
        return false;
        //return (lastModified != fileToScan.lastModified() && lastModified != SENTINEL);
      }
    
      @SuppressWarnings("deprecation")
      File convertToFile(URL url) {
        String protocol = url.getProtocol();
        if ("file".equals(protocol)) {
          return new File(URLDecoder.decode(url.getFile()));
        } else {
          addInfo("URL [" + url + "] is not of type file");
          return null;
        }
      }
    
    }
    ����������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/spi/NoAutoStartUtil.java��������0000644�0001750�0001750�00000002046�12136042272�031517� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.spi;
    
    public class NoAutoStartUtil {
    
      /**
       * Returns true if the class of the object 'o' passed as parameter is *not*
       * marked with the NoAutoStart annotation. Return true otherwise.
       * 
       * @param o
       * @return true for classes not marked with the NoAutoStart annotation
       */
      static public boolean notMarkedWithNoAutoStart(Object o) {
        if (o == null) {
          return false;
        }
        Class<?> clazz = o.getClass();
        NoAutoStart a = clazz.getAnnotation(NoAutoStart.class);
        return a == null;
      }
    
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/spi/SimpleRuleStore.java��������0000644�0001750�0001750�00000014131�12140150757�031535� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.spi;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.joran.action.Action;
    import ch.qos.logback.core.spi.ContextAwareBase;
    import ch.qos.logback.core.util.OptionHelper;
    
    /**
     * This class implements the {@link RuleStore} interface. It is the rule store
     * implementation used by default in Joran.
     * 
     * @author Ceki G&uuml;lc&uuml;
     * 
     */
    public class SimpleRuleStore extends ContextAwareBase implements RuleStore {
    
      static String KLEENE_STAR = "*";
      
      // key: Pattern instance, value: ArrayList containing actions
      HashMap<ElementSelector, List<Action>> rules = new HashMap<ElementSelector, List<Action>>();
    
      // public SimpleRuleStore() {
      // }
    
      public SimpleRuleStore(Context context) {
        setContext(context);
      }
    
      /**
       * Add a new rule, i.e. a pattern, action pair to the rule store. <p> Note
       * that the added action's LoggerRepository will be set in the process.
       */
      public void addRule(ElementSelector elementSelector, Action action) {
        action.setContext(context);
    
        List<Action> a4p = rules.get(elementSelector);
    
        if (a4p == null) {
          a4p = new ArrayList<Action>();
          rules.put(elementSelector, a4p);
        }
    
        a4p.add(action);
      }
    
      public void addRule(ElementSelector elementSelector, String actionClassName) {
        Action action = null;
    
        try {
          action = (Action) OptionHelper.instantiateByClassName(actionClassName,
              Action.class, context);
        } catch (Exception e) {
          addError("Could not instantiate class [" + actionClassName + "]", e);
        }
        if (action != null) {
          addRule(elementSelector, action);
        }
      }
    
      // exact match has highest priority
      // if no exact match, check for tail match, i.e matches of type */x/y
      // tail match for */x/y has higher priority than match for */x
      // if no tail match, check for prefix match, i.e. matches for x/*
      // match for x/y/* has higher priority than matches for x/*
    
      public List<Action> matchActions(ElementPath elementPath) {
        List<Action> actionList;
    
        if ((actionList = fullPathMatch(elementPath)) != null) {
          return actionList;
        } else if ((actionList = suffixMatch(elementPath)) != null) {
          return actionList;
        } else if ((actionList = prefixMatch(elementPath)) != null) {
          return actionList;
        } else if ((actionList = middleMatch(elementPath)) != null) {
          return actionList;
        } else {
          return null;
        }
      }
    
      List<Action> fullPathMatch(ElementPath elementPath) {
        for (ElementSelector selector : rules.keySet()) {
           if(selector.fullPathMatch(elementPath))
             return rules.get(selector);
        }
        return null;
      }
    
      // Suffix matches are matches of type */x/y
      List<Action> suffixMatch(ElementPath elementPath) {
        int max = 0;
        ElementSelector longestMatchingElementSelector = null;
    
        for (ElementSelector selector : rules.keySet()) {
          if (isSuffixPattern(selector)) {
            int r = selector.getTailMatchLength(elementPath);
            if (r > max) {
              max = r;
              longestMatchingElementSelector = selector;
            }
          }
        }
    
        if (longestMatchingElementSelector != null) {
          return rules.get(longestMatchingElementSelector);
        } else {
          return null;
        }
      }
    
      private boolean isSuffixPattern(ElementSelector p) {
        return (p.size() > 1) && p.get(0).equals(KLEENE_STAR);
      }
    
      List<Action> prefixMatch(ElementPath elementPath) {
        int max = 0;
        ElementSelector longestMatchingElementSelector = null;
    
        for (ElementSelector selector : rules.keySet()) {
          String last = selector.peekLast();
          if (isKleeneStar(last)) {
            int r = selector.getPrefixMatchLength(elementPath);
            // to qualify the match length must equal p's size omitting the '*'
            if ((r == selector.size() - 1) && (r > max)) {
              max = r;
              longestMatchingElementSelector = selector;
            }
          }
        }
    
        if (longestMatchingElementSelector != null) {
          return rules.get(longestMatchingElementSelector);
        } else {
          return null;
        }
      }
    
      private boolean isKleeneStar(String last) {
        return KLEENE_STAR.equals(last);
      }
    
      List<Action> middleMatch(ElementPath path) {
        
        int max = 0;
        ElementSelector longestMatchingElementSelector = null;
    
        for (ElementSelector selector : rules.keySet()) {
          String last = selector.peekLast();
          String first = null;
          if(selector.size() > 1) {
            first = selector.get(0);
          }
          if (isKleeneStar(last) && isKleeneStar(first)) {
            List<String> copyOfPartList = selector.getCopyOfPartList();
            if(copyOfPartList.size() > 2) {
              copyOfPartList.remove(0);
              copyOfPartList.remove(copyOfPartList.size()-1);
            }
            
            int r = 0;
            ElementSelector clone = new ElementSelector(copyOfPartList);
            if(clone.isContainedIn(path)) {
              r = clone.size();
            }
            if (r > max) {
              max = r;
              longestMatchingElementSelector = selector;
            }
          }
        }
    
        if (longestMatchingElementSelector != null) {
          return rules.get(longestMatchingElementSelector);
        } else {
          return null;
        }
      }
      
    
      public String toString() {
        final String TAB = "  ";
    
        StringBuilder retValue = new StringBuilder();
    
        retValue.append("SimpleRuleStore ( ").append("rules = ").append(this.rules)
            .append(TAB).append(" )");
    
        return retValue.toString();
      }
    
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/spi/ActionException.java��������0000644�0001750�0001750�00000001765�12136042272�031541� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.spi;
    
    
    /**
     * By throwing an exception an action can signal the Interpreter to skip
     * processing of all the nested (child) elements of the element associated with
     * the action causing the exception.
     *
     * @author Ceki Gulcu
     */
    public class ActionException extends Exception {
    
      
      private static final long serialVersionUID = 2743349809995319806L;
    
      public ActionException() {
      }
    
      public ActionException(final Throwable rootCause) {
        super(rootCause);
      }
    
    }
    �����������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/spi/EventPlayer.java������������0000644�0001750�0001750�00000004335�12136042272�030677� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.spi;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import ch.qos.logback.core.joran.event.BodyEvent;
    import ch.qos.logback.core.joran.event.EndEvent;
    import ch.qos.logback.core.joran.event.SaxEvent;
    import ch.qos.logback.core.joran.event.StartEvent;
    
    public class EventPlayer {
    
      final Interpreter interpreter;
      List<SaxEvent> eventList;
      int currentIndex;
    
      public EventPlayer(Interpreter interpreter) {
        this.interpreter = interpreter; 
      }
    
      /**
       * Return a copy of the current event list in the player.
       * @return
       * @since 0.9.20
       */
      public List<SaxEvent> getCopyOfPlayerEventList() {
        return new ArrayList<SaxEvent>(eventList);
      }
    
      public void play(List<SaxEvent> aSaxEventList) {
        eventList = aSaxEventList;
        SaxEvent se;
        for(currentIndex = 0; currentIndex < eventList.size(); currentIndex++) {
          se = eventList.get(currentIndex);
          
          if(se instanceof StartEvent) {
            interpreter.startElement((StartEvent) se);
            // invoke fireInPlay after startElement processing
            interpreter.getInterpretationContext().fireInPlay(se);
          }
          if(se instanceof BodyEvent) {
            // invoke fireInPlay before  characters processing
            interpreter.getInterpretationContext().fireInPlay(se);
            interpreter.characters((BodyEvent) se);
          }
          if(se instanceof EndEvent) {
            // invoke fireInPlay before endElement processing
            interpreter.getInterpretationContext().fireInPlay(se);
            interpreter.endElement((EndEvent) se);
          }
        
        }
      }
      
      public void addEventsDynamically(List<SaxEvent> eventList, int offset) {
        this.eventList.addAll(currentIndex+offset, eventList);
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/spi/NoAutoStart.java������������0000644�0001750�0001750�00000001713�12136042272�030661� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.spi;
    
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    /**
     * If a type (a class) has this annotation, then it will not be automatically
     * started by Joran at configuration time.
     * 
     * @author Ceki G&uuml;lc&uuml;
     * 
     */
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.TYPE)
    public @interface NoAutoStart {
    }
    �����������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/spi/JoranException.java���������0000644�0001750�0001750�00000001444�12136042272�031367� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.spi;
    
    public class JoranException extends Exception {
    
      private static final long serialVersionUID = 1112493363728774021L;
    
      public JoranException(String msg) {
        super(msg);
      }
      
      public JoranException(String msg, Throwable cause) {
        super(msg, cause);
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/spi/XMLUtil.java����������������0000644�0001750�0001750�00000001474�12136042272�027740� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.spi;
    
    import java.net.URL;
    
    import ch.qos.logback.core.status.StatusManager;
    
    public class XMLUtil {
      
    
      static public final int ILL_FORMED = 1;
      static public final int UNRECOVERABLE_ERROR = 2;
      
      static public int checkIfWellFormed(URL url, StatusManager sm) {
        return 0;
      }
      
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/spi/Interpreter.java������������0000644�0001750�0001750�00000026227�12140150757�030753� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.spi;
    
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    import java.util.Stack;
    import java.util.Vector;
    
    import org.xml.sax.Attributes;
    import org.xml.sax.Locator;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.joran.action.Action;
    import ch.qos.logback.core.joran.action.ImplicitAction;
    import ch.qos.logback.core.joran.event.BodyEvent;
    import ch.qos.logback.core.joran.event.EndEvent;
    import ch.qos.logback.core.joran.event.StartEvent;
    import ch.qos.logback.core.spi.ContextAwareImpl;
    
    /**
     * <id>Interpreter</id> is Joran's main driving class. It extends SAX
     * {@link org.xml.sax.helpers.DefaultHandler DefaultHandler} which invokes
     * various {@link Action actions} according to predefined patterns.
     * 
     * <p>
     * Patterns are kept in a {@link RuleStore} which is programmed to store and
     * then later produce the applicable actions for a given pattern.
     * 
     * <p>
     * The pattern corresponding to a top level &lt;a&gt; element is the string
     * <id>"a"</id>.
     * 
     * <p>
     * The pattern corresponding to an element &lt;b&gt; embedded within a top level
     * &lt;a&gt; element is the string <id>"a/b"</id>.
     * 
     * <p>
     * The pattern corresponding to an &lt;b&gt; and any level of nesting is
     * "&#42;/b. Thus, the &#42; character placed at the beginning of a pattern
     * serves as a wildcard for the level of nesting.
     * 
     * Conceptually, this is very similar to the API of commons-digester. Joran
     * offers several small advantages. First and foremost, it offers support for
     * implicit actions which result in a significant leap in flexibility. Second,
     * in our opinion better error reporting capability. Third, it is self-reliant.
     * It does not depend on other APIs, in particular commons-logging which is too
     * unreliable. Last but not least, Joran is quite tiny and is expected to remain
     * so.
     * 
     * @author Ceki G&uuml;lcu&uuml;
     * 
     */
    public class Interpreter {
      private static List<Action> EMPTY_LIST = new Vector<Action>(0);
    
      final private RuleStore ruleStore;
      final private InterpretationContext interpretationContext;
      final private ArrayList<ImplicitAction> implicitActions;
      final private CAI_WithLocatorSupport cai;
      private ElementPath elementPath;
      Locator locator;
      EventPlayer eventPlayer;
    
      /**
       * The <id>actionListStack</id> contains a list of actions that are executing
       * for the given XML element.
       * 
       * A list of actions is pushed by the {link #startElement} and popped by
       * {@link #endElement}.
       * 
       */
      Stack<List<Action>> actionListStack;
    
      /**
       * If the skip nested is set, then we skip all its nested elements until it is
       * set back to null at when the element's end is reached.
       */
      ElementPath skip = null;
    
      public Interpreter(Context context, RuleStore rs, ElementPath initialElementPath) {
        this.cai = new CAI_WithLocatorSupport(context, this);
        ruleStore = rs;
        interpretationContext = new InterpretationContext(context, this);
        implicitActions = new ArrayList<ImplicitAction>(3);
        this.elementPath = initialElementPath;
        actionListStack = new Stack<List<Action>>();
        eventPlayer = new EventPlayer(this);
      }
    
      public EventPlayer getEventPlayer() {
        return eventPlayer;
      }
    
      public void setInterpretationContextPropertiesMap(
          Map<String, String> propertiesMap) {
        interpretationContext.setPropertiesMap(propertiesMap);
      }
    
      /**
       * @deprecated replaced by {@link #getInterpretationContext()}
       */
      public InterpretationContext getExecutionContext() {
        return getInterpretationContext();
      }
    
      public InterpretationContext getInterpretationContext() {
        return interpretationContext;
      }
    
      public void startDocument() {
      }
    
      public void startElement(StartEvent se) {
        setDocumentLocator(se.getLocator());
        startElement(se.namespaceURI, se.localName, se.qName, se.attributes);
      }
    
      private void startElement(String namespaceURI, String localName,
          String qName, Attributes atts) {
    
        String tagName = getTagName(localName, qName);
        elementPath.push(tagName);
    
        if (skip != null) {
          // every startElement pushes an action list
          pushEmptyActionList();
          return;
        }
    
        List<Action> applicableActionList = getApplicableActionList(elementPath, atts);
        if (applicableActionList != null) {
          actionListStack.add(applicableActionList);
          callBeginAction(applicableActionList, tagName, atts);
        } else {
          // every startElement pushes an action list
          pushEmptyActionList();
          String errMsg = "no applicable action for [" + tagName
              + "], current ElementPath  is [" + elementPath + "]";
          cai.addError(errMsg);
        }
      }
    
      /**
       * This method is used to
       */
      private void pushEmptyActionList() {
        actionListStack.add(EMPTY_LIST);
      }
    
      public void characters(BodyEvent be) {
    
        setDocumentLocator(be.locator);
    
        String body = be.getText();
        List<Action> applicableActionList = actionListStack.peek();
    
        if (body != null) {
          body = body.trim();
          if (body.length() > 0) {
            // System.out.println("calling body method with ["+body+ "]");
            callBodyAction(applicableActionList, body);
          }
        }
      }
    
      public void endElement(EndEvent endEvent) {
        setDocumentLocator(endEvent.locator);
        endElement(endEvent.namespaceURI, endEvent.localName, endEvent.qName);
      }
    
      private void endElement(String namespaceURI, String localName, String qName) {
        // given that an action list is always pushed for every startElement, we
        // need
        // to always pop for every endElement
        List<Action> applicableActionList = (List<Action>) actionListStack.pop();
    
        if (skip != null) {
          if (skip.equals(elementPath)) {
            skip = null;
          }
        } else if (applicableActionList != EMPTY_LIST) {
          callEndAction(applicableActionList, getTagName(localName, qName));
        }
    
        // given that we always push, we must also pop the pattern
        elementPath.pop();
      }
    
      public Locator getLocator() {
        return locator;
      }
    
      public void setDocumentLocator(Locator l) {
        locator = l;
      }
    
      String getTagName(String localName, String qName) {
        String tagName = localName;
    
        if ((tagName == null) || (tagName.length() < 1)) {
          tagName = qName;
        }
    
        return tagName;
      }
    
      public void addImplicitAction(ImplicitAction ia) {
        implicitActions.add(ia);
      }
    
      /**
       * Check if any implicit actions are applicable. As soon as an applicable
       * action is found, it is returned. Thus, the returned list will have at most
       * one element.
       */
      List<Action> lookupImplicitAction(ElementPath elementPath, Attributes attributes,
          InterpretationContext ec) {
        int len = implicitActions.size();
    
        for (int i = 0; i < len; i++) {
          ImplicitAction ia = (ImplicitAction) implicitActions.get(i);
    
          if (ia.isApplicable(elementPath, attributes, ec)) {
            List<Action> actionList = new ArrayList<Action>(1);
            actionList.add(ia);
    
            return actionList;
          }
        }
    
        return null;
      }
    
      /**
       * Return the list of applicable patterns for this
       */
      List<Action> getApplicableActionList(ElementPath elementPath, Attributes attributes) {
        List<Action> applicableActionList = ruleStore.matchActions(elementPath);
    
        // logger.debug("set of applicable patterns: " + applicableActionList);
        if (applicableActionList == null) {
          applicableActionList = lookupImplicitAction(elementPath, attributes,
              interpretationContext);
        }
    
        return applicableActionList;
      }
    
      void callBeginAction(List<Action> applicableActionList, String tagName,
          Attributes atts) {
        if (applicableActionList == null) {
          return;
        }
    
        Iterator<Action> i = applicableActionList.iterator();
        while (i.hasNext()) {
          Action action = (Action) i.next();
          // now let us invoke the action. We catch and report any eventual
          // exceptions
          try {
            action.begin(interpretationContext, tagName, atts);
          } catch (ActionException e) {
            skip = elementPath.duplicate();
            cai.addError("ActionException in Action for tag [" + tagName + "]", e);
          } catch (RuntimeException e) {
            skip = elementPath.duplicate();
            cai.addError("RuntimeException in Action for tag [" + tagName + "]", e);
          }
        }
      }
    
      private void callBodyAction(List<Action> applicableActionList, String body) {
        if (applicableActionList == null) {
          return;
        }
        Iterator<Action> i = applicableActionList.iterator();
    
        while (i.hasNext()) {
          Action action = i.next();
          try {
            action.body(interpretationContext, body);
          } catch (ActionException ae) {
            cai
                .addError("Exception in end() methd for action [" + action + "]",
                    ae);
          }
        }
      }
    
      private void callEndAction(List<Action> applicableActionList, String tagName) {
        if (applicableActionList == null) {
          return;
        }
    
        // logger.debug("About to call end actions on node: [" + localName + "]");
        Iterator<Action> i = applicableActionList.iterator();
    
        while (i.hasNext()) {
          Action action = i.next();
          // now let us invoke the end method of the action. We catch and report
          // any eventual exceptions
          try {
            action.end(interpretationContext, tagName);
          } catch (ActionException ae) {
            // at this point endAction, there is no point in skipping children as
            // they have been already processed
            cai.addError("ActionException in Action for tag [" + tagName + "]", ae);
          } catch (RuntimeException e) {
            // no point in setting skip
            cai.addError("RuntimeException in Action for tag [" + tagName + "]", e);
          }
        }
      }
    
      public RuleStore getRuleStore() {
        return ruleStore;
      }
    }
    
    /**
     * When {@link Interpreter} class is used as the origin of an
     * {@link ContextAwareImpl} instance, then XML locator information is lost. This
     * class preserves locator information (as a string).
     * 
     * @author ceki
     */
    class CAI_WithLocatorSupport extends ContextAwareImpl {
    
      CAI_WithLocatorSupport(Context context, Interpreter interpreter) {
        super(context, interpreter);
      }
    
      @Override
      protected Object getOrigin() {
        Interpreter i = (Interpreter) super.getOrigin();
        Locator locator = i.locator;
        if (locator != null) {
          return Interpreter.class.getName() + "@" + locator.getLineNumber() + ":"
              + locator.getColumnNumber();
        } else {
          return Interpreter.class.getName() + "@NA:NA";
        }
      }
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000154�00000000000�011565� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/spi/DefaultNestedComponentRegistry.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/joran/spi/DefaultNestedComponentRegist0000644�0001750�0001750�00000003373�12136042272�033312� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.spi;
    
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * A registry which maps a property in a host class to a default class.
     * 
     * @author Cek G&uuml;lc&uuml;
     * 
     */
    public class DefaultNestedComponentRegistry {
    
      Map<HostClassAndPropertyDouble, Class<?>> defaultComponentMap = new HashMap<HostClassAndPropertyDouble, Class<?>>();
    
      public void add(Class<?> hostClass, String propertyName, Class<?> componentClass) {
        HostClassAndPropertyDouble hpDouble = new HostClassAndPropertyDouble(
            hostClass, propertyName.toLowerCase());
        defaultComponentMap.put(hpDouble, componentClass);
      }
    
      public Class<?> findDefaultComponentType(Class<?> hostClass, String propertyName) {
        propertyName = propertyName.toLowerCase();
        while (hostClass != null) {
          Class<?> componentClass = oneShotFind(hostClass, propertyName);
          if (componentClass != null) {
            return componentClass;
          }
          hostClass = hostClass.getSuperclass();
        }
        return null;
      }
    
      private Class<?> oneShotFind(Class<?> hostClass, String propertyName) {
        HostClassAndPropertyDouble hpDouble = new HostClassAndPropertyDouble(
            hostClass, propertyName);
        return defaultComponentMap.get(hpDouble);
      }
    
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/property/�����������������������������0000755�0001750�0001750�00000000000�12203357067�025557� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000152�00000000000�011563� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/property/ResourceExistsPropertyDefiner.java�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/property/ResourceExistsPropertyDefiner0000644�0001750�0001750�00000002673�12136562141�033537� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������package ch.qos.logback.core.property;
    
    import ch.qos.logback.core.PropertyDefinerBase;
    import ch.qos.logback.core.util.Loader;
    import ch.qos.logback.core.util.OptionHelper;
    
    import java.net.URL;
    
    /**
     * In conjunction with {@link ch.qos.logback.core.joran.action.PropertyAction} sets
     * the named variable to "true" if the {@link #setResource(String) resource} specified
     * by the user is available on the class path, "false" otherwise.
     *
     * @see #getPropertyValue()
     *
     * @author XuHuisheng
     * @author Ceki Gulcu
     * @since 1.1.0
     */
    public class ResourceExistsPropertyDefiner extends PropertyDefinerBase {
    
      String resourceStr;
    
      public String getResource() {
        return resourceStr;
      }
    
      /**
       * The resource to search for on the class path.
       *
       * @param resource
       */
      public void setResource(String resource) {
        this.resourceStr = resource;
      }
    
      /**
       * Returns the string "true" if the {@link #setResource(String) resource} specified by the
       * user is available on the class path, "false" otherwise.
       *
       * @return "true"|"false" depending on the availability of resource on the classpath
       */
      public String getPropertyValue() {
        if (OptionHelper.isEmpty(resourceStr)) {
          addError("The \"resource\" property must be set.");
          return null;
        }
    
        URL resourceURL = Loader.getResourceBySelfClassLoader(resourceStr);
        return booleanAsStr(resourceURL != null);
      }
    
    }
    ���������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000146�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/property/FileExistsPropertyDefiner.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/property/FileExistsPropertyDefiner.jav0000644�0001750�0001750�00000003232�12136562225�033401� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.property;
    
    import ch.qos.logback.core.PropertyDefinerBase;
    import ch.qos.logback.core.util.OptionHelper;
    
    import java.io.File;
    
    /**
     * In conjunction with {@link ch.qos.logback.core.joran.action.PropertyAction} sets
     * the named variable to "true" if the file specified by {@link #setPath(String) path}
     * property exists, to "false" otherwise.
     *
     * @see #getPropertyValue()
     *
     * @author Ceki G&uuml;c&uuml;
     */
    public class FileExistsPropertyDefiner extends PropertyDefinerBase {
    
      String path;
    
      public String getPath() {
        return path;
      }
    
      /**
       * The path for the file to search for.
       *
       * @param path
       */
      public void setPath(String path) {
        this.path = path;
      }
    
      /**
       * Returns "true" if the file specified by {@link #setPath(String) path} property exists.
       * Returns "false" otherwise.
       *
       * @return "true"|"false" depending on the existence of file
       */
      public String getPropertyValue() {
        if (OptionHelper.isEmpty(path)) {
          addError("The \"path\" property must be set.");
          return null;
        }
    
        File file = new File(path);
        return booleanAsStr(file.exists());
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/AppenderBase.java���������������������0000644�0001750�0001750�00000006444�12136042271�027070� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core;
    
    import java.util.List;
    
    import ch.qos.logback.core.filter.Filter;
    import ch.qos.logback.core.spi.ContextAwareBase;
    import ch.qos.logback.core.spi.FilterAttachableImpl;
    import ch.qos.logback.core.spi.FilterReply;
    import ch.qos.logback.core.status.WarnStatus;
    
    /**
     * Sets a skeleton implementation for appenders.
     * 
     * <p> For more information about this appender, please refer to the online
     * manual at http://logback.qos.ch/manual/appenders.html#AppenderBase
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    abstract public class AppenderBase<E> extends ContextAwareBase implements
        Appender<E> {
    
      protected boolean started = false;
    
      /**
       * The guard prevents an appender from repeatedly calling its own doAppend
       * method.
       */
      private boolean guard = false;
    
      /**
       * Appenders are named.
       */
      protected String name;
    
      private FilterAttachableImpl<E> fai = new FilterAttachableImpl<E>();
    
      public String getName() {
        return name;
      }
    
      private int statusRepeatCount = 0;
      private int exceptionCount = 0;
    
      static final int ALLOWED_REPEATS = 5;
    
      public synchronized void doAppend(E eventObject) {
        // WARNING: The guard check MUST be the first statement in the
        // doAppend() method.
    
        // prevent re-entry.
        if (guard) {
          return;
        }
    
        try {
          guard = true;
    
          if (!this.started) {
            if (statusRepeatCount++ < ALLOWED_REPEATS) {
              addStatus(new WarnStatus(
                  "Attempted to append to non started appender [" + name + "].",
                  this));
            }
            return;
          }
    
          if (getFilterChainDecision(eventObject) == FilterReply.DENY) {
            return;
          }
    
          // ok, we now invoke derived class' implementation of append
          this.append(eventObject);
    
        } catch (Exception e) {
          if (exceptionCount++ < ALLOWED_REPEATS) {
            addError("Appender [" + name + "] failed to append.", e);
          }
        } finally {
          guard = false;
        }
      }
    
      abstract protected void append(E eventObject);
    
      /**
       * Set the name of this appender.
       */
      public void setName(String name) {
        this.name = name;
      }
    
      public void start() {
        started = true;
      }
    
      public void stop() {
        started = false;
      }
    
      public boolean isStarted() {
        return started;
      }
    
      public String toString() {
        return this.getClass().getName() + "[" + name + "]";
      }
    
      public void addFilter(Filter<E> newFilter) {
        fai.addFilter(newFilter);
      }
    
      public void clearAllFilters() {
        fai.clearAllFilters();
      }
    
      public List<Filter<E>> getCopyOfAttachedFiltersList() {
        return fai.getCopyOfAttachedFiltersList();
      }
    
      public FilterReply getFilterChainDecision(E event) {
        return fai.getFilterChainDecision(event);
      }
    
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/Layout.java���������������������������0000644�0001750�0001750�00000003542�12136042271�026010� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core;
    
    import ch.qos.logback.core.spi.ContextAware;
    import ch.qos.logback.core.spi.LifeCycle;
    
    public interface Layout<E> extends ContextAware, LifeCycle {
      
      /**
       * Transform an event (of type Object) and return it as a String after 
       * appropriate formatting.
       * 
       * <p>Taking in an object and returning a String is the least sophisticated
       * way of formatting events. However, it is remarkably CPU-effective.
       * </p>
       * 
       * @param event The event to format
       * @return the event formatted as a String
       */
      String doLayout(E event);
      
      /**
       * Return the file header for this layout. The returned value may be null.
       * @return The header.
       */
      String getFileHeader();
    
      /**
       * Return the header of the logging event formatting. The returned value
       * may be null.
       * 
       * @return The header.
       */
      String getPresentationHeader();
    
      /**
       * Return the footer of the logging event formatting. The returned value
       * may be null.
       * 
       * @return The footer.
       */
      
      String getPresentationFooter();
      
      /**
       * Return the file footer for this layout. The returned value may be null.
       * @return The footer.
       */
      String getFileFooter();
      
      /**
       * Returns the content type as appropriate for the implementation.
       *  
       * @return
       */
      String getContentType();
      
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/boolex/�������������������������������0000755�0001750�0001750�00000000000�12203357067�025163� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/boolex/JaninoEventEvaluatorBase.java��0000644�0001750�0001750�00000005335�12136042271�032723� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.boolex;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import org.codehaus.janino.ScriptEvaluator;
    
    /**
     * Abstract class which sets the groundwork for janino based evaluations.
     * 
     * @author Ceki G&uuml;lc&uuml;
     * 
     * @param <E>
     */
    abstract public class JaninoEventEvaluatorBase<E> extends EventEvaluatorBase<E> {
    
      static Class<?> EXPRESSION_TYPE = boolean.class;
      static Class<?>[] THROWN_EXCEPTIONS = new Class[1];
    
      static public final int ERROR_THRESHOLD = 4;
      static {
        THROWN_EXCEPTIONS[0] = EvaluationException.class;
      }
    
      private String expression;
    
      ScriptEvaluator scriptEvaluator;
      private int errorCount = 0;
    
      abstract protected String getDecoratedExpression();
    
      abstract protected String[] getParameterNames();
    
      abstract protected Class<?>[] getParameterTypes();
    
      abstract protected Object[] getParameterValues(E event);
    
      protected List<Matcher> matcherList = new ArrayList<Matcher>();
    
      @Override
      public void start() {
        try {
          assert context != null;
          scriptEvaluator = new ScriptEvaluator(getDecoratedExpression(), EXPRESSION_TYPE,
              getParameterNames(), getParameterTypes(), THROWN_EXCEPTIONS);
          super.start();
        } catch (Exception e) {
          addError(
              "Could not start evaluator with expression [" + expression + "]", e);
        }
      }
    
      public boolean evaluate(E event) throws EvaluationException {
        if (!isStarted()) {
          throw new IllegalStateException("Evaluator [" + name
              + "] was called in stopped state");
        }
        try {
          Boolean result = (Boolean) scriptEvaluator.evaluate(getParameterValues(event));
          return result.booleanValue();
        } catch (Exception ex) {
          errorCount++;
          if (errorCount >= ERROR_THRESHOLD) {
            stop();
          }
          throw new EvaluationException("Evaluator [" + name
              + "] caused an exception", ex);
        }
      }
    
      public String getExpression() {
        return expression;
      }
    
      public void setExpression(String expression) {
        this.expression = expression;
      }
    
      public void addMatcher(Matcher matcher) {
        matcherList.add(matcher);
      }
    
      public List<Matcher> getMatcherList() {
        return matcherList;
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/boolex/Matcher.java�������������������0000644�0001750�0001750�00000005675�12136042271�027417� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.boolex;
    
    import java.util.regex.Pattern;
    import java.util.regex.PatternSyntaxException;
    
    import ch.qos.logback.core.spi.ContextAwareBase;
    import ch.qos.logback.core.spi.LifeCycle;
    
    public class Matcher extends ContextAwareBase implements LifeCycle {
    
      private String regex;
      private String name;
      private boolean caseSensitive = true;
      private boolean canonEq = false;
      private boolean unicodeCase = false;
    
      private boolean start = false;
      private Pattern pattern;
    
      public String getRegex() {
        return regex;
      }
    
      public void setRegex(String regex) {
        this.regex = regex;
      }
    
      public void start() {
        if(name ==  null) {
          addError("All Matcher objects must be named");
          return;
        }
        try {
          int code = 0;
          if(!caseSensitive) {
            code |= Pattern.CASE_INSENSITIVE; 
          }
          if(canonEq) {
            code |= Pattern.CANON_EQ;
          }
          if(unicodeCase) {
            code |= Pattern.UNICODE_CASE; 
          }
          
          //code |= Pattern.DOTALL;
          
          pattern = Pattern.compile(regex, code);
          start = true;
        } catch (PatternSyntaxException pse) {
          addError("Failed to compile regex [" + regex + "]", pse);
        }
      }
    
      public void stop() {
        start = false;
      }
    
      public boolean isStarted() {
        return start;
      }
    
      //However, this method does 
      //not require that the entire region (of the input) be matched.
      
      /**
       * Checks whether the input matches the regular expression. 
       * 
       * @param input
       * @return
       * @throws EvaluationException
       */
      public boolean matches(String input) throws EvaluationException {
        if(start) {
          java.util.regex.Matcher matcher = pattern.matcher(input);
          return matcher.find();
        } else {
          throw new EvaluationException("Matcher ["+regex+"] not started");
        }
      }
    
      public boolean isCanonEq() {
        return canonEq;
      }
    
      public void setCanonEq(boolean canonEq) {
        this.canonEq = canonEq;
      }
    
      public boolean isCaseSensitive() {
        return caseSensitive;
      }
    
      public void setCaseSensitive(boolean caseSensitive) {
        this.caseSensitive = caseSensitive;
      }
    
      public boolean isUnicodeCase() {
        return unicodeCase;
      }
    
      public void setUnicodeCase(boolean unicodeCase) {
        this.unicodeCase = unicodeCase;
      }
    
      public String getName() {
        return name;
      }
    
      public void setName(String name) {
        this.name = name;
      }
    }
    �������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/boolex/package.html�������������������0000644�0001750�0001750�00000000530�11377016712�027442� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
    
    <html> 
      <head>
        <title></title>
      </head>
      
      <body>
        
        <p>Contains the EventEvaluator interface and subclasses.</p>
    
        <p>EventEvaluator is subclassed by JaninoEventEvaluatorBase.
        Specific subclasses can be found in logback modules.
        </p>
    
      </body> 
    </html>������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/boolex/EvaluationException.java�������0000644�0001750�0001750�00000001735�12136042271�032013� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.boolex;
    
    /**
     * This exception wraps exceptions thrown while evaluating events.
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public class EvaluationException extends Exception {
    
      private static final long serialVersionUID = 1L;
    
      public EvaluationException(String msg) {
        super(msg);
      }
    
      public EvaluationException(String msg, Throwable cause) {
        super(msg, cause);
      }
    
      public EvaluationException(Throwable cause) {
        super(cause);
      }
    
    }
    �����������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/boolex/EventEvaluatorBase.java��������0000644�0001750�0001750�00000002142�12136042271�031555� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.boolex;
    
    import ch.qos.logback.core.spi.ContextAwareBase;
    
    abstract public class EventEvaluatorBase<E> extends ContextAwareBase implements
        EventEvaluator<E> {
    
      String name;
      boolean started;
    
      public String getName() {
        return name;
      }
    
      public void setName(String name) {
        if (this.name != null) {
          throw new IllegalStateException("name has been already set");
        }
        this.name = name;
      }
      
      public boolean isStarted() {
        return started;
      }
    
      public void start() {
        started = true;
      }
    
      public void stop() {
        started = false;
      }
    
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/boolex/EventEvaluator.java������������0000644�0001750�0001750�00000003475�12136042271�030774� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.boolex;
    
    import ch.qos.logback.core.spi.ContextAware;
    import ch.qos.logback.core.spi.LifeCycle;
    
    /**
     * Evaluates whether a given an event matches user-specified criteria.
     * 
     * <p>
     * Implementations are free to evaluate the event as they see fit. In
     * particular, the evaluation results <em>may</em> depend on previous events.
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    
    public interface EventEvaluator<E> extends ContextAware, LifeCycle {
    
      /**
       * Evaluates whether the event passed as parameter matches some user-specified
       * criteria.
       * 
       * <p>
       * The <code>Evaluator</code> is free to evaluate the event as it pleases. In
       * particular, the evaluation results <em>may</em> depend on previous events.
       * 
       * @param event
       *          The event to evaluate
       * @return true if there is a match, false otherwise.
       * @throws NullPointerException
       *           can be thrown in presence of null values
       * @throws EvaluationException
       *           may be thrown during faulty evaluation
       */
      boolean evaluate(E event) throws NullPointerException, EvaluationException;
    
      /**
       * Evaluators are named entities.
       * 
       * @return The name of this evaluator.
       */
      String getName();
    
      /**
       * Evaluators are named entities.
       */
      void setName(String name);
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/filter/�������������������������������0000755�0001750�0001750�00000000000�12203357067�025160� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/filter/package.html�������������������0000644�0001750�0001750�00000000341�11616526115�027436� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
    
    <html> 
      <head>
        <title></title>
      </head>
      
      <body>
        
        <p>Contains base classes to the event filtering functionality of logback.</p>
    
      </body> 
    </html>�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/filter/Filter.java��������������������0000644�0001750�0001750�00000003676�12136042272�027256� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.filter;
    
    import ch.qos.logback.core.spi.ContextAwareBase;
    import ch.qos.logback.core.spi.FilterReply;
    import ch.qos.logback.core.spi.LifeCycle;
    
    /**
     * Users should extend this class to implement customized event filtering.
     * 
     * <p>We suggest that you first try to use the built-in rules before rushing to
     * write your own custom filters.
     * 
     * <p>For more information about filters, please refer to the online manual at
     * http://logback.qos.ch/manual/filters.html
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public abstract class Filter<E> extends ContextAwareBase implements LifeCycle {
    
      private String name;
    
      boolean start = false;
    
      public void start() {
        this.start = true;
      }
    
      public boolean isStarted() {
        return this.start;
      }
    
      public void stop() {
        this.start = false;
      }
    
      /**
       * If the decision is <code>{@link FilterReply#DENY}</code>, then the event will be
       * dropped. If the decision is <code>{@link FilterReply#NEUTRAL}</code>, then the next
       * filter, if any, will be invoked. If the decision is
       * <code>{@link FilterReply#ACCEPT}</code> then the event will be logged without
       * consulting with other filters in the chain.
       * 
       * @param event
       *                The event to decide upon.
       */
      public abstract FilterReply decide(E event);
    
      public String getName() {
        return name;
      }
    
      public void setName(String name) {
        this.name = name;
      }
    }
    ������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/filter/AbstractMatcherFilter.java�����0000644�0001750�0001750�00000002110�12136042272�032224� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.filter;
    
    import ch.qos.logback.core.spi.FilterReply;
    
    public abstract class AbstractMatcherFilter<E> extends Filter<E> {
    
      protected FilterReply onMatch = FilterReply.NEUTRAL;
      protected FilterReply onMismatch = FilterReply.NEUTRAL;
      
      final public void setOnMatch(FilterReply reply) {
        this.onMatch = reply;
      }
      
      final public void setOnMismatch(FilterReply reply) {
        this.onMismatch = reply;
      }
      
      final public FilterReply getOnMatch() {
        return onMatch;
      }
      
      final public FilterReply getOnMismatch() {
        return onMismatch;
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/filter/EvaluatorFilter.java�����������0000644�0001750�0001750�00000004462�12136042272�031133� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.filter;
    
    import ch.qos.logback.core.boolex.EvaluationException;
    import ch.qos.logback.core.boolex.EventEvaluator;
    import ch.qos.logback.core.spi.FilterReply;
    
    /**
     * The value of the {@link #onMatch} and {@link #onMismatch} attributes is set
     * to {@link FilterReply#NEUTRAL}, so that a badly configured evaluator filter does
     * not disturb the functioning of the filter chain. 
     * 
     * <p>It is expected that one of the two attributes will have its value changed
     * to {@link FilterReply#ACCEPT} or {@link FilterReply#DENY}. That way, it is possible to
     * decide if a given result must be returned after the evaluation either failed
     * or succeeded.
     * 
     * 
     * <p> For more information about filters, please refer to the online manual at
     * http://logback.qos.ch/manual/filters.html
     * 
     * @author Ceki G&uuml;lc&uuml;
     * @author S&eacute;bastien Pennec
     */
    public class EvaluatorFilter<E> extends AbstractMatcherFilter<E> {
    
      EventEvaluator<E> evaluator;
    
      @Override
      public void start() {
        if (evaluator != null) {
          super.start();
        } else {
          addError("No evaluator set for filter " + this.getName());
        }
      }
    
      public EventEvaluator<E> getEvaluator() {
        return evaluator;
      }
    
      public void setEvaluator(EventEvaluator<E> evaluator) {
        this.evaluator = evaluator;
      }
    
      public FilterReply decide(E event) {
        // let us not throw an exception
        // see also bug #17.
        if (!isStarted() || !evaluator.isStarted()) {
          return FilterReply.NEUTRAL;
        }
        try {
          if (evaluator.evaluate(event)) {
            return onMatch;
          } else {
            return onMismatch;
          }
        } catch (EvaluationException e) {
          addError("Evaluator " + evaluator.getName() + " threw an exception", e);
          return FilterReply.NEUTRAL;
        }
      }
    
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/db/�����������������������������������0000755�0001750�0001750�00000000000�12203357067�024260� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/db/JNDIConnectionSource.java����������0000644�0001750�0001750�00000007303�12136042272�031045� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.db;
    
    import java.sql.Connection;
    import java.sql.SQLException;
    
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
    
    // PortableRemoteObject was introduced in JDK 1.3. We won't use it.
    // import javax.rmi.PortableRemoteObject;
    import javax.sql.DataSource;
    
    /**
     * The <id>JNDIConnectionSource</id> is an implementation of
     * {@link ConnectionSource} that obtains a {@link javax.sql.DataSource} from a
     * JNDI provider and uses it to obtain a {@link java.sql.Connection}. It is
     * primarily designed to be used inside of J2EE application servers or
     * application server clients, assuming the application server supports remote
     * access of {@link javax.sql.DataSource}s. In this way one can take advantage
     * of connection pooling and whatever other goodies the application server
     * provides.
     * <p>
     * For more information about this component, please refer to the online manual at
     * http://logback.qos.ch/manual/appenders.html#DBAppender
     * 
     * @author <a href="mailto:rdecampo@twcny.rr.com">Ray DeCampo</a>
     */
    public class JNDIConnectionSource extends ConnectionSourceBase {
      private String jndiLocation = null;
      private DataSource dataSource = null;
    
      public void start() {
        if (jndiLocation == null) {
          addError("No JNDI location specified for JNDIConnectionSource.");
        }
        discoverConnectionProperties();
      }
    
    
      public Connection getConnection() throws SQLException {
        Connection conn = null;
        try {
          if (dataSource == null) {
            dataSource = lookupDataSource();
          }
          if(getUser() != null) {
            addWarn("Ignoring property [user] with value ["+getUser()+"] for obtaining a connection from a DataSource.");
          }
          conn = dataSource.getConnection();
        } catch (final NamingException ne) {
          addError("Error while getting data source", ne);
          throw new SQLException("NamingException while looking up DataSource: "
              + ne.getMessage());
        } catch (final ClassCastException cce) {
          addError("ClassCastException while looking up DataSource.", cce);
          throw new SQLException("ClassCastException while looking up DataSource: "
              + cce.getMessage());
        }
    
        return conn;
      }
    
      /**
       * Returns the jndiLocation.
       * 
       * @return String
       */
      public String getJndiLocation() {
        return jndiLocation;
      }
    
      /**
       * Sets the jndiLocation.
       * 
       * @param jndiLocation
       *          The jndiLocation to set
       */
      public void setJndiLocation(String jndiLocation) {
        this.jndiLocation = jndiLocation;
      }
    
      private DataSource lookupDataSource() throws NamingException, SQLException {
        addInfo("Looking up ["+jndiLocation+"] in JNDI");
        DataSource ds;
        Context initialContext = new InitialContext();
        Object obj = initialContext.lookup(jndiLocation);
    
        // PortableRemoteObject was introduced in JDK 1.3. We won't use it.
        // ds = (DataSource)PortableRemoteObject.narrow(obj, DataSource.class);
        ds = (DataSource) obj;
    
        if (ds == null) {
          throw new SQLException("Failed to obtain data source from JNDI location "
              + jndiLocation);
        } else {
          return ds;
        }
      }
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/db/package.html�����������������������0000644�0001750�0001750�00000001161�11616526115�026537� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
    
    <html> 
      <head>
        <title></title>
      </head>
      
      <body>
    <p>The ch.qos.logback.core.db package provides bases classes to append objects 
    into various databases.
    </p>
    
    <p>Most popular database systems, such as PostgreSQL, MySQL, Oracle, DB2 and MsSQL
    are supported.
    </p>
    
    <p>Just as importantly, the way for obtaining JDBC connections is pluggable. Connections can
    be obtained through the traditional way of DriverManager, or alternatively as a DataSource.
    A DataSource can be instantiated directly or it can obtained through JNDI.
    </p>
      </body> 
    </html>���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/db/ConnectionSourceBase.java����������0000644�0001750�0001750�00000006567�12136042271�031205� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.db;
    
    import java.sql.Connection;
    import java.sql.DatabaseMetaData;
    import java.sql.SQLException;
    
    import ch.qos.logback.core.db.dialect.DBUtil;
    import ch.qos.logback.core.db.dialect.SQLDialectCode;
    import ch.qos.logback.core.spi.ContextAwareBase;
    
    
    /**
     * @author Ceki G&uuml;lc&uuml;
     */
    public abstract class ConnectionSourceBase extends ContextAwareBase implements ConnectionSource {
      
      private boolean started;
      
      private String user = null;
      private String password = null;
    
      // initially we have an unknown dialect
      private SQLDialectCode dialectCode = SQLDialectCode.UNKNOWN_DIALECT;
      private boolean supportsGetGeneratedKeys = false;
      private boolean supportsBatchUpdates = false;
    
    
      /**
       * Learn relevant information about this connection source.
       *
       */
      public void discoverConnectionProperties() {
        Connection connection = null;
        try {
          connection = getConnection();
          if (connection == null) {
            addWarn("Could not get a connection");
            return;
          }
          DatabaseMetaData meta = connection.getMetaData();
          DBUtil util = new DBUtil();
          util.setContext(getContext());
          supportsGetGeneratedKeys = util.supportsGetGeneratedKeys(meta);
          supportsBatchUpdates = util.supportsBatchUpdates(meta);
          dialectCode = DBUtil.discoverSQLDialect(meta);
          addInfo("Driver name="+meta.getDriverName());
          addInfo("Driver version="+meta.getDriverVersion());
          addInfo("supportsGetGeneratedKeys="+supportsGetGeneratedKeys);
          
        } catch (SQLException se) {
          addWarn("Could not discover the dialect to use.", se);
        } finally {
          DBHelper.closeConnection(connection);
        }
      }
    
      /**
       * Does this connection support the JDBC Connection.getGeneratedKeys method?
       */
      public final boolean supportsGetGeneratedKeys() {
        return supportsGetGeneratedKeys;
      }
    
      public final SQLDialectCode getSQLDialectCode() {
        return dialectCode;
      }
    
      /**
       * Get the password for this connection source.
       */
      public final String getPassword() {
        return password;
      }
    
      /**
       * Sets the password.
       * @param password The password to set
       */
      public final void setPassword(final String password) {
        this.password = password;
      }
    
      /**
       * Get the user for this connection source.
       */
      public final String getUser() {
        return user;
      }
    
      /**
       * Sets the username.
       * @param username The username to set
       */
      public final void setUser(final String username) {
        this.user = username;
      }
    
      /**
       * Does this connection support batch updates?
       */
      public final boolean supportsBatchUpdates() {
        return supportsBatchUpdates;
      }
    
      public boolean isStarted() {
        return started;
      }
    
      public void start() {
        started = true;
      }
    
      public void stop() {
        started = false;
      }
      
      
    }
    �����������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/db/DBAppenderBase.java����������������0000644�0001750�0001750�00000013276�12136042271�027664� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.db;
    
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    import ch.qos.logback.core.UnsynchronizedAppenderBase;
    import ch.qos.logback.core.db.dialect.DBUtil;
    import ch.qos.logback.core.db.dialect.SQLDialect;
    import ch.qos.logback.core.db.dialect.SQLDialectCode;
    
    /**
     * @author Ceki G&uuml;lc&uuml;
     * @author Ray DeCampo
     * @author S&eacute;bastien Pennec
     */
    public abstract class DBAppenderBase<E> extends UnsynchronizedAppenderBase<E> {
    
      protected ConnectionSource connectionSource;
      protected boolean cnxSupportsGetGeneratedKeys = false;
      protected boolean cnxSupportsBatchUpdates = false;
      protected SQLDialect sqlDialect;
    
      protected abstract Method getGeneratedKeysMethod();
    
      protected abstract String getInsertSQL();
    
      @Override
      public void start() {
    
        if (connectionSource == null) {
          throw new IllegalStateException(
              "DBAppender cannot function without a connection source");
        }
    
        sqlDialect = DBUtil
            .getDialectFromCode(connectionSource.getSQLDialectCode());
        if (getGeneratedKeysMethod() != null) {
          cnxSupportsGetGeneratedKeys = connectionSource.supportsGetGeneratedKeys();
        } else {
          cnxSupportsGetGeneratedKeys = false;
        }
        cnxSupportsBatchUpdates = connectionSource.supportsBatchUpdates();
        if (!cnxSupportsGetGeneratedKeys && (sqlDialect == null)) {
          throw new IllegalStateException(
              "DBAppender cannot function if the JDBC driver does not support getGeneratedKeys method *and* without a specific SQL dialect");
        }
    
        // all nice and dandy on the eastern front
        super.start();
      }
    
      /**
       * @return Returns the connectionSource.
       */
      public ConnectionSource getConnectionSource() {
        return connectionSource;
      }
    
      /**
       * @param connectionSource
       *          The connectionSource to set.
       */
      public void setConnectionSource(ConnectionSource connectionSource) {
        this.connectionSource = connectionSource;
      }
    
      @Override
      public void append(E eventObject) {
        Connection connection = null;
        try {
          connection = connectionSource.getConnection();
          connection.setAutoCommit(false);
          PreparedStatement insertStatement;
    
          if (cnxSupportsGetGeneratedKeys) {
            String EVENT_ID_COL_NAME = "EVENT_ID";
            // see
            if (connectionSource.getSQLDialectCode() == SQLDialectCode.POSTGRES_DIALECT) {
              EVENT_ID_COL_NAME = EVENT_ID_COL_NAME.toLowerCase();
            }
            insertStatement = connection.prepareStatement(getInsertSQL(),
                new String[] { EVENT_ID_COL_NAME });
          } else {
            insertStatement = connection.prepareStatement(getInsertSQL());
          }
    
          long eventId;
          // inserting an event and getting the result must be exclusive
          synchronized (this) {
            subAppend(eventObject, connection, insertStatement);
            eventId = selectEventId(insertStatement, connection);
          }
          secondarySubAppend(eventObject, connection, eventId);
    
          // we no longer need the insertStatement
          close(insertStatement);
    
          connection.commit();
        } catch (Throwable sqle) {
          addError("problem appending event", sqle);
        } finally {
          DBHelper.closeConnection(connection);
        }
      }
    
      protected abstract void subAppend(E eventObject, Connection connection,
          PreparedStatement statement) throws Throwable;
    
      protected abstract void secondarySubAppend(E eventObject, Connection connection,
          long eventId) throws Throwable;
    
      protected long selectEventId(PreparedStatement insertStatement,
          Connection connection) throws SQLException, InvocationTargetException {
        ResultSet rs = null;
        Statement idStatement = null;
        boolean gotGeneratedKeys = false;
        if (cnxSupportsGetGeneratedKeys) {
          try {
            rs = (ResultSet) getGeneratedKeysMethod().invoke(insertStatement,
                (Object[]) null);
            gotGeneratedKeys = true;
          } catch (InvocationTargetException ex) {
            Throwable target = ex.getTargetException();
            if (target instanceof SQLException) {
              throw (SQLException) target;
            }
            throw ex;
          } catch (IllegalAccessException ex) {
            addWarn(
                "IllegalAccessException invoking PreparedStatement.getGeneratedKeys",
                ex);
          }
        }
    
        if (!gotGeneratedKeys) {
          idStatement = connection.createStatement();
          idStatement.setMaxRows(1);
          String selectInsertIdStr = sqlDialect.getSelectInsertId();
          rs = idStatement.executeQuery(selectInsertIdStr);
        }
    
        // A ResultSet cursor is initially positioned before the first row;
        // the first call to the method next makes the first row the current row
        rs.next();
        long eventId = rs.getLong(1);
    
        rs.close();
    
        close(idStatement);
    
        return eventId;
      }
    
      void close(Statement statement) throws SQLException {
        if (statement != null) {
          statement.close();
        }
      }
    
      @Override
      public void stop() {
        super.stop();
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/db/DBHelper.java����������������������0000644�0001750�0001750�00000002231�12136042271�026537� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.db;
    
    import java.sql.Connection;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    /**
     * @author Ceki G&uuml;lc&uuml;
     * 
     */
    public class DBHelper {
    
      static public void closeConnection(Connection connection) {
        if (connection != null) {
          try {
            connection.close();
          } catch (SQLException sqle) {
            // static utility classes should not log without an explicit repository
            // reference
          }
        }
      }
    
      public static void closeStatement(Statement statement) {
        if (statement != null) {
          try {
            statement.close();
          } catch (SQLException sqle) {
          }
        }
      }
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/db/DataSourceConnectionSource.java����0000644�0001750�0001750�00000004716�12136042271�032357� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.db;
    
    import java.sql.Connection;
    import java.sql.SQLException;
    
    import javax.sql.DataSource;
    
    import ch.qos.logback.core.db.dialect.SQLDialectCode;
    
    /**
     * The DataSourceConnectionSource is an implementation of
     * {@link ConnectionSource} that obtains the Connection in the recommended JDBC
     * manner based on a {@link javax.sql.DataSource DataSource}.
     * <p>
     * 
     * For more information about this component, please refer to the online manual at
     * http://logback.qos.ch/manual/appenders.html#DBAppender
     * 
     * @author Ray DeCampo
     * @author Ceki G&uuml;lc&uuml;
     */
    public class DataSourceConnectionSource extends ConnectionSourceBase {
    
      private DataSource dataSource;
    
      @Override
      public void start() {
        if (dataSource == null) {
          addWarn("WARNING: No data source specified");
        } else {
          Connection connection = null;
          try {
            connection = getConnection();
          } catch (SQLException se) {
            addWarn("Could not get a connection to discover the dialect to use.",
                se);
          }
          if (connection != null) {
            discoverConnectionProperties();
          }
          if (!supportsGetGeneratedKeys()
              && getSQLDialectCode() == SQLDialectCode.UNKNOWN_DIALECT) {
            addWarn("Connection does not support GetGeneratedKey method and could not discover the dialect.");
          }
        }
        super.start();
      }
    
      /**
       * @see ch.qos.logback.core.db.ConnectionSource#getConnection()
       */
      public Connection getConnection() throws SQLException {
        if (dataSource == null) {
          addError("WARNING: No data source specified");
          return null;
        }
    
        if (getUser() == null) {
          return dataSource.getConnection();
        } else {
          return dataSource.getConnection(getUser(), getPassword());
        }
      }
    
      public DataSource getDataSource() {
        return dataSource;
      }
    
      public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
      }
    }
    ��������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/db/dialect/���������������������������0000755�0001750�0001750�00000000000�12203357067�025665� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000147�00000000000�011567� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/db/dialect/SybaseSqlAnywhereDialect.java��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/db/dialect/SybaseSqlAnywhereDialect.ja0000644�0001750�0001750�00000001724�12136042272�033076� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.db.dialect;
    
    public class SybaseSqlAnywhereDialect implements SQLDialect {
    
      /** 
      * The Sybase SQLAnywhere Dialect 
      * 
      * Note that the dialect is not needed if your JDBC driver supports 
      * the getGeneratedKeys method introduced in JDBC 3.0 specification.
      * 
      * @author Michael Lynch 
      */ 
    
      public static final String SELECT_CURRVAL = "SELECT @@identity id";
    
      public String getSelectInsertId() {
        return SELECT_CURRVAL;
      }
    
    }
    ��������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/db/dialect/package.html���������������0000644�0001750�0001750�00000000440�11377016712�030144� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
    
    <html> 
      <head>
        <title></title>
      </head>
      
      <body>
        
        <p>Contains the dialect classes used by logback to log to different databases, and the
        SQL scripts to created the necessary tables.</p>
    
      </body> 
    </html>��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/db/dialect/SQLiteDialect.java���������0000644�0001750�0001750�00000001654�12136042272�031157� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.db.dialect;
    
    /**
     * SQLite dialect
     *
     * Note that the dialect is not needed if your JDBC driver supports the
     * getGeneratedKeys method introduced in JDBC 3.0 specification.
     *
     * @author Anthony Trinh
     */
    public class SQLiteDialect implements SQLDialect {
      public static final String SELECT_CURRVAL = "SELECT last_insert_rowid();";
    
      public String getSelectInsertId() {
        return SELECT_CURRVAL;
      }
    }
    
    ������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/db/dialect/HSQLDBDialect.java���������0000644�0001750�0001750�00000001440�12136042272�030764� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.db.dialect;
    
    /**
     * The HSQLDB dialect.
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public class HSQLDBDialect implements SQLDialect {
      public static final String SELECT_CURRVAL = "CALL IDENTITY()";
    
      public String getSelectInsertId() {
        return SELECT_CURRVAL;
      }
      
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/db/dialect/SQLDialect.java������������0000644�0001750�0001750�00000001200�12136042272�030440� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.db.dialect;
    
    /**
     * @author Ceki G&uuml;c&uuml;
     *
     */
    public interface SQLDialect {
      String getSelectInsertId();
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/db/dialect/PostgreSQLDialect.java�����0000644�0001750�0001750�00000001435�12136042272�032016� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.db.dialect;
    
    
    /**
     * 
     * @author ceki
     *
     */
    public class PostgreSQLDialect
           implements SQLDialect {
      public static final String SELECT_CURRVAL = "SELECT currval('logging_event_id_seq')";
    
      public String getSelectInsertId() {
        return SELECT_CURRVAL;
      }
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/db/dialect/MsSQLDialect.java����������0000644�0001750�0001750�00000001675�12136042272�030760� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.db.dialect; 
    
    /** 
    * The MS SQL Server dialect is untested. 
    * 
    * Note that the dialect is not needed if your JDBC driver supports 
    * the getGeneratedKeys method introduced in JDBC 3.0 specification.
    * 
    * @author James Stauffer 
    */ 
    public class MsSQLDialect implements SQLDialect { 
     public static final String SELECT_CURRVAL = "SELECT @@identity id"; 
    
     public String getSelectInsertId() { 
       return SELECT_CURRVAL; 
     } 
    }
    �������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/db/dialect/SQLDialectCode.java��������0000644�0001750�0001750�00000001345�12136042272�031245� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.db.dialect;
    
    public enum SQLDialectCode {
      UNKNOWN_DIALECT,
      POSTGRES_DIALECT,
      MYSQL_DIALECT,
      ORACLE_DIALECT,
      MSSQL_DIALECT,
      HSQL_DIALECT, 
      H2_DIALECT,
      SYBASE_SQLANYWHERE_DIALECT,
      SQLITE_DIALECT;
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/db/dialect/OracleDialect.java���������0000644�0001750�0001750�00000001606�12136042272�031220� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.db.dialect;
    
    /**
     * The Oracle dialect. Tested successfully on Oracle9i Release 9.2.0.3.0 by 
     * James Stauffer.
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public class OracleDialect implements SQLDialect {
      public static final String SELECT_CURRVAL = "SELECT logging_event_id_seq.currval from dual";
    
      public String getSelectInsertId() {
        return SELECT_CURRVAL;
      }
    
    }
    ��������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/db/dialect/DBUtil.java����������������0000644�0001750�0001750�00000010512�12136042272�027644� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.db.dialect;
    
    import java.sql.DatabaseMetaData;
    import java.sql.SQLException;
    
    import ch.qos.logback.core.spi.ContextAwareBase;
    
    /**
     * 
     * @author Ceki Gulcu
     * 
     */
    public class DBUtil extends ContextAwareBase {
      private static final String POSTGRES_PART = "postgresql";
      private static final String MYSQL_PART = "mysql";
      private static final String ORACLE_PART = "oracle";
      // private static final String MSSQL_PART = "mssqlserver4";
      private static final String MSSQL_PART = "microsoft";
      private static final String HSQL_PART = "hsql";
      private static final String H2_PART = "h2";
      private static final String SYBASE_SQLANY_PART = "sql anywhere";
      private static final String SQLITE_PART = "sqlite";
    
      public static SQLDialectCode discoverSQLDialect(DatabaseMetaData meta) {
        SQLDialectCode dialectCode = SQLDialectCode.UNKNOWN_DIALECT;
    
        try {
    
          String dbName = meta.getDatabaseProductName().toLowerCase();
    
          if (dbName.indexOf(POSTGRES_PART) != -1) {
            return SQLDialectCode.POSTGRES_DIALECT;
          } else if (dbName.indexOf(MYSQL_PART) != -1) {
            return SQLDialectCode.MYSQL_DIALECT;
          } else if (dbName.indexOf(ORACLE_PART) != -1) {
            return SQLDialectCode.ORACLE_DIALECT;
          } else if (dbName.indexOf(MSSQL_PART) != -1) {
            return SQLDialectCode.MSSQL_DIALECT;
          } else if (dbName.indexOf(HSQL_PART) != -1) {
            return SQLDialectCode.HSQL_DIALECT;
          } else if (dbName.indexOf(H2_PART) != -1) {
            return SQLDialectCode.H2_DIALECT;
          } else if (dbName.indexOf(SYBASE_SQLANY_PART) != -1) {
            return SQLDialectCode.SYBASE_SQLANYWHERE_DIALECT;
          } else if (dbName.indexOf(SQLITE_PART) != -1) {
            return SQLDialectCode.SQLITE_DIALECT;
          } else {
            return SQLDialectCode.UNKNOWN_DIALECT;
          }
        } catch (SQLException sqle) {
          // we can't do much here
        }
    
        return dialectCode;
      }
    
      public static SQLDialect getDialectFromCode(SQLDialectCode sqlDialectType) {
        SQLDialect sqlDialect = null;
    
        switch (sqlDialectType) {
        case POSTGRES_DIALECT:
          sqlDialect = new PostgreSQLDialect();
          break;
    
        case MYSQL_DIALECT:
          sqlDialect = new MySQLDialect();
          break;
        
        case ORACLE_DIALECT:
          sqlDialect = new OracleDialect();
          break;
        
        case MSSQL_DIALECT:
          sqlDialect = new MsSQLDialect();
          break;
        
        case HSQL_DIALECT:
          sqlDialect = new HSQLDBDialect();
          break;
    
        case H2_DIALECT:
          sqlDialect = new H2Dialect();
          break;
          
        case SYBASE_SQLANYWHERE_DIALECT:
          sqlDialect = new SybaseSqlAnywhereDialect();
          break;
    
        case SQLITE_DIALECT:
          sqlDialect = new SQLiteDialect();
          break;
        }
        return sqlDialect;
      }
    
      /**
       * This method handles cases where the
       * {@link DatabaseMetaData#supportsGetGeneratedKeys} method is missing in the
       * JDBC driver implementation.
       */
      public boolean supportsGetGeneratedKeys(DatabaseMetaData meta) {
        try {
          //
          // invoking JDBC 1.4 method by reflection
          //
          return ((Boolean) DatabaseMetaData.class.getMethod(
              "supportsGetGeneratedKeys", (Class[]) null).invoke(meta,
              (Object[]) null)).booleanValue();
        } catch (Throwable e) {
          addInfo("Could not call supportsGetGeneratedKeys method. This may be recoverable");
          return false;
        }
      }
    
      /**
       * This method handles cases where the
       * {@link DatabaseMetaData#supportsBatchUpdates} method is missing in the JDBC
       * driver implementation.
       */
      public boolean supportsBatchUpdates(DatabaseMetaData meta) {
        try {
          return meta.supportsBatchUpdates();
        } catch (Throwable e) {
          addInfo("Missing DatabaseMetaData.supportsBatchUpdates method.");
          return false;
        }
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/db/dialect/MySQLDialect.java����������0000644�0001750�0001750�00000001424�12136042272�030756� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.db.dialect;
    
    /**
     * 
     * 
     * @author Ceki
     *
     */
    public class MySQLDialect implements SQLDialect {
      public static final String SELECT_LAST_INSERT_ID = "SELECT LAST_INSERT_ID()";
      
      public String getSelectInsertId() {
        return SELECT_LAST_INSERT_ID;
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/db/dialect/H2Dialect.java�������������0000644�0001750�0001750�00000001430�12136042272�030257� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.db.dialect;
    
    /**
     * The H2 dialect.
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public class H2Dialect implements SQLDialect {
      public static final String SELECT_CURRVAL = "CALL IDENTITY()";
    
      public String getSelectInsertId() {
        return SELECT_CURRVAL;
      }
      
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/db/BindDataSourceToJNDIAction.java����0000644�0001750�0001750�00000005222�12136042271�032052� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.db;
    
    
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.sql.DataSource;
    
    import org.xml.sax.Attributes;
    
    import ch.qos.logback.core.joran.action.Action;
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    import ch.qos.logback.core.joran.util.PropertySetter;
    import ch.qos.logback.core.util.OptionHelper;
    
    /**
     * 
     * @author Ceki Gulcu
     *
     */
    public class BindDataSourceToJNDIAction extends Action {
      
      static final String DATA_SOURCE_CLASS = "dataSourceClass";
      static final String URL = "url";
      static final String USER = "user";
      static final String PASSWORD = "password";
    
      /**
       * Instantiates an a data source and bind it to JNDI
       * Most of the required parameters are placed in the ec.substitutionProperties
       */
      public void begin(
          InterpretationContext ec, String localName, Attributes attributes) {
        String dsClassName = ec.getProperty(DATA_SOURCE_CLASS);
    
        if (OptionHelper.isEmpty(dsClassName)) {
          addWarn("dsClassName is a required parameter");
          ec.addError("dsClassName is a required parameter");
    
          return;
        }
    
        String urlStr = ec.getProperty(URL);
        String userStr = ec.getProperty(USER);
        String passwordStr = ec.getProperty(PASSWORD);
    
        try {
          DataSource ds =
            (DataSource) OptionHelper.instantiateByClassName(dsClassName, DataSource.class, context);
    
          PropertySetter setter = new PropertySetter(ds);
          setter.setContext(context);
    
          if (!OptionHelper.isEmpty(urlStr)) {
            setter.setProperty("url", urlStr);
          }
    
          if (!OptionHelper.isEmpty(userStr)) {
            setter.setProperty("user", userStr);
          }
    
          if (!OptionHelper.isEmpty(passwordStr)) {
            setter.setProperty("password", passwordStr);
          }
    
          Context ctx = new InitialContext();
          ctx.rebind("dataSource", ds);
        } catch (Exception oops) {
          addError(
            "Could not bind  datasource. Reported error follows.", oops);
          ec.addError("Could not not bind  datasource of type [" + dsClassName + "].");
        }
      }
    
      public void end(InterpretationContext ec, String name) {
      }
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/db/ConnectionSource.java��������������0000644�0001750�0001750�00000004054�12136042271�030377� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.db;
    import java.sql.Connection;
    import java.sql.SQLException;
    
    import ch.qos.logback.core.db.dialect.SQLDialectCode;
    import ch.qos.logback.core.spi.LifeCycle;
    
    
    /**
     *  The <id>ConnectionSource</id> interface provides a pluggable means of
     *  transparently obtaining JDBC {@link java.sql.Connection}s for logback classes
     *  that require the use of a {@link java.sql.Connection}.
     *  
     * For more information about this component, please refer to the online manual at
     * http://logback.qos.ch/manual/appenders.html#DBAppender
     *
     *  @author <a href="mailto:rdecampo@twcny.rr.com">Ray DeCampo</a>
     */
    public interface ConnectionSource extends LifeCycle {
    
      /**
       *  Obtain a {@link java.sql.Connection} for use.  The client is
       *  responsible for closing the {@link java.sql.Connection} when it is no
       *  longer required.
       *
       *  @throws SQLException  if a {@link java.sql.Connection} could not be
       *                        obtained
       */
      Connection getConnection() throws SQLException;
    
      /**
       * Get the SQL dialect that should be used for this connection. Note that the
       * dialect is not needed if the JDBC driver supports the getGeneratedKeys 
       * method.
       */
      SQLDialectCode getSQLDialectCode();
      
      /**
       * If the connection supports the JDBC 3.0 getGeneratedKeys method, then
       * we do not need any specific dialect support.
       */
      boolean supportsGetGeneratedKeys();
      
      /**
       * If the connection does not support batch updates, we will avoid using them.
       */
      boolean supportsBatchUpdates();
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/db/DriverManagerConnectionSource.java�0000644�0001750�0001750�00000004756�12136042272�033060� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.db;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    
    /**
     * The DriverManagerConnectionSource is an implementation of
     * {@link ConnectionSource} that obtains the Connection in the traditional JDBC
     * manner based on the connection URL.
     * <p>
     * For more information about this component, please refer to the online manual at
     * http://logback.qos.ch/manual/appenders.html#DBAppender
     * 
     * @author <a href="mailto:rdecampo@twcny.rr.com">Ray DeCampo</a>
     */
    public class DriverManagerConnectionSource extends ConnectionSourceBase {
      private String driverClass = null;
      private String url = null;
    
      public void start() {
        try {
          if (driverClass != null) {
            Class.forName(driverClass);
            discoverConnectionProperties();
          } else {
            addError("WARNING: No JDBC driver specified for logback DriverManagerConnectionSource.");
          }
        } catch (final ClassNotFoundException cnfe) {
          addError("Could not load JDBC driver class: " + driverClass, cnfe);
        }
      }
    
      /**
       * @see ch.qos.logback.core.db.ConnectionSource#getConnection()
       */
      public Connection getConnection() throws SQLException {
        if (getUser() == null) {
          return DriverManager.getConnection(url);
        } else {
          return DriverManager.getConnection(url, getUser(), getPassword());
        }
      }
    
      /**
       * Returns the url.
       * 
       * @return String
       */
      public String getUrl() {
        return url;
      }
    
      /**
       * Sets the url.
       * 
       * @param url
       *          The url to set
       */
      public void setUrl(String url) {
        this.url = url;
      }
    
      /**
       * Returns the name of the driver class.
       * 
       * @return String
       */
      public String getDriverClass() {
        return driverClass;
      }
    
      /**
       * Sets the driver class.
       * 
       * @param driverClass
       *          The driver class to set
       */
      public void setDriverClass(String driverClass) {
        this.driverClass = driverClass;
      }
    }
    ������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/spi/����������������������������������0000755�0001750�0001750�00000000000�12203357067�024466� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/spi/package.html����������������������0000644�0001750�0001750�00000000431�11377016712�026745� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
    
    <html>
    <head>
    <title></title>
    </head>
    
    <body>
    
    <p>Contains core functionnalities of logback, such as
    @link{ch.qos.logback.core.spi.AppenderAttachable} and
    @link{ch.qos.logback.core.spi.LifeCycle}.</p>
    
    </body>
    </html>
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/spi/ComponentTracker.java�������������0000644�0001750�0001750�00000006072�12136473053�030613� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.spi;
    
    
    import ch.qos.logback.core.CoreConstants;
    
    import java.util.Collection;
    import java.util.Set;
    
    /**
     * Interface for tracking various components by key. Components which have not
     * been accessed for more than a user-specified duration are deemed stale and
     * removed. Components can also be explicitly marked as having reached their
     * {@link #endOfLife(String)} in which case they will linger for a few seconds
     * and then be removed.
     *
     * @author Tommy Becker
     * @author Ceki Gulcu
     * @author David Roussel
     *
     * @since 1.0.12
     */
    public interface ComponentTracker<C> {
    
      /**
       * The default timeout duration is 30 minutes
       */
      public final int DEFAULT_TIMEOUT = 30 * 60 * CoreConstants.MILLIS_IN_ONE_SECOND; // 30 minutes
    
      /**
       * By default an unlimited number of elements can be tracked.
       */
      int DEFAULT_MAX_COMPONENTS = Integer.MAX_VALUE;
    
      /**
       * Returns the number of components tracked.
       * @return number of components
       */
      int getComponentCount();
    
    
      /**
       * Find the component identified by 'key', without updating the timestamp. Returns null if no
       * corresponding component could be found.
       *
       * @param key
       * @return corresponding component, may be null
       */
      C find(String key);
    
      /**
       * Get the component identified by 'key', updating its timestamp in the
       * process. If the corresponding component could not be found, it is created.
       *
       * @param key
       * @param timestamp
       * @return
       */
      C getOrCreate(String key, long timestamp);
    
    
      /**
       * Remove components which are deemed stale. Components which have not
       * been accessed for more than a user-specified duration are deemed stale.
       *
       * <p>If the number of components exceeds, {@link #getComponentCount()},
       * components in excess will be removed.</p>
       *
       * <p>Depending on the component type, components will be cleared or stopped
       * (as appropriate) right before removal.</p>
       *
       * @param now  current time in milliseconds
       */
      void removeStaleComponents(long now);
    
    
      /**
       * Mark component identified by 'key' as having reached its end-of-life. End-of-lifed
       * components will linger for a few more seconds before being removed.
       *
       * @param key
       */
      void endOfLife(String key);
    
      /**
       * Returns the collection of all components tracked by this instance.
       * @return  collection of components
       */
      Collection<C> allComponents();
    
    
      /**
       * Set of all keys in this tracker in no particular order.
       *
       * @return
       */
      Set<String> allKeys();
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/spi/FilterAttachableImpl.java���������0000644�0001750�0001750�00000003377�12136042272�031355� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.spi;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.concurrent.CopyOnWriteArrayList;
    
    import ch.qos.logback.core.filter.Filter;
    
    /**
     * Implementation of FilterAttachable.
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    final public class FilterAttachableImpl<E> implements FilterAttachable<E> {
    
      CopyOnWriteArrayList<Filter<E>> filterList = new CopyOnWriteArrayList<Filter<E>>();
    
      /**
       * Add a filter to end of the filter list.
       */
      public void addFilter(Filter<E> newFilter) {
        filterList.add(newFilter);
      }
    
      /**
       * Clear the filter chain
       */
      public void clearAllFilters() {
        filterList.clear();
      }
    
      /**
       * Loop through the filters in the list. As soon as a filter decides on
       * ACCEPT or DENY, then that value is returned. If all of the filters return
       * NEUTRAL, then NEUTRAL is returned.
       */
      public FilterReply getFilterChainDecision(E event) {
        for (Filter<E> f : filterList) {
          final FilterReply r = f.decide(event);
          if (r == FilterReply.DENY || r == FilterReply.ACCEPT) {
            return r;
          }
        }
        return FilterReply.NEUTRAL;
      }
    
      public List<Filter<E>> getCopyOfAttachedFiltersList() {
        return new ArrayList<Filter<E>>(filterList);
      }
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/spi/ContextAwareImpl.java�������������0000644�0001750�0001750�00000005240�12136252243�030553� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.spi;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.status.ErrorStatus;
    import ch.qos.logback.core.status.InfoStatus;
    import ch.qos.logback.core.status.Status;
    import ch.qos.logback.core.status.StatusManager;
    import ch.qos.logback.core.status.WarnStatus;
    
    
    /**
     * A helper class that implements ContextAware methods. Use this class to
     * implement the ContextAware interface by composition.
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public class ContextAwareImpl implements ContextAware {
    
      private int noContextWarning = 0;
      protected Context context;
      final Object origin;
      
      public ContextAwareImpl(Context context, Object origin) {
        this.context = context;
        this.origin = origin;
    
      }
      
      protected Object getOrigin() {
        return origin;
      }
      
      public void setContext(Context context) {
        if (this.context == null) {
          this.context = context;
        } else if (this.context != context) {
          throw new IllegalStateException("Context has been already set");
        }
      }
    
      public Context getContext() {
        return this.context;
      }
    
      public StatusManager getStatusManager() {
        if (context == null) {
          return null;
        }
        return context.getStatusManager();
      }
    
      public void addStatus(Status status) {
        if (context == null) {
          if (noContextWarning++ == 0) {
            System.out.println("LOGBACK: No context given for " + this);
          }
          return;
        }
        StatusManager sm = context.getStatusManager();
        if (sm != null) {
          sm.add(status);
        }
      }
    
      public void addInfo(String msg) {
        addStatus(new InfoStatus(msg, getOrigin()));
      }
    
      public void addInfo(String msg, Throwable ex) {
        addStatus(new InfoStatus(msg, getOrigin(), ex));
      }
    
      public void addWarn(String msg) {
        addStatus(new WarnStatus(msg, getOrigin()));
      }
    
      public void addWarn(String msg, Throwable ex) {
        addStatus(new WarnStatus(msg, getOrigin(), ex));
      }
    
      public void addError(String msg) {
        addStatus(new ErrorStatus(msg, getOrigin()));
      }
    
      public void addError(String msg, Throwable ex) {
        addStatus(new ErrorStatus(msg, getOrigin(), ex));
      }
    
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/spi/CyclicBufferTracker.java����������0000644�0001750�0001750�00000003401�12136235670�031203� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.spi;
    
    import ch.qos.logback.core.helpers.CyclicBuffer;
    
    import java.util.*;
    
    /**
     * CyclicBufferTracker tracks  {@link CyclicBuffer} instances.
     *
     * @author Ceki G&uuml;c&uuml;
     */
    public class CyclicBufferTracker<E> extends AbstractComponentTracker<CyclicBuffer<E>> {
    
      static final int DEFAULT_NUMBER_OF_BUFFERS = 64;
    
      static final int DEFAULT_BUFFER_SIZE = 256;
      int bufferSize = DEFAULT_BUFFER_SIZE;
    
    
      public CyclicBufferTracker() {
        super();
        setMaxComponents(DEFAULT_NUMBER_OF_BUFFERS);
      }
    
      public int getBufferSize() {
        return bufferSize;
      }
    
      public void setBufferSize(int bufferSize) {
        this.bufferSize = bufferSize;
      }
    
      @Override
      protected void processPriorToRemoval(CyclicBuffer<E> component) {
        component.clear();
      }
    
      @Override
      protected CyclicBuffer<E> buildComponent(String key) {
        return  new CyclicBuffer<E>(bufferSize);
      }
    
      @Override
      protected boolean isComponentStale(CyclicBuffer<E> eCyclicBuffer) {
        return false;
      }
    
      // for testing purposes
      List<String> liveKeysAsOrderedList() {
        return new ArrayList<String>(liveMap.keySet());
      }
    
      List<String> lingererKeysAsOrderedList() {
        return new ArrayList<String>(lingerersMap.keySet());
    
      }
    
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/spi/PreSerializationTransformer.java��0000644�0001750�0001750�00000001534�12136042272�033035� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.spi;
    
    import java.io.Serializable;
    
    /**
     * PreSerializationTransformer instances have the responsibility to transform
     * object into a presumably equivalent serializable representation.
     * 
     * @author Ceki G&uuml;lc&uuml;
     * 
     * @param <E>
     */
    public interface PreSerializationTransformer<E> {
      Serializable transform(E event);
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/spi/ScanException.java����������������0000644�0001750�0001750�00000001606�12136042272�030071� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.spi;
    
    public class ScanException extends Exception {
    
      private static final long serialVersionUID = -3132040414328475658L;
    
      Throwable cause;
    
      public ScanException(String msg) {
        super(msg);
      }
    
      public ScanException(String msg, Throwable rootCause) {
        super(msg);
        this.cause = rootCause;
      }
    
      public Throwable getCause() {
       return cause;
      }
    }
    
    ��������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/spi/FilterReply.java������������������0000644�0001750�0001750�00000002040�12136042272�027560� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.spi;
    
    
    /**
     *
     * This enum represents the possible replies that a filtering component
     * in logback can return. It is used by implementations of both 
     * {@link ch.qos.logback.core.filter.Filter} and
     * {@link ch.qos.logback.classic.turbo.TurboFilter} abstract classes.
     * 
     * Based on the order that the FilterReply values are declared,
     * FilterReply.ACCEPT.compareTo(FilterReply.DENY) will return 
     * a positive value.
     *
     * @author S&eacute;bastien Pennec
     */
    public enum FilterReply {
      DENY,
      NEUTRAL,
      ACCEPT;
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/spi/ContextAwareBase.java�������������0000644�0001750�0001750�00000005745�12143151241�030530� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.spi;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.status.ErrorStatus;
    import ch.qos.logback.core.status.InfoStatus;
    import ch.qos.logback.core.status.Status;
    import ch.qos.logback.core.status.StatusManager;
    import ch.qos.logback.core.status.WarnStatus;
    
    /**
     * A helper class that implements ContextAware methods. A class can implement
     * the ContextAware interface by deriving from this class.
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public class ContextAwareBase implements ContextAware {
      private int noContextWarning = 0;
      protected Context context;
      final Object declaredOrigin;
    
      public ContextAwareBase() {
        declaredOrigin = this;
      }
      public ContextAwareBase(ContextAware declaredOrigin) {
        this.declaredOrigin = declaredOrigin;
      }
    
      public void setContext(Context context) {
        if (this.context == null) {
          this.context = context;
        } else if (this.context != context) {
          throw new IllegalStateException("Context has been already set");
        }
      }
    
      public Context getContext() {
        return this.context;
      }
    
      public StatusManager getStatusManager() {
        if (context == null) {
          return null;
        }
        return context.getStatusManager();
      }
    
      /**
       * The declared origin of status messages. By default 'this'. Derived classes may override this
       * method to declare other origin.
       * 
       * @return the declared origin, by default 'this'
       */ 
      protected Object getDeclaredOrigin() {
        return declaredOrigin;
      }
    
      public void addStatus(Status status) {
        if (context == null) {
          if (noContextWarning++ == 0) {
            System.out.println("LOGBACK: No context given for " + this);
          }
          return;
        }
        StatusManager sm = context.getStatusManager();
        if (sm != null) {
          sm.add(status);
        }
      }
    
      public void addInfo(String msg) {
        addStatus(new InfoStatus(msg, getDeclaredOrigin()));
      }
    
      public void addInfo(String msg, Throwable ex) {
        addStatus(new InfoStatus(msg, getDeclaredOrigin(), ex));
      }
    
      public void addWarn(String msg) {
        addStatus(new WarnStatus(msg, getDeclaredOrigin()));
      }
    
      public void addWarn(String msg, Throwable ex) {
        addStatus(new WarnStatus(msg, getDeclaredOrigin(), ex));
      }
    
      public void addError(String msg) {
        addStatus(new ErrorStatus(msg, getDeclaredOrigin()));
      }
    
      public void addError(String msg, Throwable ex) {
        addStatus(new ErrorStatus(msg, getDeclaredOrigin(), ex));
      }
    }
    ���������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/spi/PropertyDefiner.java��������������0000644�0001750�0001750�00000001337�12136042272�030450� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.spi;
    
    public interface PropertyDefiner extends ContextAware {
    
      /**
       * Get the property value, defined by this property definer
       * 
       * @return defined property value
       */
      String getPropertyValue();
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/spi/PropertyContainer.java������������0000644�0001750�0001750�00000001244�12136042272�031013� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.spi;
    
    import java.util.Map;
    
    public interface PropertyContainer {
    
      String getProperty(String key);
      
      Map<String, String> getCopyOfPropertyMap();
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/spi/ContextAware.java�����������������0000644�0001750�0001750�00000002063�12136042272�027730� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.spi;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.status.Status;
    
    
    /**
     * An object which has a context and add methods for updating internal status messages.
     */
    public interface ContextAware {
    
      void setContext(Context context);
    
      Context getContext();
    
      void addStatus(Status status);
    
      void addInfo(String msg);
    
      void addInfo(String msg, Throwable ex);
    
      void addWarn(String msg);
    
      void addWarn(String msg, Throwable ex);
    
      void addError(String msg);
    
      void addError(String msg, Throwable ex);
    
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/spi/AppenderAttachable.java�����������0000644�0001750�0001750�00000003151�12136213375�031036� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.spi;
    
    import java.util.Iterator;
    
    import ch.qos.logback.core.Appender;
    
    /**
     * Interface for attaching appenders to objects.
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public interface AppenderAttachable<E> {
      /**
       * Add an appender.
       */
      void addAppender(Appender<E> newAppender);
    
      /**
       * Get an iterator for appenders contained in the parent object.
       */
      Iterator<Appender<E>> iteratorForAppenders();
    
      /**
       * Get an appender by name.
       */
      Appender<E> getAppender(String name);
    
      /**
       * Returns <code>true</code> if the specified appender is in list of
       * attached attached, <code>false</code> otherwise.
       */
      boolean isAttached(Appender<E> appender);
    
      /**
       * Detach and processPriorToRemoval all previously added appenders.
       */
      void detachAndStopAllAppenders(); 
    
      /**
       * Detach the appender passed as parameter from the list of appenders.
       */
      boolean detachAppender(Appender<E> appender);
    
      /**
       * Detach the appender with the name passed as parameter from the list of
       * appenders.
       */
      boolean detachAppender(String name);
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/spi/DeferredProcessingAware.java������0000644�0001750�0001750�00000001143�12136042272�032057� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.spi;
    
    public interface DeferredProcessingAware {
    
      void prepareForDeferredProcessing();
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/spi/AppenderAttachableImpl.java�������0000644�0001750�0001750�00000007316�12136213375�031667� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.spi;
    
    import java.util.Iterator;
    import java.util.concurrent.CopyOnWriteArrayList;
    
    import ch.qos.logback.core.Appender;
    
    /**
     * A ReentrantReadWriteLock based implementation of the
     * {@link AppenderAttachable} interface.
     *
     * @author Ceki G&uuml;lc&uuml;
     */
    public class AppenderAttachableImpl<E> implements AppenderAttachable<E> {
    
      final private CopyOnWriteArrayList<Appender<E>> appenderList = new CopyOnWriteArrayList<Appender<E>>();
    
      /**
       * Attach an appender. If the appender is already in the list in won't be
       * added again.
       */
      public void addAppender(Appender<E> newAppender) {
        if (newAppender == null) {
          throw new IllegalArgumentException("Null argument disallowed");
        }
         appenderList.addIfAbsent(newAppender);
      }
    
      /**
       * Call the <code>doAppend</code> method on all attached appenders.
       */
      public int appendLoopOnAppenders(E e) {
        int size = 0;
          for (Appender<E> appender : appenderList) {
            appender.doAppend(e);
            size++;
          }
        return size;
      }
    
      /**
       * Get all attached appenders as an Enumeration. If there are no attached
       * appenders <code>null</code> is returned.
       *
       * @return Iterator An iterator of attached appenders.
       */
      public Iterator<Appender<E>> iteratorForAppenders() {
        return appenderList.iterator();
      }
    
      /**
       * Look for an attached appender named as <code>name</code>.
       * <p/>
       * <p> Return the appender with that name if in the list. Return null
       * otherwise.
       */
      public Appender<E> getAppender(String name) {
        if (name == null) {
          return null;
        }
        Appender<E> found = null;
        for (Appender<E> appender : appenderList) {
          if (name.equals(appender.getName())) {
            return appender;
          }
        }
        return null;
      }
    
      /**
       * Returns <code>true</code> if the specified appender is in the list of
       * attached appenders, <code>false</code> otherwise.
       *
       * @since 1.2
       */
      public boolean isAttached(Appender<E> appender) {
        if (appender == null) {
          return false;
        }
        for (Appender<E> a : appenderList) {
          if (a == appender) return true;
        }
        return false;
      }
    
      /**
       * Remove and processPriorToRemoval all previously attached appenders.
       */
      public void detachAndStopAllAppenders() {
        for (Appender<E> a : appenderList) {
          a.stop();
        }
        appenderList.clear();
      }
    
      static final long START = System.currentTimeMillis();
    
      /**
       * Remove the appender passed as parameter form the list of attached
       * appenders.
       */
      public boolean detachAppender(Appender<E> appender) {
        if (appender == null) {
          return false;
        }
        boolean result;
        result = appenderList.remove(appender);
        return result;
      }
    
      /**
       * Remove the appender with the name passed as parameter form the list of
       * appenders.
       */
      public boolean detachAppender(String name) {
        if (name == null) {
          return false;
        }
        boolean removed = false;
          for (Appender<E> a : appenderList) {
            if (name.equals((a).getName())) {
              removed = appenderList.remove(a);
              break;
            }
          }
        return removed;
      }
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/spi/LogbackLock.java������������������0000644�0001750�0001750�00000001335�12136042272�027500� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.spi;
    
    /**
     * This class just makes it easier to identify locks associated with logback
     * when analysing thread dumps.
     *
     * @author Ceki G&uuml;c&uuml;
     */
    public class LogbackLock extends Object {
      
      
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/spi/AbstractComponentTracker.java�����0000644�0001750�0001750�00000021455�12136477006�032303� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.spi;
    
    
    import ch.qos.logback.core.CoreConstants;
    
    import java.util.*;
    
    /**
     * An abstract implementation of the ComponentTracker interface. Derived classes must implement
     * {@link #buildComponent(String)}, {@link #processPriorToRemoval(Object)}, and {@link #isComponentStale(Object)}
     * methods as appropriate for their component type.
     *
     * @param <C> component type
     *
     * @author Tommy Becker
     * @author Ceki Gulcu
     * @author David Roussel
     */
    abstract public class AbstractComponentTracker<C> implements ComponentTracker<C> {
      private static final boolean ACCESS_ORDERED = true;
    
      // Components in lingering state last 10 seconds
      final public static long LINGERING_TIMEOUT = 10 * CoreConstants.MILLIS_IN_ONE_SECOND;
    
      /**
       * The minimum amount of time that has to elapse between successive removal iterations.
       */
      final public static long WAIT_BETWEEN_SUCCESSIVE_REMOVAL_ITERATIONS = CoreConstants.MILLIS_IN_ONE_SECOND;
    
      protected int maxComponents = DEFAULT_MAX_COMPONENTS;
      protected long timeout = DEFAULT_TIMEOUT;
    
      // an access ordered map. Least recently accessed element will be removed after a 'timeout'
      LinkedHashMap<String, Entry<C>> liveMap = new LinkedHashMap<String, Entry<C>>(32, .75f, ACCESS_ORDERED);
    
      // an access ordered map. Least recently accessed element will be removed after LINGERING_TIMEOUT
      LinkedHashMap<String, Entry<C>> lingerersMap = new LinkedHashMap<String, Entry<C>>(16, .75f, ACCESS_ORDERED);
      long lastCheck = 0;
    
      /**
       * Stop or clean the component.
       *
       * @param component
       */
      abstract protected void processPriorToRemoval(C component);
    
      /**
       * Build a component based on the key.
       *
       * @param key
       * @return
       */
      abstract protected C buildComponent(String key);
    
      /**
       * Components can declare themselves stale. Such components may be
       * removed before they time out.
       *
       * @param c
       * @return
       */
      protected abstract boolean isComponentStale(C c);
    
    
      public int getComponentCount() {
        return liveMap.size() + lingerersMap.size();
      }
    
      /**
       * Get an entry from the liveMap, if not found search the lingerersMap.
       *
       * @param key
       * @return
       */
      private Entry<C> getFromEitherMap(String key) {
        Entry<C> entry = liveMap.get(key);
        if (entry != null)
          return entry;
        else {
          return lingerersMap.get(key);
        }
      }
    
      /**
       * {@inheritDoc}
       *
       * <p>Note that this method is synchronized.</p>
       *
       * @param key {@inheritDoc}
       * @return {@inheritDoc}
       *
       */
      public synchronized C find(String key) {
        Entry<C> entry = getFromEitherMap(key);
        if (entry == null) return null;
        else return entry.component;
      }
    
      /**
       *  {@inheritDoc}
       *
       * <p>Note that this method is atomic, i.e. synchronized.</p>
       *
       * @param key {@inheritDoc}
       * @param timestamp {@inheritDoc}
       * @return {@inheritDoc}
       */
      public synchronized C getOrCreate(String key, long timestamp) {
        Entry<C> entry = getFromEitherMap(key);
        if (entry == null) {
          C c = buildComponent(key);
          entry = new Entry(key, c, timestamp);
          // new entries go into the main map
          liveMap.put(key, entry);
        } else {
          entry.setTimestamp(timestamp);
        }
        return entry.component;
      }
    
      /**
       * Mark component identified by 'key' as having reached its end-of-life.
       *
       * @param key
       */
      public void endOfLife(String key) {
        Entry entry = liveMap.remove(key);
        if (entry == null)
          return;
        lingerersMap.put(key, entry);
      }
    
      /**
       * Clear (and detach) components which are stale. Components which have not
       * been accessed for more than a user-specified duration are deemed stale.
       *
       * @param now
       */
      public synchronized void removeStaleComponents(long now) {
        if (isTooSoonForRemovalIteration(now)) return;
        removeExcedentComponents();
        removeStaleComponentsFromMainMap(now);
        removeStaleComponentsFromLingerersMap(now);
      }
    
      private void removeExcedentComponents() {
        genericStaleComponentRemover(liveMap, 0, byExcedent);
      }
    
      private void removeStaleComponentsFromMainMap(long now) {
        genericStaleComponentRemover(liveMap, now, byTimeout);
      }
    
      private void removeStaleComponentsFromLingerersMap(long now) {
        genericStaleComponentRemover(lingerersMap, now, byLingering);
      }
    
      private void genericStaleComponentRemover(LinkedHashMap<String, Entry<C>> map, long now,
                                                RemovalPredicator<C> removalPredicator) {
        Iterator<Map.Entry<String, Entry<C>>> iter = map.entrySet().iterator();
        while (iter.hasNext()) {
          Map.Entry<String, Entry<C>> mapEntry = iter.next();
          Entry<C> entry = mapEntry.getValue();
          if (removalPredicator.isSlatedForRemoval(entry, now)) {
            iter.remove();
            C c = entry.component;
            processPriorToRemoval(c);
          } else {
            break;
          }
        }
      }
    
      private RemovalPredicator<C> byExcedent = new RemovalPredicator<C>() {
        public boolean isSlatedForRemoval(Entry<C> entry, long timestamp) {
          return (liveMap.size() > maxComponents);
        }
      };
    
      private RemovalPredicator<C> byTimeout = new RemovalPredicator<C>() {
        public boolean isSlatedForRemoval(Entry<C> entry, long timestamp) {
          return isEntryStale(entry, timestamp);
        }
      };
      private RemovalPredicator<C> byLingering = new RemovalPredicator<C>() {
        public boolean isSlatedForRemoval(Entry<C> entry, long timestamp) {
          return isEntryDoneLingering(entry, timestamp);
        }
      };
    
      private boolean isTooSoonForRemovalIteration(long now) {
        if (lastCheck + WAIT_BETWEEN_SUCCESSIVE_REMOVAL_ITERATIONS > now) {
          return true;
        }
        lastCheck = now;
        return false;
      }
    
      private boolean isEntryStale(Entry<C> entry, long now) {
        // stopped or improperly started appenders are considered stale
        // see also http://jira.qos.ch/browse/LBCLASSIC-316
        C c = entry.component;
        if (isComponentStale(c))
          return true;
    
        return ((entry.timestamp + timeout) < now);
      }
    
      private boolean isEntryDoneLingering(Entry entry, long now) {
        return ((entry.timestamp + LINGERING_TIMEOUT) < now);
      }
    
      public Set<String> allKeys() {
        HashSet<String> allKeys = new HashSet<String>(liveMap.keySet());
        allKeys.addAll(lingerersMap.keySet());
        return allKeys;
      }
    
      public Collection<C> allComponents() {
        List<C> allComponents = new ArrayList<C>();
        for (Entry<C> e : liveMap.values())
          allComponents.add(e.component);
        for (Entry<C> e : lingerersMap.values())
          allComponents.add(e.component);
    
        return allComponents;
      }
    
      public long getTimeout() {
        return timeout;
      }
    
      public void setTimeout(long timeout) {
        this.timeout = timeout;
      }
    
      public int getMaxComponents() {
        return maxComponents;
      }
    
      public void setMaxComponents(int maxComponents) {
        this.maxComponents = maxComponents;
      }
    
      // ================================================================
      private interface RemovalPredicator<C> {
        boolean isSlatedForRemoval(Entry<C> entry, long timestamp);
      }
      // ================================================================
      private static class Entry<C> {
        String key;
        C component;
        long timestamp;
    
        Entry(String k, C c, long timestamp) {
          this.key = k;
          this.component = c;
          this.timestamp = timestamp;
        }
    
        public void setTimestamp(long timestamp) {
          this.timestamp = timestamp;
        }
    
        @Override
        public int hashCode() {
          return key.hashCode();
        }
    
        @Override
        public boolean equals(Object obj) {
          if (this == obj)
            return true;
          if (obj == null)
            return false;
          if (getClass() != obj.getClass())
            return false;
          final Entry other = (Entry) obj;
          if (key == null) {
            if (other.key != null)
              return false;
          } else if (!key.equals(other.key))
            return false;
          if (component == null) {
            if (other.component != null)
              return false;
          } else if (!component.equals(other.component))
            return false;
          return true;
        }
    
        @Override
        public String toString() {
          return "(" + key + ", " + component + ")";
        }
      }
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/spi/LifeCycle.java��������������������0000644�0001750�0001750�00000001150�12136042272�027157� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.spi;
    
    public interface LifeCycle {
    
      void start();
      void stop();
      boolean isStarted();
    
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/spi/FilterAttachable.java�������������0000644�0001750�0001750�00000002430�12136042272�030520� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.spi;
    
    import java.util.List;
    
    import ch.qos.logback.core.filter.Filter;
    
    /**
     * Interface for attaching filters to objects.
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public interface FilterAttachable<E> {
      /**
       * Add a filter.
       */
      void addFilter(Filter<E> newFilter);
    
      void clearAllFilters();
    
      /**
       * Get a copy of all the filters contained within this FilterAttachable
       * object.
       * 
       * @return all attached filters as a list
       */
      List<Filter<E>> getCopyOfAttachedFiltersList();
    
      /**
       * Loop through the filters in the chain. As soon as a filter decides on
       * ACCEPT or DENY, then that value is returned. If all of the filters return
       * NEUTRAL, then NEUTRAL is returned.
       */
      FilterReply getFilterChainDecision(E event);
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/����������������������������������0000755�0001750�0001750�00000000000�12203357067�024461� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/SMTPAppenderBase.java�������������0000644�0001750�0001750�00000046242�12136177166�030376� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Date;
    import java.util.List;
    import java.util.Properties;
    
    import javax.mail.Message;
    import javax.mail.MessagingException;
    import javax.mail.Multipart;
    import javax.mail.Session;
    import javax.mail.Transport;
    import javax.mail.internet.AddressException;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeBodyPart;
    import javax.mail.internet.MimeMessage;
    import javax.mail.internet.MimeMultipart;
    import javax.naming.Context;
    import javax.naming.InitialContext;
    
    import ch.qos.logback.core.AppenderBase;
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.Layout;
    import ch.qos.logback.core.boolex.EvaluationException;
    import ch.qos.logback.core.boolex.EventEvaluator;
    import ch.qos.logback.core.helpers.CyclicBuffer;
    import ch.qos.logback.core.pattern.PatternLayoutBase;
    import ch.qos.logback.core.sift.DefaultDiscriminator;
    import ch.qos.logback.core.sift.Discriminator;
    import ch.qos.logback.core.spi.CyclicBufferTracker;
    import ch.qos.logback.core.util.ContentTypeUtil;
    import ch.qos.logback.core.util.OptionHelper;
    
    // Contributors:
    // Andrey Rybin charset encoding support http://jira.qos.ch/browse/LBCORE-69
    
    /**
     * An abstract class that provides support for sending events to an email
     * address.
     * <p/>
     * <p/>
     * See http://logback.qos.ch/manual/appenders.html#SMTPAppender for further
     * documentation.
     *
     * @author Ceki G&uuml;lc&uuml;
     * @author S&eacute;bastien Pennec
     */
    public abstract class SMTPAppenderBase<E> extends AppenderBase<E> {
    
      static InternetAddress[] EMPTY_IA_ARRAY = new InternetAddress[0];
      // ~ 14 days
      static final int MAX_DELAY_BETWEEN_STATUS_MESSAGES = 1228800 * CoreConstants.MILLIS_IN_ONE_SECOND;
    
      long lastTrackerStatusPrint = 0;
      int delayBetweenStatusMessages = 300 * CoreConstants.MILLIS_IN_ONE_SECOND;
    
      protected Layout<E> subjectLayout;
      protected Layout<E> layout;
    
      private List<PatternLayoutBase<E>> toPatternLayoutList = new ArrayList<PatternLayoutBase<E>>();
      private String from;
      private String subjectStr = null;
      private String smtpHost;
      private int smtpPort = 25;
      private boolean starttls = false;
      private boolean ssl = false;
      private boolean sessionViaJNDI = false;
      private String jndiLocation = CoreConstants.JNDI_COMP_PREFIX + "/mail/Session";
    
    
      String username;
      String password;
      String localhost;
    
      boolean asynchronousSending = true;
    
      private String charsetEncoding = "UTF-8";
    
      protected MimeMessage mimeMsg;
    
      protected EventEvaluator<E> eventEvaluator;
    
      protected Discriminator<E> discriminator = new DefaultDiscriminator<E>();
      protected CyclicBufferTracker<E> cbTracker;
    
      private int errorCount = 0;
    
      /**
       * return a layout for the subject string as appropriate for the module. If the
       * subjectStr parameter is null, then a default value for subjectStr should be
       * used.
       *
       * @param subjectStr
       * @return a layout as appropriate for the module
       */
      abstract protected Layout<E> makeSubjectLayout(String subjectStr);
    
      /**
       * Start the appender
       */
      public void start() {
    
        if (cbTracker == null) {
          cbTracker = new CyclicBufferTracker<E>();
        }
    
        Session session = null;
        if (sessionViaJNDI)
          session = lookupSessionInJNDI();
        else
          session = buildSessionFromProperties();
    
        if (session == null) {
          addError("Failed to obtain javax.mail.Session. Cannot start.");
          return;
        }
        mimeMsg = new MimeMessage(session);
    
        try {
          if (from != null) {
            mimeMsg.setFrom(getAddress(from));
          } else {
            mimeMsg.setFrom();
          }
    
          subjectLayout = makeSubjectLayout(subjectStr);
    
          started = true;
    
        } catch (MessagingException e) {
          addError("Could not activate SMTPAppender options.", e);
        }
      }
    
      private Session lookupSessionInJNDI() {
        addInfo("Looking up javax.mail.Session at JNDI location [" + jndiLocation + "]");
        try {
          Context initialContext = new InitialContext();
          Object obj = initialContext.lookup(jndiLocation);
          return (Session) obj;
        } catch (Exception e) {
          addError("Failed to obtain javax.mail.Session from JNDI location [" + jndiLocation+"]");
          return null;
        }
      }
    
      private Session buildSessionFromProperties() {
        Properties props = new Properties(OptionHelper.getSystemProperties());
        if (smtpHost != null) {
          props.put("mail.smtp.host", smtpHost);
        }
        props.put("mail.smtp.port", Integer.toString(smtpPort));
    
        if (localhost != null) {
          props.put("mail.smtp.localhost", localhost);
        }
    
        LoginAuthenticator loginAuthenticator = null;
    
        if (username != null) {
          loginAuthenticator = new LoginAuthenticator(username, password);
          props.put("mail.smtp.auth", "true");
        }
    
        if (isSTARTTLS() && isSSL()) {
          addError("Both SSL and StartTLS cannot be enabled simultaneously");
        } else {
          if (isSTARTTLS()) {
            // see also http://jira.qos.ch/browse/LBCORE-225
            props.put("mail.smtp.starttls.enable", "true");
          }
          if (isSSL()) {
            String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
            props.put("mail.smtp.socketFactory.port", Integer.toString(smtpPort));
            props.put("mail.smtp.socketFactory.class", SSL_FACTORY);
            props.put("mail.smtp.socketFactory.fallback", "true");
          }
        }
    
        // props.put("mail.debug", "true");
    
        return Session.getInstance(props, loginAuthenticator);
      }
    
      /**
       * Perform SMTPAppender specific appending actions, delegating some of them to
       * a subclass and checking if the event triggers an e-mail to be sent.
       */
      protected void append(E eventObject) {
    
        if (!checkEntryConditions()) {
          return;
        }
    
        String key = discriminator.getDiscriminatingValue(eventObject);
        long now = System.currentTimeMillis();
        final CyclicBuffer<E> cb = cbTracker.getOrCreate(key, now);
        subAppend(cb, eventObject);
    
        try {
          if (eventEvaluator.evaluate(eventObject)) {
            // clone the CyclicBuffer before sending out asynchronously
            CyclicBuffer<E> cbClone = new CyclicBuffer<E>(cb);
            // see http://jira.qos.ch/browse/LBCLASSIC-221
            cb.clear();
    
            if (asynchronousSending) {
              // perform actual sending asynchronously
              SenderRunnable senderRunnable = new SenderRunnable(cbClone, eventObject);
              context.getExecutorService().execute(senderRunnable);
            } else {
              // synchronous sending
              sendBuffer(cbClone, eventObject);
            }
          }
        } catch (EvaluationException ex) {
          errorCount++;
          if (errorCount < CoreConstants.MAX_ERROR_COUNT) {
            addError("SMTPAppender's EventEvaluator threw an Exception-", ex);
          }
        }
    
        // immediately remove the buffer if asked by the user
        if (eventMarksEndOfLife(eventObject)) {
          cbTracker.endOfLife(key);
        }
    
        cbTracker.removeStaleComponents(now);
    
        if (lastTrackerStatusPrint + delayBetweenStatusMessages < now) {
          addInfo("SMTPAppender [" + name + "] is tracking [" + cbTracker.getComponentCount() + "] buffers");
          lastTrackerStatusPrint = now;
          // quadruple 'delay' assuming less than max delay
          if (delayBetweenStatusMessages < MAX_DELAY_BETWEEN_STATUS_MESSAGES) {
            delayBetweenStatusMessages *= 4;
          }
        }
      }
    
      abstract protected boolean eventMarksEndOfLife(E eventObject);
    
      abstract protected void subAppend(CyclicBuffer<E> cb, E eventObject);
    
      /**
       * This method determines if there is a sense in attempting to append.
       * <p/>
       * <p/>
       * It checks whether there is a set output target and also if there is a set
       * layout. If these checks fail, then the boolean value <code>false</code> is
       * returned.
       */
      public boolean checkEntryConditions() {
        if (!this.started) {
          addError("Attempting to append to a non-started appender: "
                  + this.getName());
          return false;
        }
    
        if (this.mimeMsg == null) {
          addError("Message object not configured.");
          return false;
        }
    
        if (this.eventEvaluator == null) {
          addError("No EventEvaluator is set for appender [" + name + "].");
          return false;
        }
    
        if (this.layout == null) {
          addError("No layout set for appender named ["
                  + name
                  + "]. For more information, please visit http://logback.qos.ch/codes.html#smtp_no_layout");
          return false;
        }
        return true;
      }
    
      synchronized public void stop() {
        this.started = false;
      }
    
      InternetAddress getAddress(String addressStr) {
        try {
          return new InternetAddress(addressStr);
        } catch (AddressException e) {
          addError("Could not parse address [" + addressStr + "].", e);
          return null;
        }
      }
    
      private List<InternetAddress> parseAddress(E event) {
        int len = toPatternLayoutList.size();
    
        List<InternetAddress> iaList = new ArrayList<InternetAddress>();
    
        for (int i = 0; i < len; i++) {
          try {
            PatternLayoutBase<E> emailPL = toPatternLayoutList.get(i);
            String emailAdrr = emailPL.doLayout(event);
            if (emailAdrr == null || emailAdrr.length() == 0) {
              continue;
            }
            InternetAddress[] tmp = InternetAddress.parse(emailAdrr, true);
            iaList.addAll(Arrays.asList(tmp));
          } catch (AddressException e) {
            addError("Could not parse email address for [" + toPatternLayoutList.get(i) + "] for event [" + event + "]", e);
            return iaList;
          }
        }
    
        return iaList;
      }
    
      /**
       * Returns value of the <b>toList</b> option.
       */
      public List<PatternLayoutBase<E>> getToList() {
        return toPatternLayoutList;
      }
    
      /**
       * Send the contents of the cyclic buffer as an e-mail message.
       */
      protected void sendBuffer(CyclicBuffer<E> cb, E lastEventObject) {
    
        // Note: this code already owns the monitor for this
        // appender. This frees us from needing to synchronize on 'cb'.
        try {
          MimeBodyPart part = new MimeBodyPart();
    
          StringBuffer sbuf = new StringBuffer();
    
          String header = layout.getFileHeader();
          if (header != null) {
            sbuf.append(header);
          }
          String presentationHeader = layout.getPresentationHeader();
          if (presentationHeader != null) {
            sbuf.append(presentationHeader);
          }
          fillBuffer(cb, sbuf);
          String presentationFooter = layout.getPresentationFooter();
          if (presentationFooter != null) {
            sbuf.append(presentationFooter);
          }
          String footer = layout.getFileFooter();
          if (footer != null) {
            sbuf.append(footer);
          }
    
          String subjectStr = "Undefined subject";
          if (subjectLayout != null) {
            subjectStr = subjectLayout.doLayout(lastEventObject);
          }
          mimeMsg.setSubject(subjectStr, charsetEncoding);
    
          List<InternetAddress> destinationAddresses = parseAddress(lastEventObject);
          if (destinationAddresses.isEmpty()) {
            addInfo("Empty destination address. Aborting email transmission");
            return;
          }
    
          InternetAddress[] toAddressArray = destinationAddresses.toArray(EMPTY_IA_ARRAY);
          mimeMsg.setRecipients(Message.RecipientType.TO, toAddressArray);
    
          String contentType = layout.getContentType();
    
          if (ContentTypeUtil.isTextual(contentType)) {
            part.setText(sbuf.toString(), charsetEncoding, ContentTypeUtil
                    .getSubType(contentType));
          } else {
            part.setContent(sbuf.toString(), layout.getContentType());
          }
    
          Multipart mp = new MimeMultipart();
          mp.addBodyPart(part);
          mimeMsg.setContent(mp);
    
          mimeMsg.setSentDate(new Date());
          addInfo("About to send out SMTP message \"" + subjectStr + "\" to " + Arrays.toString(toAddressArray));
          Transport.send(mimeMsg);
        } catch (Exception e) {
          addError("Error occurred while sending e-mail notification.", e);
        }
      }
    
      abstract protected void fillBuffer(CyclicBuffer<E> cb, StringBuffer sbuf);
    
      /**
       * Returns value of the <b>From</b> option.
       */
      public String getFrom() {
        return from;
      }
    
      /**
       * Returns value of the <b>Subject</b> option.
       */
      public String getSubject() {
        return subjectStr;
      }
    
      /**
       * The <b>From</b> option takes a string value which should be a e-mail
       * address of the sender.
       */
      public void setFrom(String from) {
        this.from = from;
      }
    
      /**
       * The <b>Subject</b> option takes a string value which should be a the
       * subject of the e-mail message.
       */
      public void setSubject(String subject) {
        this.subjectStr = subject;
      }
    
      /**
       * Alias for smtpHost
       *
       * @param smtpHost
       */
      public void setSMTPHost(String smtpHost) {
        setSmtpHost(smtpHost);
      }
    
      /**
       * The <b>smtpHost</b> option takes a string value which should be a the host
       * name of the SMTP server that will send the e-mail message.
       */
      public void setSmtpHost(String smtpHost) {
        this.smtpHost = smtpHost;
      }
    
      /**
       * Alias for getSmtpHost().
       */
      public String getSMTPHost() {
        return getSmtpHost();
      }
    
      /**
       * Returns value of the <b>SMTPHost</b> option.
       */
      public String getSmtpHost() {
        return smtpHost;
      }
    
      /**
       * Alias for {@link #setSmtpPort}.
       *
       * @param port
       */
      public void setSMTPPort(int port) {
        setSmtpPort(port);
      }
    
      /**
       * The port where the SMTP server is running. Default value is 25.
       *
       * @param port
       */
      public void setSmtpPort(int port) {
        this.smtpPort = port;
      }
    
      /**
       * Alias for {@link #getSmtpPort}
       *
       * @return
       */
      public int getSMTPPort() {
        return getSmtpPort();
      }
    
      /**
       * See {@link #setSmtpPort}
       *
       * @return
       */
      public int getSmtpPort() {
        return smtpPort;
      }
    
      public String getLocalhost() {
        return localhost;
      }
    
      /**
       * Set the "mail.smtp.localhost" property to the value passed as parameter to
       * this method.
       * <p/>
       * <p>Useful in case the hostname for the client host is not fully qualified
       * and as a consequence the SMTP server rejects the clients HELO/EHLO command.
       * </p>
       *
       * @param localhost
       */
      public void setLocalhost(String localhost) {
        this.localhost = localhost;
      }
    
      public CyclicBufferTracker<E> getCyclicBufferTracker() {
        return cbTracker;
      }
    
      public void setCyclicBufferTracker(CyclicBufferTracker<E> cbTracker) {
        this.cbTracker = cbTracker;
      }
    
      public Discriminator<E> getDiscriminator() {
        return discriminator;
      }
    
      public void setDiscriminator(Discriminator<E> discriminator) {
        this.discriminator = discriminator;
      }
    
      public boolean isAsynchronousSending() {
        return asynchronousSending;
      }
    
      /**
       * By default, SMTAppender transmits emails asynchronously. For synchronous email transmission set
       * asynchronousSending to 'false'.
       *
       * @param asynchronousSending determines whether sending is done asynchronously or not
       * @since 1.0.4
       */
      public void setAsynchronousSending(boolean asynchronousSending) {
        this.asynchronousSending = asynchronousSending;
      }
    
      public void addTo(String to) {
        if (to == null || to.length() == 0) {
          throw new IllegalArgumentException("Null or empty <to> property");
        }
        PatternLayoutBase plb = makeNewToPatternLayout(to.trim());
        plb.setContext(context);
        plb.start();
        this.toPatternLayoutList.add(plb);
      }
    
      abstract protected PatternLayoutBase<E> makeNewToPatternLayout(String toPattern);
    
      public List<String> getToAsListOfString() {
        List<String> toList = new ArrayList<String>();
        for (PatternLayoutBase plb : toPatternLayoutList) {
          toList.add(plb.getPattern());
        }
        return toList;
      }
    
      // for testing purpose only
      public Message getMessage() {
        return mimeMsg;
      }
    
      // for testing purpose only
    
      public void setMessage(MimeMessage msg) {
        this.mimeMsg = msg;
      }
    
      public boolean isSTARTTLS() {
        return starttls;
      }
    
      public void setSTARTTLS(boolean startTLS) {
        this.starttls = startTLS;
      }
    
      public boolean isSSL() {
        return ssl;
      }
    
      public void setSSL(boolean ssl) {
        this.ssl = ssl;
      }
    
      /**
       * The <b>EventEvaluator</b> option takes a string value representing the name
       * of the class implementing the {@link EventEvaluator} interface. A
       * corresponding object will be instantiated and assigned as the event
       * evaluator for the SMTPAppender.
       */
      public void setEvaluator(EventEvaluator<E> eventEvaluator) {
        this.eventEvaluator = eventEvaluator;
      }
    
      public String getUsername() {
        return username;
      }
    
      public void setUsername(String username) {
        this.username = username;
      }
    
      public String getPassword() {
        return password;
      }
    
      public void setPassword(String password) {
        this.password = password;
      }
    
      /**
       * @return the charset encoding value
       * @see #setCharsetEncoding(String)
       */
      public String getCharsetEncoding() {
        return charsetEncoding;
      }
    
    
      public String getJndiLocation() {
        return jndiLocation;
      }
    
      /**
       * Set the location where a {@link javax.mail.Session} resource is located in JNDI. Default value is
       * "java:comp/env/mail/Session".
       *
       * @param jndiLocation
       * @since 1.0.6
       */
      public void setJndiLocation(String jndiLocation) {
        this.jndiLocation = jndiLocation;
      }
    
      public boolean isSessionViaJNDI() {
        return sessionViaJNDI;
      }
    
      /**
       * If set to true, a {@link javax.mail.Session} resource will be retrieved from JNDI. Default is false.
       *
       * @param sessionViaJNDI whether to obtain a javax.mail.Session by JNDI
       * @since 1.0.6
       */
      public void setSessionViaJNDI(boolean sessionViaJNDI) {
        this.sessionViaJNDI = sessionViaJNDI;
      }
    
      /**
       * Set the character set encoding of the outgoing email messages. The default
       * encoding is "UTF-8" which usually works well for most purposes.
       *
       * @param charsetEncoding
       */
      public void setCharsetEncoding(String charsetEncoding) {
        this.charsetEncoding = charsetEncoding;
      }
    
      public Layout<E> getLayout() {
        return layout;
      }
    
      public void setLayout(Layout<E> layout) {
        this.layout = layout;
      }
    
      class SenderRunnable implements Runnable {
    
        final CyclicBuffer<E> cyclicBuffer;
        final E e;
    
        SenderRunnable(CyclicBuffer<E> cyclicBuffer, E e) {
          this.cyclicBuffer = cyclicBuffer;
          this.e = e;
        }
    
        public void run() {
          sendBuffer(cyclicBuffer, e);
        }
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/SyslogOutputStream.java�����������0000644�0001750�0001750�00000004654�12136042272�031204� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net;
    
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.net.SocketException;
    import java.net.UnknownHostException;
    
    /**
     * SyslogOutputStream is a wrapper around the {@link DatagramSocket} class so that it
     * behaves like an {@link OutputStream}.
     */
    public class SyslogOutputStream extends OutputStream {
    
      /**
       * The maximum length after which we discard the existing string buffer and
       * start anew.
       */
      private static final int MAX_LEN = 1024;
    
      private InetAddress address;
      private DatagramSocket ds;
      private ByteArrayOutputStream baos = new ByteArrayOutputStream();
      final private int port;
    
      public SyslogOutputStream(String syslogHost, int port) throws UnknownHostException,
          SocketException {
        this.address = InetAddress.getByName(syslogHost);
        this.port = port;
        this.ds = new DatagramSocket();
      }
    
      public void write(byte[] byteArray, int offset, int len) throws IOException {
        baos.write(byteArray, offset, len);
      }
    
      public void flush() throws IOException {
        byte[] bytes = baos.toByteArray();
        DatagramPacket packet = new DatagramPacket(bytes, bytes.length, address,
            port);
    
        // clean up for next round
        if (baos.size() > MAX_LEN) {
          baos = new ByteArrayOutputStream();
        } else {
          baos.reset();
        }
        
        // after a failure, it can happen that bytes.length is zero
        // in that case, there is no point in sending out an empty message/
        if(bytes.length == 0) {
          return;
        }
        if (this.ds != null) {
          ds.send(packet);
        }
      
      }
    
      public void close() {
        address = null;
        ds = null;
      }
    
      public int getPort() {
        return port;
      }
    
      @Override
      public void write(int b) throws IOException {
        baos.write(b);
      }
    
    }
    ������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/SyslogConstants.java��������������0000644�0001750�0001750�00000007665�12136042272�030511� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net;
    
    /**
     * Constants used by syslog daemon and transitively by {@link SyslogAppenderBase}.
     * 
     * @author Ceki G&uuml;lc&uuml;
     **/
    public class SyslogConstants {
      
      static public final int SYSLOG_PORT = 514;
      
      
      // Following constants extracted from RFC 3164, we multiply them by 8
      // in order to precompute the facility part of PRI.
      // See RFC 3164, Section 4.1.1 for exact details.
    
      /** Emergency: system is unusable */
      public static final int EMERGENCY_SEVERITY = 0;       
      /** Alert: action must be taken immediately */
      public static final int ALERT_SEVERITY = 1;       
      /**  Critical: critical conditions */
      public static final int CRITICAL_SEVERITY = 2;  
      /** Error: error conditions */
      public static final int ERROR_SEVERITY = 3;  
      /** Warning: warning conditions */
      public static final int WARNING_SEVERITY = 4;  
      /** Notice: normal but significant condition */
      public static final int NOTICE_SEVERITY = 5;  
      /**  Informational: informational messages */
      public static final int INFO_SEVERITY = 6;  
      /** Debug: debug-level messages */
      public static final int DEBUG_SEVERITY = 7;  
      
      
      /** kernel messages, numerical code 0. */
      public static final int LOG_KERN = 0;
      /** user-level messages, numerical code 1. */
      public static final int LOG_USER = 1 << 3;
      /** mail system, numerical code 2. */
      public static final int LOG_MAIL = 2 << 3;
      /** system daemons, numerical code 3. */
      public static final int LOG_DAEMON = 3 << 3;
      /** security/authorization messages, numerical code 4. */
      public static final int LOG_AUTH = 4 << 3;
      /** messages generated internally by syslogd, numerical code 5. */
      public static final int LOG_SYSLOG = 5 << 3;
      /** line printer subsystem, numerical code 6. */
      public static final int LOG_LPR = 6 << 3;
      /** network news subsystem, numerical code 7. */
      public static final int LOG_NEWS = 7 << 3;
      /** UUCP subsystem, numerical code 8 */
      public static final int LOG_UUCP = 8 << 3;
      /** clock daemon, numerical code 9. */
      public static final int LOG_CRON = 9 << 3;
      /** security/authorization  messages, numerical code 10. */
      public static final int LOG_AUTHPRIV = 10 << 3;
      /** ftp daemon, numerical code 11. */
      public static final int LOG_FTP = 11 << 3;
      /** NTP subsystem, numerical code 12. */
      public static final int LOG_NTP = 12 << 3;
      /** log audit, numerical code 13. */
      public static final int LOG_AUDIT = 13 << 3;
      /** log alert, numerical code 14. */
      public static final int LOG_ALERT = 14 << 3;
      /** clock daemon, numerical code 15. */
      public static final int LOG_CLOCK = 15 << 3;
      /** reserved for local use, numerical code 16. */
      public static final int LOG_LOCAL0 = 16 << 3;
      /** reserved for local use, numerical code 17. */
      public static final int LOG_LOCAL1 = 17 << 3;
      /** reserved for local use, numerical code 18. */
      public static final int LOG_LOCAL2 = 18 << 3;
      /** reserved for local use, numerical code 19. */
      public static final int LOG_LOCAL3 = 19 << 3;
      /** reserved for local use, numerical code 20. */
      public static final int LOG_LOCAL4 = 20 << 3;
      /** reserved for local use, numerical code 21. */
      public static final int LOG_LOCAL5 = 21 << 3;
      /** reserved for local use, numerical code 22. */
      public static final int LOG_LOCAL6 = 22 << 3;
      /** reserved for local use, numerical code 23.*/
      public static final int LOG_LOCAL7 = 23 << 3;
    }
    ���������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/ssl/������������������������������0000755�0001750�0001750�00000000000�12203357067�025262� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/ssl/SSL.java����������������������0000644�0001750�0001750�00000001767�12136042272�026573� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.ssl;
    
    
    /**
     * Various constants used by the SSL implementation.
     *
     * @author Carl Harris
     */
    public interface SSL {
    
      /** Default secure transport protocol */
      String DEFAULT_PROTOCOL = "SSL";
      
      /** Default key store type */ 
      String DEFAULT_KEYSTORE_TYPE = "JKS";
      
      /** Default key store passphrase */
      String DEFAULT_KEYSTORE_PASSWORD = "changeit";
    
      /** Default secure random generator algorithm */
      String DEFAULT_SECURE_RANDOM_ALGORITHM = "SHA1PRNG";
      
    }
    ���������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000150�00000000000�011561� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/ssl/ConfigurableSSLSocketFactory.java�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/ssl/ConfigurableSSLSocketFactory.j0000644�0001750�0001750�00000006245�12136042272�033121� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.ssl;
    
    import java.io.IOException;
    import java.net.InetAddress;
    import java.net.Socket;
    import java.net.UnknownHostException;
    
    import javax.net.SocketFactory;
    import javax.net.ssl.SSLParameters;
    import javax.net.ssl.SSLSocket;
    import javax.net.ssl.SSLSocketFactory;
    
    /**
     * An {@link SSLSocketFactory} that configures SSL parameters 
     * (those covered by {@link SSLParameters}) on each newly created socket. 
     * <p>
     * When any of this factory's {@code createSocket} methods are invoked, it
     * calls on a {@link SSLSocketFactory} delegate to create the socket, and 
     * then sets the SSL parameters of the socket (using the provided 
     * configuration) before returning the socket to the caller.
     *
     * @author Carl Harris
     */
    public class ConfigurableSSLSocketFactory extends SocketFactory {
    
      private final SSLParametersConfiguration parameters;
      private final SSLSocketFactory delegate;
    
      /**
       * Creates a new factory.
       * @param parameters parameters that will be configured on each
       *    socket created by the factory
       * @param delegate socket factory that will be called upon to create
       *    sockets before configuration
       */
      public ConfigurableSSLSocketFactory(SSLParametersConfiguration parameters,
          SSLSocketFactory delegate) {
        this.parameters = parameters;
        this.delegate = delegate;
      }
    
      /**
       * {@inheritDoc}
       */
      @Override
      public Socket createSocket(InetAddress address, int port,
          InetAddress localAddress, int localPort) throws IOException {
        SSLSocket socket = (SSLSocket) delegate.createSocket(address, port, 
            localAddress, localPort);
        parameters.configure(new SSLConfigurableSocket(socket));
        return socket;
      }
    
      /**
       * {@inheritDoc}
       */
      @Override
      public Socket createSocket(InetAddress host, int port) throws IOException {
        SSLSocket socket = (SSLSocket) delegate.createSocket(host, port);
        parameters.configure(new SSLConfigurableSocket(socket));
        return socket;
      }
    
      /**
       * {@inheritDoc}
       */
      @Override
      public Socket createSocket(String host, int port, InetAddress localHost,
          int localPort) throws IOException, UnknownHostException {
        SSLSocket socket = (SSLSocket) delegate.createSocket(host, port, 
            localHost, localPort);
        parameters.configure(new SSLConfigurableSocket(socket));
        return socket;
      }
    
      /**
       * {@inheritDoc}
       */
      @Override
      public Socket createSocket(String host, int port) throws IOException,
          UnknownHostException {
        SSLSocket socket = (SSLSocket) delegate.createSocket(host, port);
        parameters.configure(new SSLConfigurableSocket(socket));
        return socket;
      }
      
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000147�00000000000�011567� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/ssl/SSLConfigurableServerSocket.java��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/ssl/SSLConfigurableServerSocket.ja0000644�0001750�0001750�00000003261�12136042272�033114� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.ssl;
    
    import javax.net.ssl.SSLServerSocket;
    
    /**
     * An {@link SSLConfigurable} wrapper for an {@link SSLServerSocket}.
     *
     * @author Carl Harris
     */
    public class SSLConfigurableServerSocket implements SSLConfigurable {
    
      private final SSLServerSocket delegate;
    
      public SSLConfigurableServerSocket(SSLServerSocket delegate) {
        this.delegate = delegate;
      }
    
      public String[] getDefaultProtocols() {
        return delegate.getEnabledProtocols();
      }
    
      public String[] getSupportedProtocols() {
        return delegate.getSupportedProtocols();
      }
    
      public void setEnabledProtocols(String[] protocols) {
        delegate.setEnabledProtocols(protocols);
      }
    
      public String[] getDefaultCipherSuites() {
        return delegate.getEnabledCipherSuites();
      }
    
      public String[] getSupportedCipherSuites() {
        return delegate.getSupportedCipherSuites();
      }
    
      public void setEnabledCipherSuites(String[] suites) {
        delegate.setEnabledCipherSuites(suites);
      }
    
      public void setNeedClientAuth(boolean state) {
        delegate.setNeedClientAuth(state);
      }
    
      public void setWantClientAuth(boolean state) {
        delegate.setWantClientAuth(state);
      }
      
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/ssl/package.html������������������0000644�0001750�0001750�00000001272�12136042145�027536� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
    <html> 
      <head>
        <title></title>
      </head>
      <body>
        <p>Contains classes that create and configure a JSSE SSLContext needed
           for secure transport of logging events by SSLSocketAppender.</p>
        <p>The central class in this package is SSLConfiguration, which 
           provides a factory method for the SSLContext and SSLParameters 
           objects.  Other classes are factory beans, which are designed to
           hold the various configurable properties of the components used in
           creating an SSLContext, and to create the relevant component when
           needed during the assembly of the context.</p>
      </body> 
    </html>
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/ssl/SecureRandomFactoryBean.java��0000644�0001750�0001750�00000006466�12136042272�032640� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.ssl;
    
    import java.security.NoSuchAlgorithmException;
    import java.security.NoSuchProviderException;
    import java.security.SecureRandom;
    
    /**
     * A factory bean for a JCA {@link SecureRandom} generator.
     * <p>
     * This object holds the configurable properties of a secure random generator
     * and uses them to create and load a {@link SecureRandom} instance.
     *
     * @author Carl Harris
     */
    public class SecureRandomFactoryBean {
    
      private String algorithm;
      private String provider;
    
      /**
       * Creates a new {@link SecureRandom} generator using the receiver's 
       * configuration.
       * @return secure random generator instance
       * @throws NoSuchProviderException if the provider name specified by
       *    {@link #setProvider(String)} is not known to the platform
       * @throws NoSuchAlgorithmException if the algorithm name specified by
       *    {@link #setAlgorithm(String)} is not recognized by the specified
       *    provider (or the platform's default provider if the provider isn't 
       *    specified)
       */
      public SecureRandom createSecureRandom() throws NoSuchProviderException, 
          NoSuchAlgorithmException {
        try {
          return getProvider() != null ?
              SecureRandom.getInstance(getAlgorithm(), getProvider())
              : SecureRandom.getInstance(getAlgorithm());
        }
        catch (NoSuchProviderException ex) {
          throw new NoSuchProviderException("no such secure random provider: "
              + getProvider());      
        }
        catch (NoSuchAlgorithmException ex) {
          throw new NoSuchAlgorithmException("no such secure random algorithm: "
              + getAlgorithm());      
        }
      }
      
      /**
       * Gets the secure random generator algorithm name. 
       * @return an algorithm name (e.g. {@code SHA1PRNG}); the 
       *    {@link SSL#DEFAULT_SECURE_RANDOM_ALGORITHM} is returned if no algorithm has been
       *    specified
       */
      public String getAlgorithm() {
        if (algorithm == null) {
          return SSL.DEFAULT_SECURE_RANDOM_ALGORITHM;
        }
        return algorithm;
      }
    
      /**
       * Sets the secure random generator algorithm name.
       * @param algorithm an algorithm name, which must be recognized by the
       *    provider specified via {@link #setProvider(String)} or by the
       *    platform's default provider if no provider is specified.
       */
      public void setAlgorithm(String algorithm) {
        this.algorithm = algorithm;
      }
    
      /**
       * Gets the JCA provider name for the secure random generator.
       * @return provider name
       */
      public String getProvider() {
        return provider;
      }
    
      /**
       * Sets the JCA provider name for the secure random generator.
       * @param provider name of the JCA provider to utilize in creating the
       *    secure random generator
       */
      public void setProvider(String provider) {
        this.provider = provider;
      }
    
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000150�00000000000�011561� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/ssl/KeyManagerFactoryFactoryBean.java�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/ssl/KeyManagerFactoryFactoryBean.j0000644�0001750�0001750�00000005745�12136042272�033133� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.ssl;
    
    import java.security.NoSuchAlgorithmException;
    import java.security.NoSuchProviderException;
    
    import javax.net.ssl.KeyManagerFactory;
    
    /**
     * A factory bean for a JSSE {@link KeyManagerFactory}.
     * <p>
     * This object holds the configurable properties of a key manager factory
     * and uses them to create and load a {@link KeyManagerFactory} instance.
     *
     * @author Carl Harris
     */
    public class KeyManagerFactoryFactoryBean {
    
      private String algorithm;
      private String provider;
    
      /**
       * Creates a {@link KeyManagerFactory} using the receiver's configuration.
       * @return factory object
       * @throws NoSuchProviderException if the provider specified by 
       *    {@link #setProvider(String)} is not known to the platform
       * @throws NoSuchAlgorithmException if the algorithm specified by
       *    {@link #setAlgorithm(String)} is not known to the specified provider
       *    (or to the default platform provider if no provider is specified)
       */
      public KeyManagerFactory createKeyManagerFactory() 
          throws NoSuchProviderException, NoSuchAlgorithmException {
        
        return getProvider() != null ?
            KeyManagerFactory.getInstance(getAlgorithm(), getProvider())
            : KeyManagerFactory.getInstance(getAlgorithm());
      }
      
      /**
       * Gets the algorithm name for the key manager factory.
       * @return algorithm name (e.g. {@code SunX509}); the default algorithm
       *    (obtained from {@link KeyManagerFactory#getDefaultAlgorithm()})
       *    is returned if no algorithm has been configured
       */
      public String getAlgorithm() {
        if (algorithm == null) {
          return KeyManagerFactory.getDefaultAlgorithm();
        }
        return algorithm;
      }
    
      /**
       * Sets the algorithm name for the key manager factory.
       * @param algorithm an algorithm name, which must be recognized by the
       *    provider specified by {@link #setProvider(String)} or by the 
       *    platform's default provider if no provider is specified. 
       */
      public void setAlgorithm(String algorithm) {
        this.algorithm = algorithm;
      }
    
      /**
       * Gets the JSSE provider name for the key manager factory.
       * @return provider name
       */
      public String getProvider() {
        return provider;
      }
    
      /**
       * Sets the JSSE provider name for the key manager factory.
       * @param provider name of the JSSE provider to utilize in creating the
       *    key manager factory
       */
      public void setProvider(String provider) {
        this.provider = provider;
      }
    
    }
    ���������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000152�00000000000�011563� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/ssl/TrustManagerFactoryFactoryBean.java�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/ssl/TrustManagerFactoryFactoryBean0000644�0001750�0001750�00000006004�12136042272�033261� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.ssl;
    
    import java.security.NoSuchAlgorithmException;
    import java.security.NoSuchProviderException;
    
    import javax.net.ssl.TrustManagerFactory;
    
    /**
     * A factory bean for a JSSE {@link TrustManagerFactory}.
     * <p>
     * This object holds the configurable properties of a trust manager factory
     * and uses them to create and load a {@link TrustManagerFactory} instance.
     *
     * @author Carl Harris
     */
    public class TrustManagerFactoryFactoryBean {
    
      private String algorithm;
      private String provider;
    
      /**
       * Creates a {@link TrustManagerFactory} using the receiver's configuration.
       * @return factory object
       * @throws NoSuchProviderException if the provider specified by 
       *    {@link #setProvider(String)} is not known to the platform
       * @throws NoSuchAlgorithmException if the algorithm specified by
       *    {@link #setAlgorithm(String)} is not known to the specified provider
       *    (or to the default platform provider if no provider is specified)
       */
      public TrustManagerFactory createTrustManagerFactory() 
          throws NoSuchProviderException, NoSuchAlgorithmException {
        
        return getProvider() != null ?
            TrustManagerFactory.getInstance(getAlgorithm(), getProvider())
            : TrustManagerFactory.getInstance(getAlgorithm());
      }
      
      /**
       * Gets the algorithm name for the trust manager factory.
       * @return algorithm name (e.g. {@code PKIX}); the default algorithm
       *    (obtained from {@link TrustManagerFactory#getDefaultAlgorithm()})
       *    is returned if no algorithm has been configured
       */
      public String getAlgorithm() {
        if (algorithm == null) {
          return TrustManagerFactory.getDefaultAlgorithm();
        }
        return algorithm;
      }
    
      /**
       * Sets the algorithm name for the trust manager factory.
       * @param algorithm an algorithm name, which must be recognized by the
       *    provider specified by {@link #setProvider(String)} or by the 
       *    platform's default provider if no provider is specified. 
       */
      public void setAlgorithm(String algorithm) {
        this.algorithm = algorithm;
      }
    
      /**
       * Gets the JSSE provider name for the trust manager factory.
       * @return provider name
       */
      public String getProvider() {
        return provider;
      }
    
      /**
       * Sets the JSSE provider name for the trust manager factory.
       * @param provider name of the JSSE provider to utilize in creating the
       *    trust manager factory
       */
      public void setProvider(String provider) {
        this.provider = provider;
      }
    
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/ssl/SSLComponent.java�������������0000644�0001750�0001750�00000001362�12136042272�030445� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.ssl;
    
    /**
     * A interface used to identify components that have an SSL configuration.
     *
     * @author Carl Harris
     */
    public interface SSLComponent {
    
      SSLConfiguration getSsl();
      
      void setSsl(SSLConfiguration ssl);
      
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/ssl/SSLConfiguration.java���������0000644�0001750�0001750�00000002535�12136042272�031315� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.ssl;
    
    import javax.net.ssl.SSLContext;
    
    /**
     * A configuration for an {@link SSLContext}.
     * <p> 
     *
     * @author Carl Harris
     */
    public class SSLConfiguration extends SSLContextFactoryBean {
    
      private SSLParametersConfiguration parameters;
    
      /**
       * Gets the SSL parameters configuration.
       * @return parameters configuration; if no parameters object was
       *    configured, a default parameters object is returned
       */
      public SSLParametersConfiguration getParameters() {
        if (parameters == null) {
          parameters = new SSLParametersConfiguration();
        }
        return parameters;
      }
    
      /**
       * Sets the SSL parameters configuration.
       * @param parameters the parameters configuration to set
       */
      public void setParameters(SSLParametersConfiguration parameters) {
        this.parameters = parameters;
      }
    
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/ssl/SSLConfigurableSocket.java����0000644�0001750�0001750�00000003215�12136042272�032253� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.ssl;
    
    import javax.net.ssl.SSLSocket;
    
    /**
     * An {@link SSLConfigurable} wrapper for an {@link SSLSocket}.
     *
     * @author Carl Harris
     */
    public class SSLConfigurableSocket implements SSLConfigurable {
    
      private final SSLSocket delegate;
    
      public SSLConfigurableSocket(SSLSocket delegate) {
        this.delegate = delegate;
      }
    
      public String[] getDefaultProtocols() {
        return delegate.getEnabledProtocols();
      }
    
      public String[] getSupportedProtocols() {
        return delegate.getSupportedProtocols();
      }
    
      public void setEnabledProtocols(String[] protocols) {
        delegate.setEnabledProtocols(protocols);
      }
    
      public String[] getDefaultCipherSuites() {
        return delegate.getEnabledCipherSuites();
      }
    
      public String[] getSupportedCipherSuites() {
        return delegate.getSupportedCipherSuites();
      }
    
      public void setEnabledCipherSuites(String[] suites) {
        delegate.setEnabledCipherSuites(suites);
      }
    
      public void setNeedClientAuth(boolean state) {
        delegate.setNeedClientAuth(state);
      }
    
      public void setWantClientAuth(boolean state) {
        delegate.setWantClientAuth(state);
      }
      
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/ssl/SSLConfigurable.java����������0000644�0001750�0001750�00000005270�12136042272�031105� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.ssl;
    
    /**
     * An object that has configurable SSL parameters.
     * <p>
     * This interface allows us o decouple the {@link SSLParametersConfiguration}
     * from {@link SSLSocket} and {@link SSLServerSocket} to facilitate unit
     * testing.
     *
     * @author Carl Harris
     */
    public interface SSLConfigurable {
    
      /**
       * Gets the set of protocols that the SSL component enables by default.
       * 
       * @return protocols (generally a subset of the set returned by
       *    {@link #getSupportedProtocols()}); the return value may be 
       *    an empty array but must never be {@code null}.
       */
      String[] getDefaultProtocols();
    
      /**
       * Gets the set of protocols that the SSL component supports.
       * @return protocols supported protocols; the return value may be 
       *    an empty array but must never be {@code null}.
       */
      String[] getSupportedProtocols();
    
      /**
       * Sets the enabled protocols on the SSL component.
       * @param cipherSuites the protocols to enable
       */
      void setEnabledProtocols(String[] protocols);
    
      /**
       * Gets the set of cipher suites that the SSL component enables by default.
       * 
       * @return cipher suites (generally a subset of the set returned by
       *    {@link #getSupportedCipherSuites()}); the return value may be 
       *    an empty array but must never be {@code null}
       */
      String[] getDefaultCipherSuites();
      
      /**
       * Gets the set of cipher suites that the SSL component supports.
       * @return supported cipher suites; the return value may be 
       *    an empty array but must never be {@code null}
       */
      String[] getSupportedCipherSuites();
      
      /**
       * Sets the enabled cipher suites on the SSL component.
       * @param cipherSuites the cipher suites to enable
       */
      void setEnabledCipherSuites(String[] cipherSuites);
      
      /**
       * Sets a flag indicating whether the SSL component should require 
       * client authentication.
       * @param state the flag state to set
       */
      void setNeedClientAuth(boolean state);
      
      /**
       * Sets a flag indicating whether the SSL component should request 
       * client authentication.
       * @param state the flag state to set
       */
      void setWantClientAuth(boolean state);
      
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000153�00000000000�011564� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/ssl/SSLNestedComponentRegistryRules.java����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/ssl/SSLNestedComponentRegistryRule0000644�0001750�0001750�00000003052�12136042272�033247� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.ssl;
    
    import ch.qos.logback.core.joran.spi.DefaultNestedComponentRegistry;
    
    /**
     * Nested component registry rules for {@link SSLConfiguration} and its
     * components.
     *
     * @author Carl Harris
     */
    public class SSLNestedComponentRegistryRules {
    
      static public void addDefaultNestedComponentRegistryRules(
          DefaultNestedComponentRegistry registry) {
        registry.add(SSLComponent.class, "ssl", SSLConfiguration.class);
        registry.add(SSLConfiguration.class, "parameters", 
            SSLParametersConfiguration.class);
        registry.add(SSLConfiguration.class, "keyStore", 
            KeyStoreFactoryBean.class);
        registry.add(SSLConfiguration.class, "trustStore", 
            KeyStoreFactoryBean.class);
        registry.add(SSLConfiguration.class, "keyManagerFactory", 
            KeyManagerFactoryFactoryBean.class);
        registry.add(SSLConfiguration.class, "trustManagerFactory", 
            TrustManagerFactoryFactoryBean.class);
        registry.add(SSLConfiguration.class, "secureRandom", 
            SecureRandomFactoryBean.class);
      }
    
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/ssl/SSLContextFactoryBean.java����0000644�0001750�0001750�00000030431�12137261421�032244� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.ssl;
    
    import java.security.KeyManagementException;
    import java.security.KeyStore;
    import java.security.KeyStoreException;
    import java.security.NoSuchAlgorithmException;
    import java.security.NoSuchProviderException;
    import java.security.SecureRandom;
    import java.security.UnrecoverableKeyException;
    import java.security.cert.CertificateException;
    
    import javax.net.ssl.KeyManager;
    import javax.net.ssl.KeyManagerFactory;
    import javax.net.ssl.SSLContext;
    import javax.net.ssl.TrustManager;
    import javax.net.ssl.TrustManagerFactory;
    
    import ch.qos.logback.core.spi.ContextAware;
    
    /**
     * A factory bean for a JSSE {@link SSLContext}.
     * <p>
     * This object holds the configurable properties for an SSL context and uses
     * them to create an {@link SSLContext} instance.
     *
     * @author Carl Harris
     */
    public class SSLContextFactoryBean {
        
      private static final String JSSE_KEY_STORE_PROPERTY = "javax.net.ssl.keyStore";
      private static final String JSSE_TRUST_STORE_PROPERTY = "javax.net.ssl.trustStore";
      
      private KeyStoreFactoryBean keyStore;
      private KeyStoreFactoryBean trustStore;
      private SecureRandomFactoryBean secureRandom;
      private KeyManagerFactoryFactoryBean keyManagerFactory;
      private TrustManagerFactoryFactoryBean trustManagerFactory;
      private String protocol;
      private String provider;
    
      /**
       * Creates a new {@link SSLContext} using the receiver's configuration.
       * @param context context for status messages
       * @return {@link SSLContext} object
       * @throws NoSuchProviderException if a provider specified for one of the
       *    JCA or JSSE components utilized in creating the context is not
       *    known to the platform
       * @throws NoSuchAlgorithmException if a JCA or JSSE algorithm, protocol, 
       *    or type name specified for one of the context's components is not
       *    known to a given provider (or platform default provider for the
       *    component)
       * @throws KeyManagementException if an error occurs in creating a 
       *    {@link KeyManager} for the context
       * @throws UnrecoverableKeyException if a private key needed by a 
       *    {@link KeyManager} cannot be obtained from a key store
       * @throws KeyStoreException if an error occurs in reading the
       *    contents of a key store
       * @throws CertificateException if an error occurs in reading the
       *    contents of a certificate
       */
      public SSLContext createContext(ContextAware context) throws NoSuchProviderException, 
          NoSuchAlgorithmException, KeyManagementException, 
          UnrecoverableKeyException, KeyStoreException, CertificateException {
        
        SSLContext sslContext = getProvider() != null ?
            SSLContext.getInstance(getProtocol(), getProvider())
            : SSLContext.getInstance(getProtocol());
        
        context.addInfo("SSL protocol '" + sslContext.getProtocol() 
            + "' provider '" + sslContext.getProvider() + "'");
        
        KeyManager[] keyManagers = createKeyManagers(context);
        TrustManager[] trustManagers = createTrustManagers(context);
        SecureRandom secureRandom = createSecureRandom(context);
        sslContext.init(keyManagers, trustManagers, secureRandom);
        return sslContext;
      }
      
      /**
       * Creates key managers using the receiver's key store configuration.
       * @param context context for status messages
       * @return an array of key managers or {@code null} if no key store
       *    configuration was provided
       * @throws NoSuchProviderException if a provider specified for one
       *    of the key manager components is not known to the platform
       * @throws NoSuchAlgorithmException if an algorithm specified for
       *    one of the key manager components is not known to the relevant
       *    provider
       * @throws KeyStoreException if an error occurs in reading a key store
       */
      private KeyManager[] createKeyManagers(ContextAware context) 
          throws NoSuchProviderException, NoSuchAlgorithmException, 
          UnrecoverableKeyException, KeyStoreException {
        
        if (getKeyStore() == null) return null;
        
        KeyStore keyStore = getKeyStore().createKeyStore();
        context.addInfo(
            "key store of type '" + keyStore.getType() 
            + "' provider '" + keyStore.getProvider()
            + "': " + getKeyStore().getLocation());          
    
        KeyManagerFactory kmf = getKeyManagerFactory().createKeyManagerFactory();
        context.addInfo("key manager algorithm '" + kmf.getAlgorithm() 
            + "' provider '" + kmf.getProvider() + "'");
        
        char[] passphrase = getKeyStore().getPassword().toCharArray();
        kmf.init(keyStore, passphrase);
        return kmf.getKeyManagers();
      }
      
      /**
       * Creates trust managers using the receiver's trust store configuration.
       * @param context context for status messages
       * @return an array of trust managers or {@code null} if no trust store
       *    configuration was provided
       * @throws NoSuchProviderException if a provider specified for one
       *    of the trust manager components is not known to the platform
       * @throws NoSuchAlgorithmException if an algorithm specified for
       *    one of the trust manager components is not known to the relevant
       *    provider
       * @throws KeyStoreException if an error occurs in reading a key
       *    store containing trust anchors 
       */
      private TrustManager[] createTrustManagers(ContextAware context) 
          throws NoSuchProviderException, NoSuchAlgorithmException, 
          KeyStoreException {
        
        if (getTrustStore() == null) return null;
        
        KeyStore trustStore = getTrustStore().createKeyStore();
        context.addInfo(
            "trust store of type '" + trustStore.getType() 
            + "' provider '" + trustStore.getProvider()
            + "': " + getTrustStore().getLocation());          
        
        TrustManagerFactory tmf = getTrustManagerFactory()
            .createTrustManagerFactory();
        context.addInfo("trust manager algorithm '" + tmf.getAlgorithm() 
            + "' provider '" + tmf.getProvider() + "'");
        
        tmf.init(trustStore);
        return tmf.getTrustManagers();
      }
    
      private SecureRandom createSecureRandom(ContextAware context) 
          throws NoSuchProviderException, NoSuchAlgorithmException {
        
        SecureRandom secureRandom = getSecureRandom().createSecureRandom();
        context.addInfo("secure random algorithm '" + secureRandom.getAlgorithm()
            + "' provider '" + secureRandom.getProvider() + "'");
        
        return secureRandom;
      }
    
      /**
       * Gets the key store configuration.
       * @return key store factory bean or {@code null} if no key store 
       *    configuration was provided
       */
      public KeyStoreFactoryBean getKeyStore() {
        if (keyStore == null) { 
          keyStore = keyStoreFromSystemProperties(JSSE_KEY_STORE_PROPERTY);
        }
        return keyStore;
      }
    
      /**
       * Sets the key store configuration.
       * @param keyStore the key store factory bean to set
       */
      public void setKeyStore(KeyStoreFactoryBean keyStore) {
        this.keyStore = keyStore;
      }
    
      /**
       * Gets the trust store configuration.
       * @return trust store factory bean or {@code null} if no trust store 
       *    configuration was provided
       */
      public KeyStoreFactoryBean getTrustStore() {
        if (trustStore == null) {
          trustStore = keyStoreFromSystemProperties(JSSE_TRUST_STORE_PROPERTY);
        }
        return trustStore;
      }
    
      /**
       * Sets the trust store configuration.
       * @param trustStore the trust store factory bean to set
       */
      public void setTrustStore(KeyStoreFactoryBean trustStore) {
        this.trustStore = trustStore;
      }
    
      /**
       * Constructs a key store factory bean using JSSE system properties.
       * @param property base property name (e.g. {@code javax.net.ssl.keyStore})
       * @return key store or {@code null} if no value is defined for the
       *    base system property name
       */
      private KeyStoreFactoryBean keyStoreFromSystemProperties(String property) {
        if (System.getProperty(property) == null) return null;
        KeyStoreFactoryBean keyStore = new KeyStoreFactoryBean();
        keyStore.setLocation(locationFromSystemProperty(property));
        keyStore.setProvider(System.getProperty(property + "Provider"));
        keyStore.setPassword(System.getProperty(property + "Password"));
        keyStore.setType(System.getProperty(property + "Type"));
        return keyStore;
      }
    
      /**
       * Constructs a resource location from a JSSE system property.
       * @param name property name (e.g. {@code javax.net.ssl.keyStore})
       * @return URL for the location specified in the property or {@code null}
       *    if no value is defined for the property
       */
      private String locationFromSystemProperty(String name) {
        String location = System.getProperty(name);
        if (location != null && !location.startsWith("file:")) {
          location = "file:" + location;
        }
        return location;
      }
    
      /**
       * Gets the secure random generator configuration.
       * @return secure random factory bean; if no secure random generator 
       *    configuration has been set, a default factory bean is returned
       */
      public SecureRandomFactoryBean getSecureRandom() {
        if (secureRandom == null) {
          return new SecureRandomFactoryBean();
        }
        return secureRandom;
      }
    
      /**
       * Sets the secure random generator configuration.
       * @param secureRandom the secure random factory bean to set
       */
      public void setSecureRandom(SecureRandomFactoryBean secureRandom) {
        this.secureRandom = secureRandom;
      }
    
      /**
       * Gets the key manager factory configuration.
       * @return factory bean; if no key manager factory 
       *    configuration has been set, a default factory bean is returned
       */
      public KeyManagerFactoryFactoryBean getKeyManagerFactory() {
        if (keyManagerFactory == null) {
          return new KeyManagerFactoryFactoryBean();
        }
        return keyManagerFactory;
      }
    
      /**
       * Sets the key manager factory configuration.
       * @param keyManagerFactory the key manager factory factory bean to set
       */
      public void setKeyManagerFactory(
          KeyManagerFactoryFactoryBean keyManagerFactory) {
        this.keyManagerFactory = keyManagerFactory;
      }
    
      /**
       * Gets the trust manager factory configuration.
       * @return factory bean; if no trust manager factory 
       *    configuration has been set, a default factory bean is returned
       */
      public TrustManagerFactoryFactoryBean getTrustManagerFactory() {
        if (trustManagerFactory == null) {
          return new TrustManagerFactoryFactoryBean();
        }
        return trustManagerFactory;
      }
    
      /**
       * Sets the trust manager factory configuration.
       * @param trustManagerFactory the factory bean to set
       */
      public void setTrustManagerFactory(
          TrustManagerFactoryFactoryBean trustManagerFactory) {
        this.trustManagerFactory = trustManagerFactory;
      }
    
      /**
       * Gets the secure transport protocol name.
       * @return protocol name (e.g. {@code SSL}, {@code TLS}); the
       *    {@link SSL#DEFAULT_PROTOCOL} is returned if no protocol has been
       *    configured
       */
      public String getProtocol() {
        if (protocol == null) {
          return SSL.DEFAULT_PROTOCOL;
        }
        return protocol;
      }
    
      /**
       * Sets the secure transport protocol name.
       * @param protocol a protocol name, which must be recognized by the provider
       *    specified by {@link #setProvider(String)} or by the platform's
       *    default provider if no platform was specified.
       */
      public void setProtocol(String protocol) {
        this.protocol = protocol;
      }
    
      /**
       * Gets the JSSE provider name for the SSL context.
       * @return JSSE provider name
       */
      public String getProvider() {
        return provider;
      }
    
      /**
       * Sets the JSSE provider name for the SSL context.
       * @param provider name of the JSSE provider to use in creating the
       *    SSL context
       */
      public void setProvider(String provider) {
        this.provider = provider;
      }
    
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000156�00000000000�011567� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/ssl/ConfigurableSSLServerSocketFactory.java�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/ssl/ConfigurableSSLServerSocketFac0000644�0001750�0001750�00000005554�12136042272�033144� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.ssl;
    
    import java.io.IOException;
    import java.net.InetAddress;
    import java.net.ServerSocket;
    
    import javax.net.ServerSocketFactory;
    import javax.net.ssl.SSLServerSocket;
    import javax.net.ssl.SSLServerSocketFactory;
    
    /**
     * An {@link SSLServerSocketFactory} that configures SSL parameters 
     * (those specified in {@link SSLParametersConfiguration) on each newly 
     * created socket. 
     * <p>
     * When any of this factory's {@code createServerSocket} methods are invoked, 
     * it calls on a delegate {@link SSLServerSocketFactory} to create the socket, 
     * and then sets the SSL parameters of the socket (using the provided 
     * configuration) before returning the socket to the caller.
     *
     * @author Carl Harris
     */
    public class ConfigurableSSLServerSocketFactory extends ServerSocketFactory {
    
      private final SSLParametersConfiguration parameters;
      private final SSLServerSocketFactory delegate;
    
      /**
       * Creates a new factory.
       * @param parameters parameters that will be configured on each
       *    socket created by the factory
       * @param delegate socket factory that will be called upon to create
       *    server sockets before configuration
       */
      public ConfigurableSSLServerSocketFactory(
          SSLParametersConfiguration parameters, SSLServerSocketFactory delegate) {
        this.parameters = parameters;
        this.delegate = delegate;
      }
    
      /**
       * {@inheritDoc}
       */
      @Override
      public ServerSocket createServerSocket(int port, int backlog, InetAddress ifAddress)
          throws IOException {
        SSLServerSocket socket = (SSLServerSocket) delegate.createServerSocket(
            port, backlog, ifAddress);
        parameters.configure(new SSLConfigurableServerSocket(socket));
        return socket;
      }
    
      /**
       * {@inheritDoc}
       */
      @Override
      public ServerSocket createServerSocket(int port, int backlog)
          throws IOException {
        SSLServerSocket socket = (SSLServerSocket) delegate.createServerSocket(
            port, backlog);
        parameters.configure(new SSLConfigurableServerSocket(socket));
        return socket;
      }
    
      /**
       * {@inheritDoc}
       */
      @Override
      public ServerSocket createServerSocket(int port) throws IOException {
        SSLServerSocket socket = (SSLServerSocket) delegate.createServerSocket(
            port);
        parameters.configure(new SSLConfigurableServerSocket(socket));
        return socket;
      }
    
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/ssl/KeyStoreFactoryBean.java������0000644�0001750�0001750�00000013171�12136042272�032005� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.ssl;
    
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.URL;
    import java.security.KeyStore;
    import java.security.KeyStoreException;
    import java.security.NoSuchAlgorithmException;
    import java.security.NoSuchProviderException;
    
    import ch.qos.logback.core.util.LocationUtil;
    
    
    /**
     * A factory bean for a JCA {@link KeyStore}.
     * <p>
     * This object holds the configurable properties of a key store and uses
     * them to create and load a {@link KeyStore} instance.
     *
     * @author Carl Harris
     */
    public class KeyStoreFactoryBean {
    
      private String location;
      private String provider;
      private String type;
      private String password;
    
      /**
       * Creates a new {@link KeyStore} using the receiver's configuration.
       * @return key store
       * @throws NoSuchProviderException if the provider specified by 
       *    {@link #setProvider(String)} is not known to the platform
       * @throws NoSuchAlgorithmException if the key store type specified by
       *    {@link #setType(String)} is not known to the specified provider
       *    (or the platform's default provider if the provider isn't specified)
       * @throws KeyStoreException if some other error occurs in loading
       *    the key store from the resource specified by 
       *    {@link #setLocation(String)}
       */
      public KeyStore createKeyStore() throws NoSuchProviderException, 
          NoSuchAlgorithmException, KeyStoreException {
        
        if (getLocation() == null) {
          throw new IllegalArgumentException("location is required");
        }
        
        InputStream inputStream = null;
        try {
          URL url = LocationUtil.urlForResource(getLocation());
          inputStream = url.openStream();
          KeyStore keyStore = newKeyStore();
          keyStore.load(inputStream, getPassword().toCharArray());
          return keyStore;
        }
        catch (NoSuchProviderException ex) {
          throw new NoSuchProviderException("no such keystore provider: " 
                + getProvider());
        }
        catch (NoSuchAlgorithmException ex) {
          throw new NoSuchAlgorithmException("no such keystore type: "
              + getType());
        }
        catch (FileNotFoundException ex) {
          throw new KeyStoreException(getLocation() + ": file not found");
        }
        catch (Exception ex) {
          throw new KeyStoreException(getLocation() + ": " + ex.getMessage(), ex);
        }
        finally {
          try {
            if (inputStream != null) {
              inputStream.close();
            }
          }
          catch (IOException ex) {
            ex.printStackTrace(System.err);
          }
        }
      }
      
      /**
       * Invokes the appropriate JCE factory method to obtain a new
       * {@link KeyStore} object.
       */
      private KeyStore newKeyStore() throws NoSuchAlgorithmException, 
          NoSuchProviderException, KeyStoreException {
        
        return getProvider() != null ? 
            KeyStore.getInstance(getType(), getProvider()) 
            : KeyStore.getInstance(getType());        
      }
    
      /**
       * Gets the location of the key store resource.
       * @return a String containing a URL for the resource
       */
      public String getLocation() {
        return location;
      }
    
      /**
       * Sets the location of the key store resource.
       * @param location a String containing a URL for the resource; if the 
       *    URL string isn't prefixed by a scheme, the path is assumed to be 
       *    relative to the root of the classpath.
       */
      public void setLocation(String location) {
        this.location = location;
      }
    
      /**
       * Gets the type of key store to load.
       * @return a key store type name (e.g. {@code JKS}); the 
       *    {@link SSL#DEFAULT_KEYSTORE_TYPE} is returned if no type has been configured
       */
      public String getType() {
        if (type == null) {
          return SSL.DEFAULT_KEYSTORE_TYPE;
        }
        return type;
      }
    
      /**
       * Sets the type of key store to load.
       * @param type a key store type name (e.g. {@code JKS}, {@code PKCS12});
       *    the type specified must be supported by the provider specified by
       *    {@link #setProvider(String)} or by the platform's default provider
       *    if no provider is specified
       */
      public void setType(String type) {
        this.type = type;
      }
    
      /**
       * Gets the JCA key store provider name.
       * @return provider name or {@code null} if no provider has been configured
       */
      public String getProvider() {
        return provider;
      }
    
      /**
       * Sets the JCA key store provider name.
       * @param provider name of the JCA provider to utilize in creating the
       *    key store
       */
      public void setProvider(String provider) {
        this.provider = provider;
      }
    
      /**
       * Gets the password to use to access the key store.
       * @return password string; the {@link SSL#DEFAULT_KEYSTORE_PASSWORD} is returned
       *    if no password has been configured
       */
      public String getPassword() {
        if (password == null) {
          return SSL.DEFAULT_KEYSTORE_PASSWORD;
        }
        return password;
      }
    
      /**
       * Sets the password to use to access the keystore.
       * @param password the password to set
       */
      public void setPassword(String password) {
        this.password = password;
      }
    
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000146�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/ssl/SSLParametersConfiguration.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/ssl/SSLParametersConfiguration.jav0000644�0001750�0001750�00000021331�12136042272�033173� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.ssl;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    
    import javax.net.ssl.SSLEngine;
    
    import org.codehaus.janino.Java;
    
    import ch.qos.logback.core.spi.ContextAwareBase;
    import ch.qos.logback.core.util.OptionHelper;
    import ch.qos.logback.core.util.StringCollectionUtil;
    
    
    /**
     * A configuration of SSL parameters for an {@link SSLEngine}.
     *
     * @author Carl Harris
     */
    public class SSLParametersConfiguration extends ContextAwareBase {
    
      private String includedProtocols;
      private String excludedProtocols;
      private String includedCipherSuites;
      private String excludedCipherSuites;
      private Boolean needClientAuth;
      private Boolean wantClientAuth;
      private String[] enabledProtocols;
      private String[] enabledCipherSuites;
      
      /**
       * Configures SSL parameters on an {@link SSLConfigurable}.
       * @param socket the subject configurable
       */
      public void configure(SSLConfigurable socket) {
        socket.setEnabledProtocols(enabledProtocols(
            socket.getSupportedProtocols(), socket.getDefaultProtocols()));
        socket.setEnabledCipherSuites(enabledCipherSuites(
            socket.getSupportedCipherSuites(), socket.getDefaultCipherSuites()));
        if (isNeedClientAuth() != null) {
          socket.setNeedClientAuth(isNeedClientAuth());
        }
        if (isWantClientAuth() != null) {
          socket.setWantClientAuth(isWantClientAuth());
        }
      }
      
      /**
       * Gets the set of enabled protocols based on the configuration.
       * @param supportedProtocols protocols supported by the SSL engine 
       * @param defaultProtocols default protocols enabled by the SSL engine
       * @return enabled protocols
       */
      private String[] enabledProtocols(String[] supportedProtocols,
          String[] defaultProtocols) {
        if (enabledProtocols == null) {
          // we're assuming that the same engine is used for all configurables
          // so once we determine the enabled set, we won't do it again
          if (OptionHelper.isEmpty(getIncludedProtocols())
              && OptionHelper.isEmpty(getExcludedProtocols())) {
            enabledProtocols = Arrays.copyOf(defaultProtocols, 
                defaultProtocols.length);
          }
          else {
            enabledProtocols = includedStrings(supportedProtocols, 
                getIncludedProtocols(), getExcludedProtocols());
          }
          for (String protocol : enabledProtocols) {
            addInfo("enabled protocol: " + protocol);
           }
        }
        return enabledProtocols;
      }
      
      /**
       * Gets the set of enabled cipher suites based on the configuration.
       * @param supportedCipherSuites cipher suites supported by the SSL engine 
       * @param defaultCipherSuites default cipher suites enabled by the SSL engine
       * @return enabled cipher suites
       */
      private String[] enabledCipherSuites(String[] supportedCipherSuites,
          String[] defaultCipherSuites) {
        if (enabledCipherSuites == null) {
          // we're assuming that the same engine is used for all configurables
          // so once we determine the enabled set, we won't do it again
          if (OptionHelper.isEmpty(getIncludedCipherSuites())
              && OptionHelper.isEmpty(getExcludedCipherSuites())) {
            enabledCipherSuites = Arrays.copyOf(defaultCipherSuites, 
                defaultCipherSuites.length);
          }
          else {
            enabledCipherSuites = includedStrings(supportedCipherSuites, 
                getIncludedCipherSuites(), getExcludedCipherSuites());
          }
          for (String cipherSuite : enabledCipherSuites) {
            addInfo("enabled cipher suite: " + cipherSuite);
          }
        }
        return enabledCipherSuites;
      }
      
      /**
       * Applies include and exclude patterns to an array of default string values
       * to produce an array of strings included by the patterns.
       * @param defaults default list of string values
       * @param included comma-separated patterns that identity values to include
       * @param excluded comma-separated patterns that identity string to exclude
       * @return an array of strings containing those strings from {@code defaults}
       *    that match at least one pattern in {@code included} that are not
       *    matched by any pattern in {@code excluded}
       */
      private String[] includedStrings(String[] defaults, String included,
          String excluded) {
        List<String> values = new ArrayList<String>(defaults.length);
        values.addAll(Arrays.asList(defaults));
        if (included != null) {
          StringCollectionUtil.retainMatching(values, stringToArray(included));
        }
        if (excluded != null) {
          StringCollectionUtil.removeMatching(values, stringToArray(excluded));
        }
        return values.toArray(new String[values.size()]);
      }
      
      /**
       * Splits a string containing comma-separated values into an array.
       * @param s the subject string
       * @return array of values contained in {@code s}
       */
      private String[] stringToArray(String s) {
        return s.split("\\s*,\\s*");
      }
      
      /**
       * Gets the JSSE secure transport protocols to include.
       * @return a string containing comma-separated JSSE secure transport 
       *    protocol names (e.g. {@code TLSv1})
       */
      public String getIncludedProtocols() {
        return includedProtocols;
      }
    
      /**
       * Sets the JSSE secure transport protocols to include.
       * @param protocols a string containing comma-separated JSSE secure 
       *    transport protocol names
       * @see Java Cryptography Architecture Standard Algorithm Name Documentation
       */
      public void setIncludedProtocols(String protocols) {
        this.includedProtocols = protocols;
      }
    
      /**
       * Gets the JSSE secure transport protocols to exclude.
       * @return a string containing comma-separated JSSE secure transport 
       *    protocol names (e.g. {@code TLSv1})
       */
      public String getExcludedProtocols() {
        return excludedProtocols;
      }
    
      /**
       * Sets the JSSE secure transport protocols to exclude.
       * @param protocols a string containing comma-separated JSSE secure 
       *    transport protocol names
       * @see Java Cryptography Architecture Standard Algorithm Name Documentation
       */
      public void setExcludedProtocols(String protocols) {
        this.excludedProtocols = protocols;
      }
    
      /**
       * Gets the JSSE cipher suite names to include.
       * @return a string containing comma-separated JSSE cipher suite names
       *    (e.g. {@code TLS_DHE_RSA_WITH_AES_256_CBC_SHA})
       */
      public String getIncludedCipherSuites() {
        return includedCipherSuites;
      }
    
      /**
       * Sets the JSSE cipher suite names to include.
       * @param cipherSuites a string containing comma-separated JSSE cipher
       *    suite names
       * @see Java Cryptography Architecture Standard Algorithm Name Documentation
       */
      public void setIncludedCipherSuites(String cipherSuites) {
        this.includedCipherSuites = cipherSuites;
      }
    
      /**
       * Gets the JSSE cipher suite names to exclude.
       * @return a string containing comma-separated JSSE cipher suite names
       *    (e.g. {@code TLS_DHE_RSA_WITH_AES_256_CBC_SHA})
       */
      public String getExcludedCipherSuites() {
        return excludedCipherSuites;
      }
    
      /**
       * Sets the JSSE cipher suite names to exclude.
       * @param cipherSuites a string containing comma-separated JSSE cipher
       *    suite names
       * @see Java Cryptography Architecture Standard Algorithm Name Documentation
       */
      public void setExcludedCipherSuites(String cipherSuites) {
        this.excludedCipherSuites = cipherSuites;
      }
    
      /**
       * Gets a flag indicating whether client authentication is required.
       * @return flag state
       */
      public Boolean isNeedClientAuth() {
        return needClientAuth;
      }
    
      /**
       * Sets a flag indicating whether client authentication is required.
       * @param needClientAuth the flag state to set
       */
      public void setNeedClientAuth(Boolean needClientAuth) {
        this.needClientAuth = needClientAuth;
      }
    
      /**
       * Gets a flag indicating whether client authentication is desired.
       * @return flag state
       */
      public Boolean isWantClientAuth() {
        return wantClientAuth;
      }
    
      /**
       * Sets a flag indicating whether client authentication is desired.
       * @param wantClientAuth the flag state to set
       */
      public void setWantClientAuth(Boolean wantClientAuth) {
        this.wantClientAuth = wantClientAuth;
      }
    
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/package.html����������������������0000644�0001750�0001750�00000000477�11377016712�026752� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
    
    <html>
    <head>
    <title></title>
    </head>
    
    <body>
    
    <p>Contains the base classes used by logback to log to remote
    destinations.</p>
    
    <p>SMTPAppender logs events and sends an email when appropriate.
    SyslogAppender logs to a Syslog deamon.</p>
    
    </body>
    </html>
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/server/���������������������������0000755�0001750�0001750�00000000000�12203357067�025767� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/server/ServerSocketListener.java��0000644�0001750�0001750�00000004472�12143151241�032753� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.server;
    
    import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.net.SocketAddress;
    
    import ch.qos.logback.core.util.CloseUtil;
    
    /**
     * A {@link ServerListener} that accepts connections on a {@link ServerSocket}.
     *
     * @author Carl Harris
     */
    public abstract class ServerSocketListener<T extends Client> 
        implements ServerListener<T> {
    
      private final ServerSocket serverSocket;
    
      /**
       * Constructs a new listener.
       * @param serverSocket server socket delegate
       */
      public ServerSocketListener(ServerSocket serverSocket) {
        this.serverSocket = serverSocket;
      }
    
      /**
       * {@inheritDoc}
       */
      public T acceptClient() throws IOException {
        Socket socket = serverSocket.accept();
        return createClient(
            socketAddressToString(socket.getRemoteSocketAddress()), socket);
      }
    
      /**
       * Creates the client object for a new socket connection
       * @param id identifier string for the client
       * @param socket client's socket connection
       * @return client object
       * @throws IOException
       */
      protected abstract T createClient(String id, Socket socket) 
          throws IOException;
      
      /**
       * {@inheritDoc}
       */
      public void close() {
        CloseUtil.closeQuietly(serverSocket);
      }
    
      /**
       * {@inheritDoc}
       */
      @Override
      public String toString() {
        return socketAddressToString(serverSocket.getLocalSocketAddress());
      }
    
      /**
       * Converts a socket address to a reasonable display string.
       * @param address the subject socket address
       * @return display string
       */
      private String socketAddressToString(SocketAddress address) {
        String addr = address.toString();
        int i = addr.indexOf("/");
        if (i >= 0) {
          addr = addr.substring(i + 1);
        }
        return addr;
      }
    
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/server/package.html���������������0000644�0001750�0001750�00000000336�12136042145�030243� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
    <html>
    	<head>
    	  <title></title>
    	</head>
    	<body>
    		<p>Contains the base classes used by logback to serve logging events to
    		   remote peers.</p>
    	</body>
    </html>
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000153�00000000000�011564� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/server/AbstractServerSocketAppender.java����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/server/AbstractServerSocketAppende0000644�0001750�0001750�00000013741�12143151241�033305� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.server;
    
    import java.io.IOException;
    import java.io.Serializable;
    import java.net.InetAddress;
    import java.net.ServerSocket;
    import java.net.UnknownHostException;
    import java.util.concurrent.Executor;
    
    import javax.net.ServerSocketFactory;
    
    import ch.qos.logback.core.AppenderBase;
    import ch.qos.logback.core.net.AbstractSocketAppender;
    import ch.qos.logback.core.spi.PreSerializationTransformer;
    
    /**
     * 
     * This is the super class for module specific ServerSocketAppender
     * implementations can derive from.
     * 
     * @author Carl Harris
     */
    public abstract class AbstractServerSocketAppender<E> extends AppenderBase<E> {
    
      /**
       * Default {@link ServerSocket} backlog
       */
      public static final int DEFAULT_BACKLOG = 50;
    
      /** 
       * Default queue size used for each client
       */
      public static final int DEFAULT_CLIENT_QUEUE_SIZE = 100;
      
      private int port = AbstractSocketAppender.DEFAULT_PORT;
      private int backlog = DEFAULT_BACKLOG;
      private int clientQueueSize = DEFAULT_CLIENT_QUEUE_SIZE;
      
      private String address;
    
      private ServerRunner<RemoteReceiverClient> runner;
    
      @Override
      public void start() {
        if (isStarted()) return;
        try {
          ServerSocket socket = getServerSocketFactory().createServerSocket(
              getPort(), getBacklog(), getInetAddress());    
          ServerListener<RemoteReceiverClient> listener = createServerListener(socket);
          
          runner = createServerRunner(listener, getContext().getExecutorService());
          runner.setContext(getContext());
          getContext().getExecutorService().execute(runner);
          super.start();
        } catch (Exception ex) {
          addError("server startup error: " + ex, ex);
        }
      }
      
      protected ServerListener<RemoteReceiverClient> createServerListener(
          ServerSocket socket) {
        return new RemoteReceiverServerListener(socket);
      }
      
      protected ServerRunner<RemoteReceiverClient> createServerRunner(
          ServerListener<RemoteReceiverClient> listener,
          Executor executor) {
        return new RemoteReceiverServerRunner(listener, executor, 
            getClientQueueSize());
      }
      
      @Override
      public void stop() {
        if (!isStarted()) return;
        try {
          runner.stop();
          super.stop();
        }
        catch (IOException ex) {
          addError("server shutdown error: " + ex, ex);
        }
      }
    
      @Override
      protected void append(E event) {
        if (event == null) return;
        postProcessEvent(event);
        final Serializable serEvent = getPST().transform(event);
        runner.accept(new ClientVisitor<RemoteReceiverClient>() {
          public void visit(RemoteReceiverClient client) {
            client.offer(serEvent);
          }      
        });
      }
    
      /**
       * Post process an event received via {@link #append(E)}.
       * @param event
       */
      protected abstract void postProcessEvent(E event);
    
      /**
       * Gets a transformer that will be used to convert a received event
       * to a {@link Serializable} form.
       * @return
       */
      protected abstract PreSerializationTransformer<E> getPST();
    
      /**
       * Gets the factory used to create {@link ServerSocket} objects.
       * <p>
       * The default implementation delegates to 
       * {@link ServerSocketFactory#getDefault()}.  Subclasses may override to
       * private a different socket factory implementation.
       * 
       * @return socket factory.
       */
      protected ServerSocketFactory getServerSocketFactory() throws Exception {
        return ServerSocketFactory.getDefault();
      }
    
      /**
       * Gets the local address for the listener.
       * @return an {@link InetAddress} representation of the local address.
       * @throws UnknownHostException
       */
      protected InetAddress getInetAddress() throws UnknownHostException {
        if (getAddress() == null) return null;
        return InetAddress.getByName(getAddress());
      }
      
      /**
       * Gets the local port for the listener.
       * @return local port
       */
      public int getPort() {
        return port;
      }
    
      /**
       * Sets the local port for the listener.
       * @param port the local port to set
       */
      public void setPort(int port) {
        this.port = port;
      }
    
      /**
       * Gets the listener queue depth.
       * <p>
       * This represents the number of connected clients whose connections 
       * have not yet been accepted.
       * @return queue depth
       * @see java.net.ServerSocket
       */
      public int getBacklog() {
        return backlog;
      }
    
      /**
       * Sets the listener queue depth.
       * <p>
       * This represents the number of connected clients whose connections 
       * have not yet been accepted.
       * @param backlog the queue depth to set
       * @see java.net.ServerSocket
       */
      public void setBacklog(int backlog) {
        this.backlog = backlog;
      }
    
      /**
       * Gets the local address for the listener.
       * @return a string representation of the local address
       */
      public String getAddress() {
        return address;
      }
    
      /**
       * Sets the local address for the listener.
       * @param address a host name or a string representation of an IP address
       */
      public void setAddress(String address) {
        this.address = address;
      }
      
      /**
       * Gets the event queue size used for each client connection. 
       * @return queue size
       */
      public int getClientQueueSize() {
        return clientQueueSize;
      }
    
      /**
       * Sets the event queue size used for each client connection.
       * @param clientQueueSize the queue size to set
       */
      public void setClientQueueSize(int clientQueueSize) {
        this.clientQueueSize = clientQueueSize;
      }
    
    }
    
    �������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/server/ServerListener.java��������0000644�0001750�0001750�00000005046�12143151241�031600� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.server;
    
    import java.io.Closeable;
    import java.io.IOException;
    
    /**
     * A listener that accepts {@link Client} connections on behalf of a
     * {@link ServerRunner}.
     * <p>
     * This interface exists primarily to abstract away the details of the
     * listener's underlying {@code ServerSocket} and the concurrency associated
     * with handling multiple clients. Such realities make it difficult to create
     * effective unit tests for the {@link ServerRunner} that are easy to 
     * understand and maintain.
     * <p>
     * This interface captures the only those details about the listener that the
     * {@code ServerRunner} cares about; namely, that it is something that has
     * an underlying resource (or resources) that need to be closed before the
     * listener is discarded.
     * </ol>
     */
    public interface ServerListener<T extends Client> extends Closeable {
    
      /**
       * Accepts the next client that appears on this listener.
       * <p>
       * An implementation of this method is expected to block the calling thread
       * and not return until either a client appears or an exception occurs.
       * 
       * @return client object
       * @throws IOException
       * @throws InterruptedException
       */
      T acceptClient() throws IOException, InterruptedException;
      
      /**
       * Closes any underlying {@link Closeable} resources associated with this
       * listener.
       * <p>
       * Note that (as described in Doug Lea's discussion about interrupting I/O
       * operations in "Concurrent Programming in Java" (Addison-Wesley 
       * Professional, 2nd edition, 1999) this method is used to interrupt
       * any blocked I/O operation in the client when the server is shutting
       * down.  The client implementation must anticipate this potential,
       * and gracefully exit when the blocked I/O operation throws the 
       * relevant {@link IOException} subclass. 
       * <p>
       * Note also, that unlike {@link Closeable#close()} this method is not
       * permitted to propagate any {@link IOException} that occurs when closing
       * the underlying resource(s).
       */
      void close();
      
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000151�00000000000�011562� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/server/RemoteReceiverServerRunner.java������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/server/RemoteReceiverServerRunner.0000644�0001750�0001750�00000003415�12143151241�033261� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.server;
    
    import java.io.Serializable;
    import java.util.concurrent.ArrayBlockingQueue;
    import java.util.concurrent.Executor;
    
    /**
     * A {@link ServerRunner} that listens for connections from remote receiver
     * component clients and delivers logging events to all connected clients.
     *
     * @author Carl Harris
     */
    class RemoteReceiverServerRunner 
        extends ConcurrentServerRunner<RemoteReceiverClient> {
    
      private final int clientQueueSize;
      
      /**
       * Constructs a new server runner.
       * @param listener the listener from which the server will accept new
       *    clients
       * @param executor that will be used to execute asynchronous tasks 
       *    on behalf of the runner.
       * @param queueSize size of the event queue that will be maintained for
       *    each client
       */
      public RemoteReceiverServerRunner(
          ServerListener<RemoteReceiverClient> listener, Executor executor,
          int clientQueueSize) {
        super(listener, executor);
        this.clientQueueSize = clientQueueSize;
      }
    
      /**
       * {@inheritDoc}
       */
      @Override
      protected boolean configureClient(RemoteReceiverClient client) {
        client.setContext(getContext());
        client.setQueue(new ArrayBlockingQueue<Serializable>(clientQueueSize));
        return true;
      }
    
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/server/ConcurrentServerRunner.java0000644�0001750�0001750�00000014621�12143151241�033326� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.server;
    
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.concurrent.Executor;
    import java.util.concurrent.RejectedExecutionException;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    import ch.qos.logback.core.spi.ContextAwareBase;
    
    /**
     * A concurrent {@link ServerRunner}.
     * <p>
     * An instance of this object is created with a {@link ServerListener} and
     * an {@link Executor}.  On invocation of the {@link #start()} method, it
     * passes itself to the given {@code Executor} and returns immediately.  On
     * invocation of its {@link #run()} method by the {@link Executor} it begins 
     * accepting client connections via its {@code ServerListener}.  As each
     * new {@link Client} is accepted, the client is configured with the 
     * runner's {@link LoggingContext} and is then passed to the {@code 
     * Executor} for concurrent execution of the client's service loop.     
     * <p>
     * On invocation of the {@link #stop()} method, the runner closes the listener
     * and each of the connected clients (by invoking {@link Client#close()} 
     * effectively interrupting any blocked I/O calls and causing these concurrent
     * subtasks to exit gracefully).  This ensures that before the {@link #stop()}
     * method returns (1) all I/O resources have been released and (2) all 
     * of the threads of the {@code Executor} are idle.
     *
     * @author Carl Harris
     */
    public abstract class ConcurrentServerRunner<T extends Client> 
        extends ContextAwareBase 
        implements Runnable, ServerRunner<T> {
    
      private final Lock clientsLock = new ReentrantLock();
      
      private final Collection<T> clients = new ArrayList<T>();
    
      private final ServerListener<T> listener;
      private final Executor executor;
      
      private boolean running;
      
      /**
       * Constructs a new server runner.
       * @param listener the listener from which the server will accept new
       *    clients
       * @param executor a executor that will facilitate execution of the
       *    listening and client-handling tasks; while any {@link Executor}
       *    is allowed here, outside of unit testing the only reasonable choice
       *    is a bounded thread pool of some kind.
       */
      public ConcurrentServerRunner(ServerListener<T> listener, Executor executor) {
        this.listener = listener;
        this.executor = executor;
      }
      
      /**
       * {@inheritDoc}
       */
      public boolean isRunning() {
        return running;
      }
    
      protected void setRunning(boolean running) {
        this.running = running;
      }
      
      /**
       * {@inheritDoc}
       */
      public void stop() throws IOException {
        listener.close();
        accept(new ClientVisitor<T>() {
          public void visit(T client) {
            client.close();
          } 
        });
      }
    
      /**
       * {@inheritDoc}
       */
      public void accept(ClientVisitor<T> visitor) {
        Collection<T> clients = copyClients();
        for (T client : clients) {
          try {
            visitor.visit(client);
          }
          catch (RuntimeException ex) {
            addError(client + ": " + ex);
          }
        }
      }
    
      /**
       * Creates a copy of the collection of all clients that are presently
       * being tracked by the server.
       * @return collection of client objects
       */
      private Collection<T> copyClients() {
        clientsLock.lock();
        try {
          Collection<T> copy = new ArrayList<T>(clients);
          return copy;
        }
        finally {
          clientsLock.unlock();
        }
      }
      
      /**
       * {@inheritDoc}
       */
      public void run() {
        setRunning(true);
        try {
          addInfo("listening on " + listener);
          while (!Thread.currentThread().isInterrupted()) {
            T client = listener.acceptClient();
            if (!configureClient(client)) {
              addError(client + ": connection dropped");
              client.close();
              continue;
            }
            try {
              executor.execute(new ClientWrapper(client));
            }
            catch (RejectedExecutionException ex) {
              addError(client + ": connection dropped");
              client.close();
            }
          }
        }
        catch (InterruptedException ex) {
          assert true;  // ok... we'll shut down
        }
        catch (Exception ex) {
          addError("listener: " + ex);
        }
    
        setRunning(false);
        addInfo("shutting down");
        listener.close();
      }
    
      /**
       * Configures a connected client.
       * <p>
       * A subclass implements this method to perform any necessary configuration
       * of the client object before its {@link Client#run()} method is invoked.
       * 
       * @param client the subject client
       * @return {@code true} if configuration was successful; if the return
       *    value is {@code false} the client connection will be dropped
       */
      protected abstract boolean configureClient(T client);
        
      /**
       * Adds a client to the collection of those being tracked by the server.
       * @param client the client to add
       */
      private void addClient(T client) {
        clientsLock.lock();
        try {
          clients.add(client);
        }
        finally {
          clientsLock.unlock();
        }
      }
      
      /**
       * Removes a client from the collection of those being tracked by the server.
       * @param client the client to remote
       */
      private void removeClient(T client) {
        clientsLock.lock();
        try {
          clients.remove(client);
        }
        finally {
          clientsLock.unlock();
        }
      }
      
      /**
       * A wrapper for a {@link Client} responsible for ensuring that client
       * tracking is performed properly.
       */
      private class ClientWrapper implements Client {
        
        private final T delegate;
        
        public ClientWrapper(T client) {
          this.delegate = client;
        }
    
        public void run() {
          addClient(delegate);
          try {
            delegate.run();
          }
          finally {
            removeClient(delegate);
          }      
        }
    
        public void close() {
          delegate.close();
        }
        
      }
      
    }
    ���������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000152�00000000000�011563� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/server/SSLServerSocketAppenderBase.java�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/server/SSLServerSocketAppenderBase0000644�0001750�0001750�00000004317�12140555240�033163� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.server;
    
    import javax.net.ServerSocketFactory;
    import javax.net.ssl.SSLContext;
    
    import ch.qos.logback.core.net.ssl.ConfigurableSSLServerSocketFactory;
    import ch.qos.logback.core.net.ssl.SSLComponent;
    import ch.qos.logback.core.net.ssl.SSLConfiguration;
    import ch.qos.logback.core.net.ssl.SSLParametersConfiguration;
    
    /**
     * 
     * This is the base class for module specific ServerSocketAppender 
     * implementations.
     * 
     * @author Carl Harris
     */
    public abstract class SSLServerSocketAppenderBase<E> 
        extends AbstractServerSocketAppender<E> implements SSLComponent {
    
      private SSLConfiguration ssl;
      private ServerSocketFactory socketFactory;
      
      @Override
      protected ServerSocketFactory getServerSocketFactory() {
        return socketFactory;
      }
    
      /**
       * {@inheritDoc}
       */
      @Override
      public void start() {
        try {
          SSLContext sslContext = getSsl().createContext(this);
          SSLParametersConfiguration parameters = getSsl().getParameters();
          parameters.setContext(getContext());
          socketFactory = new ConfigurableSSLServerSocketFactory(parameters, 
              sslContext.getServerSocketFactory());
          super.start();
        }
        catch (Exception ex) {
          addError(ex.getMessage(), ex);
        }
      }
    
      /**
       * Gets the SSL configuration.
       * @return SSL configuration; if no configuration has been set, a
       *    default configuration is returned
       */
      public SSLConfiguration getSsl() {
        if (ssl == null) {
          ssl = new SSLConfiguration();
        }
        return ssl;
      }
    
      /**
       * Sets the SSL configuration.
       * @param ssl the SSL configuration to set
       */
      public void setSsl(SSLConfiguration ssl) {
        this.ssl = ssl;
      }
      
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000153�00000000000�011564� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/server/RemoteReceiverServerListener.java����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/server/RemoteReceiverServerListene0000644�0001750�0001750�00000002436�12143151241�033337� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.server;
    
    import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    /**
     * A {@link ServerListener} that accepts connections from remote receiver
     * component clients.
     *
     * @author Carl Harris
     */
    class RemoteReceiverServerListener
        extends ServerSocketListener<RemoteReceiverClient> {
    
      /**
       * Constructs a new listener.
       * @param serverSocket server socket from which new client connections
       *    will be accepted
       */
      public RemoteReceiverServerListener(ServerSocket serverSocket) {
        super(serverSocket);
      }
    
      /**
       * {@inheritDoc}
       */
      @Override
      protected RemoteReceiverClient createClient(String id, Socket socket)
          throws IOException {
        return new RemoteReceiverStreamClient(id, socket);
      }
    
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/server/Client.java����������������0000644�0001750�0001750�00000004177�12136042272�030053� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.server;
    
    import java.io.Closeable;
    import java.io.IOException;
    
    /**
     * A client of a {@link ServerRunner}.
     * <p>
     * This interface exists primarily to abstract away the details of the
     * client's underlying {@code Socket} and the concurrency associated with
     * handling multiple clients.  Such realities make it difficult to create 
     * effective unit tests for the {@link ServerRunner} that are easy to 
     * understand and maintain.
     * <p>
     * This interface captures the only those details about a client that
     * the {@code ServerRunner} cares about; namely, that it is something that
     * <ol>
     *   <li>is Runnable &mdash; i.e. it can be executed concurrently</li>
     *   <li>holds resources that need to be closed before the client is
     *       discarded</li>
     * </ol>
     * 
     * @author Carl Harris
     */
    public interface Client extends Runnable, Closeable {
    
      /**
       * Closes any resources that are held by the client.
       * <p>
       * Note that (as described in Doug Lea's discussion about interrupting I/O
       * operations in "Concurrent Programming in Java" (Addison-Wesley 
       * Professional, 2nd edition, 1999) this method is used to interrupt
       * any blocked I/O operation in the client when the server is shutting
       * down.  The client implementation must anticipate this potential,
       * and gracefully exit when the blocked I/O operation throws the
       * relevant {@link IOException} subclass. 
       * <p>
       * Note also, that unlike {@link Closeable#close()} this method is not
       * permitted to propagate any {@link IOException} that occurs when closing
       * the underlying resource(s).
       */
      void close();
      
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/server/ClientVisitor.java���������0000644�0001750�0001750�00000001261�12136042272�031422� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.server;
    
    /**
     * A visitor for a {@link Client}.
     *
     * @author Carl Harris
     */
    public interface ClientVisitor<T extends Client> {
    
      void visit(T client);
      
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/server/ServerRunner.java����������0000644�0001750�0001750�00000003053�12136042272�031265� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.server;
    
    import java.io.IOException;
    
    import ch.qos.logback.core.spi.ContextAware;
    
    /**
     * An object that is responsible for the asynchronous execution of a
     * socket server.
     * <p>
     * This interface exists primarily to allow the runner to be mocked for
     * the purpose of unit testing the socket server implementation.
     * 
     * @author Carl Harris
     */
    public interface ServerRunner<T extends Client> extends ContextAware, Runnable {
    
      /**
       * Gets a flag indicating whether the server is currently running.
       * @return flag state
       */
      boolean isRunning();
      
      /**
       * Stops execution of the runner.
       * <p>
       * This method must cause all I/O and thread resources associated with
       * the runner to be released.  If the receiver has not been started, this
       * method must have no effect.
       * @throws IOException
       */
      void stop() throws IOException;
    
      /**
       * Presents each connected client to the given visitor.   
       * @param visitor the subject visitor
       */
      void accept(ClientVisitor<T> visitor);
      
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/server/RemoteReceiverClient.java��0000644�0001750�0001750�00000002535�12143151241�032703� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.server;
    
    import java.io.Serializable;
    import java.util.concurrent.BlockingQueue;
    
    import ch.qos.logback.core.spi.ContextAware;
    
    
    /**
     * A client of a {@link ServerRunner} that receives events from a local
     * appender and logs them according to local policy.
     *
     * @author Carl Harris
     */
    interface RemoteReceiverClient extends Client, ContextAware {
    
      /**
       * Sets the client's event queue.
       * <p>
       * This method must be invoked before the {@link #run()} method is invoked.
       * @param queue the queue to set
       */
      void setQueue(BlockingQueue<Serializable> queue);
      
      /**
       * Offers an event to the client.
       * @param event the subject event
       * @return {@code true} if the client's queue accepted the event,
       *    {@code false} if the client's queue is full
       */
      boolean offer(Serializable event);
      
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000151�00000000000�011562� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/server/RemoteReceiverStreamClient.java������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/server/RemoteReceiverStreamClient.0000644�0001750�0001750�00000007717�12143151241�033224� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.server;
    
    import java.io.IOException;
    import java.io.ObjectOutputStream;
    import java.io.OutputStream;
    import java.io.Serializable;
    import java.net.Socket;
    import java.net.SocketException;
    import java.util.concurrent.BlockingQueue;
    
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.spi.ContextAwareBase;
    import ch.qos.logback.core.util.CloseUtil;
    
    /**
     * A {@link RemoteReceiverClient} that writes serialized logging events to an
     * {@link OutputStream}.
     *
     * @author Carl Harris
     */
    class RemoteReceiverStreamClient 
        extends ContextAwareBase implements RemoteReceiverClient {
    
      private final String clientId;
      private final Socket socket;
      private final OutputStream outputStream;
      
      private BlockingQueue<Serializable> queue;
      
      /**
       * Constructs a new client.
       * @param id identifier string for the client
       * @param socket socket to which logging events will be written
       */
      public RemoteReceiverStreamClient(String id, Socket socket) {
        this.clientId = "client " + id + ": ";
        this.socket = socket;
        this.outputStream = null;
      }
    
      /**
       * Constructs a new client.
       * <p> 
       * This constructor exists primarily to support unit tests where it
       * is inconvenient to have to create a socket for the test.
       * 
       * @param id identifier string for the client
       * @param outputStream output stream to which logging Events will be written
       */
      RemoteReceiverStreamClient(String id, OutputStream outputStream) {
        this.clientId = "client " + id + ": ";
        this.socket = null;
        this.outputStream = outputStream;
      }
      
      /**
       * {@inheritDoc}
       */
      public void setQueue(BlockingQueue<Serializable> queue) {
        this.queue = queue;
      }
    
      /**
       * {@inheritDoc}
       */
      public boolean offer(Serializable event) {
        if (queue == null) {
          throw new IllegalStateException("client has no event queue");
        }
        return queue.offer(event);
      }
    
      /**
       * {@inheritDoc}
       */
      public void close() {
        if (socket == null) return;
        CloseUtil.closeQuietly(socket);
      }
    
      /**
       * {@inheritDoc}
       */
      public void run() {  
        addInfo(clientId + "connected"); 
    
        ObjectOutputStream oos = null;
        try {
          int counter = 0;
          oos = createObjectOutputStream();
          while (!Thread.currentThread().isInterrupted()) {
            try {
              Serializable event = queue.take();
              oos.writeObject(event);
              oos.flush();
              if (++counter >= CoreConstants.OOS_RESET_FREQUENCY) {
                // failing to reset the stream periodically will result in a
                // serious memory leak (as noted in AbstractSocketAppender)
                counter = 0;
                oos.reset();
              }
            }
            catch (InterruptedException ex) {
              Thread.currentThread().interrupt();
            }
          }
        }
        catch (SocketException ex) {
          addInfo(clientId + ex);
        }
        catch (IOException ex) {
          addError(clientId + ex);
        }
        catch (RuntimeException ex) {
          addError(clientId + ex);
        }
        finally {
          if (oos != null) {
            CloseUtil.closeQuietly(oos);
          }
          close();
          addInfo(clientId + "connection closed");
        }
      }
    
      private ObjectOutputStream createObjectOutputStream() throws IOException {
        if (socket == null) {
          return new ObjectOutputStream(outputStream);
        }
        return new ObjectOutputStream(socket.getOutputStream());
      }
    }
    �������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/LoginAuthenticator.java�����������0000644�0001750�0001750�00000002004�12143151241�031110� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net;
    
    import javax.mail.Authenticator;
    import javax.mail.PasswordAuthentication;
    
    /**
     * Used by SMTPAppender for authentication purposes.
     */
    public class LoginAuthenticator extends Authenticator {
    
      String username;
      String password;
      
      LoginAuthenticator(String username, String password) {
        this.username = username;
        this.password = password;
      }
      
      public PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(username, password);
    }
    
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/SocketConnector.java��������������0000644�0001750�0001750�00000003601�12140754713�030426� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net;
    
    import java.net.Socket;
    import java.util.concurrent.Callable;
    
    import javax.net.SocketFactory;
    
    /**
     * A {@link Runnable} that (re)connects a socket.
     * <p>
     * An implementation of this interface is responsible for repeatedly 
     * attempting to create a socket connection to a remote host.
     *
     * @author Carl Harris
     */
    public interface SocketConnector extends Callable<Socket> {
    
      /**
       * An exception handler that is notified of all exceptions that occur
       * during the (re)connection process.
       */
      public interface ExceptionHandler {
        void connectionFailed(SocketConnector connector, Exception ex);
      }
      
      /**
       * Blocks the calling thread until a connection is successfully
       * established.
       * @return the connected socket
       * @throws InterruptedException
       */
      Socket call() throws InterruptedException;
    
      /**
       * Sets the connector's exception handler.
       * <p>
       * The handler must be set before the {@link #call()} method is invoked.
       * @param exceptionHandler the handler to set
       */
      void setExceptionHandler(ExceptionHandler exceptionHandler);
      
      /**
       * Sets the connector's socket factory.
       * <p>
       * If no factory is configured that connector will use the platform's
       * default factory.
       * 
       * @param socketFactory the factory to set
       */
      void setSocketFactory(SocketFactory socketFactory);
      
    }
    �������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/AbstractSocketAppender.java�������0000644�0001750�0001750�00000031473�12143151241�031714� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    // Contributors: Dan MacDonald <dan@redknee.com>
    package ch.qos.logback.core.net;
    
    import java.io.IOException;
    import java.io.ObjectOutputStream;
    import java.io.Serializable;
    import java.net.ConnectException;
    import java.net.InetAddress;
    import java.net.Socket;
    import java.net.UnknownHostException;
    import java.util.concurrent.ArrayBlockingQueue;
    import java.util.concurrent.BlockingQueue;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.Future;
    import java.util.concurrent.RejectedExecutionException;
    import java.util.concurrent.SynchronousQueue;
    
    
    import javax.net.SocketFactory;
    
    import ch.qos.logback.core.AppenderBase;
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.spi.PreSerializationTransformer;
    import ch.qos.logback.core.util.CloseUtil;
    
    /**
     * An abstract base for module specific {@code SocketAppender}
     * implementations in other logback modules.
     * 
     * @author Ceki G&uuml;lc&uuml;
     * @author S&eacute;bastien Pennec
     * @author Carl Harris
     */
    
    public abstract class AbstractSocketAppender<E> extends AppenderBase<E>
        implements Runnable, SocketConnector.ExceptionHandler {
    
      /**
       * The default port number of remote logging server (4560).
       */
      public static final int DEFAULT_PORT = 4560;
    
      /**
       * The default reconnection delay (30000 milliseconds or 30 seconds).
       */
      public static final int DEFAULT_RECONNECTION_DELAY = 30000;
    
      /**
       * Default size of the queue used to hold logging events that are destined
       * for the remote peer.
       */
      public static final int DEFAULT_QUEUE_SIZE = 0;
      
      /**
       * Default timeout when waiting for the remote server to accept our
       * connection.
       */
      private static final int DEFAULT_ACCEPT_CONNECTION_DELAY = 5000;
    
      private String remoteHost;
      private int port = DEFAULT_PORT;
      private InetAddress address;
      private int reconnectionDelay = DEFAULT_RECONNECTION_DELAY;
      private int queueSize = DEFAULT_QUEUE_SIZE;
      private int acceptConnectionTimeout = DEFAULT_ACCEPT_CONNECTION_DELAY;
      
      private BlockingQueue<E> queue;
      private String peerId;
      private Future<?> task;
      private Future<Socket> connectorTask;
    
      private volatile Socket socket;
    
      /**
       * Constructs a new appender.
       */
      protected AbstractSocketAppender() {
      }
      
      /**
       * Constructs a new appender that will connect to the given remote host 
       * and port.
       * <p>
       * This constructor was introduced primarily to allow the encapsulation 
       * of the this class to be improved in a manner that is least disruptive 
       * to <em>existing</em> subclasses.  <strong>This constructor will be 
       * removed in future release</strong>.
       * 
       * @param remoteHost target remote host
       * @param port target port on remote host
       */
      @Deprecated
      protected AbstractSocketAppender(String remoteHost, int port) {
        this.remoteHost = remoteHost;
        this.port = port;
      }
      
      /**
       * {@inheritDoc}
       */
      public void start() {
        if (isStarted()) return;
        int errorCount = 0;
        if (port <= 0) {
          errorCount++;
          addError("No port was configured for appender"
              + name
              + " For more information, please visit http://logback.qos.ch/codes.html#socket_no_port");
        }
    
        if (remoteHost == null) {
          errorCount++;
          addError("No remote host was configured for appender"
              + name
              + " For more information, please visit http://logback.qos.ch/codes.html#socket_no_host");
        }
        
        if (queueSize < 0) {
          errorCount++;
          addError("Queue size must be non-negative");
        }
    
        if (errorCount == 0) {
          try {
            address = InetAddress.getByName(remoteHost);
          } catch (UnknownHostException ex) {
            addError("unknown host: " + remoteHost);
            errorCount++;
          }
        }
    
        if (errorCount == 0) {
          queue = newBlockingQueue(queueSize);
          peerId = "remote peer " + remoteHost + ":" + port + ": ";
          task = getContext().getExecutorService().submit(this);
          super.start();
        }
      }
    
      /**
       * {@inheritDoc}
       */
      @Override
      public void stop() {
        if (!isStarted()) return;
        CloseUtil.closeQuietly(socket);
        task.cancel(true);
        if(connectorTask != null)
          connectorTask.cancel(true);
        super.stop();
      }
    
      /**
       * {@inheritDoc}
       */
      @Override
      protected void append(E event) {
        if (event == null || !isStarted()) return;    
        queue.offer(event);
      }
    
      /**
       * {@inheritDoc}
       */
      public final void run() {
        try {
          while (!Thread.currentThread().isInterrupted()) {
            SocketConnector connector = createConnector(address, port, 0,
                    reconnectionDelay);
    
            connectorTask = activateConnector(connector);
            if(connectorTask == null)
              break;
    
            socket = waitForConnectorToReturnASocket();
            if(socket == null)
              break;
            dispatchEvents();
          }
        } catch (InterruptedException ex) {
          assert true;    // ok... we'll exit now
        }
        addInfo("shutting down");
      }
    
      private SocketConnector createConnector(InetAddress address, int port,
                                              int initialDelay, int retryDelay) {
        SocketConnector connector = newConnector(address, port, initialDelay,
                retryDelay);
        connector.setExceptionHandler(this);
        connector.setSocketFactory(getSocketFactory());
        return connector;
      }
    
      private Future<Socket> activateConnector(SocketConnector connector) {
        try {
          return getContext().getExecutorService().submit(connector);
        } catch (RejectedExecutionException ex) {
          return null;
        }
      }
    
      private Socket waitForConnectorToReturnASocket() throws InterruptedException {
        try {
          Socket s =  connectorTask.get();
          connectorTask = null;
          return s;
        } catch (ExecutionException e) {
          return null;
        }
      }
    
      private void dispatchEvents() throws InterruptedException {
        try {
          socket.setSoTimeout(acceptConnectionTimeout);
          ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
          socket.setSoTimeout(0);
          addInfo(peerId + "connection established");
          int counter = 0;
          while (true) {
            E event = queue.take();
            postProcessEvent(event);
            Serializable serEvent = getPST().transform(event);
            oos.writeObject(serEvent);
            oos.flush();
            if (++counter >= CoreConstants.OOS_RESET_FREQUENCY) {
              // Failing to reset the object output stream every now and
              // then creates a serious memory leak.
              oos.reset();
              counter = 0;
            }
          }
        } catch (IOException ex) {
          addInfo(peerId + "connection failed: " + ex);
        } finally {
          CloseUtil.closeQuietly(socket);
          socket = null;
          addInfo(peerId + "connection closed");
        }
      } 
        
      /**
       * {@inheritDoc}
       */
      public void connectionFailed(SocketConnector connector, Exception ex) {
        if (ex instanceof InterruptedException) {
          addInfo("connector interrupted");
        } else if (ex instanceof ConnectException) {
          addInfo(peerId + "connection refused");
        } else {
          addInfo(peerId + ex);
        }
      }
    
    
    
      /**
       * Creates a new {@link SocketConnector}.
       * <p>
       * The default implementation creates an instance of {@link DefaultSocketConnector}.
       * A subclass may override to provide a different {@link SocketConnector}
       * implementation.
       * 
       * @param address target remote address
       * @param port target remote port
       * @param initialDelay delay before the first connection attempt
       * @param retryDelay delay before a reconnection attempt
       * @return socket connector
       */
      protected SocketConnector newConnector(InetAddress address,
                                             int port, int initialDelay, int retryDelay) {
        return new DefaultSocketConnector(address, port, initialDelay, retryDelay);
      }
    
      /**
       * Gets the default {@link SocketFactory} for the platform.
       * <p>
       * Subclasses may override to provide a custom socket factory.
       */
      protected SocketFactory getSocketFactory() {
        return SocketFactory.getDefault();
      }
    
      /**
       * Creates a blocking queue that will be used to hold logging events until
       * they can be delivered to the remote receiver.
       * <p>
       * The default implementation creates a (bounded) {@link ArrayBlockingQueue} 
       * for positive queue sizes.  Otherwise it creates a {@link SynchronousQueue}.
       * <p>
       * This method is exposed primarily to support instrumentation for unit
       * testing.
       * 
       * @param queueSize size of the queue
       * @return
       */
      BlockingQueue<E> newBlockingQueue(int queueSize) {
        return queueSize <= 0 ? 
            new SynchronousQueue<E>() : new ArrayBlockingQueue<E>(queueSize);
      }
      
      /**
       * Post-processes an event before it is serialized for delivery to the
       * remote receiver.
       * @param event the event to post-process
       */
      protected abstract void postProcessEvent(E event);
      
      /**
       * Get the pre-serialization transformer that will be used to transform
       * each event into a Serializable object before delivery to the remote
       * receiver.
       * @return transformer object
       */
      protected abstract PreSerializationTransformer<E> getPST();
    
      /*
       * This method is used by logback modules only in the now deprecated
       * convenience constructors for SocketAppender
       */
      @Deprecated
      protected static InetAddress getAddressByName(String host) {
        try {
          return InetAddress.getByName(host);
        } catch (Exception e) {
          // addError("Could not find address of [" + host + "].", e);
          return null;
        }
      }
    
      /**
       * The <b>RemoteHost</b> property takes the name of of the host where a corresponding server is running.
       */
      public void setRemoteHost(String host) {
        remoteHost = host;
      }
    
      /**
       * Returns value of the <b>RemoteHost</b> property.
       */
      public String getRemoteHost() {
        return remoteHost;
      }
    
      /**
       * The <b>Port</b> property takes a positive integer representing the port
       * where the server is waiting for connections.
       */
      public void setPort(int port) {
        this.port = port;
      }
    
      /**
       * Returns value of the <b>Port</b> property.
       */
      public int getPort() {
        return port;
      }
    
      /**
       * The <b>reconnectionDelay</b> property takes a positive integer representing
       * the number of milliseconds to wait between each failed connection attempt
       * to the server. The default value of this option is 30000 which corresponds
       * to 30 seconds.
       *
       * <p>
       * Setting this option to zero turns off reconnection capability.
       */
      public void setReconnectionDelay(int delay) {
        this.reconnectionDelay = delay;
      }
    
      /**
       * Returns value of the <b>reconnectionDelay</b> property.
       */
      public int getReconnectionDelay() {
        return reconnectionDelay;
      }
    
      /**
       * The <b>queueSize</b> property takes a non-negative integer representing
       * the number of logging events to retain for delivery to the remote receiver.
       * When the queue size is zero, event delivery to the remote receiver is
       * synchronous.  When the queue size is greater than zero, the 
       * {@link #append(Object)} method returns immediately after enqueing the
       * event, assuming that there is space available in the queue.  Using a 
       * non-zero queue length can improve performance by eliminating delays
       * caused by transient network delays.  If the queue is full when the
       * {@link #append(Object)} method is called, the event is summarily 
       * and silently dropped.
       * 
       * @param queueSize the queue size to set.
       */
      public void setQueueSize(int queueSize) {
        this.queueSize = queueSize;
      }
      
      /**
       * Returns the value of the <b>queueSize</b> property.
       */
      public int getQueueSize() {
        return queueSize;
      }
      
      /**
       * Sets the timeout that controls how long we'll wait for the remote
       * peer to accept our connection attempt.
       * <p>
       * This property is configurable primarily to support instrumentation
       * for unit testing.
       * 
       * @param acceptConnectionTimeout timeout value in milliseconds
       */
      void setAcceptConnectionTimeout(int acceptConnectionTimeout) {
        this.acceptConnectionTimeout = acceptConnectionTimeout;
      }
    
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/SyslogAppenderBase.java�����������0000644�0001750�0001750�00000017105�12136042272�031054� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net;
    
    import java.io.IOException;
    import java.io.OutputStream;
    import java.net.SocketException;
    import java.net.UnknownHostException;
    
    import ch.qos.logback.core.AppenderBase;
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.Layout;
    
    /**
     * Base class for SyslogAppender.
     * 
     * @author Ceki G&uuml;lc&uuml;
     * 
     * @param <E>
     */
    public abstract class SyslogAppenderBase<E> extends AppenderBase<E> {
    
      final static String SYSLOG_LAYOUT_URL = CoreConstants.CODES_URL
          + "#syslog_layout";
    
      Layout<E> layout;
      String facilityStr;
      String syslogHost;
      protected String suffixPattern;
      SyslogOutputStream sos;
      int port = SyslogConstants.SYSLOG_PORT;
      int maxMessageSize = 65000;
    
      public void start() {
        int errorCount = 0;
        if (facilityStr == null) {
          addError("The Facility option is mandatory");
          errorCount++;
        }
    
        try {
          sos = new SyslogOutputStream(syslogHost, port);
        } catch (UnknownHostException e) {
          addError("Could not create SyslogWriter", e);
          errorCount++;
        } catch (SocketException e) {
          addWarn(
              "Failed to bind to a random datagram socket. Will try to reconnect later.",
              e);
        }
    
        if (layout == null) {
          layout = buildLayout();
        }
    
        if (errorCount == 0) {
          super.start();
        }
      }
    
      abstract public Layout<E> buildLayout();
    
      abstract public int getSeverityForEvent(Object eventObject);
    
      @Override
      protected void append(E eventObject) {
        if (!isStarted()) {
          return;
        }
    
        try {
          String msg = layout.doLayout(eventObject);
          if(msg == null) {
            return;
          }
          if (msg.length() > maxMessageSize) {
            msg = msg.substring(0, maxMessageSize);
          }
          sos.write(msg.getBytes());
          sos.flush();
          postProcess(eventObject, sos);
        } catch (IOException ioe) {
          addError("Failed to send diagram to " + syslogHost, ioe);
        }
      }
    
      protected void postProcess(Object event, OutputStream sw) {
    
      }
    
      /**
       * Returns the integer value corresponding to the named syslog facility.
       * 
       * @throws IllegalArgumentException
       *           if the facility string is not recognized
       */
      static public int facilityStringToint(String facilityStr) {
        if ("KERN".equalsIgnoreCase(facilityStr)) {
          return SyslogConstants.LOG_KERN;
        } else if ("USER".equalsIgnoreCase(facilityStr)) {
          return SyslogConstants.LOG_USER;
        } else if ("MAIL".equalsIgnoreCase(facilityStr)) {
          return SyslogConstants.LOG_MAIL;
        } else if ("DAEMON".equalsIgnoreCase(facilityStr)) {
          return SyslogConstants.LOG_DAEMON;
        } else if ("AUTH".equalsIgnoreCase(facilityStr)) {
          return SyslogConstants.LOG_AUTH;
        } else if ("SYSLOG".equalsIgnoreCase(facilityStr)) {
          return SyslogConstants.LOG_SYSLOG;
        } else if ("LPR".equalsIgnoreCase(facilityStr)) {
          return SyslogConstants.LOG_LPR;
        } else if ("NEWS".equalsIgnoreCase(facilityStr)) {
          return SyslogConstants.LOG_NEWS;
        } else if ("UUCP".equalsIgnoreCase(facilityStr)) {
          return SyslogConstants.LOG_UUCP;
        } else if ("CRON".equalsIgnoreCase(facilityStr)) {
          return SyslogConstants.LOG_CRON;
        } else if ("AUTHPRIV".equalsIgnoreCase(facilityStr)) {
          return SyslogConstants.LOG_AUTHPRIV;
        } else if ("FTP".equalsIgnoreCase(facilityStr)) {
          return SyslogConstants.LOG_FTP;
        } else if ("LOCAL0".equalsIgnoreCase(facilityStr)) {
          return SyslogConstants.LOG_LOCAL0;
        } else if ("LOCAL1".equalsIgnoreCase(facilityStr)) {
          return SyslogConstants.LOG_LOCAL1;
        } else if ("LOCAL2".equalsIgnoreCase(facilityStr)) {
          return SyslogConstants.LOG_LOCAL2;
        } else if ("LOCAL3".equalsIgnoreCase(facilityStr)) {
          return SyslogConstants.LOG_LOCAL3;
        } else if ("LOCAL4".equalsIgnoreCase(facilityStr)) {
          return SyslogConstants.LOG_LOCAL4;
        } else if ("LOCAL5".equalsIgnoreCase(facilityStr)) {
          return SyslogConstants.LOG_LOCAL5;
        } else if ("LOCAL6".equalsIgnoreCase(facilityStr)) {
          return SyslogConstants.LOG_LOCAL6;
        } else if ("LOCAL7".equalsIgnoreCase(facilityStr)) {
          return SyslogConstants.LOG_LOCAL7;
        } else {
          throw new IllegalArgumentException(facilityStr
              + " is not a valid syslog facility string");
        }
      }
    
      /**
       * Returns the value of the <b>SyslogHost</b> option.
       */
      public String getSyslogHost() {
        return syslogHost;
      }
    
      /**
       * The <b>SyslogHost</b> option is the name of the the syslog host where log
       * output should go.
       * 
       * <b>WARNING</b> If the SyslogHost is not set, then this appender will fail.
       */
      public void setSyslogHost(String syslogHost) {
        this.syslogHost = syslogHost;
      }
    
      /**
       * Returns the string value of the <b>Facility</b> option.
       * 
       * See {@link #setFacility} for the set of allowed values.
       */
      public String getFacility() {
        return facilityStr;
      }
    
      /**
       * The <b>Facility</b> option must be set one of the strings KERN, USER, MAIL,
       * DAEMON, AUTH, SYSLOG, LPR, NEWS, UUCP, CRON, AUTHPRIV, FTP, NTP, AUDIT,
       * ALERT, CLOCK, LOCAL0, LOCAL1, LOCAL2, LOCAL3, LOCAL4, LOCAL5, LOCAL6,
       * LOCAL7. Case is not important.
       * 
       * <p>
       * See {@link SyslogConstants} and RFC 3164 for more information about the
       * <b>Facility</b> option.
       */
      public void setFacility(String facilityStr) {
        if (facilityStr != null) {
          facilityStr = facilityStr.trim();
        }
        this.facilityStr = facilityStr;
      }
    
      /**
       * 
       * @return
       */
      public int getPort() {
        return port;
      }
    
      /**
       * The port number on the syslog server to connect to. Normally, you would not
       * want to change the default value, that is 514.
       */
      public void setPort(int port) {
        this.port = port;
      }
    
      /**
       * 
       * @return
       */
      public int getMaxMessageSize() {
        return maxMessageSize;
      }
    
      /**
       * Maximum size for the syslog message (in characters); messages
       * longer than this are truncated. The default value is 65400 (which
       * is near the maximum for syslog-over-UDP). Note that the value is
       * characters; the number of bytes may vary if non-ASCII characters
       * are present.
       */
      public void setMaxMessageSize(int maxMessageSize) {
        this.maxMessageSize = maxMessageSize;
      }
    
      public Layout<E> getLayout() {
        return layout;
      }
    
      public void setLayout(Layout<E> layout) {
        addWarn("The layout of a SyslogAppender cannot be set directly. See also "
            + SYSLOG_LAYOUT_URL);
      }
    
      @Override
      public void stop() {
        sos.close();
        super.stop();
      }
    
    /**
       * See {@link #setSuffixPattern(String).
       * 
       * @return
       */
      public String getSuffixPattern() {
        return suffixPattern;
      }
    
      /**
       * The <b>suffixPattern</b> option specifies the format of the
       * non-standardized part of the message sent to the syslog server.
       * 
       * @param suffixPattern
       */
      public void setSuffixPattern(String suffixPattern) {
        this.suffixPattern = suffixPattern;
      }
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/DefaultSocketConnector.java�������0000644�0001750�0001750�00000007114�12143151241�031724� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net;
    
    import java.io.IOException;
    import java.net.InetAddress;
    import java.net.Socket;
    
    import javax.net.SocketFactory;
    
    import ch.qos.logback.core.util.DelayStrategy;
    import ch.qos.logback.core.util.FixedDelay;
    
    /**
     * Default implementation of {@link SocketConnector}.
     *
     * @author Carl Harris
     * @since 1.0.12
     */
    public class DefaultSocketConnector implements SocketConnector {
    
      private final InetAddress address;
      private final int port;
      private final DelayStrategy delayStrategy;
    
      private ExceptionHandler exceptionHandler;
      private SocketFactory socketFactory;
    
      /**
       * Constructs a new connector.
       *
       * @param address      address of remote listener
       * @param port         port of remote listener
       * @param initialDelay delay before initial connection attempt
       * @param retryDelay   delay after failed connection attempt
       */
      public DefaultSocketConnector(InetAddress address, int port,
                                    int initialDelay, int retryDelay) {
        this(address, port, new FixedDelay(initialDelay, retryDelay));
      }
    
      /**
       * Constructs a new connector.
       *
       * @param address       address of remote listener
       * @param port          port of remote listener
       * @param delayStrategy strategy for choosing the delay to impose before
       *                      each connection attempt
       */
      public DefaultSocketConnector(InetAddress address, int port,
                                    DelayStrategy delayStrategy) {
        this.address = address;
        this.port = port;
        this.delayStrategy = delayStrategy;
      }
    
      /**
       * Loops until the desired connection is established and returns the resulting connector.
       */
      public Socket call() throws InterruptedException {
        useDefaultsForMissingFields();
        Socket socket = createSocket();
        while (socket == null && !Thread.currentThread().isInterrupted()) {
          Thread.sleep(delayStrategy.nextDelay());
          socket = createSocket();
        }
        return socket;
      }
    
      private Socket createSocket() {
        Socket newSocket = null;
        try {
          newSocket = socketFactory.createSocket(address, port);
        } catch (IOException ioex) {
          exceptionHandler.connectionFailed(this, ioex);
        }
        return newSocket;
      }
    
      private void useDefaultsForMissingFields() {
        if (exceptionHandler == null) {
          exceptionHandler = new ConsoleExceptionHandler();
        }
        if (socketFactory == null) {
          socketFactory = SocketFactory.getDefault();
        }
      }
    
      /**
       * {@inheritDoc}
       */
      public void setExceptionHandler(ExceptionHandler exceptionHandler) {
        this.exceptionHandler = exceptionHandler;
      }
    
      /**
       * {@inheritDoc}
       */
      public void setSocketFactory(SocketFactory socketFactory) {
        this.socketFactory = socketFactory;
      }
    
      /**
       * A default {@link ExceptionHandler} that writes to {@code System.out}
       */
      private static class ConsoleExceptionHandler implements ExceptionHandler {
    
        public void connectionFailed(SocketConnector connector, Exception ex) {
          System.out.println(ex);
        }
    
      }
    
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/JMSAppenderBase.java��������������0000644�0001750�0001750�00000012142�12136042272�030221� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net;
    
    import java.util.Hashtable;
    import java.util.Properties;
    
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.naming.NameNotFoundException;
    import javax.naming.NamingException;
    
    import ch.qos.logback.core.AppenderBase;
    
    /**
     * This class serves as a base class for 
     * JMSTopicAppender and JMSQueueAppender
     * 
     * For more information about this appender, please refer to:
     * http://logback.qos.ch/manual/appenders.html#JMSAppenderBase
     *
     * @author Ceki G&uuml;lc&uuml;
     * @author S&eacute;bastien Pennec
     */
    public abstract class JMSAppenderBase<E> extends AppenderBase<E> {
    
      protected String securityPrincipalName;
      protected String securityCredentials;
      protected String initialContextFactoryName;
      protected String urlPkgPrefixes;
      protected String providerURL;
      protected String userName;
      protected String password;
      
      
      protected Object lookup(Context ctx, String name) throws NamingException {
        try {
          return ctx.lookup(name);
        } catch (NameNotFoundException e) {
          addError("Could not find name [" + name + "].");
          throw e;
        }
      }
    
      public Context buildJNDIContext() throws NamingException {
        Context jndi = null;
    
        // addInfo("Getting initial context.");
        if (initialContextFactoryName != null) {
          Properties env = buildEnvProperties();
          jndi = new InitialContext(env);
        } else {
          jndi = new InitialContext();
        }
        return jndi;
      }
      
      public Properties buildEnvProperties() {
        Properties env = new Properties();
        env.put(Context.INITIAL_CONTEXT_FACTORY, initialContextFactoryName);
        if (providerURL != null) {
          env.put(Context.PROVIDER_URL, providerURL);
        } else {
          addWarn("You have set InitialContextFactoryName option but not the "
              + "ProviderURL. This is likely to cause problems.");
        }
        if (urlPkgPrefixes != null) {
          env.put(Context.URL_PKG_PREFIXES, urlPkgPrefixes);
        }
    
        if (securityPrincipalName != null) {
          env.put(Context.SECURITY_PRINCIPAL, securityPrincipalName);
          if (securityCredentials != null) {
            env.put(Context.SECURITY_CREDENTIALS, securityCredentials);
          } else {
            addWarn("You have set SecurityPrincipalName option but not the "
                + "SecurityCredentials. This is likely to cause problems.");
          }
        }
        return env;
      }
      
      
      
      /**
       * Returns the value of the <b>InitialContextFactoryName</b> option. See
       * {@link #setInitialContextFactoryName} for more details on the meaning of
       * this option.
       */
      public String getInitialContextFactoryName() {
        return initialContextFactoryName;
      }
    
      /**
       * Setting the <b>InitialContextFactoryName</b> method will cause this
       * <code>JMSAppender</code> instance to use the {@link
       * InitialContext#InitialContext(Hashtable)} method instead of the no-argument
       * constructor. If you set this option, you should also at least set the
       * <b>ProviderURL</b> option.
       * 
       * <p>
       * See also {@link #setProviderURL(String)}.
       */
      public void setInitialContextFactoryName(String initialContextFactoryName) {
        this.initialContextFactoryName = initialContextFactoryName;
      }
    
      public String getProviderURL() {
        return providerURL;
      }
    
      public void setProviderURL(String providerURL) {
        this.providerURL = providerURL;
      }
    
      public String getURLPkgPrefixes() {
        return urlPkgPrefixes;
      }
    
      public void setURLPkgPrefixes(String urlPkgPrefixes) {
        this.urlPkgPrefixes = urlPkgPrefixes;
      }
    
      public String getSecurityCredentials() {
        return securityCredentials;
      }
    
      public void setSecurityCredentials(String securityCredentials) {
        this.securityCredentials = securityCredentials;
      }
    
      public String getSecurityPrincipalName() {
        return securityPrincipalName;
      }
    
      public void setSecurityPrincipalName(String securityPrincipalName) {
        this.securityPrincipalName = securityPrincipalName;
      }
    
      public String getUserName() {
        return userName;
      }
    
      /**
       * The user name to use when {@link
       * javax.jms.TopicConnectionFactory#createTopicConnection(String, String)}
       * creating a topic session}. If you set this option, you should also set the
       * <b>Password</b> option. See {@link #setPassword(String)}.
       */
      public void setUserName(String userName) {
        this.userName = userName;
      }
    
      public String getPassword() {
        return password;
      }
    
      /**
       * The password to use when creating a topic session.
       */
      public void setPassword(String password) {
        this.password = password;
      }
    
      
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/net/AbstractSSLSocketAppender.java����0000644�0001750�0001750�00000006067�12143151241�032277� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net;
    
    import javax.net.SocketFactory;
    import javax.net.ssl.SSLContext;
    
    import ch.qos.logback.core.net.ssl.ConfigurableSSLSocketFactory;
    import ch.qos.logback.core.net.ssl.SSLComponent;
    import ch.qos.logback.core.net.ssl.SSLConfiguration;
    import ch.qos.logback.core.net.ssl.SSLParametersConfiguration;
    
    /**
     * An abstract base for module specific {@code SSLSocketAppender}
     * implementations located in other logback modules.
     *
     * @author Carl Harris
     */
    public abstract class AbstractSSLSocketAppender<E> extends AbstractSocketAppender<E>
        implements SSLComponent {
    
      private SSLConfiguration ssl;
      private SocketFactory socketFactory;
    
      /**
       * Constructs a new appender.
       */
      protected AbstractSSLSocketAppender() {
      }
      
      /**
       * Constructs a new appender that will connect to the given remote host 
       * and port.
       * <p>
       * This constructor was introduced primarily to allow the encapsulation 
       * of the base {@link AbstractSocketAppender} to be improved in a manner that
       * is least disruptive to <em>existing</em> subclasses.  <strong>This
       * constructor will be removed in future release</strong>.
       * @param remoteHost target remote host
       * @param port target port on remote host
       */
      @Deprecated
      protected AbstractSSLSocketAppender(String remoteHost, int port) {
        super(remoteHost, port);
      }
      
      /**
       * Gets an {@link SocketFactory} that produces SSL sockets using an
       * {@link SSLContext} that is derived from the appender's configuration.
       * @return socket factory
       */
      @Override
      protected SocketFactory getSocketFactory() {
        return socketFactory;
      }
    
      /**
       * {@inheritDoc}
       */
      @Override
      public void start() {
        try {
          SSLContext sslContext = getSsl().createContext(this);
          SSLParametersConfiguration parameters = getSsl().getParameters();
          parameters.setContext(getContext());
          socketFactory = new ConfigurableSSLSocketFactory(parameters, 
              sslContext.getSocketFactory());
          super.start();
        }
        catch (Exception ex) {
          addError(ex.getMessage(), ex);
        }
      }
    
      /**
       * Gets the SSL configuration.
       * @return SSL configuration; if no configuration has been set, a
       *    default configuration is returned
       */
      public SSLConfiguration getSsl() {
        if (ssl == null) {
          ssl = new SSLConfiguration();
        }
        return ssl;
      }
    
      /**
       * Sets the SSL configuration.
       * @param ssl the SSL configuration to set
       */
      public void setSsl(SSLConfiguration ssl) {
        this.ssl = ssl;
      }
    
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/helpers/������������������������������0000755�0001750�0001750�00000000000�12203357067�025335� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/helpers/Transform.java����������������0000644�0001750�0001750�00000006333�12136042272�030152� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.helpers;
    
    /**
     * Utility class for transforming strings.
     * 
     * @author Ceki G&uuml;lc&uuml;
     * @author Michael A. McAngus
     */
    public class Transform {
      private static final String CDATA_START = "<![CDATA[";
      private static final String CDATA_END = "]]>";
      private static final String CDATA_PSEUDO_END = "]]&gt;";
      private static final String CDATA_EMBEDED_END = CDATA_END + CDATA_PSEUDO_END
          + CDATA_START;
      private static final int CDATA_END_LEN = CDATA_END.length();
    
      /**
       * This method takes a string which may contain HTML tags (ie, &lt;b&gt;,
       * &lt;table&gt;, etc) and replaces any '<' and '>' characters with
       * respective predefined entity references.
       * 
       * @param input
       *          The text to be converted.
       */
      public static String escapeTags(final String input) {
        // if input is null or zero length or contains no < and > characters, return it as is
        if ((input == null) || (input.length() == 0)
            || (input.indexOf("<") == -1 && input.indexOf(">") == -1)) {
          return input;
        }
    
        StringBuffer buf = new StringBuffer(input);
        return escapeTags(buf);
      }
      
    
      /**
       * This method takes a StringBuilder which may contain HTML tags (ie, &lt;b&gt;,
       * &lt;table&gt;, etc) and replaces any '<' and '>' characters with
       * respective predefined entity references.
       * @param buf StringBuffer to transform
       * @return
       */
      public static String escapeTags(final StringBuffer buf) {
        for (int i = 0; i < buf.length(); i++) {
          char ch = buf.charAt(i);
          if (ch == '<') {
            buf.replace(i, i + 1, "&lt;");
          } else if (ch == '>') {
            buf.replace(i, i + 1, "&gt;");
          }
        }
        return buf.toString();
      }
      
    
      /**
       * Ensures that embedded CDEnd strings (]]>) are handled properly within
       * message, NDC and throwable tag text.
       * 
       * @param output
       *          Writer. The initial CDSutart (<![CDATA[) and final CDEnd (]]>) of
       *          the CDATA section are the responsibility of the calling method.
       * 
       * @param str
       *          The String that is inserted into an existing CDATA Section.
       */
      public static void appendEscapingCDATA(StringBuilder output, String str) {
        if (str == null) {
          return;
        }
    
        int end = str.indexOf(CDATA_END);
    
        if (end < 0) {
          output.append(str);
    
          return;
        }
    
        int start = 0;
    
        while (end > -1) {
          output.append(str.substring(start, end));
          output.append(CDATA_EMBEDED_END);
          start = end + CDATA_END_LEN;
    
          if (start < str.length()) {
            end = str.indexOf(CDATA_END, start);
          } else {
            return;
          }
        }
    
        output.append(str.substring(start));
      }
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/helpers/CyclicBuffer.java�������������0000644�0001750�0001750�00000010270�12136042272�030532� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.helpers;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * CyclicBuffer holds values in a cyclic array.
     * 
     * <p>It allows read access to any element in the buffer not just the first or
     * last element.
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public class CyclicBuffer<E> {
    
      E[] ea;
      int first;
      int last;
      int numElems;
      int maxSize;
    
      /**
       * Instantiate a new CyclicBuffer of at most <code>maxSize</code> events.
       * 
       * The <code>maxSize</code> argument must a positive integer.
       * 
       * @param maxSize
       *                The maximum number of elements in the buffer.
       */
      public CyclicBuffer(int maxSize) throws IllegalArgumentException {
        if (maxSize < 1) {
          throw new IllegalArgumentException("The maxSize argument (" + maxSize
              + ") is not a positive integer.");
        }
        init(maxSize);
      }
    
      public CyclicBuffer(CyclicBuffer<E> other) {
       this.maxSize = other.maxSize;
       ea = (E[]) new Object[maxSize];
       System.arraycopy(other.ea, 0, this.ea, 0, maxSize);
       this.last = other.last;
       this.first = other.first;
       this.numElems = other.numElems;
      }
    
      @SuppressWarnings("unchecked")
      private void init(int maxSize) {
        this.maxSize = maxSize;
        ea = (E[]) new Object[maxSize];
        first = 0;
        last = 0;
        numElems = 0;
      }
    
      /**
       * Clears the buffer and resets all attributes.
       */
      public void clear() {
        init(this.maxSize);
      }
    
      /**
       * Add an <code>event</code> as the last event in the buffer.
       * 
       */
      public void add(E event) {
        ea[last] = event;
        if (++last == maxSize)
          last = 0;
    
        if (numElems < maxSize)
          numElems++;
        else if (++first == maxSize)
          first = 0;
      }
    
      /**
       * Get the <i>i</i>th oldest event currently in the buffer. If <em>i</em>
       * is outside the range 0 to the number of elements currently in the buffer,
       * then <code>null</code> is returned.
       */
      public E get(int i) {
        if (i < 0 || i >= numElems)
          return null;
    
        return ea[(first + i) % maxSize];
      }
    
      public int getMaxSize() {
        return maxSize;
      }
    
      /**
       * Get the oldest (first) element in the buffer. The oldest element is removed
       * from the buffer.
       */
      public E get() {
        E r = null;
        if (numElems > 0) {
          numElems--;
          r = ea[first];
          ea[first] = null;
          if (++first == maxSize)
            first = 0;
        }
        return r;
      }
      
      public List<E> asList() {
        List<E> tList = new ArrayList<E>();
        for(int i = 0; i < length(); i++) {
          tList.add(get(i));
        }
        return tList;
      }
    
      /**
       * Get the number of elements in the buffer. This number is guaranteed to be
       * in the range 0 to <code>maxSize</code> (inclusive).
       */
      public int length() {
        return numElems;
      }
    
      /**
       * Resize the cyclic buffer to <code>newSize</code>.
       * 
       * @throws IllegalArgumentException
       *                 if <code>newSize</code> is negative.
       */
      @SuppressWarnings("unchecked")
      public void resize(int newSize) {
        if (newSize < 0) {
          throw new IllegalArgumentException("Negative array size [" + newSize
              + "] not allowed.");
        }
        if (newSize == numElems)
          return; // nothing to do
    
        // 
        E[] temp = (E[]) new Object[newSize];
    
        int loopLen = newSize < numElems ? newSize : numElems;
    
        for (int i = 0; i < loopLen; i++) {
          temp[i] = ea[first];
          ea[first] = null;
          if (++first == numElems)
            first = 0;
        }
        ea = temp;
        first = 0;
        numElems = loopLen;
        maxSize = newSize;
        if (loopLen == newSize) {
          last = 0;
        } else {
          last = loopLen;
        }
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/helpers/package.html������������������0000644�0001750�0001750�00000000255�11377016712�027620� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
    
    <html> 
      <head>
        <title></title>
      </head>
      
      <body>
        
        <p>Helpers package.</p>
    
    
      </body> 
    </html>���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/helpers/ThrowableToStringArray.java���0000644�0001750�0001750�00000004547�12136042272�032624� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.helpers;
    
    import java.util.LinkedList;
    import java.util.List;
    
    import ch.qos.logback.core.CoreConstants;
    
    public class ThrowableToStringArray {
    
      public static String[] convert(Throwable t) {
        List<String> strList = new LinkedList<String>();
        extract(strList, t, null);
        return strList.toArray(new String[0]);
    
      }
    
      private static void extract(List<String> strList, Throwable t,
          StackTraceElement[] parentSTE) {
    
        StackTraceElement[] ste = t.getStackTrace();
        final int numberOfcommonFrames = findNumberOfCommonFrames(ste, parentSTE);
    
        strList.add(formatFirstLine(t, parentSTE));
        for (int i = 0; i < (ste.length - numberOfcommonFrames); i++) {
          strList.add("\tat "+ste[i].toString());
        }
    
        if (numberOfcommonFrames != 0) {
          strList.add("\t... "+numberOfcommonFrames + " common frames omitted");
        }
    
        Throwable cause = t.getCause();
        if (cause != null) {
          ThrowableToStringArray.extract(strList, cause, ste);
        }
      }
    
      private static String formatFirstLine(Throwable t,
          StackTraceElement[] parentSTE) {
        String prefix = "";
        if (parentSTE != null) {
          prefix = CoreConstants.CAUSED_BY;
        }
    
        String result = prefix + t.getClass().getName();
        if (t.getMessage() != null) {
          result += ": " + t.getMessage();
        }
        return result;
      }
    
      private static int findNumberOfCommonFrames(StackTraceElement[] ste,
          StackTraceElement[] parentSTE) {
        if (parentSTE == null) {
          return 0;
        }
    
        int steIndex = ste.length - 1;
        int parentIndex = parentSTE.length - 1;
        int count = 0;
        while (steIndex >= 0 && parentIndex >= 0) {
          if (ste[steIndex].equals(parentSTE[parentIndex])) {
            count++;
          } else {
            break;
          }
          steIndex--;
          parentIndex--;
        }
        return count;
      }
    
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/helpers/NOPAppender.java��������������0000644�0001750�0001750�00000001270�12136042272�030305� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.helpers;
    
    import ch.qos.logback.core.AppenderBase;
    
    final public class NOPAppender<E> extends AppenderBase<E> {
    
      @Override
      protected void append(E eventObject) {
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/AsyncAppenderBase.java����������������0000644�0001750�0001750�00000015675�12136213375�030101� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core;
    
    import ch.qos.logback.core.spi.AppenderAttachable;
    import ch.qos.logback.core.spi.AppenderAttachableImpl;
    
    import java.util.Iterator;
    import java.util.concurrent.ArrayBlockingQueue;
    import java.util.concurrent.BlockingQueue;
    
    /**
     * This appender and derived classes, log events asynchronously.  In order to avoid loss of logging events, this
     * appender should be closed. It is the user's  responsibility to close appenders, typically at the end of the
     * application lifecycle.
     * <p/>
     * This appender buffers events in a {@link BlockingQueue}. {@link Worker} thread created by this appender takes
     * events from the head of the queue, and dispatches them to the single appender attached to this appender.
     * <p/>
     * <p>Please refer to the <a href="http://logback.qos.ch/manual/appenders.html#AsyncAppender">logback manual</a> for
     * further information about this appender.</p>
     *
     * @param <E>
     * @author Ceki G&uuml;lc&uuml;
     * @author Torsten Juergeleit
     * @since 1.0.4
     */
    public class AsyncAppenderBase<E> extends UnsynchronizedAppenderBase<E> implements AppenderAttachable<E> {
    
      AppenderAttachableImpl<E> aai = new AppenderAttachableImpl<E>();
      BlockingQueue<E> blockingQueue;
    
      /**
       * The default buffer size.
       */
      public static final int DEFAULT_QUEUE_SIZE = 256;
      int queueSize = DEFAULT_QUEUE_SIZE;
    
      int appenderCount = 0;
    
      static final int UNDEFINED = -1;
      int discardingThreshold = UNDEFINED;
    
      Worker worker = new Worker();
    
      /**
       * Is the eventObject passed as parameter discardable? The base class's implementation of this method always returns
       * 'false' but sub-classes may (and do) override this method.
       * <p/>
       * <p>Note that only if the buffer is nearly full are events discarded. Otherwise, when the buffer is "not full"
       * all events are logged.
       *
       * @param eventObject
       * @return - true if the event can be discarded, false otherwise
       */
      protected boolean isDiscardable(E eventObject) {
        return false;
      }
    
    
      /**
       * Pre-process the event prior to queueing. The base class does no pre-processing but sub-classes can
       * override this behavior.
       *
       * @param eventObject
       */
      protected void preprocess(E eventObject) {
      }
    
    
      @Override
      public void start() {
        if (appenderCount == 0) {
          addError("No attached appenders found.");
          return;
        }
        if (queueSize < 1) {
          addError("Invalid queue size [" + queueSize + "]");
          return;
        }
        blockingQueue = new ArrayBlockingQueue<E>(queueSize);
    
        if (discardingThreshold == UNDEFINED)
          discardingThreshold = queueSize / 5;
        addInfo("Setting discardingThreshold to " + discardingThreshold);
        worker.setDaemon(true);
        worker.setName("AsyncAppender-Worker-" + worker.getName());
        // make sure this instance is marked as "started" before staring the worker Thread
        super.start();
        worker.start();
      }
    
      @Override
      public void stop() {
        if (!isStarted())
          return;
    
        // mark this appender as stopped so that Worker can also processPriorToRemoval if it is invoking aii.appendLoopOnAppenders
        // and sub-appenders consume the interruption
        super.stop();
    
        // interrupt the worker thread so that it can terminate. Note that the interruption can be consumed
        // by sub-appenders
        worker.interrupt();
        try {
          worker.join(1000);
        } catch (InterruptedException e) {
          addError("Failed to join worker thread", e);
        }
      }
    
    
      @Override
      protected void append(E eventObject) {
        if (isQueueBelowDiscardingThreshold() && isDiscardable(eventObject)) {
          return;
        }
        preprocess(eventObject);
        put(eventObject);
      }
    
      private boolean isQueueBelowDiscardingThreshold() {
        return (blockingQueue.remainingCapacity() < discardingThreshold);
      }
    
      private void put(E eventObject) {
        try {
          blockingQueue.put(eventObject);
        } catch (InterruptedException e) {
        }
      }
    
      public int getQueueSize() {
        return queueSize;
      }
    
      public void setQueueSize(int queueSize) {
        this.queueSize = queueSize;
      }
    
      public int getDiscardingThreshold() {
        return discardingThreshold;
      }
    
      public void setDiscardingThreshold(int discardingThreshold) {
        this.discardingThreshold = discardingThreshold;
      }
    
      /**
       * Returns the number of elements currently in the blocking queue.
       *
       * @return number of elements currently in the queue.
       */
      public int getNumberOfElementsInQueue() {
        return blockingQueue.size();
      }
    
      /**
       * The remaining capacity available in the blocking queue.
       *
       * @return the remaining capacity
       * @see {@link java.util.concurrent.BlockingQueue#remainingCapacity()}
       */
      public int getRemainingCapacity() {
        return blockingQueue.remainingCapacity();
      }
    
    
    
      public void addAppender(Appender<E> newAppender) {
        if (appenderCount == 0) {
          appenderCount++;
          addInfo("Attaching appender named ["+newAppender.getName()+"] to AsyncAppender.");
          aai.addAppender(newAppender);
        } else {
          addWarn("One and only one appender may be attached to AsyncAppender.");
          addWarn("Ignoring additional appender named [" + newAppender.getName() + "]");
        }
      }
    
      public Iterator<Appender<E>> iteratorForAppenders() {
        return aai.iteratorForAppenders();
      }
    
      public Appender<E> getAppender(String name) {
        return aai.getAppender(name);
      }
    
      public boolean isAttached(Appender<E> eAppender) {
        return aai.isAttached(eAppender);
      }
    
      public void detachAndStopAllAppenders() {
        aai.detachAndStopAllAppenders();
      }
    
      public boolean detachAppender(Appender<E> eAppender) {
        return aai.detachAppender(eAppender);
      }
    
      public boolean detachAppender(String name) {
        return aai.detachAppender(name);
      }
    
      class Worker extends Thread {
    
        public void run() {
          AsyncAppenderBase<E> parent = AsyncAppenderBase.this;
          AppenderAttachableImpl<E> aai = parent.aai;
    
          // loop while the parent is started
          while (parent.isStarted()) {
            try {
              E e = parent.blockingQueue.take();
              aai.appendLoopOnAppenders(e);
            } catch (InterruptedException ie) {
              break;
            }
          }
    
          addInfo("Worker thread will flush remaining events before exiting. ");
          for (E e : parent.blockingQueue) {
            aai.appendLoopOnAppenders(e);
          }
    
          aai.detachAndStopAllAppenders();
        }
      }
    }
    �������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/Appender.java�������������������������0000644�0001750�0001750�00000002310�12136042271�026261� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core;
      
    import ch.qos.logback.core.spi.ContextAware;
    import ch.qos.logback.core.spi.FilterAttachable;
    import ch.qos.logback.core.spi.LifeCycle;
      
    
    public interface Appender<E> extends LifeCycle, ContextAware, FilterAttachable<E> {
    
      /**
       * Get the name of this appender. The name uniquely identifies the appender.
       */
      String getName();
    
      /**
       * This is where an appender accomplishes its work. Note that the argument 
       * is of type Object.
       * @param event
       */
      void doAppend(E event) throws LogbackException;
    
      /**
       * Set the name of this appender. The name is used by other components to
       * identify this appender.
       * 
       */
      void setName(String name);
      
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/main/java/ch/qos/logback/core/FileAppender.java���������������������0000644�0001750�0001750�00000013107�12136042271�027067� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core;
    
    import java.io.File;
    import java.io.IOException;
    import java.nio.channels.FileChannel;
    import java.nio.channels.FileLock;
    
    import ch.qos.logback.core.recovery.ResilientFileOutputStream;
    import ch.qos.logback.core.util.FileUtil;
    
    /**
     * FileAppender appends log events to a file.
     * 
     * For more information about this appender, please refer to the online manual
     * at http://logback.qos.ch/manual/appenders.html#FileAppender
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public class FileAppender<E> extends OutputStreamAppender<E> {
    
      /**
       * Append to or truncate the file? The default value for this variable is
       * <code>true</code>, meaning that by default a <code>FileAppender</code> will
       * append to an existing file and not truncate it.
       */
      protected boolean append = true;
    
      /**
       * The name of the active log file.
       */
      protected String fileName = null;
    
      private boolean prudent = false;
    
      /**
       * The <b>File</b> property takes a string value which should be the name of
       * the file to append to.
       */
      public void setFile(String file) {
        if (file == null) {
          fileName = file;
        } else {
          // Trim spaces from both ends. The users probably does not want
          // trailing spaces in file names.
          fileName = file.trim();
        }
      }
    
      /**
       * Returns the value of the <b>Append</b> property.
       */
      public boolean isAppend() {
        return append;
      }
    
      /**
       * This method is used by derived classes to obtain the raw file property.
       * Regular users should not be calling this method.
       * 
       * @return the value of the file property
       */
      final public String rawFileProperty() {
        return fileName;
      }
    
      /**
       * Returns the value of the <b>File</b> property.
       * 
       * <p>
       * This method may be overridden by derived classes.
       * 
       */
      public String getFile() {
        return fileName;
      }
    
      /**
       * If the value of <b>File</b> is not <code>null</code>, then
       * {@link #openFile} is called with the values of <b>File</b> and
       * <b>Append</b> properties.
       */
      public void start() {
        int errors = 0;
        if (getFile() != null) {
          addInfo("File property is set to [" + fileName + "]");
    
          if (prudent) {
            if (!isAppend()) {
              setAppend(true);
              addWarn("Setting \"Append\" property to true on account of \"Prudent\" mode");
            }
          }
    
          try {
            openFile(getFile());
          } catch (java.io.IOException e) {
            errors++;
            addError("openFile(" + fileName + "," + append + ") call failed.", e);
          }
        } else {
          errors++;
          addError("\"File\" property not set for appender named [" + name + "].");
        }
        if (errors == 0) {
          super.start();
        }
      }
    
      /**
       * <p>
       * Sets and <i>opens</i> the file where the log output will go. The specified
       * file must be writable.
       * 
       * <p>
       * If there was already an opened file, then the previous file is closed
       * first.
       * 
       * <p>
       * <b>Do not use this method directly. To configure a FileAppender or one of
       * its subclasses, set its properties one by one and then call start().</b>
       * 
       * @param file_name
       *          The path to the log file.
       */
      public void openFile(String file_name) throws IOException {
        synchronized (lock) {
          File file = new File(file_name);
          if (FileUtil.isParentDirectoryCreationRequired(file)) {
            boolean result = FileUtil.createMissingParentDirectories(file);
            if (!result) {
              addError("Failed to create parent directories for ["
                  + file.getAbsolutePath() + "]");
            }
          }
    
          ResilientFileOutputStream resilientFos = new ResilientFileOutputStream(
              file, append);
          resilientFos.setContext(context);
          setOutputStream(resilientFos);
        }
      }
    
      /**
       * @see #setPrudent(boolean)
       * 
       * @return true if in prudent mode
       */
      public boolean isPrudent() {
        return prudent;
      }
    
      /**
       * When prudent is set to true, file appenders from multiple JVMs can safely
       * write to the same file.
       * 
       * @param prudent
       */
      public void setPrudent(boolean prudent) {
        this.prudent = prudent;
      }
    
      public void setAppend(boolean append) {
        this.append = append;
      }
    
      private void safeWrite(E event) throws IOException {
        ResilientFileOutputStream resilientFOS = (ResilientFileOutputStream) getOutputStream();
        FileChannel fileChannel = resilientFOS.getChannel();
        if (fileChannel == null) {
          return;
        }
        FileLock fileLock = null;
        try {
          fileLock = fileChannel.lock();
          long position = fileChannel.position();
          long size = fileChannel.size();
          if (size != position) {
            fileChannel.position(size);
          }
          super.writeOut(event);
        } finally {
          if (fileLock != null) {
            fileLock.release();
          }
        }
      }
    
      @Override
      protected void writeOut(E event) throws IOException {
        if (prudent) {
          safeWrite(event);
        } else {
          super.writeOut(event);
        }
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/���������������������������������������������������������������0000755�0001750�0001750�00000000000�12203357067�017257� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/scala/���������������������������������������������������������0000755�0001750�0001750�00000000000�12136042147�020335� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/scala/ch/������������������������������������������������������0000755�0001750�0001750�00000000000�12136042147�020727� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/scala/ch/qos/��������������������������������������������������0000755�0001750�0001750�00000000000�12136042147�021531� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/scala/ch/qos/logback/������������������������������������������0000755�0001750�0001750�00000000000�12136042147�023133� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/scala/ch/qos/logback/core/�������������������������������������0000755�0001750�0001750�00000000000�12136042147�024063� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/scala/ch/qos/logback/core/rolling/�����������������������������0000755�0001750�0001750�00000000000�12203357067�025536� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000151�00000000000�011562� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/scala/ch/qos/logback/core/rolling/SizeAndTimeBasedFNATP_STest.scala������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/scala/ch/qos/logback/core/rolling/SizeAndTimeBasedFNATP_STest.s0000644�0001750�0001750�00000015021�12136042147�032742� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������package ch.qos.logback.core.rolling
    
    /**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2011, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    
    import ch.qos.logback.core.encoder.EchoEncoder
    import ch.qos.logback.core.status.InfoStatus
    import java.util.Date
    import org.junit.{Ignore, Test}
    import org.junit.Before
    import java.io.File
    import ch.qos.logback.core.util.StatusPrinter
    
    /**
     * @author Ceki G&uuml;c&uuml;
     */
    class SizeAndTimeBasedFNATP_STest extends RollingScaffolding {
      private var sizeAndTimeBasedFNATP: SizeAndTimeBasedFNATP[AnyRef] = null
      private val rfa1: RollingFileAppender[AnyRef] = new RollingFileAppender[AnyRef]
      private val tbrp1: TimeBasedRollingPolicy[AnyRef] = new TimeBasedRollingPolicy[AnyRef]
      private val rfa2: RollingFileAppender[AnyRef] = new RollingFileAppender[AnyRef]
      private val tbrp2: TimeBasedRollingPolicy[AnyRef] = new TimeBasedRollingPolicy[AnyRef]
    
      private val encoder: EchoEncoder[AnyRef] = new EchoEncoder[AnyRef]
      var fileSize = 0
      var fileIndexCounter = 0
      var sizeThreshold = 0
    
      @Before
      def setUp() {
        setUpScaffolding
      }
    
      private def initRollingFileAppender(rfa: RollingFileAppender[AnyRef], filename: String): Unit = {
        rfa.setContext(context)
        rfa.setEncoder(encoder)
        if (filename != null) {
          rfa.setFile(filename)
        }
      }
    
      private def initPolicies(rfa: RollingFileAppender[AnyRef], tbrp: TimeBasedRollingPolicy[AnyRef], filenamePattern: String, sizeThreshold: Int, givenTime: Long, lastCheck: Long): Unit = {
        sizeAndTimeBasedFNATP = new SizeAndTimeBasedFNATP[AnyRef]
        tbrp.setContext(context)
        sizeAndTimeBasedFNATP.setMaxFileSize("" + sizeThreshold)
        tbrp.setTimeBasedFileNamingAndTriggeringPolicy(sizeAndTimeBasedFNATP)
        tbrp.setFileNamePattern(filenamePattern)
        tbrp.setParent(rfa)
        tbrp.timeBasedFileNamingAndTriggeringPolicy.setCurrentTime(givenTime)
        rfa.setRollingPolicy(tbrp)
        tbrp.start
        rfa.start
      }
    
      private def addExpectedFileNamedIfItsTime(randomOutputDir: String, testId: String, msg: String, compressionSuffix: String) {
        fileSize = fileSize + msg.getBytes.length
        if (passThresholdTime(nextRolloverThreshold)) {
          fileIndexCounter = 0
          fileSize = 0
          addExpectedFileName_ByFileIndexCounter(randomOutputDir, testId, getMillisOfCurrentPeriodsStart, fileIndexCounter, compressionSuffix)
          recomputeRolloverThreshold(currentTime)
          return
        }
    
        // windows can delay file size changes, so we only allow for
        // fileIndexCounter 0
        if ((fileIndexCounter < 1) && fileSize > sizeThreshold) {
          addExpectedFileName_ByFileIndexCounter(randomOutputDir, testId, getMillisOfCurrentPeriodsStart, fileIndexCounter, compressionSuffix)
          fileIndexCounter = fileIndexCounter + 1 
          fileSize = 0
        }
      }
    
      def generic(testId: String, stem: String, withSecondPhase: Boolean, compressionSuffix: String = "") {
        var file = if (stem != null) randomOutputDir + stem else null
        initRollingFileAppender(rfa1, file)
        sizeThreshold = 300
        initPolicies(rfa1, tbrp1, randomOutputDir + testId + "-%d{" + DATE_PATTERN_WITH_SECONDS + "}-%i.txt"+compressionSuffix, sizeThreshold, currentTime, 0)
        addExpectedFileName_ByFileIndexCounter(randomOutputDir, testId, getMillisOfCurrentPeriodsStart, fileIndexCounter, compressionSuffix)
        incCurrentTime(100)
        tbrp1.timeBasedFileNamingAndTriggeringPolicy.setCurrentTime(currentTime)
        var runLength: Int = 100
        var prefix: String = "Hello -----------------"
    
        for (i <- 0 until runLength) {
          var msg: String = prefix + i
          rfa1.doAppend(msg)
          addExpectedFileNamedIfItsTime(randomOutputDir, testId, msg, compressionSuffix)
          incCurrentTime(20)
          tbrp1.timeBasedFileNamingAndTriggeringPolicy.setCurrentTime(currentTime)
        }
    
    
        if(withSecondPhase) {
          secondPhase
          runLength = runLength*2
        }
    
        if (stem != null)
          massageExpectedFilesToCorresponToCurrentTarget(file, true)
    
        Thread.sleep(20)
        // wait for compression to finish
        if(tbrp1.future != null) {
          tbrp1.future.get()
        }
        
        StatusPrinter.print(context)
        expectedFilenameList.foreach(println(_))
        existenceCheck(expectedFilenameList)
        sortedContentCheck(randomOutputDir, runLength, prefix)
    
        def secondPhase() {
          rfa1.stop();
       
          if(stem != null) {
            val f = new File(file);
            f.setLastModified(currentTime);
          }
       
          sm.add(new InfoStatus("Time when rfa1 is stopped: " + new Date(currentTime), this));
          sm.add(new InfoStatus("currentTime%1000=" + (currentTime % 1000), this));
    
          initRollingFileAppender(rfa2, file);
          initPolicies(rfa2, tbrp2, randomOutputDir + testId + "-%d{"
                  + DATE_PATTERN_WITH_SECONDS + "}-%i.txt"+compressionSuffix, sizeThreshold, currentTime, 0);
    
          for (i <- runLength until runLength * 2) {
            incCurrentTime(100);
            tbrp2.timeBasedFileNamingAndTriggeringPolicy.setCurrentTime(currentTime);
            var msg = prefix + i
            rfa2.doAppend(msg);
            addExpectedFileNamedIfItsTime(randomOutputDir, testId, msg, compressionSuffix);
          }         
        }
      }
    
      val FIRST_PHASE_ONLY = false
      val WITH_SECOND_PHASE = true
    
      @Test
      def noCompression_FileSet_NoRestart_1 {
        generic("test1", "toto.log", FIRST_PHASE_ONLY)
      }
    
      @Test
      def noCompression_FileBlank_NoRestart_2 {
        generic("test2", null, FIRST_PHASE_ONLY)
      }
    
      @Test
      def noCompression_FileBlank_WithStopStart_3 {
        generic("test3", null, WITH_SECOND_PHASE)
      }
      
      @Test
      def noCompression_FileSet_WithStopStart_4 {
        generic("test4", "test4.log", WITH_SECOND_PHASE)
      }
    
      @Test
      def withGZCompression_FileSet_NoRestart_5 {
        generic("test5", "toto.log", FIRST_PHASE_ONLY, ".gz")
      }
    
      @Test
      def withGZCompression_FileBlank_NoRestart_6 {
        generic("test6", null, FIRST_PHASE_ONLY, ".gz")
      }
    
      @Test
      def withZipCompression_FileSet_NoRestart_7 {
        generic("test7", "toto.log", FIRST_PHASE_ONLY, ".zip")
        checkZipEntryMatchesZipFilename(expectedFilenameList.filter(_.endsWith(".zip")), "test7-20\\d{2}-\\d{2}-\\d{2}_\\d{2}_\\d{2}_\\d{2}-\\d")
    
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/scala/ch/qos/logback/core/rolling/SizeBasedRolling_STest.scala�0000644�0001750�0001750�00000010023�12136042147�033054� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2010, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling
    
    import org.junit.{Before, Test}
    import ch.qos.logback.core.encoder.EchoEncoder
    import java.util.zip.{ZipEntry, ZipFile}
    import org.junit.Assert._
    import ch.qos.logback.core.util.{CoreTestConstants, StatusPrinter}
    
    class SizeBasedRolling_STest extends RollingScaffolding {
    
      
      var rfa: RollingFileAppender[AnyRef] = new RollingFileAppender[AnyRef]
      var fwrp: FixedWindowRollingPolicy = new FixedWindowRollingPolicy
      var sizeBasedTriggeringPolicy = new SizeBasedTriggeringPolicy[AnyRef]
      var encoder: EchoEncoder[AnyRef] = new EchoEncoder[AnyRef]
    
      @Before
      def setUp: Unit = {
        setUpScaffolding
        fwrp.setContext(context)
        fwrp.setParent(rfa)
        rfa.setContext(context)
        sizeBasedTriggeringPolicy.setContext(context)
      }
    
      private def initRFA(filename: String): Unit = {
        rfa.setEncoder(encoder)
        if (filename != null) {
          rfa.setFile(filename)
        }
      }
    
    
      /**
       * Test whether FixedWindowRollingPolicy throws an exception when the
       * ActiveFileName is not set.
       */
      @Test(expected = classOf[IllegalStateException])
      def activeFileNameNotSet() {
        sizeBasedTriggeringPolicy.setMaxFileSize("100")
        sizeBasedTriggeringPolicy.start
    
        fwrp.setFileNamePattern(CoreTestConstants.OUTPUT_DIR_PREFIX + "sizeBased-test1.%i")
        fwrp.start
        // The absence of activeFileName option should cause an exception.
      }
    
    
      def generic(testName: String, fileName: String, filenamePattern: String, expectedFilenameList: List[String]) {
        rfa.setName("ROLLING")
        initRFA(randomOutputDir + fileName)
    
        sizeBasedTriggeringPolicy.setMaxFileSize("100");
        fwrp.setMinIndex(0);
        fwrp.setFileNamePattern(randomOutputDir + filenamePattern);
    
        rfa.triggeringPolicy = sizeBasedTriggeringPolicy
        rfa.rollingPolicy = fwrp
    
        fwrp.start
        sizeBasedTriggeringPolicy.start
        rfa.start
    
        val runLength = 40
        val prefix = "hello"
        for (i <- 0 until runLength) {
          Thread.sleep(10)
          rfa.doAppend(prefix + i)
        }
        rfa.stop()
    
        existenceCheck(expectedFilenameList)
        reverseSortedContentCheck(randomOutputDir, runLength, prefix)
    
      }
    
      @Test
      def smoke() {
        expectedFilenameList = expectedFilenameList ::: List(randomOutputDir + "a-sizeBased-smoke.log")
        expectedFilenameList = expectedFilenameList ::: List(randomOutputDir + "sizeBased-smoke.0")
        expectedFilenameList = expectedFilenameList ::: List(randomOutputDir + "sizeBased-smoke.1")
        generic("zipped", "a-sizeBased-smoke.log", "sizeBased-smoke.%i", expectedFilenameList)
    
      }
      @Test
      def gz() {
        println(randomOutputDir)
        expectedFilenameList = expectedFilenameList ::: List(randomOutputDir + "a-sbr-gzed.log")
        expectedFilenameList = expectedFilenameList ::: List(randomOutputDir + "sbr-gzed.0.gz")
        expectedFilenameList = expectedFilenameList ::: List(randomOutputDir + "sbr-gzed.1.gz")
        generic("gzed", "a-sbr-gzed.log", "sbr-gzed.%i.gz", expectedFilenameList)
      }
    
      // see also LBCORE-199
      @Test
      def zipped() {
        println(randomOutputDir)
        expectedFilenameList = expectedFilenameList ::: List(randomOutputDir + "a-sbr-zipped.log")
        expectedFilenameList = expectedFilenameList ::: List(randomOutputDir + "sbr-zipped.0.zip")
        expectedFilenameList = expectedFilenameList ::: List(randomOutputDir + "sbr-zipped.1.zip")
        generic("zipped", "a-sbr-zipped.log", "sbr-zipped.%i.zip", expectedFilenameList)
        zipEntryNameCheck(expectedFilenameList.filter(_.endsWith(".zip")), "sbr-zipped.20\\d{2}-\\d{2}-\\d{2}_\\d{4}")
      }
    }�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/scala/ch/qos/logback/core/rolling/RollingScaffolding.scala�����0000644�0001750�0001750�00000015730�12136042147�032312� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2010, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     * or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling
    
    import ch.qos.logback.core.{ContextBase, Context}
    import helper.{FileNamePattern, FileFilterUtil}
    import java.util.concurrent.TimeUnit
    import ch.qos.logback.core.util.{CachingDateFormatter, CoreTestConstants}
    import org.junit.Assert._
    import java.io.File
    import ch.qos.logback.core.testUtil.{FileToBufferUtil, RandomUtil}
    import java.util.{ArrayList, Date, Calendar}
    import java.util.zip.{ZipEntry, ZipFile}
    
    trait RollingScaffolding {
      final val DATE_PATTERN_WITH_SECONDS = "yyyy-MM-dd_HH_mm_ss"
      final val SDF = new CachingDateFormatter(DATE_PATTERN_WITH_SECONDS)
    
      val context: Context = new ContextBase
      val sm = context.getStatusManager()
    
      var diff: Int = RandomUtil.getPositiveInt
    
      protected var currentTime: Long = 0L
      protected var randomOutputDir: String = CoreTestConstants.OUTPUT_DIR_PREFIX + diff + "/"
      var cal: Calendar = Calendar.getInstance
      protected var nextRolloverThreshold: Long = 0;
      protected var expectedFilenameList: List[String] = Nil
    
      val FILE_OPTION_SET = true
      val FILE_OPTION_BLANK = false
    
    
      def setUpScaffolding: Unit = {
        context.setName("test")
        cal.set(Calendar.MILLISECOND, 333)
        currentTime = cal.getTimeInMillis
        recomputeRolloverThreshold(currentTime)
      }
    
      protected def incCurrentTime(increment: Long): Unit = {
        currentTime += increment
      }
    
      protected def getMillisOfCurrentPeriodsStart: Long = {
        var delta: Long = currentTime % 1000
        return (currentTime - delta)
      }
    
      protected def getDateOfCurrentPeriodsStart: Date = {
        var delta: Long = currentTime % 1000
        return new Date(currentTime - delta)
      }
    
      protected def addExpectedFileName_ByDate(patternStr: String, millis: Long): Unit = {
        val fileNamePattern = new FileNamePattern(patternStr, context)
        var fn: String = fileNamePattern.convert(new Date(millis))
        println("fn=" + fn)
        expectedFilenameList = expectedFilenameList ::: List(fn)
    
      }
    
      protected def addExpectedFileName_ByFileIndexCounter(randomOutputDir: String, testId: String, millis: Long, fileIndexCounter: Int, compressionSuffix: String): Unit = {
        var fn: String = randomOutputDir + testId + "-" + SDF.format(millis) + "-" + fileIndexCounter + ".txt" + compressionSuffix
        expectedFilenameList = expectedFilenameList ::: List(fn)
      }
    
    
      protected def addExpectedFileNamedIfItsTime_ByDate(fileNamePatternStr: String): Unit = {
        if (passThresholdTime(nextRolloverThreshold)) {
          addExpectedFileName_ByDate(fileNamePatternStr, getMillisOfCurrentPeriodsStart)
          recomputeRolloverThreshold(currentTime)
        }
      }
    
      protected def passThresholdTime(nextRolloverThreshold: Long): Boolean = {
        return currentTime >= nextRolloverThreshold
      }
    
      protected def recomputeRolloverThreshold(ct: Long) {
        var delta: Long = ct % 1000
        nextRolloverThreshold = (ct - delta) + 1000
      }
    
      private[rolling] def addGZIfNotLast(i: Int, suff: String): String = {
        var lastIndex: Int = expectedFilenameList.size - 1
        if (i != lastIndex) suff else ""
      }
    
      private[rolling] def waitForCompression(tbrp: TimeBasedRollingPolicy[AnyRef]): Unit = {
        if (tbrp.future != null && !tbrp.future.isDone) {
          tbrp.future.get(400, TimeUnit.MILLISECONDS)
        }
      }
    
      private[rolling] def testId2FileName(testId: String): String = {
        return randomOutputDir + testId + ".log"
      }
    
      // =========================================================================
      // utility methods
      // =========================================================================
      private[rolling] def massageExpectedFilesToCorresponToCurrentTarget(file: String, fileOptionIsSet: Boolean): Unit = {
        val last: String = expectedFilenameList.last
        expectedFilenameList = expectedFilenameList.dropRight(1)
    
        if (fileOptionIsSet) {
          expectedFilenameList = expectedFilenameList ::: List(file)
        } else if (last.endsWith(".gz")) {
          val stem = last.dropRight(3)
          expectedFilenameList = expectedFilenameList ::: List(stem)
        }
      }
    
      def existenceCheck(filenameList: List[String]): Unit = {
        for (filename <- filenameList) {
          assertTrue("File " + filename + " does not exist", new File(filename).exists)
        }
      }
    
      def getFilesInDirectory(outputDirStr: String): Array[File] = {
        var outputDir: File = new File(outputDirStr)
        return outputDir.listFiles
      }
    
      def sortedContentCheck(outputDirStr: String, runLength: Int, prefix: String) {
        var fileArray: Array[File] = getFilesInDirectory(outputDirStr)
        FileFilterUtil.sortFileArrayByName(fileArray)
        fileContentCheck(fileArray, runLength, prefix)
      }
    
      def reverseSortedContentCheck(outputDirStr: String, runLength: Int, prefix: String) {
        var fileArray: Array[File] = getFilesInDirectory(outputDirStr)
        FileFilterUtil.reverseSortFileArrayByName(fileArray)
        fileContentCheck(fileArray, runLength, prefix)
      }
    
      def fileContentCheck(fileArray: Array[File], runLength: Int, prefix: String): Unit = {
        var stringList: ArrayList[String] = new ArrayList[String]
    
        for (file <- fileArray) {
          FileToBufferUtil.readIntoList(file, stringList)
        }
        var witnessList: List[String] = Nil
        for (i <- 0 until runLength) {
          witnessList = (prefix + i) :: witnessList
        }
        witnessList = witnessList.reverse
        import scala.collection.JavaConversions.asScalaBuffer
        assertEquals(witnessList, asScalaBuffer(stringList))
      }
    
      def zipEntryNameCheck(expectedFilenameList: List[String], pattern: String): Unit = {
        expectedFilenameList.foreach(filepath => checkZipEntryName(filepath, pattern))
      }
    
      def checkZipEntryMatchesZipFilename(expectedFilenameList: List[String], pattern: String): Unit = {
        expectedFilenameList.foreach(filepath => checkZipEntryName(filepath, stripStemFromZipFilename(filepath)))
    
        def stripStemFromZipFilename(filepath: String) = {
          val filepathAsFile = new File(filepath)
          val stem = filepathAsFile.getName
          stem.dropRight(".zip".length)
        }
      }
    
      def checkZipEntryName(filepath: String, pattern: String): Unit = {
        System.out.println("Checking [" + filepath + "]")
        var zf: ZipFile = new ZipFile(filepath)
        var entries: java.util.Enumeration[_ <: ZipEntry] = zf.entries
        assert((entries.hasMoreElements))
        var firstZipEntry: ZipEntry = entries.nextElement
        assert((!entries.hasMoreElements))
        System.out.println("Testing zip entry [" + firstZipEntry.getName + "]")
        assertTrue(firstZipEntry.getName.matches(pattern))
      }
    
    }����������������������������������������logback_1.0.13/logback-core/src/test/scala/ch/qos/logback/core/rolling/TimeBasedRolling_STest.scala�0000644�0001750�0001750�00000016114�12136042147�033047� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2010, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling
    
    import org.junit.Assert.assertTrue
    import org.junit.Before
    import org.junit.Test
    import ch.qos.logback.core.encoder.EchoEncoder
    import java.io.{FileOutputStream, File}
    import ch.qos.logback.core.util.{StatusPrinter, Compare, CoreTestConstants}
    import ch.qos.logback.core.testUtil.EnvUtilForTests
    import java.security.PrivateKey
    
    class TimeBasedRolling_STest extends RollingScaffolding {
    
      private var rfa1: RollingFileAppender[AnyRef] = new RollingFileAppender[AnyRef]
      private var tbrp1: TimeBasedRollingPolicy[AnyRef] = new TimeBasedRollingPolicy[AnyRef]
      private var rfa2: RollingFileAppender[AnyRef] = new RollingFileAppender[AnyRef]
      private var tbrp2: TimeBasedRollingPolicy[AnyRef] = new TimeBasedRollingPolicy[AnyRef]
    
      private var encoder: EchoEncoder[AnyRef] = new EchoEncoder[AnyRef]
    
      @Before
      def setUp: Unit = {
        setUpScaffolding
      }
    
      private def initRFA(rfa: RollingFileAppender[AnyRef], filename: String): Unit = {
        rfa.setContext(context)
        rfa.setEncoder(encoder)
        if (filename != null) {
          rfa.setFile(filename)
        }
      }
    
     private def initTRBP(rfa: RollingFileAppender[AnyRef], tbrp: TimeBasedRollingPolicy[AnyRef],
                          filenamePattern: String, givenTime: Long): Unit = {
        tbrp.setContext(context)
        tbrp.setFileNamePattern(filenamePattern)
        tbrp.setParent(rfa)
        tbrp.timeBasedFileNamingAndTriggeringPolicy = new DefaultTimeBasedFileNamingAndTriggeringPolicy[AnyRef]
        tbrp.timeBasedFileNamingAndTriggeringPolicy.setCurrentTime(givenTime)
        rfa.setRollingPolicy(tbrp)
        tbrp.start
        rfa.start
      }
    
      type CheckFunction = ((String, Boolean, String) => Unit)
      def genericTest(checkFunction: CheckFunction)(testId: String, patternPrefix: String, compressionSuffix: String, fileOptionIsSet: Boolean, waitDuration: Int): Unit = {
        val withCompression = compressionSuffix.length > 0
        val fileName = if (fileOptionIsSet) testId2FileName(testId) else null;
        initRFA(rfa1, fileName);
    
        val fileNamePatternStr = randomOutputDir + patternPrefix + "-%d{"+ DATE_PATTERN_WITH_SECONDS + "}"+compressionSuffix
    
        initTRBP(rfa1, tbrp1, fileNamePatternStr, currentTime);
    
        // compute the current filename
        addExpectedFileName_ByDate(fileNamePatternStr, getMillisOfCurrentPeriodsStart);
    
        incCurrentTime(1100);
        tbrp1.timeBasedFileNamingAndTriggeringPolicy.setCurrentTime(currentTime);
    
        for (i <- 0 until 3) {
          rfa1.doAppend("Hello---" + i);
          addExpectedFileNamedIfItsTime_ByDate(fileNamePatternStr) //, withCompression && (i != 2))
          incCurrentTime(500);
          tbrp1.timeBasedFileNamingAndTriggeringPolicy.setCurrentTime(currentTime)
          if (withCompression)
            waitForCompression(tbrp1)
        }
        rfa1.stop
    
        if (waitDuration != NO_RESTART) {
          doRestart(testId, patternPrefix, fileOptionIsSet, waitDuration);
        }
    
        massageExpectedFilesToCorresponToCurrentTarget(fileName, fileOptionIsSet)
    
        StatusPrinter.print(context)
        checkFunction(testId, withCompression, compressionSuffix)
      }
    
      // defaultTest uses the defaultCheck function
      val defaultTest = genericTest(defaultCheck)_
    
      def defaultCheck(testId: String, withCompression: Boolean, compressionSuffix:String) = {
        var i = 0;
        for (fn <- expectedFilenameList) {
          val suffix: String = if (withCompression) addGZIfNotLast(i, compressionSuffix) else ""
          val witnessFileName: String = CoreTestConstants.TEST_SRC_PREFIX + "witness/rolling/tbr-" + testId + "." + i.toString + suffix
          assertTrue(Compare.compare(fn, witnessFileName));
          i += 1
        }
      }
    
      def zCheck(testId: String, withCompression: Boolean, compressionSuffix:String) = {
        val lastFile = expectedFilenameList.last
        val witnessFileName: String = CoreTestConstants.TEST_SRC_PREFIX + "witness/rolling/tbr-" + testId
        println(lastFile+"  "+witnessFileName)
        assertTrue(Compare.compare(lastFile, witnessFileName));
      }
    
    
    
      def doRestart(testId: String, patternPart: String, fileOptionIsSet: Boolean, waitDuration: Int) {
        // change the timestamp of the currently actively file
        var activeFile: File = new File(rfa1.getFile)
        activeFile.setLastModified(currentTime)
    
        incCurrentTime(waitDuration)
    
        val filePatternStr = randomOutputDir + patternPart + "-%d{" + DATE_PATTERN_WITH_SECONDS + "}"
    
        val fileName = if (fileOptionIsSet) testId2FileName(testId) else null;
        initRFA(rfa2, fileName)
        initTRBP(rfa2, tbrp2, filePatternStr, currentTime)
        for (i <- 0 until 3) {
          rfa2.doAppend("World---" + i)
          addExpectedFileNamedIfItsTime_ByDate(filePatternStr)
          incCurrentTime(100)
          tbrp2.timeBasedFileNamingAndTriggeringPolicy.setCurrentTime(currentTime)
        }
        rfa2.stop();
      }
    
      val NO_RESTART = 0
      val WITH_RESTART = 1
      val WITH_RESTART_AND_LONG_WAIT = 2000
    
      @Test
      def noCompression_FileBlank_NoRestart_1 = {
        defaultTest("test1", "test1", "", FILE_OPTION_BLANK, NO_RESTART)
      }
    
      @Test
      def withCompression_FileBlank_NoRestart_2 = {
        defaultTest("test2", "test2", ".gz", FILE_OPTION_BLANK, NO_RESTART);
      }
    
      @Test
      def noCompression_FileBlank_StopRestart_3 = {
        defaultTest("test3", "test3", "", FILE_OPTION_BLANK, WITH_RESTART);
      }
    
      @Test
      def noCompression_FileSet_StopRestart_4 = {
        defaultTest("test4", "test4", "", FILE_OPTION_SET, WITH_RESTART);
      }
    
      @Test
      def noCompression_FileSet_StopRestart_WithLongWait_4B = {
        defaultTest("test4B", "test4B", "", FILE_OPTION_SET, WITH_RESTART_AND_LONG_WAIT);
      }
    
      @Test
      def noCompression_FileSet_NoRestart_5 = {
        defaultTest("test5", "test6", "", FILE_OPTION_SET, NO_RESTART);
      }
    
      @Test
      def withCompression_FileSet_NoRestart_6 = {
        defaultTest("test6", "test6", ".gz", FILE_OPTION_SET, NO_RESTART);
      }
    
      // LBCORE-169
      @Test
      def withMissingTargetDirWithCompression = {
        defaultTest("test7", "%d{yyyy-MM-dd, aux}/", ".gz", FILE_OPTION_SET, NO_RESTART);
      }
    
      @Test
      def withMissingTargetDirWithZipCompression = {
        defaultTest("test8", "%d{yyyy-MM-dd, aux}/", ".zip", FILE_OPTION_SET, NO_RESTART);
      }
    
      @Test
      def failed_rename: Unit = {
        if(!EnvUtilForTests.isWindows) return
    
        var fos: FileOutputStream = null
        try {
          val fileName = testId2FileName("failed_rename");
          val file= new File(fileName)
          file.getParentFile.mkdirs
    
          fos = new FileOutputStream(fileName)
          genericTest(zCheck)("failed_rename", "failed_rename", "", FILE_OPTION_SET, NO_RESTART)
    
        } finally {
          StatusPrinter.print(context)
          if(fos != null) fos.close;
        }
      }
    
    
    
    }����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000166�00000000000�011570� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/scala/ch/qos/logback/core/rolling/TimeBasedRollingWithArchiveRemoval_STest.scala�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/scala/ch/qos/logback/core/rolling/TimeBasedRollingWithArchiveRe0000644�0001750�0001750�00000034205�12136042147�033271� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������package ch.qos.logback.core.rolling
    
    import ch.qos.logback.core.{Context, ContextBase}
    import ch.qos.logback.core.testUtil.RandomUtil
    import helper.RollingCalendar
    import org.junit.Assert._
    import ch.qos.logback.core.encoder.EchoEncoder
    import java.util.concurrent.TimeUnit
    import java.io.{FileFilter, File}
    import collection.mutable.ListBuffer
    import ch.qos.logback.core.util.{StatusPrinter, CoreTestConstants}
    import ch.qos.logback.core.CoreConstants._
    import java.util.regex.{Matcher, Pattern}
    import scala.collection.mutable.{Set, HashSet}
    import org.junit.{Ignore, Before, Test}
    import java.util.{Date, Calendar}
    
    class TimeBasedRollingWithArchiveRemoval_STest {
      var context: Context = new ContextBase
      var encoder: EchoEncoder[AnyRef] = new EchoEncoder[AnyRef]
    
      val MONTHLY_DATE_PATTERN: String = "yyyy-MM"
    
      val MONTHLY_CRONOLOG_DATE_PATTERN: String = "yyyy/MM"
      final val DAILY_CRONOLOG_DATE_PATTERN: String = "yyyy/MM/dd"
    
      val MILLIS_IN_MINUTE: Long = 60 * 1000
      val MILLIS_IN_HOUR: Long = 60 * MILLIS_IN_MINUTE
      val MILLIS_IN_DAY: Long = 24 * MILLIS_IN_HOUR
      val MILLIS_IN_MONTH: Long = ((365.242199 / 12) * MILLIS_IN_DAY).asInstanceOf[Long]
      val MONTHS_IN_YEAR = 12
    
      var diff: Int = _
      var randomOutputDir: String = _
      var slashCount: Int = 0
    
      // by default tbfnatp is an instance of DefaultTimeBasedFileNamingAndTriggeringPolicy
      var tbfnatp: TimeBasedFileNamingAndTriggeringPolicy[AnyRef] = new DefaultTimeBasedFileNamingAndTriggeringPolicy[AnyRef]
    
      val now = System.currentTimeMillis
    
    
      @Before def setUp {
        context.setName("test")
        diff = RandomUtil.getPositiveInt
        randomOutputDir = CoreTestConstants.OUTPUT_DIR_PREFIX + diff + "/"
      }
    
      def computeSlashCount(datePattern: String): Int = {
        if (datePattern == null) 0
        else datePattern.foldLeft(0)((count, c) => if (c == '/') count + 1 else count)
      }
    
    
      // test that the number of files at the end of the test is same as the expected number taking into account end dates
      // near the beginning of a new year. This test has been run in a loop with start date varying over a two years
      // with success.
      @Test def monthlyRolloverOverManyPeriods() {
    
        slashCount = computeSlashCount(MONTHLY_CRONOLOG_DATE_PATTERN)
        val numPeriods: Int = 40
        val maxHistory: Int = 2
        val fileNamePattern = randomOutputDir + "/%d{" + MONTHLY_CRONOLOG_DATE_PATTERN + "}/clean.txt.zip"
        val (startTime, endTime) = logOverMultiplePeriods(now, fileNamePattern, MILLIS_IN_MONTH, maxHistory, numPeriods)
        val differenceInMonths = RollingCalendar.diffInMonths(startTime, endTime)
        val startTimeAsCalendar = Calendar.getInstance()
        startTimeAsCalendar.setTimeInMillis(startTime)
        val indexOfStartPeriod: Int = startTimeAsCalendar.get(Calendar.MONTH)
        val withExtraFolder = extraFolder(differenceInMonths, MONTHS_IN_YEAR, indexOfStartPeriod, maxHistory)
    
        def expectedCountWithFolders(): Int = {
          val numLogFiles = (maxHistory + 1)
          val numLogFilesAndFolders = numLogFiles * 2
          var result: Int = numLogFilesAndFolders + slashCount
          if (withExtraFolder) result += 1
          result
        }
        //StatusPrinter.print(context)
        check(expectedCountWithFolders())
      }
    
      def generateDailyRollover(now: Long, maxHistory: Int, simulatedNumberOfPeriods: Int, startInactivity: Int, numInactivityPeriods: Int) {
        slashCount = computeSlashCount(DAILY_DATE_PATTERN)
        logOverMultiplePeriods(now, randomOutputDir + "clean-%d{" + DAILY_DATE_PATTERN + "}.txt", MILLIS_IN_DAY, maxHistory, simulatedNumberOfPeriods, startInactivity, numInactivityPeriods)
        //StatusPrinter.print(context)
        check(expectedCountWithoutFoldersWithInactivity(maxHistory, simulatedNumberOfPeriods, startInactivity + numInactivityPeriods))
      }
    
      @Test
      def basicDailyRollover {
        generateDailyRollover(now, maxHistory = 20, simulatedNumberOfPeriods = 20 * 3, startInactivity = 0, numInactivityPeriods = 0)
      }
    
      // Since the duration of a month (in seconds) varies from month to month, tests with inactivity period must
      // be conducted with daily rollover  not monthly
      @Test def dailyRollover15 {
        generateDailyRollover(now, maxHistory = 5, simulatedNumberOfPeriods = 15, startInactivity = 6, numInactivityPeriods = 3)
      }
    
      @Test def dailyRolloverWithInactivity70 {
        generateDailyRollover(now, maxHistory = 6, simulatedNumberOfPeriods = 70, startInactivity = 30, numInactivityPeriods = 1)
      }
    
      @Test def dailyRolloverWithInactivity10 {
        generateDailyRollover(now, maxHistory = 6, simulatedNumberOfPeriods = 10, startInactivity = 3, numInactivityPeriods = 4)
      }
    
    
      @Test def dailyRolloverWithSecondPhase {
        slashCount = computeSlashCount(DAILY_DATE_PATTERN)
        val maxHistory = 5
        val simulatedNumberOfPeriods = maxHistory * 2
        val (startTime, endTime) = logOverMultiplePeriods(now, randomOutputDir + "clean-%d{" + DAILY_DATE_PATTERN + "}.txt", MILLIS_IN_DAY, maxHistory, maxHistory * 2)
        logOverMultiplePeriods(endTime + MILLIS_IN_DAY * 10, randomOutputDir + "clean-%d{" + DAILY_DATE_PATTERN + "}.txt", MILLIS_IN_DAY, maxHistory, maxHistory)
        check(expectedCountWithoutFolders(maxHistory))
      }
    
    
      @Test def dailyCronologRollover {
        slashCount = computeSlashCount(DAILY_CRONOLOG_DATE_PATTERN)
        logOverMultiplePeriods(now, randomOutputDir + "/%d{" + DAILY_CRONOLOG_DATE_PATTERN + "}/clean.txt.zip", MILLIS_IN_DAY, 8, 8 * 3)
        var expectedDirMin: Int = 9 + slashCount
        var expectDirMax: Int = expectedDirMin + 1 + 1
        expectedFileAndDirCount(9, expectedDirMin, expectDirMax)
      }
    
      @Test def dailySizeBasedRollover {
        var sizeAndTimeBasedFNATP: SizeAndTimeBasedFNATP[AnyRef] = new SizeAndTimeBasedFNATP[AnyRef]
        sizeAndTimeBasedFNATP.setMaxFileSize("10000")
        tbfnatp = sizeAndTimeBasedFNATP
        slashCount = computeSlashCount(DAILY_DATE_PATTERN)
        logOverMultiplePeriods(now, randomOutputDir + "/%d{" + DAILY_DATE_PATTERN + "}-clean.%i.zip", MILLIS_IN_DAY, 5, 5 * 4)
        checkPatternCompliance(5 + 1 + slashCount, "\\d{4}-\\d{2}-\\d{2}-clean(\\.\\d)(.zip)?")
      }
    
      @Test def dailyChronologSizeBasedRollover {
        var sizeAndTimeBasedFNATP: SizeAndTimeBasedFNATP[AnyRef] = new SizeAndTimeBasedFNATP[AnyRef]
        sizeAndTimeBasedFNATP.setMaxFileSize("10000")
        tbfnatp = sizeAndTimeBasedFNATP
        slashCount = 1
        logOverMultiplePeriods(now, randomOutputDir + "/%d{" + DAILY_DATE_PATTERN + "}/clean.%i.zip", MILLIS_IN_DAY, 5, 5 * 4)
        checkDirPatternCompliance(6)
      }
    
      @Test def dailyChronologSizeBasedRolloverWithSecondPhase {
        var sizeAndTimeBasedFNATP: SizeAndTimeBasedFNATP[AnyRef] = new SizeAndTimeBasedFNATP[AnyRef]
        sizeAndTimeBasedFNATP.setMaxFileSize("10000")
        tbfnatp = sizeAndTimeBasedFNATP
        slashCount = 1
        val maxHistory = 5
        val simulatedNumberOfPeriods = maxHistory * 4
        val (startTime, endTime) = logOverMultiplePeriods(now, randomOutputDir + "/%d{" + DAILY_DATE_PATTERN + "}/clean.%i", MILLIS_IN_DAY, maxHistory, 3)
        logOverMultiplePeriods(endTime + MILLIS_IN_DAY * 7, randomOutputDir + "/%d{" + DAILY_DATE_PATTERN + "}/clean.%i", MILLIS_IN_DAY, maxHistory, simulatedNumberOfPeriods)
        checkDirPatternCompliance(maxHistory + 1)
      }
    
    
      def logOncePeriod(currentTime: Long, fileNamePattern: String, maxHistory: Int) = {
        val (rfa, tbrp) = buildRollingFileAppender(currentTime, fileNamePattern, maxHistory, true)
        rfa.doAppend("Hello ----------------------------------------------------------" + new Date(currentTime))
        rfa.stop()
      }
    
      @Test def cleanHistoryOnStart {
        var now = this.now
        val fileNamePattern = randomOutputDir + "clean-%d{" + DAILY_DATE_PATTERN + "}.txt"
        val maxHistory = 3
        for (i <- 0 to 5) {
          logOncePeriod(now, fileNamePattern, maxHistory)
          now = now + MILLIS_IN_DAY
        }
        StatusPrinter.print(context)
        check(expectedCountWithoutFolders(maxHistory))
      }
    
      def extraFolder(numPeriods: Int, periodsPerEra: Int, beginPeriod: Int, maxHistory: Int): Boolean = {
        println("numPeriods=" + numPeriods + ", beginPeriod=" + beginPeriod + ", maxHistory=" + maxHistory)
        var valueOfLastMonth: Int = ((beginPeriod) + numPeriods) % periodsPerEra
        return (valueOfLastMonth < maxHistory)
      }
    
    
      def addTime(currentTime: Long, timeToWait: Long): Long = {
        return currentTime + timeToWait
      }
    
      def waitForCompression(tbrp: TimeBasedRollingPolicy[AnyRef]): Unit = {
        if (tbrp.future != null && !tbrp.future.isDone) {
          tbrp.future.get(1000, TimeUnit.MILLISECONDS)
        }
      }
    
      def buildRollingFileAppender(currentTime: Long, fileNamePattern: String, maxHistory: Int,
                                   cleanHistoryOnStart: Boolean = false): (RollingFileAppender[AnyRef], TimeBasedRollingPolicy[AnyRef]) = {
        val rfa: RollingFileAppender[AnyRef] = new RollingFileAppender[AnyRef]
        rfa.setContext(context)
        rfa.setEncoder(encoder)
        val tbrp: TimeBasedRollingPolicy[AnyRef] = new TimeBasedRollingPolicy[AnyRef]
        tbrp.setContext(context)
        tbrp.setFileNamePattern(fileNamePattern)
        tbrp.setMaxHistory(maxHistory)
        tbrp.setParent(rfa)
        tbrp.setCleanHistoryOnStart(cleanHistoryOnStart)
        tbrp.timeBasedFileNamingAndTriggeringPolicy = tbfnatp
        tbrp.timeBasedFileNamingAndTriggeringPolicy.setCurrentTime(currentTime)
        tbrp.start
        rfa.setRollingPolicy(tbrp)
        rfa.start
        (rfa, tbrp)
      }
    
      def logOverMultiplePeriods(currentTime: Long, fileNamePattern: String, periodDurationInMillis: Long, maxHistory: Int,
                     simulatedNumberOfPeriods: Int, startInactivity: Int = 0,
                     numInactivityPeriods: Int = 0): (Long, Long) = {
        val startTime = currentTime
        val (rfa, tbrp) = buildRollingFileAppender(currentTime, fileNamePattern, maxHistory)
        val ticksPerPeriod: Int = 512
        val runLength = simulatedNumberOfPeriods * ticksPerPeriod
        val startInactivityIndex: Int = 1 + startInactivity * ticksPerPeriod
        val endInactivityIndex = startInactivityIndex + numInactivityPeriods * ticksPerPeriod
        val tickDuration = periodDurationInMillis / ticksPerPeriod
    
        for (i <- 0 to runLength) {
          if (i < startInactivityIndex || i > endInactivityIndex) {
            rfa.doAppend("Hello ----------------------------------------------------------" + i)
          }
          tbrp.timeBasedFileNamingAndTriggeringPolicy.setCurrentTime(addTime(tbrp.timeBasedFileNamingAndTriggeringPolicy.getCurrentTime, tickDuration))
          if (i % (ticksPerPeriod / 2) == 0) {
            waitForCompression(tbrp)
          }
        }
    
        println("Last date" + new Date(tbrp.timeBasedFileNamingAndTriggeringPolicy.getCurrentTime()));
        waitForCompression(tbrp)
        rfa.stop
        (startTime, tbrp.timeBasedFileNamingAndTriggeringPolicy.getCurrentTime)
      }
    
      def expectedCountWithoutFolders(maxHistory: Int): Int = {
        return maxHistory + 1
      }
    
      def expectedCountWithoutFoldersWithInactivity(maxHistory: Int, totalPeriods: Int, endOfInactivity: Int): Int = {
        val availableHistory = (totalPeriods + 1) - endOfInactivity;
        val actualHistory = scala.math.min(availableHistory, maxHistory + 1)
        return actualHistory
      }
    
    
      def genericFindMatching(matchFunc: (File, String) => Boolean, dir: File, fileList: ListBuffer[File], pattern: String = null, includeDirs: Boolean = false) {
        if (dir.isDirectory) {
          val `match` : Array[File] = dir.listFiles(new FileFilter {
            def accept(f: File): Boolean = {
              return f.isDirectory() || matchFunc(f, pattern)
            }
          })
          for (f <- `match`) {
            if (f.isDirectory) {
              if (includeDirs) fileList += f
              genericFindMatching(matchFunc, f, fileList, pattern, includeDirs)
            } else
              fileList += f
          }
        }
      }
    
      def findAllFoldersInFolderRecursively(dir: File, fileList: ListBuffer[File]) {
        genericFindMatching((f, p) => false, dir, fileList, null, true);
      }
    
      def findAllDirsOrStringContainsFilesRecursively(dir: File, fileList: ListBuffer[File], pattern: String): Unit = {
        genericFindMatching((f, pattern) => (f.getName.contains(pattern)), dir, fileList, pattern, true)
      }
    
      def findFilesInFolderRecursivelyByPatterMatch(dir: File, fileList: ListBuffer[File], pattern: String): Unit = {
        genericFindMatching((f, p) => f.getName.matches(pattern), dir, fileList, pattern);
      }
    
    
      def expectedFileAndDirCount(expectedFileAndDirCount: Int, expectedDirCountMin: Int, expectedDirCountMax: Int): Unit = {
        val dir: File = new File(randomOutputDir)
        val fileList = new ListBuffer[File]
        findFilesInFolderRecursivelyByPatterMatch(dir, fileList, "clean")
        val dirList = new ListBuffer[File]
        findAllFoldersInFolderRecursively(dir, dirList)
        val msg = "expectedDirCountMin=" + expectedDirCountMin + ", expectedDirCountMax=" + expectedDirCountMax + " actual value=" + dirList.size
        assertTrue(msg, expectedDirCountMin <= dirList.size && dirList.size <= expectedDirCountMax)
      }
    
      def check(expectedCount: Int): Unit = {
        val dir: File = new File(randomOutputDir)
        val fileList = new ListBuffer[File]
        findAllDirsOrStringContainsFilesRecursively(dir, fileList, "clean")
        assertEquals(expectedCount, fileList.size)
      }
    
      def groupByClass(fileList: ListBuffer[File], regex: String): Set[String] = {
        val p: Pattern = Pattern.compile(regex)
        val set = new HashSet[String]
        for (f <- fileList) {
          val n: String = f.getName
          val m: Matcher = p.matcher(n)
          m.matches
          val begin: Int = m.start(1)
          val reduced: String = n.substring(0, begin)
          set.add(reduced)
        }
        return set
      }
    
      def checkPatternCompliance(expectedClassCount: Int, regex: String) {
        val dir: File = new File(randomOutputDir)
        val fileList = new ListBuffer[File]
        findFilesInFolderRecursivelyByPatterMatch(dir, fileList, regex)
        val set: Set[String] = groupByClass(fileList, regex)
        assertEquals(expectedClassCount, set.size)
      }
    
      def checkDirPatternCompliance(expectedClassCount: Int): Unit = {
        val dir: File = new File(randomOutputDir)
        val fileList = new ListBuffer[File]
        findAllFoldersInFolderRecursively(dir, fileList)
        for (f <- fileList) {
          assertTrue(f.list.length >= 1)
        }
        assertEquals(expectedClassCount, fileList.size)
      }
    }�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/loopfs.sh������������������������������������������������������0000644�0001750�0001750�00000002144�11377016712�021116� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/bash
    
    IMG=/tmp/toto.img
    MNT_POINT=/mnt/loop
    LOOP_DEV=/dev/loop0
    BIG_FILE=$MNT_POINT/big
    
    SETUP_LOG=/tmp/loopfs.log
    LOG=/tmp/loopfs.log
    
    CMD=$1
    
    # ===================================
    setup()  {
      echo setup
      if [ -e $IMG ]; then
        rm $IMG
      fi 
      if [ -e $LOG ]; then rm $LOG; fi
      if [ -e $SETUP_LOG ]; then rm $SETUP_LOG; fi
    
      dd if=/dev/zero of=$IMG count=1000 >> $SETUP_LOG 2>&1
      losetup $LOOP_DEV $IMG >> $SETUP_LOG 2>&1
      mkfs.ext2 $LOOP_DEV >> $SETUP_LOG 2>&1
      mount $LOOP_DEV $MNT_POINT  >> $SETUP_LOG 2>&1
      chown -R ceki:ceki $MNT_POINT
    }
    
    shake() { 
      echo "shake"
      declare -i i=0
      while [ $i -lt 5 ]
      do 
        i+=1;  
        sleep 0.5
        dd if=/dev/zero of=$BIG_FILE count=1000 >> $LOG 2>&1
        echo "dd `date`" >> $LOG
        sleep 0.5;
        rm $BIG_FILE >> $LOG 2>&1
        echo "rm $BIG_FILE" >> $LOG
      done
    }
    
    teardown()  {
      echo teardown    
      umount $MNT_POINT
      losetup -d $LOOP_DEV
    }
    
    # ===========================================
    
    case $CMD in 
      setup)
        setup
        ;;
      shake)
        shake
        ;;
       teardown)
        teardown
        ;;
    esac
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/���������������������������������������������������������0000755�0001750�0001750�00000000000�12203357067�020416� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/compress2.copy�������������������������������������������0000644�0001750�0001750�00000001731�11377016712�023231� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0"?>
    <document>
    
      <properties>
        <title>LOGBack Home</title>
      </properties>
    
    
    <body>
    
      <h1>LOGBack project</h1>
    
      <p>LOGBack is intended as a successor to the popular log4j
      project. It was also designed by Ceki G&#252;lc&#252;, the founder
      of the log4j project. It builds upon exerience gained in building
      industrial-strength logging systems going back as far as 1999.
      </p>
    
      <p>LOGBack's basic architecture is sufficiently generic so as to
      apply under different circumstances. At present time, LOGBack is
      divided into three modules, Core, Classic and Access.
      </p>
    
      <p>The Core module lays the groundwork for the other two
      modules. The Classic module can be assimilated to an improved
      version of log4j. The Access module integrates with Servlet
      containers to provide HTPP-access log functionality. Note that you
      can easily build your own modules on top of the Core module.
      </p>
    
    
    </body>
    </document>
    
    ���������������������������������������logback_1.0.13/logback-core/src/test/input/compress1.txt��������������������������������������������0000644�0001750�0001750�00000000455�12143164171�023072� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
      LOGBack: the generic, reliable, fast and flexible logging framework.
      
      Copyright (C) 1999-2006, QOS.ch
      
      This library is free software, you can redistribute it and/or modify it under
      the terms of the GNU Lesser General Public License as published by the Free
      Software Foundation.
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/compress2.txt��������������������������������������������0000644�0001750�0001750�00000001731�12143164171�023071� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0"?>
    <document>
    
      <properties>
        <title>LOGBack Home</title>
      </properties>
    
    
    <body>
    
      <h1>LOGBack project</h1>
    
      <p>LOGBack is intended as a successor to the popular log4j
      project. It was also designed by Ceki G&#252;lc&#252;, the founder
      of the log4j project. It builds upon exerience gained in building
      industrial-strength logging systems going back as far as 1999.
      </p>
    
      <p>LOGBack's basic architecture is sufficiently generic so as to
      apply under different circumstances. At present time, LOGBack is
      divided into three modules, Core, Classic and Access.
      </p>
    
      <p>The Core module lays the groundwork for the other two
      modules. The Classic module can be assimilated to an improved
      version of log4j. The Access module integrates with Servlet
      containers to provide HTPP-access log functionality. Note that you
      can easily build your own modules on top of the Core module.
      </p>
    
    
    </body>
    </document>
    
    ���������������������������������������logback_1.0.13/logback-core/src/test/input/joran/���������������������������������������������������0000755�0001750�0001750�00000000000�12203357067�021527� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/joran/fire1.xml������������������������������������������0000644�0001750�0001750�00000000112�11377016712�023251� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <fire>
      <x>abc</x>
    </fire>
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/joran/event1.xml�����������������������������������������0000644�0001750�0001750�00000000400�11377016712�023445� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE test>
    
    <test>
    
      <!-- this action throws an exception in the Action.begin method -->
      <badBegin>
        <touch/>
        <touch/>
      </badBegin>  
    
      <hello name="John Doe">XXX&amp;</hello>
      
    </test>����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/joran/inc.xml��������������������������������������������0000644�0001750�0001750�00000000116�11377016712�023020� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <x>
      <inc increment="1"/>
    </x>
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/joran/inclusion/�����������������������������������������0000755�0001750�0001750�00000000000�12203357067�023532� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/joran/inclusion/subByFile.xml����������������������������0000644�0001750�0001750�00000000056�11377016712�026141� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<included>
      <stack name="b"/>
    </included>
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/joran/inclusion/included.xml�����������������������������0000644�0001750�0001750�00000000211�11377016712�026035� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE included>
    
    <included>
    
      <stack name="IA"/>
      <stack name="IB"/>
      
    </included>���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/joran/inclusion/intermediaryByFile.xml�������������������0000644�0001750�0001750�00000000240�11377016712�030037� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE x>
    
    <included>
      <stack name="a"/>
      <include file="${subFileKey}" />
      <stack name="c"/>
    </included>
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/joran/inclusion/topByUrl.xml�����������������������������0000644�0001750�0001750�00000000147�11377016712�026036� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE x>
    
    <x>
      <include url="${includeKey}" />
    </x>
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/joran/inclusion/topByFile.xml����������������������������0000644�0001750�0001750�00000000150�11377016712�026145� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE x>
    
    <x>
      <include file="${includeKey}" />
    </x>
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/joran/inclusion/second.xml�������������������������������0000644�0001750�0001750�00000000167�11377016712�025533� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE included>
    
    <included>
    
      <stack name="SECOND"/>
      
    </included>���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/joran/inclusion/topOptional.xml��������������������������0000644�0001750�0001750�00000000254�12136520102�026550� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE x>
    
    <x>
      <include optional="true" file="nonExistentFile.xml" />
    
      <stack name="IA"/>
      <stack name="IB"/>
    </x>
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/joran/inclusion/topByResource.xml������������������������0000644�0001750�0001750�00000000160�11377016712�027056� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE x>
    
    <x>
    
      <include resource="${includeKey}" />
    
    </x>
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/joran/inclusion/multiIncludeByFile.xml�������������������0000644�0001750�0001750�00000000217�11377016712�030005� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE x>
    
    <x>
      <include file="${includeKey}" />
      <include file="${secondFileKey}" />
    </x>
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/joran/inclusion/invalid.xml������������������������������0000644�0001750�0001750�00000000001�11377016712�025671� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/joran/conditional/���������������������������������������0000755�0001750�0001750�00000000000�12203357067�024032� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/joran/conditional/if0.xml��������������������������������0000644�0001750�0001750�00000000377�11652525101�025232� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <x>
      <stack name="BEGIN"/>
      <if condition='p("ki1").equals("val1")'>
        <then>
          <stack name="a"/>
        </then>
        <else>
          <stack name="b"/>
        </else>
      </if>
      <stack name="END"/>
    </x>
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/joran/conditional/includedA.xml��������������������������0000644�0001750�0001750�00000000223�11377016712�026441� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE included>
    
    <included>
      <stack name="IncludedA0"/>
      <stack name="IncludedA1"/>
    </included>�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/joran/conditional/if_localProperty.xml�������������������0000644�0001750�0001750�00000000446�11652525101�030066� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <x>
      <stack name="BEGIN"/>
      <property name="Ki1" value="Val1"/>
      <if condition='p("Ki1").equals("Val1")'>
        <then>
          <stack name="a"/>
        </then>
        <else>
          <stack name="b"/>
        </else>
      </if>
      <stack name="END"/>
    </x>
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/joran/conditional/ifWithoutElse.xml����������������������0000644�0001750�0001750�00000000320�11652525101�027333� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <x>
      <stack name="BEGIN"/>
      <if condition='p("ki1").equals("val1")'>
        <then>
          <stack name="a"/>
        </then>   
      </if>
      <stack name="END"/>
    </x>
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/joran/conditional/ifSystem.xml���������������������������0000644�0001750�0001750�00000000364�11652525101�026353� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <x>
      <stack name="BEGIN"/>
    
      <if condition='isNull("sysKey")'>
        <then>
          <property scope="context" name="dynaKey" value="dynaVal"/>
        </then>   
      </if>
      <stack name="END"/>
    </x>
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/joran/conditional/nestedIf.xml���������������������������0000644�0001750�0001750�00000000636�11377016712�026322� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    
    <x>
      <stack name="BEGIN"/>
    
      <if condition='1 == 1'>
        <then>
          <stack name="a"/>
          <if condition='1 != 1'>
            <then>
              <stack name="b"/>
            </then>
            <else>
              <stack name="c"/>
            </else>
          </if>
        </then>
        <else>
          <stack name="d"/>
        </else>
      </if>
      <stack name="END"/>
    
    </x>
    
    ��������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/joran/conditional/nestedInclude.xml����������������������0000644�0001750�0001750�00000000610�11377016712�027337� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    
    <x>
      <stack name="BEGIN"/>
    
      <if condition='1 != 1'>
        <then>
          <stack name="t0"/>
          <include file="${thenFileToInclude}"/>
          <stack name="t1"/>
        </then>
        <else>
          <stack name="e0"/>
          <include file="${elseFileToInclude}"/>
          <stack name="e1"/>
        </else>
      </if>
      <stack name="END"/>
    
    </x>
    
    ������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/joran/conditional/includedB.xml��������������������������0000644�0001750�0001750�00000000167�11377016712�026451� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE included>
    
    <included>
      <stack name="IncludedB0"/>  
    </included>���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/joran/attributesEvent.xml��������������������������������0000644�0001750�0001750�00000000101�11377016712�025431� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <inc increment="1"/>
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/joran/spacesAndQuotes.xml��������������������������������0000644�0001750�0001750�00000000334�11377016712�025353� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <!-- the following text should not be modidied in any way.
         it summarizes the issue outlined in http://jira.qos.ch/browse/LBCORE-134
    -->
    <x>[x][x] &quot;xyz&quot;%n</x>
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/joran/replay/��������������������������������������������0000755�0001750�0001750�00000000000�12203357067�023023� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/joran/replay/fruitWithSubst.xml��������������������������0000644�0001750�0001750�00000000367�11377016712�026561� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <group>
      <fruitShell name="fs0">
        <fruit class="ch.qos.logback.core.joran.replay.WeightytFruit">
          <name>${fruitKey}</name>
          <weight>1.2</weight>
        </fruit> 
      </fruitShell>
    </group>�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/joran/replay/fruit2.xml����������������������������������0000644�0001750�0001750�00000000605�11377016712�024761� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <group>
      <fruitShell name="fs0">
        <fruit class="ch.qos.logback.core.joran.replay.Fruit">
           <name>blue</name>
        </fruit> 
      </fruitShell>
    
      <fruitShell name="fs1">
        <fruit class="ch.qos.logback.core.joran.replay.WeightytFruit">
          <name>orange</name>
          <weight>1.2</weight>
        </fruit> 
      </fruitShell>
    </group>���������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/joran/replay/fruit1.xml����������������������������������0000644�0001750�0001750�00000000314�11377016712�024755� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <group>
      <fruitShell name="fs0">
        <fruit class="ch.qos.logback.core.joran.replay.Fruit">
          <name>blue</name>
        </fruit> 
      </fruitShell>
    </group>��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/joran/implicitAction/������������������������������������0000755�0001750�0001750�00000000000�12203357067�024477� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/joran/implicitAction/nestedComplexCollection.xml���������0000644�0001750�0001750�00000000744�11377016712�032054� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <context>
        <fruit class="ch.qos.logback.core.joran.implicitAction.Fruit">
          <name>blue</name>
          <text>hello</text>
          <text>world</text>
          <cake class="ch.qos.logback.core.joran.implicitAction.Cake">
          	<type>A</type>
          	<code>1</code>
          </cake>
          <cake class="ch.qos.logback.core.joran.implicitAction.Cake">
          	<type>B</type>
          	<code>2</code>
          </cake>		
        </fruit> 
    </context>����������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000161�00000000000�011563� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/joran/implicitAction/nestedComplexCollectionWithoutClassAtrribute.xml����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/joran/implicitAction/nestedComplexCollectionWithoutClassA0000644�0001750�0001750�00000000501�11377016712�033717� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <context>
        <fruit>
          <name>blue</name>
          <text>hello</text>
          <text>world</text>
          <cake>
          	<type>A</type>
          	<code>1</code>
          </cake>
          <cake>
          	<type>B</type>
          	<code>2</code>
          </cake>		
        </fruit> 
    </context>�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/joran/implicitAction/nestedComplex.xml�������������������0000644�0001750�0001750�00000000340�11377016712�030030� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <context>
        <fruit class="ch.qos.logback.core.joran.implicitAction.Fruit">
          <name>blue</name>
          <text>hello</text>
          <text>world</text>
        </fruit> 
    </context>������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000147�00000000000�011567� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/joran/implicitAction/nestedComplexWithoutClassAtrribute.xml��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/joran/implicitAction/nestedComplexWithoutClassAtrribute.x0000644�0001750�0001750�00000000251�11377016712�033734� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <context>
        <fruit>
          <name>blue</name>
          <text>hello</text>
          <text>world</text>
        </fruit> 
    </context>�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/joran/ampEvent.xml���������������������������������������0000644�0001750�0001750�00000000107�11377016712�024026� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <test>xxx &amp; yyy</test>
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/joran/illformed.xml��������������������������������������0000644�0001750�0001750�00000000115�11377016712�024223� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    
    <x>
      <inc increment="1">
    </x>
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/joran/define/��������������������������������������������0000755�0001750�0001750�00000000000�12203357067�022761� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/joran/define/noclass.xml���������������������������������0000644�0001750�0001750�00000000074�11377016712�025146� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<define name="foo">
      <fooName>Monster</fooName>
    </define>
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/joran/define/badclass.xml��������������������������������0000644�0001750�0001750�00000000050�11377016712�025252� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<define name="foo" class="a.b.c.Foo"/>
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/joran/define/noname.xml����������������������������������0000644�0001750�0001750�00000000163�11377016712�024760� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<define class="ch.qos.logback.core.joran.action.AsLowerCasePropertyDefiner">
        <value>Monster</value>
    </define>�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/joran/define/good.xml������������������������������������0000644�0001750�0001750�00000000174�11377016712�024435� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<define name="foo" class="ch.qos.logback.core.joran.action.AsLowerCasePropertyDefiner">
      <value>MONSTER</value>
    </define>����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/joran/skip/����������������������������������������������0000755�0001750�0001750�00000000000�12203357067�022475� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/joran/skip/badEnd2.xml�����������������������������������0000644�0001750�0001750�00000000513�11377016712�024455� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE test>
    
    <test>
    
      <isolate>
        <!-- badEnd throws an exception in the Action.end method -->
        <badEnd type="ActionException">
          <touch/>
        </badEnd> 
        <!-- should not be skipped -->
        <touch/> 
      </isolate>
    
      <hello name="John Doe"></hello>
      
    </test>�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/joran/skip/badBegin1.xml���������������������������������0000644�0001750�0001750�00000000370�11377016712�024773� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE test>
    
    <test>
    
      <!-- this action throws an exception in the Action.begin method -->
      <badBegin>
        <touch/>
        <touch/>
      </badBegin>  
    
      <hello name="John Doe"></hello>
      
    </test>������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/joran/skip/badBegin2.xml���������������������������������0000644�0001750�0001750�00000000425�11377016712�024775� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE test>
    
    <test>
    
      <!-- this action throws an ActionException in the Action.begin method -->
      <badBegin type="ActionException">
        <touch/>
        <touch/>
      </badBegin>  
    
      <hello name="John Doe"></hello>
      
    </test>�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/joran/skip/badEnd1.xml�����������������������������������0000644�0001750�0001750�00000000366�11377016712�024462� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE test>
    
    <test>
    
      <!-- this action throws an exception in the Action.end method -->
      <badEnd>
        <touch/>
        <touch/>
      </badEnd>  
      
    
      <hello name="John Doe"></hello>
      
    </test>��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/joran/propertyActionTest.properties����������������������0000644�0001750�0001750�00000000020�11377016712�027517� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������v1=tata
    v2=toto����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/.gitignore�����������������������������������������������0000644�0001750�0001750�00000000017�11377016712�022404� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������compress?.txt
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/compress3.copy�������������������������������������������0000644�0001750�0001750�00000002406�11377016712�023232� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
      LOGBack: the generic, reliable, fast and flexible logging framework.
      
      Copyright (C) 1999-2006, QOS.ch
      
      This library is free software, you can redistribute it and/or modify it under
      the terms of the GNU Lesser General Public License as published by the Free
      Software Foundation.
    <?xml version="1.0"?>
    <document>
    
      <properties>
        <title>LOGBack Home</title>
      </properties>
    
    
    <body>
    
      <h1>LOGBack project</h1>
    
      <p>LOGBack is intended as a successor to the popular log4j
      project. It was also designed by Ceki G&#252;lc&#252;, the founder
      of the log4j project. It builds upon exerience gained in building
      industrial-strength logging systems going back as far as 1999.
      </p>
    
      <p>LOGBack's basic architecture is sufficiently generic so as to
      apply under different circumstances. At present time, LOGBack is
      divided into three modules, Core, Classic and Access.
      </p>
    
      <p>The Core module lays the groundwork for the other two
      modules. The Classic module can be assimilated to an improved
      version of log4j. The Access module integrates with Servlet
      containers to provide HTPP-access log functionality. Note that you
      can easily build your own modules on top of the Core module.
      </p>
    
    
    </body>
    </document>
    
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/input/compress1.copy�������������������������������������������0000644�0001750�0001750�00000000455�11377016712�023232� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
      LOGBack: the generic, reliable, fast and flexible logging framework.
      
      Copyright (C) 1999-2006, QOS.ch
      
      This library is free software, you can redistribute it and/or modify it under
      the terms of the GNU Lesser General Public License as published by the Free
      Software Foundation.
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/����������������������������������������������������������0000755�0001750�0001750�00000000000�11777365215�020211� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/�������������������������������������������������������0000755�0001750�0001750�00000000000�11506604166�020572� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/���������������������������������������������������0000755�0001750�0001750�00000000000�11506604166�021374� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/�������������������������������������������0000755�0001750�0001750�00000000000�11506604166�022776� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/��������������������������������������0000755�0001750�0001750�00000000000�12203357067�023726� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/testUtil/�����������������������������0000755�0001750�0001750�00000000000�12203357067�025543� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/testUtil/RandomUtil.java��������������0000644�0001750�0001750�00000001653�12136042273�030464� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.testUtil;
    
    import java.util.Random;
    
    public class RandomUtil {
    
      private static Random random = new Random();
    
      public static int getRandomServerPort() {
        int r = random.nextInt(20000);
        // the first 1024 ports are usually reserved for the OS
        return r + 1024;
      }
    
      public static int getPositiveInt() {
        int r = random.nextInt();
        if (r < 0) {
          r = -r;
        }
        return r;
      }
    }
    �������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/testUtil/FileToBufferUtil.java��������0000644�0001750�0001750�00000004741�12136042273�031561� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.testUtil;
    
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.util.Enumeration;
    import java.util.List;
    import java.util.zip.GZIPInputStream;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipFile;
    
    public class FileToBufferUtil {
    
      static public void readIntoList(File file, List<String> stringList)
              throws IOException {
    
        if (file.getName().endsWith(".gz")) {
          gzFileReadIntoList(file, stringList);
        } else if (file.getName().endsWith(".zip")) {
          zipFileReadIntoList(file, stringList);
        } else {
          regularReadIntoList(file, stringList);
        }
      }
    
      private static void zipFileReadIntoList(File file, List<String> stringList) throws IOException {
    	System.out.println("Reading zip file ["+file+"]");
        ZipFile zipFile = new ZipFile(file);
        Enumeration entries = zipFile.entries();
        ZipEntry entry = (ZipEntry) entries.nextElement();
        readInputStream(zipFile.getInputStream(entry), stringList);
      }
    
      static void readInputStream(InputStream is, List<String> stringList) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(is));
        String line;
        while ((line = in.readLine()) != null) {
          stringList.add(line);
        }
        in.close();
      }
    
      static public void regularReadIntoList(File file, List<String> stringList) throws IOException {
        FileInputStream fis = new FileInputStream(file);
        BufferedReader in = new BufferedReader(new InputStreamReader(fis));
        String line;
        while ((line = in.readLine()) != null) {
          stringList.add(line);
        }
        in.close();
      }
    
      static public void gzFileReadIntoList(File file, List<String> stringList) throws IOException {
        FileInputStream fis = new FileInputStream(file);
        GZIPInputStream gzis = new GZIPInputStream(fis);
        readInputStream(gzis, stringList);
      }
    
    }
    �������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/testUtil/StringListAppender.java������0000644�0001750�0001750�00000002377�12136042273�032173� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.testUtil;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import ch.qos.logback.core.AppenderBase;
    import ch.qos.logback.core.Layout;
    
    public class StringListAppender<E> extends AppenderBase<E> {
    
      Layout<E> layout;
      public List<String> strList = new ArrayList<String>();
    
      public void start() {
        strList.clear();
    
        if (layout == null || !layout.isStarted()) {
          return;
        }
        super.start();
      }
    
      public void stop() {
        super.stop();
      }
    
      @Override
      protected void append(E eventObject) {
        String res = layout.doLayout(eventObject);
        strList.add(res);
      }
    
      public Layout<E> getLayout() {
        return layout;
      }
    
      public void setLayout(Layout<E> layout) {
        this.layout = layout;
      }
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/testUtil/EnvUtilForTests.java���������0000644�0001750�0001750�00000004051�12136544723�031470� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.testUtil;
    
    import java.net.InetAddress;
    import java.net.UnknownHostException;
    import java.util.ArrayList;
    import java.util.List;
    
    import ch.qos.logback.core.util.CoreTestConstants;
    
    public class EnvUtilForTests {
    
      static public boolean isWindows() {
        return System.getProperty("os.name").indexOf("Windows") != -1;
      }
    
      static public boolean isMac() {
        return System.getProperty("os.name").indexOf("Mac") != -1;
      }
    
      static public boolean isLinux() {
        return System.getProperty("os.name").indexOf("Linux") != -1;
      }
    
    
      static public boolean isRunningOnSlowJenkins() {
        return System.getProperty(CoreTestConstants.SLOW_JENKINS) != null;
      }
    
    
      static public String getLocalHostName() {
        InetAddress localhostIA;
        try {
          localhostIA = InetAddress.getLocalHost();
          return localhostIA.getHostName();
        } catch (UnknownHostException e) {
          return null;
        }
      }
    
      static public boolean isLocalHostNameInList(String[] hostList) {
        String localHostName = getLocalHostName();
        if (localHostName == null) {
          return false;
        }
        for (String host : hostList) {
          if (host.equalsIgnoreCase(localHostName)) {
            return true;
          }
        }
        return false;
      }
    
    
      public static String getPathToBash() {
        if (EnvUtilForTests.isLinux()) {
          return CoreTestConstants.BASH_PATH_ON_LINUX;
        }
        if (EnvUtilForTests.isLocalHostNameInList(new String[]{"hetz", "het"})) {
          return CoreTestConstants.BASH_PATH_ON_CYGWIN;
        }
        return null;
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/testUtil/DelayingListAppender.java����0000644�0001750�0001750�00000001656�12136042273�032460� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.testUtil;
    
    import ch.qos.logback.core.read.ListAppender;
    
    public class DelayingListAppender<E> extends ListAppender<E> {
    
      public int delay = 5;
      public boolean interrupted = false;
    
      @Override
      public void append(E e) {
        try {
          Thread.yield();
          Thread.sleep(delay);
          Thread.yield();
        } catch (InterruptedException ie) {
          interrupted = true;
        }
        super.append(e);
      }
    }
    
    ����������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/testUtil/FileTestUtil.java������������0000644�0001750�0001750�00000002174�12136042273�030762� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.testUtil;
    
    import ch.qos.logback.core.util.CoreTestConstants;
    
    import java.io.File;
    
    import static junit.framework.Assert.assertTrue;
    
    /**
     * @author Ceki G&uuml;c&uuml;
     */
    public class FileTestUtil {
    
      public static void makeTestOutputDir() {
        File target = new File(CoreTestConstants.TARGET_DIR);
        if(target.exists() && target.isDirectory()) {
          File testoutput = new File(CoreTestConstants.OUTPUT_DIR_PREFIX);
          if(!testoutput.exists())
            assertTrue(testoutput.mkdir());
        } else {
          throw new IllegalStateException(CoreTestConstants.TARGET_DIR + " does not exist");
        }
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/testUtil/NPEAppender.java�������������0000644�0001750�0001750�00000001331�12136042273�030500� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.testUtil;
    
    import ch.qos.logback.core.AppenderBase;
    
    public class NPEAppender<E> extends AppenderBase<E> {
      @Override
      protected void append(E eventObject) {
         throw new NullPointerException();
      }
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/issue/��������������������������������0000755�0001750�0001750�00000000000�12203357067�025056� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/issue/LBCORE97.java�������������������0000644�0001750�0001750�00000013224�12136042272�027043� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.issue;
    
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    /**
     * Example code illustrating locking policies in the JDK.
     * See http://jira.qos.ch/browse/LBCORE-97 for a discussion.
     * 
     * @author Joern Huxhorn
     */
    public class LBCORE97 {
    
      static int THREAD_COUNT = 10;
      
      public static void main(String args[]) throws InterruptedException {
        
        System.out.println("Environment:");
        System.out.println("java.runtime.name    = "
            + System.getProperty("java.runtime.name"));
        System.out.println("java.runtime.version = "
            + System.getProperty("java.runtime.version"));
        System.out.println("java.vendor          = "
            + System.getProperty("java.vendor"));
        System.out.println("java.version         = "
            + System.getProperty("java.version"));
        System.out.println("java.vm.name         = "
            + System.getProperty("java.vm.name"));
        System.out.println("java.vm.info         = "
            + System.getProperty("java.vm.info"));
    
        System.out.println("os.name              = "
            + System.getProperty("os.name"));
        System.out.println("os.version           = "
            + System.getProperty("os.version"));
        System.out.println("os.arch              = "
            + System.getProperty("os.arch"));
        System.out.println("##########################################");
    
        usingSynchronized(THREAD_COUNT);
        usingUnfairLock(THREAD_COUNT);
        usingFairLock(THREAD_COUNT);
      }
    
      public static void execute(String text, Thread[] threads)
          throws InterruptedException {
        System.out.println("About to execute " + text + "...");
        int threadCount = threads.length;
        for (int i = 0; i < threadCount; i++) {
          threads[i].start();
        }
    
        Thread.sleep(10000);
    
        for (int i = 0; i < threadCount; i++) {
          threads[i].interrupt();
        }
        Thread.sleep(1000); // wait a moment for termination, to lazy for join ;)
      }
    
      public static void print(String text, Runnable[] runnables) {
        System.out.println("Results for " + text + ":");
        for (int i = 0; i < runnables.length; i++) {
          System.out.println("runnables[" + i + "]: " + runnables[i]);
        }
        System.out.println("##########################################");
      }
    
      public static void usingSynchronized(int threadCount)
          throws InterruptedException {
        Object lockObject = new Object();
        Runnable[] runnables = new Runnable[threadCount];
        Thread[] threads = new Thread[threadCount];
    
        for (int i = 0; i < threadCount; i++) {
          runnables[i] = new SynchronizedRunnable(lockObject);
          threads[i] = new Thread(runnables[i]);
        }
        String text = "usingSynchronized";
        execute(text, threads);
        print(text, runnables);
      }
    
      public static void usingUnfairLock(int threadCount)
          throws InterruptedException {
        Lock lock = new ReentrantLock();
        Runnable[] runnables = new Runnable[threadCount];
        Thread[] threads = new Thread[threadCount];
    
        for (int i = 0; i < threadCount; i++) {
          runnables[i] = new LockRunnable(lock);
          threads[i] = new Thread(runnables[i]);
        }
    
        String text = "usingUnfairLock";
        execute(text, threads);
        print(text, runnables);
      }
    
      public static void usingFairLock(int threadCount) throws InterruptedException {
        Lock lock = new ReentrantLock(true);
        Runnable[] runnables = new Runnable[threadCount];
        Thread[] threads = new Thread[threadCount];
    
        for (int i = 0; i < threadCount; i++) {
          runnables[i] = new LockRunnable(lock);
          threads[i] = new Thread(runnables[i]);
        }
    
        String text = "usingFairLock";
        execute(text, threads);
        print(text, runnables);
      }
    
      public static class SynchronizedRunnable implements Runnable {
        private final Object lockObject;
        private int counter;
        private boolean running;
    
        public SynchronizedRunnable(Object lockObject) {
          this.lockObject = lockObject;
          this.counter = 0;
          this.running = false;
        }
    
        public void run() {
          running = true;
          for (;;) {
            synchronized (lockObject) {
              counter++;
              try {
                Thread.sleep(10);
              } catch (InterruptedException ex) {
                break;
              }
            }
          }
          running = false;
        }
    
        public String toString() {
          return "SynchronizedRunnable[counter=" + counter + ", running=" + running
              + "]";
        }
      }
    
      public static class LockRunnable implements Runnable {
        private final Lock lock;
        private int counter;
        private boolean running;
    
        public LockRunnable(Lock lock) {
          this.lock = lock;
          this.counter = 0;
          this.running = false;
        }
    
        public void run() {
          running = true;
          for (;;) {
            lock.lock();
            try {
              counter++;
              Thread.sleep(10);
            } catch (InterruptedException ex) {
              break;
            } finally {
              lock.unlock();
            }
          }
          running = false;
        }
    
        public String toString() {
          return "LockRunnable[counter=" + counter + ", running=" + running + "]";
        }
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/issue/LockingInJava.java��������������0000644�0001750�0001750�00000005216�12136042272�030376� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.issue;
    
    /**
     * Short sample code illustrating locking policies in the JDK. See
     * http://jira.qos.ch/browse/LBCORE-97 for a discussion.
     * 
     * @author Joern Huxhorn
     * @author Ceki Gulcu
     */
    public class LockingInJava implements Runnable {
    
      static int THREAD_COUNT = 5;
      static Object LOCK = new Object();
      static LockingInJava[] RUNNABLE_ARRAY = new LockingInJava[THREAD_COUNT];
      static Thread[] THREAD_ARRAY = new Thread[THREAD_COUNT];
    
      private int counter = 0;
      private boolean done = false;
      
      public static void main(String args[]) throws InterruptedException {
        printEnvironmentInfo();
        execute();
        printResults();
      }
    
      public static void printEnvironmentInfo() {
        System.out.println("java.runtime.version = "
            + System.getProperty("java.runtime.version"));
        System.out.println("java.vendor          = "
            + System.getProperty("java.vendor"));
        System.out.println("java.version         = "
            + System.getProperty("java.version"));
        System.out.println("os.name              = "
            + System.getProperty("os.name"));
        System.out.println("os.version           = "
            + System.getProperty("os.version"));
      }
    
      public static void execute() throws InterruptedException {
        for (int i = 0; i < THREAD_COUNT; i++) {
          RUNNABLE_ARRAY[i] = new LockingInJava();
          THREAD_ARRAY[i] = new Thread(RUNNABLE_ARRAY[i]);
        }
        for (Thread t : THREAD_ARRAY) {
          t.start();
        }
        // let the threads run for a while
        Thread.sleep(10000);
        
        for (int i = THREAD_COUNT - 1; i <= 0; i--) {
          RUNNABLE_ARRAY[i].done = true;
        }
     
      }
    
      public static void printResults() {
        for (int i = 0; i < RUNNABLE_ARRAY.length; i++) {
          System.out.println("runnable[" + i + "]: " + RUNNABLE_ARRAY[i]);
        }
      }
    
      public void run() {
        for (;;) {
          synchronized (LOCK) {
            counter++;
            try {
              Thread.sleep(10);
            } catch (InterruptedException ex) {
            }
            if(done) {
              return;
            }
          }
        }
      }
    
      public String toString() {
        return "counter=" + counter;
      }
    
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/issue/NoLockingInJava.java������������0000644�0001750�0001750�00000004662�12136042272�030677� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.issue;
    
    /**
     * Measure throughput without any locking policy
     * 
     * @author Joern Huxhorn
     * @author Ceki Gulcu
     */
    public class NoLockingInJava implements Runnable {
    
      static int THREAD_COUNT = 5;
      static Object LOCK = new Object();
      static NoLockingInJava[] RUNNABLE_ARRAY = new NoLockingInJava[THREAD_COUNT];
      static Thread[] THREAD_ARRAY = new Thread[THREAD_COUNT];
    
      private int counter = 0;
      private boolean done = false;
    
      public static void main(String args[]) throws InterruptedException {
        printEnvironmentInfo();
        execute();
        printResults();
      }
    
      public static void printEnvironmentInfo() {
        System.out.println("java.runtime.version = "
            + System.getProperty("java.runtime.version"));
        System.out.println("java.vendor          = "
            + System.getProperty("java.vendor"));
        System.out.println("java.version         = "
            + System.getProperty("java.version"));
        System.out.println("os.name              = "
            + System.getProperty("os.name"));
        System.out.println("os.version           = "
            + System.getProperty("os.version"));
      }
    
      public static void execute() throws InterruptedException {
        for (int i = 0; i < THREAD_COUNT; i++) {
          RUNNABLE_ARRAY[i] = new NoLockingInJava();
          THREAD_ARRAY[i] = new Thread(RUNNABLE_ARRAY[i]);
        }
        for (Thread t : THREAD_ARRAY) {
          t.start();
        }
        // let the threads run for a while
        Thread.sleep(10000);
    
        for (int i = THREAD_COUNT - 1; i <= 0; i--) {
          RUNNABLE_ARRAY[i].done = true;
        }
    
      }
    
      public static void printResults() {
        for (int i = 0; i < RUNNABLE_ARRAY.length; i++) {
          System.out.println("runnable[" + i + "]: " + RUNNABLE_ARRAY[i]);
        }
      }
    
      public void run() {
        for (;;) {
          counter++;
          if (done) {
            return;
          }
        }
      }
    
      public String toString() {
        return "counter=" + counter;
      }
    
    }
    ������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/issue/LockThroughput.java�������������0000644�0001750�0001750�00000003542�12136042272�030701� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.issue;
    
    import ch.qos.logback.core.contention.ThreadedThroughputCalculator;
    import ch.qos.logback.core.issue.SelectiveLockRunnable.LockingModel;
    
    /**
     * Short sample code testing the throughput of a fair lock.
     * 
     * @author Joern Huxhorn
     * @author Ceki Gulcu
     */
    public class LockThroughput {
    
      static int THREAD_COUNT = 10;
      static long OVERALL_DURATION_IN_MILLIS = 5000;
    
      public static void main(String args[]) throws InterruptedException {
    
        ThreadedThroughputCalculator tp = new ThreadedThroughputCalculator(
            OVERALL_DURATION_IN_MILLIS);
        tp.printEnvironmentInfo("LockThroughput");
    
        for (int i = 0; i < 2; i++) {
          tp.execute(buildArray(LockingModel.SYNC));
          tp.execute(buildArray(LockingModel.UNFAIR));
          tp.execute(buildArray(LockingModel.FAIR));
        }
        
        tp.execute(buildArray(LockingModel.SYNC));
        tp.printThroughput("Sync:   ");
    
        tp.execute(buildArray(LockingModel.UNFAIR));
        tp.printThroughput("Unfair: ");
    
        tp.execute(buildArray(LockingModel.FAIR));
        tp.printThroughput("Fair:   ");
      }
    
      static SelectiveLockRunnable[] buildArray(LockingModel model) {
        SelectiveLockRunnable[] array = new SelectiveLockRunnable[THREAD_COUNT];
        for (int i = 0; i < THREAD_COUNT; i++) {
          array[i] = new SelectiveLockRunnable(model);
        }
        return array;
      }
    
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/issue/lbcore258/����������������������0000755�0001750�0001750�00000000000�12203357067�026563� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/issue/lbcore258/FileLockSimulator.java0000644�0001750�0001750�00000007072�12136042272�033016� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.issue.lbcore258;
    
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.nio.channels.FileChannel;
    import java.nio.channels.FileLock;
    
    
    /**
     *  FileLockSimulator is a small application intended to simulate FileAppender in prudent mode.
     * In this mode, the application obtains an exclusive lock on the file, writes to the file and
     * then releases the lock.
     *
     * <pre>  Usage:
     *   java  FileLockSimulator instanceName pathToLogFile delay
     * where
     * "instanceName" is the name given to the current instance of the application
     * "pathToLogFile" is the path to the log file
     * "delay" is the number of milliseconds of sleep observed every 128 writes
     * </pre>
     *
     * <b>This small application requires only the JDK to compile and to execute.</b>
     *
     * <p>FileLockSimulator should be launched as many times and from as many hosts as there will be
     * JVMs writing to a log file in prudent mode. Performance should be quite good if
     * "pathToLogFile" is on a local file system. On networked file systems such as NFS, performance
     * depends on the speed of the network and NFS implementation. It has been observed that file
     * locking over NFS is biased so that the current owner of the lock is favored over other processes.
     * Thus, while one process hogs the lock for the log file, other processes starve waiting for the
     * lock to the point of appearing deadlocked.
     *
     */
    public class FileLockSimulator  {
    
      static String LINE_SEPARATOR = System.getProperty("line.separator");
      static final int DOT_FREQ = 128;
      static final int DOT_WITH_NEW_LINE_FREQ = DOT_FREQ * 80;
    
      static String instanceName;
      static int delay;
      static FileOutputStream fos;
      static FileChannel fileChannel;
    
      public static void main(String[] args) throws IOException, InterruptedException {
    
        String instanceName = args[0];
        System.out.println("Instance named as [" + instanceName + "]");
    
        String fileStr = args[1];
        System.out.println("Output target specified as [" + fileStr + "]");
    
        int delay = Integer.parseInt(args[2]);
        System.out.println("Sleep delay specified as [" + delay + "] milliseconds");
    
        fos = new FileOutputStream(fileStr, true);
        fileChannel = fos.getChannel();
    
        for (int i = 1; ; i++) {
          printDotAndSleep(i);
          lockAndWrite(i);
        }
      }
    
      static void lockAndWrite(int i) throws InterruptedException, IOException {
        FileLock fileLock = null;
        try {
          fileLock = fileChannel.lock();
          long position = fileChannel.position();
          long size = fileChannel.size();
          if (size != position) {
            fileChannel.position(size);
          }
          String msg = "hello from" + instanceName + " " + i + LINE_SEPARATOR;
          fos.write(msg.getBytes());
        } finally {
          if (fileLock != null) {
            fileLock.release();
          }
        }
      }
    
      static void printDotAndSleep(int i) throws InterruptedException {
        if (i % DOT_FREQ == 0) {
          System.out.print(".");
          Thread.sleep(delay);
        }
        if (i % DOT_WITH_NEW_LINE_FREQ == 0) System.out.println("");
      }
    }����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/issue/SelectiveLockRunnable.java������0000644�0001750�0001750�00000004244�12136042272�032142� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.issue;
    
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    import ch.qos.logback.core.contention.RunnableWithCounterAndDone;
    
    /**
     * A runnable which behaves differently depending on the desired locking model.
     * 
     * @author Joern Huxhorn
     * @author Ceki Gulcu
     */
    public class SelectiveLockRunnable extends RunnableWithCounterAndDone {
    
      enum LockingModel {
        NOLOCK, SYNC, FAIR, UNFAIR;
      }
    
      static Object LOCK = new Object();
      static Lock FAIR_LOCK = new ReentrantLock(true);
      static Lock UNFAIR_LOCK = new ReentrantLock(false);
    
      LockingModel model;
    
      SelectiveLockRunnable(LockingModel model) {
        this.model = model;
      }
    
      public void run() {
        switch (model) {
        case NOLOCK:
          nolockRun();
          break;
        case SYNC:
          synchronizedRun();
          break;
        case FAIR:
          fairLockRun();
          break;
        case UNFAIR:
          unfairLockRun();
          break;
        }
      }
    
      void fairLockRun() {
        for (;;) {
          FAIR_LOCK.lock();
          counter++;
          FAIR_LOCK.unlock();
          if (done) {
            return;
          }
        }
      }
    
      void unfairLockRun() {
        for (;;) {
          UNFAIR_LOCK.lock();
          counter++;
          UNFAIR_LOCK.unlock();
          if (done) {
            return;
          }
        }
      }
    
      void nolockRun() {
        for (;;) {
          counter++;
          if (done) {
            return;
          }
        }
      }
    
      void synchronizedRun() {
        for (;;) {
          synchronized (LOCK) {
            counter++;
          }
          if (done) {
            return;
          }
        }
      }
      
      @Override
      public String toString() {
        return "SelectiveLockRunnable "+model;
      }
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/issue/NoLockThroughput.java�����������0000644�0001750�0001750�00000003130�12136042272�031167� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.issue;
    
    import ch.qos.logback.core.contention.ThreadedThroughputCalculator;
    import ch.qos.logback.core.issue.SelectiveLockRunnable.LockingModel;
    
    /**
     * Short sample code testing the throughput of a fair lock.
     * 
     * @author Joern Huxhorn
     * @author Ceki Gulcu
     */
    public class NoLockThroughput {
    
      static int THREAD_COUNT = 3;
      static long OVERALL_DURATION_IN_MILLIS = 2000;
    
      public static void main(String args[]) throws InterruptedException {
    
        ThreadedThroughputCalculator tp = new ThreadedThroughputCalculator(
            OVERALL_DURATION_IN_MILLIS);
        tp.printEnvironmentInfo("NoLockThroughput");
    
        for (int i = 0; i < 2; i++) {
          tp.execute(buildArray(LockingModel.NOLOCK));
        }
    
        tp.execute(buildArray(LockingModel.NOLOCK));
        tp.printThroughput("No lock:   ", true);
      }
    
      static SelectiveLockRunnable[] buildArray(LockingModel model) {
        SelectiveLockRunnable[] array = new SelectiveLockRunnable[THREAD_COUNT];
        for (int i = 0; i < THREAD_COUNT; i++) {
          array[i] = new SelectiveLockRunnable(model);
        }
        return array;
      }
    
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/issue/LOGBACK_849/��������������������0000755�0001750�0001750�00000000000�12203357067�026524� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/issue/LOGBACK_849/Basic.java����������0000644�0001750�0001750�00000003104�12140214537�030400� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������package ch.qos.logback.core.issue.LOGBACK_849;
    
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.TimeUnit;
    
    import org.junit.Ignore;
    import org.junit.Test;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.ContextBase;
    import ch.qos.logback.core.util.ExecutorServiceUtil;
    
    
    public class Basic {
    
      ExecutorService executor = ExecutorServiceUtil.newExecutorService();
      Context context = new ContextBase();
    
      @Test(timeout = 100)
      public void withNoSubmittedTasksShutdownNowShouldReturnImmediately() throws InterruptedException {
        executor.shutdownNow();
        executor.awaitTermination(5000, TimeUnit.MILLISECONDS);
      }
    
      @Ignore
      @Test
      public void withOneSlowTask() throws InterruptedException {
        executor.execute(new InterruptIgnoring(1000));
        Thread.sleep(100);
        ExecutorServiceUtil.shutdown(executor);
      }
    
      //  InterruptIgnoring ===========================================
      static class InterruptIgnoring implements Runnable {
    
        int delay;
    
        InterruptIgnoring(int delay) {
          this.delay = delay;
        }
    
        public void run() {
          long runUntil = System.currentTimeMillis() + delay;
    
          while (true) {
            try {
              long sleep = runUntil - System.currentTimeMillis();
              System.out.println("will sleep " + sleep);
              if (sleep > 0) {
                Thread.currentThread().sleep(delay);
              } else {
                return;
              }
            } catch (InterruptedException e) {
              // ignore the exception
            }
          }
        }
      }
    
    
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/AllCoreTest.java����������������������0000644�0001750�0001750�00000002725�12140555240�026751� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core;
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    import org.junit.runners.Suite.SuiteClasses;
    
    @RunWith(Suite.class)
    @SuiteClasses({BasicStatusManagerTest.class,
            ch.qos.logback.core.status.PackageTest.class,
            ch.qos.logback.core.util.PackageTest.class,
            ch.qos.logback.core.helpers.PackageTest.class,
            ch.qos.logback.core.subst.PackageTest.class,
            ch.qos.logback.core.pattern.PackageTest.class,
            ch.qos.logback.core.PackageTest.class,
            ch.qos.logback.core.joran.PackageTest.class,
            ch.qos.logback.core.appender.PackageTest.class,
            ch.qos.logback.core.spi.PackageTest.class,
            ch.qos.logback.core.rolling.PackageTest.class,
            ch.qos.logback.core.net.PackageTest.class,
            ch.qos.logback.core.sift.PackageTest.class,
            ch.qos.logback.core.encoder.PackageTest.class,
            ch.qos.logback.core.recovery.PackageTest.class})
    public class AllCoreTest {
    }
    �������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/rolling/������������������������������0000755�0001750�0001750�00000000000�12203357067�025374� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/rolling/RolloverChecker.java����������0000644�0001750�0001750�00000001272�12136042147�031325� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     * or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    
    package ch.qos.logback.core.rolling;
    
    import java.io.IOException;
    import java.util.List;
    
    
    public interface RolloverChecker {
      public void check(List<String> expectedFilenameList) throws IOException;
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000146�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/rolling/SizeAndTimeBasedFNATP_Test.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/rolling/SizeAndTimeBasedFNATP_Test.jav0000644�0001750�0001750�00000016506�12136042273�033004� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     * or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling;
    
    import ch.qos.logback.core.encoder.EchoEncoder;
    import ch.qos.logback.core.status.InfoStatus;
    import ch.qos.logback.core.status.StatusManager;
    import ch.qos.logback.core.util.StatusPrinter;
    import org.junit.Before;
    import org.junit.Test;
    
    import java.io.File;
    import java.io.IOException;
    import java.util.Date;
    import java.util.List;
    import java.util.concurrent.ExecutionException;
    
    public class SizeAndTimeBasedFNATP_Test extends ScaffoldingForRollingTests {
      private SizeAndTimeBasedFNATP sizeAndTimeBasedFNATP = null;
      private RollingFileAppender<Object> rfa1 = new RollingFileAppender<Object>();
      private TimeBasedRollingPolicy<Object> tbrp1 = new TimeBasedRollingPolicy<Object>();
      private RollingFileAppender<Object> rfa2 = new RollingFileAppender<Object>();
      private TimeBasedRollingPolicy<Object> tbrp2 = new TimeBasedRollingPolicy<Object>();
    
      private EchoEncoder<Object> encoder = new EchoEncoder<Object>();
      int fileSize = 0;
      int fileIndexCounter = 0;
      int sizeThreshold = 0;
    
    
      @Before
      public void setUp() {
        super.setUp();
      }
    
      private void initRollingFileAppender(RollingFileAppender<Object> rfa, String filename) {
        rfa.setContext(context);
        rfa.setEncoder(encoder);
        if (filename != null) {
          rfa.setFile(filename);
        }
      }
    
      private void initPolicies(RollingFileAppender<Object> rfa,
                                TimeBasedRollingPolicy<Object> tbrp,
                                String filenamePattern, int sizeThreshold,
                                long givenTime, long lastCheck) {
        sizeAndTimeBasedFNATP = new SizeAndTimeBasedFNATP<Object>();
        tbrp.setContext(context);
        sizeAndTimeBasedFNATP.setMaxFileSize("" + sizeThreshold);
        tbrp.setTimeBasedFileNamingAndTriggeringPolicy(sizeAndTimeBasedFNATP);
        tbrp.setFileNamePattern(filenamePattern);
        tbrp.setParent(rfa);
        tbrp.timeBasedFileNamingAndTriggeringPolicy.setCurrentTime(givenTime);
        rfa.setRollingPolicy(tbrp);
        tbrp.start();
        rfa.start();
      }
    
      private void addExpectedFileNamedIfItsTime(String randomOutputDir, String testId, String msg, String compressionSuffix) {
        fileSize = fileSize + msg.getBytes().length;
        if (passThresholdTime(nextRolloverThreshold)) {
          fileIndexCounter = 0;
          fileSize = 0;
          addExpectedFileName_ByFileIndexCounter(randomOutputDir, testId, getMillisOfCurrentPeriodsStart(),
                  fileIndexCounter, compressionSuffix);
          recomputeRolloverThreshold(currentTime);
          return;
        }
    
        // windows can delay file size changes, so we only allow for
        // fileIndexCounter 0
        if ((fileIndexCounter < 1) && fileSize > sizeThreshold) {
          addExpectedFileName_ByFileIndexCounter(randomOutputDir, testId, getMillisOfCurrentPeriodsStart(),
                  fileIndexCounter, compressionSuffix);
          fileIndexCounter = fileIndexCounter + 1;
          fileSize = 0;
        }
      }
    
    
      void generic(String testId, String stem, boolean withSecondPhase, String compressionSuffix) throws IOException, InterruptedException, ExecutionException {
        String file = (stem != null) ? randomOutputDir + stem : null;
        initRollingFileAppender(rfa1, file);
        sizeThreshold = 300;
        initPolicies(rfa1, tbrp1, randomOutputDir + testId + "-%d{" + DATE_PATTERN_WITH_SECONDS + "}-%i.txt" + compressionSuffix, sizeThreshold, currentTime, 0);
        addExpectedFileName_ByFileIndexCounter(randomOutputDir, testId, getMillisOfCurrentPeriodsStart(), fileIndexCounter, compressionSuffix);
        incCurrentTime(100);
        tbrp1.timeBasedFileNamingAndTriggeringPolicy.setCurrentTime(currentTime);
        int runLength = 100;
        String prefix = "Hello -----------------";
    
        for (int i = 0; i < runLength; i++) {
          String msg = prefix + i;
          rfa1.doAppend(msg);
          addExpectedFileNamedIfItsTime(randomOutputDir, testId, msg, compressionSuffix);
          incCurrentTime(20);
          tbrp1.timeBasedFileNamingAndTriggeringPolicy.setCurrentTime(currentTime);
          add(tbrp1.future);
        }
    
        if (withSecondPhase) {
          secondPhase(testId, file, stem, compressionSuffix, runLength, prefix);
          runLength = runLength * 2;
        }
    
        if (stem != null)
          massageExpectedFilesToCorresponToCurrentTarget(file, true);
    
        Thread.yield();
        // wait for compression to finish
        waitForJobsToComplete();
    
        StatusPrinter.print(context);
        existenceCheck(expectedFilenameList);
        sortedContentCheck(randomOutputDir, runLength, prefix);
      }
    
    
      void secondPhase(String testId, String file, String stem, String compressionSuffix, int runLength, String prefix) {
        rfa1.stop();
    
        if (stem != null) {
          File f = new File(file);
          f.setLastModified(currentTime);
        }
    
        StatusManager sm = context.getStatusManager();
        sm.add(new InfoStatus("Time when rfa1 is stopped: " + new Date(currentTime), this));
        sm.add(new InfoStatus("currentTime%1000=" + (currentTime % 1000), this));
    
        initRollingFileAppender(rfa2, file);
        initPolicies(rfa2, tbrp2, randomOutputDir + testId + "-%d{"
                + DATE_PATTERN_WITH_SECONDS + "}-%i.txt" + compressionSuffix, sizeThreshold, currentTime, 0);
    
        for (int i = runLength; i < runLength * 2; i++) {
          incCurrentTime(100);
          tbrp2.timeBasedFileNamingAndTriggeringPolicy.setCurrentTime(currentTime);
          String msg = prefix + i;
          rfa2.doAppend(msg);
          addExpectedFileNamedIfItsTime(randomOutputDir, testId, msg, compressionSuffix);
        }
      }
    
      static final boolean FIRST_PHASE_ONLY = false;
      static final boolean WITH_SECOND_PHASE = true;
      static String DEFAULT_COMPRESSION_SUFFIX = "";
    
      @Test
      public void noCompression_FileSet_NoRestart_1() throws InterruptedException, ExecutionException, IOException {
        generic("test1", "toto.log", FIRST_PHASE_ONLY, DEFAULT_COMPRESSION_SUFFIX);
      }
    
      @Test
      public void noCompression_FileBlank_NoRestart_2() throws Exception {
        generic("test2", null, FIRST_PHASE_ONLY, DEFAULT_COMPRESSION_SUFFIX);
      }
    
      @Test
      public void noCompression_FileBlank_WithStopStart_3() throws Exception {
        generic("test3", null, WITH_SECOND_PHASE, DEFAULT_COMPRESSION_SUFFIX);
      }
    
      @Test
      public void noCompression_FileSet_WithStopStart_4() throws Exception {
        generic("test4", "test4.log", WITH_SECOND_PHASE, DEFAULT_COMPRESSION_SUFFIX);
      }
    
      @Test
      public void withGZCompression_FileSet_NoRestart_5() throws Exception {
        generic("test5", "toto.log", FIRST_PHASE_ONLY, ".gz");
      }
    
      @Test
      public void withGZCompression_FileBlank_NoRestart_6() throws Exception {
        generic("test6", null, FIRST_PHASE_ONLY, ".gz");
      }
    
      @Test
      public void withZipCompression_FileSet_NoRestart_7() throws Exception {
        generic("test7", "toto.log", FIRST_PHASE_ONLY, ".zip");
        List<String> zipFiles = filterElementsInListBySuffix(".zip");
        checkZipEntryMatchesZipFilename(zipFiles);
      }
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/rolling/RollingFileAppenderTest.java��0000644�0001750�0001750�00000015022�12136042273�032757� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling;
    
    import ch.qos.logback.core.Appender;
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.ContextBase;
    import ch.qos.logback.core.appender.AbstractAppenderTest;
    import ch.qos.logback.core.encoder.DummyEncoder;
    import ch.qos.logback.core.status.Status;
    import ch.qos.logback.core.status.StatusChecker;
    import ch.qos.logback.core.testUtil.RandomUtil;
    import ch.qos.logback.core.util.CoreTestConstants;
    import ch.qos.logback.core.util.StatusPrinter;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import static org.junit.Assert.*;
    
    public class RollingFileAppenderTest extends AbstractAppenderTest<Object> {
    
      RollingFileAppender<Object> rfa = new RollingFileAppender<Object>();
      Context context = new ContextBase();
    
      TimeBasedRollingPolicy<Object> tbrp = new TimeBasedRollingPolicy<Object>();
      int diff = RandomUtil.getPositiveInt();
      String randomOutputDir = CoreTestConstants.OUTPUT_DIR_PREFIX + diff + "/";
    
      @Before
      public void setUp() throws Exception {
        // noStartTest fails if the context is set in setUp
        // rfa.setContext(context);
    
        rfa.setEncoder(new DummyEncoder<Object>());
        rfa.setName("test");
        tbrp.setContext(context);
        tbrp.setParent(rfa);
      }
    
      @After
      public void tearDown() throws Exception {
      }
    
      @Override
      protected Appender<Object> getAppender() {
        return rfa;
      }
    
      @Override
      protected Appender<Object> getConfiguredAppender() {
        rfa.setContext(context);
        tbrp
                .setFileNamePattern(CoreTestConstants.OUTPUT_DIR_PREFIX + "toto-%d.log");
        tbrp.start();
        rfa.setRollingPolicy(tbrp);
    
        rfa.start();
        return rfa;
      }
    
      @Test
      public void testPrudentModeLogicalImplications() {
        rfa.setContext(context);
        // prudent mode will force "file" property to be null
        rfa.setFile("some non null value");
        rfa.setAppend(false);
        rfa.setPrudent(true);
    
        tbrp
                .setFileNamePattern(CoreTestConstants.OUTPUT_DIR_PREFIX + "toto-%d.log");
        tbrp.start();
        rfa.setRollingPolicy(tbrp);
    
        rfa.start();
    
        assertTrue(rfa.isAppend());
        assertNull(rfa.rawFileProperty());
        assertTrue(rfa.isStarted());
      }
    
      @Test
      public void testPrudentModeLogicalImplicationsOnCompression() {
        rfa.setContext(context);
        rfa.setAppend(false);
        rfa.setPrudent(true);
    
        tbrp.setFileNamePattern(CoreTestConstants.OUTPUT_DIR_PREFIX + "toto-%d.log.zip");
        tbrp.start();
        rfa.setRollingPolicy(tbrp);
    
        rfa.start();
    
        StatusChecker checker = new StatusChecker(context);
        assertFalse(rfa.isStarted());
        assertEquals(Status.ERROR, checker.getHighestLevel(0));
      }
    
      @Test
      public void testFilePropertyAfterRollingPolicy() {
        rfa.setContext(context);
        rfa.setRollingPolicy(tbrp);
        rfa.setFile("x");
        StatusPrinter.print(context);
        StatusChecker statusChecker = new StatusChecker(context.getStatusManager());
        statusChecker.assertContainsMatch(Status.ERROR,
                "File property must be set before any triggeringPolicy ");
      }
    
      @Test
      public void testFilePropertyAfterTriggeringPolicy() {
        rfa.setContext(context);
        rfa.setTriggeringPolicy(new SizeBasedTriggeringPolicy<Object>());
        rfa.setFile("x");
        StatusChecker statusChecker = new StatusChecker(context.getStatusManager());
        statusChecker.assertContainsMatch(Status.ERROR,
                "File property must be set before any triggeringPolicy ");
      }
    
      @Test
      public void testFileNameWithParenthesis() {
        // if ')' is not escaped, the test throws
        // java.lang.IllegalStateException: FileNamePattern [.../program(x86)/toto-%d.log] does not contain a valid DateToken
        rfa.setContext(context);
        tbrp
                .setFileNamePattern(randomOutputDir + "program(x86)/toto-%d.log");
        tbrp.start();
        rfa.setRollingPolicy(tbrp);
        rfa.start();
        rfa.doAppend("hello");
      }
    
      @Test
      public void stopTimeBasedRollingPolicy() {
        rfa.setContext(context);
    
        tbrp.setFileNamePattern(CoreTestConstants.OUTPUT_DIR_PREFIX + "toto-%d.log.zip");
        tbrp.start();
        rfa.setRollingPolicy(tbrp);
        rfa.start();
    
        StatusPrinter.print(context);
        assertTrue(tbrp.isStarted());
        assertTrue(rfa.isStarted());
        rfa.stop();
        assertFalse(rfa.isStarted());
        assertFalse(tbrp.isStarted());
    
      }
    
      @Test
      public void stopFixedWindowRollingPolicy() {
        rfa.setContext(context);
        rfa.setFile(CoreTestConstants.OUTPUT_DIR_PREFIX + "toto-.log");
    
        FixedWindowRollingPolicy fwRollingPolicy = new FixedWindowRollingPolicy();
        fwRollingPolicy.setContext(context);
        fwRollingPolicy.setFileNamePattern(CoreTestConstants.OUTPUT_DIR_PREFIX + "toto-%i.log.zip");
        fwRollingPolicy.setParent(rfa);
        fwRollingPolicy.start();
        SizeBasedTriggeringPolicy sbTriggeringPolicy = new SizeBasedTriggeringPolicy();
        sbTriggeringPolicy.setContext(context);
        sbTriggeringPolicy.start();
    
        rfa.setRollingPolicy(fwRollingPolicy);
        rfa.setTriggeringPolicy(sbTriggeringPolicy);
    
        rfa.start();
    
        StatusPrinter.print(context);
        assertTrue(fwRollingPolicy.isStarted());
        assertTrue(sbTriggeringPolicy.isStarted());
        assertTrue(rfa.isStarted());
        rfa.stop();
        assertFalse(rfa.isStarted());
        assertFalse(fwRollingPolicy.isStarted());
        assertFalse(sbTriggeringPolicy.isStarted());
    
      }
    
      /**
       * Test for http://jira.qos.ch/browse/LOGBACK-796
       */
      @Test
      public void testFileShouldNotMatchFileNamePattern() {
        rfa.setContext(context);
        rfa.setFile(CoreTestConstants.OUTPUT_DIR_PREFIX + "x-2013-04.log");
        tbrp.setFileNamePattern(CoreTestConstants.OUTPUT_DIR_PREFIX + "x-%d{yyyy-MM}.log");
        tbrp.start();
    
        rfa.setRollingPolicy(tbrp);
        rfa.start();
        StatusChecker statusChecker = new StatusChecker(context);
        final String msg = "File property collides with fileNamePattern. Aborting.";
        boolean containsMatch = statusChecker.containsMatch(Status.ERROR, msg);
        assertTrue("Missing error: " + msg, containsMatch);
      }
    
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000146�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/rolling/ScaffoldingForRollingTests.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/rolling/ScaffoldingForRollingTests.jav0000644�0001750�0001750�00000022776�12136042273�033347� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.ContextBase;
    import ch.qos.logback.core.encoder.EchoEncoder;
    import ch.qos.logback.core.rolling.helper.FileFilterUtil;
    import ch.qos.logback.core.rolling.helper.FileNamePattern;
    import ch.qos.logback.core.testUtil.FileToBufferUtil;
    import ch.qos.logback.core.testUtil.RandomUtil;
    import ch.qos.logback.core.util.CoreTestConstants;
    
    import java.io.File;
    import java.io.IOException;
    import java.sql.Date;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Calendar;
    import java.util.Enumeration;
    import java.util.List;
    import java.util.concurrent.Future;
    import java.util.concurrent.TimeUnit;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipFile;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertTrue;
    
    /**
     * Scaffolding for various rolling tests. Some assumptions are made: - rollover
     * periodicity is 1 second (without precluding size based roll-over)
     *
     * @author Ceki G&uuml;lc&uuml;
     */
    public class ScaffoldingForRollingTests {
    
      static public final String DATE_PATTERN_WITH_SECONDS = "yyyy-MM-dd_HH_mm_ss";
      static public final SimpleDateFormat SDF = new SimpleDateFormat(
              DATE_PATTERN_WITH_SECONDS);
    
      int diff = RandomUtil.getPositiveInt();
      protected String randomOutputDir = CoreTestConstants.OUTPUT_DIR_PREFIX + diff
              + "/";
      EchoEncoder<Object> encoder = new EchoEncoder<Object>();
      Context context = new ContextBase();
      protected List<String> expectedFilenameList = new ArrayList<String>();
      protected long nextRolloverThreshold; // initialized in setUp()
      protected long currentTime; // initialized in setUp()
      protected List<Future<?>> futureList = new ArrayList<Future<?>>();
    
      Calendar calendar = Calendar.getInstance();
    
      public void setUp() {
        context.setName("test");
        calendar.set(Calendar.MILLISECOND, 333);
        currentTime = calendar.getTimeInMillis();
        recomputeRolloverThreshold(currentTime);
      }
    
      public static void existenceCheck(String filename) {
        assertTrue("File " + filename + " does not exist", new File(filename)
                .exists());
      }
    
      public static File[] getFilesInDirectory(String outputDirStr) {
        File outputDir = new File(outputDirStr);
        return outputDir.listFiles();
      }
    
      public static void fileContentCheck(File[] fileArray, int runLength,
                                          String prefix) throws IOException {
        List<String> stringList = new ArrayList<String>();
        for (File file : fileArray) {
          FileToBufferUtil.readIntoList(file, stringList);
        }
    
        List<String> witnessList = new ArrayList<String>();
    
        for (int i = 0; i < runLength; i++) {
          witnessList.add(prefix + i);
        }
        assertEquals(witnessList, stringList);
      }
    
      public static void sortedContentCheck(String outputDirStr, int runLength,
                                            String prefix) throws IOException {
        File[] fileArray = getFilesInDirectory(outputDirStr);
        FileFilterUtil.sortFileArrayByName(fileArray);
        fileContentCheck(fileArray, runLength, prefix);
      }
    
      public static void reverseSortedContentCheck(String outputDirStr,
                                                   int runLength, String prefix) throws IOException {
        File[] fileArray = getFilesInDirectory(outputDirStr);
        FileFilterUtil.reverseSortFileArrayByName(fileArray);
        fileContentCheck(fileArray, runLength, prefix);
      }
    
      public static void existenceCheck(List<String> filenameList) {
        for (String filename : filenameList) {
          assertTrue("File " + filename + " does not exist", new File(filename)
                  .exists());
        }
      }
    
      public static int existenceCount(List<String> filenameList) {
        int existenceCounter = 0;
        for (String filename : filenameList) {
          if (new File(filename).exists()) {
            existenceCounter++;
          }
        }
        return existenceCounter;
      }
    
      String testId2FileName(String testId) {
        return randomOutputDir + testId + ".log";
      }
    
      // assuming rollover every second
    
      protected void recomputeRolloverThreshold(long ct) {
        long delta = ct % 1000;
        nextRolloverThreshold = (ct - delta) + 1000;
      }
    
      protected boolean passThresholdTime(long nextRolloverThreshold) {
        return currentTime >= nextRolloverThreshold;
      }
    
      protected void incCurrentTime(long increment) {
        currentTime += increment;
      }
    
      protected Date getDateOfCurrentPeriodsStart() {
        long delta = currentTime % 1000;
        return new Date(currentTime - delta);
      }
    
      protected Date getDateOfPreviousPeriodsStart() {
        long delta = currentTime % 1000;
        return new Date(currentTime - delta - 1000);
      }
    
      protected long getMillisOfCurrentPeriodsStart() {
        long delta = currentTime % 1000;
        return (currentTime - delta);
      }
    
    
      protected void addExpectedFileName_ByDate(String patternStr, long millis) {
        FileNamePattern fileNamePattern = new FileNamePattern(patternStr, context);
        String fn = fileNamePattern.convert(new Date(millis));
        expectedFilenameList.add(fn);
      }
    
      void addExpectedFileNamedIfItsTime_ByDate(String fileNamePatternStr) {
        if (passThresholdTime(nextRolloverThreshold)) {
          addExpectedFileName_ByDate(fileNamePatternStr, getMillisOfCurrentPeriodsStart());
          recomputeRolloverThreshold(currentTime);
        }
      }
    
      protected void addExpectedFileName_ByDate(String outputDir, String testId, Date date,
                                                boolean gzExtension) {
    
        String fn = outputDir + testId + "-" + SDF.format(date);
        if (gzExtension) {
          fn += ".gz";
        }
        expectedFilenameList.add(fn);
      }
    
      protected void addExpectedFileName_ByFileIndexCounter(String randomOutputDir, String testId, long millis,
                                                            int fileIndexCounter, String compressionSuffix) {
        String fn = randomOutputDir + testId + "-" + SDF.format(millis) + "-" + fileIndexCounter + ".txt" + compressionSuffix;
        expectedFilenameList.add(fn);
      }
    
    
      protected List<String> filterElementsInListBySuffix(String suffix) {
        List<String> zipFiles = new ArrayList<String>();
        for (String filename : expectedFilenameList) {
          if (filename.endsWith(suffix))
            zipFiles.add(filename);
        }
        return zipFiles;
      }
    
      protected void addExpectedFileNamedIfItsTime_ByDate(String outputDir, String testId,
                                                          boolean gzExtension) {
        if (passThresholdTime(nextRolloverThreshold)) {
          addExpectedFileName_ByDate(outputDir, testId, getDateOfCurrentPeriodsStart(),
                  gzExtension);
          recomputeRolloverThreshold(currentTime);
        }
      }
    
      void massageExpectedFilesToCorresponToCurrentTarget(String fileName, boolean fileOptionIsSet) {
        int lastIndex = expectedFilenameList.size() - 1;
        String last = expectedFilenameList.remove(lastIndex);
    
        if (fileOptionIsSet) {
          expectedFilenameList.add(fileName);
        } else if (last.endsWith(".gz")) {
          int lastLen = last.length();
          String stem = last.substring(0, lastLen - 3);
          expectedFilenameList.add(stem);
        }
      }
    
    
      String addGZIfNotLast(int i) {
        int lastIndex = expectedFilenameList.size() - 1;
        if (i != lastIndex) {
          return ".gz";
        } else {
          return "";
        }
      }
    
      void zipEntryNameCheck(List<String> expectedFilenameList, String pattern) throws IOException {
        for (String filepath : expectedFilenameList) {
          checkZipEntryName(filepath, pattern);
        }
      }
    
      void checkZipEntryMatchesZipFilename(List<String> expectedFilenameList) throws IOException {
        for (String filepath : expectedFilenameList) {
          String stripped = stripStemFromZipFilename(filepath);
          checkZipEntryName(filepath, stripped);
        }
      }
    
      String stripStemFromZipFilename(String filepath) {
        File filepathAsFile = new File(filepath);
        String stem = filepathAsFile.getName();
        int stemLen = stem.length();
        return stem.substring(0, stemLen - ".zip".length());
    
      }
    
      void checkZipEntryName(String filepath, String pattern) throws IOException {
        System.out.println("Checking [" + filepath + "]");
        ZipFile zf = new ZipFile(filepath);
        Enumeration<? extends ZipEntry> entries = zf.entries();
        assert ((entries.hasMoreElements()));
        ZipEntry firstZipEntry = entries.nextElement();
        assert ((!entries.hasMoreElements()));
        System.out.println("Testing zip entry [" + firstZipEntry.getName() + "]");
        assertTrue(firstZipEntry.getName().matches(pattern));
      }
    
      protected void add(Future future) {
        if (future == null) return;
        if (!futureList.contains(future)) {
          futureList.add(future);
        }
      }
    
      protected void waitForJobsToComplete() {
        for (Future future : futureList) {
          try {
            future.get(4000, TimeUnit.MILLISECONDS);
          } catch (Exception e) {
            new RuntimeException("unexpected exception while testing", e);
          }
        }
    
      }
    }
    ��logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/rolling/TimeBasedRollingTest.java�����0000644�0001750�0001750�00000023737�12136042273�032272� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling;
    
    import ch.qos.logback.core.encoder.EchoEncoder;
    import ch.qos.logback.core.testUtil.EnvUtilForTests;
    import ch.qos.logback.core.util.StatusPrinter;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.concurrent.ExecutionException;
    
    /**
     * A rather exhaustive set of tests. Tests include leaving the file option
     * blank, or setting it, with and without compression, and tests with or without
     * stopping/restarting the RollingFileAppender.
     * <p/>
     * The regression tests log a few times using a RollingFileAppender. Then, they
     * predict the names of the files which should be generated and compare them
     * with witness files.
     * <p/>
     * <pre>
     *                Compression     file option    Stop/Restart
     *     Test1      NO              BLANK           NO
     *     Test2      YES             BLANK           NO
     *     Test3      NO              BLANK           YES
     *     Test4      NO              SET             YES
     *     Test5      NO              SET             NO
     *     Test6      YES             SET             NO
     * </pre>
     *
     * @author Ceki G&uuml;lc&uuml;
     */
    public class TimeBasedRollingTest extends ScaffoldingForRollingTests {
    
      static final int NO_RESTART = 0;
      static final int WITH_RESTART = 1;
      static final int WITH_RESTART_AND_LONG_WAIT = 2000;
    
      static final boolean FILE_OPTION_SET = true;
      static final boolean FILE_OPTION_BLANK = false;
    
    
      RollingFileAppender<Object> rfa1 = new RollingFileAppender<Object>();
      TimeBasedRollingPolicy<Object> tbrp1 = new TimeBasedRollingPolicy<Object>();
    
      RollingFileAppender<Object> rfa2 = new RollingFileAppender<Object>();
      TimeBasedRollingPolicy<Object> tbrp2 = new TimeBasedRollingPolicy<Object>();
    
      EchoEncoder<Object> encoder = new EchoEncoder<Object>();
    
      RolloverChecker rolloverChecker;
    
      @Before
      @Override
      public void setUp() {
        super.setUp();
      }
    
      @After
      public void tearDown() {
      }
    
      void initRFA(RollingFileAppender<Object> rfa, String filename) {
        rfa.setContext(context);
        rfa.setEncoder(encoder);
        if (filename != null) {
          rfa.setFile(filename);
        }
      }
    
      void initTRBP(RollingFileAppender<Object> rfa,
                    TimeBasedRollingPolicy<Object> tbrp, String filenamePattern,
                    long givenTime) {
        tbrp.setContext(context);
        tbrp.setFileNamePattern(filenamePattern);
        tbrp.setParent(rfa);
        tbrp.timeBasedFileNamingAndTriggeringPolicy = new DefaultTimeBasedFileNamingAndTriggeringPolicy<Object>();
        tbrp.timeBasedFileNamingAndTriggeringPolicy.setCurrentTime(givenTime);
        rfa.setRollingPolicy(tbrp);
        tbrp.start();
        rfa.start();
      }
    
    
      void genericTest(String testId, String patternPrefix, String compressionSuffix, boolean fileOptionIsSet, int waitDuration) throws IOException {
        boolean withCompression = compressionSuffix.length() > 0;
        String fileName = fileOptionIsSet ? testId2FileName(testId) : null;
        initRFA(rfa1, fileName);
    
        String fileNamePatternStr = randomOutputDir + patternPrefix + "-%d{" + DATE_PATTERN_WITH_SECONDS + "}" + compressionSuffix;
    
        initTRBP(rfa1, tbrp1, fileNamePatternStr, currentTime);
    
        // compute the current filename
        addExpectedFileName_ByDate(fileNamePatternStr, getMillisOfCurrentPeriodsStart());
    
        incCurrentTime(1100);
        tbrp1.timeBasedFileNamingAndTriggeringPolicy.setCurrentTime(currentTime);
    
        for (int i = 0; i < 3; i++) {
          rfa1.doAppend("Hello---" + i);
          addExpectedFileNamedIfItsTime_ByDate(fileNamePatternStr);
          incCurrentTime(500);
          tbrp1.timeBasedFileNamingAndTriggeringPolicy.setCurrentTime(currentTime);
          add(tbrp1.future);
        }
        rfa1.stop();
        waitForJobsToComplete();
    
        if (waitDuration != NO_RESTART) {
          doRestart(testId, patternPrefix, fileOptionIsSet, waitDuration);
        }
        waitForJobsToComplete();
    
        massageExpectedFilesToCorresponToCurrentTarget(fileName, fileOptionIsSet);
        StatusPrinter.print(context);
        rolloverChecker.check(expectedFilenameList);
      }
    
      void defaultTest(String testId, String patternPrefix, String compressionSuffix, boolean fileOptionIsSet, int waitDuration) throws IOException {
        boolean withCompression = compressionSuffix.length() > 0;
        rolloverChecker = new DefaultRolloverChecker(testId, withCompression, compressionSuffix);
        genericTest(testId, patternPrefix, compressionSuffix, fileOptionIsSet, waitDuration);
      }
    
      void doRestart(String testId, String patternPart, boolean fileOptionIsSet, int waitDuration) {
        // change the timestamp of the currently actively file
        File activeFile = new File(rfa1.getFile());
        activeFile.setLastModified(currentTime);
    
        incCurrentTime(waitDuration);
    
        String filePatternStr = randomOutputDir + patternPart + "-%d{" + DATE_PATTERN_WITH_SECONDS + "}";
    
        String fileName = fileOptionIsSet ? testId2FileName(testId) : null;
        initRFA(rfa2, fileName);
        initTRBP(rfa2, tbrp2, filePatternStr, currentTime);
        for (int i = 0; i < 3; i++) {
          rfa2.doAppend("World---" + i);
          addExpectedFileNamedIfItsTime_ByDate(filePatternStr);
          incCurrentTime(100);
          tbrp2.timeBasedFileNamingAndTriggeringPolicy.setCurrentTime(currentTime);
          add(tbrp2.future);
        }
        rfa2.stop();
      }
    
    
      @Test
      public void noCompression_FileBlank_NoRestart_1() throws IOException {
        defaultTest("test1", "test1", "", FILE_OPTION_BLANK, NO_RESTART);
      }
    
      @Test
      public void withCompression_FileBlank_NoRestart_2() throws IOException {
        defaultTest("test2", "test2", ".gz", FILE_OPTION_BLANK, NO_RESTART);
      }
    
      @Test
      public void noCompression_FileBlank_StopRestart_3() throws IOException {
        defaultTest("test3", "test3", "", FILE_OPTION_BLANK, WITH_RESTART);
      }
    
      @Test
      public void noCompression_FileSet_StopRestart_4() throws IOException {
        defaultTest("test4", "test4", "", FILE_OPTION_SET, WITH_RESTART);
      }
    
      @Test
      public void noCompression_FileSet_StopRestart_WithLongWait_4B() throws IOException {
        defaultTest("test4B", "test4B", "", FILE_OPTION_SET, WITH_RESTART_AND_LONG_WAIT);
      }
    
      @Test
      public void noCompression_FileSet_NoRestart_5() throws IOException {
        defaultTest("test5", "test6", "", FILE_OPTION_SET, NO_RESTART);
      }
    
      @Test
      public void withCompression_FileSet_NoRestart_6() throws IOException {
        defaultTest("test6", "test6", ".gz", FILE_OPTION_SET, NO_RESTART);
      }
    
      // LBCORE-169
      @Test
      public void withMissingTargetDirWithCompression() throws IOException {
        defaultTest("test7", "%d{yyyy-MM-dd, aux}/", ".gz", FILE_OPTION_SET, NO_RESTART);
      }
    
      @Test
      public void withMissingTargetDirWithZipCompression() throws IOException {
        defaultTest("test8", "%d{yyyy-MM-dd, aux}/", ".zip", FILE_OPTION_SET, NO_RESTART);
      }
    
      @Test
      public void failed_rename() throws IOException {
        if (!EnvUtilForTests.isWindows())
          return;
    
        FileOutputStream fos = null;
        try {
          String fileName = testId2FileName("failed_rename");
          File file = new File(fileName);
          file.getParentFile().mkdirs();
    
          fos = new FileOutputStream(fileName);
    
          String testId = "failed_rename";
          rolloverChecker = new ZRolloverChecker(testId);
          genericTest(testId, "failed_rename", "", FILE_OPTION_SET, NO_RESTART);
    
    
        } finally {
          StatusPrinter.print(context);
          if (fos != null) fos.close();
        }
      }
    
    //
    //  @Test
    //  public void withMissingTargetDir() throws Exception {
    //    String testId = "missingTargetDir";
    //
    //    initRFA(rfa1, testId2FileName(testId));
    //    int secondDiff = RandomUtil.getPositiveInt();
    //    String randomTargetDir = CoreTestConstants.OUTPUT_DIR_PREFIX + secondDiff + '/';
    //
    //    System.out.println("randomOutputDir" + randomOutputDir);
    //    System.out.println("randomTargetDir" + randomTargetDir);
    //
    //    initTRBP(rfa1, tbrp1, randomTargetDir + testId + "-%d{"
    //            + DATE_PATTERN_WITH_SECONDS + "}", currentTime);
    //
    //    addExpectedFileName_ByDate(randomTargetDir, testId, getDateOfCurrentPeriodsStart(), false);
    //
    //    incCurrentTime(1100);
    //    tbrp1.timeBasedFileNamingAndTriggeringPolicy.setCurrentTime(currentTime);
    //
    //    for (int i = 0; i < 3; i++) {
    //      rfa1.doAppend("Hello---" + i);
    //      addExpectedFileNamedIfItsTime_ByDate(randomTargetDir, testId, false);
    //      incCurrentTime(500);
    //      tbrp1.timeBasedFileNamingAndTriggeringPolicy.setCurrentTime(currentTime);
    //    }
    //    massageExpectedFilesToCorresponToCurrentTarget("missingTargetDir.log");
    //    int i = 0;
    //    for (String fn : expectedFilenameList) {
    //      System.out.println("expectedFile=" + fn);
    //      assertTrue(Compare.compare(fn, CoreTestConstants.TEST_SRC_PREFIX
    //              + "witness/rolling/tbr-test5." + i++));
    //    }
    //
    //  }
    //
    //  =========================================================================
    //  utility methods
    //  =========================================================================
    //
    //  void massageExpectedFilesToCorresponToCurrentTarget(String file) {
    //    // we added one too many files by date
    //    expectedFilenameList.remove(expectedFilenameList.size() - 1);
    //    // since file is set, we have to add it
    //    addExpectedFileName_ByFile(file);
    //  }
    //
    //  void addExpectedFileName_ByFile(String filenameSuffix) {
    //    String fn = randomOutputDir + filenameSuffix;
    //    expectedFilenameList.add(fn);
    //  }
    }
    ���������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/rolling/ZRolloverChecker.java���������0000644�0001750�0001750�00000002334�12136042273�031457� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling;
    
    
    import ch.qos.logback.core.util.Compare;
    import ch.qos.logback.core.util.CoreTestConstants;
    
    import java.io.IOException;
    import java.util.List;
    
    import static org.junit.Assert.assertTrue;
    
    public class ZRolloverChecker implements RolloverChecker {
    
      String testId;
    
      public ZRolloverChecker(String testId) {
        this.testId = testId;
      }
    
      public void check(List<String> expectedFilenameList) throws IOException {
        int lastIndex = expectedFilenameList.size() - 1;
        String lastFile = expectedFilenameList.get(lastIndex);
        String witnessFileName = CoreTestConstants.TEST_SRC_PREFIX + "witness/rolling/tbr-" + testId;
        assertTrue(Compare.compare(lastFile, witnessFileName));
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000151�00000000000�011562� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/rolling/SizeBasedTriggeringPolicyTest.java������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/rolling/SizeBasedTriggeringPolicyTest.0000644�0001750�0001750�00000003250�12136042273�033303� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling;
    
    import junit.framework.TestCase;
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.ContextBase;
    
    public class SizeBasedTriggeringPolicyTest extends TestCase {
    
      public void testStringToLong() {
        Context context = new ContextBase();
        SizeBasedTriggeringPolicy policy = new SizeBasedTriggeringPolicy();
        policy.setContext(context);
    
        Long result;
    
        {
          result = policy.toFileSize("123");
          assertEquals(new Long("123"), result);
        }
        {
          result = policy.toFileSize("123KB");
          // = 123 * 1024
          assertEquals(new Long("125952"), result);
        }
        {
          result = policy.toFileSize("123MB");
          // = 123 * 1024 * 1024
          assertEquals(new Long("128974848"), result);
        }
        {
          result = policy.toFileSize("123GB");
          // = 123 * 1024 * 1024 * 1024
          assertEquals(new Long("132070244352"), result);
        }
    
        {
          result = policy.toFileSize("123xxxx");
          // = 123 * 1024 * 1024 * 1024
          assertEquals(new Long(SizeBasedTriggeringPolicy.DEFAULT_MAX_FILE_SIZE),
              result);
          assertEquals(2, context.getStatusManager().getCount());
        }
    
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/rolling/PackageTest.java��������������0000644�0001750�0001750�00000001736�12136042273�030434� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling;
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    
    @RunWith(Suite.class)
    @Suite.SuiteClasses({RenameUtilTest.class, SizeBasedRollingTest.class,
    	    TimeBasedRollingTest.class, TimeBasedRollingWithArchiveRemoval_Test.class,
            MultiThreadedRollingTest.class,
            SizeAndTimeBasedFNATP_Test.class,
            RollingFileAppenderTest.class,
            ch.qos.logback.core.rolling.helper.PackageTest.class})
    public class PackageTest {
    }
    ����������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000172�00000000000�011565� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/rolling/TimeBasedFileNamingAndTriggeringPolicyBaseTest.java�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/rolling/TimeBasedFileNamingAndTriggeri0000644�0001750�0001750�00000005273�12136042273�033230� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.ContextBase;
    import org.junit.Before;
    import org.junit.Test;
    
    import java.util.logging.Logger;
    
    import static org.junit.Assert.assertEquals;
    
    /**
     * @author Ceki G&uuml;c&uuml;
     */
    public class TimeBasedFileNamingAndTriggeringPolicyBaseTest {
    
      static long MILLIS_IN_MINUTE = 60*1000;
    
      Context context = new ContextBase();
      RollingFileAppender rfa = new RollingFileAppender();
      TimeBasedRollingPolicy tbrp = new TimeBasedRollingPolicy();
      DefaultTimeBasedFileNamingAndTriggeringPolicy timeBasedFNATP = new DefaultTimeBasedFileNamingAndTriggeringPolicy();
    
      @Before
      public void setUp() {
        rfa.setContext(context);
        tbrp.setContext(context);
        timeBasedFNATP.setContext(context);
    
        rfa.setRollingPolicy(tbrp);
        tbrp.setParent(rfa);
        tbrp.setTimeBasedFileNamingAndTriggeringPolicy(timeBasedFNATP);
        timeBasedFNATP.setTimeBasedRollingPolicy(tbrp);
      }
    
      @Test
      public void singleDate() {
        // Tuesday December 20th 17:59:01 CET 2011
        long startTime = 1324400341553L;
        tbrp.setFileNamePattern("foo-%d{yyyy-MM'T'mm}.log");
        tbrp.start();
    
        timeBasedFNATP.setCurrentTime(startTime);
        timeBasedFNATP.start();
    
        timeBasedFNATP.setCurrentTime(startTime+MILLIS_IN_MINUTE);
        timeBasedFNATP.isTriggeringEvent(null, null);
        String elapsedPeriodsFileName = timeBasedFNATP.getElapsedPeriodsFileName();
        assertEquals("foo-2011-12T59.log", elapsedPeriodsFileName);
      }
    
      // see "log rollover should be configurable using %d multiple times in file name pattern"
      // http://jira.qos.ch/browse/LBCORE-242
    
      @Test
      public void multiDate() {
        // Tuesday December 20th 17:59:01 CET 2011
        long startTime = 1324400341553L;
        tbrp.setFileNamePattern("foo-%d{yyyy-MM, AUX}/%d{mm}.log");
        tbrp.start();
    
        timeBasedFNATP.setCurrentTime(startTime);
        timeBasedFNATP.start();
    
        timeBasedFNATP.setCurrentTime(startTime+MILLIS_IN_MINUTE);
        timeBasedFNATP.isTriggeringEvent(null, null);
        String elapsedPeriodsFileName = timeBasedFNATP.getElapsedPeriodsFileName();
        assertEquals("foo-2011-12/59.log", elapsedPeriodsFileName);
      }
    
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/rolling/DefaultRolloverChecker.java���0000644�0001750�0001750�00000003335�12136042147�032634� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     * or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling;
    
    
    import ch.qos.logback.core.util.Compare;
    import ch.qos.logback.core.util.CoreTestConstants;
    
    import java.io.IOException;
    import java.util.List;
    
    import static org.junit.Assert.assertTrue;
    
    public class DefaultRolloverChecker implements RolloverChecker {
    
      final String testId;
      final boolean withCompression;
      final String compressionSuffix;
    
      public DefaultRolloverChecker(String testId, boolean withCompression, String compressionSuffix) {
        this.testId = testId;
        this.withCompression = withCompression;
        this.compressionSuffix = compressionSuffix;
      }
    
      public void check(List<String> expectedFilenameList) throws IOException {
    
        int i = 0;
        for (String fn : expectedFilenameList) {
          String suffix = withCompression ? addGZIfNotLast(expectedFilenameList, i, compressionSuffix) : "";
    
          String witnessFileName = CoreTestConstants.TEST_SRC_PREFIX + "witness/rolling/tbr-" + testId + "." + i + suffix;
          assertTrue(Compare.compare(fn, witnessFileName));
          i++;
        }
      }
    
      String addGZIfNotLast(List<String> expectedFilenameList, int i, String suff) {
        int lastIndex = expectedFilenameList.size() - 1;
        return (i != lastIndex) ? suff : "";
      }
    }
    
    
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/rolling/MultiThreadedRollingTest.java�0000644�0001750�0001750�00000021570�12136042273�033161� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling;
    
    import static ch.qos.logback.core.util.CoreTestConstants.FAILURE_EXIT_CODE;
    import static ch.qos.logback.core.util.CoreTestConstants.SUCCESSFUL_EXIT_CODE;
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.fail;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.FilenameFilter;
    import java.io.IOException;
    import java.io.OutputStream;
    
    import ch.qos.logback.core.testUtil.EnvUtilForTests;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.ContextBase;
    import ch.qos.logback.core.contention.MultiThreadedHarness;
    import ch.qos.logback.core.contention.RunnableWithCounterAndDone;
    import ch.qos.logback.core.encoder.EchoEncoder;
    import ch.qos.logback.core.encoder.Encoder;
    import ch.qos.logback.core.status.StatusChecker;
    import ch.qos.logback.core.testUtil.RandomUtil;
    import ch.qos.logback.core.util.CoreTestConstants;
    import ch.qos.logback.core.util.StatusPrinter;
    
    public class MultiThreadedRollingTest {
    
      final static int NUM_THREADS = 10;
      final static int TOTAL_DURATION = 600;
      RunnableWithCounterAndDone[] runnableArray;
    
      Encoder<Object> encoder;
      Context context = new ContextBase();
    
      static String VERIFY_SH = "verify.sh";
    
      int diff = RandomUtil.getPositiveInt();
      String outputDirStr = CoreTestConstants.OUTPUT_DIR_PREFIX + "multi-" + diff
          + "/";
    
      RollingFileAppender<Object> rfa = new RollingFileAppender<Object>();
    
      String pathToBash = EnvUtilForTests.getPathToBash();
      OutputStream scriptOS;
    
      @Before
      public void setUp() throws Exception {
        encoder = new EchoEncoder<Object>();
        File outputDir = new File(outputDirStr);
        outputDir.mkdirs();
    
        System.out.println("Output dir [" + outputDirStr + "]");
    
        scriptOS = openScript();
    
        rfa.setName("rolling");
        rfa.setEncoder(encoder);
        rfa.setContext(context);
        rfa.setFile(outputDirStr + "output.log");
    
      }
    
      void close(OutputStream os) {
        if (os != null) {
          try {
            os.close();
          } catch (IOException e) {
          }
        }
      }
    
      @After
      public void tearDown() throws Exception {
        rfa.stop();
      }
    
      public void setUpTimeBasedTriggeringPolicy(RollingFileAppender<Object> rfa) {
        String datePattern = "yyyy-MM-dd'T'HH_mm_ss_SSS";
        TimeBasedRollingPolicy tbrp = new TimeBasedRollingPolicy();
        tbrp.setFileNamePattern(outputDirStr + "test-%d{" + datePattern + "}");
        tbrp.setContext(context);
        tbrp.setParent(rfa);
        tbrp.start();
    
        rfa.setRollingPolicy(tbrp);
        rfa.start();
      }
    
      public void setUpSizeBasedTriggeringPolicy(RollingFileAppender<Object> rfa) {
        SizeBasedTriggeringPolicy<Object> zbtp = new SizeBasedTriggeringPolicy<Object>();
        zbtp.setContext(context);
        zbtp.setMaxFileSize("100KB");
    
        zbtp.start();
        rfa.setTriggeringPolicy(zbtp);
    
        FixedWindowRollingPolicy fwrp = new FixedWindowRollingPolicy();
        fwrp.setContext(context);
        fwrp.setFileNamePattern(outputDirStr + "test-%i.log");
        fwrp.setMaxIndex(20);
        fwrp.setMinIndex(0);
        fwrp.setParent(rfa);
        fwrp.start();
        rfa.setRollingPolicy(fwrp);
        rfa.start();
      }
    
      RunnableWithCounterAndDone[] buildRunnableArray(boolean withDelay) {
        RunnableWithCounterAndDone[] runnableArray = new RunnableWithCounterAndDone[NUM_THREADS];
        for (int i = 0; i < NUM_THREADS; i++) {
          runnableArray[i] = new RFARunnable(i, rfa, withDelay);
        }
        return runnableArray;
      }
    
      OutputStream openScript() throws IOException {
        return new FileOutputStream(outputDirStr + VERIFY_SH);
      }
    
      @Test
      public void multiThreadedTimedBased() throws InterruptedException,
          IOException {
        setUpTimeBasedTriggeringPolicy(rfa);
        executeHarness(TOTAL_DURATION, false);
        printScriptForTimeBased();
        verify();
      }
    
      int testFileCount() {
        File outputDir = new File(outputDirStr);
        FilenameFilter filter = new FilenameFilter() {
          public boolean accept(File dir, String name) {
            if (name.matches("test-\\d{1,2}.log")) {
              return true;
            }
            return false;
          }
        };
        File[] files = outputDir.listFiles(filter);
        return files.length;
      }
    
      void verify() throws IOException, InterruptedException {
        close(scriptOS);
        // no point in this test if we don't have bash
        if (pathToBash == null) {
          return;
        }
        ProcessBuilder pb = new ProcessBuilder();
        pb.command(pathToBash, VERIFY_SH);
        pb.directory(new File(outputDirStr));
        Process process = pb.start();
        process.waitFor();
        int exitCode = process.exitValue();
    
        assertEquals(SUCCESSFUL_EXIT_CODE, exitCode);
        System.out
            .println("External script based verification returned with exit code "
                + exitCode);
      }
    
      @Test
      public void multiThreadedSizeBased() throws InterruptedException, IOException {
        setUpSizeBasedTriggeringPolicy(rfa);
        // on a fast machine with a fast hard disk, if the tests runs for too
        // long the MAX_WINDOW_SIZE is reached, resulting in data loss which
        // we cannot test for.
        executeHarness(TOTAL_DURATION, true);
        int numFiles = testFileCount();
        printScriptForSizeBased(numFiles);
        verify();
      }
    
      private void printScriptHeader(String type) throws IOException {
        out("# ====================================================");
        out("# A script to check the exactness of the output ");
        out("# produced by " + type + " test");
        out("# ====================================================");
        out("# ");
      }
    
      private void printCommonScriptCore() throws IOException {
        out("");
        out("for t in $(seq 0 1 " + (NUM_THREADS - 1) + ")");
        out("do");
        out("  echo \"Testing results of thread $t\"");
        out("  grep \"$t \" aggregated | cut -d ' ' -f 2 > ${t}-sample");
        out("  for j in $(seq 1 1 ${end[$t]}); do echo $j; done > ${t}-witness");
        out("  diff -q -w ${t}-sample ${t}-witness;");
        out("  res=$?");
        out("  if [ $res != \"0\" ]; then");
        out("    echo \"FAILED for $t\"");
        out("    exit " + FAILURE_EXIT_CODE);
        out("  fi");
        out("done");
        out("");
        out("exit " + SUCCESSFUL_EXIT_CODE);
      }
    
      private void printScriptForTimeBased() throws IOException {
        printScriptHeader("TimeBased");
        for (int i = 0; i < NUM_THREADS; i++) {
          out("end[" + i + "]=" + this.runnableArray[i].getCounter());
        }
        out("");
        out("rm aggregated");
        out("cat test* output.log >> aggregated");
        printCommonScriptCore();
    
      }
    
      private void printScriptForSizeBased(int numfiles) throws IOException {
        printScriptHeader("SizeBased");
    
        for (int i = 0; i < NUM_THREADS; i++) {
          out("end[" + i + "]=" + this.runnableArray[i].getCounter());
        }
        out("");
        out("rm aggregated");
        out("for i in $(seq " + (numfiles - 1)
            + " -1 0); do cat test-$i.log >> aggregated; done");
        out("cat output.log >> aggregated");
        out("");
        printCommonScriptCore();
      }
    
      private void out(String msg) throws IOException {
        scriptOS.write(msg.getBytes());
        scriptOS.write("\n".getBytes());
      }
    
      private void executeHarness(int duration, boolean withDelay)
          throws InterruptedException {
        MultiThreadedHarness multiThreadedHarness = new MultiThreadedHarness(
            duration);
        this.runnableArray = buildRunnableArray(withDelay);
        multiThreadedHarness.execute(runnableArray);
    
        StatusChecker checker = new StatusChecker(context.getStatusManager());
        if (!checker.isErrorFree(0)) {
          StatusPrinter.print(context);
          fail("errors reported");
        }
      }
    
      long diff(long start) {
        return System.currentTimeMillis() - start;
      }
    
      static class RFARunnable extends RunnableWithCounterAndDone {
        RollingFileAppender<Object> rfa;
        int id;
        boolean withInducedDelay;
    
        RFARunnable(int id, RollingFileAppender<Object> rfa,
            boolean withInducedDelay) {
          this.id = id;
          this.rfa = rfa;
          this.withInducedDelay = withInducedDelay;
        }
    
        public void run() {
          while (!isDone()) {
            counter++;
            rfa.doAppend(id + " " + counter);
            if ((counter % 64 == 0) && withInducedDelay) {
              try {
                Thread.sleep(10);
              } catch (InterruptedException e) {
              }
            }
          }
        }
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000163�00000000000�011565� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/rolling/TimeBasedRollingWithArchiveRemoval_Test.java��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/rolling/TimeBasedRollingWithArchiveRem0000644�0001750�0001750�00000037722�12136042273�033313� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     * or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.ContextBase;
    import ch.qos.logback.core.encoder.EchoEncoder;
    import ch.qos.logback.core.rolling.helper.RollingCalendar;
    import ch.qos.logback.core.testUtil.RandomUtil;
    import ch.qos.logback.core.util.CoreTestConstants;
    import ch.qos.logback.core.util.StatusPrinter;
    import org.junit.Before;
    import org.junit.Test;
    
    import java.io.File;
    import java.io.FileFilter;
    import java.util.*;
    import java.util.concurrent.TimeUnit;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    import static ch.qos.logback.core.CoreConstants.DAILY_DATE_PATTERN;
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertTrue;
    
    public class TimeBasedRollingWithArchiveRemoval_Test extends ScaffoldingForRollingTests {
      String MONTHLY_DATE_PATTERN = "yyyy-MM";
      String MONTHLY_CRONOLOG_DATE_PATTERN = "yyyy/MM";
      final String DAILY_CRONOLOG_DATE_PATTERN = "yyyy/MM/dd";
    
    
      RollingFileAppender<Object> rfa = new RollingFileAppender<Object>();
      TimeBasedRollingPolicy<Object> tbrp = new TimeBasedRollingPolicy<Object>();
    
      // by default tbfnatp is an instance of DefaultTimeBasedFileNamingAndTriggeringPolicy
      TimeBasedFileNamingAndTriggeringPolicy<Object> tbfnatp = new DefaultTimeBasedFileNamingAndTriggeringPolicy<Object>();
    
      long MILLIS_IN_MINUTE = 60 * 1000;
      long MILLIS_IN_HOUR = 60 * MILLIS_IN_MINUTE;
      long MILLIS_IN_DAY = 24 * MILLIS_IN_HOUR;
      long MILLIS_IN_MONTH = (long) ((365.242199 / 12) * MILLIS_IN_DAY);
      int MONTHS_IN_YEAR = 12;
    
      int slashCount = 0;
    
      @Before
      public void setUp() {
        super.setUp();
      }
    
    
      private int computeSlashCount(String datePattern) {
        if (datePattern == null)
          return 0;
        else {
          int count = 0;
          for (int i = 0; i < datePattern.length(); i++) {
            char c = datePattern.charAt(i);
            if (c == '/')
              count++;
          }
          return count;
        }
      }
    
    
      // test that the number of files at the end of the test is same as the expected number taking into account end dates
      // near the beginning of a new year. This test has been run in a loop with start date varying over a two years
      // with success.
      @Test
      public void monthlyRolloverOverManyPeriods() {
    
        slashCount = computeSlashCount(MONTHLY_CRONOLOG_DATE_PATTERN);
        int numPeriods = 40;
        int maxHistory = 2;
        String fileNamePattern = randomOutputDir + "/%d{" + MONTHLY_CRONOLOG_DATE_PATTERN + "}/clean.txt.zip";
    
        long startTime = currentTime;
        long endTime = logOverMultiplePeriodsContinuously(currentTime, fileNamePattern, MILLIS_IN_MONTH, maxHistory,
                numPeriods);
        System.out.println("randomOutputDir:" + randomOutputDir);
        System.out.println("start:" + startTime + ", end=" + endTime);
        int differenceInMonths = RollingCalendar.diffInMonths(startTime, endTime);
        System.out.println("differenceInMonths:" + differenceInMonths);
        Calendar startTimeAsCalendar = Calendar.getInstance();
        startTimeAsCalendar.setTimeInMillis(startTime);
        int indexOfStartPeriod = startTimeAsCalendar.get(Calendar.MONTH);
        boolean withExtraFolder = extraFolder(differenceInMonths, MONTHS_IN_YEAR, indexOfStartPeriod, maxHistory);
    
        check(expectedCountWithFolders(maxHistory, withExtraFolder));
      }
    
      void generateDailyRollover(long now, int maxHistory, int simulatedNumberOfPeriods, int startInactivity,
                                 int numInactivityPeriods) {
        slashCount = computeSlashCount(DAILY_DATE_PATTERN);
        logOverMultiplePeriods(now, randomOutputDir + "clean-%d{" + DAILY_DATE_PATTERN + "}.txt", MILLIS_IN_DAY, maxHistory, simulatedNumberOfPeriods, startInactivity, numInactivityPeriods);
        check(expectedCountWithoutFoldersWithInactivity(maxHistory, simulatedNumberOfPeriods, startInactivity + numInactivityPeriods));
      }
    
      @Test
      public void basicDailyRollover() {
        int maxHistory = 20;
        int simulatedNumberOfPeriods = 20 * 3;
        int startInactivity = 0;
        int numInactivityPeriods = 0;
        generateDailyRollover(currentTime, maxHistory, simulatedNumberOfPeriods, startInactivity, numInactivityPeriods);
      }
    
      // Since the duration of a month (in seconds) varies from month to month, tests with inactivity period must
      // be conducted with daily rollover  not monthly
      @Test
      public void dailyRollover15() {
        int maxHistory = 5;
        int simulatedNumberOfPeriods = 15;
        int startInactivity = 6;
        int numInactivityPeriods = 3;
        generateDailyRollover(currentTime, maxHistory, simulatedNumberOfPeriods, startInactivity, numInactivityPeriods);
      }
    
      @Test
      public void dailyRolloverWithInactivity70() {
        int maxHistory = 6;
        int simulatedNumberOfPeriods = 70;
        int startInactivity = 30;
        int numInactivityPeriods = 1;
        generateDailyRollover(currentTime, maxHistory, simulatedNumberOfPeriods, startInactivity, numInactivityPeriods);
      }
    
      @Test
      public void dailyRolloverWithInactivity10() {
        int maxHistory = 6;
        int simulatedNumberOfPeriods = 10;
        int startInactivity = 3;
        int numInactivityPeriods = 4;
        generateDailyRollover(currentTime, maxHistory, simulatedNumberOfPeriods, startInactivity, numInactivityPeriods);
      }
    
      @Test
      public void dailyRolloverWithSecondPhase() {
        slashCount = computeSlashCount(DAILY_DATE_PATTERN);
        int maxHistory = 5;
        long endTime = logOverMultiplePeriodsContinuously(currentTime, randomOutputDir + "clean-%d{" + DAILY_DATE_PATTERN + "}.txt",
                MILLIS_IN_DAY, maxHistory, maxHistory * 2);
        logOverMultiplePeriodsContinuously(endTime + MILLIS_IN_DAY * 10, randomOutputDir + "clean-%d{" + DAILY_DATE_PATTERN + "}.txt",
                MILLIS_IN_DAY, maxHistory, maxHistory);
        check(expectedCountWithoutFolders(maxHistory));
      }
    
      @Test
      public void dailyCronologRollover() {
        slashCount = computeSlashCount(DAILY_CRONOLOG_DATE_PATTERN);
        logOverMultiplePeriodsContinuously(currentTime, randomOutputDir + "/%d{" + DAILY_CRONOLOG_DATE_PATTERN + "}/clean.txt.zip",
                MILLIS_IN_DAY, 8, 8 * 3);
        int expectedDirMin = 9 + slashCount;
        int expectDirMax = expectedDirMin + 1 + 1;
        expectedFileAndDirCount(9, expectedDirMin, expectDirMax);
      }
    
      @Test
      public void dailySizeBasedRollover() {
        SizeAndTimeBasedFNATP<Object> sizeAndTimeBasedFNATP = new SizeAndTimeBasedFNATP<Object>();
        sizeAndTimeBasedFNATP.setMaxFileSize("10000");
        tbfnatp = sizeAndTimeBasedFNATP;
        slashCount = computeSlashCount(DAILY_DATE_PATTERN);
        logOverMultiplePeriodsContinuously(currentTime, randomOutputDir + "/%d{" + DAILY_DATE_PATTERN + "}-clean.%i.zip", MILLIS_IN_DAY,
                5, 5 * 4);
        checkPatternCompliance(5 + 1 + slashCount, "\\d{4}-\\d{2}-\\d{2}-clean(\\.\\d)(.zip)?");
      }
    
      @Test
      public void dailyChronologSizeBasedRollover() {
        SizeAndTimeBasedFNATP<Object> sizeAndTimeBasedFNATP = new SizeAndTimeBasedFNATP<Object>();
        sizeAndTimeBasedFNATP.setMaxFileSize("10000");
        tbfnatp = sizeAndTimeBasedFNATP;
        slashCount = 1;
        logOverMultiplePeriodsContinuously(currentTime, randomOutputDir + "/%d{" + DAILY_DATE_PATTERN + "}/clean.%i.zip", MILLIS_IN_DAY,
                5, 5 * 4);
        checkDirPatternCompliance(6);
      }
    
      @Test
      public void dailyChronologSizeBasedRolloverWithSecondPhase() {
        SizeAndTimeBasedFNATP<Object> sizeAndTimeBasedFNATP = new SizeAndTimeBasedFNATP<Object>();
        sizeAndTimeBasedFNATP.setMaxFileSize("10000");
        tbfnatp = sizeAndTimeBasedFNATP;
        slashCount = 1;
        int maxHistory = 5;
        int simulatedNumberOfPeriods = maxHistory * 4;
        long endTime = logOverMultiplePeriodsContinuously(currentTime, randomOutputDir + "/%d{" + DAILY_DATE_PATTERN + "}/clean.%i", MILLIS_IN_DAY,
                maxHistory, 3);
        logOverMultiplePeriodsContinuously(endTime + MILLIS_IN_DAY * 7, randomOutputDir + "/%d{" + DAILY_DATE_PATTERN + "}/clean.%i",
                MILLIS_IN_DAY, maxHistory, simulatedNumberOfPeriods);
        checkDirPatternCompliance(maxHistory + 1);
      }
    
    
      void logOncePeriod(long currentTime, String fileNamePattern, int maxHistory) {
        buildRollingFileAppender(currentTime, fileNamePattern, maxHistory, DO_CLEAN_HISTORY_ON_START);
        rfa.doAppend("Hello ----------------------------------------------------------" + new Date(currentTime));
        rfa.stop();
      }
    
      @Test
      public void cleanHistoryOnStart() {
        long now = this.currentTime;
        String fileNamePattern = randomOutputDir + "clean-%d{" + DAILY_DATE_PATTERN + "}.txt";
        int maxHistory = 3;
        for (int i = 0; i <= 5; i++) {
          logOncePeriod(now, fileNamePattern, maxHistory);
          now = now + MILLIS_IN_DAY;
        }
        StatusPrinter.print(context);
        check(expectedCountWithoutFolders(maxHistory));
      }
    
    
      int expectedCountWithoutFolders(int maxHistory) {
        return maxHistory + 1;
      }
    
    
      int expectedCountWithFolders(int maxHistory, boolean withExtraFolder) {
        int numLogFiles = (maxHistory + 1);
        int numLogFilesAndFolders = numLogFiles * 2;
        int result = numLogFilesAndFolders + slashCount;
        if (withExtraFolder) result += 1;
        return result;
      }
    
    
      void buildRollingFileAppender(long currentTime, String fileNamePattern, int maxHistory,
                                    boolean cleanHistoryOnStart) {
        rfa.setContext(context);
        rfa.setEncoder(encoder);
        tbrp.setContext(context);
        tbrp.setFileNamePattern(fileNamePattern);
        tbrp.setMaxHistory(maxHistory);
        tbrp.setParent(rfa);
        tbrp.setCleanHistoryOnStart(cleanHistoryOnStart);
        tbrp.timeBasedFileNamingAndTriggeringPolicy = tbfnatp;
        tbrp.timeBasedFileNamingAndTriggeringPolicy.setCurrentTime(currentTime);
        tbrp.start();
        rfa.setRollingPolicy(tbrp);
        rfa.start();
      }
    
      boolean DO_CLEAN_HISTORY_ON_START = true;
      boolean DO_NOT_CLEAN_HISTORY_ON_START = false;
    
    
      long logOverMultiplePeriodsContinuously(long simulatedTime, String fileNamePattern, long periodDurationInMillis, int maxHistory,
                                              int simulatedNumberOfPeriods) {
        return logOverMultiplePeriods(simulatedTime, fileNamePattern, periodDurationInMillis, maxHistory,
                simulatedNumberOfPeriods, 0, 0);
      }
    
      long logOverMultiplePeriods(long simulatedTime, String fileNamePattern, long periodDurationInMillis, int maxHistory,
                                  int simulatedNumberOfPeriods, int startInactivity,
                                  int numInactivityPeriods) {
        buildRollingFileAppender(simulatedTime, fileNamePattern, maxHistory, DO_NOT_CLEAN_HISTORY_ON_START);
        int ticksPerPeriod = 512;
        int runLength = simulatedNumberOfPeriods * ticksPerPeriod;
        int startInactivityIndex = 1 + startInactivity * ticksPerPeriod;
        int endInactivityIndex = startInactivityIndex + numInactivityPeriods * ticksPerPeriod;
        long tickDuration = periodDurationInMillis / ticksPerPeriod;
    
        for (int i = 0; i <= runLength; i++) {
          if (i < startInactivityIndex || i > endInactivityIndex) {
            rfa.doAppend("Hello ----------------------------------------------------------" + i);
          }
          tbrp.timeBasedFileNamingAndTriggeringPolicy.setCurrentTime(addTime(tbrp.timeBasedFileNamingAndTriggeringPolicy.getCurrentTime(),
                  tickDuration));
          add(tbrp.future);
          waitForJobsToComplete();
        }
        rfa.stop();
        return tbrp.timeBasedFileNamingAndTriggeringPolicy.getCurrentTime();
      }
    
      boolean extraFolder(int numPeriods, int periodsPerEra, int beginPeriod, int maxHistory) {
        int valueOfLastMonth = ((beginPeriod) + numPeriods) % periodsPerEra;
        return (valueOfLastMonth < maxHistory);
      }
    
      long addTime(long time, long timeToWait) {
        return time + timeToWait;
      }
    
    
      void expectedFileAndDirCount(int expectedFileAndDirCount, int expectedDirCountMin, int expectedDirCountMax) {
        File dir = new File(randomOutputDir);
        List<File> fileList = new ArrayList<File>();
        findFilesInFolderRecursivelyByPatterMatch(dir, fileList, "clean");
        List<File> dirList = new ArrayList<File>();
        findAllFoldersInFolderRecursively(dir, dirList);
        String msg = "expectedDirCountMin=" + expectedDirCountMin + ", expectedDirCountMax=" + expectedDirCountMax + " actual value=" + dirList.size();
        assertTrue(msg, expectedDirCountMin <= dirList.size() && dirList.size() <= expectedDirCountMax);
      }
    
    
      void check(int expectedCount) {
        File dir = new File(randomOutputDir);
        List<File> fileList = new ArrayList<File>();
        findAllDirsOrStringContainsFilesRecursively(dir, fileList, "clean");
        assertEquals(expectedCount, fileList.size());
      }
    
      int expectedCountWithoutFoldersWithInactivity(int maxHistory, int totalPeriods, int endOfInactivity) {
        int availableHistory = (totalPeriods + 1) - endOfInactivity;
        int actualHistory = Math.min(availableHistory, maxHistory + 1);
        return actualHistory;
      }
    
      void genericFindMatching(final FileMatchFunction matchFunc, File dir, List<File> fileList, final String pattern, boolean includeDirs) {
        if (dir.isDirectory()) {
          File[] matchArray = dir.listFiles(new FileFilter() {
            public boolean accept(File f) {
              return f.isDirectory() || matchFunc.match(f, pattern);
            }
          });
          for (File f : matchArray) {
            if (f.isDirectory()) {
              if (includeDirs) fileList.add(f);
              genericFindMatching(matchFunc, f, fileList, pattern, includeDirs);
            } else
              fileList.add(f);
          }
        }
      }
    
      private void findAllFoldersInFolderRecursively(File dir, List<File> fileList) {
        FileMatchFunction alwaysFalse = new FileMatchFunction() {
          public boolean match(File f, String pattern) {
            return false;
          }
        };
        genericFindMatching(alwaysFalse, dir, fileList, null, true);
      }
    
      private void findAllDirsOrStringContainsFilesRecursively(File dir, List<File> fileList, String pattern) {
        FileMatchFunction matchFunction = new FileMatchFunction() {
          public boolean match(File f, String pattern) {
            return f.getName().contains(pattern);
          }
        };
        genericFindMatching(matchFunction, dir, fileList, pattern, true);
      }
    
      void findFilesInFolderRecursivelyByPatterMatch(File dir, List<File> fileList, String pattern) {
        FileMatchFunction matchByPattern = new FileMatchFunction() {
          public boolean match(File f, String pattern) {
            return f.getName().matches(pattern);
          }
        };
        genericFindMatching(matchByPattern, dir, fileList, pattern, false);
      }
    
      Set<String> groupByClass(List<File> fileList, String regex) {
        Pattern p = Pattern.compile(regex);
        Set<String> set = new HashSet<String>();
        for (File f : fileList) {
          String n = f.getName();
          Matcher m = p.matcher(n);
          m.matches();
          int begin = m.start(1);
          String reduced = n.substring(0, begin);
          set.add(reduced);
        }
        return set;
      }
    
    
      void checkPatternCompliance(int expectedClassCount, String regex) {
        File dir = new File(randomOutputDir);
        List<File> fileList = new ArrayList<File>();
        findFilesInFolderRecursivelyByPatterMatch(dir, fileList, regex);
        Set<String> set = groupByClass(fileList, regex);
        assertEquals(expectedClassCount, set.size());
      }
    
      void checkDirPatternCompliance(int expectedClassCount) {
        File dir = new File(randomOutputDir);
        List<File> fileList = new ArrayList<File>();
        findAllFoldersInFolderRecursively(dir, fileList);
        for (File f : fileList) {
          assertTrue(f.list().length >= 1);
        }
        assertEquals(expectedClassCount, fileList.size());
      }
    }
    ����������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/rolling/FileMatchFunction.java��������0000644�0001750�0001750�00000001431�12136042273�031573� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling;
    
    import java.io.File;
    
    /**
     * Created with IntelliJ IDEA.
     * User: ceki
     * Date: 4/3/13
     * Time: 7:42 PM
     * To change this template use File | Settings | File Templates.
     */
    public interface FileMatchFunction {
    
      boolean match(File f, String pattern);
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/rolling/SizeBasedRollingTest.java�����0000644�0001750�0001750�00000010036�12136042147�032272� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling;
    
    import ch.qos.logback.core.encoder.EchoEncoder;
    import ch.qos.logback.core.util.CoreTestConstants;
    import org.junit.Before;
    import org.junit.Test;
    
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    
    public class SizeBasedRollingTest extends ScaffoldingForRollingTests {
    
      RollingFileAppender<Object> rfa = new RollingFileAppender<Object>();
      FixedWindowRollingPolicy fwrp = new FixedWindowRollingPolicy();
      SizeBasedTriggeringPolicy<Object> sizeBasedTriggeringPolicy = new SizeBasedTriggeringPolicy<Object>();
      EchoEncoder<Object> encoder = new EchoEncoder<Object>();
    
    
      @Before
      public void setUp() {
        super.setUp();
        fwrp.setContext(context);
        fwrp.setParent(rfa);
        rfa.setContext(context);
        sizeBasedTriggeringPolicy.setContext(context);
      }
    
      private void initRFA(String filename) {
        rfa.setEncoder(encoder);
        if (filename != null) {
          rfa.setFile(filename);
        }
      }
    
      /**
       * Test whether FixedWindowRollingPolicy throws an exception when the
       * ActiveFileName is not set.
       */
      @Test(expected = IllegalStateException.class)
      public void activeFileNameNotSet() {
        sizeBasedTriggeringPolicy.setMaxFileSize("100");
        sizeBasedTriggeringPolicy.start();
    
        fwrp.setFileNamePattern(CoreTestConstants.OUTPUT_DIR_PREFIX + "sizeBased-test1.%i");
        fwrp.start();
        // The absence of activeFileName option should cause an exception.
      }
    
    
      void generic(String testName, String fileName, String filenamePattern, List<String> expectedFilenameList) throws InterruptedException, IOException {
        rfa.setName("ROLLING");
        initRFA(randomOutputDir + fileName);
    
        sizeBasedTriggeringPolicy.setMaxFileSize("100");
        fwrp.setMinIndex(0);
        fwrp.setFileNamePattern(randomOutputDir + filenamePattern);
    
        rfa.triggeringPolicy = sizeBasedTriggeringPolicy;
        rfa.rollingPolicy = fwrp;
    
        fwrp.start();
        sizeBasedTriggeringPolicy.start();
        rfa.start();
    
        int runLength = 40;
        String prefix = "hello";
        for (int i = 0; i < runLength; i++){
          Thread.sleep(10);
          rfa.doAppend(prefix + i);
        }
        rfa.stop();
    
        existenceCheck(expectedFilenameList);
        reverseSortedContentCheck(randomOutputDir, runLength, prefix);
      }
    
      @Test
      public void smoke() throws IOException, InterruptedException {
        expectedFilenameList.add(randomOutputDir + "a-sizeBased-smoke.log");
        expectedFilenameList.add(randomOutputDir + "sizeBased-smoke.0");
        expectedFilenameList.add(randomOutputDir + "sizeBased-smoke.1");
        generic("zipped", "a-sizeBased-smoke.log", "sizeBased-smoke.%i", expectedFilenameList);
    
      }
      @Test
      public void gz() throws IOException, InterruptedException {
        expectedFilenameList.add(randomOutputDir + "a-sbr-gzed.log");
        expectedFilenameList.add(randomOutputDir + "sbr-gzed.0.gz");
        expectedFilenameList.add(randomOutputDir + "sbr-gzed.1.gz");
        generic("gzed", "a-sbr-gzed.log", "sbr-gzed.%i.gz", expectedFilenameList);
      }
    
      // see also LBCORE-199
      @Test
      public void zipped() throws IOException, InterruptedException  {
        expectedFilenameList.add(randomOutputDir + "a-sbr-zipped.log");
        expectedFilenameList.add(randomOutputDir + "sbr-zipped.0.zip");
        expectedFilenameList.add(randomOutputDir + "sbr-zipped.1.zip");
        generic("zipped", "a-sbr-zipped.log", "sbr-zipped.%i.zip", expectedFilenameList);
    
        List<String> zipFiles = filterElementsInListBySuffix(".zip");
        zipEntryNameCheck(zipFiles, "sbr-zipped.20\\d{2}-\\d{2}-\\d{2}_\\d{4}");
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/rolling/helper/�����������������������0000755�0001750�0001750�00000000000�12203357067�026653� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/rolling/helper/FileStoreUtilTest.java�0000644�0001750�0001750�00000003623�12136042273�033107� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling.helper;
    
    import ch.qos.logback.core.rolling.RolloverFailure;
    import ch.qos.logback.core.testUtil.RandomUtil;
    import ch.qos.logback.core.util.CoreTestConstants;
    import ch.qos.logback.core.util.EnvUtil;
    import ch.qos.logback.core.util.FileUtil;
    import org.junit.Ignore;
    import org.junit.Test;
    
    import java.io.File;
    import java.io.IOException;
    
    import static org.junit.Assert.assertFalse;
    import static org.junit.Assert.assertTrue;
    
    public class FileStoreUtilTest {
    
    
      int diff = RandomUtil.getPositiveInt();
      String pathPrefix = CoreTestConstants.OUTPUT_DIR_PREFIX+"fs"+diff+"/";
    
      @Test
      public void filesOnSameFolderShouldBeOnTheSameFileStore() throws RolloverFailure, IOException {
        if(!EnvUtil.isJDK7OrHigher())
          return;
    
        File parent = new File(pathPrefix);
        File file = new File(pathPrefix+"filesOnSameFolderShouldBeOnTheSameFileStore");
        FileUtil.createMissingParentDirectories(file);
        file.createNewFile();
        assertTrue(FileStoreUtil.areOnSameFileStore(parent, file));
      }
    
    
      // test should be run manually
      @Ignore
      @Test
      public void manual_filesOnDifferentVolumesShouldBeDetectedAsSuch() throws RolloverFailure {
        if(!EnvUtil.isJDK7OrHigher())
          return;
    
        // author's computer has two volumes
        File c = new File("c:/tmp/");
        File d = new File("d:/");
        assertFalse(FileStoreUtil.areOnSameFileStore(c, d));
      }
    }
    �������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/rolling/helper/PackageTest.java�������0000644�0001750�0001750�00000001607�12136042273�031710� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling.helper;
    
    import ch.qos.logback.core.util.DatePatternToRegexTest;
    import junit.framework.TestCase;
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    
    @RunWith(Suite.class)
    @Suite.SuiteClasses( { CompressTest.class, FileNamePatternTest.class,
        RollingCalendarTest.class, DatePatternToRegexTest.class })
    public class PackageTest extends TestCase {
    
    }
    �������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/rolling/helper/CompressTest.java������0000644�0001750�0001750�00000011023�12136042273�032141� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling.helper;
    
    import static org.junit.Assert.assertTrue;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    
    import org.junit.Before;
    import org.junit.Test;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.ContextBase;
    import ch.qos.logback.core.status.StatusChecker;
    import ch.qos.logback.core.util.Compare;
    import ch.qos.logback.core.util.CoreTestConstants;
    
    /**
     * @author Ceki Gulcu
     */
    public class CompressTest {
    
      Context context = new ContextBase();
    
      @Before
      public void setUp() throws IOException {
        // Copy source files
        // Delete output files
        {
          File source = new File(CoreTestConstants.TEST_SRC_PREFIX
              + "input/compress1.copy");
          File dest = new File(CoreTestConstants.TEST_SRC_PREFIX
              + "input/compress1.txt");
    
          copy(source, dest);
          File target = new File(CoreTestConstants.OUTPUT_DIR_PREFIX
              + "compress1.txt.gz");
          target.mkdirs();
          target.delete();
        }
        {
          File source = new File(CoreTestConstants.TEST_SRC_PREFIX
              + "input/compress2.copy");
          File dest = new File(CoreTestConstants.TEST_SRC_PREFIX
              + "input/compress2.txt");
          copy(source, dest);
          File target = new File(CoreTestConstants.OUTPUT_DIR_PREFIX
              + "compress2.txt.gz");
          target.mkdirs();
          target.delete();
        }
        {
          File source = new File(CoreTestConstants.TEST_SRC_PREFIX
              + "input/compress3.copy");
          File dest = new File(CoreTestConstants.TEST_SRC_PREFIX
              + "input/compress3.txt");
          copy(source, dest);
          File target = new File(CoreTestConstants.OUTPUT_DIR_PREFIX
              + "compress3.txt.zip");
          target.mkdirs();
          target.delete();
        }
      }
    
      @Test
      public void test1() throws Exception {
        Compressor compressor = new Compressor(CompressionMode.GZ);
        compressor.setContext(context);
        compressor.compress(CoreTestConstants.TEST_SRC_PREFIX
            + "input/compress1.txt", CoreTestConstants.OUTPUT_DIR_PREFIX
            + "compress1.txt.gz", null);
    
        StatusChecker checker = new StatusChecker(context);
        assertTrue(checker.isErrorFree(0));
        assertTrue(Compare.gzCompare(CoreTestConstants.OUTPUT_DIR_PREFIX
            + "compress1.txt.gz", CoreTestConstants.TEST_SRC_PREFIX
            + "witness/compress1.txt.gz"));
      }
    
      @Test
      public void test2() throws Exception {
        Compressor compressor = new Compressor(CompressionMode.GZ);
        compressor.setContext(context);
        compressor.compress(CoreTestConstants.TEST_SRC_PREFIX
            + "input/compress2.txt", CoreTestConstants.OUTPUT_DIR_PREFIX
            + "compress2.txt", null);
    
        StatusChecker checker = new StatusChecker(context);
        assertTrue(checker.isErrorFree(0));
    
        assertTrue(Compare.gzCompare(CoreTestConstants.OUTPUT_DIR_PREFIX
            + "compress2.txt.gz", CoreTestConstants.TEST_SRC_PREFIX
            + "witness/compress2.txt.gz"));
      }
    
      @Test
      public void test3() throws Exception {
        Compressor compressor = new Compressor(CompressionMode.ZIP);
        compressor.setContext(context);
        compressor.compress(CoreTestConstants.TEST_SRC_PREFIX
            + "input/compress3.txt", CoreTestConstants.OUTPUT_DIR_PREFIX
            + "compress3.txt", "compress3.txt");
        StatusChecker checker = new StatusChecker(context);
        assertTrue(checker.isErrorFree(0));
    
        // we don't know how to compare .zip files
        // assertTrue(Compare.compare(CoreTestConstants.OUTPUT_DIR_PREFIX
        // + "compress3.txt.zip", CoreTestConstants.TEST_SRC_PREFIX
        // + "witness/compress3.txt.zip"));
      }
    
      private void copy(File src, File dst) throws IOException {
        InputStream in = new FileInputStream(src);
        OutputStream out = new FileOutputStream(dst);
        byte[] buf = new byte[1024];
        int len;
        while ((len = in.read(buf)) > 0) {
          out.write(buf, 0, len);
        }
        in.close();
        out.close();
      }
    
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000146�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/rolling/helper/RollingCalendarTest.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/rolling/helper/RollingCalendarTest.jav0000644�0001750�0001750�00000005545�12136042273�033261� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling.helper;
    
    import java.util.Date;
    
    import junit.framework.TestCase;
    
    public class RollingCalendarTest extends TestCase {
    
      public RollingCalendarTest(String arg0) {
        super(arg0);
      }
    
      protected void setUp() throws Exception {
        super.setUp();
      }
    
      protected void tearDown() throws Exception {
        super.tearDown();
      }
    
      public void testPeriodicity() {
        {
          RollingCalendar rc = new RollingCalendar();
          assertEquals(PeriodicityType.TOP_OF_SECOND, rc
              .computePeriodicityType("yyyy-MM-dd_HH_mm_ss"));
        }
    
        {
          RollingCalendar rc = new RollingCalendar();
          assertEquals(PeriodicityType.TOP_OF_MINUTE, rc
              .computePeriodicityType("yyyy-MM-dd_HH_mm"));
        }
    
        {
          RollingCalendar rc = new RollingCalendar();
          assertEquals(PeriodicityType.TOP_OF_HOUR, rc
              .computePeriodicityType("yyyy-MM-dd_HH"));
        }
    
        {
          RollingCalendar rc = new RollingCalendar();
          assertEquals(PeriodicityType.TOP_OF_DAY, rc
              .computePeriodicityType("yyyy-MM-dd"));
        }
    
        {
          RollingCalendar rc = new RollingCalendar();
          assertEquals(PeriodicityType.TOP_OF_MONTH, rc
              .computePeriodicityType("yyyy-MM"));
        }
      }
    
      public void testVaryingNumberOfHourlyPeriods() {
        RollingCalendar rc = new RollingCalendar();
        rc.init("yyyy-MM-dd_HH");
        long MILLIS_IN_HOUR = 3600*1000;
    
        for (int p = 100; p > -100; p--) {
          long now = 1223325293589L;  // Mon Oct 06 22:34:53 CEST 2008
          Date result = rc.getRelativeDate(new Date(now), p);
          long expected = now - (now % (MILLIS_IN_HOUR)) + p * MILLIS_IN_HOUR;
          assertEquals(expected, result.getTime());
        }
      }
    
      public void testVaryingNumberOfDailyPeriods() {
        RollingCalendar rc = new RollingCalendar();
        rc.init("yyyy-MM-dd");
        final long MILLIS_IN_DAY = 24*3600*1000;
        
        for (int p = 20; p > -100; p--) {
          long now = 1223325293589L;  // Mon Oct 06 22:34:53 CEST 2008
          Date nowDate = new Date(now);
          Date result = rc.getRelativeDate(nowDate, p);
          long offset = rc.getTimeZone().getRawOffset()+rc.getTimeZone().getDSTSavings();
        
          long origin = now - (now % (MILLIS_IN_DAY)) - offset;      
          long expected = origin + p * MILLIS_IN_DAY;
          assertEquals("p="+p, expected, result.getTime());
        }
      }
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000146�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/rolling/helper/FileNamePatternTest.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/rolling/helper/FileNamePatternTest.jav0000644�0001750�0001750�00000010723�12136042273�033231� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling.helper;
    
    import static org.junit.Assert.assertEquals;
    
    import java.util.Calendar;
    
    import org.junit.Test;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.ContextBase;
    
    /**
     * @author Ceki
     * 
     */
    public class FileNamePatternTest {
    
      Context context = new ContextBase();
    
      @Test
      public void testSmoke() {
        FileNamePattern pp = new FileNamePattern("t", context);
        assertEquals("t", pp.convertInt(3));
    
        pp = new FileNamePattern("foo", context);
        assertEquals("foo", pp.convertInt(3));
    
        pp = new FileNamePattern("%i foo", context);
    
        assertEquals("3 foo", pp.convertInt(3));
    
        pp = new FileNamePattern("foo%i.xixo", context);
        assertEquals("foo3.xixo", pp.convertInt(3));
    
        pp = new FileNamePattern("foo%i.log", context);
        assertEquals("foo3.log", pp.convertInt(3));
    
        pp = new FileNamePattern("foo.%i.log", context);
        assertEquals("foo.3.log", pp.convertInt(3));
    
        //pp = new FileNamePattern("%i.foo\\%", context);
        //assertEquals("3.foo%", pp.convertInt(3));
    
        //pp = new FileNamePattern("\\%foo", context);
        //assertEquals("%foo", pp.convertInt(3));
      }
    
      @Test
      // test ways for dealing with flowing i converter, as in "foo%ix"
      public void flowingI() {
        {
          FileNamePattern pp = new FileNamePattern("foo%i{}bar%i", context);
          assertEquals("foo3bar3", pp.convertInt(3));
        }
        {
          FileNamePattern pp = new FileNamePattern("foo%i{}bar%i", context);
          assertEquals("foo3bar3", pp.convertInt(3));
        }
      }
    
      @Test
      public void date() {
        Calendar cal = Calendar.getInstance();
        cal.set(2003, 4, 20, 17, 55);
    
        FileNamePattern pp = new FileNamePattern("foo%d{yyyy.MM.dd}", context);
    
        assertEquals("foo2003.05.20", pp.convert(cal.getTime()));
    
        pp = new FileNamePattern("foo%d{yyyy.MM.dd HH:mm}", context);
        assertEquals("foo2003.05.20 17:55", pp.convert(cal.getTime()));
    
        pp = new FileNamePattern("%d{yyyy.MM.dd HH:mm} foo", context);
        assertEquals("2003.05.20 17:55 foo", pp.convert(cal.getTime()));
    
      } 
    
      @Test
      public void withBackslash() {
        FileNamePattern pp = new FileNamePattern("c:\\foo\\bar.%i", context);
        assertEquals("c:/foo/bar.3", pp.convertInt(3));
      }
    
      @Test
      public void objectListConverter() {
        Calendar cal = Calendar.getInstance();
        cal.set(2003, 4, 20, 17, 55);
        FileNamePattern fnp = new FileNamePattern("foo-%d{yyyy.MM.dd}-%i.txt",
            context);
        assertEquals("foo-2003.05.20-79.txt", fnp.convertMultipleArguments(cal
            .getTime(), 79));
      }
    
      @Test
      public void asRegexByDate() {
    
        Calendar cal = Calendar.getInstance();
        cal.set(2003, 4, 20, 17, 55);
    
        {
          FileNamePattern fnp = new FileNamePattern("foo-%d{yyyy.MM.dd}-%i.txt",
              context);
          String regex = fnp.toRegexForFixedDate(cal.getTime());
          assertEquals("foo-2003.05.20-(\\d{1,3}).txt", regex);
        }
        {
          FileNamePattern fnp = new FileNamePattern("\\toto\\foo-%d{yyyy\\MM\\dd}-%i.txt",
              context);
          String regex = fnp.toRegexForFixedDate(cal.getTime());
          assertEquals("/toto/foo-2003/05/20-(\\d{1,3}).txt", regex);
        }
      }
    
      @Test
      public void asRegex() {
        {
          FileNamePattern fnp = new FileNamePattern("foo-%d{yyyy.MM.dd}-%i.txt",
              context);
          String regex = fnp.toRegex();
          assertEquals("foo-\\d{4}\\.\\d{2}\\.\\d{2}-\\d{1,2}.txt", regex);
        }
        {
          FileNamePattern fnp = new FileNamePattern("foo-%d{yyyy.MM.dd'T'}-%i.txt",
              context);
          String regex = fnp.toRegex();
          assertEquals("foo-\\d{4}\\.\\d{2}\\.\\d{2}T-\\d{1,2}.txt", regex);
        }
      }
    
      @Test
      public void convertMultipleDates() {
        Calendar cal = Calendar.getInstance();
        cal.set(2003, 4, 20, 17, 55);
        FileNamePattern fnp = new FileNamePattern("foo-%d{yyyy.MM, aux}/%d{yyyy.MM.dd}.txt", context);
        assertEquals("foo-2003.05/2003.05.20.txt", fnp.convert(cal.getTime()));
      }
    }
    ���������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/rolling/RenameUtilTest.java�����������0000644�0001750�0001750�00000006616�12136042273�031150� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.ContextBase;
    import ch.qos.logback.core.encoder.EchoEncoder;
    import ch.qos.logback.core.encoder.Encoder;
    import ch.qos.logback.core.rolling.helper.RenameUtil;
    import ch.qos.logback.core.status.StatusChecker;
    import ch.qos.logback.core.testUtil.RandomUtil;
    import ch.qos.logback.core.util.CoreTestConstants;
    import ch.qos.logback.core.util.StatusPrinter;
    import org.junit.Before;
    import org.junit.Ignore;
    import org.junit.Test;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    import static org.junit.Assert.assertTrue;
    
    public class RenameUtilTest {
    
      Encoder<Object> encoder;
      Context context = new ContextBase();
      StatusChecker statusChecker = new StatusChecker(context);
    
      long currentTime = System.currentTimeMillis();
      int diff = RandomUtil.getPositiveInt();
      protected String randomOutputDirAsStr = CoreTestConstants.OUTPUT_DIR_PREFIX + diff
              + "/";
      protected File randomOutputDir = new File(randomOutputDirAsStr);
    
      @Before
      public void setUp() throws Exception {
        encoder = new EchoEncoder<Object>();
        // if this this the fist test run after 'build clean up' then the
        // OUTPUT_DIR_PREFIX might be not yet created
        randomOutputDir.mkdirs();
      }
    
      @Test
      public void renameToNonExistingDirectory() throws IOException, RolloverFailure {
        RenameUtil renameUtil = new RenameUtil();
        renameUtil.setContext(context);
    
        int diff2 = RandomUtil.getPositiveInt();
        File fromFile = File.createTempFile("from" + diff, "test",
                randomOutputDir);
    
        String randomTARGETDir = CoreTestConstants.OUTPUT_DIR_PREFIX + diff2;
    
        renameUtil.rename(fromFile.toString(), new File(randomTARGETDir + "/to.test").toString());
        StatusPrinter.printInCaseOfErrorsOrWarnings(context);
        assertTrue(statusChecker.isErrorFree(0));
      }
    
    
      @Test
      @Ignore
      public void MANUAL_renamingOnDifferentVolumesOnLinux() throws IOException, RolloverFailure {
        RenameUtil renameUtil = new RenameUtil();
        renameUtil.setContext(context);
    
        String src = "/tmp/ramdisk/foo.txt";
        FileOutputStream fis = new FileOutputStream(src);
        fis.write(("hello" + diff).getBytes());
    
        renameUtil.rename(src, "/tmp/foo" + diff + ".txt");
        StatusPrinter.print(context);
      }
    
    
      @Test
      @Ignore
      public void MANUAL_renamingOnDifferentVolumesOnWindows() throws IOException, RolloverFailure {
        RenameUtil renameUtil = new RenameUtil();
        renameUtil.setContext(context);
    
        String src = "c:/tmp/foo.txt";
        FileOutputStream fis = new FileOutputStream(src);
        fis.write(("hello" + diff).getBytes());
        fis.close();
    
        renameUtil.rename(src, "d:/tmp/foo" + diff + ".txt");
        StatusPrinter.print(context);
        assertTrue(statusChecker.isErrorFree(0));
      }
    
      @Test
      public void renameByCopying() {
    
      }
    
    }
    ������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/rolling/FileOpener.java���������������0000644�0001750�0001750�00000002026�12136042273�030262� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.rolling;
    
    import java.io.FileInputStream;
    import java.io.InputStream;
    
    
    /**
     * Keep the file "output/test.log open for 10 seconds so that we can test
     * RollingFileAppender's ability to roll file open by another process.
     * @author Ceki G&uuml;lc&uuml;
     */
    public class FileOpener {
      public static void main(String[] args) throws Exception {
        InputStream is = new FileInputStream("output/test.log");
        is.read();
        Thread.sleep(10000);
        is.close();
        System.out.println("Exiting FileOpener");
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/recovery/�����������������������������0000755�0001750�0001750�00000000000�12203357067�025564� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/recovery/RecoveryCoordinatorTest.java�0000644�0001750�0001750�00000003325�12136042273�033267� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.recovery;
    
    import static org.junit.Assert.*;
    
    import org.junit.Test;
    
    public class RecoveryCoordinatorTest {
    
      RecoveryCoordinator rc = new RecoveryCoordinator();
      long now = System.currentTimeMillis();
    
      @Test
      public void actualTime() throws InterruptedException {
        assertTrue(rc.isTooSoon());
        Thread.sleep(RecoveryCoordinator.BACKOFF_COEFFICIENT_MIN+20);
        assertFalse(rc.isTooSoon());
      }
      
      @Test
      public void smoke() {
        // if the machine is really too busy or too slow, rc.isTooSoon can
        // return false, hence we comment out the next line
        // assertTrue(rc.isTooSoon());
        rc.setCurrentTime(now+RecoveryCoordinator.BACKOFF_COEFFICIENT_MIN+1);
        assertFalse(rc.isTooSoon());
      }
      
      @Test
      public void longTermFailure() {
        long offset = RecoveryCoordinator.BACKOFF_COEFFICIENT_MIN;
        int tooSoonCount = 0;
        for(int i = 0; i < 16; i++) {
          rc.setCurrentTime(now+offset);
         
          if(rc.isTooSoon()) {
            System.out.println("isTooSoon successful at "+(offset));
            tooSoonCount++;
          } else {
            //System.out.println("is NOT too soon at "+(offset));
        }
          offset *= 2;
        }
        assertEquals(8, tooSoonCount);
      }
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000146�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/recovery/ResilientOutputStreamTest.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/recovery/ResilientOutputStreamTest.jav0000644�0001750�0001750�00000003254�12136042273�033460� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.recovery;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.ContextBase;
    import ch.qos.logback.core.testUtil.RandomUtil;
    import ch.qos.logback.core.util.CoreTestConstants;
    import ch.qos.logback.core.util.StatusPrinter;
    import org.junit.Test;
    
    import java.io.File;
    
    import static org.mockito.Mockito.spy;
    import static org.mockito.Mockito.verify;
    
    /**
     * @author Ceki G&uuml;c&uuml;
     */
    public class ResilientOutputStreamTest {
    
      int diff = RandomUtil.getPositiveInt();
      Context context = new ContextBase();
    
    
       @Test
       public void verifyRecuperationAfterFailure() throws Exception {
         File file = new File(CoreTestConstants.OUTPUT_DIR_PREFIX+"resilient"+diff+".log");
         ResilientFileOutputStream rfos = new ResilientFileOutputStream(file, true);
         rfos.setContext(context);
    
         ResilientFileOutputStream spy = spy(rfos);
    
         spy.write("a".getBytes());
         spy.flush();
    
         spy.getChannel().close();
         spy.write("b".getBytes());
         spy.flush();
         Thread.sleep(RecoveryCoordinator.BACKOFF_COEFFICIENT_MIN+10);
         spy.write("c".getBytes());
         spy.flush();
         verify(spy).openNewOutputStream();
    
       }
    
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/recovery/PackageTest.java�������������0000644�0001750�0001750�00000001410�12136042273�030611� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.recovery;
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    import org.junit.runners.Suite.SuiteClasses;
    
    @RunWith(Suite.class)
    @SuiteClasses({RecoveryCoordinatorTest.class, ResilientOutputStreamTest.class})
    public class PackageTest  {
    }��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/AsyncAppenderBaseTest.java������������0000644�0001750�0001750�00000013542�12136042272�030757� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core;
    
    import ch.qos.logback.core.helpers.NOPAppender;
    import ch.qos.logback.core.read.ListAppender;
    import ch.qos.logback.core.testUtil.DelayingListAppender;
    import ch.qos.logback.core.status.OnConsoleStatusListener;
    import ch.qos.logback.core.status.StatusChecker;
    import ch.qos.logback.core.testUtil.NPEAppender;
    import org.junit.Before;
    import org.junit.Test;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertFalse;
    import static org.junit.Assert.assertTrue;
    
    /**
     * @author Ceki G&uuml;lc&uuml;
     * @author Torsten Juergeleit
     */
    public class AsyncAppenderBaseTest {
    
    
      Context context = new ContextBase();
      AsyncAppenderBase<Integer> asyncAppenderBase = new AsyncAppenderBase<Integer>();
      LossyAsyncAppender lossyAsyncAppender = new LossyAsyncAppender();
      DelayingListAppender<Integer> delayingListAppender = new DelayingListAppender<Integer>();
      ListAppender<Integer> listAppender = new ListAppender<Integer>();
      OnConsoleStatusListener onConsoleStatusListener = new OnConsoleStatusListener();
      StatusChecker statusChecker = new StatusChecker(context);
    
      @Before
      public void setUp() {
        onConsoleStatusListener.setContext(context);
        context.getStatusManager().add(onConsoleStatusListener);
        onConsoleStatusListener.start();
    
        asyncAppenderBase.setContext(context);
        lossyAsyncAppender.setContext(context);
    
        listAppender.setContext(context);
        listAppender.setName("list");
        listAppender.start();
    
        delayingListAppender.setContext(context);
        delayingListAppender.setName("list");
        delayingListAppender.start();
      }
    
      @Test(timeout = 2000)
      public void smoke() {
        asyncAppenderBase.addAppender(listAppender);
        asyncAppenderBase.start();
        asyncAppenderBase.doAppend(0);
        asyncAppenderBase.stop();
        verify(listAppender, 1);
      }
    
      @Test
      public void exceptionsShouldNotCauseHalting() throws InterruptedException {
        NPEAppender npeAppender = new NPEAppender<Integer>();
        npeAppender.setName("bad");
        npeAppender.setContext(context);
        npeAppender.start();
    
        asyncAppenderBase.addAppender(npeAppender);
        asyncAppenderBase.start();
        assertTrue(asyncAppenderBase.isStarted());
        for (int i = 0; i < 10; i++)
          asyncAppenderBase.append(i);
    
        asyncAppenderBase.stop();
        assertFalse(asyncAppenderBase.isStarted());
        assertEquals(AppenderBase.ALLOWED_REPEATS, statusChecker.matchCount("Appender \\[bad\\] failed to append."));
      }
    
      @Test(timeout = 2000)
      public void emptyQueueShouldBeStoppable() {
        asyncAppenderBase.addAppender(listAppender);
        asyncAppenderBase.start();
        asyncAppenderBase.stop();
        verify(listAppender, 0);
      }
    
      @Test(timeout = 2000)
      public void workerShouldStopEvenIfInterruptExceptionConsumedWithinSubappender() {
        delayingListAppender.delay = 100;
        asyncAppenderBase.addAppender(delayingListAppender);
        asyncAppenderBase.start();
        asyncAppenderBase.doAppend(0);
        asyncAppenderBase.stop();
        verify(delayingListAppender, 1);
        assertTrue(delayingListAppender.interrupted);
      }
    
      @Test(timeout = 2000)
      public void noEventLoss() {
        int bufferSize = 10;
        int loopLen = bufferSize * 2;
        asyncAppenderBase.addAppender(delayingListAppender);
        asyncAppenderBase.setQueueSize(bufferSize);
        asyncAppenderBase.start();
        for (int i = 0; i < loopLen; i++) {
          asyncAppenderBase.doAppend(i);
        }
        asyncAppenderBase.stop();
        verify(delayingListAppender, loopLen);
      }
    
      @Test(timeout = 2000)
      public void lossyAppenderShouldOnlyLooseCertainEvents() {
        int bufferSize = 5;
        int loopLen = bufferSize * 2;
        lossyAsyncAppender.addAppender(delayingListAppender);
        lossyAsyncAppender.setQueueSize(bufferSize);
        lossyAsyncAppender.setDiscardingThreshold(1);
        lossyAsyncAppender.start();
        for (int i = 0; i < loopLen; i++) {
          lossyAsyncAppender.doAppend(i);
        }
        lossyAsyncAppender.stop();
        verify(delayingListAppender, loopLen - 2);
      }
    
      @Test(timeout = 2000)
      public void lossyAppenderShouldBeNonLossyIfDiscardingThresholdIsZero() {
        int bufferSize = 5;
        int loopLen = bufferSize * 2;
        lossyAsyncAppender.addAppender(delayingListAppender);
        lossyAsyncAppender.setQueueSize(bufferSize);
        lossyAsyncAppender.setDiscardingThreshold(0);
        lossyAsyncAppender.start();
        for (int i = 0; i < loopLen; i++) {
          lossyAsyncAppender.doAppend(i);
        }
        lossyAsyncAppender.stop();
        verify(delayingListAppender, loopLen);
      }
    
      @Test
      public void invalidQueueCapacityShouldResultInNonStartedAppender() {
        asyncAppenderBase.addAppender(new NOPAppender<Integer>());
        asyncAppenderBase.setQueueSize(0);
        assertEquals(0, asyncAppenderBase.getQueueSize());
        asyncAppenderBase.start();
        assertFalse(asyncAppenderBase.isStarted());
        statusChecker.assertContainsMatch("Invalid queue size");
      }
    
      private void verify(ListAppender la, int expectedSize) {
        assertFalse(la.isStarted());
        assertEquals(expectedSize, la.list.size());
        statusChecker.assertIsErrorFree();
        statusChecker.assertContainsMatch("Worker thread will flush remaining events before exiting.");
      }
    
      static class LossyAsyncAppender extends AsyncAppenderBase<Integer> {
        @Override
        protected boolean isDiscardable(Integer i) {
          return (i % 3 == 0);
        }
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/util/���������������������������������0000755�0001750�0001750�00000000000�12203357067�024703� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/util/TeeOutputStream.java�������������0000644�0001750�0001750�00000002641�12136042273�030656� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.util;
    
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.io.PrintStream;
    
    /**
     * This stream writes its output to the target PrintStream supplied to its
     * constructor. At the same time, all the available bytes are collected and
     * returned by the toString() method.
     * 
     * @author Ceki Gulcu
     */
    public class TeeOutputStream extends OutputStream {
    
      final PrintStream targetPS;
      public final ByteArrayOutputStream baos = new ByteArrayOutputStream();
    
      public TeeOutputStream(PrintStream targetPS) {
        // allow for null arguments
        this.targetPS = targetPS;
      }
    
      public void write(int b) throws IOException {
        baos.write(b);
        if(targetPS != null) {
          targetPS.write(b);
        }
      }
    
      public String toString() {
        return baos.toString();
      }
    
      public byte[] toByteArray() {
        return baos.toByteArray();
      }
    }
    �����������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/util/StatusPrinterTest.java�����������0000644�0001750�0001750�00000007377�12136042273�031246� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.util;
    
    import static org.junit.Assert.*;
    
    import java.io.ByteArrayOutputStream;
    import java.io.PrintStream;
    
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.ContextBase;
    import ch.qos.logback.core.status.ErrorStatus;
    import ch.qos.logback.core.status.InfoStatus;
    import ch.qos.logback.core.status.Status;
    import ch.qos.logback.core.status.WarnStatus;
    
    public class StatusPrinterTest {
    
      ByteArrayOutputStream outputStream;
      PrintStream ps;
      
      @Before
      public void setUp() throws Exception {
        outputStream = new ByteArrayOutputStream();
        ps = new PrintStream(outputStream);
        StatusPrinter.setPrintStream(ps);
      }
    
      @After
      public void tearDown() throws Exception {
        StatusPrinter.setPrintStream(System.out);
        ps = null;
        outputStream = null;
      }
      
      @Test
      public void testBasic() {
        Context context = new ContextBase();
        context.getStatusManager().add(new InfoStatus("test", this));
        StatusPrinter.print(context);
        String result = outputStream.toString();
        assertTrue(result.contains("|-INFO in "+this.getClass().getName()));
      }
    
      @Test
      public void testNested() {
        Status s0 = new ErrorStatus("test0", this);
        Status s1 = new InfoStatus("test1", this);
        Status s11 = new InfoStatus("test11", this);
        Status s12 = new InfoStatus("test12", this);
        s1.add(s11);
        s1.add(s12);
        
        Status s2 = new InfoStatus("test2", this);
        Status s21 = new InfoStatus("test21", this);
        Status s211 = new WarnStatus("test211", this);
        
        Status s22 = new InfoStatus("test22", this);
        s2.add(s21);
        s2.add(s22);
        s21.add(s211);
        
        
        Context context = new ContextBase();
        context.getStatusManager().add(s0);
        context.getStatusManager().add(s1);
        context.getStatusManager().add(s2);
    
        StatusPrinter.print(context);
        String result = outputStream.toString();
        assertTrue(result.contains("+ INFO in "+this.getClass().getName()));
        assertTrue(result.contains("+ WARN in "+this.getClass().getName()));
        assertTrue(result.contains("    |-WARN in "+this.getClass().getName()));
      }
    
      @Test
      public void testWithException() {
        Status s0 = new ErrorStatus("test0", this);
        Status s1 = new InfoStatus("test1", this, new Exception("testEx"));
        Status s11 = new InfoStatus("test11", this);
        Status s12 = new InfoStatus("test12", this);
        s1.add(s11);
        s1.add(s12);
        
        Status s2 = new InfoStatus("test2", this);
        Status s21 = new InfoStatus("test21", this);
        Status s211 = new WarnStatus("test211", this);
        
        Status s22 = new InfoStatus("test22", this);
        s2.add(s21);
        s2.add(s22);
        s21.add(s211);
        
        Context context = new ContextBase();
        context.getStatusManager().add(s0);
        context.getStatusManager().add(s1);
        context.getStatusManager().add(s2);
        StatusPrinter.print(context);  
        String result = outputStream.toString();
        assertTrue(result.contains("|-ERROR in "+this.getClass().getName()));
        assertTrue(result.contains("+ INFO in "+this.getClass().getName()));
        assertTrue(result.contains("ch.qos.logback.core.util.StatusPrinterTest.testWithException"));
      }
      
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/util/LocationUtilTest.java������������0000644�0001750�0001750�00000005665�12136042273�031023� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.util;
    
    import static org.junit.Assert.assertEquals;
    
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.MalformedURLException;
    import java.net.URL;
    
    import org.junit.Test;
    
    import ch.qos.logback.core.util.LocationUtil;
    
    /**
     * Unit tests for {@link LocationUtil}.
     *
     * @author Carl Harris
     */
    public class LocationUtilTest {
    
      private static final String TEST_CLASSPATH_RESOURCE = "util/testResource.txt";
      private static final String TEST_PATTERN = "TEST RESOURCE";
      
      @Test
      public void testImplicitClasspathUrl() throws Exception {
        URL url = LocationUtil.urlForResource(TEST_CLASSPATH_RESOURCE);
        validateResource(url);
      }
      
      @Test
      public void testExplicitClasspathUrl() throws Exception {
        URL url = LocationUtil.urlForResource(
            LocationUtil.CLASSPATH_SCHEME + TEST_CLASSPATH_RESOURCE);
        validateResource(url);
      }
      
      @Test
      public void testExplicitClasspathUrlWithLeadingSlash() throws Exception {
        URL url = LocationUtil.urlForResource(
            LocationUtil.CLASSPATH_SCHEME + "/" + TEST_CLASSPATH_RESOURCE);
        validateResource(url);
      }
    
      @Test(expected = MalformedURLException.class)
      public void testExplicitClasspathUrlEmptyPath() throws Exception {
        LocationUtil.urlForResource(LocationUtil.CLASSPATH_SCHEME);
      }
    
      @Test(expected = MalformedURLException.class)
      public void testExplicitClasspathUrlWithRootPath() throws Exception {
        LocationUtil.urlForResource(LocationUtil.CLASSPATH_SCHEME + "/");
      }
    
      @Test
      public void testFileUrl() throws Exception {
        File file = File.createTempFile("testResource", ".txt");
        file.deleteOnExit();
        PrintWriter writer = new PrintWriter(file);
        writer.println(TEST_PATTERN);
        writer.close();
        URL url = file.toURI().toURL();
        validateResource(url);
      }
      
      private void validateResource(URL url) throws IOException {
        InputStream inputStream = url.openStream();
        try {
          BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
          String line = reader.readLine();
          assertEquals(TEST_PATTERN, line);
        }
        finally {
          try {
            inputStream.close();
          }
          catch (IOException ex) {
            // ignore close exception
            ex.printStackTrace(System.err);
          }
        }
      }
      
    }
    ���������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/util/FileUtilTest.java����������������0000644�0001750�0001750�00000005463�12136042273�030126� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.util;
    
    
    import static org.junit.Assert.assertFalse;
    import static org.junit.Assert.assertTrue;
    
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Random;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.ContextBase;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    public class FileUtilTest {
    
      Context context = new ContextBase();
      FileUtil fileUtil = new FileUtil(context);
      List<File> cleanupList = new ArrayList<File>();
      // test-output folder is not always clean
      int diff =  new Random().nextInt(10000);
    
      @Before
      public void setUp() throws Exception {
        
      }
    
      @After
      public void tearDown() throws Exception {
        for(File f: cleanupList) {
          f.delete();
        }
      }
    
      @Test
      public void checkParentCreationInquiryAndSubsequentCreation() {
        File file = new File(CoreTestConstants.OUTPUT_DIR_PREFIX+"/fu"+diff+"/testing.txt");
        // these will be deleted later
        cleanupList.add(file);
        cleanupList.add(file.getParentFile());
    
        assertTrue(FileUtil.isParentDirectoryCreationRequired(file));
        assertTrue(FileUtil.createMissingParentDirectories(file));
        assertFalse(FileUtil.isParentDirectoryCreationRequired(file));
      }
      
      @Test
      public void checkDeeperParentCreationInquiryAndSubsequentCreation() {
    
        File file = new File(CoreTestConstants.OUTPUT_DIR_PREFIX+"/fu"+diff+"/bla/testing.txt");
        // these will be deleted later
        cleanupList.add(file);
        cleanupList.add(file.getParentFile());
        cleanupList.add(file.getParentFile().getParentFile());
        
        assertTrue(FileUtil.isParentDirectoryCreationRequired(file));
        assertTrue(FileUtil.createMissingParentDirectories(file));
        assertFalse(FileUtil.isParentDirectoryCreationRequired(file));
      }
    
      @Test
      public void basicCopyingWorks() throws IOException {
        String dir = CoreTestConstants.OUTPUT_DIR_PREFIX+"/fu"+diff;
    
        File dirFile  = new File(dir);
        dirFile.mkdir();
    
        String src = CoreTestConstants.TEST_INPUT_PREFIX + "compress1.copy";
        String target = CoreTestConstants.OUTPUT_DIR_PREFIX+"/fu"+diff+"/copyingWorks.txt";
    
        fileUtil.copy(src, target);
        Compare.compare(src, target);
      }
    
    
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/util/OptionHelperTest.java������������0000644�0001750�0001750�00000007021�12136042273�031011� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.util;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.fail;
    
    import java.util.HashMap;
    import java.util.Map;
    
    import org.junit.Before;
    import org.junit.Ignore;
    import org.junit.Test;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.ContextBase;
    
    
    public class OptionHelperTest  {
    
      String text = "Testing ${v1} variable substitution ${v2}";
      String expected = "Testing if variable substitution works";
      Context context = new ContextBase();
      Map<String, String> secondaryMap;
      
      
      
      @Before
      public void setUp() throws Exception {
        secondaryMap = new HashMap<String, String>();
      }
    
      @Test
      public void testLiteral() {
        String noSubst = "hello world";
        String result = OptionHelper.substVars(noSubst, context);
        assertEquals(noSubst, result);
      }
    
      @Test
      public void testUndefinedValues() {
        String withUndefinedValues = "${axyz}";
        
        String result = OptionHelper.substVars(withUndefinedValues, context);
        assertEquals("axyz"+OptionHelper._IS_UNDEFINED, result);
      }
      
      @Test
      public void testSubstVarsVariableNotClosed() {
        String noSubst = "testing if ${v1 works";
        
        try {
          @SuppressWarnings("unused")
          String result = OptionHelper.substVars(noSubst, context);
          fail();
        } catch (IllegalArgumentException e) {
          //ok
        }
      }
      @Test
      public void testSubstVarsContextOnly() {
        context.putProperty("v1", "if");
        context.putProperty("v2", "works");
        
        String result = OptionHelper.substVars(text, context);
        assertEquals(expected, result); 
      }
      
      @Test
      public void testSubstVarsSystemProperties() { 
        System.setProperty("v1", "if");
        System.setProperty("v2", "works");
        
        String result = OptionHelper.substVars(text, context);
        assertEquals(expected, result); 
        
        System.clearProperty("v1");
        System.clearProperty("v2");
      }
      
      @Test
      public void testSubstVarsWithDefault() {   
        context.putProperty("v1", "if");
        String textWithDefault = "Testing ${v1} variable substitution ${v2:-toto}";
        String resultWithDefault = "Testing if variable substitution toto";
        
        String result = OptionHelper.substVars(textWithDefault, context);
        assertEquals(resultWithDefault, result); 
      }
      
      @Test
      public void testSubstVarsRecursive() {
        context.putProperty("v1", "if");
        context.putProperty("v2", "${v3}");
        context.putProperty("v3", "works");
        
        String result = OptionHelper.substVars(text, context);
        assertEquals(expected, result); 
      }
    
    
      @Ignore
      @Test
      public void defaultValueReferencingAVariable() {
        context.putProperty("v1", "k1");
        String result = OptionHelper.substVars("${undef:-${v1}}", context);
        assertEquals("k1", result);
      }
    
    
      @Test
      public void jackrabbit_standalone() {
        String r = OptionHelper.substVars("${jackrabbit.log:-${repo:-jackrabbit}/log/jackrabbit.log}", context);
        assertEquals("jackrabbit/log/jackrabbit.log", r);
      }
    
      
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/util/DurationTest.java����������������0000644�0001750�0001750�00000004775�12136042273�030203� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.util;
    
    import static org.junit.Assert.assertEquals;
    
    import org.junit.Test;
    
    
    public class DurationTest  {
    
      static long HOURS_CO = 60*60;
      static long DAYS_CO = 24*60*60;
      
    
      @Test
      public void test() {
        {
          Duration d = Duration.valueOf("12");
          assertEquals(12, d.getMilliseconds());
        }
    
        {
          Duration d = Duration.valueOf("159 milli");
          assertEquals(159, d.getMilliseconds());
        }
        
        {
          Duration d = Duration.valueOf("15 millis");
          assertEquals(15, d.getMilliseconds());
        }
        
        {
          Duration d = Duration.valueOf("8 milliseconds");
          assertEquals(8, d.getMilliseconds());
        }
        
        {
          Duration d = Duration.valueOf("10.7 millisecond");
          assertEquals(10, d.getMilliseconds());
        }
        
        {
          Duration d = Duration.valueOf("10 SECOnds");
          assertEquals(10 * 1000, d.getMilliseconds());
        }
    
        {
          Duration d = Duration.valueOf("12seconde");
          assertEquals(12 * 1000, d.getMilliseconds());
        }
    
        {
          Duration d = Duration.valueOf("14 SECONDES");
          assertEquals(14 * 1000, d.getMilliseconds());
        }
        
        {
          Duration d = Duration.valueOf("12second");
          assertEquals(12 * 1000, d.getMilliseconds());
        }
        
        {
          Duration d = Duration.valueOf("10.7 seconds");
          assertEquals(10700, d.getMilliseconds());
        }
        
        {
          Duration d = Duration.valueOf("1 minute");
          assertEquals(1000*60, d.getMilliseconds());
        }
        
        {
          Duration d = Duration.valueOf("2.2 minutes");
          assertEquals(2200*60, d.getMilliseconds());
        }
        
        {
          Duration d = Duration.valueOf("1 hour");
          assertEquals(1000*HOURS_CO, d.getMilliseconds());
        }
        
        {
          Duration d = Duration.valueOf("4.2 hours");
          assertEquals(4200*HOURS_CO, d.getMilliseconds());
        }
    
        {
          Duration d = Duration.valueOf("5 days");
          assertEquals(5000*DAYS_CO, d.getMilliseconds());
        }
      }
    }
    ���logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/util/ContentTypeUtilTest.java���������0000644�0001750�0001750�00000002321�12136042273�031511� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.util;
    
    import static org.junit.Assert.*;
    
    import org.junit.Test;
    
    
    public class ContentTypeUtilTest {
    
      
      @Test
      public void smoke() {
        String contextType = "text/html";
        assertTrue(ContentTypeUtil.isTextual(contextType));
        assertEquals("html", ContentTypeUtil.getSubType(contextType));
      }
      
      @Test
      public void nullContext() {
        String contextType = null;
        assertFalse(ContentTypeUtil.isTextual(contextType));
        assertNull(ContentTypeUtil.getSubType(contextType));
      }
      
      @Test
      public void emptySubtype() {
        String contextType = "text/";
        assertTrue(ContentTypeUtil.isTextual(contextType));
        assertNull(ContentTypeUtil.getSubType(contextType));
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/util/StringCollectionUtilTest.java����0000644�0001750�0001750�00000004633�12136042273�032527� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.util;
    
    import static org.junit.Assert.assertTrue;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Collection;
    import java.util.List;
    
    import org.junit.Test;
    
    
    /**
     * Unit tests for {@link StringCollectionUtil}.
     *
     * @author Carl Harris
     */
    public class StringCollectionUtilTest {
    
      @Test
      public void testRetainMatchingWithNoPatterns() throws Exception {
        Collection<String> values = stringToList("A");
        StringCollectionUtil.retainMatching(values);
        assertTrue(values.contains("A"));
      }
    
      @Test
      public void testRetainMatchingWithMatchingPattern() throws Exception {
        Collection<String> values = stringToList("A");
        StringCollectionUtil.retainMatching(values, "A");
        assertTrue(values.contains("A"));
      }
    
      @Test
      public void testRetainMatchingWithNoMatchingPattern() throws Exception {
        Collection<String> values = stringToList("A");
        StringCollectionUtil.retainMatching(values, "B");
        assertTrue(values.isEmpty());
      }
    
      @Test
      public void testRemoveMatchingWithNoPatterns() throws Exception {
        Collection<String> values = stringToList("A");
        StringCollectionUtil.removeMatching(values);
        assertTrue(values.contains("A"));
      }
    
      @Test
      public void testRemoveMatchingWithMatchingPattern() throws Exception {
        Collection<String> values = stringToList("A");
        StringCollectionUtil.removeMatching(values, "A");
        assertTrue(values.isEmpty());
      }
    
      @Test
      public void testRemoveMatchingWithNoMatchingPattern() throws Exception {
        Collection<String> values = stringToList("A");
        StringCollectionUtil.removeMatching(values, "B");
        assertTrue(values.contains("A"));
      }
    
      @SuppressWarnings("unchecked")
      private List<String> stringToList(String... values) {
        List<String> result = new ArrayList<String>(values.length);
        result.addAll(Arrays.asList(values));
        return result;
      }
    
    }
    �����������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/util/PackageTest.java�����������������0000644�0001750�0001750�00000001567�12136042273�027745� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.util;
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    import org.junit.runners.Suite.SuiteClasses;
    
    @RunWith(Suite.class)
    @SuiteClasses({
      DurationTest.class,
      FileSizeTest.class,
      FileUtilTest.class,
      OptionHelperTest.class,
      StatusPrinterTest.class,
      TimeUtilTest.class,
      ContentTypeUtilTest.class})
    public class PackageTest {
    }
    �����������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/util/CoreTestConstants.java�����������0000644�0001750�0001750�00000002320�12136544575�031177� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.util;
    
    public class CoreTestConstants {
    
      public static final String TEST_SRC_PREFIX = "src/test/";
      public static final String TEST_INPUT_PREFIX = TEST_SRC_PREFIX + "input/";
      public static final String JORAN_INPUT_PREFIX = TEST_INPUT_PREFIX
              + "joran/";
    
      public static final String TARGET_DIR = "target/";
      public static final String OUTPUT_DIR_PREFIX = TARGET_DIR + "test-output/";
    
      public static final int SUCCESSFUL_EXIT_CODE = 8;
      public static final int FAILURE_EXIT_CODE = 1;
    
      public static final String BASH_PATH_ON_CYGWIN = "c:/cygwin/bin/bash";
      public static final String BASH_PATH_ON_LINUX = "bash";
    
    
      public static final String SLOW_JENKINS = "slowJenkins";
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/util/FileSizeTest.java����������������0000644�0001750�0001750�00000002442�12136042273�030115� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.util;
    
    import static org.junit.Assert.assertEquals;
    
    import org.junit.Test;
    
    
    public class FileSizeTest{
    
      static long KB_CO = 1024;
      static long MB_CO = 1024*1024;
      static long GB_CO = 1024*MB_CO;
      
    
      @Test
      public void test() {
        {
          FileSize fs = FileSize.valueOf("8");
          assertEquals(8, fs.getSize());
        }
        
        {
          FileSize fs = FileSize.valueOf("8 kbs");
          assertEquals(8*KB_CO, fs.getSize());
        }
      
        {
          FileSize fs = FileSize.valueOf("8 kb");
          assertEquals(8*KB_CO, fs.getSize());
        }
        
        {
          FileSize fs = FileSize.valueOf("12 mb");
          assertEquals(12*MB_CO, fs.getSize());
        }
    
        {
          FileSize fs = FileSize.valueOf("5 GBs");
          assertEquals(5*GB_CO, fs.getSize());
        }
    
      }
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/util/Compare.java���������������������0000644�0001750�0001750�00000012755�12136042273�027141� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.util;
    
    import java.io.BufferedReader;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.Enumeration;
    import java.util.zip.GZIPInputStream;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipFile;
    import java.util.zip.ZipInputStream;
    
    public class Compare {
      static final int B1_NULL = -1;
      static final int B2_NULL = -2;
    
      public static boolean compare(String file1, String file2) throws FileNotFoundException, IOException {
        if (file1.endsWith(".gz")) {
          return gzFileCompare(file1, file2);
        } else if(file1.endsWith(".zip")) {
          return zipFileCompare(file1, file2);
        } else {
          return regularFileCompare(file1, file2);
        }
      }
    
      static BufferedReader gzFileToBufferedReader(String file) throws IOException {
        FileInputStream fis = new FileInputStream(file);
        GZIPInputStream gzis = new GZIPInputStream(fis);
        return new BufferedReader(new InputStreamReader(gzis));
      }
    
      static BufferedReader zipFileToBufferedReader(String file) throws IOException {
        FileInputStream fis = new FileInputStream(file);
        ZipInputStream zis = new  ZipInputStream(fis);
        zis.getNextEntry();
        return new BufferedReader(new InputStreamReader(zis));
      }
      public static boolean gzFileCompare(String file1, String file2) throws IOException {
        BufferedReader in1 = gzFileToBufferedReader(file1);
        BufferedReader in2 = gzFileToBufferedReader(file2);
        return bufferCompare(in1, in2, file1, file2);
      }
    
      public static boolean zipFileCompare(String file1, String file2) throws IOException {
        BufferedReader in1 = zipFileToBufferedReader(file1);
        BufferedReader in2 = zipFileToBufferedReader(file2);
        return bufferCompare(in1, in2, file1, file2);
      }
      public static boolean regularFileCompare(String file1, String file2)
          throws FileNotFoundException, IOException {
        BufferedReader in1 = new BufferedReader(new FileReader(file1));
        BufferedReader in2 = new BufferedReader(new FileReader(file2));
        return bufferCompare(in1, in2, file1, file2);
      }
    
      public static boolean bufferCompare(BufferedReader in1, BufferedReader in2,
          String file1, String file2) throws FileNotFoundException, IOException {
    
        String s1;
        int lineCounter = 0;
    
        while ((s1 = in1.readLine()) != null) {
          lineCounter++;
    
          String s2 = in2.readLine();
    
          if (!s1.equals(s2)) {
            System.out.println("Files [" + file1 + "] and [" + file2
                + "] differ on line " + lineCounter);
            System.out.println("One reads:  [" + s1 + "].");
            System.out.println("Other reads:[" + s2 + "].");
            outputFile(file1);
            outputFile(file2);
    
            return false;
          }
        }
    
        // the second file is longer
        if (in2.read() != -1) {
          System.out.println("File [" + file2 + "] longer than file [" + file1
              + "].");
          outputFile(file1);
          outputFile(file2);
    
          return false;
        }
    
        return true;
      }
    
      /**
       * 
       * Prints file on the console.
       * 
       */
      private static void outputFile(String file) throws FileNotFoundException,
          IOException {
        BufferedReader in1 = new BufferedReader(new FileReader(file));
    
        String s1;
        int lineCounter = 0;
        System.out.println("--------------------------------");
        System.out.println("Contents of " + file + ":");
    
        while ((s1 = in1.readLine()) != null) {
          lineCounter++;
          System.out.print(lineCounter);
    
          if (lineCounter < 10) {
            System.out.print("   : ");
          } else if (lineCounter < 100) {
            System.out.print("  : ");
          } else if (lineCounter < 1000) {
            System.out.print(" : ");
          } else {
            System.out.print(": ");
          }
    
          System.out.println(s1);
        }
      }
    
      public static boolean gzCompare(String file1, String file2)
          throws FileNotFoundException, IOException {
        BufferedReader in1 = new BufferedReader(new InputStreamReader(
            new GZIPInputStream(new FileInputStream(file1))));
        BufferedReader in2 = new BufferedReader(new InputStreamReader(
            new GZIPInputStream(new FileInputStream(file2))));
    
        String s1;
        int lineCounter = 0;
    
        while ((s1 = in1.readLine()) != null) {
          lineCounter++;
    
          String s2 = in2.readLine();
    
          if (!s1.equals(s2)) {
            System.out.println("Files [" + file1 + "] and [" + file2
                + "] differ on line " + lineCounter);
            System.out.println("One reads:  [" + s1 + "].");
            System.out.println("Other reads:[" + s2 + "].");
            outputFile(file1);
            outputFile(file2);
    
            return false;
          }
        }
    
        // the second file is longer
        if (in2.read() != -1) {
          System.out.println("File [" + file2 + "] longer than file [" + file1
              + "].");
          outputFile(file1);
          outputFile(file2);
    
          return false;
        }
    
        return true;
      }
    }
    �������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/util/ResilienceUtil.java��������������0000644�0001750�0001750�00000003375�12136042273�030471� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.util;
    
    import static org.junit.Assert.assertTrue;
    
    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.io.IOException;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class ResilienceUtil {
    
      
      static public void verify(String logfile, String regexp, long totalSteps, double successRatioLowerBound) throws NumberFormatException, IOException {
        FileReader fr = new FileReader(logfile);
        BufferedReader br = new BufferedReader(fr);
        Pattern p = Pattern.compile(regexp);
        String line;
        
        int totalLines = 0;
        int oldNum = -1;
        int gaps = 0;
        while ((line = br.readLine()) != null) {
          Matcher m = p.matcher(line);
          if (m.matches()) {
            totalLines++;
            String g = m.group(1);
            int num = Integer.parseInt(g);
            if(oldNum != -1 && num != oldNum+1) {
              gaps++;
            }
            oldNum = num;
          }
        }
        fr.close();
        br.close();
    
        int lowerLimit = (int) (totalSteps*successRatioLowerBound);
        assertTrue("totalLines="+totalLines+" less than "+lowerLimit, totalLines > lowerLimit);
        
        // we want at least one gap indicating recuperation
        assertTrue("gaps="+gaps+" less than 1", gaps >= 1);
        
      }
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/util/DatePatternToRegexTest.java������0000644�0001750�0001750�00000006501�12136042273�032114� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.util;
    
    import static org.junit.Assert.assertTrue;
    
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Calendar;
    import java.util.List;
    
    import ch.qos.logback.core.rolling.helper.DateTokenConverter;
    import org.junit.BeforeClass;
    import org.junit.Test;
    
    import ch.qos.logback.core.CoreConstants;
    
    public class DatePatternToRegexTest {
      static Calendar CAL_2009_08_3_NIGHT = Calendar.getInstance();
      static Calendar CAL_2009_08_3_MORNING = Calendar.getInstance();
    
      @BeforeClass
      public static void setUpCalendars() {
        CAL_2009_08_3_NIGHT.set(2009, 8, 3, 21, 57, 16);
        CAL_2009_08_3_NIGHT.set(Calendar.MILLISECOND, 333);
    
        CAL_2009_08_3_MORNING.set(2009, 8, 3, 10, 24, 37);
        CAL_2009_08_3_MORNING.set(Calendar.MILLISECOND, 333);
      }
    
      @Test
      public void ISO8601() {
        doTest(CoreConstants.ISO8601_PATTERN, CAL_2009_08_3_NIGHT);
        ;
      }
    
      @Test
      public void withQuotes() {
        doTest("yyyy-MM-dd'T'HH:mm:ss,SSS", CAL_2009_08_3_NIGHT);
        ;
      }
    
      @Test
      public void month() {
        doTest("yyyy-MMM-dd", CAL_2009_08_3_NIGHT);
        doTest("yyyy-MMMM-dd", CAL_2009_08_3_NIGHT);
      }
    
      @Test
      public void dot() {
        doTest("yyyy.MMM.dd", CAL_2009_08_3_NIGHT);
        ;
      }
    
      @Test
      public void timeZone() {
        doTest("yyyy-MMM-dd HH:mm:ss z", CAL_2009_08_3_NIGHT);
        doTest("yyyy-MMM-dd HH:mm:ss Z", CAL_2009_08_3_NIGHT);
      }
    
      @Test
      public void dayInWeek() {
        doTest("yyyy-MMM-E", CAL_2009_08_3_NIGHT);
        doTest("yyyy-MMM-EE", CAL_2009_08_3_NIGHT);
        doTest("yyyy-MMM-EEE", CAL_2009_08_3_NIGHT);
      }
    
      @Test
      public void amPm() {
        doTest("yyyy-MM-dd a", CAL_2009_08_3_NIGHT);
        doTest("yyyy-MM-dd a", CAL_2009_08_3_MORNING);
      }
    
    
      void doTest(String datePattern, Calendar calendar, boolean slashified) {
        SimpleDateFormat sdf = new SimpleDateFormat(datePattern);
        DateTokenConverter dtc = makeDTC(datePattern);
        verify(sdf, calendar, dtc, slashified);
      }
    
      void doTest(String datePattern, Calendar calendar) {
        doTest(datePattern, calendar, false);
      }
    
    
      void verify(SimpleDateFormat sdf, Calendar calendar, DateTokenConverter dtc, boolean slashified) {
        String expected = sdf.format(calendar.getTime());
        if (slashified) {
          expected = expected.replace('\\', '/');
        }
        String regex = dtc.toRegex();
        //System.out.println("expected="+expected);
        //System.out.println(regex);
        assertTrue("[" + expected + "] does not match regex [" + regex + "]",
                expected.matches(regex));
      }
    
      private DateTokenConverter makeDTC(String datePattern) {
        DateTokenConverter dtc = new DateTokenConverter();
        List<String> optionList = new ArrayList<String>();
        optionList.add(datePattern);
        dtc.setOptionList(optionList);
        dtc.start();
        return dtc;
      }
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/util/TimeUtilTest.java����������������0000644�0001750�0001750�00000007423�12136042273�030143� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.util;
    
    import static org.junit.Assert.assertEquals;
    
    import java.util.Calendar;
    import java.util.Date;
    import java.util.TimeZone;
    
    import org.junit.Test;
    
    public class TimeUtilTest  {
    
      @Test
      public void testSecond() {
        // Mon Nov 20 18:05:17,522 CET 2006
        long now = 1164042317522L;
        // Mon Nov 20 18:05:18,000 CET 2006
        long expected = 1164042318000L;
        long computed = TimeUtil.computeStartOfNextSecond(now);
        assertEquals(expected - now, 478);
        assertEquals(expected, computed);
      }
      
      @Test
      public void testMinute() {
        // Mon Nov 20 18:05:17,522 CET 2006
        long now = 1164042317522L;
        // Mon Nov 20 18:06:00 CET 2006
        long expected = 1164042360000L;
    
        long computed = TimeUtil.computeStartOfNextMinute(now);
        assertEquals(expected - now, 1000 * 42 + 478);
        assertEquals(expected, computed);
      }
      
      @Test
      public void testHour() {
        // Mon Nov 20 18:05:17,522 GMT 2006
        long now = 1164045917522L;
        now = correctBasedOnTimeZone(now);
        // Mon Nov 20 19:00:00 GMT 2006
        long expected = 1164049200000L;
        expected = correctBasedOnTimeZone(expected);
        
        long computed = TimeUtil.computeStartOfNextHour(now);
        assertEquals(expected - now, 1000 * (42 + 60 * 54) + 478);
        assertEquals(expected, computed);
      }
      
      @Test
      public void testDay() {
        // Mon Nov 20 18:05:17 GMT 2006
        long now = 1164045917522L;
        now = correctBasedOnTimeZone(now);
        // Tue Nov 21 00:00:00 GMT 2006
        long expected = 1164067200000L;
        expected = correctBasedOnTimeZone(expected);
        long computed = TimeUtil.computeStartOfNextDay(now);
        
        assertEquals(expected - now, 1000 * (3600 * 5 + 60 * 54 + 42) + 478);
        assertEquals(expected, computed);
      }
      
      @Test
      public void testWeek() {
        // Mon Nov 20 18:05:17 GMT 2006
        long now = 1164045917522L;
        now = correctBasedOnTimeZone(now);
        // Sun Nov 26 00:00:00 GMT 2006
        long expected = 1164499200000L;
        expected = correctBasedOnTimeZone(expected);
    
        Calendar cal = Calendar.getInstance();
        cal.setTime(new Date(now));
    
        int dayOffset = cal.getFirstDayOfWeek() - Calendar.SUNDAY;
        if (dayOffset != 0) {
          expected += 24L * 3600 * 1000 * (cal.getFirstDayOfWeek() - Calendar.SUNDAY);
        }
    
        long computed = TimeUtil.computeStartOfNextWeek(now);
        // System.out.println("now "+new Date(now));
        // System.out.println("computed "+new Date(computed));
        // System.out.println("expected "+new Date(expected));
        assertEquals(expected - now,
            1000 * (3600 * (5 + 24 * (5 + dayOffset)) + 60 * 54 + 42) + 478);
        assertEquals(expected, computed);
      }
      
      @Test
      public void testMonth() {
        // Mon Nov 20 18:05:17 GMT 2006
        long now = 1164045917522L;
        now = correctBasedOnTimeZone(now);
        // Fri Dec 01 00:00:00 GMT 2006
        long expected = 1164931200000L;
        expected = correctBasedOnTimeZone(expected);
        
        long computed = TimeUtil.computeStartOfNextMonth(now);
        assertEquals(expected - now,
            1000 * (3600 * (5 + 24 * 10) + 60 * 54 + 42) + 478);
        assertEquals(expected, computed);
      }
      
      private long correctBasedOnTimeZone(long gmtLong) {
        int offset = TimeZone.getDefault().getRawOffset();
        return gmtLong - offset;
      }
    
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/contention/���������������������������0000755�0001750�0001750�00000000000�12203357067�026106� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000151�00000000000�011562� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/contention/RunnableWithCounterAndDone.java������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/contention/RunnableWithCounterAndDone.0000644�0001750�0001750�00000001660�12136042272�033277� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.contention;
    
    /**
     * A runnable with 'done' and 'counter' fields.
     * 
     * @author ceki
     *
     */
    abstract public class RunnableWithCounterAndDone implements Runnable {
    
      protected boolean done = false;
      protected long counter = 0;
      
      public long getCounter() {
        return counter;
      }
    
      public void setDone(boolean done) {
        this.done = done;
      }
    
      public boolean isDone() {
        return done;
      }
      
    }
    ��������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/contention/MultiThreadedHarness.java��0000644�0001750�0001750�00000003174�12136213375�033033� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.contention;
    
    
    /**
     * Useful scaffolding/harness to start and processPriorToRemoval multiple threads.
     * 
     * @author Joern Huxhorn
     * @author Ralph Goers
     * @author Ceki Gulcu
     */
    public class MultiThreadedHarness extends AbstractMultiThreadedHarness {
    
      final long overallDurationInMillis;
    
      public MultiThreadedHarness(long overallDurationInMillis) {
        this.overallDurationInMillis = overallDurationInMillis;
      }
    
      public void printEnvironmentInfo(String msg) {
        System.out.println("=== " + msg + " ===");
        System.out.println("java.runtime.version = "
            + System.getProperty("java.runtime.version"));
        System.out.println("java.vendor          = "
            + System.getProperty("java.vendor"));
        System.out.println("java.version         = "
            + System.getProperty("java.version"));
        System.out.println("os.name              = "
            + System.getProperty("os.name"));
        System.out.println("os.version           = "
            + System.getProperty("os.version"));
      }
    
      void waitUntilEndCondition() throws InterruptedException {
        Thread.sleep(overallDurationInMillis);
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000162�00000000000�011564� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/contention/WaitOnExecutionMultiThreadedHarness.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/contention/WaitOnExecutionMultiThreade0000644�0001750�0001750�00000002132�12140150757�033421� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.contention;
    
    import java.util.concurrent.ThreadPoolExecutor;
    
    public class WaitOnExecutionMultiThreadedHarness extends AbstractMultiThreadedHarness {
        ThreadPoolExecutor threadPoolExecutor;
        int count;
    
        public WaitOnExecutionMultiThreadedHarness(ThreadPoolExecutor threadPoolExecutor, int count) {
            this.threadPoolExecutor = threadPoolExecutor;
            this.count = count;
    
        }
        @Override
        void waitUntilEndCondition() throws InterruptedException {
          while(threadPoolExecutor.getCompletedTaskCount() < count) {
            Thread.yield();
          }
        }
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000153�00000000000�011564� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/contention/AbstractMultiThreadedHarness.java����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/contention/AbstractMultiThreadedHarnes0000644�0001750�0001750�00000002422�12136042272�033403� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.contention;
    
    abstract public class AbstractMultiThreadedHarness {
    
      RunnableWithCounterAndDone[] runnableArray;
    
      abstract void waitUntilEndCondition() throws InterruptedException;
    
      public void execute(RunnableWithCounterAndDone[] runnableArray)
          throws InterruptedException {
        this.runnableArray = runnableArray;
        Thread[] threadArray = new Thread[runnableArray.length];
    
        for (int i = 0; i < runnableArray.length; i++) {
          threadArray[i] = new Thread(runnableArray[i], "Harness["+i+"]");
        }
        for (Thread t : threadArray) {
          t.start();
        }
    
        waitUntilEndCondition();
        for (RunnableWithCounterAndDone r : runnableArray) {
          r.setDone(true);
        }
        for (Thread t : threadArray) {
          t.join();
        }
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000153�00000000000�011564� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/contention/ThreadedThroughputCalculator.java����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/contention/ThreadedThroughputCalculato0000644�0001750�0001750�00000002725�12136042272�033473� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.contention;
    
    
    /**
     * Useful scaffolding to measure the throughput of certain operations when
     * invoked by multiple threads.
     * 
     * @author Joern Huxhorn
     * @author Ralph Goers
     * @author Ceki Gulcu
     */
    public class ThreadedThroughputCalculator extends MultiThreadedHarness {
    
    
      public ThreadedThroughputCalculator(long overallDurationInMillis) {
        super(overallDurationInMillis);
      }
    
      public void printThroughput(String msg) throws InterruptedException {
        printThroughput(msg, false);
      }
      
      public void printThroughput(String msg, boolean detailed) throws InterruptedException {
        long sum = 0;
        for (RunnableWithCounterAndDone r : runnableArray) {
          if(detailed) {
            System.out.println(r +" count="+r.getCounter());
          }
          sum += r.getCounter();
        }
        
        System.out.println(msg + "total of " + sum + " operations, or "
            + ((sum) / overallDurationInMillis) + " operations per millisecond");
      }
    }
    �������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/read/���������������������������������0000755�0001750�0001750�00000000000�12203357067�024641� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/read/CyclicBufferAppenderTest.java����0000644�0001750�0001750�00000002545�12136042273�032364� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.read;
    
    import org.junit.Before;
    import org.junit.Test;
    
    import static org.junit.Assert.assertEquals;
    
    public class CyclicBufferAppenderTest {
    
      private CyclicBufferAppender<String> cyclicBufferAppender;
    
      @Before
      public void before() {
        cyclicBufferAppender = new CyclicBufferAppender<String>();
        cyclicBufferAppender.start();
      }
    
      @Test
        public void reset() {
    
        cyclicBufferAppender.append("foobar");
        assertEquals(1, cyclicBufferAppender.getLength());
        cyclicBufferAppender.reset();
        assertEquals(0, cyclicBufferAppender.getLength());
      }
    
      @Test
      public void genericGet() {
        cyclicBufferAppender.append("Some string");
        // get() now has type information, assigning to String should work without cast.
        String foo = cyclicBufferAppender.get(0);
        assertEquals("Some string", foo);
      }
    
    
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/pattern/������������������������������0000755�0001750�0001750�00000000000�12203357067�025403� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/pattern/parser/�����������������������0000755�0001750�0001750�00000000000�12203357067�026677� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000146�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/pattern/parser/SamplePatternLayout.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/pattern/parser/SamplePatternLayout.jav0000644�0001750�0001750�00000002324�12136042273�033352� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern.parser;
    
    import java.util.HashMap;
    import java.util.Map;
    
    import ch.qos.logback.core.pattern.Converter123;
    import ch.qos.logback.core.pattern.ConverterHello;
    import ch.qos.logback.core.pattern.PatternLayoutBase;
    
    
    
    public class SamplePatternLayout<E> extends PatternLayoutBase<E> {
    
      Map<String, String> converterMap = new HashMap<String, String>();
    
      public SamplePatternLayout() {
        converterMap.put("OTT", Converter123.class.getName());
        converterMap.put("hello", ConverterHello.class.getName());
      }
      
      public  Map<String, String> getDefaultConverterMap() {
        return converterMap;
      }
    
      public String doLayout(E event) {
        return writeLoopOnConverters(event);
      }
    
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000152�00000000000�011563� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/pattern/parser/SamplePatternLayoutTest.java�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/pattern/parser/SamplePatternLayoutTest0000644�0001750�0001750�00000004741�12136042273�033440� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern.parser;
    
    import static org.junit.Assert.*;
    
    import org.junit.Test;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.ContextBase;
    import ch.qos.logback.core.pattern.PatternLayoutBase;
    
    
    public class SamplePatternLayoutTest extends AbstractPatternLayoutBaseTest<Object> {
    
      Context context = new ContextBase();
    
      public PatternLayoutBase<Object> getPatternLayoutBase() {
        return new SamplePatternLayout<Object>();
      }
    
      public Object getEventObject() {
        return new Object();
      }
      
      @Test
      public void testOK() {
        PatternLayoutBase<Object> plb = getPatternLayoutBase();
        Context context = new ContextBase();
        plb.setContext(context);
        plb.setPattern("x%OTT");
        plb.start();
        String s = plb.doLayout(new Object());
        //System.out.println(s);
    
        //StatusManager sm = context.getStatusManager();
        //StatusPrinter.print(sm);
        assertEquals("x123", s);
      }
    
      @Test
      public void testEscapeClosingParentheses() {
        PatternLayoutBase<Object> plb = getPatternLayoutBase();
        Context context = new ContextBase();
        plb.setContext(context);
        plb.setPattern("x(%OTT\\)y");
        plb.start();
        String s = plb.doLayout(new Object());
        assertEquals("x(123)y", s);
      }
      
      @Test
      public void testEscapeBothParentheses() {
        PatternLayoutBase<Object> plb = getPatternLayoutBase();
        Context context = new ContextBase();
        plb.setContext(context);
        plb.setPattern("x\\(%OTT\\)y");
        plb.start();
        String s = plb.doLayout(new Object());
        assertEquals("x(123)y", s);
      }
    
      @Test
      public void testPercentAsLiteral() {
        PatternLayoutBase<Object> plb = getPatternLayoutBase();
        Context context = new ContextBase();
        plb.setContext(context);
        plb.setPattern("hello \\% world");
        plb.start();
        String s = plb.doLayout(new Object());
        assertEquals("hello % world", s);
      }
    
      
      @Override
      public Context getContext() {
        return  context;
      }
    }
    �������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/pattern/parser/ParserTest.java��������0000644�0001750�0001750�00000021664�12136042273�031642� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern.parser;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertTrue;
    import static org.junit.Assert.fail;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.ContextBase;
    import ch.qos.logback.core.spi.ScanException;
    import ch.qos.logback.core.status.StatusChecker;
    import org.junit.Test;
    
    import ch.qos.logback.core.pattern.FormatInfo;
    
    public class ParserTest {
    
      String BARE = Token.BARE_COMPOSITE_KEYWORD_TOKEN.getValue().toString();
      Context context = new ContextBase();
    
    
      @Test
      public void testBasic() throws Exception {
        Parser p = new Parser("hello");
        Node t = p.parse();
        assertEquals(Node.LITERAL, t.getType());
        assertEquals("hello", t.getValue());
      }
    
      @Test
      public void testKeyword() throws Exception {
    
        {
          Parser p = new Parser("hello%xyz");
          Node t = p.parse();
          Node witness = new Node(Node.LITERAL, "hello");
          witness.next = new SimpleKeywordNode("xyz");
          assertEquals(witness, t);
        }
    
        {
          Parser p = new Parser("hello%xyz{x}");
          Node t = p.parse();
          Node witness = new Node(Node.LITERAL, "hello");
          SimpleKeywordNode n = new SimpleKeywordNode("xyz");
          List<String> optionList = new ArrayList<String>();
          optionList.add("x");
          n.setOptions(optionList);
          witness.next = n;
          assertEquals(witness, t);
        }
      }
    
      @Test
      public void testComposite() throws Exception {
        {
          Parser p = new Parser("hello%(%child)");
          Node t = p.parse();
    
          Node witness = new Node(Node.LITERAL, "hello");
          CompositeNode composite = new CompositeNode(BARE);
          Node child = new SimpleKeywordNode("child");
          composite.setChildNode(child);
          witness.next = composite;
    
          // System.out.println("w:" + witness);
          // System.out.println(t);
    
          assertEquals(witness, t);
        }
    
        // System.out.println("testRecursive part 2");
        {
          Parser p = new Parser("hello%(%child )");
          Node t = p.parse();
    
          Node witness = new Node(Node.LITERAL, "hello");
          CompositeNode composite = new CompositeNode(BARE);
          Node child = new SimpleKeywordNode("child");
          composite.setChildNode(child);
          witness.next = composite;
          child.next = new Node(Node.LITERAL, " ");
          assertEquals(witness, t);
        }
    
        {
          Parser p = new Parser("hello%(%child %h)");
          Node t = p.parse();
          Node witness = new Node(Node.LITERAL, "hello");
          CompositeNode composite = new CompositeNode(BARE);
          Node child = new SimpleKeywordNode("child");
          composite.setChildNode(child);
          child.next = new Node(Node.LITERAL, " ");
          child.next.next = new SimpleKeywordNode("h");
          witness.next = composite;
          assertEquals(witness, t);
        }
    
        {
          Parser p = new Parser("hello%(%child %h) %m");
          Node t = p.parse();
          Node witness = new Node(Node.LITERAL, "hello");
          CompositeNode composite = new CompositeNode(BARE);
          Node child = new SimpleKeywordNode("child");
          composite.setChildNode(child);
          child.next = new Node(Node.LITERAL, " ");
          child.next.next = new SimpleKeywordNode("h");
          witness.next = composite;
          composite.next = new Node(Node.LITERAL, " ");
          composite.next.next = new SimpleKeywordNode("m");
          assertEquals(witness, t);
        }
    
        {
          Parser p = new Parser("hello%( %child \\(%h\\) ) %m");
          Node t = p.parse();
          Node witness = new Node(Node.LITERAL, "hello");
          CompositeNode composite = new CompositeNode(BARE);
          Node child = new Node(Node.LITERAL, " ");
          composite.setChildNode(child);
          Node c = child;
          c = c.next = new SimpleKeywordNode("child");
          c = c.next = new Node(Node.LITERAL, " (");
          c = c.next = new SimpleKeywordNode("h");
          c = c.next = new Node(Node.LITERAL, ") ");
          witness.next = composite;
          composite.next = new Node(Node.LITERAL, " ");
          composite.next.next = new SimpleKeywordNode("m");
          assertEquals(witness, t);
        }
    
    
      }
    
      @Test
      public void testNested() throws Exception {
        {
          Parser p = new Parser("%top %(%child%(%h))");
          Node t = p.parse();
          Node witness = new SimpleKeywordNode("top");
          Node w = witness.next = new Node(Node.LITERAL, " ");
          CompositeNode composite = new CompositeNode(BARE);
          w = w.next = composite;
          Node child = new SimpleKeywordNode("child");
          composite.setChildNode(child);
          composite = new CompositeNode(BARE);
          child.next = composite;
          composite.setChildNode(new SimpleKeywordNode("h"));
    
          assertEquals(witness, t);
        }
      }
    
      @Test
      public void testFormattingInfo() throws Exception {
        {
          Parser p = new Parser("%45x");
          Node t = p.parse();
          FormattingNode witness = new SimpleKeywordNode("x");
          witness.setFormatInfo(new FormatInfo(45, Integer.MAX_VALUE));
          assertEquals(witness, t);
        }
        {
          Parser p = new Parser("%4.5x");
          Node t = p.parse();
          FormattingNode witness = new SimpleKeywordNode("x");
          witness.setFormatInfo(new FormatInfo(4, 5));
          assertEquals(witness, t);
        }
    
        {
          Parser p = new Parser("%-4.5x");
          Node t = p.parse();
          FormattingNode witness = new SimpleKeywordNode("x");
          witness.setFormatInfo(new FormatInfo(4, 5, false, true));
          assertEquals(witness, t);
        }
        {
          Parser p = new Parser("%-4.-5x");
          Node t = p.parse();
          FormattingNode witness = new SimpleKeywordNode("x");
          witness.setFormatInfo(new FormatInfo(4, 5, false, false));
          assertEquals(witness, t);
        }
    
        {
          Parser p = new Parser("%-4.5x %12y");
          Node t = p.parse();
          FormattingNode witness = new SimpleKeywordNode("x");
          witness.setFormatInfo(new FormatInfo(4, 5, false, true));
          Node n = witness.next = new Node(Node.LITERAL, " ");
          n = n.next = new SimpleKeywordNode("y");
          ((FormattingNode) n).setFormatInfo(new FormatInfo(12, Integer.MAX_VALUE));
          assertEquals(witness, t);
        }
      }
    
      @Test
      public void testOptions0() throws Exception {
        Parser p = new Parser("%45x{'test '}");
        Node t = p.parse();
        SimpleKeywordNode witness = new SimpleKeywordNode("x");
        witness.setFormatInfo(new FormatInfo(45, Integer.MAX_VALUE));
        List<String> ol = new ArrayList<String>();
        ol.add("test ");
        witness.setOptions(ol);
        assertEquals(witness, t);
      }
    
      @Test
      public void testOptions1() throws Exception {
        Parser p = new Parser("%45x{a, b}");
        Node t = p.parse();
        SimpleKeywordNode witness = new SimpleKeywordNode("x");
        witness.setFormatInfo(new FormatInfo(45, Integer.MAX_VALUE));
        List<String> ol = new ArrayList<String>();
        ol.add("a");
        ol.add("b");
        witness.setOptions(ol);
        assertEquals(witness, t);
      }
    
      // see http://jira.qos.ch/browse/LBCORE-180
      @Test
      public void keywordGluedToLitteral() throws Exception {
        Parser p = new Parser("%x{}a");
        Node t = p.parse();
        SimpleKeywordNode witness = new SimpleKeywordNode("x");
        witness.setOptions(new ArrayList<String>());
        witness.next = new Node(Node.LITERAL, "a");
        assertEquals(witness, t);
      }
    
      @Test
      public void testCompositeFormatting() throws Exception {
        Parser p = new Parser("hello%5(XYZ)");
        Node t = p.parse();
    
        Node witness = new Node(Node.LITERAL, "hello");
        CompositeNode composite = new CompositeNode(BARE);
        composite.setFormatInfo(new FormatInfo(5, Integer.MAX_VALUE));
        Node child = new Node(Node.LITERAL, "XYZ");
        composite.setChildNode(child);
        witness.next = composite;
    
        assertEquals(witness, t);
    
      }
    
      @Test
      public void empty() {
        try {
          Parser p = new Parser("");
          p.parse();
          fail("");
        } catch (ScanException e) {
    
        }
      }
    
      @Test
      public void lbcore193() throws Exception {
        try {
          Parser p = new Parser("hello%(abc");
          p.setContext(context);
          Node t = p.parse();
          fail("where the is exception?");
        } catch (ScanException ise) {
          assertEquals("Expecting RIGHT_PARENTHESIS token but got null", ise.getMessage());
        }
        StatusChecker sc = new StatusChecker(context);
        sc.assertContainsMatch("Expecting RIGHT_PARENTHESIS");
        sc.assertContainsMatch("See also " + Parser.MISSING_RIGHT_PARENTHESIS);
      }
    
    }����������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/pattern/parser/PackageTest.java�������0000644�0001750�0001750�00000001553�12136042273�031734� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern.parser;
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    import org.junit.runners.Suite.SuiteClasses;
    
    @RunWith(Suite.class)
    @SuiteClasses({TokenStreamTest.class,
      OptionTokenizerTest.class,
      ParserTest.class,
      FormatInfoTest.class,
      CompilerTest.class,
      SamplePatternLayoutTest.class})
    public class PackageTest {
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000160�00000000000�011562� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/pattern/parser/AbstractPatternLayoutBaseTest.java�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/pattern/parser/AbstractPatternLayoutBa0000644�0001750�0001750�00000007002�12136042273�033356� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern.parser;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertFalse;
    import static org.junit.Assert.assertTrue;
    
    import org.junit.Test;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.ContextBase;
    import ch.qos.logback.core.pattern.ExceptionalConverter;
    import ch.qos.logback.core.pattern.PatternLayoutBase;
    import ch.qos.logback.core.status.StatusChecker;
    import ch.qos.logback.core.status.StatusManager;
    import ch.qos.logback.core.util.StatusPrinter;
    
    
    abstract public class AbstractPatternLayoutBaseTest<E> {
      
      abstract public PatternLayoutBase<E> getPatternLayoutBase();
      abstract public E getEventObject();
      abstract public Context getContext();
      
      @Test
      public void testUnStarted() {
        PatternLayoutBase<E> plb = getPatternLayoutBase();
        Context context = new ContextBase();
        plb.setContext(context);
        String s = plb.doLayout(getEventObject());
        assertEquals("", s);
        StatusManager sm = context.getStatusManager();
        StatusPrinter.print(sm);
      }
    
      /**
       * This test checks that the pattern layout implementation starts its
       * converters. ExceptionalConverter throws an exception if it's convert
       * method is called before being started.
       */
      @Test
      public void testConverterStart() {
        PatternLayoutBase<E> plb = getPatternLayoutBase();
        plb.setContext(getContext());
        plb.getInstanceConverterMap().put("EX", ExceptionalConverter.class.getName());
        plb.setPattern("%EX");
        plb.start();
        String result = plb.doLayout(getEventObject());
        assertFalse(result.contains("%PARSER_ERROR_EX"));
        //System.out.println("========="+result);
      }
    
      @Test
      public void testStarted() {
        PatternLayoutBase<E> plb = getPatternLayoutBase();
        Context context = new ContextBase();
        plb.setContext(context);
        String s = plb.doLayout(getEventObject());
        assertEquals("", s);
        StatusManager sm = context.getStatusManager();
        StatusPrinter.print(sm);
      }
    
      @Test
      public void testNullPattern() {
        //System.out.println("testNullPattern");
        PatternLayoutBase<E> plb = getPatternLayoutBase();
        Context context = new ContextBase();
        plb.setContext(context);
        plb.setPattern(null);
        plb.start();
        String s = plb.doLayout(getEventObject());
        assertEquals("", s);
        StatusChecker checker = new StatusChecker(context.getStatusManager());
        //StatusPrinter.print(context);
        checker.assertContainsMatch("Empty or null pattern.");
      }
    
      @Test
      public void testEmptyPattern() {
        //System.out.println("testNullPattern");
        PatternLayoutBase<E> plb = getPatternLayoutBase();
        Context context = new ContextBase();
        plb.setContext(context);
        plb.setPattern("");
        plb.start();
        String s = plb.doLayout(getEventObject());
        assertEquals("", s);
        StatusChecker checker = new StatusChecker(context.getStatusManager());
        //StatusPrinter.print(context);
        checker.assertContainsMatch("Empty or null pattern.");
      }
    
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/pattern/parser/FormatInfoTest.java����0000644�0001750�0001750�00000005643�12136042273�032451� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern.parser;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.fail;
    
    import org.junit.Test;
    
    import ch.qos.logback.core.pattern.FormatInfo;
    
    
    public class FormatInfoTest  {
    
      @Test
      public void testEndingInDot() {
        try {
          FormatInfo.valueOf("45.");
          fail("45. is not a valid format info string");
        } catch (IllegalArgumentException iae) {
          // OK
        }
      }
    
      @Test
      public void testBasic() {
        {
          FormatInfo fi = FormatInfo.valueOf("45");
          FormatInfo witness = new FormatInfo();
          witness.setMin(45);
          assertEquals(witness, fi);
        }
    
        {
          FormatInfo fi = FormatInfo.valueOf("4.5");
          FormatInfo witness = new FormatInfo();
          witness.setMin(4);
          witness.setMax(5);
          assertEquals(witness, fi);
        }
      }
    
      @Test
      public void testRightPad() {
        {
          FormatInfo fi = FormatInfo.valueOf("-40");
          FormatInfo witness = new FormatInfo();
          witness.setMin(40);
          witness.setLeftPad(false);
          assertEquals(witness, fi);
        }
    
        {
          FormatInfo fi = FormatInfo.valueOf("-12.5");
          FormatInfo witness = new FormatInfo();
          witness.setMin(12);
          witness.setMax(5);
          witness.setLeftPad(false);
          assertEquals(witness, fi);
        }
    
        {
          FormatInfo fi = FormatInfo.valueOf("-14.-5");
          FormatInfo witness = new FormatInfo();
          witness.setMin(14);
          witness.setMax(5);
          witness.setLeftPad(false);
          witness.setLeftTruncate(false);
          assertEquals(witness, fi);
        }
      }
    
      @Test
      public void testMinOnly() {
        {
          FormatInfo fi = FormatInfo.valueOf("49");
          FormatInfo witness = new FormatInfo();
          witness.setMin(49);
          assertEquals(witness, fi);
        }
    
        {
          FormatInfo fi = FormatInfo.valueOf("-587");
          FormatInfo witness = new FormatInfo();
          witness.setMin(587);
          witness.setLeftPad(false);
          assertEquals(witness, fi);
        }
    
      }
    
      @Test
      public void testMaxOnly() {
        {
          FormatInfo fi = FormatInfo.valueOf(".49");
          FormatInfo witness = new FormatInfo();
          witness.setMax(49);
          assertEquals(witness, fi);
        }
    
        {
          FormatInfo fi = FormatInfo.valueOf(".-5");
          FormatInfo witness = new FormatInfo();
          witness.setMax(5);
          witness.setLeftTruncate(false);
          assertEquals(witness, fi);
        }
      }
    }���������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/pattern/parser/CompilerTest.java������0000644�0001750�0001750�00000020020�12136042273�032141� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern.parser;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.ContextBase;
    import ch.qos.logback.core.pattern.Converter;
    import ch.qos.logback.core.pattern.Converter123;
    import ch.qos.logback.core.pattern.ConverterHello;
    import ch.qos.logback.core.status.StatusChecker;
    import ch.qos.logback.core.util.StatusPrinter;
    import org.junit.Before;
    import org.junit.Test;
    
    import java.util.HashMap;
    import java.util.Map;
    
    import static org.junit.Assert.assertEquals;
    
    public class CompilerTest {
    
      Map<String, String> converterMap = new HashMap<String, String>();
      Context context = new ContextBase();
    
      @Before
      public void setUp() {
        converterMap.put("OTT", Converter123.class.getName());
        converterMap.put("hello", ConverterHello.class.getName());
        converterMap.putAll(Parser.DEFAULT_COMPOSITE_CONVERTER_MAP);
      }
    
    
      String write(final Converter<Object> head, Object event) {
        StringBuilder buf = new StringBuilder();
        Converter<Object> c = head;
        while (c != null) {
          c.write(buf, event);
          c = c.getNext();
        }
        return buf.toString();
      }
    
      @Test
      public void testLiteral() throws Exception {
        Parser<Object> p = new Parser<Object>("hello");
        Node t = p.parse();
        Converter<Object> head = p.compile(t, converterMap);
        String result = write(head, new Object());
        assertEquals("hello", result);
      }
    
      @Test
      public void testBasic() throws Exception {
        {
          Parser<Object> p = new Parser<Object>("abc %hello");
          p.setContext(context);
          Node t = p.parse();
          Converter<Object> head = p.compile(t, converterMap);
          String result = write(head, new Object());
          assertEquals("abc Hello", result);
        }
        {
          Parser<Object> p = new Parser<Object>("abc %hello %OTT");
          p.setContext(context);
          Node t = p.parse();
          Converter<Object> head = p.compile(t, converterMap);
          String result = write(head, new Object());
          assertEquals("abc Hello 123", result);
        }
      }
    
      @Test
      public void testFormat() throws Exception {
        {
          Parser<Object> p = new Parser<Object>("abc %7hello");
          p.setContext(context);
          Node t = p.parse();
          Converter<Object> head = p.compile(t, converterMap);
          String result = write(head, new Object());
          assertEquals("abc   Hello", result);
        }
    
        {
          Parser<Object> p = new Parser<Object>("abc %-7hello");
          p.setContext(context);
          Node t = p.parse();
          Converter<Object> head = p.compile(t, converterMap);
          String result = write(head, new Object());
          assertEquals("abc Hello  ", result);
        }
    
        {
          Parser<Object> p = new Parser<Object>("abc %.3hello");
          p.setContext(context);
          Node t = p.parse();
          Converter<Object> head = p.compile(t, converterMap);
          String result = write(head, new Object());
          assertEquals("abc llo", result);
        }
    
        {
          Parser<Object> p = new Parser<Object>("abc %.-3hello");
          p.setContext(context);
          Node t = p.parse();
          Converter<Object> head = p.compile(t, converterMap);
          String result = write(head, new Object());
          assertEquals("abc Hel", result);
        }
    
        {
          Parser<Object> p = new Parser<Object>("abc %4.5OTT");
          p.setContext(context);
          Node t = p.parse();
          Converter<Object> head = p.compile(t, converterMap);
          String result = write(head, new Object());
          assertEquals("abc  123", result);
        }
        {
          Parser<Object> p = new Parser<Object>("abc %-4.5OTT");
          p.setContext(context);
          Node t = p.parse();
          Converter<Object> head = p.compile(t, converterMap);
          String result = write(head, new Object());
          assertEquals("abc 123 ", result);
        }
        {
          Parser<Object> p = new Parser<Object>("abc %3.4hello");
          p.setContext(context);
          Node t = p.parse();
          Converter<Object> head = p.compile(t, converterMap);
          String result = write(head, new Object());
          assertEquals("abc ello", result);
        }
        {
          Parser<Object> p = new Parser<Object>("abc %-3.-4hello");
          p.setContext(context);
          Node t = p.parse();
          Converter<Object> head = p.compile(t, converterMap);
          String result = write(head, new Object());
          assertEquals("abc Hell", result);
        }
      }
    
      @Test
      public void testComposite() throws Exception {
    //    {
    //      Parser<Object> p = new Parser<Object>("%(ABC)");
    //      p.setContext(context);
    //      Node t = p.parse();
    //      Converter<Object> head = p.compile(t, converterMap);
    //      String result = write(head, new Object());
    //      assertEquals("ABC", result);
    //    }
        {
          Context c = new ContextBase();
          Parser<Object> p = new Parser<Object>("%(ABC %hello)");
          p.setContext(c);
          Node t = p.parse();
          Converter<Object> head = p.compile(t, converterMap);
          String result = write(head, new Object());
          StatusPrinter.print(c);
          assertEquals("ABC Hello", result);
        }
        {
          Parser<Object> p = new Parser<Object>("%(ABC %hello)");
          p.setContext(context);
          Node t = p.parse();
          Converter<Object> head = p.compile(t, converterMap);
          String result = write(head, new Object());
          assertEquals("ABC Hello", result);
        }
      }
    
      @Test
      public void testCompositeFormatting() throws Exception {
        {
          Parser<Object> p = new Parser<Object>("xyz %4.10(ABC)");
          p.setContext(context);
          Node t = p.parse();
          Converter<Object> head = p.compile(t, converterMap);
          String result = write(head, new Object());
          assertEquals("xyz  ABC", result);
        }
    
        {
          Parser<Object> p = new Parser<Object>("xyz %-4.10(ABC)");
          p.setContext(context);
          Node t = p.parse();
          Converter<Object> head = p.compile(t, converterMap);
          String result = write(head, new Object());
          assertEquals("xyz ABC ", result);
        }
    
        {
          Parser<Object> p = new Parser<Object>("xyz %.2(ABC %hello)");
          p.setContext(context);
          Node t = p.parse();
          Converter<Object> head = p.compile(t, converterMap);
          String result = write(head, new Object());
          assertEquals("xyz lo", result);
        }
    
        {
          Parser<Object> p = new Parser<Object>("xyz %.-2(ABC)");
          p.setContext(context);
          Node t = p.parse();
          Converter<Object> head = p.compile(t, converterMap);
          String result = write(head, new Object());
          assertEquals("xyz AB", result);
        }
    
        {
          Parser<Object> p = new Parser<Object>("xyz %30.30(ABC %20hello)");
          p.setContext(context);
          Node t = p.parse();
          Converter<Object> head = p.compile(t, converterMap);
          String result = write(head, new Object());
          assertEquals("xyz       ABC                Hello", result);
        }
      }
    
      @Test
      public void testUnknownWord() throws Exception {
        Parser<Object> p = new Parser<Object>("%unknown");
        p.setContext(context);
        Node t = p.parse();
        p.compile(t, converterMap);
        StatusChecker checker = new StatusChecker(context.getStatusManager());
        checker
                .assertContainsMatch("\\[unknown] is not a valid conversion word");
      }
    
      @Test
      public void testWithNopEscape() throws Exception {
        {
          Parser<Object> p = new Parser<Object>("xyz %hello\\_world");
          p.setContext(context);
          Node t = p.parse();
          Converter<Object> head = p.compile(t, converterMap);
          String result = write(head, new Object());
          assertEquals("xyz Helloworld", result);
        }
      }
    
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/pattern/parser/TokenStreamTest.java���0000644�0001750�0001750�00000034655�12136042273�032646� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern.parser;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.fail;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import ch.qos.logback.core.spi.ScanException;
    import org.junit.Test;
    
    import ch.qos.logback.core.pattern.util.AlmostAsIsEscapeUtil;
    
    public class TokenStreamTest {
    
      @Test
      public void testEmpty() throws ScanException {
        try {
          new TokenStream("").tokenize();
          fail("empty string not allowed");
        } catch (IllegalArgumentException e) {
        }
      }
    
      @Test
      public void testSingleLiteral() throws ScanException {
        List tl = new TokenStream("hello").tokenize();
        List<Token> witness = new ArrayList<Token>();
        witness.add(new Token(Token.LITERAL, "hello"));
        assertEquals(witness, tl);
      }
    
      @Test
      public void testLiteralWithPercent() throws ScanException {
        {
          List tl = new TokenStream("hello\\%world").tokenize();
    
          List<Token> witness = new ArrayList<Token>();
          witness.add(new Token(Token.LITERAL, "hello%world"));
          assertEquals(witness, tl);
        }
        {
          List tl = new TokenStream("hello\\%").tokenize();
          List<Token> witness = new ArrayList<Token>();
          witness.add(new Token(Token.LITERAL, "hello%"));
          assertEquals(witness, tl);
        }
    
        {
          List tl = new TokenStream("\\%").tokenize();
          List<Token> witness = new ArrayList<Token>();
          witness.add(new Token(Token.LITERAL, "%"));
          assertEquals(witness, tl);
        }
      }
    
      @Test
      public void testBasic() throws ScanException {
    
        // test "%c"
        {
          List tl = new TokenStream("%c").tokenize();
          List<Token> witness = new ArrayList<Token>();
          witness.add(Token.PERCENT_TOKEN);
          witness.add(new Token(Token.SIMPLE_KEYWORD, "c"));
          assertEquals(witness, tl);
        }
    
        {
          // test "xyz%-34c"
          List tl = new TokenStream("%a%b").tokenize();
          List<Token> witness = new ArrayList<Token>();
          witness.add(Token.PERCENT_TOKEN);
          witness.add(new Token(Token.SIMPLE_KEYWORD, "a"));
          witness.add(Token.PERCENT_TOKEN);
          witness.add(new Token(Token.SIMPLE_KEYWORD, "b"));
          assertEquals(witness, tl);
        }
    
        {
          // test "xyz%-34c"
          List tl = new TokenStream("xyz%-34c").tokenize();
          List<Token> witness = new ArrayList<Token>();
          witness.add(new Token(Token.LITERAL, "xyz"));
          witness.add(Token.PERCENT_TOKEN);
          witness.add(new Token(Token.FORMAT_MODIFIER, "-34"));
          witness.add(new Token(Token.SIMPLE_KEYWORD, "c"));
          assertEquals(witness, tl);
        }
      }
    
      @Test
      public void testComplexNR() throws ScanException {
        List tl = new TokenStream("%d{1234} [%34.-67toto] %n").tokenize();
        List<Token> witness = new ArrayList<Token>();
        witness.add(Token.PERCENT_TOKEN);
        witness.add(new Token(Token.SIMPLE_KEYWORD, "d"));
        List ol = new ArrayList<String>();
        ol.add("1234");
        witness.add(new Token(Token.OPTION, ol));
        witness.add(new Token(Token.LITERAL, " ["));
        witness.add(Token.PERCENT_TOKEN);
        witness.add(new Token(Token.FORMAT_MODIFIER, "34.-67"));
        witness.add(new Token(Token.SIMPLE_KEYWORD, "toto"));
        witness.add(new Token(Token.LITERAL, "] "));
        witness.add(Token.PERCENT_TOKEN);
        witness.add(new Token(Token.SIMPLE_KEYWORD, "n"));
        assertEquals(witness, tl);
      }
    
      @Test
      public void testEmptyP() throws ScanException {
        List tl = new TokenStream("()").tokenize();
        List<Token> witness = new ArrayList<Token>();
        witness.add(new Token(Token.LITERAL, "("));
        witness.add(Token.RIGHT_PARENTHESIS_TOKEN);
        assertEquals(witness, tl);
      }
    
      @Test
      public void testEmptyP2() throws ScanException {
        List tl = new TokenStream("%()").tokenize();
        List<Token> witness = new ArrayList<Token>();
        witness.add(Token.PERCENT_TOKEN);
        witness.add(Token.BARE_COMPOSITE_KEYWORD_TOKEN);
        witness.add(Token.RIGHT_PARENTHESIS_TOKEN);
        assertEquals(witness, tl);
      }
    
      @Test
      public void testEscape() throws ScanException {
        {
          List tl = new TokenStream("\\%").tokenize();
          List<Token> witness = new ArrayList<Token>();
          witness.add(new Token(Token.LITERAL, "%"));
          assertEquals(witness, tl);
        }
    
        {
          List tl = new TokenStream("\\%\\(\\t\\)\\r\\n").tokenize();
          List<Token> witness = new ArrayList<Token>();
          witness.add(new Token(Token.LITERAL, "%(\t)\r\n"));
          assertEquals(witness, tl);
        }
    
        {
          List tl = new TokenStream("\\\\%x").tokenize();
          List<Token> witness = new ArrayList<Token>();
          witness.add(new Token(Token.LITERAL, "\\"));
          witness.add(Token.PERCENT_TOKEN);
          witness.add(new Token(Token.SIMPLE_KEYWORD, "x"));
          assertEquals(witness, tl);
        }
    
        {
          List tl = new TokenStream("%x\\)").tokenize();
          List<Token> witness = new ArrayList<Token>();
          witness.add(Token.PERCENT_TOKEN);
          witness.add(new Token(Token.SIMPLE_KEYWORD, "x"));
          witness.add(new Token(Token.LITERAL, ")"));
          assertEquals(witness, tl);
        }
    
        {
          List tl = new TokenStream("%x\\_a").tokenize();
          List<Token> witness = new ArrayList<Token>();
          witness.add(Token.PERCENT_TOKEN);
          witness.add(new Token(Token.SIMPLE_KEYWORD, "x"));
          witness.add(new Token(Token.LITERAL, "a"));
          assertEquals(witness, tl);
        }
        {
          List tl = new TokenStream("%x\\_%b").tokenize();
          List<Token> witness = new ArrayList<Token>();
          witness.add(Token.PERCENT_TOKEN);
          witness.add(new Token(Token.SIMPLE_KEYWORD, "x"));
          witness.add(Token.PERCENT_TOKEN);
          witness.add(new Token(Token.SIMPLE_KEYWORD, "b"));
          assertEquals(witness, tl);
        }
      }
    
      @Test
      public void testOptions() throws ScanException {
        {
          List tl = new TokenStream("%x{t}").tokenize();
          List<Token> witness = new ArrayList<Token>();
          witness.add(Token.PERCENT_TOKEN);
          witness.add(new Token(Token.SIMPLE_KEYWORD, "x"));
          List ol = new ArrayList<String>();
          ol.add("t");
          witness.add(new Token(Token.OPTION, ol));
          assertEquals(witness, tl);
        }
    
        {
          List tl = new TokenStream("%x{t,y}").tokenize();
          List<Token> witness = new ArrayList<Token>();
          witness.add(Token.PERCENT_TOKEN);
          witness.add(new Token(Token.SIMPLE_KEYWORD, "x"));
          List ol = new ArrayList<String>();
          ol.add("t");
          ol.add("y");
          witness.add(new Token(Token.OPTION, ol));
          assertEquals(witness, tl);
        }
    
        {
          List tl = new TokenStream("%x{\"hello world.\", \"12y  \"}").tokenize();
          List<Token> witness = new ArrayList<Token>();
          witness.add(Token.PERCENT_TOKEN);
          witness.add(new Token(Token.SIMPLE_KEYWORD, "x"));
          List ol = new ArrayList<String>();
          ol.add("hello world.");
          ol.add("12y  ");
          witness.add(new Token(Token.OPTION, ol));
          assertEquals(witness, tl);
        }
    
        {
          List tl = new TokenStream("%x{'opt}'}").tokenize();
          List<Token> witness = new ArrayList<Token>();
          witness.add(Token.PERCENT_TOKEN);
          witness.add(new Token(Token.SIMPLE_KEYWORD, "x"));
          List ol = new ArrayList<String>();
          ol.add("opt}");
          witness.add(new Token(Token.OPTION, ol));
          assertEquals(witness, tl);
        }
      }
    
      @Test
      public void testSimpleP() throws ScanException {
        List tl = new TokenStream("%(hello %class{.4?})").tokenize();
        List<Token> witness = new ArrayList<Token>();
        witness.add(Token.PERCENT_TOKEN);
        witness.add(Token.BARE_COMPOSITE_KEYWORD_TOKEN);
        witness.add(new Token(Token.LITERAL, "hello "));
        witness.add(Token.PERCENT_TOKEN);
        witness.add(new Token(Token.SIMPLE_KEYWORD, "class"));
        List ol = new ArrayList<String>();
         ol.add(".4?");
         witness.add(new Token(Token.OPTION, ol));
        witness.add(Token.RIGHT_PARENTHESIS_TOKEN);
        assertEquals(witness, tl);
      }
    
      @Test
      public void testSimpleP2() throws ScanException {
        List tl = new TokenStream("X %a %-12.550(hello %class{.4?})").tokenize();
        List<Token> witness = new ArrayList<Token>();
        witness.add(new Token(Token.LITERAL, "X "));
        witness.add(Token.PERCENT_TOKEN);
        witness.add(new Token(Token.SIMPLE_KEYWORD, "a"));
        witness.add(new Token(Token.LITERAL, " "));
        witness.add(Token.PERCENT_TOKEN);
        witness.add(new Token(Token.FORMAT_MODIFIER, "-12.550"));
        witness.add(Token.BARE_COMPOSITE_KEYWORD_TOKEN);
        witness.add(new Token(Token.LITERAL, "hello "));
        witness.add(Token.PERCENT_TOKEN);
        witness.add(new Token(Token.SIMPLE_KEYWORD, "class"));
        List ol = new ArrayList<String>();
        ol.add(".4?");
        witness.add(new Token(Token.OPTION, ol));
        witness.add(Token.RIGHT_PARENTHESIS_TOKEN);
        assertEquals(witness, tl);
      }
    
      @Test
      public void testMultipleRecursion() throws ScanException {
        List tl = new TokenStream("%-1(%d %45(%class %file))").tokenize();
        List<Token> witness = new ArrayList<Token>();
        witness.add(Token.PERCENT_TOKEN);
        witness.add(new Token(Token.FORMAT_MODIFIER, "-1"));
        witness.add(Token.BARE_COMPOSITE_KEYWORD_TOKEN);
        witness.add(Token.PERCENT_TOKEN);
        witness.add(new Token(Token.SIMPLE_KEYWORD, "d"));
        witness.add(new Token(Token.LITERAL, " "));
        witness.add(Token.PERCENT_TOKEN);
        witness.add(new Token(Token.FORMAT_MODIFIER, "45"));
        witness.add(Token.BARE_COMPOSITE_KEYWORD_TOKEN);
        witness.add(Token.PERCENT_TOKEN);
        witness.add(new Token(Token.SIMPLE_KEYWORD, "class"));
        witness.add(new Token(Token.LITERAL, " "));
        witness.add(Token.PERCENT_TOKEN);
        witness.add(new Token(Token.SIMPLE_KEYWORD, "file"));
        witness.add(Token.RIGHT_PARENTHESIS_TOKEN);
        witness.add(Token.RIGHT_PARENTHESIS_TOKEN);
    
        assertEquals(witness, tl);
      }
    
      @Test
      public void testNested() throws ScanException {
        List tl = new TokenStream("%(%a%(%b))").tokenize();
        List<Token> witness = new ArrayList<Token>();
        witness.add(Token.PERCENT_TOKEN);
        witness.add(Token.BARE_COMPOSITE_KEYWORD_TOKEN);
        witness.add(Token.PERCENT_TOKEN);
        witness.add(new Token(Token.SIMPLE_KEYWORD, "a"));
        witness.add(Token.PERCENT_TOKEN);
        witness.add(Token.BARE_COMPOSITE_KEYWORD_TOKEN);
        witness.add(Token.PERCENT_TOKEN);
        witness.add(new Token(Token.SIMPLE_KEYWORD, "b"));
        witness.add(Token.RIGHT_PARENTHESIS_TOKEN);
        witness.add(Token.RIGHT_PARENTHESIS_TOKEN);
    
        assertEquals(witness, tl);
    
      }
    
      @Test
      public void testEscapedParanteheses() throws ScanException {
        {
          List tl = new TokenStream("\\(%h\\)").tokenize();
          List<Token> witness = new ArrayList<Token>();
          witness.add(new Token(Token.LITERAL, "("));
          witness.add(Token.PERCENT_TOKEN);
          witness.add(new Token(Token.SIMPLE_KEYWORD, "h"));
          witness.add(new Token(Token.LITERAL, ")"));
          assertEquals(witness, tl);
        }
        {
          List tl = new TokenStream("(%h\\)").tokenize();
          List<Token> witness = new ArrayList<Token>();
          witness.add(new Token(Token.LITERAL, "("));
          witness.add(Token.PERCENT_TOKEN);
          witness.add(new Token(Token.SIMPLE_KEYWORD, "h"));
          witness.add(new Token(Token.LITERAL, ")"));
          assertEquals(witness, tl);
        }
        {
          List tl = new TokenStream("%a(x\\)").tokenize();
          List<Token> witness = new ArrayList<Token>();
          witness.add(Token.PERCENT_TOKEN);
          witness.add(new Token(Token.COMPOSITE_KEYWORD, "a"));
          witness.add(new Token(Token.LITERAL, "x)"));
          assertEquals(witness, tl);
        }
        {
          List tl = new TokenStream("%a\\(x)").tokenize();
          List<Token> witness = new ArrayList<Token>();
          witness.add(Token.PERCENT_TOKEN);
          witness.add(new Token(Token.SIMPLE_KEYWORD, "a"));
          witness.add(new Token(Token.LITERAL, "(x"));
          witness.add(new Token(Token.RIGHT_PARENTHESIS));
    
          assertEquals(witness, tl);
        }
      }
    
      @Test
      public void testWindowsLikeBackSlashes() throws ScanException {
        List tl = new TokenStream("c:\\hello\\world.%i",
                new AlmostAsIsEscapeUtil()).tokenize();
    
        List<Token> witness = new ArrayList<Token>();
        witness.add(new Token(Token.LITERAL, "c:\\hello\\world."));
        witness.add(Token.PERCENT_TOKEN);
        witness.add(new Token(Token.SIMPLE_KEYWORD, "i"));
        assertEquals(witness, tl);
      }
    
      @Test
      public void compositedKeyword() throws ScanException {
        {
          List tl = new TokenStream("%d(A)",
                  new AlmostAsIsEscapeUtil()).tokenize();
          List<Token> witness = new ArrayList<Token>();
          witness.add(Token.PERCENT_TOKEN);
          witness.add(new Token(Token.COMPOSITE_KEYWORD, "d"));
          witness.add(new Token(Token.LITERAL, "A"));
          witness.add(Token.RIGHT_PARENTHESIS_TOKEN);
          assertEquals(witness, tl);
        }
        {
          List tl = new TokenStream("a %subst(%b C)",
                  new AlmostAsIsEscapeUtil()).tokenize();
          List<Token> witness = new ArrayList<Token>();
          witness.add(new Token(Token.LITERAL, "a "));
          witness.add(Token.PERCENT_TOKEN);
          witness.add(new Token(Token.COMPOSITE_KEYWORD, "subst"));
          witness.add(Token.PERCENT_TOKEN);
          witness.add(new Token(Token.SIMPLE_KEYWORD, "b"));
          witness.add(new Token(Token.LITERAL, " C"));
          witness.add(Token.RIGHT_PARENTHESIS_TOKEN);
          assertEquals(witness, tl);
        }
      }
    
      @Test
      public void compositedKeywordFollowedByOptions() throws ScanException {
        {
          List tl = new TokenStream("%d(A){o}",
                  new AlmostAsIsEscapeUtil()).tokenize();
          List<Token> witness = new ArrayList<Token>();
          witness.add(Token.PERCENT_TOKEN);
          witness.add(new Token(Token.COMPOSITE_KEYWORD, "d"));
          witness.add(new Token(Token.LITERAL, "A"));
          witness.add(Token.RIGHT_PARENTHESIS_TOKEN);
          List ol = new ArrayList<String>();
          ol.add("o");
          witness.add(new Token(Token.OPTION, ol));
    
          assertEquals(witness, tl);
        }
      }
    }�����������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000146�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/pattern/parser/OptionTokenizerTest.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/pattern/parser/OptionTokenizerTest.jav0000644�0001750�0001750�00000007432�12136042273�033405� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern.parser;
    
    import org.junit.Test;
    
    public class OptionTokenizerTest {
    
      @Test
       public void testEmpty() {
    
      }
    
    //
    //  @Test
    //  public void testEmpty() throws ScanException {
    //    {
    //      List ol = new OptionTokenizer("").tokenize();
    //      List witness = new ArrayList();
    //      assertEquals(witness, ol);
    //    }
    //
    //    {
    //      List ol = new OptionTokenizer(" ").tokenize();
    //      List witness = new ArrayList();
    //      assertEquals(witness, ol);
    //    }
    //  }
    //
    //  @Test
    //  public void testSimple() throws ScanException {
    //    {
    //      List ol = new OptionTokenizer("abc").tokenize();
    //      List<String> witness = new ArrayList<String>();
    //      witness.add("abc");
    //      assertEquals(witness, ol);
    //    }
    //  }
    //
    //  @Test
    //  public void testSingleQuote() throws ScanException {
    //    {
    //      List ol = new OptionTokenizer("' '").tokenize();
    //      List<String> witness = new ArrayList<String>();
    //      witness.add(" ");
    //      assertEquals(witness, ol);
    //    }
    //
    //    {
    //     List ol = new OptionTokenizer("' x\t'").tokenize();
    //      List<String> witness = new ArrayList<String>();
    //      witness.add(" x\t");
    //      assertEquals(witness, ol);
    //    }
    //
    //    {
    //      List ol = new OptionTokenizer("' x\\t'").tokenize();
    //      List<String> witness = new ArrayList<String>();
    //      witness.add(" x\\t");
    //      assertEquals(witness, ol);
    //    }
    //
    //    {
    //      List ol = new OptionTokenizer("' x\\''").tokenize();
    //      List<String> witness = new ArrayList<String>();
    //      witness.add(" x\\'");
    //      assertEquals(witness, ol);
    //    }
    //  }
    //
    //
    //
    //  @Test
    //  public void testDoubleQuote() throws ScanException {
    //    {
    //      List ol = new OptionTokenizer("\" \"").tokenize();
    //      List<String> witness = new ArrayList<String>();
    //      witness.add(" ");
    //      assertEquals(witness, ol);
    //    }
    //
    //    {
    //      List ol = new OptionTokenizer("\" x\t\"").tokenize();
    //      List<String> witness = new ArrayList<String>();
    //      witness.add(" x\t");
    //      assertEquals(witness, ol);
    //    }
    //
    //    {
    //      List ol = new OptionTokenizer("\" x\\t\"").tokenize();
    //      List<String> witness = new ArrayList<String>();
    //      witness.add(" x\\t");
    //      assertEquals(witness, ol);
    //    }
    //
    //    {
    //      List ol = new OptionTokenizer("\" x\\\"\"").tokenize();
    //      List<String> witness = new ArrayList<String>();
    //      witness.add(" x\\\"");
    //      assertEquals(witness, ol);
    //    }
    //  }
    //
    //  @Test
    //  public void testMultiple() throws ScanException {
    //    {
    //      List ol = new OptionTokenizer("a, b").tokenize();
    //      List<String> witness = new ArrayList<String>();
    //      witness.add("a");
    //      witness.add("b");
    //      assertEquals(witness, ol);
    //    }
    //    {
    //      List ol = new OptionTokenizer("'a', b").tokenize();
    //      List<String> witness = new ArrayList<String>();
    //      witness.add("a");
    //      witness.add("b");
    //      assertEquals(witness, ol);
    //    }
    //    {
    //      List ol = new OptionTokenizer("'', b").tokenize();
    //      List<String> witness = new ArrayList<String>();
    //      witness.add("");
    //      witness.add("b");
    //      assertEquals(witness, ol);
    //    }
    //  }
    //
    }��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/pattern/ExceptionalConverter.java�����0000644�0001750�0001750�00000001477�12136042273�032415� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern;
    
    import ch.qos.logback.core.pattern.DynamicConverter;
    
    public class ExceptionalConverter extends DynamicConverter {
      
      public String convert(Object event) {
        if(!isStarted()) {
          throw new IllegalStateException("this converter must be started before use");
        }
        return "";
      }
    
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/pattern/Converter123.java�������������0000644�0001750�0001750�00000001304�12136042273�030434� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern;
    
    import ch.qos.logback.core.pattern.DynamicConverter;
    
    public class Converter123 extends DynamicConverter {
    
      public String convert(Object event) {
        return "123";
      }
    
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/pattern/PackageTest.java��������������0000644�0001750�0001750�00000001426�12136042273�030437� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern;
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    import org.junit.runners.Suite.SuiteClasses;
    
    @RunWith(Suite.class)
    @SuiteClasses({SpacePadderTest.class, ch.qos.logback.core.pattern.parser.PackageTest.class})
    public class PackageTest  {
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/pattern/ConverterHello.java�����������0000644�0001750�0001750�00000001310�12136042273�031167� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern;
    
    import ch.qos.logback.core.pattern.DynamicConverter;
    
    public class ConverterHello extends DynamicConverter {
    
      public String convert(Object event) {
        return "Hello";
      }
    
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/pattern/SpacePadderTest.java����������0000644�0001750�0001750�00000005065�12136042273�031262� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.pattern;
    
    import static org.junit.Assert.assertEquals;
    
    import org.junit.After;
    import org.junit.AfterClass;
    import org.junit.Before;
    import org.junit.BeforeClass;
    import org.junit.Test;
    
    public class SpacePadderTest {
    
      @BeforeClass
      public static void setUpBeforeClass() throws Exception {
      }
    
      @AfterClass
      public static void tearDownAfterClass() throws Exception {
      }
    
      @Before
      public void setUp() throws Exception {
      }
    
      @After
      public void tearDown() throws Exception {
      }
    
      @Test
      public void smoke() {
        {
          StringBuilder buf = new StringBuilder();
          String s = "a";
          SpacePadder.leftPad(buf, s, 4);
          assertEquals("   a", buf.toString());
        }
        {
          StringBuilder buf = new StringBuilder();
          String s = "a";
          SpacePadder.rightPad(buf, s, 4);
          assertEquals("a   ", buf.toString());
        }
      }
    
      @Test
      public void nullString() {
        String s = null;
        {
          StringBuilder buf = new StringBuilder();
          SpacePadder.leftPad(buf, s, 2);
          assertEquals("  ", buf.toString());
        }
        {
          StringBuilder buf = new StringBuilder();
          SpacePadder.rightPad(buf, s, 2);
          assertEquals("  ", buf.toString());
        }
      }
    
      @Test
      public void longString() {
        {
          StringBuilder buf = new StringBuilder();
          String s = "abc";
          SpacePadder.leftPad(buf, s, 2);
          assertEquals(s, buf.toString());
        }
    
        {
          StringBuilder buf = new StringBuilder();
          String s = "abc";
          SpacePadder.rightPad(buf, s, 2);
          assertEquals(s, buf.toString());
        }
      }
      
      @Test
      public void lengthyPad() {
        {
          StringBuilder buf = new StringBuilder();
          String s = "abc";
          SpacePadder.leftPad(buf, s, 33);
          assertEquals("                              abc", buf.toString());
        }
        {
          StringBuilder buf = new StringBuilder();
          String s = "abc";
          SpacePadder.rightPad(buf, s, 33);
          assertEquals("abc                              ", buf.toString());
        }
        
      }
    
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/subst/��������������������������������0000755�0001750�0001750�00000000000�12203357067�025066� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/subst/ParserTest.java�����������������0000644�0001750�0001750�00000013406�12143151241�030016� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.subst;
    
    import ch.qos.logback.core.spi.ScanException;
    import org.junit.Test;
    
    import static org.junit.Assert.assertEquals;
    
    /**
     * Created with IntelliJ IDEA.
     * User: ceki
     * Date: 05.08.12
     * Time: 00:15
     * To change this template use File | Settings | File Templates.
     */
    public class ParserTest {
    
    
      @Test
      public void literal() throws ScanException {
        Tokenizer tokenizer = new Tokenizer("abc");
        Parser parser = new Parser(tokenizer.tokenize());
        Node node = parser.parse();
        Node witness = new Node(Node.Type.LITERAL, "abc");
        assertEquals(witness, node);
      }
    
      @Test
      public void literalWithAccolade0() throws ScanException {
        Tokenizer tokenizer = new Tokenizer("{}");
        Parser parser = new Parser(tokenizer.tokenize());
        Node node = parser.parse();
        Node witness = new Node(Node.Type.LITERAL, "{");
        witness.next = new Node(Node.Type.LITERAL, "}");
        assertEquals(witness, node);
      }
    
      @Test
      public void literalWithAccolade1() throws ScanException {
        Tokenizer tokenizer = new Tokenizer("%x{a}");
        Parser parser = new Parser(tokenizer.tokenize());
        Node node = parser.parse();
        Node witness = new Node(Node.Type.LITERAL, "%x");
        Node t = witness.next = new Node(Node.Type.LITERAL, "{");
        t.next = new Node(Node.Type.LITERAL, "a");
        t = t.next;
        t.next = new Node(Node.Type.LITERAL, "}");
        assertEquals(witness, node);
      }
    
      @Test
      public void literalWithTwoAccolades() throws ScanException {
        Tokenizer tokenizer = new Tokenizer("%x{y} %a{b} c");
    
        Parser parser = new Parser(tokenizer.tokenize());
        Node node = parser.parse();
        Node witness = new Node(Node.Type.LITERAL, "%x");
    
        Node t = witness.next = new Node(Node.Type.LITERAL, "{");
        t.next = new Node(Node.Type.LITERAL, "y");
        t = t.next;
    
        t.next = new Node(Node.Type.LITERAL, "}");
        t = t.next;
    
        t.next = new Node(Node.Type.LITERAL, " %a");
        t = t.next;
    
        t.next = new Node(Node.Type.LITERAL, "{");
        t = t.next;
    
        t.next = new Node(Node.Type.LITERAL, "b");
        t = t.next;
    
        t.next = new Node(Node.Type.LITERAL, "}");
        t = t.next;
    
        t.next = new Node(Node.Type.LITERAL, " c");
    
        node.dump();
        System.out.println("");
        assertEquals(witness, node);
      }
    
      @Test
      public void variable() throws ScanException {
        Tokenizer tokenizer = new Tokenizer("${abc}");
        Parser parser = new Parser(tokenizer.tokenize());
        Node node = parser.parse();
        Node witness = new Node(Node.Type.VARIABLE, new Node(Node.Type.LITERAL, "abc"));
        assertEquals(witness, node);
      }
    
      @Test
      public void literalVariableLiteral() throws ScanException {
        Tokenizer tokenizer = new Tokenizer("a${b}c");
        Parser parser = new Parser(tokenizer.tokenize());
        Node node = parser.parse();
        Node witness = new Node(Node.Type.LITERAL, "a");
        witness.next = new Node(Node.Type.VARIABLE, new Node(Node.Type.LITERAL, "b"));
        witness.next.next = new Node(Node.Type.LITERAL, "c");
        assertEquals(witness, node);
      }
    
    
      // /LOGBACK-744
      @Test
      public void withColon() throws ScanException {
        Tokenizer tokenizer = new Tokenizer("a:${b}");
        Parser parser = new Parser(tokenizer.tokenize());
        Node node = parser.parse();
        Node witness = new Node(Node.Type.LITERAL, "a");
        Node t = witness.next = new Node(Node.Type.LITERAL, ":");
        t.next = new Node(Node.Type.VARIABLE, new Node(Node.Type.LITERAL, "b"));
        assertEquals(witness, node);
      }
    
      @Test
      public void nested() throws ScanException {
        Tokenizer tokenizer = new Tokenizer("a${b${c}}d");
        Parser parser = new Parser(tokenizer.tokenize());
        Node node = parser.parse();
        Node witness = new Node(Node.Type.LITERAL, "a");
        Node bLiteralNode = new Node(Node.Type.LITERAL, "b");
        Node cLiteralNode = new Node(Node.Type.LITERAL, "c");
        Node bVariableNode = new Node(Node.Type.VARIABLE, bLiteralNode);
        Node cVariableNode = new Node(Node.Type.VARIABLE, cLiteralNode);
        bLiteralNode.next = cVariableNode;
    
        witness.next = bVariableNode;
        witness.next.next = new Node(Node.Type.LITERAL, "d");
        assertEquals(witness, node);
      }
    
      @Test
      public void withDefault() throws ScanException {
        Tokenizer tokenizer = new Tokenizer("${b:-c}");
        Parser parser = new Parser(tokenizer.tokenize());
        Node node = parser.parse();
        Node witness = new Node(Node.Type.VARIABLE, new Node(Node.Type.LITERAL, "b"));
        witness.defaultPart = new Node(Node.Type.LITERAL, "c");
        assertEquals(witness, node);
      }
    
      @Test
      public void defaultSeparatorOutsideOfAVariable() throws ScanException {
        Tokenizer tokenizer = new Tokenizer("{a:-b}");
        Parser parser = new Parser(tokenizer.tokenize());
        Node node = parser.parse();
    
        dump(node);
        Node witness = new Node(Node.Type.LITERAL, "{");
        Node t = witness.next = new Node(Node.Type.LITERAL, "a");
    
    
        t.next = new Node(Node.Type.LITERAL, ":-");
        t = t.next;
    
        t.next = new Node(Node.Type.LITERAL, "b");
        t = t.next;
    
        t.next = new Node(Node.Type.LITERAL, "}");
    
        assertEquals(witness, node);
      }
    
      private void dump(Node node) {
        while (node != null) {
          System.out.println(node.toString());
          node = node.next;
        }
      }
    
    
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/subst/NodeToStringTransformerTest.java0000644�0001750�0001750�00000011546�12140676676�033414� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.subst;
    
    import ch.qos.logback.core.ContextBase;
    import ch.qos.logback.core.spi.ScanException;
    import org.junit.Before;
    import org.junit.Test;
    
    import static org.junit.Assert.assertEquals;
    
    /**
     * @author Ceki G&uuml;c&uuml;
     */
    public class NodeToStringTransformerTest {
    
      ContextBase propertyContainer0 = new ContextBase();
    
    
      @Before
      public void setUp() {
        propertyContainer0.putProperty("k0", "v0");
        propertyContainer0.putProperty("zero", "0");
        propertyContainer0.putProperty("v0.jdbc.url", "http://..");
        propertyContainer0.putProperty("host", "local");
    
      }
    
      private Node makeNode(String input) throws ScanException {
        Tokenizer tokenizer = new Tokenizer(input);
        Parser parser = new Parser(tokenizer.tokenize());
        return parser.parse();
      }
    
      @Test
      public void literal() throws ScanException {
        String input = "abv";
        Node node = makeNode(input);
        NodeToStringTransformer nodeToStringTransformer = new NodeToStringTransformer(node, propertyContainer0);
        assertEquals(input, nodeToStringTransformer.transform());
      }
    
    
      void checkInputEqualsOutput(String input) throws ScanException {
        Node node = makeNode(input);
        NodeToStringTransformer nodeToStringTransformer = new NodeToStringTransformer(node, propertyContainer0);
        assertEquals(input, nodeToStringTransformer.transform());
      }
    
      @Test
      public void literalWithNestedAccolades() throws ScanException {
        checkInputEqualsOutput("%logger{35}");
        checkInputEqualsOutput("%a{35} %b{35} c");
        checkInputEqualsOutput("%replace(%msg){'\\d{14,16}', 'XXXX'}");
        checkInputEqualsOutput("TEST %d{HHmmssSSS} [%thread] %-5level %logger{36} - %msg%n");
      }
    
    
      @Test
      public void variable() throws ScanException {
        String input = "${k0}";
        Node node = makeNode(input);
        NodeToStringTransformer nodeToStringTransformer = new NodeToStringTransformer(node, propertyContainer0);
        assertEquals("v0", nodeToStringTransformer.transform());
      }
    
      @Test
      public void literalVariableLiteral() throws ScanException {
        String input = "a${k0}c";
        Node node = makeNode(input);
        NodeToStringTransformer nodeToStringTransformer = new NodeToStringTransformer(node, propertyContainer0);
        assertEquals("av0c", nodeToStringTransformer.transform());
      }
    
      @Test
      public void nestedVariable() throws ScanException {
        String input = "a${k${zero}}b";
        Node node = makeNode(input);
        NodeToStringTransformer nodeToStringTransformer = new NodeToStringTransformer(node, propertyContainer0);
        assertEquals("av0b", nodeToStringTransformer.transform());
      }
    
      @Test
      public void LOGBACK729() throws ScanException {
        String input = "${${k0}.jdbc.url}";
        Node node = makeNode(input);
        NodeToStringTransformer nodeToStringTransformer = new NodeToStringTransformer(node, propertyContainer0);
        assertEquals("http://..", nodeToStringTransformer.transform());
      }
    
      @Test
      public void LOGBACK744_withColon() throws ScanException {
        String input = "%d{HH:mm:ss.SSS} host:${host} %logger{36} - %msg%n";
        Node node = makeNode(input);
        NodeToStringTransformer nodeToStringTransformer = new NodeToStringTransformer(node, propertyContainer0);
        System.out.println(nodeToStringTransformer.transform());
        assertEquals("%d{HH:mm:ss.SSS} host:local %logger{36} - %msg%n", nodeToStringTransformer.transform());
      }
    
      @Test
      public void loneColonShouldReadLikeAnyOtherCharacter() throws ScanException {
        String input = "java:comp/env/jdbc/datasource";
        Node node = makeNode(input);
        NodeToStringTransformer nodeToStringTransformer = new NodeToStringTransformer(node, propertyContainer0);
        assertEquals(input, nodeToStringTransformer.transform());
      }
    
      @Test
      public void withDefaultValue() throws ScanException {
        String input = "${k67:-b}c";
        Node node = makeNode(input);
        NodeToStringTransformer nodeToStringTransformer = new NodeToStringTransformer(node, propertyContainer0);
        assertEquals("bc", nodeToStringTransformer.transform());
      }
    
      @Test
      public void defaultValueNestedAsVar() throws ScanException {
        String input = "a${k67:-x${k0}}c";
        Node node = makeNode(input);
        NodeToStringTransformer nodeToStringTransformer = new NodeToStringTransformer(node, propertyContainer0);
        assertEquals("axv0c", nodeToStringTransformer.transform());
      }
    
    
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/subst/TokenizerTest.java��������������0000644�0001750�0001750�00000011770�12143151241�030536� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.subst;
    
    import ch.qos.logback.core.spi.ScanException;
    import org.junit.Test;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import static org.junit.Assert.assertEquals;
    
    public class TokenizerTest {
    
      List<Token> witnessList = new ArrayList<Token>();
    
      @Test
      public void literalOnly() throws ScanException {
        String input = "abc";
        Tokenizer tokenizer = new Tokenizer(input);
        List<Token> tokenList = tokenizer.tokenize();
        witnessList.add(new Token(Token.Type.LITERAL, input));
        assertEquals(witnessList, tokenList);
      }
    
      @Test
      public void literalWithAccolades() throws ScanException {
        String input0 = "%logger";
        String input1 = "24";
       String input2 = " - %m";
        String input = input0+"{"+input1+"}"+input2;
        Tokenizer tokenizer = new Tokenizer(input);
        List<Token> tokenList = tokenizer.tokenize();
        witnessList.add(new Token(Token.Type.LITERAL, input0));
        witnessList.add(Token.CURLY_LEFT_TOKEN);
        witnessList.add(new Token(Token.Type.LITERAL, input1));
    
        witnessList.add(Token.CURLY_RIGHT_TOKEN);
        witnessList.add(new Token(Token.Type.LITERAL, input2));
        assertEquals(witnessList, tokenList);
      }
    
    
      @Test
      public void simleVariable() throws ScanException {
        String input = "${abc}";
        Tokenizer tokenizer = new Tokenizer(input);
        List<Token> tokenList = tokenizer.tokenize();
        witnessList.add(Token.START_TOKEN);
        witnessList.add(new Token(Token.Type.LITERAL, "abc"));
        witnessList.add(Token.CURLY_RIGHT_TOKEN);
        assertEquals(witnessList, tokenList);
      }
    
      @Test
      public void mix() throws ScanException {
        String input = "a${b}c";
        Tokenizer tokenizer = new Tokenizer(input);
        List<Token> tokenList = tokenizer.tokenize();
        witnessList.add(new Token(Token.Type.LITERAL, "a"));
        witnessList.add(Token.START_TOKEN);
        witnessList.add(new Token(Token.Type.LITERAL, "b"));
        witnessList.add(Token.CURLY_RIGHT_TOKEN);
        witnessList.add(new Token(Token.Type.LITERAL, "c"));
        assertEquals(witnessList, tokenList);
      }
    
      @Test
      public void nested() throws ScanException {
        String input = "a${b${c}}";
        Tokenizer tokenizer = new Tokenizer(input);
        List<Token> tokenList = tokenizer.tokenize();
        witnessList.add(new Token(Token.Type.LITERAL, "a"));
        witnessList.add(Token.START_TOKEN);
        witnessList.add(new Token(Token.Type.LITERAL, "b"));
        witnessList.add(Token.START_TOKEN);
        witnessList.add(new Token(Token.Type.LITERAL, "c"));
        witnessList.add(Token.CURLY_RIGHT_TOKEN);
        witnessList.add(Token.CURLY_RIGHT_TOKEN);
        assertEquals(witnessList, tokenList);
      }
    
    
      @Test
      public void basicDefaultSeparator() throws ScanException {
        String input = "${a:-b}";
        Tokenizer tokenizer = new Tokenizer(input);
        List<Token> tokenList = tokenizer.tokenize();
        witnessList.add(Token.START_TOKEN);
        witnessList.add(new Token(Token.Type.LITERAL, "a"));
        witnessList.add(Token.DEFAULT_SEP_TOKEN);
        witnessList.add(new Token(Token.Type.LITERAL, "b"));
        witnessList.add(Token.CURLY_RIGHT_TOKEN);
        assertEquals(witnessList, tokenList);
      }
    
      @Test
      public void colon() throws ScanException {
        String input = "a:b";
        Tokenizer tokenizer = new Tokenizer(input);
        List<Token> tokenList = tokenizer.tokenize();
        witnessList.add(new Token(Token.Type.LITERAL, "a"));
        witnessList.add(new Token(Token.Type.LITERAL, ":b"));
        assertEquals(witnessList, tokenList);
      }
    
    
      // /LOGBACK-744
      @Test
      public void colonFollowedByDollar() throws ScanException {
        String input = "a:${b}";
        Tokenizer tokenizer = new Tokenizer(input);
        List<Token> tokenList = tokenizer.tokenize();
        witnessList.add(new Token(Token.Type.LITERAL, "a"));
        witnessList.add(new Token(Token.Type.LITERAL, ":"));
        witnessList.add(Token.START_TOKEN);
        witnessList.add(new Token(Token.Type.LITERAL, "b"));
        witnessList.add(Token.CURLY_RIGHT_TOKEN);
        assertEquals(witnessList, tokenList);
      }
    
      @Test
      public void defaultSeparatorOutsideVariable() throws ScanException {
    
        String input = "{a:-b}";
        Tokenizer tokenizer = new Tokenizer(input);
        List<Token> tokenList = tokenizer.tokenize();
        witnessList.add(Token.CURLY_LEFT_TOKEN);
        witnessList.add(new Token(Token.Type.LITERAL, "a"));
        witnessList.add(Token.DEFAULT_SEP_TOKEN);
        witnessList.add(new Token(Token.Type.LITERAL, "b"));
        witnessList.add(Token.CURLY_RIGHT_TOKEN);
        assertEquals(witnessList, tokenList);
      }
    
    
      }
    ��������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/subst/PackageTest.java����������������0000644�0001750�0001750�00000001354�12136042273�030122� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.subst;
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    
    
    @RunWith(Suite.class)
    @Suite.SuiteClasses({TokenizerTest.class, ParserTest.class, NodeToStringTransformerTest.class})
    
    public class PackageTest {
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/layout/�������������������������������0000755�0001750�0001750�00000000000�12203357067�025243� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/layout/DummyLayout.java���������������0000644�0001750�0001750�00000001651�12136042272�030374� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.layout;
    
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.LayoutBase;
    
    public class DummyLayout<E> extends LayoutBase<E> {
    
      public static final String DUMMY = "dummy"+CoreConstants.LINE_SEPARATOR;
      String val = DUMMY;
      
      public DummyLayout() {
      }
      
      public DummyLayout(String val) {
        this.val = val;
      }
      
      public String doLayout(E event) {
        return val;
      }
    
      
    }
    ���������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/layout/NopLayout.java�����������������0000644�0001750�0001750�00000001253�12136042272�030033� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.layout;
    
    import ch.qos.logback.core.LayoutBase;
    
    public class NopLayout<E> extends LayoutBase<E> {
      
      public String doLayout(E event) {
        return "";
      }
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/encoder/������������������������������0000755�0001750�0001750�00000000000�12203357067�025345� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/encoder/ByteArrayUtilTest.java��������0000644�0001750�0001750�00000002610�12136042272�031601� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.encoder;
    
    import static org.junit.Assert.*;
    
    import java.util.Random;
    
    import org.junit.Test;
    
    public class ByteArrayUtilTest {
    
      int BA_SIZE = 16;
      byte[] byteArray = new byte[BA_SIZE];
    
      Random random = new Random(18532235);
      
      @Test
      public void smoke() {
        verifyLoop(byteArray, 0, 0);
        verifyLoop(byteArray, 0, 10);
        verifyLoop(byteArray, 0, Integer.MAX_VALUE);
        verifyLoop(byteArray, 0, Integer.MIN_VALUE);
      }
    
      @Test
      public void random() {
        for(int i = 0; i < 100000; i++) {
          int rOffset = random.nextInt(BA_SIZE-4);
          int rInt = random.nextInt();
          verifyLoop(byteArray, rOffset, rInt);
        }
      }
      
      void verifyLoop(byte[] ba, int offset, int expected) {
        ByteArrayUtil.writeInt(byteArray, offset, expected);
        int back = ByteArrayUtil.readInt(byteArray, offset);
        assertEquals(expected, back);
        
      }
    
    }
    ������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/encoder/NopEncoder.java���������������0000644�0001750�0001750�00000001466�12136042272�030245� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.encoder;
    
    import java.io.IOException;
    import java.io.OutputStream;
    
    public class NopEncoder<E> extends EncoderBase<E> {
      
      public void close() throws IOException {
      }
    
      public void doEncode(E event) throws IOException {
      }
    
      public void init(OutputStream os) throws IOException {
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/encoder/PackageTest.java��������������0000644�0001750�0001750�00000001332�12136042272�030374� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.encoder;
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    
    @RunWith(Suite.class)
    @Suite.SuiteClasses( { ByteArrayUtilTest.class, ObjectEncodeDecodeTest.class })
    public class PackageTest {
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/encoder/ObjectEncodeDecodeTest.java���0000644�0001750�0001750�00000005170�12136042272�032475� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.encoder;
    
    import static org.junit.Assert.assertEquals;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    
    import org.junit.Before;
    import org.junit.Test;
    
    import ch.qos.logback.core.testUtil.RandomUtil;
    import ch.qos.logback.core.util.CoreTestConstants;
    
    public class ObjectEncodeDecodeTest {
    
      ObjectStreamEncoder<String> encoder = new ObjectStreamEncoder<String>();
      EventObjectInputStream<String> eventStream;
    
      int diff = RandomUtil.getPositiveInt();
      protected String randomOutputDir = CoreTestConstants.OUTPUT_DIR_PREFIX + diff
          + "/";
    
      @Before
      public void setUp() {
        File randomOupurDirFile = new File(randomOutputDir);
        randomOupurDirFile.mkdirs();
      }
    
      void encodeList(File file, List<String> list) throws IOException {
        FileOutputStream fos = new FileOutputStream(file);
        encoder.init(fos);
        for (String s: list) {
          encoder.doEncode(s);
        }
        encoder.close();
        fos.close();
      }
      
      
      List<String> decodeList(File file) throws IOException {
        FileInputStream fis = new FileInputStream(file);
        eventStream = new EventObjectInputStream<String>(fis);
        List<String> back = new ArrayList<String>();
        String e;
        while((e=eventStream.readEvent()) != null) {
          back.add(e);
        }
        return back;
      }
    
      @Test
      public void singleBatch() throws IOException {
        File file = new File(randomOutputDir + "x.lbo");
    
        List<String> witness = new ArrayList<String>();
        for (int i = 0; i < 10; i++) {
          witness.add("hello" + i);
        }
        encodeList(file, witness);
        List<String> back = decodeList(file);
        assertEquals(witness, back);
      }
    
      @Test
      public void multipleBatches() throws IOException {
        File file = new File(randomOutputDir + "m.lbo");
    
        List<String> witness = new ArrayList<String>();
        for (int i = 0; i < 100*10; i++) {
          witness.add("hello" + i);
        }
        encodeList(file, witness);
        List<String> back = decodeList(file);
        assertEquals(witness, back);
      }
    
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/encoder/DummyEncoder.java�������������0000644�0001750�0001750�00000005145�12136042272�030602� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.encoder;
    
    import java.io.IOException;
    import java.io.OutputStream;
    
    import ch.qos.logback.core.CoreConstants;
    
    public class DummyEncoder<E> extends EncoderBase<E> {
    
      public static final String DUMMY = "dummy" + CoreConstants.LINE_SEPARATOR;
      String val = DUMMY;
      String fileHeader;
      String fileFooter;
      String encodingName;
    
      public String getEncodingName() {
        return encodingName;
      }
    
      public void setEncodingName(String encodingName) {
        this.encodingName = encodingName;
      }
    
      public DummyEncoder() {
      }
    
      public DummyEncoder(String val) {
        this.val = val;
      }
    
      public void doEncode(E event) throws IOException {
        writeOut(val);
      }
    
      private void appendIfNotNull(StringBuilder sb, String s) {
        if (s != null) {
          sb.append(s);
        }
      }
    
      void writeOut(String s) throws IOException {
        if (encodingName == null) {
          outputStream.write(s.getBytes());
        } else {
          outputStream.write(s.getBytes(encodingName));
        }
      }
    
      void writeHeader() throws IOException {
        StringBuilder sb = new StringBuilder();
        appendIfNotNull(sb, fileHeader);
        if (sb.length() > 0) {
          sb.append(CoreConstants.LINE_SEPARATOR);
          // If at least one of file header or presentation header were not
          // null, then append a line separator.
          // This should be useful in most cases and should not hurt.
          writeOut(sb.toString());
        }
      }
    
      public void init(OutputStream os) throws IOException {
        super.init(os);
        writeHeader();
      }
    
      public void close() throws IOException {
        if (fileFooter == null) {
          return;
        }
        if (encodingName == null) {
          outputStream.write(fileFooter.getBytes());
        } else {
          outputStream.write(fileFooter.getBytes(encodingName));
        }
      }
    
      public String getFileHeader() {
        return fileHeader;
      }
    
      public void setFileHeader(String fileHeader) {
        this.fileHeader = fileHeader;
      }
    
      public String getFileFooter() {
        return fileFooter;
      }
    
      public void setFileFooter(String fileFooter) {
        this.fileFooter = fileFooter;
      }
    
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/LifeCycleManagerTest.java�������������0000644�0001750�0001750�00000002011�12136042272�030547� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2011, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    
    package ch.qos.logback.core;
    
    import static org.junit.Assert.assertFalse;
    
    import org.junit.Test;
    
    
    /**
     * Unit tests for {@link LifeCycleManager}.
     *
     * @author Carl Harris
     */
    public class LifeCycleManagerTest {
    
      private LifeCycleManager manager = new LifeCycleManager();
      
      @Test
      public void testRegisterAndReset() {
        MockLifeCycleComponent component = new MockLifeCycleComponent();
        manager.register(component);
        component.start();
        manager.reset();
        assertFalse(component.isStarted());
      }
    
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/PackageTest.java����������������������0000644�0001750�0001750�00000001605�12136042272�026760� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core;
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    import org.junit.runners.Suite.SuiteClasses;
    
    @RunWith(Suite.class)
    @SuiteClasses({ContextBaseTest.class,
            OutputStreamAppenderTest.class,
            FileAppenderResilienceTest.class,
            FileAppenderResilience_AS_ROOT_Test.class,
            AsyncAppenderBaseTest.class})
    public class PackageTest {
    }
    ���������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/OutputStreamAppenderTest.java���������0000644�0001750�0001750�00000007624�12136042272�031567� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core;
    
    
    import static org.junit.Assert.assertTrue;
    
    import java.io.ByteArrayOutputStream;
    
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import ch.qos.logback.core.encoder.LayoutWrappingEncoder;
    import ch.qos.logback.core.pattern.parser.SamplePatternLayout;
    
    public class OutputStreamAppenderTest {
    
      Context context = new ContextBase();
      
      @Before
      public void setUp() throws Exception {
      }
    
      @After
      public void tearDown() throws Exception {
      }
    
      @Test
      public void smoke() {
        String FILE_HEADER = "FILE_HEADER ";
        String PRESENTATION_HEADER = "PRESENTATION_HEADER";
        String PRESENTATION_FOOTER = "PRESENTATION_FOOTER ";
        String FILE_FOOTER = "FILE_FOOTER";
        headerFooterCheck(FILE_HEADER, PRESENTATION_HEADER, PRESENTATION_FOOTER, FILE_FOOTER);
      }
    
      @Test
      public void nullFileHeader() {
        String FILE_HEADER = null;
        String PRESENTATION_HEADER = "PRESENTATION_HEADER";
        String PRESENTATION_FOOTER = "PRESENTATION_FOOTER ";
        String FILE_FOOTER = "FILE_FOOTER";
        headerFooterCheck(FILE_HEADER, PRESENTATION_HEADER, PRESENTATION_FOOTER, FILE_FOOTER);
      }
    
      @Test
      public void nullPresentationHeader() {
        String FILE_HEADER = "FILE_HEADER ";
        String PRESENTATION_HEADER = null;
        String PRESENTATION_FOOTER = "PRESENTATION_FOOTER ";
        String FILE_FOOTER = "FILE_FOOTER";
        headerFooterCheck(FILE_HEADER, PRESENTATION_HEADER, PRESENTATION_FOOTER, FILE_FOOTER);
      }
    
      @Test
      public void nullPresentationFooter() {
        String FILE_HEADER = "FILE_HEADER ";
        String PRESENTATION_HEADER =  "PRESENTATION_HEADER";
        String PRESENTATION_FOOTER = null;
        String FILE_FOOTER = "FILE_FOOTER";
        headerFooterCheck(FILE_HEADER, PRESENTATION_HEADER, PRESENTATION_FOOTER, FILE_FOOTER);
      }
      
      @Test
      public void nullFileFooter() {
        String FILE_HEADER = "FILE_HEADER ";
        String PRESENTATION_HEADER = "PRESENTATION_HEADER";
        String PRESENTATION_FOOTER = "PRESENTATION_FOOTER ";
        String FILE_FOOTER = null;
        headerFooterCheck(FILE_HEADER, PRESENTATION_HEADER, PRESENTATION_FOOTER, FILE_FOOTER);
      }
      
      public void headerFooterCheck(String fileHeader, String presentationHeader, String presentationFooter, String fileFooter) {
        OutputStreamAppender<Object> wa = new OutputStreamAppender<Object>();
        wa.setContext(context);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
     
        SamplePatternLayout<Object> spl = new SamplePatternLayout<Object>();
        spl.setContext(context);
      
        spl.setFileHeader(fileHeader);
        spl.setPresentationHeader(presentationHeader);
        spl.setPresentationFooter(presentationFooter);
        spl.setFileFooter(fileFooter);
      
        spl.start();
        LayoutWrappingEncoder<Object> encoder = new LayoutWrappingEncoder<Object>();
        encoder.setLayout(spl);
        encoder.setContext(context);
        
        wa.setEncoder(encoder);
        wa.setOutputStream(baos);
        wa.start();
        
        wa.stop();
        String result = baos.toString();
    
        String expectedHeader = emtptyIfNull(fileHeader) + emtptyIfNull(presentationHeader);
    
        System.out.println(result);
        assertTrue(result, result.startsWith(expectedHeader));
    
        String expectedFooter = emtptyIfNull(presentationFooter) + emtptyIfNull(fileFooter);
        assertTrue(result, result.endsWith(expectedFooter));
      }
      
      String emtptyIfNull(String s) {
        return s == null ? "" : s;
      }
    }
    ������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/status/�������������������������������0000755�0001750�0001750�00000000000�12203357067�025251� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/status/TrivialStatusListener.java�����0000644�0001750�0001750�00000002202�12136042273�032427� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.status;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import ch.qos.logback.core.spi.LifeCycle;
    import ch.qos.logback.core.status.Status;
    import ch.qos.logback.core.status.StatusListener;
    
    public class TrivialStatusListener implements StatusListener, LifeCycle {
    
      public List<Status> list = new ArrayList<Status>();
      boolean start = false;
    
      public void addStatusEvent(Status status) {
        if(!isStarted())
          return;
        list.add(status);
      }
    
      public void start() {
        start = true;
      }
    
      public void stop() {
        start = false;
      }
    
      public boolean isStarted() {
        return start;
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/status/StatusChecker.java�������������0000644�0001750�0001750�00000002377�12136042273�030670� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    
    package ch.qos.logback.core.status;
    
    import ch.qos.logback.core.Context;
    
    import static org.junit.Assert.assertTrue;
    
    /**
     * Extend  StatusUtil with assertions.
     */
    public class StatusChecker extends StatusUtil {
    
      public StatusChecker(StatusManager sm) {
        super(sm);
      }
    
      public StatusChecker(Context context) {
        super(context);
      }
    
      public void assertContainsMatch(int level, String regex) {
        assertTrue(containsMatch(level, regex));
      }
    
      public void assertContainsMatch(String regex) {
        assertTrue(containsMatch(regex));
      }
    
      public void asssertContainsException(Class<?> scanExceptionClass) {
        assertTrue(containsException(scanExceptionClass));
      }
    
      public void assertIsErrorFree() {
        assertTrue(isErrorFree(0));
      }
    
    
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/status/PackageTest.java���������������0000644�0001750�0001750�00000001317�12136042273�030304� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.status;
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    
    
    @RunWith(Suite.class)
    @Suite.SuiteClasses({StatusBaseTest.class, StatusUtilTest.class})
    
    public class PackageTest {
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/status/StatusUtilTest.java������������0000644�0001750�0001750�00000003212�12136042273�031066� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.status;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.ContextBase;
    import ch.qos.logback.core.CoreConstants;
    import org.junit.Test;
    
    import static junit.framework.Assert.assertEquals;
    import static org.junit.Assert.assertTrue;
    
    /**
     * @author Ceki G&uuml;c&uuml;
     */
    public class StatusUtilTest {
    
      Context context = new ContextBase();
      StatusUtil statusUtil = new StatusUtil(context);
    
      @Test
      public void emptyStatusListShouldResultInNotFound() {
        assertEquals(-1, statusUtil.timeOfLastReset());
      }
    
      @Test
      public void withoutResetsStatusUtilShouldReturnNotFound() {
        context.getStatusManager().add(new InfoStatus("test", this));
        assertEquals(-1, statusUtil.timeOfLastReset());
      }
    
      @Test
      public void statusListShouldReturnLastResetTime() {
        context.getStatusManager().add(new InfoStatus("test", this));
        long resetTime = System.currentTimeMillis();
        context.getStatusManager().add(new InfoStatus(CoreConstants.RESET_MSG_PREFIX, this));
        context.getStatusManager().add(new InfoStatus("bla", this));
        assertTrue(resetTime <= statusUtil.timeOfLastReset());
      }
    
    
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/status/StatusBaseTest.java������������0000644�0001750�0001750�00000005705�12136042273�031034� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.status;
    
    import java.util.Iterator;
    
    import junit.framework.TestCase;
    
    public class StatusBaseTest extends TestCase {
    
      public void testAddStatus() {
        {
          InfoStatus status = new InfoStatus("testing", this);
          status.add(new ErrorStatus("error", this));
          Iterator it = status.iterator();
          assertTrue("No status was added", it.hasNext());
          assertTrue("hasChilden method reported wrong result", status
              .hasChildren());
        }
        {
          InfoStatus status = new InfoStatus("testing", this);
          try {
            status.add(null);
            fail("method should have thrown an Exception");
          } catch (NullPointerException ex) {
          }
        }
      }
    
      public void testRemoveStatus() {
        {
          InfoStatus status = new InfoStatus("testing", this);
          ErrorStatus error = new ErrorStatus("error", this);
          status.add(error);
          boolean result = status.remove(error);
          Iterator it = status.iterator();
          assertTrue("Remove failed", result);
          assertFalse("No status was removed", it.hasNext());
          assertFalse("hasChilden method reported wrong result", status
              .hasChildren());
        }
        {
          InfoStatus status = new InfoStatus("testing", this);
          ErrorStatus error = new ErrorStatus("error", this);
          status.add(error);
          boolean result = status.remove(null);
          assertFalse("Remove result was not false", result);
        }
      }
    
      public void testEffectiveLevel() {
        {
          // effective level = 0 level deep
          ErrorStatus status = new ErrorStatus("error", this);
          WarnStatus warn = new WarnStatus("warning", this);
          status.add(warn);
          assertEquals("effective level misevaluated", status.getEffectiveLevel(),
              Status.ERROR);
        }
    
        {
          // effective level = 1 level deep
          InfoStatus status = new InfoStatus("info", this);
          WarnStatus warn = new WarnStatus("warning", this);
          status.add(warn);
          assertEquals("effective level misevaluated", status.getEffectiveLevel(),
              Status.WARN);
        }
    
        {
          // effective level = 2 levels deep
          InfoStatus status = new InfoStatus("info", this);
          WarnStatus warn = new WarnStatus("warning", this);
          ErrorStatus error = new ErrorStatus("error", this);
          status.add(warn);
          warn.add(error);
          assertEquals("effective level misevaluated", status.getEffectiveLevel(),
              Status.ERROR);
        }
      }
    
    }
    �����������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/sift/���������������������������������0000755�0001750�0001750�00000000000�12203357067�024673� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/sift/AppenderTrackerTest.java���������0000644�0001750�0001750�00000012211�12136473774�031456� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.sift;
    
    import ch.qos.logback.core.Appender;
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.ContextBase;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.read.ListAppender;
    import ch.qos.logback.core.testUtil.RandomUtil;
    import org.junit.Before;
    import org.junit.Test;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import static org.junit.Assert.*;
    
    /**
     * Relatively straightforward unit tests for AppenderTracker.
     */
    public class AppenderTrackerTest {
    
      Context context = new ContextBase();
      ListAppenderFactory listAppenderFactory = new ListAppenderFactory();
      int diff = RandomUtil.getPositiveInt();
      AppenderTracker<Object> appenderTracker = new AppenderTracker<Object>(context, listAppenderFactory);
      String key = "k-" + diff;
      long now = 3000;
    
      @Before
      public void setUp() {
      }
    
      @Test
      public void removeStaleComponentsShouldNotBomb() {
        appenderTracker.removeStaleComponents(now);
        assertEquals(0, appenderTracker.getComponentCount());
      }
    
      @Test
      public void findingTheInexistentShouldNotBomb() {
        assertNull(appenderTracker.find(key));
        now += AppenderTracker.DEFAULT_TIMEOUT + 1;
        appenderTracker.removeStaleComponents(now);
        assertNull(appenderTracker.find(key));
      }
    
      @Test
      public void smoke() {
        Appender<Object> a = appenderTracker.getOrCreate(key, now);
        assertTrue(a.isStarted());
        now += AppenderTracker.DEFAULT_TIMEOUT + 1;
        appenderTracker.removeStaleComponents(now);
        assertFalse(a.isStarted());
        assertNull(appenderTracker.find(key));
      }
    
      @Test
      public void endOfLivedAppendersShouldBeRemovedAfterLingeringTimeout() {
        Appender a = appenderTracker.getOrCreate(key, now);
        appenderTracker.endOfLife(key);
        now += AppenderTracker.LINGERING_TIMEOUT + 1;
        appenderTracker.removeStaleComponents(now);
        assertFalse(a.isStarted());
        a = appenderTracker.find(key);
        assertNull(a);
      }
    
      @Test
      public void endOfLivedAppenderShouldBeAvailableDuringLingeringPeriod() {
        Appender a = appenderTracker.getOrCreate(key, now);
        appenderTracker.endOfLife(key);
        // clean
        appenderTracker.removeStaleComponents(now);
        Appender lingering = appenderTracker.getOrCreate(key, now);
        assertTrue(lingering.isStarted());
        assertTrue(a == lingering);
        now += AppenderTracker.LINGERING_TIMEOUT + 1;
        appenderTracker.removeStaleComponents(now);
        assertFalse(a.isStarted());
        a = appenderTracker.find(key);
        assertNull(a);
      }
    
    
      @Test
      public void trackerShouldHonorMaxComponentsParameter() {
        List<Appender<Object>> appenderList = new ArrayList<Appender<Object>>();
        int max = 10;
        appenderTracker.setMaxComponents(max);
        for (int i = 0; i < (max + 1); i++) {
          Appender a = appenderTracker.getOrCreate(key + "-" + i, now++);
          appenderList.add(a);
        }
        // cleaning only happens in removeStaleComponents
        appenderTracker.removeStaleComponents(now++);
        assertEquals(max, appenderTracker.allKeys().size());
        assertNull(appenderTracker.find(key + "-" + 0));
        assertFalse(appenderList.get(0).isStarted());
      }
    
      @Test
      public void trackerShouldHonorTimeoutParameter() {
        List<Appender<Object>> appenderList = new ArrayList<Appender<Object>>();
        int timeout = 2;
        appenderTracker.setTimeout(timeout);
        for (int i = 0; i <= timeout; i++) {
          Appender a = appenderTracker.getOrCreate(key + "-" + i, now++);
          appenderList.add(a);
        }
    
        long numComponentsCreated = timeout + 1;
        assertEquals(numComponentsCreated, appenderTracker.allKeys().size());
    
        // cleaning only happens in removeStaleComponents. The first appender should timeout
        appenderTracker.removeStaleComponents(now++);
    
        // the first appender should have been removed
        assertEquals(numComponentsCreated - 1, appenderTracker.allKeys().size());
        assertNull(appenderTracker.find(key + "-" + 0));
        assertFalse(appenderList.get(0).isStarted());
    
        // the other appenders should be in the tracker
        for (int i = 1; i <= timeout; i++) {
          assertNotNull(appenderTracker.find(key + "-" + i));
          assertTrue(appenderList.get(i).isStarted());
        }
      }
    
      // ======================================================================
      static class ListAppenderFactory implements AppenderFactory<Object> {
    
        public Appender<Object> buildAppender(Context context, String discriminatingValue) throws JoranException {
          ListAppender<Object> la = new ListAppender<Object>();
          la.setContext(context);
          la.setName(discriminatingValue);
          la.start();
          return la;
        }
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/sift/PackageTest.java�����������������0000644�0001750�0001750�00000001337�12136177166�027742� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.sift;
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    import org.junit.runners.Suite.SuiteClasses;
    
    @RunWith(Suite.class)
    @SuiteClasses({AppenderTrackerTest.class})
    public class PackageTest  {
    }�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/��������������������������������0000755�0001750�0001750�00000000000�12203357067�025037� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/TrivialConfiguratorTest.java����0000644�0001750�0001750�00000013445�12140150757�032543� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertFalse;
    import static org.junit.Assert.assertTrue;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.URL;
    import java.net.URLConnection;
    import java.util.HashMap;
    import java.util.jar.JarOutputStream;
    import java.util.zip.ZipEntry;
    
    import ch.qos.logback.core.CoreConstants;
    import org.junit.Test;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.ContextBase;
    import ch.qos.logback.core.joran.action.Action;
    import ch.qos.logback.core.joran.action.ext.IncAction;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.joran.spi.ElementSelector;
    import ch.qos.logback.core.status.Status;
    import ch.qos.logback.core.status.TrivialStatusListener;
    import ch.qos.logback.core.testUtil.RandomUtil;
    import ch.qos.logback.core.util.CoreTestConstants;
    
    public class TrivialConfiguratorTest {
    
      Context context = new ContextBase();
      HashMap<ElementSelector, Action> rulesMap = new HashMap<ElementSelector, Action>();
    
      public void doTest(String filename) throws Exception {
    
        // rule store is case insensitve
        rulesMap.put(new ElementSelector("x/inc"), new IncAction());
    
        TrivialConfigurator trivialConfigurator = new TrivialConfigurator(rulesMap);
    
        trivialConfigurator.setContext(context);
        trivialConfigurator.doConfigure(filename);
      }
    
      @Test
      public void smoke() throws Exception {
        int oldBeginCount = IncAction.beginCount;
        int oldEndCount = IncAction.endCount;
        int oldErrorCount = IncAction.errorCount;
        doTest(CoreTestConstants.TEST_SRC_PREFIX + "input/joran/" + "inc.xml");
        assertEquals(oldErrorCount, IncAction.errorCount);
        assertEquals(oldBeginCount + 1, IncAction.beginCount);
        assertEquals(oldEndCount + 1, IncAction.endCount);
      }
    
      @Test
      public void inexistentFile() {
        TrivialStatusListener tsl = new TrivialStatusListener();
        tsl.start();
        String filename = CoreTestConstants.TEST_SRC_PREFIX + "input/joran/"
                + "nothereBLAH.xml";
        context.getStatusManager().add(tsl);
        try {
          doTest(filename);
        } catch (Exception e) {
          assertTrue(e.getMessage().startsWith("Could not open ["));
        }
        assertTrue(tsl.list.size() + " should be greater than or equal to 1",
                tsl.list.size() >= 1);
        Status s0 = tsl.list.get(0);
        assertTrue(s0.getMessage().startsWith("Could not open ["));
      }
    
      @Test
      public void illFormedXML() {
        TrivialStatusListener tsl = new TrivialStatusListener();
        tsl.start();
        String filename = CoreTestConstants.TEST_SRC_PREFIX + "input/joran/" + "illformed.xml";
        context.getStatusManager().add(tsl);
        try {
          doTest(filename);
        } catch (Exception e) {
        }
        assertEquals(1, tsl.list.size());
        Status s0 = tsl.list.get(0);
        assertTrue(s0.getMessage().startsWith(CoreConstants.XML_PARSING));
      }
    
      @Test
      public void lbcore105() throws IOException, JoranException {
        String jarEntry = "buzz.xml";
        File jarFile = makeRandomJarFile();
        fillInJarFile(jarFile, jarEntry);
        URL url = asURL(jarFile, jarEntry);
        TrivialConfigurator tc = new TrivialConfigurator(rulesMap);
        tc.setContext(context);
        tc.doConfigure(url);
        // deleting an open file fails
        assertTrue(jarFile.delete());
        assertFalse(jarFile.exists());
      }
    
      @Test
      public void lbcore127() throws IOException, JoranException {
        String jarEntry = "buzz.xml";
        String jarEntry2 = "lightyear.xml";
    
        File jarFile = makeRandomJarFile();
        fillInJarFile(jarFile, jarEntry, jarEntry2);
    
        URL url1 = asURL(jarFile, jarEntry);
        URL url2 = asURL(jarFile, jarEntry2);
    
        URLConnection urlConnection2 = url2.openConnection();
        urlConnection2.setUseCaches(false);
        InputStream is = urlConnection2.getInputStream();
    
        TrivialConfigurator tc = new TrivialConfigurator(rulesMap);
        tc.setContext(context);
        tc.doConfigure(url1);
    
        is.read();
        is.close();
    
        // deleting an open file fails
        assertTrue(jarFile.delete());
        assertFalse(jarFile.exists());
      }
    
      File makeRandomJarFile() {
        File outputDir = new File(CoreTestConstants.OUTPUT_DIR_PREFIX);
        outputDir.mkdirs();
        int randomPart = RandomUtil.getPositiveInt();
        return new File(CoreTestConstants.OUTPUT_DIR_PREFIX + "foo-" + randomPart
                + ".jar");
      }
    
      private void fillInJarFile(File jarFile, String jarEntryName)
              throws IOException {
        fillInJarFile(jarFile, jarEntryName, null);
      }
    
      private void fillInJarFile(File jarFile, String jarEntryName1,
                                 String jarEntryName2) throws IOException {
        JarOutputStream jos = new JarOutputStream(new FileOutputStream(jarFile));
        jos.putNextEntry(new ZipEntry(jarEntryName1));
        jos.write("<x/>".getBytes());
        jos.closeEntry();
        if (jarEntryName2 != null) {
          jos.putNextEntry(new ZipEntry(jarEntryName2));
          jos.write("<y/>".getBytes());
          jos.closeEntry();
        }
        jos.close();
      }
    
      URL asURL(File jarFile, String jarEntryName) throws IOException {
        URL innerURL = jarFile.toURI().toURL();
        return new URL("jar:" + innerURL + "!/" + jarEntryName);
      }
    
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/action/�������������������������0000755�0001750�0001750�00000000000�12203357067�026314� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/action/ext/���������������������0000755�0001750�0001750�00000000000�12203357067�027114� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/action/ext/BadEndAction.java����0000644�0001750�0001750�00000002656�12136042272�032235� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.action.ext;
    
    
    
    import org.xml.sax.Attributes;
    
    import ch.qos.logback.core.joran.action.Action;
    import ch.qos.logback.core.joran.spi.ActionException;
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    
    
    
    public class BadEndAction extends Action {
    
      static String EXCEPTION_TYPE = "type";
      static final int RUNTIME_EXCEPTION = 0;
      static final int ACTION_EXCEPTION = 1;
      
      int type;
      
      
      public void begin(InterpretationContext ec, String name, Attributes attributes) {
        String exType = attributes.getValue(EXCEPTION_TYPE);
        type = RUNTIME_EXCEPTION;
        if("ActionException".equals(exType)) {
          type = ACTION_EXCEPTION;
        }
      }
    
      public void end(InterpretationContext ec, String name) throws ActionException {
        switch(type) {
        case ACTION_EXCEPTION: 
          throw new ActionException();
        default:
          throw new IllegalStateException("bad end");
        }
      }
    }
    ����������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/action/ext/IncAction.java�������0000644�0001750�0001750�00000003106�12136042272�031620� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.action.ext;
    
    import org.xml.sax.Attributes;
    
    import ch.qos.logback.core.joran.action.Action;
    import ch.qos.logback.core.joran.spi.ActionException;
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    
    
    
    public class IncAction extends Action {
    
      static public int  beginCount;
      static public int  endCount;
      static public int  errorCount;
    
      static public void reset() {
        beginCount = 0;
        endCount = 0;
        errorCount = 0;
      }
      /**
       * Instantiates an layout of the given class and sets its name.
       *
       */
      public void begin(InterpretationContext ec, String name, Attributes attributes) throws ActionException {
        //System.out.println("IncAction Begin called");
        beginCount++;
        String val = attributes.getValue("increment");
        if(!"1".equals(val)) {
          errorCount++;
          throw new ActionException();
        }
      }
    
      /**
       * Once the children elements are also parsed, now is the time to activate
       * the appender options.
       */
      public void end(InterpretationContext ec, String name) {
        endCount++;
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/action/ext/StackAction.java�����0000644�0001750�0001750�00000002213�12136042272�032152� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.action.ext;
    
    
    import java.util.Stack;
    
    import org.xml.sax.Attributes;
    
    import ch.qos.logback.core.joran.action.Action;
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    
    
    public class StackAction extends Action {
    
    
        Stack<String> stack = new Stack<String>();
    
        public Stack<String> getStack() {
            return stack;
        }
    
        public void begin(InterpretationContext ec, String name, Attributes attributes) {
            stack.push(attributes.getValue("name"));
        }
    
        public void end(InterpretationContext ec, String name) {
        }
    
    //  static public void reset() {
    //    stack.clear();
    //  }
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/action/ext/BadBeginAction.java��0000644�0001750�0001750�00000002677�12136042272�032556� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.action.ext;
    
    import org.xml.sax.Attributes;
    
    import ch.qos.logback.core.joran.action.Action;
    import ch.qos.logback.core.joran.spi.ActionException;
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    
    
    
    public class BadBeginAction extends Action {
    
    
      static String EXCEPTION_TYPE = "type";
      static final int RUNTIME_EDXCEPTION = 0;
      static final int ACTION_EXCEPTION = 1;
      
      int type;
      
      public void begin(InterpretationContext ec, String name, Attributes attributes) throws ActionException {
        
        String exType = attributes.getValue(EXCEPTION_TYPE);
        type = RUNTIME_EDXCEPTION;
        if("ActionException".equals(exType)) {
          type = ACTION_EXCEPTION;
        }
        
        switch(type) {
        case ACTION_EXCEPTION: 
          throw new ActionException();
        default:
          throw new IllegalStateException("bad begin");
        }
       
      }
    
      public void end(InterpretationContext ec, String name) {
      }
    }
    �����������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/action/ext/TouchAction.java�����0000644�0001750�0001750�00000002536�12136042272�032177� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.action.ext;
    
    
    import org.xml.sax.Attributes;
    
    import ch.qos.logback.core.joran.action.Action;
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    
    
    
    public class TouchAction extends Action {
    
      public static final String KEY = "touched";
      
      /**
       * Instantiates an layout of the given class and sets its name.
       *
       */
      public void begin(InterpretationContext ec, String name, Attributes attributes) {
        Integer i = (Integer) ec.getContext().getObject(KEY);
        if(i == null) {
          ec.getContext().putObject(KEY, new Integer(1));
        } else {
          ec.getContext().putObject(KEY, new Integer(i.intValue()+1));
        }
      }
    
      /**
       * Once the children elements are also parsed, now is the time to activate
       * the appender options.
       */
      public void end(InterpretationContext ec, String name) {
      }
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/action/ext/HelloAction.java�����0000644�0001750�0001750�00000002365�12136042272�032160� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.action.ext;
    
    import org.xml.sax.Attributes;
    
    import ch.qos.logback.core.joran.action.Action;
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    
    
    
    public class HelloAction extends Action {
    
    
      static final public String PROPERTY_KEY = "name";
      
      /**
       * Instantiates an layout of the given class and sets its name.
       *
       */
      public void begin(InterpretationContext ec, String name, Attributes attributes) {
        String str = "Hello "+attributes.getValue("name")+".";
        ec.getContext().putProperty(PROPERTY_KEY, str);
      }
    
      /**
       * Once the children elements are also parsed, now is the time to activate
       * the appender options.
       */
      public void end(InterpretationContext ec, String name) {
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000151�00000000000�011562� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/action/DefinePropertyActionTest.java������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/action/DefinePropertyActionTest.0000644�0001750�0001750�00000007337�12140150757�033261� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.action;
    
    import static junit.framework.Assert.assertEquals;
    import static junit.framework.Assert.assertNull;
    import static org.junit.Assert.assertTrue;
    
    import java.util.HashMap;
    
    import ch.qos.logback.core.joran.spi.ElementSelector;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.ContextBase;
    import ch.qos.logback.core.joran.SimpleConfigurator;
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.status.Status;
    import ch.qos.logback.core.status.StatusChecker;
    import ch.qos.logback.core.util.CoreTestConstants;
    
    /**
     * Test {@link DefinePropertyAction}.
     * 
     * @author Aleksey Didik
     */
    public class DefinePropertyActionTest {
    
      private static final String DEFINE_INPUT_DIR = CoreTestConstants.JORAN_INPUT_PREFIX
          + "define/";
      private static final String GOOD_XML = "good.xml";
      private static final String NONAME_XML = "noname.xml";
      private static final String NOCLASS_XML = "noclass.xml";
      private static final String BADCLASS_XML = "badclass.xml";
    
      SimpleConfigurator simpleConfigurator;
      Context context = new ContextBase();
      DefinePropertyAction definerAction;
      InterpretationContext ic;
      StatusChecker checker = new StatusChecker(context);
    
      @Before
      public void setUp() throws Exception {
    
        HashMap<ElementSelector, Action> rulesMap = new HashMap<ElementSelector, Action>();
        rulesMap.put(new ElementSelector("define"), new DefinePropertyAction());
        simpleConfigurator = new SimpleConfigurator(rulesMap);
        simpleConfigurator.setContext(context);
      }
    
      @After
      public void tearDown() throws Exception {
        //StatusPrinter.printInCaseOfErrorsOrWarnings(context);
      }
    
      @Test
      public void good() throws JoranException {
        simpleConfigurator.doConfigure(DEFINE_INPUT_DIR + GOOD_XML);
        InterpretationContext ic = simpleConfigurator.getInterpreter().getInterpretationContext();
        String inContextFoo = ic.getProperty("foo");
        assertEquals("monster", inContextFoo);
      }
    
      @Test
      public void noName() throws JoranException {
        simpleConfigurator.doConfigure(DEFINE_INPUT_DIR + NONAME_XML);
        // get from context
        String inContextFoo = context.getProperty("foo");
        assertNull(inContextFoo);
        // check context errors
        checker.assertContainsMatch(Status.ERROR,
            "Missing property name for property definer. Near \\[define\\] line 1");
      }
    
      @Test
      public void noClass() throws JoranException {
        simpleConfigurator.doConfigure(DEFINE_INPUT_DIR + NOCLASS_XML);
        String inContextFoo = context.getProperty("foo");
        assertNull(inContextFoo);
        checker.assertContainsMatch(Status.ERROR,
            "Missing class name for property definer. Near \\[define\\] line 1");
      }
    
      @Test
      public void testBadClass() throws JoranException {
        simpleConfigurator.doConfigure(DEFINE_INPUT_DIR + BADCLASS_XML);
        // get from context
        String inContextFoo = context.getProperty("foo");
        assertNull(inContextFoo);
        // check context errors
        checker.assertContainsMatch(Status.ERROR, "Could not create an PropertyDefiner of type");
      }
    
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/action/DummyAttributes.java�����0000644�0001750�0001750�00000003130�12136042272�032310� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.action;
    
    import java.util.HashMap;
    
    import org.xml.sax.Attributes;
    
    public class DummyAttributes implements Attributes {
    
      HashMap<String, String> atts = new HashMap<String, String>();
    
      public int getIndex(String qName) {
        return 0;
      }
    
      public int getIndex(String uri, String localName) {
        return 0;
      }
    
      public int getLength() {
        return 0;
      }
    
      public String getLocalName(int index) {
        return null;
      }
    
      public String getQName(int index) {
        return null;
      }
    
      public String getType(int index) {
        return null;
      }
    
      public String getType(String qName) {
        return null;
      }
    
      public String getType(String uri, String localName) {
        return null;
      }
    
      public String getURI(int index) {
        return null;
      }
    
      public String getValue(int index) {
        return null;
      }
    
      public String getValue(String qName) {
        return atts.get(qName);
      }
    
      public void setValue(String key, String value) {
        atts.put(key, value);
      }
    
      public String getValue(String uri, String localName) {
        return null;
      }
    
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/action/PackageTest.java���������0000644�0001750�0001750�00000001401�12136042272�031340� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.action;
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    import org.junit.runners.Suite.SuiteClasses;
    
    @RunWith(Suite.class)
    @SuiteClasses({PropertyActionTest.class, IncludeActionTest.class})
    public class PackageTest  {
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/action/IncludeActionTest.java���0000644�0001750�0001750�00000017043�12140150757�032542� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.action;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertTrue;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.net.MalformedURLException;
    import java.net.UnknownHostException;
    import java.util.Arrays;
    import java.util.HashMap;
    import java.util.Stack;
    
    import ch.qos.logback.core.testUtil.FileTestUtil;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    import org.xml.sax.SAXParseException;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.ContextBase;
    import ch.qos.logback.core.joran.TrivialConfigurator;
    import ch.qos.logback.core.joran.action.ext.StackAction;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.joran.spi.ElementSelector;
    import ch.qos.logback.core.status.Status;
    import ch.qos.logback.core.status.StatusChecker;
    import ch.qos.logback.core.testUtil.RandomUtil;
    import ch.qos.logback.core.util.CoreTestConstants;
    import ch.qos.logback.core.util.StatusPrinter;
    
    public class IncludeActionTest {
    
      final static String INCLUDE_KEY = "includeKey";
      final static String SUB_FILE_KEY = "subFileKey";
      final static String SECOND_FILE_KEY = "secondFileKey";
    
      Context context = new ContextBase();
      StatusChecker statusChecker = new StatusChecker(context);
      TrivialConfigurator tc;
    
      static final String INCLUSION_DIR_PREFIX = CoreTestConstants.JORAN_INPUT_PREFIX
          + "inclusion/";
    
      static final String TOP_BY_FILE = INCLUSION_DIR_PREFIX + "topByFile.xml";
    
      static final String TOP_OPTIONAL = INCLUSION_DIR_PREFIX + "topOptional.xml";
    
      static final String INTERMEDIARY_FILE = INCLUSION_DIR_PREFIX
          + "intermediaryByFile.xml";
    
      static final String SUB_FILE = INCLUSION_DIR_PREFIX + "subByFile.xml";
    
      static final String MULTI_INCLUDE_BY_FILE = INCLUSION_DIR_PREFIX
          + "multiIncludeByFile.xml";
    
      static final String SECOND_FILE = INCLUSION_DIR_PREFIX + "second.xml";
    
      static final String TOP_BY_URL = INCLUSION_DIR_PREFIX + "topByUrl.xml";
    
      static final String INCLUDE_BY_RESOURCE = INCLUSION_DIR_PREFIX
          + "topByResource.xml";
    
      static final String INCLUDED_FILE = INCLUSION_DIR_PREFIX + "included.xml";
      static final String URL_TO_INCLUDE = "file:./" + INCLUDED_FILE;
    
      static final String INVALID = INCLUSION_DIR_PREFIX + "invalid.xml";
    
      static final String INCLUDED_AS_RESOURCE = "asResource/joran/inclusion/includedAsResource.xml";
    
      int diff = RandomUtil.getPositiveInt();
    
      StackAction stackAction = new StackAction();
    
      @Before
      public void setUp() throws Exception {
        FileTestUtil.makeTestOutputDir();
        HashMap<ElementSelector, Action> rulesMap = new HashMap<ElementSelector, Action>();
        rulesMap.put(new ElementSelector("x"), new NOPAction());
        rulesMap.put(new ElementSelector("x/include"), new IncludeAction());
        rulesMap.put(new ElementSelector("x/stack"), stackAction);
    
        tc = new TrivialConfigurator(rulesMap);
        tc.setContext(context);
      }
    
      @After
      public void tearDown() throws Exception {
        StatusPrinter.printInCaseOfErrorsOrWarnings(context);
        context = null;
        System.clearProperty(INCLUDE_KEY);
        System.clearProperty(SECOND_FILE_KEY);
        System.clearProperty(SUB_FILE_KEY);
        //StackAction.reset();
      }
    
      @Test
      public void basicFile() throws JoranException {
        System.setProperty(INCLUDE_KEY, INCLUDED_FILE);
        tc.doConfigure(TOP_BY_FILE);
        verifyConfig(new String[] { "IA", "IB" });
      }
    
      @Test
      public void optionalFile() throws JoranException {
        tc.doConfigure(TOP_OPTIONAL);
        verifyConfig(new String[] { "IA", "IB" });
        StatusPrinter.print(context);
      }
    
      @Test
      public void basicResource() throws JoranException {
        System.setProperty(INCLUDE_KEY, INCLUDED_AS_RESOURCE);
        tc.doConfigure(INCLUDE_BY_RESOURCE);
        verifyConfig(new String[] { "AR_A", "AR_B" });
      }
    
      @Test
      public void basicURL() throws JoranException {
        System.setProperty(INCLUDE_KEY, URL_TO_INCLUDE);
        tc.doConfigure(TOP_BY_URL);
        verifyConfig(new String[] { "IA", "IB" });
      }
    
      @Test
      public void noFileFound() throws JoranException {
        System.setProperty(INCLUDE_KEY, "toto");
        tc.doConfigure(TOP_BY_FILE);
        assertEquals(Status.ERROR, statusChecker.getHighestLevel(0));
        assertTrue(statusChecker.containsException(FileNotFoundException.class));
      }
    
      @Test
      public void withCorruptFile() throws JoranException, IOException {
        String tmpOut = copyToTemp(INVALID);
        System.setProperty(INCLUDE_KEY, tmpOut);
        tc.doConfigure(TOP_BY_FILE);
        assertEquals(Status.ERROR, statusChecker.getHighestLevel(0));
        assertTrue(statusChecker.containsException(SAXParseException.class));
    
        // we like to erase the temp file in order to see
        // if http://jira.qos.ch/browse/LBCORE-122 was fixed
        File f = new File(tmpOut);
        assertTrue(f.exists());
        assertTrue(f.delete());
    
      }
    
      String copyToTemp(String in) throws IOException {
        FileInputStream fis = new FileInputStream(in);
        String out = CoreTestConstants.OUTPUT_DIR_PREFIX + "out" + diff;
        FileOutputStream fos = new FileOutputStream(out);
        int b;
        while ((b = fis.read()) != -1) {
          fos.write(b);
        }
        fis.close();
        fos.close();
        return out;
      }
    
      @Test
      public void malformedURL() throws JoranException {
        System.setProperty(INCLUDE_KEY, "htp://logback.qos.ch");
        tc.doConfigure(TOP_BY_URL);
        assertEquals(Status.ERROR, statusChecker.getHighestLevel(0));
        assertTrue(statusChecker.containsException(MalformedURLException.class));
      }
    
      @Test
      public void unknownURL() throws JoranException {
        System.setProperty(INCLUDE_KEY, "http://logback2345.qos.ch");
        tc.doConfigure(TOP_BY_URL);
        assertEquals(Status.ERROR, statusChecker.getHighestLevel(0));
        // OS X throws IOException instead of UnknownHostException
        // http://jira.qos.ch/browse/LBCORE-129
        // This behavior has been observed on Windows XP as well
        assertTrue(statusChecker.containsException(UnknownHostException.class)
            || statusChecker.containsException(IOException.class));
      }
    
      @Test
      public void nestedInclude() throws JoranException {
        System.setProperty(SUB_FILE_KEY, SUB_FILE);
        System.setProperty(INCLUDE_KEY, INTERMEDIARY_FILE);
        tc.doConfigure(TOP_BY_FILE);
        Stack<String> witness = new Stack<String>();
        witness.push("a");
        witness.push("b");
        witness.push("c");
        assertEquals(witness, stackAction.getStack());
      }
    
      @Test
      public void multiInclude() throws JoranException {
        System.setProperty(INCLUDE_KEY, INCLUDED_FILE);
        System.setProperty(SECOND_FILE_KEY, SECOND_FILE);
        tc.doConfigure(MULTI_INCLUDE_BY_FILE);
        verifyConfig(new String[] { "IA", "IB", "SECOND" });
      }
    
      void verifyConfig(String[] expected) {
        Stack<String> witness = new Stack<String>();
        witness.addAll(Arrays.asList(expected));
        assertEquals(witness, stackAction.getStack());
      }
    
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000153�00000000000�011564� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/action/AsLowerCasePropertyDefiner.java����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/action/AsLowerCasePropertyDefine0000644�0001750�0001750�00000001562�12136042272�033265� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.action;
    
    import ch.qos.logback.core.PropertyDefinerBase;
    
    public class AsLowerCasePropertyDefiner extends PropertyDefinerBase {
    
      String val;
    
      public String getPropertyValue() {
        if (val == null) {
          return null;
        } else {
          return val.toLowerCase();
        }
      }
    
      public void setValue(String val) {
        this.val = val;
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/action/PropertyActionTest.java��0000644�0001750�0001750�00000011700�12136042272�032772� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.action;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertTrue;
    
    import java.util.Iterator;
    
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.ContextBase;
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    import ch.qos.logback.core.status.ErrorStatus;
    import ch.qos.logback.core.util.CoreTestConstants;
    import ch.qos.logback.core.util.StatusPrinter;
    
    /**
     * Test {@link PropertyAction}.
     * @author Ceki G&uuml;lc&uuml;
     */
    public class PropertyActionTest  {
    
      Context context;
      InterpretationContext ec;
      PropertyAction propertyAction;
      DummyAttributes atts = new DummyAttributes();
      
      @Before
      public void setUp() throws Exception {
        context = new ContextBase();
        ec = new InterpretationContext(context, null);
        propertyAction = new PropertyAction();
        propertyAction.setContext(context);
      }
    
      @After
      public void tearDown() throws Exception {
        context = null; 
        propertyAction = null;
        atts = null;
      }
      
      @Test
      public void nameValuePair() {
        atts.setValue("name", "v1");
        atts.setValue("value", "work");
        propertyAction.begin(ec, null, atts);
        assertEquals("work", ec.getProperty("v1"));
      }
      
      @Test
      public void nameValuePairWithPrerequisiteSubsitution() {
        context.putProperty("w", "wor");
        atts.setValue("name", "v1");
        atts.setValue("value", "${w}k");
        propertyAction.begin(ec, null, atts);
        assertEquals("work", ec.getProperty("v1"));
      }
      
      @Test
      public void noValue() {
        atts.setValue("name", "v1");
        propertyAction.begin(ec, null, atts);
        assertEquals(1, context.getStatusManager().getCount());
        assertTrue(checkError());
      }
    
      @Test
      public void noName() {
        atts.setValue("value", "v1");
        propertyAction.begin(ec, null, atts);
        assertEquals(1, context.getStatusManager().getCount());
        assertTrue(checkError());
      }
      
      @Test
      public void noAttributes() {
        propertyAction.begin(ec, null, atts);
        assertEquals(1, context.getStatusManager().getCount());
        assertTrue(checkError());
        StatusPrinter.print(context);
      } 
      
      @Test
      public void testFileNotLoaded() {
        atts.setValue("file", "toto");
        atts.setValue("value", "work");
        propertyAction.begin(ec, null, atts);
        assertEquals(1, context.getStatusManager().getCount());
        assertTrue(checkError());
      }
      
      @Test
      public void testLoadFileWithPrerequisiteSubsitution() {
        context.putProperty("STEM", CoreTestConstants.TEST_SRC_PREFIX + "input/joran");
        atts.setValue("file", "${STEM}/propertyActionTest.properties");
        propertyAction.begin(ec, null, atts);
        assertEquals("tata", ec.getProperty("v1"));
        assertEquals("toto", ec.getProperty("v2"));
      }
    
      @Test
      public void testLoadFile() {
        atts.setValue("file", CoreTestConstants.TEST_SRC_PREFIX + "input/joran/propertyActionTest.properties");
        propertyAction.begin(ec, null, atts);
        assertEquals("tata", ec.getProperty("v1"));
        assertEquals("toto", ec.getProperty("v2"));
      }
    
      @Test
      public void testLoadResource() {
        atts.setValue("resource", "asResource/joran/propertyActionTest.properties");
        propertyAction.begin(ec, null, atts);
        assertEquals("tata", ec.getProperty("r1"));
        assertEquals("toto", ec.getProperty("r2"));
      }
      
      @Test
      public void testLoadResourceWithPrerequisiteSubsitution() {
        context.putProperty("STEM", "asResource/joran");
        atts.setValue("resource", "${STEM}/propertyActionTest.properties");
        propertyAction.begin(ec, null, atts);
        assertEquals("tata", ec.getProperty("r1"));
        assertEquals("toto", ec.getProperty("r2"));
      }
      
      @Test
      public void testLoadNotPossible() {
        atts.setValue("file", "toto");
        propertyAction.begin(ec, null, atts);
        assertEquals(1, context.getStatusManager().getCount());
        assertTrue(checkFileErrors());
      }
      
      private boolean checkError() {
        Iterator it = context.getStatusManager().getCopyOfStatusList().iterator();
        ErrorStatus es = (ErrorStatus)it.next();
        return PropertyAction.INVALID_ATTRIBUTES.equals(es.getMessage());
      }
      
      private boolean checkFileErrors() {
        Iterator it = context.getStatusManager().getCopyOfStatusList().iterator();
        ErrorStatus es1 = (ErrorStatus)it.next();
        return "Could not find properties file [toto].".equals(es1.getMessage());
      }
    }
    ����������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/util/���������������������������0000755�0001750�0001750�00000000000�12203357067�026014� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/util/House.java�����������������0000644�0001750�0001750�00000006771�12136042272�027747� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.util;
    
    import java.nio.charset.Charset;
    import java.util.ArrayList;
    import java.util.List;
    
    import ch.qos.logback.core.joran.spi.DefaultClass;
    import ch.qos.logback.core.spi.FilterReply;
    import ch.qos.logback.core.util.Duration;
    import ch.qos.logback.core.util.FileSize;
    
    public class House {
      Door mainDoor;
      int count;
      Double temperature;
      boolean open;
      String name;
      String camelCase;
      SwimmingPool pool;
      Duration duration;
      FileSize fs;
      HouseColor houseColor;
      FilterReply reply;
      
      
      Charset charset;
    
      List<String> adjectiveList = new ArrayList<String>();
      List<Window> windowList = new ArrayList<Window>();
      List<SwimmingPool> largePoolList = new ArrayList<SwimmingPool>();
    
      public String getCamelCase() {
        return camelCase;
      }
    
      public void setCamelCase(String camelCase) {
        this.camelCase = camelCase;
      }
    
      public int getCount() {
        return count;
      }
    
      public void setCount(int c) {
        this.count = c;
      }
    
      
      public Double getTemperature() {
        return temperature;
      }
    
      public void setTemperature(Double temperature) {
        this.temperature = temperature;
      }
    
      public Door getDoor() {
        return mainDoor;
      }
    
      public void setDoor(Door door) {
        this.mainDoor = door;
      }
    
      public String getName() {
        return name;
      }
    
      public void setName(String name) {
        this.name = name;
      }
    
      public boolean isOpen() {
        return open;
      }
    
      public void setOpen(boolean open) {
        this.open = open;
      }
    
      @DefaultClass(LargeSwimmingPoolImpl.class)
      public void addLargeSwimmingPool(SwimmingPool pool) {
        this.pool = pool;
      }
    
      @DefaultClass(SwimmingPoolImpl.class)
      public void setSwimmingPool(SwimmingPool pool) {
        this.pool = pool;
      }
    
      public SwimmingPool getSwimmingPool() {
        return pool;
      }
    
      public void addWindow(Window w) {
        windowList.add(w);
      }
    
      public void addAdjective(String s) {
        adjectiveList.add(s);
      }
    
      public Duration getDuration() {
        return duration;
      }
    
      public void setDuration(Duration duration) {
        this.duration = duration;
      }
    
      public FileSize getFs() {
        return fs;
      }
    
      public void setFs(FileSize fs) {
        this.fs = fs;
      }
    
      public void setHouseColor(HouseColor color) {
        this.houseColor = color;
      }
    
      public HouseColor getHouseColor() {
        return houseColor;
      }
    
      public void setFilterReply(FilterReply reply) {
        this.reply = reply;
      }
    
      public FilterReply getFilterReply() {
        return reply;
      }
    
      public Charset getCharset() {
        return charset;
      }
    
      public void setCharset(Charset charset) {
        this.charset = charset;
      }
    }
    
    class Door {
      int handle;
    }
    
    class Window {
      int handle;
    }
    
    interface SwimmingPool {
    }
    
    class SwimmingPoolImpl implements SwimmingPool {
      int length;
      int width;
      int depth;
    }
    
    class LargeSwimmingPoolImpl implements SwimmingPool {
      int length;
      int width;
      int depth;
    }
    
    enum HouseColor {
      WHITE, BLUE
    }�������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/util/PackageTest.java�����������0000644�0001750�0001750�00000001350�12136042272�031043� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.util;
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    import org.junit.runners.Suite.SuiteClasses;
    
    @RunWith(Suite.class)
    @SuiteClasses( { PropertySetterTest.class })
    public class PackageTest {
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/util/PropertySetterTest.java����0000644�0001750�0001750�00000017763�12136042272�032542� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.util;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertNotNull;
    import static org.junit.Assert.assertNull;
    import static org.junit.Assert.assertTrue;
    
    import java.lang.reflect.Method;
    import java.nio.charset.Charset;
    import java.nio.charset.UnsupportedCharsetException;
    
    import org.junit.Before;
    import org.junit.Test;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.ContextBase;
    import ch.qos.logback.core.joran.spi.DefaultNestedComponentRegistry;
    import ch.qos.logback.core.spi.FilterReply;
    import ch.qos.logback.core.status.StatusChecker;
    import ch.qos.logback.core.util.AggregationType;
    
    public class PropertySetterTest {
    
      DefaultNestedComponentRegistry defaultComponentRegistry = new DefaultNestedComponentRegistry();
    
      Context context = new ContextBase();
      House house = new House();
      PropertySetter setter = new PropertySetter(house);
     
      
      @Before
      public void setUp() {
        setter.setContext(context);
      }
      
      @Test
      public void testCanAggregateComponent() {
        assertEquals(AggregationType.AS_COMPLEX_PROPERTY, setter
            .computeAggregationType("door"));
    
        assertEquals(AggregationType.AS_BASIC_PROPERTY, setter
            .computeAggregationType("count"));
        assertEquals(AggregationType.AS_BASIC_PROPERTY, setter
            .computeAggregationType("Count"));
    
        assertEquals(AggregationType.AS_BASIC_PROPERTY, setter
            .computeAggregationType("name"));
        assertEquals(AggregationType.AS_BASIC_PROPERTY, setter
            .computeAggregationType("Name"));
    
        assertEquals(AggregationType.AS_BASIC_PROPERTY, setter
            .computeAggregationType("Duration"));
        assertEquals(AggregationType.AS_BASIC_PROPERTY, setter
            .computeAggregationType("fs"));
    
        assertEquals(AggregationType.AS_BASIC_PROPERTY, setter
            .computeAggregationType("open"));
        assertEquals(AggregationType.AS_BASIC_PROPERTY, setter
            .computeAggregationType("Open"));
    
        assertEquals(AggregationType.AS_COMPLEX_PROPERTY_COLLECTION, setter
            .computeAggregationType("Window"));
        assertEquals(AggregationType.AS_BASIC_PROPERTY_COLLECTION, setter
            .computeAggregationType("adjective"));
    
        assertEquals(AggregationType.AS_BASIC_PROPERTY, setter
            .computeAggregationType("filterReply"));
        assertEquals(AggregationType.AS_BASIC_PROPERTY, setter
            .computeAggregationType("houseColor"));
    
        System.out.println();
      }
    
      @Test
      public void testSetProperty() {
        {
          House house = new House();
          PropertySetter setter = new PropertySetter(house);
          setter.setProperty("count", "10");
          setter.setProperty("temperature", "33.1");
          
          setter.setProperty("name", "jack");
          setter.setProperty("open", "true");
    
          assertEquals(10, house.getCount());
          assertEquals(33.1d, (double) house.getTemperature(), 0.01);
          assertEquals("jack", house.getName());
          assertTrue(house.isOpen());
        }
    
        {
          House house = new House();
          PropertySetter setter = new PropertySetter(house);
          setter.setProperty("Count", "10");
          setter.setProperty("Name", "jack");
          setter.setProperty("Open", "true");
    
          assertEquals(10, house.getCount());
          assertEquals("jack", house.getName());
          assertTrue(house.isOpen());
        }
      }
    
      @Test
      public void testSetCamelProperty() {
        setter.setProperty("camelCase", "trot");
        assertEquals("trot", house.getCamelCase());
    
        setter.setProperty("camelCase", "gh");
        assertEquals("gh", house.getCamelCase());
      }
    
      @Test
      public void testSetComplexProperty() {
        Door door = new Door();
        setter.setComplexProperty("door", door);
        assertEquals(door, house.getDoor());
      }
    
      @Test
      public void testgetClassNameViaImplicitRules() {
        Class<?> compClass = setter.getClassNameViaImplicitRules("door",
            AggregationType.AS_COMPLEX_PROPERTY, defaultComponentRegistry);
        assertEquals(Door.class, compClass);
      }
    
      @Test
      public void testgetComplexPropertyColleClassNameViaImplicitRules() {
        Class<?> compClass = setter.getClassNameViaImplicitRules("window",
            AggregationType.AS_COMPLEX_PROPERTY_COLLECTION,
            defaultComponentRegistry);
        assertEquals(Window.class, compClass);
      }
    
      @Test
      public void testPropertyCollection() {
        setter.addBasicProperty("adjective", "nice");
        setter.addBasicProperty("adjective", "big");
    
        assertEquals(2, house.adjectiveList.size());
        assertEquals("nice", house.adjectiveList.get(0));
        assertEquals("big", house.adjectiveList.get(1));
      }
    
      @Test
      public void testComplexCollection() {
        Window w1 = new Window();
        w1.handle = 10;
        Window w2 = new Window();
        w2.handle = 20;
    
        setter.addComplexProperty("window", w1);
        setter.addComplexProperty("window", w2);
        assertEquals(2, house.windowList.size());
        assertEquals(10, house.windowList.get(0).handle);
        assertEquals(20, house.windowList.get(1).handle);
      }
    
      @Test
      public void testSetComplexWithCamelCaseName() {
        SwimmingPool pool = new SwimmingPoolImpl();
        setter.setComplexProperty("swimmingPool", pool);
        assertEquals(pool, house.getSwimmingPool());
      }
    
      @Test
      public void testDuration() {
        setter.setProperty("duration", "1.4 seconds");
        assertEquals(1400, house.getDuration().getMilliseconds());
      }
    
      @Test
      public void testFileSize() {
        setter.setProperty("fs", "2 kb");
        assertEquals(2 * 1024, house.getFs().getSize());
      }
    
      @Test
      public void testFilterReply() {
        // test case reproducing bug #52
        setter.setProperty("filterReply", "ACCEPT");
        assertEquals(FilterReply.ACCEPT, house.getFilterReply());
      }
    
      @Test
      public void testEnum() {
        setter.setProperty("houseColor", "BLUE");
        assertEquals(HouseColor.BLUE, house.getHouseColor());
      }
    
      @Test
      public void testDefaultClassAnnonation() {
        Method relevantMethod = setter.getRelevantMethod("SwimmingPool",
            AggregationType.AS_COMPLEX_PROPERTY);
        assertNotNull(relevantMethod);
        Class<?> spClass = setter.getDefaultClassNameByAnnonation("SwimmingPool",
            relevantMethod);
        assertEquals(SwimmingPoolImpl.class, spClass);
    
        Class<?> classViaImplicitRules = setter.getClassNameViaImplicitRules(
            "SwimmingPool", AggregationType.AS_COMPLEX_PROPERTY,
            defaultComponentRegistry);
        assertEquals(SwimmingPoolImpl.class, classViaImplicitRules);
      }
      
      @Test
      public void testDefaultClassAnnotationForLists() {
        Method relevantMethod = setter.getRelevantMethod("LargeSwimmingPool",
            AggregationType.AS_COMPLEX_PROPERTY_COLLECTION);
        assertNotNull(relevantMethod);
        Class<?> spClass = setter.getDefaultClassNameByAnnonation("LargeSwimmingPool",
            relevantMethod);
        assertEquals(LargeSwimmingPoolImpl.class, spClass);
    
        Class<?> classViaImplicitRules = setter.getClassNameViaImplicitRules(
            "LargeSwimmingPool", AggregationType.AS_COMPLEX_PROPERTY_COLLECTION,
            defaultComponentRegistry);
        assertEquals(LargeSwimmingPoolImpl.class, classViaImplicitRules);
      }
      
      @Test
      public void charset() {
        setter.setProperty("charset", "UTF-8");
        assertEquals(Charset.forName("UTF-8"), house.getCharset());
        
        house.setCharset(null);
        setter.setProperty("charset", "UTF");
        assertNull(house.getCharset());
    
        StatusChecker checker = new StatusChecker(context);
        checker.containsException(UnsupportedCharsetException.class);
      }
    }
    
    �������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/conditional/��������������������0000755�0001750�0001750�00000000000�12203357067�027342� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/conditional/PackageTest.java����0000644�0001750�0001750�00000001502�12136042272�032370� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.conditional;
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    import org.junit.runners.Suite.SuiteClasses;
    
    @RunWith(Suite.class)
    @SuiteClasses( { PropertyEvalScriptBuilderTest.class, IfThenElseTest.class,
        IfThenElseAndIncludeCompositionTest.class })
    public class PackageTest {
    
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000163�00000000000�011565� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/conditional/PropertyEvalScriptBuilderTest.java��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/conditional/PropertyEvalScriptBu0000644�0001750�0001750�00000007015�12136042272�033372� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.conditional;
    
    import static org.junit.Assert.*;
    
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.ContextBase;
    import ch.qos.logback.core.testUtil.RandomUtil;
    
    public class PropertyEvalScriptBuilderTest {
    
    
      Context context = new ContextBase();
      InterpretationContext localPropContainer = new InterpretationContext(context, null);
      PropertyEvalScriptBuilder pesb = new PropertyEvalScriptBuilder(localPropContainer);
      int diff = RandomUtil.getPositiveInt();
    
      String k = "ka" + diff;
      String v = "va";
      String containsScript = "p(\"" + k + "\").contains(\"" + v + "\")";
    
      String isNullScriptStr = "isNull(\"" + k + "\")";
      String isDefiedScriptStr = "isDefined(\"" + k + "\")";
    
      @Before
      public void setUp() {
        context.setName("c" + diff);
        pesb.setContext(context);
      }
    
      @After
      public void tearDown() {
        System.clearProperty(k);
      }
    
    
      void buildAndAssertTrue(String scriptStr) throws Exception {
        Condition condition = pesb.build(scriptStr);
        assertNotNull(condition);
        assertTrue(condition.evaluate());
      }
    
      void buildAndAssertFalse(String scriptStr) throws Exception {
        Condition condition = pesb.build(scriptStr);
        assertNotNull(condition);
        assertFalse(condition.evaluate());
      }
    
      @Test
      public void existingLocalPropertyShouldEvaluateToTrue() throws Exception {
        localPropContainer.addSubstitutionProperty(k, v);
        buildAndAssertTrue(containsScript);
      }
    
      @Test
      public void existingContextPropertyShouldEvaluateToTrue() throws Exception {
        context.putProperty(k, v);
        buildAndAssertTrue(containsScript);
      }
    
      @Test
      public void existingSystemPropertyShouldEvaluateToTrue() throws Exception {
        System.setProperty(k, v);
        buildAndAssertTrue(containsScript);
      }
    
      @Test
      public void isNullForExistingLocalProperty() throws Exception {
        localPropContainer.addSubstitutionProperty(k, v);
        buildAndAssertFalse(isNullScriptStr);
      }
      @Test
      public void isNullForExistingContextProperty() throws Exception {
        context.putProperty(k, v);
        buildAndAssertFalse(isNullScriptStr);
      }
      @Test
      public void isNullForExistingSystemProperty() throws Exception {
        System.setProperty(k, v);
        buildAndAssertFalse(isNullScriptStr);
      }
    
      @Test
      public void inexistentPropertyShouldEvaluateToFalse() throws Exception {
        buildAndAssertFalse(containsScript);
      }
    
      @Test
      public void isNullForInexistentPropertyShouldEvaluateToTrue() throws Exception {
        buildAndAssertTrue(isNullScriptStr);
      }
    
      public void isDefinedForIExistimgtPropertyShouldEvaluateToTrue() throws Exception {
        localPropContainer.addSubstitutionProperty(k, v);
        buildAndAssertTrue(isDefiedScriptStr);
      }
    
      @Test
      public void isDefinedForInexistentPropertyShouldEvaluateToTrue() throws Exception {
        buildAndAssertFalse(isDefiedScriptStr);
      }
    
    
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/conditional/IfThenElseTest.java�0000644�0001750�0001750�00000012264�12140150757�033035� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.conditional;
    
    
    import java.util.Arrays;
    import java.util.HashMap;
    import java.util.Stack;
    
    import ch.qos.logback.core.joran.action.PropertyAction;
    import ch.qos.logback.core.joran.spi.ElementSelector;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.ContextBase;
    import ch.qos.logback.core.joran.TrivialConfigurator;
    import ch.qos.logback.core.joran.action.Action;
    import ch.qos.logback.core.joran.action.NOPAction;
    import ch.qos.logback.core.joran.action.ext.StackAction;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.status.StatusChecker;
    import ch.qos.logback.core.testUtil.RandomUtil;
    import ch.qos.logback.core.util.CoreTestConstants;
    import ch.qos.logback.core.util.StatusPrinter;
    
    import static org.junit.Assert.*;
    
    public class IfThenElseTest {
    
      Context context = new ContextBase();
      StatusChecker checker = new StatusChecker(context);
      TrivialConfigurator tc;
      int diff = RandomUtil.getPositiveInt();
      static final String CONDITIONAL_DIR_PREFIX = CoreTestConstants.JORAN_INPUT_PREFIX
      + "conditional/";
    
      String ki1 = "ki1";
      String val1 = "val1";
      String sysKey = "sysKey";
      String dynaKey = "dynaKey";
    
      StackAction stackAction = new StackAction();
    
      @Before
      public void setUp() throws Exception {
        HashMap<ElementSelector, Action> rulesMap = new HashMap<ElementSelector, Action>();
        rulesMap.put(new ElementSelector("x"), new NOPAction());
        rulesMap.put(new ElementSelector("x/stack"), stackAction);
        rulesMap.put(new ElementSelector("x/property"), new PropertyAction());
        rulesMap.put(new ElementSelector("*/if"), new IfAction());
        rulesMap.put(new ElementSelector("*/if/then"), new ThenAction());
        rulesMap.put(new ElementSelector("*/if/then/*"), new NOPAction());
        rulesMap.put(new ElementSelector("*/if/else"), new ElseAction());
        rulesMap.put(new ElementSelector("*/if/else/*"), new NOPAction());
    
        tc = new TrivialConfigurator(rulesMap);
        tc.setContext(context);
      }
    
      @After
      public void tearDown() throws Exception {
        StatusPrinter.printIfErrorsOccured(context);
        System.clearProperty(sysKey);
      }
    
      @Test
      public void whenContextPropertyIsSet_IfThenBranchIsEvaluated() throws JoranException {
        context.putProperty(ki1, val1);
        tc.doConfigure(CONDITIONAL_DIR_PREFIX+"if0.xml");
        verifyConfig(new String[] {"BEGIN", "a", "END"});
      }
    
      @Test
      public void whenLocalPropertyIsSet_IfThenBranchIsEvaluated() throws JoranException {
        tc.doConfigure(CONDITIONAL_DIR_PREFIX+"if_localProperty.xml");
        verifyConfig(new String[] {"BEGIN", "a", "END"});
      }
    
    
      @Test
      public void whenNoPropertyIsDefined_ElseBranchIsEvaluated() throws JoranException {
        tc.doConfigure(CONDITIONAL_DIR_PREFIX+"if0.xml");
        verifyConfig(new String[] {"BEGIN", "b", "END"});
      }
    
      @Test
      public void whenContextPropertyIsSet_IfThenBranchIsEvaluated_NO_ELSE_DEFINED() throws JoranException {
        context.putProperty(ki1, val1);
        tc.doConfigure(CONDITIONAL_DIR_PREFIX+"ifWithoutElse.xml");
        verifyConfig(new String[] {"BEGIN", "a", "END"});
      }
    
      @Test
      public void whenNoPropertyIsDefined_IfThenBranchIsNotEvaluated_NO_ELSE_DEFINED() throws JoranException {
        tc.doConfigure(CONDITIONAL_DIR_PREFIX+"ifWithoutElse.xml");
        verifyConfig(new String[] {"BEGIN", "END"});
        assertTrue(checker.isErrorFree(0));
      }
    
      @Test
      public void nestedIf() throws JoranException {
        tc.doConfigure(CONDITIONAL_DIR_PREFIX+"nestedIf.xml");
        verifyConfig(new String[] {"BEGIN", "a", "c", "END"});
        assertTrue(checker.isErrorFree(0));
      }
    
      @Test
      public void useNonExistenceOfSystemPropertyToDefineAContextProperty() throws JoranException {
        assertNull(System.getProperty(sysKey));
        assertNull(context.getProperty(dynaKey));
        tc.doConfigure(CONDITIONAL_DIR_PREFIX+"ifSystem.xml");
        System.out.println(dynaKey+"="+context.getProperty(dynaKey));
        assertNotNull(context.getProperty(dynaKey));
      }
    
      @Test
      public void noContextPropertyShouldBeDefinedIfSystemPropertyExists() throws JoranException {
        System.setProperty(sysKey, "a");
        assertNull(context.getProperty(dynaKey));
        System.out.println("before "+dynaKey+"="+context.getProperty(dynaKey));
        tc.doConfigure(CONDITIONAL_DIR_PREFIX+"ifSystem.xml");
        System.out.println(dynaKey+"="+context.getProperty(dynaKey));
        assertNull(context.getProperty(dynaKey));
      }
    
      private void verifyConfig(String[] expected) {
        Stack<String> witness = new Stack<String>();
        witness.addAll(Arrays.asList(expected));
        assertEquals(witness, stackAction.getStack());
      }
    
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000171�00000000000�011564� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/conditional/IfThenElseAndIncludeCompositionTest.java��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/conditional/IfThenElseAndInclude0000644�0001750�0001750�00000007010�12140150757�033175� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.conditional;
    
    import static org.junit.Assert.assertEquals;
    
    import java.util.Arrays;
    import java.util.HashMap;
    import java.util.Stack;
    
    import ch.qos.logback.core.joran.spi.ElementSelector;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.ContextBase;
    import ch.qos.logback.core.joran.TrivialConfigurator;
    import ch.qos.logback.core.joran.action.Action;
    import ch.qos.logback.core.joran.action.IncludeAction;
    import ch.qos.logback.core.joran.action.NOPAction;
    import ch.qos.logback.core.joran.action.ext.StackAction;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.testUtil.RandomUtil;
    import ch.qos.logback.core.util.CoreTestConstants;
    import ch.qos.logback.core.util.StatusPrinter;
    
    public class IfThenElseAndIncludeCompositionTest {
    
      Context context = new ContextBase();
      TrivialConfigurator tc;
      int diff = RandomUtil.getPositiveInt();
      static final String CONDITIONAL_DIR_PREFIX = CoreTestConstants.JORAN_INPUT_PREFIX
          + "conditional/";
    
      final static String THEN_FILE_TO_INCLUDE_KEY = "thenFileToInclude";
      final static String ELSE_FILE_TO_INCLUDE_KEY = "elseFileToInclude";
      
      static final String NESTED_INCLUDE_FILE = CONDITIONAL_DIR_PREFIX+"nestedInclude.xml";
      static final String THEN_FILE_TO_INCLUDE = CONDITIONAL_DIR_PREFIX+"includedA.xml";
      static final String ELSE_FILE_TO_INCLUDE = CONDITIONAL_DIR_PREFIX+"includedB.xml";
    
      StackAction stackAction = new StackAction();
    
      
      @Before
      public void setUp() throws Exception {
        HashMap<ElementSelector, Action> rulesMap = new HashMap<ElementSelector, Action>();
        rulesMap.put(new ElementSelector("x"), new NOPAction());
        rulesMap.put(new ElementSelector("x/stack"), stackAction);
        rulesMap.put(new ElementSelector("*/if"), new IfAction());
        rulesMap.put(new ElementSelector("*/if/then"), new ThenAction());
        rulesMap.put(new ElementSelector("*/if/then/*"), new NOPAction());
        rulesMap.put(new ElementSelector("*/if/else"), new ElseAction());
        rulesMap.put(new ElementSelector("*/if/else/*"), new NOPAction());
        rulesMap.put(new ElementSelector("x/include"), new IncludeAction());
        
        tc = new TrivialConfigurator(rulesMap);
        tc.setContext(context);
      }
    
      @After
      public void tearDown() throws Exception {
        StatusPrinter.printInCaseOfErrorsOrWarnings(context);
        context = null;
        //StackAction.reset();
      }
      
      @Test
      public void includeNestedWithinIf() throws JoranException {
        context.putProperty(THEN_FILE_TO_INCLUDE_KEY, THEN_FILE_TO_INCLUDE);
        context.putProperty(ELSE_FILE_TO_INCLUDE_KEY, ELSE_FILE_TO_INCLUDE);
        tc.doConfigure(NESTED_INCLUDE_FILE);
        verifyConfig(new String[] {"BEGIN", "e0", "IncludedB0", "e1", "END"});
      }
      
      
      void verifyConfig(String[] expected) {
        Stack<String> witness = new Stack<String>();
        witness.addAll(Arrays.asList(expected));
        assertEquals(witness, stackAction.getStack());
      }
      
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/replay/�������������������������0000755�0001750�0001750�00000000000�12203357067�026333� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/replay/FruitFactory.java��������0000644�0001750�0001750�00000003477�12136042272�031624� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.replay;
    
    import java.util.List;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.ContextBase;
    import ch.qos.logback.core.joran.event.SaxEvent;
    import ch.qos.logback.core.joran.spi.JoranException;
    
    public class FruitFactory {
    
      static int count = 0;
      
      private List<SaxEvent> eventList;
      Fruit fruit;
      
      public void setFruit(Fruit fruit) {
        this.fruit = fruit;
      }
    
      public Fruit buildFruit() {
        
        Context context = new ContextBase();
        this.fruit = null;
        context.putProperty("fruitKey", "orange-"+count);
        // for next round
        count++;
        FruitConfigurator fruitConfigurator = new FruitConfigurator(this);
        fruitConfigurator.setContext(context);
        try {
          fruitConfigurator.doConfigure(eventList);
        } catch(JoranException je) {
          je.printStackTrace();
        }
        return fruit;
      }
    
      public String toString() {
        final String TAB = " ";
    
        StringBuilder retValue = new StringBuilder();
    
        retValue.append("FruitFactory ( ");
        if (eventList != null && eventList.size() > 0) {
          retValue.append("event1 = ").append(eventList.get(0)).append(TAB);
        }
        retValue.append(" )");
    
        return retValue.toString();
      }
    
      public void setEventList(List<SaxEvent> eventList) {
        this.eventList = eventList;
      }
    
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/replay/FruitFactoryAction.java��0000644�0001750�0001750�00000003335�12136042272�032753� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.replay;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import org.xml.sax.Attributes;
    
    import ch.qos.logback.core.joran.action.Action;
    import ch.qos.logback.core.joran.event.InPlayListener;
    import ch.qos.logback.core.joran.event.SaxEvent;
    import ch.qos.logback.core.joran.spi.ActionException;
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    
    public class FruitFactoryAction extends Action implements InPlayListener {
    
      List<SaxEvent> seList = new ArrayList<SaxEvent>();
    
      @Override
      public void begin(InterpretationContext ec, String name, Attributes attributes)
          throws ActionException {
        ec.addInPlayListener(this);
      }
    
      @Override
      public void end(InterpretationContext ec, String name) throws ActionException {
        ec.removeInPlayListener(this);
        
        Object o = ec.peekObject();
        if(o instanceof FruitShell) {
          FruitShell fs = (FruitShell) o;
          FruitFactory fruitFactory = new FruitFactory();
          fruitFactory.setEventList(new ArrayList<SaxEvent>(seList));
          fs.setFruitFactory(fruitFactory);
        }
      }
    
      public void inPlay(SaxEvent event) {
        seList.add(event);
      }
    
      public List<SaxEvent> getSeList() {
        return seList;
      }
    
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/replay/FruitConfigurator.java���0000644�0001750�0001750�00000004060�12140150757�032647� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.replay;
    
    import java.util.List;
    
    import ch.qos.logback.core.joran.GenericConfigurator;
    import ch.qos.logback.core.joran.action.NOPAction;
    import ch.qos.logback.core.joran.action.NestedComplexPropertyIA;
    import ch.qos.logback.core.joran.action.NestedBasicPropertyIA;
    import ch.qos.logback.core.joran.event.SaxEvent;
    import ch.qos.logback.core.joran.spi.EventPlayer;
    import ch.qos.logback.core.joran.spi.Interpreter;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.joran.spi.ElementSelector;
    import ch.qos.logback.core.joran.spi.RuleStore;
    
    public class FruitConfigurator extends GenericConfigurator {
    
      FruitFactory ff;
      public FruitConfigurator(FruitFactory ff) {
        this.ff = ff;
      }
    
      @Override
      final public void doConfigure(final List<SaxEvent> eventList)
          throws JoranException {
        buildInterpreter();
        interpreter.getInterpretationContext().pushObject(ff);
        EventPlayer player = new EventPlayer(interpreter);
        player.play(eventList);
      }
    
      @Override
      protected void addImplicitRules(Interpreter interpreter) {
        NestedComplexPropertyIA nestedIA = new NestedComplexPropertyIA();
        nestedIA.setContext(context);
        interpreter.addImplicitAction(nestedIA);
        
        NestedBasicPropertyIA nestedSimpleIA = new NestedBasicPropertyIA();
        nestedIA.setContext(context);
        interpreter.addImplicitAction(nestedSimpleIA);
      }
    
      
      @Override
      protected void addInstanceRules(RuleStore rs) {
        rs.addRule(new ElementSelector("fruitShell"), new NOPAction());
      }
    
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/replay/FruitShell.java����������0000644�0001750�0001750�00000002753�12136042272�031260� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.replay;
    
    import ch.qos.logback.core.spi.ContextAwareBase;
    
    public class FruitShell extends ContextAwareBase {
    
      FruitFactory fruitFactory;
      String name;
      
      public void setFruitFactory(FruitFactory fruitFactory) {
        this.fruitFactory = fruitFactory;
      }
    
      void testFruit() {
        
        Fruit fruit = fruitFactory.buildFruit();
        System.out.println(fruit);
      }
    
      public String getName() {
        return name;
      }
    
      public void setName(String name) {
        this.name = name;
      }
    
      /**
       * Constructs a <code>String</code> with all attributes
       * in name = value format.
       *
       * @return a <code>String</code> representation 
       * of this object.
       */
      public String toString()
      {
          final String TAB = " ";
          
          String retValue = "";
          
          retValue = "FruitShell ( "
              + "fruitFactory = " + this.fruitFactory + TAB
              + "name = " + this.name + TAB
              + " )";
          
          return retValue;
      }
      
    }
    ���������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/replay/PackageTest.java���������0000644�0001750�0001750�00000001355�12136042272�031367� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.replay;
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    import org.junit.runners.Suite.SuiteClasses;
    
    @RunWith(Suite.class)
    @SuiteClasses({FruitConfigurationTest.class})
    public class PackageTest {
    
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/replay/WeightytFruit.java�������0000644�0001750�0001750�00000001344�12136042272�032010� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.replay;
    
    public class WeightytFruit extends Fruit {
    
      double weight;
    
      public double getWeight() {
        return weight;
      }
    
      public void setWeight(double weight) {
        this.weight = weight;
      }
      
      
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/replay/Fruit.java���������������0000644�0001750�0001750�00000002152�12136042272�030261� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.replay;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class Fruit {
    
      String name;
      List<String> textList = new ArrayList<String>();
      
      public void setName(String name) {
        this.name = name;
      }
    
      public String getName() {
        return name;
      }
    
      public String toString() {
        final String TAB = "    ";
    
        StringBuilder retValue = new StringBuilder();
    
        retValue.append("xFruit ( ").append("name = ").append(this.name).append(TAB).append(" )");
    
        return retValue.toString();
      }
      
      public void addText(String s) {
        textList.add(s);
      }
      
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/replay/FruitShellAction.java����0000644�0001750�0001750�00000004576�12136042272�032423� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.replay;
    
    import org.xml.sax.Attributes;
    
    import ch.qos.logback.core.joran.action.Action;
    import ch.qos.logback.core.joran.spi.ActionException;
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    import ch.qos.logback.core.util.OptionHelper;
    
    /** 
     * The Fruit* code is intended to test Joran's replay capability
     * */
    public class FruitShellAction extends Action {
    
      FruitShell fruitShell;
      private boolean inError = false;
    
      
      @Override
      public void begin(InterpretationContext ec, String name, Attributes attributes)
          throws ActionException {
    
        // We are just beginning, reset variables
        fruitShell = new FruitShell();
        inError = false;
        
        try {
    
    
          fruitShell.setContext(context);
    
          String shellName = attributes.getValue(NAME_ATTRIBUTE);
    
          if (OptionHelper.isEmpty(shellName)) {
            addWarn(
              "No appender name given for fruitShell].");
          } else {
            fruitShell.setName(shellName);
            addInfo("FruitShell named as [" + shellName + "]");
          }
    
          ec.pushObject(fruitShell);
        } catch (Exception oops) {
          inError = true;
          addError(
            "Could not create an FruitShell", oops);
          throw new ActionException(oops);
        }
      }
    
      @Override
      public void end(InterpretationContext ec, String name) throws ActionException {
        if (inError) {
          return;
        }
    
        Object o = ec.peekObject();
    
        if (o != fruitShell) {
          addWarn(
            "The object at the of the stack is not the fruitShell named ["
            + fruitShell.getName() + "] pushed earlier.");
        } else {
          addInfo(
            "Popping fruitSHell named [" + fruitShell.getName()
            + "] from the object stack");
          ec.popObject();
          FruitContext fruitContext = (FruitContext) ec.getContext();
          fruitContext.addFruitShell(fruitShell);
        }
      }
    
      
    }
    ����������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000147�00000000000�011567� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/replay/FruitConfigurationTest.java��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/replay/FruitConfigurationTest.ja0000644�0001750�0001750�00000007404�12140150757�033332� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.replay;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertNotNull;
    import static org.junit.Assert.assertTrue;
    
    import java.util.HashMap;
    import java.util.List;
    
    import ch.qos.logback.core.joran.spi.ElementSelector;
    import org.junit.Test;
    
    import ch.qos.logback.core.joran.SimpleConfigurator;
    import ch.qos.logback.core.joran.action.Action;
    import ch.qos.logback.core.joran.action.NOPAction;
    import ch.qos.logback.core.util.CoreTestConstants;
    import ch.qos.logback.core.util.StatusPrinter;
    
    /** 
     * The Fruit* code is intended to test Joran's replay capability
     * */
    public class FruitConfigurationTest  {
    
      FruitContext fruitContext = new FruitContext();
    
      public List<FruitShell> doFirstPart(String filename) throws Exception {
    
        try {
          HashMap<ElementSelector, Action> rulesMap = new HashMap<ElementSelector, Action>();
          rulesMap.put(new ElementSelector("group/fruitShell"), new FruitShellAction());
          rulesMap.put(new ElementSelector("group/fruitShell/fruit"),
              new FruitFactoryAction());
          rulesMap.put(new ElementSelector("group/fruitShell/fruit/*"), new NOPAction());
          SimpleConfigurator simpleConfigurator = new SimpleConfigurator(rulesMap);
    
          simpleConfigurator.setContext(fruitContext);
    
          simpleConfigurator.doConfigure(CoreTestConstants.TEST_SRC_PREFIX + "input/joran/replay/"
              + filename);
    
          return fruitContext.getFruitShellList();
        } catch (Exception je) {
          StatusPrinter.print(fruitContext);
          throw je;
        }
      }
    
      @Test
      public void fruit1() throws Exception {
        List<FruitShell> fsList = doFirstPart("fruit1.xml");
        assertNotNull(fsList);
        assertEquals(1, fsList.size());
    
        FruitShell fs0 = fsList.get(0);
        assertNotNull(fs0);
        assertEquals("fs0", fs0.getName());
        Fruit fruit0 = fs0.fruitFactory.buildFruit();
        assertTrue(fruit0 instanceof Fruit);
        assertEquals("blue", fruit0.getName());
      }
    
    
      @Test
      public void fruit2() throws Exception {
        List<FruitShell> fsList = doFirstPart("fruit2.xml");
        assertNotNull(fsList);
        assertEquals(2, fsList.size());
    
        FruitShell fs0 = fsList.get(0);
        assertNotNull(fs0);
        assertEquals("fs0", fs0.getName());
        Fruit fruit0 = fs0.fruitFactory.buildFruit();
        assertTrue(fruit0 instanceof Fruit);
        assertEquals("blue", fruit0.getName());
    
        FruitShell fs1 = fsList.get(1);
        assertNotNull(fs1);
        assertEquals("fs1", fs1.getName());
        Fruit fruit1 = fs1.fruitFactory.buildFruit();
        assertTrue(fruit1 instanceof WeightytFruit);
        assertEquals("orange", fruit1.getName());
        assertEquals(1.2, ((WeightytFruit) fruit1).getWeight(), 0.01);
      }
    
      @Test
      public void withSubst() throws Exception {
        List<FruitShell> fsList = doFirstPart("fruitWithSubst.xml");
        assertNotNull(fsList);
        assertEquals(1, fsList.size());
    
        FruitShell fs0 = fsList.get(0);
        assertNotNull(fs0);
        assertEquals("fs0", fs0.getName());
        int oldCount = FruitFactory.count;
        Fruit fruit0 = fs0.fruitFactory.buildFruit();
        assertTrue(fruit0 instanceof WeightytFruit);
        assertEquals("orange-" + oldCount, fruit0.getName());
        assertEquals(1.2, ((WeightytFruit) fruit0).getWeight(), 0.01);
      }
    
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/replay/FruitContext.java��������0000644�0001750�0001750�00000002013�12136042272�031622� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.replay;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import ch.qos.logback.core.ContextBase;
    
    public class FruitContext extends ContextBase {
    
      List<FruitShell> fruitShellList = new ArrayList<FruitShell>();
      
      public void addFruitShell(FruitShell fs) {
        fruitShellList.add(fs);
      }
    
      public List<FruitShell> getFruitShellList() {
        return fruitShellList;
      }
    
      public void setFruitShellList(List<FruitShell> fruitShellList) {
        this.fruitShellList = fruitShellList;
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/implicitAction/�����������������0000755�0001750�0001750�00000000000�12203357067�030007� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000153�00000000000�011564� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/implicitAction/ImplicitActionTest.java����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/implicitAction/ImplicitActionTes0000644�0001750�0001750�00000007046�12140150757�033322� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.implicitAction;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertNotNull;
    
    import java.util.HashMap;
    import java.util.List;
    
    import org.junit.Before;
    import org.junit.Test;
    
    import ch.qos.logback.core.joran.SimpleConfigurator;
    import ch.qos.logback.core.joran.action.Action;
    import ch.qos.logback.core.joran.spi.ElementSelector;
    import ch.qos.logback.core.util.CoreTestConstants;
    import ch.qos.logback.core.util.StatusPrinter;
    
    public class ImplicitActionTest {
    
      static final String IMPLCIT_DIR = CoreTestConstants.TEST_SRC_PREFIX
          + "input/joran/implicitAction/";
    
      FruitContext fruitContext = new FruitContext();
      SimpleConfigurator simpleConfigurator;
    
      @Before
      public void setUp() throws Exception {
        fruitContext.setName("fruits");
        HashMap<ElementSelector, Action> rulesMap = new HashMap<ElementSelector, Action>();
        rulesMap.put(new ElementSelector("/context/"), new FruitContextAction());
        simpleConfigurator = new SimpleConfigurator(rulesMap);
        simpleConfigurator.setContext(fruitContext);
      }
    
      void verifyFruit() {
        List<Fruit> fList = fruitContext.getFruitList();
        assertNotNull(fList);
        assertEquals(1, fList.size());
    
        Fruit f0 = fList.get(0);
        assertEquals("blue", f0.getName());
        assertEquals(2, f0.textList.size());
        assertEquals("hello", f0.textList.get(0));
        assertEquals("world", f0.textList.get(1));
      }
    
      @Test
      public void nestedComplex() throws Exception {
        try {
          simpleConfigurator.doConfigure(IMPLCIT_DIR + "nestedComplex.xml");
          verifyFruit();
    
        } catch (Exception je) {
          StatusPrinter.print(fruitContext);
          throw je;
        }
      }
    
      @Test
      public void nestedComplexWithoutClassAtrribute() throws Exception {
        try {
          simpleConfigurator.doConfigure(IMPLCIT_DIR
              + "nestedComplexWithoutClassAtrribute.xml");
    
          verifyFruit();
    
        } catch (Exception je) {
          StatusPrinter.print(fruitContext);
          throw je;
        }
      }
    
      
      void verifyFruitList() {
        List<Fruit> fList = fruitContext.getFruitList();
        assertNotNull(fList);
        assertEquals(1, fList.size());
    
        Fruit f0 = fList.get(0);
        assertEquals(2, f0.cakeList.size());
    
        Cake cakeA = f0.cakeList.get(0);
        assertEquals("A", cakeA.getType());
    
        Cake cakeB = f0.cakeList.get(1);
        assertEquals("B", cakeB.getType());
      }
      @Test
      public void nestedComplexCollection() throws Exception {
        try {
          simpleConfigurator.doConfigure(IMPLCIT_DIR
              + "nestedComplexCollection.xml");
          verifyFruitList();
        } catch (Exception je) {
          StatusPrinter.print(fruitContext);
          throw je;
        }
      }
    
      
      @Test
      public void nestedComplexCollectionWithoutClassAtrribute() throws Exception {
        try {
          simpleConfigurator.doConfigure(IMPLCIT_DIR
              + "nestedComplexCollectionWithoutClassAtrribute.xml");
          verifyFruitList();
        } catch (Exception je) {
          StatusPrinter.print(fruitContext);
          throw je;
        }
      }
    
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/implicitAction/Cake.java��������0000644�0001750�0001750�00000001504�12136042272�031507� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.implicitAction;
    
    public class Cake {
    
      String type;
      int code;
      
      public String getType() {
        return type;
      }
      public void setType(String type) {
        this.type = type;
      }
      public int getCode() {
        return code;
      }
      public void setCode(int code) {
        this.code = code;
      }
      
      
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000153�00000000000�011564� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/implicitAction/FruitContextAction.java����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/implicitAction/FruitContextActio0000644�0001750�0001750�00000003254�12136042272�033346� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.implicitAction;
    
    import org.xml.sax.Attributes;
    
    import ch.qos.logback.core.joran.action.Action;
    import ch.qos.logback.core.joran.spi.ActionException;
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    
    public class FruitContextAction extends Action {
    
      private boolean inError = false;
    
      
      @Override
      public void begin(InterpretationContext ec, String name, Attributes attributes)
          throws ActionException {
    
        inError = false;
        
        try {
          ec.pushObject(context);
        } catch (Exception oops) {
          inError = true;
          addError(
            "Could not push context", oops);
          throw new ActionException(oops);
        }
      }
    
      @Override
      public void end(InterpretationContext ec, String name) throws ActionException {
        if (inError) {
          return;
        }
    
        Object o = ec.peekObject();
    
        if (o != context) {
          addWarn(
            "The object at the of the stack is not the context named ["
            + context.getName() + "] pushed earlier.");
        } else {
          addInfo(
            "Popping context named [" + context.getName()
            + "] from the object stack");
          ec.popObject();
        }
      }
    
      
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/implicitAction/PackageTest.java�0000644�0001750�0001750�00000001357�12136042272�033045� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.implicitAction;
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    import org.junit.runners.Suite.SuiteClasses;
    
    @RunWith(Suite.class)
    @SuiteClasses({ImplicitActionTest.class})
    public class PackageTest {
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/implicitAction/Fruit.java�������0000644�0001750�0001750�00000001731�12136042272�031737� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.implicitAction;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class Fruit {
    
      String name;
      List<String> textList = new ArrayList<String>();
      List<Cake> cakeList = new ArrayList<Cake>();
      
      public void setName(String n) {
        this.name = n;
      }
    
      public String getName() {
        return name;
      }
      
      public void addText(String s) {
        textList.add(s);
      }
      
      public void addCake(Cake c) {
        cakeList.add(c);
      }
    }
    ���������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/implicitAction/FruitContext.java0000644�0001750�0001750�00000001722�12136042272�033304� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.implicitAction;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import ch.qos.logback.core.ContextBase;
    
    public class FruitContext extends ContextBase {
    
      List<Fruit> fruitList = new ArrayList<Fruit>();
      
      public void addFruit(Fruit fs) {
        fruitList.add(fs);
      }
    
      public List<Fruit> getFruitList() {
        return fruitList;
      }
    
      public void setFruitShellList(List<Fruit> fruitList) {
        this.fruitList = fruitList;
      }
    }
    ����������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/SimpleConfigurator.java���������0000644�0001750�0001750�00000003446�12140150757�031522� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran;
    
    import java.util.HashMap;
    
    import ch.qos.logback.core.joran.action.Action;
    import ch.qos.logback.core.joran.action.NestedComplexPropertyIA;
    import ch.qos.logback.core.joran.action.NestedBasicPropertyIA;
    import ch.qos.logback.core.joran.spi.Interpreter;
    import ch.qos.logback.core.joran.spi.ElementSelector;
    import ch.qos.logback.core.joran.spi.RuleStore;
    
    public class SimpleConfigurator extends GenericConfigurator {
    
      HashMap<ElementSelector, Action> rulesMap;
      
      public SimpleConfigurator(HashMap<ElementSelector, Action> rules) {
        this.rulesMap = rules;
      }
      
      @Override
      protected void addImplicitRules(Interpreter interpreter) {
        NestedComplexPropertyIA nestedIA = new NestedComplexPropertyIA();
        nestedIA.setContext(context);
        interpreter.addImplicitAction(nestedIA);
    
        NestedBasicPropertyIA nestedSimpleIA = new NestedBasicPropertyIA();
        nestedSimpleIA.setContext(context);
        interpreter.addImplicitAction(nestedSimpleIA);
      }
    
      public Interpreter getInterpreter() {
        return interpreter;
      }
    
      @Override
      protected void addInstanceRules(RuleStore rs) {
        for(ElementSelector elementSelector : rulesMap.keySet()) {
          Action action = rulesMap.get(elementSelector);
          rs.addRule(elementSelector, action);
        }
      }
    
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/event/��������������������������0000755�0001750�0001750�00000000000�12203357067�026160� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/event/InPlayFireTest.java�������0000644�0001750�0001750�00000005456�12140150757�031674� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.event;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertTrue;
    
    import java.util.HashMap;
    
    import ch.qos.logback.core.joran.spi.ElementPath;
    import ch.qos.logback.core.joran.spi.ElementSelector;
    import org.junit.Test;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.ContextBase;
    import ch.qos.logback.core.joran.TrivialConfigurator;
    import ch.qos.logback.core.joran.action.Action;
    import ch.qos.logback.core.joran.spi.JoranException;
    import ch.qos.logback.core.util.CoreTestConstants;
    
    public class InPlayFireTest  {
    
      Context context = new ContextBase();
      HashMap<ElementSelector, Action> rulesMap = new HashMap<ElementSelector, Action>();
    
      @Test
      public void testBasic() throws JoranException {
        ListenAction listenAction = new ListenAction();
        
        rulesMap.put(new ElementSelector("fire"), listenAction);
        TrivialConfigurator gc = new TrivialConfigurator(rulesMap);
    
        gc.setContext(context);
        gc.doConfigure(CoreTestConstants.TEST_SRC_PREFIX + "input/joran/fire1.xml");
        
        //for(SaxEvent se: listenAction.getSeList()) {
        //  System.out.println(se);
        //}
        assertEquals(5, listenAction.getSeList().size());
        assertTrue(listenAction.getSeList().get(0) instanceof StartEvent);
        assertTrue(listenAction.getSeList().get(1) instanceof StartEvent);
        assertTrue(listenAction.getSeList().get(2) instanceof BodyEvent);
        assertTrue(listenAction.getSeList().get(3) instanceof EndEvent);
      }
    
      @Test
      public void testReplay() throws JoranException {
        ListenAction listenAction = new ListenAction();
        
        rulesMap.put(new ElementSelector("fire"), listenAction);
        TrivialConfigurator gc = new TrivialConfigurator(rulesMap);
    
        gc.setContext(context);
        gc.doConfigure(CoreTestConstants.TEST_SRC_PREFIX + "input/joran/fire1.xml");
        
    //    for(SaxEvent se: listenAction.getSeList()) {
    //      System.out.println(se);
    //    }
        assertEquals(5, listenAction.getSeList().size());
        assertTrue(listenAction.getSeList().get(0) instanceof StartEvent);
        assertTrue(listenAction.getSeList().get(1) instanceof StartEvent);
        assertTrue(listenAction.getSeList().get(2) instanceof BodyEvent);
        assertTrue(listenAction.getSeList().get(3) instanceof EndEvent);
      }
      
      
      
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/event/ListenAction.java���������0000644�0001750�0001750�00000002523�12136042272�031413� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.event;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import org.xml.sax.Attributes;
    
    import ch.qos.logback.core.joran.action.Action;
    import ch.qos.logback.core.joran.spi.ActionException;
    import ch.qos.logback.core.joran.spi.InterpretationContext;
    
    public class ListenAction extends Action implements InPlayListener {
    
      List<SaxEvent> seList = new ArrayList<SaxEvent>();
    
      @Override
      public void begin(InterpretationContext ec, String name, Attributes attributes)
          throws ActionException {
        ec.addInPlayListener(this);
      }
    
      @Override
      public void end(InterpretationContext ec, String name) throws ActionException {
        ec.removeInPlayListener(this);
    
      }
    
      public void inPlay(SaxEvent event) {
        seList.add(event);
      }
    
      public List<SaxEvent> getSeList() {
        return seList;
      }
    
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/event/PackageTest.java����������0000644�0001750�0001750�00000001376�12136042272�031217� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.event;
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    import org.junit.runners.Suite.SuiteClasses;
    
    @RunWith(Suite.class)
    @SuiteClasses({SaxEventRecorderTest.class, InPlayFireTest.class})
    public class PackageTest {
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/event/SaxEventRecorderTest.java�0000644�0001750�0001750�00000006266�12136252450�033113� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.event;
    
    import static org.junit.Assert.*;
    
    import java.io.FileInputStream;
    import java.util.List;
    
    import javax.xml.parsers.SAXParser;
    import javax.xml.parsers.SAXParserFactory;
    
    import ch.qos.logback.core.status.StatusChecker;
    import org.junit.Test;
    import org.xml.sax.Attributes;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.ContextBase;
    import ch.qos.logback.core.status.Status;
    import ch.qos.logback.core.status.StatusManager;
    import ch.qos.logback.core.util.CoreTestConstants;
    
    /**
     * Test whether SaxEventRecorder does a good job.
     * 
     * @author Ceki Gulcu
     */
    public class SaxEventRecorderTest {
    
      Context context =  new ContextBase();
      StatusChecker statusChecker = new StatusChecker(context);
    
      SAXParser createParser() throws Exception {
        SAXParserFactory spf = SAXParserFactory.newInstance();
        return spf.newSAXParser();
      }
    
      public List<SaxEvent> doTest(String filename) throws Exception {
        SaxEventRecorder recorder = new SaxEventRecorder(context);
        FileInputStream fis = new FileInputStream(CoreTestConstants.TEST_SRC_PREFIX
            + "input/joran/"+ filename);
        recorder.recordEvents(fis);
        return  recorder.getSaxEventList();
        
     
      }
     
      public void dump(List<SaxEvent> seList) {
        for (SaxEvent se : seList) {
          System.out.println(se);
        }
      }
    
      @Test
      public void test1() throws Exception {
        List<SaxEvent> seList = doTest("event1.xml");
        assertTrue(statusChecker.getHighestLevel(0) == Status.INFO);
        //dump(seList);  
        assertEquals(11, seList.size());
      }
    
      @Test
      public void test2() throws Exception {
        List<SaxEvent> seList = doTest("ampEvent.xml");
        StatusManager sm = context.getStatusManager();
        assertTrue(statusChecker.getHighestLevel(0) == Status.INFO);
        //dump(seList);  
        assertEquals(3, seList.size());
        
        BodyEvent be = (BodyEvent) seList.get(1);
        assertEquals("xxx & yyy", be.getText());
      }
    
      @Test
      public void test3() throws Exception {
        List<SaxEvent> seList = doTest("inc.xml");
        StatusManager sm = context.getStatusManager();
        assertTrue(statusChecker.getHighestLevel(0) == Status.INFO);
        //dump(seList);
        assertEquals(4, seList.size());
        
        StartEvent se = (StartEvent) seList.get(1);
        Attributes attr = se.getAttributes();
        assertNotNull(attr);
        assertEquals("1", attr.getValue("increment"));
      }
      
      @Test
      public void bodyWithSpacesAndQuotes() throws Exception {
        List<SaxEvent> seList = doTest("spacesAndQuotes.xml");
        assertEquals(3, seList.size());
        BodyEvent be = (BodyEvent) seList.get(1);
        assertEquals("[x][x] \"xyz\"%n", be.getText());
      }
      
      
    
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/SkippingInInterpreterTest.java��0000644�0001750�0001750�00000010376�12140150757�033045� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertNull;
    import static org.junit.Assert.assertTrue;
    
    import java.util.HashMap;
    import java.util.List;
    
    import javax.xml.parsers.SAXParser;
    import javax.xml.parsers.SAXParserFactory;
    
    import ch.qos.logback.core.joran.spi.ElementSelector;
    import org.junit.Test;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.ContextBase;
    import ch.qos.logback.core.joran.action.Action;
    import ch.qos.logback.core.joran.action.NOPAction;
    import ch.qos.logback.core.joran.action.ext.BadBeginAction;
    import ch.qos.logback.core.joran.action.ext.BadEndAction;
    import ch.qos.logback.core.joran.action.ext.HelloAction;
    import ch.qos.logback.core.joran.action.ext.TouchAction;
    import ch.qos.logback.core.joran.spi.ActionException;
    import ch.qos.logback.core.status.Status;
    import ch.qos.logback.core.status.StatusManager;
    import ch.qos.logback.core.util.CoreTestConstants;
    
    /**
     * Test the way Interpreter skips child elements in case of exceptions thrown by
     * Actions. It also tests addition of status messages in case of exceptions.
     * 
     * @author Ceki Gulcu
     */
    public class SkippingInInterpreterTest {
    
      HashMap<ElementSelector, Action> rulesMap = new HashMap<ElementSelector, Action>();
      Context context = new ContextBase();
      StatusManager sm = context.getStatusManager();
    
      SAXParser createParser() throws Exception {
        SAXParserFactory spf = SAXParserFactory.newInstance();
        return spf.newSAXParser();
      }
    
      void doTest(String filename, Integer expectedInt, Class<?> exceptionClass)
          throws Exception {
    
        rulesMap.put(new ElementSelector("test"), new NOPAction());
        rulesMap.put(new ElementSelector("test/badBegin"), new BadBeginAction());
        rulesMap.put(new ElementSelector("test/badBegin/touch"), new TouchAction());
        rulesMap.put(new ElementSelector("test/badEnd"), new BadEndAction());
        rulesMap.put(new ElementSelector("test/badEnd/touch"), new TouchAction());
        rulesMap.put(new ElementSelector("test/hello"), new HelloAction());
    
        rulesMap.put(new ElementSelector("test/isolate"), new NOPAction());
        rulesMap.put(new ElementSelector("test/isolate/badEnd"), new BadEndAction());
        rulesMap.put(new ElementSelector("test/isolate/badEnd/touch"), new TouchAction());
        rulesMap.put(new ElementSelector("test/isolate/touch"), new TouchAction());
        rulesMap.put(new ElementSelector("test/hello"), new HelloAction());
    
        TrivialConfigurator tc = new TrivialConfigurator(rulesMap);
        tc.setContext(context);
        tc.doConfigure(CoreTestConstants.TEST_SRC_PREFIX + "input/joran/skip/" + filename);
    
        String str = context.getProperty(HelloAction.PROPERTY_KEY);
        assertEquals("Hello John Doe.", str);
    
        Integer i = (Integer) context.getObject(TouchAction.KEY);
        if (expectedInt == null) {
          assertNull(i);
        } else {
          assertEquals(expectedInt, i);
        }
    
        // check the existence of an ERROR status
        List<Status> statusList = sm.getCopyOfStatusList();
        Status s0 = statusList.get(0);
        assertEquals(Status.ERROR, s0.getLevel());
        assertTrue(s0.getThrowable().getClass() == exceptionClass);
      }
    
      @Test
      public void testSkippingRuntimeExInBadBegin() throws Exception {
        doTest("badBegin1.xml", null, IllegalStateException.class);
      }
    
      @Test
      public void testSkippingActionExInBadBegin() throws Exception {
        doTest("badBegin2.xml", null, ActionException.class);
      }
    
      @Test
      public void testSkippingRuntimeExInBadEnd() throws Exception {
        doTest("badEnd1.xml", new Integer(2), IllegalStateException.class);
      }
    
      @Test
      public void testSkippingActionExInBadEnd() throws Exception {
        doTest("badEnd2.xml", new Integer(2), ActionException.class);
      }
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/PackageTest.java����������������0000644�0001750�0001750�00000002251�12136042272�030067� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran;
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    import org.junit.runners.Suite.SuiteClasses;
    
    @RunWith(Suite.class)
    @SuiteClasses( { SkippingInInterpreterTest.class,
        TrivialConfiguratorTest.class,
        ch.qos.logback.core.joran.action.PackageTest.class,
        ch.qos.logback.core.joran.event.PackageTest.class,
        ch.qos.logback.core.joran.util.PackageTest.class,
        ch.qos.logback.core.joran.spi.PackageTest.class,
        ch.qos.logback.core.joran.replay.PackageTest.class,
        ch.qos.logback.core.joran.implicitAction.PackageTest.class,
        ch.qos.logback.core.joran.conditional.PackageTest.class
      })
    public class PackageTest {
    
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/spi/����������������������������0000755�0001750�0001750�00000000000�12203357067�025632� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/spi/SimpleRuleStoreTest.java����0000644�0001750�0001750�00000016174�12140150757�032441� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.spi;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertNotNull;
    import static org.junit.Assert.assertNull;
    import static org.junit.Assert.assertTrue;
    import static org.junit.Assert.fail;
    
    import java.util.List;
    
    import org.junit.Test;
    import org.xml.sax.Attributes;
    
    import ch.qos.logback.core.ContextBase;
    import ch.qos.logback.core.joran.action.Action;
    
    /**
     * Test SimpleRuleStore for various explicit rule combinations.
     * 
     * We also test that explicit patterns are case sensitive.
     * 
     * @author Ceki G&uuml;lc&uuml;
     */
    public class SimpleRuleStoreTest {
    
      SimpleRuleStore srs = new SimpleRuleStore(new ContextBase());
      CaseCombinator cc = new CaseCombinator();
      
      @Test
      public void smoke() throws Exception {
        srs.addRule(new ElementSelector("a/b"), new XAction());
    
        // test for all possible case combinations of "a/b"
        for (String s : cc.combinations("a/b")) {
          System.out.println("s="+s);
          List<Action> r = srs.matchActions(new ElementPath(s));
          assertNotNull(r);
          assertEquals(1, r.size());
    
          if (!(r.get(0) instanceof XAction)) {
            fail("Wrong type");
          }
        }
      }
    
      @Test
      public void smokeII() throws Exception {
        srs.addRule(new ElementSelector("a/b"), new XAction());
        srs.addRule(new ElementSelector("a/b"), new YAction());
    
        for (String s : cc.combinations("a/b")) {
          List<Action> r = srs.matchActions(new ElementPath(s));
          assertNotNull(r);
          assertEquals(2, r.size());
    
          if (!(r.get(0) instanceof XAction)) {
            fail("Wrong type");
          }
    
          if (!(r.get(1) instanceof YAction)) {
            fail("Wrong type");
          }
        }
      }
    
      @Test
      public void testSlashSuffix() throws Exception {
        ElementSelector pa = new ElementSelector("a/");
        srs.addRule(pa, new XAction());
    
        for (String s : cc.combinations("a")) {
          List<Action> r = srs.matchActions(new ElementPath(s));
          assertNotNull(r);
          assertEquals(1, r.size());
    
          if (!(r.get(0) instanceof XAction)) {
            fail("Wrong type");
          }
        }
    
      }
    
      @Test
      public void testTail1() throws Exception {
        srs.addRule(new ElementSelector("*/b"), new XAction());
    
        for (String s : cc.combinations("a/b")) {
          List<Action> r = srs.matchActions(new ElementPath(s));
          assertNotNull(r);
    
          assertEquals(1, r.size());
    
          if (!(r.get(0) instanceof XAction)) {
            fail("Wrong type");
          }
        }
      }
    
      @Test
      public void testTail2() throws Exception {
        SimpleRuleStore srs = new SimpleRuleStore(new ContextBase());
        srs.addRule(new ElementSelector("*/c"), new XAction());
    
        for (String s : cc.combinations("a/b/c")) {
          List<Action> r = srs.matchActions(new ElementPath(s));
          assertNotNull(r);
    
          assertEquals(1, r.size());
    
          if (!(r.get(0) instanceof XAction)) {
            fail("Wrong type");
          }
        }
      }
    
      @Test
      public void testTail3() throws Exception {
        srs.addRule(new ElementSelector("*/b"), new XAction());
        srs.addRule(new ElementSelector("*/a/b"), new YAction());
    
        for (String s : cc.combinations("a/b")) {
          List<Action> r = srs.matchActions(new ElementPath(s));
          assertNotNull(r);
          assertEquals(1, r.size());
    
          if (!(r.get(0) instanceof YAction)) {
            fail("Wrong type");
          }
        }
      }
    
      @Test
      public void testTail4() throws Exception {
        srs.addRule(new ElementSelector("*/b"), new XAction());
        srs.addRule(new ElementSelector("*/a/b"), new YAction());
        srs.addRule(new ElementSelector("a/b"), new ZAction());
    
        for (String s : cc.combinations("a/b")) {
          List<Action> r = srs.matchActions(new ElementPath(s));
          assertNotNull(r);
          assertEquals(1, r.size());
    
          if (!(r.get(0) instanceof ZAction)) {
            fail("Wrong type");
          }
        }
      }
    
      @Test
      public void testSuffix() throws Exception {
        srs.addRule(new ElementSelector("a"), new XAction());
        srs.addRule(new ElementSelector("a/*"), new YAction());
    
        for (String s : cc.combinations("a/b")) {
          List<Action> r = srs.matchActions(new ElementPath(s));
          assertNotNull(r);
          assertEquals(1, r.size());
          assertTrue(r.get(0) instanceof YAction);
        }
      }
    
      @Test
      public void testDeepSuffix() throws Exception {
        srs.addRule(new ElementSelector("a"), new XAction(1));
        srs.addRule(new ElementSelector("a/b/*"), new XAction(2));
    
        for (String s : cc.combinations("a/other")) {
          List<Action> r = srs.matchActions(new ElementPath(s));
          assertNull(r);
        }
      }
    
      @Test
      public void testPrefixSuffixInteraction1() throws Exception {
        srs.addRule(new ElementSelector("a"), new ZAction());
        srs.addRule(new ElementSelector("a/*"), new YAction());
        srs.addRule(new ElementSelector("*/a/b"), new XAction(3));
    
        for (String s : cc.combinations("a/b")) {
          List<Action> r = srs.matchActions(new ElementPath(s));
          assertNotNull(r);
    
          assertEquals(1, r.size());
    
          assertTrue(r.get(0) instanceof XAction);
          XAction xaction = (XAction) r.get(0);
          assertEquals(3, xaction.id);
        }
      }
    
      @Test
      public void testPrefixSuffixInteraction2() throws Exception {
        srs.addRule(new ElementSelector("tG"), new XAction());
        srs.addRule(new ElementSelector("tG/tS"), new YAction());
        srs.addRule(new ElementSelector("tG/tS/test"), new ZAction());
        srs.addRule(new ElementSelector("tG/tS/test/*"), new XAction(9));
    
        for (String s : cc.combinations("tG/tS/toto")) {
          List<Action> r = srs.matchActions(new ElementPath(s));
          assertNull(r);
        }
      }
    
      class XAction extends Action {
        int id = 0;
    
        XAction() {
        }
    
        XAction(int id) {
          this.id = id;
        }
    
        public void begin(InterpretationContext ec, String name,
            Attributes attributes) {
        }
    
        public void end(InterpretationContext ec, String name) {
        }
    
        public void finish(InterpretationContext ec) {
        }
    
        public String toString() {
          return "XAction(" + id + ")";
        }
      }
    
      class YAction extends Action {
        public void begin(InterpretationContext ec, String name,
            Attributes attributes) {
        }
    
        public void end(InterpretationContext ec, String name) {
        }
    
        public void finish(InterpretationContext ec) {
        }
      }
    
      class ZAction extends Action {
        public void begin(InterpretationContext ec, String name,
            Attributes attributes) {
        }
    
        public void end(InterpretationContext ec, String name) {
        }
    
        public void finish(InterpretationContext ec) {
        }
      }
    
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/spi/NoAutoStartUtilTest.java����0000644�0001750�0001750�00000001746�12136042272�032420� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.spi;
    
    import static org.junit.Assert.assertFalse;
    import static org.junit.Assert.assertTrue;
    
    import org.junit.Test;
    
    
    public class NoAutoStartUtilTest {
    
      
      @Test
      public void commonObject() {
        Object o = new Object();
        assertTrue(NoAutoStartUtil.notMarkedWithNoAutoStart(o));
      }
      
      @Test
      public void markedWithNoAutoStart() {
        DoNotAutoStart o = new DoNotAutoStart();
        assertFalse(NoAutoStartUtil.notMarkedWithNoAutoStart(o));
      }
    }
    ��������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/spi/DoNotAutoStart.java���������0000644�0001750�0001750�00000001506�12136042272�031363� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.spi;
    
    import ch.qos.logback.core.spi.LifeCycle;
    
    @NoAutoStart
    public class DoNotAutoStart implements LifeCycle {
    
      boolean started = false;
      public boolean isStarted() {
        return started;
      }
    
      public void start() {
        started = true;
      }
    
      public void stop() {
        started = false;
      }
    
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/spi/PackageTest.java������������0000644�0001750�0001750�00000001617�12140150757�030672� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.spi;
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    import org.junit.runners.Suite.SuiteClasses;
    
    @RunWith(Suite.class)
    @SuiteClasses( { ElementSelectorTest.class, SimpleRuleStoreTest.class,
        NoAutoStartUtilTest.class,  ConfigurationWatchListTest.class,
        DefaultNestedComponentRegistryTest.class, CaseCombinatorTest.class })
    public class PackageTest {
    }
    �����������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000150�00000000000�011561� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/spi/ConfigurationWatchListTest.java�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/spi/ConfigurationWatchListTest.j0000644�0001750�0001750�00000002157�12136042272�033276� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.spi;
    
    import org.junit.Test;
    
    import java.io.File;
    import java.net.MalformedURLException;
    import java.net.URL;
    
    import static org.junit.Assert.assertEquals;
    
    /**
     * @author Ceki G&uuml;c&uuml;
     */
    public class ConfigurationWatchListTest {
    
      @Test
      // See http://jira.qos.ch/browse/LBCORE-119
      public void fileToURLAndBack() throws MalformedURLException {
        File file = new File("a b.xml");
        URL url = file.toURI().toURL();
        ConfigurationWatchList cwl = new ConfigurationWatchList();
        File back = cwl.convertToFile(url);
        assertEquals(file.getName(), back.getName());
      }
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000160�00000000000�011562� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/spi/DefaultNestedComponentRegistryTest.java�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/spi/DefaultNestedComponentRegist0000644�0001750�0001750�00000002731�12136042272�033342� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.spi;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertNull;
    
    import java.awt.Window;
    
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import ch.qos.logback.core.joran.util.House;
    
    public class DefaultNestedComponentRegistryTest {
    
      DefaultNestedComponentRegistry registry = new DefaultNestedComponentRegistry();
    
      @Before
      public void setUp() throws Exception {
    
      }
    
      @After
      public void tearDown() throws Exception {
      }
    
      @Test
      public void smoke() {
        String propertyName = "window";
        registry.add(House.class, propertyName, Window.class);
        Class<?> result = registry.findDefaultComponentType(House.class, propertyName);
        assertEquals(Window.class, result);
      }
    
      @Test
      public void absent() {
        registry.add(House.class, "a", Window.class);
        Class<?> result = registry.findDefaultComponentType(House.class, "other");
        assertNull(result);
      }
    }
    ���������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/spi/ElementSelectorTest.java����0000644�0001750�0001750�00000012232�12140150757�032424� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.spi;
    
    import static org.junit.Assert.assertEquals;
    
    import org.junit.Test;
    
    /**
     * Test pattern manipulation code.
     * 
     * @author Ceki Gulcu
     */
    public class ElementSelectorTest {
    
      @Test
      public void test1() {
        ElementSelector p = new ElementSelector("a");
        assertEquals(1, p.size());
        assertEquals("a", p.peekLast());
        assertEquals("a", p.get(0));
      }
    
      @Test
      public void testSuffix() {
        ElementSelector p = new ElementSelector("a/");
        assertEquals(1, p.size());
        assertEquals("a", p.peekLast());
        assertEquals("a", p.get(0));
      }
      
      @Test
      public void test2() {
        ElementSelector p = new ElementSelector("a/b");
        assertEquals(2, p.size());
        assertEquals("b", p.peekLast());
        assertEquals("a", p.get(0));
        assertEquals("b", p.get(1));
      }
    
      @Test
      public void test3() {
        ElementSelector p = new ElementSelector("a123/b1234/cvvsdf");
        assertEquals(3, p.size());
        assertEquals("a123", p.get(0));
        assertEquals("b1234", p.get(1));
        assertEquals("cvvsdf", p.get(2));
      }
    
      @Test
      public void test4() {
        ElementSelector p = new ElementSelector("/a123/b1234/cvvsdf");
        assertEquals(3, p.size());
        assertEquals("a123", p.get(0));
        assertEquals("b1234", p.get(1));
        assertEquals("cvvsdf", p.get(2));
      }
    
      @Test
      public void test5() {
        ElementSelector p = new ElementSelector("//a");
        assertEquals(1, p.size());
        assertEquals("a", p.get(0));
      }
    
      @Test
      public void test6() {
        ElementSelector p = new ElementSelector("//a//b");
        assertEquals(2, p.size());
        assertEquals("a", p.get(0));
        assertEquals("b", p.get(1));
      }
    
      
      // test tail matching
      @Test
      public void testTailMatch() {
        {
          ElementPath p = new ElementPath("/a/b");
          ElementSelector ruleElementSelector = new ElementSelector("*");
          assertEquals(0, ruleElementSelector.getTailMatchLength(p));
        }
    
        {
          ElementPath p = new ElementPath("/a");
          ElementSelector ruleElementSelector = new ElementSelector("*/a");
          assertEquals(1, ruleElementSelector.getTailMatchLength(p));
        }
    
        {
          ElementPath p = new ElementPath("/A");
          ElementSelector ruleElementSelector = new ElementSelector("*/a");
          assertEquals(1, ruleElementSelector.getTailMatchLength(p));
        }
        
        {
          ElementPath p = new ElementPath("/a");
          ElementSelector ruleElementSelector = new ElementSelector("*/A");
          assertEquals(1, ruleElementSelector.getTailMatchLength(p));
        }
        
        
        {
          ElementPath p = new ElementPath("/a/b");
          ElementSelector ruleElementSelector = new ElementSelector("*/b");
          assertEquals(1, ruleElementSelector.getTailMatchLength(p));
        }
        
        {
          ElementPath p = new ElementPath("/a/B");
          ElementSelector ruleElementSelector = new ElementSelector("*/b");
          assertEquals(1, ruleElementSelector.getTailMatchLength(p));
        }
        
        {
          ElementPath p = new ElementPath("/a/b/c");
          ElementSelector ruleElementSelector = new ElementSelector("*/b/c");
          assertEquals(2, ruleElementSelector.getTailMatchLength(p));
        }
      }
      
      // test prefix matching
      @Test
      public void testPrefixMatch() {
        {
          ElementPath p = new ElementPath("/a/b");
          ElementSelector ruleElementSelector = new ElementSelector("/x/*");
          assertEquals(0, ruleElementSelector.getPrefixMatchLength(p));
        }
    
        {
          ElementPath p = new ElementPath("/a");
          ElementSelector ruleElementSelector = new ElementSelector("/x/*");
          assertEquals(0, ruleElementSelector.getPrefixMatchLength(p));
        }
    
        {
          ElementPath p = new ElementPath("/a/b");
          ElementSelector ruleElementSelector = new ElementSelector("/a/*");
          assertEquals(1, ruleElementSelector.getPrefixMatchLength(p));
        }
    
        {
          ElementPath p = new ElementPath("/a/b");
          ElementSelector ruleElementSelector = new ElementSelector("/A/*");
          assertEquals(1, ruleElementSelector.getPrefixMatchLength(p));
        }
        
        {
          ElementPath p = new ElementPath("/A/b");
          ElementSelector ruleElementSelector = new ElementSelector("/a/*");
          assertEquals(1, ruleElementSelector.getPrefixMatchLength(p));
        }
        
        {
          ElementPath p = new ElementPath("/a/b");
          ElementSelector ruleElementSelector = new ElementSelector("/a/b/*");
          assertEquals(2, ruleElementSelector.getPrefixMatchLength(p));
        }
        
        {
          ElementPath p = new ElementPath("/a/b");
          ElementSelector ruleElementSelector = new ElementSelector("/*");
          assertEquals(0, ruleElementSelector.getPrefixMatchLength(p));
        }
      }
    
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/spi/CaseCombinator.java���������0000644�0001750�0001750�00000005260�12136042272�031363� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.spi;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class CaseCombinator {
    
    
      List<String> combinations(String in) {
        int length = in.length();
        List<String> permutationsList = new ArrayList<String>();
    
        int totalCombinations = computeTotalNumerOfCombinations(in, length);
    
        for (int j = 0; j < totalCombinations; j++) {
          StringBuilder newCombination = new StringBuilder();
          int pos = 0;
          for (int i = 0; i < length; i++) {
            char c = in.charAt(i);
            if (isEnglishLetter(c)) {
              c = permute(c, j, pos);
              pos++;
            }
            newCombination.append(c);
          }
          permutationsList.add(newCombination.toString());
        }
        return permutationsList;
    
      }
    
      private char permute(char c, int permutation, int position) {
        int mask = 1 << position;
        boolean shouldBeInUpperCase = (permutation & mask) != 0;
        boolean isEffectivelyUpperCase = isUpperCase(c);
        if (shouldBeInUpperCase && !isEffectivelyUpperCase)
          return toUpperCase(c);
        if (!shouldBeInUpperCase && isEffectivelyUpperCase)
          return toLowerCase(c);
        return c;
      }
    
      private int computeTotalNumerOfCombinations(String in, int length) {
        int count = 0;
        for (int i = 0; i < length; i++) {
          char c = in.charAt(i);
          if (isEnglishLetter(c))
            count++;
        }
        // return 2^count (2 to the power of count)
        return (1 << count);
      }
    
      private char toUpperCase(char c) {
        if ('A' <= c && c <= 'Z') {
          return c;
        }
        if ('a' <= c && c <= 'z') {
          return (char) ((int) c + 'A' - 'a');
        }
        // code should never reach this point
        return c;
      }
    
      private char toLowerCase(char c) {
        if ('a' <= c && c <= 'z') {
          return c;
        }
        if ('A' <= c && c <= 'Z') {
          return (char) ((int) c + 'a' - 'A');
        }
        // code should never reach this point
        return c;
      }
    
      private boolean isEnglishLetter(char c) {
        if ('a' <= c && c <= 'z')
          return true;
    
        if ('A' <= c && c <= 'Z')
          return true;
        return false;
      }
    
      private boolean isUpperCase(char c) {
        return ('A' <= c && c <= 'Z');
      }
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/spi/CaseCombinatorTest.java�����0000644�0001750�0001750�00000002605�12136042272�032223� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran.spi;
    
    import static org.junit.Assert.assertEquals;
    
    import java.util.ArrayList;
    import java.util.HashSet;
    import java.util.List;
    import java.util.Set;
    
    import org.junit.Test;
    
    
    public class CaseCombinatorTest {
    
      CaseCombinator p = new CaseCombinator();
      
      
      @Test
      public void smoke() {
        CaseCombinator p = new CaseCombinator();
         
        List<String> result = p.combinations("a-B=");
        
        List<String> witness = new ArrayList<String>();
        witness.add("a-b=");
        witness.add("A-b=");
        witness.add("a-B=");
        witness.add("A-B=");
        assertEquals(witness, result);
      }
      
      @Test
      public void other() {
        List<String> result = p.combinations("aBCd");
        assertEquals(16, result.size());
        Set<String> witness = new HashSet<String>(result);
        // check that there are no duplicates
        assertEquals(16, witness.size());
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/joran/TrivialConfigurator.java��������0000644�0001750�0001750�00000002435�12140150757�031700� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.joran;
    
    import java.util.HashMap;
    
    import ch.qos.logback.core.joran.action.Action;
    import ch.qos.logback.core.joran.spi.ElementSelector;
    import ch.qos.logback.core.joran.spi.Interpreter;
    import ch.qos.logback.core.joran.spi.RuleStore;
    
    public class TrivialConfigurator extends GenericConfigurator {
    
      HashMap<ElementSelector, Action> rulesMap;
      
      public TrivialConfigurator(HashMap<ElementSelector, Action> rules) {
        this.rulesMap = rules;
      }
      
      @Override
      protected void addImplicitRules(Interpreter interpreter) {
      }
    
      @Override
      protected void addInstanceRules(RuleStore rs) {
        for(ElementSelector elementSelector : rulesMap.keySet()) {
          Action action = rulesMap.get(elementSelector);
          rs.addRule(elementSelector, action);
        }
      }
    
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/FileAppenderResilienceTest.java�������0000644�0001750�0001750�00000007041�12136042272�031766� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core;
    
    import java.io.File;
    import java.io.IOException;
    import java.nio.channels.FileChannel;
    
    import ch.qos.logback.core.util.StatusPrinter;
    import org.junit.Before;
    import org.junit.Ignore;
    import org.junit.Test;
    
    import ch.qos.logback.core.contention.RunnableWithCounterAndDone;
    import ch.qos.logback.core.encoder.EchoEncoder;
    import ch.qos.logback.core.recovery.RecoveryCoordinator;
    import ch.qos.logback.core.recovery.ResilientFileOutputStream;
    import ch.qos.logback.core.status.OnConsoleStatusListener;
    import ch.qos.logback.core.testUtil.RandomUtil;
    import ch.qos.logback.core.util.CoreTestConstants;
    import ch.qos.logback.core.util.ResilienceUtil;
    
    public class FileAppenderResilienceTest {
    
      FileAppender<Object> fa = new FileAppender<Object>();
      Context context = new ContextBase();
      int diff = RandomUtil.getPositiveInt();
      String outputDirStr = CoreTestConstants.OUTPUT_DIR_PREFIX + "resilience-"
          + diff + "/";
    
      // String outputDirStr = "\\\\192.168.1.3\\lbtest\\" + "resilience-"+ diff +
      // "/";;
      String logfileStr = outputDirStr + "output.log";
    
      @Before
      public void setUp() throws InterruptedException {
    
        context.getStatusManager().add(new OnConsoleStatusListener());
    
        File outputDir = new File(outputDirStr);
        outputDir.mkdirs();
    
        fa.setContext(context);
        fa.setName("FILE");
        fa.setEncoder(new EchoEncoder<Object>());
        fa.setFile(logfileStr);
        fa.start();
      }
    
      @Test
      @Ignore
      public void manual() throws InterruptedException, IOException {
        Runner runner = new Runner(fa);
        Thread t = new Thread(runner);
        t.start();
    
        while (true) {
          Thread.sleep(110);
        }
      }
    
      @Test
      public void smoke() throws InterruptedException, IOException {
        Runner runner = new Runner(fa);
        Thread t = new Thread(runner);
        t.start();
    
        double delayCoefficient = 2.0;
        for (int i = 0; i < 5; i++) {
          Thread.sleep((int)(RecoveryCoordinator.BACKOFF_COEFFICIENT_MIN * delayCoefficient));
          closeLogFileOnPurpose();
        }
        runner.setDone(true);
        t.join();
    
        double bestCaseSuccessRatio = 1/delayCoefficient;
        // expect to loose at most 35% of the events
        double lossinessFactor = 0.35;
        double resilianceFactor = (1-lossinessFactor);
    
        ResilienceUtil
                  .verify(logfileStr, "^hello (\\d{1,5})$", runner.getCounter(), bestCaseSuccessRatio * resilianceFactor);
      }
    
      private void closeLogFileOnPurpose() throws IOException {
        ResilientFileOutputStream resilientFOS = (ResilientFileOutputStream) fa
          .getOutputStream();
        FileChannel fileChannel = resilientFOS.getChannel();
        fileChannel.close();
      }
    }
    
    class Runner extends RunnableWithCounterAndDone {
      FileAppender<Object> fa;
    
      Runner(FileAppender<Object> fa) {
        this.fa = fa;
      }
    
      public void run() {
        while (!isDone()) {
          counter++;
          fa.doAppend("hello " + counter);
          if (counter % 128 == 0) {
            try { Thread.sleep(10);
            } catch (InterruptedException e) { }
          }
        }
      }
    
    }�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/boolex/�������������������������������0000755�0001750�0001750�00000000000�12203357067�025216� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/boolex/MatcherTest.java���������������0000644�0001750�0001750�00000004364�12136042272�030305� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.boolex;
    
    import junit.framework.TestCase;
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.ContextBase;
    
    public class MatcherTest extends TestCase {
    
      Context context;
      Matcher matcher;
      
      public void setUp() throws Exception {
        context = new ContextBase();
        matcher = new Matcher();
        matcher.setContext(context);
        matcher.setName("testMatcher");
        super.setUp();
      }
      
      public void tearDown() throws Exception {
        matcher = null;
        super.tearDown();
      }
      
      public void testFullRegion() throws Exception {
        matcher.setRegex(".*test.*");
        matcher.start();
        assertTrue(matcher.matches("test"));
        assertTrue(matcher.matches("xxxxtest"));
        assertTrue(matcher.matches("testxxxx"));
        assertTrue(matcher.matches("xxxxtestxxxx"));
      }
      
      public void testPartRegion() throws Exception {
        matcher.setRegex("test");
        matcher.start();
        assertTrue(matcher.matches("test"));
        assertTrue(matcher.matches("xxxxtest"));
        assertTrue(matcher.matches("testxxxx"));
        assertTrue(matcher.matches("xxxxtestxxxx"));
      }
      
      public void testCaseInsensitive() throws Exception {
        matcher.setRegex("test");
        matcher.setCaseSensitive(false);
        matcher.start();
        
        assertTrue(matcher.matches("TEST"));
        assertTrue(matcher.matches("tEst"));
        assertTrue(matcher.matches("tESt"));
        assertTrue(matcher.matches("TesT"));
      }
      
      public void testCaseSensitive() throws Exception {
        matcher.setRegex("test");
        matcher.setCaseSensitive(true);
        matcher.start();
        
        assertFalse(matcher.matches("TEST"));
        assertFalse(matcher.matches("tEst"));
        assertFalse(matcher.matches("tESt"));
        assertFalse(matcher.matches("TesT"));
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000147�00000000000�011567� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/FileAppenderResilience_AS_ROOT_Test.java��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/FileAppenderResilience_AS_ROOT_Test.ja0000644�0001750�0001750�00000010064�12136042272�033023� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    
    import ch.qos.logback.core.testUtil.EnvUtilForTests;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import ch.qos.logback.core.encoder.EchoEncoder;
    import ch.qos.logback.core.testUtil.RandomUtil;
    import ch.qos.logback.core.util.ResilienceUtil;
    import ch.qos.logback.core.util.StatusPrinter;
    
    public class FileAppenderResilience_AS_ROOT_Test {
    
      static String MOUNT_POINT = "/mnt/loop/";
    
      static String LONG_STR = " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
    
      static String PATH_LOOPFS_SCRIPT = "/home/ceki/java/logback/logback-core/src/test/loopfs.sh";
    
      enum LoopFSCommand {
        setup, shake, teardown;
      }
    
      Context context = new ContextBase();
      int diff = RandomUtil.getPositiveInt();
      String outputDirStr = MOUNT_POINT + "resilience-" + diff + "/";
      String logfileStr = outputDirStr + "output.log";
    
      FileAppender<Object> fa = new FileAppender<Object>();
    
      static boolean isConformingHost() {
        return EnvUtilForTests.isLocalHostNameInList(new String[]{"haro"});
      }
    
      @Before
      public void setUp() throws IOException, InterruptedException {
        if (!isConformingHost()) {
          return;
        }
        Process p = runLoopFSScript(LoopFSCommand.setup);
        p.waitFor();
    
        dump("/tmp/loopfs.log");
    
        fa.setContext(context);
        File outputDir = new File(outputDirStr);
        outputDir.mkdirs();
        System.out.println("FileAppenderResilienceTest output dir [" + outputDirStr
            + "]");
    
        fa.setName("FILE");
        fa.setEncoder(new EchoEncoder<Object>());
        fa.setFile(logfileStr);
        fa.start();
      }
    
      void dump(String file) throws IOException {
        FileInputStream fis = null;
        try {
          fis = new FileInputStream(file);
          int r;
          while ((r = fis.read()) != -1) {
            char c = (char) r;
            System.out.print(c);
          }
        } finally {
          if (fis != null) {
            fis.close();
          }
        }
      }
    
      @After
      public void tearDown() throws IOException, InterruptedException {
        if (!isConformingHost()) {
          return;
        }
        StatusPrinter.print(context);
        fa.stop();
        Process p = runLoopFSScript(LoopFSCommand.teardown);
        p.waitFor();
        System.out.println("Tearing down");
      }
    
      static int TOTAL_DURATION = 5000;
      static int NUM_STEPS = 500;
      static int DELAY = TOTAL_DURATION / NUM_STEPS;
    
      @Test
      public void go() throws IOException, InterruptedException {
        if (!isConformingHost()) {
          return;
        }
        Process p = runLoopFSScript(LoopFSCommand.shake);
        for (int i = 0; i < NUM_STEPS; i++) {
          fa.append(String.valueOf(i) + LONG_STR);
          Thread.sleep(DELAY);
        }
        p.waitFor();
        // the extrernal script has the file system ready for IO 50% of the time
        double bestCase = 0.5;
        ResilienceUtil.verify(logfileStr, "^(\\d{1,3}) x*$", NUM_STEPS, bestCase*0.6);
        System.out.println("Done go");
      }
    
      // the loopfs script is tightly coupled with the host machine
      // it needs to be Unix, with sudo privileges granted to the script
      Process runLoopFSScript(LoopFSCommand cmd) throws IOException,
          InterruptedException {
        // causing a NullPointerException is better than locking the whole
        // machine which the next operation can and will do.
        if (!isConformingHost()) {
          return null;
        }
        ProcessBuilder pb = new ProcessBuilder();
        pb.command("/usr/bin/sudo", PATH_LOOPFS_SCRIPT, cmd.toString());
        return pb.start();
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/appender/�����������������������������0000755�0001750�0001750�00000000000�12203357067�025524� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/appender/XTeeOutputStream.java��������0000644�0001750�0001750�00000001716�12136042272�031630� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.appender;
    
    import java.io.IOException;
    import java.io.PrintStream;
    
    import ch.qos.logback.core.util.TeeOutputStream;
    
    public class XTeeOutputStream extends TeeOutputStream {
    
      boolean closed = false;
      public XTeeOutputStream(PrintStream targetPS) {
        super(targetPS);
      }
    
      @Override
      public void close() throws IOException {
        closed = true;
        super.close();
      }
      
      
      public boolean isClosed() {
        return closed;
      }
    }
    ��������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/appender/DummyAppenderTest.java�������0000644�0001750�0001750�00000003043�12136042272�031773� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.appender;
    
    import static org.junit.Assert.assertEquals;
    
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    
    import org.junit.Test;
    
    import ch.qos.logback.core.Appender;
    import ch.qos.logback.core.encoder.DummyEncoder;
    import ch.qos.logback.core.encoder.Encoder;
    import ch.qos.logback.core.layout.DummyLayout;
    
    
    public class DummyAppenderTest extends AbstractAppenderTest<Object> {
    
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
      DummyWriterAppender<Object> da = new DummyWriterAppender<Object>(baos);
       
      protected Appender<Object> getAppender() {
        return da;
      }
      
      protected Appender<Object> getConfiguredAppender() {
        da.setEncoder(new DummyEncoder<Object>());
        da.start();
        return da;
      }
    
      @Test
      public void testBasic() throws IOException {
        Encoder<Object> encoder = new DummyEncoder<Object>();
        encoder.init(baos);
        da.setEncoder(encoder);
        da.start();
        da.doAppend(new Object());
        assertEquals(DummyLayout.DUMMY, baos.toString());
      }
      
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/appender/FileAppenderTest.java��������0000644�0001750�0001750�00000011026�12136042272�031557� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.appender;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertFalse;
    import static org.junit.Assert.assertTrue;
    
    import java.io.File;
    import java.util.List;
    
    import ch.qos.logback.core.status.StatusChecker;
    import org.junit.Test;
    
    import ch.qos.logback.core.Appender;
    import ch.qos.logback.core.FileAppender;
    import ch.qos.logback.core.encoder.DummyEncoder;
    import ch.qos.logback.core.encoder.NopEncoder;
    import ch.qos.logback.core.status.Status;
    import ch.qos.logback.core.status.StatusManager;
    import ch.qos.logback.core.testUtil.RandomUtil;
    import ch.qos.logback.core.util.CoreTestConstants;
    import ch.qos.logback.core.util.FileUtil;
    
    public class FileAppenderTest extends AbstractAppenderTest<Object> {
    
      int diff = RandomUtil.getPositiveInt();
    
      protected Appender<Object> getAppender() {
        return new FileAppender<Object>();
      }
    
      protected Appender<Object> getConfiguredAppender() {
        FileAppender<Object> appender = new FileAppender<Object>();
        appender.setEncoder(new NopEncoder<Object>());
        appender.setFile(CoreTestConstants.OUTPUT_DIR_PREFIX+"temp.log");
        appender.setName("test");
        appender.setContext(context);
        appender.start();
        return appender;
      }
    
      @Test
      public void smoke() {
        String filename = CoreTestConstants.OUTPUT_DIR_PREFIX + "/fat-smoke.log";
    
        FileAppender<Object> appender = new FileAppender<Object>();
        appender.setEncoder(new DummyEncoder<Object>());
        appender.setAppend(false);
        appender.setFile(filename);
        appender.setName("smoke");
        appender.setContext(context);
        appender.start();
        appender.doAppend(new Object());
        appender.stop();
    
        File file = new File(filename);
        assertTrue(file.exists());
        assertTrue("failed to delete " + file.getAbsolutePath(), file.delete());
      }
    
      @Test
      public void testCreateParentFolders() {
        String filename = CoreTestConstants.OUTPUT_DIR_PREFIX + "/fat-testCreateParentFolders-" + diff
            + "/testCreateParentFolders.txt";
        File file = new File(filename);
        FileAppender<Object> appender = new FileAppender<Object>();
        appender.setEncoder(new DummyEncoder<Object>());
        appender.setAppend(false);
        appender.setFile(filename);
        appender.setName("testCreateParentFolders");
        appender.setContext(context);
        appender.start();
        appender.doAppend(new Object());
        appender.stop();
        assertFalse(FileUtil.isParentDirectoryCreationRequired(file));
        assertTrue(file.exists());
    
        // cleanup
        assertTrue("failed to delete " + file.getAbsolutePath(), file.delete());
        File parent = file.getParentFile();
        assertTrue("failed to delete " + parent.getAbsolutePath(), parent.delete());
      }
    
      @Test
      public void testPrudentModeLogicalImplications() {
        String filename = CoreTestConstants.OUTPUT_DIR_PREFIX + diff + "fat-testPrudentModeLogicalImplications.txt";
        File file = new File(filename);
        FileAppender<Object> appender = new FileAppender<Object>();
        appender.setEncoder(new DummyEncoder<Object>());
        appender.setFile(filename);
        appender.setName("testPrudentModeLogicalImplications");
        appender.setContext(context);
    
        appender.setAppend(false);
        appender.setPrudent(true);
        appender.start();
    
        assertTrue(appender.isAppend());
    
        StatusManager sm = context.getStatusManager();
        //StatusPrinter.print(context);
        StatusChecker statusChecker = new StatusChecker(context);
        assertEquals(Status.WARN, statusChecker.getHighestLevel(0));
        List<Status> statusList = sm.getCopyOfStatusList();
        assertTrue("Expecting status list size to be 2 or larger, but was "
            + statusList.size(), statusList.size() >= 2);
        String msg1 = statusList.get(1).getMessage();
    
        assertTrue("Got message [" + msg1 + "]", msg1
            .startsWith("Setting \"Append\" property"));
        
        appender.doAppend(new Object());
        appender.stop();
        assertTrue(file.exists());
        assertTrue("failed to delete " + file.getAbsolutePath(), file.delete());
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/appender/ConsoleAppenderTest.java�����0000644�0001750�0001750�00000012343�12136042272�032305� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.appender;
    
    import ch.qos.logback.core.Appender;
    import ch.qos.logback.core.ConsoleAppender;
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.encoder.DummyEncoder;
    import ch.qos.logback.core.encoder.EchoEncoder;
    import ch.qos.logback.core.encoder.NopEncoder;
    import ch.qos.logback.core.layout.DummyLayout;
    import ch.qos.logback.core.status.Status;
    import ch.qos.logback.core.status.StatusChecker;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import java.io.PrintStream;
    import java.io.UnsupportedEncodingException;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertFalse;
    
    /**
     * Redirecting System.out is quite messy. Disable this test in Maven bu not in Package.class
     */
    public class ConsoleAppenderTest extends AbstractAppenderTest<Object> {
    
      XTeeOutputStream tee;
      PrintStream original;
    
      @Before
      public void setUp()  {
        original = System.out;
        // tee will output bytes on System out but it will also
        // collect them so that the output can be compared against
        // some expected output data
        // tee = new TeeOutputStream(original);
    
        // keep the console quiet
        tee = new XTeeOutputStream(null);
    
        // redirect System.out to tee
        System.setOut(new PrintStream(tee));
      }
    
      @After
      public void tearDown()  {
        System.setOut(original);
      }
    
      @Override
      public Appender<Object> getAppender() {
        return  new ConsoleAppender<Object>();
      }
    
      protected Appender<Object> getConfiguredAppender() {
        ConsoleAppender<Object> ca = new ConsoleAppender<Object>();
        ca.setEncoder(new NopEncoder<Object>());
        ca.start();
        return ca;
      }
    
      @org.junit.Test
      public void testBasic() {
        ConsoleAppender<Object> ca = (ConsoleAppender<Object>) getAppender();
        ca.setEncoder(new DummyEncoder<Object>());
        ca.start();
        ca.doAppend(new Object());
        assertEquals(DummyLayout.DUMMY, tee.toString());
      }
    
      @org.junit.Test
      public void testOpen() {
        ConsoleAppender<Object> ca = (ConsoleAppender<Object>) getAppender();
        DummyEncoder<Object> dummyEncoder = new DummyEncoder<Object>();
        dummyEncoder.setFileHeader("open");
        ca.setEncoder(dummyEncoder);
        ca.start();
        ca.doAppend(new Object());
        ca.stop();
        assertEquals("open" + CoreConstants.LINE_SEPARATOR + DummyLayout.DUMMY, tee
            .toString());
      }
    
      @Test
      public void testClose() {
        ConsoleAppender<Object> ca = (ConsoleAppender<Object>) getAppender();
        DummyEncoder<Object> dummyEncoder = new DummyEncoder<Object>();
        dummyEncoder.setFileFooter("CLOSED");
        ca.setEncoder(dummyEncoder);
        ca.start();
        ca.doAppend(new Object());
        ca.stop();
        // ConsoleAppender must keep the underlying stream open.
        // The console is not ours to close.
        assertFalse(tee.isClosed());
        assertEquals(DummyLayout.DUMMY + "CLOSED", tee.toString());
      }
    
      // See http://jira.qos.ch/browse/LBCORE-143
      @Test
      public void changeInConsole() {
        ConsoleAppender<Object> ca = (ConsoleAppender<Object>) getAppender();
        EchoEncoder<Object> encoder = new EchoEncoder<Object>();
        ca.setEncoder(encoder);
        ca.start();
        ca.doAppend("a");
        assertEquals("a" + CoreConstants.LINE_SEPARATOR, tee.toString());
    
        XTeeOutputStream newTee = new XTeeOutputStream(null);
        System.setOut(new PrintStream(newTee));
        ca.doAppend("b");
        assertEquals("b" + CoreConstants.LINE_SEPARATOR, newTee.toString());
      }
    
      @Test
      public void testUTF16BE() throws UnsupportedEncodingException {
        ConsoleAppender<Object> ca = (ConsoleAppender<Object>) getAppender();
        DummyEncoder<Object> dummyEncoder = new DummyEncoder<Object>();
        String encodingName = "UTF-16BE";
        dummyEncoder.setEncodingName(encodingName);
        ca.setEncoder(dummyEncoder);
        ca.start();
        ca.doAppend(new Object());
        assertEquals(DummyLayout.DUMMY, new String(tee.toByteArray(), encodingName));
      }
    
      @Test
      public void wrongTarget() {
        ConsoleAppender<Object> ca = (ConsoleAppender<Object>) getAppender();
        EchoEncoder<Object> encoder = new EchoEncoder<Object>();
        encoder.setContext(context);
        ca.setContext(context);
        ca.setTarget("foo");
        ca.setEncoder(encoder);
        ca.start();
        ca.doAppend("a");
        StatusChecker checker = new StatusChecker(context);
        //21:28:01,246 + WARN in ch.qos.logback.core.ConsoleAppender[null] - [foo] should be one of [SystemOut, SystemErr]
        //21:28:01,246   |-WARN in ch.qos.logback.core.ConsoleAppender[null] - Using previously set target, System.out by default.
    //    StatusPrinter.print(context);
    
        checker.assertContainsMatch(Status.WARN, "\\[foo\\] should be one of \\[SystemOut, SystemErr\\]");
    
      }
    
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/appender/PackageTest.java�������������0000644�0001750�0001750�00000001403�12136042272�030552� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.appender;
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    
    
    @RunWith(Suite.class)
    @Suite.SuiteClasses({DummyAppenderTest.class,
            ConsoleAppenderTest.class,
            FileAppenderTest.class})
    
    public class PackageTest {
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/appender/AbstractAppenderTest.java����0000644�0001750�0001750�00000003574�12136042146�032454� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.appender;
    
    
    import static org.junit.Assert.assertFalse;
    import static org.junit.Assert.assertTrue;
    
    import org.junit.Test;
    
    import ch.qos.logback.core.Appender;
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.ContextBase;
    import ch.qos.logback.core.status.StatusChecker;
    import ch.qos.logback.core.util.StatusPrinter;
    
    
    
    abstract public class AbstractAppenderTest<E>  {
      
      
      abstract protected Appender<E> getAppender();
      abstract protected Appender<E> getConfiguredAppender();
      Context context = new ContextBase();
      
      @Test
      public void testNewAppender() {
        // new appenders should be inactive
        Appender<E> appender = getAppender();
        assertFalse( appender.isStarted()); 
      }
      
      @Test
      public void testConfiguredAppender() {
        Appender<E> appender = getConfiguredAppender();
        appender.start();
        assertTrue(appender.isStarted());
       
        appender.stop();
        assertFalse(appender.isStarted());
        
      }
      
      @Test
      public void testNoStart() {
        Appender<E> appender = getAppender();
        appender.setContext(context);
        appender.setName("doh");
        // is null OK?
        appender.doAppend(null);
        StatusChecker checker = new StatusChecker(context.getStatusManager());
        StatusPrinter.print(context);
        checker.assertContainsMatch("Attempted to append to non started appender \\[doh\\].");
      }
    }
    
    
    ������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/appender/DummyWriterAppender.java�����0000644�0001750�0001750�00000001402�12136042272�032325� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.appender;
    
    import java.io.OutputStream;
    
    import ch.qos.logback.core.OutputStreamAppender;
    
    public class DummyWriterAppender<E> extends
        OutputStreamAppender<E> {
    
      DummyWriterAppender(OutputStream os) {
        this.setOutputStream(os);
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/MockLifeCycleComponent.java�����������0000644�0001750�0001750�00000000532�12136042272�031117� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������package ch.qos.logback.core;
    
    import ch.qos.logback.core.spi.LifeCycle;
    
    public class MockLifeCycleComponent implements LifeCycle {
    
      private boolean started;
      
      public void start() {
        started = true;      
      }
    
      public void stop() {
        started = false;
      }
    
      public boolean isStarted() {
        return started;
      }
      
    }����������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/BasicStatusManagerTest.java�����������0000644�0001750�0001750�00000004002�12136042272�031137� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core;
    
    import static ch.qos.logback.core.BasicStatusManager.MAX_HEADER_COUNT;
    import static ch.qos.logback.core.BasicStatusManager.TAIL_SIZE;
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertNotNull;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import org.junit.Test;
    
    import ch.qos.logback.core.status.ErrorStatus;
    import ch.qos.logback.core.status.Status;
    
    
    public class BasicStatusManagerTest {
    
      
      BasicStatusManager bsm = new BasicStatusManager();
      
      @Test
      public void smoke() {
        bsm.add(new ErrorStatus("hello", this));
        assertEquals(Status.ERROR, bsm.getLevel());
        
        List<Status> statusList = bsm.getCopyOfStatusList();
        assertNotNull(statusList);
        assertEquals(1, statusList.size());
        assertEquals("hello", statusList.get(0).getMessage());
      }
      
      @Test
      public void many() {
        int margin = 300;
        int len = MAX_HEADER_COUNT+TAIL_SIZE+margin;
        for(int i = 0; i < len; i++) {
          bsm.add(new ErrorStatus(""+i, this));
        }
        
        List<Status> statusList = bsm.getCopyOfStatusList();
        assertNotNull(statusList);
        assertEquals(MAX_HEADER_COUNT+TAIL_SIZE, statusList.size());
        List<Status> witness = new ArrayList<Status>();
        for(int i = 0; i < MAX_HEADER_COUNT; i++) {
          witness.add(new ErrorStatus(""+i, this));
        }
        for(int i = 0; i < TAIL_SIZE; i++) {
          witness.add(new ErrorStatus(""+(MAX_HEADER_COUNT+margin+i), this));
        }
        assertEquals(witness, statusList);
      }
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/spi/����������������������������������0000755�0001750�0001750�00000000000�12203357067�024521� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000146�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/spi/AppenderAttachableImplLockTest.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/spi/AppenderAttachableImplLockTest.jav0000644�0001750�0001750�00000006466�12136042273�033234� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.spi;
    
    import ch.qos.logback.core.Appender;
    import org.junit.Test;
    import static org.mockito.Mockito.mock;
    import static org.mockito.Mockito.when;
    
    /**
     * This test shows the general problem I described in LBCORE-67.
     *
     * In the two test cases below, an appender that throws an OutOfMemoryError
     * while getName is called - but this is just an example to show the general
     * problem.
     *
     * The tests below fail without fixing LBCORE-67 and pass when Joern Huxhorn's
     * patch is applied.
     *
     * Additionally, the following, probably more realistic, situations could
     * happen:
     *
     * -addAppender: appenderList.add() could throw OutOfMemoryError. This could
     * only be shown by using an appenderList mock but appenderList does not (and
     * should not) have a setter. This would leave the write lock locked.
     *
     * -iteratorForAppenders: new ArrayList() could throw an OutOfMemoryError,
     * leaving the read lock locked.
     *
     * I can't imagine a bad situation in isAttached, detachAppender(Appender) or
     * detachAppender(String) but I'd change the code anyway for consistency. I'm
     * also pretty sure that something stupid can happen at any time so it's best to
     * just stick to conventions.
     *
     * @author Joern Huxhorn
     */
    public class AppenderAttachableImplLockTest {
    
      private AppenderAttachableImpl<Integer> aai = new AppenderAttachableImpl<Integer>();
    
      @SuppressWarnings("unchecked")
      @Test(timeout = 5000)
      public void getAppenderBoom() {
        Appender<Integer> mockAppender1 = mock(Appender.class);
    
        when(mockAppender1.getName()).thenThrow(new OutOfMemoryError("oops"));
        aai.addAppender(mockAppender1);
        try {
          // appender.getName called as a result of next statement
          aai.getAppender("foo");
        } catch (OutOfMemoryError e) {
          // this leaves the read lock locked.
        }
    
        Appender<Integer> mockAppender2=mock(Appender.class);
        // the next call used to freeze with the earlier ReadWriteLock lock
        // implementation
        aai.addAppender(mockAppender2);
      }
    
      @SuppressWarnings("unchecked")
      @Test(timeout = 5000)
      public void detachAppenderBoom() throws InterruptedException {
        Appender<Integer> mockAppender = mock(Appender.class);
        when(mockAppender.getName()).thenThrow(new OutOfMemoryError("oops"));
        mockAppender.doAppend(17);
    
        aai.addAppender(mockAppender);
        Thread t = new Thread(new Runnable() {
    
          public void run() {
            try {
              // appender.getName called as a result of next statement
              aai.detachAppender("foo");
            } catch (OutOfMemoryError e) {
              // this leaves the write lock locked.
            }
          }
        });
        t.start();
        t.join();
    
        // the next call used to freeze with the earlier ReadWriteLock lock
        // implementation
        aai.appendLoopOnAppenders(17);
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/spi/AppenderAttachableImplTest.java���0000644�0001750�0001750�00000012100�12136042273�032542� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.spi;
    
    
    import static org.junit.Assert.assertFalse;
    import static org.junit.Assert.assertNotNull;
    import static org.junit.Assert.assertNull;
    import static org.junit.Assert.assertTrue;
    
    import java.util.Iterator;
    
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import ch.qos.logback.core.Appender;
    import ch.qos.logback.core.helpers.NOPAppender;
    
    /**
     * This test case verifies all the methods of AppenderAttableImpl work properly.
     *
     * @author Ralph Goers
     */
    public class AppenderAttachableImplTest {
    
      
      private AppenderAttachableImpl<TestEvent> aai;
    
      @Before
      public void setUp() throws Exception {
        aai = new AppenderAttachableImpl<TestEvent>();
      }
    
      @After
      public void tearDown() throws Exception {
        aai = null;
      }
    
      @Test
      public void testAddAppender() throws Exception {
        TestEvent event = new TestEvent();
        NOPAppender<TestEvent> ta = new NOPAppender<TestEvent>();
        ta.start();
        aai.addAppender(ta);
        ta = new NOPAppender<TestEvent>();
        ta.setName("test");
        ta.start();
        aai.addAppender(ta);
        int size = aai.appendLoopOnAppenders(event);
        assertTrue("Incorrect number of appenders", size == 2);
      }
    
      @Test
      public void testIteratorForAppenders() throws Exception {
        NOPAppender<TestEvent> ta = new NOPAppender<TestEvent>();
        ta.start();
        aai.addAppender(ta);
        NOPAppender<TestEvent> tab = new NOPAppender<TestEvent>();
        tab.setName("test");
        tab.start();
        aai.addAppender(tab);
        Iterator<Appender<TestEvent>> iter = aai.iteratorForAppenders();
        int size = 0;
        while (iter.hasNext()) {
          ++size;
          Appender<TestEvent> app = iter.next();
          assertTrue("Bad Appender", app == ta || app == tab);
        }
        assertTrue("Incorrect number of appenders", size == 2);
      }
    
      @Test
      public void getGetAppender() throws Exception {
        NOPAppender<TestEvent> test = new NOPAppender<TestEvent>();
        test.setName("test");
        test.start();
        aai.addAppender(test);
        
        NOPAppender<TestEvent> testOther = new NOPAppender<TestEvent>();
        testOther.setName("testOther");
        testOther.start();
        aai.addAppender(testOther);
        
        Appender<TestEvent> a = aai.getAppender("testOther");
        assertNotNull("Could not find appender", a);
        assertTrue("Wrong appender", a == testOther);
        
        a = aai.getAppender("test");
        assertNotNull("Could not find appender", a);
        assertTrue("Wrong appender", a == test);
        a = aai.getAppender("NotThere");
        assertNull("Appender was returned", a);
      }
    
      @Test
      public void testIsAttached() throws Exception {
        NOPAppender<TestEvent> ta = new NOPAppender<TestEvent>();
        ta.start();
        aai.addAppender(ta);
        NOPAppender<TestEvent> tab = new NOPAppender<TestEvent>();
        tab.setName("test");
        tab.start();
        aai.addAppender(tab);
        assertTrue("Appender is not attached", aai.isAttached(ta));
        assertTrue("Appender is not attached", aai.isAttached(tab));
      }
    
      @Test
      public void testDetachAndStopAllAppenders() throws Exception {
        NOPAppender<TestEvent> ta = new NOPAppender<TestEvent>();
        ta.start();
        aai.addAppender(ta);
        NOPAppender<TestEvent> tab = new NOPAppender<TestEvent>();
        tab.setName("test");
        tab.start();
        aai.addAppender(tab);
        assertTrue("Appender was not started", tab.isStarted());
        aai.detachAndStopAllAppenders();
        assertNull("Appender was not removed", aai.getAppender("test"));
        assertFalse("Appender was not stopped", tab.isStarted());
      }
    
      @Test
      public void testDetachAppender() throws Exception {
        NOPAppender<TestEvent> ta = new NOPAppender<TestEvent>();
        ta.start();
        aai.addAppender(ta);
        NOPAppender<TestEvent> tab = new NOPAppender<TestEvent>();
        tab.setName("test");
        tab.start();
        aai.addAppender(tab);
        assertTrue("Appender not detached", aai.detachAppender(tab));
        assertNull("Appender was not removed", aai.getAppender("test"));
        assertFalse("Appender detach error", aai.detachAppender(tab));
      }
    
      @Test
      public void testDetachAppenderByName() throws Exception {
        NOPAppender<TestEvent> ta = new NOPAppender<TestEvent>();
        ta.setName("test1");
        ta.start();
        aai.addAppender(ta);
        NOPAppender<TestEvent> tab = new NOPAppender<TestEvent>();
        tab.setName("test");
        tab.start();
        aai.addAppender(tab);
       
        assertTrue(aai.detachAppender("test"));
        assertTrue(aai.detachAppender("test1"));
        assertFalse( aai.detachAppender("test1"));
      }
    
      private static class TestEvent {
    
      }
    
    }
    
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000154�00000000000�011565� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/spi/ScenarioBasedCyclicBufferTrackerTest.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/spi/ScenarioBasedCyclicBufferTrackerTe0000644�0001750�0001750�00000004060�12136236415�033232� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.spi;
    
    import org.junit.Before;
    import org.junit.Test;
    
    import static junit.framework.Assert.assertEquals;
    
    /**
     * A
     *
     * @author Ceki G&uuml;c&uuml;
     */
    public class ScenarioBasedCyclicBufferTrackerTest {
    
      CyclicBufferTrackerSimulator simulator;
      CyclicBufferTrackerSimulator.Parameters parameters = new CyclicBufferTrackerSimulator.Parameters();
    
      void verify() {
        CyclicBufferTracker<Object> at = simulator.realCBTracker;
        CyclicBufferTrackerT<Object> t_at = simulator.t_CBTracker;
        assertEquals(t_at.liveKeysAsOrderedList(), at.liveKeysAsOrderedList());
        assertEquals(t_at.lingererKeysAsOrderedList(), at.lingererKeysAsOrderedList());
      }
    
      @Before public void setUp() {
        parameters.keySpaceLen = 128;
        parameters.maxTimestampInc =  ComponentTracker.DEFAULT_TIMEOUT / 2;
      }
    
      @Test
      public void shortTest() {
        parameters.keySpaceLen = 64;
        parameters.maxTimestampInc = 500;
        parameters.simulationLength = 70;
    
        simulator = new CyclicBufferTrackerSimulator(parameters);
        simulator.buildScenario();
        simulator.simulate();
        verify();
      }
    
      @Test
      public void mediumTest() {
        parameters.simulationLength = 20000;
    
        simulator = new CyclicBufferTrackerSimulator(parameters);
        simulator.buildScenario();
        simulator.simulate();
        verify();
      }
    
      @Test
      public void longTest() {
        parameters.simulationLength = 100*1000;
        simulator = new CyclicBufferTrackerSimulator(parameters);
        simulator.buildScenario();
        simulator.simulate();
        verify();
      }
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/spi/PackageTest.java������������������0000644�0001750�0001750�00000001474�12136177166�027572� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.spi;
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    
    
    @RunWith(Suite.class)
    @Suite.SuiteClasses({AppenderAttachableImplTest.class, AppenderAttachableImplLockTest.class,
            CyclicBufferTrackerTest.class, ScenarioBasedCyclicBufferTrackerTest.class})
    
    public class PackageTest {
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/spi/CyclicBufferTrackerT.java���������0000644�0001750�0001750�00000015136�12136246004�031363� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.spi;
    
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.helpers.CyclicBuffer;
    
    import java.util.*;
    
    /**
     * Another tracker implementtion for testing purposes only.
     *
     * @author Ceki G&uuml;c&uuml;
     */
    public class CyclicBufferTrackerT<E> implements ComponentTracker<CyclicBuffer<E>> {
    
      int bufferSize = CyclicBufferTracker.DEFAULT_BUFFER_SIZE;
      int maxComponents = CyclicBufferTracker.DEFAULT_NUMBER_OF_BUFFERS;
    
      List<TEntry<E>> liveList = new LinkedList<TEntry<E>>();
      List<TEntry<E>> lingererList = new LinkedList<TEntry<E>>();
    
      long lastCheck = 0;
    
    
      private TEntry<E> getEntry(List<TEntry<E>> list,String k) {
        for (int i = 0; i < list.size(); i++) {
          TEntry<E> te = list.get(i);
          if (te.key.equals(k)) {
            return te;
          }
        }
        return null;
      }
    
      private TEntry getFromEitherList(String key) {
        TEntry entry = getEntry(liveList, key);
        if(entry != null)
          return entry;
        else {
          return getEntry(lingererList, key);
        }
      }
    
      private List<String> keysAsOrderedList(List<TEntry<E>> list) {
        Collections.sort(list);
        List<String> result = new LinkedList<String>();
        for (int i = 0; i < list.size(); i++) {
          TEntry<E> te = list.get(i);
          result.add(te.key);
        }
        return result;
      }
    
      List<String> liveKeysAsOrderedList() {
        return keysAsOrderedList(liveList);
      }
      List<String> lingererKeysAsOrderedList() {
        return keysAsOrderedList(lingererList);
      }
    
    
      public Set<String> allKeys() {
        HashSet<String> allKeys = new HashSet<String>();
        for (TEntry e : liveList)
          allKeys.add(e.key);
        for (TEntry e : lingererList)
          allKeys.add(e.key);
        return allKeys;
      }
    
    
      public Collection<CyclicBuffer<E>> allComponents() {
        List<CyclicBuffer<E>> allComponents = new ArrayList<CyclicBuffer<E>>();
        for (TEntry e : liveList)
          allComponents.add(e.value);
        for (TEntry e : lingererList)
          allComponents.add(e.value);
    
        return allComponents;
      }
    
      public CyclicBuffer<E> find(String key) {
        TEntry<E> te = getFromEitherList(key);
        if(te == null) return  null;
        else return te.value;
      }
    
      public CyclicBuffer<E> getOrCreate(String key, long timestamp) {
        TEntry<E> te = getFromEitherList(key);
        if (te == null) {
          CyclicBuffer<E> cb = new CyclicBuffer<E>(bufferSize);
          te = new TEntry<E>(key, cb, timestamp);
          liveList.add(te);
          if (liveList.size() > maxComponents) {
            Collections.sort(liveList);
            liveList.remove(0);
          }
        } else {
          te.timestamp = timestamp;
          Collections.sort(liveList);
        }
        return te.value;
      }
    
      public void endOfLife(String k) {
        TEntry<E> te = null;
        boolean found = false;
        for (int i = 0; i < liveList.size(); i++) {
          te = liveList.get(i);
          if (te.key.equals(k)) {
            liveList.remove(i);
            found = true;
            break;
          }
        }
        if(found) {
          lingererList.add(te);
        }
      }
    
      private boolean isEntryStale(TEntry<E> entry, long now) {
        return ((entry.timestamp + DEFAULT_TIMEOUT) < now);
      }
      private boolean isEntryDoneLingering(TEntry<E> tEntry, long now) {
        return ((tEntry.timestamp + AbstractComponentTracker.LINGERING_TIMEOUT) < now);
      }
    
      public void removeStaleComponents(long now) {
        if (isTooSoonForRemovalIteration(now)) return;
        // both list should be sorted before removal attempts
        Collections.sort(liveList);
        Collections.sort(lingererList);
        removeComponentsInExcessFromMainList();
        removeStaleComponentsFromMainList(now);
        removeStaleComponentsFromLingerersList(now);
      }
    
      private void removeComponentsInExcessFromMainList() {
        while (liveList.size() > maxComponents) {
          liveList.remove(0);
        }
      }
    
      private void removeStaleComponentsFromMainList(long now) {
        while (liveList.size() != 0 && isEntryStale(liveList.get(0), now)) {
          liveList.remove(0);
        }
      }
    
      private void removeStaleComponentsFromLingerersList(long now) {
        while (lingererList.size() != 0 && isEntryDoneLingering(lingererList.get(0), now)) {
          lingererList.remove(0);
        }
      }
    
      private boolean isTooSoonForRemovalIteration(long now) {
        if (lastCheck + CoreConstants.MILLIS_IN_ONE_SECOND > now) {
          return true;
        }
        lastCheck = now;
        return false;
      }
    
      public int getComponentCount() {
        return liveList.size() + lingererList.size();
      }
    
    
      // ==================================================================
    
      private class TEntry<X> implements Comparable<TEntry<?>> {
    
        String key;
        CyclicBuffer<E> value;
        long timestamp;
    
        TEntry(String k, CyclicBuffer<E> v, long timestamp) {
          this.key = k;
          this.value = v;
          this.timestamp = timestamp;
        }
    
        @Override
        public int hashCode() {
          final int prime = 31;
          int result = 1;
          result = prime * result + ((key == null) ? 0 : key.hashCode());
          return result;
        }
    
        public int compareTo(TEntry<?> o) {
          if (!(o instanceof TEntry)) {
            throw new IllegalArgumentException("arguments must be of type " + TEntry.class);
          }
    
          TEntry<?> other = (TEntry<?>) o;
          if (timestamp > other.timestamp) {
            return 1;
          }
          if (timestamp == other.timestamp) {
            return 0;
          }
          return -1;
        }
    
        @Override
        public boolean equals(Object obj) {
          if (this == obj)
            return true;
          if (obj == null)
            return false;
          if (getClass() != obj.getClass())
            return false;
          @SuppressWarnings("unchecked")
          final TEntry<?> other = (TEntry<?>) obj;
          if (key == null) {
            if (other.key != null)
              return false;
          } else if (!key.equals(other.key))
            return false;
          if (value == null) {
            if (other.value != null)
              return false;
          } else if (!value.equals(other.value))
            return false;
          return true;
        }
    
        @Override
        public String toString() {
          return "(" + key + ", " + value + ")";
        }
      }
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/spi/CyclicBufferTrackerSimulator.java�0000644�0001750�0001750�00000007631�12136236131�033140� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.spi;
    
    import ch.qos.logback.core.helpers.CyclicBuffer;
    
    import java.util.*;
    
    /**
     * @author Ceki G&uuml;c&uuml;
     */
    public class CyclicBufferTrackerSimulator {
    
      static class Parameters {
        public int keySpaceLen;
        public int maxTimestampInc;
        public int simulationLength;
      }
    
      CyclicBufferTracker<Object> realCBTracker = new CyclicBufferTracker<Object>();
      CyclicBufferTrackerT<Object> t_CBTracker = new CyclicBufferTrackerT<Object>();
    
      List<SimulationEvent> scenario = new ArrayList<SimulationEvent>();
      List<String> keySpace = new ArrayList<String>();
      Random randomKeyGen = new Random(100);
      Random simulatorRandom = new Random(11234);
      Parameters params;
    
      int getToEndOfLifeRatio = 10;
    
      CyclicBufferTrackerSimulator(Parameters params) {
        this.params = params;
        Map<String, String> checkMap = new HashMap<String, String>();
        for (int i = 0; i < params.keySpaceLen; i++) {
          String k = getRandomKeyStr();
          if (checkMap.containsKey(k)) {
            System.out.println("random key collision occurred");
            k += "" + i;
          }
          keySpace.add(k);
          checkMap.put(k, k);
        }
    
      }
    
      private String getRandomKeyStr() {
        int ri = randomKeyGen.nextInt();
        return String.format("%X", ri);
      }
    
      void buildScenario() {
        long timestamp = 30000;
        int keySpaceLen = keySpace.size();
        for (int i = 0; i < params.simulationLength; i++) {
          int keyIndex = simulatorRandom.nextInt(keySpaceLen);
          timestamp += simulatorRandom.nextInt(params.maxTimestampInc);
          String key = keySpace.get(keyIndex);
          scenario.add(new SimulationEvent(EventType.INSERT, key, timestamp));
          if (simulatorRandom.nextInt(getToEndOfLifeRatio) == 0) {
            scenario.add(new SimulationEvent(EventType.END_OF_LIFE, key, timestamp));
          }
          scenario.add(new SimulationEvent(EventType.REMOVE_STALE, key, timestamp));
        }
      }
    
      public void dump() {
        for (SimulationEvent simeEvent : scenario) {
          System.out.println(simeEvent);
        }
      }
    
    
      void play(SimulationEvent simulationEvent,
                ComponentTracker<CyclicBuffer<Object>> tracker) {
        String key = simulationEvent.key;
        long timestamp = simulationEvent.timestamp;
        EventType eventType = simulationEvent.eventType;
        switch (eventType) {
          case INSERT:
            tracker.getOrCreate(key, timestamp);
            break;
          case END_OF_LIFE:
            tracker.endOfLife(key);
            break;
          case REMOVE_STALE:
            tracker.removeStaleComponents(timestamp);
            break;
        }
      }
    
      public void simulate() {
        for (SimulationEvent simeEvent : scenario) {
          play(simeEvent, realCBTracker);
          play(simeEvent, t_CBTracker);
        }
      }
    
      // =========================================================================
      enum EventType {
        INSERT, END_OF_LIFE, REMOVE_STALE;
      }
    
      class SimulationEvent {
        final public String key;
        final public long timestamp;
        final EventType eventType;
    
        public SimulationEvent(EventType eventType, String key, long timestamp) {
          this.eventType = eventType;
          this.key = key;
          this.timestamp = timestamp;
        }
    
        @Override
        public String toString() {
          return "SimulationEvent{" +
                  "eventType=" + eventType +
                  ", key='" + key + '\'' +
                  ", timestamp=" + timestamp +
                  '}';
        }
      }
    }
    �������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/spi/CyclicBufferTrackerTest.java������0000644�0001750�0001750�00000004456�12136234276�032112� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.spi;
    
    import ch.qos.logback.core.helpers.CyclicBuffer;
    import org.junit.Test;
    
    import static junit.framework.Assert.assertEquals;
    import static junit.framework.Assert.assertNotNull;
    
    /**
     * @author Ceki G&uuml;c&uuml;
     */
    public class CyclicBufferTrackerTest {
    
    
      CyclicBufferTracker<Object> tracker = new CyclicBufferTracker<Object>();
      String key = "a";
    
      @Test
      public void empty0() {
        long now = 3000;
        tracker.removeStaleComponents(now);
        assertEquals(0, tracker.liveKeysAsOrderedList().size());
        assertEquals(0, tracker.getComponentCount());
      }
    
      @Test
      public void empty1() {
        long now = 3000;
        assertNotNull(tracker.getOrCreate(key, now++));
        now += ComponentTracker.DEFAULT_TIMEOUT + 1000;
        tracker.removeStaleComponents(now);
        assertEquals(0, tracker.liveKeysAsOrderedList().size());
        assertEquals(0, tracker.getComponentCount());
    
        assertNotNull(tracker.getOrCreate(key, now++));
      }
    
      @Test
      public void smoke() {
        long now = 3000;
        CyclicBuffer<Object> cb = tracker.getOrCreate(key, now);
        assertEquals(cb, tracker.getOrCreate(key, now++));
        now += CyclicBufferTracker.DEFAULT_TIMEOUT + 1000;
        tracker.removeStaleComponents(now);
        assertEquals(0, tracker.liveKeysAsOrderedList().size());
        assertEquals(0, tracker.getComponentCount());
      }
    
      @Test
      public void destroy() {
        long now = 3000;
        CyclicBuffer<Object> cb = tracker.getOrCreate(key, now);
        cb.add(new Object());
        assertEquals(1, cb.length());
        tracker.endOfLife(key);
        now += CyclicBufferTracker.LINGERING_TIMEOUT + 10;
        tracker.removeStaleComponents(now);
        assertEquals(0, tracker.liveKeysAsOrderedList().size());
        assertEquals(0, tracker.getComponentCount());
        assertEquals(0, cb.length());
      }
    
    
    
    
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/����������������������������������0000755�0001750�0001750�00000000000�12203357067�024514� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/ssl/������������������������������0000755�0001750�0001750�00000000000�12203357067�025315� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/ssl/SSLContextFactoryBeanTest.java0000644�0001750�0001750�00000010456�12136042272�033144� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.ssl;
    
    import static org.junit.Assert.assertNotNull;
    import static org.junit.Assert.assertTrue;
    
    import org.junit.Before;
    import org.junit.Test;
    
    import ch.qos.logback.core.net.ssl.mock.MockContextAware;
    import ch.qos.logback.core.net.ssl.mock.MockKeyManagerFactoryFactoryBean;
    import ch.qos.logback.core.net.ssl.mock.MockKeyStoreFactoryBean;
    import ch.qos.logback.core.net.ssl.mock.MockSecureRandomFactoryBean;
    import ch.qos.logback.core.net.ssl.mock.MockTrustManagerFactoryFactoryBean;
    
    /**
     * Unit tests for {@link SSLContextFactoryBean}.
     *
     * @author Carl Harris
     */
    public class SSLContextFactoryBeanTest {
    
      private static final String SSL_CONFIGURATION_MESSAGE_PATTERN = 
          "SSL protocol '.*?' provider '.*?'";
    
      private static final String KEY_MANAGER_FACTORY_MESSAGE_PATTERN =
          "key manager algorithm '.*?' provider '.*?'";
    
      private static final String TRUST_MANAGER_FACTORY_MESSAGE_PATTERN =
          "trust manager algorithm '.*?' provider '.*?'";
      
      private static final String KEY_STORE_MESSAGE_PATTERN =
          "key store of type '.*?' provider '.*?': .*";
    
      private static final String TRUST_STORE_MESSAGE_PATTERN =
          "trust store of type '.*?' provider '.*?': .*";
      
      private static final String SECURE_RANDOM_MESSAGE_PATTERN =
          "secure random algorithm '.*?' provider '.*?'";
    
      private MockKeyManagerFactoryFactoryBean keyManagerFactory =
          new MockKeyManagerFactoryFactoryBean();
      
      private MockTrustManagerFactoryFactoryBean trustManagerFactory =
          new MockTrustManagerFactoryFactoryBean();
      
      private MockKeyStoreFactoryBean keyStore =
          new MockKeyStoreFactoryBean();
      
      private MockKeyStoreFactoryBean trustStore = 
          new MockKeyStoreFactoryBean();
      
      private MockSecureRandomFactoryBean secureRandom =
          new MockSecureRandomFactoryBean();
      
      private MockContextAware context = new MockContextAware();
      private SSLContextFactoryBean factoryBean = new SSLContextFactoryBean();
      
      @Before
      public void setUp() throws Exception {
        keyStore.setLocation(SSLTestConstants.KEYSTORE_JKS_RESOURCE);
        trustStore.setLocation(SSLTestConstants.KEYSTORE_JKS_RESOURCE);
      }
    
      @Test
      public void testCreateDefaultContext() throws Exception {
        // should be able to create a context with no configuration at all
        assertNotNull(factoryBean.createContext(context));
        assertTrue(context.hasInfoMatching(SSL_CONFIGURATION_MESSAGE_PATTERN));
      }
      
      @Test
      public void testCreateContext() throws Exception {
        factoryBean.setKeyManagerFactory(keyManagerFactory);
        factoryBean.setKeyStore(keyStore);
        factoryBean.setTrustManagerFactory(trustManagerFactory);
        factoryBean.setTrustStore(trustStore);
        factoryBean.setSecureRandom(secureRandom);
        
        assertNotNull(factoryBean.createContext(context));
    
        assertTrue(keyManagerFactory.isFactoryCreated());
        assertTrue(trustManagerFactory.isFactoryCreated());
        assertTrue(keyStore.isKeyStoreCreated());
        assertTrue(trustStore.isKeyStoreCreated());
        assertTrue(secureRandom.isSecureRandomCreated());
    
        // it's important that each configured component output an appropriate
        // informational message to the context; i.e. this logging is not just
        // for programmers, it's there for systems administrators to use in
        // verifying that SSL is configured properly
        
        assertTrue(context.hasInfoMatching(SSL_CONFIGURATION_MESSAGE_PATTERN));
        assertTrue(context.hasInfoMatching(KEY_MANAGER_FACTORY_MESSAGE_PATTERN));
        assertTrue(context.hasInfoMatching(TRUST_MANAGER_FACTORY_MESSAGE_PATTERN));
        assertTrue(context.hasInfoMatching(KEY_STORE_MESSAGE_PATTERN));
        assertTrue(context.hasInfoMatching(TRUST_STORE_MESSAGE_PATTERN));
        assertTrue(context.hasInfoMatching(SECURE_RANDOM_MESSAGE_PATTERN));
      }
      
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/ssl/SSLConfigurationTest.java�����0000644�0001750�0001750�00000001630�12136042272�032203� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.ssl;
    
    import static org.junit.Assert.assertNotNull;
    
    import org.junit.Test;
    
    /**
     * Unit tests for {@link SSLConfiguration}.
     *
     * @author Carl Harris
     */
    public class SSLConfigurationTest {
    
      private SSLConfiguration configuration = new SSLConfiguration();
        
      @Test
      public void testParameters() throws Exception {
        assertNotNull(configuration.getParameters());
      }
      
    }
    ��������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/ssl/KeyStoreFactoryBeanTest.java��0000644�0001750�0001750�00000004213�12136042272�032675� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.ssl;
    
    import static org.junit.Assert.assertNotNull;
    
    import java.security.KeyStore;
    
    import org.junit.Test;
    
    import ch.qos.logback.core.net.ssl.KeyStoreFactoryBean;
    import ch.qos.logback.core.net.ssl.SSL;
    
    
    /**
     * Unit tests for {@link KeyStoreFactoryBean}.
     *
     * @author Carl Harris
     */
    public class KeyStoreFactoryBeanTest {
    
      private KeyStoreFactoryBean factoryBean = new KeyStoreFactoryBean();
      
      @Test
      public void testDefaults() throws Exception {
        factoryBean.setLocation(SSLTestConstants.KEYSTORE_JKS_RESOURCE);
        assertNotNull(factoryBean.createKeyStore());
      }
    
      @Test
      public void testExplicitProvider() throws Exception {
        factoryBean.setLocation(SSLTestConstants.KEYSTORE_JKS_RESOURCE);
        KeyStore keyStore = factoryBean.createKeyStore();
        factoryBean.setProvider(keyStore.getProvider().getName());
        assertNotNull(factoryBean.createKeyStore());
      }
      
      @Test
      public void testExplicitType() throws Exception {
        factoryBean.setLocation(SSLTestConstants.KEYSTORE_JKS_RESOURCE);
        factoryBean.setType(SSL.DEFAULT_KEYSTORE_TYPE);
        assertNotNull(factoryBean.createKeyStore());
      }
    
      @Test
      public void testPKCS12Type() throws Exception {
        factoryBean.setLocation(SSLTestConstants.KEYSTORE_PKCS12_RESOURCE);
        factoryBean.setType(SSLTestConstants.PKCS12_TYPE);
        assertNotNull(factoryBean.createKeyStore());
      }
    
      @Test
      public void testExplicitPassphrase() throws Exception {
        factoryBean.setLocation(SSLTestConstants.KEYSTORE_JKS_RESOURCE);
        factoryBean.setPassword(SSL.DEFAULT_KEYSTORE_PASSWORD);
        assertNotNull(factoryBean.createKeyStore());
      }
    
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000152�00000000000�011563� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/ssl/SSLParametersConfigurationTest.java�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/ssl/SSLParametersConfigurationTest0000644�0001750�0001750�00000011510�12136042272�033305� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.ssl;
    
    import static org.junit.Assert.assertTrue;
    
    import java.util.Arrays;
    
    import org.junit.Before;
    import org.junit.Test;
    
    import ch.qos.logback.core.ContextBase;
    import ch.qos.logback.core.net.ssl.mock.MockSSLConfigurable;
    
    
    /**
     * Unit tests for {@link SSLParametersConfiguration}.
     *
     * @author Carl Harris
     */
    public class SSLParametersConfigurationTest {
    
      private MockSSLConfigurable configurable = new MockSSLConfigurable();
      
      private SSLParametersConfiguration configuration = 
          new SSLParametersConfiguration();
     
      @Before
      public void setUp() throws Exception {
        configuration.setContext(new ContextBase());
      }
      
      @Test
      public void testSetIncludedProtocols() throws Exception {
        configurable.setSupportedProtocols(new String[] { "A", "B", "C", "D" });
        configuration.setIncludedProtocols("A,B ,C, D");
        configuration.configure(configurable);
        assertTrue(Arrays.equals(new String[] { "A", "B", "C", "D" }, 
            configurable.getEnabledProtocols()));
      }
    
      @Test
      public void testSetExcludedProtocols() throws Exception {
        configurable.setSupportedProtocols(new String[] { "A", "B" });
        configuration.setExcludedProtocols("A");
        configuration.configure(configurable);
        assertTrue(Arrays.equals(new String[] { "B" }, 
            configurable.getEnabledProtocols()));
      }
    
      @Test
      public void testSetIncludedAndExcludedProtocols() throws Exception {
        configurable.setSupportedProtocols(new String[] { "A", "B", "C" });
        configuration.setIncludedProtocols("A, B");
        configuration.setExcludedProtocols("B");
        configuration.configure(configurable);
        assertTrue(Arrays.equals(new String[] { "A" }, 
            configurable.getEnabledProtocols()));
      }
    
      @Test
      public void testSetIncludedCipherSuites() throws Exception {
        configurable.setSupportedCipherSuites(new String[] { "A", "B", "C", "D" });
        configuration.setIncludedCipherSuites("A,B ,C, D");
        configuration.configure(configurable);
        assertTrue(Arrays.equals(new String[] { "A", "B", "C", "D" }, 
            configurable.getEnabledCipherSuites()));
      }
    
      @Test
      public void testSetExcludedCipherSuites() throws Exception {
        configurable.setSupportedCipherSuites(new String[] { "A", "B" });
        configuration.setExcludedCipherSuites("A");
        configuration.configure(configurable);
        assertTrue(Arrays.equals(new String[]{ "B" }, 
            configurable.getEnabledCipherSuites()));
      }
    
      @Test
      public void testSetExcludedAndIncludedCipherSuites() throws Exception {
        configurable.setSupportedCipherSuites(new String[] { "A", "B", "C" });
        configuration.setIncludedCipherSuites("A, B");
        configuration.setExcludedCipherSuites("B");
        configuration.configure(configurable);
        assertTrue(Arrays.equals(new String[] { "A" }, 
            configurable.getEnabledCipherSuites()));
      }
    
      @Test
      public void testSetNeedClientAuth() throws Exception {
        configuration.setNeedClientAuth(true);
        configuration.configure(configurable);
        assertTrue(configurable.isNeedClientAuth());
      }
    
      @Test
      public void testSetWantClientAuth() throws Exception {
        configuration.setWantClientAuth(true);
        configuration.configure(configurable);
        assertTrue(configurable.isWantClientAuth());
      }
    
      @Test
      public void testPassDefaultProtocols() throws Exception {
        final String[] protocols = new String[] { "A" };
        configurable.setDefaultProtocols(protocols);
        configuration.configure(configurable);
        assertTrue(Arrays.equals(protocols, configurable.getEnabledProtocols()));
      }
      
      @Test
      public void testPassDefaultCipherSuites() throws Exception {
        final String[] cipherSuites = new String[] { "A" };
        configurable.setDefaultCipherSuites(cipherSuites);
        configuration.configure(configurable);
        assertTrue(Arrays.equals(cipherSuites, 
            configurable.getEnabledCipherSuites()));
      }
    
      @Test
      public void testPassDefaultNeedClientAuth() throws Exception {
        configurable.setNeedClientAuth(true);
        configuration.configure(configurable);
        assertTrue(configurable.isNeedClientAuth());
      }
    
      @Test
      public void testPassDefaultWantClientAuth() throws Exception {
        configurable.setWantClientAuth(true);
        configuration.configure(configurable);
        assertTrue(configurable.isWantClientAuth());
      }
    
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000154�00000000000�011565� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/ssl/KeyManagerFactoryFactoryBeanTest.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/ssl/KeyManagerFactoryFactoryBeanTe0000644�0001750�0001750�00000003107�12136042272�033215� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.ssl;
    
    import static org.junit.Assert.assertNotNull;
    
    import javax.net.ssl.KeyManagerFactory;
    
    import org.junit.Test;
    
    import ch.qos.logback.core.net.ssl.KeyManagerFactoryFactoryBean;
    
    
    /**
     * Unit tests for {@link KeyManagerFactoryFactoryBean}.
     *
     * @author Carl Harris
     */
    public class KeyManagerFactoryFactoryBeanTest {
    
      private KeyManagerFactoryFactoryBean factoryBean =
          new KeyManagerFactoryFactoryBean();
      
      @Test
      public void testDefaults() throws Exception {
        assertNotNull(factoryBean.createKeyManagerFactory());
      }
    
      @Test
      public void testExplicitAlgorithm() throws Exception {
        factoryBean.setAlgorithm(KeyManagerFactory.getDefaultAlgorithm());
        assertNotNull(factoryBean.createKeyManagerFactory());
      }
      
      @Test
      public void testExplicitProvider() throws Exception {
        KeyManagerFactory factory = KeyManagerFactory.getInstance(
            KeyManagerFactory.getDefaultAlgorithm());
        factoryBean.setProvider(factory.getProvider().getName());
        assertNotNull(factoryBean.createKeyManagerFactory());
      }
      
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/ssl/PackageTest.java��������������0000644�0001750�0001750�00000001725�12140555240�030351� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    
    
    package ch.qos.logback.core.net.ssl;
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    
    
    @RunWith(Suite.class)
    @Suite.SuiteClasses({KeyManagerFactoryFactoryBeanTest.class,
            KeyStoreFactoryBeanTest.class,
            SecureRandomFactoryBeanTest.class,
            SSLConfigurationTest.class,
            SSLContextFactoryBeanTest.class,
            SSLParametersConfigurationTest.class,
            TrustManagerFactoryFactoryBeanTest.class})
    public class PackageTest {
    
    }
    �������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/ssl/SSLTestConstants.java���������0000644�0001750�0001750�00000001645�12136042272�031356� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.ssl;
    
    /**
     * Constants used by unit tests in this package.
     *
     * @author Carl Harris
     */
    public interface SSLTestConstants {
    
      String KEYSTORE_JKS_RESOURCE = "net/ssl/keystore.jks";
      
      String KEYSTORE_PKCS12_RESOURCE = "net/ssl/keystore.p12";
    
      String PKCS12_TYPE = "PKCS12";
    
      String FAKE_ALGORITHM_NAME = "A_FAKE_ALGORITHM_NAME";
    
      String FAKE_PROVIDER_NAME = "A_FAKE_PROVIDER_NAME";
    
    }
    �������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000147�00000000000�011567� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/ssl/SecureRandomFactoryBeanTest.java��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/ssl/SecureRandomFactoryBeanTest.ja0000644�0001750�0001750�00000004433�12136042272�033174� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.ssl;
    
    import static org.junit.Assert.assertNotNull;
    import static org.junit.Assert.assertTrue;
    import static org.junit.Assert.fail;
    
    import java.security.NoSuchAlgorithmException;
    import java.security.NoSuchProviderException;
    import java.security.SecureRandom;
    
    import org.junit.Test;
    
    import ch.qos.logback.core.net.ssl.SSL;
    import ch.qos.logback.core.net.ssl.SecureRandomFactoryBean;
    
    
    /**
     * Unit tests for {@link SecureRandomFactoryBean}.
     *
     * @author Carl Harris
     */
    public class SecureRandomFactoryBeanTest {
    
      private SecureRandomFactoryBean factoryBean = new SecureRandomFactoryBean();
      
      @Test
      public void testDefaults() throws Exception {
        assertNotNull(factoryBean.createSecureRandom());
      }
    
      @Test
      public void testExplicitProvider() throws Exception {
        SecureRandom secureRandom = SecureRandom.getInstance(
            SSL.DEFAULT_SECURE_RANDOM_ALGORITHM);
        factoryBean.setProvider(secureRandom.getProvider().getName());
        assertNotNull(factoryBean.createSecureRandom());    
      }
    
      @Test
      public void testUnknownProvider() throws Exception {
        factoryBean.setProvider(SSLTestConstants.FAKE_PROVIDER_NAME);
        try {
          factoryBean.createSecureRandom();
          fail("expected NoSuchProviderException");
        }
        catch (NoSuchProviderException ex) {
          assertTrue(ex.getMessage().contains(SSLTestConstants.FAKE_PROVIDER_NAME));
        }
      }
    
      @Test
      public void testUnknownAlgorithm() throws Exception {
        factoryBean.setAlgorithm(SSLTestConstants.FAKE_ALGORITHM_NAME);
        try {
          factoryBean.createSecureRandom();
          fail("expected NoSuchAlgorithmException");
        }
        catch (NoSuchAlgorithmException ex) {
          assertTrue(ex.getMessage().contains(SSLTestConstants.FAKE_ALGORITHM_NAME));
        }
      }
    
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000156�00000000000�011567� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/ssl/TrustManagerFactoryFactoryBeanTest.java�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/ssl/TrustManagerFactoryFactoryBean0000644�0001750�0001750�00000003141�12136042272�033313� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.ssl;
    
    import static org.junit.Assert.assertNotNull;
    
    import javax.net.ssl.TrustManagerFactory;
    
    import org.junit.Test;
    
    import ch.qos.logback.core.net.ssl.TrustManagerFactoryFactoryBean;
    
    
    /**
     * Unit tests for {@link TrustManagerFactoryFactoryBean}.
     *
     * @author Carl Harris
     */
    public class TrustManagerFactoryFactoryBeanTest {
    
      private TrustManagerFactoryFactoryBean factoryBean =
          new TrustManagerFactoryFactoryBean();
      
      @Test
      public void testDefaults() throws Exception {
        assertNotNull(factoryBean.createTrustManagerFactory());
      }
    
      @Test
      public void testExplicitAlgorithm() throws Exception {
        factoryBean.setAlgorithm(TrustManagerFactory.getDefaultAlgorithm());
        assertNotNull(factoryBean.createTrustManagerFactory());
      }
      
      @Test
      public void testExplicitProvider() throws Exception {
        TrustManagerFactory factory = TrustManagerFactory.getInstance(
            TrustManagerFactory.getDefaultAlgorithm());
        factoryBean.setProvider(factory.getProvider().getName());
        assertNotNull(factoryBean.createTrustManagerFactory());
      }
      
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/ssl/mock/�������������������������0000755�0001750�0001750�00000000000�12203357067�026246� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000154�00000000000�011565� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/ssl/mock/MockSecureRandomFactoryBean.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/ssl/mock/MockSecureRandomFactoryBe0000644�0001750�0001750�00000002334�12136042272�033165� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.ssl.mock;
    
    import java.security.NoSuchAlgorithmException;
    import java.security.NoSuchProviderException;
    import java.security.SecureRandom;
    
    import ch.qos.logback.core.net.ssl.SecureRandomFactoryBean;
    
    /**
     * A {@link SecureRandomFactoryBean} with test instrumentation.
     *
     * @author Carl Harris
     */
    public class MockSecureRandomFactoryBean extends SecureRandomFactoryBean {
    
      private boolean secureRandomCreated;
    
      @Override
      public SecureRandom createSecureRandom() throws NoSuchProviderException,
          NoSuchAlgorithmException {
        secureRandomCreated = true;
        return super.createSecureRandom();
      }
    
      public boolean isSecureRandomCreated() {
        return secureRandomCreated;
      }
        
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/ssl/mock/MockContextAware.java����0000644�0001750�0001750�00000003400�12136042272�032316� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.ssl.mock;
    
    import java.util.LinkedList;
    import java.util.List;
    
    import ch.qos.logback.core.spi.ContextAware;
    import ch.qos.logback.core.spi.ContextAwareBase;
    
    /**
     * A {@link ContextAware} with instrumentation for unit testing.
     *
     * @author Carl Harris
     */
    public class MockContextAware extends ContextAwareBase
        implements ContextAware {
    
      private final List<String> info = new LinkedList<String>();
      private final List<String> warn = new LinkedList<String>();
      private final List<String> error = new LinkedList<String>();
      
      @Override
      public void addInfo(String msg) {
        info.add(msg);
      }
    
      @Override
      public void addWarn(String msg) {
        warn.add(msg);
      }
    
      @Override
      public void addError(String msg) {
        error.add(msg);
      }
    
      public boolean hasInfoMatching(String regex) {
        return hasMatching(info, regex);
      }
      
      public boolean hasWarnMatching(String regex) {
        return hasMatching(info, regex);
      }
      
      public boolean hasErrorMatching(String regex) {
        return hasMatching(info, regex);
      }
      
      private boolean hasMatching(List<String> messages, String regex) {
        for (String message : messages) {
          if (message.matches(regex)) return true;
        }
        return false;
      }
      
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000163�00000000000�011565� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/ssl/mock/MockTrustManagerFactoryFactoryBean.java��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/ssl/mock/MockTrustManagerFactoryFa0000644�0001750�0001750�00000002412�12136042272�033207� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.ssl.mock;
    
    import java.security.NoSuchAlgorithmException;
    import java.security.NoSuchProviderException;
    
    import javax.net.ssl.TrustManagerFactory;
    
    import ch.qos.logback.core.net.ssl.TrustManagerFactoryFactoryBean;
    
    /**
     * A {@link TrustManagerFactoryFactoryBean} with test instrumentation.
     *
     * @author Carl Harris
     */
    public class MockTrustManagerFactoryFactoryBean 
        extends TrustManagerFactoryFactoryBean {
    
      private boolean factoryCreated;
    
      @Override
      public TrustManagerFactory createTrustManagerFactory()
          throws NoSuchProviderException, NoSuchAlgorithmException {
        factoryCreated = true;
        return super.createTrustManagerFactory();
      }
    
      public boolean isFactoryCreated() {
        return factoryCreated;
      }
      
      
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000161�00000000000�011563� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/ssl/mock/MockKeyManagerFactoryFactoryBean.java����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/ssl/mock/MockKeyManagerFactoryFact0000644�0001750�0001750�00000002366�12136042272�033155� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.ssl.mock;
    
    import java.security.NoSuchAlgorithmException;
    import java.security.NoSuchProviderException;
    
    import javax.net.ssl.KeyManagerFactory;
    
    import ch.qos.logback.core.net.ssl.KeyManagerFactoryFactoryBean;
    
    /**
     * A {@link KeyManagerFactoryFactoryBean} with test instrumentation.
     *
     * @author Carl Harris
     */
    public class MockKeyManagerFactoryFactoryBean 
        extends KeyManagerFactoryFactoryBean {
    
      private boolean factoryCreated;
    
      @Override
      public KeyManagerFactory createKeyManagerFactory()
          throws NoSuchProviderException, NoSuchAlgorithmException {
        factoryCreated = true;
        return super.createKeyManagerFactory();
      }
    
      public boolean isFactoryCreated() {
        return factoryCreated;
      }
      
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/ssl/mock/MockSSLConfigurable.java�0000644�0001750�0001750�00000005223�12136042272�032701� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.ssl.mock;
    
    import ch.qos.logback.core.net.ssl.SSLConfigurable;
    
    public class MockSSLConfigurable implements SSLConfigurable {
    
      private static final String[] EMPTY = new String[0];
      
      private String[] defaultProtocols = EMPTY;
      private String[] supportedProtocols = EMPTY;
      private String[] enabledProtocols = EMPTY;
      private String[] defaultCipherSuites = EMPTY;
      private String[] supportedCipherSuites = EMPTY;
      private String[] enabledCipherSuites = EMPTY;
      private boolean needClientAuth;
      private boolean wantClientAuth;
    
      public String[] getDefaultProtocols() {
        return defaultProtocols;
      }
    
      public void setDefaultProtocols(String[] defaultProtocols) {
        this.defaultProtocols = defaultProtocols;
      }
    
      public String[] getSupportedProtocols() {
        return supportedProtocols;
      }
    
      public void setSupportedProtocols(String[] supportedProtocols) {
        this.supportedProtocols = supportedProtocols;
      }
    
      public String[] getEnabledProtocols() {
        return enabledProtocols;
      }
    
      public void setEnabledProtocols(String[] enabledProtocols) {
        this.enabledProtocols = enabledProtocols;
      }
    
      public String[] getDefaultCipherSuites() {
        return defaultCipherSuites;
      }
    
      public void setDefaultCipherSuites(String[] defaultCipherSuites) {
        this.defaultCipherSuites = defaultCipherSuites;
      }
    
      public String[] getSupportedCipherSuites() {
        return supportedCipherSuites;
      }
    
      public void setSupportedCipherSuites(String[] supportedCipherSuites) {
        this.supportedCipherSuites = supportedCipherSuites;
      }
    
      public String[] getEnabledCipherSuites() {
        return enabledCipherSuites;
      }
    
      public void setEnabledCipherSuites(String[] enabledCipherSuites) {
        this.enabledCipherSuites = enabledCipherSuites;
      }
    
      public boolean isNeedClientAuth() {
        return needClientAuth;
      }
    
      public void setNeedClientAuth(boolean needClientAuth) {
        this.needClientAuth = needClientAuth;
      }
    
      public boolean isWantClientAuth() {
        return wantClientAuth;
      }
    
      public void setWantClientAuth(boolean wantClientAuth) {
        this.wantClientAuth = wantClientAuth;
      }
    
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000150�00000000000�011561� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/ssl/mock/MockKeyStoreFactoryBean.java�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/ssl/mock/MockKeyStoreFactoryBean.j0000644�0001750�0001750�00000002347�12136042272�033116� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.ssl.mock;
    
    import java.security.KeyStore;
    import java.security.KeyStoreException;
    import java.security.NoSuchAlgorithmException;
    import java.security.NoSuchProviderException;
    
    import ch.qos.logback.core.net.ssl.KeyStoreFactoryBean;
    
    /**
     * A {@link KeyStoreFactoryBean} with test instrumentation. 
     *
     * @author Carl Harris
     */
    public class MockKeyStoreFactoryBean extends KeyStoreFactoryBean {
    
      private boolean keyStoreCreated;
      
      @Override
      public KeyStore createKeyStore() throws NoSuchProviderException,
          NoSuchAlgorithmException, KeyStoreException {
        keyStoreCreated = true;
        return super.createKeyStore();
      }
    
      public boolean isKeyStoreCreated() {
        return keyStoreCreated;
      }
    
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/server/���������������������������0000755�0001750�0001750�00000000000�12203357067�026022� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000156�00000000000�011567� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/server/SSLServerSocketAppenderBaseTest.java�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/server/SSLServerSocketAppenderBase0000644�0001750�0001750�00000003521�12140555240�033212� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.server;
    
    import static org.junit.Assert.assertNotNull;
    
    import java.util.concurrent.Executors;
    
    import org.junit.Before;
    import org.junit.Test;
    
    import ch.qos.logback.core.net.mock.MockContext;
    import ch.qos.logback.core.spi.PreSerializationTransformer;
    
    /**
     * Unit tests for {@link SSLServerSocketAppenderBase}.
     *
     * @author Carl Harris
     */
    public class SSLServerSocketAppenderBaseTest {
    
      private MockContext context = new MockContext(Executors.newCachedThreadPool());
      
      private SSLServerSocketAppenderBase appender =
          new InstrumentedSSLServerSocketAppenderBase();
      
      @Before
      public void setUp() throws Exception {
        appender.setContext(context);
      }
      
      @Test
      public void testUsingDefaultConfig() throws Exception {
        // should be able to start successfully with no SSL configuration at all
        appender.start();
        assertNotNull(appender.getServerSocketFactory());
        appender.stop();
      }
    
      private static class InstrumentedSSLServerSocketAppenderBase 
          extends SSLServerSocketAppenderBase<Object> {
    
        @Override
        protected void postProcessEvent(Object event) {
          throw new UnsupportedOperationException();
        }
    
        @Override
        protected PreSerializationTransformer<Object> getPST() {
          throw new UnsupportedOperationException();
        }
        
      }
      
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/server/ServerSocketUtil.java������0000644�0001750�0001750�00000004072�12143151241�032132� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.server;
    
    import java.io.IOException;
    import java.net.BindException;
    import java.net.ServerSocket;
    
    import javax.net.ServerSocketFactory;
    
    /**
     * Static utility methods for obtaining a {@link ServerSocket} bound to
     * a random unused port.
     *
     * @author Carl Harris
     */
    public class ServerSocketUtil {
    
      /**
       * Creates a new {@link ServerSocket} bound to a random unused port.
       * <p>
       * This method is a convenience overload for 
       * {@link #createServerSocket(ServerSocketFactory)} using the platform's
       * default {@link ServerSocketFactory}.
       * @return socket
       * @throws IOException
       */
      public static ServerSocket createServerSocket() throws IOException {
        return createServerSocket(ServerSocketFactory.getDefault());
      }
      
      /**
       * Creates a new {@link ServerSocket} bound to a random unused port.
       * @param socketFactory socket factory that will be used to create the 
       *    socket
       * @return socket
       * @throws IOException
       */
      public static ServerSocket createServerSocket(
          ServerSocketFactory socketFactory) throws IOException {
        ServerSocket socket = null;
        int retries = 10;
        while (retries-- > 0 && socket == null) {
          int port = (int)((65536 - 1024) * Math.random()) + 1024;
          try {
            socket = socketFactory.createServerSocket(port);
          }
          catch (BindException ex) {
            // try again with different port
          }
        }
        if (socket == null) {
          throw new BindException("cannot find an unused port to bind");
        }
        return socket;
      }
      
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000163�00000000000�011565� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/server/InstrumentedServerSocketAppenderBase.java��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/server/InstrumentedServerSocketApp0000644�0001750�0001750�00000006113�12143151241�033415� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.server;
    
    import java.io.IOException;
    import java.io.Serializable;
    import java.net.InetAddress;
    import java.net.ServerSocket;
    import java.util.concurrent.Executor;
    
    import javax.net.ServerSocketFactory;
    
    import ch.qos.logback.core.spi.PreSerializationTransformer;
    
    /**
     * A {@link AbstractServerSocketAppender} with instrumentation for unit testing.
     *
     * @author Carl Harris
     */
    public class InstrumentedServerSocketAppenderBase
        extends AbstractServerSocketAppender<Serializable> {
    
      private final ServerSocket serverSocket;
      private final ServerListener<RemoteReceiverClient> listener;
      private final ServerRunner<RemoteReceiverClient> runner;
      
      private ServerListener lastListener;
      
      public InstrumentedServerSocketAppenderBase(ServerSocket serverSocket) {
        this(serverSocket, new RemoteReceiverServerListener(serverSocket), null);
      }
      
      public InstrumentedServerSocketAppenderBase(ServerSocket serverSocket,
          ServerListener<RemoteReceiverClient> listener, 
          ServerRunner<RemoteReceiverClient> runner) {
        this.serverSocket = serverSocket;
        this.listener = listener;
        this.runner = runner;
      }
    
      @Override
      protected void postProcessEvent(Serializable event) {
      }
    
      @Override
      protected PreSerializationTransformer<Serializable> getPST() {
        return new PreSerializationTransformer<Serializable>() {
          public Serializable transform(Serializable event) {
            return event;
          }
        };
      }
      
      @Override
      protected ServerSocketFactory getServerSocketFactory() throws Exception {
        return new ServerSocketFactory() {
    
          @Override
          public ServerSocket createServerSocket(int port) throws IOException {
            return serverSocket;
          }
    
          @Override
          public ServerSocket createServerSocket(int port, int backlog)
              throws IOException {
            return serverSocket;
          }
    
          @Override
          public ServerSocket createServerSocket(int port, int backlog,
              InetAddress ifAddress) throws IOException {
            return serverSocket;
          }        
        };
      }
    
      @Override
      protected ServerRunner<RemoteReceiverClient> createServerRunner(
          ServerListener<RemoteReceiverClient> listener, Executor executor) {
        lastListener = listener;
        return runner != null ? runner : super.createServerRunner(listener, executor);
      }
    
      @Override
      protected ServerListener<RemoteReceiverClient> createServerListener(
          ServerSocket socket) {
        return listener;
      }
    
      public ServerListener getLastListener() {
        return lastListener;
      }
    
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/server/MockEventQueue.java��������0000644�0001750�0001750�00000002006�12136042272�031555� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.server;
    
    import java.io.Serializable;
    import java.util.concurrent.LinkedBlockingQueue;
    
    /**
     * A mock {@link BlockingQueue} with instrumentation for unit testing.
     *
     * @author Carl Harris
     */
    class MockEventQueue extends LinkedBlockingQueue<Serializable> {
    
      private static final long serialVersionUID = 1L;
      
      @Override
      public Serializable take() throws InterruptedException {
        if (isEmpty()) {
          Thread.currentThread().interrupt();
        }
        return super.take();    
      }
    
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000151�00000000000�011562� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/server/ConcurrentServerRunnerTest.java������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/server/ConcurrentServerRunnerTest.0000644�0001750�0001750�00000011646�12143151241�033363� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.server;
    
    import static org.junit.Assert.assertFalse;
    import static org.junit.Assert.assertNotNull;
    import static org.junit.Assert.assertSame;
    import static org.junit.Assert.assertTrue;
    
    import java.util.concurrent.Executor;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.TimeUnit;
    import java.util.concurrent.locks.Condition;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import ch.qos.logback.core.net.mock.MockContext;
    
    
    public class ConcurrentServerRunnerTest {
    
      private static final int DELAY = 10000;
      private static final int SHORT_DELAY = 10;
      
      private MockContext context = new MockContext();
      private MockServerListener<MockClient> listener = 
          new MockServerListener<MockClient>();
      
      private ExecutorService executor = Executors.newCachedThreadPool();
      private InstrumentedConcurrentServerRunner runner = 
          new InstrumentedConcurrentServerRunner(listener, executor);
    
      @Before
      public void setUp() throws Exception {
        runner.setContext(context);
      }
    
      @After
      public void tearDown() throws Exception {
        executor.shutdownNow();
        assertTrue(executor.awaitTermination(DELAY, TimeUnit.MILLISECONDS));
      }
      
      @Test
      public void testStartStop() throws Exception {
        assertFalse(runner.isRunning());
        executor.execute(runner);
        assertTrue(runner.awaitRunState(true, DELAY));
        int retries = DELAY / SHORT_DELAY;
        synchronized (listener) {
          while (retries-- > 0 && listener.getWaiter() == null) {
            listener.wait(SHORT_DELAY);
          }
        }
        assertNotNull(listener.getWaiter());
        runner.stop();
        assertTrue(listener.isClosed());
        assertFalse(runner.awaitRunState(false, DELAY));
      }
      
      @Test
      public void testRunOneClient() throws Exception {
        executor.execute(runner);
        MockClient client = new MockClient();
        listener.addClient(client);
        int retries = DELAY / SHORT_DELAY;
        synchronized (client) {
          while (retries-- > 0 && !client.isRunning()) {
            client.wait(SHORT_DELAY);
          }
        }
        assertTrue(runner.awaitRunState(true, DELAY));
        client.close();
        runner.stop();
      }
    
      @Test
      public void testRunManyClients() throws Exception {
        executor.execute(runner);
        int count = 10;
        while (count-- > 0) {
          MockClient client = new MockClient();
          listener.addClient(client);
          int retries = DELAY / SHORT_DELAY;
          synchronized (client) {
            while (retries-- > 0 && !client.isRunning()) {
              client.wait(SHORT_DELAY);
            }
          }
          assertTrue(runner.awaitRunState(true, DELAY));
        }
        runner.stop();
      }
    
      @Test
      public void testRunClientAndVisit() throws Exception {
        executor.execute(runner);
        MockClient client = new MockClient();
        listener.addClient(client);
        int retries = DELAY / SHORT_DELAY;
        synchronized (client) {
          while (retries-- > 0 && !client.isRunning()) {
            client.wait(SHORT_DELAY);
          }
        }
        assertTrue(runner.awaitRunState(true, DELAY));
        MockClientVisitor visitor = new MockClientVisitor();
        runner.accept(visitor);
        assertSame(client, visitor.getLastVisited());
        runner.stop();    
      }
    
      
      static class InstrumentedConcurrentServerRunner 
          extends ConcurrentServerRunner<MockClient> {
    
        private final Lock lock = new ReentrantLock();
        private final Condition runningCondition = lock.newCondition();
        
        public InstrumentedConcurrentServerRunner(
            ServerListener<MockClient> listener, Executor executor) {
          super(listener, executor);
        }
    
        @Override
        protected boolean configureClient(MockClient client) {
          return true;
        }
    
        @Override
        protected void setRunning(boolean running) {
          lock.lock();
          try {
            super.setRunning(running);
            runningCondition.signalAll();
          }
          finally {
            lock.unlock();
          }
        }
    
        public boolean awaitRunState(boolean state, 
            long delay) throws InterruptedException {
          lock.lock();
          try {
            while (isRunning() != state) {
              runningCondition.await(delay, TimeUnit.MILLISECONDS);
            }
            return isRunning();
          }
          finally {
            lock.unlock();
          }
        }
      }
      
    }
    ������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/server/MockClient.java������������0000644�0001750�0001750�00000002660�12143151241�030706� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.server;
    
    import ch.qos.logback.core.net.server.Client;
    
    
    
    /**
     *
     * A mock {@link Client} that notifies waiting thread when it has started,
     * and waits to be interrupted before exiting.
     *
     * @author Carl Harris
     */
    class MockClient implements Client {
    
      private boolean running;
      private boolean closed;
      
      public void run() {
        synchronized (this) {
          running = true;
          notifyAll();
          while (running && !Thread.currentThread().isInterrupted()) {
            try {
              wait();
            }
            catch (InterruptedException ex) {
              Thread.currentThread().interrupt();
            }
          }
        }
      }
    
      public void close() {
        synchronized (this) {
          running = false;
          closed = true;
          notifyAll();
        }
      }
    
      public synchronized boolean isRunning() {
        return running;
      }
    
      public synchronized boolean isClosed() {
        return closed;
      }
    
    }
    ��������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/server/PackageTest.java�����������0000644�0001750�0001750�00000001616�12143151241�031051� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.server;
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    
    
    @RunWith(Suite.class)
    @Suite.SuiteClasses({ConcurrentServerRunnerTest.class,
            RemoteReceiverStreamClientTest.class,
            ServerSocketAppenderBaseFunctionalTest.class,
            AbstractServerSocketAppenderTest.class,
            SSLServerSocketAppenderBaseTest.class})
    public class PackageTest {
    }
    ������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/server/MockServerListener.java����0000644�0001750�0001750�00000004121�12143151241�032436� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.server;
    
    import java.io.IOException;
    import java.util.concurrent.BlockingQueue;
    import java.util.concurrent.LinkedBlockingQueue;
    
    import ch.qos.logback.core.net.server.Client;
    import ch.qos.logback.core.net.server.ServerListener;
    
    
    /**
     * A mock {@link ServerListener} that has a blocking queue to pass a client
     * to a {@link #acceptClient()} caller.  If the {@link #close()} method is
     * called while a caller is blocked waiting to take from the queue, the
     * caller's thread is interrupted.
     *
     * @author Carl Harris
     */
    public class MockServerListener<T extends Client> implements ServerListener<T> {
    
      private final BlockingQueue<T> queue = 
          new LinkedBlockingQueue<T>();
      
      private boolean closed;
      private Thread waiter;
      
      public synchronized Thread getWaiter() {
        return waiter;
      }
      
      public synchronized void setWaiter(Thread waiter) {
        this.waiter = waiter;
      }
      
      public synchronized boolean isClosed() {
        return closed;
      }
    
      public synchronized void setClosed(boolean closed) {
        this.closed = closed;
      }
    
      public T acceptClient() throws IOException, InterruptedException {
        if (isClosed()) {
          throw new IOException("closed");
        }
        setWaiter(Thread.currentThread());
        try {
          return queue.take();
        }
        finally {
          setWaiter(null);
        }
      }
    
      public void addClient(T client) {
        queue.offer(client);
      }
      
      public synchronized void close() {
        setClosed(true);
        Thread waiter = getWaiter();
        if (waiter != null) {
          waiter.interrupt();
        }   
      }
    
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/server/MockServerRunner.java������0000644�0001750�0001750�00000003263�12136042272�032135� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.server;
    
    import java.io.IOException;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.spi.ContextAwareBase;
    
    /**
     * A mock {@link ServerRunner} with instrumentation for unit testing.
     *
     * @author Carl Harris
     */
    public class MockServerRunner<T extends Client> extends ContextAwareBase 
        implements ServerRunner<T> {
    
      private IOException stopException;
      private int startCount;
      private boolean contextInjected;
      
      @Override
      public void setContext(Context context) {
        contextInjected = true;    
        super.setContext(context);
      }
    
      public void run() {
        startCount++;
      }
    
      public void stop() throws IOException {
        if (stopException != null) {
          throw stopException;
        }
        startCount--;
      }
    
      public boolean isRunning() {
        return startCount > 0;
      }
      
      public void accept(ClientVisitor visitor) {
        throw new UnsupportedOperationException();
      }
    
      public int getStartCount() {
        return startCount;
      }
    
      public boolean isContextInjected() {
        return contextInjected;
      }
    
      public void setStopException(IOException stopException) {
        this.stopException = stopException;
      }
      
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000147�00000000000�011567� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/server/ServerSocketListenerTest.java��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/server/ServerSocketListenerTest.ja0000644�0001750�0001750�00000007632�12143151241�033320� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.server;
    
    import static org.junit.Assert.assertNotNull;
    import static org.junit.Assert.assertTrue;
    
    import java.io.IOException;
    import java.net.InetAddress;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    import org.junit.Before;
    import org.junit.Test;
    
    import ch.qos.logback.core.net.server.Client;
    import ch.qos.logback.core.net.server.ServerSocketListener;
    
    
    /**
     * Unit tests for {@link ServerSocketListener}.
     *
     * @author Carl Harris
     */
    public class ServerSocketListenerTest {
    
      private ServerSocket serverSocket;
      private ServerSocketListener listener;
    
      @Before
      public void setUp() throws Exception {
        serverSocket = ServerSocketUtil.createServerSocket();
        assertNotNull(serverSocket);
        listener = new InstrumentedServerSocketListener(serverSocket);
      }
      
      @Test
      public void testAcceptClient() throws Exception {
        RunnableClient localClient = new RunnableClient(
            InetAddress.getLocalHost(), serverSocket.getLocalPort());
        Thread thread = new Thread(localClient);
        thread.start();
        synchronized (localClient) {
          int retries = 200;
          while (retries-- > 0 && !localClient.isConnected()) {
            localClient.wait(10);
          }
        }
        assertTrue(localClient.isConnected());
        localClient.close();
        
        serverSocket.setSoTimeout(5000);
        Client client = listener.acceptClient();
        assertNotNull(client);
        client.close();
      }
      
      private static class InstrumentedServerSocketListener 
          extends ServerSocketListener<RemoteClient> {
    
        public InstrumentedServerSocketListener(ServerSocket serverSocket) {
          super(serverSocket);
        }
    
        @Override
        protected RemoteClient createClient(String id, Socket socket)
            throws IOException {
          return new RemoteClient(socket);
        }
        
      }
      
      private static class RemoteClient implements Client {
       
        private final Socket socket;
        
        public RemoteClient(Socket socket) {
          this.socket = socket;
        }
    
        public void run() {
        }
        
        public void close() {
          try {
            socket.close();
          }
          catch (IOException ex) {
            ex.printStackTrace(System.err);
          }
        }
        
      }
      
      private static class RunnableClient implements Client {
    
        private final InetAddress inetAddress;
        private final int port;
        private boolean connected;
        private boolean closed;
            
        public RunnableClient(InetAddress inetAddress, int port) {
          super();
          this.inetAddress = inetAddress;
          this.port = port;
        }
    
        public synchronized boolean isConnected() {
          return connected;
        }
    
        public synchronized void setConnected(boolean connected) {
          this.connected = connected;
        }
    
        public void run() {
          try {
            Socket socket = new Socket(inetAddress, port);
            synchronized (this) {
              setConnected(true);
              notifyAll();
              while (!closed && !Thread.currentThread().isInterrupted()) {
                try {
                  wait();
                }
                catch (InterruptedException ex) {
                  Thread.currentThread().interrupt();
                }
              }
              socket.close();
            }
          }
          catch (IOException ex) {
            ex.printStackTrace(System.err);
          }
        }
    
        public synchronized void close() {
          closed = true;
          notifyAll();
        }
        
      }
    }
    ������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000157�00000000000�011570� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/server/AbstractServerSocketAppenderTest.java������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/server/AbstractServerSocketAppende0000644�0001750�0001750�00000005715�12143151241�033342� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.server;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertFalse;
    import static org.junit.Assert.assertNotNull;
    import static org.junit.Assert.assertSame;
    import static org.junit.Assert.assertTrue;
    
    import java.io.IOException;
    import java.net.ServerSocket;
    
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import ch.qos.logback.core.net.mock.MockContext;
    import ch.qos.logback.core.status.ErrorStatus;
    import ch.qos.logback.core.status.Status;
    
    /**
     * Unit tests for {@link AbstractServerSocketAppender}.
     *
     * @author Carl Harris
     */
    public class AbstractServerSocketAppenderTest {
    
    
      private MockContext context = new MockContext();
      
      private MockServerRunner<RemoteReceiverClient> runner = 
          new MockServerRunner<RemoteReceiverClient>();
      
      private MockServerListener<RemoteReceiverClient> listener = 
          new MockServerListener<RemoteReceiverClient>();
      
      private ServerSocket serverSocket;
      private InstrumentedServerSocketAppenderBase appender;
      
      @Before
      public void setUp() throws Exception {
        serverSocket = ServerSocketUtil.createServerSocket();
        appender = new InstrumentedServerSocketAppenderBase(serverSocket, listener, runner);
        appender.setContext(context);
      }
      
      @After
      public void tearDown() throws Exception {
        serverSocket.close();
      }
      
      @Test
      public void testStartStop() throws Exception {
        appender.start();
        assertTrue(runner.isContextInjected());
        assertTrue(runner.isRunning());
        assertSame(listener, appender.getLastListener());
        
        appender.stop();
        assertFalse(runner.isRunning());
      }
    
      @Test
      public void testStartWhenAlreadyStarted() throws Exception {
        appender.start();
        appender.start();
        assertEquals(1, runner.getStartCount());
      }
    
      @Test
      public void testStopThrowsException() throws Exception {
        appender.start();
        assertTrue(appender.isStarted());
        IOException ex = new IOException("test exception");
        runner.setStopException(ex);
        appender.stop();
        
        Status status = context.getLastStatus();
        assertNotNull(status);    
        assertTrue(status instanceof ErrorStatus);
        assertTrue(status.getMessage().contains(ex.getMessage()));
        assertSame(ex, status.getThrowable());
      }
    
      @Test
      public void testStopWhenNotStarted() throws Exception {
        appender.stop();
        assertEquals(0, runner.getStartCount());
      }
    
    }
    ���������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000155�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/server/RemoteReceiverStreamClientTest.java��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/server/RemoteReceiverStreamClientT0000644�0001750�0001750�00000004652�12143151241�033320� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.server;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertFalse;
    
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.ObjectInputStream;
    
    import org.junit.Before;
    import org.junit.Test;
    
    import ch.qos.logback.core.net.mock.MockContext;
    
    
    /**
     * Unit tests for {@link RemoteReceiverStreamClient}.
     *
     * @author Carl Harris
     */
    public class RemoteReceiverStreamClientTest {
    
      private static final String TEST_EVENT = "test event";
    
      private MockContext context = new MockContext();
      
      private MockEventQueue queue = new MockEventQueue();
      
      private ByteArrayOutputStream outputStream = 
          new ByteArrayOutputStream();
      
      private RemoteReceiverStreamClient client = 
          new RemoteReceiverStreamClient("someId", outputStream);
      
      @Before
      public void setUp() throws Exception {
        client.setContext(context);
        client.setQueue(queue);
      }
      
      @Test
      public void testOfferEventAndRun() throws Exception {
        client.offer(TEST_EVENT);
    
        Thread thread = new Thread(client);
        thread.start();
        
        // MockEventQueue will interrupt the thread when the queue is drained
        thread.join(1000);
        assertFalse(thread.isAlive());
       
        ObjectInputStream ois = new ObjectInputStream(
            new ByteArrayInputStream(outputStream.toByteArray()));
        assertEquals(TEST_EVENT, ois.readObject());
      }
    
      @Test
      public void testOfferEventSequenceAndRun() throws Exception {
        for (int i = 0; i < 10; i++) {
          client.offer(TEST_EVENT + i);
        }
    
        Thread thread = new Thread(client);
        thread.start();
        thread.join(1000);
        assertFalse(thread.isAlive());
       
        ObjectInputStream ois = new ObjectInputStream(
            new ByteArrayInputStream(outputStream.toByteArray()));
        for (int i = 0; i < 10; i++) {
          assertEquals(TEST_EVENT + i, ois.readObject());
        }
      }
    
    }
    ��������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000165�00000000000�011567� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/server/ServerSocketAppenderBaseFunctionalTest.java������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/server/ServerSocketAppenderBaseFun0000644�0001750�0001750�00000004616�12140555240�033307� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.server;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertTrue;
    
    import java.io.ObjectInputStream;
    import java.net.InetAddress;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.TimeUnit;
    
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import ch.qos.logback.core.net.mock.MockContext;
    
    /**
     * A functional test for {@link AbstractServerSocketAppender}.
     *
     * @author Carl Harris
     */
    public class ServerSocketAppenderBaseFunctionalTest {
    
      private static final String TEST_EVENT = "test event";
    
      private static final int EVENT_COUNT = 10;
      
      private ExecutorService executor = Executors.newCachedThreadPool();
      private MockContext context = new MockContext(executor);
      private ServerSocket serverSocket;
      private InstrumentedServerSocketAppenderBase appender;
      
      @Before
      public void setUp() throws Exception {
    
        serverSocket = ServerSocketUtil.createServerSocket();
        
        appender = new InstrumentedServerSocketAppenderBase(serverSocket);    
        appender.setContext(context);
      }
      
      @After
      public void tearDown() throws Exception {
        executor.shutdownNow();
        executor.awaitTermination(10000, TimeUnit.MILLISECONDS);
        assertTrue(executor.isTerminated());
      }
      
      @Test
      public void testLogEventClient() throws Exception {
        appender.start();
        Socket socket = new Socket(InetAddress.getLocalHost(), 
            serverSocket.getLocalPort());
        
        socket.setSoTimeout(1000);
        ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
     
        for (int i = 0; i < EVENT_COUNT; i++) {
          appender.append(TEST_EVENT + i);
          assertEquals(TEST_EVENT + i, ois.readObject());
        }
        
        socket.close();
        appender.stop();
      }
    
    }
    ������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/server/MockClientVisitor.java�����0000644�0001750�0001750�00000001643�12143151241�032266� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.server;
    
    /**
     * A {@link ClientVisitor} with instrumentation for unit testing.
     *
     * @author Carl Harris
     */
    public class MockClientVisitor implements ClientVisitor<MockClient> {
    
      private MockClient lastVisited;
      
      /**
       * {@inheritDoc}
       */
      public void visit(MockClient client) {
        lastVisited = client;
      }
    
      public MockClient getLastVisited() {
        return lastVisited;
      }
    
    }
    ���������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/AbstractSocketAppenderTest.java���0000644�0001750�0001750�00000020436�12143151241�032604� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2011, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    
    package ch.qos.logback.core.net;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertFalse;
    import static org.junit.Assert.assertTrue;
    
    import java.io.ObjectInputStream;
    import java.io.Serializable;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.List;
    import java.util.concurrent.*;
    
    import ch.qos.logback.core.BasicStatusManager;
    import ch.qos.logback.core.status.Status;
    import ch.qos.logback.core.status.StatusListener;
    import ch.qos.logback.core.status.StatusManager;
    import ch.qos.logback.core.util.StatusPrinter;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Ignore;
    import org.junit.Test;
    
    import ch.qos.logback.core.net.mock.MockContext;
    import ch.qos.logback.core.net.server.ServerSocketUtil;
    import ch.qos.logback.core.spi.PreSerializationTransformer;
    
    /**
     * Unit tests for {@link AbstractSocketAppender}.
     *
     * @author Carl Harris
     */
    public class AbstractSocketAppenderTest {
    
      private static final int DELAY = 10000;
    
      private ThreadPoolExecutor executorService = (ThreadPoolExecutor) Executors.newCachedThreadPool();
      private MockContext mockContext = new MockContext(executorService);
      private InstrumentedSocketAppender instrumentedAppender = new InstrumentedSocketAppender();
    
      @Before
      public void setUp() throws Exception {
        instrumentedAppender.setContext(mockContext);
      }
    
      @After
      public void tearDown() throws Exception {
        instrumentedAppender.stop();
        assertFalse(instrumentedAppender.isStarted());
        executorService.shutdownNow();
        assertTrue(executorService.awaitTermination(DELAY, TimeUnit.MILLISECONDS));
      }
    
      @Test
      public void appenderShouldFailToStartWithoutValidPort() throws Exception {
        instrumentedAppender.setPort(-1);
        instrumentedAppender.setRemoteHost("localhost");
        instrumentedAppender.setQueueSize(0);
        instrumentedAppender.start();
        assertFalse(instrumentedAppender.isStarted());
        assertTrue(mockContext.getLastStatus().getMessage().contains("port"));
      }
    
      @Test
      public void appenderShouldFailToStartWithoutValidRemoteHost() throws Exception {
        instrumentedAppender.setPort(1);
        instrumentedAppender.setRemoteHost(null);
        instrumentedAppender.setQueueSize(0);
        instrumentedAppender.start();
        assertFalse(instrumentedAppender.isStarted());
        assertTrue(mockContext.getLastStatus().getMessage().contains("remote host"));
      }
    
      @Test
      public void appenderShouldFailToStartWithNegativeQueueSize() throws Exception {
        instrumentedAppender.setPort(1);
        instrumentedAppender.setRemoteHost("localhost");
        instrumentedAppender.setQueueSize(-1);
        instrumentedAppender.start();
        assertFalse(instrumentedAppender.isStarted());
        assertTrue(mockContext.getLastStatus().getMessage().contains("Queue"));
      }
    
      @Test
      public void appenderShouldFailToStartWithUnresolvableRemoteHost() throws Exception {
        instrumentedAppender.setPort(1);
        instrumentedAppender.setRemoteHost("NOT.A.VALID.REMOTE.HOST.NAME");
        instrumentedAppender.setQueueSize(0);
        instrumentedAppender.start();
        assertFalse(instrumentedAppender.isStarted());
        assertTrue(mockContext.getLastStatus().getMessage().contains("unknown host"));
      }
    
      @Test
      public void appenderShouldFailToStartWithZeroQueueLength() throws Exception {
        instrumentedAppender.setPort(1);
        instrumentedAppender.setRemoteHost("localhost");
        instrumentedAppender.setQueueSize(0);
        instrumentedAppender.start();
        assertTrue(instrumentedAppender.isStarted());
        assertTrue(instrumentedAppender.lastQueue instanceof SynchronousQueue);
      }
    
      @Test
      public void appenderShouldStartWithValidParameters() throws Exception {
        instrumentedAppender.setPort(1);
        instrumentedAppender.setRemoteHost("localhost");
        instrumentedAppender.setQueueSize(1);
        instrumentedAppender.start();
        assertTrue(instrumentedAppender.isStarted());
        assertTrue(instrumentedAppender.lastQueue instanceof ArrayBlockingQueue);
        assertEquals(1, instrumentedAppender.lastQueue.remainingCapacity());
      }
    
      // this test takes 1 second and is deemed too long
      @Ignore
      @Test(timeout = 2000)
      public void appenderShouldCleanupTasksWhenStopped() throws Exception {
        mockContext.setStatusManager(new BasicStatusManager());
        instrumentedAppender.setPort(1);
        instrumentedAppender.setRemoteHost("localhost");
        instrumentedAppender.setQueueSize(1);
        instrumentedAppender.start();
        assertTrue(instrumentedAppender.isStarted());
    
        waitForActiveCountToEqual(executorService, 2);
        instrumentedAppender.stop();
        waitForActiveCountToEqual(executorService, 0);
        StatusPrinter.print(mockContext);
        assertEquals(0, executorService.getActiveCount());
    
      }
    
      private void waitForActiveCountToEqual(ThreadPoolExecutor executorService, int i) {
        while (executorService.getActiveCount() != i) {
          try {
            Thread.yield();
            Thread.sleep(1);
            System.out.print(".");
          } catch (InterruptedException e) {
          }
        }
      }
    
    
      @Test
      public void testAppendWhenNotStarted() throws Exception {
        instrumentedAppender.setRemoteHost("localhost");
        instrumentedAppender.start();
        instrumentedAppender.stop();
    
        // make sure the appender task has stopped
        executorService.shutdownNow();
        assertTrue(executorService.awaitTermination(DELAY, TimeUnit.MILLISECONDS));
    
        instrumentedAppender.append("some event");
        assertTrue(instrumentedAppender.lastQueue.isEmpty());
      }
    
      @Test
      public void testAppendNullEvent() throws Exception {
        instrumentedAppender.setRemoteHost("localhost");
        instrumentedAppender.start();
    
        instrumentedAppender.append("some event");
        assertTrue(instrumentedAppender.lastQueue.isEmpty());
      }
    
      @Test
      public void testAppendEvent() throws Exception {
        instrumentedAppender.setRemoteHost("localhost");
        instrumentedAppender.setQueueSize(1);
        instrumentedAppender.start();
    
        // stop the appender task, but don't stop the appender
        executorService.shutdownNow();
        assertTrue(executorService.awaitTermination(DELAY, TimeUnit.MILLISECONDS));
    
        instrumentedAppender.append("some event");
        assertEquals("some event", instrumentedAppender.lastQueue.poll());
      }
    
      @Test
      public void testDispatchEvent() throws Exception {
        ServerSocket serverSocket = ServerSocketUtil.createServerSocket();
        instrumentedAppender.setRemoteHost(serverSocket.getInetAddress().getHostAddress());
        instrumentedAppender.setPort(serverSocket.getLocalPort());
        instrumentedAppender.setQueueSize(1);
        instrumentedAppender.start();
    
        Socket appenderSocket = serverSocket.accept();
        serverSocket.close();
    
        instrumentedAppender.append("some event");
    
        final int shortDelay = 100;
        for (int i = 0, retries = DELAY / shortDelay;
             !instrumentedAppender.lastQueue.isEmpty() && i < retries;
             i++) {
          Thread.sleep(shortDelay);
        }
        assertTrue(instrumentedAppender.lastQueue.isEmpty());
    
        ObjectInputStream ois = new ObjectInputStream(appenderSocket.getInputStream());
        assertEquals("some event", ois.readObject());
        appenderSocket.close();
    
      }
    
      private static class InstrumentedSocketAppender extends AbstractSocketAppender<String> {
    
        private BlockingQueue<String> lastQueue;
    
        @Override
        protected void postProcessEvent(String event) {
        }
    
        @Override
        protected PreSerializationTransformer<String> getPST() {
          return new PreSerializationTransformer<String>() {
            public Serializable transform(String event) {
              return event;
            }
          };
        }
    
        @Override
        BlockingQueue<String> newBlockingQueue(int queueSize) {
          lastQueue = super.newBlockingQueue(queueSize);
          return lastQueue;
        }
    
      }
    
    }
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/PackageTest.java������������������0000644�0001750�0001750�00000001616�12140555240�027547� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    
    package ch.qos.logback.core.net;
    
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    
    
    @RunWith(Suite.class)
    @Suite.SuiteClasses({AbstractSocketAppenderTest.class,
            DefaultSocketConnectorTest.class,
            AbstractSSLSocketAppenderTest.class,
            ch.qos.logback.core.net.server.PackageTest.class,
            ch.qos.logback.core.net.ssl.PackageTest.class})
    public class PackageTest {
    }
    ������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/AbstractSSLSocketAppenderTest.java0000644�0001750�0001750�00000003377�12143151241�033173� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net;
    
    import static org.junit.Assert.assertNotNull;
    
    import org.junit.Before;
    import org.junit.Test;
    
    import ch.qos.logback.core.net.mock.MockContext;
    import ch.qos.logback.core.spi.PreSerializationTransformer;
    
    /**
     * Unit tests for {@link AbstractSSLSocketAppender}.
     *
     * @author Carl Harris
     */
    public class AbstractSSLSocketAppenderTest {
      
      private MockContext context = new MockContext();
    
      private InstrumentedSSLSocketAppenderBase appender =
          new InstrumentedSSLSocketAppenderBase();
      
      @Before
      public void setUp() throws Exception {
        appender.setContext(context);
      }
      
      @Test
      public void testUsingDefaultConfig() throws Exception {
        // should be able to start and stop successfully with no SSL 
        // configuration at all
        appender.start();
        assertNotNull(appender.getSocketFactory());
        appender.stop();
      }
      
      private static class InstrumentedSSLSocketAppenderBase 
          extends AbstractSSLSocketAppender<Object> {
    
        @Override
        protected void postProcessEvent(Object event) {
          throw new UnsupportedOperationException();
        }
    
        @Override
        protected PreSerializationTransformer<Object> getPST() {
          throw new UnsupportedOperationException();
        }
        
      }
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/DefaultSocketConnectorTest.java���0000644�0001750�0001750�00000012170�12140754713�032627� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net;
    
    import java.net.ConnectException;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.net.SocketAddress;
    
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.Future;
    import java.util.concurrent.TimeUnit;
    import java.util.concurrent.TimeoutException;
    import java.util.concurrent.locks.Condition;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import ch.qos.logback.core.net.SocketConnector.ExceptionHandler;
    import ch.qos.logback.core.net.server.ServerSocketUtil;
    
    import static junit.framework.Assert.assertNotNull;
    import static org.junit.Assert.fail;
    import static org.junit.Assert.assertFalse;
    import static org.junit.Assert.assertTrue;
    
    
    /**
     * Unit tests for {@link DefaultSocketConnector}.
     *
     * @author Carl Harris
     */
    public class DefaultSocketConnectorTest {
    
      private static final int DELAY = 1000;
      private static final int SHORT_DELAY = 10;
      private static final int RETRY_DELAY = 10;
    
      private MockExceptionHandler exceptionHandler = new MockExceptionHandler();
      
      private ServerSocket serverSocket;
      private DefaultSocketConnector connector;
    
      ExecutorService executor = Executors.newSingleThreadExecutor();
    
      @Before
      public void setUp() throws Exception {
        serverSocket = ServerSocketUtil.createServerSocket();
        connector = new DefaultSocketConnector(serverSocket.getInetAddress(),
            serverSocket.getLocalPort(), 0, RETRY_DELAY);
        connector.setExceptionHandler(exceptionHandler);
      }
      
      @After
      public void tearDown() throws Exception {
        if (serverSocket != null) {
          serverSocket.close();
        }
      }
      
      @Test
      public void testConnect() throws Exception {
        Future<Socket> connectorTask = executor.submit(connector);
    
        Socket socket = connectorTask.get(2 * DELAY, TimeUnit.MILLISECONDS);
        assertNotNull(socket);
        connectorTask.cancel(true);
    
        assertTrue(connectorTask.isDone());
        socket.close();
      }
    
      @Test
      public void testConnectionFails() throws Exception {
        serverSocket.close();
        Future<Socket> connectorTask = executor.submit(connector);
    
        // this connection attempt will always timeout
        try {
          connectorTask.get(SHORT_DELAY, TimeUnit.MILLISECONDS);
          fail();
        } catch(TimeoutException e) {
        }
        Exception lastException = exceptionHandler.awaitConnectionFailed(DELAY);
        assertTrue(lastException instanceof ConnectException);
        assertFalse(connectorTask.isDone());
        connectorTask.cancel(true);
    
        //thread.join(4 * DELAY);
        assertTrue(connectorTask.isCancelled());
      }
    
      @Test(timeout = 5000)
      public void testConnectEventually() throws Exception {
        serverSocket.close();
    
        Future<Socket> connectorTask = executor.submit(connector);
        // this connection attempt will always timeout
        try {
          connectorTask.get(SHORT_DELAY, TimeUnit.MILLISECONDS);
          fail();
        } catch(TimeoutException e) {
        }
    
    
        // on Ceki's machine (Windows 7) this always takes 1second  regardless of the value of DELAY
        Exception lastException = exceptionHandler.awaitConnectionFailed(DELAY);
        assertNotNull(lastException);
        assertTrue(lastException instanceof ConnectException);
    
        // now rebind to the same local address
        SocketAddress address = serverSocket.getLocalSocketAddress();
        serverSocket = new ServerSocket();
        serverSocket.setReuseAddress(true);
        serverSocket.bind(address);
    
        // now we should be able to connect
        Socket socket = connectorTask.get(2 * DELAY, TimeUnit.MILLISECONDS);
    
        assertNotNull(socket);
    
        assertFalse(connectorTask.isCancelled());
        socket.close();
      }
      
      private static class MockExceptionHandler implements ExceptionHandler {
    
        private final Lock lock = new ReentrantLock();
        private final Condition failedCondition = lock.newCondition();
          
        private Exception lastException;
        
        public void connectionFailed(SocketConnector connector, Exception ex) {
          lastException = ex;
        }
        
        public Exception awaitConnectionFailed(long delay) 
             throws InterruptedException {
          lock.lock();
          try {
            long increment = 10;
            while (lastException == null && delay > 0) {
              boolean success = failedCondition.await(increment, TimeUnit.MILLISECONDS);
              delay -= increment;
              if(success) break;
    
            }
            return lastException;
          }
          finally {
            lock.unlock();
          }
        }
            
      }
      
    }
    ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/mock/�����������������������������0000755�0001750�0001750�00000000000�12203357067�025445� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/mock/MockContext.java�������������0000644�0001750�0001750�00000004437�12143151241�030543� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.mock;
    
    import java.util.List;
    import java.util.concurrent.ExecutorService;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.ContextBase;
    import ch.qos.logback.core.status.Status;
    import ch.qos.logback.core.status.StatusListener;
    import ch.qos.logback.core.status.StatusManager;
    
    /**
     * A mock {@link Context} with instrumentation for unit testing.
     *
     * @author Carl Harris
     */
    public class MockContext extends ContextBase {
    
      private final ExecutorService executorService;
      
      private Status lastStatus;
      
      public MockContext() {
        this(new MockExecutorService());
      }
      
      public MockContext(ExecutorService executorService) {
        this.setStatusManager(new MockStatusManager());
        this.executorService = executorService;
      }
    
      @Override
      public ExecutorService getExecutorService() {
        return executorService;
      }
    
      public Status getLastStatus() {
        return lastStatus;
      }
    
      public void setLastStatus(Status lastStatus) {
        this.lastStatus = lastStatus;
      }
    
      private class MockStatusManager implements StatusManager {
    
        public void add(Status status) {
          lastStatus = status;
        }
    
        public List<Status> getCopyOfStatusList() {
          throw new UnsupportedOperationException();
        }
    
        public int getCount() {
          throw new UnsupportedOperationException();
        }
    
        public void add(StatusListener listener) {
          throw new UnsupportedOperationException();
        }
    
        public void remove(StatusListener listener) {
          throw new UnsupportedOperationException();
        }
    
        public void clear() {
          throw new UnsupportedOperationException();
        }
    
        public List<StatusListener> getCopyOfStatusListenerList() {
          throw new UnsupportedOperationException();
        }
         
      }
      
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/net/mock/MockExecutorService.java�����0000644�0001750�0001750�00000002754�12140555240�032242� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.net.mock;
    
    import java.util.Collections;
    import java.util.List;
    import java.util.concurrent.AbstractExecutorService;
    import java.util.concurrent.TimeUnit;
    
    /**
     * An {@link ExecutorService} with instrumentation for unit testing.
     * <p>
     * This service is synchronous; submitted jobs are run on the calling thread.
     *
     * @author Carl Harris
     */
    public class MockExecutorService extends AbstractExecutorService {
    
      private Runnable lastCommand;
      
      public Runnable getLastCommand() {
        return lastCommand;
      }
      
      public void shutdown() {
      }
    
      public List<Runnable> shutdownNow() {
        return Collections.emptyList();
      }
    
      public boolean isShutdown() {
        return true;
      }
    
      public boolean isTerminated() {
        return true;
      }
    
      public boolean awaitTermination(long timeout, TimeUnit unit)
          throws InterruptedException {
        return true;
      }
    
      public void execute(Runnable command) {
        command.run();
        lastCommand = command;
      }
      
    }��������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/helpers/������������������������������0000755�0001750�0001750�00000000000�12203357067�025370� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/helpers/CyclicBufferTest.java���������0000644�0001750�0001750�00000003021�12136042272�031421� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.helpers;
    
    import org.junit.Test;
    
    import java.util.Arrays;
    import java.util.List;
    
    import static org.junit.Assert.assertEquals;
    
    public class CyclicBufferTest {
    
    
      void assertSize(CyclicBuffer<String> cb, int size) {
         assertEquals(size, cb.length());
      }
      @Test
      public void smoke() {
        CyclicBuffer<String> cb = new CyclicBuffer<String>(2);
        assertSize(cb, 0);
        cb.add("zero");
        assertSize(cb, 1);
        cb.add("one");
        assertSize(cb, 2);
        cb.add("two");
        assertSize(cb, 2);
        assertEquals("one", cb.get());
        assertSize(cb, 1);
        assertEquals("two",cb.get());
        assertSize(cb, 0);
      }
    
    
      @Test
      public void cloning() {
        CyclicBuffer<String> cb = new CyclicBuffer<String>(2);
        cb.add("zero");
        cb.add("one");
    
        CyclicBuffer<String> clone = new CyclicBuffer<String>(cb);
        assertSize(clone, 2);
        cb.clear();
        assertSize(cb, 0);
    
        List<String> witness = Arrays.asList("zero", "one");
        assertEquals(witness, clone.asList());
    
      }
    }
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/helpers/FileFilterUtilTest.java�������0000644�0001750�0001750�00000004361�12136042272�031754� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.helpers;
    
    import ch.qos.logback.core.Context;
    import ch.qos.logback.core.ContextBase;
    import ch.qos.logback.core.rolling.helper.FileFilterUtil;
    import ch.qos.logback.core.rolling.helper.FileNamePattern;
    import org.junit.Test;
    
    import java.io.File;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    
    import static junit.framework.Assert.assertEquals;
    
    public class FileFilterUtilTest {
    
    
      Context context = new ContextBase();
    
      // see also http://jira.qos.ch/browse/LBCORE-164
      @Test
      public void findHighestCounterTest() throws ParseException {
        String[] sa = new String[]{"c:/log/debug-old-2010-08-10.0.log",
                "c:/log/debug-old-2010-08-10.1.log", "c:/log/debug-old-2010-08-10.10.log",
                "c:/log/debug-old-2010-08-10.11.log", "c:/log/debug-old-2010-08-10.12.log",
                "c:/log/debug-old-2010-08-10.2.log", "c:/log/debug-old-2010-08-10.3.log",
                "c:/log/debug-old-2010-08-10.4.log", "c:/log/debug-old-2010-08-10.5.log",
                "c:/log/debug-old-2010-08-10.6.log", "c:/log/debug-old-2010-08-10.7.log",
                "c:/log/debug-old-2010-08-10.8.log", "c:/log/debug-old-2010-08-10.9.log"};
    
        File[] matchingFileArray = new File[sa.length];
        for (int i = 0; i < sa.length; i++) {
          matchingFileArray[i] = new File(sa[i]);
        }
        FileNamePattern fnp = new FileNamePattern("c:/log/debug-old-%d{yyyy-MM-dd}.%i.log", context);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String rexexp = null;
        rexexp = fnp.toRegexForFixedDate(sdf.parse("2010-08-10"));
        String stemRegex = FileFilterUtil.afterLastSlash(rexexp);
        int result = FileFilterUtil.findHighestCounter(matchingFileArray, stemRegex);
        assertEquals(12, result);
      }
    }
    �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@LongLink���������������������������������������������������������������������������������������0000000�0000000�0000000�00000000146�00000000000�011566� L����������������������������������������������������������������������������������������������������ustar  �root����������������������������root�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/helpers/ThrowableToStringArrayTest.java���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/helpers/ThrowableToStringArrayTest.jav0000644�0001750�0001750�00000004230�12136042272�033343� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.helpers;
    
    import static org.junit.Assert.assertEquals;
    
    import java.io.PrintWriter;
    import java.io.StringWriter;
    
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import ch.qos.logback.core.CoreConstants;
    
    public class ThrowableToStringArrayTest {
    
      StringWriter sw = new StringWriter();
      PrintWriter pw = new PrintWriter(sw);
    
      @Before
      public void setUp() throws Exception {
      }
    
      @After
      public void tearDown() throws Exception {
      }
    
      public void verify(Throwable t) {
        t.printStackTrace(pw);
        
        String[] sa = ThrowableToStringArray.convert(t);
        StringBuilder sb = new StringBuilder();
        for (String tdp : sa) {
          sb.append(tdp);
          sb.append(CoreConstants.LINE_SEPARATOR);
        }
        String expected = sw.toString();
        String result = sb.toString().replace("common frames omitted", "more");
        assertEquals(expected, result);
      }
      
      @Test
      public void smoke() {
        Exception e = new Exception("smoke");
        verify(e);
      }
    
      @Test
      public void nested() {
        Exception w = null;
        try {
          someMethod();
        } catch (Exception e) {
          w = new Exception("wrapping", e);
        }
        verify(w);
      }
    
      @Test
      public void multiNested() {
        Exception w = null;
        try {
          someOtherMethod();
        } catch (Exception e) {
          w = new Exception("wrapping", e);
        }
        verify(w);
      }
      
      void someMethod() throws Exception {
        throw new Exception("someMethod");
      }
    
      void someOtherMethod() throws Exception {
        try {
          someMethod();
        } catch (Exception e) {
          throw new Exception("someOtherMethod", e);
        }
      }
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/helpers/PackageTest.java��������������0000644�0001750�0001750�00000001507�12136042272�030423� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core.helpers;
    
    import ch.qos.logback.core.util.FileUtilTest;
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
    import org.junit.runners.Suite.SuiteClasses;
    
    @RunWith(Suite.class)
    @SuiteClasses({ThrowableToStringArrayTest.class, FileUtilTest.class, CyclicBufferTest.class})
    public class PackageTest {
    
    }
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/ch/qos/logback/core/ContextBaseTest.java������������������0000644�0001750�0001750�00000006645�12140150757�027660� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package ch.qos.logback.core;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertNull;
    import static org.junit.Assert.assertSame;
    import static org.junit.Assert.assertTrue;
    import static org.junit.Assert.fail;
    
    import org.junit.Test;
    
    import ch.qos.logback.core.spi.LifeCycle;
    
    public class ContextBaseTest {
    
      private InstrumentedLifeCycleManager lifeCycleManager =
          new InstrumentedLifeCycleManager();
      
      private InstrumentedContextBase context = 
          new InstrumentedContextBase(lifeCycleManager);
    
      @Test
      public void renameDefault() {
        context.setName(CoreConstants.DEFAULT_CONTEXT_NAME);
        context.setName("hello");
      }
    
    
      @Test
      public void idempotentNameTest() {
        context.setName("hello");
        context.setName("hello");
      }
    
      @Test
      public void renameTest() {
        context.setName("hello");
        try {
          context.setName("x");
          fail("renaming is not allowed");
        } catch (IllegalStateException ise) {
        }
      }
    
      @Test
      public void resetTest() {
        context.setName("hello");
        context.putProperty("keyA", "valA");
        context.putObject("keyA", "valA");
        assertEquals("valA", context.getProperty("keyA"));
        assertEquals("valA", context.getObject("keyA"));
        MockLifeCycleComponent component = new MockLifeCycleComponent();
        context.register(component);
        assertSame(component, lifeCycleManager.getLastComponent());
        context.reset();
        assertNull(context.getProperty("keyA"));
        assertNull(context.getObject("keyA"));
        assertTrue(lifeCycleManager.isReset());
      }
    
      @Test
      public void contextNameProperty() {
        assertNull(context.getProperty(CoreConstants.CONTEXT_NAME_KEY));
        String HELLO = "hello";
        context.setName(HELLO);
        assertEquals(HELLO, context.getProperty(CoreConstants.CONTEXT_NAME_KEY));
        // good to have a raw reference to the "CONTEXT_NAME" as most clients would
        // not go through CoreConstants
        assertEquals(HELLO, context.getProperty("CONTEXT_NAME"));
      }
    
      private static class InstrumentedContextBase extends ContextBase {
      
        private final LifeCycleManager lifeCycleManager;
        
        public InstrumentedContextBase(LifeCycleManager lifeCycleManager) {
          this.lifeCycleManager = lifeCycleManager;
        }
      
        @Override
        protected LifeCycleManager getLifeCycleManager() {
          return lifeCycleManager;
        }
        
      }
    
      private static class InstrumentedLifeCycleManager extends LifeCycleManager {
        
        private LifeCycle lastComponent;
        private boolean reset;
        
        @Override
        public void register(LifeCycle component) {
          lastComponent = component;
          super.register(component);
        }
        
        @Override
        public void reset() {
          reset = true;
          super.reset();
        }
    
        public LifeCycle getLastComponent() {
          return lastComponent;
        }
    
        public boolean isReset() {
          return reset;
        }
        
      }
    
    }
    �������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/trie/�����������������������������������������������������0000755�0001750�0001750�00000000000�12203357067�021143� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/trie/Node.java��������������������������������������������0000644�0001750�0001750�00000001603�12133756450�022674� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package trie;
    
    interface Node {
      public String getValue();
      public boolean containsChildValue(char c);
    
      public Node getChild(char c);
    
      public static final Node EMPTY_NODE = new Node() {
        public String getValue() {
          return "";
        }
    
        public boolean containsChildValue(char c) {
          return false;
        }
    
        public Node getChild(char c) {
          return this;
        }
      };
    
    }
    �����������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/java/trie/Minimal.java�����������������������������������������0000644�0001750�0001750�00000001536�12133756450�023402� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/**
     * Logback: the reliable, generic, fast and flexible logging framework.
     * Copyright (C) 1999-2013, QOS.ch. All rights reserved.
     *
     * This program and the accompanying materials are dual-licensed under
     * either the terms of the Eclipse Public License v1.0 as published by
     * the Eclipse Foundation
     *
     *   or (per the licensee's choosing)
     *
     * under the terms of the GNU Lesser General Public License version 2.1
     * as published by the Free Software Foundation.
     */
    package trie;
    
    
    public class Minimal {
    
    
    
      public Node findValue(Node startNode, String value) {
        Node current = startNode;
        for (char c : value.toCharArray()) {
          if (current.containsChildValue(c)) {
            current = current.getChild(c);
          } else {
            current = Node.EMPTY_NODE;
            break;
          }
        }
        return current;
      }
    }
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/witness/�������������������������������������������������������0000755�0001750�0001750�00000000000�12203357067�020753� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/witness/compress2.txt.gz���������������������������������������0000644�0001750�0001750�00000001042�11377016712�024045� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������]Sn0+)^ڃQACRh4?@+ycȥ}>fggpɻWjשGǛhL7)&x=6)˗U'IjQs45E1:T1i1�U<KVOSnуH[<pӹ(PO2(oK`KdM4xiNQ'7uAΤȁ]I_Pme
    9V{'ǧ(4B*Զ:tBL-hB
    $v`mQ0h
    bmd%;XVŘ3L=.0t$S,DI>H֪X9wťw[<tnXtBVA<%!o~SCZ9֓U,ߎh4Q<[p"q/EngC2_<<=>^	B@MNQxg=SF(։p�r@7B7f9?buA������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/witness/rolling/�����������������������������������������������0000755�0001750�0001750�00000000000�12203357067�022421� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/witness/rolling/sbr-test3.l������������������������������������0000644�0001750�0001750�00000000062�11377016712�024422� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������01234567890123456789012345678901234567890123456789������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/witness/rolling/tbr-test5.1������������������������������������0000644�0001750�0001750�00000000024�11377016712�024330� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Hello---0
    Hello---1������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/witness/rolling/sbr-test2.l������������������������������������0000644�0001750�0001750�00000000062�11377016712�024421� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������01234567890123456789012345678901234567890123456789������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/witness/rolling/renaming.1�������������������������������������0000644�0001750�0001750�00000000011�11377016712�024273� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Hello 1
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/witness/rolling/tbr-test6.1.gz���������������������������������0000644�0001750�0001750�00000000042�11377016712�024750� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������H5�h�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/witness/rolling/tbr-test6.0.gz���������������������������������0000644�0001750�0001750�00000000024�11377016712�024747� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/witness/rolling/tbr-test6.2������������������������������������0000644�0001750�0001750�00000000013�11377016712�024330� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Hello---2
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/witness/rolling/tbr-failed_rename������������������������������0000644�0001750�0001750�00000000041�11517502017�025671� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Hello---0
    Hello---1
    Hello---2
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/witness/rolling/tbr-test4.2������������������������������������0000644�0001750�0001750�00000000026�11377016712�024332� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Hello---2
    World---0
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/witness/rolling/sbr-test3.1.gz���������������������������������0000644�0001750�0001750�00000000041�11377016712�024743� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������304261534�Kd��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/witness/rolling/tbr-test4B.3�����������������������������������0000644�0001750�0001750�00000000011�11377016712�024427� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������World---0�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/witness/rolling/tbr-test4.3������������������������������������0000644�0001750�0001750�00000000026�11377016712�024333� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������World---1
    World---2
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/witness/rolling/tbr-test4.0������������������������������������0000644�0001750�0001750�00000000000�11377016712�024320� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/witness/rolling/tbr-test3.3������������������������������������0000644�0001750�0001750�00000000024�11377016712�024330� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������World---1
    World---2������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/witness/rolling/tbr-test8.0.zip��������������������������������0000644�0001750�0001750�00000000234�11745561574�025150� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PK���@���������������-2012-04-24_19_31_39�PK�����������PK����@����������������������������-2012-04-24_19_31_39PK������B���D�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/witness/rolling/tbr-test2.0.gz���������������������������������0000644�0001750�0001750�00000000024�11377016712�024743� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/witness/rolling/tbr-test8.2������������������������������������0000644�0001750�0001750�00000000013�11745552113�024331� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Hello---2
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/witness/rolling/tbr-test8.1.zip��������������������������������0000644�0001750�0001750�00000000254�11745561574�025153� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PK���@���������������-2012-04-24_19_31_40H52
    y�PK¸������PK����@¸�����������������������-2012-04-24_19_31_40PK������B���T���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/witness/rolling/tbr-test5.0������������������������������������0000644�0001750�0001750�00000000000�11377016712�024321� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/witness/rolling/tbr-test1.2������������������������������������0000644�0001750�0001750�00000000013�11377016712�024323� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Hello---2
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/witness/rolling/tbr-test4.1������������������������������������0000644�0001750�0001750�00000000026�11377016712�024331� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Hello---0
    Hello---1
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/witness/rolling/renaming.0�������������������������������������0000644�0001750�0001750�00000000011�11377016712�024272� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Hello 0
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/witness/rolling/sbr-test2.1������������������������������������0000644�0001750�0001750�00000000144�11377016712�024327� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/witness/rolling/tbr-test4B.0�����������������������������������0000644�0001750�0001750�00000000000�11377016712�024422� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/witness/rolling/tbr-test4B.2�����������������������������������0000644�0001750�0001750�00000000013�11377016712�024430� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Hello---2
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/witness/rolling/sbr-test2.0������������������������������������0000644�0001750�0001750�00000000144�11377016712�024326� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/witness/rolling/tbr-test3.1������������������������������������0000644�0001750�0001750�00000000026�11377016712�024330� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Hello---0
    Hello---1
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/witness/rolling/tbr-test4B.1�����������������������������������0000644�0001750�0001750�00000000024�11377016712�024431� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Hello---0
    Hello---1������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/witness/rolling/tbr-test2.1.gz���������������������������������0000644�0001750�0001750�00000000042�11377016712�024744� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������H5�h�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/witness/rolling/tbr-test7.1.gz���������������������������������0000644�0001750�0001750�00000000044�11745551535�024761� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������H52
    y�¸�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/witness/rolling/tbr-test1.0������������������������������������0000644�0001750�0001750�00000000000�11377016712�024315� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/witness/rolling/tbr-test7.2������������������������������������0000644�0001750�0001750�00000000013�11745552113�024330� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Hello---2
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/witness/rolling/tbr-test7.0.gz���������������������������������0000644�0001750�0001750�00000000024�11745551535�024756� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/witness/rolling/sbr-test3.0.gz���������������������������������0000644�0001750�0001750�00000000041�11377016712�024742� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������304261534�Kd��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/witness/rolling/tbr-test1.1������������������������������������0000644�0001750�0001750�00000000026�11377016712�024326� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Hello---0
    Hello---1
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/witness/rolling/tbr-test2.2������������������������������������0000644�0001750�0001750�00000000013�11377016712�024324� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Hello---2
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/witness/rolling/tbr-test3.0������������������������������������0000644�0001750�0001750�00000000000�11377016712�024317� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/witness/rolling/tbr-test5.2������������������������������������0000644�0001750�0001750�00000000013�11377016712�024327� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Hello---2
    ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/witness/rolling/tbr-test3.2������������������������������������0000644�0001750�0001750�00000000024�11377016712�024327� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Hello---2
    World---0������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/witness/rolling/tbr-test4B.4�����������������������������������0000644�0001750�0001750�00000000024�11377016712�024434� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������World---1
    World---2������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/witness/compress1.txt.gz���������������������������������������0000644�0001750�0001750�00000000357�11377016712�024054� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������5AO0HRR9nzhi$,O{7w@{jd.oH#c`*W$KpaJ߂^S0&\nZtޚk'.ȭUf`Ӎ4'.a!zICVB/v){bX:4h9FV4%r;'Aעđ{tzuc$/-�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/resources/�����������������������������������������������������0000755�0001750�0001750�00000000000�12136042147�021264� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/resources/asResource/������������������������������������������0000755�0001750�0001750�00000000000�11506604167�023405� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/resources/asResource/joran/������������������������������������0000755�0001750�0001750�00000000000�12203357067�024515� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/resources/asResource/joran/inclusion/��������������������������0000755�0001750�0001750�00000000000�12203357067�026520� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/resources/asResource/joran/inclusion/includedAsResource.xml����0000644�0001750�0001750�00000000215�11377016712�033023� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE included>
    
    <included>
    
      <stack name="AR_A" />
      <stack name="AR_B" />
    
    </included>�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/resources/asResource/joran/propertyActionTest.properties�������0000644�0001750�0001750�00000000020�11377016712�032505� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������r1=tata
    r2=toto����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/resources/util/������������������������������������������������0000755�0001750�0001750�00000000000�12203357067�022246� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/resources/util/testResource.txt��������������������������������0000644�0001750�0001750�00000000017�12136042147�025467� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������TEST RESOURCE
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/resources/util/README������������������������������������������0000644�0001750�0001750�00000000142�12136042147�023116� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������These resources are used by the LocationUtil unit tests in package
    ch.qos.logback.classic.util.
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/resources/net/�������������������������������������������������0000755�0001750�0001750�00000000000�12136042147�022052� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/resources/net/ssl/���������������������������������������������0000755�0001750�0001750�00000000000�12203357067�022660� 5����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/resources/net/ssl/keystore.jks���������������������������������0000644�0001750�0001750�00000004170�12136042147�025233� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback-classic-ssl-test��=\���00
    +*�.6Z>6abjx!seC"7vneR\"f"Tb'!CXjE|=\196>
    ~S@'B"
    J1}3Pxn	b[BF--'U'bZdxO�<
    \+r
    
    #?V:~**SL@(Ni:9|IU8VMk</ %Ѹf$*/Oc2%ʽhU%'O~u-oϲ?lH*<.]g
    m?SRm\m`}I)̎T9ܠ#5(k޺1%M}o}`$$<ZbYE$('eX\Gbs-b3DM UQ{n+[D44Ҿij\˭7Z
    3x-$S(7=Yܸ@l~uJbz*a.)eݕ<P
    B\~s[<PJspKCYE|F_rƌv2;bM66my*v1/Uր%	,uKmX0Ԋ앃U�B	YݤպE%	R"�i&LZYV+*3"A[âm)j[^Sӆhm(@v[nC:fe3~F`cȢŭ%hSZ_ltd3}0#mɋ&l-?I2A
    gҚFszR`0y=c8ڿLs	[4?]r5gG5dʔ�beVqʝk0BFf(LYu/lƭlDI$0CDfϓ-xo)C|f:T ~M[K (G9V1!_ONO9"µjV
    %:xq od\B&ud_0`އw'TJED>ldk
    ;=6`od%T`/5E#i[Z$j;+áP
    ؏g7i;		:\%wdk@;ץaf$SAݩ{4芶5_{:
    ܔg6{, Ն}}e hUV5}(1#֑ƬKAoDʝ|55;P����X.509��00	�q0r10
    	*H
    �0#1!0Ulogback-classic-ssl-test0 
    130324200226Z21000303200226Z0#1!0Ulogback-classic-ssl-test0"0
    	*H
    ��0
    �3XʽTehyZ‹OonY?FB={
    /e0Q:O^LuÇdY'/e{-Z"!!kjH#wF.{2	s3~,;;݁`@Z;G JmڿdE_;ӽnjSa]F/>EF:3󭀺]zyT#J5SXd3/p(W4
    k
    [cPF�ȡĂ�P0N0U7gW٠ {kک?e0U#07gW٠ {kک?e0U00
    	*H
    ��(=lA)tc;ʫy-?>$ÆOu�Ydu~$nMӬk;2}7 uh澱=?[2.b65iv37|-w6M|0{\qESM3
    WcU1P$\ppQ&paƔP&/ T9)<z _~A5.	2 ̙O=dj('6r06Wª~n`��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/resources/net/ssl/cert.pem�������������������������������������0000644�0001750�0001750�00000002206�12136042147�024313� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������-----BEGIN CERTIFICATE-----
    MIIDGzCCAgOgAwIBAgIJAJDzlHEYMHIxMA0GCSqGSIb3DQEBBQUAMCMxITAfBgNV
    BAMMGGxvZ2JhY2stY2xhc3NpYy1zc2wtdGVzdDAgFw0xMzAzMjQyMDAyMjZaGA8y
    MTAwMDMwMzIwMDIyNlowIzEhMB8GA1UEAwwYbG9nYmFjay1jbGFzc2ljLXNzbC10
    ZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtjNYyr0YvlRlaHla
    HrjCi08RkgZv9G6uWT+DRkLGPXu+DgrcAy/jZTCaiFGrOk9eEs73FEyHqKR1w4cF
    AmQRj1knGvAvjqmZsmUQey2ClJhaIiGgIYtrapcCSBu97SP/EndGLh3h9rmchnsy
    nq75HwngoHObM34soY47lOjVO//dgWBAr56j7QxaO0cgHEoVEYrloG2n2r9ku+lF
    X7yuO9O9oG5qU523rmFd2guEHkb9zS8+1w/WRUbnOjPzrYC6XXqvgPN5VCOOk0ob
    igI19FNY3mTDM5ehL3Ao6fvRVzSLtbkNa8j0CluoY1BGDqwWzQWB7QCJyKGe39IC
    xILgiQIDAQABo1AwTjAdBgNVHQ4EFgQUN5xnuFcG2aAge/xrAp/aqT+YZRcwHwYD
    VR0jBBgwFoAUN5xnuFcG2aAge/xrAp/aqT+YZRcwDAYDVR0TBAUwAwEB/zANBgkq
    hkiG9w0BAQUFAAOCAQEAKD1sQcUGKXQW+GPjO8qrf5yDpIOxeast7D/7iT4k5cOG
    iE8EBKx1vQBZ1B2PZHWp1364HSSHbk3TrAhrBjuRhP77n52zo/sypB59NyC8/OF1
    8QUFnNBo5r6xPYPAP1sfszKBsy7v8pIaA2ITrDYSy/YZwe01aYN245kzN3yzvhUt
    d6I2Taiuj3wwm8x77hbsl+8ZXBNx1UVTsLyvtE0zhOoK8FdjBqzF4rxV3zFQJFzz
    7HBw/s34USYaq4mf1nBhxpRQzhkmmdwvIMfN4FQ5sZyLnik8mnogm1/+1X6ZQTXq
    8BAu4QmjMo6JIKW7FQYbqtLuzJlPoz0WD8Vkaua+KA==
    -----END CERTIFICATE-----
    ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/resources/net/ssl/README���������������������������������������0000644�0001750�0001750�00000001041�12136042147�023527� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������These resources are used by the SSL support tests in package
    ch.qos.logback.classic.net.ssl.
    
    The key.pem and cert.pem are a private key and corresponding self-signed
    certificate.  The keystore.jks and keystore.p12 files are keystores of type
    JKS and PKCS12, respectively, containing the private key and self-signed
    certificates given in key.pem and cert.pem.  The passphrase for both keystore
    files is "changeit".
     
    NOTE: The resources in this directory MUST be excluded from maven resource
    filtering, if it is enabled in the build.
    �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/resources/net/ssl/key.pem��������������������������������������0000644�0001750�0001750�00000003246�12136042147�024153� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������-----BEGIN RSA PRIVATE KEY-----
    MIIEogIBAAKCAQEAtjNYyr0YvlRlaHlaHrjCi08RkgZv9G6uWT+DRkLGPXu+Dgrc
    Ay/jZTCaiFGrOk9eEs73FEyHqKR1w4cFAmQRj1knGvAvjqmZsmUQey2ClJhaIiGg
    IYtrapcCSBu97SP/EndGLh3h9rmchnsynq75HwngoHObM34soY47lOjVO//dgWBA
    r56j7QxaO0cgHEoVEYrloG2n2r9ku+lFX7yuO9O9oG5qU523rmFd2guEHkb9zS8+
    1w/WRUbnOjPzrYC6XXqvgPN5VCOOk0obigI19FNY3mTDM5ehL3Ao6fvRVzSLtbkN
    a8j0CluoY1BGDqwWzQWB7QCJyKGe39ICxILgiQIDAQABAoIBADMpmf5cOS2A/3Tl
    1rOXyDFcQ5/QpPFrfxParN828vni3IyO6hcPBHiuvEYZQM6/6Le5XFJb5yApBlSg
    fnycYv3w1/VNit0xrNIWZRlhvzBA09aPwKqKvuAQhXiAKcYEfKTPz2o1w/UHS/fL
    cnxyv8vCd0w3ClbcUGYRTZPUCcSt7DYFfnGgFZtFNFyDusKjMaCbhMeIGRNwlcZh
    gnJguICUGw+Ah2hvW1MdrZ3Nt5FLxAmDJMxYnmRxBEPrrAEHwtgGfHKC/8vyihtC
    C86vYDJ6XqKpoZV2tMoUlS+5TSbYuYdUXv7QMdYzKpAQuv5mE+gmA/A9jc1l9BtA
    IUTNyr0CgYEA4j0N6wVj03N2NckS0zaYJF1R+jdGXhjeGOD7iL24y373fv7JHxh5
    yGgw8s55Iv1aVZJ7nPFIrNE45VkXe13FdnAHFf42vLIFUM8Awm2DxxwF38vhLGEU
    +CjeieQ+s4wS6moNhf5rLILfwcmbWgS9thqdyVwOxdaHMHFw1MNvL78CgYEAzis+
    ndioFIyiCoxT1RCRmBE6TiYT0Yhu6z7N14KTEitYXJKn066sMa16AobfTQNxYA5r
    0hdykvrJ7p0hT9zxa/c560OsakvPnegsl/bD60BDjY/8Sh3xyjhAwQ7NQS4xFGgQ
    Ne9xfu/0MMiKTHBMsENtE014ZK91ylKqgpUoAbcCgYAwbBbthZLPMDhN3MKNuHKp
    3dts7aW/AB2RP542rzy9OWiposjTQf7W2Q4Y+f5NceKCzD5u4enHK2S9Get/uRtJ
    dULe/zEiBAxFNnkYJC5/UE0lkFKamBDP6Jdw9gxBi6qEx7wrQMAZn81agdchVkBw
    mJPLBEwZJgh7YtxefZHvqwKBgB4GHjBOhOu5Lz/p/6tfplRG7f7DfM9e1whbNQ7V
    bSWQOmYA1X/2SA1T/hiwG4TTo4chkoId+Al/jDi7mUZQHrhiYITqbgls0OdmEFhx
    D0cLLMtI1KzWf4e7eXKj/TAo0ezu2q2AGT8rIpyYF8vZ7tEcgJ33Ajlnc/fq4fny
    TskxAoGAN6WfZrwhytFVai77cJHl9hkL/dzj73LzCFv+yXopNWNRHv1GJg1Czcds
    /2RpPO7sUnNT2KsRP6d2UcZC+JSngXpNjYEm5ApVeeMqvsggCpOMw9FxsDcwf61y
    0jMbJPxQghVXlk9AON3zFs6Mea/gk9hMTjMxMs4um/XnPqzGqlE=
    -----END RSA PRIVATE KEY-----
    ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������logback_1.0.13/logback-core/src/test/resources/net/ssl/keystore.p12���������������������������������0000644�0001750�0001750�00000004746�12136042147�025057� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0	0		*H
    		0	0	*H
    0�0	*H
    0
    *H
    0tђ˥�*VOK1Q_TAn=J[qå±V'U\ZPwA9։ew-,Zi#G\9{{$8@yµ$eǒufN=5lq%_D'tF$Xg0'ݖB[
    Z0¾$X
    >֬T'?H8̬Q(BسvN_9zSrǧdU䰌[g><FE!՟bfu9ካ&CJ}iG/BSlRA?g<INU14*nnFiacH7xJta6I);ӏcV8[tfQz
    3O9xIz&r5<~϶W#-(L\f`aErFyn 2,M
    IU&p{}˲7	㓼g[l'ś!e[lȴۃ懩kL;8/1D8jEyf	"tb(JB9_QLsQ!đ�Y.=}%vKNΉ%<n>0ˇ{ԧr�lՕU.; |2')%`
    GNgՀ-Sp.d}:M�wJT2{7jK$Ow
    'GRa:of]'miŁ%K?dRpz#)c~[=K*‘b:cqI,6ӹGpL!ۛ%RWAO{1Be-J2a_Fq`Ɵ#ITdKc4B@|
    	(=9?Fa^W	7e;+pKy;Kl:!CKE>?%A>Sju7T%DغB|a*8:RGOSF5EcztY_"k?0	*H
    so0k0g*H
    
    00
    *H
    0D4|"�7ٷoO$՛S2G=]Oci+0I;t%&T)?j**S4T%ڶxky(>!wDǙ$Go
    [^ ɿ_/jpSC΁eZ?]RՖ0#m)6Ύ<Yגȼ!W*Vκ)~{-Le_w6FhhW:EʪJ}y�[bO%ѺQHG֫F@1nXTVIx1MO
    A _Dž-/b>JxIdXG顉}X(
    e1EP|�qn@n}o/I:4Ϯ`z-\p3>8m= am^*tk(zDXkOZ)rUI;Upz}U	nb*o,dPWRg,ߊ>
    :(zp-t?[˜7hoN׵%:,ldUnsV-(76?/Pݥ0W%FZ
    ߬
    $cx(C&icq+/ȝ	)|�J.rKEyR{,Sb;*k`ZA\tvFϒX ]0`~P@=|@u).zW.$	gI^jBq]en>h#(㭫`(QpjW3FD>>hJ<6		2&$qD`H\G}!WGUv#ܜ\NOrqLc߬iqYg1Ɉʮc{ԁk@kof#8
    X_M!w	54aiS;NDcO^5-w`yTTCjSn&858mm^xq-dr?^h${nQ`;0ݜ?dXMCU_sbeK
    Z/-kI\8\"*tVۢK`khV-q6@Y;qHPq+Fr5$rQ"	P@*UWzn9Aʙ|XNTVDR!1ȏՄo[P4ܶ	cZD]31f0#	*H
    	1eRт<|i"+0?	*H
    	120�l�o�g�b�a�c�k�-�c�l�a�s�s�i�c�-�s�s�l�-�t�e�s�t010!0	+�\.{sMA
    7$wSd  ���������������������������logback_1.0.13/logback-core/pom.xml�����������������������������������������������������������������0000644�0001750�0001750�00000011627�12143153471�017031� 0����������������������������������������������������������������������������������������������������ustar  �drazzib�������������������������drazzib����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    
      <modelVersion>4.0.0</modelVersion>
    
      <parent>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-parent</artifactId>
        <version>1.0.13</version>
      </parent>
    
      <artifactId>logback-core</artifactId>
      <packaging>jar</packaging>
      <name>Logback Core Module</name>
      <description>logback-core module</description>
    
      <url>http://logback.qos.ch</url>
    
      <properties>
        <!--<scala.version>2.9.1</scala.version>-->
      </properties>
    
      <licenses>
        <license>
          <name>Eclipse Public License - v 1.0</name>
          <url>http://www.eclipse.org/legal/epl-v10.html</url>
        </license>
    
        <license>
          <name>GNU Lesser General Public License</name>
          <url>http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html</url>
        </license>
      </licenses>
    
      <dependencies>
        <dependency>
           <groupId>org.codehaus.janino</groupId>
          <artifactId>janino</artifactId>
          <scope>compile</scope>
          <optional>true</optional>
        </dependency>
    
        <dependency>
          <groupId>org.fusesource.jansi</groupId>
          <artifactId>jansi</artifactId>
          <optional>true</optional>      
        </dependency>
    
        <dependency>
          <groupId>javax.mail</groupId>
          <artifactId>mail</artifactId>
          <scope>compile</scope>
          <optional>true</optional>
        </dependency>
        <dependency>
          <groupId>org.apache.geronimo.specs</groupId>
          <artifactId>geronimo-jms_1.1_spec</artifactId>
          <scope>compile</scope>
          <optional>true</optional>
        </dependency>
    
        <dependency>
          <groupId>org.mockito</groupId>
          <artifactId>mockito-core</artifactId>
          <version>1.9.0</version>
          <scope>test</scope>
        </dependency>
    
    
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>servlet-api</artifactId>
          <scope>compile</scope>
          <optional>true</optional>
        </dependency>
    
        <!--<dependency>-->
          <!--<groupId>org.scala-lang</groupId>-->
          <!--<artifactId>scala-library</artifactId>-->
          <!--<version>${scala.version}</version>-->
          <!--<scope>test</scope>-->
        <!--</dependency>-->
    
      </dependencies>
    
    
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>${maven-surefire-plugin.version}</version>
            <configuration>
              <forkMode>once</forkMode>
              <reportFormat>plain</reportFormat>
              <!--<parallel>classes</parallel>-->
              <trimStackTrace>false</trimStackTrace>
              <excludes>
                <exclude>**/All*Test.java</exclude>
                <exclude>**/PackageTest.java</exclude>
                <!-- ConsoleAppenderTest redirects System.out which is not well tolerated by Maven -->
                <exclude>**/ConsoleAppenderTest.java</exclude>
                <!--<exclude>**/TimeBasedRollingTest.java</exclude>-->
              </excludes>
            </configuration>
          </plugin>
    
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>${maven-jar-plugin.version}</version>
            <configuration>
              <archive>
                <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF
                </manifestFile>
              </archive>
            </configuration>
            <executions>
              <execution>
                <id>bundle-test-jar</id>
                <phase>package</phase>
                <goals>
                  <goal>jar</goal>
                  <goal>test-jar</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
    
          <plugin>
            <groupId>org.apache.felix</groupId>
            <artifactId>maven-bundle-plugin</artifactId>
            <extensions>true</extensions>
            <executions>
              <execution>
                <id>bundle-manifest</id>
                <phase>process-classes</phase>
                <goals>
                  <goal>manifest</goal>
                </goals>
              </execution>
            </executions>
            <configuration>
              <instructions>
                <Export-Package>ch.qos.logback.core.*</Export-Package>
                <Import-Package>
                  javax.*;resolution:=optional,
                  org.xml.*;resolution:=optional,
                  org.fusesource.jansi;resolution:=optional,
                  org.codehaus.janino;resolution:=optional,
                  org.codehaus.commons.compiler;resolution:=optional,
                  *
                </Import-Package>
                <Bundle-RequiredExecutionEnvironment>J2SE-1.5
                </Bundle-RequiredExecutionEnvironment>
              </instructions>
            </configuration>
          </plugin>
        </plugins>
      </build>
    
    </project>�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������